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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2011-02-27 09:19:40 +0300
committerJoseph Eagar <joeedh@gmail.com>2011-02-27 09:19:40 +0300
commitf01261d040be27337db9f9996d648a279c89b7c4 (patch)
treec448230939b3c90d53ce8852dd00925d6052e3a4 /source
parentdcaeda5c4e3a0687251b8511de4f2e8b85ef75c0 (diff)
parent2198cfdb2deec8b2e85e242c74a032f43d0b26ca (diff)
merge with/from trunk at r35190
Diffstat (limited to 'source')
-rw-r--r--source/CMakeLists.txt18
-rw-r--r--source/Makefile631
-rw-r--r--source/SConscript11
-rw-r--r--source/blender/CMakeLists.txt132
-rw-r--r--source/blender/Makefile56
-rw-r--r--source/blender/avi/AVI_avi.h50
-rw-r--r--source/blender/avi/CMakeLists.txt26
-rw-r--r--source/blender/avi/Makefile34
-rw-r--r--source/blender/avi/intern/Makefile51
-rw-r--r--source/blender/avi/intern/avi.c48
-rw-r--r--source/blender/avi/intern/avi_intern.h2
-rw-r--r--source/blender/avi/intern/avirgb.c10
-rw-r--r--source/blender/avi/intern/avirgb.h2
-rw-r--r--source/blender/avi/intern/codecs.c6
-rw-r--r--source/blender/avi/intern/endian.c11
-rw-r--r--source/blender/avi/intern/endian.h9
-rw-r--r--source/blender/avi/intern/mjpeg.c20
-rw-r--r--source/blender/avi/intern/mjpeg.h2
-rw-r--r--source/blender/avi/intern/options.c11
-rw-r--r--source/blender/avi/intern/rgb32.c13
-rw-r--r--source/blender/avi/intern/rgb32.h2
-rw-r--r--source/blender/blenfont/BLF_api.h56
-rw-r--r--source/blender/blenfont/BLF_types.h0
-rw-r--r--source/blender/blenfont/CMakeLists.txt42
-rw-r--r--source/blender/blenfont/Makefile34
-rw-r--r--source/blender/blenfont/SConscript4
-rw-r--r--source/blender/blenfont/intern/Makefile74
-rw-r--r--source/blender/blenfont/intern/blf.c185
-rw-r--r--source/blender/blenfont/intern/blf_dir.c23
-rw-r--r--source/blender/blenfont/intern/blf_font.c173
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c55
-rw-r--r--source/blender/blenfont/intern/blf_internal.h49
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h16
-rw-r--r--source/blender/blenfont/intern/blf_lang.c68
-rw-r--r--source/blender/blenfont/intern/blf_util.c3
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h29
-rw-r--r--source/blender/blenkernel/BKE_action.h17
-rw-r--r--source/blender/blenkernel/BKE_anim.h9
-rw-r--r--source/blender/blenkernel/BKE_animsys.h24
-rw-r--r--source/blender/blenkernel/BKE_armature.h23
-rw-r--r--source/blender/blenkernel/BKE_array_mallocn.h87
-rw-r--r--source/blender/blenkernel/BKE_blender.h42
-rw-r--r--source/blender/blenkernel/BKE_bmesh.h14
-rw-r--r--source/blender/blenkernel/BKE_bmeshCustomData.h12
-rw-r--r--source/blender/blenkernel/BKE_bmfont.h12
-rw-r--r--source/blender/blenkernel/BKE_bmfont_types.h11
-rw-r--r--source/blender/blenkernel/BKE_boids.h10
-rw-r--r--source/blender/blenkernel/BKE_booleanops_mesh.h6
-rw-r--r--source/blender/blenkernel/BKE_brush.h16
-rw-r--r--source/blender/blenkernel/BKE_bullet.h6
-rw-r--r--source/blender/blenkernel/BKE_bvhutils.h8
-rw-r--r--source/blender/blenkernel/BKE_cdderivedmesh.h13
-rw-r--r--source/blender/blenkernel/BKE_cloth.h15
-rw-r--r--source/blender/blenkernel/BKE_collision.h11
-rw-r--r--source/blender/blenkernel/BKE_colortools.h6
-rw-r--r--source/blender/blenkernel/BKE_constraint.h7
-rw-r--r--source/blender/blenkernel/BKE_context.h20
-rw-r--r--source/blender/blenkernel/BKE_curve.h16
-rw-r--r--source/blender/blenkernel/BKE_customdata.h23
-rw-r--r--source/blender/blenkernel/BKE_customdata_file.h4
-rw-r--r--source/blender/blenkernel/BKE_deform.h22
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h33
-rw-r--r--source/blender/blenkernel/BKE_displist.h6
-rw-r--r--source/blender/blenkernel/BKE_effect.h9
-rw-r--r--source/blender/blenkernel/BKE_endian.h10
-rw-r--r--source/blender/blenkernel/BKE_exotic.h21
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h30
-rw-r--r--source/blender/blenkernel/BKE_fluidsim.h5
-rw-r--r--source/blender/blenkernel/BKE_font.h10
-rw-r--r--source/blender/blenkernel/BKE_global.h38
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h9
-rw-r--r--source/blender/blenkernel/BKE_group.h12
-rw-r--r--source/blender/blenkernel/BKE_icons.h10
-rwxr-xr-xsource/blender/blenkernel/BKE_idcode.h8
-rw-r--r--source/blender/blenkernel/BKE_idprop.h15
-rw-r--r--source/blender/blenkernel/BKE_image.h25
-rw-r--r--source/blender/blenkernel/BKE_ipo.h15
-rw-r--r--source/blender/blenkernel/BKE_key.h19
-rw-r--r--source/blender/blenkernel/BKE_lattice.h11
-rw-r--r--source/blender/blenkernel/BKE_library.h39
-rw-r--r--source/blender/blenkernel/BKE_main.h35
-rw-r--r--source/blender/blenkernel/BKE_material.h11
-rw-r--r--source/blender/blenkernel/BKE_mball.h16
-rw-r--r--source/blender/blenkernel/BKE_mesh.h26
-rw-r--r--source/blender/blenkernel/BKE_modifier.h35
-rw-r--r--source/blender/blenkernel/BKE_multires.h30
-rw-r--r--source/blender/blenkernel/BKE_nla.h7
-rw-r--r--source/blender/blenkernel/BKE_node.h57
-rw-r--r--source/blender/blenkernel/BKE_object.h22
-rw-r--r--source/blender/blenkernel/BKE_packedFile.h17
-rw-r--r--source/blender/blenkernel/BKE_paint.h13
-rw-r--r--source/blender/blenkernel/BKE_particle.h34
-rw-r--r--source/blender/blenkernel/BKE_plugin_types.h12
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h70
-rw-r--r--source/blender/blenkernel/BKE_property.h10
-rw-r--r--source/blender/blenkernel/BKE_report.h12
-rw-r--r--source/blender/blenkernel/BKE_sca.h12
-rw-r--r--source/blender/blenkernel/BKE_scene.h29
-rw-r--r--source/blender/blenkernel/BKE_screen.h10
-rw-r--r--source/blender/blenkernel/BKE_script.h11
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h120
-rw-r--r--source/blender/blenkernel/BKE_shrinkwrap.h12
-rw-r--r--source/blender/blenkernel/BKE_sketch.h11
-rw-r--r--source/blender/blenkernel/BKE_smoke.h11
-rw-r--r--source/blender/blenkernel/BKE_softbody.h8
-rw-r--r--source/blender/blenkernel/BKE_sound.h20
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h5
-rw-r--r--source/blender/blenkernel/BKE_suggestions.h24
-rw-r--r--source/blender/blenkernel/BKE_text.h18
-rw-r--r--source/blender/blenkernel/BKE_texture.h21
-rw-r--r--source/blender/blenkernel/BKE_unit.h22
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h155
-rw-r--r--source/blender/blenkernel/BKE_world.h12
-rw-r--r--source/blender/blenkernel/BKE_writeavi.h6
-rw-r--r--source/blender/blenkernel/BKE_writeffmpeg.h6
-rw-r--r--source/blender/blenkernel/BKE_writeframeserver.h6
-rw-r--r--source/blender/blenkernel/CMakeLists.txt330
-rw-r--r--source/blender/blenkernel/Makefile34
-rw-r--r--source/blender/blenkernel/SConscript64
-rw-r--r--source/blender/blenkernel/depsgraph_private.h10
-rw-r--r--source/blender/blenkernel/intern/BME_Customdata.c3
-rw-r--r--source/blender/blenkernel/intern/BME_conversions.c5
-rw-r--r--source/blender/blenkernel/intern/BME_eulers.c3
-rw-r--r--source/blender/blenkernel/intern/BME_mesh.c1
-rw-r--r--source/blender/blenkernel/intern/BME_structure.c4
-rw-r--r--source/blender/blenkernel/intern/BME_tools.c26
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c33
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c449
-rw-r--r--source/blender/blenkernel/intern/Makefile156
-rw-r--r--source/blender/blenkernel/intern/action.c71
-rw-r--r--source/blender/blenkernel/intern/anim.c204
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c477
-rw-r--r--source/blender/blenkernel/intern/armature.c353
-rw-r--r--source/blender/blenkernel/intern/blender.c147
-rw-r--r--source/blender/blenkernel/intern/bmesh_private.h2
-rw-r--r--source/blender/blenkernel/intern/bmfont.c3
-rw-r--r--source/blender/blenkernel/intern/boids.c107
-rw-r--r--source/blender/blenkernel/intern/brush.c59
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c49
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c255
-rw-r--r--source/blender/blenkernel/intern/cloth.c144
-rw-r--r--source/blender/blenkernel/intern/collision.c105
-rw-r--r--source/blender/blenkernel/intern/colortools.c42
-rw-r--r--source/blender/blenkernel/intern/constraint.c295
-rw-r--r--source/blender/blenkernel/intern/context.c36
-rw-r--r--source/blender/blenkernel/intern/curve.c234
-rw-r--r--source/blender/blenkernel/intern/customdata.c380
-rw-r--r--source/blender/blenkernel/intern/customdata_file.c5
-rw-r--r--source/blender/blenkernel/intern/deform.c94
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c362
-rw-r--r--source/blender/blenkernel/intern/displist.c168
-rw-r--r--source/blender/blenkernel/intern/editderivedbmesh.c60
-rw-r--r--source/blender/blenkernel/intern/effect.c63
-rw-r--r--source/blender/blenkernel/intern/exotic.c1834
-rw-r--r--source/blender/blenkernel/intern/fcurve.c186
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c9
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c83
-rw-r--r--source/blender/blenkernel/intern/font.c139
-rw-r--r--source/blender/blenkernel/intern/gpencil.c8
-rw-r--r--source/blender/blenkernel/intern/group.c6
-rw-r--r--source/blender/blenkernel/intern/icons.c27
-rwxr-xr-xsource/blender/blenkernel/intern/idcode.c8
-rw-r--r--source/blender/blenkernel/intern/idprop.c32
-rw-r--r--source/blender/blenkernel/intern/image.c334
-rw-r--r--source/blender/blenkernel/intern/image_gen.c10
-rw-r--r--source/blender/blenkernel/intern/implicit.c98
-rw-r--r--source/blender/blenkernel/intern/ipo.c148
-rw-r--r--source/blender/blenkernel/intern/key.c263
-rw-r--r--source/blender/blenkernel/intern/lattice.c95
-rw-r--r--source/blender/blenkernel/intern/library.c160
-rw-r--r--source/blender/blenkernel/intern/material.c206
-rw-r--r--source/blender/blenkernel/intern/mball.c110
-rw-r--r--source/blender/blenkernel/intern/mesh.c175
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c379
-rw-r--r--source/blender/blenkernel/intern/modifier.c50
-rw-r--r--source/blender/blenkernel/intern/multires.c983
-rw-r--r--source/blender/blenkernel/intern/nla.c61
-rw-r--r--source/blender/blenkernel/intern/node.c1952
-rw-r--r--source/blender/blenkernel/intern/object.c340
-rw-r--r--source/blender/blenkernel/intern/packedFile.c42
-rw-r--r--source/blender/blenkernel/intern/paint.c9
-rw-r--r--source/blender/blenkernel/intern/particle.c1342
-rw-r--r--source/blender/blenkernel/intern/particle_system.c1736
-rw-r--r--source/blender/blenkernel/intern/pointcache.c2339
-rw-r--r--source/blender/blenkernel/intern/property.c6
-rw-r--r--source/blender/blenkernel/intern/report.c30
-rw-r--r--source/blender/blenkernel/intern/sca.c27
-rw-r--r--source/blender/blenkernel/intern/scene.c160
-rw-r--r--source/blender/blenkernel/intern/screen.c2
-rw-r--r--source/blender/blenkernel/intern/script.c2
-rwxr-xr-xsource/blender/blenkernel/intern/seqcache.c81
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c430
-rw-r--r--source/blender/blenkernel/intern/sequencer.c1102
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c90
-rw-r--r--source/blender/blenkernel/intern/sketch.c9
-rw-r--r--source/blender/blenkernel/intern/smoke.c429
-rw-r--r--source/blender/blenkernel/intern/softbody.c62
-rw-r--r--source/blender/blenkernel/intern/sound.c31
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c169
-rw-r--r--source/blender/blenkernel/intern/suggestions.c24
-rw-r--r--source/blender/blenkernel/intern/text.c55
-rw-r--r--source/blender/blenkernel/intern/texture.c151
-rw-r--r--source/blender/blenkernel/intern/unit.c304
-rw-r--r--source/blender/blenkernel/intern/world.c13
-rw-r--r--source/blender/blenkernel/intern/writeavi.c14
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c125
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c26
-rw-r--r--source/blender/blenkernel/nla_private.h2
-rw-r--r--source/blender/blenlib/BLI_args.h21
-rw-r--r--source/blender/blenlib/BLI_bfile.h143
-rw-r--r--source/blender/blenlib/BLI_blenlib.h20
-rw-r--r--source/blender/blenlib/BLI_boxpack2d.h35
-rw-r--r--source/blender/blenlib/BLI_bpath.h54
-rw-r--r--source/blender/blenlib/BLI_cellalloc.h4
-rw-r--r--source/blender/blenlib/BLI_cpu.h5
-rw-r--r--source/blender/blenlib/BLI_dlrbTree.h7
-rw-r--r--source/blender/blenlib/BLI_dynstr.h26
-rw-r--r--source/blender/blenlib/BLI_edgehash.h10
-rw-r--r--source/blender/blenlib/BLI_editVert.h17
-rw-r--r--source/blender/blenlib/BLI_fileops.h42
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h5
-rw-r--r--source/blender/blenlib/BLI_ghash.h38
-rw-r--r--source/blender/blenlib/BLI_graph.h4
-rw-r--r--source/blender/blenlib/BLI_gsqueue.h9
-rw-r--r--source/blender/blenlib/BLI_heap.h9
-rw-r--r--source/blender/blenlib/BLI_jitter.h12
-rw-r--r--source/blender/blenlib/BLI_kdopbvh.h11
-rw-r--r--source/blender/blenlib/BLI_kdtree.h11
-rw-r--r--source/blender/blenlib/BLI_linklist.h10
-rw-r--r--source/blender/blenlib/BLI_listbase.h23
-rw-r--r--source/blender/blenlib/BLI_math.h49
-rw-r--r--source/blender/blenlib/BLI_math_base.h33
-rw-r--r--source/blender/blenlib/BLI_math_color.h28
-rw-r--r--source/blender/blenlib/BLI_math_geom.h29
-rw-r--r--source/blender/blenlib/BLI_math_inline.h10
-rw-r--r--source/blender/blenlib/BLI_math_matrix.h40
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h86
-rw-r--r--source/blender/blenlib/BLI_math_vector.h76
-rw-r--r--source/blender/blenlib/BLI_memarena.h10
-rw-r--r--source/blender/blenlib/BLI_mempool.h20
-rw-r--r--source/blender/blenlib/BLI_noise.h5
-rw-r--r--source/blender/blenlib/BLI_path_util.h39
-rw-r--r--source/blender/blenlib/BLI_pbvh.h11
-rw-r--r--source/blender/blenlib/BLI_rand.h18
-rw-r--r--source/blender/blenlib/BLI_rect.h4
-rw-r--r--source/blender/blenlib/BLI_scanfill.h17
-rwxr-xr-xsource/blender/blenlib/BLI_smallhash.h2
-rw-r--r--source/blender/blenlib/BLI_storage.h35
-rw-r--r--source/blender/blenlib/BLI_storage_types.h29
-rw-r--r--source/blender/blenlib/BLI_string.h34
-rw-r--r--source/blender/blenlib/BLI_threads.h6
-rw-r--r--source/blender/blenlib/BLI_utildefines.h227
-rw-r--r--source/blender/blenlib/BLI_uvproject.h6
-rw-r--r--source/blender/blenlib/BLI_vfontdata.h13
-rw-r--r--source/blender/blenlib/BLI_voxel.h9
-rw-r--r--source/blender/blenlib/BLI_winstuff.h30
-rw-r--r--source/blender/blenlib/CMakeLists.txt131
-rw-r--r--source/blender/blenlib/Makefile34
-rw-r--r--source/blender/blenlib/PIL_dynlib.h4
-rw-r--r--source/blender/blenlib/PIL_time.h2
-rw-r--r--source/blender/blenlib/SConscript9
-rw-r--r--source/blender/blenlib/intern/BLI_args.c47
-rw-r--r--source/blender/blenlib/intern/BLI_bfile.c372
-rw-r--r--source/blender/blenlib/intern/BLI_callbacks.h4
-rw-r--r--source/blender/blenlib/intern/BLI_cellalloc.c9
-rw-r--r--source/blender/blenlib/intern/BLI_dynstr.c38
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c19
-rw-r--r--source/blender/blenlib/intern/BLI_heap.c4
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c20
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c7
-rw-r--r--source/blender/blenlib/intern/BLI_linklist.c2
-rw-r--r--source/blender/blenlib/intern/BLI_memarena.c2
-rw-r--r--source/blender/blenlib/intern/BLI_mempool.c31
-rw-r--r--source/blender/blenlib/intern/DLRB_tree.c2
-rw-r--r--source/blender/blenlib/intern/Makefile62
-rw-r--r--source/blender/blenlib/intern/boxpack2d.c41
-rw-r--r--source/blender/blenlib/intern/bpath.c560
-rw-r--r--source/blender/blenlib/intern/cpu.c2
-rw-r--r--source/blender/blenlib/intern/dynamiclist.h2
-rw-r--r--source/blender/blenlib/intern/dynlib.c9
-rw-r--r--source/blender/blenlib/intern/edgehash.c2
-rw-r--r--source/blender/blenlib/intern/fileops.c110
-rw-r--r--source/blender/blenlib/intern/freetypefont.c26
-rw-r--r--source/blender/blenlib/intern/graph.c15
-rw-r--r--source/blender/blenlib/intern/gsqueue.c2
-rw-r--r--source/blender/blenlib/intern/jitter.c3
-rw-r--r--source/blender/blenlib/intern/listbase.c62
-rw-r--r--source/blender/blenlib/intern/math_base.c5
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c13
-rw-r--r--source/blender/blenlib/intern/math_color.c79
-rw-r--r--source/blender/blenlib/intern/math_geom.c267
-rw-r--r--source/blender/blenlib/intern/math_geom_inline.c8
-rw-r--r--source/blender/blenlib/intern/math_matrix.c181
-rw-r--r--source/blender/blenlib/intern/math_rotation.c337
-rw-r--r--source/blender/blenlib/intern/math_vector.c154
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c83
-rw-r--r--source/blender/blenlib/intern/noise.c16
-rw-r--r--source/blender/blenlib/intern/path_util.c523
-rw-r--r--source/blender/blenlib/intern/pbvh.c34
-rw-r--r--source/blender/blenlib/intern/rand.c2
-rw-r--r--source/blender/blenlib/intern/rct.c3
-rw-r--r--source/blender/blenlib/intern/scanfill.c33
-rw-r--r--source/blender/blenlib/intern/storage.c55
-rw-r--r--source/blender/blenlib/intern/string.c11
-rw-r--r--source/blender/blenlib/intern/threads.c6
-rw-r--r--source/blender/blenlib/intern/time.c5
-rw-r--r--source/blender/blenlib/intern/uvproject.c7
-rw-r--r--source/blender/blenlib/intern/voxel.c5
-rw-r--r--source/blender/blenlib/intern/winstuff.c9
-rw-r--r--source/blender/blenloader/BLO_readfile.h10
-rw-r--r--source/blender/blenloader/BLO_soundfile.h6
-rw-r--r--source/blender/blenloader/BLO_sys_types.h7
-rw-r--r--source/blender/blenloader/BLO_undofile.h4
-rw-r--r--source/blender/blenloader/BLO_writefile.h11
-rw-r--r--source/blender/blenloader/CMakeLists.txt36
-rw-r--r--source/blender/blenloader/Makefile34
-rw-r--r--source/blender/blenloader/SConscript5
-rw-r--r--source/blender/blenloader/intern/Makefile69
-rw-r--r--source/blender/blenloader/intern/readblenentry.c17
-rw-r--r--source/blender/blenloader/intern/readfile.c860
-rw-r--r--source/blender/blenloader/intern/readfile.h4
-rw-r--r--source/blender/blenloader/intern/undofile.c2
-rw-r--r--source/blender/blenloader/intern/writefile.c569
-rw-r--r--source/blender/blenpluginapi/CMakeLists.txt35
-rw-r--r--source/blender/blenpluginapi/Makefile34
-rw-r--r--source/blender/blenpluginapi/SConscript6
-rw-r--r--source/blender/blenpluginapi/documentation.h2
-rw-r--r--source/blender/blenpluginapi/iff.h2
-rw-r--r--source/blender/blenpluginapi/intern/Makefile50
-rw-r--r--source/blender/blenpluginapi/intern/pluginapi.c7
-rw-r--r--source/blender/bmesh/CMakeLists.txt124
-rw-r--r--source/blender/bmesh/bmesh_class.h4
-rw-r--r--source/blender/bmesh/bmesh_error.h6
-rw-r--r--source/blender/bmesh/bmesh_iterators.h4
-rw-r--r--source/blender/bmesh/bmesh_operator_api.h93
-rw-r--r--source/blender/bmesh/intern/bmesh_construct.c13
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c2
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.c5
-rw-r--r--source/blender/bmesh/intern/bmesh_newcore.c7
-rw-r--r--source/blender/bmesh/intern/bmesh_operators.c94
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.c45
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.c5
-rw-r--r--source/blender/bmesh/operators/createops.c4
-rw-r--r--source/blender/bmesh/operators/edgesplitop.c4
-rw-r--r--source/blender/bmesh/operators/extrudeops.c2
-rw-r--r--source/blender/bmesh/operators/mesh_conv.c8
-rw-r--r--source/blender/bmesh/operators/mirror.c8
-rw-r--r--source/blender/bmesh/operators/removedoubles.c7
-rw-r--r--source/blender/bmesh/operators/subdivideop.c11
-rw-r--r--source/blender/bmesh/operators/utils.c15
-rw-r--r--source/blender/collada/AnimationImporter.cpp1152
-rw-r--r--source/blender/collada/AnimationImporter.h136
-rw-r--r--source/blender/collada/ArmatureExporter.cpp469
-rw-r--r--source/blender/collada/ArmatureExporter.h141
-rw-r--r--source/blender/collada/ArmatureImporter.cpp587
-rw-r--r--source/blender/collada/ArmatureImporter.h163
-rw-r--r--source/blender/collada/CMakeLists.txt108
-rw-r--r--source/blender/collada/CameraExporter.cpp86
-rw-r--r--source/blender/collada/CameraExporter.h47
-rw-r--r--source/blender/collada/DocumentExporter.cpp1376
-rw-r--r--source/blender/collada/DocumentExporter.h12
-rw-r--r--source/blender/collada/DocumentImporter.cpp3634
-rw-r--r--source/blender/collada/DocumentImporter.h127
-rw-r--r--source/blender/collada/EffectExporter.cpp306
-rw-r--r--source/blender/collada/EffectExporter.h66
-rw-r--r--source/blender/collada/GeometryExporter.cpp477
-rw-r--r--source/blender/collada/GeometryExporter.h121
-rw-r--r--source/blender/collada/ImageExporter.cpp94
-rw-r--r--source/blender/collada/ImageExporter.h (renamed from source/gameengine/GamePlayer/common/unix/GPU_Canvas.h)52
-rw-r--r--source/blender/collada/InstanceWriter.cpp64
-rw-r--r--source/blender/collada/InstanceWriter.h (renamed from source/gameengine/GamePlayer/common/windows/GPW_Engine.h)34
-rw-r--r--source/blender/collada/LightExporter.cpp139
-rw-r--r--source/blender/collada/LightExporter.h (renamed from source/blender/verify/BLO_signer_info.h)40
-rw-r--r--source/blender/collada/MaterialExporter.cpp (renamed from source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp)57
-rw-r--r--source/blender/collada/MaterialExporter.h98
-rw-r--r--source/blender/collada/MeshImporter.cpp915
-rw-r--r--source/blender/collada/MeshImporter.h156
-rw-r--r--source/blender/collada/SConscript5
-rw-r--r--source/blender/collada/SkinInfo.cpp331
-rw-r--r--source/blender/collada/SkinInfo.h137
-rw-r--r--source/blender/collada/TransformReader.cpp127
-rw-r--r--source/blender/collada/TransformReader.h74
-rw-r--r--source/blender/collada/TransformWriter.cpp100
-rw-r--r--source/blender/collada/TransformWriter.h (renamed from source/gameengine/GamePlayer/common/windows/GPW_System.h)46
-rw-r--r--source/blender/collada/collada.cpp15
-rw-r--r--source/blender/collada/collada.h7
-rw-r--r--source/blender/collada/collada_internal.cpp269
-rw-r--r--source/blender/collada/collada_internal.h100
-rw-r--r--source/blender/collada/collada_utils.cpp109
-rw-r--r--source/blender/collada/collada_utils.h54
-rw-r--r--source/blender/editors/CMakeLists.txt73
-rw-r--r--source/blender/editors/Makefile71
-rw-r--r--source/blender/editors/SConscript70
-rw-r--r--source/blender/editors/animation/CMakeLists.txt27
-rw-r--r--source/blender/editors/animation/Makefile54
-rw-r--r--source/blender/editors/animation/SConscript4
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c548
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c889
-rw-r--r--source/blender/editors/animation/anim_deps.c13
-rw-r--r--source/blender/editors/animation/anim_draw.c11
-rw-r--r--source/blender/editors/animation/anim_filter.c253
-rw-r--r--source/blender/editors/animation/anim_intern.h2
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c17
-rw-r--r--source/blender/editors/animation/anim_markers.c494
-rw-r--r--source/blender/editors/animation/anim_ops.c26
-rw-r--r--source/blender/editors/animation/drivers.c218
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c104
-rw-r--r--source/blender/editors/animation/keyframes_draw.c135
-rw-r--r--source/blender/editors/animation/keyframes_edit.c62
-rw-r--r--source/blender/editors/animation/keyframes_general.c364
-rw-r--r--source/blender/editors/animation/keyframing.c190
-rw-r--r--source/blender/editors/animation/keyingsets.c160
-rw-r--r--source/blender/editors/armature/BIF_generate.h2
-rw-r--r--source/blender/editors/armature/BIF_retarget.h8
-rw-r--r--source/blender/editors/armature/CMakeLists.txt29
-rw-r--r--source/blender/editors/armature/Makefile57
-rw-r--r--source/blender/editors/armature/SConscript2
-rw-r--r--source/blender/editors/armature/armature_intern.h19
-rw-r--r--source/blender/editors/armature/armature_ops.c59
-rw-r--r--source/blender/editors/armature/editarmature.c1524
-rw-r--r--source/blender/editors/armature/editarmature_generate.c23
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c79
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c165
-rw-r--r--source/blender/editors/armature/meshlaplacian.c58
-rw-r--r--source/blender/editors/armature/meshlaplacian.h8
-rw-r--r--source/blender/editors/armature/poseSlide.c51
-rw-r--r--source/blender/editors/armature/poseUtils.c5
-rw-r--r--source/blender/editors/armature/poselib.c571
-rw-r--r--source/blender/editors/armature/poseobject.c412
-rw-r--r--source/blender/editors/armature/reeb.c148
-rw-r--r--source/blender/editors/armature/reeb.h8
-rw-r--r--source/blender/editors/curve/CMakeLists.txt16
-rw-r--r--source/blender/editors/curve/Makefile56
-rw-r--r--source/blender/editors/curve/SConscript4
-rw-r--r--source/blender/editors/curve/curve_intern.h5
-rw-r--r--source/blender/editors/curve/curve_ops.c26
-rw-r--r--source/blender/editors/curve/editcurve.c1388
-rw-r--r--source/blender/editors/curve/editfont.c199
-rw-r--r--source/blender/editors/curve/lorem.c1123
-rw-r--r--source/blender/editors/datafiles/Bfont.c101
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt43
-rw-r--r--source/blender/editors/datafiles/Makefile49
-rw-r--r--source/blender/editors/datafiles/SConscript2
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13129
-rw-r--r--source/blender/editors/datafiles/prvicons.c861
-rw-r--r--source/blender/editors/datafiles/splash.png.c11252
-rw-r--r--source/blender/editors/datafiles/startup.blend.c16625
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt18
-rw-r--r--source/blender/editors/gpencil/Makefile56
-rw-r--r--source/blender/editors/gpencil/SConscript4
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c16
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c68
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c47
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c8
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h2
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c418
-rw-r--r--source/blender/editors/include/BIF_gl.h6
-rw-r--r--source/blender/editors/include/BIF_glutil.h8
-rw-r--r--source/blender/editors/include/ED_anim_api.h31
-rw-r--r--source/blender/editors/include/ED_armature.h46
-rw-r--r--source/blender/editors/include/ED_curve.h20
-rw-r--r--source/blender/editors/include/ED_datafiles.h6
-rw-r--r--source/blender/editors/include/ED_fileselect.h9
-rw-r--r--source/blender/editors/include/ED_fluidsim.h7
-rw-r--r--source/blender/editors/include/ED_gpencil.h33
-rw-r--r--source/blender/editors/include/ED_image.h13
-rw-r--r--source/blender/editors/include/ED_info.h8
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h10
-rw-r--r--source/blender/editors/include/ED_keyframes_edit.h43
-rw-r--r--source/blender/editors/include/ED_keyframing.h55
-rw-r--r--source/blender/editors/include/ED_lattice.h6
-rw-r--r--source/blender/editors/include/ED_logic.h7
-rw-r--r--source/blender/editors/include/ED_markers.h15
-rw-r--r--source/blender/editors/include/ED_mball.h13
-rw-r--r--source/blender/editors/include/ED_mesh.h69
-rw-r--r--source/blender/editors/include/ED_node.h9
-rw-r--r--source/blender/editors/include/ED_numinput.h6
-rw-r--r--source/blender/editors/include/ED_object.h24
-rw-r--r--source/blender/editors/include/ED_particle.h10
-rw-r--r--source/blender/editors/include/ED_physics.h4
-rw-r--r--source/blender/editors/include/ED_render.h8
-rw-r--r--source/blender/editors/include/ED_retopo.h111
-rw-r--r--source/blender/editors/include/ED_screen.h29
-rw-r--r--source/blender/editors/include/ED_screen_types.h19
-rw-r--r--source/blender/editors/include/ED_sculpt.h8
-rw-r--r--source/blender/editors/include/ED_sequencer.h6
-rw-r--r--source/blender/editors/include/ED_sound.h6
-rw-r--r--source/blender/editors/include/ED_space_api.h6
-rw-r--r--source/blender/editors/include/ED_text.h6
-rw-r--r--source/blender/editors/include/ED_transform.h9
-rw-r--r--source/blender/editors/include/ED_types.h16
-rw-r--r--source/blender/editors/include/ED_util.h34
-rw-r--r--source/blender/editors/include/ED_uvedit.h17
-rw-r--r--source/blender/editors/include/ED_view3d.h29
-rw-r--r--source/blender/editors/include/UI_icons.h1742
-rw-r--r--source/blender/editors/include/UI_interface.h305
-rw-r--r--source/blender/editors/include/UI_interface_icons.h10
-rw-r--r--source/blender/editors/include/UI_resources.h29
-rw-r--r--source/blender/editors/include/UI_view2d.h26
-rw-r--r--source/blender/editors/interface/CMakeLists.txt40
-rw-r--r--source/blender/editors/interface/Makefile61
-rw-r--r--source/blender/editors/interface/SConscript13
-rw-r--r--source/blender/editors/interface/interface.c582
-rw-r--r--source/blender/editors/interface/interface_anim.c45
-rw-r--r--source/blender/editors/interface/interface_draw.c112
-rw-r--r--source/blender/editors/interface/interface_handlers.c702
-rw-r--r--source/blender/editors/interface/interface_icons.c214
-rw-r--r--source/blender/editors/interface/interface_intern.h72
-rw-r--r--source/blender/editors/interface/interface_layout.c314
-rw-r--r--source/blender/editors/interface/interface_ops.c85
-rw-r--r--source/blender/editors/interface/interface_panel.c48
-rw-r--r--source/blender/editors/interface/interface_regions.c247
-rw-r--r--source/blender/editors/interface/interface_style.c46
-rw-r--r--source/blender/editors/interface/interface_templates.c348
-rw-r--r--source/blender/editors/interface/interface_utils.c80
-rw-r--r--source/blender/editors/interface/interface_widgets.c297
-rw-r--r--source/blender/editors/interface/resources.c105
-rw-r--r--source/blender/editors/interface/view2d.c145
-rw-r--r--source/blender/editors/interface/view2d_ops.c292
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt27
-rw-r--r--source/blender/editors/mesh/Makefile56
-rw-r--r--source/blender/editors/mesh/SConscript2
-rw-r--r--source/blender/editors/mesh/bmesh_select.c190
-rw-r--r--source/blender/editors/mesh/bmesh_tools.c371
-rw-r--r--source/blender/editors/mesh/bmeshutils.c10
-rw-r--r--source/blender/editors/mesh/editbmesh_add.c6
-rw-r--r--source/blender/editors/mesh/editbmesh_bvh.c16
-rw-r--r--source/blender/editors/mesh/editface.c183
-rwxr-xr-xsource/blender/editors/mesh/knifetool.c2
-rw-r--r--source/blender/editors/mesh/loopcut.c93
-rw-r--r--source/blender/editors/mesh/mesh_data.c126
-rw-r--r--source/blender/editors/mesh/mesh_intern.h21
-rw-r--r--source/blender/editors/mesh/mesh_ops.c24
-rw-r--r--source/blender/editors/mesh/meshtools.c213
-rw-r--r--source/blender/editors/metaball/CMakeLists.txt14
-rw-r--r--source/blender/editors/metaball/Makefile56
-rw-r--r--source/blender/editors/metaball/SConscript2
-rw-r--r--source/blender/editors/metaball/mball_edit.c56
-rw-r--r--source/blender/editors/metaball/mball_intern.h2
-rw-r--r--source/blender/editors/metaball/mball_ops.c4
-rw-r--r--source/blender/editors/object/CMakeLists.txt34
-rw-r--r--source/blender/editors/object/Makefile56
-rw-r--r--source/blender/editors/object/SConscript6
-rw-r--r--source/blender/editors/object/object_add.c282
-rw-r--r--source/blender/editors/object/object_bake.c33
-rw-r--r--source/blender/editors/object/object_constraint.c187
-rw-r--r--source/blender/editors/object/object_edit.c218
-rw-r--r--source/blender/editors/object/object_group.c18
-rw-r--r--source/blender/editors/object/object_hook.c17
-rw-r--r--source/blender/editors/object/object_intern.h4
-rw-r--r--source/blender/editors/object/object_lattice.c23
-rw-r--r--source/blender/editors/object/object_modifier.c193
-rw-r--r--source/blender/editors/object/object_ops.c8
-rw-r--r--source/blender/editors/object/object_relations.c264
-rw-r--r--source/blender/editors/object/object_select.c58
-rw-r--r--source/blender/editors/object/object_shapekey.c52
-rw-r--r--source/blender/editors/object/object_transform.c435
-rw-r--r--source/blender/editors/object/object_vgroup.c278
-rw-r--r--source/blender/editors/physics/CMakeLists.txt32
-rw-r--r--source/blender/editors/physics/Makefile62
-rw-r--r--source/blender/editors/physics/SConscript4
-rw-r--r--source/blender/editors/physics/particle_boids.c32
-rw-r--r--source/blender/editors/physics/particle_edit.c370
-rw-r--r--source/blender/editors/physics/particle_object.c49
-rw-r--r--source/blender/editors/physics/physics_fluid.c74
-rw-r--r--source/blender/editors/physics/physics_ops.c2
-rw-r--r--source/blender/editors/physics/physics_pointcache.c36
-rw-r--r--source/blender/editors/render/CMakeLists.txt39
-rw-r--r--source/blender/editors/render/Makefile62
-rw-r--r--source/blender/editors/render/render_intern.h2
-rw-r--r--source/blender/editors/render/render_internal.c168
-rw-r--r--source/blender/editors/render/render_opengl.c143
-rw-r--r--source/blender/editors/render/render_ops.c4
-rw-r--r--source/blender/editors/render/render_preview.c165
-rw-r--r--source/blender/editors/render/render_shading.c165
-rw-r--r--source/blender/editors/screen/CMakeLists.txt24
-rw-r--r--source/blender/editors/screen/SConscript6
-rw-r--r--source/blender/editors/screen/area.c212
-rw-r--r--source/blender/editors/screen/glutil.c21
-rw-r--r--source/blender/editors/screen/screen_context.c81
-rw-r--r--source/blender/editors/screen/screen_edit.c171
-rw-r--r--source/blender/editors/screen/screen_intern.h14
-rw-r--r--source/blender/editors/screen/screen_ops.c397
-rw-r--r--source/blender/editors/screen/screendump.c65
-rw-r--r--source/blender/editors/sculpt_paint/CMakeLists.txt27
-rw-r--r--source/blender/editors/sculpt_paint/Makefile56
-rw-r--r--source/blender/editors/sculpt_paint/SConscript8
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c298
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h34
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c212
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c681
-rw-r--r--source/blender/editors/sculpt_paint/paint_undo.c31
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c136
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c65
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c613
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h13
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c47
-rw-r--r--source/blender/editors/sound/CMakeLists.txt19
-rw-r--r--source/blender/editors/sound/Makefile53
-rw-r--r--source/blender/editors/sound/SConscript2
-rw-r--r--source/blender/editors/sound/sound_intern.h2
-rw-r--r--source/blender/editors/sound/sound_ops.c102
-rw-r--r--source/blender/editors/space_action/CMakeLists.txt20
-rw-r--r--source/blender/editors/space_action/Makefile54
-rw-r--r--source/blender/editors/space_action/SConscript4
-rw-r--r--source/blender/editors/space_action/action_draw.c21
-rw-r--r--source/blender/editors/space_action/action_edit.c133
-rw-r--r--source/blender/editors/space_action/action_intern.h10
-rw-r--r--source/blender/editors/space_action/action_ops.c17
-rw-r--r--source/blender/editors/space_action/action_select.c341
-rw-r--r--source/blender/editors/space_action/space_action.c46
-rw-r--r--source/blender/editors/space_api/CMakeLists.txt14
-rw-r--r--source/blender/editors/space_api/Makefile50
-rw-r--r--source/blender/editors/space_api/SConscript2
-rw-r--r--source/blender/editors/space_api/space.c2
-rw-r--r--source/blender/editors/space_api/spacetypes.c17
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt20
-rw-r--r--source/blender/editors/space_buttons/Makefile55
-rw-r--r--source/blender/editors/space_buttons/SConscript4
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c88
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c38
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h4
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c46
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c33
-rw-r--r--source/blender/editors/space_console/CMakeLists.txt24
-rw-r--r--source/blender/editors/space_console/Makefile53
-rw-r--r--source/blender/editors/space_console/SConscript24
-rw-r--r--source/blender/editors/space_console/console_draw.c462
-rw-r--r--source/blender/editors/space_console/console_intern.h33
-rw-r--r--source/blender/editors/space_console/console_ops.c241
-rw-r--r--source/blender/editors/space_console/space_console.c98
-rw-r--r--source/blender/editors/space_file/CMakeLists.txt65
-rw-r--r--source/blender/editors/space_file/SConscript4
-rw-r--r--source/blender/editors/space_file/file_draw.c197
-rw-r--r--source/blender/editors/space_file/file_intern.h13
-rw-r--r--source/blender/editors/space_file/file_ops.c332
-rw-r--r--source/blender/editors/space_file/file_panels.c65
-rw-r--r--source/blender/editors/space_file/filelist.c209
-rw-r--r--source/blender/editors/space_file/filelist.h12
-rw-r--r--source/blender/editors/space_file/filesel.c133
-rw-r--r--source/blender/editors/space_file/fsmenu.c16
-rw-r--r--source/blender/editors/space_file/fsmenu.h4
-rw-r--r--source/blender/editors/space_file/space_file.c30
-rw-r--r--source/blender/editors/space_file/writeimage.c233
-rw-r--r--source/blender/editors/space_graph/CMakeLists.txt23
-rw-r--r--source/blender/editors/space_graph/Makefile58
-rw-r--r--source/blender/editors/space_graph/SConscript2
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c128
-rw-r--r--source/blender/editors/space_graph/graph_draw.c81
-rw-r--r--source/blender/editors/space_graph/graph_edit.c149
-rw-r--r--source/blender/editors/space_graph/graph_intern.h12
-rw-r--r--source/blender/editors/space_graph/graph_ops.c40
-rw-r--r--source/blender/editors/space_graph/graph_select.c284
-rw-r--r--source/blender/editors/space_graph/graph_utils.c76
-rw-r--r--source/blender/editors/space_graph/space_graph.c61
-rw-r--r--source/blender/editors/space_image/CMakeLists.txt55
-rw-r--r--source/blender/editors/space_image/SConscript20
-rw-r--r--source/blender/editors/space_image/image_buttons.c98
-rw-r--r--source/blender/editors/space_image/image_draw.c74
-rw-r--r--source/blender/editors/space_image/image_header.c20
-rw-r--r--source/blender/editors/space_image/image_intern.h9
-rw-r--r--source/blender/editors/space_image/image_ops.c455
-rw-r--r--source/blender/editors/space_image/image_render.c12
-rw-r--r--source/blender/editors/space_image/space_image.c69
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt24
-rw-r--r--source/blender/editors/space_info/SConscript4
-rw-r--r--source/blender/editors/space_info/info_draw.c302
-rw-r--r--source/blender/editors/space_info/info_intern.h20
-rw-r--r--source/blender/editors/space_info/info_ops.c68
-rw-r--r--source/blender/editors/space_info/info_report.c (renamed from source/blender/editors/space_console/console_report.c)123
-rw-r--r--source/blender/editors/space_info/info_stats.c23
-rw-r--r--source/blender/editors/space_info/space_info.c120
-rw-r--r--source/blender/editors/space_info/textview.c298
-rw-r--r--source/blender/editors/space_info/textview.h57
-rw-r--r--source/blender/editors/space_logic/CMakeLists.txt26
-rw-r--r--source/blender/editors/space_logic/Makefile55
-rw-r--r--source/blender/editors/space_logic/SConscript4
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c11
-rw-r--r--source/blender/editors/space_logic/logic_intern.h2
-rw-r--r--source/blender/editors/space_logic/logic_ops.c35
-rw-r--r--source/blender/editors/space_logic/logic_window.c701
-rw-r--r--source/blender/editors/space_logic/space_logic.c24
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt23
-rw-r--r--source/blender/editors/space_nla/Makefile54
-rw-r--r--source/blender/editors/space_nla/SConscript2
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c78
-rw-r--r--source/blender/editors/space_nla/nla_channels.c18
-rw-r--r--source/blender/editors/space_nla/nla_draw.c52
-rw-r--r--source/blender/editors/space_nla/nla_edit.c209
-rw-r--r--source/blender/editors/space_nla/nla_intern.h10
-rw-r--r--source/blender/editors/space_nla/nla_ops.c48
-rw-r--r--source/blender/editors/space_nla/nla_select.c251
-rw-r--r--source/blender/editors/space_nla/space_nla.c38
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt32
-rw-r--r--source/blender/editors/space_node/Makefile56
-rw-r--r--source/blender/editors/space_node/SConscript18
-rw-r--r--source/blender/editors/space_node/drawnode.c685
-rw-r--r--source/blender/editors/space_node/node_buttons.c14
-rw-r--r--source/blender/editors/space_node/node_draw.c515
-rw-r--r--source/blender/editors/space_node/node_edit.c749
-rw-r--r--source/blender/editors/space_node/node_header.c31
-rw-r--r--source/blender/editors/space_node/node_intern.h20
-rw-r--r--source/blender/editors/space_node/node_ops.c17
-rw-r--r--source/blender/editors/space_node/node_select.c28
-rw-r--r--source/blender/editors/space_node/node_state.c22
-rw-r--r--source/blender/editors/space_node/space_node.c95
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt21
-rw-r--r--source/blender/editors/space_outliner/Makefile54
-rw-r--r--source/blender/editors/space_outliner/SConscript2
-rw-r--r--source/blender/editors/space_outliner/outliner.c797
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h6
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c8
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c59
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt29
-rw-r--r--source/blender/editors/space_script/Makefile54
-rw-r--r--source/blender/editors/space_script/SConscript6
-rw-r--r--source/blender/editors/space_script/script_edit.c24
-rw-r--r--source/blender/editors/space_script/script_header.c19
-rw-r--r--source/blender/editors/space_script/script_intern.h2
-rw-r--r--source/blender/editors/space_script/script_ops.c2
-rw-r--r--source/blender/editors/space_script/space_script.c28
-rw-r--r--source/blender/editors/space_sequencer/CMakeLists.txt24
-rw-r--r--source/blender/editors/space_sequencer/Makefile58
-rw-r--r--source/blender/editors/space_sequencer/SConscript2
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c88
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c13
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c160
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c250
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h9
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c11
-rw-r--r--source/blender/editors/space_sequencer/sequencer_scopes.c24
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c38
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c23
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt18
-rw-r--r--source/blender/editors/space_sound/Makefile56
-rw-r--r--source/blender/editors/space_sound/SConscript2
-rw-r--r--source/blender/editors/space_sound/sound_header.c11
-rw-r--r--source/blender/editors/space_sound/sound_intern.h2
-rw-r--r--source/blender/editors/space_sound/space_sound.c22
-rw-r--r--source/blender/editors/space_text/CMakeLists.txt30
-rw-r--r--source/blender/editors/space_text/Makefile55
-rw-r--r--source/blender/editors/space_text/SConscript6
-rw-r--r--source/blender/editors/space_text/space_text.c88
-rw-r--r--source/blender/editors/space_text/text_draw.c698
-rw-r--r--source/blender/editors/space_text/text_header.c61
-rw-r--r--source/blender/editors/space_text/text_intern.h29
-rw-r--r--source/blender/editors/space_text/text_ops.c975
-rw-r--r--source/blender/editors/space_text/text_python.c28
-rw-r--r--source/blender/editors/space_time/CMakeLists.txt18
-rw-r--r--source/blender/editors/space_time/Makefile54
-rw-r--r--source/blender/editors/space_time/SConscript2
-rw-r--r--source/blender/editors/space_time/space_time.c254
-rw-r--r--source/blender/editors/space_time/time_intern.h2
-rw-r--r--source/blender/editors/space_time/time_ops.c19
-rw-r--r--source/blender/editors/space_userpref/CMakeLists.txt16
-rw-r--r--source/blender/editors/space_userpref/Makefile55
-rw-r--r--source/blender/editors/space_userpref/SConscript2
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c24
-rw-r--r--source/blender/editors/space_userpref/userpref_intern.h2
-rw-r--r--source/blender/editors/space_userpref/userpref_ops.c2
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt46
-rw-r--r--source/blender/editors/space_view3d/Makefile61
-rw-r--r--source/blender/editors/space_view3d/SConscript6
-rw-r--r--source/blender/editors/space_view3d/drawanimviz.c35
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c246
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c76
-rw-r--r--source/blender/editors/space_view3d/drawobject.c682
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c17
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c212
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c352
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c579
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c569
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c942
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c76
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h44
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c34
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c1108
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c422
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c55
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c1075
-rw-r--r--source/blender/editors/transform/CMakeLists.txt26
-rw-r--r--source/blender/editors/transform/Makefile53
-rw-r--r--source/blender/editors/transform/SConscript4
-rw-r--r--source/blender/editors/transform/transform.c479
-rw-r--r--source/blender/editors/transform/transform.h28
-rw-r--r--source/blender/editors/transform/transform_constraints.c40
-rw-r--r--source/blender/editors/transform/transform_conversions.c671
-rw-r--r--source/blender/editors/transform/transform_generics.c167
-rw-r--r--source/blender/editors/transform/transform_input.c27
-rw-r--r--source/blender/editors/transform/transform_manipulator.c226
-rw-r--r--source/blender/editors/transform/transform_ndofinput.c9
-rw-r--r--source/blender/editors/transform/transform_ops.c132
-rw-r--r--source/blender/editors/transform/transform_orientations.c100
-rw-r--r--source/blender/editors/transform/transform_snap.c124
-rw-r--r--source/blender/editors/util/CMakeLists.txt65
-rw-r--r--source/blender/editors/util/Makefile54
-rw-r--r--source/blender/editors/util/SConscript1
-rw-r--r--source/blender/editors/util/crazyspace.c407
-rw-r--r--source/blender/editors/util/ed_util.c110
-rw-r--r--source/blender/editors/util/editmode_undo.c40
-rw-r--r--source/blender/editors/util/numinput.c3
-rw-r--r--source/blender/editors/util/undo.c144
-rw-r--r--source/blender/editors/util/util_intern.h3
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt23
-rw-r--r--source/blender/editors/uvedit/Makefile55
-rw-r--r--source/blender/editors/uvedit/SConscript4
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c25
-rw-r--r--source/blender/editors/uvedit/uvedit_intern.h16
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c189
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c10
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.h2
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c47
-rw-r--r--source/blender/gpu/CMakeLists.txt37
-rw-r--r--source/blender/gpu/GPU_buffers.h14
-rw-r--r--source/blender/gpu/GPU_draw.h8
-rw-r--r--source/blender/gpu/GPU_extensions.h21
-rw-r--r--source/blender/gpu/GPU_material.h16
-rw-r--r--source/blender/gpu/Makefile37
-rw-r--r--source/blender/gpu/SConscript2
-rw-r--r--source/blender/gpu/intern/Makefile54
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c163
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c73
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h6
-rw-r--r--source/blender/gpu/intern/gpu_draw.c130
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c80
-rw-r--r--source/blender/gpu/intern/gpu_material.c193
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl173
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c2272
-rw-r--r--source/blender/gpu/intern/gpu_shader_vertex.glsl2
-rw-r--r--source/blender/gpu/intern/gpu_shader_vertex.glsl.c15
-rw-r--r--source/blender/ikplugin/BIK_api.h3
-rw-r--r--source/blender/ikplugin/CMakeLists.txt32
-rw-r--r--source/blender/ikplugin/Makefile31
-rw-r--r--source/blender/ikplugin/SConscript6
-rw-r--r--source/blender/ikplugin/intern/Makefile51
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c16
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.h2
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c9
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.h2
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp5
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.h2
-rw-r--r--source/blender/imbuf/CMakeLists.txt147
-rw-r--r--source/blender/imbuf/IMB_imbuf.h87
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h19
-rw-r--r--source/blender/imbuf/IMB_thumbs.h7
-rw-r--r--source/blender/imbuf/Makefile34
-rw-r--r--source/blender/imbuf/SConscript6
-rw-r--r--source/blender/imbuf/intern/IMB_allocimbuf.h4
-rw-r--r--source/blender/imbuf/intern/IMB_anim.h17
-rw-r--r--source/blender/imbuf/intern/IMB_filetype.h55
-rw-r--r--source/blender/imbuf/intern/IMB_filter.h2
-rw-r--r--source/blender/imbuf/intern/IMB_metadata.h2
-rw-r--r--source/blender/imbuf/intern/Makefile100
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c21
-rw-r--r--source/blender/imbuf/intern/anim_movie.c (renamed from source/blender/imbuf/intern/anim.c)55
-rw-r--r--source/blender/imbuf/intern/bmp.c14
-rw-r--r--source/blender/imbuf/intern/cache.c49
-rw-r--r--source/blender/imbuf/intern/cineon/CMakeLists.txt23
-rw-r--r--source/blender/imbuf/intern/cineon/Makefile57
-rw-r--r--source/blender/imbuf/intern/cineon/SConscript3
-rw-r--r--source/blender/imbuf/intern/cineon/cineon_dpx.c51
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c4
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.c9
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.c2
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.h2
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.h2
-rw-r--r--source/blender/imbuf/intern/dds/CMakeLists.txt27
-rw-r--r--source/blender/imbuf/intern/dds/Color.h2
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h2
-rw-r--r--source/blender/imbuf/intern/dds/Common.h2
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.h2
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/Image.h2
-rw-r--r--source/blender/imbuf/intern/dds/Makefile60
-rw-r--r--source/blender/imbuf/intern/dds/PixelFormat.h2
-rw-r--r--source/blender/imbuf/intern/dds/SConscript18
-rw-r--r--source/blender/imbuf/intern/dds/Stream.cpp2
-rw-r--r--source/blender/imbuf/intern/dds/Stream.h2
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.cpp9
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.h6
-rw-r--r--source/blender/imbuf/intern/divers.c159
-rw-r--r--source/blender/imbuf/intern/filetype.c5
-rw-r--r--source/blender/imbuf/intern/filter.c46
-rw-r--r--source/blender/imbuf/intern/imageprocess.c2
-rw-r--r--source/blender/imbuf/intern/imbuf.h2
-rw-r--r--source/blender/imbuf/intern/imbuf_cocoa.m2
-rw-r--r--source/blender/imbuf/intern/iris.c27
-rw-r--r--source/blender/imbuf/intern/jp2.c32
-rw-r--r--source/blender/imbuf/intern/jpeg.c69
-rw-r--r--source/blender/imbuf/intern/metadata.c2
-rw-r--r--source/blender/imbuf/intern/module.c1
-rw-r--r--source/blender/imbuf/intern/openexr/CMakeLists.txt20
-rw-r--r--source/blender/imbuf/intern/openexr/Makefile48
-rw-r--r--source/blender/imbuf/intern/openexr/SConscript16
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp53
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.h9
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_multi.h35
-rw-r--r--source/blender/imbuf/intern/png.c42
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c10
-rw-r--r--source/blender/imbuf/intern/readimage.c10
-rw-r--r--source/blender/imbuf/intern/rectop.c5
-rw-r--r--source/blender/imbuf/intern/rotate.c6
-rw-r--r--source/blender/imbuf/intern/scaling.c47
-rw-r--r--source/blender/imbuf/intern/targa.c25
-rw-r--r--source/blender/imbuf/intern/thumbs.c40
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c8
-rw-r--r--source/blender/imbuf/intern/tiff.c44
-rw-r--r--source/blender/imbuf/intern/util.c23
-rw-r--r--source/blender/imbuf/intern/writeimage.c6
-rw-r--r--source/blender/makesdna/CMakeLists.txt2
-rw-r--r--source/blender/makesdna/DNA_ID.h21
-rw-r--r--source/blender/makesdna/DNA_action_types.h81
-rw-r--r--source/blender/makesdna/DNA_actuator_types.h19
-rw-r--r--source/blender/makesdna/DNA_anim_types.h70
-rw-r--r--source/blender/makesdna/DNA_armature_types.h28
-rw-r--r--source/blender/makesdna/DNA_boid_types.h14
-rw-r--r--source/blender/makesdna/DNA_brush_types.h14
-rw-r--r--source/blender/makesdna/DNA_camera_types.h10
-rw-r--r--source/blender/makesdna/DNA_cloth_types.h6
-rw-r--r--source/blender/makesdna/DNA_color_types.h7
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h63
-rw-r--r--source/blender/makesdna/DNA_controller_types.h8
-rw-r--r--source/blender/makesdna/DNA_curve_types.h27
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h18
-rw-r--r--source/blender/makesdna/DNA_documentation.h26
-rw-r--r--source/blender/makesdna/DNA_effect_types.h8
-rw-r--r--source/blender/makesdna/DNA_fileglobal_types.h11
-rw-r--r--source/blender/makesdna/DNA_genfile.h8
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h6
-rw-r--r--source/blender/makesdna/DNA_group_types.h10
-rw-r--r--source/blender/makesdna/DNA_image_types.h22
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h24
-rw-r--r--source/blender/makesdna/DNA_key_types.h8
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h10
-rw-r--r--source/blender/makesdna/DNA_lattice_types.h14
-rw-r--r--source/blender/makesdna/DNA_listBase.h12
-rw-r--r--source/blender/makesdna/DNA_material_types.h9
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h12
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h9
-rw-r--r--source/blender/makesdna/DNA_meta_types.h10
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h73
-rw-r--r--source/blender/makesdna/DNA_nla_types.h6
-rw-r--r--source/blender/makesdna/DNA_node_types.h58
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim.h6
-rw-r--r--source/blender/makesdna/DNA_object_force.h48
-rw-r--r--source/blender/makesdna/DNA_object_types.h39
-rw-r--r--source/blender/makesdna/DNA_outliner_types.h6
-rw-r--r--source/blender/makesdna/DNA_packedFile_types.h11
-rw-r--r--source/blender/makesdna/DNA_particle_types.h93
-rw-r--r--source/blender/makesdna/DNA_property_types.h13
-rw-r--r--source/blender/makesdna/DNA_scene_types.h79
-rw-r--r--source/blender/makesdna/DNA_screen_types.h33
-rw-r--r--source/blender/makesdna/DNA_sdna_types.h10
-rw-r--r--source/blender/makesdna/DNA_sensor_types.h18
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h13
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h9
-rw-r--r--source/blender/makesdna/DNA_sound_types.h9
-rw-r--r--source/blender/makesdna/DNA_space_types.h190
-rw-r--r--source/blender/makesdna/DNA_text_types.h11
-rw-r--r--source/blender/makesdna/DNA_texture_types.h34
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h67
-rw-r--r--source/blender/makesdna/DNA_vec_types.h18
-rw-r--r--source/blender/makesdna/DNA_vfont_types.h13
-rw-r--r--source/blender/makesdna/DNA_view2d_types.h8
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h55
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h31
-rw-r--r--source/blender/makesdna/DNA_world_types.h10
-rw-r--r--source/blender/makesdna/Makefile39
-rw-r--r--source/blender/makesdna/intern/CMakeLists.txt40
-rw-r--r--source/blender/makesdna/intern/Makefile87
-rw-r--r--source/blender/makesdna/intern/SConscript41
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c44
-rw-r--r--source/blender/makesdna/intern/makesdna.c40
-rw-r--r--source/blender/makesrna/CMakeLists.txt2
-rw-r--r--source/blender/makesrna/Makefile31
-rw-r--r--source/blender/makesrna/RNA_access.h112
-rw-r--r--source/blender/makesrna/RNA_define.h18
-rw-r--r--source/blender/makesrna/RNA_documentation.h5
-rw-r--r--source/blender/makesrna/RNA_enum_types.h30
-rw-r--r--source/blender/makesrna/RNA_types.h84
-rw-r--r--source/blender/makesrna/SConscript44
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt197
-rw-r--r--source/blender/makesrna/intern/Makefile158
-rw-r--r--source/blender/makesrna/intern/SConscript100
-rw-r--r--source/blender/makesrna/intern/makesrna.c268
-rw-r--r--source/blender/makesrna/intern/rna_ID.c110
-rw-r--r--source/blender/makesrna/intern/rna_access.c574
-rw-r--r--source/blender/makesrna/intern/rna_action.c67
-rw-r--r--source/blender/makesrna/intern/rna_action_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c200
-rw-r--r--source/blender/makesrna/intern/rna_actuator_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_animation.c153
-rw-r--r--source/blender/makesrna/intern/rna_animation_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_animviz.c2
-rw-r--r--source/blender/makesrna/intern/rna_armature.c102
-rw-r--r--source/blender/makesrna/intern/rna_armature_api.c31
-rw-r--r--source/blender/makesrna/intern/rna_boid.c37
-rw-r--r--source/blender/makesrna/intern/rna_brush.c20
-rw-r--r--source/blender/makesrna/intern/rna_camera.c9
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c22
-rw-r--r--source/blender/makesrna/intern/rna_color.c10
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c133
-rw-r--r--source/blender/makesrna/intern/rna_context.c2
-rw-r--r--source/blender/makesrna/intern/rna_controller.c3
-rw-r--r--source/blender/makesrna/intern/rna_controller_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_curve.c215
-rw-r--r--source/blender/makesrna/intern/rna_define.c186
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c119
-rw-r--r--source/blender/makesrna/intern/rna_fcurve_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c41
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c3
-rw-r--r--source/blender/makesrna/intern/rna_group.c2
-rw-r--r--source/blender/makesrna/intern/rna_image.c44
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c32
-rw-r--r--source/blender/makesrna/intern/rna_internal.h51
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h20
-rw-r--r--source/blender/makesrna/intern/rna_key.c160
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c26
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c34
-rw-r--r--source/blender/makesrna/intern/rna_main.c20
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c398
-rw-r--r--source/blender/makesrna/intern/rna_material.c93
-rw-r--r--source/blender/makesrna/intern/rna_material_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c16
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c11
-rw-r--r--source/blender/makesrna/intern/rna_meta.c42
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c123
-rw-r--r--source/blender/makesrna/intern/rna_nla.c129
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c813
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h8
-rw-r--r--source/blender/makesrna/intern/rna_object.c267
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c126
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c85
-rw-r--r--source/blender/makesrna/intern/rna_packedfile.c2
-rw-r--r--source/blender/makesrna/intern/rna_particle.c555
-rw-r--r--source/blender/makesrna/intern/rna_pose.c73
-rw-r--r--source/blender/makesrna/intern/rna_pose_api.c22
-rw-r--r--source/blender/makesrna/intern/rna_property.c6
-rw-r--r--source/blender/makesrna/intern/rna_render.c26
-rw-r--r--source/blender/makesrna/intern/rna_rna.c99
-rw-r--r--source/blender/makesrna/intern/rna_scene.c162
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c19
-rw-r--r--source/blender/makesrna/intern/rna_screen.c69
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c42
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c57
-rw-r--r--source/blender/makesrna/intern/rna_sensor_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c79
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c36
-rw-r--r--source/blender/makesrna/intern/rna_sound.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c384
-rw-r--r--source/blender/makesrna/intern/rna_test.c2
-rw-r--r--source/blender/makesrna/intern/rna_text.c5
-rw-r--r--source/blender/makesrna/intern/rna_text_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_texture.c75
-rw-r--r--source/blender/makesrna/intern/rna_timeline.c2
-rw-r--r--source/blender/makesrna/intern/rna_ui.c68
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c38
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c422
-rw-r--r--source/blender/makesrna/intern/rna_vfont.c2
-rw-r--r--source/blender/makesrna/intern/rna_wm.c250
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c79
-rw-r--r--source/blender/makesrna/intern/rna_world.c48
-rw-r--r--source/blender/makesrna/rna_cleanup/rna_properties.txt4
-rwxr-xr-xsource/blender/makesrna/rna_cleanup/rna_update.sh16
-rw-r--r--source/blender/modifiers/CMakeLists.txt76
-rw-r--r--source/blender/modifiers/MOD_modifiertypes.h8
-rw-r--r--source/blender/modifiers/Makefile34
-rw-r--r--source/blender/modifiers/SConscript14
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c47
-rw-r--r--source/blender/modifiers/intern/MOD_array.c6
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c28
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c44
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.c14
-rw-r--r--source/blender/modifiers/intern/MOD_boolean_util.h7
-rw-r--r--source/blender/modifiers/intern/MOD_build.c189
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c37
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c29
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c30
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c33
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c30
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c51
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c3
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c940
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim.c31
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c146
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.h9
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c207
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c31
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c29
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c43
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c8
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c16
-rw-r--r--source/blender/modifiers/intern/MOD_none.c15
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c31
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c53
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c57
-rw-r--r--source/blender/modifiers/intern/MOD_shapekey.c86
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c40
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c41
-rw-r--r--source/blender/modifiers/intern/MOD_smoke.c54
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c21
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c21
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c69
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c23
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c24
-rw-r--r--source/blender/modifiers/intern/MOD_util.c27
-rw-r--r--source/blender/modifiers/intern/MOD_util.h16
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c32
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c42
-rw-r--r--source/blender/modifiers/intern/Makefile55
-rw-r--r--source/blender/nodes/CMP_node.h140
-rw-r--r--source/blender/nodes/CMakeLists.txt145
-rw-r--r--source/blender/nodes/Makefile34
-rw-r--r--source/blender/nodes/SConscript17
-rw-r--r--source/blender/nodes/SHD_node.h52
-rw-r--r--source/blender/nodes/TEX_node.h72
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c39
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_blur.c238
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_brightness.c46
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c36
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c36
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_composite.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c36
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_curves.c99
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c40
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_dilate.c31
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_displace.c47
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_filter.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_flip.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_gamma.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_glare.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_idMask.c30
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c129
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_invert.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_levels.c48
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_math.c49
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normal.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normalize.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c39
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rgb.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rotate.c37
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c67
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c66
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c205
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c66
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c33
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c36
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c46
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_translate.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c66
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_value.c32
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c34
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_viewer.c35
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c115
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile47
-rw-r--r--source/blender/nodes/intern/CMP_util.c64
-rw-r--r--source/blender/nodes/intern/CMP_util.h20
-rw-r--r--source/blender/nodes/intern/Makefile51
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile50
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_camera.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_curves.c70
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c73
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_geom.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c39
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_invert.c36
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mapping.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_material.c74
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_math.c39
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c39
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_normal.c33
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_output.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_rgb.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c72
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c37
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_texture.c34
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c70
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_value.c35
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c38
-rw-r--r--source/blender/nodes/intern/SHD_util.c2
-rw-r--r--source/blender/nodes/intern/SHD_util.h6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/Makefile49
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_at.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_bricks.c29
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_checker.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_compose.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_coord.c33
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_curves.c62
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_decompose.c36
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_distance.c34
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_image.c42
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_invert.c31
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_math.c47
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c30
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_output.c38
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_proc.c40
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_rotate.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_scale.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_texture.c29
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_translate.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c32
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c60
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_viewer.c30
-rw-r--r--source/blender/nodes/intern/TEX_util.c16
-rw-r--r--source/blender/nodes/intern/TEX_util.h6
-rw-r--r--source/blender/nodes/intern/node_util.c32
-rw-r--r--source/blender/nodes/intern/node_util.h7
-rw-r--r--source/blender/python/BPY_extern.h102
-rw-r--r--source/blender/python/CMakeLists.txt33
-rw-r--r--source/blender/python/SConscript4
-rw-r--r--source/blender/python/doc/epy/BGL.py1807
-rw-r--r--source/blender/python/doc/epy/Geometry.py189
-rw-r--r--source/blender/python/doc/epy/IDProp.py132
-rw-r--r--source/blender/python/doc/epy/Mathutils.py156
-rw-r--r--source/blender/python/doc/epy/testbgl.py45
-rw-r--r--source/blender/python/doc/examples/bpy.data.py29
-rw-r--r--source/blender/python/doc/examples/mathutils.Euler.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Matrix.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Quaternion.py3
-rw-r--r--source/blender/python/doc/examples/mathutils.Vector.py55
-rw-r--r--source/blender/python/doc/examples/mathutils.py18
-rw-r--r--source/blender/python/doc/sphinx_doc_gen.py862
-rwxr-xr-xsource/blender/python/doc/sphinx_doc_gen.sh29
-rw-r--r--source/blender/python/generic/CMakeLists.txt41
-rw-r--r--source/blender/python/generic/IDProp.c144
-rw-r--r--source/blender/python/generic/IDProp.h9
-rw-r--r--source/blender/python/generic/Makefile66
-rw-r--r--source/blender/python/generic/bgl.c99
-rw-r--r--source/blender/python/generic/bgl.h16
-rw-r--r--source/blender/python/generic/blf_py_api.c (renamed from source/blender/python/generic/blf_api.c)58
-rw-r--r--source/blender/python/generic/blf_py_api.h (renamed from source/blender/python/generic/blf_api.h)5
-rw-r--r--source/blender/python/generic/bpy_internal_import.c80
-rw-r--r--source/blender/python/generic/bpy_internal_import.h25
-rw-r--r--source/blender/python/generic/geometry.c841
-rw-r--r--source/blender/python/generic/mathutils.c184
-rw-r--r--source/blender/python/generic/mathutils.h29
-rw-r--r--source/blender/python/generic/mathutils_Color.c (renamed from source/blender/python/generic/mathutils_color.c)255
-rw-r--r--source/blender/python/generic/mathutils_Color.h (renamed from source/blender/python/generic/mathutils_color.h)8
-rw-r--r--source/blender/python/generic/mathutils_Euler.c (renamed from source/blender/python/generic/mathutils_euler.c)491
-rw-r--r--source/blender/python/generic/mathutils_Euler.h (renamed from source/blender/python/generic/mathutils_euler.h)8
-rw-r--r--source/blender/python/generic/mathutils_Matrix.c1895
-rw-r--r--source/blender/python/generic/mathutils_Matrix.h (renamed from source/blender/python/generic/mathutils_matrix.h)19
-rw-r--r--source/blender/python/generic/mathutils_Quaternion.c (renamed from source/blender/python/generic/mathutils_quat.c)793
-rw-r--r--source/blender/python/generic/mathutils_Quaternion.h (renamed from source/blender/python/generic/mathutils_quat.h)8
-rw-r--r--source/blender/python/generic/mathutils_Vector.c2274
-rw-r--r--source/blender/python/generic/mathutils_Vector.h (renamed from source/blender/python/generic/mathutils_vector.h)10
-rw-r--r--source/blender/python/generic/mathutils_geometry.c882
-rw-r--r--source/blender/python/generic/mathutils_geometry.h (renamed from source/blender/python/generic/geometry.h)9
-rw-r--r--source/blender/python/generic/mathutils_matrix.c1944
-rw-r--r--source/blender/python/generic/mathutils_vector.c2206
-rw-r--r--[-rwxr-xr-x]source/blender/python/generic/noise_py_api.c (renamed from source/blender/python/generic/noise.c)137
-rw-r--r--source/blender/python/generic/noise_py_api.h29
-rw-r--r--source/blender/python/generic/py_capi_utils.c258
-rw-r--r--source/blender/python/generic/py_capi_utils.h16
-rw-r--r--source/blender/python/intern/CMakeLists.txt77
-rw-r--r--source/blender/python/intern/bpy.c121
-rw-r--r--source/blender/python/intern/bpy.h4
-rw-r--r--source/blender/python/intern/bpy_app.c139
-rw-r--r--source/blender/python/intern/bpy_app.h10
-rw-r--r--source/blender/python/intern/bpy_driver.c60
-rw-r--r--source/blender/python/intern/bpy_driver.h (renamed from source/gameengine/GamePlayer/common/unix/GPU_System.h)32
-rw-r--r--source/blender/python/intern/bpy_interface.c484
-rw-r--r--source/blender/python/intern/bpy_operator.c135
-rw-r--r--source/blender/python/intern/bpy_operator.h12
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c6
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.h12
-rw-r--r--source/blender/python/intern/bpy_props.c750
-rw-r--r--source/blender/python/intern/bpy_props.h30
-rw-r--r--source/blender/python/intern/bpy_rna.c1963
-rw-r--r--source/blender/python/intern/bpy_rna.h33
-rw-r--r--source/blender/python/intern/bpy_rna_array.c628
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c11
-rw-r--r--source/blender/python/intern/bpy_rna_callback.h6
-rw-r--r--source/blender/python/intern/bpy_traceback.c151
-rw-r--r--source/blender/python/intern/bpy_traceback.h28
-rw-r--r--source/blender/python/intern/bpy_util.c116
-rw-r--r--source/blender/python/intern/bpy_util.h26
-rw-r--r--source/blender/python/intern/stubs.c17
-rw-r--r--source/blender/python/rna_dump.py161
-rw-r--r--source/blender/quicktime/CMakeLists.txt32
-rw-r--r--source/blender/quicktime/Makefile37
-rw-r--r--source/blender/quicktime/SConscript30
-rw-r--r--source/blender/quicktime/apple/Makefile63
-rw-r--r--source/blender/quicktime/apple/qtkit_export.m20
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m20
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c16
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c37
-rw-r--r--source/blender/quicktime/quicktime_export.h4
-rw-r--r--source/blender/quicktime/quicktime_import.h4
-rw-r--r--source/blender/readblenfile/BLO_readblenfile.h8
-rw-r--r--source/blender/readblenfile/CMakeLists.txt18
-rw-r--r--source/blender/readblenfile/Makefile34
-rw-r--r--source/blender/readblenfile/SConscript2
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c5
-rw-r--r--source/blender/readblenfile/intern/Makefile47
-rw-r--r--source/blender/readblenfile/stub/BLO_readblenfileSTUB.c12
-rw-r--r--source/blender/readblenfile/stub/Makefile44
-rw-r--r--source/blender/readblenfile/test/Makefile46
-rw-r--r--source/blender/readblenfile/test/test.c2
-rw-r--r--source/blender/render/CMakeLists.txt123
-rw-r--r--source/blender/render/Makefile34
-rw-r--r--source/blender/render/SConscript4
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h29
-rw-r--r--source/blender/render/extern/include/RE_raytrace.h214
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h8
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h15
-rw-r--r--source/blender/render/intern/Makefile34
-rw-r--r--source/blender/render/intern/include/raycounter.h32
-rw-r--r--source/blender/render/intern/include/rayintersection.h124
-rw-r--r--source/blender/render/intern/include/rayobject.h197
-rw-r--r--source/blender/render/intern/include/render_types.h12
-rw-r--r--source/blender/render/intern/include/rendercore.h3
-rw-r--r--source/blender/render/intern/include/renderdatabase.h4
-rw-r--r--source/blender/render/intern/include/renderpipeline.h2
-rw-r--r--source/blender/render/intern/include/shading.h3
-rw-r--r--source/blender/render/intern/include/sss.h2
-rw-r--r--source/blender/render/intern/include/strand.h2
-rw-r--r--source/blender/render/intern/include/sunsky.h2
-rw-r--r--source/blender/render/intern/include/texture.h1
-rw-r--r--source/blender/render/intern/include/volume_precache.h2
-rw-r--r--source/blender/render/intern/include/volumetric.h6
-rw-r--r--source/blender/render/intern/include/voxeldata.h2
-rw-r--r--source/blender/render/intern/raytrace/Makefile69
-rw-r--r--source/blender/render/intern/raytrace/bvh.h64
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp646
-rw-r--r--source/blender/render/intern/raytrace/rayobject_blibvh.cpp168
-rw-r--r--source/blender/render/intern/raytrace/rayobject_empty.cpp75
-rw-r--r--source/blender/render/intern/raytrace/rayobject_hint.h4
-rw-r--r--source/blender/render/intern/raytrace/rayobject_instance.cpp208
-rw-r--r--source/blender/render/intern/raytrace/rayobject_internal.h128
-rw-r--r--source/blender/render/intern/raytrace/rayobject_octree.cpp1080
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp40
-rw-r--r--source/blender/render/intern/raytrace/rayobject_raycounter.cpp88
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp34
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.h2
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp26
-rw-r--r--source/blender/render/intern/raytrace/rayobject_vbvh.cpp28
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h10
-rw-r--r--source/blender/render/intern/raytrace/svbvh.h143
-rw-r--r--source/blender/render/intern/raytrace/vbvh.h14
-rw-r--r--source/blender/render/intern/source/Makefile65
-rw-r--r--source/blender/render/intern/source/convertblender.c430
-rw-r--r--source/blender/render/intern/source/envmap.c7
-rw-r--r--source/blender/render/intern/source/gammaCorrectionTables.c2
-rw-r--r--source/blender/render/intern/source/imagetexture.c118
-rw-r--r--source/blender/render/intern/source/initrender.c7
-rw-r--r--source/blender/render/intern/source/occlusion.c27
-rw-r--r--source/blender/render/intern/source/pipeline.c372
-rw-r--r--source/blender/render/intern/source/pixelshading.c8
-rw-r--r--source/blender/render/intern/source/pointdensity.c18
-rw-r--r--source/blender/render/intern/source/rayshade.c322
-rw-r--r--source/blender/render/intern/source/render_texture.c (renamed from source/blender/render/intern/source/texture.c)728
-rw-r--r--source/blender/render/intern/source/rendercore.c81
-rw-r--r--source/blender/render/intern/source/renderdatabase.c52
-rw-r--r--source/blender/render/intern/source/shadbuf.c19
-rw-r--r--source/blender/render/intern/source/shadeinput.c140
-rw-r--r--source/blender/render/intern/source/shadeoutput.c72
-rw-r--r--source/blender/render/intern/source/sss.c18
-rw-r--r--source/blender/render/intern/source/strand.c55
-rw-r--r--source/blender/render/intern/source/volume_precache.c37
-rw-r--r--source/blender/render/intern/source/volumetric.c83
-rw-r--r--source/blender/render/intern/source/voxeldata.c49
-rw-r--r--source/blender/render/intern/source/zbuf.c34
-rw-r--r--source/blender/verify/BLO_sign_verify_Header.h80
-rw-r--r--source/blender/verify/BLO_verify.h76
-rw-r--r--source/blender/verify/Makefile34
-rw-r--r--source/blender/verify/intern/BLO_verify.c420
-rw-r--r--source/blender/verify/intern/Makefile50
-rw-r--r--source/blender/windowmanager/CMakeLists.txt117
-rw-r--r--source/blender/windowmanager/Makefile34
-rw-r--r--source/blender/windowmanager/SConscript16
-rw-r--r--source/blender/windowmanager/WM_api.h87
-rw-r--r--source/blender/windowmanager/WM_types.h116
-rw-r--r--source/blender/windowmanager/intern/Makefile98
-rw-r--r--source/blender/windowmanager/intern/wm.c32
-rw-r--r--source/blender/windowmanager/intern/wm_apple.c7
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c40
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c21
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c38
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c326
-rw-r--r--source/blender/windowmanager/intern/wm_files.c235
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c49
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c73
-rw-r--r--source/blender/windowmanager/intern/wm_jobs.c62
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c94
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c522
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c11
-rw-r--r--source/blender/windowmanager/intern/wm_window.c236
-rw-r--r--source/blender/windowmanager/wm.h9
-rw-r--r--source/blender/windowmanager/wm_cursors.h9
-rw-r--r--source/blender/windowmanager/wm_draw.h7
-rw-r--r--source/blender/windowmanager/wm_event_system.h8
-rw-r--r--source/blender/windowmanager/wm_event_types.h80
-rw-r--r--source/blender/windowmanager/wm_files.h11
-rw-r--r--source/blender/windowmanager/wm_subwindow.h7
-rw-r--r--source/blender/windowmanager/wm_window.h16
-rw-r--r--source/blenderplayer/CMakeLists.txt163
-rw-r--r--source/blenderplayer/bad_level_call_stubs/CMakeLists.txt39
-rw-r--r--source/blenderplayer/bad_level_call_stubs/Makefile45
-rw-r--r--source/blenderplayer/bad_level_call_stubs/SConscript3
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c100
-rw-r--r--source/creator/CMakeLists.txt766
-rw-r--r--source/creator/Makefile84
-rw-r--r--source/creator/SConscript31
-rw-r--r--source/creator/buildinfo.c30
-rw-r--r--source/creator/creator.c349
-rw-r--r--source/darwin/Makefile61
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp87
-rw-r--r--source/gameengine/BlenderRoutines/CMakeLists.txt42
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp15
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.h7
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp118
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h10
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp7
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h9
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp9
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h7
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp9
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h7
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp18
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h18
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp14
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderSystem.h13
-rw-r--r--source/gameengine/BlenderRoutines/Makefile78
-rw-r--r--source/gameengine/BlenderRoutines/SConscript10
-rw-r--r--source/gameengine/CMakeLists.txt50
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp44
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.h11
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.cpp11
-rw-r--r--source/gameengine/Converter/BL_ArmatureActuator.h11
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp17
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.h13
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.cpp15
-rw-r--r--source/gameengine/Converter/BL_ArmatureConstraint.h11
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.cpp16
-rw-r--r--source/gameengine/Converter/BL_ArmatureObject.h10
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp56
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.h7
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.cpp7
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.h24
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.cpp9
-rw-r--r--source/gameengine/Converter/BL_MeshDeformer.h8
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.cpp45
-rw-r--r--source/gameengine/Converter/BL_ModifierDeformer.h11
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.cpp35
-rw-r--r--source/gameengine/Converter/BL_ShapeActionActuator.h11
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.cpp13
-rw-r--r--source/gameengine/Converter/BL_ShapeDeformer.h8
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp12
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.h8
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.cpp66
-rw-r--r--source/gameengine/Converter/BlenderWorldInfo.h27
-rw-r--r--source/gameengine/Converter/CMakeLists.txt62
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp7
-rw-r--r--source/gameengine/Converter/KX_BlenderScalarInterpolator.h7
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp64
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h9
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp18
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.h7
-rw-r--r--source/gameengine/Converter/KX_ConvertControllers.cpp17
-rw-r--r--source/gameengine/Converter/KX_ConvertControllers.h7
-rw-r--r--source/gameengine/Converter/KX_ConvertProperties.cpp11
-rw-r--r--source/gameengine/Converter/KX_ConvertProperties.h7
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp11
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.h7
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.cpp8
-rw-r--r--source/gameengine/Converter/KX_IpoConvert.h7
-rw-r--r--source/gameengine/Converter/KX_SoftBodyDeformer.cpp9
-rw-r--r--source/gameengine/Converter/KX_SoftBodyDeformer.h8
-rw-r--r--source/gameengine/Converter/Makefile67
-rw-r--r--source/gameengine/Converter/SConscript13
-rw-r--r--source/gameengine/Expressions/BoolValue.cpp7
-rw-r--r--source/gameengine/Expressions/BoolValue.h7
-rw-r--r--source/gameengine/Expressions/CMakeLists.txt54
-rw-r--r--source/gameengine/Expressions/ConstExpr.cpp3
-rw-r--r--source/gameengine/Expressions/ConstExpr.h4
-rw-r--r--source/gameengine/Expressions/EXP_C-Api.cpp7
-rw-r--r--source/gameengine/Expressions/EXP_C-Api.h7
-rw-r--r--source/gameengine/Expressions/EmptyValue.cpp3
-rw-r--r--source/gameengine/Expressions/EmptyValue.h5
-rw-r--r--source/gameengine/Expressions/ErrorValue.cpp3
-rw-r--r--source/gameengine/Expressions/ErrorValue.h4
-rw-r--r--source/gameengine/Expressions/Expression.cpp3
-rw-r--r--source/gameengine/Expressions/Expression.h4
-rw-r--r--source/gameengine/Expressions/FloatValue.cpp7
-rw-r--r--source/gameengine/Expressions/FloatValue.h7
-rw-r--r--source/gameengine/Expressions/IdentifierExpr.cpp7
-rw-r--r--source/gameengine/Expressions/IdentifierExpr.h7
-rw-r--r--source/gameengine/Expressions/IfExpr.cpp3
-rw-r--r--source/gameengine/Expressions/IfExpr.h5
-rw-r--r--source/gameengine/Expressions/InputParser.cpp27
-rw-r--r--source/gameengine/Expressions/InputParser.h6
-rw-r--r--source/gameengine/Expressions/IntValue.cpp7
-rw-r--r--source/gameengine/Expressions/IntValue.h7
-rw-r--r--source/gameengine/Expressions/KX_HashedPtr.cpp7
-rw-r--r--source/gameengine/Expressions/KX_HashedPtr.h7
-rw-r--r--source/gameengine/Expressions/KX_Python.h19
-rw-r--r--source/gameengine/Expressions/ListValue.cpp7
-rw-r--r--source/gameengine/Expressions/ListValue.h6
-rw-r--r--source/gameengine/Expressions/Makefile46
-rw-r--r--source/gameengine/Expressions/Operator1Expr.cpp3
-rw-r--r--source/gameengine/Expressions/Operator1Expr.h4
-rw-r--r--source/gameengine/Expressions/Operator2Expr.cpp3
-rw-r--r--source/gameengine/Expressions/Operator2Expr.h4
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp60
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h50
-rw-r--r--source/gameengine/Expressions/SConscript10
-rw-r--r--source/gameengine/Expressions/StringValue.cpp3
-rw-r--r--source/gameengine/Expressions/StringValue.h8
-rw-r--r--source/gameengine/Expressions/Value.cpp11
-rw-r--r--source/gameengine/Expressions/Value.h67
-rw-r--r--source/gameengine/Expressions/VectorValue.cpp5
-rw-r--r--source/gameengine/Expressions/VectorValue.h5
-rw-r--r--source/gameengine/Expressions/VoidValue.h7
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt109
-rw-r--r--source/gameengine/GameLogic/Joystick/Makefile44
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp7
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_Joystick.h38
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h7
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp7
-rw-r--r--source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h6
-rw-r--r--source/gameengine/GameLogic/Makefile50
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.h6
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_ANDController.h6
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_ActuatorSensor.h10
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_AlwaysSensor.h6
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_BasicEventManager.h6
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.cpp15
-rw-r--r--source/gameengine/GameLogic/SCA_DelaySensor.h6
-rw-r--r--source/gameengine/GameLogic/SCA_EventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_EventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_ExpressionController.h6
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_IActuator.h9
-rw-r--r--source/gameengine/GameLogic/SCA_IController.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_IController.h13
-rw-r--r--source/gameengine/GameLogic/SCA_IInputDevice.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_IInputDevice.h13
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_ILogicBrick.h11
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_IObject.h13
-rw-r--r--source/gameengine/GameLogic/SCA_IScene.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_IScene.h7
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_ISensor.h14
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickManager.h6
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp9
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.h10
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardManager.h10
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.cpp23
-rw-r--r--source/gameengine/GameLogic/SCA_KeyboardSensor.h10
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.cpp9
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h10
-rw-r--r--source/gameengine/GameLogic/SCA_MouseManager.cpp9
-rw-r--r--source/gameengine/GameLogic/SCA_MouseManager.h10
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_MouseSensor.h11
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.cpp9
-rw-r--r--source/gameengine/GameLogic/SCA_NANDController.h8
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_NORController.h8
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_ORController.h8
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyActuator.h8
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyEventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_PropertyEventManager.h7
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_PropertySensor.h11
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp39
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.h17
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_PythonKeyboard.h10
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_PythonMouse.h10
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_RandomActuator.h14
-rw-r--r--source/gameengine/GameLogic/SCA_RandomEventManager.cpp7
-rw-r--r--source/gameengine/GameLogic/SCA_RandomEventManager.h9
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp3
-rw-r--r--source/gameengine/GameLogic/SCA_RandomNumberGenerator.h13
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.cpp13
-rw-r--r--source/gameengine/GameLogic/SCA_RandomSensor.h11
-rw-r--r--source/gameengine/GameLogic/SCA_TimeEventManager.cpp14
-rw-r--r--source/gameengine/GameLogic/SCA_TimeEventManager.h8
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_XNORController.h8
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.cpp11
-rw-r--r--source/gameengine/GameLogic/SCA_XORController.h8
-rw-r--r--source/gameengine/GameLogic/SConscript11
-rw-r--r--source/gameengine/GamePlayer/CMakeLists.txt10
-rw-r--r--source/gameengine/GamePlayer/Makefile57
-rw-r--r--source/gameengine/GamePlayer/common/CMakeLists.txt51
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Canvas.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Canvas.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Engine.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_Engine.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_MouseDevice.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawImage.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawImage.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RawLogoArrays.h6
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.cpp49
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.h13
-rw-r--r--source/gameengine/GamePlayer/common/GPC_System.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/GPC_System.h6
-rw-r--r--source/gameengine/GamePlayer/common/Makefile84
-rw-r--r--source/gameengine/GamePlayer/common/SConscript22
-rw-r--r--source/gameengine/GamePlayer/common/bmfont.cpp7
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp299
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_Engine.h61
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp133
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h61
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h53
-rw-r--r--source/gameengine/GamePlayer/common/unix/GPU_System.cpp51
-rw-r--r--source/gameengine/GamePlayer/common/unix/Makefile70
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp171
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Canvas.h115
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp112
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp283
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h66
-rw-r--r--source/gameengine/GamePlayer/common/windows/GPW_System.cpp88
-rw-r--r--source/gameengine/GamePlayer/common/windows/Makefile62
-rw-r--r--source/gameengine/GamePlayer/ghost/CMakeLists.txt38
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.cpp29
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Application.h8
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp7
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_Canvas.h6
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp7
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.h8
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_System.cpp7
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_System.h8
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp120
-rw-r--r--source/gameengine/GamePlayer/ghost/Makefile86
-rw-r--r--source/gameengine/GamePlayer/ghost/SConscript8
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.cpp3
-rw-r--r--source/gameengine/Ketsji/BL_BlenderShader.h32
-rw-r--r--source/gameengine/Ketsji/BL_Material.cpp3
-rw-r--r--source/gameengine/Ketsji/BL_Material.h5
-rw-r--r--source/gameengine/Ketsji/BL_Shader.cpp7
-rw-r--r--source/gameengine/Ketsji/BL_Shader.h7
-rw-r--r--source/gameengine/Ketsji/BL_Texture.cpp5
-rw-r--r--source/gameengine/Ketsji/BL_Texture.h5
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt188
-rw-r--r--source/gameengine/Ketsji/KXNetwork/CMakeLists.txt24
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp7
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h9
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp13
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h9
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp13
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h12
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp7
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h7
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp7
-rw-r--r--source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h7
-rw-r--r--source/gameengine/Ketsji/KXNetwork/Makefile48
-rw-r--r--source/gameengine/Ketsji/KXNetwork/SConscript5
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_ArmatureSensor.h13
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h11
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp5
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h10
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp8
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h10
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_CameraActuator.h10
-rw-r--r--source/gameengine/Ketsji/KX_CameraIpoSGController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_CameraIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_ClientObjectInfo.h7
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintActuator.h8
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_ConstraintWrapper.h9
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObject.h20
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp16
-rw-r--r--source/gameengine/Ketsji/KX_Dome.cpp191
-rw-r--r--source/gameengine/Ketsji/KX_Dome.h4
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_EmptyObject.h7
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.cpp162
-rw-r--r--source/gameengine/Ketsji/KX_FontObject.h85
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.cpp21
-rw-r--r--source/gameengine/Ketsji/KX_GameActuator.h9
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp61
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h16
-rw-r--r--source/gameengine/Ketsji/KX_IInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_IPOTransform.h9
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_IPO_SGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_IPhysicsController.h7
-rw-r--r--source/gameengine/Ketsji/KX_IScalarInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_ISceneConverter.h7
-rw-r--r--source/gameengine/Ketsji/KX_ISystem.h9
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp68
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.h18
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp46
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h10
-rw-r--r--source/gameengine/Ketsji/KX_Light.cpp15
-rw-r--r--source/gameengine/Ketsji/KX_Light.h9
-rw-r--r--source/gameengine/Ketsji/KX_LightIpoSGController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_LightIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_MaterialIpoController.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_MaterialIpoController.h5
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_MeshProxy.h11
-rw-r--r--source/gameengine/Ketsji/KX_MotionState.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_MotionState.h7
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_MouseFocusSensor.h12
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_NearSensor.h13
-rw-r--r--source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_ObColorIpoSGController.h7
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.h13
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_OrientationInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_ParentActuator.h14
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsEngineEnums.h7
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h11
-rw-r--r--source/gameengine/Ketsji/KX_PhysicsPropertiesobsolete.h8
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_PolyProxy.h11
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp55
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.h14
-rw-r--r--source/gameengine/Ketsji/KX_PositionInterpolator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_PositionInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.h11
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h24
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp96
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h9
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_PythonInitTypes.h8
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.h12
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.cpp24
-rw-r--r--source/gameengine/Ketsji/KX_RadarSensor.h7
-rw-r--r--source/gameengine/Ketsji/KX_RayCast.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_RayCast.h6
-rw-r--r--source/gameengine/Ketsji/KX_RayEventManager.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_RayEventManager.h9
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.cpp24
-rw-r--r--source/gameengine/Ketsji/KX_RaySensor.h13
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h19
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_SCA_DynamicActuator.h8
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h13
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h18
-rw-r--r--source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h21
-rw-r--r--source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_SG_NodeRelationships.h30
-rw-r--r--source/gameengine/Ketsji/KX_ScalarInterpolator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_ScalarInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_ScalingInterpolator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_ScalingInterpolator.h7
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp98
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h39
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_SceneActuator.h12
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.h12
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_StateActuator.h6
-rw-r--r--source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_TimeCategoryLogger.h8
-rw-r--r--source/gameengine/Ketsji/KX_TimeLogger.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_TimeLogger.h8
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.cpp14
-rw-r--r--source/gameengine/Ketsji/KX_TouchEventManager.h7
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_TouchSensor.h11
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_TrackToActuator.h11
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.h9
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_VertexProxy.h11
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.cpp9
-rw-r--r--source/gameengine/Ketsji/KX_VisibilityActuator.h6
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_WorldInfo.h8
-rw-r--r--source/gameengine/Ketsji/KX_WorldIpoController.cpp7
-rw-r--r--source/gameengine/Ketsji/KX_WorldIpoController.h9
-rw-r--r--source/gameengine/Ketsji/Makefile78
-rw-r--r--source/gameengine/Ketsji/SConscript18
-rw-r--r--source/gameengine/Makefile44
-rw-r--r--source/gameengine/Network/CMakeLists.txt17
-rw-r--r--source/gameengine/Network/LoopBackNetwork/CMakeLists.txt12
-rw-r--r--source/gameengine/Network/LoopBackNetwork/Makefile41
-rw-r--r--source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp5
-rw-r--r--source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h6
-rw-r--r--source/gameengine/Network/LoopBackNetwork/SConscript2
-rw-r--r--source/gameengine/Network/Makefile48
-rw-r--r--source/gameengine/Network/NG_NetworkDeviceInterface.h8
-rw-r--r--source/gameengine/Network/NG_NetworkMessage.cpp5
-rw-r--r--source/gameengine/Network/NG_NetworkMessage.h6
-rw-r--r--source/gameengine/Network/NG_NetworkObject.cpp5
-rw-r--r--source/gameengine/Network/NG_NetworkObject.h6
-rw-r--r--source/gameengine/Network/NG_NetworkScene.cpp7
-rw-r--r--source/gameengine/Network/NG_NetworkScene.h6
-rw-r--r--source/gameengine/Network/SConscript8
-rw-r--r--source/gameengine/Network/TerraplayNetwork/Makefile42
-rw-r--r--source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp189
-rw-r--r--source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h64
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt23
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.cpp3
-rw-r--r--source/gameengine/Physics/Bullet/CcdGraphicController.h4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp21
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp8
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h14
-rw-r--r--source/gameengine/Physics/Bullet/Makefile55
-rw-r--r--source/gameengine/Physics/Bullet/SConscript13
-rw-r--r--source/gameengine/Physics/Dummy/CMakeLists.txt12
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp10
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h7
-rw-r--r--source/gameengine/Physics/Dummy/Makefile45
-rw-r--r--source/gameengine/Physics/Dummy/SConscript8
-rw-r--r--source/gameengine/Physics/Makefile37
-rw-r--r--source/gameengine/Physics/common/CMakeLists.txt25
-rw-r--r--source/gameengine/Physics/common/Makefile57
-rw-r--r--source/gameengine/Physics/common/PHY_DynamicTypes.h3
-rw-r--r--source/gameengine/Physics/common/PHY_IController.cpp7
-rw-r--r--source/gameengine/Physics/common/PHY_IController.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.cpp7
-rw-r--r--source/gameengine/Physics/common/PHY_IGraphicController.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IMotionState.cpp7
-rw-r--r--source/gameengine/Physics/common/PHY_IMotionState.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.cpp7
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsController.h7
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp7
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h6
-rw-r--r--source/gameengine/Physics/common/PHY_IVehicle.cpp3
-rw-r--r--source/gameengine/Physics/common/PHY_IVehicle.h5
-rw-r--r--source/gameengine/Physics/common/PHY_Pro.h7
-rw-r--r--source/gameengine/Physics/common/SConscript8
-rw-r--r--source/gameengine/PyDoc/bge.events.rst229
-rw-r--r--source/gameengine/PyDoc/bge.logic.rst932
-rw-r--r--source/gameengine/PyDoc/bge.render.rst242
-rw-r--r--source/gameengine/PyDoc/bge.types.rst5202
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt51
-rw-r--r--source/gameengine/Rasterizer/Makefile57
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.cpp23
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.cpp9
-rw-r--r--source/gameengine/Rasterizer/RAS_BucketManager.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_CameraData.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_Deformer.h12
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_ICanvas.h15
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp12
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.h16
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h9
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h29
-rw-r--r--source/gameengine/Rasterizer/RAS_LightObject.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.cpp12
-rw-r--r--source/gameengine/Rasterizer/RAS_MaterialBucket.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_MeshObject.h9
-rw-r--r--source/gameengine/Rasterizer/RAS_ObjectColor.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt20
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile53
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h8
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp5
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h5
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp54
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h9
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript9
-rw-r--r--source/gameengine/Rasterizer/RAS_Polygon.cpp9
-rw-r--r--source/gameengine/Rasterizer/RAS_Polygon.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_Rect.h11
-rw-r--r--source/gameengine/Rasterizer/RAS_TexMatrix.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_TexVert.cpp7
-rw-r--r--source/gameengine/Rasterizer/RAS_TexVert.h7
-rw-r--r--source/gameengine/Rasterizer/RAS_texmatrix.cpp7
-rw-r--r--source/gameengine/Rasterizer/SConscript10
-rw-r--r--source/gameengine/SConscript4
-rw-r--r--source/gameengine/SceneGraph/CMakeLists.txt25
-rw-r--r--source/gameengine/SceneGraph/Makefile38
-rw-r--r--source/gameengine/SceneGraph/SConscript12
-rw-r--r--source/gameengine/SceneGraph/SG_BBox.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_BBox.h8
-rw-r--r--source/gameengine/SceneGraph/SG_Controller.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_Controller.h6
-rw-r--r--source/gameengine/SceneGraph/SG_DList.h7
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_IObject.h7
-rw-r--r--source/gameengine/SceneGraph/SG_Node.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_Node.h7
-rw-r--r--source/gameengine/SceneGraph/SG_ParentRelation.h44
-rw-r--r--source/gameengine/SceneGraph/SG_QList.h7
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_Spatial.h6
-rw-r--r--source/gameengine/SceneGraph/SG_Tree.cpp7
-rw-r--r--source/gameengine/SceneGraph/SG_Tree.h7
-rw-r--r--source/gameengine/VideoTexture/BlendType.h4
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt58
-rw-r--r--source/gameengine/VideoTexture/Common.h4
-rw-r--r--source/gameengine/VideoTexture/Exception.cpp3
-rw-r--r--source/gameengine/VideoTexture/Exception.h4
-rw-r--r--source/gameengine/VideoTexture/FilterBase.cpp3
-rw-r--r--source/gameengine/VideoTexture/FilterBase.h4
-rw-r--r--source/gameengine/VideoTexture/FilterBlueScreen.cpp7
-rw-r--r--source/gameengine/VideoTexture/FilterBlueScreen.h6
-rw-r--r--source/gameengine/VideoTexture/FilterColor.cpp11
-rw-r--r--source/gameengine/VideoTexture/FilterColor.h4
-rw-r--r--source/gameengine/VideoTexture/FilterNormal.cpp3
-rw-r--r--source/gameengine/VideoTexture/FilterNormal.h4
-rw-r--r--source/gameengine/VideoTexture/FilterSource.cpp3
-rw-r--r--source/gameengine/VideoTexture/FilterSource.h4
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp9
-rw-r--r--source/gameengine/VideoTexture/ImageBase.h4
-rw-r--r--source/gameengine/VideoTexture/ImageBuff.cpp11
-rw-r--r--source/gameengine/VideoTexture/ImageBuff.h4
-rw-r--r--source/gameengine/VideoTexture/ImageMix.cpp3
-rw-r--r--source/gameengine/VideoTexture/ImageMix.h4
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp12
-rw-r--r--source/gameengine/VideoTexture/ImageRender.h6
-rw-r--r--source/gameengine/VideoTexture/ImageViewport.cpp7
-rw-r--r--source/gameengine/VideoTexture/ImageViewport.h4
-rw-r--r--source/gameengine/VideoTexture/Makefile68
-rw-r--r--source/gameengine/VideoTexture/PyTypeList.cpp11
-rw-r--r--source/gameengine/VideoTexture/PyTypeList.h7
-rw-r--r--source/gameengine/VideoTexture/SConscript7
-rw-r--r--source/gameengine/VideoTexture/Texture.cpp3
-rw-r--r--source/gameengine/VideoTexture/Texture.h4
-rw-r--r--source/gameengine/VideoTexture/VideoBase.cpp7
-rw-r--r--source/gameengine/VideoTexture/VideoBase.h4
-rw-r--r--source/gameengine/VideoTexture/VideoFFmpeg.cpp3
-rw-r--r--source/gameengine/VideoTexture/VideoFFmpeg.h5
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp3
-rw-r--r--source/icons/Makefile36
-rw-r--r--source/icons/SConscript4
-rw-r--r--source/icons/winblender.icobin25214 -> 295606 bytes
-rw-r--r--source/icons/wincreator.icobin4710 -> 0 bytes
-rw-r--r--source/icons/wincreator.rc2
-rw-r--r--source/icons/winlockedfile.icobin4710 -> 0 bytes
-rw-r--r--source/icons/winplayer.icobin4710 -> 0 bytes
-rw-r--r--source/icons/winplayer.rc1
-rw-r--r--source/icons/winpublisher.icobin4710 -> 0 bytes
-rw-r--r--source/icons/winpublisher.rc3
-rw-r--r--source/kernel/CMakeLists.txt19
-rw-r--r--source/kernel/Makefile37
-rw-r--r--source/kernel/SConscript4
-rw-r--r--source/kernel/gen_messaging/GEN_messaging.h7
-rw-r--r--source/kernel/gen_messaging/Makefile34
-rw-r--r--source/kernel/gen_messaging/intern/Makefile40
-rw-r--r--source/kernel/gen_messaging/intern/messaging.c7
-rw-r--r--source/kernel/gen_system/GEN_DataCache.h76
-rw-r--r--source/kernel/gen_system/GEN_HashedPtr.cpp5
-rw-r--r--source/kernel/gen_system/GEN_HashedPtr.h5
-rw-r--r--source/kernel/gen_system/GEN_Map.h7
-rw-r--r--source/kernel/gen_system/GEN_Matrix4x4.cpp202
-rw-r--r--source/kernel/gen_system/GEN_Matrix4x4.h76
-rw-r--r--source/kernel/gen_system/GEN_SmartPtr.h233
-rw-r--r--source/kernel/gen_system/Makefile41
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.cpp7
-rw-r--r--source/kernel/gen_system/SYS_SingletonSystem.h6
-rw-r--r--source/kernel/gen_system/SYS_System.cpp5
-rw-r--r--source/kernel/gen_system/SYS_System.h5
-rw-r--r--source/tests/CMakeLists.txt253
-rw-r--r--source/tests/batch_import.py178
-rw-r--r--source/tests/bl_test.py195
-rw-r--r--source/tests/pep8.py109
-rw-r--r--source/tests/rna_array.py297
-rw-r--r--source/tests/rna_info_dump.py131
2031 files changed, 112617 insertions, 98362 deletions
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 1f1b1d883bc..1929f19f38f 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -24,13 +24,15 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(blender)
-ADD_SUBDIRECTORY(kernel)
+add_subdirectory(blender)
-IF(WITH_GAMEENGINE)
- ADD_SUBDIRECTORY(gameengine)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_GAMEENGINE)
+ add_subdirectory(kernel)
+ add_subdirectory(gameengine)
+endif()
-IF(WINDOWS)
- ADD_SUBDIRECTORY(icons)
-ENDIF(WINDOWS)
+if(WINDOWS)
+ add_subdirectory(icons)
+endif()
+
+add_subdirectory(tests)
diff --git a/source/Makefile b/source/Makefile
deleted file mode 100644
index 1055c2a94e9..00000000000
--- a/source/Makefile
+++ /dev/null
@@ -1,631 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): GSR
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Top level makefile. Start looping through subdirs and link....
-#
-
-ifndef NANENV
- export NANENV := $(shell env | grep NAN_)
-endif
-
-include nan_definitions.mk
-
-DIRS = creator blender kernel
-
-ifneq ($(NAN_NO_KETSJI),true)
- DIRS += gameengine
-endif
-
-ifeq ($(OS),windows)
- DIRS += icons
-endif
-
-########## buildinfo kludge ###################
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I../Physics/Dummy
-ifdef NAN_BUILDINFO
- BUILDINFO_O = $(DIR)/$(DEBUG_DIR)buildinfo.o
- BUILDINFO_C = $(SRCHOME)/creator/buildinfo.c
- BUILD_DATE := $(shell date "+%Y-%m-%d")
- BUILD_TIME := $(shell date "+%H:%M:%S")
- BUILD_REV := $(shell svnversion)
-endif
-
-############# set pyplayerlib ##################
-
-
-############# libraries ##################
-# COMLIB COMmon LIBraries for all targets
-# BPLIB Browser Plugin LIBraries
-# SPLIB1 Standalone Player LIBraries (pre COMLIB)
-# SPLIB Standalone Player LIBraries (post COMLIB)
-# PULIB PUblisher LIBraries
-# GRPLIB Gui and Render LIBraries for Publisher
-# LLIBS dynamic system libraries
-# SADD Static OpenGL libraries
-# DADD Dynamic OpenGL libraries
-# NSPLUGLIB PLUGin LIBraries for ns-style api
-# PLUGAPPLIB libs that form the application to be plugged in
-# Note: the order is important here
-
-
-GRPLIB = $(OCGDIR)/creator/$(DEBUG_DIR)libcreator.a
-GRPLIB += $(OCGDIR)/blender/windowmanager/$(DEBUG_DIR)libwindowmanager.a
-GRPLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-GRPLIB += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-GRPLIB += $(OCGDIR)/blender/render/$(DEBUG_DIR)librender.a
-GRPLIB += $(OCGDIR)/blender/render/$(DEBUG_DIR)librender_raytrace.a
-
-# nlin: the reason that some libraries appear more than once below is
-# to handle circular dependencies in linking among libraries... some
-# linkers (e.g. under Linux) need libs to be specified multiple times
-# to properly resolve circular dependencies. ugly, but it works...
-# the repeat entries could probably be trimmed down.
-COMLIB = $(OCGDIR)/blender/blenkernel/$(DEBUG_DIR)libblenkernel.a
-COMLIB += $(OCGDIR)/blender/blenloader/$(DEBUG_DIR)libblenloader.a
-COMLIB += $(OCGDIR)/blender/blenpluginapi/$(DEBUG_DIR)libblenpluginapi.a
-COMLIB += $(OCGDIR)/blender/nodes_shd/$(DEBUG_DIR)libnodes_shd.a
-COMLIB += $(OCGDIR)/blender/nodes_cmp/$(DEBUG_DIR)libnodes_cmp.a
-COMLIB += $(OCGDIR)/blender/nodes_tex/$(DEBUG_DIR)libnodes_tex.a
-COMLIB += $(OCGDIR)/blender/nodes/$(DEBUG_DIR)libnodes.a
-COMLIB += $(OCGDIR)/blender/imbuf/$(DEBUG_DIR)libimbuf.a
-COMLIB += $(OCGDIR)/blender/ikplugin/$(DEBUG_DIR)libikplugin.a
-COMLIB += $(OCGDIR)/blender/modifiers/$(DEBUG_DIR)libmodifiers.a
-COMLIB += $(NAN_IKSOLVER)/lib/$(DEBUG_DIR)libiksolver.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc_kdl.a
-COMLIB += $(NAN_ITASC)/lib/$(DEBUG_DIR)libitasc_kdl_util.a
-COMLIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
-COMLIB += $(NAN_SUPERLU)/lib/$(DEBUG_DIR)libsuperlu.a
-COMLIB += $(OCGDIR)/blender/avi/$(DEBUG_DIR)libavi.a
-COMLIB += $(NAN_JPEG)/lib/libjpeg.a
-COMLIB += $(OCGDIR)/blender/gpu/$(DEBUG_DIR)libgpu.a
-COMLIB += $(NAN_GLEW)/lib/$(DEBUG_DIR)libglew.a
-COMLIB += $(OCGDIR)/blender/blenfont/$(DEBUG_DIR)libblenfont.a
-COMLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_python.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaudaspace.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_src.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fx.a
-COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sdl.a
-ifeq ($(WITH_FFMPEG),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_ffmpeg.a
-endif
-ifeq ($(WITH_OPENAL),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_openal.a
-endif
-ifeq ($(WITH_JACK),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_jack.a
-endif
-ifeq ($(WITH_SNDFILE),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_sndfile.a
-endif
-ifeq ($(WITH_FFTW3),true)
- COMLIB += $(NAN_AUDASPACE)/lib/$(DEBUG_DIR)libaud_fftw.a
-endif
-COMLIB += $(NAN_SAMPLERATE)/lib/$(DEBUG_DIR)libsamplerate.a
-COMLIB += $(NAN_LZO)/lib/$(DEBUG_DIR)libminilzo.a
-COMLIB += $(NAN_LZMA)/lib/$(DEBUG_DIR)liblzma.a
-COMLIB += $(NAN_BSP)/lib/$(DEBUG_DIR)libbsp.a
-COMLIB += $(NAN_BOOLOP)/lib/$(DEBUG_DIR)libboolop.a
-COMLIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
-COMLIB += $(NAN_DECIMATION)/lib/$(DEBUG_DIR)libdecimation.a
-COMLIB += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-
-
-ifneq ($(NAN_NO_KETSJI),true)
- COMLIB += $(OCGDIR)/gameengine/bloutines/$(DEBUG_DIR)libbloutines.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/blphys/blbullet/$(DEBUG_DIR)libblbullet.a
- COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a
- COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a
- COMLIB += $(OCGDIR)/gameengine/logic/$(DEBUG_DIR)liblogic.a
- COMLIB += $(OCGDIR)/gameengine/logic/Joystick/$(DEBUG_DIR)libJoystick.a
- COMLIB += $(OCGDIR)/gameengine/rasterizer/$(DEBUG_DIR)librasterizer.a
- COMLIB += $(OCGDIR)/gameengine/OpenGLrasterizer/$(DEBUG_DIR)libOpenGLrasterizer.a
- COMLIB += $(OCGDIR)/gameengine/expression/$(DEBUG_DIR)libexpression.a
- COMLIB += $(OCGDIR)/gameengine/scenegraph/$(DEBUG_DIR)libscenegraph.a
- COMLIB += $(OCGDIR)/gameengine/videotex/$(DEBUG_DIR)libvideotex.a
- COMLIB += $(NAN_MOTO)/lib/libmoto.a
- COMLIB += $(NAN_SND_LIBS)
- COMLIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a
- COMLIB += $(OCGDIR)/kernel/gen_messaging/$(DEBUG_DIR)libgen_messaging.a
- COMLIB += $(OCGDIR)/gameengine/ketsji/KXNetwork/$(DEBUG_DIR)libKXNetwork.a
- COMLIB += $(OCGDIR)/gameengine/Network/$(DEBUG_DIR)libNetwork.a
- COMLIB += $(OCGDIR)/gameengine/Network/LoopBackNetwork/$(DEBUG_DIR)libLoopBackNetwork.a
- COMLIB += $(NAN_BULLET2)/lib/libbullet2.a
-endif
-
-# Cloth requires bullet2, gameegine does not matter anymore
-#COMLIB += $(NAN_BULLET2)/lib/libbullet2.a
-
-COMLIB += $(OCGDIR)/blender/makesdna/$(DEBUG_DIR)libdna.a
-COMLIB += $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
-COMLIB += $(NAN_MEMUTIL)/lib/libmemutil.a
-COMLIB += $(NAN_PNG)/lib/libpng.a
-COMLIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a # This was a PULIB up to circa r25248
-COMLIB += $(OCGDIR)/blender/gen_python/$(DEBUG_DIR)libgen_python.a
-COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-
-
-ifeq ($(WITH_QUICKTIME), true)
- COMLIB += $(OCGDIR)/blender/blenderqt/$(DEBUG_DIR)libblenderqt.a
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- COMLIB += $(OCGDIR)/blender/imbuf/openexr/$(DEBUG_DIR)libopenexr.a
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- ifndef BF_OPENJPEG_LIBS
- COMLIB += $(OCGDIR)/extern/openjpeg/$(DEBUG_DIR)libopenjpeg.a
- else
- COMLIB += $(BF_OPENJPEG_LIBS)
- endif
-endif
-
-ifeq ($(WITH_CINEON), true)
- COMLIB += $(OCGDIR)/blender/imbuf/cineon/$(DEBUG_DIR)libcineon.a
-endif
-
-ifeq ($(WITH_DDS), true)
- COMLIB += $(OCGDIR)/blender/imbuf/dds/$(DEBUG_DIR)libdds.a
-endif
-
-ifeq ($(WITH_BINRELOC), true)
- COMLIB += $(OCGDIR)/extern/binreloc/$(DEBUG_DIR)libbinreloc.a
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- COMLIB += $(OCGDIR)/blender/bf_collada/$(DEBUG_DIR)/libbf_collada.a
- COMLIB += $(BF_PCRE_LIBS)
-endif
-
-ifeq ($(OS), windows)
- ifeq ($(FREE_WINDOWS), true)
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- else
- COMLIB += $(NAN_FREETYPE)/lib/freetype2ST.lib
- endif
-else
- ifeq ($(OS), irix)
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- else
- COMLIB += $(NAN_FREETYPE)/lib/libfreetype.a
- endif
-endif
-
-ifeq ($(OS), irix)
- COMLIB += $(NAN_SDL)/lib/libSDL.a
-endif
-
-ifeq ($(OS), windows)
- ifeq ($(FREE_WINDOWS), true)
- COMLIB += $(NAN_SDL)/lib/libSDL.a
- COMLIB += $(NAN_PTHREADS)/lib/libpthreadGC2.a
- else
- COMLIB += $(NAN_SDL)/lib/SDL.lib
- endif
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- COMLIB += $(NAN_OPENEXR_LIBS)
-endif
-
-# note: space_api.a in begin of editors, screen.a in end
-PULIB = $(NAN_MOTO)/lib/libmoto.a
-PULIB += $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
-PULIB += $(OCGDIR)/blender/ed_space/$(DEBUG_DIR)libed_space.a
-PULIB += $(OCGDIR)/blender/ed_sound/$(DEBUG_DIR)libed_sound.a
-PULIB += $(OCGDIR)/blender/ed_action/$(DEBUG_DIR)libed_action.a
-PULIB += $(OCGDIR)/blender/ed_nla/$(DEBUG_DIR)libed_nla.a
-PULIB += $(OCGDIR)/blender/ed_script/$(DEBUG_DIR)libed_script.a
-PULIB += $(OCGDIR)/blender/ed_text/$(DEBUG_DIR)libed_text.a
-PULIB += $(OCGDIR)/blender/ed_logic/$(DEBUG_DIR)libed_logic.a
-PULIB += $(OCGDIR)/blender/ed_sequencer/$(DEBUG_DIR)libed_sequencer.a
-PULIB += $(OCGDIR)/blender/ed_file/$(DEBUG_DIR)libed_file.a
-PULIB += $(OCGDIR)/blender/ed_info/$(DEBUG_DIR)libed_info.a
-PULIB += $(OCGDIR)/blender/ed_buttons/$(DEBUG_DIR)libed_buttons.a
-PULIB += $(OCGDIR)/blender/ed_graph/$(DEBUG_DIR)libed_graph.a
-PULIB += $(OCGDIR)/blender/ed_node/$(DEBUG_DIR)libed_node.a
-PULIB += $(OCGDIR)/blender/ed_outliner/$(DEBUG_DIR)libed_outliner.a
-PULIB += $(OCGDIR)/blender/ed_time/$(DEBUG_DIR)libed_time.a
-PULIB += $(OCGDIR)/blender/ed_render/$(DEBUG_DIR)libed_render.a
-PULIB += $(OCGDIR)/blender/ed_view3d/$(DEBUG_DIR)libed_view3d.a
-PULIB += $(OCGDIR)/blender/ed_interface/$(DEBUG_DIR)libed_interface.a
-PULIB += $(OCGDIR)/blender/ed_object/$(DEBUG_DIR)libed_object.a
-PULIB += $(OCGDIR)/blender/ed_curve/$(DEBUG_DIR)libed_curve.a
-PULIB += $(OCGDIR)/blender/ed_metaball/$(DEBUG_DIR)libed_metaball.a
-PULIB += $(OCGDIR)/blender/ed_armature/$(DEBUG_DIR)libed_armature.a
-PULIB += $(OCGDIR)/blender/ed_mesh/$(DEBUG_DIR)libed_mesh.a
-PULIB += $(OCGDIR)/blender/ed_sculpt_paint/$(DEBUG_DIR)libed_sculpt_paint.a
-PULIB += $(OCGDIR)/blender/ed_physics/$(DEBUG_DIR)libed_physics.a
-PULIB += $(OCGDIR)/blender/ed_animation/$(DEBUG_DIR)libed_animation.a
-PULIB += $(OCGDIR)/blender/ed_transform/$(DEBUG_DIR)libed_transform.a
-PULIB += $(OCGDIR)/blender/ed_util/$(DEBUG_DIR)libed_util.a
-PULIB += $(OCGDIR)/blender/ed_datafiles/$(DEBUG_DIR)libed_datafiles.a
-PULIB += $(OCGDIR)/blender/ed_image/$(DEBUG_DIR)libed_image.a
-PULIB += $(OCGDIR)/blender/ed_uvedit/$(DEBUG_DIR)libed_uvedit.a
-PULIB += $(OCGDIR)/blender/ed_screen/$(DEBUG_DIR)libed_screen.a
-PULIB += $(OCGDIR)/blender/ed_console/$(DEBUG_DIR)libed_console.a
-PULIB += $(OCGDIR)/blender/ed_userpref/$(DEBUG_DIR)libed_userpref.a
-PULIB += $(OCGDIR)/blender/ed_gpencil/$(DEBUG_DIR)libed_gpencil.a
-PULIB += $(OCGDIR)/blender/ed_opsound/$(DEBUG_DIR)libed_opsound.a
-PULIB += $(OCGDIR)/blender/windowmanager/$(DEBUG_DIR)libwindowmanager.a
-PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
-# note, no idea but it suddenly doesn't compile :(
-PULIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-PULIB += $(NAN_OPENNL)/lib/$(DEBUG_DIR)libopennl.a
-PULIB += $(NAN_ELBEEM)/lib/$(DEBUG_DIR)libelbeem.a
-PULIB += $(NAN_SMOKE)/lib/$(DEBUG_DIR)libsmoke.a
-
-ifeq ($(NAN_NO_KETSJI),true)
- PULIB += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
- PULIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a
- PULIB += $(OCGDIR)/kernel/gen_messaging/$(DEBUG_DIR)libgen_messaging.a
- COMLIB += $(NAN_SND_LIBS)
-endif
-
-SPLIB1 = $(OCGDIR)/gameengine/GamePlayer/ghost/$(DEBUG_DIR)libghost.a
-SPLIB1 += $(OCGDIR)/gameengine/GamePlayer/common/$(DEBUG_DIR)libcommon.a
-SPLIB1 += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a
-SPLIB1 += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-SPLIB1 += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a
-
-SPLIB = $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
-# this is used for the plugin. It uses some things from libz.a,
-# but somehow it consistently fails to resolve these symbols... or
-# can I just not check them? nm claims they aren't...
-SPLIB += $(OCGDIR)/blender/blenkernel/blenkernel_blc/$(DEBUG_DIR)libblenkernel_blc.a
-SPLIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
-SPLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
-
-# These three need to be explicitly mentioned on the cl, because
-# if they are offered as a lib, they are optimized away. (nzc)
-NSPLUGLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)UnixShell.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)stubs.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)winstubs.o
-NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)Blender3DPlugin_native_implementation.o
-
-# Here you can configure what sort of test to make for the plugin.
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_stub.a
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_colorcycle.a
-# PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_gears.a
-PLUGTESTLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/test/$(DEBUG_DIR)libns_api_test_threaded_gears.a
-
-# XPCOM is done only for Linux for now
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)XPH_xpcom_hooks.o
- endif
-endif
-
-PLUGAPPLIB = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)libplugin_ketsji_hooks.a
-
-ifeq ($(OS),$(findstring $(OS), "freebsd linux irix solaris"))
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)PLG_X11_windowing.o
- PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/unix/$(DEBUG_DIR)libunix.a
-endif
-ifeq ($(OS),$(findstring $(OS), "windows"))
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)PLG_MSWindows_windowing.o
- NSPLUGLIB += $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)npB3DPlg.res
- PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/windows/$(DEBUG_DIR)libwindows.a
-endif
-
-PLUGAPPLIB += $(OCGDIR)/gameengine/GamePlayer/common/$(DEBUG_DIR)libcommon.a
-
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- PLUGAPPLIB_XPLINK = $(OCGDIR)/gameengine/GamePlayer/netscape/src/$(DEBUG_DIR)_Blender3DPlugin_implementation_.o
- endif
-endif
-
-# A bit silly... but needed to resolve symbols.
-PLUGREMLIB = $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a
-
-######################## OS dependencies (alphabetic!) ################
-
-include nan_link.mk
-
-ifeq ($(NAN_JUST_BLENDERDYNAMIC),true)
- BINTARGETS = blenderdynamic
-endif
-
-ifeq ($(WITH_BF_DYNAMICOPENGL), true)
- BINTARGETS += blenderdynamic
-endif
-
-ifeq ($(WITH_BF_STATICOPENGL), true)
- BINTARGETS += blenderstatic
-endif
-
-ifeq ($(WITH_BF_BLENDERPLAYER), true)
- export WITH_BF_GAMEENGINE=true
- BINTARGETS += blenderplayer
-endif
-
-ifeq ($(WITH_BF_WEBPLUGIN), true)
- BINTARGETS += plugin
- ifeq ($(OS),linux)
- ifeq ($(CPU),i386)
- BINTARGETS += xplink
- endif
- endif
-endif
-
-ifeq ($(WITH_OPENAL),true)
- ifeq ($(OS),$(findstring $(OS), "freebsd linux windows"))
- ifeq ($(CPU),$(findstring $(CPU), "i386 powerpc x86_64 parisc64"))
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- else
- ifeq ($(OS),windows)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/openal_static.lib
- endif
- endif
- else
- ifeq ($(OS),darwin)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- else
- ifeq ($(OS), solaris)
- NAN_SND_LIBS += $(NAN_OPENAL)/lib/libopenal.a
- endif
- endif
- endif
-endif
-
-ifeq ($(WITH_JACK),true)
- ifeq ($(OS),$(findstring $(OS), "linux"))
- NAN_SND_LIBS += $(NAN_JACKLIBS)
- endif
-endif
-
-ifeq ($(WITH_SNDFILE),true)
- ifeq ($(OS),$(findstring $(OS), "linux darwin"))
- NAN_SND_LIBS += $(NAN_SNDFILELIBS)
- endif
-endif
-
-ifeq ($(OS),windows)
-
- # Might need to change this to $(NAN_MOZILLA_LIB)/nspr4.lib
- NSPLUGLIB += $(NAN_NSPR)/lib/nspr4.lib
-
- BINTARGETS = blenderdynamic
- ifeq ($(FREE_WINDOWS),true)
- ifneq ($(NAN_NO_KETSJI),true)
- BINTARGETS += blenderplayer
- endif
- else
- BINTARGETS += blenderplayer
- BINTARGETS += blenderdynplayer
- BINTARGETS += plugin
- endif
-
- PULIB += $(OCGDIR)/blender/icons/$(DEBUG_DIR)winblender.res
- PULIB += $(NAN_ZLIB)/lib/libz.a
- SPLIB += $(OCGDIR)/blender/icons/$(DEBUG_DIR)winblender.res
- SPLIB += $(NAN_ZLIB)/lib/libz.a
-endif
-
-
-# prepare for NAN_BUILDINFO compile at the *sigh* link rules below
-
-ifdef NAN_BUILDINFO
- CSRCS =
- ALLTARGETS =
- include nan_compile.mk
-endif
-
-################## target rules ########################
-
-all debug ::
- @echo "****> Make $@ by $(ID)@$(HOST) at $(MAKE_START) on $(CONFIG_GUESS)"
-ifdef NANENV
- @for n in $(NANENV); do \
- echo " $$n"; \
- done
-endif
-
-DIR = $(OCGDIR)
-SOURCEDIR = source
-
-include nan_subdirs.mk
-
-################## target rules ########################
-
-all:: link
-
-debug debuglink::
- @$(MAKE) link DEBUG_DIR="debug/" NANENV=$(NANENV)
-
-clean:: linkclean debuglinkclean
-
-link: $(BINTARGETS)
- @echo "****> Build SVN rev $(BUILD_REV), $(MAKE_START) - `date '+%H:%M:%S %d-%b-%Y'`"
-ifdef NANENV
- @for n in $(NANENV); do \
- echo " $$n"; \
- done
-endif
-
-linkclean:
- @$(RM) -r $(DIR)/blenderstatic* \
- $(DIR)/blenderplayer* \
- $(DIR)/bin/*
-
-debuglinkclean:
- @$(RM) -r $(DIR)/debug/blenderstatic* \
- $(DIR)/debug/blenderplayer* \
- $(DIR)/debug/bin/*
-
-# Shortcut for Tinderbox release builds. Mortals don't use this.
-release:
- @$(MAKE) -C ../release/ all || exit 1;
-
-############### Linker rules ###############
-
-blenderstatic: $(DIR)/$(DEBUG_DIR)bin/blenderstatic
-blenderdynamic: $(DIR)/$(DEBUG_DIR)bin/blender$(EXT)
-blenderplayer: $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT)
-blenderdynplayer: $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT)
-
-# XPCOM connector only for linux so far...
-ifeq ($(OS),linux)
- xplink: $(DIR)/$(DEBUG_DIR)bin/Blender3DPlugin$(SOEXT)
-endif
-
-# Moz/NS plugin:
-ifeq ($(OS),$(findstring $(OS), "freebsd linux irix solaris"))
- plugin: $(DIR)/$(DEBUG_DIR)bin/npBlender3DPlugin$(SOEXT)
- ptest: $(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT)
-endif
-# Windows needs a 8.3 name... Why? Dunno...
-ifeq ($(OS),windows)
- ifneq ($(FREE_WINDOWS),true)
- plugin: $(DIR)/$(DEBUG_DIR)npB3DPlg$(SOEXT)
- endif
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderstatic: $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"static"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderstatic $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB) $(LLIBS) $(SADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderstatic
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blender$(EXT): $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blender$(EXT) $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(PULIB) $(COMLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blender
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT): $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderplayer
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT): $(OBJS) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-ifeq ($(OS), darwin)
- @$(MAKE) -C darwin/ APPLICATION=blenderplayer
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/Blender3DPlugin$(SOEXT): $(PLUGAPPLIB_XPLINK)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(CCFLAGS) $(DYNLDFLAGS) -o $@ $(PLUGAPPLIB_XPLINK) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-# Windows build needs a def file? Why? For exposing functions from the
-# dll to the outside world. However, this is alsi done internally..
-DEFFILE = ./gameengine/GamePlayer/netscape/src/npB3DPlg.def
-
-# Windows needs a specific name format for dll.s so we give it one.
-$(DIR)/$(DEBUG_DIR)npB3DPlg$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
-# $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS) /def:$(DEFFILE)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/npBlender3DPlugin$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
-
-$(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT): $(NSPLUGLIB)
- @echo "****> Link $@"
-ifdef NAN_BUILDINFO
- $(CCC) $(CCFLAGS) $(REL_CCFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
-endif
- mkdir -p $(DIR)/$(DEBUG_DIR)bin
- $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGTESTLIB) $(LLIBS) $(DADD) $(LOPTS)
-ifdef NAN_BUILDINFO
- /bin/rm $(BUILDINFO_O)
-endif
diff --git a/source/SConscript b/source/SConscript
index 3944a3c6df5..8d08d9cca08 100644
--- a/source/SConscript
+++ b/source/SConscript
@@ -1,14 +1,13 @@
#!/usr/bin/python
Import ('env')
-SConscript(['blender/SConscript',
- 'kernel/SConscript',
- 'creator/SConscript'])
+SConscript(['blender/SConscript', 'creator/SConscript'])
+
if env['WITH_BF_GAMEENGINE']:
- SConscript (['gameengine/SConscript'])
+ SConscript (['kernel/SConscript', 'gameengine/SConscript'])
if env['WITH_BF_PLAYER']:
- SConscript (['blenderplayer/bad_level_call_stubs/SConscript'])
+ SConscript (['blenderplayer/bad_level_call_stubs/SConscript'])
if env['OURPLATFORM'] in ('win64-vc', 'win32-vc', 'win32-mingw', 'linuxcross'):
- SConscript (['icons/SConscript'])
+ SConscript (['icons/SConscript'])
diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt
index 29dc113e075..2871c4cd214 100644
--- a/source/blender/CMakeLists.txt
+++ b/source/blender/CMakeLists.txt
@@ -24,46 +24,106 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(windowmanager)
-ADD_SUBDIRECTORY(editors)
-ADD_SUBDIRECTORY(avi)
-ADD_SUBDIRECTORY(nodes)
-ADD_SUBDIRECTORY(blenkernel)
-ADD_SUBDIRECTORY(modifiers)
-ADD_SUBDIRECTORY(blenlib)
-ADD_SUBDIRECTORY(bmesh)
-ADD_SUBDIRECTORY(blenloader)
-ADD_SUBDIRECTORY(blenpluginapi)
-ADD_SUBDIRECTORY(imbuf)
-ADD_SUBDIRECTORY(gpu)
-ADD_SUBDIRECTORY(makesdna)
-ADD_SUBDIRECTORY(makesrna)
-ADD_SUBDIRECTORY(readblenfile)
-ADD_SUBDIRECTORY(render)
-ADD_SUBDIRECTORY(blenfont)
-ADD_SUBDIRECTORY(ikplugin)
+set(SRC_DNA_INC
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ID.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_action_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_actuator_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_anim_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_armature_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_boid_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_brush_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_camera_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_cloth_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_color_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_constraint_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_controller_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_curve_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_customdata_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_documentation.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_effect_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_fileglobal_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_genfile.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_gpencil_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_group_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_image_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_ipo_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_key_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_lamp_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_lattice_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_listBase.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_material_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_mesh_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_meshdata_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_meta_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_modifier_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_nla_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_node_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_object_fluidsim.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_object_force.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_object_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_outliner_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_packedFile_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_particle_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_property_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_scene_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_screen_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_sdna_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_sensor_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_sequence_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_smoke_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_sound_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_space_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_text_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_texture_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_userdef_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_vec_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_vfont_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view2d_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view3d_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_windowmanager_types.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_world_types.h
+)
-IF(WITH_IMAGE_OPENEXR)
- ADD_SUBDIRECTORY(imbuf/intern/openexr)
-ENDIF(WITH_IMAGE_OPENEXR)
+add_subdirectory(editors)
+add_subdirectory(windowmanager)
+add_subdirectory(blenkernel)
+add_subdirectory(blenlib)
+add_subdirectory(bmesh)
+add_subdirectory(render)
+add_subdirectory(blenfont)
+add_subdirectory(blenloader)
+add_subdirectory(readblenfile)
+add_subdirectory(blenpluginapi)
+add_subdirectory(ikplugin)
+add_subdirectory(gpu)
+add_subdirectory(imbuf)
+add_subdirectory(avi)
+add_subdirectory(nodes)
+add_subdirectory(modifiers)
+add_subdirectory(makesdna)
+add_subdirectory(makesrna)
-IF(WITH_IMAGE_DDS)
- ADD_SUBDIRECTORY(imbuf/intern/dds)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_OPENEXR)
+ add_subdirectory(imbuf/intern/openexr)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_SUBDIRECTORY(imbuf/intern/cineon)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_DDS)
+ add_subdirectory(imbuf/intern/dds)
+endif()
-IF(WITH_QUICKTIME)
- ADD_SUBDIRECTORY(quicktime)
-ENDIF(WITH_QUICKTIME)
+if(WITH_IMAGE_CINEON)
+ add_subdirectory(imbuf/intern/cineon)
+endif()
-IF(WITH_PYTHON)
- ADD_SUBDIRECTORY(python)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_QUICKTIME)
+ add_subdirectory(quicktime)
+endif()
-IF(WITH_OPENCOLLADA)
- ADD_SUBDIRECTORY(collada)
-ENDIF(WITH_OPENCOLLADA)
+if(WITH_PYTHON)
+ add_subdirectory(python)
+endif()
+
+if(WITH_OPENCOLLADA)
+ add_subdirectory(collada)
+endif()
diff --git a/source/blender/Makefile b/source/blender/Makefile
deleted file mode 100644
index 8052c175f8e..00000000000
--- a/source/blender/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-include nan_definitions.mk
-
-DIRS = windowmanager editors blenloader readblenfile
-DIRS += avi imbuf render blenlib blenkernel blenpluginapi
-DIRS += makesdna makesrna
-DIRS += python nodes modifiers gpu
-DIRS += blenfont ikplugin
-
-ifeq ($(WITH_QUICKTIME), true)
- DIRS += quicktime
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CFLAGS += -DWITH_OPENJPEG -I../../../../extern/libopenjpeg
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- DIRS += collada
-endif
-
-
-DIR = $(OCGDIR)/blender
-SOURCEDIR = source/blender
-TESTDIRS = deflate streamglue
-
-include nan_subdirs.mk
diff --git a/source/blender/avi/AVI_avi.h b/source/blender/avi/AVI_avi.h
index 2e71bd98309..85685e2bd4c 100644
--- a/source/blender/avi/AVI_avi.h
+++ b/source/blender/avi/AVI_avi.h
@@ -1,24 +1,4 @@
-/**
- * @mainpage AVI - AVI module external interface
- *
- * @section about About the AVI module
- *
- * This is external code. It provides avi file import/export and
- * conversions. It has been adapted to make use of Blender memory
- * management functions, and because of this it needs module
- * blenlib. You need to provide this lib when linking with libavi.a .
- *
- * @section issues Known issues with AVI
- *
- * - avi uses mallocN, freeN from blenlib.
- * - Not all functions that are used externally are properly
- * prototyped.
- *
- * This header has not been split, since it interleaves type defines
- * and functions. You would need the types to be able to include the
- * function headers anyway. And, after all, it is someone else's
- * code. So we keep it like this.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -48,6 +28,30 @@
*
*/
+/** \file AVI_avi.h
+ * \ingroup avi
+ * \section aviabout AVI module external interface
+ *
+ * \subsection about About the AVI module
+ *
+ * This is external code. It provides avi file import/export and
+ * conversions. It has been adapted to make use of Blender memory
+ * management functions, and because of this it needs module
+ * blenlib. You need to provide this lib when linking with libavi.a .
+ *
+ * \subsection issues Known issues with AVI
+ *
+ * - avi uses mallocN, freeN from blenlib.
+ * - Not all functions that are used externally are properly
+ * prototyped.
+ *
+ * This header has not been split, since it interleaves type defines
+ * and functions. You would need the types to be able to include the
+ * function headers anyway. And, after all, it is someone else's
+ * code. So we keep it like this.
+ *
+ */
+
#ifndef __AVI_H__
#define __AVI_H__
@@ -232,7 +236,7 @@ typedef enum {
/**
* Test whether this is an avi-format.
*/
-int AVI_is_avi (char *name);
+int AVI_is_avi (const char *name);
/**
@@ -277,7 +281,7 @@ int AVI_get_stream (AviMovie *movie, int avist_type, int stream_num);
/**
* Open a movie stream from file.
*/
-AviError AVI_open_movie (char *name, AviMovie *movie);
+AviError AVI_open_movie (const char *name, AviMovie *movie);
/**
* Read a frame from a movie stream.
diff --git a/source/blender/avi/CMakeLists.txt b/source/blender/avi/CMakeLists.txt
index 5ef37f5951b..77a43e5560e 100644
--- a/source/blender/avi/CMakeLists.txt
+++ b/source/blender/avi/CMakeLists.txt
@@ -24,11 +24,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
+set(INC
+ .
+ ../../../intern/guardedalloc
+ ${JPEG_INCLUDE_DIR}
+)
+
+set(SRC
+ intern/avi.c
+ intern/avirgb.c
+ intern/codecs.c
+ intern/endian.c
+ intern/mjpeg.c
+ intern/options.c
+ intern/rgb32.c
-SET(INC
- . ../../../intern/guardedalloc
- ${JPEG_INC}
+ AVI_avi.h
+ intern/avi_intern.h
+ intern/avirgb.h
+ intern/endian.h
+ intern/mjpeg.h
+ intern/rgb32.h
)
-BLENDERLIB(bf_avi "${SRC}" "${INC}")
+blender_add_lib(bf_avi "${SRC}" "${INC}")
diff --git a/source/blender/avi/Makefile b/source/blender/avi/Makefile
deleted file mode 100644
index 96a6573cc67..00000000000
--- a/source/blender/avi/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/avi
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/avi/intern/Makefile b/source/blender/avi/intern/Makefile
deleted file mode 100644
index 8d1af9adb28..00000000000
--- a/source/blender/avi/intern/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = avi
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL1_C_WARNINGS)
-
-ifeq ($(CPU),$(findstring $(CPU), "powerpc mips sparc"))
- CPPFLAGS += -DWORDS_BIGENDIAN
-else
- # alpha i386
- CPPFLAGS += -DWORDS_LITTLEENDIAN
-endif
-
-# the JPEG library
-CPPFLAGS += -I$(NAN_JPEG)/include
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# our own include
-CPPFLAGS += -I..
-
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 5f0d36e17e2..b23c1f83714 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -1,10 +1,8 @@
-/**
- * avi.c
+/*
+ * $Id$
*
* This is external code.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -48,7 +46,7 @@
static int AVI_DEBUG=0;
static char DEBUG_FCC[4];
-#define DEBUG(x) if(AVI_DEBUG) printf("AVI DEBUG: " x);
+#define DEBUG_PRINT(x) if(AVI_DEBUG) printf("AVI DEBUG: " x);
/* local functions */
char *fcc_to_char (unsigned int fcc);
@@ -211,16 +209,14 @@ int AVI_is_avi (char *name) {
}
*/
-int AVI_is_avi (char *name) {
+int AVI_is_avi (const char *name) {
int temp, fcca, j;
- AviMovie movie;
+ AviMovie movie= {0};
AviMainHeader header;
AviBitmapInfoHeader bheader;
int movie_tracks = 0;
- DEBUG("opening movie\n");
-
- memset(&movie, 0, sizeof(AviMovie));
+ DEBUG_PRINT("opening movie\n");
movie.type = AVI_MOVIE_READ;
movie.fp = fopen (name, "rb");
@@ -243,7 +239,7 @@ int AVI_is_avi (char *name) {
GET_FCC (movie.fp) != FCC("hdrl") ||
(movie.header->fcc = GET_FCC (movie.fp)) != FCC("avih") ||
!(movie.header->size = GET_FCC (movie.fp))) {
- DEBUG("bad initial header info\n");
+ DEBUG_PRINT("bad initial header info\n");
fclose(movie.fp);
return 0;
}
@@ -266,7 +262,7 @@ int AVI_is_avi (char *name) {
fseek (movie.fp, movie.header->size-14*4, SEEK_CUR);
if (movie.header->Streams < 1) {
- DEBUG("streams less than 1\n");
+ DEBUG_PRINT("streams less than 1\n");
fclose(movie.fp);
return 0;
}
@@ -280,7 +276,7 @@ int AVI_is_avi (char *name) {
GET_FCC (movie.fp) != FCC ("strl") ||
(movie.streams[temp].sh.fcc = GET_FCC (movie.fp)) != FCC ("strh") ||
!(movie.streams[temp].sh.size = GET_FCC (movie.fp))) {
- DEBUG("bad stream header information\n");
+ DEBUG_PRINT("bad stream header information\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
@@ -328,7 +324,7 @@ int AVI_is_avi (char *name) {
fseek (movie.fp, movie.streams[temp].sh.size-14*4, SEEK_CUR);
if (GET_FCC (movie.fp) != FCC("strf")) {
- DEBUG("no stream format information\n");
+ DEBUG_PRINT("no stream format information\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
return 0;
@@ -384,7 +380,7 @@ int AVI_is_avi (char *name) {
while (GET_FCC (movie.fp) != FCC("LIST")) {
temp= GET_FCC (movie.fp);
if (temp<0 || ftell(movie.fp) > movie.size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
MEM_freeN(movie.streams);
fclose(movie.fp);
@@ -404,10 +400,10 @@ int AVI_is_avi (char *name) {
}
-AviError AVI_open_movie (char *name, AviMovie *movie) {
+AviError AVI_open_movie (const char *name, AviMovie *movie) {
int temp, fcca, size, j;
- DEBUG("opening movie\n");
+ DEBUG_PRINT("opening movie\n");
memset(movie, 0, sizeof(AviMovie));
@@ -430,7 +426,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
GET_FCC (movie->fp) != FCC("hdrl") ||
(movie->header->fcc = GET_FCC (movie->fp)) != FCC("avih") ||
!(movie->header->size = GET_FCC (movie->fp))) {
- DEBUG("bad initial header info\n");
+ DEBUG_PRINT("bad initial header info\n");
return AVI_ERROR_FORMAT;
}
@@ -452,7 +448,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, movie->header->size-14*4, SEEK_CUR);
if (movie->header->Streams < 1) {
- DEBUG("streams less than 1\n");
+ DEBUG_PRINT("streams less than 1\n");
return AVI_ERROR_FORMAT;
}
@@ -465,7 +461,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
GET_FCC (movie->fp) != FCC ("strl") ||
(movie->streams[temp].sh.fcc = GET_FCC (movie->fp)) != FCC ("strh") ||
!(movie->streams[temp].sh.size = GET_FCC (movie->fp))) {
- DEBUG("bad stream header information\n");
+ DEBUG_PRINT("bad stream header information\n");
return AVI_ERROR_FORMAT;
}
@@ -507,7 +503,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, movie->streams[temp].sh.size-14*4, SEEK_CUR);
if (GET_FCC (movie->fp) != FCC("strf")) {
- DEBUG("no stream format information\n");
+ DEBUG_PRINT("no stream format information\n");
return AVI_ERROR_FORMAT;
}
@@ -560,7 +556,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
while (GET_FCC (movie->fp) != FCC("LIST")) {
temp= GET_FCC (movie->fp);
if (temp<0 || ftell(movie->fp) > movie->size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
return AVI_ERROR_FORMAT;
}
fseek(movie->fp, temp, SEEK_CUR);
@@ -585,7 +581,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek (movie->fp, size, SEEK_CUR);
}
if (ftell(movie->fp) > movie->size) {
- DEBUG("incorrect size in header or error in AVI\n");
+ DEBUG_PRINT("incorrect size in header or error in AVI\n");
return AVI_ERROR_FORMAT;
}
}
@@ -599,13 +595,13 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
fseek(movie->fp, size-4, SEEK_CUR);
if (GET_FCC(movie->fp) != FCC("idx1")) {
- DEBUG("bad index informatio\n");
+ DEBUG_PRINT("bad index informatio\n");
return AVI_ERROR_FORMAT;
}
movie->index_entries = GET_FCC (movie->fp)/sizeof(AviIndexEntry);
if (movie->index_entries == 0) {
- DEBUG("no index entries\n");
+ DEBUG_PRINT("no index entries\n");
return AVI_ERROR_FORMAT;
}
@@ -631,7 +627,7 @@ AviError AVI_open_movie (char *name, AviMovie *movie) {
movie->read_offset= 4;
}
- DEBUG("movie succesfully opened\n");
+ DEBUG_PRINT("movie succesfully opened\n");
return AVI_ERROR_NONE;
}
diff --git a/source/blender/avi/intern/avi_intern.h b/source/blender/avi/intern/avi_intern.h
index 20de67530fd..d8595005b46 100644
--- a/source/blender/avi/intern/avi_intern.h
+++ b/source/blender/avi/intern/avi_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/avi/intern/avirgb.c b/source/blender/avi/intern/avirgb.c
index f7acbf238b5..c081960481f 100644
--- a/source/blender/avi/intern/avirgb.c
+++ b/source/blender/avi/intern/avirgb.c
@@ -1,10 +1,8 @@
-/**
- * avirgb.c
+/*
+ * $Id$
*
* This is external code. Converts rgb-type avi-s.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -51,6 +49,8 @@ void *avi_converter_from_avi_rgb (AviMovie *movie, int stream, unsigned char *bu
unsigned char *buf;
AviBitmapInfoHeader *bi;
short bits= 32;
+
+ (void)size; /* unused */
bi= (AviBitmapInfoHeader *) movie->streams[stream].sf;
if (bi) bits= bi->BitCount;
@@ -120,6 +120,8 @@ void *avi_converter_to_avi_rgb (AviMovie *movie, int stream, unsigned char *buff
int y, x, i, rowstride;
unsigned char *buf;
+ (void)stream; /* unused */
+
*size= movie->header->Height * movie->header->Width * 3;
if (movie->header->Width%2) *size+= movie->header->Height;
diff --git a/source/blender/avi/intern/avirgb.h b/source/blender/avi/intern/avirgb.h
index 2c5581387df..87998c42690 100644
--- a/source/blender/avi/intern/avirgb.h
+++ b/source/blender/avi/intern/avirgb.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/avi/intern/codecs.c b/source/blender/avi/intern/codecs.c
index c66de231b3f..3652c7294b5 100644
--- a/source/blender/avi/intern/codecs.c
+++ b/source/blender/avi/intern/codecs.c
@@ -1,10 +1,8 @@
-/**
- * codecs.c
+/*
+ * $Id$
*
* This is external code. Identify and convert different avi-files.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 282e26b3ee8..2312aec2686 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -1,11 +1,9 @@
-/**
- * endian.h
+/*
+ * $Id$
*
* This is external code. Streams bytes to output depending on the
* endianness of the system.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -30,7 +28,8 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * */
+ *
+ */
#include <stdlib.h>
#include <string.h>
@@ -206,6 +205,8 @@ void awrite (AviMovie *movie, void *datain, int block, int size, FILE *fp, int t
MEM_freeN (data);
#else /* WORDS_BIGENDIAN */
+ (void)movie; /* unused */
+ (void)type; /* unused */
fwrite (datain, block, size, fp);
#endif /* WORDS_BIGENDIAN */
}
diff --git a/source/blender/avi/intern/endian.h b/source/blender/avi/intern/endian.h
index 1c90007c049..6f81463b6da 100644
--- a/source/blender/avi/intern/endian.h
+++ b/source/blender/avi/intern/endian.h
@@ -1,10 +1,8 @@
-/**
- * endian.h
+/*
+ * $Id$
*
* This is external code.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +27,8 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * */
+ *
+ */
#ifndef AVI_ENDIAN_H
#define AVI_ENDIAN_H
diff --git a/source/blender/avi/intern/mjpeg.c b/source/blender/avi/intern/mjpeg.c
index fd7e8aaef83..c6295e2e49e 100644
--- a/source/blender/avi/intern/mjpeg.c
+++ b/source/blender/avi/intern/mjpeg.c
@@ -1,10 +1,8 @@
-/**
- * mjpeg.c
+/*
+ * $Id$
*
* This is external code. Converts between avi and mpeg/jpeg.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +27,8 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * */
+ *
+ */
#include "AVI_avi.h"
#include <stdlib.h>
@@ -144,6 +143,8 @@ static int Decode_JPEG(unsigned char *inBuffer, unsigned char *outBuffer, unsign
unsigned int y;
struct jpeg_decompress_struct dinfo;
struct jpeg_error_mgr jerr;
+
+ (void)width; /* unused */
numbytes= 0;
@@ -324,7 +325,9 @@ static void check_and_compress_jpeg(int quality, unsigned char *outbuf, unsigned
void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size) {
int deint;
unsigned char *buf;
-
+
+ (void)stream; /* unused */
+
buf= MEM_mallocN (movie->header->Height * movie->header->Width * 3, "avi.avi_converter_from_mjpeg 1");
deint= check_and_decode_jpeg(buffer, buf, movie->header->Width, movie->header->Height, *size);
@@ -374,10 +377,11 @@ void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer
/* Compression from memory */
static void jpegmemdestmgr_init_destination(j_compress_ptr cinfo) {
- ;
+ (void)cinfo; /* unused */
}
static boolean jpegmemdestmgr_empty_output_buffer(j_compress_ptr cinfo) {
+ (void)cinfo; /* unused */
return TRUE;
}
@@ -403,7 +407,7 @@ static void jpegmemdestmgr_build(j_compress_ptr cinfo, unsigned char *buffer, in
/* Decompression from memory */
static void jpegmemsrcmgr_init_source(j_decompress_ptr dinfo) {
- ;
+ (void)dinfo;
}
static boolean jpegmemsrcmgr_fill_input_buffer(j_decompress_ptr dinfo) {
diff --git a/source/blender/avi/intern/mjpeg.h b/source/blender/avi/intern/mjpeg.h
index 4609e5eaa1b..fa3b4dc8d0c 100644
--- a/source/blender/avi/intern/mjpeg.h
+++ b/source/blender/avi/intern/mjpeg.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index 15ec40ade8c..fdfdfab9722 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -1,11 +1,9 @@
-/**
- * options.h
+/*
+ * $Id$
*
* This is external code. Sets some compression related options
* (width, height quality, framerate).
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -30,7 +28,8 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * */
+ *
+ */
#include "AVI_avi.h"
#include "avi_intern.h"
@@ -41,6 +40,8 @@
AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream, AviOption option, void *opt_data) {
int i;
+ (void)stream; /* unused */
+
if (movie->header->TotalFrames != 0) /* Can't change params after we have already started writing frames */
return AVI_ERROR_OPTION;
diff --git a/source/blender/avi/intern/rgb32.c b/source/blender/avi/intern/rgb32.c
index 68e3ce4d1d2..1b1703a3cec 100644
--- a/source/blender/avi/intern/rgb32.c
+++ b/source/blender/avi/intern/rgb32.c
@@ -1,10 +1,8 @@
-/**
- * rgb32.c
+/*
+ * $Id$
*
* This is external code. Converts between rgb32 and avi.
*
- * $Id$
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +27,8 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * */
+ *
+ */
#include "AVI_avi.h"
#include <stdlib.h>
@@ -41,6 +40,8 @@ void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buff
int y, x, rowstridea, rowstrideb;
unsigned char *buf;
+ (void)stream; /* unused */
+
buf = MEM_mallocN (movie->header->Height * movie->header->Width * 3, "fromrgb32buf");
*size = movie->header->Height * movie->header->Width * 3;
@@ -65,6 +66,8 @@ void *avi_converter_to_rgb32 (AviMovie *movie, int stream, unsigned char *buffer
unsigned char *buf;
unsigned char *to, *from;
+ (void)stream; /* unused */
+
buf= MEM_mallocN (movie->header->Height * movie->header->Width * 4, "torgb32buf");
*size= movie->header->Height * movie->header->Width * 4;
diff --git a/source/blender/avi/intern/rgb32.h b/source/blender/avi/intern/rgb32.h
index e2f02f0978e..460080eaa99 100644
--- a/source/blender/avi/intern/rgb32.h
+++ b/source/blender/avi/intern/rgb32.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index 933d287bcff..e2245a9f049 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,44 +34,62 @@ struct rctf;
int BLF_init(int points, int dpi);
void BLF_exit(void);
-int BLF_load(char *name);
-int BLF_load_mem(char *name, unsigned char *mem, int mem_size);
+void BLF_cache_clear(void);
+
+int BLF_load(const char *name);
+int BLF_load_mem(const char *name, unsigned char *mem, int mem_size);
-int BLF_load_unique(char *name);
-int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size);
+int BLF_load_unique(const char *name);
+int BLF_load_mem_unique(const char *name, unsigned char *mem, int mem_size);
/* Attach a file with metrics information from memory. */
void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size);
-void BLF_aspect(int fontid, float aspect);
+void BLF_aspect(int fontid, float x, float y, float z);
void BLF_position(int fontid, float x, float y, float z);
void BLF_size(int fontid, int size, int dpi);
+/* Set a 4x4 matrix to be multiplied before draw the text.
+ * Remember that you need call BLF_enable(BLF_MATRIX)
+ * to enable this.
+ *
+ * The order of the matrix is like GL:
+
+ | m[0] m[4] m[8] m[12] |
+ | m[1] m[5] m[9] m[13] |
+ | m[2] m[6] m[10] m[14] |
+ | m[3] m[7] m[11] m[15] |
+
+ */
+void BLF_matrix(int fontid, double *m);
+
/* Draw the string using the default font, size and dpi. */
-void BLF_draw_default(float x, float y, float z, char *str);
+void BLF_draw_default(float x, float y, float z, const char *str, size_t len);
+void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len);
/* Draw the string using the current font. */
-void BLF_draw(int fontid, char *str);
+void BLF_draw(int fontid, const char *str, size_t len);
+void BLF_draw_ascii(int fontid, const char *str, size_t len);
/*
* This function return the bounding box of the string
* and are not multiplied by the aspect.
*/
-void BLF_boundbox(int fontid, char *str, struct rctf *box);
+void BLF_boundbox(int fontid, const char *str, struct rctf *box);
/*
* The next both function return the width and height
* of the string, using the current font and both value
* are multiplied by the aspect of the font.
*/
-float BLF_width(int fontid, char *str);
-float BLF_height(int fontid, char *str);
+float BLF_width(int fontid, const char *str);
+float BLF_height(int fontid, const char *str);
/*
* The following function return the width and height of the string, but
* just in one call, so avoid extra freetype2 stuff.
*/
-void BLF_width_and_height(int fontid, char *str, float *width, float *height);
+void BLF_width_and_height(int fontid, const char *str, float *width, float *height);
/*
* For fixed width fonts only, returns the width of a
@@ -84,8 +102,8 @@ float BLF_fixed_width(int fontid);
* of the string, using the default font and both value
* are multiplied by the aspect of the font.
*/
-float BLF_width_default(char *str);
-float BLF_height_default(char *str);
+float BLF_width_default(const char *str);
+float BLF_height_default(const char *str);
/*
* Set rotation for default font.
@@ -145,7 +163,7 @@ void BLF_buffer_col(int fontid, float r, float g, float b, float a);
* Draw the string into the buffer, this function draw in both buffer, float and unsigned char _BUT_
* it's not necessary set both buffer, NULL is valid here.
*/
-void BLF_draw_buffer(int fontid, char *str);
+void BLF_draw_buffer(int fontid, const char *str);
/*
* Search the path directory to the locale files, this try all
@@ -159,6 +177,8 @@ void BLF_lang_set(const char *);
/* Set the current encoding name. */
void BLF_lang_encoding_name(const char *str);
+void BLF_lang_encoding(const char *str);
+
/* Add a path to the font dir paths. */
void BLF_dir_add(const char *path);
@@ -176,5 +196,11 @@ void BLF_dir_free(char **dirs, int count);
#define BLF_CLIPPING (1<<1)
#define BLF_SHADOW (1<<2)
#define BLF_KERNING_DEFAULT (1<<3)
+#define BLF_MATRIX (1<<4)
+#define BLF_ASPECT (1<<5)
+
+// XXX, bad design
+extern int blf_mono_font;
+extern int blf_mono_font_render; // dont mess drawing with render threads.
#endif /* BLF_API_H */
diff --git a/source/blender/blenfont/BLF_types.h b/source/blender/blenfont/BLF_types.h
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/source/blender/blenfont/BLF_types.h
+++ /dev/null
diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt
index 8df40344e5e..4f211bdda17 100644
--- a/source/blender/blenfont/CMakeLists.txt
+++ b/source/blender/blenfont/CMakeLists.txt
@@ -22,22 +22,38 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- ../../../intern/guardedalloc ../blenlib ../makesdna ../editors/include
- ../blenkernel ../../../extern/glew/include .
+set(INC
+ .
+ ../blenlib
+ ../makesdna
+ ../editors/include
+ ../blenkernel
+ ../../../intern/guardedalloc
+ ../../../extern/glew/include
${FREETYPE_INCLUDE_DIRS}
)
-IF(WITH_INTERNATIONAL)
- SET(INC ${INC} ${GETTEXT_INC})
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+set(SRC
+ intern/blf.c
+ intern/blf_dir.c
+ intern/blf_font.c
+ intern/blf_glyph.c
+ intern/blf_lang.c
+ intern/blf_util.c
+
+ BLF_api.h
+ intern/blf_internal.h
+ intern/blf_internal_types.h
+)
+
+if(WITH_INTERNATIONAL)
+ list(APPEND INC ${GETTEXT_INC})
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(WIN32)
- ADD_DEFINITIONS(-D_WIN32 -DUSE_GETTEXT_DLL)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ add_definitions(-DUSE_GETTEXT_DLL)
+endif()
-BLENDERLIB(bf_blenfont "${SRC}" "${INC}")
+blender_add_lib(bf_blenfont "${SRC}" "${INC}")
diff --git a/source/blender/blenfont/Makefile b/source/blender/blenfont/Makefile
deleted file mode 100644
index df1bbb72110..00000000000
--- a/source/blender/blenfont/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2009 Blender Foundation
-# All rights reserved.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-SOURCEDIR = source/blender/blenfont
-DIRS = intern
-
-include nan_subdirs.mk
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
diff --git a/source/blender/blenfont/SConscript b/source/blender/blenfont/SConscript
index 34ffaa71c76..2763bea0da0 100644
--- a/source/blender/blenfont/SConscript
+++ b/source/blender/blenfont/SConscript
@@ -12,8 +12,8 @@ incs += ' ' + env['BF_GETTEXT_INC']
defs = []
if sys.platform == 'win32' or env['OURPLATFORM'] == 'linuxcross':
- defs.append('_WIN32')
- defs.append('USE_GETTEXT_DLL')
+ defs.append('_WIN32')
+ defs.append('USE_GETTEXT_DLL')
if env['WITH_BF_INTERNATIONAL']:
defs.append('INTERNATIONAL')
diff --git a/source/blender/blenfont/intern/Makefile b/source/blender/blenfont/intern/Makefile
deleted file mode 100644
index d3a6e656028..00000000000
--- a/source/blender/blenfont/intern/Makefile
+++ /dev/null
@@ -1,74 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2008 Blender Foundation.
-# All rights reserved.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenfont
-DIR = $(OCGDIR)/blender/blenfont
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-#CFLAGS += -O2 -Wall -Wno-char-subscripts
-
-# OpenGL and Freetype2
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-
-ifeq ($(OS), windows)
- CPPFLAGS += -I$(NAN_ICONV)/include
- ifeq ($(FREE_WINDOWS), true)
- CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
- CPPFLAGS += -DUSE_GETTEXT_DLL
- endif
-else
- CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-endif
-
-ifeq ($(OS),linux)
- ifeq ($(CPU),alpha)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),i386)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),powerpc)
- CPPFLAGS += -I/usr/src/MesaCVS/include
- endif
-endif
-
-# Modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-
-# Memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# Our own headers
-CPPFLAGS += -I..
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index f6b7c5f71e6..2a135b1fb84 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -56,15 +56,19 @@
#define BLF_MAX_FONT 16
/* Font array. */
-FontBLF *global_font[BLF_MAX_FONT];
+static FontBLF *global_font[BLF_MAX_FONT];
/* Number of font. */
-int global_font_num= 0;
+static int global_font_num= 0;
/* Default size and dpi, for BLF_draw_default. */
-int global_font_default= -1;
-int global_font_points= 11;
-int global_font_dpi= 72;
+static int global_font_default= -1;
+static int global_font_points= 11;
+static int global_font_dpi= 72;
+
+// XXX, should these be made into global_font_'s too?
+int blf_mono_font= -1;
+int blf_mono_font_render= -1;
static FontBLF *BLF_get(int fontid)
{
@@ -99,7 +103,19 @@ void BLF_exit(void)
blf_font_exit();
}
-static int blf_search(char *name)
+void BLF_cache_clear(void)
+{
+ FontBLF *font;
+ int i;
+
+ for (i= 0; i < global_font_num; i++) {
+ font= global_font[i];
+ if (font)
+ blf_glyph_cache_clear(font);
+ }
+}
+
+static int blf_search(const char *name)
{
FontBLF *font;
int i;
@@ -112,7 +128,7 @@ static int blf_search(char *name)
return(-1);
}
-int BLF_load(char *name)
+int BLF_load(const char *name)
{
FontBLF *font;
char *filename;
@@ -124,7 +140,7 @@ int BLF_load(char *name)
/* check if we already load this font. */
i= blf_search(name);
if (i >= 0) {
- font= global_font[i];
+ /*font= global_font[i];*/ /*UNUSED*/
return(i);
}
@@ -153,7 +169,7 @@ int BLF_load(char *name)
return(i);
}
-int BLF_load_unique(char *name)
+int BLF_load_unique(const char *name)
{
FontBLF *font;
char *filename;
@@ -199,7 +215,7 @@ void BLF_metrics_attach(int fontid, unsigned char *mem, int mem_size)
blf_font_attach_from_mem(font, mem, mem_size);
}
-int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
+int BLF_load_mem(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
int i;
@@ -209,7 +225,7 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
i= blf_search(name);
if (i >= 0) {
- font= global_font[i];
+ /*font= global_font[i];*/ /*UNUSED*/
return(i);
}
@@ -235,7 +251,7 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
return(i);
}
-int BLF_load_mem_unique(char *name, unsigned char *mem, int mem_size)
+int BLF_load_mem_unique(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
int i;
@@ -305,36 +321,71 @@ void BLF_disable_default(int option)
font->flags &= ~option;
}
-void BLF_aspect(int fontid, float aspect)
+void BLF_aspect(int fontid, float x, float y, float z)
{
FontBLF *font;
font= BLF_get(fontid);
- if (font)
- font->aspect= aspect;
+ if (font) {
+ font->aspect[0]= x;
+ font->aspect[1]= y;
+ font->aspect[2]= z;
+ }
+}
+
+void BLF_matrix(int fontid, double *m)
+{
+ FontBLF *font;
+ int i;
+
+ font= BLF_get(fontid);
+ if (font) {
+ for (i= 0; i < 16; i++)
+ font->m[i]= m[i];
+ }
}
void BLF_position(int fontid, float x, float y, float z)
{
FontBLF *font;
float remainder;
+ float xa, ya, za;
font= BLF_get(fontid);
if (font) {
+ if (font->flags & BLF_ASPECT) {
+ xa= font->aspect[0];
+ ya= font->aspect[1];
+ za= font->aspect[2];
+ }
+ else {
+ xa= 1.0f;
+ ya= 1.0f;
+ za= 1.0f;
+ }
+
remainder= x - floor(x);
if (remainder > 0.4 && remainder < 0.6) {
if (remainder < 0.5)
- x -= 0.1 * font->aspect;
+ x -= 0.1 * xa;
else
- x += 0.1 * font->aspect;
+ x += 0.1 * xa;
}
remainder= y - floor(y);
if (remainder > 0.4 && remainder < 0.6) {
if (remainder < 0.5)
- y -= 0.1 * font->aspect;
+ y -= 0.1 * ya;
+ else
+ y += 0.1 * ya;
+ }
+
+ remainder= z - floor(z);
+ if (remainder > 0.4 && remainder < 0.6) {
+ if (remainder < 0.5)
+ z -= 0.1 * za;
else
- y += 0.1 * font->aspect;
+ z += 0.1 * za;
}
font->pos[0]= x;
@@ -361,7 +412,7 @@ void BLF_blur(int fontid, int size)
font->blur= size;
}
-void BLF_draw_default(float x, float y, float z, char *str)
+void BLF_draw_default(float x, float y, float z, const char *str, size_t len)
{
if (!str)
return;
@@ -376,7 +427,26 @@ void BLF_draw_default(float x, float y, float z, char *str)
BLF_size(global_font_default, global_font_points, global_font_dpi);
BLF_position(global_font_default, x, y, z);
- BLF_draw(global_font_default, str);
+ BLF_draw(global_font_default, str, len);
+}
+
+/* same as above but call 'BLF_draw_ascii' */
+void BLF_draw_default_ascii(float x, float y, float z, const char *str, size_t len)
+{
+ if (!str)
+ return;
+
+ if (global_font_default == -1)
+ global_font_default= blf_search("default");
+
+ if (global_font_default == -1) {
+ printf("Warning: Can't found default font!!\n");
+ return;
+ }
+
+ BLF_size(global_font_default, global_font_points, global_font_dpi);
+ BLF_position(global_font_default, x, y, z);
+ BLF_draw_ascii(global_font_default, str, len); /* XXX, use real length */
}
void BLF_rotation_default(float angle)
@@ -388,36 +458,59 @@ void BLF_rotation_default(float angle)
font->angle= angle;
}
-void BLF_draw(int fontid, char *str)
+static void blf_draw__start(FontBLF *font)
{
- FontBLF *font;
-
/*
* The pixmap alignment hack is handle
* in BLF_position (old ui_rasterpos_safe).
*/
- font= BLF_get(fontid);
- if (font) {
- glEnable(GL_BLEND);
- glEnable(GL_TEXTURE_2D);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glPushMatrix();
- glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
- glScalef(font->aspect, font->aspect, 1.0);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glPushMatrix();
+
+ if (font->flags & BLF_MATRIX)
+ glMultMatrixd((GLdouble *)&font->m);
+
+ glTranslatef(font->pos[0], font->pos[1], font->pos[2]);
+
+ if (font->flags & BLF_ASPECT)
+ glScalef(font->aspect[0], font->aspect[1], font->aspect[2]);
+
+ if (font->flags & BLF_ROTATION)
+ glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+}
- if (font->flags & BLF_ROTATION)
- glRotatef(font->angle, 0.0f, 0.0f, 1.0f);
+static void blf_draw__end(void)
+{
+ glPopMatrix();
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+}
- blf_font_draw(font, str);
+void BLF_draw(int fontid, const char *str, size_t len)
+{
+ FontBLF *font= BLF_get(fontid);
+ if (font) {
+ blf_draw__start(font);
+ blf_font_draw(font, str, len);
+ blf_draw__end();
+ }
+}
- glPopMatrix();
- glDisable(GL_BLEND);
- glDisable(GL_TEXTURE_2D);
+void BLF_draw_ascii(int fontid, const char *str, size_t len)
+{
+ FontBLF *font= BLF_get(fontid);
+ if (font) {
+ blf_draw__start(font);
+ blf_font_draw_ascii(font, str, len);
+ blf_draw__end();
}
}
-void BLF_boundbox(int fontid, char *str, rctf *box)
+void BLF_boundbox(int fontid, const char *str, rctf *box)
{
FontBLF *font;
@@ -426,7 +519,7 @@ void BLF_boundbox(int fontid, char *str, rctf *box)
blf_font_boundbox(font, str, box);
}
-void BLF_width_and_height(int fontid, char *str, float *width, float *height)
+void BLF_width_and_height(int fontid, const char *str, float *width, float *height)
{
FontBLF *font;
@@ -435,7 +528,7 @@ void BLF_width_and_height(int fontid, char *str, float *width, float *height)
blf_font_width_and_height(font, str, width, height);
}
-float BLF_width(int fontid, char *str)
+float BLF_width(int fontid, const char *str)
{
FontBLF *font;
@@ -455,7 +548,7 @@ float BLF_fixed_width(int fontid)
return(0.0f);
}
-float BLF_width_default(char *str)
+float BLF_width_default(const char *str)
{
float width;
@@ -472,7 +565,7 @@ float BLF_width_default(char *str)
return(width);
}
-float BLF_height(int fontid, char *str)
+float BLF_height(int fontid, const char *str)
{
FontBLF *font;
@@ -482,7 +575,7 @@ float BLF_height(int fontid, char *str)
return(0.0f);
}
-float BLF_height_default(char *str)
+float BLF_height_default(const char *str)
{
float height;
@@ -586,7 +679,7 @@ void BLF_buffer_col(int fontid, float r, float g, float b, float a)
}
}
-void BLF_draw_buffer(int fontid, char *str)
+void BLF_draw_buffer(int fontid, const char *str)
{
FontBLF *font;
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index e650586aa9c..8f816fac3ee 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,6 +44,7 @@
#include "BIF_gl.h"
+#include "BLF_api.h"
#include "blf_internal_types.h"
static ListBase global_font_dir= { NULL, NULL };
@@ -121,24 +122,20 @@ void BLF_dir_free(char **dirs, int count)
MEM_freeN(dirs);
}
-char *blf_dir_search(char *file)
+char *blf_dir_search(const char *file)
{
DirBLF *dir;
char full_path[FILE_MAXDIR+FILE_MAXFILE];
- char *s;
-
- dir= global_font_dir.first;
- s= NULL;
- while (dir) {
- BLI_join_dirfile(full_path, dir->path, file);
+ char *s= NULL;
+
+ for(dir=global_font_dir.first; dir; dir= dir->next) {
+ BLI_join_dirfile(full_path, sizeof(full_path), dir->path, file);
if (BLI_exist(full_path)) {
- s= (char *)MEM_mallocN(strlen(full_path)+1,"blf_dir_search");
- strcpy(s, full_path);
+ s= BLI_strdup(full_path);
break;
}
- dir= dir->next;
}
-
+
if (!s) {
/* check the current directory, why not ? */
if (BLI_exist(file))
@@ -175,7 +172,7 @@ int blf_dir_split(const char *str, char *file, int *size)
/* Some font have additional file with metrics information,
* in general, the extension of the file is: .afm or .pfm
*/
-char *blf_dir_metrics_search(char *filename)
+char *blf_dir_metrics_search(const char *filename)
{
char *mfile;
char *s;
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index a932682b027..733352286b9 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -52,17 +52,17 @@
#include "blf_internal.h"
-/* freetype2 handle. */
-FT_Library global_ft_lib;
+/* freetype2 handle ONLY for this file!. */
+static FT_Library ft_lib;
int blf_font_init(void)
{
- return(FT_Init_FreeType(&global_ft_lib));
+ return(FT_Init_FreeType(&ft_lib));
}
void blf_font_exit(void)
{
- FT_Done_FreeType(global_ft_lib);
+ FT_Done_FreeType(ft_lib);
}
void blf_font_size(FontBLF *font, int size, int dpi)
@@ -92,7 +92,7 @@ void blf_font_size(FontBLF *font, int size, int dpi)
}
}
-void blf_font_draw(FontBLF *font, char *str)
+void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
{
unsigned int c;
GlyphBLF *g, *g_prev;
@@ -110,7 +110,7 @@ void blf_font_draw(FontBLF *font, char *str)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- while (str[i]) {
+ while (str[i] && i < len) {
c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
@@ -146,7 +146,65 @@ void blf_font_draw(FontBLF *font, char *str)
}
}
-void blf_font_buffer(FontBLF *font, char *str)
+/* faster version of blf_font_draw, ascii only for view dimensions */
+void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
+{
+ char c;
+ GlyphBLF *g, *g_prev;
+ FT_Vector delta;
+ FT_UInt glyph_index;
+ int pen_x, pen_y;
+ int i, has_kerning, st;
+
+ if (!font->glyph_cache)
+ return;
+
+ pen_x= 0;
+ pen_y= 0;
+ has_kerning= FT_HAS_KERNING(font->face);
+ g_prev= NULL;
+
+ /* build ascii on demand */
+ if(font->glyph_ascii_table['0']==NULL) {
+ for(i=0; i<256; i++) {
+ g= blf_glyph_search(font->glyph_cache, i);
+ if (!g) {
+ glyph_index= FT_Get_Char_Index(font->face, i);
+ g= blf_glyph_add(font, glyph_index, i);
+ }
+ font->glyph_ascii_table[i]= g;
+ }
+ }
+
+ while ((c= *(str++)) && len--) {
+ g= font->glyph_ascii_table[c];
+
+ /* if we don't found a glyph, skip it. */
+ if (!g)
+ continue;
+
+ if (has_kerning && g_prev) {
+ delta.x= 0;
+ delta.y= 0;
+
+ if (font->flags & BLF_KERNING_DEFAULT)
+ st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, ft_kerning_default, &delta);
+ else
+ st= FT_Get_Kerning(font->face, g_prev->idx, g->idx, FT_KERNING_UNFITTED, &delta);
+
+ if (st == 0)
+ pen_x += delta.x >> 6;
+ }
+
+ /* do not return this loop if clipped, we want every character tested */
+ blf_glyph_render(font, g, (float)pen_x, (float)pen_y);
+
+ pen_x += g->advance;
+ g_prev= g;
+ }
+}
+
+void blf_font_buffer(FontBLF *font, const char *str)
{
unsigned char *cbuf;
unsigned int c;
@@ -155,7 +213,7 @@ void blf_font_buffer(FontBLF *font, char *str)
FT_Vector delta;
FT_UInt glyph_index;
float a, *fbuf;
- int pen_x, pen_y, y, x, yb, diff;
+ int pen_x, y, x, yb;
int i, has_kerning, st, chx, chy;
if (!font->glyph_cache || (!font->b_fbuf && !font->b_cbuf))
@@ -163,7 +221,6 @@ void blf_font_buffer(FontBLF *font, char *str)
i= 0;
pen_x= (int)font->pos[0];
- pen_y= (int)font->pos[1];
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
@@ -172,6 +229,7 @@ void blf_font_buffer(FontBLF *font, char *str)
b_col_char[2]= font->b_col[2] * 255;
while (str[i]) {
+ int pen_y;
c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
@@ -200,25 +258,15 @@ void blf_font_buffer(FontBLF *font, char *str)
}
chx= pen_x + ((int)g->pos_x);
- diff= g->height - ((int)g->pos_y);
- if (diff > 0) {
- if (g->pitch < 0)
- pen_y += diff;
- else
- pen_y -= diff;
+ chy= (int)font->pos[1] + g->height;
+
+ if (g->pitch < 0) {
+ pen_y = (int)font->pos[1] + (g->height - (int)g->pos_y);
}
- else if (diff < 0) {
- if (g->pitch < 0)
- pen_y -= diff;
- else
- pen_y += diff;
+ else {
+ pen_y = (int)font->pos[1] - (g->height - (int)g->pos_y);
}
- if (g->pitch < 0)
- chy= pen_y - ((int)g->pos_y);
- else
- chy= pen_y + ((int)g->pos_y);
-
if ((chx + g->width) >= 0 && chx < font->bw && (pen_y + g->height) >= 0 && pen_y < font->bh) {
/* dont draw beyond the buffer bounds */
int width_clip= g->width;
@@ -285,25 +333,12 @@ void blf_font_buffer(FontBLF *font, char *str)
}
}
- if (diff > 0) {
- if (g->pitch < 0)
- pen_x -= diff;
- else
- pen_y += diff;
- }
- else if (diff < 0) {
- if (g->pitch < 0)
- pen_x += diff;
- else
- pen_y -= diff;
- }
-
pen_x += g->advance;
g_prev= g;
}
}
-void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
+void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
{
unsigned int c;
GlyphBLF *g, *g_prev;
@@ -382,37 +417,59 @@ void blf_font_boundbox(FontBLF *font, char *str, rctf *box)
}
}
-void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height)
+void blf_font_width_and_height(FontBLF *font, const char *str, float *width, float *height)
{
+ float xa, ya;
rctf box;
if (font->glyph_cache) {
+ if (font->flags & BLF_ASPECT) {
+ xa= font->aspect[0];
+ ya= font->aspect[1];
+ }
+ else {
+ xa= 1.0f;
+ ya= 1.0f;
+ }
+
blf_font_boundbox(font, str, &box);
- *width= ((box.xmax - box.xmin) * font->aspect);
- *height= ((box.ymax - box.ymin) * font->aspect);
+ *width= ((box.xmax - box.xmin) * xa);
+ *height= ((box.ymax - box.ymin) * ya);
}
}
-float blf_font_width(FontBLF *font, char *str)
+float blf_font_width(FontBLF *font, const char *str)
{
+ float xa;
rctf box;
if (!font->glyph_cache)
return(0.0f);
+ if (font->flags & BLF_ASPECT)
+ xa= font->aspect[0];
+ else
+ xa= 1.0f;
+
blf_font_boundbox(font, str, &box);
- return((box.xmax - box.xmin) * font->aspect);
+ return((box.xmax - box.xmin) * xa);
}
-float blf_font_height(FontBLF *font, char *str)
+float blf_font_height(FontBLF *font, const char *str)
{
+ float ya;
rctf box;
if (!font->glyph_cache)
return(0.0f);
+ if (font->flags & BLF_ASPECT)
+ ya= font->aspect[1];
+ else
+ ya= 1.0f;
+
blf_font_boundbox(font, str, &box);
- return((box.ymax - box.ymin) * font->aspect);
+ return((box.ymax - box.ymin) * ya);
}
float blf_font_fixed_width(FontBLF *font)
@@ -457,11 +514,18 @@ void blf_font_free(FontBLF *font)
static void blf_font_fill(FontBLF *font)
{
- font->aspect= 1.0f;
+ int i;
+
+ font->aspect[0]= 1.0f;
+ font->aspect[1]= 1.0f;
+ font->aspect[2]= 1.0f;
font->pos[0]= 0.0f;
font->pos[1]= 0.0f;
font->angle= 0.0f;
- unit_m4(font->mat);
+
+ for (i= 0; i < 16; i++)
+ font->m[i]= 0;
+
font->clip_rec.xmin= 0.0f;
font->clip_rec.xmax= 0.0f;
font->clip_rec.ymin= 0.0f;
@@ -483,16 +547,19 @@ static void blf_font_fill(FontBLF *font)
font->b_col[1]= 0;
font->b_col[2]= 0;
font->b_col[3]= 0;
+ font->ft_lib= ft_lib;
+
+ memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
}
-FontBLF *blf_font_new(char *name, char *filename)
+FontBLF *blf_font_new(const char *name, const char *filename)
{
FontBLF *font;
FT_Error err;
char *mfile;
font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new");
- err= FT_New_Face(global_ft_lib, filename, 0, &font->face);
+ err= FT_New_Face(ft_lib, filename, 0, &font->face);
if (err) {
MEM_freeN(font);
return(NULL);
@@ -528,13 +595,13 @@ void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_s
FT_Attach_Stream(font->face, &open);
}
-FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size)
+FontBLF *blf_font_new_from_mem(const char *name, unsigned char *mem, int mem_size)
{
FontBLF *font;
FT_Error err;
font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new_from_mem");
- err= FT_New_Memory_Face(global_ft_lib, mem, mem_size, 0, &font->face);
+ err= FT_New_Memory_Face(ft_lib, mem, mem_size, 0, &font->face);
if (err) {
MEM_freeN(font);
return(NULL);
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index 0d694c28b2b..b1cc4ba3084 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,10 +36,12 @@
#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_OUTLINE_H
+#include FT_BITMAP_H
#include "MEM_guardedalloc.h"
#include "DNA_vec_types.h"
+#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
@@ -113,6 +115,23 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
return(gc);
}
+void blf_glyph_cache_clear(FontBLF *font)
+{
+ GlyphCacheBLF *gc;
+ GlyphBLF *g;
+ int i;
+
+ for(gc=font->cache.first; gc; gc=gc->next) {
+ for (i= 0; i < 257; i++) {
+ while (gc->bucket[i].first) {
+ g= gc->bucket[i].first;
+ BLI_remlink(&(gc->bucket[i]), g);
+ blf_glyph_free(g);
+ }
+ }
+ }
+}
+
void blf_glyph_cache_free(GlyphCacheBLF *gc)
{
GlyphBLF *g;
@@ -185,12 +204,13 @@ GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
return(NULL);
}
-GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
+GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c)
{
FT_GlyphSlot slot;
GlyphBLF *g;
FT_Error err;
- FT_Bitmap bitmap;
+ FT_Bitmap bitmap, tempbitmap;
+ int sharp = (U.text_render & USER_TEXT_DISABLE_AA);
FT_BBox bbox;
unsigned int key;
@@ -198,14 +218,29 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
if (g)
return(g);
- err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP);
+ if (sharp)
+ err = FT_Load_Glyph(font->face, (FT_UInt)index, FT_LOAD_TARGET_MONO);
+ else
+ err = FT_Load_Glyph(font->face, (FT_UInt)index, FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP); /* Sure about NO_* flags? */
if (err)
return(NULL);
/* get the glyph. */
slot= font->face->glyph;
- err= FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
+ if (sharp) {
+ err = FT_Render_Glyph(slot, FT_RENDER_MODE_MONO);
+
+ /* Convert result from 1 bit per pixel to 8 bit per pixel */
+ /* Accum errors for later, fine if not interested beyond "ok vs any error" */
+ FT_Bitmap_New(&tempbitmap);
+ err += FT_Bitmap_Convert(font->ft_lib, &slot->bitmap, &tempbitmap, 1); /* Does Blender use Pitch 1 always? It works so far */
+ err += FT_Bitmap_Copy(font->ft_lib, &tempbitmap, &slot->bitmap);
+ err += FT_Bitmap_Done(font->ft_lib, &tempbitmap);
+ } else {
+ err = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
+ }
+
if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
return(NULL);
@@ -213,7 +248,7 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
g->next= NULL;
g->prev= NULL;
g->c= c;
- g->idx= index;
+ g->idx= (FT_UInt)index;
g->tex= 0;
g->build_tex= 0;
g->bitmap= NULL;
@@ -228,6 +263,14 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
g->height= bitmap.rows;
if (g->width && g->height) {
+ if (sharp) {
+ /* Font buffer uses only 0 or 1 values, Blender expects full 0..255 range */
+ int i;
+ for (i=0; i < (g->width * g->height); i++) {
+ bitmap.buffer[i] = 255 * bitmap.buffer[i];
+ }
+ }
+
g->bitmap= (unsigned char *)MEM_mallocN(g->width * g->height, "glyph bitmap");
memcpy((void *)g->bitmap, (void *)bitmap.buffer, g->width * g->height);
}
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index 844a7a3c3de..d07b2605575 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,39 +28,46 @@
#ifndef BLF_INTERNAL_H
#define BLF_INTERNAL_H
+struct FontBLF;
+struct GlyphBLF;
+struct GlyphCacheBLF;
+struct rctf;
+
unsigned int blf_next_p2(unsigned int x);
unsigned int blf_hash(unsigned int val);
int blf_utf8_next(unsigned char *buf, int *iindex);
char *blf_dir_search(const char *file);
-char *blf_dir_metrics_search(char *filename);
+char *blf_dir_metrics_search(const char *filename);
int blf_dir_split(const char *str, char *file, int *size);
int blf_font_init(void);
void blf_font_exit(void);
-FontBLF *blf_font_new(char *name, char *filename);
-FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size);
-void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_size);
+struct FontBLF *blf_font_new(const char *name, const char *filename);
+struct FontBLF *blf_font_new_from_mem(const char *name, unsigned char *mem, int mem_size);
+void blf_font_attach_from_mem(struct FontBLF *font, const unsigned char *mem, int mem_size);
-void blf_font_size(FontBLF *font, int size, int dpi);
-void blf_font_draw(FontBLF *font, char *str);
-void blf_font_buffer(FontBLF *font, char *str);
-void blf_font_boundbox(FontBLF *font, char *str, rctf *box);
-void blf_font_width_and_height(FontBLF *font, char *str, float *width, float *height);
-float blf_font_width(FontBLF *font, char *str);
-float blf_font_height(FontBLF *font, char *str);
-float blf_font_fixed_width(FontBLF *font);
-void blf_font_free(FontBLF *font);
+void blf_font_size(struct FontBLF *font, int size, int dpi);
+void blf_font_draw(struct FontBLF *font, const char *str, unsigned int len);
+void blf_font_draw_ascii(struct FontBLF *font, const char *str, unsigned int len);
+void blf_font_buffer(struct FontBLF *font, const char *str);
+void blf_font_boundbox(struct FontBLF *font, const char *str, struct rctf *box);
+void blf_font_width_and_height(struct FontBLF *font, const char *str, float *width, float *height);
+float blf_font_width(struct FontBLF *font, const char *str);
+float blf_font_height(struct FontBLF *font, const char *str);
+float blf_font_fixed_width(struct FontBLF *font);
+void blf_font_free(struct FontBLF *font);
-GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi);
-GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font);
-void blf_glyph_cache_free(GlyphCacheBLF *gc);
+struct GlyphCacheBLF *blf_glyph_cache_find(struct FontBLF *font, int size, int dpi);
+struct GlyphCacheBLF *blf_glyph_cache_new(struct FontBLF *font);
+void blf_glyph_cache_clear(struct FontBLF *font);
+void blf_glyph_cache_free(struct GlyphCacheBLF *gc);
-GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c);
-GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c);
+struct GlyphBLF *blf_glyph_search(struct GlyphCacheBLF *gc, unsigned int c);
+struct GlyphBLF *blf_glyph_add(struct FontBLF *font, unsigned int index, unsigned int c);
-void blf_glyph_free(GlyphBLF *g);
-int blf_glyph_render(FontBLF *font, GlyphBLF *g, float x, float y);
+void blf_glyph_free(struct GlyphBLF *g);
+int blf_glyph_render(struct FontBLF *font, struct GlyphBLF *g, float x, float y);
#endif /* BLF_INTERNAL_H */
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index 368eb8751de..d12487b5c8b 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -133,7 +133,7 @@ typedef struct FontBLF {
char *filename;
/* aspect ratio or scale. */
- float aspect;
+ float aspect[3];
/* initial position for draw the text. */
float pos[3];
@@ -154,8 +154,10 @@ typedef struct FontBLF {
/* shadow color. */
float shadow_col[4];
- /* this is the matrix that we load before rotate/scale/translate. */
- float mat[4][4];
+ /* Multiplied this matrix with the current one before
+ * draw the text! see blf_draw__start.
+ */
+ double m[16];
/* clipping rectangle. */
rctf clip_rec;
@@ -177,6 +179,12 @@ typedef struct FontBLF {
/* current glyph cache, size and dpi. */
GlyphCacheBLF *glyph_cache;
+
+ /* fast ascii lookip */
+ GlyphBLF *glyph_ascii_table[256];
+
+ /* freetype2 lib handle. */
+ FT_Library ft_lib;
/* freetype2 face. */
FT_Face face;
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 7054d955faf..da0b767f64d 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,8 @@
#include <stdlib.h>
#include <string.h>
+#include "BLF_api.h"
+
#ifdef INTERNATIONAL
#include <locale.h>
@@ -38,15 +40,15 @@
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
+#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BLI_path_util.h"
#ifdef __APPLE__
-#include "BKE_utildefines.h"
+
#endif
#define DOMAIN_NAME "blender"
@@ -54,9 +56,9 @@
#define FONT_SIZE_DEFAULT 12
/* locale options. */
-char global_messagepath[1024];
-char global_language[32];
-char global_encoding_name[32];
+static char global_messagepath[1024];
+static char global_language[32];
+static char global_encoding_name[32];
void BLF_lang_init(void)
@@ -69,43 +71,45 @@ void BLF_lang_init(void)
BLI_strncpy(global_messagepath, messagepath, sizeof(global_messagepath));
else
global_messagepath[0]= '\0';
+
}
-
+/* XXX WARNING!!! IN osx somehow the previous function call jumps in this one??? (ton, ppc) */
void BLF_lang_set(const char *str)
{
+ if(str==NULL) {
+ return;
+ }
+ else {
+
#if defined (_WIN32) || defined(__APPLE__)
- BLI_setenv("LANG", str);
+ BLI_setenv("LANG", str);
#else
- char *locreturn= setlocale(LC_ALL, str);
- if (locreturn == NULL) {
- char *lang;
-
- lang= (char*)malloc(sizeof(char)*(strlen(str)+7));
+ char *locreturn= setlocale(LC_ALL, str);
+ if (locreturn == NULL) {
+ char *lang= BLI_sprintfN("%s.UTF-8", str);
- lang[0]= '\0';
- strcat(lang, str);
- strcat(lang, ".UTF-8");
+ locreturn= setlocale(LC_ALL, lang);
+ if (locreturn == NULL) {
+ printf("could not change language to %s nor %s\n", str, lang);
+ }
- locreturn= setlocale(LC_ALL, lang);
- if (locreturn == NULL) {
- printf("could not change language to %s nor %s\n", str, lang);
+ MEM_freeN(lang);
}
- free(lang);
- }
-
- setlocale(LC_NUMERIC, "C");
+ setlocale(LC_NUMERIC, "C");
#endif
- textdomain(DOMAIN_NAME);
- bindtextdomain(DOMAIN_NAME, global_messagepath);
- /* bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name); */
- strcpy(global_language, str);
+ textdomain(DOMAIN_NAME);
+ bindtextdomain(DOMAIN_NAME, global_messagepath);
+ /* bind_textdomain_codeset(DOMAIN_NAME, global_encoding_name); */
+ BLI_strncpy(global_language, str, sizeof(global_language));
+
+ }
}
void BLF_lang_encoding(const char *str)
{
- strcpy(global_encoding_name, str);
+ BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name));
/* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */
}
@@ -116,13 +120,15 @@ void BLF_lang_init(void)
return;
}
-void BLF_lang_encoding(char *str)
+void BLF_lang_encoding(const char *str)
{
+ (void)str;
return;
}
-void BLF_lang_set(char *str)
+void BLF_lang_set(const char *str)
{
+ (void)str;
return;
}
diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c
index 30e6e3fd3f5..640876954ab 100644
--- a/source/blender/blenfont/intern/blf_util.c
+++ b/source/blender/blenfont/intern/blf_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <string.h>
+#include "blf_internal.h"
unsigned int blf_next_p2(unsigned int x)
{
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 9ef4ffe52df..ea5b9e8367f 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -69,17 +69,6 @@
* as it is and stick with using BMesh and CDDM.
*/
-/* TODO (Probably)
- *
- * o Make drawMapped* functions take a predicate function that
- * determines whether to draw the edge (this predicate can
- * also set color, etc). This will be slightly more general
- * and allow some of the functions to be collapsed.
- * o Once accessor functions are added then single element draw
- * functions can be implemented using primitive accessors.
- * o Add function to dispatch to renderer instead of using
- * conversion to DLM.
- */
#include "DNA_customdata_types.h"
#include "DNA_meshdata_types.h"
@@ -382,7 +371,8 @@ struct DerivedMesh {
void (*drawMappedFaces)(DerivedMesh *dm,
int (*setDrawOptions)(void *userData, int index,
int *drawSmooth_r),
- void *userData, int useColors);
+ void *userData, int useColors,
+ int (*setMaterial)(int, void *attribs));
/* Draw mapped faces using MTFace
* o Drawing options too complicated to enumerate, look at code.
@@ -606,6 +596,7 @@ DerivedMesh *getEditDerivedBMesh(struct BMEditMesh *em, struct Object *ob,
DerivedMesh *mesh_create_derived_index_render(struct Scene *scene, struct Object *ob, CustomDataMask dataMask, int index);
/* same as above but wont use render settings */
+DerivedMesh *mesh_create_derived(struct Mesh *me, struct Object *ob, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_view(struct Scene *scene, struct Object *ob,
CustomDataMask dataMask);
DerivedMesh *mesh_create_derived_no_deform(struct Scene *scene, struct Object *ob,
@@ -617,13 +608,18 @@ DerivedMesh *mesh_create_derived_no_deform_render(struct Scene *scene, struct Ob
/* for gameengine */
DerivedMesh *mesh_create_derived_no_virtual(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
CustomDataMask dataMask);
+DerivedMesh *mesh_create_derived_physics(struct Scene *scene, struct Object *ob, float (*vertCos)[3],
+ CustomDataMask dataMask);
+DerivedMesh *editbmesh_get_derived(struct BMEditMesh *em, float (*vertexCos)[3]);
DerivedMesh *editbmesh_get_derived_base(struct Object *, struct BMEditMesh *em);
DerivedMesh *editbmesh_get_derived_cage(struct Scene *scene, struct Object *,
struct BMEditMesh *em, CustomDataMask dataMask);
DerivedMesh *editbmesh_get_derived_cage_and_final(struct Scene *scene, struct Object *,
struct BMEditMesh *em, DerivedMesh **final_r,
CustomDataMask dataMask);
+float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *numVerts_r))[3];
+int editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *em, CustomDataMask dataMask);
/* returns an array of deform matrices for crazyspace correction, and the
@@ -631,6 +627,11 @@ void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *
int editbmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct BMEditMesh *em,
float (**deformmats)[3][3], float (**deformcos)[3]);
+/* returns an array of deform matrices for crazyspace correction when sculpting,
+ and the number of modifiers left */
+int sculpt_get_deform_matrices(struct Scene *scene, struct Object *ob,
+ float (**deformmats)[3][3], float (**deformcos)[3]);
+
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
/* convert layers requested by a GLSL material to actually available layers in
@@ -647,7 +648,7 @@ typedef struct DMVertexAttribs {
} mcol[MAX_MCOL];
struct {
- float (*array)[3];
+ float (*array)[4];
int emOffset, glIndex;
} tang;
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 4d3f000c863..59da97d8b09 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -1,9 +1,4 @@
-/* BKE_action.h May 2001
- *
- * Blender kernel action and pose functionality
- *
- * Reevan McKay
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +28,14 @@
#ifndef BKE_ACTION_H
#define BKE_ACTION_H
+/** \file BKE_action.h
+ * \ingroup bke
+ * \brief Blender kernel action and pose functionality.
+ * \author Reevan McKay
+ * \author Ton Roosendaal (full recode 2005)
+ * \author Joshua Leung (full recode 2009)
+ * \since may 2001
+ */
#include "DNA_listBase.h"
@@ -117,6 +120,8 @@ void action_groups_remove_channel(struct bAction *act, struct FCurve *fcu);
/* Find a group with the given name */
struct bActionGroup *action_groups_find_named(struct bAction *act, const char name[]);
+/* Clear all 'temp' flags on all groups */
+void action_groups_clear_tempflags(struct bAction *act);
/* Pose API ----------------- */
diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h
index e82eb0ed0c9..25165eeaee7 100644
--- a/source/blender/blenkernel/BKE_anim.h
+++ b/source/blender/blenkernel/BKE_anim.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_anim.h (mar-2001 nzc);
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_ANIM_H
#define BKE_ANIM_H
+/** \file BKE_anim.h
+ * \ingroup bke
+ * \author nzc
+ * \since March 2001
+ */
struct Path;
struct Object;
struct PartEff;
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index af5e31b1efa..a469d05ee26 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
#ifndef BKE_ANIM_SYS_H
#define BKE_ANIM_SYS_H
+/** \file BKE_animsys.h
+ * \ingroup bke
+ * \author Joshua Leung
+ */
+
struct ID;
struct ListBase;
struct Main;
@@ -56,10 +61,13 @@ struct AnimData *BKE_id_add_animdata(struct ID *id);
void BKE_free_animdata(struct ID *id);
/* Copy AnimData */
-struct AnimData *BKE_copy_animdata(struct AnimData *adt);
+struct AnimData *BKE_copy_animdata(struct AnimData *adt, const short do_action);
/* Copy AnimData */
-int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from);
+int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from, const short do_action);
+
+/* Copy AnimData Actions */
+void BKE_copy_animdata_id_action(struct ID *id);
/* Make Local */
void BKE_animdata_make_local(struct AnimData *adt);
@@ -92,11 +100,19 @@ void BKE_keyingsets_free(struct ListBase *list);
/* Path Fixing API */
/* Fix all the paths for the given ID+AnimData */
-void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths);
+void BKE_animdata_fix_paths_rename(struct ID *owner_id, struct AnimData *adt, const char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths);
/* Fix all the paths for the entire database... */
void BKE_all_animdata_fix_paths_rename(char *prefix, char *oldName, char *newName);
+/* -------------------------------------- */
+
+/* Move animation data from src to destination if it's paths are based on basepaths */
+void BKE_animdata_separate_by_basepath(struct ID *srcID, struct ID *dstID, struct ListBase *basepaths);
+
+/* Move F-Curves from src to destination if it's path is based on basepath */
+void action_move_fcurves_by_basepath(struct bAction *srcAct, struct bAction *dstAct, const char basepath[]);
+
/* ************************************* */
/* Batch AnimData API */
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 242de4d788b..efa87532859 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_armature.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_ARMATURE_H
#define BKE_ARMATURE_H
+/** \file BKE_armature.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
struct Bone;
struct Main;
struct bArmature;
@@ -73,14 +77,14 @@ typedef struct PoseTree
extern "C" {
#endif
-struct bArmature *add_armature(char *name);
+struct bArmature *add_armature(const char *name);
struct bArmature *get_armature(struct Object *ob);
void free_bonelist (struct ListBase *lb);
void free_armature(struct bArmature *arm);
void make_local_armature(struct bArmature *arm);
struct bArmature *copy_armature(struct bArmature *arm);
-int bone_autoside_name (char *name, int strip_number, short axis, float head, float tail);
+int bone_autoside_name (char name[32], int strip_number, short axis, float head, float tail);
struct Bone *get_named_bone (struct bArmature *arm, const char *name);
@@ -91,6 +95,7 @@ void where_is_armature_bone(struct Bone *bone, struct Bone *prevbone);
void armature_rebuild_pose(struct Object *ob, struct bArmature *arm);
void where_is_pose (struct Scene *scene, struct Object *ob);
void where_is_pose_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, int do_extra);
+void where_is_pose_bone_tail(struct bPoseChannel *pchan);
/* get_objectspace_bone_matrix has to be removed still */
void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed);
@@ -104,8 +109,10 @@ void armature_mat_pose_to_bone(struct bPoseChannel *pchan, float inmat[][4], flo
void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
-void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4]);
+void pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[][3], short use_compat);
+void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4], short use_comat);
void pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]);
+void pchan_calc_mat(struct bPoseChannel *pchan);
/* Rotation Mode Conversions - Used for PoseChannels + Objects... */
void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode);
@@ -117,6 +124,10 @@ typedef struct Mat4 {
Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan, int rest);
+/* like EBONE_VISIBLE */
+#define PBONE_VISIBLE(arm, bone) (((bone)->layer & (arm)->layer) && !((bone)->flag & BONE_HIDDEN_P))
+#define _BONE_VISIBLE(arm, bone) (((bone)->layer & (arm)->layer) && !((bone)->flag & BONE_HIDDEN_P))
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_array_mallocn.h b/source/blender/blenkernel/BKE_array_mallocn.h
new file mode 100644
index 00000000000..42c4c2ebdd0
--- /dev/null
+++ b/source/blender/blenkernel/BKE_array_mallocn.h
@@ -0,0 +1,87 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+#ifndef BKE_ARRAY_MALLOCN_H
+#define BKE_ARRAY_MALLOCN_H
+
+/** \file BKE_array_mallocn.h
+ * \ingroup bke
+ * \brief little array macro library.
+ */
+
+/* example of usage:
+
+int *arr = NULL;
+V_DECLARE(arr);
+int i;
+
+for (i=0; i<10; i++) {
+ V_GROW(arr);
+ arr[i] = something;
+}
+V_FREE(arr);
+
+arrays are buffered, using double-buffering (so on each reallocation,
+the array size is doubled). supposedly this should give good Big Oh
+behaviour, though it may not be the best in practice.
+*/
+
+#define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
+
+/*in the future, I plan on having V_DECLARE allocate stack memory it'll
+ use at first, and switch over to heap when it needs more. that'll mess
+ up cases where you'd want to use this API to build a dynamic list for
+ non-local use, so all such cases should use this macro.*/
+#define V_DYNDECLARE(vec) V_DECLARE(vec)
+
+/*this returns the entire size of the array, including any buffering.*/
+#define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
+
+/*this returns the logical size of the array, not including buffering.*/
+#define V_COUNT(vec) _##vec##_count
+
+/*grow the array by one. zeroes the new elements.*/
+#define V_GROW(vec) \
+ V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
+ ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
+ (void)(vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
+ (void)(vec && (MEM_freeN(vec),1)),\
+ (vec = _##vec##_tmp),\
+ _##vec##_count++)
+
+#define V_FREE(vec) if (vec) MEM_freeN(vec);
+
+/*resets the logical size of an array to zero, but doesn't
+ free the memory.*/
+#define V_RESET(vec) _##vec##_count=0
+
+/*set the count of the array*/
+#define V_SETCOUNT(vec, count) _##vec##_count = (count)
+
+#endif // BKE_ARRAY_MALLOCN_H
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 8820edc3adf..44ce6060f1b 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BKE_blender.h (mar-2001 nzc)
- *
- * Blender util stuff?
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,10 +29,32 @@
#ifndef BKE_BLENDER_H
#define BKE_BLENDER_H
+/** \file BKE_blender.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ * \brief Blender util stuff
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
+/* these lines are grep'd, watch out for our not-so-awesome regex
+ * and keep comment above the defines.
+ * Use STRINGIFY() rather then defining with quotes */
+#define BLENDER_VERSION 256
+#define BLENDER_SUBVERSION 2
+
+#define BLENDER_MINVERSION 250
+#define BLENDER_MINSUBVERSION 0
+
+/* used by packaging tools */
+ /* can be left blank, otherwise a,b,c... etc with no quotes */
+#define BLENDER_VERSION_CHAR a
+ /* alpha/beta/rc/releases */
+#define BLENDER_VERSION_CYCLE beta
+
struct ListBase;
struct MemFile;
struct bContext;
@@ -44,14 +62,13 @@ struct ReportList;
struct Scene;
struct Main;
-#define BLENDER_VERSION 253
-#define BLENDER_SUBVERSION 1
+int BKE_read_file(struct bContext *C, const char *filepath, struct ReportList *reports);
-#define BLENDER_MINVERSION 250
-#define BLENDER_MINSUBVERSION 0
+#define BKE_READ_FILE_FAIL 0 /* no load */
+#define BKE_READ_FILE_OK 1 /* OK */
+#define BKE_READ_FILE_OK_USERPREFS 2 /* OK, and with new user settings */
-int BKE_read_file(struct bContext *C, char *dir, void *type_r, struct ReportList *reports);
-int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, void *type_r, struct ReportList *reports);
+int BKE_read_file_from_memory(struct bContext *C, char* filebuf, int filelength, struct ReportList *reports);
int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile, struct ReportList *reports);
void free_blender(void);
@@ -65,9 +82,10 @@ void set_blender_test_break_cb(void (*func)(void) );
int blender_test_break(void);
/* global undo */
-extern void BKE_write_undo(struct bContext *C, char *name);
+extern void BKE_write_undo(struct bContext *C, const char *name);
extern void BKE_undo_step(struct bContext *C, int step);
extern void BKE_undo_name(struct bContext *C, const char *name);
+extern int BKE_undo_valid(const char *name);
extern void BKE_reset_undo(void);
extern char *BKE_undo_menu_string(void);
extern void BKE_undo_number(struct bContext *C, int nr);
diff --git a/source/blender/blenkernel/BKE_bmesh.h b/source/blender/blenkernel/BKE_bmesh.h
index c05a940b0f5..e347f8fe76e 100644
--- a/source/blender/blenkernel/BKE_bmesh.h
+++ b/source/blender/blenkernel/BKE_bmesh.h
@@ -1,8 +1,4 @@
-/**
- * BKE_bmesh.h jan 2007
- *
- * (old) BMesh modeler structure and functions.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,7 +33,15 @@
#ifndef BKE_BMESH_H
#define BKE_BMESH_H
+/** \file BKE_bmesh.h
+ * \ingroup bke
+ * \since January 2007
+ * \brief BMesh modeler structure and functions.
+ *
+ */
+
#include "DNA_listBase.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_mempool.h"
#include "BLI_memarena.h"
diff --git a/source/blender/blenkernel/BKE_bmeshCustomData.h b/source/blender/blenkernel/BKE_bmeshCustomData.h
index d2b72019b68..aabfcfaa0f6 100644
--- a/source/blender/blenkernel/BKE_bmeshCustomData.h
+++ b/source/blender/blenkernel/BKE_bmeshCustomData.h
@@ -1,8 +1,4 @@
-/**
- * BKE_bmesh.h jan 2007
- *
- * BMesh modeler structure and functions.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +34,12 @@
#ifndef BKE_BMESHCUSTOMDATA_H
#define BKE_BMESHCUSTOMDATA_H
+/** \file BKE_bmeshCustomData.h
+ * \ingroup bke
+ * \since January 2007
+ * \brief BMesh modeler structure and functions - custom data.
+ */
+
struct BLI_mempool;
/*Custom Data Types and defines
diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h
index 6a47dcbd6c4..ef7323fc4c3 100644
--- a/source/blender/blenkernel/BKE_bmfont.h
+++ b/source/blender/blenkernel/BKE_bmfont.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BKE_bmfont.h (mar-2001 nzc)
- *
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,12 @@
#ifndef BKE_BMFONT_H
#define BKE_BMFONT_H
+/** \file BKE_bmfont.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/blenkernel/BKE_bmfont_types.h b/source/blender/blenkernel/BKE_bmfont_types.h
index 77a618c1be4..658302e9f1d 100644
--- a/source/blender/blenkernel/BKE_bmfont_types.h
+++ b/source/blender/blenkernel/BKE_bmfont_types.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BKE_bmfont_types.h (mar-2001 nzc)
- *
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,11 @@
#ifndef BKE_BMFONT_TYPES_H
#define BKE_BMFONT_TYPES_H
+/** \file BKE_bmfont_types.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
#define is_power_of_two(N) ((N ^ (N - 1)) == (2 * N - 1))
/*
Moved to IMB_imbuf_types.h where it will live close to the ImBuf type.
diff --git a/source/blender/blenkernel/BKE_boids.h b/source/blender/blenkernel/BKE_boids.h
index ffd803f21a5..36ca0cde87d 100644
--- a/source/blender/blenkernel/BKE_boids.h
+++ b/source/blender/blenkernel/BKE_boids.h
@@ -1,6 +1,4 @@
-/* BKE_particle.h
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,12 @@
#ifndef BKE_BOIDS_H
#define BKE_BOIDS_H
+/** \file BKE_boids.h
+ * \ingroup bke
+ * \since 2009
+ * \author Janne Karhu
+ */
+
#include "DNA_boid_types.h"
typedef struct BoidBrainData {
diff --git a/source/blender/blenkernel/BKE_booleanops_mesh.h b/source/blender/blenkernel/BKE_booleanops_mesh.h
index 7c2d619659a..aecd3385662 100644
--- a/source/blender/blenkernel/BKE_booleanops_mesh.h
+++ b/source/blender/blenkernel/BKE_booleanops_mesh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef BKE_PyBooleanOps_h
#define BKE_PyBooleanOps_h
+/** \file BKE_booleanops_mesh.h
+ * \ingroup bke
+ */
+
#include "CSG_BooleanOps.h"
/**
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index 0e406a16d0c..a9d379e6c69 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,12 +31,16 @@
#ifndef BKE_BRUSH_H
#define BKE_BRUSH_H
+/** \file BKE_brush.h
+ * \ingroup bke
+ */
+
struct ID;
struct Brush;
struct ImBuf;
struct Scene;
struct wmOperator;
-enum CurveMappingPreset;
+// enum CurveMappingPreset;
/* datablock functions */
struct Brush *add_brush(const char *name);
@@ -56,13 +60,16 @@ int brush_texture_delete(struct Brush *brush);
int brush_clone_image_set_nr(struct Brush *brush, int nr);
int brush_clone_image_delete(struct Brush *brush);
+/* jitter */
+void brush_jitter_pos(struct Brush *brush, float *pos, float *jitterpos);
+
/* brush curve */
void brush_curve_preset(struct Brush *b, /*enum CurveMappingPreset*/int preset);
float brush_curve_strength_clamp(struct Brush *br, float p, const float len);
float brush_curve_strength(struct Brush *br, float p, const float len); /* used for sculpt */
/* sampling */
-void brush_sample_tex(struct Brush *brush, float *xy, float *rgba);
+void brush_sample_tex(struct Brush *brush, float *xy, float *rgba, const int thread);
void brush_imbuf_new(struct Brush *brush, short flt, short texfalloff, int size,
struct ImBuf **imbuf);
@@ -106,5 +113,8 @@ void brush_set_unprojected_radius(struct Brush *brush, float value);
float brush_alpha(struct Brush *brush);
void brush_set_alpha(struct Brush *brush, float value);
+/* debugging only */
+void brush_debug_print_state(struct Brush *br);
+
#endif
diff --git a/source/blender/blenkernel/BKE_bullet.h b/source/blender/blenkernel/BKE_bullet.h
index b695bdc91ae..76358c4485b 100644
--- a/source/blender/blenkernel/BKE_bullet.h
+++ b/source/blender/blenkernel/BKE_bullet.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -30,6 +30,10 @@
#ifndef BKE_BULLET_H
#define BKE_BULLET_H
+/** \file BKE_bullet.h
+ * \ingroup bke
+ */
+
struct BulletSoftBody;
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h
index 5a1db432589..29487713ad4 100644
--- a/source/blender/blenkernel/BKE_bvhutils.h
+++ b/source/blender/blenkernel/BKE_bvhutils.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +29,10 @@
#ifndef BKE_BVHUTILS_H
#define BKE_BVHUTILS_H
+/** \file BKE_bvhutils.h
+ * \ingroup bke
+ */
+
#include "BLI_kdopbvh.h"
#include "BLI_linklist.h"
@@ -65,6 +68,7 @@ typedef struct BVHTreeFromMesh
/* Private data */
int cached;
+ void *em_evil; /* var only for snapping */
} BVHTreeFromMesh;
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h
index 1d65d254ae6..c1161e7c65b 100644
--- a/source/blender/blenkernel/BKE_cdderivedmesh.h
+++ b/source/blender/blenkernel/BKE_cdderivedmesh.h
@@ -27,9 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* CDDerivedMesh interface.
- * CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores
- * mesh elements (vertices, edges and faces) as layers of custom element data.
+/** \file BKE_cdderivedmesh.h
+ * \ingroup bke
+ * \section aboutcdderivedmesh CDDerivedMesh interface
+ * CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores
+ * mesh elements (vertices, edges and faces) as layers of custom element data.
*/
#ifndef BKE_CDDERIVEDMESH_H
@@ -114,6 +116,9 @@ void CDDM_calc_edges(struct DerivedMesh *dm);
faces*/
void CDDM_calc_edges_poly(struct DerivedMesh *dm);
+/*reconstitute face triangulation*/
+void CDDM_recalc_tesselation(struct DerivedMesh *dm);
+
/* lowers the number of vertices/edges/faces in a CDDerivedMesh
* the layer data stays the same size
*/
@@ -140,7 +145,7 @@ struct MVert *CDDM_get_verts(struct DerivedMesh *dm);
struct MEdge *CDDM_get_edges(struct DerivedMesh *dm);
struct MFace *CDDM_get_tessfaces(struct DerivedMesh *dm);
struct MLoop *CDDM_get_loops(struct DerivedMesh *dm);
-struct MPoly *CDDM_get_faces(struct DerivedMesh *dm);
+struct MPoly *CDDM_get_polys(struct DerivedMesh *dm);
/*Assigns news m*** layers to the cddm. Note that you must handle
freeing the old ones yourself. Also you must ensure dm->num****Data
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 034bedbb07d..1ee51cd2122 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -1,6 +1,4 @@
-/**
- * BKE_cloth.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_CLOTH_H
#define BKE_CLOTH_H
+/** \file BKE_cloth.h
+ * \ingroup bke
+ * \author Daniel Genrich
+ */
+
#include <float.h>
struct Object;
@@ -220,9 +223,9 @@ void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
// needed for modifier.c
void cloth_free_modifier_extern ( struct ClothModifierData *clmd );
-void cloth_free_modifier ( struct Object *ob, struct ClothModifierData *clmd );
+void cloth_free_modifier ( struct ClothModifierData *clmd );
void cloth_init ( struct ClothModifierData *clmd );
-struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc );
+struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
void cloth_update_normals ( ClothVertex *verts, int nVerts, struct MFace *face, int totface );
int cloth_uses_vgroup(struct ClothModifierData *clmd);
@@ -252,7 +255,7 @@ typedef enum
*/
typedef struct
{
- char *name;
+ const char *name;
CM_SOLVER_ID id;
int ( *init ) ( struct Object *ob, struct ClothModifierData *clmd );
int ( *solver ) ( struct Object *ob, float framenr, struct ClothModifierData *clmd, struct ListBase *effectors );
diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h
index d7ae7df9342..b54d4275719 100644
--- a/source/blender/blenkernel/BKE_collision.h
+++ b/source/blender/blenkernel/BKE_collision.h
@@ -1,6 +1,4 @@
-/**
- * BKE_cloth.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_COLLISIONS_H
#define BKE_COLLISIONS_H
+/** \file BKE_collision.h
+ * \ingroup bke
+ * \author Daniel Genrich
+ */
+
#include <math.h>
#include <float.h>
#include <stdlib.h>
@@ -136,7 +139,7 @@ void interpolateOnTriangle ( float to[3], float v1[3], float v2[3], float v3[3],
/////////////////////////////////////////////////
// used in effect.c
/////////////////////////////////////////////////
-struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, int *numcollobj);
+struct Object **get_collisionobjects(struct Scene *scene, struct Object *self, struct Group *group, unsigned int *numcollobj);
typedef struct ColliderCache {
struct ColliderCache *next, *prev;
diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h
index e0ebedb320b..b3709853a8c 100644
--- a/source/blender/blenkernel/BKE_colortools.h
+++ b/source/blender/blenkernel/BKE_colortools.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef BKE_COLORTOOLS_H
#define BKE_COLORTOOLS_H
+/** \file BKE_colortools.h
+ * \ingroup bke
+ */
+
struct CurveMapping;
struct CurveMap;
struct Scopes;
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h
index d6e0075df1e..7c0e7050a9f 100644
--- a/source/blender/blenkernel/BKE_constraint.h
+++ b/source/blender/blenkernel/BKE_constraint.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,11 @@
#ifndef BKE_CONSTRAINT_H
#define BKE_CONSTRAINT_H
+/** \file BKE_constraint.h
+ * \ingroup bke
+ * \author Joshua Leung (major recode 2007)
+ */
+
struct ID;
struct bConstraint;
struct bConstraintTarget;
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 76a585fba04..36c442741ec 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,13 +28,17 @@
#ifndef BKE_CONTEXT_H
#define BKE_CONTEXT_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+/** \file BKE_context.h
+ * \ingroup bke
+ */
#include "DNA_listBase.h"
#include "RNA_types.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ARegion;
struct bScreen;
struct EditMesh;
@@ -114,7 +118,7 @@ bContext *CTX_copy(const bContext *C);
/* Stored Context */
-bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr);
+bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *ptr);
void CTX_store_set(bContext *C, bContextStore *store);
bContextStore *CTX_store_copy(bContextStore *store);
void CTX_store_free(bContextStore *store);
@@ -124,7 +128,7 @@ void CTX_store_free_list(ListBase *contexts);
int CTX_py_init_get(bContext *C);
void CTX_py_init_set(bContext *C, int value);
-void *CTX_py_dict_get(bContext *C);
+void *CTX_py_dict_get(const bContext *C);
void CTX_py_dict_set(bContext *C, void *value);
/* Window Manager Context */
@@ -163,6 +167,8 @@ void CTX_wm_screen_set(bContext *C, struct bScreen *screen); /* to be removed */
void CTX_wm_area_set(bContext *C, struct ScrArea *sa);
void CTX_wm_region_set(bContext *C, struct ARegion *region);
void CTX_wm_menu_set(bContext *C, struct ARegion *menu);
+const char *CTX_wm_operator_poll_msg_get(struct bContext *C);
+void CTX_wm_operator_poll_msg_set(struct bContext *C, const char *msg);
/* Data Context
@@ -223,7 +229,7 @@ struct Main *CTX_data_main(const bContext *C);
struct Scene *CTX_data_scene(const bContext *C);
struct ToolSettings *CTX_data_tool_settings(const bContext *C);
-char *CTX_data_mode_string(const bContext *C);
+const char *CTX_data_mode_string(const bContext *C);
int CTX_data_mode_enum(const bContext *C);
void CTX_data_main_set(bContext *C, struct Main *bmain);
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index db6d995aa74..f0c58e0a511 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_curve.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_CURVE_H
#define BKE_CURVE_H
+/** \file BKE_curve.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
struct Curve;
struct ListBase;
struct Object;
@@ -54,7 +57,7 @@ struct BevList;
void unlink_curve( struct Curve *cu);
void free_curve( struct Curve *cu);
void BKE_free_editfont(struct Curve *cu);
-struct Curve *add_curve(char *name, int type);
+struct Curve *add_curve(const char *name, int type);
struct Curve *copy_curve( struct Curve *cu);
void make_local_curve( struct Curve *cu);
short curve_type( struct Curve *cu);
@@ -69,9 +72,10 @@ void duplicateNurblist( struct ListBase *lb1, struct ListBase *lb2);
void test2DNurb( struct Nurb *nu);
void minmaxNurb( struct Nurb *nu, float *min, float *max);
-void makeknots( struct Nurb *nu, short uv);
+void nurbs_knot_calc_u(struct Nurb *nu);
+void nurbs_knot_calc_v(struct Nurb *nu);
-void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride);
+void makeNurbfaces(struct Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv);
void makeNurbcurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride);
void forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride);
float *make_orco_curve(struct Scene *scene, struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 7e59aa5ac8e..319519cf363 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -27,11 +27,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* CustomData interface, see also DNA_customdata_types.h. */
+/** \file BKE_customdata.h
+ * \ingroup bke
+ * \author Ben Batt
+ * \brief CustomData interface, see also DNA_customdata_types.h.
+ */
#ifndef BKE_CUSTOMDATA_H
#define BKE_CUSTOMDATA_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct BMesh;
struct ID;
struct CustomData;
@@ -146,7 +154,7 @@ int CustomData_number_of_layers(const struct CustomData *data, int type);
* returns the layer data */
void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type);
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, char *name);
+ int type, const char *name);
/* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
* zero for the layer type, so only layer types specified by the mask
@@ -170,6 +178,7 @@ void CustomData_em_copy_data(const struct CustomData *source,
void CustomData_bmesh_copy_data(const struct CustomData *source,
struct CustomData *dest, void *src_block,
void **dest_block);
+void CustomData_em_validate_data(struct CustomData *data, void *block, int sub_elements);
/* frees data in a CustomData object
* return 1 on success, 0 on failure
@@ -226,10 +235,10 @@ void *CustomData_bmesh_get_layer_n(const struct CustomData *data, void *block, i
void *CustomData_get_layer(const struct CustomData *data, int type);
void *CustomData_get_layer_n(const struct CustomData *data, int type, int n);
void *CustomData_get_layer_named(const struct CustomData *data, int type,
- char *name);
+ const char *name);
int CustomData_get_layer_index(const struct CustomData *data, int type);
int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n);
-int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
+int CustomData_get_named_layer_index(const struct CustomData *data, int type, const char *name);
int CustomData_get_active_layer_index(const struct CustomData *data, int type);
int CustomData_get_render_layer_index(const struct CustomData *data, int type);
int CustomData_get_clone_layer_index(const struct CustomData *data, int type);
@@ -302,7 +311,7 @@ void CustomData_from_bmesh_block(const struct CustomData *source,
/* query info over types */
-void CustomData_file_write_info(int type, char **structname, int *structnum);
+void CustomData_file_write_info(int type, const char **structname, int *structnum);
int CustomData_sizeof(int type);
/* get the name of a layer type */
@@ -336,5 +345,9 @@ void CustomData_external_read(struct CustomData *data,
void CustomData_external_reload(struct CustomData *data,
struct ID *id, CustomDataMask mask, int totelem);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_customdata_file.h b/source/blender/blenkernel/BKE_customdata_file.h
index 9bcef7636c6..f97565f23a1 100644
--- a/source/blender/blenkernel/BKE_customdata_file.h
+++ b/source/blender/blenkernel/BKE_customdata_file.h
@@ -23,6 +23,10 @@
#ifndef BKE_CUSTOMDATA_FILE_H
#define BKE_CUSTOMDATA_FILE_H
+/** \file BKE_customdata_file.h
+ * \ingroup bke
+ */
+
#define CDF_TYPE_IMAGE 0
#define CDF_TYPE_MESH 1
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index 53f474aa972..a9ac201beda 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -1,9 +1,4 @@
-/* BKE_deform.h June 2001
- *
- * support for deformation groups and hooks
- *
- * Reevan McKay et al
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +30,13 @@
#ifndef BKE_DEFORM_H
#define BKE_DEFORM_H
+/** \file BKE_deform.h
+ * \ingroup bke
+ * \since June 2001
+ * \author Reevan McKay et al
+ * \brief support for deformation groups and hooks.
+ */
+
struct Object;
struct ListBase;
struct bDeformGroup;
@@ -49,10 +51,10 @@ int defgroup_flip_index(struct Object *ob, int index, int use_default);
int defgroup_name_index(struct Object *ob, const char *name);
void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
-struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, int defgroup);
-struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, int defgroup);
+struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, const int defgroup);
+struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, const int defgroup);
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num);
+float defvert_find_weight(const struct MDeformVert *dvert, const int group_num);
float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num);
void defvert_copy(struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
@@ -64,7 +66,7 @@ void defvert_normalize(struct MDeformVert *dvert);
/* utility function, note that 32 chars is the maximum string length since its only
* used with defgroups currently */
-void flip_side_name(char *name, const char *from_name, int strip_number);
+void flip_side_name(char name[32], const char from_name[32], int strip_number);
#endif
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index 0b78a1206fe..f78a957cbab 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,14 @@
#ifndef DEPSGRAPH_API
#define DEPSGRAPH_API
+/** \file BKE_depsgraph.h
+ * \ingroup bke
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/*
#define DEPS_DEBUG
*/
@@ -100,25 +108,28 @@ void draw_all_deps(void);
void DAG_scene_sort(struct Main *bmain, struct Scene *sce);
/* flag all objects that need recalc because they're animated */
-void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay);
+void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, int time);
+void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
/* tag objects for update on file load */
-void DAG_on_load_update(struct Main *bmain);
-
- /* flag all IDs that need recalc because they're animated, influencing
- this ID only. only for objects currently */
-void DAG_id_update_flags(struct ID *id);
- /* flushes all recalc flags for this object down the dependency tree,
- but note the DAG only supports objects and object data currently */
-void DAG_id_flush_update(struct ID *id, short flag);
+void DAG_on_load_update(struct Main *bmain, const short do_time);
+
/* when setting manual RECALC flags, call this afterwards */
void DAG_ids_flush_update(struct Main *bmain, int time);
+ /* tag datablock to get updated for the next redraw */
+void DAG_id_tag_update(struct ID *id, short flag);
+ /* flush all tagged updates */
+void DAG_ids_flush_tagged(struct Main *bmain);
+
/* (re)-create dependency graph for armature pose */
void DAG_pose_sort(struct Object *ob);
/* callback for editors module to do updates */
void DAG_editors_update_cb(void (*func)(struct Main *bmain, struct ID *id));
+
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 01d3de1b94f..68745975dae 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -1,4 +1,3 @@
-/* display list (or rather multi purpose list) stuff */
/*
$Id$
*
@@ -32,6 +31,10 @@
#ifndef BKE_DISPLIST_H
#define BKE_DISPLIST_H
+/** \file BKE_displist.h
+ * \ingroup bke
+ * \brief display list (or rather multi purpose list) stuff.
+ */
#include "DNA_customdata_types.h"
#include "BKE_customdata.h"
@@ -98,7 +101,6 @@ extern void shadeDispList(struct Scene *scene, struct Base *base);
extern void shadeMeshMCol(struct Scene *scene, struct Object *ob, struct Mesh *me);
int surfindex_displist(DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4);
-void imagestodisplist(void);
void reshadeall_displist(struct Scene *scene);
void filldisplist(struct ListBase *dispbase, struct ListBase *to, int flipnormal);
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 99f55200eac..97ac711651b 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_effect.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_EFFECT_H
#define BKE_EFFECT_H
+/** \file BKE_effect.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
#include "DNA_modifier_types.h"
struct Object;
diff --git a/source/blender/blenkernel/BKE_endian.h b/source/blender/blenkernel/BKE_endian.h
index d61b81fb6ce..5647645e990 100644
--- a/source/blender/blenkernel/BKE_endian.h
+++ b/source/blender/blenkernel/BKE_endian.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,11 +26,17 @@
*
* ***** END GPL LICENSE BLOCK *****
* Are we little or big endian? From Harbison&Steele.
- * BKE_ENDIANNESS(a) returns 1 if big endian and returns 0 if little endian
*/
#ifndef BKE_ENDIAN_H
#define BKE_ENDIAN_H
+/** \file BKE_endian.h
+ * \ingroup bke
+ */
+
+/**
+ * BKE_ENDIANNESS(a) returns 1 if big endian and returns 0 if little endian
+ */
#define BKE_ENDIANNESS(a) { \
union { \
intptr_t l; \
diff --git a/source/blender/blenkernel/BKE_exotic.h b/source/blender/blenkernel/BKE_exotic.h
index bd5af66c6a8..870dd7cb4d5 100644
--- a/source/blender/blenkernel/BKE_exotic.h
+++ b/source/blender/blenkernel/BKE_exotic.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,28 +25,35 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * dxf/vrml/stl external file io function prototypes
*/
#ifndef BKE_EXOTIC_H
#define BKE_EXOTIC_H
+/** \file BKE_exotic.h
+ * \ingroup bke
+ * \brief dxf/vrml/stl external file io function prototypes.
+ * \attention is this used still? Candidate for removal?
+ */
struct Mesh;
struct Scene;
-void mcol_to_rgba(unsigned int col, float *r, float *g, float *b, float *a);
-unsigned int *mcol_to_vcol(struct Mesh *me); // used in py_main.c
-
/**
* Reads all 3D fileformats other than Blender fileformat
* @retval 0 The file could not be read.
* @retval 1 The file was read succesfully.
* @attention Used in filesel.c
*/
-int BKE_read_exotic(struct Scene *scene, char *name);
+int BKE_read_exotic(struct Scene *scene, const char *name);
+
+/* return codes */
+#define BKE_READ_EXOTIC_FAIL_PATH -3 /* file format is not supported */
+#define BKE_READ_EXOTIC_FAIL_FORMAT -2 /* file format is not supported */
+#define BKE_READ_EXOTIC_FAIL_OPEN -1 /* Can't open the file */
+#define BKE_READ_EXOTIC_OK_BLEND 0 /* .blend file */
+#define BKE_READ_EXOTIC_OK_OTHER 1 /* other supported formats */
void write_dxf(struct Scene *scene, char *str);
-void write_vrml(struct Scene *scene, char *str);
void write_stl(struct Scene *scene, char *str);
#endif
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index 95e0cfc3a91..f81acf4b11e 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,16 @@
#ifndef BKE_FCURVE_H
#define BKE_FCURVE_H
+/** \file BKE_fcurve.h
+ * \ingroup bke
+ * \author Joshua Leung
+ * \since 2009
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct FCurve;
struct FModifier;
struct ChannelDriver;
@@ -136,7 +146,7 @@ typedef enum eFMI_Action_Types {
/* modifier only modifies the values of points (but times stay the same) */
FMI_TYPE_REPLACE_VALUES,
/* modifier generates a curve regardless of what came before */
- FMI_TYPE_GENERATE_CURVE,
+ FMI_TYPE_GENERATE_CURVE
} eFMI_Action_Types;
/* Flags for the requirements of a FModifier Type */
@@ -148,7 +158,7 @@ typedef enum eFMI_Requirement_Flags {
*/
FMI_REQUIRES_NOTHING = (1<<1),
/* refer to modifier instance */
- FMI_REQUIRES_RUNTIME_CHECK = (1<<2),
+ FMI_REQUIRES_RUNTIME_CHECK = (1<<2)
} eFMI_Requirement_Flags;
/* Function Prototypes for FModifierTypeInfo's */
@@ -189,7 +199,7 @@ struct FCurve *list_find_fcurve(ListBase *list, const char rna_path[], const int
struct FCurve *iter_step_fcurve (struct FCurve *fcu_iter, const char rna_path[]);
/* high level function to get an fcurve from C without having the rna */
-struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, char *prop_name, int index);
+struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, const char *prop_name, int index);
/* Get list of LinkData's containing pointers to the F-Curves which control the types of data indicated
* e.g. numMatches = list_find_data_fcurves(matches, &act->curves, "pose.bones[", "MyFancyBone");
@@ -210,6 +220,14 @@ void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
/* get the bounding-box extents for F-Curve */
void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax);
+/* .............. */
+
+/* Are keyframes on F-Curve of any use (to final result, and to show in editors)? */
+short fcurve_are_keyframes_usable(struct FCurve *fcu);
+
+/* Can keyframes be added to F-Curve? */
+short fcurve_is_keyframable(struct FCurve *fcu);
+
/* -------- Curve Sanity -------- */
void calchandles_fcurve(struct FCurve *fcu);
@@ -248,4 +266,8 @@ float fcurve_samplingcb_evalcurve(struct FCurve *fcu, void *data, float evaltime
*/
void fcurve_store_samples(struct FCurve *fcu, void *data, int start, int end, FcuSampleFunc sample_cb);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* BKE_FCURVE_H*/
diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h
index e730f4ec34c..f6070cd81f0 100644
--- a/source/blender/blenkernel/BKE_fluidsim.h
+++ b/source/blender/blenkernel/BKE_fluidsim.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,9 @@
#ifndef BKE_FLUIDSIM_H
#define BKE_FLUIDSIM_H
+/** \file BKE_fluidsim.h
+ * \ingroup bke
+ */
struct Object;
struct Scene;
diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h
index 10811c0776d..7f4e7c208f6 100644
--- a/source/blender/blenkernel/BKE_font.h
+++ b/source/blender/blenkernel/BKE_font.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_vfont.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef BKE_VFONT_H
#define BKE_VFONT_H
+/** \file BKE_font.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -75,7 +77,7 @@ void BKE_font_register_builtin(void *mem, int size);
void free_vfont(struct VFont *sc);
void free_ttfont(void);
struct VFont *get_builtin_font(void);
-struct VFont *load_vfont(char *name);
+struct VFont *load_vfont(const char *name);
struct TmpFont *vfont_find_tmpfont(struct VFont *vfont);
struct chartrans *BKE_text_to_curve(struct Scene *scene, struct Object *ob, int mode);
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 6a602339e11..d83e0e5bc4c 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -1,10 +1,4 @@
-/**
- * blenlib/BKE_global.h (mar-2001 nzc)
- *
- * Global settings, handles, pointers. This is the root for finding
- * any data in Blender. This block is not serialized, but built anew
- * for every fresh Blender run.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +29,15 @@
#ifndef BKE_GLOBAL_H
#define BKE_GLOBAL_H
+/** \file BKE_global.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ * \section aboutglobal Global settings
+ * Global settings, handles, pointers. This is the root for finding
+ * any data in Blender. This block is not serialized, but built anew
+ * for every fresh Blender run.
+ */
#include "DNA_listBase.h"
#ifdef __cplusplus
@@ -52,16 +55,17 @@ typedef struct Global {
struct Main *main;
/* strings: lastsaved */
- char ima[256], sce[256], lib[256];
+ char ima[256], lib[256];
- /* flag: if != 0 G.sce contains valid relative base path */
+ /* flag: if != 0 G.main->name contains valid relative base path */
int relbase_valid;
/* strings of recent opend files */
struct ListBase recent_files;
short afbreek, moving, file_loaded;
- short background;
+ char background;
+ char factory_startup;
short winpos, displaymode; /* used to be in Render */
short rendering; /* to indicate render is busy, prevent renderwindow events etc */
@@ -91,10 +95,6 @@ typedef struct Global {
/* ndof device found ? */
int ndofdevice;
-
- /* confusing... G.f and G.flags */
- int flags;
-
} Global;
/* **************** GLOBAL ********************* */
@@ -125,17 +125,17 @@ typedef struct Global {
#define G_FILE_ENABLE_ALL_FRAMES (1 << 3) /* deprecated */
#define G_FILE_SHOW_DEBUG_PROPS (1 << 4) /* deprecated */
#define G_FILE_SHOW_FRAMERATE (1 << 5) /* deprecated */
-#define G_FILE_SHOW_PROFILE (1 << 6) /* deprecated */
+/* #define G_FILE_SHOW_PROFILE (1 << 6) */ /* deprecated */
#define G_FILE_LOCK (1 << 7)
#define G_FILE_SIGN (1 << 8)
-#define G_FIle_PUBLISH (1 << 9)
+/* #define G_FILE_PUBLISH (1 << 9) */ /* deprecated */
#define G_FILE_NO_UI (1 << 10)
-#define G_FILE_GAME_TO_IPO (1 << 11) /* deprecated */
+/* #define G_FILE_GAME_TO_IPO (1 << 11) */ /* deprecated */
#define G_FILE_GAME_MAT (1 << 12) /* deprecated */
-#define G_FILE_DISPLAY_LISTS (1 << 13) /* deprecated */
+/* #define G_FILE_DISPLAY_LISTS (1 << 13) */ /* deprecated */
#define G_FILE_SHOW_PHYSICS (1 << 14) /* deprecated */
#define G_FILE_GAME_MAT_GLSL (1 << 15) /* deprecated */
-#define G_FILE_GLSL_NO_LIGHTS (1 << 16) /* deprecated */
+/* #define G_FILE_GLSL_NO_LIGHTS (1 << 16) */ /* deprecated */
#define G_FILE_GLSL_NO_SHADERS (1 << 17) /* deprecated */
#define G_FILE_GLSL_NO_SHADOWS (1 << 18) /* deprecated */
#define G_FILE_GLSL_NO_RAMPS (1 << 19) /* deprecated */
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 65bcb54408b..4898bb28c8d 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
#ifndef BKE_GPENCIL_H
#define BKE_GPENCIL_H
+/** \file BKE_gpencil.h
+ * \ingroup bke
+ * \author Joshua Leung
+ */
+
struct ListBase;
struct bGPdata;
struct bGPDlayer;
@@ -42,7 +47,7 @@ void free_gpencil_data(struct bGPdata *gpd);
struct bGPDframe *gpencil_frame_addnew(struct bGPDlayer *gpl, int cframe);
struct bGPDlayer *gpencil_layer_addnew(struct bGPdata *gpd);
-struct bGPdata *gpencil_data_addnew(char name[]);
+struct bGPdata *gpencil_data_addnew(const char name[]);
struct bGPDframe *gpencil_frame_duplicate(struct bGPDframe *src);
struct bGPDlayer *gpencil_layer_duplicate(struct bGPDlayer *src);
diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index e63e3c93f1e..e497f43e46d 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_group.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_GROUP_H
#define BKE_GROUP_H
+/** \file BKE_group.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
struct Base;
struct Group;
struct GroupObject;
@@ -40,7 +44,7 @@ struct Scene;
void free_group_objects(struct Group *group);
void unlink_group(struct Group *group);
-struct Group *add_group(char *name);
+struct Group *add_group(const char *name);
struct Group *copy_group(struct Group *group);
int add_to_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
int rem_from_group(struct Group *group, struct Object *ob, struct Scene *scene, struct Base *base);
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index 252191803f2..5404402718d 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,10 @@
#ifndef BKE_ICONS_H
#define BKE_ICONS_H
+/** \file BKE_icons.h
+ * \ingroup bke
+ */
+
/*
Resizable Icons for Blender
*/
@@ -68,7 +72,7 @@ void BKE_icon_delete(struct ID* id);
void BKE_icon_changed(int icon_id);
/* free all icons */
-void BKE_icons_free();
+void BKE_icons_free(void);
/* free the preview image */
void BKE_previewimg_free(struct PreviewImage **prv);
@@ -77,7 +81,7 @@ void BKE_previewimg_free(struct PreviewImage **prv);
void BKE_previewimg_free_id(ID *id);
/* create a new preview image */
-struct PreviewImage* BKE_previewimg_create() ;
+struct PreviewImage* BKE_previewimg_create(void) ;
/* create a copy of the preview image */
struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv);
diff --git a/source/blender/blenkernel/BKE_idcode.h b/source/blender/blenkernel/BKE_idcode.h
index 364345a3610..1b2b3d2ee95 100755
--- a/source/blender/blenkernel/BKE_idcode.h
+++ b/source/blender/blenkernel/BKE_idcode.h
@@ -1,5 +1,5 @@
-/**
- * $Id: BKE_idcode.h 31221 2010-08-10 20:33:15Z gsrb3d $
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,6 +30,10 @@
#ifndef BKE_ID_INFO_H
#define BKE_ID_INFO_H
+/** \file BKE_idcode.h
+ * \ingroup bke
+ */
+
/**
* Convert an idcode into a name.
*
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h
index 0e0d76f4284..e71ad5c8a24 100644
--- a/source/blender/blenkernel/BKE_idprop.h
+++ b/source/blender/blenkernel/BKE_idprop.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,12 +28,17 @@
#ifndef _BKE_IDPROP_H
#define _BKE_IDPROP_H
+/** \file BKE_idprop.h
+ * \ingroup bke
+ * \author Joseph Eagar
+ */
+
#include "DNA_ID.h"
struct IDProperty;
struct ID;
-typedef union {
+typedef union IDPropertyTemplate {
int i;
float f;
double d;
@@ -72,8 +77,8 @@ void IDP_UnlinkArray(struct IDProperty *prop);
/* ---------- String Type ------------ */
IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */
-void IDP_AssignString(struct IDProperty *prop, char *st, int maxlen); /* maxlen excludes '\0' */
-void IDP_ConcatStringC(struct IDProperty *prop, char *st);
+void IDP_AssignString(struct IDProperty *prop, const char *st, int maxlen); /* maxlen excludes '\0' */
+void IDP_ConcatStringC(struct IDProperty *prop, const char *st);
void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append);
void IDP_FreeString(struct IDProperty *prop);
@@ -127,6 +132,8 @@ int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
void IDP_RemFromGroup(struct IDProperty *group, struct IDProperty *prop);
IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name);
+/* same as above but ensure type match */
+IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type);
/*Get an iterator to iterate over the members of an id property group.
Note that this will automatically free the iterator once iteration is complete;
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index c842efaa3b2..8f0ce8c1660 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_image.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_IMAGE_H
#define BKE_IMAGE_H
+/** \file BKE_image.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -46,9 +50,10 @@ void free_image(struct Image *me);
void BKE_stamp_info(struct Scene *scene, struct ImBuf *ibuf);
void BKE_stamp_buf(struct Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels);
-int BKE_write_ibuf(struct Scene *scene, struct ImBuf *ibuf, char *name, int imtype, int subimtype, int quality);
-void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ext);
-void BKE_add_image_extension(char *string, int imtype);
+int BKE_alphatest_ibuf(struct ImBuf *ibuf);
+int BKE_write_ibuf(struct Scene *scene, struct ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality);
+void BKE_makepicstring(char *string, const char *base, int frame, int imtype, const short use_ext, const short use_frames);
+int BKE_add_image_extension(char *string, int imtype);
int BKE_ftype_to_imtype(int ftype);
int BKE_imtype_to_ftype(int imtype);
int BKE_imtype_is_movie(int imtype);
@@ -93,10 +98,6 @@ struct RenderResult;
/* reload only frees, doesn't read until image_get_ibuf() called */
#define IMA_SIGNAL_RELOAD 0
#define IMA_SIGNAL_FREE 1
- /* pack signals are executed */
-#define IMA_SIGNAL_PACK 2
-#define IMA_SIGNAL_REPACK 3
-#define IMA_SIGNAL_UNPACK 4
/* source changes, from image to sequence or movie, etc */
#define IMA_SIGNAL_SRC_CHANGE 5
/* image-user gets a new image, check settings */
@@ -112,10 +113,10 @@ struct ImBuf *BKE_image_acquire_ibuf(struct Image *ima, struct ImageUser *iuser,
void BKE_image_release_ibuf(struct Image *ima, void *lock);
/* returns existing Image when filename/type is same (frame optional) */
-struct Image *BKE_add_image_file(const char *name, int frame);
+struct Image *BKE_add_image_file(const char *name);
/* adds image, adds ibuf, generates color or pattern */
-struct Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4]);
+struct Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4]);
/* adds image from imbuf, owns imbuf */
struct Image *BKE_add_image_imbuf(struct ImBuf *ibuf);
diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h
index 3bc707a674a..ea98c226e67 100644
--- a/source/blender/blenkernel/BKE_ipo.h
+++ b/source/blender/blenkernel/BKE_ipo.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_ipo.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,13 @@
#ifndef BKE_IPO_H
#define BKE_IPO_H
+/** \file BKE_ipo.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ * \author Joshua Leung
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,10 +49,6 @@ void do_versions_ipos_to_animato(struct Main *main);
void free_ipo(struct Ipo *ipo);
-// xxx perhaps this should be in curve api not in anim api
-void correct_bezpart(float *v1, float *v2, float *v3, float *v4);
-
-
#ifdef __cplusplus
};
#endif
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index daf6925845f..aeaf17bec27 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_key.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_KEY_H
#define BKE_KEY_H
+/** \file BKE_key.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
struct Key;
struct KeyBlock;
struct ID;
@@ -61,14 +64,14 @@ void key_curve_normal_weights(float t, float *data, int type);
float *do_ob_key(struct Scene *scene, struct Object *ob);
struct Key *ob_get_key(struct Object *ob);
-struct KeyBlock *add_keyblock(struct Key *key, char *name);
+struct KeyBlock *add_keyblock(struct Key *key, const char *name);
struct KeyBlock *ob_get_keyblock(struct Object *ob);
struct KeyBlock *ob_get_reference_keyblock(struct Object *ob);
struct KeyBlock *key_get_keyblock(struct Key *key, int index);
struct KeyBlock *key_get_named_keyblock(struct Key *key, const char name[]);
char *key_get_curValue_rnaPath(struct Key *key, struct KeyBlock *kb);
// needed for the GE
-void do_rel_key(int start, int end, int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb, int mode);
+void do_rel_key(const int start, int end, const int tot, char *basispoin, struct Key *key, struct KeyBlock *actkb, const int mode);
/* conversion functions */
void key_to_mesh(struct KeyBlock *kb, struct Mesh *me);
@@ -81,9 +84,11 @@ float (*key_to_vertcos(struct Object *ob, struct KeyBlock *kb))[3];
void vertcos_to_key(struct Object *ob, struct KeyBlock *kb, float (*vertCos)[3]);
void offset_to_key(struct Object *ob, struct KeyBlock *kb, float (*ofs)[3]);
+/* key.c */
+extern int slurph_opt;
+
#ifdef __cplusplus
};
#endif
-#endif
-
+#endif // BKE_KEY_H
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 880f3f7e724..2936338e760 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,17 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * june-2001 ton
*/
#ifndef BKE_LATTICE_H
#define BKE_LATTICE_H
+/** \file BKE_lattice.h
+ * \ingroup bke
+ * \author Ton Roosendaal
+ * \since June 2001
+ */
+
struct Lattice;
struct Object;
struct Scene;
@@ -39,7 +44,7 @@ struct BPoint;
struct MDeformVert;
void resizelattice(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
-struct Lattice *add_lattice(char *name);
+struct Lattice *add_lattice(const char *name);
struct Lattice *copy_lattice(struct Lattice *lt);
void free_lattice(struct Lattice *lt);
void make_local_lattice(struct Lattice *lt);
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index e25c379ded1..871a78bbab3 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BKE_library.h (mar-2001 nzc)
- *
- * Library
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,15 @@
#ifndef BKE_LIBRARY_TYPES_H
#define BKE_LIBRARY_TYPES_H
+/** \file BKE_library.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ListBase;
struct ID;
struct Main;
@@ -42,7 +47,7 @@ struct bContext;
void *alloc_libblock(struct ListBase *lb, short type, const char *name);
void *copy_libblock(void *rt);
-void copy_libblock_data(struct ID *id, const struct ID *id_from);
+void copy_libblock_data(struct ID *id, const struct ID *id_from, const short do_action);
void id_lib_extern(struct ID *id);
void id_us_plus(struct ID *id);
@@ -61,20 +66,22 @@ int set_listbasepointers(struct Main *main, struct ListBase **lb);
void free_libblock(struct ListBase *lb, void *idv);
void free_libblock_us(struct ListBase *lb, void *idv);
void free_main(struct Main *mainvar);
-void tag_main(struct Main *mainvar, int tag);
-int splitIDname(char *name, char *left, int *nr);
-void rename_id(struct ID *id, char *name);
+void tag_main_idcode(struct Main *mainvar, const short type, const short tag);
+void tag_main_lb(struct ListBase *lb, const short tag);
+void tag_main(struct Main *mainvar, const short tag);
+
+void rename_id(struct ID *id, const char *name);
void name_uiprefix_id(char *name, struct ID *id);
void test_idbutton(char *name);
void text_idbutton(struct ID *id, char *text);
void all_local(struct Library *lib, int untagged_only);
-struct ID *find_id(char *type, char *name);
+struct ID *find_id(const char *type, const char *name);
void clear_id_newpoins(void);
-void IDnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb,struct ID* link, short *nr);
-void IMAnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb, struct ID *link, short *nr);
-void IPOnames_to_pupstring(char **str, char *title, char *extraops, struct ListBase *lb, struct ID* link, short *nr, int blocktype);
+void IDnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb,struct ID* link, short *nr);
+void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID *link, short *nr);
+void IPOnames_to_pupstring(const char **str, const char *title, const char *extraops, struct ListBase *lb, struct ID* link, short *nr, int blocktype);
void flag_listbase_ids(ListBase *lb, short flag, short value);
void flag_all_listbases_ids(short flag, short value);
@@ -85,4 +92,10 @@ void set_free_windowmanager_cb(void (*func)(struct bContext *, struct wmWindowMa
/* use when "" is given to new_id() */
#define ID_FALLBACK_NAME "Untitled"
+#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT))
+
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 60c2d51571f..df6a304f0b3 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -1,13 +1,4 @@
-/**
- * blenlib/BKE_main.h (mar-2001 nzc)
- *
- * Main is the root of the 'database' of a Blender context. All data
- * is stuffed into lists, and all these lists are knotted to here. A
- * Blender file is not much more but a binary dump of these
- * lists. This list of lists is not serialized itself.
- *
- * Oops... this should be a _types.h file.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,8 +29,25 @@
#ifndef BKE_MAIN_H
#define BKE_MAIN_H
+/** \file BKE_main.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ * \section aboutmain Main struct
+ * Main is the root of the 'database' of a Blender context. All data
+ * is stuffed into lists, and all these lists are knotted to here. A
+ * Blender file is not much more but a binary dump of these
+ * lists. This list of lists is not serialized itself.
+ *
+ * Oops... this should be a _types.h file.
+ *
+ */
#include "DNA_listBase.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct Library;
typedef struct Main {
@@ -47,6 +55,7 @@ typedef struct Main {
char name[240];
short versionfile, subversionfile;
short minversionfile, minsubversionfile;
+ int revision; /* svn revision of binary that saved file */
struct Library *curlib;
ListBase scene;
@@ -77,8 +86,14 @@ typedef struct Main {
ListBase particle;
ListBase wm;
ListBase gpencil;
+
+ char id_tag_update[256];
} Main;
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 40d98394a8e..523a67eff67 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * General operations, lookup, etc. for materials.
*/
#ifndef BKE_MATERIAL_H
#define BKE_MATERIAL_H
+/** \file BKE_material.h
+ * \ingroup bke
+ * \brief General operations, lookup, etc. for materials.
+ */
#ifdef __cplusplus
extern "C" {
#endif
@@ -45,9 +48,11 @@ struct Object;
void init_def_material(void);
void free_material(struct Material *sc);
void test_object_materials(struct ID *id);
+void resize_object_material(struct Object *ob, const short totcol);
void init_material(struct Material *ma);
-struct Material *add_material(char *name);
+struct Material *add_material(const char *name);
struct Material *copy_material(struct Material *ma);
+struct Material *localize_material(struct Material *ma);
struct Material *give_node_material(struct Material *ma); /* returns node material or self */
void make_local_material(struct Material *ma);
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index 7fa4fc1a05e..c4119e99780 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_mball.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_MBALL_H
#define BKE_MBALL_H
+/** \file BKE_mball.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
struct MetaBall;
struct Object;
struct Scene;
@@ -127,12 +130,7 @@ struct pgn_elements {
char *data;
};
-void calc_mballco(struct MetaElem *ml, float *vec);
-float densfunc(struct MetaElem *ball, float x, float y, float z);
octal_node* find_metaball_octal_node(octal_node *node, float x, float y, float z, short depth);
-float metaball(float x, float y, float z);
-void accum_mballfaces(int i1, int i2, int i3, int i4);
-void *new_pgn_element(int size);
void freepolygonize(PROCESS *p);
void docube(CUBE *cube, PROCESS *p, struct MetaBall *mb);
@@ -159,7 +157,7 @@ float init_meta(struct Scene *scene, struct Object *ob);
void unlink_mball(struct MetaBall *mb);
void free_mball(struct MetaBall *mb);
-struct MetaBall *add_mball(char *name);
+struct MetaBall *add_mball(const char *name);
struct MetaBall *copy_mball(struct MetaBall *mb);
void make_local_mball(struct MetaBall *mb);
struct MetaElem *add_metaball_element(struct MetaBall *mb, const int type);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 7b31e87ab03..7dc1172d32e 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -1,4 +1,4 @@
-/**
+/*
* blenlib/BKE_mesh.h (mar-2001 nzc)
*
* $Id$
@@ -31,6 +31,10 @@
#ifndef BKE_MESH_H
#define BKE_MESH_H
+/** \file BKE_mesh.h
+ * \ingroup bke
+ */
+
/***/
struct BoundBox;
@@ -50,6 +54,8 @@ struct Object;
struct MTFace;
struct VecNor;
struct CustomData;
+struct DerivedMesh;
+struct Scene;
#ifdef __cplusplus
extern "C" {
@@ -82,7 +88,7 @@ void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart,
void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me, int unlink);
-struct Mesh *add_mesh(char *name);
+struct Mesh *add_mesh(const char *name);
struct Mesh *copy_mesh(struct Mesh *me);
void mesh_update_customdata_pointers(struct Mesh *me);
@@ -123,7 +129,9 @@ void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_
/* if old, it converts mface->edcode to edge drawflags */
void make_edges(struct Mesh *me, int old);
+
void mesh_strip_loose_faces(struct Mesh *me);
+void mesh_strip_loose_edges(struct Mesh *me);
/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
* and vertex normals are stored in actual mverts.
@@ -168,8 +176,8 @@ void create_vert_edge_map(ListBase **map, IndexNode **mem, const struct MEdge *m
/* Partial Mesh Visibility */
struct PartialVisibility *mesh_pmv_copy(struct PartialVisibility *);
void mesh_pmv_free(struct PartialVisibility *);
-void mesh_pmv_revert(struct Object *ob, struct Mesh *me);
-void mesh_pmv_off(struct Object *ob, struct Mesh *me);
+void mesh_pmv_revert(struct Mesh *me);
+void mesh_pmv_off(struct Mesh *me);
/* functions for making menu's from customdata layers */
int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
@@ -183,9 +191,15 @@ int mesh_center_median(struct Mesh *me, float cent[3]);
int mesh_center_bounds(struct Mesh *me, float cent[3]);
void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
+/* mesh_validate.c */
+int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, int totvert, struct MEdge *medges, int totedge, struct MFace *mfaces, int totface, const short do_verbose, const short do_fixes);
+int BKE_mesh_validate(struct Mesh *me, int do_verbose);
+int BKE_mesh_validate_dm(struct DerivedMesh *dm);
+
+void BKE_mesh_calc_edges(struct Mesh *mesh, int update);
+
#ifdef __cplusplus
}
#endif
-#endif
-
+#endif /* BKE_MESH_H */
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 48ce0d4b57b..5f6120509f0 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +29,10 @@
#ifndef BKE_MODIFIER_H
#define BKE_MODIFIER_H
+/** \file BKE_modifier.h
+ * \ingroup bke
+ */
+
#include "DNA_modifier_types.h" /* needed for all enum typdefs */
#include "BKE_customdata.h"
@@ -135,6 +138,12 @@ typedef struct ModifierTypeInfo {
float (*vertexCos)[3], int numVerts,
int useRenderParams, int isFinalCalc);
+ /* Like deformMatricesEM but called from object mode (for supporting modifiers in sculpt mode) */
+ void (*deformMatrices)(
+ struct ModifierData *md, struct Object *ob,
+ struct DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
+
/* Like deformVerts but called during editmode (for supporting modifiers)
*/
void (*deformVertsEM)(
@@ -246,6 +255,17 @@ typedef struct ModifierTypeInfo {
*/
int (*dependsOnTime)(struct ModifierData *md);
+
+ /* True when a deform modifier uses normals, the requiredDataMask
+ * cant be used here because that refers to a normal layer where as
+ * in this case we need to know if the deform modifier uses normals.
+ *
+ * this is needed because applying 2 deform modifiers will give the
+ * second modifier bogus normals.
+ * */
+ int (*dependsOnNormals)(struct ModifierData *md);
+
+
/* Should call the given walk function on with a pointer to each Object
* pointer that the modifier data stores. This is used for linking on file
* load and for unlinking objects or forwarding object references.
@@ -284,7 +304,11 @@ int modifier_couldBeCage(struct Scene *scene, struct ModifierData *md)
int modifier_isCorrectableDeformed(struct ModifierData *md);
int modifier_sameTopology(ModifierData *md);
int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
-void modifier_setError(struct ModifierData *md, char *format, ...);
+void modifier_setError(struct ModifierData *md, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)));
+#endif
+;
void modifiers_foreachObjectLink(struct Object *ob,
ObjectWalkFunc walk,
@@ -305,7 +329,7 @@ int modifiers_isParticleEnabled(struct Object *ob);
struct Object *modifiers_isDeformedByArmature(struct Object *ob);
struct Object *modifiers_isDeformedByLattice(struct Object *ob);
int modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
-int modifiers_isCorrectableDeformed(struct Scene *scene, struct Object *ob);
+int modifiers_isCorrectableDeformed(struct Object *ob);
void modifier_freeTemporaryData(struct ModifierData *md);
int modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
@@ -322,6 +346,9 @@ struct LinkNode *modifiers_calcDataMasks(struct Scene *scene,
int required_mode);
struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob);
+/* ensure modifier correctness when changing ob->data */
+void test_object_modifiers(struct Object *ob);
+
/* here for do_versions */
void modifier_mdef_compact_influences(struct ModifierData *md);
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 39fc795e6ff..ea34ff4aa07 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -30,6 +30,10 @@
#ifndef BKE_MULTIRES_H
#define BKE_MULTIRES_H
+/** \file BKE_multires.h
+ * \ingroup bke
+ */
+
struct DerivedMesh;
struct Mesh;
struct MFace;
@@ -37,6 +41,8 @@ struct Multires;
struct MultiresModifierData;
struct ModifierData;
struct Object;
+struct Scene;
+struct MDisps;
void multires_mark_as_modified(struct Object *ob);
@@ -44,15 +50,18 @@ void multires_force_update(struct Object *ob);
void multires_force_render_update(struct Object *ob);
void multires_force_external_reload(struct Object *ob);
+void multiresModifier_set_levels_from_disps(struct MultiresModifierData *mmd, struct Object *ob);
+
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*,
int local_mmd, struct DerivedMesh*, struct Object *, int, int);
struct MultiresModifierData *find_multires_modifier_before(struct Scene *scene,
struct ModifierData *lastmd);
+struct MultiresModifierData *get_multires_modifier(struct Scene *scene, struct Object *ob, int use_first);
struct DerivedMesh *get_multires_dm(struct Scene *scene, struct MultiresModifierData *mmd,
struct Object *ob);
-void multiresModifier_join(struct Object *);
void multiresModifier_del_levels(struct MultiresModifierData *, struct Object *, int direction);
+void multiresModifier_base_apply(struct MultiresModifierData *mmd, struct Object *ob);
void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Object *ob,
int updateblock, int simple);
int multiresModifier_reshape(struct Scene *scene, struct MultiresModifierData *mmd,
@@ -69,5 +78,22 @@ void multires_free(struct Multires *mr);
void multires_load_old(struct Object *ob, struct Mesh *me);
void multires_load_old_250(struct Mesh *);
-#endif
+void multiresModifier_scale_disp(struct Scene *scene, struct Object *ob);
+void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struct Object *to_ob);
+
+int multires_mdisp_corners(struct MDisps *s);
+void multires_mdisp_smooth_bounds(struct MDisps *disps);
+
+/* update multires data after topology changing */
+void multires_topology_changed(struct Scene *scene, struct Object *ob);
+
+/**** interpolation stuff ****/
+void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);
+void mdisp_rot_crn_to_face(const int S, const int corners, const int face_side, const float x, const float y, float *u, float *v);
+int mdisp_rot_face_to_crn(const int corners, const int face_side, const float u, const float v, float *x, float *y);
+void mdisp_apply_weight(const int S, const int corners, int x, int y, const int face_side, float crn_weight[4][2], float *u_r, float *v_r);
+void mdisp_flip_disp(const int S, const int corners, const float axis_x[2], const float axis_y[2], float disp[3]);
+void mdisp_join_tris(struct MDisps *dst, struct MDisps *tri1, struct MDisps *tri2);
+
+#endif // BKE_MULTIRES_H
diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h
index 30bce613dbe..0206756a1ad 100644
--- a/source/blender/blenkernel/BKE_nla.h
+++ b/source/blender/blenkernel/BKE_nla.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,11 @@
#ifndef BKE_NLA_H
#define BKE_NLA_H
+/** \file BKE_nla.h
+ * \ingroup bke
+ * \author Joshua Leung (full recode)
+ */
+
struct AnimData;
struct NlaStrip;
struct NlaTrack;
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 4bd4cc3792f..41e41eab78f 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,10 @@
#ifndef BKE_NODE_H
#define BKE_NODE_H
+/** \file BKE_node.h
+ * \ingroup bke
+ */
+
/* not very important, but the stack solver likes to know a maximum */
#define MAX_SOCKET 64
@@ -61,21 +65,18 @@ struct uiLayout;
typedef struct bNodeSocketType {
int type, limit;
- char *name;
+ const char *name;
float val1, val2, val3, val4; /* default alloc value for inputs */
float min, max; /* default range for inputs */
/* after this line is used internal only */
struct bNodeSocket *sock; /* used during verify_types */
- struct bNodeSocket *internsock; /* group nodes, the internal socket counterpart */
- int own_index; /* verify group nodes */
-
} bNodeSocketType;
typedef struct bNodeType {
void *next,*prev;
int type;
- char *name;
+ const char *name; /* can be allocated too */
float width, minwidth, maxwidth;
short nclass, flag;
@@ -87,6 +88,7 @@ typedef struct bNodeType {
/* this line is set on startup of blender */
void (*uifunc)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr);
+ const char *(*labelfunc)(struct bNode *);
void (*initfunc)(struct bNode *);
void (*freestoragefunc)(struct bNode *);
@@ -125,17 +127,21 @@ typedef struct bNodeType {
#define NODE_CLASS_PATTERN 12
#define NODE_CLASS_TEXTURE 13
+/* enum values for input/output */
+#define SOCK_IN 1
+#define SOCK_OUT 2
+
/* ************** GENERIC API, TREES *************** */
void ntreeVerifyTypes(struct bNodeTree *ntree);
-struct bNodeTree *ntreeAddTree(int type);
+struct bNodeTree *ntreeAddTree(const char *name, int type, const short is_group);
void ntreeInitTypes(struct bNodeTree *ntree);
-void ntreeMakeOwnType(struct bNodeTree *ntree);
+//void ntreeMakeGroupSockets(struct bNodeTree *ntree);
void ntreeUpdateType(struct bNodeTree *ntree, struct bNodeType *ntype);
void ntreeFreeTree(struct bNodeTree *ntree);
-struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree, int internal_select);
+struct bNodeTree *ntreeCopyTree(struct bNodeTree *ntree);
void ntreeSwitchID(struct bNodeTree *ntree, struct ID *sce_from, struct ID *sce_to);
void ntreeMakeLocal(struct bNodeTree *ntree);
@@ -173,14 +179,14 @@ void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeT
void nodeMakeDynamicType(struct bNode *node);
int nodeDynamicUnlinkText(struct ID *txtid);
void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
-struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal);
+struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
struct bNode *nodeFindNodebyName(struct bNodeTree *ntree, const char *name);
-int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex);
+int nodeFindNode(struct bNodeTree *ntree, struct bNodeSocket *sock, struct bNode **nodep, int *sockindex, int *in_out);
struct bNodeLink *nodeFindLink(struct bNodeTree *ntree, struct bNodeSocket *from, struct bNodeSocket *to);
int nodeCountSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
@@ -192,26 +198,44 @@ int nodeSetActiveID(struct bNodeTree *ntree, short idtype, struct ID *id);
void nodeClearActiveID(struct bNodeTree *ntree, short idtype);
void NodeTagChanged(struct bNodeTree *ntree, struct bNode *node);
-void NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
+int NodeTagIDChanged(struct bNodeTree *ntree, struct ID *id);
+void ntreeClearTags(struct bNodeTree *ntree);
/* ************** Groups ****************** */
struct bNode *nodeMakeGroupFromSelected(struct bNodeTree *ntree);
int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
-void nodeVerifyGroup(struct bNodeTree *ngroup);
+void nodeGroupVerify(struct bNodeTree *ngroup);
void nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
-void nodeCopyGroup(struct bNode *gnode);
+void nodeGroupCopy(struct bNode *gnode);
+
+struct bNodeSocket *nodeGroupAddSocket(struct bNodeTree *ngroup, const char *name, int type, int in_out);
+struct bNodeSocket *nodeGroupExposeSocket(struct bNodeTree *ngroup, struct bNodeSocket *sock, int in_out);
+void nodeGroupExposeAllSockets(struct bNodeTree *ngroup);
+void nodeGroupRemoveSocket(struct bNodeTree *ngroup, struct bNodeSocket *gsock, int in_out);
/* ************** COMMON NODES *************** */
+/* Init a new node type struct with default values and callbacks */
+void node_type_base(struct bNodeType *ntype, int type, const char *name, short nclass, short flag,
+ struct bNodeSocketType *inputs, struct bNodeSocketType *outputs);
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth);
+void node_type_init(struct bNodeType *ntype, void (*initfunc)(struct bNode *));
+void node_type_storage(struct bNodeType *ntype,
+ const char *storagename,
+ void (*freestoragefunc)(struct bNode *),
+ void (*copystoragefunc)(struct bNode *, struct bNode *));
+void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **));
+void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *));
+
#define NODE_GROUP 2
#define NODE_GROUP_MENU 1000
#define NODE_DYNAMIC_MENU 4000
-extern bNodeType node_group_typeinfo;
-
+void register_node_type_group(ListBase *lb);
/* ************** SHADER NODES *************** */
@@ -399,7 +423,6 @@ int ntreeCompositTagAnimated(struct bNodeTree *ntree);
void ntreeCompositTagGenerators(struct bNodeTree *ntree);
void ntreeCompositForceHidden(struct bNodeTree *ntree, struct Scene *scene);
-void free_compbuf(struct CompBuf *cbuf); /* internal...*/
/* ************** TEXTURE NODES *************** */
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 2a7ba4f98c9..3d32ba5a30a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * General operations, lookup, etc. for blender objects.
*/
#ifndef BKE_OBJECT_H
#define BKE_OBJECT_H
+/** \file BKE_object.h
+ * \ingroup bke
+ * \brief General operations, lookup, etc. for blender objects.
+ */
#ifdef __cplusplus
extern "C" {
#endif
@@ -71,25 +74,26 @@ void object_free_modifiers(struct Object *ob);
void object_make_proxy(struct Object *ob, struct Object *target, struct Object *gob);
void object_copy_proxy_drivers(struct Object *ob, struct Object *target);
-void unlink_object(struct Scene *scene, struct Object *ob);
+void unlink_object(struct Object *ob);
int exist_object(struct Object *obtest);
-void *add_camera(char *name);
+void *add_camera(const char *name);
struct Camera *copy_camera(struct Camera *cam);
void make_local_camera(struct Camera *cam);
float dof_camera(struct Object *ob);
-void *add_lamp(char *name);
+void *add_lamp(const char *name);
struct Lamp *copy_lamp(struct Lamp *la);
void make_local_lamp(struct Lamp *la);
void free_camera(struct Camera *ca);
void free_lamp(struct Lamp *la);
-struct Object *add_only_object(int type, char *name);
+struct Object *add_only_object(int type, const char *name);
struct Object *add_object(struct Scene *scene, int type);
struct Object *copy_object(struct Object *ob);
void expand_local_object(struct Object *ob);
void make_local_object(struct Object *ob);
+int object_is_libdata(struct Object *ob);
int object_data_is_libdata(struct Object *ob);
void set_mblur_offs(float blur);
void set_field_offs(float field);
@@ -98,10 +102,10 @@ void disable_speed_curve(int val);
float bsystem_time(struct Scene *scene, struct Object *ob, float cfra, float ofs);
void object_scale_to_mat3(struct Object *ob, float mat[][3]);
void object_rot_to_mat3(struct Object *ob, float mat[][3]);
-void object_mat3_to_rot(struct Object *ob, float mat[][3], int use_compat);
+void object_mat3_to_rot(struct Object *ob, float mat[][3], short use_compat);
void object_to_mat3(struct Object *ob, float mat[][3]);
void object_to_mat4(struct Object *ob, float mat[][4]);
-void object_apply_mat4(struct Object *ob, float mat[][4]);
+void object_apply_mat4(struct Object *ob, float mat[][4], const short use_compat, const short use_parent);
void set_no_parent_ipo(int val);
@@ -130,7 +134,7 @@ int give_obdata_texspace(struct Object *ob, short **texflag, float **loc, float
int object_insert_ptcache(struct Object *ob);
// void object_delete_ptcache(struct Object *ob, int index);
-struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, char *name, int from_mix);
+struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, int from_mix);
void object_camera_matrix(
struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second,
diff --git a/source/blender/blenkernel/BKE_packedFile.h b/source/blender/blenkernel/BKE_packedFile.h
index 58cf144483f..541c581e762 100644
--- a/source/blender/blenkernel/BKE_packedFile.h
+++ b/source/blender/blenkernel/BKE_packedFile.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_packedFile.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,11 @@
#ifndef BKE_PACKEDFILE_H
#define BKE_PACKEDFILE_H
+/** \file BKE_packedFile.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
#define RET_OK 0
#define RET_ERROR 1
@@ -42,7 +45,7 @@ struct ReportList;
struct VFont;
/* pack */
-struct PackedFile *newPackedFile(struct ReportList *reports, char *filename);
+struct PackedFile *newPackedFile(struct ReportList *reports, const char *filename);
struct PackedFile *newPackedFileMemory(void *mem, int memlen);
void packAll(struct Main *bmain, struct ReportList *reports);
@@ -50,18 +53,18 @@ void packAll(struct Main *bmain, struct ReportList *reports);
/* unpack */
char *unpackFile(struct ReportList *reports, char *abs_name, char *local_name, struct PackedFile *pf, int how);
int unpackVFont(struct ReportList *reports, struct VFont *vfont, int how);
-int unpackSound(struct ReportList *reports, struct bSound *sound, int how);
+int unpackSound(struct Main *bmain, struct ReportList *reports, struct bSound *sound, int how);
int unpackImage(struct ReportList *reports, struct Image *ima, int how);
void unpackAll(struct Main *bmain, struct ReportList *reports, int how);
-int writePackedFile(struct ReportList *reports, char *filename, struct PackedFile *pf, int guimode);
+int writePackedFile(struct ReportList *reports, const char *filename, struct PackedFile *pf, int guimode);
/* free */
void freePackedFile(struct PackedFile *pf);
/* info */
int countPackedFiles(struct Main *bmain);
-int checkPackedFile(char *filename, struct PackedFile *pf);
+int checkPackedFile(const char *filename, struct PackedFile *pf);
/* read */
int seekPackedFile(struct PackedFile *pf, int offset, int whence);
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index e2d48baba37..e6caae7a954 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -28,6 +28,10 @@
#ifndef BKE_PAINT_H
#define BKE_PAINT_H
+/** \file BKE_paint.h
+ * \ingroup bke
+ */
+
#include "DNA_vec_types.h"
struct Brush;
@@ -78,8 +82,11 @@ typedef struct SculptSession {
/* PBVH acceleration structure */
struct PBVH *pbvh;
- /* Used temporarily per-stroke */
- float *vertexcosnos;
+ /* Paiting on deformed mesh */
+ int modifiers_active; /* object is deformed with some modifiers */
+ float (*orig_cos)[3]; /* coords of undeformed mesh */
+ float (*deform_cos)[3]; /* coords of deformed mesh but without stroke displacement */
+ float (*deform_imats)[3][3]; /* crazyspace deformation matricies */
/* Partial redraw */
int partial_redraw;
@@ -95,8 +102,6 @@ typedef struct SculptSession {
struct GPUDrawObject *drawobject;
- int modifiers_active;
-
rcti previous_r;
} SculptSession;
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 1416e1280cf..507adcc5f2d 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -1,6 +1,4 @@
-/* BKE_particle.h
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,10 @@
#ifndef BKE_PARTICLE_H
#define BKE_PARTICLE_H
+/** \file BKE_particle.h
+ * \ingroup bke
+ */
+
#include "DNA_particle_types.h"
#include "DNA_object_types.h"
@@ -63,6 +65,7 @@ struct BVHTreeRayHit;
#define LOOP_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
#define LOOP_EXISTING_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & PARS_UNEXIST))
#define LOOP_SHOWN_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(!(pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
+#define LOOP_DYNAMIC_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++) if(pa->state.time > 0.f)
#define PSYS_FRAND_COUNT 1024
#define PSYS_FRAND(seed) psys->frand[(seed) % PSYS_FRAND_COUNT]
@@ -79,20 +82,10 @@ typedef struct ParticleSimulationData {
struct ListBase *colliders;
} ParticleSimulationData;
-//typedef struct ParticleReactEvent {
-// struct ParticleReactEvent *next, *prev;
-// int event, pa_num;
-// Object *ob;
-// struct ParticleSystem *psys;
-// struct ParticleKey state;
-//
-// float time, size;
-//}ParticleReactEvent;
-
typedef struct ParticleTexture{
float ivel; /* used in reset */
float time, life, exist, size; /* used in init */
- float pvel[3]; /* used in physics */
+ float damp, gravity, field; /* used in physics */
float length, clump, kink, effector;/* used in path caching */
float rough1, rough2, roughe; /* used in path caching */
} ParticleTexture;
@@ -158,6 +151,7 @@ typedef struct ParticleBillboardData
int uv[3];
int lock, num;
int totnum;
+ int lifetime;
short align, uv_split, anim, split_offset;
} ParticleBillboardData;
@@ -171,7 +165,9 @@ typedef struct ParticleCollision
float co1[3], co2[3]; // ray start and end points
float ve1[3], ve2[3]; // particle velocities
float ray_len; // original length of co2-co1, needed for collision time evaluation
- float t; // time of previous collision, needed for substracting face velocity
+ float f; // time factor of previous collision, needed for substracting face velocity
+ float cfra; // start of the timestep (during frame change, since previous integer frame)
+ float dfra; // duration of timestep in frames
} ParticleCollision;
typedef struct ParticleDrawData {
@@ -224,9 +220,9 @@ void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int tim
void psys_particle_on_emitter(struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
-struct ModifierData *object_add_particle_system(struct Scene *scene, struct Object *ob, char *name);
+struct ModifierData *object_add_particle_system(struct Scene *scene, struct Object *ob, const char *name);
void object_remove_particle_system(struct Scene *scene, struct Object *ob);
-struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
+struct ParticleSettings *psys_new_settings(const char *name, struct Main *main);
struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
void make_local_particlesettings(struct ParticleSettings *part);
@@ -288,7 +284,7 @@ float psys_get_dietime_from_cache(struct PointCache *cache, int index);
void psys_free_pdd(struct ParticleSystem *psys);
float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
-void psys_get_texture(struct ParticleSimulationData *sim, struct Material *ma, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
+void psys_get_texture(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleTexture *ptex, int event, float cfra);
void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float (*orcodata)[3], float *uv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
float psys_particle_value_from_verts(struct DerivedMesh *dm, short from, struct ParticleData *pa, float *values);
void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
@@ -309,7 +305,7 @@ void reset_particle(struct ParticleSimulationData *sim, struct ParticleData *pa,
/* psys_reset */
#define PSYS_RESET_ALL 1
#define PSYS_RESET_DEPSGRAPH 2
-#define PSYS_RESET_CHILDREN 3
+/* #define PSYS_RESET_CHILDREN 3 */ /*UNUSED*/
#define PSYS_RESET_CACHE_MISS 4
/* index_dmcache */
diff --git a/source/blender/blenkernel/BKE_plugin_types.h b/source/blender/blenkernel/BKE_plugin_types.h
index 0bb1400858d..a7842b526ce 100644
--- a/source/blender/blenkernel/BKE_plugin_types.h
+++ b/source/blender/blenkernel/BKE_plugin_types.h
@@ -1,9 +1,4 @@
-/**
- * blenlib/BKE_plugin_types.h (mar-2001 nzc)
- *
- * Renderrecipe and scene decription. The fact that there is a
- * hierarchy here is a bit strange, and not desirable.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +29,11 @@
#ifndef BKE_PLUGIN_TYPES_H
#define BKE_PLUGIN_TYPES_H
+/** \file BKE_plugin_types.h
+ * \ingroup bke
+ * \author nzc
+ */
+
struct ImBuf;
typedef int (*TexDoitold)(int stype, void *cast, float *texvec, float *dxt, float *dyt);
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
index 52536e10e56..346368a5958 100644
--- a/source/blender/blenkernel/BKE_pointcache.h
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -29,9 +29,14 @@
#ifndef BKE_POINTCACHE_H
#define BKE_POINTCACHE_H
+/** \file BKE_pointcache.h
+ * \ingroup bke
+ */
+
#include "DNA_ID.h"
#include "DNA_object_force.h"
#include "DNA_boid_types.h"
+#include <stdio.h> /* for FILE */
/* Point cache clearing option, for BKE_ptcache_id_clear, before
* and after are non inclusive (they wont remove the cfra) */
@@ -44,7 +49,7 @@
#define PTCACHE_RESET_DEPSGRAPH 0
#define PTCACHE_RESET_BAKED 1
#define PTCACHE_RESET_OUTDATED 2
-#define PTCACHE_RESET_FREE 3
+/* #define PTCACHE_RESET_FREE 3 */ /*UNUSED*/
/* Add the blendfile name after blendcache_ */
#define PTCACHE_EXT ".bphys"
@@ -62,6 +67,13 @@
#define PTCACHE_TYPE_SMOKE_DOMAIN 3
#define PTCACHE_TYPE_SMOKE_HIGHRES 4
+/* high bits reserved for flags that need to be stored in file */
+#define PTCACHE_TYPEFLAG_COMPRESS (1<<16)
+#define PTCACHE_TYPEFLAG_EXTRADATA (1<<17)
+
+#define PTCACHE_TYPEFLAG_TYPEMASK 0x0000FFFF
+#define PTCACHE_TYPEFLAG_FLAGMASK 0xFFFF0000
+
/* PTCache read return code */
#define PTCACHE_READ_EXACT 1
#define PTCACHE_READ_INTERPOLATED 2
@@ -81,7 +93,7 @@ struct SoftBody;
/* temp structure for read/write */
typedef struct PTCacheData {
- int index;
+ unsigned int index;
float loc[3];
float vel[3];
float rot[4];
@@ -94,8 +106,9 @@ typedef struct PTCacheData {
typedef struct PTCacheFile {
FILE *fp;
- int totpoint, type;
- unsigned int data_types;
+ int frame, old_format;
+ unsigned int totpoint, type;
+ unsigned int data_types, flag;
struct PTCacheData data;
void *cur[BPHYS_TOT_DATA];
@@ -109,23 +122,31 @@ typedef struct PTCacheID {
struct Scene *scene;
struct Object *ob;
void *calldata;
- int type;
- int stack_index;
- int flag;
+ unsigned int type;
+ unsigned int stack_index;
+ unsigned int flag;
/* flags defined in DNA_object_force.h */
unsigned int data_types, info_types;
/* copies point data to cache data */
- int (*write_elem)(int index, void *calldata, void **data, int cfra);
+ int (*write_point)(int index, void *calldata, void **data, int cfra);
+ /* copies cache cata to point data */
+ void (*read_point)(int index, void *calldata, void **data, float cfra, float *old_data);
+ /* interpolated between previously read point data and cache data */
+ void (*interpolate_point)(int index, void *calldata, void **data, float cfra, float cfra1, float cfra2, float *old_data);
+
/* copies point data to cache data */
int (*write_stream)(PTCacheFile *pf, void *calldata);
/* copies cache cata to point data */
- void (*read_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float *old_data);
- /* copies cache cata to point data */
void (*read_stream)(PTCacheFile *pf, void *calldata);
- /* interpolated between previously read point data and cache data */
- void (*interpolate_elem)(int index, void *calldata, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data);
+
+ /* copies custom extradata to cache data */
+ void (*write_extra_data)(void *calldata, struct PTCacheMem *pm, int cfra);
+ /* copies custom extradata to cache data */
+ void (*read_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra);
+ /* copies custom extradata to cache data */
+ void (*interpolate_extra_data)(void *calldata, struct PTCacheMem *pm, float cfra, float cfra1, float cfra2);
/* total number of simulated points (the cfra parameter is just for using same function pointer with totwrite) */
int (*totpoint)(void *calldata, int cfra);
@@ -222,8 +243,8 @@ typedef struct PTCacheEdit {
int totpoint, totframes, totcached, edited;
- char sel_col[3];
- char nosel_col[3];
+ unsigned char sel_col[3];
+ unsigned char nosel_col[3];
} PTCacheEdit;
/* Particle functions */
@@ -234,7 +255,6 @@ void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct Soft
void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys);
void BKE_ptcache_id_from_cloth(PTCacheID *pid, struct Object *ob, struct ClothModifierData *clmd);
void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
-void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd);
void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct Scene *scene, int duplis);
@@ -242,7 +262,7 @@ void BKE_ptcache_ids_from_object(struct ListBase *lb, struct Object *ob, struct
void BKE_ptcache_remove(void);
/************ ID specific functions ************************/
-void BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra);
+void BKE_ptcache_id_clear(PTCacheID *id, int mode, unsigned int cfra);
int BKE_ptcache_id_exist(PTCacheID *id, int cfra);
int BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode);
void BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale);
@@ -255,10 +275,13 @@ void BKE_ptcache_update_info(PTCacheID *pid);
/* Size of cache data type. */
int BKE_ptcache_data_size(int data_type);
+/* Is point with indes in memory cache */
+int BKE_ptcache_mem_index_find(struct PTCacheMem *pm, unsigned int index);
+
/* Memory cache read/write helpers. */
-void BKE_ptcache_mem_init_pointers(struct PTCacheMem *pm);
-void BKE_ptcache_mem_incr_pointers(struct PTCacheMem *pm);
-int BKE_ptcache_mem_seek_pointers(int point_index, struct PTCacheMem *pm);
+void BKE_ptcache_mem_pointers_init(struct PTCacheMem *pm);
+void BKE_ptcache_mem_pointers_incr(struct PTCacheMem *pm);
+int BKE_ptcache_mem_pointers_seek(int point_index, struct PTCacheMem *pm);
/* Copy a specific data type from cache data to point data. */
void BKE_ptcache_data_get(void **data, int type, int index, void *to);
@@ -267,10 +290,10 @@ void BKE_ptcache_data_get(void **data, int type, int index, void *to);
void BKE_ptcache_data_set(void **data, int type, void *from);
/* Main cache reading call. */
-int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec);
+int BKE_ptcache_read(PTCacheID *pid, float cfra);
/* Main cache writing call. */
-int BKE_ptcache_write_cache(PTCacheID *pid, int cfra);
+int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra);
/****************** Continue physics ***************/
void BKE_ptcache_set_continue_physics(struct Main *bmain, struct Scene *scene, int enable);
@@ -289,7 +312,7 @@ struct PointCache *BKE_ptcache_copy_list(struct ListBase *ptcaches_new, struct L
void BKE_ptcache_quick_cache_all(struct Main *bmain, struct Scene *scene);
/* Bake cache or simulate to current frame with settings defined in the baker. */
-void BKE_ptcache_make_cache(struct PTCacheBaker* baker);
+void BKE_ptcache_bake(struct PTCacheBaker* baker);
/* Convert disk cache to memory cache. */
void BKE_ptcache_disk_to_mem(struct PTCacheID *pid);
@@ -300,6 +323,9 @@ void BKE_ptcache_mem_to_disk(struct PTCacheID *pid);
/* Convert disk cache to memory cache and vice versa. Clears the cache that was converted. */
void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid);
+/* Rename all disk cache files with a new name. Doesn't touch the actual content of the files. */
+void BKE_ptcache_disk_cache_rename(struct PTCacheID *pid, char *from, char *to);
+
/* Loads simulation from external (disk) cache files. */
void BKE_ptcache_load_external(struct PTCacheID *pid);
diff --git a/source/blender/blenkernel/BKE_property.h b/source/blender/blenkernel/BKE_property.h
index b9cca612846..10014a4611d 100644
--- a/source/blender/blenkernel/BKE_property.h
+++ b/source/blender/blenkernel/BKE_property.h
@@ -1,6 +1,4 @@
-/**
- * blenkernel/BKE_property.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef BKE_PROPERTY_H
#define BKE_PROPERTY_H
+/** \file BKE_property.h
+ * \ingroup bke
+ */
+
struct bProperty;
struct ListBase;
struct Object;
@@ -42,7 +44,7 @@ void copy_properties(struct ListBase *lbn, struct ListBase *lbo);
void init_property(struct bProperty *prop);
struct bProperty *new_property(int type);
void unique_property(struct bProperty *first, struct bProperty *prop, int force);
-struct bProperty *get_ob_property(struct Object *ob, char *name);
+struct bProperty *get_ob_property(struct Object *ob, const char *name);
void set_ob_property(struct Object *ob, struct bProperty *propc);
int compare_property(struct bProperty *prop, char *str);
void set_property(struct bProperty *prop, char *str);
diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h
index d7b7801d697..397c96422a5 100644
--- a/source/blender/blenkernel/BKE_report.h
+++ b/source/blender/blenkernel/BKE_report.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,10 @@
#ifndef BKE_REPORT_H
#define BKE_REPORT_H
+/** \file BKE_report.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -45,7 +49,11 @@ void BKE_reports_init(ReportList *reports, int flag);
void BKE_reports_clear(ReportList *reports);
void BKE_report(ReportList *reports, ReportType type, const char *message);
-void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...);
+void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 3, 4)));
+#endif
+;
void BKE_reports_prepend(ReportList *reports, const char *prepend);
void BKE_reports_prependf(ReportList *reports, const char *prepend, ...);
diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h
index 6cafb7ef104..0db0b71c102 100644
--- a/source/blender/blenkernel/BKE_sca.h
+++ b/source/blender/blenkernel/BKE_sca.h
@@ -1,7 +1,5 @@
-/**
- * blenlib/BKE_sca.h (mar-2001 nzc)
- *
- * $Id$
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -31,6 +29,10 @@
#ifndef BKE_SCA_H
#define BKE_SCA_H
+/** \file BKE_sca.h
+ * \ingroup bke
+ */
+
struct Text;
struct bSensor;
struct Object;
@@ -68,7 +70,7 @@ void clear_sca_new_poins_ob(struct Object *ob);
void clear_sca_new_poins(void);
void set_sca_new_poins_ob(struct Object *ob);
void set_sca_new_poins(void);
-void sca_remove_ob_poin(struct Object *obt, struct Object *ob);
+void sca_remove_ob_poin(struct Object *obt, struct Object *ob);
void sca_move_sensor(struct bSensor *sens_to_move, struct Object *ob, int move_up);
void sca_move_controller(struct bController *cont_to_move, struct Object *ob, int move_up);
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 96ef8d44cf4..ac85f91bf46 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_scene.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,16 @@
#ifndef BKE_SCENE_H
#define BKE_SCENE_H
+/** \file BKE_scene.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct AviCodecData;
struct Base;
struct bglMats;
@@ -47,20 +55,20 @@ struct Text;
#define SCE_COPY_LINK_DATA 2
#define SCE_COPY_FULL 3
-#define SETLOOPER(s, b) sce= s, b= _setlooper_base_step(&sce, NULL); b; b= _setlooper_base_step(&sce, b)
-struct Base *_setlooper_base_step(struct Scene **sce, struct Base *base);
+#define SETLOOPER(_sce_basis, _sce_iter, _base) _sce_iter= _sce_basis, _base= _setlooper_base_step(&_sce_iter, NULL); _base; _base= _setlooper_base_step(&_sce_iter, _base)
+struct Base *_setlooper_base_step(struct Scene **sce_iter, struct Base *base);
void free_avicodecdata(struct AviCodecData *acd);
void free_qtcodecdata(struct QuicktimeCodecData *acd);
void free_scene(struct Scene *sce);
-struct Scene *add_scene(char *name);
+struct Scene *add_scene(const char *name);
struct Base *object_in_scene(struct Object *ob, struct Scene *sce);
void set_scene_bg(struct Main *bmain, struct Scene *sce);
-struct Scene *set_scene_name(struct Main *bmain, char *name);
+struct Scene *set_scene_name(struct Main *bmain, const char *name);
-struct Scene *copy_scene(struct Main *bmain, struct Scene *sce, int type);
+struct Scene *copy_scene(struct Scene *sce, int type);
void unlink_scene(struct Main *bmain, struct Scene *sce, struct Scene *newsce);
int next_object(struct Scene **scene, int val, struct Base **base, struct Object **ob);
@@ -72,6 +80,7 @@ char *scene_find_marker_name(struct Scene *scene, int frame);
char *scene_find_last_marker_name(struct Scene *scene, int frame);
int scene_marker_tfm_translate(struct Scene *scene, int delta, int flag);
int scene_marker_tfm_extend(struct Scene *scene, int delta, int flag, int frame, char side);
+int scene_marker_tfm_scale(struct Scene *scene, float value, int flag);
struct Base *scene_add_base(struct Scene *sce, struct Object *ob);
void scene_deselect_all(struct Scene *sce);
@@ -93,5 +102,9 @@ int get_render_child_particle_number(struct RenderData *r, int num);
int get_render_shadow_samples(struct RenderData *r, int samples);
float get_render_aosss_error(struct RenderData *r, float error);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 125486625bb..0a7d9780a6b 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_screen.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_SCREEN_H
#define BKE_SCREEN_H
+/** \file BKE_screen.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
struct ARegion;
struct bContext;
struct bContextDataResult;
diff --git a/source/blender/blenkernel/BKE_script.h b/source/blender/blenkernel/BKE_script.h
index 4ea1ee6db85..304e46fe2c5 100644
--- a/source/blender/blenkernel/BKE_script.h
+++ b/source/blender/blenkernel/BKE_script.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_script.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,13 @@
#ifndef BKE_SCRIPT_H
#define BKE_SCRIPT_H
+/** \file BKE_script.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ * \author Willian P. Germano
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 0766012b4a5..cc1d8537cbd 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,10 @@
#ifndef BKE_SEQUENCER_H
#define BKE_SEQUENCER_H
+/** \file BKE_sequencer.h
+ * \ingroup bke
+ */
+
struct bContext;
struct Editing;
struct ImBuf;
@@ -46,6 +50,11 @@ struct StripElem;
#define BUILD_SEQAR_COUNT_CURRENT 1
#define BUILD_SEQAR_COUNT_CHILDREN 2
+#define EARLY_NO_INPUT -1
+#define EARLY_DO_EFFECT 0
+#define EARLY_USE_INPUT_1 1
+#define EARLY_USE_INPUT_2 2
+
/* sequence iterator */
typedef struct SeqIterator {
@@ -78,6 +87,22 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us
seq_end(&iter); \
}
+typedef struct SeqRenderData {
+ struct Main *bmain;
+ struct Scene *scene;
+ int rectx;
+ int recty;
+ int preview_render_size;
+ int motion_blur_samples;
+ float motion_blur_shutter;
+} SeqRenderData;
+
+SeqRenderData seq_new_render_data(
+ struct Main * bmain, struct Scene * scene,
+ int rectx, int recty, int preview_render_size);
+
+int seq_cmp_render_data(const SeqRenderData * a, const SeqRenderData * b);
+unsigned int seq_hash_render_data(const SeqRenderData * a);
/* Wipe effect */
enum {DO_SINGLE_WIPE, DO_DOUBLE_WIPE, DO_BOX_WIPE, DO_CROSS_WIPE,
@@ -92,7 +117,7 @@ struct SeqEffectHandle {
/* number of input strips needed
(called directly after construction) */
- int (*num_inputs)();
+ int (*num_inputs)(void);
/* load is called first time after readblenfile in
get_sequence_effect automatically */
@@ -124,53 +149,61 @@ struct SeqEffectHandle {
(mixed cases are handled one layer up...) */
struct ImBuf* (*execute)(
- struct Main *bmain,
- struct Scene *scene, struct Sequence *seq, float cfra,
+ SeqRenderData context,
+ struct Sequence *seq, float cfra,
float facf0, float facf1,
- int x, int y, int preview_render_size,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3);
};
/* ********************* prototypes *************** */
-/* sequence.c */
-void printf_strip(struct Sequence *seq);
+/* **********************************************************************
+ * sequence.c
+
+ * sequencer render functions
+ ********************************************************************** */
+
+struct ImBuf *give_ibuf_seq(SeqRenderData context, float cfra, int chanshown);
+struct ImBuf *give_ibuf_seq_threaded(SeqRenderData context, float cfra, int chanshown);
+struct ImBuf *give_ibuf_seq_direct(SeqRenderData context, float cfra, struct Sequence *seq);
+struct ImBuf *give_ibuf_seqbase(SeqRenderData context, float cfra, int chan_shown, struct ListBase *seqbasep);
+void give_ibuf_prefetch_request(SeqRenderData context, float cfra, int chan_shown);
/* apply functions recursively */
int seqbase_recursive_apply(struct ListBase *seqbase, int (*apply_func)(struct Sequence *seq, void *), void *arg);
int seq_recursive_apply(struct Sequence *seq, int (*apply_func)(struct Sequence *, void *), void *arg);
-// extern
+/* maintainance functions, mostly for RNA */
+// extern
void seq_free_sequence(struct Scene *scene, struct Sequence *seq);
void seq_free_strip(struct Strip *strip);
void seq_free_editing(struct Scene *scene);
void seq_free_clipboard(void);
struct Editing *seq_give_editing(struct Scene *scene, int alloc);
-char *give_seqname(struct Sequence *seq);
-struct ImBuf *give_ibuf_seq(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
-struct ImBuf *give_ibuf_seq_threaded(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size);
-struct ImBuf *give_ibuf_seq_direct(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int render_size, struct Sequence *seq);
-struct ImBuf *give_ibuf_seqbase(struct Main *bmain, struct Scene *scene, int rectx, int recty, int cfra, int chan_shown, int render_size, struct ListBase *seqbasep);
-void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown, int render_size);
+const char *give_seqname(struct Sequence *seq);
void calc_sequence(struct Scene *scene, struct Sequence *seq);
void calc_sequence_disp(struct Scene *scene, struct Sequence *seq);
void new_tstripdata(struct Sequence *seq);
-void reload_sequence_new_file(struct Main *bmain, struct Scene *scene, struct Sequence * seq, int lock_range);
+void reload_sequence_new_file(struct Scene *scene, struct Sequence * seq, int lock_range);
void sort_seq(struct Scene *scene);
void build_seqar_cb(struct ListBase *seqbase, struct Sequence ***seqar, int *totseq,
int (*test_func)(struct Sequence * seq));
int evaluate_seq_frame(struct Scene *scene, int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
-// intern?
+// intern
+void printf_strip(struct Sequence *seq); // debugging function (unused)
void update_changed_seq_and_deps(struct Scene *scene, struct Sequence *changed_seq, int len_change, int ibuf_change);
int input_have_to_preprocess(
- struct Scene *scene, struct Sequence * seq,
- float cfra, int seqrectx, int seqrecty);
+ SeqRenderData context, struct Sequence * seq, float cfra);
+
+/* **********************************************************************
+ seqcache.c
-/* seqcache.c */
+ Sequencer memory cache management functions
+ ********************************************************************** */
typedef enum {
SEQ_STRIPELEM_IBUF,
@@ -179,28 +212,39 @@ typedef enum {
SEQ_STRIPELEM_IBUF_ENDSTILL
} seq_stripelem_ibuf_t;
-void seq_stripelem_cache_init();
-void seq_stripelem_cache_destruct();
+void seq_stripelem_cache_init(void);
+void seq_stripelem_cache_destruct(void);
-void seq_stripelem_cache_cleanup();
+void seq_stripelem_cache_cleanup(void);
struct ImBuf * seq_stripelem_cache_get(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type);
void seq_stripelem_cache_put(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type, struct ImBuf * nval);
+/* **********************************************************************
+ seqeffects.c
-/* seqeffects.c */
-// intern?
+ Sequencer effect strip managment functions
+ **********************************************************************
+*/
+
+/* intern */
struct SeqEffectHandle get_sequence_blend(struct Sequence *seq);
void sequence_effect_speed_rebuild_map(struct Scene *scene, struct Sequence *seq, int force);
-// extern
+/* extern */
struct SeqEffectHandle get_sequence_effect(struct Sequence *seq);
int get_sequence_effect_num_inputs(int seq_type);
+
+/* **********************************************************************
+ Sequencer editing functions
+ **********************************************************************
+*/
+
/* for transform but also could use elsewhere */
int seq_tx_get_start(struct Sequence *seq);
int seq_tx_get_end(struct Sequence *seq);
@@ -213,6 +257,8 @@ int seq_tx_test(struct Sequence * seq);
int seq_single_check(struct Sequence *seq);
void seq_single_fix(struct Sequence *seq);
int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
+void seq_translate(struct Scene *scene, struct Sequence *seq, int delta);
+struct Sequence *seq_foreground_frame_get(struct Scene *scene, int frame);
struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to);
@@ -220,14 +266,14 @@ int shuffle_seq(struct ListBase * seqbasep, struct Sequence *test, struct Scene
int shuffle_seq_time(ListBase * seqbasep, struct Scene *evil_scene);
int seqbase_isolated_sel_check(struct ListBase *seqbase);
void free_imbuf_seq(struct Scene *scene, struct ListBase * seqbasep, int check_mem_usage, int keep_file_handles);
-struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Sequence * seq, int dupe_flag);
+struct Sequence *seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, struct Sequence * seq, int dupe_flag);
int seq_swap(struct Sequence *seq_a, struct Sequence *seq_b);
void seq_update_sound(struct Scene* scene, struct Sequence *seq);
void seq_update_muting(struct Scene* scene, struct Editing *ed);
void seqbase_sound_reload(struct Scene *scene, ListBase *seqbase);
void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq);
-void seqbase_dupli_recursive(struct Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
+void seqbase_dupli_recursive(struct Scene *scene, struct Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag);
void clear_scene_in_allseqs(struct Main *bmain, struct Scene *sce);
@@ -252,17 +298,17 @@ typedef struct SeqLoadInfo {
} SeqLoadInfo;
/* SeqLoadInfo.flag */
-#define SEQ_LOAD_REPLACE_SEL 1<<0
-#define SEQ_LOAD_FRAME_ADVANCE 1<<1
-#define SEQ_LOAD_MOVIE_SOUND 1<<2
-#define SEQ_LOAD_SOUND_CACHE 1<<3
+#define SEQ_LOAD_REPLACE_SEL (1<<0)
+#define SEQ_LOAD_FRAME_ADVANCE (1<<1)
+#define SEQ_LOAD_MOVIE_SOUND (1<<2)
+#define SEQ_LOAD_SOUND_CACHE (1<<3)
/* seq_dupli' flags */
-#define SEQ_DUPE_UNIQUE_NAME 1<<0
-#define SEQ_DUPE_CONTEXT 1<<1
-#define SEQ_DUPE_ANIM 1<<2
-#define SEQ_DUPE_ALL 1<<3 /* otherwise only selected are copied */
+#define SEQ_DUPE_UNIQUE_NAME (1<<0)
+#define SEQ_DUPE_CONTEXT (1<<1)
+#define SEQ_DUPE_ANIM (1<<2)
+#define SEQ_DUPE_ALL (1<<3) /* otherwise only selected are copied */
/* use as an api function */
typedef struct Sequence *(*SeqLoadFunc)(struct bContext *, ListBase *, struct SeqLoadInfo *);
diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index 47fb5049278..937a46d68dd 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -1,6 +1,4 @@
-/**
- * BKE_shrinkwrap.h
- *
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,13 +27,17 @@
#ifndef BKE_SHRINKWRAP_H
#define BKE_SHRINKWRAP_H
+/** \file BKE_shrinkwrap.h
+ * \ingroup bke
+ */
+
/* mesh util */
//TODO: move this somewhere else
#include "BKE_customdata.h"
struct DerivedMesh;
struct Object;
-struct DerivedMesh *object_get_derived_final(struct Scene *scene, struct Object *ob, CustomDataMask dataMask);
+struct DerivedMesh *object_get_derived_final(struct Object *ob);
/* SpaceTransform stuff */
@@ -121,7 +123,7 @@ typedef struct ShrinkwrapCalcData
} ShrinkwrapCalcData;
-void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
+void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
/*
* This function casts a ray in the given BVHTree.. but it takes into consideration the space_transform, that is:
diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h
index c46604f09f0..f42d733d583 100644
--- a/source/blender/blenkernel/BKE_sketch.h
+++ b/source/blender/blenkernel/BKE_sketch.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +24,10 @@
#ifndef BKE_SKETCH_H
#define BKE_SKETCH_H
+/** \file BKE_sketch.h
+ * \ingroup bke
+ */
+
typedef enum SK_PType
{
PT_CONTINUOUS,
@@ -113,12 +116,12 @@ typedef struct SK_Gesture {
/************************************************/
void freeSketch(SK_Sketch *sketch);
-SK_Sketch* createSketch();
+SK_Sketch* createSketch(void);
void sk_removeStroke(SK_Sketch *sketch, SK_Stroke *stk);
void sk_freeStroke(SK_Stroke *stk);
-SK_Stroke* sk_createStroke();
+SK_Stroke* sk_createStroke(void);
SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h
index 088d61061b2..16e5336bcc1 100644
--- a/source/blender/blenkernel/BKE_smoke.h
+++ b/source/blender/blenkernel/BKE_smoke.h
@@ -1,6 +1,4 @@
-/**
- * BKE_smoke.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,9 +30,14 @@
#ifndef BKE_SMOKE_H_
#define BKE_SMOKE_H_
+/** \file BKE_smoke.h
+ * \ingroup bke
+ * \author Daniel Genrich
+ */
+
typedef float (*bresenham_callback) (float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
-void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, int useRenderParams, int isFinalCalc);
+void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
void smokeModifier_free (struct SmokeModifierData *smd);
void smokeModifier_reset(struct SmokeModifierData *smd);
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index 738fe7dde82..6aea9344070 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -1,6 +1,4 @@
-/**
- * BKE_softbody.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef BKE_SOFTBODY_H
#define BKE_SOFTBODY_H
+/** \file BKE_softbody.h
+ * \ingroup bke
+ */
+
struct Object;
struct Scene;
struct SoftBody;
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index 190b0400aff..acd4718a65a 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -1,6 +1,4 @@
-/**
- * sound.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_SOUND_H
#define BKE_SOUND_H
+/** \file BKE_sound.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
struct PackedFile;
struct bSound;
struct bContext;
@@ -38,16 +42,16 @@ struct ListBase;
struct Main;
struct Sequence;
-void sound_init_once();
+void sound_init_once(void);
void sound_init(struct Main *main);
-void sound_exit();
+void sound_exit(void);
void sound_force_device(int device);
-int sound_define_from_str(char *str);
+int sound_define_from_str(const char *str);
-struct bSound* sound_new_file(struct Main *main, char* filename);
+struct bSound* sound_new_file(struct Main *main, const char *filename);
// XXX unused currently
#if 0
@@ -96,4 +100,6 @@ int sound_scene_playing(struct Scene *scene);
int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, float start, float end);
+int sound_get_channels(struct bSound* sound);
+
#endif
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 2e2b4f2bf2a..3394d5b7bf6 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -28,6 +28,10 @@
#ifndef BKE_SUBSURF_H
#define BKE_SUBSURF_H
+/** \file BKE_subsurf.h
+ * \ingroup bke
+ */
+
struct DMGridAdjacency;
struct DMGridData;
struct DerivedMesh;
@@ -78,7 +82,6 @@ typedef struct CCGDerivedMesh {
int *reverseFaceMap;
struct PBVH *pbvh;
- int pbvh_draw;
struct ListBase *fmap;
struct IndexNode *fmap_mem;
diff --git a/source/blender/blenkernel/BKE_suggestions.h b/source/blender/blenkernel/BKE_suggestions.h
index 59369d6ac14..e215cabd70f 100644
--- a/source/blender/blenkernel/BKE_suggestions.h
+++ b/source/blender/blenkernel/BKE_suggestions.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef BKE_SUGGESTIONS_H
#define BKE_SUGGESTIONS_H
+/** \file BKE_suggestions.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -64,27 +68,27 @@ typedef struct SuggList {
} SuggList;
/* Free all text tool memory */
-void free_texttools();
+void free_texttools(void);
/* Used to identify which Text object the current tools should appear against */
void texttool_text_set_active(Text *text);
-void texttool_text_clear();
+void texttool_text_clear(void);
short texttool_text_is_active(Text *text);
/* Suggestions */
void texttool_suggest_add(const char *name, char type);
void texttool_suggest_prefix(const char *prefix);
-void texttool_suggest_clear();
-SuggItem *texttool_suggest_first();
-SuggItem *texttool_suggest_last();
+void texttool_suggest_clear(void);
+SuggItem *texttool_suggest_first(void);
+SuggItem *texttool_suggest_last(void);
void texttool_suggest_select(SuggItem *sel);
-SuggItem *texttool_suggest_selected();
-int *texttool_suggest_top();
+SuggItem *texttool_suggest_selected(void);
+int *texttool_suggest_top(void);
/* Documentation */
void texttool_docs_show(const char *docs);
-char *texttool_docs_get();
-void texttool_docs_clear();
+char *texttool_docs_get(void);
+void texttool_docs_clear(void);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h
index bcda86fdae4..a6b98b8ea88 100644
--- a/source/blender/blenkernel/BKE_text.h
+++ b/source/blender/blenkernel/BKE_text.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_text.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef BKE_TEXT_H
#define BKE_TEXT_H
+/** \file BKE_text.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -43,13 +47,13 @@ struct SpaceText;
void free_text (struct Text *text);
void txt_set_undostate (int u);
int txt_get_undostate (void);
-struct Text* add_empty_text (char *name);
+struct Text* add_empty_text (const char *name);
int reopen_text (struct Text *text);
-struct Text* add_text (char *file, const char *relpath);
+struct Text* add_text (const char *file, const char *relpath);
struct Text* copy_text (struct Text *ta);
void unlink_text (struct Main *bmain, struct Text *text);
void clear_text(struct Text *text);
-void write_text(struct Text *text, char *str);
+void write_text(struct Text *text, const char *str);
char* txt_to_buf (struct Text *text);
void txt_clean_text (struct Text *text);
@@ -94,7 +98,7 @@ void indent (struct Text *text);
void uncomment (struct Text *text);
int setcurr_tab_spaces (struct Text *text, int space);
-void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, char color[4], int group, int flags);
+void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, const unsigned char color[4], int group, int flags);
short txt_clear_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
short txt_clear_markers (struct Text *text, int group, int flags);
struct TextMarker *txt_find_marker (struct Text *text, struct TextLine *line, int curs, int group, int flags);
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index 99bb8db44ed..e6a21ec3966 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_texture.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,16 @@
#ifndef BKE_TEXTURE_H
#define BKE_TEXTURE_H
+/** \file BKE_texture.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bNode;
struct Brush;
struct ColorBand;
@@ -40,6 +48,7 @@ struct Lamp;
struct LampRen;
struct Material;
struct MTex;
+struct ParticleSettings;
struct PluginTex;
struct PointDensity;
struct Tex;
@@ -80,6 +89,7 @@ struct Tex *give_current_material_texture(struct Material *ma);
struct Tex *give_current_lamp_texture(struct Lamp *la);
struct Tex *give_current_world_texture(struct World *world);
struct Tex *give_current_brush_texture(struct Brush *br);
+struct Tex *give_current_particle_texture(struct ParticleSettings *part);
struct bNode *give_current_material_texture_node(struct Material *ma);
@@ -90,6 +100,7 @@ void set_current_brush_texture(struct Brush *br, struct Tex *tex);
void set_current_world_texture(struct World *wo, struct Tex *tex);
void set_current_material_texture(struct Material *ma, struct Tex *tex);
void set_current_lamp_texture(struct Lamp *la, struct Tex *tex);
+void set_current_particle_texture(struct ParticleSettings *part, struct Tex *tex);
struct TexMapping *add_mapping(void);
void init_mapping(struct TexMapping *texmap);
@@ -112,5 +123,9 @@ struct VoxelData *BKE_copy_voxeldata(struct VoxelData *vd);
int BKE_texture_dependsOnTime(const struct Tex *texture);
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h
index 36ccc1f1497..0a3e56c8cba 100644
--- a/source/blender/blenkernel/BKE_unit.h
+++ b/source/blender/blenkernel/BKE_unit.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -24,6 +24,10 @@
#ifndef BKE_UNIT_H
#define BKE_UNIT_H
+/** \file BKE_unit.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -36,19 +40,26 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
/* replace units with values, used before python button evaluation */
int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pref, int system, int type);
+/* make string keyboard-friendly: 10µm --> 10um */
+void bUnit_ToUnitAltName(char *str, int len_max, char *orig_str, int system, int type);
+
/* the size of the unit used for this value (used for calculating the ckickstep) */
double bUnit_ClosestScalar(double value, int system, int type);
/* base scale for these units */
double bUnit_BaseScalar(int system, int type);
+/* return true is the unit system exists */
+int bUnit_IsValid(int system, int type);
+
/* loop over scales, coudl add names later */
//double bUnit_Iter(void **unit, char **name, int system, int type);
-void bUnit_GetSystem(void **usys_pt, int *len, int system, int type);
-char* bUnit_GetName(void *usys_pt, int index);
-char* bUnit_GetNameDisplay(void *usys_pt, int index);
-double bUnit_GetScaler(void *usys_pt, int index);
+void bUnit_GetSystem(void **usys_pt, int *len, int system, int type);
+int bUnit_GetBaseUnit(void *usys_pt);
+const char* bUnit_GetName(void *usys_pt, int index);
+const char* bUnit_GetNameDisplay(void *usys_pt, int index);
+double bUnit_GetScaler(void *usys_pt, int index);
/* aligned with PropertyUnit */
#define B_UNIT_NONE 0
@@ -60,6 +71,7 @@ double bUnit_GetScaler(void *usys_pt, int index);
#define B_UNIT_TIME 6
#define B_UNIT_VELOCITY 7
#define B_UNIT_ACCELERATION 8
+#define B_UNIT_TYPE_TOT 9
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index e4f81625031..0e2817365f8 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -27,6 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BKE_utildefines.h
+ * \ingroup bke
+ * \brief blender format spesific macros
+ * \note generic defines should go in BLI_utildefines.h
+ */
+
+
#ifndef BKE_UTILDEFINES_H
#define BKE_UTILDEFINES_H
@@ -34,17 +41,6 @@
extern "C" {
#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-/* Macro to convert a value to string in the preprocessor */
-#define QUOTE(x) #x
-
/* these values need to be hardcoded in structs, dna does not recognize defines */
/* also defined in DNA_space_types.h */
#ifndef FILE_MAXDIR
@@ -53,96 +49,6 @@ extern "C" {
#define FILE_MAX 240
#endif
-#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
-#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
-#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
-#define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
-#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
-#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
-#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
-#define ELEM9(a, b, c, d, e, f, g, h, i, j) ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
-#define ELEM10(a, b, c, d, e, f, g, h, i, j, k) ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
-#define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l) ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
-
-/* shift around elements */
-#define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
-#define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
-
-/* min/max */
-#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
-#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
-#define MIN4(x,y,z,a) MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
-
-#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
-#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
-#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
-
-#define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
-
-#define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
-
-#define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
-
-#define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
- if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
-
-#define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
- if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
-
-#define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
- if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
- if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
- if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
-
-/* some math and copy defines */
-
-#ifndef SWAP
-#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
-#endif
-
-#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
-
-#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
-
-#define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
-#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
-
-#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
-#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
-#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
-#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
-
-
-#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
-#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
-#define VECSUB2D(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
-#define VECMUL(v1, fac) {v1[0] *= fac; v1[1] *= fac; v1[2] *= fac;}
-
-#define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
-#define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
-#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
-
-#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
-
-
-/* some misc stuff.... */
-#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
-#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
-#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
-
-#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
-
-#define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
-#define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
-#define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
-
/* this weirdo pops up in two places ... */
#if !defined(WIN32)
#ifndef O_BINARY
@@ -161,15 +67,8 @@ extern "C" {
#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
-#define FORM MAKE_ID('F','O','R','M')
-
-#define BLEN MAKE_ID('B','L','E','N')
-#define DER_ MAKE_ID('D','E','R','_')
-#define V100 MAKE_ID('V','1','0','0')
-
#define DATA MAKE_ID('D','A','T','A')
#define GLOB MAKE_ID('G','L','O','B')
-#define IMAG MAKE_ID('I','M','A','G')
#define DNA1 MAKE_ID('D','N','A','1')
#define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */
@@ -178,28 +77,6 @@ extern "C" {
#define ENDB MAKE_ID('E','N','D','B')
-
-/* This one rotates the bytes in an int64, int (32) and short (16) */
-#define SWITCH_INT64(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
- s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
- s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
- s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
-
-#define SWITCH_INT(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
- s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
-
-#define SWITCH_SHORT(a) { \
- char s_i, *p_i; \
- p_i= (char *)&(a); \
- s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
-
-
/* Bit operations */
#define BTST(a,b) ( ( (a) & 1<<(b) )!=0 )
#define BNTST(a,b) ( ( (a) & 1<<(b) )==0 )
@@ -209,17 +86,7 @@ extern "C" {
/* bit-row */
#define BROW(min, max) (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
-
-#ifdef GS
-#undef GS
-#endif
-#define GS(a) (*((short *)(a)))
-
-/* Warning-free macros for storing ints in pointers. Use these _only_
- * for storing an int in a pointer, not a pointer in an int (64bit)! */
-#define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
-#define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
-
+#define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
/*little macro so inline keyword works*/
#if defined(_MSC_VER)
#define BM_INLINE static __forceinline
@@ -227,9 +94,9 @@ extern "C" {
#define BM_INLINE static inline __attribute((always_inline))
#endif
-#define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
-
#ifdef __cplusplus
}
#endif
-#endif
+
+#endif // BKE_UTILDEFINES_H
+
diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h
index 9d763e8f003..30780b87085 100644
--- a/source/blender/blenkernel/BKE_world.h
+++ b/source/blender/blenkernel/BKE_world.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BKE_world.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,10 +29,16 @@
#ifndef BKE_WORLD_H
#define BKE_WORLD_H
+/** \file BKE_world.h
+ * \ingroup bke
+ * \since March 2001
+ * \author nzc
+ */
+
struct World;
void free_world(struct World *sc);
-struct World *add_world(char *name);
+struct World *add_world(const char *name);
struct World *copy_world(struct World *wrld);
void make_local_world(struct World *wrld);
diff --git a/source/blender/blenkernel/BKE_writeavi.h b/source/blender/blenkernel/BKE_writeavi.h
index c7f26d9b76c..19cc1ae2dbf 100644
--- a/source/blender/blenkernel/BKE_writeavi.h
+++ b/source/blender/blenkernel/BKE_writeavi.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
#ifndef BKE_WRITEAVI_H
#define BKE_WRITEAVI_H
+/** \file BKE_writeavi.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h
index 311676b37b5..2b10f1b246c 100644
--- a/source/blender/blenkernel/BKE_writeffmpeg.h
+++ b/source/blender/blenkernel/BKE_writeffmpeg.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -28,6 +28,10 @@
#ifndef BKE_WRITEFFMPEG_H
#define BKE_WRITEFFMPEG_H
+/** \file BKE_writeffmpeg.h
+ * \ingroup bke
+ */
+
#ifdef WITH_FFMPEG
#ifdef __cplusplus
diff --git a/source/blender/blenkernel/BKE_writeframeserver.h b/source/blender/blenkernel/BKE_writeframeserver.h
index 036e0dbd774..2117a23b938 100644
--- a/source/blender/blenkernel/BKE_writeframeserver.h
+++ b/source/blender/blenkernel/BKE_writeframeserver.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -28,6 +28,10 @@
#ifndef BKE_WRITEFRAMESERVER_H
#define BKE_WRITEFRAMESERVER_H
+/** \file BKE_writeframeserver.h
+ * \ingroup bke
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b196ddc8509..dc485f5dc5f 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -24,94 +24,288 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- . ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna ../modifiers
- ../render/extern/include ../../../intern/decimation/extern
- ../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
- ../../../intern/iksolver/extern ../blenloader ../ikplugin ../bmesh
- ../nodes ../../../extern/glew/include ../gpu ../makesrna ../../../intern/smoke/extern
- ../../../intern/bsp/extern ../blenfont
+set(INC
+ .
+ ../avi
+ ../blenlib
+ ../blenloader
+ ../gpu
+ ../ikplugin
+ ../imbuf
+ ../makesdna
+ ../makesrna
+ ../bmesh
+ ../modifiers
+ ../nodes
+ ../editors/include
+ ../render/extern/include
+ ../../../extern/glew/include
../../../intern/audaspace/intern
+ ../../../intern/bsp/extern ../blenfont
+ ../../../intern/decimation/extern
+ ../../../intern/elbeem/extern
+ ../../../intern/guardedalloc
+ ../../../intern/iksolver/extern
+ ../../../intern/memutil
+ ../../../intern/opennl/extern
+ ../../../intern/smoke/extern
+ ../../../intern/mikktspace
../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
)
+set(SRC
+ intern/BME_Customdata.c
+ intern/BME_conversions.c
+ intern/BME_eulers.c
+ intern/BME_mesh.c
+ intern/BME_structure.c
+ intern/BME_tools.c
+ intern/CCGSubSurf.c
+ intern/DerivedMesh.c
+ intern/action.c
+ intern/anim.c
+ intern/anim_sys.c
+ intern/armature.c
+ intern/blender.c
+ intern/bmfont.c
+ intern/boids.c
+ intern/booleanops_mesh.c
+ intern/brush.c
+ intern/bullet.c
+ intern/bvhutils.c
+ intern/cdderivedmesh.c
+ intern/cloth.c
+ intern/collision.c
+ intern/colortools.c
+ intern/constraint.c
+ intern/context.c
+ intern/curve.c
+ intern/customdata.c
+ intern/customdata_file.c
+ intern/deform.c
+ intern/depsgraph.c
+ intern/displist.c
+ intern/effect.c
+ intern/editderivedbmesh.c
+ intern/exotic.c
+ intern/fcurve.c
+ intern/fluidsim.c
+ intern/fmodifier.c
+ intern/font.c
+ intern/gpencil.c
+ intern/group.c
+ intern/icons.c
+ intern/idcode.c
+ intern/idprop.c
+ intern/image.c
+ intern/image_gen.c
+ intern/implicit.c
+ intern/ipo.c
+ intern/key.c
+ intern/lattice.c
+ intern/library.c
+ intern/material.c
+ intern/mball.c
+ intern/mesh.c
+ intern/mesh_validate.c
+ intern/modifier.c
+ intern/modifiers_bmesh.c
+ intern/multires.c
+ intern/nla.c
+ intern/node.c
+ intern/object.c
+ intern/packedFile.c
+ intern/paint.c
+ intern/particle.c
+ intern/particle_system.c
+ intern/pointcache.c
+ intern/property.c
+ intern/report.c
+ intern/sca.c
+ intern/scene.c
+ intern/screen.c
+ intern/script.c
+ intern/seqcache.c
+ intern/seqeffects.c
+ intern/sequencer.c
+ intern/shrinkwrap.c
+ intern/sketch.c
+ intern/smoke.c
+ intern/softbody.c
+ intern/sound.c
+ intern/subsurf_ccg.c
+ intern/suggestions.c
+ intern/text.c
+ intern/texture.c
+ intern/unit.c
+ intern/world.c
+ intern/writeavi.c
+ intern/writeffmpeg.c
+ intern/writeframeserver.c
+
+ BKE_DerivedMesh.h
+ BKE_action.h
+ BKE_anim.h
+ BKE_animsys.h
+ BKE_armature.h
+ BKE_array_mallocn.h
+ BKE_blender.h
+ BKE_bmesh.h
+ BKE_bmeshCustomData.h
+ BKE_bmfont.h
+ BKE_bmfont_types.h
+ BKE_boids.h
+ BKE_booleanops_mesh.h
+ BKE_brush.h
+ BKE_bullet.h
+ BKE_bvhutils.h
+ BKE_cdderivedmesh.h
+ BKE_cloth.h
+ BKE_collision.h
+ BKE_colortools.h
+ BKE_constraint.h
+ BKE_context.h
+ BKE_curve.h
+ BKE_customdata.h
+ BKE_customdata_file.h
+ BKE_deform.h
+ BKE_depsgraph.h
+ BKE_displist.h
+ BKE_effect.h
+ BKE_endian.h
+ BKE_exotic.h
+ BKE_fcurve.h
+ BKE_fluidsim.h
+ BKE_font.h
+ BKE_global.h
+ BKE_gpencil.h
+ BKE_group.h
+ BKE_icons.h
+ BKE_idcode.h
+ BKE_idprop.h
+ BKE_image.h
+ BKE_ipo.h
+ BKE_key.h
+ BKE_lattice.h
+ BKE_library.h
+ BKE_main.h
+ BKE_material.h
+ BKE_mball.h
+ BKE_mesh.h
+ BKE_modifier.h
+ BKE_multires.h
+ BKE_nla.h
+ BKE_node.h
+ BKE_object.h
+ BKE_packedFile.h
+ BKE_paint.h
+ BKE_particle.h
+ BKE_plugin_types.h
+ BKE_pointcache.h
+ BKE_property.h
+ BKE_report.h
+ BKE_sca.h
+ BKE_scene.h
+ BKE_screen.h
+ BKE_script.h
+ BKE_sequencer.h
+ BKE_shrinkwrap.h
+ BKE_sketch.h
+ BKE_smoke.h
+ BKE_softbody.h
+ BKE_sound.h
+ BKE_subsurf.h
+ BKE_suggestions.h
+ BKE_text.h
+ BKE_texture.h
+ BKE_unit.h
+ BKE_utildefines.h
+ BKE_world.h
+ BKE_writeavi.h
+ BKE_writeffmpeg.h
+ BKE_writeframeserver.h
+ depsgraph_private.h
+ intern/CCGSubSurf.h
+ intern/bmesh_private.h
+ nla_private.h
+)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-IF(WITH_BULLET)
- SET(INC ${INC} ../../../extern/bullet2/src)
- ADD_DEFINITIONS(-DUSE_BULLET)
-ENDIF(WITH_BULLET)
+if(WITH_BULLET)
+ list(APPEND INC ../../../extern/bullet2/src)
+ add_definitions(-DUSE_BULLET)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_LCMS)
- SET(INC ${INC} ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_LCMS)
+ list(APPEND INC ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ list(APPEND INC ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(WITH_LZO)
- SET(INC ${INC} ../../../extern/lzo/minilzo)
- ADD_DEFINITIONS(-DWITH_LZO)
-ENDIF(WITH_LZO)
+if(WITH_JACK)
+ add_definitions(-DWITH_JACK)
+endif()
-IF(WITH_LZMA)
- SET(INC ${INC} ../../../extern/lzma)
- ADD_DEFINITIONS(-DWITH_LZMA)
-ENDIF(WITH_LZMA)
+if(WITH_LZO)
+ list(APPEND INC ../../../extern/lzo/minilzo)
+ add_definitions(-DWITH_LZO)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_LZMA)
+ list(APPEND INC ../../../extern/lzma)
+ add_definitions(-DWITH_LZMA)
+endif()
-BLENDERLIB(bf_blenkernel "${SRC}" "${INC}")
+if(MSVC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
+endif()
+blender_add_lib(bf_blenkernel "${SRC}" "${INC}")
diff --git a/source/blender/blenkernel/Makefile b/source/blender/blenkernel/Makefile
deleted file mode 100644
index dc5f0a91da6..00000000000
--- a/source/blender/blenkernel/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenkernel
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 51c42bf4c7d..33c6a170178 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -13,6 +13,7 @@ incs += ' #/intern/opennl/extern #/intern/bsp/extern'
incs += ' ../gpu #/extern/glew/include'
incs += ' ../bmesh'
incs += ' #/intern/smoke/extern'
+incs += ' #/intern/mikktspace'
incs += ' #/intern/audaspace/intern'
incs += ' ' + env['BF_OPENGL_INC']
@@ -20,71 +21,76 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
-else:
- incs += ' ../python'
- incs += ' ' + env['BF_PYTHON_INC']
- if env['BF_DEBUG']:
- defs.append('_DEBUG')
+if env['WITH_BF_PYTHON']:
+ incs += ' ../python'
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+ if env['BF_DEBUG']:
+ defs.append('DEBUG')
if env['WITH_BF_QUICKTIME']:
- incs += ' ../quicktime'
+ incs += ' ../quicktime'
if env['WITH_BF_SDL']:
- incs += ' ' + env['BF_SDL_INC']
+ incs += ' ' + env['BF_SDL_INC']
else:
- defs.append('DISABLE_SDL')
+ defs.append('DISABLE_SDL')
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
if env['WITH_BF_TIFF']:
- defs.append('WITH_TIFF')
+ defs.append('WITH_TIFF')
if env['WITH_BF_OPENJPEG']:
- defs.append('WITH_OPENJPEG')
+ defs.append('WITH_OPENJPEG')
if env['WITH_BF_DDS']:
- defs.append('WITH_DDS')
+ defs.append('WITH_DDS')
if env['WITH_BF_CINEON']:
- defs.append('WITH_CINEON')
+ defs.append('WITH_CINEON')
if env['WITH_BF_HDR']:
- defs.append('WITH_HDR')
+ defs.append('WITH_HDR')
+
+if env['WITH_BF_JACK']:
+ defs.append('WITH_JACK')
if env['WITH_BF_FFMPEG']:
- defs.append('WITH_FFMPEG')
- incs += ' ' + env['BF_FFMPEG_INC']
+ defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
if env['WITH_BF_QUICKTIME']:
- defs.append('WITH_QUICKTIME')
- incs += ' ' + env['BF_QUICKTIME_INC']
+ defs.append('WITH_QUICKTIME')
+ incs += ' ' + env['BF_QUICKTIME_INC']
if env['WITH_BF_BULLET']:
- defs.append('USE_BULLET')
+ defs.append('USE_BULLET')
if env['OURPLATFORM'] == 'darwin':
if env['WITH_BF_OPENMP']:
defs.append('PARALLEL=1')
if env['BF_NO_ELBEEM']:
- defs.append('DISABLE_ELBEEM')
+ defs.append('DISABLE_ELBEEM')
if env['WITH_BF_LCMS']:
- defs.append('WITH_LCMS')
- incs += ' ' + env['BF_LCMS_INC']
+ defs.append('WITH_LCMS')
+ incs += ' ' + env['BF_LCMS_INC']
if env['WITH_BF_LZO']:
- incs += ' #/extern/lzo/minilzo'
- defs.append('WITH_LZO')
+ incs += ' #/extern/lzo/minilzo'
+ defs.append('WITH_LZO')
if env['WITH_BF_LZMA']:
- incs += ' #/extern/lzma'
- defs.append('WITH_LZMA')
+ incs += ' #/extern/lzma'
+ defs.append('WITH_LZMA')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25] )
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25]) #, cc_compileflags = env['CCFLAGS'].append('/WX') )
+else:
+ env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player', 'player2'], priority = [166,25,0] )
diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h
index 503ee973be0..4f99dacbc08 100644
--- a/source/blender/blenkernel/depsgraph_private.h
+++ b/source/blender/blenkernel/depsgraph_private.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,7 +51,7 @@ typedef struct DagAdjList
short type;
int count; // number of identical arcs
unsigned int lay; // for flushing redraw/rebuild events
- char *name;
+ const char *name;
struct DagAdjList *next;
} DagAdjList;
@@ -64,8 +64,8 @@ typedef struct DagNode
void * ob;
void * first_ancestor;
int ancestor_count;
- int lay; // accumulated layers of its relations + itself
- int scelay; // layers due to being in scene
+ unsigned int lay; // accumulated layers of its relations + itself
+ unsigned int scelay; // layers due to being in scene
int lasttime; // if lasttime != DagForest->time, this node was not evaluated yet for flushing
int BFS_dist; // BFS distance
int DFS_dist; // DFS distance
@@ -117,7 +117,7 @@ DagNode * dag_find_node (DagForest *forest,void * fob);
DagNode * dag_add_node (DagForest *forest,void * fob);
DagNode * dag_get_node (DagForest *forest,void * fob);
DagNode * dag_get_sub_node (DagForest *forest,void * fob);
-void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name);
+void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name);
void graph_bfs(void);
diff --git a/source/blender/blenkernel/intern/BME_Customdata.c b/source/blender/blenkernel/intern/BME_Customdata.c
index 139f07c3902..f8b432ed384 100644
--- a/source/blender/blenkernel/intern/BME_Customdata.c
+++ b/source/blender/blenkernel/intern/BME_Customdata.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_customdata.c jan 2007
*
* Custom Data functions for Bmesh
@@ -44,7 +45,7 @@
/********************* Layer type information **********************/
typedef struct BME_LayerTypeInfo {
int size;
- char *defaultname;
+ const char *defaultname;
void (*copy)(const void *source, void *dest, int count);
void (*free)(void *data, int count, int size);
void (*interp)(void **sources, float *weights, float *sub_weights, int count, void *dest);
diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c
index 439b77db9a6..8c399e88d67 100644
--- a/source/blender/blenkernel/intern/BME_conversions.c
+++ b/source/blender/blenkernel/intern/BME_conversions.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_mesh.c jan 2007
*
* BMesh mesh level functions.
@@ -39,10 +40,12 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+
#include "BKE_mesh.h"
#include "BKE_cdderivedmesh.h"
-#include "BLI_edgehash.h"
//XXX #include "BIF_editmesh.h"
//XXX #include "editmesh.h"
#include "bmesh_private.h"
diff --git a/source/blender/blenkernel/intern/BME_eulers.c b/source/blender/blenkernel/intern/BME_eulers.c
index baa490bbeb5..6897b0c8990 100644
--- a/source/blender/blenkernel/intern/BME_eulers.c
+++ b/source/blender/blenkernel/intern/BME_eulers.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_eulers.c jan 2007
*
* BMesh Euler construction API.
@@ -34,7 +35,7 @@
*/
#include "MEM_guardedalloc.h"
-
+#include "BLI_utildefines.h"
#include "bmesh_private.h"
diff --git a/source/blender/blenkernel/intern/BME_mesh.c b/source/blender/blenkernel/intern/BME_mesh.c
index 938b193a433..1097b9da2bc 100644
--- a/source/blender/blenkernel/intern/BME_mesh.c
+++ b/source/blender/blenkernel/intern/BME_mesh.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_mesh.c jan 2007
*
* BMesh mesh level functions.
diff --git a/source/blender/blenkernel/intern/BME_structure.c b/source/blender/blenkernel/intern/BME_structure.c
index 53cf93c43af..f79b8edc866 100644
--- a/source/blender/blenkernel/intern/BME_structure.c
+++ b/source/blender/blenkernel/intern/BME_structure.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_structure.c jan 2007
*
* Low level routines for manipulating the BMesh structure.
@@ -34,8 +35,9 @@
*/
#if 0
#include <limits.h>
-#include "MEM_guardedalloc.h"
+#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_bmesh.h"
/**
* MISC utility functions.
diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c
index 66df8f2ad6a..9dd4669ba1f 100644
--- a/source/blender/blenkernel/intern/BME_tools.c
+++ b/source/blender/blenkernel/intern/BME_tools.c
@@ -1,5 +1,6 @@
#if 0
/**
+/*
* BME_tools.c jan 2007
*
* Functions for changing the topology of a mesh.
@@ -39,9 +40,14 @@
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
-#include "BKE_bmesh.h"
#include "BLI_math.h"
+<<<<<<< .working
#include "BLI_cellalloc.h"
+=======
+#include "BLI_utildefines.h"
+>>>>>>> .merge-right.r35190
+
+#include "BKE_bmesh.h"
/*split this all into a seperate bevel.c file in src*/
@@ -109,7 +115,7 @@ float *BME_new_transdata_float(BME_TransData_Head *td) {
return BLI_memarena_alloc(td->ma, sizeof(float));
}
-static int BME_is_nonmanifold_vert(BME_Mesh *bm, BME_Vert *v) {
+static int BME_is_nonmanifold_vert(BME_Mesh *UNUSED(bm), BME_Vert *v) {
BME_Edge *e, *oe;
BME_Loop *l;
int len, count, flag;
@@ -219,7 +225,7 @@ static void BME_data_interp_from_verts(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2,
#endif
-static void BME_data_facevert_edgesplit(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2, BME_Vert *v, BME_Edge *e1, float fac){
+static void BME_data_facevert_edgesplit(BME_Mesh *bm, BME_Vert *v1, BME_Vert *UNUSED(v2), BME_Vert *v, BME_Edge *e1, float fac){
void *src[2];
float w[2];
BME_Loop *l=NULL, *v1loop = NULL, *vloop = NULL, *v2loop = NULL;
@@ -358,7 +364,7 @@ static int BME_bevel_get_vec(float *vec, BME_Vert *v1, BME_Vert *v2, BME_TransDa
* vec2 is the direction of projection (pointing away from vec1)
* up_vec is used for orientation (expected to be normalized)
* returns the length of the projected vector that lies along vec1 */
-static float BME_bevel_project_vec(float *vec1, float *vec2, float *up_vec, int is_forward, BME_TransData_Head *td) {
+static float BME_bevel_project_vec(float *vec1, float *vec2, float *up_vec, int is_forward, BME_TransData_Head *UNUSED(td)) {
float factor, vec3[3], tmp[3],c1,c2;
cross_v3_v3v3(tmp,vec1,vec2);
@@ -584,7 +590,7 @@ static float BME_bevel_set_max(BME_Vert *v1, BME_Vert *v2, float value, BME_Tran
return max;
}
-static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res, int options, BME_TransData_Head *td) {
+static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res, int UNUSED(options), BME_TransData_Head *td) {
BME_Vert *ov1, *ov2, *v1, *v2;
ov1 = BME_edge_getothervert(v->e, v);
@@ -609,7 +615,7 @@ static BME_Vert *BME_bevel_wire(BME_Mesh *bm, BME_Vert *v, float value, int res,
return v1;
}
-static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int options, float *up_vec, BME_TransData_Head *td) {
+static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int UNUSED(options), float *up_vec, BME_TransData_Head *td) {
BME_Vert *v1, *v2, *kv;
BME_Loop *kl=NULL, *nl;
BME_Edge *e;
@@ -710,7 +716,7 @@ static BME_Loop *BME_bevel_edge(BME_Mesh *bm, BME_Loop *l, float value, int opti
return l;
}
-static BME_Loop *BME_bevel_vert(BME_Mesh *bm, BME_Loop *l, float value, int options, float *up_vec, BME_TransData_Head *td) {
+static BME_Loop *BME_bevel_vert(BME_Mesh *bm, BME_Loop *l, float value, int UNUSED(options), float *up_vec, BME_TransData_Head *td) {
BME_Vert *v1, *v2;
BME_Poly *f;
@@ -861,7 +867,7 @@ static void BME_bevel_add_vweight(BME_TransData_Head *td, BME_Mesh *bm, BME_Vert
}
}
-static float BME_bevel_get_angle(BME_Mesh *bm, BME_Edge *e, BME_Vert *v) {
+static float BME_bevel_get_angle(BME_Mesh *UNUSED(bm), BME_Edge *e, BME_Vert *v) {
BME_Vert *v1, *v2;
BME_Loop *l1, *l2;
float vec1[3], vec2[3], vec3[3], vec4[3];
@@ -920,7 +926,7 @@ static int BME_face_sharededges(BME_Poly *f1, BME_Poly *f2){
* Returns -
* A BME_Mesh pointer to the BMesh passed as a parameter.
*/
-static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int defgrp_index, float angle, BME_TransData_Head *td) {
+static BME_Mesh *BME_bevel_initialize(BME_Mesh *bm, int options, int UNUSED(defgrp_index), float angle, BME_TransData_Head *td) {
BME_Vert *v;
BME_Edge *e;
BME_Poly *f;
@@ -1164,7 +1170,7 @@ static void bmesh_dissolve_disk(BME_Mesh *bm, BME_Vert *v){
//BME_JEKV(bm,v->e,v);
}
}
-static BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int defgrp_index, BME_TransData_Head *td) {
+static BME_Mesh *BME_bevel_mesh(BME_Mesh *bm, float value, int res, int options, int UNUSED(defgrp_index), BME_TransData_Head *td) {
BME_Vert *v, *nv;
BME_Edge *e, *oe;
BME_Loop *l, *l2;
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index bbd68fb797b..3564c93681a 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -15,6 +15,13 @@
#define CCG_INLINE inline
#endif
+/* copied from BKE_utildefines.h ugh */
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+# define UNUSED(x) x
+#endif
+
/* used for normalize_v3 in BLI_math_vector
* float.h's FLT_EPSILON causes trouble with subsurf normals - campbell */
#define EPSILON (1.0e-35f)
@@ -185,13 +192,13 @@ static int _ehashIterator_isStopped(EHashIterator *ehi) {
/***/
-static void *_stdAllocator_alloc(CCGAllocatorHDL a, int numBytes) {
+static void *_stdAllocator_alloc(CCGAllocatorHDL UNUSED(a), int numBytes) {
return malloc(numBytes);
}
-static void *_stdAllocator_realloc(CCGAllocatorHDL a, void *ptr, int newSize, int oldSize) {
+static void *_stdAllocator_realloc(CCGAllocatorHDL UNUSED(a), void *ptr, int newSize, int UNUSED(oldSize)) {
return realloc(ptr, newSize);
}
-static void _stdAllocator_free(CCGAllocatorHDL a, void *ptr) {
+static void _stdAllocator_free(CCGAllocatorHDL UNUSED(a), void *ptr) {
free(ptr);
}
@@ -236,13 +243,13 @@ enum {
Vert_eEffected= (1<<0),
Vert_eChanged= (1<<1),
Vert_eSeam= (1<<2),
-} VertFlags;
+} /*VertFlags*/;
enum {
Edge_eEffected= (1<<0),
-} CCGEdgeFlags;
+} /*CCGEdgeFlags*/;
enum {
Face_eEffected= (1<<0),
-} FaceFlags;
+} /*FaceFlags*/;
struct _CCGVert {
CCGVert *next; /* EHData.next */
@@ -390,7 +397,7 @@ static CCGEdge *_vert_findEdgeTo(CCGVert *v, CCGVert *vQ) {
(e->v1==v && e->v0==vQ))
return e;
}
- return 0;
+ return NULL;
}
static int _vert_isBoundary(CCGVert *v) {
int i;
@@ -592,7 +599,7 @@ static CCG_INLINE void *_face_getIFCoEdge(CCGFace *f, CCGEdge *e, int lvl, int e
static float *_face_getIFNoEdge(CCGFace *f, CCGEdge *e, int lvl, int eX, int eY, int levels, int dataSize, int normalDataOffset) {
return (float*) ((byte*) _face_getIFCoEdge(f, e, lvl, eX, eY, levels, dataSize) + normalDataOffset);
}
-void _face_calcIFNo(CCGFace *f, int lvl, int S, int x, int y, float *no, int levels, int dataSize) {
+static void _face_calcIFNo(CCGFace *f, int lvl, int S, int x, int y, float *no, int levels, int dataSize) {
float *a = _face_getIFCo(f, lvl, S, x+0, y+0, levels, dataSize);
float *b = _face_getIFCo(f, lvl, S, x+1, y+0, levels, dataSize);
float *c = _face_getIFCo(f, lvl, S, x+1, y+1, levels, dataSize);
@@ -1514,7 +1521,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
}
}
- if (seam && seamEdges < 2)
+ if (seamEdges < 2 || seamEdges != v->numEdges)
seam = 0;
if (!v->numEdges) {
@@ -1942,7 +1949,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
}
}
- if (seam && seamEdges < 2)
+ if (seamEdges < 2 || seamEdges != v->numEdges)
seam = 0;
if (!v->numEdges) {
@@ -2601,7 +2608,7 @@ float ccgSubSurf_getEdgeCrease(CCGEdge *e) {
/* Face accessors */
-CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGSubSurf *ss, CCGFace *f) {
+CCGFaceHDL ccgSubSurf_getFaceFaceHandle(CCGSubSurf *UNUSED(ss), CCGFace *f) {
return f->fHDL;
}
int ccgSubSurf_getFaceAge(CCGSubSurf *ss, CCGFace *f) {
@@ -2619,14 +2626,14 @@ void *ccgSubSurf_getFaceUserData(CCGSubSurf *ss, CCGFace *f) {
int ccgSubSurf_getFaceNumVerts(CCGFace *f) {
return f->numVerts;
}
-CCGVert *ccgSubSurf_getFaceVert(CCGSubSurf *ss, CCGFace *f, int index) {
+CCGVert *ccgSubSurf_getFaceVert(CCGSubSurf *UNUSED(ss), CCGFace *f, int index) {
if (index<0 || index>=f->numVerts) {
return NULL;
} else {
return FACE_getVerts(f)[index];
}
}
-CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *ss, CCGFace *f, int index) {
+CCGEdge *ccgSubSurf_getFaceEdge(CCGSubSurf *UNUSED(ss), CCGFace *f, int index) {
if (index<0 || index>=f->numVerts) {
return NULL;
} else {
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index c9a1cfc4618..05c06e86cd0 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,6 +44,7 @@
#include "BLI_memarena.h"
#include "BLI_array.h"
#include "BLI_pbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_displist.h"
@@ -53,11 +54,12 @@
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+#include "BKE_multires.h"
#include "BKE_particle.h"
#include "BKE_tessmesh.h"
#include "BKE_bvhutils.h"
+
#include "BLO_sys_types.h" // for intptr_t support
#include "BIF_gl.h"
@@ -68,6 +70,8 @@
#include "GPU_extensions.h"
#include "GPU_material.h"
+#include "ED_sculpt.h" /* for ED_sculpt_modifiers_changed */
+
///////////////////////////////////
///////////////////////////////////
@@ -398,6 +402,15 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
if(!CustomData_has_layer(&tmp.pdata, CD_MPOLY))
dm_add_polys_from_iter(&tmp.ldata, &tmp.pdata, dm, totloop);
+ /* object had got displacement layer, should copy this layer to save sculpted data */
+ /* NOTE: maybe some other layers should be copied? nazgul */
+ if(CustomData_has_layer(&me->fdata, CD_MDISPS)) {
+ if (totface == me->totface) {
+ MDisps *mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
+ CustomData_add_layer(&tmp.fdata, CD_MDISPS, CD_DUPLICATE, mdisps, totface);
+ }
+ }
+
mesh_update_customdata_pointers(&tmp);
CustomData_free(&me->vdata, me->totvert);
@@ -637,7 +650,7 @@ void DM_interp_face_data(DerivedMesh *source, DerivedMesh *dest,
}
///
-static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3])
+DerivedMesh *mesh_create_derived(Mesh *me, Object *ob, float (*vertCos)[3])
{
DerivedMesh *dm = CDDM_from_mesh(me, ob);
@@ -670,11 +683,11 @@ DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, Modifier
float (*deformedVerts)[3] = mesh_getVertexCos(me, &numVerts);
mti->deformVerts(md, ob, NULL, deformedVerts, numVerts, 0, 0);
- dm = getMeshDerivedMesh(me, ob, deformedVerts);
+ dm = mesh_create_derived(me, ob, deformedVerts);
MEM_freeN(deformedVerts);
} else {
- DerivedMesh *tdm = getMeshDerivedMesh(me, ob, NULL);
+ DerivedMesh *tdm = mesh_create_derived(me, ob, NULL);
dm = mti->applyModifier(md, ob, tdm, 0, 0);
if(tdm != dm) tdm->release(tdm);
@@ -920,17 +933,32 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
DerivedMesh *dm, *orcodm, *clothorcodm, *finaldm;
int numVerts = me->totvert;
int required_mode;
+ int isPrevDeform= FALSE;
+ int skipVirtualArmature = (useDeform < 0);
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
+ int has_multires = mmd != NULL, multires_applied = 0;
+ int sculpt_mode = ob->mode & OB_MODE_SCULPT && ob->sculpt;
+
+ if(mmd && !mmd->sculptlvl)
+ has_multires = 0;
+
+ if(!skipVirtualArmature) {
+ firstmd = modifiers_getVirtualModifierList(ob);
+ }
+ else {
+ /* game engine exception */
+ firstmd = ob->modifiers.first;
+ if(firstmd && firstmd->type == eModifierType_Armature)
+ firstmd = firstmd->next;
+ }
- md = firstmd = (useDeform<0) ? ob->modifiers.first : modifiers_getVirtualModifierList(ob);
+ md = firstmd;
modifiers_clearErrors(ob);
if(useRenderParams) required_mode = eModifierMode_Render;
else required_mode = eModifierMode_Realtime;
- /* we always want to keep original indices */
- dataMask |= CD_MASK_ORIGINDEX;
-
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
curr = datamasks;
@@ -996,13 +1024,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
md->scene= scene;
-
+
if(!modifier_isEnabled(scene, md, required_mode)) continue;
if(mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue;
if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
modifier_setError(md, "Modifier requires original data, bad stack position.");
continue;
}
+ if(sculpt_mode && (!has_multires || multires_applied))
+ if(mti->type != eModifierTypeType_OnlyDeform || multires_applied) {
+ modifier_setError(md, "Not supported in sculpt mode.");
+ continue;
+ }
if(needMapping && !modifier_supportsMapping(md)) continue;
if(useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue;
@@ -1037,10 +1070,26 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
+ /* if this is not the last modifier in the stack then recalculate the normals
+ * to avoid giving bogus normals to the next modifier see: [#23673] */
+ if(isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ /* XXX, this covers bug #23673, but we may need normal calc for other types */
+ if(dm->type == DM_TYPE_CDDM) {
+ CDDM_apply_vert_coords(dm, deformedVerts);
+ CDDM_calc_normals(dm);
+ }
+ }
+
mti->deformVerts(md, ob, dm, deformedVerts, numVerts, useRenderParams, useDeform);
} else {
DerivedMesh *ndm;
+ /* determine which data layers are needed by following modifiers */
+ if(curr->next)
+ nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
+ else
+ nextmask= dataMask;
+
/* apply vertex coordinates or build a DerivedMesh as necessary */
if(dm) {
if(deformedVerts) {
@@ -1062,28 +1111,30 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
add_weight_mcol_dm(ob, dm);
- /* constructive modifiers need to have an origindex
- * otherwise they wont have anywhere to copy the data from */
- if(needMapping) {
- int *index, i;
+ /* Constructive modifiers need to have an origindex
+ * otherwise they wont have anywhere to copy the data from.
+ *
+ * Also create ORIGINDEX data if any of the following modifiers
+ * requests it, this way Mirror, Solidify etc will keep ORIGINDEX
+ * data by using generic DM_copy_vert_data() functions.
+ */
+ if(needMapping || (nextmask & CD_MASK_ORIGINDEX)) {
+ int i, *orig;
+
+ /* calc */
DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
DM_add_face_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
- index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numVertData; i++) *index++= i;
- index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numEdgeData; i++) *index++= i;
- index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
- for(i=0; i<dm->numPolyData; i++) *index++= i;
+ orig = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+ for(i=0; i<dm->numVertData; i++) *orig++= i;
+ orig = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
+ for(i=0; i<dm->numEdgeData; i++) *orig++= i;
+ orig = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+ for(i=0; i<dm->numPolyData; i++) *orig++= i;
}
}
- /* determine which data layers are needed by following modifiers */
- if(curr->next)
- nextmask= (CustomDataMask)GET_INT_FROM_POINTER(curr->next->link);
- else
- nextmask= dataMask;
/* set the DerivedMesh to only copy needed data */
mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link);
@@ -1120,7 +1171,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
orcodm= create_orco_dm(ob, me, NULL, CD_ORCO);
nextmask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, nextmask);
+ DM_set_only_copy(orcodm, nextmask | CD_MASK_ORIGINDEX);
ndm = mti->applyModifier(md, ob, orcodm, useRenderParams, 0);
if(ndm) {
@@ -1136,7 +1187,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
clothorcodm= create_orco_dm(ob, me, NULL, CD_CLOTH_ORCO);
nextmask &= ~CD_MASK_CLOTH_ORCO;
- DM_set_only_copy(clothorcodm, nextmask);
+ DM_set_only_copy(clothorcodm, nextmask | CD_MASK_ORIGINDEX);
ndm = mti->applyModifier(md, ob, clothorcodm, useRenderParams, 0);
if(ndm) {
@@ -1147,9 +1198,14 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
+ isPrevDeform= (mti->type == eModifierTypeType_OnlyDeform);
+
/* grab modifiers until index i */
if((index >= 0) && (modifiers_indexInObject(ob, md) >= index))
break;
+
+ if(sculpt_mode && md->type == eModifierType_Multires)
+ multires_applied = 1;
}
for(md=firstmd; md; md=md->next)
@@ -1204,7 +1260,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
BLI_linklist_free(datamasks, NULL);
}
-static float (*editbmesh_getVertexCos(BMEditMesh *em, int *numVerts_r))[3]
+float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *numVerts_r))[3]
{
int i, numVerts = *numVerts_r = em->bm->totvert;
float (*cos)[3];
@@ -1221,7 +1277,7 @@ static float (*editbmesh_getVertexCos(BMEditMesh *em, int *numVerts_r))[3]
return cos;
}
-static int editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
+int editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1255,9 +1311,6 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
dm = NULL;
md = modifiers_getVirtualModifierList(ob);
-
- /* we always want to keep original indices */
- dataMask |= CD_MASK_ORIGINDEX;
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
@@ -1295,7 +1348,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
MEM_mallocN(sizeof(*deformedVerts) * numVerts, "dfmv");
dm->getVertCos(dm, deformedVerts);
} else {
- deformedVerts = editbmesh_getVertexCos(em, &numVerts);
+ deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
}
}
@@ -1336,7 +1389,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
orcodm= create_orco_dm(ob, ob->data, em, CD_ORCO);
mask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, mask);
+ DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX);
if (mti->applyModifierEM)
ndm = mti->applyModifierEM(md, ob, em, orcodm);
@@ -1351,9 +1404,11 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D
}
/* set the DerivedMesh to only copy needed data */
- DM_set_only_copy(dm, (CustomDataMask)GET_INT_FROM_POINTER(curr->link));
+ mask= (CustomDataMask)GET_INT_FROM_POINTER(curr->link); /* CD_MASK_ORCO may have been cleared above */
- if(((CustomDataMask)GET_INT_FROM_POINTER(curr->link)) & CD_MASK_ORIGSPACE)
+ DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);
+
+ if(mask & CD_MASK_ORIGSPACE)
if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
DM_add_tessface_layer(dm, CD_ORIGSPACE, CD_DEFAULT, NULL);
@@ -1448,14 +1503,9 @@ static void clear_mesh_caches(Object *ob)
ob->derivedDeform->release(ob->derivedDeform);
ob->derivedDeform= NULL;
}
- /* we free pbvh on changes, except during sculpt since it can't deal with
- changing PVBH node organization, we hope topology does not change in
- the meantime .. weak */
- if(ob->sculpt && ob->sculpt->pbvh) {
- if(!ob->sculpt->cache) {
- BLI_pbvh_free(ob->sculpt->pbvh);
- ob->sculpt->pbvh= NULL;
- }
+
+ if(ob->sculpt) {
+ ED_sculpt_modifiers_changed(ob);
}
}
@@ -1463,8 +1513,8 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
{
Object *obact = scene->basact?scene->basact->object:NULL;
int editing = paint_facesel_test(ob);
- /* weight paint and face select need original indicies because of selection buffer drawing */
- int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)) || editing);
+ /* weight paint and face select need original indices because of selection buffer drawing */
+ int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)));
clear_mesh_caches(ob);
@@ -1584,6 +1634,16 @@ DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*ve
return final;
}
+DerivedMesh *mesh_create_derived_physics(Scene *scene, Object *ob, float (*vertCos)[3],
+ CustomDataMask dataMask)
+{
+ DerivedMesh *final;
+
+ mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0);
+
+ return final;
+}
+
DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob,
float (*vertCos)[3],
CustomDataMask dataMask)
@@ -1685,61 +1745,112 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob)
return vertexcosnos;
}
-/* ********* crazyspace *************** */
+/* ******************* GLSL ******************** */
-int editbmesh_get_first_deform_matrices(Scene *scene, Object *ob, BMEditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3])
+typedef struct
{
- ModifierData *md;
- DerivedMesh *dm;
- int i, a, numleft = 0, numVerts = 0;
- int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
- float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
+ float * precomputedFaceNormals;
+ MTFace * mtface; // texture coordinates
+ MFace * mface; // indices
+ MVert * mvert; // vertices & normals
+ float (*orco)[3];
+ float (*tangent)[4]; // destination
+ int numFaces;
- modifiers_clearErrors(ob);
+} SGLSLMeshToTangent;
- dm = NULL;
- md = modifiers_getVirtualModifierList(ob);
+// interface
+#include "mikktspace.h"
- /* compute the deformation matrices and coordinates for the first
- modifiers with on cage editing that are enabled and support computing
- deform matrices */
- for(i = 0; md && i <= cageIndex; i++, md = md->next) {
- ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+static int GetNumFaces(const SMikkTSpaceContext * pContext)
+{
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+ return pMesh->numFaces;
+}
- if(!editbmesh_modifier_is_enabled(scene, md, dm))
- continue;
+static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num)
+{
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+ return pMesh->mface[face_num].v4!=0 ? 4 : 3;
+}
- if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
- if(!defmats) {
- dm= getEditDerivedBMesh(em, ob, NULL);
- deformedVerts= editbmesh_getVertexCos(em, &numVerts);
- defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
+static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+ unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+ pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
+ VECCOPY(fPos, pMesh->mvert[indices[vert_index]].co);
+}
- for(a=0; a<numVerts; a++)
- unit_m3(defmats[a]);
- }
+static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
- mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats,
- numVerts);
- }
- else
- break;
+ if(pMesh->mtface!=NULL)
+ {
+ float * uv = pMesh->mtface[face_num].uv[vert_index];
+ fUV[0]=uv[0]; fUV[1]=uv[1];
}
+ else
+ {
+ unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+ pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
- for(; md && i <= cageIndex; md = md->next, i++)
- if(editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
- numleft++;
+ map_to_sphere( &fUV[0], &fUV[1],pMesh->orco[indices[vert_index]][0], pMesh->orco[indices[vert_index]][1], pMesh->orco[indices[vert_index]][2]);
+ }
+}
- if(dm)
- dm->release(dm);
-
- *deformmats= defmats;
- *deformcos= deformedVerts;
+static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+ unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2,
+ pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 };
- return numleft;
+ const int smoothnormal = (pMesh->mface[face_num].flag & ME_SMOOTH);
+ if(!smoothnormal) // flat
+ {
+ if(pMesh->precomputedFaceNormals)
+ {
+ VECCOPY(fNorm, &pMesh->precomputedFaceNormals[3*face_num]);
+ }
+ else
+ {
+ float nor[3];
+ float * p0, * p1, * p2;
+ const int iGetNrVerts = pMesh->mface[face_num].v4!=0 ? 4 : 3;
+ p0 = pMesh->mvert[indices[0]].co; p1 = pMesh->mvert[indices[1]].co; p2 = pMesh->mvert[indices[2]].co;
+ if(iGetNrVerts==4)
+ {
+ float * p3 = pMesh->mvert[indices[3]].co;
+ normal_quad_v3( nor, p0, p1, p2, p3);
+ }
+ else {
+ normal_tri_v3(nor, p0, p1, p2);
+ }
+ VECCOPY(fNorm, nor);
+ }
+ }
+ else
+ {
+ int i=0;
+ short * no = pMesh->mvert[indices[vert_index]].no;
+ for(i=0; i<3; i++)
+ fNorm[i]=no[i]/32767.0f;
+ normalize_v3(fNorm);
+ }
+}
+static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData;
+ float * pRes = pMesh->tangent[4*face_num+iVert];
+ VECCOPY(pRes, fvTangent);
+ pRes[3]=fSign;
}
-/* ******************* GLSL ******************** */
void DM_add_tangent_layer(DerivedMesh *dm)
{
@@ -1749,14 +1860,17 @@ void DM_add_tangent_layer(DerivedMesh *dm)
MVert *mvert, *v1, *v2, *v3, *v4;
MemArena *arena= NULL;
VertexTangent **vtangents= NULL;
- float (*orco)[3]= NULL, (*tangent)[3];
+ float (*orco)[3]= NULL, (*tangent)[4];
float *uv1, *uv2, *uv3, *uv4, *vtang;
float fno[3], tang[3], uv[4][2];
- int i, j, len, mf_vi[4], totvert, totface;
+ int i, j, len, mf_vi[4], totvert, totface, iCalcNewMethod;
+ float *nors;
if(CustomData_get_layer_index(&dm->faceData, CD_TANGENT) != -1)
return;
+ nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
+
/* check we have all the needed layers */
totvert= dm->getNumVerts(dm);
totface= dm->getNumTessFaces(dm);
@@ -1779,79 +1893,108 @@ void DM_add_tangent_layer(DerivedMesh *dm)
arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "tangent layer arena");
BLI_memarena_use_calloc(arena);
vtangents= MEM_callocN(sizeof(VertexTangent*)*totvert, "VertexTangent");
-
- /* sum tangents at connected vertices */
- for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) {
- v1= &mvert[mf->v1];
- v2= &mvert[mf->v2];
- v3= &mvert[mf->v3];
-
- if (mf->v4) {
- v4= &mvert[mf->v4];
- normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co);
- }
- else {
- v4= NULL;
- normal_tri_v3( fno,v3->co, v2->co, v1->co);
- }
-
- if(mtface) {
- uv1= tf->uv[0];
- uv2= tf->uv[1];
- uv3= tf->uv[2];
- uv4= tf->uv[3];
- }
- else {
- uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
- map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
- map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
- map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
- if(v4)
- map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
- }
+
+ // new computation method
+ iCalcNewMethod = 1;
+ if(iCalcNewMethod!=0)
+ {
+ SGLSLMeshToTangent mesh2tangent;
+ SMikkTSpaceContext sContext;
+ SMikkTSpaceInterface sInterface;
+ memset(&mesh2tangent, 0, sizeof(SGLSLMeshToTangent));
+ memset(&sContext, 0, sizeof(SMikkTSpaceContext));
+ memset(&sInterface, 0, sizeof(SMikkTSpaceInterface));
+
+ mesh2tangent.precomputedFaceNormals = nors;
+ mesh2tangent.mtface = mtface;
+ mesh2tangent.mface = mface;
+ mesh2tangent.mvert = mvert;
+ mesh2tangent.orco = orco;
+ mesh2tangent.tangent = tangent;
+ mesh2tangent.numFaces = totface;
+
+ sContext.m_pUserData = &mesh2tangent;
+ sContext.m_pInterface = &sInterface;
+ sInterface.m_getNumFaces = GetNumFaces;
+ sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace;
+ sInterface.m_getPosition = GetPosition;
+ sInterface.m_getTexCoord = GetTextureCoordinate;
+ sInterface.m_getNormal = GetNormal;
+ sInterface.m_setTSpaceBasic = SetTSpace;
+
+ // 0 if failed
+ iCalcNewMethod = genTangSpaceDefault(&sContext);
+ }
+
+ if(!iCalcNewMethod)
+ {
+ /* sum tangents at connected vertices */
+ for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) {
+ v1= &mvert[mf->v1];
+ v2= &mvert[mf->v2];
+ v3= &mvert[mf->v3];
+
+ if (mf->v4) {
+ v4= &mvert[mf->v4];
+ normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co);
+ }
+ else {
+ v4= NULL;
+ normal_tri_v3( fno,v3->co, v2->co, v1->co);
+ }
- tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang);
- sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
- sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2);
- sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
+ if(mtface) {
+ uv1= tf->uv[0];
+ uv2= tf->uv[1];
+ uv3= tf->uv[2];
+ uv4= tf->uv[3];
+ }
+ else {
+ uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
+ map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
+ map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
+ map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
+ if(v4)
+ map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
+ }
- if(mf->v4) {
- v4= &mvert[mf->v4];
-
- tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang);
+ tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang);
sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
+ sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2);
sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
- sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4);
- }
- }
-
- /* write tangent to layer */
- for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) {
- len= (mf->v4)? 4 : 3;
- if(mtface) {
- uv1= tf->uv[0];
- uv2= tf->uv[1];
- uv3= tf->uv[2];
- uv4= tf->uv[3];
- }
- else {
- uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3];
- map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
- map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
- map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
- if(len==4)
- map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
+ if(mf->v4) {
+ v4= &mvert[mf->v4];
+
+ tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang);
+ sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1);
+ sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3);
+ sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4);
+ }
}
+
+ /* write tangent to layer */
+ for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) {
+ len= (mf->v4)? 4 : 3;
+
+ if(mtface == NULL) {
+ map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]);
+ map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]);
+ map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]);
+ if(len==4)
+ map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]);
+ }
- mf_vi[0]= mf->v1;
- mf_vi[1]= mf->v2;
- mf_vi[2]= mf->v3;
- mf_vi[3]= mf->v4;
+ mf_vi[0]= mf->v1;
+ mf_vi[1]= mf->v2;
+ mf_vi[2]= mf->v3;
+ mf_vi[3]= mf->v4;
- for(j=0; j<len; j++) {
- vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]);
- normalize_v3_v3(tangent[j], vtang);
+ for(j=0; j<len; j++) {
+ vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]);
+ normalize_v3_v3(tangent[j], vtang);
+ ((float *) tangent[j])[3]=1.0f;
+ }
}
}
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
deleted file mode 100644
index 53a9999758c..00000000000
--- a/source/blender/blenkernel/intern/Makefile
+++ /dev/null
@@ -1,156 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenkernel
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../../intern/memutil
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-# Reference to the types in makesdna and imbuf
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-# This mod uses the BLI and BLO module
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-# This is bad level, remove eventually
-CPPFLAGS += -I../../windowmanager
-# also avi is used
-CPPFLAGS += -I../../avi
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# we still refer to /include a bit...
-CPPFLAGS += -I../../editors/include
-
-# to include the render stuff:
-CPPFLAGS += -I../../render/extern/include
-
-# for sound
-#CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-CPPFLAGS += -I$(NAN_IKSOLVER)/include
-CPPFLAGS += -I$(NAN_DECIMATION)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-CPPFLAGS += -I$(NAN_BSP)/include
-CPPFLAGS += -I$(NAN_SMOKE)/include
-
-# path to zlib
-CPPFLAGS += -I$(NAN_ZLIB)/include
-
-#path to nodes
-CPPFLAGS += -I../../nodes
-
-#path to gpu
-CPPFLAGS += -I../../gpu
-
-#modifiers got moved
-CPPFLAGS += -I../../modifiers
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-
-# path to bullet2, for cloth
-ifeq ($(NAN_USE_BULLET), true)
- CPPFLAGS += -I$(NAN_BULLET2)/include
-endif
-
-# lzo and lzma, for pointcache
-ifeq ($(WITH_LZO),true)
- CPPFLAGS += -I$(NAN_LZO)/minilzo
- CPPFLAGS += -DWITH_LZO
-endif
-
-ifeq ($(WITH_LZO),true)
- CPPFLAGS += -I$(NAN_LZMA)
- CPPFLAGS += -DWITH_LZMA
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -I../../quicktime
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
-
-ifeq ($(WITH_LCMS), true)
- CPPFLAGS += -DWITH_LCMS
- CPPFLAGS += -I$(BF_LCMS_INC)
-endif
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 90a3a6ce664..14a0f71f824 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,6 +39,11 @@
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_anim.h"
@@ -48,15 +53,11 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BKE_idprop.h"
#include "BIK_api.h"
-#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
-#include "BLI_math.h"
-
#include "RNA_access.h"
/* *********************** NOTE ON POSE AND ACTION **********************
@@ -92,12 +93,11 @@ void make_local_action(bAction *act)
bAction *actn;
int local=0, lib=0;
- if (act->id.lib==0) return;
+ if (act->id.lib==NULL) return;
if (act->id.us==1) {
- act->id.lib= 0;
+ act->id.lib= NULL;
act->id.flag= LIB_LOCAL;
- //make_local_action_channels(act);
- new_id(0, (ID *)act, 0);
+ new_id(NULL, (ID *)act, NULL);
return;
}
@@ -113,10 +113,10 @@ void make_local_action(bAction *act)
#endif
if(local && lib==0) {
- act->id.lib= 0;
+ act->id.lib= NULL;
act->id.flag= LIB_LOCAL;
//make_local_action_channels(act);
- new_id(0, (ID *)act, 0);
+ new_id(NULL, (ID *)act, NULL);
}
else if(local && lib) {
actn= copy_action(act);
@@ -376,6 +376,20 @@ bActionGroup *action_groups_find_named (bAction *act, const char name[])
return BLI_findstring(&act->groups, name, offsetof(bActionGroup, name));
}
+/* Clear all 'temp' flags on all groups */
+void action_groups_clear_tempflags (bAction *act)
+{
+ bActionGroup *agrp;
+
+ /* sanity checks */
+ if (ELEM(NULL, act, act->groups.first))
+ return;
+
+ /* flag clearing loop */
+ for (agrp = act->groups.first; agrp; agrp = agrp->next)
+ agrp->flag &= ~AGRP_TEMP;
+}
+
/* *************** Pose channels *************** */
/* usually used within a loop, so we got a N^2 slowdown */
@@ -408,9 +422,10 @@ bPoseChannel *verify_pose_channel(bPose *pose, const char *name)
/* If not, create it and add it */
chan = MEM_callocN(sizeof(bPoseChannel), "verifyPoseChannel");
- strncpy(chan->name, name, 31);
+ BLI_strncpy(chan->name, name, sizeof(chan->name));
/* init vars to prevent math errors */
- chan->quat[0] = chan->rotAxis[1]= 1.0f;
+ unit_qt(chan->quat);
+ unit_axis_angle(chan->rotAxis, &chan->rotAngle);
chan->size[0] = chan->size[1] = chan->size[2] = 1.0f;
chan->limitmin[0]= chan->limitmin[1]= chan->limitmin[2]= -180.0f;
@@ -774,7 +789,7 @@ void pose_add_group (Object *ob)
return;
grp= MEM_callocN(sizeof(bActionGroup), "PoseGroup");
- strcpy(grp->name, "Group");
+ BLI_strncpy(grp->name, "Group", sizeof(grp->name));
BLI_addtail(&pose->agroups, grp);
BLI_uniquename(&pose->agroups, grp, "Group", '.', offsetof(bActionGroup, name), sizeof(grp->name));
@@ -1027,7 +1042,6 @@ void extract_pose_from_pose(bPose *pose, const bPose *src)
void rest_pose(bPose *pose)
{
bPoseChannel *pchan;
- int i;
if (!pose)
return;
@@ -1036,16 +1050,12 @@ void rest_pose(bPose *pose)
memset(pose->cyclic_offset, 0, sizeof(pose->cyclic_offset));
for (pchan=pose->chanbase.first; pchan; pchan= pchan->next) {
- for (i=0; i<3; i++) {
- pchan->loc[i]= 0.0f;
- pchan->quat[i+1]= 0.0f;
- pchan->eul[i]= 0.0f;
- pchan->size[i]= 1.0f;
- pchan->rotAxis[i]= 0.0f;
- }
- pchan->quat[0]= pchan->rotAxis[1]= 1.0f;
- pchan->rotAngle= 0.0f;
-
+ zero_v3(pchan->loc);
+ zero_v3(pchan->eul);
+ unit_qt(pchan->quat);
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
+
pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
}
}
@@ -1091,7 +1101,7 @@ void copy_pose_result(bPose *to, bPose *from)
/* For the calculation of the effects of an Action at the given frame on an object
* This is currently only used for the Action Constraint
*/
-void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose, bAction *act, char groupname[], float cframe)
+void what_does_obaction (Scene *UNUSED(scene), Object *ob, Object *workob, bPose *pose, bAction *act, char groupname[], float cframe)
{
bActionGroup *agrp= action_groups_find_named(act, groupname);
@@ -1119,8 +1129,8 @@ void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose,
workob->pose= pose; /* need to set pose too, since this is used for both types of Action Constraint */
- strcpy(workob->parsubstr, ob->parsubstr);
- strcpy(workob->id.name, "OB<ConstrWorkOb>"); /* we don't use real object name, otherwise RNA screws with the real thing */
+ BLI_strncpy(workob->parsubstr, ob->parsubstr, sizeof(workob->parsubstr));
+ BLI_strncpy(workob->id.name, "OB<ConstrWorkOb>", sizeof(workob->id.name)); /* we don't use real object name, otherwise RNA screws with the real thing */
/* if we're given a group to use, it's likely to be more efficient (though a bit more dangerous) */
if (agrp) {
@@ -1134,10 +1144,9 @@ void what_does_obaction (Scene *scene, Object *ob, Object *workob, bPose *pose,
animsys_evaluate_action_group(&id_ptr, act, agrp, NULL, cframe);
}
else {
- AnimData adt;
+ AnimData adt= {NULL};
/* init animdata, and attach to workob */
- memset(&adt, 0, sizeof(AnimData));
workob->adt= &adt;
adt.recalc= ADT_RECALC_ANIM;
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 167ceab23eb..5842197da48 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -1,4 +1,4 @@
-/** anim.c
+/* anim.c
*
*
* $Id$
@@ -39,6 +39,7 @@
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -50,6 +51,7 @@
#include "DNA_view3d_types.h"
#include "DNA_vfont_types.h"
+#include "BKE_animsys.h"
#include "BKE_curve.h"
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
@@ -66,6 +68,7 @@
#include "BKE_utildefines.h"
#include "BKE_tessmesh.h"
#include "BKE_depsgraph.h"
+#include "BKE_anim.h"
// XXX bad level call...
@@ -299,7 +302,7 @@ static void motionpaths_calc_update_scene(Scene *scene)
Base *base, *last=NULL;
/* only stuff that moves or needs display still */
- DAG_scene_update_flags(G.main, scene, scene->lay);
+ DAG_scene_update_flags(G.main, scene, scene->lay, TRUE);
/* find the last object with the tag
* - all those afterwards are assumed to not be relevant for our calculations
@@ -439,6 +442,7 @@ void animviz_calc_motionpaths(Scene *scene, ListBase *targets)
/* free curve path data
* NOTE: frees the path itself!
+ * NOTE: this is increasingly innacurate with non-uniform BevPoint subdivisions [#24633]
*/
void free_path(Path *path)
{
@@ -447,7 +451,7 @@ void free_path(Path *path)
}
/* calculate a curve-deform path for a curve
- * - only called from displist.c -> makeDispListCurveTypes
+ * - only called from displist.c -> do_makeDispListCurveTypes
*/
void calc_curvepath(Object *ob)
{
@@ -510,7 +514,7 @@ void calc_curvepath(Object *ob)
/* the path verts in path->data */
/* now also with TILT value */
- pp= path->data = (PathPoint *)MEM_callocN(sizeof(PathPoint)*4*path->len, "pathdata"); // XXX - why *4? - in 2.4x each element was 4 and the size was 16, so better leave for now - Campbell
+ pp= path->data = (PathPoint *)MEM_callocN(sizeof(PathPoint)*path->len, "pathdata");
bevp= bevpfirst;
bevpn= bevp+1;
@@ -640,32 +644,21 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat,
vec[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + data[3]*p3->vec[1] ; /* Y */
vec[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + data[3]*p3->vec[2] ; /* Z */
vec[3]= data[0]*p0->vec[3] + data[1]*p1->vec[3] + data[2]*p2->vec[3] + data[3]*p3->vec[3] ; /* Tilt, should not be needed since we have quat still used */
- /* Need to verify the quat interpolation is correct - XXX */
if (quat) {
- //float totfac, q1[4], q2[4];
+ float totfac, q1[4], q2[4];
- /* checks for totfac are needed when 'fac' is 1.0 key_curve_position_weights can assign zero
- * to more then one index in data which can give divide by zero error */
-/*
- totfac= data[0]+data[1];
- if(totfac>0.000001) interp_qt_qtqt(q1, p0->quat, p1->quat, data[0] / totfac);
- else QUATCOPY(q1, p1->quat);
+ totfac= data[0]+data[3];
+ if(totfac>FLT_EPSILON) interp_qt_qtqt(q1, p0->quat, p3->quat, data[3] / totfac);
+ else QUATCOPY(q1, p1->quat);
- normalize_qt(q1);
-
- totfac= data[2]+data[3];
- if(totfac>0.000001) interp_qt_qtqt(q2, p2->quat, p3->quat, data[2] / totfac);
- else QUATCOPY(q1, p3->quat);
- normalize_qt(q2);
+ totfac= data[1]+data[2];
+ if(totfac>FLT_EPSILON) interp_qt_qtqt(q2, p1->quat, p2->quat, data[2] / totfac);
+ else QUATCOPY(q2, p3->quat);
totfac = data[0]+data[1]+data[2]+data[3];
- if(totfac>0.000001) interp_qt_qtqt(quat, q1, q2, (data[0]+data[1]) / totfac);
- else QUATCOPY(quat, q2);
- normalize_qt(quat);
- */
- // XXX - find some way to make quat interpolation work correctly, above code fails in rare but nasty cases.
- QUATCOPY(quat, p1->quat);
+ if(totfac>FLT_EPSILON) interp_qt_qtqt(quat, q1, q2, (data[1]+data[2]) / totfac);
+ else QUATCOPY(quat, q2);
}
if(radius)
@@ -753,41 +746,69 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i
static void frames_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, int animated)
{
extern int enable_cu_speed; /* object.c */
- Object copyob;
- DupliObject *dob;
- int cfrao, ok;
+ Object copyob = {{NULL}};
+ int cfrao = scene->r.cfra;
- /* simple preventing of too deep nested groups */
- if(level>MAX_DUPLI_RECUR) return;
+ /* simple prevention of too deep nested groups */
+ if (level > MAX_DUPLI_RECUR) return;
- cfrao= scene->r.cfra;
- if(ob->parent==NULL && ob->constraints.first==NULL) return;
-
- if(ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0;
- copyob= *ob; /* store transform info */
-
- for(scene->r.cfra= ob->dupsta; scene->r.cfra<=ob->dupend; scene->r.cfra++) {
-
- ok= 1;
- if(ob->dupoff) {
+ /* if we don't have any data/settings which will lead to object movement,
+ * don't waste time trying, as it will all look the same...
+ */
+ if (ob->parent==NULL && ob->constraints.first==NULL && ob->adt==NULL)
+ return;
+
+ /* make a copy of the object's original data (before any dupli-data overwrites it)
+ * as we'll need this to keep track of unkeyed data
+ * - this doesn't take into account other data that can be reached from the object,
+ * for example it's shapekeys or bones, hence the need for an update flush at the end
+ */
+ copyob = *ob;
+
+ /* duplicate over the required range */
+ if (ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0;
+
+ for (scene->r.cfra= ob->dupsta; scene->r.cfra<=ob->dupend; scene->r.cfra++) {
+ short ok= 1;
+
+ /* - dupoff = how often a frames within the range shouldn't be made into duplis
+ * - dupon = the length of each "skipping" block in frames
+ */
+ if (ob->dupoff) {
ok= scene->r.cfra - ob->dupsta;
ok= ok % (ob->dupon+ob->dupoff);
- if(ok < ob->dupon) ok= 1;
- else ok= 0;
+ ok= (ok < ob->dupon);
}
- if(ok) {
-#if 0 // XXX old animation system
- do_ob_ipo(scene, ob);
-#endif // XXX old animation system
+
+ if (ok) {
+ DupliObject *dob;
+
+ /* WARNING: doing animation updates in this way is not terribly accurate, as the dependencies
+ * and/or other objects which may affect this object's transforms are not updated either.
+ * However, this has always been the way that this worked (i.e. pre 2.5), so I guess that it'll be fine!
+ */
+ BKE_animsys_evaluate_animdata(&ob->id, ob->adt, (float)scene->r.cfra, ADT_RECALC_ANIM); /* ob-eval will do drivers, so we don't need to do them */
where_is_object_time(scene, ob, (float)scene->r.cfra);
+
dob= new_dupli_object(lb, ob, ob->obmat, ob->lay, scene->r.cfra, OB_DUPLIFRAMES, animated);
copy_m4_m4(dob->omat, copyob.obmat);
}
}
- *ob= copyob; /* restore transform info */
- scene->r.cfra= cfrao;
enable_cu_speed= 1;
+
+ /* reset frame to original frame, then re-evaluate animation as above
+ * as 2.5 animation data may have far-reaching consequences
+ */
+ scene->r.cfra= cfrao;
+
+ BKE_animsys_evaluate_animdata(&ob->id, ob->adt, (float)scene->r.cfra, ADT_RECALC_ANIM); /* ob-eval will do drivers, so we don't need to do them */
+ where_is_object_time(scene, ob, (float)scene->r.cfra);
+
+ /* but, to make sure unkeyed object transforms are still sane,
+ * let's copy object's original data back over
+ */
+ *ob = copyob;
}
typedef struct vertexDupliData {
@@ -809,6 +830,7 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
DupliObject *dob;
vertexDupliData *vdd= userData;
float vec[3], q2[4], mat[3][3], tmat[4][4], obmat[4][4];
+ int origlay;
mul_v3_m4v3(vec, vdd->pmat, co);
sub_v3_v3(vec, vdd->pmat[3]);
@@ -831,7 +853,14 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
copy_m4_m4(tmat, obmat);
mul_m4_m4m3(obmat, tmat, mat);
}
+
+ origlay = vdd->ob->lay;
+
dob= new_dupli_object(vdd->lb, vdd->ob, obmat, vdd->par->lay, index, OB_DUPLIVERTS, vdd->animated);
+
+ /* restore the original layer so that each dupli will have proper dob->origlay */
+ vdd->ob->lay = origlay;
+
if(vdd->orco)
VECCOPY(dob->orco, vdd->orco[index]);
@@ -856,7 +885,8 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl
GroupObject * go = NULL;
BMEditMesh *em;
float vec[3], no[3], pmat[4][4];
- int lay, totvert, a, oblay;
+ int totvert, a, oblay;
+ unsigned int lay;
copy_m4_m4(pmat, par->obmat);
@@ -939,6 +969,14 @@ static void vertex_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, fl
vertex_dupli__mapFunc(&vdd, a, vec, no, NULL);
}
}
+ if(sce) {
+ /* Set proper layer in case of scene looping,
+ * in case of groups the object layer will be
+ * changed when it's duplicated due to the
+ * group duplication.
+ */
+ ob->lay = vdd.par->lay;
+ }
break;
}
@@ -1150,33 +1188,37 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa
static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, float par_space_mat[][4], ParticleSystem *psys, int level, int animated)
{
GroupObject *go;
- Object *ob=0, **oblist=0, obcopy, *obcopylist=0;
+ Object *ob=NULL, **oblist=NULL, obcopy, *obcopylist=NULL;
DupliObject *dob;
ParticleDupliWeight *dw;
- ParticleSimulationData sim = {scene, par, psys, psys_get_modifier(par, psys)};
ParticleSettings *part;
ParticleData *pa;
- ChildParticle *cpa=0;
+ ChildParticle *cpa=NULL;
ParticleKey state;
ParticleCacheKey *cache;
float ctime, pa_time, scale = 1.0f;
float tmat[4][4], mat[4][4], pamat[4][4], vec[3], size=0.0;
float (*obmat)[4], (*oldobmat)[4];
- int lay, a, b, counter, hair = 0;
+ int a, b, counter, hair = 0;
int totpart, totchild, totgroup=0, pa_num;
- if(psys==0) return;
+ int no_draw_flag = PARS_UNEXIST;
+
+ if(psys==NULL) return;
/* simple preventing of too deep nested groups */
if(level>MAX_DUPLI_RECUR) return;
part=psys->part;
- if(part==0)
+ if(part==NULL)
return;
if(!psys_check_enabled(par, psys))
return;
+
+ if(G.rendering == 0)
+ no_draw_flag |= PARS_NO_DISP;
ctime = bsystem_time(scene, par, (float)scene->r.cfra, 0.0);
@@ -1184,9 +1226,13 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
totchild = psys->totchild;
BLI_srandom(31415926 + psys->seed);
-
- lay= scene->lay;
+
if((psys->renderdata || part->draw_as==PART_DRAW_REND) && ELEM(part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
+ ParticleSimulationData sim= {NULL};
+ sim.scene= scene;
+ sim.ob= par;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(par, psys);
/* first check for loops (particle system object used as dupli object) */
if(part->ren_as == PART_DRAW_OB) {
@@ -1268,7 +1314,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
for(pa=psys->particles,counter=0; a<totpart+totchild; a++,pa++,counter++) {
if(a<totpart) {
/* handle parent particle */
- if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP))
+ if(pa->flag & no_draw_flag)
continue;
pa_num = pa->num;
@@ -1281,7 +1327,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
pa_num = a;
pa_time = psys->particles[cpa->parent].time;
- size = psys_get_child_size(psys, cpa, ctime, 0);
+ size = psys_get_child_size(psys, cpa, ctime, NULL);
}
/* some hair paths might be non-existent so they can't be used for duplication */
@@ -1312,11 +1358,11 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
/* hair we handle separate and compute transform based on hair keys */
if(a < totpart) {
cache = psys->pathcache[a];
- psys_get_dupli_path_transform(&sim, pa, 0, cache, pamat, &scale);
+ psys_get_dupli_path_transform(&sim, pa, NULL, cache, pamat, &scale);
}
else {
cache = psys->childcache[a-totpart];
- psys_get_dupli_path_transform(&sim, 0, cpa, cache, pamat, &scale);
+ psys_get_dupli_path_transform(&sim, NULL, cpa, cache, pamat, &scale);
}
VECCOPY(pamat[3], cache->co);
@@ -1326,12 +1372,16 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
else {
/* first key */
state.time = ctime;
- if(psys_get_particle_state(&sim, a, &state, 0) == 0)
+ if(psys_get_particle_state(&sim, a, &state, 0) == 0) {
continue;
-
- quat_to_mat4( pamat,state.rot);
- VECCOPY(pamat[3], state.co);
- pamat[3][3]= 1.0f;
+ }
+ else {
+ float tquat[4];
+ normalize_qt_qt(tquat, state.rot);
+ quat_to_mat4(pamat, tquat);
+ copy_v3_v3(pamat[3], state.co);
+ pamat[3][3]= 1.0f;
+ }
}
if(part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
@@ -1356,20 +1406,26 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
VECCOPY(vec, obmat[3]);
obmat[3][0] = obmat[3][1] = obmat[3][2] = 0.0f;
- copy_m4_m4(mat, pamat);
+ /* Normal particles and cached hair live in global space so we need to
+ * remove the real emitter's transformation before 2nd order duplication.
+ */
+ if(par_space_mat && GS(id->name) != ID_GR)
+ mul_m4_m4m4(mat, pamat, psys->imat);
+ else
+ copy_m4_m4(mat, pamat);
mul_m4_m4m4(tmat, obmat, mat);
mul_mat3_m4_fl(tmat, size*scale);
- if(part->draw & PART_DRAW_GLOBAL_OB)
- VECADD(tmat[3], tmat[3], vec);
-
if(par_space_mat)
mul_m4_m4m4(mat, tmat, par_space_mat);
else
copy_m4_m4(mat, tmat);
- dob= new_dupli_object(lb, ob, mat, ob->lay, counter, OB_DUPLIPARTS, animated);
+ if(part->draw & PART_DRAW_GLOBAL_OB)
+ VECADD(mat[3], mat[3], vec);
+
+ dob= new_dupli_object(lb, ob, mat, ob->lay, counter, GS(id->name) == ID_GR ? OB_DUPLIGROUP : OB_DUPLIPARTS, animated);
copy_m4_m4(dob->omat, oldobmat);
if(G.rendering)
psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
@@ -1422,7 +1478,7 @@ static Object *find_family_object(Object **obar, char *family, char ch)
static void font_duplilist(ListBase *lb, Scene *scene, Object *par, int level, int animated)
{
- Object *ob, *obar[256];
+ Object *ob, *obar[256]= {NULL};
Curve *cu;
struct chartrans *ct, *chartransdata;
float vec[3], obmat[4][4], pmat[4][4], fsize, xof, yof;
@@ -1436,10 +1492,8 @@ static void font_duplilist(ListBase *lb, Scene *scene, Object *par, int level, i
/* in par the family name is stored, use this to find the other objects */
chartransdata= BKE_text_to_curve(scene, par, FO_DUPLI);
- if(chartransdata==0) return;
-
- memset(obar, 0, 256*sizeof(void *));
-
+ if(chartransdata==NULL) return;
+
cu= par->data;
slen= strlen(cu->str);
fsize= cu->fsize;
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 10c2c1801cb..77d0f008c2b 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,9 +37,12 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_material_types.h"
#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -47,6 +50,7 @@
#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_library.h"
#include "BKE_utildefines.h"
#include "RNA_access.h"
@@ -70,7 +74,7 @@ short id_type_can_have_animdata (ID *id)
switch (GS(id->name)) {
/* has AnimData */
case ID_OB:
- case ID_ME: case ID_MB: case ID_CU: case ID_AR:
+ case ID_ME: case ID_MB: case ID_CU: case ID_AR: case ID_LT:
case ID_KE:
case ID_PA:
case ID_MA: case ID_TE: case ID_NT:
@@ -175,7 +179,7 @@ void BKE_free_animdata (ID *id)
/* Freeing -------------------------------------------- */
/* Make a copy of the given AnimData - to be used when copying datablocks */
-AnimData *BKE_copy_animdata (AnimData *adt)
+AnimData *BKE_copy_animdata (AnimData *adt, const short do_action)
{
AnimData *dadt;
@@ -185,9 +189,15 @@ AnimData *BKE_copy_animdata (AnimData *adt)
dadt= MEM_dupallocN(adt);
/* make a copy of action - at worst, user has to delete copies... */
- dadt->action= copy_action(adt->action);
- dadt->tmpact= copy_action(adt->tmpact);
-
+ if(do_action) {
+ dadt->action= copy_action(adt->action);
+ dadt->tmpact= copy_action(adt->tmpact);
+ }
+ else {
+ id_us_plus((ID *)dadt->action);
+ id_us_plus((ID *)dadt->tmpact);
+ }
+
/* duplicate NLA data */
copy_nladata(&dadt->nla_tracks, &adt->nla_tracks);
@@ -201,7 +211,7 @@ AnimData *BKE_copy_animdata (AnimData *adt)
return dadt;
}
-int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from)
+int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from, const short do_action)
{
AnimData *adt;
@@ -213,13 +223,26 @@ int BKE_copy_animdata_id(struct ID *id_to, struct ID *id_from)
adt = BKE_animdata_from_id(id_from);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id_to;
- iat->adt= BKE_copy_animdata(adt);
+ iat->adt= BKE_copy_animdata(adt, do_action);
}
return 1;
}
-
+void BKE_copy_animdata_id_action(struct ID *id)
+{
+ AnimData *adt= BKE_animdata_from_id(id);
+ if(adt) {
+ if(adt->action) {
+ ((ID *)adt->action)->us--;
+ adt->action= copy_action(adt->action);
+ }
+ if(adt->tmpact) {
+ ((ID *)adt->tmpact)->us--;
+ adt->tmpact= copy_action(adt->tmpact);
+ }
+ }
+}
/* Make Local -------------------------------------------- */
@@ -254,6 +277,176 @@ void BKE_animdata_make_local(AnimData *adt)
make_local_strips(&nlt->strips);
}
+/* Sub-ID Regrouping ------------------------------------------- */
+
+/* helper heuristic for determining if a path is compatible with the basepath
+ * < path: (str) full RNA-path from some data (usually an F-Curve) to compare
+ * < basepath: (str) shorter path fragment to look for
+ * > returns (bool) whether there is a match
+ */
+static short animpath_matches_basepath (const char path[], const char basepath[])
+{
+ /* we need start of path to be basepath */
+ return (path && basepath) && (strstr(path, basepath) == path);
+}
+
+/* Move F-Curves in src action to dst action, setting up all the necessary groups
+ * for this to happen, but only if the F-Curves being moved have the appropriate
+ * "base path".
+ * - This is used when data moves from one datablock to another, causing the
+ * F-Curves to need to be moved over too
+ */
+void action_move_fcurves_by_basepath (bAction *srcAct, bAction *dstAct, const char basepath[])
+{
+ FCurve *fcu, *fcn=NULL;
+
+ /* sanity checks */
+ if ELEM3(NULL, srcAct, dstAct, basepath) {
+ if (G.f & G_DEBUG) {
+ printf("ERROR: action_partition_fcurves_by_basepath(%p, %p, %p) has insufficient info to work with\n",
+ srcAct, dstAct, basepath);
+ }
+ return;
+ }
+
+ /* clear 'temp' flags on all groups in src, as we'll be needing them later
+ * to identify groups that we've managed to empty out here
+ */
+ action_groups_clear_tempflags(srcAct);
+
+ /* iterate over all src F-Curves, moving over the ones that need to be moved */
+ for (fcu = srcAct->curves.first; fcu; fcu = fcn) {
+ /* store next pointer in case we move stuff */
+ fcn = fcu->next;
+
+ /* should F-Curve be moved over?
+ * - we only need the start of the path to match basepath
+ */
+ if (animpath_matches_basepath(fcu->rna_path, basepath)) {
+ bActionGroup *agrp = NULL;
+
+ /* if grouped... */
+ if (fcu->grp) {
+ /* make sure there will be a matching group on the other side for the migrants */
+ agrp = action_groups_find_named(dstAct, fcu->grp->name);
+
+ if (agrp == NULL) {
+ /* add a new one with a similar name (usually will be the same though) */
+ agrp = action_groups_add_new(dstAct, fcu->grp->name);
+ }
+
+ /* old groups should be tagged with 'temp' flags so they can be removed later
+ * if we remove everything from them
+ */
+ fcu->grp->flag |= AGRP_TEMP;
+ }
+
+ /* perform the migration now */
+ action_groups_remove_channel(srcAct, fcu);
+
+ if (agrp)
+ action_groups_add_channel(dstAct, agrp, fcu);
+ else
+ BLI_addtail(&dstAct->curves, fcu);
+ }
+ }
+
+ /* cleanup groups (if present) */
+ if (srcAct->groups.first) {
+ bActionGroup *agrp, *grp=NULL;
+
+ for (agrp = srcAct->groups.first; agrp; agrp = grp) {
+ grp = agrp->next;
+
+ /* only tagged groups need to be considered - clearing these tags or removing them */
+ if (agrp->flag & AGRP_TEMP) {
+ /* if group is empty and tagged, then we can remove as this operation
+ * moved out all the channels that were formerly here
+ */
+ if (agrp->channels.first == NULL)
+ BLI_freelinkN(&srcAct->groups, agrp);
+ else
+ agrp->flag &= ~AGRP_TEMP;
+ }
+ }
+ }
+}
+
+/* Transfer the animation data from srcID to dstID where the srcID
+ * animation data is based off "basepath", creating new AnimData and
+ * associated data as necessary
+ */
+void BKE_animdata_separate_by_basepath (ID *srcID, ID *dstID, ListBase *basepaths)
+{
+ AnimData *srcAdt=NULL, *dstAdt=NULL;
+ LinkData *ld;
+
+ /* sanity checks */
+ if ELEM(NULL, srcID, dstID) {
+ if (G.f & G_DEBUG)
+ printf("ERROR: no source or destination ID to separate AnimData with\n");
+ return;
+ }
+
+ /* get animdata from src, and create for destination (if needed) */
+ srcAdt = BKE_animdata_from_id(srcID);
+ dstAdt = BKE_id_add_animdata(dstID);
+
+ if ELEM(NULL, srcAdt, dstAdt) {
+ if (G.f & G_DEBUG)
+ printf("ERROR: no AnimData for this pair of ID's\n");
+ return;
+ }
+
+ /* active action */
+ if (srcAdt->action) {
+ /* set up an action if necessary, and name it in a similar way so that it can be easily found again */
+ if (dstAdt->action == NULL) {
+ dstAdt->action = add_empty_action(srcAdt->action->id.name+2);
+ }
+ else if (dstAdt->action == srcAdt->action) {
+ printf("Argh! Source and Destination share animation! ('%s' and '%s' both use '%s') Making new empty action\n",
+ srcID->name, dstID->name, srcAdt->action->id.name);
+
+ // TODO: review this...
+ id_us_min(&dstAdt->action->id);
+ dstAdt->action = add_empty_action(dstAdt->action->id.name+2);
+ }
+
+ /* loop over base paths, trying to fix for each one... */
+ for (ld = basepaths->first; ld; ld = ld->next) {
+ const char *basepath = (const char *)ld->data;
+ action_move_fcurves_by_basepath(srcAdt->action, dstAdt->action, basepath);
+ }
+ }
+
+ /* drivers */
+ if (srcAdt->drivers.first) {
+ FCurve *fcu, *fcn=NULL;
+
+ /* check each driver against all the base paths to see if any should go */
+ for (fcu = srcAdt->drivers.first; fcu; fcu = fcn) {
+ fcn = fcu->next;
+
+ /* try each basepath in turn, but stop on the first one which works */
+ for (ld = basepaths->first; ld; ld = ld->next) {
+ const char *basepath = (const char *)ld->data;
+
+ if (animpath_matches_basepath(fcu->rna_path, basepath)) {
+ /* just need to change lists */
+ BLI_remlink(&srcAdt->drivers, fcu);
+ BLI_addtail(&dstAdt->drivers, fcu);
+
+ // TODO: add depsgraph flushing calls?
+
+ /* can stop now, as moved already */
+ break;
+ }
+ }
+ }
+ }
+}
+
/* Path Validation -------------------------------------------- */
/* Check if a given RNA Path is valid, by tracing it from the given ID, and seeing if we can resolve it */
@@ -272,7 +465,7 @@ static short check_rna_path_is_valid (ID *owner_id, char *path)
/* Check if some given RNA Path needs fixing - free the given path and set a new one as appropriate
* NOTE: we assume that oldName and newName have [" "] padding around them
*/
-static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldpath, int verify_paths)
+static char *rna_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, char *oldpath, int verify_paths)
{
char *prefixPtr= strstr(oldpath, prefix);
char *oldNamePtr= strstr(oldpath, oldName);
@@ -330,7 +523,7 @@ static char *rna_path_rename_fix (ID *owner_id, char *prefix, char *oldName, cha
}
/* Check RNA-Paths for a list of F-Curves */
-static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *curves, int verify_paths)
+static void fcurves_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, ListBase *curves, int verify_paths)
{
FCurve *fcu;
@@ -343,7 +536,7 @@ static void fcurves_path_rename_fix (ID *owner_id, char *prefix, char *oldName,
}
/* Check RNA-Paths for a list of Drivers */
-static void drivers_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, char *oldKey, char *newKey, ListBase *curves, int verify_paths)
+static void drivers_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, char *oldKey, char *newKey, ListBase *curves, int verify_paths)
{
FCurve *fcu;
@@ -383,7 +576,7 @@ static void drivers_path_rename_fix (ID *owner_id, char *prefix, char *oldName,
}
/* Fix all RNA-Paths for Actions linked to NLA Strips */
-static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName, char *newName, ListBase *strips, int verify_paths)
+static void nlastrips_path_rename_fix (ID *owner_id, const char *prefix, char *oldName, char *newName, ListBase *strips, int verify_paths)
{
NlaStrip *strip;
@@ -403,7 +596,7 @@ static void nlastrips_path_rename_fix (ID *owner_id, char *prefix, char *oldName
* NOTE: it is assumed that the structure we're replacing is <prefix><["><name><"]>
* i.e. pose.bones["Bone"]
*/
-void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths)
+void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, const char *prefix, char *oldName, char *newName, int oldSubscript, int newSubscript, int verify_paths)
{
NlaTrack *nlt;
char *oldN, *newN;
@@ -443,44 +636,73 @@ void BKE_animdata_fix_paths_rename (ID *owner_id, AnimData *adt, char *prefix, c
/* Whole Database Ops -------------------------------------------- */
/* apply the given callback function on all data in main database */
-void BKE_animdata_main_cb (Main *main, ID_AnimData_Edit_Callback func, void *user_data)
+void BKE_animdata_main_cb (Main *mainptr, ID_AnimData_Edit_Callback func, void *user_data)
{
ID *id;
+ /* standard data version */
#define ANIMDATA_IDS_CB(first) \
for (id= first; id; id= id->next) { \
AnimData *adt= BKE_animdata_from_id(id); \
if (adt) func(id, adt, user_data); \
}
-
- ANIMDATA_IDS_CB(main->nodetree.first); /* nodes */
- ANIMDATA_IDS_CB(main->tex.first); /* textures */
- ANIMDATA_IDS_CB(main->lamp.first); /* lamps */
- ANIMDATA_IDS_CB(main->mat.first); /* materials */
- ANIMDATA_IDS_CB(main->camera.first); /* cameras */
- ANIMDATA_IDS_CB(main->key.first); /* shapekeys */
- ANIMDATA_IDS_CB(main->mball.first); /* metaballs */
- ANIMDATA_IDS_CB(main->curve.first); /* curves */
- ANIMDATA_IDS_CB(main->armature.first); /* armatures */
- ANIMDATA_IDS_CB(main->mesh.first); /* meshes */
- ANIMDATA_IDS_CB(main->particle.first); /* particles */
- ANIMDATA_IDS_CB(main->object.first); /* objects */
- ANIMDATA_IDS_CB(main->world.first); /* worlds */
-
- /* scenes */
- for (id= main->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- if (adt2) func(id, adt2, user_data);
- }
-
- /* now fix scene animation data as per normal */
- if (adt) func((ID *)id, adt, user_data);
+
+ /* "embedded" nodetree cases (i.e. scene/material/texture->nodetree) */
+#define ANIMDATA_NODETREE_IDS_CB(first, NtId_Type) \
+ for (id= first; id; id= id->next) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp); \
+ if (adt2) func(id, adt2, user_data); \
+ } \
+ if (adt) func(id, adt, user_data); \
}
+
+ /* nodes */
+ ANIMDATA_IDS_CB(mainptr->nodetree.first);
+
+ /* textures */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->tex.first, Tex);
+
+ /* lamps */
+ ANIMDATA_IDS_CB(mainptr->lamp.first);
+
+ /* materials */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->mat.first, Material);
+
+ /* cameras */
+ ANIMDATA_IDS_CB(mainptr->camera.first);
+
+ /* shapekeys */
+ ANIMDATA_IDS_CB(mainptr->key.first);
+
+ /* metaballs */
+ ANIMDATA_IDS_CB(mainptr->mball.first);
+
+ /* curves */
+ ANIMDATA_IDS_CB(mainptr->curve.first);
+
+ /* armatures */
+ ANIMDATA_IDS_CB(mainptr->armature.first);
+
+ /* lattices */
+ ANIMDATA_IDS_CB(mainptr->latt.first);
+
+ /* meshes */
+ ANIMDATA_IDS_CB(mainptr->mesh.first);
+
+ /* particles */
+ ANIMDATA_IDS_CB(mainptr->particle.first);
+
+ /* objects */
+ ANIMDATA_IDS_CB(mainptr->object.first);
+
+ /* worlds */
+ ANIMDATA_IDS_CB(mainptr->world.first);
+
+ /* scenes */
+ ANIMDATA_NODETREE_IDS_CB(mainptr->scene.first, Scene);
}
/* Fix all RNA-Paths throughout the database (directly access the Global.main version)
@@ -503,17 +725,29 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName, 0, 0, 1);\
}
+ /* another version of this macro for nodetrees */
+#define RENAMEFIX_ANIM_NODETREE_IDS(first, NtId_Type) \
+ for (id= first; id; id= id->next) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp); \
+ BKE_animdata_fix_paths_rename((ID *)ntp, adt2, prefix, oldName, newName, 0, 0, 1);\
+ } \
+ BKE_animdata_fix_paths_rename(id, adt, prefix, oldName, newName, 0, 0, 1);\
+ }
+
/* nodes */
RENAMEFIX_ANIM_IDS(mainptr->nodetree.first);
/* textures */
- RENAMEFIX_ANIM_IDS(mainptr->tex.first);
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->tex.first, Tex);
/* lamps */
RENAMEFIX_ANIM_IDS(mainptr->lamp.first);
/* materials */
- RENAMEFIX_ANIM_IDS(mainptr->mat.first);
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->mat.first, Material);
/* cameras */
RENAMEFIX_ANIM_IDS(mainptr->camera.first);
@@ -530,8 +764,11 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
/* armatures */
RENAMEFIX_ANIM_IDS(mainptr->armature.first);
+ /* lattices */
+ RENAMEFIX_ANIM_IDS(mainptr->latt.first);
+
/* meshes */
- // TODO...
+ RENAMEFIX_ANIM_IDS(mainptr->mesh.first);
/* particles */
RENAMEFIX_ANIM_IDS(mainptr->particle.first);
@@ -543,19 +780,7 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
RENAMEFIX_ANIM_IDS(mainptr->world.first);
/* scenes */
- for (id= mainptr->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- BKE_animdata_fix_paths_rename((ID *)scene->nodetree, adt2, prefix, oldName, newName, 0, 0, 1);
- }
-
- /* now fix scene animation data as per normal */
- BKE_animdata_fix_paths_rename((ID *)id, adt, prefix, oldName, newName, 0, 0, 1);
- }
+ RENAMEFIX_ANIM_NODETREE_IDS(mainptr->scene.first, Scene);
}
/* *********************************** */
@@ -565,7 +790,7 @@ void BKE_all_animdata_fix_paths_rename (char *prefix, char *oldName, char *newNa
/* Find the first path that matches the given criteria */
// TODO: do we want some method to perform partial matches too?
-KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int group_mode)
+KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[], const char rna_path[], int array_index, int UNUSED(group_mode))
{
KS_Path *ksp;
@@ -584,7 +809,7 @@ KS_Path *BKE_keyingset_find_path (KeyingSet *ks, ID *id, const char group_name[]
eq_id= 0;
/* path */
- if ((ksp->rna_path==0) || strcmp(rna_path, ksp->rna_path))
+ if ((ksp->rna_path==NULL) || strcmp(rna_path, ksp->rna_path))
eq_path= 0;
/* index - need to compare whole-array setting too... */
@@ -614,12 +839,9 @@ KeyingSet *BKE_keyingset_add (ListBase *list, const char name[], short flag, sho
/* allocate new KeyingSet */
ks= MEM_callocN(sizeof(KeyingSet), "KeyingSet");
-
- if (name)
- strncpy(ks->name, name, sizeof(ks->name));
- else
- strcpy(ks->name, "KeyingSet");
-
+
+ BLI_strncpy(ks->name, name ? name : "KeyingSet", sizeof(ks->name));
+
ks->flag= flag;
ks->keyingflag= keyingflag;
@@ -665,9 +887,9 @@ KS_Path *BKE_keyingset_add_path (KeyingSet *ks, ID *id, const char group_name[],
/* just store absolute info */
ksp->id= id;
if (group_name)
- BLI_snprintf(ksp->group, 64, group_name);
+ BLI_strncpy(ksp->group, group_name, sizeof(ksp->group));
else
- strcpy(ksp->group, "");
+ ksp->group[0]= '\0';
/* store additional info for relative paths (just in case user makes the set relative) */
if (id)
@@ -695,10 +917,11 @@ void BKE_keyingset_free_path (KeyingSet *ks, KS_Path *ksp)
/* sanity check */
if ELEM(NULL, ks, ksp)
return;
-
+
/* free RNA-path info */
- MEM_freeN(ksp->rna_path);
-
+ if(ksp->rna_path)
+ MEM_freeN(ksp->rna_path);
+
/* free path itself */
BLI_freelinkN(&ks->paths, ksp);
}
@@ -767,7 +990,7 @@ void BKE_keyingsets_free (ListBase *list)
* - path: original path string (as stored in F-Curve data)
* - dst: destination string to write data to
*/
-static short animsys_remap_path (AnimMapper *remap, char *path, char **dst)
+static short animsys_remap_path (AnimMapper *UNUSED(remap), char *path, char **dst)
{
/* is there a valid remapping table to use? */
//if (remap) {
@@ -1591,9 +1814,6 @@ void nladata_flush_channels (ListBase *channels)
*/
static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
{
- ListBase dummy_trackslist = {NULL, NULL};
- NlaStrip dummy_strip;
-
NlaTrack *nlt;
short track_index=0;
short has_strips = 0;
@@ -1607,7 +1827,7 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* 1. get the stack of strips to evaluate at current time (influence calculated here) */
for (nlt=adt->nla_tracks.first; nlt; nlt=nlt->next, track_index++) {
- /* if tweaking is on and this strip is the tweaking track, stop on this one */
+ /* stop here if tweaking is on and this strip is the tweaking track (it will be the first one that's 'disabled')... */
if ((adt->flag & ADT_NLA_EDIT_ON) && (nlt->flag & NLATRACK_DISABLED))
break;
@@ -1634,22 +1854,32 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
*/
if ((adt->action) && !(adt->flag & ADT_NLA_SOLO_TRACK)) {
/* if there are strips, evaluate action as per NLA rules */
- if (has_strips) {
+ if ((has_strips) || (adt->actstrip)) {
/* make dummy NLA strip, and add that to the stack */
- memset(&dummy_strip, 0, sizeof(NlaStrip));
- dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
-
- dummy_strip.act= adt->action;
- dummy_strip.remap= adt->remap;
+ NlaStrip dummy_strip= {NULL};
+ ListBase dummy_trackslist;
- /* action range is calculated taking F-Modifiers into account (which making new strips doesn't do due to the troublesome nature of that) */
- calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
- dummy_strip.start = dummy_strip.actstart;
- dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+ dummy_trackslist.first= dummy_trackslist.last= &dummy_strip;
- dummy_strip.blendmode= adt->act_blendmode;
- dummy_strip.extendmode= adt->act_extendmode;
- dummy_strip.influence= adt->act_influence;
+ if ((nlt) && !(adt->flag & ADT_NLA_EDIT_NOMAP)) {
+ /* edit active action in-place according to its active strip, so copy the data */
+ memcpy(&dummy_strip, adt->actstrip, sizeof(NlaStrip));
+ dummy_strip.next = dummy_strip.prev = NULL;
+ }
+ else {
+ /* set settings of dummy NLA strip from AnimData settings */
+ dummy_strip.act= adt->action;
+ dummy_strip.remap= adt->remap;
+
+ /* action range is calculated taking F-Modifiers into account (which making new strips doesn't do due to the troublesome nature of that) */
+ calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
+ dummy_strip.start = dummy_strip.actstart;
+ dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+
+ dummy_strip.blendmode= adt->act_blendmode;
+ dummy_strip.extendmode= adt->act_extendmode;
+ dummy_strip.influence= adt->act_influence;
+ }
/* add this to our list of evaluation strips */
nlastrips_ctime_get_strip(&estrips, &dummy_trackslist, -1, ctime);
@@ -1685,16 +1915,18 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* Clear all overides */
/* Add or get existing Override for given setting */
-AnimOverride *BKE_animsys_validate_override (PointerRNA *ptr, char *path, int array_index)
+#if 0
+AnimOverride *BKE_animsys_validate_override (PointerRNA *UNUSED(ptr), char *UNUSED(path), int UNUSED(array_index))
{
// FIXME: need to define how to get overrides
return NULL;
}
+#endif
/* -------------------- */
/* Evaluate Overrides */
-static void animsys_evaluate_overrides (PointerRNA *ptr, AnimData *adt, float ctime)
+static void animsys_evaluate_overrides (PointerRNA *ptr, AnimData *adt)
{
AnimOverride *aor;
@@ -1793,7 +2025,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
* - Overrides are cleared upon frame change and/or keyframing
* - It is best that we execute this everytime, so that no errors are likely to occur.
*/
- animsys_evaluate_overrides(&id_ptr, adt, ctime);
+ animsys_evaluate_overrides(&id_ptr, adt);
/* clear recalc flag now */
adt->recalc= 0;
@@ -1813,7 +2045,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
if (G.f & G_DEBUG)
printf("Evaluate all animation - %f \n", ctime);
- /* macro for less typing
+ /* macros for less typing
* - only evaluate animation data for id if it has users (and not just fake ones)
* - whether animdata exists is checked for by the evaluation function, though taking
* this outside of the function may make things slightly faster?
@@ -1825,6 +2057,24 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \
} \
}
+ /* another macro for the "embedded" nodetree cases
+ * - this is like EVAL_ANIM_IDS, but this handles the case "embedded nodetrees"
+ * (i.e. scene/material/texture->nodetree) which we need a special exception
+ * for, otherwise they'd get skipped
+ * - ntp = "node tree parent" = datablock where node tree stuff resides
+ */
+#define EVAL_ANIM_NODETREE_IDS(first, NtId_Type, aflag) \
+ for (id= first; id; id= id->next) { \
+ if (ID_REAL_USERS(id) > 0) { \
+ AnimData *adt= BKE_animdata_from_id(id); \
+ NtId_Type *ntp= (NtId_Type *)id; \
+ if (ntp->nodetree) { \
+ AnimData *adt2= BKE_animdata_from_id((ID *)ntp->nodetree); \
+ BKE_animsys_evaluate_animdata((ID *)ntp->nodetree, adt2, ctime, ADT_RECALC_ANIM); \
+ } \
+ BKE_animsys_evaluate_animdata(id, adt, ctime, aflag); \
+ } \
+ }
/* optimisation:
* when there are no actions, don't go over database and loop over heaps of datablocks,
@@ -1845,45 +2095,32 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
EVAL_ANIM_IDS(main->nodetree.first, ADT_RECALC_ANIM);
/* textures */
- EVAL_ANIM_IDS(main->tex.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->tex.first, Tex, ADT_RECALC_ANIM);
/* lamps */
EVAL_ANIM_IDS(main->lamp.first, ADT_RECALC_ANIM);
/* materials */
- EVAL_ANIM_IDS(main->mat.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->mat.first, Material, ADT_RECALC_ANIM);
/* cameras */
EVAL_ANIM_IDS(main->camera.first, ADT_RECALC_ANIM);
/* shapekeys */
- // TODO: we probably need the same hack as for curves (ctime-hack)
EVAL_ANIM_IDS(main->key.first, ADT_RECALC_ANIM);
/* metaballs */
EVAL_ANIM_IDS(main->mball.first, ADT_RECALC_ANIM);
/* curves */
- /* we need to perform a special hack here to ensure that the ctime
- * value of the curve gets set in case there's no animation for that
- * - it needs to be set before animation is evaluated just so that
- * animation can successfully override...
- * - it shouldn't get set when calculating drivers...
- */
- for (id= main->curve.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Curve *cu= (Curve *)id;
-
- /* set ctime variable for curve */
- cu->ctime= ctime;
-
- /* now execute animation data on top of this as per normal */
- BKE_animsys_evaluate_animdata(id, adt, ctime, ADT_RECALC_ANIM);
- }
+ EVAL_ANIM_IDS(main->curve.first, ADT_RECALC_ANIM);
/* armatures */
EVAL_ANIM_IDS(main->armature.first, ADT_RECALC_ANIM);
+ /* lattices */
+ EVAL_ANIM_IDS(main->latt.first, ADT_RECALC_ANIM);
+
/* meshes */
EVAL_ANIM_IDS(main->mesh.first, ADT_RECALC_ANIM);
@@ -1901,19 +2138,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM);
/* scenes */
- for (id= main->scene.first; id; id= id->next) {
- AnimData *adt= BKE_animdata_from_id(id);
- Scene *scene= (Scene *)id;
-
- /* do compositing nodes first (since these aren't included in main tree) */
- if (scene->nodetree) {
- AnimData *adt2= BKE_animdata_from_id((ID *)scene->nodetree);
- BKE_animsys_evaluate_animdata((ID *)scene->nodetree, adt2, ctime, ADT_RECALC_ANIM);
- }
-
- /* now execute scene animation data as per normal */
- BKE_animsys_evaluate_animdata(id, adt, ctime, ADT_RECALC_ANIM);
- }
+ EVAL_ANIM_NODETREE_IDS(main->scene.first, Scene, ADT_RECALC_ANIM);
}
/* ***************************************** */
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index a482e4051d4..b9ff4c2a30b 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,6 +37,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -64,13 +65,13 @@
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BIK_api.h"
#include "BKE_sketch.h"
/* **************** Generic Functions, data level *************** */
-bArmature *add_armature(char *name)
+bArmature *add_armature(const char *name)
{
bArmature *arm;
@@ -136,19 +137,19 @@ void make_local_armature(bArmature *arm)
Object *ob;
bArmature *newArm;
- if (arm->id.lib==0)
+ if (arm->id.lib==NULL)
return;
if (arm->id.us==1) {
- arm->id.lib= 0;
+ arm->id.lib= NULL;
arm->id.flag= LIB_LOCAL;
- new_id(0, (ID*)arm, 0);
+ new_id(NULL, (ID*)arm, NULL);
return;
}
if(local && lib==0) {
- arm->id.lib= 0;
+ arm->id.lib= NULL;
arm->id.flag= LIB_LOCAL;
- new_id(0, (ID *)arm, 0);
+ new_id(NULL, (ID *)arm, NULL);
}
else if(local && lib) {
newArm= copy_armature(arm);
@@ -158,7 +159,7 @@ void make_local_armature(bArmature *arm)
while(ob) {
if(ob->data==arm) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= newArm;
newArm->id.us++;
arm->id.us--;
@@ -248,20 +249,19 @@ Bone *get_named_bone (bArmature *arm, const char *name)
}
/* Finds the best possible extension to the name on a particular axis. (For renaming, check for unique names afterwards)
- * This assumes that bone names are at most 32 chars long!
* strip_number: removes number extensions (TODO: not used)
* axis: the axis to name on
* head/tail: the head/tail co-ordinate of the bone on the specified axis
*/
-int bone_autoside_name (char *name, int strip_number, short axis, float head, float tail)
+int bone_autoside_name (char name[MAXBONENAME], int UNUSED(strip_number), short axis, float head, float tail)
{
unsigned int len;
- char basename[32]={""};
- char extension[5]={""};
+ char basename[MAXBONENAME]= "";
+ char extension[5]= "";
len= strlen(name);
if (len == 0) return 0;
- strcpy(basename, name);
+ BLI_strncpy(basename, name, sizeof(basename));
/* Figure out extension to append:
* - The extension to append is based upon the axis that we are working on.
@@ -350,13 +350,13 @@ int bone_autoside_name (char *name, int strip_number, short axis, float head, fl
}
}
}
-
- if ((32 - len) < strlen(extension) + 1) { /* add 1 for the '.' */
+
+ if ((MAXBONENAME - len) < strlen(extension) + 1) { /* add 1 for the '.' */
strncpy(name, basename, len-strlen(extension));
}
-
- sprintf(name, "%s.%s", basename, extension);
-
+
+ BLI_snprintf(name, MAXBONENAME, "%s.%s", basename, extension);
+
return 1;
}
@@ -578,23 +578,29 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
/* ************ Armature Deform ******************* */
-static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
+typedef struct bPoseChanDeform {
+ Mat4 *b_bone_mats;
+ DualQuat *dual_quat;
+ DualQuat *b_bone_dual_quats;
+} bPoseChanDeform;
+
+static void pchan_b_bone_defmats(bPoseChannel *pchan, bPoseChanDeform *pdef_info, int use_quaternion)
{
Bone *bone= pchan->bone;
Mat4 *b_bone= b_bone_spline_setup(pchan, 0);
Mat4 *b_bone_rest= b_bone_spline_setup(pchan, 1);
Mat4 *b_bone_mats;
DualQuat *b_bone_dual_quats= NULL;
- float tmat[4][4];
+ float tmat[4][4]= MAT4_UNITY;
int a;
/* allocate b_bone matrices and dual quats */
b_bone_mats= MEM_mallocN((1+bone->segments)*sizeof(Mat4), "BBone defmats");
- pchan->b_bone_mats= b_bone_mats;
+ pdef_info->b_bone_mats= b_bone_mats;
if(use_quaternion) {
b_bone_dual_quats= MEM_mallocN((bone->segments)*sizeof(DualQuat), "BBone dqs");
- pchan->b_bone_dual_quats= b_bone_dual_quats;
+ pdef_info->b_bone_dual_quats= b_bone_dual_quats;
}
/* first matrix is the inverse arm_mat, to bring points in local bone space
@@ -606,7 +612,6 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
- translate over the curve to the bbone mat space
- transform with b_bone matrix
- transform back into global space */
- unit_m4(tmat);
for(a=0; a<bone->segments; a++) {
invert_m4_m4(tmat, b_bone_rest[a].mat);
@@ -619,9 +624,9 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion)
}
}
-static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *co, DualQuat *dq, float defmat[][3])
+static void b_bone_deform(bPoseChanDeform *pdef_info, Bone *bone, float *co, DualQuat *dq, float defmat[][3])
{
- Mat4 *b_bone= pchan->b_bone_mats;
+ Mat4 *b_bone= pdef_info->b_bone_mats;
float (*mat)[4]= b_bone[0].mat;
float segment, y;
int a;
@@ -638,7 +643,7 @@ static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *co, DualQuat *
CLAMP(a, 0, bone->segments-1);
if(dq) {
- copy_dq_dq(dq, &((DualQuat*)pchan->b_bone_dual_quats)[a]);
+ copy_dq_dq(dq, &(pdef_info->b_bone_dual_quats)[a]);
}
else {
mul_m4_v3(b_bone[a+1].mat, co);
@@ -712,7 +717,7 @@ static void pchan_deform_mat_add(bPoseChannel *pchan, float weight, float bbonem
add_m3_m3m3(mat, mat, wmat);
}
-static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, float mat[][3], float *co)
+static float dist_bone_deform(bPoseChannel *pchan, bPoseChanDeform *pdef_info, float *vec, DualQuat *dq, float mat[][3], float *co)
{
Bone *bone= pchan->bone;
float fac, contrib=0.0;
@@ -733,7 +738,7 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
if(vec) {
if(bone->segments>1)
// applies on cop and bbonemat
- b_bone_deform(pchan, bone, cop, NULL, (mat)?bbonemat:NULL);
+ b_bone_deform(pdef_info, bone, cop, NULL, (mat)?bbonemat:NULL);
else
mul_m4_v3(pchan->chan_mat, cop);
@@ -746,11 +751,11 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
}
else {
if(bone->segments>1) {
- b_bone_deform(pchan, bone, cop, &bbonedq, NULL);
+ b_bone_deform(pdef_info, bone, cop, &bbonedq, NULL);
add_weighted_dq_dq(dq, &bbonedq, fac);
}
else
- add_weighted_dq_dq(dq, pchan->dual_quat, fac);
+ add_weighted_dq_dq(dq, pdef_info->dual_quat, fac);
}
}
}
@@ -758,7 +763,7 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, flo
return contrib;
}
-static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, DualQuat *dq, float mat[][3], float *co, float *contrib)
+static void pchan_bone_deform(bPoseChannel *pchan, bPoseChanDeform *pdef_info, float weight, float *vec, DualQuat *dq, float mat[][3], float *co, float *contrib)
{
float cop[3], bbonemat[3][3];
DualQuat bbonedq;
@@ -771,7 +776,7 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua
if(vec) {
if(pchan->bone->segments>1)
// applies on cop and bbonemat
- b_bone_deform(pchan, pchan->bone, cop, NULL, (mat)?bbonemat:NULL);
+ b_bone_deform(pdef_info, pchan->bone, cop, NULL, (mat)?bbonemat:NULL);
else
mul_m4_v3(pchan->chan_mat, cop);
@@ -784,11 +789,11 @@ static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, Dua
}
else {
if(pchan->bone->segments>1) {
- b_bone_deform(pchan, pchan->bone, cop, &bbonedq, NULL);
+ b_bone_deform(pdef_info, pchan->bone, cop, &bbonedq, NULL);
add_weighted_dq_dq(dq, &bbonedq, weight);
}
else
- add_weighted_dq_dq(dq, pchan->dual_quat, weight);
+ add_weighted_dq_dq(dq, pdef_info->dual_quat, weight);
}
(*contrib)+=weight;
@@ -799,15 +804,18 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
int numVerts, int deformflag,
float (*prevCos)[3], const char *defgrp_name)
{
+ bPoseChanDeform *pdef_info_array;
+ bPoseChanDeform *pdef_info= NULL;
bArmature *arm= armOb->data;
bPoseChannel *pchan, **defnrToPC = NULL;
+ int *defnrToPCIndex= NULL;
MDeformVert *dverts = NULL;
bDeformGroup *dg;
DualQuat *dualquats= NULL;
float obinv[4][4], premat[4][4], postmat[4][4];
- int use_envelope = deformflag & ARM_DEF_ENVELOPE;
- int use_quaternion = deformflag & ARM_DEF_QUATERNION;
- int invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
+ const short use_envelope = deformflag & ARM_DEF_ENVELOPE;
+ const short use_quaternion = deformflag & ARM_DEF_QUATERNION;
+ const short invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
int numGroups = 0; /* safety for vertexgroup index overflow */
int i, target_totvert = 0; /* safety for vertexgroup overflow */
int use_dverts = 0;
@@ -824,20 +832,24 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
/* bone defmats are already in the channels, chan_mat */
/* initialize B_bone matrices and dual quaternions */
+ totchan= BLI_countlist(&armOb->pose->chanbase);
+
if(use_quaternion) {
- totchan= BLI_countlist(&armOb->pose->chanbase);
dualquats= MEM_callocN(sizeof(DualQuat)*totchan, "dualquats");
}
+
+ pdef_info_array= MEM_callocN(sizeof(bPoseChanDeform)*totchan, "bPoseChanDeform");
totchan= 0;
- for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
+ pdef_info= pdef_info_array;
+ for(pchan= armOb->pose->chanbase.first; pchan; pchan= pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM)) {
if(pchan->bone->segments > 1)
- pchan_b_bone_defmats(pchan, use_quaternion);
+ pchan_b_bone_defmats(pchan, pdef_info, use_quaternion);
if(use_quaternion) {
- pchan->dual_quat= &dualquats[totchan++];
- mat4_to_dquat( pchan->dual_quat,pchan->bone->arm_mat, pchan->chan_mat);
+ pdef_info->dual_quat= &dualquats[totchan++];
+ mat4_to_dquat( pdef_info->dual_quat,pchan->bone->arm_mat, pchan->chan_mat);
}
}
}
@@ -873,15 +885,19 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
else if(dverts) use_dverts = 1;
if(use_dverts) {
- defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups,
- "defnrToBone");
+ defnrToPC = MEM_callocN(sizeof(*defnrToPC) * numGroups, "defnrToBone");
+ defnrToPCIndex = MEM_callocN(sizeof(*defnrToPCIndex) * numGroups, "defnrToIndex");
for(i = 0, dg = target->defbase.first; dg;
i++, dg = dg->next) {
defnrToPC[i] = get_pose_channel(armOb->pose, dg->name);
/* exclude non-deforming bones */
if(defnrToPC[i]) {
- if(defnrToPC[i]->bone->flag & BONE_NO_DEFORM)
+ if(defnrToPC[i]->bone->flag & BONE_NO_DEFORM) {
defnrToPC[i]= NULL;
+ }
+ else {
+ defnrToPCIndex[i]= BLI_findindex(&armOb->pose->chanbase, defnrToPC[i]);
+ }
}
}
}
@@ -921,19 +937,15 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
dvert = NULL;
if(armature_def_nr >= 0 && dvert) {
- armature_weight = 0.0f; /* a def group was given, so default to 0 */
- for(j = 0; j < dvert->totweight; j++) {
- if(dvert->dw[j].def_nr == armature_def_nr) {
- armature_weight = dvert->dw[j].weight;
- break;
- }
+ armature_weight= defvert_find_weight(dvert, armature_def_nr);
+
+ if(invert_vgroup) {
+ armature_weight= 1.0f-armature_weight;
}
+
/* hackish: the blending factor can be used for blending with prevCos too */
if(prevCos) {
- if(invert_vgroup)
- prevco_weight= 1.0f-armature_weight;
- else
- prevco_weight= armature_weight;
+ prevco_weight= armature_weight;
armature_weight= 1.0f;
}
}
@@ -952,10 +964,10 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(j = 0; j < dvert->totweight; j++){
int index = dvert->dw[j].def_nr;
- pchan = index < numGroups?defnrToPC[index]:NULL;
- if(pchan) {
+ if(index < numGroups && (pchan= defnrToPC[index])) {
float weight = dvert->dw[j].weight;
- Bone *bone = pchan->bone;
+ Bone *bone= pchan->bone;
+ pdef_info= pdef_info_array + defnrToPCIndex[index];
deformed = 1;
@@ -966,25 +978,27 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
bone->rad_tail,
bone->dist);
}
- pchan_bone_deform(pchan, weight, vec, dq, smat, co, &contrib);
+ pchan_bone_deform(pchan, pdef_info, weight, vec, dq, smat, co, &contrib);
}
}
/* if there are vertexgroups but not groups with bones
* (like for softbody groups)
*/
if(deformed == 0 && use_envelope) {
- for(pchan = armOb->pose->chanbase.first; pchan;
- pchan = pchan->next) {
+ pdef_info= pdef_info_array;
+ for(pchan= armOb->pose->chanbase.first; pchan;
+ pchan= pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, dq, smat, co);
+ contrib += dist_bone_deform(pchan, pdef_info, vec, dq, smat, co);
}
}
}
else if(use_envelope) {
+ pdef_info= pdef_info_array;
for(pchan = armOb->pose->chanbase.first; pchan;
- pchan = pchan->next) {
+ pchan = pchan->next, pdef_info++) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, dq, smat, co);
+ contrib += dist_bone_deform(pchan, pdef_info, vec, dq, smat, co);
}
}
@@ -1040,25 +1054,25 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
if(dualquats) MEM_freeN(dualquats);
if(defnrToPC) MEM_freeN(defnrToPC);
-
+ if(defnrToPCIndex) MEM_freeN(defnrToPCIndex);
+
/* free B_bone matrices */
- for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
- if(pchan->b_bone_mats) {
- MEM_freeN(pchan->b_bone_mats);
- pchan->b_bone_mats = NULL;
+ pdef_info= pdef_info_array;
+ for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next, pdef_info++) {
+ if(pdef_info->b_bone_mats) {
+ MEM_freeN(pdef_info->b_bone_mats);
}
- if(pchan->b_bone_dual_quats) {
- MEM_freeN(pchan->b_bone_dual_quats);
- pchan->b_bone_dual_quats = NULL;
+ if(pdef_info->b_bone_dual_quats) {
+ MEM_freeN(pdef_info->b_bone_dual_quats);
}
-
- pchan->dual_quat = NULL;
}
+
+ MEM_freeN(pdef_info_array);
}
/* ************ END Armature Deform ******************* */
-void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed)
+void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int UNUSED(root), int UNUSED(posed))
{
copy_m4_m4(M_accumulatedMatrix, bone->arm_mat);
}
@@ -1086,11 +1100,10 @@ void armature_mat_world_to_pose(Object *ob, float inmat[][4], float outmat[][4])
*/
void armature_loc_world_to_pose(Object *ob, float *inloc, float *outloc)
{
- float xLocMat[4][4];
+ float xLocMat[4][4]= MAT4_UNITY;
float nLocMat[4][4];
/* build matrix for location */
- unit_m4(xLocMat);
VECCOPY(xLocMat[3], inloc);
/* get bone-space cursor matrix and extract location */
@@ -1106,22 +1119,50 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
{
float pc_trans[4][4], inv_trans[4][4];
float pc_posemat[4][4], inv_posemat[4][4];
-
+ float pose_mat[4][4];
+
/* paranoia: prevent crashes with no pose-channel supplied */
if (pchan==NULL) return;
-
- /* get the inverse matrix of the pchan's transforms */
- if (pchan->rotmode)
- loc_eul_size_to_mat4(pc_trans, pchan->loc, pchan->eul, pchan->size);
- else
- loc_quat_size_to_mat4(pc_trans, pchan->loc, pchan->quat, pchan->size);
+
+ /* default flag */
+ if((pchan->bone->flag & BONE_NO_LOCAL_LOCATION)==0) {
+ /* get the inverse matrix of the pchan's transforms */
+ switch(pchan->rotmode) {
+ case ROT_MODE_QUAT:
+ loc_quat_size_to_mat4(pc_trans, pchan->loc, pchan->quat, pchan->size);
+ break;
+ case ROT_MODE_AXISANGLE:
+ loc_axisangle_size_to_mat4(pc_trans, pchan->loc, pchan->rotAxis, pchan->rotAngle, pchan->size);
+ break;
+ default: /* euler */
+ loc_eul_size_to_mat4(pc_trans, pchan->loc, pchan->eul, pchan->size);
+ }
+
+ copy_m4_m4(pose_mat, pchan->pose_mat);
+ }
+ else {
+ /* local location, this is not default, different calculation
+ * note: only tested for location with pose bone snapping.
+ * If this is not useful in other cases the BONE_NO_LOCAL_LOCATION
+ * case may have to be split into its own function. */
+ unit_m4(pc_trans);
+ copy_v3_v3(pc_trans[3], pchan->loc);
+
+ /* use parents rotation/scale space + own absolute position */
+ if(pchan->parent) copy_m4_m4(pose_mat, pchan->parent->pose_mat);
+ else unit_m4(pose_mat);
+
+ copy_v3_v3(pose_mat[3], pchan->pose_mat[3]);
+ }
+
+
invert_m4_m4(inv_trans, pc_trans);
/* Remove the pchan's transforms from it's pose_mat.
* This should leave behind the effects of restpose +
* parenting + constraints
*/
- mul_m4_m4m4(pc_posemat, inv_trans, pchan->pose_mat);
+ mul_m4_m4m4(pc_posemat, inv_trans, pose_mat);
/* get the inverse of the leftovers so that we can remove
* that component from the supplied matrix
@@ -1138,11 +1179,10 @@ void armature_mat_pose_to_bone(bPoseChannel *pchan, float inmat[][4], float outm
*/
void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
{
- float xLocMat[4][4];
+ float xLocMat[4][4]= MAT4_UNITY;
float nLocMat[4][4];
/* build matrix for location */
- unit_m4(xLocMat);
VECCOPY(xLocMat[3], inloc);
/* get bone-space cursor matrix and extract location */
@@ -1150,32 +1190,30 @@ void armature_loc_pose_to_bone(bPoseChannel *pchan, float *inloc, float *outloc)
VECCOPY(outloc, nLocMat[3]);
}
+/* same as object_mat3_to_rot() */
+void pchan_mat3_to_rot(bPoseChannel *pchan, float mat[][3], short use_compat)
+{
+ switch(pchan->rotmode) {
+ case ROT_MODE_QUAT:
+ mat3_to_quat(pchan->quat, mat);
+ break;
+ case ROT_MODE_AXISANGLE:
+ mat3_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, mat);
+ break;
+ default: /* euler */
+ if(use_compat) mat3_to_compatible_eulO(pchan->eul, pchan->eul, pchan->rotmode, mat);
+ else mat3_to_eulO(pchan->eul, pchan->rotmode, mat);
+ }
+}
/* Apply a 4x4 matrix to the pose bone,
* similar to object_apply_mat4()
*/
-void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4])
+void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4], short use_compat)
{
- /* location */
- copy_v3_v3(pchan->loc, mat[3]);
-
- /* scale */
- mat4_to_size(pchan->size, mat);
-
- /* rotation */
- if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- float tmp_quat[4];
-
- /* need to convert to quat first (in temp var)... */
- mat4_to_quat(tmp_quat, mat);
- quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, tmp_quat);
- }
- else if (pchan->rotmode == ROT_MODE_QUAT) {
- mat4_to_quat(pchan->quat, mat);
- }
- else {
- mat4_to_eulO(pchan->eul, pchan->rotmode, mat);
- }
+ float rot[3][3];
+ mat4_to_loc_rot_size(pchan->loc, rot, pchan->size, mat);
+ pchan_mat3_to_rot(pchan, rot, use_compat);
}
/* Remove rest-position effects from pose-transform for obtaining
@@ -1207,6 +1245,7 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa
}
else if (oldMode == ROT_MODE_QUAT) {
/* quat to euler */
+ normalize_qt(quat);
quat_to_eulO( eul, newMode,quat);
}
/* else { no conversion needed } */
@@ -1229,6 +1268,7 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa
}
else if (oldMode == ROT_MODE_QUAT) {
/* quat to axis angle */
+ normalize_qt(quat);
quat_to_axis_angle( axis, angle,quat);
}
@@ -1290,7 +1330,9 @@ void vec_roll_to_mat3(float *vec, float roll, float mat[][3])
/* Find Axis & Amount for bone matrix*/
cross_v3_v3v3(axis,target,nor);
- if (dot_v3v3(axis,axis) > 0.0000000000001) {
+ /* was 0.0000000000001, caused bug [#23954], smaller values give unstable
+ * roll when toggling editmode */
+ if (dot_v3v3(axis,axis) > 0.00001) {
/* if nor is *not* a multiple of target ... */
normalize_v3(axis);
@@ -1359,13 +1401,6 @@ void where_is_armature_bone(Bone *bone, Bone *prevbone)
VECCOPY(bone->arm_mat[3], bone->head);
}
- /* head */
- VECCOPY(bone->arm_head, bone->arm_mat[3]);
- /* tail is in current local coord system */
- VECCOPY(vec, bone->arm_mat[1]);
- mul_v3_fl(vec, bone->length);
- add_v3_v3v3(bone->arm_tail, bone->arm_head, vec);
-
/* and the kiddies */
prevbone= bone;
for(bone= bone->childbase.first; bone; bone= bone->next) {
@@ -1410,10 +1445,6 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
if(error)
return;
- /* exception, armature local layer should be proxied too */
- if (pose->proxy_layer)
- ((bArmature *)ob->data)->layer= pose->proxy_layer;
-
/* clear all transformation values from library */
rest_pose(frompose);
@@ -1459,7 +1490,7 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
*/
extract_proxylocal_constraints(&proxylocal_constraints, &pchan->constraints);
copy_constraints(&pchanw.constraints, &pchanp->constraints, FALSE);
- addlisttolist(&pchanw.constraints, &proxylocal_constraints);
+ BLI_movelisttolist(&pchanw.constraints, &proxylocal_constraints);
/* constraints - set target ob pointer to own object */
for (con= pchanw.constraints.first; con; con= con->next) {
@@ -1615,7 +1646,7 @@ typedef struct tSplineIK_Tree {
/* ----------- */
/* Tag the bones in the chain formed by the given bone for IK */
-static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel *pchan_tip)
+static void splineik_init_tree_from_pchan(Scene *scene, Object *UNUSED(ob), bPoseChannel *pchan_tip)
{
bPoseChannel *pchan, *pchanRoot=NULL;
bPoseChannel *pchanChain[255];
@@ -1688,28 +1719,25 @@ static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel
ikData->numpoints= ikData->chainlen+1;
ikData->points= MEM_callocN(sizeof(float)*ikData->numpoints, "Spline IK Binding");
+ /* bind 'tip' of chain (i.e. first joint = tip of bone with the Spline IK Constraint) */
+ ikData->points[0] = 1.0f;
+
/* perform binding of the joints to parametric positions along the curve based
* proportion of the total length that each bone occupies
*/
for (i = 0; i < segcount; i++) {
- if (i != 0) {
- /* 'head' joints
- * - 2 methods; the one chosen depends on whether we've got usable lengths
- */
- if ((ikData->flag & CONSTRAINT_SPLINEIK_EVENSPLITS) || (totLength == 0.0f)) {
- /* 1) equi-spaced joints */
- ikData->points[i]= ikData->points[i-1] - segmentLen;
- }
- else {
- /* 2) to find this point on the curve, we take a step from the previous joint
- * a distance given by the proportion that this bone takes
- */
- ikData->points[i]= ikData->points[i-1] - (boneLengths[i] / totLength);
- }
+ /* 'head' joints, travelling towards the root of the chain
+ * - 2 methods; the one chosen depends on whether we've got usable lengths
+ */
+ if ((ikData->flag & CONSTRAINT_SPLINEIK_EVENSPLITS) || (totLength == 0.0f)) {
+ /* 1) equi-spaced joints */
+ ikData->points[i+1]= ikData->points[i] - segmentLen;
}
else {
- /* 'tip' of chain, special exception for the first joint */
- ikData->points[0]= 1.0f;
+ /* 2) to find this point on the curve, we take a step from the previous joint
+ * a distance given by the proportion that this bone takes
+ */
+ ikData->points[i+1]= ikData->points[i] - (boneLengths[i] / totLength);
}
}
@@ -1784,7 +1812,7 @@ static void splineik_init_tree_from_pchan(Scene *scene, Object *ob, bPoseChannel
}
/* Tag which bones are members of Spline IK chains */
-static void splineik_init_tree(Scene *scene, Object *ob, float ctime)
+static void splineik_init_tree(Scene *scene, Object *ob, float UNUSED(ctime))
{
bPoseChannel *pchan;
@@ -1989,7 +2017,9 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
/* finally, store the new transform */
copy_m4_m4(pchan->pose_mat, poseMat);
VECCOPY(pchan->pose_head, poseHead);
- VECCOPY(pchan->pose_tail, poseTail);
+
+ /* recalculate tail, as it's now outdated after the head gets adjusted above! */
+ where_is_pose_bone_tail(pchan);
/* done! */
pchan->flag |= POSE_DONE;
@@ -2054,8 +2084,7 @@ void pchan_to_mat4(bPoseChannel *pchan, float chan_mat[4][4])
* but if this proves to be too problematic, switch back to the old system of operating directly on
* the stored copy
*/
- QUATCOPY(quat, pchan->quat);
- normalize_qt(quat);
+ normalize_qt_qt(quat, pchan->quat);
quat_to_mat3(rmat, quat);
}
@@ -2072,7 +2101,7 @@ void pchan_to_mat4(bPoseChannel *pchan, float chan_mat[4][4])
/* loc/rot/size to mat4 */
/* used in constraint.c too */
-void chan_calc_mat(bPoseChannel *pchan)
+void pchan_calc_mat(bPoseChannel *pchan)
{
/* this is just a wrapper around the copy of this function which calculates the matrix
* and stores the result in any given channel
@@ -2202,6 +2231,15 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha
}
}
+/* calculate tail of posechannel */
+void where_is_pose_bone_tail(bPoseChannel *pchan)
+{
+ float vec[3];
+
+ VECCOPY(vec, pchan->pose_mat[1]);
+ mul_v3_fl(vec, pchan->bone->length);
+ add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+}
/* The main armature solver, does all constraints excluding IK */
/* pchan is validated, as having bone and parent pointer
@@ -2219,7 +2257,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
parchan= pchan->parent;
/* this gives a chan_mat with actions (ipos) results */
- if(do_extra) chan_calc_mat(pchan);
+ if(do_extra) pchan_calc_mat(pchan);
else unit_m4(pchan->chan_mat);
/* construct the posemat based on PoseChannels, that we do before applying constraints */
@@ -2238,13 +2276,28 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
offs_bone[3][1]+= parbone->length;
/* Compose the matrix for this bone */
- if(bone->flag & BONE_HINGE) { // uses restposition rotation, but actual position
+ if((bone->flag & BONE_HINGE) && (bone->flag & BONE_NO_SCALE)) { // uses restposition rotation, but actual position
float tmat[4][4];
-
/* the rotation of the parent restposition */
copy_m4_m4(tmat, parbone->arm_mat);
mul_serie_m4(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
+ else if(bone->flag & BONE_HINGE) { // same as above but apply parent scale
+ float tmat[4][4];
+
+ /* apply the parent matrix scale */
+ float tsmat[4][4], tscale[3];
+
+ /* the rotation of the parent restposition */
+ copy_m4_m4(tmat, parbone->arm_mat);
+
+ /* extract the scale of the parent matrix */
+ mat4_to_size(tscale, parchan->pose_mat);
+ size_to_mat4(tsmat, tscale);
+ mul_m4_m4m4(tmat, tmat, tsmat);
+
+ mul_serie_m4(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+ }
else if(bone->flag & BONE_NO_SCALE) {
float orthmat[4][4];
@@ -2320,9 +2373,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti
/* calculate head */
VECCOPY(pchan->pose_head, pchan->pose_mat[3]);
/* calculate tail */
- VECCOPY(vec, pchan->pose_mat[1]);
- mul_v3_fl(vec, bone->length);
- add_v3_v3v3(pchan->pose_tail, pchan->pose_head, vec);
+ where_is_pose_bone_tail(pchan);
}
/* This only reads anim data from channels, and writes to channels */
@@ -2340,7 +2391,7 @@ void where_is_pose (Scene *scene, Object *ob)
if(ELEM(NULL, arm, scene)) return;
if((ob->pose==NULL) || (ob->pose->flag & POSE_RECALC))
- armature_rebuild_pose(ob, arm);
+ armature_rebuild_pose(ob, arm);
ctime= bsystem_time(scene, ob, (float)scene->r.cfra, 0.0); /* not accurate... */
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 0f2218b8766..0556acbdece 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -32,7 +32,6 @@
#ifndef _WIN32
#include <unistd.h> // for read close
- #include <sys/param.h> // for MAXPATHLEN
#else
#include <io.h> // for open close read
#define open _open
@@ -56,8 +55,10 @@
#include "DNA_sound_types.h"
#include "BLI_blenlib.h"
+#include "BLI_bpath.h"
#include "BLI_dynstr.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
@@ -81,16 +82,16 @@
#include "BLO_readfile.h"
#include "BLO_writefile.h"
-#include "BKE_utildefines.h" // O_BINARY FALSE
+#include "BKE_utildefines.h"
#include "WM_api.h" // XXXXX BAD, very BAD dependency (bad level call) - remove asap, elubie
Global G;
UserDef U;
-ListBase WMlist= {NULL, NULL};
+/* ListBase = {NULL, NULL}; */
short ENDIAN_ORDER;
-char versionstr[48]= "";
+static char versionstr[48]= "";
/* ********** free ********** */
@@ -123,9 +124,9 @@ void initglobals(void)
ENDIAN_ORDER= (((char*)&ENDIAN_ORDER)[0])? L_ENDIAN: B_ENDIAN;
if(BLENDER_SUBVERSION)
- sprintf(versionstr, "www.blender.org %d.%d", BLENDER_VERSION, BLENDER_SUBVERSION);
+ BLI_snprintf(versionstr, sizeof(versionstr), "www.blender.org %d.%d", BLENDER_VERSION, BLENDER_SUBVERSION);
else
- sprintf(versionstr, "www.blender.org %d", BLENDER_VERSION);
+ BLI_snprintf(versionstr, sizeof(versionstr), "www.blender.org %d", BLENDER_VERSION);
#ifdef _WIN32 // FULLSCREEN
G.windowstate = G_WINDOWSTATE_USERDEF;
@@ -155,50 +156,33 @@ static void clear_global(void)
/* make sure path names are correct for OS */
static void clean_paths(Main *main)
{
- Image *image= main->image.first;
- bSound *sound= main->sound.first;
- Scene *scene= main->scene.first;
- Editing *ed;
- Sequence *seq;
- Strip *strip;
-
- while(image) {
- BLI_clean(image->name);
- image= image->id.next;
- }
-
- while(sound) {
- BLI_clean(sound->name);
- sound= sound->id.next;
- }
-
- while(scene) {
- ed= seq_give_editing(scene, 0);
- if(ed) {
- seq= ed->seqbasep->first;
- while(seq) {
- if(seq->plugin) {
- BLI_clean(seq->plugin->name);
- }
- strip= seq->strip;
- while(strip) {
- BLI_clean(strip->dir);
- strip= strip->next;
- }
- seq= seq->next;
- }
- }
+ struct BPathIterator *bpi;
+ char filepath_expanded[1024];
+ Scene *scene;
+
+ for(BLI_bpathIterator_init(&bpi, main, main->name, BPATH_USE_PACKED); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath_expanded);
+
+ BLI_clean(filepath_expanded);
+
+ BLI_bpathIterator_setPath(bpi, filepath_expanded);
+ }
+
+ BLI_bpathIterator_free(bpi);
+
+ for(scene= main->scene.first; scene; scene= scene->id.next) {
BLI_clean(scene->r.backbuf);
BLI_clean(scene->r.pic);
-
- scene= scene->id.next;
}
}
/* context matching */
/* handle no-ui case */
-static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
+/* note, this is called on Undo so any slow conversion functions here
+ * should be avoided or check (mode!='u') */
+
+static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filename)
{
bScreen *curscreen= NULL;
Scene *curscene= NULL;
@@ -211,9 +195,12 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
else mode= 0;
recover= (G.fileflags & G_FILE_RECOVER);
-
- clean_paths(bfd->main);
-
+
+ /* Only make filepaths compatible when loading for real (not undo) */
+ if(mode != 'u') {
+ clean_paths(bfd->main);
+ }
+
/* XXX here the complex windowmanager matching */
/* no load screens? */
@@ -238,6 +225,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
}
/* free G.main Main database */
+// CTX_wm_manager_set(C, NULL);
clear_global();
G.main= bfd->main;
@@ -262,7 +250,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
G.winpos= bfd->winpos;
G.displaymode= bfd->displaymode;
G.fileflags= bfd->fileflags;
-
+ CTX_wm_manager_set(C, bfd->main->wm.first);
CTX_wm_screen_set(C, bfd->curscreen);
CTX_data_scene_set(C, bfd->curscreen->scene);
CTX_wm_area_set(C, NULL);
@@ -309,10 +297,8 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
#endif
/* these are the same at times, should never copy to the same location */
- if(G.sce != filename)
- BLI_strncpy(G.sce, filename, FILE_MAX);
-
- BLI_strncpy(G.main->name, filename, FILE_MAX); /* is guaranteed current file */
+ if(G.main->name != filename)
+ BLI_strncpy(G.main->name, filename, FILE_MAX);
/* baseflags, groups, make depsgraph, etc */
set_scene_bg(G.main, CTX_data_scene(C));
@@ -328,7 +314,7 @@ static int handle_subversion_warning(Main *main)
char str[128];
- sprintf(str, "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
+ BLI_snprintf(str, sizeof(str), "File written by newer Blender binary: %d.%d , expect loss of data!", main->minversionfile, main->minsubversionfile);
// XXX error(str);
}
return 1;
@@ -359,18 +345,12 @@ void BKE_userdef_free(void)
BLI_freelistN(&U.addons);
}
-/* returns:
- 0: no load file
- 1: OK
- 2: OK, and with new user settings
-*/
-
-int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports)
+int BKE_read_file(bContext *C, const char *dir, ReportList *reports)
{
BlendFileData *bfd;
int retval= 1;
- if(strstr(dir, BLENDER_STARTUP_FILE)==0) /* dont print user-pref loading */
+ if(strstr(dir, BLENDER_STARTUP_FILE)==NULL) /* dont print user-pref loading */
printf("read blend: %s\n", dir);
bfd= BLO_read_from_file(dir, reports);
@@ -392,7 +372,7 @@ int BKE_read_file(bContext *C, char *dir, void *unused, ReportList *reports)
return (bfd?retval:0);
}
-int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, void *unused, ReportList *reports)
+int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, ReportList *reports)
{
BlendFileData *bfd;
@@ -410,7 +390,7 @@ int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *report
{
BlendFileData *bfd;
- bfd= BLO_read_from_memfile(CTX_data_main(C), G.sce, memfile, reports);
+ bfd= BLO_read_from_memfile(CTX_data_main(C), G.main->name, memfile, reports);
if (bfd)
setup_app_data(C, bfd, "<memory1>");
else
@@ -460,37 +440,38 @@ static UndoElem *curundo= NULL;
static int read_undosave(bContext *C, UndoElem *uel)
{
- char scestr[FILE_MAXDIR+FILE_MAXFILE]; /* we should eventually just use G.main->name */
- char mainstr[FILE_MAXDIR+FILE_MAXFILE];
+ char mainstr[sizeof(G.main->name)];
int success=0, fileflags;
/* This is needed so undoing/redoing doesnt crash with threaded previews going */
WM_jobs_stop_all(CTX_wm_manager(C));
-
- strcpy(scestr, G.sce); /* temporal store */
+
+ BLI_strncpy(mainstr, G.main->name, sizeof(mainstr)); /* temporal store */
+
strcpy(mainstr, G.main->name); /* temporal store */
fileflags= G.fileflags;
G.fileflags |= G_FILE_NO_UI;
if(UNDO_DISK)
- success= BKE_read_file(C, uel->str, NULL, NULL);
+ success= (BKE_read_file(C, uel->str, NULL) != BKE_READ_FILE_FAIL);
else
success= BKE_read_file_from_memfile(C, &uel->memfile, NULL);
/* restore */
- strcpy(G.sce, scestr); /* restore */
- strcpy(G.main->name, mainstr); /* restore */
+ BLI_strncpy(G.main->name, mainstr, sizeof(G.main->name)); /* restore */
G.fileflags= fileflags;
- if(success)
- DAG_on_load_update(G.main);
+ if(success) {
+ /* important not to update time here, else non keyed tranforms are lost */
+ DAG_on_load_update(G.main, FALSE);
+ }
return success;
}
/* name can be a dynamic string */
-void BKE_write_undo(bContext *C, char *name)
+void BKE_write_undo(bContext *C, const char *name)
{
uintptr_t maxmem, totmem, memused;
int nr, success;
@@ -541,12 +522,12 @@ void BKE_write_undo(bContext *C, char *name)
counter++;
counter= counter % U.undosteps;
- sprintf(numstr, "%d.blend", counter);
+ BLI_snprintf(numstr, sizeof(numstr), "%d.blend", counter);
BLI_make_file_string("/", tstr, btempdir, numstr);
success= BLO_write_file(CTX_data_main(C), tstr, G.fileflags, NULL, NULL);
- strcpy(curundo->str, tstr);
+ BLI_strncpy(curundo->str, tstr, sizeof(curundo->str));
}
else {
MemFile *prevfile=NULL;
@@ -554,7 +535,7 @@ void BKE_write_undo(bContext *C, char *name)
if(curundo->prev) prevfile= &(curundo->prev->memfile);
memused= MEM_get_memory_in_use();
- success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags, NULL);
+ success= BLO_write_file_mem(CTX_data_main(C), prevfile, &curundo->memfile, G.fileflags);
curundo->undosize= MEM_get_memory_in_use() - memused;
}
@@ -657,6 +638,22 @@ void BKE_undo_name(bContext *C, const char *name)
}
}
+/* name optional */
+int BKE_undo_valid(const char *name)
+{
+ if(name) {
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev)
+ if(strcmp(name, uel->name)==0)
+ break;
+
+ return uel && uel->prev;
+ }
+
+ return undobase.last != undobase.first;
+}
+
char *BKE_undo_menu_string(void)
{
@@ -726,7 +723,7 @@ void BKE_undo_save(char *fname)
Main *BKE_undo_get_main(Scene **scene)
{
Main *mainp= NULL;
- BlendFileData *bfd= BLO_read_from_memfile(G.main, G.sce, &curundo->memfile, NULL);
+ BlendFileData *bfd= BLO_read_from_memfile(G.main, G.main->name, &curundo->memfile, NULL);
if(bfd) {
mainp= bfd->main;
diff --git a/source/blender/blenkernel/intern/bmesh_private.h b/source/blender/blenkernel/intern/bmesh_private.h
index 713194c9806..b14383378ab 100644
--- a/source/blender/blenkernel/intern/bmesh_private.h
+++ b/source/blender/blenkernel/intern/bmesh_private.h
@@ -1,4 +1,4 @@
-/**
+/*
* BME_private.h jan 2007
*
* low level, 'private' function prototypes for bmesh kernel.
diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c
index e2a6c04450b..1d4bdf8bf44 100644
--- a/source/blender/blenkernel/intern/bmfont.c
+++ b/source/blender/blenkernel/intern/bmfont.c
@@ -1,4 +1,4 @@
-/**
+/*
* bmfont.c
*
* 04-10-2000 frank
@@ -54,6 +54,7 @@
#include "BKE_global.h"
#include "IMB_imbuf_types.h"
+#include "BKE_bmfont.h"
#include "BKE_bmfont_types.h"
void printfGlyph(bmGlyph * glyph)
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index 54ffda6c0a9..ae4882b0eca 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -41,11 +41,13 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_kdtree.h"
+#include "BLI_utildefines.h"
+
#include "BKE_collision.h"
#include "BKE_effect.h"
#include "BKE_boids.h"
#include "BKE_particle.h"
-#include "BKE_utildefines.h"
+
#include "BKE_modifier.h"
#include "RNA_enum_types.h"
@@ -58,7 +60,7 @@ typedef struct BoidValues {
static int apply_boid_rule(BoidBrainData *bbd, BoidRule *rule, BoidValues *val, ParticleData *pa, float fuzziness);
-static int rule_none(BoidRule *rule, BoidBrainData *data, BoidValues *val, ParticleData *pa)
+static int rule_none(BoidRule *UNUSED(rule), BoidBrainData *UNUSED(data), BoidValues *UNUSED(val), ParticleData *UNUSED(pa))
{
return 0;
}
@@ -205,7 +207,9 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
add_v3_v3v3(col.co2, pa->prev_state.co, pa->prev_state.vel);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
mul_v3_fl(ray_dir, acbr->look_ahead);
- col.t = 0.0f;
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
@@ -240,6 +244,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
mul_v3_fl(bbd->wanted_co, (1.0f - t) * val->personal_space * pa->size);
bbd->wanted_speed = sqrt(t) * len_v3(pa->prev_state.vel);
+ bbd->wanted_speed = MAX2(bbd->wanted_speed, val->min_speed);
return 1;
}
@@ -343,7 +348,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
return ret;
}
-static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+static int rule_separate(BoidRule *UNUSED(rule), BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
{
KDTreeNearest *ptn = NULL;
ParticleTarget *pt;
@@ -383,7 +388,7 @@ static int rule_separate(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, Pa
}
return ret;
}
-static int rule_flock(BoidRule *rule, BoidBrainData *bbd, BoidValues *val, ParticleData *pa)
+static int rule_flock(BoidRule *UNUSED(rule), BoidBrainData *bbd, BoidValues *UNUSED(val), ParticleData *pa)
{
KDTreeNearest ptn[11];
float vec[3] = {0.0f, 0.0f, 0.0f}, loc[3] = {0.0f, 0.0f, 0.0f};
@@ -736,6 +741,7 @@ static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData *
val->jump_speed = 0.0f; /* no jumping in air */
}
}
+
static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *ground_co, float *ground_nor)
{
BoidParticle *bpa = pa->boid;
@@ -765,16 +771,17 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
if(!bbd->sim->colliders)
return NULL;
+ /* first try to find below boid */
copy_v3_v3(col.co1, pa->state.co);
- copy_v3_v3(col.co2, pa->state.co);
- add_v3_v3(col.co1, zvec);
+ sub_v3_v3v3(col.co2, pa->state.co, zvec);
sub_v3_v3(col.co2, zvec);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
- col.t = 0.0f;
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
- /* find out upmost deflector object */
for(coll = bbd->sim->colliders->first; coll; coll = coll->next){
col.ob = coll->ob;
col.md = coll->collmd;
@@ -789,17 +796,42 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
normalize_v3_v3(ground_nor, col.nor);
return col.hit_ob;
}
- else {
- /* default to z=0 */
- VECCOPY(ground_co, pa->state.co);
- ground_co[2] = 0;
- ground_nor[0] = ground_nor[1] = 0.0f;
- ground_nor[2] = 1.0f;
- return NULL;
+
+ /* couldn't find below, so find upmost deflector object */
+ add_v3_v3v3(col.co1, pa->state.co, zvec);
+ sub_v3_v3v3(col.co2, pa->state.co, zvec);
+ sub_v3_v3(col.co2, zvec);
+ sub_v3_v3v3(ray_dir, col.co2, col.co1);
+ col.f = 0.0f;
+ col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
+ col.dfra = bbd->dfra;
+ hit.index = -1;
+ hit.dist = col.ray_len = len_v3(ray_dir);
+
+ for(coll = bbd->sim->colliders->first; coll; coll = coll->next){
+ col.ob = coll->ob;
+ col.md = coll->collmd;
+
+ if(col.md && col.md->bvhtree)
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ }
+ /* then use that object */
+ if(hit.index>=0) {
+ t = hit.dist/col.ray_len;
+ interp_v3_v3v3(ground_co, col.co1, col.co2, t);
+ normalize_v3_v3(ground_nor, col.nor);
+ return col.hit_ob;
}
+
+ /* default to z=0 */
+ VECCOPY(ground_co, pa->state.co);
+ ground_co[2] = 0;
+ ground_nor[0] = ground_nor[1] = 0.0f;
+ ground_nor[2] = 1.0f;
+ return NULL;
}
}
-static int boid_rule_applies(ParticleData *pa, BoidSettings *boids, BoidRule *rule)
+static int boid_rule_applies(ParticleData *pa, BoidSettings *UNUSED(boids), BoidRule *rule)
{
BoidParticle *bpa = pa->boid;
@@ -1226,14 +1258,18 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
VECADDFAC(pa->state.vel, pa->state.vel, acc, dtime);
- if(bpa->data.mode != eBoidMode_InAir)
- bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
+ //if(bpa->data.mode != eBoidMode_InAir)
+ bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
/* change modes, constrain movement & keep track of down vector */
switch(bpa->data.mode) {
case eBoidMode_InAir:
{
- float grav[3] = {0.0f, 0.0f, bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f};
+ float grav[3];
+
+ grav[0]= 0.0f;
+ grav[1]= 0.0f;
+ grav[2]= bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f;
/* don't take forward acceleration into account (better banking) */
if(dot_v3v3(bpa->data.acc, pa->state.vel) > 0.0f) {
@@ -1255,17 +1291,29 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
boid_find_ground(bbd, pa, ground_co, ground_nor);
boid_climb(boids, pa, ground_co, ground_nor);
}
- /* land boid when belowg ground */
- else if(boids->options & BOID_ALLOW_LAND && pa->state.co[2] <= ground_co[2] + pa->size * boids->height) {
- pa->state.co[2] = ground_co[2] + pa->size * boids->height;
- pa->state.vel[2] = 0.0f;
- bpa->data.mode = eBoidMode_OnLand;
+ else if(pa->state.co[2] <= ground_co[2] + pa->size * boids->height) {
+ /* land boid when below ground */
+ if(boids->options & BOID_ALLOW_LAND) {
+ pa->state.co[2] = ground_co[2] + pa->size * boids->height;
+ pa->state.vel[2] = 0.0f;
+ bpa->data.mode = eBoidMode_OnLand;
+ }
+ /* fly above ground */
+ else {
+ pa->state.co[2] = ground_co[2] + pa->size * boids->height;
+ pa->state.vel[2] = 0.0f;
+ }
}
break;
}
case eBoidMode_Falling:
{
- float grav[3] = {0.0f, 0.0f, bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f};
+ float grav[3];
+
+ grav[0]= 0.0f;
+ grav[1]= 0.0f;
+ grav[2]= bbd->sim->scene->physics_settings.gravity[2] < 0.0f ? -1.0f : 0.0f;
+
/* gather apparent gravity */
VECADDFAC(bpa->gravity, bpa->gravity, grav, dtime);
@@ -1355,7 +1403,9 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
/* save direction to state.ave unless the boid is falling */
/* (boids can't effect their direction when falling) */
if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1*pa->size) {
- normalize_v3_v3(pa->state.ave, pa->state.vel);
+ copy_v3_v3(pa->state.ave, pa->state.vel);
+ pa->state.ave[2] *= bbd->part->boids->pitch;
+ normalize_v3(pa->state.ave);
}
/* apply damping */
@@ -1420,7 +1470,7 @@ BoidRule *boid_new_rule(int type)
rule->type = type;
rule->flag |= BOIDRULE_IN_AIR|BOIDRULE_ON_LAND;
- strcpy(rule->name, boidrule_type_items[type-1].name);
+ BLI_strncpy(rule->name, boidrule_type_items[type-1].name, sizeof(rule->name));
return rule;
}
@@ -1440,6 +1490,7 @@ void boid_default_settings(BoidSettings *boids)
boids->landing_smoothness = 3.0f;
boids->banking = 1.0f;
+ boids->pitch = 1.0f;
boids->height = 1.0f;
boids->health = 1.0f;
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 71a43994363..15404acc105 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,6 +45,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_brush.h"
#include "BKE_colortools.h"
@@ -67,7 +68,7 @@ static void brush_set_defaults(Brush *brush)
brush->blend = 0;
brush->flag = 0;
- brush->ob_mode = (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT);
+ brush->ob_mode = OB_MODE_ALL_PAINT;
/* BRUSH SCULPT TOOL SETTINGS */
brush->size= 35; /* radius of the brush in pixels */
@@ -147,6 +148,8 @@ Brush *copy_brush(Brush *brush)
if (brush->icon_imbuf)
brushn->icon_imbuf= IMB_dupImBuf(brush->icon_imbuf);
+ brushn->preview = NULL;
+
brushn->curve= curvemapping_copy(brush->curve);
/* enable fake user by default */
@@ -183,13 +186,13 @@ void make_local_brush(Brush *brush)
Scene *scene;
int local= 0, lib= 0;
- if(brush->id.lib==0) return;
+ if(brush->id.lib==NULL) return;
if(brush->clone.image) {
/* special case: ima always local immediately */
- brush->clone.image->id.lib= 0;
+ brush->clone.image->id.lib= NULL;
brush->clone.image->id.flag= LIB_LOCAL;
- new_id(0, (ID *)brush->clone.image, 0);
+ new_id(NULL, (ID *)brush->clone.image, NULL);
}
for(scene= G.main->scene.first; scene; scene=scene->id.next)
@@ -199,9 +202,9 @@ void make_local_brush(Brush *brush)
}
if(local && lib==0) {
- brush->id.lib= 0;
+ brush->id.lib= NULL;
brush->id.flag= LIB_LOCAL;
- new_id(0, (ID *)brush, 0);
+ new_id(NULL, (ID *)brush, NULL);
/* enable fake user by default */
if (!(brush->id.flag & LIB_FAKEUSER)) {
@@ -216,7 +219,7 @@ void make_local_brush(Brush *brush)
for(scene= G.main->scene.first; scene; scene=scene->id.next)
if(paint_brush(&scene->toolsettings->imapaint.paint)==brush)
- if(scene->id.lib==0) {
+ if(scene->id.lib==NULL) {
paint_brush_set(&scene->toolsettings->imapaint.paint, brushn);
brushn->id.us++;
brush->id.us--;
@@ -226,10 +229,8 @@ void make_local_brush(Brush *brush)
void brush_debug_print_state(Brush *br)
{
- Brush def;
-
/* create a fake brush and set it to the defaults */
- memset(&def, 0, sizeof(Brush));
+ Brush def= {{NULL}};
brush_set_defaults(&def);
#define BR_TEST(field, t) \
@@ -423,7 +424,7 @@ int brush_texture_set_nr(Brush *brush, int nr)
id= (ID *)brush->mtex.tex;
idtest= (ID*)BLI_findlink(&G.main->tex, nr-1);
- if(idtest==0) { /* new tex */
+ if(idtest==NULL) { /* new tex */
if(id) idtest= (ID *)copy_texture((Tex *)id);
else idtest= (ID *)add_texture("Tex");
idtest->us--;
@@ -478,7 +479,7 @@ int brush_clone_image_delete(Brush *brush)
}
/* Brush Sampling */
-void brush_sample_tex(Brush *brush, float *xy, float *rgba)
+void brush_sample_tex(Brush *brush, float *xy, float *rgba, const int thread)
{
MTex *mtex= &brush->mtex;
@@ -491,7 +492,7 @@ void brush_sample_tex(Brush *brush, float *xy, float *rgba)
co[1]= xy[1]/radius;
co[2]= 0.0f;
- hasrgb= externtex(mtex, co, &tin, &tr, &tg, &tb, &ta);
+ hasrgb= externtex(mtex, co, &tin, &tr, &tg, &tb, &ta, thread);
if (hasrgb) {
rgba[0]= tr;
@@ -528,7 +529,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
if (*outbuf)
ibuf= *outbuf;
else
- ibuf= IMB_allocImBuf(bufsize, bufsize, 32, imbflag, 0);
+ ibuf= IMB_allocImBuf(bufsize, bufsize, 32, imbflag);
if (flt) {
for (y=0; y < ibuf->y; y++) {
@@ -545,12 +546,12 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
dstf[3]= alpha*brush_curve_strength_clamp(brush, dist, radius);
}
else if (texfall == 1) {
- brush_sample_tex(brush, xy, dstf);
+ brush_sample_tex(brush, xy, dstf, 0);
}
else {
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
- brush_sample_tex(brush, xy, rgba);
+ brush_sample_tex(brush, xy, rgba, 0);
dstf[0] = rgba[0]*brush->rgb[0];
dstf[1] = rgba[1]*brush->rgb[1];
@@ -581,7 +582,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
dst[3]= FTOCHAR(alpha*brush_curve_strength(brush, dist, radius));
}
else if (texfall == 1) {
- brush_sample_tex(brush, xy, rgba);
+ brush_sample_tex(brush, xy, rgba, 0);
dst[0]= FTOCHAR(rgba[0]);
dst[1]= FTOCHAR(rgba[1]);
dst[2]= FTOCHAR(rgba[2]);
@@ -590,7 +591,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
else {
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
- brush_sample_tex(brush, xy, rgba);
+ brush_sample_tex(brush, xy, rgba, 0);
dst[0] = FTOCHAR(rgba[0]*brush->rgb[0]);
dst[1] = FTOCHAR(rgba[1]*brush->rgb[1]);
dst[2] = FTOCHAR(rgba[2]*brush->rgb[2]);
@@ -737,7 +738,7 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
xy[0] = x + xoff;
xy[1] = y + yoff;
- brush_sample_tex(brush, xy, tf);
+ brush_sample_tex(brush, xy, tf, 0);
}
bf[0] = tf[0]*mf[0];
@@ -768,7 +769,7 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
xy[0] = x + xoff;
xy[1] = y + yoff;
- brush_sample_tex(brush, xy, rgba);
+ brush_sample_tex(brush, xy, rgba, 0);
t[0]= FTOCHAR(rgba[0]);
t[1]= FTOCHAR(rgba[1]);
t[2]= FTOCHAR(rgba[2]);
@@ -794,11 +795,11 @@ static void brush_painter_fixed_tex_partial_update(BrushPainter *painter, float
imbflag= (cache->flt)? IB_rectfloat: IB_rect;
if (!cache->ibuf)
- cache->ibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
+ cache->ibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag);
ibuf= cache->ibuf;
oldtexibuf= cache->texibuf;
- cache->texibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag, 0);
+ cache->texibuf= IMB_allocImBuf(diameter, diameter, 32, imbflag);
if (oldtexibuf) {
srcx= srcy= 0;
@@ -906,7 +907,13 @@ static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pres
void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
{
- if(brush->jitter){
+ int use_jitter= brush->jitter != 0;
+
+ /* jitter-ed brush gives wierd and unpredictable result for this
+ kinds of stroke, so manyally disable jitter usage (sergey) */
+ use_jitter&= (brush->flag & (BRUSH_RESTORE_MESH|BRUSH_ANCHORED)) == 0;
+
+ if(use_jitter){
float rand_pos[2];
const int radius= brush_size(brush);
const int diameter= 2*radius;
@@ -1096,11 +1103,9 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side)
{
unsigned int *texcache = NULL;
MTex *mtex = &br->mtex;
- TexResult texres;
+ TexResult texres= {0};
int hasrgb, ix, iy;
int side = half_side * 2;
-
- memset(&texres, 0, sizeof(TexResult));
if(mtex->tex) {
float x, y, step = 2.0 / side, co[3];
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 0b2f491b28d..7a3c4bd5928 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -23,7 +23,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): André Pinto.
+ * Contributor(s): Andr Pinto.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -34,15 +34,18 @@
#include "DNA_meshdata_types.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "MEM_guardedalloc.h"
/* Math stuff for ray casting on mesh faces and for nearest surface */
-static float ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, const float *v0, const float *v1, const float *v2)
+static float ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float *v0, const float *v1, const float *v2)
{
float dist;
@@ -577,16 +580,34 @@ BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float
tree = BLI_bvhtree_new(numFaces, epsilon, tree_type, axis);
if(tree != NULL)
{
- for(i = 0; i < numFaces; i++)
- {
- float co[4][3];
- VECCOPY(co[0], vert[ face[i].v1 ].co);
- VECCOPY(co[1], vert[ face[i].v2 ].co);
- VECCOPY(co[2], vert[ face[i].v3 ].co);
- if(face[i].v4)
- VECCOPY(co[3], vert[ face[i].v4 ].co);
-
- BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ /* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */
+ EditMesh *em= data->em_evil;
+ if(em) {
+ EditFace *efa= em->faces.first;
+ for(i = 0; i < numFaces; i++, efa= efa->next) {
+ if(!(efa->f & 1) && efa->h==0 && !((efa->v1->f&1)+(efa->v2->f&1)+(efa->v3->f&1)+(efa->v4?efa->v4->f&1:0))) {
+ float co[4][3];
+ VECCOPY(co[0], vert[ face[i].v1 ].co);
+ VECCOPY(co[1], vert[ face[i].v2 ].co);
+ VECCOPY(co[2], vert[ face[i].v3 ].co);
+ if(face[i].v4)
+ VECCOPY(co[3], vert[ face[i].v4 ].co);
+
+ BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ }
+ }
+ }
+ else {
+ for(i = 0; i < numFaces; i++) {
+ float co[4][3];
+ VECCOPY(co[0], vert[ face[i].v1 ].co);
+ VECCOPY(co[1], vert[ face[i].v2 ].co);
+ VECCOPY(co[2], vert[ face[i].v3 ].co);
+ if(face[i].v4)
+ VECCOPY(co[3], vert[ face[i].v4 ].co);
+
+ BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
+ }
}
BLI_bvhtree_balance(tree);
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 0374f4856ca..368e84cce30 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -53,6 +53,13 @@
#include "BLI_pbvh.h"
#include "BLI_array.h"
#include "BLI_smallhash.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_cdderivedmesh.h"
+#include "BKE_global.h"
+#include "BKE_mesh.h"
+#include "BKE_paint.h"
+
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
@@ -83,6 +90,7 @@ typedef struct {
/* Cached */
struct PBVH *pbvh;
int pbvh_draw;
+
/* Mesh connectivity */
struct ListBase *fmap;
struct IndexNode *fmap_mem;
@@ -204,7 +212,7 @@ static ListBase *cdDM_getFaceMap(Object *ob, DerivedMesh *dm)
static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
- Mesh *me= (ob)? ob->data: NULL;
+ Mesh *me= ob->data;
if(ob->sculpt->modifiers_active) return 0;
@@ -214,7 +222,6 @@ static int can_pbvh_draw(Object *ob, DerivedMesh *dm)
static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
- Mesh *me= (ob)? ob->data: NULL;
if(!ob) {
cddm->pbvh= NULL;
@@ -232,15 +239,42 @@ static struct PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
this derivedmesh is just original mesh. it's the multires subsurf dm
that this is actually for, to support a pbvh on a modified mesh */
if(!cddm->pbvh && ob->type == OB_MESH) {
+ Mesh *me= ob->data;
cddm->pbvh = BLI_pbvh_new();
cddm->pbvh_draw = can_pbvh_draw(ob, dm);
BLI_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
me->totface, me->totvert);
+
+ if(ob->sculpt->modifiers_active) {
+ float (*vertCos)[3];
+ int totvert;
+
+ totvert= dm->getNumVerts(dm);
+ vertCos= MEM_callocN(3*totvert*sizeof(float), "cdDM_getPBVH vertCos");
+ dm->getVertCos(dm, vertCos);
+ BLI_pbvh_apply_vertCos(cddm->pbvh, vertCos);
+ MEM_freeN(vertCos);
+ }
}
return cddm->pbvh;
}
+/* update vertex normals so that drawing smooth faces works during sculpt
+ TODO: proper fix is to support the pbvh in all drawing modes */
+static void cdDM_update_normals_from_pbvh(DerivedMesh *dm)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ float (*face_nors)[3];
+
+ if(!cddm->pbvh || !cddm->pbvh_draw || !dm->numFaceData)
+ return;
+
+ face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+
+ BLI_pbvh_update(cddm->pbvh, PBVH_UpdateNormals, face_nors);
+}
+
static void cdDM_drawVerts(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
@@ -304,7 +338,7 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
GPU_uvedge_setup(dm);
if( !GPU_buffer_legacy(dm) ) {
for(i = 0; i < dm->numFaceData; i++, mf++) {
- if(mf->flag&ME_LOOSEEDGE) {
+ if(!(mf->flag&ME_HIDE)) {
draw = 1;
}
else {
@@ -433,7 +467,7 @@ static void cdDM_drawLooseEdges(DerivedMesh *dm)
static void cdDM_drawFacesSolid(DerivedMesh *dm,
float (*partial_redraw_planes)[4],
- int fast, int (*setMaterial)(int, void *attribs))
+ int UNUSED(fast), int (*setMaterial)(int, void *attribs))
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mvert = cddm->mvert;
@@ -553,6 +587,8 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
if(col1 && col2)
glEnable(GL_CULL_FACE);
+ cdDM_update_normals_from_pbvh(dm);
+
if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesColored\n" );
glShadeModel(GL_SMOOTH);
@@ -632,6 +668,8 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
if(!mcol)
mcol = dm->getTessFaceDataArray(dm, CD_MCOL);
+ cdDM_update_normals_from_pbvh(dm);
+
if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesTex_common\n" );
for(i = 0; i < dm->numFaceData; i++, mf++) {
@@ -712,7 +750,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
GPU_vertex_setup( dm );
GPU_normal_setup( dm );
GPU_uv_setup( dm );
- if( col != 0 ) {
+ if( col != NULL ) {
/*if( realcol && dm->drawObject->colType == CD_TEXTURE_MCOL ) {
col = 0;
} else if( mcol && dm->drawObject->colType == CD_MCOL ) {
@@ -740,6 +778,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
if( !GPU_buffer_legacy(dm) ) {
glShadeModel( GL_SMOOTH );
+ lastFlag = 0;
for(i = 0; i < dm->drawObject->nelements/3; i++) {
int actualFace = dm->drawObject->faceRemap[i];
int flag = 1;
@@ -750,6 +789,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
else {
if(index) {
orig = index[actualFace];
+ if(orig == ORIGINDEX_NONE) continue;
if(drawParamsMapped)
flag = drawParamsMapped(userData, orig);
}
@@ -792,7 +832,7 @@ static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tfa
cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
}
-static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
+static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs))
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
MVert *mv = cddm->mvert;
@@ -807,22 +847,24 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
if(!mc)
mc = DM_get_tessface_data_layer(dm, CD_MCOL);
+ cdDM_update_normals_from_pbvh(dm);
+
/* back-buffer always uses legacy since VBO's would need the
* color array temporarily overwritten for drawing, then reset. */
if( GPU_buffer_legacy(dm) || G.f & G_BACKBUFSEL) {
DEBUG_VBO( "Using legacy code. cdDM_drawMappedFaces\n" );
for(i = 0; i < dm->numFaceData; i++, mf++) {
int drawSmooth = (mf->flag & ME_SMOOTH);
+ int draw= 1;
- if(index) {
- orig = *index++;
- if(setDrawOptions && orig == ORIGINDEX_NONE)
- { if(nors) nors += 3; continue; }
- }
- else
- orig = i;
+ orig= (index==NULL) ? i : *index++;
+
+ if(orig == ORIGINDEX_NONE)
+ draw= setMaterial(mf->mat_nr + 1, NULL);
+ else if (setDrawOptions != NULL)
+ draw= setDrawOptions(userData, orig, &drawSmooth);
- if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
+ if(draw) {
unsigned char *cp = NULL;
if(useColors && mc)
@@ -887,34 +929,48 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
if( !GPU_buffer_legacy(dm) ) {
int tottri = dm->drawObject->nelements/3;
glShadeModel(GL_SMOOTH);
-
- for( i = 0; i < tottri; i++ ) {
- int actualFace = dm->drawObject->faceRemap[i];
- int drawSmooth = (mf[actualFace].flag & ME_SMOOTH);
- int draw = 1;
-
- if(index) {
- orig = index[actualFace];
- if(setDrawOptions && orig == ORIGINDEX_NONE)
- draw = 0;
- }
- else
- orig = actualFace;
-
- if(draw && setDrawOptions && !setDrawOptions(userData, orig, &drawSmooth))
- draw = 0;
-
- /* Goal is to draw as long of a contiguous triangle
- array as possible, so draw when we hit either an
- invisible triangle or at the end of the array */
- if(!draw || i == tottri - 1) {
- if(prevstart != i)
- /* Add one to the length (via `draw')
- if we're drawing at the end of the array */
- glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3);
- prevstart = i + 1;
+
+ if(tottri == 0) {
+ /* avoid buffer problems in following code */
+ }
+ if(setDrawOptions == NULL) {
+ /* just draw the entire face array */
+ glDrawArrays(GL_TRIANGLES, 0, (tottri-1) * 3);
+ }
+ else {
+ /* we need to check if the next material changes */
+ int next_actualFace= dm->drawObject->faceRemap[0];
+
+ for( i = 0; i < tottri; i++ ) {
+ //int actualFace = dm->drawObject->faceRemap[i];
+ int actualFace = next_actualFace;
+ MFace *mface= mf + actualFace;
+ int drawSmooth= (mface->flag & ME_SMOOTH);
+ int draw = 1;
+
+ if(i != tottri-1)
+ next_actualFace= dm->drawObject->faceRemap[i+1];
+
+ orig= (index==NULL) ? actualFace : index[actualFace];
+
+ if(orig == ORIGINDEX_NONE)
+ draw= setMaterial(mface->mat_nr + 1, NULL);
+ else if (setDrawOptions != NULL)
+ draw= setDrawOptions(userData, orig, &drawSmooth);
+
+ /* Goal is to draw as long of a contiguous triangle
+ array as possible, so draw when we hit either an
+ invisible triangle or at the end of the array */
+ if(!draw || i == tottri - 1 || mf[actualFace].mat_nr != mf[next_actualFace].mat_nr) {
+ if(prevstart != i)
+ /* Add one to the length (via `draw')
+ if we're drawing at the end of the array */
+ glDrawArrays(GL_TRIANGLES,prevstart*3, (i-prevstart+draw)*3);
+ prevstart = i + 1;
+ }
}
}
+
glShadeModel(GL_FLAT);
}
GPU_buffer_unbind();
@@ -926,28 +982,6 @@ static void cdDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void
cdDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
}
-#define PASSVERT(index, vert) { \
- if(attribs.totorco) \
- glVertexAttrib3fvARB(attribs.orco.glIndex, attribs.orco.array[index]); \
- for(b = 0; b < attribs.tottface; b++) { \
- MTFace *tf = &attribs.tface[b].array[a]; \
- glVertexAttrib2fvARB(attribs.tface[b].glIndex, tf->uv[vert]); \
- } \
- for(b = 0; b < attribs.totmcol; b++) { \
- MCol *cp = &attribs.mcol[b].array[a*4 + vert]; \
- 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[a*4 + vert]; \
- glVertexAttrib3fvARB(attribs.tang.glIndex, tang); \
- } \
- if(smoothnormal) \
- glNormal3sv(mvert[index].no); \
- glVertex3fv(mvert[index].co); \
- }
-
static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, void *attribs), int (*setDrawOptions)(void *userData, int index), void *userData)
{
CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
@@ -957,25 +991,27 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
MFace *mface = cddm->mface;
MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE);
float (*nors)[3] = dm->getTessFaceDataArray(dm, CD_NORMAL);
- int a, b, dodraw, smoothnormal, matnr, new_matnr;
+ int a, b, dodraw, matnr, new_matnr;
int transp, new_transp, orig_transp;
int orig, *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
+ cdDM_update_normals_from_pbvh(dm);
+
matnr = -1;
- smoothnormal = 0;
dodraw = 0;
transp = GPU_get_material_blend_mode();
orig_transp = transp;
glShadeModel(GL_SMOOTH);
- if( GPU_buffer_legacy(dm) || setDrawOptions != 0 ) {
+ if( GPU_buffer_legacy(dm) || setDrawOptions != NULL ) {
DEBUG_VBO( "Using legacy code. cdDM_drawMappedFacesGLSL\n" );
memset(&attribs, 0, sizeof(attribs));
glBegin(GL_QUADS);
for(a = 0; a < dm->numFaceData; a++, mface++) {
+ const int smoothnormal = (mface->flag & ME_SMOOTH);
new_matnr = mface->mat_nr + 1;
if(new_matnr != matnr) {
@@ -994,8 +1030,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
else if(setDrawOptions) {
orig = (index)? index[a]: a;
- if(orig == ORIGINDEX_NONE)
- continue;
+ if(orig == ORIGINDEX_NONE) {
+ /* since the material is set by setMaterial(), faces with no
+ * origin can be assumed to be generated by a modifier */
+
+ /* continue */
+ }
else if(!setDrawOptions(userData, orig))
continue;
}
@@ -1016,8 +1056,6 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
}
- smoothnormal = (mface->flag & ME_SMOOTH);
-
if(!smoothnormal) {
if(nors) {
glNormal3fv(nors[a]);
@@ -1034,6 +1072,28 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
}
+#define PASSVERT(index, vert) { \
+ if(attribs.totorco) \
+ glVertexAttrib3fvARB(attribs.orco.glIndex, attribs.orco.array[index]); \
+ for(b = 0; b < attribs.tottface; b++) { \
+ MTFace *tf = &attribs.tface[b].array[a]; \
+ glVertexAttrib2fvARB(attribs.tface[b].glIndex, tf->uv[vert]); \
+ } \
+ for(b = 0; b < attribs.totmcol; b++) { \
+ MCol *cp = &attribs.mcol[b].array[a*4 + vert]; \
+ 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[a*4 + vert]; \
+ glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
+ } \
+ if(smoothnormal) \
+ glNormal3sv(mvert[index].no); \
+ glVertex3fv(mvert[index].co); \
+ }
+
PASSVERT(mface->v1, 0);
PASSVERT(mface->v2, 1);
PASSVERT(mface->v3, 2);
@@ -1042,13 +1102,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
else
PASSVERT(mface->v3, 2)
-#undef PASSVERT
}
glEnd();
}
else {
- GPUBuffer *buffer = 0;
- char *varray = 0;
+ GPUBuffer *buffer = NULL;
+ char *varray = NULL;
int numdata = 0, elementsize = 0, offset;
int start = 0, numfaces = 0, prevdraw = 0, curface = 0;
int i;
@@ -1085,9 +1144,9 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
if( numdata != 0 ) {
- GPU_buffer_free(buffer,0);
+ GPU_buffer_free(buffer, NULL);
- buffer = 0;
+ buffer = NULL;
}
}
@@ -1119,22 +1178,22 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
if(attribs.tottang) {
datatypes[numdata].index = attribs.tang.glIndex;
- datatypes[numdata].size = 3;
+ datatypes[numdata].size = 4;
datatypes[numdata].type = GL_FLOAT;
numdata++;
}
if( numdata != 0 ) {
elementsize = GPU_attrib_element_size( datatypes, numdata );
- buffer = GPU_buffer_alloc( elementsize*dm->drawObject->nelements, 0 );
- if( buffer == 0 ) {
+ buffer = GPU_buffer_alloc( elementsize*dm->drawObject->nelements, NULL );
+ if( buffer == NULL ) {
GPU_buffer_unbind();
dm->drawObject->legacy = 1;
return;
}
varray = GPU_buffer_lock_stream(buffer);
- if( varray == 0 ) {
+ if( varray == NULL ) {
GPU_buffer_unbind();
- GPU_buffer_free(buffer, 0);
+ GPU_buffer_free(buffer, NULL);
dm->drawObject->legacy = 1;
return;
}
@@ -1209,12 +1268,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
if(attribs.tottang) {
float *tang = attribs.tang.array[a*4 + 0];
- VECCOPY((float *)&varray[elementsize*curface*3+offset], tang);
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang);
tang = attribs.tang.array[a*4 + 1];
- VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
tang = attribs.tang.array[a*4 + 2];
- VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
- offset += sizeof(float)*3;
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
+ offset += sizeof(float)*4;
}
}
curface++;
@@ -1249,12 +1308,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
if(attribs.tottang) {
float *tang = attribs.tang.array[a*4 + 2];
- VECCOPY((float *)&varray[elementsize*curface*3+offset], tang);
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang);
tang = attribs.tang.array[a*4 + 3];
- VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang);
tang = attribs.tang.array[a*4 + 0];
- VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
- offset += sizeof(float)*3;
+ QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang);
+ offset += sizeof(float)*4;
}
}
curface++;
@@ -1273,7 +1332,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
}
GPU_buffer_unbind();
}
- GPU_buffer_free( buffer, 0 );
+ GPU_buffer_free( buffer, NULL );
}
glShadeModel(GL_FLAT);
@@ -1406,6 +1465,11 @@ static void cdDM_recalcTesselation(DerivedMesh *dm)
cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
}
+void CDDM_recalc_tesselation(DerivedMesh *dm)
+{
+ cdDM_recalcTesselation(dm);
+}
+
/*ignores original poly origindex layer*/
static void cdDM_recalcTesselation2(DerivedMesh *dm)
{
@@ -1531,7 +1595,7 @@ DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces, int numLoops, in
return dm;
}
-DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
+DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
{
CDDerivedMesh *cddm = cdDM_create("CDDM_from_mesh dm");
DerivedMesh *dm = &cddm->dm;
@@ -1570,7 +1634,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
return dm;
}
-DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
+DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
{
DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
BLI_countlist(&em->edges),
@@ -1622,7 +1686,6 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
mv->no[2] = eve->no[2] * 32767.0;
mv->bweight = (unsigned char) (eve->bweight * 255.0f);
- mv->mat_nr = 0;
mv->flag = 0;
*index = i;
@@ -1673,7 +1736,7 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
DerivedMesh *CDDM_from_curve(Object *ob)
{
- return CDDM_from_curve_customDB(ob, &((Curve *)ob->data)->disp);
+ return CDDM_from_curve_customDB(ob, &ob->disp);
}
DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
@@ -1821,7 +1884,6 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *me)
mv->no[1] = eve->no[1] * 32767.0;
mv->no[2] = eve->no[2] * 32767.0;
- mv->mat_nr = 0;
mv->flag = BMFlags_To_MEFlags(eve);
if (add_orig) *index = i;
@@ -2076,6 +2138,8 @@ DerivedMesh *CDDM_copy(DerivedMesh *source, int faces_from_tessfaces)
return dm;
}
+/* note, the CD_ORIGINDEX layers are all 0, so if there is a direct
+ * relationship betwen mesh data this needs to be set by the caller. */
DerivedMesh *CDDM_from_template(DerivedMesh *source,
int numVerts, int numEdges, int numFaces,
int numLoops, int numPolys)
@@ -2679,6 +2743,11 @@ MFace *CDDM_get_tessfaces(DerivedMesh *dm)
return ((CDDerivedMesh*)dm)->mface;
}
+MPoly *CDDM_get_polys(DerivedMesh *dm)
+{
+ return ((CDDerivedMesh*)dm)->mpoly;
+}
+
void CDDM_tessfaces_to_faces(DerivedMesh *dm)
{
/*converts mfaces to mpolys/mloops*/
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 8d4bacb977f..c115f6aa470 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -1,29 +1,29 @@
-/* cloth.c
-*
-*
-* ***** 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.
-*
-* The Original Code is Copyright (C) Blender Foundation
-* All rights reserved.
-*
-* Contributor(s): Daniel Genrich
-*
-* ***** END GPL LICENSE BLOCK *****
-*/
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * Contributor(s): Daniel Genrich
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
#include "MEM_guardedalloc.h"
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_cloth.h"
@@ -41,12 +42,6 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
-
-#include "BKE_pointcache.h"
-
-#include "BLI_kdopbvh.h"
-#include "BLI_cellalloc.h"
#ifdef _WIN32
void tstart ( void )
@@ -54,7 +49,7 @@ void tstart ( void )
void tend ( void )
{
}
-double tval()
+double tval( void )
{
return 0;
}
@@ -70,7 +65,7 @@ void tend ( void )
{
gettimeofday ( &_tend,&tz );
}
-double tval()
+double tval(void)
{
double t1, t2;
t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 );
@@ -92,7 +87,7 @@ static CM_SOLVER_DEF solvers [] =
/* Prototypes for internal functions.
*/
static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
-static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm );
+static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm );
static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first);
static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm );
@@ -168,7 +163,6 @@ static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float eps
BVHTree *bvhtree;
Cloth *cloth;
ClothVertex *verts;
- MFace *mfaces;
float co[12];
if(!clmd)
@@ -180,7 +174,6 @@ static BVHTree *bvhselftree_build_from_cloth (ClothModifierData *clmd, float eps
return NULL;
verts = cloth->verts;
- mfaces = cloth->mfaces;
// in the moment, return zero if no faces there
if(!cloth->numverts)
@@ -390,7 +383,8 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
Cloth *cloth;
ListBase *effectors = NULL;
MVert *mvert;
- int i, ret = 0;
+ unsigned int i = 0;
+ int ret = 0;
/* simulate 1 frame forward */
cloth = clmd->clothObject;
@@ -428,13 +422,13 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
/************************************************
* clothModifier_do - main simulation function
************************************************/
-DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm)
{
DerivedMesh *result;
PointCache *cache;
PTCacheID pid;
float timescale;
- int framedelta, framenr, startframe, endframe;
+ int framenr, startframe, endframe;
int cache_result;
clmd->scene= scene; /* nice to pass on later :) */
@@ -451,7 +445,9 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
return dm;
}
- if(clmd->sim_parms->reset || (framenr == (startframe - clmd->sim_parms->preroll)))
+ if(clmd->sim_parms->reset
+ || (framenr == (startframe - clmd->sim_parms->preroll) && clmd->sim_parms->preroll != 0)
+ || (clmd->clothObject && result->getNumVerts(result) != clmd->clothObject->numverts))
{
clmd->sim_parms->reset = 0;
cache->flag |= PTCACHE_OUTDATED;
@@ -462,17 +458,6 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
return result;
}
- /* verify we still have the same number of vertices, if not do nothing.
- * note that this should only happen if the number of vertices changes
- * during an animation due to a preceding modifier, this should not
- * happen because of object changes! */
- if(clmd->clothObject) {
- if(result->getNumVerts(result) != clmd->clothObject->numverts) {
- BKE_ptcache_invalidate(cache);
- return result;
- }
- }
-
// unused in the moment, calculated separately in implicit.c
clmd->sim_parms->dt = clmd->sim_parms->timescale / clmd->sim_parms->stepsPerFrame;
@@ -481,10 +466,10 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_invalidate(cache);
/* do simulation */
- if(!do_init_cloth(ob, clmd, result, framenr))
+ if(!do_init_cloth(ob, clmd, dm, framenr))
return result;
- do_step_cloth(ob, clmd, result, framenr);
+ do_step_cloth(ob, clmd, dm, framenr);
cloth_to_object(ob, clmd, result);
return result;
@@ -499,25 +484,20 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
framenr= endframe;
}
- if(cache->flag & PTCACHE_SIMULATION_VALID)
- framedelta= framenr - cache->simframe;
- else
- framedelta= -1;
-
/* initialize simulation data if it didn't exist already */
- if(!do_init_cloth(ob, clmd, result, framenr))
+ if(!do_init_cloth(ob, clmd, dm, framenr))
return result;
if((framenr == startframe) && (clmd->sim_parms->preroll == 0)) {
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
- do_init_cloth(ob, clmd, result, framenr);
+ do_init_cloth(ob, clmd, dm, framenr);
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
return result;
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, (float)framenr, scene->r.frs_sec);
+ cache_result = BKE_ptcache_read(&pid, (float)framenr+scene->r.subframe);
if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
implicit_set_positions(clmd);
@@ -526,7 +506,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, framenr);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
return result;
}
@@ -541,18 +521,18 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* if on second frame, write cache for first frame */
if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(&pid, startframe);
+ BKE_ptcache_write(&pid, startframe);
clmd->sim_parms->timescale *= framenr - cache->simframe;
/* do simulation */
BKE_ptcache_validate(cache, framenr);
- if(!do_step_cloth(ob, clmd, result, framenr)) {
+ if(!do_step_cloth(ob, clmd, dm, framenr)) {
BKE_ptcache_invalidate(cache);
}
else
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
cloth_to_object (ob, clmd, result);
@@ -560,7 +540,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
}
/* frees all */
-void cloth_free_modifier ( Object *ob, ClothModifierData *clmd )
+void cloth_free_modifier(ClothModifierData *clmd )
{
Cloth *cloth = NULL;
@@ -818,7 +798,7 @@ static void cloth_apply_vgroup ( ClothModifierData *clmd, DerivedMesh *dm )
}
}
-static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first)
+static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float UNUSED(framenr), int first)
{
int i = 0;
MVert *mvert = NULL;
@@ -831,7 +811,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
// If we have a clothObject, free it.
if ( clmd->clothObject != NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
if(G.rt > 0)
printf("cloth_free_modifier cloth_from_object\n");
}
@@ -855,7 +835,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
if ( !dm )
return 0;
- cloth_from_mesh ( ob, clmd, dm );
+ cloth_from_mesh ( clmd, dm );
// create springs
clmd->clothObject->springs = NULL;
@@ -911,7 +891,7 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
if ( !cloth_build_springs ( clmd, dm ) )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Can't build springs." );
printf("cloth_free_modifier cloth_build_springs\n");
return 0;
@@ -945,11 +925,11 @@ static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *d
return 1;
}
-static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *dm )
+static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm )
{
unsigned int numverts = dm->getNumVerts ( dm );
unsigned int numfaces = dm->getNumTessFaces ( dm );
- MFace *mface = CDDM_get_tessfaces(dm);
+ MFace *mface = dm->getTessFaceArray( dm );
unsigned int i = 0;
/* Allocate our vertices. */
@@ -957,7 +937,7 @@ static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *
clmd->clothObject->verts = MEM_callocN ( sizeof ( ClothVertex ) * clmd->clothObject->numverts, "clothVertex" );
if ( clmd->clothObject->verts == NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->verts." );
printf("cloth_free_modifier clmd->clothObject->verts\n");
return;
@@ -968,7 +948,7 @@ static void cloth_from_mesh ( Object *ob, ClothModifierData *clmd, DerivedMesh *
clmd->clothObject->mfaces = MEM_callocN ( sizeof ( MFace ) * clmd->clothObject->numfaces, "clothMFaces" );
if ( clmd->clothObject->mfaces == NULL )
{
- cloth_free_modifier ( ob, clmd );
+ cloth_free_modifier ( clmd );
modifier_setError ( & ( clmd->modifier ), "Out of memory on allocating clmd->clothObject->mfaces." );
printf("cloth_free_modifier clmd->clothObject->mfaces\n");
return;
@@ -1020,7 +1000,7 @@ int cloth_add_spring ( ClothModifierData *clmd, unsigned int indexA, unsigned in
return 0;
}
-static void cloth_free_errorsprings(Cloth *cloth, EdgeHash *edgehash, LinkNode **edgelist)
+static void cloth_free_errorsprings(Cloth *cloth, EdgeHash *UNUSED(edgehash), LinkNode **edgelist)
{
unsigned int i = 0;
@@ -1058,12 +1038,12 @@ static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm )
Cloth *cloth = clmd->clothObject;
ClothSpring *spring = NULL, *tspring = NULL, *tspring2 = NULL;
unsigned int struct_springs = 0, shear_springs=0, bend_springs = 0;
- int i = 0;
- int numverts = dm->getNumVerts ( dm );
- int numedges = dm->getNumEdges ( dm );
- int numfaces = dm->getNumTessFaces ( dm );
- MEdge *medge = CDDM_get_edges ( dm );
- MFace *mface = CDDM_get_tessfaces ( dm );
+ unsigned int i = 0;
+ unsigned int numverts = (unsigned int)dm->getNumVerts ( dm );
+ unsigned int numedges = (unsigned int)dm->getNumEdges ( dm );
+ unsigned int numfaces = (unsigned int)dm->getNumTessFaces ( dm );
+ MEdge *medge = dm->getEdgeArray ( dm );
+ MFace *mface = dm->getTessFaceArray ( dm );
int index2 = 0; // our second vertex index
LinkNode **edgelist = NULL;
EdgeHash *edgehash = NULL;
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index af12d23b2c2..623ba26e86d 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -1,31 +1,31 @@
-/* collision.c
-*
-*
-* ***** 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.
-*
-* The Original Code is Copyright (C) Blender Foundation
-* All rights reserved.
-*
-* The Original Code is: all of this file.
-*
-* Contributor(s): none yet.
-*
-* ***** END GPL LICENSE BLOCK *****
-*/
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
#include "MEM_guardedalloc.h"
@@ -42,6 +42,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -49,7 +50,7 @@
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#ifdef USE_BULLET
#include "Bullet-C-Api.h"
@@ -79,11 +80,11 @@ void collision_move_object ( CollisionModifierData *collmd, float step, float pr
bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 );
}
-BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int numverts, float epsilon )
+BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert *x, unsigned int UNUSED(numverts), float epsilon )
{
BVHTree *tree;
float co[12];
- int i;
+ unsigned int i;
MFace *tface = mfaces;
tree = BLI_bvhtree_new ( numfaces*2, epsilon, 4, 26 );
@@ -106,7 +107,7 @@ BVHTree *bvhtree_build_from_mvert ( MFace *mfaces, unsigned int numfaces, MVert
return tree;
}
-void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int numverts, int moving )
+void bvhtree_update_from_mvert ( BVHTree * bvhtree, MFace *faces, int numfaces, MVert *x, MVert *xnew, int UNUSED(numverts), int moving )
{
int i;
MFace *mfaces = faces;
@@ -163,8 +164,8 @@ Collision modifier code end
*/
#define mySWAP(a,b) do { double tmp = b ; b = a ; a = tmp ; } while(0)
-
-int
+#if 0 /* UNUSED */
+static int
gsl_poly_solve_cubic (double a, double b, double c,
double *x0, double *x1, double *x2)
{
@@ -254,7 +255,7 @@ gsl_poly_solve_cubic (double a, double b, double c,
*
* copied from GSL
*/
-int
+static int
gsl_poly_solve_quadratic (double a, double b, double c,
double *x0, double *x1)
{
@@ -312,7 +313,7 @@ gsl_poly_solve_quadratic (double a, double b, double c,
return 0;
}
}
-
+#endif /* UNUSED */
@@ -481,7 +482,7 @@ DO_INLINE void collision_interpolateOnTriangle ( float to[3], float v1[3], float
}
-int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
+static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end )
{
int result = 0;
Cloth *cloth1;
@@ -597,7 +598,7 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier
}
//Determines collisions on overlap, collisions are written to collpair[i] and collision+number_collision_found is returned
-CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair )
+static CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair )
{
ClothModifierData *clmd = ( ClothModifierData * ) md1;
CollisionModifierData *collmd = ( CollisionModifierData * ) md2;
@@ -1307,7 +1308,7 @@ static int cloth_collision_moving ( ClothModifierData *clmd, CollisionModifierDa
}
#endif
-static void add_collision_object(Object ***objs, int *numobj, int *maxobj, Object *ob, Object *self, int level)
+static void add_collision_object(Object ***objs, unsigned int *numobj, unsigned int *maxobj, Object *ob, Object *self, int level)
{
CollisionModifierData *cmd= NULL;
@@ -1342,12 +1343,12 @@ static void add_collision_object(Object ***objs, int *numobj, int *maxobj, Objec
// return all collision objects in scene
// collision object will exclude self
-Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *numcollobj)
+Object **get_collisionobjects(Scene *scene, Object *self, Group *group, unsigned int *numcollobj)
{
Base *base;
Object **objs;
GroupObject *go;
- int numobj= 0, maxobj= 100;
+ unsigned int numobj= 0, maxobj= 100;
objs= MEM_callocN(sizeof(Object *)*maxobj, "CollisionObjectsArray");
@@ -1358,9 +1359,9 @@ Object **get_collisionobjects(Scene *scene, Object *self, Group *group, int *num
add_collision_object(&objs, &numobj, &maxobj, go->ob, self, 0);
}
else {
- Scene *sce; /* for SETLOOPER macro */
+ Scene *sce_iter;
/* add objects in same layer in scene */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
if(base->lay & self->lay)
add_collision_object(&objs, &numobj, &maxobj, base->object, self, 0);
@@ -1417,11 +1418,11 @@ ListBase *get_collider_cache(Scene *scene, Object *self, Group *group)
add_collider_cache_object(&objs, go->ob, self, 0);
}
else {
- Scene *sce; /* for SETLOOPER macro */
+ Scene *sce_iter;
Base *base;
/* add objects in same layer in scene */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
if(!self || (base->lay & self->lay))
add_collider_cache_object(&objs, base->object, self, 0);
@@ -1456,13 +1457,13 @@ static void cloth_bvh_objcollisions_nearcheck ( ClothModifierData * clmd, Collis
static int cloth_bvh_objcollisions_resolve ( ClothModifierData * clmd, CollisionModifierData *collmd, CollPair *collisions, CollPair *collisions_index)
{
Cloth *cloth = clmd->clothObject;
- int i=0, j = 0, numfaces = 0, numverts = 0;
+ int i=0, j = 0, /*numfaces = 0,*/ numverts = 0;
ClothVertex *verts = NULL;
int ret = 0;
int result = 0;
float tnull[3] = {0,0,0};
- numfaces = clmd->clothObject->numfaces;
+ /*numfaces = clmd->clothObject->numfaces;*/ /*UNUSED*/
numverts = clmd->clothObject->numverts;
verts = cloth->verts;
@@ -1503,12 +1504,12 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
{
Cloth *cloth= clmd->clothObject;
BVHTree *cloth_bvh= cloth->bvhtree;
- int i=0, numfaces = 0, numverts = 0, k, l, j;
+ unsigned int i=0, numfaces = 0, numverts = 0, k, l, j;
int rounds = 0; // result counts applied collisions; ic is for debug output;
ClothVertex *verts = NULL;
int ret = 0, ret2 = 0;
Object **collobjs = NULL;
- int numcollobj = 0;
+ unsigned int numcollobj = 0;
if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_COLLOBJ) || cloth_bvh==NULL)
return 0;
@@ -1545,7 +1546,7 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
Object *collob= collobjs[i];
CollisionModifierData *collmd = (CollisionModifierData*)modifiers_findByType(collob, eModifierType_Collision);
BVHTreeOverlap *overlap = NULL;
- int result = 0;
+ unsigned int result = 0;
if(!collmd->bvhtree)
continue;
@@ -1605,11 +1606,11 @@ int cloth_bvh_objcollision (Object *ob, ClothModifierData * clmd, float step, fl
////////////////////////////////////////////////////////////
if ( clmd->coll_parms->flags & CLOTH_COLLSETTINGS_FLAG_SELF )
{
- for(l = 0; l < clmd->coll_parms->self_loop_count; l++)
+ for(l = 0; l < (unsigned int)clmd->coll_parms->self_loop_count; l++)
{
// TODO: add coll quality rounds again
BVHTreeOverlap *overlap = NULL;
- int result = 0;
+ unsigned int result = 0;
// collisions = 1;
verts = cloth->verts; // needed for openMP
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 90ffa39c88f..7cf6b21e2f1 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -41,19 +41,20 @@
#include "DNA_color_types.h"
#include "DNA_curve_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_colortools.h"
#include "BKE_curve.h"
-#include "BKE_ipo.h"
-#include "BKE_utildefines.h"
+#include "BKE_fcurve.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
{
int x, y;
float *rf= rectf;
@@ -74,7 +75,7 @@ void floatbuf_to_srgb_byte(float *rectf, unsigned char *rectc, int x1, int x2, i
}
}
-void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int w)
+void floatbuf_to_byte(float *rectf, unsigned char *rectc, int x1, int x2, int y1, int y2, int UNUSED(w))
{
int x, y;
float *rf= rectf;
@@ -356,7 +357,7 @@ void curvemap_sethandle(CurveMap *cuma, int type)
/* *********************** Making the tables and display ************** */
/* reduced copy of garbled calchandleNurb() code in curve.c */
-static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
+static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *next, int UNUSED(mode))
{
float *p1,*p2,*p3,pt[3];
float dx1,dy1, dx,dy, vx,vy, len,len1,len2;
@@ -830,6 +831,10 @@ void colorcorrection_do_ibuf(ImBuf *ibuf, const char *profile)
cmsCloseProfile(proofingProfile);
}
}
+#else
+ /* unused */
+ (void)ibuf;
+ (void)profile;
#endif
}
@@ -865,7 +870,7 @@ void curvemapping_do_ibuf(CurveMapping *cumap, ImBuf *ibuf)
if(ibuf->channels)
stride= ibuf->channels;
- for(pixel= ibuf->x*ibuf->y; pixel>0; pixel--, pix_in+=stride, pix_out+=4) {
+ for(pixel= ibuf->x*ibuf->y; pixel>0; pixel--, pix_in+=stride, pix_out+=stride) {
if(stride<3) {
col[0]= curvemap_evaluateF(cumap->cm, *pix_in);
@@ -952,13 +957,11 @@ void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size)
DO_INLINE int get_bin_float(float f)
{
- int bin= (int)(f*255);
+ int bin= (int)((f*255) + 0.5); /* 0.5 to prevent quantisation differences */
/* note: clamp integer instead of float to avoid problems with NaN */
CLAMP(bin, 0, 255);
-
- //return (int) (((f + 0.25) / 1.5) * 255);
-
+
return bin;
}
@@ -1000,7 +1003,8 @@ DO_INLINE void save_sample_line(Scopes *scopes, const int idx, const float fx, f
void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
{
- int x, y, c, n, nl;
+ int x, y, c;
+ unsigned int n, nl;
double div, divl;
float *rf=NULL;
unsigned char *rc=NULL;
@@ -1008,6 +1012,9 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
int savedlines, saveline;
float rgb[3], ycc[3], luma;
int ycc_mode=-1;
+ const short is_float = (ibuf->rect_float != NULL);
+
+ if (ibuf->rect==NULL && ibuf->rect_float==NULL) return;
if (scopes->ok == 1 ) return;
@@ -1015,6 +1022,7 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
/* hmmmm */
if (!(ELEM(ibuf->channels, 3, 4))) return;
+
scopes->hist.channels = 3;
scopes->hist.x_resolution = 256;
@@ -1069,9 +1077,9 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
scopes->waveform_3= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "waveform point channel 3");
scopes->vecscope= MEM_callocN(scopes->waveform_tot * 2 * sizeof(float), "vectorscope point channel");
- if (ibuf->rect_float)
+ if (is_float)
rf = ibuf->rect_float;
- else if (ibuf->rect)
+ else
rc = (unsigned char *)ibuf->rect;
for (y = 0; y < ibuf->y; y++) {
@@ -1080,13 +1088,13 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
} else saveline=0;
for (x = 0; x < ibuf->x; x++) {
- if (ibuf->rect_float) {
+ if (is_float) {
if (use_color_management)
linearrgb_to_srgb_v3_v3(rgb, rf);
else
copy_v3_v3(rgb, rf);
}
- else if (ibuf->rect) {
+ else {
for (c=0; c<3; c++)
rgb[c] = rc[c] * INV_255;
}
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index fd8bd67e8f4..36d19b53ed2 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "DNA_armature_types.h"
#include "DNA_constraint_types.h"
@@ -54,7 +55,7 @@
#include "DNA_text_types.h"
#include "DNA_windowmanager_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_action.h"
#include "BKE_anim.h" /* for the curve calculation part */
#include "BKE_armature.h"
@@ -74,7 +75,7 @@
#include "BKE_mesh.h"
#include "BKE_tessmesh.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -375,7 +376,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
else {
/* objects */
if (from==CONSTRAINT_SPACE_WORLD && to==CONSTRAINT_SPACE_LOCAL) {
- /* check if object has a parent - otherwise this won't work */
+ /* check if object has a parent */
if (ob->parent) {
/* 'subtract' parent's effects from owner */
mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
@@ -383,6 +384,18 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
copy_m4_m4(tempmat, mat);
mul_m4_m4m4(mat, tempmat, imat);
}
+ else {
+ /* Local space in this case will have to be defined as local to the owner's
+ * transform-property-rotated axes. So subtract this rotation component.
+ */
+ object_to_mat4(ob, diff_mat);
+ normalize_m4(diff_mat);
+ zero_v3(diff_mat[3]);
+
+ invert_m4_m4(imat, diff_mat);
+ copy_m4_m4(tempmat, mat);
+ mul_m4_m4m4(mat, tempmat, imat);
+ }
}
else if (from==CONSTRAINT_SPACE_LOCAL && to==CONSTRAINT_SPACE_WORLD) {
/* check that object has a parent - otherwise this won't work */
@@ -392,6 +405,17 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
mul_m4_m4m4(mat, tempmat, diff_mat);
}
+ else {
+ /* Local space in this case will have to be defined as local to the owner's
+ * transform-property-rotated axes. So add back this rotation component.
+ */
+ object_to_mat4(ob, diff_mat);
+ normalize_m4(diff_mat);
+ zero_v3(diff_mat[3]);
+
+ copy_m4_m4(tempmat, mat);
+ mul_m4_m4m4(mat, tempmat, diff_mat);
+ }
}
}
}
@@ -399,7 +423,7 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4
/* ------------ General Target Matrix Tools ---------- */
/* function that sets the given matrix based on given vertex group in mesh */
-static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, float mat[][4])
+static void contarget_get_mesh_mat (Scene *scene, Object *ob, const char *substring, float mat[][4])
{
DerivedMesh *dm = NULL;
Mesh *me= ob->data;
@@ -502,7 +526,7 @@ static void contarget_get_mesh_mat (Scene *scene, Object *ob, char *substring, f
}
/* function that sets the given matrix based on given vertex group in lattice */
-static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][4])
+static void contarget_get_lattice_mat (Object *ob, const char *substring, float mat[][4])
{
Lattice *lt= (Lattice *)ob->data;
@@ -560,7 +584,7 @@ static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][
/* generic function to get the appropriate matrix for most target cases */
/* The cases where the target can be object data have not been implemented */
-static void constraint_target_to_mat4 (Scene *scene, Object *ob, char *substring, float mat[][4], short from, short to, float headtail)
+static void constraint_target_to_mat4 (Scene *scene, Object *ob, const char *substring, float mat[][4], short from, short to, float headtail)
{
/* Case OBJECT */
if (!strlen(substring)) {
@@ -657,7 +681,7 @@ static bConstraintTypeInfo CTI_CONSTRNAME = {
/* This function should be used for the get_target_matrix member of all
* constraints that are not picky about what happens to their target matrix.
*/
-static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct))
constraint_target_to_mat4(cob->scene, ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
@@ -676,7 +700,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
\
ct->tar= datatar; \
- strcpy(ct->subtarget, datasubtarget); \
+ BLI_strncpy(ct->subtarget, datasubtarget, sizeof(ct->subtarget)); \
ct->space= con->tarspace; \
ct->flag= CONSTRAINT_TAR_TEMP; \
\
@@ -730,7 +754,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain
bConstraintTarget *ctn = ct->next; \
if (nocopy == 0) { \
datatar= ct->tar; \
- strcpy(datasubtarget, ct->subtarget); \
+ BLI_strncpy(datasubtarget, ct->subtarget, sizeof(datasubtarget)); \
con->tarspace= (char)ct->space; \
} \
\
@@ -812,50 +836,75 @@ static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* only evaluate if there is a target */
if (VALID_CONS_TARGET(ct)) {
- float parmat[4][4], invmat[4][4], tempmat[4][4];
- float loc[3], eul[3], size[3];
- float loco[3], eulo[3], sizo[3];
-
- /* get offset (parent-inverse) matrix */
- copy_m4_m4(invmat, data->invmat);
-
- /* extract components of both matrices */
- copy_v3_v3(loc, ct->matrix[3]);
- mat4_to_eulO(eul, ct->rotOrder, ct->matrix);
- mat4_to_size(size, ct->matrix);
-
- copy_v3_v3(loco, invmat[3]);
- mat4_to_eulO(eulo, cob->rotOrder, invmat);
- mat4_to_size(sizo, invmat);
-
- /* disable channels not enabled */
- if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f;
- if (!(data->flag & CHILDOF_LOCY)) loc[1]= loco[1]= 0.0f;
- if (!(data->flag & CHILDOF_LOCZ)) loc[2]= loco[2]= 0.0f;
- if (!(data->flag & CHILDOF_ROTX)) eul[0]= eulo[0]= 0.0f;
- if (!(data->flag & CHILDOF_ROTY)) eul[1]= eulo[1]= 0.0f;
- if (!(data->flag & CHILDOF_ROTZ)) eul[2]= eulo[2]= 0.0f;
- if (!(data->flag & CHILDOF_SIZEX)) size[0]= sizo[0]= 1.0f;
- if (!(data->flag & CHILDOF_SIZEY)) size[1]= sizo[1]= 1.0f;
- if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
-
- /* make new target mat and offset mat */
- loc_eulO_size_to_mat4(ct->matrix, loc, eul, size, ct->rotOrder);
- loc_eulO_size_to_mat4(invmat, loco, eulo, sizo, cob->rotOrder);
-
- /* multiply target (parent matrix) by offset (parent inverse) to get
- * the effect of the parent that will be exherted on the owner
- */
- mul_m4_m4m4(parmat, invmat, ct->matrix);
+ float parmat[4][4];
- /* now multiply the parent matrix by the owner matrix to get the
- * the effect of this constraint (i.e. owner is 'parented' to parent)
- */
- copy_m4_m4(tempmat, cob->matrix);
- mul_m4_m4m4(cob->matrix, tempmat, parmat);
+ /* simple matrix parenting */
+ if(data->flag == CHILDOF_ALL) {
+
+ /* multiply target (parent matrix) by offset (parent inverse) to get
+ * the effect of the parent that will be exherted on the owner
+ */
+ mul_m4_m4m4(parmat, data->invmat, ct->matrix);
+
+ /* now multiply the parent matrix by the owner matrix to get the
+ * the effect of this constraint (i.e. owner is 'parented' to parent)
+ */
+ mul_m4_m4m4(cob->matrix, cob->matrix, parmat);
+ }
+ else {
+ float invmat[4][4], tempmat[4][4];
+ float loc[3], eul[3], size[3];
+ float loco[3], eulo[3], sizo[3];
+
+ /* get offset (parent-inverse) matrix */
+ copy_m4_m4(invmat, data->invmat);
+
+ /* extract components of both matrices */
+ copy_v3_v3(loc, ct->matrix[3]);
+ mat4_to_eulO(eul, ct->rotOrder, ct->matrix);
+ mat4_to_size(size, ct->matrix);
+
+ copy_v3_v3(loco, invmat[3]);
+ mat4_to_eulO(eulo, cob->rotOrder, invmat);
+ mat4_to_size(sizo, invmat);
+
+ /* disable channels not enabled */
+ if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCY)) loc[1]= loco[1]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCZ)) loc[2]= loco[2]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTX)) eul[0]= eulo[0]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTY)) eul[1]= eulo[1]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTZ)) eul[2]= eulo[2]= 0.0f;
+ if (!(data->flag & CHILDOF_SIZEX)) size[0]= sizo[0]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEY)) size[1]= sizo[1]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
+
+ /* make new target mat and offset mat */
+ loc_eulO_size_to_mat4(ct->matrix, loc, eul, size, ct->rotOrder);
+ loc_eulO_size_to_mat4(invmat, loco, eulo, sizo, cob->rotOrder);
+
+ /* multiply target (parent matrix) by offset (parent inverse) to get
+ * the effect of the parent that will be exherted on the owner
+ */
+ mul_m4_m4m4(parmat, invmat, ct->matrix);
+
+ /* now multiply the parent matrix by the owner matrix to get the
+ * the effect of this constraint (i.e. owner is 'parented' to parent)
+ */
+ copy_m4_m4(tempmat, cob->matrix);
+ mul_m4_m4m4(cob->matrix, tempmat, parmat);
+
+ /* without this, changes to scale and rotation can change location
+ * of a parentless bone or a disconnected bone. Even though its set
+ * to zero above. */
+ if (!(data->flag & CHILDOF_LOCX)) cob->matrix[3][0]= tempmat[3][0];
+ if (!(data->flag & CHILDOF_LOCY)) cob->matrix[3][1]= tempmat[3][1];
+ if (!(data->flag & CHILDOF_LOCZ)) cob->matrix[3][2]= tempmat[3][2];
+ }
}
}
+/* XXX note, con->flag should be CONSTRAINT_SPACEONCE for bone-childof, patched in readfile.c */
static bConstraintTypeInfo CTI_CHILDOF = {
CONSTRAINT_TYPE_CHILDOF, /* type */
sizeof(bChildOfConstraint), /* size */
@@ -1102,7 +1151,7 @@ static void kinematic_flush_tars (bConstraint *con, ListBase *list, short nocopy
}
}
-static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bKinematicConstraint *data= con->data;
@@ -1190,19 +1239,18 @@ static void followpath_flush_tars (bConstraint *con, ListBase *list, short nocop
}
}
-static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bFollowPathConstraint *data= con->data;
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
- float q[4], vec[4], dir[3], quat[4], radius, x1;
- float totmat[4][4];
+ float vec[4], dir[3], radius;
+ float totmat[4][4]= MAT4_UNITY;
float curvetime;
-
- unit_m4(totmat);
+
unit_m4(ct->matrix);
-
+
/* note: when creating constraints that follow path, the curve gets the CU_PATH set now,
* currently for paths to work it needs to go through the bevlist/displist system (ton)
*/
@@ -1212,7 +1260,8 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
makeDispListCurveTypes(cob->scene, ct->tar, 0);
if (cu->path && cu->path->data) {
- if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
+ float quat[4];
+ if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
/* animated position along curve depending on time */
if (cob->scene)
curvetime= bsystem_time(cob->scene, ct->tar, cu->ctime, 0.0) - data->offset;
@@ -1233,8 +1282,10 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
curvetime= data->offset_fac;
}
- if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, &radius, NULL) ) {
+ if ( where_on_path(ct->tar, curvetime, vec, dir, (data->followflag & FOLLOWPATH_FOLLOW) ? quat : NULL, &radius, NULL) ) { /* quat_pt is quat or NULL*/
if (data->followflag & FOLLOWPATH_FOLLOW) {
+#if 0
+ float x1, q[4];
vec_to_quat(quat, dir, (short)data->trackflag, (short)data->upflag);
normalize_v3(dir);
@@ -1244,10 +1295,13 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
q[2]= -x1*dir[1];
q[3]= -x1*dir[2];
mul_qt_qtqt(quat, q, quat);
-
+#else
+ quat_apply_track(quat, data->trackflag, data->upflag);
+#endif
+
quat_to_mat4(totmat, quat);
}
-
+
if (data->followflag & FOLLOWPATH_RADIUS) {
float tmat[4][4], rmat[4][4];
scale_m4_fl(tmat, radius);
@@ -1319,7 +1373,7 @@ static bConstraintTypeInfo CTI_FOLLOWPATH = {
/* --------- Limit Location --------- */
-static void loclimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void loclimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bLocLimitConstraint *data = con->data;
@@ -1367,7 +1421,7 @@ static bConstraintTypeInfo CTI_LOCLIMIT = {
/* -------- Limit Rotation --------- */
-static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bRotLimitConstraint *data = con->data;
float loc[3];
@@ -1376,9 +1430,9 @@ static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
copy_v3_v3(loc, cob->matrix[3]);
mat4_to_size(size, cob->matrix);
-
+
mat4_to_eulO(eul, cob->rotOrder, cob->matrix);
-
+
/* constraint data uses radians internally */
/* limiting of euler values... */
@@ -1426,7 +1480,7 @@ static bConstraintTypeInfo CTI_ROTLIMIT = {
/* --------- Limit Scaling --------- */
-static void sizelimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void sizelimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bSizeLimitConstraint *data = con->data;
float obsize[3], size[3];
@@ -1631,8 +1685,9 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
mat4_to_size(size, cob->matrix);
/* to allow compatible rotations, must get both rotations in the order of the owner... */
- mat4_to_eulO(eul, cob->rotOrder, ct->matrix);
mat4_to_eulO(obeul, cob->rotOrder, cob->matrix);
+ /* we must get compatible eulers from the beginning because some of them can be modified below (see bug #21875) */
+ mat4_to_compatible_eulO(eul, obeul, cob->rotOrder, ct->matrix);
if ((data->flag & ROTLIKE_X)==0)
eul[0] = obeul[0];
@@ -1664,6 +1719,7 @@ static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
eul[2] *= -1;
}
+ /* good to make eulers compatible again, since we don't know how much they were changed above */
compatible_eul(eul, obeul);
loc_eulO_size_to_mat4(cob->matrix, loc, eul, size, cob->rotOrder);
}
@@ -1818,7 +1874,7 @@ static void translike_flush_tars (bConstraint *con, ListBase *list, short nocopy
}
}
-static void translike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void translike_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -1854,7 +1910,7 @@ static void samevolume_new_data (void *cdata)
data->volume = 1.0f;
}
-static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *UNUSED(targets))
{
bSameVolumeConstraint *data= con->data;
@@ -1968,9 +2024,9 @@ static void pycon_id_looper (bConstraint *con, ConstraintIDFunc func, void *user
}
/* Whether this approach is maintained remains to be seen (aligorith) */
-static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bPythonConstraint *data= con->data;
#endif
@@ -1990,7 +2046,7 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
constraint_target_to_mat4(cob->scene, ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
/* only execute target calculation if allowed */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (G.f & G_SCRIPT_AUTOEXEC)
BPY_pyconstraint_target(data, ct);
#endif
@@ -2001,7 +2057,8 @@ static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintT
static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)con; (void)cob; (void)targets; /* unused */
return;
#else
bPythonConstraint *data= con->data;
@@ -2019,8 +2076,8 @@ static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targ
#endif
/* Now, run the actual 'constraint' function, which should only access the matrices */
- BPY_pyconstraint_eval(data, cob, targets);
-#endif /* DISABLE_PYTHON */
+ BPY_pyconstraint_exec(data, cob, targets);
+#endif /* WITH_PYTHON */
}
static bConstraintTypeInfo CTI_PYTHON = {
@@ -2092,9 +2149,8 @@ static void actcon_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
- extern void chan_calc_mat(bPoseChannel *chan);
bActionConstraint *data = con->data;
if (VALID_CONS_TARGET(ct)) {
@@ -2162,7 +2218,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint
what_does_obaction(cob->scene, cob->ob, &workob, pose, data->act, pchan->name, t);
/* convert animation to matrices for use here */
- chan_calc_mat(tchan);
+ pchan_calc_mat(tchan);
copy_m4_m4(ct->matrix, tchan->chan_mat);
/* Clean up */
@@ -2183,7 +2239,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint
}
}
-static void actcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void actcon_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -2983,6 +3039,7 @@ static void rbj_id_looper (bConstraint *con, ConstraintIDFunc func, void *userda
/* target only */
func(con, (ID**)&data->tar, userdata);
+ func(con, (ID**)&data->child, userdata);
}
static int rbj_get_tars (bConstraint *con, ListBase *list)
@@ -3063,7 +3120,7 @@ static void clampto_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void clampto_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void clampto_get_tarmat (bConstraint *UNUSED(con), bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
@@ -3092,11 +3149,11 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta
/* only evaluate if there is a target and it is a curve */
if (VALID_CONS_TARGET(ct) && (ct->tar->type == OB_CURVE)) {
Curve *cu= data->tar->data;
- float obmat[4][4], targetMatrix[4][4], ownLoc[3];
+ float obmat[4][4], ownLoc[3];
float curveMin[3], curveMax[3];
+ float targetMatrix[4][4]= MAT4_UNITY;
copy_m4_m4(obmat, cob->matrix);
- unit_m4(targetMatrix);
copy_v3_v3(ownLoc, obmat[3]);
INIT_MINMAX(curveMin, curveMax)
@@ -3397,7 +3454,7 @@ static void shrinkwrap_flush_tars (bConstraint *con, ListBase *list, short nocop
}
-static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
bShrinkwrapConstraint *scon = (bShrinkwrapConstraint *) con->data;
@@ -3409,12 +3466,11 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
float dist;
SpaceTransform transform;
- DerivedMesh *target = object_get_derived_final(cob->scene, ct->tar, CD_MASK_BAREMESH);
+ DerivedMesh *target = object_get_derived_final(ct->tar);
BVHTreeRayHit hit;
BVHTreeNearest nearest;
- BVHTreeFromMesh treeData;
- memset(&treeData, 0, sizeof(treeData));
+ BVHTreeFromMesh treeData= {NULL};
nearest.index = -1;
nearest.dist = FLT_MAX;
@@ -3449,7 +3505,9 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
dist = len_v3v3(co, nearest.co);
- interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */
+ if(dist != 0.0f) {
+ interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist)/dist); /* linear interpolation */
+ }
space_transform_invert(&transform, co);
break;
@@ -3500,7 +3558,7 @@ static void shrinkwrap_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
}
}
-static void shrinkwrap_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+static void shrinkwrap_evaluate (bConstraint *UNUSED(con), bConstraintOb *cob, ListBase *targets)
{
bConstraintTarget *ct= targets->first;
@@ -3716,7 +3774,7 @@ static void splineik_flush_tars (bConstraint *con, ListBase *list, short nocopy)
}
}
-static void splineik_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+static void splineik_get_tarmat (bConstraint *UNUSED(con), bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime))
{
if (VALID_CONS_TARGET(ct)) {
Curve *cu= ct->tar->data;
@@ -3796,6 +3854,9 @@ static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
float pivot[3], vec[3];
float rotMat[3][3];
+
+ /* pivot correction */
+ float axis[3], angle;
/* firstly, check if pivoting should take place based on the current rotation */
if (data->rotAxis != PIVOTCON_AXIS_NONE) {
@@ -3838,10 +3899,20 @@ static void pivotcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *t
// TODO: perhaps we might want to include scaling based on the pivot too?
copy_m3_m4(rotMat, cob->matrix);
normalize_m3(rotMat);
-
+
+
+ /* correct the pivot by the rotation axis otherwise the pivot translates when it shouldnt */
+ mat3_to_axis_angle(axis, &angle, rotMat);
+ if(angle) {
+ float dvec[3];
+ sub_v3_v3v3(vec, pivot, cob->matrix[3]);
+ project_v3_v3v3(dvec, vec, axis);
+ sub_v3_v3(pivot, dvec);
+ }
+
/* perform the pivoting... */
/* 1. take the vector from owner to the pivot */
- sub_v3_v3v3(vec, pivot, cob->matrix[3]);
+ sub_v3_v3v3(vec, cob->matrix[3], pivot);
/* 2. rotate this vector by the rotation of the object... */
mul_m3_v3(rotMat, vec);
/* 3. make the rotation in terms of the pivot now */
@@ -3875,7 +3946,7 @@ static bConstraintTypeInfo *constraintsTypeInfo[NUM_CONSTRAINT_TYPES];
static short CTI_INIT= 1; /* when non-zero, the list needs to be updated */
/* This function only gets called when CTI_INIT is non-zero */
-static void constraints_init_typeinfo () {
+static void constraints_init_typeinfo (void) {
constraintsTypeInfo[0]= NULL; /* 'Null' Constraint */
constraintsTypeInfo[1]= &CTI_CHILDOF; /* ChildOf Constraint */
constraintsTypeInfo[2]= &CTI_TRACKTO; /* TrackTo Constraint */
@@ -4078,6 +4149,21 @@ static bConstraint *add_new_constraint (Object *ob, bPoseChannel *pchan, const c
constraints_set_active(list, con);
}
+ /* set type+owner specific immutable settings */
+ // TODO: does action constraint need anything here - i.e. spaceonce?
+ switch (type) {
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ /* if this constraint is being added to a posechannel, make sure
+ * the constraint gets evaluated in pose-space */
+ if (pchan) {
+ con->ownspace = CONSTRAINT_SPACE_POSE;
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
+ }
+ break;
+ }
+
return con;
}
@@ -4148,7 +4234,7 @@ void id_loop_constraints (ListBase *conlist, ConstraintIDFunc func, void *userda
/* ......... */
/* helper for copy_constraints(), to be used for making sure that ID's are valid */
-static void con_extern_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void con_extern_cb(bConstraint *UNUSED(con), ID **idpoin, void *UNUSED(userData))
{
if (*idpoin && (*idpoin)->lib)
id_lib_extern(*idpoin);
@@ -4351,8 +4437,7 @@ void get_constraint_target_matrix (struct Scene *scene, bConstraint *con, int n,
void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
{
bConstraint *con;
- float solution[4][4], delta[4][4];
- float oldmat[4][4], imat[4][4];
+ float oldmat[4][4];
float enf;
/* check that there is a valid constraint object to evaluate */
@@ -4404,7 +4489,7 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
}
}
- /* Solve the constraint */
+ /* Solve the constraint and put result in cob->matrix */
cti->evaluate_constraint(con, cob, &targets);
/* clear targets after use
@@ -4416,23 +4501,13 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
}
/* Interpolate the enforcement, to blend result of constraint into final owner transform */
- /* 1. Remove effects of original matrix from constraint solution ==> delta */
- invert_m4_m4(imat, oldmat);
- copy_m4_m4(solution, cob->matrix);
- mul_m4_m4m4(delta, solution, imat);
-
- /* 2. If constraint influence is not full strength, then interpolate
- * identity_matrix --> delta_matrix to get the effect the constraint actually exerts
- */
+ /* Note: all kind of stuff here before (caused trouble), much easier to just interpolate, or did I miss something? -jahka */
if (enf < 1.0) {
- float identity[4][4];
- unit_m4(identity);
- blend_m4_m4m4(delta, identity, delta, enf);
+ float solution[4][4];
+ copy_m4_m4(solution, cob->matrix);
+ blend_m4_m4m4(cob->matrix, oldmat, solution, enf);
}
- /* 3. Now multiply the delta by the matrix in use before the evaluation */
- mul_m4_m4m4(cob->matrix, delta, oldmat);
-
/* move owner back into worldspace for next constraint/other business */
if ((con->flag & CONSTRAINT_SPACEONCE) == 0)
constraint_mat_convertspace(cob->ob, cob->pchan, cob->matrix, con->ownspace, CONSTRAINT_SPACE_WORLD);
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 4b1ea2809bc..6f7188115e0 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -52,8 +52,10 @@
#endif
#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
+#endif
/* struct */
@@ -69,6 +71,7 @@ struct bContext {
struct ARegion *region;
struct ARegion *menu;
struct bContextStore *store;
+ const char *operator_poll_msg; /* reason for poll failing */
} wm;
/* data context */
@@ -95,7 +98,7 @@ struct bContext {
/* context */
-bContext *CTX_create()
+bContext *CTX_create(void)
{
bContext *C;
@@ -174,7 +177,7 @@ void CTX_free(bContext *C)
/* store */
-bContextStore *CTX_store_add(ListBase *contexts, char *name, PointerRNA *ptr)
+bContextStore *CTX_store_add(ListBase *contexts, const char *name, PointerRNA *ptr)
{
bContextStoreEntry *entry;
bContextStore *ctx, *lastctx;
@@ -245,7 +248,7 @@ void CTX_py_init_set(bContext *C, int value)
C->data.py_init= value;
}
-void *CTX_py_dict_get(bContext *C)
+void *CTX_py_dict_get(const bContext *C)
{
return C->data.py_context;
}
@@ -466,6 +469,16 @@ void CTX_wm_menu_set(bContext *C, ARegion *menu)
C->wm.menu= menu;
}
+void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
+{
+ C->wm.operator_poll_msg= msg;
+}
+
+const char *CTX_wm_operator_poll_msg_get(bContext *C)
+{
+ return C->wm.operator_poll_msg;
+}
+
/* data context utility functions */
struct bContextDataResult {
@@ -481,10 +494,10 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
int ret= 0;
memset(result, 0, sizeof(bContextDataResult));
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(CTX_py_dict_get(C)) {
- return BPY_context_get(C, member, result);
-// if (BPY_context_get(C, member, result))
+ return BPY_context_member_get(C, member, result);
+// if (BPY_context_member_get(C, member, result))
// return 1;
}
#endif
@@ -610,8 +623,7 @@ ListBase CTX_data_collection_get(const bContext *C, const char *member)
return result.list;
}
else {
- ListBase list;
- memset(&list, 0, sizeof(list));
+ ListBase list= {NULL, NULL};
return list;
}
}
@@ -830,7 +842,7 @@ int CTX_data_mode_enum(const bContext *C)
/* would prefer if we can use the enum version below over this one - Campbell */
/* must be aligned with above enum */
-static char *data_mode_strings[] = {
+static const char *data_mode_strings[] = {
"mesh_edit",
"curve_edit",
"surface_edit",
@@ -845,9 +857,9 @@ static char *data_mode_strings[] = {
"texturepaint",
"particlemode",
"objectmode",
- 0
+ NULL
};
-char *CTX_data_mode_string(const bContext *C)
+const char *CTX_data_mode_string(const bContext *C)
{
return data_mode_strings[CTX_data_mode_enum(C)];
}
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 5f5958f8893..67e988249f5 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -35,8 +35,10 @@
#include <stdlib.h>
#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_material_types.h"
@@ -58,7 +60,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h" // VECCOPY
+
#include "ED_curve.h"
@@ -75,12 +77,22 @@ void unlink_curve(Curve *cu)
for(a=0; a<cu->totcol; a++) {
if(cu->mat[a]) cu->mat[a]->id.us--;
- cu->mat[a]= 0;
+ cu->mat[a]= NULL;
}
if(cu->vfont) cu->vfont->id.us--;
- cu->vfont= 0;
+ cu->vfont= NULL;
+
+ if(cu->vfontb) cu->vfontb->id.us--;
+ cu->vfontb= NULL;
+
+ if(cu->vfonti) cu->vfonti->id.us--;
+ cu->vfonti= NULL;
+
+ if(cu->vfontbi) cu->vfontbi->id.us--;
+ cu->vfontbi= NULL;
+
if(cu->key) cu->key->id.us--;
- cu->key= 0;
+ cu->key= NULL;
}
/* frees editcurve entirely */
@@ -121,7 +133,7 @@ void free_curve(Curve *cu)
if(cu->tb) MEM_freeN(cu->tb);
}
-Curve *add_curve(char *name, int type)
+Curve *add_curve(const char *name, int type)
{
Curve *cu;
@@ -130,7 +142,7 @@ Curve *add_curve(char *name, int type)
cu->size[0]= cu->size[1]= cu->size[2]= 1.0;
cu->flag= CU_FRONT|CU_BACK|CU_DEFORM_BOUNDS_OFF|CU_PATH_RADIUS;
cu->pathlen= 100;
- cu->resolu= cu->resolv= 12;
+ cu->resolu= cu->resolv= (type == OB_SURF) ? 4 : 12;
cu->width= 1.0;
cu->wordspace = 1.0;
cu->spacing= cu->linedist= 1.0;
@@ -146,7 +158,7 @@ Curve *add_curve(char *name, int type)
cu->vfont= cu->vfontb= cu->vfonti= cu->vfontbi= get_builtin_font();
cu->vfont->id.us+=4;
cu->str= MEM_mallocN(12, "str");
- strcpy(cu->str, "Text");
+ BLI_strncpy(cu->str, "Text", 12);
cu->len= cu->pos= 4;
cu->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo new");
cu->totbox= cu->actbox= 1;
@@ -163,7 +175,7 @@ Curve *copy_curve(Curve *cu)
int a;
cun= copy_libblock(cu);
- cun->nurb.first= cun->nurb.last= 0;
+ cun->nurb.first= cun->nurb.last= NULL;
duplicateNurblist( &(cun->nurb), &(cu->nurb));
cun->mat= MEM_dupallocN(cu->mat);
@@ -179,9 +191,9 @@ Curve *copy_curve(Curve *cu)
cun->key= copy_key(cu->key);
if(cun->key) cun->key->from= (ID *)cun;
- cun->disp.first= cun->disp.last= 0;
- cun->bev.first= cun->bev.last= 0;
- cun->path= 0;
+ cun->disp.first= cun->disp.last= NULL;
+ cun->bev.first= cun->bev.last= NULL;
+ cun->path= NULL;
cun->editnurb= NULL;
cun->editfont= NULL;
@@ -201,7 +213,7 @@ Curve *copy_curve(Curve *cu)
void make_local_curve(Curve *cu)
{
- Object *ob = 0;
+ Object *ob = NULL;
Curve *cun;
int local=0, lib=0;
@@ -210,14 +222,17 @@ void make_local_curve(Curve *cu)
* - mixed: do a copy
*/
- if(cu->id.lib==0) return;
-
- if(cu->vfont) cu->vfont->id.lib= 0;
-
+ if(cu->id.lib==NULL) return;
+
+ if(cu->vfont) cu->vfont->id.lib= NULL;
+ if(cu->vfontb) cu->vfontb->id.lib= NULL;
+ if(cu->vfonti) cu->vfonti->id.lib= NULL;
+ if(cu->vfontbi) cu->vfontbi->id.lib= NULL;
+
if(cu->id.us==1) {
- cu->id.lib= 0;
+ cu->id.lib= NULL;
cu->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cu, 0);
+ new_id(NULL, (ID *)cu, NULL);
return;
}
@@ -231,9 +246,9 @@ void make_local_curve(Curve *cu)
}
if(local && lib==0) {
- cu->id.lib= 0;
+ cu->id.lib= NULL;
cu->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cu, 0);
+ new_id(NULL, (ID *)cu, NULL);
}
else if(local && lib) {
cun= copy_curve(cu);
@@ -243,7 +258,7 @@ void make_local_curve(Curve *cu)
while(ob) {
if(ob->data==cu) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= cun;
cun->id.us++;
cu->id.us--;
@@ -367,12 +382,12 @@ int count_curveverts_without_handles(ListBase *nurb)
void freeNurb(Nurb *nu)
{
- if(nu==0) return;
+ if(nu==NULL) return;
if(nu->bezt) MEM_freeN(nu->bezt);
- nu->bezt= 0;
+ nu->bezt= NULL;
if(nu->bp) MEM_freeN(nu->bp);
- nu->bp= 0;
+ nu->bp= NULL;
if(nu->knotsu) MEM_freeN(nu->knotsu);
nu->knotsu= NULL;
if(nu->knotsv) MEM_freeN(nu->knotsv);
@@ -388,7 +403,7 @@ void freeNurblist(ListBase *lb)
{
Nurb *nu, *next;
- if(lb==0) return;
+ if(lb==NULL) return;
nu= lb->first;
while(nu) {
@@ -396,7 +411,7 @@ void freeNurblist(ListBase *lb)
freeNurb(nu);
nu= next;
}
- lb->first= lb->last= 0;
+ lb->first= lb->last= NULL;
}
Nurb *duplicateNurb(Nurb *nu)
@@ -405,7 +420,7 @@ Nurb *duplicateNurb(Nurb *nu)
int len;
newnu= (Nurb*)MEM_mallocN(sizeof(Nurb),"duplicateNurb");
- if(newnu==0) return 0;
+ if(newnu==NULL) return NULL;
memcpy(newnu, nu, sizeof(Nurb));
if(nu->bezt) {
@@ -601,7 +616,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
{
int a, b, order2, c;
- if(knots==0) return;
+ if(knots==NULL) return;
order2=order-1;
@@ -624,7 +639,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
-void makeknots(Nurb *nu, short uv)
+static void makeknots(Nurb *nu, short uv)
{
if(nu->type == CU_NURBS) {
if(uv == 1) {
@@ -656,6 +671,16 @@ void makeknots(Nurb *nu, short uv)
}
}
+void nurbs_knot_calc_u(Nurb *nu)
+{
+ makeknots(nu, 1);
+}
+
+void nurbs_knot_calc_v(Nurb *nu)
+{
+ makeknots(nu, 2);
+}
+
static void basisNurb(float t, short order, short pnts, float *knots, float *basis, int *start, int *end)
{
float d, e;
@@ -719,16 +744,16 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas
}
-void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
+void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv)
/* coord_array has to be 3*4*resolu*resolv in size, and zero-ed */
{
BPoint *bp;
float *basisu, *basis, *basisv, *sum, *fp, *in;
float u, v, ustart, uend, ustep, vstart, vend, vstep, sumdiv;
- int i, j, iofs, jofs, cycl, len, resolu, resolv;
+ int i, j, iofs, jofs, cycl, len, curu, curv;
int istart, iend, jsta, jen, *jstart, *jend, ratcomp;
- int totu = nu->pntsu*nu->resolu, totv = nu->pntsv*nu->resolv;
+ int totu = nu->pntsu*resolu, totv = nu->pntsv*resolv;
if(nu->knotsu==NULL || nu->knotsv==NULL) return;
if(nu->orderu>nu->pntsu) return;
@@ -785,9 +810,9 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
else cycl= 0;
v= vstart;
basis= basisv;
- resolv= totv;
- while(resolv--) {
- basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+resolv, jend+resolv);
+ curv= totv;
+ while(curv--) {
+ basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+curv, jend+curv);
basis+= KNOTSV(nu);
v+= vstep;
}
@@ -796,17 +821,17 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride)
else cycl= 0;
in= coord_array;
u= ustart;
- resolu= totu;
- while(resolu--) {
+ curu= totu;
+ while(curu--) {
basisNurb(u, nu->orderu, (short)(nu->pntsu+cycl), nu->knotsu, basisu, &istart, &iend);
basis= basisv;
- resolv= totv;
- while(resolv--) {
+ curv= totv;
+ while(curv--) {
- jsta= jstart[resolv];
- jen= jend[resolv];
+ jsta= jstart[curv];
+ jen= jend[curv];
/* calculate sum */
sumdiv= 0.0;
@@ -894,7 +919,7 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
if(nu->knotsu==NULL) return;
if(nu->orderu>nu->pntsu) return;
- if(coord_array==0) return;
+ if(coord_array==NULL) return;
/* allocate and initialize */
len= nu->pntsu;
@@ -1034,10 +1059,13 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float
float *make_orco_surf(Object *ob)
{
+ /* Note: this function is used in convertblender only atm, so
+ * suppose nonzero curve's render resolution should always be used */
Curve *cu= ob->data;
Nurb *nu;
int a, b, tot=0;
int sizeu, sizev;
+ int resolu, resolv;
float *fp, *coord_array;
/* first calculate the size of the datablock */
@@ -1051,9 +1079,12 @@ float *make_orco_surf(Object *ob)
See also convertblender.c: init_render_surf()
*/
+
+ resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu;
+ resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv;
- sizeu = nu->pntsu*nu->resolu;
- sizev = nu->pntsv*nu->resolv;
+ sizeu = nu->pntsu*resolu;
+ sizev = nu->pntsv*resolv;
if (nu->flagu & CU_NURB_CYCLIC) sizeu++;
if (nu->flagv & CU_NURB_CYCLIC) sizev++;
if(nu->pntsv>1) tot+= sizeu * sizev;
@@ -1065,9 +1096,12 @@ float *make_orco_surf(Object *ob)
nu= cu->nurb.first;
while(nu) {
+ resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu;
+ resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv;
+
if(nu->pntsv>1) {
- sizeu = nu->pntsu*nu->resolu;
- sizev = nu->pntsv*nu->resolv;
+ sizeu = nu->pntsu*resolu;
+ sizev = nu->pntsv*resolv;
if (nu->flagu & CU_NURB_CYCLIC) sizeu++;
if (nu->flagv & CU_NURB_CYCLIC) sizev++;
@@ -1088,10 +1122,10 @@ float *make_orco_surf(Object *ob)
}
}
else {
- float *_tdata= MEM_callocN((nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv) *3*sizeof(float), "temp data");
+ float *_tdata= MEM_callocN((nu->pntsu*resolu) * (nu->pntsv*resolv) *3*sizeof(float), "temp data");
float *tdata= _tdata;
- makeNurbfaces(nu, tdata, 0);
+ makeNurbfaces(nu, tdata, 0, resolu, resolv);
for(b=0; b<sizeu; b++) {
int use_b= b;
@@ -1103,7 +1137,7 @@ float *make_orco_surf(Object *ob)
if (a==sizev-1 && (nu->flagv & CU_NURB_CYCLIC))
use_a= 0;
- tdata = _tdata + 3 * (use_b * (nu->pntsv*nu->resolv) + use_a);
+ tdata = _tdata + 3 * (use_b * (nu->pntsv*resolv) + use_a);
fp[0]= (tdata[0]-cu->loc[0])/cu->size[0];
fp[1]= (tdata[1]-cu->loc[1])/cu->size[1];
@@ -1181,8 +1215,8 @@ float *make_orco_curve(Scene *scene, Object *ob)
for (u=0; u<sizev; u++) {
for (v=0; v<sizeu; v++,fp+=3) {
if (cu->flag & CU_UV_ORCO) {
- fp[0]= 2.0f*u/(dl->parts-1) - 1.0f;
- fp[1]= 2.0f*v/(dl->nr-1) - 1.0f;
+ fp[0]= 2.0f*u/(sizev - 1) - 1.0f;
+ fp[1]= 2.0f*v/(sizeu - 1) - 1.0f;
fp[2]= 0.0;
} else {
float *vert;
@@ -1235,10 +1269,10 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0);
dl= bevdisp.first;
} else {
- dl= bevcu->disp.first;
- if(dl==0) {
+ dl= cu->bevobj->disp.first;
+ if(dl==NULL) {
makeDispListCurveTypes(scene, cu->bevobj, 0);
- dl= bevcu->disp.first;
+ dl= cu->bevobj->disp.first;
}
}
@@ -1713,7 +1747,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter)
if(bl->poly== -1) { /* check its not cyclic */
/* skip the first point */
- bevp0= bevp1;
+ /* bevp0= bevp1; */
bevp1= bevp2;
bevp2++;
nr--;
@@ -1744,7 +1778,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter)
normalize_qt(bevp1->quat);
- bevp0= bevp1;
+ /* bevp0= bevp1; */ /* UNUSED */
bevp1= bevp2;
bevp2++;
}
@@ -1778,8 +1812,6 @@ static void make_bevel_list_3D_minimum_twist(BevList *bl)
int nr;
float q[4];
- float cross_tmp[3];
-
bevel_list_calc_bisect(bl);
bevp2= (BevPoint *)(bl+1);
@@ -1796,6 +1828,7 @@ static void make_bevel_list_3D_minimum_twist(BevList *bl)
float angle= angle_normalized_v3v3(bevp0->dir, bevp1->dir);
if(angle > 0.0f) { /* otherwise we can keep as is */
+ float cross_tmp[3];
cross_v3_v3v3(cross_tmp, bevp0->dir, bevp1->dir);
axis_angle_to_quat(q, cross_tmp, angle);
mul_qt_qtqt(bevp1->quat, q, bevp0->quat);
@@ -1923,7 +1956,7 @@ static void make_bevel_list_3D_tangent(BevList *bl)
normalize_v3(cross_tmp);
tri_to_quat( bevp1->quat,zero, cross_tmp, bevp1->tan); /* XXX - could be faster */
- bevp0= bevp1;
+ /* bevp0= bevp1; */ /* UNUSED */
bevp1= bevp2;
bevp2++;
}
@@ -2393,7 +2426,7 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
p2= bezt->vec[1];
- if(prev==0) {
+ if(prev==NULL) {
p3= next->vec[1];
pt[0]= 2*p2[0]- p3[0];
pt[1]= 2*p2[1]- p3[1];
@@ -2402,7 +2435,7 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
}
else p1= prev->vec[1];
- if(next==0) {
+ if(next==NULL) {
pt[0]= 2*p2[0]- p1[0];
pt[1]= 2*p2[1]- p1[1];
pt[2]= 2*p2[2]- p1[2];
@@ -2583,7 +2616,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */
a= nu->pntsu;
bezt= nu->bezt;
if(nu->flagu & CU_NURB_CYCLIC) prev= bezt+(a-1);
- else prev= 0;
+ else prev= NULL;
next= bezt+1;
while(a--) {
@@ -2591,7 +2624,7 @@ void calchandlesNurb(Nurb *nu) /* first, if needed, set handle flags */
prev= bezt;
if(a==1) {
if(nu->flagu & CU_NURB_CYCLIC) next= nu->bezt;
- else next= 0;
+ else next= NULL;
}
else next++;
@@ -2650,7 +2683,7 @@ void autocalchandlesNurb(Nurb *nu, int flag)
BezTriple *bezt2, *bezt1, *bezt0;
int i, align, leftsmall, rightsmall;
- if(nu==0 || nu->bezt==0) return;
+ if(nu==NULL || nu->bezt==NULL) return;
bezt2 = nu->bezt;
bezt1 = bezt2 + (nu->pntsu-1);
@@ -2875,38 +2908,41 @@ void switchdirectionNurb(Nurb *nu)
bp2--;
}
if(nu->type == CU_NURBS) {
- /* inverse knots */
- a= KNOTSU(nu);
- fp1= nu->knotsu;
- fp2= fp1+(a-1);
- a/= 2;
- while(fp1!=fp2 && a>0) {
- SWAP(float, *fp1, *fp2);
- a--;
- fp1++;
- fp2--;
- }
- /* and make in increasing order again */
- a= KNOTSU(nu);
- fp1= nu->knotsu;
- fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect");
- while(a--) {
- fp2[0]= fabs(fp1[1]-fp1[0]);
- fp1++;
- fp2++;
- }
-
- a= KNOTSU(nu)-1;
- fp1= nu->knotsu;
- fp2= tempf;
- fp1[0]= 0.0;
- fp1++;
- while(a--) {
- fp1[0]= fp1[-1]+fp2[0];
+ /* no knots for too short paths */
+ if(nu->knotsu) {
+ /* inverse knots */
+ a= KNOTSU(nu);
+ fp1= nu->knotsu;
+ fp2= fp1+(a-1);
+ a/= 2;
+ while(fp1!=fp2 && a>0) {
+ SWAP(float, *fp1, *fp2);
+ a--;
+ fp1++;
+ fp2--;
+ }
+ /* and make in increasing order again */
+ a= KNOTSU(nu);
+ fp1= nu->knotsu;
+ fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect");
+ while(a--) {
+ fp2[0]= fabs(fp1[1]-fp1[0]);
+ fp1++;
+ fp2++;
+ }
+
+ a= KNOTSU(nu)-1;
+ fp1= nu->knotsu;
+ fp2= tempf;
+ fp1[0]= 0.0;
fp1++;
- fp2++;
+ while(a--) {
+ fp1[0]= fp1[-1]+fp2[0];
+ fp1++;
+ fp2++;
+ }
+ MEM_freeN(tempf);
}
- MEM_freeN(tempf);
}
}
else {
@@ -2929,7 +2965,7 @@ void switchdirectionNurb(Nurb *nu)
}
-float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
+float (*curve_getVertexCos(Curve *UNUSED(cu), ListBase *lb, int *numVerts_r))[3]
{
int i, numVerts = *numVerts_r = count_curveverts(lb);
float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
@@ -2957,7 +2993,7 @@ float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
return cos;
}
-void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
+void curve_applyVertexCos(Curve *UNUSED(cu), ListBase *lb, float (*vertexCos)[3])
{
float *co = vertexCos[0];
Nurb *nu;
@@ -2982,7 +3018,7 @@ void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
}
}
-float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
+float (*curve_getKeyVertexCos(Curve *UNUSED(cu), ListBase *lb, float *key))[3]
{
int i, numVerts = count_curveverts(lb);
float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
@@ -3013,7 +3049,7 @@ float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3]
return cos;
}
-void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key)
+void curve_applyKeyVertexTilts(Curve *UNUSED(cu), ListBase *lb, float *key)
{
Nurb *nu;
int i;
@@ -3025,7 +3061,7 @@ void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key)
for(i=0; i<nu->pntsu; i++,bezt++) {
key+=3*3;
bezt->alfa= *key;
- key++;
+ key+=3;
}
}
else {
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index b067001cb98..0612a57d85d 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -34,7 +34,8 @@
#include <math.h>
#include <string.h>
-#include "BLI_cellalloc.h"
+
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -42,13 +43,19 @@
#include "DNA_ID.h"
#include "BLI_blenlib.h"
+#include "BLI_path_util.h"
#include "BLI_linklist.h"
+#include "BLI_math.h"
#include "BLI_mempool.h"
+#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_customdata.h"
#include "BKE_customdata_file.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_utildefines.h"
+#include "BKE_multires.h"
#include "bmesh.h"
@@ -61,9 +68,9 @@
/********************* Layer type information **********************/
typedef struct LayerTypeInfo {
int size; /* the memory size of one element of this layer's data */
- char *structname; /* name of the struct used, for file writing */
+ const char *structname; /* name of the struct used, for file writing */
int structnum; /* number of structs per element, for file writing */
- char *defaultname; /* default layer name */
+ const char *defaultname; /* default layer name */
/* a function to copy count elements of this layer's data
* (deep copy if appropriate)
@@ -113,6 +120,11 @@ typedef struct LayerTypeInfo {
/* a function to determine file size */
size_t (*filesize)(CDataFile *cdf, void *data, int count);
+
+ /* a function to validate layer contents depending on
+ * sub-elements count
+ */
+ void (*validate)(void *source, int sub_elements);
} LayerTypeInfo;
static void layerCopy_mdeformvert(const void *source, void *dest,
@@ -158,7 +170,7 @@ static void linklist_free_simple(void *link)
}
static void layerInterp_mdeformvert(void **sources, float *weights,
- float *sub_weights, int count, void *dest)
+ float *UNUSED(sub_weights), int count, void *dest)
{
MDeformVert *dvert = dest;
LinkNode *dest_dw = NULL; /* a list of lists of MDeformWeight pointers */
@@ -216,7 +228,7 @@ static void layerInterp_mdeformvert(void **sources, float *weights,
static void layerInterp_msticky(void **sources, float *weights,
- float *sub_weights, int count, void *dest)
+ float *UNUSED(sub_weights), int count, void *dest)
{
float co[2], w;
MSticky *mst;
@@ -406,130 +418,149 @@ static void layerDefault_origspace_face(void *data, int count)
osf[i] = default_osf;
}
-#if 0
-/* Adapted from sculptmode.c */
-static void mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v)
-{
- int x, y, x2, y2;
- const int st_max = st - 1;
- float urat, vrat, uopp;
- float d[4][3], d2[2][3];
-
- if(u < 0)
- u = 0;
- else if(u >= st)
- u = st_max;
- if(v < 0)
- v = 0;
- else if(v >= st)
- v = st_max;
-
- x = floor(u);
- y = floor(v);
- x2 = x + 1;
- y2 = y + 1;
-
- if(x2 >= st) x2 = st_max;
- if(y2 >= st) y2 = st_max;
-
- urat = u - x;
- vrat = v - y;
- uopp = 1 - urat;
-
- copy_v3_v3(d[0], disps[y * st + x]);
- copy_v3_v3(d[1], disps[y * st + x2]);
- copy_v3_v3(d[2], disps[y2 * st + x]);
- copy_v3_v3(d[3], disps[y2 * st + x2]);
- mul_v3_fl(d[0], uopp);
- mul_v3_fl(d[1], urat);
- mul_v3_fl(d[2], uopp);
- mul_v3_fl(d[3], urat);
-
- add_v3_v3v3(d2[0], d[0], d[1]);
- add_v3_v3v3(d2[1], d[2], d[3]);
- mul_v3_fl(d2[0], 1 - vrat);
- mul_v3_fl(d2[1], vrat);
-
- add_v3_v3v3(out, d2[0], d2[1]);
-}
-#endif
-
-static int mdisp_corners(MDisps *s)
-{
- /* silly trick because we don't get it from callback */
- return (s->totdisp % (3*3) == 0)? 3: 4;
-}
-
static void layerSwap_mdisps(void *data, const int *ci)
{
MDisps *s = data;
float (*d)[3] = NULL;
int corners, cornersize, S;
- /* this function is untested .. */
- corners = mdisp_corners(s);
- cornersize = s->totdisp/corners;
+ if(s->disps) {
+ int nverts= (ci[1] == 3) ? 4 : 3; /* silly way to know vertex count of face */
+ corners= multires_mdisp_corners(s);
+ cornersize= s->totdisp/corners;
- d = MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+ if(corners!=nverts) {
+ /* happens when face changed vertex count in edit mode
+ if it happened, just forgot displacement */
- for(S = 0; S < corners; S++)
- memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
-
- if(s->disps)
+ MEM_freeN(s->disps);
+ s->totdisp= (s->totdisp/corners)*nverts;
+ s->disps= MEM_callocN(s->totdisp*sizeof(float)*3, "mdisp swap");
+ return;
+ }
+
+ d= MEM_callocN(sizeof(float) * 3 * s->totdisp, "mdisps swap");
+
+ for(S = 0; S < corners; S++)
+ memcpy(d + cornersize*S, s->disps + cornersize*ci[S], cornersize*3*sizeof(float));
+
MEM_freeN(s->disps);
- s->disps = d;
+ s->disps= d;
+ }
}
-static void layerInterp_mdisps(void **sources, float *weights, float *sub_weights,
- int count, void *dest)
+static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
+ float *sub_weights, int count, void *dest)
{
- // XXX
-#if 0
MDisps *d = dest;
MDisps *s = NULL;
int st, stl;
int i, x, y;
- float crn[4][2];
- float (*sw)[4] = NULL;
+ int side, S, dst_corners, src_corners;
+ float crn_weight[4][2];
+ float (*sw)[4] = (void*)sub_weights;
+ float (*disps)[3], (*out)[3];
- /* Initialize the destination */
- for(i = 0; i < d->totdisp; ++i) {
- float z[3] = {0,0,0};
- copy_v3_v3(d->disps[i], z);
+ /* happens when flipping normals of newly created mesh */
+ if(!d->totdisp)
+ return;
+
+ s = sources[0];
+ dst_corners = multires_mdisp_corners(d);
+ src_corners = multires_mdisp_corners(s);
+
+ if(sub_weights && count == 2 && src_corners == 3) {
+ src_corners = multires_mdisp_corners(sources[1]);
+
+ /* special case -- converting two triangles to quad */
+ if(src_corners == 3 && dst_corners == 4) {
+ MDisps tris[2];
+ int vindex[4] = {0};
+
+ S = 0;
+ for(i = 0; i < 2; i++)
+ for(y = 0; y < 4; y++)
+ for(x = 0; x < 4; x++)
+ if(sw[x+i*4][y])
+ vindex[x] = y;
+
+ for(i = 0; i < 2; i++) {
+ float sw_m4[4][4] = {{0}};
+ int a = 7 & ~(1 << vindex[i*2] | 1 << vindex[i*2+1]);
+
+ sw_m4[0][vindex[i*2+1]] = 1;
+ sw_m4[1][vindex[i*2]] = 1;
+
+ for(x = 0; x < 3; x++)
+ if(a & (1 << x))
+ sw_m4[2][x] = 1;
+
+ tris[i] = *((MDisps*)sources[i]);
+ tris[i].disps = MEM_dupallocN(tris[i].disps);
+ layerInterp_mdisps(&sources[i], NULL, (float*)sw_m4, 1, &tris[i]);
+ }
+
+ mdisp_join_tris(d, &tris[0], &tris[1]);
+
+ for(i = 0; i < 2; i++)
+ MEM_freeN(tris[i].disps);
+
+ return;
+ }
}
/* For now, some restrictions on the input */
- if(count != 1 || !sub_weights) return;
+ if(count != 1 || !sub_weights) {
+ for(i = 0; i < d->totdisp; ++i)
+ zero_v3(d->disps[i]);
- st = sqrt(d->totdisp);
+ return;
+ }
+
+ /* Initialize the destination */
+ out = disps = MEM_callocN(3*d->totdisp*sizeof(float), "iterp disps");
+
+ side = sqrt(d->totdisp / dst_corners);
+ st = (side<<1)-1;
stl = st - 1;
- sw = (void*)sub_weights;
+ sw= (void*)sub_weights;
for(i = 0; i < 4; ++i) {
- crn[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
- crn[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
+ crn_weight[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
+ crn_weight[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
}
- s = sources[0];
- for(y = 0; y < st; ++y) {
- for(x = 0; x < st; ++x) {
- /* One suspects this code could be cleaner. */
- float xl = (float)x / (st - 1);
- float yl = (float)y / (st - 1);
- float mid1[2] = {crn[0][0] * (1 - xl) + crn[1][0] * xl,
- crn[0][1] * (1 - xl) + crn[1][1] * xl};
- float mid2[2] = {crn[3][0] * (1 - xl) + crn[2][0] * xl,
- crn[3][1] * (1 - xl) + crn[2][1] * xl};
- float mid3[2] = {mid1[0] * (1 - yl) + mid2[0] * yl,
- mid1[1] * (1 - yl) + mid2[1] * yl};
-
- float srcdisp[3];
-
- mdisps_bilinear(srcdisp, s->disps, st, mid3[0], mid3[1]);
- copy_v3_v3(d->disps[y * st + x], srcdisp);
+ multires_mdisp_smooth_bounds(s);
+
+ out = disps;
+ for(S = 0; S < dst_corners; S++) {
+ float base[2], axis_x[2], axis_y[2];
+
+ mdisp_apply_weight(S, dst_corners, 0, 0, st, crn_weight, &base[0], &base[1]);
+ mdisp_apply_weight(S, dst_corners, side-1, 0, st, crn_weight, &axis_x[0], &axis_x[1]);
+ mdisp_apply_weight(S, dst_corners, 0, side-1, st, crn_weight, &axis_y[0], &axis_y[1]);
+
+ sub_v2_v2(axis_x, base);
+ sub_v2_v2(axis_y, base);
+ normalize_v2(axis_x);
+ normalize_v2(axis_y);
+
+ for(y = 0; y < side; ++y) {
+ for(x = 0; x < side; ++x, ++out) {
+ int crn;
+ float face_u, face_v, crn_u, crn_v;
+
+ mdisp_apply_weight(S, dst_corners, x, y, st, crn_weight, &face_u, &face_v);
+ crn = mdisp_rot_face_to_crn(src_corners, st, face_u, face_v, &crn_u, &crn_v);
+
+ old_mdisps_bilinear((*out), &s->disps[crn*side*side], side, crn_u, crn_v);
+ mdisp_flip_disp(crn, dst_corners, axis_x, axis_y, *out);
+ }
}
}
-#endif
+
+ MEM_freeN(d->disps);
+ d->disps = disps;
}
static void layerCopy_mdisps(const void *source, void *dest, int count)
@@ -551,7 +582,21 @@ static void layerCopy_mdisps(const void *source, void *dest, int count)
}
}
-static void layerFree_mdisps(void *data, int count, int size)
+static void layerValidate_mdisps(void *data, int sub_elements)
+{
+ MDisps *disps = data;
+ if(disps->disps) {
+ int corners = multires_mdisp_corners(disps);
+
+ if(corners != sub_elements) {
+ MEM_freeN(disps->disps);
+ disps->totdisp = disps->totdisp / corners * sub_elements;
+ disps->disps = MEM_callocN(3*disps->totdisp*sizeof(float), "layerValidate_mdisps");
+ }
+ }
+}
+
+static void layerFree_mdisps(void *data, int count, int UNUSED(size))
{
int i;
MDisps *d = data;
@@ -597,7 +642,7 @@ static int layerWrite_mdisps(CDataFile *cdf, void *data, int count)
return 1;
}
-static size_t layerFilesize_mdisps(CDataFile *cdf, void *data, int count)
+static size_t layerFilesize_mdisps(CDataFile *UNUSED(cdf), void *data, int count)
{
MDisps *d = data;
size_t size = 0;
@@ -936,7 +981,7 @@ static void layerInterp_shapekey(void **sources, float *weights,
}
}
-const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
+static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL},
{sizeof(MSticky), "MSticky", 1, NULL, NULL, NULL, layerInterp_msticky, NULL,
NULL},
@@ -966,11 +1011,11 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL,
layerDefault_mloopcol, layerEqual_mloopcol, layerMultiply_mloopcol, layerInitMinMax_mloopcol,
layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
- {sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
+ {sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
{sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps,
layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
- layerRead_mdisps, layerWrite_mdisps, layerFilesize_mdisps},
+ layerRead_mdisps, layerWrite_mdisps, layerFilesize_mdisps, layerValidate_mdisps},
{sizeof(MCol)*4, "MCol", 4, "WeightCol", NULL, NULL, layerInterp_mcol,
layerSwap_mcol, layerDefault_mcol},
{sizeof(MPoly), "MPoly", 1, "NGon Face", NULL, NULL, NULL, NULL, NULL},
@@ -989,7 +1034,7 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
layerAdd_mloopcol, layerDoMinMax_mloopcol, layerCopyValue_mloopcol},
};
-const char *LAYERTYPENAMES[CD_NUMTYPES] = {
+static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
"CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
"CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty",
"CDMIntProperty","CDMStringProperty", "CDOrigSpace", "CDOrco", "CDMTexPoly", "CDMLoopUV",
@@ -1064,13 +1109,13 @@ void customData_update_typemap(CustomData *data)
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
CustomDataMask mask, int alloctype, int totelem)
{
- const LayerTypeInfo *typeInfo;
+ /*const LayerTypeInfo *typeInfo;*/
CustomDataLayer *layer, *newlayer;
int i, type, number = 0, lasttype = -1, lastactive = 0, lastrender = 0, lastclone = 0, lastmask = 0, lastflag = 0;
for(i = 0; i < source->totlayer; ++i) {
layer = &source->layers[i];
- typeInfo = layerType_getInfo(layer->type);
+ /*typeInfo = layerType_getInfo(layer->type);*/ /*UNUSED*/
type = layer->type;
@@ -1195,7 +1240,7 @@ int CustomData_get_layer_index_n(const struct CustomData *data, int type, int n)
return -1;
}
-int CustomData_get_named_layer_index(const CustomData *data, int type, char *name)
+int CustomData_get_named_layer_index(const CustomData *data, int type, const char *name)
{
int i;
@@ -1444,7 +1489,7 @@ static CustomDataLayer *customData_add_layer__internal(CustomData *data,
data->layers[index].data = newlayerdata;
if(name || (name=typeInfo->defaultname)) {
- strcpy(data->layers[index].name, name);
+ BLI_strncpy(data->layers[index].name, name, 32);
CustomData_set_layer_unique_name(data, index);
}
else
@@ -1586,7 +1631,7 @@ void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
}
void *CustomData_duplicate_referenced_layer_named(struct CustomData *data,
- int type, char *name)
+ int type, const char *name)
{
CustomDataLayer *layer;
int layer_index;
@@ -1841,7 +1886,7 @@ void *CustomData_get_layer_n(const CustomData *data, int type, int n)
}
void *CustomData_get_layer_named(const struct CustomData *data, int type,
- char *name)
+ const char *name)
{
int layer_index = CustomData_get_named_layer_index(data, type, name);
if(layer_index < 0) return NULL;
@@ -1967,6 +2012,18 @@ void CustomData_em_copy_data(const CustomData *source, CustomData *dest,
}
}
+void CustomData_em_validate_data(CustomData *data, void *block, int sub_elements)
+{
+ int i;
+ for(i = 0; i < data->totlayer; i++) {
+ const LayerTypeInfo *typeInfo = layerType_getInfo(data->layers[i].type);
+ char *leayer_data = (char*)block + data->layers[i].offset;
+
+ if(typeInfo->validate)
+ typeInfo->validate(leayer_data, sub_elements);
+ }
+}
+
void *CustomData_em_get(const CustomData *data, void *block, int type)
{
int layer_index;
@@ -2593,7 +2650,7 @@ void CustomData_from_bmesh_block(const CustomData *source, CustomData *dest,
}
-void CustomData_file_write_info(int type, char **structname, int *structnum)
+void CustomData_file_write_info(int type, const char **structname, int *structnum)
{
const LayerTypeInfo *typeInfo = layerType_getInfo(type);
@@ -2620,69 +2677,50 @@ static int CustomData_is_property_layer(int type)
return 0;
}
-void CustomData_set_layer_unique_name(CustomData *data, int index)
+static int cd_layer_find_dupe(CustomData *data, const char *name, int type, int index)
{
- char tempname[64];
- int number, i, type;
- char *dot, *name;
- CustomDataLayer *layer, *nlayer= &data->layers[index];
- const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
-
- if (!typeInfo->defaultname)
- return;
-
- type = nlayer->type;
- name = nlayer->name;
-
- if (name[0] == '\0')
- BLI_strncpy(nlayer->name, typeInfo->defaultname, sizeof(nlayer->name));
-
+ int i;
/* see if there is a duplicate */
for(i=0; i<data->totlayer; i++) {
- layer = &data->layers[i];
-
- if(CustomData_is_property_layer(type)){
- if(i!=index && CustomData_is_property_layer(layer->type) &&
- strcmp(layer->name, name)==0)
- break;
-
- }
- else{
- if(i!=index && layer->type==type && strcmp(layer->name, name)==0)
- break;
- }
- }
-
- if(i == data->totlayer)
- return;
-
- /* strip off the suffix */
- dot = strchr(nlayer->name, '.');
- if(dot) *dot=0;
-
- for(number=1; number <=999; number++) {
- sprintf(tempname, "%s.%03d", nlayer->name, number);
-
- for(i=0; i<data->totlayer; i++) {
- layer = &data->layers[i];
+ if(i != index) {
+ CustomDataLayer *layer= &data->layers[i];
- if(CustomData_is_property_layer(type)){
- if(i!=index && CustomData_is_property_layer(layer->type) &&
- strcmp(layer->name, tempname)==0)
-
- break;
+ if(CustomData_is_property_layer(type)) {
+ if(CustomData_is_property_layer(layer->type) && strcmp(layer->name, name)==0) {
+ return 1;
+ }
}
else{
- if(i!=index && layer->type==type && strcmp(layer->name, tempname)==0)
- break;
+ if(i!=index && layer->type==type && strcmp(layer->name, name)==0) {
+ return 1;
+ }
}
}
+ }
+
+ return 0;
+}
- if(i == data->totlayer) {
- BLI_strncpy(nlayer->name, tempname, sizeof(nlayer->name));
- return;
- }
- }
+static int customdata_unique_check(void *arg, const char *name)
+{
+ struct {CustomData *data; int type; int index;} *data_arg= arg;
+ return cd_layer_find_dupe(data_arg->data, name, data_arg->type, data_arg->index);
+}
+
+void CustomData_set_layer_unique_name(CustomData *data, int index)
+{
+ CustomDataLayer *nlayer= &data->layers[index];
+ const LayerTypeInfo *typeInfo= layerType_getInfo(nlayer->type);
+
+ struct {CustomData *data; int type; int index;} data_arg;
+ data_arg.data= data;
+ data_arg.type= nlayer->type;
+ data_arg.index= index;
+
+ if (!typeInfo->defaultname)
+ return;
+
+ BLI_uniquename_cb(customdata_unique_check, &data_arg, typeInfo->defaultname, '.', nlayer->name, sizeof(nlayer->name));
}
int CustomData_verify_versions(struct CustomData *data, int index)
@@ -2715,13 +2753,13 @@ int CustomData_verify_versions(struct CustomData *data, int index)
static void customdata_external_filename(char filename[FILE_MAX], ID *id, CustomDataExternal *external)
{
- char *path = (id->lib)? id->lib->filepath: G.sce;
+ char *path = (id->lib)? id->lib->filepath: G.main->name;
BLI_strncpy(filename, external->filename, FILE_MAX);
BLI_path_abs(filename, path);
}
-void CustomData_external_reload(CustomData *data, ID *id, CustomDataMask mask, int totelem)
+void CustomData_external_reload(CustomData *data, ID *UNUSED(id), CustomDataMask mask, int totelem)
{
CustomDataLayer *layer;
const LayerTypeInfo *typeInfo;
@@ -2891,7 +2929,7 @@ void CustomData_external_write(CustomData *data, ID *id, CustomDataMask mask, in
cdf_free(cdf);
}
-void CustomData_external_add(CustomData *data, ID *id, int type, int totelem, const char *filename)
+void CustomData_external_add(CustomData *data, ID *UNUSED(id), int type, int UNUSED(totelem), const char *filename)
{
CustomDataExternal *external= data->external;
CustomDataLayer *layer;
diff --git a/source/blender/blenkernel/intern/customdata_file.c b/source/blender/blenkernel/intern/customdata_file.c
index 65a0d731beb..6fb79a0df28 100644
--- a/source/blender/blenkernel/intern/customdata_file.c
+++ b/source/blender/blenkernel/intern/customdata_file.c
@@ -28,10 +28,11 @@
#include "BLI_fileops.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_customdata_file.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
/************************* File Format Definitions ***************************/
@@ -379,7 +380,7 @@ int cdf_write_open(CDataFile *cdf, char *filename)
return 1;
}
-int cdf_write_layer(CDataFile *cdf, CDataFileLayer *blay)
+int cdf_write_layer(CDataFile *UNUSED(cdf), CDataFileLayer *UNUSED(blay))
{
return 1;
}
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index be28553f347..616bcb17f90 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -51,7 +51,7 @@ void defgroup_copy_list (ListBase *outbase, ListBase *inbase)
{
bDeformGroup *defgroup, *defgroupn;
- outbase->first= outbase->last= 0;
+ outbase->first= outbase->last= NULL;
for (defgroup = inbase->first; defgroup; defgroup=defgroup->next){
defgroupn= defgroup_duplicate(defgroup);
@@ -305,89 +305,65 @@ int defgroup_flip_index(Object *ob, int index, int use_default)
return (flip_index==-1 && use_default) ? index : flip_index;
}
-void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+static int defgroup_find_name_dupe(const char *name, bDeformGroup *dg, Object *ob)
{
bDeformGroup *curdef;
- int number;
- int exists = 0;
- char tempname[64];
- char *dot;
- if (!ob)
- return;
-
- /* See if we are given an empty string */
- if (dg->name[0] == '\0') {
- /* give it default name first */
- strcpy (dg->name, "Group");
- }
-
- /* See if we even need to do this */
for (curdef = ob->defbase.first; curdef; curdef=curdef->next) {
if (dg!=curdef) {
- if (!strcmp(curdef->name, dg->name)) {
- exists = 1;
- break;
+ if (!strcmp(curdef->name, name)) {
+ return 1;
}
}
}
-
- if (!exists)
- return;
- /* Strip off the suffix */
- dot=strchr(dg->name, '.');
- if (dot)
- *dot=0;
-
- for (number = 1; number <=999; number++) {
- sprintf (tempname, "%s.%03d", dg->name, number);
-
- exists = 0;
- for (curdef=ob->defbase.first; curdef; curdef=curdef->next) {
- if (dg!=curdef) {
- if (!strcmp (curdef->name, tempname)) {
- exists = 1;
- break;
- }
- }
- }
- if (!exists) {
- BLI_strncpy (dg->name, tempname, 32);
- return;
- }
- }
+ return 0;
}
+static int defgroup_unique_check(void *arg, const char *name)
+{
+ struct {Object *ob; void *dg;} *data= arg;
+ return defgroup_find_name_dupe(name, data->dg, data->ob);
+}
+
+void defgroup_unique_name (bDeformGroup *dg, Object *ob)
+{
+ struct {Object *ob; void *dg;} data;
+ data.ob= ob;
+ data.dg= dg;
+
+ BLI_uniquename_cb(defgroup_unique_check, &data, "Group", '.', dg->name, sizeof(dg->name));
+}
/* finds the best possible flipped name. For renaming; check for unique names afterwards */
-/* if strip_number: removes number extensions */
-void flip_side_name (char *name, const char *from_name, int strip_number)
+/* if strip_number: removes number extensions
+ * note: dont use sizeof() for 'name' or 'from_name' */
+void flip_side_name (char name[MAX_VGROUP_NAME], const char from_name[MAX_VGROUP_NAME], int strip_number)
{
int len;
- char prefix[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The part before the facing */
- char suffix[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The part after the facing */
- char replace[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The replacement string */
- char number[sizeof(((bDeformGroup *)NULL)->name)]= {""}; /* The number extension string */
+ char prefix[MAX_VGROUP_NAME]= ""; /* The part before the facing */
+ char suffix[MAX_VGROUP_NAME]= ""; /* The part after the facing */
+ char replace[MAX_VGROUP_NAME]= ""; /* The replacement string */
+ char number[MAX_VGROUP_NAME]= ""; /* The number extension string */
char *index=NULL;
- len= strlen(from_name);
+ len= BLI_strnlen(from_name, MAX_VGROUP_NAME);
if(len<3) return; // we don't do names like .R or .L
- strcpy(name, from_name);
+ BLI_strncpy(name, from_name, MAX_VGROUP_NAME);
/* We first check the case with a .### extension, let's find the last period */
if(isdigit(name[len-1])) {
index= strrchr(name, '.'); // last occurrence
if (index && isdigit(index[1]) ) { // doesnt handle case bone.1abc2 correct..., whatever!
if(strip_number==0)
- strcpy(number, index);
+ BLI_strncpy(number, index, sizeof(number));
*index= 0;
- len= strlen(name);
+ len= BLI_strnlen(name, MAX_VGROUP_NAME);
}
}
- strcpy (prefix, name);
+ BLI_strncpy(prefix, name, sizeof(prefix));
#define IS_SEPARATOR(a) ((a)=='.' || (a)==' ' || (a)=='-' || (a)=='_')
@@ -471,10 +447,10 @@ void flip_side_name (char *name, const char *from_name, int strip_number)
#undef IS_SEPARATOR
- sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
+ BLI_snprintf (name, MAX_VGROUP_NAME, "%s%s%s%s", prefix, replace, suffix, number);
}
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num)
+float defvert_find_weight(const struct MDeformVert *dvert, const int group_num)
{
MDeformWeight *dw= defvert_find_index(dvert, group_num);
return dw ? dw->weight : 0.0f;
@@ -489,7 +465,7 @@ float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index,
}
-MDeformWeight *defvert_find_index(const MDeformVert *dvert, int defgroup)
+MDeformWeight *defvert_find_index(const MDeformVert *dvert, const int defgroup)
{
if(dvert && defgroup >= 0) {
MDeformWeight *dw = dvert->dw;
@@ -505,7 +481,7 @@ MDeformWeight *defvert_find_index(const MDeformVert *dvert, int defgroup)
/* Ensures that mv has a deform weight entry for the specified defweight group */
/* Note this function is mirrored in editmesh_tools.c, for use for editvertices */
-MDeformWeight *defvert_verify_index(MDeformVert *dv, int defgroup)
+MDeformWeight *defvert_verify_index(MDeformVert *dv, const int defgroup)
{
MDeformWeight *newdw;
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 382c0690ae3..c437c4fe61f 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,22 +29,24 @@
#include <string.h>
#include <math.h>
+#include "MEM_guardedalloc.h"
+
#include "BLI_winstuff.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "DNA_anim_types.h"
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
#include "DNA_lattice_types.h"
#include "DNA_key_types.h"
+#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_node_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
-
-#include "BLI_ghash.h"
-
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_effect.h"
@@ -52,7 +54,9 @@
#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_key.h"
+#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -60,6 +64,7 @@
#include "BKE_pointcache.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
+#include "BKE_utildefines.h"
#include "depsgraph_private.h"
@@ -273,7 +278,7 @@ int queue_count(struct DagNodeQueue *queue){
}
-DagForest * dag_init()
+DagForest *dag_init(void)
{
DagForest *forest;
/* use callocN to init all zero */
@@ -846,7 +851,7 @@ DagNode * dag_get_sub_node (DagForest *forest,void * fob)
return node;
}
-static void dag_add_parent_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name)
+static void dag_add_parent_relation(DagForest *UNUSED(forest), DagNode *fob1, DagNode *fob2, short rel, const char *name)
{
DagAdjList *itA = fob2->parent;
@@ -868,7 +873,7 @@ static void dag_add_parent_relation(DagForest *forest, DagNode *fob1, DagNode *f
fob2->parent = itA;
}
-void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, char *name)
+void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel, const char *name)
{
DagAdjList *itA = fob1->child;
@@ -893,7 +898,7 @@ void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel
fob1->child = itA;
}
-static char *dag_node_name(DagNode *node)
+static const char *dag_node_name(DagNode *node)
{
if(node->ob == NULL)
return "null";
@@ -938,7 +943,7 @@ static int dag_node_print_dependency_recurs(DagNode *node, DagNode *endnode)
return 0;
}
-static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, DagNode *endnode, char *name)
+static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, DagNode *endnode, const char *name)
{
DagNode *node;
@@ -1075,7 +1080,7 @@ void graph_bfs(void)
minheight = pos[node->BFS_dist];
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->color = DAG_GRAY;
itA->node->BFS_dist = node->BFS_dist + 1;
itA->node->k = (float) minheight;
@@ -1222,7 +1227,7 @@ DagNodeQueue * graph_dfs(void)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1476,7 +1481,7 @@ struct DagNodeQueue *get_all_childs(struct DagForest *dag, void *ob)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1510,7 +1515,7 @@ short are_obs_related(struct DagForest *dag, void *ob1, void *ob2) {
itA = node->child;
while(itA != NULL) {
- if((itA->node->ob == ob2) ) {
+ if(itA->node->ob == ob2) {
return itA->node->type;
}
itA = itA->next;
@@ -1682,7 +1687,7 @@ void DAG_scene_sort(Main *bmain, Scene *sce)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->DFS_dvtm = time;
itA->node->color = DAG_GRAY;
@@ -1858,7 +1863,7 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int
for(itA = node->child; itA; itA= itA->next) {
if(itA->node->type==ID_OB) {
if(itA->node->lasttime!=curtime) {
- ob= (Object*)(node->ob);
+ ob= (Object*)(itA->node->ob);
if(reset || (ob->recalc & OB_RECALC_ALL)) {
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH))
@@ -1921,8 +1926,30 @@ static void dag_scene_flush_layers(Scene *sce, int lay)
flush_layer_node(sce, itA->node, lasttime);
}
+static void dag_tag_renderlayers(Scene *sce, unsigned int lay)
+{
+ if(sce->nodetree) {
+ bNode *node;
+ Base *base;
+ unsigned int lay_changed= 0;
+
+ for(base= sce->base.first; base; base= base->next)
+ if(base->lay & lay)
+ if(base->object->recalc)
+ lay_changed |= base->lay;
+
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)sce) {
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl && (srl->lay & lay_changed))
+ NodeTagChanged(sce->nodetree, node);
+ }
+ }
+ }
+}
+
/* flushes all recalc flags in objects down the dependency tree */
-void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, int time)
+void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, const short time)
{
DagNode *firstnode;
DagAdjList *itA;
@@ -1965,6 +1992,8 @@ void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, int time)
}
}
}
+
+ dag_tag_renderlayers(sce, lay);
}
static int object_modifiers_use_time(Object *ob)
@@ -2131,50 +2160,57 @@ static void dag_object_time_update_flags(Object *ob)
}
}
/* flag all objects that need recalc, for changes in time for example */
-void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay)
+/* do_time: make this optional because undo resets objects to their animated locations without this */
+void DAG_scene_update_flags(Main *bmain, Scene *scene, unsigned int lay, const short do_time)
{
Base *base;
Object *ob;
Group *group;
GroupObject *go;
- Scene *sce;
-
+ Scene *sce_iter;
+
/* set ob flags where animated systems are */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
-
- /* now if DagNode were part of base, the node->lay could be checked... */
- /* we do all now, since the scene_flush checks layers and clears recalc flags even */
- dag_object_time_update_flags(ob);
-
+
+ if(do_time) {
+ /* now if DagNode were part of base, the node->lay could be checked... */
+ /* we do all now, since the scene_flush checks layers and clears recalc flags even */
+ dag_object_time_update_flags(ob);
+ }
+
/* handled in next loop */
- if(ob->dup_group)
+ if(ob->dup_group)
ob->dup_group->id.flag |= LIB_DOIT;
- }
-
- /* we do groups each once */
- for(group= bmain->group.first; group; group= group->id.next) {
- if(group->id.flag & LIB_DOIT) {
- for(go= group->gobject.first; go; go= go->next) {
- dag_object_time_update_flags(go->ob);
+ }
+
+ if(do_time) {
+ /* we do groups each once */
+ for(group= bmain->group.first; group; group= group->id.next) {
+ if(group->id.flag & LIB_DOIT) {
+ for(go= group->gobject.first; go; go= go->next) {
+ dag_object_time_update_flags(go->ob);
+ }
}
}
}
+
+ for(sce_iter= scene; sce_iter; sce_iter= sce_iter->set)
+ DAG_scene_flush_update(bmain, sce_iter, lay, 1);
- for(sce= scene; sce; sce= sce->set)
- DAG_scene_flush_update(bmain, sce, lay, 1);
-
- /* test: set time flag, to disable baked systems to update */
- for(SETLOOPER(scene, base)) {
- ob= base->object;
- if(ob->recalc)
- ob->recalc |= OB_RECALC_TIME;
+ if(do_time) {
+ /* test: set time flag, to disable baked systems to update */
+ for(SETLOOPER(scene, sce_iter, base)) {
+ ob= base->object;
+ if(ob->recalc)
+ ob->recalc |= OB_RECALC_TIME;
+ }
+
+ /* hrmf... an exception to look at once, for invisible camera object we do it over */
+ if(scene->camera)
+ dag_object_time_update_flags(scene->camera);
}
-
- /* hrmf... an exception to look at once, for invisible camera object we do it over */
- if(scene->camera)
- dag_object_time_update_flags(scene->camera);
-
+
/* and store the info in groupobject */
for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
@@ -2230,9 +2266,9 @@ void DAG_ids_flush_update(Main *bmain, int time)
DAG_scene_flush_update(bmain, sce, lay, time);
}
-void DAG_on_load_update(Main *bmain)
+void DAG_on_load_update(Main *bmain, const short do_time)
{
- Scene *scene, *sce;
+ Scene *scene;
Base *base;
Object *ob;
Group *group;
@@ -2243,19 +2279,20 @@ void DAG_on_load_update(Main *bmain)
dag_current_scene_layers(bmain, &scene, &lay);
if(scene && scene->theDag) {
+ Scene *sce_iter;
/* derivedmeshes and displists are not saved to file so need to be
remade, tag them so they get remade in the scene update loop,
note armature poses or object matrices are preserved and do not
require updates, so we skip those */
dag_scene_flush_layers(scene, lay);
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
- node= (sce->theDag)? dag_get_node(sce->theDag, ob): NULL;
+ node= (sce_iter->theDag)? dag_get_node(sce_iter->theDag, ob): NULL;
oblay= (node)? node->lay: ob->lay;
if(oblay & lay) {
- if(ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
+ if(ELEM6(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_LATTICE))
ob->recalc |= OB_RECALC_DATA;
if(ob->dup_group)
ob->dup_group->id.flag |= LIB_DOIT;
@@ -2265,7 +2302,7 @@ void DAG_on_load_update(Main *bmain)
for(group= bmain->group.first; group; group= group->id.next) {
if(group->id.flag & LIB_DOIT) {
for(go= group->gobject.first; go; go= go->next) {
- if(ELEM5(go->ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
+ if(ELEM6(go->ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_LATTICE))
go->ob->recalc |= OB_RECALC_DATA;
if(go->ob->proxy_from)
go->ob->recalc |= OB_RECALC_OB;
@@ -2276,11 +2313,11 @@ void DAG_on_load_update(Main *bmain)
}
/* now tag update flags, to ensure deformers get calculated on redraw */
- DAG_scene_update_flags(bmain, scene, lay);
+ DAG_scene_update_flags(bmain, scene, lay, do_time);
}
}
-static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob, ID **idpoin)
+static void dag_id_flush_update__isDependentTexture(void *userData, Object *UNUSED(ob), ID **idpoin)
{
struct { ID *id; int is_dependent; } *data = userData;
@@ -2290,26 +2327,21 @@ static void dag_id_flush_update__isDependentTexture(void *userData, Object *ob,
}
}
-void DAG_id_flush_update(ID *id, short flag)
+static void dag_id_flush_update(Scene *sce, ID *id)
{
Main *bmain= G.main;
- Scene *sce;
Object *obt, *ob= NULL;
short idtype;
- unsigned int lay;
- dag_current_scene_layers(bmain, &sce, &lay);
-
- if(!id || !sce || !sce->theDag)
- return;
+ /* here we flush a few things before actual scene wide flush, mostly
+ due to only objects and not other datablocks being in the depsgraph */
/* set flags & pointcache for object */
if(GS(id->name) == ID_OB) {
ob= (Object*)id;
- ob->recalc |= (flag & OB_RECALC_ALL);
BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH);
- if(flag & OB_RECALC_DATA) {
+ if(ob->recalc & OB_RECALC_DATA) {
/* all users of this ob->data should be checked */
id= ob->data;
@@ -2326,23 +2358,10 @@ void DAG_id_flush_update(ID *id, short flag)
idtype= GS(id->name);
if(ELEM7(idtype, ID_ME, ID_CU, ID_MB, ID_LA, ID_LT, ID_CA, ID_AR)) {
- int first_ob= 1;
for(obt=bmain->object.first; obt; obt= obt->id.next) {
if(!(ob && obt == ob) && obt->data == id) {
-
- /* try to avoid displist recalculation for linked curves */
- if (!first_ob && ELEM(obt->type, OB_CURVE, OB_SURF)) {
- /* if curve object has got derivedFinal it means this
- object has got constructive modifiers and object
- should be recalculated anyhow */
- if (!obt->derivedFinal)
- continue;
- }
-
obt->recalc |= OB_RECALC_DATA;
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
-
- first_ob= 0;
}
}
}
@@ -2350,11 +2369,36 @@ void DAG_id_flush_update(ID *id, short flag)
/* set flags based on textures - can influence depgraph via modifiers */
if(idtype == ID_TE) {
for(obt=bmain->object.first; obt; obt= obt->id.next) {
- struct { ID *id; int is_dependent; } data = {id, 0};
-
+ struct { ID *id; int is_dependent; } data;
+ data.id= id;
+ data.is_dependent= 0;
+
modifiers_foreachIDLink(obt, dag_id_flush_update__isDependentTexture, &data);
if (data.is_dependent)
obt->recalc |= OB_RECALC_DATA;
+
+ /* particle settings can use the texture as well */
+ if(obt->particlesystem.first) {
+ ParticleSystem *psys = obt->particlesystem.first;
+ MTex **mtexp, *mtex;
+ int a;
+ for(; psys; psys=psys->next) {
+ mtexp = psys->part->mtex;
+ for(a=0; a<MAX_MTEX; a++, mtexp++) {
+ mtex = *mtexp;
+ if(mtex && mtex->tex == (Tex*)id) {
+ obt->recalc |= OB_RECALC_DATA;
+
+ if(mtex->mapto & PAMAP_INIT)
+ psys->recalc |= PSYS_RECALC_RESET;
+ if(mtex->mapto & PAMAP_CHILD)
+ psys->recalc |= PSYS_RECALC_CHILD;
+
+ BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
+ }
+ }
+ }
+ }
}
}
@@ -2372,25 +2416,100 @@ void DAG_id_flush_update(ID *id, short flag)
/* set flags based on particle settings */
if(idtype == ID_PA) {
ParticleSystem *psys;
- for(obt=bmain->object.first; obt; obt= obt->id.next) {
- for(psys=obt->particlesystem.first; psys; psys=psys->next) {
- if(&psys->part->id == id) {
+ for(obt=bmain->object.first; obt; obt= obt->id.next)
+ for(psys=obt->particlesystem.first; psys; psys=psys->next)
+ if(&psys->part->id == id)
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
- obt->recalc |= (flag & OB_RECALC_ALL);
- psys->recalc |= (flag & PSYS_RECALC);
- }
- }
- }
}
/* update editors */
dag_editors_update(bmain, id);
}
+}
+
+void DAG_ids_flush_tagged(Main *bmain)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ Scene *sce;
+ unsigned int lay;
+ int a, have_tag = 0;
+
+ dag_current_scene_layers(bmain, &sce, &lay);
+
+ if(!sce || !sce->theDag)
+ return;
+
+ /* loop over all ID types */
+ a = set_listbasepointers(bmain, lbarray);
+
+ while(a--) {
+ ListBase *lb = lbarray[a];
+ ID *id = lb->first;
+
+ /* we tag based on first ID type character to avoid
+ looping over all ID's in case there are no tags */
+ if(id && bmain->id_tag_update[id->name[0]]) {
+ for(; id; id=id->next) {
+ if(id->flag & LIB_ID_RECALC) {
+ dag_id_flush_update(sce, id);
+ id->flag &= ~LIB_ID_RECALC;
+ }
+ }
+
+ have_tag = 1;
+ }
+ }
+
+ if(have_tag) {
+ /* clear tags */
+ memset(bmain->id_tag_update, 0, sizeof(bmain->id_tag_update));
+
+ /* flush changes to other objects */
+ DAG_scene_flush_update(bmain, sce, lay, 0);
+ }
+}
- /* flush to other objects that depend on this one */
- DAG_scene_flush_update(bmain, sce, lay, 0);
+void DAG_id_tag_update(ID *id, short flag)
+{
+ Main *bmain= G.main;
+
+ if(id==NULL) return;
+
+ /* tag ID for update */
+ id->flag |= LIB_ID_RECALC;
+ bmain->id_tag_update[id->name[0]] = 1;
+
+ /* flag is for objects and particle systems */
+ if(flag) {
+ Object *ob;
+ ParticleSystem *psys;
+ short idtype = GS(id->name);
+
+ if(idtype == ID_OB) {
+ /* only quick tag */
+ ob = (Object*)id;
+ ob->recalc |= (flag & OB_RECALC_ALL);
+ }
+ else if(idtype == ID_PA) {
+ /* this is weak still, should be done delayed as well */
+ for(ob=bmain->object.first; ob; ob=ob->id.next) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(&psys->part->id == id) {
+ ob->recalc |= (flag & OB_RECALC_ALL);
+ psys->recalc |= (flag & PSYS_RECALC);
+ }
+ }
+ }
+ }
+ else {
+ /* disable because this is called on various ID types automatically.
+ * where printing warning is not useful. for now just ignore */
+ /* BLI_assert(!"invalid flag for this 'idtype'"); */
+ }
+ }
}
+#if 0 // UNUSED
/* recursively descends tree, each node only checked once */
/* node is checked to be of type object */
static int parent_check_node(DagNode *node, int curtime)
@@ -2420,68 +2539,7 @@ static int parent_check_node(DagNode *node, int curtime)
return DAG_WHITE;
}
-
-/* all nodes that influence this object get tagged, for calculating the exact
- position of this object at a given timeframe */
-void DAG_id_update_flags(ID *id)
-{
- Main *bmain= G.main;
- Scene *sce;
- DagNode *node;
- DagAdjList *itA;
- Object *ob;
- unsigned int lay;
-
- dag_current_scene_layers(bmain, &sce, &lay);
-
- if(!id || !sce || !sce->theDag)
- return;
-
- /* objects only currently */
- if(GS(id->name) != ID_OB)
- return;
-
- ob= (Object*)id;
-
- /* tag nodes unchecked */
- for(node = sce->theDag->DagNode.first; node; node= node->next)
- node->color = DAG_WHITE;
-
- node= dag_find_node(sce->theDag, ob);
-
- /* object not in scene? then handle group exception. needs to be dagged once too */
- if(node==NULL) {
- Group *group= NULL;
- while( (group = find_group(ob, group)) ) {
- GroupObject *go;
- /* primitive; tag all... this call helps building groups for particles */
- for(go= group->gobject.first; go; go= go->next)
- go->ob->recalc= OB_RECALC_ALL;
- }
- }
- else {
-
- node->color = DAG_GRAY;
-
- sce->theDag->time++;
- node= sce->theDag->DagNode.first;
- for(itA = node->child; itA; itA= itA->next) {
- if(itA->node->type==ID_OB && itA->node->lasttime!=sce->theDag->time)
- itA->node->color= parent_check_node(itA->node, sce->theDag->time);
- }
-
- /* set recalcs and flushes */
- DAG_scene_update_flags(bmain, sce, lay);
-
- /* now we clear recalcs, unless color is set */
- for(node = sce->theDag->DagNode.first; node; node= node->next) {
- if(node->type==ID_OB && node->color==DAG_WHITE) {
- Object *ob= node->ob;
- ob->recalc= 0;
- }
- }
- }
-}
+#endif
/* ******************* DAG FOR ARMATURE POSE ***************** */
@@ -2588,7 +2646,7 @@ void DAG_pose_sort(Object *ob)
itA = node->child;
while(itA != NULL) {
- if((itA->node->color == DAG_WHITE) ) {
+ if(itA->node->color == DAG_WHITE) {
itA->node->color = DAG_GRAY;
push_stack(nqueue,itA->node);
skip = 1;
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 666a62d96de..59e5aa7ade6 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -35,7 +35,6 @@
#include "MEM_guardedalloc.h"
-
#include "DNA_curve_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
@@ -45,6 +44,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_scanfill.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_displist.h"
@@ -120,7 +121,7 @@ DispList *find_displist(ListBase *lb, int type)
dl= dl->next;
}
- return 0;
+ return NULL;
}
int displist_has_faces(ListBase *lb)
@@ -137,7 +138,7 @@ void copy_displist(ListBase *lbn, ListBase *lb)
{
DispList *dln, *dl;
- lbn->first= lbn->last= 0;
+ freedisplist(lbn);
dl= lb->first;
while(dl) {
@@ -149,7 +150,10 @@ void copy_displist(ListBase *lbn, ListBase *lb)
dln->index= MEM_dupallocN(dl->index);
dln->col1= MEM_dupallocN(dl->col1);
dln->col2= MEM_dupallocN(dl->col2);
-
+
+ if(dl->bevelSplitFlag)
+ dln->bevelSplitFlag= MEM_dupallocN(dl->bevelSplitFlag);
+
dl= dl->next;
}
}
@@ -289,7 +293,7 @@ static void init_fastshade_shadeinput(Render *re)
shi.combinedflag= -1;
}
-static Render *fastshade_get_render(Scene *scene)
+static Render *fastshade_get_render(Scene *UNUSED(scene))
{
// XXX 2.5: this crashes combined with previewrender
// due to global R so disabled for now
@@ -621,7 +625,6 @@ void shadeDispList(Scene *scene, Base *base)
Object *ob= base->object;
DispList *dl, *dlob;
Material *ma = NULL;
- Curve *cu;
Render *re;
float imat[3][3], mat[4][4], vec[3];
float *fp, *nor, n1[3];
@@ -655,8 +658,7 @@ void shadeDispList(Scene *scene, Base *base)
if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
/* now we need the normals */
- cu= ob->data;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while(dl) {
extern Material defmaterial; /* material.c */
@@ -788,7 +790,7 @@ void reshadeall_displist(Scene *scene)
/* ****************** make displists ********************* */
-static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
+static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, int forRender)
{
Nurb *nu;
DispList *dl;
@@ -801,7 +803,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase)
while(nu) {
if(nu->hide==0) {
- if(G.rendering && cu->resolu_ren!=0)
+ if(forRender && cu->resolu_ren!=0)
resolu= cu->resolu_ren;
else
resolu= nu->resolu;
@@ -928,55 +930,58 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
{
EditVert *eve, *v1, *vlast;
EditFace *efa;
- DispList *dlnew=0, *dl;
+ DispList *dlnew=NULL, *dl;
float *f1;
- int colnr=0, charidx=0, cont=1, tot, a, *index;
+ int colnr=0, charidx=0, cont=1, tot, a, *index, nextcol= 0;
intptr_t totvert;
- if(dispbase==0) return;
- if(dispbase->first==0) return;
+ if(dispbase==NULL) return;
+ if(dispbase->first==NULL) return;
while(cont) {
cont= 0;
- totvert=0;
+ totvert= 0;
+ nextcol= 0;
dl= dispbase->first;
while(dl) {
if(dl->type==DL_POLY) {
if(charidx<dl->charidx) cont= 1;
- else if(charidx==dl->charidx) {
-
- colnr= dl->col;
- charidx= dl->charidx;
-
- /* make editverts and edges */
- f1= dl->verts;
- a= dl->nr;
- eve= v1= 0;
-
- while(a--) {
- vlast= eve;
-
- eve= BLI_addfillvert(f1);
- totvert++;
+ else if(charidx==dl->charidx) { /* character with needed index */
+ if(colnr==dl->col) {
+ /* make editverts and edges */
+ f1= dl->verts;
+ a= dl->nr;
+ eve= v1= NULL;
- if(vlast==0) v1= eve;
- else {
- BLI_addfilledge(vlast, eve);
+ while(a--) {
+ vlast= eve;
+
+ eve= BLI_addfillvert(f1);
+ totvert++;
+
+ if(vlast==NULL) v1= eve;
+ else {
+ BLI_addfilledge(vlast, eve);
+ }
+ f1+=3;
}
- f1+=3;
- }
-
- if(eve!=0 && v1!=0) {
- BLI_addfilledge(eve, v1);
+
+ if(eve!=NULL && v1!=NULL) {
+ BLI_addfilledge(eve, v1);
+ }
+ } else if (colnr<dl->col) {
+ /* got poly with next material at current char */
+ cont= 1;
+ nextcol= 1;
}
}
}
dl= dl->next;
}
- if(totvert && BLI_edgefill(0, 0)) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
+ if(totvert && BLI_edgefill(0)) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
/* count faces */
tot= 0;
@@ -1032,7 +1037,14 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
}
BLI_end_edgefill();
- charidx++;
+ if(nextcol) {
+ /* stay at current char but fill polys with next material */
+ colnr++;
+ } else {
+ /* switch to next char and start filling from first material */
+ charidx++;
+ colnr= 0;
+ }
}
/* do not free polys, needed for wireframe display */
@@ -1046,7 +1058,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
float *fp, *fp1;
int a, dpoly;
- front.first= front.last= back.first= back.last= 0;
+ front.first= front.last= back.first= back.last= NULL;
dl= dispbase->first;
while(dl) {
@@ -1107,7 +1119,7 @@ static void bevels_to_filledpoly(Curve *cu, ListBase *dispbase)
}
-static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
+static void curve_to_filledpoly(Curve *cu, ListBase *UNUSED(nurb), ListBase *dispbase)
{
if(cu->flag & CU_3D) return;
@@ -1126,16 +1138,14 @@ static void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
*/
float calc_taper(Scene *scene, Object *taperobj, int cur, int tot)
{
- Curve *cu;
DispList *dl;
if(taperobj==NULL || taperobj->type!=OB_CURVE) return 1.0;
- cu= taperobj->data;
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
if(dl==NULL) {
makeDispListCurveTypes(scene, taperobj, 0);
- dl= cu->disp.first;
+ dl= taperobj->disp.first;
}
if(dl) {
float fac= ((float)cur)/(float)(tot-1);
@@ -1192,6 +1202,8 @@ void makeDispListMBall(Scene *scene, Object *ob)
void makeDispListMBall_forRender(Scene *scene, Object *ob, ListBase *dispbase)
{
metaball_polygonize(scene, ob, dispbase);
+ tex_space_mball(ob);
+
object_deform_mball(ob, dispbase);
}
@@ -1208,10 +1220,20 @@ static ModifierData *curve_get_tesselate_point(Scene *scene, Object *ob, int for
preTesselatePoint = NULL;
for (; md; md=md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
if (!modifier_isEnabled(scene, md, required_mode)) continue;
+ if (mti->type == eModifierTypeType_Constructive) return preTesselatePoint;
if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
- preTesselatePoint = md;
+ preTesselatePoint = md;
+
+ /* this modifiers are moving point of tesselation automatically
+ (some of them even can't be applied on tesselated curve), set flag
+ for incformation button in modifier's header */
+ md->mode |= eModifierMode_ApplyOnSpline;
+ } else if(md->mode&eModifierMode_ApplyOnSpline) {
+ preTesselatePoint = md;
}
}
@@ -1603,8 +1625,15 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
for (nu=nubase->first; nu; nu=nu->next) {
if(forRender || nu->hide==0) {
+ int resolu= nu->resolu, resolv= nu->resolv;
+
+ if(forRender){
+ if(cu->resolu_ren) resolu= cu->resolu_ren;
+ if(cu->resolv_ren) resolv= cu->resolv_ren;
+ }
+
if(nu->pntsv==1) {
- len= SEGMENTSU(nu)*nu->resolu;
+ len= SEGMENTSU(nu)*resolu;
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
@@ -1623,10 +1652,10 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
if(nu->flagu & CU_NURB_CYCLIC) dl->type= DL_POLY;
else dl->type= DL_SEGM;
- makeNurbcurve(nu, data, NULL, NULL, NULL, nu->resolu, 3*sizeof(float));
+ makeNurbcurve(nu, data, NULL, NULL, NULL, resolu, 3*sizeof(float));
}
else {
- len= (nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv);
+ len= (nu->pntsu*resolu) * (nu->pntsv*resolv);
dl= MEM_callocN(sizeof(DispList), "makeDispListsurf");
dl->verts= MEM_callocN(len*3*sizeof(float), "dlverts");
@@ -1642,12 +1671,12 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
data= dl->verts;
dl->type= DL_SURF;
- dl->parts= (nu->pntsu*nu->resolu); /* in reverse, because makeNurbfaces works that way */
- dl->nr= (nu->pntsv*nu->resolv);
+ dl->parts= (nu->pntsu*resolu); /* in reverse, because makeNurbfaces works that way */
+ dl->nr= (nu->pntsv*resolv);
if(nu->flagv & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_U; /* reverse too! */
if(nu->flagu & CU_NURB_CYCLIC) dl->flag|= DL_CYCL_V;
- makeNurbfaces(nu, data, 0);
+ makeNurbfaces(nu, data, 0, resolu, resolv);
/* gl array drawing: using indices */
displist_surf_indices(dl);
@@ -1655,6 +1684,11 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase,
}
}
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1700,7 +1734,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* no bevel or extrude, and no width correction? */
if (!dlbev.first && cu->width==1.0f) {
- curve_to_displist(cu, nubase, dispbase);
+ curve_to_displist(cu, nubase, dispbase, forRender);
} else {
float widfac= cu->width-1.0;
BevList *bl= cu->bev.first;
@@ -1770,8 +1804,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* CU_2D conflicts with R_NOPUNOFLIP */
dl->rt= nu->flag & ~CU_2D;
- dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
- bevp= (BevPoint *)(bl+1);
+ dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "bevelSplitFlag");
/* for each point of poly make a bevel piece */
bevp= (BevPoint *)(bl+1);
@@ -1828,6 +1861,11 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
if(cu->flag & CU_PATH) calc_curvepath(ob);
+ /* make copy of 'undeformed" displist for texture space calculation
+ actually, it's not totally undeformed -- pre-tesselation modifiers are
+ already applied, thats how it worked for years, so keep for compatibility (sergey) */
+ copy_displist(&cu->disp, dispbase);
+
if (!forRender) {
tex_space_curve(cu);
}
@@ -1842,13 +1880,16 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
void makeDispListCurveTypes(Scene *scene, Object *ob, int forOrco)
{
- Curve *cu = ob->data;
+ Curve *cu= ob->data;
ListBase *dispbase;
freedisplist(&(ob->disp));
- dispbase= &(cu->disp);
+ dispbase= &(ob->disp);
freedisplist(dispbase);
+ /* free displist used for textspace */
+ freedisplist(&cu->disp);
+
do_makeDispListCurveTypes(scene, ob, dispbase, &ob->derivedFinal, 0, forOrco);
if (ob->derivedFinal) {
@@ -1895,15 +1936,10 @@ float *makeOrcoDispList(Scene *scene, Object *ob, DerivedMesh *derivedFinal, int
return orco;
}
-void imagestodisplist(void)
-{
- /* removed */
-}
-
/* this is confusing, there's also min_max_object, appplying the obmat... */
static void boundbox_displist(Object *ob)
{
- BoundBox *bb=0;
+ BoundBox *bb=NULL;
float min[3], max[3];
DispList *dl;
float *vert;
@@ -1915,10 +1951,10 @@ static void boundbox_displist(Object *ob)
Curve *cu= ob->data;
int doit= 0;
- if(cu->bb==0) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
+ if(cu->bb==NULL) cu->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
bb= cu->bb;
- dl= cu->disp.first;
+ dl= ob->disp.first;
while (dl) {
if(dl->type==DL_INDEX3) tot= dl->nr;
diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c
index 168e0e566de..b38521b0a23 100644
--- a/source/blender/blenkernel/intern/editderivedbmesh.c
+++ b/source/blender/blenkernel/intern/editderivedbmesh.c
@@ -61,6 +61,7 @@
#include "BLI_scanfill.h"
#include "BLI_ghash.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_customdata.h"
@@ -201,7 +202,7 @@ static void BMEdit_RecalcTesselation_intern(BMEditMesh *tm)
/*complete the loop*/
BLI_addfilledge(firstv, v);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
for (efa = fillfacebase.first; efa; efa=efa->next) {
BMLoop *l1, *l2, *l3;
@@ -534,39 +535,44 @@ static void bmDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(vo
static void bmDM_drawUVEdges(DerivedMesh *dm)
{
-#if 0
EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
+ BMEditMesh *em = bmdm->tc;
BMFace *efa;
- MTFace *tf;
+ BMIter iter;
glBegin(GL_LINES);
- for(efa= bmdm->tc->bm->faces.first; efa; efa= efa->next) {
- tf = CustomData_bm_get(&bmdm->tc->bm->pdata, 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]);
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BMIter liter;
+ BMLoop *l;
+ MLoopUV *lastluv = NULL, *firstluv = NULL;
+
+ if (BM_TestHFlag(efa, BM_HIDDEN))
+ continue;
+
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+
+ if (luv) {
+ if (lastluv)
+ glVertex2fv(luv->uv);
+ glVertex2fv(luv->uv);
+
+ lastluv = luv;
+ if (!firstluv)
+ firstluv = luv;
}
}
+
+ if (lastluv) {
+ glVertex2fv(lastluv->uv);
+ glVertex2fv(firstluv->uv);
+ }
}
glEnd();
-#endif
}
-static void bmDM__calcFaceCent(BMesh *bm, BMFace *efa, float cent[3],
- float (*vertexCos)[3])
+static void bmDM__calcFaceCent(BMesh *bm, BMFace *efa, float cent[3],
+ float (*vertexCos)[3])
{
BMIter iter;
BMLoop *l;
@@ -591,7 +597,7 @@ static void bmDM__calcFaceCent(BMesh *bm, BMFace *efa, float cent[3],
}
if (tot==0) return;
- VECMUL(cent, 1.0f/(float)tot);
+ mul_v3_fl(cent, 1.0f/(float)tot);
}
static void bmDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
@@ -1159,9 +1165,7 @@ static int bmvert_to_mvert(BMesh *bm, BMVert *ev, MVert *vert_r)
vert_r->no[1] = (short)(ev->no[1] * 32767.0f);
vert_r->no[2] = (short)(ev->no[2] * 32767.0f);
- /* TODO what to do with vert_r->flag and vert_r->mat_nr? */
vert_r->flag = BMFlags_To_MEFlags(ev);
- vert_r->mat_nr = 0;
if (CustomData_has_layer(&bm->vdata, CD_BWEIGHT)) {
vert_r->bweight = (unsigned char) (BM_GetCDf(&bm->vdata, ev, CD_BWEIGHT)*255.0f);
@@ -1255,8 +1259,6 @@ static void bmDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
vert_r->no[1] = (short) (ev->no[1] * 32767.0);
vert_r->no[2] = (short) (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 = BMFlags_To_MEFlags(ev);
if (CustomData_has_layer(&bm->vdata, CD_BWEIGHT)) {
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index fba96d2fd8f..5d8401d7a43 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -29,6 +29,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
#include <math.h>
@@ -58,6 +59,7 @@
#include "BLI_listbase.h"
#include "BLI_noise.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -85,8 +87,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+
#include "RE_render_ext.h"
#include "RE_shader_ext.h"
@@ -165,7 +166,7 @@ PartEff *give_parteff(Object *ob)
if(paf->type==EFF_PARTICLE) return paf;
paf= paf->next;
}
- return 0;
+ return NULL;
}
void free_effect(Effect *eff)
@@ -264,6 +265,9 @@ static void add_object_to_effectors(ListBase **effectors, Scene *scene, Effector
eff = new_effector_cache(scene, ob, NULL, ob->pd);
+ /* make sure imat is up to date */
+ invert_m4_m4(ob->imat, ob->obmat);
+
BLI_addtail(*effectors, eff);
}
static void add_particles_to_effectors(ListBase **effectors, Scene *scene, EffectorWeights *weights, Object *ob, ParticleSystem *psys, ParticleSystem *psys_src)
@@ -410,7 +414,7 @@ void pd_point_from_soft(Scene *scene, float *loc, float *vel, int index, Effecte
/************************************************/
// triangle - ray callback function
-static void eff_tri_ray_hit(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+static void eff_tri_ray_hit(void *UNUSED(userData), int UNUSED(index), const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
{
// whenever we hit a bounding box, we don't check further
hit->dist = -1;
@@ -429,7 +433,7 @@ static float eff_calc_visibility(ListBase *colliders, EffectorCache *eff, Effect
return visibility;
if(!colls)
- colls = get_collider_cache(eff->scene, NULL, NULL);
+ colls = get_collider_cache(eff->scene, eff->ob, NULL);
if(!colls)
return visibility;
@@ -515,7 +519,7 @@ static float falloff_func_rad(PartDeflect *pd, float fac)
return falloff_func(fac, pd->flag&PFIELD_USEMINR, pd->minrad, pd->flag&PFIELD_USEMAXR, pd->maxrad, pd->f_power_r);
}
-float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, EffectorWeights *weights)
+float effector_falloff(EffectorCache *eff, EffectorData *efd, EffectedPoint *UNUSED(point), EffectorWeights *weights)
{
float temp[3];
float falloff = weights ? weights->weight[0] * weights->weight[eff->pd->forcefield] : 1.0f;
@@ -625,7 +629,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
}
}
else if(eff->psys) {
- ParticleSimulationData sim = {eff->scene, eff->ob, eff->psys, NULL, NULL};
ParticleData *pa = eff->psys->particles + *efd->index;
ParticleKey state;
@@ -633,6 +636,11 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
if(eff->psys == point->psys && *efd->index == point->index)
;
else {
+ ParticleSimulationData sim= {NULL};
+ sim.scene= eff->scene;
+ sim.ob= eff->ob;
+ sim.psys= eff->psys;
+
/* TODO: time from actual previous calculated frame (step might not be 1) */
state.time = cfra - 1.0;
ret = psys_get_particle_state(&sim, *efd->index, &state, 0);
@@ -643,11 +651,15 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
// eff->flag |= PE_VELOCITY_TO_IMPULSE;
//}
- VECCOPY(efd->loc, state.co);
- VECCOPY(efd->nor, state.vel);
- if(real_velocity) {
- VECCOPY(efd->vel, state.vel);
- }
+ copy_v3_v3(efd->loc, state.co);
+
+ /* rather than use the velocity use rotated x-axis (defaults to velocity) */
+ efd->nor[0] = 1.f;
+ efd->nor[1] = efd->nor[2] = 0.f;
+ mul_qt_v3(state.rot, efd->nor);
+
+ if(real_velocity)
+ copy_v3_v3(efd->vel, state.vel);
efd->size = pa->size;
}
@@ -667,10 +679,10 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* for vortex the shape chooses between old / new force */
if(eff->pd && eff->pd->shape == PFIELD_SHAPE_PLANE) {
/* efd->loc is closes point on effector xy-plane */
- float temp[3];
+ float temp[3], translate[3];
sub_v3_v3v3(temp, point->loc, ob->obmat[3]);
- project_v3_v3v3(efd->loc, temp, efd->nor);
- sub_v3_v3v3(efd->loc, point->loc, efd->loc);
+ project_v3_v3v3(translate, temp, efd->nor);
+ add_v3_v3v3(efd->loc, ob->obmat[3], translate);
}
else {
VECCOPY(efd->loc, ob->obmat[3]);
@@ -712,7 +724,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
return ret;
}
-static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, int *tot, int *p)
+static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, int *tot, int *p, int *step)
{
if(eff->pd->shape == PFIELD_SHAPE_POINTS) {
efd->index = p;
@@ -745,6 +757,13 @@ static void get_effector_tot(EffectorCache *eff, EffectorData *efd, EffectedPoin
*p= point->index % eff->psys->totpart;
*tot= *p + 1;
}
+
+ if(eff->psys->part->effector_amount) {
+ int totpart = eff->psys->totpart;
+ int amount = eff->psys->part->effector_amount;
+
+ *step = (totpart > amount) ? totpart/amount : 1;
+ }
}
else {
*p = 0;
@@ -762,7 +781,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
if(!eff->pd->tex)
return;
- result[0].nor = result[1].nor = result[2].nor = result[3].nor = 0;
+ result[0].nor = result[1].nor = result[2].nor = result[3].nor = NULL;
strength= eff->pd->f_strength * efd->falloff;
@@ -774,7 +793,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
}
if(eff->pd->flag & PFIELD_TEX_OBJECT) {
- mul_m4_v3(eff->ob->obmat, tex_co);
+ mul_m4_v3(eff->ob->imat, tex_co);
}
hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL,NULL, 0, result);
@@ -826,7 +845,7 @@ static void do_texture_effector(EffectorCache *eff, EffectorData *efd, EffectedP
add_v3_v3(total_force, force);
}
-void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, float *total_force)
+static void do_physical_effector(EffectorCache *eff, EffectorData *efd, EffectedPoint *point, float *total_force)
{
PartDeflect *pd = eff->pd;
RNG *rng = pd->rng;
@@ -982,7 +1001,7 @@ void pdDoEffectors(ListBase *effectors, ListBase *colliders, EffectorWeights *we
*/
EffectorCache *eff;
EffectorData efd;
- int p=0, tot = 1;
+ int p=0, tot = 1, step = 1;
/* Cycle through collected objects, get total of (1/(gravity_strength * dist^gravity_power)) */
/* Check for min distance here? (yes would be cool to add that, ton) */
@@ -990,9 +1009,9 @@ void pdDoEffectors(ListBase *effectors, ListBase *colliders, EffectorWeights *we
if(effectors) for(eff = effectors->first; eff; eff=eff->next) {
/* object effectors were fully checked to be OK to evaluate! */
- get_effector_tot(eff, &efd, point, &tot, &p);
+ get_effector_tot(eff, &efd, point, &tot, &p, &step);
- for(; p<tot; p++) {
+ for(; p<tot; p+=step) {
if(get_effector_data(eff, &efd, point, 0)) {
efd.falloff= effector_falloff(eff, &efd, point, weights);
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index deae6d2808b..4afce1e56c4 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -1,4 +1,5 @@
-/* exotic.c
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -20,21 +21,24 @@
* All rights reserved.
*
*
- * Contributor(s):
+ * Contributor(s):
* - Martin DeMello
* Added dxf_read_arc, dxf_read_ellipse and dxf_read_lwpolyline
* Copyright (C) 2004 by Etheract Software Labs
*
* - Blender Foundation
*
- * ***** END GPL LICENSE BLOCK *****/
+ * ***** END GPL LICENSE BLOCK ****
+ */
+#include <stddef.h>
#include "BLI_storage.h"
+#include <stdlib.h>
#include <ctype.h> /* isdigit, isspace */
#include <math.h>
#include <stdio.h>
-#include <stdlib.h>
+
#include <fcntl.h>
#include <string.h>
#include <errno.h>
@@ -59,9 +63,11 @@
#include "DNA_camera_types.h"
#include "DNA_scene_types.h"
-#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_storage.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_global.h"
@@ -71,22 +77,22 @@
#include "BKE_object.h"
#include "BKE_material.h"
#include "BKE_report.h"
-
+#include "BKE_exotic.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_curve.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
#include "zlib.h"
-static int is_dxf(char *str);
-static void dxf_read(Scene *scene, char *filename);
-static int is_stl(char *str);
+static int is_dxf(const char *str);
+static void dxf_read(Scene *scene, const char *filename);
+static int is_stl(const char *str);
-static int is_stl_ascii(char *str)
+static int is_stl_ascii(const char *str)
{
FILE *fpSTL;
char buffer[1000];
@@ -111,7 +117,7 @@ static int is_stl_ascii(char *str)
return 1;
}
-static int is_stl(char *str)
+static int is_stl(const char *str)
{
int i;
i = strlen(str) - 3;
@@ -187,7 +193,7 @@ static void mesh_add_normals_flags(Mesh *me)
}
}
-static void read_stl_mesh_binary(Scene *scene, char *str)
+static void read_stl_mesh_binary(Scene *scene, const char *str)
{
FILE *fpSTL;
Object *ob;
@@ -311,7 +317,7 @@ static void read_stl_mesh_binary(Scene *scene, char *str)
STLBAILOUT("Bad vertex!"); \
++totvert; \
}
-static void read_stl_mesh_ascii(Scene *scene, char *str)
+static void read_stl_mesh_ascii(Scene *scene, const char *str)
{
FILE *fpSTL;
char buffer[2048], *cp;
@@ -360,10 +366,16 @@ static void read_stl_mesh_ascii(Scene *scene, char *str)
* sure we have enough storage for some more faces
*/
if ( (totface) && ( (totface % 10000) == 0 ) ) {
+ float *vertdata_old= vertdata;
++numtenthousand;
vertdata = realloc(vertdata,
numtenthousand*3*30000*sizeof(float));
- if (!vertdata) { STLALLOCERROR; }
+ if (!vertdata) {
+ if(vertdata_old) {
+ free(vertdata_old);
+ }
+ STLALLOCERROR;
+ }
}
/* Don't read normal, but check line for proper syntax anyway
@@ -449,1400 +461,60 @@ static void read_stl_mesh_ascii(Scene *scene, char *str)
#undef STLREADLINE
#undef STLREADVERT
-/* ***************** INVENTOR ******************* */
-
-
-#define IV_MAXSTACK 3000000
-#define IV_MAXFIELD 10
-#define IV_MAXCOL 16
-
-static float *iv_data_stack;
-static float ivcolors[IV_MAXCOL][3];
-static Object *ivsurf;
-static ListBase ivbase;
-
-struct IvNode {
- struct IvNode *next, *prev;
- char *nodename;
- char *fieldname[IV_MAXFIELD];
- int datalen[IV_MAXFIELD];
- float *data[IV_MAXFIELD];
-};
-
-static int iv_curcol=0;
-
-static int iv_colornumber(struct IvNode *iv)
-{
- float *fp, fr = 0.0, fg = 0.0, fb = 0.0;
- int a;
- char *cp;
-
- /* search back to last material */
- while(iv) {
- if( strcmp(iv->nodename, "Material")==0) {
- fp= iv->data[0];
- if(fp==0) fp= iv->data[1];
- if(fp) {
- fr= fp[0];
- fg= fp[1];
- fb= fp[2];
- }
- break;
- }
- else if( strcmp(iv->nodename, "BaseColor")==0) {
- fp= iv->data[0];
- fr= fp[0];
- fg= fp[1];
- fb= fp[2];
- break;
- }
- else if( strcmp(iv->nodename, "PackedColor")==0) {
- cp= (char *)iv->data[0];
- fr= cp[3]/255.0f;
- fg= cp[2]/255.0f;
- fb= cp[1]/255.0f;
- break;
- }
- iv= iv->prev;
-
- }
- if(iv==0) return 0;
- if(iv->datalen[0]<3) return 0;
-
- for(a=0; a<iv_curcol; a++) {
-
- if(ivcolors[a][0]== fr)
- if(ivcolors[a][1]== fg)
- if(ivcolors[a][2]== fb) return a+1
- ;
- }
-
- if(a>=IV_MAXCOL) a= IV_MAXCOL-1;
- iv_curcol= a+1;
- ivcolors[a][0]= fr;
- ivcolors[a][1]= fg;
- ivcolors[a][2]= fb;
-
- return iv_curcol;
-}
-
-static int iv_finddata(struct IvNode *iv, char *field, int fieldnr)
-{
- /* search for "field", count data size and make datablock. return skipdata */
- float *fp;
- int len, stackcount, skipdata=0;
- char *cpa, terminator, str[64];
- intptr_t i;
-
- len= strlen(field);
-
- cpa= iv->nodename+1;
- while( *cpa != '}' ) {
-
- if( *cpa == *field ) {
- if( strncmp(cpa, field, len)==0 ) {
- iv->fieldname[fieldnr]= cpa;
-
- /* read until first character */
- cpa+= len;
- skipdata+= len;
- *cpa= 0;
- cpa++;
- skipdata++;
-
- while( *cpa==32 || *cpa==13 || *cpa==10 || *cpa==9) cpa++;
- if( *cpa=='[' ) {
- terminator= ']';
- cpa++;
- skipdata++;
- }
- else terminator= 13;
-
- stackcount= 0;
- fp= iv_data_stack;
-
- while( *cpa!=terminator && *cpa != '}' ) {
-
- /* in fact, isdigit should include the dot and minus */
- if( (isdigit(*cpa) || *cpa=='.' || *cpa=='-') && (isspace(cpa[-1]) || cpa[-1]==0 || cpa[-1]==',') ) {
- if(cpa[1]=='x') {
- memcpy(str, cpa, 16);
- str[16]= 0;
-
- sscanf(str, "%x", (int *)fp);
- }
- else {
- /* atof doesn't stop after the first float
- * in a long string at Windows... so we copy
- * the float to a new string then atof... */
- char *cpa_temp = strpbrk(cpa, ", \n");
- i = cpa_temp - cpa;
-
- if (i>63) *fp= 0.0;
- else {
- memcpy(str, cpa, i);
- str[i]=0;
-
- *fp= (float) atof(str);
- }
- }
-
- stackcount++;
- if(stackcount>=IV_MAXSTACK) {
- printf("stackoverflow in IV read\n");
- break;
- }
- fp++;
- }
- cpa++;
- skipdata++;
- }
-
- iv->datalen[fieldnr]= stackcount;
- if(stackcount) {
- iv->data[fieldnr]= MEM_mallocN(sizeof(float)*stackcount, "iv_finddata");
- memcpy(iv->data[fieldnr], iv_data_stack, sizeof(float)*stackcount);
- }
- else iv->data[fieldnr]= 0;
-
- return skipdata;
- }
- }
- cpa++;
- skipdata++;
- }
-
- return skipdata;
-}
-
-static void read_iv_index(float *data, float *baseadr, float *index, int nr, int coordtype)
-{
- /* write in data: baseadr with offset index (and number nr) */
- float *fp;
- int ofs;
-
- while(nr--) {
- ofs= (int) *index;
- fp= baseadr+coordtype*ofs;
- VECCOPY(data, fp);
- data+= 3;
- index++;
- }
-}
-
-
-
-static void read_inventor(Scene *scene, char *str, struct ListBase *listb)
-{
- struct IvNode *iv, *ivp, *ivn;
- char *maindata, *md, *cpa;
- float *index, *data, *fp;
- int file, filelen, count, lll, face, nr = 0;
- int skipdata, ok, a, b, tot, first, colnr, coordtype, polytype, *idata;
- struct DispList *dl;
- ReportList *reports= NULL; /* XXX */
-
- ivbase.first= ivbase.last= 0;
- iv_curcol= 0;
- ivsurf= 0;
-
- file= open(str, O_BINARY|O_RDONLY);
- if(file== -1) {
- BKE_reportf(reports, RPT_ERROR, "Can't read file: %s.", strerror(errno));
- return;
- }
-
- filelen= BLI_filesize(file);
- if(filelen < 1) {
- close(file);
- return;
- }
-
- maindata= MEM_mallocN(filelen, "leesInventor");
- if(read(file, maindata, filelen) < filelen) {
- BKE_reportf(reports, RPT_ERROR, "Failed reading file: premature end of file.");
- close(file);
- return;
- }
- close(file);
-
- iv_data_stack= MEM_mallocN(sizeof(float)*IV_MAXSTACK, "ivstack");
-
- /* preprocess: remove comments */
- md= maindata+20;
- count= 20;
- while(count<filelen) {
- if( *md=='#' ) { /* comment */
- while( *md!=13 && *md!=10) { /* enters */
- *md= 32;
- md++;
- count++;
- if(count>=filelen) break;
- }
- }
- md++;
- count++;
- }
-
-
- /* now time to collect: which are the nodes and fields? */
- md= maindata;
- count= 0;
- while(count<filelen) {
- if( *md=='{' ) { /* read back */
-
- cpa= md-1;
- while( *cpa==32 || *cpa==13 || *cpa==10 || *cpa==9) { /* remove spaces/enters/tab */
- *cpa= 0;
- cpa--;
- }
-
- while( *cpa>32 && *cpa<128) cpa--;
- cpa++;
- *md= 0;
-
- ok= 0;
- skipdata= 0;
- iv= MEM_callocN(sizeof(struct IvNode), "leesInventor");
- iv->nodename= cpa;
-
- if(strcmp(cpa, "Coordinate3")==0 || strcmp(cpa, "Coordinate4")==0) {
- skipdata= iv_finddata(iv, "point", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "VertexProperty")==0) {
- skipdata= iv_finddata(iv, "vertex", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "IndexedLineSet")==0) {
- skipdata= iv_finddata(iv, "coordIndex", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "IndexedTriangleMesh")==0) {
- skipdata= iv_finddata(iv, "coordIndex", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "IndexedFaceSet")==0) {
- skipdata= iv_finddata(iv, "coordIndex", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "FaceSet")==0) {
- skipdata= iv_finddata(iv, "numVertices", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "Material")==0) {
- iv_finddata(iv, "diffuseColor", 0);
- iv_finddata(iv, "ambientColor", 1);
- ok= 1;
- }
- else if(strcmp(cpa, "BaseColor")==0) {
- iv_finddata(iv, "rgb", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "PackedColor")==0) {
- iv_finddata(iv, "rgba", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "QuadMesh")==0) {
- iv_finddata(iv, "verticesPerColumn", 0);
- iv_finddata(iv, "verticesPerRow", 1);
-
- ok= 1;
- }
- else if(strcmp(cpa, "IndexedTriangleStripSet")==0) {
- skipdata= iv_finddata(iv, "coordIndex", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "TriangleStripSet")==0) {
- skipdata= iv_finddata(iv, "numVertices", 0);
- ok= 1;
- }
- else if(strcmp(cpa, "IndexedNurbsSurface")==0 || strcmp(cpa, "NurbsSurface")==0) {
- iv_finddata(iv, "numUControlPoints", 0);
- iv_finddata(iv, "numVControlPoints", 1);
- iv_finddata(iv, "uKnotVector", 2);
- iv_finddata(iv, "vKnotVector", 3);
- ok= 1;
- }
- else {
- /* to the end */
- while( *md != '}') {
- md++;
- count++;
- if(count<filelen) break;
- }
- }
-
-
- if(ok) {
- BLI_addtail(&ivbase, iv);
- md+= skipdata;
- count+= skipdata;
- }
- else MEM_freeN(iv);
-
- }
- md++;
- count++;
- }
-
- /* join nodes */
- iv= ivbase.first;
-
- while(iv) {
- ivn= iv->next;
-
- if( strncmp(iv->nodename, "Indexed", 7)==0) {
- /* seek back: same name? */
-
- ivp= iv->prev;
- while(ivp) {
- if(strcmp(iv->nodename, ivp->nodename)==0) break;
-
- if(strcmp(ivp->nodename, "Coordinate3")==0 ||
- strcmp(ivp->nodename, "Coordinate4")==0 ||
- strcmp(ivp->nodename, "VertexProperty")==0) {
- ivp= 0;
- break;
- }
- ivp= ivp->prev;
- }
-
- if(ivp) {
- /* add iv to ivp */
-
- tot= iv->datalen[0] + ivp->datalen[0];
- if(tot) {
- data= MEM_mallocN(tot*sizeof(float), "samenvoeg iv");
- memcpy(data, ivp->data[0], sizeof(float)*ivp->datalen[0]);
- memcpy(data+ivp->datalen[0], iv->data[0], sizeof(float)*iv->datalen[0]);
-
- ivp->datalen[0]+= iv->datalen[0];
- MEM_freeN(ivp->data[0]);
- ivp->data[0]= data;
-
- BLI_remlink(&ivbase, iv);
- MEM_freeN(iv->data[0]);
- MEM_freeN(iv);
- }
- }
- }
-
- iv= ivn;
- }
-
-
- /* convert Nodes to DispLists */
- iv= ivbase.first;
- while(iv) {
-
- /* printf(" Node: %s\n", iv->nodename); */
- /* if(iv->fieldname[0]) printf(" Field: %s len %d\n", iv->fieldname[0], iv->datalen[0]); */
- coordtype= 3;
-
- if( strcmp(iv->nodename, "IndexedLineSet")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
- if(ivp) {
-
- /* count the nr of lines */
- tot= 0;
- index= iv->data[0];
- lll = iv->datalen[0]-1;
- for(a=0; a<lll; a++) {
- if(index[0]!= -1 && index[1]!= -1) tot++;
- index++;
- }
-
- tot*= 2; /* nr of vertices */
- dl= MEM_callocN(sizeof(struct DispList)+tot*3*sizeof(float), "leesInventor1");
- BLI_addtail(listb, dl);
- dl->type= DL_SEGM;
- dl->nr= 2;
- dl->parts= tot/2;
- dl->col= colnr;
- data= (float *)(dl+1);
-
- index= iv->data[0];
- for(a=0; a<lll; a++) {
- if(index[0]!= -1 && index[1]!= -1) {
- read_iv_index(data, ivp->data[0], index, 2, coordtype);
- data+= 6;
- }
- index++;
- }
- }
- }
- else if( strcmp(iv->nodename, "FaceSet")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
-
- if(ivp) {
- /* count triangles */
- tot= 0;
-
- index= iv->data[0];
- polytype= (int) index[0];
-
- for(a=0; a<iv->datalen[0]; a++) {
- if(index[0]== polytype) tot++; /* one kind? */
- index++;
- }
-
-
- tot*= polytype; /* nr of vertices */
- dl= MEM_callocN(sizeof(struct DispList)+tot*3*sizeof(float), "leesInventor4");
- BLI_addtail(listb, dl);
- dl->type= DL_POLY;
- dl->nr= polytype;
- dl->parts= tot/polytype;
- dl->col= colnr;
- data= (float *)(dl+1);
-
- index= ivp->data[0];
- first= 1;
- for(a=0; a<iv->datalen[0]; a++) {
-
- VECCOPY(data, index);
- data+= 3;
- index+= 3;
-
- VECCOPY(data, index);
- data+= 3;
- index+= 3;
-
- VECCOPY(data, index);
- data+= 3;
- index+= 3;
-
- if(polytype==4) {
- VECCOPY(data, index);
- data+= 3;
- index+= 3;
- }
- }
- }
- }
- else if( strcmp(iv->nodename, "TriangleStripSet")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
-
- if(ivp) {
- /* count triangles */
- tot= 0;
- face= 0;
-
- index= iv->data[0]; /* strip size */
-
- for(a=0; a<iv->datalen[0]; a++) {
- tot+= (int) index[0];
- face+= ((int) index[0]) - 2;
- index++;
- }
-
- dl= MEM_callocN(sizeof(struct DispList), "leesInventor4");
- dl->verts= MEM_callocN( tot*3*sizeof(float), "dl verts");
- dl->index= MEM_callocN( face*3*sizeof(int), "dl index");
-
- dl->type= DL_INDEX3;
- dl->nr= tot;
- dl->parts= face;
-
- BLI_addtail(listb, dl);
- dl->col= colnr;
-
- index= iv->data[0]; /* strip size */
- fp= ivp->data[0]; /* vertices */
- data= dl->verts;
- idata= dl->index;
- first= 0;
-
- for(a=0; a<iv->datalen[0]; a++) {
-
- /* vertices */
- for(b=0; b<index[0]; b++) {
- VECCOPY(data, fp);
- data+= 3;
- fp+= coordtype;
- }
-
- /* indices */
- lll = index[0] - 2;
- for(b=0; b<lll; b++) {
- idata[0]= first;
- idata[1]= first+1;
- idata[2]= first+2;
- first++;
- idata+= 3;
- }
- first+= 2;
-
- index++;
- }
- }
- }
- else if( strcmp(iv->nodename, "IndexedFaceSet")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
- if(ivp) {
-
- /* count triangles */
- face= 0;
- index= iv->data[0];
- lll = iv->datalen[0]-2;
- for(a=0; a<lll; a++) {
- if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) face++;
- index++;
- }
-
- /*number of vertices */
- tot= ivp->datalen[0]/coordtype;
-
- if(tot) {
- dl= MEM_callocN(sizeof(struct DispList), "leesInventor5");
- BLI_addtail(listb, dl);
- dl->type= DL_INDEX3;
- dl->nr= tot;
- dl->parts= face;
- dl->col= colnr;
-
- dl->verts= MEM_callocN( tot*3*sizeof(float), "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*face, "dl index");
-
- /* vertices */
- fp= ivp->data[0];
- data= dl->verts;
- for(b=tot; b>0; b--) {
- VECCOPY(data, fp);
- data+= 3;
- fp+= coordtype;
- }
-
- /* indices */
- index= iv->data[0];
- idata= dl->index;
- first= 1;
- lll=iv->datalen[0]-2;
- for(a=0; a<lll; a++) {
-
- if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) {
-
- /* this trick is to fill poly's with more than 3 vertices correctly */
- if(first) {
- nr= (int) index[0];
- first= 0;
- }
- idata[0]= nr;
- idata[1]= (int) index[1];
- idata[2]= (int) index[2];
- idata+= 3;
- }
- else first= 1;
-
- index++;
- }
- }
- }
- }
- else if( strcmp(iv->nodename, "IndexedTriangleMesh")==0 ||
- strcmp(iv->nodename, "IndexedTriangleStripSet")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
- if(ivp) {
-
- /* count triangles */
- face= 0;
- index= iv->data[0];
- lll=iv->datalen[0]-2;
- for(a=0; a<lll; a++) {
- if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) face++;
- index++;
- }
-
- /* nr of vertices */
- tot= ivp->datalen[0]/coordtype;
-
- dl= MEM_callocN(sizeof(struct DispList), "leesInventor6");
- BLI_addtail(listb, dl);
- dl->type= DL_INDEX3;
- dl->nr= tot;
- dl->parts= face;
- dl->col= colnr;
-
- dl->verts= MEM_callocN( tot*3*sizeof(float), "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*face, "dl index");
-
- /* vertices */
- fp= ivp->data[0];
- data= dl->verts;
- for(b=tot; b>0; b--) {
- VECCOPY(data, fp);
- data+= 3;
- fp+= coordtype;
- }
-
- /* indices */
- index= iv->data[0];
- idata= dl->index;
-
- lll=iv->datalen[0]-2;
- for(a=lll; a>0; a--) {
-
- if(index[0]!= -1 && index[1]!= -1 && index[2]!= -1) {
- idata[0]= (int) index[0];
- idata[1]= (int) index[1];
- idata[2]= (int) index[2];
- idata+= 3;
- }
- index++;
- }
- }
- }
- else if( strcmp(iv->nodename, "QuadMesh")==0 ) {
-
- colnr= iv_colornumber(iv);
-
- /* seek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "VertexProperty")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
-
- if(ivp) {
- tot= (int) (floor(*(iv->data[0])+0.5) * floor(*(iv->data[1])+0.5));
-
- if(tot>0) {
- dl= MEM_callocN(sizeof(struct DispList)+tot*3*sizeof(float), "leesInventor8");
- BLI_addtail(listb, dl);
- dl->type= DL_SURF;
- dl->parts= (int) floor(*(iv->data[0])+0.5);
- dl->nr= (int) floor(*(iv->data[1])+0.5);
- dl->col= colnr;
- data= (float *)(dl+1);
- memcpy(data, ivp->data[0], tot*3*sizeof(float));
- }
- }
- }
- else if(strcmp(iv->nodename, "IndexedNurbsSurface")==0 || strcmp(iv->nodename, "NurbsSurface")==0) {
-
- colnr= iv_colornumber(iv);
-
- /* sek back to data */
- ivp= iv;
- while(ivp->prev) {
- ivp= ivp->prev;
- if( strcmp(ivp->nodename, "Coordinate3")==0 ) {
- coordtype= 3;
- break;
- }
- if( strcmp(ivp->nodename, "Coordinate4")==0 ) {
- coordtype= 4;
- break;
- }
- }
- if(ivp) {
- a= (int) *(iv->data[0]);
- b= (int) *(iv->data[1]);
-
- tot= a*b;
-
- if( (a>=4 || b>=4) && tot>6) {
- Object *ob;
- Curve *cu;
- Nurb *nu;
- BPoint *bp;
-
- if(ivsurf==0) {
- ob= add_object(scene, OB_SURF);
- ivsurf= ob;
- }
- else ob= ivsurf;
- cu= ob->data;
- nu = (Nurb*) MEM_callocN(sizeof(Nurb),"addNurbprim") ;
- BLI_addtail(&cu->nurb, nu);
- nu->type= CU_NURBS;
-
- nu->pntsu= a;
- nu->pntsv= b;
- nu->resolu= 2*a;
- nu->resolv= 2*b;
-
- nu->flagu= 0;
- nu->flagv= 0;
-
- nu->bp = bp =
- (BPoint*)MEM_callocN(tot * sizeof(BPoint), "addNurbprim3");
- a= tot;
- data= ivp->data[0];
- while(a--) {
- VECCOPY(bp->vec, data);
- if(coordtype==4) {
- bp->vec[3]= data[3];
- mul_v3_fl(bp->vec, 1.0f/data[3]);
- }
- else bp->vec[3]= 1.0;
- data+= coordtype;
- bp++;
- }
-
- /* iv->datalen[2] / [3] is number of knots */
- nu->orderu= iv->datalen[2] - nu->pntsu;
- nu->orderv= iv->datalen[3] - nu->pntsv;
-
- nu->knotsu= MEM_mallocN( sizeof(float)*(iv->datalen[2]), "knots");
- memcpy(nu->knotsu, iv->data[2], sizeof(float)*(iv->datalen[2]));
- nu->knotsv= MEM_mallocN( sizeof(float)*(iv->datalen[3]), "knots");
- memcpy(nu->knotsv, iv->data[3], sizeof(float)*(iv->datalen[3]));
-
- switchdirectionNurb(nu);
-
- }
- else {
- dl= MEM_callocN(sizeof(struct DispList)+tot*3*sizeof(float), "leesInventor3");
- BLI_addtail(listb, dl);
- dl->type= DL_SURF;
- dl->nr= (int) *(iv->data[0]);
- dl->parts= (int) *(iv->data[1]);
- dl->col= colnr;
- data= (float *)(dl+1);
-
- a= tot;
- fp= ivp->data[0];
- while(a--) {
- VECCOPY(data, fp);
- fp+= coordtype;
- data+= 3;
- }
- }
- }
- }
- iv= iv->next;
- }
-
- /* free */
- iv= ivbase.first;
- while(iv) {
- for(a=0; a<IV_MAXFIELD; a++) {
- if(iv->data[a]) MEM_freeN(iv->data[a]);
- }
- iv= iv->next;
- }
-
- BLI_freelistN(&ivbase);
- MEM_freeN(maindata);
- MEM_freeN(iv_data_stack);
-
-}
-
/* ************************************************************ */
-static void displist_to_mesh(Scene *scene, DispList *dlfirst)
-{
- Object *ob;
- Mesh *me;
- Material *ma;
- DispList *dl;
- MVert *mvert;
- MFace *mface;
- float *data, vec[3], min[3], max[3];
- int a, b, startve, *idata, totedge=0, tottria=0, totquad=0, totvert=0, totface, totcol=0, colnr;
- int p1, p2, p3, p4;
- unsigned int maxvertidx;
-
- /* count first */
- INIT_MINMAX(min, max);
-
- dl= dlfirst;
- while(dl) {
-
- /* PATCH 1 (polyfill) can't be done, there's no listbase here. do that first! */
- /* PATCH 2 */
- if(dl->type==DL_SEGM && dl->nr>2) {
- data= (float *)(dl+1);
- if(data[0]==data[3*(dl->nr-1)]) {
- if(data[1]==data[3*(dl->nr-1)+1]) {
- if(data[2]==data[3*(dl->nr-1)+2]) {
- dl->type= DL_POLY;
- dl->nr--;
- }
- }
- }
- }
-
- /* colors */
- if(dl->col > totcol) totcol= dl->col;
-
- /* size and count */
- if(dl->type==DL_SURF) {
- a= dl->nr;
- b= dl->parts;
- if(dl->flag & DL_CYCL_U) a++;
- if(dl->flag & DL_CYCL_V) b++;
-
- totquad+= a*b;
-
- totvert+= dl->nr*dl->parts;
-
- data= (float *)(dl+1);
- for(a= dl->nr*dl->parts; a>0; a--) {
- DO_MINMAX(data, min, max);
- data+= 3;
- }
- }
- else if(dl->type==DL_POLY) {
- if(dl->nr==3 || dl->nr==4) {
- if(dl->nr==3) tottria+= dl->parts;
- else totquad+= dl->parts;
-
- totvert+= dl->nr*dl->parts;
-
- data= (float *)(dl+1);
- for(a= dl->nr*dl->parts; a>0; a--) {
- DO_MINMAX(data, min, max);
- data+= 3;
- }
- }
- else if(dl->nr>4) {
-
- tottria+= dl->nr*dl->parts;
- totvert+= dl->nr*dl->parts;
-
- data= (float *)(dl+1);
- for(a= dl->nr*dl->parts; a>0; a--) {
- DO_MINMAX(data, min, max);
- data+= 3;
- }
-
- }
- }
- else if(dl->type==DL_INDEX3) {
- tottria+= dl->parts;
- totvert+= dl->nr;
-
- data= dl->verts;
- for(a= dl->nr; a>0; a--) {
- DO_MINMAX(data, min, max);
- data+= 3;
- }
- }
- else if(dl->type==DL_SEGM) {
-
- tottria+= (dl->nr-1)*dl->parts;
- totvert+= dl->nr*dl->parts;
-
- data= (float *)(dl+1);
- for(a= dl->nr*dl->parts; a>0; a--) {
- DO_MINMAX(data, min, max);
- data+= 3;
- }
- }
-
- dl= dl->next;
- }
-
- if(totvert==0) {
- return;
- }
-
- vec[0]= (min[0]+max[0])/2;
- vec[1]= (min[1]+max[1])/2;
- vec[2]= (min[2]+max[2])/2;
-
- ob= add_object(scene, OB_MESH);
- VECCOPY(ob->loc, vec);
- where_is_object(scene, ob);
-
- me= ob->data;
-
- /* colors */
- if(totcol) {
- ob->mat= MEM_callocN(sizeof(void *)*totcol, "ob->mat");
- ob->matbits= MEM_callocN(sizeof(char)*totcol, "ob->matbits");
- me->mat= MEM_callocN(sizeof(void *)*totcol, "me->mat");
- me->totcol= totcol;
- ob->totcol= (unsigned char) me->totcol;
- ob->actcol= 1;
- }
-
- /* materials */
- for(a=0; a<totcol; a++) {
- ma= G.main->mat.first;
- while(ma) {
- if(ma->mtex[0]==0) {
- if(ivcolors[a][0]==ma->r && ivcolors[a][1]==ma->g && ivcolors[a][2]==ma->b) {
- me->mat[a]= ma;
- ma->id.us++;
- break;
- }
- }
- ma= ma->id.next;
- }
- if(ma==0) {
- ma= add_material("ext");
- me->mat[a]= ma;
- ma->r= ivcolors[a][0];
- ma->g= ivcolors[a][1];
- ma->b= ivcolors[a][2];
- automatname(ma);
- }
- }
-
- totface= totquad+tottria+totedge;
-
- printf("Import: %d vertices %d faces\n", totvert, totface);
-
- me->totvert= totvert;
- me->totface= totface;
- me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC,
- NULL, me->totvert);
- me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC,
- NULL, me->totface);
- maxvertidx= totvert-1;
-
- mvert= me->mvert;
- mface= me->mface;
-
- startve= 0;
-
- dl= dlfirst;
- while(dl) {
-
- colnr= dl->col;
- if(colnr) colnr--;
-
- if(dl->type==DL_SURF) {
- data= (float *)(dl+1);
-
- for(a=dl->parts*dl->nr; a>0; a--) {
- mvert->co[0]= data[0] -vec[0];
- mvert->co[1]= data[1] -vec[1];
- mvert->co[2]= data[2] -vec[2];
-
- data+=3;
- mvert++;
- }
-
- for(a=0; a<dl->parts; a++) {
-
- if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
- break;
-
- p1+= startve;
- p2+= startve;
- p3+= startve;
- p4+= startve;
-
- for(; b<dl->nr; b++) {
-
- mface->v1= p1;
- mface->v2= p2;
- mface->v3= p4;
- mface->v4= p3;
-
- mface->mat_nr= colnr;
- test_index_face(mface, NULL, 0, 4);
-
- mface++;
-
- p4= p3;
- p3++;
- p2= p1;
- p1++;
- }
- }
-
- startve += dl->parts*dl->nr;
-
- }
- else if(dl->type==DL_POLY) {
-
- if(dl->nr==3 || dl->nr==4) {
- data= (float *)(dl+1);
-
- for(a=dl->parts*dl->nr; a>0; a--) {
- mvert->co[0]= data[0] -vec[0];
- mvert->co[1]= data[1] -vec[1];
- mvert->co[2]= data[2] -vec[2];
- data+=3;
- mvert++;
- }
-
- for(a=0; a<dl->parts; a++) {
- if(dl->nr==3) {
- mface->v1= startve+a*dl->nr;
- mface->v2= startve+a*dl->nr+1;
- mface->v3= startve+a*dl->nr+2;
- mface->mat_nr= colnr;
- test_index_face(mface, NULL, 0, 3);
- mface++;
- }
- else {
- mface->v1= startve+a*dl->nr;
- mface->v2= startve+a*dl->nr+1;
- mface->v3= startve+a*dl->nr+2;
- mface->v4= startve+a*dl->nr+3;
- mface->mat_nr= colnr;
- test_index_face(mface, NULL, 0, 4);
- mface++;
- }
- }
- startve += dl->parts*dl->nr;
- }
- else if(dl->nr>4) {
- data= (float *)(dl+1);
-
- for(a=dl->parts*dl->nr; a>0; a--) {
- mvert->co[0]= data[0] -vec[0];
- mvert->co[1]= data[1] -vec[1];
- mvert->co[2]= data[2] -vec[2];
-
- data+=3;
- mvert++;
- }
-
- for(b=0; b<dl->parts; b++) {
- for(a=0; a<dl->nr; a++) {
- mface->v1= startve+a;
-
- if(a==dl->nr-1) mface->v2= startve;
- else mface->v2= startve+a+1;
-
- mface->mat_nr= colnr;
-
- mface++;
- }
- startve += dl->nr;
- }
- }
- }
- else if(dl->type==DL_INDEX3) {
- data= dl->verts;
-
- for(a=dl->nr; a>0; a--) {
- mvert->co[0]= data[0] -vec[0];
- mvert->co[1]= data[1] -vec[1];
- mvert->co[2]= data[2] -vec[2];
- data+=3;
- mvert++;
- }
-
- idata= dl->index;
- for(b=dl->parts; b>0; b--) {
- mface->v1= startve+idata[0];
- mface->v2= startve+idata[1];
- mface->v3= startve+idata[2];
- mface->mat_nr= colnr;
-
- if (mface->v1>maxvertidx) mface->v1= maxvertidx;
- if (mface->v2>maxvertidx) mface->v2= maxvertidx;
- if (mface->v3>maxvertidx) mface->v3= maxvertidx;
-
- test_index_face(mface, NULL, 0, 3);
- mface++;
- idata+= 3;
- }
- startve += dl->nr;
- }
- else if(dl->type==DL_SEGM) {
- data= (float *)(dl+1);
-
- for(a=dl->parts*dl->nr; a>0; a--) {
- mvert->co[0]= data[0] -vec[0];
- mvert->co[1]= data[1] -vec[1];
- mvert->co[2]= data[2] -vec[2];
- data+=3;
- mvert++;
- }
-
- for(b=0; b<dl->parts; b++) {
- for(a=0; a<dl->nr-1; a++) {
- mface->v1= startve+a;
- mface->v2= startve+a+1;
- mface->mat_nr= colnr;
- mface++;
- }
- startve += dl->nr;
- }
- }
- dl= dl->next;
- }
-
- mesh_add_normals_flags(me);
- make_edges(me, 0);
-}
-
-static void displist_to_objects(Scene *scene, ListBase *lbase)
-{
- DispList *dl, *first, *prev, *next;
- ListBase tempbase;
- int maxaantal, curcol, totvert=0, vert;
-
- /* irst this: is still active */
- if(ivsurf) {
- where_is_object(scene, ivsurf);
-// XXX docenter_new();
- }
-
- dl= lbase->first;
- while(dl) {
- next= dl->next;
-
- /* PATCH 1: polyfill */
- if(dl->type==DL_POLY && dl->nr>4) {
- /* solution: put them together in separate listbase */
- ;
- }
- /* PATCH 2: poly's of 2 points */
- if(dl->type==DL_POLY && dl->nr==2) dl->type= DL_SEGM;
-
- dl= next;
- }
-
- /* count vertices */
-
- dl= lbase->first;
- while(dl) {
-
- if(dl->type==DL_SURF) totvert+= dl->nr*dl->parts;
- else if(dl->type==DL_POLY) {
- if(dl->nr==3 || dl->nr==4) totvert+= dl->nr*dl->parts;
- else if(dl->nr>4) totvert+= dl->nr*dl->parts;
- }
- else if(dl->type==DL_INDEX3) totvert+= dl->nr;
- else if(dl->type==DL_SEGM) totvert+= dl->nr*dl->parts;
-
- dl= dl->next;
- }
-
- if(totvert==0) {
-
- if(ivsurf==0) {}; //XXX error("Found no data");
- if(lbase->first) BLI_freelistN(lbase);
-
- return;
- }
-
- maxaantal= 32000;
-
- if(totvert>maxaantal) {
-
- /* try to put colors together */
- curcol= 0;
- tempbase.first= tempbase.last= 0;
-
- while(lbase->first) {
- dl= lbase->first;
- while(dl) {
- next= dl->next;
- if(dl->col==curcol) {
- BLI_remlink(lbase, dl);
- BLI_addtail(&tempbase, dl);
- dl->col= 0;
- }
-
- dl= next;
- }
-
- /* in tempbase are all 'curcol' */
- totvert= 0;
- dl= first= tempbase.first;
- while(dl) {
- vert= 0;
-
- if(dl->type==DL_SURF) vert= dl->nr*dl->parts;
- else if(dl->type==DL_POLY) {
- if(dl->nr==3 || dl->nr==4) vert= dl->nr*dl->parts;
- else if(dl->nr>4) vert= dl->nr*dl->parts;
- }
- else if(dl->type==DL_INDEX3) totvert+= dl->nr;
- else if(dl->type==DL_SEGM) vert= dl->nr*dl->parts;
-
- totvert+= vert;
- if(totvert > maxaantal || dl->next==0) {
- if(dl->next==0) {
- displist_to_mesh(scene, first);
- }
- else if(dl->prev) {
- prev= dl->prev;
- prev->next= 0;
- displist_to_mesh(scene, first);
- prev->next= dl;
- first= dl;
- totvert= 0;
- }
- }
-
- dl= dl->next;
- }
-
- freedisplist(&tempbase);
-
- curcol++;
- }
- }
- else displist_to_mesh(scene, lbase->first);
-
- freedisplist(lbase);
-
-}
-
-int BKE_read_exotic(Scene *scene, char *name)
+int BKE_read_exotic(Scene *scene, const char *name)
{
- ListBase lbase={0, 0};
int len;
gzFile gzfile;
- char str[32];
- int *s0 = (int*) str;
- int retval = 0;
+ char header[7];
+ int retval;
// make sure we're not trying to read a directory....
len= strlen(name);
- if (name[len-1] !='/' && name[len-1] != '\\') {
+ if (ELEM(name[len-1], '/', '\\')) {
+ retval= BKE_READ_EXOTIC_FAIL_PATH;
+ }
+ else {
gzfile = gzopen(name,"rb");
- if (NULL == gzfile ) {
- //XXX error("Can't open file: %s", name);
- retval= -1;
- } else {
- gzread(gzfile, str, 31);
+ if (gzfile == NULL) {
+ retval= BKE_READ_EXOTIC_FAIL_OPEN;
+ }
+ else {
+ len= gzread(gzfile, header, sizeof(header));
gzclose(gzfile);
-
- if ((*s0 != FORM) && (strncmp(str, "BLEN", 4) != 0) && !BLI_testextensie(name,".blend.gz")) {
-
+ if (len == sizeof(header) && strncmp(header, "BLENDER", 7) == 0) {
+ retval= BKE_READ_EXOTIC_OK_BLEND;
+ }
+ else {
//XXX waitcursor(1);
- if(strncmp(str, "#Inventor V1.0", 14)==0) {
- if( strncmp(str+15, "ascii", 5)==0) {
- read_inventor(scene, name, &lbase);
- displist_to_objects(scene, &lbase);
- retval = 1;
- } else {
- //XXX error("Can only read Inventor 1.0 ascii");
- }
- }
- else if((strncmp(str, "#VRML V1.0 asc", 14)==0)) {
- read_inventor(scene, name, &lbase);
- displist_to_objects(scene, &lbase);
- retval = 1;
- }
- else if(is_dxf(name)) {
+ if(is_dxf(name)) {
dxf_read(scene, name);
- retval = 1;
+ retval= BKE_READ_EXOTIC_OK_OTHER;
}
else if(is_stl(name)) {
if (is_stl_ascii(name))
read_stl_mesh_ascii(scene, name);
else
read_stl_mesh_binary(scene, name);
- retval = 1;
+ retval= BKE_READ_EXOTIC_OK_OTHER;
}
-#ifndef DISABLE_PYTHON
- // TODO: this should not be in the kernel...
- else { // unknown format, call Python importloader
- if (BPY_call_importloader(name)) {
- retval = 1;
- } else {
- //XXX error("Unknown file type or error, check console");
- }
-
+ else {
+ retval= BKE_READ_EXOTIC_FAIL_FORMAT;
}
-#endif /* DISABLE_PYTHON */
//XXX waitcursor(0);
}
}
}
- return (retval);
+ return retval;
}
/* ************************ WRITE ************************** */
-
-char temp_dir[160]= {0, 0};
-
static void write_vert_stl(Object *ob, MVert *verts, int index, FILE *fpSTL)
{
float vert[3];
@@ -1887,7 +559,7 @@ static int write_derivedmesh_stl(FILE *fpSTL, Object *ob, DerivedMesh *dm)
return numfacets;
}
-static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob, Mesh *me)
+static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob)
{
int numfacets = 0;
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -1902,20 +574,12 @@ static int write_object_stl(FILE *fpSTL, Scene *scene, Object *ob, Mesh *me)
void write_stl(Scene *scene, char *str)
{
Object *ob;
- Mesh *me;
Base *base;
FILE *fpSTL;
int numfacets = 0;
ReportList *reports= NULL; /* XXX */
-
- if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
- if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
- if(BLI_testextensie(str,".stl")==0) strcat(str, ".stl");
- if (BLI_exists(str)) {
- ; //XXX if(saveover(str)==0)
- //XXX return;
- }
+ /* XXX, operator needs to manage filename extension */
fpSTL= fopen(str, "wb");
@@ -1923,7 +587,6 @@ void write_stl(Scene *scene, char *str)
BKE_reportf(reports, RPT_ERROR, "Can't open file: %s.", strerror(errno));
return;
}
- strcpy(temp_dir, str);
//XXX waitcursor(1);
@@ -1942,9 +605,8 @@ void write_stl(Scene *scene, char *str)
if (base->flag & SELECT) {
ob = base->object;
if (ob->type == OB_MESH) {
- me = ob->data;
- if (me)
- numfacets += write_object_stl(fpSTL, scene, ob, me);
+ if(ob->data)
+ numfacets += write_object_stl(fpSTL, scene, ob);
}
}
base= base->next;
@@ -1965,7 +627,6 @@ void write_stl(Scene *scene, char *str)
//XXX waitcursor(0);
}
-/* ******************************* WRITE VRML ***************************** */
static void replace_chars(char *str1, char *str2)
{
@@ -1978,354 +639,6 @@ static void replace_chars(char *str1, char *str2)
}
}
-
-static void write_material_vrml(FILE *fp, Material *ma)
-{
- char str[32];
-
- replace_chars(str, ma->id.name+2);
-
- fprintf(fp, "\tDEF %s\n", str);
- fprintf(fp, "\tMaterial {\n");
-
- fprintf(fp, "\t\tdiffuseColor %f %f %f\n", ma->r, ma->g, ma->b);
- fprintf(fp, "\t\tspecularColor %f %f %f\n", ma->specr, ma->specg, ma->specb);
- fprintf(fp, "\t\tshininess %f \n", ((float)ma->har)/100.0);
- fprintf(fp, "\t\ttransparency %f \n", 1.0-ma->alpha);
-
- fprintf(fp, "\t}\n");
-
-}
-
-unsigned int *mcol_to_vcol(Mesh *me)
-{
- MFace *mface;
- unsigned int *mcol, *mcoln, *mcolmain;
- int a;
-
- if(me->totface==0 || me->mcol==0) return 0;
-
- mcoln= mcolmain= MEM_mallocN(sizeof(int)*me->totvert, "mcoln");
- mcol = (unsigned int *)me->mcol;
- mface= me->mface;
-
- for(a=me->totface; a>0; a--, mface++) {
- mcoln[mface->v1]= mcol[0];
- mcoln[mface->v2]= mcol[1];
- mcoln[mface->v3]= mcol[2];
- if(mface->v4) mcoln[mface->v4]= mcol[3];
-
- mcol+= 4;
- }
-
- return mcolmain;
-}
-
-void mcol_to_rgba(unsigned int col, float *r, float *g, float *b, float *a)
-{
- char *cp;
-
- cp = (char *)&col;
-
- *r= cp[3];
- *r /= 255.0;
-
- *g= cp[2];
- *g /= 255.0;
-
- *b= cp[1];
- *b /= 255.0;
-
- *a= cp[0];
- *a /= 255.0;
-}
-
-static void write_mesh_vrml(FILE *fp, Mesh *me)
-{
- Material *ma;
- MVert *mvert;
- MFace *mface;
- MTFace *tface;
- Image *ima;
- int a, b, totcol, texind;
- char str[32];
-
- replace_chars(str, me->id.name+2);
-
- fprintf(fp, "\tDEF %s\n", str);
- fprintf(fp, "\tSeparator {\n");
-
- if(me->mtface) {
- ima= ((MTFace *)me->mtface)->tpage;
- if(ima) {
- fprintf(fp, "\t\tTexture2 {\n");
- fprintf(fp, "\t\t\tfilename %s\n", ima->name);
- fprintf(fp, "\t\t\twrapS REPEAT \n");
- fprintf(fp, "\t\t\twrapT REPEAT \n");
- fprintf(fp, "\t\t}\n");
- }
- }
-
- if(me->mcol) {
- unsigned int *mcol, *mcolmain;
- float r, g, b, cola;
-
- fprintf(fp, "\t\tMaterial {\n");
- fprintf(fp, "\t\t\tdiffuseColor [\n");
-
- a= me->totvert;
- mcol= mcolmain= mcol_to_vcol(me);
- if(mcol) {
- while(a--) {
- mcol_to_rgba(*mcol, &r, &g, &b, &cola);
- fprintf(fp, "\t\t\t\t %f %f %f,\n", r, g, b);
- mcol++;
- }
- MEM_freeN(mcolmain);
- }
- fprintf(fp, "\t\t\t]\n");
- fprintf(fp, "\t\t}\n");
-
- fprintf(fp, "\t\tMaterialBinding { value PER_VERTEX_INDEXED }\n");
- }
-
-
- fprintf(fp, "\t\tCoordinate3 {\n");
- fprintf(fp, "\t\t\tpoint [\n");
-
- a= me->totvert;
- mvert= me->mvert;
- while(a--) {
- fprintf(fp, "\t\t\t\t %f %f %f,\n", mvert->co[0], mvert->co[1], mvert->co[2]);
- mvert++;
- }
- fprintf(fp, "\t\t\t]\n");
- fprintf(fp, "\t\t}\n");
-
-
- totcol= me->totcol;
- if(totcol==0) totcol= 1;
- texind= 0; // index for uv coords
-
- for(b=0; b<totcol; b++) {
-
- if(me->mcol==0) {
- if(me->mat) {
- ma= me->mat[b];
- if(ma) {
- replace_chars(str, ma->id.name+2);
-
- fprintf(fp, "\t\tUSE %s\n\n", str);
- }
- }
- }
-
- if(me->mtface) {
- fprintf(fp, "\t\tTextureCoordinate2 {\n");
- fprintf(fp, "\t\t\tpoint [\n");
-
- a= me->totface;
- mface= me->mface;
- tface= me->mtface;
- while(a--) {
- if(mface->mat_nr==b) {
- fprintf(fp, "\t\t\t\t %f %f,\n", tface->uv[0][0], tface->uv[0][1]);
- fprintf(fp, "\t\t\t\t %f %f,\n", tface->uv[1][0], tface->uv[1][1]);
- fprintf(fp, "\t\t\t\t %f %f,\n", tface->uv[2][0], tface->uv[2][1]);
- if(mface->v4) fprintf(fp, "\t\t\t\t %f %f,\n", tface->uv[3][0], tface->uv[3][1]);
- }
- mface++;
- tface++;
- }
- fprintf(fp, "\t\t\t]\n");
- fprintf(fp, "\t\t}\n");
- }
-
- fprintf(fp, "\t\tIndexedFaceSet {\n");
- fprintf(fp, "\t\t\tcoordIndex [\n");
-
- a= me->totface;
- mface= me->mface;
- while(a--) {
- if(mface->mat_nr==b) {
- if(mface->v4) fprintf(fp, "\t\t\t\t %d, %d, %d, %d, -1,\n", mface->v1, mface->v2, mface->v3, mface->v4);
- else fprintf(fp, "\t\t\t\t %d, %d, %d, -1,\n", mface->v1, mface->v2, mface->v3);
- }
- mface++;
- }
- fprintf(fp, "\t\t\t]\n");
-
- if(me->mtface) {
- fprintf(fp, "\t\t\ttextureCoordIndex [\n");
-
- a= me->totface;
- mface= me->mface;
- while(a--) {
- if(mface->mat_nr==b) {
- if(mface->v4) {
- fprintf(fp, "\t\t\t\t %d, %d, %d, %d, -1,\n", texind, texind+1, texind+2, texind+3);
- texind+= 4;
- }
- else {
- fprintf(fp, "\t\t\t\t %d, %d, %d, -1,\n", texind, texind+1, texind+2);
- texind+= 3;
- }
- }
- mface++;
- }
- fprintf(fp, "\t\t\t]\n");
- }
- fprintf(fp, "\t\t}\n");
- }
-
- fprintf(fp, "\t}\n");
-}
-
-static void write_camera_vrml(FILE *fp, Object *ob)
-{
- Camera *cam;
-
- if(ob==0) return;
- invert_m4_m4(ob->imat, ob->obmat);
-
- fprintf(fp, "\tMatrixTransform {\n");
-
- fprintf(fp, "\tmatrix \n");
-
- fprintf(fp, "\t\t%f %f %f %f\n", ob->imat[0][0], ob->imat[0][1], ob->imat[0][2], ob->imat[0][3]);
- fprintf(fp, "\t\t%f %f %f %f\n", ob->imat[1][0], ob->imat[1][1], ob->imat[1][2], ob->imat[1][3]);
- fprintf(fp, "\t\t%f %f %f %f\n", ob->imat[2][0], ob->imat[2][1], ob->imat[2][2], ob->imat[2][3]);
- fprintf(fp, "\t\t%f %f %f %f\n", ob->imat[3][0], ob->imat[3][1], ob->imat[3][2], ob->imat[3][3]);
-
- fprintf(fp, "\t}\n");
-
- cam= ob->data;
-
- fprintf(fp, "\tPerspectiveCamera {\n");
- fprintf(fp, "\t\tfocalDistance %f\n", cam->lens/10.0);
-
- fprintf(fp, "\t}\n");
-
-}
-
-static void write_object_vrml(FILE *fp, Object *ob)
-{
- ID *id;
- char str[32];
-
- fprintf(fp, "\tSeparator {\n");
- fprintf(fp, "\t\tMatrixTransform {\n");
-
- fprintf(fp, "\t\tmatrix \n");
-
- fprintf(fp, "\t\t\t%f %f %f %f\n", ob->obmat[0][0], ob->obmat[0][1], ob->obmat[0][2], ob->obmat[0][3]);
- fprintf(fp, "\t\t\t%f %f %f %f\n", ob->obmat[1][0], ob->obmat[1][1], ob->obmat[1][2], ob->obmat[1][3]);
- fprintf(fp, "\t\t\t%f %f %f %f\n", ob->obmat[2][0], ob->obmat[2][1], ob->obmat[2][2], ob->obmat[2][3]);
- fprintf(fp, "\t\t\t%f %f %f %f\n", ob->obmat[3][0], ob->obmat[3][1], ob->obmat[3][2], ob->obmat[3][3]);
-
- fprintf(fp, "\t\t}\n");
-
- id= ob->data;
-
- replace_chars(str, id->name+2);
-
- fprintf(fp, "\t\tUSE %s\n", str);
- fprintf(fp, "\t}\n");
-}
-
-
-void write_vrml(Scene *scene, char *str)
-{
- Mesh *me;
- Material *ma;
- Base *base;
- FILE *fp;
-
- if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
- if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
- if(BLI_testextensie(str,".wrl")==0) strcat(str, ".wrl");
- //XXX saveover() if(saveover(str)==0) return;
-
- fp= fopen(str, "w");
-
- if(fp==NULL) {
- //XXX error("Can't write file");
- return;
- }
- strcpy(temp_dir, str);
-
- //XXX waitcursor(1);
-
- /* FIRST: write all the datablocks */
-
- fprintf(fp, "#VRML V1.0 ascii\n\n# Blender V%d\n\n# 'Switch' is used as a hack, to ensure it is not part of the drawing\n\n", BLENDER_VERSION);
- fprintf(fp, "Separator {\n");
- fprintf(fp, "Switch {\n");
-
- ma= G.main->mat.first;
- while(ma) {
- if(ma->id.us) {
- write_material_vrml(fp, ma);
- }
- ma= ma->id.next;
- }
-
- /* only write meshes we're using in this scene */
- flag_listbase_ids(&G.main->mesh, LIB_DOIT, 0);
-
- for(base= scene->base.first; base; base= base->next)
- if(base->object->type== OB_MESH)
- ((ID *)base->object->data)->flag |= LIB_DOIT;
-
- me= G.main->mesh.first;
- while(me) {
- if(me->id.flag & LIB_DOIT) { /* is the mesh used in this scene ? */
- write_mesh_vrml(fp, me);
- }
- me= me->id.next;
- }
-
- /* THEN:Hidden Objects */
- fprintf(fp, "\n\t# Hidden Objects, in invisible layers\n\n");
- base= scene->base.first;
- while(base) {
- if(base->object->type== OB_MESH) {
- if( (base->lay & scene->lay)==0 ) {
- write_object_vrml(fp, base->object);
- }
- }
- base= base->next;
- }
-
- fprintf(fp, "}\n");
- fprintf(fp, "\n# Visible Objects\n\n");
- fprintf(fp, "Separator {\n");
-
- /* The camera */
-
- write_camera_vrml(fp, scene->camera);
-
- /* THEN:The Objects */
-
- base= scene->base.first;
- while(base) {
- if(base->object->type== OB_MESH) {
- if(base->lay & scene->lay) {
- write_object_vrml(fp, base->object);
- }
- }
- base= base->next;
- }
-
- fprintf(fp, "}\n");
- fprintf(fp, "}\n");
-
- fclose(fp);
-
- //XXX waitcursor(0);
-}
-
-
/* ******************************* WRITE DXF ***************************** */
#define write_group(id,data) fprintf(fp, "%d\n%s\n", id, data)
@@ -2551,15 +864,7 @@ void write_dxf(struct Scene *scene, char *str)
Base *base;
FILE *fp;
- if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0;
- if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
- if(BLI_testextensie(str,".dxf")==0) strcat(str, ".dxf");
-
-
- if (BLI_exists(str)) {
- ; //XXX if(saveover(str)==0)
- // return;
- }
+ /* XXX, operator needs to handle overwrite & rename */
fp= fopen(str, "w");
@@ -2567,7 +872,6 @@ void write_dxf(struct Scene *scene, char *str)
//XXX error("Can't write file");
return;
}
- strcpy(temp_dir, str);
//XXX waitcursor(1);
@@ -2672,7 +976,7 @@ static int all_digits(char *str)
return 1;
}
-static int dxf_get_layer_col(char *layer)
+static int dxf_get_layer_col(char *UNUSED(layer))
{
return 1;
}
@@ -2710,8 +1014,8 @@ static void myfgets(char *str, int len, FILE *fp)
/* three types of enters, \n \r and \r\n */
if(c == '\n') break;
if(c=='\r') {
- c= getc(dxf_fp); // read the linefeed from stream
- if(c != 10) ungetc(c, dxf_fp); // put back, if it's not one...
+ c= getc(fp); // read the linefeed from stream
+ if(c != 10) ungetc(c, fp); // put back, if it's not one...
break;
}
}
@@ -2764,7 +1068,7 @@ static char val[256];
static short error_exit=0;
static short hasbumped=0;
-static int is_dxf(char *str)
+static int is_dxf(const char *str)
{
dxf_line=0;
@@ -2827,7 +1131,7 @@ static void dxf_add_mat (Object *ob, Mesh *me, float color[3], char *layer)
ma= G.main->mat.first;
while(ma) {
- if(ma->mtex[0]==0) {
+ if(ma->mtex[0]==NULL) {
if(color[0]==ma->r && color[1]==ma->g && color[2]==ma->b) {
me->mat[0]= ma;
ma->id.us++;
@@ -2836,7 +1140,7 @@ static void dxf_add_mat (Object *ob, Mesh *me, float color[3], char *layer)
}
ma= ma->id.next;
}
- if(ma==0) {
+ if(ma==NULL) {
ma= add_material("ext");
me->mat[0]= ma;
ma->r= color[0];
@@ -2866,10 +1170,10 @@ static void dxf_get_mesh(Scene *scene, Mesh** m, Object** o, int noob)
*o = add_object(scene, OB_MESH);
ob = *o;
- if (strlen(entname)) new_id(&G.main->object, (ID *)ob, entname);
- else if (strlen(layname)) new_id(&G.main->object, (ID *)ob, layname);
+ if (entname[0]) new_id(&G.main->object, (ID *)ob, entname);
+ else if (layname[0]) new_id(&G.main->object, (ID *)ob, layname);
- if (strlen(layname)) ob->lay= dxf_get_layer_num(scene, layname);
+ if (layname[0]) ob->lay= dxf_get_layer_num(scene, layname);
else ob->lay= scene->lay;
// not nice i know... but add_object() sets active base, which needs layer setting too (ton)
scene->basact->lay= ob->lay;
@@ -2888,8 +1192,8 @@ static void dxf_get_mesh(Scene *scene, Mesh** m, Object** o, int noob)
((ID *)me)->us=0;
- if (strlen(entname)) new_id(&G.main->mesh, (ID *)me, entname);
- else if (strlen(layname)) new_id(&G.main->mesh, (ID *)me, layname);
+ if (entname[0]) new_id(&G.main->mesh, (ID *)me, entname);
+ else if (layname[0]) new_id(&G.main->mesh, (ID *)me, layname);
vcenter = zerovec;
}
@@ -3345,7 +1649,7 @@ static void dxf_read_arc(Scene *scene, int noob)
cent[2]= center[2];
dxf_get_mesh(scene, &me, &ob, noob);
- strcpy(oldllay, layname);
+ BLI_strncpy(oldllay, layname, sizeof(oldllay));
if(ob) VECCOPY(ob->loc, cent);
dxf_add_mat (ob, me, color, layname);
@@ -3902,7 +2206,7 @@ static void dxf_read_3dface(Scene *scene, int noob)
hasbumped=1;
}
-static void dxf_read(Scene *scene, char *filename)
+static void dxf_read(Scene *scene, const char *filename)
{
Mesh *lastMe = G.main->mesh.last;
@@ -4071,7 +2375,7 @@ static void dxf_read(Scene *scene, char *filename)
ob->dupon= 1; ob->dupoff= 0;
ob->dupsta= 1; ob->dupend= 100;
- ob->recalc= OB_RECALC_ALL; /* needed because of weird way of adding libdata directly */
+ ob->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; /* needed because of weird way of adding libdata directly */
ob->data= obdata;
((ID*)ob->data)->us++;
@@ -4090,7 +2394,7 @@ static void dxf_read(Scene *scene, char *filename)
I leave it commented out here as warning (ton) */
//for (i=0; i<ob->totcol; i++) ob->mat[i]= ((Mesh*)ob->data)->mat[i];
- if (strlen(layname)) ob->lay= dxf_get_layer_num(scene, layname);
+ if (layname[0]) ob->lay= dxf_get_layer_num(scene, layname);
else ob->lay= scene->lay;
/* link to scene */
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 43f01199b69..b50943ba9f1 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_animsys.h"
@@ -53,7 +54,7 @@
#include "RNA_access.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -163,10 +164,10 @@ void copy_fcurves (ListBase *dst, ListBase *src)
}
}
-/* --------------------- Finding -------------------------- */
+/* ----------------- Finding F-Curves -------------------------- */
/* high level function to get an fcurve from C without having the rna */
-FCurve *id_data_find_fcurve(ID *id, void *data, StructRNA *type, char *prop_name, int index)
+FCurve *id_data_find_fcurve(ID *id, void *data, StructRNA *type, const char *prop_name, int index)
{
/* anim vars */
AnimData *adt= BKE_animdata_from_id(id);
@@ -220,7 +221,7 @@ FCurve *list_find_fcurve (ListBase *list, const char rna_path[], const int array
for (fcu= list->first; fcu; fcu= fcu->next) {
/* simple string-compare (this assumes that they have the same root...) */
if (fcu->rna_path && !strcmp(fcu->rna_path, rna_path)) {
- /* now check indicies */
+ /* now check indices */
if (fcu->array_index == array_index)
return fcu;
}
@@ -298,36 +299,36 @@ int list_find_data_fcurves (ListBase *dst, ListBase *src, const char *dataPrefix
return matches;
}
-FCurve *rna_get_fcurve(PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction **action, int *driven)
+FCurve *rna_get_fcurve (PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction **action, int *driven)
{
FCurve *fcu= NULL;
*driven= 0;
/* there must be some RNA-pointer + property combon */
- if(prop && ptr->id.data && RNA_property_animateable(ptr, prop)) {
+ if (prop && ptr->id.data && RNA_property_animateable(ptr, prop)) {
AnimData *adt= BKE_animdata_from_id(ptr->id.data);
char *path;
- if(adt) {
- if((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
+ if (adt) {
+ if ((adt->action && adt->action->curves.first) || (adt->drivers.first)) {
/* XXX this function call can become a performance bottleneck */
path= RNA_path_from_ID_to_property(ptr, prop);
- if(path) {
+ if (path) {
/* animation takes priority over drivers */
- if(adt->action && adt->action->curves.first)
+ if (adt->action && adt->action->curves.first)
fcu= list_find_fcurve(&adt->action->curves, path, rnaindex);
/* if not animated, check if driven */
- if(!fcu && (adt->drivers.first)) {
+ if (!fcu && (adt->drivers.first)) {
fcu= list_find_fcurve(&adt->drivers, path, rnaindex);
- if(fcu)
+ if (fcu)
*driven= 1;
}
- if(fcu && action)
+ if (fcu && action)
*action= adt->action;
MEM_freeN(path);
@@ -339,6 +340,8 @@ FCurve *rna_get_fcurve(PointerRNA *ptr, PropertyRNA *prop, int rnaindex, bAction
return fcu;
}
+/* ----------------- Finding Keyframes/Extents -------------------------- */
+
/* threshold for binary-searching keyframes - threshold here should be good enough for now, but should become userpref */
#define BEZT_BINARYSEARCH_THRESH 0.01f /* was 0.00001, but giving errors */
@@ -469,11 +472,7 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
foundvert=1;
}
- /* minimum sizes are 1.0f */
if (foundvert) {
- if (xminv == xmaxv) xmaxv += 1.0f;
- if (yminv == ymaxv) ymaxv += 1.0f;
-
if (xmin) *xmin= xminv;
if (xmax) *xmax= xmaxv;
@@ -481,10 +480,13 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
if (ymax) *ymax= ymaxv;
}
else {
+ if (G.f & G_DEBUG)
+ printf("F-Curve calc bounds didn't find anything, so assuming minimum bounds of 1.0\n");
+
if (xmin) *xmin= 0.0f;
- if (xmax) *xmax= 0.0f;
+ if (xmax) *xmax= 1.0f;
- if (ymin) *ymin= 1.0f;
+ if (ymin) *ymin= 0.0f;
if (ymax) *ymax= 1.0f;
}
}
@@ -520,6 +522,87 @@ void calc_fcurve_range (FCurve *fcu, float *start, float *end)
}
}
+/* ----------------- Status Checks -------------------------- */
+
+/* Are keyframes on F-Curve of any use?
+ * Usability of keyframes refers to whether they should be displayed,
+ * and also whether they will have any influence on the final result.
+ */
+short fcurve_are_keyframes_usable (FCurve *fcu)
+{
+ /* F-Curve must exist */
+ if (fcu == NULL)
+ return 0;
+
+ /* F-Curve must not have samples - samples are mutually exclusive of keyframes */
+ if (fcu->fpt)
+ return 0;
+
+ /* if it has modifiers, none of these should "drastically" alter the curve */
+ if (fcu->modifiers.first) {
+ FModifier *fcm;
+
+ /* check modifiers from last to first, as last will be more influential */
+ // TODO: optionally, only check modifier if it is the active one...
+ for (fcm = fcu->modifiers.last; fcm; fcm = fcm->prev) {
+ /* ignore if muted/disabled */
+ if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
+ continue;
+
+ /* type checks */
+ switch (fcm->type) {
+ /* clearly harmless - do nothing */
+ case FMODIFIER_TYPE_CYCLES:
+ case FMODIFIER_TYPE_STEPPED:
+ case FMODIFIER_TYPE_NOISE:
+ break;
+
+ /* sometimes harmful - depending on whether they're "additive" or not */
+ case FMODIFIER_TYPE_GENERATOR:
+ {
+ FMod_Generator *data = (FMod_Generator *)fcm->data;
+
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ return 0;
+ }
+ break;
+ case FMODIFIER_TYPE_FN_GENERATOR:
+ {
+ FMod_FunctionGenerator *data = (FMod_FunctionGenerator *)fcm->data;
+
+ if ((data->flag & FCM_GENERATOR_ADDITIVE) == 0)
+ return 0;
+ }
+ break;
+
+ /* always harmful - cannot allow */
+ default:
+ return 0;
+ }
+ }
+ }
+
+ /* keyframes are usable */
+ return 1;
+}
+
+/* Can keyframes be added to F-Curve?
+ * Keyframes can only be added if they are already visible
+ */
+short fcurve_is_keyframable (FCurve *fcu)
+{
+ /* F-Curve's keyframes must be "usable" (i.e. visible + have an effect on final result) */
+ if (fcurve_are_keyframes_usable(fcu) == 0)
+ return 0;
+
+ /* F-Curve must currently be editable too */
+ if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) )
+ return 0;
+
+ /* F-Curve is keyframable */
+ return 1;
+}
+
/* ***************************** Keyframe Column Tools ********************************* */
/* add a BezTriple to a column */
@@ -556,7 +639,7 @@ void bezt_add_to_cfra_elem (ListBase *lb, BezTriple *bezt)
/* Basic sampling callback which acts as a wrapper for evaluate_fcurve()
* 'data' arg here is unneeded here...
*/
-float fcurve_samplingcb_evalcurve (FCurve *fcu, void *data, float evaltime)
+float fcurve_samplingcb_evalcurve (FCurve *fcu, void *UNUSED(data), float evaltime)
{
/* assume any interference from drivers on the curve is intended... */
return evaluate_fcurve(fcu, evaltime);
@@ -801,7 +884,7 @@ typedef struct DriverVarTypeInfo {
/* allocation of target slots */
int num_targets; /* number of target slots required */
- char *target_names[MAX_DRIVER_TARGETS]; /* UI names that should be given to the slots */
+ const char *target_names[MAX_DRIVER_TARGETS]; /* UI names that should be given to the slots */
int target_flags[MAX_DRIVER_TARGETS]; /* flags defining the requirements for each slot */
} DriverVarTypeInfo;
@@ -851,31 +934,44 @@ static float dtar_get_prop_val (ChannelDriver *driver, DriverTarget *dtar)
/* get property to read from, and get value as appropriate */
if (RNA_path_resolve_full(&id_ptr, dtar->rna_path, &ptr, &prop, &index)) {
- switch (RNA_property_type(prop)) {
- case PROP_BOOLEAN:
- if (RNA_property_array_length(&ptr, prop))
+ if(RNA_property_array_check(&ptr, prop)) {
+ /* array */
+ if (index < RNA_property_array_length(&ptr, prop)) {
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
value= (float)RNA_property_boolean_get_index(&ptr, prop, index);
- else
- value= (float)RNA_property_boolean_get(&ptr, prop);
+ break;
+ case PROP_INT:
+ value= (float)RNA_property_int_get_index(&ptr, prop, index);
+ break;
+ case PROP_FLOAT:
+ value= RNA_property_float_get_index(&ptr, prop, index);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else {
+ /* not an array */
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
+ value= (float)RNA_property_boolean_get(&ptr, prop);
break;
case PROP_INT:
- if (RNA_property_array_length(&ptr, prop))
- value= (float)RNA_property_int_get_index(&ptr, prop, index);
- else
- value= (float)RNA_property_int_get(&ptr, prop);
+ value= (float)RNA_property_int_get(&ptr, prop);
break;
case PROP_FLOAT:
- if (RNA_property_array_length(&ptr, prop))
- value= RNA_property_float_get_index(&ptr, prop, index);
- else
- value= RNA_property_float_get(&ptr, prop);
+ value= RNA_property_float_get(&ptr, prop);
break;
case PROP_ENUM:
value= (float)RNA_property_enum_get(&ptr, prop);
break;
default:
break;
+ }
}
+
}
else {
if (G.f & G_DEBUG)
@@ -1106,7 +1202,7 @@ static float dvar_eval_transChan (ChannelDriver *driver, DriverVar *dvar)
/* ......... */
/* Table of Driver Varaiable Type Info Data */
-DriverVarTypeInfo dvar_types[MAX_DVAR_TYPES] = {
+static DriverVarTypeInfo dvar_types[MAX_DVAR_TYPES] = {
BEGIN_DVAR_TYPEDEF(DVAR_TYPE_SINGLE_PROP)
dvar_eval_singleProp, /* eval callback */
1, /* number of targets used */
@@ -1137,7 +1233,7 @@ DriverVarTypeInfo dvar_types[MAX_DVAR_TYPES] = {
};
/* Get driver variable typeinfo */
-DriverVarTypeInfo *get_dvar_typeinfo (int type)
+static DriverVarTypeInfo *get_dvar_typeinfo (int type)
{
/* check if valid type */
if ((type >= 0) && (type < MAX_DVAR_TYPES))
@@ -1174,7 +1270,7 @@ void driver_free_variable (ChannelDriver *driver, DriverVar *dvar)
else
MEM_freeN(dvar);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
if(driver->type==DRIVER_TYPE_PYTHON)
driver->flag |= DRIVER_FLAG_RENAMEVAR;
@@ -1231,9 +1327,9 @@ DriverVar *driver_add_new_variable (ChannelDriver *driver)
/* set the default type to 'single prop' */
driver_change_variable_type(dvar, DVAR_TYPE_SINGLE_PROP);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* since driver variables are cached, the expression needs re-compiling too */
- if(driver->type==DRIVER_TYPE_PYTHON)
+ if (driver->type==DRIVER_TYPE_PYTHON)
driver->flag |= DRIVER_FLAG_RENAMEVAR;
#endif
@@ -1258,7 +1354,7 @@ void fcurve_free_driver(FCurve *fcu)
driver_free_variable(driver, dvar);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* free compiled driver expression */
if (driver->expr_comp)
BPY_DECREF(driver->expr_comp);
@@ -1331,7 +1427,7 @@ float driver_get_variable_value (ChannelDriver *driver, DriverVar *dvar)
* - "evaltime" is the frame at which F-Curve is being evaluated
* - has to return a float value
*/
-static float evaluate_driver (ChannelDriver *driver, float evaltime)
+static float evaluate_driver (ChannelDriver *driver, float UNUSED(evaltime))
{
DriverVar *dvar;
@@ -1406,7 +1502,7 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime)
case DRIVER_TYPE_PYTHON: /* expression */
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* check for empty or invalid expression */
if ( (driver->expression[0] == '\0') ||
(driver->flag & DRIVER_FLAG_INVALID) )
@@ -1418,9 +1514,9 @@ static float evaluate_driver (ChannelDriver *driver, float evaltime)
/* this evaluates the expression using Python,and returns its result:
* - on errors it reports, then returns 0.0f
*/
- driver->curval= BPY_eval_driver(driver);
+ driver->curval= BPY_driver_exec(driver);
}
-#endif /* DISABLE_PYTHON*/
+#endif /* WITH_PYTHON*/
}
break;
diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c
index 834fd09aac2..810c56dbe5d 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -1,6 +1,5 @@
-/**
- * fluidsim.c
- *
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -28,6 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
#include "MEM_guardedalloc.h"
@@ -42,6 +42,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_customdata.h"
@@ -50,7 +51,7 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
+
// headers for fluidsim bobj meshes
#include <stdlib.h>
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
index 1642fadf33d..804c26295bd 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: fmodifier.c 21537 2009-07-11 22:22:53Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,10 +38,11 @@
#include "BLI_blenlib.h"
#include "BLI_math.h" /* windows needs for M_PI */
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_idprop.h"
-#include "BKE_utildefines.h"
+
#define SMALL -1.0e-10
#define SELECT 1
@@ -146,7 +147,7 @@ static void fcm_generator_verify (FModifier *fcm)
nc= MEM_callocN(sizeof(float)*(data->poly_order+1), "FMod_Generator_Coefs");
if (data->coefficients) {
- if (data->arraysize > (data->poly_order+1))
+ if ((int)data->arraysize > (data->poly_order+1))
memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order+1));
else
memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
@@ -172,7 +173,7 @@ static void fcm_generator_verify (FModifier *fcm)
nc= MEM_callocN(sizeof(float)*(data->poly_order*2), "FMod_Generator_Coefs");
if (data->coefficients) {
- if (data->arraysize > (data->poly_order * 2))
+ if (data->arraysize > (unsigned int)(data->poly_order * 2))
memcpy(nc, data->coefficients, sizeof(float)*(data->poly_order * 2));
else
memcpy(nc, data->coefficients, sizeof(float)*data->arraysize);
@@ -190,7 +191,7 @@ static void fcm_generator_verify (FModifier *fcm)
}
}
-static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Generator *data= (FMod_Generator *)fcm->data;
@@ -240,7 +241,7 @@ static void fcm_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue,
unsigned int i;
/* for each coefficient pair, solve for that bracket before accumulating in value by multiplying */
- for (cp=data->coefficients, i=0; (cp) && (i < data->poly_order); cp+=2, i++)
+ for (cp=data->coefficients, i=0; (cp) && (i < (unsigned int)data->poly_order); cp+=2, i++)
value *= (cp[0]*evaltime + cp[1]);
/* only if something changed, write *cvalue in one go */
@@ -303,7 +304,7 @@ static double sinc (double x)
return sin(M_PI * x) / (M_PI * x);
}
-static void fcm_fn_generator_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_fn_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_FunctionGenerator *data= (FMod_FunctionGenerator *)fcm->data;
double arg= data->phase_multiplier*evaltime + data->phase_offset;
@@ -432,7 +433,7 @@ static void fcm_envelope_verify (FModifier *fcm)
}
}
-static void fcm_envelope_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_envelope_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed, *prevfed, *lastfed;
@@ -524,12 +525,12 @@ static void fcm_cycles_new_data (void *mdata)
data->before_mode= data->after_mode= FCM_EXTRAPOLATE_CYCLIC;
}
-static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Cycles *data= (FMod_Cycles *)fcm->data;
float prevkey[2], lastkey[2], cycyofs=0.0f;
short side=0, mode=0;
- int cycles=0;
+ int cycles=0, ofs=0;
/* check if modifier is first in stack, otherwise disable ourself... */
// FIXME...
@@ -571,6 +572,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
side= -1;
mode= data->before_mode;
cycles= data->before_cycles;
+ ofs= prevkey[0];
}
}
else if (evaltime > lastkey[0]) {
@@ -578,6 +580,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
side= 1;
mode= data->after_mode;
cycles= data->after_cycles;
+ ofs= lastkey[0];
}
}
if ELEM(0, side, mode)
@@ -585,11 +588,8 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* find relative place within a cycle */
{
- float cycdx=0, cycdy=0, ofs=0;
- float cycle= 0;
-
- /* ofs is start frame of cycle */
- ofs= prevkey[0];
+ float cycdx=0, cycdy=0;
+ float cycle= 0, cyct=0;
/* calculate period and amplitude (total height) of a cycle */
cycdx= lastkey[0] - prevkey[0];
@@ -601,6 +601,9 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* calculate the 'number' of the cycle */
cycle= ((float)side * (evaltime - ofs) / cycdx);
+
+ /* calculate the time inside the cycle */
+ cyct= fmod(evaltime - ofs, cycdx);
/* check that cyclic is still enabled for the specified time */
if (cycles == 0) {
@@ -608,7 +611,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
* as this indicates infinite cycles...
*/
}
- else if (cycle > (cycles+1)) {
+ else if (cycle > cycles) {
/* we are too far away from range to evaluate
* TODO: but we should still hold last value...
*/
@@ -617,26 +620,36 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
/* check if 'cyclic extrapolation', and thus calculate y-offset for this cycle */
if (mode == FCM_EXTRAPOLATE_CYCLIC_OFFSET) {
- cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ if(side < 0)
+ cycyofs = (float)floor((evaltime - ofs) / cycdx);
+ else
+ cycyofs = (float)ceil((evaltime - ofs) / cycdx);
cycyofs *= cycdy;
}
-
+
+ /* special case for cycle start/end */
+ if(cyct == 0.0f) {
+ evaltime = (side == 1 ? lastkey[0] : prevkey[0]);
+
+ if((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)cycle % 2))
+ evaltime = (side == 1 ? prevkey[0] : lastkey[0]);
+ }
/* calculate where in the cycle we are (overwrite evaltime to reflect this) */
- if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle) % 2)) {
+ else if ((mode == FCM_EXTRAPOLATE_MIRROR) && ((int)(cycle+1) % 2)) {
/* when 'mirror' option is used and cycle number is odd, this cycle is played in reverse
* - for 'before' extrapolation, we need to flip in a different way, otherwise values past
* then end of the curve get referenced (result of fmod will be negative, and with different phase)
*/
if (side < 0)
- evaltime= (float)(prevkey[0] - fmod(evaltime-ofs, cycdx));
+ evaltime= prevkey[0] - cyct;
else
- evaltime= (float)(lastkey[0] - fmod(evaltime-ofs, cycdx));
+ evaltime= lastkey[0] - cyct;
}
else {
/* the cycle is played normally... */
- evaltime= (float)(fmod(evaltime-ofs, cycdx) + ofs);
+ evaltime= prevkey[0] + cyct;
}
- if (evaltime < ofs) evaltime += cycdx;
+ if (evaltime < prevkey[0]) evaltime += cycdx;
}
/* store temp data if needed */
@@ -652,7 +665,7 @@ static float fcm_cycles_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
return evaltime;
}
-static void fcm_cycles_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_cycles_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float UNUSED(evaltime))
{
tFCMED_Cycles *edata= (tFCMED_Cycles *)fcm->edata;
@@ -696,7 +709,7 @@ static void fcm_noise_new_data (void *mdata)
data->modification = FCM_NOISE_MODIF_REPLACE;
}
-static void fcm_noise_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_noise_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float evaltime)
{
FMod_Noise *data= (FMod_Noise *)fcm->data;
float noise;
@@ -788,15 +801,15 @@ static void fcm_python_copy (FModifier *fcm, FModifier *src)
pymod->prop = IDP_CopyProperty(opymod->prop);
}
-static void fcm_python_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_python_evaluate (FCurve *UNUSED(fcu), FModifier *UNUSED(fcm), float *UNUSED(cvalue), float UNUSED(evaltime))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//FMod_Python *data= (FMod_Python *)fcm->data;
/* FIXME... need to implement this modifier...
* It will need it execute a script using the custom properties
*/
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
}
static FModifierTypeInfo FMI_PYTHON = {
@@ -817,7 +830,7 @@ static FModifierTypeInfo FMI_PYTHON = {
/* Limits F-Curve Modifier --------------------------- */
-static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_limits_time (FCurve *UNUSED(fcu), FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Limits *data= (FMod_Limits *)fcm->data;
@@ -831,7 +844,7 @@ static float fcm_limits_time (FCurve *fcu, FModifier *fcm, float cvalue, float e
return evaltime;
}
-static void fcm_limits_evaluate (FCurve *fcu, FModifier *fcm, float *cvalue, float evaltime)
+static void fcm_limits_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, float *cvalue, float UNUSED(evaltime))
{
FMod_Limits *data= (FMod_Limits *)fcm->data;
@@ -868,7 +881,7 @@ static void fcm_stepped_new_data (void *mdata)
data->step_size = 2.0f;
}
-static float fcm_stepped_time (FCurve *fcu, FModifier *fcm, float cvalue, float evaltime)
+static float fcm_stepped_time (FCurve *UNUSED(fcu), FModifier *fcm, float UNUSED(cvalue), float evaltime)
{
FMod_Stepped *data= (FMod_Stepped *)fcm->data;
int snapblock;
@@ -920,7 +933,7 @@ static FModifierTypeInfo *fmodifiersTypeInfo[FMODIFIER_NUM_TYPES];
static short FMI_INIT= 1; /* when non-zero, the list needs to be updated */
/* This function only gets called when FMI_INIT is non-zero */
-static void fmods_init_typeinfo ()
+static void fmods_init_typeinfo (void)
{
fmodifiersTypeInfo[0]= NULL; /* 'Null' F-Curve Modifier */
fmodifiersTypeInfo[1]= &FMI_GENERATOR; /* Generator F-Curve Modifier */
@@ -997,9 +1010,13 @@ FModifier *add_fmodifier (ListBase *modifiers, int type)
fcm->flag = FMODIFIER_FLAG_EXPANDED;
BLI_addtail(modifiers, fcm);
+ /* tag modifier as "active" if no other modifiers exist in the stack yet */
+ if (modifiers->first == modifiers->last)
+ fcm->flag |= FMODIFIER_FLAG_ACTIVE;
+
/* add modifier's data */
fcm->data= MEM_callocN(fmi->size, fmi->structName);
-
+
/* init custom settings if necessary */
if (fmi->new_data)
fmi->new_data(fcm->data);
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 501de668000..05988605b4c 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -41,6 +41,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_vfontdata.h"
+#include "BLI_utildefines.h"
#include "DNA_packedFile_types.h"
#include "DNA_curve_types.h"
@@ -49,9 +50,7 @@
#include "DNA_object_types.h"
#include "BKE_utildefines.h"
-
#include "BKE_packedFile.h"
-
#include "BKE_library.h"
#include "BKE_font.h"
#include "BKE_global.h"
@@ -97,13 +96,14 @@ chtoutf8(unsigned long c, char *o)
void
wcs2utf8s(char *dst, wchar_t *src)
{
- char ch[5];
+ /* NULL terminator not needed */
+ char ch[4];
while(*src)
{
- memset(ch, 0, 5);
+ memset(ch, 0, sizeof(ch));
chtoutf8(*src++, ch);
- strcat(dst, ch);
+ dst= strncat(dst, ch, sizeof(ch));
}
}
@@ -124,31 +124,27 @@ wcsleninu8(wchar_t *src)
}
static int
-utf8slen(char *src)
+utf8slen(const char *strc)
{
- int size = 0, index = 0;
- unsigned char c;
-
- c = src[index++];
- while(c)
- {
- if((c & 0x80) == 0)
- {
- index += 0;
- }
- else if((c & 0xe0) == 0xe0)
- {
- index += 2;
- }
- else
- {
- index += 1;
+ int len=0;
+
+ while(*strc) {
+ if ((*strc & 0xe0) == 0xc0) {
+ if((strc[1] & 0x80) && (strc[1] & 0x40) == 0x00)
+ strc++;
+ } else if ((*strc & 0xf0) == 0xe0) {
+ if((strc[1] & strc[2] & 0x80) && ((strc[1] | strc[2]) & 0x40) == 0x00)
+ strc += 2;
+ } else if ((*strc & 0xf8) == 0xf0) {
+ if((strc[1] & strc[2] & strc[3] & 0x80) && ((strc[1] | strc[2] | strc[3]) & 0x40) == 0x00)
+ strc += 3;
}
- size += 1;
- c = src[index++];
+
+ strc++;
+ len++;
}
-
- return size;
+
+ return len;
}
@@ -212,7 +208,7 @@ int utf8towchar(wchar_t *w, char *c)
/* The vfont code */
void free_vfont(struct VFont *vf)
{
- if (vf == 0) return;
+ if (vf == NULL) return;
if (vf->data) {
while(vf->data->characters.first)
@@ -305,7 +301,7 @@ static VFontData *vfont_get_data(VFont *vfont)
if (!vfont->data) {
PackedFile *pf;
- if (BLI_streq(vfont->name, "<builtin>")) {
+ if (strcmp(vfont->name, FO_BUILTIN_NAME)==0) {
pf= get_builtin_packedfile();
} else {
if (vfont->packedfile) {
@@ -342,7 +338,7 @@ static VFontData *vfont_get_data(VFont *vfont)
if(!pf) {
printf("Font file doesn't exist: %s\n", vfont->name);
- strcpy(vfont->name, "<builtin>");
+ strcpy(vfont->name, FO_BUILTIN_NAME);
pf= get_builtin_packedfile();
}
}
@@ -358,7 +354,7 @@ static VFontData *vfont_get_data(VFont *vfont)
return vfont->data;
}
-VFont *load_vfont(char *name)
+VFont *load_vfont(const char *name)
{
char filename[FILE_MAXFILE];
VFont *vfont= NULL;
@@ -367,15 +363,15 @@ VFont *load_vfont(char *name)
int is_builtin;
struct TmpFont *tmpfnt;
- if (BLI_streq(name, "<builtin>")) {
- strcpy(filename, name);
+ if (strcmp(name, FO_BUILTIN_NAME)==0) {
+ BLI_strncpy(filename, name, sizeof(filename));
pf= get_builtin_packedfile();
is_builtin= 1;
} else {
char dir[FILE_MAXDIR];
- strcpy(dir, name);
+ BLI_strncpy(dir, name, sizeof(dir));
BLI_splitdirstring(dir, filename);
pf= newPackedFile(NULL, name);
@@ -394,7 +390,7 @@ VFont *load_vfont(char *name)
/* if there's a font name, use it for the ID name */
if (strcmp(vfd->name, "")!=0) {
- BLI_strncpy(vfont->id.name+2, vfd->name, 21);
+ BLI_strncpy(vfont->id.name+2, vfd->name, sizeof(vfont->id.name)-2);
}
BLI_strncpy(vfont->name, name, sizeof(vfont->name));
@@ -403,8 +399,8 @@ VFont *load_vfont(char *name)
vfont->packedfile = pf;
}
- // Do not add <builtin> to temporary listbase
- if(strcmp(filename, "<builtin>"))
+ // Do not add FO_BUILTIN_NAME to temporary listbase
+ if(strcmp(filename, FO_BUILTIN_NAME))
{
tmpfnt= (struct TmpFont *) MEM_callocN(sizeof(struct TmpFont), "temp_font");
tmpfnt->pf= tpf;
@@ -443,10 +439,10 @@ VFont *get_builtin_font(void)
VFont *vf;
for (vf= G.main->vfont.first; vf; vf= vf->id.next)
- if (BLI_streq(vf->name, "<builtin>"))
+ if (strcmp(vf->name, FO_BUILTIN_NAME)==0)
return vf;
- return load_vfont("<builtin>");
+ return load_vfont(FO_BUILTIN_NAME);
}
static VChar *find_vfont_char(VFontData *vfd, intptr_t character)
@@ -480,7 +476,7 @@ static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, i
nu2->flagu = CU_NURB_CYCLIC;
bp = (BPoint*)MEM_callocN(4 * sizeof(BPoint),"underline_bp");
- if (bp == 0){
+ if (bp == NULL){
MEM_freeN(nu2);
return;
}
@@ -514,11 +510,12 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
float *fp, fsize, shear, x, si, co;
VFontData *vfd = NULL;
VChar *che = NULL;
- int i, sel=0;
+ int i;
vfd= vfont_get_data(which_vfont(cu, info));
if (!vfd) return;
+ /*
if (cu->selend < cu->selstart) {
if ((charidx >= (cu->selend)) && (charidx <= (cu->selstart-2)))
sel= 1;
@@ -527,6 +524,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
if ((charidx >= (cu->selstart-1)) && (charidx <= (cu->selend-1)))
sel= 1;
}
+ */
/* make a copy at distance ofsx,ofsy with shear*/
fsize= cu->fsize;
@@ -546,10 +544,10 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
bezt1 = nu1->bezt;
if (bezt1){
nu2 =(Nurb*) MEM_mallocN(sizeof(Nurb),"duplichar_nurb");
- if (nu2 == 0) break;
+ if (nu2 == NULL) break;
memcpy(nu2, nu1, sizeof(struct Nurb));
nu2->resolu= cu->resolu;
- nu2->bp = 0;
+ nu2->bp = NULL;
nu2->knotsu = nu2->knotsv = NULL;
nu2->flag= CU_SMOOTH;
nu2->charidx = charidx;
@@ -564,7 +562,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
i = nu2->pntsu;
bezt2 = (BezTriple*)MEM_mallocN(i * sizeof(BezTriple),"duplichar_bezt2");
- if (bezt2 == 0){
+ if (bezt2 == NULL){
MEM_freeN(nu2);
break;
}
@@ -672,7 +670,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
VFont *vfont, *oldvfont;
VFontData *vfd= NULL;
Curve *cu;
- CharInfo *info, *custrinfo;
+ CharInfo *info = NULL, *custrinfo;
TextBox *tb;
VChar *che;
struct chartrans *chartransdata=NULL, *ct;
@@ -688,18 +686,18 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
/* renark: do calculations including the trailing '\0' of a string
because the cursor can be at that location */
- if(ob->type!=OB_FONT) return 0;
+ if(ob->type!=OB_FONT) return NULL;
// Set font data
cu= (Curve *) ob->data;
vfont= cu->vfont;
- if(cu->str == NULL) return 0;
- if(vfont == NULL) return 0;
+ if(cu->str == NULL) return NULL;
+ if(vfont == NULL) return NULL;
// Create unicode string
utf8len = utf8slen(cu->str);
- tmp = mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
+ mem = MEM_callocN(((utf8len + 1) * sizeof(wchar_t)), "convertedmem");
utf8towchar(mem, cu->str);
@@ -725,7 +723,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
if(!vfd) {
if(mem)
MEM_freeN(mem);
- return 0;
+ return NULL;
}
/* calc offset and rotation of each char */
@@ -760,7 +758,6 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
for (i = 0 ; i<=slen ; i++) {
makebreak:
// Characters in the list
- che = vfd->characters.first;
info = &(custrinfo[i]);
ascii = mem[i];
if(info->flag & CU_CHINFO_SMALLCAPS) {
@@ -779,10 +776,10 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
/*
* The character wasn't in the current curve base so load it
- * But if the font is <builtin> then do not try loading since
+ * But if the font is FO_BUILTIN_NAME then do not try loading since
* whole font is in the memory already
*/
- if(che == NULL && strcmp(vfont->name, "<builtin>")) {
+ if(che == NULL && strcmp(vfont->name, FO_BUILTIN_NAME)) {
BLI_vfontchar_from_freetypefont(vfont, ascii);
}
@@ -790,11 +787,11 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
che= find_vfont_char(vfd, ascii);
/* No VFont found */
- if (vfont==0) {
+ if (vfont==NULL) {
if(mem)
MEM_freeN(mem);
MEM_freeN(chartransdata);
- return 0;
+ return NULL;
}
if (vfont != oldvfont) {
@@ -807,7 +804,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
if(mem)
MEM_freeN(mem);
MEM_freeN(chartransdata);
- return 0;
+ return NULL;
}
twidth = char_width(cu, che, info);
@@ -862,12 +859,15 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
yof= cu->yof + tb->y/cu->fsize;
}
+ /* XXX, has been unused for years, need to check if this is useful, r4613 r5282 - campbell */
+#if 0
if(ascii == '\n' || ascii == '\r')
xof = cu->xof;
else
xof= cu->xof + (tb->x/cu->fsize);
-
+#else
xof= cu->xof + (tb->x/cu->fsize);
+#endif
lnr++;
cnr= 0;
wsnr= 0;
@@ -1042,10 +1042,9 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
che= find_vfont_char(vfd, ascii);
twidth = char_width(cu, che, info);
-
- dtime= distfac*0.35f*twidth; /* why not 0.5? */
- dtime= distfac*0.5f*twidth; /* why not 0.5? */
-
+
+ dtime= distfac*0.5f*twidth;
+
ctime= timeofs + distfac*( ct->xof - minx);
CLAMP(ctime, 0.0, 1.0);
@@ -1146,16 +1145,14 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
return NULL;
}
- if(mode==0) {
+ if(mode == FO_EDIT) {
/* make nurbdata */
- unsigned long cha;
-
freeNurblist(&cu->nurb);
ct= chartransdata;
if (cu->sepchar==0) {
for (i= 0; i<slen; i++) {
- cha = (uintptr_t) mem[i];
+ unsigned long cha = (uintptr_t) mem[i];
info = &(custrinfo[i]);
if (info->mat_nr > (ob->totcol)) {
/* printf("Error: Illegal material index (%d) in text object, setting to 0\n", info->mat_nr); */
@@ -1193,8 +1190,12 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ascii = mem[i];
info = &(custrinfo[i]);
if (cu->sepchar == (i+1)) {
- float vecyo[3]= {ct->xof, ct->yof, 0.0f};
-
+ float vecyo[3];
+
+ vecyo[0]= ct->xof;
+ vecyo[1]= ct->yof;
+ vecyo[2]= 0.0f;
+
mem[0] = ascii;
mem[1] = 0;
custrinfo[0]= *info;
@@ -1218,7 +1219,5 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
MEM_freeN(mem);
MEM_freeN(chartransdata);
- return 0;
+ return NULL;
}
-
-
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 5612d69ed76..abd7c12ff70 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,8 +33,8 @@
#include "MEM_guardedalloc.h"
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_gpencil_types.h"
@@ -42,7 +42,7 @@
#include "BKE_gpencil.h"
#include "BKE_library.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
+
/* ************************************************** */
@@ -190,7 +190,7 @@ bGPDlayer *gpencil_layer_addnew (bGPdata *gpd)
}
/* add a new gp-datablock */
-bGPdata *gpencil_data_addnew (char name[])
+bGPdata *gpencil_data_addnew (const char name[])
{
bGPdata *gpd;
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index bdf203119c3..e48ec8ac288 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -41,6 +41,8 @@
#include "DNA_particle_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_group.h"
@@ -127,7 +129,7 @@ void unlink_group(Group *group)
group->id.us= 0;
}
-Group *add_group(char *name)
+Group *add_group(const char *name)
{
Group *group;
@@ -327,7 +329,7 @@ static void group_replaces_nla(Object *parent, Object *target, char mode)
you can draw everything, leaves tags in objects to signal it needs further updating */
/* note: does not work for derivedmesh and render... it recreates all again in convertblender.c */
-void group_handle_recalc_and_update(Scene *scene, Object *parent, Group *group)
+void group_handle_recalc_and_update(Scene *scene, Object *UNUSED(parent), Group *group)
{
GroupObject *go;
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 78306705d6b..8ce3847bf08 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "DNA_world_types.h"
#include "DNA_brush_types.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_icons.h"
@@ -76,7 +77,7 @@ static void icon_free(void *val)
/* create an id for a new icon and make sure that ids from deleted icons get reused
after the integer number range is used up */
-static int get_next_free_id()
+static int get_next_free_id(void)
{
int startId = gFirstIconId;
@@ -105,14 +106,14 @@ void BKE_icons_init(int first_dyn_id)
gIcons = BLI_ghash_new(BLI_ghashutil_inthash, BLI_ghashutil_intcmp, "icons_init gh");
}
-void BKE_icons_free()
+void BKE_icons_free(void)
{
if(gIcons)
- BLI_ghash_free(gIcons, 0, icon_free);
+ BLI_ghash_free(gIcons, NULL, icon_free);
gIcons = NULL;
}
-struct PreviewImage* BKE_previewimg_create()
+struct PreviewImage* BKE_previewimg_create(void)
{
PreviewImage* prv_img = NULL;
int i;
@@ -218,7 +219,7 @@ PreviewImage* BKE_previewimg_get(ID *id)
void BKE_icon_changed(int id)
{
- Icon* icon = 0;
+ Icon* icon = NULL;
if (!id || G.background) return;
@@ -241,7 +242,7 @@ void BKE_icon_changed(int id)
int BKE_icon_getid(struct ID* id)
{
- Icon* new_icon = 0;
+ Icon* new_icon = NULL;
if (!id || G.background)
return 0;
@@ -262,8 +263,8 @@ int BKE_icon_getid(struct ID* id)
new_icon->type = GS(id->name);
/* next two lines make sure image gets created */
- new_icon->drawinfo = 0;
- new_icon->drawinfo_free = 0;
+ new_icon->drawinfo = NULL;
+ new_icon->drawinfo_free = NULL;
BLI_ghash_insert(gIcons, SET_INT_IN_POINTER(id->icon_id), new_icon);
@@ -272,13 +273,13 @@ int BKE_icon_getid(struct ID* id)
Icon* BKE_icon_get(int icon_id)
{
- Icon* icon = 0;
+ Icon* icon = NULL;
icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
if (!icon) {
printf("BKE_icon_get: Internal error, no icon for icon ID: %d\n", icon_id);
- return 0;
+ return NULL;
}
return icon;
@@ -286,7 +287,7 @@ Icon* BKE_icon_get(int icon_id)
void BKE_icon_set(int icon_id, struct Icon* icon)
{
- Icon* old_icon = 0;
+ Icon* old_icon = NULL;
old_icon = BLI_ghash_lookup(gIcons, SET_INT_IN_POINTER(icon_id));
@@ -304,6 +305,6 @@ void BKE_icon_delete(struct ID* id)
if (!id->icon_id) return; /* no icon defined for library object */
- BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(id->icon_id), 0, icon_free);
+ BLI_ghash_remove(gIcons, SET_INT_IN_POINTER(id->icon_id), NULL, icon_free);
id->icon_id = 0;
}
diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
index a6c7062e22b..6c8b5329711 100755
--- a/source/blender/blenkernel/intern/idcode.c
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -1,5 +1,5 @@
-/**
- * $Id: idcode.c 31437 2010-08-18 07:14:10Z campbellbarton $
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -33,9 +33,11 @@
#include "DNA_ID.h"
+#include "BKE_idcode.h"
+
typedef struct {
unsigned short code;
- char *name, *plural;
+ const char *name, *plural;
int flags;
#define IDTYPE_FLAGS_ISLINKABLE (1<<0)
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index a0df73d6c42..b3119f317a5 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -266,7 +266,7 @@ void IDP_FreeArray(IDProperty *prop)
return newp;
}
-IDProperty *IDP_CopyArray(IDProperty *prop)
+static IDProperty *IDP_CopyArray(IDProperty *prop)
{
IDProperty *newp = idp_generic_copy(prop);
@@ -328,7 +328,7 @@ IDProperty *IDP_NewString(const char *st, const char *name, int maxlen)
return prop;
}
-IDProperty *IDP_CopyString(IDProperty *prop)
+static IDProperty *IDP_CopyString(IDProperty *prop)
{
IDProperty *newp = idp_generic_copy(prop);
@@ -341,7 +341,7 @@ IDProperty *IDP_CopyString(IDProperty *prop)
}
-void IDP_AssignString(IDProperty *prop, char *st, int maxlen)
+void IDP_AssignString(IDProperty *prop, const char *st, int maxlen)
{
int stlen;
@@ -356,7 +356,7 @@ void IDP_AssignString(IDProperty *prop, char *st, int maxlen)
BLI_strncpy(prop->data.pointer, st, stlen);
}
-void IDP_ConcatStringC(IDProperty *prop, char *st)
+void IDP_ConcatStringC(IDProperty *prop, const char *st)
{
int newlen;
@@ -402,7 +402,7 @@ void IDP_UnlinkID(IDProperty *prop)
/*-------- Group Functions -------*/
/*checks if a property with the same name as prop exists, and if so replaces it.*/
-IDProperty *IDP_CopyGroup(IDProperty *prop)
+static IDProperty *IDP_CopyGroup(IDProperty *prop)
{
IDProperty *newp = idp_generic_copy(prop), *link;
newp->len = prop->len;
@@ -421,9 +421,7 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
IDProperty *loop, *prop;
for (prop=src->data.group.first; prop; prop=prop->next) {
for (loop=dest->data.group.first; loop; loop=loop->next) {
- if (BSTR_EQ(loop->name, prop->name)) {
- int copy_done= 0;
-
+ if (strcmp(loop->name, prop->name)==0) {
if(prop->type==loop->type) {
switch (prop->type) {
@@ -431,11 +429,9 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
case IDP_FLOAT:
case IDP_DOUBLE:
loop->data= prop->data;
- copy_done= 1;
break;
case IDP_GROUP:
IDP_SyncGroupValues(loop, prop);
- copy_done= 1;
break;
default:
{
@@ -444,7 +440,6 @@ void IDP_SyncGroupValues(IDProperty *dest, IDProperty *src)
BLI_insertlinkafter(&dest->data.group, loop, copy);
BLI_remlink(&dest->data.group, tmp);
- loop = copy;
IDP_FreeProperty(tmp);
MEM_freeN(tmp);
@@ -540,6 +535,12 @@ IDProperty *IDP_GetPropertyFromGroup(IDProperty *prop, const char *name)
return (IDProperty *)BLI_findstring(&prop->data.group, name, offsetof(IDProperty, name));
}
+IDProperty *IDP_GetPropertyTypeFromGroup(IDProperty *prop, const char *name, const char type)
+{
+ IDProperty *idprop= IDP_GetPropertyFromGroup(prop, name);
+ return (idprop && idprop->type == type) ? idprop : NULL;
+}
+
typedef struct IDPIter {
void *next;
IDProperty *parent;
@@ -702,7 +703,6 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name)
case IDP_STRING:
{
char *st = val.str;
- int stlen;
prop = MEM_callocN(sizeof(IDProperty), "IDProperty string");
if (st == NULL) {
@@ -710,10 +710,10 @@ IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name)
prop->totallen = DEFAULT_ALLOC_FOR_NULL_STRINGS;
prop->len = 1; /*NULL string, has len of 1 to account for null byte.*/
} else {
- stlen = strlen(st) + 1;
- prop->data.pointer = MEM_callocN(stlen, "id property string 2");
+ int stlen = strlen(st) + 1;
+ prop->data.pointer = MEM_mallocN(stlen, "id property string 2");
prop->len = prop->totallen = stlen;
- strcpy(prop->data.pointer, st);
+ memcpy(prop->data.pointer, st, stlen);
}
break;
}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 0e282aa6449..8a15f63243c 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -54,12 +54,14 @@
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
#include "DNA_camera_types.h"
#include "DNA_sequence_types.h"
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_bmfont.h"
#include "BKE_global.h"
@@ -69,8 +71,9 @@
#include "BKE_main.h"
#include "BKE_packedFile.h"
#include "BKE_scene.h"
-
-//XXX #include "BIF_editseq.h"
+#include "BKE_node.h"
+#include "BKE_sequencer.h" /* seq_foreground_frame_get() */
+#include "BKE_utildefines.h"
#include "BLF_api.h"
@@ -96,14 +99,14 @@ static void de_interlace_ng(struct ImBuf *ibuf) /* neogeo fields */
{
struct ImBuf * tbuf1, * tbuf2;
- if (ibuf == 0) return;
+ if (ibuf == NULL) return;
if (ibuf->flags & IB_fields) return;
ibuf->flags |= IB_fields;
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
- tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect, (unsigned char)0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, (int)IB_rect);
ibuf->x *= 2;
@@ -124,14 +127,14 @@ static void de_interlace_st(struct ImBuf *ibuf) /* standard fields */
{
struct ImBuf * tbuf1, * tbuf2;
- if (ibuf == 0) return;
+ if (ibuf == NULL) return;
if (ibuf->flags & IB_fields) return;
ibuf->flags |= IB_fields;
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, (short)(ibuf->y >> 1), (unsigned char)32, IB_rect);
ibuf->x *= 2;
@@ -329,7 +332,7 @@ void BKE_image_merge(Image *dest, Image *source)
/* otherwise creates new. */
/* does not load ibuf itself */
/* pass on optional frame for #name images */
-Image *BKE_add_image_file(const char *name, int frame)
+Image *BKE_add_image_file(const char *name)
{
Image *ima;
int file, len;
@@ -337,7 +340,7 @@ Image *BKE_add_image_file(const char *name, int frame)
char str[FILE_MAX], strtest[FILE_MAX];
BLI_strncpy(str, name, sizeof(str));
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
/* exists? */
file= open(str, O_BINARY|O_RDONLY);
@@ -348,7 +351,7 @@ Image *BKE_add_image_file(const char *name, int frame)
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if(ima->source!=IMA_SRC_VIEWER && ima->source!=IMA_SRC_GENERATED) {
BLI_strncpy(strtest, ima->name, sizeof(ima->name));
- BLI_path_abs(strtest, G.sce);
+ BLI_path_abs(strtest, G.main->name);
if( strcmp(strtest, str)==0 ) {
if(ima->anim==NULL || ima->id.us==0) {
@@ -381,22 +384,22 @@ Image *BKE_add_image_file(const char *name, int frame)
return ima;
}
-static ImBuf *add_ibuf_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
+static ImBuf *add_ibuf_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
{
ImBuf *ibuf;
unsigned char *rect= NULL;
float *rect_float= NULL;
if (floatbuf) {
- ibuf= IMB_allocImBuf(width, height, depth, IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(width, height, depth, IB_rectfloat);
rect_float= (float*)ibuf->rect_float;
}
else {
- ibuf= IMB_allocImBuf(width, height, depth, IB_rect, 0);
+ ibuf= IMB_allocImBuf(width, height, depth, IB_rect);
rect= (unsigned char*)ibuf->rect;
}
- strcpy(ibuf->name, "//Untitled");
+ BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
ibuf->userflags |= IB_BITMAPDIRTY;
switch(uvtestgrid) {
@@ -414,7 +417,7 @@ static ImBuf *add_ibuf_size(int width, int height, char *name, int depth, int fl
}
/* adds new image block, creates ImBuf and initializes color */
-Image *BKE_add_image_size(int width, int height, char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
+Image *BKE_add_image_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short uvtestgrid, float color[4])
{
/* on save, type is changed to FILE in editsima.c */
Image *ima= image_alloc(name, IMA_SRC_GENERATED, IMA_TYPE_UV_TEST);
@@ -510,7 +513,7 @@ static void tag_all_images_time()
}
#endif
-void free_old_images()
+void free_old_images(void)
{
Image *ima;
static int lasttime = 0;
@@ -523,6 +526,10 @@ void free_old_images()
if (U.textimeout == 0 || ctime % U.texcollectrate || ctime == lasttime)
return;
+ /* of course not! */
+ if (G.rendering)
+ return;
+
lasttime = ctime;
ima= G.main->image.first;
@@ -595,7 +602,7 @@ void BKE_image_free_all_textures(void)
{
Tex *tex;
Image *ima;
- unsigned int totsize= 0;
+ /* unsigned int totsize= 0; */
for(ima= G.main->image.first; ima; ima= ima->id.next)
ima->id.flag &= ~LIB_DOIT;
@@ -607,13 +614,20 @@ void BKE_image_free_all_textures(void)
for(ima= G.main->image.first; ima; ima= ima->id.next) {
if(ima->ibufs.first && (ima->id.flag & LIB_DOIT)) {
ImBuf *ibuf;
+
for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next) {
- if(ibuf->mipmap[0])
+ /* escape when image is painted on */
+ if(ibuf->userflags & IB_BITMAPDIRTY)
+ break;
+
+ /* if(ibuf->mipmap[0])
totsize+= 1.33*ibuf->x*ibuf->y*4;
else
- totsize+= ibuf->x*ibuf->y*4;
+ totsize+= ibuf->x*ibuf->y*4;*/
+
}
- image_free_buffers(ima);
+ if(ibuf==NULL)
+ image_free_buffers(ima);
}
}
/* printf("freed total %d MB\n", totsize/(1024*1024)); */
@@ -756,9 +770,9 @@ int BKE_imtype_is_movie(int imtype)
return 0;
}
-void BKE_add_image_extension(char *string, int imtype)
+int BKE_add_image_extension(char *string, int imtype)
{
- char *extension="";
+ const char *extension= NULL;
if(imtype== R_IRIS) {
if(!BLI_testextensie(string, ".rgb"))
@@ -829,7 +843,15 @@ void BKE_add_image_extension(char *string, int imtype)
extension= ".jpg";
}
- strcat(string, extension);
+ if(extension) {
+ /* prefer this in many cases to avoid .png.tga, but in certain cases it breaks */
+ /* return BLI_replace_extension(string, FILE_MAX, extension); */
+ strcat(string, extension);
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
}
/* could allow access externally - 512 is for long names, 64 is for id names */
@@ -841,6 +863,7 @@ typedef struct StampData {
char time[512];
char frame[512];
char camera[64];
+ char cameralens[64];
char scene[64];
char strip[64];
char rendertime[64];
@@ -853,32 +876,23 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
time_t t;
if (scene->r.stamp & R_STAMP_FILENAME) {
- if (G.relbase_valid) {
- if (do_prefix) sprintf(stamp_data->file, "File %s", G.sce);
- else sprintf(stamp_data->file, "%s", G.sce);
- } else {
- if (do_prefix) strcpy(stamp_data->file, "File <untitled>");
- else strcpy(stamp_data->file, "<untitled>");
- }
+ BLI_snprintf(stamp_data->file, sizeof(stamp_data->file), do_prefix ? "File %s":"%s", G.relbase_valid ? G.main->name:"<untitled>");
} else {
stamp_data->file[0] = '\0';
}
if (scene->r.stamp & R_STAMP_NOTE) {
/* Never do prefix for Note */
- sprintf(stamp_data->note, "%s", scene->r.stamp_udata);
+ BLI_snprintf(stamp_data->note, sizeof(stamp_data->note), "%s", scene->r.stamp_udata);
} else {
stamp_data->note[0] = '\0';
}
if (scene->r.stamp & R_STAMP_DATE) {
-
- t = time (NULL);
- tl = localtime (&t);
- sprintf (text, "%04d/%02d/%02d %02d:%02d:%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday, tl->tm_hour, tl->tm_min, tl->tm_sec);
-
- if (do_prefix) sprintf(stamp_data->date, "Date %s", text);
- else sprintf(stamp_data->date, "%s", text);
+ t = time(NULL);
+ tl = localtime(&t);
+ BLI_snprintf(text, sizeof(text), "%04d/%02d/%02d %02d:%02d:%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday, tl->tm_hour, tl->tm_min, tl->tm_sec);
+ BLI_snprintf(stamp_data->date, sizeof(stamp_data->date), do_prefix ? "Date %s":"%s", text);
} else {
stamp_data->date[0] = '\0';
}
@@ -888,18 +902,17 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
if (name) strcpy(text, name);
else strcpy(text, "<none>");
-
- if (do_prefix) sprintf(stamp_data->marker, "Marker %s", text);
- else sprintf(stamp_data->marker, "%s", text);
+
+ BLI_snprintf(stamp_data->marker, sizeof(stamp_data->marker), do_prefix ? "Marker %s":"%s", text);
} else {
stamp_data->marker[0] = '\0';
}
if (scene->r.stamp & R_STAMP_TIME) {
- int h, m, s, f;
- h= m= s= f= 0;
- f = (int)(scene->r.cfra % scene->r.frs_sec);
- s = (int)(scene->r.cfra / scene->r.frs_sec);
+ int f = (int)(scene->r.cfra % scene->r.frs_sec);
+ int s = (int)(scene->r.cfra / scene->r.frs_sec);
+ int h= 0;
+ int m= 0;
if (s) {
m = (int)(s / 60);
@@ -912,50 +925,58 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
}
if (scene->r.frs_sec < 100)
- sprintf (text, "%02d:%02d:%02d.%02d", h, m, s, f);
+ BLI_snprintf(text, sizeof(text), "%02d:%02d:%02d.%02d", h, m, s, f);
else
- sprintf (text, "%02d:%02d:%02d.%03d", h, m, s, f);
-
- if (do_prefix) sprintf(stamp_data->time, "Time %s", text);
- else sprintf(stamp_data->time, "%s", text);
+ BLI_snprintf(text, sizeof(text), "%02d:%02d:%02d.%03d", h, m, s, f);
+
+ BLI_snprintf(stamp_data->time, sizeof(stamp_data->time), do_prefix ? "Time %s":"%s", text);
} else {
stamp_data->time[0] = '\0';
}
if (scene->r.stamp & R_STAMP_FRAME) {
char format[32];
- if (do_prefix) sprintf(format, "Frame %%0%di", 1 + (int) log10(scene->r.efra));
- else sprintf(format, "%%0%di", 1 + (int) log10(scene->r.efra));
- sprintf (stamp_data->frame, format, scene->r.cfra);
+ int digits= 1;
+
+ if(scene->r.efra>9)
+ digits= 1 + (int) log10(scene->r.efra);
+
+ BLI_snprintf(format, sizeof(format), do_prefix ? "Frame %%0%di":"%%0%di", digits);
+ BLI_snprintf (stamp_data->frame, sizeof(stamp_data->frame), format, scene->r.cfra);
} else {
stamp_data->frame[0] = '\0';
}
if (scene->r.stamp & R_STAMP_CAMERA) {
- if (scene->camera) strcpy(text, ((Camera *) scene->camera)->id.name+2);
- else strcpy(text, "<none>");
-
- if (do_prefix) sprintf(stamp_data->camera, "Camera %s", text);
- else sprintf(stamp_data->camera, "%s", text);
+ BLI_snprintf(stamp_data->camera, sizeof(stamp_data->camera), do_prefix ? "Camera %s":"%s", scene->camera ? scene->camera->id.name+2 : "<none>");
} else {
stamp_data->camera[0] = '\0';
}
+ if (scene->r.stamp & R_STAMP_CAMERALENS) {
+ if (scene->camera && scene->camera->type == OB_CAMERA) {
+ BLI_snprintf(text, sizeof(text), "%.2f", ((Camera *)scene->camera->data)->lens);
+ }
+ else strcpy(text, "<none>");
+
+ BLI_snprintf(stamp_data->cameralens, sizeof(stamp_data->cameralens), do_prefix ? "Lens %s":"%s", text);
+ } else {
+ stamp_data->cameralens[0] = '\0';
+ }
+
if (scene->r.stamp & R_STAMP_SCENE) {
- if (do_prefix) sprintf(stamp_data->scene, "Scene %s", scene->id.name+2);
- else sprintf(stamp_data->scene, "%s", scene->id.name+2);
+ BLI_snprintf(stamp_data->scene, sizeof(stamp_data->scene), do_prefix ? "Scene %s":"%s", scene->id.name+2);
} else {
stamp_data->scene[0] = '\0';
}
if (scene->r.stamp & R_STAMP_SEQSTRIP) {
- Sequence *seq= NULL; //XXX = get_foreground_frame_seq(scene->r.cfra);
+ Sequence *seq= seq_foreground_frame_get(scene, scene->r.cfra);
if (seq) strcpy(text, seq->name+2);
else strcpy(text, "<none>");
-
- if (do_prefix) sprintf(stamp_data->strip, "Strip %s", text);
- else sprintf(stamp_data->strip, "%s", text);
+
+ BLI_snprintf(stamp_data->strip, sizeof(stamp_data->strip), do_prefix ? "Strip %s":"%s", text);
} else {
stamp_data->strip[0] = '\0';
}
@@ -967,37 +988,20 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix)
if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) {
BLI_timestr(stats->lastframetime, text);
- if (do_prefix) sprintf(stamp_data->rendertime, "RenderTime %s", text);
- else sprintf(stamp_data->rendertime, "%s", text);
+ BLI_snprintf(stamp_data->rendertime, sizeof(stamp_data->rendertime), do_prefix ? "RenderTime %s":"%s", text);
} else {
stamp_data->rendertime[0] = '\0';
}
}
}
-// XXX - Bad level call.
-extern int datatoc_bmonofont_ttf_size;
-extern char datatoc_bmonofont_ttf[];
-
-// XXX - copied from text_font_begin ! Change all the BLF_* here
-static int mono= -1;
-
-int stamp_font_begin(int size)
-{
- if (mono == -1)
- mono= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
- BLF_size(mono, size, 72);
- return(mono); // XXX This is for image_gen.c!!
-}
-
void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, int height, int channels)
{
struct StampData stamp_data;
float w, h, pad;
int x, y;
float h_fixed;
+ const int mono= blf_mono_font_render; // XXX
if (!rect && !rectf)
return;
@@ -1008,8 +1012,9 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
if(scene->r.stamp_font_id < 8)
scene->r.stamp_font_id= 12;
- stamp_font_begin(scene->r.stamp_font_id);
-
+ /* set before return */
+ BLF_size(mono, scene->r.stamp_font_id, 72);
+
BLF_buffer(mono, rectf, rect, width, height, channels);
BLF_buffer_col(mono, scene->r.fg_stamp[0], scene->r.fg_stamp[1], scene->r.fg_stamp[2], 1.0);
pad= BLF_width(mono, "--");
@@ -1137,6 +1142,18 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2);
BLF_position(mono, x, y+3, 0.0);
BLF_draw_buffer(mono, stamp_data.camera);
+
+ /* space width. */
+ x += w + pad;
+ }
+
+ if (stamp_data.cameralens[0]) {
+ BLF_width_and_height(mono, stamp_data.cameralens, &w, &h); h= h_fixed;
+
+ /* extra space for background. */
+ buf_rectfill_area(rect, rectf, width, height, scene->r.bg_stamp, x, y, x+w+2, y+h+2);
+ BLF_position(mono, x, y+3, 0.0);
+ BLF_draw_buffer(mono, stamp_data.cameralens);
}
if (stamp_data.scene[0]) {
@@ -1154,7 +1171,7 @@ void BKE_stamp_buf(Scene *scene, unsigned char *rect, float *rectf, int width, i
}
if (stamp_data.strip[0]) {
- BLF_width_and_height(mono, stamp_data.scene, &w, &h); h= h_fixed;
+ BLF_width_and_height(mono, stamp_data.strip, &w, &h); h= h_fixed;
/* Top right corner, with an extra space because blenfont is too strict! */
x= width - w - pad;
@@ -1187,15 +1204,40 @@ void BKE_stamp_info(Scene *scene, struct ImBuf *ibuf)
if (stamp_data.time[0]) IMB_metadata_change_field (ibuf, "Time", stamp_data.time);
if (stamp_data.frame[0]) IMB_metadata_change_field (ibuf, "Frame", stamp_data.frame);
if (stamp_data.camera[0]) IMB_metadata_change_field (ibuf, "Camera", stamp_data.camera);
+ if (stamp_data.cameralens[0]) IMB_metadata_change_field (ibuf, "Lens", stamp_data.cameralens);
if (stamp_data.scene[0]) IMB_metadata_change_field (ibuf, "Scene", stamp_data.scene);
if (stamp_data.strip[0]) IMB_metadata_change_field (ibuf, "Strip", stamp_data.strip);
if (stamp_data.rendertime[0]) IMB_metadata_change_field (ibuf, "RenderTime", stamp_data.rendertime);
}
-int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimtype, int quality)
+int BKE_alphatest_ibuf(ImBuf *ibuf)
+{
+ int tot;
+ if(ibuf->rect_float) {
+ float *buf= ibuf->rect_float;
+ for(tot= ibuf->x * ibuf->y; tot--; buf+=4) {
+ if(buf[3] < 1.0f) {
+ return TRUE;
+ }
+ }
+ }
+ else if (ibuf->rect) {
+ unsigned char *buf= (unsigned char *)ibuf->rect;
+ for(tot= ibuf->x * ibuf->y; tot--; buf+=4) {
+ if(buf[3] != 255) {
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, const char *name, int imtype, int subimtype, int quality)
{
int ok;
-
+ (void)subimtype; /* quies unused warnings */
+
if(imtype==0) {
/* pass */
}
@@ -1203,7 +1245,7 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
ibuf->ftype= IMAGIC;
}
#ifdef WITH_HDR
- else if ((imtype==R_RADHDR)) {
+ else if (imtype==R_RADHDR) {
ibuf->ftype= RADHDR;
}
#endif
@@ -1215,11 +1257,11 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
}
#ifdef WITH_DDS
- else if ((imtype==R_DDS)) {
+ else if (imtype==R_DDS) {
ibuf->ftype= DDS;
}
#endif
- else if ((imtype==R_BMP)) {
+ else if (imtype==R_BMP) {
ibuf->ftype= BMP;
}
#ifdef WITH_TIFF
@@ -1299,12 +1341,14 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, char *name, int imtype, int subimt
}
-void BKE_makepicstring(char *string, char *base, int frame, int imtype, int use_ext)
+void BKE_makepicstring(char *string, const char *base, int frame, int imtype, const short use_ext, const short use_frames)
{
if (string==NULL) return;
BLI_strncpy(string, base, FILE_MAX - 10); /* weak assumption */
- BLI_path_abs(string, G.sce);
- BLI_path_frame(string, frame, 4);
+ BLI_path_abs(string, G.main->name);
+
+ if(use_frames)
+ BLI_path_frame(string, frame, 4);
if(use_ext)
BKE_add_image_extension(string, imtype);
@@ -1318,7 +1362,7 @@ struct anim *openanim(char *name, int flags)
struct ImBuf *ibuf;
anim = IMB_open_anim(name, flags);
- if (anim == NULL) return(0);
+ if (anim == NULL) return NULL;
ibuf = IMB_anim_absolute(anim, 0);
if (ibuf == NULL) {
@@ -1327,7 +1371,7 @@ struct anim *openanim(char *name, int flags)
else
printf("anim file doesn't exist: %s\n", name);
IMB_free_anim(anim);
- return(0);
+ return NULL;
}
IMB_freeImBuf(ibuf);
@@ -1408,7 +1452,9 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
}
}
- image_free_buffers(ima);
+ /* force reload on first use, but not for multilayer, that makes nodes and buttons in ui drawing fail */
+ if(ima->type!=IMA_TYPE_MULTILAYER)
+ image_free_buffers(ima);
ima->ok= 1;
if(iuser)
@@ -1447,6 +1493,17 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
}
break;
}
+
+ /* dont use notifiers because they are not 100% sure to succseed
+ * this also makes sure all scenes are accounted for. */
+ {
+ Scene *scene;
+ for(scene= G.main->scene.first; scene; scene= scene->id.next) {
+ if(scene->nodetree) {
+ NodeTagIDChanged(scene->nodetree, &ima->id);
+ }
+ }
+ }
}
/* if layer or pass changes, we need an index for the imbufs list */
@@ -1549,15 +1606,10 @@ static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
/* common stuff to do with images after loading */
static void image_initialize_after_load(Image *ima, ImBuf *ibuf)
{
-
-
/* preview is NULL when it has never been used as an icon before */
if(G.background==0 && ima->preview==NULL)
BKE_icon_changed(BKE_icon_getid(&ima->id));
-
- /* stringcodes also in ibuf, ibuf->name is used to retrieve original (buttons) */
- BLI_strncpy(ibuf->name, ima->name, FILE_MAX);
-
+
/* fields */
if (ima->flag & IMA_FIELDS) {
if(ima->flag & IMA_STD_FIELD) de_interlace_st(ibuf);
@@ -1582,15 +1634,14 @@ static ImBuf *image_load_sequence_file(Image *ima, ImageUser *iuser, int frame)
ima->tpageflag |= IMA_TPAGE_REFRESH;
ima->lastframe= frame;
-
- BLI_stringdec(ima->name, head, tail, &numlen);
- BLI_stringenc(ima->name, head, tail, numlen, frame);
BLI_strncpy(name, ima->name, sizeof(name));
-
+ BLI_stringdec(name, head, tail, &numlen);
+ BLI_stringenc(name, head, tail, numlen, frame);
+
if(ima->id.lib)
BLI_path_abs(name, ima->id.lib->filepath);
else
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
flag= IB_rect|IB_multilayer;
if(ima->flag & IMA_DO_PREMUL)
@@ -1662,11 +1713,12 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int f
if(rpass) {
// printf("load from pass %s\n", rpass->name);
/* since we free render results, we copy the rect */
- ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0);
ibuf->rect_float= MEM_dupallocN(rpass->rect);
ibuf->flags |= IB_rectfloat;
ibuf->mall= IB_rectfloat;
ibuf->channels= rpass->channels;
+ ibuf->profile = IB_PROFILE_LINEAR_RGB;
image_initialize_after_load(ima, ibuf);
image_assign_ibuf(ima, ibuf, iuser?iuser->multi_index:0, frame);
@@ -1697,7 +1749,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
if(ima->id.lib)
BLI_path_abs(str, ima->id.lib->filepath);
else
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
ima->anim = openanim(str, IB_rect);
@@ -1730,8 +1782,7 @@ static ImBuf *image_load_movie_file(Image *ima, ImageUser *iuser, int frame)
return ibuf;
}
-/* cfra used for # code, Image can only have this # for all its users
- * warning, 'iuser' can be NULL */
+/* warning, 'iuser' can be NULL */
static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
{
struct ImBuf *ibuf;
@@ -1758,9 +1809,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
if(ima->id.lib)
BLI_path_abs(str, ima->id.lib->filepath);
else
- BLI_path_abs(str, G.sce);
-
- BLI_path_frame(str, cfra, 0);
+ BLI_path_abs(str, G.main->name);
/* read ibuf */
ibuf = IMB_loadiffname(str, flag);
@@ -1813,7 +1862,7 @@ static ImBuf *image_get_ibuf_multilayer(Image *ima, ImageUser *iuser)
RenderPass *rpass= BKE_image_multilayer_index(ima->rr, iuser);
if(rpass) {
- ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(ima->rr->rectx, ima->rr->recty, 32, 0);
image_initialize_after_load(ima, ibuf);
@@ -1920,7 +1969,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
/* make ibuf if needed, and initialize it */
if(ibuf==NULL) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0);
image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
}
@@ -1952,6 +2001,9 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_
ibuf->flags &= ~IB_zbuffloat;
}
+ /* since its possible to access the buffer from the image directly, set the profile [#25073] */
+ ibuf->profile= (iuser->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT) ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_NONE;
+
ibuf->dither= dither;
ima->ok= IMA_OK_LOADED;
@@ -1981,11 +2033,6 @@ static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame
/* XXX temp stuff? */
if(ima->lastframe != frame) {
ima->tpageflag |= IMA_TPAGE_REFRESH;
- if(ibuf) {
- /* without this the image name only updates
- * on first load which is quite confusing */
- BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
- }
}
ima->lastframe = frame;
}
@@ -2005,14 +2052,9 @@ static ImBuf *image_get_ibuf_threadsafe(Image *ima, ImageUser *iuser, int *frame
ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
}
else if(ima->source == IMA_SRC_VIEWER) {
- if(ima->type==IMA_TYPE_R_RESULT) {
- /* always verify entirely, not that this shouldn't happen
- * during render anyway */
- }
- else if(ima->type==IMA_TYPE_COMPOSITE) {
- frame= iuser?iuser->framenr:0;
- ibuf= image_get_ibuf(ima, 0, frame);
- }
+ /* always verify entirely, not that this shouldn't happen
+ * as part of texture sampling in rendering anyway, so not
+ * a big bottleneck */
}
*frame_r = frame;
@@ -2093,9 +2135,6 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
/* only 1 layer/pass stored in imbufs, no exrhandle anim storage, no saving */
ibuf= image_load_sequence_multilayer(ima, iuser, frame);
}
-
- if(ibuf)
- BLI_strncpy(ima->name, ibuf->name, sizeof(ima->name));
}
else if(ima->source==IMA_SRC_FILE) {
@@ -2129,10 +2168,16 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
BLI_lock_thread(LOCK_VIEWER);
*lock_r= ima;
- /* Composite Viewer, all handled in compositor */
- /* fake ibuf, will be filled in compositor */
- ibuf= IMB_allocImBuf(256, 256, 32, IB_rect, 0);
- image_assign_ibuf(ima, ibuf, 0, frame);
+ /* XXX anim play for viewer nodes not yet supported */
+ frame= 0; // XXX iuser?iuser->framenr:0;
+ ibuf= image_get_ibuf(ima, 0, frame);
+
+ if(!ibuf) {
+ /* Composite Viewer, all handled in compositor */
+ /* fake ibuf, will be filled in compositor */
+ ibuf= IMB_allocImBuf(256, 256, 32, IB_rect);
+ image_assign_ibuf(ima, ibuf, 0, frame);
+ }
}
}
}
@@ -2141,10 +2186,7 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r)
BLI_unlock_thread(LOCK_IMAGE);
}
- /* we assuming that if it is not rendering, it's also not multithreaded
- * (a somewhat weak assumption) */
- if(G.rendering==0)
- tag_image_time(ima);
+ tag_image_time(ima);
return ibuf;
}
@@ -2161,6 +2203,7 @@ void BKE_image_release_ibuf(Image *ima, void *lock)
}
}
+/* warning, this can allocate generated images */
ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
{
return BKE_image_acquire_ibuf(ima, iuser, NULL);
@@ -2168,7 +2211,7 @@ ImBuf *BKE_image_get_ibuf(Image *ima, ImageUser *iuser)
void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
{
- int imanr, len;
+ int len;
/* here (+fie_ima/2-1) makes sure that division happens correctly */
len= (iuser->fie_ima*iuser->frames)/2;
@@ -2177,8 +2220,9 @@ void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
iuser->framenr= 0;
}
else {
+ int imanr;
cfra= cfra - iuser->sfra+1;
-
+
/* cyclic */
if(iuser->cycl) {
cfra= ( (cfra) % len );
@@ -2186,7 +2230,7 @@ void BKE_image_user_calc_frame(ImageUser *iuser, int cfra, int fieldnr)
if(cfra==0) cfra= len;
}
- if(cfra<1) cfra= 1;
+ if(cfra<0) cfra= 0;
else if(cfra>len) cfra= len;
/* convert current frame to current field */
diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c
index 9248ce69280..c21e347d6d8 100644
--- a/source/blender/blenkernel/intern/image_gen.c
+++ b/source/blender/blenkernel/intern/image_gen.c
@@ -25,6 +25,8 @@
#include <math.h>
#include <stdlib.h>
+
+#include "BKE_image.h"
#include "BLI_math_color.h"
#include "BLF_api.h"
@@ -298,16 +300,16 @@ static void checker_board_grid_fill(unsigned char *rect, float *rect_float, int
}
/* defined in image.c */
-extern int stamp_font_begin(int size);
static void checker_board_text(unsigned char *rect, float *rect_float, int width, int height, int step, int outline)
{
- int x, y, mono;
+ int x, y;
int pen_x, pen_y;
char text[3]= {'A', '1', '\0'};
+ const int mono= blf_mono_font;
+
+ BLF_size(mono, 54, 72); /* hard coded size! */
- /* hard coded size! */
- mono= stamp_font_begin(54);
BLF_buffer(mono, rect_float, rect, width, height, 4);
for(y= 0; y < height; y+=step)
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index 158f964a846..207c667f335 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -1,31 +1,31 @@
-/* implicit.c
-*
-*
-* ***** 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.
-*
-* The Original Code is Copyright (C) Blender Foundation
-* All rights reserved.
-*
-* The Original Code is: all of this file.
-*
-* Contributor(s): none yet.
-*
-* ***** END GPL LICENSE BLOCK *****
-*/
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
#include "MEM_guardedalloc.h"
@@ -37,12 +37,13 @@
#include "BLI_threads.h"
#include "BLI_math.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "BKE_cloth.h"
#include "BKE_collision.h"
#include "BKE_effect.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#define CLOTH_OPENMP_LIMIT 25
@@ -63,7 +64,7 @@ static void itend(void)
{
QueryPerformanceCounter(&_itend);
}
-double itval()
+double itval(void)
{
return ((double)_itend.QuadPart -
(double)_itstart.QuadPart)/((double)ifreq.QuadPart);
@@ -85,7 +86,7 @@ static void itend(void)
{
gettimeofday(&_itend,&itz);
}
-double itval()
+double itval(void)
{
double t1, t2;
t1 = (double)_itstart.tv_sec + (double)_itstart.tv_usec/(1000*1000);
@@ -726,7 +727,7 @@ typedef struct Implicit_Data
fmatrix3x3 *A, *dFdV, *dFdX, *S, *P, *Pinv, *bigI, *M;
} Implicit_Data;
-int implicit_init (Object *ob, ClothModifierData *clmd)
+int implicit_init (Object *UNUSED(ob), ClothModifierData *clmd)
{
unsigned int i = 0;
unsigned int pinned = 0;
@@ -1218,7 +1219,7 @@ DO_INLINE void dfdx_damp(float to[3][3], float dir[3],float length,const float
}
-DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float time)
+DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *UNUSED(lF), lfVector *X, lfVector *V, fmatrix3x3 *UNUSED(dFdV), fmatrix3x3 *UNUSED(dFdX), float time)
{
Cloth *cloth = clmd->clothObject;
ClothVertex *verts = cloth->verts;
@@ -1228,7 +1229,7 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
float vel[3];
float k = 0.0f;
float L = s->restlen;
- float cb = clmd->sim_parms->structural;
+ float cb; /* = clmd->sim_parms->structural; */ /*UNUSED*/
float nullf[3] = {0,0,0};
float stretch_force[3] = {0,0,0};
@@ -1316,8 +1317,9 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
VECSUB(extent, X[s->ij], tvect);
- dot = INPR(extent, extent);
- length = sqrt(dot);
+ // SEE MSG BELOW (these are UNUSED)
+ // dot = INPR(extent, extent);
+ // length = sqrt(dot);
k = clmd->sim_parms->goalspring;
@@ -1353,7 +1355,7 @@ DO_INLINE void cloth_calc_spring_force(ClothModifierData *clmd, ClothSpring *s,
}
}
-DO_INLINE void cloth_apply_spring_force(ClothModifierData *clmd, ClothSpring *s, lfVector *lF, lfVector *X, lfVector *V, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
+DO_INLINE void cloth_apply_spring_force(ClothModifierData *UNUSED(clmd), ClothSpring *s, lfVector *lF, lfVector *UNUSED(X), lfVector *UNUSED(V), fmatrix3x3 *dFdV, fmatrix3x3 *dFdX)
{
if(s->flags & CLOTH_SPRING_FLAG_NEEDED)
{
@@ -1425,7 +1427,7 @@ typedef struct HairGridVert {
by Lena Petrovic, Mark Henne and John Anderson
* Pixar Technical Memo #06-08, Pixar Animation Studios
*/
-static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, int numverts)
+static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVector *lX, lfVector *lV, unsigned int numverts)
{
/* TODO: This is an initial implementation and should be made much better in due time.
* What should at least be implemented is a grid size parameter and a smoothing kernel
@@ -1441,10 +1443,10 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec
/* 2.0f is an experimental value that seems to give good results */
float smoothfac = 2.0f * clmd->sim_parms->velocity_smooth;
float collfac = 2.0f * clmd->sim_parms->collider_friction;
- int v = 0;
- int i = 0;
- int j = 0;
- int k = 0;
+ unsigned int v = 0;
+ unsigned int i = 0;
+ int j = 0;
+ int k = 0;
INIT_MINMAX(gmin, gmax);
@@ -1555,20 +1557,22 @@ static void hair_velocity_smoothing(ClothModifierData *clmd, lfVector *lF, lfVec
free_collider_cache(&colliders);
}
-static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M)
+static void cloth_calc_force(ClothModifierData *clmd, float UNUSED(frame), lfVector *lF, lfVector *lX, lfVector *lV, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, ListBase *effectors, float time, fmatrix3x3 *M)
{
/* Collect forces and derivatives: F,dFdX,dFdV */
Cloth *cloth = clmd->clothObject;
- int i = 0;
+ unsigned int i = 0;
float spring_air = clmd->sim_parms->Cvi * 0.01f; /* viscosity of air scaled in percent */
float gravity[3] = {0.0f, 0.0f, 0.0f};
- float tm2[3][3] = {{-spring_air,0,0}, {0,-spring_air,0},{0,0,-spring_air}};
+ float tm2[3][3] = {{0}};
MFace *mfaces = cloth->mfaces;
unsigned int numverts = cloth->numverts;
- LinkNode *search = cloth->springs;
+ LinkNode *search;
lfVector *winvec;
EffectedPoint epoint;
+ tm2[0][0]= tm2[1][1]= tm2[2][2]= -spring_air;
+
/* global acceleration (gravitation) */
if(clmd->scene->physics_settings.flag & PHYS_GLOBAL_GRAVITY) {
VECCOPY(gravity, clmd->scene->physics_settings.gravity);
@@ -1708,7 +1712,7 @@ static void cloth_calc_force(ClothModifierData *clmd, float frame, lfVector *lF,
// printf("\n");
}
-static void simulate_implicit_euler(lfVector *Vnew, lfVector *lX, lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *P, fmatrix3x3 *Pinv, fmatrix3x3 *M, fmatrix3x3 *bigI)
+static void simulate_implicit_euler(lfVector *Vnew, lfVector *UNUSED(lX), lfVector *lV, lfVector *lF, fmatrix3x3 *dFdV, fmatrix3x3 *dFdX, float dt, fmatrix3x3 *A, lfVector *B, lfVector *dV, fmatrix3x3 *S, lfVector *z, lfVector *olddV, fmatrix3x3 *UNUSED(P), fmatrix3x3 *UNUSED(Pinv), fmatrix3x3 *M, fmatrix3x3 *UNUSED(bigI))
{
unsigned int numverts = dFdV[0].vcount;
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index a24f37bf73a..329058b3115 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -59,9 +59,10 @@
#include "BLI_math.h" /* windows needs for M_PI */
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
-#include "BKE_utildefines.h"
+#include "BKE_ipo.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
@@ -102,7 +103,7 @@ void free_ipo (Ipo *ipo)
/* Mapping Table for bitflag <-> RNA path */
typedef struct AdrBit2Path {
int bit;
- char *path;
+ const char *path;
int array_index;
} AdrBit2Path;
@@ -111,27 +112,26 @@ typedef struct AdrBit2Path {
/* Object layers */
static AdrBit2Path ob_layer_bits[]= {
- {(1<<0), "layer", 0},
- {(1<<1), "layer", 1},
- {(1<<2), "layer", 2},
- {(1<<3), "layer", 3},
- {(1<<4), "layer", 4},
- {(1<<5), "layer", 5},
- {(1<<6), "layer", 6},
- {(1<<7), "layer", 7},
- {(1<<8), "layer", 8},
- {(1<<9), "layer", 9},
- {(1<<10), "layer", 10},
- {(1<<11), "layer", 11},
- {(1<<12), "layer", 12},
- {(1<<13), "layer", 13},
- {(1<<14), "layer", 14},
- {(1<<15), "layer", 15},
- {(1<<16), "layer", 16},
- {(1<<17), "layer", 17},
- {(1<<18), "layer", 18},
- {(1<<19), "layer", 19},
- {(1<<20), "layer", 20}
+ {(1<<0), "layers", 0},
+ {(1<<1), "layers", 1},
+ {(1<<2), "layers", 2},
+ {(1<<3), "layers", 3},
+ {(1<<4), "layers", 4},
+ {(1<<5), "layers", 5},
+ {(1<<6), "layers", 6},
+ {(1<<7), "layers", 7},
+ {(1<<8), "layers", 8},
+ {(1<<9), "layers", 9},
+ {(1<<10), "layers", 10},
+ {(1<<11), "layers", 11},
+ {(1<<12), "layers", 12},
+ {(1<<13), "layers", 13},
+ {(1<<14), "layers", 14},
+ {(1<<15), "layers", 15},
+ {(1<<16), "layers", 16},
+ {(1<<17), "layers", 17},
+ {(1<<18), "layers", 18},
+ {(1<<19), "layers", 19}
};
/* Material mode */
@@ -172,7 +172,7 @@ static AdrBit2Path *adrcode_bitmaps_to_paths (int blocktype, int adrcode, int *t
/* ADRCODE to RNA-Path Conversion Code - Standard */
/* Object types */
-static char *ob_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *ob_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -253,7 +253,7 @@ static char *ob_adrcodes_to_paths (int adrcode, int *array_index)
/* PoseChannel types
* NOTE: pchan name comes from 'actname' added earlier...
*/
-static char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -297,7 +297,7 @@ static char *pchan_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Constraint types */
-static char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -315,9 +315,9 @@ static char *constraint_adrcodes_to_paths (int adrcode, int *array_index)
/* ShapeKey types
* NOTE: as we don't have access to the keyblock where the data comes from (for now),
- * we'll just use numerical indicies for now...
+ * we'll just use numerical indices for now...
*/
-static char *shapekey_adrcodes_to_paths (int adrcode, int *array_index)
+static char *shapekey_adrcodes_to_paths (int adrcode, int *UNUSED(array_index))
{
static char buf[128];
@@ -331,9 +331,9 @@ static char *shapekey_adrcodes_to_paths (int adrcode, int *array_index)
}
/* MTex (Texture Slot) types */
-static char *mtex_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *mtex_adrcodes_to_paths (int adrcode, int *UNUSED(array_index))
{
- char *base=NULL, *prop=NULL;
+ const char *base=NULL, *prop=NULL;
static char buf[128];
/* base part of path */
@@ -401,7 +401,7 @@ static char *mtex_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Texture types */
-static char *texture_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *texture_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -481,7 +481,7 @@ static char *texture_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Material Types */
-static char *material_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *material_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -565,7 +565,7 @@ static char *material_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Camera Types */
-static char *camera_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *camera_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -605,7 +605,7 @@ static char *camera_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Lamp Types */
-static char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -647,7 +647,7 @@ static char *lamp_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Sound Types */
-static char *sound_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *sound_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -670,7 +670,7 @@ static char *sound_adrcodes_to_paths (int adrcode, int *array_index)
}
/* World Types */
-static char *world_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *world_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -709,6 +709,11 @@ static char *world_adrcodes_to_paths (int adrcode, int *array_index)
*array_index= 1; return "stars.color";
case WO_STAR_B:
*array_index= 2; return "stars.color"; */
+ case WO_STAR_R:
+ case WO_STAR_G:
+ case WO_STAR_B:
+ printf("WARNING: WO_STAR_R/G/B deprecated\n");
+ return NULL;
case WO_STARDIST:
return "stars.min_distance";
@@ -723,7 +728,7 @@ static char *world_adrcodes_to_paths (int adrcode, int *array_index)
}
/* Particle Types */
-static char *particle_adrcodes_to_paths (int adrcode, int *array_index)
+static const char *particle_adrcodes_to_paths (int adrcode, int *array_index)
{
/* set array index like this in-case nothing sets it correctly */
*array_index= 0;
@@ -798,10 +803,11 @@ static char *particle_adrcodes_to_paths (int adrcode, int *array_index)
* - array_index - index in property's array (if applicable) to use
* - return - the allocated path...
*/
-static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], Sequence * seq, int *array_index)
+static char *get_rna_access (int blocktype, int adrcode, char actname[], char constname[], Sequence *seq, int *array_index)
{
DynStr *path= BLI_dynstr_new();
- char *propname=NULL, *rpath=NULL;
+ const char *propname=NULL;
+ char *rpath=NULL;
char buf[512];
int dummy_index= 0;
@@ -913,8 +919,17 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
sprintf(buf, "pose.bones[\"%s\"].constraints[\"%s\"]", actname, constname);
}
else if (actname && actname[0]) {
- /* Pose-Channel */
- sprintf(buf, "pose.bones[\"%s\"]", actname);
+ if ((blocktype == ID_OB) && strcmp(actname, "Object")==0) {
+ /* Actionified "Object" IPO's... no extra path stuff needed */
+ }
+ else if ((blocktype == ID_KE) && strcmp(actname, "Shape")==0) {
+ /* Actionified "Shape" IPO's - these are forced onto object level via the action container there... */
+ strcpy(buf, "data.shape_keys");
+ }
+ else {
+ /* Pose-Channel */
+ sprintf(buf, "pose.bones[\"%s\"]", actname);
+ }
}
else if (constname && constname[0]) {
/* Constraint in Object */
@@ -922,8 +937,7 @@ static char *get_rna_access (int blocktype, int adrcode, char actname[], char co
}
else if (seq) {
/* Sequence names in Scene */
- sprintf(buf, "sequence_editor.sequences_all[\"%s\"]",
- seq->name+2);
+ sprintf(buf, "sequence_editor.sequences_all[\"%s\"]", seq->name+2);
}
else
strcpy(buf, ""); /* empty string */
@@ -1017,13 +1031,13 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver)
dtar= &dvar->targets[0];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0])
- BLI_strncpy(dtar->pchan_name, idriver->name, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name, sizeof(dtar->pchan_name));
/* second bone target (name was stored in same var as the first one) */
dtar= &dvar->targets[1];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0]) // xxx... for safety
- BLI_strncpy(dtar->pchan_name, idriver->name+DRIVER_NAME_OFFS, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name+DRIVER_NAME_OFFS, sizeof(dtar->pchan_name));
}
else {
/* only a single variable, of type 'transform channel' */
@@ -1034,7 +1048,7 @@ static ChannelDriver *idriver_to_cdriver (IpoDriver *idriver)
dtar= &dvar->targets[0];
dtar->id= (ID *)idriver->ob;
if (idriver->name[0])
- BLI_strncpy(dtar->pchan_name, idriver->name, 32);
+ BLI_strncpy(dtar->pchan_name, idriver->name, sizeof(dtar->pchan_name));
dtar->transChan= adrcode_to_dtar_transchan(idriver->adrcode);
dtar->flag |= DTAR_FLAG_LOCALSPACE; /* old drivers took local space */
}
@@ -1123,7 +1137,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
{
AdrBit2Path *abp;
FCurve *fcu;
- int i=0, totbits;
+ int totbits;
/* allocate memory for a new F-Curve */
fcu= MEM_callocN(sizeof(FCurve), "FCurve");
@@ -1188,6 +1202,8 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
* 3) filter the keyframes for the flag of interest
*/
for (b=0; b < totbits; b++, abp++) {
+ unsigned int i=0;
+
/* make a copy of existing base-data if not the last curve */
if (b < (totbits-1))
fcurve= copy_fcurve(fcu);
@@ -1195,7 +1211,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcurve= fcu;
/* set path */
- fcurve->rna_path= BLI_strdupn(abp->path, strlen(abp->path));
+ fcurve->rna_path= BLI_strdup(abp->path);
fcurve->array_index= abp->array_index;
/* convert keyframes
@@ -1211,7 +1227,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcurve->bezt= MEM_callocN(sizeof(BezTriple)*fcurve->totvert, "BezTriples");
/* loop through copying all BezTriples individually, as we need to modify a few things */
- for (dst=fcurve->bezt, src=icu->bezt; i < fcurve->totvert; i++, dst++, src++) {
+ for (dst=fcurve->bezt, src=icu->bezt, i=0; i < fcurve->totvert; i++, dst++, src++) {
/* firstly, copy BezTriple data */
*dst= *src;
@@ -1239,6 +1255,8 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
}
}
else {
+ unsigned int i=0;
+
/* get rna-path
* - we will need to set the 'disabled' flag if no path is able to be made (for now)
*/
@@ -1259,7 +1277,7 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
fcu->bezt= MEM_callocN(sizeof(BezTriple)*fcu->totvert, "BezTriples");
/* loop through copying all BezTriples individually, as we need to modify a few things */
- for (dst=fcu->bezt, src=icu->bezt; i < fcu->totvert; i++, dst++, src++) {
+ for (dst=fcu->bezt, src=icu->bezt, i=0; i < fcu->totvert; i++, dst++, src++) {
/* firstly, copy BezTriple data */
*dst= *src;
@@ -1301,13 +1319,14 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
/* correct times for rotation drivers
* - need to go from degrees to radians...
* - there's only really 1 target to worry about
+ * - were also degrees/10
*/
if (fcu->driver && fcu->driver->variables.first) {
DriverVar *dvar= fcu->driver->variables.first;
DriverTarget *dtar= &dvar->targets[0];
if (ELEM3(dtar->transChan, DTAR_TRANSCHAN_ROTX, DTAR_TRANSCHAN_ROTY, DTAR_TRANSCHAN_ROTZ)) {
- const float fac= (float)M_PI / 180.0f;
+ const float fac= (float)M_PI / 18.0f;
dst->vec[0][0] *= fac;
dst->vec[1][0] *= fac;
@@ -1315,20 +1334,17 @@ static void icu_to_fcurves (ID *id, ListBase *groups, ListBase *list, IpoCurve *
}
}
- /* correct values for sequencer curves,
- that were not locked to frame */
-
- if (seq &&
- (seq->flag & SEQ_IPO_FRAME_LOCKED) == 0) {
+ /* correct values for sequencer curves, that were not locked to frame */
+ if (seq && (seq->flag & SEQ_IPO_FRAME_LOCKED) == 0) {
double mul= (seq->enddisp-seq->startdisp)/100.0f;
double offset= seq->startdisp;
dst->vec[0][0] *= mul;
dst->vec[0][0] += offset;
-
+
dst->vec[1][0] *= mul;
dst->vec[1][0] += offset;
-
+
dst->vec[2][0] *= mul;
dst->vec[2][0] += offset;
}
@@ -1475,7 +1491,7 @@ static void action_to_animato (ID *id, bAction *act, ListBase *groups, ListBase
* This assumes that AnimData has been added already. Separation of drivers
* from animation data is accomplished here too...
*/
-static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[], Sequence * seq)
+static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[], Sequence *seq)
{
AnimData *adt= BKE_animdata_from_id(id);
ListBase anim = {NULL, NULL};
@@ -1506,19 +1522,23 @@ static void ipo_to_animdata (ID *id, Ipo *ipo, char actname[], char constname[],
if (G.f & G_DEBUG) printf("\thas anim \n");
/* try to get action */
if (adt->action == NULL) {
- adt->action= add_empty_action("ConvData_Action"); // XXX we need a better name for this
- if (G.f & G_DEBUG) printf("\t\tadded new action \n");
+ char nameBuf[MAX_ID_NAME];
+
+ BLI_snprintf(nameBuf, sizeof(nameBuf), "CDA:%s", ipo->id.name+2);
+
+ adt->action= add_empty_action(nameBuf);
+ if (G.f & G_DEBUG) printf("\t\tadded new action - '%s' \n", nameBuf);
}
/* add F-Curves to action */
- addlisttolist(&adt->action->curves, &anim);
+ BLI_movelisttolist(&adt->action->curves, &anim);
}
/* deal with drivers */
if (drivers.first) {
if (G.f & G_DEBUG) printf("\thas drivers \n");
/* add drivers to end of driver stack */
- addlisttolist(&adt->drivers, &drivers);
+ BLI_movelisttolist(&adt->drivers, &drivers);
}
}
@@ -1863,7 +1883,7 @@ void do_versions_ipos_to_animato(Main *main)
to different DNA variables later
(semi-hack (tm) )
*/
- switch(seq->type) {
+ switch (seq->type) {
case SEQ_IMAGE:
case SEQ_META:
case SEQ_SCENE:
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index f6f4226bf57..5c10c14c4e2 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -39,6 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_math_vector.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_key_types.h"
@@ -58,14 +59,14 @@
#include "BKE_tessmesh.h"
#include "BKE_main.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "BLI_cellalloc.h"
-
-#define KEY_BPOINT 1
-#define KEY_BEZTRIPLE 2
+#define KEY_MODE_DUMMY 0 /* use where mode isn't checked for */
+#define KEY_MODE_BPOINT 1
+#define KEY_MODE_BEZTRIPLE 2
// old defines from DNA_ipo_types.h for data-type
#define IPO_FLOAT 4
@@ -167,14 +168,10 @@ Key *copy_key(Key *key)
Key *keyn;
KeyBlock *kbn, *kb;
- if(key==0) return 0;
+ if(key==NULL) return NULL;
keyn= copy_libblock(key);
-#if 0 // XXX old animation system
- keyn->ipo= copy_ipo(key->ipo);
-#endif // XXX old animation system
-
BLI_duplicatelist(&keyn->block, &key->block);
kb= key->block.first;
@@ -224,14 +221,10 @@ void make_local_key(Key *key)
* - only local users: set flag
* - mixed: make copy
*/
- if(key==0) return;
+ if(key==NULL) return;
- key->id.lib= 0;
- new_id(0, (ID *)key, 0);
-
-#if 0 // XXX old animation system
- make_local_ipo(key->ipo);
-#endif // XXX old animation system
+ key->id.lib= NULL;
+ new_id(NULL, (ID *)key, NULL);
}
/* Sort shape keys and Ipo curves after a change. This assumes that at most
@@ -416,14 +409,14 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
/* if(fac<0.0 || fac>1.0) return 1; */
- if(k1->next==0) return 1;
+ if(k1->next==NULL) return 1;
if(cycl) { /* pre-sort */
k[2]= k1->next;
k[3]= k[2]->next;
- if(k[3]==0) k[3]=k1;
+ if(k[3]==NULL) k[3]=k1;
while(k1) {
- if(k1->next==0) k[0]=k1;
+ if(k1->next==NULL) k[0]=k1;
k1=k1->next;
}
k1= k[1];
@@ -444,13 +437,13 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
k[2]= k1->next;
t[2]= k[2]->pos;
k[3]= k[2]->next;
- if(k[3]==0) k[3]= k[2];
+ if(k[3]==NULL) k[3]= k[2];
t[3]= k[3]->pos;
k1= k[3];
}
while( t[2]<fac ) { /* find correct location */
- if(k1->next==0) {
+ if(k1->next==NULL) {
if(cycl) {
k1= firstkey;
ofs+= dpos;
@@ -570,36 +563,53 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **
return kb->data;
}
-static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, int mode)
+
+/* currently only the first value of 'ofs' may be set. */
+static short key_pointer_size(const Key *key, const int mode, int *poinsize, int *ofs)
+{
+ if(key->from==NULL) {
+ return FALSE;
+ }
+
+ switch(GS(key->from->name)) {
+ case ID_ME:
+ *ofs= sizeof(float)*3;
+ *poinsize= *ofs;
+ break;
+ case ID_LT:
+ *ofs= sizeof(float)*3;
+ *poinsize= *ofs;
+ break;
+ case ID_CU:
+ if(mode == KEY_MODE_BPOINT) {
+ *ofs= sizeof(float)*4;
+ *poinsize= *ofs;
+ } else {
+ ofs[0]= sizeof(float)*12;
+ *poinsize= (*ofs) / 3;
+ }
+
+ break;
+ default:
+ BLI_assert(!"invalid 'key->from' ID type");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void cp_key(const int start, int end, const int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock *kb, float *weights, const int mode)
{
float ktot = 0.0, kd = 0.0;
int elemsize, poinsize = 0, a, *ofsp, ofs[32], flagflo=0;
char *k1, *kref, *freek1, *freekref;
char *cp, elemstr[8];
- if(key->from==NULL) return;
-
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- }else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0]/3;
- }
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -631,7 +641,7 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
else k1+= start*key->elemsize;
}
- if(mode==KEY_BEZTRIPLE) {
+ if(mode == KEY_MODE_BEZTRIPLE) {
elemstr[0]= 1;
elemstr[1]= IPO_BEZTRIPLE;
elemstr[2]= 0;
@@ -639,11 +649,11 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
/* just do it here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
for(a=start; a<end; a++) {
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -666,8 +676,14 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
case IPO_BEZTRIPLE:
memcpy(poin, k1, sizeof(float)*12);
break;
+ default:
+ /* should never happen */
+ if(freek1) MEM_freeN(freek1);
+ if(freekref) MEM_freeN(freekref);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
-
+
poin+= ofsp[0];
cp+= 2; ofsp++;
}
@@ -686,14 +702,14 @@ static void cp_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
kref+= elemsize;
}
- if(mode==KEY_BEZTRIPLE) a+=2;
+ if(mode == KEY_MODE_BEZTRIPLE) a+=2;
}
if(freek1) MEM_freeN(freek1);
if(freekref) MEM_freeN(freekref);
}
-static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int start, int end, char *out, int tot)
+static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, const int start, int end, char *out, const int tot)
{
Nurb *nu;
int a, step, a1, a2;
@@ -705,7 +721,7 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int st
a1= MAX2(a, start);
a2= MIN2(a+step, end);
- if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BPOINT);
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
@@ -714,45 +730,26 @@ static void cp_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock *kb, int st
a1= MAX2(a, start);
a2= MIN2(a+step, end);
- if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_BEZTRIPLE);
+ if(a1<a2) cp_key(a1, a2, tot, out, key, actkb, kb, NULL, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-
-void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock *actkb, int mode)
+void do_rel_key(const int start, int end, const int tot, char *basispoin, Key *key, KeyBlock *actkb, const int mode)
{
KeyBlock *kb;
int *ofsp, ofs[3], elemsize, b;
char *cp, *poin, *reffrom, *from, elemstr[8];
char *freefrom, *freereffrom;
- int poinsize= 0;
-
- if(key->from==NULL) return;
+ int poinsize;
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- } else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0] / 3;
- }
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -763,7 +760,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
/* just here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
/* step 1 init */
cp_key(start, end, tot, basispoin, key, actkb, key->refkey, NULL, mode);
@@ -799,7 +796,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
weight= icuval;
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -815,8 +812,14 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
case IPO_BEZTRIPLE:
rel_flerp(12, (float *)poin, (float *)reffrom, (float *)from, weight);
break;
+ default:
+ /* should never happen */
+ if(freefrom) MEM_freeN(freefrom);
+ if(freereffrom) MEM_freeN(freereffrom);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
-
+
poin+= ofsp[0];
cp+= 2;
@@ -826,7 +829,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
reffrom+= elemsize;
from+= elemsize;
- if(mode==KEY_BEZTRIPLE) b+= 2;
+ if(mode == KEY_MODE_BEZTRIPLE) b+= 2;
if(weights) weights++;
}
@@ -838,7 +841,7 @@ void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, KeyBlock
}
-static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, int mode)
+static void do_key(const int start, int end, const int tot, char *poin, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, const int mode)
{
float k1tot = 0.0, k2tot = 0.0, k3tot = 0.0, k4tot = 0.0;
float k1d = 0.0, k2d = 0.0, k3d = 0.0, k4d = 0.0;
@@ -847,29 +850,11 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
char *k1, *k2, *k3, *k4, *freek1, *freek2, *freek3, *freek4;
char *cp, elemstr[8];;
- if(key->from==0) return;
+ /* currently always 0, in future key_pointer_size may assign */
+ ofs[1]= 0;
- if( GS(key->from->name)==ID_ME ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_LT ) {
- ofs[0]= sizeof(float)*3;
- ofs[1]= 0;
- poinsize= ofs[0];
- }
- else if( GS(key->from->name)==ID_CU ) {
- if(mode==KEY_BPOINT) {
- ofs[0]= sizeof(float)*4;
- poinsize= ofs[0];
- } else {
- ofs[0]= sizeof(float)*12;
- poinsize= ofs[0] / 3;
- }
-
- ofs[1]= 0;
- }
+ if(!key_pointer_size(key, mode, &poinsize, &ofs[0]))
+ return;
if(end>tot) end= tot;
@@ -971,12 +956,12 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
/* only here, not above! */
elemsize= key->elemsize;
- if(mode==KEY_BEZTRIPLE) elemsize*= 3;
+ if(mode == KEY_MODE_BEZTRIPLE) elemsize*= 3;
for(a=start; a<end; a++) {
cp= key->elemstr;
- if(mode==KEY_BEZTRIPLE) cp= elemstr;
+ if(mode == KEY_MODE_BEZTRIPLE) cp= elemstr;
ofsp= ofs;
@@ -992,6 +977,14 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
case IPO_BEZTRIPLE:
flerp(12, (void *)poin, (void *)k1, (void *)k2, (void *)k3, (void *)k4, t);
break;
+ default:
+ /* should never happen */
+ if(freek1) MEM_freeN(freek1);
+ if(freek2) MEM_freeN(freek2);
+ if(freek3) MEM_freeN(freek3);
+ if(freek4) MEM_freeN(freek4);
+ BLI_assert(!"invalid 'cp[1]'");
+ return;
}
poin+= ofsp[0];
@@ -1040,7 +1033,7 @@ static void do_key(int start, int end, int tot, char *poin, Key *key, KeyBlock *
else k4+= elemsize;
}
- if(mode==KEY_BEZTRIPLE) a+= 2;
+ if(mode == KEY_MODE_BEZTRIPLE) a+= 2;
}
if(freek1) MEM_freeN(freek1);
@@ -1116,7 +1109,7 @@ static float *get_weights_array(Object *ob, char *vgroup)
return NULL;
}
-static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
float cfra, ctime, t[4], delta;
@@ -1137,7 +1130,7 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(a=0; a<tot; a+=step, cfra+= delta) {
- ctime= bsystem_time(scene, 0, cfra, 0.0); // xxx ugly cruft!
+ ctime= bsystem_time(scene, NULL, cfra, 0.0); // xxx ugly cruft!
#if 0 // XXX old animation system
if(calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
@@ -1151,9 +1144,9 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(a, a+step, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(a, a+step, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(a, a+step, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(a, a+step, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
else {
@@ -1163,7 +1156,7 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(kb= key->block.first; kb; kb= kb->next)
kb->weights= get_weights_array(ob, kb->vgroup);
- do_rel_key(0, tot, tot, (char *)out, key, actkb, 0);
+ do_rel_key(0, tot, tot, (char *)out, key, actkb, KEY_MODE_DUMMY);
for(kb= key->block.first; kb; kb= kb->next) {
if(kb->weights) MEM_freeN(kb->weights);
@@ -1186,14 +1179,14 @@ static void do_mesh_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(0, tot, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
}
-static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, int tot)
+static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float *t, char *out, const int tot)
{
Nurb *nu;
int a, step;
@@ -1201,18 +1194,18 @@ static void do_cu_key(Curve *cu, Key *key, KeyBlock *actkb, KeyBlock **k, float
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BPOINT);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- do_key(a, a+step, tot, out, key, actkb, k, t, KEY_BEZTRIPLE);
+ do_key(a, a+step, tot, out, key, actkb, k, t, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, char *out, int tot)
+static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float UNUSED(ctime), char *out, const int tot)
{
Nurb *nu;
int a, step;
@@ -1220,18 +1213,18 @@ static void do_rel_cu_key(Curve *cu, Key *key, KeyBlock *actkb, float ctime, cha
for(a=0, nu=cu->nurb.first; nu; nu=nu->next, a+=step) {
if(nu->bp) {
step= nu->pntsu*nu->pntsv;
- do_rel_key(a, a+step, tot, out, key, actkb, KEY_BPOINT);
+ do_rel_key(a, a+step, tot, out, key, actkb, KEY_MODE_BPOINT);
}
else if(nu->bezt) {
step= 3*nu->pntsu;
- do_rel_key(a, a+step, tot, out, key, actkb, KEY_BEZTRIPLE);
+ do_rel_key(a, a+step, tot, out, key, actkb, KEY_MODE_BEZTRIPLE);
}
else
step= 0;
}
}
-static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
Curve *cu= ob->data;
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
@@ -1240,7 +1233,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
if(key->slurph && key->type!=KEY_RELATIVE) {
Nurb *nu;
- int mode, i= 0, remain= 0, estep, count;
+ int mode=0, i= 0, remain= 0, estep=0, count=0;
delta= (float)key->slurph / tot;
@@ -1255,11 +1248,11 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(nu=cu->nurb.first; nu; nu=nu->next) {
if(nu->bp) {
- mode= KEY_BPOINT;
+ mode= KEY_MODE_BPOINT;
estep= nu->pntsu*nu->pntsv;
}
else if(nu->bezt) {
- mode= KEY_BEZTRIPLE;
+ mode= KEY_MODE_BEZTRIPLE;
estep= 3*nu->pntsu;
}
else
@@ -1269,7 +1262,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
while (a < estep) {
if (remain <= 0) {
cfra+= delta;
- ctime= bsystem_time(scene, 0, cfra, 0.0f); // XXX old cruft
+ ctime= bsystem_time(scene, NULL, cfra, 0.0f); // XXX old cruft
ctime /= 100.0f;
CLAMP(ctime, 0.0f, 1.0f); // XXX for compat, we use this, but this clamping was confusing
@@ -1279,7 +1272,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
}
count= MIN2(remain, estep);
- if (mode == KEY_BEZTRIPLE) {
+ if (mode == KEY_MODE_BEZTRIPLE) {
count += 3 - count % 3;
}
@@ -1317,7 +1310,7 @@ static void do_curve_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
}
}
-static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
+static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, const int tot)
{
Lattice *lt= ob->data;
KeyBlock *k[4], *actkb= ob_get_keyblock(ob);
@@ -1332,7 +1325,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(a=0; a<tot; a++, cfra+= delta) {
- ctime= bsystem_time(scene, 0, cfra, 0.0); // XXX old cruft
+ ctime= bsystem_time(scene, NULL, cfra, 0.0); // XXX old cruft
#if 0 // XXX old animation system
if(calc_ipo_spec(key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
@@ -1343,9 +1336,9 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(a, a+1, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(a, a+1, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(a, a+1, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(a, a+1, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
else {
@@ -1355,7 +1348,7 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
for(kb= key->block.first; kb; kb= kb->next)
kb->weights= get_weights_array(ob, kb->vgroup);
- do_rel_key(0, tot, tot, (char *)out, key, actkb, 0);
+ do_rel_key(0, tot, tot, (char *)out, key, actkb, KEY_MODE_DUMMY);
for(kb= key->block.first; kb; kb= kb->next) {
if(kb->weights) MEM_freeN(kb->weights);
@@ -1375,9 +1368,9 @@ static void do_latt_key(Scene *scene, Object *ob, Key *key, char *out, int tot)
flag= setkeys(ctime, &key->block, k, t, 0);
if(flag==0)
- do_key(0, tot, tot, (char *)out, key, actkb, k, t, 0);
+ do_key(0, tot, tot, (char *)out, key, actkb, k, t, KEY_MODE_DUMMY);
else
- cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, 0);
+ cp_key(0, tot, tot, (char *)out, key, actkb, k[2], NULL, KEY_MODE_DUMMY);
}
}
@@ -1490,7 +1483,7 @@ Key *ob_get_key(Object *ob)
return NULL;
}
-KeyBlock *add_keyblock(Key *key, char *name)
+KeyBlock *add_keyblock(Key *key, const char *name)
{
KeyBlock *kb;
float curpos= -0.1;
@@ -1707,7 +1700,7 @@ void curve_to_key(Curve *cu, KeyBlock *kb, ListBase *nurb)
}
}
-void key_to_curve(KeyBlock *kb, Curve *cu, ListBase *nurb)
+void key_to_curve(KeyBlock *kb, Curve *UNUSED(cu), ListBase *nurb)
{
Nurb *nu;
BezTriple *bezt;
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 725f9a34b25..70eba3903d0 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -1,4 +1,4 @@
-/**
+/*
* lattice.c
*
*
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -50,6 +51,7 @@
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
+#include "BKE_animsys.h"
#include "BKE_anim.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_displist.h"
@@ -60,7 +62,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "BKE_deform.h"
//XXX #include "BIF_editdeform.h"
@@ -182,7 +184,7 @@ void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
MEM_freeN(vertexCos);
}
-Lattice *add_lattice(char *name)
+Lattice *add_lattice(const char *name)
{
Lattice *lt;
@@ -204,10 +206,6 @@ Lattice *copy_lattice(Lattice *lt)
ltn= copy_libblock(lt);
ltn->def= MEM_dupallocN(lt->def);
-
-#if 0 // XXX old animation system
- id_us_plus((ID *)ltn->ipo);
-#endif // XXX old animation system
ltn->key= copy_key(ltn->key);
if(ltn->key) ltn->key->from= (ID *)ltn;
@@ -234,6 +232,12 @@ void free_lattice(Lattice *lt)
MEM_freeN(editlt);
MEM_freeN(lt->editlatt);
}
+
+ /* free animation data */
+ if (lt->adt) {
+ BKE_free_animdata(&lt->id);
+ lt->adt= NULL;
+ }
}
@@ -248,11 +252,11 @@ void make_local_lattice(Lattice *lt)
* - mixed: make copy
*/
- if(lt->id.lib==0) return;
+ if(lt->id.lib==NULL) return;
if(lt->id.us==1) {
- lt->id.lib= 0;
+ lt->id.lib= NULL;
lt->id.flag= LIB_LOCAL;
- new_id(0, (ID *)lt, 0);
+ new_id(NULL, (ID *)lt, NULL);
return;
}
@@ -266,9 +270,9 @@ void make_local_lattice(Lattice *lt)
}
if(local && lib==0) {
- lt->id.lib= 0;
+ lt->id.lib= NULL;
lt->id.flag= LIB_LOCAL;
- new_id(0, (ID *)lt, 0);
+ new_id(NULL, (ID *)lt, NULL);
}
else if(local && lib) {
ltn= copy_lattice(lt);
@@ -278,7 +282,7 @@ void make_local_lattice(Lattice *lt)
while(ob) {
if(ob->data==lt) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= ltn;
ltn->id.us++;
lt->id.us--;
@@ -600,16 +604,6 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
}
#endif
-
- static float q_x90d[4] = {0.70710676908493, 0.70710676908493, 0.0, 0.0}; // float rot_axis[3]= {1,0,0}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
- static float q_y90d[4] = {0.70710676908493, 0.0, 0.70710676908493, 0.0}; // float rot_axis[3]= {0,1,0}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
- static float q_z90d[4] = {0.70710676908493, 0.0, 0.0, 0.70710676908493}; // float rot_axis[3]= {0,0,2}; axis_angle_to_quat(q, rot_axis, 90 * (M_PI / 180));
-
- static float q_nx90d[4] = {0.70710676908493, -0.70710676908493, 0.0, 0.0}; // float rot_axis[3]= {1,0,0}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
- static float q_ny90d[4] = {0.70710676908493, 0.0, -0.70710676908493, 0.0}; // float rot_axis[3]= {0,1,0}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
- static float q_nz90d[4] = {0.70710676908493, 0.0, 0.0, -0.70710676908493}; // float rot_axis[3]= {0,0,2}; axis_angle_to_quat(q, rot_axis, -90 * (M_PI / 180));
-
-
if(cd->no_rot_axis) { /* set by caller */
/* this is not exactly the same as 2.4x, since the axis is having rotation removed rather then
@@ -636,53 +630,18 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C
* Notice X,Y,Z Up all have light colors and each ordered CCW.
*
* Now for Neg Up XYZ, the colors are all dark, and ordered clockwise - Campbell
+ *
+ * note: moved functions into quat_apply_track/vec_apply_track
* */
+ copy_qt_qt(quat, new_quat);
+ copy_v3_v3(cent, co);
+
+ /* zero the axis which is not used,
+ * the big block of text above now applies to these 3 lines */
+ quat_apply_track(quat, axis-1, (axis==1 || axis==3) ? 1:0); /* up flag is a dummy, set so no rotation is done */
+ vec_apply_track(cent, axis-1);
+ cent[axis < 4 ? axis-1 : axis-4]= 0.0f;
- switch(axis) {
- case MOD_CURVE_POSX:
- mul_qt_qtqt(quat, new_quat, q_y90d);
-
- cent[0]= 0.0;
- cent[1]= co[2];
- cent[2]= co[1];
- break;
- case MOD_CURVE_NEGX:
- mul_qt_qtqt(quat, new_quat, q_ny90d);
-
- cent[0]= 0.0;
- cent[1]= -co[1];
- cent[2]= co[2];
-
- break;
- case MOD_CURVE_POSY:
- mul_qt_qtqt(quat, new_quat, q_x90d);
-
- cent[0]= co[2];
- cent[1]= 0.0;
- cent[2]= -co[0];
- break;
- case MOD_CURVE_NEGY:
- mul_qt_qtqt(quat, new_quat, q_nx90d);
-
- cent[0]= -co[0];
- cent[1]= 0.0;
- cent[2]= -co[2];
- break;
- case MOD_CURVE_POSZ:
- mul_qt_qtqt(quat, new_quat, q_z90d);
-
- cent[0]= co[1];
- cent[1]= -co[0];
- cent[2]= 0.0;
- break;
- case MOD_CURVE_NEGZ:
- mul_qt_qtqt(quat, new_quat, q_nz90d);
-
- cent[0]= co[0];
- cent[1]= -co[1];
- cent[2]= 0.0;
- break;
- }
/* scale if enabled */
if(cu->flag & CU_PATH_RADIUS)
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 687b212ec2e..cb96f549829 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,6 +39,7 @@
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -66,9 +67,10 @@
#include "DNA_world_types.h"
#include "DNA_gpencil_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_context.h"
@@ -136,8 +138,14 @@ void id_us_plus(ID *id)
void id_us_min(ID *id)
{
- if(id)
- id->us--;
+ if(id) {
+ if(id->us<2 && (id->flag & LIB_FAKEUSER))
+ id->us= 1;
+ else if(id->us<=0)
+ printf("ID user decrement error: %s \n", id->name);
+ else
+ id->us--;
+ }
}
int id_make_local(ID *id, int test)
@@ -302,7 +310,7 @@ int id_copy(ID *id, ID **newid, int test)
if(!test) *newid= (ID*)copy_action((bAction*)id);
return 1;
case ID_NT:
- if(!test) *newid= (ID*)ntreeCopyTree((bNodeTree*)id, 0);
+ if(!test) *newid= (ID*)ntreeCopyTree((bNodeTree*)id);
return 1;
case ID_BR:
if(!test) *newid= (ID*)copy_brush((Brush*)id);
@@ -335,7 +343,7 @@ int id_unlink(ID *id, int test)
break;
case ID_OB:
if(test) return 1;
- unlink_object(NULL, (Object*)id);
+ unlink_object((Object*)id);
break;
}
@@ -411,7 +419,7 @@ ListBase *which_libbase(Main *mainlib, short type)
case ID_GD:
return &(mainlib->gpencil);
}
- return 0;
+ return NULL;
}
/* Flag all ids in listbase */
@@ -442,7 +450,7 @@ void recalc_all_library_objects(Main *main)
/* flag for full recalc */
for(ob=main->object.first; ob; ob=ob->id.next)
if(ob->id.lib)
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
/* note: MAX_LIBARRAY define should match this code */
@@ -450,11 +458,13 @@ int set_listbasepointers(Main *main, ListBase **lb)
{
int a = 0;
- /* BACKWARDS! also watch order of free-ing! (mesh<->mat) */
-
+ /* BACKWARDS! also watch order of free-ing! (mesh<->mat), first items freed last.
+ * This is important because freeing data decreases usercounts of other datablocks,
+ * if this data is its self freed it can crash. */
lb[a++]= &(main->ipo);
lb[a++]= &(main->action); // xxx moved here to avoid problems when freeing with animato (aligorith)
lb[a++]= &(main->key);
+ lb[a++]= &(main->gpencil); /* referenced by nodes, objects, view, scene etc, before to free after. */
lb[a++]= &(main->nodetree);
lb[a++]= &(main->image);
lb[a++]= &(main->tex);
@@ -481,14 +491,13 @@ int set_listbasepointers(Main *main, ListBase **lb)
lb[a++]= &(main->brush);
lb[a++]= &(main->script);
lb[a++]= &(main->particle);
-
+
lb[a++]= &(main->world);
lb[a++]= &(main->screen);
lb[a++]= &(main->object);
lb[a++]= &(main->scene);
lb[a++]= &(main->library);
lb[a++]= &(main->wm);
- lb[a++]= &(main->gpencil);
lb[a]= NULL;
@@ -617,24 +626,24 @@ void *alloc_libblock(ListBase *lb, short type, const char *name)
/* by spec, animdata is first item after ID */
/* and, trust that BKE_animdata_from_id() will only find AnimData for valid ID-types */
-static void id_copy_animdata(ID *id)
+static void id_copy_animdata(ID *id, const short do_action)
{
AnimData *adt= BKE_animdata_from_id(id);
if (adt) {
IdAdtTemplate *iat = (IdAdtTemplate *)id;
- iat->adt= BKE_copy_animdata(iat->adt);
+ iat->adt= BKE_copy_animdata(iat->adt, do_action); /* could be set to FALSE, need to investigate */
}
}
/* material nodes use this since they are not treated as libdata */
-void copy_libblock_data(ID *id, const ID *id_from)
+void copy_libblock_data(ID *id, const ID *id_from, const short do_action)
{
if (id_from->properties)
id->properties = IDP_CopyProperty(id_from->properties);
/* the duplicate should get a copy of the animdata */
- id_copy_animdata(id);
+ id_copy_animdata(id, do_action);
}
/* used everywhere in blenkernel */
@@ -649,11 +658,9 @@ void *copy_libblock(void *rt)
lb= which_libbase(G.main, GS(id->name));
idn= alloc_libblock(lb, GS(id->name), id->name+2);
-
- if(idn==NULL) {
- printf("ERROR: Illegal ID name for %s (Crashing now)\n", id->name);
- }
-
+
+ assert(idn != NULL);
+
idn_len= MEM_allocN_len(idn);
if(idn_len - sizeof(ID) > 0) {
cp= (char *)id;
@@ -664,12 +671,12 @@ void *copy_libblock(void *rt)
id->newid= idn;
idn->flag |= LIB_NEW;
- copy_libblock_data(idn, id);
+ copy_libblock_data(idn, id, FALSE);
return idn;
}
-static void free_library(Library *lib)
+static void free_library(Library *UNUSED(lib))
{
/* no freeing needed for libraries yet */
}
@@ -681,7 +688,7 @@ void set_free_windowmanager_cb(void (*func)(bContext *C, wmWindowManager *) )
free_windowmanager_cb= func;
}
-void animdata_dtar_clear_cb(ID *id, AnimData *adt, void *userdata)
+static void animdata_dtar_clear_cb(ID *UNUSED(id), AnimData *adt, void *userdata)
{
ChannelDriver *driver;
FCurve *fcu;
@@ -822,7 +829,7 @@ void free_libblock_us(ListBase *lb, void *idv) /* test users */
else printf("ERROR block %s users %d\n", id->name, id->us);
}
if(id->us==0) {
- if( GS(id->name)==ID_OB ) unlink_object(NULL, (Object *)id);
+ if( GS(id->name)==ID_OB ) unlink_object((Object *)id);
free_libblock(lb, id);
}
@@ -851,7 +858,7 @@ void free_main(Main *mainvar)
/* ***************** ID ************************ */
-ID *find_id(char *type, char *name) /* type: "OB" or "MA" etc */
+ID *find_id(const char *type, const char *name) /* type: "OB" or "MA" etc */
{
ListBase *lb= which_libbase(G.main, GS(type));
return BLI_findstring(lb, name, offsetof(ID, name) + 2);
@@ -913,7 +920,7 @@ static void IDnames_to_dyn_pupstring(DynStr *pupds, ListBase *lb, ID *link, shor
BLI_dynstr_append(pupds, buf);
BLI_dynstr_append(pupds, id->name+2);
- sprintf(buf, "%%x%d", i+1);
+ BLI_snprintf(buf, sizeof(buf), "%%x%d", i+1);
BLI_dynstr_append(pupds, buf);
/* icon */
@@ -924,7 +931,7 @@ static void IDnames_to_dyn_pupstring(DynStr *pupds, ListBase *lb, ID *link, shor
case ID_IM: /* fall through */
case ID_WO: /* fall through */
case ID_LA: /* fall through */
- sprintf(buf, "%%i%d", BKE_icon_getid(id) );
+ BLI_snprintf(buf, sizeof(buf), "%%i%d", BKE_icon_getid(id) );
BLI_dynstr_append(pupds, buf);
break;
default:
@@ -940,7 +947,7 @@ static void IDnames_to_dyn_pupstring(DynStr *pupds, ListBase *lb, ID *link, shor
/* used by headerbuttons.c buttons.c editobject.c editseq.c */
/* if nr==NULL no MAX_IDPUP, this for non-header browsing */
-void IDnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb, ID *link, short *nr)
+void IDnames_to_pupstring(const char **str, const char *title, const char *extraops, ListBase *lb, ID *link, short *nr)
{
DynStr *pupds= BLI_dynstr_new();
@@ -962,7 +969,7 @@ void IDnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb,
}
/* skips viewer images */
-void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb, ID *link, short *nr)
+void IMAnames_to_pupstring(const char **str, const char *title, const char *extraops, ListBase *lb, ID *link, short *nr)
{
DynStr *pupds= BLI_dynstr_new();
@@ -983,35 +990,6 @@ void IMAnames_to_pupstring(char **str, char *title, char *extraops, ListBase *lb
BLI_dynstr_free(pupds);
}
-
-/* used by buttons.c library.c mball.c */
-int splitIDname(char *name, char *left, int *nr)
-{
- int a;
-
- *nr= 0;
- strncpy(left, name, 21);
-
- a= strlen(name);
- if(a>1 && name[a-1]=='.') return a;
-
- while(a--) {
- if( name[a]=='.' ) {
- left[a]= 0;
- *nr= atol(name+a+1);
- return a;
- }
- if( isdigit(name[a])==0 ) break;
-
- left[a]= 0;
- }
-
- for(a= 0; name[a]; a++)
- left[a]= name[a];
-
- return a;
-}
-
static void sort_alpha_id(ListBase *lb, ID *id)
{
ID *idtest;
@@ -1029,7 +1007,7 @@ static void sort_alpha_id(ListBase *lb, ID *id)
idtest= idtest->next;
}
/* as last */
- if(idtest==0) {
+ if(idtest==NULL) {
BLI_addtail(lb, id);
}
}
@@ -1040,7 +1018,7 @@ static void sort_alpha_id(ListBase *lb, ID *id)
* Check to see if there is an ID with the same name as 'name'.
* Returns the ID if so, if not, returns NULL
*/
-static ID *is_dupid(ListBase *lb, ID *id, char *name)
+static ID *is_dupid(ListBase *lb, ID *id, const char *name)
{
ID *idtest=NULL;
@@ -1091,7 +1069,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
memset(in_use, 0, sizeof(in_use));
/* get name portion, number portion ("name.number") */
- left_len= splitIDname(name, left, &nr);
+ left_len= BLI_split_name_num(left, &nr, name, '.');
/* if new name will be too long, truncate it */
if(nr > 999 && left_len > 16) {
@@ -1108,7 +1086,7 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
(idtest->lib == NULL) &&
(*name == *(idtest->name+2)) &&
(strncmp(name, idtest->name+2, left_len)==0) &&
- (splitIDname(idtest->name+2, leftest, &nrtest) == left_len)
+ (BLI_split_name_num(leftest, &nrtest, idtest->name+2, '.') == left_len)
) {
if(nrtest < sizeof(in_use))
in_use[nrtest]= 1; /* mark as used */
@@ -1146,11 +1124,11 @@ static int check_for_dupid(ListBase *lb, ID *id, char *name)
/* this would overflow name buffer */
left[16] = 0;
/* left_len = 16; */ /* for now this isnt used again */
- memcpy(name, left, sizeof(char) * 16);
+ memcpy(name, left, sizeof(char) * 17);
continue;
}
/* this format specifier is from hell... */
- sprintf(name, "%s.%.3d", left, nr);
+ BLI_snprintf(name, sizeof(id->name) - 2,"%s.%.3d", left, nr);
return 1;
}
@@ -1211,7 +1189,7 @@ int new_id(ListBase *lb, ID *id, const char *tname)
}
/* next to indirect usage in read/writefile also in editobject.c scene.c */
-void clear_id_newpoins()
+void clear_id_newpoins(void)
{
ListBase *lbarray[MAX_LIBARRAY];
ID *id;
@@ -1221,7 +1199,7 @@ void clear_id_newpoins()
while(a--) {
id= lbarray[a]->first;
while(id) {
- id->newid= 0;
+ id->newid= NULL;
id->flag &= ~LIB_NEW;
id= id->next;
}
@@ -1234,7 +1212,7 @@ static void image_fix_relative_path(Image *ima)
if(ima->id.lib==NULL) return;
if(strncmp(ima->name, "//", 2)==0) {
BLI_path_abs(ima->name, ima->id.lib->filepath);
- BLI_path_rel(ima->name, G.sce);
+ BLI_path_rel(ima->name, G.main->name);
}
}
@@ -1279,25 +1257,43 @@ static void lib_indirect_test_id(ID *id, Library *lib)
}
}
-void tag_main(struct Main *mainvar, int tag)
+void tag_main_lb(ListBase *lb, const short tag)
{
- ListBase *lbarray[MAX_LIBARRAY];
ID *id;
+ if(tag) {
+ for(id= lb->first; id; id= id->next) {
+ id->flag |= LIB_DOIT;
+ }
+ }
+ else {
+ for(id= lb->first; id; id= id->next) {
+ id->flag &= ~LIB_DOIT;
+ }
+ }
+}
+
+void tag_main_idcode(struct Main *mainvar, const short type, const short tag)
+{
+ ListBase *lb= which_libbase(mainvar, type);
+
+ tag_main_lb(lb, tag);
+}
+
+void tag_main(struct Main *mainvar, const short tag)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
int a;
a= set_listbasepointers(mainvar, lbarray);
while(a--) {
- for(id= lbarray[a]->first; id; id= id->next) {
- if(tag) id->flag |= LIB_DOIT;
- else id->flag &= ~LIB_DOIT;
- }
+ tag_main_lb(lbarray[a], tag);
}
}
/* if lib!=NULL, only all from lib local */
void all_local(Library *lib, int untagged_only)
{
- ListBase *lbarray[MAX_LIBARRAY], tempbase={0, 0};
+ ListBase *lbarray[MAX_LIBARRAY], tempbase={NULL, NULL};
ID *id, *idn;
int a;
@@ -1326,7 +1322,7 @@ void all_local(Library *lib, int untagged_only)
image_fix_relative_path((Image *)id);
id->lib= NULL;
- new_id(lbarray[a], id, 0); /* new_id only does it with double names */
+ new_id(lbarray[a], id, NULL); /* new_id only does it with double names */
sort_alpha_id(lbarray[a], id);
}
}
@@ -1338,7 +1334,7 @@ void all_local(Library *lib, int untagged_only)
while( (id=tempbase.first) ) {
BLI_remlink(&tempbase, id);
BLI_addtail(lbarray[a], id);
- new_id(lbarray[a], id, 0);
+ new_id(lbarray[a], id, NULL);
}
}
@@ -1359,7 +1355,7 @@ void test_idbutton(char *name)
lb= which_libbase(G.main, GS(name-2) );
- if(lb==0) return;
+ if(lb==NULL) return;
/* search for id */
idtest= BLI_findstring(lb, name, offsetof(ID, name) + 2);
@@ -1386,14 +1382,14 @@ void text_idbutton(struct ID *id, char *text)
}
else {
text[0]= '\0';
-}
+ }
}
-void rename_id(ID *id, char *name)
+void rename_id(ID *id, const char *name)
{
ListBase *lb;
- strncpy(id->name+2, name, 21);
+ BLI_strncpy(id->name+2, name, sizeof(id->name)-2);
lb= which_libbase(G.main, GS(id->name) );
new_id(lb, id, name);
@@ -1402,7 +1398,7 @@ void rename_id(ID *id, char *name)
void name_uiprefix_id(char *name, ID *id)
{
name[0] = id->lib ? 'L':' ';
- name[1] = id->flag & LIB_FAKEUSER ? 'F':' ';
+ name[1] = id->flag & LIB_FAKEUSER ? 'F': (id->us==0)?'0':' ';
name[2] = ' ';
strcpy(name+3, id->name+2);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 7e52f746ebc..0b1cbd60432 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -44,6 +44,8 @@
#include "DNA_scene_types.h"
#include "BLI_math.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_displist.h"
@@ -54,7 +56,7 @@
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_node.h"
-#include "BKE_utildefines.h"
+
#include "GPU_material.h"
@@ -84,7 +86,8 @@ void free_material(Material *ma)
BKE_free_animdata((ID *)ma);
- BKE_previewimg_free(&ma->preview);
+ if(ma->preview)
+ BKE_previewimg_free(&ma->preview);
BKE_icon_delete((struct ID*)ma);
ma->id.icon_id = 0;
@@ -185,7 +188,7 @@ void init_material(Material *ma)
ma->preview = NULL;
}
-Material *add_material(char *name)
+Material *add_material(const char *name)
{
Material *ma;
@@ -196,6 +199,7 @@ Material *add_material(char *name)
return ma;
}
+/* XXX keep synced with next function */
Material *copy_material(Material *ma)
{
Material *man;
@@ -203,9 +207,6 @@ Material *copy_material(Material *ma)
man= copy_libblock(ma);
-#if 0 // XXX old animation system
- id_us_plus((ID *)man->ipo);
-#endif // XXX old animation system
id_lib_extern((ID *)man->group);
for(a=0; a<MAX_MTEX; a++) {
@@ -222,7 +223,7 @@ Material *copy_material(Material *ma)
if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
if(ma->nodetree) {
- man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */
+ man->nodetree= ntreeCopyTree(ma->nodetree); /* 0 == full new tree */
}
man->gpumaterial.first= man->gpumaterial.last= NULL;
@@ -230,6 +231,38 @@ Material *copy_material(Material *ma)
return man;
}
+/* XXX (see above) material copy without adding to main dbase */
+Material *localize_material(Material *ma)
+{
+ Material *man;
+ int a;
+
+ man= copy_libblock(ma);
+ BLI_remlink(&G.main->mat, man);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(ma->mtex[a]) {
+ man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
+ memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
+ /* free_material decrements! */
+ id_us_plus((ID *)man->mtex[a]->tex);
+ }
+ }
+
+ if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
+ if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
+
+ man->preview = NULL;
+
+ if(ma->nodetree) {
+ man->nodetree= ntreeLocalize(ma->nodetree);
+ }
+
+ man->gpumaterial.first= man->gpumaterial.last= NULL;
+
+ return man;
+}
+
void make_local_material(Material *ma)
{
Main *bmain= G.main;
@@ -245,11 +278,11 @@ void make_local_material(Material *ma)
* - mixed: make copy
*/
- if(ma->id.lib==0) return;
+ if(ma->id.lib==NULL) return;
if(ma->id.us==1) {
- ma->id.lib= 0;
+ ma->id.lib= NULL;
ma->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ma, 0);
+ new_id(NULL, (ID *)ma, NULL);
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a]) id_lib_extern((ID *)ma->mtex[a]->tex);
}
@@ -311,14 +344,14 @@ void make_local_material(Material *ma)
}
if(local && lib==0) {
- ma->id.lib= 0;
+ ma->id.lib= NULL;
ma->id.flag= LIB_LOCAL;
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a]) id_lib_extern((ID *)ma->mtex[a]->tex);
}
- new_id(0, (ID *)ma, 0);
+ new_id(NULL, (ID *)ma, NULL);
}
else if(local && lib) {
@@ -331,7 +364,7 @@ void make_local_material(Material *ma)
if(ob->mat) {
for(a=0; a<ob->totcol; a++) {
if(ob->mat[a]==ma) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->mat[a]= man;
man->id.us++;
ma->id.us--;
@@ -347,7 +380,7 @@ void make_local_material(Material *ma)
if(me->mat) {
for(a=0; a<me->totcol; a++) {
if(me->mat[a]==ma) {
- if(me->id.lib==0) {
+ if(me->id.lib==NULL) {
me->mat[a]= man;
man->id.us++;
ma->id.us--;
@@ -363,7 +396,7 @@ void make_local_material(Material *ma)
if(cu->mat) {
for(a=0; a<cu->totcol; a++) {
if(cu->mat[a]==ma) {
- if(cu->id.lib==0) {
+ if(cu->id.lib==NULL) {
cu->mat[a]= man;
man->id.us++;
ma->id.us--;
@@ -379,7 +412,7 @@ void make_local_material(Material *ma)
if(mb->mat) {
for(a=0; a<mb->totcol; a++) {
if(mb->mat[a]==ma) {
- if(mb->id.lib==0) {
+ if(mb->id.lib==NULL) {
mb->mat[a]= man;
man->id.us++;
ma->id.us--;
@@ -445,7 +478,7 @@ Material ***give_matarar_id(ID *id)
return &(((Curve *)id)->mat);
break;
case ID_MB:
- return &(((Curve *)id)->mat);
+ return &(((MetaBall *)id)->mat);
break;
}
return NULL;
@@ -461,7 +494,7 @@ short *give_totcolp_id(ID *id)
return &(((Curve *)id)->totcol);
break;
case ID_MB:
- return &(((Curve *)id)->totcol);
+ return &(((MetaBall *)id)->totcol);
break;
}
return NULL;
@@ -492,6 +525,7 @@ Material *material_pop_id(ID *id, int index)
short *totcol= give_totcolp_id(id);
if(index >= 0 && index < (*totcol)) {
ret= (*matar)[index];
+ id_us_min((ID *)ret);
if(*totcol <= 1) {
*totcol= 0;
MEM_freeN(*matar);
@@ -529,6 +563,10 @@ Material *give_current_material(Object *ob, int act)
totcolp= give_totcolp(ob);
if(totcolp==NULL || ob->totcol==0) return NULL;
+ if(act<0) {
+ printf("no!\n");
+ }
+
if(act>ob->totcol) act= ob->totcol;
else if(act<=0) act= 1;
@@ -545,7 +583,7 @@ Material *give_current_material(Object *ob, int act)
matarar= give_matarar(ob);
if(matarar && *matarar) ma= (*matarar)[act-1];
- else ma= 0;
+ else ma= NULL;
}
@@ -555,7 +593,7 @@ Material *give_current_material(Object *ob, int act)
ID *material_from(Object *ob, int act)
{
- if(ob==0) return 0;
+ if(ob==NULL) return NULL;
if(ob->totcol==0) return ob->data;
if(act==0) act= 1;
@@ -589,67 +627,53 @@ Material *give_node_material(Material *ma)
/* from misc_util: flip the bytes from x */
/* #define GS(x) (((unsigned char *)(x))[0] << 8 | ((unsigned char *)(x))[1]) */
-void test_object_materials(ID *id)
+void resize_object_material(Object *ob, const short totcol)
{
- /* make the ob mat-array same size as 'ob->data' mat-array */
- Object *ob;
- Mesh *me;
- Curve *cu;
- MetaBall *mb;
Material **newmatar;
char *newmatbits;
- int totcol=0;
-
- if(id==0) return;
- if( GS(id->name)==ID_ME ) {
- me= (Mesh *)id;
- totcol= me->totcol;
+ if(totcol==0) {
+ if(ob->totcol) {
+ MEM_freeN(ob->mat);
+ MEM_freeN(ob->matbits);
+ ob->mat= NULL;
+ ob->matbits= NULL;
+ }
}
- else if( GS(id->name)==ID_CU ) {
- cu= (Curve *)id;
- totcol= cu->totcol;
+ else if(ob->totcol<totcol) {
+ newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
+ newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
+ if(ob->totcol) {
+ memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
+ memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
+ MEM_freeN(ob->mat);
+ MEM_freeN(ob->matbits);
+ }
+ ob->mat= newmatar;
+ ob->matbits= newmatbits;
}
- else if( GS(id->name)==ID_MB ) {
- mb= (MetaBall *)id;
- totcol= mb->totcol;
+ ob->totcol= totcol;
+ if(ob->totcol && ob->actcol==0) ob->actcol= 1;
+ if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+}
+
+void test_object_materials(ID *id)
+{
+ /* make the ob mat-array same size as 'ob->data' mat-array */
+ Object *ob;
+ short *totcol;
+
+ if(id==NULL || (totcol=give_totcolp_id(id))==NULL) {
+ return;
}
- else return;
- ob= G.main->object.first;
- while(ob) {
-
+ for(ob= G.main->object.first; ob; ob= ob->id.next) {
if(ob->data==id) {
-
- if(totcol==0) {
- if(ob->totcol) {
- MEM_freeN(ob->mat);
- MEM_freeN(ob->matbits);
- ob->mat= NULL;
- ob->matbits= NULL;
- }
- }
- else if(ob->totcol<totcol) {
- newmatar= MEM_callocN(sizeof(void *)*totcol, "newmatar");
- newmatbits= MEM_callocN(sizeof(char)*totcol, "newmatbits");
- if(ob->totcol) {
- memcpy(newmatar, ob->mat, sizeof(void *)*ob->totcol);
- memcpy(newmatbits, ob->matbits, sizeof(char)*ob->totcol);
- MEM_freeN(ob->mat);
- MEM_freeN(ob->matbits);
- }
- ob->mat= newmatar;
- ob->matbits= newmatbits;
- }
- ob->totcol= totcol;
- if(ob->totcol && ob->actcol==0) ob->actcol= 1;
- if(ob->actcol>ob->totcol) ob->actcol= ob->totcol;
+ resize_object_material(ob, *totcol);
}
- ob= ob->id.next;
}
}
-
void assign_material(Object *ob, Material *ma, int act)
{
Material *mao, **matar, ***matarar;
@@ -664,7 +688,7 @@ void assign_material(Object *ob, Material *ma, int act)
totcolp= give_totcolp(ob);
matarar= give_matarar(ob);
- if(totcolp==0 || matarar==0) return;
+ if(totcolp==NULL || matarar==NULL) return;
if(act > *totcolp) {
matar= MEM_callocN(sizeof(void *)*act, "matarray1");
@@ -758,11 +782,18 @@ int object_add_material_slot(Object *ob)
{
Material *ma;
- if(ob==0) return FALSE;
+ if(ob==NULL) return FALSE;
if(ob->totcol>=MAXMAT) return FALSE;
ma= give_current_material(ob, ob->actcol);
+ if(ma == NULL)
+ ma= add_material("Material");
+ else
+ ma= copy_material(ma);
+
+ id_us_min(&ma->id);
+
assign_material(ob, ma, ob->totcol+1);
ob->actcol= ob->totcol;
return TRUE;
@@ -786,10 +817,10 @@ static void do_init_render_material(Material *ma, int r_mode, float *amb)
ma->texco |= mtex->texco;
ma->mapto |= mtex->mapto;
- if(r_mode & R_OSA) {
- if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
- else if(mtex->texflag & MTEX_NEW_BUMP) ma->texco |= TEXCO_OSA; // NEWBUMP: need texture derivatives for procedurals as well
- }
+
+ /* always get derivatives for these textures */
+ if ELEM3(mtex->tex->type, TEX_IMAGE, TEX_PLUGIN, TEX_ENVMAP) ma->texco |= TEXCO_OSA;
+ else if(mtex->texflag & (MTEX_COMPAT_BUMP|MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) ma->texco |= TEXCO_OSA;
if(ma->texco & (TEXCO_ORCO|TEXCO_REFL|TEXCO_NORM|TEXCO_STRAND|TEXCO_STRESS)) needuv= 1;
else if(ma->texco & (TEXCO_GLOB|TEXCO_UV|TEXCO_OBJECT|TEXCO_SPEED)) needuv= 1;
@@ -841,7 +872,7 @@ static void init_render_nodetree(bNodeTree *ntree, Material *basemat, int r_mode
if(ma!=basemat) {
do_init_render_material(ma, r_mode, amb);
basemat->texco |= ma->texco;
- basemat->mode_l |= ma->mode_l;
+ basemat->mode_l |= ma->mode_l & ~(MA_TRANSP|MA_ZTRANSP|MA_RAYTRANSP);
}
}
else if(node->type==NODE_GROUP)
@@ -933,7 +964,7 @@ int material_in_material(Material *parmat, Material *mat)
/* ****************** */
-char colname_array[125][20]= {
+static char colname_array[125][20]= {
"Black","DarkRed","HalfRed","Red","Red",
"DarkGreen","DarkOlive","Brown","Chocolate","OrangeRed",
"HalfGreen","GreenOlive","DryOlive","Goldenrod","DarkOrange",
@@ -966,7 +997,7 @@ void automatname(Material *ma)
int nr, r, g, b;
float ref;
- if(ma==0) return;
+ if(ma==NULL) return;
if(ma->mode & MA_SHLESS) ref= 1.0;
else ref= ma->ref;
@@ -1014,7 +1045,7 @@ int object_remove_material_slot(Object *ob)
if(*totcolp==0) {
MEM_freeN(*matarar);
- *matarar= 0;
+ *matarar= NULL;
}
actcol= ob->actcol;
@@ -1037,7 +1068,7 @@ int object_remove_material_slot(Object *ob)
if(obt->totcol==0) {
MEM_freeN(obt->mat);
MEM_freeN(obt->matbits);
- obt->mat= 0;
+ obt->mat= NULL;
obt->matbits= NULL;
}
}
@@ -1318,8 +1349,7 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
/* copy/paste buffer, if we had a propper py api that would be better */
Material matcopybuf;
-// MTex mtexcopybuf;
-static short matcopied=0;
+static short matcopied= 0;
void clear_matcopybuf(void)
{
@@ -1329,7 +1359,6 @@ void clear_matcopybuf(void)
void free_matcopybuf(void)
{
-// extern MTex mtexcopybuf; /* buttons.c */
int a;
for(a=0; a<MAX_MTEX; a++) {
@@ -1350,7 +1379,6 @@ void free_matcopybuf(void)
MEM_freeN(matcopybuf.nodetree);
matcopybuf.nodetree= NULL;
}
-// default_mtex(&mtexcopybuf);
matcopied= 0;
}
@@ -1373,7 +1401,7 @@ void copy_matcopybuf(Material *ma)
matcopybuf.mtex[a]= MEM_dupallocN(mtex);
}
}
- matcopybuf.nodetree= ntreeCopyTree(ma->nodetree, 0);
+ matcopybuf.nodetree= ntreeCopyTree(ma->nodetree);
matcopybuf.preview= NULL;
matcopybuf.gpumaterial.first= matcopybuf.gpumaterial.last= NULL;
matcopied= 1;
@@ -1401,7 +1429,7 @@ void paste_matcopybuf(Material *ma)
MEM_freeN(ma->nodetree);
}
- GPU_materials_free(ma);
+ GPU_material_free(ma);
id= (ma->id);
memcpy(ma, &matcopybuf, sizeof(Material));
@@ -1418,11 +1446,5 @@ void paste_matcopybuf(Material *ma)
}
}
- ma->nodetree= ntreeCopyTree(matcopybuf.nodetree, 0);
-
- /*
- BIF_preview_changed(ID_MA);
- BIF_undo_push("Paste material settings");
- scrarea_queue_winredraw(curarea);
- */
+ ma->nodetree= ntreeCopyTree(matcopybuf.nodetree);
}
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index e6f38e04d76..4f44875b7ea 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -1,4 +1,4 @@
-/** mball.c
+/* mball.c
*
* MetaBalls are created from a single Object (with a name without number in it),
* here the DispList and BoundBox also is located.
@@ -48,8 +48,9 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -76,7 +77,7 @@ void unlink_mball(MetaBall *mb)
for(a=0; a<mb->totcol; a++) {
if(mb->mat[a]) mb->mat[a]->id.us--;
- mb->mat[a]= 0;
+ mb->mat[a]= NULL;
}
}
@@ -86,14 +87,17 @@ void free_mball(MetaBall *mb)
{
unlink_mball(mb);
- if(mb->adt) BKE_free_animdata((ID *)mb);
+ if(mb->adt) {
+ BKE_free_animdata((ID *)mb);
+ mb->adt = NULL;
+ }
if(mb->mat) MEM_freeN(mb->mat);
if(mb->bb) MEM_freeN(mb->bb);
BLI_freelistN(&mb->elems);
if(mb->disp.first) freedisplist(&mb->disp);
}
-MetaBall *add_mball(char *name)
+MetaBall *add_mball(const char *name)
{
MetaBall *mb;
@@ -138,9 +142,9 @@ void make_local_mball(MetaBall *mb)
* - mixed: make copy
*/
- if(mb->id.lib==0) return;
+ if(mb->id.lib==NULL) return;
if(mb->id.us==1) {
- mb->id.lib= 0;
+ mb->id.lib= NULL;
mb->id.flag= LIB_LOCAL;
return;
}
@@ -155,7 +159,7 @@ void make_local_mball(MetaBall *mb)
}
if(local && lib==0) {
- mb->id.lib= 0;
+ mb->id.lib= NULL;
mb->id.flag= LIB_LOCAL;
}
else if(local && lib) {
@@ -166,7 +170,7 @@ void make_local_mball(MetaBall *mb)
while(ob) {
if(ob->data==mb) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= mbn;
mbn->id.us++;
mb->id.us--;
@@ -238,7 +242,7 @@ void tex_space_mball(Object *ob)
float *data, min[3], max[3], loc[3], size[3];
int tot, doit=0;
- if(ob->bb==0) ob->bb= MEM_callocN(sizeof(BoundBox), "mb boundbox");
+ if(ob->bb==NULL) ob->bb= MEM_callocN(sizeof(BoundBox), "mb boundbox");
bb= ob->bb;
/* Weird one, this. */
@@ -309,6 +313,19 @@ float *make_orco_mball(Object *ob, ListBase *dispbase)
return orcodata;
}
+
+/* Note on mball basis stuff 2.5x (this is a can of worms)
+ * This really needs a rewrite/refactorm its totally broken in anything other then basic cases
+ * Multiple Scenes + Set Scenes & mixing mball basis SHOULD work but fails to update the depsgraph on rename
+ * and linking into scenes or removal of basis mball. so take care when changing this code.
+ *
+ * Main idiot thing here is that the system returns find_basis_mball() objects which fail a is_basis_mball() test.
+ *
+ * Not only that but the depsgraph and ther areas depend on this behavior!, so making small fixes here isnt worth it.
+ * - campbell
+ */
+
+
/** \brief Test, if Object *ob is basic MetaBall.
*
* It test last character of Object ID name. If last character
@@ -330,8 +347,8 @@ int is_mball_basis_for(Object *ob1, Object *ob2)
int basis1nr, basis2nr;
char basis1name[32], basis2name[32];
- splitIDname(ob1->id.name+2, basis1name, &basis1nr);
- splitIDname(ob2->id.name+2, basis2name, &basis2nr);
+ BLI_split_name_num(basis1name, &basis1nr, ob1->id.name+2, '.');
+ BLI_split_name_num(basis2name, &basis2nr, ob2->id.name+2, '.');
if(!strcmp(basis1name, basis2name)) return is_basis_mball(ob1);
else return 0;
@@ -352,16 +369,16 @@ void copy_mball_properties(Scene *scene, Object *active_object)
int basisnr, obnr;
char basisname[32], obname[32];
- splitIDname(active_object->id.name+2, basisname, &basisnr);
+ BLI_split_name_num(basisname, &basisnr, active_object->id.name+2, '.');
/* XXX recursion check, see scene.c, just too simple code this next_object() */
- if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
+ if(F_ERROR==next_object(&sce_iter, 0, NULL, NULL))
return;
while(next_object(&sce_iter, 1, &base, &ob)) {
if (ob->type==OB_MBALL) {
if(ob!=active_object){
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* Object ob has to be in same "group" ... it means, that it has to have
* same base of its name */
@@ -385,6 +402,8 @@ void copy_mball_properties(Scene *scene, Object *active_object)
* its name. All MetaBalls with same base of name can be
* blended. MetaBalls with different basic name can't be
* blended.
+ *
+ * warning!, is_basis_mball() can fail on returned object, see long note above.
*/
Object *find_basis_mball(Scene *scene, Object *basis)
{
@@ -394,12 +413,12 @@ Object *find_basis_mball(Scene *scene, Object *basis)
MetaElem *ml=NULL;
int basisnr, obnr;
char basisname[32], obname[32];
-
- splitIDname(basis->id.name+2, basisname, &basisnr);
+
+ BLI_split_name_num(basisname, &basisnr, basis->id.name+2, '.');
totelem= 0;
/* XXX recursion check, see scene.c, just too simple code this next_object() */
- if(F_ERROR==next_object(&sce_iter, 0, 0, 0))
+ if(F_ERROR==next_object(&sce_iter, 0, NULL, NULL))
return NULL;
while(next_object(&sce_iter, 1, &base, &ob)) {
@@ -415,7 +434,7 @@ Object *find_basis_mball(Scene *scene, Object *basis)
else ml= mb->elems.first;
}
else{
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* object ob has to be in same "group" ... it means, that it has to have
* same base of its name */
@@ -679,8 +698,8 @@ float metaball(float x, float y, float z)
/* ******************************************** */
-int *indices=NULL;
-int totindex, curindex;
+static int *indices=NULL;
+static int totindex, curindex;
void accum_mballfaces(int i1, int i2, int i3, int i4)
@@ -719,12 +738,12 @@ void accum_mballfaces(int i1, int i2, int i3, int i4)
void *new_pgn_element(int size)
{
/* during polygonize 1000s of elements are allocated
- * and never freed inbetween. Freeing only done at the end.
+ * and never freed in between. Freeing only done at the end.
*/
int blocksize= 16384;
static int offs= 0; /* the current free address */
- static struct pgn_elements *cur= 0;
- static ListBase lb= {0, 0};
+ static struct pgn_elements *cur= NULL;
+ static ListBase lb= {NULL, NULL};
void *adr;
if(size>10000 || size==0) {
@@ -906,14 +925,14 @@ void testface(int i, int j, int k, CUBE* old, int bit, int c1, int c2, int c3, i
newc.corners[FLIP(c3, bit)] = corn3;
newc.corners[FLIP(c4, bit)] = corn4;
- if(newc.corners[0]==0) newc.corners[0] = setcorner(p, i, j, k);
- if(newc.corners[1]==0) newc.corners[1] = setcorner(p, i, j, k+1);
- if(newc.corners[2]==0) newc.corners[2] = setcorner(p, i, j+1, k);
- if(newc.corners[3]==0) newc.corners[3] = setcorner(p, i, j+1, k+1);
- if(newc.corners[4]==0) newc.corners[4] = setcorner(p, i+1, j, k);
- if(newc.corners[5]==0) newc.corners[5] = setcorner(p, i+1, j, k+1);
- if(newc.corners[6]==0) newc.corners[6] = setcorner(p, i+1, j+1, k);
- if(newc.corners[7]==0) newc.corners[7] = setcorner(p, i+1, j+1, k+1);
+ if(newc.corners[0]==NULL) newc.corners[0] = setcorner(p, i, j, k);
+ if(newc.corners[1]==NULL) newc.corners[1] = setcorner(p, i, j, k+1);
+ if(newc.corners[2]==NULL) newc.corners[2] = setcorner(p, i, j+1, k);
+ if(newc.corners[3]==NULL) newc.corners[3] = setcorner(p, i, j+1, k+1);
+ if(newc.corners[4]==NULL) newc.corners[4] = setcorner(p, i+1, j, k);
+ if(newc.corners[5]==NULL) newc.corners[5] = setcorner(p, i+1, j, k+1);
+ if(newc.corners[6]==NULL) newc.corners[6] = setcorner(p, i+1, j+1, k);
+ if(newc.corners[7]==NULL) newc.corners[7] = setcorner(p, i+1, j+1, k+1);
p->cubes->cube= newc;
}
@@ -1012,7 +1031,7 @@ void makecubetable (void)
for (c = 0; c < 8; c++) pos[c] = MB_BIT(i, c);
for (e = 0; e < 12; e++)
if (!done[e] && (pos[corner1[e]] != pos[corner2[e]])) {
- INTLIST *ints = 0;
+ INTLIST *ints = NULL;
INTLISTS *lists = (INTLISTS *) MEM_callocN(sizeof(INTLISTS), "mball_intlist");
int start = e, edge = e;
@@ -1061,7 +1080,7 @@ void BKE_freecubetable(void)
MEM_freeN(lists);
lists= nlists;
}
- cubetable[i]= 0;
+ cubetable[i]= NULL;
}
}
@@ -1403,7 +1422,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
int i, j, k, c_i, c_j, c_k;
int index[3]={1,0,-1};
float f =0.0f;
- float in_v, out_v;
+ float in_v /*, out_v*/;
MB_POINT workp;
float tmp_v, workp_v, max_len, len, dx, dy, dz, nx, ny, nz, MAXN;
@@ -1464,7 +1483,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
calc_mballco(ml, (float *)&out);
- out_v = mbproc->function(out.x, out.y, out.z);
+ /*out_v = mbproc->function(out.x, out.y, out.z);*/ /*UNUSED*/
/* find "first points" on Implicit Surface of MetaElemnt ml */
workp.x = in.x;
@@ -1563,8 +1582,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
Object *bob;
MetaBall *mb;
MetaElem *ml;
- float size, totsize, (*mat)[4] = NULL, (*imat)[4] = NULL, obinv[4][4], obmat[4][4], vec[3];
- float temp1[4][4], temp2[4][4], temp3[4][4]; //max=0.0;
+ float size, totsize, obinv[4][4], obmat[4][4], vec[3];
+ //float max=0.0;
int a, obnr, zero_size=0;
char obname[32];
@@ -1572,10 +1591,10 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
invert_m4_m4(obinv, ob->obmat);
a= 0;
- splitIDname(ob->id.name+2, obname, &obnr);
+ BLI_split_name_num(obname, &obnr, ob->id.name+2, '.');
/* make main array */
- next_object(&sce_iter, 0, 0, 0);
+ next_object(&sce_iter, 0, NULL, NULL);
while(next_object(&sce_iter, 1, &base, &bob)) {
if(bob->type==OB_MBALL) {
@@ -1583,7 +1602,6 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
ml= NULL;
if(bob==ob && (base->flag & OB_FROMDUPLI)==0) {
- mat= imat= 0;
mb= ob->data;
if(mb->editelems) ml= mb->editelems->first;
@@ -1593,7 +1611,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
char name[32];
int nr;
- splitIDname(bob->id.name+2, name, &nr);
+ BLI_split_name_num(name, &nr, bob->id.name+2, '.');
if( strcmp(obname, name)==0 ) {
mb= bob->data;
@@ -1630,6 +1648,8 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
while(ml) {
if(!(ml->flag & MB_HIDE)) {
int i;
+ float temp1[4][4], temp2[4][4], temp3[4][4];
+ float (*mat)[4] = NULL, (*imat)[4] = NULL;
float max_x, max_y, max_z, min_x, min_y, min_z;
max_x = max_y = max_z = -3.4e38;
@@ -2154,7 +2174,7 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
if(G.moving && mb->flag==MB_UPDATE_FAST) return;
curindex= totindex= 0;
- indices= 0;
+ indices= NULL;
thresh= mb->thresh;
/* total number of MetaElems (totelem) is precomputed in find_basis_mball() function */
@@ -2209,7 +2229,7 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
mbproc.function = metaball;
mbproc.size = width;
mbproc.bounds = nr_cubes;
- mbproc.cubes= 0;
+ mbproc.cubes= NULL;
mbproc.delta = width/(float)(RES*RES);
polygonize(&mbproc, mb);
@@ -2231,7 +2251,7 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
dl->parts= curindex;
dl->index= indices;
- indices= 0;
+ indices= NULL;
a= mbproc.vertices.count;
dl->verts= ve= MEM_mallocN(sizeof(float)*3*a, "mballverts");
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index f205d8f9e9a..f6679315606 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -44,6 +44,13 @@
#include "DNA_ipo_types.h"
#include "DNA_customdata_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+#include "BLI_scanfill.h"
+
#include "BKE_animsys.h"
#include "BKE_main.h"
#include "BKE_customdata.h"
@@ -53,12 +60,13 @@
#include "BKE_displist.h"
#include "BKE_library.h"
#include "BKE_material.h"
+#include "BKE_modifier.h"
+#include "BKE_multires.h"
#include "BKE_key.h"
/* these 2 are only used by conversion functions */
#include "BKE_curve.h"
/* -- */
#include "BKE_object.h"
-#include "BKE_utildefines.h"
#include "BKE_tessmesh.h"
#include "BLI_edgehash.h"
@@ -396,11 +404,11 @@ void unlink_mesh(Mesh *me)
{
int a;
- if(me==0) return;
+ if(me==NULL) return;
for(a=0; a<me->totcol; a++) {
if(me->mat[a]) me->mat[a]->id.us--;
- me->mat[a]= 0;
+ me->mat[a]= NULL;
}
if(me->key) {
@@ -408,9 +416,9 @@ void unlink_mesh(Mesh *me)
if (me->key->id.us == 0 && me->key->ipo )
me->key->ipo->id.us--;
}
- me->key= 0;
+ me->key= NULL;
- if(me->texcomesh) me->texcomesh= 0;
+ if(me->texcomesh) me->texcomesh= NULL;
}
@@ -485,7 +493,7 @@ void free_dverts(MDeformVert *dvert, int totvert)
MEM_freeN (dvert);
}
-Mesh *add_mesh(char *name)
+Mesh *add_mesh(const char *name)
{
Mesh *me;
@@ -600,9 +608,9 @@ void make_local_tface(Mesh *me)
if(tface->tpage) {
ima= tface->tpage;
if(ima->id.lib) {
- ima->id.lib= 0;
+ ima->id.lib= NULL;
ima->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ima, 0);
+ new_id(NULL, (ID *)ima, NULL);
}
}
}
@@ -623,11 +631,11 @@ void make_local_mesh(Mesh *me)
* - mixed: make copy
*/
- if(me->id.lib==0) return;
+ if(me->id.lib==NULL) return;
if(me->id.us==1) {
- me->id.lib= 0;
+ me->id.lib= NULL;
me->id.flag= LIB_LOCAL;
- new_id(0, (ID *)me, 0);
+ new_id(NULL, (ID *)me, NULL);
if(me->mtface) make_local_tface(me);
@@ -644,9 +652,9 @@ void make_local_mesh(Mesh *me)
}
if(local && lib==0) {
- me->id.lib= 0;
+ me->id.lib= NULL;
me->id.flag= LIB_LOCAL;
- new_id(0, (ID *)me, 0);
+ new_id(NULL, (ID *)me, NULL);
if(me->mtface) make_local_tface(me);
@@ -658,7 +666,7 @@ void make_local_mesh(Mesh *me)
ob= bmain->object.first;
while(ob) {
if( me==get_mesh(ob) ) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
set_mesh(ob, men);
}
}
@@ -673,7 +681,7 @@ void boundbox_mesh(Mesh *me, float *loc, float *size)
float min[3], max[3];
float mloc[3], msize[3];
- if(me->bb==0) me->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
+ if(me->bb==NULL) me->bb= MEM_callocN(sizeof(BoundBox), "boundbox");
bb= me->bb;
if (!loc) loc= mloc;
@@ -786,11 +794,11 @@ void transform_mesh_orco_verts(Mesh *me, float (*orco)[3], int totvert, int inve
int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
{
/* first test if the face is legal */
- if(mface->v3 && mface->v3==mface->v4) {
+ if((mface->v3 || nr==4) && mface->v3==mface->v4) {
mface->v4= 0;
nr--;
}
- if(mface->v2 && mface->v2==mface->v3) {
+ if((mface->v2 || mface->v4) && mface->v2==mface->v3) {
mface->v3= mface->v4;
mface->v4= 0;
nr--;
@@ -802,6 +810,32 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
nr--;
}
+ /* check corrupt cases, bowtie geometry, cant handle these because edge data wont exist so just return 0 */
+ if(nr==3) {
+ if(
+ /* real edges */
+ mface->v1==mface->v2 ||
+ mface->v2==mface->v3 ||
+ mface->v3==mface->v1
+ ) {
+ return 0;
+ }
+ }
+ else if(nr==4) {
+ if(
+ /* real edges */
+ mface->v1==mface->v2 ||
+ mface->v2==mface->v3 ||
+ mface->v3==mface->v4 ||
+ mface->v4==mface->v1 ||
+ /* across the face */
+ mface->v1==mface->v3 ||
+ mface->v2==mface->v4
+ ) {
+ return 0;
+ }
+ }
+
/* prevent a zero at wrong index location */
if(nr==3) {
if(mface->v3==0) {
@@ -832,16 +866,18 @@ int test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
Mesh *get_mesh(Object *ob)
{
- if(ob==0) return 0;
+ if(ob==NULL) return NULL;
if(ob->type==OB_MESH) return ob->data;
- else return 0;
+ else return NULL;
}
void set_mesh(Object *ob, Mesh *me)
{
- Mesh *old=0;
+ Mesh *old=NULL;
+
+ multires_force_update(ob);
- if(ob==0) return;
+ if(ob==NULL) return;
if(ob->type==OB_MESH) {
old= ob->data;
@@ -852,6 +888,8 @@ void set_mesh(Object *ob, Mesh *me)
}
test_object_materials((ID *)me);
+
+ test_object_modifiers(ob);
}
/* ************** make edges in a Mesh, for outside of editmode */
@@ -903,7 +941,7 @@ static void mfaces_strip_loose(MFace *mface, int *totface)
}
/* Create edges based on known verts and faces */
-static void make_edges_mdata(MVert *allvert, MFace *allface, int totvert, int totface,
+static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, int UNUSED(totvert), int totface,
int old, MEdge **alledge, int *_totedge)
{
MFace *mface;
@@ -1020,6 +1058,23 @@ void mesh_strip_loose_faces(Mesh *me)
me->totface = b;
}
+void mesh_strip_loose_edges(Mesh *me)
+{
+ int a,b;
+
+ for (a=b=0; a<me->totedge; a++) {
+ if (me->medge[a].v1!=me->medge[a].v2) {
+ if (a!=b) {
+ memcpy(&me->medge[b],&me->medge[a],sizeof(me->medge[b]));
+ CustomData_copy_data(&me->edata, &me->edata, a, b, 1);
+ CustomData_free_elem(&me->edata, a, 1);
+ }
+ b++;
+ }
+ }
+ me->totedge = b;
+}
+
void mball_to_mesh(ListBase *lb, Mesh *me)
{
DispList *dl;
@@ -1029,7 +1084,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
int a, *index;
dl= lb->first;
- if(dl==0) return;
+ if(dl==NULL) return;
if(dl->type==DL_INDEX4) {
me->totvert= dl->nr;
@@ -1077,7 +1132,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
MEdge **alledge, int *totedge, MFace **allface, int *totface)
{
- return nurbs_to_mdata_customdb(ob, &((Curve *)ob->data)->disp,
+ return nurbs_to_mdata_customdb(ob, &ob->disp,
allvert, totvert, alledge, totedge, allface, totface);
}
@@ -1093,9 +1148,13 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
float *data;
int a, b, ofs, vertcount, startvert, totvert=0, totvlak=0;
int p1, p2, p3, p4, *index;
+ int conv_polys= 0;
cu= ob->data;
+ conv_polys|= cu->flag & CU_3D; /* 2d polys are filled with DL_INDEX3 displists */
+ conv_polys|= ob->type == OB_SURF; /* surf polys are never filled */
+
/* count */
dl= dispbase->first;
while(dl) {
@@ -1104,8 +1163,10 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
totvlak+= dl->parts*(dl->nr-1);
}
else if(dl->type==DL_POLY) {
- totvert+= dl->parts*dl->nr;
- totvlak+= dl->parts*dl->nr;
+ if(conv_polys) {
+ totvert+= dl->parts*dl->nr;
+ totvlak+= dl->parts*dl->nr;
+ }
}
else if(dl->type==DL_SURF) {
totvert+= dl->parts*dl->nr;
@@ -1125,7 +1186,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
}
*allvert= mvert= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mvert");
- *allface= mface= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mface");
+ *allface= mface= MEM_callocN(sizeof (MVert) * totvlak, "nurbs_init mface");
/* verts and faces */
vertcount= 0;
@@ -1157,24 +1218,26 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
}
else if(dl->type==DL_POLY) {
- startvert= vertcount;
- a= dl->parts*dl->nr;
- data= dl->verts;
- while(a--) {
- VECCOPY(mvert->co, data);
- data+=3;
- vertcount++;
- mvert++;
- }
+ if(conv_polys) {
+ startvert= vertcount;
+ a= dl->parts*dl->nr;
+ data= dl->verts;
+ while(a--) {
+ VECCOPY(mvert->co, data);
+ data+=3;
+ vertcount++;
+ mvert++;
+ }
- for(a=0; a<dl->parts; a++) {
- ofs= a*dl->nr;
- for(b=0; b<dl->nr; b++) {
- mface->v1= startvert+ofs+b;
- if(b==dl->nr-1) mface->v2= startvert+ofs;
- else mface->v2= startvert+ofs+b+1;
- if(smooth) mface->flag |= ME_SMOOTH;
- mface++;
+ for(a=0; a<dl->parts; a++) {
+ ofs= a*dl->nr;
+ for(b=0; b<dl->nr; b++) {
+ mface->v1= startvert+ofs+b;
+ if(b==dl->nr-1) mface->v2= startvert+ofs;
+ else mface->v2= startvert+ofs+b+1;
+ if(smooth) mface->flag |= ME_SMOOTH;
+ mface++;
+ }
}
}
}
@@ -1196,6 +1259,7 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
mface->v2= startvert+index[2];
mface->v3= startvert+index[1];
mface->v4= 0;
+ mface->mat_nr= (unsigned char)dl->col;
test_index_face(mface, NULL, 0, 3);
if(smooth) mface->flag |= ME_SMOOTH;
@@ -1313,7 +1377,7 @@ void nurbs_to_mesh(Object *ob)
tex_space_mesh(me);
- cu->mat= 0;
+ cu->mat= NULL;
cu->totcol= 0;
if(ob->data) {
@@ -1555,14 +1619,12 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
mf->flag &= ~ME_SMOOTH;
}
}
-
-// XXX do this in caller DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r)
{
float (*tnorms)[3]= MEM_callocN(numVerts*sizeof(*tnorms), "tnorms");
- float *fnors= MEM_mallocN(sizeof(*fnors)*3*numFaces, "meshnormals");
+ float *fnors= MEM_callocN(sizeof(*fnors)*3*numFaces, "meshnormals");
int i;
for (i=0; i<numFaces; i++) {
@@ -1782,7 +1844,7 @@ void mesh_pmv_free(PartialVisibility *pv)
MEM_freeN(pv);
}
-void mesh_pmv_revert(Object *ob, Mesh *me)
+void mesh_pmv_revert(Mesh *me)
{
if(me->pv) {
unsigned i;
@@ -1816,15 +1878,13 @@ void mesh_pmv_revert(Object *ob, Mesh *me)
me->pv->edge_map= NULL;
MEM_freeN(me->pv->vert_map);
me->pv->vert_map= NULL;
-
-// XXX do this in caller DAG_id_flush_update(&me->id, OB_RECALC_DATA);
}
}
-void mesh_pmv_off(Object *ob, Mesh *me)
+void mesh_pmv_off(Mesh *me)
{
- if(ob && me->pv) {
- mesh_pmv_revert(ob, me);
+ if(me->pv) {
+ mesh_pmv_revert(me);
MEM_freeN(me->pv);
me->pv= NULL;
}
@@ -1946,7 +2006,7 @@ int mesh_recalcTesselation(CustomData *fdata,
}
BLI_addfilledge(lastv, firstv);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
for (f=fillfacebase.first; f; f=f->next) {
BLI_array_growone(mf);
BLI_array_growone(origIndex);
@@ -2129,7 +2189,10 @@ int mesh_center_median(Mesh *me, float cent[3])
for(mvert= me->mvert; i--; mvert++) {
add_v3_v3(cent, mvert->co);
}
- mul_v3_fl(cent, 1.0f/(float)me->totvert);
+ /* otherwise we get NAN for 0 verts */
+ if(me->totvert) {
+ mul_v3_fl(cent, 1.0f/(float)me->totvert);
+ }
return (me->totvert != 0);
}
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
new file mode 100644
index 00000000000..0821b4188fe
--- /dev/null
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -0,0 +1,379 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2011 Blender Foundation.
+ * All rights reserved.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BLO_sys_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_edgehash.h"
+
+#include "BKE_DerivedMesh.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BKE_mesh.h"
+
+#define SELECT 1
+
+typedef union {
+ uint32_t verts[2];
+ int64_t edval;
+} EdgeUUID;
+
+typedef struct SortFace {
+// unsigned int v[4];
+ EdgeUUID es[4];
+ unsigned int index;
+} SortFace;
+
+static void edge_store_assign(uint32_t verts[2], const uint32_t v1, const uint32_t v2)
+{
+ if(v1 < v2) {
+ verts[0]= v1;
+ verts[1]= v2;
+ }
+ else {
+ verts[0]= v2;
+ verts[1]= v1;
+ }
+}
+
+static void edge_store_from_mface_quad(EdgeUUID es[4], MFace *mf)
+{
+ edge_store_assign(es[0].verts, mf->v1, mf->v2);
+ edge_store_assign(es[1].verts, mf->v2, mf->v3);
+ edge_store_assign(es[2].verts, mf->v3, mf->v4);
+ edge_store_assign(es[3].verts, mf->v4, mf->v1);
+}
+
+static void edge_store_from_mface_tri(EdgeUUID es[3], MFace *mf)
+{
+ edge_store_assign(es[0].verts, mf->v1, mf->v2);
+ edge_store_assign(es[1].verts, mf->v2, mf->v3);
+ edge_store_assign(es[2].verts, mf->v3, mf->v1);
+ es[3].verts[0] = es[3].verts[1] = UINT_MAX;
+}
+
+static int int64_cmp(const void *v1, const void *v2)
+{
+ const int64_t x1= *(const int64_t *)v1;
+ const int64_t x2= *(const int64_t *)v2;
+
+ if( x1 > x2 ) return 1;
+ else if( x1 < x2 ) return -1;
+ return 0;
+}
+
+static int search_face_cmp(const void *v1, const void *v2)
+{
+ const SortFace *sfa= v1, *sfb= v2;
+
+ if (sfa->es[0].edval > sfb->es[0].edval) return 1;
+ else if (sfa->es[0].edval < sfb->es[0].edval) return -1;
+
+ else if (sfa->es[1].edval > sfb->es[1].edval) return 1;
+ else if (sfa->es[1].edval < sfb->es[1].edval) return -1;
+
+ else if (sfa->es[2].edval > sfb->es[2].edval) return 1;
+ else if (sfa->es[2].edval < sfb->es[2].edval) return -1;
+
+ else if (sfa->es[3].edval > sfb->es[3].edval) return 1;
+ else if (sfa->es[3].edval < sfb->es[3].edval) return -1;
+ else return 0;
+
+}
+
+int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge *medges, int totedge, MFace *mfaces, int totface, const short do_verbose, const short do_fixes)
+{
+# define PRINT if(do_verbose) printf
+# define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
+# define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; }
+
+// MVert *mv;
+ MEdge *med;
+ MFace *mf;
+ MFace *mf_prev;
+ int i;
+
+ int do_face_free= FALSE;
+ int do_edge_free= FALSE;
+
+ int do_edge_recalc= FALSE;
+
+ EdgeHash *edge_hash = BLI_edgehash_new();
+
+ SortFace *sort_faces= MEM_callocN(sizeof(SortFace) * totface, "search faces");
+ SortFace *sf;
+ SortFace *sf_prev;
+ int totsortface= 0;
+
+ BLI_assert(!(do_fixes && me == NULL));
+
+ PRINT("ED_mesh_validate: verts(%d), edges(%d), faces(%d)\n", totvert, totedge, totface);
+
+ if(totedge == 0 && totface != 0) {
+ PRINT(" locical error, %d faces and 0 edges\n", totface);
+ do_edge_recalc= TRUE;
+ }
+
+ for(i=0, med= medges; i<totedge; i++, med++) {
+ int remove= FALSE;
+ if(med->v1 == med->v2) {
+ PRINT(" edge %d: has matching verts, both %d\n", i, med->v1);
+ remove= do_fixes;
+ }
+ if(med->v1 >= totvert) {
+ PRINT(" edge %d: v1 index out of range, %d\n", i, med->v1);
+ remove= do_fixes;
+ }
+ if(med->v2 >= totvert) {
+ PRINT(" edge %d: v2 index out of range, %d\n", i, med->v2);
+ remove= do_fixes;
+ }
+
+ if(BLI_edgehash_haskey(edge_hash, med->v1, med->v2)) {
+ PRINT(" edge %d: is a duplicate of, %d\n", i, GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, med->v1, med->v2)));
+ remove= do_fixes;
+ }
+
+ if(remove == FALSE){
+ BLI_edgehash_insert(edge_hash, med->v1, med->v2, SET_INT_IN_POINTER(i));
+ }
+ else {
+ REMOVE_EDGE_TAG(med);
+ }
+ }
+
+ for(i=0, mf=mfaces, sf=sort_faces; i<totface; i++, mf++) {
+ int remove= FALSE;
+ int fidx;
+ unsigned int fv[4];
+
+ fidx = mf->v4 ? 3:2;
+ do {
+ fv[fidx]= *(&(mf->v1) + fidx);
+ if(fv[fidx] >= totvert) {
+ PRINT(" face %d: 'v%d' index out of range, %d\n", i, fidx + 1, fv[fidx]);
+ remove= do_fixes;
+ }
+ } while (fidx--);
+
+ if(remove == FALSE) {
+ if(mf->v4) {
+ if(mf->v1 == mf->v2) { PRINT(" face %d: verts invalid, v1/v2 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v3) { PRINT(" face %d: verts invalid, v1/v3 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v4) { PRINT(" face %d: verts invalid, v1/v4 both %d\n", i, mf->v1); remove= do_fixes; }
+
+ if(mf->v2 == mf->v3) { PRINT(" face %d: verts invalid, v2/v3 both %d\n", i, mf->v2); remove= do_fixes; }
+ if(mf->v2 == mf->v4) { PRINT(" face %d: verts invalid, v2/v4 both %d\n", i, mf->v2); remove= do_fixes; }
+
+ if(mf->v3 == mf->v4) { PRINT(" face %d: verts invalid, v3/v4 both %d\n", i, mf->v3); remove= do_fixes; }
+ }
+ else {
+ if(mf->v1 == mf->v2) { PRINT(" faceT %d: verts invalid, v1/v2 both %d\n", i, mf->v1); remove= do_fixes; }
+ if(mf->v1 == mf->v3) { PRINT(" faceT %d: verts invalid, v1/v3 both %d\n", i, mf->v1); remove= do_fixes; }
+
+ if(mf->v2 == mf->v3) { PRINT(" faceT %d: verts invalid, v2/v3 both %d\n", i, mf->v2); remove= do_fixes; }
+ }
+
+ if(remove == FALSE) {
+ if(totedge) {
+ if(mf->v4) {
+ if(!BLI_edgehash_haskey(edge_hash, mf->v1, mf->v2)) { PRINT(" face %d: edge v1/v2 (%d,%d) is missing egde data\n", i, mf->v1, mf->v2); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v2, mf->v3)) { PRINT(" face %d: edge v2/v3 (%d,%d) is missing egde data\n", i, mf->v2, mf->v3); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v3, mf->v4)) { PRINT(" face %d: edge v3/v4 (%d,%d) is missing egde data\n", i, mf->v3, mf->v4); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v4, mf->v1)) { PRINT(" face %d: edge v4/v1 (%d,%d) is missing egde data\n", i, mf->v4, mf->v1); do_edge_recalc= TRUE; }
+ }
+ else {
+ if(!BLI_edgehash_haskey(edge_hash, mf->v1, mf->v2)) { PRINT(" face %d: edge v1/v2 (%d,%d) is missing egde data\n", i, mf->v1, mf->v2); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v2, mf->v3)) { PRINT(" face %d: edge v2/v3 (%d,%d) is missing egde data\n", i, mf->v2, mf->v3); do_edge_recalc= TRUE; }
+ if(!BLI_edgehash_haskey(edge_hash, mf->v3, mf->v1)) { PRINT(" face %d: edge v3/v1 (%d,%d) is missing egde data\n", i, mf->v3, mf->v1); do_edge_recalc= TRUE; }
+ }
+ }
+
+ sf->index = i;
+
+ if(mf->v4) {
+ edge_store_from_mface_quad(sf->es, mf);
+
+ qsort(sf->es, 4, sizeof(int64_t), int64_cmp);
+ }
+ else {
+ edge_store_from_mface_tri(sf->es, mf);
+ qsort(sf->es, 3, sizeof(int64_t), int64_cmp);
+ }
+
+ totsortface++;
+ sf++;
+ }
+ }
+ if(remove) {
+ REMOVE_FACE_TAG(mf);
+ }
+ }
+
+ qsort(sort_faces, totsortface, sizeof(SortFace), search_face_cmp);
+
+ sf= sort_faces;
+ sf_prev= sf;
+ sf++;
+
+ for(i=1; i<totsortface; i++, sf++) {
+ int remove= FALSE;
+ /* on a valid mesh, code below will never run */
+ if(memcmp(sf->es, sf_prev->es, sizeof(sf_prev->es)) == 0) {
+ mf= mfaces + sf->index;
+
+ if(do_verbose) {
+ mf_prev= mfaces + sf_prev->index;
+ if(mf->v4) {
+ PRINT(" face %d & %d: are duplicates (%d,%d,%d,%d) (%d,%d,%d,%d)\n", sf->index, sf_prev->index, mf->v1, mf->v2, mf->v3, mf->v4, mf_prev->v1, mf_prev->v2, mf_prev->v3, mf_prev->v4);
+ }
+ else {
+ PRINT(" face %d & %d: are duplicates (%d,%d,%d) (%d,%d,%d)\n", sf->index, sf_prev->index, mf->v1, mf->v2, mf->v3, mf_prev->v1, mf_prev->v2, mf_prev->v3);
+ }
+ }
+
+ remove= do_fixes;
+ }
+ else {
+ sf_prev= sf;
+ }
+
+ if(remove) {
+ REMOVE_FACE_TAG(mf);
+ }
+ }
+
+ BLI_edgehash_free(edge_hash, NULL);
+ MEM_freeN(sort_faces);
+
+ PRINT("BKE_mesh_validate: finished\n\n");
+
+# undef PRINT
+# undef REMOVE_EDGE_TAG
+# undef REMOVE_FACE_TAG
+
+ if(me) {
+ if(do_face_free) {
+ mesh_strip_loose_faces(me);
+ }
+
+ if (do_edge_free) {
+ mesh_strip_loose_edges(me);
+ }
+
+ if(do_fixes && do_edge_recalc) {
+ BKE_mesh_calc_edges(me, TRUE);
+ }
+ }
+
+ return (do_face_free || do_edge_free || do_edge_recalc);
+}
+
+int BKE_mesh_validate(Mesh *me, int do_verbose)
+{
+ printf("MESH: %s\n", me->id.name+2);
+ return BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE);
+}
+
+int BKE_mesh_validate_dm(DerivedMesh *dm)
+{
+ return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), TRUE, FALSE);
+}
+
+void BKE_mesh_calc_edges(Mesh *mesh, int update)
+{
+ CustomData edata;
+ EdgeHashIterator *ehi;
+ MFace *mf = mesh->mface;
+ MEdge *med, *med_orig;
+ EdgeHash *eh = BLI_edgehash_new();
+ int i, totedge, totface = mesh->totface;
+
+ if(mesh->totedge==0)
+ update= 0;
+
+ if(update) {
+ /* assume existing edges are valid
+ * useful when adding more faces and generating edges from them */
+ med= mesh->medge;
+ for(i= 0; i<mesh->totedge; i++, med++)
+ BLI_edgehash_insert(eh, med->v1, med->v2, med);
+ }
+
+ for (i = 0; i < totface; i++, mf++) {
+ if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
+ BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
+ BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
+
+ if (mf->v4) {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
+ BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
+ if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
+ BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
+ } else {
+ if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
+ BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
+ }
+ }
+
+ totedge = BLI_edgehash_size(eh);
+
+ /* write new edges into a temporary CustomData */
+ memset(&edata, 0, sizeof(edata));
+ CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+
+ ehi = BLI_edgehashIterator_new(eh);
+ med = CustomData_get_layer(&edata, CD_MEDGE);
+ for(i = 0; !BLI_edgehashIterator_isDone(ehi);
+ BLI_edgehashIterator_step(ehi), ++i, ++med) {
+
+ if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
+ *med= *med_orig; /* copy from the original */
+ } else {
+ BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
+ med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
+ }
+ }
+ BLI_edgehashIterator_free(ehi);
+
+ /* free old CustomData and assign new one */
+ CustomData_free(&mesh->edata, mesh->totedge);
+ mesh->edata = edata;
+ mesh->totedge = totedge;
+
+ mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
+
+ BLI_edgehash_free(eh, NULL);
+}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 63f0f1fa091..7439a47a746 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -40,30 +40,33 @@
#include <math.h>
#include <float.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
-#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_bmesh.h"
#include "BKE_cloth.h"
#include "BKE_key.h"
+#include "BKE_multires.h"
#include "MOD_modifiertypes.h"
ModifierTypeInfo *modifierType_getInfo(ModifierType type)
{
- static ModifierTypeInfo *types[NUM_MODIFIER_TYPES];
+ static ModifierTypeInfo *types[NUM_MODIFIER_TYPES]= {NULL};
static int types_init = 1;
if (types_init) {
- modifier_type_init(types, type); /* MOD_utils.c */
+ modifier_type_init(types); /* MOD_utils.c */
types_init= 0;
}
- if(type >= 0 && type < NUM_MODIFIER_TYPES &&
- types[type]->name[0] != '\0') {
+ /* type unsigned, no need to chech < 0 */
+ if(type < NUM_MODIFIER_TYPES && types[type]->name[0] != '\0') {
return types[type];
}
else {
@@ -146,14 +149,14 @@ ModifierData *modifiers_findByName(Object *ob, const char *name)
void modifiers_clearErrors(Object *ob)
{
ModifierData *md = ob->modifiers.first;
- int qRedraw = 0;
+ /* int qRedraw = 0; */
for (; md; md=md->next) {
if (md->error) {
MEM_freeN(md->error);
md->error = NULL;
- qRedraw = 1;
+ /* qRedraw = 1; */
}
}
}
@@ -215,14 +218,15 @@ int modifier_sameTopology(ModifierData *md)
return ( mti->type == eModifierTypeType_OnlyDeform || mti->type == eModifierTypeType_Nonconstructive);
}
-void modifier_setError(ModifierData *md, char *format, ...)
+void modifier_setError(ModifierData *md, const char *format, ...)
{
- char buffer[2048];
+ char buffer[512];
va_list ap;
va_start(ap, format);
- vsprintf(buffer, format, ap);
+ vsnprintf(buffer, sizeof(buffer), format, ap);
va_end(ap);
+ buffer[sizeof(buffer) - 1]= '\0';
if (md->error)
MEM_freeN(md->error);
@@ -235,13 +239,19 @@ void modifier_setError(ModifierData *md, char *format, ...)
* there
*
* also used in transform_conversion.c, to detect CrazySpace [tm] (2nd arg
- * then is NULL)
+ * then is NULL)
+ * also used for some mesh tools to give warnings
*/
int modifiers_getCageIndex(struct Scene *scene, Object *ob, int *lastPossibleCageIndex_r, int virtual_)
{
ModifierData *md = (virtual_)? modifiers_getVirtualModifierList(ob): ob->modifiers.first;
int i, cageIndex = -1;
+ if(lastPossibleCageIndex_r) {
+ /* ensure the value is initialized */
+ *lastPossibleCageIndex_r= -1;
+ }
+
/* Find the last modifier acting on the cage. */
for (i=0; md; i++,md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -491,7 +501,7 @@ int modifier_isCorrectableDeformed(ModifierData *md)
return 0;
}
-int modifiers_isCorrectableDeformed(struct Scene *scene, Object *ob)
+int modifiers_isCorrectableDeformed(Object *ob)
{
ModifierData *md = modifiers_getVirtualModifierList(ob);
@@ -526,5 +536,21 @@ void modifier_freeTemporaryData(ModifierData *md)
}
}
+/* ensure modifier correctness when changing ob->data */
+void test_object_modifiers(Object *ob)
+{
+ ModifierData *md;
+
+ /* just multires checked for now, since only multires
+ modifies mesh data */
+
+ if(ob->type != OB_MESH) return;
+ for(md = ob->modifiers.first; md; md = md->next) {
+ if(md->type == eModifierType_Multires) {
+ MultiresModifierData *mmd = (MultiresModifierData*)md;
+ multiresModifier_set_levels_from_disps(mmd, ob);
+ }
+ }
+}
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 4b54114505e..f2c5a9cbf37 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -37,6 +37,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
@@ -45,7 +47,9 @@
#include "BKE_paint.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
-#include "BKE_utildefines.h"
+#include "BKE_tessmesh.h"
+
+#include "BKE_object.h"
#include "CCGSubSurf.h"
@@ -89,6 +93,36 @@ MultiresModifierData *find_multires_modifier_before(Scene *scene, ModifierData *
return NULL;
}
+/* used for applying scale on mdisps layer and syncing subdivide levels when joining objects
+ use_first - return first multires modifier if all multires'es are disabled
+*/
+MultiresModifierData *get_multires_modifier(Scene *scene, Object *ob, int use_first)
+{
+ ModifierData *md;
+ MultiresModifierData *mmd= NULL, *firstmmd= NULL;
+
+ /* find first active multires modifier */
+ for(md = ob->modifiers.first; md; md = md->next) {
+ if(md->type == eModifierType_Multires) {
+ if(!firstmmd)
+ firstmmd= (MultiresModifierData*)md;
+
+ if (modifier_isEnabled(scene, md, eModifierMode_Realtime)) {
+ mmd= (MultiresModifierData*)md;
+ break;
+ }
+ }
+ }
+
+ if(!mmd && use_first) {
+ /* active multires have not been found
+ try to use first one */
+ return firstmmd;
+ }
+
+ return mmd;
+}
+
static int multires_get_level(Object *ob, MultiresModifierData *mmd, int render)
{
if(render)
@@ -151,68 +185,6 @@ void multires_force_render_update(Object *ob)
multires_force_update(ob);
}
-/* XXX */
-#if 0
-void multiresModifier_join(Object *ob)
-{
- Base *base = NULL;
- int highest_lvl = 0;
-
- /* First find the highest level of subdivision */
- base = FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(v3d, scene, base) && base->object->type==OB_MESH) {
- ModifierData *md;
- for(md = base->object->modifiers.first; md; md = md->next) {
- if(md->type == eModifierType_Multires) {
- int totlvl = ((MultiresModifierData*)md)->totlvl;
- if(totlvl > highest_lvl)
- highest_lvl = totlvl;
-
- /* Ensure that all updates are processed */
- multires_force_update(base->object);
- }
- }
- }
- base = base->next;
- }
-
- /* No multires meshes selected */
- if(highest_lvl == 0)
- return;
-
- /* Subdivide all the displacements to the highest level */
- base = FIRSTBASE;
- while(base) {
- if(TESTBASELIB_BGMODE(v3d, scene, base) && base->object->type==OB_MESH) {
- ModifierData *md = NULL;
- MultiresModifierData *mmd = NULL;
-
- for(md = base->object->modifiers.first; md; md = md->next) {
- if(md->type == eModifierType_Multires)
- mmd = (MultiresModifierData*)md;
- }
-
- /* If the object didn't have multires enabled, give it a new modifier */
- if(!mmd) {
- md = base->object->modifiers.first;
-
- while(md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform)
- md = md->next;
-
- mmd = (MultiresModifierData*)modifier_new(eModifierType_Multires);
- BLI_insertlinkbefore(&base->object->modifiers, md, mmd);
- modifier_unique_name(&base->object->modifiers, mmd);
- }
-
- if(mmd)
- multiresModifier_subdivide(mmd, base->object, highest_lvl - mmd->totlvl, 0, 0);
- }
- base = base->next;
- }
-}
-#endif
-
int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
Object *ob, DerivedMesh *srcdm)
{
@@ -229,7 +201,7 @@ int multiresModifier_reshapeFromDM(Scene *scene, MultiresModifierData *mmd,
return 1;
}
- mrdm->release(mrdm);
+ if(mrdm) mrdm->release(mrdm);
return 0;
}
@@ -275,6 +247,60 @@ int multiresModifier_reshapeFromDeformMod(Scene *scene, MultiresModifierData *mm
return result;
}
+/* reset the multires levels to match the number of mdisps */
+static int get_levels_from_disps(Object *ob)
+{
+ Mesh *me = ob->data;
+ MDisps *mdisp, *md;
+ int i, j, totlvl= 0;
+
+ mdisp = CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ for(i = 0; i < me->totpoly; ++i) {
+ int S = me->mpoly[i].totloop;
+
+ md = mdisp + me->mpoly[i].loopstart;
+ for (j=0; j<me->mpoly[i].totloop; j++, md++) {
+ if(md->totdisp == 0) continue;
+
+ while(1) {
+ int side = (1 << (totlvl-1)) + 1;
+ int lvl_totdisp = side*side*S;
+ if(md->totdisp == lvl_totdisp)
+ break;
+ else if(md->totdisp < lvl_totdisp)
+ --totlvl;
+ else
+ ++totlvl;
+
+ }
+
+ break;
+ }
+ }
+
+ return totlvl;
+}
+
+/* reset the multires levels to match the number of mdisps */
+void multiresModifier_set_levels_from_disps(MultiresModifierData *mmd, Object *ob)
+{
+ Mesh *me = ob->data;
+ MDisps *mdisp;
+
+ if(me->edit_btmesh)
+ mdisp = CustomData_get_layer(&me->edit_btmesh->bm->ldata, CD_MDISPS);
+ else
+ mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
+
+ if(mdisp) {
+ mmd->totlvl = get_levels_from_disps(ob);
+ mmd->lvl = MIN2(mmd->sculptlvl, mmd->totlvl);
+ mmd->sculptlvl = MIN2(mmd->sculptlvl, mmd->totlvl);
+ mmd->renderlvl = MIN2(mmd->renderlvl, mmd->totlvl);
+ }
+}
+
static void multires_set_tot_mdisps(Mesh *me, int lvl)
{
MDisps *mdisps= CustomData_get_layer(&me->ldata, CD_MDISPS);
@@ -351,11 +377,9 @@ static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int size
}
}
-/* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
-void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
+static void multires_del_higher(MultiresModifierData *mmd, Object *ob, int lvl)
{
- Mesh *me = get_mesh(ob);
- int lvl = multires_get_level(ob, mmd, 0);
+ Mesh *me = (Mesh*)ob->data;
int levels = mmd->totlvl - lvl;
MDisps *mdisps;
@@ -365,7 +389,7 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire
multires_force_update(ob);
- if(mdisps && levels > 0 && direction == 1) {
+ if(mdisps && levels > 0) {
if(lvl > 0) {
MLoop *ml = me->mloop;
int nsize = multires_side_tot[lvl];
@@ -403,11 +427,31 @@ void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int dire
multires_set_tot_level(ob, mmd, lvl);
}
+/* direction=1 for delete higher, direction=0 for lower (not implemented yet) */
+void multiresModifier_del_levels(MultiresModifierData *mmd, Object *ob, int direction)
+{
+ Mesh *me = get_mesh(ob);
+ int lvl = multires_get_level(ob, mmd, 0);
+ int levels = mmd->totlvl - lvl;
+ MDisps *mdisps;
+
+ multires_set_tot_mdisps(me, mmd->totlvl);
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ multires_force_update(ob);
+
+ if(mdisps && levels > 0 && direction == 1) {
+ multires_del_higher(mmd, ob, lvl);
+ }
+
+ multires_set_tot_level(ob, mmd, lvl);
+}
+
static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int totlvl, int simple)
{
- MultiresModifierData mmd;
+ MultiresModifierData mmd= {{NULL}};
- memset(&mmd, 0, sizeof(MultiresModifierData));
mmd.lvl = lvl;
mmd.sculptlvl = lvl;
mmd.renderlvl = lvl;
@@ -417,11 +461,10 @@ static DerivedMesh *multires_dm_create_local(Object *ob, DerivedMesh *dm, int lv
return multires_dm_create_from_derived(&mmd, 1, dm, ob, 0, 0);
}
-static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl, int simple, int optimal)
+static DerivedMesh *subsurf_dm_create_local(Object *UNUSED(ob), DerivedMesh *dm, int lvl, int simple, int optimal)
{
- SubsurfModifierData smd;
+ SubsurfModifierData smd= {{NULL}};
- memset(&smd, 0, sizeof(SubsurfModifierData));
smd.levels = smd.renderLevels = lvl;
smd.flags |= eSubsurfModifierFlag_SubsurfUv;
if(simple)
@@ -432,12 +475,133 @@ static DerivedMesh *subsurf_dm_create_local(Object *ob, DerivedMesh *dm, int lvl
return subsurf_make_derived_from_derived(dm, &smd, 0, NULL, 0, 0);
}
-void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
+
+
+/* assumes no is normalized; return value's sign is negative if v is on
+ the other side of the plane */
+static float v3_dist_from_plane(float v[3], float center[3], float no[3])
+{
+ float s[3];
+ sub_v3_v3v3(s, v, center);
+ return dot_v3v3(s, no);
+}
+
+void multiresModifier_base_apply(MultiresModifierData *mmd, Object *ob)
+{
+ DerivedMesh *cddm, *dispdm, *origdm;
+ Mesh *me;
+ ListBase *fmap;
+ float (*origco)[3];
+ int i, j, offset, totlvl;
+
+ multires_force_update(ob);
+
+ me = get_mesh(ob);
+ totlvl = mmd->totlvl;
+
+ /* nothing to do */
+ if(!totlvl)
+ return;
+
+ /* XXX - probably not necessary to regenerate the cddm so much? */
+
+ /* generate highest level with displacements */
+ cddm = CDDM_from_mesh(me, NULL);
+ DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+ dispdm = multires_dm_create_local(ob, cddm, totlvl, totlvl, 0);
+ cddm->release(cddm);
+
+ /* copy the new locations of the base verts into the mesh */
+ offset = dispdm->getNumVerts(dispdm) - me->totvert;
+ for(i = 0; i < me->totvert; ++i) {
+ dispdm->getVertCo(dispdm, offset + i, me->mvert[i].co);
+ }
+
+ /* heuristic to produce a better-fitting base mesh */
+
+ cddm = CDDM_from_mesh(me, NULL);
+ fmap = cddm->getFaceMap(ob, cddm);
+ origco = MEM_callocN(sizeof(float)*3*me->totvert, "multires apply base origco");
+ for(i = 0; i < me->totvert ;++i)
+ copy_v3_v3(origco[i], me->mvert[i].co);
+
+ for(i = 0; i < me->totvert; ++i) {
+ IndexNode *n;
+ float avg_no[3] = {0,0,0}, center[3] = {0,0,0}, push[3];
+ float dist;
+ int tot;
+
+ /* don't adjust verts not used by at least one face */
+ if(!fmap[i].first)
+ continue;
+
+ /* find center */
+ for(n = fmap[i].first, tot = 0; n; n = n->next) {
+ MFace *f = &me->mface[n->index];
+ int S = f->v4 ? 4 : 3;
+
+ /* this double counts, not sure if that's bad or good */
+ for(j = 0; j < S; ++j) {
+ int vndx = (&f->v1)[j];
+ if(vndx != i) {
+ add_v3_v3(center, origco[vndx]);
+ ++tot;
+ }
+ }
+ }
+ mul_v3_fl(center, 1.0f / tot);
+
+ /* find normal */
+ for(n = fmap[i].first; n; n = n->next) {
+ MFace *f = &me->mface[n->index];
+ int S = f->v4 ? 4 : 3;
+ float v[4][3], no[3];
+
+ for(j = 0; j < S; ++j) {
+ int vndx = (&f->v1)[j];
+ if(vndx == i)
+ copy_v3_v3(v[j], center);
+ else
+ copy_v3_v3(v[j], origco[vndx]);
+ }
+
+ if(S == 4)
+ normal_quad_v3(no, v[0], v[1], v[2], v[3]);
+ else
+ normal_tri_v3(no, v[0], v[1], v[2]);
+ add_v3_v3(avg_no, no);
+ }
+ normalize_v3(avg_no);
+
+ /* push vertex away from the plane */
+ dist = v3_dist_from_plane(me->mvert[i].co, center, avg_no);
+ copy_v3_v3(push, avg_no);
+ mul_v3_fl(push, dist);
+ add_v3_v3(me->mvert[i].co, push);
+
+ }
+
+ MEM_freeN(origco);
+ cddm->release(cddm);
+
+ /* subdivide the mesh to highest level without displacements */
+ cddm = CDDM_from_mesh(me, NULL);
+ DM_set_only_copy(cddm, CD_MASK_BAREMESH);
+ origdm = subsurf_dm_create_local(ob, cddm, totlvl, 0, 0);
+ cddm->release(cddm);
+
+ /* calc disps */
+ multiresModifier_disp_run(dispdm, me, 1, 0, origdm->getGridData(origdm), totlvl);
+
+ origdm->release(origdm);
+ dispdm->release(dispdm);
+}
+
+static void multires_subdivide(MultiresModifierData *mmd, Object *ob, int totlvl, int updateblock, int simple)
{
Mesh *me = ob->data;
MDisps *mdisps;
int lvl= mmd->totlvl;
- int totlvl= mmd->totlvl+1;
if(totlvl > multires_max_levels)
return;
@@ -510,6 +674,11 @@ void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updat
multires_set_tot_level(ob, mmd, totlvl);
}
+void multiresModifier_subdivide(MultiresModifierData *mmd, Object *ob, int updateblock, int simple)
+{
+ multires_subdivide(mmd, ob, mmd->totlvl+1, updateblock, simple);
+}
+
static void grid_tangent(int gridSize, int index, int x, int y, int axis, DMGridData **gridData, float t[3])
{
if(axis == 0) {
@@ -541,7 +710,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int
MPoly *mpoly = me->mpoly;
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
int *gridOffset;
- int i, k, numGrids, gridSize, dGridSize, dSkip;
+ int i, k, /*numGrids,*/ gridSize, dGridSize, dSkip;
if(!mdisps) {
if(invert)
@@ -550,7 +719,7 @@ static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int
return;
}
- numGrids = dm->getNumGrids(dm);
+ /*numGrids = dm->getNumGrids(dm);*/ /*UNUSED*/
gridSize = dm->getGridSize(dm);
gridData = dm->getGridData(dm);
gridOffset = dm->getGridOffset(dm);
@@ -747,7 +916,7 @@ void multires_stitch_grids(Object *ob)
}
DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int local_mmd, DerivedMesh *dm, Object *ob,
- int useRenderParams, int isFinalCalc)
+ int useRenderParams, int UNUSED(isFinalCalc))
{
Mesh *me= ob->data;
DerivedMesh *result;
@@ -802,7 +971,7 @@ DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, int loca
***************************/
/* Adapted from sculptmode.c */
-static void old_mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v)
+void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v)
{
int x, y, x2, y2;
const int st_max = st - 1;
@@ -843,7 +1012,7 @@ static void old_mdisps_bilinear(float out[3], float (*disps)[3], int st, float u
add_v3_v3v3(out, d2[0], d2[1]);
}
-static void old_mdisps_rotate(int S, int newside, int oldside, int x, int y, float *u, float *v)
+static void old_mdisps_rotate(int S, int UNUSED(newside), int oldside, int x, int y, float *u, float *v)
{
float offset = oldside*0.5f - 0.5f;
@@ -998,7 +1167,12 @@ static void create_old_vert_edge_map(ListBase **map, IndexNode **mem, const Mult
static MultiresFace *find_old_face(ListBase *map, MultiresFace *faces, int v1, int v2, int v3, int v4)
{
IndexNode *n1;
- int v[4] = {v1, v2, v3, v4}, i, j;
+ int v[4], i, j;
+
+ v[0]= v1;
+ v[1]= v2;
+ v[2]= v3;
+ v[3]= v4;
for(n1 = map[v1].first; n1; n1 = n1->next) {
int fnd[4] = {0, 0, 0, 0};
@@ -1145,18 +1319,18 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
MultiresLevel *lvl, *lvl1;
Multires *mr= me->mr;
MVert *vsrc, *vdst;
- int src, dst;
+ unsigned int src, dst;
int st = multires_side_tot[totlvl - 1] - 1;
int extedgelen = multires_side_tot[totlvl] - 2;
int *vvmap; // inorder for dst, map to src
int crossedgelen;
- int i, j, s, x, totvert, tottri, totquad;
+ int s, x, tottri, totquad;
+ unsigned int i, j, totvert;
src = 0;
- dst = 0;
vsrc = mr->verts;
vdst = dm->getVertArray(dm);
- totvert = dm->getNumVerts(dm);
+ totvert = (unsigned int)dm->getNumVerts(dm);
vvmap = MEM_callocN(sizeof(int) * totvert, "multires vvmap");
lvl1 = mr->levels.first;
@@ -1247,7 +1421,7 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
fmem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires fmem");
emem = MEM_callocN(sizeof(IndexNode*) * (mr->level_count-1), "multires emem");
lvl = lvl1;
- for(i = 0; i < mr->level_count - 1; ++i) {
+ for(i = 0; i < (unsigned int)mr->level_count - 1; ++i) {
create_old_vert_face_map(fmap + i, fmem + i, lvl->faces, lvl->totvert, lvl->totface);
create_old_vert_edge_map(emap + i, emem + i, lvl->edges, lvl->totvert, lvl->totedge);
lvl = lvl->next;
@@ -1282,9 +1456,9 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
dst = ldst;
}
- lvl = lvl->next;
+ /*lvl = lvl->next;*/ /*UNUSED*/
- for(i = 0; i < mr->level_count - 1; ++i) {
+ for(i = 0; i < (unsigned int)(mr->level_count - 1); ++i) {
MEM_freeN(fmap[i]);
MEM_freeN(fmem[i]);
MEM_freeN(emap[i]);
@@ -1306,6 +1480,52 @@ static void multires_load_old_dm(DerivedMesh *dm, Mesh *me, int totlvl)
multires_mvert_to_ss(dm, vdst);
}
+/* Copy the first-level vcol data to the mesh, if it exists */
+/* Warning: higher-level vcol data will be lost */
+static void multires_load_old_vcols(Mesh *me)
+{
+ MultiresLevel *lvl;
+ MultiresColFace *colface;
+ MCol *mcol;
+ int i, j;
+
+ if(!(lvl = me->mr->levels.first))
+ return;
+
+ if(!(colface = lvl->colfaces))
+ return;
+
+ /* older multires format never supported multiple vcol layers,
+ so we can assume the active vcol layer is the correct one */
+ if(!(mcol = CustomData_get_layer(&me->fdata, CD_MCOL)))
+ return;
+
+ for(i = 0; i < me->totface; ++i) {
+ for(j = 0; j < 4; ++j) {
+ mcol[i*4 + j].a = colface[i].col[j].a;
+ mcol[i*4 + j].r = colface[i].col[j].r;
+ mcol[i*4 + j].g = colface[i].col[j].g;
+ mcol[i*4 + j].b = colface[i].col[j].b;
+ }
+ }
+}
+
+/* Copy the first-level face-flag data to the mesh */
+static void multires_load_old_face_flags(Mesh *me)
+{
+ MultiresLevel *lvl;
+ MultiresFace *faces;
+ int i;
+
+ if(!(lvl = me->mr->levels.first))
+ return;
+
+ if(!(faces = lvl->faces))
+ return;
+
+ for(i = 0; i < me->totface; ++i)
+ me->mface[i].flag = faces[i].flag;
+}
void multires_load_old(Object *ob, Mesh *me)
{
@@ -1367,8 +1587,593 @@ void multires_load_old(Object *ob, Mesh *me)
memset(&me->mr->vdata, 0, sizeof(CustomData));
memset(&me->mr->fdata, 0, sizeof(CustomData));
+ multires_load_old_vcols(me);
+ multires_load_old_face_flags(me);
+
/* Remove the old multires */
multires_free(me->mr);
me->mr= NULL;
}
+static void multires_sync_levels(Scene *scene, Object *ob, Object *to_ob)
+{
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+ MultiresModifierData *to_mmd= get_multires_modifier(scene, to_ob, 1);
+
+ if(!mmd) {
+ /* object could have MDISP even when there is no multires modifier
+ this could lead to troubles due to i've got no idea how mdisp could be
+ upsampled correct without modifier data.
+ just remove mdisps if no multires present (nazgul) */
+
+ Mesh *me= (Mesh*)ob->data;
+
+ CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
+ CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ }
+
+ if(!mmd || !to_mmd) return;
+
+ if(mmd->totlvl>to_mmd->totlvl) multires_del_higher(mmd, ob, to_mmd->totlvl);
+ else multires_subdivide(mmd, ob, to_mmd->totlvl, 0, mmd->simple);
+}
+
+static void multires_apply_smat(Scene *scene, Object *ob, float smat[3][3])
+{
+ DerivedMesh *dm= NULL, *cddm= NULL, *subdm= NULL;
+ DMGridData **gridData, **subGridData;
+ Mesh *me= (Mesh*)ob->data;
+ MFace *mface= me->mface;
+ MDisps *mdisps;
+ int *gridOffset;
+ int i, /*numGrids,*/ gridSize, dGridSize, dSkip, totvert;
+ float (*vertCos)[3] = NULL;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+ MultiresModifierData high_mmd;
+
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(!mdisps || !mmd) return;
+
+ /* we need derived mesh created from highest resolution */
+ high_mmd= *mmd;
+ high_mmd.lvl= high_mmd.totlvl;
+
+ /* unscaled multires with applied displacement */
+ subdm= get_multires_dm(scene, &high_mmd, ob);
+
+ /* prepare scaled CDDM to create ccgDN */
+ cddm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
+
+ totvert= cddm->getNumVerts(cddm);
+ vertCos= MEM_mallocN(sizeof(*vertCos) * totvert, "multiresScale vertCos");
+ cddm->getVertCos(cddm, vertCos);
+ for(i=0; i<totvert; i++)
+ mul_m3_v3(smat, vertCos[i]);
+ CDDM_apply_vert_coords(cddm, vertCos);
+ MEM_freeN(vertCos);
+
+ /* scaled ccgDM for tangent space of object with applied scale */
+ dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
+ cddm->release(cddm);
+
+ /*numGrids= dm->getNumGrids(dm);*/ /*UNUSED*/
+ gridSize= dm->getGridSize(dm);
+ gridData= dm->getGridData(dm);
+ gridOffset= dm->getGridOffset(dm);
+ subGridData= subdm->getGridData(subdm);
+
+ dGridSize= multires_side_tot[high_mmd.totlvl];
+ dSkip= (dGridSize-1)/(gridSize-1);
+
+ #pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)
+ for(i = 0; i < me->totface; ++i) {
+ const int numVerts= mface[i].v4 ? 4 : 3;
+ MDisps *mdisp= &mdisps[i];
+ int S, x, y, gIndex = gridOffset[i];
+
+ for(S = 0; S < numVerts; ++S, ++gIndex) {
+ DMGridData *grid= gridData[gIndex];
+ DMGridData *subgrid= subGridData[gIndex];
+ float (*dispgrid)[3]= &mdisp->disps[S*dGridSize*dGridSize];
+
+ for(y = 0; y < gridSize; y++) {
+ for(x = 0; x < gridSize; x++) {
+ float *co= grid[x + y*gridSize].co;
+ float *sco= subgrid[x + y*gridSize].co;
+ float *no= grid[x + y*gridSize].no;
+ float *data= dispgrid[dGridSize*y*dSkip + x*dSkip];
+ float mat[3][3], tx[3], ty[3], disp[3];
+
+ /* construct tangent space matrix */
+ grid_tangent(gridSize, gIndex, x, y, 0, gridData, tx);
+ normalize_v3(tx);
+
+ grid_tangent(gridSize, gIndex, x, y, 1, gridData, ty);
+ normalize_v3(ty);
+
+ column_vectors_to_mat3(mat, tx, ty, no);
+
+ /* scale subgrid coord and calculate displacement */
+ mul_m3_v3(smat, sco);
+ sub_v3_v3v3(disp, sco, co);
+
+ /* convert difference to tangent space */
+ invert_m3(mat);
+ mul_v3_m3v3(data, mat, disp);
+ }
+ }
+ }
+ }
+
+ dm->release(dm);
+ subdm->release(subdm);
+}
+
+int multires_mdisp_corners(MDisps *s)
+{
+ int lvl= 13;
+
+ while(lvl > 0) {
+ int side = (1 << (lvl-1)) + 1;
+ if ((s->totdisp % (side*side)) == 0) return s->totdisp / (side*side);
+ lvl--;
+ }
+
+ return 0;
+}
+
+void multiresModifier_scale_disp(Scene *scene, Object *ob)
+{
+ float smat[3][3];
+
+ /* object's scale matrix */
+ object_scale_to_mat3(ob, smat);
+
+ multires_apply_smat(scene, ob, smat);
+}
+
+void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob)
+{
+ float smat[3][3], tmat[3][3], mat[3][3];
+ multires_sync_levels(scene, ob, to_ob);
+
+ /* construct scale matrix for displacement */
+ object_scale_to_mat3(to_ob, tmat);
+ invert_m3(tmat);
+ object_scale_to_mat3(ob, smat);
+ mul_m3_m3m3(mat, smat, tmat);
+
+ multires_apply_smat(scene, ob, mat);
+}
+
+/* update multires data after topology changing */
+void multires_topology_changed(Scene *scene, Object *ob)
+{
+ Mesh *me= (Mesh*)ob->data;
+ MDisps *mdisp= NULL, *cur= NULL;
+ int i, grid= 0, corners;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
+
+ if(mmd)
+ multires_set_tot_mdisps(me, mmd->totlvl);
+
+ CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+
+ if(!mdisp) return;
+
+ cur= mdisp;
+ for(i = 0; i < me->totface; i++, cur++) {
+ if(mdisp->totdisp) {
+ corners= multires_mdisp_corners(mdisp);
+ grid= mdisp->totdisp / corners;
+
+ break;
+ }
+ }
+
+ for(i = 0; i < me->totface; i++, mdisp++) {
+ int nvert= me->mface[i].v4 ? 4 : 3;
+
+ /* allocate memory for mdisp, the whole disp layer would be erased otherwise */
+ if(!mdisp->totdisp) {
+ if(grid) {
+ mdisp->totdisp= nvert*grid;
+ mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ }
+
+ continue;
+ }
+
+ corners= multires_mdisp_corners(mdisp);
+
+ if(corners!=nvert) {
+ mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
+
+ if(mdisp->disps)
+ MEM_freeN(mdisp->disps);
+
+ mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ }
+ }
+}
+
+/* makes displacement along grid boundary symmetrical */
+void multires_mdisp_smooth_bounds(MDisps *disps)
+{
+ int x, y, side, S, corners;
+ float (*out)[3];
+
+ corners = multires_mdisp_corners(disps);
+ side = sqrt(disps->totdisp / corners);
+
+ out = disps->disps;
+ for(S = 0; S < corners; S++) {
+ for(y = 0; y < side; ++y) {
+ for(x = 0; x < side; ++x, ++out) {
+ float (*dispgrid)[3];
+ float *data;
+
+ if(x != 0 && y != 0) continue;
+
+ if(corners == 4) {
+ if(S == 0) {
+ if(y == 0) {
+ dispgrid = &disps->disps[1*side*side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if (x == 0) {
+ dispgrid = &disps->disps[3 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ } else if (S == 2) {
+ if(y == 0) {
+ dispgrid = &disps->disps[3 * side * side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if(x == 0) {
+ dispgrid = &disps->disps[1 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ }
+ } else if (corners == 3) {
+ if(S == 0) {
+ if(y == 0) {
+ dispgrid = &disps->disps[1*side*side];
+ data = dispgrid[side * x + 0];
+
+ (*out)[0] = (*out)[0] + data[1];
+ (*out)[1] = (*out)[1] - data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = -(*out)[1];
+ data[1] = (*out)[0];
+ data[2] = (*out)[2];
+ } else if (x == 0) {
+ dispgrid = &disps->disps[2 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ } else if (S == 2) {
+ if(x == 0) {
+ dispgrid = &disps->disps[1 * side * side];
+ data = dispgrid[side * 0 + y];
+
+ (*out)[0] = (*out)[0] - data[1];
+ (*out)[1] = (*out)[1] + data[0];
+ (*out)[2] = (*out)[2] + data[2];
+
+ mul_v3_fl(*out, 0.5);
+
+ data[0] = (*out)[1];
+ data[1] = -(*out)[0];
+ data[2] = (*out)[2];
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/***************** Multires interpolation stuff *****************/
+
+static void mdisp_get_crn_rect(int face_side, float crn[3][4][2])
+{
+ float offset = face_side*0.5f - 0.5f;
+ float mid[2];
+
+ mid[0] = offset * 4 / 3;
+ mid[1] = offset * 2 / 3;
+
+ crn[0][0][0] = mid[0]; crn[0][0][1] = mid[1];
+ crn[0][1][0] = offset; crn[0][1][1] = 0;
+ crn[0][2][0] = 0; crn[0][2][1] = 0;
+ crn[0][3][0] = offset; crn[0][3][1] = offset;
+
+ crn[1][0][0] = mid[0]; crn[1][0][1] = mid[1];
+ crn[1][1][0] = offset * 2; crn[1][1][1] = offset;
+ crn[1][2][0] = offset * 2; crn[1][2][1] = 0;
+ crn[1][3][0] = offset; crn[1][3][1] = 0;
+
+ crn[2][0][0] = mid[0]; crn[2][0][1] = mid[1];
+ crn[2][1][0] = offset; crn[2][1][1] = offset;
+ crn[2][2][0] = offset * 2; crn[2][2][1] = offset * 2;
+ crn[2][3][0] = offset * 2; crn[2][3][1] = offset;
+}
+
+static int mdisp_pt_in_crn(float p[2], float crn[4][2])
+{
+ float v[2][2];
+ float a[2][2];
+
+ sub_v2_v2v2(v[0], crn[1], crn[0]);
+ sub_v2_v2v2(v[1], crn[3], crn[0]);
+
+ sub_v2_v2v2(a[0], p, crn[0]);
+ sub_v2_v2v2(a[1], crn[2], crn[0]);
+
+ if(cross_v2v2(a[0], v[0]) * cross_v2v2(a[1], v[0]) < 0)
+ return 0;
+
+ if(cross_v2v2(a[0], v[1]) * cross_v2v2(a[1], v[1]) < 0)
+ return 0;
+
+ return 1;
+}
+
+static void face_to_crn_interp(float u, float v, float v1[2], float v2[2], float v3[2], float v4[2], float *x)
+{
+ float a = (v4[1]-v3[1])*v2[0]+(-v4[1]+v3[1])*v1[0]+(-v2[1]+v1[1])*v4[0]+(v2[1]-v1[1])*v3[0];
+ float b = (v3[1]-v)*v2[0]+(v4[1]-2*v3[1]+v)*v1[0]+(-v4[1]+v3[1]+v2[1]-v1[1])*u+(v4[0]-v3[0])*v-v1[1]*v4[0]+(-v2[1]+2*v1[1])*v3[0];
+ float c = (v3[1]-v)*v1[0]+(-v3[1]+v1[1])*u+v3[0]*v-v1[1]*v3[0];
+ float d = b * b - 4 * a * c;
+ float x1, x2;
+
+ if(a == 0) {
+ *x = -c / b;
+ return;
+ }
+
+ x1 = (-b - sqrtf(d)) / (2 * a);
+ x2 = (-b + sqrtf(d)) / (2 * a);
+
+ *x = maxf(x1, x2);
+}
+
+void mdisp_rot_crn_to_face(const int S, const int corners, const int face_side, const float x, const float y, float *u, float *v)
+{
+ float offset = face_side*0.5f - 0.5f;
+
+ if(corners == 4) {
+ if(S == 1) { *u= offset + x; *v = offset - y; }
+ if(S == 2) { *u= offset + y; *v = offset + x; }
+ if(S == 3) { *u= offset - x; *v = offset + y; }
+ if(S == 0) { *u= offset - y; *v = offset - x; }
+ } else {
+ float crn[3][4][2], vec[4][2];
+ float p[2];
+
+ mdisp_get_crn_rect(face_side, crn);
+
+ interp_v2_v2v2(vec[0], crn[S][0], crn[S][1], x / offset);
+ interp_v2_v2v2(vec[1], crn[S][3], crn[S][2], x / offset);
+ interp_v2_v2v2(vec[2], crn[S][0], crn[S][3], y / offset);
+ interp_v2_v2v2(vec[3], crn[S][1], crn[S][2], y / offset);
+
+ isect_seg_seg_v2_point(vec[0], vec[1], vec[2], vec[3], p);
+
+ (*u) = p[0];
+ (*v) = p[1];
+ }
+}
+
+int mdisp_rot_face_to_crn(const int corners, const int face_side, const float u, const float v, float *x, float *y)
+{
+ const float offset = face_side*0.5f - 0.5f;
+ int S = 0;
+
+ if (corners == 4) {
+ if(u <= offset && v <= offset) S = 0;
+ else if(u > offset && v <= offset) S = 1;
+ else if(u > offset && v > offset) S = 2;
+ else if(u <= offset && v >= offset) S = 3;
+
+ if(S == 0) {
+ *y = offset - u;
+ *x = offset - v;
+ } else if(S == 1) {
+ *x = u - offset;
+ *y = offset - v;
+ } else if(S == 2) {
+ *y = u - offset;
+ *x = v - offset;
+ } else if(S == 3) {
+ *x= offset - u;
+ *y = v - offset;
+ }
+ } else {
+ float crn[3][4][2];
+ float p[2] = {u, v};
+
+ mdisp_get_crn_rect(face_side, crn);
+
+ for (S = 0; S < 3; ++S) {
+ if (mdisp_pt_in_crn(p, crn[S]))
+ break;
+ }
+
+ face_to_crn_interp(u, v, crn[S][0], crn[S][1], crn[S][3], crn[S][2], &p[0]);
+ face_to_crn_interp(u, v, crn[S][0], crn[S][3], crn[S][1], crn[S][2], &p[1]);
+
+ *x = p[0] * offset;
+ *y = p[1] * offset;
+ }
+
+ return S;
+}
+
+void mdisp_apply_weight(const int S, const int corners, int x, int y, const int face_side,
+ float crn_weight[4][2], float *u_r, float *v_r)
+{
+ float u, v, xl, yl;
+ float mid1[2], mid2[2], mid3[2];
+
+ mdisp_rot_crn_to_face(S, corners, face_side, x, y, &u, &v);
+
+ if(corners == 4) {
+ xl = u / (face_side - 1);
+ yl = v / (face_side - 1);
+
+ mid1[0] = crn_weight[0][0] * (1 - xl) + crn_weight[1][0] * xl;
+ mid1[1] = crn_weight[0][1] * (1 - xl) + crn_weight[1][1] * xl;
+ mid2[0] = crn_weight[3][0] * (1 - xl) + crn_weight[2][0] * xl;
+ mid2[1] = crn_weight[3][1] * (1 - xl) + crn_weight[2][1] * xl;
+ mid3[0] = mid1[0] * (1 - yl) + mid2[0] * yl;
+ mid3[1] = mid1[1] * (1 - yl) + mid2[1] * yl;
+ } else {
+ yl = v / (face_side - 1);
+
+ if(v == face_side - 1) xl = 1;
+ else xl = 1 - (face_side - 1 - u) / (face_side - 1 - v);
+
+ mid1[0] = crn_weight[0][0] * (1 - xl) + crn_weight[1][0] * xl;
+ mid1[1] = crn_weight[0][1] * (1 - xl) + crn_weight[1][1] * xl;
+ mid3[0] = mid1[0] * (1 - yl) + crn_weight[2][0] * yl;
+ mid3[1] = mid1[1] * (1 - yl) + crn_weight[2][1] * yl;
+ }
+
+ *u_r = mid3[0];
+ *v_r = mid3[1];
+}
+
+void mdisp_flip_disp(const int S, const int corners, const float axis_x[2], const float axis_y[2], float disp[3])
+{
+ float crn_x[2], crn_y[2];
+ float vx[2], vy[2], coord[2];
+
+ if (corners == 4) {
+ float x[4][2] = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}};
+ float y[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
+
+ copy_v2_v2(crn_x, x[S]);
+ copy_v2_v2(crn_y, y[S]);
+
+ mul_v2_v2fl(vx, crn_x, disp[0]);
+ mul_v2_v2fl(vy, crn_y, disp[1]);
+ add_v2_v2v2(coord, vx, vy);
+
+ project_v2_v2v2(vx, coord, axis_x);
+ project_v2_v2v2(vy, coord, axis_y);
+
+ disp[0] = len_v2(vx);
+ disp[1] = len_v2(vy);
+
+ if(dot_v2v2(vx, axis_x) < 0)
+ disp[0] = -disp[0];
+
+ if(dot_v2v2(vy, axis_y) < 0)
+ disp[1] = -disp[1];
+ } else {
+ /* XXX: it was very overhead code to support displacement flipping
+ for case of tris without visible profit.
+ Maybe its not really big limitation? for now? (nazgul) */
+ disp[0] = 0;
+ disp[1] = 0;
+ }
+}
+
+/* Join two triangular displacements into one quad
+ Corners mapping:
+ 2 -------- 3
+ | \ tri2 |
+ | \ |
+ | tri1 \ |
+ 0 -------- 1 */
+void mdisp_join_tris(MDisps *dst, MDisps *tri1, MDisps *tri2)
+{
+ int side, st;
+ int S, x, y, crn;
+ float face_u, face_v, crn_u, crn_v;
+ float (*out)[3];
+ MDisps *src;
+
+ if(dst->disps)
+ MEM_freeN(dst->disps);
+
+ side = sqrt(tri1->totdisp / 3);
+ st = (side<<1)-1;
+
+ dst->totdisp = 4 * side * side;
+ out = dst->disps = MEM_callocN(3*dst->totdisp*sizeof(float), "join disps");
+
+ for(S = 0; S < 4; S++)
+ for(y = 0; y < side; ++y)
+ for(x = 0; x < side; ++x, ++out) {
+ mdisp_rot_crn_to_face(S, 4, st, x, y, &face_u, &face_v);
+ face_u = st - 1 - face_u;
+
+ if(face_v > face_u) {
+ src = tri2;
+ face_u = st - 1 - face_u;
+ face_v = st - 1 - face_v;
+ } else src = tri1;
+
+ crn = mdisp_rot_face_to_crn(3, st, face_u, face_v, &crn_u, &crn_v);
+
+ old_mdisps_bilinear((*out), &src->disps[crn*side*side], side, crn_u, crn_v);
+ (*out)[0] = 0;
+ (*out)[1] = 0;
+ }
+}
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index b053d615756..df012c47f66 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "DNA_anim_types.h"
@@ -46,7 +47,7 @@
#include "BKE_nla.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "nla_private.h"
@@ -77,7 +78,7 @@ void free_nlastrip (ListBase *strips, NlaStrip *strip)
/* remove reference to action */
if (strip->act)
- strip->act->id.us--;
+ id_us_min(&strip->act->id);
/* free remapping info */
//if (strip->remap)
@@ -159,7 +160,7 @@ NlaStrip *copy_nlastrip (NlaStrip *strip)
/* increase user-count of action */
if (strip_d->act)
- strip_d->act->id.us++;
+ id_us_plus(&strip_d->act->id);
/* copy F-Curves and modifiers */
copy_fcurves(&strip_d->fcurves, &strip->fcurves);
@@ -362,7 +363,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
return strip->end - scale*(cframe - strip->actstart);
}
else if (mode == NLATIME_CONVERT_UNMAP) {
- return strip->actend - (strip->end - cframe) / scale;
+ return (strip->end + (strip->actstart * scale - cframe)) / scale;
}
else /* if (mode == NLATIME_CONVERT_EVAL) */{
if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
@@ -513,7 +514,7 @@ short BKE_nlastrips_has_space (ListBase *strips, float start, float end)
/* if start frame of strip is past the target end-frame, that means that
* we've gone past the window we need to check for, so things are fine
*/
- if (strip->start > end)
+ if (strip->start >= end)
return 1;
/* if the end of the strip is greater than either of the boundaries, the range
@@ -590,7 +591,7 @@ short BKE_nlastrips_add_strip (ListBase *strips, NlaStrip *strip)
/* find the right place to add the strip to the nominated track */
for (ns= strips->first; ns; ns= ns->next) {
/* if current strip occurs after the new strip, add it before */
- if (ns->start > strip->end) {
+ if (ns->start >= strip->end) {
BLI_insertlinkbefore(strips, ns, strip);
not_added= 0;
break;
@@ -682,7 +683,7 @@ void BKE_nlastrips_clear_metastrip (ListBase *strips, NlaStrip *strip)
}
/* free the meta-strip now */
- BLI_freelinkN(strips, strip);
+ free_nlastrip(strips, strip);
}
/* Remove meta-strips (i.e. flatten the list of strips) from the top-level of the list of strips
@@ -916,9 +917,14 @@ void BKE_nlatrack_set_active (ListBase *tracks, NlaTrack *nlt_a)
/* Check if there is any space in the given track to add a strip of the given length */
short BKE_nlatrack_has_space (NlaTrack *nlt, float start, float end)
{
- /* sanity checks */
- if ((nlt == NULL) || IS_EQ(start, end))
+ /* sanity checks
+ * - track must exist
+ * - track must be editable
+ * - bounds cannot be equal (0-length is nasty)
+ */
+ if ((nlt == NULL) || (nlt->flag & NLATRACK_PROTECTED) || IS_EQ(start, end))
return 0;
+
if (start > end) {
puts("BKE_nlatrack_has_space() error... start and end arguments swapped");
SWAP(float, start, end);
@@ -1206,6 +1212,11 @@ void BKE_nlastrip_validate_fcurves (NlaStrip *strip)
/* Sanity Validation ------------------------------------ */
+static int nla_editbone_name_check(void *arg, const char *name)
+{
+ return BLI_ghash_haskey((GHash *)arg, (void *)name);
+}
+
/* Find (and set) a unique name for a strip from the whole AnimData block
* Uses a similar method to the BLI method, but is implemented differently
* as we need to ensure that the name is unique over several lists of tracks,
@@ -1259,28 +1270,8 @@ void BKE_nlastrip_validate_name (AnimData *adt, NlaStrip *strip)
/* if the hash-table has a match for this name, try other names...
* - in an extreme case, it might not be able to find a name, but then everything else in Blender would fail too :)
*/
- if (BLI_ghash_haskey(gh, strip->name)) {
- char tempname[128];
- int number = 1;
- char *dot;
-
- /* Strip off the suffix */
- dot = strrchr(strip->name, '.');
- if (dot) *dot=0;
-
- /* Try different possibilities */
- for (number = 1; number <= 999; number++) {
- /* assemble alternative name */
- BLI_snprintf(tempname, 128, "%s.%03d", strip->name, number);
-
- /* if hash doesn't have this, set it */
- if (BLI_ghash_haskey(gh, tempname) == 0) {
- BLI_strncpy(strip->name, tempname, sizeof(strip->name));
- break;
- }
- }
- }
-
+ BLI_uniquename_cb(nla_editbone_name_check, (void *)gh, "NlaStrip", '.', strip->name, sizeof(strip->name));
+
/* free the hash... */
BLI_ghash_free(gh, NULL, NULL);
}
@@ -1329,7 +1320,7 @@ static void nlastrip_get_endpoint_overlaps (NlaStrip *strip, NlaTrack *track, fl
}
/* Determine auto-blending for the given strip */
-void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls)
+static void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls)
{
float *ps=NULL, *pe=NULL;
float *ns=NULL, *ne=NULL;
@@ -1447,7 +1438,7 @@ void BKE_nla_action_pushdown (AnimData *adt)
/* do other necessary work on strip */
if (strip) {
/* clear reference to action now that we've pushed it onto the stack */
- adt->action->id.us--;
+ id_us_min(&adt->action->id);
adt->action= NULL;
/* if the strip is the first one in the track it lives in, check if there
@@ -1585,7 +1576,7 @@ void BKE_nla_tweakmode_exit (AnimData *adt)
/* Baking Tools ------------------------------------------- */
-void BKE_nla_bake (Scene *scene, ID *id, AnimData *adt, int flag)
+static void BKE_nla_bake (Scene *scene, ID *UNUSED(id), AnimData *adt, int UNUSED(flag))
{
/* verify that data is valid
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index eb09ecf2e6e..53bac9171ae 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,25 +27,34 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <Python.h>
#endif
+#include "MEM_guardedalloc.h"
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <limits.h>
#include "DNA_anim_types.h"
+#include "DNA_action_types.h"
+#include "DNA_node_types.h"
+
+#include "BLI_listbase.h"
#include "RNA_access.h"
+#include "BKE_animsys.h"
+#include "BKE_action.h"
#include "BKE_fcurve.h"
-#include "BKE_animsys.h" /* BKE_free_animdata only */
-
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+#include "BKE_node.h"
#include "PIL_time.h"
-
#include "CMP_node.h"
#include "intern/CMP_util.h" /* stupid include path... */
@@ -62,22 +71,14 @@ ListBase node_all_textures = {NULL, NULL};
/* ************** Type stuff ********** */
-static bNodeType *node_get_type(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
+static bNodeType *node_get_type(bNodeTree *ntree, int type, ID *id)
{
- if(type==NODE_GROUP) {
- if(ngroup && GS(ngroup->id.name)==ID_NT) {
- return ngroup->owntype;
- }
- return NULL;
- }
- else {
- bNodeType *ntype = ntree->alltypes.first;
- for(; ntype; ntype= ntype->next)
- if(ntype->type==type && id==ntype->id )
- return ntype;
-
- return NULL;
- }
+ bNodeType *ntype = ntree->alltypes.first;
+ for(; ntype; ntype= ntype->next)
+ if(ntype->type==type && id==ntype->id )
+ return ntype;
+
+ return NULL;
}
void ntreeInitTypes(bNodeTree *ntree)
@@ -100,11 +101,11 @@ void ntreeInitTypes(bNodeTree *ntree)
if(node->type==NODE_DYNAMIC) {
bNodeType *stype= NULL;
if(node->id==NULL) { /* empty script node */
- stype= node_get_type(ntree, node->type, NULL, NULL);
+ stype= node_get_type(ntree, node->type, NULL);
} else { /* not an empty script node */
- stype= node_get_type(ntree, node->type, NULL, node->id);
+ stype= node_get_type(ntree, node->type, node->id);
if(!stype) {
- stype= node_get_type(ntree, node->type, NULL, NULL);
+ stype= node_get_type(ntree, node->type, NULL);
/* needed info if the pynode script fails now: */
if (node->id) node->storage= ntree;
} else {
@@ -116,7 +117,7 @@ void ntreeInitTypes(bNodeTree *ntree)
if(node->typeinfo)
node->typeinfo->initfunc(node);
} else {
- node->typeinfo= node_get_type(ntree, node->type, (bNodeTree *)node->id, NULL);
+ node->typeinfo= node_get_type(ntree, node->type, NULL);
}
if(node->typeinfo==NULL) {
@@ -150,9 +151,6 @@ static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
else sock->limit= stype->limit;
sock->type= stype->type;
- sock->to_index= stype->own_index;
- sock->tosock= stype->internsock;
-
sock->ns.vec[0]= stype->val1;
sock->ns.vec[1]= stype->val2;
sock->ns.vec[2]= stype->val3;
@@ -166,6 +164,30 @@ static bNodeSocket *node_add_socket_type(ListBase *lb, bNodeSocketType *stype)
return sock;
}
+static bNodeSocket *node_add_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+ bNodeSocket *sock= MEM_callocN(sizeof(bNodeSocket), "sock");
+
+ /* make a copy of the group socket */
+ *sock = *gsock;
+ sock->link = NULL;
+ sock->next = sock->prev = NULL;
+ sock->new_sock = NULL;
+ sock->ns.data = NULL;
+
+ sock->own_index = gsock->own_index;
+ sock->groupsock = gsock;
+ /* XXX hack: group socket input/output roles are inverted internally,
+ * need to change the limit value when making actual node sockets from them.
+ */
+ sock->limit = (gsock->limit==1 ? 0xFFF : 1);
+
+ if(lb)
+ BLI_addtail(lb, sock);
+
+ return sock;
+}
+
static void node_rem_socket(bNodeTree *ntree, ListBase *lb, bNodeSocket *sock)
{
bNodeLink *link, *next;
@@ -186,18 +208,16 @@ static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype)
bNodeSocket *sock;
for(sock= lb->first; sock; sock= sock->next) {
- /* both indices are zero for non-groups, otherwise it's a unique index */
- if(sock->to_index==stype->own_index)
- if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
- break;
+ if(strncmp(sock->name, stype->name, NODE_MAXSTR)==0)
+ break;
}
if(sock) {
sock->type= stype->type; /* in future, read this from tydefs! */
if(stype->limit==0) sock->limit= 0xFFF;
else sock->limit= stype->limit;
+
sock->ns.min= stype->min;
sock->ns.max= stype->max;
- sock->tosock= stype->internsock;
BLI_remlink(lb, sock);
@@ -208,6 +228,37 @@ static bNodeSocket *verify_socket(ListBase *lb, bNodeSocketType *stype)
}
}
+static bNodeSocket *verify_group_socket(ListBase *lb, bNodeSocket *gsock)
+{
+ bNodeSocket *sock;
+
+ for(sock= lb->first; sock; sock= sock->next) {
+ if(sock->own_index==gsock->own_index)
+ break;
+ }
+ if(sock) {
+ sock->groupsock = gsock;
+
+ strcpy(sock->name, gsock->name);
+ sock->type= gsock->type;
+
+ /* XXX hack: group socket input/output roles are inverted internally,
+ * need to change the limit value when making actual node sockets from them.
+ */
+ sock->limit = (gsock->limit==1 ? 0xFFF : 1);
+
+ sock->ns.min= gsock->ns.min;
+ sock->ns.max= gsock->ns.max;
+
+ BLI_remlink(lb, sock);
+
+ return sock;
+ }
+ else {
+ return node_add_group_socket(NULL, gsock);
+ }
+}
+
static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *stype_first)
{
bNodeSocketType *stype;
@@ -236,15 +287,41 @@ static void verify_socket_list(bNodeTree *ntree, ListBase *lb, bNodeSocketType *
}
}
-void nodeVerifyType(bNodeTree *ntree, bNode *node)
+static void verify_group_socket_list(bNodeTree *ntree, ListBase *lb, ListBase *glb)
{
- bNodeType *ntype= node->typeinfo;
+ bNodeSocket *gsock;
- if(ntype) {
- /* might add some other verify stuff here */
-
- verify_socket_list(ntree, &node->inputs, ntype->inputs);
- verify_socket_list(ntree, &node->outputs, ntype->outputs);
+ /* step by step compare */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ /* abusing new_sock pointer for verification here! only used inside this function */
+ gsock->new_sock= verify_group_socket(lb, gsock);
+ }
+ /* leftovers are removed */
+ while(lb->first)
+ node_rem_socket(ntree, lb, lb->first);
+ /* and we put back the verified sockets */
+ for (gsock= glb->first; gsock; gsock=gsock->next) {
+ BLI_addtail(lb, gsock->new_sock);
+ gsock->new_sock = NULL;
+ }
+}
+
+void nodeVerifyType(bNodeTree *ntree, bNode *node)
+{
+ /* node groups don't have static sock lists, but use external sockets from the tree instead */
+ if (node->type==NODE_GROUP) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ if (ngroup) {
+ verify_group_socket_list(ntree, &node->inputs, &ngroup->inputs);
+ verify_group_socket_list(ntree, &node->outputs, &ngroup->outputs);
+ }
+ }
+ else {
+ bNodeType *ntype= node->typeinfo;
+ if(ntype) {
+ verify_socket_list(ntree, &node->inputs, ntype->inputs);
+ verify_socket_list(ntree, &node->outputs, ntype->outputs);
+ }
}
}
@@ -263,193 +340,38 @@ void ntreeVerifyTypes(bNodeTree *ntree)
/* ************** Group stuff ********** */
-bNodeType node_group_typeinfo= {
- /* next,prev */ NULL, NULL,
- /* type code */ NODE_GROUP,
- /* name */ "Group",
- /* width+range */ 120, 60, 200,
- /* class+opts */ NODE_CLASS_GROUP, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ NULL,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
-/* tag internal sockets */
-static void group_tag_internal_sockets(bNodeTree *ngroup)
-{
- bNode *node;
- bNodeSocket *sock;
- bNodeLink *link;
-
- /* clear intern tag, but check already for hidden sockets */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->intern= sock->flag & SOCK_HIDDEN;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->intern= sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL);
- }
- /* set tag */
- for(link= ngroup->links.first; link; link= link->next) {
- link->fromsock->intern= 1;
- link->tosock->intern= 1;
- }
-
- /* remove link pointer to external links (only happens on create group) */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->intern==0)
- sock->link= NULL;
- }
+/* XXX group typeinfo struct is used directly in ntreeMakeOwnType, needs cleanup */
+static bNodeType ntype_group;
- /* set all intern sockets to own_index zero, makes sure that later use won't mixup */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->intern)
- sock->own_index= 0;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(sock->intern)
- sock->own_index= 0;
- }
-}
-
-/* after editing group, new sockets are zero */
-/* this routine ensures unique identifiers for zero sockets that are exposed */
-static void group_verify_own_indices(bNodeTree *ngroup)
+/* groups display their internal tree name as label */
+static const char *group_label(bNode *node)
{
- bNode *node;
- bNodeSocket *sock;
-
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->own_index==0 && sock->intern==0)
- sock->own_index= ++(ngroup->cur_index);
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(sock->own_index==0 && sock->intern==0)
- sock->own_index= ++(ngroup->cur_index);
- }
- //printf("internal index %d\n", ngroup->cur_index);
+ return node->id->name+2;
}
-
-/* nodetrees can be used as groups, so we need typeinfo structs generated */
-void ntreeMakeOwnType(bNodeTree *ngroup)
+void register_node_type_group(ListBase *lb)
{
- bNode *node;
- bNodeSocket *sock;
- int totin= 0, totout=0, a;
-
- /* tags socket when internal linked */
- group_tag_internal_sockets(ngroup);
-
- /* ensure all sockets have own unique id */
- group_verify_own_indices(ngroup);
-
- /* counting stats */
- for(node= ngroup->nodes.first; node; node= node->next) {
- if(node->type==NODE_GROUP)
- break;
- for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->intern==0)
- totin++;
- for(sock= node->outputs.first; sock; sock= sock->next)
- if(sock->intern==0)
- totout++;
- }
- /* debug: nodetrees in nodetrees not handled yet */
- if(node) {
- printf("group in group, not supported yet\n");
- return;
- }
-
- /* free own type struct */
- if(ngroup->owntype) {
- if(ngroup->owntype->inputs)
- MEM_freeN(ngroup->owntype->inputs);
- if(ngroup->owntype->outputs)
- MEM_freeN(ngroup->owntype->outputs);
- MEM_freeN(ngroup->owntype);
- }
-
- /* make own type struct */
- ngroup->owntype= MEM_callocN(sizeof(bNodeType), "group type");
- *ngroup->owntype= node_group_typeinfo; /* copy data, for init */
-
- /* input type arrays */
- if(totin) {
- bNodeSocketType *stype;
- bNodeSocketType *inputs= MEM_callocN(sizeof(bNodeSocketType)*(totin+1), "bNodeSocketType");
- a= 0;
-
- for(node= ngroup->nodes.first; node; node= node->next) {
- /* nodes are presumed fully verified, stype and socket list are in sync */
- stype= node->typeinfo->inputs;
- for(sock= node->inputs.first; sock; sock= sock->next, stype++) {
- if(sock->intern==0) {
- /* debug only print */
- if(stype==NULL || stype->type==-1) printf("group verification error %s\n", ngroup->id.name);
-
- inputs[a]= *stype;
- inputs[a].own_index= sock->own_index;
- inputs[a].internsock= sock;
- a++;
- }
- }
- }
- inputs[a].type= -1; /* terminator code */
- ngroup->owntype->inputs= inputs;
- }
-
- /* output type arrays */
- if(totout) {
- bNodeSocketType *stype;
- bNodeSocketType *outputs= MEM_callocN(sizeof(bNodeSocketType)*(totout+1), "bNodeSocketType");
- a= 0;
-
- for(node= ngroup->nodes.first; node; node= node->next) {
- /* nodes are presumed fully verified, stype and socket list are in sync */
- stype= node->typeinfo->outputs;
- for(sock= node->outputs.first; sock; sock= sock->next, stype++) {
- if(sock->intern==0) {
- /* debug only print */
- if(stype==NULL || stype->type==-1) printf("group verification error %s\n", ngroup->id.name);
-
- outputs[a]= *stype;
- outputs[a].own_index= sock->own_index;
- outputs[a].internsock= sock;
- a++;
- }
- }
- }
- outputs[a].type= -1; /* terminator code */
- ngroup->owntype->outputs= outputs;
- }
+ node_type_base(&ntype_group, NODE_GROUP, "Group", NODE_CLASS_GROUP, NODE_OPTIONS, NULL, NULL);
+ node_type_size(&ntype_group, 120, 60, 200);
+ node_type_label(&ntype_group, group_label);
- /* voila, the nodetree has the full definition for generating group-node instances! */
+ nodeRegisterType(lb, &ntype_group);
}
-
-static bNodeSocket *groupnode_find_tosock(bNode *gnode, int index)
+static bNodeSocket *find_group_node_input(bNode *gnode, bNodeSocket *gsock)
{
bNodeSocket *sock;
-
- for(sock= gnode->inputs.first; sock; sock= sock->next)
- if(sock->to_index==index)
+ for (sock=gnode->inputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
return sock;
return NULL;
}
-static bNodeSocket *groupnode_find_fromsock(bNode *gnode, int index)
+static bNodeSocket *find_group_node_output(bNode *gnode, bNodeSocket *gsock)
{
bNodeSocket *sock;
-
- for(sock= gnode->outputs.first; sock; sock= sock->next)
- if(sock->to_index==index)
+ for (sock=gnode->outputs.first; sock; sock=sock->next)
+ if (sock->groupsock == gsock)
return sock;
return NULL;
}
@@ -458,8 +380,9 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
{
bNodeLink *link, *linkn;
bNode *node, *gnode, *nextn;
- bNodeSocket *sock;
bNodeTree *ngroup;
+ bNodeSocket *gsock;
+ ListBase anim_basepaths = {NULL, NULL};
float min[2], max[2];
int totnode=0;
@@ -481,9 +404,9 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
/* check if all connections are OK, no unselected node has both
inputs and outputs to a selection */
for(link= ntree->links.first; link; link= link->next) {
- if(link->fromnode->flag & NODE_SELECT)
+ if(link->fromnode && link->tonode && link->fromnode->flag & NODE_SELECT)
link->tonode->done |= 1;
- if(link->tonode->flag & NODE_SELECT)
+ if(link->fromnode && link->tonode && link->tonode->flag & NODE_SELECT)
link->fromnode->done |= 2;
}
@@ -496,41 +419,50 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
return NULL;
/* OK! new nodetree */
- ngroup= alloc_libblock(&G.main->nodetree, ID_NT, "NodeGroup");
- ngroup->type= ntree->type;
- ngroup->alltypes= ntree->alltypes;
+ ngroup= ntreeAddTree("NodeGroup", ntree->type, TRUE);
/* move nodes over */
for(node= ntree->nodes.first; node; node= nextn) {
nextn= node->next;
if(node->flag & NODE_SELECT) {
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (ntree->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* change node-collection membership */
BLI_remlink(&ntree->nodes, node);
BLI_addtail(&ngroup->nodes, node);
+
node->locx-= 0.5f*(min[0]+max[0]);
node->locy-= 0.5f*(min[1]+max[1]);
-
- /* set socket own_index to zero since it can still have a value
- * from being in a group before, otherwise it doesn't get a unique
- * index in group_verify_own_indices */
- for(sock= node->inputs.first; sock; sock= sock->next)
- sock->own_index= 0;
- for(sock= node->outputs.first; sock; sock= sock->next)
- sock->own_index= 0;
}
}
- /* move links over */
- for(link= ntree->links.first; link; link= linkn) {
- linkn= link->next;
- if(link->fromnode->flag & link->tonode->flag & NODE_SELECT) {
- BLI_remlink(&ntree->links, link);
- BLI_addtail(&ngroup->links, link);
+ /* move animation data over */
+ if (ntree->adt) {
+ LinkData *ld, *ldn=NULL;
+
+ BKE_animdata_separate_by_basepath(&ntree->id, &ngroup->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
}
}
- /* now we can make own group typeinfo */
- ntreeMakeOwnType(ngroup);
-
/* make group node */
gnode= nodeAddNodeType(ntree, NODE_GROUP, ngroup, NULL);
gnode->locx= 0.5f*(min[0]+max[0]);
@@ -540,35 +472,29 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
for(link= ntree->links.first; link; link= linkn) {
linkn= link->next;
- if(link->tonode->flag & NODE_SELECT) {
- link->tonode= gnode;
- sock= groupnode_find_tosock(gnode, link->tosock->own_index);
- if(sock==NULL) {
- nodeRemLink(ntree, link);
- printf("Removed link, cannot mix internal and external sockets in group\n");
- }
- else link->tosock= sock;
+ if(link->fromnode && link->tonode && (link->fromnode->flag & link->tonode->flag & NODE_SELECT)) {
+ BLI_remlink(&ntree->links, link);
+ BLI_addtail(&ngroup->links, link);
}
- else if(link->fromnode->flag & NODE_SELECT) {
- link->fromnode= gnode;
- sock= groupnode_find_fromsock(gnode, link->fromsock->own_index);
- if(sock==NULL) {
- nodeRemLink(ntree, link);
- printf("Removed link, cannot mix internal and external sockets in group\n");
- }
- else link->fromsock= sock;
+ else if(link->tonode && (link->tonode->flag & NODE_SELECT)) {
+ gsock = nodeGroupExposeSocket(ngroup, link->tosock, SOCK_IN);
+ link->tosock->link = nodeAddLink(ngroup, NULL, gsock, link->tonode, link->tosock);
+ link->tosock = node_add_group_socket(&gnode->inputs, gsock);
+ link->tonode = gnode;
}
- }
-
- /* initialize variables of unused input sockets */
- for(node= ngroup->nodes.first; node; node= node->next) {
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->intern==0) {
- bNodeSocket *nsock= groupnode_find_tosock(gnode, sock->own_index);
- if(nsock) {
- QUATCOPY(nsock->ns.vec, sock->ns.vec);
- }
+ else if(link->fromnode && (link->fromnode->flag & NODE_SELECT)) {
+ /* search for existing group node socket */
+ for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next)
+ if (gsock->link && gsock->link->fromsock==link->fromsock)
+ break;
+ if (!gsock) {
+ gsock = nodeGroupExposeSocket(ngroup, link->fromsock, SOCK_OUT);
+ gsock->link = nodeAddLink(ngroup, link->fromnode, link->fromsock, NULL, gsock);
+ link->fromsock = node_add_group_socket(&gnode->outputs, gsock);
}
+ else
+ link->fromsock = find_group_node_output(gnode, gsock);
+ link->fromnode = gnode;
}
}
@@ -578,35 +504,21 @@ bNode *nodeMakeGroupFromSelected(bNodeTree *ntree)
return gnode;
}
-/* note: ungroup: group_indices zero! */
-
/* here's a nasty little one, need to check users... */
/* should become callbackable... */
-void nodeVerifyGroup(bNodeTree *ngroup)
+void nodeGroupVerify(bNodeTree *ngroup)
{
-
/* group changed, so we rebuild the type definition */
- ntreeMakeOwnType(ngroup);
+// ntreeMakeGroupSockets(ngroup);
if(ngroup->type==NTREE_SHADER) {
Material *ma;
for(ma= G.main->mat.first; ma; ma= ma->id.next) {
if(ma->nodetree) {
bNode *node;
-
- /* find if group is in tree */
for(node= ma->nodetree->nodes.first; node; node= node->next)
if(node->id == (ID *)ngroup)
- break;
-
- if(node) {
- /* set all type pointers OK */
- ntreeInitTypes(ma->nodetree);
-
- for(node= ma->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(ma->nodetree, node);
- }
+ nodeVerifyType(ma->nodetree, node);
}
}
}
@@ -615,20 +527,9 @@ void nodeVerifyGroup(bNodeTree *ngroup)
for(sce= G.main->scene.first; sce; sce= sce->id.next) {
if(sce->nodetree) {
bNode *node;
-
- /* find if group is in tree */
for(node= sce->nodetree->nodes.first; node; node= node->next)
if(node->id == (ID *)ngroup)
- break;
-
- if(node) {
- /* set all type pointers OK */
- ntreeInitTypes(sce->nodetree);
-
- for(node= sce->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(sce->nodetree, node);
- }
+ nodeVerifyType(sce->nodetree, node);
}
}
}
@@ -637,20 +538,9 @@ void nodeVerifyGroup(bNodeTree *ngroup)
for(tx= G.main->tex.first; tx; tx= tx->id.next) {
if(tx->nodetree) {
bNode *node;
-
- /* find if group is in tree */
for(node= tx->nodetree->nodes.first; node; node= node->next)
if(node->id == (ID *)ngroup)
- break;
-
- if(node) {
- /* set all type pointers OK */
- ntreeInitTypes(tx->nodetree);
-
- for(node= tx->nodetree->nodes.first; node; node= node->next)
- if(node->id == (ID *)ngroup)
- nodeVerifyType(tx->nodetree, node);
- }
+ nodeVerifyType(tx->nodetree, node);
}
}
}
@@ -677,15 +567,15 @@ void nodeGroupSocketUseFlags(bNodeTree *ngroup)
for(ma= G.main->mat.first; ma; ma= ma->id.next) {
if(ma->nodetree) {
for(node= ma->nodetree->nodes.first; node; node= node->next) {
- if(node->id==(ID *)ngroup) {
+ if(node->id==&ngroup->id) {
for(sock= node->inputs.first; sock; sock= sock->next)
if(sock->link)
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
for(sock= node->outputs.first; sock; sock= sock->next)
if(nodeCountSocketLinks(ma->nodetree, sock))
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
}
}
}
@@ -699,12 +589,12 @@ void nodeGroupSocketUseFlags(bNodeTree *ngroup)
if(node->id==(ID *)ngroup) {
for(sock= node->inputs.first; sock; sock= sock->next)
if(sock->link)
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
for(sock= node->outputs.first; sock; sock= sock->next)
if(nodeCountSocketLinks(sce->nodetree, sock))
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
}
}
}
@@ -718,12 +608,12 @@ void nodeGroupSocketUseFlags(bNodeTree *ngroup)
if(node->id==(ID *)ngroup) {
for(sock= node->inputs.first; sock; sock= sock->next)
if(sock->link)
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
for(sock= node->outputs.first; sock; sock= sock->next)
if(nodeCountSocketLinks(tx->nodetree, sock))
- if(sock->tosock)
- sock->tosock->flag |= SOCK_IN_USE;
+ if(sock->groupsock)
+ sock->groupsock->flag |= SOCK_IN_USE;
}
}
}
@@ -738,21 +628,27 @@ bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
}
/* finds a node based on given socket */
-int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex)
+int nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **nodep, int *sockindex, int *in_out)
{
bNode *node;
bNodeSocket *tsock;
int index= 0;
for(node= ntree->nodes.first; node; node= node->next) {
- for(index=0, tsock= node->inputs.first; tsock; tsock= tsock->next, index++)
- if(tsock==sock)
+ for(index=0, tsock= node->inputs.first; tsock; tsock= tsock->next, index++) {
+ if(tsock==sock) {
+ if (in_out) *in_out= SOCK_IN;
break;
+ }
+ }
if(tsock)
break;
- for(index=0, tsock= node->outputs.first; tsock; tsock= tsock->next, index++)
- if(tsock==sock)
+ for(index=0, tsock= node->outputs.first; tsock; tsock= tsock->next, index++) {
+ if(tsock==sock) {
+ if (in_out) *in_out= SOCK_OUT;
break;
+ }
+ }
if(tsock)
break;
}
@@ -773,7 +669,7 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
bNodeLink *link, *linkn;
bNode *node, *nextn;
bNodeTree *ngroup, *wgroup;
- int index;
+ ListBase anim_basepaths = {NULL, NULL};
ngroup= (bNodeTree *)gnode->id;
if(ngroup==NULL) return 0;
@@ -781,98 +677,261 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
/* clear new pointers, set in copytree */
for(node= ntree->nodes.first; node; node= node->next)
node->new_node= NULL;
-
- wgroup= ntreeCopyTree(ngroup, 0);
+
+ /* wgroup is a temporary copy of the NodeTree we're merging in
+ * - all of wgroup's nodes are transferred across to their new home
+ * - ngroup (i.e. the source NodeTree) is left unscathed
+ */
+ wgroup= ntreeCopyTree(ngroup);
/* add the nodes into the ntree */
for(node= wgroup->nodes.first; node; node= nextn) {
nextn= node->next;
+
+ /* keep track of this node's RNA "base" path (the part of the pat identifying the node)
+ * if the old nodetree has animation data which potentially covers this node
+ */
+ if (wgroup->adt) {
+ PointerRNA ptr;
+ char *path;
+
+ RNA_pointer_create(&wgroup->id, &RNA_Node, node, &ptr);
+ path = RNA_path_from_ID_to_struct(&ptr);
+
+ if (path)
+ BLI_addtail(&anim_basepaths, BLI_genericNodeN(path));
+ }
+
+ /* migrate node */
BLI_remlink(&wgroup->nodes, node);
BLI_addtail(&ntree->nodes, node);
+
node->locx+= gnode->locx;
node->locy+= gnode->locy;
+
node->flag |= NODE_SELECT;
}
- /* and the internal links */
- for(link= wgroup->links.first; link; link= linkn) {
- linkn= link->next;
- BLI_remlink(&wgroup->links, link);
- BLI_addtail(&ntree->links, link);
- }
-
- /* restore links to and from the gnode */
+
+ /* restore external links to and from the gnode */
for(link= ntree->links.first; link; link= link->next) {
- if(link->tonode==gnode) {
- /* link->tosock->tosock is on the node we look for */
- nodeFindNode(ngroup, link->tosock->tosock, &nextn, &index);
- if(nextn==NULL) printf("wrong stuff!\n");
- else if(nextn->new_node==NULL) printf("wrong stuff too!\n");
- else {
- link->tonode= nextn->new_node;
- link->tosock= BLI_findlink(&link->tonode->inputs, index);
+ if (link->fromnode==gnode) {
+ if (link->fromsock->groupsock) {
+ bNodeSocket *gsock= link->fromsock->groupsock;
+ if (gsock->link) {
+ if (gsock->link->fromnode) {
+ /* NB: using the new internal copies here! the groupsock pointer still maps to the old tree */
+ link->fromnode = (gsock->link->fromnode ? gsock->link->fromnode->new_node : NULL);
+ link->fromsock = gsock->link->fromsock->new_sock;
+ }
+ else {
+ /* group output directly maps to group input */
+ bNodeSocket *insock= find_group_node_input(gnode, gsock->link->fromsock);
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
+ }
+ }
+ else {
+ /* constant group output: copy the stack value to the external socket.
+ * the link is kept here until all possible external users have been fixed.
+ */
+ QUATCOPY(link->tosock->ns.vec, gsock->ns.vec);
+ }
}
}
- else if(link->fromnode==gnode) {
- /* link->fromsock->tosock is on the node we look for */
- nodeFindNode(ngroup, link->fromsock->tosock, &nextn, &index);
- if(nextn==NULL) printf("1 wrong stuff!\n");
- else if(nextn->new_node==NULL) printf("1 wrong stuff too!\n");
+ }
+ /* remove internal output links, these are not used anymore */
+ for(link=wgroup->links.first; link; link= linkn) {
+ linkn = link->next;
+ if (!link->tonode)
+ nodeRemLink(wgroup, link);
+ }
+ /* restore links from internal nodes */
+ for(link= wgroup->links.first; link; link= link->next) {
+ /* indicates link to group input */
+ if (!link->fromnode) {
+ /* NB: can't use find_group_node_input here,
+ * because gnode sockets still point to the old tree!
+ */
+ bNodeSocket *insock;
+ for (insock= gnode->inputs.first; insock; insock= insock->next)
+ if (insock->groupsock->new_sock == link->fromsock)
+ break;
+ if (insock->link) {
+ link->fromnode = insock->link->fromnode;
+ link->fromsock = insock->link->fromsock;
+ }
else {
- link->fromnode= nextn->new_node;
- link->fromsock= BLI_findlink(&link->fromnode->outputs, index);
+ /* uses group constant input. copy the input value and remove the dead link. */
+ QUATCOPY(link->tosock->ns.vec, insock->ns.vec);
+ nodeRemLink(wgroup, link);
}
}
}
- /* remove the gnode & work tree */
- free_libblock(&G.main->nodetree, wgroup);
+ /* add internal links to the ntree */
+ for(link= wgroup->links.first; link; link= linkn) {
+ linkn= link->next;
+ BLI_remlink(&wgroup->links, link);
+ BLI_addtail(&ntree->links, link);
+ }
+
+ /* and copy across the animation */
+ if (wgroup->adt) {
+ LinkData *ld, *ldn=NULL;
+ bAction *waction;
+
+ /* firstly, wgroup needs to temporary dummy action that can be destroyed, as it shares copies */
+ waction = wgroup->adt->action = copy_action(wgroup->adt->action);
+
+ /* now perform the moving */
+ BKE_animdata_separate_by_basepath(&wgroup->id, &ntree->id, &anim_basepaths);
+
+ /* paths + their wrappers need to be freed */
+ for (ld = anim_basepaths.first; ld; ld = ldn) {
+ ldn = ld->next;
+
+ MEM_freeN(ld->data);
+ BLI_freelinkN(&anim_basepaths, ld);
+ }
+
+ /* free temp action too */
+ free_libblock(&G.main->action, waction);
+ }
+ /* delete the group instance. this also removes old input links! */
nodeFreeNode(ntree, gnode);
+ /* free the group tree (takes care of user count) */
+ free_libblock(&G.main->nodetree, wgroup);
+
/* solve order goes fine, but the level tags not... doing it twice works for now. solve this once */
+ /* XXX is this still necessary with new groups? it may have been caused by non-updated sock->link pointers. lukas */
ntreeSolveOrder(ntree);
ntreeSolveOrder(ntree);
return 1;
}
-void nodeCopyGroup(bNode *gnode)
+void nodeGroupCopy(bNode *gnode)
{
bNodeSocket *sock;
gnode->id->us--;
- gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id, 0);
+ gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id);
/* new_sock was set in nodeCopyNode */
for(sock=gnode->inputs.first; sock; sock=sock->next)
- if(sock->tosock)
- sock->tosock= sock->tosock->new_sock;
+ if(sock->groupsock)
+ sock->groupsock= sock->groupsock->new_sock;
for(sock=gnode->outputs.first; sock; sock=sock->next)
- if(sock->tosock)
- sock->tosock= sock->tosock->new_sock;
+ if(sock->groupsock)
+ sock->groupsock= sock->groupsock->new_sock;
+}
+
+bNodeSocket *nodeGroupAddSocket(bNodeTree *ngroup, const char *name, int type, int in_out)
+{
+ bNodeSocket *gsock = MEM_callocN(sizeof(bNodeSocket), "bNodeSocket");
+
+ strncpy(gsock->name, name, sizeof(gsock->name));
+ gsock->type = type;
+ gsock->ns.sockettype = type;
+ gsock->ns.min = INT_MIN;
+ gsock->ns.max = INT_MAX;
+ zero_v4(gsock->ns.vec);
+ gsock->ns.data = NULL;
+ gsock->flag = 0;
+
+ gsock->next = gsock->prev = NULL;
+ gsock->new_sock = NULL;
+ gsock->link = NULL;
+ gsock->ns.data = NULL;
+ /* assign new unique index */
+ gsock->own_index = ngroup->cur_index++;
+ gsock->limit = (in_out==SOCK_IN ? 0xFFF : 1);
+
+ BLI_addtail(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, gsock);
+
+ return gsock;
+}
+
+bNodeSocket *nodeGroupExposeSocket(bNodeTree *ngroup, bNodeSocket *sock, int in_out)
+{
+ bNodeSocket *gsock= nodeGroupAddSocket(ngroup, sock->name, sock->type, in_out);
+ /* initialize the default socket value */
+ QUATCOPY(gsock->ns.vec, sock->ns.vec);
+ return gsock;
+}
+
+void nodeGroupExposeAllSockets(bNodeTree *ngroup)
+{
+ bNode *node;
+ bNodeSocket *sock, *gsock;
+
+ for (node=ngroup->nodes.first; node; node=node->next) {
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ if (!sock->link && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_IN);
+ /* initialize the default socket value */
+ QUATCOPY(gsock->ns.vec, sock->ns.vec);
+ sock->link = nodeAddLink(ngroup, NULL, gsock, node, sock);
+ }
+ }
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ if (nodeCountSocketLinks(ngroup, sock)==0 && !(sock->flag & SOCK_HIDDEN)) {
+ gsock = nodeGroupAddSocket(ngroup, sock->name, sock->type, SOCK_OUT);
+ /* initialize the default socket value */
+ QUATCOPY(gsock->ns.vec, sock->ns.vec);
+ gsock->link = nodeAddLink(ngroup, node, sock, NULL, gsock);
+ }
+ }
+ }
+}
+
+void nodeGroupRemoveSocket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
+{
+ nodeRemSocketLinks(ngroup, gsock);
+ switch (in_out) {
+ case SOCK_IN: BLI_remlink(&ngroup->inputs, gsock); break;
+ case SOCK_OUT: BLI_remlink(&ngroup->outputs, gsock); break;
+ }
}
/* ************** Add stuff ********** */
void nodeAddSockets(bNode *node, bNodeType *ntype)
{
- bNodeSocketType *stype;
-
- if(ntype->inputs) {
- stype= ntype->inputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->inputs, stype);
- stype++;
+ if (node->type==NODE_GROUP) {
+ bNodeTree *ntree= (bNodeTree*)node->id;
+ if (ntree) {
+ bNodeSocket *gsock;
+ for (gsock=ntree->inputs.first; gsock; gsock=gsock->next)
+ node_add_group_socket(&node->inputs, gsock);
+ for (gsock=ntree->outputs.first; gsock; gsock=gsock->next)
+ node_add_group_socket(&node->outputs, gsock);
}
}
- if(ntype->outputs) {
- stype= ntype->outputs;
- while(stype->type != -1) {
- node_add_socket_type(&node->outputs, stype);
- stype++;
+ else {
+ bNodeSocketType *stype;
+
+ if(ntype->inputs) {
+ stype= ntype->inputs;
+ while(stype->type != -1) {
+ node_add_socket_type(&node->inputs, stype);
+ stype++;
+ }
+ }
+ if(ntype->outputs) {
+ stype= ntype->outputs;
+ while(stype->type != -1) {
+ node_add_socket_type(&node->outputs, stype);
+ stype++;
+ }
}
}
}
+
/* Find the first available, non-duplicate name for a given node */
void nodeUniqueName(bNodeTree *ntree, bNode *node)
{
@@ -884,6 +943,11 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
bNode *node= NULL;
bNodeType *ntype= NULL;
+ if (ngroup && BLI_findindex(&G.main->nodetree, ngroup)==-1) {
+ printf("nodeAddNodeType() error: '%s' not in main->nodetree\n", ngroup->id.name);
+ return NULL;
+ }
+
if(type>=NODE_DYNAMIC_MENU) {
int a=0, idx= type-NODE_DYNAMIC_MENU;
ntype= ntree->alltypes.first;
@@ -896,7 +960,7 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup, ID *id)
ntype= ntype->next;
}
} else
- ntype= node_get_type(ntree, type, ngroup, id);
+ ntype= node_get_type(ntree, type, id);
node= MEM_callocN(sizeof(bNode), "new node");
BLI_addtail(&ntree->nodes, node);
@@ -960,7 +1024,7 @@ void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype)
/* keep socket listorder identical, for copying links */
/* ntree is the target tree */
-bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
+bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
{
bNode *nnode= MEM_callocN(sizeof(bNode), "dupli node");
bNodeSocket *sock, *oldsock;
@@ -974,15 +1038,11 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
oldsock= node->inputs.first;
for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
oldsock->new_sock= sock;
- if(internal)
- sock->own_index= 0;
}
BLI_duplicatelist(&nnode->outputs, &node->outputs);
oldsock= node->outputs.first;
for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
- if(internal)
- sock->own_index= 0;
sock->stack_index= 0;
sock->ns.data= NULL;
oldsock->new_sock= sock;
@@ -1000,15 +1060,61 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
return nnode;
}
+/* fromsock and tosock can be NULL */
+/* also used via rna api, so we check for proper input output direction */
bNodeLink *nodeAddLink(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
{
- bNodeLink *link= MEM_callocN(sizeof(bNodeLink), "link");
+ bNodeSocket *sock;
+ bNodeLink *link= NULL;
+ int from= 0, to= 0;
- BLI_addtail(&ntree->links, link);
- link->fromnode= fromnode;
- link->fromsock= fromsock;
- link->tonode= tonode;
- link->tosock= tosock;
+ if(fromnode) {
+ /* test valid input */
+ for(sock= fromnode->outputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= 1; /* OK */
+ else {
+ for(sock= fromnode->inputs.first; sock; sock= sock->next)
+ if(sock==fromsock)
+ break;
+ if(sock)
+ from= -1; /* OK but flip */
+ }
+ }
+ if(tonode) {
+ for(sock= tonode->inputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= 1; /* OK */
+ else {
+ for(sock= tonode->outputs.first; sock; sock= sock->next)
+ if(sock==tosock)
+ break;
+ if(sock)
+ to= -1; /* OK but flip */
+ }
+ }
+
+ /* this allows NULL sockets to work */
+ if(from >= 0 && to >= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= fromnode;
+ link->fromsock= fromsock;
+ link->tonode= tonode;
+ link->tosock= tosock;
+ }
+ else if(from <= 0 && to <= 0) {
+ link= MEM_callocN(sizeof(bNodeLink), "link");
+ BLI_addtail(&ntree->links, link);
+ link->fromnode= tonode;
+ link->fromsock= tosock;
+ link->tonode= fromnode;
+ link->tosock= fromsock;
+ }
return link;
}
@@ -1034,104 +1140,83 @@ void nodeRemSocketLinks(bNodeTree *ntree, bNodeSocket *sock)
}
-bNodeTree *ntreeAddTree(int type)
+bNodeTree *ntreeAddTree(const char *name, int type, const short is_group)
{
- bNodeTree *ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
+ bNodeTree *ntree;
+
+ if (is_group)
+ ntree= alloc_libblock(&G.main->nodetree, ID_NT, name);
+ else {
+ ntree= MEM_callocN(sizeof(bNodeTree), "new node tree");
+ *( (short *)ntree->id.name )= ID_NT; /* not "type", as that is ntree->type */
+ BLI_strncpy(ntree->id.name+2, name, sizeof(ntree->id.name));
+ }
+
ntree->type= type;
ntree->alltypes.first = NULL;
ntree->alltypes.last = NULL;
- /* this helps RNA identify ID pointers as nodetree */
- if(ntree->type==NTREE_SHADER)
- BLI_strncpy(ntree->id.name, "NTShader Nodetree", sizeof(ntree->id.name));
- else if(ntree->type==NTREE_COMPOSIT)
- BLI_strncpy(ntree->id.name, "NTCompositing Nodetree", sizeof(ntree->id.name));
- else if(ntree->type==NTREE_TEXTURE)
- BLI_strncpy(ntree->id.name, "NTTexture Nodetree", sizeof(ntree->id.name));
-
ntreeInitTypes(ntree);
return ntree;
}
/* Warning: this function gets called during some rather unexpected times
- * - internal_select is only 1 when used for duplicating selected nodes (i.e. Shift-D duplicate operator)
* - this gets called when executing compositing updates (for threaded previews)
* - when the nodetree datablock needs to be copied (i.e. when users get copied)
* - for scene duplication use ntreeSwapID() after so we dont have stale pointers.
*/
-bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
+bNodeTree *ntreeCopyTree(bNodeTree *ntree)
{
bNodeTree *newtree;
bNode *node, *nnode, *last;
- bNodeLink *link, *nlink;
- bNodeSocket *sock;
- int a;
+ bNodeLink *link;
+ bNodeSocket *gsock, *oldgsock;
if(ntree==NULL) return NULL;
- if(internal_select==0) {
- /* is ntree part of library? */
- for(newtree=G.main->nodetree.first; newtree; newtree= newtree->id.next)
- if(newtree==ntree) break;
- if(newtree) {
- newtree= copy_libblock(ntree);
- } else {
- newtree= MEM_dupallocN(ntree);
- copy_libblock_data(&newtree->id, &ntree->id); /* copy animdata and ID props */
- }
- newtree->nodes.first= newtree->nodes.last= NULL;
- newtree->links.first= newtree->links.last= NULL;
+ /* is ntree part of library? */
+ for(newtree=G.main->nodetree.first; newtree; newtree= newtree->id.next)
+ if(newtree==ntree) break;
+ if(newtree) {
+ newtree= copy_libblock(ntree);
+ } else {
+ newtree= MEM_dupallocN(ntree);
+ copy_libblock_data(&newtree->id, &ntree->id, TRUE); /* copy animdata and ID props */
}
- else
- newtree= ntree;
+ newtree->nodes.first= newtree->nodes.last= NULL;
+ newtree->links.first= newtree->links.last= NULL;
- last= ntree->nodes.last;
+ last = ntree->nodes.last;
for(node= ntree->nodes.first; node; node= node->next) {
-
node->new_node= NULL;
- if(internal_select==0 || (node->flag & NODE_SELECT)) {
- nnode= nodeCopyNode(newtree, node, internal_select); /* sets node->new */
- if(internal_select) {
- node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
- nnode->flag |= NODE_SELECT;
- }
- }
+ nnode= nodeCopyNode(newtree, node); /* sets node->new */
if(node==last) break;
}
- /* check for copying links */
- for(link= ntree->links.first; link; link= link->next) {
- if(link->fromnode==NULL || link->tonode==NULL);
- else if(link->fromnode->new_node && link->tonode->new_node) {
- nlink= nodeAddLink(newtree, link->fromnode->new_node, NULL, link->tonode->new_node, NULL);
- /* sockets were copied in order */
- for(a=0, sock= link->fromnode->outputs.first; sock; sock= sock->next, a++) {
- if(sock==link->fromsock)
- break;
- }
- nlink->fromsock= BLI_findlink(&link->fromnode->new_node->outputs, a);
-
- for(a=0, sock= link->tonode->inputs.first; sock; sock= sock->next, a++) {
- if(sock==link->tosock)
- break;
- }
- nlink->tosock= BLI_findlink(&link->tonode->new_node->inputs, a);
- }
+ /* socket definition for group usage */
+ BLI_duplicatelist(&newtree->inputs, &ntree->inputs);
+ for(gsock= newtree->inputs.first, oldgsock= ntree->inputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
+ oldgsock->new_sock= gsock;
+ gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
}
- /* own type definition for group usage */
- if(internal_select==0) {
- if(ntree->owntype) {
- newtree->owntype= MEM_dupallocN(ntree->owntype);
- if(ntree->owntype->inputs)
- newtree->owntype->inputs= MEM_dupallocN(ntree->owntype->inputs);
- if(ntree->owntype->outputs)
- newtree->owntype->outputs= MEM_dupallocN(ntree->owntype->outputs);
- }
+ BLI_duplicatelist(&newtree->outputs, &ntree->outputs);
+ for(gsock= newtree->outputs.first, oldgsock= ntree->outputs.first; gsock; gsock=gsock->next, oldgsock=oldgsock->next) {
+ oldgsock->new_sock= gsock;
+ gsock->groupsock = (oldgsock->groupsock ? oldgsock->groupsock->new_sock : NULL);
+ }
+
+ /* copy links */
+ BLI_duplicatelist(&newtree->links, &ntree->links);
+ for(link= newtree->links.first; link; link= link->next) {
+ link->fromnode = (link->fromnode ? link->fromnode->new_node : NULL);
+ link->fromsock = (link->fromsock ? link->fromsock->new_sock : NULL);
+ link->tonode = (link->tonode ? link->tonode->new_node : NULL);
+ link->tosock = (link->tosock ? link->tosock->new_sock : NULL);
+ /* update the link socket's pointer */
+ if (link->tosock)
+ link->tosock->link = link;
}
- /* weird this is required... there seem to be link pointers wrong still? */
- /* anyhoo, doing this solves crashes on copying entire tree (copy scene) and delete nodes */
- ntreeSolveOrder(newtree);
return newtree;
}
@@ -1182,12 +1267,11 @@ static void node_init_preview(bNode *node, int xsize, int ysize)
}
if(node->preview->rect==NULL) {
- node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(float)*4, "node preview rect");
+ node->preview->rect= MEM_callocN(4*xsize + xsize*ysize*sizeof(char)*4, "node preview rect");
node->preview->xsize= xsize;
node->preview->ysize= ysize;
}
- else
- memset(node->preview->rect, 0, 4*xsize + xsize*ysize*sizeof(float)*4);
+ /* no clear, makes nicer previews */
}
void ntreeInitPreview(bNodeTree *ntree, int xsize, int ysize)
@@ -1237,12 +1321,18 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y)
if(x>=0 && y>=0) {
if(x<preview->xsize && y<preview->ysize) {
unsigned char *tar= preview->rect+ 4*((preview->xsize*y) + x);
- //if(tar[0]==0.0f) {
- tar[0]= FTOCHAR(col[0]);
- tar[1]= FTOCHAR(col[1]);
- tar[2]= FTOCHAR(col[2]);
+
+ if(TRUE) {
+ tar[0]= FTOCHAR(linearrgb_to_srgb(col[0]));
+ tar[1]= FTOCHAR(linearrgb_to_srgb(col[1]));
+ tar[2]= FTOCHAR(linearrgb_to_srgb(col[2]));
+ }
+ else {
+ tar[0]= FTOCHAR(col[0]);
+ tar[1]= FTOCHAR(col[1]);
+ tar[2]= FTOCHAR(col[2]);
+ }
tar[3]= FTOCHAR(col[3]);
- //}
}
//else printf("prv out bound x y %d %d\n", x, y);
}
@@ -1265,7 +1355,8 @@ void nodeUnlinkNode(bNodeTree *ntree, bNode *node)
if(link->fromnode==node) {
lb= &node->outputs;
- NodeTagChanged(ntree, link->tonode);
+ if (link->tonode)
+ NodeTagChanged(ntree, link->tonode);
}
else if(link->tonode==node)
lb= &node->inputs;
@@ -1335,13 +1426,8 @@ void ntreeFreeTree(bNodeTree *ntree)
nodeFreeNode(ntree, node);
}
- if(ntree->owntype) {
- if(ntree->owntype->inputs)
- MEM_freeN(ntree->owntype->inputs);
- if(ntree->owntype->outputs)
- MEM_freeN(ntree->owntype->outputs);
- MEM_freeN(ntree->owntype);
- }
+ BLI_freelistN(&ntree->inputs);
+ BLI_freelistN(&ntree->outputs);
}
void ntreeFreeCache(bNodeTree *ntree)
@@ -1367,9 +1453,9 @@ void ntreeMakeLocal(bNodeTree *ntree)
if(ntree->id.lib==NULL) return;
if(ntree->id.us==1) {
- ntree->id.lib= 0;
+ ntree->id.lib= NULL;
ntree->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ntree, 0);
+ new_id(NULL, (ID *)ntree, NULL);
return;
}
@@ -1427,11 +1513,11 @@ void ntreeMakeLocal(bNodeTree *ntree)
if(local && lib==0) {
ntree->id.lib= NULL;
ntree->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ntree, 0);
+ new_id(NULL, (ID *)ntree, NULL);
}
else if(local && lib) {
/* this is the mixed case, we copy the tree and assign it to local users */
- bNodeTree *newtree= ntreeCopyTree(ntree, 0);
+ bNodeTree *newtree= ntreeCopyTree(ntree);
newtree->id.us= 0;
@@ -1675,7 +1761,7 @@ static int node_recurs_check(bNode *node, bNode ***nsort, int level)
if(sock->link) {
has_inputlinks= 1;
fromnode= sock->link->fromnode;
- if(fromnode->done==0) {
+ if(fromnode && fromnode->done==0) {
fromnode->level= node_recurs_check(fromnode, nsort, level);
}
}
@@ -1690,6 +1776,59 @@ static int node_recurs_check(bNode *node, bNode ***nsort, int level)
return 0xFFF;
}
+
+static void ntreeSetOutput(bNodeTree *ntree)
+{
+ bNode *node;
+
+ /* find the active outputs, might become tree type dependant handler */
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+ bNode *tnode;
+ int output= 0;
+
+ /* we need a check for which output node should be tagged like this, below an exception */
+ if(node->type==CMP_NODE_OUTPUT_FILE)
+ continue;
+
+ /* there is more types having output class, each one is checked */
+ for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
+ if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
+
+ if(ntree->type==NTREE_COMPOSIT) {
+
+ /* same type, exception for viewer */
+ if(tnode->type==node->type ||
+ (ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
+ ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ else {
+ /* same type */
+ if(tnode->type==node->type) {
+ if(tnode->flag & NODE_DO_OUTPUT) {
+ output++;
+ if(output>1)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+ }
+ }
+ }
+ }
+ }
+ if(output==0)
+ node->flag |= NODE_DO_OUTPUT;
+ }
+ }
+
+ /* here we could recursively set which nodes have to be done,
+ might be different for editor or for "real" use... */
+}
+
void ntreeSolveOrder(bNodeTree *ntree)
{
bNode *node, **nodesort, **nsort;
@@ -1708,6 +1847,9 @@ void ntreeSolveOrder(bNodeTree *ntree)
for(sock= node->inputs.first; sock; sock= sock->next)
sock->link= NULL;
}
+ /* clear group socket links */
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ sock->link= NULL;
if(totnode==0)
return;
@@ -1738,38 +1880,11 @@ void ntreeSolveOrder(bNodeTree *ntree)
}
MEM_freeN(nodesort);
-
- /* find the active outputs, might become tree type dependant handler */
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- bNode *tnode;
- int output= 0;
-
- /* we need a check for which output node should be tagged like this, below an exception */
- if(node->type==CMP_NODE_OUTPUT_FILE)
- continue;
-
- /* there is more types having output class, each one is checked */
- for(tnode= ntree->nodes.first; tnode; tnode= tnode->next) {
- if(tnode->typeinfo->nclass==NODE_CLASS_OUTPUT) {
- if(tnode->type==node->type) {
- if(tnode->flag & NODE_DO_OUTPUT) {
- output++;
- if(output>1)
- tnode->flag &= ~NODE_DO_OUTPUT;
- }
- }
- }
- }
- if(output==0)
- node->flag |= NODE_DO_OUTPUT;
- }
- }
-
- /* here we could recursively set which nodes have to be done,
- might be different for editor or for "real" use... */
+
+ ntreeSetOutput(ntree);
}
+
/* Should be callback! */
/* Do not call execs here */
void NodeTagChanged(bNodeTree *ntree, bNode *node)
@@ -1787,51 +1902,65 @@ void NodeTagChanged(bNodeTree *ntree, bNode *node)
}
}
-void NodeTagIDChanged(bNodeTree *ntree, ID *id)
+int NodeTagIDChanged(bNodeTree *ntree, ID *id)
{
- if(id==NULL)
- return;
+ int change = FALSE;
+
+ if(ELEM(NULL, id, ntree))
+ return change;
if(ntree->type==NTREE_COMPOSIT) {
bNode *node;
- for(node= ntree->nodes.first; node; node= node->next)
- if(node->id==id)
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->id==id) {
+ change= TRUE;
NodeTagChanged(ntree, node);
+ }
+ }
}
+
+ return change;
}
/* ******************* executing ************* */
+/* for a given socket, find the actual stack entry */
+static bNodeStack *get_socket_stack(bNodeStack *stack, bNodeSocket *sock, bNodeStack **gin)
+{
+ switch (sock->stack_type) {
+ case SOCK_STACK_LOCAL:
+ return stack + sock->stack_index;
+ case SOCK_STACK_EXTERN:
+ return (gin ? gin[sock->stack_index] : NULL);
+ case SOCK_STACK_CONST:
+ return sock->stack_ptr;
+ }
+ return NULL;
+}
+
/* see notes at ntreeBeginExecTree */
-static void group_node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out, bNodeStack **gin, bNodeStack **gout)
+static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out, bNodeStack **gin)
{
bNodeSocket *sock;
/* build pointer stack */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->intern) {
- /* yep, intern can have link or is hidden socket */
- if(sock->link)
- *(in++)= stack + sock->link->fromsock->stack_index;
- else
- *(in++)= &sock->ns;
+ if (in) {
+ for(sock= node->inputs.first; sock; sock= sock->next) {
+ *(in++) = get_socket_stack(stack, sock, gin);
}
- else
- *(in++)= gin[sock->stack_index_ext];
}
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->intern)
- *(out++)= stack + sock->stack_index;
- else
- *(out++)= gout[sock->stack_index_ext];
+ if (out) {
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ *(out++) = get_socket_stack(stack, sock, gin);
+ }
}
}
-static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNodeStack **in, bNodeStack **out)
+static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNodeStack **in)
{
bNode *node;
bNodeTree *ntree= (bNodeTree *)gnode->id;
@@ -1844,7 +1973,7 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod
for(node= ntree->nodes.first; node; node= node->next) {
if(node->typeinfo->execfunc) {
- group_node_get_stack(node, stack, nsin, nsout, in, out);
+ node_get_stack(node, stack, nsin, nsout, in);
/* for groups, only execute outputs for edited group */
if(node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
@@ -1856,19 +1985,27 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod
}
}
- /* free internal group output nodes */
- if(ntree->type==NTREE_COMPOSIT) {
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->typeinfo->execfunc) {
- bNodeSocket *sock;
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- if(sock->intern) {
- bNodeStack *ns= stack + sock->stack_index;
- if(ns->data) {
- free_compbuf(ns->data);
- ns->data= NULL;
- }
+ /* free internal buffers */
+ if (ntree->type==NTREE_COMPOSIT) {
+ bNodeSocket *sock;
+ bNodeStack *ns;
+ for (sock=ntree->outputs.first; sock; sock=sock->next) {
+ /* use the hasoutput flag to tag external sockets */
+ if (sock->stack_type==SOCK_STACK_LOCAL) {
+ ns= get_socket_stack(stack, sock, in);
+ ns->hasoutput = 0;
+ }
+ }
+ /* now free all stacks that are not used from outside */
+ for (node=ntree->nodes.first; node; node=node->next) {
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ if (sock->stack_type==SOCK_STACK_LOCAL ) {
+ ns= get_socket_stack(stack, sock, in);
+ if (ns->hasoutput!=0 && ns->data) {
+ free_compbuf(ns->data);
+ ns->data = NULL;
+ /* reset the flag */
+ ns->hasoutput = 1;
}
}
}
@@ -1876,37 +2013,134 @@ static void node_group_execute(bNodeStack *stack, void *data, bNode *gnode, bNod
}
}
+static int set_stack_indexes_default(bNode *node, int index)
+{
+ bNodeSocket *sock;
+
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ if (sock->link && sock->link->fromsock) {
+ sock->stack_type = sock->link->fromsock->stack_type;
+ sock->stack_index = sock->link->fromsock->stack_index;
+ sock->stack_ptr = sock->link->fromsock->stack_ptr;
+ }
+ else {
+ sock->stack_type = SOCK_STACK_CONST;
+ sock->stack_index = -1;
+ sock->stack_ptr = &sock->ns;
+ }
+ }
+
+ for (sock=node->outputs.first; sock; sock=sock->next) {
+ sock->stack_type = SOCK_STACK_LOCAL;
+ sock->stack_index = index++;
+ sock->stack_ptr = NULL;
+ }
+
+ return index;
+}
+
+static int ntree_begin_exec_tree(bNodeTree *ntree);
+static int set_stack_indexes_group(bNode *node, int index)
+{
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ bNodeSocket *sock;
+
+ if((ngroup->init & NTREE_TYPE_INIT)==0)
+ ntreeInitTypes(ngroup);
+
+ node->stack_index = index;
+ index += ntree_begin_exec_tree(ngroup);
+
+ for (sock=node->inputs.first; sock; sock=sock->next) {
+ if (sock->link && sock->link->fromsock) {
+ sock->stack_type = sock->link->fromsock->stack_type;
+ sock->stack_index = sock->link->fromsock->stack_index;
+ sock->stack_ptr = sock->link->fromsock->stack_ptr;
+ }
+ else {
+ sock->stack_type = SOCK_STACK_CONST;
+ sock->stack_index = -1;
+ sock->stack_ptr = &sock->ns;
+ }
+ }
+
+ /* identify group node outputs from internal group sockets */
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ if (sock->groupsock) {
+ bNodeSocket *insock, *gsock = sock->groupsock;
+ switch (gsock->stack_type) {
+ case SOCK_STACK_EXTERN:
+ /* extern stack is resolved for this group node instance */
+ insock= find_group_node_input(node, gsock->link->fromsock);
+ sock->stack_type = insock->stack_type;
+ sock->stack_index = insock->stack_index;
+ sock->stack_ptr = insock->stack_ptr;
+ break;
+ case SOCK_STACK_LOCAL:
+ sock->stack_type = SOCK_STACK_LOCAL;
+ /* local stack index must be offset by group node instance */
+ sock->stack_index = gsock->stack_index + node->stack_index;
+ sock->stack_ptr = NULL;
+ break;
+ case SOCK_STACK_CONST:
+ sock->stack_type = SOCK_STACK_CONST;
+ sock->stack_index = -1;
+ sock->stack_ptr = gsock->stack_ptr;
+ break;
+ }
+ }
+ else {
+ sock->stack_type = SOCK_STACK_LOCAL;
+ sock->stack_index = index++;
+ sock->stack_ptr = NULL;
+ }
+ }
+
+ return index;
+}
+
/* recursively called for groups */
/* we set all trees on own local indices, but put a total counter
in the groups, so each instance of a group has own stack */
static int ntree_begin_exec_tree(bNodeTree *ntree)
{
bNode *node;
- bNodeSocket *sock;
- int index= 0, index_in= 0, index_out= 0;
+ bNodeSocket *gsock;
+ int index= 0, i;
if((ntree->init & NTREE_TYPE_INIT)==0)
ntreeInitTypes(ntree);
+ /* group inputs are numbered 0..totinputs, so external stack can easily be addressed */
+ i = 0;
+ for(gsock=ntree->inputs.first; gsock; gsock = gsock->next) {
+ gsock->stack_type = SOCK_STACK_EXTERN;
+ gsock->stack_index = i++;
+ gsock->stack_ptr = NULL;
+ }
+
/* create indices for stack, check preview */
for(node= ntree->nodes.first; node; node= node->next) {
-
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->intern==0)
- sock->stack_index_ext= index_in++;
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- sock->stack_index= index++;
- if(sock->intern==0)
- sock->stack_index_ext= index_out++;
+ /* XXX can this be done by a generic one-for-all function?
+ * otherwise should use node-type callback.
+ */
+ if(node->type==NODE_GROUP)
+ index = set_stack_indexes_group(node, index);
+ else
+ index = set_stack_indexes_default(node, index);
+ }
+
+ /* group outputs */
+ for(gsock=ntree->outputs.first; gsock; gsock = gsock->next) {
+ if (gsock->link && gsock->link->fromsock) {
+ gsock->stack_type = gsock->link->fromsock->stack_type;
+ gsock->stack_index = gsock->link->fromsock->stack_index;
+ gsock->stack_ptr = gsock->link->fromsock->stack_ptr;
}
-
- if(node->type==NODE_GROUP) {
- if(node->id) {
- node->stack_index= index;
- index+= ntree_begin_exec_tree((bNodeTree *)node->id);
- }
+ else {
+ gsock->stack_type = SOCK_STACK_CONST;
+ gsock->stack_index = -1;
+ gsock->stack_ptr = &gsock->ns;
}
}
@@ -1914,7 +2148,7 @@ static int ntree_begin_exec_tree(bNodeTree *ntree)
}
/* copy socket compbufs to stack, initialize usage of curve nodes */
-static void composit_begin_exec(bNodeTree *ntree, int is_group)
+static void composit_begin_exec(bNodeTree *ntree, bNodeStack *stack)
{
bNode *node;
bNodeSocket *sock;
@@ -1924,16 +2158,14 @@ static void composit_begin_exec(bNodeTree *ntree, int is_group)
/* initialize needed for groups */
node->exec= 0;
- if(is_group==0) {
- for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= ntree->stack + sock->stack_index;
-
- if(sock->ns.data) {
- ns->data= sock->ns.data;
- sock->ns.data= NULL;
- }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns= get_socket_stack(stack, sock, NULL);
+ if(ns && sock->ns.data) {
+ ns->data= sock->ns.data;
+ sock->ns.data= NULL;
}
}
+
/* cannot initialize them while using in threads */
if(ELEM4(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT)) {
curvemapping_initialize(node->storage);
@@ -1941,75 +2173,60 @@ static void composit_begin_exec(bNodeTree *ntree, int is_group)
curvemapping_premultiply(node->storage, 0);
}
if(node->type==NODE_GROUP)
- composit_begin_exec((bNodeTree *)node->id, 1);
+ composit_begin_exec((bNodeTree *)node->id, stack + node->stack_index);
}
}
/* copy stack compbufs to sockets */
-static void composit_end_exec(bNodeTree *ntree, int is_group)
+static void composit_end_exec(bNodeTree *ntree, bNodeStack *stack)
{
- extern void print_compbuf(char *str, struct CompBuf *cbuf);
bNode *node;
bNodeStack *ns;
- int a;
for(node= ntree->nodes.first; node; node= node->next) {
- if(is_group==0) {
- bNodeSocket *sock;
+ bNodeSocket *sock;
- for(sock= node->outputs.first; sock; sock= sock->next) {
- ns= ntree->stack + sock->stack_index;
- if(ns->data) {
- sock->ns.data= ns->data;
- ns->data= NULL;
- }
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ ns = get_socket_stack(stack, sock, NULL);
+ if(ns && ns->data) {
+ sock->ns.data= ns->data;
+ ns->data= NULL;
}
}
+
if(node->type==CMP_NODE_CURVE_RGB)
curvemapping_premultiply(node->storage, 1);
if(node->type==NODE_GROUP)
- composit_end_exec((bNodeTree *)node->id, 1);
+ composit_end_exec((bNodeTree *)node->id, stack + node->stack_index);
node->need_exec= 0;
}
-
- if(is_group==0) {
- /* internally, group buffers are not stored */
- for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) {
- if(ns->data) {
- printf("freed leftover buffer from stack\n");
- free_compbuf(ns->data);
- ns->data= NULL;
- }
- }
- }
}
-static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack)
+static void group_tag_used_outputs(bNode *gnode, bNodeStack *stack, bNodeStack **gin)
{
bNodeTree *ntree= (bNodeTree *)gnode->id;
bNode *node;
+ bNodeSocket *sock;
stack+= gnode->stack_index;
for(node= ntree->nodes.first; node; node= node->next) {
if(node->typeinfo->execfunc) {
- bNodeSocket *sock;
-
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->intern) {
- if(sock->link) {
- bNodeStack *ns= stack + sock->link->fromsock->stack_index;
- ns->hasoutput= 1;
- ns->sockettype= sock->link->fromsock->type;
- }
- else
- sock->ns.sockettype= sock->type;
- }
+ bNodeStack *ns = get_socket_stack(stack, sock, gin);
+ ns->hasoutput= 1;
}
}
+
+ /* set stack types (for local stack entries) */
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ bNodeStack *ns = get_socket_stack(stack, sock, NULL);
+ if (ns)
+ ns->sockettype = sock->type;
+ }
}
}
@@ -2067,6 +2284,8 @@ static void tex_end_exec(bNodeTree *ntree)
void ntreeBeginExecTree(bNodeTree *ntree)
{
+ bNodeStack *nsin[MAX_SOCKET]; /* arbitrary... watch this */
+
/* let's make it sure */
if(ntree->init & NTREE_EXEC_INIT)
return;
@@ -2098,13 +2317,9 @@ void ntreeBeginExecTree(bNodeTree *ntree)
node->need_exec= 1;
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link) {
- ns= ntree->stack + sock->link->fromsock->stack_index;
- ns->hasoutput= 1;
- ns->sockettype= sock->link->fromsock->type;
- }
- else
- sock->ns.sockettype= sock->type;
+ ns = get_socket_stack(ntree->stack, sock, NULL);
+ if (ns)
+ ns->hasoutput = 1;
if(sock->link) {
bNodeLink *link= sock->link;
@@ -2118,13 +2333,21 @@ void ntreeBeginExecTree(bNodeTree *ntree)
}
}
- if(node->type==NODE_GROUP && node->id)
- group_tag_used_outputs(node, ntree->stack);
+ /* set stack types (for local stack entries) */
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+ ns = get_socket_stack(ntree->stack, sock, NULL);
+ if (ns)
+ ns->sockettype = sock->type;
+ }
+ if(node->type==NODE_GROUP && node->id) {
+ node_get_stack(node, ntree->stack, nsin, NULL, NULL);
+ group_tag_used_outputs(node, ntree->stack, nsin);
+ }
}
if(ntree->type==NTREE_COMPOSIT)
- composit_begin_exec(ntree, 0);
+ composit_begin_exec(ntree, ntree->stack);
}
ntree->init |= NTREE_EXEC_INIT;
@@ -2132,14 +2355,24 @@ void ntreeBeginExecTree(bNodeTree *ntree)
void ntreeEndExecTree(bNodeTree *ntree)
{
+ bNodeStack *ns;
if(ntree->init & NTREE_EXEC_INIT) {
bNodeThreadStack *nts;
int a;
/* another callback candidate! */
- if(ntree->type==NTREE_COMPOSIT)
- composit_end_exec(ntree, 0);
+ if(ntree->type==NTREE_COMPOSIT) {
+ composit_end_exec(ntree, ntree->stack);
+
+ for(ns= ntree->stack, a=0; a<ntree->stacksize; a++, ns++) {
+ if(ns->data) {
+ printf("freed leftover buffer from stack\n");
+ free_compbuf(ns->data);
+ ns->data= NULL;
+ }
+ }
+ }
else if(ntree->type==NTREE_TEXTURE)
tex_end_exec(ntree);
@@ -2163,23 +2396,6 @@ void ntreeEndExecTree(bNodeTree *ntree)
}
}
-static void node_get_stack(bNode *node, bNodeStack *stack, bNodeStack **in, bNodeStack **out)
-{
- bNodeSocket *sock;
-
- /* build pointer stack */
- for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link)
- *(in++)= stack + sock->link->fromsock->stack_index;
- else
- *(in++)= &sock->ns;
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
- *(out++)= stack + sock->stack_index;
- }
-}
-
/* nodes are presorted, so exec is in order of list */
void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
{
@@ -2192,7 +2408,7 @@ void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
/* only when initialized */
if((ntree->init & NTREE_EXEC_INIT)==0)
ntreeBeginExecTree(ntree);
-
+
/* composite does 1 node per thread, so no multiple stacks needed */
if(ntree->type==NTREE_COMPOSIT) {
stack= ntree->stack;
@@ -2205,12 +2421,12 @@ void ntreeExecTree(bNodeTree *ntree, void *callerdata, int thread)
for(node= ntree->nodes.first; node; node= node->next) {
if(node->need_exec) {
if(node->typeinfo->execfunc) {
- node_get_stack(node, stack, nsin, nsout);
+ node_get_stack(node, stack, nsin, nsout, NULL);
node->typeinfo->execfunc(callerdata, node, nsin, nsout);
}
else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, nsout);
- node_group_execute(stack, callerdata, node, nsin, nsout);
+ node_get_stack(node, stack, nsin, NULL, NULL);
+ node_group_execute(stack, callerdata, node, nsin);
}
}
}
@@ -2256,7 +2472,7 @@ static void *exec_composite_node(void *node_v)
bNode *node= node_v;
ThreadData *thd= (ThreadData *)node->threaddata;
- node_get_stack(node, thd->stack, nsin, nsout);
+ node_get_stack(node, thd->stack, nsin, nsout, NULL);
if((node->flag & NODE_MUTED) && (!node_only_value(node))) {
/* viewers we execute, for feedback to user */
@@ -2269,11 +2485,11 @@ static void *exec_composite_node(void *node_v)
node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
}
else if(node->type==NODE_GROUP && node->id) {
- node_group_execute(thd->stack, thd->rd, node, nsin, nsout);
+ node_group_execute(thd->stack, thd->rd, node, nsin);
}
node->exec |= NODE_READY;
- return 0;
+ return NULL;
}
/* return total of executable nodes, for timecursor */
@@ -2297,7 +2513,7 @@ static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd)
for(node= ntree->nodes.first; node; node= node->next) {
int a;
- node_get_stack(node, thd->stack, nsin, nsout);
+ node_get_stack(node, thd->stack, nsin, nsout, NULL);
/* test the outputs */
/* skip value-only nodes (should be in type!) */
@@ -2362,7 +2578,7 @@ static int setExecutableNodes(bNodeTree *ntree, ThreadData *thd)
for(node= ntree->nodes.first; node; node= node->next) {
if(node->need_exec==0 && node_only_value(node)) {
if(node->typeinfo->execfunc) {
- node_get_stack(node, thd->stack, nsin, nsout);
+ node_get_stack(node, thd->stack, nsin, nsout, NULL);
node->typeinfo->execfunc(thd->rd, node, nsin, nsout);
}
}
@@ -2400,8 +2616,8 @@ static void freeExecutableNode(bNodeTree *ntree)
for(node= ntree->nodes.first; node; node= node->next) {
if(node->exec & NODE_FREEBUFS) {
for(sock= node->outputs.first; sock; sock= sock->next) {
- bNodeStack *ns= ntree->stack + sock->stack_index;
- if(ns->data) {
+ bNodeStack *ns= get_socket_stack(ntree->stack, sock, NULL);
+ if(ns && ns->data) {
free_compbuf(ns->data);
ns->data= NULL;
// printf("freed buf node %s \n", node->name);
@@ -2421,7 +2637,7 @@ static bNode *getExecutableNode(bNodeTree *ntree)
/* input sockets should be ready */
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link)
+ if(sock->link && sock->link->fromnode)
if((sock->link->fromnode->exec & NODE_READY)==0)
break;
}
@@ -2432,6 +2648,25 @@ static bNode *getExecutableNode(bNodeTree *ntree)
return NULL;
}
+/* check if texture nodes need exec or end */
+static void ntree_composite_texnode(bNodeTree *ntree, int init)
+{
+ bNode *node;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_TEXTURE && node->id) {
+ Tex *tex= (Tex *)node->id;
+ if(tex->nodetree && tex->use_nodes) {
+ /* has internal flag to detect it only does it once */
+ if(init)
+ ntreeBeginExecTree(tex->nodetree);
+ else
+ ntreeEndExecTree(tex->nodetree);
+ }
+ }
+ }
+
+}
/* optimized tree execute test for compositing */
void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
@@ -2447,6 +2682,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
ntreeInitPreview(ntree, 0, 0);
ntreeBeginExecTree(ntree);
+ ntree_composite_texnode(ntree, 1);
/* prevent unlucky accidents */
if(G.background)
@@ -2459,6 +2695,9 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
/* fixed seed, for example noise texture */
BLI_srandom(rd->cfra);
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
/* sets need_exec tags in nodes */
curnode = totnode= setExecutableNodes(ntree, &thdata);
@@ -2469,7 +2708,6 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
if(BLI_available_threads(&threads)) {
node= getExecutableNode(ntree);
if(node) {
-
if(ntree->progress && totnode)
ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode));
if(ntree->stats_draw) {
@@ -2544,7 +2782,7 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
}
/* node copy func */
- ltree= ntreeCopyTree(ntree, 0);
+ ltree= ntreeCopyTree(ntree);
if(adt) {
AnimData *ladt= BKE_animdata_from_id(&ltree->id);
@@ -2557,9 +2795,10 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
}
/* end animdata uglyness */
-
- /* move over the compbufs */
- /* right after ntreeCopyTree() oldsock pointers are valid */
+
+ /* ensures only a single output node is enabled */
+ ntreeSetOutput(ntree);
+
for(node= ntree->nodes.first; node; node= node->next) {
/* store new_node pointer to original */
@@ -2567,22 +2806,27 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
/* ensure new user input gets handled ok */
node->need_exec= 0;
- if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
- if(node->id) {
- if(node->flag & NODE_DO_OUTPUT)
- node->new_node->id= (ID *)copy_image((Image *)node->id);
- else
- node->new_node->id= NULL;
- }
- }
-
- for(sock= node->outputs.first; sock; sock= sock->next) {
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs */
+ /* right after ntreeCopyTree() oldsock pointers are valid */
- sock->new_sock->ns.data= sock->ns.data;
- compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+ if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ if(node->id) {
+ if(node->flag & NODE_DO_OUTPUT)
+ node->new_node->id= (ID *)copy_image((Image *)node->id);
+ else
+ node->new_node->id= NULL;
+ }
+ }
- sock->ns.data= NULL;
- sock->new_sock->new_sock= sock;
+ for(sock= node->outputs.first; sock; sock= sock->next) {
+
+ sock->new_sock->ns.data= sock->ns.data;
+ compbuf_set_node(sock->new_sock->ns.data, node->new_node);
+
+ sock->ns.data= NULL;
+ sock->new_sock->new_sock= sock;
+ }
}
}
@@ -2610,19 +2854,38 @@ static int outsocket_exists(bNode *node, bNodeSocket *testsock)
/* sync local composite with real tree */
/* local composite is supposed to be running, be careful moving previews! */
+/* is called by jobs manager, outside threads, so it doesnt happen during draw */
void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
{
bNode *lnode;
- /* move over the compbufs and previews */
- for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
- if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(ntree->type==NTREE_COMPOSIT) {
+ /* move over the compbufs and previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+ if( (lnode->exec & NODE_READY) && !(lnode->exec & NODE_SKIPPED) ) {
+ if(node_exists(ntree, lnode->new_node)) {
+
+ if(lnode->preview && lnode->preview->rect) {
+ node_free_preview(lnode->new_node);
+ lnode->new_node->preview= lnode->preview;
+ lnode->preview= NULL;
+ }
+ }
+ }
+ }
+ }
+ else if(ntree->type==NTREE_SHADER) {
+ /* copy over contents of previews */
+ for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
if(node_exists(ntree, lnode->new_node)) {
+ bNode *node= lnode->new_node;
- if(lnode->preview && lnode->preview->rect) {
- node_free_preview(lnode->new_node);
- lnode->new_node->preview= lnode->preview;
- lnode->preview= NULL;
+ if(node->preview && node->preview->rect) {
+ if(lnode->preview && lnode->preview->rect) {
+ int xsize= node->preview->xsize;
+ int ysize= node->preview->ysize;
+ memcpy(node->preview->rect, lnode->preview->rect, 4*xsize + xsize*ysize*sizeof(char)*4);
+ }
}
}
}
@@ -2693,7 +2956,7 @@ static void gpu_from_node_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack
gs[i].name = "";
gs[i].hasinput= ns[i]->hasinput && ns[i]->data;
- gs[i].hasoutput= ns[i]->hasinput && ns[i]->data;
+ gs[i].hasoutput= ns[i]->hasoutput && ns[i]->data;
gs[i].sockettype= ns[i]->sockettype;
}
@@ -2707,13 +2970,11 @@ static void data_from_gpu_stack(ListBase *sockets, bNodeStack **ns, GPUNodeStack
for (sock=sockets->first, i=0; sock; sock=sock->next, i++) {
ns[i]->data= gs[i].link;
- ns[i]->hasinput= gs[i].hasinput && gs[i].link;
- ns[i]->hasoutput= gs[i].hasoutput;
ns[i]->sockettype= gs[i].sockettype;
}
}
-static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in, bNodeStack **out)
+static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *gnode, bNodeStack **in)
{
bNode *node;
bNodeTree *ntree= (bNodeTree *)gnode->id;
@@ -2728,7 +2989,7 @@ static void gpu_node_group_execute(bNodeStack *stack, GPUMaterial *mat, bNode *g
for(node= ntree->nodes.first; node; node= node->next) {
if(node->typeinfo->gpufunc) {
- group_node_get_stack(node, stack, nsin, nsout, in, out);
+ node_get_stack(node, stack, nsin, nsout, in);
doit = 0;
@@ -2766,15 +3027,15 @@ void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
for(node= ntree->nodes.first; node; node= node->next) {
if(node->typeinfo->gpufunc) {
- node_get_stack(node, stack, nsin, nsout);
+ node_get_stack(node, stack, nsin, nsout, NULL);
gpu_from_node_stack(&node->inputs, nsin, gpuin);
gpu_from_node_stack(&node->outputs, nsout, gpuout);
if(node->typeinfo->gpufunc(mat, node, gpuin, gpuout))
data_from_gpu_stack(&node->outputs, nsout, gpuout);
}
else if(node->type==NODE_GROUP && node->id) {
- node_get_stack(node, stack, nsin, nsout);
- gpu_node_group_execute(stack, mat, node, nsin, nsout);
+ node_get_stack(node, stack, nsin, nsout, NULL);
+ gpu_node_group_execute(stack, mat, node, nsin);
}
}
@@ -2884,6 +3145,8 @@ void ntreeCompositTagRender(Scene *curscene)
for(node= sce->nodetree->nodes.first; node; node= node->next) {
if(node->id==(ID *)curscene || node->type==CMP_NODE_COMPOSITE)
NodeTagChanged(sce->nodetree, node);
+ else if(node->type==CMP_NODE_TEXTURE) /* uses scene sizex/sizey */
+ NodeTagChanged(sce->nodetree, node);
}
}
}
@@ -2899,7 +3162,7 @@ static int node_animation_properties(bNodeTree *ntree, bNode *node)
/* check to see if any of the node's properties have fcurves */
RNA_pointer_create((ID *)ntree, &RNA_Node, node, &ptr);
- lb = RNA_struct_defined_properties(ptr.type);
+ lb = RNA_struct_type_properties(ptr.type);
for (link=lb->first; link; link=link->next) {
int driven, len=1, index;
@@ -2961,10 +3224,7 @@ int ntreeCompositTagAnimated(bNodeTree *ntree)
NodeTagChanged(ntree, node);
tagged= 1;
}
- else if(node->type==CMP_NODE_R_LAYERS) {
- NodeTagChanged(ntree, node);
- tagged= 1;
- }
+ /* here was tag render layer, but this is called after a render, so re-composites fail */
else if(node->type==NODE_GROUP) {
if( ntreeCompositTagAnimated((bNodeTree *)node->id) ) {
NodeTagChanged(ntree, node);
@@ -2989,6 +3249,21 @@ void ntreeCompositTagGenerators(bNodeTree *ntree)
}
}
+/* XXX after render animation system gets a refresh, this call allows composite to end clean */
+void ntreeClearTags(bNodeTree *ntree)
+{
+ bNode *node;
+
+ if(ntree==NULL) return;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ node->need_exec= 0;
+ if(node->type==NODE_GROUP)
+ ntreeClearTags((bNodeTree *)node->id);
+ }
+}
+
+
int ntreeTexTagAnimated(bNodeTree *ntree)
{
bNode *node;
@@ -3012,6 +3287,62 @@ int ntreeTexTagAnimated(bNodeTree *ntree)
/* ************* node definition init ********** */
+void node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag,
+ struct bNodeSocketType *inputs, struct bNodeSocketType *outputs)
+{
+ memset(ntype, 0, sizeof(bNodeType));
+
+ ntype->type = type;
+ ntype->name = name;
+ ntype->nclass = nclass;
+ ntype->flag = flag;
+
+ ntype->inputs = inputs;
+ ntype->outputs = outputs;
+
+ /* default size values */
+ ntype->width = 140;
+ ntype->minwidth = 100;
+ ntype->maxwidth = 320;
+}
+
+void node_type_init(bNodeType *ntype, void (*initfunc)(struct bNode *))
+{
+ ntype->initfunc = initfunc;
+}
+
+void node_type_size(struct bNodeType *ntype, int width, int minwidth, int maxwidth)
+{
+ ntype->width = width;
+ ntype->minwidth = minwidth;
+ ntype->maxwidth = maxwidth;
+}
+
+void node_type_storage(bNodeType *ntype, const char *storagename, void (*freestoragefunc)(struct bNode *), void (*copystoragefunc)(struct bNode *, struct bNode *))
+{
+ if (storagename)
+ strncpy(ntype->storagename, storagename, sizeof(ntype->storagename));
+ else
+ ntype->storagename[0] = '\0';
+ ntype->copystoragefunc = copystoragefunc;
+ ntype->freestoragefunc = freestoragefunc;
+}
+
+void node_type_exec(struct bNodeType *ntype, void (*execfunc)(void *data, struct bNode *, struct bNodeStack **, struct bNodeStack **))
+{
+ ntype->execfunc = execfunc;
+}
+
+void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out))
+{
+ ntype->gpufunc = gpufunc;
+}
+
+void node_type_label(struct bNodeType *ntype, const char *(*labelfunc)(struct bNode *))
+{
+ ntype->labelfunc = labelfunc;
+}
+
static bNodeType *is_nodetype_registered(ListBase *typelist, int type, ID *id)
{
bNodeType *ntype= typelist->first;
@@ -3037,147 +3368,150 @@ void nodeRegisterType(ListBase *typelist, const bNodeType *ntype)
static void registerCompositNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &cmp_node_rlayers);
- nodeRegisterType(ntypelist, &cmp_node_image);
- nodeRegisterType(ntypelist, &cmp_node_texture);
- nodeRegisterType(ntypelist, &cmp_node_value);
- nodeRegisterType(ntypelist, &cmp_node_rgb);
- nodeRegisterType(ntypelist, &cmp_node_curve_time);
-
- nodeRegisterType(ntypelist, &cmp_node_composite);
- nodeRegisterType(ntypelist, &cmp_node_viewer);
- nodeRegisterType(ntypelist, &cmp_node_splitviewer);
- nodeRegisterType(ntypelist, &cmp_node_output_file);
- nodeRegisterType(ntypelist, &cmp_node_view_levels);
-
- nodeRegisterType(ntypelist, &cmp_node_curve_rgb);
- nodeRegisterType(ntypelist, &cmp_node_mix_rgb);
- nodeRegisterType(ntypelist, &cmp_node_hue_sat);
- nodeRegisterType(ntypelist, &cmp_node_brightcontrast);
- nodeRegisterType(ntypelist, &cmp_node_gamma);
- nodeRegisterType(ntypelist, &cmp_node_invert);
- nodeRegisterType(ntypelist, &cmp_node_alphaover);
- nodeRegisterType(ntypelist, &cmp_node_zcombine);
- nodeRegisterType(ntypelist, &cmp_node_colorbalance);
- nodeRegisterType(ntypelist, &cmp_node_huecorrect);
-
- nodeRegisterType(ntypelist, &cmp_node_normal);
- nodeRegisterType(ntypelist, &cmp_node_curve_vec);
- nodeRegisterType(ntypelist, &cmp_node_map_value);
- nodeRegisterType(ntypelist, &cmp_node_normalize);
-
- nodeRegisterType(ntypelist, &cmp_node_filter);
- nodeRegisterType(ntypelist, &cmp_node_blur);
- nodeRegisterType(ntypelist, &cmp_node_dblur);
- nodeRegisterType(ntypelist, &cmp_node_bilateralblur);
- nodeRegisterType(ntypelist, &cmp_node_vecblur);
- nodeRegisterType(ntypelist, &cmp_node_dilateerode);
- nodeRegisterType(ntypelist, &cmp_node_defocus);
-
- nodeRegisterType(ntypelist, &cmp_node_valtorgb);
- nodeRegisterType(ntypelist, &cmp_node_rgbtobw);
- nodeRegisterType(ntypelist, &cmp_node_setalpha);
- nodeRegisterType(ntypelist, &cmp_node_idmask);
- nodeRegisterType(ntypelist, &cmp_node_math);
- nodeRegisterType(ntypelist, &cmp_node_seprgba);
- nodeRegisterType(ntypelist, &cmp_node_combrgba);
- nodeRegisterType(ntypelist, &cmp_node_sephsva);
- nodeRegisterType(ntypelist, &cmp_node_combhsva);
- nodeRegisterType(ntypelist, &cmp_node_sepyuva);
- nodeRegisterType(ntypelist, &cmp_node_combyuva);
- nodeRegisterType(ntypelist, &cmp_node_sepycca);
- nodeRegisterType(ntypelist, &cmp_node_combycca);
- nodeRegisterType(ntypelist, &cmp_node_premulkey);
-
- nodeRegisterType(ntypelist, &cmp_node_diff_matte);
- nodeRegisterType(ntypelist, &cmp_node_distance_matte);
- nodeRegisterType(ntypelist, &cmp_node_chroma_matte);
- nodeRegisterType(ntypelist, &cmp_node_color_matte);
- nodeRegisterType(ntypelist, &cmp_node_channel_matte);
- nodeRegisterType(ntypelist, &cmp_node_color_spill);
- nodeRegisterType(ntypelist, &cmp_node_luma_matte);
-
- nodeRegisterType(ntypelist, &cmp_node_translate);
- nodeRegisterType(ntypelist, &cmp_node_rotate);
- nodeRegisterType(ntypelist, &cmp_node_scale);
- nodeRegisterType(ntypelist, &cmp_node_flip);
- nodeRegisterType(ntypelist, &cmp_node_crop);
- nodeRegisterType(ntypelist, &cmp_node_displace);
- nodeRegisterType(ntypelist, &cmp_node_mapuv);
- nodeRegisterType(ntypelist, &cmp_node_glare);
- nodeRegisterType(ntypelist, &cmp_node_tonemap);
- nodeRegisterType(ntypelist, &cmp_node_lensdist);
+ register_node_type_group(ntypelist);
+
+ register_node_type_cmp_rlayers(ntypelist);
+ register_node_type_cmp_image(ntypelist);
+ register_node_type_cmp_texture(ntypelist);
+ register_node_type_cmp_value(ntypelist);
+ register_node_type_cmp_rgb(ntypelist);
+ register_node_type_cmp_curve_time(ntypelist);
+
+ register_node_type_cmp_composite(ntypelist);
+ register_node_type_cmp_viewer(ntypelist);
+ register_node_type_cmp_splitviewer(ntypelist);
+ register_node_type_cmp_output_file(ntypelist);
+ register_node_type_cmp_view_levels(ntypelist);
+
+ register_node_type_cmp_curve_rgb(ntypelist);
+ register_node_type_cmp_mix_rgb(ntypelist);
+ register_node_type_cmp_hue_sat(ntypelist);
+ register_node_type_cmp_brightcontrast(ntypelist);
+ register_node_type_cmp_gamma(ntypelist);
+ register_node_type_cmp_invert(ntypelist);
+ register_node_type_cmp_alphaover(ntypelist);
+ register_node_type_cmp_zcombine(ntypelist);
+ register_node_type_cmp_colorbalance(ntypelist);
+ register_node_type_cmp_huecorrect(ntypelist);
+
+ register_node_type_cmp_normal(ntypelist);
+ register_node_type_cmp_curve_vec(ntypelist);
+ register_node_type_cmp_map_value(ntypelist);
+ register_node_type_cmp_normalize(ntypelist);
+
+ register_node_type_cmp_filter(ntypelist);
+ register_node_type_cmp_blur(ntypelist);
+ register_node_type_cmp_dblur(ntypelist);
+ register_node_type_cmp_bilateralblur(ntypelist);
+ register_node_type_cmp_vecblur(ntypelist);
+ register_node_type_cmp_dilateerode(ntypelist);
+ register_node_type_cmp_defocus(ntypelist);
+
+ register_node_type_cmp_valtorgb(ntypelist);
+ register_node_type_cmp_rgbtobw(ntypelist);
+ register_node_type_cmp_setalpha(ntypelist);
+ register_node_type_cmp_idmask(ntypelist);
+ register_node_type_cmp_math(ntypelist);
+ register_node_type_cmp_seprgba(ntypelist);
+ register_node_type_cmp_combrgba(ntypelist);
+ register_node_type_cmp_sephsva(ntypelist);
+ register_node_type_cmp_combhsva(ntypelist);
+ register_node_type_cmp_sepyuva(ntypelist);
+ register_node_type_cmp_combyuva(ntypelist);
+ register_node_type_cmp_sepycca(ntypelist);
+ register_node_type_cmp_combycca(ntypelist);
+ register_node_type_cmp_premulkey(ntypelist);
+
+ register_node_type_cmp_diff_matte(ntypelist);
+ register_node_type_cmp_distance_matte(ntypelist);
+ register_node_type_cmp_chroma_matte(ntypelist);
+ register_node_type_cmp_color_matte(ntypelist);
+ register_node_type_cmp_channel_matte(ntypelist);
+ register_node_type_cmp_color_spill(ntypelist);
+ register_node_type_cmp_luma_matte(ntypelist);
+
+ register_node_type_cmp_translate(ntypelist);
+ register_node_type_cmp_rotate(ntypelist);
+ register_node_type_cmp_scale(ntypelist);
+ register_node_type_cmp_flip(ntypelist);
+ register_node_type_cmp_crop(ntypelist);
+ register_node_type_cmp_displace(ntypelist);
+ register_node_type_cmp_mapuv(ntypelist);
+ register_node_type_cmp_glare(ntypelist);
+ register_node_type_cmp_tonemap(ntypelist);
+ register_node_type_cmp_lensdist(ntypelist);
}
static void registerShaderNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &sh_node_output);
- nodeRegisterType(ntypelist, &sh_node_mix_rgb);
- nodeRegisterType(ntypelist, &sh_node_valtorgb);
- nodeRegisterType(ntypelist, &sh_node_rgbtobw);
- nodeRegisterType(ntypelist, &sh_node_normal);
- nodeRegisterType(ntypelist, &sh_node_geom);
- nodeRegisterType(ntypelist, &sh_node_mapping);
- nodeRegisterType(ntypelist, &sh_node_curve_vec);
- nodeRegisterType(ntypelist, &sh_node_curve_rgb);
- nodeRegisterType(ntypelist, &sh_node_math);
- nodeRegisterType(ntypelist, &sh_node_vect_math);
- nodeRegisterType(ntypelist, &sh_node_squeeze);
- nodeRegisterType(ntypelist, &sh_node_camera);
- nodeRegisterType(ntypelist, &sh_node_material);
- nodeRegisterType(ntypelist, &sh_node_material_ext);
- nodeRegisterType(ntypelist, &sh_node_value);
- nodeRegisterType(ntypelist, &sh_node_rgb);
- nodeRegisterType(ntypelist, &sh_node_texture);
- nodeRegisterType(ntypelist, &node_dynamic_typeinfo);
- nodeRegisterType(ntypelist, &sh_node_invert);
- nodeRegisterType(ntypelist, &sh_node_seprgb);
- nodeRegisterType(ntypelist, &sh_node_combrgb);
- nodeRegisterType(ntypelist, &sh_node_hue_sat);
+ register_node_type_group(ntypelist);
+
+ register_node_type_sh_output(ntypelist);
+ register_node_type_sh_mix_rgb(ntypelist);
+ register_node_type_sh_valtorgb(ntypelist);
+ register_node_type_sh_rgbtobw(ntypelist);
+ register_node_type_sh_normal(ntypelist);
+ register_node_type_sh_geom(ntypelist);
+ register_node_type_sh_mapping(ntypelist);
+ register_node_type_sh_curve_vec(ntypelist);
+ register_node_type_sh_curve_rgb(ntypelist);
+ register_node_type_sh_math(ntypelist);
+ register_node_type_sh_vect_math(ntypelist);
+ register_node_type_sh_squeeze(ntypelist);
+ register_node_type_sh_camera(ntypelist);
+ register_node_type_sh_material(ntypelist);
+ register_node_type_sh_material_ext(ntypelist);
+ register_node_type_sh_value(ntypelist);
+ register_node_type_sh_rgb(ntypelist);
+ register_node_type_sh_texture(ntypelist);
+// register_node_type_sh_dynamic(ntypelist);
+ register_node_type_sh_invert(ntypelist);
+ register_node_type_sh_seprgb(ntypelist);
+ register_node_type_sh_combrgb(ntypelist);
+ register_node_type_sh_hue_sat(ntypelist);
}
static void registerTextureNodes(ListBase *ntypelist)
{
- nodeRegisterType(ntypelist, &node_group_typeinfo);
- nodeRegisterType(ntypelist, &tex_node_math);
- nodeRegisterType(ntypelist, &tex_node_mix_rgb);
- nodeRegisterType(ntypelist, &tex_node_valtorgb);
- nodeRegisterType(ntypelist, &tex_node_rgbtobw);
- nodeRegisterType(ntypelist, &tex_node_valtonor);
- nodeRegisterType(ntypelist, &tex_node_curve_rgb);
- nodeRegisterType(ntypelist, &tex_node_curve_time);
- nodeRegisterType(ntypelist, &tex_node_invert);
- nodeRegisterType(ntypelist, &tex_node_hue_sat);
- nodeRegisterType(ntypelist, &tex_node_coord);
- nodeRegisterType(ntypelist, &tex_node_distance);
- nodeRegisterType(ntypelist, &tex_node_compose);
- nodeRegisterType(ntypelist, &tex_node_decompose);
-
- nodeRegisterType(ntypelist, &tex_node_output);
- nodeRegisterType(ntypelist, &tex_node_viewer);
-
- nodeRegisterType(ntypelist, &tex_node_checker);
- nodeRegisterType(ntypelist, &tex_node_texture);
- nodeRegisterType(ntypelist, &tex_node_bricks);
- nodeRegisterType(ntypelist, &tex_node_image);
-
- nodeRegisterType(ntypelist, &tex_node_rotate);
- nodeRegisterType(ntypelist, &tex_node_translate);
- nodeRegisterType(ntypelist, &tex_node_scale);
- nodeRegisterType(ntypelist, &tex_node_at);
-
- nodeRegisterType(ntypelist, &tex_node_proc_voronoi);
- nodeRegisterType(ntypelist, &tex_node_proc_blend);
- nodeRegisterType(ntypelist, &tex_node_proc_magic);
- nodeRegisterType(ntypelist, &tex_node_proc_marble);
- nodeRegisterType(ntypelist, &tex_node_proc_clouds);
- nodeRegisterType(ntypelist, &tex_node_proc_wood);
- nodeRegisterType(ntypelist, &tex_node_proc_musgrave);
- nodeRegisterType(ntypelist, &tex_node_proc_noise);
- nodeRegisterType(ntypelist, &tex_node_proc_stucci);
- nodeRegisterType(ntypelist, &tex_node_proc_distnoise);
+ register_node_type_group(ntypelist);
+
+ register_node_type_tex_math(ntypelist);
+ register_node_type_tex_mix_rgb(ntypelist);
+ register_node_type_tex_valtorgb(ntypelist);
+ register_node_type_tex_rgbtobw(ntypelist);
+ register_node_type_tex_valtonor(ntypelist);
+ register_node_type_tex_curve_rgb(ntypelist);
+ register_node_type_tex_curve_time(ntypelist);
+ register_node_type_tex_invert(ntypelist);
+ register_node_type_tex_hue_sat(ntypelist);
+ register_node_type_tex_coord(ntypelist);
+ register_node_type_tex_distance(ntypelist);
+ register_node_type_tex_compose(ntypelist);
+ register_node_type_tex_decompose(ntypelist);
+
+ register_node_type_tex_output(ntypelist);
+ register_node_type_tex_viewer(ntypelist);
+
+ register_node_type_tex_checker(ntypelist);
+ register_node_type_tex_texture(ntypelist);
+ register_node_type_tex_bricks(ntypelist);
+ register_node_type_tex_image(ntypelist);
+
+ register_node_type_tex_rotate(ntypelist);
+ register_node_type_tex_translate(ntypelist);
+ register_node_type_tex_scale(ntypelist);
+ register_node_type_tex_at(ntypelist);
+
+ register_node_type_tex_proc_voronoi(ntypelist);
+ register_node_type_tex_proc_blend(ntypelist);
+ register_node_type_tex_proc_magic(ntypelist);
+ register_node_type_tex_proc_marble(ntypelist);
+ register_node_type_tex_proc_clouds(ntypelist);
+ register_node_type_tex_proc_wood(ntypelist);
+ register_node_type_tex_proc_musgrave(ntypelist);
+ register_node_type_tex_proc_noise(ntypelist);
+ register_node_type_tex_proc_stucci(ntypelist);
+ register_node_type_tex_proc_distnoise(ntypelist);
}
static void remove_dynamic_typeinfos(ListBase *list)
@@ -3191,7 +3525,7 @@ static void remove_dynamic_typeinfos(ListBase *list)
if(ntype->inputs) {
bNodeSocketType *sock= ntype->inputs;
while(sock->type!=-1) {
- MEM_freeN(sock->name);
+ MEM_freeN((void *)sock->name);
sock++;
}
MEM_freeN(ntype->inputs);
@@ -3199,13 +3533,13 @@ static void remove_dynamic_typeinfos(ListBase *list)
if(ntype->outputs) {
bNodeSocketType *sock= ntype->outputs;
while(sock->type!=-1) {
- MEM_freeN(sock->name);
+ MEM_freeN((void *)sock->name);
sock++;
}
MEM_freeN(ntype->outputs);
}
if(ntype->name) {
- MEM_freeN(ntype->name);
+ MEM_freeN((void *)ntype->name);
}
MEM_freeN(ntype);
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index eddcceb560f..9910392e2d0 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -57,12 +57,11 @@
#include "BLI_editVert.h"
#include "BLI_math.h"
#include "BLI_pbvh.h"
-
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "BKE_main.h"
#include "BKE_global.h"
-
+#include "BKE_idprop.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_bullet.h"
@@ -97,7 +96,7 @@
#include "LBM_fluidsim.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -246,6 +245,13 @@ void free_sculptsession(Object *ob)
if(ss->layer_co)
MEM_freeN(ss->layer_co);
+ if(ss->orig_cos)
+ MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos)
+ MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats)
+ MEM_freeN(ss->deform_imats);
+
MEM_freeN(ss);
ob->sculpt = NULL;
@@ -268,7 +274,7 @@ void free_object(Object *ob)
else if(ob->type==OB_CURVE) unlink_curve(ob->data);
else if(ob->type==OB_MBALL) unlink_mball(ob->data);
}
- ob->data= 0;
+ ob->data= NULL;
}
for(a=0; a<ob->totcol; a++) {
@@ -276,12 +282,12 @@ void free_object(Object *ob)
}
if(ob->mat) MEM_freeN(ob->mat);
if(ob->matbits) MEM_freeN(ob->matbits);
- ob->mat= 0;
- ob->matbits= 0;
+ ob->mat= NULL;
+ ob->matbits= NULL;
if(ob->bb) MEM_freeN(ob->bb);
- ob->bb= 0;
+ ob->bb= NULL;
if(ob->path) free_path(ob->path);
- ob->path= 0;
+ ob->path= NULL;
if(ob->adt) BKE_free_animdata((ID *)ob);
if(ob->poselib) ob->poselib->id.us--;
if(ob->gpd) ((ID *)ob->gpd)->us--;
@@ -317,11 +323,11 @@ static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Objec
if (*obpoin==unlinkOb) {
*obpoin = NULL;
- ob->recalc |= OB_RECALC_ALL; // XXX: should this just be OB_RECALC_DATA?
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // XXX: should this just be OB_RECALC_DATA?
}
}
-void unlink_object(Scene *scene, Object *ob)
+void unlink_object(Object *ob)
{
Main *bmain= G.main;
Object *obt;
@@ -358,7 +364,7 @@ void unlink_object(Scene *scene, Object *ob)
if(obt->parent==ob) {
obt->parent= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
@@ -368,15 +374,15 @@ void unlink_object(Scene *scene, Object *ob)
if(cu->bevobj==ob) {
cu->bevobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->taperobj==ob) {
cu->taperobj= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
if(cu->textoncurve==ob) {
cu->textoncurve= NULL;
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
else if(obt->type==OB_ARMATURE && obt->pose) {
@@ -533,12 +539,10 @@ void unlink_object(Scene *scene, Object *ob)
}
/* textures */
- tex= bmain->tex.first;
- while(tex) {
- if(tex->env) {
- if(tex->env->object == ob) tex->env->object= NULL;
- }
- tex= tex->id.next;
+ for(tex= bmain->tex.first; tex; tex= tex->id.next) {
+ if(tex->env && (ob==tex->env->object)) tex->env->object= NULL;
+ if(tex->pd && (ob==tex->pd->object)) tex->pd->object= NULL;
+ if(tex->vd && (ob==tex->vd->object)) tex->vd->object= NULL;
}
/* worlds */
@@ -696,7 +700,7 @@ int exist_object(Object *obtest)
return 0;
}
-void *add_camera(char *name)
+void *add_camera(const char *name)
{
Camera *cam;
@@ -718,7 +722,6 @@ Camera *copy_camera(Camera *cam)
Camera *camn;
camn= copy_libblock(cam);
- camn->adt= BKE_copy_animdata(cam->adt);
return camn;
}
@@ -737,11 +740,11 @@ void make_local_camera(Camera *cam)
* - mixed: make copy
*/
- if(cam->id.lib==0) return;
+ if(cam->id.lib==NULL) return;
if(cam->id.us==1) {
- cam->id.lib= 0;
+ cam->id.lib= NULL;
cam->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cam, 0);
+ new_id(NULL, (ID *)cam, NULL);
return;
}
@@ -755,9 +758,9 @@ void make_local_camera(Camera *cam)
}
if(local && lib==0) {
- cam->id.lib= 0;
+ cam->id.lib= NULL;
cam->id.flag= LIB_LOCAL;
- new_id(0, (ID *)cam, 0);
+ new_id(NULL, (ID *)cam, NULL);
}
else if(local && lib) {
camn= copy_camera(cam);
@@ -767,7 +770,7 @@ void make_local_camera(Camera *cam)
while(ob) {
if(ob->data==cam) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= camn;
camn->id.us++;
cam->id.us--;
@@ -798,7 +801,7 @@ float dof_camera(Object *ob)
return cam->YF_dofdist;
}
-void *add_lamp(char *name)
+void *add_lamp(const char *name)
{
Lamp *la;
@@ -886,11 +889,11 @@ void make_local_lamp(Lamp *la)
* - mixed: make copy
*/
- if(la->id.lib==0) return;
+ if(la->id.lib==NULL) return;
if(la->id.us==1) {
- la->id.lib= 0;
+ la->id.lib= NULL;
la->id.flag= LIB_LOCAL;
- new_id(0, (ID *)la, 0);
+ new_id(NULL, (ID *)la, NULL);
return;
}
@@ -904,9 +907,9 @@ void make_local_lamp(Lamp *la)
}
if(local && lib==0) {
- la->id.lib= 0;
+ la->id.lib= NULL;
la->id.flag= LIB_LOCAL;
- new_id(0, (ID *)la, 0);
+ new_id(NULL, (ID *)la, NULL);
}
else if(local && lib) {
lan= copy_lamp(la);
@@ -916,7 +919,7 @@ void make_local_lamp(Lamp *la)
while(ob) {
if(ob->data==la) {
- if(ob->id.lib==0) {
+ if(ob->id.lib==NULL) {
ob->data= lan;
lan->id.us++;
la->id.us--;
@@ -973,7 +976,7 @@ static void *add_obdata_from_type(int type)
}
}
-static char *get_obdata_defname(int type)
+static const char *get_obdata_defname(int type)
{
switch (type) {
case OB_MESH: return "Mesh";
@@ -993,7 +996,7 @@ static char *get_obdata_defname(int type)
}
/* more general add: creates minimum required data, but without vertices etc. */
-Object *add_only_object(int type, char *name)
+Object *add_only_object(int type, const char *name)
{
Object *ob;
@@ -1011,10 +1014,13 @@ Object *add_only_object(int type, char *name)
* but rotations default to quaternions
*/
ob->rotmode= ROT_MODE_EUL;
- /* axis-angle must not have a 0,0,0 axis, so set y-axis as default... */
- ob->rotAxis[1]= ob->drotAxis[1]= 1.0f;
- /* quaternions should be 1,0,0,0 by default.... */
- ob->quat[0]= ob->dquat[0]= 1.0f;
+
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+
+ unit_qt(ob->quat);
+ unit_qt(ob->dquat);
+
/* rotation locks should be 4D for 4 component rotations by default... */
ob->protectflag = OB_LOCK_ROT4D;
@@ -1022,7 +1028,7 @@ Object *add_only_object(int type, char *name)
unit_m4(ob->parentinv);
unit_m4(ob->obmat);
ob->dt= OB_TEXTURE;
- ob->empty_drawtype= OB_ARROWS;
+ ob->empty_drawtype= OB_PLAINAXES;
ob->empty_drawsize= 1.0;
if(type==OB_CAMERA || type==OB_LAMP) {
@@ -1073,7 +1079,7 @@ Object *add_object(struct Scene *scene, int type)
Base *base;
char name[32];
- strcpy(name, get_obdata_defname(type));
+ BLI_strncpy(name, get_obdata_defname(type), sizeof(name));
ob = add_only_object(type, name);
ob->data= add_obdata_from_type(type);
@@ -1082,7 +1088,7 @@ Object *add_object(struct Scene *scene, int type)
base= scene_add_base(scene, ob);
scene_select_base(scene, base);
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
return ob;
}
@@ -1122,7 +1128,7 @@ BulletSoftBody *copy_bulletsoftbody(BulletSoftBody *bsb)
return bsbn;
}
-ParticleSystem *copy_particlesystem(ParticleSystem *psys)
+static ParticleSystem *copy_particlesystem(ParticleSystem *psys)
{
ParticleSystem *psysn;
ParticleData *pa;
@@ -1267,6 +1273,17 @@ static void copy_object_pose(Object *obn, Object *ob)
}
}
+static void copy_object_transform(Object *ob_tar, Object *ob_src)
+{
+ copy_v3_v3(ob_tar->loc, ob_src->loc);
+ copy_v3_v3(ob_tar->rot, ob_src->rot);
+ copy_v3_v3(ob_tar->quat, ob_src->quat);
+ copy_v3_v3(ob_tar->rotAxis, ob_src->rotAxis);
+ ob_tar->rotAngle= ob_src->rotAngle;
+ ob_tar->rotmode= ob_src->rotmode;
+ copy_v3_v3(ob_tar->size, ob_src->size);
+}
+
Object *copy_object(Object *ob)
{
Object *obn;
@@ -1315,8 +1332,8 @@ Object *copy_object(Object *ob)
/* increase user numbers */
id_us_plus((ID *)obn->data);
+ id_us_plus((ID *)obn->gpd);
id_lib_extern((ID *)obn->dup_group);
-
for(a=0; a<obn->totcol; a++) id_us_plus((ID *)obn->mat[a]);
@@ -1339,6 +1356,8 @@ Object *copy_object(Object *ob)
obn->gpulamp.first = obn->gpulamp.last = NULL;
obn->pc_ids.first = obn->pc_ids.last = NULL;
+
+ obn->mpath= NULL;
return obn;
}
@@ -1466,7 +1485,7 @@ static void armature_set_id_extern(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
- int lay= arm->layer_protected;
+ unsigned int lay= arm->layer_protected;
for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
if(!(pchan->bone->layer & lay))
@@ -1529,25 +1548,25 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
ob->proxy_group= gob;
id_lib_extern(&target->id);
- ob->recalc= target->recalc= OB_RECALC_ALL;
+ ob->recalc= target->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
- /* copy transform */
+ /* copy transform
+ * - gob means this proxy comes from a group, just apply the matrix
+ * so the object wont move from its dupli-transform.
+ *
+ * - no gob means this is being made from a linked object,
+ * this is closer to making a copy of the object - in-place. */
if(gob) {
- VECCOPY(ob->loc, gob->loc);
- VECCOPY(ob->rot, gob->rot);
- VECCOPY(ob->size, gob->size);
-
- group_tag_recalc(gob->dup_group);
+ ob->rotmode= target->rotmode;
+ mul_m4_m4m4(ob->obmat, target->obmat, gob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, TRUE);
}
else {
- VECCOPY(ob->loc, target->loc);
- VECCOPY(ob->rot, target->rot);
- VECCOPY(ob->size, target->size);
+ copy_object_transform(ob, target);
+ ob->parent= target->parent; /* libdata */
+ copy_m4_m4(ob->parentinv, target->parentinv);
}
- ob->parent= target->parent; /* libdata */
- copy_m4_m4(ob->parentinv, target->parentinv);
-
/* copy animdata stuff - drivers only for now... */
object_copy_proxy_drivers(ob, target);
@@ -1588,7 +1607,17 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
armature_set_id_extern(ob);
}
-
+
+ /* copy IDProperties */
+ if(ob->id.properties) {
+ IDP_FreeProperty(ob->id.properties);
+ MEM_freeN(ob->id.properties);
+ ob->id.properties= NULL;
+ }
+ if(target->id.properties) {
+ ob->id.properties= IDP_CopyProperty(target->id.properties);
+ }
+
/* copy drawtype info */
ob->dt= target->dt;
}
@@ -1598,7 +1627,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
/* there is also a timing calculation in drawobject() */
-int no_speed_curve= 0;
+static int no_speed_curve= 0;
void disable_speed_curve(int val)
{
@@ -1607,7 +1636,7 @@ void disable_speed_curve(int val)
// XXX THIS CRUFT NEEDS SERIOUS RECODING ASAP!
/* ob can be NULL */
-float bsystem_time(struct Scene *scene, Object *ob, float cfra, float ofs)
+float bsystem_time(struct Scene *scene, Object *UNUSED(ob), float cfra, float ofs)
{
/* returns float ( see BKE_curframe in scene.c) */
cfra += scene->r.subframe;
@@ -1636,7 +1665,7 @@ void object_scale_to_mat3(Object *ob, float mat[][3])
size_to_mat3( mat,vec);
}
-// TODO: this should take rotation orders into account later...
+
void object_rot_to_mat3(Object *ob, float mat[][3])
{
float rmat[3][3], dmat[3][3];
@@ -1659,41 +1688,67 @@ void object_rot_to_mat3(Object *ob, float mat[][3])
}
else {
/* quats are normalised before use to eliminate scaling issues */
- normalize_qt(ob->quat);
- quat_to_mat3( rmat,ob->quat);
- quat_to_mat3( dmat,ob->dquat);
+ float tquat[4];
+
+ normalize_qt_qt(tquat, ob->quat);
+ quat_to_mat3(rmat, tquat);
+
+ normalize_qt_qt(tquat, ob->dquat);
+ quat_to_mat3(dmat, tquat);
}
/* combine these rotations */
- // XXX is this correct? if errors, change the order of multiplication...
mul_m3_m3m3(mat, dmat, rmat);
}
-void object_mat3_to_rot(Object *ob, float mat[][3], int use_compat)
+void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
{
- if (ob->rotmode == ROT_MODE_QUAT)
- mat3_to_quat(ob->quat, mat);
- else if (ob->rotmode == ROT_MODE_AXISANGLE)
- mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
- else {
- if(use_compat) {
- float eul[3];
- VECCOPY(eul, ob->rot);
- mat3_to_compatible_eulO(ob->rot, eul, ob->rotmode, mat);
+ switch(ob->rotmode) {
+ case ROT_MODE_QUAT:
+ {
+ float dquat[4];
+ mat3_to_quat(ob->quat, mat);
+ normalize_qt_qt(dquat, ob->dquat);
+ invert_qt(dquat);
+ mul_qt_qtqt(ob->quat, dquat, ob->quat);
}
- else
- mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ break;
+ case ROT_MODE_AXISANGLE:
+ mat3_to_axis_angle(ob->rotAxis, &ob->rotAngle, mat);
+ sub_v3_v3(ob->rotAxis, ob->drotAxis);
+ ob->rotAngle -= ob->drotAngle;
+ break;
+ default: /* euler */
+ if(use_compat) mat3_to_compatible_eulO(ob->rot, ob->rot, ob->rotmode, mat);
+ else mat3_to_eulO(ob->rot, ob->rotmode, mat);
+ sub_v3_v3(ob->rot, ob->drot);
}
}
/* see pchan_apply_mat4() for the equivalent 'pchan' function */
-void object_apply_mat4(Object *ob, float mat[][4])
+void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const short use_parent)
{
- float mat3[3][3];
- copy_v3_v3(ob->loc, mat[3]);
- mat4_to_size(ob->size, mat);
- copy_m3_m4(mat3, mat);
- object_mat3_to_rot(ob, mat3, 0);
+ float rot[3][3];
+
+ if(use_parent && ob->parent) {
+ float rmat[4][4], diff_mat[4][4], imat[4][4];
+ mul_m4_m4m4(diff_mat, ob->parentinv, ob->parent->obmat);
+ invert_m4_m4(imat, diff_mat);
+ mul_m4_m4m4(rmat, mat, imat); /* get the parent relative matrix */
+ object_apply_mat4(ob, rmat, use_compat, FALSE);
+
+ /* same as below, use rmat rather then mat */
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, rmat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
+ else {
+ mat4_to_loc_rot_size(ob->loc, rot, ob->size, mat);
+ object_mat3_to_rot(ob, rot, use_compat);
+ }
+
+ sub_v3_v3(ob->loc, ob->dloc);
+ sub_v3_v3(ob->size, ob->dsize);
+ /* object_mat3_to_rot handles delta rotations */
}
void object_to_mat3(Object *ob, float mat[][3]) /* no parent */
@@ -1721,12 +1776,13 @@ void object_to_mat4(Object *ob, float mat[][4])
add_v3_v3v3(mat[3], ob->loc, ob->dloc);
}
+/* extern */
int enable_cu_speed= 1;
static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
{
Curve *cu;
- float q[4], vec[4], dir[3], quat[4], radius, x1, ctime;
+ float vec[4], dir[3], quat[4], radius, ctime;
float timeoffs = 0.0, sf_orig = 0.0;
unit_m4(mat);
@@ -1754,12 +1810,17 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
* we divide the curvetime calculated in the previous step by the length of the path, to get a time
* factor, which then gets clamped to lie within 0.0 - 1.0 range
*/
- ctime= cu->ctime / cu->pathlen;
+ if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ ctime= cu->ctime / cu->pathlen;
+ else
+ ctime= cu->ctime;
+
CLAMP(ctime, 0.0, 1.0);
}
else {
ctime= scene->r.cfra - give_timeoffset(ob);
- ctime /= cu->pathlen;
+ if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ ctime /= cu->pathlen;
CLAMP(ctime, 0.0, 1.0);
}
@@ -1774,9 +1835,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
/* vec: 4 items! */
- if( where_on_path(par, ctime, vec, dir, NULL, &radius, NULL) ) {
+ if( where_on_path(par, ctime, vec, dir, cu->flag & CU_FOLLOW ? quat:NULL, &radius, NULL) ) {
if(cu->flag & CU_FOLLOW) {
+#if 0
+ float x1, q[4];
vec_to_quat( quat,dir, ob->trackflag, ob->upflag);
/* the tilt */
@@ -1787,8 +1850,11 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
q[2]= -x1*dir[1];
q[3]= -x1*dir[2];
mul_qt_qtqt(quat, q, quat);
-
- quat_to_mat4( mat,quat);
+#else
+ quat_apply_track(quat, ob->trackflag, ob->upflag);
+#endif
+ normalize_qt(quat);
+ quat_to_mat4(mat, quat);
}
if(cu->flag & CU_PATH_RADIUS) {
@@ -2044,7 +2110,7 @@ void where_is_object_time(Scene *scene, Object *ob, float ctime)
}
/* solve constraints */
- if (ob->constraints.first && !(ob->flag & OB_NO_CONSTRAINTS)) {
+ if (ob->constraints.first && !(ob->transflag & OB_NO_CONSTRAINTS)) {
bConstraintOb *cob;
cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -2129,7 +2195,7 @@ static void solve_parenting (Scene *scene, Object *ob, Object *par, float obmat[
copy_m3_m4(originmat, tmat);
// origin, voor help line
- if( (ob->partype & 15)==PARSKEL ) {
+ if( (ob->partype & PARTYPE)==PARSKEL ) {
VECCOPY(ob->orig, par->obmat[3]);
}
else {
@@ -2215,7 +2281,7 @@ void what_does_parent(Scene *scene, Object *ob, Object *workob)
where_is_object(scene, workob);
}
-BoundBox *unit_boundbox()
+BoundBox *unit_boundbox(void)
{
BoundBox *bb;
float min[3] = {-1.0f,-1.0f,-1.0f}, max[3] = {-1.0f,-1.0f,-1.0f};
@@ -2516,46 +2582,64 @@ void object_handle_update(Scene *scene, Object *ob)
if (G.f & G_DEBUG)
printf("recalcdata %s\n", ob->id.name+2);
- /* includes all keys and modifiers */
- if(ob->type==OB_MESH) {
- BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
-
+
+ if(adt) {
/* evaluate drivers */
- // XXX: should we push this to derivedmesh instead?
+ // XXX: for mesh types, should we push this to derivedmesh instead?
BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
+
- // here was vieweditdatamask? XXX
- if(em) {
- makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH);
- } else
- makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
}
- else if(ob->type==OB_MBALL) {
- makeDispListMBall(scene, ob);
- }
- else if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- makeDispListCurveTypes(scene, ob, 0);
- }
- else if(ELEM(ob->type, OB_CAMERA, OB_LAMP)) {
- /* evaluate drivers */
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
- }
- else if(ob->type==OB_LATTICE) {
- lattice_calc_modifiers(scene, ob);
- }
- else if(ob->type==OB_ARMATURE) {
- /* evaluate drivers */
- BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
-
+
+ /* includes all keys and modifiers */
+ switch(ob->type) {
+ case OB_MESH:
+ {
+#if 0 // XXX, comment for 2.56a release, background wont set 'scene->customdata_mask'
+ BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
+ BLI_assert((scene->customdata_mask & CD_MASK_BAREMESH) == CD_MASK_BAREMESH);
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask); /* was CD_MASK_BAREMESH */
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask);
+
+#else /* ensure CD_MASK_BAREMESH for now */
+ BMEditMesh *em = (ob == scene->obedit)? ((Mesh*)ob->data)->edit_btmesh : NULL;
+ if(em) {
+ makeDerivedMesh(scene, ob, em, scene->customdata_mask | CD_MASK_BAREMESH); /* was CD_MASK_BAREMESH */
+ } else
+ makeDerivedMesh(scene, ob, NULL, scene->customdata_mask | CD_MASK_BAREMESH);
+#endif
+
+ }
+ break;
+
+ case OB_ARMATURE:
if(ob->id.lib && ob->proxy_from) {
- copy_pose_result(ob->pose, ob->proxy_from->pose);
// printf("pose proxy copy, lib ob %s proxy %s\n", ob->id.name, ob->proxy_from->id.name);
+ copy_pose_result(ob->pose, ob->proxy_from->pose);
}
else {
where_is_pose(scene, ob);
}
+ break;
+
+ case OB_MBALL:
+ makeDispListMBall(scene, ob);
+ break;
+
+ case OB_CURVE:
+ case OB_SURF:
+ case OB_FONT:
+ makeDispListCurveTypes(scene, ob, 0);
+ break;
+
+ case OB_LATTICE:
+ lattice_calc_modifiers(scene, ob);
+ break;
}
+
if(ob->particlesystem.first) {
ParticleSystem *tpsys, *psys;
DerivedMesh *dm;
@@ -2879,7 +2963,7 @@ void object_delete_ptcache(Object *ob, int index)
/* shape key utility function */
/************************* Mesh ************************/
-static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_meshkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Mesh *me= ob->data;
Key *key= me->key;
@@ -2910,7 +2994,7 @@ static KeyBlock *insert_meshkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Lattice ************************/
-static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Lattice *lt= ob->data;
Key *key= lt->key;
@@ -2942,7 +3026,7 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, char *name, int from_m
return kb;
}
/************************* Curve ************************/
-static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_mix)
+static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int from_mix)
{
Curve *cu= ob->data;
Key *key= cu->key;
@@ -2978,7 +3062,7 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, char *name, int from_
return kb;
}
-KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, char *name, int from_mix)
+KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, const char *name, int from_mix)
{
if(ob->type==OB_MESH) return insert_meshkey(scene, ob, name, from_mix);
else if ELEM(ob->type, OB_CURVE, OB_SURF)return insert_curvekey(scene, ob, name, from_mix);
diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c
index 919a724d1ec..981b3b31e71 100644
--- a/source/blender/blenkernel/intern/packedFile.c
+++ b/source/blender/blenkernel/intern/packedFile.c
@@ -1,4 +1,4 @@
-/**
+/*
* blenkernel/packedFile.c - (cleaned up mar-01 nzc)
*
* $Id$
@@ -47,6 +47,7 @@
#include "DNA_packedFile_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_utildefines.h"
#include "BKE_global.h"
@@ -162,7 +163,7 @@ PackedFile *newPackedFileMemory(void *mem, int memlen)
return pf;
}
-PackedFile *newPackedFile(ReportList *reports, char *filename)
+PackedFile *newPackedFile(ReportList *reports, const char *filename)
{
PackedFile *pf = NULL;
int file, filelen;
@@ -179,7 +180,7 @@ PackedFile *newPackedFile(ReportList *reports, char *filename)
// convert relative filenames to absolute filenames
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
// open the file
// and create a PackedFile structure
@@ -214,13 +215,20 @@ void packAll(Main *bmain, ReportList *reports)
Image *ima;
VFont *vf;
bSound *sound;
-
- for(ima=bmain->image.first; ima; ima=ima->id.next)
- if(ima->packedfile == NULL && ima->id.lib==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE))
- ima->packedfile = newPackedFile(reports, ima->name);
+
+ for(ima=bmain->image.first; ima; ima=ima->id.next) {
+ if(ima->packedfile == NULL && ima->id.lib==NULL) {
+ if(ima->source==IMA_SRC_FILE) {
+ ima->packedfile = newPackedFile(reports, ima->name);
+ }
+ else if(ELEM(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
+ BKE_reportf(reports, RPT_WARNING, "Image '%s' skipped, movies and image sequences not supported.", ima->id.name+2);
+ }
+ }
+ }
for(vf=bmain->vfont.first; vf; vf=vf->id.next)
- if(vf->packedfile == NULL && vf->id.lib==NULL && strcmp(vf->name, "<builtin>") != 0)
+ if(vf->packedfile == NULL && vf->id.lib==NULL && strcmp(vf->name, FO_BUILTIN_NAME) != 0)
vf->packedfile = newPackedFile(reports, vf->name);
for(sound=bmain->sound.first; sound; sound=sound->id.next)
@@ -256,7 +264,7 @@ static char *find_new_name(char *name)
*/
-int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int guimode)
+int writePackedFile(ReportList *reports, const char *filename, PackedFile *pf, int guimode)
{
int file, number, remove_tmp = FALSE;
int ret_value = RET_OK;
@@ -267,7 +275,7 @@ int writePackedFile(ReportList *reports, char *filename, PackedFile *pf, int gui
if (guimode) {} //XXX waitcursor(1);
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
if (BLI_exists(name)) {
for (number = 1; number <= 999; number++) {
@@ -324,7 +332,7 @@ PF_NOFILE - the original file doens't exist
*/
-int checkPackedFile(char *filename, PackedFile *pf)
+int checkPackedFile(const char *filename, PackedFile *pf)
{
struct stat st;
int ret_val, i, len, file;
@@ -332,7 +340,7 @@ int checkPackedFile(char *filename, PackedFile *pf)
char name[FILE_MAXDIR + FILE_MAXFILE];
strcpy(name, filename);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
if (stat(name, &st)) {
ret_val = PF_NOFILE;
@@ -451,7 +459,7 @@ int unpackVFont(ReportList *reports, VFont *vfont, int how)
if (newname != NULL) {
ret_value = RET_OK;
freePackedFile(vfont->packedfile);
- vfont->packedfile = 0;
+ vfont->packedfile = NULL;
strcpy(vfont->name, newname);
MEM_freeN(newname);
}
@@ -460,7 +468,7 @@ int unpackVFont(ReportList *reports, VFont *vfont, int how)
return (ret_value);
}
-int unpackSound(ReportList *reports, bSound *sound, int how)
+int unpackSound(Main *bmain, ReportList *reports, bSound *sound, int how)
{
char localname[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
char *newname;
@@ -477,9 +485,9 @@ int unpackSound(ReportList *reports, bSound *sound, int how)
MEM_freeN(newname);
freePackedFile(sound->packedfile);
- sound->packedfile = 0;
+ sound->packedfile = NULL;
- sound_load(NULL, sound);
+ sound_load(bmain, sound);
ret_value = RET_OK;
}
@@ -529,6 +537,6 @@ void unpackAll(Main *bmain, ReportList *reports, int how)
for(sound=bmain->sound.first; sound; sound=sound->id.next)
if(sound->packedfile)
- unpackSound(reports, sound, how);
+ unpackSound(bmain, reports, sound, how);
}
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index ffb99c10c40..e53888127f2 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1,4 +1,6 @@
/*
+ * $Id$
+ *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -23,7 +25,7 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- */
+ */
#include "DNA_object_types.h"
@@ -31,6 +33,9 @@
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_brush.h"
#include "BKE_library.h"
#include "BKE_paint.h"
@@ -100,7 +105,7 @@ void paint_init(Paint *p, const char col[3])
p->flags |= PAINT_SHOW_BRUSH;
}
-void free_paint(Paint *paint)
+void free_paint(Paint *UNUSED(paint))
{
/* nothing */
}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index dbc598071f9..4b3b30e6cd2 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -46,6 +46,8 @@
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_kdtree.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
@@ -62,7 +64,7 @@
#include "BKE_group.h"
#include "BKE_main.h"
#include "BKE_lattice.h"
-#include "BKE_utildefines.h"
+
#include "BKE_displist.h"
#include "BKE_particle.h"
#include "BKE_object.h"
@@ -77,8 +79,6 @@
#include "RE_render_ext.h"
-static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index,
- float *fuv, float *orco, ParticleTexture *ptex, int event);
static void get_child_modifier_parameters(ParticleSettings *part, ParticleThreadContext *ctx,
ChildParticle *cpa, short cpa_from, int cpa_num, float *cpa_fuv, float *orco, ParticleTexture *ptex);
static void do_child_modifiers(ParticleSimulationData *sim,
@@ -159,21 +159,21 @@ static void psys_free_path_cache_buffers(ParticleCacheKey **cache, ListBase *buf
ParticleSystem *psys_get_current(Object *ob)
{
ParticleSystem *psys;
- if(ob==0) return 0;
+ if(ob==NULL) return NULL;
for(psys=ob->particlesystem.first; psys; psys=psys->next){
if(psys->flag & PSYS_CURRENT)
return psys;
}
- return 0;
+ return NULL;
}
short psys_get_current_num(Object *ob)
{
ParticleSystem *psys;
short i;
- if(ob==0) return 0;
+ if(ob==NULL) return 0;
for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++)
if(psys->flag & PSYS_CURRENT)
@@ -186,7 +186,7 @@ void psys_set_current_num(Object *ob, int index)
ParticleSystem *psys;
short i;
- if(ob==0) return;
+ if(ob==NULL) return;
for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++) {
if(i == index)
@@ -197,7 +197,7 @@ void psys_set_current_num(Object *ob, int index)
}
Object *psys_find_object(Scene *scene, ParticleSystem *psys)
{
- Base *base = scene->base.first;
+ Base *base;
ParticleSystem *tpsys;
for(base = scene->base.first; base; base = base->next) {
@@ -211,7 +211,7 @@ Object *psys_find_object(Scene *scene, ParticleSystem *psys)
}
Object *psys_get_lattice(ParticleSimulationData *sim)
{
- Object *lattice=0;
+ Object *lattice=NULL;
if(psys_in_edit_mode(sim->scene, sim->psys)==0){
@@ -225,7 +225,7 @@ Object *psys_get_lattice(ParticleSimulationData *sim)
}
}
if(lattice)
- init_latt_deform(lattice,0);
+ init_latt_deform(lattice, NULL);
}
return lattice;
@@ -273,7 +273,7 @@ int psys_check_enabled(Object *ob, ParticleSystem *psys)
}
psmd= psys_get_modifier(ob, psys);
- if(psys->renderdata) {
+ if(psys->renderdata || G.rendering) {
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
}
@@ -360,7 +360,7 @@ int psys_uses_gravity(ParticleSimulationData *sim)
/************************************************/
/* Freeing stuff */
/************************************************/
-void fluid_free_settings(SPHFluidSettings *fluid)
+static void fluid_free_settings(SPHFluidSettings *fluid)
{
if(fluid)
MEM_freeN(fluid);
@@ -368,6 +368,8 @@ void fluid_free_settings(SPHFluidSettings *fluid)
void psys_free_settings(ParticleSettings *part)
{
+ MTex *mtex;
+ int a;
BKE_free_animdata(&part->id);
free_partdeflect(part->pd);
free_partdeflect(part->pd2);
@@ -379,15 +381,18 @@ void psys_free_settings(ParticleSettings *part)
boid_free_settings(part->boids);
fluid_free_settings(part->fluid);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ mtex= part->mtex[a];
+ if(mtex && mtex->tex) mtex->tex->id.us--;
+ if(mtex) MEM_freeN(mtex);
+ }
}
-void free_hair(Object *ob, ParticleSystem *psys, int dynamics)
+void free_hair(Object *UNUSED(ob), ParticleSystem *psys, int dynamics)
{
PARTICLE_P;
- if(psys->part->type != PART_HAIR)
- return;
-
LOOP_PARTICLES {
if(pa->hair)
MEM_freeN(pa->hair);
@@ -406,9 +411,10 @@ void free_hair(Object *ob, ParticleSystem *psys, int dynamics)
modifier_free((ModifierData*)psys->clmd);
psys->clmd = NULL;
+ psys->pointcache = BKE_ptcache_add(&psys->ptcaches);
}
else {
- cloth_free_modifier(ob, psys->clmd);
+ cloth_free_modifier(psys->clmd);
}
}
@@ -463,7 +469,7 @@ void psys_free_children(ParticleSystem *psys)
{
if(psys->child) {
MEM_freeN(psys->child);
- psys->child=0;
+ psys->child= NULL;
psys->totchild=0;
}
@@ -533,7 +539,7 @@ void psys_free(Object *ob, ParticleSystem * psys)
if(psys->child){
MEM_freeN(psys->child);
- psys->child = 0;
+ psys->child = NULL;
psys->totchild = 0;
}
@@ -554,7 +560,7 @@ void psys_free(Object *ob, ParticleSystem * psys)
if(psys->part){
psys->part->id.us--;
- psys->part=0;
+ psys->part=NULL;
}
BKE_ptcache_free_list(&psys->ptcaches);
@@ -563,6 +569,9 @@ void psys_free(Object *ob, ParticleSystem * psys)
BLI_freelistN(&psys->targets);
BLI_kdtree_free(psys->tree);
+
+ if(psys->fluid_springs)
+ MEM_freeN(psys->fluid_springs);
pdEndEffectors(&psys->effectors);
@@ -1000,6 +1009,8 @@ static float interpolate_particle_value(float v1, float v2, float v3, float v4,
value= w[0]*v1 + w[1]*v2 + w[2]*v3;
if(four)
value += w[3]*v4;
+
+ CLAMP(value, 0.f, 1.f);
return value;
}
@@ -1055,9 +1066,10 @@ typedef struct ParticleInterpolationData {
} ParticleInterpolationData;
/* Assumes pointcache->mem_cache exists, so for disk cached particles call psys_make_temp_pointcache() before use */
/* It uses ParticleInterpolationData->pm to store the current memory cache frame so it's thread safe. */
-static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2)
+static void get_pointcache_keys_for_time(Object *UNUSED(ob), PointCache *cache, PTCacheMem **cur, int index, float t, ParticleKey *key1, ParticleKey *key2)
{
static PTCacheMem *pm = NULL;
+ int index1, index2;
if(index < 0) { /* initialize */
*cur = cache->mem_cache.first;
@@ -1072,15 +1084,19 @@ static void get_pointcache_keys_for_time(Object *ob, PointCache *cache, PTCacheM
pm = *cur;
- BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame);
- if(pm->prev->index_array && pm->prev->index_array[index] == 0)
+ index2 = BKE_ptcache_mem_index_find(pm, index);
+ index1 = BKE_ptcache_mem_index_find(pm->prev, index);
+
+ BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
+ if(index1 < 0)
copy_particle_key(key1, key2, 1);
else
- BKE_ptcache_make_particle_key(key1, pm->prev->index_array ? pm->prev->index_array[index] - 1 : index, pm->prev->data, (float)pm->prev->frame);
+ BKE_ptcache_make_particle_key(key1, index1, pm->prev->data, (float)pm->prev->frame);
}
else if(cache->mem_cache.first) {
pm = cache->mem_cache.first;
- BKE_ptcache_make_particle_key(key2, pm->index_array ? pm->index_array[index] - 1 : index, pm->data, (float)pm->frame);
+ index2 = BKE_ptcache_mem_index_find(pm, index);
+ BKE_ptcache_make_particle_key(key2, index2, pm->data, (float)pm->frame);
copy_particle_key(key1, key2, 1);
}
}
@@ -1091,14 +1107,7 @@ static int get_pointcache_times_for_particle(PointCache *cache, int index, float
int ret = 0;
for(pm=cache->mem_cache.first; pm; pm=pm->next) {
- if(pm->index_array) {
- if(pm->index_array[index]) {
- *start = pm->frame;
- ret++;
- break;
- }
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0) {
*start = pm->frame;
ret++;
break;
@@ -1106,14 +1115,7 @@ static int get_pointcache_times_for_particle(PointCache *cache, int index, float
}
for(pm=cache->mem_cache.last; pm; pm=pm->prev) {
- if(pm->index_array) {
- if(pm->index_array[index]) {
- *end = pm->frame;
- ret++;
- break;
- }
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0) {
*end = pm->frame;
ret++;
break;
@@ -1128,13 +1130,8 @@ float psys_get_dietime_from_cache(PointCache *cache, int index) {
int dietime = 10000000; /* some max value so that we can default to pa->time+lifetime */
for(pm=cache->mem_cache.last; pm; pm=pm->prev) {
- if(pm->index_array) {
- if(pm->index_array[index])
- return (float)pm->frame;
- }
- else {
+ if(BKE_ptcache_mem_index_find(pm, index) >= 0)
return (float)pm->frame;
- }
}
return (float)dietime;
@@ -1161,7 +1158,7 @@ static void init_particle_interpolation(Object *ob, ParticleSystem *psys, Partic
pind->dietime = (key + pa->totkey - 1)->time;
}
else if(pind->cache) {
- float start, end;
+ float start=0.0f, end=0.0f;
get_pointcache_keys_for_time(ob, pind->cache, &pind->pm, -1, 0.0f, NULL, NULL);
pind->birthtime = pa ? pa->time : pind->cache->startframe;
pind->dietime = pa ? pa->dietime : pind->cache->endframe;
@@ -1205,12 +1202,12 @@ static void mvert_to_particle(ParticleKey *key, MVert *mvert, HairKey *hkey)
key->time = hkey->time;
}
-static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, float frs_sec, ParticleInterpolationData *pind, ParticleKey *result)
+static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData *pa, float t, ParticleInterpolationData *pind, ParticleKey *result)
{
PTCacheEditPoint *point = pind->epoint;
ParticleKey keys[4];
int point_vel = (point && point->keys->vel);
- float real_t, dfra, keytime;
+ float real_t, dfra, keytime, invdt;
/* billboards wont fill in all of these, so start cleared */
memset(keys, 0, sizeof(keys));
@@ -1349,11 +1346,12 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
dfra = keys[2].time - keys[1].time;
keytime = (real_t - keys[1].time) / dfra;
+ invdt = dfra * 0.04f * psys->part->timetweak;
/* convert velocity to timestep size */
if(pind->keyed || pind->cache || point_vel){
- mul_v3_fl(keys[1].vel, dfra / frs_sec);
- mul_v3_fl(keys[2].vel, dfra / frs_sec);
+ mul_v3_fl(keys[1].vel, invdt);
+ mul_v3_fl(keys[2].vel, invdt);
interp_qt_qtqt(result->rot,keys[1].rot,keys[2].rot,keytime);
}
@@ -1364,7 +1362,7 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
/* the velocity needs to be converted back from cubic interpolation */
if(pind->keyed || pind->cache || point_vel)
- mul_v3_fl(result->vel, frs_sec / dfra);
+ mul_v3_fl(result->vel, 1.f/invdt);
}
/************************************************/
/* Particles on a dm */
@@ -1480,7 +1478,7 @@ void psys_interpolate_face(MVert *mvert, MFace *mface, MTFace *tface, float (*or
}
else {
VECCOPY(orco, vec);
- if(ornor)
+ if(ornor && nor)
VECCOPY(ornor, nor);
}
}
@@ -1650,7 +1648,7 @@ int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, float *
return DMCACHE_NOTFOUND;
}
-static int psys_map_index_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, int *mapindex, float *mapfw)
+static int psys_map_index_on_dm(DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float UNUSED(foffset), int *mapindex, float *mapfw)
{
if(index < 0)
return 0;
@@ -1806,7 +1804,7 @@ ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
/* Particles on a shape */
/************************************************/
/* ready for future use */
-static void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
+static void psys_particle_on_shape(int UNUSED(distr), int UNUSED(index), float *UNUSED(fuv), float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor)
{
/* TODO */
float zerovec[3]={0.0f,0.0f,0.0f};
@@ -1835,9 +1833,11 @@ static void psys_particle_on_shape(int distr, int index, float *fuv, float *vec,
void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor){
if(psmd){
if(psmd->psys->part->distr==PART_DISTR_GRID && psmd->psys->part->from != PART_FROM_VERT){
- if(vec){
- VECCOPY(vec,fuv);
- }
+ if(vec)
+ copy_v3_v3(vec,fuv);
+
+ if(orco)
+ copy_v3_v3(orco, fuv);
return;
}
/* we cant use the num_dmcache */
@@ -1865,144 +1865,186 @@ static float vert_weight(MDeformVert *dvert, int group)
return 0.0;
}
-static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, short type, short axis, float obmat[][4])
+static void do_kink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, float flat, short type, short axis, float obmat[][4], int smooth_start)
{
- float vec[3]={0.0,0.0,0.0}, q1[4]={1,0,0,0},q2[4];
- float t;
+ float kink[3]={1.f,0.f,0.f}, par_vec[3], q1[4]={1.f,0.f,0.f,0.f};
+ float t, dt=1.f, result[3];
- CLAMP(time,0.0,1.0);
+ if(par == NULL || type == PART_KINK_NO)
+ return;
+
+ CLAMP(time, 0.f, 1.f);
if(shape!=0.0f && type!=PART_KINK_BRAID) {
if(shape<0.0f)
- time= (float)pow(time, 1.0+shape);
+ time= (float)pow(time, 1.f+shape);
else
- time= (float)pow(time, 1.0/(1.0-shape));
+ time= (float)pow(time, 1.f/(1.f-shape));
}
- t=time;
+ t = time * freq *(float)M_PI;
+
+ if(smooth_start) {
+ dt = fabs(t);
+ /* smooth the beginning of kink */
+ CLAMP(dt, 0.f, (float)M_PI);
+ dt = sin(dt/2.f);
+ }
- t*=(float)M_PI*freq;
+ if(type != PART_KINK_RADIAL) {
+ float temp[3];
- if(par==0) return;
+ kink[axis]=1.f;
- switch(type){
- case PART_KINK_CURL:
- vec[axis]=1.0;
- if(par_rot)
- QUATCOPY(q2,par_rot)
- else
- vec_to_quat( q2,par->vel,axis,(axis+1)%3);
- mul_qt_v3(q2,vec);
- mul_v3_fl(vec,amplitude);
- VECADD(state->co,state->co,vec);
+ if(obmat)
+ mul_mat3_m4_v3(obmat, kink);
+
+ if(par_rot)
+ mul_qt_v3(par_rot, kink);
- VECSUB(vec,state->co,par->co);
+ /* make sure kink is normal to strand */
+ project_v3_v3v3(temp, kink, par->vel);
+ sub_v3_v3(kink, temp);
+ normalize_v3(kink);
+ }
- if(t!=0.0)
- axis_angle_to_quat(q1,par->vel,t);
-
- mul_qt_v3(q1,vec);
-
- VECADD(state->co,par->co,vec);
- break;
- case PART_KINK_RADIAL:
- VECSUB(vec,state->co,par->co);
+ copy_v3_v3(result, state->co);
+ sub_v3_v3v3(par_vec, par->co, state->co);
- normalize_v3(vec);
- mul_v3_fl(vec,amplitude*(float)sin(t));
+ switch(type) {
+ case PART_KINK_CURL:
+ {
+ mul_v3_fl(par_vec, -1.f);
- VECADD(state->co,state->co,vec);
- break;
- case PART_KINK_WAVE:
- vec[axis]=1.0;
- if(obmat)
- mul_mat3_m4_v3(obmat,vec);
+ if(flat > 0.f) {
+ float proj[3];
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(par_vec, proj, -flat);
- if(par_rot)
- mul_qt_v3(par_rot,vec);
+ project_v3_v3v3(proj, par_vec, kink);
+ madd_v3_v3fl(par_vec, proj, -flat);
+ }
- project_v3_v3v3(q1,vec,par->vel);
-
- VECSUB(vec,vec,q1);
- normalize_v3(vec);
+ axis_angle_to_quat(q1, kink, (float)M_PI/2.f);
- mul_v3_fl(vec,amplitude*(float)sin(t));
+ mul_qt_v3(q1, par_vec);
- VECADD(state->co,state->co,vec);
- break;
- case PART_KINK_BRAID:
- if(par){
- float y_vec[3]={0.0,1.0,0.0};
- float z_vec[3]={0.0,0.0,1.0};
- float vec_from_par[3], vec_one[3], radius, state_co[3];
- float inp_y,inp_z,length;
-
- if(par_rot)
- QUATCOPY(q2,par_rot)
- else
- vec_to_quat(q2,par->vel,axis,(axis+1)%3);
- mul_qt_v3(q2,y_vec);
- mul_qt_v3(q2,z_vec);
-
- VECSUB(vec_from_par,state->co,par->co);
- radius= normalize_v3_v3(vec_one, vec_from_par);
+ madd_v3_v3fl(par_vec, kink, amplitude);
- inp_y=dot_v3v3(y_vec,vec_one);
- inp_z=dot_v3v3(z_vec,vec_one);
+ /* rotate kink vector around strand tangent */
+ if(t!=0.f) {
+ axis_angle_to_quat(q1, par->vel, t);
+ mul_qt_v3(q1, par_vec);
+ }
- if(inp_y>0.5){
- VECCOPY(state_co,y_vec);
+ add_v3_v3v3(result, par->co, par_vec);
+ break;
+ }
+ case PART_KINK_RADIAL:
+ {
+ if(flat > 0.f) {
+ float proj[3];
+ /* flatten along strand */
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(result, proj, flat);
+ }
- mul_v3_fl(y_vec,amplitude*(float)cos(t));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)sin(2.0f*t));
- }
- else if(inp_z>0.0){
- VECCOPY(state_co,z_vec);
- mul_v3_fl(state_co,(float)sin(M_PI/3.0f));
- VECADDFAC(state_co,state_co,y_vec,-0.5f);
+ madd_v3_v3fl(result, par_vec, -amplitude*(float)sin(t));
+ break;
+ }
+ case PART_KINK_WAVE:
+ {
+ madd_v3_v3fl(result, kink, amplitude*(float)sin(t));
- mul_v3_fl(y_vec,-amplitude*(float)cos(t + M_PI/3.0f));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)cos(2.0f*t + M_PI/6.0f));
- }
- else{
- VECCOPY(state_co,z_vec);
- mul_v3_fl(state_co,-(float)sin(M_PI/3.0f));
- VECADDFAC(state_co,state_co,y_vec,-0.5f);
+ if(flat > 0.f) {
+ float proj[3];
+ /* flatten along wave */
+ project_v3_v3v3(proj, par_vec, kink);
+ madd_v3_v3fl(result, proj, flat);
- mul_v3_fl(y_vec,amplitude*(float)-sin(t+M_PI/6.0f));
- mul_v3_fl(z_vec,amplitude/2.0f*(float)-sin(2.0f*t+M_PI/3.0f));
- }
+ /* flatten along strand */
+ project_v3_v3v3(proj, par_vec, par->vel);
+ madd_v3_v3fl(result, proj, flat);
+ }
+ break;
+ }
+ case PART_KINK_BRAID:
+ {
+ float y_vec[3]={0.f,1.f,0.f};
+ float z_vec[3]={0.f,0.f,1.f};
+ float vec_one[3], state_co[3];
+ float inp_y, inp_z, length;
+
+ if(par_rot) {
+ mul_qt_v3(par_rot, y_vec);
+ mul_qt_v3(par_rot, z_vec);
+ }
+
+ mul_v3_fl(par_vec, -1.f);
+ normalize_v3_v3(vec_one, par_vec);
- mul_v3_fl(state_co,amplitude);
- VECADD(state_co,state_co,par->co);
- VECSUB(vec_from_par,state->co,state_co);
+ inp_y=dot_v3v3(y_vec, vec_one);
+ inp_z=dot_v3v3(z_vec, vec_one);
- length=normalize_v3(vec_from_par);
- mul_v3_fl(vec_from_par,MIN2(length,amplitude/2.0f));
+ if(inp_y>0.5){
+ copy_v3_v3(state_co, y_vec);
- VECADD(state_co,par->co,y_vec);
- VECADD(state_co,state_co,z_vec);
- VECADD(state_co,state_co,vec_from_par);
+ mul_v3_fl(y_vec, amplitude*(float)cos(t));
+ mul_v3_fl(z_vec, amplitude/2.f*(float)sin(2.f*t));
+ }
+ else if(inp_z>0.0){
+ mul_v3_v3fl(state_co, z_vec, (float)sin(M_PI/3.f));
+ VECADDFAC(state_co,state_co,y_vec,-0.5f);
- shape=(2.0f*(float)M_PI)*(1.0f+shape);
+ mul_v3_fl(y_vec, -amplitude * (float)cos(t + M_PI/3.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)cos(2.f*t + M_PI/6.f));
+ }
+ else{
+ mul_v3_v3fl(state_co, z_vec, -(float)sin(M_PI/3.f));
+ madd_v3_v3fl(state_co, y_vec, -0.5f);
- if(t<shape){
- shape=t/shape;
- shape=(float)sqrt((double)shape);
- interp_v3_v3v3(state->co,state->co,state_co,shape);
- }
- else{
- VECCOPY(state->co,state_co);
- }
- }
- break;
+ mul_v3_fl(y_vec, amplitude * (float)-sin(t + M_PI/6.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)-sin(2.f*t + M_PI/3.f));
+ }
+
+ mul_v3_fl(state_co, amplitude);
+ add_v3_v3(state_co, par->co);
+ sub_v3_v3v3(par_vec, state->co, state_co);
+
+ length = normalize_v3(par_vec);
+ mul_v3_fl(par_vec, MIN2(length, amplitude/2.f));
+
+ add_v3_v3v3(state_co, par->co, y_vec);
+ add_v3_v3(state_co, z_vec);
+ add_v3_v3(state_co, par_vec);
+
+ shape = 2.f*(float)M_PI * (1.f+shape);
+
+ if(t<shape){
+ shape = t/shape;
+ shape = (float)sqrt((double)shape);
+ interp_v3_v3v3(result, result, state_co, shape);
+ }
+ else{
+ copy_v3_v3(result, state_co);
+ }
+ break;
+ }
}
+
+ /* blend the start of the kink */
+ if(dt < 1.f)
+ interp_v3_v3v3(state->co, state->co, result, dt);
+ else
+ copy_v3_v3(state->co, result);
}
-static void do_clump(ParticleKey *state, ParticleKey *par, float time, float clumpfac, float clumppow, float pa_clump)
+static float do_clump(ParticleKey *state, ParticleKey *par, float time, float clumpfac, float clumppow, float pa_clump)
{
+ float clump = 0.f;
+
if(par && clumpfac!=0.0){
- float clump, cpow;
+ float cpow;
if(clumppow<0.0)
cpow=1.0f+clumppow;
@@ -2013,8 +2055,11 @@ static void do_clump(ParticleKey *state, ParticleKey *par, float time, float clu
clump = -clumpfac*pa_clump*(float)pow(1.0-(double)time,(double)cpow);
else
clump = clumpfac*pa_clump*(float)pow((double)time,(double)cpow);
+
interp_v3_v3v3(state->co,state->co,par->co,clump);
}
+
+ return clump;
}
void precalc_guides(ParticleSimulationData *sim, ListBase *effectors)
{
@@ -2127,7 +2172,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
}
par.co[0] = par.co[1] = par.co[2] = 0.0f;
VECCOPY(key.co, vec_to_point);
- do_prekink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, pd->kink, pd->kink_axis, 0);
+ do_kink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, 0.f, pd->kink, pd->kink_axis, 0, 0);
do_clump(&key, &par, guidetime, pd->clump_fac, pd->clump_pow, 1.0f);
VECCOPY(vec_to_point, key.co);
@@ -2188,7 +2233,7 @@ static void do_rough_end(float *loc, float mat[4][4], float t, float fac, float
VECADDFAC(state->co,state->co,mat[0],rough[0]);
VECADDFAC(state->co,state->co,mat[1],rough[1]);
}
-static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheKey *ca, int k, int steps, float *rootco, float effector, float dfra, float cfra, float *length, float *vec)
+static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheKey *ca, int k, int steps, float *UNUSED(rootco), float effector, float UNUSED(dfra), float UNUSED(cfra), float *length, float *vec)
{
float force[3] = {0.0f,0.0f,0.0f};
ParticleKey eff_key;
@@ -2211,12 +2256,13 @@ static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheK
normalize_v3(force);
- VECADDFAC(ca->co, (ca-1)->co, force, *length);
-
- if(k < steps) {
+ if(k < steps)
sub_v3_v3v3(vec, (ca+1)->co, ca->co);
+
+ madd_v3_v3v3fl(ca->co, (ca-1)->co, force, *length);
+
+ if(k < steps)
*length = len_v3(vec);
- }
}
static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *state, float max_length, float *cur_length, float length, float *dvec)
{
@@ -2232,20 +2278,23 @@ static int check_path_length(int k, ParticleCacheKey *keys, ParticleCacheKey *st
return k;
}
}
-static void offset_child(ChildParticle *cpa, ParticleKey *par, ParticleKey *child, float flat, float radius)
+static void offset_child(ChildParticle *cpa, ParticleKey *par, float *par_rot, ParticleKey *child, float flat, float radius)
{
- VECCOPY(child->co,cpa->fuv);
- mul_v3_fl(child->co,radius);
+ copy_v3_v3(child->co, cpa->fuv);
+ mul_v3_fl(child->co, radius);
child->co[0]*=flat;
- VECCOPY(child->vel,par->vel);
-
- mul_qt_v3(par->rot,child->co);
+ copy_v3_v3(child->vel, par->vel);
- QUATCOPY(child->rot,par->rot);
+ if(par_rot) {
+ mul_qt_v3(par_rot, child->co);
+ copy_qt_qt(child->rot, par_rot);
+ }
+ else
+ unit_qt(child->rot);
- VECADD(child->co,child->co,par->co);
+ add_v3_v3(child->co, par->co);
}
float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
{
@@ -2375,12 +2424,9 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
if(totchild==0) return 0;
/* init random number generator */
- if(ctx->sim.psys->part->flag & PART_ANIM_BRANCHING)
- seed= 31415926 + ctx->sim.psys->seed + (int)cfra;
- else
- seed= 31415926 + ctx->sim.psys->seed;
+ seed= 31415926 + ctx->sim.psys->seed;
- if(part->flag & PART_BRANCHING || ctx->editupdate || totchild < 10000)
+ if(ctx->editupdate || totchild < 10000)
totthread= 1;
for(i=0; i<totthread; i++) {
@@ -2423,7 +2469,7 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
}
/* note: this function must be thread safe, except for branching! */
-static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i)
+static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *child_keys, int i)
{
ParticleThreadContext *ctx= thread->ctx;
Object *ob= ctx->sim.ob;
@@ -2431,44 +2477,29 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
ParticleSettings *part = psys->part;
ParticleCacheKey **cache= psys->childcache;
ParticleCacheKey **pcache= psys_in_edit_mode(ctx->sim.scene, psys) ? psys->edit->pathcache : psys->pathcache;
- ParticleCacheKey *state, *par = NULL, *key[4];
- ParticleData *pa=NULL;
+ ParticleCacheKey *child, *par = NULL, *key[4];
ParticleTexture ptex;
- float *cpa_fuv=0, *par_rot=0;
- float co[3], orco[3], ornor[3], hairmat[4][4], t, cpa_1st[3], dvec[3];
- float branch_begin, branch_end, branch_prob, rough_rand;
+ float *cpa_fuv=0, *par_rot=0, rot[4];
+ float orco[3], ornor[3], hairmat[4][4], t, dvec[3], off1[4][3], off2[4][3];
float length, max_length = 1.0f, cur_length = 0.0f;
- float eff_length, eff_vec[3];
+ float eff_length, eff_vec[3], weight[4];
int k, cpa_num;
short cpa_from;
if(!pcache)
return;
- if(part->flag & PART_BRANCHING) {
- branch_begin=rng_getFloat(thread->rng_path);
- branch_end=branch_begin+(1.0f-branch_begin)*rng_getFloat(thread->rng_path);
- branch_prob=rng_getFloat(thread->rng_path);
- rough_rand=rng_getFloat(thread->rng_path);
- }
- else {
- branch_begin= 0.0f;
- branch_end= 0.0f;
- branch_prob= 0.0f;
- rough_rand= 0.0f;
- }
-
- if(i<psys->totpart){
- branch_begin=0.0f;
- branch_end=1.0f;
- branch_prob=0.0f;
- }
-
if(ctx->between){
+ ParticleData *pa = psys->particles + cpa->pa[0];
int w, needupdate;
- float foffset;
-
- if(ctx->editupdate && !(part->flag & PART_BRANCHING)) {
+ float foffset, wsum=0.f;
+ float co[3];
+ float p_min = part->parting_min;
+ float p_max = part->parting_max;
+ /* Virtual parents don't work nicely with parting. */
+ float p_fac = part->parents > 0.f ? 0.f : part->parting_fac;
+
+ if(ctx->editupdate) {
needupdate= 0;
w= 0;
while(w<4 && cpa->pa[w]>=0) {
@@ -2482,223 +2513,223 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
if(!needupdate)
return;
else
- memset(keys, 0, sizeof(*keys)*(ctx->steps+1));
+ memset(child_keys, 0, sizeof(*child_keys)*(ctx->steps+1));
}
/* get parent paths */
- w= 0;
- while(w<4 && cpa->pa[w]>=0){
- key[w] = pcache[cpa->pa[w]];
- w++;
+ for(w=0; w<4; w++) {
+ if(cpa->pa[w] >= 0) {
+ key[w] = pcache[cpa->pa[w]];
+ weight[w] = cpa->w[w];
+ }
+ else {
+ key[w] = pcache[0];
+ weight[w] = 0.f;
+ }
+ }
+
+ /* modify weights to create parting */
+ if(p_fac > 0.f) {
+ for(w=0; w<4; w++) {
+ if(w && weight[w] > 0.f) {
+ float d;
+ if(part->flag & PART_CHILD_LONG_HAIR) {
+ /* For long hair use tip distance/root distance as parting factor instead of root to tip angle. */
+ float d1 = len_v3v3(key[0]->co, key[w]->co);
+ float d2 = len_v3v3((key[0]+key[0]->steps-1)->co, (key[w]+key[w]->steps-1)->co);
+
+ d = d1 > 0.f ? d2/d1 - 1.f : 10000.f;
+ }
+ else {
+ float v1[3], v2[3];
+ sub_v3_v3v3(v1, (key[0]+key[0]->steps-1)->co, key[0]->co);
+ sub_v3_v3v3(v2, (key[w]+key[w]->steps-1)->co, key[w]->co);
+ normalize_v3(v1);
+ normalize_v3(v2);
+
+ d = saacos(dot_v3v3(v1, v2)) * 180.f / M_PI;
+ }
+
+ if(p_max > p_min)
+ d = (d - p_min)/(p_max - p_min);
+ else
+ d = (d - p_min) <= 0.f ? 0.f : 1.f;
+
+ CLAMP(d, 0.f, 1.f);
+
+ if(d > 0.f)
+ weight[w] *= (1.f - d);
+ }
+ wsum += weight[w];
+ }
+ for(w=0; w<4; w++)
+ weight[w] /= wsum;
+
+ interp_v4_v4v4(weight, cpa->w, weight, p_fac);
}
/* get the original coordinates (orco) for texture usage */
cpa_num = cpa->num;
- foffset= cpa->foffset;
+ foffset = cpa->foffset;
cpa_fuv = cpa->fuv;
cpa_from = PART_FROM_FACE;
psys_particle_on_emitter(ctx->sim.psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,co,ornor,0,0,orco,0);
- if(part->path_start==0.0f) {
- /* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
- VECCOPY(cpa_1st,co);
- mul_m4_v3(ob->obmat,cpa_1st);
- }
+ mul_m4_v3(ob->obmat, co);
- pa = psys->particles + cpa->pa[0];
+ for(w=0; w<4; w++)
+ sub_v3_v3v3(off1[w], co, key[w]->co);
psys_mat_hair_to_global(ob, ctx->sim.psmd->dm, psys->part->from, pa, hairmat);
-
- pa=0;
}
else{
- if(ctx->editupdate && !(part->flag & PART_BRANCHING)) {
+ ParticleData *pa = psys->particles + cpa->parent;
+ float co[3];
+ if(ctx->editupdate) {
if(!(psys->edit->points[cpa->parent].flag & PEP_EDIT_RECALC))
return;
- memset(keys, 0, sizeof(*keys)*(ctx->steps+1));
+ memset(child_keys, 0, sizeof(*child_keys)*(ctx->steps+1));
}
/* get the parent path */
- key[0]=pcache[cpa->parent];
+ key[0] = pcache[cpa->parent];
/* get the original coordinates (orco) for texture usage */
- pa=psys->particles+cpa->parent;
-
- cpa_from=part->from;
- cpa_num=pa->num;
- cpa_fuv=pa->fuv;
+ cpa_from = part->from;
+ cpa_num = pa->num;
+ cpa_fuv = pa->fuv;
psys_particle_on_emitter(ctx->sim.psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,ornor,0,0,orco,0);
psys_mat_hair_to_global(ob, ctx->sim.psmd->dm, psys->part->from, pa, hairmat);
}
- keys->steps = ctx->steps;
-
- /* correct child ipo timing */
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME)==0 && part->ipo){
- float dsta=part->end-part->sta;
- calc_ipo(part->ipo, 100.0f*(ctx->cfra-(part->sta+dsta*cpa->rand[1]))/(part->lifetime*(1.0f - part->randlife*cpa->rand[0])));
- execute_ipo((ID *)part, part->ipo);
- }
-#endif // XXX old animation system
+ child_keys->steps = ctx->steps;
/* get different child parameters from textures & vgroups */
get_child_modifier_parameters(part, ctx, cpa, cpa_from, cpa_num, cpa_fuv, orco, &ptex);
if(ptex.exist < PSYS_FRAND(i + 24)) {
- keys->steps = -1;
+ child_keys->steps = -1;
return;
}
/* create the child path */
- for(k=0,state=keys; k<=ctx->steps; k++,state++){
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++){
if(ctx->between){
int w=0;
- state->co[0] = state->co[1] = state->co[2] = 0.0f;
- state->vel[0] = state->vel[1] = state->vel[2] = 0.0f;
- state->rot[0] = state->rot[1] = state->rot[2] = state->rot[3] = 0.0f;
+ zero_v3(child->co);
+ zero_v3(child->vel);
+ unit_qt(child->rot);
- //QUATCOPY(state->rot,key[0]->rot);
+ for(w=0; w<4; w++) {
+ copy_v3_v3(off2[w], off1[w]);
- /* child position is the weighted sum of parent positions */
- while(w<4 && cpa->pa[w]>=0){
- state->co[0] += cpa->w[w] * key[w]->co[0];
- state->co[1] += cpa->w[w] * key[w]->co[1];
- state->co[2] += cpa->w[w] * key[w]->co[2];
-
- state->vel[0] += cpa->w[w] * key[w]->vel[0];
- state->vel[1] += cpa->w[w] * key[w]->vel[1];
- state->vel[2] += cpa->w[w] * key[w]->vel[2];
- key[w]++;
- w++;
- }
- if(part->path_start==0.0f) {
- if(k==0){
- /* calculate the offset between actual child root position and first position interpolated from parents */
- VECSUB(cpa_1st,cpa_1st,state->co);
+ if(part->flag & PART_CHILD_LONG_HAIR) {
+ /* Use parent rotation (in addition to emission location) to determine child offset. */
+ if(k)
+ mul_qt_v3((key[w]+k)->rot, off2[w]);
+
+ /* Fade the effect of rotation for even lengths in the end */
+ project_v3_v3v3(dvec, off2[w], (key[w]+k)->vel);
+ madd_v3_v3fl(off2[w], dvec, -(float)k/(float)ctx->steps);
}
- /* apply offset for correct positioning */
- VECADD(state->co,state->co,cpa_1st);
+
+ add_v3_v3(off2[w], (key[w]+k)->co);
}
+
+ /* child position is the weighted sum of parent positions */
+ interp_v3_v3v3v3v3(child->co, off2[0], off2[1], off2[2], off2[3], weight);
+ interp_v3_v3v3v3v3(child->vel, (key[0]+k)->vel, (key[1]+k)->vel, (key[2]+k)->vel, (key[3]+k)->vel, weight);
+
+ copy_qt_qt(child->rot, (key[0]+k)->rot);
}
else{
+ if(k) {
+ mul_qt_qtqt(rot, (key[0]+k)->rot, key[0]->rot);
+ par_rot = rot;
+ }
+ else {
+ par_rot = key[0]->rot;
+ }
/* offset the child from the parent position */
- offset_child(cpa, (ParticleKey*)key[0], (ParticleKey*)state, part->childflat, part->childrad);
-
- key[0]++;
+ offset_child(cpa, (ParticleKey*)(key[0]+k), par_rot, (ParticleKey*)child, part->childflat, part->childrad);
}
}
/* apply effectors */
if(part->flag & PART_CHILD_EFFECT) {
- for(k=0,state=keys; k<=ctx->steps; k++,state++) {
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++) {
if(k) {
- do_path_effectors(&ctx->sim, cpa->pa[0], state, k, ctx->steps, keys->co, ptex.effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
+ do_path_effectors(&ctx->sim, cpa->pa[0], child, k, ctx->steps, child_keys->co, ptex.effector, 0.0f, ctx->cfra, &eff_length, eff_vec);
}
else {
- sub_v3_v3v3(eff_vec,(state+1)->co,state->co);
- eff_length= len_v3(eff_vec);
+ sub_v3_v3v3(eff_vec, (child+1)->co, child->co);
+ eff_length = len_v3(eff_vec);
}
}
}
- for(k=0,state=keys; k<=ctx->steps; k++,state++){
- t=(float)k/(float)ctx->steps;
+ for(k=0,child=child_keys; k<=ctx->steps; k++,child++){
+ t = (float)k/(float)ctx->steps;
+
+ if(ctx->totparent)
+ /* this is now threadsafe, virtual parents are calculated before rest of children */
+ par = (i >= ctx->totparent) ? cache[cpa->parent] : NULL;
+ else if(cpa->parent >= 0)
+ par = pcache[cpa->parent];
- if(ctx->totparent){
- if(i>=ctx->totparent) {
- /* this is now threadsafe, virtual parents are calculated before rest of children */
- par = cache[cpa->parent] + k;
+ if(par) {
+ if(k) {
+ mul_qt_qtqt(rot, (par+k)->rot, par->rot);
+ par_rot = rot;
}
- else
- par=0;
- }
- else if(cpa->parent>=0){
- par=pcache[cpa->parent]+k;
- par_rot = par->rot;
+ else {
+ par_rot = par->rot;
+ }
+ par += k;
}
/* apply different deformations to the child path */
- do_child_modifiers(&ctx->sim, &ptex, (ParticleKey *)par, par_rot, cpa, orco, hairmat, (ParticleKey *)state, t);
-
- /* TODO: better branching */
- //if(part->flag & PART_BRANCHING && ctx->between == 0 && part->flag & PART_ANIM_BRANCHING)
- // rough_t = t * rough_rand;
- //else
- // rough_t = t;
-
- /* TODO: better branching */
- //if(part->flag & PART_BRANCHING && ctx->between==0){
- // if(branch_prob > part->branch_thres){
- // branchfac=0.0f;
- // }
- // else{
- // if(part->flag & PART_SYMM_BRANCHING){
- // if(t < branch_begin || t > branch_end)
- // branchfac=0.0f;
- // else{
- // if((t-branch_begin)/(branch_end-branch_begin)<0.5)
- // branchfac=2.0f*(t-branch_begin)/(branch_end-branch_begin);
- // else
- // branchfac=2.0f*(branch_end-t)/(branch_end-branch_begin);
-
- // CLAMP(branchfac,0.0f,1.0f);
- // }
- // }
- // else{
- // if(t < branch_begin){
- // branchfac=0.0f;
- // }
- // else{
- // branchfac=(t-branch_begin)/((1.0f-branch_begin)*0.5f);
- // CLAMP(branchfac,0.0f,1.0f);
- // }
- // }
- // }
-
- // if(i<psys->totpart)
- // interp_v3_v3v3(state->co, (pcache[i] + k)->co, state->co, branchfac);
- // else
- // /* this is not threadsafe, but should only happen for
- // * branching particles particles, which are not threaded */
- // interp_v3_v3v3(state->co, (cache[i - psys->totpart] + k)->co, state->co, branchfac);
- //}
+ do_child_modifiers(&ctx->sim, &ptex, (ParticleKey *)par, par_rot, cpa, orco, hairmat, (ParticleKey *)child, t);
/* we have to correct velocity because of kink & clump */
if(k>1){
- VECSUB((state-1)->vel,state->co,(state-2)->co);
- mul_v3_fl((state-1)->vel,0.5);
+ sub_v3_v3v3((child-1)->vel, child->co, (child-2)->co);
+ mul_v3_fl((child-1)->vel, 0.5);
if(ctx->ma && (part->draw & PART_DRAW_MAT_COL))
- get_strand_normal(ctx->ma, ornor, cur_length, (state-1)->vel);
+ get_strand_normal(ctx->ma, ornor, cur_length, (child-1)->vel);
}
if(k == ctx->steps)
- VECSUB(state->vel,state->co,(state-1)->co);
+ sub_v3_v3v3(child->vel, child->co, (child-1)->co);
/* check if path needs to be cut before actual end of data points */
if(k){
- VECSUB(dvec,state->co,(state-1)->co);
- length=1.0f/(float)ctx->steps;
- k=check_path_length(k,keys,state,max_length,&cur_length,length,dvec);
+ sub_v3_v3v3(dvec, child->co, (child-1)->co);
+ length = 1.0f/(float)ctx->steps;
+ k = check_path_length(k, child_keys, child, max_length, &cur_length, length, dvec);
}
else{
/* initialize length calculation */
- max_length= ptex.length;
- cur_length= 0.0f;
+ max_length = ptex.length;
+ cur_length = 0.0f;
}
if(ctx->ma && (part->draw & PART_DRAW_MAT_COL)) {
- VECCOPY(state->col, &ctx->ma->r)
- get_strand_normal(ctx->ma, ornor, cur_length, state->vel);
+ VECCOPY(child->col, &ctx->ma->r)
+ get_strand_normal(ctx->ma, ornor, cur_length, child->vel);
}
}
+
+ /* Hide virtual parents */
+ if(i < ctx->totparent)
+ child_keys->steps = -1;
}
static void *exec_child_path_cache(void *data)
@@ -2724,10 +2755,8 @@ static void *exec_child_path_cache(void *data)
void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupdate)
{
- ParticleSettings *part = sim->psys->part;
ParticleThread *pthreads;
ParticleThreadContext *ctx;
- ParticleCacheKey **cache;
ListBase threads;
int i, totchild, totparent, totthread;
@@ -2745,8 +2774,8 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
totchild= ctx->totchild;
totparent= ctx->totparent;
- if(editupdate && sim->psys->childcache && !(part->flag & PART_BRANCHING) && totchild == sim->psys->totchildcache) {
- cache = sim->psys->childcache;
+ if(editupdate && sim->psys->childcache && totchild == sim->psys->totchildcache) {
+ ; /* just overwrite the existing cache */
}
else {
/* clear out old and create new empty path cache */
@@ -2786,6 +2815,43 @@ void psys_cache_child_paths(ParticleSimulationData *sim, float cfra, int editupd
psys_threads_free(pthreads);
}
+/* figure out incremental rotations along path starting from unit quat */
+static void cache_key_incremental_rotation(ParticleCacheKey *key0, ParticleCacheKey *key1, ParticleCacheKey *key2, float *prev_tangent, int i)
+{
+ float cosangle, angle, tangent[3], normal[3], q[4];
+
+ switch(i) {
+ case 0:
+ /* start from second key */
+ break;
+ case 1:
+ /* calculate initial tangent for incremental rotations */
+ sub_v3_v3v3(prev_tangent, key0->co, key1->co);
+ normalize_v3(prev_tangent);
+ unit_qt(key1->rot);
+ break;
+ default:
+ sub_v3_v3v3(tangent, key0->co, key1->co);
+ normalize_v3(tangent);
+
+ cosangle= dot_v3v3(tangent, prev_tangent);
+
+ /* note we do the comparison on cosangle instead of
+ * angle, since floating point accuracy makes it give
+ * different results across platforms */
+ if(cosangle > 0.999999f) {
+ QUATCOPY(key1->rot, key2->rot);
+ }
+ else {
+ angle= saacos(cosangle);
+ cross_v3_v3v3(normal, prev_tangent, tangent);
+ axis_angle_to_quat( q,normal, angle);
+ mul_qt_qtqt(key1->rot, q, key2->rot);
+ }
+
+ copy_v3_v3(prev_tangent, tangent);
+ }
+}
/* Calculates paths ready for drawing/rendering. */
/* -Usefull for making use of opengl vertex arrays for super fast strand drawing. */
/* -Makes child strands possible and creates them too into the cache. */
@@ -2796,21 +2862,22 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
ParticleEditSettings *pset = &sim->scene->toolsettings->particle;
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
- ParticleCacheKey *ca, **cache= psys->pathcache;
+ ParticleCacheKey *ca, **cache;
- DerivedMesh *hair_dm = psys->hair_out_dm;
+ DerivedMesh *hair_dm = (psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS) ? psys->hair_out_dm : NULL;
ParticleKey result;
Material *ma;
ParticleInterpolationData pind;
+ ParticleTexture ptex;
PARTICLE_P;
float birthtime = 0.0, dietime = 0.0;
- float t, time = 0.0, dfra = 1.0, frs_sec = sim->scene->r.frs_sec;
+ float t, time = 0.0, dfra = 1.0 /* , frs_sec = sim->scene->r.frs_sec*/ /*UNUSED*/;
float col[4] = {0.5f, 0.5f, 0.5f, 1.0f};
- float prev_tangent[3], hairmat[4][4];
+ float prev_tangent[3] = {0.0f, 0.0f, 0.0f}, hairmat[4][4];
float rotmat[3][3];
int k;
int steps = (int)pow(2.0, (double)(psys->renderdata ? part->ren_step : part->draw_step));
@@ -2831,7 +2898,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
BLI_srandom(psys->seed);
keyed = psys->flag & PSYS_KEYED;
- baked = !hair_dm && psys->pointcache->mem_cache.first;
+ baked = psys->pointcache->mem_cache.first && psys->part->type != PART_HAIR;
/* clear out old and create new empty path cache */
psys_free_path_cache(psys, psys->edit);
@@ -2853,8 +2920,8 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/*---first main loop: create all actual particles' paths---*/
LOOP_SHOWN_PARTICLES {
if(!psys->totchild) {
- BLI_srandom(psys->seed + p);
- pa_length = 1.0f - part->randlength * BLI_frand();
+ psys_get_texture(sim, pa, &ptex, PAMAP_LENGTH, 0.f);
+ pa_length = ptex.length * (1.0f - part->randlength * PSYS_FRAND(psys->seed + p));
if(vg_length)
pa_length *= psys_particle_value_from_verts(psmd->dm,part->from,pa,vg_length);
}
@@ -2898,22 +2965,19 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/*--interpolate actual path from data points--*/
for(k=0, ca=cache[p]; k<=steps; k++, ca++){
time = (float)k / (float)steps;
-
t = birthtime + time * (dietime - birthtime);
-
result.time = -t;
-
- do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, &result);
+ do_particle_interpolation(psys, p, pa, t, &pind, &result);
+ copy_v3_v3(ca->co, result.co);
/* dynamic hair is in object space */
/* keyed and baked are already in global space */
if(hair_dm)
- mul_m4_v3(sim->ob->obmat, result.co);
+ mul_m4_v3(sim->ob->obmat, ca->co);
else if(!keyed && !baked && !(psys->flag & PSYS_GLOBAL_HAIR))
- mul_m4_v3(hairmat, result.co);
+ mul_m4_v3(hairmat, ca->co);
- VECCOPY(ca->co, result.co);
- VECCOPY(ca->col, col);
+ copy_v3_v3(ca->col, col);
}
/*--modify paths and calculate rotation & velocity--*/
@@ -2948,54 +3012,25 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
/* finally do rotation & velocity */
for(k=1, ca=cache[p]+1; k<=steps; k++, ca++) {
- /* figure out rotation */
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- /* calculate initial tangent for incremental rotations */
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3_v3(prev_tangent, tangent);
-
- /* First rotation is based on emitting face orientation. */
- /* This is way better than having flipping rotations resulting */
- /* from using a global axis as a rotation pole (vec_to_quat()). */
- /* It's not an ideal solution though since it disregards the */
- /* initial tangent, but taking that in to account will allow */
- /* the possibility of flipping again. -jahka */
- mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3(tangent);
-
- cosangle= dot_v3v3(tangent, prev_tangent);
-
- /* note we do the comparison on cosangle instead of
- * angle, since floating point accuracy makes it give
- * different results across platforms */
- if(cosangle > 0.999999f) {
- QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
- }
- else {
- angle= saacos(cosangle);
- cross_v3_v3v3(normal, prev_tangent, tangent);
- axis_angle_to_quat( q,normal, angle);
- mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
- }
-
- VECCOPY(prev_tangent, tangent);
- }
+ cache_key_incremental_rotation(ca, ca - 1, ca - 2, prev_tangent, k);
if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
-
+ copy_qt_qt(ca->rot, (ca - 1)->rot);
/* set velocity */
- VECSUB(ca->vel, ca->co, (ca-1)->co);
+ sub_v3_v3v3(ca->vel, ca->co, (ca-1)->co);
if(k==1)
- VECCOPY((ca-1)->vel, ca->vel);
+ copy_v3_v3((ca-1)->vel, ca->vel);
}
+ /* First rotation is based on emitting face orientation.
+ * This is way better than having flipping rotations resulting
+ * from using a global axis as a rotation pole (vec_to_quat()).
+ * It's not an ideal solution though since it disregards the
+ * initial tangent, but taking that in to account will allow
+ * the possibility of flipping again. -jahka
+ */
+ mat3_to_quat_is_ok(cache[p]->rot, rotmat);
}
psys->totcached = totpart;
@@ -3028,7 +3063,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
float birthtime = 0.0, dietime = 0.0;
float t, time = 0.0, keytime = 0.0, frs_sec;
- float hairmat[4][4], rotmat[3][3], prev_tangent[3];
+ float hairmat[4][4], rotmat[3][3], prev_tangent[3] = {0.0f, 0.0f, 0.0f};
int k, i;
int steps = (int)pow(2.0, (double)pset->draw_step);
int totpart = edit->totpoint, recalc_set=0;
@@ -3050,12 +3085,8 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
frs_sec = (psys || edit->pid.flag & PTCACHE_VEL_PER_SEC) ? 25.0f : 1.0f;
- if(pset->brushtype == PE_BRUSH_WEIGHT){
- /* use weight painting colors now... */
-#if 0
- sel_col[0] = sel_col[1] = sel_col[2] = 1.0f;
- nosel_col[0] = nosel_col[1] = nosel_col[2] = 0.0f;
-#endif
+ if(pset->brushtype == PE_BRUSH_WEIGHT) {
+ ;/* use weight painting colors now... */
}
else{
sel_col[0] = (float)edit->sel_col[0] / 255.0f;
@@ -3083,6 +3114,7 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
/* should init_particle_interpolation set this ? */
if(pset->brushtype==PE_BRUSH_WEIGHT){
pind.hkey[0] = NULL;
+ /* pa != NULL since the weight brush is only available for hair */
pind.hkey[1] = pa->hair;
}
@@ -3096,9 +3128,9 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
if(psys) {
psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
- VECCOPY(rotmat[0], hairmat[2]);
- VECCOPY(rotmat[1], hairmat[1]);
- VECCOPY(rotmat[2], hairmat[0]);
+ copy_v3_v3(rotmat[0], hairmat[2]);
+ copy_v3_v3(rotmat[1], hairmat[1]);
+ copy_v3_v3(rotmat[2], hairmat[0]);
}
birthtime = pind.birthtime;
@@ -3112,66 +3144,32 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
/*--interpolate actual path from data points--*/
for(k=0, ca=cache[i]; k<=steps; k++, ca++){
time = (float)k / (float)steps;
-
t = birthtime + time * (dietime - birthtime);
-
result.time = -t;
-
- do_particle_interpolation(psys, i, pa, t, frs_sec, &pind, &result);
+ do_particle_interpolation(psys, i, pa, t, &pind, &result);
+ copy_v3_v3(ca->co, result.co);
/* non-hair points are already in global space */
if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
- mul_m4_v3(hairmat, result.co);
+ mul_m4_v3(hairmat, ca->co);
- /* create rotations for proper creation of children */
if(k) {
- float cosangle, angle, tangent[3], normal[3], q[4];
-
- if(k == 1) {
- /* calculate initial tangent for incremental rotations */
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3_v3(prev_tangent, tangent);
-
- /* First rotation is based on emitting face orientation. */
- /* This is way better than having flipping rotations resulting */
- /* from using a global axis as a rotation pole (vec_to_quat()). */
- /* It's not an ideal solution though since it disregards the */
- /* initial tangent, but taking that in to account will allow */
- /* the possibility of flipping again. -jahka */
- mat3_to_quat_is_ok( (ca-1)->rot,rotmat);
- }
- else {
- VECSUB(tangent, ca->co, (ca - 1)->co);
- normalize_v3(tangent);
-
- cosangle= dot_v3v3(tangent, prev_tangent);
-
- /* note we do the comparison on cosangle instead of
- * angle, since floating point accuracy makes it give
- * different results across platforms */
- if(cosangle > 0.999999f) {
- QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
- }
- else {
- angle= saacos(cosangle);
- cross_v3_v3v3(normal, prev_tangent, tangent);
- axis_angle_to_quat( q,normal, angle);
- mul_qt_qtqt((ca - 1)->rot, q, (ca - 2)->rot);
- }
-
- VECCOPY(prev_tangent, tangent);
- }
+ cache_key_incremental_rotation(ca, ca - 1, ca - 2, prev_tangent, k);
if(k == steps)
- QUATCOPY(ca->rot, (ca - 1)->rot);
- }
-
- }
+ copy_qt_qt(ca->rot, (ca - 1)->rot);
- VECCOPY(ca->co, result.co);
+ /* set velocity */
+ sub_v3_v3v3(ca->vel, ca->co, (ca - 1)->co);
- ca->vel[0] = ca->vel[1] = 0.0f;
- ca->vel[1] = 1.0f;
+ if(k==1)
+ copy_v3_v3((ca - 1)->vel, ca->vel);
+ }
+ }
+ else {
+ ca->vel[0] = ca->vel[1] = 0.0f;
+ ca->vel[1] = 1.0f;
+ }
/* selection coloring in edit mode */
if(pset->brushtype==PE_BRUSH_WEIGHT){
@@ -3219,12 +3217,27 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
ca->time = t;
}
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
+ /* First rotation is based on emitting face orientation.
+ * This is way better than having flipping rotations resulting
+ * from using a global axis as a rotation pole (vec_to_quat()).
+ * It's not an ideal solution though since it disregards the
+ * initial tangent, but taking that in to account will allow
+ * the possibility of flipping again. -jahka
+ */
+ mat3_to_quat_is_ok(cache[i]->rot, rotmat);
+ }
}
edit->totcached = totpart;
if(psys) {
- ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys), NULL};
+ ParticleSimulationData sim= {0};
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(ob, psys);
+
psys_cache_child_paths(&sim, cfra, 1);
}
@@ -3342,7 +3355,7 @@ static void psys_face_mat(Object *ob, DerivedMesh *dm, ParticleData *pa, float m
triatomat(v[0], v[1], v[2], (osface)? osface->uv: NULL, mat);
}
-void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+void psys_mat_hair_to_object(Object *UNUSED(ob), DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
{
float vec[3];
@@ -3384,7 +3397,7 @@ void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleDa
/************************************************/
/* ParticleSettings handling */
/************************************************/
-ModifierData *object_add_particle_system(Scene *scene, Object *ob, char *name)
+ModifierData *object_add_particle_system(Scene *scene, Object *ob, const char *name)
{
ParticleSystem *psys;
ModifierData *md;
@@ -3423,7 +3436,7 @@ ModifierData *object_add_particle_system(Scene *scene, Object *ob, char *name)
psys->cfra=bsystem_time(scene,ob,scene->r.cfra+1,0.0);
DAG_scene_sort(G.main, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return md;
}
@@ -3460,7 +3473,7 @@ void object_remove_particle_system(Scene *scene, Object *ob)
ob->mode &= ~OB_MODE_PARTICLE_EDIT;
DAG_scene_sort(G.main, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void default_particle_settings(ParticleSettings *part)
{
@@ -3471,7 +3484,7 @@ static void default_particle_settings(ParticleSettings *part)
part->bb_uv_split=1;
part->bb_align=PART_BB_VIEW;
part->bb_split_offset=PART_BB_OFF_LINEAR;
- part->flag=PART_REACT_MULTIPLE|PART_HAIR_GEOMETRY|PART_EDISTR|PART_TRAND;
+ part->flag=PART_EDISTR|PART_TRAND|PART_HIDE_ADVANCED_HAIR;
part->sta= 1.0;
part->end= 200.0;
@@ -3490,14 +3503,13 @@ static void default_particle_settings(ParticleSettings *part)
part->adapt_angle= 5;
part->adapt_pix= 3;
part->kink_axis= 2;
+ part->kink_amp_clump= 1.f;
part->reactevent= PART_EVENT_DEATH;
part->disp=100;
part->from= PART_FROM_FACE;
part->normfac= 1.0f;
- part->reactshape=1.0f;
-
part->mass=1.0;
part->size=0.05;
part->childsize=1.0;
@@ -3541,7 +3553,7 @@ static void default_particle_settings(ParticleSettings *part)
}
-ParticleSettings *psys_new_settings(char *name, Main *main)
+ParticleSettings *psys_new_settings(const char *name, Main *main)
{
ParticleSettings *part;
@@ -3558,13 +3570,23 @@ ParticleSettings *psys_new_settings(char *name, Main *main)
ParticleSettings *psys_copy_settings(ParticleSettings *part)
{
ParticleSettings *partn;
-
+ int a;
+
partn= copy_libblock(part);
- if(partn->pd) partn->pd= MEM_dupallocN(part->pd);
- if(partn->pd2) partn->pd2= MEM_dupallocN(part->pd2);
- partn->effector_weights = MEM_dupallocN(part->effector_weights);
+ partn->pd= MEM_dupallocN(part->pd);
+ partn->pd2= MEM_dupallocN(part->pd2);
+ partn->effector_weights= MEM_dupallocN(part->effector_weights);
+ partn->fluid= MEM_dupallocN(part->fluid);
partn->boids = boid_copy_settings(part->boids);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(part->mtex[a]) {
+ partn->mtex[a]= MEM_mallocN(sizeof(MTex), "psys_copy_tex");
+ memcpy(partn->mtex[a], part->mtex[a], sizeof(MTex));
+ id_us_plus((ID *)partn->mtex[a]->tex);
+ }
+ }
return partn;
}
@@ -3671,82 +3693,128 @@ static int get_particle_uv(DerivedMesh *dm, ParticleData *pa, int face_index, fl
return 1;
}
-static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float *fw, float *orco, ParticleTexture *ptex, int event)
+#define SET_PARTICLE_TEXTURE(type, pvalue, texfac) if((event & mtex->mapto) & type) {pvalue = texture_value_blend(def, pvalue, value, texfac, blend);}
+#define CLAMP_PARTICLE_TEXTURE_POS(type, pvalue) if(event & type) { if(pvalue < 0.f) pvalue = 1.f+pvalue; CLAMP(pvalue, 0.0, 1.0); }
+#define CLAMP_PARTICLE_TEXTURE_POSNEG(type, pvalue) if(event & type) { CLAMP(pvalue, -1.0, 1.0); }
+
+static void get_cpa_texture(DerivedMesh *dm, ParticleSystem *psys, ParticleSettings *part, ParticleData *par, int child_index, int face_index, float *fw, float *orco, ParticleTexture *ptex, int event, float cfra)
{
- MTex *mtex;
- int m,setvars=0;
- float value, rgba[4], texco[3];
+ MTex *mtex, **mtexp = part->mtex;
+ int m;
+ float value, rgba[4], texvec[3];
- if(ma) for(m=0; m<MAX_MTEX; m++){
- mtex=ma->mtex[m];
- if(mtex && (ma->septex & (1<<m))==0 && mtex->pmapto){
+ ptex->ivel = ptex->life = ptex->exist = ptex->size = ptex->damp =
+ ptex->gravity = ptex->field = ptex->time = ptex->clump = ptex->kink =
+ ptex->effector = ptex->rough1 = ptex->rough2 = ptex->roughe = 1.f;
+
+ ptex->length= 1.0f - part->randlength * PSYS_FRAND(child_index + 26);
+ ptex->length*= part->clength_thres < PSYS_FRAND(child_index + 27) ? part->clength : 1.0f;
+
+ for(m=0; m<MAX_MTEX; m++, mtexp++){
+ mtex = *mtexp;
+ if(mtex && mtex->mapto){
float def=mtex->def_var;
short blend=mtex->blendtype;
+ short texco = mtex->texco;
- if((mtex->texco & TEXCO_UV) && fw) {
- if(!get_particle_uv(dm, NULL, face_index, fw, mtex->uvname, texco))
- VECCOPY(texco,orco);
- }
- else
- VECCOPY(texco,orco);
+ if(ELEM(texco, TEXCO_UV, TEXCO_ORCO) && (ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME) == 0 || part->distr == PART_DISTR_GRID))
+ texco = TEXCO_GLOB;
- externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
- if((event & mtex->pmapto) & MAP_PA_TIME){
- if((setvars&MAP_PA_TIME)==0){
- ptex->time=0.0;
- setvars|=MAP_PA_TIME;
- }
- ptex->time= texture_value_blend(mtex->def_var,ptex->time,value,mtex->timefac,blend);
+ switch(texco) {
+ case TEXCO_GLOB:
+ copy_v3_v3(texvec, par->state.co);
+ break;
+ case TEXCO_OBJECT:
+ copy_v3_v3(texvec, par->state.co);
+ if(mtex->object)
+ mul_m4_v3(mtex->object->imat, texvec);
+ break;
+ case TEXCO_UV:
+ if(fw && get_particle_uv(dm, NULL, face_index, fw, mtex->uvname, texvec))
+ break;
+ /* no break, failed to get uv's, so let's try orco's */
+ case TEXCO_ORCO:
+ copy_v3_v3(texvec, orco);
+ break;
+ case TEXCO_PARTICLE:
+ /* texture coordinates in range [-1,1] */
+ texvec[0] = 2.f * (cfra - par->time)/(par->dietime-par->time) - 1.f;
+ texvec[1] = 0.f;
+ texvec[2] = 0.f;
+ break;
}
- if((event & mtex->pmapto) & MAP_PA_LENGTH)
- ptex->length= texture_value_blend(def,ptex->length,value,mtex->lengthfac,blend);
- if((event & mtex->pmapto) & MAP_PA_CLUMP)
- ptex->clump= texture_value_blend(def,ptex->clump,value,mtex->clumpfac,blend);
- if((event & mtex->pmapto) & MAP_PA_KINK)
- ptex->kink= texture_value_blend(def,ptex->kink,value,mtex->kinkfac,blend);
- if((event & mtex->pmapto) & MAP_PA_ROUGH)
+
+ externtex(mtex, texvec, &value, rgba, rgba+1, rgba+2, rgba+3, 0);
+
+ if((event & mtex->mapto) & PAMAP_ROUGH)
ptex->rough1= ptex->rough2= ptex->roughe= texture_value_blend(def,ptex->rough1,value,mtex->roughfac,blend);
- if((event & mtex->pmapto) & MAP_PA_DENS)
- ptex->exist= texture_value_blend(def,ptex->exist,value,mtex->padensfac,blend);
+
+ SET_PARTICLE_TEXTURE(PAMAP_LENGTH, ptex->length, mtex->lengthfac);
+ SET_PARTICLE_TEXTURE(PAMAP_CLUMP, ptex->clump, mtex->clumpfac);
+ SET_PARTICLE_TEXTURE(PAMAP_KINK, ptex->kink, mtex->kinkfac);
+ SET_PARTICLE_TEXTURE(PAMAP_DENS, ptex->exist, mtex->padensfac);
}
}
- if(event & MAP_PA_TIME) { CLAMP(ptex->time,0.0,1.0); }
- if(event & MAP_PA_LENGTH) { CLAMP(ptex->length,0.0,1.0); }
- if(event & MAP_PA_CLUMP) { CLAMP(ptex->clump,0.0,1.0); }
- if(event & MAP_PA_KINK) { CLAMP(ptex->kink,0.0,1.0); }
- if(event & MAP_PA_ROUGH) {
- CLAMP(ptex->rough1,0.0,1.0);
- CLAMP(ptex->rough2,0.0,1.0);
- CLAMP(ptex->roughe,0.0,1.0);
- }
- if(event & MAP_PA_DENS) { CLAMP(ptex->exist,0.0,1.0); }
+
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_LENGTH, ptex->length);
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_CLUMP, ptex->clump);
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_KINK, ptex->kink);
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_ROUGH, ptex->rough1);
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_DENS, ptex->exist);
}
-void psys_get_texture(ParticleSimulationData *sim, Material *ma, ParticleData *pa, ParticleTexture *ptex, int event)
+void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTexture *ptex, int event, float cfra)
{
+ ParticleSettings *part = sim->psys->part;
+ MTex **mtexp = part->mtex;
MTex *mtex;
int m;
- float value, rgba[4], co[3], texco[3];
+ float value, rgba[4], co[3], texvec[3];
int setvars=0;
- if(ma) for(m=0; m<MAX_MTEX; m++){
- mtex=ma->mtex[m];
- if(mtex && (ma->septex & (1<<m))==0 && mtex->pmapto){
+ /* initialize ptex */
+ ptex->ivel = ptex->life = ptex->exist = ptex->size = ptex->damp =
+ ptex->gravity = ptex->field = ptex->length = ptex->clump = ptex->kink =
+ ptex->effector = ptex->rough1 = ptex->rough2 = ptex->roughe = 1.f;
+
+ ptex->time = (float)(pa - sim->psys->particles)/(float)sim->psys->totpart;
+
+ for(m=0; m<MAX_MTEX; m++, mtexp++){
+ mtex = *mtexp;
+ if(mtex && mtex->mapto){
float def=mtex->def_var;
short blend=mtex->blendtype;
+ short texco = mtex->texco;
- if((mtex->texco & TEXCO_UV) && ELEM(sim->psys->part->from, PART_FROM_FACE, PART_FROM_VOLUME)) {
- if(!get_particle_uv(sim->psmd->dm, pa, 0, pa->fuv, mtex->uvname, texco)) {
- /* failed to get uv's, let's try orco's */
- psys_particle_on_emitter(sim->psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
- }
- }
- else {
- psys_particle_on_emitter(sim->psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texco, 0);
+ if(texco == TEXCO_UV && (ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME) == 0 || part->distr == PART_DISTR_GRID))
+ texco = TEXCO_GLOB;
+
+ switch(texco) {
+ case TEXCO_GLOB:
+ copy_v3_v3(texvec, pa->state.co);
+ break;
+ case TEXCO_OBJECT:
+ copy_v3_v3(texvec, pa->state.co);
+ if(mtex->object)
+ mul_m4_v3(mtex->object->imat, texvec);
+ break;
+ case TEXCO_UV:
+ if(get_particle_uv(sim->psmd->dm, pa, 0, pa->fuv, mtex->uvname, texvec))
+ break;
+ /* no break, failed to get uv's, so let's try orco's */
+ case TEXCO_ORCO:
+ psys_particle_on_emitter(sim->psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,texvec, 0);
+ break;
+ case TEXCO_PARTICLE:
+ /* texture coordinates in range [-1,1] */
+ texvec[0] = 2.f * (cfra - pa->time)/(pa->dietime-pa->time) - 1.f;
+ texvec[1] = 0.f;
+ texvec[2] = 0.f;
+ break;
}
- externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
+ externtex(mtex, texvec, &value, rgba, rgba+1, rgba+2, rgba+3, 0);
- if((event & mtex->pmapto) & MAP_PA_TIME){
+ if((event & mtex->mapto) & PAMAP_TIME) {
/* the first time has to set the base value for time regardless of blend mode */
if((setvars&MAP_PA_TIME)==0){
int flip= (mtex->timefac < 0.0f);
@@ -3758,32 +3826,26 @@ void psys_get_texture(ParticleSimulationData *sim, Material *ma, ParticleData *p
else
ptex->time= texture_value_blend(def,ptex->time,value,mtex->timefac,blend);
}
- if((event & mtex->pmapto) & MAP_PA_LIFE)
- ptex->life= texture_value_blend(def,ptex->life,value,mtex->lifefac,blend);
- if((event & mtex->pmapto) & MAP_PA_DENS)
- ptex->exist= texture_value_blend(def,ptex->exist,value,mtex->padensfac,blend);
- if((event & mtex->pmapto) & MAP_PA_SIZE)
- ptex->size= texture_value_blend(def,ptex->size,value,mtex->sizefac,blend);
- if((event & mtex->pmapto) & MAP_PA_IVEL)
- ptex->ivel= texture_value_blend(def,ptex->ivel,value,mtex->ivelfac,blend);
- if((event & mtex->pmapto) & MAP_PA_PVEL)
- texture_rgb_blend(ptex->pvel,rgba,ptex->pvel,value,mtex->pvelfac,blend);
- if((event & mtex->pmapto) & MAP_PA_LENGTH)
- ptex->length= texture_value_blend(def,ptex->length,value,mtex->lengthfac,blend);
- if((event & mtex->pmapto) & MAP_PA_CLUMP)
- ptex->clump= texture_value_blend(def,ptex->clump,value,mtex->clumpfac,blend);
- if((event & mtex->pmapto) & MAP_PA_KINK)
- ptex->kink= texture_value_blend(def,ptex->kink,value,mtex->kinkfac,blend);
- }
- }
- if(event & MAP_PA_TIME) { CLAMP(ptex->time,0.0,1.0); }
- if(event & MAP_PA_LIFE) { CLAMP(ptex->life,0.0,1.0); }
- if(event & MAP_PA_DENS) { CLAMP(ptex->exist,0.0,1.0); }
- if(event & MAP_PA_SIZE) { CLAMP(ptex->size,0.0,1.0); }
- if(event & MAP_PA_IVEL) { CLAMP(ptex->ivel,0.0,1.0); }
- if(event & MAP_PA_LENGTH) { CLAMP(ptex->length,0.0,1.0); }
- if(event & MAP_PA_CLUMP) { CLAMP(ptex->clump,0.0,1.0); }
- if(event & MAP_PA_KINK) { CLAMP(ptex->kink,0.0,1.0); }
+ SET_PARTICLE_TEXTURE(PAMAP_LIFE, ptex->life, mtex->lifefac)
+ SET_PARTICLE_TEXTURE(PAMAP_DENS, ptex->exist, mtex->padensfac)
+ SET_PARTICLE_TEXTURE(PAMAP_SIZE, ptex->size, mtex->sizefac)
+ SET_PARTICLE_TEXTURE(PAMAP_IVEL, ptex->ivel, mtex->ivelfac)
+ SET_PARTICLE_TEXTURE(PAMAP_FIELD, ptex->field, mtex->fieldfac)
+ SET_PARTICLE_TEXTURE(PAMAP_GRAVITY, ptex->gravity, mtex->gravityfac)
+ SET_PARTICLE_TEXTURE(PAMAP_DAMP, ptex->damp, mtex->dampfac)
+ SET_PARTICLE_TEXTURE(PAMAP_LENGTH, ptex->length, mtex->lengthfac)
+ }
+ }
+
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_TIME, ptex->time)
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_LIFE, ptex->life)
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_DENS, ptex->exist)
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_SIZE, ptex->size)
+ CLAMP_PARTICLE_TEXTURE_POSNEG(PAMAP_IVEL, ptex->ivel)
+ CLAMP_PARTICLE_TEXTURE_POSNEG(PAMAP_FIELD, ptex->field)
+ CLAMP_PARTICLE_TEXTURE_POSNEG(PAMAP_GRAVITY, ptex->gravity)
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_DAMP, ptex->damp)
+ CLAMP_PARTICLE_TEXTURE_POS(PAMAP_LENGTH, ptex->length)
}
/************************************************/
/* Particle State */
@@ -3821,33 +3883,13 @@ float psys_get_child_time(ParticleSystem *psys, ChildParticle *cpa, float cfra,
return (cfra-time)/life;
}
-float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float cfra, float *pa_time)
+float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float UNUSED(cfra), float *UNUSED(pa_time))
{
ParticleSettings *part = psys->part;
float size; // time XXX
- if(part->childtype==PART_CHILD_FACES){
+ if(part->childtype==PART_CHILD_FACES)
size=part->size;
-
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME)==0 && part->ipo){
- IpoCurve *icu;
-
- if(pa_time)
- time=*pa_time;
- else
- time=psys_get_child_time(psys,cpa,cfra,NULL,NULL);
-
- /* correction for lifetime */
- calc_ipo(part->ipo, 100*time);
-
- for(icu = part->ipo->curve.first; icu; icu=icu->next) {
- if(icu->adrcode == PART_SIZE)
- size = icu->curval;
- }
- }
-#endif // XXX old animation system
- }
else
size=psys->particles[cpa->parent].size;
@@ -3863,19 +3905,7 @@ static void get_child_modifier_parameters(ParticleSettings *part, ParticleThread
ParticleSystem *psys = ctx->sim.psys;
int i = cpa - psys->child;
- ptex->length= 1.0f - part->randlength * PSYS_FRAND(i + 26);
- ptex->clump=1.0;
- ptex->kink=1.0;
- ptex->rough1= 1.0;
- ptex->rough2= 1.0;
- ptex->roughe= 1.0;
- ptex->exist= 1.0;
- ptex->effector= 1.0;
-
- ptex->length*= part->clength_thres < PSYS_FRAND(i + 27) ? part->clength : 1.0f;
-
- get_cpa_texture(ctx->dm,ctx->ma,cpa_num,cpa_fuv,orco,ptex,
- MAP_PA_DENS|MAP_PA_LENGTH|MAP_PA_CLUMP|MAP_PA_KINK|MAP_PA_ROUGH);
+ get_cpa_texture(ctx->dm, psys, part, psys->particles + cpa->pa[0], i, cpa_num, cpa_fuv, orco, ptex, PAMAP_DENS|PAMAP_CHILD, psys->cfra);
if(ptex->exist < PSYS_FRAND(i + 24))
@@ -3902,26 +3932,42 @@ static void do_child_modifiers(ParticleSimulationData *sim, ParticleTexture *pte
int i = cpa - sim->psys->child;
int guided = 0;
+ float kink_freq = part->kink_freq;
+ float rough1 = part->rough1;
+ float rough2 = part->rough2;
+ float rough_end = part->rough_end;
+
+ if(ptex) {
+ kink_freq *= ptex->kink;
+ rough1 *= ptex->rough1;
+ rough2 *= ptex->rough2;
+ rough_end *= ptex->roughe;
+ }
+
if(part->flag & PART_CHILD_EFFECT)
/* state is safe to cast, since only co and vel are used */
guided = do_guides(sim->psys->effectors, (ParticleKey*)state, cpa->parent, t);
if(guided==0){
- if(part->kink)
- do_prekink(state, par, par_rot, t, part->kink_freq * ptex->kink, part->kink_shape,
- part->kink_amp, part->kink, part->kink_axis, sim->ob->obmat);
-
- do_clump(state, par, t, part->clumpfac, part->clumppow, ptex->clump);
+ float clump = do_clump(state, par, t, part->clumpfac, part->clumppow, ptex ? ptex->clump : 1.f);
+
+ if(kink_freq != 0.f) {
+ float kink_amp = part->kink_amp * (1.f - part->kink_amp_clump * clump);
+
+ do_kink(state, par, par_rot, t, kink_freq, part->kink_shape,
+ kink_amp, part->kink_flat, part->kink, part->kink_axis,
+ sim->ob->obmat, sim->psys->part->childtype == PART_CHILD_FACES);
+ }
}
- if(part->rough1 != 0.0 && ptex->rough1 != 0.0)
- do_rough(orco, mat, t, ptex->rough1*part->rough1, part->rough1_size, 0.0, state);
+ if(rough1 > 0.f)
+ do_rough(orco, mat, t, rough1, part->rough1_size, 0.0, state);
- if(part->rough2 != 0.0 && ptex->rough2 != 0.0)
- do_rough(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, ptex->rough2*part->rough2, part->rough2_size, part->rough2_thres, state);
+ if(rough2 > 0.f)
+ do_rough(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, rough2, part->rough2_size, part->rough2_thres, state);
- if(part->rough_end != 0.0 && ptex->roughe != 0.0)
- do_rough_end(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, ptex->roughe*part->rough_end, part->rough_end_shape, state);
+ if(rough_end > 0.f)
+ do_rough_end(sim->psys->frand + ((i + 27) % (PSYS_FRAND_COUNT - 3)), mat, t, rough_end, part->rough_end_shape, state);
}
/* get's hair (or keyed) particles state at the "path time" specified in state->time */
void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *state, int vel)
@@ -3937,10 +3983,9 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
ParticleThreadContext ctx; /* fake thread context for child modifiers */
ParticleInterpolationData pind;
- float t, frs_sec = sim->scene->r.frs_sec;
+ float t;
float co[3], orco[3];
float hairmat[4][4];
- int totparent = 0;
int totpart = psys->totpart;
int totchild = psys->totchild;
short between = 0, edit = 0;
@@ -3950,11 +3995,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
float *cpa_fuv; int cpa_num; short cpa_from;
- //if(psys_in_edit_mode(scene, psys)){
- // if((psys->edit_path->flag & PSYS_EP_SHOW_CHILD)==0)
- // totchild=0;
- // edit=1;
- //}
+ /* initialize keys to zero */
+ memset(keys, 0, 4*sizeof(ParticleKey));
t=state->time;
CLAMP(t, 0.0, 1.0);
@@ -3969,7 +4011,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
* account when subdividing for instance */
pind.dm = psys_in_edit_mode(sim->scene, psys) ? NULL : psys->hair_out_dm;
init_particle_interpolation(sim->ob, psys, pa, &pind);
- do_particle_interpolation(psys, p, pa, t, frs_sec, &pind, state);
+ do_particle_interpolation(psys, p, pa, t, &pind, state);
if(!keyed && !cached) {
if((pa->flag & PARS_REKEY)==0) {
@@ -3996,11 +4038,6 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
t = psys_get_child_time(psys, cpa, -state->time, NULL, NULL);
if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- totparent=(int)(totchild*part->parents*0.3);
-
- if(G.rendering && part->child_nbr && part->ren_child_nbr)
- totparent*=(float)part->child_nbr/(float)part->ren_child_nbr;
-
/* part->parents could still be 0 so we can't test with totparent */
between=1;
}
@@ -4031,7 +4068,10 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
pa = psys->particles + cpa->parent;
- psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ if(part->type == PART_HAIR)
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ else
+ unit_m4(hairmat);
pa=0;
}
@@ -4047,9 +4087,16 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
cpa_num=pa->num;
cpa_fuv=pa->fuv;
- psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
+
- psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ if(part->type == PART_HAIR) {
+ psys_particle_on_emitter(psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,co,0,0,0,orco,0);
+ psys_mat_hair_to_global(sim->ob, sim->psmd->dm, psys->part->from, pa, hairmat);
+ }
+ else {
+ copy_v3_v3(orco, cpa->fuv);
+ unit_m4(hairmat);
+ }
}
/* correct child ipo timing */
@@ -4090,7 +4137,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
}
else{
/* offset the child from the parent position */
- offset_child(cpa, keys, state, part->childflat, part->childrad);
+ offset_child(cpa, keys, keys->rot, state, part->childflat, part->childrad);
}
par = keys;
@@ -4169,11 +4216,11 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
if(pa) {
if(!always)
- if((pa->alive==PARS_UNBORN && (part->flag & PART_UNBORN)==0)
- || (pa->alive==PARS_DEAD && (part->flag & PART_DIED)==0))
+ if((cfra < pa->time && (part->flag & PART_UNBORN)==0)
+ || (cfra > pa->dietime && (part->flag & PART_DIED)==0))
return 0;
- state->time = MIN2(state->time, pa->dietime);
+ cfra = MIN2(cfra, pa->dietime);
}
if(sim->psys->flag & PSYS_KEYED){
@@ -4183,41 +4230,42 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
}
else{
if(cpa){
+ float mat[4][4];
ParticleKey *key1;
float t = (cfra - pa->time) / pa->lifetime;
key1=&pa->state;
- offset_child(cpa, key1, state, part->childflat, part->childrad);
-
+ offset_child(cpa, key1, key1->rot, state, part->childflat, part->childrad);
+
CLAMP(t,0.0,1.0);
- if(part->kink) /* TODO: part->kink_freq*pa_kink */
- do_prekink(state,key1,key1->rot,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,sim->ob->obmat);
-
- /* TODO: pa_clump vgroup */
- do_clump(state,key1,t,part->clumpfac,part->clumppow,1.0);
+
+ unit_m4(mat);
+ do_child_modifiers(sim, NULL, key1, key1->rot, cpa, cpa->fuv, mat, state, t);
if(psys->lattice)
calc_latt_deform(sim->psys->lattice, state->co,1.0f);
}
else{
- if(pa->state.time==state->time || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED)
- || pa->prev_state.time <= 0.0f)
+ if(pa->state.time==cfra || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED))
copy_particle_key(state, &pa->state, 1);
- else if(pa->prev_state.time==state->time)
+ else if(pa->prev_state.time==cfra)
copy_particle_key(state, &pa->prev_state, 1);
else {
+ float dfra, frs_sec = sim->scene->r.frs_sec;
/* let's interpolate to try to be as accurate as possible */
- if(pa->state.time + 2.0f > state->time && pa->prev_state.time - 2.0f < state->time) {
- ParticleKey keys[4];
- float dfra, keytime, frs_sec = sim->scene->r.frs_sec;
+ if(pa->state.time + 2.f >= state->time && pa->prev_state.time - 2.f <= state->time) {
+ if(pa->prev_state.time >= pa->state.time || pa->prev_state.time < 0.f) {
+ /* prev_state is wrong so let's not use it, this can happen at frames 1, 0 or particle birth */
+ dfra = state->time - pa->state.time;
- if(pa->prev_state.time >= pa->state.time) {
- /* prev_state is wrong so let's not use it, this can happen at frame 1 or particle birth */
copy_particle_key(state, &pa->state, 1);
- VECADDFAC(state->co, state->co, state->vel, (state->time-pa->state.time)/frs_sec);
+ madd_v3_v3v3fl(state->co, state->co, state->vel, dfra/frs_sec);
}
else {
+ ParticleKey keys[4];
+ float keytime;
+
copy_particle_key(keys+1, &pa->prev_state, 1);
copy_particle_key(keys+2, &pa->state, 1);
@@ -4232,12 +4280,21 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
psys_interpolate_particle(-1, keys, keytime, state, 1);
/* convert back to real velocity */
- mul_v3_fl(state->vel, 1.0f / (dfra * timestep));
+ mul_v3_fl(state->vel, 1.f / (dfra * timestep));
interp_v3_v3v3(state->ave, keys[1].ave, keys[2].ave, keytime);
interp_qt_qtqt(state->rot, keys[1].rot, keys[2].rot, keytime);
}
}
+ else if(pa->state.time + 1.f >= state->time && pa->state.time - 1.f <= state->time) {
+ /* linear interpolation using only pa->state */
+
+ dfra = state->time - pa->state.time;
+
+ copy_particle_key(state, &pa->state, 1);
+
+ madd_v3_v3v3fl(state->co, state->co, state->vel, dfra/frs_sec);
+ }
else {
/* extrapolating over big ranges is not accurate so let's just give something close to reasonable back */
copy_particle_key(state, &pa->state, 0);
@@ -4252,7 +4309,7 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
}
}
-void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
+void psys_get_dupli_texture(Object *UNUSED(ob), ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
{
MFace *mface;
MTFace *mtface;
@@ -4285,7 +4342,7 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo
if(num == DMCACHE_NOTFOUND)
num= pa->num;
- if (num >= psmd->dm->getNumFaces(psmd->dm)) {
+ if (num >= psmd->dm->getNumTessFaces(psmd->dm)) {
/* happens when simplify is enabled
* gives invalid coords but would crash otherwise */
num= DMCACHE_NOTFOUND;
@@ -4357,7 +4414,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa
normalize_v3(side);
cross_v3_v3v3(nor, vec, side);
- unit_m4(mat);
+ unit_m4(mat);
VECCOPY(mat[0], vec);
VECCOPY(mat[1], side);
VECCOPY(mat[2], nor);
@@ -4450,9 +4507,12 @@ void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3]
VECADDFAC(center, center, yvec, bb->offset[1]);
}
-
void psys_apply_hair_lattice(Scene *scene, Object *ob, ParticleSystem *psys) {
- ParticleSimulationData sim = {scene, ob, psys, psys_get_modifier(ob, psys)};
+ ParticleSimulationData sim= {0};
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psys_get_modifier(ob, psys);
psys->lattice = psys_get_lattice(&sim);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 955de554e00..b4900553814 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -29,6 +29,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
#include <stdlib.h>
@@ -53,6 +54,7 @@
#include "DNA_ipo_types.h" // XXX old animation system stuff... to be removed!
#include "DNA_listBase.h"
+#include "BLI_edgehash.h"
#include "BLI_rand.h"
#include "BLI_jitter.h"
#include "BLI_math.h"
@@ -61,7 +63,10 @@
#include "BLI_kdopbvh.h"
#include "BLI_listbase.h"
#include "BLI_threads.h"
+#include "BLI_storage.h" /* For _LARGEFILE64_SOURCE; zlib needs this on some systems */
+#include "BLI_utildefines.h"
+#include "BKE_main.h"
#include "BKE_animsys.h"
#include "BKE_boids.h"
#include "BKE_cdderivedmesh.h"
@@ -70,7 +75,7 @@
#include "BKE_effect.h"
#include "BKE_particle.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_material.h"
@@ -115,7 +120,8 @@ static int particles_are_dynamic(ParticleSystem *psys) {
else
return ELEM3(psys->part->phystype, PART_PHYS_NEWTON, PART_PHYS_BOIDS, PART_PHYS_FLUID);
}
-int psys_get_current_display_percentage(ParticleSystem *psys)
+
+static int psys_get_current_display_percentage(ParticleSystem *psys)
{
ParticleSettings *part=psys->part;
@@ -124,8 +130,18 @@ int psys_get_current_display_percentage(ParticleSystem *psys)
|| (psys->pointcache->flag & PTCACHE_BAKING)) /* baking is always done with full amount */
return 100;
- return psys->part->disp;
- }
+ return psys->part->disp;
+}
+
+static int tot_particles(ParticleSystem *psys, PTCacheID *pid)
+{
+ if(pid && psys->pointcache->flag & PTCACHE_EXTERNAL)
+ return pid->cache->totpoint;
+ else if(psys->part->distr == PART_DISTR_GRID && psys->part->from != PART_FROM_VERT)
+ return psys->part->grid_res * psys->part->grid_res * psys->part->grid_res - psys->totunexist;
+ else
+ return psys->part->totpart - psys->totunexist;
+}
void psys_reset(ParticleSystem *psys, int mode)
{
@@ -133,9 +149,12 @@ void psys_reset(ParticleSystem *psys, int mode)
if(ELEM(mode, PSYS_RESET_ALL, PSYS_RESET_DEPSGRAPH)) {
if(mode == PSYS_RESET_ALL || !(psys->flag & PSYS_EDITED)) {
- psys_free_particles(psys);
+ /* don't free if not absolutely necessary */
+ if(psys->totpart != tot_particles(psys, NULL)) {
+ psys_free_particles(psys);
+ psys->totpart= 0;
+ }
- psys->totpart= 0;
psys->totkeyed= 0;
psys->flag &= ~(PSYS_HAIR_DONE|PSYS_KEYED);
@@ -155,7 +174,7 @@ void psys_reset(ParticleSystem *psys, int mode)
/* reset children */
if(psys->child) {
MEM_freeN(psys->child);
- psys->child= 0;
+ psys->child= NULL;
}
psys->totchild= 0;
@@ -165,6 +184,13 @@ void psys_reset(ParticleSystem *psys, int mode)
/* reset point cache */
BKE_ptcache_invalidate(psys->pointcache);
+
+ if(psys->fluid_springs) {
+ MEM_freeN(psys->fluid_springs);
+ psys->fluid_springs = NULL;
+ }
+
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = 0;
}
static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
@@ -194,9 +220,22 @@ static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
psys->free_edit = NULL;
}
- newpars= MEM_callocN(totpart*sizeof(ParticleData), "particles");
- if(psys->part->phystype == PART_PHYS_BOIDS)
- newboids= MEM_callocN(totpart*sizeof(BoidParticle), "boid particles");
+ if(totpart) {
+ newpars= MEM_callocN(totpart*sizeof(ParticleData), "particles");
+ if(newpars == NULL)
+ return;
+
+ if(psys->part->phystype == PART_PHYS_BOIDS) {
+ newboids= MEM_callocN(totpart*sizeof(BoidParticle), "boid particles");
+
+ if(newboids == NULL) {
+ /* allocation error! */
+ if(newpars)
+ MEM_freeN(newpars);
+ return;
+ }
+ }
+ }
if(psys->particles) {
totsaved=MIN2(psys->totpart,totpart);
@@ -239,7 +278,7 @@ static void realloc_particles(ParticleSimulationData *sim, int new_totpart)
if(psys->child) {
MEM_freeN(psys->child);
- psys->child=0;
+ psys->child=NULL;
psys->totchild=0;
}
}
@@ -274,7 +313,7 @@ static void alloc_child_particles(ParticleSystem *psys, int tot)
}
MEM_freeN(psys->child);
- psys->child=0;
+ psys->child=NULL;
psys->totchild=0;
}
@@ -332,12 +371,17 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
/* cache the verts/faces! */
LOOP_PARTICLES {
+ if(pa->num < 0) {
+ pa->num_dmcache = -1;
+ continue;
+ }
+
if(psys->part->from == PART_FROM_VERT) {
if(nodearray[pa->num])
pa->num_dmcache= GET_INT_FROM_POINTER(nodearray[pa->num]->link);
}
else { /* FROM_FACE/FROM_VOLUME */
- /* Note that somtimes the pa->num is over the nodearray size, this is bad, maybe there is a better place to fix this,
+ /* Note that sometimes the pa->num is over the nodearray size, this is bad, maybe there is a better place to fix this,
* but for now passing NULL is OK. every face will be searched for the particle so its slower - Campbell */
pa->num_dmcache= psys_particle_dm_face_lookup(ob, dm, pa->num, pa->fuv, pa->num < totelem ? nodearray[pa->num] : NULL);
}
@@ -358,7 +402,7 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
{
- ParticleData *pa=0;
+ ParticleData *pa=NULL;
float min[3], max[3], delta[3], d;
MVert *mv, *mvert = dm->getVertDataArray(dm,0);
int totvert=dm->getNumVerts(dm), from=psys->part->from;
@@ -367,8 +411,8 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
mv=mvert;
/* find bounding box of dm */
- VECCOPY(min,mv->co);
- VECCOPY(max,mv->co);
+ copy_v3_v3(min, mv->co);
+ copy_v3_v3(max, mv->co);
mv++;
for(i=1; i<totvert; i++, mv++){
@@ -384,30 +428,35 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
VECSUB(delta,max,min);
/* determine major axis */
- axis = (delta[0]>=delta[1])?0:((delta[1]>=delta[2])?1:2);
-
+ axis = (delta[0]>=delta[1]) ? 0 : ((delta[1]>=delta[2]) ? 1 : 2);
+
d = delta[axis]/(float)res;
- size[axis]=res;
- size[(axis+1)%3]=(int)ceil(delta[(axis+1)%3]/d);
- size[(axis+2)%3]=(int)ceil(delta[(axis+2)%3]/d);
+ size[axis] = res;
+ size[(axis+1)%3] = (int)ceil(delta[(axis+1)%3]/d);
+ size[(axis+2)%3] = (int)ceil(delta[(axis+2)%3]/d);
/* float errors grrr.. */
size[(axis+1)%3] = MIN2(size[(axis+1)%3],res);
size[(axis+2)%3] = MIN2(size[(axis+2)%3],res);
- min[0]+=d/2.0f;
- min[1]+=d/2.0f;
- min[2]+=d/2.0f;
+ size[0] = MAX2(size[0], 1);
+ size[1] = MAX2(size[1], 1);
+ size[2] = MAX2(size[2], 1);
+
+ /* no full offset for flat/thin objects */
+ min[0]+= d < delta[0] ? d/2.f : delta[0]/2.f;
+ min[1]+= d < delta[1] ? d/2.f : delta[1]/2.f;
+ min[2]+= d < delta[2] ? d/2.f : delta[2]/2.f;
for(i=0,p=0,pa=psys->particles; i<res; i++){
for(j=0; j<res; j++){
for(k=0; k<res; k++,p++,pa++){
- pa->fuv[0]=min[0]+(float)i*d;
- pa->fuv[1]=min[1]+(float)j*d;
- pa->fuv[2]=min[2]+(float)k*d;
+ pa->fuv[0] = min[0] + (float)i*d;
+ pa->fuv[1] = min[1] + (float)j*d;
+ pa->fuv[2] = min[2] + (float)k*d;
pa->flag |= PARS_UNEXIST;
- pa->hair_index=0; /* abused in volume calculation */
+ pa->hair_index = 0; /* abused in volume calculation */
}
}
}
@@ -418,9 +467,9 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
pa=psys->particles;
- min[0]-=d/2.0f;
- min[1]-=d/2.0f;
- min[2]-=d/2.0f;
+ min[0] -= d/2.0f;
+ min[1] -= d/2.0f;
+ min[2] -= d/2.0f;
for(i=0,mv=mvert; i<totvert; i++,mv++){
sub_v3_v3v3(vec,mv->co,min);
@@ -435,13 +484,13 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
else if(ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)){
float co1[3], co2[3];
- MFace *mface=0;
+ MFace *mface= NULL, *mface_array;
float v1[3], v2[3], v3[3], v4[4], lambda;
int a, a1, a2, a0mul, a1mul, a2mul, totface;
int amax= from==PART_FROM_FACE ? 3 : 1;
totface=dm->getNumTessFaces(dm);
- mface=dm->getTessFaceDataArray(dm,CD_MFACE);
+ mface=mface_array=dm->getTessFaceDataArray(dm,CD_MFACE);
for(a=0; a<amax; a++){
if(a==0){ a0mul=res*res; a1mul=res; a2mul=1; }
@@ -450,22 +499,22 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
for(a1=0; a1<size[(a+1)%3]; a1++){
for(a2=0; a2<size[(a+2)%3]; a2++){
- mface=dm->getTessFaceDataArray(dm,CD_MFACE);
-
- pa=psys->particles + a1*a1mul + a2*a2mul;
- VECCOPY(co1,pa->fuv);
- co1[a]-=d/2.0f;
- VECCOPY(co2,co1);
- co2[a]+=delta[a] + 0.001f*d;
- co1[a]-=0.001f*d;
+ mface= mface_array;
+
+ pa = psys->particles + a1*a1mul + a2*a2mul;
+ copy_v3_v3(co1, pa->fuv);
+ co1[a] -= d < delta[a] ? d/2.f : delta[a]/2.f;
+ copy_v3_v3(co2, co1);
+ co2[a] += delta[a] + 0.001f*d;
+ co1[a] -= 0.001f*d;
/* lets intersect the faces */
for(i=0; i<totface; i++,mface++){
- VECCOPY(v1,mvert[mface->v1].co);
- VECCOPY(v2,mvert[mface->v2].co);
- VECCOPY(v3,mvert[mface->v3].co);
+ copy_v3_v3(v1, mvert[mface->v1].co);
+ copy_v3_v3(v2, mvert[mface->v2].co);
+ copy_v3_v3(v3, mvert[mface->v3].co);
- if(isect_axial_line_tri_v3(a,co1, co2, v2, v3, v1, &lambda)){
+ if(isect_axial_line_tri_v3(a, co1, co2, v2, v3, v1, &lambda)){
if(from==PART_FROM_FACE)
(pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
else /* store number of intersections */
@@ -473,9 +522,9 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
}
if(mface->v4){
- VECCOPY(v4,mvert[mface->v4].co);
+ copy_v3_v3(v4, mvert[mface->v4].co);
- if(isect_axial_line_tri_v3(a,co1, co2, v4, v1, v3, &lambda)){
+ if(isect_axial_line_tri_v3(a, co1, co2, v4, v1, v3, &lambda)){
if(from==PART_FROM_FACE)
(pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
else
@@ -500,8 +549,24 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
}
}
+ if(psys->part->flag & PART_GRID_HEXAGONAL) {
+ for(i=0,p=0,pa=psys->particles; i<res; i++){
+ for(j=0; j<res; j++){
+ for(k=0; k<res; k++,p++,pa++){
+ if(j%2)
+ pa->fuv[0] += d/2.f;
+
+ if(k%2) {
+ pa->fuv[0] += d/2.f;
+ pa->fuv[1] += d/2.f;
+ }
+ }
+ }
+ }
+ }
+
if(psys->part->flag & PART_GRID_INVERT){
- for(i=0,pa=psys->particles; i<size[0]; i++){
+ for(i=0; i<size[0]; i++){
for(j=0; j<size[1]; j++){
pa=psys->particles + res*(i*res + j);
for(k=0; k<size[2]; k++, pa++){
@@ -510,6 +575,18 @@ static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
}
}
}
+
+ if(psys->part->grid_rand > 0.f) {
+ float rfac = d * psys->part->grid_rand;
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ if(pa->flag & PARS_UNEXIST)
+ continue;
+
+ pa->fuv[0] += rfac * (PSYS_FRAND(p + 31) - 0.5f);
+ pa->fuv[1] += rfac * (PSYS_FRAND(p + 32) - 0.5f);
+ pa->fuv[2] += rfac * (PSYS_FRAND(p + 33) - 0.5f);
+ }
+ }
}
/* modified copy from rayshade.c */
@@ -603,15 +680,21 @@ static void psys_uv_to_w(float u, float v, int quad, float *w)
}
}
+/* Find the index in "sum" array before "value" is crossed. */
static int binary_search_distribution(float *sum, int n, float value)
{
int mid, low=0, high=n;
+ if(value == 0.f)
+ return 0;
+
while(low <= high) {
mid= (low + high)/2;
- if(sum[mid] <= value && value <= sum[mid+1])
+
+ if(sum[mid] < value && value <= sum[mid+1])
return mid;
- else if(sum[mid] > value)
+
+ if(sum[mid] >= value)
high= mid - 1;
else if(sum[mid] < value)
low= mid + 1;
@@ -635,7 +718,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
DerivedMesh *dm= ctx->dm;
ParticleData *tpa;
/* ParticleSettings *part= ctx->sim.psys->part; */
- float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3], ornor1[3];
+ float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3];
float cur_d, min_d, randu, randv;
int from= ctx->from;
int cfrom= ctx->cfrom;
@@ -772,20 +855,17 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
if(ctx->tree){
KDTreeNearest ptn[10];
int w,maxw;//, do_seams;
- float maxd,mind,dd,totw=0.0;
+ float maxd,mind,/*dd,*/totw=0.0;
int parent[10];
float pweight[10];
- /*do_seams= (part->flag&PART_CHILD_SEAMS && ctx->seams);*/
-
- psys_particle_on_dm(dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0,orco1,ornor1);
+ psys_particle_on_dm(dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,NULL,NULL,orco1,NULL);
transform_mesh_orco_verts((Mesh*)ob->data, &orco1, 1, 1);
- //maxw = BLI_kdtree_find_n_nearest(ctx->tree,(do_seams)?10:4,orco1,ornor1,ptn);
- maxw = BLI_kdtree_find_n_nearest(ctx->tree,4,orco1,ornor1,ptn);
+ maxw = BLI_kdtree_find_n_nearest(ctx->tree,4,orco1,NULL,ptn);
maxd=ptn[maxw-1].dist;
mind=ptn[0].dist;
- dd=maxd-mind;
+ /*dd=maxd-mind;*/ /*UNUSED*/
/* the weights here could be done better */
for(w=0; w<maxw; w++){
@@ -796,63 +876,6 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
parent[w]=-1;
pweight[w]=0.0f;
}
- //if(do_seams){
- // ParticleSeam *seam=ctx->seams;
- // float temp[3],temp2[3],tan[3];
- // float inp,cur_len,min_len=10000.0f;
- // int min_seam=0, near_vert=0;
- // /* find closest seam */
- // for(i=0; i<ctx->totseam; i++, seam++){
- // sub_v3_v3v3(temp,co1,seam->v0);
- // inp=dot_v3v3(temp,seam->dir)/seam->length2;
- // if(inp<0.0f){
- // cur_len=len_v3v3(co1,seam->v0);
- // }
- // else if(inp>1.0f){
- // cur_len=len_v3v3(co1,seam->v1);
- // }
- // else{
- // copy_v3_v3(temp2,seam->dir);
- // mul_v3_fl(temp2,inp);
- // cur_len=len_v3v3(temp,temp2);
- // }
- // if(cur_len<min_len){
- // min_len=cur_len;
- // min_seam=i;
- // if(inp<0.0f) near_vert=-1;
- // else if(inp>1.0f) near_vert=1;
- // else near_vert=0;
- // }
- // }
- // seam=ctx->seams+min_seam;
- //
- // copy_v3_v3(temp,seam->v0);
- //
- // if(near_vert){
- // if(near_vert==-1)
- // sub_v3_v3v3(tan,co1,seam->v0);
- // else{
- // sub_v3_v3v3(tan,co1,seam->v1);
- // copy_v3_v3(temp,seam->v1);
- // }
-
- // normalize_v3(tan);
- // }
- // else{
- // copy_v3_v3(tan,seam->tan);
- // sub_v3_v3v3(temp2,co1,temp);
- // if(dot_v3v3(tan,temp2)<0.0f)
- // negate_v3(tan);
- // }
- // for(w=0; w<maxw; w++){
- // sub_v3_v3v3(temp2,ptn[w].co,temp);
- // if(dot_v3v3(tan,temp2)<0.0f){
- // parent[w]=-1;
- // pweight[w]=0.0f;
- // }
- // }
-
- //}
for(w=0,i=0; w<maxw && i<4; w++){
if(parent[w]>=0){
@@ -963,7 +986,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
DerivedMesh *dm= NULL;
float *jit= NULL;
int i, seed, p=0, totthread= threads[0].tot;
- int no_distr=0, cfrom=0;
+ int /*no_distr=0,*/ cfrom=0;
int tot=0, totpart, *index=0, children=0, totseam=0;
//int *vertpart=0;
int jitlevel= 1, distr;
@@ -988,6 +1011,8 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
if(from==PART_FROM_CHILD){
distr=PART_DISTR_RAND;
+ BLI_srandom(31415926 + psys->seed + psys->child_seed);
+
if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
dm= finaldm;
children=1;
@@ -1004,50 +1029,6 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
totpart=get_psys_tot_child(scene, psys);
cfrom=from=PART_FROM_FACE;
-
- //if(part->flag&PART_CHILD_SEAMS){
- // MEdge *ed, *medge=dm->getEdgeDataArray(dm,CD_MEDGE);
- // MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
- // int totedge=dm->getNumEdges(dm);
-
- // for(p=0, ed=medge; p<totedge; p++,ed++)
- // if(ed->flag&ME_SEAM)
- // totseam++;
-
- // if(totseam){
- // ParticleSeam *cur_seam=seams=MEM_callocN(totseam*sizeof(ParticleSeam),"Child Distribution Seams");
- // float temp[3],temp2[3];
-
- // for(p=0, ed=medge; p<totedge; p++,ed++){
- // if(ed->flag&ME_SEAM){
- // copy_v3_v3(cur_seam->v0,(mvert+ed->v1)->co);
- // copy_v3_v3(cur_seam->v1,(mvert+ed->v2)->co);
-
- // sub_v3_v3v3(cur_seam->dir,cur_seam->v1,cur_seam->v0);
-
- // cur_seam->length2=len_v3(cur_seam->dir);
- // cur_seam->length2*=cur_seam->length2;
-
- // temp[0]=(float)((mvert+ed->v1)->no[0]);
- // temp[1]=(float)((mvert+ed->v1)->no[1]);
- // temp[2]=(float)((mvert+ed->v1)->no[2]);
- // temp2[0]=(float)((mvert+ed->v2)->no[0]);
- // temp2[1]=(float)((mvert+ed->v2)->no[1]);
- // temp2[2]=(float)((mvert+ed->v2)->no[2]);
-
- // add_v3_v3v3(cur_seam->nor,temp,temp2);
- // normalize_v3(cur_seam->nor);
-
- // cross_v3_v3v3(cur_seam->tan,cur_seam->dir,cur_seam->nor);
-
- // normalize_v3(cur_seam->tan);
-
- // cur_seam++;
- // }
- // }
- // }
- //
- //}
}
else{
/* no need to figure out distribution */
@@ -1092,7 +1073,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
distr=part->distr;
- pa=psys->particles;
+
if(from==PART_FROM_VERT){
MVert *mv= dm->getVertDataArray(dm, CD_MVERT);
float (*orcodata)[3]= dm->getVertDataArray(dm, CD_ORCO);
@@ -1137,7 +1118,7 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
}
if(tot==0){
- no_distr=1;
+ /*no_distr=1;*/ /*UNUSED*/
if(children){
if(G.f & G_DEBUG)
fprintf(stderr,"Particle child distribution error: Nothing to emit from!\n");
@@ -1284,7 +1265,8 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
float pos;
for(p=0; p<totpart; p++) {
- pos= BLI_frand();
+ /* In theory sys[tot] should be 1.0, but due to float errors this is not necessarily always true, so scale pos accordingly. */
+ pos= BLI_frand() * sum[tot];
index[p]= binary_search_distribution(sum, tot, pos);
index[p]= MIN2(tot-1, index[p]);
jitoff[index[p]]= pos;
@@ -1434,7 +1416,7 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
}
/* ready for future use, to emit particles without geometry */
-static void distribute_particles_on_shape(ParticleSimulationData *sim, int from)
+static void distribute_particles_on_shape(ParticleSimulationData *sim, int UNUSED(from))
{
ParticleSystem *psys = sim->psys;
PARTICLE_P;
@@ -1554,113 +1536,77 @@ void psys_threads_free(ParticleThread *threads)
/* set particle parameters that don't change during particle's life */
void initialize_particle(ParticleSimulationData *sim, ParticleData *pa, int p)
{
- ParticleSettings *part = sim->psys->part;
+ ParticleSystem *psys = sim->psys;
+ ParticleSettings *part = psys->part;
ParticleTexture ptex;
- Material *ma=0;
- //IpoCurve *icu=0; // XXX old animation system
- int totpart;
- totpart=sim->psys->totpart;
+ pa->flag &= ~PARS_UNEXIST;
- ptex.life=ptex.size=ptex.exist=ptex.length=1.0;
- ptex.time=(float)p/(float)totpart;
-
- BLI_srandom(sim->psys->seed + p + 125);
-
- if(part->from!=PART_FROM_PARTICLE && part->type!=PART_FLUID){
- ma=give_current_material(sim->ob,part->omat);
+ if(part->from != PART_FROM_PARTICLE && part->type != PART_FLUID) {
+ psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f);
+
+ if(ptex.exist < PSYS_FRAND(p+125))
+ pa->flag |= PARS_UNEXIST;
- /* TODO: needs some work to make most blendtypes generally usefull */
- psys_get_texture(sim,ma,pa,&ptex,MAP_PA_INIT);
+ pa->time = (part->type == PART_HAIR) ? 0.f : part->sta + (part->end - part->sta)*ptex.time;
}
- if(part->type==PART_HAIR)
- pa->time= 0.0f;
- //else if(part->type==PART_REACTOR && (part->flag&PART_REACT_STA_END)==0)
- // pa->time= 300000.0f; /* max frame */
- else{
- //icu=find_ipocurve(psys->part->ipo,PART_EMIT_TIME);
- //if(icu){
- // calc_icu(icu,100*ptex.time);
- // ptex.time=icu->curval;
- //}
-
- pa->time= part->sta + (part->end - part->sta)*ptex.time;
- }
-
- if(part->type!=PART_HAIR && part->distr!=PART_DISTR_GRID && part->from != PART_FROM_VERT){
- if(ptex.exist < BLI_frand())
- pa->flag |= PARS_UNEXIST;
- else
- pa->flag &= ~PARS_UNEXIST;
- }
-
- pa->hair_index=0;
+ pa->hair_index = 0;
/* we can't reset to -1 anymore since we've figured out correct index in distribute_particles */
/* usage other than straight after distribute has to handle this index by itself - jahka*/
//pa->num_dmcache = DMCACHE_NOTFOUND; /* assume we dont have a derived mesh face */
}
static void initialize_all_particles(ParticleSimulationData *sim)
{
- //IpoCurve *icu=0; // XXX old animation system
ParticleSystem *psys = sim->psys;
PARTICLE_P;
- LOOP_PARTICLES
- initialize_particle(sim, pa, p);
-
- if(psys->part->type != PART_FLUID) {
-#if 0 // XXX old animation system
- icu=find_ipocurve(psys->part->ipo,PART_EMIT_FREQ);
- if(icu){
- float time=psys->part->sta, end=psys->part->end;
- float v1, v2, a=0.0f, t1,t2, d;
-
- p=0;
- pa=psys->particles;
-
-
- calc_icu(icu,time);
- v1=icu->curval;
- if(v1<0.0f) v1=0.0f;
-
- calc_icu(icu,time+1.0f);
- v2=icu->curval;
- if(v2<0.0f) v2=0.0f;
-
- for(p=0, pa=psys->particles; p<totpart && time<end; p++, pa++){
- while(a+0.5f*(v1+v2) < (float)(p+1) && time<end){
- a+=0.5f*(v1+v2);
- v1=v2;
- time++;
- calc_icu(icu,time+1.0f);
- v2=icu->curval;
- }
- if(time<end){
- if(v1==v2){
- pa->time=time+((float)(p+1)-a)/v1;
- }
- else{
- d=(float)sqrt(v1*v1-2.0f*(v2-v1)*(a-(float)(p+1)));
- t1=(-v1+d)/(v2-v1);
- t2=(-v1-d)/(v2-v1);
-
- /* the root between 0-1 is the correct one */
- if(t1>0.0f && t1<=1.0f)
- pa->time=time+t1;
- else
- pa->time=time+t2;
- }
- }
+ psys->totunexist = 0;
+
+ LOOP_PARTICLES {
+ if((pa->flag & PARS_UNEXIST)==0)
+ initialize_particle(sim, pa, p);
+
+ if(pa->flag & PARS_UNEXIST)
+ psys->totunexist++;
+ }
+
+ /* Free unexisting particles. */
+ if(psys->totpart && psys->totunexist == psys->totpart) {
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+
+ MEM_freeN(psys->particles);
+ psys->particles = NULL;
+ psys->totpart = psys->totunexist = 0;
+ }
+
+ if(psys->totunexist) {
+ int newtotpart = psys->totpart - psys->totunexist;
+ ParticleData *npa, *newpars;
+
+ npa = newpars = MEM_callocN(newtotpart * sizeof(ParticleData), "particles");
+
+ for(p=0, pa=psys->particles; p<newtotpart; p++, pa++, npa++) {
+ while(pa->flag & PARS_UNEXIST)
+ pa++;
+
+ memcpy(npa, pa, sizeof(ParticleData));
+ }
+
+ if(psys->particles->boid)
+ MEM_freeN(psys->particles->boid);
+ MEM_freeN(psys->particles);
+ psys->particles = newpars;
+ psys->totpart -= psys->totunexist;
+
+ if(psys->particles->boid) {
+ BoidParticle *newboids = MEM_callocN(psys->totpart * sizeof(BoidParticle), "boid particles");
+
+ LOOP_PARTICLES
+ pa->boid = newboids++;
- pa->dietime = pa->time+pa->lifetime;
- pa->flag &= ~PARS_UNEXIST;
- }
- for(; p<totpart; p++, pa++){
- pa->flag |= PARS_UNEXIST;
- }
}
-#endif // XXX old animation system
}
}
/* sets particle to the emitter surface with initial velocity & rotation */
@@ -1670,39 +1616,19 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
ParticleSystem *psys = sim->psys;
ParticleSettings *part;
ParticleTexture ptex;
- ParticleKey state;
- //IpoCurve *icu=0; // XXX old animation system
float fac, phasefac, nor[3]={0,0,0},loc[3],vel[3]={0.0,0.0,0.0},rot[4],q2[4];
float r_vel[3],r_ave[3],r_rot[4],vec[3],p_vel[3]={0.0,0.0,0.0};
float x_vec[3]={1.0,0.0,0.0}, utan[3]={0.0,1.0,0.0}, vtan[3]={0.0,0.0,1.0}, rot_vec[3]={0.0,0.0,0.0};
- float q_phase[4], r_phase;
+ float q_phase[4];
int p = pa - psys->particles;
part=psys->part;
- ptex.ivel=1.0;
- ptex.life=1.0;
-
- /* we need to get every random even if they're not used so that they don't effect eachother */
- r_vel[0] = 2.0f * (PSYS_FRAND(p + 10) - 0.5f);
- r_vel[1] = 2.0f * (PSYS_FRAND(p + 11) - 0.5f);
- r_vel[2] = 2.0f * (PSYS_FRAND(p + 12) - 0.5f);
-
- r_ave[0] = 2.0f * (PSYS_FRAND(p + 13) - 0.5f);
- r_ave[1] = 2.0f * (PSYS_FRAND(p + 14) - 0.5f);
- r_ave[2] = 2.0f * (PSYS_FRAND(p + 15) - 0.5f);
-
- r_rot[0] = 2.0f * (PSYS_FRAND(p + 16) - 0.5f);
- r_rot[1] = 2.0f * (PSYS_FRAND(p + 17) - 0.5f);
- r_rot[2] = 2.0f * (PSYS_FRAND(p + 18) - 0.5f);
- r_rot[3] = 2.0f * (PSYS_FRAND(p + 19) - 0.5f);
- normalize_qt(r_rot);
-
- r_phase = PSYS_FRAND(p + 20);
-
+#if 0 /* deprecated code */
if(part->from==PART_FROM_PARTICLE){
- ParticleSimulationData tsim = {sim->scene, psys->target_ob ? psys->target_ob : ob, NULL, NULL};
float speed;
-
+ ParticleSimulationData tsim= {0};
+ tsim.scene= sim->scene;
+ tsim.ob= psys->target_ob ? psys->target_ob : ob;
tsim.psys = BLI_findlink(&tsim.ob->particlesystem, sim->psys->target_psys-1);
state.time = pa->time;
@@ -1724,79 +1650,93 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
VECCOPY(pa->fuv, loc); /* abusing pa->fuv (not used for "from particle") for storing emit location */
}
else{
- /* get precise emitter matrix if particle is born */
- if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= sim->psys->cfra) {
- /* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
- BKE_animsys_evaluate_animdata(&sim->ob->id, sim->ob->adt, pa->time, ADT_RECALC_ANIM);
- where_is_object_time(sim->scene, sim->ob, pa->time);
- }
+#endif
+ /* get precise emitter matrix if particle is born */
+ if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= sim->psys->cfra) {
+ /* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
+ BKE_animsys_evaluate_animdata(&sim->ob->id, sim->ob->adt, pa->time, ADT_RECALC_ANIM);
+ where_is_object_time(sim->scene, sim->ob, pa->time);
+ }
- /* get birth location from object */
- if(part->tanfac!=0.0)
- psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
- else
- psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
+ /* get birth location from object */
+ if(part->tanfac != 0.f)
+ psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan,0,0);
+ else
+ psys_particle_on_emitter(sim->psmd, part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,0,0,0,0);
- /* get possible textural influence */
- psys_get_texture(sim, give_current_material(sim->ob,part->omat), pa, &ptex, MAP_PA_IVEL|MAP_PA_LIFE);
+ /* get possible textural influence */
+ psys_get_texture(sim, pa, &ptex, PAMAP_IVEL|PAMAP_LIFE, cfra);
- //if(vg_vel && pa->num != -1)
- // ptex.ivel*=psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_vel);
-
- /* particles live in global space so */
- /* let's convert: */
- /* -location */
- mul_m4_v3(ob->obmat,loc);
+ /* particles live in global space so */
+ /* let's convert: */
+ /* -location */
+ mul_m4_v3(ob->obmat, loc);
- /* -normal */
- mul_mat3_m4_v3(ob->obmat,nor);
- normalize_v3(nor);
-
- /* -tangent */
- if(part->tanfac!=0.0){
- //float phase=vg_rot?2.0f*(psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
- float phase=0.0f;
- mul_v3_fl(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
- fac=-(float)sin(M_PI*(part->tanphase+phase));
- VECADDFAC(vtan,vtan,utan,fac);
-
- mul_mat3_m4_v3(ob->obmat,vtan);
-
- VECCOPY(utan,nor);
- mul_v3_fl(utan,dot_v3v3(vtan,nor));
- VECSUB(vtan,vtan,utan);
+ /* -normal */
+ mul_mat3_m4_v3(ob->obmat, nor);
+ normalize_v3(nor);
+
+ /* -tangent */
+ if(part->tanfac!=0.0){
+ //float phase=vg_rot?2.0f*(psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
+ float phase=0.0f;
+ mul_v3_fl(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
+ fac=-(float)sin(M_PI*(part->tanphase+phase));
+ VECADDFAC(vtan,vtan,utan,fac);
+
+ mul_mat3_m4_v3(ob->obmat,vtan);
+
+ VECCOPY(utan,nor);
+ mul_v3_fl(utan,dot_v3v3(vtan,nor));
+ VECSUB(vtan,vtan,utan);
- normalize_v3(vtan);
- }
+ normalize_v3(vtan);
+ }
- /* -velocity */
- if(part->randfac!=0.0){
- mul_mat3_m4_v3(ob->obmat,r_vel);
- normalize_v3(r_vel);
- }
+ /* -velocity */
+ if(part->randfac!=0.0){
+ r_vel[0] = 2.0f * (PSYS_FRAND(p + 10) - 0.5f);
+ r_vel[1] = 2.0f * (PSYS_FRAND(p + 11) - 0.5f);
+ r_vel[2] = 2.0f * (PSYS_FRAND(p + 12) - 0.5f);
- /* -angular velocity */
- if(part->avemode==PART_AVE_RAND){
- mul_mat3_m4_v3(ob->obmat,r_ave);
- normalize_v3(r_ave);
- }
+ mul_mat3_m4_v3(ob->obmat, r_vel);
+ normalize_v3(r_vel);
+ }
+
+ /* -angular velocity */
+ if(part->avemode==PART_AVE_RAND){
+ r_ave[0] = 2.0f * (PSYS_FRAND(p + 13) - 0.5f);
+ r_ave[1] = 2.0f * (PSYS_FRAND(p + 14) - 0.5f);
+ r_ave[2] = 2.0f * (PSYS_FRAND(p + 15) - 0.5f);
+
+ mul_mat3_m4_v3(ob->obmat,r_ave);
+ normalize_v3(r_ave);
+ }
- /* -rotation */
- if(part->randrotfac != 0.0f){
- mat4_to_quat(rot,ob->obmat);
- mul_qt_qtqt(r_rot,r_rot,rot);
- }
+ /* -rotation */
+ if(part->randrotfac != 0.0f){
+ r_rot[0] = 2.0f * (PSYS_FRAND(p + 16) - 0.5f);
+ r_rot[1] = 2.0f * (PSYS_FRAND(p + 17) - 0.5f);
+ r_rot[2] = 2.0f * (PSYS_FRAND(p + 18) - 0.5f);
+ r_rot[3] = 2.0f * (PSYS_FRAND(p + 19) - 0.5f);
+ normalize_qt(r_rot);
+
+ mat4_to_quat(rot,ob->obmat);
+ mul_qt_qtqt(r_rot,r_rot,rot);
+ }
+#if 0
}
+#endif
if(part->phystype==PART_PHYS_BOIDS && pa->boid) {
BoidParticle *bpa = pa->boid;
float dvec[3], q[4], mat[3][3];
- VECCOPY(pa->state.co,loc);
+ copy_v3_v3(pa->state.co,loc);
/* boids don't get any initial velocity */
- pa->state.vel[0]=pa->state.vel[1]=pa->state.vel[2]=0.0f;
+ zero_v3(pa->state.vel);
/* boids store direction in ave */
if(fabs(nor[2])==1.0f) {
@@ -1835,66 +1775,56 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
/* -velocity from: */
/* *reactions */
- if(dtime>0.0f){
- VECSUB(vel,pa->state.vel,pa->prev_state.vel);
+ if(dtime > 0.f){
+ sub_v3_v3v3(vel, pa->state.vel, pa->prev_state.vel);
}
/* *emitter velocity */
- if(dtime!=0.0 && part->obfac!=0.0){
- VECSUB(vel,loc,pa->state.co);
- mul_v3_fl(vel,part->obfac/dtime);
+ if(dtime != 0.f && part->obfac != 0.f){
+ sub_v3_v3v3(vel, loc, pa->state.co);
+ mul_v3_fl(vel, part->obfac/dtime);
}
/* *emitter normal */
- if(part->normfac!=0.0)
- VECADDFAC(vel,vel,nor,part->normfac);
+ if(part->normfac != 0.f)
+ madd_v3_v3fl(vel, nor, part->normfac);
/* *emitter tangent */
- if(sim->psmd && part->tanfac!=0.0)
- VECADDFAC(vel,vel,vtan,part->tanfac);
- //VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_tan):1.0f));
+ if(sim->psmd && part->tanfac != 0.f)
+ madd_v3_v3fl(vel, vtan, part->tanfac);
/* *emitter object orientation */
- if(part->ob_vel[0]!=0.0) {
+ if(part->ob_vel[0] != 0.f) {
normalize_v3_v3(vec, ob->obmat[0]);
- VECADDFAC(vel, vel, vec, part->ob_vel[0]);
+ madd_v3_v3fl(vel, vec, part->ob_vel[0]);
}
- if(part->ob_vel[1]!=0.0) {
+ if(part->ob_vel[1] != 0.f) {
normalize_v3_v3(vec, ob->obmat[1]);
- VECADDFAC(vel, vel, vec, part->ob_vel[1]);
+ madd_v3_v3fl(vel, vec, part->ob_vel[1]);
}
- if(part->ob_vel[2]!=0.0) {
+ if(part->ob_vel[2] != 0.f) {
normalize_v3_v3(vec, ob->obmat[2]);
- VECADDFAC(vel, vel, vec, part->ob_vel[2]);
+ madd_v3_v3fl(vel, vec, part->ob_vel[2]);
}
/* *texture */
/* TODO */
/* *random */
- if(part->randfac!=0.0)
- VECADDFAC(vel,vel,r_vel,part->randfac);
+ if(part->randfac != 0.f)
+ madd_v3_v3fl(vel, r_vel, part->randfac);
/* *particle */
- if(part->partfac!=0.0)
- VECADDFAC(vel,vel,p_vel,part->partfac);
-
- //icu=find_ipocurve(psys->part->ipo,PART_EMIT_VEL);
- //if(icu){
- // calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
- // ptex.ivel*=icu->curval;
- //}
-
- mul_v3_fl(vel,ptex.ivel);
+ if(part->partfac != 0.f)
+ madd_v3_v3fl(vel, p_vel, part->partfac);
- VECCOPY(pa->state.vel,vel);
+ mul_v3_v3fl(pa->state.vel, vel, ptex.ivel);
/* -location from emitter */
- VECCOPY(pa->state.co,loc);
+ copy_v3_v3(pa->state.co,loc);
/* -rotation */
- pa->state.rot[0]=1.0;
- pa->state.rot[1]=pa->state.rot[2]=pa->state.rot[3]=0.0;
+ unit_qt(pa->state.rot);
if(part->rotmode){
/* create vector into which rotation is aligned */
@@ -1930,7 +1860,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
/* rotation phase */
phasefac = part->phasefac;
if(part->randphasefac != 0.0f)
- phasefac += part->randphasefac * r_phase;
+ phasefac += part->randphasefac * PSYS_FRAND(p + 20);
axis_angle_to_quat( q_phase,x_vec, phasefac*(float)M_PI);
/* combine base rotation & phase */
@@ -1939,34 +1869,27 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
/* -angular velocity */
- pa->state.ave[0] = pa->state.ave[1] = pa->state.ave[2] = 0.0;
+ zero_v3(pa->state.ave);
if(part->avemode){
switch(part->avemode){
case PART_AVE_SPIN:
- VECCOPY(pa->state.ave,vel);
+ copy_v3_v3(pa->state.ave, vel);
break;
case PART_AVE_RAND:
- VECCOPY(pa->state.ave,r_ave);
+ copy_v3_v3(pa->state.ave, r_ave);
break;
}
normalize_v3(pa->state.ave);
mul_v3_fl(pa->state.ave,part->avefac);
-
- //icu=find_ipocurve(psys->part->ipo,PART_EMIT_AVE);
- //if(icu){
- // calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
- // mul_v3_fl(pa->state.ave,icu->curval);
- //}
}
}
-
if(part->type == PART_HAIR){
pa->lifetime = 100.0f;
}
else{
- pa->lifetime = part->lifetime*ptex.life;
+ pa->lifetime = part->lifetime * ptex.life;
if(part->randlife != 0.0)
pa->lifetime *= 1.0f - part->randlife * PSYS_FRAND(p + 21);
@@ -1993,15 +1916,9 @@ static void reset_all_particles(ParticleSimulationData *sim, float dtime, float
{
ParticleData *pa;
int p, totpart=sim->psys->totpart;
- //float *vg_vel=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_VEL);
- //float *vg_tan=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_TAN);
- //float *vg_rot=psys_cache_vgroup(sim->psmd->dm,sim->psys,PSYS_VG_ROT);
for(p=from, pa=sim->psys->particles+from; p<totpart; p++, pa++)
reset_particle(sim, pa, dtime, cfra);
-
- //if(vg_vel)
- // MEM_freeN(vg_vel);
}
/************************************************/
/* Particle targets */
@@ -2052,12 +1969,14 @@ void psys_count_keyed_targets(ParticleSimulationData *sim)
static void set_keyed_keys(ParticleSimulationData *sim)
{
ParticleSystem *psys = sim->psys;
- ParticleSimulationData ksim = {sim->scene, NULL, NULL, NULL};
+ ParticleSimulationData ksim= {0};
ParticleTarget *pt;
PARTICLE_P;
ParticleKey *key;
int totpart = psys->totpart, k, totkeys = psys->totkeyed;
+ ksim.scene= sim->scene;
+
/* no proper targets so let's clear and bail out */
if(psys->totkeyed==0) {
free_keyed_keys(psys);
@@ -2228,7 +2147,9 @@ void psys_make_temp_pointcache(Object *ob, ParticleSystem *psys)
if(cache->flag & PTCACHE_DISK_CACHE && cache->mem_cache.first == NULL) {
PTCacheID pid;
BKE_ptcache_id_from_particles(&pid, ob, psys);
+ cache->flag &= ~PTCACHE_DISK_CACHE;
BKE_ptcache_disk_to_mem(&pid);
+ cache->flag |= PTCACHE_DISK_CACHE;
}
}
static void psys_clear_temp_pointcache(ParticleSystem *psys)
@@ -2280,136 +2201,249 @@ static void psys_update_effectors(ParticleSimulationData *sim)
precalc_guides(sim, sim->psys->effectors);
}
-/*************************************************
+/*********************************************************************************************************
SPH fluid physics
- In theory, there could be unlimited implementation
- of SPH simulators
-**************************************************/
-void particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra, float mass){
-/****************************************************************************************************************
-* This code uses in some parts adapted algorithms from the pseduo code as outlined in the Research paper
-* Titled: Particle-based Viscoelastic Fluid Simulation.
-* Authors: Simon Clavet, Philippe Beaudoin and Pierre Poulin
-*
-* Website: http://www.iro.umontreal.ca/labs/infographie/papers/Clavet-2005-PVFS/
-* Presented at Siggraph, (2005)
-*
-*****************************************************************************************************************/
- KDTree *tree = psys->tree;
- KDTreeNearest *ptn = NULL;
-
- SPHFluidSettings *fluid = part->fluid;
- ParticleData *second_particle;
+ In theory, there could be unlimited implementation of SPH simulators
- float start[3], end[3], v[3];
- float temp[3];
- float q, radius, D;
- float p, pnear, pressure_near, pressure;
- float dtime = dfra * psys_get_timestep(sim);
- float omega = fluid->viscosity_omega;
- float beta = fluid->viscosity_omega;
- float massfactor = 1.0f/mass;
- int n, neighbours;
+ This code uses in some parts adapted algorithms from the pseudo code as outlined in the Research paper:
-
- radius = fluid->radius;
+ Titled: Particle-based Viscoelastic Fluid Simulation.
+ Authors: Simon Clavet, Philippe Beaudoin and Pierre Poulin
+ Website: http://www.iro.umontreal.ca/labs/infographie/papers/Clavet-2005-PVFS/
- VECCOPY(start, pa->prev_state.co);
- VECCOPY(end, pa->state.co);
+ Presented at Siggraph, (2005)
- VECCOPY(v, pa->state.vel);
+***********************************************************************************************************/
+#define PSYS_FLUID_SPRINGS_INITIAL_SIZE 256
+static ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring)
+{
+ /* Are more refs required? */
+ if(psys->alloc_fluidsprings == 0 || psys->fluid_springs == NULL) {
+ psys->alloc_fluidsprings = PSYS_FLUID_SPRINGS_INITIAL_SIZE;
+ psys->fluid_springs = (ParticleSpring*)MEM_callocN(psys->alloc_fluidsprings * sizeof(ParticleSpring), "Particle Fluid Springs");
+ }
+ else if(psys->tot_fluidsprings == psys->alloc_fluidsprings) {
+ /* Double the number of refs allocated */
+ psys->alloc_fluidsprings *= 2;
+ psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
+ }
- neighbours = BLI_kdtree_range_search(tree, radius, start, NULL, &ptn);
+ memcpy(psys->fluid_springs + psys->tot_fluidsprings, spring, sizeof(ParticleSpring));
+ psys->tot_fluidsprings++;
- /* use ptn[n].co to store relative direction */
- for(n=1; n<neighbours; n++) {
- sub_v3_v3(ptn[n].co, start);
- normalize_v3(ptn[n].co);
- }
-
- /* Viscosity - Algorithm 5 */
- if (omega > 0.f || beta > 0.f) {
- float u, I;
+ return psys->fluid_springs + psys->tot_fluidsprings - 1;
+}
- for(n=1; n<neighbours; n++) {
- second_particle = psys->particles + ptn[n].index;
- q = ptn[n].dist/radius;
-
- sub_v3_v3v3(temp, v, second_particle->prev_state.vel);
-
- u = dot_v3v3(ptn[n].co, temp);
+static void delete_fluid_spring(ParticleSystem *psys, int j)
+{
+ if (j != psys->tot_fluidsprings - 1)
+ psys->fluid_springs[j] = psys->fluid_springs[psys->tot_fluidsprings - 1];
+
+ psys->tot_fluidsprings--;
- if (u > 0){
- I = dtime * ((1-q) * (omega * u + beta * u*u)) * 0.5f;
- madd_v3_v3fl(v, ptn[n].co, -I * massfactor);
- }
- }
+ if (psys->tot_fluidsprings < psys->alloc_fluidsprings/2 && psys->alloc_fluidsprings > PSYS_FLUID_SPRINGS_INITIAL_SIZE){
+ psys->alloc_fluidsprings /= 2;
+ psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
}
+}
+
+static EdgeHash *build_fluid_springhash(ParticleSystem *psys)
+{
+ EdgeHash *springhash = NULL;
+ ParticleSpring *spring;
+ int i = 0;
- /* Hooke's spring force */
- if (fluid->spring_k > 0.f) {
- float D, L = fluid->rest_length;
- for(n=1; n<neighbours; n++) {
- /* L is a factor of radius */
- D = dtime * 10.f * fluid->spring_k * (1.f - L) * (L - ptn[n].dist/radius);
- madd_v3_v3fl(v, ptn[n].co, -D * massfactor);
+ springhash = BLI_edgehash_new();
+
+ for(i=0, spring=psys->fluid_springs; i<psys->tot_fluidsprings; i++, spring++)
+ BLI_edgehash_insert(springhash, spring->particle_index[0], spring->particle_index[1], SET_INT_IN_POINTER(i+1));
+
+ return springhash;
+}
+static void particle_fluidsim(ParticleSystem *psys, int own_psys, ParticleData *pa, float dtime, float mass, float *gravity, EdgeHash *springhash)
+{
+ SPHFluidSettings *fluid = psys->part->fluid;
+ KDTreeNearest *ptn = NULL;
+ ParticleData *npa;
+ ParticleSpring *spring = NULL;
+
+ float temp[3];
+ float q, q1, u, I, D, rij, d, Lij;
+ float pressure_near, pressure;
+ float p=0, pnear=0;
+
+ float omega = fluid->viscosity_omega;
+ float beta = fluid->viscosity_beta;
+ float massfactor = 1.0f/mass;
+ float spring_k = fluid->spring_k;
+ float h = fluid->radius;
+ float L = fluid->rest_length * fluid->radius;
+
+ int n, neighbours = BLI_kdtree_range_search(psys->tree, h, pa->prev_state.co, NULL, &ptn);
+ int spring_index = 0, index = own_psys ? pa - psys->particles : -1;
+
+ /* pressure and near pressure */
+ for(n=own_psys?1:0; n<neighbours; n++) {
+ /* disregard particles at the exact same location */
+ if(ptn[n].dist < FLT_EPSILON)
+ continue;
+
+ sub_v3_v3(ptn[n].co, pa->prev_state.co);
+ mul_v3_fl(ptn[n].co, 1.f/ptn[n].dist);
+ q = ptn[n].dist/h;
+
+ if(q < 1.f) {
+ q1 = 1.f - q;
+
+ p += q1*q1;
+ pnear += q1*q1*q1;
}
}
- /* Update particle position */
- VECADDFAC(end, start, v, dtime);
- /* Double Density Relaxation - Algorithm 2 */
- p = 0;
- pnear = 0;
- for(n=1; n<neighbours; n++) {
- q = ptn[n].dist/radius;
- p += ((1-q)*(1-q));
- pnear += ((1-q)*(1-q)*(1-q));
- }
- p *= part->mass;
- pnear *= part->mass;
+ p *= mass;
+ pnear *= mass;
pressure = fluid->stiffness_k * (p - fluid->rest_density);
pressure_near = fluid->stiffness_knear * pnear;
- for(n=1; n<neighbours; n++) {
- q = ptn[n].dist/radius;
+ /* main calculations */
+ for(n=own_psys?1:0; n<neighbours; n++) {
+ /* disregard particles at the exact same location */
+ if(ptn[n].dist < FLT_EPSILON)
+ continue;
+
+ npa = psys->particles + ptn[n].index;
+
+ rij = ptn[n].dist;
+ q = rij/h;
+ q1 = 1.f-q;
+
+ /* Double Density Relaxation - Algorithm 2 (can't be thread safe!)*/
+ D = dtime * dtime * (pressure + pressure_near*q1)*q1 * 0.5f;
+ madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
+ if(own_psys)
+ madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
+
+ if(index < ptn[n].index) {
+ /* Viscosity - Algorithm 5 */
+ if(omega > 0.f || beta > 0.f) {
+ sub_v3_v3v3(temp, pa->state.vel, npa->state.vel);
+ u = dot_v3v3(ptn[n].co, temp);
+
+ if (u > 0){
+ I = dtime * (q1 * (omega * u + beta * u*u)) * 0.5f;
+ madd_v3_v3fl(pa->state.vel, ptn[n].co, -I * massfactor);
+
+ if(own_psys)
+ madd_v3_v3fl(npa->state.vel, ptn[n].co, I * massfactor);
+ }
+ }
+
+ if(spring_k > 0.f) {
+ /* Viscoelastic spring force - Algorithm 4*/
+ if (fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash){
+ spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, ptn[n].index));
+
+ if(spring_index) {
+ spring = psys->fluid_springs + spring_index - 1;
+ }
+ else {
+ ParticleSpring temp_spring;
+ temp_spring.particle_index[0] = index;
+ temp_spring.particle_index[1] = ptn[n].index;
+ temp_spring.rest_length = (fluid->flag & SPH_CURRENT_REST_LENGTH) ? rij : L;
+ temp_spring.delete_flag = 0;
+
+ spring = add_fluid_spring(psys, &temp_spring);
+ }
- D = dtime * dtime * (pressure*(1-q) + pressure_near*(1-q)*(1-q))* 0.5f;
- madd_v3_v3fl(end, ptn[n].co, -D * massfactor);
- }
+ Lij = spring->rest_length;
+ d = fluid->yield_ratio * Lij;
+
+ if (rij > Lij + d) // Stretch, 25 is just a multiplier for plasticity_constant value to counter default dtime of 1/25
+ spring->rest_length += dtime * 25.f * fluid->plasticity_constant * (rij - Lij - d);
+ else if(rij < Lij - d) // Compress
+ spring->rest_length -= dtime * 25.f * fluid->plasticity_constant * (Lij - d - rij);
+ }
+ else { /* PART_SPRING_HOOKES - Hooke's spring force */
+ /* L is a factor of radius */
+ D = 0.5 * dtime * dtime * 10.f * fluid->spring_k * (1.f - L/h) * (L - rij);
+
+ madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
+ if(own_psys)
+ madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
+ }
+ }
+ }
+ }
/* Artificial buoyancy force in negative gravity direction */
- if (fluid->buoyancy >= 0.f && psys_uses_gravity(sim)) {
+ if (fluid->buoyancy >= 0.f && gravity) {
float B = -dtime * dtime * fluid->buoyancy * (p - fluid->rest_density) * 0.5f;
- madd_v3_v3fl(end, sim->scene->physics_settings.gravity, -B * massfactor);
+ madd_v3_v3fl(pa->state.co, gravity, -B * massfactor);
}
- /* apply final result and recalculate velocity */
- VECCOPY(pa->state.co, end);
- sub_v3_v3v3(pa->state.vel, end, start);
- mul_v3_fl(pa->state.vel, 1.f/dtime);
-
- if(ptn){ MEM_freeN(ptn); ptn=NULL;}
+ if(ptn)
+ MEM_freeN(ptn);
}
-static void apply_particle_fluidsim(ParticleSystem *psys, ParticleData *pa, ParticleSettings *part, ParticleSimulationData *sim, float dfra, float cfra){
+static void apply_particle_fluidsim(Object *ob, ParticleSystem *psys, ParticleData *pa, float dtime, float *gravity, EdgeHash *springhash){
ParticleTarget *pt;
-// float dtime = dfra*psys_get_timestep(sim);
- float particle_mass = part->mass;
- particle_fluidsim(psys, pa, part, sim, dfra, cfra, particle_mass);
+ particle_fluidsim(psys, 1, pa, dtime, psys->part->mass, gravity, springhash);
/*----check other SPH systems (Multifluids) , each fluid has its own parameters---*/
- for(pt=sim->psys->targets.first; pt; pt=pt->next) {
- ParticleSystem *epsys = psys_get_target_system(sim->ob, pt);
+ for(pt=psys->targets.first; pt; pt=pt->next) {
+ ParticleSystem *epsys = psys_get_target_system(ob, pt);
if(epsys)
- particle_fluidsim(epsys, pa, epsys->part, sim, dfra, cfra, particle_mass);
+ particle_fluidsim(epsys, 0, pa, dtime, psys->part->mass, gravity, NULL);
}
/*----------------------------------------------------------------*/
}
+static void apply_fluid_springs(ParticleSystem *psys, float timestep){
+ SPHFluidSettings *fluid = psys->part->fluid;
+ ParticleData *pa1, *pa2;
+ ParticleSpring *spring = psys->fluid_springs;
+
+ float h = fluid->radius;
+ float massfactor = 1.0f/psys->part->mass;
+ float D, Rij[3], rij, Lij;
+ int i;
+
+ if((fluid->flag & SPH_VISCOELASTIC_SPRINGS)==0 || fluid->spring_k == 0.f)
+ return;
+
+ /* Loop through the springs */
+ for(i=0; i<psys->tot_fluidsprings; i++, spring++) {
+ Lij = spring->rest_length;
+
+ if (Lij > h) {
+ spring->delete_flag = 1;
+ }
+ else {
+ pa1 = psys->particles + spring->particle_index[0];
+ pa2 = psys->particles + spring->particle_index[1];
+
+ sub_v3_v3v3(Rij, pa2->prev_state.co, pa1->prev_state.co);
+ rij = normalize_v3(Rij);
+
+ /* Calculate displacement and apply value */
+ D = 0.5f * timestep * timestep * 10.f * fluid->spring_k * (1.f - Lij/h) * (Lij - rij);
+
+ madd_v3_v3fl(pa1->state.co, Rij, -D * pa1->state.time * pa1->state.time * massfactor);
+ madd_v3_v3fl(pa2->state.co, Rij, D * pa2->state.time * pa2->state.time * massfactor);
+ }
+ }
+
+ /* Loop through springs backwaqrds - for efficient delete function */
+ for (i=psys->tot_fluidsprings-1; i >= 0; i--) {
+ if(psys->fluid_springs[i].delete_flag)
+ delete_fluid_spring(psys, i);
+ }
+}
+
/************************************************/
/* Newtonian physics */
/************************************************/
@@ -2422,8 +2456,11 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
ParticleKey states[5], tkey;
float timestep = psys_get_timestep(sim);
float force[3],impulse[3],dx[4][3],dv[4][3],oldpos[3];
- float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=sim->psys->cfra;
+ float dtime=dfra*timestep, time, pa_mass=part->mass, fac /*, fra=sim->psys->cfra*/;
int i, steps=1;
+ ParticleTexture ptex;
+
+ psys_get_texture(sim, pa, &ptex, PAMAP_PHYSICS, cfra);
/* maintain angular velocity */
VECCOPY(pa->state.ave,pa->prev_state.ave);
@@ -2457,6 +2494,9 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
if(part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)
pdDoEffectors(sim->psys->effectors, sim->colliders, part->effector_weights, &epoint, force, impulse);
+ mul_v3_fl(force, ptex.field);
+ mul_v3_fl(impulse, ptex.field);
+
/* calculate air-particle interaction */
if(part->dragfac!=0.0f){
fac=-part->dragfac*pa->size*pa->size*len_v3(states[i].vel);
@@ -2477,10 +2517,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
if(psys_uses_gravity(sim)
/* normal gravity is too strong for hair so it's disabled by default */
&& (part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)) {
- float gravity[3];
- VECCOPY(gravity, sim->scene->physics_settings.gravity);
- mul_v3_fl(gravity, part->effector_weights->global_gravity);
- VECADD(force,force,gravity);
+ madd_v3_v3fl(force, sim->scene->physics_settings.gravity, part->effector_weights->global_gravity * ptex.gravity);
}
/* calculate next state */
@@ -2495,7 +2532,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
if(i==0){
VECADDFAC(states[1].co,states->co,states->vel,dtime*0.5f);
VECADDFAC(states[1].vel,states->vel,force,dtime*0.5f);
- fra=sim->psys->cfra+0.5f*dfra;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
}
else{
VECADDFAC(pa->state.co,states->co,states[1].vel,dtime);
@@ -2512,7 +2549,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
VECADDFAC(states[1].co,states->co,dx[0],0.5f);
VECADDFAC(states[1].vel,states->vel,dv[0],0.5f);
- fra=sim->psys->cfra+0.5f*dfra;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
break;
case 1:
VECADDFAC(dx[1],states->vel,dv[0],0.5f);
@@ -2531,7 +2568,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
VECADD(states[3].co,states->co,dx[2]);
VECADD(states[3].vel,states->vel,dv[2]);
- fra=cfra;
+ /*fra=cfra;*/
break;
case 3:
VECADD(dx[3],states->vel,dv[2]);
@@ -2561,8 +2598,8 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
}
/* damp affects final velocity */
- if(part->dampfac!=0.0)
- mul_v3_fl(pa->state.vel,1.0f-part->dampfac);
+ if(part->dampfac != 0.f)
+ mul_v3_fl(pa->state.vel, 1.f - part->dampfac * ptex.damp);
VECCOPY(pa->state.ave, states->ave);
@@ -2772,23 +2809,26 @@ void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, B
MVert *x = col->md->x;
MVert *v = col->md->current_v;
float vel[3], co1[3], co2[3], uv[2], ipoint[3], temp[3], t;
+ float x0[3], x1[3], x2[3], x3[3];
+ float *t0=x0, *t1=x1, *t2=x2, *t3=(face->v4 ? x3 : NULL);
- float *t0, *t1, *t2, *t3;
- t0 = x[ face->v1 ].co;
- t1 = x[ face->v2 ].co;
- t2 = x[ face->v3 ].co;
- t3 = face->v4 ? x[ face->v4].co : NULL;
+ /* move collision face to start of timestep */
+ madd_v3_v3v3fl(t0, x[face->v1].co, v[face->v1].co, col->cfra);
+ madd_v3_v3v3fl(t1, x[face->v2].co, v[face->v2].co, col->cfra);
+ madd_v3_v3v3fl(t2, x[face->v3].co, v[face->v3].co, col->cfra);
+ if(t3)
+ madd_v3_v3v3fl(t3, x[face->v4].co, v[face->v4].co, col->cfra);
/* calculate average velocity of face */
- VECCOPY(vel, v[ face->v1 ].co);
- VECADD(vel, vel, v[ face->v2 ].co);
- VECADD(vel, vel, v[ face->v3 ].co);
- mul_v3_fl(vel, 0.33334f);
+ copy_v3_v3(vel, v[ face->v1 ].co);
+ add_v3_v3(vel, v[ face->v2 ].co);
+ add_v3_v3(vel, v[ face->v3 ].co);
+ mul_v3_fl(vel, 0.33334f*col->dfra);
/* substract face velocity, in other words convert to
a coordinate system where only the particle moves */
- VECADDFAC(co1, col->co1, vel, -col->t);
- VECSUB(co2, col->co2, vel);
+ madd_v3_v3v3fl(co1, col->co1, vel, -col->f);
+ sub_v3_v3v3(co2, col->co2, vel);
do
{
@@ -2836,11 +2876,18 @@ void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, B
} while(t2);
}
-/* particle - mesh collision code */
-/* in addition to basic point to surface collisions handles friction & damping,*/
-/* angular momentum <-> linear momentum and swept sphere - mesh collisions */
-/* 1. check for all possible deflectors for closest intersection on particle path */
-/* 2. if deflection was found kill the particle or calculate new coordinates */
+/* Particle - Mesh collision code
+ * Features:
+ * - point and swept sphere to mesh surface collisions
+ * - moving colliders (but not yet rotating or deforming colliders)
+ * - friction & damping
+ * - angular momentum <-> linear momentum
+ * - high accuracy by re-applying particle acceleration after collision
+ * - behaves relatively well even if limit of 10 collisions per simulation step is exceeded
+ * Main parts:
+ * 1. check for all possible deflectors for closest intersection on particle path
+ * 2. if deflection was found calculate new coordinates or kill the particle
+ */
static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, float cfra){
Object *ground_ob = NULL;
ParticleSettings *part = sim->psys->part;
@@ -2848,20 +2895,22 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
ParticleCollision col;
ColliderCache *coll;
BVHTreeRayHit hit;
- float ray_dir[3], zerovec[3]={0.0,0.0,0.0};
+ float ray_dir[3], acc[3];
float radius = ((part->flag & PART_SIZE_DEFL)?pa->size:0.0f), boid_z = 0.0f;
- float timestep = psys_get_timestep(sim);
+ float timestep = psys_get_timestep(sim) * dfra;
+ float inv_timestep = 1.0f/timestep;
int deflections=0, max_deflections=10;
- VECCOPY(col.co1, pa->prev_state.co);
- VECCOPY(col.co2, pa->state.co);
-
- VECCOPY(col.ve1, pa->prev_state.vel);
- VECCOPY(col.ve2, pa->state.vel);
- mul_v3_fl(col.ve1, timestep * dfra);
- mul_v3_fl(col.ve2, timestep * dfra);
-
- col.t = 0.0f;
+ /* get acceleration (from gravity, forcefields etc. to be re-applied after collision) */
+ sub_v3_v3v3(acc, pa->state.vel, pa->prev_state.vel);
+ mul_v3_fl(acc, inv_timestep);
+
+ /* set values for first iteration */
+ copy_v3_v3(col.co1, pa->prev_state.co);
+ copy_v3_v3(col.co2, pa->state.co);
+ copy_v3_v3(col.ve1, pa->prev_state.vel);
+ copy_v3_v3(col.ve2, pa->state.vel);
+ col.f = 0.0f;
/* override for boids */
if(part->phystype == PART_PHYS_BOIDS) {
@@ -2875,10 +2924,13 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
if(sim->colliders) while(deflections < max_deflections){
/* 1. */
- VECSUB(ray_dir, col.co2, col.co1);
+ sub_v3_v3v3(ray_dir, col.co2, col.co1);
hit.index = -1;
hit.dist = col.ray_len = len_v3(ray_dir);
+ col.cfra = fmod(cfra-dfra, 1.0f);
+ col.dfra = dfra;
+
/* even if particle is stationary we want to check for moving colliders */
/* if hit.dist is zero the bvhtree_ray_cast will just ignore everything */
if(hit.dist == 0.0f)
@@ -2903,45 +2955,49 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
/* 2. */
if(hit.index>=0) {
PartDeflect *pd = col.hit_ob->pd;
- int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0;
- float co[3]; /* point of collision */
- float vec[3]; /* movement through collision */
- float acc[3]; /* acceleration */
-
- float x = hit.dist/col.ray_len; /* location of collision between this iteration */
- float le = len_v3(col.ve1)/col.ray_len;
- float ac = len_v3(col.ve2)/col.ray_len - le; /* (taking acceleration into account) */
- float t = (-le + sqrt(le*le + 2*ac*x))/ac; /* time of collision between this iteration */
- float dt = col.t + x * (1.0f - col.t); /* time of collision between frame change*/
- float it = 1.0 - t;
+ float co[3]; /* point of collision */
+ float x = hit.dist/col.ray_len; /* location factor of collision between this iteration */
+ float f = col.f + x * (1.0f - col.f); /* time factor of collision between timestep */
+ float dt1 = (f - col.f) * timestep; /* time since previous collision (in seconds) */
+ float dt2 = (1.0f - f) * timestep; /* time left after collision (in seconds) */
+ int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0; /* did particle pass through the collision surface? */
+
+ deflections++;
interp_v3_v3v3(co, col.co1, col.co2, x);
- VECSUB(vec, col.co2, col.co1);
-
- VECSUB(acc, col.ve2, col.ve1);
- mul_v3_fl(col.vel, 1.0f-col.t);
+ /* make sure we don't hit the current face again */
+ /* TODO: could/should this be proportional to pa->size? */
+ madd_v3_v3fl(co, col.nor, (through ? -0.0001f : 0.0001f));
/* particle dies in collision */
if(through == 0 && (part->flag & PART_DIE_ON_COL || pd->flag & PDEFLE_KILL_PART)) {
pa->alive = PARS_DYING;
- pa->dietime = pa->state.time + (cfra - pa->state.time) * dt;
-
- /* we have to add this for dying particles too so that reactors work correctly */
- VECADDFAC(co, co, col.nor, (through ? -0.0001f : 0.0001f));
+ pa->dietime = sim->psys->cfra + (cfra - sim->psys->cfra) * f;
- VECCOPY(pa->state.co, co);
- interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, dt);
- interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, dt);
- interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, dt);
+ copy_v3_v3(pa->state.co, co);
+ interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, f);
+ interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, f);
+ interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, f);
/* particle is dead so we don't need to calculate further */
- deflections=max_deflections;
+ return;
}
+ /* figure out velocity and other data after collision */
else {
- float nor_vec[3], tan_vec[3], tan_vel[3];
+ float v0[3]; /* velocity directly before collision to be modified into velocity directly after collision */
+ float v0_nor[3];/* normal component of v0 */
+ float v0_tan[3];/* tangential component of v0 */
+ float vc_tan[3];/* tangential component of collision surface velocity */
+ float check[3];
+ float v0_dot, vc_dot, check_dot;
float damp, frict;
- float inp, inp_v;
+
+ /* get exact velocity right before collision */
+ madd_v3_v3v3fl(v0, col.ve1, acc, dt1);
+
+ /* convert collider velocity from 1/framestep to 1/s */
+ mul_v3_fl(col.vel, inv_timestep);
/* get damping & friction factors */
damp = pd->pdef_damp + pd->pdef_rdamp * 2 * (BLI_frand() - 0.5f);
@@ -2951,119 +3007,118 @@ static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, flo
CLAMP(frict,0.0,1.0);
/* treat normal & tangent components separately */
- inp = dot_v3v3(col.nor, vec);
- inp_v = dot_v3v3(col.nor, col.vel);
-
- VECADDFAC(tan_vec, vec, col.nor, -inp);
- VECADDFAC(tan_vel, col.vel, col.nor, -inp_v);
- if((part->flag & PART_ROT_DYN)==0)
- interp_v3_v3v3(tan_vec, tan_vec, tan_vel, frict);
-
- VECCOPY(nor_vec, col.nor);
- inp *= 1.0f - damp;
+ v0_dot = dot_v3v3(col.nor, v0);
+ madd_v3_v3v3fl(v0_tan, v0, col.nor, -v0_dot);
- if(through)
- inp_v *= damp;
+ vc_dot = dot_v3v3(col.nor, col.vel);
+ madd_v3_v3v3fl(vc_tan, col.vel, col.nor, -vc_dot);
- /* special case for object hitting the particle from behind */
- if(through==0 && ((inp_v>0 && inp>0 && inp_v>inp) || (inp_v<0 && inp<0 && inp_v<inp)))
- mul_v3_fl(nor_vec, inp_v);
- else
- mul_v3_fl(nor_vec, inp_v + (through ? 1.0f : -1.0f) * inp);
-
- /* angular <-> linear velocity - slightly more physical and looks even nicer than before */
- if(part->flag & PART_ROT_DYN) {
- float surface_vel[3], rot_vel[3], friction[3], dave[3], dvel[3];
-
- /* apparent velocity along collision surface */
- VECSUB(surface_vel, tan_vec, tan_vel);
+ /* handle friction effects (tangential and angular velocity) */
+ if(frict > 0.0f) {
+ /* angular <-> linear velocity */
+ if(part->flag & PART_ROT_DYN) {
+ float vr_tan[3], v1_tan[3], ave[3];
+
+ /* linear velocity of particle surface */
+ cross_v3_v3v3(vr_tan, col.nor, pa->state.ave);
+ mul_v3_fl(vr_tan, pa->size);
- /* direction of rolling friction */
- cross_v3_v3v3(rot_vel, pa->state.ave, col.nor);
- /* convert to current dt */
- mul_v3_fl(rot_vel, (timestep*dfra) * (1.0f - col.t));
- mul_v3_fl(rot_vel, pa->size);
+ /* change to coordinates that move with the collision plane */
+ sub_v3_v3v3(v1_tan, v0_tan, vc_tan);
+
+ /* The resulting velocity is a weighted average of particle cm & surface
+ * velocity. This weight (related to particle's moment of inertia) could
+ * be made a parameter for angular <-> linear conversion.
+ */
+ madd_v3_v3fl(v1_tan, vr_tan, -0.4);
+ mul_v3_fl(v1_tan, 1.0f/1.4f); /* 1/(1+0.4) */
- /* apply sliding friction */
- VECSUB(surface_vel, surface_vel, rot_vel);
- VECCOPY(friction, surface_vel);
+ /* rolling friction is around 0.01 of sliding friction (could be made a parameter) */
+ mul_v3_fl(v1_tan, 1.0f - 0.01f * frict);
- mul_v3_fl(surface_vel, 1.0 - frict);
- mul_v3_fl(friction, frict);
+ /* surface_velocity is opposite to cm velocity */
+ mul_v3_v3fl(vr_tan, v1_tan, -1.0f);
- /* sliding changes angular velocity */
- cross_v3_v3v3(dave, col.nor, friction);
- mul_v3_fl(dave, 1.0f/MAX2(pa->size, 0.001));
+ /* get back to global coordinates */
+ add_v3_v3(v1_tan, vc_tan);
- /* we assume rolling friction is around 0.01 of sliding friction */
- mul_v3_fl(rot_vel, 1.0 - frict*0.01);
+ /* convert to angular velocity*/
+ cross_v3_v3v3(ave, vr_tan, col.nor);
+ mul_v3_fl(ave, 1.0f/MAX2(pa->size, 0.001));
- /* change in angular velocity has to be added to the linear velocity too */
- cross_v3_v3v3(dvel, dave, col.nor);
- mul_v3_fl(dvel, pa->size);
- VECADD(rot_vel, rot_vel, dvel);
+ /* only friction will cause change in linear & angular velocity */
+ interp_v3_v3v3(pa->state.ave, pa->state.ave, ave, frict);
+ interp_v3_v3v3(v0_tan, v0_tan, v1_tan, frict);
+ }
+ else {
+ /* just basic friction (unphysical due to the friction model used in Blender) */
+ interp_v3_v3v3(v0_tan, v0_tan, vc_tan, frict);
+ }
+ }
- VECADD(surface_vel, surface_vel, rot_vel);
- VECADD(tan_vec, surface_vel, tan_vel);
+ /* stickness was possibly added before, so cancel that before calculating new normal velocity */
+ /* otherwise particles go flying out of the surface because of high reversed sticky velocity */
+ if(v0_dot < 0.0f) {
+ v0_dot += pd->pdef_stickness;
+ if(v0_dot > 0.0f)
+ v0_dot = 0.0f;
+ }
- /* convert back to normal time */
- mul_v3_fl(dave, 1.0f/MAX2((timestep*dfra) * (1.0f - col.t), 0.00001));
+ /* damping and flipping of velocity around normal */
+ v0_dot *= 1.0f - damp;
+ vc_dot *= through ? damp : 1.0f;
- mul_v3_fl(pa->state.ave, 1.0 - frict*0.01);
- VECADD(pa->state.ave, pa->state.ave, dave);
- }
+ /* special case for object hitting the particle from behind */
+ if(through==0 && ((vc_dot>0.0f && v0_dot>0.0f && vc_dot>v0_dot) || (vc_dot<0.0f && v0_dot<0.0f && vc_dot<v0_dot)))
+ mul_v3_v3fl(v0_nor, col.nor, vc_dot);
+ else
+ mul_v3_v3fl(v0_nor, col.nor, vc_dot + (through ? 1.0f : -1.0f) * v0_dot);
/* combine components together again */
- VECADD(vec, nor_vec, tan_vec);
-
- /* make sure we don't hit the current face again */
- VECADDFAC(co, co, col.nor, (through ? -0.0001f : 0.0001f));
+ add_v3_v3v3(v0, v0_nor, v0_tan);
+ /* keep boids above ground */
if(part->phystype == PART_PHYS_BOIDS && part->boids->options & BOID_ALLOW_LAND) {
BoidParticle *bpa = pa->boid;
if(bpa->data.mode == eBoidMode_OnLand || co[2] <= boid_z) {
co[2] = boid_z;
- vec[2] = 0.0f;
+ v0[2] = 0.0f;
}
}
-
- /* set coordinates for next iteration */
- /* apply acceleration to final position, but make sure particle stays above surface */
- madd_v3_v3v3fl(acc, vec, acc, it);
- ac = dot_v3v3(acc, col.nor);
- if((!through && ac < 0.0f) || (through && ac > 0.0f))
- madd_v3_v3fl(acc, col.nor, -ac);
-
- VECCOPY(col.co1, co);
- VECADDFAC(col.co2, co, acc, it);
-
- VECCOPY(col.ve1, vec);
- VECCOPY(col.ve2, acc);
-
- if(len_v3(vec) < 0.001 && len_v3v3(pa->state.co, pa->prev_state.co) < 0.001) {
- /* kill speed to stop slipping */
- VECCOPY(pa->state.vel,zerovec);
- VECCOPY(pa->state.co, co);
- if(part->flag & PART_ROT_DYN) {
- VECCOPY(pa->state.ave,zerovec);
- }
- }
- else {
- VECCOPY(pa->state.co, col.co2);
- mul_v3_v3fl(pa->state.vel, acc, 1.0f/MAX2((timestep*dfra) * (1.0f - col.t), 0.00001));
-
+ if(deflections < max_deflections) {
+ /* re-apply acceleration to final velocity and location */
+ madd_v3_v3v3fl(pa->state.vel, v0, acc, dt2);
+ madd_v3_v3v3fl(pa->state.co, co, v0, dt2);
+ madd_v3_v3fl(pa->state.co, acc, 0.5f*dt2*dt2);
+
+ /* make sure particle stays on the right side of the surface */
+ sub_v3_v3v3(check, pa->state.co, co);
+ /* (collision surface has moved during the time too) */
+ madd_v3_v3fl(check, col.vel, -dt2);
+
+ check_dot = dot_v3v3(check, col.nor);
+ if((!through && check_dot < 0.0f) || (through && check_dot > 0.0f))
+ madd_v3_v3fl(pa->state.co, col.nor, (through ? -0.0001f : 0.0001f) - check_dot);
+
/* Stickness to surface */
- normalize_v3(nor_vec);
madd_v3_v3fl(pa->state.vel, col.nor, -pd->pdef_stickness);
- }
- col.t = dt;
- }
- deflections++;
+ /* set coordinates for next iteration */
+ copy_v3_v3(col.co1, co);
+ copy_v3_v3(col.co2, pa->state.co);
- //reaction_state.time = cfra - (1.0f - dt) * dfra;
- //push_reaction(col.ob, psys, p, PART_EVENT_COLLIDE, &reaction_state);
+ copy_v3_v3(col.ve1, v0);
+ copy_v3_v3(col.ve2, pa->state.vel);
+
+ col.f = f;
+ }
+ else {
+ /* final chance to prevent failure, so stick to the surface and hope for the best */
+ madd_v3_v3v3fl(pa->state.co, co, col.vel, dt2);
+ copy_v3_v3(pa->state.vel, v0);
+ }
+ }
}
else
return;
@@ -3244,7 +3299,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
psys->clmd->point_cache = psys->pointcache;
psys->clmd->sim_parms->effector_weights = psys->part->effector_weights;
- psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, 0, 0);
+ psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm);
psys->clmd->sim_parms->effector_weights = NULL;
}
@@ -3269,11 +3324,11 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
psys_calc_dmcache(sim->ob, sim->psmd->dm, psys);
if(psys->clmd)
- cloth_free_modifier(sim->ob, psys->clmd);
+ cloth_free_modifier(psys->clmd);
}
- /* dynamics with cloth simulation */
- if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS)
+ /* dynamics with cloth simulation, psys->particles can be NULL with 0 particles [#25519] */
+ if(psys->part->type==PART_HAIR && psys->flag & PSYS_HAIR_DYNAMICS && psys->particles)
do_hair_dynamics(sim);
/* following lines were removed r29079 but cause bug [#22811], see report for details */
@@ -3283,20 +3338,17 @@ static void hair_step(ParticleSimulationData *sim, float cfra)
psys->flag |= PSYS_HAIR_UPDATED;
}
-static void save_hair(ParticleSimulationData *sim, float cfra){
+static void save_hair(ParticleSimulationData *sim, float UNUSED(cfra)){
Object *ob = sim->ob;
ParticleSystem *psys = sim->psys;
HairKey *key, *root;
PARTICLE_P;
- int totpart;
invert_m4_m4(ob->imat, ob->obmat);
psys->lattice= psys_get_lattice(sim);
if(psys->totpart==0) return;
-
- totpart=psys->totpart;
/* save new keys for elements if needed */
LOOP_PARTICLES {
@@ -3338,12 +3390,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
ParticleSystem *psys = sim->psys;
ParticleSettings *part=psys->part;
BoidBrainData bbd;
+ ParticleTexture ptex;
PARTICLE_P;
float timestep;
- /* current time */
- float ctime;
/* frame & time changes */
- float dfra, dtime, pa_dtime, pa_dfra=0.0;
+ float dfra, dtime;
float birthtime, dietime;
/* where have we gone in time since last time */
@@ -3351,11 +3402,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
timestep = psys_get_timestep(sim);
dtime= dfra*timestep;
- ctime= cfra*timestep;
if(dfra<0.0){
LOOP_EXISTING_PARTICLES {
- pa->size = part->size;
+ psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
+ pa->size = part->size*ptex.size;
if(part->randsize > 0.0)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
@@ -3369,65 +3420,67 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
psys_update_effectors(sim);
if(part->type != PART_HAIR)
- sim->colliders = get_collider_cache(sim->scene, NULL, NULL);
+ sim->colliders = get_collider_cache(sim->scene, sim->ob, NULL);
- if(part->phystype==PART_PHYS_BOIDS){
- ParticleTarget *pt = psys->targets.first;
- bbd.sim = sim;
- bbd.part = part;
- bbd.cfra = cfra;
- bbd.dfra = dfra;
- bbd.timestep = timestep;
+ /* initialize physics type specific stuff */
+ switch(part->phystype) {
+ case PART_PHYS_BOIDS:
+ {
+ ParticleTarget *pt = psys->targets.first;
+ bbd.sim = sim;
+ bbd.part = part;
+ bbd.cfra = cfra;
+ bbd.dfra = dfra;
+ bbd.timestep = timestep;
- psys_update_particle_tree(psys, cfra);
+ psys_update_particle_tree(psys, cfra);
- boids_precalc_rules(part, cfra);
+ boids_precalc_rules(part, cfra);
- for(; pt; pt=pt->next) {
- if(pt->ob)
- psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ for(; pt; pt=pt->next) {
+ if(pt->ob)
+ psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ }
+ break;
}
- }
- else if(part->phystype==PART_PHYS_FLUID){
- ParticleTarget *pt = psys->targets.first;
- psys_update_particle_tree(psys, cfra);
-
- for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
- if(pt->ob) psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ case PART_PHYS_FLUID:
+ {
+ ParticleTarget *pt = psys->targets.first;
+ psys_update_particle_tree(psys, cfra);
+
+ for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
+ if(pt->ob)
+ psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ }
+ break;
}
}
-
- /* main loop: calculate physics for all particles */
+ /* initialize all particles for dynamics */
LOOP_SHOWN_PARTICLES {
copy_particle_key(&pa->prev_state,&pa->state,1);
- pa->size = part->size;
+ psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
+
+ pa->size = part->size*ptex.size;
if(part->randsize > 0.0)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
- ///* reactions can change birth time so they need to be checked first */
- //if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0)
- // react_to_events(psys,p);
-
birthtime = pa->time;
dietime = birthtime + pa->lifetime;
- pa_dfra = dfra;
- pa_dtime = dtime;
-
+ /* store this, so we can do multiple loops over particles */
+ pa->state.time = dfra;
if(dietime <= cfra && psys->cfra < dietime){
/* particle dies some time between this and last step */
- pa_dfra = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra);
- pa_dtime = pa_dfra * timestep;
+ pa->state.time = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra);
pa->alive = PARS_DYING;
}
else if(birthtime <= cfra && birthtime >= psys->cfra){
/* particle is born some time between this and last step*/
- reset_particle(sim, pa, dtime, cfra);
+ reset_particle(sim, pa, dfra*timestep, cfra);
pa->alive = PARS_ALIVE;
- pa_dfra = cfra - birthtime;
- pa_dtime = pa_dfra*timestep;
+ pa->state.time = cfra - birthtime;
}
else if(dietime < cfra){
/* nothing to be done when particle is dead */
@@ -3440,63 +3493,100 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
else if(part->phystype == PART_PHYS_NO)
reset_particle(sim, pa, dtime, cfra);
- if(dfra>0.0 && ELEM(pa->alive,PARS_ALIVE,PARS_DYING)){
- switch(part->phystype){
- case PART_PHYS_NEWTON:
- /* do global forces & effectors */
- apply_particle_forces(sim, p, pa_dfra, cfra);
-
+ if(ELEM(pa->alive, PARS_ALIVE, PARS_DYING)==0 || (pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
+ pa->state.time = -1.f;
+ }
+
+ switch(part->phystype) {
+ case PART_PHYS_NEWTON:
+ {
+ LOOP_DYNAMIC_PARTICLES {
+ /* do global forces & effectors */
+ apply_particle_forces(sim, p, pa->state.time, cfra);
+
+ /* deflection */
+ if(sim->colliders)
+ deflect_particle(sim, p, pa->state.time, cfra);
+
+ /* rotations */
+ rotate_particle(part, pa, pa->state.time, timestep);
+ }
+ break;
+ }
+ case PART_PHYS_BOIDS:
+ {
+ LOOP_DYNAMIC_PARTICLES {
+ bbd.goal_ob = NULL;
+
+ boid_brain(&bbd, p, pa);
+
+ if(pa->alive != PARS_DYING) {
+ boid_body(&bbd, pa);
+
/* deflection */
if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
-
- /* rotations */
- rotate_particle(part, pa, pa_dfra, timestep);
- break;
- case PART_PHYS_BOIDS:
- {
- bbd.goal_ob = NULL;
- boid_brain(&bbd, p, pa);
- if(pa->alive != PARS_DYING) {
- boid_body(&bbd, pa);
-
- /* deflection */
- if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
- }
- break;
+ deflect_particle(sim, p, pa->state.time, cfra);
}
- case PART_PHYS_FLUID:
- {
- /* do global forces & effectors */
- apply_particle_forces(sim, p, pa_dfra, cfra);
+ }
+ break;
+ }
+ case PART_PHYS_FLUID:
+ {
+ EdgeHash *springhash = build_fluid_springhash(psys);
+ float *gravity = NULL;
- /* do fluid sim */
- apply_particle_fluidsim(psys, pa, part, sim, pa_dfra, cfra);
+ if(psys_uses_gravity(sim))
+ gravity = sim->scene->physics_settings.gravity;
- /* deflection */
- if(sim->colliders)
- deflect_particle(sim, p, pa_dfra, cfra);
-
- /* rotations, SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
- rotate_particle(part, pa, pa_dfra, timestep);
- break;
- }
+ /* do global forces & effectors */
+ LOOP_DYNAMIC_PARTICLES {
+ apply_particle_forces(sim, p, pa->state.time, cfra);
+ /* in fluids forces only effect velocity */
+ copy_v3_v3(pa->state.co, pa->prev_state.co);
+ }
+
+ /* actual fluids calculations (not threadsafe!) */
+ LOOP_DYNAMIC_PARTICLES {
+ apply_particle_fluidsim(sim->ob, psys, pa, pa->state.time*timestep, gravity, springhash);
}
- if(pa->alive == PARS_DYING){
- //push_reaction(ob,psys,p,PART_EVENT_DEATH,&pa->state);
+ /* Apply springs to particles */
+ apply_fluid_springs(psys, timestep);
+
+ /* apply velocity, collisions and rotation */
+ LOOP_DYNAMIC_PARTICLES {
+ /* velocity holds forces and viscosity, so apply them before collisions */
+ madd_v3_v3fl(pa->state.co, pa->state.vel, pa->state.time*timestep);
+
+ /* calculate new velocity based on new-old location */
+ sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
+ mul_v3_fl(pa->state.vel, 1.f/(pa->state.time*timestep));
- pa->alive=PARS_DEAD;
- pa->state.time=pa->dietime;
+ if(sim->colliders)
+ deflect_particle(sim, p, pa->state.time, cfra);
+
+ /* SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
+ rotate_particle(part, pa, pa->state.time, timestep);
}
- else
- pa->state.time=cfra;
- //push_reaction(ob,psys,p,PART_EVENT_NEAR,&pa->state);
+ if(springhash) {
+ BLI_edgehash_free(springhash, NULL);
+ springhash = NULL;
+ }
+ break;
}
}
+ /* finalize particle state and time after dynamics */
+ LOOP_DYNAMIC_PARTICLES {
+ if(pa->alive == PARS_DYING){
+ pa->alive=PARS_DEAD;
+ pa->state.time=pa->dietime;
+ }
+ else
+ pa->state.time=cfra;
+ }
+
free_collider_cache(&sim->colliders);
}
static void update_children(ParticleSimulationData *sim)
@@ -3504,8 +3594,12 @@ static void update_children(ParticleSimulationData *sim)
if((sim->psys->part->type == PART_HAIR) && (sim->psys->flag & PSYS_HAIR_DONE)==0)
/* don't generate children while growing hair - waste of time */
psys_free_children(sim->psys);
- else if(sim->psys->part->childtype && sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys))
- distribute_particles(sim, PART_FROM_CHILD);
+ else if(sim->psys->part->childtype) {
+ if(sim->psys->totchild != get_psys_tot_child(sim->scene, sim->psys))
+ distribute_particles(sim, PART_FROM_CHILD);
+ else
+ ; /* Children are up to date, nothing to do. */
+ }
else
psys_free_children(sim->psys);
}
@@ -3514,8 +3608,9 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
{
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
+ ParticleTexture ptex;
PARTICLE_P;
- float disp, birthtime, dietime;
+ float disp, dietime;
BLI_srandom(psys->seed);
@@ -3524,13 +3619,13 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
disp= (float)psys_get_current_display_percentage(psys)/100.0f;
LOOP_PARTICLES {
- pa->size = part->size;
+ psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
+ pa->size = part->size*ptex.size;
if(part->randsize > 0.0)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
psys->lattice= psys_get_lattice(sim);
- birthtime = pa->time;
dietime = pa->dietime;
/* update alive status and push events */
@@ -3556,7 +3651,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
}
}
-static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
+static void particles_fluid_step(ParticleSimulationData *sim, int UNUSED(cfra))
{
ParticleSystem *psys = sim->psys;
if(psys->particles){
@@ -3573,26 +3668,23 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
if( fluidmd && fluidmd->fss) {
FluidsimSettings *fss= fluidmd->fss;
ParticleSettings *part = psys->part;
- ParticleData *pa=0;
- char *suffix = "fluidsurface_particles_####";
- char *suffix2 = ".gz";
+ ParticleData *pa=NULL;
char filename[256];
char debugStrBuffer[256];
int curFrame = sim->scene->r.cfra -1; // warning - sync with derived mesh fsmesh loading
- int p, j, numFileParts, totpart;
+ int p, j, totpart;
int readMask, activeParts = 0, fileParts = 0;
gzFile gzf;
// XXX if(ob==G.obedit) // off...
// return;
-
+
// ok, start loading
- strcpy(filename, fss->surfdataPath);
- strcat(filename, suffix);
- BLI_path_abs(filename, G.sce);
+ BLI_snprintf(filename, sizeof(filename), "%sfluidsurface_particles_####.gz", fss->surfdataPath);
+
+ BLI_path_abs(filename, G.main->name);
BLI_path_frame(filename, curFrame, 0); // fixed #frame-no
- strcat(filename, suffix2);
-
+
gzf = gzopen(filename, "rb");
if (!gzf) {
snprintf(debugStrBuffer,256,"readFsPartData::error - Unable to open file for reading '%s' \n", filename);
@@ -3601,16 +3693,14 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
}
gzread(gzf, &totpart, sizeof(totpart));
- numFileParts = totpart;
totpart = (G.rendering)?totpart:(part->disp*totpart)/100;
part->totpart= totpart;
part->sta=part->end = 1.0f;
part->lifetime = sim->scene->r.efra + 1;
- /* initialize particles */
+ /* allocate particles */
realloc_particles(sim, part->totpart);
- initialize_all_particles(sim);
// set up reading mask
readMask = fss->typeFlags;
@@ -3642,6 +3732,9 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
pa->state.rot[0] = 1.0;
pa->state.rot[1] = pa->state.rot[2] = pa->state.rot[3] = 0.0;
+ pa->time = 1.f;
+ pa->dietime = sim->scene->r.efra + 1;
+ pa->lifetime = sim->scene->r.efra;
pa->alive = PARS_ALIVE;
//if(a<25) fprintf(stderr,"FSPARTICLE debug set %s , a%d = %f,%f,%f , life=%f \n", filename, a, pa->co[0],pa->co[1],pa->co[2], pa->lifetime );
} else {
@@ -3664,19 +3757,11 @@ static void particles_fluid_step(ParticleSimulationData *sim, int cfra)
#endif // DISABLE_ELBEEM
}
-static int emit_particles(ParticleSimulationData *sim, PTCacheID *pid, float cfra)
+static int emit_particles(ParticleSimulationData *sim, PTCacheID *pid, float UNUSED(cfra))
{
ParticleSystem *psys = sim->psys;
- ParticleSettings *part = psys->part;
int oldtotpart = psys->totpart;
- int totpart = oldtotpart;
-
- if(pid && psys->pointcache->flag & PTCACHE_EXTERNAL)
- totpart = pid->cache->totpoint;
- else if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT)
- totpart = part->grid_res*part->grid_res*part->grid_res;
- else
- totpart = psys->part->totpart;
+ int totpart = tot_particles(psys, pid);
if(totpart != oldtotpart)
realloc_particles(sim, totpart);
@@ -3694,94 +3779,84 @@ static void system_step(ParticleSimulationData *sim, float cfra)
ParticleSystem *psys = sim->psys;
ParticleSettings *part = psys->part;
PointCache *cache = psys->pointcache;
- PTCacheID pid, *use_cache = NULL;
+ PTCacheID ptcacheid, *pid = NULL;
PARTICLE_P;
- int oldtotpart;
- float disp; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; */
- int init= 0, emit= 0; //, only_children_changed= 0;
- int framenr, framedelta, startframe = 0, endframe = 100;
-
- framenr= (int)sim->scene->r.cfra;
- framedelta= framenr - cache->simframe;
+ float disp, cache_cfra = cfra; /*, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; */
+ int startframe = 0, endframe = 100, oldtotpart = 0;
/* cache shouldn't be used for hair or "continue physics" */
if(part->type != PART_HAIR && BKE_ptcache_get_continue_physics() == 0) {
- BKE_ptcache_id_from_particles(&pid, sim->ob, psys);
- use_cache = &pid;
- }
-
- if(use_cache) {
- psys_clear_temp_pointcache(sim->psys);
+ psys_clear_temp_pointcache(psys);
/* set suitable cache range automatically */
if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0)
- psys_get_pointcache_start_end(sim->scene, sim->psys, &cache->startframe, &cache->endframe);
-
- BKE_ptcache_id_time(&pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
+ psys_get_pointcache_start_end(sim->scene, psys, &cache->startframe, &cache->endframe);
- /* simulation is only active during a specific period */
- if(framenr < startframe) {
- psys_reset(psys, PSYS_RESET_CACHE_MISS);
- return;
- }
- else if(framenr > endframe) {
- framenr= endframe;
- }
+ pid = &ptcacheid;
+ BKE_ptcache_id_from_particles(pid, sim->ob, psys);
- if(framenr == startframe) {
- BKE_ptcache_id_reset(sim->scene, use_cache, PTCACHE_RESET_OUTDATED);
- BKE_ptcache_validate(cache, framenr);
+ BKE_ptcache_id_time(pid, sim->scene, 0.0f, &startframe, &endframe, NULL);
+
+ /* clear everythin on start frame */
+ if((int)cfra == startframe) {
+ BKE_ptcache_id_reset(sim->scene, pid, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_validate(cache, startframe);
cache->flag &= ~PTCACHE_REDO_NEEDED;
}
+
+ CLAMP(cache_cfra, startframe, endframe);
}
-/* 1. emit particles */
-
- /* verify if we need to reallocate */
+/* 1. emit particles and redo particles if needed */
oldtotpart = psys->totpart;
-
- emit = emit_particles(sim, use_cache, cfra);
- if(use_cache && emit > 0)
- BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, cfra);
- init = emit*emit + (psys->recalc & PSYS_RECALC_RESET);
-
- if(init) {
+ if(emit_particles(sim, pid, cfra) || psys->recalc & PSYS_RECALC_RESET) {
distribute_particles(sim, part->from);
initialize_all_particles(sim);
+ /* reset only just created particles (on startframe all particles are recreated) */
reset_all_particles(sim, 0.0, cfra, oldtotpart);
+ if (psys->fluid_springs) {
+ MEM_freeN(psys->fluid_springs);
+ psys->fluid_springs = NULL;
+ }
+
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = 0;
+
/* flag for possible explode modifiers after this system */
sim->psmd->flag |= eParticleSystemFlag_Pars;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, cfra);
}
/* 2. try to read from the cache */
- if(use_cache) {
- int cache_result = BKE_ptcache_read_cache(use_cache, cfra, sim->scene->r.frs_sec);
+ if(pid) {
+ int cache_result = BKE_ptcache_read(pid, cache_cfra);
if(ELEM(cache_result, PTCACHE_READ_EXACT, PTCACHE_READ_INTERPOLATED)) {
cached_step(sim, cfra);
update_children(sim);
psys_update_path_cache(sim, cfra);
- BKE_ptcache_validate(cache, framenr);
+ BKE_ptcache_validate(cache, (int)cache_cfra);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(use_cache, framenr);
+ BKE_ptcache_write(pid, (int)cache_cfra);
return;
}
+ /* Cache is supposed to be baked, but no data was found so bail out */
+ else if(cache->flag & PTCACHE_BAKED) {
+ psys_reset(psys, PSYS_RESET_CACHE_MISS);
+ return;
+ }
else if(cache_result == PTCACHE_READ_OLD) {
psys->cfra = (float)cache->simframe;
cached_step(sim, psys->cfra);
}
- else if(cfra != startframe && ( /*sim->ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED))) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */
- psys_reset(psys, PSYS_RESET_CACHE_MISS);
- return;
- }
/* if on second frame, write cache for first frame */
if(psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(use_cache, startframe);
+ BKE_ptcache_write(pid, startframe);
}
else
BKE_ptcache_invalidate(cache);
@@ -3804,7 +3879,7 @@ static void system_step(ParticleSimulationData *sim, float cfra)
/* handle negative frame start at the first frame by doing
* all the steps before the first frame */
- if(framenr == startframe && part->sta < startframe)
+ if((int)cfra == startframe && part->sta < startframe)
totframesback = (startframe - (int)part->sta);
for(dframe=-totframesback; dframe<=0; dframe++) {
@@ -3819,14 +3894,13 @@ static void system_step(ParticleSimulationData *sim, float cfra)
}
/* 4. only write cache starting from second frame */
- if(use_cache) {
- BKE_ptcache_validate(cache, framenr);
- if(framenr != startframe)
- BKE_ptcache_write_cache(use_cache, framenr);
+ if(pid) {
+ BKE_ptcache_validate(cache, (int)cache_cfra);
+ if((int)cache_cfra != startframe)
+ BKE_ptcache_write(pid, (int)cache_cfra);
}
- if(init)
- update_children(sim);
+ update_children(sim);
/* cleanup */
if(psys->lattice){
@@ -3904,6 +3978,8 @@ static void fluid_default_settings(ParticleSettings *part){
fluid->radius = 0.5f;
fluid->spring_k = 0.f;
+ fluid->plasticity_constant = 0.1f;
+ fluid->yield_ratio = 0.1f;
fluid->rest_length = 0.5f;
fluid->viscosity_omega = 2.f;
fluid->viscosity_beta = 0.f;
@@ -3913,7 +3989,7 @@ static void fluid_default_settings(ParticleSettings *part){
fluid->buoyancy = 0.f;
}
-static void psys_changed_physics(ParticleSimulationData *sim)
+static void psys_prepare_physics(ParticleSimulationData *sim)
{
ParticleSettings *part = sim->psys->part;
@@ -3952,7 +4028,7 @@ static void psys_changed_physics(ParticleSimulationData *sim)
static int hair_needs_recalc(ParticleSystem *psys)
{
if(!(psys->flag & PSYS_EDITED) && (!psys->edit || !psys->edit->edited) &&
- ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET)) {
+ ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET || (psys->part->flag & PART_HAIR_REGROW && !psys->edit))) {
return 1;
}
@@ -3963,7 +4039,7 @@ static int hair_needs_recalc(ParticleSystem *psys)
* then advances in to actual particle calculations depending on particle type */
void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
{
- ParticleSimulationData sim = {scene, ob, psys, NULL, NULL};
+ ParticleSimulationData sim= {0};
ParticleSettings *part = psys->part;
float cfra;
@@ -3974,6 +4050,10 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
return;
cfra= BKE_curframe(scene);
+
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
sim.psmd= psys_get_modifier(ob, psys);
/* system was already updated from modifier stack */
@@ -3992,19 +4072,34 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
if(psys->recalc & PSYS_RECALC_TYPE)
psys_changed_type(&sim);
- else if(psys->recalc & PSYS_RECALC_PHYS)
- psys_changed_physics(&sim);
+
+ if(psys->recalc & PSYS_RECALC_RESET)
+ psys->totunexist = 0;
+
+ /* setup necessary physics type dependent additional data if it doesn't yet exist */
+ psys_prepare_physics(&sim);
switch(part->type) {
case PART_HAIR:
{
+ /* nothing to do so bail out early */
+ if(psys->totpart == 0 && part->totpart == 0) {
+ psys_free_path_cache(psys, NULL);
+ free_hair(ob, psys, 0);
+ }
/* (re-)create hair */
- if(hair_needs_recalc(psys)) {
+ else if(hair_needs_recalc(psys)) {
float hcfra=0.0f;
int i, recalc = psys->recalc;
free_hair(ob, psys, 0);
+ if(psys->edit && psys->free_edit) {
+ psys->free_edit(psys->edit);
+ psys->edit = NULL;
+ psys->free_edit = NULL;
+ }
+
/* first step is negative so particles get killed and reset */
psys->cfra= 1.0f;
@@ -4020,6 +4115,8 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
psys->flag |= PSYS_HAIR_DONE;
psys->recalc = recalc;
}
+ else if(psys->flag & PSYS_EDITED)
+ psys->flag |= PSYS_HAIR_DONE;
if(psys->flag & PSYS_HAIR_DONE)
hair_step(&sim, cfra);
@@ -4037,12 +4134,13 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
case PART_PHYS_KEYED:
{
PARTICLE_P;
+ float disp = (float)psys_get_current_display_percentage(psys)/100.0f;
/* Particles without dynamics haven't been reset yet because they don't use pointcache */
if(psys->recalc & PSYS_RECALC_RESET)
psys_reset(psys, PSYS_RESET_ALL);
- if(emit_particles(&sim, NULL, cfra)) {
+ if(emit_particles(&sim, NULL, cfra) || (psys->recalc & PSYS_RECALC_RESET)) {
free_keyed_keys(psys);
distribute_particles(&sim, part->from);
initialize_all_particles(&sim);
@@ -4054,6 +4152,11 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
reset_particle(&sim, pa, 0.0, cfra);
+
+ if(PSYS_FRAND(p) > disp)
+ pa->flag |= PARS_NO_DISP;
+ else
+ pa->flag &= ~PARS_NO_DISP;
}
if(part->phystype == PART_PHYS_KEYED) {
@@ -4077,7 +4180,8 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
psys->cfra = cfra;
psys->recalc = 0;
- /* save matrix for duplicators */
- invert_m4_m4(psys->imat, ob->obmat);
+ /* save matrix for duplicators, at rendertime the actual dupliobject's matrix is used so don't update! */
+ if(psys->renderdata==0)
+ invert_m4_m4(psys->imat, ob->obmat);
}
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index a35e40d7cf7..6ea14606660 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1,4 +1,5 @@
-/**
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -19,7 +20,7 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
-* Contributor(s): Campbell Barton <ideasman42@gmail.com>
+ * Contributor(s): Campbell Barton <ideasman42@gmail.com>
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -44,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -63,6 +65,7 @@
#include "BKE_smoke.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
+
#include "BIK_api.h"
/* both in intern */
@@ -95,44 +98,55 @@
/* could be made into a pointcache option */
#define DURIAN_POINTCACHE_LIB_OK 1
-int ptcache_data_size[] = {
- sizeof(int), // BPHYS_DATA_INDEX
- 3 * sizeof(float), // BPHYS_DATA_LOCATION:
- 3 * sizeof(float), // BPHYS_DATA_VELOCITY:
- 4 * sizeof(float), // BPHYS_DATA_ROTATION:
- 3 * sizeof(float), // BPHYS_DATA_AVELOCITY: /* also BPHYS_DATA_XCONST */
- sizeof(float), // BPHYS_DATA_SIZE:
- 3 * sizeof(float), // BPHYS_DATA_TIMES:
- sizeof(BoidData) // case BPHYS_DATA_BOIDS:
+static int ptcache_data_size[] = {
+ sizeof(unsigned int), // BPHYS_DATA_INDEX
+ 3 * sizeof(float), // BPHYS_DATA_LOCATION
+ 3 * sizeof(float), // BPHYS_DATA_VELOCITY
+ 4 * sizeof(float), // BPHYS_DATA_ROTATION
+ 3 * sizeof(float), // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST
+ sizeof(float), // BPHYS_DATA_SIZE
+ 3 * sizeof(float), // BPHYS_DATA_TIMES
+ sizeof(BoidData) // case BPHYS_DATA_BOIDS
+};
+
+static int ptcache_extra_datasize[] = {
+ 0,
+ sizeof(ParticleSpring)
};
+/* forward declerations */
+static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len);
+static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode);
+static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
+static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
+
/* Common functions */
-static int ptcache_read_basic_header(PTCacheFile *pf)
+static int ptcache_basic_header_read(PTCacheFile *pf)
{
int error=0;
/* Custom functions should read these basic elements too! */
- if(!error && !fread(&pf->totpoint, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&pf->totpoint, sizeof(unsigned int), 1, pf->fp))
error = 1;
- if(!error && !fread(&pf->data_types, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&pf->data_types, sizeof(unsigned int), 1, pf->fp))
error = 1;
return !error;
}
-static int ptcache_write_basic_header(PTCacheFile *pf)
+static int ptcache_basic_header_write(PTCacheFile *pf)
{
/* Custom functions should write these basic elements too! */
- if(!fwrite(&pf->totpoint, sizeof(int), 1, pf->fp))
+ if(!fwrite(&pf->totpoint, sizeof(unsigned int), 1, pf->fp))
return 0;
- if(!fwrite(&pf->data_types, sizeof(int), 1, pf->fp))
+ if(!fwrite(&pf->data_types, sizeof(unsigned int), 1, pf->fp))
return 0;
return 1;
}
/* Softbody functions */
-static int ptcache_write_softbody(int index, void *soft_v, void **data, int cfra)
+static int ptcache_softbody_write(int index, void *soft_v, void **data, int UNUSED(cfra))
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -142,7 +156,7 @@ static int ptcache_write_softbody(int index, void *soft_v, void **data, int cfra
return 1;
}
-static void ptcache_read_softbody(int index, void *soft_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_softbody_read(int index, void *soft_v, void **data, float UNUSED(cfra), float *old_data)
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -156,7 +170,7 @@ static void ptcache_read_softbody(int index, void *soft_v, void **data, float fr
PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, 0, bp->vec);
}
}
-static void ptcache_interpolate_softbody(int index, void *soft_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_softbody_interpolate(int index, void *soft_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
SoftBody *soft= soft_v;
BodyPoint *bp = soft->bpoint + index;
@@ -188,24 +202,44 @@ static void ptcache_interpolate_softbody(int index, void *soft_v, void **data, f
VECCOPY(bp->pos, keys->co);
VECCOPY(bp->vec, keys->vel);
}
-static int ptcache_totpoint_softbody(void *soft_v, int cfra)
+static int ptcache_softbody_totpoint(void *soft_v, int UNUSED(cfra))
{
SoftBody *soft= soft_v;
return soft->totpoint;
}
/* Particle functions */
-static int ptcache_write_particle(int index, void *psys_v, void **data, int cfra)
+void BKE_ptcache_make_particle_key(ParticleKey *key, int index, void **data, float time)
+{
+ PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, index, key->co);
+ PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, index, key->vel);
+
+ /* no rotation info, so make something nice up */
+ if(data[BPHYS_DATA_ROTATION]==NULL) {
+ vec_to_quat( key->rot, key->vel, OB_NEGX, OB_POSZ);
+ }
+ else {
+ PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, index, key->rot);
+ }
+
+ PTCACHE_DATA_TO(data, BPHYS_DATA_AVELOCITY, index, key->ave);
+ key->time = time;
+}
+static int ptcache_particle_write(int index, void *psys_v, void **data, int cfra)
{
ParticleSystem *psys= psys_v;
ParticleData *pa = psys->particles + index;
BoidParticle *boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
- float times[3] = {pa->time, pa->dietime, pa->lifetime};
+ float times[3];
int step = psys->pointcache->step;
/* No need to store unborn or died particles outside cache step bounds */
if(data[BPHYS_DATA_INDEX] && (cfra < pa->time - step || cfra > pa->dietime + step))
return 0;
-
+
+ times[0]= pa->time;
+ times[1]= pa->dietime;
+ times[2]= pa->lifetime;
+
PTCACHE_DATA_FROM(data, BPHYS_DATA_INDEX, &index);
PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, pa->state.co);
PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, pa->state.vel);
@@ -220,19 +254,12 @@ static int ptcache_write_particle(int index, void *psys_v, void **data, int cfra
/* return flag 1+1=2 for newly born particles to copy exact birth location to previously cached frame */
return 1 + (pa->state.time >= pa->time && pa->prev_state.time <= pa->time);
}
-void BKE_ptcache_make_particle_key(ParticleKey *key, int index, void **data, float time)
-{
- PTCACHE_DATA_TO(data, BPHYS_DATA_LOCATION, index, key->co);
- PTCACHE_DATA_TO(data, BPHYS_DATA_VELOCITY, index, key->vel);
- PTCACHE_DATA_TO(data, BPHYS_DATA_ROTATION, index, key->rot);
- PTCACHE_DATA_TO(data, BPHYS_DATA_AVELOCITY, index, key->ave);
- key->time = time;
-}
-static void ptcache_read_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_particle_read(int index, void *psys_v, void **data, float cfra, float *old_data)
{
ParticleSystem *psys= psys_v;
ParticleData *pa;
BoidParticle *boid;
+ float timestep = 0.04f*psys->part->timetweak;
if(index >= psys->totpart)
return;
@@ -254,6 +281,8 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr
/* set frames cached before birth to birth time */
if(cfra < pa->time)
pa->state.time = pa->time;
+ else if(cfra > pa->dietime)
+ pa->state.time = pa->dietime;
if(data[BPHYS_DATA_SIZE])
PTCACHE_DATA_TO(data, BPHYS_DATA_SIZE, 0, &pa->size);
@@ -273,11 +302,11 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr
if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
if(cfra > pa->prev_state.time) {
sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
- mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
+ mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) * timestep);
}
else {
sub_v3_v3v3(pa->state.vel, pa->prev_state.co, pa->state.co);
- mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
+ mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) * timestep);
}
}
@@ -286,12 +315,12 @@ static void ptcache_read_particle(int index, void *psys_v, void **data, float fr
vec_to_quat( pa->state.rot,pa->state.vel, OB_NEGX, OB_POSZ);
}
}
-static void ptcache_interpolate_particle(int index, void *psys_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_particle_interpolate(int index, void *psys_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
ParticleSystem *psys= psys_v;
ParticleData *pa;
ParticleKey keys[4];
- float dfra;
+ float dfra, timestep = 0.04f*psys->part->timetweak;
if(index >= psys->totpart)
return;
@@ -319,11 +348,11 @@ static void ptcache_interpolate_particle(int index, void *psys_v, void **data, f
if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
if(keys[1].time > keys[2].time) {
sub_v3_v3v3(keys[2].vel, keys[1].co, keys[2].co);
- mul_v3_fl(keys[2].vel, (keys[1].time - keys[2].time) / frs_sec);
+ mul_v3_fl(keys[2].vel, (keys[1].time - keys[2].time) * timestep);
}
else {
sub_v3_v3v3(keys[2].vel, keys[2].co, keys[1].co);
- mul_v3_fl(keys[2].vel, (keys[2].time - keys[1].time) / frs_sec);
+ mul_v3_fl(keys[2].vel, (keys[2].time - keys[1].time) * timestep);
}
}
@@ -337,163 +366,81 @@ static void ptcache_interpolate_particle(int index, void *psys_v, void **data, f
dfra = cfra2 - cfra1;
- mul_v3_fl(keys[1].vel, dfra / frs_sec);
- mul_v3_fl(keys[2].vel, dfra / frs_sec);
+ mul_v3_fl(keys[1].vel, dfra * timestep);
+ mul_v3_fl(keys[2].vel, dfra * timestep);
psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
interp_qt_qtqt(pa->state.rot, keys[1].rot, keys[2].rot, (cfra - cfra1) / dfra);
- mul_v3_fl(pa->state.vel, frs_sec / dfra);
+ mul_v3_fl(pa->state.vel, 1.f / (dfra * timestep));
pa->state.time = cfra;
}
-static int ptcache_totpoint_particle(void *psys_v, int cfra)
+static int ptcache_particle_totpoint(void *psys_v, int UNUSED(cfra))
{
ParticleSystem *psys = psys_v;
return psys->totpart;
}
-static int ptcache_totwrite_particle(void *psys_v, int cfra)
+static int ptcache_particle_totwrite(void *psys_v, int cfra)
{
ParticleSystem *psys = psys_v;
ParticleData *pa= psys->particles;
int p, step = psys->pointcache->step;
int totwrite = 0;
+ if(cfra == 0)
+ return psys->totpart;
+
for(p=0; p<psys->totpart; p++,pa++)
totwrite += (cfra >= pa->time - step && cfra <= pa->dietime + step);
return totwrite;
}
-//static int ptcache_write_particle_stream(PTCacheFile *pf, PTCacheMem *pm, void *psys_v)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles;
-// BoidParticle *boid = NULL;
-// float times[3];
-// int i = 0;
-//
-// if(!pf && !pm)
-// return 0;
-//
-// for(i=0; i<psys->totpart; i++, pa++) {
-//
-// if(data[BPHYS_DATA_INDEX]) {
-// int step = psys->pointcache->step;
-// /* No need to store unborn or died particles */
-// if(pa->time - step > pa->state.time || pa->dietime + step < pa->state.time)
-// continue;
-// }
-//
-// times[0] = pa->time;
-// times[1] = pa->dietime;
-// times[2] = pa->lifetime;
-//
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_INDEX, &index);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_LOCATION, pa->state.co);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_VELOCITY, pa->state.vel);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_ROTATION, pa->state.rot);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_AVELOCITY, pa->state.ave);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_SIZE, &pa->size);
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_TIMES, times);
-//
-// boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
-// if(boid)
-// PTCACHE_DATA_FROM(data, BPHYS_DATA_BOIDS, &boid->data);
-//
-// if(pf && !ptcache_file_write_data(pf))
-// return 0;
-//
-// if(pm)
-// BKE_ptcache_mem_incr_pointers(pm);
-// }
-//
-// return 1;
-//}
-//static void ptcache_read_particle_stream(PTCacheFile *pf, PTCacheMem *pm, void *psys_v, void **data, float frs_sec, float cfra, float *old_data)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles + index;
-// BoidParticle *boid = (psys->part->phystype == PART_PHYS_BOIDS) ? pa->boid : NULL;
-//
-// if(cfra > pa->state.time)
-// memcpy(&pa->prev_state, &pa->state, sizeof(ParticleKey));
-//
-// if(old_data){
-// /* old format cache */
-// memcpy(&pa->state, old_data, sizeof(ParticleKey));
-// return;
-// }
-//
-// BKE_ptcache_make_particle_key(&pa->state, 0, data, cfra);
-//
-// if(data[BPHYS_DATA_SIZE])
-// PTCACHE_DATA_TO(data, BPHYS_DATA_SIZE, 0, &pa->size);
-//
-// if(data[BPHYS_DATA_TIMES]) {
-// float times[3];
-// PTCACHE_DATA_TO(data, BPHYS_DATA_TIMES, 0, &times);
-// pa->time = times[0];
-// pa->dietime = times[1];
-// pa->lifetime = times[2];
-// }
-//
-// if(boid)
-// PTCACHE_DATA_TO(data, BPHYS_DATA_BOIDS, 0, &boid->data);
-//
-// /* determine velocity from previous location */
-// if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_VELOCITY]) {
-// if(cfra > pa->prev_state.time) {
-// sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
-// mul_v3_fl(pa->state.vel, (cfra - pa->prev_state.time) / frs_sec);
-// }
-// else {
-// sub_v3_v3v3(pa->state.vel, pa->prev_state.co, pa->state.co);
-// mul_v3_fl(pa->state.vel, (pa->prev_state.time - cfra) / frs_sec);
-// }
-// }
-//
-// /* determine rotation from velocity */
-// if(data[BPHYS_DATA_LOCATION] && !data[BPHYS_DATA_ROTATION]) {
-// vec_to_quat( pa->state.rot,pa->state.vel, OB_POSX, OB_POSZ);
-// }
-//}
-//static void ptcache_interpolate_particle_stream(int index, void *psys_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
-//{
-// ParticleSystem *psys= psys_v;
-// ParticleData *pa = psys->particles + index;
-// ParticleKey keys[4];
-// float dfra;
-//
-// cfra = MIN2(cfra, pa->dietime);
-// cfra1 = MIN2(cfra1, pa->dietime);
-// cfra2 = MIN2(cfra2, pa->dietime);
-//
-// if(cfra1 == cfra2)
-// return;
-//
-// memcpy(keys+1, &pa->state, sizeof(ParticleKey));
-// if(old_data)
-// memcpy(keys+2, old_data, sizeof(ParticleKey));
-// else
-// BKE_ptcache_make_particle_key(keys+2, 0, data, cfra2);
-//
-// dfra = cfra2 - cfra1;
-//
-// mul_v3_fl(keys[1].vel, dfra / frs_sec);
-// mul_v3_fl(keys[2].vel, dfra / frs_sec);
-//
-// psys_interpolate_particle(-1, keys, (cfra - cfra1) / dfra, &pa->state, 1);
-// interp_qt_qtqt(pa->state.rot, keys[1].rot,keys[2].rot, (cfra - cfra1) / dfra);
-//
-// mul_v3_fl(pa->state.vel, frs_sec / dfra);
-//
-// pa->state.time = cfra;
-//}
-//
+static void ptcache_particle_extra_write(void *psys_v, PTCacheMem *pm, int UNUSED(cfra))
+{
+ ParticleSystem *psys = psys_v;
+ PTCacheExtra *extra = NULL;
+
+ if(psys->part->phystype == PART_PHYS_FLUID &&
+ psys->part->fluid && psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS &&
+ psys->tot_fluidsprings && psys->fluid_springs) {
+
+ extra = MEM_callocN(sizeof(PTCacheExtra), "Point cache: fluid extra data");
+
+ extra->type = BPHYS_EXTRA_FLUID_SPRINGS;
+ extra->totdata = psys->tot_fluidsprings;
+
+ extra->data = MEM_callocN(extra->totdata * ptcache_extra_datasize[extra->type], "Point cache: extra data");
+ memcpy(extra->data, psys->fluid_springs, extra->totdata * ptcache_extra_datasize[extra->type]);
+
+ BLI_addtail(&pm->extradata, extra);
+ }
+}
+
+static void ptcache_particle_extra_read(void *psys_v, PTCacheMem *pm, float UNUSED(cfra))
+{
+ ParticleSystem *psys = psys_v;
+ PTCacheExtra *extra = pm->extradata.first;
+
+ for(; extra; extra=extra->next) {
+ switch(extra->type) {
+ case BPHYS_EXTRA_FLUID_SPRINGS:
+ {
+ if(psys->fluid_springs)
+ MEM_freeN(psys->fluid_springs);
+
+ psys->fluid_springs = MEM_dupallocN(extra->data);
+ psys->tot_fluidsprings = psys->alloc_fluidsprings = extra->totdata;
+ break;
+ }
+ }
+ }
+}
+
/* Cloth functions */
-static int ptcache_write_cloth(int index, void *cloth_v, void **data, int cfra)
+static int ptcache_cloth_write(int index, void *cloth_v, void **data, int UNUSED(cfra))
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -505,7 +452,7 @@ static int ptcache_write_cloth(int index, void *cloth_v, void **data, int cfra)
return 1;
}
-static void ptcache_read_cloth(int index, void *cloth_v, void **data, float frs_sec, float cfra, float *old_data)
+static void ptcache_cloth_read(int index, void *cloth_v, void **data, float UNUSED(cfra), float *old_data)
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -522,7 +469,7 @@ static void ptcache_read_cloth(int index, void *cloth_v, void **data, float frs_
PTCACHE_DATA_TO(data, BPHYS_DATA_XCONST, 0, vert->xconst);
}
}
-static void ptcache_interpolate_cloth(int index, void *cloth_v, void **data, float frs_sec, float cfra, float cfra1, float cfra2, float *old_data)
+static void ptcache_cloth_interpolate(int index, void *cloth_v, void **data, float cfra, float cfra1, float cfra2, float *old_data)
{
ClothModifierData *clmd= cloth_v;
Cloth *cloth= clmd->clothObject;
@@ -558,84 +505,14 @@ static void ptcache_interpolate_cloth(int index, void *cloth_v, void **data, flo
/* should vert->xconst be interpolated somehow too? - jahka */
}
-static int ptcache_totpoint_cloth(void *cloth_v, int cfra)
+static int ptcache_cloth_totpoint(void *cloth_v, int UNUSED(cfra))
{
ClothModifierData *clmd= cloth_v;
return clmd->clothObject ? clmd->clothObject->numverts : 0;
}
-/* Creating ID's */
-void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
-{
- memset(pid, 0, sizeof(PTCacheID));
-
- pid->ob= ob;
- pid->calldata= sb;
- pid->type= PTCACHE_TYPE_SOFTBODY;
- pid->cache= sb->pointcache;
- pid->cache_ptr= &sb->pointcache;
- pid->ptcaches= &sb->ptcaches;
- pid->totpoint= pid->totwrite= ptcache_totpoint_softbody;
-
- pid->write_elem= ptcache_write_softbody;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_softbody;
- pid->interpolate_elem= ptcache_interpolate_softbody;
-
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
-
- pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY);
- pid->info_types= 0;
-
- pid->stack_index = pid->cache->index;
-}
-
-void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *psys)
-{
- memset(pid, 0, sizeof(PTCacheID));
-
- pid->ob= ob;
- pid->calldata= psys;
- pid->type= PTCACHE_TYPE_PARTICLES;
- pid->stack_index= psys->pointcache->index;
- pid->cache= psys->pointcache;
- pid->cache_ptr= &psys->pointcache;
- pid->ptcaches= &psys->ptcaches;
-
- if(psys->part->type != PART_HAIR)
- pid->flag |= PTCACHE_VEL_PER_SEC;
-
- pid->write_elem= ptcache_write_particle;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_particle;
- pid->interpolate_elem= ptcache_interpolate_particle;
-
- pid->totpoint= ptcache_totpoint_particle;
- pid->totwrite= ptcache_totwrite_particle;
-
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
-
- pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_INDEX);
-
- if(psys->part->phystype == PART_PHYS_BOIDS)
- pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION) | (1<<BPHYS_DATA_BOIDS);
-
- if(psys->part->rotmode!=PART_ROT_VEL
- || psys->part->avemode!=PART_AVE_SPIN || psys->part->avefac!=0.0f)
- pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION);
-
- if(psys->part->flag & PART_ROT_DYN)
- pid->data_types|= (1<<BPHYS_DATA_ROTATION);
-
- pid->info_types= (1<<BPHYS_DATA_TIMES);
-}
-
/* Smoke functions */
-static int ptcache_totpoint_smoke(void *smoke_v, int cfra)
+static int ptcache_smoke_totpoint(void *smoke_v, int UNUSED(cfra))
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
@@ -646,79 +523,11 @@ static int ptcache_totpoint_smoke(void *smoke_v, int cfra)
else
return 0;
}
-
-/* Smoke functions */
-static int ptcache_totpoint_smoke_turbulence(void *smoke_v, int cfra)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
- if(sds->wt) {
- return sds->res_wt[0]*sds->res_wt[1]*sds->res_wt[2];
- }
- else
- return 0;
-}
-
-// forward decleration
-static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size);
-
-static int ptcache_compress_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode)
-{
- int r = 0;
- unsigned char compressed = 0;
- unsigned int out_len= 0;
- unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
- size_t sizeOfIt = 5;
-
-#ifdef WITH_LZO
- out_len= LZO_OUT_LEN(in_len);
- if(mode == 1) {
- LZO_HEAP_ALLOC(wrkmem, LZO1X_MEM_COMPRESS);
-
- r = lzo1x_1_compress(in, (lzo_uint)in_len, out, (lzo_uint *)&out_len, wrkmem);
- if (!(r == LZO_E_OK) || (out_len >= in_len))
- compressed = 0;
- else
- compressed = 1;
- }
-#endif
-#ifdef WITH_LZMA
- if(mode == 2) {
-
- r = LzmaCompress(out, (size_t *)&out_len, in, in_len,//assume sizeof(char)==1....
- props, &sizeOfIt, 5, 1 << 24, 3, 0, 2, 32, 2);
-
- if(!(r == SZ_OK) || (out_len >= in_len))
- compressed = 0;
- else
- compressed = 2;
- }
-#endif
-
- ptcache_file_write(pf, &compressed, 1, sizeof(unsigned char));
- if(compressed) {
- ptcache_file_write(pf, &out_len, 1, sizeof(unsigned int));
- ptcache_file_write(pf, out, out_len, sizeof(unsigned char));
- }
- else
- ptcache_file_write(pf, in, in_len, sizeof(unsigned char));
-
- if(compressed == 2)
- {
- ptcache_file_write(pf, &sizeOfIt, 1, sizeof(unsigned int));
- ptcache_file_write(pf, props, sizeOfIt, sizeof(unsigned char));
- }
-
- MEM_freeN(props);
-
- return r;
-}
-
-static int ptcache_write_smoke(PTCacheFile *pf, void *smoke_v)
+static int ptcache_smoke_write(PTCacheFile *pf, void *smoke_v)
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
+ int ret = 0;
if(sds->fluid) {
size_t res = sds->res[0]*sds->res[1]*sds->res[2];
@@ -732,33 +541,26 @@ static int ptcache_write_smoke(PTCacheFile *pf, void *smoke_v)
smoke_export(sds->fluid, &dt, &dx, &dens, &densold, &heat, &heatold, &vx, &vy, &vz, &vxold, &vyold, &vzold, &obstacles);
- ptcache_compress_write(pf, (unsigned char *)sds->shadow, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)dens, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)densold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)heat, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)heatold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vx, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vy, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vz, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vxold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vyold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)vzold, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)obstacles, (unsigned int)res, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)sds->shadow, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)dens, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)densold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)heat, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)heatold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vx, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vy, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vz, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vxold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vyold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)vzold, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)obstacles, (unsigned int)res, out, mode);
ptcache_file_write(pf, &dt, 1, sizeof(float));
ptcache_file_write(pf, &dx, 1, sizeof(float));
MEM_freeN(out);
- return 1;
+ ret = 1;
}
- return 0;
-}
-static int ptcache_write_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
if(sds->wt) {
int res_big_array[3];
int res_big;
@@ -780,71 +582,22 @@ static int ptcache_write_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len_big), "pointcache_lzo_buffer");
- ptcache_compress_write(pf, (unsigned char *)dens, in_len_big, out, mode);
- ptcache_compress_write(pf, (unsigned char *)densold, in_len_big, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)dens, in_len_big, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)densold, in_len_big, out, mode);
MEM_freeN(out);
out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len), "pointcache_lzo_buffer");
- ptcache_compress_write(pf, (unsigned char *)tcu, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)tcv, in_len, out, mode);
- ptcache_compress_write(pf, (unsigned char *)tcw, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcu, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcv, in_len, out, mode);
+ ptcache_file_compressed_write(pf, (unsigned char *)tcw, in_len, out, mode);
MEM_freeN(out);
- return 1;
+ ret = 1;
}
- return 0;
-}
-// forward decleration
-static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size);
-
-static int ptcache_compress_read(PTCacheFile *pf, unsigned char *result, unsigned int len)
-{
- int r = 0;
- unsigned char compressed = 0;
- unsigned int in_len;
-#ifdef WITH_LZO
- unsigned int out_len = len;
- size_t sizeOfIt = 5;
-#endif
- unsigned char *in;
- unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
-
- ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char));
- if(compressed) {
- ptcache_file_read(pf, &in_len, 1, sizeof(unsigned int));
- if(in_len==0) {
- /* do nothing */
- }
- else {
- in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer");
- ptcache_file_read(pf, in, in_len, sizeof(unsigned char));
-#ifdef WITH_LZO
- if(compressed == 1)
- r = lzo1x_decompress_safe(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL);
-#endif
-#ifdef WITH_LZMA
- if(compressed == 2)
- {
- size_t leni = in_len, leno = out_len;
- ptcache_file_read(pf, &sizeOfIt, 1, sizeof(unsigned int));
- ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char));
- r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt);
- }
-#endif
- MEM_freeN(in);
- }
- }
- else {
- ptcache_file_read(pf, result, len, sizeof(unsigned char));
- }
-
- MEM_freeN(props);
-
- return r;
+ return ret;
}
-
-static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
+static void ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
{
SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
SmokeDomainSettings *sds = smd->domain;
@@ -857,116 +610,126 @@ static void ptcache_read_smoke(PTCacheFile *pf, void *smoke_v)
smoke_export(sds->fluid, &dt, &dx, &dens, &densold, &heat, &heatold, &vx, &vy, &vz, &vxold, &vyold, &vzold, &obstacles);
- ptcache_compress_read(pf, (unsigned char *)sds->shadow, out_len);
- ptcache_compress_read(pf, (unsigned char*)dens, out_len);
- ptcache_compress_read(pf, (unsigned char*)densold, out_len);
- ptcache_compress_read(pf, (unsigned char*)heat, out_len);
- ptcache_compress_read(pf, (unsigned char*)heatold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vx, out_len);
- ptcache_compress_read(pf, (unsigned char*)vy, out_len);
- ptcache_compress_read(pf, (unsigned char*)vz, out_len);
- ptcache_compress_read(pf, (unsigned char*)vxold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vyold, out_len);
- ptcache_compress_read(pf, (unsigned char*)vzold, out_len);
- ptcache_compress_read(pf, (unsigned char*)obstacles, (unsigned int)res);
+ ptcache_file_compressed_read(pf, (unsigned char *)sds->shadow, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)dens, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)densold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)heat, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)heatold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vx, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vy, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vz, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vxold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vyold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)vzold, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)obstacles, (unsigned int)res);
ptcache_file_read(pf, &dt, 1, sizeof(float));
ptcache_file_read(pf, &dx, 1, sizeof(float));
- }
-}
-static void ptcache_read_smoke_turbulence(PTCacheFile *pf, void *smoke_v)
-{
- SmokeModifierData *smd= (SmokeModifierData *)smoke_v;
- SmokeDomainSettings *sds = smd->domain;
-
- if(sds->fluid) {
- int res = sds->res[0]*sds->res[1]*sds->res[2];
- int res_big, res_big_array[3];
- float *dens, *densold, *tcu, *tcv, *tcw;
- unsigned int out_len = sizeof(float)*(unsigned int)res;
- unsigned int out_len_big;
+ if(pf->data_types & (1<<BPHYS_DATA_SMOKE_HIGH) && sds->wt) {
+ int res = sds->res[0]*sds->res[1]*sds->res[2];
+ int res_big, res_big_array[3];
+ float *dens, *densold, *tcu, *tcv, *tcw;
+ unsigned int out_len = sizeof(float)*(unsigned int)res;
+ unsigned int out_len_big;
- smoke_turbulence_get_res(sds->wt, res_big_array);
- res_big = res_big_array[0]*res_big_array[1]*res_big_array[2];
- out_len_big = sizeof(float) * (unsigned int)res_big;
+ smoke_turbulence_get_res(sds->wt, res_big_array);
+ res_big = res_big_array[0]*res_big_array[1]*res_big_array[2];
+ out_len_big = sizeof(float) * (unsigned int)res_big;
- smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
+ smoke_turbulence_export(sds->wt, &dens, &densold, &tcu, &tcv, &tcw);
- ptcache_compress_read(pf, (unsigned char*)dens, out_len_big);
- ptcache_compress_read(pf, (unsigned char*)densold, out_len_big);
+ ptcache_file_compressed_read(pf, (unsigned char*)dens, out_len_big);
+ ptcache_file_compressed_read(pf, (unsigned char*)densold, out_len_big);
- ptcache_compress_read(pf, (unsigned char*)tcu, out_len);
- ptcache_compress_read(pf, (unsigned char*)tcv, out_len);
- ptcache_compress_read(pf, (unsigned char*)tcw, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcu, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcv, out_len);
+ ptcache_file_compressed_read(pf, (unsigned char*)tcw, out_len);
+ }
}
}
-void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+/* Creating ID's */
+void BKE_ptcache_id_from_softbody(PTCacheID *pid, Object *ob, SoftBody *sb)
{
- SmokeDomainSettings *sds = smd->domain;
-
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->calldata= smd;
-
- pid->type= PTCACHE_TYPE_SMOKE_DOMAIN;
- pid->stack_index= sds->point_cache[0]->index;
-
- pid->cache= sds->point_cache[0];
- pid->cache_ptr= &(sds->point_cache[0]);
- pid->ptcaches= &(sds->ptcaches[0]);
+ pid->calldata= sb;
+ pid->type= PTCACHE_TYPE_SOFTBODY;
+ pid->cache= sb->pointcache;
+ pid->cache_ptr= &sb->pointcache;
+ pid->ptcaches= &sb->ptcaches;
+ pid->totpoint= pid->totwrite= ptcache_softbody_totpoint;
- pid->totpoint= pid->totwrite= ptcache_totpoint_smoke;
+ pid->write_point = ptcache_softbody_write;
+ pid->read_point = ptcache_softbody_read;
+ pid->interpolate_point = ptcache_softbody_interpolate;
- pid->write_elem= NULL;
- pid->read_elem= NULL;
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->read_stream = ptcache_read_smoke;
- pid->write_stream = ptcache_write_smoke;
-
- pid->interpolate_elem= NULL;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
- pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values to make pointcache happy
+ pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY);
pid->info_types= 0;
-}
-void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+ pid->stack_index = pid->cache->index;
+}
+void BKE_ptcache_id_from_particles(PTCacheID *pid, Object *ob, ParticleSystem *psys)
{
- SmokeDomainSettings *sds = smd->domain;
-
memset(pid, 0, sizeof(PTCacheID));
pid->ob= ob;
- pid->calldata= smd;
-
- pid->type= PTCACHE_TYPE_SMOKE_HIGHRES;
- pid->stack_index= sds->point_cache[1]->index;
+ pid->calldata= psys;
+ pid->type= PTCACHE_TYPE_PARTICLES;
+ pid->stack_index= psys->pointcache->index;
+ pid->cache= psys->pointcache;
+ pid->cache_ptr= &psys->pointcache;
+ pid->ptcaches= &psys->ptcaches;
- pid->cache= sds->point_cache[1];
- pid->cache_ptr= &sds->point_cache[1];
- pid->ptcaches= &sds->ptcaches[1];
+ if(psys->part->type != PART_HAIR)
+ pid->flag |= PTCACHE_VEL_PER_SEC;
- pid->totpoint= pid->totwrite= ptcache_totpoint_smoke_turbulence;
+ pid->totpoint = ptcache_particle_totpoint;
+ pid->totwrite = ptcache_particle_totwrite;
- pid->write_elem= NULL;
- pid->read_elem= NULL;
+ pid->write_point = ptcache_particle_write;
+ pid->read_point = ptcache_particle_read;
+ pid->interpolate_point = ptcache_particle_interpolate;
- pid->read_stream = ptcache_read_smoke_turbulence;
- pid->write_stream = ptcache_write_smoke_turbulence;
-
- pid->interpolate_elem= NULL;
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values tot make pointcache happy
- pid->info_types= 0;
-}
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
+
+ pid->data_types = (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_INDEX);
+
+ if(psys->part->phystype == PART_PHYS_BOIDS)
+ pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION) | (1<<BPHYS_DATA_BOIDS);
+ else if(psys->part->phystype == PART_PHYS_FLUID && psys->part->fluid && psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS) {
+ pid->write_extra_data = ptcache_particle_extra_write;
+ pid->read_extra_data = ptcache_particle_extra_read;
+ }
+ if(psys->part->rotmode!=PART_ROT_VEL
+ || psys->part->avemode!=PART_AVE_SPIN || psys->part->avefac!=0.0f)
+ pid->data_types|= (1<<BPHYS_DATA_AVELOCITY) | (1<<BPHYS_DATA_ROTATION);
+
+ if(psys->part->flag & PART_ROT_DYN)
+ pid->data_types|= (1<<BPHYS_DATA_ROTATION);
+
+ pid->info_types= (1<<BPHYS_DATA_TIMES);
+}
void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *clmd)
{
memset(pid, 0, sizeof(PTCacheID));
@@ -978,21 +741,65 @@ void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *cl
pid->cache= clmd->point_cache;
pid->cache_ptr= &clmd->point_cache;
pid->ptcaches= &clmd->ptcaches;
- pid->totpoint= pid->totwrite= ptcache_totpoint_cloth;
+ pid->totpoint= pid->totwrite= ptcache_cloth_totpoint;
+
+ pid->write_point = ptcache_cloth_write;
+ pid->read_point = ptcache_cloth_read;
+ pid->interpolate_point = ptcache_cloth_interpolate;
+
+ pid->write_stream = NULL;
+ pid->read_stream = NULL;
- pid->write_elem= ptcache_write_cloth;
- pid->write_stream = NULL;
- pid->read_stream = NULL;
- pid->read_elem= ptcache_read_cloth;
- pid->interpolate_elem= ptcache_interpolate_cloth;
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
- pid->write_header= ptcache_write_basic_header;
- pid->read_header= ptcache_read_basic_header;
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
pid->data_types= (1<<BPHYS_DATA_LOCATION) | (1<<BPHYS_DATA_VELOCITY) | (1<<BPHYS_DATA_XCONST);
pid->info_types= 0;
}
+void BKE_ptcache_id_from_smoke(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+{
+ SmokeDomainSettings *sds = smd->domain;
+
+ memset(pid, 0, sizeof(PTCacheID));
+
+ pid->ob= ob;
+ pid->calldata= smd;
+
+ pid->type= PTCACHE_TYPE_SMOKE_DOMAIN;
+ pid->stack_index= sds->point_cache[0]->index;
+
+ pid->cache= sds->point_cache[0];
+ pid->cache_ptr= &(sds->point_cache[0]);
+ pid->ptcaches= &(sds->ptcaches[0]);
+
+ pid->totpoint= pid->totwrite= ptcache_smoke_totpoint;
+ pid->write_point = NULL;
+ pid->read_point = NULL;
+ pid->interpolate_point = NULL;
+
+ pid->read_stream = ptcache_smoke_read;
+ pid->write_stream = ptcache_smoke_write;
+
+ pid->write_extra_data = NULL;
+ pid->read_extra_data = NULL;
+ pid->interpolate_extra_data = NULL;
+
+ pid->write_header = ptcache_basic_header_write;
+ pid->read_header = ptcache_basic_header_read;
+
+ pid->data_types= 0;
+ pid->info_types= 0;
+
+ if(sds->fluid)
+ pid->data_types |= (1<<BPHYS_DATA_SMOKE_LOW);
+ if(sds->wt)
+ pid->data_types |= (1<<BPHYS_DATA_SMOKE_HIGH);
+}
void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int duplis)
{
PTCacheID *pid;
@@ -1008,11 +815,23 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- if(psys->part) {
- pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_particles(pid, ob, psys);
- BLI_addtail(lb, pid);
- }
+ if(psys->part==NULL)
+ continue;
+
+ /* check to make sure point cache is actually used by the particles */
+ if(ELEM(psys->part->phystype, PART_PHYS_NO, PART_PHYS_KEYED))
+ continue;
+
+ /* hair needs to be included in id-list for cache edit mode to work */
+ /* if(psys->part->type == PART_HAIR && (psys->flag & PSYS_HAIR_DYNAMICS)==0) */
+ /* continue; */
+
+ if(psys->part->type == PART_FLUID)
+ continue;
+
+ pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
+ BKE_ptcache_id_from_particles(pid, ob, psys);
+ BLI_addtail(lb, pid);
}
for(md=ob->modifiers.first; md; md=md->next) {
@@ -1028,10 +847,6 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
BKE_ptcache_id_from_smoke(pid, ob, (SmokeModifierData*)md);
BLI_addtail(lb, pid);
-
- pid= MEM_callocN(sizeof(PTCacheID), "PTCacheID");
- BKE_ptcache_id_from_smoke_turbulence(pid, ob, (SmokeModifierData*)md);
- BLI_addtail(lb, pid);
}
}
}
@@ -1045,7 +860,7 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
if(dob->ob != ob) { /* avoids recursive loops with dupliframes: bug 22988 */
ListBase lb_dupli_pid;
BKE_ptcache_ids_from_object(&lb_dupli_pid, dob->ob, scene, duplis);
- addlisttolist(lb, &lb_dupli_pid);
+ BLI_movelisttolist(lb, &lb_dupli_pid);
if(lb_dupli_pid.first)
printf("Adding Dupli\n");
}
@@ -1056,7 +871,6 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
}
}
-
/* File handling */
/* Takes an Object ID and returns a unique name
@@ -1070,8 +884,8 @@ void BKE_ptcache_ids_from_object(ListBase *lb, Object *ob, Scene *scene, int dup
static int ptcache_path(PTCacheID *pid, char *filename)
{
- Library *lib= (pid)? pid->ob->id.lib: NULL;
- const char *blendfilename= (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH)==0) ? lib->filepath: G.sce;
+ Library *lib= (pid->ob)? pid->ob->id.lib: NULL;
+ const char *blendfilename= (lib && (pid->cache->flag & PTCACHE_IGNORE_LIBPATH)==0) ? lib->filepath: G.main->name;
size_t i;
if(pid->cache->flag & PTCACHE_EXTERNAL) {
@@ -1104,7 +918,7 @@ static int ptcache_path(PTCacheID *pid, char *filename)
return BLI_add_slash(filename); /* new strlen() */
}
-static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, short do_path, short do_ext)
+static int ptcache_filename(PTCacheID *pid, char *filename, int cfra, short do_path, short do_ext)
{
int len=0;
char *idname;
@@ -1169,7 +983,7 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
#endif
if (!G.relbase_valid && (pid->cache->flag & PTCACHE_EXTERNAL)==0) return NULL; /* save blend file before using disk pointcache */
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1);
+ ptcache_filename(pid, filename, cfra, 1, 1);
if (mode==PTCACHE_FILE_READ) {
if (!BLI_exists(filename)) {
@@ -1189,48 +1003,155 @@ static PTCacheFile *ptcache_file_open(PTCacheID *pid, int mode, int cfra)
pf= MEM_mallocN(sizeof(PTCacheFile), "PTCacheFile");
pf->fp= fp;
+ pf->old_format = 0;
+ pf->frame = cfra;
return pf;
}
-
static void ptcache_file_close(PTCacheFile *pf)
{
- fclose(pf->fp);
- MEM_freeN(pf);
+ if(pf) {
+ fclose(pf->fp);
+ MEM_freeN(pf);
+ }
+}
+
+static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len)
+{
+ int r = 0;
+ unsigned char compressed = 0;
+ size_t in_len;
+#ifdef WITH_LZO
+ size_t out_len = len;
+ size_t sizeOfIt = 5;
+#endif
+ unsigned char *in;
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+
+ ptcache_file_read(pf, &compressed, 1, sizeof(unsigned char));
+ if(compressed) {
+ unsigned int size;
+ ptcache_file_read(pf, &size, 1, sizeof(unsigned int));
+ in_len = (size_t)size;
+ if(in_len==0) {
+ /* do nothing */
+ }
+ else {
+ in = (unsigned char *)MEM_callocN(sizeof(unsigned char)*in_len, "pointcache_compressed_buffer");
+ ptcache_file_read(pf, in, in_len, sizeof(unsigned char));
+#ifdef WITH_LZO
+ if(compressed == 1)
+ r = lzo1x_decompress_safe(in, (lzo_uint)in_len, result, (lzo_uint *)&out_len, NULL);
+#endif
+#ifdef WITH_LZMA
+ if(compressed == 2)
+ {
+ size_t leni = in_len, leno = out_len;
+ ptcache_file_read(pf, &size, 1, sizeof(unsigned int));
+ sizeOfIt = (size_t)size;
+ ptcache_file_read(pf, props, sizeOfIt, sizeof(unsigned char));
+ r = LzmaUncompress(result, &leno, in, &leni, props, sizeOfIt);
+ }
+#endif
+ MEM_freeN(in);
+ }
+ }
+ else {
+ ptcache_file_read(pf, result, len, sizeof(unsigned char));
+ }
+
+ MEM_freeN(props);
+
+ return r;
}
+static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode)
+{
+ int r = 0;
+ unsigned char compressed = 0;
+ size_t out_len= 0;
+ unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
+ size_t sizeOfIt = 5;
-static int ptcache_file_read(PTCacheFile *pf, void *f, size_t tot, int size)
+ (void)mode; /* unused when building w/o compression */
+
+#ifdef WITH_LZO
+ out_len= LZO_OUT_LEN(in_len);
+ if(mode == 1) {
+ LZO_HEAP_ALLOC(wrkmem, LZO1X_MEM_COMPRESS);
+
+ r = lzo1x_1_compress(in, (lzo_uint)in_len, out, (lzo_uint *)&out_len, wrkmem);
+ if (!(r == LZO_E_OK) || (out_len >= in_len))
+ compressed = 0;
+ else
+ compressed = 1;
+ }
+#endif
+#ifdef WITH_LZMA
+ if(mode == 2) {
+
+ r = LzmaCompress(out, &out_len, in, in_len,//assume sizeof(char)==1....
+ props, &sizeOfIt, 5, 1 << 24, 3, 0, 2, 32, 2);
+
+ if(!(r == SZ_OK) || (out_len >= in_len))
+ compressed = 0;
+ else
+ compressed = 2;
+ }
+#endif
+
+ ptcache_file_write(pf, &compressed, 1, sizeof(unsigned char));
+ if(compressed) {
+ unsigned int size = out_len;
+ ptcache_file_write(pf, &size, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, out, out_len, sizeof(unsigned char));
+ }
+ else
+ ptcache_file_write(pf, in, in_len, sizeof(unsigned char));
+
+ if(compressed == 2)
+ {
+ unsigned int size = sizeOfIt;
+ ptcache_file_write(pf, &sizeOfIt, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, props, size, sizeof(unsigned char));
+ }
+
+ MEM_freeN(props);
+
+ return r;
+}
+static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
{
return (fread(f, size, tot, pf->fp) == tot);
}
-static int ptcache_file_write(PTCacheFile *pf, void *f, size_t tot, int size)
+static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
{
return (fwrite(f, size, tot, pf->fp) == tot);
}
-static int ptcache_file_read_data(PTCacheFile *pf)
+static int ptcache_file_data_read(PTCacheFile *pf)
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pf->data_types & (1<<i) && !ptcache_file_read(pf, pf->cur[i], 1, ptcache_data_size[i]))
+ if((pf->data_types & (1<<i)) && !ptcache_file_read(pf, pf->cur[i], 1, ptcache_data_size[i]))
return 0;
}
return 1;
}
-static int ptcache_file_write_data(PTCacheFile *pf)
+static int ptcache_file_data_write(PTCacheFile *pf)
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pf->data_types & (1<<i) && !ptcache_file_write(pf, pf->cur[i], 1, ptcache_data_size[i]))
+ if((pf->data_types & (1<<i)) && !ptcache_file_write(pf, pf->cur[i], 1, ptcache_data_size[i]))
return 0;
}
return 1;
}
-static int ptcache_file_read_header_begin(PTCacheFile *pf)
+static int ptcache_file_header_begin_read(PTCacheFile *pf)
{
+ unsigned int typeflag=0;
int error=0;
char bphysics[8];
@@ -1242,8 +1163,11 @@ static int ptcache_file_read_header_begin(PTCacheFile *pf)
if(!error && strncmp(bphysics, "BPHYSICS", 8))
error = 1;
- if(!error && !fread(&pf->type, sizeof(int), 1, pf->fp))
+ if(!error && !fread(&typeflag, sizeof(unsigned int), 1, pf->fp))
error = 1;
+
+ pf->type = (typeflag & PTCACHE_TYPEFLAG_TYPEMASK);
+ pf->flag = (typeflag & PTCACHE_TYPEFLAG_FLAGMASK);
/* if there was an error set file as it was */
if(error)
@@ -1251,84 +1175,82 @@ static int ptcache_file_read_header_begin(PTCacheFile *pf)
return !error;
}
-
-
-static int ptcache_file_write_header_begin(PTCacheFile *pf)
+static int ptcache_file_header_begin_write(PTCacheFile *pf)
{
- char *bphysics = "BPHYSICS";
+ const char *bphysics = "BPHYSICS";
+ unsigned int typeflag = pf->type + pf->flag;
if(fwrite(bphysics, sizeof(char), 8, pf->fp) != 8)
return 0;
- if(!fwrite(&pf->type, sizeof(int), 1, pf->fp))
+ if(!fwrite(&typeflag, sizeof(unsigned int), 1, pf->fp))
return 0;
return 1;
}
-
/* Data pointer handling */
int BKE_ptcache_data_size(int data_type)
{
return ptcache_data_size[data_type];
}
-static void ptcache_file_init_pointers(PTCacheFile *pf)
+static void ptcache_file_pointers_init(PTCacheFile *pf)
{
int data_types = pf->data_types;
- pf->cur[BPHYS_DATA_INDEX] = data_types & (1<<BPHYS_DATA_INDEX) ? &pf->data.index : NULL;
- pf->cur[BPHYS_DATA_LOCATION] = data_types & (1<<BPHYS_DATA_LOCATION) ? &pf->data.loc : NULL;
- pf->cur[BPHYS_DATA_VELOCITY] = data_types & (1<<BPHYS_DATA_VELOCITY) ? &pf->data.vel : NULL;
- pf->cur[BPHYS_DATA_ROTATION] = data_types & (1<<BPHYS_DATA_ROTATION) ? &pf->data.rot : NULL;
- pf->cur[BPHYS_DATA_AVELOCITY] = data_types & (1<<BPHYS_DATA_AVELOCITY) ? &pf->data.ave : NULL;
- pf->cur[BPHYS_DATA_SIZE] = data_types & (1<<BPHYS_DATA_SIZE) ? &pf->data.size : NULL;
- pf->cur[BPHYS_DATA_TIMES] = data_types & (1<<BPHYS_DATA_TIMES) ? &pf->data.times : NULL;
- pf->cur[BPHYS_DATA_BOIDS] = data_types & (1<<BPHYS_DATA_BOIDS) ? &pf->data.boids : NULL;
+ pf->cur[BPHYS_DATA_INDEX] = (data_types & (1<<BPHYS_DATA_INDEX)) ? &pf->data.index : NULL;
+ pf->cur[BPHYS_DATA_LOCATION] = (data_types & (1<<BPHYS_DATA_LOCATION)) ? &pf->data.loc : NULL;
+ pf->cur[BPHYS_DATA_VELOCITY] = (data_types & (1<<BPHYS_DATA_VELOCITY)) ? &pf->data.vel : NULL;
+ pf->cur[BPHYS_DATA_ROTATION] = (data_types & (1<<BPHYS_DATA_ROTATION)) ? &pf->data.rot : NULL;
+ pf->cur[BPHYS_DATA_AVELOCITY] = (data_types & (1<<BPHYS_DATA_AVELOCITY))? &pf->data.ave : NULL;
+ pf->cur[BPHYS_DATA_SIZE] = (data_types & (1<<BPHYS_DATA_SIZE)) ? &pf->data.size : NULL;
+ pf->cur[BPHYS_DATA_TIMES] = (data_types & (1<<BPHYS_DATA_TIMES)) ? &pf->data.times : NULL;
+ pf->cur[BPHYS_DATA_BOIDS] = (data_types & (1<<BPHYS_DATA_BOIDS)) ? &pf->data.boids : NULL;
}
-static void ptcache_file_seek_pointers(int index, PTCacheFile *pf)
+/* Check to see if point number "index" is in pm, uses binary search for index data. */
+int BKE_ptcache_mem_index_find(PTCacheMem *pm, unsigned int index)
{
- int i, size=0;
- int data_types = pf->data_types;
+ if(pm->data[BPHYS_DATA_INDEX]) {
+ unsigned int *data = pm->data[BPHYS_DATA_INDEX];
+ unsigned int mid, low = 0, high = pm->totpoint - 1;
- if(data_types & (1<<BPHYS_DATA_INDEX)) {
- int totpoint;
- /* The simplest solution is to just write to the very end. This may cause
- * some data duplication, but since it's on disk it's not so bad. The correct
- * thing would be to search through the file for the correct index and only
- * write to the end if it's not found, but this could be quite slow.
- */
- fseek(pf->fp, 8 + sizeof(int), SEEK_SET);
- fread(&totpoint, sizeof(int), 1, pf->fp);
-
- totpoint++;
+ if(index < *data || index > *(data+high))
+ return -1;
- fseek(pf->fp, 8 + sizeof(int), SEEK_SET);
- fwrite(&totpoint, sizeof(int), 1, pf->fp);
+ /* check simple case for continuous indexes first */
+ if(index-*data < high && data[index-*data] == index)
+ return index-*data;
+
+ while(low <= high) {
+ mid= (low + high)/2;
+
+ if(data[mid] > index)
+ high = mid - 1;
+ else if(data[mid] < index)
+ low = mid + 1;
+ else
+ return mid;
+ }
- fseek(pf->fp, 0, SEEK_END);
+ return -1;
}
else {
- for(i=0; i<BPHYS_TOT_DATA; i++)
- size += pf->data_types & (1<<i) ? ptcache_data_size[i] : 0;
-
- /* size of default header + data up to index */
- fseek(pf->fp, 8 + 3*sizeof(int) + index * size, SEEK_SET);
+ return (index < pm->totpoint ? index : -1);
}
-
- ptcache_file_init_pointers(pf);
}
-void BKE_ptcache_mem_init_pointers(PTCacheMem *pm)
+
+void BKE_ptcache_mem_pointers_init(PTCacheMem *pm)
{
int data_types = pm->data_types;
int i;
for(i=0; i<BPHYS_TOT_DATA; i++)
- pm->cur[i] = data_types & (1<<i) ? pm->data[i] : NULL;
+ pm->cur[i] = ((data_types & (1<<i)) ? pm->data[i] : NULL);
}
-void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
+void BKE_ptcache_mem_pointers_incr(PTCacheMem *pm)
{
int i;
@@ -1337,10 +1259,10 @@ void BKE_ptcache_mem_incr_pointers(PTCacheMem *pm)
pm->cur[i] = (char*)pm->cur[i] + ptcache_data_size[i];
}
}
-int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
+int BKE_ptcache_mem_pointers_seek(int point_index, PTCacheMem *pm)
{
int data_types = pm->data_types;
- int i, index = pm->index_array ? pm->index_array[point_index] - 1 : point_index;
+ int i, index = BKE_ptcache_mem_index_find(pm, point_index);
if(index < 0) {
/* Can't give proper location without reallocation, so don't give any location.
@@ -1356,7 +1278,7 @@ int BKE_ptcache_mem_seek_pointers(int point_index, PTCacheMem *pm)
return 1;
}
-static void ptcache_alloc_data(PTCacheMem *pm)
+static void ptcache_data_alloc(PTCacheMem *pm)
{
int data_types = pm->data_types;
int totpoint = pm->totpoint;
@@ -1367,7 +1289,7 @@ static void ptcache_alloc_data(PTCacheMem *pm)
pm->data[i] = MEM_callocN(totpoint * ptcache_data_size[i], "PTCache Data");
}
}
-static void ptcache_free_data(PTCacheMem *pm)
+static void ptcache_data_free(PTCacheMem *pm)
{
void **data = pm->data;
int i;
@@ -1376,13 +1298,8 @@ static void ptcache_free_data(PTCacheMem *pm)
if(data[i])
MEM_freeN(data[i]);
}
-
- if(pm->index_array) {
- MEM_freeN(pm->index_array);
- pm->index_array = NULL;
- }
}
-static void ptcache_copy_data(void *from[], void *to[])
+static void ptcache_data_copy(void *from[], void *to[])
{
int i;
for(i=0; i<BPHYS_TOT_DATA; i++) {
@@ -1393,9 +1310,20 @@ static void ptcache_copy_data(void *from[], void *to[])
}
}
+static void ptcache_extra_free(PTCacheMem *pm)
+{
+ PTCacheExtra *extra = pm->extradata.first;
+ if(extra) {
+ for(; extra; extra=extra->next) {
+ if(extra->data)
+ MEM_freeN(extra->data);
+ }
-static int ptcache_pid_old_elemsize(PTCacheID *pid)
+ BLI_freelistN(&pm->extradata);
+ }
+}
+static int ptcache_old_elemsize(PTCacheID *pid)
{
if(pid->type==PTCACHE_TYPE_SOFTBODY)
return 6 * sizeof(float);
@@ -1407,268 +1335,408 @@ static int ptcache_pid_old_elemsize(PTCacheID *pid)
return 0;
}
-/* reads cache from disk or memory */
-/* possible to get old or interpolated result */
-int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec)
+static void ptcache_find_frames_around(PTCacheID *pid, unsigned int frame, int *fra1, int *fra2)
{
- PTCacheFile *pf=NULL, *pf2=NULL;
- PTCacheMem *pm=NULL, *pm2=NULL;
- float old_data1[14], old_data2[14];
- int cfrai = (int)cfra;
- int old_elemsize = ptcache_pid_old_elemsize(pid);
- int i;
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ int cfra1=frame-1, cfra2=frame+1;
- int cfra1 = 0, cfra2 = 0;
- int totpoint = 0, totpoint2 = 0;
- int *index = &i, *index2 = &i;
- int use_old = 0, old_frame = 0;
+ while(cfra1 >= pid->cache->startframe && !BKE_ptcache_id_exist(pid, cfra1))
+ cfra1--;
- int ret = 0, error = 0;
+ if(cfra1 < pid->cache->startframe)
+ cfra1 = 0;
- /* nothing to read to */
- if(pid->totpoint(pid->calldata, (int)cfra) == 0)
- return 0;
+ while(cfra2 <= pid->cache->endframe && !BKE_ptcache_id_exist(pid, cfra2))
+ cfra2++;
- if(pid->cache->flag & PTCACHE_READ_INFO) {
- pid->cache->flag &= ~PTCACHE_READ_INFO;
- BKE_ptcache_read_cache(pid, 0, frs_sec);
+ if(cfra2 > pid->cache->endframe)
+ cfra2 = 0;
+
+ if(cfra1 && !cfra2) {
+ *fra1 = 0;
+ *fra2 = cfra1;
+ }
+ else {
+ *fra1 = cfra1;
+ *fra2 = cfra2;
+ }
}
+ else if(pid->cache->mem_cache.first) {
+ PTCacheMem *pm = pid->cache->mem_cache.first;
+ PTCacheMem *pm2 = pid->cache->mem_cache.last;
+ while(pm->next && pm->next->frame < frame)
+ pm= pm->next;
- /* first check if we have the actual frame cached */
- if(cfra == (float)cfrai) {
- if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- }
+ if(pm2 && pm2->frame < frame)
+ pm2 = NULL;
else {
- pm = pid->cache->mem_cache.first;
+ while(pm2->prev && pm2->prev->frame > frame)
+ pm2= pm2->prev;
+ }
- for(; pm; pm=pm->next) {
- if(pm->frame == cfrai)
- break;
- }
+ if(pm && !pm2) {
+ *fra1 = 0;
+ *fra2 = pm->frame;
+ }
+ else {
+ *fra1 = pm->frame;
+ *fra2 = pm2->frame;
}
}
+}
- /* no exact cache frame found so try to find cached frames around cfra */
- if(!pm && !pf) {
- if(pid->cache->flag & PTCACHE_DISK_CACHE) {
- pf=NULL;
- while(cfrai > pid->cache->startframe && !pf) {
- cfrai--;
- pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- cfra1 = cfrai;
- }
+static PTCacheMem *ptcache_disk_frame_to_mem(PTCacheID *pid, int cfra)
+{
+ PTCacheFile *pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
+ PTCacheMem *pm = NULL;
+ unsigned int i, error = 0;
+
+ if(pf == NULL)
+ return 0;
- old_frame = cfrai;
+ if(!ptcache_file_header_begin_read(pf))
+ error = 1;
+
+ if(!error && (pf->type != pid->type || !pid->read_header(pf)))
+ error = 1;
+
+ if(!error) {
+ pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- cfrai = (int)cfra;
- while(cfrai < pid->cache->endframe && !pf2) {
- cfrai++;
- pf2= ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai);
- cfra2 = cfrai;
+ pm->totpoint = pf->totpoint;
+ pm->data_types = pf->data_types;
+ pm->frame = pf->frame;
+
+ ptcache_data_alloc(pm);
+
+ if(pf->flag & PTCACHE_TYPEFLAG_COMPRESS) {
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ unsigned int out_len = pm->totpoint*ptcache_data_size[i];
+ if(pf->data_types & (1<<i))
+ ptcache_file_compressed_read(pf, (unsigned char*)(pm->data[i]), out_len);
}
+ }
+ else {
+ BKE_ptcache_mem_pointers_init(pm);
+ ptcache_file_pointers_init(pf);
- if(pf && !pf2) {
- pf2 = pf;
- pf = NULL;
+ for(i=0; i<pm->totpoint; i++) {
+ if(!ptcache_file_data_read(pf)) {
+ error = 1;
+ break;
+ }
+ ptcache_data_copy(pf->cur, pm->cur);
+ BKE_ptcache_mem_pointers_incr(pm);
}
}
- else if(pid->cache->mem_cache.first){
- pm = pid->cache->mem_cache.first;
+ }
- while(pm->next && pm->next->frame < cfra)
- pm= pm->next;
+ if(!error && pf->flag & PTCACHE_TYPEFLAG_EXTRADATA) {
+ unsigned int extratype = 0;
- if(pm) {
- old_frame = pm->frame;
- cfra1 = pm->frame;
- }
+ while(ptcache_file_read(pf, &extratype, 1, sizeof(unsigned int))) {
+ PTCacheExtra *extra = MEM_callocN(sizeof(PTCacheExtra), "Pointcache extradata");
- pm2 = pid->cache->mem_cache.last;
+ extra->type = extratype;
- if(pm2 && pm2->frame < cfra)
- pm2 = NULL;
- else {
- while(pm2->prev && pm2->prev->frame > cfra)
- pm2= pm2->prev;
+ ptcache_file_read(pf, &extra->totdata, 1, sizeof(unsigned int));
- if(pm2)
- cfra2 = pm2->frame;
- }
+ extra->data = MEM_callocN(extra->totdata * ptcache_extra_datasize[extra->type], "Pointcache extradata->data");
- if(pm && !pm2) {
- pm2 = pm;
- pm = NULL;
- }
+ if(pf->flag & PTCACHE_TYPEFLAG_COMPRESS)
+ ptcache_file_compressed_read(pf, (unsigned char*)(extra->data), extra->totdata*ptcache_extra_datasize[extra->type]);
+ else
+ ptcache_file_read(pf, extra->data, extra->totdata, ptcache_extra_datasize[extra->type]);
+
+ BLI_addtail(&pm->extradata, extra);
}
}
- if(!pm && !pm2 && !pf && !pf2)
- return 0;
-
- if(pm) {
- BKE_ptcache_mem_init_pointers(pm);
- totpoint = pm->totpoint;
- index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? pm->cur[BPHYS_DATA_INDEX] : &i;
+ if(error && pm) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
+ pm = NULL;
}
- if(pm2) {
- BKE_ptcache_mem_init_pointers(pm2);
- totpoint2 = pm2->totpoint;
- index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
+
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error reading from disk cache\n");
+
+ return pm;
+}
+static int ptcache_mem_frame_to_disk(PTCacheID *pid, PTCacheMem *pm)
+{
+ PTCacheFile *pf = NULL;
+ unsigned int i, error = 0;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, pm->frame);
+
+ pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
+
+ if(pf==NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for writing\n");
+ return 0;
}
- if(pf) {
- if(ptcache_file_read_header_begin(pf)) {
- if(pf->type != pid->type) {
- /* todo report error */
- ptcache_file_close(pf);
- pf = NULL;
- }
- else if(pid->read_header(pf)) {
- ptcache_file_init_pointers(pf);
- totpoint = pf->totpoint;
- index = pf->data_types & (1<<BPHYS_DATA_INDEX) ? &pf->data.index : &i;
+
+ pf->data_types = pm->data_types;
+ pf->totpoint = pm->totpoint;
+ pf->type = pid->type;
+ pf->flag = 0;
+
+ if(pm->extradata.first)
+ pf->flag |= PTCACHE_TYPEFLAG_EXTRADATA;
+
+ if(pid->cache->compression)
+ pf->flag |= PTCACHE_TYPEFLAG_COMPRESS;
+
+ if(!ptcache_file_header_begin_write(pf) || !pid->write_header(pf))
+ error = 1;
+
+ if(!error) {
+ if(pid->cache->compression) {
+ for(i=0; i<BPHYS_TOT_DATA; i++) {
+ if(pm->data[i]) {
+ unsigned int in_len = pm->totpoint*ptcache_data_size[i];
+ unsigned char *out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len)*4, "pointcache_lzo_buffer");
+ ptcache_file_compressed_write(pf, (unsigned char*)(pm->data[i]), in_len, out, pid->cache->compression);
+ MEM_freeN(out);
+ }
}
}
else {
- /* fall back to old cache file format */
- use_old = 1;
- totpoint = pid->totpoint(pid->calldata, (int) cfra);
+ BKE_ptcache_mem_pointers_init(pm);
+ ptcache_file_pointers_init(pf);
+
+ for(i=0; i<pm->totpoint; i++) {
+ ptcache_data_copy(pm->cur, pf->cur);
+ if(!ptcache_file_data_write(pf)) {
+ error = 1;
+ break;
+ }
+ BKE_ptcache_mem_pointers_incr(pm);
+ }
}
}
- if(pf2) {
- if(ptcache_file_read_header_begin(pf2)) {
- if(pf2->type != pid->type) {
- /* todo report error */
- ptcache_file_close(pf2);
- pf2 = NULL;
+
+ if(!error && pm->extradata.first) {
+ PTCacheExtra *extra = pm->extradata.first;
+
+ for(; extra; extra=extra->next) {
+ if(extra->data == NULL || extra->totdata == 0)
+ continue;
+
+ ptcache_file_write(pf, &extra->type, 1, sizeof(unsigned int));
+ ptcache_file_write(pf, &extra->totdata, 1, sizeof(unsigned int));
+
+ if(pid->cache->compression) {
+ unsigned int in_len = extra->totdata * ptcache_extra_datasize[extra->type];
+ unsigned char *out = (unsigned char *)MEM_callocN(LZO_OUT_LEN(in_len)*4, "pointcache_lzo_buffer");
+ ptcache_file_compressed_write(pf, (unsigned char*)(extra->data), in_len, out, pid->cache->compression);
+ MEM_freeN(out);
}
- else if(pid->read_header(pf2)) {
- ptcache_file_init_pointers(pf2);
- totpoint2 = pf2->totpoint;
- index2 = pf2->data_types & (1<<BPHYS_DATA_INDEX) ? &pf2->data.index : &i;
+ else {
+ ptcache_file_write(pf, extra->data, extra->totdata, ptcache_extra_datasize[extra->type]);
}
}
- else {
- /* fall back to old cache file format */
- use_old = 1;
- totpoint2 = pid->totpoint(pid->calldata, (int) cfra);
- }
}
- /* don't read old cache if already simulated past cached frame */
- if(!pm && !pf && cfra1 && cfra1 <= pid->cache->simframe)
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error writing to disk cache\n");
+
+ return error==0;
+}
+
+static int ptcache_read_stream(PTCacheID *pid, int cfra)
+{
+ PTCacheFile *pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
+ int error = 0;
+
+ if(pid->read_stream == NULL)
+ return 0;
+
+ if(pf == NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for reading\n");
+ return 0;
+ }
+
+ if(!ptcache_file_header_begin_read(pf))
error = 1;
- if(cfra1 && cfra1==cfra2)
+
+ if(!error && (pf->type != pid->type || !pid->read_header(pf)))
error = 1;
- if(!error)
- {
- if(pf && pid->read_stream) {
- if(totpoint != pid->totpoint(pid->calldata, (int) cfra))
- error = 1;
- else
- {
- // we have stream writing here
- pid->read_stream(pf, pid->calldata);
- }
- }
+ if(!error && pf->totpoint != pid->totpoint(pid->calldata, cfra))
+ error = 1;
+
+ if(!error) {
+ ptcache_file_pointers_init(pf);
+
+ // we have stream reading here
+ pid->read_stream(pf, pid->calldata);
+ }
+
+ ptcache_file_close(pf);
+
+ return error == 0;
+}
+static int ptcache_read(PTCacheID *pid, int cfra)
+{
+ PTCacheMem *pm = NULL;
+ int i;
+ int *index = &i;
+
+ /* get a memory cache to read from */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra);
+ }
+ else {
+ pm = pid->cache->mem_cache.first;
+
+ while(pm && pm->frame != cfra)
+ pm = pm->next;
}
- if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
- totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, (int) cfra));
+ /* read the cache */
+ if(pm) {
+ int totpoint = pm->totpoint;
+
+ if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
+ totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, cfra));
+
+ BKE_ptcache_mem_pointers_init(pm);
- if(!error)
- {
for(i=0; i<totpoint; i++) {
- /* read old cache file format */
- if(use_old) {
- if(pid->read_elem && ptcache_file_read(pf, (void*)old_data1, 1, old_elemsize))
- pid->read_elem(i, pid->calldata, NULL, frs_sec, cfra, old_data1);
- else if(pid->read_elem)
- { error = 1; break; }
- }
- else {
- if(pid->read_elem && (pm || ptcache_file_read_data(pf)))
- pid->read_elem(*index, pid->calldata, pm ? pm->cur : pf->cur, frs_sec, cfra1 ? (float)cfra1 : (float)cfrai, NULL);
- else if(pid->read_elem)
- { error = 1; break; }
- }
+ if(pm->data_types & (1<<BPHYS_DATA_INDEX))
+ index = pm->cur[BPHYS_DATA_INDEX];
- if(pm) {
- BKE_ptcache_mem_incr_pointers(pm);
- index = pm->data_types & (1<<BPHYS_DATA_INDEX) ? pm->cur[BPHYS_DATA_INDEX] : &i;
- }
+ pid->read_point(*index, pid->calldata, pm->cur, (float)pm->frame, NULL);
+
+ BKE_ptcache_mem_pointers_incr(pm);
}
- }
- if(!error)
- {
- if(pf2 && pid->read_stream) {
- if(totpoint2 != pid->totpoint(pid->calldata, (int) cfra))
- error = 1;
- else
- {
- // we have stream writing here
- pid->read_stream(pf2, pid->calldata);
- }
+ if(pid->read_extra_data && pm->extradata.first)
+ pid->read_extra_data(pid->calldata, pm, (float)pm->frame);
+
+ /* clean up temporary memory cache */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
}
}
- if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
- totpoint2 = MIN2(totpoint2, pid->totpoint(pid->calldata, (int) cfra));
+ return 1;
+}
+static int ptcache_interpolate(PTCacheID *pid, float cfra, int cfra1, int cfra2)
+{
+ PTCacheMem *pm = NULL;
+ int i;
+ int *index = &i;
- if(!error)
- {
- for(i=0; i<totpoint2; i++) {
- /* read old cache file format */
- if(use_old) {
- if(pid->read_elem && ptcache_file_read(pf2, (void*)old_data2, 1, old_elemsize)) {
- if(!pf && pf2)
- pid->read_elem(i, pid->calldata, NULL, frs_sec, (float)cfra2, old_data2);
- else if(pid->interpolate_elem)
- pid->interpolate_elem(i, pid->calldata, NULL, frs_sec, cfra, (float)cfra1, (float)cfra2, old_data2);
- else
- { error = 1; break; }
- }
- else if(pid->read_elem)
- { error = 1; break; }
- }
- else {
- if(pid->read_elem && (pm2 || ptcache_file_read_data(pf2))) {
- if((!pf && pf2) || (!pm && pm2))
- pid->read_elem(*index2, pid->calldata, pm2 ? pm2->cur : pf2->cur, frs_sec, (float)cfra2, NULL);
- else if(pid->interpolate_elem)
- pid->interpolate_elem(*index2, pid->calldata, pm2 ? pm2->cur : pf2->cur, frs_sec, cfra, (float)cfra1, (float)cfra2, NULL);
- else
- { error = 1; break; }
- }
- else if(pid->read_elem)
- { error = 1; break; }
- }
+ /* get a memory cache to read from */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra2);
+ }
+ else {
+ pm = pid->cache->mem_cache.first;
+
+ while(pm && pm->frame != cfra2)
+ pm = pm->next;
+ }
- if(pm2) {
- BKE_ptcache_mem_incr_pointers(pm2);
- index2 = pm2->data_types & (1<<BPHYS_DATA_INDEX) ? pm2->cur[BPHYS_DATA_INDEX] : &i;
- }
+ /* read the cache */
+ if(pm) {
+ int totpoint = pm->totpoint;
+
+ if((pid->data_types & (1<<BPHYS_DATA_INDEX)) == 0)
+ totpoint = MIN2(totpoint, pid->totpoint(pid->calldata, (int)cfra));
+
+ BKE_ptcache_mem_pointers_init(pm);
+
+ for(i=0; i<totpoint; i++) {
+ if(pm->data_types & (1<<BPHYS_DATA_INDEX))
+ index = pm->cur[BPHYS_DATA_INDEX];
+
+ pid->interpolate_point(*index, pid->calldata, pm->cur, cfra, (float)cfra1, (float)cfra2, NULL);
+ BKE_ptcache_mem_pointers_incr(pm);
+ }
+
+ if(pid->interpolate_extra_data && pm->extradata.first)
+ pid->interpolate_extra_data(pid->calldata, pm, cfra, (float)cfra1, (float)cfra2);
+
+ /* clean up temporary memory cache */
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
}
}
- if(pm || pf)
- ret = (pm2 || pf2) ? PTCACHE_READ_INTERPOLATED : PTCACHE_READ_EXACT;
- else if(pm2 || pf2) {
- ret = PTCACHE_READ_OLD;
- pid->cache->simframe = old_frame;
+ return 1;
+}
+/* reads cache from disk or memory */
+/* possible to get old or interpolated result */
+int BKE_ptcache_read(PTCacheID *pid, float cfra)
+{
+ int cfrai = (int)cfra, cfra1=0, cfra2=0;
+ int ret = 0;
+
+ /* nothing to read to */
+ if(pid->totpoint(pid->calldata, cfrai) == 0)
+ return 0;
+
+ if(pid->cache->flag & PTCACHE_READ_INFO) {
+ pid->cache->flag &= ~PTCACHE_READ_INFO;
+ ptcache_read(pid, 0);
}
- if(pf) {
- ptcache_file_close(pf);
- pf = NULL;
+ /* first check if we have the actual frame cached */
+ if(cfra == (float)cfrai && BKE_ptcache_id_exist(pid, cfrai))
+ cfra1 = cfrai;
+
+ /* no exact cache frame found so try to find cached frames around cfra */
+ if(cfra1 == 0)
+ ptcache_find_frames_around(pid, cfrai, &cfra1, &cfra2);
+
+ if(cfra1 == 0 && cfra2 == 0)
+ return 0;
+
+ /* don't read old cache if already simulated past cached frame */
+ if(cfra1 == 0 && cfra2 && cfra2 <= pid->cache->simframe)
+ return 0;
+ if(cfra1 && cfra1 == cfra2)
+ return 0;
+
+ if(cfra1) {
+ if(pid->read_stream)
+ ptcache_read_stream(pid, cfra1);
+ else if(pid->read_point)
+ ptcache_read(pid, cfra1);
}
- if(pf2) {
- ptcache_file_close(pf2);
- pf = NULL;
+ if(cfra2) {
+ if(pid->read_stream)
+ ptcache_read_stream(pid, cfra2);
+ else if(pid->read_point) {
+ if(cfra1 && cfra2 && pid->interpolate_point)
+ ptcache_interpolate(pid, cfra, cfra1, cfra2);
+ else
+ ptcache_read(pid, cfra2);
+ }
+ }
+
+ if(cfra1)
+ ret = (cfra2 ? PTCACHE_READ_INTERPOLATED : PTCACHE_READ_EXACT);
+ else if(cfra2) {
+ ret = PTCACHE_READ_OLD;
+ pid->cache->simframe = cfra2;
}
if((pid->cache->flag & PTCACHE_QUICK_CACHE)==0) {
@@ -1681,218 +1749,208 @@ int BKE_ptcache_read_cache(PTCacheID *pid, float cfra, float frs_sec)
if(cfra <= pid->cache->last_exact)
pid->cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, MAX2(cfrai,pid->cache->last_exact));
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, MAX2(cfrai, pid->cache->last_exact));
}
}
- return (error ? 0 : ret);
+ return ret;
}
-/* TODO for later */
-static void ptcache_make_index_array(PTCacheMem *pm, int totpoint)
+static int ptcache_write_stream(PTCacheID *pid, int cfra, int totpoint)
{
- int i, *index;
+ PTCacheFile *pf = NULL;
+ int error = 0;
+
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, cfra);
+
+ pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, cfra);
- if(pm->index_array) {
- MEM_freeN(pm->index_array);
- pm->index_array = NULL;
+ if(pf==NULL) {
+ if (G.f & G_DEBUG)
+ printf("Error opening disk cache file for writing\n");
+ return 0;
}
- if(!pm->data[BPHYS_DATA_INDEX])
- return;
+ pf->data_types = pid->data_types;
+ pf->totpoint = totpoint;
+ pf->type = pid->type;
+ pf->flag = 0;
+
+ if(!error && (!ptcache_file_header_begin_write(pf) || !pid->write_header(pf)))
+ error = 1;
- pm->index_array = MEM_callocN(totpoint * sizeof(int), "PTCacheMem index_array");
- index = pm->data[BPHYS_DATA_INDEX];
+ if(!error && pid->write_stream)
+ pid->write_stream(pf, pid->calldata);
- for(i=0; i<pm->totpoint; i++, index++)
- pm->index_array[*index] = i + 1;
+ ptcache_file_close(pf);
+
+ if (error && G.f & G_DEBUG)
+ printf("Error writing to disk cache\n");
+
+ return error == 0;
}
-/* writes cache to disk or memory */
-int BKE_ptcache_write_cache(PTCacheID *pid, int cfra)
+static int ptcache_write(PTCacheID *pid, int cfra, int overwrite)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf= NULL, *pf2= NULL;
- int i;
+ PTCacheMem *pm=NULL, *pm2=NULL;
int totpoint = pid->totpoint(pid->calldata, cfra);
- int add = 0, overwrite = 0;
+ int i, error = 0;
- if(totpoint == 0 || (cfra ? pid->data_types == 0 : pid->info_types == 0))
- return 0;
+ pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
- if(cache->flag & PTCACHE_DISK_CACHE) {
- int ofra=0, efra = cache->endframe;
+ pm->totpoint = pid->totwrite(pid->calldata, cfra);
+ pm->data_types = cfra ? pid->data_types : pid->info_types;
- if(cfra==0 && cache->startframe > 0)
- add = 1;
- /* allways start from scratch on the first frame */
- else if(cfra == cache->startframe) {
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
- cache->flag &= ~PTCACHE_REDO_NEEDED;
- add = 1;
+ ptcache_data_alloc(pm);
+ BKE_ptcache_mem_pointers_init(pm);
+
+ if(overwrite) {
+ if(cache->flag & PTCACHE_DISK_CACHE) {
+ int fra = cfra-1;
+
+ while(fra >= cache->startframe && !BKE_ptcache_id_exist(pid, fra))
+ fra--;
+
+ pm2 = ptcache_disk_frame_to_mem(pid, fra);
}
- else {
- /* find last cached frame */
- while(efra > cache->startframe && !BKE_ptcache_id_exist(pid, efra))
- efra--;
-
- /* find second last cached frame */
- ofra = efra-1;
- while(ofra > cache->startframe && !BKE_ptcache_id_exist(pid, ofra))
- ofra--;
-
- if(efra >= cache->startframe && cfra > efra) {
- if(ofra >= cache->startframe && efra - ofra < cache->step)
- overwrite = 1;
- else
- add = 1;
+ else
+ pm2 = cache->mem_cache.last;
+ }
+
+ if(pid->write_point) {
+ for(i=0; i<totpoint; i++) {
+ int write = pid->write_point(i, pid->calldata, pm->cur, cfra);
+ if(write) {
+ BKE_ptcache_mem_pointers_incr(pm);
+
+ /* newly born particles have to be copied to previous cached frame */
+ if(overwrite && write == 2 && pm2 && BKE_ptcache_mem_pointers_seek(i, pm2))
+ pid->write_point(i, pid->calldata, pm2->cur, cfra);
}
}
+ }
- if(add || overwrite) {
- if(overwrite)
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, efra);
-
- pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, cfra);
- if(!pf)
- return 0;
+ if(pid->write_extra_data)
+ pid->write_extra_data(pid->calldata, pm, cfra);
- pf->type = pid->type;
- pf->totpoint = cfra ? pid->totwrite(pid->calldata, cfra) : totpoint;
- pf->data_types = cfra ? pid->data_types : pid->info_types;
+ pm->frame = cfra;
- if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
- ptcache_file_close(pf);
- return 0;
- }
+ if(cache->flag & PTCACHE_DISK_CACHE) {
+ error += !ptcache_mem_frame_to_disk(pid, pm);
- ptcache_file_init_pointers(pf);
+ if(pm) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ MEM_freeN(pm);
+ }
- if(pf && pid->write_stream) {
- // we have stream writing here
- pid->write_stream(pf, pid->calldata);
- }
- else
- for(i=0; i<totpoint; i++) {
- if(pid->write_elem) {
- int write = pid->write_elem(i, pid->calldata, pf->cur, cfra);
- if(write) {
- if(!ptcache_file_write_data(pf)) {
- ptcache_file_close(pf);
- if(pf2) ptcache_file_close(pf2);
- return 0;
- }
- /* newly born particles have to be copied to previous cached frame */
- else if(overwrite && write == 2) {
- if(!pf2) {
- pf2 = ptcache_file_open(pid, PTCACHE_FILE_UPDATE, ofra);
- if(!pf2) {
- ptcache_file_close(pf);
- return 0;
- }
- pf2->type = pid->type;
- pf2->totpoint = totpoint;
- pf2->data_types = pid->data_types;
- }
- ptcache_file_seek_pointers(i, pf2);
- pid->write_elem(i, pid->calldata, pf2->cur, cfra);
- if(!ptcache_file_write_data(pf2)) {
- ptcache_file_close(pf);
- ptcache_file_close(pf2);
- return 0;
- }
- }
- }
- }
- }
+ if(pm2) {
+ error += !ptcache_mem_frame_to_disk(pid, pm2);
+ ptcache_data_free(pm2);
+ ptcache_extra_free(pm2);
+ MEM_freeN(pm2);
}
}
else {
- PTCacheMem *pm;
- PTCacheMem *pm2;
+ BLI_addtail(&cache->mem_cache, pm);
+ }
- pm2 = cache->mem_cache.first;
-
- /* don't write info file in memory */
- if(cfra==0)
+ return error;
+}
+static int ptcache_write_needed(PTCacheID *pid, int cfra, int *overwrite)
+{
+ PointCache *cache = pid->cache;
+ int ofra = 0, efra = cache->endframe;
+
+ /* allways start from scratch on the first frame */
+ if(cfra && cfra == cache->startframe) {
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
+ return 1;
+ }
+
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ if(cfra==0 && cache->startframe > 0)
return 1;
- /* allways start from scratch on the first frame */
- if(cfra == cache->startframe) {
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, cfra);
- cache->flag &= ~PTCACHE_REDO_NEEDED;
- add = 1;
- }
- else if (cache->mem_cache.last) {
- pm2 = cache->mem_cache.last;
- if(pm2 && cfra > pm2->frame) {
- if(pm2->prev && pm2->frame - pm2->prev->frame < cache->step)
- overwrite = 1;
- else
- add = 1;
- }
- }
- else
- add = 1;
+ /* find last cached frame */
+ while(efra > cache->startframe && !BKE_ptcache_id_exist(pid, efra))
+ efra--;
- if(add || overwrite) {
- if(overwrite)
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, pm2->frame);
+ /* find second last cached frame */
+ ofra = efra-1;
+ while(ofra > cache->startframe && !BKE_ptcache_id_exist(pid, ofra))
+ ofra--;
+ }
+ else {
+ PTCacheMem *pm = cache->mem_cache.last;
+ /* don't write info file in memory */
+ if(cfra == 0)
+ return 0;
- pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
+ if(pm == NULL)
+ return 1;
- pm->totpoint = pid->totwrite(pid->calldata, cfra);
- pm->data_types = cfra ? pid->data_types : pid->info_types;
+ efra = pm->frame;
+ ofra = (pm->prev ? pm->prev->frame : efra - cache->step);
+ }
- ptcache_alloc_data(pm);
- BKE_ptcache_mem_init_pointers(pm);
+ if(efra >= cache->startframe && cfra > efra) {
+ if(ofra >= cache->startframe && efra - ofra < cache->step) {
+ /* overwrite previous frame */
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, efra);
+ *overwrite = 1;
+ }
+ return 1;
+ }
- for(i=0; i<totpoint; i++) {
- if(pid->write_elem) {
- int write = pid->write_elem(i, pid->calldata, pm->cur, cfra);
- if(write) {
- BKE_ptcache_mem_incr_pointers(pm);
+ return 0;
+}
+/* writes cache to disk or memory */
+int BKE_ptcache_write(PTCacheID *pid, unsigned int cfra)
+{
+ PointCache *cache = pid->cache;
+ int totpoint = pid->totpoint(pid->calldata, cfra);
+ int overwrite = 0, error = 0;
- /* newly born particles have to be copied to previous cached frame */
- if(overwrite && write == 2) {
- pm2 = cache->mem_cache.last;
- if(BKE_ptcache_mem_seek_pointers(i, pm2))
- pid->write_elem(i, pid->calldata, pm2->cur, cfra);
- }
- }
- }
- }
- ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra));
+ if(totpoint == 0 || (cfra ? pid->data_types == 0 : pid->info_types == 0))
+ return 0;
- pm->frame = cfra;
- BLI_addtail(&cache->mem_cache, pm);
- }
+ if(ptcache_write_needed(pid, cfra, &overwrite)==0)
+ return 0;
+
+ if(pid->write_stream) {
+ ptcache_write_stream(pid, cfra, totpoint);
+ }
+ else if(pid->write_point) {
+ error += ptcache_write(pid, cfra, overwrite);
}
- if(add || overwrite) {
- if(cfra - cache->last_exact == 1
- || cfra == cache->startframe) {
- cache->last_exact = cfra;
- cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
- }
- else
- cache->flag |= PTCACHE_FRAMES_SKIPPED;
+ /* Mark frames skipped if more than 1 frame forwards since last non-skipped frame. */
+ if(cfra - cache->last_exact == 1 || cfra == cache->startframe) {
+ cache->last_exact = cfra;
+ cache->flag &= ~PTCACHE_FRAMES_SKIPPED;
}
-
- if(pf) ptcache_file_close(pf);
+ /* Don't mark skipped when writing info file (frame 0) */
+ else if(cfra)
+ cache->flag |= PTCACHE_FRAMES_SKIPPED;
- if(pf2) ptcache_file_close(pf2);
+ /* Update timeline cache display */
+ if(cfra && cache->cached_frames)
+ cache->cached_frames[cfra-cache->startframe] = 1;
BKE_ptcache_update_info(pid);
- return 1;
+ return !error;
}
/* youll need to close yourself after!
* mode - PTCACHE_CLEAR_ALL,
*/
/* Clears & resets */
-void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
+void BKE_ptcache_id_clear(PTCacheID *pid, int mode, unsigned int cfra)
{
- int len; /* store the length of the string */
+ unsigned int len; /* store the length of the string */
+ unsigned int sta, end;
/* mode is same as fopen's modes */
DIR *dir;
@@ -1902,9 +1960,12 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
char path_full[MAX_PTCACHE_FILE];
char ext[MAX_PTCACHE_PATH];
- if(!pid->cache || pid->cache->flag & PTCACHE_BAKED)
+ if(!pid || !pid->cache || pid->cache->flag & PTCACHE_BAKED)
return;
+ sta = pid->cache->startframe;
+ end = pid->cache->endframe;
+
#ifndef DURIAN_POINTCACHE_LIB_OK
/* don't allow clearing for linked objects */
if(pid->ob->id.lib)
@@ -1921,7 +1982,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
ptcache_path(pid, path);
- len = BKE_ptcache_id_filename(pid, filename, cfra, 0, 0); /* no path */
+ len = ptcache_filename(pid, filename, cfra, 0, 0); /* no path */
dir = opendir(path);
if (dir==NULL)
@@ -1934,11 +1995,11 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */
if (mode == PTCACHE_CLEAR_ALL) {
pid->cache->last_exact = MIN2(pid->cache->startframe, 0);
- BLI_join_dirfile(path_full, path, de->d_name);
+ BLI_join_dirfile(path_full, sizeof(path_full), path, de->d_name);
BLI_delete(path_full, 0, 0);
} else {
/* read the number of the file */
- int frame, len2 = (int)strlen(de->d_name);
+ unsigned int frame, len2 = (int)strlen(de->d_name);
char num[7];
if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
@@ -1948,8 +2009,10 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) ||
(mode==PTCACHE_CLEAR_AFTER && frame > cfra) ) {
- BLI_join_dirfile(path_full, path, de->d_name);
+ BLI_join_dirfile(path_full, sizeof(path_full), path, de->d_name);
BLI_delete(path_full, 0, 0);
+ if(pid->cache->cached_frames && frame >=sta && frame <= end)
+ pid->cache->cached_frames[frame-sta] = 0;
}
}
}
@@ -1957,25 +2020,34 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
}
}
closedir(dir);
+
+ if(mode == PTCACHE_CLEAR_ALL && pid->cache->cached_frames)
+ memset(pid->cache->cached_frames, 0, MEM_allocN_len(pid->cache->cached_frames));
}
else {
PTCacheMem *pm= pid->cache->mem_cache.first;
PTCacheMem *link= NULL;
- pm= pid->cache->mem_cache.first;
-
if(mode == PTCACHE_CLEAR_ALL) {
/*we want startframe if the cache starts before zero*/
pid->cache->last_exact = MIN2(pid->cache->startframe, 0);
- for(; pm; pm=pm->next)
- ptcache_free_data(pm);
+ for(; pm; pm=pm->next) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ }
BLI_freelistN(&pid->cache->mem_cache);
+
+ if(pid->cache->cached_frames)
+ memset(pid->cache->cached_frames, 0, MEM_allocN_len(pid->cache->cached_frames));
} else {
while(pm) {
if((mode==PTCACHE_CLEAR_BEFORE && pm->frame < cfra) ||
(mode==PTCACHE_CLEAR_AFTER && pm->frame > cfra) ) {
link = pm;
- ptcache_free_data(pm);
+ if(pid->cache->cached_frames && pm->frame >=sta && pm->frame <= end)
+ pid->cache->cached_frames[pm->frame-sta] = 0;
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
pm = pm->next;
BLI_freelinkN(&pid->cache->mem_cache, link);
}
@@ -1989,7 +2061,7 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
case PTCACHE_CLEAR_FRAME:
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
if(BKE_ptcache_id_exist(pid, cfra)) {
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); /* no path */
+ ptcache_filename(pid, filename, cfra, 1, 1); /* no path */
BLI_delete(filename, 0, 0);
}
}
@@ -1998,27 +2070,35 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra)
for(; pm; pm=pm->next) {
if(pm->frame == cfra) {
- ptcache_free_data(pm);
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
BLI_freelinkN(&pid->cache->mem_cache, pm);
break;
}
}
}
+ if(pid->cache->cached_frames && cfra>=sta && cfra<=end)
+ pid->cache->cached_frames[cfra-sta] = 0;
break;
}
BKE_ptcache_update_info(pid);
}
-
-int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
+int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
{
if(!pid->cache)
return 0;
+
+ if(cfra<pid->cache->startframe || cfra > pid->cache->endframe)
+ return 0;
+
+ if(pid->cache->cached_frames && pid->cache->cached_frames[cfra-pid->cache->startframe]==0)
+ return 0;
if(pid->cache->flag & PTCACHE_DISK_CACHE) {
char filename[MAX_PTCACHE_FILE];
- BKE_ptcache_id_filename(pid, filename, cfra, 1, 1);
+ ptcache_filename(pid, filename, cfra, 1, 1);
return BLI_exists(filename);
}
@@ -2032,7 +2112,6 @@ int BKE_ptcache_id_exist(PTCacheID *pid, int cfra)
return 0;
}
}
-
void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startframe, int *endframe, float *timescale)
{
Object *ob;
@@ -2073,9 +2152,71 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra
*endframe += (int)(offset+0.5f);
}
}
-}
-int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
+ /* verify cached_frames array is up to date */
+ if(cache->cached_frames) {
+ if(MEM_allocN_len(cache->cached_frames) != sizeof(char) * (cache->endframe-cache->startframe+1)) {
+ MEM_freeN(cache->cached_frames);
+ cache->cached_frames = NULL;
+ }
+ }
+
+ if(cache->cached_frames==NULL && cache->endframe > cache->startframe) {
+ unsigned int sta=cache->startframe;
+ unsigned int end=cache->endframe;
+
+ cache->cached_frames = MEM_callocN(sizeof(char) * (cache->endframe-cache->startframe+1), "cached frames array");
+
+ if(pid->cache->flag & PTCACHE_DISK_CACHE) {
+ /* mode is same as fopen's modes */
+ DIR *dir;
+ struct dirent *de;
+ char path[MAX_PTCACHE_PATH];
+ char filename[MAX_PTCACHE_FILE];
+ char ext[MAX_PTCACHE_PATH];
+ unsigned int len; /* store the length of the string */
+
+ ptcache_path(pid, path);
+
+ len = ptcache_filename(pid, filename, (int)cfra, 0, 0); /* no path */
+
+ dir = opendir(path);
+ if (dir==NULL)
+ return;
+
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index);
+
+ while ((de = readdir(dir)) != NULL) {
+ if (strstr(de->d_name, ext)) { /* do we have the right extension?*/
+ if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */
+ /* read the number of the file */
+ unsigned int frame, len2 = (int)strlen(de->d_name);
+ char num[7];
+
+ if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
+ BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num));
+ frame = atoi(num);
+
+ if(frame >= sta && frame <= end)
+ cache->cached_frames[frame-sta] = 1;
+ }
+ }
+ }
+ }
+ closedir(dir);
+ }
+ else {
+ PTCacheMem *pm= pid->cache->mem_cache.first;
+
+ while(pm) {
+ if(pm->frame >= sta && pm->frame <= end)
+ cache->cached_frames[pm->frame-sta] = 1;
+ pm = pm->next;
+ }
+ }
+ }
+}
+int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
{
PointCache *cache;
int reset, clear, after;
@@ -2120,7 +2261,7 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
cache->flag &= ~PTCACHE_REDO_NEEDED;
if(pid->type == PTCACHE_TYPE_CLOTH)
- cloth_free_modifier(pid->ob, pid->calldata);
+ cloth_free_modifier(pid->calldata);
else if(pid->type == PTCACHE_TYPE_SOFTBODY)
sbFreeSimulation(pid->calldata);
else if(pid->type == PTCACHE_TYPE_PARTICLES)
@@ -2137,8 +2278,7 @@ int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode)
return (reset || clear || after);
}
-
-int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
+int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
{
PTCacheID pid;
ParticleSystem *psys;
@@ -2154,17 +2294,18 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
}
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- /* Baked cloth hair has to be checked first, because we don't want to reset */
+ /* children or just redo can be calculated without reseting anything */
+ if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD)
+ skip = 1;
+ /* Baked cloth hair has to be checked too, because we don't want to reset */
/* particles or cloth in that case -jahka */
- if(psys->clmd) {
+ else if(psys->clmd) {
BKE_ptcache_id_from_cloth(&pid, ob, psys->clmd);
if(mode == PSYS_RESET_ALL || !(psys->part->type == PART_HAIR && (pid.cache->flag & PTCACHE_BAKED)))
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
else
skip = 1;
}
- else if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD)
- skip = 1;
if(skip == 0 && psys->part) {
BKE_ptcache_id_from_particles(&pid, ob, psys);
@@ -2183,9 +2324,6 @@ int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode)
{
BKE_ptcache_id_from_smoke(&pid, ob, (SmokeModifierData*)md);
reset |= BKE_ptcache_id_reset(scene, &pid, mode);
-
- BKE_ptcache_id_from_smoke_turbulence(&pid, ob, (SmokeModifierData*)md);
- reset |= BKE_ptcache_id_reset(scene, &pid, mode);
}
}
}
@@ -2219,7 +2357,7 @@ void BKE_ptcache_remove(void)
if( strcmp(de->d_name, ".")==0 || strcmp(de->d_name, "..")==0) {
/* do nothing */
} else if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/
- BLI_join_dirfile(path_full, path, de->d_name);
+ BLI_join_dirfile(path_full, sizeof(path_full), path, de->d_name);
BLI_delete(path_full, 0, 0);
} else {
rmdir = 0; /* unknown file, dont remove the dir */
@@ -2250,12 +2388,12 @@ void BKE_ptcache_set_continue_physics(Main *bmain, Scene *scene, int enable)
if(CONTINUE_PHYSICS == 0) {
for(ob=bmain->object.first; ob; ob=ob->id.next)
if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED))
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
}
-int BKE_ptcache_get_continue_physics()
+int BKE_ptcache_get_continue_physics(void)
{
return CONTINUE_PHYSICS;
}
@@ -2282,8 +2420,10 @@ void BKE_ptcache_free_mem(ListBase *mem_cache)
PTCacheMem *pm = mem_cache->first;
if(pm) {
- for(; pm; pm=pm->next)
- ptcache_free_data(pm);
+ for(; pm; pm=pm->next) {
+ ptcache_data_free(pm);
+ ptcache_extra_free(pm);
+ }
BLI_freelistN(mem_cache);
}
@@ -2293,6 +2433,8 @@ void BKE_ptcache_free(PointCache *cache)
BKE_ptcache_free_mem(&cache->mem_cache);
if(cache->edit && cache->free_edit)
cache->free_edit(cache->edit);
+ if(cache->cached_frames)
+ MEM_freeN(cache->cached_frames);
MEM_freeN(cache);
}
void BKE_ptcache_free_list(ListBase *ptcaches)
@@ -2315,6 +2457,8 @@ static PointCache *ptcache_copy(PointCache *cache)
/* hmm, should these be copied over instead? */
ncache->mem_cache.first = NULL;
ncache->mem_cache.last = NULL;
+ ncache->cached_frames = NULL;
+ ncache->edit = NULL;
ncache->flag= 0;
ncache->simframe= 0;
@@ -2353,7 +2497,7 @@ void BKE_ptcache_quick_cache_all(Main *bmain, Scene *scene)
baker.scene=scene;
baker.quick_step=scene->physics_settings.quick_cache_step;
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
}
/* Simulation thread, no need for interlocks as data written in both threads
@@ -2366,10 +2510,10 @@ typedef struct {
int *cfra_ptr;
Main *main;
Scene *scene;
-} ptcache_make_cache_data;
+} ptcache_bake_data;
-static void *ptcache_make_cache_thread(void *ptr) {
- ptcache_make_cache_data *data = (ptcache_make_cache_data*)ptr;
+static void *ptcache_bake_thread(void *ptr) {
+ ptcache_bake_data *data = (ptcache_bake_data*)ptr;
for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) {
scene_update_for_newframe(data->main, data->scene, data->scene->lay);
@@ -2383,11 +2527,11 @@ static void *ptcache_make_cache_thread(void *ptr) {
}
/* if bake is not given run simulations to current frame */
-void BKE_ptcache_make_cache(PTCacheBaker* baker)
+void BKE_ptcache_bake(PTCacheBaker* baker)
{
Main *bmain = baker->main;
Scene *scene = baker->scene;
- Scene *sce; /* SETLOOPER macro only */
+ Scene *sce_iter; /* SETLOOPER macro only */
Base *base;
ListBase pidlist;
PTCacheID *pid = baker->pid;
@@ -2398,7 +2542,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
int bake = baker->bake;
int render = baker->render;
ListBase threads;
- ptcache_make_cache_data thread_data;
+ ptcache_bake_data thread_data;
int progress, old_progress;
thread_data.endframe = baker->anim_init ? scene->r.sfra : CFRA;
@@ -2458,7 +2602,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
cache->flag &= ~PTCACHE_BAKED;
}
}
- else for(SETLOOPER(scene, base)) {
+ else for(SETLOOPER(scene, sce_iter, base)) {
/* cache/bake everything in the scene */
BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR);
@@ -2499,12 +2643,14 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
thread_data.break_operation = FALSE;
thread_data.thread_ended = FALSE;
old_progress = -1;
+
+ WM_cursor_wait(1);
if(G.background) {
- ptcache_make_cache_thread((void*)&thread_data);
+ ptcache_bake_thread((void*)&thread_data);
}
else {
- BLI_init_threads(&threads, ptcache_make_cache_thread, 1);
+ BLI_init_threads(&threads, ptcache_bake_thread, 1);
BLI_insert_thread(&threads, (void*)&thread_data);
while (thread_data.thread_ended == FALSE) {
@@ -2542,10 +2688,10 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
cache->flag |= PTCACHE_BAKED;
/* write info file */
if(cache->flag & PTCACHE_DISK_CACHE)
- BKE_ptcache_write_cache(pid, 0);
+ BKE_ptcache_write(pid, 0);
}
}
- else for(SETLOOPER(scene, base)) {
+ else for(SETLOOPER(scene, sce_iter, base)) {
BKE_ptcache_ids_from_object(&pidlist, base->object, scene, MAX_DUPLI_RECUR);
for(pid=pidlist.first; pid; pid=pid->next) {
@@ -2565,7 +2711,7 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
if(bake) {
cache->flag |= PTCACHE_BAKED;
if(cache->flag & PTCACHE_DISK_CACHE)
- BKE_ptcache_write_cache(pid, 0);
+ BKE_ptcache_write(pid, 0);
}
}
BLI_freelistN(&pidlist);
@@ -2582,126 +2728,59 @@ void BKE_ptcache_make_cache(PTCacheBaker* baker)
else if (baker->progressend)
baker->progressend(baker->progresscontext);
+ WM_cursor_wait(0);
+
/* TODO: call redraw all windows somehow */
}
/* Helpers */
void BKE_ptcache_disk_to_mem(PTCacheID *pid)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf;
- PTCacheMem *pm;
-
+ PTCacheMem *pm = NULL;
+ int baked = cache->flag & PTCACHE_BAKED;
int cfra, sfra = cache->startframe, efra = cache->endframe;
- int i;
- BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
+ /* Remove possible bake flag to allow clear */
+ cache->flag &= ~PTCACHE_BAKED;
- for(cfra=sfra; cfra <= efra; cfra++) {
- pf = ptcache_file_open(pid, PTCACHE_FILE_READ, cfra);
-
- if(pf) {
- if(!ptcache_file_read_header_begin(pf)) {
- printf("Can't yet convert old cache format\n");
- cache->flag |= PTCACHE_DISK_CACHE;
- ptcache_file_close(pf);
- return;
- }
-
- if(pf->type != pid->type || !pid->read_header(pf)) {
- cache->flag |= PTCACHE_DISK_CACHE;
- ptcache_file_close(pf);
- return;
- }
-
- pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem");
-
- pm->totpoint = pf->totpoint;
- pm->data_types = pf->data_types;
- pm->frame = cfra;
-
- ptcache_alloc_data(pm);
- BKE_ptcache_mem_init_pointers(pm);
- ptcache_file_init_pointers(pf);
+ /* PTCACHE_DISK_CACHE flag was cleared already */
+ BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- for(i=0; i<pm->totpoint; i++) {
- if(!ptcache_file_read_data(pf)) {
- printf("Error reading from disk cache\n");
-
- cache->flag |= PTCACHE_DISK_CACHE;
-
- ptcache_free_data(pm);
- MEM_freeN(pm);
- ptcache_file_close(pf);
-
- return;
- }
- ptcache_copy_data(pf->cur, pm->cur);
- BKE_ptcache_mem_incr_pointers(pm);
- }
+ /* restore possible bake flag */
+ cache->flag |= baked;
- ptcache_make_index_array(pm, pid->totpoint(pid->calldata, cfra));
+ for(cfra=sfra; cfra <= efra; cfra++) {
+ pm = ptcache_disk_frame_to_mem(pid, cfra);
+ if(pm)
BLI_addtail(&pid->cache->mem_cache, pm);
-
- ptcache_file_close(pf);
- }
}
-
}
void BKE_ptcache_mem_to_disk(PTCacheID *pid)
{
PointCache *cache = pid->cache;
- PTCacheFile *pf;
- PTCacheMem *pm;
- int i;
+ PTCacheMem *pm = cache->mem_cache.first;
+ int baked = cache->flag & PTCACHE_BAKED;
- pm = cache->mem_cache.first;
+ /* Remove possible bake flag to allow clear */
+ cache->flag &= ~PTCACHE_BAKED;
+ /* PTCACHE_DISK_CACHE flag was set already */
BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);
- for(; pm; pm=pm->next) {
- pf = ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame);
-
- if(pf) {
- pf->data_types = pm->data_types;
- pf->totpoint = pm->totpoint;
- pf->type = pid->type;
+ /* restore possible bake flag */
+ cache->flag |= baked;
- BKE_ptcache_mem_init_pointers(pm);
- ptcache_file_init_pointers(pf);
-
- if(!ptcache_file_write_header_begin(pf) || !pid->write_header(pf)) {
- if (G.f & G_DEBUG)
- printf("Error writing to disk cache\n");
- cache->flag &= ~PTCACHE_DISK_CACHE;
-
- ptcache_file_close(pf);
- return;
- }
-
- for(i=0; i<pm->totpoint; i++) {
- ptcache_copy_data(pm->cur, pf->cur);
- if(!ptcache_file_write_data(pf)) {
- if (G.f & G_DEBUG)
- printf("Error writing to disk cache\n");
- cache->flag &= ~PTCACHE_DISK_CACHE;
-
- ptcache_file_close(pf);
- return;
- }
- BKE_ptcache_mem_incr_pointers(pm);
- }
-
- ptcache_file_close(pf);
-
- /* write info file */
- if(cache->flag & PTCACHE_BAKED)
- BKE_ptcache_write_cache(pid, 0);
+ for(; pm; pm=pm->next) {
+ if(ptcache_mem_frame_to_disk(pid, pm)==0) {
+ cache->flag &= ~PTCACHE_DISK_CACHE;
+ break;
}
- else
- if (G.f & G_DEBUG)
- printf("Error creating disk cache file\n");
}
+
+ /* write info file */
+ if(cache->flag & PTCACHE_BAKED)
+ BKE_ptcache_write(pid, 0);
}
void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
{
@@ -2715,6 +2794,11 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
return;
}
+ if(cache->cached_frames) {
+ MEM_freeN(cache->cached_frames);
+ cache->cached_frames=NULL;
+ }
+
if(cache->flag & PTCACHE_DISK_CACHE)
BKE_ptcache_mem_to_disk(pid);
else
@@ -2726,15 +2810,75 @@ void BKE_ptcache_toggle_disk_cache(PTCacheID *pid)
cache->last_exact = last_exact;
+ BKE_ptcache_id_time(pid, NULL, 0.0f, NULL, NULL, NULL);
+
BKE_ptcache_update_info(pid);
}
+void BKE_ptcache_disk_cache_rename(PTCacheID *pid, char *from, char *to)
+{
+ char old_name[80];
+ int len; /* store the length of the string */
+ /* mode is same as fopen's modes */
+ DIR *dir;
+ struct dirent *de;
+ char path[MAX_PTCACHE_PATH];
+ char old_filename[MAX_PTCACHE_FILE];
+ char new_path_full[MAX_PTCACHE_FILE];
+ char old_path_full[MAX_PTCACHE_FILE];
+ char ext[MAX_PTCACHE_PATH];
+
+ /* save old name */
+ strcpy(old_name, pid->cache->name);
+
+ /* get "from" filename */
+ strcpy(pid->cache->name, from);
+
+ len = ptcache_filename(pid, old_filename, 0, 0, 0); /* no path */
+
+ ptcache_path(pid, path);
+ dir = opendir(path);
+ if(dir==NULL) {
+ strcpy(pid->cache->name, old_name);
+ return;
+ }
+
+ snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index);
+
+ /* put new name into cache */
+ strcpy(pid->cache->name, to);
+
+ while ((de = readdir(dir)) != NULL) {
+ if (strstr(de->d_name, ext)) { /* do we have the right extension?*/
+ if (strncmp(old_filename, de->d_name, len ) == 0) { /* do we have the right prefix */
+ /* read the number of the file */
+ int frame, len2 = (int)strlen(de->d_name);
+ char num[7];
+
+ if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
+ BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num));
+ frame = atoi(num);
+
+ BLI_join_dirfile(old_path_full, sizeof(old_path_full), path, de->d_name);
+ ptcache_filename(pid, new_path_full, frame, 1, 1);
+ BLI_rename(old_path_full, new_path_full);
+ }
+ }
+ }
+ }
+ closedir(dir);
+
+ strcpy(pid->cache->name, old_name);
+}
+
void BKE_ptcache_load_external(PTCacheID *pid)
{
/*todo*/
PointCache *cache = pid->cache;
int len; /* store the length of the string */
int info = 0;
+ int start = MAXFRAME;
+ int end = -1;
/* mode is same as fopen's modes */
DIR *dir;
@@ -2746,13 +2890,9 @@ void BKE_ptcache_load_external(PTCacheID *pid)
if(!cache)
return;
- cache->startframe = MAXFRAME;
- cache->endframe = -1;
- cache->totpoint = 0;
-
ptcache_path(pid, path);
- len = BKE_ptcache_id_filename(pid, filename, 1, 0, 0); /* no path */
+ len = ptcache_filename(pid, filename, 1, 0, 0); /* no path */
dir = opendir(path);
if (dir==NULL)
@@ -2775,8 +2915,8 @@ void BKE_ptcache_load_external(PTCacheID *pid)
frame = atoi(num);
if(frame) {
- cache->startframe = MIN2(cache->startframe, frame);
- cache->endframe = MAX2(cache->endframe, frame);
+ start = MIN2(start, frame);
+ end = MAX2(end, frame);
}
else
info = 1;
@@ -2786,15 +2926,21 @@ void BKE_ptcache_load_external(PTCacheID *pid)
}
closedir(dir);
- if(cache->startframe != MAXFRAME) {
+ if(start != MAXFRAME) {
PTCacheFile *pf;
+ cache->startframe = start;
+ cache->endframe = end;
+ cache->totpoint = 0;
+
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ ; /*necessary info in every file*/
/* read totpoint from info file (frame 0) */
- if(info) {
+ else if(info) {
pf= ptcache_file_open(pid, PTCACHE_FILE_READ, 0);
if(pf) {
- if(ptcache_file_read_header_begin(pf)) {
+ if(ptcache_file_header_begin_read(pf)) {
if(pf->type == pid->type && pid->read_header(pf)) {
cache->totpoint = pf->totpoint;
cache->flag |= PTCACHE_READ_INFO;
@@ -2809,7 +2955,7 @@ void BKE_ptcache_load_external(PTCacheID *pid)
/* or from any old format cache file */
else {
float old_data[14];
- int elemsize = ptcache_pid_old_elemsize(pid);
+ int elemsize = ptcache_old_elemsize(pid);
pf= ptcache_file_open(pid, PTCACHE_FILE_READ, cache->startframe);
if(pf) {
@@ -2819,16 +2965,17 @@ void BKE_ptcache_load_external(PTCacheID *pid)
ptcache_file_close(pf);
}
}
+ cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
+ cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
}
- cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
-
BKE_ptcache_update_info(pid);
}
void BKE_ptcache_update_info(PTCacheID *pid)
{
PointCache *cache = pid->cache;
+ PTCacheExtra *extra = NULL;
int totframes = 0;
char mem_info[64];
@@ -2840,7 +2987,10 @@ void BKE_ptcache_update_info(PTCacheID *pid)
totframes++;
}
- if(totframes && cache->totpoint)
+ /* smoke doesn't use frame 0 as info frame so can't check based on totpoint */
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN && totframes)
+ sprintf(cache->info, "%i frames found!", totframes);
+ else if(totframes && cache->totpoint)
sprintf(cache->info, "%i points found!", cache->totpoint);
else
sprintf(cache->info, "No valid data to read!");
@@ -2848,14 +2998,25 @@ void BKE_ptcache_update_info(PTCacheID *pid)
}
if(cache->flag & PTCACHE_DISK_CACHE) {
- int cfra = cache->startframe;
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ {
+ int totpoint = pid->totpoint(pid->calldata, 0);
- for(; cfra<=cache->endframe; cfra++) {
- if(BKE_ptcache_id_exist(pid, cfra))
- totframes++;
+ if(cache->totpoint > totpoint)
+ sprintf(mem_info, "%i cells + High Resolution cached", totpoint);
+ else
+ sprintf(mem_info, "%i cells cached", totpoint);
}
+ else {
+ int cfra = cache->startframe;
- sprintf(mem_info, "%i frames on disk", totframes);
+ for(; cfra<=cache->endframe; cfra++) {
+ if(BKE_ptcache_id_exist(pid, cfra))
+ totframes++;
+ }
+
+ sprintf(mem_info, "%i frames on disk", totframes);
+ }
}
else {
PTCacheMem *pm = cache->mem_cache.first;
@@ -2864,7 +3025,15 @@ void BKE_ptcache_update_info(PTCacheID *pid)
for(; pm; pm=pm->next) {
for(i=0; i<BPHYS_TOT_DATA; i++)
- bytes += pm->data[i] ? MEM_allocN_len(pm->data[i]) : 0.0f;
+ bytes += MEM_allocN_len(pm->data[i]);
+
+ for(extra=pm->extradata.first; extra; extra=extra->next) {
+ bytes += MEM_allocN_len(extra->data);
+ bytes += sizeof(PTCacheExtra);
+ }
+
+ bytes += sizeof(PTCacheMem);
+
totframes++;
}
@@ -2888,13 +3057,17 @@ void BKE_ptcache_update_info(PTCacheID *pid)
void BKE_ptcache_validate(PointCache *cache, int framenr)
{
- cache->flag |= PTCACHE_SIMULATION_VALID;
- cache->simframe = framenr;
+ if(cache) {
+ cache->flag |= PTCACHE_SIMULATION_VALID;
+ cache->simframe = framenr;
+ }
}
void BKE_ptcache_invalidate(PointCache *cache)
{
- cache->flag &= ~PTCACHE_SIMULATION_VALID;
- cache->simframe = 0;
- cache->last_exact = MIN2(cache->startframe, 0);
+ if(cache) {
+ cache->flag &= ~PTCACHE_SIMULATION_VALID;
+ cache->simframe = 0;
+ cache->last_exact = MIN2(cache->startframe, 0);
+ }
}
diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c
index d8001572b4f..e907b628242 100644
--- a/source/blender/blenkernel/intern/property.c
+++ b/source/blender/blenkernel/intern/property.c
@@ -43,6 +43,8 @@
#include "BLI_blenlib.h"
+#include "BKE_property.h"
+
void free_property(bProperty *prop)
{
@@ -93,7 +95,7 @@ void init_property(bProperty *prop)
/* also use when property changes type */
if(prop->poin && prop->poin != &prop->data) MEM_freeN(prop->poin);
- prop->poin= 0;
+ prop->poin= NULL;
prop->data= 0;
@@ -179,7 +181,7 @@ void unique_property(bProperty *first, bProperty *prop, int force)
}
}
-bProperty *get_ob_property(Object *ob, char *name)
+bProperty *get_ob_property(Object *ob, const char *name)
{
return BLI_findstring(&ob->prop, name, offsetof(bProperty, name));
}
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index 3773757f5d5..fa2e867d483 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,10 +29,11 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_report.h"
#include "BKE_global.h" /* G.background only */
-#include "BKE_utildefines.h"
+
#include <stdarg.h>
#include <stdio.h>
@@ -44,7 +45,7 @@
#endif
#endif
-static char *report_type_str(int type)
+static const char *report_type_str(int type)
{
switch(type) {
case RPT_DEBUG: return "Debug";
@@ -82,7 +83,7 @@ void BKE_reports_clear(ReportList *reports)
while (report) {
report_next= report->next;
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
MEM_freeN(report);
report= report_next;
}
@@ -95,23 +96,23 @@ void BKE_report(ReportList *reports, ReportType type, const char *message)
Report *report;
int len;
- /* exception, print and return in background, no reason to store a list */
- if(G.background)
- reports= NULL;
-
- if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
+ /* in background mode always print otherwise there are cases the errors wont be displayed,
+ * but still add to the report list since this is used for python exception handling */
+ if(G.background || !reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
printf("%s: %s\n", report_type_str(type), message);
fflush(stdout); /* this ensures the message is printed before a crash */
}
if(reports && (reports->flag & RPT_STORE) && (type >= reports->storelevel)) {
+ char *message_alloc;
report= MEM_callocN(sizeof(Report), "Report");
report->type= type;
report->typestr= report_type_str(type);
len= strlen(message);
- report->message= MEM_callocN(sizeof(char)*(len+1), "ReportMessage");
- memcpy(report->message, message, sizeof(char)*(len+1));
+ message_alloc= MEM_callocN(sizeof(char)*(len+1), "ReportMessage");
+ memcpy(message_alloc, message, sizeof(char)*(len+1));
+ report->message= message_alloc;
report->len= len;
BLI_addtail(&reports->list, report);
}
@@ -123,10 +124,11 @@ void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
Report *report;
va_list args;
- if(!reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
+ if(G.background || !reports || ((reports->flag & RPT_PRINT) && (type >= reports->printlevel))) {
va_start(args, format);
vprintf(format, args);
va_end(args);
+ fprintf(stdout, "\n"); /* otherise each report needs to include a \n */
fflush(stdout); /* this ensures the message is printed before a crash */
}
@@ -162,7 +164,7 @@ void BKE_reports_prepend(ReportList *reports, const char *prepend)
BLI_dynstr_append(ds, prepend);
BLI_dynstr_append(ds, report->message);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
report->message= BLI_dynstr_get_cstring(ds);
report->len= BLI_dynstr_get_len(ds);
@@ -187,7 +189,7 @@ void BKE_reports_prependf(ReportList *reports, const char *prepend, ...)
va_end(args);
BLI_dynstr_append(ds, report->message);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
report->message= BLI_dynstr_get_cstring(ds);
report->len= BLI_dynstr_get_len(ds);
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index 9589b1e4f98..c8a855c8156 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -86,7 +86,7 @@ void copy_sensors(ListBase *lbn, ListBase *lbo)
{
bSensor *sens, *sensn;
- lbn->first= lbn->last= 0;
+ lbn->first= lbn->last= NULL;
sens= lbo->first;
while(sens) {
sensn= copy_sensor(sens);
@@ -253,7 +253,7 @@ void copy_controllers(ListBase *lbn, ListBase *lbo)
{
bController *cont, *contn;
- lbn->first= lbn->last= 0;
+ lbn->first= lbn->last= NULL;
cont= lbo->first;
while(cont) {
contn= copy_controller(cont);
@@ -267,7 +267,7 @@ void init_controller(bController *cont)
/* also use when controller changes type, leave actuators... */
if(cont->data) MEM_freeN(cont->data);
- cont->data= 0;
+ cont->data= NULL;
switch(cont->type) {
case CONT_EXPRESSION:
@@ -375,7 +375,7 @@ void copy_actuators(ListBase *lbn, ListBase *lbo)
{
bActuator *act, *actn;
- lbn->first= lbn->last= 0;
+ lbn->first= lbn->last= NULL;
act= lbo->first;
while(act) {
actn= copy_actuator(act);
@@ -393,7 +393,7 @@ void init_actuator(bActuator *act)
bSoundActuator *sa;
if(act->data) MEM_freeN(act->data);
- act->data= 0;
+ act->data= NULL;
switch(act->type) {
case ACT_ACTION:
@@ -512,7 +512,7 @@ void clear_sca_new_poins_ob(Object *ob)
}
}
-void clear_sca_new_poins()
+void clear_sca_new_poins(void)
{
Object *ob;
@@ -579,7 +579,16 @@ void set_sca_new_poins_ob(Object *ob)
else if(act->type==ACT_PARENT) {
bParentActuator *para = act->data;
ID_NEW(para->ob);
- }
+ }
+ else if(act->type==ACT_ARMATURE) {
+ bArmatureActuator *aa = act->data;
+ ID_NEW(aa->target);
+ ID_NEW(aa->subtarget);
+ }
+ else if(act->type==ACT_PROPERTY) {
+ bPropertyActuator *pa= act->data;
+ ID_NEW(pa->ob);
+ }
else if(act->type==ACT_ARMATURE) {
bArmatureActuator *aa = act->data;
ID_NEW(aa->target);
@@ -595,7 +604,7 @@ void set_sca_new_poins_ob(Object *ob)
}
-void set_sca_new_poins()
+void set_sca_new_poins(void)
{
Object *ob;
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 8793c412d7d..1611116f0af 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -39,6 +39,8 @@
#include <io.h>
#endif
+#include "MEM_guardedalloc.h"
+
#include "DNA_anim_types.h"
#include "DNA_group_types.h"
#include "DNA_object_types.h"
@@ -46,7 +48,9 @@
#include "DNA_screen_types.h"
#include "DNA_sequence_types.h"
-#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_animsys.h"
@@ -63,15 +67,12 @@
#include "BKE_scene.h"
#include "BKE_sequencer.h"
#include "BKE_world.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
//XXX #include "BIF_previewrender.h"
//XXX #include "BIF_editseq.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-
//XXX #include "nla.h"
#ifdef WIN32
@@ -106,7 +107,7 @@ void free_qtcodecdata(QuicktimeCodecData *qcd)
}
}
-Scene *copy_scene(Main *bmain, Scene *sce, int type)
+Scene *copy_scene(Scene *sce, int type)
{
Scene *scen;
ToolSettings *ts;
@@ -128,7 +129,6 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
id_us_plus((ID *)scen->world);
id_us_plus((ID *)scen->set);
- id_us_plus((ID *)scen->ima);
id_us_plus((ID *)scen->gm.dome.warptext);
scen->ed= NULL;
@@ -171,7 +171,7 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
BKE_keyingsets_copy(&(scen->keyingsets), &(sce->keyingsets));
if(sce->nodetree) {
- scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
+ scen->nodetree= ntreeCopyTree(sce->nodetree); /* copies actions */
ntreeSwitchID(scen->nodetree, &sce->id, &scen->id);
}
@@ -210,23 +210,26 @@ Scene *copy_scene(Main *bmain, Scene *sce, int type)
if(type == SCE_COPY_LINK_DATA || type == SCE_COPY_FULL) {
ID_NEW(scen->camera);
}
+
+ /* before scene copy */
+ sound_create_scene(scen);
/* world */
if(type == SCE_COPY_FULL) {
+ BKE_copy_animdata_id_action((ID *)scen);
if(scen->world) {
id_us_plus((ID *)scen->world);
scen->world= copy_world(scen->world);
+ BKE_copy_animdata_id_action((ID *)scen->world);
}
if(sce->ed) {
scen->ed= MEM_callocN( sizeof(Editing), "addseq");
scen->ed->seqbasep= &scen->ed->seqbase;
- seqbase_dupli_recursive(sce, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
+ seqbase_dupli_recursive(sce, scen, &scen->ed->seqbase, &sce->ed->seqbase, SEQ_DUPE_ALL);
}
}
- sound_create_scene(scen);
-
return scen;
}
@@ -315,7 +318,7 @@ void free_scene(Scene *sce)
sound_destroy_scene(sce);
}
-Scene *add_scene(char *name)
+Scene *add_scene(const char *name)
{
Main *bmain= G.main;
Scene *sce;
@@ -336,26 +339,42 @@ Scene *add_scene(char *name)
sce->r.yasp= 1;
sce->r.xparts= 8;
sce->r.yparts= 8;
- sce->r.size= 25;
+ sce->r.mblur_samples= 1;
+ sce->r.filtertype= R_FILTER_MITCH;
+ sce->r.size= 50;
sce->r.planes= 24;
+ sce->r.imtype= R_PNG;
sce->r.quality= 90;
+ sce->r.displaymode= R_OUTPUT_AREA;
sce->r.framapto= 100;
sce->r.images= 100;
sce->r.framelen= 1.0;
- sce->r.frs_sec= 25;
+ sce->r.blurfac= 0.5;
+ sce->r.frs_sec= 24;
sce->r.frs_sec_base= 1;
+ sce->r.edgeint= 10;
sce->r.ocres = 128;
sce->r.color_mgt_flag |= R_COLOR_MANAGEMENT;
+ sce->r.gauss= 1.0;
+
+ /* deprecated but keep for upwards compat */
+ sce->r.postgamma= 1.0;
+ sce->r.posthue= 0.0;
+ sce->r.postsat= 1.0;
sce->r.bake_mode= 1; /* prevent to include render stuff here */
- sce->r.bake_filter= 8;
+ sce->r.bake_filter= 2;
sce->r.bake_osa= 5;
sce->r.bake_flag= R_BAKE_CLEAR;
sce->r.bake_normal_space= R_BAKE_SPACE_TANGENT;
-
sce->r.scemode= R_DOCOMP|R_DOSEQ|R_EXTENSION;
- sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_SCENE|R_STAMP_CAMERA|R_STAMP_RENDERTIME;
+ sce->r.stamp= R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_FILENAME|R_STAMP_RENDERTIME;
sce->r.stamp_font_id= 12;
+ sce->r.fg_stamp[0]= sce->r.fg_stamp[1]= sce->r.fg_stamp[2]= 0.8f;
+ sce->r.fg_stamp[3]= 1.0f;
+ sce->r.bg_stamp[0]= sce->r.bg_stamp[1]= sce->r.bg_stamp[2]= 0.0f;
+ sce->r.bg_stamp[3]= 0.25f;
+ sce->r.raytrace_options = R_RAYTRACE_USE_INSTANCES;
sce->r.seq_prev_type= OB_SOLID;
sce->r.seq_rend_type= OB_SOLID;
@@ -441,9 +460,11 @@ Scene *add_scene(char *name)
pset->brush[a].count= 10;
}
pset->brush[PE_BRUSH_CUT].strength= 100;
-
- sce->jumpframe = 10;
+
sce->r.ffcodecdata.audio_mixrate = 44100;
+ sce->r.ffcodecdata.audio_volume = 1.0f;
+
+ BLI_strncpy(sce->r.engine, "BLENDER_RENDER", sizeof(sce->r.engine));
sce->audio.distance_model = 2.0;
sce->audio.doppler_factor = 1.0;
@@ -469,8 +490,8 @@ Scene *add_scene(char *name)
sce->gm.dome.resbuf = 1.0f;
sce->gm.dome.tilt = 0;
- sce->gm.xplay= 800;
- sce->gm.yplay= 600;
+ sce->gm.xplay= 640;
+ sce->gm.yplay= 480;
sce->gm.freqplay= 60;
sce->gm.depth= 32;
@@ -560,16 +581,16 @@ void set_scene_bg(Main *bmain, Scene *scene)
}
/* called from creator.c */
-Scene *set_scene_name(Main *bmain, char *name)
+Scene *set_scene_name(Main *bmain, const char *name)
{
Scene *sce= (Scene *)find_id("SC", name);
if(sce) {
set_scene_bg(bmain, sce);
- printf("Scene switch: '%s' in file: '%s'\n", name, G.sce);
+ printf("Scene switch: '%s' in file: '%s'\n", name, G.main->name);
return sce;
}
- printf("Can't find scene: '%s' in file: '%s'\n", name, G.sce);
+ printf("Can't find scene: '%s' in file: '%s'\n", name, G.main->name);
return NULL;
}
@@ -840,6 +861,21 @@ int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char s
return tot;
}
+int scene_marker_tfm_scale(struct Scene *scene, float value, int flag)
+{
+ TimeMarker *marker;
+ int tot= 0;
+
+ for (marker= scene->markers.first; marker; marker= marker->next) {
+ if ((marker->flag & flag) == flag) {
+ marker->frame= CFRA + (int)floorf(((float)(marker->frame - CFRA) * value) + 0.5f);
+ tot++;
+ }
+ }
+
+ return tot;
+}
+
Base *scene_add_base(Scene *sce, Object *ob)
{
Base *b= MEM_callocN(sizeof(*b), "scene_add_base");
@@ -909,31 +945,75 @@ float BKE_curframe(Scene *scene)
return ctime;
}
+/* drivers support/hacks
+ * - this method is called from scene_update_tagged_recursive(), so gets included in viewport + render
+ * - these are always run since the depsgraph can't handle non-object data
+ * - these happen after objects are all done so that we can read in their final transform values,
+ * though this means that objects can't refer to scene info for guidance...
+ */
+static void scene_update_drivers(Main *UNUSED(bmain), Scene *scene)
+{
+ float ctime = BKE_curframe(scene);
+
+ /* scene itself */
+ if (scene->adt && scene->adt->drivers.first) {
+ BKE_animsys_evaluate_animdata(&scene->id, scene->adt, ctime, ADT_RECALC_DRIVERS);
+ }
+
+ /* world */
+ // TODO: what about world textures? but then those have nodes too...
+ if (scene->world) {
+ ID *wid = (ID *)scene->world;
+ AnimData *adt= BKE_animdata_from_id(wid);
+
+ if (adt && adt->drivers.first)
+ BKE_animsys_evaluate_animdata(wid, adt, ctime, ADT_RECALC_DRIVERS);
+ }
+
+ /* nodes */
+ if (scene->nodetree) {
+ ID *nid = (ID *)scene->nodetree;
+ AnimData *adt= BKE_animdata_from_id(nid);
+
+ if (adt && adt->drivers.first)
+ BKE_animsys_evaluate_animdata(nid, adt, ctime, ADT_RECALC_DRIVERS);
+ }
+}
+
static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scene_parent)
{
Base *base;
+
+
+ scene->customdata_mask= scene_parent->customdata_mask;
/* sets first, we allow per definition current scene to have
dependencies on sets, but not the other way around. */
- if(scene->set)
+ if (scene->set)
scene_update_tagged_recursive(bmain, scene->set, scene_parent);
-
- for(base= scene->base.first; base; base= base->next) {
+
+ /* scene objects */
+ for (base= scene->base.first; base; base= base->next) {
Object *ob= base->object;
-
+
object_handle_update(scene_parent, ob);
-
+
if(ob->dup_group && (ob->transflag & OB_DUPLIGROUP))
group_handle_recalc_and_update(scene_parent, ob, ob->dup_group);
/* always update layer, so that animating layers works */
base->lay= ob->lay;
}
+
+ /* scene drivers... */
+ scene_update_drivers(bmain, scene);
}
/* this is called in main loop, doing tagged updates before redraw */
void scene_update_tagged(Main *bmain, Scene *scene)
{
+ DAG_ids_flush_tagged(bmain);
+
scene->physics_settings.quick_cache_step= 0;
/* update all objects: drivers, matrices, displists, etc. flags set
@@ -943,14 +1023,14 @@ void scene_update_tagged(Main *bmain, Scene *scene)
/* recalc scene animation data here (for sequencer) */
{
- float ctime = BKE_curframe(scene);
AnimData *adt= BKE_animdata_from_id(&scene->id);
-
- if(adt && (adt->recalc & ADT_RECALC_ANIM))
+ float ctime = BKE_curframe(scene);
+
+ if (adt && (adt->recalc & ADT_RECALC_ANIM))
BKE_animsys_evaluate_animdata(&scene->id, adt, ctime, 0);
}
-
- if(scene->physics_settings.quick_cache_step)
+
+ if (scene->physics_settings.quick_cache_step)
BKE_ptcache_quick_cache_all(bmain, scene);
/* in the future this should handle updates for all datablocks, not
@@ -974,7 +1054,7 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
/* Following 2 functions are recursive
* so dont call within 'scene_update_tagged_recursive' */
- DAG_scene_update_flags(bmain, sce, lay); // only stuff that moves or needs display still
+ DAG_scene_update_flags(bmain, sce, lay, TRUE); // only stuff that moves or needs display still
/* All 'standard' (i.e. without any dependencies) animation is handled here,
* with an 'local' to 'macro' order of evaluation. This should ensure that
@@ -1041,20 +1121,20 @@ float get_render_aosss_error(RenderData *r, float error)
}
/* helper function for the SETLOOPER macro */
-Base *_setlooper_base_step(Scene **sce, Base *base)
+Base *_setlooper_base_step(Scene **sce_iter, Base *base)
{
if(base && base->next) {
/* common case, step to the next */
return base->next;
}
- else if(base==NULL && (*sce)->base.first) {
+ else if(base==NULL && (*sce_iter)->base.first) {
/* first time looping, return the scenes first base */
- return (Base *)(*sce)->base.first;
+ return (Base *)(*sce_iter)->base.first;
}
else {
/* reached the end, get the next base in the set */
- while((*sce= (*sce)->set)) {
- base= (Base *)(*sce)->base.first;
+ while((*sce_iter= (*sce_iter)->set)) {
+ base= (Base *)(*sce_iter)->base.first;
if(base) {
return base;
}
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 6f1d32898f9..58900e603e3 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -109,7 +109,7 @@ ARegionType *BKE_regiontype_from_id(SpaceType *st, int regionid)
}
-const ListBase *BKE_spacetypes_list()
+const ListBase *BKE_spacetypes_list(void)
{
return &spacetypes;
}
diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c
index c07032f71d7..6ffac09e843 100644
--- a/source/blender/blenkernel/intern/script.c
+++ b/source/blender/blenkernel/intern/script.c
@@ -36,7 +36,7 @@
/*
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h" // Blender Python library
#endif
*/
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index 37bd3983769..000d08e4df2 100755
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -1,5 +1,5 @@
-/**
-* $Id: seqcache.c 30687 2010-07-24 08:47:14Z schlaile $
+/*
+* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -32,6 +32,7 @@
#include "DNA_sequence_types.h"
#include "BKE_sequencer.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_mempool.h"
#include <pthread.h>
@@ -42,8 +43,7 @@
typedef struct seqCacheKey
{
struct Sequence * seq;
- int rectx;
- int recty;
+ SeqRenderData context;
float cfra;
seq_stripelem_ibuf_t type;
} seqCacheKey;
@@ -54,29 +54,29 @@ typedef struct seqCacheEntry
MEM_CacheLimiterHandleC * c_handle;
} seqCacheEntry;
-static GHash * hash = 0;
-static MEM_CacheLimiterC * limitor = 0;
-static struct BLI_mempool * entrypool = 0;
-static struct BLI_mempool * keypool = 0;
+static GHash * hash = NULL;
+static MEM_CacheLimiterC * limitor = NULL;
+static struct BLI_mempool * entrypool = NULL;
+static struct BLI_mempool * keypool = NULL;
static int ibufs_in = 0;
static int ibufs_rem = 0;
-static unsigned int HashHash(void *key_)
+static unsigned int HashHash(const void *key_)
{
- seqCacheKey * key = (seqCacheKey*) key_;
- unsigned int rval = key->rectx + key->recty;
+ const seqCacheKey *key = (seqCacheKey*) key_;
+ unsigned int rval = seq_hash_render_data(&key->context);
rval ^= *(unsigned int*) &key->cfra;
rval += key->type;
- rval ^= ((unsigned int) key->seq) << 6;
+ rval ^= ((intptr_t) key->seq) << 6;
return rval;
}
-static int HashCmp(void *a_, void *b_)
+static int HashCmp(const void *a_, const void *b_)
{
- seqCacheKey * a = (seqCacheKey*) a_;
- seqCacheKey * b = (seqCacheKey*) b_;
+ const seqCacheKey * a = (seqCacheKey*) a_;
+ const seqCacheKey * b = (seqCacheKey*) b_;
if (a->seq < b->seq) {
return -1;
@@ -99,21 +99,7 @@ static int HashCmp(void *a_, void *b_)
return 1;
}
- if (a->rectx < b->rectx) {
- return -1;
- }
- if (a->rectx > b->rectx) {
- return 1;
- }
-
- if (a->recty < b->recty) {
- return -1;
- }
- if (a->recty > b->recty) {
- return 1;
- }
-
- return 0;
+ return seq_cmp_render_data(&a->context, &b->context);
}
static void HashKeyFree(void *key)
@@ -133,8 +119,8 @@ static void HashValFree(void *val)
ibufs_rem++;
}
- e->ibuf = 0;
- e->c_handle = 0;
+ e->ibuf = NULL;
+ e->c_handle = NULL;
BLI_mempool_free(entrypool, e);
}
@@ -149,12 +135,12 @@ static void IMB_seq_cache_destructor(void * p)
IMB_freeImBuf(e->ibuf);
ibufs_rem++;
- e->ibuf = 0;
- e->c_handle = 0;
+ e->ibuf = NULL;
+ e->c_handle = NULL;
}
}
-void seq_stripelem_cache_init()
+void seq_stripelem_cache_init(void)
{
hash = BLI_ghash_new(HashHash, HashCmp, "seq stripelem cache hash");
limitor = new_MEM_CacheLimiter( IMB_seq_cache_destructor );
@@ -163,7 +149,7 @@ void seq_stripelem_cache_init()
keypool = BLI_mempool_create(sizeof(seqCacheKey), 64, 64, 0, 0);
}
-void seq_stripelem_cache_destruct()
+void seq_stripelem_cache_destruct(void)
{
if (!entrypool) {
return;
@@ -174,7 +160,7 @@ void seq_stripelem_cache_destruct()
BLI_mempool_destroy(keypool);
}
-void seq_stripelem_cache_cleanup()
+void seq_stripelem_cache_cleanup(void)
{
if (!entrypool) {
seq_stripelem_cache_init();
@@ -192,14 +178,14 @@ void seq_stripelem_cache_cleanup()
}
struct ImBuf * seq_stripelem_cache_get(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type)
{
seqCacheKey key;
seqCacheEntry * e;
if (!seq) {
- return 0;
+ return NULL;
}
if (!entrypool) {
@@ -207,8 +193,7 @@ struct ImBuf * seq_stripelem_cache_get(
}
key.seq = seq;
- key.rectx = rectx;
- key.recty = recty;
+ key.context = context;
key.cfra = cfra - seq->start;
key.type = type;
@@ -220,11 +205,11 @@ struct ImBuf * seq_stripelem_cache_get(
MEM_CacheLimiter_touch(e->c_handle);
return e->ibuf;
}
- return 0;
+ return NULL;
}
void seq_stripelem_cache_put(
- struct Sequence * seq, int rectx, int recty,
+ SeqRenderData context, struct Sequence * seq,
float cfra, seq_stripelem_ibuf_t type, struct ImBuf * i)
{
seqCacheKey * key;
@@ -243,18 +228,18 @@ void seq_stripelem_cache_put(
key = (seqCacheKey*) BLI_mempool_alloc(keypool);
key->seq = seq;
- key->rectx = rectx;
- key->recty = recty;
+ key->context = context;
key->cfra = cfra - seq->start;
key->type = type;
- /* we want our own version */
- IMB_refImBuf(i);
+ /* Normally we want our own version, but start and end stills are duplicates of the original. */
+ if(ELEM(type, SEQ_STRIPELEM_IBUF_STARTSTILL, SEQ_STRIPELEM_IBUF_ENDSTILL)==0)
+ IMB_refImBuf(i);
e = (seqCacheEntry*) BLI_mempool_alloc(entrypool);
e->ibuf = i;
- e->c_handle = 0;
+ e->c_handle = NULL;
BLI_ghash_remove(hash, key, HashKeyFree, HashValFree);
BLI_ghash_insert(hash, key, e);
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 461cb075bb0..7ddd1fbd6bb 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "PIL_dynlib.h"
#include "BLI_math.h" /* windows needs for M_PI */
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
@@ -53,7 +54,7 @@
#include "RNA_access.h"
/* **** XXX **** */
-static void error(const char *error, ...) {}
+static void error(const char *UNUSED(error), ...) {}
#define INT 96
#define FLO 128
@@ -69,23 +70,25 @@ enum {
};
static struct ImBuf * prepare_effect_imbufs(
- int x, int y,
+ SeqRenderData context,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
struct ImBuf * out;
+ int x = context.rectx;
+ int y = context.recty;
if (!ibuf1 && !ibuf2 && !ibuf3) {
/* hmmm, global float option ? */
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect);
} else if ((ibuf1 && ibuf1->rect_float) ||
(ibuf2 && ibuf2->rect_float) ||
(ibuf3 && ibuf3->rect_float)) {
/* if any inputs are rectfloat, output is float too */
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rectfloat);
} else {
- out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)x, (short)y, 32, IB_rect);
}
if (ibuf1 && !ibuf1->rect_float && out->rect_float) {
@@ -117,17 +120,17 @@ static struct ImBuf * prepare_effect_imbufs(
static void open_plugin_seq(PluginSeq *pis, const char *seqname)
{
- int (*version)();
- void* (*alloc_private)();
+ int (*version)(void);
+ void* (*alloc_private)(void);
char *cp;
/* to be sure: (is tested for) */
- pis->doit= 0;
- pis->pname= 0;
- pis->varstr= 0;
- pis->cfra= 0;
+ pis->doit= NULL;
+ pis->pname= NULL;
+ pis->varstr= NULL;
+ pis->cfra= NULL;
pis->version= 0;
- pis->instance_private_data = 0;
+ pis->instance_private_data = NULL;
/* clear the error list */
PIL_dynlib_get_error_as_string(NULL);
@@ -139,12 +142,12 @@ static void open_plugin_seq(PluginSeq *pis, const char *seqname)
pis->handle= PIL_dynlib_open(pis->name);
if(test_dlerr(pis->name, pis->name)) return;
- if (pis->handle != 0) {
+ if (pis->handle != NULL) {
/* find the address of the version function */
- version= (int (*)())PIL_dynlib_find_symbol(pis->handle, "plugin_seq_getversion");
+ version= (int (*)(void))PIL_dynlib_find_symbol(pis->handle, "plugin_seq_getversion");
if (test_dlerr(pis->name, "plugin_seq_getversion")) return;
- if (version != 0) {
+ if (version != NULL) {
pis->version= version();
if (pis->version >= 2 && pis->version <= 6) {
int (*info_func)(PluginInfo *);
@@ -175,7 +178,7 @@ static void open_plugin_seq(PluginSeq *pis, const char *seqname)
return;
}
}
- alloc_private = (void* (*)())PIL_dynlib_find_symbol(
+ alloc_private = (void* (*)(void))PIL_dynlib_find_symbol(
pis->handle, "plugin_seq_alloc_private_data");
if (alloc_private) {
pis->instance_private_data = alloc_private();
@@ -198,11 +201,11 @@ static PluginSeq *add_plugin_seq(const char *str, const char *seqname)
strncpy(pis->name, str, FILE_MAXDIR+FILE_MAXFILE);
open_plugin_seq(pis, seqname);
- if(pis->doit==0) {
- if(pis->handle==0) error("no plugin: %s", str);
+ if(pis->doit==NULL) {
+ if(pis->handle==NULL) error("no plugin: %s", str);
else error("in plugin: %s", str);
MEM_freeN(pis);
- return 0;
+ return NULL;
}
/* default values */
@@ -219,7 +222,7 @@ static PluginSeq *add_plugin_seq(const char *str, const char *seqname)
static void free_plugin_seq(PluginSeq *pis)
{
- if(pis==0) return;
+ if(pis==NULL) return;
/* no PIL_dynlib_close: same plugin can be opened multiple times with 1 handle */
@@ -244,7 +247,7 @@ static void init_plugin(Sequence * seq, const char * fname)
/*
* FIXME: should query plugin! Could be generator, that needs zero inputs...
*/
-static int num_inputs_plugin()
+static int num_inputs_plugin(void)
{
return 1;
}
@@ -267,15 +270,14 @@ static void copy_plugin(Sequence * dst, Sequence * src)
static ImBuf * IMB_cast_away_list(ImBuf * i)
{
if (!i) {
- return 0;
+ return NULL;
}
return (ImBuf*) (((void**) i) + 2);
}
static struct ImBuf * do_plugin_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float cfra,
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
@@ -285,7 +287,9 @@ static struct ImBuf * do_plugin_effect(
old plugins) do very bad stuff
with imbuf-internals */
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+ int x = context.rectx;
+ int y = context.recty;
if(seq->plugin && seq->plugin->doit) {
@@ -370,8 +374,8 @@ static struct ImBuf * do_plugin_effect(
return out;
}
-static int do_plugin_early_out(struct Sequence *seq,
- float facf0, float facf1)
+static int do_plugin_early_out(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 0;
}
@@ -379,7 +383,7 @@ static int do_plugin_early_out(struct Sequence *seq,
static void free_plugin(struct Sequence * seq)
{
free_plugin_seq(seq->plugin);
- seq->plugin = 0;
+ seq->plugin = NULL;
}
/* **********************************************************************
@@ -524,22 +528,21 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_alphaover_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_alphaover_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_alphaover_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -551,7 +554,7 @@ static struct ImBuf * do_alphaover_effect(
ALPHA UNDER
********************************************************************** */
-void do_alphaunder_effect_byte(
+static void do_alphaunder_effect_byte(
float facf0, float facf1, int x, int y, char *rect1,
char *rect2, char *out)
{
@@ -696,22 +699,22 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf* do_alphaunder_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(
+ context, ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_alphaunder_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_alphaunder_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -723,7 +726,7 @@ static struct ImBuf* do_alphaunder_effect(
CROSS
********************************************************************** */
-void do_cross_effect_byte(float facf0, float facf1, int x, int y,
+static void do_cross_effect_byte(float facf0, float facf1, int x, int y,
char *rect1, char *rect2,
char *out)
{
@@ -771,7 +774,7 @@ void do_cross_effect_byte(float facf0, float facf1, int x, int y,
}
}
-void do_cross_effect_float(float facf0, float facf1, int x, int y,
+static void do_cross_effect_float(float facf0, float facf1, int x, int y,
float *rect1, float *rect2, float *out)
{
float fac1, fac2, fac3, fac4;
@@ -821,22 +824,22 @@ void do_cross_effect_float(float facf0, float facf1, int x, int y,
/* carefull: also used by speed effect! */
static struct ImBuf* do_cross_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(
+ context, ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_cross_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_cross_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -967,7 +970,7 @@ static void gamtabs(float gamma)
}
-static void build_gammatabs()
+static void build_gammatabs(void)
{
if (gamma_tabs_init == FALSE) {
gamtabs(2.0f);
@@ -976,19 +979,19 @@ static void build_gammatabs()
}
}
-static void init_gammacross(Sequence * seq)
+static void init_gammacross(Sequence * UNUSED(seq))
{
}
-static void load_gammacross(Sequence * seq)
+static void load_gammacross(Sequence * UNUSED(seq))
{
}
-static void free_gammacross(Sequence * seq)
+static void free_gammacross(Sequence * UNUSED(seq))
{
}
-static void do_gammacross_effect_byte(float facf0, float facf1,
+static void do_gammacross_effect_byte(float facf0, float UNUSED(facf1),
int x, int y,
unsigned char *rect1,
unsigned char *rect2,
@@ -1044,7 +1047,7 @@ static void do_gammacross_effect_byte(float facf0, float facf1,
}
-static void do_gammacross_effect_float(float facf0, float facf1,
+static void do_gammacross_effect_float(float facf0, float UNUSED(facf1),
int x, int y,
float *rect1, float *rect2,
float *out)
@@ -1088,24 +1091,24 @@ static void do_gammacross_effect_float(float facf0, float facf1,
}
static struct ImBuf * do_gammacross_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context,
+ Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
build_gammatabs();
if (out->rect_float) {
do_gammacross_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_gammacross_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1206,22 +1209,22 @@ static void do_add_effect_float(float facf0, float facf1, int x, int y,
}
}
-static struct ImBuf * do_add_effect(Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+static struct ImBuf * do_add_effect(SeqRenderData context,
+ Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_add_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_add_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1323,22 +1326,21 @@ static void do_sub_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_sub_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_sub_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_sub_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(char*) ibuf1->rect, (char*) ibuf2->rect,
(char*) out->rect);
}
@@ -1537,22 +1539,21 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y,
}
static struct ImBuf * do_mul_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *UNUSED(seq), float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_mul_effect_float(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
ibuf1->rect_float, ibuf2->rect_float,
out->rect_float);
} else {
do_mul_effect_byte(
- facf0, facf1, x, y,
+ facf0, facf1, context.rectx, context.recty,
(unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
(unsigned char*) out->rect);
}
@@ -1591,15 +1592,10 @@ static void precalc_wipe_zone(WipeZone *wipezone, WipeVars *wipe, int xo, int yo
// This function calculates the blur band for the wipe effects
static float in_band(WipeZone *wipezone,float width,float dist,float perc,int side,int dir)
{
- float t1,t2,alpha,percwidth;
+ float t1,t2,alpha;
if(width == 0)
return (float)side;
-
- if(side == 1)
- percwidth = width * perc;
- else
- percwidth = width * (1 - perc);
if(width < dist)
return side;
@@ -1860,7 +1856,7 @@ static void init_wipe_effect(Sequence *seq)
seq->effectdata = MEM_callocN(sizeof(struct WipeVars), "wipevars");
}
-static int num_inputs_wipe()
+static int num_inputs_wipe(void)
{
return 1;
}
@@ -1868,7 +1864,7 @@ static int num_inputs_wipe()
static void free_wipe_effect(Sequence *seq)
{
if(seq->effectdata)MEM_freeN(seq->effectdata);
- seq->effectdata = 0;
+ seq->effectdata = NULL;
}
static void copy_wipe_effect(Sequence *dst, Sequence *src)
@@ -1876,7 +1872,7 @@ static void copy_wipe_effect(Sequence *dst, Sequence *src)
dst->effectdata = MEM_dupallocN(src->effectdata);
}
-static void do_wipe_effect_byte(Sequence *seq, float facf0, float facf1,
+static void do_wipe_effect_byte(Sequence *seq, float facf0, float UNUSED(facf1),
int x, int y,
unsigned char *rect1,
unsigned char *rect2, unsigned char *out)
@@ -1934,7 +1930,7 @@ static void do_wipe_effect_byte(Sequence *seq, float facf0, float facf1,
}
}
-static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1,
+static void do_wipe_effect_float(Sequence *seq, float facf0, float UNUSED(facf1),
int x, int y,
float *rect1,
float *rect2, float *out)
@@ -1993,24 +1989,23 @@ static void do_wipe_effect_float(Sequence *seq, float facf0, float facf1,
}
static struct ImBuf * do_wipe_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
if (out->rect_float) {
do_wipe_effect_float(seq,
- facf0, facf1, x, y,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
+ facf0, facf1, context.rectx, context.recty,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
} else {
do_wipe_effect_byte(seq,
- facf0, facf1, x, y,
- (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
- (unsigned char*) out->rect);
+ facf0, facf1, context.rectx, context.recty,
+ (unsigned char*) ibuf1->rect, (unsigned char*) ibuf2->rect,
+ (unsigned char*) out->rect);
}
return out;
@@ -2045,7 +2040,7 @@ static void init_transform_effect(Sequence *seq)
transform->uniform_scale=0;
}
-static int num_inputs_transform()
+static int num_inputs_transform(void)
{
return 1;
}
@@ -2053,7 +2048,7 @@ static int num_inputs_transform()
static void free_transform_effect(Sequence *seq)
{
if(seq->effectdata)MEM_freeN(seq->effectdata);
- seq->effectdata = 0;
+ seq->effectdata = NULL;
}
static void copy_transform_effect(Sequence *dst, Sequence *src)
@@ -2062,8 +2057,8 @@ static void copy_transform_effect(Sequence *dst, Sequence *src)
}
static void transform_image(int x, int y, struct ImBuf *ibuf1, struct ImBuf *out,
- float scale_x, float scale_y, float translate_x, float translate_y,
- float rotate, int interpolation)
+ float scale_x, float scale_y, float translate_x, float translate_y,
+ float rotate, int interpolation)
{
int xo, yo, xi, yi;
float xt, yt, xr, yr;
@@ -2111,7 +2106,7 @@ static void transform_image(int x, int y, struct ImBuf *ibuf1, struct ImBuf *out
}
}
-static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y,
+static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x, int y,
struct ImBuf *ibuf1,struct ImBuf *out)
{
TransformVars *transform = (TransformVars *)seq->effectdata;
@@ -2144,15 +2139,15 @@ static void do_transform(Scene *scene, Sequence *seq, float facf0, int x, int y,
static struct ImBuf * do_transform_effect(
- Main *bmain, Scene *scene, Sequence *seq,float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq,float UNUSED(cfra),
+ float facf0, float UNUSED(facf1),
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
- do_transform(scene, seq, facf0, x, y, ibuf1, out);
+ do_transform(context.scene, seq, facf0,
+ context.rectx, context.recty, ibuf1, out);
return out;
}
@@ -2614,7 +2609,7 @@ static void init_glow_effect(Sequence *seq)
glow->bNoComp = 0;
}
-static int num_inputs_glow()
+static int num_inputs_glow(void)
{
return 1;
}
@@ -2622,7 +2617,7 @@ static int num_inputs_glow()
static void free_glow_effect(Sequence *seq)
{
if(seq->effectdata)MEM_freeN(seq->effectdata);
- seq->effectdata = 0;
+ seq->effectdata = NULL;
}
static void copy_glow_effect(Sequence *dst, Sequence *src)
@@ -2631,55 +2626,56 @@ static void copy_glow_effect(Sequence *dst, Sequence *src)
}
//void do_glow_effect(Cast *cast, float facf0, float facf1, int xo, int yo, ImBuf *ibuf1, ImBuf *ibuf2, ImBuf *outbuf, ImBuf *use)
-static void do_glow_effect_byte(Sequence *seq, float facf0, float facf1,
+static void do_glow_effect_byte(Sequence *seq, int render_size, float facf0, float UNUSED(facf1),
int x, int y, char *rect1,
- char *rect2, char *out)
+ char *UNUSED(rect2), char *out)
{
unsigned char *outbuf=(unsigned char *)out;
unsigned char *inbuf=(unsigned char *)rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
- int size= 100; // renderdata XXX
RVIsolateHighlights_byte(inbuf, outbuf , x, y, glow->fMini*765, glow->fBoost * facf0, glow->fClamp);
- RVBlurBitmap2_byte (outbuf, x, y, glow->dDist * (size / 100.0f),glow->dQuality);
+ RVBlurBitmap2_byte (outbuf, x, y, glow->dDist * (render_size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_byte (inbuf , outbuf, outbuf, x, y);
}
-static void do_glow_effect_float(Sequence *seq, float facf0, float facf1,
+static void do_glow_effect_float(Sequence *seq, int render_size, float facf0, float UNUSED(facf1),
int x, int y,
- float *rect1, float *rect2, float *out)
+ float *rect1, float *UNUSED(rect2), float *out)
{
float *outbuf = out;
float *inbuf = rect1;
GlowVars *glow = (GlowVars *)seq->effectdata;
- int size= 100; // renderdata XXX
RVIsolateHighlights_float(inbuf, outbuf , x, y, glow->fMini*3.0f, glow->fBoost * facf0, glow->fClamp);
- RVBlurBitmap2_float (outbuf, x, y, glow->dDist * (size / 100.0f),glow->dQuality);
+ RVBlurBitmap2_float (outbuf, x, y, glow->dDist * (render_size / 100.0f),glow->dQuality);
if (!glow->bNoComp)
RVAddBitmaps_float (inbuf , outbuf, outbuf, x, y);
}
static struct ImBuf * do_glow_effect(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+
+ int render_size = 100*context.rectx/context.scene->r.xsch;
if (out->rect_float) {
- do_glow_effect_float(seq,
- facf0, facf1, x, y,
- ibuf1->rect_float, ibuf2->rect_float,
- out->rect_float);
+ do_glow_effect_float(seq, render_size,
+ facf0, facf1,
+ context.rectx, context.recty,
+ ibuf1->rect_float, ibuf2->rect_float,
+ out->rect_float);
} else {
- do_glow_effect_byte(seq,
- facf0, facf1, x, y,
- (char*) ibuf1->rect, (char*) ibuf2->rect,
- (char*) out->rect);
+ do_glow_effect_byte(seq, render_size,
+ facf0, facf1,
+ context.rectx, context.recty,
+ (char*) ibuf1->rect, (char*) ibuf2->rect,
+ (char*) out->rect);
}
return out;
@@ -2700,7 +2696,7 @@ static void init_solid_color(Sequence *seq)
cv->col[0] = cv->col[1] = cv->col[2] = 0.5;
}
-static int num_inputs_color()
+static int num_inputs_color(void)
{
return 0;
}
@@ -2708,7 +2704,7 @@ static int num_inputs_color()
static void free_solid_color(Sequence *seq)
{
if(seq->effectdata)MEM_freeN(seq->effectdata);
- seq->effectdata = 0;
+ seq->effectdata = NULL;
}
static void copy_solid_color(Sequence *dst, Sequence *src)
@@ -2716,25 +2712,26 @@ static void copy_solid_color(Sequence *dst, Sequence *src)
dst->effectdata = MEM_dupallocN(src->effectdata);
}
-static int early_out_color(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_color(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return -1;
}
static struct ImBuf * do_solid_color(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra),
+ float facf0, float facf1,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
SolidColorVars *cv = (SolidColorVars *)seq->effectdata;
unsigned char *rect;
float *rect_float;
+ int x; /*= context.rectx;*/ /*UNUSED*/
+ int y; /*= context.recty;*/ /*UNUSED*/
if (out->rect) {
unsigned char col0[3];
@@ -2808,22 +2805,21 @@ static struct ImBuf * do_solid_color(
********************************************************************** */
/* no effect inputs for multicam, we use give_ibuf_seq */
-static int num_inputs_multicam()
+static int num_inputs_multicam(void)
{
return 0;
}
-static int early_out_multicam(struct Sequence *seq, float facf0, float facf1)
+static int early_out_multicam(struct Sequence *UNUSED(seq), float UNUSED(facf0), float UNUSED(facf1))
{
return -1;
}
static struct ImBuf * do_multicam(
- Main *bmain, Scene *scene, Sequence *seq, float cfra,
- float facf0, float facf1, int x, int y,
- int preview_render_size,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3)
+ SeqRenderData context, Sequence *seq, float cfra,
+ float UNUSED(facf0), float UNUSED(facf1),
+ struct ImBuf *UNUSED(ibuf1), struct ImBuf *UNUSED(ibuf2),
+ struct ImBuf *UNUSED(ibuf3))
{
struct ImBuf * i;
struct ImBuf * out;
@@ -2831,25 +2827,24 @@ static struct ImBuf * do_multicam(
ListBase * seqbasep;
if (seq->multicam_source == 0 || seq->multicam_source >= seq->machine) {
- return 0;
+ return NULL;
}
- ed = scene->ed;
+ ed = context.scene->ed;
if (!ed) {
- return 0;
+ return NULL;
}
seqbasep = seq_seqbase(&ed->seqbase, seq);
if (!seqbasep) {
- return 0;
+ return NULL;
}
- i = give_ibuf_seqbase(bmain, scene, x, y, cfra, seq->multicam_source,
- preview_render_size, seqbasep);
+ i = give_ibuf_seqbase(context, cfra, seq->multicam_source, seqbasep);
if (!i) {
- return 0;
+ return NULL;
}
- if (input_have_to_preprocess(scene, seq, cfra, x, y)) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(i);
IMB_freeImBuf(i);
} else {
@@ -2872,8 +2867,8 @@ static void init_speed_effect(Sequence *seq)
v = (SpeedControlVars *)seq->effectdata;
v->globalSpeed = 1.0;
- v->frameMap = 0;
- v->flags = 0;
+ v->frameMap = NULL;
+ v->flags |= SEQ_SPEED_INTEGRATE; /* should be default behavior */
v->length = 0;
}
@@ -2881,11 +2876,11 @@ static void load_speed_effect(Sequence * seq)
{
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
- v->frameMap = 0;
+ v->frameMap = NULL;
v->length = 0;
}
-static int num_inputs_speed()
+static int num_inputs_speed(void)
{
return 1;
}
@@ -2895,7 +2890,7 @@ static void free_speed_effect(Sequence *seq)
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
if(v->frameMap) MEM_freeN(v->frameMap);
if(seq->effectdata) MEM_freeN(seq->effectdata);
- seq->effectdata = 0;
+ seq->effectdata = NULL;
}
static void copy_speed_effect(Sequence *dst, Sequence *src)
@@ -2903,18 +2898,18 @@ static void copy_speed_effect(Sequence *dst, Sequence *src)
SpeedControlVars * v;
dst->effectdata = MEM_dupallocN(src->effectdata);
v = (SpeedControlVars *)dst->effectdata;
- v->frameMap = 0;
+ v->frameMap = NULL;
v->length = 0;
}
-static int early_out_speed(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_speed(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 1;
}
static void store_icu_yrange_speed(struct Sequence * seq,
- short adrcode, float * ymin, float * ymax)
+ short UNUSED(adrcode), float * ymin, float * ymax)
{
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
@@ -2936,11 +2931,11 @@ static void store_icu_yrange_speed(struct Sequence * seq,
}
void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
{
- float ctime, div;
int cfra;
- float fallback_fac;
+ float fallback_fac = 1.0f;
SpeedControlVars * v = (SpeedControlVars *)seq->effectdata;
FCurve *fcu= NULL;
+ int flags = v->flags;
/* if not already done, load / initialize data */
get_sequence_effect(seq);
@@ -2955,7 +2950,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
/* XXX - new in 2.5x. should we use the animation system this way?
* The fcurve is needed because many frames need evaluating at once - campbell */
- fcu= id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "speed_fader", 0);
+ fcu= id_data_find_fcurve(&scene->id, seq, &RNA_Sequence, "speed_factor", 0);
if (!v->frameMap || v->length != seq->len) {
@@ -2968,15 +2963,23 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
}
fallback_fac = 1.0;
-
- /* if there is no fcurve, try to make retiming easy by stretching the
- strip */
- if (!fcu && seq->seq1->enddisp != seq->seq1->start && seq->seq1->len != 0) {
- fallback_fac = (float) seq->seq1->len /
- (float) (seq->seq1->enddisp - seq->seq1->start);
+
+ if (seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) {
+ if (seq->seq1->enddisp != seq->seq1->start
+ && seq->seq1->len != 0) {
+ fallback_fac = (float) seq->seq1->len /
+ (float) (seq->seq1->enddisp - seq->seq1->start);
+ flags = SEQ_SPEED_INTEGRATE;
+ fcu = NULL;
+ }
+ } else {
+ /* if there is no fcurve, use value as simple multiplier */
+ if (!fcu) {
+ fallback_fac = seq->speed_fader; /* same as speed_factor in rna*/
+ }
}
- if ((v->flags & SEQ_SPEED_INTEGRATE) != 0) {
+ if (flags & SEQ_SPEED_INTEGRATE) {
float cursor = 0;
float facf;
@@ -2985,10 +2988,7 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
for (cfra = 1; cfra < v->length; cfra++) {
if(fcu) {
- ctime = seq->startdisp + cfra;
- div = 1.0;
-
- facf = evaluate_fcurve(fcu, ctime/div);
+ facf = evaluate_fcurve(fcu, seq->startdisp + cfra);
} else {
facf = fallback_fac;
}
@@ -3010,19 +3010,16 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
for (cfra = 0; cfra < v->length; cfra++) {
if(fcu) {
- ctime = seq->startdisp + cfra;
- div = 1.0;
-
- facf = evaluate_fcurve(fcu, ctime / div);
- if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) {
- facf *= v->length;
- }
+ facf = evaluate_fcurve(fcu, seq->startdisp + cfra);
+ } else {
+ facf = fallback_fac;
}
-
- if (!fcu) {
- facf = (float) cfra * fallback_fac;
+
+ if (flags & SEQ_SPEED_COMPRESS_IPO_Y) {
+ facf *= seq->seq1->len;
}
facf *= v->globalSpeed;
+
if (facf >= seq->seq1->len) {
facf = seq->seq1->len - 1;
} else {
@@ -3033,56 +3030,43 @@ void sequence_effect_speed_rebuild_map(Scene *scene, Sequence * seq, int force)
}
}
-/*
- simply reuse do_cross_effect for blending...
-
-static void do_speed_effect(Sequence * seq,int cfra,
- float facf0, float facf1, int x, int y,
- struct ImBuf *ibuf1, struct ImBuf *ibuf2,
- struct ImBuf *ibuf3, struct ImBuf *out)
-{
-
-}
-*/
-
-
/* **********************************************************************
sequence effect factory
********************************************************************** */
-static void init_noop(struct Sequence *seq)
+static void init_noop(struct Sequence *UNUSED(seq))
{
}
-static void load_noop(struct Sequence *seq)
+static void load_noop(struct Sequence *UNUSED(seq))
{
}
-static void init_plugin_noop(struct Sequence *seq, const char * fname)
+static void init_plugin_noop(struct Sequence *UNUSED(seq), const char *UNUSED(fname))
{
}
-static void free_noop(struct Sequence *seq)
+static void free_noop(struct Sequence *UNUSED(seq))
{
}
-static int num_inputs_default()
+static int num_inputs_default(void)
{
return 2;
}
-static int early_out_noop(struct Sequence *seq,
- float facf0, float facf1)
+static int early_out_noop(struct Sequence *UNUSED(seq),
+ float UNUSED(facf0), float UNUSED(facf1))
{
return 0;
}
-static int early_out_fade(struct Sequence *seq,
+static int early_out_fade(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
if (facf0 == 0.0 && facf1 == 0.0) {
@@ -3093,7 +3077,7 @@ static int early_out_fade(struct Sequence *seq,
return 0;
}
-static int early_out_mul_input2(struct Sequence *seq,
+static int early_out_mul_input2(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
if (facf0 == 0.0 && facf1 == 0.0) {
@@ -3102,13 +3086,13 @@ static int early_out_mul_input2(struct Sequence *seq,
return 0;
}
-static void store_icu_yrange_noop(struct Sequence * seq,
- short adrcode, float * ymin, float * ymax)
+static void store_icu_yrange_noop(struct Sequence * UNUSED(seq),
+ short UNUSED(adrcode), float *UNUSED(ymin), float *UNUSED(ymax))
{
/* defaults are fine */
}
-static void get_default_fac_noop(struct Sequence *seq, float cfra,
+static void get_default_fac_noop(struct Sequence *UNUSED(seq), float UNUSED(cfra),
float * facf0, float * facf1)
{
*facf0 = *facf1 = 1.0;
@@ -3123,15 +3107,17 @@ static void get_default_fac_fade(struct Sequence *seq, float cfra,
*facf1 /= seq->len;
}
-static struct ImBuf * do_overdrop_effect(Main *bmain, Scene *scene, Sequence *seq, float cfra,
+static struct ImBuf * do_overdrop_effect(SeqRenderData context,
+ Sequence *UNUSED(seq),
+ float UNUSED(cfra),
float facf0, float facf1,
- int x, int y,
- int preview_render_size,
struct ImBuf * ibuf1,
struct ImBuf * ibuf2,
struct ImBuf * ibuf3)
{
- struct ImBuf * out = prepare_effect_imbufs(x, y, ibuf1, ibuf2, ibuf3);
+ struct ImBuf * out = prepare_effect_imbufs(context,ibuf1, ibuf2, ibuf3);
+ int x = context.rectx;
+ int y = context.recty;
if (out->rect_float) {
do_drop_effect_float(
@@ -3274,9 +3260,7 @@ static struct SeqEffectHandle get_sequence_effect_impl(int seq_type)
struct SeqEffectHandle get_sequence_effect(Sequence * seq)
{
- struct SeqEffectHandle rval;
-
- memset(&rval, 0, sizeof(struct SeqEffectHandle));
+ struct SeqEffectHandle rval= {NULL};
if (seq->type & SEQ_EFFECT) {
rval = get_sequence_effect_impl(seq->type);
@@ -3291,9 +3275,7 @@ struct SeqEffectHandle get_sequence_effect(Sequence * seq)
struct SeqEffectHandle get_sequence_blend(Sequence * seq)
{
- struct SeqEffectHandle rval;
-
- memset(&rval, 0, sizeof(struct SeqEffectHandle));
+ struct SeqEffectHandle rval= {NULL};
if (seq->blend_mode != 0) {
rval = get_sequence_effect_impl(seq->blend_mode);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index b6bb5c3a51b..83e28db771a 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,14 @@
#include "DNA_object_types.h"
#include "DNA_sound_types.h"
+#include "BLI_math.h"
+#include "BLI_fileops.h"
+#include "BLI_listbase.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -49,21 +57,15 @@
#include "BKE_fcurve.h"
#include "BKE_scene.h"
#include "RNA_access.h"
+#include "BKE_utildefines.h"
+
#include "RE_pipeline.h"
-#include "BLI_math.h"
-#include "BLI_fileops.h"
-#include "BLI_listbase.h"
-#include "BLI_path_util.h"
-#include "BLI_string.h"
-#include "BLI_threads.h"
#include <pthread.h>
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-
-
#include "BKE_context.h"
#include "BKE_sound.h"
#include "AUD_C-API.h"
@@ -133,7 +135,7 @@ static void free_proxy_seq(Sequence *seq)
{
if (seq->strip && seq->strip->proxy && seq->strip->proxy->anim) {
IMB_free_anim(seq->strip->proxy->anim);
- seq->strip->proxy->anim = 0;
+ seq->strip->proxy->anim = NULL;
}
}
@@ -191,7 +193,7 @@ void seq_free_sequence(Scene *scene, Sequence *seq)
if (ed->act_seq==seq)
ed->act_seq= NULL;
- if(seq->scene_sound)
+ if(seq->scene_sound && ELEM(seq->type, SEQ_SOUND, SEQ_SCENE))
sound_remove_scene_sound(scene, seq->scene_sound);
seq_free_animdata(scene, seq);
@@ -244,7 +246,95 @@ void seq_free_editing(Scene *scene)
MEM_freeN(ed);
}
-/* ************************* itterator ************************** */
+/* **********************************************************************
+ * sequencer pipeline functions
+ ********************************************************************** */
+
+SeqRenderData seq_new_render_data(
+ struct Main * bmain, struct Scene * scene,
+ int rectx, int recty, int preview_render_size)
+{
+ SeqRenderData rval;
+
+ rval.bmain = bmain;
+ rval.scene = scene;
+ rval.rectx = rectx;
+ rval.recty = recty;
+ rval.preview_render_size = preview_render_size;
+ rval.motion_blur_samples = 0;
+ rval.motion_blur_shutter = 0;
+
+ return rval;
+}
+
+int seq_cmp_render_data(const SeqRenderData * a, const SeqRenderData * b)
+{
+ if (a->preview_render_size < b->preview_render_size) {
+ return -1;
+ }
+ if (a->preview_render_size > b->preview_render_size) {
+ return 1;
+ }
+
+ if (a->rectx < b->rectx) {
+ return -1;
+ }
+ if (a->rectx > b->rectx) {
+ return 1;
+ }
+
+ if (a->recty < b->recty) {
+ return -1;
+ }
+ if (a->recty > b->recty) {
+ return 1;
+ }
+
+ if (a->bmain < b->bmain) {
+ return -1;
+ }
+ if (a->bmain > b->bmain) {
+ return 1;
+ }
+
+ if (a->scene < b->scene) {
+ return -1;
+ }
+ if (a->scene > b->scene) {
+ return 1;
+ }
+
+ if (a->motion_blur_shutter < b->motion_blur_shutter) {
+ return -1;
+ }
+ if (a->motion_blur_shutter > b->motion_blur_shutter) {
+ return 1;
+ }
+
+ if (a->motion_blur_samples < b->motion_blur_samples) {
+ return -1;
+ }
+ if (a->motion_blur_samples > b->motion_blur_samples) {
+ return 1;
+ }
+
+ return 0;
+}
+
+unsigned int seq_hash_render_data(const SeqRenderData * a)
+{
+ unsigned int rval = a->rectx + a->recty;
+
+ rval ^= a->preview_render_size;
+ rval ^= ((intptr_t) a->bmain) << 6;
+ rval ^= ((intptr_t) a->scene) << 6;
+ rval ^= (int) (a->motion_blur_shutter * 100.0) << 10;
+ rval ^= a->motion_blur_samples << 24;
+
+ return rval;
+}
+
+/* ************************* iterator ************************** */
/* *************** (replaces old WHILE_SEQ) ********************* */
/* **************** use now SEQ_BEGIN() SEQ_END ***************** */
@@ -339,7 +429,7 @@ void seq_end(SeqIterator *iter)
* in metastrips!)
**********************************************************************
*/
-
+#if 0 /* UNUSED */
static void do_seq_count(ListBase *seqbase, int *totseq)
{
Sequence *seq;
@@ -366,7 +456,7 @@ static void do_build_seqar(ListBase *seqbase, Sequence ***seqar, int depth)
}
}
-void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
+static void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
{
Sequence **tseqar;
@@ -374,7 +464,7 @@ void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
do_seq_count(seqbase, totseq);
if(*totseq==0) {
- *seqar= 0;
+ *seqar= NULL;
return;
}
*seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
@@ -383,6 +473,7 @@ void build_seqar(ListBase *seqbase, Sequence ***seqar, int *totseq)
do_build_seqar(seqbase, seqar, 0);
*seqar= tseqar;
}
+#endif /* UNUSED */
static void do_seq_count_cb(ListBase *seqbase, int *totseq,
int (*test_func)(Sequence * seq))
@@ -413,8 +504,7 @@ static void do_build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int depth,
seq->depth= depth;
if(seq->seqbase.first && (test & BUILD_SEQAR_COUNT_CHILDREN)) {
- do_build_seqar_cb(&seq->seqbase, seqar, depth+1,
- test_func);
+ do_build_seqar_cb(&seq->seqbase, seqar, depth+1, test_func);
}
if (test & BUILD_SEQAR_COUNT_CURRENT) {
**seqar= seq;
@@ -433,7 +523,7 @@ void build_seqar_cb(ListBase *seqbase, Sequence ***seqar, int *totseq,
do_seq_count_cb(seqbase, totseq, test_func);
if(*totseq==0) {
- *seqar= 0;
+ *seqar= NULL;
return;
}
*seqar= MEM_mallocN(sizeof(void *)* *totseq, "seqar");
@@ -473,7 +563,7 @@ static void seq_update_sound_bounds_recursive(Scene *scene, Sequence *metaseq)
if(seq->type == SEQ_META) {
seq_update_sound_bounds_recursive(scene, seq);
}
- else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) {
+ else if(ELEM(seq->type, SEQ_SOUND, SEQ_SCENE)) {
if(seq->scene_sound) {
int startofs = seq->startofs;
int endofs = seq->endofs;
@@ -504,8 +594,8 @@ void calc_sequence(Scene *scene, Sequence *seq)
if(seq->type & SEQ_EFFECT) {
/* pointers */
- if(seq->seq2==0) seq->seq2= seq->seq1;
- if(seq->seq3==0) seq->seq3= seq->seq1;
+ if(seq->seq2==NULL) seq->seq2= seq->seq1;
+ if(seq->seq3==NULL) seq->seq3= seq->seq1;
/* effecten go from seq1 -> seq2: test */
@@ -554,15 +644,13 @@ void calc_sequence(Scene *scene, Sequence *seq)
}
/* note: caller should run calc_sequence(scene, seq) after */
-void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int lock_range)
+void reload_sequence_new_file(Scene *scene, Sequence * seq, int lock_range)
{
char str[FILE_MAXDIR+FILE_MAXFILE];
- int prev_startdisp, prev_enddisp;
+ int prev_startdisp=0, prev_enddisp=0;
/* note: dont rename the strip, will break animation curves */
- if (!(seq->type == SEQ_MOVIE || seq->type == SEQ_IMAGE ||
- seq->type == SEQ_SOUND ||
- seq->type == SEQ_SCENE || seq->type == SEQ_META)) {
+ if (ELEM5(seq->type, SEQ_MOVIE, SEQ_IMAGE, SEQ_SOUND, SEQ_SCENE, SEQ_META)==0) {
return;
}
@@ -576,13 +664,14 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
new_tstripdata(seq);
- if (seq->type != SEQ_SCENE && seq->type != SEQ_META &&
- seq->type != SEQ_IMAGE) {
- BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(str, G.sce);
+ if (ELEM3(seq->type, SEQ_SCENE, SEQ_META, SEQ_IMAGE)==0) {
+ BLI_join_dirfile(str, sizeof(str), seq->strip->dir, seq->strip->stripdata->name);
+ BLI_path_abs(str, G.main->name);
}
- if (seq->type == SEQ_IMAGE) {
+ switch(seq->type) {
+ case SEQ_IMAGE:
+ {
/* Hack? */
size_t olen = MEM_allocN_len(seq->strip->stripdata)/sizeof(struct StripElem);
@@ -593,7 +682,9 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_MOVIE) {
+ break;
+ }
+ case SEQ_MOVIE:
if(seq->anim) IMB_free_anim(seq->anim);
seq->anim = openanim(str, IB_rect | ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0));
@@ -611,7 +702,9 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_SOUND) {
+ case SEQ_SOUND:
+ if(!seq->sound)
+ return;
seq->len = ceil(AUD_getInfo(seq->sound->playback_handle).length * FPS);
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
@@ -619,9 +712,11 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
- } else if (seq->type == SEQ_SCENE) {
+ break;
+ case SEQ_SCENE:
+ {
/* 'seq->scenenr' should be replaced with something more reliable */
- Scene * sce = bmain->scene.first;
+ Scene * sce = G.main->scene.first;
int nr = 1;
while(sce) {
@@ -634,10 +729,8 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
if (sce) {
seq->scene = sce;
- } else {
- sce = seq->scene;
}
-
+
seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1;
seq->len -= seq->anim_startofs;
seq->len -= seq->anim_endofs;
@@ -645,6 +738,8 @@ void reload_sequence_new_file(Main *bmain, Scene *scene, Sequence * seq, int loc
seq->len = 0;
}
seq->strip->len = seq->len;
+ break;
+ }
}
free_proxy_seq(seq);
@@ -668,8 +763,8 @@ void sort_seq(Scene *scene)
if(ed==NULL) return;
- seqbase.first= seqbase.last= 0;
- effbase.first= effbase.last= 0;
+ seqbase.first= seqbase.last= NULL;
+ effbase.first= effbase.last= NULL;
while( (seq= ed->seqbasep->first) ) {
BLI_remlink(ed->seqbasep, seq);
@@ -683,7 +778,7 @@ void sort_seq(Scene *scene)
}
seqt= seqt->next;
}
- if(seqt==0) BLI_addtail(&effbase, seq);
+ if(seqt==NULL) BLI_addtail(&effbase, seq);
}
else {
seqt= seqbase.first;
@@ -694,11 +789,11 @@ void sort_seq(Scene *scene)
}
seqt= seqt->next;
}
- if(seqt==0) BLI_addtail(&seqbase, seq);
+ if(seqt==NULL) BLI_addtail(&seqbase, seq);
}
}
- addlisttolist(&seqbase, &effbase);
+ BLI_movelisttolist(&seqbase, &effbase);
*(ed->seqbasep)= seqbase;
}
@@ -783,7 +878,7 @@ void seqbase_unique_name_recursive(ListBase *seqbasep, struct Sequence *seq)
strcpy(seq->name+2, sui.name_dest);
}
-static char *give_seqname_by_type(int type)
+static const char *give_seqname_by_type(int type)
{
switch(type) {
case SEQ_META: return "Meta";
@@ -806,13 +901,13 @@ static char *give_seqname_by_type(int type)
case SEQ_MULTICAM: return "Multicam";
case SEQ_SPEED: return "Speed";
default:
- return 0;
+ return NULL;
}
}
-char *give_seqname(Sequence *seq)
+const char *give_seqname(Sequence *seq)
{
- char * name = give_seqname_by_type(seq->type);
+ const char *name = give_seqname_by_type(seq->type);
if (!name) {
if(seq->type<SEQ_EFFECT) {
@@ -839,7 +934,7 @@ static void make_black_ibuf(ImBuf *ibuf)
float *rect_float;
int tot;
- if(ibuf==0 || (ibuf->rect==0 && ibuf->rect_float==0)) return;
+ if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) return;
tot= ibuf->x*ibuf->y;
@@ -898,19 +993,24 @@ static void multibuf(ImBuf *ibuf, float fmul)
static float give_stripelem_index(Sequence *seq, float cfra)
{
float nr;
+ int sta = seq->start;
+ int end = seq->start+seq->len-1;
if(seq->len == 0) return -1;
+
if(seq->flag&SEQ_REVERSE_FRAMES) {
/*reverse frame in this sequence */
- if(cfra <= seq->start) nr= seq->len-1;
- else if(cfra >= seq->start+seq->len-1) nr= 0;
- else nr= (seq->start + seq->len - 1) - cfra;
+ if(cfra <= sta) nr= seq->len-1;
+ else if(cfra >= end) nr= 0;
+ else nr= end - cfra;
} else {
- if(cfra <= seq->start) nr= 0;
- else if(cfra >= seq->start+seq->len-1) nr= seq->len-1;
- else nr= cfra-seq->start;
+ if(cfra <= sta) nr= 0;
+ else if(cfra >= end) nr= seq->len-1;
+ else nr= cfra - sta;
}
+
if (seq->strobe < 1.0) seq->strobe = 1.0;
+
if (seq->strobe > 1.0) {
nr -= fmod((double)nr, (double)seq->strobe);
}
@@ -922,14 +1022,10 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
{
StripElem *se= seq->strip->stripdata;
- if(seq->type == SEQ_MOVIE) {
- /* use the first */
- }
- else {
+ if(seq->type != SEQ_MOVIE) { /* movie use the first */
int nr = (int) give_stripelem_index(seq, cfra);
- if (nr == -1) return 0;
- if (se == 0) return 0;
+ if (nr == -1 || se == NULL) return NULL;
se += nr + seq->anim_startofs;
}
@@ -966,9 +1062,7 @@ int evaluate_seq_frame(Scene *scene, int cfra)
static int video_seq_is_rendered(Sequence * seq)
{
- return (seq
- && !(seq->flag & SEQ_MUTE)
- && seq->type != SEQ_SOUND);
+ return (seq && !(seq->flag & SEQ_MUTE) && seq->type != SEQ_SOUND);
}
static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Sequence ** seq_arr_out)
@@ -983,7 +1077,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se
if(evaluate_seq_frame_gen(seq_arr, seqbasep, cfra)) {
if (b > 0) {
- if (seq_arr[b] == 0) {
+ if (seq_arr[b] == NULL) {
return 0;
}
} else {
@@ -1005,7 +1099,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se
}
}
- for (;b <= chanshown; b++) {
+ for (;b <= chanshown && b >= 0; b++) {
if (video_seq_is_rendered(seq_arr[b])) {
seq_arr_out[cnt++] = seq_arr[b];
}
@@ -1021,7 +1115,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se
#define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
-static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * name, int render_size)
+static int seq_proxy_get_fname(SeqRenderData context, Sequence * seq, int cfra, char * name)
{
int frameno;
char dir[FILE_MAXDIR];
@@ -1030,103 +1124,96 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na
return FALSE;
}
- if ((seq->flag & SEQ_USE_PROXY_CUSTOM_DIR)
- || (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) {
+ if (seq->flag & (SEQ_USE_PROXY_CUSTOM_DIR|SEQ_USE_PROXY_CUSTOM_FILE)) {
strcpy(dir, seq->strip->proxy->dir);
} else {
- if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
- snprintf(dir, FILE_MAXDIR, "%s/BL_proxy",
- seq->strip->dir);
+ if (ELEM(seq->type, SEQ_IMAGE, SEQ_MOVIE)) {
+ snprintf(dir, FILE_MAXDIR, "%s/BL_proxy", seq->strip->dir);
} else {
return FALSE;
}
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- BLI_join_dirfile(name, dir, seq->strip->proxy->file);
- BLI_path_abs(name, G.sce);
+ BLI_join_dirfile(name, FILE_MAX, dir, seq->strip->proxy->file); /* XXX, not real length */
+ BLI_path_abs(name, G.main->name);
return TRUE;
}
/* generate a separate proxy directory for each preview size */
- if (seq->type == SEQ_IMAGE) {
- StripElem * se = give_stripelem(seq, cfra);
- snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
- dir, render_size, se->name);
+ switch(seq->type) {
+ case SEQ_IMAGE:
+ snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy", dir,
+ context.preview_render_size,
+ give_stripelem(seq, cfra)->name);
frameno = 1;
- } else if (seq->type == SEQ_MOVIE) {
- frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
-
+ break;
+ case SEQ_MOVIE:
+ frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
snprintf(name, PROXY_MAXFILE, "%s/%s/%d/####", dir,
- seq->strip->stripdata->name,
- render_size);
- } else {
- frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
-
- snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
- render_size);
+ seq->strip->stripdata->name, context.preview_render_size);
+ break;
+ default:
+ frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
+ snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir,
+ context.preview_render_size);
}
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, G.main->name);
BLI_path_frame(name, frameno, 0);
-
strcat(name, ".jpg");
return TRUE;
}
-static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, int render_size)
+static struct ImBuf * seq_proxy_fetch(SeqRenderData context, Sequence * seq, int cfra)
{
char name[PROXY_MAXFILE];
if (!(seq->flag & SEQ_USE_PROXY)) {
- return 0;
+ return NULL;
}
/* rendering at 100% ? No real sense in proxy-ing, right? */
- if (render_size == 100) {
- return 0;
+ if (context.preview_render_size == 100) {
+ return NULL;
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
- int frameno = (int) give_stripelem_index(seq, cfra)
- + seq->anim_startofs;
- if (!seq->strip->proxy->anim) {
- if (!seq_proxy_get_fname(
- scene, seq, cfra, name, render_size)) {
- return 0;
+ int frameno = (int) give_stripelem_index(seq, cfra) + seq->anim_startofs;
+ if (seq->strip->proxy->anim == NULL) {
+ if (seq_proxy_get_fname(context, seq, cfra, name)==0) {
+ return NULL;
}
seq->strip->proxy->anim = openanim(name, IB_rect);
}
- if (!seq->strip->proxy->anim) {
- return 0;
+ if (seq->strip->proxy->anim==NULL) {
+ return NULL;
}
return IMB_anim_absolute(seq->strip->proxy->anim, frameno);
}
- if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) {
- return 0;
+ if (seq_proxy_get_fname(context, seq, cfra, name) == 0) {
+ return NULL;
}
if (BLI_exists(name)) {
return IMB_loadiffname(name, IB_rect);
} else {
- return 0;
+ return NULL;
}
}
#if 0
static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra,
- int build_proxy_run, int render_size);
+ int build_proxy_run, int preview_render_size);
-static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int render_size, int seqrectx, int seqrecty)
+static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int preview_render_size, int seqrectx, int seqrecty)
{
char name[PROXY_MAXFILE];
int quality;
@@ -1140,7 +1227,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
}
/* rendering at 100% ? No real sense in proxy-ing, right? */
- if (render_size == 100) {
+ if (preview_render_size == 100) {
return;
}
@@ -1149,7 +1236,7 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
return;
}
- if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) {
+ if (!seq_proxy_get_fname(scene, seq, cfra, name, preview_render_size)) {
return;
}
@@ -1163,15 +1250,15 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int re
se->ibuf = 0;
}
- do_build_seq_ibuf(scene, seq, se, cfra, TRUE, render_size,
+ do_build_seq_ibuf(scene, seq, se, cfra, TRUE, preview_render_size,
seqrectx, seqrecty);
if (!se->ibuf) {
return;
}
- rectx= (render_size*scene->r.xsch)/100;
- recty= (render_size*scene->r.ysch)/100;
+ rectx= (preview_render_size*scene->r.xsch)/100;
+ recty= (preview_render_size*scene->r.ysch)/100;
ibuf = se->ibuf;
@@ -1380,8 +1467,7 @@ static void color_balance_byte_float(Sequence * seq, ImBuf* ibuf, float mul)
cb = calc_cb(seq->strip->color_balance);
for (c = 0; c < 3; c++) {
- make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c],
- cb_tab[c], mul);
+ make_cb_table_float(cb.lift[c], cb.gain[c], cb.gamma[c], cb_tab[c], mul);
}
for (i = 0; i < 256; i++) {
@@ -1444,17 +1530,12 @@ static void color_balance(Sequence * seq, ImBuf* ibuf, float mul)
*/
int input_have_to_preprocess(
- Scene *scene, Sequence * seq, float cfra, int seqrectx, int seqrecty)
+ SeqRenderData UNUSED(context), Sequence * seq, float UNUSED(cfra))
{
float mul;
- if ((seq->flag & SEQ_FILTERY) ||
- (seq->flag & SEQ_USE_CROP) ||
- (seq->flag & SEQ_USE_TRANSFORM) ||
- (seq->flag & SEQ_FLIPX) ||
- (seq->flag & SEQ_FLIPY) ||
- (seq->flag & SEQ_USE_COLOR_BALANCE) ||
- (seq->flag & SEQ_MAKE_PREMUL)) {
+ if (seq->flag & (SEQ_FILTERY|SEQ_USE_CROP|SEQ_USE_TRANSFORM|SEQ_FLIPX|
+ SEQ_FLIPY|SEQ_USE_COLOR_BALANCE|SEQ_MAKE_PREMUL)) {
return TRUE;
}
@@ -1476,26 +1557,19 @@ int input_have_to_preprocess(
}
static ImBuf * input_preprocess(
- Scene *scene, Sequence *seq, float cfra, int seqrectx, int seqrecty,
- ImBuf * ibuf)
+ SeqRenderData context, Sequence *seq, float UNUSED(cfra), ImBuf * ibuf)
{
float mul;
- seq->strip->orx= ibuf->x;
- seq->strip->ory= ibuf->y;
-
if((seq->flag & SEQ_FILTERY) && seq->type != SEQ_MOVIE) {
IMB_filtery(ibuf);
}
- if(seq->flag & SEQ_USE_CROP || seq->flag & SEQ_USE_TRANSFORM) {
- StripCrop c;
- StripTransform t;
+ if(seq->flag & (SEQ_USE_CROP|SEQ_USE_TRANSFORM)) {
+ StripCrop c= {0};
+ StripTransform t= {0};
int sx,sy,dx,dy;
- memset(&c, 0, sizeof(StripCrop));
- memset(&t, 0, sizeof(StripTransform));
-
if(seq->flag & SEQ_USE_CROP && seq->strip->crop) {
c = *seq->strip->crop;
}
@@ -1509,27 +1583,17 @@ static ImBuf * input_preprocess(
dy = sy;
if (seq->flag & SEQ_USE_TRANSFORM) {
- dx = scene->r.xsch;
- dy = scene->r.ysch;
+ dx = context.scene->r.xsch;
+ dy = context.scene->r.ysch;
}
- if (c.top + c.bottom >= ibuf->y ||
- c.left + c.right >= ibuf->x ||
- t.xofs >= dx || t.yofs >= dy) {
+ if (c.top + c.bottom >= ibuf->y || c.left + c.right >= ibuf->x ||
+ t.xofs >= dx || t.yofs >= dy) {
make_black_ibuf(ibuf);
} else {
- ImBuf * i;
+ ImBuf * i = IMB_allocImBuf(dx, dy,32, ibuf->rect_float ? IB_rectfloat : IB_rect);
- if (ibuf->rect_float) {
- i = IMB_allocImBuf(dx, dy,32, IB_rectfloat, 0);
- } else {
- i = IMB_allocImBuf(dx, dy,32, IB_rect, 0);
- }
-
- IMB_rectcpy(i, ibuf,
- t.xofs, t.yofs,
- c.left, c.bottom,
- sx, sy);
+ IMB_rectcpy(i, ibuf, t.xofs, t.yofs, c.left, c.bottom, sx, sy);
IMB_freeImBuf(ibuf);
@@ -1548,7 +1612,7 @@ static ImBuf * input_preprocess(
if(seq->sat != 1.0f) {
/* inline for now, could become an imbuf function */
int i;
- char *rct= (char *)ibuf->rect;
+ unsigned char *rct= (unsigned char *)ibuf->rect;
float *rctf= ibuf->rect_float;
const float sat= seq->sat;
float hsv[3];
@@ -1596,38 +1660,35 @@ static ImBuf * input_preprocess(
}
if(seq->flag & SEQ_MAKE_PREMUL) {
- if(ibuf->depth == 32 && ibuf->zbuf == 0) {
+ if(ibuf->depth == 32 && ibuf->zbuf == NULL) {
IMB_premultiply_alpha(ibuf);
}
}
- if(ibuf->x != seqrectx || ibuf->y != seqrecty ) {
- if(scene->r.mode & R_OSA) {
- IMB_scaleImBuf(ibuf,
- (short)seqrectx, (short)seqrecty);
+ if(ibuf->x != context.rectx || ibuf->y != context.recty ) {
+ if(context.scene->r.mode & R_OSA) {
+ IMB_scaleImBuf(ibuf, (short)context.rectx, (short)context.recty);
} else {
- IMB_scalefastImBuf(ibuf,
- (short)seqrectx, (short)seqrecty);
+ IMB_scalefastImBuf(ibuf, (short)context.rectx, (short)context.recty);
}
}
return ibuf;
}
-static ImBuf * copy_from_ibuf_still(Sequence * seq, float nr,
- int seqrectx, int seqrecty)
+static ImBuf * copy_from_ibuf_still(SeqRenderData context, Sequence * seq,
+ float nr)
{
- ImBuf * rval = 0;
- ImBuf * ibuf = 0;
+ ImBuf * rval = NULL;
+ ImBuf * ibuf = NULL;
if (nr == 0) {
ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, seq->start,
+ context, seq, seq->start,
SEQ_STRIPELEM_IBUF_STARTSTILL);
- }
- if (nr == seq->len - 1) {
+ } else if (nr == seq->len - 1) {
ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, seq->start,
+ context, seq, seq->start,
SEQ_STRIPELEM_IBUF_ENDSTILL);
}
@@ -1639,18 +1700,19 @@ static ImBuf * copy_from_ibuf_still(Sequence * seq, float nr,
return rval;
}
-static void copy_to_ibuf_still(Sequence * seq, float nr,
+static void copy_to_ibuf_still(SeqRenderData context, Sequence * seq, float nr,
ImBuf * ibuf)
{
if (nr == 0) {
seq_stripelem_cache_put(
- seq, 0, 0, seq->start,
- SEQ_STRIPELEM_IBUF_STARTSTILL, ibuf);
- }
+ context, seq, seq->start,
+ SEQ_STRIPELEM_IBUF_STARTSTILL, IMB_dupImBuf(ibuf));
+ }
+
if (nr == seq->len - 1) {
seq_stripelem_cache_put(
- seq, 0, 0, seq->start,
- SEQ_STRIPELEM_IBUF_ENDSTILL, ibuf);
+ context, seq, seq->start,
+ SEQ_STRIPELEM_IBUF_ENDSTILL, IMB_dupImBuf(ibuf));
}
}
@@ -1658,45 +1720,46 @@ static void copy_to_ibuf_still(Sequence * seq, float nr,
strip rendering functions
********************************************************************** */
-static ImBuf* seq_render_strip_stack(
- Main *bmain, Scene *scene,
- ListBase *seqbasep, float cfra, int chanshown, int render_size,
- int seqrectx, int seqrecty);
+static ImBuf* seq_render_strip_stack(
+ SeqRenderData context, ListBase *seqbasep, float cfra, int chanshown);
-static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
- int render_size,
- int seqrectx, int seqrecty);
+static ImBuf * seq_render_strip(
+ SeqRenderData context, Sequence * seq, float cfra);
static ImBuf* seq_render_effect_strip_impl(
- Main *bmain, Scene *scene, float cfra, Sequence *seq, int render_size,
- int seqrectx, int seqrecty)
+ SeqRenderData context, Sequence *seq, float cfra)
{
float fac, facf;
int early_out;
int i;
- int must_preprocess = FALSE;
-
struct SeqEffectHandle sh = get_sequence_effect(seq);
FCurve *fcu= NULL;
ImBuf * ibuf[3];
- ImBuf * out = 0;
+ Sequence *input[3];
+ ImBuf * out = NULL;
+
+ ibuf[0] = ibuf[1] = ibuf[2] = NULL;
- ibuf[0] = ibuf[1] = ibuf[2] = 0;
+ input[0] = seq->seq1; input[1] = seq->seq2; input[2] = seq->seq3;
if (!sh.execute) { /* effect not supported in this version... */
- goto finish;
+ out = IMB_allocImBuf((short)context.rectx,
+ (short)context.recty, 32, IB_rect);
+ return out;
}
- if ((seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) != 0) {
+ if (seq->flag & SEQ_USE_EFFECT_DEFAULT_FADE) {
sh.get_default_fac(seq, cfra, &fac, &facf);
- if( scene->r.mode & R_FIELDS ); else facf= fac;
- } else {
- fcu = id_data_find_fcurve(&scene->id, seq, &RNA_Sequence,
- "effect_fader", 0);
+
+ if ((context.scene->r.mode & R_FIELDS)==0)
+ facf= fac;
+ }
+ else {
+ fcu = id_data_find_fcurve(&context.scene->id, seq, &RNA_Sequence, "effect_fader", 0);
if (fcu) {
fac = facf = evaluate_fcurve(fcu, cfra);
- if( scene->r.mode & R_FIELDS ) {
+ if( context.scene->r.mode & R_FIELDS ) {
facf = evaluate_fcurve(fcu, cfra + 0.5);
}
} else {
@@ -1706,88 +1769,57 @@ static ImBuf* seq_render_effect_strip_impl(
early_out = sh.early_out(seq, fac, facf);
- if (early_out == -1) { /* no input needed */
- out = sh.execute(bmain, scene, seq, cfra, fac, facf,
- seqrectx, seqrecty, render_size,
- 0, 0, 0);
- goto finish;
- }
-
-
- must_preprocess = input_have_to_preprocess(
- scene, seq, cfra, seqrectx, seqrecty);
-
switch (early_out) {
- case 0:
+ case EARLY_NO_INPUT:
+ out = sh.execute(context, seq, cfra, fac, facf,
+ NULL, NULL, NULL);
break;
- case 1:
- if (seq->seq1) {
- ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
- render_size,
- seqrectx, seqrecty);
+ case EARLY_DO_EFFECT:
+ for(i=0; i<3; i++) {
+ if(input[i])
+ ibuf[i] = seq_render_strip(
+ context, input[i], cfra);
+ }
+
+ if (ibuf[0] && ibuf[1]) {
+ out = sh.execute(context, seq, cfra, fac, facf,
+ ibuf[0], ibuf[1], ibuf[2]);
+ }
+ break;
+ case EARLY_USE_INPUT_1:
+ if (input[0]) {
+ ibuf[0] = seq_render_strip(context, input[0], cfra);
}
if (ibuf[0]) {
- if (must_preprocess) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(ibuf[0]);
} else {
out = ibuf[0];
IMB_refImBuf(out);
}
}
- goto finish;
- case 2:
- if (seq->seq2) {
- ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
- render_size,
- seqrectx, seqrecty);
+ break;
+ case EARLY_USE_INPUT_2:
+ if (input[1]) {
+ ibuf[1] = seq_render_strip(context, input[1], cfra);
}
if (ibuf[1]) {
- if (must_preprocess) {
+ if (input_have_to_preprocess(context, seq, cfra)) {
out = IMB_dupImBuf(ibuf[1]);
} else {
out = ibuf[1];
IMB_refImBuf(out);
}
}
- goto finish;
- default:
- goto finish;
- }
-
- if (seq->seq1) {
- ibuf[0] = seq_render_strip(bmain, scene, seq->seq1, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (seq->seq2) {
- ibuf[1] = seq_render_strip(bmain, scene, seq->seq2, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (seq->seq3) {
- ibuf[2] = seq_render_strip(bmain, scene, seq->seq3, cfra,
- render_size,
- seqrectx, seqrecty);
- }
-
- if (!ibuf[0] || !ibuf[1]) {
- goto finish;
+ break;
}
- out = sh.execute(bmain, scene, seq, cfra, fac, facf, seqrectx, seqrecty,
- render_size,
- ibuf[0], ibuf[1], ibuf[2]);
-
-finish:
for (i = 0; i < 3; i++) {
IMB_freeImBuf(ibuf[i]);
}
- if (!out) {
- out = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
+ if (out == NULL) {
+ out = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
}
return out;
@@ -1795,15 +1827,16 @@ finish:
static ImBuf * seq_render_scene_strip_impl(
- Main *bmain, Scene * scene, Sequence * seq, float nr, int seqrectx, int seqrecty)
+ SeqRenderData context, Sequence * seq, float nr)
{
- ImBuf * ibuf = 0;
+ ImBuf * ibuf = NULL;
float frame= seq->sfra + nr + seq->anim_startofs;
float oldcfra;
Object *oldcamera;
ListBase oldmarkers;
- /* Hack! This function can be called from do_render_seq(), in that case
+ /* Old info:
+ Hack! This function can be called from do_render_seq(), in that case
the seq->scene can already have a Render initialized with same name,
so we have to use a default name. (compositor uses scene name to
find render).
@@ -1815,9 +1848,27 @@ static ImBuf * seq_render_scene_strip_impl(
and since G.rendering is uhm, gone... (Peter)
*/
+ /* New info:
+ Using the same name for the renders works just fine as the do_render_seq()
+ render is not used while the scene strips are rendered.
+
+ However rendering from UI (through sequencer_preview_area_draw) can crash in
+ very many cases since other renders (material preview, an actual render etc.)
+ can be started while this sequence preview render is running. The only proper
+ solution is to make the sequencer preview render a proper job, which can be
+ stopped when needed. This would also give a nice progress bar for the preview
+ space so that users know there's something happening.
+
+ As a result the active scene now only uses OpenGL rendering for the sequencer
+ preview. This is far from nice, but is the only way to prevent crashes at this
+ time.
+
+ -jahka
+ */
+
int rendering = G.rendering;
int doseq;
- int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : (scene->r.seq_flag & R_SEQ_GL_PREV);
+ int doseq_gl= G.rendering ? /*(scene->r.seq_flag & R_SEQ_GL_REND)*/ 0 : /*(scene->r.seq_flag & R_SEQ_GL_PREV)*/ 1;
int have_seq= FALSE;
Scene *sce= seq->scene; /* dont refer to seq->scene above this point!, it can be NULL */
int sce_valid= FALSE;
@@ -1834,8 +1885,8 @@ static ImBuf * seq_render_scene_strip_impl(
oldcamera= seq->scene->camera;
/* prevent eternal loop */
- doseq= scene->r.scemode & R_DOSEQ;
- scene->r.scemode &= ~R_DOSEQ;
+ doseq= context.scene->r.scemode & R_DOSEQ;
+ context.scene->r.scemode &= ~R_DOSEQ;
seq->scene->r.cfra= frame;
if(seq->scene_camera)
@@ -1849,27 +1900,34 @@ static ImBuf * seq_render_scene_strip_impl(
seq->scene->markers.first= seq->scene->markers.last= NULL;
#endif
- if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == scene || have_seq==0) && seq->scene->camera) {
+ if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == context.scene || have_seq==0) && seq->scene->camera) {
+ /* for old scened this can be uninitialized, should probably be added to do_versions at some point if the functionality stays */
+ if(context.scene->r.seq_prev_type==0)
+ context.scene->r.seq_prev_type = 3 /* ==OB_SOLID */;
+
/* opengl offscreen render */
- scene_update_for_newframe(bmain, seq->scene, seq->scene->lay);
- ibuf= sequencer_view3d_cb(seq->scene, seqrectx, seqrecty, IB_rect,
- scene->r.seq_prev_type);
+ scene_update_for_newframe(context.bmain, seq->scene, seq->scene->lay);
+ ibuf= sequencer_view3d_cb(seq->scene, context.rectx, context.recty, IB_rect, context.scene->r.seq_prev_type);
}
else {
- Render *re;
+ Render *re = RE_GetRender(sce->id.name);
RenderResult rres;
-
- if(rendering)
- re= RE_NewRender(" do_build_seq_ibuf");
- else
- re= RE_NewRender(sce->id.name);
-
- RE_BlenderFrame(re, bmain, sce, NULL, sce->lay, frame);
+
+ /* XXX: this if can be removed when sequence preview rendering uses the job system */
+ if(rendering || context.scene != sce) {
+ if(re==NULL)
+ re= RE_NewRender(sce->id.name);
+
+ RE_BlenderFrame(re, context.bmain, sce, NULL, sce->lay, frame, FALSE);
+
+ /* restore previous state after it was toggled on & off by RE_BlenderFrame */
+ G.rendering = rendering;
+ }
RE_AcquireResultImage(re, &rres);
if(rres.rectf) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rectfloat);
memcpy(ibuf->rect_float, rres.rectf, 4*sizeof(float)*rres.rectx*rres.recty);
if(rres.rectz) {
addzbuffloatImBuf(ibuf);
@@ -1881,7 +1939,7 @@ static ImBuf * seq_render_scene_strip_impl(
IMB_convert_profile(ibuf, IB_PROFILE_SRGB);
}
else if (rres.rect32) {
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0);
+ ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect);
memcpy(ibuf->rect, rres.rect32, 4*rres.rectx*rres.recty);
}
@@ -1891,10 +1949,12 @@ static ImBuf * seq_render_scene_strip_impl(
}
/* restore */
- scene->r.scemode |= doseq;
+ context.scene->r.scemode |= doseq;
seq->scene->r.cfra = oldcfra;
seq->scene->camera= oldcamera;
+ if(frame != oldcfra)
+ scene_update_for_newframe(context.bmain, seq->scene, seq->scene->lay);
#ifdef DURIAN_CAMERA_SWITCH
/* stooping to new low's in hackyness :( */
@@ -1904,186 +1964,152 @@ static ImBuf * seq_render_scene_strip_impl(
return ibuf;
}
-static ImBuf * seq_render_strip(Main *bmain, Scene *scene, Sequence * seq, float cfra,
- int render_size,
- int seqrectx, int seqrecty)
+static ImBuf * seq_render_strip(SeqRenderData context, Sequence * seq, float cfra)
{
+ ImBuf * ibuf = NULL;
char name[FILE_MAXDIR+FILE_MAXFILE];
- int use_preprocess = input_have_to_preprocess(
- scene, seq, cfra, seqrectx, seqrecty);
- ImBuf * ibuf = seq_stripelem_cache_get(
- seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF);
+ int use_preprocess = input_have_to_preprocess(context, seq, cfra);
float nr = give_stripelem_index(seq, cfra);
+ /* all effects are handled similarly with the exception of speed effect */
+ int type = (seq->type & SEQ_EFFECT && seq->type != SEQ_SPEED) ? SEQ_EFFECT : seq->type;
- /* currently, we cache preprocessed images */
- if (ibuf) {
+ ibuf = seq_stripelem_cache_get(context, seq, cfra, SEQ_STRIPELEM_IBUF);
+
+ /* currently, we cache preprocessed images in SEQ_STRIPELEM_IBUF,
+ but not(!) on SEQ_STRIPELEM_IBUF_ENDSTILL and ..._STARTSTILL */
+ if (ibuf)
use_preprocess = FALSE;
- }
- if(seq->type == SEQ_META) {
- ImBuf * meta_ibuf = 0;
+ if (ibuf == NULL)
+ ibuf = copy_from_ibuf_still(context, seq, nr);
+
+ if (ibuf == NULL)
+ ibuf = seq_proxy_fetch(context, seq, cfra);
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ if(ibuf == NULL) switch(type) {
+ case SEQ_META:
+ {
+ ImBuf * meta_ibuf = NULL;
- if(!ibuf && seq->seqbase.first) {
- meta_ibuf = seq_render_strip_stack(
- bmain, scene,
- &seq->seqbase, seq->start + nr, 0,
- render_size, seqrectx, seqrecty);
- }
+ if(seq->seqbase.first)
+ meta_ibuf = seq_render_strip_stack(
+ context, &seq->seqbase,
+ seq->start + nr, 0);
- if(!ibuf && meta_ibuf) {
- ibuf = meta_ibuf;
- if(ibuf && use_preprocess) {
- struct ImBuf * i = IMB_dupImBuf(ibuf);
+ if(meta_ibuf) {
+ ibuf = meta_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- ibuf = i;
+ ibuf = i;
+ }
}
+ break;
}
- } else if(seq->type == SEQ_SPEED) {
- ImBuf * child_ibuf = 0;
-
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ case SEQ_SPEED:
+ {
+ ImBuf * child_ibuf = NULL;
- if (ibuf == 0) {
float f_cfra;
- SpeedControlVars * s
- = (SpeedControlVars *)seq->effectdata;
+ SpeedControlVars * s = (SpeedControlVars *)seq->effectdata;
- sequence_effect_speed_rebuild_map(scene, seq, 0);
+ sequence_effect_speed_rebuild_map(context.scene,seq, 0);
/* weeek! */
f_cfra = seq->start + s->frameMap[(int) nr];
- child_ibuf = seq_render_strip(bmain, scene, seq->seq1, f_cfra,
- render_size,
- seqrectx, seqrecty);
- }
+ child_ibuf = seq_render_strip(context,seq->seq1,f_cfra);
- if (!ibuf && child_ibuf) {
- ibuf = child_ibuf;
- if(ibuf && use_preprocess) {
- struct ImBuf * i = IMB_dupImBuf(ibuf);
+ if (child_ibuf) {
+ ibuf = child_ibuf;
+ if(ibuf && use_preprocess) {
+ struct ImBuf * i = IMB_dupImBuf(ibuf);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- ibuf = i;
+ ibuf = i;
+ }
}
+ break;
}
- } else if(seq->type & SEQ_EFFECT) {
- /* should the effect be recalculated? */
-
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
-
- if(ibuf == 0) {
- ibuf = seq_render_effect_strip_impl(
- bmain, scene, cfra, seq, render_size,
- seqrectx, seqrecty);
+ case SEQ_EFFECT:
+ {
+ ibuf = seq_render_effect_strip_impl(context, seq, cfra);
+ break;
}
- } else if(seq->type == SEQ_IMAGE) {
- StripElem * s_elem = give_stripelem(seq, cfra);
-
- if(ibuf == 0 && s_elem) {
- BLI_join_dirfile(name, seq->strip->dir, s_elem->name);
- BLI_path_abs(name, G.sce);
+ case SEQ_IMAGE:
+ {
+ StripElem * s_elem = give_stripelem(seq, cfra);
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
+ if (s_elem) {
+ BLI_join_dirfile(name, sizeof(name), seq->strip->dir, s_elem->name);
+ BLI_path_abs(name, G.main->name);
+ }
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq,nr,seqrectx,seqrecty);
- }
+ if (s_elem && (ibuf = IMB_loadiffname(name, IB_rect))) {
+ /* we don't need both (speed reasons)! */
+ if (ibuf->rect_float && ibuf->rect)
+ imb_freerectImBuf(ibuf);
- if (ibuf == 0 && s_elem &&
- (ibuf = IMB_loadiffname(name, IB_rect))) {
- /* we don't need both (speed reasons)! */
- if (ibuf->rect_float && ibuf->rect)
- imb_freerectImBuf(ibuf);
+ /* all sequencer color is done in SRGB space, linear gives odd crossfades */
+ if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
+ IMB_convert_profile(ibuf, IB_PROFILE_NONE);
- /* all sequencer color is done in SRGB space, linear gives odd crossfades */
- if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
- IMB_convert_profile(ibuf, IB_PROFILE_NONE);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
- copy_to_ibuf_still(seq, nr, ibuf);
- }
- } else if(seq->type == SEQ_MOVIE) {
- if(ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
-
- }
-
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ s_elem->orig_width = ibuf->x;
+ s_elem->orig_height = ibuf->y;
+ }
+ break;
}
-
- if (ibuf == 0) {
- if(seq->anim==0) {
- BLI_join_dirfile(name,
- seq->strip->dir,
- seq->strip->stripdata->name);
- BLI_path_abs(name, G.sce);
+ case SEQ_MOVIE:
+ {
+ if(seq->anim==NULL) {
+ BLI_join_dirfile(name, sizeof(name), seq->strip->dir, seq->strip->stripdata->name);
+ BLI_path_abs(name, G.main->name);
- seq->anim = openanim(
- name, IB_rect |
- ((seq->flag & SEQ_FILTERY)
- ? IB_animdeinterlace : 0));
+ seq->anim = openanim(name, IB_rect |
+ ((seq->flag & SEQ_FILTERY) ? IB_animdeinterlace : 0));
}
+
if(seq->anim) {
- IMB_anim_set_preseek(seq->anim,
- seq->anim_preseek);
- ibuf = IMB_anim_absolute(seq->anim,
- nr
- + seq->anim_startofs);
+ IMB_anim_set_preseek(seq->anim, seq->anim_preseek);
+ ibuf = IMB_anim_absolute(seq->anim, nr + seq->anim_startofs);
/* we don't need both (speed reasons)! */
- if (ibuf && ibuf->rect_float
- && ibuf->rect) {
+ if (ibuf && ibuf->rect_float && ibuf->rect)
imb_freerectImBuf(ibuf);
+ if (ibuf) {
+ seq->strip->stripdata->orig_width = ibuf->x;
+ seq->strip->stripdata->orig_height = ibuf->y;
}
-
}
- copy_to_ibuf_still(seq, nr, ibuf);
- }
-
- } else if(seq->type == SEQ_SCENE) { // scene can be NULL after deletions
- if (ibuf == 0) {
- ibuf = seq_proxy_fetch(scene, seq, cfra, render_size);
- }
- if (ibuf == 0) {
- ibuf = copy_from_ibuf_still(seq, nr,seqrectx,seqrecty);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
+ break;
}
-
- if (ibuf == 0) {
- ibuf = seq_render_scene_strip_impl(bmain, scene, seq, nr,
- seqrectx, seqrecty);
+ case SEQ_SCENE:
+ { // scene can be NULL after deletions
+ ibuf = seq_render_scene_strip_impl(context, seq, nr);
+
+ /* Scene strips update all animation, so we need to restore original state.*/
+ BKE_animsys_evaluate_all_animation(context.bmain, cfra);
- copy_to_ibuf_still(seq, nr, ibuf);
+ copy_to_ibuf_still(context, seq, nr, ibuf);
+ break;
}
}
- if (!ibuf) {
- ibuf = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
- }
+ if (ibuf == NULL)
+ ibuf = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
- if (ibuf->x != seqrectx || ibuf->y != seqrecty) {
+ if (ibuf->x != context.rectx || ibuf->y != context.recty)
use_preprocess = TRUE;
- }
- if (use_preprocess) {
- ibuf = input_preprocess(scene, seq, cfra, seqrectx,
- seqrecty, ibuf);
- }
+ if (use_preprocess)
+ ibuf = input_preprocess(context, seq, cfra, ibuf);
- seq_stripelem_cache_put(
- seq, seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF, ibuf);
+ seq_stripelem_cache_put(context, seq, cfra, SEQ_STRIPELEM_IBUF, ibuf);
return ibuf;
}
@@ -2099,9 +2125,7 @@ static int seq_must_swap_input_in_blend_mode(Sequence * seq)
/* bad hack, to fix crazy input ordering of
those two effects */
- if (seq->blend_mode == SEQ_ALPHAOVER ||
- seq->blend_mode == SEQ_ALPHAUNDER ||
- seq->blend_mode == SEQ_OVERDROP) {
+ if (ELEM3(seq->blend_mode, SEQ_ALPHAOVER, SEQ_ALPHAUNDER, SEQ_OVERDROP)) {
swap_input = TRUE;
}
@@ -2114,34 +2138,32 @@ static int seq_get_early_out_for_blend_mode(Sequence * seq)
float facf = seq->blend_opacity / 100.0;
int early_out = sh.early_out(seq, facf, facf);
- if (early_out < 1) {
+ if (ELEM(early_out, EARLY_DO_EFFECT, EARLY_NO_INPUT)) {
return early_out;
}
if (seq_must_swap_input_in_blend_mode(seq)) {
- if (early_out == 2) {
- return 1;
- } else if (early_out == 1) {
- return 2;
+ if (early_out == EARLY_USE_INPUT_2) {
+ return EARLY_USE_INPUT_1;
+ } else if (early_out == EARLY_USE_INPUT_1) {
+ return EARLY_USE_INPUT_2;
}
}
return early_out;
}
static ImBuf* seq_render_strip_stack(
- Main *bmain, Scene *scene, ListBase *seqbasep, float cfra, int chanshown,
- int render_size, int seqrectx, int seqrecty)
+ SeqRenderData context, ListBase *seqbasep, float cfra, int chanshown)
{
Sequence* seq_arr[MAXSEQ+1];
int count;
int i;
- ImBuf* out = 0;
+ ImBuf* out = NULL;
- count = get_shown_sequences(seqbasep, cfra, chanshown,
- (Sequence **)&seq_arr);
+ count = get_shown_sequences(seqbasep, cfra, chanshown, (Sequence **)&seq_arr);
- if (!count) {
- return 0;
+ if (count == 0) {
+ return NULL;
}
#if 0 /* commentind since this breaks keyframing, since it resets the value on draw */
@@ -2152,22 +2174,17 @@ static ImBuf* seq_render_strip_stack(
}
#endif
- out = seq_stripelem_cache_get(
- seq_arr[count - 1],
- seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
+ out = seq_stripelem_cache_get(context, seq_arr[count - 1],
+ cfra, SEQ_STRIPELEM_IBUF_COMP);
if (out) {
return out;
}
if(count == 1) {
- out = seq_render_strip(bmain, scene, seq_arr[0],
- cfra, render_size,
- seqrectx, seqrecty);
- seq_stripelem_cache_put(
- seq_arr[0],
- seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ out = seq_render_strip(context, seq_arr[0], cfra);
+ seq_stripelem_cache_put(context, seq_arr[0], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
return out;
}
@@ -2175,43 +2192,34 @@ static ImBuf* seq_render_strip_stack(
for (i = count - 1; i >= 0; i--) {
int early_out;
- Sequence * seq = seq_arr[i];
+ Sequence *seq = seq_arr[i];
out = seq_stripelem_cache_get(
- seq,
- seqrectx, seqrecty, cfra, SEQ_STRIPELEM_IBUF_COMP);
+ context, seq, cfra, SEQ_STRIPELEM_IBUF_COMP);
if (out) {
break;
}
if (seq->blend_mode == SEQ_BLEND_REPLACE) {
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ out = seq_render_strip(context, seq, cfra);
break;
}
early_out = seq_get_early_out_for_blend_mode(seq);
switch (early_out) {
- case -1:
- case 2:
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ case EARLY_NO_INPUT:
+ case EARLY_USE_INPUT_2:
+ out = seq_render_strip(context, seq, cfra);
break;
- case 1:
+ case EARLY_USE_INPUT_1:
if (i == 0) {
- out = IMB_allocImBuf(
- (short)seqrectx, (short)seqrecty,
- 32, IB_rect, 0);
+ out = IMB_allocImBuf((short)context.rectx, (short)context.recty, 32, IB_rect);
}
break;
- case 0:
+ case EARLY_DO_EFFECT:
if (i == 0) {
- out = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ out = seq_render_strip(context, seq, cfra);
}
break;
@@ -2221,9 +2229,8 @@ static ImBuf* seq_render_strip_stack(
}
}
- seq_stripelem_cache_put(
- seq_arr[i], seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ seq_stripelem_cache_put(context, seq_arr[i], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
i++;
@@ -2231,37 +2238,30 @@ static ImBuf* seq_render_strip_stack(
for (; i < count; i++) {
Sequence * seq = seq_arr[i];
- if (seq_get_early_out_for_blend_mode(seq) == 0) {
+ if (seq_get_early_out_for_blend_mode(seq) == EARLY_DO_EFFECT) {
struct SeqEffectHandle sh = get_sequence_blend(seq);
ImBuf * ibuf1 = out;
- ImBuf * ibuf2 = seq_render_strip(bmain, scene, seq, cfra,
- render_size,
- seqrectx, seqrecty);
+ ImBuf * ibuf2 = seq_render_strip(context, seq, cfra);
float facf = seq->blend_opacity / 100.0;
- int swap_input
- = seq_must_swap_input_in_blend_mode(seq);
-
- int x= seqrectx;
- int y= seqrecty;
+ int swap_input = seq_must_swap_input_in_blend_mode(seq);
if (swap_input) {
- out = sh.execute(bmain, scene, seq, cfra,
- facf, facf, x, y, render_size,
- ibuf2, ibuf1, 0);
+ out = sh.execute(context, seq, cfra,
+ facf, facf,
+ ibuf2, ibuf1, NULL);
} else {
- out = sh.execute(bmain, scene, seq, cfra,
- facf, facf, x, y, render_size,
- ibuf1, ibuf2, 0);
+ out = sh.execute(context, seq, cfra,
+ facf, facf,
+ ibuf1, ibuf2, NULL);
}
IMB_freeImBuf(ibuf1);
IMB_freeImBuf(ibuf2);
}
- seq_stripelem_cache_put(
- seq_arr[i], seqrectx, seqrecty, cfra,
- SEQ_STRIPELEM_IBUF_COMP, out);
+ seq_stripelem_cache_put(context, seq_arr[i], cfra,
+ SEQ_STRIPELEM_IBUF_COMP, out);
}
return out;
@@ -2272,9 +2272,9 @@ static ImBuf* seq_render_strip_stack(
* you have to free after usage!
*/
-ImBuf *give_ibuf_seq(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq(SeqRenderData context, float cfra, int chanshown)
{
- Editing *ed= seq_give_editing(scene, FALSE);
+ Editing *ed= seq_give_editing(context.scene, FALSE);
int count;
ListBase *seqbasep;
@@ -2288,19 +2288,18 @@ ImBuf *give_ibuf_seq(Main *bmain, Scene *scene, int rectx, int recty, int cfra,
seqbasep= ed->seqbasep;
}
- return seq_render_strip_stack(
- bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
+ return seq_render_strip_stack(context, seqbasep, cfra, chanshown);
}
-ImBuf *give_ibuf_seqbase(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size, ListBase *seqbasep)
+ImBuf *give_ibuf_seqbase(SeqRenderData context, float cfra, int chanshown, ListBase *seqbasep)
{
- return seq_render_strip_stack(bmain, scene, seqbasep, cfra, chanshown, render_size, rectx, recty);
+ return seq_render_strip_stack(context, seqbasep, cfra, chanshown);
}
-ImBuf *give_ibuf_seq_direct(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq)
+ImBuf *give_ibuf_seq_direct(SeqRenderData context, float cfra, Sequence *seq)
{
- return seq_render_strip(bmain, scene, seq, cfra, render_size, rectx, recty);
+ return seq_render_strip(context, seq, cfra);
}
#if 0
@@ -2350,9 +2349,9 @@ typedef struct PrefetchQueueElem {
int rectx;
int recty;
- int cfra;
+ float cfra;
int chanshown;
- int render_size;
+ int preview_render_size;
int monoton_cfra;
@@ -2400,7 +2399,7 @@ static void *seq_prefetch_thread(void * This_)
if (e->cfra >= s_last) {
e->ibuf = give_ibuf_seq_impl(This->scene,
e->rectx, e->recty, e->cfra, e->chanshown,
- e->render_size);
+ e->preview_render_size);
}
pthread_mutex_lock(&queue_lock);
@@ -2510,8 +2509,7 @@ static void seq_stop_threads()
}
#endif
-void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
- int render_size)
+void give_ibuf_prefetch_request(SeqRenderData context, float cfra, int chanshown)
{
PrefetchQueueElem *e;
if (seq_thread_shutdown) {
@@ -2519,11 +2517,11 @@ void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown,
}
e = MEM_callocN(sizeof(PrefetchQueueElem), "prefetch_queue_elem");
- e->rectx = rectx;
- e->recty = recty;
+ e->rectx = context.rectx;
+ e->recty = context.recty;
e->cfra = cfra;
e->chanshown = chanshown;
- e->render_size = render_size;
+ e->preview_render_size = context.preview_render_size;
e->monoton_cfra = monoton_cfra++;
pthread_mutex_lock(&queue_lock);
@@ -2566,13 +2564,13 @@ static void seq_wait_for_prefetch_ready()
}
#endif
-ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size)
+ImBuf *give_ibuf_seq_threaded(SeqRenderData context, float cfra, int chanshown)
{
PrefetchQueueElem *e = NULL;
int found_something = FALSE;
if (seq_thread_shutdown) {
- return give_ibuf_seq(bmain, scene, rectx, recty, cfra, chanshown, render_size);
+ return give_ibuf_seq(context, cfra, chanshown);
}
while (!e) {
@@ -2582,9 +2580,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
for (e = prefetch_done.first; e; e = e->next) {
if (cfra == e->cfra &&
chanshown == e->chanshown &&
- rectx == e->rectx &&
- recty == e->recty &&
- render_size == e->render_size) {
+ context.rectx == e->rectx &&
+ context.recty == e->recty &&
+ context.preview_render_size == e->preview_render_size) {
success = TRUE;
found_something = TRUE;
break;
@@ -2595,9 +2593,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
for (e = prefetch_wait.first; e; e = e->next) {
if (cfra == e->cfra &&
chanshown == e->chanshown &&
- rectx == e->rectx &&
- recty == e->recty &&
- render_size == e->render_size) {
+ context.rectx == e->rectx &&
+ context.recty == e->recty &&
+ context.preview_render_size == e->preview_render_size) {
found_something = TRUE;
break;
}
@@ -2612,9 +2610,9 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
if (tslot->current &&
cfra == tslot->current->cfra &&
chanshown == tslot->current->chanshown &&
- rectx == tslot->current->rectx &&
- recty == tslot->current->recty &&
- render_size== tslot->current->render_size){
+ context.rectx == tslot->current->rectx &&
+ context.recty == tslot->current->recty &&
+ context.preview_render_size== tslot->current->preview_render_size){
found_something = TRUE;
break;
}
@@ -2644,7 +2642,7 @@ ImBuf *give_ibuf_seq_threaded(Main *bmain, Scene *scene, int rectx, int recty, i
}
}
- return e ? e->ibuf : 0;
+ return e ? e->ibuf : NULL;
}
/* Functions to free imbuf and anim data on changes */
@@ -2653,7 +2651,7 @@ static void free_anim_seq(Sequence *seq)
{
if(seq->anim) {
IMB_free_anim(seq->anim);
- seq->anim = 0;
+ seq->anim = NULL;
}
}
@@ -2697,8 +2695,7 @@ void free_imbuf_seq(Scene *scene, ListBase * seqbase, int check_mem_usage,
}
}
if(seq->type==SEQ_META) {
- free_imbuf_seq(scene, &seq->seqbase, FALSE,
- keep_file_handles);
+ free_imbuf_seq(scene, &seq->seqbase, FALSE, keep_file_handles);
}
if(seq->type==SEQ_SCENE) {
/* FIXME: recurs downwards,
@@ -2822,11 +2819,7 @@ void seq_tx_set_final_right(Sequence *seq, int val)
since they work a bit differently to normal image seq's (during transform) */
int seq_single_check(Sequence *seq)
{
- if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR
- || seq->type == SEQ_MULTICAM))
- return 1;
- else
- return 0;
+ return (seq->len==1 && ELEM3(seq->type, SEQ_IMAGE, SEQ_COLOR, SEQ_MULTICAM));
}
/* check if the selected seq's reference unselected seq's */
@@ -2848,17 +2841,20 @@ int seqbase_isolated_sel_check(ListBase *seqbase)
/* test relationships */
for(seq= seqbase->first; seq; seq= seq->next) {
+ if((seq->type & SEQ_EFFECT)==0)
+ continue;
+
if(seq->flag & SELECT) {
- if(seq->type & SEQ_EFFECT) {
- if(seq->seq1 && (seq->seq1->flag & SELECT)==0) return FALSE;
- if(seq->seq2 && (seq->seq2->flag & SELECT)==0) return FALSE;
- if(seq->seq3 && (seq->seq3->flag & SELECT)==0) return FALSE;
- }
+ if( (seq->seq1 && (seq->seq1->flag & SELECT)==0) ||
+ (seq->seq2 && (seq->seq2->flag & SELECT)==0) ||
+ (seq->seq3 && (seq->seq3->flag & SELECT)==0) )
+ return FALSE;
}
- else if(seq->type & SEQ_EFFECT) {
- if(seq->seq1 && (seq->seq1->flag & SELECT)) return FALSE;
- if(seq->seq2 && (seq->seq2->flag & SELECT)) return FALSE;
- if(seq->seq3 && (seq->seq3->flag & SELECT)) return FALSE;
+ else {
+ if( (seq->seq1 && (seq->seq1->flag & SELECT)) ||
+ (seq->seq2 && (seq->seq2->flag & SELECT)) ||
+ (seq->seq3 && (seq->seq3->flag & SELECT)) )
+ return FALSE;
}
}
@@ -2935,12 +2931,8 @@ int seq_tx_test(Sequence * seq)
static int seq_overlap(Sequence *seq1, Sequence *seq2)
{
- if(seq1 != seq2)
- if(seq1->machine==seq2->machine)
- if(((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp))==0)
- return 1;
-
- return 0;
+ return (seq1 != seq2 && seq1->machine == seq2->machine &&
+ ((seq1->enddisp <= seq2->startdisp) || (seq1->startdisp >= seq2->enddisp))==0);
}
int seq_test_overlap(ListBase * seqbasep, Sequence *test)
@@ -2958,7 +2950,7 @@ int seq_test_overlap(ListBase * seqbasep, Sequence *test)
}
-static void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
+void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
{
seq_offset_animdata(evil_scene, seq, delta);
seq->start += delta;
@@ -2973,6 +2965,28 @@ static void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
calc_sequence_disp(evil_scene, seq);
}
+Sequence *seq_foreground_frame_get(Scene *scene, int frame)
+{
+ Editing *ed= seq_give_editing(scene, FALSE);
+ Sequence *seq, *best_seq=NULL;
+ int best_machine = -1;
+
+ if(!ed) return NULL;
+
+ for (seq=ed->seqbasep->first; seq; seq= seq->next) {
+ if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame)
+ continue;
+ /* only use elements you can see - not */
+ if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) {
+ if (seq->machine > best_machine) {
+ best_seq = seq;
+ best_machine = seq->machine;
+ }
+ }
+ }
+ return best_seq;
+}
+
/* return 0 if there werent enough space */
int shuffle_seq(ListBase * seqbasep, Sequence *test, Scene *evil_scene)
{
@@ -3107,7 +3121,7 @@ static void seq_update_muting_recursive(Scene *scene, ListBase *seqbasep, Sequen
seq_update_muting_recursive(scene, &seq->seqbase, metaseq, seqmute);
}
- else if((seq->type == SEQ_SOUND) || (seq->type == SEQ_SCENE)) {
+ else if(ELEM(seq->type, SEQ_SOUND, SEQ_SCENE)) {
if(seq->scene_sound) {
sound_mute_scene_sound(scene, seq->scene_sound, seqmute);
}
@@ -3210,7 +3224,7 @@ void seq_offset_animdata(Scene *scene, Sequence *seq, int ofs)
for (fcu= scene->adt->action->curves.first; fcu; fcu= fcu->next) {
if(strstr(fcu->rna_path, "sequence_editor.sequences_all[") && strstr(fcu->rna_path, str)) {
- int i;
+ unsigned int i;
for (i = 0; i < fcu->totvert; i++) {
BezTriple *bezt= &fcu->bezt[i];
bezt->vec[0][0] += ofs;
@@ -3247,7 +3261,7 @@ void seq_dupe_animdata(Scene *scene, char *name_from, char *name_to)
BKE_animdata_fix_paths_rename(&scene->id, scene->adt, "sequence_editor.sequences_all", name_from, name_to, 0, 0, 0);
/* add the original fcurves back */
- addlisttolist(&scene->adt->action->curves, &lb);
+ BLI_movelisttolist(&scene->adt->action->curves, &lb);
}
/* XXX - hackish function needed to remove all fcurves belonging to a sequencer strip */
@@ -3385,6 +3399,7 @@ Sequence *alloc_sequence(ListBase *lb, int cfra, int machine)
seq->mul= 1.0;
seq->blend_opacity = 100.0;
seq->volume = 1.0f;
+ seq->scene_sound = NULL;
return seq;
}
@@ -3395,7 +3410,6 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
Scene *scene= CTX_data_scene(C); /* only for active seq */
Sequence *seq;
Strip *strip;
- StripElem *se;
seq = alloc_sequence(seqbasep, seq_load->start_frame, seq_load->channel);
seq->type= SEQ_IMAGE;
@@ -3406,7 +3420,7 @@ Sequence *sequencer_add_image_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
strip->len = seq->len = seq_load->len ? seq_load->len : 1;
strip->us= 1;
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
BLI_strncpy(strip->dir, seq_load->path, sizeof(strip->dir));
seq_load_apply(scene, seq, seq_load);
@@ -3476,14 +3490,14 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
Scene *scene= CTX_data_scene(C); /* only for sound */
char path[sizeof(seq_load->path)];
- Sequence *seq, *soundseq; /* generic strip vars */
+ Sequence *seq; /* generic strip vars */
Strip *strip;
StripElem *se;
struct anim *an;
BLI_strncpy(path, seq_load->path, sizeof(path));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
an = openanim(path, IB_rect);
@@ -3515,7 +3529,7 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
int start_frame_back= seq_load->start_frame;
seq_load->channel++;
- soundseq = sequencer_add_sound_strip(C, seqbasep, seq_load);
+ sequencer_add_sound_strip(C, seqbasep, seq_load);
seq_load->start_frame= start_frame_back;
seq_load->channel--;
@@ -3531,8 +3545,9 @@ Sequence *sequencer_add_movie_strip(bContext *C, ListBase *seqbasep, SeqLoadInfo
}
-static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
+static Sequence *seq_dupli(struct Scene *scene, struct Scene *scene_to, Sequence *seq, int dupe_flag)
{
+ Scene *sce_audio= scene_to ? scene_to : scene;
Sequence *seqn = MEM_dupallocN(seq);
seq->tmp = seqn;
@@ -3550,6 +3565,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
if (seq->strip->proxy) {
seqn->strip->proxy = MEM_dupallocN(seq->strip->proxy);
+ seqn->strip->proxy->anim = NULL;
}
if (seq->strip->color_balance) {
@@ -3558,24 +3574,24 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
}
if(seq->type==SEQ_META) {
- seqn->strip->stripdata = 0;
+ seqn->strip->stripdata = NULL;
- seqn->seqbase.first= seqn->seqbase.last= 0;
+ seqn->seqbase.first= seqn->seqbase.last= NULL;
/* WATCH OUT!!! - This metastrip is not recursively duplicated here - do this after!!! */
/* - seq_dupli_recursive(&seq->seqbase,&seqn->seqbase);*/
} else if(seq->type == SEQ_SCENE) {
- seqn->strip->stripdata = 0;
+ seqn->strip->stripdata = NULL;
if(seq->scene_sound)
- seqn->scene_sound = sound_scene_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ seqn->scene_sound = sound_scene_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
} else if(seq->type == SEQ_MOVIE) {
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
- seqn->anim= 0;
+ seqn->anim= NULL;
} else if(seq->type == SEQ_SOUND) {
seqn->strip->stripdata =
MEM_dupallocN(seq->strip->stripdata);
if(seq->scene_sound)
- seqn->scene_sound = sound_add_scene_sound(scene, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ seqn->scene_sound = sound_add_scene_sound(sce_audio, seqn, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
seqn->sound->id.us++;
} else if(seq->type == SEQ_IMAGE) {
@@ -3593,7 +3609,7 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
sh.copy(seq, seqn);
}
- seqn->strip->stripdata = 0;
+ seqn->strip->stripdata = NULL;
} else {
fprintf(stderr, "Aiiiiekkk! sequence type not "
@@ -3610,13 +3626,13 @@ static Sequence *seq_dupli(struct Scene *scene, Sequence *seq, int dupe_flag)
return seqn;
}
-Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_flag)
+Sequence * seq_dupli_recursive(struct Scene *scene, struct Scene *scene_to, Sequence * seq, int dupe_flag)
{
- Sequence * seqn = seq_dupli(scene, seq, dupe_flag);
+ Sequence * seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
if (seq->type == SEQ_META) {
Sequence *s;
for(s= seq->seqbase.first; s; s = s->next) {
- Sequence *n = seq_dupli_recursive(scene, s, dupe_flag);
+ Sequence *n = seq_dupli_recursive(scene, scene_to, s, dupe_flag);
if (n) {
BLI_addtail(&seqn->seqbase, n);
}
@@ -3625,16 +3641,16 @@ Sequence * seq_dupli_recursive(struct Scene *scene, Sequence * seq, int dupe_fla
return seqn;
}
-void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
+void seqbase_dupli_recursive(Scene *scene, Scene *scene_to, ListBase *nseqbase, ListBase *seqbase, int dupe_flag)
{
Sequence *seq;
- Sequence *seqn = 0;
+ Sequence *seqn = NULL;
Sequence *last_seq = seq_active_get(scene);
for(seq= seqbase->first; seq; seq= seq->next) {
seq->tmp= NULL;
if((seq->flag & SELECT) || (dupe_flag & SEQ_DUPE_ALL)) {
- seqn = seq_dupli(scene, seq, dupe_flag);
+ seqn = seq_dupli(scene, scene_to, seq, dupe_flag);
if (seqn) { /*should never fail */
if(dupe_flag & SEQ_DUPE_CONTEXT) {
seq->flag &= ~SEQ_ALLSEL;
@@ -3643,7 +3659,7 @@ void seqbase_dupli_recursive(Scene *scene, ListBase *nseqbase, ListBase *seqbase
BLI_addtail(nseqbase, seqn);
if(seq->type==SEQ_META)
- seqbase_dupli_recursive(scene, &seqn->seqbase, &seq->seqbase, dupe_flag);
+ seqbase_dupli_recursive(scene, scene_to, &seqn->seqbase, &seq->seqbase, dupe_flag);
if(dupe_flag & SEQ_DUPE_CONTEXT) {
if (seq == last_seq) {
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 454a82c2ad3..5311f3a9c38 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -1,5 +1,5 @@
-/**
- * shrinkwrap.c
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -22,7 +22,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): André Pinto
+ * Contributor(s): Andr Pinto
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -41,25 +41,21 @@
#include "DNA_scene_types.h"
#include "DNA_windowmanager_types.h"
+#include "BLI_editVert.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_shrinkwrap.h"
#include "BKE_DerivedMesh.h"
#include "BKE_lattice.h"
-#include "BKE_utildefines.h"
+
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_subsurf.h"
#include "BKE_mesh.h"
#include "BKE_tessmesh.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-
-
-
/* Util macros */
-#define TO_STR(a) #a
-#define JOIN(a,b) a##b
-
#define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n"))
/* Benchmark macros */
@@ -90,20 +86,18 @@ typedef void ( *Shrinkwrap_ForeachVertexCallback) (DerivedMesh *target, float *c
/* get derived mesh */
//TODO is anyfunction that does this? returning the derivedFinal witouth we caring if its in edit mode or not?
-DerivedMesh *object_get_derived_final(struct Scene *scene, Object *ob, CustomDataMask dataMask)
+DerivedMesh *object_get_derived_final(Object *ob)
{
Mesh *me= ob->data;
BMEditMesh *em = me->edit_btmesh;
if (em)
{
- DerivedMesh *final = NULL;
- editbmesh_get_derived_cage_and_final(scene, ob, em, &final, dataMask);
-
- return final;
+ DerivedMesh *dm = em->derivedFinal;
+ return dm;
}
- else
- return mesh_get_derived_final(scene, ob, dataMask);
+
+ return ob->derivedFinal;
}
/* Space transform */
@@ -111,7 +105,7 @@ void space_transform_from_matrixs(SpaceTransform *data, float local[4][4], float
{
float itarget[4][4];
invert_m4_m4(itarget, target);
- mul_serie_m4(data->local2target, itarget, local, 0, 0, 0, 0, 0, 0);
+ mul_serie_m4(data->local2target, itarget, local, NULL, NULL, NULL, NULL, NULL, NULL);
invert_m4_m4(data->target2local, data->local2target);
}
@@ -264,22 +258,26 @@ int normal_projection_project_vertex(char options, const float *vert, const floa
BLI_bvhtree_ray_cast(tree, co, no, 0.0f, &hit_tmp, callback, userdata);
- if(hit_tmp.index != -1)
- {
- float dot = INPR( dir, hit_tmp.no);
-
- if(((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f)
- || ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f))
- return FALSE; //Ignore hit
-
+ if(hit_tmp.index != -1) {
+ /* invert the normal first so face culling works on rotated objects */
+ if(transf) {
+ space_transform_invert_normal(transf, hit_tmp.no);
+ }
- //Inverting space transform (TODO make coeherent with the initial dist readjust)
- if(transf)
- {
- space_transform_invert( transf, hit_tmp.co );
- space_transform_invert_normal( transf, hit_tmp.no );
+ if (options & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) {
+ /* apply backface */
+ const float dot= dot_v3v3(dir, hit_tmp.no);
+ if( ((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) ||
+ ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f)
+ ) {
+ return FALSE; /* Ignore hit */
+ }
+ }
- hit_tmp.dist = len_v3v3( (float*)vert, hit_tmp.co );
+ if(transf) {
+ /* Inverting space transform (TODO make coeherent with the initial dist readjust) */
+ space_transform_invert(transf, hit_tmp.co);
+ hit_tmp.dist = len_v3v3((float *)vert, hit_tmp.co);
}
memcpy(hit, &hit_tmp, sizeof(hit_tmp) );
@@ -289,7 +287,7 @@ int normal_projection_project_vertex(char options, const float *vert, const floa
}
-static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct Scene *scene)
+static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
{
int i;
@@ -334,12 +332,14 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S
if(calc->smd->auxTarget)
{
- auxMesh = object_get_derived_final(scene, calc->smd->auxTarget, CD_MASK_BAREMESH);
+ auxMesh = object_get_derived_final(calc->smd->auxTarget);
+ if(!auxMesh)
+ return;
space_transform_setup( &local2aux, calc->ob, calc->smd->auxTarget);
}
//After sucessufuly build the trees, start projection vertexs
- if( bvhtree_from_mesh_faces(&treeData, calc->target, calc->keepDist, 4, 6)
+ if( bvhtree_from_mesh_faces(&treeData, calc->target, 0.0, 4, 6)
&& (auxMesh == NULL || bvhtree_from_mesh_faces(&auxData, auxMesh, 0.0, 4, 6)))
{
@@ -388,10 +388,10 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S
}
//Project over negative direction of axis
- if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR)
+ if(use_normal & MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR && hit.index == -1)
{
- float inv_no[3] = { -tmp_no[0], -tmp_no[1], -tmp_no[2] };
-
+ float inv_no[3];
+ negate_v3_v3(inv_no, tmp_no);
if(auxData.tree)
normal_projection_project_vertex(0, tmp_co, inv_no, &local2aux, auxData.tree, &hit, auxData.raycast_callback, &auxData);
@@ -402,6 +402,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, struct S
if(hit.index != -1)
{
+ madd_v3_v3v3fl(hit.co, hit.co, tmp_no, calc->keepDist);
interp_v3_v3v3(co, co, hit.co, weight);
}
}
@@ -500,7 +501,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
}
/* Main shrinkwrap function */
-void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
{
DerivedMesh *ss_mesh = NULL;
@@ -531,7 +532,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
if(smd->target)
{
- calc.target = object_get_derived_final(scene, smd->target, CD_MASK_BAREMESH);
+ calc.target = object_get_derived_final(smd->target);
//TODO there might be several "bugs" on non-uniform scales matrixs
//because it will no longer be nearest surface, not sphere projection
@@ -555,8 +556,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
//Using vertexs positions/normals as if a subsurface was applied
if(smd->subsurfLevels)
{
- SubsurfModifierData ssmd;
- memset(&ssmd, 0, sizeof(ssmd));
+ SubsurfModifierData ssmd= {{0}};
ssmd.subdivType = ME_CC_SUBSURF; //catmull clark
ssmd.levels = smd->subsurfLevels; //levels
@@ -589,7 +589,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Scene *scene, Object
break;
case MOD_SHRINKWRAP_PROJECT:
- BENCH(shrinkwrap_calc_normal_projection(&calc, scene));
+ BENCH(shrinkwrap_calc_normal_projection(&calc));
break;
case MOD_SHRINKWRAP_NEAREST_VERTEX:
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
index 7e39cdd1196..8917d2946bd 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -31,9 +31,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_sketch.h"
-#include "BKE_utildefines.h"
+
#include "DNA_userdef_types.h"
@@ -53,7 +54,7 @@ void freeSketch(SK_Sketch *sketch)
MEM_freeN(sketch);
}
-SK_Sketch* createSketch()
+SK_Sketch* createSketch(void)
{
SK_Sketch *sketch;
@@ -101,7 +102,7 @@ void sk_freeStroke(SK_Stroke *stk)
MEM_freeN(stk);
}
-SK_Stroke* sk_createStroke()
+SK_Stroke* sk_createStroke(void)
{
SK_Stroke *stk;
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index c6993e933c2..b2f8831cced 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -1,4 +1,4 @@
-/**
+/*
* smoke.c
*
* $Id$
@@ -48,6 +48,7 @@
#include "BLI_edgehash.h"
#include "BLI_kdtree.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_bvhutils.h"
#include "BKE_cdderivedmesh.h"
@@ -58,7 +59,7 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_smoke.h"
-#include "BKE_utildefines.h"
+
#include "DNA_customdata_types.h"
#include "DNA_group_types.h"
@@ -94,7 +95,7 @@ static void tend ( void )
{
QueryPerformanceCounter ( &liCurrentTime );
}
-static double tval()
+static double tval( void )
{
return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart ));
}
@@ -110,6 +111,8 @@ static void tend ( void )
{
gettimeofday ( &_tend,&tz );
}
+
+#if 0 // unused
static double tval()
{
double t1, t2;
@@ -118,6 +121,7 @@ static double tval()
return t2-t1;
}
#endif
+#endif
struct Object;
struct Scene;
@@ -131,7 +135,7 @@ static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs)
#define TRI_UVOFFSET (1./4.)
-int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm)
+static int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm)
{
if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid)
{
@@ -177,7 +181,7 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
if(size[0] > size[1])
{
- if(size[0] > size[1])
+ if(size[0] > size[2])
{
scale = res / size[0];
smd->domain->dx = size[0] / res;
@@ -187,11 +191,11 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
}
else
{
- scale = res / size[1];
- smd->domain->dx = size[1] / res;
- smd->domain->res[1] = res;
+ scale = res / size[2];
+ smd->domain->dx = size[2] / res;
+ smd->domain->res[2] = res;
smd->domain->res[0] = (int)(size[0] * scale + 0.5);
- smd->domain->res[2] = (int)(size[2] * scale + 0.5);
+ smd->domain->res[1] = (int)(size[1] * scale + 0.5);
}
}
else
@@ -435,7 +439,7 @@ static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs)
}
/*! init triangle divisions */
-void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len)
+void calcTriangleDivs(Object *ob, MVert *verts, int UNUSED(numverts), MFace *faces, int numfaces, int numtris, int **tridivs, float cell_len)
{
// mTriangleDivs1.resize( faces.size() );
// mTriangleDivs2.resize( faces.size() );
@@ -554,8 +558,6 @@ static void smokeModifier_freeDomain(SmokeModifierData *smd)
BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
smd->domain->point_cache[0] = NULL;
- BKE_ptcache_free_list(&(smd->domain->ptcaches[1]));
- smd->domain->point_cache[1] = NULL;
MEM_freeN(smd->domain);
smd->domain = NULL;
@@ -629,9 +631,6 @@ void smokeModifier_reset(struct SmokeModifierData *smd)
smd->domain->fluid = NULL;
}
- smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
- smd->domain->point_cache[1]->flag |= PTCACHE_OUTDATED;
-
smokeModifier_reset_turbulence(smd);
smd->time = -1;
@@ -698,10 +697,9 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->domain->point_cache[0]->flag |= PTCACHE_DISK_CACHE;
smd->domain->point_cache[0]->step = 1;
- smd->domain->point_cache[1] = BKE_ptcache_add(&(smd->domain->ptcaches[1]));
- smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE;
- smd->domain->point_cache[1]->step = 1;
-
+ /* Deprecated */
+ smd->domain->point_cache[1] = NULL;
+ smd->domain->ptcaches[1].first = smd->domain->ptcaches[1].last = NULL;
/* set some standard values */
smd->domain->fluid = NULL;
smd->domain->wt = NULL;
@@ -779,6 +777,9 @@ void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData
tsmd->domain->viewsettings = smd->domain->viewsettings;
tsmd->domain->fluid_group = smd->domain->fluid_group;
tsmd->domain->coll_group = smd->domain->coll_group;
+ tsmd->domain->vorticity = smd->domain->vorticity;
+ tsmd->domain->time_scale = smd->domain->time_scale;
+ tsmd->domain->border_collisions = smd->domain->border_collisions;
MEM_freeN(tsmd->domain->effector_weights);
tsmd->domain->effector_weights = MEM_dupallocN(smd->domain->effector_weights);
@@ -787,6 +788,8 @@ void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData
tsmd->flow->temp = smd->flow->temp;
tsmd->flow->psys = smd->flow->psys;
tsmd->flow->type = smd->flow->type;
+ tsmd->flow->flags = smd->flow->flags;
+ tsmd->flow->vel_multi = smd->flow->vel_multi;
} else if (tsmd->coll) {
;
/* leave it as initialised, collision settings is mostly caches */
@@ -800,20 +803,25 @@ static float calc_voxel_transp(float *result, float *input, int res[3], int *pix
static int get_lamp(Scene *scene, float *light)
{
Base *base_tmp = NULL;
- for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next)
- {
- if(base_tmp->object->type == OB_LAMP)
- {
- Lamp *la = (Lamp *)base_tmp->object->data;
-
- if(la->type == LA_LOCAL)
- {
- VECCOPY(light, base_tmp->object->obmat[3]);
- return 1;
- }
- }
- }
- return 0;
+ int found_lamp = 0;
+
+ // try to find a lamp, preferably local
+ for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next) {
+ if(base_tmp->object->type == OB_LAMP) {
+ Lamp *la = base_tmp->object->data;
+
+ if(la->type == LA_LOCAL) {
+ copy_v3_v3(light, base_tmp->object->obmat[3]);
+ return 1;
+ }
+ else if(!found_lamp) {
+ copy_v3_v3(light, base_tmp->object->obmat[3]);
+ found_lamp = 1;
+ }
+ }
+ }
+
+ return found_lamp;
}
static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
@@ -822,9 +830,109 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
GroupObject *go = NULL;
Base *base = NULL;
+ // do collisions, needs to be done before emission, so that smoke isn't emitted inside collision cells
+ if(1)
+ {
+ Object *otherobj = NULL;
+ ModifierData *md = NULL;
+
+ if(sds->coll_group) // we use groups since we have 2 domains
+ go = sds->coll_group->gobject.first;
+ else
+ base = scene->base.first;
+
+ while(base || go)
+ {
+ otherobj = NULL;
+ if(sds->coll_group)
+ {
+ if(go->ob)
+ otherobj = go->ob;
+ }
+ else
+ otherobj = base->object;
+ if(!otherobj)
+ {
+ if(sds->coll_group)
+ go = go->next;
+ else
+ base= base->next;
+ continue;
+ }
+ md = modifiers_findByType(otherobj, eModifierType_Smoke);
+
+ // check for active smoke modifier
+ if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
+ {
+ SmokeModifierData *smd2 = (SmokeModifierData *)md;
+
+ if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll && smd2->coll->points)
+ {
+ // we got nice collision object
+ SmokeCollSettings *scs = smd2->coll;
+ size_t i, j;
+ unsigned char *obstacles = smoke_get_obstacle(smd->domain->fluid);
+
+ for(i = 0; i < scs->numpoints; i++)
+ {
+ int badcell = 0;
+ size_t index = 0;
+ int cell[3];
+
+ // 1. get corresponding cell
+ get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, &scs->points[3 * i], cell, 0);
+
+ // check if cell is valid (in the domain boundary)
+ for(j = 0; j < 3; j++)
+ if((cell[j] > sds->res[j] - 1) || (cell[j] < 0))
+ {
+ badcell = 1;
+ break;
+ }
+
+ if(badcell)
+ continue;
+ // 2. set cell values (heat, density and velocity)
+ index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
+
+ // printf("cell[0]: %d, cell[1]: %d, cell[2]: %d\n", cell[0], cell[1], cell[2]);
+ // printf("res[0]: %d, res[1]: %d, res[2]: %d, index: %d\n\n", sds->res[0], sds->res[1], sds->res[2], index);
+ obstacles[index] = 1;
+ // for moving gobstacles
+ /*
+ const LbmFloat maxVelVal = 0.1666;
+ const LbmFloat maxusqr = maxVelVal*maxVelVal*3. *1.5;
+
+ LbmVec objvel = vec2L((mMOIVertices[n]-mMOIVerticesOld[n]) /dvec);
+ {
+ const LbmFloat usqr = (objvel[0]*objvel[0]+objvel[1]*objvel[1]+objvel[2]*objvel[2])*1.5;
+ USQRMAXCHECK(usqr, objvel[0],objvel[1],objvel[2], mMaxVlen, mMxvx,mMxvy,mMxvz);
+ if(usqr>maxusqr) {
+ // cutoff at maxVelVal
+ for(int jj=0; jj<3; jj++) {
+ if(objvel[jj]>0.) objvel[jj] = maxVelVal;
+ if(objvel[jj]<0.) objvel[jj] = -maxVelVal;
+ }
+ }
+ }
+ const LbmFloat dp=dot(objvel, vec2L((*pNormals)[n]) );
+ const LbmVec oldov=objvel; // debug
+ objvel = vec2L((*pNormals)[n]) *dp;
+ */
+ }
+ }
+ }
+
+ if(sds->coll_group)
+ go = go->next;
+ else
+ base= base->next;
+ }
+ }
+
// do flows and fluids
if(1)
- {
+ {
Object *otherobj = NULL;
ModifierData *md = NULL;
if(sds->fluid_group) // we use groups since we have 2 domains
@@ -866,9 +974,8 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
if(sfs && sfs->psys && sfs->psys->part && sfs->psys->part->type==PART_EMITTER) // is particle system selected
{
+ ParticleSimulationData sim;
ParticleSystem *psys = sfs->psys;
- ParticleSettings *part=psys->part;
- ParticleData *pa = NULL;
int p = 0;
float *density = smoke_get_density(sds->fluid);
float *bigdensity = smoke_turbulence_get_density(sds->wt);
@@ -888,6 +995,10 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
*/
float *temp_emission_map = NULL;
+ sim.scene = scene;
+ sim.ob = otherobj;
+ sim.psys = psys;
+
// initialize temp emission map
if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW))
{
@@ -900,19 +1011,26 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
}
// mostly copied from particle code
- for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
- {
- int cell[3];
- size_t i = 0;
- size_t index = 0;
- int badcell = 0;
- if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0) continue;
- else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0) continue;
- else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue;
+ for(p=0; p<psys->totpart; p++)
+ {
+ int cell[3];
+ size_t i = 0;
+ size_t index = 0;
+ int badcell = 0;
+ ParticleKey state;
+
+ if(psys->particles[p].flag & (PARS_NO_DISP|PARS_UNEXIST))
+ continue;
+
+ state.time = smd->time;
+
+ if(psys_get_particle_state(&sim, p, &state, 0) == 0)
+ continue;
+
// VECCOPY(pos, pa->state.co);
// mul_m4_v3(ob->imat, pos);
// 1. get corresponding cell
- get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, pa->state.co, cell, 0);
+ get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, state.co, cell, 0);
// check if cell is valid (in the domain boundary)
for(i = 0; i < 3; i++)
{
@@ -926,7 +1044,7 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
continue;
// 2. set cell values (heat, density and velocity)
index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
- if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) && !(obstacle[index] & 2)) // this is inflow
+ if(!(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) && !(obstacle[index])) // this is inflow
{
// heat[index] += sfs->temp * 0.1;
// density[index] += sfs->density * 0.1;
@@ -938,9 +1056,9 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
// Uses particle velocity as initial velocity for smoke
if(sfs->flags & MOD_SMOKE_FLOW_INITVELOCITY && (psys->part->phystype != PART_PHYS_NO))
{
- velocity_x[index] = pa->state.vel[0]*sfs->vel_multi;
- velocity_y[index] = pa->state.vel[1]*sfs->vel_multi;
- velocity_z[index] = pa->state.vel[2]*sfs->vel_multi;
+ velocity_x[index] = state.vel[0]*sfs->vel_multi;
+ velocity_y[index] = state.vel[1]*sfs->vel_multi;
+ velocity_z[index] = state.vel[2]*sfs->vel_multi;
}
}
else if(sfs->type & MOD_SMOKE_FLOW_TYPE_OUTFLOW) // outflow
@@ -1165,107 +1283,8 @@ static void smoke_calc_domain(Scene *scene, Object *ob, SmokeModifierData *smd)
pdEndEffectors(&effectors);
}
- // do collisions
- if(1)
- {
- Object *otherobj = NULL;
- ModifierData *md = NULL;
-
- if(sds->coll_group) // we use groups since we have 2 domains
- go = sds->coll_group->gobject.first;
- else
- base = scene->base.first;
-
- while(base || go)
- {
- otherobj = NULL;
- if(sds->coll_group)
- {
- if(go->ob)
- otherobj = go->ob;
- }
- else
- otherobj = base->object;
- if(!otherobj)
- {
- if(sds->coll_group)
- go = go->next;
- else
- base= base->next;
- continue;
- }
- md = modifiers_findByType(otherobj, eModifierType_Smoke);
-
- // check for active smoke modifier
- if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))
- {
- SmokeModifierData *smd2 = (SmokeModifierData *)md;
-
- if((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll && smd2->coll->points)
- {
- // we got nice collision object
- SmokeCollSettings *scs = smd2->coll;
- size_t i, j;
- unsigned char *obstacles = smoke_get_obstacle(smd->domain->fluid);
-
- for(i = 0; i < scs->numpoints; i++)
- {
- int badcell = 0;
- size_t index = 0;
- int cell[3];
-
- // 1. get corresponding cell
- get_cell(smd->domain->p0, smd->domain->res, smd->domain->dx, &scs->points[3 * i], cell, 0);
-
- // check if cell is valid (in the domain boundary)
- for(j = 0; j < 3; j++)
- if((cell[j] > sds->res[j] - 1) || (cell[j] < 0))
- {
- badcell = 1;
- break;
- }
-
- if(badcell)
- continue;
- // 2. set cell values (heat, density and velocity)
- index = smoke_get_index(cell[0], sds->res[0], cell[1], sds->res[1], cell[2]);
-
- // printf("cell[0]: %d, cell[1]: %d, cell[2]: %d\n", cell[0], cell[1], cell[2]);
- // printf("res[0]: %d, res[1]: %d, res[2]: %d, index: %d\n\n", sds->res[0], sds->res[1], sds->res[2], index);
- obstacles[index] = 1;
- // for moving gobstacles
- /*
- const LbmFloat maxVelVal = 0.1666;
- const LbmFloat maxusqr = maxVelVal*maxVelVal*3. *1.5;
-
- LbmVec objvel = vec2L((mMOIVertices[n]-mMOIVerticesOld[n]) /dvec);
- {
- const LbmFloat usqr = (objvel[0]*objvel[0]+objvel[1]*objvel[1]+objvel[2]*objvel[2])*1.5;
- USQRMAXCHECK(usqr, objvel[0],objvel[1],objvel[2], mMaxVlen, mMxvx,mMxvy,mMxvz);
- if(usqr>maxusqr) {
- // cutoff at maxVelVal
- for(int jj=0; jj<3; jj++) {
- if(objvel[jj]>0.) objvel[jj] = maxVelVal;
- if(objvel[jj]<0.) objvel[jj] = -maxVelVal;
- }
- }
- }
- const LbmFloat dp=dot(objvel, vec2L((*pNormals)[n]) );
- const LbmVec oldov=objvel; // debug
- objvel = vec2L((*pNormals)[n]) *dp;
- */
- }
- }
- }
-
- if(sds->coll_group)
- go = go->next;
- else
- base= base->next;
- }
- }
}
-void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedMesh *dm)
{
if((smd->type & MOD_SMOKE_TYPE_FLOW))
{
@@ -1320,82 +1339,77 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
float light[3];
PointCache *cache = NULL;
PTCacheID pid;
- PointCache *cache_wt = NULL;
- PTCacheID pid_wt;
int startframe, endframe, framenr;
float timescale;
- int cache_result = 0, cache_result_wt = 0;
- int did_init = 0;
framenr = scene->r.cfra;
- printf("time: %d\n", scene->r.cfra);
+ //printf("time: %d\n", scene->r.cfra);
cache = sds->point_cache[0];
BKE_ptcache_id_from_smoke(&pid, ob, smd);
BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
- cache_wt = sds->point_cache[1];
- BKE_ptcache_id_from_smoke_turbulence(&pid_wt, ob, smd);
-
- if(!smd->domain->fluid)
+ if(!smd->domain->fluid || framenr == startframe)
{
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
- BKE_ptcache_id_reset(scene, &pid_wt, PTCACHE_RESET_OUTDATED);
+ BKE_ptcache_validate(cache, framenr);
+ cache->flag &= ~PTCACHE_REDO_NEEDED;
}
- if(framenr < startframe)
+ if(!smd->domain->fluid && (framenr != startframe) && (smd->domain->flags & MOD_SMOKE_FILE_LOAD)==0 && (cache->flag & PTCACHE_BAKED)==0)
return;
- if(framenr > endframe)
- return;
+ smd->domain->flags &= ~MOD_SMOKE_FILE_LOAD;
- if(!smd->domain->fluid && (framenr != startframe))
+ CLAMP(framenr, startframe, endframe);
+
+ /* If already viewing a pre/after frame, no need to reload */
+ if ((smd->time == framenr) && (framenr != scene->r.cfra))
return;
// printf("startframe: %d, framenr: %d\n", startframe, framenr);
- if(!(did_init = smokeModifier_init(smd, ob, scene, dm)))
+ if(smokeModifier_init(smd, ob, scene, dm)==0)
{
printf("bad smokeModifier_init\n");
return;
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, (float)framenr, scene->r.frs_sec);
- // printf("cache_result: %d\n", cache_result);
-
- if(cache_result == PTCACHE_READ_EXACT)
- {
+ if(BKE_ptcache_read(&pid, (float)framenr) == PTCACHE_READ_EXACT) {
BKE_ptcache_validate(cache, framenr);
-
- if(sds->wt)
- {
- cache_result_wt = BKE_ptcache_read_cache(&pid_wt, (float)framenr, scene->r.frs_sec);
-
- if(cache_result_wt == PTCACHE_READ_EXACT)
- {
- BKE_ptcache_validate(cache_wt, framenr);
-
- return;
- }
- else
- {
- ; /* don't return in the case we only got low res cache but no high res cache */
- /* we still need to calculate the high res cache */
- }
- }
- else
- return;
+ smd->time = framenr;
+ return;
}
+
+ /* only calculate something when we advanced a single frame */
+ if(framenr != (int)smd->time+1)
+ return;
- /* only calculate something when we advanced a frame */
- if(framenr == smd->time)
+ /* don't simulate if viewing start frame, but scene frame is not real start frame */
+ if (framenr != scene->r.cfra)
return;
tstart();
smoke_calc_domain(scene, ob, smd);
+
+ /* if on second frame, write cache for first frame */
+ if((int)smd->time == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) {
+ // create shadows straight after domain initialization so we get nice shadows for startframe, too
+ if(get_lamp(scene, light))
+ smoke_calc_transparency(sds->shadow, smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, calc_voxel_transp, -7.0*sds->dx);
+
+ if(sds->wt)
+ {
+ if(sds->flags & MOD_SMOKE_DISSOLVE)
+ smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ smoke_turbulence_step(sds->wt, sds->fluid);
+ }
+
+ BKE_ptcache_write(&pid, startframe);
+ }
// set new time
smd->time = scene->r.cfra;
@@ -1412,39 +1426,24 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
smoke_dissolve(sds->fluid, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
smoke_step(sds->fluid, smd->time, scene->r.frs_sec / scene->r.frs_sec_base);
}
- else
- {
- /* Smoke did not load cache and was not reset but we're on startframe */
- /* So now reinit the smoke since it was not done yet */
- if(did_init == 2)
- {
- smokeModifier_reset(smd);
- smokeModifier_init(smd, ob, scene, dm);
- }
- }
- // create shadows before writing cache so we get nice shadows for startframe, too
+ // create shadows before writing cache so they get stored
if(get_lamp(scene, light))
smoke_calc_transparency(sds->shadow, smoke_get_density(sds->fluid), sds->p0, sds->p1, sds->res, sds->dx, light, calc_voxel_transp, -7.0*sds->dx);
-
- BKE_ptcache_validate(cache, framenr);
- BKE_ptcache_write_cache(&pid, framenr);
if(sds->wt)
{
- if(framenr!=startframe)
- {
- if(sds->flags & MOD_SMOKE_DISSOLVE)
- smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
- smoke_turbulence_step(sds->wt, sds->fluid);
- }
-
- BKE_ptcache_validate(cache_wt, framenr);
- BKE_ptcache_write_cache(&pid_wt, framenr);
+ if(sds->flags & MOD_SMOKE_DISSOLVE)
+ smoke_dissolve_wavelet(sds->wt, sds->diss_speed, sds->flags & MOD_SMOKE_DISSOLVE_LOG);
+ smoke_turbulence_step(sds->wt, sds->fluid);
}
+
+ BKE_ptcache_validate(cache, framenr);
+ if(framenr != startframe)
+ BKE_ptcache_write(&pid, framenr);
tend();
- printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() );
+ //printf ( "Frame: %d, Time: %f\n", (int)smd->time, ( float ) tval() );
}
}
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index d9cb03be37f..d197541c620 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -63,6 +63,7 @@ variables on the UI for now
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_threads.h"
#include "BLI_cellalloc.h"
@@ -161,7 +162,7 @@ typedef struct SB_thread_context {
#define BFF_CLOSEVERT 2 /* collider vertex repulses face */
-float SoftHeunTol = 1.0f; /* humm .. this should be calculated from sb parameters and sizes */
+static float SoftHeunTol = 1.0f; /* humm .. this should be calculated from sb parameters and sizes */
/* local prototypes */
static void free_softbody_intern(SoftBody *sb);
@@ -172,7 +173,7 @@ static void Vec3PlusStVec(float *v, float s, float *v1);
/*physical unit of force is [kg * m / sec^2]*/
-static float sb_grav_force_scale(Object *ob)
+static float sb_grav_force_scale(Object *UNUSED(ob))
/* since unit of g is [m/sec^2] and F = mass * g we rescale unit mass of node to 1 gramm
put it to a function here, so we can add user options later without touching simulation code
*/
@@ -180,7 +181,7 @@ static float sb_grav_force_scale(Object *ob)
return (0.001f);
}
-static float sb_fric_force_scale(Object *ob)
+static float sb_fric_force_scale(Object *UNUSED(ob))
/* rescaling unit of drag [1 / sec] to somehow reasonable
put it to a function here, so we can add user options later without touching simulation code
*/
@@ -261,7 +262,7 @@ float operations still
/* just an ID here to reduce the prob for killing objects
** ob->sumohandle points to we should not kill :)
*/
-const int CCD_SAVETY = 190561;
+static const int CCD_SAVETY = 190561;
typedef struct ccdf_minmax{
float minx,miny,minz,maxx,maxy,maxz;
@@ -549,7 +550,7 @@ static void ccd_build_deflector_hash(Scene *scene, Object *vertexowner, GHash *h
}
/*+++ only with deflecting set */
- if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == 0) {
+ if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == NULL) {
DerivedMesh *dm= NULL;
if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */
@@ -679,7 +680,7 @@ static void add_mesh_quad_diag_springs(Object *ob)
}
}
-static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int addsprings)
+static void add_2nd_order_roller(Object *ob,float UNUSED(stiffness), int *counter, int addsprings)
{
/*assume we have a softbody*/
SoftBody *sb= ob->soft; /* is supposed to be there */
@@ -698,12 +699,12 @@ static void add_2nd_order_roller(Object *ob,float stiffness,int *counter, int ad
bs = sb->bspring + bp->springs[b-1];
/*nasty thing here that springs have two ends
so here we have to make sure we examine the other */
- if (( v0 == bs->v1) ){
+ if (v0 == bs->v1){
bpo =sb->bpoint+bs->v2;
notthis = bs->v2;
}
else {
- if (( v0 == bs->v2) ){
+ if (v0 == bs->v2){
bpo =sb->bpoint+bs->v1;
notthis = bs->v1;
}
@@ -1030,7 +1031,7 @@ static int query_external_colliders(Scene *scene, Object *me)
/* +++ the aabb "force" section*/
-static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+static int sb_detect_aabb_collisionCached( float UNUSED(force[3]), unsigned int UNUSED(par_layer),struct Object *vertexowner,float UNUSED(time))
{
Object *ob;
SoftBody *sb=vertexowner->soft;
@@ -1095,7 +1096,7 @@ static int sb_detect_aabb_collisionCached( float force[3], unsigned int par_laye
/* +++ the face external section*/
static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1193,7 +1194,7 @@ static int sb_detect_face_pointCached(float face_v1[3],float face_v2[3],float fa
static int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_v3[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1419,7 +1420,7 @@ static void scan_for_ext_face_forces(Object *ob,float timenow)
/* +++ the spring external section*/
static int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,float time)
+ float force[3], unsigned int UNUSED(par_layer),struct Object *vertexowner,float time)
{
Object *ob;
GHash *hash;
@@ -1647,9 +1648,7 @@ static void scan_for_ext_spring_forces(Scene *scene, Object *ob, float timenow)
ListBase *do_effector = NULL;
do_effector = pdInitEffectors(scene, ob, NULL, sb->effector_weights);
- if (sb){
- _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector);
- }
+ _scan_for_ext_spring_forces(scene, ob, timenow, 0, sb->totspring, do_effector);
pdEndEffectors(&do_effector);
}
@@ -1657,10 +1656,10 @@ static void *exec_scan_for_ext_spring_forces(void *data)
{
SB_thread_context *pctx = (SB_thread_context*)data;
_scan_for_ext_spring_forces(pctx->scene, pctx->ob, pctx->timenow, pctx->ifirst, pctx->ilast, pctx->do_effector);
- return 0;
+ return NULL;
}
-static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,int totsprings,int *ptr_to_break_func())
+static void sb_sfesf_threads_run(Scene *scene, struct Object *ob, float timenow,int totsprings,int *UNUSED(ptr_to_break_func(void)))
{
ListBase *do_effector = NULL;
ListBase threads;
@@ -1750,7 +1749,7 @@ static int choose_winner(float*w, float* pos,float*a,float*b,float*c,float*ca,fl
static int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *damp,
- float force[3], unsigned int par_layer,struct Object *vertexowner,
+ float force[3], unsigned int UNUSED(par_layer), struct Object *vertexowner,
float time,float vel[3], float *intrusion)
{
Object *ob= NULL;
@@ -2085,7 +2084,7 @@ static void dfdv_goal(int ia, int ic,float factor)
for(i=0;i<3;i++) nlMatrixAdd(ia+i,ic+i,factor);
}
*/
-static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float forcetime,int nl_flags)
+static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float UNUSED(forcetime), int nl_flags)
{
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bp1,*bp2;
@@ -2176,7 +2175,7 @@ static void sb_spring_force(Object *ob,int bpi,BodySpring *bs,float iks,float fo
/* since this is definitely the most CPU consuming task here .. try to spread it */
/* core function _softbody_calc_forces_slice_in_a_thread */
/* result is int to be able to flag user break */
-static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *ptr_to_break_func(),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static int _softbody_calc_forces_slice_in_a_thread(Scene *scene, Object *ob, float forcetime, float timenow,int ifirst,int ilast,int *UNUSED(ptr_to_break_func(void)),ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
float iks;
int bb,do_selfcollision,do_springcollision,do_aero;
@@ -2384,10 +2383,10 @@ static void *exec_softbody_calc_forces(void *data)
{
SB_thread_context *pctx = (SB_thread_context*)data;
_softbody_calc_forces_slice_in_a_thread(pctx->scene, pctx->ob, pctx->forcetime, pctx->timenow, pctx->ifirst, pctx->ilast, NULL, pctx->do_effector,pctx->do_deflector,pctx->fieldfactor,pctx->windfactor);
- return 0;
+ return NULL;
}
-static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float timenow,int totpoint,int *ptr_to_break_func(),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
+static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float timenow,int totpoint,int *UNUSED(ptr_to_break_func(void)),struct ListBase *do_effector,int do_deflector,float fieldfactor, float windfactor)
{
ListBase threads;
SB_thread_context *sb_threads;
@@ -2445,7 +2444,7 @@ static void sb_cf_threads_run(Scene *scene, Object *ob, float forcetime, float t
MEM_freeN(sb_threads);
}
-static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, float timenow, int nl_flags)
+static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, float timenow, int UNUSED(nl_flags))
{
/* rule we never alter free variables :bp->vec bp->pos in here !
* this will ruin adaptive stepsize AKA heun! (BM)
@@ -2453,7 +2452,8 @@ static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, fl
SoftBody *sb= ob->soft; /* is supposed to be there */
BodyPoint *bproot;
ListBase *do_effector = NULL;
- float iks, gravity;
+ float gravity;
+ /* float iks; */
float fieldfactor = -1.0f, windfactor = 0.25;
int do_deflector,do_selfcollision,do_springcollision,do_aero;
@@ -2465,7 +2465,7 @@ static void softbody_calc_forcesEx(Scene *scene, Object *ob, float forcetime, fl
do_springcollision=do_deflector && (ob->softflag & OB_SB_EDGES) &&(ob->softflag & OB_SB_EDGECOLL);
do_aero=((sb->aeroedge)&& (ob->softflag & OB_SB_EDGES));
- iks = 1.0f/(1.0f-sb->inspring)-1.0f ;/* inner spring constants function */
+ /* iks = 1.0f/(1.0f-sb->inspring)-1.0f; */ /* inner spring constants function */ /* UNUSED */
bproot= sb->bpoint; /* need this for proper spring addressing */
if (do_springcollision || do_aero)
@@ -3823,7 +3823,7 @@ void SB_estimate_transform(Object *ob,float lloc[3],float lrot[3][3],float lscal
{
BodyPoint *bp;
ReferenceVert *rp;
- SoftBody *sb = 0;
+ SoftBody *sb = NULL;
float (*opos)[3];
float (*rpos)[3];
float com[3],rcom[3];
@@ -4135,7 +4135,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
}
/* try to read from cache */
- cache_result = BKE_ptcache_read_cache(&pid, framenr, scene->r.frs_sec);
+ cache_result = BKE_ptcache_read(&pid, framenr);
if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
softbody_to_object(ob, vertexCos, numVerts, sb->local);
@@ -4143,14 +4143,14 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
BKE_ptcache_validate(cache, framenr);
if(cache_result == PTCACHE_READ_INTERPOLATED && cache->flag & PTCACHE_REDO_NEEDED)
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
return;
}
else if(cache_result==PTCACHE_READ_OLD) {
; /* do nothing */
}
- else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) {
+ else if(/*ob->id.lib || */(cache->flag & PTCACHE_BAKED)) { /* "library linking & pointcaches" has to be solved properly at some point */
/* if baked and nothing in cache, do nothing */
BKE_ptcache_invalidate(cache);
return;
@@ -4158,7 +4158,7 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
/* if on second frame, write cache for first frame */
if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
- BKE_ptcache_write_cache(&pid, startframe);
+ BKE_ptcache_write(&pid, startframe);
softbody_update_positions(ob, sb, vertexCos, numVerts);
@@ -4171,6 +4171,6 @@ void sbObjectStep(Scene *scene, Object *ob, float cfra, float (*vertexCos)[3], i
softbody_to_object(ob, vertexCos, numVerts, 0);
BKE_ptcache_validate(cache, framenr);
- BKE_ptcache_write_cache(&pid, framenr);
+ BKE_ptcache_write(&pid, framenr);
}
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 8f3b82643e0..88ca0c33624 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -55,7 +55,7 @@ static void sound_sync_callback(void* data, int mode, float time)
}
#endif
-int sound_define_from_str(char *str)
+int sound_define_from_str(const char *str)
{
if (BLI_strcaseeq(str, "NULL"))
return AUD_NULL_DEVICE;
@@ -74,7 +74,7 @@ void sound_force_device(int device)
force_device = device;
}
-void sound_init_once()
+void sound_init_once(void)
{
AUD_initOnce();
}
@@ -110,15 +110,17 @@ void sound_init(struct Main *bmain)
#ifdef WITH_JACK
AUD_setSyncCallback(sound_sync_callback, bmain);
+#else
+ (void)bmain; /* unused */
#endif
}
-void sound_exit()
+void sound_exit(void)
{
AUD_exit();
}
-struct bSound* sound_new_file(struct Main *bmain, char* filename)
+struct bSound* sound_new_file(struct Main *bmain, const char *filename)
{
bSound* sound = NULL;
@@ -129,7 +131,7 @@ struct bSound* sound_new_file(struct Main *bmain, char* filename)
strcpy(str, filename);
- path = /*bmain ? bmain->name :*/ G.sce;
+ path = /*bmain ? bmain->name :*/ G.main->name;
BLI_path_abs(str, path);
@@ -264,7 +266,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
if(sound->id.lib)
path = sound->id.lib->filepath;
else
- path = /*bmain ? bmain->name :*/ G.sce;
+ path = bmain->name;
BLI_path_abs(fullpath, path);
@@ -274,7 +276,7 @@ void sound_load(struct Main *bmain, struct bSound* sound)
/* or else load it from disk */
else
sound->handle = AUD_load(fullpath);
- } // XXX
+ }
// XXX unused currently
#if 0
break;
@@ -380,7 +382,7 @@ void sound_move_scene_sound(struct Scene *scene, void* handle, int startframe, i
AUD_moveSequencer(scene->sound_scene, handle, startframe / FPS, endframe / FPS, frameskip / FPS);
}
-void sound_start_play_scene(struct Scene *scene)
+static void sound_start_play_scene(struct Scene *scene)
{
scene->sound_scene_handle = AUD_play(scene->sound_scene, 1);
AUD_setLoop(scene->sound_scene_handle, -1);
@@ -433,9 +435,11 @@ void sound_seek_scene(struct bContext *C)
if(scene->audio.flag & AUDIO_SCRUB && !CTX_wm_screen(C)->animtimer)
{
- // AUD_XXX TODO: fix scrubbing, it currently doesn't stop playing
if(scene->audio.flag & AUDIO_SYNC)
+ {
+ AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_seekSequencer(scene->sound_scene_handle, CFRA / FPS);
+ }
else
AUD_seek(scene->sound_scene_handle, CFRA / FPS);
AUD_resume(scene->sound_scene_handle);
@@ -480,3 +484,12 @@ int sound_read_sound_buffer(struct bSound* sound, float* buffer, int length, flo
return AUD_readSound(limiter, buffer, length);
AUD_unload(limiter);
}
+
+int sound_get_channels(struct bSound* sound)
+{
+ AUD_SoundInfo info;
+
+ info = AUD_getInfo(sound->playback_handle);
+
+ return info.specs.channels;
+}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 7e3b5691177..86e901345c4 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,13 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_edgehash.h"
+#include "BLI_math.h"
+#include "BLI_memarena.h"
+#include "BLI_pbvh.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
@@ -51,11 +58,6 @@
#include "BKE_tessmesh.h"
#include "BKE_utildefines.h"
-#include "BLI_blenlib.h"
-#include "BLI_edgehash.h"
-#include "BLI_math.h"
-#include "BLI_memarena.h"
-#include "BLI_pbvh.h"
#include "PIL_time.h"
#include "BLI_array.h"
@@ -73,8 +75,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int useSubsurfUv,
DerivedMesh *dm);
-static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm);
-
///
static void *arena_alloc(CCGAllocatorHDL a, int numBytes) {
@@ -87,13 +87,13 @@ static void *arena_realloc(CCGAllocatorHDL a, void *ptr, int newSize, int oldSiz
}
return p2;
}
-static void arena_free(CCGAllocatorHDL a, void *ptr) {
+static void arena_free(CCGAllocatorHDL UNUSED(a), void *UNUSED(ptr)) {
}
static void arena_release(CCGAllocatorHDL a) {
BLI_memarena_free(a);
}
-static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAging, int useArena, int useFlatSubdiv) {
+static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAging, int useArena, int UNUSED(useFlatSubdiv)) {
CCGMeshIFC ifc;
CCGSubSurf *ccgSS;
@@ -320,7 +320,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
CCGFace **faceMap;
MTFace *tf;
CCGFaceIterator *fi;
- int index, gridSize, gridFaces, edgeSize, totface, x, y, S;
+ int index, gridSize, gridFaces, /*edgeSize,*/ totface, x, y, S;
MTFace *dmtface = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, n);
MTFace *tface = CustomData_get_layer_n(&result->faceData, CD_MTFACE, n);
@@ -337,7 +337,7 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
/* get some info from CCGSubSurf */
totface = ccgSubSurf_getNumFaces(uvss);
- edgeSize = ccgSubSurf_getEdgeSize(uvss);
+ /* edgeSize = ccgSubSurf_getEdgeSize(uvss); */ /*UNUSED*/
gridSize = ccgSubSurf_getGridSize(uvss);
gridFaces = gridSize - 1;
@@ -1174,7 +1174,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
/* this edge comes from face data */
int lastface = ccgSubSurf_getNumFaces(ss) - 1;
CCGFace *f;
- int x, y, grid, numVerts;
+ int x, y, grid /*, numVerts*/;
int offset;
int gridSize = ccgSubSurf_getGridSize(ss);
int edgeSize = ccgSubSurf_getEdgeSize(ss);
@@ -1186,7 +1186,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
++i;
f = cgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(f);
+ /* numVerts = ccgSubSurf_getFaceNumVerts(f); */ /*UNUSED*/
gridSideEdges = gridSize - 1;
gridInternalEdges = (gridSideEdges - 1) * gridSideEdges * 2;
@@ -1251,7 +1251,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
int gridFaces = gridSideEdges * gridSideEdges;
int i;
CCGFace *f;
- int numVerts;
+ /*int numVerts;*/
int offset;
int grid;
int x, y;
@@ -1265,7 +1265,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
i = cgdm->reverseFaceMap[faceNum];
f = cgdm->faceMap[i].face;
- numVerts = ccgSubSurf_getFaceNumVerts(f);
+ /*numVerts = ccgSubSurf_getFaceNumVerts(f);*/ /*UNUSED*/
offset = faceNum - cgdm->faceMap[i].startFace;
grid = offset / gridFaces;
@@ -1794,7 +1794,23 @@ static void ccgDM_drawVerts(DerivedMesh *dm) {
ccgFaceIterator_free(fi);
glEnd();
}
-static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges) {
+
+static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
+{
+ if(ccgdm->pbvh) {
+ CCGFace **faces;
+ int totface;
+
+ BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
+ if(totface) {
+ ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
+ ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
+ MEM_freeN(faces);
+ }
+ }
+}
+
+static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int UNUSED(drawAllEdges)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
@@ -1803,6 +1819,8 @@ static void ccgDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdge
int gridSize = ccgSubSurf_getGridSize(ss);
int useAging;
+ ccgdm_pbvh_update(ccgdm);
+
ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL);
for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
@@ -1893,25 +1911,10 @@ void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
no[1] = b_dZ*a_cX - b_dX*a_cZ;
no[2] = b_dX*a_cY - b_dY*a_cX;
- /* don't normalize, GL_NORMALIZE is be enabled */
+ /* don't normalize, GL_NORMALIZE is enabled */
glNormal3fv(no);
}
-static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
-{
- if(ccgdm->pbvh && ccgDM_use_grid_pbvh(ccgdm)) {
- CCGFace **faces;
- int totface;
-
- BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
- if(totface) {
- ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
- ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
- MEM_freeN(faces);
- }
- }
-}
-
/* Only used by non-editmesh types */
static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -2006,7 +2009,7 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
CCGSubSurf *ss = cgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
GPUVertexAttribs gattribs;
- DMVertexAttribs attribs;
+ DMVertexAttribs attribs= {{{0}}};
MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE);
int gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
@@ -2018,13 +2021,10 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
ccgdm_pbvh_update(cgdm);
doDraw = 0;
- numVerts = 0;
matnr = -1;
transp = GPU_get_material_blend_mode();
orig_transp = transp;
- memset(&attribs, 0, sizeof(attribs));
-
#define PASSATTRIB(dx, dy, vert) { \
if(attribs.totorco) { \
index = getFaceIndex(ss, f, S, x+dx, y+dy, edgeSize, gridSize); \
@@ -2042,7 +2042,7 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
} \
if(attribs.tottang) { \
float *tang = attribs.tang.array[a*4 + vert]; \
- glVertexAttrib3fvARB(attribs.tang.glIndex, tang); \
+ glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \
} \
}
@@ -2070,7 +2070,7 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
}
- if(!doDraw || (setDrawOptions && !setDrawOptions(userData, origIndex))) {
+ if(!doDraw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) && !setDrawOptions(userData, origIndex))) {
a += gridFaces*gridFaces*numVerts;
continue;
}
@@ -2268,9 +2268,12 @@ static void cgdm_drawFacesTex_common(DerivedMesh *dm,
if(drawParams)
flag = drawParams(tf, mcol!=NULL, mat_nr);
- else
+ else if (index != ORIGINDEX_NONE)
flag= (drawParamsMapped)? drawParamsMapped(userData, index): 1;
-
+ else
+ flag= GPU_enable_material(mat_nr, NULL) ? 1:0;
+
+
if (flag == 0) { /* flag 0 == the face is hidden or invisible */
if(tf) tf += gridFaces*gridFaces*numVerts;
if(mcol) mcol += gridFaces*gridFaces*numVerts*4;
@@ -2410,7 +2413,7 @@ static void cgdm_drawUVEdges(DerivedMesh *dm)
}
}
-static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors) {
+static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors, int (*setMaterial)(int, void *attribs)) {
CCGDerivedMesh *cgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = cgdm->ss;
MCol *mcol= NULL;
@@ -2442,10 +2445,14 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
mcol += gridFaces*gridFaces*numVerts*4;
}
- if (index!=-1) {
- int draw;
- draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, index, &drawSmooth);
-
+ {
+ int draw= 1;
+
+ if(index == ORIGINDEX_NONE)
+ draw= setMaterial(faceFlags ? faceFlags[origIndex*2 + 1] + 1: 1, NULL); /* XXX, no faceFlags no material */
+ else if (setDrawOptions)
+ draw= setDrawOptions(userData, index, &drawSmooth);
+
if (draw) {
if (draw==2) {
glEnable(GL_POLYGON_STIPPLE);
@@ -2846,14 +2853,14 @@ static void ccgdm_create_grids(DerivedMesh *dm)
DMGridAdjacency *gridAdjacency, *adj;
CCGFace **gridFaces;
int *gridOffset;
- int index, numFaces, numGrids, S, gIndex, gridSize;
+ int index, numFaces, numGrids, S, gIndex /*, gridSize*/;
if(cgdm->gridData)
return;
numGrids = ccgDM_getNumGrids(dm);
numFaces = ccgSubSurf_getNumFaces(ss);
- gridSize = ccgDM_getGridSize(dm);
+ /*gridSize = ccgDM_getGridSize(dm);*/ /*UNUSED*/
/* compute offset into grid array for each face */
gridOffset = MEM_mallocN(sizeof(int)*numFaces, "cgdm.gridOffset");
@@ -2939,28 +2946,10 @@ static ListBase *ccgDM_getFaceMap(Object *ob, DerivedMesh *dm)
return ccgdm->fmap;
}
-static int ccgDM_use_grid_pbvh(CCGDerivedMesh *ccgdm)
-{
- ModifierData *md;
- MultiresModifierData *mmd= ccgdm->multires.mmd;
-
- /* in sync with sculpt mode, only use multires grid pbvh if we are
- the last enabled modifier in the stack, otherwise we use the base
- mesh */
- if(!mmd)
- return 0;
-
- for(md=mmd->modifier.next; md; md= md->next)
- if(modifier_isEnabled(mmd->modifier.scene, md, eModifierMode_Realtime))
- return 0;
-
- return 1;
-}
-
static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm= (CCGDerivedMesh*)dm;
- int gridSize, numGrids, grid_pbvh;
+ int gridSize, numGrids;
if(!ob) {
ccgdm->pbvh= NULL;
@@ -2970,20 +2959,15 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
if(!ob->sculpt)
return NULL;
- grid_pbvh = ccgDM_use_grid_pbvh(ccgdm);
-
if(ob->sculpt->pbvh) {
- if(grid_pbvh) {
- /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm
- but this can be freed on ccgdm release, this updates the pointers
- when the ccgdm gets remade, the assumption is that the topology
- does not change. */
- ccgdm_create_grids(dm);
- BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void**)ccgdm->gridFaces);
- }
+ /* pbvh's grids, gridadj and gridfaces points to data inside ccgdm
+ but this can be freed on ccgdm release, this updates the pointers
+ when the ccgdm gets remade, the assumption is that the topology
+ does not change. */
+ ccgdm_create_grids(dm);
+ BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void**)ccgdm->gridFaces);
ccgdm->pbvh = ob->sculpt->pbvh;
- ccgdm->pbvh_draw = grid_pbvh;
}
if(ccgdm->pbvh)
@@ -2992,25 +2976,14 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
/* no pbvh exists yet, we need to create one. only in case of multires
we build a pbvh over the modified mesh, in other cases the base mesh
is being sculpted, so we build a pbvh from that. */
- if(grid_pbvh) {
- ccgdm_create_grids(dm);
-
- gridSize = ccgDM_getGridSize(dm);
- numGrids = ccgDM_getNumGrids(dm);
+ ccgdm_create_grids(dm);
- ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
- BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
- numGrids, gridSize, (void**)ccgdm->gridFaces);
- ccgdm->pbvh_draw = 1;
- }
- else if(ob->type == OB_MESH) {
- Mesh *me= ob->data;
+ gridSize = ccgDM_getGridSize(dm);
+ numGrids = ccgDM_getNumGrids(dm);
- ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
- BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
- me->totface, me->totvert);
- ccgdm->pbvh_draw = 0;
- }
+ ob->sculpt->pbvh= ccgdm->pbvh = BLI_pbvh_new();
+ BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
+ numGrids, gridSize, (void**)ccgdm->gridFaces);
return ccgdm->pbvh;
}
@@ -3037,17 +3010,16 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int edgeSize, has_edge_origindex;
int gridSize;
int gridFaces, gridCuts;
- int gridSideVerts;
+ /*int gridSideVerts;*/
int gridSideEdges;
int numTex, numCol;
int gridInternalEdges;
- float *w = NULL, one = 1.0f;
+ float *w = NULL;
WeightTable wtable = {0};
MCol *mcol;
MEdge *medge = NULL, medge2;
MFace *mface = NULL;
MPoly *mpoly = NULL;
- int *orig_indices;
DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
ccgSubSurf_getNumFinalVerts(ss),
@@ -3167,7 +3139,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
edgeSize = ccgSubSurf_getEdgeSize(ss);
gridSize = ccgSubSurf_getGridSize(ss);
gridFaces = gridSize - 1;
- gridSideVerts = gridSize - 2;
gridCuts = gridSize - 2;
/*gridInternalVerts = gridSideVerts * gridSideVerts; - as yet, unused */
gridSideEdges = gridSize - 1;
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index 1b720c1adaa..052b545cfb4 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -54,7 +54,7 @@ static int txttl_cmp(const char *first, const char *second, int len) {
return cmp;
}
-static void txttl_free_suggest() {
+static void txttl_free_suggest(void) {
SuggItem *item, *prev;
for (item = suggestions.last; item; item=prev) {
prev = item->prev;
@@ -66,7 +66,7 @@ static void txttl_free_suggest() {
suggestions.top = 0;
}
-static void txttl_free_docs() {
+static void txttl_free_docs(void) {
if (documentation) {
MEM_freeN(documentation);
documentation = NULL;
@@ -77,7 +77,7 @@ static void txttl_free_docs() {
/* General tool functions */
/**************************/
-void free_texttools() {
+void free_texttools(void) {
txttl_free_suggest();
txttl_free_docs();
}
@@ -88,7 +88,7 @@ void texttool_text_set_active(Text *text) {
activeToolText = text;
}
-void texttool_text_clear() {
+void texttool_text_clear(void) {
free_texttools();
activeToolText = NULL;
}
@@ -191,15 +191,15 @@ void texttool_suggest_prefix(const char *prefix) {
}
}
-void texttool_suggest_clear() {
+void texttool_suggest_clear(void) {
txttl_free_suggest();
}
-SuggItem *texttool_suggest_first() {
+SuggItem *texttool_suggest_first(void) {
return suggestions.firstmatch;
}
-SuggItem *texttool_suggest_last() {
+SuggItem *texttool_suggest_last(void) {
return suggestions.lastmatch;
}
@@ -207,11 +207,11 @@ void texttool_suggest_select(SuggItem *sel) {
suggestions.selected = sel;
}
-SuggItem *texttool_suggest_selected() {
+SuggItem *texttool_suggest_selected(void) {
return suggestions.selected;
}
-int *texttool_suggest_top() {
+int *texttool_suggest_top(void) {
return &suggestions.top;
}
@@ -243,10 +243,10 @@ void texttool_docs_show(const char *docs) {
documentation[len] = '\0';
}
-char *texttool_docs_get() {
+char *texttool_docs_get(void) {
return documentation;
}
-void texttool_docs_clear() {
+void texttool_docs_clear(void) {
txttl_free_docs();
}
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 19bc853276a..1bd41c7aa86 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -36,6 +36,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_constraint_types.h"
#include "DNA_controller_types.h"
@@ -51,9 +52,9 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
-#ifndef DISABLE_PYTHON
+
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -93,7 +94,7 @@ TMARK_EDITALL is set the group ID defines which other markers should be edited.
The mrk->clr field is used to visually group markers where the flags may not
match. A template system, for example, may allow editing of repeating tokens
(in one group) but include other marked positions (in another group) all in the
-same template with the same colour.
+same template with the same color.
Undo
--
@@ -167,12 +168,12 @@ void free_text(Text *text)
if(text->name) MEM_freeN(text->name);
MEM_freeN(text->undo_buf);
-#ifndef DISABLE_PYTHON
- if (text->compiled) BPY_free_compiled_text(text);
+#ifdef WITH_PYTHON
+ if (text->compiled) BPY_text_free_code(text);
#endif
}
-Text *add_empty_text(char *name)
+Text *add_empty_text(const char *name)
{
Main *bmain= G.main;
Text *ta;
@@ -241,7 +242,7 @@ int reopen_text(Text *text)
if (!text || !text->name) return 0;
BLI_strncpy(str, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(str, G.sce);
+ BLI_path_abs(str, G.main->name);
fp= fopen(str, "r");
if(fp==NULL) return 0;
@@ -279,7 +280,6 @@ int reopen_text(Text *text)
text->mtime= st.st_mtime;
text->nlines=0;
- i=0;
llen=0;
for(i=0; i<len; i++) {
if (buffer[i]=='\n') {
@@ -325,7 +325,7 @@ int reopen_text(Text *text)
return 1;
}
-Text *add_text(char *file, const char *relpath)
+Text *add_text(const char *file, const char *relpath)
{
Main *bmain= G.main;
FILE *fp;
@@ -521,7 +521,7 @@ void unlink_text(Main *bmain, Text *text)
}
if(update)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
/* pynodes */
@@ -559,7 +559,7 @@ void clear_text(Text *text) /* called directly from rna */
txt_make_dirty(text);
}
-void write_text(Text *text, char *str) /* called directly from rna */
+void write_text(Text *text, const char *str) /* called directly from rna */
{
int oldstate;
@@ -585,7 +585,7 @@ static void make_new_line (TextLine *line, char *newline)
line->format= NULL;
}
-static TextLine *txt_new_line(char *str)
+static TextLine *txt_new_line(const char *str)
{
TextLine *tmp;
@@ -683,8 +683,8 @@ int txt_get_span (TextLine *from, TextLine *to)
static void txt_make_dirty (Text *text)
{
text->flags |= TXT_ISDIRTY;
-#ifndef DISABLE_PYTHON
- if (text->compiled) BPY_free_compiled_text(text);
+#ifdef WITH_PYTHON
+ if (text->compiled) BPY_text_free_code(text);
#endif
}
@@ -991,8 +991,8 @@ void txt_move_to (Text *text, unsigned int line, unsigned int ch, short sel)
if ((*linep)->next) *linep= (*linep)->next;
else break;
}
- if (ch>(*linep)->len)
- ch= (*linep)->len;
+ if (ch>(unsigned int)((*linep)->len))
+ ch= (unsigned int)((*linep)->len);
*charp= ch;
if(!sel) txt_pop_sel(text);
@@ -1232,7 +1232,7 @@ int txt_find_string(Text *text, char *findstr, int wrap)
{
TextLine *tl, *startl;
char *s= NULL;
- int oldcl, oldsl, oldcc, oldsc;
+ int oldcl, oldsl;
if (!text || !text->curl || !text->sell) return 0;
@@ -1241,8 +1241,6 @@ int txt_find_string(Text *text, char *findstr, int wrap)
oldcl= txt_get_span(text->lines.first, text->curl);
oldsl= txt_get_span(text->lines.first, text->sell);
tl= startl= text->sell;
- oldcc= text->curc;
- oldsc= text->selc;
s= strstr(&tl->line[text->selc], findstr);
while (!s) {
@@ -1431,7 +1429,7 @@ void txt_print_undo(Text *text)
{
int i= 0;
int op;
- char *ops;
+ const char *ops;
int linep, charp;
dump_buffer(text);
@@ -2219,7 +2217,6 @@ static void txt_combine_lines (Text *text, TextLine *linea, TextLine *lineb)
} while (mrk && mrk->lineno==lineno);
}
if (lineno==-1) lineno= txt_get_span(text->lines.first, lineb);
- if (!mrk) mrk= text->markers.first;
tmp= MEM_mallocN(linea->len+lineb->len+1, "textline_string");
@@ -2470,7 +2467,7 @@ void indent(Text *text)
int len, num;
char *tmp;
- char *add = "\t";
+ const char *add = "\t";
int indentlen = 1;
/* hardcoded: TXT_TABSIZE = 4 spaces: */
@@ -2531,7 +2528,7 @@ void indent(Text *text)
void unindent(Text *text)
{
int num = 0;
- char *remove = "\t";
+ const char *remove = "\t";
int indent = 1;
/* hardcoded: TXT_TABSIZE = 4 spaces: */
@@ -2694,7 +2691,7 @@ int setcurr_tab_spaces (Text *text, int space)
const char *word = ":";
const char *comm = "#";
const char indent= (text->flags & TXT_TABSTOSPACES) ? ' ' : '\t';
- static char *back_words[]= {"return", "break", "continue", "pass", "yield", NULL};
+ static const char *back_words[]= {"return", "break", "continue", "pass", "yield", NULL};
if (!text) return 0;
if (!text->curl) return 0;
@@ -2710,9 +2707,13 @@ int setcurr_tab_spaces (Text *text, int space)
}
if(strstr(text->curl->line, word))
{
- //if we find a : then add a tab but not if it is in a comment
+ /* if we find a ':' on this line, then add a tab but not if it is:
+ * 1) in a comment
+ * 2) within an identifier
+ * 3) after the cursor (text->curc), i.e. when creating space before a function def [#25414]
+ */
int a, indent = 0;
- for(a=0; text->curl->line[a] != '\0'; a++)
+ for(a=0; (a < text->curc) && (text->curl->line[a] != '\0'); a++)
{
if (text->curl->line[a]=='#') {
break;
@@ -2746,7 +2747,7 @@ int setcurr_tab_spaces (Text *text, int space)
/*********************************/
/* Creates and adds a marker to the list maintaining sorted order */
-void txt_add_marker(Text *text, TextLine *line, int start, int end, char color[4], int group, int flags) {
+void txt_add_marker(Text *text, TextLine *line, int start, int end, const unsigned char color[4], int group, int flags) {
TextMarker *tmp, *marker;
marker= MEM_mallocN(sizeof(TextMarker), "text_marker");
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index 77416f4dd12..c22b1d32849 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -38,11 +38,10 @@
#include "PIL_dynlib.h"
-
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "DNA_key_types.h"
#include "DNA_object_types.h"
@@ -52,6 +51,7 @@
#include "DNA_brush_types.h"
#include "DNA_node_types.h"
#include "DNA_color_types.h"
+#include "DNA_particle_types.h"
#include "IMB_imbuf.h"
@@ -93,14 +93,14 @@ void open_plugin_tex(PluginTex *pit)
int (*version)(void);
/* init all the happy variables */
- pit->doit= 0;
- pit->pname= 0;
- pit->stnames= 0;
- pit->varstr= 0;
- pit->result= 0;
- pit->cfra= 0;
+ pit->doit= NULL;
+ pit->pname= NULL;
+ pit->stnames= NULL;
+ pit->varstr= NULL;
+ pit->result= NULL;
+ pit->cfra= NULL;
pit->version= 0;
- pit->instance_init= 0;
+ pit->instance_init= NULL;
/* clear the error list */
PIL_dynlib_get_error_as_string(NULL);
@@ -113,12 +113,12 @@ void open_plugin_tex(PluginTex *pit)
pit->handle= PIL_dynlib_open(pit->name);
if(test_dlerr(pit->name, pit->name)) return;
- if (pit->handle != 0) {
+ if (pit->handle != NULL) {
/* find the address of the version function */
version= (int (*)(void)) PIL_dynlib_find_symbol(pit->handle, "plugin_tex_getversion");
if (test_dlerr(pit->name, "plugin_tex_getversion")) return;
- if (version != 0) {
+ if (version != NULL) {
pit->version= version();
if( pit->version >= 2 && pit->version <=6) {
int (*info_func)(PluginInfo *);
@@ -168,8 +168,8 @@ PluginTex *add_plugin_tex(char *str)
strcpy(pit->name, str);
open_plugin_tex(pit);
- if(pit->doit==0) {
- if(pit->handle==0) {;} //XXX error("no plugin: %s", str);
+ if(pit->doit==NULL) {
+ if(pit->handle==NULL) {;} //XXX error("no plugin: %s", str);
else {;} //XXX error("in plugin: %s", str);
MEM_freeN(pit);
return NULL;
@@ -193,7 +193,7 @@ PluginTex *add_plugin_tex(char *str)
void free_plugin_tex(PluginTex *pit)
{
- if(pit==0) return;
+ if(pit==NULL) return;
/* no PIL_dynlib_close: same plugin can be opened multiple times, 1 handle */
MEM_freeN(pit);
@@ -573,6 +573,7 @@ void default_tex(Tex *tex)
tex->iuser.fie_ima= 2;
tex->iuser.ok= 1;
tex->iuser.frames= 100;
+ tex->iuser.sfra= 1;
tex->preview = NULL;
}
@@ -618,7 +619,7 @@ void default_mtex(MTex *mtex)
{
mtex->texco= TEXCO_ORCO;
mtex->mapto= MAP_COL;
- mtex->object= 0;
+ mtex->object= NULL;
mtex->projx= PROJ_X;
mtex->projy= PROJ_Y;
mtex->projz= PROJ_Z;
@@ -629,8 +630,8 @@ void default_mtex(MTex *mtex)
mtex->size[0]= 1.0;
mtex->size[1]= 1.0;
mtex->size[2]= 1.0;
- mtex->tex= 0;
- mtex->texflag= MTEX_NEW_BUMP;
+ mtex->tex= NULL;
+ mtex->texflag= MTEX_3TAP_BUMP | MTEX_BUMP_OBJECTSPACE;
mtex->colormodel= 0;
mtex->r= 1.0;
mtex->g= 0.0;
@@ -671,14 +672,16 @@ void default_mtex(MTex *mtex)
mtex->lifefac= 1.0f;
mtex->sizefac= 1.0f;
mtex->ivelfac= 1.0f;
- mtex->pvelfac= 1.0f;
+ mtex->dampfac= 1.0f;
+ mtex->gravityfac= 1.0f;
+ mtex->fieldfac= 1.0f;
mtex->normapspace= MTEX_NSPACE_TANGENT;
}
/* ------------------------------------------------------------------------- */
-MTex *add_mtex()
+MTex *add_mtex(void)
{
MTex *mtex;
@@ -740,7 +743,7 @@ Tex *copy_texture(Tex *tex)
texn= copy_libblock(tex);
if(texn->type==TEX_IMAGE) id_us_plus((ID *)texn->ima);
- else texn->ima= 0;
+ else texn->ima= NULL;
#if 0 // XXX old animation system
id_us_plus((ID *)texn->ipo);
@@ -760,7 +763,7 @@ Tex *copy_texture(Tex *tex)
if(tex->nodetree) {
ntreeEndExecTree(tex->nodetree);
- texn->nodetree= ntreeCopyTree(tex->nodetree, 0); /* 0 == full new tree */
+ texn->nodetree= ntreeCopyTree(tex->nodetree); /* 0 == full new tree */
}
return texn;
@@ -776,6 +779,7 @@ void make_local_texture(Tex *tex)
World *wrld;
Lamp *la;
Brush *br;
+ ParticleSettings *pa;
int a, local=0, lib=0;
/* - only lib users: do nothing
@@ -783,19 +787,19 @@ void make_local_texture(Tex *tex)
* - mixed: make copy
*/
- if(tex->id.lib==0) return;
+ if(tex->id.lib==NULL) return;
/* special case: ima always local immediately */
if(tex->ima) {
- tex->ima->id.lib= 0;
+ tex->ima->id.lib= NULL;
tex->ima->id.flag= LIB_LOCAL;
- new_id(0, (ID *)tex->ima, 0);
+ new_id(NULL, (ID *)tex->ima, NULL);
}
if(tex->id.us==1) {
- tex->id.lib= 0;
+ tex->id.lib= NULL;
tex->id.flag= LIB_LOCAL;
- new_id(0, (ID *)tex, 0);
+ new_id(NULL, (ID *)tex, NULL);
return;
}
@@ -838,11 +842,21 @@ void make_local_texture(Tex *tex)
}
br= br->id.next;
}
+ pa= bmain->particle.first;
+ while(pa) {
+ for(a=0; a<MAX_MTEX; a++) {
+ if(pa->mtex[a] && pa->mtex[a]->tex==tex) {
+ if(pa->id.lib) lib= 1;
+ else local= 1;
+ }
+ }
+ pa= pa->id.next;
+ }
if(local && lib==0) {
- tex->id.lib= 0;
+ tex->id.lib= NULL;
tex->id.flag= LIB_LOCAL;
- new_id(0, (ID *)tex, 0);
+ new_id(NULL, (ID *)tex, NULL);
}
else if(local && lib) {
texn= copy_texture(tex);
@@ -852,7 +866,7 @@ void make_local_texture(Tex *tex)
while(ma) {
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a] && ma->mtex[a]->tex==tex) {
- if(ma->id.lib==0) {
+ if(ma->id.lib==NULL) {
ma->mtex[a]->tex= texn;
texn->id.us++;
tex->id.us--;
@@ -865,7 +879,7 @@ void make_local_texture(Tex *tex)
while(la) {
for(a=0; a<MAX_MTEX; a++) {
if(la->mtex[a] && la->mtex[a]->tex==tex) {
- if(la->id.lib==0) {
+ if(la->id.lib==NULL) {
la->mtex[a]->tex= texn;
texn->id.us++;
tex->id.us--;
@@ -878,7 +892,7 @@ void make_local_texture(Tex *tex)
while(wrld) {
for(a=0; a<MAX_MTEX; a++) {
if(wrld->mtex[a] && wrld->mtex[a]->tex==tex) {
- if(wrld->id.lib==0) {
+ if(wrld->id.lib==NULL) {
wrld->mtex[a]->tex= texn;
texn->id.us++;
tex->id.us--;
@@ -890,7 +904,7 @@ void make_local_texture(Tex *tex)
br= bmain->brush.first;
while(br) {
if(br->mtex.tex==tex) {
- if(br->id.lib==0) {
+ if(br->id.lib==NULL) {
br->mtex.tex= texn;
texn->id.us++;
tex->id.us--;
@@ -898,6 +912,19 @@ void make_local_texture(Tex *tex)
}
br= br->id.next;
}
+ pa= bmain->particle.first;
+ while(pa) {
+ for(a=0; a<MAX_MTEX; a++) {
+ if(pa->mtex[a] && pa->mtex[a]->tex==tex) {
+ if(pa->id.lib==NULL) {
+ pa->mtex[a]->tex= texn;
+ texn->id.us++;
+ tex->id.us--;
+ }
+ }
+ }
+ pa= pa->id.next;
+ }
}
}
@@ -940,8 +967,8 @@ Tex *give_current_object_texture(Object *ob)
Material *ma;
Tex *tex= NULL;
- if(ob==0) return 0;
- if(ob->totcol==0 && !(ob->type==OB_LAMP)) return 0;
+ if(ob==NULL) return NULL;
+ if(ob->totcol==0 && !(ob->type==OB_LAMP)) return NULL;
if(ob->type==OB_LAMP) {
tex= give_current_lamp_texture(ob->data);
@@ -1048,6 +1075,10 @@ int give_active_mtex(ID *id, MTex ***mtex_ar, short *act)
*mtex_ar= ((Lamp *)id)->mtex;
if(act) *act= (((Lamp *)id)->texact);
break;
+ case ID_PA:
+ *mtex_ar= ((ParticleSettings *)id)->mtex;
+ if(act) *act= (((ParticleSettings *)id)->texact);
+ break;
default:
*mtex_ar = NULL;
if(act) *act= 0;
@@ -1072,6 +1103,9 @@ void set_active_mtex(ID *id, short act)
case ID_LA:
((Lamp *)id)->texact= act;
break;
+ case ID_PA:
+ ((ParticleSettings *)id)->texact= act;
+ break;
}
}
@@ -1121,7 +1155,7 @@ Tex *give_current_world_texture(World *world)
MTex *mtex= NULL;
Tex *tex= NULL;
- if(!world) return 0;
+ if(!world) return NULL;
mtex= world->mtex[(int)(world->texact)];
if(mtex) tex= mtex->tex;
@@ -1167,6 +1201,42 @@ void set_current_brush_texture(Brush *br, Tex *newtex)
}
}
+Tex *give_current_particle_texture(ParticleSettings *part)
+{
+ MTex *mtex= NULL;
+ Tex *tex= NULL;
+
+ if(!part) return NULL;
+
+ mtex= part->mtex[(int)(part->texact)];
+ if(mtex) tex= mtex->tex;
+
+ return tex;
+}
+
+void set_current_particle_texture(ParticleSettings *part, Tex *newtex)
+{
+ int act= part->texact;
+
+ if(part->mtex[act] && part->mtex[act]->tex)
+ id_us_min(&part->mtex[act]->tex->id);
+
+ if(newtex) {
+ if(!part->mtex[act]) {
+ part->mtex[act]= add_mtex();
+ part->mtex[act]->texco= TEXCO_ORCO;
+ part->mtex[act]->blendtype= MTEX_MUL;
+ }
+
+ part->mtex[act]->tex= newtex;
+ id_us_plus(&newtex->id);
+ }
+ else if(part->mtex[act]) {
+ MEM_freeN(part->mtex[act]);
+ part->mtex[act]= NULL;
+ }
+}
+
/* ------------------------------------------------------------------------- */
EnvMap *BKE_add_envmap(void)
@@ -1285,8 +1355,7 @@ void BKE_free_pointdensity(PointDensity *pd)
void BKE_free_voxeldatadata(struct VoxelData *vd)
{
if (vd->dataset) {
- if(vd->file_format != TEX_VD_SMOKE)
- MEM_freeN(vd->dataset);
+ MEM_freeN(vd->dataset);
vd->dataset = NULL;
}
@@ -1337,13 +1406,11 @@ int BKE_texture_dependsOnTime(const struct Tex *texture)
else if( texture->ima &&
ELEM(texture->ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
return 1;
- }
-#if 0 // XXX old animation system
- else if(texture->ipo) {
- // assume any ipo means the texture is animated
+ }
+ else if(texture->adt) {
+ // assume anything in adt means the texture is animated
return 1;
}
-#endif // XXX old animation system
return 0;
}
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index 133f858e9ea..b071f2c9da5 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -1,4 +1,5 @@
-/**
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -24,29 +25,59 @@
#include <stdio.h>
#include <ctype.h>
#include <string.h>
-#ifdef WIN32
-#define _USE_MATH_DEFINES
-#endif
-#include <math.h>
+#include <assert.h>
+#include "BKE_unit.h"
+#include "BLI_math.h"
#include "BLI_winstuff.h"
+
#define TEMP_STR_SIZE 256
#define SEP_CHR '#'
#define SEP_STR "#"
-#define EPS 0.000001
-
+#define EPS 0.00001
+
+#define UN_SC_KM 1000.0f
+#define UN_SC_HM 100.0f
+#define UN_SC_DAM 10.0f
+#define UN_SC_M 1.0f
+#define UN_SC_DM 0.1f
+#define UN_SC_CM 0.01f
+#define UN_SC_MM 0.001f
+#define UN_SC_UM 0.000001f
+
+#define UN_SC_MI 1609.344f
+#define UN_SC_FUR 201.168f
+#define UN_SC_CH 20.1168f
+#define UN_SC_YD 0.9144f
+#define UN_SC_FT 0.3048f
+#define UN_SC_IN 0.0254f
+#define UN_SC_MIL 0.0000254f
+
+#define UN_SC_MTON 1000.0f /* metric ton */
+#define UN_SC_QL 100.0f
+#define UN_SC_KG 1.0f
+#define UN_SC_HG 0.1f
+#define UN_SC_DAG 0.01f
+#define UN_SC_G 0.001f
+
+#define UN_SC_ITON 907.18474f /* imperial ton */
+#define UN_SC_CWT 45.359237f
+#define UN_SC_ST 6.35029318f
+#define UN_SC_LB 0.45359237f
+#define UN_SC_OZ 0.028349523125f
/* define a single unit */
typedef struct bUnitDef {
- char *name;
- char *name_plural; /* abused a bit for the display name */
- char *name_short; /* this is used for display*/
- char *name_alt; /* can be NULL */
+ const char *name;
+ const char *name_plural; /* abused a bit for the display name */
+ const char *name_short; /* this is used for display*/
+ const char *name_alt; /* keyboard-friendly ASCII-only version of name_short, can be NULL */
+ /* if name_short has non-ASCII chars, name_alt should be present */
- char *name_display; /* can be NULL */
+ const char *name_display; /* can be NULL */
double scalar;
double bias; /* not used yet, needed for converting temperature */
@@ -59,7 +90,7 @@ typedef struct bUnitDef {
/* define a single unit */
typedef struct bUnitCollection {
struct bUnitDef *units;
- int base_unit; /* use for 0.0, or none given */
+ int base_unit; /* basic unit index (when user desn't specify unit explicitly) */
int flag; /* options for this system */
int length; /* to quickly find the last item */
} bUnitCollection;
@@ -74,14 +105,14 @@ static struct bUnitCollection buDummyCollecton = {buDummyDef, 0, 0, sizeof(buDum
/* Lengths */
static struct bUnitDef buMetricLenDef[] = {
- {"kilometer", "kilometers", "km", NULL, "Kilometers", 1000.0, 0.0, B_UNIT_DEF_NONE},
- {"hectometer", "hectometers", "hm", NULL, "100 Meters", 100.0, 0.0, B_UNIT_DEF_SUPPRESS},
- {"dekameter", "dekameters", "dkm",NULL, "10 Meters", 10.0, 0.0, B_UNIT_DEF_SUPPRESS},
- {"meter", "meters", "m", NULL, "Meters", 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
- {"decimetre", "decimetres", "dm", NULL, "10 Centimeters", 0.1, 0.0, B_UNIT_DEF_SUPPRESS},
- {"centimeter", "centimeters", "cm", NULL, "Centimeters", 0.01, 0.0, B_UNIT_DEF_NONE},
- {"millimeter", "millimeters", "mm", NULL, "Millimeters", 0.001, 0.0, B_UNIT_DEF_NONE},
- {"micrometer", "micrometers", "µm", "um", "Micrometers", 0.000001, 0.0, B_UNIT_DEF_NONE}, // micron too?
+ {"kilometer", "kilometers", "km", NULL, "Kilometers", UN_SC_KM, 0.0, B_UNIT_DEF_NONE},
+ {"hectometer", "hectometers", "hm", NULL, "100 Meters", UN_SC_HM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"dekameter", "dekameters", "dam",NULL, "10 Meters", UN_SC_DAM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"meter", "meters", "m", NULL, "Meters", UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"decimetre", "decimetres", "dm", NULL, "10 Centimeters", UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"centimeter", "centimeters", "cm", NULL, "Centimeters", UN_SC_CM, 0.0, B_UNIT_DEF_NONE},
+ {"millimeter", "millimeters", "mm", NULL, "Millimeters", UN_SC_MM, 0.0, B_UNIT_DEF_NONE},
+ {"micrometer", "micrometers", "µm", "um", "Micrometers", UN_SC_UM, 0.0, B_UNIT_DEF_NONE}, // micron too?
/* These get displayed because of float precision problems in the transform header,
* could work around, but for now probably people wont use these */
@@ -94,17 +125,121 @@ static struct bUnitDef buMetricLenDef[] = {
static struct bUnitCollection buMetricLenCollecton = {buMetricLenDef, 3, 0, sizeof(buMetricLenDef)/sizeof(bUnitDef)};
static struct bUnitDef buImperialLenDef[] = {
- {"mile", "miles", "mi", "m", "Miles", 1609.344, 0.0, B_UNIT_DEF_NONE},
- {"furlong", "furlongs", "fur", NULL, "Furlongs",201.168, 0.0, B_UNIT_DEF_SUPPRESS},
- {"chain", "chains", "ch", NULL, "Chains", 0.9144*22.0, 0.0, B_UNIT_DEF_SUPPRESS},
- {"yard", "yards", "yd", NULL, "Yards", 0.9144, 0.0, B_UNIT_DEF_NONE},
- {"foot", "feet", "'", "ft", "Feet", 0.3048, 0.0, B_UNIT_DEF_NONE},
- {"inch", "inches", "\"", "in", "Inches", 0.0254, 0.0, B_UNIT_DEF_NONE}, /* base unit */
- {"thou", "thous", "mil", NULL, "Thous", 0.0000254, 0.0, B_UNIT_DEF_NONE},
+ {"mile", "miles", "mi", "m", "Miles", UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
+ {"furlong", "furlongs", "fur", NULL, "Furlongs",UN_SC_FUR, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"chain", "chains", "ch", NULL, "Chains", UN_SC_CH, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"yard", "yards", "yd", NULL, "Yards", UN_SC_YD, 0.0, B_UNIT_DEF_NONE},
+ {"foot", "feet", "'", "ft", "Feet", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"inch", "inches", "\"", "in", "Inches", UN_SC_IN, 0.0, B_UNIT_DEF_NONE},
+ {"thou", "thous", "mil", NULL, "Thous", UN_SC_MIL, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
static struct bUnitCollection buImperialLenCollecton = {buImperialLenDef, 4, 0, sizeof(buImperialLenDef)/sizeof(bUnitDef)};
+/* Areas */
+static struct bUnitDef buMetricAreaDef[] = {
+ {"square kilometer", "square kilometers", "km²", "km2", "Square Kilometers", UN_SC_KM*UN_SC_KM, 0.0, B_UNIT_DEF_NONE},
+ {"square hectometer","square hectometers", "hm²", "hm2", "Square Hectometers", UN_SC_HM*UN_SC_HM, 0.0, B_UNIT_DEF_NONE}, /* hectare */
+ {"square dekameter", "square dekameters", "dam²","dam2", "Square Dekameters", UN_SC_DAM*UN_SC_DAM, 0.0, B_UNIT_DEF_SUPPRESS}, /* are */
+ {"square meter", "square meters", "m²", "m2", "Square Meters", UN_SC_M*UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"square decimetre", "square decimetres", "dm²", "dm2", "Square Decimetres", UN_SC_DM*UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"square centimeter", "square centimeters", "cm²", "cm2", "Square Centimeters", UN_SC_CM*UN_SC_CM, 0.0, B_UNIT_DEF_NONE},
+ {"square millimeter", "square millimeters", "mm²", "mm2", "Square Millimeters", UN_SC_MM*UN_SC_MM, 0.0, B_UNIT_DEF_NONE},
+ {"square micrometer", "square micrometers", "µm²", "um2", "Square Micrometers", UN_SC_UM*UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricAreaCollecton = {buMetricAreaDef, 3, 0, sizeof(buMetricAreaDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialAreaDef[] = {
+ {"square mile", "square miles", "sq mi", "sq m","Square Miles", UN_SC_MI*UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
+ {"square furlong", "square furlongs", "sq fur",NULL, "Square Furlongs", UN_SC_FUR*UN_SC_FUR, 0.0,B_UNIT_DEF_SUPPRESS},
+ {"square chain", "square chains", "sq ch", NULL, "Square Chains", UN_SC_CH*UN_SC_CH, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"square yard", "square yards", "sq yd", NULL, "Square Yards", UN_SC_YD*UN_SC_YD, 0.0, B_UNIT_DEF_NONE},
+ {"square foot", "square feet", "sq ft", NULL, "Square Feet", UN_SC_FT*UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"square inch", "square inches", "sq in", NULL, "Square Inches", UN_SC_IN*UN_SC_IN, 0.0, B_UNIT_DEF_NONE},
+ {"square thou", "square thous", "sq mil",NULL, "Square Thous", UN_SC_MIL*UN_SC_MIL, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialAreaCollecton = {buImperialAreaDef, 4, 0, sizeof(buImperialAreaDef)/sizeof(bUnitDef)};
+
+/* Volumes */
+static struct bUnitDef buMetricVolDef[] = {
+ {"cubic kilometer", "cubic kilometers", "km³", "km3", "Cubic Kilometers", UN_SC_KM*UN_SC_KM*UN_SC_KM, 0.0, B_UNIT_DEF_NONE},
+ {"cubic hectometer","cubic hectometers", "hm³", "hm3", "Cubic Hectometers", UN_SC_HM*UN_SC_HM*UN_SC_HM, 0.0, B_UNIT_DEF_NONE},
+ {"cubic dekameter", "cubic dekameters", "dam³","dam3", "Cubic Dekameters", UN_SC_DAM*UN_SC_DAM*UN_SC_DAM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"cubic meter", "cubic meters", "m³", "m3", "Cubic Meters", UN_SC_M*UN_SC_M*UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"cubic decimetre", "cubic decimetres", "dm³", "dm3", "Cubic Decimetres", UN_SC_DM*UN_SC_DM*UN_SC_DM, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"cubic centimeter", "cubic centimeters", "cm³", "cm3", "Cubic Centimeters", UN_SC_CM*UN_SC_CM*UN_SC_CM, 0.0, B_UNIT_DEF_NONE},
+ {"cubic millimeter", "cubic millimeters", "mm³", "mm3", "Cubic Millimeters", UN_SC_MM*UN_SC_MM*UN_SC_MM, 0.0, B_UNIT_DEF_NONE},
+ {"cubic micrometer", "cubic micrometers", "µm³", "um3", "Cubic Micrometers", UN_SC_UM*UN_SC_UM*UN_SC_UM, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricVolCollecton = {buMetricVolDef, 3, 0, sizeof(buMetricVolDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialVolDef[] = {
+ {"cubic mile", "cubic miles", "cu mi", "cu m","Cubic Miles", UN_SC_MI*UN_SC_MI*UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
+ {"cubic furlong", "cubic furlongs", "cu fur",NULL, "Cubic Furlongs", UN_SC_FUR*UN_SC_FUR*UN_SC_FUR, 0.0,B_UNIT_DEF_SUPPRESS},
+ {"cubic chain", "cubic chains", "cu ch", NULL, "Cubic Chains", UN_SC_CH*UN_SC_CH*UN_SC_CH, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"cubic yard", "cubic yards", "cu yd", NULL, "Cubic Yards", UN_SC_YD*UN_SC_YD*UN_SC_YD, 0.0, B_UNIT_DEF_NONE},
+ {"cubic foot", "cubic feet", "cu ft", NULL, "Cubic Feet", UN_SC_FT*UN_SC_FT*UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"cubic inch", "cubic inches", "cu in", NULL, "Cubic Inches", UN_SC_IN*UN_SC_IN*UN_SC_IN, 0.0, B_UNIT_DEF_NONE},
+ {"cubic thou", "cubic thous", "cu mil",NULL, "Cubic Thous", UN_SC_MIL*UN_SC_MIL*UN_SC_MIL, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialVolCollecton = {buImperialVolDef, 4, 0, sizeof(buImperialVolDef)/sizeof(bUnitDef)};
+
+/* Mass */
+static struct bUnitDef buMetricMassDef[] = {
+ {"ton", "tonnes", "ton", "t", "1000 Kilograms", UN_SC_MTON, 0.0, B_UNIT_DEF_NONE},
+ {"quintal", "quintals", "ql", "q", "100 Kilograms", UN_SC_QL, 0.0, B_UNIT_DEF_NONE},
+ {"kilogram", "kilograms", "kg", NULL, "Kilograms", UN_SC_KG, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"hectogram", "hectograms", "hg", NULL, "Hectograms", UN_SC_HG, 0.0, B_UNIT_DEF_NONE},
+ {"dekagram", "dekagrams", "dag",NULL, "10 Grams", UN_SC_DAG, 0.0, B_UNIT_DEF_SUPPRESS},
+ {"gram", "grams", "g", NULL, "Grams", UN_SC_G, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricMassCollecton = {buMetricMassDef, 2, 0, sizeof(buMetricMassDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialMassDef[] = {
+ {"ton", "tonnes", "ton", "t", "Tonnes", UN_SC_ITON, 0.0, B_UNIT_DEF_NONE},
+ {"centum weight", "centum weights", "cwt", NULL, "Centum weights", UN_SC_CWT, 0.0, B_UNIT_DEF_NONE},
+ {"stone", "stones", "st", NULL, "Stones", UN_SC_ST, 0.0, B_UNIT_DEF_NONE},
+ {"pound", "pounds", "lb", NULL, "Pounds", UN_SC_LB, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"ounce", "ounces", "oz", NULL, "Ounces", UN_SC_OZ, 0.0, B_UNIT_DEF_NONE},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialMassCollecton = {buImperialMassDef, 3, 0, sizeof(buImperialMassDef)/sizeof(bUnitDef)};
+
+/* Even if user scales the system to a point where km^3 is used, velocity and
+ * acceleration aren't scaled: that's why we have so few units for them */
+
+/* Velocity */
+static struct bUnitDef buMetricVelDef[] = {
+ {"meter per second", "meters per second", "m/s", NULL, "Meters per second", UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"kilometer per hour", "kilometers per hour", "km/h", NULL, "Kilometers per hour", UN_SC_KM/3600.0f, 0.0, B_UNIT_DEF_SUPPRESS},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricVelCollecton = {buMetricVelDef, 0, 0, sizeof(buMetricVelDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialVelDef[] = {
+ {"foot per second", "feet per second", "ft/s", "fps", "Feet per second", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {"mile per hour", "miles per hour", "mph", NULL, "Miles per hour", UN_SC_MI/3600.0f, 0.0,B_UNIT_DEF_SUPPRESS},
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialVelCollecton = {buImperialVelDef, 0, 0, sizeof(buImperialVelDef)/sizeof(bUnitDef)};
+
+/* Acceleration */
+static struct bUnitDef buMetricAclDef[] = {
+ {"meter per second squared", "meters per second squared", "m/s²", "m/s2", "Meters per second squared", UN_SC_M, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buMetricAclCollecton = {buMetricAclDef, 0, 0, sizeof(buMetricAclDef)/sizeof(bUnitDef)};
+
+static struct bUnitDef buImperialAclDef[] = {
+ {"foot per second squared", "feet per second squared", "ft/s²", "ft/s2", "Feet per second squared", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
+ {NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
+};
+static struct bUnitCollection buImperialAclCollecton = {buImperialAclDef, 0, 0, sizeof(buImperialAclDef)/sizeof(bUnitDef)};
/* Time */
static struct bUnitDef buNaturalTimeDef[] = {
@@ -114,7 +249,7 @@ static struct bUnitDef buNaturalTimeDef[] = {
{"minute", "minutes", "min", "m", "Minutes", 60.0, 0.0, B_UNIT_DEF_NONE},
{"second", "seconds", "sec", "s", "Seconds", 1.0, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{"millisecond", "milliseconds", "ms", NULL, "Milliseconds", 0.001, 0.0 , B_UNIT_DEF_NONE},
- {"microsecond", "microseconds", "us", NULL, "Microseconds", 0.000001, 0.0, B_UNIT_DEF_NONE},
+ {"microsecond", "microseconds", "µs", "us", "Microseconds", 0.000001, 0.0, B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0, sizeof(buNaturalTimeDef)/sizeof(bUnitDef)};
@@ -122,21 +257,26 @@ static struct bUnitCollection buNaturalTimeCollecton = {buNaturalTimeDef, 3, 0,
static struct bUnitDef buNaturalRotDef[] = {
{"degree", "degrees", "°", NULL, "Degrees", M_PI/180.0, 0.0, B_UNIT_DEF_NONE},
+// {"radian", "radians", "r", NULL, "Radians", 1.0, 0.0, B_UNIT_DEF_NONE},
+// {"turn", "turns", "t", NULL, "Turns", 1.0/(M_PI*2.0), 0.0,B_UNIT_DEF_NONE},
{NULL, NULL, NULL, NULL, NULL, 0.0, 0.0}
};
static struct bUnitCollection buNaturalRotCollection = {buNaturalRotDef, 0, 0, sizeof(buNaturalRotDef)/sizeof(bUnitDef)};
-#define UNIT_SYSTEM_MAX 3
-static struct bUnitCollection *bUnitSystems[][8] = {
- {0,0,0,0,0,&buNaturalRotCollection,&buNaturalTimeCollecton,0},
- {0,&buMetricLenCollecton, 0,0,0, &buNaturalRotCollection, &buNaturalTimeCollecton,0}, /* metric */
- {0,&buImperialLenCollecton, 0,0,0,&buNaturalRotCollection, &buNaturalTimeCollecton,0}, /* imperial */
- {0,0,0,0,0,0,0,0}
+#define UNIT_SYSTEM_TOT (((sizeof(bUnitSystems) / 9) / sizeof(void *)) - 1)
+static struct bUnitCollection *bUnitSystems[][9] = {
+ {NULL, NULL, NULL, NULL, NULL, &buNaturalRotCollection, &buNaturalTimeCollecton, NULL, NULL},
+ {NULL, &buMetricLenCollecton, &buMetricAreaCollecton, &buMetricVolCollecton, &buMetricMassCollecton, &buNaturalRotCollection, &buNaturalTimeCollecton, &buMetricVelCollecton, &buMetricAclCollecton}, /* metric */
+ {NULL, &buImperialLenCollecton, &buImperialAreaCollecton, &buImperialVolCollecton, &buImperialMassCollecton, &buNaturalRotCollection, &buNaturalTimeCollecton, &buImperialVelCollecton, &buImperialAclCollecton}, /* imperial */
+ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
};
+
+
/* internal, has some option not exposed */
static bUnitCollection *unit_get_system(int system, int type)
{
+ assert((system > -1) && (system < UNIT_SYSTEM_TOT) && (type > -1) && (type < B_UNIT_TYPE_TOT));
return bUnitSystems[system][type]; /* select system to use, metric/imperial/other? */
}
@@ -199,7 +339,8 @@ static int unit_as_string(char *str, int len_max, double value, int prec, bUnitC
/* Convert to a string */
{
- char conv_str[6] = {'%', '.', '0'+prec, 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
+ char conv_str[6] = {'%', '.', '0', 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
+ conv_str[2] += prec;
len= snprintf(str, len_max, conv_str, (float)value_conv);
if(len >= len_max)
@@ -256,9 +397,9 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
if(usys==NULL || usys->units[0].name==NULL)
usys= &buDummyCollecton;
-
- if(split) {
- int i;
+
+ /* split output makes sense only for length, mass and time */
+ if(split && (type==B_UNIT_LENGTH || type==B_UNIT_MASS || type==B_UNIT_TIME)) {
bUnitDef *unit_a, *unit_b;
double value_a, value_b;
@@ -266,7 +407,7 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
/* check the 2 is a smaller unit */
if(unit_b > unit_a) {
- i= unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
+ int i= unit_as_string(str, len_max, value_a, prec, usys, unit_a, '\0');
/* is there enough space for at least 1 char of the next unit? */
if(i+2 < len_max) {
@@ -283,7 +424,7 @@ void bUnit_AsString(char *str, int len_max, double value, int prec, int system,
}
-static char *unit_find_str(char *str, char *substr)
+static char *unit_find_str(char *str, const char *substr)
{
char *str_found;
@@ -338,7 +479,7 @@ static int ch_is_op(char op)
}
}
-static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, char *replace_str)
+static int unit_scale_str(char *str, int len_max, char *str_tmp, double scale_pref, bUnitDef *unit, const char *replace_str)
{
char *str_found;
@@ -443,10 +584,6 @@ int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pre
for(unit= usys->units; unit->name; unit++) {
-
- if(unit->flag & B_UNIT_DEF_SUPPRESS)
- continue;
-
/* incase there are multiple instances */
while(unit_replace(str, len_max, str_tmp, scale_pref, unit))
change= 1;
@@ -458,18 +595,15 @@ int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pre
bUnitCollection *usys_iter;
int system_iter;
- for(system_iter= 0; system_iter<UNIT_SYSTEM_MAX; system_iter++) {
+ for(system_iter= 0; system_iter<UNIT_SYSTEM_TOT; system_iter++) {
if (system_iter != system) {
usys_iter= unit_get_system(system_iter, type);
if (usys_iter) {
for(unit= usys_iter->units; unit->name; unit++) {
-
- if((unit->flag & B_UNIT_DEF_SUPPRESS) == 0) {
- int ofs = 0;
- /* incase there are multiple instances */
- while((ofs=unit_replace(str+ofs, len_max-ofs, str_tmp, scale_pref, unit)))
- change= 1;
- }
+ int ofs = 0;
+ /* incase there are multiple instances */
+ while((ofs=unit_replace(str+ofs, len_max-ofs, str_tmp, scale_pref, unit)))
+ change= 1;
}
}
}
@@ -482,10 +616,6 @@ int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pre
if(str_prev) {
/* see which units the original value had */
for(unit= usys->units; unit->name; unit++) {
-
- if(unit->flag & B_UNIT_DEF_SUPPRESS)
- continue;
-
if (unit_find(str_prev, unit))
break;
}
@@ -543,6 +673,49 @@ int bUnit_ReplaceString(char *str, int len_max, char *str_prev, double scale_pre
return change;
}
+/* 45µm --> 45um */
+void bUnit_ToUnitAltName(char *str, int len_max, char *orig_str, int system, int type)
+{
+ bUnitCollection *usys = unit_get_system(system, type);
+
+ bUnitDef *unit;
+ bUnitDef *unit_def= unit_default(usys);
+
+ /* find and substitute all units */
+ for(unit= usys->units; unit->name; unit++) {
+ if(len_max > 0 && (unit->name_alt || unit == unit_def))
+ {
+ char *found= NULL;
+
+ found= unit_find_str(orig_str, unit->name_short);
+ if(found) {
+ int offset= (int)(found - orig_str);
+ int len_name= 0;
+
+ /* copy everything before the unit */
+ offset= (offset<len_max? offset: len_max);
+ strncpy(str, orig_str, offset);
+
+ str+= offset;
+ orig_str+= offset + strlen(unit->name_short);
+ len_max-= offset;
+
+ /* print the alt_name */
+ if(unit->name_alt)
+ len_name= snprintf(str, len_max, "%s", unit->name_alt);
+ else
+ len_name= 0;
+
+ len_name= (len_name<len_max? len_name: len_max);
+ str+= len_name;
+ len_max-= len_name;
+ }
+ }
+ }
+
+ /* finally copy the rest of the string */
+ strncpy(str, orig_str, len_max);
+}
double bUnit_ClosestScalar(double value, int system, int type)
{
@@ -566,6 +739,12 @@ double bUnit_BaseScalar(int system, int type)
}
/* external access */
+int bUnit_IsValid(int system, int type)
+{
+ return !(system < 0 || system > UNIT_SYSTEM_TOT || type < 0 || type > B_UNIT_TYPE_TOT);
+}
+
+
void bUnit_GetSystem(void **usys_pt, int *len, int system, int type)
{
bUnitCollection *usys = unit_get_system(system, type);
@@ -579,11 +758,16 @@ void bUnit_GetSystem(void **usys_pt, int *len, int system, int type)
*len= usys->length;
}
-char *bUnit_GetName(void *usys_pt, int index)
+int bUnit_GetBaseUnit(void *usys_pt)
+{
+ return ((bUnitCollection *)usys_pt)->base_unit;
+}
+
+const char *bUnit_GetName(void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].name;
}
-char *bUnit_GetNameDisplay(void *usys_pt, int index)
+const char *bUnit_GetNameDisplay(void *usys_pt, int index)
{
return ((bUnitCollection *)usys_pt)->units[index].name_display;
}
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 42df92443f3..5412e44f0eb 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -38,6 +38,7 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "BKE_world.h"
#include "BKE_library.h"
#include "BKE_animsys.h"
#include "BKE_global.h"
@@ -63,7 +64,7 @@ void free_world(World *wrld)
}
-World *add_world(char *name)
+World *add_world(const char *name)
{
Main *bmain= G.main;
World *wrld;
@@ -136,11 +137,11 @@ void make_local_world(World *wrld)
* - mixed: make copy
*/
- if(wrld->id.lib==0) return;
+ if(wrld->id.lib==NULL) return;
if(wrld->id.us==1) {
- wrld->id.lib= 0;
+ wrld->id.lib= NULL;
wrld->id.flag= LIB_LOCAL;
- new_id(0, (ID *)wrld, 0);
+ new_id(NULL, (ID *)wrld, NULL);
return;
}
@@ -156,7 +157,7 @@ void make_local_world(World *wrld)
if(local && lib==0) {
wrld->id.lib= 0;
wrld->id.flag= LIB_LOCAL;
- new_id(0, (ID *)wrld, 0);
+ new_id(NULL, (ID *)wrld, NULL);
}
else if(local && lib) {
wrldn= copy_world(wrld);
@@ -165,7 +166,7 @@ void make_local_world(World *wrld)
sce= bmain->scene.first;
while(sce) {
if(sce->world==wrld) {
- if(sce->id.lib==0) {
+ if(sce->id.lib==NULL) {
sce->world= wrldn;
wrldn->id.us++;
wrld->id.us--;
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 00614ef0f4f..1c1febf2609 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -1,4 +1,4 @@
-/**
+/*
* Functions for writing avi-format files.
* Added interface for generic movie support (ton)
*
@@ -38,10 +38,12 @@
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "BKE_writeavi.h"
#include "AVI_avi.h"
@@ -119,7 +121,7 @@ static void filepath_avi (char *string, RenderData *rd)
if (string==NULL) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -137,6 +139,8 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
int quality;
double framerate;
+ (void)scene; /* unused */
+
filepath_avi(name, rd);
sframe = (rd->sfra);
@@ -175,7 +179,7 @@ static int start_avi(Scene *scene, RenderData *rd, int rectx, int recty, ReportL
return 1;
}
-static int append_avi(RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports)
+static int append_avi(RenderData *UNUSED(rd), int frame, int *pixels, int rectx, int recty, ReportList *UNUSED(reports))
{
unsigned int *rt1, *rt2, *rectot;
int x, y;
@@ -210,7 +214,7 @@ static int append_avi(RenderData *rd, int frame, int *pixels, int rectx, int rec
return 1;
}
-void end_avi(void)
+static void end_avi(void)
{
if (avi == NULL) return;
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 8ebf98ef930..f3b759113ff 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -1,4 +1,6 @@
/*
+ * $Id$
+ *
* ffmpeg-write support
*
* Partial Copyright (c) 2006 Peter Schlaile
@@ -19,7 +21,7 @@
#include <string.h>
#include <stdio.h>
-#if defined(_WIN32) && defined(_DEBUG) && !defined(__MINGW32__) && !defined(__CYGWIN__)
+#if defined(_WIN32) && defined(DEBUG) && !defined(__MINGW32__) && !defined(__CYGWIN__)
/* This does not seem necessary or present on MSVC 8, but may be needed in earlier versions? */
#if _MSC_VER < 1400
#include <stdint.h>
@@ -69,7 +71,7 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-extern void do_init_ffmpeg();
+extern void do_init_ffmpeg(void);
static int ffmpeg_type = 0;
static int ffmpeg_codec = CODEC_ID_MPEG4;
@@ -160,7 +162,7 @@ static int write_audio_frame(void)
pkt.stream_index = audio_stream->index;
pkt.flags |= PKT_FLAG_KEY;
if (av_interleaved_write_frame(outfile, &pkt) != 0) {
- // XXX error("Error writing audio packet");
+ fprintf(stderr, "Error writing audio packet!\n");
return -1;
}
return 0;
@@ -290,7 +292,9 @@ static int write_video_frame(RenderData *rd, AVFrame* frame, ReportList *reports
packet.data = video_buffer;
packet.size = outsize;
ret = av_interleaved_write_frame(outfile, &packet);
- } else ret = 0;
+ } else {
+ ret = 0;
+ }
if (ret != 0) {
success= 0;
@@ -515,6 +519,7 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex
if (codec_id == CODEC_ID_XVID) {
/* arghhhh ... */
c->pix_fmt = PIX_FMT_YUV420P;
+ c->codec_tag = (('D'<<24) + ('I'<<16) + ('V'<<8) + 'X');
}
if (codec_id == CODEC_ID_H264) {
@@ -777,6 +782,69 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report
return 1;
}
+/**
+ * Writes any delayed frames in the encoder. This function is called before
+ * closing the encoder.
+ *
+ * <p>
+ * Since an encoder may use both past and future frames to predict
+ * inter-frames (H.264 B-frames, for example), it can output the frames
+ * in a different order from the one it was given.
+ * For example, when sending frames 1, 2, 3, 4 to the encoder, it may write
+ * them in the order 1, 4, 2, 3 - first the two frames used for predition,
+ * and then the bidirectionally-predicted frames. What this means in practice
+ * is that the encoder may not immediately produce one output frame for each
+ * input frame. These delayed frames must be flushed before we close the
+ * stream. We do this by calling avcodec_encode_video with NULL for the last
+ * parameter.
+ * </p>
+ */
+void flush_ffmpeg(void)
+{
+ int outsize = 0;
+ int ret = 0;
+
+ AVCodecContext* c = get_codec_from_stream(video_stream);
+ /* get the delayed frames */
+ while (1) {
+ AVPacket packet;
+ av_init_packet(&packet);
+
+ outsize = avcodec_encode_video(c, video_buffer, video_buffersize, NULL);
+ if (outsize < 0) {
+ fprintf(stderr, "Error encoding delayed frame %d\n", outsize);
+ break;
+ }
+ if (outsize == 0) {
+ break;
+ }
+ if (c->coded_frame->pts != AV_NOPTS_VALUE) {
+#ifdef FFMPEG_CODEC_TIME_BASE
+ packet.pts = av_rescale_q(c->coded_frame->pts,
+ c->time_base,
+ video_stream->time_base);
+#else
+ packet.pts = c->coded_frame->pts;
+#endif
+ fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts);
+ } else {
+ fprintf(stderr, "Video Frame PTS: not set\n");
+ }
+ if (c->coded_frame->key_frame) {
+ packet.flags |= PKT_FLAG_KEY;
+ }
+ packet.stream_index = video_stream->index;
+ packet.data = video_buffer;
+ packet.size = outsize;
+ ret = av_interleaved_write_frame(outfile, &packet);
+ if (ret != 0) {
+ fprintf(stderr, "Error writing delayed frame %d\n", ret);
+ break;
+ }
+ }
+ avcodec_flush_buffers(get_codec_from_stream(video_stream));
+}
+
/* **********************************************************************
* public interface
********************************************************************** */
@@ -791,7 +859,7 @@ void filepath_ffmpeg(char* string, RenderData* rd) {
if (!string || !exts) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -887,10 +955,9 @@ int append_ffmpeg(RenderData *rd, int frame, int *pixels, int rectx, int recty,
return success;
}
-
void end_ffmpeg(void)
{
- int i;
+ unsigned int i;
fprintf(stderr, "Closing ffmpeg...\n");
@@ -904,6 +971,11 @@ void end_ffmpeg(void)
audio_mixdown_device = 0;
}
+ if (video_stream && get_codec_from_stream(video_stream)) {
+ fprintf(stderr, "Flushing delayed frames...\n");
+ flush_ffmpeg ();
+ }
+
if (outfile) {
av_write_trailer(outfile);
}
@@ -912,8 +984,8 @@ void end_ffmpeg(void)
if (video_stream && get_codec_from_stream(video_stream)) {
avcodec_close(get_codec_from_stream(video_stream));
- video_stream = 0;
printf("zero video stream %p\n", video_stream);
+ video_stream = 0;
}
@@ -988,6 +1060,8 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
IDPropertyTemplate val;
int idp_type;
char name[256];
+
+ val.i = 0;
avcodec_get_context_defaults(&c);
@@ -995,8 +1069,6 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
parent = c.av_class->option + parent_index;
if (!rd->ffcodecdata.properties) {
- IDPropertyTemplate val;
-
rd->ffcodecdata.properties
= IDP_New(IDP_GROUP, val, "ffmpeg");
}
@@ -1005,8 +1077,6 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
rd->ffcodecdata.properties, (char*) type);
if (!group) {
- IDPropertyTemplate val;
-
group = IDP_New(IDP_GROUP, val, (char*) type);
IDP_AddToGroup(rd->ffcodecdata.properties, group);
}
@@ -1194,20 +1264,47 @@ void ffmpeg_set_preset(RenderData *rd, int preset)
rd->ffcodecdata.mux_packet_size = 2048;
rd->ffcodecdata.mux_rate = 10080000;
+ /*
+ * All options here are for x264, but must be set via ffmpeg.
+ * The names are therefore different - Search for "x264 to FFmpeg option mapping"
+ * to get a list.
+ */
+
+ /*
+ * Use CABAC coder. Using "coder:1", which should be equivalent,
+ * crashes Blender for some reason. Either way - this is no big deal.
+ */
ffmpeg_property_add_string(rd, "video", "coder:vlc");
+
+ /*
+ * The other options were taken from the libx264-default.preset
+ * included in the ffmpeg distribution.
+ */
ffmpeg_property_add_string(rd, "video", "flags:loop");
ffmpeg_property_add_string(rd, "video", "cmp:chroma");
ffmpeg_property_add_string(rd, "video", "partitions:parti4x4");
ffmpeg_property_add_string(rd, "video", "partitions:partp8x8");
ffmpeg_property_add_string(rd, "video", "partitions:partb8x8");
ffmpeg_property_add_string(rd, "video", "me:hex");
- ffmpeg_property_add_string(rd, "video", "subq:5");
+ ffmpeg_property_add_string(rd, "video", "subq:6");
ffmpeg_property_add_string(rd, "video", "me_range:16");
+ ffmpeg_property_add_string(rd, "video", "qdiff:4");
ffmpeg_property_add_string(rd, "video", "keyint_min:25");
ffmpeg_property_add_string(rd, "video", "sc_threshold:40");
ffmpeg_property_add_string(rd, "video", "i_qfactor:0.71");
ffmpeg_property_add_string(rd, "video", "b_strategy:1");
-
+ ffmpeg_property_add_string(rd, "video", "bf:3");
+ ffmpeg_property_add_string(rd, "video", "refs:2");
+ ffmpeg_property_add_string(rd, "video", "qcomp:0.6");
+ ffmpeg_property_add_string(rd, "video", "directpred:3");
+ ffmpeg_property_add_string(rd, "video", "trellis:0");
+ ffmpeg_property_add_string(rd, "video", "flags2:wpred");
+ ffmpeg_property_add_string(rd, "video", "flags2:dct8x8");
+ ffmpeg_property_add_string(rd, "video", "flags2:fastpskip");
+ ffmpeg_property_add_string(rd, "video", "wpredp:2");
+
+ // This makes x264 output lossless. Will be a separate option later.
+ //ffmpeg_property_add_string(rd, "video", "cqp:0");
break;
case FFMPEG_PRESET_THEORA:
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index b0c05c31fa1..3cb3d7e038b 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -47,10 +47,12 @@
#include "DNA_userdef_types.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_writeframeserver.h"
#include "BKE_global.h"
#include "BKE_report.h"
-
#include "DNA_scene_types.h"
static int sock;
@@ -61,31 +63,31 @@ static int render_height;
#if defined(_WIN32)
-static int startup_socket_system()
+static int startup_socket_system(void)
{
WSADATA wsa;
return (WSAStartup(MAKEWORD(2,0),&wsa) == 0);
}
-static void shutdown_socket_system()
+static void shutdown_socket_system(void)
{
WSACleanup();
}
-static int select_was_interrupted_by_signal()
+static int select_was_interrupted_by_signal(void)
{
return (WSAGetLastError() == WSAEINTR);
}
#else
-static int startup_socket_system()
+static int startup_socket_system(void)
{
return 1;
}
-static void shutdown_socket_system()
+static void shutdown_socket_system(void)
{
}
-static int select_was_interrupted_by_signal()
+static int select_was_interrupted_by_signal(void)
{
return (errno == EINTR);
}
@@ -96,10 +98,12 @@ static int closesocket(int fd)
}
#endif
-int start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports)
+int start_frameserver(struct Scene *scene, RenderData *UNUSED(rd), int rectx, int recty, ReportList *reports)
{
struct sockaddr_in addr;
int arg = 1;
+
+ (void)scene; /* unused */
if (!startup_socket_system()) {
BKE_report(reports, RPT_ERROR, "Can't startup socket system");
@@ -243,7 +247,7 @@ static int handle_request(RenderData *rd, char * req)
return -1;
}
-int frameserver_loop(RenderData *rd, ReportList *reports)
+int frameserver_loop(RenderData *rd, ReportList *UNUSED(reports))
{
fd_set readfds;
struct timeval tv;
@@ -350,7 +354,7 @@ static void serve_ppm(int *pixels, int rectx, int recty)
connsock = -1;
}
-int append_frameserver(RenderData *rd, int frame, int *pixels, int rectx, int recty, ReportList *reports)
+int append_frameserver(RenderData *UNUSED(rd), int frame, int *pixels, int rectx, int recty, ReportList *UNUSED(reports))
{
fprintf(stderr, "Serving frame: %d\n", frame);
if (write_ppm) {
@@ -364,7 +368,7 @@ int append_frameserver(RenderData *rd, int frame, int *pixels, int rectx, int re
return 0;
}
-void end_frameserver()
+void end_frameserver(void)
{
if (connsock != -1) {
closesocket(connsock);
diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h
index ebacfa82b11..bd760646053 100644
--- a/source/blender/blenkernel/nla_private.h
+++ b/source/blender/blenkernel/nla_private.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: nla_private.h 21537 2009-07-11 22:22:53Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h
index cc4d65980c9..4cdb35dd675 100644
--- a/source/blender/blenlib/BLI_args.h
+++ b/source/blender/blenlib/BLI_args.h
@@ -1,6 +1,4 @@
-/**
- * A general argument parsing module
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,28 +30,33 @@
#ifndef BLI_ARGS_H
#define BLI_ARGS_H
+/** \file BLI_args.h
+ * \ingroup bli
+ * \brief A general argument parsing module.
+ */
+
struct bArgs;
typedef struct bArgs bArgs;
/* returns the number of extra arguments consumed by the function. 0 is normal value, -1 stops parsing arguments, other negative indicates skip */
-typedef int (*BA_ArgCallback)(int argc, char **argv, void *data);
+typedef int (*BA_ArgCallback)(int argc, const char **argv, void *data);
-struct bArgs *BLI_argsInit(int argc, char **argv);
+struct bArgs *BLI_argsInit(int argc, const char **argv);
void BLI_argsFree(struct bArgs *ba);
/* pass starts at 1, -1 means valid all the time
* short_arg or long_arg can be null to specify no short or long versions
* */
-void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data);
+void BLI_argsAdd(struct bArgs *ba, int pass, const char *short_arg, const char *long_arg, const char *doc, BA_ArgCallback cb, void *data);
/* short_case and long_case specify if those arguments are case specific */
-void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data);
+void BLI_argsAddCase(struct bArgs *ba, int pass, const char *short_arg, int short_case, const char *long_arg, int long_case, const char *doc, BA_ArgCallback cb, void *data);
void BLI_argsParse(struct bArgs *ba, int pass, BA_ArgCallback default_cb, void *data);
-void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg);
+void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg);
void BLI_argsPrintOtherDoc(struct bArgs *ba);
void BLI_argsPrint(struct bArgs *ba);
-char **BLI_argsArgv(struct bArgs *ba);
+const char **BLI_argsArgv(struct bArgs *ba);
#endif
diff --git a/source/blender/blenlib/BLI_bfile.h b/source/blender/blenlib/BLI_bfile.h
deleted file mode 100644
index 71e771fb4fa..00000000000
--- a/source/blender/blenlib/BLI_bfile.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* -*- indent-tabs-mode:t; tab-width:4; -*-
- *
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2009 by Stichting Blender Foundation.
- * All rights reserved.
- *
- * ***** END GPL LICENSE BLOCK *****
- * BFILE* based abstraction of file access.
- */
-
-#ifndef BLI_BFILE_H
-#define BLI_BFILE_H
-
-/* For fopen's FILE */
-#include <stdio.h>
-
-/**
- Defines for the bflags param.
- */
-/* Special handling, pick one of: */
-/* For "symmetry" of flags */
-#define BFILE_NORMAL (0)
-/* No supervision, just translate // if needed, RISKY */
-#define BFILE_RAW (1<<0)
-/* Path is for current session temp files */
-#define BFILE_TEMP (1<<1)
-/* Path is based in env vars of matching name */
-#define BFILE_CONFIG_BASE (1<<2)
-#define BFILE_CONFIG_DATAFILES (1<<3)
-#define BFILE_CONFIG_PYTHON (1<<4)
-#define BFILE_CONFIG_PLUGINS (1<<5)
-
-/* Config handling, special cases: */
-#define BFILE_USERONLY (1<<6)
-#define BFILE_SYSONLY (1<<7)
-
-/* Compression to apply on close: */
-#define BFILE_GZIP (1<<8)
-#define BFILE_LZMA (1<<9)
-
-/**
- File descriptor for Blender abstracted file access.
- */
-typedef struct {
- FILE *stream;
- int fd;
-
- /* Anything below should not be touched directly */
- int uflags; /* Special options requested by upper level, copy of bflags */
- char *fpath; /* Final/requested path name */
- char *tpath; /* Temp path name if applicable */
- int classf; /* Own flags, common classification of open and fopen */
- int error; /* An op caused an error, unsafe to replace older files */
-} BFILE;
-
-/**
- Open a BFILE* with fopen()-like syntax.
- */
-BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, const char *relpath);
-
-/**
- Open a BFILE* with open()-like syntax.
- */
-BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, const char *relpath);
-
-/**
- Get the FILE* associated with the BFILE*.
- */
-FILE *BLI_bfile_file_from_bfile(BFILE *bfile);
-
-/**
- Get the fd associated with the BFILE*.
- */
-int BLI_bfile_fd_from_bfile(BFILE *bfile);
-
-/**
- write()-like using BFILE*.
- */
-ssize_t BLI_bfile_write(BFILE *f, const void *buf, size_t count);
-
-/**
- read()-like using BFILE*.
- */
-ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count);
-
-/**
- fwrite()-like using BFILE*.
- */
-size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb, BFILE *f);
-
-/**
- fread()-like using BFILE*.
- */
-size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f);
-
-/**
- Close a BFILE, to match close() and fclose().
- */
-void BLI_bfile_close(BFILE *bfile);
-
-/**
- Clear error status.
- Call it only if the error has been really handled.
- */
-void BLI_bfile_clear_error(BFILE *bfile);
-
-/**
- Set the error status.
- Call it to mark writing by a 3rd party failed (libjpeg reported error, ie).
- */
-void BLI_bfile_set_error(BFILE *bfile, int error);
-
-/*
-TODO
-Maybe also provide more OS/libc things like:
-fflush
-fprintf and related
-fscanf
-fgetc/fputc and related
-fseek and related
-
-Probably good to do:
-readdir (compacted list showing all files for a "directory" (user versions on top of system's))
-*/
-
-#endif /* ifndef BLI_BFILE_H */
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 3028161734c..59d5b5cdef8 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -25,10 +25,14 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BLI_blenlib.h
+ * \ingroup bli
*
- * @mainpage BLI - Blender LIbrary external interface
+ * \section aboutbli Blender LIbrary external interface
*
- * @section about About the BLI module
+ * \subsection about About the BLI module
*
* This is the external interface of the Blender Library. If you find
* a call to a BLI function that is not prototyped here, please add a
@@ -39,7 +43,7 @@
* allocation/deallocation. There is also a patch to make MS Windows
* behave more or less Posix-compliant.
*
- * @section issues Known issues with BLI
+ * \subsection issues Known issues with BLI
*
* - blenlib is written in C.
* - The posix-compliancy may move to a separate lib that deals with
@@ -51,13 +55,11 @@
* - vectorops.c is close to superfluous. It may disappear in the
* near future.
*
- * @section dependencies Dependencies
+ * \subsection dependencies Dependencies
*
- * - The blenlib uses type defines from makesdna/, and functions from
+ * - The blenlib uses type defines from \ref DNA, and functions from
* standard libraries.
- *
- * $Id$
-*/
+ */
#ifndef BLI_BLENLIB_H
#define BLI_BLENLIB_H
@@ -84,8 +86,6 @@ extern "C" {
#include "BLI_rect.h"
-#include "BLI_scanfill.h"
-
#include "BLI_noise.h"
/**
diff --git a/source/blender/blenlib/BLI_boxpack2d.h b/source/blender/blenlib/BLI_boxpack2d.h
index 4beb2988fb6..886965f66b3 100644
--- a/source/blender/blenlib/BLI_boxpack2d.h
+++ b/source/blender/blenlib/BLI_boxpack2d.h
@@ -1,6 +1,4 @@
-/**
- *
- *
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -27,25 +25,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* Box Packer */
+#ifndef _BLI_BOXPACK2D_H_
+#define _BLI_BOXPACK2D_H_
-/* verts, internal use only */
-typedef struct boxVert {
- float x;
- float y;
- short free;
-
- struct boxPack *trb; /* top right box */
- struct boxPack *blb; /* bottom left box */
- struct boxPack *brb; /* bottom right box */
- struct boxPack *tlb; /* top left box */
-
- /* Store last intersecting boxes here
- * speedup intersection testing */
- struct boxPack *isect_cache[4];
-
- int index;
-} boxVert;
+/** \file BLI_boxpack2d.h
+ * \ingroup bli
+ */
+
+/* Box Packer */
typedef struct boxPack {
float x;
@@ -56,8 +43,10 @@ typedef struct boxPack {
/* Verts this box uses
* (BL,TR,TL,BR) / 0,1,2,3 */
- boxVert *v[4];
+ struct boxVert *v[4];
} boxPack;
-void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height);
+void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_height);
+
+#endif
diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h
index 72489a171b9..2200ec70789 100644
--- a/source/blender/blenlib/BLI_bpath.h
+++ b/source/blender/blenlib/BLI_bpath.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,54 +26,40 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* Based on ghash, difference is ghash is not a fixed size,
- * so for BPath we dont need to malloc */
+/** \file BLI_bpath.h
+ * \ingroup bli
+ * \attention Based on ghash, difference is ghash is not a fixed size,
+ * so for BPath we dont need to malloc
+ */
#ifndef BLI_BPATH_H
#define BLI_BPATH_H
-struct BPathIteratorSeqData {
- int totseq;
- int seq;
- struct Sequence **seqar; /* Sequence */
- struct Scene *scene; /* Current scene */
-};
-
-struct BPathIterator {
- char* path;
- char* lib;
- char* name;
- void* data;
- int len;
- int type;
-
- void (*setpath_callback)(struct BPathIterator *, char *);
- void (*getpath_callback)(struct BPathIterator *, char *);
-
- char* base_path; /* base path, the directry the blend file is in - normally G.sce */
+struct BPathIterator;
+struct ReportList;
+struct Main;
- /* only for seq data */
- struct BPathIteratorSeqData seqdata;
-};
-
-void BLI_bpathIterator_init (struct BPathIterator *bpi, char *base_path);
+void BLI_bpathIterator_init (struct BPathIterator **bpi, struct Main *bmain, const char *basedir, const int flag);
void BLI_bpathIterator_free (struct BPathIterator *bpi);
-char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
-char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
int BLI_bpathIterator_getType (struct BPathIterator *bpi);
int BLI_bpathIterator_getPathMaxLen (struct BPathIterator *bpi);
+const char* BLI_bpathIterator_getBasePath (struct BPathIterator *bpi);
void BLI_bpathIterator_step (struct BPathIterator *bpi);
int BLI_bpathIterator_isDone (struct BPathIterator *bpi);
void BLI_bpathIterator_getPath (struct BPathIterator *bpi, char *path);
void BLI_bpathIterator_getPathExpanded (struct BPathIterator *bpi, char *path_expanded);
-void BLI_bpathIterator_setPath (struct BPathIterator *bpi, char *path);
+void BLI_bpathIterator_setPath (struct BPathIterator *bpi, const char *path);
/* high level funcs */
/* creates a text file with missing files if there are any */
-void checkMissingFiles(char *basepath, ReportList *reports);
-void makeFilesRelative(char *basepath, ReportList *reports);
-void makeFilesAbsolute(char *basepath, ReportList *reports);
-void findMissingFiles(char *basepath, char *str);
+void checkMissingFiles(struct Main *bmain, struct ReportList *reports);
+void makeFilesRelative(struct Main *bmain, const char *basedir, struct ReportList *reports);
+void makeFilesAbsolute(struct Main *bmain, const char *basedir, struct ReportList *reports);
+void findMissingFiles(struct Main *bmain, const char *str);
+
+#define BPATH_USE_PACKED 1
#endif // BLI_BPATH_H
diff --git a/source/blender/blenlib/BLI_cellalloc.h b/source/blender/blenlib/BLI_cellalloc.h
index d2aa7f9ed55..e0fbc581969 100644
--- a/source/blender/blenlib/BLI_cellalloc.h
+++ b/source/blender/blenlib/BLI_cellalloc.h
@@ -42,8 +42,8 @@
//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_malloc(long size, const char *tag);
+void *BLI_cellalloc_calloc(long size, const char *tag);
void BLI_cellalloc_free(void *mem);
void BLI_cellalloc_printleaks(void);
int BLI_cellalloc_get_totblock(void);
diff --git a/source/blender/blenlib/BLI_cpu.h b/source/blender/blenlib/BLI_cpu.h
index d809f1cc594..addcf1273b3 100644
--- a/source/blender/blenlib/BLI_cpu.h
+++ b/source/blender/blenlib/BLI_cpu.h
@@ -1,5 +1,4 @@
/*
- *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,6 +23,10 @@
#ifndef BLI_CPU_H
#define BLI_CPU_H
+/** \file BLI_cpu.h
+ * \ingroup bli
+ */
+
int BLI_cpu_support_sse2(void);
#endif
diff --git a/source/blender/blenlib/BLI_dlrbTree.h b/source/blender/blenlib/BLI_dlrbTree.h
index 4b3768c3547..24c819ada55 100644
--- a/source/blender/blenlib/BLI_dlrbTree.h
+++ b/source/blender/blenlib/BLI_dlrbTree.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
#ifndef BLI_DLRB_TREE_H
#define BLI_DLRB_TREE_H
+/** \file BLI_dlrbTree.h
+ * \ingroup bli
+ * \author Joshua Leung
+ */
+
/* Double-Linked Red-Black Tree Implementation:
*
* This is simply a Red-Black Tree implementation whose nodes can later
diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h
index c5158264e72..ed7a76daa92 100644
--- a/source/blender/blenlib/BLI_dynstr.h
+++ b/source/blender/blenlib/BLI_dynstr.h
@@ -1,12 +1,4 @@
-/**
- * @file BLI_dynstr.h
- *
- * A dynamically sized string ADT.
- * This ADT is designed purely for dynamic string creation
- * through appending, not for general usage, the intent is
- * to build up dynamic strings using a DynStr object, then
- * convert it to a c-string and work with that.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +30,16 @@
#ifndef BLI_DYNSTR_H
#define BLI_DYNSTR_H
+/** \file BLI_dynstr.h
+ * \ingroup bli
+ * \brief A dynamically sized string ADT.
+ * \section aboutdynstr Dynamic String
+ * This ADT is designed purely for dynamic string creation
+ * through appending, not for general usage, the intent is
+ * to build up dynamic strings using a DynStr object, then
+ * convert it to a c-string and work with that.
+ */
+
#include <stdarg.h>
struct DynStr;
@@ -75,7 +77,11 @@ void BLI_dynstr_nappend (DynStr *ds, const char *cstr, int len);
* @param ds The DynStr to append to.
* @param format The printf format string to use.
*/
-void BLI_dynstr_appendf (DynStr *ds, const char *format, ...);
+void BLI_dynstr_appendf (DynStr *ds, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)));
+#endif
+;
void BLI_dynstr_vappendf (DynStr *ds, const char *format, va_list args);
/**
diff --git a/source/blender/blenlib/BLI_edgehash.h b/source/blender/blenlib/BLI_edgehash.h
index 50189328e68..1827d69dcab 100644
--- a/source/blender/blenlib/BLI_edgehash.h
+++ b/source/blender/blenlib/BLI_edgehash.h
@@ -1,6 +1,4 @@
-/**
- * A general unordered 2-int pair hash table ADT
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,12 @@
#ifndef BLI_EDGEHASH_H
#define BLI_EDGEHASH_H
+/** \file BLI_storage.h
+ * \ingroup bli
+ * \author Daniel Dunbar
+ * \brief A general unordered 2-int pair hash table ADT.
+ */
+
#include "MEM_guardedalloc.h"
#include "BKE_utildefines.h"
#include "BLI_mempool.h"
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index 5eefac42ed1..a4fd26d1274 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -1,9 +1,4 @@
-/**
- * blenlib/BLI_editVert.h mar 2001 Nzc
- *
- * Some editing types needed in the lib (unfortunately) for
- * scanfill.c
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +30,14 @@
#ifndef BLI_EDITVERT_H
#define BLI_EDITVERT_H
+/** \file BLI_editVert.h
+ * \ingroup bli
+ * \since March 2001
+ * \author nzc
+ * \brief Some editing types needed in the lib (unfortunately) for
+ * scanfill.c
+ */
+
#include "DNA_customdata_types.h"
#include "DNA_mesh_types.h"
@@ -69,7 +72,7 @@ typedef struct EditVert
unsigned char f, h, f1, f2;
float bweight;
short fast; /* only 0 or 1, for editmesh_fastmalloc, do not store temp data here! */
- int hash;
+ int hash; /* internal editmesh.c use only, don't touch! */
int keyindex; /* original index #, for restoring key information */
void *data; /* custom vertex data */
diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h
index 6c98d30e4b1..59c01348c07 100644
--- a/source/blender/blenlib/BLI_fileops.h
+++ b/source/blender/blenlib/BLI_fileops.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BLI_listBase.h mar 2001 Nzc
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,8 +25,12 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- *
- * More low-level fileops from Daniel Dunbar. Two functions were also
+ */
+
+/** \file BLI_fileops.h
+ * \ingroup bli
+ * \author Daniel Dunbar
+ * \brief More low-level fileops from Daniel Dunbar. Two functions were also
* defined in storage.c. These are the old fop_ prefixes. There is
* definitely some redundancy here!
* */
@@ -36,29 +38,33 @@
#ifndef BLI_FILEOPS_H
#define BLI_FILEOPS_H
-void BLI_recurdir_fileops(char *dirname);
-int BLI_link(char *file, char *to);
-int BLI_is_writable(char *filename);
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void BLI_recurdir_fileops(const char *dirname);
+int BLI_link(const char *file, const char *to);
+int BLI_is_writable(const char *filename);
/**
* @attention Do not confuse with BLI_exist
*/
-int BLI_exists(char *file);
-int BLI_copy_fileops(char *file, char *to);
-int BLI_rename(char *from, char *to);
-int BLI_gzip(char *from, char *to);
-int BLI_delete(char *file, int dir, int recursive);
-int BLI_move(char *file, char *to);
+int BLI_exists(const char *file);
+int BLI_copy_fileops(const char *file, const char *to);
+int BLI_rename(const char *from, const char *to);
+int BLI_gzip(const char *from, const char *to);
+int BLI_delete(const char *file, int dir, int recursive);
+int BLI_move(const char *file, const char *to);
int BLI_touch(const char *file);
-char *BLI_last_slash(const char *string);
-int BLI_add_slash(char *string);
-void BLI_del_slash(char *string);
-char *first_slash(char *string);
/* only for the sane unix world: direct calls to system functions :( */
#ifndef WIN32
void BLI_setCmdCallBack(int (*f)(char*));
#endif
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h
index 1dffb285451..94ae741250f 100644
--- a/source/blender/blenlib/BLI_fnmatch.h
+++ b/source/blender/blenlib/BLI_fnmatch.h
@@ -18,9 +18,12 @@ along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef _FNMATCH_H
-
#define _FNMATCH_H 1
+/** \file BLI_fnmatch.h
+ * \ingroup bli
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h
index d1600868d9b..8f2cd02c35e 100644
--- a/source/blender/blenlib/BLI_ghash.h
+++ b/source/blender/blenlib/BLI_ghash.h
@@ -1,6 +1,4 @@
-/**
- * A general (pointer -> pointer) hash table ADT
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,22 +30,28 @@
#ifndef BLI_GHASH_H
#define BLI_GHASH_H
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+/** \file BLI_ghash.h
+ * \ingroup bli
+ * \brief A general (pointer -> pointer) hash table ADT
+ */
#ifdef __cplusplus
extern "C" {
#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
#include "BKE_utildefines.h"
#include "MEM_guardedalloc.h"
#include "BLI_mempool.h"
#include "BLI_blenlib.h"
-typedef unsigned int (*GHashHashFP) (void *key);
-typedef int (*GHashCmpFP) (void *a, void *b);
+typedef unsigned int (*GHashHashFP) (const void *key);
+typedef int (*GHashCmpFP) (const void *a, const void *b);
typedef void (*GHashKeyFreeFP) (void *key);
typedef void (*GHashValFreeFP) (void *val);
@@ -137,14 +141,14 @@ int BLI_ghashIterator_isDone (GHashIterator *ghi);
/* *** */
-unsigned int BLI_ghashutil_ptrhash (void *key);
-int BLI_ghashutil_ptrcmp (void *a, void *b);
+unsigned int BLI_ghashutil_ptrhash (const void *key);
+int BLI_ghashutil_ptrcmp (const void *a, const void *b);
-unsigned int BLI_ghashutil_strhash (void *key);
-int BLI_ghashutil_strcmp (void *a, void *b);
+unsigned int BLI_ghashutil_strhash (const void *key);
+int BLI_ghashutil_strcmp (const void *a, const void *b);
-unsigned int BLI_ghashutil_inthash (void *ptr);
-int BLI_ghashutil_intcmp(void *a, void *b);
+unsigned int BLI_ghashutil_inthash (const void *ptr);
+int BLI_ghashutil_intcmp(const void *a, const void *b);
/*begin of macro-inlined functions*/
extern unsigned int hashsizes[];
@@ -160,7 +164,7 @@ BM_INLINE void BLI_ghash_insert(GHash *gh, void *key, void *val) {
gh->buckets[hash]= e;
if (++gh->nentries>(float)gh->nbuckets/2) {
- Entry *e, **old= gh->buckets;
+ Entry **old= gh->buckets;
int i, nold= gh->nbuckets;
gh->nbuckets= hashsizes[++gh->cursize];
@@ -183,7 +187,7 @@ BM_INLINE void BLI_ghash_insert(GHash *gh, void *key, void *val) {
}
}
-BM_INLINE void* BLI_ghash_lookup(GHash *gh, void *key)
+BM_INLINE void* BLI_ghash_lookup(GHash *gh, const void *key)
{
if(gh) {
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
@@ -200,7 +204,7 @@ BM_INLINE int BLI_ghash_remove (GHash *gh, void *key, GHashKeyFreeFP keyfreefp,
{
unsigned int hash= gh->hashfp(key)%gh->nbuckets;
Entry *e;
- Entry *p = 0;
+ Entry *p = NULL;
for (e= gh->buckets[hash]; e; e= e->next) {
if (gh->cmpfp(key, e->key)==0) {
diff --git a/source/blender/blenlib/BLI_graph.h b/source/blender/blenlib/BLI_graph.h
index 1dd439468f7..f625c7bb2d4 100644
--- a/source/blender/blenlib/BLI_graph.h
+++ b/source/blender/blenlib/BLI_graph.h
@@ -1,6 +1,10 @@
#ifndef BLI_GRAPH_H_
#define BLI_GRAPH_H_
+/** \file BLI_graph.h
+ * \ingroup bli
+ */
+
#include "DNA_listBase.h"
struct BGraph;
diff --git a/source/blender/blenlib/BLI_gsqueue.h b/source/blender/blenlib/BLI_gsqueue.h
index afc4cb38b10..572c54b7b7e 100644
--- a/source/blender/blenlib/BLI_gsqueue.h
+++ b/source/blender/blenlib/BLI_gsqueue.h
@@ -1,7 +1,4 @@
/*
- * A generic structure queue (a queue for fixed length
- * (generally small) structures.
- *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +30,12 @@
#ifndef BLI_GSQUEUE_H
#define BLI_GSQUEUE_H
+/** \file BLI_gsqueue.h
+ * \ingroup bli
+ * \brief A generic structure queue (a queue for fixed length
+ * (generally small) structures.
+ */
+
typedef struct _GSQueue GSQueue;
/**
diff --git a/source/blender/blenlib/BLI_heap.h b/source/blender/blenlib/BLI_heap.h
index a6663726f8b..3038d026df9 100644
--- a/source/blender/blenlib/BLI_heap.h
+++ b/source/blender/blenlib/BLI_heap.h
@@ -1,6 +1,4 @@
-/**
- * A heap / priority queue ADT
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,11 @@
#ifndef BLI_HEAP_H
#define BLI_HEAP_H
+/** \file BLI_heap.h
+ * \ingroup bli
+ * \brief A heap / priority queue ADT
+ */
+
struct Heap;
struct HeapNode;
typedef struct Heap Heap;
diff --git a/source/blender/blenlib/BLI_jitter.h b/source/blender/blenlib/BLI_jitter.h
index f626feb2ec8..e0fea9306ff 100644
--- a/source/blender/blenlib/BLI_jitter.h
+++ b/source/blender/blenlib/BLI_jitter.h
@@ -1,6 +1,4 @@
/*
- * jitter.h
- *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,9 +30,13 @@
#ifndef BLI_JITTER_H
#define BLI_JITTER_H
-extern void BLI_initjit(float *jitarr, int num);
-extern void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1);
-extern void BLI_jitterate2(float *jit1, float *jit2, int num, float rad2);
+/** \file BLI_jitter.h
+ * \ingroup bli
+ */
+
+void BLI_initjit(float *jitarr, int num);
+void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1);
+void BLI_jitterate2(float *jit1, float *jit2, int num, float rad2);
#endif
diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h
index d9e3d7e42c6..d0943408dc5 100644
--- a/source/blender/blenlib/BLI_kdopbvh.h
+++ b/source/blender/blenlib/BLI_kdopbvh.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +31,12 @@
#ifndef BLI_KDOPBVH_H
#define BLI_KDOPBVH_H
+/** \file BLI_kdopbvh.h
+ * \ingroup bli
+ * \author Daniel Genrich
+ * \author Andre Pinto
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -90,7 +95,7 @@ int BLI_bvhtree_update_node(BVHTree *tree, int index, float *co, float *co_movin
void BLI_bvhtree_update_tree(BVHTree *tree);
/* collision/overlap: check two trees if they overlap, alloc's *overlap with length of the int return value */
-BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result);
+BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int *result);
float BLI_bvhtree_getepsilon(BVHTree *tree);
diff --git a/source/blender/blenlib/BLI_kdtree.h b/source/blender/blenlib/BLI_kdtree.h
index 95f9e6939d0..c607dae386f 100644
--- a/source/blender/blenlib/BLI_kdtree.h
+++ b/source/blender/blenlib/BLI_kdtree.h
@@ -1,6 +1,4 @@
-/**
- * A kd-tree for nearest neighbour search.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +31,13 @@
#ifndef BLI_KDTREE_H
#define BLI_KDTREE_H
+/** \file BLI_kdtree.h
+ * \ingroup bli
+ * \brief A kd-tree for nearest neighbour search.
+ * \author Janne Karhu
+ * \author Brecht van Lommel
+ */
+
struct KDTree;
typedef struct KDTree KDTree;
diff --git a/source/blender/blenlib/BLI_linklist.h b/source/blender/blenlib/BLI_linklist.h
index b10d48e3ee6..95850c44ea1 100644
--- a/source/blender/blenlib/BLI_linklist.h
+++ b/source/blender/blenlib/BLI_linklist.h
@@ -1,7 +1,4 @@
/*
- * Routines for working with singly linked lists
- * of 'links' - pointers to other data.
- *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +30,13 @@
#ifndef BLI_LINKLIST_H
#define BLI_LINKLIST_H
+/** \file BLI_linklist.h
+ * \ingroup bli
+ * \brief Routines for working with singly linked lists
+ * of 'links' - pointers to other data.
+ *
+ */
+
struct MemArena;
typedef void (*LinkNodeFreeFP)(void *link);
diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h
index c4dc0894f80..73af9a3738c 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -25,13 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- *
- * $Id$
*/
#ifndef BLI_LISTBASE_H
#define BLI_LISTBASE_H
+/** \file BLI_listbase.h
+ * \ingroup bli
+ */
+
#include "DNA_listBase.h"
//struct ListBase;
//struct LinkData;
@@ -40,13 +42,12 @@
extern "C" {
#endif
-void addlisttolist(struct ListBase *list1, struct ListBase *list2);
void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
-void *BLI_findlink(struct ListBase *listbase, int number);
-int BLI_findindex(struct ListBase *listbase, void *vlink);
-void *BLI_findstring(struct ListBase *listbase, const char *id, int offset);
-void *BLI_findstring_ptr(struct ListBase *listbase, const char *id, int offset);
-int BLI_findstringindex(struct ListBase *listbase, const char *id, int offset);
+void *BLI_findlink(const struct ListBase *listbase, int number);
+int BLI_findindex(const struct ListBase *listbase, void *vlink);
+void *BLI_findstring(const struct ListBase *listbase, const char *id, const int offset);
+void *BLI_findstring_ptr(const struct ListBase *listbase, const char *id, const int offset);
+int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset);
void BLI_freelistN(struct ListBase *listbase);
void BLI_addtail(struct ListBase *listbase, void *vlink);
void BLI_remlink(struct ListBase *listbase, void *vlink);
@@ -57,9 +58,11 @@ void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnew
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink);
void BLI_sortlist(struct ListBase *listbase, int (*cmp)(void *, void *));
void BLI_freelist(struct ListBase *listbase);
-int BLI_countlist(struct ListBase *listbase);
+int BLI_countlist(const struct ListBase *listbase);
void BLI_freelinkN(struct ListBase *listbase, void *vlink);
-void BLI_duplicatelist(struct ListBase *list1, const struct ListBase *list2);
+
+void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src);
+void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src);
/* create a generic list node containing link to provided data */
struct LinkData *BLI_genericNodeN(void *data);
diff --git a/source/blender/blenlib/BLI_math.h b/source/blender/blenlib/BLI_math.h
index d0fb530e349..890a5ee4018 100644
--- a/source/blender/blenlib/BLI_math.h
+++ b/source/blender/blenlib/BLI_math.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,32 +25,33 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH
-#define BLI_MATH
+#ifndef BLI_MATH_H
+#define BLI_MATH_H
-/* Abbreviations:
+/** \file BLI_math.h
+ * \ingroup bli
+ * \section mathabbrev Abbreviations
*
- * fl = float
- * db = double
- * v2 = vec2 = vector 2
- * v3 = vec3 = vector 3
- * v4 = vec4 = vector 4
- * qt = quat = quaternion
- * dq = dquat = dual quaternion
- * m2 = mat2 = matrix 2x2
- * m3 = mat3 = matrix 3x3
- * m4 = mat4 = matrix 4x4
- * eul = euler rotation
- * eulO = euler with order
+ * - fl = float
+ * - db = double
+ * - v2 = vec2 = vector 2
+ * - v3 = vec3 = vector 3
+ * - v4 = vec4 = vector 4
+ * - qt = quat = quaternion
+ * - dq = dquat = dual quaternion
+ * - m2 = mat2 = matrix 2x2
+ * - m3 = mat3 = matrix 3x3
+ * - m4 = mat4 = matrix 4x4
+ * - eul = euler rotation
+ * - eulO = euler with order
*
- * Variable Names:
- *
- * f = single value
- * a, b, c = vectors
- * r = result vector
- * A, B, C = matrices
- * R = result matrix
+ * \section mathvarnames Variable Names
*
+ * - f = single value
+ * - a, b, c = vectors
+ * - r = result vector
+ * - A, B, C = matrices
+ * - R = result matrix
*/
#include "BLI_math_base.h"
@@ -60,5 +61,5 @@
#include "BLI_math_vector.h"
#include "BLI_math_geom.h"
-#endif /* BLI_MATH */
+#endif /* BLI_MATH_H */
diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index bb20cb7c8e1..6ff57b08724 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_BASE
-#define BLI_MATH_BASE
+#ifndef BLI_MATH_BASE_H
+#define BLI_MATH_BASE_H
-#ifdef __cplusplus
-extern "C" {
-#endif
+/** \file BLI_math_base.h
+ * \ingroup bli
+ */
#ifdef WIN32
#define _USE_MATH_DEFINES
@@ -70,6 +70,11 @@ extern "C" {
#define M_LN10 2.30258509299404568402
#endif
+/* non-standard defines, used in some places */
+#ifndef MAXFLOAT
+#define MAXFLOAT ((float)3.40282347e+38)
+#endif
+
#ifndef sqrtf
#define sqrtf(a) ((float)sqrt(a))
#endif
@@ -123,6 +128,7 @@ extern "C" {
#ifndef FREE_WINDOWS
#define isnan(n) _isnan(n)
#define finite _finite
+#define hypot _hypot
#endif
#endif
@@ -134,7 +140,7 @@ extern "C" {
#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
#endif
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_base_inline.c"
#endif
@@ -155,15 +161,18 @@ MINLINE float interpf(float a, float b, float t);
MINLINE float minf(float a, float b);
MINLINE float maxf(float a, float b);
+MINLINE float signf(float f);
+
MINLINE float power_of_2(float f);
MINLINE float shell_angle_to_dist(float angle);
-double double_round(double x, int ndigits);
-
-#ifdef __cplusplus
-}
+#if (defined(WIN32) || defined(WIN64)) && !defined(FREE_WINDOWS)
+extern double copysign(double x, double y);
+extern double round(double x);
#endif
-#endif /* BLI_MATH_BASE */
+double double_round(double x, int ndigits);
+
+#endif /* BLI_MATH_BASE_H */
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index d3f1a842e45..cc443621fa9 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_COLOR
-#define BLI_MATH_COLOR
+#ifndef BLI_MATH_COLOR_H
+#define BLI_MATH_COLOR_H
+
+/** \file BLI_math_color.h
+ * \ingroup bli
+ */
#ifdef __cplusplus
extern "C" {
@@ -61,6 +65,7 @@ void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace);
void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
+void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv);
unsigned int rgb_to_cpack(float r, float g, float b);
unsigned int hsv_to_cpack(float h, float s, float v);
@@ -75,6 +80,12 @@ float srgb_to_linearrgb(float c);
float linearrgb_to_srgb(float c);
void srgb_to_linearrgb_v3_v3(float *col_to, float *col_from);
void linearrgb_to_srgb_v3_v3(float *col_to, float *col_from);
+
+/* rgba buffer convenience functions */
+void srgb_to_linearrgb_rgba_buf(float *col, int tot);
+void linearrgb_to_srgb_rgba_buf(float *col, int tot);
+void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
+void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
/* rgba buffer convenience functions */
void srgb_to_linearrgb_rgba_buf(float *col, int tot);
@@ -86,17 +97,20 @@ void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot);
int constrain_rgb(float *r, float *g, float *b);
void minmax_rgb(short c[3]);
-
+
+void rgb_float_set_hue_float_offset(float * rgb, float hue_offset);
+void rgb_byte_set_hue_float_offset(unsigned char * rgb, float hue_offset);
+
/***************** lift/gamma/gain / ASC-CDL conversion *****************/
void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power);
-void rgb_byte_to_float(char *in, float *out);
-void rgb_float_to_byte(float *in, char *out);
+void rgb_byte_to_float(const unsigned char *in, float *out);
+void rgb_float_to_byte(const float *in, unsigned char *out);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_COLOR */
+#endif /* BLI_MATH_COLOR_H */
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 5d84de7531a..8d2f9ffa38b 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_GEOM
-#define BLI_MATH_GEOM
+#ifndef BLI_MATH_GEOM_H
+#define BLI_MATH_GEOM_H
+
+/** \file BLI_math_geom.h
+ * \ingroup bli
+ */
#ifdef __cplusplus
extern "C" {
@@ -34,7 +38,7 @@ extern "C" {
#include "BLI_math_inline.h"
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_geom_inline.c"
#endif
@@ -58,7 +62,8 @@ float dist_to_line_v2(float p[2], float l1[2], float l2[2]);
float dist_to_line_segment_v2(float p[2], float l1[2], float l2[2]);
float dist_to_line_segment_v3(float p[3], float l1[3], float l2[3]);
-float closest_to_line_v3(float r[3], float p[3], float l1[3], float l2[3]);
+float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
+float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]);
/******************************* Intersection ********************************/
@@ -71,8 +76,9 @@ void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]
#define ISECT_LINE_LINE_EXACT 1
#define ISECT_LINE_LINE_CROSS 2
-int isect_line_line_v2(float a1[2], float a2[2], float b1[2], float b2[2]);
-int isect_line_line_v2_short(short a1[2], short a2[2], short b1[2], short b2[2]);
+int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
+int isect_line_line_v2_short(const short a1[2], const short a2[2], const short b1[2], const short b2[2]);
+int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2]);
/* Returns the number of point of interests
* 0 - lines are colinear
@@ -96,7 +102,6 @@ int isect_ray_tri_epsilon_v3(float p1[3], float d[3],
float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float epsilon);
/* point in polygon */
-int isect_point_tri_v2(float p[2], float a[2], float b[2], float c[2]);
int isect_point_quad_v2(float p[2], float a[2], float b[2], float c[2], float d[2]);
int isect_point_tri_v2(float v1[2], float v2[2], float v3[2], float pt[2]);
@@ -119,6 +124,8 @@ int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3
int clip_line_plane(float clipco[3], float plane[4], float co[3]);
+void plot_line_v2v2i(int p1[2], int p2[2], int (*callback)(int, int, void *), void *userData);
+
/****************************** Interpolation ********************************/
/* tri or quad, d can be NULL */
@@ -149,6 +156,8 @@ void perspective_m4(float mat[4][4], float left, float right,
float bottom, float top, float nearClip, float farClip);
void orthographic_m4(float mat[4][4], float left, float right,
float bottom, float top, float nearClip, float farClip);
+void window_translate_m4(float winmat[][4], float perspmat[][4],
+ float x, float y);
int box_clip_bounds_m4(float boundbox[2][3],
float bounds[4], float winmat[4][4]);
@@ -163,8 +172,8 @@ void map_to_sphere(float *u, float *v, float x, float y, float z);
/********************************* Tangents **********************************/
typedef struct VertexTangent {
- float tang[3], uv[2];
struct VertexTangent *next;
+ float tang[3], uv[2];
} VertexTangent;
float *find_vertex_tangent(VertexTangent *vtang, float *uv);
@@ -205,5 +214,5 @@ float form_factor_hemi_poly(float p[3], float n[3],
}
#endif
-#endif /* BLI_MATH_GEOM */
+#endif /* BLI_MATH_GEOM_H */
diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h
index d002c0880b2..0f8493e25a6 100644
--- a/source/blender/blenlib/BLI_math_inline.h
+++ b/source/blender/blenlib/BLI_math_inline.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,14 +28,18 @@
#ifndef BLI_MATH_INLINE_H
#define BLI_MATH_INLINE_H
+/** \file BLI_math_inline.h
+ * \ingroup bli
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
/* add platform/compiler checks here if it is not supported */
-#define BLI_MATH_INLINE
+#define BLI_MATH_INLINE_H
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#ifdef _MSC_VER
#define MINLINE static __forceinline
#define MALWAYS_INLINE MINLINE
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index 77ebcb24975..939c4348461 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_MATRIX
-#define BLI_MATH_MATRIX
+#ifndef BLI_MATH_MATRIX_H
+#define BLI_MATH_MATRIX_H
+
+/** \file BLI_math_matrix.h
+ * \ingroup bli
+ */
#ifdef __cplusplus
extern "C" {
@@ -102,7 +106,9 @@ void transpose_m3(float R[3][3]);
void transpose_m4(float R[4][4]);
void normalize_m3(float R[3][3]);
+void normalize_m3_m3(float R[3][3], float A[3][3]);
void normalize_m4(float R[4][4]);
+void normalize_m4_m4(float R[4][4], float A[4][4]);
void orthogonalize_m3(float R[3][3], int axis);
void orthogonalize_m4(float R[4][4], int axis);
@@ -133,36 +139,42 @@ void scale_m4_fl(float R[4][4], float scale);
float mat3_to_scale(float M[3][3]);
float mat4_to_scale(float M[4][4]);
-void size_to_mat3(float R[3][3], float size[3]);
-void size_to_mat4(float R[4][4], float size[3]);
+void size_to_mat3(float R[3][3], const float size[3]);
+void size_to_mat4(float R[4][4], const float size[3]);
void mat3_to_size(float r[3], float M[3][3]);
void mat4_to_size(float r[3], float M[4][4]);
void translate_m4(float mat[4][4], float tx, float ty, float tz);
-void rotate_m4(float mat[4][4], char axis, float angle);
+void rotate_m4(float mat[4][4], const char axis, const float angle);
+
+
+void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[][3]);
+void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[][4]);
void loc_eul_size_to_mat4(float R[4][4],
- float loc[3], float eul[3], float size[3]);
+ const float loc[3], const float eul[3], const float size[3]);
void loc_eulO_size_to_mat4(float R[4][4],
- float loc[3], float eul[3], float size[3], short order);
+ const float loc[3], const float eul[3], const float size[3], const short order);
void loc_quat_size_to_mat4(float R[4][4],
- float loc[3], float quat[4], float size[3]);
+ const float loc[3], const float quat[4], const float size[3]);
+void loc_axisangle_size_to_mat4(float R[4][4],
+ const float loc[3], const float axis[4], const float angle, const float size[3]);
-void blend_m3_m3m3(float R[3][3], float A[3][3], float B[3][3], float t);
-void blend_m4_m4m4(float R[4][4], float A[4][4], float B[4][4], float t);
+void blend_m3_m3m3(float R[3][3], float A[3][3], float B[3][3], const float t);
+void blend_m4_m4m4(float R[4][4], float A[4][4], float B[4][4], const float t);
int is_negative_m3(float mat[3][3]);
int is_negative_m4(float mat[4][4]);
/*********************************** Other ***********************************/
-void print_m3(char *str, float M[3][3]);
-void print_m4(char *str, float M[3][4]);
+void print_m3(const char *str, float M[3][3]);
+void print_m4(const char *str, float M[3][4]);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_MATRIX */
+#endif /* BLI_MATH_MATRIX_H */
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h
index ac8ed041ebc..d1f5fa89c3d 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_ROTATION
-#define BLI_MATH_ROTATION
+#ifndef BLI_MATH_ROTATION_H
+#define BLI_MATH_ROTATION_H
+
+/** \file BLI_math_rotation.h
+ * \ingroup bli
+ */
#ifdef __cplusplus
extern "C" {
@@ -39,6 +43,7 @@ extern "C" {
/* stored in (w, x, y, z) order */
/* init */
+void unit_axis_angle(float axis[3], float *angle);
void unit_qt(float q[4]);
void copy_qt_qt(float q[4], const float a[4]);
@@ -48,29 +53,30 @@ void mul_qt_v3(const float q[4], float r[3]);
void mul_qt_fl(float q[4], const float f);
void mul_fac_qt_fl(float q[4], const float f);
-void sub_qt_qtqt(float q[4], float a[4], float b[4]);
+void sub_qt_qtqt(float q[4], const float a[4], const float b[4]);
void invert_qt(float q[4]);
-void invert_qt_qt(float *q1, const float *q2);
+void invert_qt_qt(float q1[4], const float q2[4]);
void conjugate_qt(float q[4]);
-float dot_qtqt(float a[4], float b[4]);
-void normalize_qt(float q[4]);
+float dot_qtqt(const float a[4], const float b[4]);
+float normalize_qt(float q[4]);
+float normalize_qt_qt(float q1[4], const float q2[4]);
/* comparison */
int is_zero_qt(float q[4]);
/* interpolation */
-void interp_qt_qtqt(float q[4], float a[4], float b[4], float t);
-void add_qt_qtqt(float q[4], float a[4], float b[4], float t);
+void interp_qt_qtqt(float q[4], const float a[4], const float b[4], const float t);
+void add_qt_qtqt(float q[4], const float a[4], const float b[4], const float t);
/* conversion */
-void quat_to_mat3(float mat[3][3], float q[4]);
-void quat_to_mat4(float mat[4][4], float q[4]);
+void quat_to_mat3(float mat[3][3], const float q[4]);
+void quat_to_mat4(float mat[4][4], const float q[4]);
void mat3_to_quat(float q[4], float mat[3][3]);
void mat4_to_quat(float q[4], float mat[4][4]);
-void tri_to_quat(float q[4], float a[3], float b[3], float c[3]);
-void vec_to_quat(float q[4], float vec[3], short axis, short upflag);
+void tri_to_quat(float q[4], const float a[3], const float b[3], const float c[3]);
+void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag);
/* note: v1 and v2 must be normalized */
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3]);
void rotation_between_quats_to_quat(float q[4], const float q1[4], const float q2[4]);
@@ -84,11 +90,11 @@ void print_qt(char *str, float q[4]);
/******************************** Axis Angle *********************************/
/* conversion */
-void axis_angle_to_quat(float r[4], float axis[3], float angle);
-void axis_angle_to_mat3(float R[3][3], float axis[3], float angle);
-void axis_angle_to_mat4(float R[4][4], float axis[3], float angle);
+void axis_angle_to_quat(float r[4], const float axis[3], float angle);
+void axis_angle_to_mat3(float R[3][3], const float axis[3], const float angle);
+void axis_angle_to_mat4(float R[4][4], const float axis[3], const float angle);
-void quat_to_axis_angle(float axis[3], float *angle, float q[4]);
+void quat_to_axis_angle(float axis[3], float *angle, const float q[4]);
void mat3_to_axis_angle(float axis[3], float *angle, float M[3][3]);
void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
@@ -100,24 +106,24 @@ void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
void mat3_to_vec_rot(float vec[3], float *phi, float mat[3][3]);
void mat4_to_vec_rot(float vec[3], float *phi, float mat[4][4]);
-void vec_rot_to_quat(float quat[4], float vec[3], float phi);
-void vec_rot_to_mat3(float mat[3][3], float vec[3], float phi);
-void vec_rot_to_mat4(float mat[4][4], float vec[3], float phi);
+void vec_rot_to_quat(float quat[4], const float vec[3], const float phi);
+void vec_rot_to_mat3(float mat[3][3], const float vec[3], const float phi);
+void vec_rot_to_mat4(float mat[4][4], const float vec[3], const float phi);
/******************************** XYZ Eulers *********************************/
-void eul_to_quat(float quat[4], float eul[3]);
-void eul_to_mat3(float mat[3][3], float eul[3]);
-void eul_to_mat4(float mat[4][4], float eul[3]);
+void eul_to_quat(float quat[4], const float eul[3]);
+void eul_to_mat3(float mat[3][3], const float eul[3]);
+void eul_to_mat4(float mat[4][4], const float eul[3]);
-void quat_to_eul(float eul[3], float quat[4]);
+void quat_to_eul(float eul[3], const float quat[4]);
void mat3_to_eul(float eul[3], float mat[3][3]);
void mat4_to_eul(float eul[3], float mat[4][4]);
-void compatible_eul(float eul[3], float old[3]);
-void mat3_to_compatible_eul(float eul[3], float old[3], float mat[3][3]);
+void compatible_eul(float eul[3], const float old[3]);
+void mat3_to_compatible_eul(float eul[3], const float old[3], float mat[3][3]);
-void rotate_eul(float eul[3], char axis, float angle);
+void rotate_eul(float eul[3], const char axis, const float angle);
/************************** Arbitrary Order Eulers ***************************/
@@ -131,22 +137,23 @@ typedef enum eEulerRotationOrders {
EULER_ORDER_YXZ,
EULER_ORDER_YZX,
EULER_ORDER_ZXY,
- EULER_ORDER_ZYX,
+ EULER_ORDER_ZYX
/* there are 6 more entries with dulpicate entries included */
} eEulerRotationOrders;
-void eulO_to_quat(float quat[4], float eul[3], short order);
-void eulO_to_mat3(float mat[3][3], float eul[3], short order);
-void eulO_to_mat4(float mat[4][4], float eul[3], short order);
-void eulO_to_axis_angle(float axis[3], float *angle, float eul[3], short order);
-void eulO_to_gimbal_axis(float gmat[3][3], float eul[3], short order);
+void eulO_to_quat(float quat[4], const float eul[3], const short order);
+void eulO_to_mat3(float mat[3][3], const float eul[3], const short order);
+void eulO_to_mat4(float mat[4][4], const float eul[3], const short order);
+void eulO_to_axis_angle(float axis[3], float *angle, const float eul[3], const short order);
+void eulO_to_gimbal_axis(float gmat[3][3], const float eul[3], const short order);
-void quat_to_eulO(float eul[3], short order, float quat[4]);
-void mat3_to_eulO(float eul[3], short order, float mat[3][3]);
-void mat4_to_eulO(float eul[3], short order, float mat[4][4]);
-void axis_angle_to_eulO(float eul[3], short order, float axis[3], float angle);
+void quat_to_eulO(float eul[3], const short order, const float quat[4]);
+void mat3_to_eulO(float eul[3], const short order, float mat[3][3]);
+void mat4_to_eulO(float eul[3], const short order, float mat[4][4]);
+void axis_angle_to_eulO(float eul[3], const short order, const float axis[3], const float angle);
void mat3_to_compatible_eulO(float eul[3], float old[3], short order, float mat[3][3]);
+void mat4_to_compatible_eulO(float eul[3], float old[3], short order, float mat[4][4]);
void rotate_eulO(float eul[3], short order, char axis, float angle);
@@ -168,6 +175,9 @@ void mul_v3m3_dq(float r[3], float R[3][3], DualQuat *dq);
void mat4_to_dquat(DualQuat *r, float base[4][4], float M[4][4]);
void dquat_to_mat4(float R[4][4], DualQuat *dq);
+void quat_apply_track(float quat[4], short axis, short upflag);
+void vec_apply_track(float vec[3], short axis);
+
float lens_to_angle(float lens);
float angle_to_lens(float angle);
@@ -175,5 +185,5 @@ float angle_to_lens(float angle);
}
#endif
-#endif /* BLI_MATH_ROTATION */
+#endif /* BLI_MATH_ROTATION_H */
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 0749e657f08..1f56694f85b 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* ***** END GPL LICENSE BLOCK *****
* */
-#ifndef BLI_MATH_VECTOR
-#define BLI_MATH_VECTOR
+#ifndef BLI_MATH_VECTOR_H
+#define BLI_MATH_VECTOR_H
+
+/** \file BLI_math_vector.h
+ * \ingroup bli
+ */
#ifdef __cplusplus
extern "C" {
@@ -34,7 +38,7 @@ extern "C" {
#include "BLI_math_inline.h"
-#ifdef BLI_MATH_INLINE
+#ifdef BLI_MATH_INLINE_H
#include "intern/math_vector_inline.c"
#else
#define MINLINE
@@ -65,6 +69,8 @@ MINLINE void sub_v2_v2(float r[2], const float a[2]);
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2]);
MINLINE void sub_v3_v3(float r[3], const float a[3]);
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3]);
+MINLINE void sub_v4_v4(float r[4], const float a[4]);
+MINLINE void sub_v4_v4v4(float r[4], const float a[4], const float b[4]);
MINLINE void mul_v2_fl(float r[2], float f);
MINLINE void mul_v2_v2fl(float r[2], const float a[2], float f);
@@ -84,6 +90,8 @@ MINLINE void madd_v4_v4fl(float r[4], const float a[4], float f);
MINLINE void negate_v3(float r[3]);
MINLINE void negate_v3_v3(float r[3], const float a[3]);
+MINLINE void negate_v4(float r[4]);
+MINLINE void negate_v4_v4(float r[4], const float a[3]);
MINLINE float dot_v2v2(const float a[2], const float b[2]);
MINLINE float dot_v3v3(const float a[3], const float b[3]);
@@ -97,6 +105,7 @@ MINLINE void star_m3_v3(float R[3][3],float a[3]);
MINLINE float len_v2(const float a[2]);
MINLINE float len_v2v2(const float a[2], const float b[2]);
+MINLINE float len_squared_v2v2(const float a[3], const float b[3]);
MINLINE float len_v3(const float a[3]);
MINLINE float len_v3v3(const float a[3], const float b[3]);
MINLINE float len_squared_v3v3(const float a[3], const float b[3]);
@@ -116,40 +125,47 @@ void interp_v3_v3v3v3v3(float p[3], const float v1[3], const float v2[3], const
void interp_v4_v4v4(float r[4], const float a[4], const float b[4], const float t);
void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const float v3[4], const float w[3]);
-void mid_v3_v3v3(float r[3], float a[3], float b[3]);
+void mid_v3_v3v3(float r[3], const float a[3], const float b[3]);
/********************************* Comparison ********************************/
-MINLINE int is_zero_v3(float a[3]);
-MINLINE int is_one_v3(float a[3]);
+MINLINE int is_zero_v3(const float a[3]);
+MINLINE int is_zero_v4(const float a[4]);
+MINLINE int is_one_v3(const float a[3]);
+
+MINLINE int equals_v2v2(const float *v1, const float *v2);
+MINLINE int equals_v3v3(const float a[3], const float b[3]);
+MINLINE int compare_v3v3(const float a[3], const float b[3], const float limit);
+MINLINE int compare_len_v3v3(const float a[3], const float b[3], const float limit);
-MINLINE int equals_v3v3(float a[3], float b[3]);
-MINLINE int compare_v3v3(float a[3], float b[3], float limit);
-MINLINE int compare_len_v3v3(float a[3], float b[3], float limit);
+MINLINE int compare_v4v4(const float a[4], const float b[4], const float limit);
+MINLINE int equals_v4v4(const float a[4], const float b[4]);
-MINLINE int compare_v4v4(float a[4], float b[4], float limit);
-MINLINE int equals_v4v4(float a[4], float b[4]);
+MINLINE float line_point_side_v2(const float l1[2], const float l2[2], const float pt[2]);
/********************************** Angles ***********************************/
/* - angle with 2 arguments is angle between vector */
/* - angle with 3 arguments is angle between 3 points at the middle point */
/* - angle_normalized_* is faster equivalent if vectors are normalized */
-float angle_v2v2(float a[2], float b[2]);
-float angle_v2v2v2(float a[2], float b[2], float c[2]);
-float angle_normalized_v2v2(float a[2], float b[2]);
-float angle_v3v3(float a[2], float b[2]);
-float angle_v3v3v3(float a[2], float b[2], float c[2]);
+float angle_v2v2(const float a[2], const float b[2]);
+float angle_v2v2v2(const float a[2], const float b[2], const float c[2]);
+float angle_normalized_v2v2(const float a[2], const float b[2]);
+float angle_v3v3(const float a[3], const float b[3]);
+float angle_v3v3v3(const float a[3], const float b[3], const float c[3]);
float angle_normalized_v3v3(const float v1[3], const float v2[3]);
void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const float v3[3]);
void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3]);
/********************************* Geometry **********************************/
-void project_v3_v3v3(float r[3], float p[3], float n[3]);
-void reflect_v3_v3v3(float r[3], float v[3], float n[3]);
-void ortho_basis_v3v3_v3(float r1[3], float r2[3], float a[3]);
-void bisect_v3_v3v3v3(float r[3], float a[3], float b[3], float c[3]);
+void project_v2_v2v2(float c[2], const float v1[2], const float v2[2]);
+void project_v3_v3v3(float r[3], const float p[3], const float n[3]);
+void reflect_v3_v3v3(float r[3], const float v[3], const float n[3]);
+void ortho_basis_v3v3_v3(float r1[3], float r2[3], const float a[3]);
+void bisect_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]);
+void rotate_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
+void rotate_normalized_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
/*********************************** Other ***********************************/
@@ -160,11 +176,25 @@ void print_v4(const char *str, const float a[4]);
MINLINE void normal_short_to_float_v3(float r[3], const short n[3]);
MINLINE void normal_float_to_short_v3(short r[3], const float n[3]);
-void minmax_v3_v3v3(float r[3], float min[3], float max[3]);
+void minmax_v3v3_v3(float min[3], float max[3], const float vec[3]);
+
+/***************************** Array Functions *******************************/
+/* attempted to follow fixed length vertex functions. names could be improved*/
+void range_vni(int *array, const int size, const int start);
+void negate_vn(float *array_tar, const int size);
+void negate_vn_vn(float *array_tar, const float *array_src, const int size);
+void mul_vn_fl(float *array, const int size, const float f);
+void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f);
+void add_vn_vn(float *array_tar, const float *array_src, const int size);
+void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void sub_vn_vn(float *array_tar, const float *array_src, const int size);
+void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
+void fill_vni(int *array_tar, const int size, const int val);
+void fill_vn(float *array_tar, const int size, const float val);
#ifdef __cplusplus
}
#endif
-#endif /* BLI_MATH_VECTOR */
+#endif /* BLI_MATH_VECTOR_H */
diff --git a/source/blender/blenlib/BLI_memarena.h b/source/blender/blenlib/BLI_memarena.h
index a17c88b70df..f6e919d8d65 100644
--- a/source/blender/blenlib/BLI_memarena.h
+++ b/source/blender/blenlib/BLI_memarena.h
@@ -1,6 +1,4 @@
/*
- * Memory arena ADT
- *
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,11 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- *
+ */
+
+/** \file BLI_memarena.h
+ * \ingroup bli
+ * \brief Memory arena ADT.
+ * \section aboutmemarena Memory Arena
* Memory arena's are commonly used when the program
* needs to quickly allocate lots of little bits of
* data, which are all freed at the same moment.
- *
*/
#ifndef BLI_MEMARENA_H
diff --git a/source/blender/blenlib/BLI_mempool.h b/source/blender/blenlib/BLI_mempool.h
index 62714defd21..5aa9c196b39 100644
--- a/source/blender/blenlib/BLI_mempool.h
+++ b/source/blender/blenlib/BLI_mempool.h
@@ -1,7 +1,5 @@
-/**
- * Simple fast memory allocator
- *
- *
+/*
+ * $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -31,22 +29,24 @@
#ifndef BLI_MEMPOOL_H
#define BLI_MEMPOOL_H
+/** \file BLI_mempool.h
+ * \ingroup bli
+ * \author Geoffrey Bantle
+ * \brief Simple fast memory allocator.
+ */
+
#ifdef __cplusplus
extern "C"
{
#endif
+struct BLI_mempool;
+
#include "BKE_utildefines.h"
#include "BLI_listbase.h"
#include "BLI_blenlib.h"
#include <string.h>
-#ifndef BLI_MEMPOOL_INTERN
-//struct BLI_mempool;
-//struct BLI_mempool_chunk;
-//typedef struct BLI_mempool BLI_mempool;
-#endif
-
typedef struct BLI_freenode{
struct BLI_freenode *next;
int freeword; /*used to identify this as a freed node*/
diff --git a/source/blender/blenlib/BLI_noise.h b/source/blender/blenlib/BLI_noise.h
index 11587262645..bd88529b3dc 100644
--- a/source/blender/blenlib/BLI_noise.h
+++ b/source/blender/blenlib/BLI_noise.h
@@ -31,6 +31,10 @@
#ifndef BLI_NOISE_H
#define BLI_NOISE_H
+/** \file BLI_noise.h
+ * \ingroup bli
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -57,7 +61,6 @@ void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtyp
float cellNoise(float x, float y, float z);
void cellNoiseV(float x, float y, float z, float *ca);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index b8c886d95a9..b3d657b7323 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BLI_storage_types.h
- *
- * Some types for dealing with directories
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,10 @@
#ifndef BLI_PATH_UTIL_H
#define BLI_PATH_UTIL_H
+/** \file BLI_path_util.h
+ * \ingroup bli
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -42,8 +42,9 @@ struct direntry;
char *BLI_getDefaultDocumentFolder(void);
-char *BLI_get_folder(int folder_id, char *subfolder);
-char *BLI_get_folder_create(int folder_id, char *subfolder);
+char *BLI_get_folder(int folder_id, const char *subfolder);
+char *BLI_get_folder_create(int folder_id, const char *subfolder);
+char *BLI_get_user_folder_notest(int folder_id, const char *subfolder);
/* folder_id */
@@ -87,24 +88,40 @@ char *BLI_get_folder_create(int folder_id, char *subfolder);
#define BLENDER_SYSTEM_FORMAT "%s/blender/%s"
#endif
+#ifdef WIN32
+#define SEP '\\'
+#define ALTSEP '/'
+#else
+#define SEP '/'
+#define ALTSEP '\\'
+#endif
+
void BLI_setenv(const char *env, const char *val);
void BLI_setenv_if_new(const char *env, const char* val);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
void BLI_make_exist(char *dir);
-void BLI_make_existing_file(char *name);
+void BLI_make_existing_file(const char *name);
void BLI_split_dirfile(const char *string, char *dir, char *file);
-void BLI_join_dirfile(char *string, const char *dir, const char *file);
+void BLI_join_dirfile(char *string, const int maxlen, const char *dir, const char *file);
char *BLI_path_basename(char *path);
int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char *base_dir, const char *src_dir, const char *dest_dir);
+char *BLI_last_slash(const char *string);
+int BLI_add_slash(char *string);
+void BLI_del_slash(char *string);
+char *BLI_first_slash(char *string);
+
void BLI_getlastdir(const char* dir, char *last, int maxlen);
int BLI_testextensie(const char *str, const char *ext);
int BLI_testextensie_array(const char *str, const char **ext_array);
+int BLI_testextensie_glob(const char *str, const char *ext_fnmatch);
int BLI_replace_extension(char *path, int maxlen, const char *ext);
void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len);
+int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len);
void BLI_newname(char * name, int add);
int BLI_stringdec(const char *string, char *head, char *start, unsigned short *numlen);
void BLI_stringenc(char *string, const char *head, const char *tail, unsigned short numlen, int pic);
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim);
void BLI_splitdirstring(char *di,char *fi);
/* make sure path separators conform to system one */
@@ -164,7 +181,7 @@ void BLI_char_switch(char *string, char from, char to);
* @param fullname The full path and full name of the executable
* @param name The name of the executable (usually argv[0]) to be checked
*/
-void BLI_where_am_i(char *fullname, const char *name);
+void BLI_where_am_i(char *fullname, const int maxlen, const char *name);
char *get_install_dir(void);
/**
@@ -175,7 +192,7 @@ char *get_install_dir(void);
*
* @param fullname The full path to the temp directory
*/
-void BLI_where_is_temp(char *fullname, int usertemp);
+void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp);
#ifdef WITH_ICONV
diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h
index 4797aeb2364..bde6bc3ced4 100644
--- a/source/blender/blenlib/BLI_pbvh.h
+++ b/source/blender/blenlib/BLI_pbvh.h
@@ -1,6 +1,4 @@
-/**
- * A BVH for high poly meshes.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +23,11 @@
#ifndef BLI_PBVH_H
#define BLI_PBVH_H
+/** \file BLI_pbvh.h
+ * \ingroup bli
+ * \brief A BVH for high poly meshes.
+ */
+
struct MFace;
struct MVert;
struct DMGridAdjacency;
@@ -119,7 +122,7 @@ void BLI_pbvh_update(PBVH *bvh, int flags, float (*face_nors)[3]);
void BLI_pbvh_redraw_BB(PBVH *bvh, float bb_min[3], float bb_max[3]);
void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *totface);
void BLI_pbvh_grids_update(PBVH *bvh, struct DMGridData **grids,
- struct DMGridAdjacency *gridadj, void **gridfaces);
+ struct DMGridAdjacency *gridadj, void **gridfaces);;
/* vertex deformer */
float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h
index eab9f92d7e8..eb6e71acded 100644
--- a/source/blender/blenlib/BLI_rand.h
+++ b/source/blender/blenlib/BLI_rand.h
@@ -1,7 +1,4 @@
-/**
- * @file BLI_rand.h
- *
- * Random number functions.
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,10 +30,15 @@
#ifndef BLI_RAND_H
#define BLI_RAND_H
- /* RNG is just an abstract random number generator
- * type that avoids using globals, otherwise identical
- * to BLI_rand functions below.
- */
+/** \file BLI_rand.h
+ * \ingroup bli
+ * \brief Random number functions.
+ */
+
+/** RNG is just an abstract random number generator
+ * type that avoids using globals, otherwise identical
+ * to BLI_rand functions below.
+ */
struct RNG;
typedef struct RNG RNG;
diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h
index 13b12fc4e1e..021ab636d5b 100644
--- a/source/blender/blenlib/BLI_rect.h
+++ b/source/blender/blenlib/BLI_rect.h
@@ -31,6 +31,10 @@
#ifndef BLI_RECT_H
#define BLI_RECT_H
+/** \file BLI_rect.h
+ * \ingroup bli
+ */
+
struct rctf;
struct rcti;
diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h
index 0ae40c0b83d..e2f102c20eb 100644
--- a/source/blender/blenlib/BLI_scanfill.h
+++ b/source/blender/blenlib/BLI_scanfill.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BLI_scanfill.h mar 2001 Nzc
- *
- * Filling meshes.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +30,13 @@
#ifndef BLI_SCANFILL_H
#define BLI_SCANFILL_H
+/** \file BLI_storage.h
+ * \ingroup bli
+ * \since March 2001
+ * \author nzc
+ * \brief Filling meshes.
+ */
+
/**
* @attention Defined in scanfill.c
*/
@@ -50,7 +53,7 @@ extern "C" {
/* scanfill.c: used in displist only... */
struct EditVert *BLI_addfillvert(float *vec);
struct EditEdge *BLI_addfilledge(struct EditVert *v1, struct EditVert *v2);
-int BLI_edgefill(int mode, int mat_nr);
+int BLI_edgefill(int mat_nr);
void BLI_end_edgefill(void);
/* These callbacks are needed to make the lib finction properly */
@@ -61,7 +64,7 @@ void BLI_end_edgefill(void);
* @param f The function to use as callback
* @attention used in creator.c
*/
-void BLI_setErrorCallBack(void (*f)(char*));
+void BLI_setErrorCallBack(void (*f)(const char*));
/**
* Set a function to be able to interrupt the execution of processing
diff --git a/source/blender/blenlib/BLI_smallhash.h b/source/blender/blenlib/BLI_smallhash.h
index 27442b97ae8..2ab365eea0e 100755
--- a/source/blender/blenlib/BLI_smallhash.h
+++ b/source/blender/blenlib/BLI_smallhash.h
@@ -35,7 +35,7 @@
#include "MEM_guardedalloc.h"
#include "BLO_sys_types.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
extern unsigned int hashsizes[];
#define NONHASH -25436536
diff --git a/source/blender/blenlib/BLI_storage.h b/source/blender/blenlib/BLI_storage.h
index 0d9db40fc97..017f9877baf 100644
--- a/source/blender/blenlib/BLI_storage.h
+++ b/source/blender/blenlib/BLI_storage.h
@@ -29,33 +29,32 @@
#ifndef BLI_STORAGE_H
#define BLI_STORAGE_H
-/* NOTE: these have to be defined before including unistd.h! */
-#ifndef __APPLE__
-#ifndef WIN32
-#ifndef _LARGEFILE_SOURCE
-#define _LARGEFILE_SOURCE
-#define _LARGEFILE64_SOURCE
-#define _FILE_OFFSET_BITS 64
-#endif
-#endif
+/** \file BLI_storage.h
+ * \ingroup bli
+ */
+
+#ifdef WIN32
+/* for size_t, only needed on win32 for some reason */
+#include <stddef.h>
#endif
struct direntry;
+
void BLI_adddirstrings(void);
-void BLI_builddir(char *dirname, char *relname);
+void BLI_builddir(const char *dirname, const char *relname);
int BLI_compare(struct direntry *entry1, struct direntry *entry2);
-int BLI_filesize(int file);
-int BLI_filepathsize(const char *path);
-double BLI_diskfree(char *dir);
-char *BLI_getwdN(char *dir);
+size_t BLI_filesize(int file);
+size_t BLI_filepathsize(const char *path);
+double BLI_diskfree(const char *dir);
+char *BLI_getwdN(char *dir, const int maxncpy);
-unsigned int BLI_getdir(char *dirname, struct direntry **filelist);
+unsigned int BLI_getdir(const char *dirname, struct direntry **filelist);
/**
* @attention Do not confuse with BLI_exists
*/
-int BLI_exist(char *name);
+int BLI_exist(const char *name);
/**
* Read a file as ASCII lines. An empty list is
* returned if the file cannot be opened or read.
@@ -67,9 +66,9 @@ int BLI_exist(char *name);
* @retval A list of strings representing the file lines.
*/
-int BLI_is_dir(char *file);
+int BLI_is_dir(const char *file);
-struct LinkNode *BLI_read_file_as_lines(char *name);
+struct LinkNode *BLI_read_file_as_lines(const char *name);
/**
* Free the list returned by BLI_read_file_as_lines.
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index bc3584db03e..0b8746b4c50 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/BLI_storage_types.h
- *
- * Some types for dealing with directories
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,17 +29,12 @@
#ifndef BLI_STORAGE_TYPES_H
#define BLI_STORAGE_TYPES_H
-#include <sys/stat.h>
-
-#define HDRSIZE 512
-#define NAMSIZE 200
+/** \file BLI_storage_types.h
+ * \ingroup bli
+ * \brief Some types for dealing with directories.
+ */
-struct header{
- char name[NAMSIZE];
- unsigned int size;
- unsigned int chksum;
- char fill[HDRSIZE-NAMSIZE-2*sizeof(unsigned int)];
-};
+#include <sys/stat.h>
#if defined(WIN32) && !defined(FREE_WINDOWS)
typedef unsigned int mode_t;
@@ -77,14 +68,6 @@ struct direntry{
struct ImBuf *image;
};
-#define SELECT 1
-#define HIDDEN 1
-#define FIRST 1
-#define DESELECT 0
-#define NOT_YET 0
-#define VISIBLE 0
-#define LAST 0
-
struct dirlink
{
struct dirlink *next,*prev;
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index ccb10190816..36835e0c9ca 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -32,6 +32,10 @@
#ifndef BLI_STRING_H
#define BLI_STRING_H
+/** \file BLI_string.h
+ * \ingroup bli
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -57,6 +61,14 @@ char *BLI_strdup(const char *str);
char *BLI_strdupn(const char *str, int len);
/**
+ * Appends the two strings, and returns new mallocN'ed string
+ * @param str1 first string for copy
+ * @param str2 second string for append
+ * @retval Returns dst
+ */
+char *BLI_strdupcat(const char *str1, const char *str2);
+
+ /**
* Like strncpy but ensures dst is always
* '\0' terminated.
*
@@ -66,15 +78,7 @@ char *BLI_strdupn(const char *str, int len);
* the size of dst)
* @retval Returns dst
*/
-char *BLI_strdupcat(const char *str1, const char *str2);
-
- /**
- * Appends the two strings, and returns new mallocN'ed string
- * @param str1 first string for copy
- * @param str2 second string for append
- * @retval Returns dst
- */
-char *BLI_strncpy(char *dst, const char *src, int maxncpy);
+char *BLI_strncpy(char *dst, const char *src, const int maxncpy);
/* Makes a copy of the text within the "" that appear after some text 'blahblah'
* i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"
@@ -102,13 +106,21 @@ char *BLI_replacestr(char *str, const char *oldText, const char *newText);
/*
* Replacement for snprintf
*/
-int BLI_snprintf(char *buffer, size_t count, const char *format, ...);
+int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 3, 4)));
+#endif
+;
/*
* Print formatted string into a newly mallocN'd string
* and return it.
*/
-char *BLI_sprintfN(const char *format, ...);
+char *BLI_sprintfN(const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 1, 2)));
+#endif
+;
/**
* Compare two strings
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 6a0a711404c..5bf5423d312 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -31,6 +31,10 @@
#ifndef BLI_THREADS_H
#define BLI_THREADS_H
+/** \file BLI_threads.h
+ * \ingroup bli
+ */
+
#include <pthread.h>
/* for tables, button in UI, etc */
@@ -121,7 +125,7 @@ void BLI_insert_work(struct ThreadedWorker *worker, void *param);
typedef struct ThreadQueue ThreadQueue;
-ThreadQueue *BLI_thread_queue_init();
+ThreadQueue *BLI_thread_queue_init(void);
void BLI_thread_queue_free(ThreadQueue *queue);
void BLI_thread_queue_push(ThreadQueue *queue, void *work);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
new file mode 100644
index 00000000000..b2129a6ab76
--- /dev/null
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -0,0 +1,227 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+*/
+
+#ifndef BLI_UTILDEFINES_H
+#define BLI_UTILDEFINES_H
+
+/** \file BLI_utildefines.h
+ * \ingroup bli
+ */
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+#define ELEM(a, b, c) ( (a)==(b) || (a)==(c) )
+#define ELEM3(a, b, c, d) ( ELEM(a, b, c) || (a)==(d) )
+#define ELEM4(a, b, c, d, e) ( ELEM(a, b, c) || ELEM(a, d, e) )
+#define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
+#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
+#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
+#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
+#define ELEM9(a, b, c, d, e, f, g, h, i, j) ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
+#define ELEM10(a, b, c, d, e, f, g, h, i, j, k) ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
+#define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l) ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
+
+/* shift around elements */
+#define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
+#define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
+
+/* min/max */
+#define MIN2(x,y) ( (x)<(y) ? (x) : (y) )
+#define MIN3(x,y,z) MIN2( MIN2((x),(y)) , (z) )
+#define MIN4(x,y,z,a) MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
+
+#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
+#define MAX3(x,y,z) MAX2( MAX2((x),(y)) , (z) )
+#define MAX4(x,y,z,a) MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
+
+#define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
+
+#define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
+
+#define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
+
+#define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
+ if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
+
+#define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
+ if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
+ if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
+
+#define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
+ if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
+ if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
+ if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
+
+/* some math and copy defines */
+
+#ifndef SWAP
+#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
+#endif
+
+#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
+
+#define AVG2(x, y) ( 0.5 * ((x) + (y)) )
+
+#define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
+#define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
+
+#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
+#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
+#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
+#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
+
+
+#define VECADD(v1,v2,v3) {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
+#define VECSUB(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
+#define VECSUB2D(v1,v2,v3) {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
+#define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
+#define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
+#define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
+
+#define INPR(v1, v2) ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
+
+/* some misc stuff.... */
+#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
+#define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
+#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
+
+#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
+
+#define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
+#define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
+#define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
+
+
+/* This one rotates the bytes in an int64, int (32) and short (16) */
+#define SWITCH_INT64(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
+ s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
+ s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
+ s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
+
+ #define SWITCH_INT(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
+ s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
+
+#define SWITCH_SHORT(a) { \
+ char s_i, *p_i; \
+ p_i= (char *)&(a); \
+ s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
+
+
+/* Warning-free macros for storing ints in pointers. Use these _only_
+ * for storing an int in a pointer, not a pointer in an int (64bit)! */
+#define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
+#define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
+
+/* Macro to convert a value to string in the preprocessor
+ * STRINGIFY_ARG: gives the defined name in the string
+ * STRINGIFY: gives the defined value. */
+#define STRINGIFY_ARG(x) #x
+#define STRINGIFY(x) STRINGIFY_ARG(x)
+
+/* useful for debugging */
+#define AT __FILE__ ":" STRINGIFY(__LINE__)
+
+/* UNUSED macro, for function argument */
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
+#else
+# define UNUSED(x) UNUSED_ ## x
+#endif
+
+#ifdef __GNUC__
+# define WARN_UNUSED __attribute__((warn_unused_result))
+#else
+# define WARN_UNUSED
+#endif
+
+/*little macro so inline keyword works*/
+#if defined(_MSC_VER)
+# define BM_INLINE static __forceinline
+#elif defined(__GNUC__)
+# define BM_INLINE static inline __attribute((always_inline))
+#else
+/* #warning "MSC/GNUC defines not found, inline non-functional" */
+# define BM_INLINE static
+#endif
+
+
+/* BLI_assert(), default only to print
+ * for aborting need to define WITH_ASSERT_ABORT
+ */
+#if !defined NDEBUG
+# ifdef WITH_ASSERT_ABORT
+# define _dummy_abort abort
+# else
+# define _dummy_abort() (void)0
+# endif
+# ifdef __GNUC__ /* just want to check if __func__ is available */
+# define BLI_assert(a) \
+do { \
+ if (0 == (a)) { \
+ fprintf(stderr, \
+ "BLI_assert failed: %s, %s(), %d at \'%s\'\n", \
+ __FILE__, __func__, __LINE__, STRINGIFY(a)); \
+ _dummy_abort(); \
+ } \
+} while (0)
+# else
+# define BLI_assert(a) \
+do { \
+ if (0 == (a)) { \
+ fprintf(stderr, \
+ "BLI_assert failed: %s, %d at \'%s\'\n", \
+ __FILE__, __LINE__, STRINGIFY(a)); \
+ _dummy_abort(); \
+ } \
+} while (0)
+# endif
+#else
+# define BLI_assert(a) (void)0
+#endif
+
+#endif // BLI_UTILDEFINES_H
diff --git a/source/blender/blenlib/BLI_uvproject.h b/source/blender/blenlib/BLI_uvproject.h
index cf8bb7cd4b8..54e2090aa50 100644
--- a/source/blender/blenlib/BLI_uvproject.h
+++ b/source/blender/blenlib/BLI_uvproject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,10 @@
#ifndef BKE_UVPROJECT_H
#define BKE_UVPROJECT_H
+/** \file BLI_uvproject.h
+ * \ingroup bli
+ */
+
struct UvCameraInfo;
struct Object;
diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h
index 77abb15b953..7a03c1c37fa 100644
--- a/source/blender/blenlib/BLI_vfontdata.h
+++ b/source/blender/blenlib/BLI_vfontdata.h
@@ -1,9 +1,4 @@
-/**
- * @file BLI_vfontdata.h
- *
- * A structure to represent vector fonts,
- * and to load them from PostScript fonts.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +30,12 @@
#ifndef BLI_VFONTDATA_H
#define BLI_VFONTDATA_H
+/** \file BLI_vfontdata.h
+ * \ingroup bli
+ * \brief A structure to represent vector fonts,
+ * and to load them from PostScript fonts.
+ */
+
#include "DNA_listBase.h"
struct PackedFile;
diff --git a/source/blender/blenlib/BLI_voxel.h b/source/blender/blenlib/BLI_voxel.h
index 63a6c09b0b4..41f8bfab729 100644
--- a/source/blender/blenlib/BLI_voxel.h
+++ b/source/blender/blenlib/BLI_voxel.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +28,11 @@
#ifndef BLI_VOXEL_H
#define BLI_VOXEL_H
-/* find the index number of a voxel, given x/y/z integer coords and resolution vector */
+/** \file BLI_voxel.h
+ * \ingroup bli
+ */
+
+/** find the index number of a voxel, given x/y/z integer coords and resolution vector */
#define V_I(x, y, z, res) ( (z)*(res)[1]*(res)[0] + (y)*(res)[0] + (x) )
/* all input coordinates must be in bounding box 0.0 - 1.0 */
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index e8689895735..0248a6a6b4d 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -1,6 +1,4 @@
-/**
- * Compatibility-like things for windows.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,15 +30,28 @@
#ifndef __WINSTUFF_H__
#define __WINSTUFF_H__
+/** \file BLI_winstuff.h
+ * \ingroup bli
+ * \brief Compatibility-like things for windows.
+ */
+
#ifdef _WIN32
#ifndef FREE_WINDOWS
#pragma warning(once: 4761 4305 4244 4018)
+#else
+#ifdef WINVER
+#undef WINVER
+#endif
+
+/* Some stuff requires WINVER 0x500, but mingw's default is 0x400 */
+#define WINVER 0x0501
#endif
#define WIN32_LEAN_AND_MEAN
#ifndef WIN32_SKIP_HKEY_PROTECTION
+#undef HKEY
#define HKEY WIN32_HKEY // prevent competing definitions
#include <windows.h>
#undef HKEY
@@ -81,15 +92,6 @@ extern "C" {
#endif
/* defines for using ISO C++ conformant names */
-#define open _open
-#define close _close
-#define write _write
-#define read _read
-#define getcwd _getcwd
-#define chdir _chdir
-#define strdup _strdup
-#define lseek _lseek
-#define getpid _getpid
#define snprintf _snprintf
#ifndef FREE_WINDOWS
@@ -133,15 +135,13 @@ void get_default_root(char *root);
int check_file_chars(char *filename);
char *dirname(char *path);
-#ifdef WIN32
int BLI_getInstallationDir(char *str);
-#endif
#ifdef __cplusplus
}
#endif
-#endif
+#endif /* _WIN32 */
#endif /* __WINSTUFF_H__ */
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index ae3057acc84..ff024fc9ea4 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -24,28 +24,123 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- . ../makesdna ../blenkernel ../../../intern/guardedalloc ../include
- ../gpu ../../../intern/ghost ../bmesh
+set(INC
+ .
+ ../makesdna
+ ../blenkernel
+ ../blenloader
+ ../gpu
+ ../../../intern/ghost
+ ../../../intern/guardedalloc
+ ${ZLIB_INCLUDE_DIRS}
${FREETYPE_INCLUDE_DIRS}
- ${ZLIB_INC}
)
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
-SET(INC
- ${INC}
- ${BINRELOC_INC}
+set(SRC
+ intern/BLI_args.c
+ intern/BLI_dynstr.c
+ intern/BLI_ghash.c
+ intern/BLI_heap.c
+ intern/BLI_kdopbvh.c
+ intern/BLI_kdtree.c
+ intern/BLI_linklist.c
+ intern/BLI_memarena.c
+ intern/BLI_mempool.c
+ intern/BLI_cellalloc.c
+ intern/DLRB_tree.c
+ intern/boxpack2d.c
+ intern/bpath.c
+ intern/cpu.c
+ intern/dynlib.c
+ intern/edgehash.c
+ intern/fileops.c
+ intern/fnmatch.c
+ intern/freetypefont.c
+ intern/graph.c
+ intern/gsqueue.c
+ intern/jitter.c
+ intern/listbase.c
+ intern/math_base.c
+ intern/math_base_inline.c
+ intern/math_color.c
+ intern/math_geom.c
+ intern/math_geom_inline.c
+ intern/math_matrix.c
+ intern/math_rotation.c
+ intern/math_vector.c
+ intern/math_vector_inline.c
+ intern/noise.c
+ intern/path_util.c
+ intern/pbvh.c
+ intern/rand.c
+ intern/rct.c
+ intern/scanfill.c
+ intern/storage.c
+ intern/string.c
+ intern/threads.c
+ intern/time.c
+ intern/uvproject.c
+ intern/voxel.c
+ intern/winstuff.c
+
+ BLI_args.h
+ BLI_blenlib.h
+ BLI_boxpack2d.h
+ BLI_bpath.h
+ BLI_cpu.h
+ BLI_dlrbTree.h
+ BLI_dynstr.h
+ BLI_edgehash.h
+ BLI_editVert.h
+ BLI_fileops.h
+ BLI_fnmatch.h
+ BLI_ghash.h
+ BLI_graph.h
+ BLI_gsqueue.h
+ BLI_heap.h
+ BLI_jitter.h
+ BLI_kdopbvh.h
+ BLI_kdtree.h
+ BLI_linklist.h
+ BLI_listbase.h
+ BLI_math.h
+ BLI_math_base.h
+ BLI_math_color.h
+ BLI_math_geom.h
+ BLI_math_inline.h
+ BLI_math_matrix.h
+ BLI_math_rotation.h
+ BLI_math_vector.h
+ BLI_memarena.h
+ BLI_mempool.h
+ BLI_noise.h
+ BLI_path_util.h
+ BLI_pbvh.h
+ BLI_rand.h
+ BLI_rect.h
+ BLI_scanfill.h
+ BLI_storage.h
+ BLI_storage_types.h
+ BLI_string.h
+ BLI_threads.h
+ BLI_utildefines.h
+ BLI_uvproject.h
+ BLI_vfontdata.h
+ BLI_voxel.h
+ BLI_winstuff.h
+ PIL_dynlib.h
+ PIL_time.h
+ intern/BLI_callbacks.h
+ intern/dynamiclist.h
)
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_BINRELOC)
+ add_definitions(-DWITH_BINRELOC)
+ list(APPEND INC "${BINRELOC_INC}")
+endif()
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_blenlib "${SRC}" "${INC}")
+blender_add_lib(bf_blenlib "${SRC}" "${INC}")
diff --git a/source/blender/blenlib/Makefile b/source/blender/blenlib/Makefile
deleted file mode 100644
index d4dcfaeeabf..00000000000
--- a/source/blender/blenlib/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenlib
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenlib/PIL_dynlib.h b/source/blender/blenlib/PIL_dynlib.h
index 1a6e1e20184..87eda213fd8 100644
--- a/source/blender/blenlib/PIL_dynlib.h
+++ b/source/blender/blenlib/PIL_dynlib.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,7 +38,7 @@ PIL_dynlib_open(
void*
PIL_dynlib_find_symbol(
PILdynlib* lib,
- char *symname);
+ const char *symname);
char*
PIL_dynlib_get_error_as_string(
diff --git a/source/blender/blenlib/PIL_time.h b/source/blender/blenlib/PIL_time.h
index 2d5948c4217..6cb4cf6ffcf 100644
--- a/source/blender/blenlib/PIL_time.h
+++ b/source/blender/blenlib/PIL_time.h
@@ -1,4 +1,4 @@
-/**
+/*
* @file PIL_time.h
*
* Platform independant time functions.
diff --git a/source/blender/blenlib/SConscript b/source/blender/blenlib/SConscript
index c319b1923bd..b84c6866192 100644
--- a/source/blender/blenlib/SConscript
+++ b/source/blender/blenlib/SConscript
@@ -4,16 +4,21 @@ Import ('env')
sources = env.Glob('intern/*.c')
cflags=''
-incs = '. ../makesdna ../blenkernel #/intern/guardedalloc #/intern/ghost ../editors/include ../gpu'
+incs = '. ../makesdna ../blenkernel #/intern/guardedalloc #/intern/ghost ../editors/include ../gpu ../blenloader'
incs += ' ../windowmanager ../bmesh #/extern/glew/include'
incs += ' ' + env['BF_FREETYPE_INC']
incs += ' ' + env['BF_ZLIB_INC']
+<<<<<<< .working
defs = 'GLEW_STATIC'
+=======
+defs = []
+>>>>>>> .merge-right.r35190
-if env['OURPLATFORM'] == 'linux2':
+if env['WITH_BF_BINRELOC']:
cflags='-pthread'
incs += ' ../../../extern/binreloc/include'
+ defs.append('WITH_BINRELOC')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index 8d72311f80b..4c059c62475 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -1,4 +1,4 @@
-/**
+/*
* A general argument parsing module
*
* $Id$
@@ -35,22 +35,23 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BLI_args.h"
#include "BLI_ghash.h"
-char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED";
+static char NO_DOCS[] = "NO DOCUMENTATION SPECIFIED";
struct bArgDoc;
typedef struct bArgDoc {
struct bArgDoc *next, *prev;
- char *short_arg;
- char *long_arg;
- char *documentation;
+ const char *short_arg;
+ const char *long_arg;
+ const char *documentation;
int done;
} bArgDoc;
typedef struct bAKey {
- char *arg;
+ const char *arg;
uintptr_t pass; /* cast easier */
int case_str; /* case specific or not */
} bAKey;
@@ -66,12 +67,12 @@ struct bArgs {
ListBase docs;
GHash *items;
int argc;
- char **argv;
+ const char **argv;
int *passes;
};
-static unsigned int case_strhash(void *ptr) {
- char *s= ptr;
+static unsigned int case_strhash(const void *ptr) {
+ const char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -81,27 +82,27 @@ static unsigned int case_strhash(void *ptr) {
return i;
}
-static unsigned int keyhash(void *ptr)
+static unsigned int keyhash(const void *ptr)
{
- bAKey *k = ptr;
+ const bAKey *k = ptr;
return case_strhash(k->arg); // ^ BLI_ghashutil_inthash((void*)k->pass);
}
-static int keycmp(void *a, void *b)
+static int keycmp(const void *a, const void *b)
{
- bAKey *ka = a;
- bAKey *kb = b;
+ const bAKey *ka = a;
+ const bAKey *kb = b;
if (ka->pass == kb->pass || ka->pass == -1 || kb->pass == -1) { /* -1 is wildcard for pass */
if (ka->case_str == 1 || kb->case_str == 1)
return BLI_strcasecmp(ka->arg, kb->arg);
else
return strcmp(ka->arg, kb->arg);
} else {
- return BLI_ghashutil_intcmp((void*)ka->pass, (void*)kb->pass);
+ return BLI_ghashutil_intcmp((const void*)ka->pass, (const void*)kb->pass);
}
}
-static bArgument *lookUp(struct bArgs *ba, char *arg, int pass, int case_str)
+static bArgument *lookUp(struct bArgs *ba, const char *arg, int pass, int case_str)
{
bAKey key;
@@ -112,7 +113,7 @@ static bArgument *lookUp(struct bArgs *ba, char *arg, int pass, int case_str)
return BLI_ghash_lookup(ba->items, &key);
}
-bArgs *BLI_argsInit(int argc, char **argv)
+bArgs *BLI_argsInit(int argc, const char **argv)
{
bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs");
ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes");
@@ -145,12 +146,12 @@ void BLI_argsPrint(struct bArgs *ba)
}
}
-char **BLI_argsArgv(struct bArgs *ba)
+const char **BLI_argsArgv(struct bArgs *ba)
{
return ba->argv;
}
-static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg, char *doc)
+static bArgDoc *internalDocs(struct bArgs *ba, const char *short_arg, const char *long_arg, const char *doc)
{
bArgDoc *d;
@@ -168,7 +169,7 @@ static bArgDoc *internalDocs(struct bArgs *ba, char *short_arg, char *long_arg,
return d;
}
-static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d)
+static void internalAdd(struct bArgs *ba, const char *arg, int pass, int case_str, BA_ArgCallback cb, void *data, bArgDoc *d)
{
bArgument *a;
bAKey *key;
@@ -196,7 +197,7 @@ static void internalAdd(struct bArgs *ba, char *arg, int pass, int case_str, BA_
BLI_ghash_insert(ba->items, key, a);
}
-void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case, char *long_arg, int long_case, char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAddCase(struct bArgs *ba, int pass, const char *short_arg, int short_case, const char *long_arg, int long_case, const char *doc, BA_ArgCallback cb, void *data)
{
bArgDoc *d = internalDocs(ba, short_arg, long_arg, doc);
@@ -209,7 +210,7 @@ void BLI_argsAddCase(struct bArgs *ba, int pass, char *short_arg, int short_case
}
-void BLI_argsAdd(struct bArgs *ba, int pass, char *short_arg, char *long_arg, char *doc, BA_ArgCallback cb, void *data)
+void BLI_argsAdd(struct bArgs *ba, int pass, const char *short_arg, const char *long_arg, const char *doc, BA_ArgCallback cb, void *data)
{
BLI_argsAddCase(ba, pass, short_arg, 0, long_arg, 0, doc, cb, data);
}
@@ -226,7 +227,7 @@ static void internalDocPrint(bArgDoc *d)
printf(" %s\n\n", d->documentation);
}
-void BLI_argsPrintArgDoc(struct bArgs *ba, char *arg)
+void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg)
{
bArgument *a = lookUp(ba, arg, -1, -1);
diff --git a/source/blender/blenlib/intern/BLI_bfile.c b/source/blender/blenlib/intern/BLI_bfile.c
deleted file mode 100644
index b9ac6875b20..00000000000
--- a/source/blender/blenlib/intern/BLI_bfile.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/* -*- indent-tabs-mode:t; tab-width:4; -*-
- *
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2009 by Stichting Blender Foundation.
- * All rights reserved.
- *
- * ***** END GPL LICENSE BLOCK *****
- * BFILE* based abstraction for file access.
- */
-
-#include <string.h>
-#include <stdlib.h>
-#ifndef WIN32
- #include <libgen.h>
- #include <unistd.h>
- #include <sys/param.h>
-#else
- #include <io.h>
- #include "BLI_winstuff.h"
- static char* find_in_pathlist(char* filename, char* pathlist);
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
-#include "BKE_blender.h"
-#include "BLI_path_util.h"
-#include "BLI_fileops.h"
-#include "BLI_storage.h"
-#include "BLI_bfile.h"
-
-/* Internal bfile classification flags */
-#define BCF_OPEN (0)
-#define BCF_FOPEN (1<<0)
-#define BCF_READ (1<<1)
-#define BCF_WRITE (1<<2)
-#define BCF_AT_END (1<<3)
-#define BCF_DISCARD (1<<4)
-
-/* Standard files names */
-#define LAST_SESSION_FILE "last-session"
-#define ENVIRONMENT_FILE "environment"
-
-
-/* Declaration of internal functions */
-static void fill_paths(BFILE *bfile, const char *path, const char *relpath);
-static void free_paths(BFILE* bfile);
-
-
-/*** Exported functions ***/
-
-BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags,
- const char *relpath)
-{
- BFILE *bfile;
-
- bfile = MEM_mallocN(sizeof(BFILE), "bfile-fopen");
- bfile->classf = BCF_FOPEN;
- bfile->uflags = bflags;
-
- /* From fopen() doc, we can guess some logic:
- r BCF_READ
- r+ BCF_READ | BCF_WRITE
- w BCF_DISCARD | BCF_WRITE
- w+ BCF_DISCARD | BCF_WRITE | BCF_READ
- a BCF_AT_END | BCF_WRITE
- a+ BCF_AT_END | BCF_WRITE | BCF_READ
- */
- if (strchr(mode, 'r'))
- bfile->classf |= BCF_READ;
- if (strchr(mode, 'w'))
- bfile->classf |= (BCF_DISCARD | BCF_WRITE);
- if (strchr(mode, 'a'))
- bfile->classf |= (BCF_AT_END | BCF_WRITE);
- if (strchr(mode, '+'))
- bfile->classf |= (BCF_READ | BCF_WRITE);
-
- fill_paths(bfile, path, relpath);
-
- bfile->stream = fopen(bfile->tpath, mode);
- if (!(bfile->stream)) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- bfile->fd = fileno(bfile->stream);
-
- return bfile;
-}
-
-
-BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags,
- const char *relpath)
-{
- BFILE *bfile;
- char fopen_mode[3];
-
- bfile = MEM_mallocN(sizeof(BFILE), "bfile-open");
- bfile->classf = BCF_OPEN;
- bfile->uflags = bflags;
-
- /* Easy mapping for open() */
- if (flags & O_RDONLY)
- bfile->classf |= BCF_READ;
- if (flags & O_WRONLY)
- bfile->classf |= BCF_WRITE;
- if (flags & O_RDWR)
- bfile->classf |= (BCF_READ | BCF_WRITE);
- if (flags & O_APPEND)
- bfile->classf |= BCF_AT_END;
- if (flags & O_TRUNC)
- bfile->classf |= BCF_DISCARD;
-
- fill_paths(bfile, pathname, relpath);
-
- bfile->fd = open(bfile->tpath, flags);
- if (bfile->fd == -1) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- fopen_mode[0] = 'r';
- fopen_mode[1] = '\0';
- fopen_mode[2] = '\0';
- if (bfile->classf & BCF_DISCARD) {
- fopen_mode[0] = 'w';
- if (bfile->classf & BCF_READ) {
- fopen_mode[1] = '+';
- }
- } else if (bfile->classf & BCF_AT_END) {
- fopen_mode[0] = 'a';
- if (bfile->classf & BCF_READ) {
- fopen_mode[1] = '+';
- }
- } else if (bfile->classf & BCF_WRITE) {
- fopen_mode[1] = '+';
- }
-
- bfile->stream = fdopen(bfile->fd, fopen_mode); /* MSWindows _fdopen? */
- if (!(bfile->stream)) {
- free_paths(bfile);
- MEM_freeN(bfile);
- return NULL;
- }
-
- return bfile;
-}
-
-
-FILE *BLI_bfile_file_from_bfile(BFILE *bfile) {
- return bfile->stream;
-}
-
-
-int BLI_bfile_fd_from_bfile(BFILE *bfile) {
- return bfile->fd;
-}
-
-
-ssize_t BLI_bfile_write(BFILE *f, const void *buf, size_t count) {
- ssize_t ret;
-
- ret = write((f->fd), buf, count);
- if (ret == -1) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count) {
- ssize_t ret;
-
- ret = read((f->fd), buf, count);
- if (ret == -1) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb,
- BFILE *f)
-{
- size_t ret;
-
- if (f == NULL)
- return 0;
-
- ret = fwrite(ptr, size, nmemb, f->stream);
- if (ret <= 0) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f) {
- size_t ret;
-
- if (f == NULL)
- return 0;
-
- ret = fread(ptr, size, nmemb, f->stream);
- if ((ret <= 0) && ferror(f->stream)) {
- f->error = 1;
- }
-
- return ret;
-}
-
-
-void BLI_bfile_close(BFILE *bfile) {
- if ((bfile->classf | BCF_WRITE) &&
- !(bfile->uflags | BFILE_RAW)) {
- int error;
- /* Make sure data is on disk */
- error = fsync(bfile->fd);
- /* fsync the directory too? */
- /* Move to final name if no errors */
- if (!(bfile->error) && !error) {
- rename(bfile->tpath, bfile->fpath);
- }
- }
-
- /* Normal close */
-
- /* Cleanup */
- free_paths(bfile);
- MEM_freeN(bfile);
-}
-
-
-void BLI_bfile_clear_error(BFILE *bfile) {
- bfile->error = 0;
-}
-
-
-void BLI_bfile_set_error(BFILE *bfile, int error) {
- /* No cheating, use clear_error() for 0 */
- if (error) {
- bfile->error = error;
- }
-}
-
-
-/*** Internal functions ***/
-
-/**
- Return a full path if the filename exists when combined
- with any item from pathlist. Or NULL otherwise.
- */
-#ifdef WIN32
- #define SEPARATOR ';'
-#else
- #define SEPARATOR ':'
-#endif
-
-#ifdef WIN32
-static char* find_in_pathlist(char* filename, char* pathlist) {
- char first[FILE_MAX + 10];
- char* rest = NULL;
-
- /* Separate first path from rest, use typical separator for current OS */
- rest = strchr(pathlist, SEPARATOR);
- if (rest) {
- strncpy(first, pathlist, rest - pathlist);
- first[rest - pathlist] = '\0';
- /* Skip the separator so it becomes a valid new pathlist */
- rest++;
- } else {
- strcpy(first, pathlist);
- }
-
- /* Check if combination exists */
- BLI_add_slash(first);
- strcat(first, filename);
- if (BLI_exist(first)) {
- return strdup(first);
- }
-
- /* First path failed, try with rest of paths if possible */
- if (rest) {
- return find_in_pathlist(filename, rest);
- } else {
- return NULL;
- }
-}
-#endif
-
-/**
- Setup fpath and tpath based in the needs of the bfile.
- */
-static void fill_paths(BFILE *bfile, const char *path, const char *relpath) {
- char* source_path = NULL;
- char* temp_path = NULL;
- int bflags = bfile->uflags;
-
- if (bflags & BFILE_NORMAL || bflags & BFILE_RAW) {
-// bfile->fpath is path with // replaced
- }
- if (bflags & BFILE_TEMP) {
- temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-1");
- snprintf(temp_path, MAXPATHLEN, "%s/%s", getenv("BLENDER_TEMP"), path);
- bfile->fpath = temp_path;
- }
- if (bflags & (BFILE_CONFIG_BASE | BFILE_CONFIG_DATAFILES |
- BFILE_CONFIG_PYTHON | BFILE_CONFIG_PLUGINS)) {
-// evars
-// bfile->fpath is userdir+version+path
-// source_path is first hit in (if using fallback to older versions)
-// userdir+curversion+path (... userdir+limitversion+path) sysdir+path
-// (limitversion is based in path, using some kind of regex or "tables")
- }
-
- if (bfile->classf & BCF_WRITE && !(bflags & BFILE_RAW)) {
- /* Generate random named path */
- temp_path = MEM_mallocN(MAXPATHLEN, "bfile-fpath-2");
- snprintf(temp_path, MAXPATHLEN, "%s.XXXXXX", path);
- bfile->fd = mkstemp(temp_path);
- bfile->tpath = temp_path;
- /* It will be reopened in upper levels, later */
- close(bfile->fd);
- if (!(bfile->classf & BCF_DISCARD)) {
- /* Copy original data into temp location */
- if (source_path) {
- BLI_copy_fileops(source_path, bfile->tpath);
- } else {
- BLI_copy_fileops(bfile->fpath, bfile->tpath);
- }
- }
- } else {
- bfile->tpath = bfile->fpath;
- }
-}
-
-
-/**
- Free memory used for path strings.
- */
-static void free_paths(BFILE* bfile) {
- if (bfile->fpath) {
- MEM_freeN(bfile->fpath);
- }
- if (bfile->tpath) {
- MEM_freeN(bfile->tpath);
- }
-}
diff --git a/source/blender/blenlib/intern/BLI_callbacks.h b/source/blender/blenlib/intern/BLI_callbacks.h
index 7f85cf16708..71f68d33f2f 100644
--- a/source/blender/blenlib/intern/BLI_callbacks.h
+++ b/source/blender/blenlib/intern/BLI_callbacks.h
@@ -1,4 +1,4 @@
-/**
+/*
* blenlib/BLI_editVert.h mar 2001 Nzc
*
* These callbacks are needed in the lib
@@ -35,7 +35,7 @@
#define BLI_CALLBACKS_H
// This is blenlib internal only
-void callLocalErrorCallBack(char* msg);
+void callLocalErrorCallBack(const char* msg);
#endif
diff --git a/source/blender/blenlib/intern/BLI_cellalloc.c b/source/blender/blenlib/intern/BLI_cellalloc.c
index 715c66fae7b..14237a1285b 100644
--- a/source/blender/blenlib/intern/BLI_cellalloc.c
+++ b/source/blender/blenlib/intern/BLI_cellalloc.c
@@ -149,19 +149,18 @@ void *BLI_cellalloc_dupalloc(void *mem)
{
MemHeader *memh = mem;
void *tmp;
- int slot;
#ifdef USE_GUARDEDALLOC
MEM_freeN(mem);
- return;
+ return NULL;
#endif
if (!memh)
- return;
+ return NULL;
memh--;
if (memh->idcheck != MEMIDCHECK) {
printf("Error in BLI_cellalloc: attempt to free invalid block.\n");
- return;
+ return NULL;
}
tmp = BLI_cellalloc_malloc(memh->size, memh->tag);
@@ -196,4 +195,4 @@ void BLI_cellalloc_destroy(void)
pools[i] = NULL;
}
}
-} \ No newline at end of file
+}
diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c
index 5b61a86305b..dcda7daacb3 100644
--- a/source/blender/blenlib/intern/BLI_dynstr.c
+++ b/source/blender/blenlib/intern/BLI_dynstr.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,14 @@
#endif
#endif
+#ifndef va_copy
+# ifdef __va_copy
+# define va_copy(a,b) __va_copy(a,b)
+# else /* !__va_copy */
+# define va_copy(a,b) ((a)=(b))
+# endif /* __va_copy */
+#endif /* va_copy */
+
/***/
typedef struct DynStrElem DynStrElem;
@@ -101,15 +109,21 @@ void BLI_dynstr_nappend(DynStr *ds, const char *cstr, int len) {
void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
{
char *message, fixedmessage[256];
- int len= 256, maxlen= 65536, retval;
+ int len= sizeof(fixedmessage);
+ const int maxlen= 65536;
+ int retval;
while(1) {
+ va_list args_cpy;
if(len == sizeof(fixedmessage))
message= fixedmessage;
else
- message= MEM_callocN(sizeof(char)*(len+1), "BLI_dynstr_appendf");
+ message= MEM_callocN(sizeof(char) * len, "BLI_dynstr_appendf");
- retval= vsnprintf(message, len, format, args);
+ /* cant reuse the same args, so work on a copy */
+ va_copy(args_cpy, args);
+ retval= vsnprintf(message, len, format, args_cpy);
+ va_end(args_cpy);
if(retval == -1) {
/* -1 means not enough space, but on windows it may also mean
@@ -124,13 +138,14 @@ void BLI_dynstr_vappendf(DynStr *ds, const char *format, va_list args)
break;
}
}
- else if(retval > len) {
+ else if(retval >= len) {
/* in C99 the actual length required is returned */
if(message != fixedmessage)
MEM_freeN(message);
message= NULL;
- len= retval;
+ /* retval doesnt include \0 terminator */
+ len= retval + 1;
}
else
break;
@@ -148,7 +163,9 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
{
va_list args;
char *message, fixedmessage[256];
- int len= 256, maxlen= 65536, retval;
+ int len= sizeof(fixedmessage);
+ const int maxlen= 65536;
+ int retval;
/* note that it's tempting to just call BLI_dynstr_vappendf here
* and avoid code duplication, that crashes on some system because
@@ -158,7 +175,7 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
if(len == sizeof(fixedmessage))
message= fixedmessage;
else
- message= MEM_callocN(sizeof(char)*(len+1), "BLI_dynstr_appendf");
+ message= MEM_callocN(sizeof(char)*(len), "BLI_dynstr_appendf");
va_start(args, format);
retval= vsnprintf(message, len, format, args);
@@ -177,13 +194,14 @@ void BLI_dynstr_appendf(DynStr *ds, const char *format, ...)
break;
}
}
- else if(retval > len) {
+ else if(retval >= len) {
/* in C99 the actual length required is returned */
if(message != fixedmessage)
MEM_freeN(message);
message= NULL;
- len= retval;
+ /* retval doesnt include \0 terminator */
+ len= retval + 1;
}
else
break;
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 32818505e5c..9148e356e2a 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLO_sys_types.h" // for intptr_t support
/***/
@@ -89,7 +90,7 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreef
MEM_freeN(gh->buckets);
BLI_mempool_destroy(gh->entrypool);
- gh->buckets = 0;
+ gh->buckets = NULL;
gh->nentries = 0;
gh->nbuckets = 0;
MEM_freeN(gh);
@@ -149,17 +150,17 @@ int BLI_ghashIterator_isDone(GHashIterator *ghi) {
/***/
-unsigned int BLI_ghashutil_ptrhash(void *key) {
+unsigned int BLI_ghashutil_ptrhash(const void *key) {
return (unsigned int)(intptr_t)key;
}
-int BLI_ghashutil_ptrcmp(void *a, void *b) {
+int BLI_ghashutil_ptrcmp(const void *a, const void *b) {
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_inthash(void *ptr) {
+unsigned int BLI_ghashutil_inthash(const void *ptr) {
uintptr_t key = (uintptr_t)ptr;
key += ~(key << 16);
@@ -172,15 +173,15 @@ unsigned int BLI_ghashutil_inthash(void *ptr) {
return (unsigned int)(key & 0xffffffff);
}
-int BLI_ghashutil_intcmp(void *a, void *b) {
+int BLI_ghashutil_intcmp(const void *a, const void *b) {
if (a==b)
return 0;
else
return (a<b)?-1:1;
}
-unsigned int BLI_ghashutil_strhash(void *ptr) {
- char *s= ptr;
+unsigned int BLI_ghashutil_strhash(const void *ptr) {
+ const char *s= ptr;
unsigned int i= 0;
unsigned char c;
@@ -189,6 +190,6 @@ unsigned int BLI_ghashutil_strhash(void *ptr) {
return i;
}
-int BLI_ghashutil_strcmp(void *a, void *b) {
+int BLI_ghashutil_strcmp(const void *a, const void *b) {
return strcmp(a, b);
}
diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c
index f6616ecb06b..027d3da6499 100644
--- a/source/blender/blenlib/intern/BLI_heap.c
+++ b/source/blender/blenlib/intern/BLI_heap.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -64,7 +64,7 @@ struct Heap {
/***/
-Heap *BLI_heap_new()
+Heap *BLI_heap_new(void)
{
Heap *heap = (Heap*)MEM_callocN(sizeof(Heap), "BLIHeap");
heap->bufsize = 1;
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index 4d64f4a50ff..01f2ab4436c 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,7 +30,9 @@
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "BLI_kdopbvh.h"
#include "BLI_math.h"
@@ -159,7 +161,8 @@ static float KDOP_AXES[13][3] =
heap[parent] = element; \
}
-int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_size, int size_per_item)
+#if 0
+static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_size, int size_per_item)
{
int new_max_size = *max_size * 2;
void *new_memblock = NULL;
@@ -184,7 +187,7 @@ int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_
else
return FALSE;
}
-
+#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////
// Introsort
@@ -1126,19 +1129,20 @@ static void traverse(BVHOverlapData *data, BVHNode *node1, BVHNode *node2)
return;
}
-BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, int *result)
+BVHTreeOverlap *BLI_bvhtree_overlap(BVHTree *tree1, BVHTree *tree2, unsigned int *result)
{
- int j, total = 0;
+ int j;
+ unsigned int total = 0;
BVHTreeOverlap *overlap = NULL, *to = NULL;
BVHOverlapData **data;
// check for compatibility of both trees (can't compare 14-DOP with 18-DOP)
if((tree1->axis != tree2->axis) && (tree1->axis == 14 || tree2->axis == 14) && (tree1->axis == 18 || tree2->axis == 18))
- return 0;
+ return NULL;
// fast check root nodes for collision before doing big splitting + traversal
if(!tree_overlap(tree1->nodes[tree1->totleaf], tree2->nodes[tree2->totleaf], MIN2(tree1->start_axis, tree2->start_axis), MIN2(tree1->stop_axis, tree2->stop_axis)))
- return 0;
+ return NULL;
data = MEM_callocN(sizeof(BVHOverlapData *)* tree1->tree_type, "BVHOverlapData_star");
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
index cf94a0c9ffe..24fe4c081d9 100644
--- a/source/blender/blenlib/intern/BLI_kdtree.c
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -132,6 +132,7 @@ void BLI_kdtree_balance(KDTree *tree)
static float squared_distance(float *v2, float *v1, float *n1, float *n2)
{
float d[3], dist;
+ (void)n1; /* unused */
d[0]= v2[0]-v1[0];
d[1]= v2[1]-v1[1];
@@ -254,7 +255,7 @@ static void add_nearest(KDTreeNearest *ptn, int *found, int n, int index, float
/* finds the nearest n entries in tree to specified coordinates */
int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest)
{
- KDTreeNode *root, *node=0;
+ KDTreeNode *root, *node= NULL;
KDTreeNode **stack, *defaultstack[100];
float cur_dist;
int i, totstack, cur=0, found=0;
@@ -369,7 +370,7 @@ static void add_in_range(KDTreeNearest **ptn, int found, int *totfoundstack, int
}
int BLI_kdtree_range_search(KDTree *tree, float range, float *co, float *nor, KDTreeNearest **nearest)
{
- KDTreeNode *root, *node=0;
+ KDTreeNode *root, *node= NULL;
KDTreeNode **stack, *defaultstack[100];
KDTreeNearest *foundstack=NULL;
float range2 = range*range, dist2;
diff --git a/source/blender/blenlib/intern/BLI_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c
index c903e66057e..deb4ee79157 100644
--- a/source/blender/blenlib/intern/BLI_linklist.c
+++ b/source/blender/blenlib/intern/BLI_linklist.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c
index de2a73e065f..52638158b18 100644
--- a/source/blender/blenlib/intern/BLI_memarena.c
+++ b/source/blender/blenlib/intern/BLI_memarena.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c
index 686709d8879..60882e7f1b6 100644
--- a/source/blender/blenlib/intern/BLI_mempool.c
+++ b/source/blender/blenlib/intern/BLI_mempool.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -36,6 +36,8 @@
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
+#include "BLI_mempool.h"
+#include "BLI_utildefines.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -187,9 +189,11 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr){ //doesnt protect against d
first = pool->chunks.first;
BLI_remlink(&pool->chunks, first);
- for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next)
- pool->use_sysmalloc ? free(mpchunk->data) : MEM_freeN(mpchunk->data);
-
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ if(pool->use_sysmalloc) free(mpchunk->data);
+ else MEM_freeN(mpchunk->data);
+ }
+
pool->use_sysmalloc ? BLI_freelist(&(pool->chunks)) : BLI_freelistN(&(pool->chunks));
BLI_addtail(&pool->chunks, first);
@@ -252,9 +256,18 @@ void *BLI_mempool_iterstep(BLI_mempool_iter *iter)
void BLI_mempool_destroy(BLI_mempool *pool)
{
BLI_mempool_chunk *mpchunk=NULL;
- for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next)
- pool->use_sysmalloc ? free(mpchunk->data) : MEM_freeN(mpchunk->data);
-
- pool->use_sysmalloc ? BLI_freelist(&(pool->chunks)) : BLI_freelistN(&(pool->chunks));
- pool->use_sysmalloc ? free(pool) : MEM_freeN(pool);
+ if(pool->use_sysmalloc) {
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ free(mpchunk->data);
+ }
+ BLI_freelist(&(pool->chunks));
+ free(pool);
+ }
+ else {
+ for(mpchunk = pool->chunks.first; mpchunk; mpchunk = mpchunk->next) {
+ MEM_freeN(mpchunk->data);
+ }
+ BLI_freelistN(&(pool->chunks));
+ MEM_freeN(pool);
+ }
}
diff --git a/source/blender/blenlib/intern/DLRB_tree.c b/source/blender/blenlib/intern/DLRB_tree.c
index 69c9cc7e522..fa2edac0897 100644
--- a/source/blender/blenlib/intern/DLRB_tree.c
+++ b/source/blender/blenlib/intern/DLRB_tree.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/Makefile b/source/blender/blenlib/intern/Makefile
deleted file mode 100644
index 018fd3477df..00000000000
--- a/source/blender/blenlib/intern/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenlib
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# path to SDNA types
-CPPFLAGS += -I../../makesdna
-# path to our own external headerfiles
-CPPFLAGS += -I..
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# path to freetype font stuff
-CPPFLAGS += -I$(NAN_FREETYPE)/include
-CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
-# path to blenkernel
-CPPFLAGS += -I$(SRCHOME)/blender/blenkernel
-CPPFLAGS += -I../../editors/include/
-# path to zlib
-CPPFLAGS += -I$(NAN_ZLIB)/include
-
-CPPFLAGS += -I../../gpu
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-
-ifdef NAN_PTHREADS
- CPPFLAGS += -I$(NAN_PTHREADS)/include
-endif
-ifeq ($(OS),linux)
- CPPFLAGS += -I$(OCGDIR)/extern/binreloc/include
-endif
diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c
index 1c910dbb519..643dcb6efca 100644
--- a/source/blender/blenlib/intern/boxpack2d.c
+++ b/source/blender/blenlib/intern/boxpack2d.c
@@ -30,6 +30,23 @@
*
* The defined Below are for internal use only */
+typedef struct boxVert {
+ float x;
+ float y;
+ short free;
+
+ struct boxPack *trb; /* top right box */
+ struct boxPack *blb; /* bottom left box */
+ struct boxPack *brb; /* bottom right box */
+ struct boxPack *tlb; /* top left box */
+
+ /* Store last intersecting boxes here
+ * speedup intersection testing */
+ struct boxPack *isect_cache[4];
+
+ int index;
+} boxVert;
+
/* free vert flags */
#define eps 0.0000001f
#define BLF 1
@@ -83,12 +100,10 @@
/* qsort function - sort largest to smallest */
static int box_areasort(const void *p1, const void *p2)
{
- const boxPack *b1=p1, *b2=p2;
- float a1, a2;
+ const boxPack *b1= p1, *b2= p2;
+ const float a1= BOXAREA(b1);
+ const float a2= BOXAREA(b2);
- a1 = BOXAREA(b1);
- a2 = BOXAREA(b2);
-
if ( a1 < a2 ) return 1;
else if ( a1 > a2 ) return -1;
return 0;
@@ -132,13 +147,13 @@ static int vertex_sort(const void *p1, const void *p2)
* len - the number of boxes in the array.
* tot_width and tot_height are set so you can normalize the data.
* */
-void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
+void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_height)
{
boxVert *vert; /* the current vert */
int box_index, verts_pack_len, i, j, k, isect;
int quad_flags[4]= {BLF,TRF,TLF,BRF}; /* use for looping */
boxPack *box, *box_test; /*current box and another for intersection tests*/
- int *vertex_pack_indicies; /*an array of indices used for sorting verts*/
+ int *vertex_pack_indices; /*an array of indices used for sorting verts*/
if (!len) {
*tot_width = 0.0f;
@@ -151,7 +166,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
/* add verts to the boxes, these are only used internally */
vert = vertarray = MEM_mallocN( len*4*sizeof(boxVert), "boxPack Verts");
- vertex_pack_indicies = MEM_mallocN( len*3*sizeof(int), "boxPack Indices");
+ vertex_pack_indices = MEM_mallocN( len*3*sizeof(int), "boxPack Indices");
for (box=boxarray, box_index=0, i=0; box_index < len; box_index++, box++) {
@@ -208,7 +223,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box->x = box->y = 0.0f;
for (i=0; i<3; i++)
- vertex_pack_indicies[i] = box->v[i+1]->index;
+ vertex_pack_indices[i] = box->v[i+1]->index;
verts_pack_len = 3;
box++; /* next box, needed for the loop below */
/* ...done packing the first box */
@@ -220,14 +235,14 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box_width = box->w;
box_height = box->h;
- qsort(vertex_pack_indicies, verts_pack_len, sizeof(int), vertex_sort);
+ qsort(vertex_pack_indices, verts_pack_len, sizeof(int), vertex_sort);
/* Pack the box in with the others */
/* sort the verts */
isect = 1;
for (i=0; i<verts_pack_len && isect; i++) {
- vert = vertarray + vertex_pack_indicies[i];
+ vert = vertarray + vertex_pack_indices[i];
/* printf("\ttesting vert %i %i %i %f %f\n", i,
* vert->free, verts_pack_len, vert->x, vert->y); */
@@ -384,7 +399,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
for (k=0; k<4; k++) {
if (box->v[k] != vert) {
- vertex_pack_indicies[verts_pack_len] =
+ vertex_pack_indices[verts_pack_len] =
box->v[k]->index;
verts_pack_len++;
}
@@ -406,7 +421,7 @@ void boxPack2D(boxPack *boxarray, int len, float *tot_width, float *tot_height)
box = boxarray+box_index;
box->v[0] = box->v[1] = box->v[2] = box->v[3] = NULL;
}
- MEM_freeN(vertex_pack_indicies);
+ MEM_freeN(vertex_pack_indices);
MEM_freeN(vertarray);
}
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index d1a8de14181..7fa88704f2e 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -29,6 +29,7 @@
#include <sys/stat.h>
#include <string.h>
+#include <assert.h>
/* path/file handeling stuff */
#ifndef WIN32
@@ -44,6 +45,8 @@
#include "DNA_mesh_types.h"
#include "DNA_scene_types.h" /* to get the current frame */
#include "DNA_image_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_text_types.h"
#include "DNA_sound_types.h"
#include "DNA_sequence_types.h"
#include "DNA_vfont_types.h"
@@ -51,11 +54,12 @@
#include "BLI_blenlib.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_image.h" /* so we can check the image's type */
-#include "BKE_main.h" /* so we can access G.main->*.first */
#include "BKE_sequencer.h"
+#include "BKE_main.h"
#include "BKE_utildefines.h"
#include "BKE_report.h"
@@ -65,11 +69,42 @@
//XXX #include "BSE_sequence.h"
//XXX define below from BSE_sequence.h - otherwise potentially odd behaviour
+
+typedef struct BPathIteratorSeqData {
+ int totseq;
+ int seq;
+ struct Sequence **seqar; /* Sequence */
+ struct Scene *scene; /* Current scene */
+} BPathIteratorSeqData;
+
+typedef struct BPathIterator {
+ char* _path; /* never access directly, use BLI_bpathIterator_getPath */
+ const char* _lib;
+ const char* _name;
+ void* data;
+ int len;
+ int type;
+ int flag; /* iterator options */
+
+ void (*setpath_callback)(struct BPathIterator *, const char *);
+ void (*getpath_callback)(struct BPathIterator *, char *);
+
+ const char* base_path; /* base path, the directry the blend file is in - normally bmain->name */
+
+ Main *bmain;
+
+ /* only for seq data */
+ struct BPathIteratorSeqData seqdata;
+} BPathIterator;
+
#define FILE_MAX 240
+
/* TODO - BPATH_PLUGIN, BPATH_SEQ */
enum BPathTypes {
- BPATH_IMAGE = 0,
+ BPATH_IMAGE= 0,
+ BPATH_TEXTURE,
+ BPATH_TEXT,
BPATH_SOUND,
BPATH_FONT,
BPATH_LIB,
@@ -79,52 +114,69 @@ enum BPathTypes {
BPATH_DONE
};
-void BLI_bpathIterator_init( struct BPathIterator *bpi, char *base_path ) {
- bpi->type = BPATH_IMAGE;
- bpi->data = NULL;
+void BLI_bpathIterator_init(struct BPathIterator **bpi_pt, Main *bmain, const char *basedir, const int flag)
+{
+ BPathIterator *bpi;
+
+ bpi= MEM_mallocN(sizeof(BPathIterator), "BLI_bpathIterator_init");
+ *bpi_pt= bpi;
+
+ bpi->type= BPATH_IMAGE;
+ bpi->data= NULL;
- bpi->getpath_callback = NULL;
- bpi->setpath_callback = NULL;
+ bpi->getpath_callback= NULL;
+ bpi->setpath_callback= NULL;
/* Sequencer specific */
- bpi->seqdata.totseq = 0;
- bpi->seqdata.seq = 0;
- bpi->seqdata.seqar = NULL;
- bpi->seqdata.scene = NULL;
-
- bpi->base_path= base_path ? base_path : G.sce;
+ bpi->seqdata.totseq= 0;
+ bpi->seqdata.seq= 0;
+ bpi->seqdata.seqar= NULL;
+ bpi->seqdata.scene= NULL;
+
+ bpi->flag= flag;
+
+ bpi->base_path= basedir; /* normally bmain->name */
+ bpi->bmain= bmain;
BLI_bpathIterator_step(bpi);
}
-void BLI_bpathIterator_free( struct BPathIterator *bpi ) {
+#if 0
+static void BLI_bpathIterator_alloc(struct BPathIterator **bpi) {
+ *bpi= MEM_mallocN(sizeof(BPathIterator), "BLI_bpathIterator_alloc");
+}
+#endif
+
+void BLI_bpathIterator_free(struct BPathIterator *bpi) {
if (bpi->seqdata.seqar)
MEM_freeN((void *)bpi->seqdata.seqar);
- bpi->seqdata.seqar = NULL;
- bpi->seqdata.scene = NULL;
+ bpi->seqdata.seqar= NULL;
+ bpi->seqdata.scene= NULL;
+
+ MEM_freeN(bpi);
}
-void BLI_bpathIterator_getPath( struct BPathIterator *bpi, char *path) {
+void BLI_bpathIterator_getPath(struct BPathIterator *bpi, char *path) {
if (bpi->getpath_callback) {
- bpi->getpath_callback( bpi, path );
+ bpi->getpath_callback(bpi, path);
} else {
- strcpy(path, bpi->path); /* warning, we assume 'path' are long enough */
+ strcpy(path, bpi->_path); /* warning, we assume 'path' are long enough */
}
}
-void BLI_bpathIterator_setPath( struct BPathIterator *bpi, char *path) {
+void BLI_bpathIterator_setPath(struct BPathIterator *bpi, const char *path) {
if (bpi->setpath_callback) {
- bpi->setpath_callback( bpi, path );
+ bpi->setpath_callback(bpi, path);
} else {
- strcpy(bpi->path, path); /* warning, we assume 'path' are long enough */
+ strcpy(bpi->_path, path); /* warning, we assume 'path' are long enough */
}
}
-void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_expanded) {
- char *libpath;
+void BLI_bpathIterator_getPathExpanded(struct BPathIterator *bpi, char *path_expanded) {
+ const char *libpath;
BLI_bpathIterator_getPath(bpi, path_expanded);
- libpath = BLI_bpathIterator_getLib(bpi);
+ libpath= BLI_bpathIterator_getLib(bpi);
if (libpath) { /* check the files location relative to its library path */
BLI_path_abs(path_expanded, libpath);
@@ -133,68 +185,113 @@ void BLI_bpathIterator_getPathExpanded( struct BPathIterator *bpi, char *path_ex
}
BLI_cleanup_file(NULL, path_expanded);
}
-char* BLI_bpathIterator_getLib( struct BPathIterator *bpi) {
- return bpi->lib;
+const char* BLI_bpathIterator_getLib(struct BPathIterator *bpi) {
+ return bpi->_lib;
}
-char* BLI_bpathIterator_getName( struct BPathIterator *bpi) {
- return bpi->name;
+const char* BLI_bpathIterator_getName(struct BPathIterator *bpi) {
+ return bpi->_name;
}
-int BLI_bpathIterator_getType( struct BPathIterator *bpi) {
+int BLI_bpathIterator_getType(struct BPathIterator *bpi) {
return bpi->type;
}
-int BLI_bpathIterator_getPathMaxLen( struct BPathIterator *bpi) {
+int BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi) {
return bpi->len;
}
+const char* BLI_bpathIterator_getBasePath(struct BPathIterator *bpi) {
+ return bpi->base_path;
+}
/* gets the first or the next image that has a path - not a viewer node or generated image */
-static struct Image *ima_stepdata__internal(struct Image *ima, int step_next) {
+static struct Image *ima_stepdata__internal(struct Image *ima, const int step_next, const int flag)
+{
if (ima==NULL)
return NULL;
if (step_next)
- ima = ima->id.next;
+ ima= ima->id.next;
while (ima) {
- if (ima->packedfile==NULL && ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
- break;
+ if (ELEM3(ima->source, IMA_SRC_FILE, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+ if(ima->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
+ break;
+ }
+ }
/* image is not a image with a path, skip it */
- ima = ima->id.next;
+ ima= ima->id.next;
}
return ima;
}
-static struct VFont *vf_stepdata__internal(struct VFont *vf, int step_next) {
+static struct Tex *tex_stepdata__internal(struct Tex *tex, const int step_next, const int UNUSED(flag))
+{
+ if (tex==NULL)
+ return NULL;
+
+ if (step_next)
+ tex= tex->id.next;
+
+ while (tex) {
+ if (tex->type == TEX_VOXELDATA && TEX_VD_IS_SOURCE_PATH(tex->vd->file_format))
+ break;
+ /* image is not a image with a path, skip it */
+ tex= tex->id.next;
+ }
+ return tex;
+}
+
+static struct Text *text_stepdata__internal(struct Text *text, const int step_next, const int UNUSED(flag))
+{
+ if (text==NULL)
+ return NULL;
+
+ if (step_next)
+ text= text->id.next;
+
+ while (text) {
+ if (text->name)
+ break;
+ /* image is not a image with a path, skip it */
+ text= text->id.next;
+ }
+ return text;
+}
+
+static struct VFont *vf_stepdata__internal(struct VFont *vf, const int step_next, const int flag)
+{
if (vf==NULL)
return NULL;
if (step_next)
- vf = vf->id.next;
+ vf= vf->id.next;
while (vf) {
- if (vf->packedfile==NULL && BLI_streq(vf->name, "<builtin>")==0) {
- break;
+ if (strcmp(vf->name, FO_BUILTIN_NAME)!=0) {
+ if(vf->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
+ break;
+ }
}
/* font with no path, skip it */
- vf = vf->id.next;
+ vf= vf->id.next;
}
return vf;
}
-static struct bSound *snd_stepdata__internal(struct bSound *snd, int step_next) {
+static struct bSound *snd_stepdata__internal(struct bSound *snd, int step_next, const int flag)
+{
if (snd==NULL)
return NULL;
if (step_next)
- snd = snd->id.next;
+ snd= snd->id.next;
while (snd) {
- if (snd->packedfile==NULL) {
+ if(snd->packedfile==NULL || (flag & BPATH_USE_PACKED)) {
break;
}
-
+
/* font with no path, skip it */
- snd = snd->id.next;
+ snd= snd->id.next;
}
return snd;
}
@@ -206,7 +303,7 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
/* Initializing */
if (bpi->seqdata.scene==NULL) {
- bpi->seqdata.scene= G.main->scene.first;
+ bpi->seqdata.scene= bpi->bmain->scene.first;
}
if (step_next) {
@@ -219,20 +316,20 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
if (bpi->seqdata.seqar == NULL) {
/* allocate the sequencer array */
seq_array(ed, &bpi->seqdata.seqar, &bpi->seqdata.totseq, 0);
- bpi->seqdata.seq = 0;
+ bpi->seqdata.seq= 0;
}
if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
- seq = NULL;
+ seq= NULL;
} else {
- seq = bpi->seqdata.seqar[bpi->seqdata.seq];
- while (!SEQ_HAS_PATH(seq)) {
+ seq= bpi->seqdata.seqar[bpi->seqdata.seq];
+ while (!SEQ_HAS_PATH(seq) && seq->plugin==NULL) {
bpi->seqdata.seq++;
if (bpi->seqdata.seq >= bpi->seqdata.totseq) {
- seq = NULL;
+ seq= NULL;
break;
}
- seq = bpi->seqdata.seqar[bpi->seqdata.seq];
+ seq= bpi->seqdata.seqar[bpi->seqdata.seq];
}
}
if (seq) {
@@ -241,13 +338,13 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
/* keep looking through the next scene, reallocate seq array */
if (bpi->seqdata.seqar) {
MEM_freeN((void *)bpi->seqdata.seqar);
- bpi->seqdata.seqar = NULL;
+ bpi->seqdata.seqar= NULL;
}
- bpi->seqdata.scene = bpi->seqdata.scene->id.next;
+ bpi->seqdata.scene= bpi->seqdata.scene->id.next;
}
} else {
/* no seq data in this scene, next */
- bpi->seqdata.scene = bpi->seqdata.scene->id.next;
+ bpi->seqdata.scene= bpi->seqdata.scene->id.next;
}
}
@@ -255,10 +352,10 @@ static struct Sequence *seq_stepdata__internal(struct BPathIterator *bpi, int st
}
static void seq_getpath(struct BPathIterator *bpi, char *path) {
- Sequence *seq = (Sequence *)bpi->data;
+ Sequence *seq= (Sequence *)bpi->data;
- path[0] = '\0'; /* incase we cant get the path */
+ path[0]= '\0'; /* incase we cant get the path */
if (seq==NULL) return;
if (SEQ_HAS_PATH(seq)) {
if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) {
@@ -268,25 +365,52 @@ static void seq_getpath(struct BPathIterator *bpi, char *path) {
/* Using the first image is weak for image sequences */
strcat(path, seq->strip->stripdata->name);
}
- } else {
+ }
+ else {
/* simple case */
BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
}
}
+ else if (seq->plugin) {
+ BLI_strncpy(seq->plugin->name, path, sizeof(seq->plugin->name));
+ }
}
-static void seq_setpath(struct BPathIterator *bpi, char *path) {
- Sequence *seq = (Sequence *)bpi->data;
+static void seq_setpath(struct BPathIterator *bpi, const char *path) {
+ Sequence *seq= (Sequence *)bpi->data;
if (seq==NULL) return;
if (SEQ_HAS_PATH(seq)) {
if (ELEM3(seq->type, SEQ_IMAGE, SEQ_MOVIE, SEQ_SOUND)) {
BLI_split_dirfile(path, seq->strip->dir, seq->strip->stripdata->name);
- } else {
+ }
+ else {
/* simple case */
BLI_strncpy(seq->strip->dir, path, sizeof(seq->strip->dir));
}
}
+ else if (seq->plugin) {
+ BLI_strncpy(seq->plugin->name, path, sizeof(seq->plugin->name));
+ }
+}
+
+static void text_getpath(struct BPathIterator *bpi, char *path) {
+ Text *text= (Text *)bpi->data;
+ path[0]= '\0'; /* incase we cant get the path */
+ if(text->name) {
+ strcpy(path, text->name);
+ }
+}
+
+static void text_setpath(struct BPathIterator *bpi, const char *path) {
+ Text *text= (Text *)bpi->data;
+ if (text==NULL) return;
+
+ if(text->name) {
+ MEM_freeN(text->name);
+ }
+
+ text->name= BLI_strdup(path);
}
static struct Mesh *cdata_stepdata__internal(struct Mesh *me, int step_next) {
@@ -294,72 +418,125 @@ static struct Mesh *cdata_stepdata__internal(struct Mesh *me, int step_next) {
return NULL;
if (step_next)
- me = me->id.next;
+ me= me->id.next;
while (me) {
if (me->fdata.external) {
break;
}
- me = me->id.next;
+ me= me->id.next;
}
return me;
}
-static void bpi_type_step__internal( struct BPathIterator *bpi) {
+static void bpi_type_step__internal(struct BPathIterator *bpi) {
bpi->type++; /* advance to the next type */
- bpi->data = NULL;
+ bpi->data= NULL;
switch (bpi->type) {
case BPATH_SEQ:
- bpi->getpath_callback = seq_getpath;
- bpi->setpath_callback = seq_setpath;
+ bpi->getpath_callback= seq_getpath;
+ bpi->setpath_callback= seq_setpath;
+ break;
+ case BPATH_TEXT: /* path is malloc'd */
+ bpi->getpath_callback= text_getpath;
+ bpi->setpath_callback= text_setpath;
break;
default:
- bpi->getpath_callback = NULL;
- bpi->setpath_callback = NULL;
+ bpi->getpath_callback= NULL;
+ bpi->setpath_callback= NULL;
break;
}
}
-void BLI_bpathIterator_step( struct BPathIterator *bpi) {
+void BLI_bpathIterator_step(struct BPathIterator *bpi) {
while (bpi->type != BPATH_DONE) {
if ((bpi->type) == BPATH_IMAGE) {
- /*if (bpi->data) bpi->data = ((ID *)bpi->data)->next;*/
- if (bpi->data) bpi->data = ima_stepdata__internal( (Image *)bpi->data, 1 ); /* must skip images that have no path */
- else bpi->data = ima_stepdata__internal(G.main->image.first, 0);
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= ima_stepdata__internal((Image *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= ima_stepdata__internal(bpi->bmain->image.first, 0, bpi->flag);
if (bpi->data) {
/* get the path info from this datatype */
- Image *ima = (Image *)bpi->data;
+ Image *ima= (Image *)bpi->data;
- bpi->lib = ima->id.lib ? ima->id.lib->filepath : NULL;
- bpi->path = ima->name;
- bpi->name = ima->id.name+2;
- bpi->len = sizeof(ima->name);
+ bpi->_lib= ima->id.lib ? ima->id.lib->filepath : NULL;
+ bpi->_path= ima->name;
+ bpi->_name= ima->id.name+2;
+ bpi->len= sizeof(ima->name);
/* we are done, advancing to the next item, this type worked fine */
break;
-
+
} else {
bpi_type_step__internal(bpi);
}
-
-
- } else if ((bpi->type) == BPATH_SOUND) {
- if (bpi->data) bpi->data = snd_stepdata__internal( (bSound *)bpi->data, 1 ); /* must skip images that have no path */
- else bpi->data = snd_stepdata__internal(G.main->sound.first, 0);
-
+ }
+
+ if ((bpi->type) == BPATH_TEXTURE) {
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= tex_stepdata__internal( (Tex *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= tex_stepdata__internal(bpi->bmain->tex.first, 0, bpi->flag);
+
if (bpi->data) {
/* get the path info from this datatype */
- bSound *snd = (bSound *)bpi->data;
-
- bpi->lib = snd->id.lib ? snd->id.lib->filepath : NULL;
- bpi->path = snd->name;
- bpi->name = snd->id.name+2;
- bpi->len = sizeof(snd->name);
-
+ Tex *tex= (Tex *)bpi->data;
+
+ if(tex->type == TEX_VOXELDATA) {
+ bpi->_lib= tex->id.lib ? tex->id.lib->filepath : NULL;
+ bpi->_path= tex->vd->source_path;
+ bpi->_name= tex->id.name+2;
+ bpi->len= sizeof(tex->vd->source_path);
+ }
+ else {
+ assert(!"Texture has no path, incorrect step 'tex_stepdata__internal'");
+ }
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+
+ } else {
+ bpi_type_step__internal(bpi);
+ }
+ }
+
+ if ((bpi->type) == BPATH_TEXT) {
+ /*if (bpi->data) bpi->data= ((ID *)bpi->data)->next;*/
+ if (bpi->data) bpi->data= text_stepdata__internal((Text *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= text_stepdata__internal(bpi->bmain->text.first, 0, bpi->flag);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ Text *text= (Text *)bpi->data;
+
+ bpi->_lib= text->id.lib ? text->id.lib->filepath : NULL;
+ bpi->_path= NULL; /* bpi->path= text->name; */ /* get/set functions override. */
+ bpi->_name= text->id.name+2;
+ bpi->len= FILE_MAX; /* malloc'd but limit anyway since large paths may mess up other areas */
+
+ /* we are done, advancing to the next item, this type worked fine */
+ break;
+
+ } else {
+ bpi_type_step__internal(bpi);
+ }
+ }
+
+ else if ((bpi->type) == BPATH_SOUND) {
+ if (bpi->data) bpi->data= snd_stepdata__internal((bSound *)bpi->data, 1, bpi->flag); /* must skip images that have no path */
+ else bpi->data= snd_stepdata__internal(bpi->bmain->sound.first, 0, bpi->flag);
+
+ if (bpi->data) {
+ /* get the path info from this datatype */
+ bSound *snd= (bSound *)bpi->data;
+
+ bpi->_lib= snd->id.lib ? snd->id.lib->filepath : NULL;
+ bpi->_path= snd->name;
+ bpi->_name= snd->id.name+2;
+ bpi->len= sizeof(snd->name);
+
/* we are done, advancing to the next item, this type worked fine */
break;
} else {
@@ -369,36 +546,36 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) {
} else if ((bpi->type) == BPATH_FONT) {
- if (bpi->data) bpi->data = vf_stepdata__internal( (VFont *)bpi->data, 1 );
- else bpi->data = vf_stepdata__internal( G.main->vfont.first, 0 );
+ if (bpi->data) bpi->data= vf_stepdata__internal((VFont *)bpi->data, 1, bpi->flag);
+ else bpi->data= vf_stepdata__internal(bpi->bmain->vfont.first, 0, bpi->flag);
if (bpi->data) {
/* get the path info from this datatype */
- VFont *vf = (VFont *)bpi->data;
-
- bpi->lib = vf->id.lib ? vf->id.lib->filepath : NULL;
- bpi->path = vf->name;
- bpi->name = vf->id.name+2;
- bpi->len = sizeof(vf->name);
-
+ VFont *vf= (VFont *)bpi->data;
+
+ bpi->_lib= vf->id.lib ? vf->id.lib->filepath : NULL;
+ bpi->_path= vf->name;
+ bpi->_name= vf->id.name+2;
+ bpi->len= sizeof(vf->name);
+
/* we are done, advancing to the next item, this type worked fine */
break;
} else {
bpi_type_step__internal(bpi);
}
-
+
} else if ((bpi->type) == BPATH_LIB) {
- if (bpi->data) bpi->data = ((ID *)bpi->data)->next;
- else bpi->data = G.main->library.first;
+ if (bpi->data) bpi->data= ((ID *)bpi->data)->next;
+ else bpi->data= bpi->bmain->library.first;
if (bpi->data) {
/* get the path info from this datatype */
- Library *lib = (Library *)bpi->data;
+ Library *lib= (Library *)bpi->data;
- bpi->lib = NULL;
- bpi->path = lib->name;
- bpi->name = NULL;
- bpi->len = sizeof(lib->name);
+ bpi->_lib= NULL;
+ bpi->_path= lib->name;
+ bpi->_name= NULL;
+ bpi->len= sizeof(lib->name);
/* we are done, advancing to the next item, this type worked fine */
break;
@@ -406,27 +583,27 @@ void BLI_bpathIterator_step( struct BPathIterator *bpi) {
bpi_type_step__internal(bpi);
}
} else if ((bpi->type) == BPATH_SEQ) {
- if (bpi->data) bpi->data = seq_stepdata__internal( bpi, 1 );
- else bpi->data = seq_stepdata__internal( bpi, 0 );
+ if (bpi->data) bpi->data= seq_stepdata__internal( bpi, 1 );
+ else bpi->data= seq_stepdata__internal( bpi, 0 );
if (bpi->data) {
- Sequence *seq = (Sequence *)bpi->data;
- bpi->lib = NULL;
- bpi->name = seq->name+2;
- bpi->len = sizeof(seq->strip->stripdata->name);
+ Sequence *seq= (Sequence *)bpi->data;
+ bpi->_lib= NULL;
+ bpi->_name= seq->name+2;
+ bpi->len= seq->plugin ? sizeof(seq->plugin->name) : sizeof(seq->strip->dir) + sizeof(seq->strip->stripdata->name);
break;
} else {
bpi_type_step__internal(bpi);
}
} else if ((bpi->type) == BPATH_CDATA) {
- if (bpi->data) bpi->data = cdata_stepdata__internal( bpi->data, 1 );
- else bpi->data = cdata_stepdata__internal( G.main->mesh.first, 0 );
+ if (bpi->data) bpi->data= cdata_stepdata__internal( bpi->data, 1 );
+ else bpi->data= cdata_stepdata__internal( bpi->bmain->mesh.first, 0 );
if (bpi->data) {
- Mesh *me = (Mesh *)bpi->data;
- bpi->lib = me->id.lib ? me->id.lib->filepath : NULL;
- bpi->path = me->fdata.external->filename;
- bpi->name = me->id.name+2;
- bpi->len = sizeof(me->fdata.external->filename);
+ Mesh *me= (Mesh *)bpi->data;
+ bpi->_lib= me->id.lib ? me->id.lib->filepath : NULL;
+ bpi->_path= me->fdata.external->filename;
+ bpi->_name= me->id.name+2;
+ bpi->len= sizeof(me->fdata.external->filename);
break;
} else {
bpi_type_step__internal(bpi);
@@ -442,8 +619,8 @@ int BLI_bpathIterator_isDone( struct BPathIterator *bpi) {
/* include the path argument */
static void bpath_as_report(struct BPathIterator *bpi, const char *message, ReportList *reports)
{
- char *prefix;
- char *name;
+ const char *prefix;
+ const char *name;
char path_expanded[FILE_MAXDIR*2];
if(reports==NULL)
@@ -453,6 +630,12 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
case BPATH_IMAGE:
prefix= "Image";
break;
+ case BPATH_TEXTURE:
+ prefix= "Texture";
+ break;
+ case BPATH_TEXT:
+ prefix= "Text";
+ break;
case BPATH_SOUND:
prefix= "Sound";
break;
@@ -473,7 +656,7 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
break;
}
- name = BLI_bpathIterator_getName(bpi);
+ name= BLI_bpathIterator_getName(bpi);
BLI_bpathIterator_getPathExpanded(bpi, path_expanded);
if(reports) {
@@ -484,37 +667,38 @@ static void bpath_as_report(struct BPathIterator *bpi, const char *message, Repo
}
/* high level function */
-void checkMissingFiles(char *basepath, ReportList *reports) {
- struct BPathIterator bpi;
+void checkMissingFiles(Main *bmain, ReportList *reports) {
+ struct BPathIterator *bpi;
/* be sure there is low chance of the path being too short */
char filepath_expanded[FILE_MAXDIR*2];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_expanded );
+ BLI_bpathIterator_init(&bpi, bmain, bmain->name, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
if (!BLI_exists(filepath_expanded))
- bpath_as_report(&bpi, "file not found", reports);
+ bpath_as_report(bpi, "file not found", reports);
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
}
/* dont log any errors at the moment, should probably do this */
-void makeFilesRelative(char *basepath, ReportList *reports) {
+void makeFilesRelative(Main *bmain, const char *basedir, ReportList *reports) {
int tot= 0, changed= 0, failed= 0, linked= 0;
- struct BPathIterator bpi;
- char filepath[FILE_MAX], *libpath;
+ struct BPathIterator *bpi;
+ char filepath[FILE_MAX];
+ const char *libpath;
/* be sure there is low chance of the path being too short */
char filepath_relative[(FILE_MAXDIR * 2) + FILE_MAXFILE];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ BLI_bpathIterator_init(&bpi, bmain, basedir, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
if(strncmp(filepath, "//", 2)) {
if (libpath) { /* cant make relative if we are library - TODO, LOG THIS */
@@ -523,27 +707,27 @@ void makeFilesRelative(char *basepath, ReportList *reports) {
BLI_strncpy(filepath_relative, filepath, sizeof(filepath_relative));
/* Important BLI_cleanup_dir runs before the path is made relative
* because it wont work for paths that start with "//../" */
- BLI_cleanup_file(bpi.base_path, filepath_relative); /* fix any /foo/../foo/ */
- BLI_path_rel(filepath_relative, bpi.base_path);
+ BLI_cleanup_file(bpi->base_path, filepath_relative); /* fix any /foo/../foo/ */
+ BLI_path_rel(filepath_relative, bpi->base_path);
/* be safe and check the length */
- if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_relative)) {
- bpath_as_report(&bpi, "couldn't make path relative (too long)", reports);
+ if (BLI_bpathIterator_getPathMaxLen(bpi) <= strlen(filepath_relative)) {
+ bpath_as_report(bpi, "couldn't make path relative (too long)", reports);
failed++;
} else {
if(strncmp(filepath_relative, "//", 2)==0) {
- BLI_bpathIterator_setPath(&bpi, filepath_relative);
+ BLI_bpathIterator_setPath(bpi, filepath_relative);
changed++;
} else {
- bpath_as_report(&bpi, "couldn't make path relative", reports);
+ bpath_as_report(bpi, "couldn't make path relative", reports);
failed++;
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
tot++;
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
if(reports)
BKE_reportf(reports, failed ? RPT_ERROR : RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
@@ -551,46 +735,47 @@ void makeFilesRelative(char *basepath, ReportList *reports) {
/* dont log any errors at the moment, should probably do this -
* Verry similar to makeFilesRelative - keep in sync! */
-void makeFilesAbsolute(char *basepath, ReportList *reports)
+void makeFilesAbsolute(Main *bmain, const char *basedir, ReportList *reports)
{
int tot= 0, changed= 0, failed= 0, linked= 0;
- struct BPathIterator bpi;
- char filepath[FILE_MAX], *libpath;
+ struct BPathIterator *bpi;
+ char filepath[FILE_MAX];
+ const char *libpath;
/* be sure there is low chance of the path being too short */
char filepath_absolute[(FILE_MAXDIR * 2) + FILE_MAXFILE];
- BLI_bpathIterator_init(&bpi, basepath);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ BLI_bpathIterator_init(&bpi, bmain, basedir, 0);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
if(strncmp(filepath, "//", 2)==0) {
if (libpath) { /* cant make absolute if we are library - TODO, LOG THIS */
linked++;
} else { /* get the expanded path and check it is relative or too long */
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_absolute );
- BLI_cleanup_file(bpi.base_path, filepath_absolute); /* fix any /foo/../foo/ */
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_absolute);
+ BLI_cleanup_file(bpi->base_path, filepath_absolute); /* fix any /foo/../foo/ */
/* to be safe, check the length */
- if (BLI_bpathIterator_getPathMaxLen(&bpi) <= strlen(filepath_absolute)) {
- bpath_as_report(&bpi, "couldn't make absolute (too long)", reports);
+ if (BLI_bpathIterator_getPathMaxLen(bpi) <= strlen(filepath_absolute)) {
+ bpath_as_report(bpi, "couldn't make absolute (too long)", reports);
failed++;
} else {
if(strncmp(filepath_absolute, "//", 2)) {
- BLI_bpathIterator_setPath(&bpi, filepath_absolute);
+ BLI_bpathIterator_setPath(bpi, filepath_absolute);
changed++;
} else {
- bpath_as_report(&bpi, "couldn't make absolute", reports);
+ bpath_as_report(bpi, "couldn't make absolute", reports);
failed++;
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
tot++;
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
if(reports)
BKE_reportf(reports, failed ? RPT_ERROR : RPT_INFO, "Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
@@ -612,20 +797,20 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
char path[FILE_MAX];
int size;
- dir = opendir(dirname);
+ dir= opendir(dirname);
- if (dir==0)
+ if (dir==NULL)
return 0;
if (*filesize == -1)
- *filesize = 0; /* dir opened fine */
+ *filesize= 0; /* dir opened fine */
- while ((de = readdir(dir)) != NULL) {
+ while ((de= readdir(dir)) != NULL) {
if (strcmp(".", de->d_name)==0 || strcmp("..", de->d_name)==0)
continue;
- BLI_join_dirfile(path, dirname, de->d_name);
+ BLI_join_dirfile(path, sizeof(path), dirname, de->d_name);
if (stat(path, &status) != 0)
continue; /* cant stat, dont bother with this file, could print debug info here */
@@ -633,9 +818,9 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
if (S_ISREG(status.st_mode)) { /* is file */
if (strncmp(filename, de->d_name, FILE_MAX)==0) { /* name matches */
/* open the file to read its size */
- size = BLI_filepathsize(path);
+ size= status.st_size;
if ((size > 0) && (size > *filesize)) { /* find the biggest file */
- *filesize = size;
+ *filesize= size;
BLI_strncpy(filename_new, path, FILE_MAX);
}
}
@@ -652,12 +837,13 @@ static int findFileRecursive(char *filename_new, const char *dirname, const char
}
/* high level function - call from fileselector */
-void findMissingFiles(char *basepath, char *str) {
- struct BPathIterator bpi;
+void findMissingFiles(Main *bmain, const char *str) {
+ struct BPathIterator *bpi;
/* be sure there is low chance of the path being too short */
char filepath_expanded[FILE_MAXDIR*2];
- char filepath[FILE_MAX], *libpath;
+ char filepath[FILE_MAX];
+ const char *libpath;
int filesize, recur_depth;
char dirname[FILE_MAX], filename_new[FILE_MAX];
@@ -666,11 +852,11 @@ void findMissingFiles(char *basepath, char *str) {
BLI_split_dirfile(str, dirname, NULL);
- BLI_bpathIterator_init(&bpi, basepath);
+ BLI_bpathIterator_init(&bpi, bmain, bmain->name, 0);
- while (!BLI_bpathIterator_isDone(&bpi)) {
- BLI_bpathIterator_getPath(&bpi, filepath);
- libpath = BLI_bpathIterator_getLib(&bpi);
+ while (!BLI_bpathIterator_isDone(bpi)) {
+ BLI_bpathIterator_getPath(bpi, filepath);
+ libpath= BLI_bpathIterator_getLib(bpi);
/* Check if esc was pressed because searching files can be slow */
/*XXX if (blender_test_break()) {
@@ -679,12 +865,12 @@ void findMissingFiles(char *basepath, char *str) {
if (libpath==NULL) {
- BLI_bpathIterator_getPathExpanded( &bpi, filepath_expanded );
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
if (!BLI_exists(filepath_expanded)) {
/* can the dir be opened? */
- filesize = -1;
- recur_depth = 0;
+ filesize= -1;
+ recur_depth= 0;
findFileRecursive(filename_new, dirname, BLI_path_basename(filepath), &filesize, &recur_depth);
if (filesize == -1) { /* could not open dir */
@@ -694,21 +880,21 @@ void findMissingFiles(char *basepath, char *str) {
if (filesize > 0) {
- if (BLI_bpathIterator_getPathMaxLen( &bpi ) < strlen(filename_new)) {
+ if (BLI_bpathIterator_getPathMaxLen(bpi) < strlen(filename_new)) {
printf("cannot set path \"%s\" too long!", filename_new);
} else {
/* copy the found path into the old one */
if (G.relbase_valid)
- BLI_path_rel(filename_new, bpi.base_path);
+ BLI_path_rel(filename_new, bpi->base_path);
- BLI_bpathIterator_setPath( &bpi, filename_new );
+ BLI_bpathIterator_setPath(bpi, filename_new);
}
}
}
}
- BLI_bpathIterator_step(&bpi);
+ BLI_bpathIterator_step(bpi);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
//XXX waitcursor( 0 );
}
diff --git a/source/blender/blenlib/intern/cpu.c b/source/blender/blenlib/intern/cpu.c
index 65e6b34488c..644b4e72025 100644
--- a/source/blender/blenlib/intern/cpu.c
+++ b/source/blender/blenlib/intern/cpu.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
diff --git a/source/blender/blenlib/intern/dynamiclist.h b/source/blender/blenlib/intern/dynamiclist.h
index 3bf6e54a79b..03ccca576ff 100644
--- a/source/blender/blenlib/intern/dynamiclist.h
+++ b/source/blender/blenlib/intern/dynamiclist.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c
index f42b342e326..eb769d19210 100644
--- a/source/blender/blenlib/intern/dynlib.c
+++ b/source/blender/blenlib/intern/dynlib.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -63,7 +63,7 @@ PILdynlib *PIL_dynlib_open(char *name) {
}
}
-void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
+void *PIL_dynlib_find_symbol(PILdynlib* lib, const char *symname) {
return GetProcAddress(lib->handle, symname);
}
@@ -87,7 +87,7 @@ char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
return buf;
}
- return err;
+ return NULL;
}
void PIL_dynlib_close(PILdynlib *lib) {
@@ -117,11 +117,12 @@ PILdynlib *PIL_dynlib_open(char *name) {
}
}
-void *PIL_dynlib_find_symbol(PILdynlib* lib, char *symname) {
+void *PIL_dynlib_find_symbol(PILdynlib* lib, const char *symname) {
return dlsym(lib->handle, symname);
}
char *PIL_dynlib_get_error_as_string(PILdynlib* lib) {
+ (void)lib; /* unused */
return dlerror();
}
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index 44abd13c3fd..f885f7e5b22 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index fde770c238c..5ee652264c0 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -41,86 +41,24 @@
#ifdef WIN32
#include <io.h>
#include "BLI_winstuff.h"
+#include "BLI_callbacks.h"
#else
#include <unistd.h> // for read close
#include <sys/param.h>
#endif
-
#include "BLI_blenlib.h"
#include "BKE_utildefines.h"
#include "BLO_sys_types.h" // for intptr_t support
-/* implementations: */
-char *first_slash(char *string) {
- char *ffslash, *fbslash;
-
- ffslash= strchr(string, '/');
- fbslash= strchr(string, '\\');
-
- if (!ffslash) return fbslash;
- else if (!fbslash) return ffslash;
-
- if ((intptr_t)ffslash < (intptr_t)fbslash) return ffslash;
- else return fbslash;
-}
-
-char *BLI_last_slash(const char *string) {
- char *lfslash, *lbslash;
-
- lfslash= strrchr(string, '/');
- lbslash= strrchr(string, '\\');
-
- if (!lfslash) return lbslash;
- else if (!lbslash) return lfslash;
-
- if ((intptr_t)lfslash < (intptr_t)lbslash) return lbslash;
- else return lfslash;
-}
-
-/* adds a slash if there isnt one there already */
-int BLI_add_slash(char *string) {
- int len = strlen(string);
-#ifdef WIN32
- if (len==0 || string[len-1]!='\\') {
- string[len] = '\\';
- string[len+1] = '\0';
- return len+1;
- }
-#else
- if (len==0 || string[len-1]!='/') {
- string[len] = '/';
- string[len+1] = '\0';
- return len+1;
- }
-#endif
- return len;
-}
-
-/* removes a slash if there is one */
-void BLI_del_slash(char *string) {
- int len = strlen(string);
- while (len) {
-#ifdef WIN32
- if (string[len-1]=='\\') {
-#else
- if (string[len-1]=='/') {
-#endif
- string[len-1] = '\0';
- len--;
- } else {
- break;
- }
- }
-}
/* gzip the file in from and write it to "to".
return -1 if zlib fails, -2 if the originating file does not exist
note: will remove the "from" file
*/
-int BLI_gzip(char *from, char *to) {
+int BLI_gzip(const char *from, const char *to) {
char buffer[10240];
int file;
int readsize = 0;
@@ -160,7 +98,7 @@ int BLI_gzip(char *from, char *to) {
}
/* return 1 when file can be written */
-int BLI_is_writable(char *filename)
+int BLI_is_writable(const char *filename)
{
int file;
@@ -205,7 +143,7 @@ int BLI_touch(const char *file)
return 0;
}
-int BLI_exists(char *file) {
+int BLI_exists(const char *file) {
return BLI_exist(file);
}
@@ -213,7 +151,7 @@ int BLI_exists(char *file) {
static char str[MAXPATHLEN+12];
-int BLI_delete(char *file, int dir, int recursive) {
+int BLI_delete(const char *file, int dir, int recursive) {
int err;
if (recursive) {
@@ -230,7 +168,7 @@ int BLI_delete(char *file, int dir, int recursive) {
return err;
}
-int BLI_move(char *file, char *to) {
+int BLI_move(const char *file, const char *to) {
int err;
// windows doesn't support moveing to a directory
@@ -255,7 +193,7 @@ int BLI_move(char *file, char *to) {
}
-int BLI_copy_fileops(char *file, char *to) {
+int BLI_copy_fileops(const char *file, const char *to) {
int err;
// windows doesn't support copying to a directory
@@ -280,13 +218,13 @@ int BLI_copy_fileops(char *file, char *to) {
return err;
}
-int BLI_link(char *file, char *to) {
+int BLI_link(const char *file, const char *to) {
callLocalErrorCallBack("Linking files is unsupported on Windows");
return 1;
}
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
char *lslash;
char tmp[MAXPATHLEN];
@@ -316,7 +254,7 @@ void BLI_recurdir_fileops(char *dirname) {
callLocalErrorCallBack("Unable to create directory\n");
}
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
if (!BLI_exists(from)) return 0;
/* make sure the filenames are different (case insensitive) before removing */
@@ -326,55 +264,55 @@ int BLI_rename(char *from, char *to) {
return rename(from, to);
}
-#else /* The weirdo UNIX world */
+#else /* The UNIX world */
/*
* but the UNIX world is tied to the interface, and the system
* timer, and... We implement a callback mechanism. The system will
* have to initialise the callback before the functions will work!
* */
-static char str[MAXPATHLEN+12];
+static char str[12 + (MAXPATHLEN * 2)];
-int BLI_delete(char *file, int dir, int recursive)
+int BLI_delete(const char *file, int dir, int recursive)
{
if(strchr(file, '"')) {
printf("Error: not deleted file %s because of quote!\n", file);
}
else {
if (recursive) {
- sprintf(str, "/bin/rm -rf \"%s\"", file);
+ BLI_snprintf(str, sizeof(str), "/bin/rm -rf \"%s\"", file);
return system(str);
}
else if (dir) {
- sprintf(str, "/bin/rmdir \"%s\"", file);
+ BLI_snprintf(str, sizeof(str), "/bin/rmdir \"%s\"", file);
return system(str);
}
else {
- return remove(file); //sprintf(str, "/bin/rm -f \"%s\"", file);
+ return remove(file); //BLI_snprintf(str, sizeof(str), "/bin/rm -f \"%s\"", file);
}
}
return -1;
}
-int BLI_move(char *file, char *to) {
- sprintf(str, "/bin/mv -f \"%s\" \"%s\"", file, to);
+int BLI_move(const char *file, const char *to) {
+ BLI_snprintf(str, sizeof(str), "/bin/mv -f \"%s\" \"%s\"", file, to);
return system(str);
}
-int BLI_copy_fileops(char *file, char *to) {
- sprintf(str, "/bin/cp -rf \"%s\" \"%s\"", file, to);
+int BLI_copy_fileops(const char *file, const char *to) {
+ BLI_snprintf(str, sizeof(str), "/bin/cp -rf \"%s\" \"%s\"", file, to);
return system(str);
}
-int BLI_link(char *file, char *to) {
- sprintf(str, "/bin/ln -f \"%s\" \"%s\"", file, to);
+int BLI_link(const char *file, const char *to) {
+ BLI_snprintf(str, sizeof(str), "/bin/ln -f \"%s\" \"%s\"", file, to);
return system(str);
}
-void BLI_recurdir_fileops(char *dirname) {
+void BLI_recurdir_fileops(const char *dirname) {
char *lslash;
char tmp[MAXPATHLEN];
@@ -392,7 +330,7 @@ void BLI_recurdir_fileops(char *dirname) {
mkdir(dirname, 0777);
}
-int BLI_rename(char *from, char *to) {
+int BLI_rename(const char *from, const char *to) {
if (!BLI_exists(from)) return 0;
if (BLI_exists(to)) if(BLI_delete(to, 0, 0)) return 1;
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index 6d6abc88999..1b569cf794f 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -46,12 +46,13 @@
#include "BLI_vfontdata.h"
#include "BLI_blenlib.h"
-#include "BLI_math.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
//XXX #include "BIF_toolbox.h"
#include "BKE_font.h"
-#include "BKE_utildefines.h"
+
#include "DNA_vfont_types.h"
#include "DNA_packedFile_types.h"
@@ -126,7 +127,6 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
// get number of on-curve points for beziertriples (including conic virtual on-points)
for(j = 0; j < ftoutline.n_contours; j++) {
- l = 0;
for(k = 0; k < npoints[j]; k++) {
if(j > 0) l = k + ftoutline.contours[j - 1] + 1; else l = k;
if(ftoutline.tags[l] == FT_Curve_Tag_On)
@@ -252,15 +252,15 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
}
// get the handles that are aligned, tricky...
- // DistVL2Dfl, check if the three beztriple points are on one line
- // VecLenf, see if there's a distance between the three points
- // VecLenf again, to check the angle between the handles
+ // dist_to_line_v2, check if the three beztriple points are on one line
+ // len_squared_v2v2, see if there's a distance between the three points
+ // len_squared_v2v2 again, to check the angle between the handles
// finally, check if one of them is a vector handle
if((dist_to_line_v2(bezt->vec[0],bezt->vec[1],bezt->vec[2]) < 0.001) &&
- (len_v3v3(bezt->vec[0], bezt->vec[1]) > 0.0001) &&
- (len_v3v3(bezt->vec[1], bezt->vec[2]) > 0.0001) &&
- (len_v3v3(bezt->vec[0], bezt->vec[2]) > 0.0002) &&
- (len_v3v3(bezt->vec[0], bezt->vec[2]) > MAX2(len_v3v3(bezt->vec[0], bezt->vec[1]), len_v3v3(bezt->vec[1], bezt->vec[2]))) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001*0.0001) &&
+ (len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001*0.0001) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002*0.0001) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > MAX2(len_squared_v2v2(bezt->vec[0], bezt->vec[1]), len_squared_v2v2(bezt->vec[1], bezt->vec[2]))) &&
bezt->h1 != HD_VECT && bezt->h2 != HD_VECT)
{
bezt->h1= bezt->h2= HD_ALIGN;
@@ -367,7 +367,7 @@ static VFontData *objfnt_to_ftvfontdata(PackedFile * pf)
// No charmap found from the ttf so we need to figure it out
if(glyph_index == 0)
{
- FT_CharMap found = 0;
+ FT_CharMap found = NULL;
FT_CharMap charmap;
int n;
@@ -477,7 +477,7 @@ VFontData *BLI_vfontdata_from_freetypefont(PackedFile *pf)
err = FT_Init_FreeType( &library);
if(err) {
//XXX error("Failed to load the Freetype font library");
- return 0;
+ return NULL;
}
success = check_freetypefont(pf);
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index b1ea058eda1..050effdf5b4 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,8 +31,9 @@
#include "BLI_graph.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
static void testRadialSymmetry(BGraph *graph, BNode* root_node, RadialArc* ring, int total, float axis[3], float limit, int group);
@@ -128,7 +129,7 @@ void BLI_buildAdjacencyList(BGraph *graph)
{
if (node->degree != node->flag)
{
- printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ printf("error in node [%p]. Added only %i arcs out of %i\n", (void *)node, node->flag, node->degree);
}
}
}
@@ -161,7 +162,7 @@ void BLI_rebuildAdjacencyListForNode(BGraph* graph, BNode *node)
if (node->degree != node->flag)
{
- printf("error in node [%p]. Added only %i arcs out of %i\n", node, node->flag, node->degree);
+ printf("error in node [%p]. Added only %i arcs out of %i\n", (void *)node, node->flag, node->degree);
}
}
@@ -295,7 +296,7 @@ BNode * BLI_FindNodeByPosition(BGraph *graph, float *p, float limit)
}
/************************************* SUBGRAPH DETECTION **********************************************/
-void flagSubgraph(BNode *node, int subgraph)
+static void flagSubgraph(BNode *node, int subgraph)
{
if (node->subgraph_index == 0)
{
@@ -409,7 +410,7 @@ int BLI_isGraphCyclic(BGraph *graph)
BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v)
{
- BArc *nextArc = arc->next;
+ BArc *nextArc;
for(nextArc = graph->arcs.first; nextArc; nextArc = nextArc->next)
{
@@ -424,7 +425,7 @@ BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v)
/*********************************** GRAPH AS TREE FUNCTIONS *******************************************/
-int subtreeShape(BNode *node, BArc *rootArc, int include_root)
+static int subtreeShape(BNode *node, BArc *rootArc, int include_root)
{
int depth = 0;
diff --git a/source/blender/blenlib/intern/gsqueue.c b/source/blender/blenlib/intern/gsqueue.c
index a8b40e187d8..0936759b680 100644
--- a/source/blender/blenlib/intern/gsqueue.c
+++ b/source/blender/blenlib/intern/gsqueue.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/jitter.c b/source/blender/blenlib/intern/jitter.c
index dfc554394d6..f4305d45735 100644
--- a/source/blender/blenlib/intern/jitter.c
+++ b/source/blender/blenlib/intern/jitter.c
@@ -1,4 +1,4 @@
-/**
+/*
* Jitter offset table
*
* $Id$
@@ -34,6 +34,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_rand.h"
+#include "BLI_jitter.h"
void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1)
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 776f2d085df..975479a3875 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -46,20 +46,20 @@
/* implementation */
/* Ripped this from blender.c */
-void addlisttolist(ListBase *list1, ListBase *list2)
+void BLI_movelisttolist(ListBase *dst, ListBase *src)
{
- if (list2->first==0) return;
+ if (src->first==NULL) return;
- if (list1->first==0) {
- list1->first= list2->first;
- list1->last= list2->last;
+ if (dst->first==NULL) {
+ dst->first= src->first;
+ dst->last= src->last;
}
else {
- ((Link *)list1->last)->next= list2->first;
- ((Link *)list2->first)->prev= list1->last;
- list1->last= list2->last;
+ ((Link *)dst->last)->next= src->first;
+ ((Link *)src->first)->prev= dst->last;
+ dst->last= src->last;
}
- list2->first= list2->last= 0;
+ src->first= src->last= NULL;
}
void BLI_addhead(ListBase *listbase, void *vlink)
@@ -89,7 +89,7 @@ void BLI_addtail(ListBase *listbase, void *vlink)
link->prev = listbase->last;
if (listbase->last) ((Link *)listbase->last)->next = link;
- if (listbase->first == 0) listbase->first = link;
+ if (listbase->first == NULL) listbase->first = link;
listbase->last = link;
}
@@ -152,7 +152,7 @@ void BLI_insertlink(ListBase *listbase, void *vprevlink, void *vnewlink)
/* insert before first element */
if (prevlink == NULL) {
newlink->next= listbase->first;
- newlink->prev= 0;
+ newlink->prev= NULL;
newlink->next->prev= newlink;
listbase->first= newlink;
return;
@@ -251,7 +251,7 @@ void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink)
/* insert at end of list */
if (nextlink == NULL) {
newlink->prev= listbase->last;
- newlink->next= 0;
+ newlink->next= NULL;
((Link *)listbase->last)->next= newlink;
listbase->last= newlink;
return;
@@ -304,7 +304,7 @@ void BLI_freelistN(ListBase *listbase)
}
-int BLI_countlist(ListBase *listbase)
+int BLI_countlist(const ListBase *listbase)
{
Link *link;
int count = 0;
@@ -319,7 +319,7 @@ int BLI_countlist(ListBase *listbase)
return count;
}
-void *BLI_findlink(ListBase *listbase, int number)
+void *BLI_findlink(const ListBase *listbase, int number)
{
Link *link = NULL;
@@ -334,7 +334,7 @@ void *BLI_findlink(ListBase *listbase, int number)
return link;
}
-int BLI_findindex(ListBase *listbase, void *vlink)
+int BLI_findindex(const ListBase *listbase, void *vlink)
{
Link *link= NULL;
int number= 0;
@@ -354,7 +354,7 @@ int BLI_findindex(ListBase *listbase, void *vlink)
return -1;
}
-void *BLI_findstring(ListBase *listbase, const char *id, int offset)
+void *BLI_findstring(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -374,7 +374,7 @@ void *BLI_findstring(ListBase *listbase, const char *id, int offset)
return NULL;
}
-void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
+void *BLI_findstring_ptr(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -395,7 +395,7 @@ void *BLI_findstring_ptr(ListBase *listbase, const char *id, int offset)
return NULL;
}
-int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
+int BLI_findstringindex(const ListBase *listbase, const char *id, const int offset)
{
Link *link= NULL;
const char *id_iter;
@@ -416,20 +416,20 @@ int BLI_findstringindex(ListBase *listbase, const char *id, int offset)
return -1;
}
-void BLI_duplicatelist(ListBase *list1, const ListBase *list2)
+void BLI_duplicatelist(ListBase *dst, const ListBase *src)
{
- struct Link *link1, *link2;
-
- /* in this order, to ensure it works if list1 == list2 */
- link2= list2->first;
- list1->first= list1->last= 0;
-
- while(link2) {
- link1= MEM_dupallocN(link2);
- BLI_addtail(list1, link1);
-
- link2= link2->next;
- }
+ struct Link *dst_link, *src_link;
+
+ /* in this order, to ensure it works if dst == src */
+ src_link= src->first;
+ dst->first= dst->last= NULL;
+
+ while(src_link) {
+ dst_link= MEM_dupallocN(src_link);
+ BLI_addtail(dst, dst_link);
+
+ src_link= src_link->next;
+ }
}
/* create a generic list node containing link to provided data */
diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c
index 686b35a878e..4f0d4bbeba0 100644
--- a/source/blender/blenlib/intern/math_base.c
+++ b/source/blender/blenlib/intern/math_base.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -52,7 +52,8 @@ double round(double x)
y += 1.0;
return copysign(y, x);
}
-
+#else /* OpenSuse 11.1 seems to need this. */
+double round(double x);
#endif
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index b364ff73e4f..099c14a6556 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,8 +32,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_BASE_INLINE
-#define BLI_MATH_BASE_INLINE
+#ifndef BLI_MATH_BASE_INLINE_H
+#define BLI_MATH_BASE_INLINE_H
/* A few small defines. Keep'em local! */
#define SMALL_NUMBER 1.e-8
@@ -122,5 +122,10 @@ MINLINE float maxf(float a, float b)
return (a > b)? a: b;
}
-#endif /* BLI_MATH_BASE_INLINE */
+MINLINE float signf(float f)
+{
+ return (f < 0.f)? -1.f: 1.f;
+}
+
+#endif /* BLI_MATH_BASE_INLINE_H */
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 693fd885b50..2f2e8d6fc61 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
* */
+#include <assert.h>
#include "BLI_math.h"
@@ -111,7 +112,7 @@ void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb)
void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, int colorspace)
{
float sr,sg, sb;
- float y, cr, cb;
+ float y = 128.f, cr = 128.f, cb = 128.f;
sr=255.0f*r;
sg=255.0f*g;
@@ -133,6 +134,8 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, in
cb=(-0.16874f*sr)-(0.33126f*sg)+(0.5f*sb)+128.0f;
cr=(0.5f*sr)-(0.41869f*sg)-(0.08131f*sb)+128.0f;
break;
+ default:
+ assert(!"invalid colorspace");
}
*ly=y;
@@ -141,11 +144,12 @@ void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr, in
}
-/* YCC input have a range of 16-235 and 16-240 exepect with JFIF_0_255 where the range is 0-255 */
+/* YCC input have a range of 16-235 and 16-240 except with JFIF_0_255 where the range is 0-255 */
/* RGB outputs are in the range 0 - 1.0f */
+/* FIXME comment above must be wrong because BLI_YCC_ITU_BT601 y 16.0 cr 16.0 -> r -0.7009 */
void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, int colorspace)
{
- float r,g,b;
+ float r = 128.f, g = 128.f, b = 128.f;
switch (colorspace) {
case BLI_YCC_ITU_BT601 :
@@ -163,6 +167,8 @@ void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, in
g=y-0.34414f*cb - 0.71414f*cr + 135.45984f;
b=y+1.772f*cb - 226.816f;
break;
+ default:
+ assert(!"invalid colorspace");
}
*lr=r/255.0f;
*lg=g/255.0f;
@@ -172,13 +178,16 @@ void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb, in
void hex_to_rgb(char *hexcol, float *r, float *g, float *b)
{
unsigned int ri, gi, bi;
-
+
if (hexcol[0] == '#') hexcol++;
-
- if (sscanf(hexcol, "%02x%02x%02x", &ri, &gi, &bi)) {
+
+ if (sscanf(hexcol, "%02x%02x%02x", &ri, &gi, &bi)==3) {
*r = ri / 255.0f;
- *g = gi / 255.0f;
+ *g = gi / 255.0f;
*b = bi / 255.0f;
+ CLAMP(*r, 0.0f, 1.0f);
+ CLAMP(*g, 0.0f, 1.0f);
+ CLAMP(*b, 0.0f, 1.0f);
}
}
@@ -200,7 +209,6 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv)
s = (cmax - cmin)/cmax;
else {
s = 0.0f;
- h = 0.0f;
}
if (s == 0.0f)
h = -1.0f;
@@ -227,6 +235,26 @@ void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv)
*lv = v;
}
+void rgb_to_hsv_compat(float r, float g, float b, float *lh, float *ls, float *lv)
+{
+ float orig_h= *lh;
+ float orig_s= *ls;
+
+ rgb_to_hsv(r, g, b, lh, ls, lv);
+
+ if(*lv <= 0.0f) {
+ *lh= orig_h;
+ *ls= orig_s;
+ }
+ else if (*ls <= 0.0f) {
+ *lh= orig_h;
+ }
+
+ if(*lh==0.0f && orig_h >= 1.0f) {
+ *lh= 1.0f;
+ }
+}
+
/*http://brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html */
void xyz_to_rgb(float xc, float yc, float zc, float *r, float *g, float *b, int colorspace)
@@ -298,14 +326,14 @@ void cpack_to_rgb(unsigned int col, float *r, float *g, float *b)
*b /= 255.0f;
}
-void rgb_byte_to_float(char *in, float *out)
+void rgb_byte_to_float(const unsigned char *in, float *out)
{
out[0]= ((float)in[0]) / 255.0f;
out[1]= ((float)in[1]) / 255.0f;
out[2]= ((float)in[2]) / 255.0f;
}
-void rgb_float_to_byte(float *in, char *out)
+void rgb_float_to_byte(const float *in, unsigned char *out)
{
int r, g, b;
@@ -393,6 +421,7 @@ void srgb_to_linearrgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
{
while(tot--) {
srgb_to_linearrgb_v3_v3(col_to, col_from);
+ col_to[3]= col_from[3];
col_to += 4;
col_from += 4;
}
@@ -402,6 +431,7 @@ void linearrgb_to_srgb_rgba_rgba_buf(float *col_to, float *col_from, int tot)
{
while(tot--) {
linearrgb_to_srgb_v3_v3(col_to, col_from);
+ col_to[3]= col_from[3];
col_to += 4;
col_from += 4;
}
@@ -418,7 +448,7 @@ void minmax_rgb(short c[])
}
/*If the requested RGB shade contains a negative weight for
- one of the primaries, it lies outside the colour gamut
+ one of the primaries, it lies outside the color gamut
accessible from the given triple of primaries. Desaturate
it by adding white, equal quantities of R, G, and B, enough
to make RGB all positive. The function returns 1 if the
@@ -464,3 +494,28 @@ void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *o
}
}
+/* ******************************************** other ************************************************* */
+
+/* Applies an hue offset to a float rgb color */
+void rgb_float_set_hue_float_offset(float rgb[3], float hue_offset)
+{
+ float hsv[3];
+
+ rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
+ hsv[0]+= hue_offset;
+ if(hsv[0]>1.0) hsv[0]-=1.0;
+ else if(hsv[0]<0.0) hsv[0]+= 1.0;
+
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
+}
+
+/* Applies an hue offset to a byte rgb color */
+void rgb_byte_set_hue_float_offset(unsigned char rgb[3], float hue_offset)
+{
+ float rgb_float[3];
+
+ rgb_byte_to_float(rgb, rgb_float);
+ rgb_float_set_hue_float_offset(rgb_float, hue_offset);
+ rgb_float_to_byte(rgb_float, rgb);
+}
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index 6756f42bf35..2d4935ed4a6 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,8 +30,9 @@
#include "BLI_math.h"
#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
/********************************** Polygons *********************************/
@@ -233,53 +234,114 @@ float dist_to_line_segment_v3(float *v1, float *v2, float *v3)
/******************************* Intersection ********************************/
/* intersect Line-Line, shorts */
-int isect_line_line_v2_short(short *v1, short *v2, short *v3, short *v4)
+int isect_line_line_v2_short(const short *v1, const short *v2, const short *v3, const short *v4)
{
- /* return:
- -1: colliniar
- 0: no intersection of segments
- 1: exact intersection of segments
- 2: cross-intersection of segments
- */
float div, labda, mu;
div= (float)((v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]));
- if(div==0.0f) return -1;
+ if(div==0.0f) return ISECT_LINE_LINE_COLINEAR;
labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
if(labda>=0.0f && labda<=1.0f && mu>=0.0f && mu<=1.0f) {
- if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return 1;
- return 2;
+ if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return ISECT_LINE_LINE_EXACT;
+ return ISECT_LINE_LINE_CROSS;
}
- return 0;
+ return ISECT_LINE_LINE_NONE;
}
/* intersect Line-Line, floats */
-int isect_line_line_v2(float *v1, float *v2, float *v3, float *v4)
+int isect_line_line_v2(const float *v1, const float *v2, const float *v3, const float *v4)
{
- /* return:
- -1: colliniar
-0: no intersection of segments
-1: exact intersection of segments
-2: cross-intersection of segments
- */
float div, labda, mu;
div= (v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]);
- if(div==0.0) return -1;
+ if(div==0.0) return ISECT_LINE_LINE_COLINEAR;
labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
if(labda>=0.0 && labda<=1.0 && mu>=0.0 && mu<=1.0) {
- if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return 1;
- return 2;
+ if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return ISECT_LINE_LINE_EXACT;
+ return ISECT_LINE_LINE_CROSS;
}
- return 0;
+ return ISECT_LINE_LINE_NONE;
+}
+
+/* get intersection point of two 2D segments and return intersection type:
+ -1: colliniar
+ 1: intersection */
+int isect_seg_seg_v2_point(const float *v1, const float *v2, const float *v3, const float *v4, float vi[2])
+{
+ float a1, a2, b1, b2, c1, c2, d;
+ float u, v;
+ const float eps= 0.000001f;
+
+ a1= v2[0]-v1[0];
+ b1= v4[0]-v3[0];
+ c1= v1[0]-v4[0];
+
+ a2= v2[1]-v1[1];
+ b2= v4[1]-v3[1];
+ c2= v1[1]-v4[1];
+
+ d= a1*b2-a2*b1;
+
+ if(d==0) {
+ if(a1*c2-a2*c1==0.0f && b1*c2-b2*c1==0.0f) { /* equal lines */
+ float a[2], b[2], c[2];
+ float u2;
+
+ if(len_v2v2(v1, v2)==0.0f) {
+ if(len_v2v2(v3, v4)>eps) {
+ /* use non-point segment as basis */
+ SWAP(const float *, v1, v3);
+ SWAP(const float *, v2, v4);
+ } else { /* both of segments are points */
+ if(equals_v2v2(v1, v3)) { /* points are equal */
+ copy_v2_v2(vi, v1);
+ return 1;
+ }
+
+ /* two different points */
+ return -1;
+ }
+ }
+
+ sub_v2_v2v2(a, v3, v1);
+ sub_v2_v2v2(b, v2, v1);
+ sub_v2_v2v2(c, v2, v1);
+ u= dot_v2v2(a, b) / dot_v2v2(c, c);
+
+ sub_v2_v2v2(a, v4, v1);
+ u2= dot_v2v2(a, b) / dot_v2v2(c, c);
+
+ if(u>u2) SWAP(float, u, u2);
+
+ if(u>1.0f+eps || u2<-eps) return -1; /* non-ovlerlapping segments */
+ else if(maxf(0.0f, u) == minf(1.0f, u2)){ /* one common point: can return result */
+ interp_v2_v2v2(vi, v1, v2, maxf(0, u));
+ return 1;
+ }
+ }
+
+ /* lines are colliniar */
+ return -1;
+ }
+
+ u= (c2*b1-b2*c1)/d;
+ v= (c1*a2-a1*c2)/d;
+
+ if(u>=-eps && u<=1.0f+eps && v>=-eps && v<=1.0f+eps) { /* intersection */
+ interp_v2_v2v2(vi, v1, v2, u);
+ return 1;
+ }
+
+ /* out of segment intersection */
+ return -1;
}
/*
@@ -336,20 +398,19 @@ static short IsectLLPt2Df(float x0,float y0,float x1,float y1,
return 1;
} // end Intersect_Lines
-#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
/* point in tri */
-// XXX was called IsectPT2Df
+
int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
{
- if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
- if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
- if (SIDE_OF_LINE(v3,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0) {
+ if (line_point_side_v2(v3,v1,pt)>=0.0) {
return 1;
}
}
} else {
- if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v3,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
+ if (! (line_point_side_v2(v3,v1,pt)>=0.0)) {
return -1;
}
}
@@ -360,18 +421,18 @@ int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
/* point in quad - only convex quads */
int isect_point_quad_v2(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2])
{
- if (SIDE_OF_LINE(v1,v2,pt)>=0.0) {
- if (SIDE_OF_LINE(v2,v3,pt)>=0.0) {
- if (SIDE_OF_LINE(v3,v4,pt)>=0.0) {
- if (SIDE_OF_LINE(v4,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0) {
+ if (line_point_side_v2(v3,v4,pt)>=0.0) {
+ if (line_point_side_v2(v4,v1,pt)>=0.0) {
return 1;
}
}
}
} else {
- if (! (SIDE_OF_LINE(v2,v3,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v3,v4,pt)>=0.0)) {
- if (! (SIDE_OF_LINE(v4,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
+ if (! (line_point_side_v2(v3,v4,pt)>=0.0)) {
+ if (! (line_point_side_v2(v4,v1,pt)>=0.0)) {
return -1;
}
}
@@ -557,7 +618,7 @@ static int getLowestRoot(float a, float b, float c, float maxR, float* root)
if (determinant >= 0.0f)
{
// calculate the two roots: (if determinant == 0 then
- // x1==x2 but let’s disregard that slight optimization)
+ // x1==x2 but lets disregard that slight optimization)
float sqrtD = (float)sqrt(determinant);
float r1 = (-b - sqrtD) / (2.0f*a);
float r2 = (-b + sqrtD) / (2.0f*a);
@@ -589,7 +650,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
{
float e1[3], e2[3], e3[3], point[3], vel[3], /*dist[3],*/ nor[3], temp[3], bv[3];
float a, b, c, d, e, x, y, z, radius2=radius*radius;
- float elen2,edotv,edotbv,nordotv,vel2;
+ float elen2,edotv,edotbv,nordotv;
float newLambda;
int found_by_sweep=0;
@@ -663,7 +724,7 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
*lambda=1.0f;
/*---test points---*/
- a=vel2=dot_v3v3(vel,vel);
+ a=dot_v3v3(vel,vel);
/*v0*/
sub_v3_v3v3(temp,p1,v0);
@@ -752,10 +813,10 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
}
/*e3*/
- sub_v3_v3v3(bv,v0,p1);
- elen2 = dot_v3v3(e1,e1);
- edotv = dot_v3v3(e1,vel);
- edotbv = dot_v3v3(e1,bv);
+ /* sub_v3_v3v3(bv,v0,p1); */ /* UNUSED */
+ /* elen2 = dot_v3v3(e1,e1); */ /* UNUSED */
+ /* edotv = dot_v3v3(e1,vel); */ /* UNUSED */
+ /* edotbv = dot_v3v3(e1,bv); */ /* UNUSED */
sub_v3_v3v3(bv,v1,p1);
elen2 = dot_v3v3(e3,e3);
@@ -900,7 +961,6 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3]
{
float a[3], b[3], c[3], ab[3], cb[3], ca[3], dir1[3], dir2[3];
float d;
- float d1;
sub_v3_v3v3(c, v3, v1);
sub_v3_v3v3(a, v2, v1);
@@ -913,8 +973,6 @@ int isect_line_line_strict_v3(float v1[3], float v2[3], float v3[3], float v4[3]
/* colinear or one vector is zero-length*/
return 0;
}
-
- d1 = d;
cross_v3_v3v3(ab, a, b);
d = dot_v3v3(c, ab);
@@ -961,7 +1019,7 @@ int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3
/* find closest point to p on line through l1,l2 and return lambda,
* where (0 <= lambda <= 1) when cp is in the line segement l1,l2
*/
-float closest_to_line_v3(float cp[3],float p[3], float l1[3], float l2[3])
+float closest_to_line_v3(float cp[3], const float p[3], const float l1[3], const float l2[3])
{
float h[3],u[3],lambda;
sub_v3_v3v3(u, l2, l1);
@@ -973,6 +1031,17 @@ float closest_to_line_v3(float cp[3],float p[3], float l1[3], float l2[3])
return lambda;
}
+float closest_to_line_v2(float cp[2],const float p[2], const float l1[2], const float l2[2])
+{
+ float h[2],u[2],lambda;
+ sub_v2_v2v2(u, l2, l1);
+ sub_v2_v2v2(h, p, l1);
+ lambda =dot_v2v2(u,h)/dot_v2v2(u,u);
+ cp[0] = l1[0] + u[0] * lambda;
+ cp[1] = l1[1] + u[1] * lambda;
+ return lambda;
+}
+
#if 0
/* little sister we only need to know lambda */
static float lambda_cp_line(float p[3], float l1[3], float l2[3])
@@ -1289,6 +1358,71 @@ int clip_line_plane(float p1[3], float p2[3], float plane[4])
}
}
+
+void plot_line_v2v2i(int p1[2], int p2[2], int (*callback)(int, int, void *), void *userData)
+{
+ int x1= p1[0];
+ int y1= p1[1];
+ int x2= p2[0];
+ int y2= p2[1];
+
+ signed char ix;
+ signed char iy;
+
+ // if x1 == x2 or y1 == y2, then it does not matter what we set here
+ int delta_x = (x2 > x1?(ix = 1, x2 - x1):(ix = -1, x1 - x2)) << 1;
+ int delta_y = (y2 > y1?(iy = 1, y2 - y1):(iy = -1, y1 - y2)) << 1;
+
+ if(callback(x1, y1, userData) == 0) {
+ return;
+ }
+
+ if (delta_x >= delta_y) {
+ // error may go below zero
+ int error = delta_y - (delta_x >> 1);
+
+ while (x1 != x2) {
+ if (error >= 0) {
+ if (error || (ix > 0)) {
+ y1 += iy;
+ error -= delta_x;
+ }
+ // else do nothing
+ }
+ // else do nothing
+
+ x1 += ix;
+ error += delta_y;
+
+ if(callback(x1, y1, userData) == 0) {
+ return ;
+ }
+ }
+ }
+ else {
+ // error may go below zero
+ int error = delta_x - (delta_y >> 1);
+
+ while (y1 != y2) {
+ if (error >= 0) {
+ if (error || (iy > 0)) {
+ x1 += ix;
+ error -= delta_y;
+ }
+ // else do nothing
+ }
+ // else do nothing
+
+ y1 += iy;
+ error += delta_x;
+
+ if(callback(x1, y1, userData) == 0) {
+ return;
+ }
+ }
+ }
+}
+
/****************************** Interpolation ********************************/
static float tri_signed_area(float *v1, float *v2, float *v3, int i, int j)
@@ -1647,6 +1781,35 @@ void perspective_m4(float mat[][4],float left, float right, float bottom, float
}
+/* translate a matrix created by orthographic_m4 or perspective_m4 in XY coords (used to jitter the view) */
+void window_translate_m4(float winmat[][4], float perspmat[][4], float x, float y)
+{
+ if(winmat[2][3] == -1.0f) {
+ /* in the case of a win-matrix, this means perspective always */
+ float v1[3];
+ float v2[3];
+ float len1, len2;
+
+ v1[0]= perspmat[0][0];
+ v1[1]= perspmat[1][0];
+ v1[2]= perspmat[2][0];
+
+ v2[0]= perspmat[0][1];
+ v2[1]= perspmat[1][1];
+ v2[2]= perspmat[2][1];
+
+ len1= (1.0f / len_v3(v1));
+ len2= (1.0f / len_v3(v2));
+
+ winmat[2][0] += len1 * winmat[0][0] * x;
+ winmat[2][1] += len2 * winmat[1][1] * y;
+ }
+ else {
+ winmat[3][0] += x;
+ winmat[3][1] += y;
+ }
+}
+
static void i_multmatrix(float icand[][4], float Vm[][4])
{
int row, col;
@@ -1676,10 +1839,9 @@ void polarview_m4(float Vm[][4],float dist, float azimuth, float incidence, floa
void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py, float pz, float twist)
{
float sine, cosine, hyp, hyp1, dx, dy, dz;
- float mat1[4][4];
+ float mat1[4][4]= MAT4_UNITY;
unit_m4(mat);
- unit_m4(mat1);
rotate_m4(mat, 'Z', -twist);
@@ -1918,7 +2080,7 @@ pointers may be NULL if not needed
*/
/* can't believe there is none in math utils */
-float _det_m3(float m2[3][3])
+static float _det_m3(float m2[3][3])
{
float det = 0.f;
if (m2){
@@ -2469,4 +2631,3 @@ float form_factor_hemi_poly(float p[3], float n[3], float v1[3], float v2[3], fl
return contrib;
}
-
diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c
index f2d8e27cbd5..11310f25075 100644
--- a/source/blender/blenlib/intern/math_geom_inline.c
+++ b/source/blender/blenlib/intern/math_geom_inline.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,8 +27,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_GEOM_INLINE
-#define BLI_MATH_GEOM_INLINE
+#ifndef BLI_MATH_GEOM_INLINE_H
+#define BLI_MATH_GEOM_INLINE_H
/****************************** Spherical Harmonics **************************/
@@ -134,5 +134,5 @@ MINLINE void madd_sh_shfl(float r[9], float sh[3], float f)
add_sh_shsh(r, r, tmp);
}
-#endif /* BLI_MATH_GEOM_INLINE */
+#endif /* BLI_MATH_GEOM_INLINE_H */
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 64c3e746982..413ac57dea5 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
+#include <assert.h>
#include "BLI_math.h"
/********************************* Init **************************************/
@@ -109,6 +109,20 @@ void copy_m4_m3(float m1[][4], float m2[][3]) /* no clear */
}
+void swap_m3m3(float m1[][3], float m2[][3])
+{
+ float t;
+ int i, j;
+
+ for(i = 0; i < 3; i++) {
+ for (j = 0; j < 3; j++) {
+ t = m1[i][j];
+ m1[i][j] = m2[i][j];
+ m2[i][j] = t;
+ }
+ }
+}
+
void swap_m4m4(float m1[][4], float m2[][4])
{
float t;
@@ -228,7 +242,7 @@ void mul_serie_m3(float answ[][3],
{
float temp[3][3];
- if(m1==0 || m2==0) return;
+ if(m1==NULL || m2==NULL) return;
mul_m3_m3m3(answ, m2, m1);
if(m3) {
@@ -261,7 +275,7 @@ void mul_serie_m4(float answ[][4], float m1[][4],
{
float temp[4][4];
- if(m1==0 || m2==0) return;
+ if(m1==NULL || m2==NULL) return;
mul_m4_m4m4(answ, m2, m1);
if(m3) {
@@ -609,7 +623,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[1]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+ float vec[3];
+
+ vec[0]= mat[0][1];
+ vec[1]= mat[0][2];
+ vec[2]= mat[0][0];
cross_v3_v3v3(mat[2], mat[0], vec);
normalize_v3(mat[2]);
@@ -625,7 +643,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+ float vec[3];
+
+ vec[0]= mat[1][1];
+ vec[1]= mat[1][2];
+ vec[2]= mat[1][0];
cross_v3_v3v3(mat[0], mat[1], vec);
normalize_v3(mat[0]);
@@ -641,7 +663,11 @@ void orthogonalize_m3(float mat[][3], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[1], mat[2], mat[0]);
} else {
- float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+ float vec[3];
+
+ vec[0]= mat[2][1];
+ vec[1]= mat[2][2];
+ vec[2]= mat[2][0];
cross_v3_v3v3(mat[0], vec, mat[2]);
normalize_v3(mat[0]);
@@ -670,7 +696,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[1]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
+ float vec[3];
+
+ vec[0]= mat[0][1];
+ vec[1]= mat[0][2];
+ vec[2]= mat[0][0];
cross_v3_v3v3(mat[2], mat[0], vec);
normalize_v3(mat[2]);
@@ -687,7 +717,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[2], mat[0], mat[1]);
} else {
- float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
+ float vec[3];
+
+ vec[0]= mat[1][1];
+ vec[1]= mat[1][2];
+ vec[2]= mat[1][0];
cross_v3_v3v3(mat[0], mat[1], vec);
normalize_v3(mat[0]);
@@ -703,7 +737,11 @@ void orthogonalize_m4(float mat[][4], int axis)
normalize_v3(mat[0]);
cross_v3_v3v3(mat[1], mat[2], mat[0]);
} else {
- float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
+ float vec[3];
+
+ vec[0]= mat[2][1];
+ vec[1]= mat[2][2];
+ vec[2]= mat[2][0];
cross_v3_v3v3(mat[0], vec, mat[2]);
normalize_v3(mat[0]);
@@ -750,6 +788,14 @@ void normalize_m3(float mat[][3])
normalize_v3(mat[2]);
}
+void normalize_m3_m3(float rmat[][3], float mat[][3])
+{
+ normalize_v3_v3(rmat[0], mat[0]);
+ normalize_v3_v3(rmat[1], mat[1]);
+ normalize_v3_v3(rmat[2], mat[2]);
+}
+
+
void normalize_m4(float mat[][4])
{
float len;
@@ -762,6 +808,18 @@ void normalize_m4(float mat[][4])
if(len!=0.0) mat[2][3]/= len;
}
+void normalize_m4_m4(float rmat[][4], float mat[][4])
+{
+ float len;
+
+ len= normalize_v3_v3(rmat[0], mat[0]);
+ if(len!=0.0) rmat[0][3]= mat[0][3] / len;
+ len= normalize_v3_v3(rmat[1], mat[1]);
+ if(len!=0.0) rmat[1][3]= mat[1][3] / len;
+ len= normalize_v3_v3(rmat[2], mat[2]);
+ if(len!=0.0) rmat[2][3]= mat[2][3] / len;;
+}
+
void adjoint_m3_m3(float m1[][3], float m[][3])
{
m1[0][0]=m[1][1]*m[2][2]-m[1][2]*m[2][1];
@@ -878,7 +936,7 @@ float determinant_m4(float m[][4])
/****************************** Transformations ******************************/
-void size_to_mat3(float mat[][3], float *size)
+void size_to_mat3(float mat[][3], const float size[3])
{
mat[0][0]= size[0];
mat[0][1]= 0.0f;
@@ -891,7 +949,7 @@ void size_to_mat3(float mat[][3], float *size)
mat[2][0]= 0.0f;
}
-void size_to_mat4(float mat[][4], float *size)
+void size_to_mat4(float mat[][4], const float size[3])
{
float tmat[3][3];
@@ -932,6 +990,49 @@ float mat4_to_scale(float mat[][4])
return mat3_to_scale(tmat);
}
+
+void mat3_to_rot_size(float rot[3][3], float size[3], float mat3[3][3])
+{
+ float mat3_n[3][3]; /* mat3 -> normalized, 3x3 */
+ float imat3_n[3][3]; /* mat3 -> normalized & inverted, 3x3 */
+
+ /* rotation & scale are linked, we need to create the mat's
+ * for these together since they are related. */
+
+ /* so scale doesnt interfear with rotation [#24291] */
+ /* note: this is a workaround for negative matrix not working for rotation conversion, FIXME */
+ normalize_m3_m3(mat3_n, mat3);
+ if(is_negative_m3(mat3)) {
+ negate_v3(mat3_n[0]);
+ negate_v3(mat3_n[1]);
+ negate_v3(mat3_n[2]);
+ }
+
+ /* rotation */
+ /* keep rot as a 3x3 matrix, the caller can convert into a quat or euler */
+ copy_m3_m3(rot, mat3_n);
+
+ /* scale */
+ /* note: mat4_to_size(ob->size, mat) fails for negative scale */
+ invert_m3_m3(imat3_n, mat3_n);
+ mul_m3_m3m3(mat3, imat3_n, mat3);
+
+ size[0]= mat3[0][0];
+ size[1]= mat3[1][1];
+ size[2]= mat3[2][2];
+}
+
+void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[][4])
+{
+ float mat3[3][3]; /* wmat -> 3x3 */
+
+ copy_m3_m4(mat3, wmat);
+ mat3_to_rot_size(rot, size, mat3);
+
+ /* location */
+ copy_v3_v3(loc, wmat[3]);
+}
+
void scale_m3_fl(float m[][3], float scale)
{
m[0][0]= m[1][1]= m[2][2]= scale;
@@ -963,6 +1064,8 @@ void rotate_m4(float mat[][4], const char axis, const float angle)
float temp[4]= {0.0f, 0.0f, 0.0f, 0.0f};
float cosine, sine;
+ assert(axis >= 'X' && axis <= 'Z');
+
cosine = (float)cos(angle);
sine = (float)sin(angle);
switch(axis){
@@ -995,18 +1098,19 @@ void rotate_m4(float mat[][4], const char axis, const float angle)
}
}
-void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweight)
+void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], const float srcweight)
{
+ float srot[3][3], drot[3][3];
float squat[4], dquat[4], fquat[4];
- float ssize[3], dsize[3], fsize[4];
+ float ssize[3], dsize[3], fsize[3];
float rmat[3][3], smat[3][3];
- mat3_to_quat(dquat,dst);
- mat3_to_size(dsize,dst);
+ mat3_to_rot_size(drot, dsize, dst);
+ mat3_to_rot_size(srot, ssize, src);
+
+ mat3_to_quat(dquat, drot);
+ mat3_to_quat(squat, srot);
- mat3_to_quat(squat,src);
- mat3_to_size(ssize,src);
-
/* do blending */
interp_qt_qtqt(fquat, dquat, squat, srcweight);
interp_v3_v3v3(fsize, dsize, ssize, srcweight);
@@ -1017,20 +1121,19 @@ void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweig
mul_m3_m3m3(out, rmat, smat);
}
-void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], float srcweight)
+void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], const float srcweight)
{
- float squat[4], dquat[4], fquat[4];
- float ssize[3], dsize[3], fsize[4];
float sloc[3], dloc[3], floc[3];
-
- mat4_to_quat(dquat,dst);
- mat4_to_size(dsize,dst);
- copy_v3_v3(dloc, dst[3]);
+ float srot[3][3], drot[3][3];
+ float squat[4], dquat[4], fquat[4];
+ float ssize[3], dsize[3], fsize[3];
+
+ mat4_to_loc_rot_size(dloc, drot, dsize, dst);
+ mat4_to_loc_rot_size(sloc, srot, ssize, src);
+
+ mat3_to_quat(dquat, drot);
+ mat3_to_quat(squat, srot);
- mat4_to_quat(squat,src);
- mat4_to_size(ssize,src);
- copy_v3_v3(sloc, src[3]);
-
/* do blending */
interp_v3_v3v3(floc, dloc, sloc, srcweight);
interp_qt_qtqt(fquat, dquat, squat, srcweight);
@@ -1058,7 +1161,7 @@ int is_negative_m4(float mat[][4])
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
// TODO: need to have a version that allows for rotation order...
-void loc_eul_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float size[3])
+void loc_eul_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1081,7 +1184,7 @@ void loc_eul_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float siz
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void loc_eulO_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder)
+void loc_eulO_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3], const short rotOrder)
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1105,7 +1208,7 @@ void loc_eulO_size_to_mat4(float mat[4][4], float loc[3], float eul[3], float si
/* make a 4x4 matrix out of 3 transform components */
/* matrices are made in the order: scale * rot * loc */
-void loc_quat_size_to_mat4(float mat[4][4], float loc[3], float quat[4], float size[3])
+void loc_quat_size_to_mat4(float mat[4][4], const float loc[3], const float quat[4], const float size[3])
{
float rmat[3][3], smat[3][3], tmat[3][3];
@@ -1126,9 +1229,16 @@ void loc_quat_size_to_mat4(float mat[4][4], float loc[3], float quat[4], float s
mat[3][2] = loc[2];
}
+void loc_axisangle_size_to_mat4(float mat[4][4], const float loc[3], const float axis[3], const float angle, const float size[3])
+{
+ float q[4];
+ axis_angle_to_quat(q, axis, angle);
+ loc_quat_size_to_mat4(mat, loc, q, size);
+}
+
/*********************************** Other ***********************************/
-void print_m3(char *str, float m[][3])
+void print_m3(const char *str, float m[][3])
{
printf("%s\n", str);
printf("%f %f %f\n",m[0][0],m[1][0],m[2][0]);
@@ -1137,7 +1247,7 @@ void print_m3(char *str, float m[][3])
printf("\n");
}
-void print_m4(char *str, float m[][4])
+void print_m4(const char *str, float m[][4])
{
printf("%s\n", str);
printf("%f %f %f %f\n",m[0][0],m[1][0],m[2][0],m[3][0]);
@@ -1361,7 +1471,6 @@ void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4])
eps = powf(2.0f,-52.0f);
while (p > 0) {
int kase=0;
- k=0;
// Test for maximum iterations to avoid infinite loop
if(maxiter == 0)
@@ -1599,5 +1708,5 @@ void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon)
transpose_m4(V);
- mul_serie_m4(Ainv, U, Wm, V, 0, 0, 0, 0, 0);
+ mul_serie_m4(Ainv, U, Wm, V, NULL, NULL, NULL, NULL, NULL);
}
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index f72269f6d7b..1160ec9fc3a 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,11 +26,25 @@
* */
+#include <assert.h>
#include "BLI_math.h"
/******************************** Quaternions ********************************/
-void unit_qt(float *q)
+/* used to test is a quat is not normalized */
+#define QUAT_EPSILON 0.0001
+
+/* convenience, avoids setting Y axis everywhere */
+void unit_axis_angle(float axis[3], float *angle)
+{
+ axis[0]= 0.0f;
+ axis[1]= 1.0f;
+ axis[2]= 0.0f;
+ *angle= 0.0f;
+}
+
+
+void unit_qt(float q[4])
{
q[0]= 1.0f;
q[1]= q[2]= q[3]= 0.0f;
@@ -88,7 +102,7 @@ void conjugate_qt(float *q)
q[3] = -q[3];
}
-float dot_qtqt(float *q1, float *q2)
+float dot_qtqt(const float q1[4], const float q2[4])
{
return q1[0]*q2[0] + q1[1]*q2[1] + q1[2]*q2[2] + q1[3]*q2[3];
}
@@ -119,11 +133,16 @@ void mul_qt_fl(float *q, const float f)
q[3] *= f;
}
-void sub_qt_qtqt(float *q, float *q1, float *q2)
+void sub_qt_qtqt(float q[4], const float q1[4], const float q2[4])
{
- q2[0]= -q2[0];
- mul_qt_qtqt(q, q1, q2);
- q2[0]= -q2[0];
+ float nq2[4];
+
+ nq2[0]= -q2[0];
+ nq2[1]= q2[1];
+ nq2[2]= q2[2];
+ nq2[3]= q2[3];
+
+ mul_qt_qtqt(q, q1, nq2);
}
/* angular mult factor */
@@ -138,7 +157,8 @@ void mul_fac_qt_fl(float *q, const float fac)
mul_v3_fl(q+1, si);
}
-void quat_to_mat3(float m[][3], float *q)
+/* skip error check, currently only needed by mat3_to_quat_is_ok */
+static void quat_to_mat3_no_error(float m[][3], const float q[4])
{
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
@@ -170,10 +190,29 @@ void quat_to_mat3(float m[][3], float *q)
m[2][2]= (float)(1.0-qaa-qbb);
}
-void quat_to_mat4(float m[][4], float *q)
+
+void quat_to_mat3(float m[][3], const float q[4])
+{
+#ifdef DEBUG
+ float f;
+ if(!((f=dot_qtqt(q, q))==0.0 || (fabs(f-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_mat3() called with non-normalized: size %.8f *** report a bug ***\n", f);
+ }
+#endif
+
+ quat_to_mat3_no_error(m, q);
+}
+
+void quat_to_mat4(float m[][4], const float q[4])
{
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
+#ifdef DEBUG
+ if(!((q0=dot_qtqt(q, q))==0.0 || (fabs(q0-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_mat4() called with non-normalized: size %.8f *** report a bug ***\n", (float)q0);
+ }
+#endif
+
q0= M_SQRT2 * q[0];
q1= M_SQRT2 * q[1];
q2= M_SQRT2 * q[2];
@@ -294,7 +333,7 @@ void mat3_to_quat_is_ok(float q[4], float wmat[3][3])
q1[3]= -nor[2]*si;
/* rotate back x-axis from mat, using inverse q1 */
- quat_to_mat3( matr,q1);
+ quat_to_mat3_no_error( matr,q1);
invert_m3_m3(matn, matr);
mul_m3_v3(matn, mat[0]);
@@ -312,7 +351,7 @@ void mat3_to_quat_is_ok(float q[4], float wmat[3][3])
}
-void normalize_qt(float *q)
+float normalize_qt(float *q)
{
float len;
@@ -324,6 +363,14 @@ void normalize_qt(float *q)
q[1]= 1.0f;
q[0]= q[2]= q[3]= 0.0f;
}
+
+ return len;
+}
+
+float normalize_qt_qt(float r[4], const float q[4])
+{
+ copy_qt_qt(r, q);
+ return normalize_qt(r);
}
/* note: expects vectors to be normalized */
@@ -356,10 +403,13 @@ void rotation_between_quats_to_quat(float *q, const float q1[4], const float q2[
}
-void vec_to_quat(float *q,float *vec, short axis, short upflag)
+void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag)
{
float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;
+ assert(axis >= 0 && axis <= 5);
+ assert(upflag >= 0 && upflag <= 2);
+
/* first rotate to axis */
if(axis>2) {
x2= vec[0] ; y2= vec[1] ; z2= vec[2];
@@ -491,7 +541,7 @@ void QuatInterpolW(float *result, float *quat1, float *quat2, float t)
}
#endif
-void interp_qt_qtqt(float *result, float *quat1, float *quat2, float t)
+void interp_qt_qtqt(float result[4], const float quat1[4], const float quat2[4], const float t)
{
float quat[4], omega, cosom, sinom, sc1, sc2;
@@ -528,7 +578,7 @@ void interp_qt_qtqt(float *result, float *quat1, float *quat2, float t)
result[3] = sc1 * quat[3] + sc2 * quat2[3];
}
-void add_qt_qtqt(float *result, float *quat1, float *quat2, float t)
+void add_qt_qtqt(float result[4], const float quat1[4], const float quat2[4], const float t)
{
result[0]= quat1[0] + t*quat2[0];
result[1]= quat1[1] + t*quat2[1];
@@ -536,7 +586,7 @@ void add_qt_qtqt(float *result, float *quat1, float *quat2, float t)
result[3]= quat1[3] + t*quat2[3];
}
-void tri_to_quat(float *quat, float *v1, float *v2, float *v3)
+void tri_to_quat(float quat[4], const float v1[3], const float v2[3], const float v3[3])
{
/* imaginary x-axis, y-axis triangle is being rotated */
float vec[3], q1[4], q2[4], n[3], si, co, angle, mat[3][3], imat[3][3];
@@ -588,13 +638,16 @@ void print_qt(char *str, float q[4])
/******************************** Axis Angle *********************************/
/* Axis angle to Quaternions */
-void axis_angle_to_quat(float q[4], float axis[3], float angle)
+void axis_angle_to_quat(float q[4], const float axis[3], float angle)
{
float nor[3];
float si;
- normalize_v3_v3(nor, axis);
-
+ if(normalize_v3_v3(nor, axis) == 0.0f) {
+ unit_qt(q);
+ return;
+ }
+
angle /= 2;
si = (float)sin(angle);
q[0] = (float)cos(angle);
@@ -604,10 +657,16 @@ void axis_angle_to_quat(float q[4], float axis[3], float angle)
}
/* Quaternions to Axis Angle */
-void quat_to_axis_angle(float axis[3], float *angle,float q[4])
+void quat_to_axis_angle(float axis[3], float *angle, const float q[4])
{
float ha, si;
-
+
+#ifdef DEBUG
+ if(!((ha=dot_qtqt(q, q))==0.0 || (fabs(ha-1.0) < QUAT_EPSILON))) {
+ fprintf(stderr, "Warning! quat_to_axis_angle() called with non-normalized: size %.8f *** report a bug ***\n", ha);
+ }
+#endif
+
/* calculate angle/2, and sin(angle/2) */
ha= (float)acos(q[0]);
si= (float)sin(ha);
@@ -625,7 +684,7 @@ void quat_to_axis_angle(float axis[3], float *angle,float q[4])
}
/* Axis Angle to Euler Rotation */
-void axis_angle_to_eulO(float eul[3], short order,float axis[3], float angle)
+void axis_angle_to_eulO(float eul[3], const short order, const float axis[3], const float angle)
{
float q[4];
@@ -635,7 +694,7 @@ void axis_angle_to_eulO(float eul[3], short order,float axis[3], float angle)
}
/* Euler Rotation to Axis Angle */
-void eulO_to_axis_angle(float axis[3], float *angle,float eul[3], short order)
+void eulO_to_axis_angle(float axis[3], float *angle, const float eul[3], const short order)
{
float q[4];
@@ -645,12 +704,15 @@ void eulO_to_axis_angle(float axis[3], float *angle,float eul[3], short order)
}
/* axis angle to 3x3 matrix - safer version (normalisation of axis performed) */
-void axis_angle_to_mat3(float mat[3][3],float axis[3], float angle)
+void axis_angle_to_mat3(float mat[3][3], const float axis[3], const float angle)
{
float nor[3], nsi[3], co, si, ico;
/* normalise the axis first (to remove unwanted scaling) */
- normalize_v3_v3(nor, axis);
+ if(normalize_v3_v3(nor, axis) == 0.0f) {
+ unit_m3(mat);
+ return;
+ }
/* now convert this to a 3x3 matrix */
co= (float)cos(angle);
@@ -673,7 +735,7 @@ void axis_angle_to_mat3(float mat[3][3],float axis[3], float angle)
}
/* axis angle to 4x4 matrix - safer version (normalisation of axis performed) */
-void axis_angle_to_mat4(float mat[4][4],float axis[3], float angle)
+void axis_angle_to_mat4(float mat[4][4], const float axis[3], const float angle)
{
float tmat[3][3];
@@ -730,7 +792,7 @@ void mat4_to_vec_rot(float axis[3], float *angle,float mat[4][4])
}
/* axis angle to 3x3 matrix */
-void vec_rot_to_mat3(float mat[][3],float *vec, float phi)
+void vec_rot_to_mat3(float mat[][3], const float vec[3], const float phi)
{
/* rotation of phi radials around vec */
float vx, vx2, vy, vy2, vz, vz2, co, si;
@@ -756,7 +818,7 @@ void vec_rot_to_mat3(float mat[][3],float *vec, float phi)
}
/* axis angle to 4x4 matrix */
-void vec_rot_to_mat4(float mat[][4],float *vec, float phi)
+void vec_rot_to_mat4(float mat[][4], const float vec[3], const float phi)
{
float tmat[3][3];
@@ -766,7 +828,7 @@ void vec_rot_to_mat4(float mat[][4],float *vec, float phi)
}
/* axis angle to quaternion */
-void vec_rot_to_quat(float *quat,float *vec, float phi)
+void vec_rot_to_quat(float *quat, const float vec[3], const float phi)
{
/* rotation of phi radials around vec */
float si;
@@ -790,7 +852,7 @@ void vec_rot_to_quat(float *quat,float *vec, float phi)
/******************************** XYZ Eulers *********************************/
/* XYZ order */
-void eul_to_mat3(float mat[][3], float *eul)
+void eul_to_mat3(float mat[][3], const float eul[3])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -818,7 +880,7 @@ void eul_to_mat3(float mat[][3], float *eul)
}
/* XYZ order */
-void eul_to_mat4(float mat[][4], float *eul)
+void eul_to_mat4(float mat[][4], const float eul[3])
{
double ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -850,7 +912,7 @@ void eul_to_mat4(float mat[][4], float *eul)
/* returns two euler calculation methods, so we can pick the best */
/* XYZ order */
-static void mat3_to_eul2(float tmat[][3], float *eul1, float *eul2)
+static void mat3_to_eul2(float tmat[][3], float eul1[3], float eul2[3])
{
float cy, quat[4], mat[3][3];
@@ -907,16 +969,16 @@ void mat4_to_eul(float *eul,float tmat[][4])
}
/* XYZ order */
-void quat_to_eul(float *eul,float *quat)
+void quat_to_eul(float *eul, const float quat[4])
{
float mat[3][3];
-
+
quat_to_mat3(mat,quat);
mat3_to_eul(eul,mat);
}
/* XYZ order */
-void eul_to_quat(float *quat,float *eul)
+void eul_to_quat(float *quat, const float eul[3])
{
float ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
@@ -932,10 +994,12 @@ void eul_to_quat(float *quat,float *eul)
}
/* XYZ order */
-void rotate_eul(float *beul, char axis, float ang)
+void rotate_eul(float *beul, const char axis, const float ang)
{
float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-
+
+ assert(axis >= 'X' && axis <= 'Z');
+
eul[0]= eul[1]= eul[2]= 0.0f;
if(axis=='X') eul[0]= ang;
else if(axis=='Y') eul[1]= ang;
@@ -952,7 +1016,7 @@ void rotate_eul(float *beul, char axis, float ang)
/* exported to transform.c */
/* order independent! */
-void compatible_eul(float *eul, float *oldrot)
+void compatible_eul(float eul[3], const float oldrot[3])
{
float dx, dy, dz;
@@ -1016,7 +1080,7 @@ void compatible_eul(float *eul, float *oldrot)
/* uses 2 methods to retrieve eulers, and picks the closest */
/* XYZ order */
-void mat3_to_compatible_eul(float *eul, float *oldrot,float mat[][3])
+void mat3_to_compatible_eul(float eul[3], const float oldrot[3], float mat[][3])
{
float eul1[3], eul2[3];
float d1, d2;
@@ -1073,20 +1137,20 @@ static RotOrderInfo rotOrders[]= {
* NOTE: since we start at 1 for the values, but arrays index from 0,
* there is -1 factor involved in this process...
*/
-#define GET_ROTATIONORDER_INFO(order) (((order)>=1) ? &rotOrders[(order)-1] : &rotOrders[0])
+#define GET_ROTATIONORDER_INFO(order) (assert(order>=0 && order<=6), (order < 1) ? &rotOrders[0] : &rotOrders[(order)-1])
/* Construct quaternion from Euler angles (in radians). */
-void eulO_to_quat(float q[4],float e[3], short order)
+void eulO_to_quat(float q[4], const float e[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
short i=R->axis[0], j=R->axis[1], k=R->axis[2];
double ti, tj, th, ci, cj, ch, si, sj, sh, cc, cs, sc, ss;
double a[3];
- ti = e[i]/2; tj = e[j]/2; th = e[k]/2;
-
- if (R->parity) e[j] = -e[j];
-
+ ti = e[i] * 0.5f;
+ tj = e[j] * (R->parity ? -0.5f : 0.5f);
+ th = e[k] * 0.5f;
+
ci = cos(ti); cj = cos(tj); ch = cos(th);
si = sin(ti); sj = sin(tj); sh = sin(th);
@@ -1102,11 +1166,11 @@ void eulO_to_quat(float q[4],float e[3], short order)
q[2] = a[1];
q[3] = a[2];
- if (R->parity) q[j] = -q[j];
+ if (R->parity) q[j+1] = -q[j+1];
}
/* Convert quaternion to Euler angles (in radians). */
-void quat_to_eulO(float e[3], short order,float q[4])
+void quat_to_eulO(float e[3], short const order, const float q[4])
{
float M[3][3];
@@ -1115,7 +1179,7 @@ void quat_to_eulO(float e[3], short order,float q[4])
}
/* Construct 3x3 matrix from Euler angles (in radians). */
-void eulO_to_mat3(float M[3][3],float e[3], short order)
+void eulO_to_mat3(float M[3][3], const float e[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
short i=R->axis[0], j=R->axis[1], k=R->axis[2];
@@ -1139,53 +1203,6 @@ void eulO_to_mat3(float M[3][3],float e[3], short order)
M[i][k] = -sj; M[j][k] = cj*si; M[k][k] = cj*ci;
}
-/* Construct 4x4 matrix from Euler angles (in radians). */
-void eulO_to_mat4(float M[4][4],float e[3], short order)
-{
- float m[3][3];
-
- /* for now, we'll just do this the slow way (i.e. copying matrices) */
- normalize_m3(m);
- eulO_to_mat3(m,e, order);
- copy_m4_m3(M, m);
-}
-
-/* Convert 3x3 matrix to Euler angles (in radians). */
-void mat3_to_eulO(float e[3], short order,float M[3][3])
-{
- RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
- short i=R->axis[0], j=R->axis[1], k=R->axis[2];
- double cy = sqrt(M[i][i]*M[i][i] + M[i][j]*M[i][j]);
-
- if (cy > 16*FLT_EPSILON) {
- e[i] = atan2(M[j][k], M[k][k]);
- e[j] = atan2(-M[i][k], cy);
- e[k] = atan2(M[i][j], M[i][i]);
- }
- else {
- e[i] = atan2(-M[k][j], M[j][j]);
- e[j] = atan2(-M[i][k], cy);
- e[k] = 0;
- }
-
- if (R->parity) {
- e[0] = -e[0];
- e[1] = -e[1];
- e[2] = -e[2];
- }
-}
-
-/* Convert 4x4 matrix to Euler angles (in radians). */
-void mat4_to_eulO(float e[3], short order,float M[4][4])
-{
- float m[3][3];
-
- /* for now, we'll just do this the slow way (i.e. copying matrices) */
- copy_m3_m4(m, M);
- normalize_m3(m);
- mat3_to_eulO(e, order,m);
-}
-
/* returns two euler calculation methods, so we can pick the best */
static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
{
@@ -1228,6 +1245,45 @@ static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
}
}
+/* Construct 4x4 matrix from Euler angles (in radians). */
+void eulO_to_mat4(float M[4][4], const float e[3], const short order)
+{
+ float m[3][3];
+
+ /* for now, we'll just do this the slow way (i.e. copying matrices) */
+ normalize_m3(m);
+ eulO_to_mat3(m,e, order);
+ copy_m4_m3(M, m);
+}
+
+
+/* Convert 3x3 matrix to Euler angles (in radians). */
+void mat3_to_eulO(float eul[3], const short order,float M[3][3])
+{
+ float eul1[3], eul2[3];
+
+ mat3_to_eulo2(M, eul1, eul2, order);
+
+ /* return best, which is just the one with lowest values it in */
+ if(fabs(eul1[0])+fabs(eul1[1])+fabs(eul1[2]) > fabs(eul2[0])+fabs(eul2[1])+fabs(eul2[2])) {
+ copy_v3_v3(eul, eul2);
+ }
+ else {
+ copy_v3_v3(eul, eul1);
+ }
+}
+
+/* Convert 4x4 matrix to Euler angles (in radians). */
+void mat4_to_eulO(float e[3], const short order,float M[4][4])
+{
+ float m[3][3];
+
+ /* for now, we'll just do this the slow way (i.e. copying matrices) */
+ copy_m3_m4(m, M);
+ normalize_m3(m);
+ mat3_to_eulO(e, order,m);
+}
+
/* uses 2 methods to retrieve eulers, and picks the closest */
void mat3_to_compatible_eulO(float eul[3], float oldrot[3], short order,float mat[3][3])
{
@@ -1249,12 +1305,23 @@ void mat3_to_compatible_eulO(float eul[3], float oldrot[3], short order,float ma
copy_v3_v3(eul, eul1);
}
+void mat4_to_compatible_eulO(float eul[3], float oldrot[3], short order,float M[4][4])
+{
+ float m[3][3];
+
+ /* for now, we'll just do this the slow way (i.e. copying matrices) */
+ copy_m3_m4(m, M);
+ normalize_m3(m);
+ mat3_to_compatible_eulO(eul, oldrot, order, m);
+}
/* rotate the given euler by the given angle on the specified axis */
// NOTE: is this safe to do with different axis orders?
void rotate_eulO(float beul[3], short order, char axis, float ang)
{
float eul[3], mat1[3][3], mat2[3][3], totmat[3][3];
-
+
+ assert(axis >= 'X' && axis <= 'Z');
+
eul[0]= eul[1]= eul[2]= 0.0f;
if (axis=='X')
eul[0]= ang;
@@ -1272,7 +1339,7 @@ void rotate_eulO(float beul[3], short order, char axis, float ang)
}
/* the matrix is written to as 3 axis vectors */
-void eulO_to_gimbal_axis(float gmat[][3], float *eul, short order)
+void eulO_to_gimbal_axis(float gmat[][3], const float eul[3], const short order)
{
RotOrderInfo *R= GET_ROTATIONORDER_INFO(order);
@@ -1364,7 +1431,7 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
mul_m4_m4m4(S, baseRS, baseRinv);
/* set scaling part */
- mul_serie_m4(dq->scale, basemat, S, baseinv, 0, 0, 0, 0, 0);
+ mul_serie_m4(dq->scale, basemat, S, baseinv, NULL, NULL, NULL, NULL, NULL);
dq->scale_weight= 1.0f;
}
else {
@@ -1385,7 +1452,7 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
dq->trans[3]= 0.5f*(t[0]*q[2] - t[1]*q[1] + t[2]*q[0]);
}
-void dquat_to_mat4(float mat[][4],DualQuat *dq)
+void dquat_to_mat4(float mat[][4], DualQuat *dq)
{
float len, *t, q0[4];
@@ -1521,7 +1588,79 @@ void copy_dq_dq(DualQuat *dq1, DualQuat *dq2)
memcpy(dq1, dq2, sizeof(DualQuat));
}
-/* lense/angle conversion (radians) */
+/* axis matches eTrackToAxis_Modes */
+void quat_apply_track(float quat[4], short axis, short upflag)
+{
+ /* rotations are hard coded to match vec_to_quat */
+ const float quat_track[][4]= {{0.70710676908493, 0.0, -0.70710676908493, 0.0}, /* pos-y90 */
+ {0.5, 0.5, 0.5, 0.5}, /* Quaternion((1,0,0), radians(90)) * Quaternion((0,1,0), radians(90)) */
+ {0.70710676908493, 0.0, 0.0, 0.70710676908493}, /* pos-z90 */
+ {0.70710676908493, 0.0, 0.70710676908493, 0.0}, /* neg-y90 */
+ {0.5, -0.5, -0.5, 0.5}, /* Quaternion((1,0,0), radians(-90)) * Quaternion((0,1,0), radians(-90)) */
+ {-3.0908619663705394e-08, 0.70710676908493, 0.70710676908493, 3.0908619663705394e-08}}; /* no rotation */
+
+ assert(axis >= 0 && axis <= 5);
+ assert(upflag >= 0 && upflag <= 2);
+
+ mul_qt_qtqt(quat, quat, quat_track[axis]);
+
+ if(axis>2)
+ axis= axis-3;
+
+ /* there are 2 possible up-axis for each axis used, the 'quat_track' applies so the first
+ * up axis is used X->Y, Y->X, Z->X, if this first up axis isn used then rotate 90d
+ * the strange bit shift below just find the low axis {X:Y, Y:X, Z:X} */
+ if(upflag != (2-axis)>>1) {
+ float q[4]= {0.70710676908493, 0.0, 0.0, 0.0}; /* assign 90d rotation axis */
+ q[axis+1] = ((axis==1)) ? 0.70710676908493 : -0.70710676908493; /* flip non Y axis */
+ mul_qt_qtqt(quat, quat, q);
+ }
+}
+
+
+void vec_apply_track(float vec[3], short axis)
+{
+ float tvec[3];
+
+ assert(axis >= 0 && axis <= 5);
+
+ copy_v3_v3(tvec, vec);
+
+ switch(axis) {
+ case 0: /* pos-x */
+ /* vec[0]= 0.0; */
+ vec[1]= tvec[2];
+ vec[2]= -tvec[1];
+ break;
+ case 1: /* pos-y */
+ /* vec[0]= tvec[0]; */
+ /* vec[1]= 0.0; */
+ /* vec[2]= tvec[2]; */
+ break;
+ case 2: /* pos-z */
+ /* vec[0]= tvec[0]; */
+ /* vec[1]= tvec[1]; */
+ // vec[2]= 0.0; */
+ break;
+ case 3: /* neg-x */
+ /* vec[0]= 0.0; */
+ vec[1]= tvec[2];
+ vec[2]= -tvec[1];
+ break;
+ case 4: /* neg-y */
+ vec[0]= -tvec[2];
+ /* vec[1]= 0.0; */
+ vec[2]= tvec[0];
+ break;
+ case 5: /* neg-z */
+ vec[0]= -tvec[0];
+ vec[1]= -tvec[1];
+ /* vec[2]= 0.0; */
+ break;
+ }
+}
+
+/* lens/angle conversion (radians) */
float lens_to_angle(float lens)
{
return 2.0f * atan(16.0f/lens);
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 6d908ddb1cd..6c4000c6142 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,7 +30,7 @@
//******************************* Interpolation *******************************/
-void interp_v2_v2v2(float *target, const float *a, const float *b, const float t)
+void interp_v2_v2v2(float target[2], const float a[2], const float b[2], const float t)
{
float s = 1.0f-t;
@@ -91,7 +91,7 @@ void interp_v4_v4v4v4(float p[4], const float v1[4], const float v2[4], const fl
p[3] = v1[3]*w[0] + v2[3]*w[1] + v3[3]*w[2];
}
-void mid_v3_v3v3(float *v, float *v1, float *v2)
+void mid_v3_v3v3(float v[3], const float v1[3], const float v2[3])
{
v[0]= 0.5f*(v1[0] + v2[0]);
v[1]= 0.5f*(v1[1] + v2[1]);
@@ -103,7 +103,7 @@ void mid_v3_v3v3(float *v, float *v1, float *v2)
/* Return the angle in radians between vecs 1-2 and 2-3 in radians
If v1 is a shoulder, v2 is the elbow and v3 is the hand,
this would return the angle at the elbow */
-float angle_v3v3v3(float *v1, float *v2, float *v3)
+float angle_v3v3v3(const float v1[3], const float v2[3], const float v3[3])
{
float vec1[3], vec2[3];
@@ -116,7 +116,7 @@ float angle_v3v3v3(float *v1, float *v2, float *v3)
}
/* Return the shortest angle in radians between the 2 vectors */
-float angle_v3v3(float *v1, float *v2)
+float angle_v3v3(const float v1[3], const float v2[3])
{
float vec1[3], vec2[3];
@@ -126,7 +126,7 @@ float angle_v3v3(float *v1, float *v2)
return angle_normalized_v3v3(vec1, vec2);
}
-float angle_v2v2v2(float *v1, float *v2, float *v3)
+float angle_v2v2v2(const float v1[2], const float v2[2], const float v3[2])
{
float vec1[2], vec2[2];
@@ -143,7 +143,7 @@ float angle_v2v2v2(float *v1, float *v2, float *v3)
}
/* Return the shortest angle in radians between the 2 vectors */
-float angle_v2v2(float *v1, float *v2)
+float angle_v2v2(const float v1[2], const float v2[2])
{
float vec1[2], vec2[2];
@@ -175,7 +175,7 @@ float angle_normalized_v3v3(const float v1[3], const float v2[3])
return 2.0f*(float)saasin(len_v3v3(v2, v1)/2.0f);
}
-float angle_normalized_v2v2(float *v1, float *v2)
+float angle_normalized_v2v2(const float v1[2], const float v2[2])
{
/* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */
if (dot_v2v2(v1, v2) < 0.0f) {
@@ -231,7 +231,17 @@ void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const
/********************************* Geometry **********************************/
/* Project v1 on v2 */
-void project_v3_v3v3(float *c, float *v1, float *v2)
+void project_v2_v2v2(float c[2], const float v1[2], const float v2[2])
+{
+ float mul;
+ mul = dot_v2v2(v1, v2) / dot_v2v2(v2, v2);
+
+ c[0] = mul * v2[0];
+ c[1] = mul * v2[1];
+}
+
+/* Project v1 on v2 */
+void project_v3_v3v3(float c[3], const float v1[3], const float v2[3])
{
float mul;
mul = dot_v3v3(v1, v2) / dot_v3v3(v2, v2);
@@ -242,7 +252,7 @@ void project_v3_v3v3(float *c, float *v1, float *v2)
}
/* Returns a vector bisecting the angle at v2 formed by v1, v2 and v3 */
-void bisect_v3_v3v3v3(float *out, float *v1, float *v2, float *v3)
+void bisect_v3_v3v3v3(float out[3], const float v1[3], const float v2[3], const float v3[3])
{
float d_12[3], d_23[3];
sub_v3_v3v3(d_12, v2, v1);
@@ -256,7 +266,7 @@ void bisect_v3_v3v3v3(float *out, float *v1, float *v2, float *v3)
/* Returns a reflection vector from a vector and a normal vector
reflect = vec - ((2 * DotVecs(vec, mirror)) * mirror)
*/
-void reflect_v3_v3v3(float *out, float *v1, float *v2)
+void reflect_v3_v3v3(float out[3], const float v1[3], const float v2[3])
{
float vec[3], normal[3];
float reflect[3] = {0.0f, 0.0f, 0.0f};
@@ -274,7 +284,7 @@ void reflect_v3_v3v3(float *out, float *v1, float *v2)
copy_v3_v3(out, reflect);
}
-void ortho_basis_v3v3_v3(float *v1, float *v2, float *v)
+void ortho_basis_v3v3_v3(float v1[3], float v2[3], const float v[3])
{
const float f = (float)sqrt(v[0]*v[0] + v[1]*v[1]);
@@ -296,6 +306,36 @@ void ortho_basis_v3v3_v3(float *v1, float *v2, float *v)
}
}
+/* Rotate a point p by angle theta around an arbitrary axis r
+ http://local.wasp.uwa.edu.au/~pbourke/geometry/
+*/
+void rotate_normalized_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
+{
+ const float costheta= cos(angle);
+ const float sintheta= sin(angle);
+
+ r[0]= ((costheta + (1 - costheta) * axis[0] * axis[0]) * p[0]) +
+ (((1 - costheta) * axis[0] * axis[1] - axis[2] * sintheta) * p[1]) +
+ (((1 - costheta) * axis[0] * axis[2] + axis[1] * sintheta) * p[2]);
+
+ r[1]= (((1 - costheta) * axis[0] * axis[1] + axis[2] * sintheta) * p[0]) +
+ ((costheta + (1 - costheta) * axis[1] * axis[1]) * p[1]) +
+ (((1 - costheta) * axis[1] * axis[2] - axis[0] * sintheta) * p[2]);
+
+ r[2]= (((1 - costheta) * axis[0] * axis[2] - axis[1] * sintheta) * p[0]) +
+ (((1 - costheta) * axis[1] * axis[2] + axis[0] * sintheta) * p[1]) +
+ ((costheta + (1 - costheta) * axis[2] * axis[2]) * p[2]);
+}
+
+void rotate_v3_v3v3fl(float r[3], const float p[3], const float axis[3], const float angle)
+{
+ float axis_n[3];
+
+ normalize_v3_v3(axis_n, axis);
+
+ rotate_normalized_v3_v3v3fl(r, p, axis_n, angle);
+}
+
/*********************************** Other ***********************************/
void print_v2(const char *str, const float v[2])
@@ -313,7 +353,7 @@ void print_v4(const char *str, const float v[4])
printf("%s: %.3f %.3f %.3f %.3f\n", str, v[0], v[1], v[2], v[3]);
}
-void minmax_v3_v3v3(float *min, float *max, float *vec)
+void minmax_v3v3_v3(float min[3], float max[3], const float vec[3])
{
if(min[0]>vec[0]) min[0]= vec[0];
if(min[1]>vec[1]) min[1]= vec[1];
@@ -324,3 +364,91 @@ void minmax_v3_v3v3(float *min, float *max, float *vec)
if(max[2]<vec[2]) max[2]= vec[2];
}
+
+/***************************** Array Functions *******************************/
+
+void range_vni(int *array_tar, const int size, const int start)
+{
+ int *array_pt= array_tar + (size-1);
+ int j= start + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) = j--; }
+}
+
+void negate_vn(float *array_tar, const int size)
+{
+ float *array_pt= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) *= -1.0f; }
+}
+
+void negate_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = - *(src--); }
+}
+
+void mul_vn_fl(float *array_tar, const int size, const float f)
+{
+ float *array_pt= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(array_pt--) *= f; }
+}
+
+void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src--) * f; }
+}
+
+void add_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) += *(src--); }
+}
+
+void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src_a= array_src_a + (size-1);
+ const float *src_b= array_src_b + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src_a--) + *(src_b--); }
+}
+
+void sub_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src= array_src + (size-1);
+ int i= size;
+ while(i--) { *(tar--) -= *(src--); }
+}
+
+void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size)
+{
+ float *tar= array_tar + (size-1);
+ const float *src_a= array_src_a + (size-1);
+ const float *src_b= array_src_b + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = *(src_a--) - *(src_b--); }
+}
+
+void fill_vni(int *array_tar, const int size, const int val)
+{
+ int *tar= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = val; }
+}
+
+void fill_vn(float *array_tar, const int size, const float val)
+{
+ float *tar= array_tar + (size-1);
+ int i= size;
+ while(i--) { *(tar--) = val; }
+}
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 76173312b67..52d55ab948b 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,8 +27,8 @@
#include "BLI_math.h"
-#ifndef BLI_MATH_VECTOR_INLINE
-#define BLI_MATH_VECTOR_INLINE
+#ifndef BLI_MATH_VECTOR_INLINE_H
+#define BLI_MATH_VECTOR_INLINE_H
/********************************** Init *************************************/
@@ -149,6 +149,23 @@ MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
r[2]= a[2] - b[2];
}
+MINLINE void sub_v4_v4(float r[4], const float a[4])
+{
+ r[0] -= a[0];
+ r[1] -= a[1];
+ r[2] -= a[2];
+ r[3] -= a[3];
+}
+
+MINLINE void sub_v4_v4v4(float r[3], const float a[3], const float b[3])
+{
+ r[0]= a[0] - b[0];
+ r[1]= a[1] - b[1];
+ r[2]= a[2] - b[2];
+ r[3]= a[3] - b[3];
+}
+
+
MINLINE void mul_v2_fl(float *v1, float f)
{
v1[0]*= f;
@@ -265,6 +282,22 @@ MINLINE void negate_v3_v3(float r[3], const float a[3])
r[2]= -a[2];
}
+MINLINE void negate_v4(float r[4])
+{
+ r[0]= -r[0];
+ r[1]= -r[1];
+ r[2]= -r[2];
+ r[3]= -r[3];
+}
+
+MINLINE void negate_v4_v4(float r[4], const float a[4])
+{
+ r[0]= -a[0];
+ r[1]= -a[1];
+ r[2]= -a[2];
+ r[3]= -a[3];
+}
+
MINLINE float dot_v2v2(const float a[2], const float b[2])
{
return a[0]*b[0] + a[1]*b[1];
@@ -302,7 +335,7 @@ MINLINE void star_m3_v3(float mat[][3], float *vec)
MINLINE float len_v2(const float v[2])
{
- return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
+ return (float)sqrtf(v[0]*v[0] + v[1]*v[1]);
}
MINLINE float len_v2v2(const float v1[2], const float v2[2])
@@ -311,7 +344,7 @@ MINLINE float len_v2v2(const float v1[2], const float v2[2])
x = v1[0]-v2[0];
y = v1[1]-v2[1];
- return (float)sqrt(x*x+y*y);
+ return (float)sqrtf(x*x+y*y);
}
MINLINE float len_v3(const float a[3])
@@ -319,6 +352,14 @@ MINLINE float len_v3(const float a[3])
return sqrtf(dot_v3v3(a, a));
}
+MINLINE float len_squared_v2v2(const float a[3], const float b[3])
+{
+ float d[2];
+
+ sub_v2_v2v2(d, b, a);
+ return dot_v2v2(d, d);
+}
+
MINLINE float len_v3v3(const float a[3], const float b[3])
{
float d[3];
@@ -417,27 +458,37 @@ MINLINE void normal_float_to_short_v3(short *out, const float *in)
/********************************* Comparison ********************************/
-MINLINE int is_zero_v3(float *v)
+MINLINE int is_zero_v3(const float v[3])
{
return (v[0] == 0 && v[1] == 0 && v[2] == 0);
}
-MINLINE int is_one_v3(float *v)
+MINLINE int is_zero_v4(const float v[4])
+{
+ return (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0);
+}
+
+MINLINE int is_one_v3(const float *v)
{
return (v[0] == 1 && v[1] == 1 && v[2] == 1);
}
-MINLINE int equals_v3v3(float *v1, float *v2)
+MINLINE int equals_v2v2(const float *v1, const float *v2)
+{
+ return ((v1[0]==v2[0]) && (v1[1]==v2[1]));
+}
+
+MINLINE int equals_v3v3(const float *v1, const float *v2)
{
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]));
}
-MINLINE int equals_v4v4(float *v1, float *v2)
+MINLINE int equals_v4v4(const float *v1, const float *v2)
{
return ((v1[0]==v2[0]) && (v1[1]==v2[1]) && (v1[2]==v2[2]) && (v1[3]==v2[3]));
}
-MINLINE int compare_v3v3(float *v1, float *v2, float limit)
+MINLINE int compare_v3v3(const float *v1, const float *v2, const float limit)
{
if(fabs(v1[0]-v2[0])<limit)
if(fabs(v1[1]-v2[1])<limit)
@@ -447,7 +498,7 @@ MINLINE int compare_v3v3(float *v1, float *v2, float limit)
return 0;
}
-MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
+MINLINE int compare_len_v3v3(const float *v1, const float *v2, const float limit)
{
float x,y,z;
@@ -458,7 +509,7 @@ MINLINE int compare_len_v3v3(float *v1, float *v2, float limit)
return ((x*x + y*y + z*z) < (limit*limit));
}
-MINLINE int compare_v4v4(float *v1, float *v2, float limit)
+MINLINE int compare_v4v4(const float *v1, const float *v2, const float limit)
{
if(fabs(v1[0]-v2[0])<limit)
if(fabs(v1[1]-v2[1])<limit)
@@ -469,5 +520,11 @@ MINLINE int compare_v4v4(float *v1, float *v2, float limit)
return 0;
}
-#endif /* BLI_MATH_VECTOR_INLINE */
+MINLINE float line_point_side_v2(const float *l1, const float *l2, const float *pt)
+{
+ return ((l1[0]-pt[0]) * (l2[1]-pt[1])) -
+ ((l2[0]-pt[0]) * (l1[1]-pt[1]));
+}
+
+#endif /* BLI_MATH_VECTOR_INLINE_H */
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 141e5438bc9..9af1532ce4b 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -36,6 +36,8 @@
#include <math.h>
+#include "BLI_noise.h"
+
/* local */
static float noise3_perlin(float vec[3]);
//static float turbulence_perlin(float *point, float lofreq, float hifreq);
@@ -388,7 +390,7 @@ static char p[512+2]= {
0xA2,0xA0};
-float g[512+2][3]= {
+static float g[512+2][3]= {
{0.33783, 0.715698, -0.611206},
{-0.944031, -0.326599, -0.045624},
{-0.101074, -0.416443, -0.903503},
@@ -1052,15 +1054,17 @@ float BLI_hnoisep(float noisesize, float x, float y, float z)
/* Camberra omitted, didn't seem useful */
/* distance squared */
-static float dist_Squared(float x, float y, float z, float e) { return (x*x + y*y + z*z); }
+static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
/* real distance */
-static float dist_Real(float x, float y, float z, float e) { return sqrt(x*x + y*y + z*z); }
+static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrt(x*x + y*y + z*z); }
/* manhattan/taxicab/cityblock distance */
-static float dist_Manhattan(float x, float y, float z, float e) { return (fabs(x) + fabs(y) + fabs(z)); }
+static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabs(x) + fabs(y) + fabs(z)); }
/* Chebychev */
static float dist_Chebychev(float x, float y, float z, float e)
{
float t;
+ (void)e;
+
x = fabs(x);
y = fabs(y);
z = fabs(z);
@@ -1072,12 +1076,14 @@ static float dist_Chebychev(float x, float y, float z, float e)
static float dist_MinkovskyH(float x, float y, float z, float e)
{
float d = sqrt(fabs(x)) + sqrt(fabs(y)) + sqrt(fabs(z));
+ (void)e;
return (d*d);
}
/* minkovsky preset exponent 4 */
static float dist_Minkovsky4(float x, float y, float z, float e)
{
+ (void)e;
x *= x;
y *= y;
z *= z;
@@ -1752,7 +1758,7 @@ float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity
signal = offset - fabs(noisefunc(x, y, z));
signal *= signal;
result = signal;
- weight = 1.f;
+
for( i=1; i<(int)octaves; i++ ) {
x *= lacunarity;
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index cf773d575e5..2359a858d51 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +32,7 @@
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -42,12 +43,19 @@
#include "BLI_string.h"
#include "BLI_storage.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "BKE_utildefines.h"
#include "BKE_blender.h" // BLENDER_VERSION
#include "GHOST_Path-api.h"
+#if defined WIN32 && !defined _LIBC
+# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
+#else
+# define _GNU_SOURCE
+# include <fnmatch.h>
+#endif
#ifdef WIN32
#include <io.h>
@@ -63,13 +71,16 @@
#else /* non windows */
-#ifdef __linux__
+#ifdef WITH_BINRELOC
#include "binreloc.h"
#endif
#endif /* WIN32 */
/* local */
+#define UNIQUE_NAME_MAX 128
+
+extern char bprogname[];
static int add_win32_extension(char *name);
static char *blender_version_decimal(void);
@@ -130,10 +141,41 @@ void BLI_stringenc(char *string, const char *head, const char *tail, unsigned sh
sprintf(string, fmtstr, head, pic, tail);
}
+/* Foo.001 -> "Foo", 1
+ * Returns the length of "Foo" */
+int BLI_split_name_num(char *left, int *nr, const char *name, const char delim)
+{
+ int a;
+
+ *nr= 0;
+ a= strlen(name);
+ memcpy(left, name, (a + 1) * sizeof(char));
+
+ if(a>1 && name[a-1]==delim) return a;
+
+ while(a--) {
+ if( name[a]==delim ) {
+ left[a]= 0;
+ *nr= atol(name+a+1);
+ /* casting down to an int, can overflow for large numbers */
+ if(*nr < 0)
+ *nr= 0;
+ return a;
+ }
+ if( isdigit(name[a])==0 ) break;
+
+ left[a]= 0;
+ }
+
+ for(a= 0; name[a]; a++)
+ left[a]= name[a];
+
+ return a;
+}
void BLI_newname(char *name, int add)
{
- char head[128], tail[128];
+ char head[UNIQUE_NAME_MAX], tail[UNIQUE_NAME_MAX];
int pic;
unsigned short digits;
@@ -153,13 +195,43 @@ void BLI_newname(char *name, int add)
BLI_stringenc(name, head, tail, digits, pic);
}
+
+
+int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len)
+{
+ if(name == '\0') {
+ BLI_strncpy(name, defname, name_len);
+ }
+
+ if(unique_check(arg, name)) {
+ char tempname[UNIQUE_NAME_MAX];
+ char left[UNIQUE_NAME_MAX];
+ int number;
+ int len= BLI_split_name_num(left, &number, name, delim);
+ do {
+ int newlen= BLI_snprintf(tempname, name_len, "%s%c%03d", left, delim, number);
+ if(newlen >= name_len) {
+ len -= ((newlen + 1) - name_len);
+ if(len < 0) len= number= 0;
+ left[len]= '\0';
+ }
+ } while(number++, unique_check(arg, tempname));
+
+ BLI_strncpy(name, tempname, name_len);
+
+ return 1;
+ }
+
+ return 0;
+}
+
/* little helper macro for BLI_uniquename */
#ifndef GIVE_STRADDR
#define GIVE_STRADDR(data, offset) ( ((char *)data) + offset )
#endif
/* Generic function to set a unique name. It is only designed to be used in situations
- * where the name is part of the struct, and also that the name is at most 128 chars long.
+ * where the name is part of the struct, and also that the name is at most UNIQUE_NAME_MAX chars long.
*
* For places where this is used, see constraint.c for example...
*
@@ -168,65 +240,45 @@ void BLI_newname(char *name, int add)
* defname: the name that should be used by default if none is specified already
* delim: the character which acts as a delimeter between parts of the name
*/
-void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len)
+static int uniquename_find_dupe(ListBase *list, void *vlink, const char *name, short name_offs)
{
Link *link;
- char tempname[128];
- int number = 1, exists = 0;
- char *dot;
-
- /* Make sure length can be handled */
- if ((len < 0) || (len > 128))
- return;
-
- /* See if we are given an empty string */
- if (ELEM(NULL, vlink, defname))
- return;
-
- if (GIVE_STRADDR(vlink, name_offs) == '\0') {
- /* give it default name first */
- BLI_strncpy(GIVE_STRADDR(vlink, name_offs), defname, len);
- }
-
- /* See if we even need to do this */
- if (list == NULL)
- return;
-
+
for (link = list->first; link; link= link->next) {
if (link != vlink) {
- if (!strcmp(GIVE_STRADDR(link, name_offs), GIVE_STRADDR(vlink, name_offs))) {
- exists = 1;
- break;
+ if (!strcmp(GIVE_STRADDR(link, name_offs), name)) {
+ return 1;
}
}
}
- if (exists == 0)
+
+ return 0;
+}
+
+static int uniquename_unique_check(void *arg, const char *name)
+{
+ struct {ListBase *lb; void *vlink; short name_offs;} *data= arg;
+ return uniquename_find_dupe(data->lb, data->vlink, name, data->name_offs);
+}
+
+void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short name_len)
+{
+ struct {ListBase *lb; void *vlink; short name_offs;} data;
+ data.lb= list;
+ data.vlink= vlink;
+ data.name_offs= name_offs;
+
+ assert((name_len > 1) && (name_len <= UNIQUE_NAME_MAX));
+
+ /* See if we are given an empty string */
+ if (ELEM(NULL, vlink, defname))
return;
- /* Strip off the suffix */
- dot = strrchr(GIVE_STRADDR(vlink, name_offs), delim);
- if (dot)
- *dot=0;
-
- for (number = 1; number <= 999; number++) {
- BLI_snprintf(tempname, sizeof(tempname), "%s%c%03d", GIVE_STRADDR(vlink, name_offs), delim, number);
-
- exists = 0;
- for (link= list->first; link; link= link->next) {
- if (vlink != link) {
- if (!strcmp(GIVE_STRADDR(link, name_offs), tempname)) {
- exists = 1;
- break;
- }
- }
- }
- if (exists == 0) {
- BLI_strncpy(GIVE_STRADDR(vlink, name_offs), tempname, len);
- return;
- }
- }
+ BLI_uniquename_cb(uniquename_unique_check, &data, defname, delim, GIVE_STRADDR(vlink, name_offs), name_len);
}
+
+
/* ******************** string encoding ***************** */
/* This is quite an ugly function... its purpose is to
@@ -311,10 +363,17 @@ void BLI_cleanup_file(const char *relabase, char *dir)
dir[0]= '/';
dir[1]= 0;
return;
- }
+ }
+
+ /* support for odd paths: eg /../home/me --> /home/me
+ * this is a valid path in blender but we cant handle this the useual way below
+ * simply strip this prefix then evaluate the path as useual. pythons os.path.normpath() does this */
+ while((strncmp(dir, "/../", 4)==0)) {
+ memmove( dir, dir + 4, strlen(dir + 4) + 1 );
+ }
while ( (start = strstr(dir, "/../")) ) {
- eind = start + strlen("/../") - 1;
+ eind = start + (4 - 1) /* strlen("/../") - 1 */;
a = start-dir-1;
while (a>0) {
if (dir[a] == '/') break;
@@ -328,12 +387,12 @@ void BLI_cleanup_file(const char *relabase, char *dir)
}
while ( (start = strstr(dir,"/./")) ){
- eind = start + strlen("/./") - 1;
+ eind = start + (3 - 1) /* strlen("/./") - 1 */;
memmove( start, eind, strlen(eind)+1 );
}
while ( (start = strstr(dir,"//" )) ){
- eind = start + strlen("//") - 1;
+ eind = start + (2 - 1) /* strlen("//") - 1 */;
memmove( start, eind, strlen(eind)+1 );
}
@@ -360,8 +419,8 @@ void BLI_path_rel(char *file, const char *relfile)
/* also bail out if relative path is not set */
if (relfile[0] == 0) return;
-#ifdef WIN32
- if (strlen(relfile) > 2 && relfile[1] != ':') {
+#ifdef WIN32
+ if (BLI_strnlen(relfile, 3) > 2 && relfile[1] != ':') {
char* ptemp;
/* fix missing volume name in relative base,
can happen with old recent-files.txt files */
@@ -375,7 +434,7 @@ void BLI_path_rel(char *file, const char *relfile)
BLI_strncpy(temp, relfile, FILE_MAXDIR + FILE_MAXFILE);
}
- if (strlen(file) > 2) {
+ if (BLI_strnlen(file, 3) > 2) {
if ( temp[1] == ':' && file[1] == ':' && temp[0] != file[0] )
return;
}
@@ -400,7 +459,7 @@ void BLI_path_rel(char *file, const char *relfile)
char *p= temp;
char *q= file;
- while ((*p == *q)) {
+ while (*p == *q) {
++p; ++q;
/* dont search beyond the end of the string
* in the rare case they match */
@@ -458,13 +517,9 @@ int BLI_has_parent(char *path)
int BLI_parent_dir(char *path)
{
-#ifdef WIN32
- static char *parent_dir="..\\";
-#else
- static char *parent_dir="../";
-#endif
+ static char parent_dir[]= {'.', '.', SEP, '\0'}; /* "../" or "..\\" */
char tmp[FILE_MAXDIR+FILE_MAXFILE+4];
- BLI_strncpy(tmp, path, sizeof(tmp));
+ BLI_strncpy(tmp, path, sizeof(tmp)-4);
BLI_add_slash(tmp);
strcat(tmp, parent_dir);
BLI_cleanup_dir(NULL, tmp);
@@ -534,9 +589,20 @@ int BLI_path_frame(char *path, int frame, int digits)
ensure_digits(path, digits);
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
- char tmp[FILE_MAX], format[64];
+ char tmp[FILE_MAX];
+#if 0 // neat but breaks on non ascii strings.
+ char format[64];
sprintf(format, "%%.%ds%%.%dd%%s", ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d%s" */
sprintf(tmp, format, path, frame, path+ch_end);
+#else
+ char format[8];
+ char *p;
+ sprintf(format, "%%.%dd", ch_end-ch_sta); /* example result: "%.5d" */
+ memcpy(tmp, path, sizeof(char) * ch_sta);
+ p= tmp + ch_sta;
+ p += sprintf(p, format, frame);
+ memcpy(p, path + ch_end, strlen(path + ch_end));
+#endif
strcpy(path, tmp);
return 1;
}
@@ -552,9 +618,18 @@ int BLI_path_frame_range(char *path, int sta, int end, int digits)
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
char tmp[FILE_MAX], format[64];
+#if 0 // neat but breaks on non ascii strings.
sprintf(format, "%%.%ds%%.%dd_%%.%dd%%s", ch_sta, ch_end-ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d-%.5d%s" */
sprintf(tmp, format, path, sta, end, path+ch_end);
strcpy(path, tmp);
+#else
+ char *tmp_pt;
+ BLI_snprintf(format, sizeof(format), "%%.%dd-%%.%dd%%s", digits, digits);
+ memcpy(tmp, path, ch_sta * sizeof(char));
+ tmp_pt = &tmp[ch_sta];
+ tmp_pt += BLI_snprintf(tmp_pt, sizeof(tmp)-ch_sta, format, sta, end, &path[ch_end]);
+ memcpy(path, tmp, (int)(tmp_pt - tmp) + 1);
+#endif
return 1;
}
return 0;
@@ -677,8 +752,8 @@ int BLI_path_cwd(char *path)
#endif
if (wasrelative==1) {
- char cwd[FILE_MAXDIR + FILE_MAXFILE];
- BLI_getwdN(cwd); /* incase the full path to the blend isnt used */
+ char cwd[FILE_MAXDIR + FILE_MAXFILE]= "";
+ BLI_getwdN(cwd, sizeof(cwd)); /* incase the full path to the blend isnt used */
if (cwd[0] == '\0') {
printf( "Could not get the current working directory - $PWD for an unknown reason.");
@@ -782,11 +857,11 @@ static char *blender_version_decimal(void)
return version_str;
}
-static int test_path(char *targetpath, char *path_base, char *path_sep, char *folder_name)
+static int test_path(char *targetpath, const char *path_base, const char *path_sep, const char *folder_name)
{
char tmppath[FILE_MAX];
- if(path_sep) BLI_join_dirfile(tmppath, path_base, path_sep);
+ if(path_sep) BLI_join_dirfile(tmppath, sizeof(tmppath), path_base, path_sep);
else BLI_strncpy(tmppath, path_base, sizeof(tmppath));
BLI_make_file_string("/", targetpath, tmppath, folder_name);
@@ -806,7 +881,7 @@ static int test_path(char *targetpath, char *path_base, char *path_sep, char *fo
}
}
-static int test_env_path(char *path, char *envvar)
+static int test_env_path(char *path, const char *envvar)
{
char *env = envvar?getenv(envvar):NULL;
if (!env) return 0;
@@ -820,54 +895,32 @@ static int test_env_path(char *path, char *envvar)
}
}
-static int get_path_local(char *targetpath, char *folder_name, char *subfolder_name)
+static int get_path_local(char *targetpath, const char *folder_name, const char *subfolder_name)
{
- extern char bprogname[]; /* argv[0] from creator.c */
char bprogdir[FILE_MAX];
char relfolder[FILE_MAX];
- char cwd[FILE_MAX];
- char *s;
- int i;
#ifdef PATH_DEBUG2
printf("get_path_local...\n");
#endif
if (subfolder_name) {
- BLI_join_dirfile(relfolder, folder_name, subfolder_name);
+ BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
} else {
- BLI_strncpy(relfolder, folder_name, FILE_MAX);
+ BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
}
/* use argv[0] (bprogname) to get the path to the executable */
- s = BLI_last_slash(bprogname);
- i = s - bprogname + 1;
- BLI_strncpy(bprogdir, bprogname, i);
-
- /* try EXECUTABLE_DIR/folder_name */
- if(test_path(targetpath, bprogdir, "", relfolder))
- return 1;
-
- /* try CWD/release/folder_name */
- if(test_path(targetpath, BLI_getwdN(cwd), "release", relfolder))
- return 1;
+ BLI_split_dirfile(bprogname, bprogdir, NULL);
- /* try EXECUTABLE_DIR/release/folder_name */
- if(test_path(targetpath, bprogdir, "release", relfolder))
- return 1;
-
- /* try EXECUTABLE_DIR/2.5/folder_name - new default directory for local blender installed files */
+ /* try EXECUTABLE_DIR/2.5x/folder_name - new default directory for local blender installed files */
if(test_path(targetpath, bprogdir, blender_version_decimal(), relfolder))
return 1;
- /* try ./.blender/folder_name -- DEPRECATED, need to update build systems */
- if(test_path(targetpath, bprogdir, ".blender", relfolder))
- return 1;
-
return 0;
}
-static int get_path_user(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
+static int get_path_user(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
{
char user_path[FILE_MAX];
const char *user_base_path;
@@ -904,11 +957,41 @@ static int get_path_user(char *targetpath, char *folder_name, char *subfolder_na
}
}
-static int get_path_system(char *targetpath, char *folder_name, char *subfolder_name, char *envvar)
+static int get_path_system(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
{
char system_path[FILE_MAX];
const char *system_base_path;
+
+ /* first allow developer only overrides to the system path
+ * these are only used when running blender from source */
+ char cwd[FILE_MAX];
+ char relfolder[FILE_MAX];
+ char bprogdir[FILE_MAX];
+
+ /* use argv[0] (bprogname) to get the path to the executable */
+ BLI_split_dirfile(bprogname, bprogdir, NULL);
+
+ if (subfolder_name) {
+ BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
+ } else {
+ BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
+ }
+
+ /* try CWD/release/folder_name */
+ if(BLI_getwdN(cwd, sizeof(cwd))) {
+ if(test_path(targetpath, cwd, "release", relfolder)) {
+ return 1;
+ }
+ }
+
+ /* try EXECUTABLE_DIR/release/folder_name */
+ if(test_path(targetpath, bprogdir, "release", relfolder))
+ return 1;
+ /* end developer overrides */
+
+
+
system_path[0] = '\0';
if (test_env_path(system_path, envvar)) {
@@ -943,7 +1026,7 @@ static int get_path_system(char *targetpath, char *folder_name, char *subfolder_
/* get a folder out of the 'folder_id' presets for paths */
/* returns the path if found, NULL string if not */
-char *BLI_get_folder(int folder_id, char *subfolder)
+char *BLI_get_folder(int folder_id, const char *subfolder)
{
static char path[FILE_MAX] = "";
@@ -1015,7 +1098,7 @@ char *BLI_get_folder(int folder_id, char *subfolder)
return path;
}
-static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
+char *BLI_get_user_folder_notest(int folder_id, const char *subfolder)
{
static char path[FILE_MAX] = "";
@@ -1029,6 +1112,9 @@ static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
case BLENDER_USER_AUTOSAVE:
get_path_user(path, "autosave", subfolder, "BLENDER_USER_AUTOSAVE");
break;
+ case BLENDER_USER_SCRIPTS:
+ get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS");
+ break;
}
if ('\0' == path[0]) {
return NULL;
@@ -1036,12 +1122,12 @@ static char *BLI_get_user_folder_notest(int folder_id, char *subfolder)
return path;
}
-char *BLI_get_folder_create(int folder_id, char *subfolder)
+char *BLI_get_folder_create(int folder_id, const char *subfolder)
{
char *path;
/* only for user folders */
- if (!ELEM3(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG, BLENDER_USER_AUTOSAVE))
+ if (!ELEM4(folder_id, BLENDER_USER_DATAFILES, BLENDER_USER_CONFIG, BLENDER_USER_SCRIPTS, BLENDER_USER_AUTOSAVE))
return NULL;
path = BLI_get_folder(folder_id, subfolder);
@@ -1099,8 +1185,9 @@ void BLI_setenv_if_new(const char *env, const char* val)
void BLI_clean(char *path)
{
if(path==0) return;
+
#ifdef WIN32
- if(path && strlen(path)>2) {
+ if(path && BLI_strnlen(path, 3) > 2) {
BLI_char_switch(path+2, '/', '\\');
}
#else
@@ -1120,45 +1207,31 @@ void BLI_char_switch(char *string, char from, char to)
void BLI_make_exist(char *dir) {
int a;
- #ifdef WIN32
- BLI_char_switch(dir, '/', '\\');
- #else
- BLI_char_switch(dir, '\\', '/');
- #endif
-
+ BLI_char_switch(dir, ALTSEP, SEP);
+
a = strlen(dir);
-
-#ifdef WIN32
+
while(BLI_is_dir(dir) == 0){
a --;
- while(dir[a] != '\\'){
+ while(dir[a] != SEP){
a--;
if (a <= 0) break;
}
- if (a >= 0) dir[a+1] = 0;
+ if (a >= 0) {
+ dir[a+1] = '\0';
+ }
else {
- /* defaulting to drive (usually 'C:') of Windows installation */
+#ifdef WIN32
get_default_root(dir);
- break;
- }
- }
#else
- while(BLI_is_dir(dir) == 0){
- a --;
- while(dir[a] != '/'){
- a--;
- if (a <= 0) break;
- }
- if (a >= 0) dir[a+1] = 0;
- else {
strcpy(dir,"/");
+#endif
break;
}
}
-#endif
}
-void BLI_make_existing_file(char *name)
+void BLI_make_existing_file(const char *name)
{
char di[FILE_MAXDIR+FILE_MAXFILE], fi[FILE_MAXFILE];
@@ -1196,15 +1269,14 @@ void BLI_make_file_string(const char *relabase, char *string, const char *dir,
/* Get the file name, chop everything past the last slash (ie. the filename) */
strcpy(string, relabase);
- lslash= (strrchr(string, '/')>strrchr(string, '\\'))?strrchr(string, '/'):strrchr(string, '\\');
-
+ lslash= BLI_last_slash(string);
if(lslash) *(lslash+1)= 0;
dir+=2; /* Skip over the relative reference */
}
#ifdef WIN32
else {
- if (strlen(dir) >= 2 && dir[1] == ':' ) {
+ if (BLI_strnlen(dir, 3) >= 2 && dir[1] == ':' ) {
BLI_strncpy(string, dir, 3);
dir += 2;
}
@@ -1250,10 +1322,10 @@ int BLI_testextensie(const char *str, const char *ext)
{
short a, b;
int retval;
-
+
a= strlen(str);
b= strlen(ext);
-
+
if(a==0 || b==0 || b>=a) {
retval = 0;
} else if (BLI_strcasecmp(ext, str + a - b)) {
@@ -1261,7 +1333,7 @@ int BLI_testextensie(const char *str, const char *ext)
} else {
retval = 1;
}
-
+
return (retval);
}
@@ -1278,9 +1350,39 @@ int BLI_testextensie_array(const char *str, const char **ext_array)
return 0;
}
+/* semicolon separated wildcards, eg:
+ * '*.zip;*.py;*.exe' */
+int BLI_testextensie_glob(const char *str, const char *ext_fnmatch)
+{
+ const char *ext_step= ext_fnmatch;
+ char pattern[16];
+
+ while(ext_step[0]) {
+ char *ext_next;
+ int len_ext;
+
+ if((ext_next=strchr(ext_step, ';'))) {
+ len_ext= (int)(ext_next - ext_step) + 1;
+ }
+ else {
+ len_ext= sizeof(pattern);
+ }
+
+ BLI_strncpy(pattern, ext_step, len_ext);
+
+ if(fnmatch(pattern, str, FNM_CASEFOLD)==0) {
+ return 1;
+ }
+ ext_step += len_ext;
+ }
+
+ return 0;
+}
+
+
int BLI_replace_extension(char *path, int maxlen, const char *ext)
{
- int a;
+ unsigned int a;
for(a=strlen(path)-1; a>=0; a--)
if(path[a] == '.' || path[a] == '/' || path[a] == '\\')
@@ -1321,12 +1423,12 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
}
/* simple appending of filename to dir, does not check for valid path! */
-void BLI_join_dirfile(char *string, const char *dir, const char *file)
+void BLI_join_dirfile(char *string, const int maxlen, const char *dir, const char *file)
{
int sl_dir;
if(string != dir) /* compare pointers */
- BLI_strncpy(string, dir, FILE_MAX);
+ BLI_strncpy(string, dir, maxlen);
if (!file)
return;
@@ -1334,7 +1436,7 @@ void BLI_join_dirfile(char *string, const char *dir, const char *file)
sl_dir= BLI_add_slash(string);
if (sl_dir <FILE_MAX) {
- BLI_strncpy(string + sl_dir, file, FILE_MAX-sl_dir);
+ BLI_strncpy(string + sl_dir, file, maxlen - sl_dir);
}
}
@@ -1409,21 +1511,21 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
/* if image is _in_ current .blend file directory */
if (!strcmp(dir, blend_dir)) {
- BLI_join_dirfile(dest_path, dest_dir, base);
+ BLI_join_dirfile(dest_path, sizeof(dest_path), dest_dir, base);
}
/* "below" */
else {
/* rel = image_path_dir - blend_dir */
BLI_strncpy(rel_dir, dir + len, sizeof(rel_dir));
- BLI_join_dirfile(dest_path, dest_dir, rel_dir);
- BLI_join_dirfile(dest_path, dest_path, base);
+ BLI_join_dirfile(dest_path, sizeof(dest_path), dest_dir, rel_dir);
+ BLI_join_dirfile(dest_path, sizeof(dest_path), dest_path, base);
}
}
/* image is out of current directory */
else {
- BLI_join_dirfile(dest_path, dest_dir, base);
+ BLI_join_dirfile(dest_path, sizeof(dest_path), dest_dir, base);
}
if (abs)
@@ -1443,6 +1545,67 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
return 1;
}
+char *BLI_first_slash(char *string) {
+ char *ffslash, *fbslash;
+
+ ffslash= strchr(string, '/');
+ fbslash= strchr(string, '\\');
+
+ if (!ffslash) return fbslash;
+ else if (!fbslash) return ffslash;
+
+ if ((intptr_t)ffslash < (intptr_t)fbslash) return ffslash;
+ else return fbslash;
+}
+
+char *BLI_last_slash(const char *string) {
+ char *lfslash, *lbslash;
+
+ lfslash= strrchr(string, '/');
+ lbslash= strrchr(string, '\\');
+
+ if (!lfslash) return lbslash;
+ else if (!lbslash) return lfslash;
+
+ if ((intptr_t)lfslash < (intptr_t)lbslash) return lbslash;
+ else return lfslash;
+}
+
+/* adds a slash if there isnt one there already */
+int BLI_add_slash(char *string) {
+ int len = strlen(string);
+#ifdef WIN32
+ if (len==0 || string[len-1]!='\\') {
+ string[len] = '\\';
+ string[len+1] = '\0';
+ return len+1;
+ }
+#else
+ if (len==0 || string[len-1]!='/') {
+ string[len] = '/';
+ string[len+1] = '\0';
+ return len+1;
+ }
+#endif
+ return len;
+}
+
+/* removes a slash if there is one */
+void BLI_del_slash(char *string) {
+ int len = strlen(string);
+ while (len) {
+#ifdef WIN32
+ if (string[len-1]=='\\') {
+#else
+ if (string[len-1]=='/') {
+#endif
+ string[len-1] = '\0';
+ len--;
+ } else {
+ break;
+ }
+ }
+}
static int add_win32_extension(char *name)
{
@@ -1485,54 +1648,54 @@ static int add_win32_extension(char *name)
return (retval);
}
-void BLI_where_am_i(char *fullname, const char *name)
+/* filename must be FILE_MAX length minimum */
+void BLI_where_am_i(char *fullname, const int maxlen, const char *name)
{
char filename[FILE_MAXDIR+FILE_MAXFILE];
char *path = NULL, *temp;
-
+
#ifdef _WIN32
- char *separator = ";";
- char slash = '\\';
+ const char *separator = ";";
#else
- char *separator = ":";
- char slash = '/';
+ const char *separator = ":";
#endif
-#ifdef __linux__
+#ifdef WITH_BINRELOC
/* linux uses binreloc since argv[0] is not relyable, call br_init( NULL ) first */
path = br_find_exe( NULL );
if (path) {
- BLI_strncpy(fullname, path, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_strncpy(fullname, path, maxlen);
free(path);
return;
}
#endif
#ifdef _WIN32
- if(GetModuleFileName(0, fullname, FILE_MAXDIR+FILE_MAXFILE)) {
- GetShortPathName(fullname, fullname, FILE_MAXDIR+FILE_MAXFILE);
+ if(GetModuleFileName(0, fullname, maxlen)) {
+ GetShortPathName(fullname, fullname, maxlen);
return;
}
#endif
/* unix and non linux */
- if (name && fullname && strlen(name)) {
- strcpy(fullname, name);
+ if (name && name[0]) {
+ BLI_strncpy(fullname, name, maxlen);
if (name[0] == '.') {
- // relative path, prepend cwd
- BLI_getwdN(fullname);
-
+ char wdir[FILE_MAX]= "";
+ BLI_getwdN(wdir, sizeof(wdir)); /* backup cwd to restore after */
+
// not needed but avoids annoying /./ in name
- if(name && name[0]=='.' && name[1]==slash)
- BLI_join_dirfile(fullname, fullname, name+2);
+ if(name[1]==SEP)
+ BLI_join_dirfile(fullname, maxlen, wdir, name+2);
else
- BLI_join_dirfile(fullname, fullname, name);
-
- add_win32_extension(fullname);
- } else if (BLI_last_slash(name)) {
+ BLI_join_dirfile(fullname, maxlen, wdir, name);
+
+ add_win32_extension(fullname); /* XXX, doesnt respect length */
+ }
+ else if (BLI_last_slash(name)) {
// full path
- strcpy(fullname, name);
+ BLI_strncpy(fullname, name, maxlen);
add_win32_extension(fullname);
} else {
// search for binary in $PATH
@@ -1547,15 +1710,15 @@ void BLI_where_am_i(char *fullname, const char *name)
} else {
strncpy(filename, path, sizeof(filename));
}
- BLI_join_dirfile(fullname, fullname, name);
+ BLI_join_dirfile(fullname, maxlen, fullname, name);
if (add_win32_extension(filename)) {
- strcpy(fullname, filename);
+ BLI_strncpy(fullname, filename, maxlen);
break;
}
} while (temp);
}
}
-#ifndef NDEBUG
+#if defined(DEBUG)
if (strcmp(name, fullname)) {
printf("guessing '%s' == '%s'\n", name, fullname);
}
@@ -1567,20 +1730,20 @@ void BLI_where_am_i(char *fullname, const char *name)
// spaces and double-quotes. There's another solution to this
// with spawnv(P_WAIT, bprogname, argv) instead of system() but
// that's even uglier
- GetShortPathName(fullname, fullname, FILE_MAXDIR+FILE_MAXFILE);
-#ifndef NDEBUG
+ GetShortPathName(fullname, fullname, maxlen);
+#if defined(DEBUG)
printf("Shortname = '%s'\n", fullname);
#endif
#endif
}
}
-void BLI_where_is_temp(char *fullname, int usertemp)
+void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp)
{
fullname[0] = '\0';
if (usertemp && BLI_is_dir(U.tempdir)) {
- strcpy(fullname, U.tempdir);
+ BLI_strncpy(fullname, U.tempdir, maxlen);
}
@@ -1588,7 +1751,7 @@ void BLI_where_is_temp(char *fullname, int usertemp)
if (fullname[0] == '\0') {
char *tmp = getenv("TEMP"); /* Windows */
if (tmp && BLI_is_dir(tmp)) {
- strcpy(fullname, tmp);
+ BLI_strncpy(fullname, tmp, maxlen);
}
}
#else
@@ -1596,28 +1759,32 @@ void BLI_where_is_temp(char *fullname, int usertemp)
if (fullname[0] == '\0') {
char *tmp = getenv("TMP");
if (tmp && BLI_is_dir(tmp)) {
- strcpy(fullname, tmp);
+ BLI_strncpy(fullname, tmp, maxlen);
}
}
if (fullname[0] == '\0') {
char *tmp = getenv("TMPDIR");
if (tmp && BLI_is_dir(tmp)) {
- strcpy(fullname, tmp);
+ BLI_strncpy(fullname, tmp, maxlen);
}
}
#endif
if (fullname[0] == '\0') {
- strcpy(fullname, "/tmp/");
+ BLI_strncpy(fullname, "/tmp/", maxlen);
} else {
/* add a trailing slash if needed */
BLI_add_slash(fullname);
+#ifdef WIN32
+ if(U.tempdir != fullname) {
+ BLI_strncpy(U.tempdir, fullname, maxlen); /* also set user pref to show %TEMP%. /tmp/ is just plain confusing for Windows users. */
+ }
+#endif
}
}
char *get_install_dir(void) {
- extern char bprogname[];
char *tmpname = BLI_strdup(bprogname);
char *cut;
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index 9bce8bb4e37..3393a2674e9 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
@@ -43,25 +44,27 @@
/* Bitmap */
typedef char* BLI_bitmap;
-BLI_bitmap BLI_bitmap_new(int tot)
+static BLI_bitmap BLI_bitmap_new(int tot)
{
return MEM_callocN((tot >> 3) + 1, "BLI bitmap");
}
-int BLI_bitmap_get(BLI_bitmap b, int index)
+static int BLI_bitmap_get(BLI_bitmap b, int index)
{
return b[index >> 3] & (1 << (index & 7));
}
-void BLI_bitmap_set(BLI_bitmap b, int index)
+static void BLI_bitmap_set(BLI_bitmap b, int index)
{
b[index >> 3] |= (1 << (index & 7));
}
-void BLI_bitmap_clear(BLI_bitmap b, int index)
+#if 0 /* UNUSED */
+static void BLI_bitmap_clear(BLI_bitmap b, int index)
{
b[index >> 3] &= ~(1 << (index & 7));
}
+#endif
/* Axis-aligned bounding box */
typedef struct {
@@ -263,7 +266,7 @@ static int partition_indices(int *prim_indices, int lo, int hi, int axis,
}
}
-void check_partitioning(int *prim_indices, int lo, int hi, int axis,
+static void check_partitioning(int *prim_indices, int lo, int hi, int axis,
float mid, BBC *prim_bbc, int index_of_2nd_partition)
{
int i;
@@ -404,7 +407,7 @@ static void build_grids_leaf_node(PBVH *bvh, PBVHNode *node)
offset and start indicate a range in the array of primitive indices
*/
-void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc,
+static void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc,
int offset, int count)
{
int i, axis, end;
@@ -840,7 +843,7 @@ float BLI_pbvh_node_get_tmin(PBVHNode* node)
return node->tmin;
}
-void BLI_pbvh_search_callback_occluded(PBVH *bvh,
+static void BLI_pbvh_search_callback_occluded(PBVH *bvh,
BLI_pbvh_SearchCallback scb, void *search_data,
BLI_pbvh_HitOccludedCallback hcb, void *hit_data)
{
@@ -1400,7 +1403,7 @@ int BLI_pbvh_node_raycast(PBVH *bvh, PBVHNode *node, float (*origco)[3],
//#include "BIF_gl.h"
//#include "BIF_glutil.h"
-void BLI_pbvh_node_draw(PBVHNode *node, void *data)
+void BLI_pbvh_node_draw(PBVHNode *node, void *UNUSED(data))
{
#if 0
/* XXX: Just some quick code to show leaf nodes in different colors */
@@ -1520,13 +1523,22 @@ void BLI_pbvh_apply_vertCos(PBVH *pbvh, float (*vertCos)[3])
}
if (pbvh->verts) {
+ MVert *mvert= pbvh->verts;
/* copy new verts coords */
- for (a= 0; a < pbvh->totvert; ++a) {
- copy_v3_v3(pbvh->verts[a].co, vertCos[a]);
+ for (a= 0; a < pbvh->totvert; ++a, ++mvert) {
+ copy_v3_v3(mvert->co, vertCos[a]);
+ mvert->flag |= ME_VERT_PBVH_UPDATE;
}
/* coordinates are new -- normals should also be updated */
mesh_calc_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL);
+
+ for (a= 0; a < pbvh->totnode; ++a)
+ BLI_pbvh_node_mark_update(&pbvh->nodes[a]);
+
+ BLI_pbvh_update(pbvh, PBVH_UpdateBB, NULL);
+ BLI_pbvh_update(pbvh, PBVH_UpdateOriginalBB, NULL);
+
}
}
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index 7c14cfd3426..8afb9bec3dd 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c
index aa424c1c2bb..5fb9842b7a2 100644
--- a/source/blender/blenlib/intern/rct.c
+++ b/source/blender/blenlib/intern/rct.c
@@ -34,10 +34,13 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+#include <stdio.h>
+#include <math.h>
#include "DNA_vec_types.h"
#include <stdio.h>
#include <math.h>
+#include "BLI_rect.h"
int BLI_rcti_is_empty(rcti * rect)
{
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 7ca7dba2746..2054179a7e2 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,18 +35,18 @@
#include "MEM_guardedalloc.h"
-
+#include "BLI_callbacks.h"
#include "BLI_editVert.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
-
-#include "BKE_utildefines.h"
+#include "BLI_scanfill.h"
+#include "BLI_utildefines.h"
/* callbacks for errors and interrupts and some goo */
-static void (*BLI_localErrorCallBack)(char*) = NULL;
+static void (*BLI_localErrorCallBack)(const char*) = NULL;
static int (*BLI_localInterruptCallBack)(void) = NULL;
-void BLI_setErrorCallBack(void (*f)(char*))
+void BLI_setErrorCallBack(void (*f)(const char *))
{
BLI_localErrorCallBack = f;
}
@@ -57,7 +57,7 @@ void BLI_setInterruptCallBack(int (*f)(void))
}
/* just flush the error to /dev/null if the error handler is missing */
-void callLocalErrorCallBack(char* msg)
+void callLocalErrorCallBack(const char* msg)
{
if (BLI_localErrorCallBack) {
BLI_localErrorCallBack(msg);
@@ -377,7 +377,7 @@ static ScFillVert *addedgetoscanlist(EditEdge *eed, int len)
sc= (ScFillVert *)bsearch(&scsearch,scdata,len,
sizeof(ScFillVert), vergscdata);
- if(sc==0) printf("Error in search edge: %p\n",eed);
+ if(sc==0) printf("Error in search edge: %p\n", (void *)eed);
else if(addedgetoscanvert(sc,eed)==0) return sc;
return 0;
@@ -482,8 +482,8 @@ static void splitlist(ListBase *tempve, ListBase *temped, short nr)
EditVert *eve,*nextve;
EditEdge *eed,*nexted;
- addlisttolist(tempve,&fillvertbase);
- addlisttolist(temped,&filledgebase);
+ BLI_movelisttolist(tempve,&fillvertbase);
+ BLI_movelisttolist(temped,&filledgebase);
eve= tempve->first;
while(eve) {
@@ -516,9 +516,9 @@ static void scanfill(PolyFill *pf, int mat_nr)
short nr, test, twoconnected=0;
nr= pf->nr;
- verts= pf->verts;
/* PRINTS
+ verts= pf->verts;
eve= fillvertbase.first;
while(eve) {
printf("vert: %x co: %f %f\n",eve,eve->co[cox],eve->co[coy]);
@@ -575,7 +575,6 @@ static void scanfill(PolyFill *pf, int mat_nr)
qsort(scdata, verts, sizeof(ScFillVert), vergscdata);
- sc= scdata;
eed= filledgebase.first;
while(eed) {
nexted= eed->next;
@@ -764,7 +763,7 @@ static void scanfill(PolyFill *pf, int mat_nr)
-int BLI_edgefill(int mode, int mat_nr)
+int BLI_edgefill(int mat_nr)
{
/*
- fill works with its own lists, so create that first (no faces!)
@@ -802,7 +801,7 @@ int BLI_edgefill(int mode, int mat_nr)
eve = fillvertbase.first;
- if (mode & 2) {
+ if (1) { //BMESH_TODO this is correct, right? -joeedh //mode & 2) {
/*use shortest diagonal for quad*/
sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
@@ -1054,8 +1053,8 @@ int BLI_edgefill(int mode, int mat_nr)
MEM_freeN(polycache);
}
- pf= pflist;
/* printf("after merge\n");
+ pf= pflist;
for(a=1;a<=poly;a++) {
printf("poly:%d edges:%d verts:%d flag: %d\n",a,pf->edges,pf->verts,pf->f);
pf++;
@@ -1078,8 +1077,8 @@ int BLI_edgefill(int mode, int mat_nr)
}
pf++;
}
- addlisttolist(&fillvertbase,&tempve);
- addlisttolist(&filledgebase,&temped);
+ BLI_movelisttolist(&fillvertbase,&tempve);
+ BLI_movelisttolist(&filledgebase,&temped);
/* FREE */
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index 80310b1ef8a..b7ac571f856 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -71,10 +71,6 @@
#include <pwd.h>
#endif
-#if !defined(__FreeBSD__) && !defined(__APPLE__)
-#include <malloc.h>
-#endif
-
#ifdef WIN32
#include <io.h>
#include <direct.h>
@@ -89,8 +85,10 @@
#include "BLI_listbase.h"
#include "BLI_linklist.h"
+#include "BLI_storage.h"
#include "BLI_storage_types.h"
#include "BLI_string.h"
+
#include "BKE_utildefines.h"
/* vars: */
@@ -101,21 +99,16 @@ static struct ListBase dirbase_={
0,0};
static struct ListBase *dirbase = &dirbase_;
-
-char *BLI_getwdN(char *dir)
+/* can return NULL when the size is not big enough */
+char *BLI_getwdN(char *dir, const int maxncpy)
{
- char *pwd;
-
- if (dir) {
- pwd = getenv("PWD");
- if (pwd){
- strcpy(dir, pwd);
- return(dir);
- }
- /* 160 is FILE_MAXDIR in filesel.c */
- return( getcwd(dir, 160) );
+ const char *pwd= getenv("PWD");
+ if (pwd){
+ BLI_strncpy(dir, pwd, maxncpy);
+ return dir;
}
- return(0);
+
+ return getcwd(dir, maxncpy);
}
@@ -146,7 +139,7 @@ int BLI_compare(struct direntry *entry1, struct direntry *entry2)
}
-double BLI_diskfree(char *dir)
+double BLI_diskfree(const char *dir)
{
#ifdef WIN32
DWORD sectorspc, bytesps, freec, clusters;
@@ -201,11 +194,11 @@ double BLI_diskfree(char *dir)
#endif
}
-void BLI_builddir(char *dirname, char *relname)
+void BLI_builddir(const char *dirname, const char *relname)
{
struct dirent *fname;
struct dirlink *dlink;
- int rellen, newnum = 0, len;
+ int rellen, newnum = 0;
char buf[256];
DIR *dir;
@@ -224,8 +217,6 @@ void BLI_builddir(char *dirname, char *relname)
if ( (dir = (DIR *)opendir(".")) ){
while ((fname = (struct dirent*) readdir(dir)) != NULL) {
- len= strlen(fname->d_name);
-
dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
if (dlink){
strcpy(buf+rellen,fname->d_name);
@@ -289,12 +280,12 @@ void BLI_builddir(char *dirname, char *relname)
}
}
-void BLI_adddirstrings()
+void BLI_adddirstrings(void)
{
char datum[100];
char buf[512];
char size[250];
- static char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
+ static const char * types[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"};
int num, mode;
#ifdef WIN32
__int64 st_size;
@@ -397,7 +388,7 @@ void BLI_adddirstrings()
}
}
-unsigned int BLI_getdir(char *dirname, struct direntry **filelist)
+unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
{
// reset global variables
// memory stored in files is free()'d in
@@ -421,7 +412,7 @@ unsigned int BLI_getdir(char *dirname, struct direntry **filelist)
}
-int BLI_filesize(int file)
+size_t BLI_filesize(int file)
{
struct stat buf;
@@ -430,11 +421,11 @@ int BLI_filesize(int file)
return (buf.st_size);
}
-int BLI_filepathsize(const char *path)
+size_t BLI_filepathsize(const char *path)
{
int size, file = open(path, O_BINARY|O_RDONLY);
- if (file < 0)
+ if (file == -1)
return -1;
size = BLI_filesize(file);
@@ -443,7 +434,7 @@ int BLI_filepathsize(const char *path)
}
-int BLI_exist(char *name)
+int BLI_exist(const char *name)
{
#if defined(WIN32) && !defined(__MINGW32__)
struct _stat64i32 st;
@@ -474,11 +465,11 @@ int BLI_exist(char *name)
}
/* would be better in fileops.c except that it needs stat.h so add here */
-int BLI_is_dir(char *file) {
+int BLI_is_dir(const char *file) {
return S_ISDIR(BLI_exist(file));
}
-LinkNode *BLI_read_file_as_lines(char *name)
+LinkNode *BLI_read_file_as_lines(const char *name)
{
FILE *fp= fopen(name, "r");
LinkNode *lines= NULL;
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index 76193ba9a13..d6331d6eeb8 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -66,7 +66,7 @@ char *BLI_strdupcat(const char *str1, const char *str2)
return n;
}
-char *BLI_strncpy(char *dst, const char *src, int maxncpy) {
+char *BLI_strncpy(char *dst, const char *src, const int maxncpy) {
int srclen= strlen(src);
int cpylen= (srclen>(maxncpy-1))?(maxncpy-1):srclen;
@@ -311,8 +311,13 @@ int BLI_natstrcmp(const char *s1, const char *s2)
c1 = tolower(s1[d1]);
c2 = tolower(s2[d2]);
}
-
- if (c1<c2) {
+
+ /* first check for '.' so "foo.bar" comes before "foo 1.bar" */
+ if(c1=='.' && c2!='.')
+ return -1;
+ if(c1!='.' && c2=='.')
+ return 1;
+ else if (c1<c2) {
return -1;
} else if (c1>c2) {
return 1;
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 726ed817f8b..f57f6f969ae 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -442,6 +442,8 @@ ThreadedWorker *BLI_create_worker(void *(*do_thread)(void *), int tot, int sleep
{
ThreadedWorker *worker;
+ (void)sleep_time; /* unused */
+
worker = MEM_callocN(sizeof(ThreadedWorker), "threadedworker");
if (tot > RE_MAX_THREAD)
@@ -518,7 +520,7 @@ struct ThreadQueue {
int nowait;
};
-ThreadQueue *BLI_thread_queue_init()
+ThreadQueue *BLI_thread_queue_init(void)
{
ThreadQueue *queue;
diff --git a/source/blender/blenlib/intern/time.c b/source/blender/blenlib/intern/time.c
index 0992e08b28f..a14f73968bf 100644
--- a/source/blender/blenlib/intern/time.c
+++ b/source/blender/blenlib/intern/time.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,8 +27,9 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
#include "PIL_time.h"
+
+#ifdef WIN32
#include <windows.h>
double PIL_check_seconds_timer(void)
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index cc115d52928..81fe6b26ba4 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,7 @@
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_uvproject.h"
typedef struct UvCameraInfo {
float camangle;
@@ -60,7 +61,9 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci)
target[1]= pv4[1] / uci->camsize;
}
else {
- float vec2d[2]= {pv4[0], pv4[2]}; /* 2D position from the camera */
+ float vec2d[2]; /* 2D position from the camera */
+ vec2d[0]= pv4[0];
+ vec2d[1]= pv4[2];
target[0]= angle * (M_PI / uci->camangle);
target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize);
}
diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c
index 2b04a49e848..966bf754d69 100644
--- a/source/blender/blenlib/intern/voxel.c
+++ b/source/blender/blenlib/intern/voxel.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,8 +27,9 @@
*/
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
BM_INLINE float D(float *data, int *res, int x, int y, int z)
{
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index 81a635205f9..71eac3c86c4 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,13 +33,16 @@
#include <stdlib.h>
#include <stdio.h>
-
+#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
+
+#include "BKE_utildefines.h"
+
#define WIN32_SKIP_HKEY_PROTECTION // need to use HKEY
#include "BLI_winstuff.h"
-#include "BKE_utildefines.h" /* FILE_MAXDIR + FILE_MAXFILE */
+ /* FILE_MAXDIR + FILE_MAXFILE */
int BLI_getInstallationDir( char * str ) {
char dir[FILE_MAXDIR];
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 719a3c065ae..024bff98c0f 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -25,11 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * external readfile function prototypes
*/
#ifndef BLO_READFILE_H
#define BLO_READFILE_H
+/** \file BLO_readfile.h
+ * \ingroup readwrite
+ * \brief external readfile function prototypes.
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -80,7 +84,7 @@ typedef struct BlendFileData {
* indicating the cause of the failure.
* @return The data of the file.
*/
-BlendFileData* BLO_read_from_file (char *file, struct ReportList *reports);
+BlendFileData* BLO_read_from_file(const char *file, struct ReportList *reports);
/**
* Open a blender file from memory. The function
@@ -200,7 +204,7 @@ int BLO_has_bfile_extension(char *str);
int BLO_is_a_library(const char *path, char *dir, char *group);
struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, char *dir);
-void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, char *name, int idcode, short flag);
+void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
void BLO_library_append_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag);
/* deprecated */
diff --git a/source/blender/blenloader/BLO_soundfile.h b/source/blender/blenloader/BLO_soundfile.h
index aa37a053e18..ae6b4138e03 100644
--- a/source/blender/blenloader/BLO_soundfile.h
+++ b/source/blender/blenloader/BLO_soundfile.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef BLO_SOUNDFILE_H
#define BLO_SOUNDFILE_H
+/** \file BLO_soundfile.h
+ * \ingroup readwrite
+ */
+
#include "DNA_sound_types.h"
#include "DNA_packedFile_types.h"
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index e29beb48efb..b230b0e5624 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BLO_sys_types.h
+ * \ingroup readwrite
+ *
* A platform-independent definition of [u]intXX_t
* Plus the accompanying header include for htonl/ntohl
*
diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h
index 9ec03c4e4d4..c7f0f7f0d1f 100644
--- a/source/blender/blenloader/BLO_undofile.h
+++ b/source/blender/blenloader/BLO_undofile.h
@@ -31,6 +31,10 @@
#ifndef BLO_UNDOFILE_H
#define BLO_UNDOFILE_H
+/** \file BLO_undofile.h
+ * \ingroup readwrite
+ */
+
typedef struct {
void *next, *prev;
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index 182c582cc0f..7fdc136980e 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -25,20 +25,23 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * external writefile function prototypes
*/
#ifndef BLO_WRITEFILE_H
#define BLO_WRITEFILE_H
+/** \file BLO_writefile.h
+ * \ingroup readwrite
+ * \brief external writefile function prototypes.
+ */
+
struct MemFile;
struct Main;
struct ReportList;
extern int BLO_write_file(struct Main *mainvar, char *dir, int write_flags, struct ReportList *reports, int *thumb);
-extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current,
- int write_flags, struct ReportList *reports);
-extern int BLO_write_runtime(struct Main *mainvar, char *file, char *exename, struct ReportList *reports);
+extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags);
+extern int BLO_write_runtime(struct Main *mainvar, const char *file, char *exename, struct ReportList *reports);
#define BLEN_THUMB_SIZE 128
diff --git a/source/blender/blenloader/CMakeLists.txt b/source/blender/blenloader/CMakeLists.txt
index 29b81a6f11b..4d8ac9bc4b6 100644
--- a/source/blender/blenloader/CMakeLists.txt
+++ b/source/blender/blenloader/CMakeLists.txt
@@ -24,14 +24,34 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- . ../../../intern/guardedalloc ../blenlib ../blenkernel
- ../makesdna ../readblenfile ../include ../makesrna
- ../python ../../kernel/gen_messaging ../bmesh
+set(INC
+ .
+ ../blenlib
+ ../blenkernel
+ ../makesdna
+ ../readblenfile
+ ../makesrna
../render/extern/include
- ${ZLIB_INC}
+ ../../../intern/guardedalloc
+ ${ZLIB_INCLUDE_DIRS}
)
-BLENDERLIB(bf_blenloader "${SRC}" "${INC}")
+set(SRC
+ intern/readblenentry.c
+ intern/readfile.c
+ intern/undofile.c
+ intern/writefile.c
+
+ BLO_readfile.h
+ BLO_soundfile.h
+ BLO_sys_types.h
+ BLO_undofile.h
+ BLO_writefile.h
+ intern/readfile.h
+)
+
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
+
+blender_add_lib(bf_blenloader "${SRC}" "${INC}")
diff --git a/source/blender/blenloader/Makefile b/source/blender/blenloader/Makefile
deleted file mode 100644
index 069bad4d371..00000000000
--- a/source/blender/blenloader/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenloader
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenloader/SConscript b/source/blender/blenloader/SConscript
index 543151e4adc..b3cb98abb9b 100644
--- a/source/blender/blenloader/SConscript
+++ b/source/blender/blenloader/SConscript
@@ -11,4 +11,7 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = []
-env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [167,30] )
+if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
+ env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player'], priority = [167,30]) #, cc_compileflags=['/WX'] )
+else:
+ env.BlenderLib ( 'bf_blenloader', sources, Split(incs), defs, libtype=['core','player','player2'], priority = [167,30,5] )
diff --git a/source/blender/blenloader/intern/Makefile b/source/blender/blenloader/intern/Makefile
deleted file mode 100644
index fe178ea2610..00000000000
--- a/source/blender/blenloader/intern/Makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenloader
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-# CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# zlib
-ifeq ($(OS),$(findstring $(OS), "solaris windows"))
- CPPFLAGS += -I$(NAN_ZLIB)/include
-endif
-
-# streaming write function
-CPPFLAGS += -I../../writestreamglue
-CPPFLAGS += -I../../readstreamglue
-
-# initiate a streaming read pipe
-CPPFLAGS += -I../../readblenfile
-
-# This mod uses the GEN, DNA, BLI and BKE modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../render/extern/include/
-CPPFLAGS += -I../../python
-
-# we still refer to /include a bit...
-CPPFLAGS += -I../../editors/include
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index da441214b37..834d36c924f 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,7 @@
* .blend file reading entry point
*/
+#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
#include <stdlib.h>
@@ -37,6 +38,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
@@ -48,6 +50,7 @@
#include "BKE_library.h" // for free_main
#include "BKE_idcode.h"
#include "BKE_report.h"
+#include "BKE_utildefines.h"
#include "BLO_readfile.h"
#include "BLO_undofile.h"
@@ -168,11 +171,11 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
memcpy(new_prv, prv, sizeof(PreviewImage));
if (prv->rect[0]) {
unsigned int *rect = NULL;
- int rectlen = 0;
+ // int rectlen = 0;
new_prv->rect[0] = MEM_callocN(new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
- rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
+ // rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
memcpy(new_prv->rect[0], rect, bhead->len);
} else {
new_prv->rect[0] = NULL;
@@ -180,11 +183,11 @@ LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
if (prv->rect[1]) {
unsigned int *rect = NULL;
- int rectlen = 0;
+ // int rectlen = 0;
new_prv->rect[1] = MEM_callocN(new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
- rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
+ // rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
memcpy(new_prv->rect[1], rect, bhead->len);
} else {
new_prv->rect[1] = NULL;
@@ -241,7 +244,7 @@ void BLO_blendhandle_close(BlendHandle *bh) {
/**********/
-BlendFileData *BLO_read_from_file(char *file, ReportList *reports)
+BlendFileData *BLO_read_from_file(const char *file, ReportList *reports)
{
BlendFileData *bfd = NULL;
FileData *fd;
@@ -283,7 +286,7 @@ BlendFileData *BLO_read_from_memfile(Main *oldmain, const char *filename, MemFil
strcpy(fd->relabase, filename);
/* clear ob->proxy_from pointers in old main */
- blo_clear_proxy_pointers_from_lib(fd, oldmain);
+ blo_clear_proxy_pointers_from_lib(oldmain);
/* separate libraries from old main */
blo_split_main(&mainlist, oldmain);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cb051433087..4fbc19e1c2c 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -39,7 +39,6 @@
#ifndef WIN32
#include <unistd.h> // for read close
- #include <sys/param.h> // for MAXPATHLEN
#else
#include <io.h> // for open close read
#include "winsock2.h"
@@ -91,6 +90,7 @@
#include "BLI_math.h"
#include "BLI_cellalloc.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_action.h"
@@ -109,6 +109,7 @@
#include "BKE_lattice.h"
#include "BKE_library.h" // for which_libbase
#include "BKE_idcode.h"
+#include "BKE_material.h"
#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
#include "BKE_modifier.h"
@@ -229,7 +230,7 @@ typedef struct OldNewMap {
/* local prototypes */
-static void *read_struct(FileData *fd, BHead *bh, char *blockname);
+static void *read_struct(FileData *fd, BHead *bh, const char *blockname);
static OldNewMap *oldnewmap_new(void)
@@ -383,10 +384,10 @@ static void add_main_to_main(Main *mainvar, Main *from)
ListBase *lbarray[MAX_LIBARRAY], *fromarray[MAX_LIBARRAY];
int a;
- a= set_listbasepointers(mainvar, lbarray);
+ set_listbasepointers(mainvar, lbarray);
a= set_listbasepointers(from, fromarray);
while(a--) {
- addlisttolist(lbarray[a], fromarray[a]);
+ BLI_movelisttolist(lbarray[a], fromarray[a]);
}
}
@@ -423,7 +424,7 @@ static void split_libdata(ListBase *lb, Main *first)
}
mainvar= mainvar->next;
}
- if(mainvar==0) printf("error split_libdata\n");
+ if(mainvar==NULL) printf("error split_libdata\n");
}
id= idnext;
}
@@ -590,20 +591,16 @@ static void bh8_from_bh4(BHead *bhead, BHead4 *bhead4)
static BHeadN *get_bhead(FileData *fd)
{
- BHead8 bhead8;
- BHead4 bhead4;
- BHead bhead;
- BHeadN *new_bhead = 0;
+ BHeadN *new_bhead = NULL;
int readsize;
if (fd) {
if ( ! fd->eof) {
-
- /* not strictly needed but shuts valgrind up
+ /* initializing to zero isn't strictly needed but shuts valgrind up
* since uninitialized memory gets compared */
- memset(&bhead8, 0, sizeof(BHead8));
- memset(&bhead4, 0, sizeof(BHead4));
- memset(&bhead, 0, sizeof(BHead));
+ BHead8 bhead8= {0};
+ BHead4 bhead4= {0};
+ BHead bhead= {0};
// First read the bhead structure.
// Depending on the platform the file was written on this can
@@ -659,7 +656,7 @@ static BHeadN *get_bhead(FileData *fd)
if ( ! fd->eof) {
new_bhead = MEM_mallocN(sizeof(BHeadN) + bhead.len, "new_bhead");
if (new_bhead) {
- new_bhead->next = new_bhead->prev = 0;
+ new_bhead->next = new_bhead->prev = NULL;
new_bhead->bhead = bhead;
readsize = fd->read(fd, new_bhead + 1, bhead.len);
@@ -667,7 +664,7 @@ static BHeadN *get_bhead(FileData *fd)
if (readsize != bhead.len) {
fd->eof = 1;
MEM_freeN(new_bhead);
- new_bhead = 0;
+ new_bhead = NULL;
}
} else {
fd->eof = 1;
@@ -689,13 +686,13 @@ static BHeadN *get_bhead(FileData *fd)
BHead *blo_firstbhead(FileData *fd)
{
BHeadN *new_bhead;
- BHead *bhead = 0;
+ BHead *bhead = NULL;
// Rewind the file
// Read in a new block if necessary
new_bhead = fd->listbase.first;
- if (new_bhead == 0) {
+ if (new_bhead == NULL) {
new_bhead = get_bhead(fd);
}
@@ -706,7 +703,7 @@ BHead *blo_firstbhead(FileData *fd)
return(bhead);
}
-BHead *blo_prevbhead(FileData *fd, BHead *thisblock)
+BHead *blo_prevbhead(FileData *UNUSED(fd), BHead *thisblock)
{
BHeadN *bheadn= (BHeadN *) (((char *) thisblock) - GET_INT_FROM_POINTER( &((BHeadN*)0)->bhead) );
BHeadN *prev= bheadn->prev;
@@ -726,7 +723,7 @@ BHead *blo_nextbhead(FileData *fd, BHead *thisblock)
// get the next BHeadN. If it doesn't exist we read in the next one
new_bhead = new_bhead->next;
- if (new_bhead == 0) {
+ if (new_bhead == NULL) {
new_bhead = get_bhead(fd);
}
}
@@ -833,8 +830,8 @@ static int fd_read_gzip_from_file(FileData *filedata, void *buffer, unsigned int
static int fd_read_from_memory(FileData *filedata, void *buffer, unsigned int size)
{
- // don't read more bytes then there are available in the buffer
- int readsize = MIN2(size, filedata->buffersize - filedata->seek);
+ // don't read more bytes then there are available in the buffer
+ int readsize = (int)MIN2(size, (unsigned int)(filedata->buffersize - filedata->seek));
memcpy(buffer, filedata->buffer + filedata->seek, readsize);
filedata->seek += readsize;
@@ -927,13 +924,13 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports)
if (fd->flags & FD_FLAGS_FILE_OK) {
if (!read_file_dna(fd)) {
- BKE_report(reports, RPT_ERROR, "File incomplete");
+ BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", incomplete", fd->relabase);
blo_freefiledata(fd);
fd= NULL;
}
}
else {
- BKE_report(reports, RPT_ERROR, "File is not a Blender file");
+ BKE_reportf(reports, RPT_ERROR, "Failed to read blend file: \"%s\", not a blend file", fd->relabase);
blo_freefiledata(fd);
fd= NULL;
}
@@ -943,13 +940,13 @@ static FileData *blo_decode_and_check(FileData *fd, ReportList *reports)
/* cannot be called with relative paths anymore! */
/* on each new library added, it now checks for the current FileData and expands relativeness */
-FileData *blo_openblenderfile(char *name, ReportList *reports)
+FileData *blo_openblenderfile(const char *name, ReportList *reports)
{
gzFile gzfile;
errno= 0;
gzfile= gzopen(name, "rb");
- if (gzfile == Z_NULL) {
+ if (gzfile == (gzFile)Z_NULL) {
BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", name, errno ? strerror(errno) : "Unknown erro reading file");
return NULL;
} else {
@@ -1012,7 +1009,7 @@ void blo_freefiledata(FileData *fd)
if (fd->buffer && !(fd->flags & FD_FLAGS_NOT_MY_BUFFER)) {
MEM_freeN(fd->buffer);
- fd->buffer = 0;
+ fd->buffer = NULL;
}
// Free all BHeadN data blocks
@@ -1044,7 +1041,7 @@ void blo_freefiledata(FileData *fd)
int BLO_has_bfile_extension(char *str)
{
- return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend")||BLI_testextensie(str, ".blend.gz"));
+ return (BLI_testextensie(str, ".ble") || BLI_testextensie(str, ".blend") || BLI_testextensie(str, ".blend.gz"));
}
int BLO_is_a_library(const char *path, char *dir, char *group)
@@ -1066,7 +1063,7 @@ int BLO_is_a_library(const char *path, char *dir, char *group)
/* Find the last slash */
fd= BLI_last_slash(dir);
- if(fd==0) return 0;
+ if(fd==NULL) return 0;
*fd= 0;
if(BLO_has_bfile_extension(fd+1)) {
/* the last part of the dir is a .blend file, no group follows */
@@ -1157,7 +1154,7 @@ static void change_idid_adr(ListBase *mainlist, FileData *basefd, void *old, voi
* to clear that pointer before reading the undo memfile since
* the object might be removed, it is set again in reading
* if the local object still exists */
-void blo_clear_proxy_pointers_from_lib(FileData *fd, Main *oldmain)
+void blo_clear_proxy_pointers_from_lib(Main *oldmain)
{
Object *ob= oldmain->object.first;
@@ -1270,7 +1267,7 @@ static void switch_endian_structs(struct SDNA *filesdna, BHead *bhead)
}
}
-static void *read_struct(FileData *fd, BHead *bh, char *blockname)
+static void *read_struct(FileData *fd, BHead *bh, const char *blockname)
{
void *temp= NULL;
@@ -1315,7 +1312,7 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */
Link *ln, *prev;
void *poin;
- if(lb->first==0) return;
+ if(lb->first==NULL) return;
poin= newdataadr(fd, lb->first);
if(lb->first) {
oldnewmap_insert(fd->globmap, lb->first, poin, 0);
@@ -1323,7 +1320,7 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */
lb->first= poin;
ln= lb->first;
- prev= 0;
+ prev= NULL;
while(ln) {
poin= newdataadr(fd, ln->next);
if(ln->next) {
@@ -1386,8 +1383,8 @@ static void test_pointer_array(FileData *fd, void **mat)
/* ************ READ ID Properties *************** */
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
+static void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
+static void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd);
static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData *fd)
{
@@ -1399,6 +1396,14 @@ static void IDP_DirectLinkIDPArray(IDProperty *prop, int switch_endian, FileData
prop->data.pointer = newdataadr(fd, prop->data.pointer);
array= (IDProperty*) prop->data.pointer;
+
+ /* note!, idp-arrays didn't exist in 2.4x, so the pointer will be cleared
+ * theres not really anything we can do to correct this, at least dont crash */
+ if(array==NULL) {
+ prop->len= 0;
+ prop->totallen= 0;
+ }
+
for(i=0; i<prop->len; i++)
IDP_DirectLinkProperty(&array[i], switch_endian, fd);
@@ -1436,7 +1441,7 @@ static void IDP_DirectLinkArray(IDProperty *prop, int switch_endian, FileData *f
}
}
-static void IDP_DirectLinkString(IDProperty *prop, int switch_endian, FileData *fd)
+static void IDP_DirectLinkString(IDProperty *prop, FileData *fd)
{
/*since we didn't save the extra string buffer, set totallen to len.*/
prop->totallen = prop->len;
@@ -1456,14 +1461,14 @@ static void IDP_DirectLinkGroup(IDProperty *prop, int switch_endian, FileData *f
}
}
-void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
+static void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
{
switch (prop->type) {
case IDP_GROUP:
IDP_DirectLinkGroup(prop, switch_endian, fd);
break;
case IDP_STRING:
- IDP_DirectLinkString(prop, switch_endian, fd);
+ IDP_DirectLinkString(prop, fd);
break;
case IDP_ARRAY:
IDP_DirectLinkArray(prop, switch_endian, fd);
@@ -1493,7 +1498,7 @@ void IDP_DirectLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
}
/*stub function*/
-void IDP_LibLinkProperty(IDProperty *prop, int switch_endian, FileData *fd)
+static void IDP_LibLinkProperty(IDProperty *UNUSED(prop), int UNUSED(switch_endian), FileData *UNUSED(fd))
{
}
@@ -1546,7 +1551,7 @@ static void direct_link_brush(FileData *fd, Brush *brush)
brush->icon_imbuf= NULL;
}
-static void direct_link_script(FileData *fd, Script *script)
+static void direct_link_script(FileData *UNUSED(fd), Script *script)
{
script->id.us = 1;
SCRIPT_SET_NULL(script)
@@ -1974,9 +1979,13 @@ static void direct_link_animdata(FileData *fd, AnimData *adt)
link_list(fd, &adt->nla_tracks);
direct_link_nladata(fd, &adt->nla_tracks);
- /* clear temp pointers that may have been set... */
- // TODO: it's probably only a small cost to reload this anyway...
- adt->actstrip= NULL;
+ /* relink active strip - even though strictly speaking this should only be used
+ * if we're in 'tweaking mode', we need to be able to have this loaded back for
+ * undo, but also since users may not exit tweakmode before saving (#24535)
+ */
+ // TODO: it's not really nice that anyone should be able to save the file in this
+ // state, but it's going to be too hard to enforce this single case...
+ adt->actstrip= newdataadr(fd, adt->actstrip);
}
/* ************ READ MOTION PATHS *************** */
@@ -2021,10 +2030,59 @@ static void lib_link_nodetree(FileData *fd, Main *main)
}
}
+/* updates group node socket own_index so that
+ * external links to/from the group node are preserved.
+ */
+static void lib_node_do_versions_group(bNode *gnode)
+{
+ bNodeTree *ngroup= (bNodeTree*)gnode->id;
+ bNode *intnode;
+ bNodeSocket *sock, *gsock, *intsock;
+ int found;
+
+ for (sock=gnode->outputs.first; sock; sock=sock->next) {
+ int old_index = sock->to_index;
+ for (gsock=ngroup->outputs.first; gsock; gsock=gsock->next) {
+ if (gsock->link && gsock->link->fromsock->own_index == old_index) {
+ sock->own_index = gsock->own_index;
+ break;
+ }
+ }
+ }
+ for (sock=gnode->inputs.first; sock; sock=sock->next) {
+ int old_index = sock->to_index;
+ /* can't use break in double loop */
+ found = 0;
+ for (intnode=ngroup->nodes.first; intnode && !found; intnode=intnode->next) {
+ for (intsock=intnode->inputs.first; intsock; intsock=intsock->next) {
+ if (intsock->own_index == old_index && intsock->link) {
+ sock->own_index = intsock->link->fromsock->own_index;
+ found = 1;
+ break;
+ }
+ }
+ }
+ }
+}
+
+/* updates external links for all group nodes in a tree */
+static void lib_nodetree_do_versions_group(bNodeTree *ntree)
+{
+ bNode *node;
+
+ for (node=ntree->nodes.first; node; node=node->next) {
+ if (node->type==NODE_GROUP) {
+ bNodeTree *ngroup= (bNodeTree*)node->id;
+ if (ngroup->flag & NTREE_DO_VERSIONS)
+ lib_node_do_versions_group(node);
+ }
+ }
+}
+
/* verify types for nodes and groups, all data has to be read */
/* open = 0: appending/linking, open = 1: open new file (need to clean out dynamic
* typedefs*/
-static void lib_verify_nodetree(Main *main, int open)
+static void lib_verify_nodetree(Main *main, int UNUSED(open))
{
Scene *sce;
Material *ma;
@@ -2039,10 +2097,43 @@ static void lib_verify_nodetree(Main *main, int open)
/* now create the own typeinfo structs an verify nodes */
/* here we still assume no groups in groups */
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
- ntreeVerifyTypes(ntree); /* internal nodes, no groups! */
- ntreeMakeOwnType(ntree); /* for group usage */
+ ntreeVerifyTypes(ntree); /* internal nodes, no groups! */
}
+ {
+ int has_old_groups=0;
+ /* XXX this should actually be part of do_versions, but since we need
+ * finished library linking, it is not possible there. Instead in do_versions
+ * we have set the NTREE_DO_VERSIONS flag, so at this point we can do the
+ * actual group node updates.
+ */
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
+ if (ntree->flag & NTREE_DO_VERSIONS) {
+ /* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */
+ nodeGroupExposeAllSockets(ntree);
+ has_old_groups = 1;
+ }
+ }
+ /* now verify all types in material trees, groups are set OK now */
+ for(ma= main->mat.first; ma; ma= ma->id.next) {
+ if(ma->nodetree)
+ lib_nodetree_do_versions_group(ma->nodetree);
+ }
+ /* and scene trees */
+ for(sce= main->scene.first; sce; sce= sce->id.next) {
+ if(sce->nodetree)
+ lib_nodetree_do_versions_group(sce->nodetree);
+ }
+ /* and texture trees */
+ for(tx= main->tex.first; tx; tx= tx->id.next) {
+ if(tx->nodetree)
+ lib_nodetree_do_versions_group(tx->nodetree);
+ }
+
+ for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+ ntree->flag &= ~NTREE_DO_VERSIONS;
+ }
+
/* now verify all types in material trees, groups are set OK now */
for(ma= main->mat.first; ma; ma= ma->id.next) {
if(ma->nodetree)
@@ -2071,7 +2162,6 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
bNodeLink *link;
ntree->init= 0; /* to set callbacks and force setting types */
- ntree->owntype= NULL;
ntree->progress= NULL;
ntree->adt= newdataadr(fd, ntree->adt);
@@ -2097,8 +2187,11 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
else if(ELEM3(node->type, CMP_NODE_IMAGE, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
((ImageUser *)node->storage)->ok= 1;
}
- else if( ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) ) {
- direct_link_curvemapping(fd, node->storage);
+ else if( ntree->type==NTREE_TEXTURE) {
+ if(node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME)
+ direct_link_curvemapping(fd, node->storage);
+ else if(node->type==TEX_NODE_IMAGE)
+ ((ImageUser *)node->storage)->ok= 1;
}
}
link_list(fd, &node->inputs);
@@ -2106,6 +2199,10 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
}
link_list(fd, &ntree->links);
+ /* external sockets */
+ link_list(fd, &ntree->inputs);
+ link_list(fd, &ntree->outputs);
+
/* and we connect the rest */
for(node= ntree->nodes.first; node; node= node->next) {
node->preview= newimaadr(fd, node->preview);
@@ -2115,13 +2212,16 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
for(sock= node->outputs.first; sock; sock= sock->next)
sock->ns.data= NULL;
}
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ sock->link= newdataadr(fd, sock->link);
+
for(link= ntree->links.first; link; link= link->next) {
link->fromnode= newdataadr(fd, link->fromnode);
link->tonode= newdataadr(fd, link->tonode);
link->fromsock= newdataadr(fd, link->fromsock);
link->tosock= newdataadr(fd, link->tosock);
}
-
+
/* type verification is in lib-link */
}
@@ -2133,7 +2233,7 @@ typedef struct tConstraintLinkData {
ID *id;
} tConstraintLinkData;
/* callback function used to relink constraint ID-links */
-static void lib_link_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void lib_link_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, void *userdata)
{
tConstraintLinkData *cld= (tConstraintLinkData *)userdata;
*idpoin = newlibadr(cld->fd, cld->id->lib, *idpoin);
@@ -2194,6 +2294,12 @@ static void direct_link_constraints(FileData *fd, ListBase *lb)
con->lin_error = 0.f;
con->rot_error = 0.f;
}
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ /* XXX version patch, in older code this flag wasn't always set, and is inherent to type */
+ if(con->ownspace == CONSTRAINT_SPACE_POSE)
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
break;
}
}
@@ -2208,13 +2314,21 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
if (!pose || !arm)
return;
+
/* always rebuild to match proxy or lib changes */
rebuild= ob->proxy || (ob->id.lib==NULL && arm->id.lib);
- if (ob->proxy && pose->proxy_act_bone[0]) {
- Bone *bone = get_named_bone(arm, pose->proxy_act_bone);
- if (bone)
- arm->act_bone = bone;
+ if(ob->proxy) {
+ /* sync proxy layer */
+ if(pose->proxy_layer)
+ arm->layer = pose->proxy_layer;
+
+ /* sync proxy active bone */
+ if(pose->proxy_act_bone[0]) {
+ Bone *bone = get_named_bone(arm, pose->proxy_act_bone);
+ if (bone)
+ arm->act_bone = bone;
+ }
}
for (pchan = pose->chanbase.first; pchan; pchan=pchan->next) {
@@ -2223,7 +2337,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
/* hurms... loop in a loop, but yah... later... (ton) */
pchan->bone= get_named_bone(arm, pchan->name);
- pchan->custom= newlibadr(fd, arm->id.lib, pchan->custom);
+ pchan->custom= newlibadr_us(fd, arm->id.lib, pchan->custom);
if(pchan->bone==NULL)
rebuild= 1;
else if(ob->id.lib==NULL && arm->id.lib) {
@@ -2234,7 +2348,7 @@ static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
}
if(rebuild) {
- ob->recalc= OB_RECALC_ALL;
+ ob->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
pose->flag |= POSE_RECALC;
}
}
@@ -2446,7 +2560,7 @@ static void direct_link_key(FileData *fd, Key *key)
while(kb) {
kb->data= newdataadr(fd, kb->data);
-
+
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN)
switch_endian_keyblock(key, kb);
@@ -2538,7 +2652,7 @@ static void direct_link_world(FileData *fd, World *wrld)
/* ************ READ VFONT ***************** */
-static void lib_link_vfont(FileData *fd, Main *main)
+static void lib_link_vfont(FileData *UNUSED(fd), Main *main)
{
VFont *vf;
@@ -2559,7 +2673,7 @@ static void direct_link_vfont(FileData *fd, VFont *vf)
/* ************ READ TEXT ****************** */
-static void lib_link_text(FileData *fd, Main *main)
+static void lib_link_text(FileData *UNUSED(fd), Main *main)
{
Text *text;
@@ -2739,9 +2853,9 @@ static void direct_link_curve(FileData *fd, Curve *cu)
cu->strinfo= newdataadr(fd, cu->strinfo);
cu->tb= newdataadr(fd, cu->tb);
- if(cu->vfont==0) link_list(fd, &(cu->nurb));
+ if(cu->vfont == NULL) link_list(fd, &(cu->nurb));
else {
- cu->nurb.first=cu->nurb.last= 0;
+ cu->nurb.first=cu->nurb.last= NULL;
tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "TextBoxread");
if (cu->tb) {
@@ -2770,7 +2884,7 @@ static void direct_link_curve(FileData *fd, Curve *cu)
nu->bp= newdataadr(fd, nu->bp);
nu->knotsu= newdataadr(fd, nu->knotsu);
nu->knotsv= newdataadr(fd, nu->knotsv);
- if (cu->vfont==0) nu->charidx= nu->mat_nr;
+ if (cu->vfont == NULL) nu->charidx= nu->mat_nr;
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
switch_endian_knots(nu);
@@ -2815,7 +2929,7 @@ static void direct_link_texture(FileData *fd, Tex *tex)
tex->plugin= newdataadr(fd, tex->plugin);
if(tex->plugin) {
- tex->plugin->handle= 0;
+ tex->plugin->handle= NULL;
open_plugin_tex(tex->plugin);
/* initialize data for this instance, if an initialization
* function exists.
@@ -2913,11 +3027,22 @@ static void direct_link_material(FileData *fd, Material *ma)
}
/* ************ READ PARTICLE SETTINGS ***************** */
-
+/* update this also to writefile.c */
+static const char *ptcache_data_struct[] = {
+ "", // BPHYS_DATA_INDEX
+ "", // BPHYS_DATA_LOCATION
+ "", // BPHYS_DATA_VELOCITY
+ "", // BPHYS_DATA_ROTATION
+ "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */
+ "", // BPHYS_DATA_SIZE:
+ "", // BPHYS_DATA_TIMES:
+ "BoidData" // case BPHYS_DATA_BOIDS:
+};
static void direct_link_pointcache(FileData *fd, PointCache *cache)
{
if((cache->flag & PTCACHE_DISK_CACHE)==0) {
PTCacheMem *pm;
+ PTCacheExtra *extra;
int i;
link_list(fd, &cache->mem_cache);
@@ -2925,13 +3050,23 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
pm = cache->mem_cache.first;
for(; pm; pm=pm->next) {
- if(pm->index_array)
- pm->index_array = newdataadr(fd, pm->index_array);
-
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pm->data[i] && pm->data_types & (1<<i))
- pm->data[i] = newdataadr(fd, pm->data[i]);
+ pm->data[i] = newdataadr(fd, pm->data[i]);
+
+ /* the cache saves non-struct data without DNA */
+ if(pm->data[i] && strcmp(ptcache_data_struct[i], "")==0 && (fd->flags & FD_FLAGS_SWITCH_ENDIAN)) {
+ int j, tot= (BKE_ptcache_data_size (i) * pm->totpoint)/4; /* data_size returns bytes */
+ int *poin= pm->data[i];
+
+ for(j= 0; j<tot; j++)
+ SWITCH_INT(poin[j]);
+ }
}
+
+ link_list(fd, &pm->extradata);
+
+ for(extra=pm->extradata.first; extra; extra=extra->next)
+ extra->data = newdataadr(fd, extra->data);
}
}
else
@@ -2941,16 +3076,21 @@ static void direct_link_pointcache(FileData *fd, PointCache *cache)
cache->simframe= 0;
cache->edit= NULL;
cache->free_edit= NULL;
+ cache->cached_frames= NULL;
}
-static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache)
+static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointCache **ocache, int force_disk)
{
- PointCache *cache;
-
if(ptcaches->first) {
+ PointCache *cache= NULL;
link_list(fd, ptcaches);
- for(cache=ptcaches->first; cache; cache=cache->next)
+ for(cache=ptcaches->first; cache; cache=cache->next) {
direct_link_pointcache(fd, cache);
+ if(force_disk) {
+ cache->flag |= PTCACHE_DISK_CACHE;
+ cache->step = 1;
+ }
+ }
*ocache = newdataadr(fd, *ocache);
}
@@ -2958,12 +3098,16 @@ static void direct_link_pointcache_list(FileData *fd, ListBase *ptcaches, PointC
/* old "single" caches need to be linked too */
*ocache = newdataadr(fd, *ocache);
direct_link_pointcache(fd, *ocache);
+ if(force_disk) {
+ (*ocache)->flag |= PTCACHE_DISK_CACHE;
+ (*ocache)->step = 1;
+ }
ptcaches->first = ptcaches->last = *ocache;
}
}
-void lib_link_partdeflect(FileData *fd, ID *id, PartDeflect *pd)
+static void lib_link_partdeflect(FileData *fd, ID *id, PartDeflect *pd)
{
if(pd && pd->tex)
pd->tex=newlibadr_us(fd, id->lib, pd->tex);
@@ -2973,6 +3117,8 @@ static void lib_link_particlesettings(FileData *fd, Main *main)
{
ParticleSettings *part;
ParticleDupliWeight *dw;
+ MTex *mtex;
+ int a;
part= main->particle.first;
while(part) {
@@ -3018,6 +3164,15 @@ static void lib_link_particlesettings(FileData *fd, Main *main)
}
}
}
+
+ for(a=0; a<MAX_MTEX; a++) {
+ mtex= part->mtex[a];
+ if(mtex) {
+ mtex->tex = newlibadr_us(fd, part->id.lib, mtex->tex);
+ mtex->object = newlibadr(fd, part->id.lib, mtex->object);
+ }
+ }
+
part->id.flag -= LIB_NEEDLINK;
}
part= part->id.next;
@@ -3031,6 +3186,7 @@ static void direct_link_partdeflect(PartDeflect *pd)
static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
{
+ int a;
part->adt= newdataadr(fd, part->adt);
part->pd= newdataadr(fd, part->pd);
part->pd2= newdataadr(fd, part->pd2);
@@ -3058,6 +3214,9 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
link_list(fd, &state->actions);
}
}
+ for(a=0; a<MAX_MTEX; a++) {
+ part->mtex[a]= newdataadr(fd, part->mtex[a]);
+ }
}
static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase *particles)
@@ -3125,11 +3284,12 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles)
for(a=1,pa++; a<psys->totpart; a++, pa++)
pa->boid = (pa-1)->boid + 1;
}
- else {
+ else if(psys->particles) {
for(a=0,pa=psys->particles; a<psys->totpart; a++, pa++)
pa->boid = NULL;
}
+ psys->fluid_springs = newdataadr(fd, psys->fluid_springs);
psys->child = newdataadr(fd,psys->child);
psys->effectors = NULL;
@@ -3144,14 +3304,16 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles)
psys->childcachebufs.first = psys->childcachebufs.last = NULL;
psys->frand = NULL;
psys->pdd = NULL;
+ psys->renderdata = NULL;
- direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache);
+ direct_link_pointcache_list(fd, &psys->ptcaches, &psys->pointcache, 0);
if(psys->clmd) {
psys->clmd = newdataadr(fd, psys->clmd);
psys->clmd->clothObject = NULL;
psys->clmd->sim_parms= newdataadr(fd, psys->clmd->sim_parms);
+ psys->clmd->sim_parms->effector_weights = NULL;
psys->clmd->coll_parms= newdataadr(fd, psys->clmd->coll_parms);
if(psys->clmd->sim_parms) {
@@ -3286,10 +3448,21 @@ static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps, int exte
for(i = 0; i < count; ++i) {
mdisps[i].disps = newdataadr(fd, mdisps[i].disps);
+
+ if( (fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps) ) {
+ /* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */
+ /* this does swap for data written at write_mdisps() - readfile.c */
+ int x;
+ float *tmpdisps= *mdisps[i].disps;
+ for(x=0;x<mdisps[i].totdisp*3;x++) {
+ SWITCH_INT(*tmpdisps);
+ tmpdisps++;
+ }
+ }
if(!external && !mdisps[i].disps)
mdisps[i].totdisp = 0;
}
- }
+ }
}
/*this isn't really a public api function, so prototyped here*/
@@ -3546,6 +3719,7 @@ static void lib_link_latt(FileData *fd, Main *main)
lt= main->latt.first;
while(lt) {
if(lt->id.flag & LIB_NEEDLINK) {
+ if(lt->adt) lib_link_animdata(fd, &lt->id, lt->adt);
lt->ipo= newlibadr_us(fd, lt->id.lib, lt->ipo); // XXX depreceated - old animation system
lt->key= newlibadr_us(fd, lt->id.lib, lt->key);
@@ -3564,6 +3738,9 @@ static void direct_link_latt(FileData *fd, Lattice *lt)
direct_link_dverts(fd, lt->pntsu*lt->pntsv*lt->pntsw, lt->dvert);
lt->editlatt= NULL;
+
+ lt->adt = newdataadr(fd, lt->adt);
+ direct_link_animdata(fd, lt->adt);
}
@@ -3626,14 +3803,14 @@ static void lib_link_object(FileData *fd, Main *main)
/* this triggers object_update to always use a copy */
ob->proxy->proxy_from= ob;
/* force proxy updates after load/undo, a bit weak */
- ob->recalc= ob->proxy->recalc= OB_RECALC_ALL;
+ ob->recalc= ob->proxy->recalc= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
ob->proxy_group= newlibadr(fd, ob->id.lib, ob->proxy_group);
poin= ob->data;
ob->data= newlibadr_us(fd, ob->id.lib, ob->data);
-
+
if(ob->data==NULL && poin!=NULL) {
if(ob->id.lib)
printf("Can't find obdata of %s lib %s\n", ob->id.name+2, ob->id.lib->name);
@@ -3651,6 +3828,17 @@ static void lib_link_object(FileData *fd, Main *main)
}
for(a=0; a<ob->totcol; a++) ob->mat[a]= newlibadr_us(fd, ob->id.lib, ob->mat[a]);
+ /* When the object is local and the data is library its possible
+ * the material list size gets out of sync. [#22663] */
+ if(ob->data && ob->id.lib != ((ID *)ob->data)->lib) {
+ short *totcol_data= give_totcolp(ob);
+ /* Only expand so as not to loose any object materials that might be set. */
+ if(totcol_data && *totcol_data > ob->totcol) {
+ /* printf("'%s' %d -> %d\n", ob->id.name, ob->totcol, *totcol_data); */
+ resize_object_material(ob, *totcol_data);
+ }
+ }
+
ob->gpd= newlibadr_us(fd, ob->id.lib, ob->gpd);
ob->duplilist= NULL;
@@ -3802,6 +3990,8 @@ static void lib_link_object(FileData *fd, Main *main)
smd->domain->fluid_group = newlibadr_us(fd, ob->id.lib, smd->domain->fluid_group);
smd->domain->effector_weights->group = newlibadr(fd, ob->id.lib, smd->domain->effector_weights->group);
+
+ smd->domain->flags |= MOD_SMOKE_FILE_LOAD; /* flag for refreshing the simulation after loading */
}
}
@@ -3863,6 +4053,9 @@ static void direct_link_pose(FileData *fd, bPose *pose)
pchan->iktree.first= pchan->iktree.last= NULL;
pchan->path= NULL;
+
+ /* incase this value changes in future, clamp else we get undefined behavior */
+ CLAMP(pchan->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);
}
pose->ikdata = NULL;
if (pose->ikparam != NULL) {
@@ -3887,7 +4080,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if (md->type==eModifierType_Subsurf) {
SubsurfModifierData *smd = (SubsurfModifierData*) md;
- smd->emCache = smd->mCache = 0;
+ smd->emCache = smd->mCache = NULL;
}
else if (md->type==eModifierType_Armature) {
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -3902,26 +4095,27 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
clmd->sim_parms= newdataadr(fd, clmd->sim_parms);
clmd->coll_parms= newdataadr(fd, clmd->coll_parms);
- direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache);
+ direct_link_pointcache_list(fd, &clmd->ptcaches, &clmd->point_cache, 0);
if(clmd->sim_parms) {
if(clmd->sim_parms->presets > 10)
clmd->sim_parms->presets = 0;
clmd->sim_parms->reset = 0;
- }
- clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights);
- if(!clmd->sim_parms->effector_weights)
- clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
-
+ clmd->sim_parms->effector_weights = newdataadr(fd, clmd->sim_parms->effector_weights);
+
+ if(!clmd->sim_parms->effector_weights) {
+ clmd->sim_parms->effector_weights = BKE_add_effector_weights(NULL);
+ }
+ }
}
else if (md->type==eModifierType_Fluidsim) {
FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;
fluidmd->fss= newdataadr(fd, fluidmd->fss);
fluidmd->fss->fmd= fluidmd;
- fluidmd->fss->meshSurfNormals = 0;
+ fluidmd->fss->meshSurfNormals = NULL;
}
else if (md->type==eModifierType_Smoke) {
SmokeModifierData *smd = (SmokeModifierData*) md;
@@ -3944,8 +4138,22 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
if(!smd->domain->effector_weights)
smd->domain->effector_weights = BKE_add_effector_weights(NULL);
- direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]));
- direct_link_pointcache_list(fd, &(smd->domain->ptcaches[1]), &(smd->domain->point_cache[1]));
+ direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]), 1);
+
+ /* Smoke uses only one cache from now on, so store pointer convert */
+ if(smd->domain->ptcaches[1].first || smd->domain->point_cache[1]) {
+ if(smd->domain->point_cache[1]) {
+ PointCache *cache = newdataadr(fd, smd->domain->point_cache[1]);
+ if(cache->flag & PTCACHE_FAKE_SMOKE)
+ ; /* Smoke was already saved in "new format" and this cache is a fake one. */
+ else
+ printf("High resolution smoke cache not available due to pointcache update. Please reset the simulation.\n");
+ BKE_ptcache_free(cache);
+ }
+ smd->domain->ptcaches[1].first = NULL;
+ smd->domain->ptcaches[1].last = NULL;
+ smd->domain->point_cache[1] = NULL;
+ }
}
else if(smd->type==MOD_SMOKE_TYPE_FLOW)
{
@@ -4018,13 +4226,14 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
} else if (md->type==eModifierType_ParticleSystem) {
ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md;
- psmd->dm=0;
- psmd->psys=newdataadr(fd, psmd->psys);
+ psmd->dm= NULL;
+ psmd->psys= newdataadr(fd, psmd->psys);
psmd->flag &= ~eParticleSystemFlag_psys_updated;
+ psmd->flag |= eParticleSystemFlag_file_loaded;
} else if (md->type==eModifierType_Explode) {
ExplodeModifierData *psmd = (ExplodeModifierData*) md;
- psmd->facepa=0;
+ psmd->facepa=NULL;
}
else if (md->type==eModifierType_MeshDeform) {
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -4179,7 +4388,7 @@ static void direct_link_object(FileData *fd, Object *ob)
if(!sb->effector_weights)
sb->effector_weights = BKE_add_effector_weights(NULL);
- direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache);
+ direct_link_pointcache_list(fd, &sb->ptcaches, &sb->pointcache, 0);
}
ob->bsoft= newdataadr(fd, ob->bsoft);
ob->fluidsimSettings= newdataadr(fd, ob->fluidsimSettings); /* NT */
@@ -4191,7 +4400,7 @@ static void direct_link_object(FileData *fd, Object *ob)
prop= ob->prop.first;
while(prop) {
prop->poin= newdataadr(fd, prop->poin);
- if(prop->poin==0) prop->poin= &prop->data;
+ if(prop->poin==NULL) prop->poin= &prop->data;
prop= prop->next;
}
@@ -4269,8 +4478,13 @@ static void direct_link_object(FileData *fd, Object *ob)
ob->gpulamp.first= ob->gpulamp.last= NULL;
link_list(fd, &ob->pc_ids);
- if(ob->sculpt)
+ /* incase this value changes in future, clamp else we get undefined behavior */
+ CLAMP(ob->rotmode, ROT_MODE_MIN, ROT_MODE_MAX);
+
+ if(ob->sculpt) {
ob->sculpt= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
+ ob->sculpt->ob= ob;
+ }
}
/* ************ READ SCENE ***************** */
@@ -4314,7 +4528,6 @@ static void lib_link_scene(FileData *fd, Main *main)
sce->camera= newlibadr(fd, sce->id.lib, sce->camera);
sce->world= newlibadr_us(fd, sce->id.lib, sce->world);
sce->set= newlibadr(fd, sce->id.lib, sce->set);
- sce->ima= newlibadr_us(fd, sce->id.lib, sce->ima);
sce->gpd= newlibadr_us(fd, sce->id.lib, sce->gpd);
link_paint(fd, sce, &sce->toolsettings->sculpt->paint);
@@ -4334,13 +4547,14 @@ static void lib_link_scene(FileData *fd, Main *main)
BKE_reportf(fd->reports, RPT_ERROR, "LIB ERROR: Object lost from scene:'%s\'\n", sce->id.name+2);
if(G.background==0) printf("LIB ERROR: base removed from scene:'%s\'\n", sce->id.name+2);
BLI_remlink(&sce->base, base);
- if(base==sce->basact) sce->basact= 0;
+ if(base==sce->basact) sce->basact= NULL;
MEM_freeN(base);
}
}
SEQ_BEGIN(sce->ed, seq) {
if(seq->ipo) seq->ipo= newlibadr_us(fd, sce->id.lib, seq->ipo);
+ seq->scene_sound = NULL;
if(seq->scene) {
seq->scene= newlibadr(fd, sce->id.lib, seq->scene);
seq->scene_sound = sound_scene_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
@@ -4357,7 +4571,7 @@ static void lib_link_scene(FileData *fd, Main *main)
seq->scene_sound = sound_add_scene_sound(sce, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
}
}
- seq->anim= 0;
+ seq->anim= NULL;
}
SEQ_END
@@ -4404,9 +4618,8 @@ static void link_recurs_seq(FileData *fd, ListBase *lb)
static void direct_link_paint(FileData *fd, Paint **paint)
{
- Paint *p;
/* TODO. is this needed */
- p= (*paint)= newdataadr(fd, (*paint));
+ (*paint)= newdataadr(fd, (*paint));
}
static void direct_link_scene(FileData *fd, Scene *sce)
@@ -4418,7 +4631,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->theDag = NULL;
sce->dagisvalid = 0;
sce->obedit= NULL;
- sce->stats= 0;
+ sce->stats= NULL;
sce->fps_info= NULL;
sound_create_scene(sce);
@@ -4461,7 +4674,7 @@ static void direct_link_scene(FileData *fd, Scene *sce)
seq->seq2= newdataadr(fd, seq->seq2);
seq->seq3= newdataadr(fd, seq->seq3);
/* a patch: after introduction of effects with 3 input strips */
- if(seq->seq3==0) seq->seq3= seq->seq2;
+ if(seq->seq3==NULL) seq->seq3= seq->seq2;
seq->plugin= newdataadr(fd, seq->plugin);
seq->effectdata= newdataadr(fd, seq->effectdata);
@@ -4485,32 +4698,32 @@ static void direct_link_scene(FileData *fd, Scene *sce)
seq->strip->stripdata = newdataadr(
fd, seq->strip->stripdata);
} else {
- seq->strip->stripdata = 0;
+ seq->strip->stripdata = NULL;
}
if (seq->flag & SEQ_USE_CROP) {
seq->strip->crop = newdataadr(
fd, seq->strip->crop);
} else {
- seq->strip->crop = 0;
+ seq->strip->crop = NULL;
}
if (seq->flag & SEQ_USE_TRANSFORM) {
seq->strip->transform = newdataadr(
fd, seq->strip->transform);
} else {
- seq->strip->transform = 0;
+ seq->strip->transform = NULL;
}
if (seq->flag & SEQ_USE_PROXY) {
seq->strip->proxy = newdataadr(
fd, seq->strip->proxy);
- seq->strip->proxy->anim = 0;
+ seq->strip->proxy->anim = NULL;
} else {
- seq->strip->proxy = 0;
+ seq->strip->proxy = NULL;
}
if (seq->flag & SEQ_USE_COLOR_BALANCE) {
seq->strip->color_balance = newdataadr(
fd, seq->strip->color_balance);
} else {
- seq->strip->color_balance = 0;
+ seq->strip->color_balance = NULL;
}
if (seq->strip->color_balance) {
// seq->strip->color_balance->gui = 0; // XXX - peter, is this relevant in 2.5?
@@ -4628,6 +4841,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
wm->drags.first= wm->drags.last= NULL;
wm->windrawable= NULL;
+ wm->winactive= NULL;
wm->initialized= 0;
wm->op_undo_depth= 0;
}
@@ -4813,6 +5027,7 @@ static void lib_link_screen(FileData *fd, Main *main)
SpaceText *st= (SpaceText *)sl;
st->text= newlibadr(fd, sc->id.lib, st->text);
+ st->drawcache= NULL;
}
else if(sl->spacetype==SPACE_SCRIPT) {
@@ -4991,10 +5206,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
else if(sl->spacetype==SPACE_FILE) {
SpaceFile *sfile= (SpaceFile *)sl;
- sfile->files= NULL;
- sfile->folders_prev= NULL;
- sfile->folders_next= NULL;
- sfile->params= NULL;
sfile->op= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
@@ -5357,7 +5568,11 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
for(cl= sconsole->history.first; cl; cl= cl_next) {
cl_next= cl->next;
cl->line= newdataadr(fd, cl->line);
- if (cl->line == NULL) {
+ if (cl->line) {
+ /* the allocted length is not written, so reset here */
+ cl->len_alloc= cl->len + 1;
+ }
+ else {
BLI_remlink(&sconsole->history, cl);
MEM_freeN(cl);
}
@@ -5397,14 +5612,14 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
if(newmain->curlib) {
if(strcmp(newmain->curlib->filepath, lib->filepath)==0) {
printf("Fixed error in file; multiple instances of lib:\n %s\n", lib->filepath);
-
+ BKE_reportf(fd->reports, RPT_WARNING, "Library '%s', '%s' had multiple instances, save and reload!", lib->name, lib->filepath);
+
change_idid_adr(&fd->mainlist, fd, lib, newmain->curlib);
// change_idid_adr_fd(fd, lib, newmain->curlib);
BLI_remlink(&main->library, lib);
MEM_freeN(lib);
-
- BKE_report(fd->reports, RPT_WARNING, "Library had multiple instances, save and reload!");
+
return;
}
@@ -5425,7 +5640,7 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
lib->parent= NULL;
}
-static void lib_link_library(FileData *fd, Main *main)
+static void lib_link_library(FileData *UNUSED(fd), Main *main)
{
Library *lib;
for(lib= main->library.first; lib; lib= lib->id.next) {
@@ -5521,7 +5736,7 @@ static void lib_link_group(FileData *fd, Main *main)
/* ************** GENERAL & MAIN ******************** */
-static char *dataname(short id_code)
+static const char *dataname(short id_code)
{
switch( id_code ) {
@@ -5556,7 +5771,7 @@ static char *dataname(short id_code)
}
-static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, char *allocname)
+static BHead *read_data_into_oldnewmap(FileData *fd, BHead *bhead, const char *allocname)
{
bhead = blo_nextbhead(fd, bhead);
@@ -5592,7 +5807,7 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
ID *id;
ListBase *lb;
- char *allocname;
+ const char *allocname;
/* read libblock */
id = read_struct(fd, bhead, "lib block");
@@ -5619,6 +5834,7 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
if(id->flag & LIB_FAKEUSER) id->us= 1;
else id->us= 0;
id->icon_id = 0;
+ id->flag &= ~LIB_ID_RECALC;
/* this case cannot be direct_linked: it's just the ID part */
if(bhead->code==ID_ID) {
@@ -5743,12 +5959,14 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead)
bfd->main->subversionfile= fg->subversion;
bfd->main->minversionfile= fg->minversion;
bfd->main->minsubversionfile= fg->minsubversion;
+ bfd->main->revision= fg->revision;
bfd->winpos= fg->winpos;
bfd->fileflags= fg->fileflags;
bfd->displaymode= fg->displaymode;
bfd->globalf= fg->globalf;
BLI_strncpy(bfd->filename, fg->filename, sizeof(bfd->filename));
+
if(G.fileflags & G_FILE_RECOVER)
BLI_strncpy(fd->relabase, fg->filename, sizeof(fd->relabase));
@@ -5817,6 +6035,23 @@ static int map_223_keybd_code_to_224_keybd_code(int code)
}
}
+static void do_version_bone_head_tail_237(Bone *bone)
+{
+ Bone *child;
+ float vec[3];
+
+ /* head */
+ copy_v3_v3(bone->arm_head, bone->arm_mat[3]);
+
+ /* tail is in current local coord system */
+ copy_v3_v3(vec, bone->arm_mat[1]);
+ mul_v3_fl(vec, bone->length);
+ add_v3_v3v3(bone->arm_tail, bone->arm_head, vec);
+
+ for(child= bone->childbase.first; child; child= child->next)
+ do_version_bone_head_tail_237(child);
+}
+
static void bone_version_238(ListBase *lb)
{
Bone *bone;
@@ -6256,7 +6491,7 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
case SPACE_NODE:
ar= MEM_callocN(sizeof(ARegion), "nodetree area for node");
BLI_addtail(lb, ar);
- ar->regiontype= RGN_TYPE_CHANNELS;
+ ar->regiontype= RGN_TYPE_UI;
ar->alignment= RGN_ALIGN_LEFT;
ar->v2d.scroll = (V2D_SCROLL_RIGHT|V2D_SCROLL_BOTTOM);
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -6409,6 +6644,8 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
}
case SPACE_ACTION:
{
+ SpaceAction *saction= (SpaceAction *)sl;
+
/* we totally reinit the view for the Action Editor, as some old instances had some weird cruft set */
ar->v2d.tot.xmin= -20.0f;
ar->v2d.tot.ymin= (float)(-sa->winy)/3.0f;
@@ -6418,10 +6655,10 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->v2d.cur= ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= FLT_MAX;
+ ar->v2d.max[1]= FLT_MAX;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
@@ -6430,6 +6667,13 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
+
+ /* for old files with ShapeKey editors open + an action set, clear the action as
+ * it doesn't make sense in the new system (i.e. violates concept that ShapeKey edit
+ * only shows ShapeKey-rooted actions only)
+ */
+ if (saction->mode == SACTCONT_SHAPEKEY)
+ saction->action = NULL;
break;
}
case SPACE_SEQ:
@@ -6505,6 +6749,9 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
sl->spacetype= SPACE_INFO; /* spacedata then matches */
}
+ /* it seems to be possible in 2.5 to have this saved, filewindow probably */
+ sa->butspacetype= sa->spacetype;
+
/* pushed back spaces also need regions! */
if(sa->spacedata.first) {
sl= sa->spacedata.first;
@@ -6517,7 +6764,7 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
}
}
-static void versions_gpencil_add_main(ListBase *lb, ID *id, char *name)
+static void versions_gpencil_add_main(ListBase *lb, ID *id, const char *name)
{
BLI_addtail(lb, id);
@@ -6619,7 +6866,6 @@ static void do_version_mtex_factor_2_50(MTex **mtex_array, short idtype)
mtex->lifefac= (neg & MAP_PA_LIFE)? -varfac: varfac;
mtex->sizefac= (neg & MAP_PA_SIZE)? -varfac: varfac;
mtex->ivelfac= (neg & MAP_PA_IVEL)? -varfac: varfac;
- mtex->pvelfac= (neg & MAP_PA_PVEL)? -varfac: varfac;
mtex->shadowfac= (neg & LAMAP_SHAD)? -colfac: colfac;
@@ -6637,7 +6883,7 @@ static void do_version_mtex_factor_2_50(MTex **mtex_array, short idtype)
}
}
-static void do_version_mdef_250(FileData *fd, Library *lib, Main *main)
+static void do_version_mdef_250(Main *main)
{
Object *ob;
ModifierData *md;
@@ -6668,23 +6914,23 @@ static void do_version_constraints_radians_degrees_250(ListBase *lb)
for (con=lb->first; con; con=con->next) {
if(con->type==CONSTRAINT_TYPE_RIGIDBODYJOINT) {
bRigidBodyJointConstraint *data = con->data;
- data->axX *= M_PI/180.0;
- data->axY *= M_PI/180.0;
- data->axZ *= M_PI/180.0;
+ data->axX *= (float)(M_PI/180.0);
+ data->axY *= (float)(M_PI/180.0);
+ data->axZ *= (float)(M_PI/180.0);
}
else if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data = con->data;
- data->poleangle *= M_PI/180.0;
+ data->poleangle *= (float)(M_PI/180.0);
}
else if(con->type==CONSTRAINT_TYPE_ROTLIMIT) {
bRotLimitConstraint *data = con->data;
- data->xmin *= M_PI/180.0;
- data->xmax *= M_PI/180.0;
- data->ymin *= M_PI/180.0;
- data->ymax *= M_PI/180.0;
- data->zmin *= M_PI/180.0;
- data->zmax *= M_PI/180.0;
+ data->xmin *= (float)(M_PI/180.0);
+ data->xmax *= (float)(M_PI/180.0);
+ data->ymin *= (float)(M_PI/180.0);
+ data->ymax *= (float)(M_PI/180.0);
+ data->zmin *= (float)(M_PI/180.0);
+ data->zmax *= (float)(M_PI/180.0);
}
}
}
@@ -6723,12 +6969,25 @@ static void do_versions_seq_unique_name_all_strips(
}
}
+
+static void do_version_bone_roll_256(Bone *bone)
+{
+ Bone *child;
+ float submat[3][3];
+
+ copy_m3_m4(submat, bone->arm_mat);
+ mat3_to_vec_roll(submat, 0, &bone->arm_roll);
+
+ for(child = bone->childbase.first; child; child = child->next)
+ do_version_bone_roll_256(child);
+}
+
static void do_versions(FileData *fd, Library *lib, Main *main)
{
/* WATCH IT!!!: pointers from libdata have not been converted */
if(G.f & G_DEBUG)
- printf("read file %s\n Version %d sub %d\n", fd->relabase, main->versionfile, main->subversionfile);
+ printf("read file %s\n Version %d sub %d svn r%d\n", fd->relabase, main->versionfile, main->subversionfile, main->revision);
if(main->versionfile == 100) {
/* tex->extend and tex->imageflag have changed: */
@@ -7421,8 +7680,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob;
for (vf= main->vfont.first; vf; vf= vf->id.next) {
- if (BLI_streq(vf->name+strlen(vf->name)-6, ".Bfont")) {
- strcpy(vf->name, "<builtin>");
+ if (strcmp(vf->name+strlen(vf->name)-6, ".Bfont")==0) {
+ strcpy(vf->name, FO_BUILTIN_NAME);
}
}
@@ -8032,10 +8291,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
bArmature *arm;
bConstraint *con;
Object *ob;
+ Bone *bone;
// armature recode checks
for(arm= main->armature.first; arm; arm= arm->id.next) {
where_is_armature(arm);
+
+ for(bone= arm->bonebase.first; bone; bone= bone->next)
+ do_version_bone_head_tail_237(bone);
}
for(ob= main->object.first; ob; ob= ob->id.next) {
if(ob->parent) {
@@ -8048,7 +8311,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(ob->type==OB_ARMATURE) {
if(ob->pose)
ob->pose->flag |= POSE_RECALC;
- ob->recalc |= OB_RECALC_ALL; // cannot call stuff now (pointers!), done in setup_app_data
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // cannot call stuff now (pointers!), done in setup_app_data
/* new generic xray option */
arm= newlibadr(fd, lib, ob->data);
@@ -8319,7 +8582,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(arm->layer==0) arm->layer= 1;
}
for(sce= main->scene.first; sce; sce= sce->id.next) {
- if(sce->jumpframe==0) sce->jumpframe= 10;
if(sce->audio.mixrate==0) sce->audio.mixrate= 44100;
if(sce->r.xparts<2) sce->r.xparts= 4;
@@ -8352,7 +8614,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
if(sce->r.mode & R_PANORAMA) {
- /* all these checks to ensure saved files with cvs version keep working... */
+ /* all these checks to ensure saved files with svn version keep working... */
if(sce->r.xsch < sce->r.ysch) {
Object *obc= newlibadr(fd, lib, sce->camera);
if(obc && obc->type==OB_CAMERA) {
@@ -8617,7 +8879,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ima->flag |= IMA_STD_FIELD;
}
tex->iuser.frames= tex->frames;
- tex->iuser.fie_ima= tex->fie_ima;
+ tex->iuser.fie_ima= (char)tex->fie_ima;
tex->iuser.offset= tex->offset;
tex->iuser.sfra= tex->sfra;
tex->iuser.cycl= (tex->imaflag & TEX_ANIMCYCLIC_)!=0;
@@ -8940,9 +9202,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->soft->pointcache= BKE_ptcache_add(&ob->soft->ptcaches);
for(psys=ob->particlesystem.first; psys; psys=psys->next) {
- //if(psys->soft && !psys->soft->pointcache)
- // psys->soft->pointcache= BKE_ptcache_add(&psys->soft->ptcaches);
- if(!psys->pointcache)
+ if(psys->pointcache) {
+ if(psys->pointcache->flag & PTCACHE_BAKED && (psys->pointcache->flag & PTCACHE_DISK_CACHE)==0) {
+ printf("Old memory cache isn't supported for particles, so re-bake the simulation!\n");
+ psys->pointcache->flag &= ~PTCACHE_BAKED;
+ }
+ }
+ else
psys->pointcache= BKE_ptcache_add(&psys->ptcaches);
}
@@ -9600,7 +9866,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(act= ob->actuators.first; act; act= act->next) {
if (act->type == ACT_MESSAGE) {
bMessageActuator *msgAct = (bMessageActuator *) act->data;
- if (strlen(msgAct->toPropName) > 2) {
+ if (BLI_strnlen(msgAct->toPropName, 3) > 2) {
/* strip first 2 chars, would have only worked if these were OB anyway */
memmove( msgAct->toPropName, msgAct->toPropName+2, sizeof(msgAct->toPropName)-2 );
} else {
@@ -9709,7 +9975,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* Adjustments needed after Bullets update */
for(ob = main->object.first; ob; ob= ob->id.next) {
ob->damping *= 0.635f;
- ob->rdamping = 0.1 + (0.8f * ob->rdamping);
+ ob->rdamping = 0.1f + (0.8f * ob->rdamping);
}
}
@@ -9789,8 +10055,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
seq->strip->proxy->size
= sce->r.size;
} else {
- seq->strip->proxy->size
- = 25.0;
+ seq->strip->proxy->size = 25;
}
seq->strip->proxy->quality =90;
}
@@ -9870,8 +10135,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(seq->type == SEQ_HD_SOUND)
{
char str[FILE_MAX];
- BLI_join_dirfile(str, seq->strip->dir, seq->strip->stripdata->name);
- BLI_path_abs(str, G.sce);
+ BLI_join_dirfile(str, sizeof(str), seq->strip->dir, seq->strip->stripdata->name);
+ BLI_path_abs(str, G.main->name);
seq->sound = sound_new_file(main, str);
}
/* don't know, if anybody used that
@@ -10057,12 +10322,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a]) {
tex= ma->mtex[a]->tex;
- if(!tex)
- ma->mtex[a]->texflag |= MTEX_NEW_BUMP;
- else {
+ if(!tex) {
+ ma->mtex[a]->texflag |= MTEX_3TAP_BUMP;
+ ma->mtex[a]->texflag |= MTEX_BUMP_OBJECTSPACE;
+ } else {
tex= (Tex*)newlibadr(fd, ma->id.lib, tex);
- if(tex && tex->type == 0) /* invalid type */
- ma->mtex[a]->texflag |= MTEX_NEW_BUMP;
+ if(tex && tex->type == 0) { /* invalid type */
+ ma->mtex[a]->texflag |= MTEX_3TAP_BUMP;
+ ma->mtex[a]->texflag |= MTEX_BUMP_OBJECTSPACE;
+ }
}
}
}
@@ -10240,14 +10508,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(sce= main->scene.first; sce; sce= sce->id.next)
{
- if(sce->audio.main == 0.0)
- sce->audio.main = 1.0;
+ if(sce->audio.main == 0.0f)
+ sce->audio.main = 1.0f;
sce->r.ffcodecdata.audio_mixrate = sce->audio.mixrate;
sce->r.ffcodecdata.audio_volume = sce->audio.main;
- sce->audio.distance_model = 2.0;
- sce->audio.doppler_factor = 1.0;
- sce->audio.speed_of_sound = 343.3;
+ sce->audio.distance_model = 2;
+ sce->audio.doppler_factor = 1.0f;
+ sce->audio.speed_of_sound = 343.3f;
}
/* Add default gravity to scenes */
@@ -10273,11 +10541,11 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(md= ob->modifiers.first; md; md= md->next) {
ClothModifierData *clmd = (ClothModifierData *)modifiers_findByType(ob, eModifierType_Cloth);
if(clmd)
- clmd->sim_parms->effector_weights->global_gravity = clmd->sim_parms->gravity[2]/-9.81;
+ clmd->sim_parms->effector_weights->global_gravity = clmd->sim_parms->gravity[2]/-9.81f;
}
if(ob->soft)
- ob->soft->effector_weights->global_gravity = ob->soft->grav/9.81;
+ ob->soft->effector_weights->global_gravity = ob->soft->grav/9.81f;
}
/* Normal wind shape is plane */
@@ -10289,6 +10557,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->pd->shape = PFIELD_SHAPE_PLANE;
else if(ob->pd->flag & PFIELD_SURFACE)
ob->pd->shape = PFIELD_SHAPE_SURFACE;
+
+ ob->pd->flag |= PFIELD_DO_LOCATION;
}
}
}
@@ -10500,31 +10770,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
- /* clear hanging 'temp' screens from older 2.5 files*/
- if (main->versionfile == 250) {
- bScreen *screen, *nextscreen;
- wmWindowManager *wm;
- wmWindow *win, *nextwin;
-
- for(screen= main->screen.first; screen; screen= nextscreen) {
- nextscreen= screen->id.next;
-
- if (screen->full == SCREENTEMP) {
- /* remove corresponding windows */
- for(wm= main->wm.first; wm; wm=wm->id.next) {
- for(win= wm->windows.first; win; win=nextwin) {
- nextwin= win->next;
-
- if(newlibadr(fd, wm->id.lib, win->screen) == screen)
- BLI_freelinkN(&wm->windows, win);
- }
- }
-
- /* remove screen itself */
- free_libblock(&main->screen, screen);
- }
- }
- }
}
if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 9))
@@ -10662,7 +10907,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* game engine changes */
for(sce = main->scene.first; sce; sce = sce->id.next) {
- sce->gm.eyeseparation = 0.10;
+ sce->gm.eyeseparation = 0.10f;
}
/* anim viz changes */
@@ -10767,12 +11012,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (ob->pose) {
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- pchan->limitmin[0] *= M_PI/180.0;
- pchan->limitmin[1] *= M_PI/180.0;
- pchan->limitmin[2] *= M_PI/180.0;
- pchan->limitmax[0] *= M_PI/180.0;
- pchan->limitmax[1] *= M_PI/180.0;
- pchan->limitmax[2] *= M_PI/180.0;
+ pchan->limitmin[0] *= (float)(M_PI/180.0);
+ pchan->limitmin[1] *= (float)(M_PI/180.0);
+ pchan->limitmin[2] *= (float)(M_PI/180.0);
+ pchan->limitmax[0] *= (float)(M_PI/180.0);
+ pchan->limitmax[1] *= (float)(M_PI/180.0);
+ pchan->limitmax[2] *= (float)(M_PI/180.0);
do_version_constraints_radians_degrees_250(&pchan->constraints);
}
@@ -10865,6 +11110,15 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
SEQ_END
}
+ /* particle brush strength factor was changed from int to float */
+ for(sce= main->scene.first; sce; sce=sce->id.next) {
+ ParticleEditSettings *pset= &sce->toolsettings->particle;
+ int a;
+
+ for(a=0; a<PE_TOT_BRUSH; a++)
+ pset->brush[a].strength /= 100.0f;
+ }
+
for(ma = main->mat.first; ma; ma=ma->id.next)
if(ma->mode & MA_TRACEBLE)
ma->shade_flag |= MA_APPROX_OCCLUSION;
@@ -11054,7 +11308,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- do_version_mdef_250(fd, lib, main);
+ do_version_mdef_250(main);
/* parent type to modifier */
for(ob = main->object.first; ob; ob = ob->id.next) {
@@ -11143,7 +11397,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
// bad radius
if (brush->unprojected_radius == 0)
- brush->unprojected_radius = 0.125;
+ brush->unprojected_radius = 0.125f;
// unusable size
if (brush->size == 0)
@@ -11185,18 +11439,18 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
brush->add_col[1] == 0 &&
brush->add_col[2] == 0)
{
- brush->add_col[0] = 1.00;
- brush->add_col[1] = 0.39;
- brush->add_col[2] = 0.39;
+ brush->add_col[0] = 1.00f;
+ brush->add_col[1] = 0.39f;
+ brush->add_col[2] = 0.39f;
}
if (brush->sub_col[0] == 0 &&
brush->sub_col[1] == 0 &&
brush->sub_col[2] == 0)
{
- brush->sub_col[0] = 0.39;
- brush->sub_col[1] = 0.39;
- brush->sub_col[2] = 1.00;
+ brush->sub_col[0] = 0.39f;
+ brush->sub_col[1] = 0.39f;
+ brush->sub_col[2] = 1.00f;
}
}
}
@@ -11267,16 +11521,159 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- /* put compatibility code here until next subversion bump */
- {
+ if (main->versionfile < 255 || (main->versionfile == 255 && main->subversionfile < 1)) {
Brush *br;
+ ParticleSettings *part;
+ bScreen *sc;
+ Object *ob;
+
for(br= main->brush.first; br; br= br->id.next) {
if(br->ob_mode==0)
- br->ob_mode= (OB_MODE_SCULPT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_VERTEX_PAINT);
+ br->ob_mode= OB_MODE_ALL_PAINT;
+ }
+
+ for(part = main->particle.first; part; part = part->id.next) {
+ if(part->boids)
+ part->boids->pitch = 1.0f;
+
+ part->flag &= ~PART_HAIR_REGROW; /* this was a deprecated flag before */
+ part->kink_amp_clump = 1.f; /* keep old files looking similar */
+ }
+
+ for (sc= main->screen.first; sc; sc= sc->id.next) {
+ ScrArea *sa;
+ for (sa= sc->areabase.first; sa; sa= sa->next) {
+ SpaceLink *sl;
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if (sl->spacetype == SPACE_INFO) {
+ SpaceInfo *sinfo= (SpaceInfo *)sl;
+ ARegion *ar;
+
+ sinfo->rpt_mask= INFO_RPT_OP;
+
+ for (ar= sa->regionbase.first; ar; ar= ar->next) {
+ if (ar->regiontype == RGN_TYPE_WINDOW) {
+ ar->v2d.scroll = (V2D_SCROLL_RIGHT);
+ ar->v2d.align = V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
+ ar->v2d.keepofs = V2D_LOCKOFS_X;
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
+ ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS;
+ ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* fix rotation actuators for objects so they use real angles (radians)
+ * since before blender went opensource this strange scalar was used: (1 / 0.02) * 2 * math.pi/360 */
+ for(ob= main->object.first; ob; ob= ob->id.next) {
+ bActuator *act= ob->actuators.first;
+ while(act) {
+ if (act->type==ACT_OBJECT) {
+ /* multiply velocity with 50 in old files */
+ bObjectActuator *oa= act->data;
+ mul_v3_fl(oa->drot, 0.8726646259971648f);
+ }
+ act= act->next;
+ }
+ }
+ }
+
+ if (main->versionfile < 256) {
+ bScreen *sc;
+ ScrArea *sa;
+ Key *key;
+
+ /* Fix for sample line scope initializing with no height */
+ for(sc= main->screen.first; sc; sc= sc->id.next) {
+ sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl;
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_IMAGE) {
+ SpaceImage *sima= (SpaceImage *)sl;
+ if (sima->sample_line_hist.height == 0 )
+ sima->sample_line_hist.height = 100;
+ }
+ }
+ sa= sa->next;
+ }
+ }
+
+ /* old files could have been saved with slidermin = slidermax = 0.0, but the UI in
+ * 2.4x would never reveal this to users as a dummy value always ended up getting used
+ * instead
+ */
+ for (key = main->key.first; key; key = key->id.next) {
+ KeyBlock *kb;
+
+ for (kb = key->block.first; kb; kb = kb->next) {
+ if (IS_EQ(kb->slidermin, kb->slidermax) && IS_EQ(kb->slidermax, 0))
+ kb->slidermax = kb->slidermin + 1.0f;
+ }
+ }
+ }
+
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 1)) {
+ /* fix for bones that didn't have arm_roll before */
+ bArmature* arm;
+ Bone* bone;
+ Object *ob;
+
+ for (arm = main->armature.first; arm; arm = arm->id.next)
+ for (bone = arm->bonebase.first; bone; bone = bone->next)
+ do_version_bone_roll_256(bone);
+
+ /* fix for objects which have zero dquat's
+ * since this is multiplied with the quat rather then added */
+ for(ob= main->object.first; ob; ob= ob->id.next) {
+ if(is_zero_v4(ob->dquat)) {
+ unit_qt(ob->dquat);
+ }
+ if(is_zero_v3(ob->drotAxis) && ob->drotAngle == 0.0f) {
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+ }
}
+ }
+
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 2)) {
+ bNodeTree *ntree;
+ /* node sockets are not exposed automatically any more,
+ * this mimics the old behaviour by adding all unlinked sockets to groups.
+ */
+ for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+ /* XXX Only setting a flag here. Actual adding of group sockets
+ * is done in lib_verify_nodetree, because at this point the internal
+ * nodes may not be up-to-date! (missing lib-link)
+ */
+ ntree->flag |= NTREE_DO_VERSIONS;
+ }
}
+ /* put compatibility code here until next subversion bump */
+
+ {
+ bScreen *sc;
+ Brush *brush;
+
+ /* redraws flag in SpaceTime has been moved to Screen level */
+ for (sc = main->screen.first; sc; sc= sc->id.next) {
+ if (sc->redraws_flag == 0) {
+ /* just initialise to default? */
+ // XXX: we could also have iterated through areas, and taken them from the first timeline available...
+ sc->redraws_flag = TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
+ }
+ }
+
+ for (brush= main->brush.first; brush; brush= brush->id.next) {
+ if(brush->height == 0)
+ brush->height= 0.4;
+ }
+ }
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
@@ -11439,7 +11836,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filename)
lib_link_all(fd, bfd->main);
//do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010)
- lib_verify_nodetree(bfd->main, 1);
+ lib_verify_nodetree(bfd->main, TRUE);
fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */
link_global(fd, bfd); /* as last */
@@ -11571,7 +11968,11 @@ static void expand_doit(FileData *fd, Main *mainvar, void *old)
* lib_indirect.blend but lib.blend does too, linking in a Scene or Group from lib.blend can result in an
* empty without the dupli group referenced. Once you save and reload the group would appier. - Campbell */
/* This crashes files, must look further into it */
- /*oldnewmap_insert(fd->libmap, bhead->old, id, 1);*/
+
+ /* Update: the issue is that in file reading, the oldnewmap is OK, but for existing data, it has to be
+ inserted in the map to be found! */
+ if(id->flag & LIB_PRE_EXISTING)
+ oldnewmap_insert(fd->libmap, bhead->old, id, 1);
change_idid_adr_fd(fd, bhead->old, id);
// commented because this can print way too much
@@ -11827,6 +12228,9 @@ static void expand_lattice(FileData *fd, Main *mainvar, Lattice *lt)
{
expand_doit(fd, mainvar, lt->ipo); // XXX depreceated - old animation system
expand_doit(fd, mainvar, lt->key);
+
+ if (lt->adt)
+ expand_animdata(fd, mainvar, lt->adt);
}
@@ -11924,7 +12328,7 @@ typedef struct tConstraintExpandData {
Main *mainvar;
} tConstraintExpandData;
/* callback function used to expand constraint ID-links */
-static void expand_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+static void expand_constraint_cb(bConstraint *UNUSED(con), ID **idpoin, void *userdata)
{
tConstraintExpandData *ced= (tConstraintExpandData *)userdata;
expand_doit(ced->fd, ced->mainvar, *idpoin);
@@ -12402,7 +12806,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene)
base= scene_add_base(scene, ob);
base->flag |= SELECT;
base->object->flag= base->flag;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
scene->basact= base;
/* assign the group */
@@ -12414,7 +12818,7 @@ static void give_base_to_groups(Main *mainvar, Scene *scene)
}
}
-static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char *name, int idcode, short flag)
+static void append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
{
Scene *scene= CTX_data_scene(C);
Object *ob;
@@ -12480,7 +12884,7 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, char
}
}
-void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, char *name, int idcode, short flag)
+void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
{
FileData *fd= (FileData*)(*bh);
append_named_part(C, mainl, fd, name, idcode, flag);
@@ -12517,7 +12921,7 @@ static Main* library_append_begin(const bContext *C, FileData **fd, char *dir)
blo_split_main(&(*fd)->mainlist, mainvar);
/* which one do we need? */
- mainl = blo_find_main(*fd, &(*fd)->mainlist, dir, G.sce);
+ mainl = blo_find_main(*fd, &(*fd)->mainlist, dir, G.main->name);
/* needed for do_version */
mainl->versionfile= (*fd)->fileversion;
@@ -12582,31 +12986,35 @@ static void append_do_cursor(Scene *scene, Library *curlib, short flag)
static void library_append_end(const bContext *C, Main *mainl, FileData **fd, int idcode, short flag)
{
- Main *mainvar= CTX_data_main(C);
+ Main *mainvar;
Scene *scene= CTX_data_scene(C);
+ Library *curlib;
/* make main consistent */
expand_main(*fd, mainl);
/* do this when expand found other libs */
read_libraries(*fd, &(*fd)->mainlist);
+
+ curlib= mainl->curlib;
/* make the lib path relative if required */
if(flag & FILE_RELPATH) {
/* use the full path, this could have been read by other library even */
- BLI_strncpy(mainl->curlib->name, mainl->curlib->filepath, sizeof(mainl->curlib->name));
+ BLI_strncpy(curlib->name, curlib->filepath, sizeof(curlib->name));
/* uses current .blend file as reference */
- BLI_path_rel(mainl->curlib->name, G.sce);
+ BLI_path_rel(curlib->name, G.main->name);
}
blo_join_main(&(*fd)->mainlist);
mainvar= (*fd)->mainlist.first;
+ mainl= NULL; /* blo_join_main free's mainl, cant use anymore */
lib_link_all(*fd, mainvar);
- lib_verify_nodetree(mainvar, 0);
- fix_relpaths_library(G.sce, mainvar); /* make all relative paths, relative to the open blend file */
+ lib_verify_nodetree(mainvar, FALSE);
+ fix_relpaths_library(G.main->name, mainvar); /* make all relative paths, relative to the open blend file */
/* give a base to loose objects. If group append, do it for objects too */
if(scene) {
@@ -12617,7 +13025,7 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in
if (flag & FILE_LINK) {
give_base_to_objects(mainvar, scene, NULL, 0);
} else {
- give_base_to_objects(mainvar, scene, mainl->curlib, 1);
+ give_base_to_objects(mainvar, scene, curlib, 1);
}
if (flag & FILE_GROUP_INSTANCE) {
@@ -12637,7 +13045,7 @@ static void library_append_end(const bContext *C, Main *mainl, FileData **fd, in
*fd = NULL;
}
- append_do_cursor(scene, mainl->curlib, flag);
+ append_do_cursor(scene, curlib, flag);
}
void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag)
@@ -12654,7 +13062,7 @@ void BLO_library_append_end(const bContext *C, struct Main *mainl, BlendHandle**
/* tentatively removed, Python should be able to use the split functions too: */
/* BLO_library_append_begin, BLO_library_append_end, BLO_library_append_named_part */
#if 0
-void BLO_script_library_append(BlendHandle **bh, char *dir, char *name,
+void BLO_script_library_append(BlendHandle **bh, char *dir, const char *name,
int idcode, short flag, Main *mainvar, Scene *scene, ReportList *reports)
{
FileData *fd= (FileData*)(*bh);
@@ -12681,7 +13089,7 @@ static int mainvar_count_libread_blocks(Main *mainvar)
a= set_listbasepointers(mainvar, lbarray);
while(a--) {
- ID *id= lbarray[a]->first;
+ ID *id;
for (id= lbarray[a]->first; id; id= id->next)
if (id->flag & LIB_READ)
@@ -12722,7 +13130,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
while(fd==NULL) {
char newlib_path[240] = { 0 };
printf("Missing library...'\n");
- printf(" current file: %s\n", G.sce);
+ printf(" current file: %s\n", G.main->name);
printf(" absolute lib: %s\n", mainptr->curlib->filepath);
printf(" relative lib: %s\n", mainptr->curlib->name);
printf(" enter a new path:\n");
@@ -12730,7 +13138,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
if(scanf("%s", newlib_path) > 0) {
strcpy(mainptr->curlib->name, newlib_path);
strcpy(mainptr->curlib->filepath, newlib_path);
- cleanup_path(G.sce, mainptr->curlib->filepath);
+ cleanup_path(G.main->name, mainptr->curlib->filepath);
fd= blo_openblenderfile(mainptr->curlib->filepath, basefd->reports);
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index 8e391fa438e..c6526f2c7af 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -110,11 +110,11 @@ void blo_split_main(ListBase *mainlist, struct Main *main);
BlendFileData *blo_read_file_internal(FileData *fd, const char *filename);
-FileData *blo_openblenderfile(char *name, struct ReportList *reports);
+FileData *blo_openblenderfile(const char *name, struct ReportList *reports);
FileData *blo_openblendermemory(void *buffer, int buffersize, struct ReportList *reports);
FileData *blo_openblendermemfile(struct MemFile *memfile, struct ReportList *reports);
-void blo_clear_proxy_pointers_from_lib(FileData *fd, Main *oldmain);
+void blo_clear_proxy_pointers_from_lib(Main *oldmain);
void blo_make_image_pointer_map(FileData *fd, Main *oldmain);
void blo_end_image_pointer_map(FileData *fd, Main *oldmain);
void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd);
diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c
index 9cdf8613011..7306db08430 100644
--- a/source/blender/blenloader/intern/undofile.c
+++ b/source/blender/blenloader/intern/undofile.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index cd5e31cc1d4..2f8feb9b9da 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -129,6 +129,7 @@ Any case: direct data is ALWAYS after the lib block
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_blender.h"
@@ -140,9 +141,10 @@ Any case: direct data is ALWAYS after the lib block
#include "BKE_node.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h" // for defines
+#include "BKE_utildefines.h"
#include "BKE_modifier.h"
#include "BKE_fcurve.h"
+#include "BKE_pointcache.h"
#include "BLO_writefile.h"
#include "BLO_readfile.h"
@@ -212,8 +214,6 @@ static void writedata_free(WriteData *wd)
/***/
-int mywfile;
-
/**
* Low level WRITE(2) wrapper that buffers data
* @param adr Pointer to new chunk of data
@@ -273,7 +273,7 @@ static void mywrite( WriteData *wd, void *adr, int len)
* @param write_flags Write parameters
* @warning Talks to other functions with global parameters
*/
-static WriteData *bgnwrite(int file, MemFile *compare, MemFile *current, int write_flags)
+static WriteData *bgnwrite(int file, MemFile *compare, MemFile *current)
{
WriteData *wd= writedata_new(file);
@@ -310,7 +310,7 @@ static int endwrite(WriteData *wd)
/* ********** WRITE FILE ****************** */
-static void writestruct(WriteData *wd, int filecode, char *structname, int nr, void *adr)
+static void writestruct(WriteData *wd, int filecode, const char *structname, int nr, void *adr)
{
BHead bh;
short *sp;
@@ -341,7 +341,7 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not
{
BHead bh;
- if(adr==0) return;
+ if(adr==NULL) return;
if(len==0) return;
len+= 3;
@@ -362,7 +362,6 @@ static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not
/*These functions are used by blender's .blend system for file saving/loading.*/
void IDP_WriteProperty_OnlyData(IDProperty *prop, void *wd);
void IDP_WriteProperty(IDProperty *prop, void *wd);
-static void write_animdata(WriteData *wd, AnimData *adt); // XXX code needs reshuffling, but not before NLA SoC is merged back into 2.5
static void IDP_WriteArray(IDProperty *prop, void *wd)
{
@@ -434,6 +433,200 @@ void IDP_WriteProperty(IDProperty *prop, void *wd)
IDP_WriteProperty_OnlyData(prop, wd);
}
+static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
+{
+ FModifier *fcm;
+
+ /* Modifiers */
+ for (fcm= fmodifiers->first; fcm; fcm= fcm->next) {
+ FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
+
+ /* Write the specific data */
+ if (fmi && fcm->data) {
+ /* firstly, just write the plain fmi->data struct */
+ writestruct(wd, DATA, fmi->structName, 1, fcm->data);
+
+ /* do any modifier specific stuff */
+ switch (fcm->type) {
+ case FMODIFIER_TYPE_GENERATOR:
+ {
+ FMod_Generator *data= (FMod_Generator *)fcm->data;
+
+ /* write coefficients array */
+ if (data->coefficients)
+ writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients);
+ }
+ break;
+ case FMODIFIER_TYPE_ENVELOPE:
+ {
+ FMod_Envelope *data= (FMod_Envelope *)fcm->data;
+
+ /* write envelope data */
+ if (data->data)
+ writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data);
+ }
+ break;
+ case FMODIFIER_TYPE_PYTHON:
+ {
+ FMod_Python *data = (FMod_Python *)fcm->data;
+
+ /* Write ID Properties -- and copy this comment EXACTLY for easy finding
+ of library blocks that implement this.*/
+ IDP_WriteProperty(data->prop, wd);
+ }
+ break;
+ }
+ }
+
+ /* Write the modifier */
+ writestruct(wd, DATA, "FModifier", 1, fcm);
+ }
+}
+
+static void write_fcurves(WriteData *wd, ListBase *fcurves)
+{
+ FCurve *fcu;
+
+ for (fcu=fcurves->first; fcu; fcu=fcu->next) {
+ /* F-Curve */
+ writestruct(wd, DATA, "FCurve", 1, fcu);
+
+ /* curve data */
+ if (fcu->bezt)
+ writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt);
+ if (fcu->fpt)
+ writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt);
+
+ if (fcu->rna_path)
+ writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path);
+
+ /* driver data */
+ if (fcu->driver) {
+ ChannelDriver *driver= fcu->driver;
+ DriverVar *dvar;
+
+ writestruct(wd, DATA, "ChannelDriver", 1, driver);
+
+ /* variables */
+ for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
+ writestruct(wd, DATA, "DriverVar", 1, dvar);
+
+ DRIVER_TARGETS_USED_LOOPER(dvar)
+ {
+ if (dtar->rna_path)
+ writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path);
+ }
+ DRIVER_TARGETS_LOOPER_END
+ }
+ }
+
+ /* write F-Modifiers */
+ write_fmodifiers(wd, &fcu->modifiers);
+ }
+}
+
+static void write_actions(WriteData *wd, ListBase *idbase)
+{
+ bAction *act;
+ bActionGroup *grp;
+ TimeMarker *marker;
+
+ for(act=idbase->first; act; act= act->id.next) {
+ if (act->id.us>0 || wd->current) {
+ writestruct(wd, ID_AC, "bAction", 1, act);
+ if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
+
+ write_fcurves(wd, &act->curves);
+
+ for (grp=act->groups.first; grp; grp=grp->next) {
+ writestruct(wd, DATA, "bActionGroup", 1, grp);
+ }
+
+ for (marker=act->markers.first; marker; marker=marker->next) {
+ writestruct(wd, DATA, "TimeMarker", 1, marker);
+ }
+ }
+ }
+
+ /* flush helps the compression for undo-save */
+ mywrite(wd, MYWRITE_FLUSH, 0);
+}
+
+static void write_keyingsets(WriteData *wd, ListBase *list)
+{
+ KeyingSet *ks;
+ KS_Path *ksp;
+
+ for (ks= list->first; ks; ks= ks->next) {
+ /* KeyingSet */
+ writestruct(wd, DATA, "KeyingSet", 1, ks);
+
+ /* Paths */
+ for (ksp= ks->paths.first; ksp; ksp= ksp->next) {
+ /* Path */
+ writestruct(wd, DATA, "KS_Path", 1, ksp);
+
+ if (ksp->rna_path)
+ writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path);
+ }
+ }
+}
+
+static void write_nlastrips(WriteData *wd, ListBase *strips)
+{
+ NlaStrip *strip;
+
+ for (strip= strips->first; strip; strip= strip->next) {
+ /* write the strip first */
+ writestruct(wd, DATA, "NlaStrip", 1, strip);
+
+ /* write the strip's F-Curves and modifiers */
+ write_fcurves(wd, &strip->fcurves);
+ write_fmodifiers(wd, &strip->modifiers);
+
+ /* write the strip's children */
+ write_nlastrips(wd, &strip->strips);
+ }
+}
+
+static void write_nladata(WriteData *wd, ListBase *nlabase)
+{
+ NlaTrack *nlt;
+
+ /* write all the tracks */
+ for (nlt= nlabase->first; nlt; nlt= nlt->next) {
+ /* write the track first */
+ writestruct(wd, DATA, "NlaTrack", 1, nlt);
+
+ /* write the track's strips */
+ write_nlastrips(wd, &nlt->strips);
+ }
+}
+
+static void write_animdata(WriteData *wd, AnimData *adt)
+{
+ AnimOverride *aor;
+
+ /* firstly, just write the AnimData block */
+ writestruct(wd, DATA, "AnimData", 1, adt);
+
+ /* write drivers */
+ write_fcurves(wd, &adt->drivers);
+
+ /* write overrides */
+ // FIXME: are these needed?
+ for (aor= adt->overrides.first; aor; aor= aor->next) {
+ /* overrides consist of base data + rna_path */
+ writestruct(wd, DATA, "AnimOverride", 1, aor);
+ writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path);
+ }
+
+ // TODO write the remaps (if they are needed)
+
+ /* write NLA data */
+ write_nladata(wd, &adt->nla_tracks);
+}
+
static void write_curvemapping(WriteData *wd, CurveMapping *cumap)
{
int a;
@@ -477,6 +670,12 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
for(link= ntree->links.first; link; link= link->next)
writestruct(wd, DATA, "bNodeLink", 1, link);
+
+ /* external sockets */
+ for(sock= ntree->inputs.first; sock; sock= sock->next)
+ writestruct(wd, DATA, "bNodeSocket", 1, sock);
+ for(sock= ntree->outputs.first; sock; sock= sock->next)
+ writestruct(wd, DATA, "bNodeSocket", 1, sock);
}
static void current_screen_compat(Main *mainvar, bScreen **screen)
@@ -506,7 +705,7 @@ static void write_renderinfo(WriteData *wd, Main *mainvar) /* for renderdeamon
data[1]= sce->r.efra;
memset(data+2, 0, sizeof(int)*6);
- strncpy((char *)(data+2), sce->id.name+2, 21);
+ BLI_strncpy((char *)(data+2), sce->id.name+2, sizeof(sce->id.name)-2);
writedata(wd, REND, 32, data);
}
@@ -573,9 +772,22 @@ static void write_boid_state(WriteData *wd, BoidState *state)
//for(; cond; cond=cond->next)
// writestruct(wd, DATA, "BoidCondition", 1, cond);
}
-/* TODO: replace *cache with *cachelist once it's coded */
-#define PTCACHE_WRITE_PSYS 0
-#define PTCACHE_WRITE_CLOTH 1
+
+/* update this also to readfile.c */
+static const char *ptcache_data_struct[] = {
+ "", // BPHYS_DATA_INDEX
+ "", // BPHYS_DATA_LOCATION
+ "", // BPHYS_DATA_VELOCITY
+ "", // BPHYS_DATA_ROTATION
+ "", // BPHYS_DATA_AVELOCITY / BPHYS_DATA_XCONST */
+ "", // BPHYS_DATA_SIZE:
+ "", // BPHYS_DATA_TIMES:
+ "BoidData" // case BPHYS_DATA_BOIDS:
+};
+static const char *ptcache_extra_struct[] = {
+ "",
+ "ParticleSpring"
+};
static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
{
PointCache *cache = ptcaches->first;
@@ -588,13 +800,24 @@ static void write_pointcaches(WriteData *wd, ListBase *ptcaches)
PTCacheMem *pm = cache->mem_cache.first;
for(; pm; pm=pm->next) {
+ PTCacheExtra *extra = pm->extradata.first;
+
writestruct(wd, DATA, "PTCacheMem", 1, pm);
- if(pm->index_array)
- writedata(wd, DATA, MEM_allocN_len(pm->index_array), pm->index_array);
for(i=0; i<BPHYS_TOT_DATA; i++) {
- if(pm->data[i] && pm->data_types & (1<<i))
- writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]);
+ if(pm->data[i] && pm->data_types & (1<<i)) {
+ if(strcmp(ptcache_data_struct[i], "")==0)
+ writedata(wd, DATA, MEM_allocN_len(pm->data[i]), pm->data[i]);
+ else
+ writestruct(wd, DATA, ptcache_data_struct[i], pm->totpoint, pm->data[i]);
+ }
+ }
+
+ for(; extra; extra=extra->next) {
+ if(strcmp(ptcache_extra_struct[extra->type], "")==0)
+ continue;
+ writestruct(wd, DATA, "PTCacheExtra", 1, extra);
+ writestruct(wd, DATA, ptcache_extra_struct[extra->type], extra->totdata, extra->data);
}
}
}
@@ -604,6 +827,7 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
{
ParticleSettings *part;
ParticleDupliWeight *dw;
+ int a;
part= idbase->first;
while(part) {
@@ -631,6 +855,10 @@ static void write_particlesettings(WriteData *wd, ListBase *idbase)
if(part->fluid && part->phystype == PART_PHYS_FLUID){
writestruct(wd, DATA, "SPHFluidSettings", 1, part->fluid);
}
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(part->mtex[a]) writestruct(wd, DATA, "MTex", 1, part->mtex[a]);
+ }
}
part= part->id.next;
}
@@ -656,6 +884,9 @@ static void write_particlesystems(WriteData *wd, ListBase *particles)
if(psys->particles->boid && psys->part->phystype == PART_PHYS_BOIDS)
writestruct(wd, DATA, "BoidParticle", psys->totpart, psys->particles->boid);
+
+ if(psys->part->fluid && psys->part->phystype == PART_PHYS_FLUID && (psys->part->fluid->flag & SPH_VISCOELASTIC_SPRINGS))
+ writestruct(wd, DATA, "ParticleSpring", psys->tot_fluidsprings, psys->fluid_springs);
}
pt = psys->targets.first;
for(; pt; pt=pt->next)
@@ -846,200 +1077,6 @@ static void write_actuators(WriteData *wd, ListBase *lb)
}
}
-static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
-{
- FModifier *fcm;
-
- /* Modifiers */
- for (fcm= fmodifiers->first; fcm; fcm= fcm->next) {
- FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
-
- /* Write the specific data */
- if (fmi && fcm->data) {
- /* firstly, just write the plain fmi->data struct */
- writestruct(wd, DATA, fmi->structName, 1, fcm->data);
-
- /* do any modifier specific stuff */
- switch (fcm->type) {
- case FMODIFIER_TYPE_GENERATOR:
- {
- FMod_Generator *data= (FMod_Generator *)fcm->data;
-
- /* write coefficients array */
- if (data->coefficients)
- writedata(wd, DATA, sizeof(float)*(data->arraysize), data->coefficients);
- }
- break;
- case FMODIFIER_TYPE_ENVELOPE:
- {
- FMod_Envelope *data= (FMod_Envelope *)fcm->data;
-
- /* write envelope data */
- if (data->data)
- writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data);
- }
- break;
- case FMODIFIER_TYPE_PYTHON:
- {
- FMod_Python *data = (FMod_Python *)fcm->data;
-
- /* Write ID Properties -- and copy this comment EXACTLY for easy finding
- of library blocks that implement this.*/
- IDP_WriteProperty(data->prop, wd);
- }
- break;
- }
- }
-
- /* Write the modifier */
- writestruct(wd, DATA, "FModifier", 1, fcm);
- }
-}
-
-static void write_fcurves(WriteData *wd, ListBase *fcurves)
-{
- FCurve *fcu;
-
- for (fcu=fcurves->first; fcu; fcu=fcu->next) {
- /* F-Curve */
- writestruct(wd, DATA, "FCurve", 1, fcu);
-
- /* curve data */
- if (fcu->bezt)
- writestruct(wd, DATA, "BezTriple", fcu->totvert, fcu->bezt);
- if (fcu->fpt)
- writestruct(wd, DATA, "FPoint", fcu->totvert, fcu->fpt);
-
- if (fcu->rna_path)
- writedata(wd, DATA, strlen(fcu->rna_path)+1, fcu->rna_path);
-
- /* driver data */
- if (fcu->driver) {
- ChannelDriver *driver= fcu->driver;
- DriverVar *dvar;
-
- writestruct(wd, DATA, "ChannelDriver", 1, driver);
-
- /* variables */
- for (dvar= driver->variables.first; dvar; dvar= dvar->next) {
- writestruct(wd, DATA, "DriverVar", 1, dvar);
-
- DRIVER_TARGETS_USED_LOOPER(dvar)
- {
- if (dtar->rna_path)
- writedata(wd, DATA, strlen(dtar->rna_path)+1, dtar->rna_path);
- }
- DRIVER_TARGETS_LOOPER_END
- }
- }
-
- /* write F-Modifiers */
- write_fmodifiers(wd, &fcu->modifiers);
- }
-}
-
-static void write_actions(WriteData *wd, ListBase *idbase)
-{
- bAction *act;
- bActionGroup *grp;
- TimeMarker *marker;
-
- for(act=idbase->first; act; act= act->id.next) {
- if (act->id.us>0 || wd->current) {
- writestruct(wd, ID_AC, "bAction", 1, act);
- if (act->id.properties) IDP_WriteProperty(act->id.properties, wd);
-
- write_fcurves(wd, &act->curves);
-
- for (grp=act->groups.first; grp; grp=grp->next) {
- writestruct(wd, DATA, "bActionGroup", 1, grp);
- }
-
- for (marker=act->markers.first; marker; marker=marker->next) {
- writestruct(wd, DATA, "TimeMarker", 1, marker);
- }
- }
- }
-
- /* flush helps the compression for undo-save */
- mywrite(wd, MYWRITE_FLUSH, 0);
-}
-
-static void write_keyingsets(WriteData *wd, ListBase *list)
-{
- KeyingSet *ks;
- KS_Path *ksp;
-
- for (ks= list->first; ks; ks= ks->next) {
- /* KeyingSet */
- writestruct(wd, DATA, "KeyingSet", 1, ks);
-
- /* Paths */
- for (ksp= ks->paths.first; ksp; ksp= ksp->next) {
- /* Path */
- writestruct(wd, DATA, "KS_Path", 1, ksp);
-
- if (ksp->rna_path)
- writedata(wd, DATA, strlen(ksp->rna_path)+1, ksp->rna_path);
- }
- }
-}
-
-static void write_nlastrips(WriteData *wd, ListBase *strips)
-{
- NlaStrip *strip;
-
- for (strip= strips->first; strip; strip= strip->next) {
- /* write the strip first */
- writestruct(wd, DATA, "NlaStrip", 1, strip);
-
- /* write the strip's F-Curves and modifiers */
- write_fcurves(wd, &strip->fcurves);
- write_fmodifiers(wd, &strip->modifiers);
-
- /* write the strip's children */
- write_nlastrips(wd, &strip->strips);
- }
-}
-
-static void write_nladata(WriteData *wd, ListBase *nlabase)
-{
- NlaTrack *nlt;
-
- /* write all the tracks */
- for (nlt= nlabase->first; nlt; nlt= nlt->next) {
- /* write the track first */
- writestruct(wd, DATA, "NlaTrack", 1, nlt);
-
- /* write the track's strips */
- write_nlastrips(wd, &nlt->strips);
- }
-}
-
-static void write_animdata(WriteData *wd, AnimData *adt)
-{
- AnimOverride *aor;
-
- /* firstly, just write the AnimData block */
- writestruct(wd, DATA, "AnimData", 1, adt);
-
- /* write drivers */
- write_fcurves(wd, &adt->drivers);
-
- /* write overrides */
- // FIXME: are these needed?
- for (aor= adt->overrides.first; aor; aor= aor->next) {
- /* overrides consist of base data + rna_path */
- writestruct(wd, DATA, "AnimOverride", 1, aor);
- writedata(wd, DATA, strlen(aor->rna_path)+1, aor->rna_path);
- }
-
- // TODO write the remaps (if they are needed)
-
- /* write NLA data */
- write_nladata(wd, &adt->nla_tracks);
-}
-
static void write_motionpath(WriteData *wd, bMotionPath *mpath)
{
/* sanity checks */
@@ -1177,19 +1214,32 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
{
+ if(smd->domain)
+ {
+ write_pointcaches(wd, &(smd->domain->ptcaches[0]));
+
+ /* create fake pointcache so that old blender versions can read it */
+ smd->domain->point_cache[1] = BKE_ptcache_add(&smd->domain->ptcaches[1]);
+ smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE|PTCACHE_FAKE_SMOKE;
+ smd->domain->point_cache[1]->step = 1;
+
+ write_pointcaches(wd, &(smd->domain->ptcaches[1]));
+ }
+
writestruct(wd, DATA, "SmokeDomainSettings", 1, smd->domain);
- writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights);
+
+ if(smd->domain) {
+ /* cleanup the fake pointcache */
+ BKE_ptcache_free_list(&smd->domain->ptcaches[1]);
+ smd->domain->point_cache[1] = NULL;
+
+ writestruct(wd, DATA, "EffectorWeights", 1, smd->domain->effector_weights);
+ }
}
else if(smd->type & MOD_SMOKE_TYPE_FLOW)
writestruct(wd, DATA, "SmokeFlowSettings", 1, smd->flow);
else if(smd->type & MOD_SMOKE_TYPE_COLL)
writestruct(wd, DATA, "SmokeCollSettings", 1, smd->coll);
-
- if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
- {
- write_pointcaches(wd, &(smd->domain->ptcaches[0]));
- write_pointcaches(wd, &(smd->domain->ptcaches[1]));
- }
}
else if(md->type==eModifierType_Fluidsim) {
FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;
@@ -1250,7 +1300,7 @@ static void write_objects(WriteData *wd, ListBase *idbase)
if (ob->type == OB_ARMATURE) {
bArmature *arm = ob->data;
if (arm && ob->pose && arm->act_bone) {
- strcpy(ob->pose->proxy_act_bone, arm->act_bone->name);
+ BLI_strncpy(ob->pose->proxy_act_bone, arm->act_bone->name, sizeof(ob->pose->proxy_act_bone));
}
}
@@ -1475,7 +1525,7 @@ static void write_customdata(WriteData *wd, ID *id, int count, CustomData *data,
for (i=0; i<data->totlayer; i++) {
CustomDataLayer *layer= &data->layers[i];
- char *structname;
+ const char *structname;
int structnum, datasize;
if (layer->type == CD_MDEFORMVERT) {
@@ -1559,7 +1609,10 @@ static void write_lattices(WriteData *wd, ListBase *idbase)
/* write LibData */
writestruct(wd, ID_LT, "Lattice", 1, lt);
if (lt->id.properties) IDP_WriteProperty(lt->id.properties, wd);
-
+
+ /* write animdata */
+ if (lt->adt) write_animdata(wd, lt->adt);
+
/* direct data */
writestruct(wd, DATA, "BPoint", lt->pntsu*lt->pntsv*lt->pntsw, lt->def);
@@ -1906,21 +1959,23 @@ static void write_gpencils(WriteData *wd, ListBase *lb)
bGPDstroke *gps;
for (gpd= lb->first; gpd; gpd= gpd->id.next) {
- /* write gpd data block to file */
- writestruct(wd, ID_GD, "bGPdata", 1, gpd);
-
- /* write grease-pencil layers to file */
- for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
- writestruct(wd, DATA, "bGPDlayer", 1, gpl);
+ if (gpd->id.us>0 || wd->current) {
+ /* write gpd data block to file */
+ writestruct(wd, ID_GD, "bGPdata", 1, gpd);
- /* write this layer's frames to file */
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- writestruct(wd, DATA, "bGPDframe", 1, gpf);
+ /* write grease-pencil layers to file */
+ for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
+ writestruct(wd, DATA, "bGPDlayer", 1, gpl);
- /* write strokes */
- for (gps= gpf->strokes.first; gps; gps= gps->next) {
- writestruct(wd, DATA, "bGPDstroke", 1, gps);
- writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);
+ /* write this layer's frames to file */
+ for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
+ writestruct(wd, DATA, "bGPDframe", 1, gpf);
+
+ /* write strokes */
+ for (gps= gpf->strokes.first; gps; gps= gps->next) {
+ writestruct(wd, DATA, "bGPDstroke", 1, gps);
+ writestruct(wd, DATA, "bGPDspoint", gps->totpoints, gps->points);
+ }
}
}
}
@@ -2095,6 +2150,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
ConsoleLine *cl;
for (cl=con->history.first; cl; cl=cl->next) {
+ /* 'len_alloc' is invalid on write, set from 'len' on read */
writestruct(wd, DATA, "ConsoleLine", 1, cl);
writedata(wd, DATA, cl->len+1, cl->line);
}
@@ -2344,6 +2400,10 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
bScreen *screen;
char subvstr[8];
+ /* prevent mem checkers from complaining */
+ fg.pads= fg.pad= 0;
+ memset(fg.filename, 0, sizeof(fg.filename));
+
current_screen_compat(mainvar, &screen);
/* XXX still remap G */
@@ -2351,7 +2411,7 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
fg.curscene= screen->scene;
fg.displaymode= G.displaymode;
fg.winpos= G.winpos;
- fg.fileflags= (fileflags & ~G_FILE_NO_UI); // prevent to save this, is not good convention, and feature with concerns...
+ fg.fileflags= (fileflags & ~(G_FILE_NO_UI|G_FILE_RELATIVE_REMAP)); // prevent to save this, is not good convention, and feature with concerns...
fg.globalf= G.f;
BLI_strncpy(fg.filename, mainvar->name, sizeof(fg.filename));
@@ -2361,7 +2421,14 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
fg.subversion= BLENDER_SUBVERSION;
fg.minversion= BLENDER_MINVERSION;
fg.minsubversion= BLENDER_MINSUBVERSION;
- fg.pads= 0; /* prevent mem checkers from complaining */
+#ifdef NAN_BUILDINFO
+ {
+ extern char build_rev[];
+ fg.revision= atoi(build_rev);
+ }
+#else
+ fg.revision= 0;
+#endif
writestruct(wd, GLOB, "FileGlobal", 1, &fg);
}
@@ -2386,7 +2453,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil
blo_split_main(&mainlist, mainvar);
- wd= bgnwrite(handle, compare, current, write_flags);
+ wd= bgnwrite(handle, compare, current);
sprintf(buf, "BLENDER%c%c%.3d", (sizeof(void*)==8)?'-':'_', (ENDIAN_ORDER==B_ENDIAN)?'V':'v', BLENDER_VERSION);
mywrite(wd, buf, 12);
@@ -2473,14 +2540,14 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report
if(strcmp(dir1, dir2)==0)
write_flags &= ~G_FILE_RELATIVE_REMAP;
else
- makeFilesAbsolute(G.sce, NULL);
+ makeFilesAbsolute(mainvar, G.main->name, NULL);
}
- BLI_make_file_string(G.sce, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
+ BLI_make_file_string(G.main->name, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
write_user_block= BLI_streq(dir, userfilename);
if(write_flags & G_FILE_RELATIVE_REMAP)
- makeFilesRelative(dir, NULL); /* note, making relative to something OTHER then G.sce */
+ makeFilesRelative(mainvar, dir, NULL); /* note, making relative to something OTHER then G.main->name */
/* actual file writing */
err= write_file_handle(mainvar, file, NULL,NULL, write_user_block, write_flags, thumb);
@@ -2532,7 +2599,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report
}
/* return: success (1) */
-int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags, ReportList *reports)
+int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int write_flags)
{
int err;
@@ -2545,29 +2612,20 @@ int BLO_write_file_mem(Main *mainvar, MemFile *compare, MemFile *current, int wr
/* Runtime writing */
-#ifdef WIN32
-#define PATHSEPERATOR "\\"
-#else
-#define PATHSEPERATOR "/"
-#endif
-
static char *get_runtime_path(char *exename) {
char *installpath= get_install_dir();
if (!installpath) {
return NULL;
- } else {
- char *path= MEM_mallocN(strlen(installpath)+strlen(PATHSEPERATOR)+strlen(exename)+1, "runtimepath");
+ }
+ else {
+ char *path= BLI_sprintfN("%s%c%s", installpath, SEP, exename);
if (path == NULL) {
MEM_freeN(installpath);
return NULL;
}
- strcpy(path, installpath);
- strcat(path, PATHSEPERATOR);
- strcat(path, exename);
-
MEM_freeN(installpath);
return path;
@@ -2576,7 +2634,7 @@ static char *get_runtime_path(char *exename) {
#ifdef __APPLE__
-static int recursive_copy_runtime(char *outname, char *exename, ReportList *reports)
+static int recursive_copy_runtime(const char *outname, char *exename, ReportList *reports)
{
char *runtime = get_runtime_path(exename);
char command[2 * (FILE_MAXDIR+FILE_MAXFILE) + 32];
@@ -2612,7 +2670,7 @@ cleanup:
return !error;
}
-int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports)
+int BLO_write_runtime(Main *mainvar, const char *file, char *exename, ReportList *reports)
{
char gamename[FILE_MAXDIR+FILE_MAXFILE];
int outfd = -1, error= 0;
@@ -2626,8 +2684,7 @@ int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *repo
goto cleanup;
}
- strcpy(gamename, file);
- strcat(gamename, "/Contents/Resources/game.blend");
+ BLI_snprintf(gamename, sizeof(gamename), "%s/Contents/Resources/game.blend", file);
//printf("gamename %s\n", gamename);
outfd= open(gamename, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
if (outfd != -1) {
@@ -2701,7 +2758,7 @@ static int handle_write_msb_int(int handle, int i)
return (write(handle, buf, 4)==4);
}
-int BLO_write_runtime(Main *mainvar, char *file, char *exename, ReportList *reports)
+int BLO_write_runtime(Main *mainvar, const char *file, char *exename, ReportList *reports)
{
int outfd= open(file, O_BINARY|O_WRONLY|O_CREAT|O_TRUNC, 0777);
int datastart, error= 0;
diff --git a/source/blender/blenpluginapi/CMakeLists.txt b/source/blender/blenpluginapi/CMakeLists.txt
index 2699b3b7c3b..1e3a3398861 100644
--- a/source/blender/blenpluginapi/CMakeLists.txt
+++ b/source/blender/blenpluginapi/CMakeLists.txt
@@ -24,19 +24,30 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- . .. ../../../intern/guardedalloc ../blenlib ../imbuf ../makesdna
+set(INC
+ .
+ ..
+ ../blenlib
+ ../imbuf
+ ../makesdna
+ ../blenloader
+ ../../../intern/guardedalloc
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/pluginapi.c
+
+ documentation.h
+ externdef.h
+ floatpatch.h
+ iff.h
+ plugin.h
+ util.h
+)
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-BLENDERLIB(bf_blenpluginapi "${SRC}" "${INC}")
+blender_add_lib(bf_blenpluginapi "${SRC}" "${INC}")
diff --git a/source/blender/blenpluginapi/Makefile b/source/blender/blenpluginapi/Makefile
deleted file mode 100644
index c91161d8cfd..00000000000
--- a/source/blender/blenpluginapi/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/blenpluginapi
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/blenpluginapi/SConscript b/source/blender/blenpluginapi/SConscript
index 77faaa7b7f4..178f470e080 100644
--- a/source/blender/blenpluginapi/SConscript
+++ b/source/blender/blenpluginapi/SConscript
@@ -3,15 +3,15 @@ Import ('env')
sources = env.Glob('intern/*.c')
-incs = '. .. #/intern/guardedalloc ../blenlib ../imbuf ../makesdna'
+incs = '. .. #/intern/guardedalloc ../blenlib ../imbuf ../makesdna ../blenloader'
defs = []
incs += ' ' + env["BF_PTHREADS_INC"]
if env['WITH_BF_QUICKTIME']:
- defs.append('WITH_QUICKTIME')
- incs += ' ' + env['BF_QUICKTIME_INC']
+ defs.append('WITH_QUICKTIME')
+ incs += ' ' + env['BF_QUICKTIME_INC']
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/blenpluginapi/documentation.h b/source/blender/blenpluginapi/documentation.h
index bf964d792b6..3bf43a6bc9b 100644
--- a/source/blender/blenpluginapi/documentation.h
+++ b/source/blender/blenpluginapi/documentation.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h
index b8628b00575..668d14508ec 100644
--- a/source/blender/blenpluginapi/iff.h
+++ b/source/blender/blenpluginapi/iff.h
@@ -81,7 +81,7 @@ typedef struct ImBuf {
int refcounter; /* reference counter for multiple users */
} ImBuf;
-LIBIMPORT struct ImBuf *allocImBuf(short,short,uchar,uint,uchar);
+LIBIMPORT struct ImBuf *allocImBuf(short,short,uchar,uint);
LIBIMPORT struct ImBuf *dupImBuf(struct ImBuf *);
LIBIMPORT void freeImBuf(struct ImBuf*);
diff --git a/source/blender/blenpluginapi/intern/Makefile b/source/blender/blenpluginapi/intern/Makefile
deleted file mode 100644
index 696462f3f46..00000000000
--- a/source/blender/blenpluginapi/intern/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenpluginapi
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# path to our own external headerfiles. On win2k this needs to be
-# longer, to avoid the util.h include problem
-CPPFLAGS += -I..
-CPPFLAGS += -I../..
-
-# also do dna
-CPPFLAGS += -I../../makesdna
-# path to blenlib
-CPPFLAGS += -I../../blenlib
-# path to imbuf
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c
index 9e739f7927d..ab21e5a96fc 100644
--- a/source/blender/blenpluginapi/intern/pluginapi.c
+++ b/source/blender/blenpluginapi/intern/pluginapi.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -101,10 +101,9 @@ LIBEXPORT void freeT(void *vmemh)
LIBEXPORT struct ImBuf *allocImBuf(short x,
short y,
uchar d,
- uint flags,
- uchar bitmap)
+ uint flags)
{
- return IMB_allocImBuf(x, y, d, flags, bitmap);
+ return IMB_allocImBuf(x, y, d, flags);
}
diff --git a/source/blender/bmesh/CMakeLists.txt b/source/blender/bmesh/CMakeLists.txt
index 2118af0a7aa..870cfa66a61 100644
--- a/source/blender/bmesh/CMakeLists.txt
+++ b/source/blender/bmesh/CMakeLists.txt
@@ -1,8 +1,124 @@
+# $Id: CMakeLists.txt 31746 2010-09-04 05:31:25Z joeedh $
+# ***** 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.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Jacques Beaurain.
+#
+# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c operators/*.c)
+set(INC
+ .
+ ../avi
+ ../blenlib
+ ../blenloader
+ ../blenkernel
+ operators
+ intern
+ ../editors/mesh
+ ../gpu
+ ../ikplugin
+ ../imbuf
+ ../makesdna
+ ../makesrna
+ ../modifiers
+ ../nodes
+ ../editors/include
+ ../render/extern/include
+ ../../../extern/glew/include
+ ../../../intern/audaspace/intern
+ ../../../intern/bsp/extern ../blenfont
+ ../../../intern/decimation/extern
+ ../../../intern/elbeem/extern
+ ../../../intern/guardedalloc
+ ../../../intern/iksolver/extern
+ ../../../intern/memutil
+ ../../../intern/opennl/extern
+ ../../../intern/smoke/extern
+ ../../../intern/mikktspace
+ ../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h
+ ${ZLIB_INCLUDE_DIRS}
+)
-SET(INC . intern
- ../makesdna ../makesrna ../blenkernel ../blenlib ../../../intern/guardedalloc ../editors/include ../editors/mesh)
+set(SRC
+ operators/bmesh_dupeops.c
+ operators/utils.c
+ operators/subdivideop.c
+ operators/connectops.c
+ operators/removedoubles.c
+ operators/mirror.c
+ operators/primitiveops.c
+ operators/join_triangles.c
+ operators/edgesplitop.c
+ operators/createops.c
+ operators/dissolveops.c
+ operators/subdivideop.h
+ operators/triangulateop.c
+ operators/mesh_conv.c
+ operators/extrudeops.c
+ bmesh_operators.h
+ bmesh_iterators.h
+ intern/bmesh_newcore.c
+ intern/bmesh_interp.c
+ intern/bmesh_iterators.c
+ intern/bmesh_marking.c
+ intern/bmesh_mesh.c
+ intern/bmesh_mods.c
+ intern/bmesh_structure.h
+ intern/bmesh_construct.c
+ intern/bmesh_walkers.c
+ intern/bmesh_to_editmesh.c
+ intern/bmesh_operators_private.h
+ intern/editmesh_to_bmesh.c
+ intern/bmesh_structure.c
+ intern/bmesh_polygon.c
+ intern/bmesh_queries.c
+ intern/bmesh_opdefines.c
+ intern/bmesh_filters.c
+ intern/bmesh_eulers.c
+ intern/bmesh_operators.c
+ intern/bmesh_private.h
+ bmesh_error.h
+ bmesh_queries.h
+ bmesh.h
+ bmesh_marking.h
+ bmesh_operator_api.h
+ bmesh_filters.h
+ bmesh_class.h
+ bmesh_walkers.h
+)
-BLENDERLIB(bf_bmesh "${SRC}" "${INC}")
+add_definitions(-DGLEW_STATIC)
+if(WITH_LZO)
+ list(APPEND INC ../../../extern/lzo/minilzo)
+ add_definitions(-DWITH_LZO)
+endif()
+
+if(WITH_LZMA)
+ list(APPEND INC ../../../extern/lzma)
+ add_definitions(-DWITH_LZMA)
+endif()
+
+if(MSVC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
+endif()
+
+blender_add_lib(bf_bmesh "${SRC}" "${INC}")
diff --git a/source/blender/bmesh/bmesh_class.h b/source/blender/bmesh/bmesh_class.h
index ee14781a4e6..f955c1965c5 100644
--- a/source/blender/bmesh/bmesh_class.h
+++ b/source/blender/bmesh/bmesh_class.h
@@ -2,7 +2,9 @@
#define _BMESH_CLASS_H
#include "DNA_listBase.h"
-#include "DNA_customdata_types.h"
+
+#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
struct BMesh;
struct BMVert;
diff --git a/source/blender/bmesh/bmesh_error.h b/source/blender/bmesh/bmesh_error.h
index 68dd06b44f0..482de844cd4 100644
--- a/source/blender/bmesh/bmesh_error.h
+++ b/source/blender/bmesh/bmesh_error.h
@@ -5,15 +5,15 @@
/*pushes an error onto the bmesh error stack.
if msg is null, then the default message for the errorcode is used.*/
-void BMO_RaiseError(BMesh *bm, BMOperator *owner, int errcode, char *msg);
+void BMO_RaiseError(BMesh *bm, BMOperator *owner, int errcode, const char *msg);
/*gets the topmost error from the stack.
returns error code or 0 if no error.*/
-int BMO_GetError(BMesh *bm, char **msg, BMOperator **op);
+int BMO_GetError(BMesh *bm, const char **msg, BMOperator **op);
int BMO_HasError(BMesh *bm);
/*same as geterror, only pops the error off the stack as well*/
-int BMO_PopError(BMesh *bm, char **msg, BMOperator **op);
+int BMO_PopError(BMesh *bm, const char **msg, BMOperator **op);
void BMO_ClearStack(BMesh *bm);
#if 0
diff --git a/source/blender/bmesh/bmesh_iterators.h b/source/blender/bmesh/bmesh_iterators.h
index c741ec5d967..1d35db8058e 100644
--- a/source/blender/bmesh/bmesh_iterators.h
+++ b/source/blender/bmesh/bmesh_iterators.h
@@ -55,6 +55,10 @@ a different face hole boundary*/
for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
if (BM_TestHFlag(ele, BM_HIDDEN) || !BM_TestHFlag(ele, BM_SELECT)) continue;
+#define BM_ITER_VISIBLE(ele, iter, bm, type, data)\
+for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
+ if (BM_TestHFlag(ele, BM_HIDDEN)) continue;
+
#define BM_ITER_NOTSELECT(ele, iter, bm, type, data)\
for (ele = BMIter_New(iter, bm, type, data); ele; ele=BMIter_Step(iter)) {\
if (BM_TestHFlag(ele, BM_HIDDEN) || BM_TestHFlag(ele, BM_SELECT)) continue;
diff --git a/source/blender/bmesh/bmesh_operator_api.h b/source/blender/bmesh/bmesh_operator_api.h
index 0b1e356d01d..9c76bedb5c4 100644
--- a/source/blender/bmesh/bmesh_operator_api.h
+++ b/source/blender/bmesh/bmesh_operator_api.h
@@ -110,7 +110,7 @@ typedef struct slottype {
} slottype;
typedef struct BMOpDefine {
- char *name;
+ const char *name;
slottype slottypes[BMOP_MAX_SLOTS];
void (*exec)(BMesh *bm, BMOperator *op);
int flag; /*doesn't do anything right now*/
@@ -122,7 +122,7 @@ typedef struct BMOpDefine {
have it set directly. and never use BMO_Set_Pnt to
pass in a list of edges or any arrays, really.*/
-void BMO_Init_Op(struct BMOperator *op, char *opname);
+void BMO_Init_Op(struct BMOperator *op, const char *opname);
/*executes an operator, pushing and popping a new tool flag
layer as appropriate.*/
@@ -190,78 +190,81 @@ int BMO_CountFlag(struct BMesh *bm, int flag, int type);
argument, it maps to two, a pointer to an operator and
a slot name.
*/
+void BMO_push(BMesh *bm, BMOperator *op);
+void BMO_pop(BMesh *bm);
+
/*executes an operator*/
-int BMO_CallOpf(BMesh *bm, char *fmt, ...);
+int BMO_CallOpf(BMesh *bm, const char *fmt, ...);
/*initializes, but doesn't execute an operator. this is so you can
gain access to the outputs of the operator. note that you have
to execute/finitsh (BMO_Exec_Op and BMO_Finish_Op) yourself.*/
-int BMO_InitOpf(BMesh *bm, BMOperator *op, char *fmt, ...);
+int BMO_InitOpf(BMesh *bm, BMOperator *op, const char *fmt, ...);
/*va_list version, used to implement the above two functions,
plus EDBM_CallOpf in bmeshutils.c.*/
-int BMO_VInitOpf(BMesh *bm, BMOperator *op, char *fmt, va_list vlist);
+int BMO_VInitOpf(BMesh *bm, BMOperator *op, const char *fmt, va_list vlist);
/*get a point to a slot. this may be removed layer on from the public API.*/
-BMOpSlot *BMO_GetSlot(struct BMOperator *op, char *slotname);
+BMOpSlot *BMO_GetSlot(struct BMOperator *op, const char *slotname);
/*copies the data of a slot from one operator to another. src and dst are the
source/destination slot codes, respectively.*/
void BMO_CopySlot(struct BMOperator *source_op, struct BMOperator *dest_op,
- char *src, char *dst);
+ const char *src, const char *dst);
/*remove tool flagged elements*/
void BM_remove_tagged_faces(struct BMesh *bm, int flag);
void BM_remove_tagged_edges(struct BMesh *bm, int flag);
void BM_remove_tagged_verts(struct BMesh *bm, int flag);
-void BMO_Set_Float(struct BMOperator *op, char *slotname, float f);
-float BMO_Get_Float(BMOperator *op, char *slotname);
-void BMO_Set_Int(struct BMOperator *op, char *slotname, int i);
-int BMO_Get_Int(BMOperator *op, char *slotname);
+void BMO_Set_Float(struct BMOperator *op, const char *slotname, float f);
+float BMO_Get_Float(BMOperator *op, const char *slotname);
+void BMO_Set_Int(struct BMOperator *op, const char *slotname, int i);
+int BMO_Get_Int(BMOperator *op, const char *slotname);
/*don't pass in arrays that are supposed to map to elements this way.
so, e.g. passing in list of floats per element in another slot is bad.
passing in, e.g. pointer to an editmesh for the conversion operator is fine
though.*/
-void BMO_Set_Pnt(struct BMOperator *op, char *slotname, void *p);
-void *BMO_Get_Pnt(BMOperator *op, char *slotname);
-void BMO_Set_Vec(struct BMOperator *op, char *slotname, float *vec);
-void BMO_Get_Vec(BMOperator *op, char *slotname, float *vec_out);
+void BMO_Set_Pnt(struct BMOperator *op, const char *slotname, void *p);
+void *BMO_Get_Pnt(BMOperator *op, const char *slotname);
+void BMO_Set_Vec(struct BMOperator *op, const char *slotname, float *vec);
+void BMO_Get_Vec(BMOperator *op, const char *slotname, float *vec_out);
/*only supports square mats*/
/*size must be 3 or 4; this api is meant only for transformation matrices.
note that internally the matrix is stored in 4x4 form, and it's safe to
call whichever BMO_Get_Mat* function you want.*/
-void BMO_Set_Mat(struct BMOperator *op, char *slotname, float *mat, int size);
-void BMO_Get_Mat4(struct BMOperator *op, char *slotname, float mat[4][4]);
-void BMO_Get_Mat3(struct BMOperator *op, char *slotname, float mat[3][3]);
+void BMO_Set_Mat(struct BMOperator *op, const char *slotname, float *mat, int size);
+void BMO_Get_Mat4(struct BMOperator *op, const char *slotname, float mat[4][4]);
+void BMO_Get_Mat3(struct BMOperator *op, const char *slotname, float mat[3][3]);
void BMO_Clear_Flag_All(BMesh *bm, BMOperator *op, int type, int flag);
/*puts every element of type type (which is a bitmask) with tool flag flag,
into a slot.*/
-void BMO_Flag_To_Slot(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_Flag_To_Slot(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*tool-flags all elements inside an element slot array with flag flag.*/
-void BMO_Flag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_Flag_Buffer(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*clears tool-flag flag from all elements inside a slot array.*/
-void BMO_Unflag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_Unflag_Buffer(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*tool-flags all elements inside an element slot array with flag flag.*/
-void BMO_HeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_HeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*clears tool-flag flag from all elements inside a slot array.*/
-void BMO_UnHeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_UnHeaderFlag_Buffer(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*puts every element of type type (which is a bitmask) with header flag
flag, into a slot. note: ignores hidden elements (e.g. elements with
header flag BM_HIDDEN set).*/
-void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, char *slotname, int flag, int type);
+void BMO_HeaderFlag_To_Slot(struct BMesh *bm, struct BMOperator *op, const char *slotname, int flag, int type);
/*counts number of elements inside a slot array.*/
-int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, char *slotname);
-int BMO_CountSlotMap(struct BMesh *bm, struct BMOperator *op, char *slotname);
+int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, const char *slotname);
+int BMO_CountSlotMap(struct BMesh *bm, struct BMOperator *op, const char *slotname);
/*Counts the number of edges with tool flag toolflag around
v*/
@@ -269,34 +272,34 @@ int BMO_Vert_CountEdgeFlags(BMesh *bm, BMVert *v, int toolflag);
/*inserts a key/value mapping into a mapping slot. note that it copies the
value, it doesn't store a reference to it.*/
-//BM_INLINE void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, char *slotname,
+//BM_INLINE void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, const char *slotname,
//void *element, void *data, int len);
/*inserts a key/float mapping pair into a mapping slot.*/
-//BM_INLINE void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, char *slotname,
+//BM_INLINE void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, const char *slotname,
//void *element, float val);
//returns 1 if the specified pointer is in the map.
-//BM_INLINE int BMO_InMap(BMesh *bm, BMOperator *op, char *slotname, void *element);
+//BM_INLINE int BMO_InMap(BMesh *bm, BMOperator *op, const char *slotname, void *element);
/*returns a point to the value of a specific key.*/
-//BM_INLINE void *BMO_Get_MapData(BMesh *bm, BMOperator *op, char *slotname, void *element);
+//BM_INLINE void *BMO_Get_MapData(BMesh *bm, BMOperator *op, const char *slotname, void *element);
/*returns the float part of a key/float pair.*/
-//BM_INLINE float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, char *slotname, void *element);
+//BM_INLINE float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, const char *slotname, void *element);
/*flags all elements in a mapping. note that the mapping must only have
bmesh elements in it.*/
void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op,
- char *slotname, int flag);
+ const char *slotname, int flag);
/*pointer versoins of BMO_Get_MapFloat and BMO_Insert_MapFloat.
do NOT use these for non-operator-api-allocated memory! instead
use BMO_Get_MapData and BMO_Insert_Mapping, which copies the data.*/
-//BM_INLINE void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, char *slotname,
+//BM_INLINE void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, const char *slotname,
//void *key, void *val);
-//BM_INLINE void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, char *slotname,
+//BM_INLINE void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, const char *slotname,
//void *key);
/*this part of the API is used to iterate over element buffer or
@@ -341,13 +344,13 @@ typedef struct BMOIter {
int restrict;
} BMOIter;
-void *BMO_FirstElem(BMOperator *op, char *slotname);
+void *BMO_FirstElem(BMOperator *op, const char *slotname);
/*restrictmask restricts the iteration to certain element types
(e.g. combination of BM_VERT, BM_EDGE, BM_FACE), if iterating
over an element buffer (not a mapping).*/
void *BMO_IterNew(BMOIter *iter, BMesh *bm, BMOperator *op,
- char *slotname, int restrictmask);
+ const char *slotname, int restrictmask);
void *BMO_IterStep(BMOIter *iter);
/*returns a pointer to the key value when iterating over mappings.
@@ -376,7 +379,7 @@ typedef struct element_mapping {
extern const int BMOP_OPSLOT_TYPEINFO[];
-BM_INLINE void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void BMO_Insert_Mapping(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
void *element, void *data, int len) {
element_mapping *mapping;
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -398,25 +401,25 @@ BM_INLINE void BMO_Insert_Mapping(BMesh *bm, BMOperator *op, char *slotname,
BLI_ghash_insert(slot->data.ghash, element, mapping);
}
-BM_INLINE void BMO_Insert_MapInt(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void BMO_Insert_MapInt(BMesh *bm, BMOperator *op, const char *slotname,
void *element, int val)
{
BMO_Insert_Mapping(bm, op, slotname, element, &val, sizeof(int));
}
-BM_INLINE void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void BMO_Insert_MapFloat(BMesh *bm, BMOperator *op, const char *slotname,
void *element, float val)
{
BMO_Insert_Mapping(bm, op, slotname, element, &val, sizeof(float));
}
-BM_INLINE void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void BMO_Insert_MapPointer(BMesh *bm, BMOperator *op, const char *slotname,
void *element, void *val)
{
BMO_Insert_Mapping(bm, op, slotname, element, &val, sizeof(void*));
}
-BM_INLINE int BMO_InMap(BMesh *bm, BMOperator *op, char *slotname, void *element)
+BM_INLINE int BMO_InMap(BMesh *UNUSED(bm), BMOperator *op, const char *slotname, void *element)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -427,7 +430,7 @@ BM_INLINE int BMO_InMap(BMesh *bm, BMOperator *op, char *slotname, void *element
return BLI_ghash_haskey(slot->data.ghash, element);
}
-BM_INLINE void *BMO_Get_MapData(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void *BMO_Get_MapData(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
void *element)
{
element_mapping *mapping;
@@ -444,7 +447,7 @@ BM_INLINE void *BMO_Get_MapData(BMesh *bm, BMOperator *op, char *slotname,
return mapping + 1;
}
-BM_INLINE float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, const char *slotname,
void *element)
{
float *val = (float*) BMO_Get_MapData(bm, op, slotname, element);
@@ -453,7 +456,7 @@ BM_INLINE float BMO_Get_MapFloat(BMesh *bm, BMOperator *op, char *slotname,
return 0.0f;
}
-BM_INLINE int BMO_Get_MapInt(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE int BMO_Get_MapInt(BMesh *bm, BMOperator *op, const char *slotname,
void *element)
{
int *val = (int*) BMO_Get_MapData(bm, op, slotname, element);
@@ -462,7 +465,7 @@ BM_INLINE int BMO_Get_MapInt(BMesh *bm, BMOperator *op, char *slotname,
return 0;
}
-BM_INLINE void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, char *slotname,
+BM_INLINE void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, const char *slotname,
void *element)
{
void **val = (void**) BMO_Get_MapData(bm, op, slotname, element);
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index 7df30f61136..6b4420d5eeb 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -40,12 +40,15 @@
#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "bmesh.h"
#include "bmesh_private.h"
-#include "math.h"
-#include "stdio.h"
-#include "string.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
#define SELECT 1
#define BM_EDGEVERT (1<<14)
@@ -494,7 +497,7 @@ BMesh *BM_Copy_Mesh(BMesh *bmold)
v2 = BM_Make_Vert(bm, v->co, NULL);
BM_Copy_Attributes(bmold, bm, v, v2);
BLI_array_growone(vtable);
- VECCOPY(v2->no, v->no);
+ copy_v3_v3(v2->no, v->no);
vtable[BLI_array_count(vtable)-1] = v2;
@@ -544,7 +547,7 @@ BMesh *BM_Copy_Mesh(BMesh *bmold)
ftable[i] = f2;
BM_Copy_Attributes(bmold, bm, f, f2);
- VECCOPY(f2->no, f->no);
+ copy_v3_v3(f2->no, f->no);
l = BMIter_New(&liter, bm, BM_LOOPS_OF_FACE, f2);
for (j=0; j<f->len; j++, l = BMIter_Step(&liter)) {
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index d804e0f9193..22e68f30ae1 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -272,7 +272,7 @@ void BM_Compute_Normals(BMesh *bm)
continue;
if (normalize_v3(v->no)==0.0) {
- VECCOPY(v->no, v->co);
+ copy_v3_v3(v->no, v->co);
normalize_v3(v->no);
}
}
diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c
index f1f8b1f850f..5c662614117 100644
--- a/source/blender/bmesh/intern/bmesh_mods.c
+++ b/source/blender/bmesh/intern/bmesh_mods.c
@@ -8,6 +8,7 @@
#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "bmesh.h"
#include "bmesh_private.h"
@@ -293,7 +294,7 @@ BMFace *BM_Split_Face(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2, BMLoop **nl,
if (nf) {
BM_Copy_Attributes(bm, bm, f, nf);
- VECCOPY(nf->no, f->no);
+ copy_v3_v3(nf->no, f->no);
}
return nf;
@@ -449,7 +450,7 @@ BMVert *BM_Split_Edge(BMesh *bm, BMVert *v, BMEdge *e, BMEdge **ne, float percen
nv = bmesh_semv(bm,v,e,ne);
if (nv == NULL) return NULL;
- VECSUB(nv->co,v2->co,v->co);
+ sub_v3_v3v3(nv->co,v2->co,v->co);
VECADDFAC(nv->co,v->co,nv->co,percent);
if (ne) {
diff --git a/source/blender/bmesh/intern/bmesh_newcore.c b/source/blender/bmesh/intern/bmesh_newcore.c
index dc0225e5440..37518457dbf 100644
--- a/source/blender/bmesh/intern/bmesh_newcore.c
+++ b/source/blender/bmesh/intern/bmesh_newcore.c
@@ -7,6 +7,7 @@
#include "BKE_DerivedMesh.h"
#include "BLI_blenlib.h"
+#include "BLI_listbase.h"
#include "BLI_mempool.h"
#include "BLI_ghash.h"
#include "BLI_array.h"
@@ -91,7 +92,7 @@ BMVert *BM_Make_Vert(BMesh *bm, float co[3], struct BMVert *example) {
if (bm->svpool)
v->head.layerdata = BLI_mempool_calloc(bm->svpool);
- if (co) VECCOPY(v->co, co);
+ if (co) copy_v3_v3(v->co, co);
if (bm->baselevel >= LAYER_TOOL) {
BMBaseVert *tv = (BMBaseVert*)v;
@@ -843,7 +844,7 @@ BMFace *BM_Join_Faces(BMesh *bm, BMFace **faces, int totface)
BM_Copy_Attributes(bm, bm, faces[0], newf);
/*add holes*/
- addlisttolist(&newf->loops, &holes);
+ BLI_movelisttolist(&newf->loops, &holes);
/*update loop face pointers*/
for (lst=newf->loops.first; lst; lst=lst->next) {
@@ -1034,7 +1035,7 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
if(rl) *rl = f2loop;
if (holes) {
- addlisttolist(&f2->loops, holes);
+ BLI_movelisttolist(&f2->loops, holes);
} else {
/*this code is not significant until holes actually work ;) */
//printf("warning: call to split face euler without holes argument; holes will be tossed.\n");
diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c
index 14dfac18cba..d193f62d2ad 100644
--- a/source/blender/bmesh/intern/bmesh_operators.c
+++ b/source/blender/bmesh/intern/bmesh_operators.c
@@ -18,10 +18,10 @@
static void alloc_flag_layer(BMesh *bm);
static void free_flag_layer(BMesh *bm);
static void clear_flag_layer(BMesh *bm);
-static int bmesh_name_to_slotcode(BMOpDefine *def, char *name);
-static int bmesh_opname_to_opcode(char *opname);
+static int bmesh_name_to_slotcode(BMOpDefine *def, const char *name);
+static int bmesh_opname_to_opcode(const char *opname);
-static char *bmop_error_messages[] = {
+static const char *bmop_error_messages[] = {
0,
"Self intersection error",
"Could not dissolve vert",
@@ -93,7 +93,7 @@ void BMO_pop(BMesh *bm)
*
*/
-void BMO_Init_Op(BMOperator *op, char *opname)
+void BMO_Init_Op(BMOperator *op, const char *opname)
{
int i, opcode = bmesh_opname_to_opcode(opname);
@@ -172,7 +172,7 @@ void BMO_Finish_Op(BMesh *bm, BMOperator *op)
*
*/
-BMOpSlot *BMO_GetSlot(BMOperator *op, char *slotname)
+BMOpSlot *BMO_GetSlot(BMOperator *op, const char *slotname)
{
int slotcode = bmesh_name_to_slotcode(opdefines[op->type], slotname);
@@ -186,7 +186,7 @@ BMOpSlot *BMO_GetSlot(BMOperator *op, char *slotname)
*
*/
-void BMO_CopySlot(BMOperator *source_op, BMOperator *dest_op, char *src, char *dst)
+void BMO_CopySlot(BMOperator *source_op, BMOperator *dest_op, const char *src, const char *dst)
{
BMOpSlot *source_slot = BMO_GetSlot(source_op, src);
BMOpSlot *dest_slot = BMO_GetSlot(dest_op, dst);
@@ -247,7 +247,7 @@ void BMO_CopySlot(BMOperator *source_op, BMOperator *dest_op, char *src, char *d
*/
-void BMO_Set_Float(BMOperator *op, char *slotname, float f)
+void BMO_Set_Float(BMOperator *op, const char *slotname, float f)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_FLT) )
@@ -256,7 +256,7 @@ void BMO_Set_Float(BMOperator *op, char *slotname, float f)
slot->data.f = f;
}
-void BMO_Set_Int(BMOperator *op, char *slotname, int i)
+void BMO_Set_Int(BMOperator *op, const char *slotname, int i)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_INT) )
@@ -266,7 +266,7 @@ void BMO_Set_Int(BMOperator *op, char *slotname, int i)
}
/*only supports square mats*/
-void BMO_Set_Mat(struct BMOperator *op, char *slotname, float *mat, int size)
+void BMO_Set_Mat(struct BMOperator *op, const char *slotname, float *mat, int size)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_MAT) )
@@ -287,7 +287,7 @@ void BMO_Set_Mat(struct BMOperator *op, char *slotname, float *mat, int size)
}
}
-void BMO_Get_Mat4(struct BMOperator *op, char *slotname, float mat[4][4])
+void BMO_Get_Mat4(struct BMOperator *op, const char *slotname, float mat[4][4])
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_MAT) )
@@ -296,7 +296,7 @@ void BMO_Get_Mat4(struct BMOperator *op, char *slotname, float mat[4][4])
memcpy(mat, slot->data.p, sizeof(float)*4*4);
}
-void BMO_Get_Mat3(struct BMOperator *op, char *slotname, float mat[3][3])
+void BMO_Get_Mat3(struct BMOperator *op, const char *slotname, float mat[3][3])
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_MAT) )
@@ -305,7 +305,7 @@ void BMO_Get_Mat3(struct BMOperator *op, char *slotname, float mat[3][3])
copy_m3_m4(mat, slot->data.p);
}
-void BMO_Set_Pnt(BMOperator *op, char *slotname, void *p)
+void BMO_Set_Pnt(BMOperator *op, const char *slotname, void *p)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_PNT) )
@@ -314,17 +314,17 @@ void BMO_Set_Pnt(BMOperator *op, char *slotname, void *p)
slot->data.p = p;
}
-void BMO_Set_Vec(BMOperator *op, char *slotname, float *vec)
+void BMO_Set_Vec(BMOperator *op, const char *slotname, float *vec)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_VEC) )
return;
- VECCOPY(slot->data.vec, vec);
+ copy_v3_v3(slot->data.vec, vec);
}
-float BMO_Get_Float(BMOperator *op, char *slotname)
+float BMO_Get_Float(BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_FLT) )
@@ -333,7 +333,7 @@ float BMO_Get_Float(BMOperator *op, char *slotname)
return slot->data.f;
}
-int BMO_Get_Int(BMOperator *op, char *slotname)
+int BMO_Get_Int(BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_INT) )
@@ -343,7 +343,7 @@ int BMO_Get_Int(BMOperator *op, char *slotname)
}
-void *BMO_Get_Pnt(BMOperator *op, char *slotname)
+void *BMO_Get_Pnt(BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_PNT) )
@@ -352,13 +352,13 @@ void *BMO_Get_Pnt(BMOperator *op, char *slotname)
return slot->data.p;
}
-void BMO_Get_Vec(BMOperator *op, char *slotname, float *vec_out)
+void BMO_Get_Vec(BMOperator *op, const char *slotname, float *vec_out)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
if( !(slot->slottype == BMOP_OPSLOT_VEC) )
return;
- VECCOPY(vec_out, slot->data.vec);
+ copy_v3_v3(vec_out, slot->data.vec);
}
/*
@@ -416,7 +416,7 @@ void BMO_Clear_Flag_All(BMesh *bm, BMOperator *op, int type, int flag) {
}
}
-int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, char *slotname)
+int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -427,7 +427,7 @@ int BMO_CountSlotBuf(struct BMesh *bm, struct BMOperator *op, char *slotname)
return slot->len;
}
-int BMO_CountSlotMap(BMesh *bm, BMOperator *op, char *slotname)
+int BMO_CountSlotMap(BMesh *bm, BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -472,7 +472,7 @@ void *BMO_Grow_Array(BMesh *bm, BMOperator *op, int slotcode, int totadd) {
#endif
void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op,
- char *slotname, int flag)
+ const char *slotname, int flag)
{
GHashIterator it;
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -488,7 +488,7 @@ void BMO_Mapping_To_Flag(struct BMesh *bm, struct BMOperator *op,
}
}
-static void *alloc_slot_buffer(BMOperator *op, char *slotname, int len){
+static void *alloc_slot_buffer(BMOperator *op, const char *slotname, int len){
int slotcode = bmesh_name_to_slotcode(opdefines[op->type], slotname);
/*check if its actually a buffer*/
@@ -510,7 +510,7 @@ static void *alloc_slot_buffer(BMOperator *op, char *slotname, int len){
*
*/
-void BMO_All_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int type)
+void BMO_All_To_Slot(BMesh *bm, BMOperator *op, const char *slotname, int type)
{
BMIter elements;
BMHeader *e;
@@ -556,7 +556,7 @@ void BMO_All_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int type)
*
*/
-void BMO_HeaderFlag_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_HeaderFlag_To_Slot(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMIter elements;
BMHeader *e;
@@ -607,7 +607,7 @@ void BMO_HeaderFlag_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int flag,
* into an output slot for an operator.
*
*/
-void BMO_Flag_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_Flag_To_Slot(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMIter elements;
BMHeader *e;
@@ -657,7 +657,7 @@ void BMO_Flag_To_Slot(BMesh *bm, BMOperator *op, char *slotname, int flag, int t
*
*/
-void BMO_HeaderFlag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_HeaderFlag_Buffer(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
BMHeader **data = slot->data.p;
@@ -682,7 +682,7 @@ void BMO_HeaderFlag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag,
*
*/
-void BMO_UnHeaderFlag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_UnHeaderFlag_Buffer(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
BMHeader **data = slot->data.p;
@@ -724,7 +724,7 @@ int BMO_Vert_CountEdgeFlags(BMesh *bm, BMVert *v, int toolflag)
*
*/
-void BMO_Flag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_Flag_Buffer(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
BMHeader **data = slot->data.p;
@@ -746,7 +746,7 @@ void BMO_Flag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag, int ty
*
*/
-void BMO_Unflag_Buffer(BMesh *bm, BMOperator *op, char *slotname, int flag, int type)
+void BMO_Unflag_Buffer(BMesh *bm, BMOperator *op, const char *slotname, int flag, int type)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
BMHeader **data = slot->data.p;
@@ -873,7 +873,7 @@ static void clear_flag_layer(BMesh *bm)
}
}
-void *BMO_FirstElem(BMOperator *op, char *slotname)
+void *BMO_FirstElem(BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -884,7 +884,7 @@ void *BMO_FirstElem(BMOperator *op, char *slotname)
}
void *BMO_IterNew(BMOIter *iter, BMesh *bm, BMOperator *op,
- char *slotname, int restrict)
+ const char *slotname, int restrict)
{
BMOpSlot *slot = BMO_GetSlot(op, slotname);
@@ -953,7 +953,7 @@ typedef struct bmop_error {
struct bmop_error *next, *prev;
int errorcode;
BMOperator *op;
- char *msg;
+ const char *msg;
} bmop_error;
void BMO_ClearStack(BMesh *bm)
@@ -961,7 +961,7 @@ void BMO_ClearStack(BMesh *bm)
while (BMO_PopError(bm, NULL, NULL));
}
-void BMO_RaiseError(BMesh *bm, BMOperator *owner, int errcode, char *msg)
+void BMO_RaiseError(BMesh *bm, BMOperator *owner, int errcode, const char *msg)
{
bmop_error *err = MEM_callocN(sizeof(bmop_error), "bmop_error");
@@ -979,7 +979,7 @@ int BMO_HasError(BMesh *bm)
}
/*returns error code or 0 if no error*/
-int BMO_GetError(BMesh *bm, char **msg, BMOperator **op)
+int BMO_GetError(BMesh *bm, const char **msg, BMOperator **op)
{
bmop_error *err = bm->errorstack.first;
if (!err) return 0;
@@ -990,7 +990,7 @@ int BMO_GetError(BMesh *bm, char **msg, BMOperator **op)
return err->errorcode;
}
-int BMO_PopError(BMesh *bm, char **msg, BMOperator **op)
+int BMO_PopError(BMesh *bm, const char **msg, BMOperator **op)
{
int errorcode = BMO_GetError(bm, msg, op);
@@ -1006,12 +1006,12 @@ int BMO_PopError(BMesh *bm, char **msg, BMOperator **op)
/*
typedef struct bflag {
- char *str;
+ const char *str;
int flag;
} bflag;
#define b(f) {#f, f},
-static char *bmesh_flags = {
+static const char *bmesh_flags = {
b(BM_SELECT);
b(BM_SEAM);
b(BM_FGON);
@@ -1021,7 +1021,7 @@ static char *bmesh_flags = {
{NULL, 0};
};
-int bmesh_str_to_flag(char *str)
+int bmesh_str_to_flag(const char *str)
{
int i;
@@ -1051,7 +1051,7 @@ int bmesh_str_to_flag(char *str)
#define nextc(fmt) ((fmt)[0] != 0 ? (fmt)[1] : 0)
-static int bmesh_name_to_slotcode(BMOpDefine *def, char *name)
+static int bmesh_name_to_slotcode(BMOpDefine *def, const char *name)
{
int i;
@@ -1063,7 +1063,7 @@ static int bmesh_name_to_slotcode(BMOpDefine *def, char *name)
return 0;
}
-static int bmesh_name_to_slotcode_check(BMOpDefine *def, char *name)
+static int bmesh_name_to_slotcode_check(BMOpDefine *def, const char *name)
{
int i;
@@ -1075,7 +1075,7 @@ static int bmesh_name_to_slotcode_check(BMOpDefine *def, char *name)
return -1;
}
-static int bmesh_opname_to_opcode(char *opname) {
+static int bmesh_opname_to_opcode(const char *opname) {
int i;
for (i=0; i<bmesh_total_ops; i++) {
@@ -1090,10 +1090,10 @@ static int bmesh_opname_to_opcode(char *opname) {
return i;
}
-int BMO_VInitOpf(BMesh *bm, BMOperator *op, char *fmt, va_list vlist)
+int BMO_VInitOpf(BMesh *bm, BMOperator *op, const char *_fmt, va_list vlist)
{
BMOpDefine *def;
- char *opname, *ofmt;
+ char *opname, *ofmt, *fmt = (char*)_fmt;
char slotname[64] = {0};
int i, n=strlen(fmt), stop, slotcode = -1, ret, type, state, c;
int noslot=0;
@@ -1186,7 +1186,7 @@ int BMO_VInitOpf(BMesh *bm, BMOperator *op, char *fmt, va_list vlist)
}
case 's': {
BMOperator *op2 = va_arg(vlist, void*);
- char *slotname2 = va_arg(vlist, char*);
+ const char *slotname2 = va_arg(vlist, char*);
BMO_CopySlot(op2, op, slotname2, slotname);
state = 1;
@@ -1254,7 +1254,7 @@ error:
}
-int BMO_InitOpf(BMesh *bm, BMOperator *op, char *fmt, ...) {
+int BMO_InitOpf(BMesh *bm, BMOperator *op, const char *fmt, ...) {
va_list list;
va_start(list, fmt);
@@ -1268,7 +1268,7 @@ int BMO_InitOpf(BMesh *bm, BMOperator *op, char *fmt, ...) {
return 1;
}
-int BMO_CallOpf(BMesh *bm, char *fmt, ...) {
+int BMO_CallOpf(BMesh *bm, const char *fmt, ...) {
va_list list;
BMOperator op;
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c
index 08c555631eb..6a30d1c0a96 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -7,6 +7,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
@@ -100,9 +101,9 @@ static void compute_poly_normal(float normal[3], float (*verts)[3], int nverts)
verts[0][2] += 0.0001f;
for(i = 0; i < nverts; i++){
- VECCOPY(u, verts[i]);
- VECCOPY(v, verts[(i+1) % nverts]);
- VECCOPY(w, verts[(i+2) % nverts]);
+ copy_v3_v3(u, verts[i]);
+ copy_v3_v3(v, verts[(i+1) % nverts]);
+ copy_v3_v3(w, verts[(i+2) % nverts]);
#if 0
VECSUB(v1, w, v);
@@ -242,8 +243,10 @@ int BM_Compute_Face_Center(BMesh *bm, BMFace *f, float center[3])
DO_MINMAX(l->v->co, min, max);
}
- VECADD(center, min, max);
- VECMUL(center, 0.5f);
+ add_v3_v3v3(center, min, max);
+ mul_v3_fl(center, 0.5f);
+
+ return 0;
}
/*
@@ -318,34 +321,34 @@ static void shrink_edged(double *v1, double *v2, double fac)
{
double mid[3];
- VECADD(mid, v1, v2);
- VECMUL(mid, 0.5);
+ add_v3_v3v3(mid, v1, v2);
+ mul_v3_fl(mid, 0.5);
- VECSUB(v1, v1, mid);
- VECSUB(v2, v2, mid);
+ sub_v3_v3v3(v1, v1, mid);
+ sub_v3_v3v3(v2, v2, mid);
- VECMUL(v1, fac);
- VECMUL(v2, fac);
+ mul_v3_fl(v1, fac);
+ mul_v3_fl(v2, fac);
- VECADD(v1, v1, mid);
- VECADD(v2, v2, mid);
+ add_v3_v3v3(v1, v1, mid);
+ add_v3_v3v3(v2, v2, mid);
}
static void shrink_edgef(float *v1, float *v2, float fac)
{
float mid[3];
- VECADD(mid, v1, v2);
- VECMUL(mid, 0.5);
+ add_v3_v3v3(mid, v1, v2);
+ mul_v3_fl(mid, 0.5);
- VECSUB(v1, v1, mid);
- VECSUB(v2, v2, mid);
+ sub_v3_v3v3(v1, v1, mid);
+ sub_v3_v3v3(v2, v2, mid);
- VECMUL(v1, fac);
- VECMUL(v2, fac);
+ mul_v3_fl(v1, fac);
+ mul_v3_fl(v2, fac);
- VECADD(v1, v1, mid);
- VECADD(v2, v2, mid);
+ add_v3_v3v3(v1, v1, mid);
+ add_v3_v3v3(v2, v2, mid);
}
/*
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c
index 6365482541c..0d6e0c45050 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -3,10 +3,11 @@
#include "bmesh.h"
#include "bmesh_private.h"
+#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "BLI_array.h"
-
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#define BM_OVERLAP (1<<13)
diff --git a/source/blender/bmesh/operators/createops.c b/source/blender/bmesh/operators/createops.c
index 39a717d68df..fda4bd83b5f 100644
--- a/source/blender/bmesh/operators/createops.c
+++ b/source/blender/bmesh/operators/createops.c
@@ -165,6 +165,8 @@ struct BMEdge *rotsys_reverse(struct BMEdge *e, struct BMVert *v, EdgeData *edat
}
BLI_array_free(edges);
+
+ return 0;
}
int rotsys_count(struct BMVert *v, EdgeData *edata, VertData *vdata)
@@ -253,6 +255,8 @@ int rotsys_fill_faces(BMesh *bm, EdgeData *edata, VertData *vdata)
continue;
}
}
+
+ return 0;
}
void rotsys_make_consistent(BMesh *bm, EdgeData *edata, VertData *vdata)
diff --git a/source/blender/bmesh/operators/edgesplitop.c b/source/blender/bmesh/operators/edgesplitop.c
index 46cc3bb36e6..41d407abc4b 100644
--- a/source/blender/bmesh/operators/edgesplitop.c
+++ b/source/blender/bmesh/operators/edgesplitop.c
@@ -273,7 +273,7 @@ void bmesh_edgesplitop_exec(BMesh *bm, BMOperator *op)
if (!verts[j ? (i+1) % f->len : i]) {
/*make unique vert here for this face only*/
v2 = BM_Make_Vert(bm, v->co, NULL);
- VECCOPY(v2->no, v->no);
+ copy_v3_v3(v2->no, v->no);
BM_Copy_Attributes(bm, bm, v, v2);
verts[j ? (i+1) % f->len : i] = v2;
@@ -303,7 +303,7 @@ void bmesh_edgesplitop_exec(BMesh *bm, BMOperator *op)
et = etags + BMINDEX_GET(l2->e);
if (ETV(et, v, l2) == NULL) {
v2 = BM_Make_Vert(bm, v->co, NULL);
- VECCOPY(v2->no, v->no);
+ copy_v3_v3(v2->no, v->no);
BM_Copy_Attributes(bm, bm, v, v2);
l3 = l2;
diff --git a/source/blender/bmesh/operators/extrudeops.c b/source/blender/bmesh/operators/extrudeops.c
index e6b7a8aba2a..5bd86eeb00e 100644
--- a/source/blender/bmesh/operators/extrudeops.c
+++ b/source/blender/bmesh/operators/extrudeops.c
@@ -144,7 +144,7 @@ void extrude_vert_indiv_exec(BMesh *bm, BMOperator *op)
v = BMO_IterNew(&siter, bm, op, "verts", BM_VERT);
for (; v; v=BMO_IterStep(&siter)) {
dupev = BM_Make_Vert(bm, v->co, NULL);
- VECCOPY(dupev->no, v->no);
+ copy_v3_v3(dupev->no, v->no);
BM_Copy_Attributes(bm, bm, v, dupev);
e = BM_Make_Edge(bm, v, dupev, NULL, 0);
diff --git a/source/blender/bmesh/operators/mesh_conv.c b/source/blender/bmesh/operators/mesh_conv.c
index 942951c11c1..4cbb0b12b5c 100644
--- a/source/blender/bmesh/operators/mesh_conv.c
+++ b/source/blender/bmesh/operators/mesh_conv.c
@@ -21,11 +21,13 @@
#include "BKE_key.h"
#include "BKE_main.h"
+#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
#include "BLI_scanfill.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "ED_mesh.h"
@@ -118,7 +120,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
for (i=0; i<me->totvert; i++, mvert++) {
v = BM_Make_Vert(bm, keyco ? keyco[i] : mvert->co, NULL);
- VECCOPY(v->no, mvert->no);
+ copy_v3_v3(v->no, mvert->no);
vt[i] = v;
BMINDEX_SET(v, i);
@@ -437,7 +439,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) {
}
BLI_addfilledge(lasteve, firsteve);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
for (efa=fillfacebase.first; efa; efa=efa->next)
totface++;
@@ -479,7 +481,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op) {
}
BLI_addfilledge(lasteve, firsteve);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
for (efa=fillfacebase.first; efa; efa=efa->next) {
ls[0] = efa->v1->tmp.p;
diff --git a/source/blender/bmesh/operators/mirror.c b/source/blender/bmesh/operators/mirror.c
index 7a665c3f6b4..f53d8b7b762 100644
--- a/source/blender/bmesh/operators/mirror.c
+++ b/source/blender/bmesh/operators/mirror.c
@@ -1,17 +1,20 @@
#include "MEM_guardedalloc.h"
-#include "BKE_customdata.h"
+
#include "DNA_listBase.h"
#include "DNA_customdata_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+
#include <string.h>
-#include "BKE_utildefines.h"
+
+#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_global.h"
#include "BKE_DerivedMesh.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_utildefines.h"
#include "BLI_editVert.h"
#include "mesh_intern.h"
@@ -21,6 +24,7 @@
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "bmesh.h"
diff --git a/source/blender/bmesh/operators/removedoubles.c b/source/blender/bmesh/operators/removedoubles.c
index a6d921a1bf1..f806fd33a6b 100644
--- a/source/blender/bmesh/operators/removedoubles.c
+++ b/source/blender/bmesh/operators/removedoubles.c
@@ -11,6 +11,7 @@
#include "BLI_ghash.h"
#include "BLI_blenlib.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "bmesh.h"
#include "mesh_intern.h"
@@ -317,7 +318,7 @@ void bmesh_pointmerge_exec(BMesh *bm, BMOperator *op)
BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
if (!snapv) {
snapv = v;
- VECCOPY(snapv->co, vec);
+ copy_v3_v3(snapv->co, vec);
} else {
BMO_Insert_MapPointer(bm, &weldop, "targetmap", v, snapv);
}
@@ -359,8 +360,8 @@ void bmesh_collapse_exec(BMesh *bm, BMOperator *op)
DO_MINMAX(e->v2->co, min, max);
}
- VECADD(min, min, max);
- VECMUL(min, 0.5f);
+ add_v3_v3v3(min, min, max);
+ mul_v3_fl(min, 0.5f);
/*snap edges to a point. for initial testing purposes anyway.*/
for (i=0; i<tot; i++) {
diff --git a/source/blender/bmesh/operators/subdivideop.c b/source/blender/bmesh/operators/subdivideop.c
index e55b1071787..f6833f8727b 100644
--- a/source/blender/bmesh/operators/subdivideop.c
+++ b/source/blender/bmesh/operators/subdivideop.c
@@ -34,6 +34,7 @@
#include "BLI_rand.h"
#include "BLI_ghash.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_windowmanager_types.h"
@@ -126,8 +127,8 @@ static void alter_co(float *co, BMEdge *edge, subdparams *params, float perc,
sub_v3_v3v3(nor, vsta->co, vend->co);
len= 0.5f*normalize_v3(nor);
- VECCOPY(nor1, vsta->no);
- VECCOPY(nor2, vend->no);
+ copy_v3_v3(nor1, vsta->no);
+ copy_v3_v3(nor2, vend->no);
/* cosine angle */
fac= nor[0]*nor1[0] + nor[1]*nor1[1] + nor[2]*nor1[2] ;
@@ -265,7 +266,7 @@ v3---------v2
v4---v0---v1
*/
-static void quad_1edge_split(BMesh *bm, BMFace *face,
+static void quad_1edge_split(BMesh *bm, BMFace *UNUSED(face),
BMVert **verts, subdparams *params) {
BMFace *nf;
int i, add, numcuts = params->numcuts;
@@ -310,7 +311,7 @@ v6--------v5
v7-v0--v1-v2
*/
-static void quad_2edge_split_path(BMesh *bm, BMFace *face, BMVert **verts,
+static void quad_2edge_split_path(BMesh *bm, BMFace *UNUSED(face), BMVert **verts,
subdparams *params)
{
BMFace *nf;
@@ -338,7 +339,7 @@ v6--------v5
v7-v0--v1-v2
*/
-static void quad_2edge_split_innervert(BMesh *bm, BMFace *face, BMVert **verts,
+static void quad_2edge_split_innervert(BMesh *bm, BMFace *UNUSED(face), BMVert **verts,
subdparams *params)
{
BMFace *nf;
diff --git a/source/blender/bmesh/operators/utils.c b/source/blender/bmesh/operators/utils.c
index b22099a509a..83d97280ef0 100644
--- a/source/blender/bmesh/operators/utils.c
+++ b/source/blender/bmesh/operators/utils.c
@@ -64,7 +64,7 @@ void bmesh_translate_exec(BMesh *bm, BMOperator *op)
BMO_Get_Vec(op, "vec", vec);
unit_m4(mat);
- VECCOPY(mat[3], vec);
+ copy_v3_v3(mat[3], vec);
BMO_CallOpf(bm, "transform mat=%m4 verts=%s", mat, op, "verts");
}
@@ -360,12 +360,12 @@ void bmesh_vertexsmooth_exec(BMesh *bm, BMOperator *op)
j = 0;
BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
co2 = BM_OtherEdgeVert(e, v)->co;
- VECADD(co, co, co2);
+ add_v3_v3v3(co, co, co2);
j += 1;
}
if (!j) {
- VECCOPY(co, v->co);
+ copy_v3_v3(co, v->co);
i++;
continue;
}
@@ -390,7 +390,7 @@ void bmesh_vertexsmooth_exec(BMesh *bm, BMOperator *op)
i = 0;
BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
- VECCOPY(v->co, cos[i]);
+ copy_v3_v3(v->co, cos[i]);
i++;
}
@@ -1056,13 +1056,10 @@ void bmesh_reverseuvs_exec(BMesh *bm, BMOperator *op)
BMIter l_iter; /* iteration loop */
BLI_array_declare(uvs);
float (*uvs)[2] = NULL;
- int max_vert_count = 0;
BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
if( CustomData_has_layer(&(bm->ldata), CD_MLOOPUV) ) {
BMLoop *lf; /* current face loops */
- MLoopUV *f_luv; /* first face loop uv */
- int num_verts = fs->len;
int i = 0;
BLI_array_empty(uvs);
@@ -1165,14 +1162,10 @@ void bmesh_reversecolors_exec(BMesh *bm, BMOperator *op)
BMIter l_iter; /* iteration loop */
BLI_array_declare(cols);
MLoopCol *cols = NULL;
- int max_vert_count = 0;
-
BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
if( CustomData_has_layer(&(bm->ldata), CD_MLOOPCOL) ) {
BMLoop *lf; /* current face loops */
- MLoopCol *f_lcol; /* first face loop color */
- int num_verts = fs->len;
int i = 0;
BLI_array_empty(cols);
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
new file mode 100644
index 00000000000..21cd71a90dc
--- /dev/null
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -0,0 +1,1152 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "DNA_armature_types.h"
+
+#include "ED_keyframing.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+#include "BKE_fcurve.h"
+#include "BKE_object.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "collada_utils.h"
+#include "AnimationImporter.h"
+#include "ArmatureImporter.h"
+
+#include <algorithm>
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+FCurve *AnimationImporter::create_fcurve(int array_index, const char *rna_path)
+{
+ FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+ fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
+ fcu->array_index = array_index;
+ return fcu;
+}
+
+void AnimationImporter::create_bezt(FCurve *fcu, float frame, float output)
+{
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+ bez.vec[1][0] = frame;
+ bez.vec[1][1] = output;
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ calchandles_fcurve(fcu);
+}
+
+// create one or several fcurves depending on the number of parameters being animated
+void AnimationImporter::animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
+{
+ COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
+ COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
+ // COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
+ // COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
+ float fps = (float)FPS;
+ size_t dim = curve->getOutDimension();
+ unsigned int i;
+
+ std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
+
+ switch (dim) {
+ case 1: // X, Y, Z or angle
+ case 3: // XYZ
+ case 16: // matrix
+ {
+ for (i = 0; i < dim; i++ ) {
+ FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+
+ fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+ // fcu->rna_path = BLI_strdupn(path, strlen(path));
+ fcu->array_index = 0;
+ //fcu->totvert = curve->getKeyCount();
+
+ // create beztriple for each key
+ for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+
+ // intangent
+ // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps;
+ // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1);
+
+ // input, output
+ bez.vec[1][0] = bc_get_float_value(input, j) * fps;
+ bez.vec[1][1] = bc_get_float_value(output, j * dim + i);
+
+ // outtangent
+ // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps;
+ // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1);
+
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ }
+
+ calchandles_fcurve(fcu);
+
+ fcurves.push_back(fcu);
+ }
+ }
+ break;
+ default:
+ fprintf(stderr, "Output dimension of %d is not yet supported (animation id = %s)\n", (int)dim, curve->getOriginalId().c_str());
+ }
+
+ for (std::vector<FCurve*>::iterator it = fcurves.begin(); it != fcurves.end(); it++)
+ unused_curves.push_back(*it);
+}
+
+void AnimationImporter::fcurve_deg_to_rad(FCurve *cu)
+{
+ for (unsigned int i = 0; i < cu->totvert; i++) {
+ // TODO convert handles too
+ cu->bezt[i].vec[1][1] *= M_PI / 180.0f;
+ }
+}
+
+void AnimationImporter::add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated)
+{
+ bAction *act;
+
+ if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
+ else act = ob->adt->action;
+
+ std::vector<FCurve*>::iterator it;
+ int i;
+
+#if 0
+ char *p = strstr(rna_path, "rotation_euler");
+ bool is_rotation = p && *(p + strlen("rotation_euler")) == '\0';
+
+ // convert degrees to radians for rotation
+ if (is_rotation)
+ fcurve_deg_to_rad(fcu);
+#endif
+
+ for (it = curves.begin(), i = 0; it != curves.end(); it++, i++) {
+ FCurve *fcu = *it;
+ fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
+
+ if (array_index == -1) fcu->array_index = i;
+ else fcu->array_index = array_index;
+
+ if (ob->type == OB_ARMATURE) {
+ bActionGroup *grp = NULL;
+ const char *bone_name = bc_get_joint_name(animated->node);
+
+ if (bone_name) {
+ /* try to find group */
+ grp = action_groups_find_named(act, bone_name);
+
+ /* no matching groups, so add one */
+ if (grp == NULL) {
+ /* Add a new group, and make it active */
+ grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ grp->flag = AGRP_SELECTED;
+ BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
+
+ BLI_addtail(&act->groups, grp);
+ BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
+ }
+
+ /* add F-Curve to group */
+ action_groups_add_channel(act, grp, fcu);
+
+ }
+#if 0
+ if (is_rotation) {
+ fcurves_actionGroup_map[grp].push_back(fcu);
+ }
+#endif
+ }
+ else {
+ BLI_addtail(&act->curves, fcu);
+ }
+
+ // curve is used, so remove it from unused_curves
+ unused_curves.erase(std::remove(unused_curves.begin(), unused_curves.end(), fcu), unused_curves.end());
+ }
+}
+
+AnimationImporter::AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene) :
+ TransformReader(conv), armature_importer(arm), scene(scene) { }
+
+AnimationImporter::~AnimationImporter()
+{
+ // free unused FCurves
+ for (std::vector<FCurve*>::iterator it = unused_curves.begin(); it != unused_curves.end(); it++)
+ free_fcurve(*it);
+
+ if (unused_curves.size())
+ fprintf(stderr, "removed %d unused curves\n", (int)unused_curves.size());
+}
+
+bool AnimationImporter::write_animation(const COLLADAFW::Animation* anim)
+{
+ if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
+ COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
+
+ // XXX Don't know if it's necessary
+ // Should we check outPhysicalDimension?
+ if (curve->getInPhysicalDimension() != COLLADAFW::PHYSICAL_DIMENSION_TIME) {
+ fprintf(stderr, "Inputs physical dimension is not time. \n");
+ return true;
+ }
+
+ // a curve can have mixed interpolation type,
+ // in this case curve->getInterpolationTypes returns a list of interpolation types per key
+ COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
+
+ if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
+ switch (interp) {
+ case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
+ case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
+ animation_to_fcurves(curve);
+ break;
+ default:
+ // TODO there're also CARDINAL, HERMITE, BSPLINE and STEP types
+ fprintf(stderr, "CARDINAL, HERMITE, BSPLINE and STEP anim interpolation types not supported yet.\n");
+ break;
+ }
+ }
+ else {
+ // not supported yet
+ fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n");
+ }
+ }
+ else {
+ fprintf(stderr, "FORMULA animation type is not supported yet.\n");
+ }
+
+ return true;
+}
+
+// called on post-process stage after writeVisualScenes
+bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* animlist)
+{
+ const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
+
+ animlist_map[animlist_id] = animlist;
+
+#if 0
+ // should not happen
+ if (uid_animated_map.find(animlist_id) == uid_animated_map.end()) {
+ return true;
+ }
+
+ // for bones rna_path is like: pose.bones["bone-name"].rotation
+
+ // what does this AnimationList animate?
+ Animation& animated = uid_animated_map[animlist_id];
+ Object *ob = animated.ob;
+
+ char rna_path[100];
+ char joint_path[100];
+ bool is_joint = false;
+
+ // if ob is NULL, it should be a JOINT
+ if (!ob) {
+ ob = armature_importer->get_armature_for_joint(animated.node);
+
+ if (!ob) {
+ fprintf(stderr, "Cannot find armature for node %s\n", get_joint_name(animated.node));
+ return true;
+ }
+
+ armature_importer->get_rna_path_for_joint(animated.node, joint_path, sizeof(joint_path));
+
+ is_joint = true;
+ }
+
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ switch (animated.tm->getTransformationType()) {
+ case COLLADAFW::Transformation::TRANSLATE:
+ case COLLADAFW::Transformation::SCALE:
+ {
+ bool loc = animated.tm->getTransformationType() == COLLADAFW::Transformation::TRANSLATE;
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, loc ? "location" : "scale");
+ else
+ BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
+
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+ COLLADAFW::UniqueId anim_uid = binding.animation;
+
+ if (curve_map.find(anim_uid) == curve_map.end()) {
+ fprintf(stderr, "Cannot find FCurve by animation UID.\n");
+ continue;
+ }
+
+ std::vector<FCurve*>& fcurves = curve_map[anim_uid];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::POSITION_X:
+ add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ add_fcurves_to_object(ob, fcurves, rna_path, -1, &animated);
+ break;
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
+ binding.animationClass, loc ? "TRANSLATE" : "SCALE");
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::ROTATE:
+ {
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
+ else
+ BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
+
+ COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)animated.tm;
+ COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
+
+ for (int i = 0; i < bindings.getCount(); i++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
+ COLLADAFW::UniqueId anim_uid = binding.animation;
+
+ if (curve_map.find(anim_uid) == curve_map.end()) {
+ fprintf(stderr, "Cannot find FCurve by animation UID.\n");
+ continue;
+ }
+
+ std::vector<FCurve*>& fcurves = curve_map[anim_uid];
+
+ switch (binding.animationClass) {
+ case COLLADAFW::AnimationList::ANGLE:
+ if (COLLADABU::Math::Vector3::UNIT_X == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
+ }
+ else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
+ add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
+ }
+ break;
+ case COLLADAFW::AnimationList::AXISANGLE:
+ // TODO convert axis-angle to quat? or XYZ?
+ default:
+ fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
+ binding.animationClass);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ case COLLADAFW::Transformation::SKEW:
+ case COLLADAFW::Transformation::LOOKAT:
+ fprintf(stderr, "Animation of MATRIX, SKEW and LOOKAT transformations is not supported yet.\n");
+ break;
+ }
+#endif
+
+ return true;
+}
+
+void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob)
+{
+ float mat[4][4];
+ TransformReader::get_node_mat(mat, node, &uid_animated_map, ob);
+ if (ob) {
+ copy_m4_m4(ob->obmat, mat);
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+ }
+}
+
+#if 0
+virtual void AnimationImporter::change_eul_to_quat(Object *ob, bAction *act)
+{
+ bActionGroup *grp;
+ int i;
+
+ for (grp = (bActionGroup*)act->groups.first; grp; grp = grp->next) {
+
+ FCurve *eulcu[3] = {NULL, NULL, NULL};
+
+ if (fcurves_actionGroup_map.find(grp) == fcurves_actionGroup_map.end())
+ continue;
+
+ std::vector<FCurve*> &rot_fcurves = fcurves_actionGroup_map[grp];
+
+ if (rot_fcurves.size() > 3) continue;
+
+ for (i = 0; i < rot_fcurves.size(); i++)
+ eulcu[rot_fcurves[i]->array_index] = rot_fcurves[i];
+
+ char joint_path[100];
+ char rna_path[100];
+
+ BLI_snprintf(joint_path, sizeof(joint_path), "pose.bones[\"%s\"]", grp->name);
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_quaternion", joint_path);
+
+ FCurve *quatcu[4] = {
+ create_fcurve(0, rna_path),
+ create_fcurve(1, rna_path),
+ create_fcurve(2, rna_path),
+ create_fcurve(3, rna_path)
+ };
+
+ bPoseChannel *chan = get_pose_channel(ob->pose, grp->name);
+
+ float m4[4][4], irest[3][3];
+ invert_m4_m4(m4, chan->bone->arm_mat);
+ copy_m3_m4(irest, m4);
+
+ for (i = 0; i < 3; i++) {
+
+ FCurve *cu = eulcu[i];
+
+ if (!cu) continue;
+
+ for (int j = 0; j < cu->totvert; j++) {
+ float frame = cu->bezt[j].vec[1][0];
+
+ float eul[3] = {
+ eulcu[0] ? evaluate_fcurve(eulcu[0], frame) : 0.0f,
+ eulcu[1] ? evaluate_fcurve(eulcu[1], frame) : 0.0f,
+ eulcu[2] ? evaluate_fcurve(eulcu[2], frame) : 0.0f
+ };
+
+ // make eul relative to bone rest pose
+ float rot[3][3], rel[3][3], quat[4];
+
+ /*eul_to_mat3(rot, eul);
+
+ mul_m3_m3m3(rel, irest, rot);
+
+ mat3_to_quat(quat, rel);
+ */
+
+ eul_to_quat(quat, eul);
+
+ for (int k = 0; k < 4; k++)
+ create_bezt(quatcu[k], frame, quat[k]);
+ }
+ }
+
+ // now replace old Euler curves
+
+ for (i = 0; i < 3; i++) {
+ if (!eulcu[i]) continue;
+
+ action_groups_remove_channel(act, eulcu[i]);
+ free_fcurve(eulcu[i]);
+ }
+
+ chan->rotmode = ROT_MODE_QUAT;
+
+ for (i = 0; i < 4; i++)
+ action_groups_add_channel(act, grp, quatcu[i]);
+ }
+
+ bPoseChannel *pchan;
+ for (pchan = (bPoseChannel*)ob->pose->chanbase.first; pchan; pchan = pchan->next) {
+ pchan->rotmode = ROT_MODE_QUAT;
+ }
+}
+#endif
+
+// prerequisites:
+// animlist_map - map animlist id -> animlist
+// curve_map - map anim id -> curve(s)
+Object *AnimationImporter::translate_animation(COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job)
+{
+ bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
+ bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
+ bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
+
+ COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == root_map.end() ? node : root_map[node->getUniqueId()];
+ Object *ob = is_joint ? armature_importer->get_armature_for_joint(node) : object_map[node->getUniqueId()];
+ const char *bone_name = is_joint ? bc_get_joint_name(node) : NULL;
+
+ if (!ob) {
+ fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", node->getOriginalId().c_str());
+ return NULL;
+ }
+
+ // frames at which to sample
+ std::vector<float> frames;
+
+ // for each <rotate>, <translate>, etc. there is a separate Transformation
+ const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
+
+ unsigned int i;
+
+ // find frames at which to sample plus convert all rotation keys to radians
+ for (i = 0; i < tms.getCount(); i++) {
+ COLLADAFW::Transformation *tm = tms[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ if (type == tm_type) {
+ const COLLADAFW::UniqueId& listid = tm->getAnimationList();
+
+ if (animlist_map.find(listid) != animlist_map.end()) {
+ const COLLADAFW::AnimationList *animlist = animlist_map[listid];
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ if (bindings.getCount()) {
+ for (unsigned int j = 0; j < bindings.getCount(); j++) {
+ std::vector<FCurve*>& curves = curve_map[bindings[j].animation];
+ bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
+
+ if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3) || is_matrix) {
+ std::vector<FCurve*>::iterator iter;
+
+ for (iter = curves.begin(); iter != curves.end(); iter++) {
+ FCurve *fcu = *iter;
+
+ if (is_rotation)
+ fcurve_deg_to_rad(fcu);
+
+ for (unsigned int k = 0; k < fcu->totvert; k++) {
+ float fra = fcu->bezt[k].vec[1][0];
+ if (std::find(frames.begin(), frames.end(), fra) == frames.end())
+ frames.push_back(fra);
+ }
+ }
+ }
+ else {
+ fprintf(stderr, "expected %d curves, got %d\n", xyz ? 3 : 1, (int)curves.size());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ float irest_dae[4][4];
+ float rest[4][4], irest[4][4];
+
+ if (is_joint) {
+ get_joint_rest_mat(irest_dae, root, node);
+ invert_m4(irest_dae);
+
+ Bone *bone = get_named_bone((bArmature*)ob->data, bone_name);
+ if (!bone) {
+ fprintf(stderr, "cannot find bone \"%s\"\n", bone_name);
+ return NULL;
+ }
+
+ unit_m4(rest);
+ copy_m4_m4(rest, bone->arm_mat);
+ invert_m4_m4(irest, rest);
+ }
+
+ Object *job = NULL;
+
+#ifdef ARMATURE_TEST
+ FCurve *job_curves[10];
+ job = get_joint_object(root, node, par_job);
+#endif
+
+ if (frames.size() == 0)
+ return job;
+
+ std::sort(frames.begin(), frames.end());
+
+ const char *tm_str = NULL;
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ tm_str = "rotation_quaternion";
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ tm_str = "scale";
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ tm_str = "location";
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ break;
+ default:
+ return job;
+ }
+
+ char rna_path[200];
+ char joint_path[200];
+
+ if (is_joint)
+ armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
+
+ // new curves
+ FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
+ unsigned int totcu = is_matrix ? 10 : (is_rotation ? 4 : 3);
+
+ for (i = 0; i < totcu; i++) {
+
+ int axis = i;
+
+ if (is_matrix) {
+ if (i < 4) {
+ tm_str = "rotation_quaternion";
+ axis = i;
+ }
+ else if (i < 7) {
+ tm_str = "location";
+ axis = i - 4;
+ }
+ else {
+ tm_str = "scale";
+ axis = i - 7;
+ }
+ }
+
+ if (is_joint)
+ BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
+ else
+ strcpy(rna_path, tm_str);
+
+ newcu[i] = create_fcurve(axis, rna_path);
+
+#ifdef ARMATURE_TEST
+ if (is_joint)
+ job_curves[i] = create_fcurve(axis, tm_str);
+#endif
+ }
+
+ std::vector<float>::iterator it;
+
+ // sample values at each frame
+ for (it = frames.begin(); it != frames.end(); it++) {
+ float fra = *it;
+
+ float mat[4][4];
+ float matfra[4][4];
+
+ unit_m4(matfra);
+
+ // calc object-space mat
+ evaluate_transform_at_frame(matfra, node, fra);
+
+ // for joints, we need a special matrix
+ if (is_joint) {
+ // special matrix: iR * M * iR_dae * R
+ // where R, iR are bone rest and inverse rest mats in world space (Blender bones),
+ // iR_dae is joint inverse rest matrix (DAE) and M is an evaluated joint world-space matrix (DAE)
+ float temp[4][4], par[4][4];
+
+ // calc M
+ calc_joint_parent_mat_rest(par, NULL, root, node);
+ mul_m4_m4m4(temp, matfra, par);
+
+ // evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
+
+ // calc special matrix
+ mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
+ }
+ else {
+ copy_m4_m4(mat, matfra);
+ }
+
+ float val[4], rot[4], loc[3], scale[3];
+
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ mat4_to_quat(val, mat);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ mat4_to_size(val, mat);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ copy_v3_v3(val, mat[3]);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ mat4_to_quat(rot, mat);
+ copy_v3_v3(loc, mat[3]);
+ mat4_to_size(scale, mat);
+ break;
+ default:
+ break;
+ }
+
+ // add keys
+ for (i = 0; i < totcu; i++) {
+ if (is_matrix) {
+ if (i < 4)
+ add_bezt(newcu[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(newcu[i], fra, loc[i - 4]);
+ else
+ add_bezt(newcu[i], fra, scale[i - 7]);
+ }
+ else {
+ add_bezt(newcu[i], fra, val[i]);
+ }
+ }
+
+#ifdef ARMATURE_TEST
+ if (is_joint) {
+ switch (tm_type) {
+ case COLLADAFW::Transformation::ROTATE:
+ mat4_to_quat(val, matfra);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ mat4_to_size(val, matfra);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ copy_v3_v3(val, matfra[3]);
+ break;
+ case MATRIX:
+ mat4_to_quat(rot, matfra);
+ copy_v3_v3(loc, matfra[3]);
+ mat4_to_size(scale, matfra);
+ break;
+ default:
+ break;
+ }
+
+ for (i = 0; i < totcu; i++) {
+ if (is_matrix) {
+ if (i < 4)
+ add_bezt(job_curves[i], fra, rot[i]);
+ else if (i < 7)
+ add_bezt(job_curves[i], fra, loc[i - 4]);
+ else
+ add_bezt(job_curves[i], fra, scale[i - 7]);
+ }
+ else {
+ add_bezt(job_curves[i], fra, val[i]);
+ }
+ }
+ }
+#endif
+ }
+
+ verify_adt_action((ID*)&ob->id, 1);
+
+ ListBase *curves = &ob->adt->action->curves;
+
+ // add curves
+ for (i = 0; i < totcu; i++) {
+ if (is_joint)
+ add_bone_fcurve(ob, node, newcu[i]);
+ else
+ BLI_addtail(curves, newcu[i]);
+
+#ifdef ARMATURE_TEST
+ if (is_joint)
+ BLI_addtail(&job->adt->action->curves, job_curves[i]);
+#endif
+ }
+
+ if (is_rotation || is_matrix) {
+ if (is_joint) {
+ bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
+ chan->rotmode = ROT_MODE_QUAT;
+ }
+ else {
+ ob->rotmode = ROT_MODE_QUAT;
+ }
+ }
+
+ return job;
+}
+
+// internal, better make it private
+// warning: evaluates only rotation
+// prerequisites: animlist_map, curve_map
+void AnimationImporter::evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra)
+{
+ const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
+
+ unit_m4(mat);
+
+ for (unsigned int i = 0; i < tms.getCount(); i++) {
+ COLLADAFW::Transformation *tm = tms[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+ float m[4][4];
+
+ unit_m4(m);
+
+ if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) {
+ switch (type) {
+ case COLLADAFW::Transformation::ROTATE:
+ dae_rotate_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ dae_translate_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ dae_scale_to_mat4(tm, m);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ dae_matrix_to_mat4(tm, m);
+ break;
+ default:
+ fprintf(stderr, "unsupported transformation type %d\n", type);
+ }
+ }
+
+ float temp[4][4];
+ copy_m4_m4(temp, mat);
+
+ mul_m4_m4m4(mat, m, temp);
+ }
+}
+
+// return true to indicate that mat contains a sane value
+bool AnimationImporter::evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id)
+{
+ const COLLADAFW::UniqueId& listid = tm->getAnimationList();
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ if (type != COLLADAFW::Transformation::ROTATE &&
+ type != COLLADAFW::Transformation::SCALE &&
+ type != COLLADAFW::Transformation::TRANSLATE &&
+ type != COLLADAFW::Transformation::MATRIX) {
+ fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
+ return false;
+ }
+
+ if (animlist_map.find(listid) == animlist_map.end())
+ return false;
+
+ const COLLADAFW::AnimationList *animlist = animlist_map[listid];
+ const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
+
+ if (bindings.getCount()) {
+ float vec[3];
+
+ bool is_scale = (type == COLLADAFW::Transformation::SCALE);
+ bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE);
+
+ if (type == COLLADAFW::Transformation::SCALE)
+ dae_scale_to_v3(tm, vec);
+ else if (type == COLLADAFW::Transformation::TRANSLATE)
+ dae_translate_to_v3(tm, vec);
+
+ for (unsigned int j = 0; j < bindings.getCount(); j++) {
+ const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[j];
+ std::vector<FCurve*>& curves = curve_map[binding.animation];
+ COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass;
+ char path[100];
+
+ switch (type) {
+ case COLLADAFW::Transformation::ROTATE:
+ BLI_snprintf(path, sizeof(path), "%s.rotate (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ BLI_snprintf(path, sizeof(path), "%s.scale (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::TRANSLATE:
+ BLI_snprintf(path, sizeof(path), "%s.translate (binding %u)", node_id, j);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ BLI_snprintf(path, sizeof(path), "%s.matrix (binding %u)", node_id, j);
+ break;
+ default:
+ break;
+ }
+
+ if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) {
+ fprintf(stderr, "%s: UNKNOWN animation class\n", path);
+ continue;
+ }
+
+ if (type == COLLADAFW::Transformation::ROTATE) {
+ if (curves.size() != 1) {
+ fprintf(stderr, "expected 1 curve, got %d\n", (int)curves.size());
+ return false;
+ }
+
+ // TODO support other animclasses
+ if (animclass != COLLADAFW::AnimationList::ANGLE) {
+ fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
+ return false;
+ }
+
+ COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis();
+ float ax[3] = {axis[0], axis[1], axis[2]};
+ float angle = evaluate_fcurve(curves[0], fra);
+ axis_angle_to_mat4(mat, ax, angle);
+
+ return true;
+ }
+ else if (is_scale || is_translate) {
+ bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ;
+
+ if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) {
+ if (is_xyz)
+ fprintf(stderr, "%s: expected 3 curves, got %d\n", path, (int)curves.size());
+ else
+ fprintf(stderr, "%s: expected 1 curve, got %d\n", path, (int)curves.size());
+ return false;
+ }
+
+ switch (animclass) {
+ case COLLADAFW::AnimationList::POSITION_X:
+ vec[0] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Y:
+ vec[1] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_Z:
+ vec[2] = evaluate_fcurve(curves[0], fra);
+ break;
+ case COLLADAFW::AnimationList::POSITION_XYZ:
+ vec[0] = evaluate_fcurve(curves[0], fra);
+ vec[1] = evaluate_fcurve(curves[1], fra);
+ vec[2] = evaluate_fcurve(curves[2], fra);
+ break;
+ default:
+ fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
+ break;
+ }
+ }
+ else if (type == COLLADAFW::Transformation::MATRIX) {
+ // for now, of matrix animation, support only the case when all values are packed into one animation
+ if (curves.size() != 16) {
+ fprintf(stderr, "%s: expected 16 curves, got %d\n", path, (int)curves.size());
+ return false;
+ }
+
+ COLLADABU::Math::Matrix4 matrix;
+ int i = 0, j = 0;
+
+ for (std::vector<FCurve*>::iterator it = curves.begin(); it != curves.end(); it++) {
+ matrix.setElement(i, j, evaluate_fcurve(*it, fra));
+ j++;
+ if (j == 4) {
+ i++;
+ j = 0;
+ }
+ }
+
+ COLLADAFW::Matrix tm(matrix);
+ dae_matrix_to_mat4(&tm, mat);
+
+ return true;
+ }
+ }
+
+ if (is_scale)
+ size_to_mat4(mat, vec);
+ else
+ copy_v3_v3(mat[3], vec);
+
+ return is_scale || is_translate;
+ }
+
+ return false;
+}
+
+// gives a world-space mat of joint at rest position
+void AnimationImporter::get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node)
+{
+ // if bind mat is not available,
+ // use "current" node transform, i.e. all those tms listed inside <node>
+ if (!armature_importer->get_joint_bind_mat(mat, node)) {
+ float par[4][4], m[4][4];
+
+ calc_joint_parent_mat_rest(par, NULL, root, node);
+ get_node_mat(m, node, NULL, NULL);
+ mul_m4_m4m4(mat, m, par);
+ }
+}
+
+// gives a world-space mat, end's mat not included
+bool AnimationImporter::calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end)
+{
+ float m[4][4];
+
+ if (node == end) {
+ par ? copy_m4_m4(mat, par) : unit_m4(mat);
+ return true;
+ }
+
+ // use bind matrix if available or calc "current" world mat
+ if (!armature_importer->get_joint_bind_mat(m, node)) {
+ if (par) {
+ float temp[4][4];
+ get_node_mat(temp, node, NULL, NULL);
+ mul_m4_m4m4(m, temp, par);
+ }
+ else {
+ get_node_mat(m, node, NULL, NULL);
+ }
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (calc_joint_parent_mat_rest(mat, m, children[i], end))
+ return true;
+ }
+
+ return false;
+}
+
+#ifdef ARMATURE_TEST
+Object *AnimationImporter::get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job)
+{
+ if (joint_objects.find(node->getUniqueId()) == joint_objects.end()) {
+ Object *job = add_object(scene, OB_EMPTY);
+
+ rename_id((ID*)&job->id, (char*)get_joint_name(node));
+
+ job->lay = object_in_scene(job, scene)->lay = 2;
+
+ mul_v3_fl(job->size, 0.5f);
+ job->recalc |= OB_RECALC_OB;
+
+ verify_adt_action((ID*)&job->id, 1);
+
+ job->rotmode = ROT_MODE_QUAT;
+
+ float mat[4][4];
+ get_joint_rest_mat(mat, root, node);
+
+ if (par_job) {
+ float temp[4][4], ipar[4][4];
+ invert_m4_m4(ipar, par_job->obmat);
+ copy_m4_m4(temp, mat);
+ mul_m4_m4m4(mat, temp, ipar);
+ }
+
+ TransformBase::decompose(mat, job->loc, NULL, job->quat, job->size);
+
+ if (par_job) {
+ job->parent = par_job;
+
+ par_job->recalc |= OB_RECALC_OB;
+ job->parsubstr[0] = 0;
+ }
+
+ where_is_object(scene, job);
+
+ // after parenting and layer change
+ DAG_scene_sort(CTX_data_main(C), scene);
+
+ joint_objects[node->getUniqueId()] = job;
+ }
+
+ return joint_objects[node->getUniqueId()];
+}
+#endif
+
+#if 0
+// recursively evaluates joint tree until end is found, mat then is world-space matrix of end
+// mat must be identity on enter, node must be root
+bool AnimationImporter::evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra)
+{
+ float m[4][4];
+ if (par) {
+ float temp[4][4];
+ evaluate_transform_at_frame(temp, node, node == end ? fra : 0.0f);
+ mul_m4_m4m4(m, temp, par);
+ }
+ else {
+ evaluate_transform_at_frame(m, node, node == end ? fra : 0.0f);
+ }
+
+ if (node == end) {
+ copy_m4_m4(mat, m);
+ return true;
+ }
+ else {
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (int i = 0; i < children.getCount(); i++) {
+ if (evaluate_joint_world_transform_at_frame(mat, m, children[i], end, fra))
+ return true;
+ }
+ }
+
+ return false;
+}
+#endif
+
+void AnimationImporter::add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu)
+{
+ const char *bone_name = bc_get_joint_name(node);
+ bAction *act = ob->adt->action;
+
+ /* try to find group */
+ bActionGroup *grp = action_groups_find_named(act, bone_name);
+
+ /* no matching groups, so add one */
+ if (grp == NULL) {
+ /* Add a new group, and make it active */
+ grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
+
+ grp->flag = AGRP_SELECTED;
+ BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
+
+ BLI_addtail(&act->groups, grp);
+ BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
+ }
+
+ /* add F-Curve to group */
+ action_groups_add_channel(act, grp, fcu);
+}
+
+void AnimationImporter::add_bezt(FCurve *fcu, float fra, float value)
+{
+ BezTriple bez;
+ memset(&bez, 0, sizeof(BezTriple));
+ bez.vec[1][0] = fra;
+ bez.vec[1][1] = value;
+ bez.ipo = U.ipo_new; /* use default interpolation mode here... */
+ bez.f1 = bez.f2 = bez.f3 = SELECT;
+ bez.h1 = bez.h2 = HD_AUTO;
+ insert_bezt_fcurve(fcu, &bez, 0);
+ calchandles_fcurve(fcu);
+}
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
new file mode 100644
index 00000000000..05347a1fbc1
--- /dev/null
+++ b/source/blender/collada/AnimationImporter.h
@@ -0,0 +1,136 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file AnimationImporter.h
+ * \ingroup collada
+ */
+
+#ifndef __BC_ANIMATIONIMPORTER_H__
+#define __BC_ANIMATIONIMPORTER_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWAnimation.h"
+#include "COLLADAFWAnimationCurve.h"
+#include "COLLADAFWAnimationList.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWUniqueId.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+//#include "ArmatureImporter.h"
+#include "TransformReader.h"
+
+#include "collada_internal.h"
+
+class ArmatureImporter;
+
+class AnimationImporterBase
+{
+public:
+ // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
+};
+
+class AnimationImporter : private TransformReader, public AnimationImporterBase
+{
+private:
+
+ ArmatureImporter *armature_importer;
+ Scene *scene;
+
+ std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map;
+ std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map;
+ // std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
+ std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map;
+ std::vector<FCurve*> unused_curves;
+ std::map<COLLADAFW::UniqueId, Object*> joint_objects;
+
+ FCurve *create_fcurve(int array_index, const char *rna_path);
+
+ void create_bezt(FCurve *fcu, float frame, float output);
+
+ // create one or several fcurves depending on the number of parameters being animated
+ void animation_to_fcurves(COLLADAFW::AnimationCurve *curve);
+
+ void fcurve_deg_to_rad(FCurve *cu);
+
+ void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated);
+public:
+
+ AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene);
+
+ ~AnimationImporter();
+
+ bool write_animation(const COLLADAFW::Animation* anim);
+
+ // called on post-process stage after writeVisualScenes
+ bool write_animation_list(const COLLADAFW::AnimationList* animlist);
+
+ void read_node_transform(COLLADAFW::Node *node, Object *ob);
+#if 0
+ virtual void change_eul_to_quat(Object *ob, bAction *act);
+#endif
+
+ // prerequisites:
+ // animlist_map - map animlist id -> animlist
+ // curve_map - map anim id -> curve(s)
+ Object *translate_animation(COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job = NULL);
+
+ // internal, better make it private
+ // warning: evaluates only rotation
+ // prerequisites: animlist_map, curve_map
+ void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra);
+
+ // return true to indicate that mat contains a sane value
+ bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id);
+
+ // gives a world-space mat of joint at rest position
+ void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node);
+
+ // gives a world-space mat, end's mat not included
+ bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end);
+
+#ifdef ARMATURE_TEST
+ Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job);
+#endif
+
+#if 0
+ // recursively evaluates joint tree until end is found, mat then is world-space matrix of end
+ // mat must be identity on enter, node must be root
+ bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra);
+#endif
+
+ void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu);
+
+ void add_bezt(FCurve *fcu, float fra, float value);
+};
+
+ #endif
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
new file mode 100644
index 00000000000..e8335173d50
--- /dev/null
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -0,0 +1,469 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADASWBaseInputElement.h"
+#include "COLLADASWInstanceController.h"
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWSource.h"
+
+#include "DNA_action_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+
+#include "BKE_action.h"
+#include "BKE_armature.h"
+
+#include "BLI_listbase.h"
+
+#include "GeometryExporter.h"
+#include "ArmatureExporter.h"
+
+// XXX exporter writes wrong data for shared armatures. A separate
+// controller should be written for each armature-mesh binding how do
+// we make controller ids then?
+ArmatureExporter::ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
+
+// write bone nodes
+void ArmatureExporter::add_armature_bones(Object *ob_arm, Scene *sce)
+{
+ // write bone nodes
+ bArmature *arm = (bArmature*)ob_arm->data;
+ for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
+ // start from root bones
+ if (!bone->parent)
+ add_bone_node(bone, ob_arm);
+ }
+}
+
+bool ArmatureExporter::is_skinned_mesh(Object *ob)
+{
+ return get_assigned_armature(ob) != NULL;
+}
+
+void ArmatureExporter::add_instance_controller(Object *ob)
+{
+ Object *ob_arm = get_assigned_armature(ob);
+ bArmature *arm = (bArmature*)ob_arm->data;
+
+ const std::string& controller_id = get_controller_id(ob_arm, ob);
+
+ COLLADASW::InstanceController ins(mSW);
+ ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
+
+ // write root bone URLs
+ Bone *bone;
+ for (bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
+ if (!bone->parent)
+ ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
+ }
+
+ InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
+
+ ins.add();
+}
+
+void ArmatureExporter::export_controllers(Scene *sce)
+{
+ scene = sce;
+
+ openLibrary();
+
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<ArmatureExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void ArmatureExporter::operator()(Object *ob)
+{
+ Object *ob_arm = get_assigned_armature(ob);
+
+ if (ob_arm /*&& !already_written(ob_arm)*/)
+ export_controller(ob, ob_arm);
+}
+#if 0
+
+bool ArmatureExporter::already_written(Object *ob_arm)
+{
+ return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != written_armatures.end();
+}
+
+void ArmatureExporter::wrote(Object *ob_arm)
+{
+ written_armatures.push_back(ob_arm);
+}
+
+void ArmatureExporter::find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce)
+{
+ objects.clear();
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) {
+ objects.push_back(ob);
+ }
+
+ base= base->next;
+ }
+}
+#endif
+
+Object *ArmatureExporter::get_assigned_armature(Object *ob)
+{
+ Object *ob_arm = NULL;
+
+ if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
+ ob_arm = ob->parent;
+ }
+ else {
+ ModifierData *mod = (ModifierData*)ob->modifiers.first;
+ while (mod) {
+ if (mod->type == eModifierType_Armature) {
+ ob_arm = ((ArmatureModifierData*)mod)->object;
+ }
+
+ mod = mod->next;
+ }
+ }
+
+ return ob_arm;
+}
+
+std::string ArmatureExporter::get_joint_sid(Bone *bone, Object *ob_arm)
+{
+ return get_joint_id(bone, ob_arm);
+}
+
+// parent_mat is armature-space
+void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
+{
+ std::string node_id = get_joint_id(bone, ob_arm);
+ std::string node_name = std::string(bone->name);
+ std::string node_sid = get_joint_sid(bone, ob_arm);
+
+ COLLADASW::Node node(mSW);
+
+ node.setType(COLLADASW::Node::JOINT);
+ node.setNodeId(node_id);
+ node.setNodeName(node_name);
+ node.setNodeSid(node_sid);
+
+ node.start();
+
+ add_bone_transform(ob_arm, bone, node);
+
+ for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
+ add_bone_node(child, ob_arm);
+ }
+
+ node.end();
+}
+
+void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node)
+{
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
+
+ float mat[4][4];
+
+ if (bone->parent) {
+ // get bone-space matrix from armature-space
+ bPoseChannel *parchan = get_pose_channel(ob_arm->pose, bone->parent->name);
+
+ float invpar[4][4];
+ invert_m4_m4(invpar, parchan->pose_mat);
+ mul_m4_m4m4(mat, pchan->pose_mat, invpar);
+ }
+ else {
+ // get world-space from armature-space
+ mul_m4_m4m4(mat, pchan->pose_mat, ob_arm->obmat);
+ }
+
+ TransformWriter::add_node_transform(node, mat, NULL);
+}
+
+std::string ArmatureExporter::get_controller_id(Object *ob_arm, Object *ob)
+{
+ return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX;
+}
+
+// ob should be of type OB_MESH
+// both args are required
+void ArmatureExporter::export_controller(Object* ob, Object *ob_arm)
+{
+ // joint names
+ // joint inverse bind matrices
+ // vertex weights
+
+ // input:
+ // joint names: ob -> vertex group names
+ // vertex group weights: me->dvert -> groups -> index, weight
+
+ /*
+ me->dvert:
+
+ typedef struct MDeformVert {
+ struct MDeformWeight *dw;
+ int totweight;
+ int flag; // flag only in use for weightpaint now
+ } MDeformVert;
+
+ typedef struct MDeformWeight {
+ int def_nr;
+ float weight;
+ } MDeformWeight;
+ */
+
+ Mesh *me = (Mesh*)ob->data;
+ if (!me->dvert) return;
+
+ std::string controller_name = id_name(ob_arm);
+ std::string controller_id = get_controller_id(ob_arm, ob);
+
+ openSkin(controller_id, controller_name,
+ COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+
+ add_bind_shape_mat(ob);
+
+ std::string joints_source_id = add_joints_source(ob_arm, &ob->defbase, controller_id);
+ std::string inv_bind_mat_source_id = add_inv_bind_mats_source(ob_arm, &ob->defbase, controller_id);
+ std::string weights_source_id = add_weights_source(me, controller_id);
+
+ add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
+ add_vertex_weights_element(weights_source_id, joints_source_id, me, ob_arm, &ob->defbase);
+
+ closeSkin();
+ closeController();
+}
+
+void ArmatureExporter::add_joints_element(ListBase *defbase,
+ const std::string& joints_source_id, const std::string& inv_bind_mat_source_id)
+{
+ COLLADASW::JointsElement joints(mSW);
+ COLLADASW::InputList &input = joints.getInputList();
+
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::JOINT, // constant declared in COLLADASWInputList.h
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id)));
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::BINDMATRIX,
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, inv_bind_mat_source_id)));
+ joints.add();
+}
+
+void ArmatureExporter::add_bind_shape_mat(Object *ob)
+{
+ double bind_mat[4][4];
+
+ converter.mat4_to_dae_double(bind_mat, ob->obmat);
+
+ addBindShapeTransform(bind_mat);
+}
+
+std::string ArmatureExporter::add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
+{
+ std::string source_id = controller_id + JOINTS_SOURCE_ID_SUFFIX;
+
+ int totjoint = 0;
+ bDeformGroup *def;
+ for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ if (is_bone_defgroup(ob_arm, def))
+ totjoint++;
+ }
+
+ COLLADASW::NameSource source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totjoint);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("JOINT");
+
+ source.prepareToAppendValues();
+
+ for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ Bone *bone = get_bone_from_defgroup(ob_arm, def);
+ if (bone)
+ source.appendValues(get_joint_sid(bone, ob_arm));
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+std::string ArmatureExporter::add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
+{
+ std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(BLI_countlist(defbase));
+ source.setAccessorStride(16);
+
+ source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("TRANSFORM");
+
+ source.prepareToAppendValues();
+
+ bPose *pose = ob_arm->pose;
+ bArmature *arm = (bArmature*)ob_arm->data;
+
+ int flag = arm->flag;
+
+ // put armature in rest position
+ if (!(arm->flag & ARM_RESTPOS)) {
+ arm->flag |= ARM_RESTPOS;
+ where_is_pose(scene, ob_arm);
+ }
+
+ for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) {
+ if (is_bone_defgroup(ob_arm, def)) {
+
+ bPoseChannel *pchan = get_pose_channel(pose, def->name);
+
+ float mat[4][4];
+ float world[4][4];
+ float inv_bind_mat[4][4];
+
+ // make world-space matrix, pose_mat is armature-space
+ mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat);
+
+ invert_m4_m4(mat, world);
+ converter.mat4_to_dae(inv_bind_mat, mat);
+
+ source.appendValues(inv_bind_mat);
+ }
+ }
+
+ // back from rest positon
+ if (!(flag & ARM_RESTPOS)) {
+ arm->flag = flag;
+ where_is_pose(scene, ob_arm);
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+Bone *ArmatureExporter::get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def)
+{
+ bPoseChannel *pchan = get_pose_channel(ob_arm->pose, def->name);
+ return pchan ? pchan->bone : NULL;
+}
+
+bool ArmatureExporter::is_bone_defgroup(Object *ob_arm, bDeformGroup* def)
+{
+ return get_bone_from_defgroup(ob_arm, def) != NULL;
+}
+
+std::string ArmatureExporter::add_weights_source(Mesh *me, const std::string& controller_id)
+{
+ std::string source_id = controller_id + WEIGHTS_SOURCE_ID_SUFFIX;
+
+ int i;
+ int totweight = 0;
+
+ for (i = 0; i < me->totvert; i++) {
+ totweight += me->dvert[i].totweight;
+ }
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(source_id);
+ source.setArrayId(source_id + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totweight);
+ source.setAccessorStride(1);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("WEIGHT");
+
+ source.prepareToAppendValues();
+
+ // NOTE: COLLADA spec says weights should be normalized
+
+ for (i = 0; i < me->totvert; i++) {
+ MDeformVert *vert = &me->dvert[i];
+ for (int j = 0; j < vert->totweight; j++) {
+ source.appendValues(vert->dw[j].weight);
+ }
+ }
+
+ source.finish();
+
+ return source_id;
+}
+
+void ArmatureExporter::add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
+ Object *ob_arm, ListBase *defbase)
+{
+ COLLADASW::VertexWeightsElement weights(mSW);
+ COLLADASW::InputList &input = weights.getInputList();
+
+ int offset = 0;
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::JOINT, // constant declared in COLLADASWInputList.h
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), offset++));
+ input.push_back(COLLADASW::Input(COLLADASW::InputSemantic::WEIGHT,
+ COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), offset++));
+
+ weights.setCount(me->totvert);
+
+ // write number of deformers per vertex
+ COLLADASW::PrimitivesBase::VCountList vcount;
+ int i;
+ for (i = 0; i < me->totvert; i++) {
+ vcount.push_back(me->dvert[i].totweight);
+ }
+
+ weights.prepareToAppendVCountValues();
+ weights.appendVertexCount(vcount);
+
+ // def group index -> joint index
+ std::map<int, int> joint_index_by_def_index;
+ bDeformGroup *def;
+ int j;
+ for (def = (bDeformGroup*)defbase->first, i = 0, j = 0; def; def = def->next, i++) {
+ if (is_bone_defgroup(ob_arm, def))
+ joint_index_by_def_index[i] = j++;
+ else
+ joint_index_by_def_index[i] = -1;
+ }
+
+ weights.CloseVCountAndOpenVElement();
+
+ // write deformer index - weight index pairs
+ int weight_index = 0;
+ for (i = 0; i < me->totvert; i++) {
+ MDeformVert *dvert = &me->dvert[i];
+ for (int j = 0; j < dvert->totweight; j++) {
+ weights.appendValues(joint_index_by_def_index[dvert->dw[j].def_nr]);
+ weights.appendValues(weight_index++);
+ }
+ }
+
+ weights.finish();
+}
diff --git a/source/blender/collada/ArmatureExporter.h b/source/blender/collada/ArmatureExporter.h
new file mode 100644
index 00000000000..f72e5244a36
--- /dev/null
+++ b/source/blender/collada/ArmatureExporter.h
@@ -0,0 +1,141 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ArmatureExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __ARMATUREEXPORTER_H__
+#define __ARMATUREEXPORTER_H__
+
+#include <string>
+//#include <vector>
+
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryControllers.h"
+#include "COLLADASWInputList.h"
+#include "COLLADASWNode.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_listBase.h"
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "TransformWriter.h"
+#include "InstanceWriter.h"
+
+// XXX exporter writes wrong data for shared armatures. A separate
+// controller should be written for each armature-mesh binding how do
+// we make controller ids then?
+class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
+{
+private:
+ Scene *scene;
+
+public:
+ ArmatureExporter(COLLADASW::StreamWriter *sw);
+
+ // write bone nodes
+ void add_armature_bones(Object *ob_arm, Scene *sce);
+
+ bool is_skinned_mesh(Object *ob);
+
+ void add_instance_controller(Object *ob);
+
+ void export_controllers(Scene *sce);
+
+ void operator()(Object *ob);
+
+private:
+
+ UnitConverter converter;
+
+#if 0
+ std::vector<Object*> written_armatures;
+
+ bool already_written(Object *ob_arm);
+
+ void wrote(Object *ob_arm);
+
+ void find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce);
+#endif
+
+ Object *get_assigned_armature(Object *ob);
+
+ std::string get_joint_sid(Bone *bone, Object *ob_arm);
+
+ // parent_mat is armature-space
+ void add_bone_node(Bone *bone, Object *ob_arm);
+
+ void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node);
+
+ std::string get_controller_id(Object *ob_arm, Object *ob);
+
+ // ob should be of type OB_MESH
+ // both args are required
+ void export_controller(Object* ob, Object *ob_arm);
+
+ void add_joints_element(ListBase *defbase,
+ const std::string& joints_source_id, const std::string& inv_bind_mat_source_id);
+
+ void add_bind_shape_mat(Object *ob);
+
+ std::string add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id);
+
+ std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id);
+
+ Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def);
+
+ bool is_bone_defgroup(Object *ob_arm, bDeformGroup* def);
+
+ std::string add_weights_source(Mesh *me, const std::string& controller_id);
+
+ void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
+ Object *ob_arm, ListBase *defbase);
+};
+
+/*
+struct GeometryFunctor {
+ // f should have
+ // void operator()(Object* ob)
+ template<class Functor>
+ void forEachMeshObjectInScene(Scene *sce, Functor &f)
+ {
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+
+ }
+ }
+};*/
+
+#endif
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
new file mode 100644
index 00000000000..bf51e64b0bd
--- /dev/null
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -0,0 +1,587 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include <algorithm>
+
+#include "COLLADAFWUniqueId.h"
+
+#include "BKE_action.h"
+#include "BKE_depsgraph.h"
+#include "BKE_object.h"
+#include "BLI_string.h"
+#include "ED_armature.h"
+
+#include "ArmatureImporter.h"
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+ArmatureImporter::ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce) :
+ TransformReader(conv), scene(sce), empty(NULL), mesh_importer(mesh), anim_importer(anim) {}
+
+ArmatureImporter::~ArmatureImporter()
+{
+ // free skin controller data if we forget to do this earlier
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ it->second.free();
+ }
+}
+
+#if 0
+JointData *ArmatureImporter::get_joint_data(COLLADAFW::Node *node);
+{
+ const COLLADAFW::UniqueId& joint_id = node->getUniqueId();
+
+ if (joint_id_to_joint_index_map.find(joint_id) == joint_id_to_joint_index_map.end()) {
+ fprintf(stderr, "Cannot find a joint index by joint id for %s.\n",
+ node->getOriginalId().c_str());
+ return NULL;
+ }
+
+ int joint_index = joint_id_to_joint_index_map[joint_id];
+
+ return &joint_index_to_joint_info_map[joint_index];
+}
+#endif
+
+void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
+ float parent_mat[][4], bArmature *arm)
+{
+ float joint_inv_bind_mat[4][4];
+
+ // JointData* jd = get_joint_data(node);
+
+ float mat[4][4];
+
+ if (skin.get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) {
+ // get original world-space matrix
+ invert_m4_m4(mat, joint_inv_bind_mat);
+ }
+ // create a bone even if there's no joint data for it (i.e. it has no influence)
+ else {
+ float obmat[4][4];
+
+ // object-space
+ get_node_mat(obmat, node, NULL, NULL);
+
+ // get world-space
+ if (parent)
+ mul_m4_m4m4(mat, obmat, parent_mat);
+ else
+ copy_m4_m4(mat, obmat);
+ }
+
+ // TODO rename from Node "name" attrs later
+ EditBone *bone = ED_armature_edit_bone_add(arm, (char*)bc_get_joint_name(node));
+ totbone++;
+
+ if (parent) bone->parent = parent;
+
+ // set head
+ copy_v3_v3(bone->head, mat[3]);
+
+ // set tail, don't set it to head because 0-length bones are not allowed
+ float vec[3] = {0.0f, 0.5f, 0.0f};
+ add_v3_v3v3(bone->tail, bone->head, vec);
+
+ // set parent tail
+ if (parent && totchild == 1) {
+ copy_v3_v3(parent->tail, bone->head);
+
+ // not setting BONE_CONNECTED because this would lock child bone location with respect to parent
+ // bone->flag |= BONE_CONNECTED;
+
+ // XXX increase this to prevent "very" small bones?
+ const float epsilon = 0.000001f;
+
+ // derive leaf bone length
+ float length = len_v3v3(parent->head, parent->tail);
+ if ((length < leaf_bone_length || totbone == 0) && length > epsilon) {
+ leaf_bone_length = length;
+ }
+
+ // treat zero-sized bone like a leaf bone
+ if (length <= epsilon) {
+ add_leaf_bone(parent_mat, parent);
+ }
+
+ /*
+#if 0
+ // and which row in mat is bone direction
+ float vec[3];
+ sub_v3_v3v3(vec, parent->tail, parent->head);
+#ifdef COLLADA_DEBUG
+ print_v3("tail - head", vec);
+ print_m4("matrix", parent_mat);
+#endif
+ for (int i = 0; i < 3; i++) {
+#ifdef COLLADA_DEBUG
+ char *axis_names[] = {"X", "Y", "Z"};
+ printf("%s-axis length is %f\n", axis_names[i], len_v3(parent_mat[i]));
+#endif
+ float angle = angle_v2v2(vec, parent_mat[i]);
+ if (angle < min_angle) {
+#ifdef COLLADA_DEBUG
+ print_v3("picking", parent_mat[i]);
+ printf("^ %s axis of %s's matrix\n", axis_names[i], get_dae_name(node));
+#endif
+ bone_direction_row = i;
+ min_angle = angle;
+ }
+ }
+#endif
+ */
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ create_bone(skin, children[i], bone, children.getCount(), mat, arm);
+ }
+
+ // in second case it's not a leaf bone, but we handle it the same way
+ if (!children.getCount() || children.getCount() > 1) {
+ add_leaf_bone(mat, bone);
+ }
+}
+
+void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone)
+{
+ LeafBone leaf;
+
+ leaf.bone = bone;
+ copy_m4_m4(leaf.mat, mat);
+ BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
+
+ leaf_bones.push_back(leaf);
+}
+
+void ArmatureImporter::fix_leaf_bones()
+{
+ // just setting tail for leaf bones here
+
+ std::vector<LeafBone>::iterator it;
+ for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
+ LeafBone& leaf = *it;
+
+ // pointing up
+ float vec[3] = {0.0f, 0.0f, 1.0f};
+
+ mul_v3_fl(vec, leaf_bone_length);
+
+ copy_v3_v3(leaf.bone->tail, leaf.bone->head);
+ add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
+ }
+}
+
+#if 0
+void ArmatureImporter::set_leaf_bone_shapes(Object *ob_arm)
+{
+ bPose *pose = ob_arm->pose;
+
+ std::vector<LeafBone>::iterator it;
+ for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
+ LeafBone& leaf = *it;
+
+ bPoseChannel *pchan = get_pose_channel(pose, leaf.name);
+ if (pchan) {
+ pchan->custom = get_empty_for_leaves();
+ }
+ else {
+ fprintf(stderr, "Cannot find a pose channel for leaf bone %s\n", leaf.name);
+ }
+ }
+}
+
+void ArmatureImporter::set_euler_rotmode()
+{
+ // just set rotmode = ROT_MODE_EUL on pose channel for each joint
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>::iterator it;
+
+ for (it = joint_by_uid.begin(); it != joint_by_uid.end(); it++) {
+
+ COLLADAFW::Node *joint = it->second;
+
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator sit;
+
+ for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) {
+ SkinInfo& skin = sit->second;
+
+ if (skin.uses_joint_or_descendant(joint)) {
+ bPoseChannel *pchan = skin.get_pose_channel_from_node(joint);
+
+ if (pchan) {
+ pchan->rotmode = ROT_MODE_EUL;
+ }
+ else {
+ fprintf(stderr, "Cannot find pose channel for %s.\n", get_joint_name(joint));
+ }
+
+ break;
+ }
+ }
+ }
+}
+#endif
+
+Object *ArmatureImporter::get_empty_for_leaves()
+{
+ if (empty) return empty;
+
+ empty = add_object(scene, OB_EMPTY);
+ empty->empty_drawtype = OB_EMPTY_SPHERE;
+
+ return empty;
+}
+
+#if 0
+Object *ArmatureImporter::find_armature(COLLADAFW::Node *node)
+{
+ JointData* jd = get_joint_data(node);
+ if (jd) return jd->ob_arm;
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (int i = 0; i < children.getCount(); i++) {
+ Object *ob_arm = find_armature(children[i]);
+ if (ob_arm) return ob_arm;
+ }
+
+ return NULL;
+}
+
+ArmatureJoints& ArmatureImporter::get_armature_joints(Object *ob_arm)
+{
+ // try finding it
+ std::vector<ArmatureJoints>::iterator it;
+ for (it = armature_joints.begin(); it != armature_joints.end(); it++) {
+ if ((*it).ob_arm == ob_arm) return *it;
+ }
+
+ // not found, create one
+ ArmatureJoints aj;
+ aj.ob_arm = ob_arm;
+ armature_joints.push_back(aj);
+
+ return armature_joints.back();
+}
+#endif
+
+void ArmatureImporter::create_armature_bones(SkinInfo& skin)
+{
+ // just do like so:
+ // - get armature
+ // - enter editmode
+ // - add edit bones and head/tail properties using matrices and parent-child info
+ // - exit edit mode
+ // - set a sphere shape to leaf bones
+
+ Object *ob_arm = NULL;
+
+ /*
+ * find if there's another skin sharing at least one bone with this skin
+ * if so, use that skin's armature
+ */
+
+ /*
+ Pseudocode:
+
+ find_node_in_tree(node, root_joint)
+
+ skin::find_root_joints(root_joints):
+ std::vector root_joints;
+ for each root in root_joints:
+ for each joint in joints:
+ if find_node_in_tree(joint, root):
+ if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
+ root_joints.push_back(root);
+
+ for (each skin B with armature) {
+ find all root joints for skin B
+
+ for each joint X in skin A:
+ for each root joint R in skin B:
+ if (find_node_in_tree(X, R)) {
+ shared = 1;
+ goto endloop;
+ }
+ }
+
+ endloop:
+ */
+
+ SkinInfo *a = &skin;
+ Object *shared = NULL;
+ std::vector<COLLADAFW::Node*> skin_root_joints;
+
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo *b = &it->second;
+ if (b == a || b->get_armature() == NULL)
+ continue;
+
+ skin_root_joints.clear();
+
+ b->find_root_joints(root_joints, joint_by_uid, skin_root_joints);
+
+ std::vector<COLLADAFW::Node*>::iterator ri;
+ for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) {
+ if (a->uses_joint_or_descendant(*ri)) {
+ shared = b->get_armature();
+ break;
+ }
+ }
+
+ if (shared != NULL)
+ break;
+ }
+
+ if (shared)
+ ob_arm = skin.set_armature(shared);
+ else
+ ob_arm = skin.create_armature(scene);
+
+ // enter armature edit mode
+ ED_armature_to_edit(ob_arm);
+
+ leaf_bones.clear();
+ totbone = 0;
+ // bone_direction_row = 1; // TODO: don't default to Y but use asset and based on it decide on default row
+ leaf_bone_length = FLT_MAX;
+ // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix
+
+ // create bones
+ /*
+ TODO:
+ check if bones have already been created for a given joint
+ */
+
+ std::vector<COLLADAFW::Node*>::iterator ri;
+ for (ri = root_joints.begin(); ri != root_joints.end(); ri++) {
+ // for shared armature check if bone tree is already created
+ if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end())
+ continue;
+
+ // since root_joints may contain joints for multiple controllers, we need to filter
+ if (skin.uses_joint_or_descendant(*ri)) {
+ create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data);
+
+ if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent())
+ skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]);
+ }
+ }
+
+ fix_leaf_bones();
+
+ // exit armature edit mode
+ ED_armature_from_edit(ob_arm);
+ ED_armature_edit_free(ob_arm);
+ DAG_id_tag_update(&ob_arm->id, OB_RECALC_OB|OB_RECALC_DATA);
+
+ // set_leaf_bone_shapes(ob_arm);
+ // set_euler_rotmode();
+}
+
+
+// root - if this joint is the top joint in hierarchy, if a joint
+// is a child of a node (not joint), root should be true since
+// this is where we build armature bones from
+void ArmatureImporter::add_joint(COLLADAFW::Node *node, bool root, Object *parent)
+{
+ joint_by_uid[node->getUniqueId()] = node;
+ if (root) {
+ root_joints.push_back(node);
+
+ if (parent)
+ joint_parent_map[node->getUniqueId()] = parent;
+ }
+}
+
+#if 0
+void ArmatureImporter::add_root_joint(COLLADAFW::Node *node)
+{
+ // root_joints.push_back(node);
+ Object *ob_arm = find_armature(node);
+ if (ob_arm) {
+ get_armature_joints(ob_arm).root_joints.push_back(node);
+ }
+#ifdef COLLADA_DEBUG
+ else {
+ fprintf(stderr, "%s cannot be added to armature.\n", get_joint_name(node));
+ }
+#endif
+}
+#endif
+
+// here we add bones to armatures, having armatures previously created in write_controller
+void ArmatureImporter::make_armatures(bContext *C)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+
+ SkinInfo& skin = it->second;
+
+ create_armature_bones(skin);
+
+ // link armature with a mesh object
+ Object *ob = mesh_importer->get_object_by_geom_uid(*get_geometry_uid(skin.get_controller_uid()));
+ if (ob)
+ skin.link_armature(C, ob, joint_by_uid, this);
+ else
+ fprintf(stderr, "Cannot find object to link armature with.\n");
+
+ // set armature parent if any
+ Object *par = skin.get_parent();
+ if (par)
+ bc_set_parent(skin.get_armature(), par, C, false);
+
+ // free memory stolen from SkinControllerData
+ skin.free();
+ }
+}
+
+#if 0
+// link with meshes, create vertex groups, assign weights
+void ArmatureImporter::link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id)
+{
+ Object *ob = mesh_importer->get_object_by_geom_uid(geom_id);
+
+ if (!ob) {
+ fprintf(stderr, "Cannot find object by geometry UID.\n");
+ return;
+ }
+
+ if (skin_by_data_uid.find(controller_data_id) == skin_by_data_uid.end()) {
+ fprintf(stderr, "Cannot find skin info by controller data UID.\n");
+ return;
+ }
+
+ SkinInfo& skin = skin_by_data_uid[conroller_data_id];
+
+ // create vertex groups
+}
+#endif
+
+bool ArmatureImporter::write_skin_controller_data(const COLLADAFW::SkinControllerData* data)
+{
+ // at this stage we get vertex influence info that should go into me->verts and ob->defbase
+ // there's no info to which object this should be long so we associate it with skin controller data UID
+
+ // don't forget to call defgroup_unique_name before we copy
+
+ // controller data uid -> [armature] -> joint data,
+ // [mesh object]
+ //
+
+ SkinInfo skin(unit_converter);
+ skin.borrow_skin_controller_data(data);
+
+ // store join inv bind matrix to use it later in armature construction
+ const COLLADAFW::Matrix4Array& inv_bind_mats = data->getInverseBindMatrices();
+ for (unsigned int i = 0; i < data->getJointsCount(); i++) {
+ skin.add_joint(inv_bind_mats[i]);
+ }
+
+ skin_by_data_uid[data->getUniqueId()] = skin;
+
+ return true;
+}
+
+bool ArmatureImporter::write_controller(const COLLADAFW::Controller* controller)
+{
+ // - create and store armature object
+
+ const COLLADAFW::UniqueId& skin_id = controller->getUniqueId();
+
+ if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) {
+ COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller;
+ // to be able to find geom id by controller id
+ geom_uid_by_controller_uid[skin_id] = co->getSource();
+
+ const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData();
+ if (skin_by_data_uid.find(data_uid) == skin_by_data_uid.end()) {
+ fprintf(stderr, "Cannot find skin by controller data UID.\n");
+ return true;
+ }
+
+ skin_by_data_uid[data_uid].set_controller(co);
+ }
+ // morph controller
+ else {
+ // shape keys? :)
+ fprintf(stderr, "Morph controller is not supported yet.\n");
+ }
+
+ return true;
+}
+
+COLLADAFW::UniqueId *ArmatureImporter::get_geometry_uid(const COLLADAFW::UniqueId& controller_uid)
+{
+ if (geom_uid_by_controller_uid.find(controller_uid) == geom_uid_by_controller_uid.end())
+ return NULL;
+
+ return &geom_uid_by_controller_uid[controller_uid];
+}
+
+Object *ArmatureImporter::get_armature_for_joint(COLLADAFW::Node *node)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo& skin = it->second;
+
+ if (skin.uses_joint_or_descendant(node))
+ return skin.get_armature();
+ }
+
+ return NULL;
+}
+
+void ArmatureImporter::get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count)
+{
+ BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", bc_get_joint_name(node));
+}
+
+// gives a world-space mat
+bool ArmatureImporter::get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint)
+{
+ std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
+ bool found = false;
+ for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
+ SkinInfo& skin = it->second;
+ if ((found = skin.get_joint_inv_bind_matrix(m, joint))) {
+ invert_m4(m);
+ break;
+ }
+ }
+
+ return found;
+}
diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h
new file mode 100644
index 00000000000..d36bccf7e57
--- /dev/null
+++ b/source/blender/collada/ArmatureImporter.h
@@ -0,0 +1,163 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file ArmatureImporter.h
+ * \ingroup collada
+ */
+
+#ifndef __BC_ARMATUREIMPORTER_H__
+#define __BC_ARMATUREIMPORTER_H__
+
+#include "COLLADAFWNode.h"
+#include "COLLADAFWUniqueId.h"
+
+extern "C" {
+#include "BKE_context.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "ED_armature.h"
+}
+
+#include "AnimationImporter.h"
+#include "MeshImporter.h"
+#include "SkinInfo.h"
+#include "TransformReader.h"
+
+#include <map>
+#include <vector>
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+class ArmatureImporter : private TransformReader
+{
+private:
+ Scene *scene;
+ UnitConverter *unit_converter;
+
+ // std::map<int, JointData> joint_index_to_joint_info_map;
+ // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
+
+ struct LeafBone {
+ // COLLADAFW::Node *node;
+ EditBone *bone;
+ char name[32];
+ float mat[4][4]; // bone matrix, derived from inv_bind_mat
+ };
+ std::vector<LeafBone> leaf_bones;
+ // int bone_direction_row; // XXX not used
+ float leaf_bone_length;
+ int totbone;
+ // XXX not used
+ // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
+
+#if 0
+ struct ArmatureJoints {
+ Object *ob_arm;
+ std::vector<COLLADAFW::Node*> root_joints;
+ };
+ std::vector<ArmatureJoints> armature_joints;
+#endif
+
+ Object *empty; // empty for leaf bones
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
+ std::vector<COLLADAFW::Node*> root_joints;
+ std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
+
+ MeshImporterBase *mesh_importer;
+ AnimationImporterBase *anim_importer;
+
+ // This is used to store data passed in write_controller_data.
+ // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+ // so that arrays don't get freed until we free them explicitly.
+
+ std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
+#if 0
+ JointData *get_joint_data(COLLADAFW::Node *node);
+#endif
+
+ void create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
+ float parent_mat[][4], bArmature *arm);
+
+ void add_leaf_bone(float mat[][4], EditBone *bone);
+
+ void fix_leaf_bones();
+
+#if 0
+ void set_leaf_bone_shapes(Object *ob_arm);
+ void set_euler_rotmode();
+#endif
+
+ Object *get_empty_for_leaves();
+
+#if 0
+ Object *find_armature(COLLADAFW::Node *node);
+
+ ArmatureJoints& get_armature_joints(Object *ob_arm);
+#endif
+
+ void create_armature_bones(SkinInfo& skin);
+
+public:
+
+ ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce);
+ ~ArmatureImporter();
+
+ // root - if this joint is the top joint in hierarchy, if a joint
+ // is a child of a node (not joint), root should be true since
+ // this is where we build armature bones from
+ void add_joint(COLLADAFW::Node *node, bool root, Object *parent);
+
+#if 0
+ void add_root_joint(COLLADAFW::Node *node);
+#endif
+
+ // here we add bones to armatures, having armatures previously created in write_controller
+ void make_armatures(bContext *C);
+
+#if 0
+ // link with meshes, create vertex groups, assign weights
+ void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id);
+#endif
+
+ bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data);
+
+ bool write_controller(const COLLADAFW::Controller* controller);
+
+ COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid);
+
+ Object *get_armature_for_joint(COLLADAFW::Node *node);
+
+ void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
+
+ // gives a world-space mat
+ bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
+};
+
+#endif
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index a72ecc4be6c..3f8abb7ed5d 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -24,45 +24,93 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
+remove_strict_flags()
-IF(APPLE)
-SET(INC
- .
- ../blenlib
- ../blenkernel
- ../windowmanager
- ../makesdna
- ../makesrna
- ../editors/include
- ../../../intern/guardedalloc
- ${OPENCOLLADA_INC}/COLLADAStreamWriter
- ${OPENCOLLADA_INC}/COLLADABaseUtils
- ${OPENCOLLADA_INC}/COLLADAFramework
- ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+set(INC
+ .
+ ../blenlib
+ ../blenkernel
+ ../blenloader
+ ../windowmanager
+ ../makesdna
+ ../makesrna
+ ../editors/include
+ ../../../intern/guardedalloc
)
-ELSE(APPLE)
+if(APPLE)
+ list(APPEND INC
+ ${OPENCOLLADA_INC}/COLLADAStreamWriter
+ ${OPENCOLLADA_INC}/COLLADABaseUtils
+ ${OPENCOLLADA_INC}/COLLADAFramework
+ ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+ )
+else()
+ list(APPEND INC
+ ${OPENCOLLADA_INC}/COLLADAStreamWriter/include
+ ${OPENCOLLADA_INC}/COLLADABaseUtils/include
+ ${OPENCOLLADA_INC}/COLLADAFramework/include
+ ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader/include
+ )
+endif()
-SET(INC
- .
- ../blenlib
- ../blenkernel
- ../windowmanager
- ../makesdna
- ../makesrna
- ../editors/include
- ../../../intern/guardedalloc
- ${OPENCOLLADA_INC}/COLLADAStreamWriter/include
- ${OPENCOLLADA_INC}/COLLADABaseUtils/include
- ${OPENCOLLADA_INC}/COLLADAFramework/include
- ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader/include
+set(SRC
+ AnimationImporter.cpp
+ ArmatureExporter.cpp
+ ArmatureImporter.cpp
+ CameraExporter.cpp
+ DocumentExporter.cpp
+ DocumentImporter.cpp
+ EffectExporter.cpp
+ GeometryExporter.cpp
+ ImageExporter.cpp
+ InstanceWriter.cpp
+ LightExporter.cpp
+ MaterialExporter.cpp
+ MeshImporter.cpp
+ SkinInfo.cpp
+ TransformReader.cpp
+ TransformWriter.cpp
+ collada.cpp
+ collada_internal.cpp
+ collada_utils.cpp
+
+ AnimationImporter.h
+ ArmatureExporter.h
+ ArmatureImporter.h
+ CameraExporter.h
+ DocumentExporter.h
+ DocumentImporter.h
+ EffectExporter.h
+ GeometryExporter.h
+ ImageExporter.h
+ InstanceWriter.h
+ LightExporter.h
+ MaterialExporter.h
+ MeshImporter.h
+ SkinInfo.h
+ TransformReader.h
+ TransformWriter.h
+ collada.h
+ collada_internal.h
+ collada_utils.h
)
-ENDIF(APPLE)
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
+<<<<<<< .working
IF(WITH_BUILDINFO)
ADD_DEFINITIONS(-DNAN_BUILDINFO)
ENDIF(WITH_BUILDINFO)
BLENDERLIB(bf_collada "${SRC}" "${INC}")
+=======
+if(CMAKE_COMPILER_IS_GNUCXX)
+ # COLLADAFWArray.h gives error with gcc 4.5
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
+endif()
+
+blender_add_lib(bf_collada "${SRC}" "${INC}")
+>>>>>>> .merge-right.r35190
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
new file mode 100644
index 00000000000..b2c9dd9a7c8
--- /dev/null
+++ b/source/blender/collada/CameraExporter.cpp
@@ -0,0 +1,86 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWCamera.h"
+#include "COLLADASWCameraOptic.h"
+
+#include "DNA_camera_types.h"
+
+#include "CameraExporter.h"
+
+#include "collada_internal.h"
+
+CamerasExporter::CamerasExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryCameras(sw){}
+
+template<class Functor>
+void forEachCameraObjectInScene(Scene *sce, Functor &f)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_CAMERA && ob->data) {
+ f(ob, sce);
+ }
+ base= base->next;
+ }
+}
+
+void CamerasExporter::exportCameras(Scene *sce)
+{
+ openLibrary();
+
+ forEachCameraObjectInScene(sce, *this);
+
+ closeLibrary();
+}
+void CamerasExporter::operator()(Object *ob, Scene *sce)
+{
+ // TODO: shiftx, shifty, YF_dofdist
+ Camera *cam = (Camera*)ob->data;
+ std::string cam_id(get_camera_id(ob));
+ std::string cam_name(id_name(cam));
+
+ if (cam->type == CAM_PERSP) {
+ COLLADASW::PerspectiveOptic persp(mSW);
+ persp.setXFov(lens_to_angle(cam->lens)*(180.0f/M_PI));
+ persp.setAspectRatio((float)(sce->r.xsch)/(float)(sce->r.ysch));
+ persp.setZFar(cam->clipend);
+ persp.setZNear(cam->clipsta);
+ COLLADASW::Camera ccam(mSW, &persp, cam_id, cam_name);
+ addCamera(ccam);
+ }
+ else {
+ COLLADASW::OrthographicOptic ortho(mSW);
+ ortho.setXMag(cam->ortho_scale);
+ ortho.setAspectRatio((float)(sce->r.xsch)/(float)(sce->r.ysch));
+ ortho.setZFar(cam->clipend);
+ ortho.setZNear(cam->clipsta);
+ COLLADASW::Camera ccam(mSW, &ortho, cam_id, cam_name);
+ addCamera(ccam);
+ }
+}
diff --git a/source/blender/collada/CameraExporter.h b/source/blender/collada/CameraExporter.h
new file mode 100644
index 00000000000..922eaf6b1d0
--- /dev/null
+++ b/source/blender/collada/CameraExporter.h
@@ -0,0 +1,47 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file CameraExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __CAMERAEXPORTER_H__
+#define __CAMERAEXPORTER_H__
+
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryCameras.h"
+
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+class CamerasExporter: COLLADASW::LibraryCameras
+{
+public:
+ CamerasExporter(COLLADASW::StreamWriter *sw);
+ void exportCameras(Scene *sce);
+ void operator()(Object *ob, Scene *sce);
+};
+
+#endif
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 5c059a4e9c9..1a648f43097 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,8 @@
#include <stdio.h>
#include <math.h>
+extern "C"
+{
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
@@ -32,16 +34,13 @@
#include "DNA_image_types.h"
#include "DNA_material_types.h"
#include "DNA_texture_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_lamp_types.h"
#include "DNA_anim_types.h"
#include "DNA_action_types.h"
#include "DNA_curve_types.h"
#include "DNA_armature_types.h"
#include "DNA_modifier_types.h"
+#include "DNA_userdef_types.h"
-extern "C"
-{
#include "BKE_DerivedMesh.h"
#include "BKE_fcurve.h"
#include "BKE_animsys.h"
@@ -70,10 +69,11 @@ extern char build_rev[];
#include "BLI_string.h"
#include "BLI_listbase.h"
+#include "RNA_access.h"
+
#include "COLLADASWAsset.h"
#include "COLLADASWLibraryVisualScenes.h"
#include "COLLADASWNode.h"
-#include "COLLADASWLibraryGeometries.h"
#include "COLLADASWSource.h"
#include "COLLADASWInstanceGeometry.h"
#include "COLLADASWInputList.h"
@@ -90,16 +90,12 @@ extern char build_rev[];
#include "COLLADASWSurfaceInitOption.h"
#include "COLLADASWSampler.h"
#include "COLLADASWScene.h"
-//#include "COLLADASWSurface.h"
#include "COLLADASWTechnique.h"
#include "COLLADASWTexture.h"
#include "COLLADASWLibraryMaterials.h"
#include "COLLADASWBindMaterial.h"
-#include "COLLADASWLibraryCameras.h"
-#include "COLLADASWLibraryLights.h"
#include "COLLADASWInstanceCamera.h"
#include "COLLADASWInstanceLight.h"
-#include "COLLADASWCameraOptic.h"
#include "COLLADASWConstants.h"
#include "COLLADASWLibraryControllers.h"
#include "COLLADASWInstanceController.h"
@@ -108,35 +104,22 @@ extern char build_rev[];
#include "collada_internal.h"
#include "DocumentExporter.h"
+// can probably go after refactor is complete
+#include "InstanceWriter.h"
+#include "TransformWriter.h"
+
+#include "ArmatureExporter.h"
+#include "CameraExporter.h"
+#include "EffectExporter.h"
+#include "GeometryExporter.h"
+#include "ImageExporter.h"
+#include "LightExporter.h"
+#include "MaterialExporter.h"
+
#include <vector>
#include <algorithm> // std::find
-// arithb.c now has QuatToAxisAngle too
-#if 0
-// This function assumes that quat is normalized.
-// The following document was used as reference:
-// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
-void quat_to_axis_angle( float *axis, float *angle,float *q)
-{
- // quat to axis angle
- *angle = 2 * acos(q[0]);
- float divisor = sqrt(1 - q[0] * q[0]);
-
- // test to avoid divide by zero, divisor is always positive
- if (divisor < 0.001f ) {
- axis[0] = 1.0f;
- axis[1] = 0.0f;
- axis[2] = 0.0f;
- }
- else {
- axis[0] = q[1] / divisor;
- axis[1] = q[2] / divisor;
- axis[2] = q[3] / divisor;
- }
-}
-#endif
-
-char *CustomData_get_layer_name(const struct CustomData *data, int type, int n)
+char *bc_CustomData_get_layer_name(const struct CustomData *data, int type, int n)
{
int layer_index = CustomData_get_layer_index(data, type);
if(layer_index < 0) return NULL;
@@ -144,7 +127,7 @@ char *CustomData_get_layer_name(const struct CustomData *data, int type, int n)
return data->layers[layer_index+n].name;
}
-char *CustomData_get_active_layer_name(const CustomData *data, int type)
+char *bc_CustomData_get_active_layer_name(const CustomData *data, int type)
{
/* get the layer index of the active layer of type */
int layer_index = CustomData_get_active_layer_index(data, type);
@@ -153,108 +136,12 @@ char *CustomData_get_active_layer_name(const CustomData *data, int type)
return data->layers[layer_index].name;
}
-/**
-Translation map.
-Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be
-included. Look at the IDREF XSD declaration for more.
-Follows strictly the COLLADA XSD declaration which explicitly allows non-english chars,
-like special chars (e.g. micro sign), umlauts and so on.
-The COLLADA spec also allows additional chars for member access ('.'), these
-must obviously be removed too, otherwise they would be heavily misinterpreted.
-*/
-const unsigned char translate_map[256] = {
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 45, 95, 95,
- 48, 49, 50, 51, 52, 53, 54, 55,
- 56, 57, 95, 95, 95, 95, 95, 95,
- 95, 65, 66, 67, 68, 69, 70, 71,
- 72, 73, 74, 75, 76, 77, 78, 79,
- 80, 81, 82, 83, 84, 85, 86, 87,
- 88, 89, 90, 95, 95, 95, 95, 95,
- 95, 97, 98, 99, 100, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 183,
- 95, 95, 95, 95, 95, 95, 95, 95,
- 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 203, 204, 205, 206, 207,
- 208, 209, 210, 211, 212, 213, 214, 95,
- 216, 217, 218, 219, 220, 221, 222, 223,
- 224, 225, 226, 227, 228, 229, 230, 231,
- 232, 233, 234, 235, 236, 237, 238, 239,
- 240, 241, 242, 243, 244, 245, 246, 95,
- 248, 249, 250, 251, 252, 253, 254, 255};
-
-/** Look at documentation of translate_map */
-static std::string translate_id(const std::string &id)
-{
- std::string id_translated = id;
- for (unsigned int i=0; i < id_translated.size(); i++)
- {
- id_translated[i] = translate_map[(unsigned int)id_translated[i]];
- }
- return id_translated;
-}
-
-static std::string id_name(void *id)
-{
- return ((ID*)id)->name + 2;
-}
-
-static std::string get_geometry_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-mesh";
-}
-
-static std::string get_light_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-light";
-}
-
-static std::string get_camera_id(Object *ob)
-{
- return translate_id(id_name(ob)) + "-camera";
-}
-
-std::string get_joint_id(Bone *bone, Object *ob_arm)
-{
- return translate_id(id_name(ob_arm) + "_" + bone->name);
-}
-
/*
Utilities to avoid code duplication.
Definition can take some time to understand, but they should be useful.
*/
-// f should have
-// void operator()(Object* ob)
-template<class Functor>
-void forEachMeshObjectInScene(Scene *sce, Functor &f)
-{
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && ob->data) {
- f(ob);
- }
- base= base->next;
-
- }
-}
template<class Functor>
void forEachObjectInScene(Scene *sce, Functor &f)
@@ -269,1078 +156,7 @@ void forEachObjectInScene(Scene *sce, Functor &f)
}
}
-template<class Functor>
-void forEachCameraObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_CAMERA && ob->data) {
- f(ob, sce);
- }
- base= base->next;
- }
-}
-
-template<class Functor>
-void forEachLampObjectInScene(Scene *sce, Functor &f)
-{
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_LAMP && ob->data) {
- f(ob);
- }
- base= base->next;
- }
-}
-
-// used in forEachMaterialInScene
-template <class MaterialFunctor>
-class ForEachMaterialFunctor
-{
- std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
- MaterialFunctor *f;
-public:
- ForEachMaterialFunctor(MaterialFunctor *f) : f(f) { }
- void operator ()(Object *ob)
- {
- int a;
- for(a = 0; a < ob->totcol; a++) {
-
- Material *ma = give_current_material(ob, a+1);
-
- if (!ma) continue;
-
- std::string translated_id = translate_id(id_name(ma));
- if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
- (*this->f)(ma, ob);
-
- mMat.push_back(translated_id);
- }
- }
- }
-};
-
-// calls f for each unique material linked to each object in sce
-// f should have
-// void operator()(Material* ma)
-template<class Functor>
-void forEachMaterialInScene(Scene *sce, Functor &f)
-{
- ForEachMaterialFunctor<Functor> matfunc(&f);
- forEachMeshObjectInScene(sce, matfunc);
-}
-
-// OB_MESH is assumed
-std::string getActiveUVLayerName(Object *ob)
-{
- Mesh *me = (Mesh*)ob->data;
-
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
- if (num_layers)
- return std::string(CustomData_get_active_layer_name(&me->fdata, CD_MTFACE));
-
- return "";
-}
-
-// TODO: optimize UV sets by making indexed list with duplicates removed
-class GeometryExporter : COLLADASW::LibraryGeometries
-{
- struct Face
- {
- unsigned int v1, v2, v3, v4;
- };
-
- struct Normal
- {
- float x, y, z;
- };
-
- Scene *mScene;
-
-public:
- GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
-
- void exportGeom(Scene *sce)
- {
- openLibrary();
-
- mScene = sce;
- forEachMeshObjectInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Object *ob)
- {
- // XXX don't use DerivedMesh, Mesh instead?
-
-#if 0
- DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
-#endif
- Mesh *me = (Mesh*)ob->data;
- std::string geom_id = get_geometry_id(ob);
- std::vector<Normal> nor;
- std::vector<Face> norind;
-
- bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
-
- create_normals(nor, norind, me);
-
- // openMesh(geoId, geoName, meshId)
- openMesh(geom_id);
-
- // writes <source> for vertex coords
- createVertsSource(geom_id, me);
-
- // writes <source> for normal coords
- createNormalsSource(geom_id, me, nor);
-
- bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
-
- // writes <source> for uv coords if mesh has uv coords
- if (has_uvs)
- createTexcoordsSource(geom_id, me);
-
- if (has_color)
- createVertexColorSource(geom_id, me);
-
- // <vertices>
- COLLADASW::Vertices verts(mSW);
- verts.setId(getIdBySemantics(geom_id, COLLADASW::VERTEX));
- COLLADASW::InputList &input_list = verts.getInputList();
- COLLADASW::Input input(COLLADASW::POSITION, getUrlBySemantics(geom_id, COLLADASW::POSITION));
- input_list.push_back(input);
- verts.add();
-
- // XXX slow
- if (ob->totcol) {
- for(int a = 0; a < ob->totcol; a++) {
- // account for NULL materials, this should not normally happen?
- Material *ma = give_current_material(ob, a + 1);
- createPolylist(ma != NULL, a, has_uvs, has_color, ob, geom_id, norind);
- }
- }
- else {
- createPolylist(false, 0, has_uvs, has_color, ob, geom_id, norind);
- }
-
- closeMesh();
- closeGeometry();
-
-#if 0
- dm->release(dm);
-#endif
- }
-
- // powerful because it handles both cases when there is material and when there's not
- void createPolylist(bool has_material,
- int material_index,
- bool has_uvs,
- bool has_color,
- Object *ob,
- std::string& geom_id,
- std::vector<Face>& norind)
- {
- Mesh *me = (Mesh*)ob->data;
- MFace *mfaces = me->mface;
- int totfaces = me->totface;
-
- // <vcount>
- int i;
- int faces_in_polylist = 0;
- std::vector<unsigned long> vcount_list;
-
- // count faces with this material
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- if ((has_material && f->mat_nr == material_index) || !has_material) {
- faces_in_polylist++;
- if (f->v4 == 0) {
- vcount_list.push_back(3);
- }
- else {
- vcount_list.push_back(4);
- }
- }
- }
-
- // no faces using this material
- if (faces_in_polylist == 0) {
- return;
- }
-
- Material *ma = has_material ? give_current_material(ob, material_index + 1) : NULL;
- COLLADASW::Polylist polylist(mSW);
-
- // sets count attribute in <polylist>
- polylist.setCount(faces_in_polylist);
-
- // sets material name
- if (has_material) {
- polylist.setMaterial(translate_id(id_name(ma)));
- }
-
- COLLADASW::InputList &til = polylist.getInputList();
-
- // creates <input> in <polylist> for vertices
- COLLADASW::Input input1(COLLADASW::VERTEX, getUrlBySemantics(geom_id, COLLADASW::VERTEX), 0);
-
- // creates <input> in <polylist> for normals
- COLLADASW::Input input2(COLLADASW::NORMAL, getUrlBySemantics(geom_id, COLLADASW::NORMAL), 1);
-
- til.push_back(input1);
- til.push_back(input2);
-
- // if mesh has uv coords writes <input> for TEXCOORD
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- for (i = 0; i < num_layers; i++) {
- // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
- COLLADASW::Input input3(COLLADASW::TEXCOORD,
- makeUrl(makeTexcoordSourceId(geom_id, i)),
- 2, // offset always 2, this is only until we have optimized UV sets
- i // set number equals UV layer index
- );
- til.push_back(input3);
- }
-
- if (has_color) {
- COLLADASW::Input input4(COLLADASW::COLOR, getUrlBySemantics(geom_id, COLLADASW::COLOR), has_uvs ? 3 : 2);
- til.push_back(input4);
- }
-
- // sets <vcount>
- polylist.setVCountList(vcount_list);
-
- // performs the actual writing
- polylist.prepareToAppendValues();
-
- // <p>
- int texindex = 0;
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- if ((has_material && f->mat_nr == material_index) || !has_material) {
-
- unsigned int *v = &f->v1;
- unsigned int *n = &norind[i].v1;
- for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
- polylist.appendValues(v[j]);
- polylist.appendValues(n[j]);
-
- if (has_uvs)
- polylist.appendValues(texindex + j);
-
- if (has_color)
- polylist.appendValues(texindex + j);
- }
- }
-
- texindex += 3;
- if (f->v4 != 0)
- texindex++;
- }
-
- polylist.finish();
- }
-
- // creates <source> for positions
- void createVertsSource(std::string geom_id, Mesh *me)
- {
-#if 0
- int totverts = dm->getNumVerts(dm);
- MVert *verts = dm->getVertArray(dm);
-#endif
- int totverts = me->totvert;
- MVert *verts = me->mvert;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::POSITION));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::POSITION) +
- ARRAY_ID_SUFFIX);
- source.setAccessorCount(totverts);
- source.setAccessorStride(3);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
- /*main function, it creates <source id = "">, <float_array id = ""
- count = ""> */
- source.prepareToAppendValues();
- //appends data to <float_array>
- int i = 0;
- for (i = 0; i < totverts; i++) {
- source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
- }
-
- source.finish();
-
- }
-
- void createVertexColorSource(std::string geom_id, Mesh *me)
- {
- if (!CustomData_has_layer(&me->fdata, CD_MCOL))
- return;
-
- MFace *f;
- int totcolor = 0, i, j;
-
- for (i = 0, f = me->mface; i < me->totface; i++, f++)
- totcolor += f->v4 ? 4 : 3;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::COLOR));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::COLOR) + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totcolor);
- source.setAccessorStride(3);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("R");
- param.push_back("G");
- param.push_back("B");
-
- source.prepareToAppendValues();
-
- int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
-
- MCol *mcol = (MCol*)me->fdata.layers[index].data;
- MCol *c = mcol;
-
- for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++)
- for (j = 0; j < (f->v4 ? 4 : 3); j++)
- source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f);
-
- source.finish();
- }
-
- std::string makeTexcoordSourceId(std::string& geom_id, int layer_index)
- {
- char suffix[20];
- sprintf(suffix, "-%d", layer_index);
- return getIdBySemantics(geom_id, COLLADASW::TEXCOORD) + suffix;
- }
-
- //creates <source> for texcoords
- void createTexcoordsSource(std::string geom_id, Mesh *me)
- {
-#if 0
- int totfaces = dm->getNumFaces(dm);
- MFace *mfaces = dm->getFaceArray(dm);
-#endif
- int totfaces = me->totface;
- MFace *mfaces = me->mface;
-
- int totuv = 0;
- int i;
-
- // count totuv
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
- if (f->v4 == 0) {
- totuv+=3;
- }
- else {
- totuv+=4;
- }
- }
-
- int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- // write <source> for each layer
- // each <source> will get id like meshName + "map-channel-1"
- for (int a = 0; a < num_layers; a++) {
- MTFace *tface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, a);
- // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, a);
-
- COLLADASW::FloatSourceF source(mSW);
- std::string layer_id = makeTexcoordSourceId(geom_id, a);
- source.setId(layer_id);
- source.setArrayId(layer_id + ARRAY_ID_SUFFIX);
-
- source.setAccessorCount(totuv);
- source.setAccessorStride(2);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("S");
- param.push_back("T");
-
- source.prepareToAppendValues();
-
- for (i = 0; i < totfaces; i++) {
- MFace *f = &mfaces[i];
-
- for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
- source.appendValues(tface[i].uv[j][0],
- tface[i].uv[j][1]);
- }
- }
-
- source.finish();
- }
- }
-
-
- //creates <source> for normals
- void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor)
- {
-#if 0
- int totverts = dm->getNumVerts(dm);
- MVert *verts = dm->getVertArray(dm);
-#endif
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(getIdBySemantics(geom_id, COLLADASW::NORMAL));
- source.setArrayId(getIdBySemantics(geom_id, COLLADASW::NORMAL) +
- ARRAY_ID_SUFFIX);
- source.setAccessorCount(nor.size());
- source.setAccessorStride(3);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("X");
- param.push_back("Y");
- param.push_back("Z");
-
- source.prepareToAppendValues();
-
- std::vector<Normal>::iterator it;
- for (it = nor.begin(); it != nor.end(); it++) {
- Normal& n = *it;
- source.appendValues(n.x, n.y, n.z);
- }
-
- source.finish();
- }
-
- void create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me)
- {
- int i, j, v;
- MVert *vert = me->mvert;
- std::map<unsigned int, unsigned int> nshar;
-
- for (i = 0; i < me->totface; i++) {
- MFace *fa = &me->mface[i];
- Face f;
- unsigned int *nn = &f.v1;
- unsigned int *vv = &fa->v1;
-
- memset(&f, 0, sizeof(f));
- v = fa->v4 == 0 ? 3 : 4;
-
- if (!(fa->flag & ME_SMOOTH)) {
- Normal n;
- if (v == 4)
- normal_quad_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co, vert[fa->v4].co);
- else
- normal_tri_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co);
- nor.push_back(n);
- }
-
- for (j = 0; j < v; j++) {
- if (fa->flag & ME_SMOOTH) {
- if (nshar.find(*vv) != nshar.end())
- *nn = nshar[*vv];
- else {
- Normal n = {
- vert[*vv].no[0]/32767.0,
- vert[*vv].no[1]/32767.0,
- vert[*vv].no[2]/32767.0
- };
- nor.push_back(n);
- *nn = nor.size() - 1;
- nshar[*vv] = *nn;
- }
- vv++;
- }
- else {
- *nn = nor.size() - 1;
- }
- nn++;
- }
-
- ind.push_back(f);
- }
- }
-
- std::string getIdBySemantics(std::string geom_id, COLLADASW::Semantics type, std::string other_suffix = "") {
- return geom_id + getSuffixBySemantic(type) + other_suffix;
- }
-
-
- COLLADASW::URI getUrlBySemantics(std::string geom_id, COLLADASW::Semantics type, std::string other_suffix = "") {
-
- std::string id(getIdBySemantics(geom_id, type, other_suffix));
- return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
-
- }
-
- COLLADASW::URI makeUrl(std::string id)
- {
- return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
- }
-
-
- /* int getTriCount(MFace *faces, int totface) {
- int i;
- int tris = 0;
- for (i = 0; i < totface; i++) {
- // if quad
- if (faces[i].v4 != 0)
- tris += 2;
- else
- tris++;
- }
-
- return tris;
- }*/
-};
-
-class TransformWriter : protected TransformBase
-{
-protected:
- void add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4])
- {
- float loc[3], rot[3], scale[3];
- float local[4][4];
-
- if (parent_mat) {
- float invpar[4][4];
- invert_m4_m4(invpar, parent_mat);
- mul_m4_m4m4(local, mat, invpar);
- }
- else {
- copy_m4_m4(local, mat);
- }
-
- TransformBase::decompose(local, loc, rot, NULL, scale);
-
- add_transform(node, loc, rot, scale);
- }
-
- void add_node_transform_ob(COLLADASW::Node& node, Object *ob)
- {
- float rot[3], loc[3], scale[3];
-
- if (ob->parent) {
- float C[4][4], tmat[4][4], imat[4][4], mat[4][4];
-
- // factor out scale from obmat
-
- copy_v3_v3(scale, ob->size);
-
- ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
- object_to_mat4(ob, C);
- copy_v3_v3(ob->size, scale);
- mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL);
-
- // calculate local mat
-
- invert_m4_m4(imat, ob->parent->obmat);
- mul_m4_m4m4(mat, tmat, imat);
-
- // done
-
- mat4_to_eul(rot, mat);
- copy_v3_v3(loc, mat[3]);
- }
- else {
- copy_v3_v3(loc, ob->loc);
- copy_v3_v3(rot, ob->rot);
- copy_v3_v3(scale, ob->size);
- }
-
- add_transform(node, loc, rot, scale);
- }
-
- void add_node_transform_identity(COLLADASW::Node& node)
- {
- float loc[] = {0.0f, 0.0f, 0.0f}, scale[] = {1.0f, 1.0f, 1.0f}, rot[] = {0.0f, 0.0f, 0.0f};
- add_transform(node, loc, rot, scale);
- }
-
-private:
- void add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3])
- {
- node.addTranslate("location", loc[0], loc[1], loc[2]);
- node.addRotateZ("rotationZ", COLLADABU::Math::Utils::radToDegF(rot[2]));
- node.addRotateY("rotationY", COLLADABU::Math::Utils::radToDegF(rot[1]));
- node.addRotateX("rotationX", COLLADABU::Math::Utils::radToDegF(rot[0]));
- node.addScale("scale", scale[0], scale[1], scale[2]);
- }
-};
-
-class InstanceWriter
-{
-protected:
- void add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob)
- {
- for(int a = 0; a < ob->totcol; a++) {
- Material *ma = give_current_material(ob, a+1);
-
- COLLADASW::InstanceMaterialList& iml = bind_material.getInstanceMaterialList();
-
- if (ma) {
- std::string matid(id_name(ma));
- matid = translate_id(matid);
- COLLADASW::InstanceMaterial im(matid, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
-
- // create <bind_vertex_input> for each uv layer
- Mesh *me = (Mesh*)ob->data;
- int totlayer = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
- for (int b = 0; b < totlayer; b++) {
- char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, b);
- im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", b));
- }
-
- iml.push_back(im);
- }
- }
- }
-};
-
-// XXX exporter writes wrong data for shared armatures. A separate
-// controller should be written for each armature-mesh binding how do
-// we make controller ids then?
-class ArmatureExporter: public COLLADASW::LibraryControllers, protected TransformWriter, protected InstanceWriter
-{
-private:
- Scene *scene;
-
-public:
- ArmatureExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryControllers(sw) {}
-
- // write bone nodes
- void add_armature_bones(Object *ob_arm, Scene *sce)
- {
- // write bone nodes
- bArmature *arm = (bArmature*)ob_arm->data;
- for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
- // start from root bones
- if (!bone->parent)
- add_bone_node(bone, ob_arm);
- }
- }
-
- bool is_skinned_mesh(Object *ob)
- {
- return get_assigned_armature(ob) != NULL;
- }
-
- void add_instance_controller(Object *ob)
- {
- Object *ob_arm = get_assigned_armature(ob);
- bArmature *arm = (bArmature*)ob_arm->data;
-
- const std::string& controller_id = get_controller_id(ob_arm, ob);
-
- COLLADASW::InstanceController ins(mSW);
- ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
-
- // write root bone URLs
- Bone *bone;
- for (bone = (Bone*)arm->bonebase.first; bone; bone = bone->next) {
- if (!bone->parent)
- ins.addSkeleton(COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_joint_id(bone, ob_arm)));
- }
-
- InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
-
- ins.add();
- }
-
- void export_controllers(Scene *sce)
- {
- scene = sce;
-
- openLibrary();
-
- forEachMeshObjectInScene(sce, *this);
-
- closeLibrary();
- }
-
- void operator()(Object *ob)
- {
- Object *ob_arm = get_assigned_armature(ob);
-
- if (ob_arm /*&& !already_written(ob_arm)*/)
- export_controller(ob, ob_arm);
- }
-
-private:
-
- UnitConverter converter;
-
-#if 0
- std::vector<Object*> written_armatures;
-
- bool already_written(Object *ob_arm)
- {
- return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) != written_armatures.end();
- }
-
- void wrote(Object *ob_arm)
- {
- written_armatures.push_back(ob_arm);
- }
-
- void find_objects_using_armature(Object *ob_arm, std::vector<Object *>& objects, Scene *sce)
- {
- objects.clear();
-
- Base *base= (Base*) sce->base.first;
- while(base) {
- Object *ob = base->object;
-
- if (ob->type == OB_MESH && get_assigned_armature(ob) == ob_arm) {
- objects.push_back(ob);
- }
-
- base= base->next;
- }
- }
-#endif
-
- Object *get_assigned_armature(Object *ob)
- {
- Object *ob_arm = NULL;
-
- if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
- ob_arm = ob->parent;
- }
- else {
- ModifierData *mod = (ModifierData*)ob->modifiers.first;
- while (mod) {
- if (mod->type == eModifierType_Armature) {
- ob_arm = ((ArmatureModifierData*)mod)->object;
- }
-
- mod = mod->next;
- }
- }
-
- return ob_arm;
- }
-
- std::string get_joint_sid(Bone *bone, Object *ob_arm)
- {
- return get_joint_id(bone, ob_arm);
- }
-
- // parent_mat is armature-space
- void add_bone_node(Bone *bone, Object *ob_arm)
- {
- std::string node_id = get_joint_id(bone, ob_arm);
- std::string node_name = std::string(bone->name);
- std::string node_sid = get_joint_sid(bone, ob_arm);
-
- COLLADASW::Node node(mSW);
-
- node.setType(COLLADASW::Node::JOINT);
- node.setNodeId(node_id);
- node.setNodeName(node_name);
- node.setNodeSid(node_sid);
-
- node.start();
-
- add_bone_transform(ob_arm, bone, node);
-
- for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
- add_bone_node(child, ob_arm);
- }
-
- node.end();
- }
-
- void add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW::Node& node)
- {
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, bone->name);
-
- float mat[4][4];
-
- if (bone->parent) {
- // get bone-space matrix from armature-space
- bPoseChannel *parchan = get_pose_channel(ob_arm->pose, bone->parent->name);
-
- float invpar[4][4];
- invert_m4_m4(invpar, parchan->pose_mat);
- mul_m4_m4m4(mat, pchan->pose_mat, invpar);
- }
- else {
- // get world-space from armature-space
- mul_m4_m4m4(mat, pchan->pose_mat, ob_arm->obmat);
- }
-
- TransformWriter::add_node_transform(node, mat, NULL);
- }
-
- std::string get_controller_id(Object *ob_arm, Object *ob)
- {
- return translate_id(id_name(ob_arm)) + "_" + translate_id(id_name(ob)) + SKIN_CONTROLLER_ID_SUFFIX;
- }
-
- // ob should be of type OB_MESH
- // both args are required
- void export_controller(Object* ob, Object *ob_arm)
- {
- // joint names
- // joint inverse bind matrices
- // vertex weights
-
- // input:
- // joint names: ob -> vertex group names
- // vertex group weights: me->dvert -> groups -> index, weight
-
- /*
- me->dvert:
-
- typedef struct MDeformVert {
- struct MDeformWeight *dw;
- int totweight;
- int flag; // flag only in use for weightpaint now
- } MDeformVert;
-
- typedef struct MDeformWeight {
- int def_nr;
- float weight;
- } MDeformWeight;
- */
-
- Mesh *me = (Mesh*)ob->data;
- if (!me->dvert) return;
-
- std::string controller_name = id_name(ob_arm);
- std::string controller_id = get_controller_id(ob_arm, ob);
-
- openSkin(controller_id, controller_name,
- COLLADABU::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
-
- add_bind_shape_mat(ob);
-
- std::string joints_source_id = add_joints_source(ob_arm, &ob->defbase, controller_id);
- std::string inv_bind_mat_source_id = add_inv_bind_mats_source(ob_arm, &ob->defbase, controller_id);
- std::string weights_source_id = add_weights_source(me, controller_id);
-
- add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
- add_vertex_weights_element(weights_source_id, joints_source_id, me, ob_arm, &ob->defbase);
-
- closeSkin();
- closeController();
- }
-
- void add_joints_element(ListBase *defbase,
- const std::string& joints_source_id, const std::string& inv_bind_mat_source_id)
- {
- COLLADASW::JointsElement joints(mSW);
- COLLADASW::InputList &input = joints.getInputList();
-
- input.push_back(COLLADASW::Input(COLLADASW::JOINT, // constant declared in COLLADASWInputList.h
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id)));
- input.push_back(COLLADASW::Input(COLLADASW::BINDMATRIX,
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, inv_bind_mat_source_id)));
- joints.add();
- }
-
- void add_bind_shape_mat(Object *ob)
- {
- double bind_mat[4][4];
-
- converter.mat4_to_dae_double(bind_mat, ob->obmat);
-
- addBindShapeTransform(bind_mat);
- }
-
- std::string add_joints_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
- {
- std::string source_id = controller_id + JOINTS_SOURCE_ID_SUFFIX;
-
- int totjoint = 0;
- bDeformGroup *def;
- for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
- if (is_bone_defgroup(ob_arm, def))
- totjoint++;
- }
-
- COLLADASW::NameSource source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totjoint);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("JOINT");
-
- source.prepareToAppendValues();
-
- for (def = (bDeformGroup*)defbase->first; def; def = def->next) {
- Bone *bone = get_bone_from_defgroup(ob_arm, def);
- if (bone)
- source.appendValues(get_joint_sid(bone, ob_arm));
- }
-
- source.finish();
-
- return source_id;
- }
-
- std::string add_inv_bind_mats_source(Object *ob_arm, ListBase *defbase, const std::string& controller_id)
- {
- std::string source_id = controller_id + BIND_POSES_SOURCE_ID_SUFFIX;
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(BLI_countlist(defbase));
- source.setAccessorStride(16);
-
- source.setParameterTypeName(&COLLADASW::CSWC::CSW_VALUE_TYPE_FLOAT4x4);
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("TRANSFORM");
-
- source.prepareToAppendValues();
-
- bPose *pose = ob_arm->pose;
- bArmature *arm = (bArmature*)ob_arm->data;
-
- int flag = arm->flag;
-
- // put armature in rest position
- if (!(arm->flag & ARM_RESTPOS)) {
- arm->flag |= ARM_RESTPOS;
- where_is_pose(scene, ob_arm);
- }
-
- for (bDeformGroup *def = (bDeformGroup*)defbase->first; def; def = def->next) {
- if (is_bone_defgroup(ob_arm, def)) {
-
- bPoseChannel *pchan = get_pose_channel(pose, def->name);
-
- float mat[4][4];
- float world[4][4];
- float inv_bind_mat[4][4];
-
- // make world-space matrix, pose_mat is armature-space
- mul_m4_m4m4(world, pchan->pose_mat, ob_arm->obmat);
-
- invert_m4_m4(mat, world);
- converter.mat4_to_dae(inv_bind_mat, mat);
-
- source.appendValues(inv_bind_mat);
- }
- }
-
- // back from rest positon
- if (!(flag & ARM_RESTPOS)) {
- arm->flag = flag;
- where_is_pose(scene, ob_arm);
- }
-
- source.finish();
-
- return source_id;
- }
-
- Bone *get_bone_from_defgroup(Object *ob_arm, bDeformGroup* def)
- {
- bPoseChannel *pchan = get_pose_channel(ob_arm->pose, def->name);
- return pchan ? pchan->bone : NULL;
- }
-
- bool is_bone_defgroup(Object *ob_arm, bDeformGroup* def)
- {
- return get_bone_from_defgroup(ob_arm, def) != NULL;
- }
-
- std::string add_weights_source(Mesh *me, const std::string& controller_id)
- {
- std::string source_id = controller_id + WEIGHTS_SOURCE_ID_SUFFIX;
-
- int i;
- int totweight = 0;
-
- for (i = 0; i < me->totvert; i++) {
- totweight += me->dvert[i].totweight;
- }
-
- COLLADASW::FloatSourceF source(mSW);
- source.setId(source_id);
- source.setArrayId(source_id + ARRAY_ID_SUFFIX);
- source.setAccessorCount(totweight);
- source.setAccessorStride(1);
-
- COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
- param.push_back("WEIGHT");
-
- source.prepareToAppendValues();
-
- // NOTE: COLLADA spec says weights should be normalized
-
- for (i = 0; i < me->totvert; i++) {
- MDeformVert *vert = &me->dvert[i];
- for (int j = 0; j < vert->totweight; j++) {
- source.appendValues(vert->dw[j].weight);
- }
- }
-
- source.finish();
-
- return source_id;
- }
-
- void add_vertex_weights_element(const std::string& weights_source_id, const std::string& joints_source_id, Mesh *me,
- Object *ob_arm, ListBase *defbase)
- {
- COLLADASW::VertexWeightsElement weights(mSW);
- COLLADASW::InputList &input = weights.getInputList();
-
- int offset = 0;
- input.push_back(COLLADASW::Input(COLLADASW::JOINT, // constant declared in COLLADASWInputList.h
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, joints_source_id), offset++));
- input.push_back(COLLADASW::Input(COLLADASW::WEIGHT,
- COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, weights_source_id), offset++));
-
- weights.setCount(me->totvert);
-
- // write number of deformers per vertex
- COLLADASW::PrimitivesBase::VCountList vcount;
- int i;
- for (i = 0; i < me->totvert; i++) {
- vcount.push_back(me->dvert[i].totweight);
- }
-
- weights.prepareToAppendVCountValues();
- weights.appendVertexCount(vcount);
-
- // def group index -> joint index
- std::map<int, int> joint_index_by_def_index;
- bDeformGroup *def;
- int j;
- for (def = (bDeformGroup*)defbase->first, i = 0, j = 0; def; def = def->next, i++) {
- if (is_bone_defgroup(ob_arm, def))
- joint_index_by_def_index[i] = j++;
- else
- joint_index_by_def_index[i] = -1;
- }
-
- weights.CloseVCountAndOpenVElement();
-
- // write deformer index - weight index pairs
- int weight_index = 0;
- for (i = 0; i < me->totvert; i++) {
- MDeformVert *dvert = &me->dvert[i];
- for (int j = 0; j < dvert->totweight; j++) {
- weights.appendValues(joint_index_by_def_index[dvert->dw[j].def_nr]);
- weights.appendValues(weight_index++);
- }
- }
-
- weights.finish();
- }
-};
class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
{
@@ -1474,6 +290,7 @@ public:
}
};
+<<<<<<< .working
class ImagesExporter: COLLADASW::LibraryImages
{
const char *mfilename;
@@ -1911,16 +728,19 @@ public:
}
};
+=======
+>>>>>>> .merge-right.r35190
// TODO: it would be better to instantiate animations rather than create a new one per object
// COLLADA allows this through multiple <channel>s in <animation>.
// For this to work, we need to know objects that use a certain action.
class AnimationExporter: COLLADASW::LibraryAnimations
{
Scene *scene;
+ COLLADASW::StreamWriter *sw;
public:
- AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) {}
+ AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) { this->sw = sw; }
void exportAnimations(Scene *sce)
{
@@ -1978,22 +798,22 @@ protected:
openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
// create input source
- std::string input_id = create_source_from_fcurve(Sampler::INPUT, fcu, anim_id, axis_name);
+ std::string input_id = create_source_from_fcurve(COLLADASW::InputSemantic::INPUT, fcu, anim_id, axis_name);
// create output source
- std::string output_id = create_source_from_fcurve(Sampler::OUTPUT, fcu, anim_id, axis_name);
+ std::string output_id = create_source_from_fcurve(COLLADASW::InputSemantic::OUTPUT, fcu, anim_id, axis_name);
// create interpolations source
std::string interpolation_id = create_interpolation_source(fcu->totvert, anim_id, axis_name);
std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sampler_id);
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
std::string empty;
- sampler.addInput(Sampler::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(Sampler::OUTPUT, COLLADABU::URI(empty, output_id));
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
// this input is required
- sampler.addInput(Sampler::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
addSampler(sampler);
@@ -2154,28 +974,28 @@ protected:
openAnimation(anim_id, COLLADABU::Utils::EMPTY_STRING);
// create input source
- std::string input_id = create_source_from_vector(Sampler::INPUT, fra, is_rot, anim_id, axis_name);
+ std::string input_id = create_source_from_vector(COLLADASW::InputSemantic::INPUT, fra, is_rot, anim_id, axis_name);
// create output source
std::string output_id;
if (axis == -1)
output_id = create_xyz_source(v, fra.size(), anim_id);
else
- output_id = create_source_from_array(Sampler::OUTPUT, v, fra.size(), is_rot, anim_id, axis_name);
+ output_id = create_source_from_array(COLLADASW::InputSemantic::OUTPUT, v, fra.size(), is_rot, anim_id, axis_name);
// create interpolations source
std::string interpolation_id = create_interpolation_source(fra.size(), anim_id, axis_name);
std::string sampler_id = std::string(anim_id) + SAMPLER_ID_SUFFIX;
- COLLADASW::LibraryAnimations::Sampler sampler(sampler_id);
+ COLLADASW::LibraryAnimations::Sampler sampler(sw, sampler_id);
std::string empty;
- sampler.addInput(Sampler::INPUT, COLLADABU::URI(empty, input_id));
- sampler.addInput(Sampler::OUTPUT, COLLADABU::URI(empty, output_id));
+ sampler.addInput(COLLADASW::InputSemantic::INPUT, COLLADABU::URI(empty, input_id));
+ sampler.addInput(COLLADASW::InputSemantic::OUTPUT, COLLADABU::URI(empty, output_id));
// TODO create in/out tangents source
// this input is required
- sampler.addInput(Sampler::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
+ sampler.addInput(COLLADASW::InputSemantic::INTERPOLATION, COLLADABU::URI(empty, interpolation_id));
addSampler(sampler);
@@ -2195,18 +1015,18 @@ protected:
return COLLADABU::Math::Utils::radToDegF(angle);
}
- std::string get_semantic_suffix(Sampler::Semantic semantic)
+ std::string get_semantic_suffix(COLLADASW::InputSemantic::Semantics semantic)
{
switch(semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
return INPUT_SOURCE_ID_SUFFIX;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
return OUTPUT_SOURCE_ID_SUFFIX;
- case Sampler::INTERPOLATION:
+ case COLLADASW::InputSemantic::INTERPOLATION:
return INTERPOLATION_SOURCE_ID_SUFFIX;
- case Sampler::IN_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
return INTANGENT_SOURCE_ID_SUFFIX;
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
return OUTTANGENT_SOURCE_ID_SUFFIX;
default:
break;
@@ -2215,13 +1035,13 @@ protected:
}
void add_source_parameters(COLLADASW::SourceBase::ParameterNameList& param,
- Sampler::Semantic semantic, bool is_rot, const char *axis)
+ COLLADASW::InputSemantic::Semantics semantic, bool is_rot, const char *axis)
{
switch(semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
param.push_back("TIME");
break;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
if (is_rot) {
param.push_back("ANGLE");
}
@@ -2236,8 +1056,8 @@ protected:
}
}
break;
- case Sampler::IN_TANGENT:
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
param.push_back("X");
param.push_back("Y");
break;
@@ -2246,14 +1066,14 @@ protected:
}
}
- void get_source_values(BezTriple *bezt, Sampler::Semantic semantic, bool rotation, float *values, int *length)
+ void get_source_values(BezTriple *bezt, COLLADASW::InputSemantic::Semantics semantic, bool rotation, float *values, int *length)
{
switch (semantic) {
- case Sampler::INPUT:
+ case COLLADASW::InputSemantic::INPUT:
*length = 1;
values[0] = convert_time(bezt->vec[1][0]);
break;
- case Sampler::OUTPUT:
+ case COLLADASW::InputSemantic::OUTPUT:
*length = 1;
if (rotation) {
values[0] = convert_angle(bezt->vec[1][1]);
@@ -2262,8 +1082,8 @@ protected:
values[0] = bezt->vec[1][1];
}
break;
- case Sampler::IN_TANGENT:
- case Sampler::OUT_TANGENT:
+ case COLLADASW::InputSemantic::IN_TANGENT:
+ case COLLADASW::InputSemantic::OUT_TANGENT:
// XXX
*length = 2;
break;
@@ -2273,7 +1093,7 @@ protected:
}
}
- std::string create_source_from_fcurve(Sampler::Semantic semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_fcurve(COLLADASW::InputSemantic::Semantics semantic, FCurve *fcu, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2307,7 +1127,7 @@ protected:
return source_id;
}
- std::string create_source_from_array(Sampler::Semantic semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_array(COLLADASW::InputSemantic::Semantics semantic, float *v, int tot, bool is_rot, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2324,7 +1144,7 @@ protected:
for (int i = 0; i < tot; i++) {
float val = v[i];
- if (semantic == Sampler::INPUT)
+ if (semantic == COLLADASW::InputSemantic::INPUT)
val = convert_time(val);
else if (is_rot)
val = convert_angle(val);
@@ -2336,7 +1156,7 @@ protected:
return source_id;
}
- std::string create_source_from_vector(Sampler::Semantic semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
+ std::string create_source_from_vector(COLLADASW::InputSemantic::Semantics semantic, std::vector<float> &fra, bool is_rot, const std::string& anim_id, const char *axis_name)
{
std::string source_id = anim_id + get_semantic_suffix(semantic);
@@ -2354,7 +1174,7 @@ protected:
std::vector<float>::iterator it;
for (it = fra.begin(); it != fra.end(); it++) {
float val = *it;
- if (semantic == Sampler::INPUT)
+ if (semantic == COLLADASW::InputSemantic::INPUT)
val = convert_time(val);
else if (is_rot)
val = convert_angle(val);
@@ -2369,7 +1189,7 @@ protected:
// only used for sources with OUTPUT semantic
std::string create_xyz_source(float *v, int tot, const std::string& anim_id)
{
- Sampler::Semantic semantic = Sampler::OUTPUT;
+ COLLADASW::InputSemantic::Semantics semantic = COLLADASW::InputSemantic::OUTPUT;
std::string source_id = anim_id + get_semantic_suffix(semantic);
COLLADASW::FloatSourceF source(mSW);
@@ -2395,7 +1215,7 @@ protected:
std::string create_interpolation_source(int tot, const std::string& anim_id, const char *axis_name)
{
- std::string source_id = anim_id + get_semantic_suffix(Sampler::INTERPOLATION);
+ std::string source_id = anim_id + get_semantic_suffix(COLLADASW::InputSemantic::INTERPOLATION);
COLLADASW::NameSource source(mSW);
source.setId(source_id);
@@ -2494,8 +1314,8 @@ protected:
find_frames(ob, fra, prefix, "rotation_euler");
else if (rotmode == ROT_MODE_QUAT)
find_frames(ob, fra, prefix, "rotation_quaternion");
- else if (rotmode == ROT_MODE_AXISANGLE)
- ;
+ /*else if (rotmode == ROT_MODE_AXISANGLE)
+ ;*/
}
// enable fcurves driving a specific bone, disable all the rest
@@ -2524,18 +1344,68 @@ protected:
void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
{
+ PointerRNA sceneptr, unit_settings;
+ PropertyRNA *system; /* unused , *scale; */
+
+ clear_global_id_map();
+
COLLADABU::NativeString native_filename =
COLLADABU::NativeString(std::string(filename));
COLLADASW::StreamWriter sw(native_filename);
- // open <Collada>
+ // open <collada>
sw.startDocument();
// <asset>
COLLADASW::Asset asset(&sw);
- // XXX ask blender devs about this?
- asset.setUnit("decimetre", 0.1);
+
+ RNA_id_pointer_create(&(sce->id), &sceneptr);
+ unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
+ system = RNA_struct_find_property(&unit_settings, "system");
+ //scale = RNA_struct_find_property(&unit_settings, "scale_length");
+
+ std::string unitname = "meter";
+ float linearmeasure = 1.0f;
+
+ linearmeasure = RNA_float_get(&unit_settings, "scale_length");
+
+ switch(RNA_property_enum_get(&unit_settings, system)) {
+ case USER_UNIT_NONE:
+ case USER_UNIT_METRIC:
+ if(linearmeasure == 0.001f) {
+ unitname = "millimeter";
+ }
+ else if(linearmeasure == 0.01f) {
+ unitname = "centimeter";
+ }
+ else if(linearmeasure == 0.1f) {
+ unitname = "decimeter";
+ }
+ else if(linearmeasure == 1.0f) {
+ unitname = "meter";
+ }
+ else if(linearmeasure == 1000.0f) {
+ unitname = "kilometer";
+ }
+ break;
+ case USER_UNIT_IMPERIAL:
+ if(linearmeasure == 0.0254f) {
+ unitname = "inch";
+ }
+ else if(linearmeasure == 0.3048f) {
+ unitname = "foot";
+ }
+ else if(linearmeasure == 0.9144f) {
+ unitname = "yard";
+ }
+ break;
+ default:
+ break;
+ }
+
+ asset.setUnit(unitname, linearmeasure);
asset.setUpAxisType(COLLADASW::Asset::Z_UP);
+<<<<<<< .working
// TODO: need an Author field in userpref
asset.getContributor().mAuthor = "Blender User";
#ifdef NAN_BUILDINFO
@@ -2545,6 +1415,22 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
#else
asset.getContributor().mAuthoringTool = "Blender 2.5x";
#endif
+=======
+ // TODO: need an Author field in userpref
+ if(strlen(U.author) > 0) {
+ asset.getContributor().mAuthor = U.author;
+ }
+ else {
+ asset.getContributor().mAuthor = "Blender User";
+ }
+#ifdef NAN_BUILDINFO
+ char version_buf[128];
+ sprintf(version_buf, "Blender %d.%02d.%d r%s", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION, build_rev);
+ asset.getContributor().mAuthoringTool = version_buf;
+#else
+ asset.getContributor().mAuthoringTool = "Blender 2.5x";
+#endif
+>>>>>>> .merge-right.r35190
asset.add();
// <library_cameras>
diff --git a/source/blender/collada/DocumentExporter.h b/source/blender/collada/DocumentExporter.h
index bb6d400fdf1..9d6d2114cd8 100644
--- a/source/blender/collada/DocumentExporter.h
+++ b/source/blender/collada/DocumentExporter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,6 +21,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file DocumentExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __DOCUMENTEXPORTER_H__
+#define __DOCUMENTEXPORTER_H__
+
struct Scene;
class DocumentExporter
@@ -29,3 +37,5 @@ class DocumentExporter
void exportCurrentScene(Scene *sce, const char* filename);
void exportScenes(const char* filename);
};
+
+#endif
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index b9052d23511..2267cf747b1 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,3204 +25,68 @@
// * name imported objects
// * import object rotation as euler
+#include <string>
+#include <map>
+#include <algorithm> // sort()
+
#include "COLLADAFWRoot.h"
-#include "COLLADAFWIWriter.h"
#include "COLLADAFWStableHeaders.h"
-#include "COLLADAFWAnimationCurve.h"
-#include "COLLADAFWAnimationList.h"
-#include "COLLADAFWCamera.h"
#include "COLLADAFWColorOrTexture.h"
-#include "COLLADAFWEffect.h"
-#include "COLLADAFWFloatOrDoubleArray.h"
-#include "COLLADAFWGeometry.h"
-#include "COLLADAFWImage.h"
#include "COLLADAFWIndexList.h"
-#include "COLLADAFWInstanceGeometry.h"
-#include "COLLADAFWLight.h"
-#include "COLLADAFWMaterial.h"
-#include "COLLADAFWMesh.h"
#include "COLLADAFWMeshPrimitiveWithFaceVertexCount.h"
-#include "COLLADAFWNode.h"
#include "COLLADAFWPolygons.h"
#include "COLLADAFWSampler.h"
-#include "COLLADAFWSkinController.h"
-#include "COLLADAFWSkinControllerData.h"
-#include "COLLADAFWTransformation.h"
-#include "COLLADAFWTranslate.h"
-#include "COLLADAFWRotate.h"
-#include "COLLADAFWScale.h"
-#include "COLLADAFWMatrix.h"
#include "COLLADAFWTypes.h"
#include "COLLADAFWVisualScene.h"
-#include "COLLADAFWFileInfo.h"
#include "COLLADAFWArrayPrimitiveType.h"
+#include "COLLADAFWLibraryNodes.h"
+#include "COLLADAFWCamera.h"
+#include "COLLADAFWLight.h"
#include "COLLADASaxFWLLoader.h"
-// TODO move "extern C" into header files
-extern "C"
-{
-#include "ED_keyframing.h"
-#include "ED_armature.h"
-#include "ED_mesh.h" // ED_vgroup_vert_add, ...
-#include "ED_anim_api.h"
-#include "ED_object.h"
-
-#include "WM_types.h"
-#include "WM_api.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_main.h"
-#include "BKE_customdata.h"
#include "BKE_library.h"
#include "BKE_texture.h"
#include "BKE_fcurve.h"
#include "BKE_depsgraph.h"
#include "BLI_path_util.h"
-#include "BKE_displist.h"
-#include "BLI_math.h"
#include "BKE_scene.h"
-}
-#include "BKE_armature.h"
-#include "BKE_mesh.h"
#include "BKE_global.h"
-#include "BKE_context.h"
-#include "BKE_object.h"
-#include "BKE_image.h"
#include "BKE_material.h"
#include "BKE_utildefines.h"
-#include "BKE_action.h"
-
-#include "BLI_math.h"
-#include "BLI_listbase.h"
-#include "BLI_string.h"
+#include "BKE_image.h"
-#include "DNA_lamp_types.h"
-#include "DNA_armature_types.h"
-#include "DNA_anim_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_texture_types.h"
#include "DNA_camera_types.h"
-#include "DNA_object_types.h"
-#include "DNA_meshdata_types.h"
-#include "DNA_mesh_types.h"
-#include "DNA_material_types.h"
-#include "DNA_scene_types.h"
-#include "DNA_modifier_types.h"
+#include "DNA_lamp_types.h"
+
+#include "RNA_access.h"
#include "MEM_guardedalloc.h"
#include "DocumentImporter.h"
#include "collada_internal.h"
-#include <string>
-#include <map>
-#include <algorithm> // sort()
-
-#include <math.h>
-#include <float.h>
-
-// #define COLLADA_DEBUG
-
-// creates empties for each imported bone on layer 2, for debugging
-// #define ARMATURE_TEST
-
-char *CustomData_get_layer_name(const struct CustomData *data, int type, int n);
-
-static const char *primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
-{
- using namespace COLLADAFW;
-
- switch (type) {
- case MeshPrimitive::LINES:
- return "LINES";
- case MeshPrimitive::LINE_STRIPS:
- return "LINESTRIPS";
- case MeshPrimitive::POLYGONS:
- return "POLYGONS";
- case MeshPrimitive::POLYLIST:
- return "POLYLIST";
- case MeshPrimitive::TRIANGLES:
- return "TRIANGLES";
- case MeshPrimitive::TRIANGLE_FANS:
- return "TRIANGLE_FANS";
- case MeshPrimitive::TRIANGLE_STRIPS:
- return "TRIANGLE_FANS";
- case MeshPrimitive::POINTS:
- return "POINTS";
- case MeshPrimitive::UNDEFINED_PRIMITIVE_TYPE:
- return "UNDEFINED_PRIMITIVE_TYPE";
- }
- return "UNKNOWN";
-}
-
-static const char *geomTypeToStr(COLLADAFW::Geometry::GeometryType type)
-{
- switch (type) {
- case COLLADAFW::Geometry::GEO_TYPE_MESH:
- return "MESH";
- case COLLADAFW::Geometry::GEO_TYPE_SPLINE:
- return "SPLINE";
- case COLLADAFW::Geometry::GEO_TYPE_CONVEX_MESH:
- return "CONVEX_MESH";
- case COLLADAFW::Geometry::GEO_TYPE_UNKNOWN:
- default:
- return "UNKNOWN";
- }
-}
-
-// works for COLLADAFW::Node, COLLADAFW::Geometry
-template<class T>
-static const char *get_dae_name(T *node)
-{
- const std::string& name = node->getName();
- return name.size() ? name.c_str() : node->getOriginalId().c_str();
-}
-
-// use this for retrieving bone names, since these must be unique
-template<class T>
-static const char *get_joint_name(T *node)
-{
- const std::string& id = node->getOriginalId();
- return id.size() ? id.c_str() : node->getName().c_str();
-}
-
-static float get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index)
-{
- if (index >= array.getValuesCount())
- return 0.0f;
-
- if (array.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT)
- return array.getFloatValues()->getData()[index];
- else
- return array.getDoubleValues()->getData()[index];
-}
-
-// copied from /editors/object/object_relations.c
-static int test_parent_loop(Object *par, Object *ob)
-{
- /* test if 'ob' is a parent somewhere in par's parents */
-
- if(par == NULL) return 0;
- if(ob == par) return 1;
-
- return test_parent_loop(par->parent, ob);
-}
-
-// a shortened version of parent_set_exec()
-// if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting
-static int set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true)
-{
- if (!par || test_parent_loop(par, ob))
- return false;
-
- Object workob;
- Main *bmain = CTX_data_main(C);
- Scene *sce = CTX_data_scene(C);
-
- ob->parent = par;
- ob->partype = PAROBJECT;
-
- ob->parsubstr[0] = 0;
-
- if (is_parent_space) {
- // calc par->obmat
- where_is_object(sce, par);
-
- // move child obmat into world space
- float mat[4][4];
- mul_m4_m4m4(mat, ob->obmat, par->obmat);
- copy_m4_m4(ob->obmat, mat);
- }
-
- // apply child obmat (i.e. decompose it into rot/loc/size)
- object_apply_mat4(ob, ob->obmat);
-
- // compute parentinv
- what_does_parent(sce, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
-
- ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
- par->recalc |= OB_RECALC_OB;
-
- DAG_scene_sort(bmain, sce);
- DAG_ids_flush_update(bmain, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return true;
-}
-
-typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
-
-class TransformReader : public TransformBase
-{
-protected:
-
- UnitConverter *unit_converter;
-
- struct Animation {
- Object *ob;
- COLLADAFW::Node *node;
- COLLADAFW::Transformation *tm; // which transform is animated by an AnimationList->id
- };
-
-public:
-
- TransformReader(UnitConverter* conv) : unit_converter(conv) {}
-
- void get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map,
- Object *ob)
- {
- float cur[4][4];
- float copy[4][4];
-
- unit_m4(mat);
-
- for (unsigned int i = 0; i < node->getTransformations().getCount(); i++) {
-
- COLLADAFW::Transformation *tm = node->getTransformations()[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- switch(type) {
- case COLLADAFW::Transformation::TRANSLATE:
- dae_translate_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::ROTATE:
- dae_rotate_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::SCALE:
- dae_scale_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::MATRIX:
- dae_matrix_to_mat4(tm, cur);
- break;
- case COLLADAFW::Transformation::LOOKAT:
- case COLLADAFW::Transformation::SKEW:
- fprintf(stderr, "LOOKAT and SKEW transformations are not supported yet.\n");
- break;
- }
-
- copy_m4_m4(copy, mat);
- mul_m4_m4m4(mat, cur, copy);
-
- if (animation_map) {
- // AnimationList that drives this Transformation
- const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();
-
- // store this so later we can link animation data with ob
- Animation anim = {ob, node, tm};
- (*animation_map)[anim_list_id] = anim;
- }
- }
- }
-
- void dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)tm;
- COLLADABU::Math::Vector3& axis = ro->getRotationAxis();
- float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
- float ax[] = {axis[0], axis[1], axis[2]};
- // float quat[4];
- // axis_angle_to_quat(quat, axis, angle);
- // quat_to_mat4(m, quat);
- axis_angle_to_mat4(m, ax, angle);
- }
-
- void dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADAFW::Translate *tra = (COLLADAFW::Translate*)tm;
- COLLADABU::Math::Vector3& t = tra->getTranslation();
-
- unit_m4(m);
-
- m[3][0] = (float)t[0];
- m[3][1] = (float)t[1];
- m[3][2] = (float)t[2];
- }
-
- void dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)tm)->getScale();
- float size[3] = {(float)s[0], (float)s[1], (float)s[2]};
- size_to_mat4(m, size);
- }
-
- void dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
- {
- unit_converter->dae_matrix_to_mat4(m, ((COLLADAFW::Matrix*)tm)->getMatrix());
- }
-
- void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3])
- {
- dae_vector3_to_v3(((COLLADAFW::Translate*)tm)->getTranslation(), v);
- }
-
- void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3])
- {
- dae_vector3_to_v3(((COLLADAFW::Scale*)tm)->getScale(), v);
- }
-
- void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3])
- {
- v[0] = v3.x;
- v[1] = v3.y;
- v[2] = v3.z;
- }
-};
-
-// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
-class MeshImporterBase
-{
-public:
- virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid) = 0;
-};
-
-// ditto as above
-class AnimationImporterBase
-{
-public:
- // virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
-};
-
-class ArmatureImporter : private TransformReader
-{
-private:
- Scene *scene;
- UnitConverter *unit_converter;
-
- // std::map<int, JointData> joint_index_to_joint_info_map;
- // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
-
- struct LeafBone {
- // COLLADAFW::Node *node;
- EditBone *bone;
- char name[32];
- float mat[4][4]; // bone matrix, derived from inv_bind_mat
- };
- std::vector<LeafBone> leaf_bones;
- // int bone_direction_row; // XXX not used
- float leaf_bone_length;
- int totbone;
- // XXX not used
- // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
-
-#if 0
- struct ArmatureJoints {
- Object *ob_arm;
- std::vector<COLLADAFW::Node*> root_joints;
- };
- std::vector<ArmatureJoints> armature_joints;
-#endif
-
- Object *empty; // empty for leaf bones
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
- std::vector<COLLADAFW::Node*> root_joints;
- std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
-
- MeshImporterBase *mesh_importer;
- AnimationImporterBase *anim_importer;
-
- // This is used to store data passed in write_controller_data.
- // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
- // so that arrays don't get freed until we free them explicitly.
- class SkinInfo
- {
- private:
- // to build armature bones from inverse bind matrices
- struct JointData {
- float inv_bind_mat[4][4]; // joint inverse bind matrix
- COLLADAFW::UniqueId joint_uid; // joint node UID
- // Object *ob_arm; // armature object
- };
-
- float bind_shape_matrix[4][4];
-
- // data from COLLADAFW::SkinControllerData, each array should be freed
- COLLADAFW::UIntValuesArray joints_per_vertex;
- COLLADAFW::UIntValuesArray weight_indices;
- COLLADAFW::IntValuesArray joint_indices;
- // COLLADAFW::FloatOrDoubleArray weights;
- std::vector<float> weights;
-
- std::vector<JointData> joint_data; // index to this vector is joint index
-
- UnitConverter *unit_converter;
-
- Object *ob_arm;
- COLLADAFW::UniqueId controller_uid;
- Object *parent;
-
- public:
-
- SkinInfo() {}
-
- SkinInfo(const SkinInfo& skin) : weights(skin.weights),
- joint_data(skin.joint_data),
- unit_converter(skin.unit_converter),
- ob_arm(skin.ob_arm),
- controller_uid(skin.controller_uid),
- parent(skin.parent)
- {
- copy_m4_m4(bind_shape_matrix, (float (*)[4])skin.bind_shape_matrix);
-
- transfer_uint_array_data_const(skin.joints_per_vertex, joints_per_vertex);
- transfer_uint_array_data_const(skin.weight_indices, weight_indices);
- transfer_int_array_data_const(skin.joint_indices, joint_indices);
- }
-
- SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL), parent(NULL) {}
-
- // nobody owns the data after this, so it should be freed manually with releaseMemory
- template <class T>
- void transfer_array_data(T& src, T& dest)
- {
- dest.setData(src.getData(), src.getCount());
- src.yieldOwnerShip();
- dest.yieldOwnerShip();
- }
-
- // when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
- void transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest)
- {
- dest.setData((int*)src.getData(), src.getCount());
- dest.yieldOwnerShip();
- }
-
- void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest)
- {
- dest.setData((unsigned int*)src.getData(), src.getCount());
- dest.yieldOwnerShip();
- }
-
- void borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin)
- {
- transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getJointsPerVertex(), joints_per_vertex);
- transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getWeightIndices(), weight_indices);
- transfer_array_data((COLLADAFW::IntValuesArray&)skin->getJointIndices(), joint_indices);
- // transfer_array_data(skin->getWeights(), weights);
-
- // cannot transfer data for FloatOrDoubleArray, copy values manually
- const COLLADAFW::FloatOrDoubleArray& weight = skin->getWeights();
- for (unsigned int i = 0; i < weight.getValuesCount(); i++)
- weights.push_back(get_float_value(weight, i));
-
- unit_converter->dae_matrix_to_mat4(bind_shape_matrix, skin->getBindShapeMatrix());
- }
-
- void free()
- {
- joints_per_vertex.releaseMemory();
- weight_indices.releaseMemory();
- joint_indices.releaseMemory();
- // weights.releaseMemory();
- }
-
- // using inverse bind matrices to construct armature
- // it is safe to invert them to get the original matrices
- // because if they are inverse matrices, they can be inverted
- void add_joint(const COLLADABU::Math::Matrix4& matrix)
- {
- JointData jd;
- unit_converter->dae_matrix_to_mat4(jd.inv_bind_mat, matrix);
- joint_data.push_back(jd);
- }
-
- void set_controller(const COLLADAFW::SkinController* co)
- {
- controller_uid = co->getUniqueId();
-
- // fill in joint UIDs
- const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints();
- for (unsigned int i = 0; i < joint_uids.getCount(); i++) {
- joint_data[i].joint_uid = joint_uids[i];
-
- // // store armature pointer
- // JointData& jd = joint_index_to_joint_info_map[i];
- // jd.ob_arm = ob_arm;
-
- // now we'll be able to get inv bind matrix from joint id
- // joint_id_to_joint_index_map[joint_ids[i]] = i;
- }
- }
-
- // called from write_controller
- Object *create_armature(Scene *scene)
- {
- ob_arm = add_object(scene, OB_ARMATURE);
- return ob_arm;
- }
-
- Object* set_armature(Object *ob_arm)
- {
- if (this->ob_arm)
- return this->ob_arm;
-
- this->ob_arm = ob_arm;
- return ob_arm;
- }
-
- bool get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& uid = node->getUniqueId();
- std::vector<JointData>::iterator it;
- for (it = joint_data.begin(); it != joint_data.end(); it++) {
- if ((*it).joint_uid == uid) {
- copy_m4_m4(inv_bind_mat, (*it).inv_bind_mat);
- return true;
- }
- }
-
- return false;
- }
-
- Object *get_armature()
- {
- return ob_arm;
- }
-
- const COLLADAFW::UniqueId& get_controller_uid()
- {
- return controller_uid;
- }
-
- // check if this skin controller references a joint or any descendant of it
- //
- // some nodes may not be referenced by SkinController,
- // in this case to determine if the node belongs to this armature,
- // we need to search down the tree
- bool uses_joint_or_descendant(COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& uid = node->getUniqueId();
- std::vector<JointData>::iterator it;
- for (it = joint_data.begin(); it != joint_data.end(); it++) {
- if ((*it).joint_uid == uid)
- return true;
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (uses_joint_or_descendant(children[i]))
- return true;
- }
-
- return false;
- }
-
- void link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
- TransformReader *tm)
- {
- Main *bmain = CTX_data_main(C);
- Scene *scene = CTX_data_scene(C);
-
- ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
- ((ArmatureModifierData *)md)->object = ob_arm;
-
- copy_m4_m4(ob->obmat, bind_shape_matrix);
- object_apply_mat4(ob, ob->obmat);
-#if 1
- ::set_parent(ob, ob_arm, C);
-#else
- Object workob;
- ob->parent = ob_arm;
- ob->partype = PAROBJECT;
-
- what_does_parent(scene, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
-
- ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
-
- DAG_scene_sort(bmain, scene);
- DAG_ids_flush_update(bmain, 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-#endif
-
- ((bArmature*)ob_arm->data)->deformflag = ARM_DEF_VGROUP;
-
- // create all vertex groups
- std::vector<JointData>::iterator it;
- int joint_index;
- for (it = joint_data.begin(), joint_index = 0; it != joint_data.end(); it++, joint_index++) {
- const char *name = "Group";
-
- // name group by joint node name
- if (joint_by_uid.find((*it).joint_uid) != joint_by_uid.end()) {
- name = get_joint_name(joint_by_uid[(*it).joint_uid]);
- }
-
- ED_vgroup_add_name(ob, (char*)name);
- }
-
- // <vcount> - number of joints per vertex - joints_per_vertex
- // <v> - [[bone index, weight index] * joints per vertex] * vertices - weight indices
- // ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
-
- // for each vertex in weight indices
- // for each bone index in vertex
- // add vertex to group at group index
- // treat group index -1 specially
-
- // get def group by index with BLI_findlink
-
- for (unsigned int vertex = 0, weight = 0; vertex < joints_per_vertex.getCount(); vertex++) {
-
- unsigned int limit = weight + joints_per_vertex[vertex];
- for ( ; weight < limit; weight++) {
- int joint = joint_indices[weight], joint_weight = weight_indices[weight];
-
- // -1 means "weight towards the bind shape", we just don't assign it to any group
- if (joint != -1) {
- bDeformGroup *def = (bDeformGroup*)BLI_findlink(&ob->defbase, joint);
-
- ED_vgroup_vert_add(ob, def, vertex, weights[joint_weight], WEIGHT_REPLACE);
- }
- }
- }
- }
-
- bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node)
- {
- return get_pose_channel(ob_arm->pose, get_joint_name(node));
- }
-
- void set_parent(Object *_parent)
- {
- parent = _parent;
- }
-
- Object* get_parent()
- {
- return parent;
- }
-
- void find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
- std::vector<COLLADAFW::Node*>& result)
- {
- std::vector<COLLADAFW::Node*>::const_iterator it;
- for (it = root_joints.begin(); it != root_joints.end(); it++) {
- COLLADAFW::Node *root = *it;
- std::vector<JointData>::iterator ji;
- for (ji = joint_data.begin(); ji != joint_data.end(); ji++) {
- COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid];
- if (find_node_in_tree(joint, root)) {
- if (std::find(result.begin(), result.end(), root) == result.end())
- result.push_back(root);
- }
- }
- }
- }
-
- bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root)
- {
- if (node == tree_root)
- return true;
-
- COLLADAFW::NodePointerArray& children = tree_root->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (find_node_in_tree(node, children[i]))
- return true;
- }
-
- return false;
- }
-
- };
-
- std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
-#if 0
- JointData *get_joint_data(COLLADAFW::Node *node)
- {
- const COLLADAFW::UniqueId& joint_id = node->getUniqueId();
-
- if (joint_id_to_joint_index_map.find(joint_id) == joint_id_to_joint_index_map.end()) {
- fprintf(stderr, "Cannot find a joint index by joint id for %s.\n",
- node->getOriginalId().c_str());
- return NULL;
- }
-
- int joint_index = joint_id_to_joint_index_map[joint_id];
-
- return &joint_index_to_joint_info_map[joint_index];
- }
-#endif
-
- void create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
- float parent_mat[][4], bArmature *arm)
- {
- float joint_inv_bind_mat[4][4];
-
- // JointData* jd = get_joint_data(node);
-
- float mat[4][4];
-
- if (skin.get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) {
- // get original world-space matrix
- invert_m4_m4(mat, joint_inv_bind_mat);
- }
- // create a bone even if there's no joint data for it (i.e. it has no influence)
- else {
- float obmat[4][4];
-
- // object-space
- get_node_mat(obmat, node, NULL, NULL);
-
- // get world-space
- if (parent)
- mul_m4_m4m4(mat, obmat, parent_mat);
- else
- copy_m4_m4(mat, obmat);
- }
-
- // TODO rename from Node "name" attrs later
- EditBone *bone = ED_armature_edit_bone_add(arm, (char*)get_joint_name(node));
- totbone++;
-
- if (parent) bone->parent = parent;
-
- // set head
- copy_v3_v3(bone->head, mat[3]);
-
- // set tail, don't set it to head because 0-length bones are not allowed
- float vec[3] = {0.0f, 0.5f, 0.0f};
- add_v3_v3v3(bone->tail, bone->head, vec);
-
- // set parent tail
- if (parent && totchild == 1) {
- copy_v3_v3(parent->tail, bone->head);
-
- // not setting BONE_CONNECTED because this would lock child bone location with respect to parent
- // bone->flag |= BONE_CONNECTED;
-
- // XXX increase this to prevent "very" small bones?
- const float epsilon = 0.000001f;
-
- // derive leaf bone length
- float length = len_v3v3(parent->head, parent->tail);
- if ((length < leaf_bone_length || totbone == 0) && length > epsilon) {
- leaf_bone_length = length;
- }
-
- // treat zero-sized bone like a leaf bone
- if (length <= epsilon) {
- add_leaf_bone(parent_mat, parent);
- }
-
- /*
-#if 0
- // and which row in mat is bone direction
- float vec[3];
- sub_v3_v3v3(vec, parent->tail, parent->head);
-#ifdef COLLADA_DEBUG
- print_v3("tail - head", vec);
- print_m4("matrix", parent_mat);
-#endif
- for (int i = 0; i < 3; i++) {
-#ifdef COLLADA_DEBUG
- char *axis_names[] = {"X", "Y", "Z"};
- printf("%s-axis length is %f\n", axis_names[i], len_v3(parent_mat[i]));
-#endif
- float angle = angle_v2v2(vec, parent_mat[i]);
- if (angle < min_angle) {
-#ifdef COLLADA_DEBUG
- print_v3("picking", parent_mat[i]);
- printf("^ %s axis of %s's matrix\n", axis_names[i], get_dae_name(node));
-#endif
- bone_direction_row = i;
- min_angle = angle;
- }
- }
-#endif
- */
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- create_bone(skin, children[i], bone, children.getCount(), mat, arm);
- }
-
- // in second case it's not a leaf bone, but we handle it the same way
- if (!children.getCount() || children.getCount() > 1) {
- add_leaf_bone(mat, bone);
- }
- }
-
- void add_leaf_bone(float mat[][4], EditBone *bone)
- {
- LeafBone leaf;
-
- leaf.bone = bone;
- copy_m4_m4(leaf.mat, mat);
- BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
-
- leaf_bones.push_back(leaf);
- }
-
- void fix_leaf_bones()
- {
- // just setting tail for leaf bones here
-
- std::vector<LeafBone>::iterator it;
- for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
- LeafBone& leaf = *it;
-
- // pointing up
- float vec[3] = {0.0f, 0.0f, 1.0f};
-
- mul_v3_fl(vec, leaf_bone_length);
-
- copy_v3_v3(leaf.bone->tail, leaf.bone->head);
- add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
- }
- }
-
- void set_leaf_bone_shapes(Object *ob_arm)
- {
- bPose *pose = ob_arm->pose;
-
- std::vector<LeafBone>::iterator it;
- for (it = leaf_bones.begin(); it != leaf_bones.end(); it++) {
- LeafBone& leaf = *it;
-
- bPoseChannel *pchan = get_pose_channel(pose, leaf.name);
- if (pchan) {
- pchan->custom = get_empty_for_leaves();
- }
- else {
- fprintf(stderr, "Cannot find a pose channel for leaf bone %s\n", leaf.name);
- }
- }
- }
-
-#if 0
- void set_euler_rotmode()
- {
- // just set rotmode = ROT_MODE_EUL on pose channel for each joint
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>::iterator it;
-
- for (it = joint_by_uid.begin(); it != joint_by_uid.end(); it++) {
-
- COLLADAFW::Node *joint = it->second;
-
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator sit;
-
- for (sit = skin_by_data_uid.begin(); sit != skin_by_data_uid.end(); sit++) {
- SkinInfo& skin = sit->second;
-
- if (skin.uses_joint_or_descendant(joint)) {
- bPoseChannel *pchan = skin.get_pose_channel_from_node(joint);
-
- if (pchan) {
- pchan->rotmode = ROT_MODE_EUL;
- }
- else {
- fprintf(stderr, "Cannot find pose channel for %s.\n", get_joint_name(joint));
- }
-
- break;
- }
- }
- }
- }
-#endif
-
- Object *get_empty_for_leaves()
- {
- if (empty) return empty;
-
- empty = add_object(scene, OB_EMPTY);
- empty->empty_drawtype = OB_EMPTY_SPHERE;
-
- return empty;
- }
-
-#if 0
- Object *find_armature(COLLADAFW::Node *node)
- {
- JointData* jd = get_joint_data(node);
- if (jd) return jd->ob_arm;
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (int i = 0; i < children.getCount(); i++) {
- Object *ob_arm = find_armature(children[i]);
- if (ob_arm) return ob_arm;
- }
-
- return NULL;
- }
-
- ArmatureJoints& get_armature_joints(Object *ob_arm)
- {
- // try finding it
- std::vector<ArmatureJoints>::iterator it;
- for (it = armature_joints.begin(); it != armature_joints.end(); it++) {
- if ((*it).ob_arm == ob_arm) return *it;
- }
-
- // not found, create one
- ArmatureJoints aj;
- aj.ob_arm = ob_arm;
- armature_joints.push_back(aj);
-
- return armature_joints.back();
- }
-#endif
-
- void create_armature_bones(SkinInfo& skin)
- {
- // just do like so:
- // - get armature
- // - enter editmode
- // - add edit bones and head/tail properties using matrices and parent-child info
- // - exit edit mode
- // - set a sphere shape to leaf bones
-
- Object *ob_arm = NULL;
-
- /*
- * find if there's another skin sharing at least one bone with this skin
- * if so, use that skin's armature
- */
-
- /*
- Pseudocode:
-
- find_node_in_tree(node, root_joint)
-
- skin::find_root_joints(root_joints):
- std::vector root_joints;
- for each root in root_joints:
- for each joint in joints:
- if find_node_in_tree(joint, root):
- if (std::find(root_joints.begin(), root_joints.end(), root) == root_joints.end())
- root_joints.push_back(root);
-
- for (each skin B with armature) {
- find all root joints for skin B
-
- for each joint X in skin A:
- for each root joint R in skin B:
- if (find_node_in_tree(X, R)) {
- shared = 1;
- goto endloop;
- }
- }
-
- endloop:
- */
-
- SkinInfo *a = &skin;
- Object *shared = NULL;
- std::vector<COLLADAFW::Node*> skin_root_joints;
-
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo *b = &it->second;
- if (b == a || b->get_armature() == NULL)
- continue;
-
- skin_root_joints.clear();
-
- b->find_root_joints(root_joints, joint_by_uid, skin_root_joints);
-
- std::vector<COLLADAFW::Node*>::iterator ri;
- for (ri = skin_root_joints.begin(); ri != skin_root_joints.end(); ri++) {
- if (a->uses_joint_or_descendant(*ri)) {
- shared = b->get_armature();
- break;
- }
- }
-
- if (shared != NULL)
- break;
- }
-
- if (shared)
- ob_arm = skin.set_armature(shared);
- else
- ob_arm = skin.create_armature(scene);
-
- // enter armature edit mode
- ED_armature_to_edit(ob_arm);
-
- leaf_bones.clear();
- totbone = 0;
- // bone_direction_row = 1; // TODO: don't default to Y but use asset and based on it decide on default row
- leaf_bone_length = 0.1f;
- // min_angle = 360.0f; // minimum angle between bone head-tail and a row of bone matrix
-
- // create bones
- /*
- TODO:
- check if bones have already been created for a given joint
- */
-
- std::vector<COLLADAFW::Node*>::iterator ri;
- for (ri = root_joints.begin(); ri != root_joints.end(); ri++) {
- // for shared armature check if bone tree is already created
- if (shared && std::find(skin_root_joints.begin(), skin_root_joints.end(), *ri) != skin_root_joints.end())
- continue;
-
- // since root_joints may contain joints for multiple controllers, we need to filter
- if (skin.uses_joint_or_descendant(*ri)) {
- create_bone(skin, *ri, NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature*)ob_arm->data);
-
- if (joint_parent_map.find((*ri)->getUniqueId()) != joint_parent_map.end() && !skin.get_parent())
- skin.set_parent(joint_parent_map[(*ri)->getUniqueId()]);
- }
- }
-
- fix_leaf_bones();
-
- // exit armature edit mode
- ED_armature_from_edit(ob_arm);
- ED_armature_edit_free(ob_arm);
- DAG_id_flush_update(&ob_arm->id, OB_RECALC_OB|OB_RECALC_DATA);
-
- set_leaf_bone_shapes(ob_arm);
-
- // set_euler_rotmode();
- }
-
-
-public:
-
- ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce) :
- TransformReader(conv), scene(sce), empty(NULL), mesh_importer(mesh), anim_importer(anim) {}
-
- ~ArmatureImporter()
- {
- // free skin controller data if we forget to do this earlier
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- it->second.free();
- }
- }
-
- // root - if this joint is the top joint in hierarchy, if a joint
- // is a child of a node (not joint), root should be true since
- // this is where we build armature bones from
- void add_joint(COLLADAFW::Node *node, bool root, Object *parent)
- {
- joint_by_uid[node->getUniqueId()] = node;
- if (root) {
- root_joints.push_back(node);
-
- if (parent)
- joint_parent_map[node->getUniqueId()] = parent;
- }
- }
-
-#if 0
- void add_root_joint(COLLADAFW::Node *node)
- {
- // root_joints.push_back(node);
- Object *ob_arm = find_armature(node);
- if (ob_arm) {
- get_armature_joints(ob_arm).root_joints.push_back(node);
- }
-#ifdef COLLADA_DEBUG
- else {
- fprintf(stderr, "%s cannot be added to armature.\n", get_joint_name(node));
- }
-#endif
- }
-#endif
-
- // here we add bones to armatures, having armatures previously created in write_controller
- void make_armatures(bContext *C)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
-
- SkinInfo& skin = it->second;
-
- create_armature_bones(skin);
-
- // link armature with a mesh object
- Object *ob = mesh_importer->get_object_by_geom_uid(*get_geometry_uid(skin.get_controller_uid()));
- if (ob)
- skin.link_armature(C, ob, joint_by_uid, this);
- else
- fprintf(stderr, "Cannot find object to link armature with.\n");
-
- // set armature parent if any
- Object *par = skin.get_parent();
- if (par)
- set_parent(skin.get_armature(), par, C, false);
-
- // free memory stolen from SkinControllerData
- skin.free();
- }
- }
-
-#if 0
- // link with meshes, create vertex groups, assign weights
- void link_armature(Object *ob_arm, const COLLADAFW::UniqueId& geom_id, const COLLADAFW::UniqueId& controller_data_id)
- {
- Object *ob = mesh_importer->get_object_by_geom_uid(geom_id);
-
- if (!ob) {
- fprintf(stderr, "Cannot find object by geometry UID.\n");
- return;
- }
-
- if (skin_by_data_uid.find(controller_data_id) == skin_by_data_uid.end()) {
- fprintf(stderr, "Cannot find skin info by controller data UID.\n");
- return;
- }
-
- SkinInfo& skin = skin_by_data_uid[conroller_data_id];
-
- // create vertex groups
- }
-#endif
-
- bool write_skin_controller_data(const COLLADAFW::SkinControllerData* data)
- {
- // at this stage we get vertex influence info that should go into me->verts and ob->defbase
- // there's no info to which object this should be long so we associate it with skin controller data UID
-
- // don't forget to call defgroup_unique_name before we copy
-
- // controller data uid -> [armature] -> joint data,
- // [mesh object]
- //
-
- SkinInfo skin(unit_converter);
- skin.borrow_skin_controller_data(data);
-
- // store join inv bind matrix to use it later in armature construction
- const COLLADAFW::Matrix4Array& inv_bind_mats = data->getInverseBindMatrices();
- for (unsigned int i = 0; i < data->getJointsCount(); i++) {
- skin.add_joint(inv_bind_mats[i]);
- }
-
- skin_by_data_uid[data->getUniqueId()] = skin;
-
- return true;
- }
-
- bool write_controller(const COLLADAFW::Controller* controller)
- {
- // - create and store armature object
-
- const COLLADAFW::UniqueId& skin_id = controller->getUniqueId();
-
- if (controller->getControllerType() == COLLADAFW::Controller::CONTROLLER_TYPE_SKIN) {
- COLLADAFW::SkinController *co = (COLLADAFW::SkinController*)controller;
- // to be able to find geom id by controller id
- geom_uid_by_controller_uid[skin_id] = co->getSource();
-
- const COLLADAFW::UniqueId& data_uid = co->getSkinControllerData();
- if (skin_by_data_uid.find(data_uid) == skin_by_data_uid.end()) {
- fprintf(stderr, "Cannot find skin by controller data UID.\n");
- return true;
- }
-
- skin_by_data_uid[data_uid].set_controller(co);
- }
- // morph controller
- else {
- // shape keys? :)
- fprintf(stderr, "Morph controller is not supported yet.\n");
- }
-
- return true;
- }
-
- COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId& controller_uid)
- {
- if (geom_uid_by_controller_uid.find(controller_uid) == geom_uid_by_controller_uid.end())
- return NULL;
-
- return &geom_uid_by_controller_uid[controller_uid];
- }
-
- Object *get_armature_for_joint(COLLADAFW::Node *node)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo& skin = it->second;
-
- if (skin.uses_joint_or_descendant(node))
- return skin.get_armature();
- }
-
- return NULL;
- }
-
- void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count)
- {
- BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", get_joint_name(node));
- }
-
- // gives a world-space mat
- bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint)
- {
- std::map<COLLADAFW::UniqueId, SkinInfo>::iterator it;
- bool found = false;
- for (it = skin_by_data_uid.begin(); it != skin_by_data_uid.end(); it++) {
- SkinInfo& skin = it->second;
- if ((found = skin.get_joint_inv_bind_matrix(m, joint))) {
- invert_m4(m);
- break;
- }
- }
-
- return found;
- }
-};
-
-class MeshImporter : public MeshImporterBase
-{
-private:
-
- Scene *scene;
- ArmatureImporter *armature_importer;
-
- std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
- std::map<COLLADAFW::UniqueId, Object*> uid_object_map; // geom uid-to-object
- // this structure is used to assign material indices to faces
- // it holds a portion of Mesh faces and corresponds to a DAE primitive list (<triangles>, <polylist>, etc.)
- struct Primitive {
- MFace *mface;
- unsigned int totface;
- };
- typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
- std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
-
- class UVDataWrapper
- {
- COLLADAFW::MeshVertexData *mVData;
- public:
- UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
- {}
-
-#ifdef COLLADA_DEBUG
- void print()
- {
- fprintf(stderr, "UVs:\n");
- switch(mVData->getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
- if (values->getCount()) {
- for (int i = 0; i < values->getCount(); i += 2) {
- fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i+1]);
- }
- }
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
- if (values->getCount()) {
- for (int i = 0; i < values->getCount(); i += 2) {
- fprintf(stderr, "%.1f, %.1f\n", (float)(*values)[i], (float)(*values)[i+1]);
- }
- }
- }
- break;
- }
- fprintf(stderr, "\n");
- }
-#endif
-
- void getUV(int uv_index[2], float *uv)
- {
- switch(mVData->getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
- if (values->empty()) return;
- uv[0] = (*values)[uv_index[0]];
- uv[1] = (*values)[uv_index[1]];
-
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
- if (values->empty()) return;
- uv[0] = (float)(*values)[uv_index[0]];
- uv[1] = (float)(*values)[uv_index[1]];
-
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
- default:
- fprintf(stderr, "MeshImporter.getUV(): unknown data type\n");
- }
- }
- };
-
- void set_face_indices(MFace *mface, unsigned int *indices, bool quad)
- {
- mface->v1 = indices[0];
- mface->v2 = indices[1];
- mface->v3 = indices[2];
- if (quad) mface->v4 = indices[3];
- else mface->v4 = 0;
-#ifdef COLLADA_DEBUG
- // fprintf(stderr, "%u, %u, %u \n", indices[0], indices[1], indices[2]);
-#endif
- }
-
- // not used anymore, test_index_face from blenkernel is better
-#if 0
- // change face indices order so that v4 is not 0
- void rotate_face_indices(MFace *mface) {
- mface->v4 = mface->v1;
- mface->v1 = mface->v2;
- mface->v2 = mface->v3;
- mface->v3 = 0;
- }
-#endif
-
- void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
- COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
- {
- int uv_indices[4][2];
-
- // per face vertex indices, this means for quad we have 4 indices, not 8
- COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
-
- // make indices into FloatOrDoubleArray
- for (int i = 0; i < 3; i++) {
- int uv_index = indices[tris_indices[i]];
- uv_indices[i][0] = uv_index * 2;
- uv_indices[i][1] = uv_index * 2 + 1;
- }
-
- uvs.getUV(uv_indices[0], mtface->uv[0]);
- uvs.getUV(uv_indices[1], mtface->uv[1]);
- uvs.getUV(uv_indices[2], mtface->uv[2]);
- }
-
- void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
- COLLADAFW::IndexList& index_list, int index, bool quad)
- {
- int uv_indices[4][2];
-
- // per face vertex indices, this means for quad we have 4 indices, not 8
- COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
-
- // make indices into FloatOrDoubleArray
- for (int i = 0; i < (quad ? 4 : 3); i++) {
- int uv_index = indices[index + i];
- uv_indices[i][0] = uv_index * 2;
- uv_indices[i][1] = uv_index * 2 + 1;
- }
-
- uvs.getUV(uv_indices[0], mtface->uv[0]);
- uvs.getUV(uv_indices[1], mtface->uv[1]);
- uvs.getUV(uv_indices[2], mtface->uv[2]);
-
- if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
-
-#ifdef COLLADA_DEBUG
- /*if (quad) {
- fprintf(stderr, "face uv:\n"
- "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
- "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
-
- uv_indices[0][0], uv_indices[0][1],
- uv_indices[1][0], uv_indices[1][1],
- uv_indices[2][0], uv_indices[2][1],
- uv_indices[3][0], uv_indices[3][1],
-
- mtface->uv[0][0], mtface->uv[0][1],
- mtface->uv[1][0], mtface->uv[1][1],
- mtface->uv[2][0], mtface->uv[2][1],
- mtface->uv[3][0], mtface->uv[3][1]);
- }
- else {
- fprintf(stderr, "face uv:\n"
- "((%d, %d), (%d, %d), (%d, %d))\n"
- "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
-
- uv_indices[0][0], uv_indices[0][1],
- uv_indices[1][0], uv_indices[1][1],
- uv_indices[2][0], uv_indices[2][1],
-
- mtface->uv[0][0], mtface->uv[0][1],
- mtface->uv[1][0], mtface->uv[1][1],
- mtface->uv[2][0], mtface->uv[2][1]);
- }*/
-#endif
- }
-
-#ifdef COLLADA_DEBUG
- void print_index_list(COLLADAFW::IndexList& index_list)
- {
- fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str());
- for (int i = 0; i < index_list.getIndicesCount(); i += 2) {
- fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1));
- }
- fprintf(stderr, "\n");
- }
-#endif
-
- bool is_nice_mesh(COLLADAFW::Mesh *mesh)
- {
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
-
- const char *name = get_dae_name(mesh);
-
- for (unsigned i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
- COLLADAFW::MeshPrimitive::PrimitiveType type = mp->getPrimitiveType();
-
- const char *type_str = primTypeToStr(type);
-
- // OpenCollada passes POLYGONS type for <polylist>
- if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
-
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
-
- for(unsigned int j = 0; j < vca.getCount(); j++){
- int count = vca[j];
- if (count < 3) {
- fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n",
- type_str, name);
- return false;
- }
- }
-
- }
- else if(type != COLLADAFW::MeshPrimitive::TRIANGLES) {
- fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
- return false;
- }
- }
-
- if (mesh->getPositions().empty()) {
- fprintf(stderr, "Mesh %s has no vertices.\n", name);
- return false;
- }
-
- return true;
- }
-
- void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
- {
- // vertices
- me->totvert = mesh->getPositions().getFloatValues()->getCount() / 3;
- me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
-
- COLLADAFW::MeshVertexData& pos = mesh->getPositions();
- MVert *mvert;
- int i;
-
- for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++)
- get_vector(mvert->co, pos, i);
- }
-
- int triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri)
- {
- ListBase dispbase;
- DispList *dl;
- float *vert;
- int i = 0;
-
- dispbase.first = dispbase.last = NULL;
-
- dl = (DispList*)MEM_callocN(sizeof(DispList), "poly disp");
- dl->nr = totvert;
- dl->type = DL_POLY;
- dl->parts = 1;
- dl->verts = vert = (float*)MEM_callocN(totvert * 3 * sizeof(float), "poly verts");
- dl->index = (int*)MEM_callocN(sizeof(int) * 3 * totvert, "dl index");
-
- BLI_addtail(&dispbase, dl);
-
- for (i = 0; i < totvert; i++) {
- copy_v3_v3(vert, verts[indices[i]].co);
- vert += 3;
- }
-
- filldisplist(&dispbase, &dispbase, 0);
-
- int tottri = 0;
- dl= (DispList*)dispbase.first;
-
- if (dl->type == DL_INDEX3) {
- tottri = dl->parts;
-
- int *index = dl->index;
- for (i= 0; i < tottri; i++) {
- int t[3]= {*index, *(index + 1), *(index + 2)};
-
- std::sort(t, t + 3);
-
- tri.push_back(t[0]);
- tri.push_back(t[1]);
- tri.push_back(t[2]);
-
- index += 3;
- }
- }
-
- freedisplist(&dispbase);
-
- return tottri;
- }
-
- int count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
- {
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
- unsigned int i;
- int tottri = 0;
-
- for (i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
- int type = mp->getPrimitiveType();
- size_t prim_totface = mp->getFaceCount();
- unsigned int *indices = mp->getPositionIndices().getData();
-
- if (type == COLLADAFW::MeshPrimitive::POLYLIST ||
- type == COLLADAFW::MeshPrimitive::POLYGONS) {
-
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
-
- for (unsigned int j = 0; j < prim_totface; j++) {
- int vcount = vcounta[j];
-
- if (vcount > 4) {
- std::vector<unsigned int> tri;
-
- // tottri += triangulate_poly(indices, vcount, me->mvert, tri) - 1; // XXX why - 1?!
- tottri += triangulate_poly(indices, vcount, me->mvert, tri);
- }
-
- indices += vcount;
- }
- }
- }
- return tottri;
- }
-
- // TODO: import uv set names
- void read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
- {
- unsigned int i;
-
- // allocate faces
- me->totface = mesh->getFacesCount() + new_tris;
- me->mface = (MFace*)CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
-
- // allocate UV layers
- unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount();
-
- // for (i = 0; i < totuvset; i++) {
- // if (mesh->getUVCoords().getLength(i) == 0) {
- // totuvset = 0;
- // break;
- // }
- // }
-
- for (i = 0; i < totuvset; i++) {
- CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface);
- //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
- }
-
- // activate the first uv layer
- if (totuvset) me->mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
-
- UVDataWrapper uvs(mesh->getUVCoords());
-
-#ifdef COLLADA_DEBUG
- // uvs.print();
-#endif
-
- MFace *mface = me->mface;
-
- MaterialIdPrimitiveArrayMap mat_prim_map;
-
- int face_index = 0;
-
- COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
-
- bool has_normals = mesh->hasNormals();
- COLLADAFW::MeshVertexData& nor = mesh->getNormals();
-
- for (i = 0; i < prim_arr.getCount(); i++) {
-
- COLLADAFW::MeshPrimitive *mp = prim_arr[i];
-
- // faces
- size_t prim_totface = mp->getFaceCount();
- unsigned int *indices = mp->getPositionIndices().getData();
- unsigned int *nind = mp->getNormalIndices().getData();
- unsigned int j, k;
- int type = mp->getPrimitiveType();
- int index = 0;
-
- // since we cannot set mface->mat_nr here, we store a portion of me->mface in Primitive
- Primitive prim = {mface, 0};
- COLLADAFW::IndexListArray& index_list_array = mp->getUVCoordIndicesArray();
-
-#ifdef COLLADA_DEBUG
- /*
- fprintf(stderr, "Primitive %d:\n", i);
- for (int j = 0; j < totuvset; j++) {
- print_index_list(*index_list_array[j]);
- }
- */
-#endif
-
- if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
- for (j = 0; j < prim_totface; j++){
-
- set_face_indices(mface, indices, false);
- indices += 3;
-
-#if 0
- for (k = 0; k < totuvset; k++) {
- if (!index_list_array.empty() && index_list_array[k]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false);
- }
- }
-#else
- for (k = 0; k < index_list_array.getCount(); k++) {
- int uvset_index = index_list_array[k]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false);
- }
-#endif
-
- test_index_face(mface, &me->fdata, face_index, 3);
-
- if (has_normals) {
- if (!flat_face(nind, nor, 3))
- mface->flag |= ME_SMOOTH;
-
- nind += 3;
- }
-
- index += 3;
- mface++;
- face_index++;
- prim.totface++;
- }
- }
- else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
- COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
- COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
-
- for (j = 0; j < prim_totface; j++) {
-
- // face
- int vcount = vcounta[j];
- if (vcount == 3 || vcount == 4) {
-
- set_face_indices(mface, indices, vcount == 4);
-
- // set mtface for each uv set
- // it is assumed that all primitives have equal number of UV sets
-
-#if 0
- for (k = 0; k < totuvset; k++) {
- if (!index_list_array.empty() && index_list_array[k]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
- set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0);
- }
- }
-#else
- for (k = 0; k < index_list_array.getCount(); k++) {
- int uvset_index = index_list_array[k]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
- }
-#endif
-
- test_index_face(mface, &me->fdata, face_index, vcount);
-
- if (has_normals) {
- if (!flat_face(nind, nor, vcount))
- mface->flag |= ME_SMOOTH;
-
- nind += vcount;
- }
-
- mface++;
- face_index++;
- prim.totface++;
-
- }
- else {
- std::vector<unsigned int> tri;
-
- triangulate_poly(indices, vcount, me->mvert, tri);
-
- for (k = 0; k < tri.size() / 3; k++) {
- int v = k * 3;
- unsigned int uv_indices[3] = {
- index + tri[v],
- index + tri[v + 1],
- index + tri[v + 2]
- };
- unsigned int tri_indices[3] = {
- indices[tri[v]],
- indices[tri[v + 1]],
- indices[tri[v + 2]]
- };
-
- set_face_indices(mface, tri_indices, false);
-
-#if 0
- for (unsigned int l = 0; l < totuvset; l++) {
- if (!index_list_array.empty() && index_list_array[l]) {
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l);
- set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices);
- }
- }
-#else
- for (unsigned int l = 0; l < index_list_array.getCount(); l++) {
- int uvset_index = index_list_array[l]->getSetIndex();
-
- // get mtface by face index and uv set index
- MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
- set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices);
- }
-#endif
-
-
- test_index_face(mface, &me->fdata, face_index, 3);
-
- if (has_normals) {
- unsigned int ntri[3] = {nind[tri[v]], nind[tri[v + 1]], nind[tri[v + 2]]};
-
- if (!flat_face(ntri, nor, 3))
- mface->flag |= ME_SMOOTH;
- }
-
- mface++;
- face_index++;
- prim.totface++;
- }
-
- if (has_normals)
- nind += vcount;
- }
-
- index += vcount;
- indices += vcount;
- }
- }
-
- mat_prim_map[mp->getMaterialId()].push_back(prim);
- }
-
- geom_uid_mat_mapping_map[mesh->getUniqueId()] = mat_prim_map;
- }
-
- void get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i)
- {
- i *= 3;
-
- switch(arr.getType()) {
- case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
- {
- COLLADAFW::ArrayPrimitiveType<float>* values = arr.getFloatValues();
- if (values->empty()) return;
-
- v[0] = (*values)[i++];
- v[1] = (*values)[i++];
- v[2] = (*values)[i];
- }
- break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
- {
- COLLADAFW::ArrayPrimitiveType<double>* values = arr.getDoubleValues();
- if (values->empty()) return;
-
- v[0] = (float)(*values)[i++];
- v[1] = (float)(*values)[i++];
- v[2] = (float)(*values)[i];
- }
- break;
- default:
- break;
- }
- }
-
- bool flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count)
- {
- float a[3], b[3];
-
- get_vector(a, nor, *nind);
- normalize_v3(a);
-
- nind++;
-
- for (int i = 1; i < count; i++, nind++) {
- get_vector(b, nor, *nind);
- normalize_v3(b);
-
- float dp = dot_v3v3(a, b);
-
- if (dp < 0.99999f || dp > 1.00001f)
- return false;
- }
-
- return true;
- }
-
-public:
-
- MeshImporter(ArmatureImporter *arm, Scene *sce) : scene(sce), armature_importer(arm) {}
-
- virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid)
- {
- if (uid_object_map.find(geom_uid) != uid_object_map.end())
- return uid_object_map[geom_uid];
- return NULL;
- }
-
- MTex *assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
- Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
- MTex *color_texture)
- {
- COLLADAFW::TextureMapId texture_index = ctexture.getTextureMapId();
- char *uvname = CustomData_get_layer_name(&me->fdata, CD_MTFACE, ctexture.getSetIndex());
-
- if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
-
- fprintf(stderr, "Cannot find texture array by texture index.\n");
- return color_texture;
- }
-
- std::vector<MTex*> textures = texindex_texarray_map[texture_index];
-
- std::vector<MTex*>::iterator it;
-
- for (it = textures.begin(); it != textures.end(); it++) {
-
- MTex *texture = *it;
-
- if (texture) {
- strcpy(texture->uvname, uvname);
- if (texture->mapto == MAP_COL) color_texture = texture;
- }
- }
- return color_texture;
- }
-
- MTFace *assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
- std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
- Object *ob, const COLLADAFW::UniqueId *geom_uid,
- MTex **color_texture, char *layername, MTFace *texture_face,
- std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
- {
- Mesh *me = (Mesh*)ob->data;
- const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
-
- // do we know this material?
- if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
-
- fprintf(stderr, "Cannot find material by UID.\n");
- return NULL;
- }
-
- Material *ma = uid_material_map[ma_uid];
- assign_material(ob, ma, ob->totcol + 1);
-
- COLLADAFW::TextureCoordinateBindingArray& tex_array =
- cmaterial.getTextureCoordinateBindingArray();
- TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
- unsigned int i;
- // loop through <bind_vertex_inputs>
- for (i = 0; i < tex_array.getCount(); i++) {
-
- *color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
- *color_texture);
- }
-
- // set texture face
- if (*color_texture &&
- strlen((*color_texture)->uvname) &&
- strcmp(layername, (*color_texture)->uvname) != 0) {
-
- texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
- (*color_texture)->uvname);
- strcpy(layername, (*color_texture)->uvname);
- }
-
- MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
- COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
-
- // assign material indices to mesh faces
- if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
-
- std::vector<Primitive>& prims = mat_prim_map[mat_id];
-
- std::vector<Primitive>::iterator it;
-
- for (it = prims.begin(); it != prims.end(); it++) {
- Primitive& prim = *it;
- i = 0;
- while (i++ < prim.totface) {
- prim.mface->mat_nr = mat_index;
- prim.mface++;
- // bind texture images to faces
- if (texture_face && (*color_texture)) {
- texture_face->mode = TF_TEX;
- texture_face->tpage = (Image*)(*color_texture)->tex->ima;
- texture_face++;
- }
- }
- }
- }
-
- return texture_face;
- }
-
-
- Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
- bool isController,
- std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
- std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map)
- {
- const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId();
-
- // check if node instanciates controller or geometry
- if (isController) {
-
- geom_uid = armature_importer->get_geometry_uid(*geom_uid);
-
- if (!geom_uid) {
- fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
- return NULL;
- }
- }
- else {
-
- if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
- // this could happen if a mesh was not created
- // (e.g. if it contains unsupported geometry)
- fprintf(stderr, "Couldn't find a mesh by UID.\n");
- return NULL;
- }
- }
- if (!uid_mesh_map[*geom_uid]) return NULL;
-
- Object *ob = add_object(scene, OB_MESH);
-
- // store object pointer for ArmatureImporter
- uid_object_map[*geom_uid] = ob;
-
- // name Object
- const std::string& id = node->getOriginalId();
- if (id.length())
- rename_id(&ob->id, (char*)id.c_str());
-
- // replace ob->data freeing the old one
- Mesh *old_mesh = (Mesh*)ob->data;
-
- set_mesh(ob, uid_mesh_map[*geom_uid]);
-
- if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
-
- char layername[100];
- MTFace *texture_face = NULL;
- MTex *color_texture = NULL;
-
- COLLADAFW::MaterialBindingArray& mat_array =
- geom->getMaterialBindings();
-
- // loop through geom's materials
- for (unsigned int i = 0; i < mat_array.getCount(); i++) {
-
- texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
- &color_texture, layername, texture_face,
- material_texture_mapping_map, i);
- }
-
- return ob;
- }
-
- // create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
- bool write_geometry(const COLLADAFW::Geometry* geom)
- {
- // TODO: import also uvs, normals
- // XXX what to do with normal indices?
- // XXX num_normals may be != num verts, then what to do?
-
- // check geometry->getType() first
- if (geom->getType() != COLLADAFW::Geometry::GEO_TYPE_MESH) {
- // TODO: report warning
- fprintf(stderr, "Mesh type %s is not supported\n", geomTypeToStr(geom->getType()));
- return true;
- }
-
- COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh*)geom;
-
- if (!is_nice_mesh(mesh)) {
- fprintf(stderr, "Ignoring mesh %s\n", get_dae_name(mesh));
- return true;
- }
-
- const std::string& str_geom_id = mesh->getOriginalId();
- Mesh *me = add_mesh((char*)str_geom_id.c_str());
-
- // store the Mesh pointer to link it later with an Object
- this->uid_mesh_map[mesh->getUniqueId()] = me;
-
- int new_tris = 0;
-
- read_vertices(mesh, me);
-
- new_tris = count_new_tris(mesh, me);
-
- read_faces(mesh, me, new_tris);
-
- make_edges(me, 0);
-
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
-
- return true;
- }
-
-};
-
-class AnimationImporter : private TransformReader, public AnimationImporterBase
-{
-private:
-
- ArmatureImporter *armature_importer;
- Scene *scene;
-
- std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > curve_map;
- std::map<COLLADAFW::UniqueId, TransformReader::Animation> uid_animated_map;
- // std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
- std::map<COLLADAFW::UniqueId, const COLLADAFW::AnimationList*> animlist_map;
- std::vector<FCurve*> unused_curves;
- std::map<COLLADAFW::UniqueId, Object*> joint_objects;
-
- FCurve *create_fcurve(int array_index, const char *rna_path)
- {
- FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
- fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
- fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
- fcu->array_index = array_index;
- return fcu;
- }
-
- void create_bezt(FCurve *fcu, float frame, float output)
- {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
- bez.vec[1][0] = frame;
- bez.vec[1][1] = output;
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- calchandles_fcurve(fcu);
- }
-
- // create one or several fcurves depending on the number of parameters being animated
- void animation_to_fcurves(COLLADAFW::AnimationCurve *curve)
- {
- COLLADAFW::FloatOrDoubleArray& input = curve->getInputValues();
- COLLADAFW::FloatOrDoubleArray& output = curve->getOutputValues();
- // COLLADAFW::FloatOrDoubleArray& intan = curve->getInTangentValues();
- // COLLADAFW::FloatOrDoubleArray& outtan = curve->getOutTangentValues();
- float fps = (float)FPS;
- size_t dim = curve->getOutDimension();
- unsigned int i;
-
- std::vector<FCurve*>& fcurves = curve_map[curve->getUniqueId()];
-
- switch (dim) {
- case 1: // X, Y, Z or angle
- case 3: // XYZ
- case 16: // matrix
- {
- for (i = 0; i < dim; i++ ) {
- FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
-
- fcu->flag = (FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
- // fcu->rna_path = BLI_strdupn(path, strlen(path));
- fcu->array_index = 0;
- //fcu->totvert = curve->getKeyCount();
-
- // create beztriple for each key
- for (unsigned int j = 0; j < curve->getKeyCount(); j++) {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
-
- // intangent
- // bez.vec[0][0] = get_float_value(intan, j * 6 + i + i) * fps;
- // bez.vec[0][1] = get_float_value(intan, j * 6 + i + i + 1);
-
- // input, output
- bez.vec[1][0] = get_float_value(input, j) * fps;
- bez.vec[1][1] = get_float_value(output, j * dim + i);
-
- // outtangent
- // bez.vec[2][0] = get_float_value(outtan, j * 6 + i + i) * fps;
- // bez.vec[2][1] = get_float_value(outtan, j * 6 + i + i + 1);
-
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- }
-
- calchandles_fcurve(fcu);
-
- fcurves.push_back(fcu);
- }
- }
- break;
- default:
- fprintf(stderr, "Output dimension of %d is not yet supported (animation id = %s)\n", dim, curve->getOriginalId().c_str());
- }
-
- for (std::vector<FCurve*>::iterator it = fcurves.begin(); it != fcurves.end(); it++)
- unused_curves.push_back(*it);
- }
-
- void fcurve_deg_to_rad(FCurve *cu)
- {
- for (unsigned int i = 0; i < cu->totvert; i++) {
- // TODO convert handles too
- cu->bezt[i].vec[1][1] *= M_PI / 180.0f;
- }
- }
-
- void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, char *rna_path, int array_index, Animation *animated)
- {
- bAction *act;
-
- if (!ob->adt || !ob->adt->action) act = verify_adt_action((ID*)&ob->id, 1);
- else act = ob->adt->action;
-
- std::vector<FCurve*>::iterator it;
- int i;
-
-#if 0
- char *p = strstr(rna_path, "rotation_euler");
- bool is_rotation = p && *(p + strlen("rotation_euler")) == '\0';
-
- // convert degrees to radians for rotation
- if (is_rotation)
- fcurve_deg_to_rad(fcu);
-#endif
-
- for (it = curves.begin(), i = 0; it != curves.end(); it++, i++) {
- FCurve *fcu = *it;
- fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
-
- if (array_index == -1) fcu->array_index = i;
- else fcu->array_index = array_index;
-
- if (ob->type == OB_ARMATURE) {
- bActionGroup *grp = NULL;
- const char *bone_name = get_joint_name(animated->node);
-
- if (bone_name) {
- /* try to find group */
- grp = action_groups_find_named(act, bone_name);
-
- /* no matching groups, so add one */
- if (grp == NULL) {
- /* Add a new group, and make it active */
- grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
-
- grp->flag = AGRP_SELECTED;
- BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
-
- BLI_addtail(&act->groups, grp);
- BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
- }
-
- /* add F-Curve to group */
- action_groups_add_channel(act, grp, fcu);
-
- }
-#if 0
- if (is_rotation) {
- fcurves_actionGroup_map[grp].push_back(fcu);
- }
-#endif
- }
- else {
- BLI_addtail(&act->curves, fcu);
- }
-
- // curve is used, so remove it from unused_curves
- unused_curves.erase(std::remove(unused_curves.begin(), unused_curves.end(), fcu), unused_curves.end());
- }
- }
-public:
-
- AnimationImporter(UnitConverter *conv, ArmatureImporter *arm, Scene *scene) :
- TransformReader(conv), armature_importer(arm), scene(scene) { }
-
- ~AnimationImporter()
- {
- // free unused FCurves
- for (std::vector<FCurve*>::iterator it = unused_curves.begin(); it != unused_curves.end(); it++)
- free_fcurve(*it);
-
- if (unused_curves.size())
- fprintf(stderr, "removed %u unused curves\n", unused_curves.size());
- }
-
- bool write_animation(const COLLADAFW::Animation* anim)
- {
- if (anim->getAnimationType() == COLLADAFW::Animation::ANIMATION_CURVE) {
- COLLADAFW::AnimationCurve *curve = (COLLADAFW::AnimationCurve*)anim;
-
- // XXX Don't know if it's necessary
- // Should we check outPhysicalDimension?
- if (curve->getInPhysicalDimension() != COLLADAFW::PHYSICAL_DIMENSION_TIME) {
- fprintf(stderr, "Inputs physical dimension is not time. \n");
- return true;
- }
-
- // a curve can have mixed interpolation type,
- // in this case curve->getInterpolationTypes returns a list of interpolation types per key
- COLLADAFW::AnimationCurve::InterpolationType interp = curve->getInterpolationType();
-
- if (interp != COLLADAFW::AnimationCurve::INTERPOLATION_MIXED) {
- switch (interp) {
- case COLLADAFW::AnimationCurve::INTERPOLATION_LINEAR:
- case COLLADAFW::AnimationCurve::INTERPOLATION_BEZIER:
- animation_to_fcurves(curve);
- break;
- default:
- // TODO there're also CARDINAL, HERMITE, BSPLINE and STEP types
- fprintf(stderr, "CARDINAL, HERMITE, BSPLINE and STEP anim interpolation types not supported yet.\n");
- break;
- }
- }
- else {
- // not supported yet
- fprintf(stderr, "MIXED anim interpolation type is not supported yet.\n");
- }
- }
- else {
- fprintf(stderr, "FORMULA animation type is not supported yet.\n");
- }
-
- return true;
- }
-
- // called on post-process stage after writeVisualScenes
- bool write_animation_list(const COLLADAFW::AnimationList* animlist)
- {
- const COLLADAFW::UniqueId& animlist_id = animlist->getUniqueId();
-
- animlist_map[animlist_id] = animlist;
-
-#if 0
- // should not happen
- if (uid_animated_map.find(animlist_id) == uid_animated_map.end()) {
- return true;
- }
-
- // for bones rna_path is like: pose.bones["bone-name"].rotation
-
- // what does this AnimationList animate?
- Animation& animated = uid_animated_map[animlist_id];
- Object *ob = animated.ob;
-
- char rna_path[100];
- char joint_path[100];
- bool is_joint = false;
-
- // if ob is NULL, it should be a JOINT
- if (!ob) {
- ob = armature_importer->get_armature_for_joint(animated.node);
-
- if (!ob) {
- fprintf(stderr, "Cannot find armature for node %s\n", get_joint_name(animated.node));
- return true;
- }
-
- armature_importer->get_rna_path_for_joint(animated.node, joint_path, sizeof(joint_path));
-
- is_joint = true;
- }
-
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- switch (animated.tm->getTransformationType()) {
- case COLLADAFW::Transformation::TRANSLATE:
- case COLLADAFW::Transformation::SCALE:
- {
- bool loc = animated.tm->getTransformationType() == COLLADAFW::Transformation::TRANSLATE;
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, loc ? "location" : "scale");
- else
- BLI_strncpy(rna_path, loc ? "location" : "scale", sizeof(rna_path));
-
- for (int i = 0; i < bindings.getCount(); i++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
- COLLADAFW::UniqueId anim_uid = binding.animation;
-
- if (curve_map.find(anim_uid) == curve_map.end()) {
- fprintf(stderr, "Cannot find FCurve by animation UID.\n");
- continue;
- }
-
- std::vector<FCurve*>& fcurves = curve_map[anim_uid];
-
- switch (binding.animationClass) {
- case COLLADAFW::AnimationList::POSITION_X:
- add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- add_fcurves_to_object(ob, fcurves, rna_path, -1, &animated);
- break;
- default:
- fprintf(stderr, "AnimationClass %d is not supported for %s.\n",
- binding.animationClass, loc ? "TRANSLATE" : "SCALE");
- }
- }
- }
- break;
- case COLLADAFW::Transformation::ROTATE:
- {
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_euler", joint_path);
- else
- BLI_strncpy(rna_path, "rotation_euler", sizeof(rna_path));
-
- COLLADAFW::Rotate* rot = (COLLADAFW::Rotate*)animated.tm;
- COLLADABU::Math::Vector3& axis = rot->getRotationAxis();
-
- for (int i = 0; i < bindings.getCount(); i++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[i];
- COLLADAFW::UniqueId anim_uid = binding.animation;
-
- if (curve_map.find(anim_uid) == curve_map.end()) {
- fprintf(stderr, "Cannot find FCurve by animation UID.\n");
- continue;
- }
-
- std::vector<FCurve*>& fcurves = curve_map[anim_uid];
-
- switch (binding.animationClass) {
- case COLLADAFW::AnimationList::ANGLE:
- if (COLLADABU::Math::Vector3::UNIT_X == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 0, &animated);
- }
- else if (COLLADABU::Math::Vector3::UNIT_Y == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 1, &animated);
- }
- else if (COLLADABU::Math::Vector3::UNIT_Z == axis) {
- add_fcurves_to_object(ob, fcurves, rna_path, 2, &animated);
- }
- break;
- case COLLADAFW::AnimationList::AXISANGLE:
- // TODO convert axis-angle to quat? or XYZ?
- default:
- fprintf(stderr, "AnimationClass %d is not supported for ROTATE transformation.\n",
- binding.animationClass);
- }
- }
- }
- break;
- case COLLADAFW::Transformation::MATRIX:
- case COLLADAFW::Transformation::SKEW:
- case COLLADAFW::Transformation::LOOKAT:
- fprintf(stderr, "Animation of MATRIX, SKEW and LOOKAT transformations is not supported yet.\n");
- break;
- }
-#endif
-
- return true;
- }
-
- void read_node_transform(COLLADAFW::Node *node, Object *ob)
- {
- float mat[4][4];
- TransformReader::get_node_mat(mat, node, &uid_animated_map, ob);
- if (ob) {
- copy_m4_m4(ob->obmat, mat);
- object_apply_mat4(ob, ob->obmat);
- }
- }
-
-#if 0
- virtual void change_eul_to_quat(Object *ob, bAction *act)
- {
- bActionGroup *grp;
- int i;
-
- for (grp = (bActionGroup*)act->groups.first; grp; grp = grp->next) {
-
- FCurve *eulcu[3] = {NULL, NULL, NULL};
-
- if (fcurves_actionGroup_map.find(grp) == fcurves_actionGroup_map.end())
- continue;
-
- std::vector<FCurve*> &rot_fcurves = fcurves_actionGroup_map[grp];
-
- if (rot_fcurves.size() > 3) continue;
-
- for (i = 0; i < rot_fcurves.size(); i++)
- eulcu[rot_fcurves[i]->array_index] = rot_fcurves[i];
-
- char joint_path[100];
- char rna_path[100];
-
- BLI_snprintf(joint_path, sizeof(joint_path), "pose.bones[\"%s\"]", grp->name);
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.rotation_quaternion", joint_path);
-
- FCurve *quatcu[4] = {
- create_fcurve(0, rna_path),
- create_fcurve(1, rna_path),
- create_fcurve(2, rna_path),
- create_fcurve(3, rna_path)
- };
-
- bPoseChannel *chan = get_pose_channel(ob->pose, grp->name);
-
- float m4[4][4], irest[3][3];
- invert_m4_m4(m4, chan->bone->arm_mat);
- copy_m3_m4(irest, m4);
-
- for (i = 0; i < 3; i++) {
-
- FCurve *cu = eulcu[i];
-
- if (!cu) continue;
-
- for (int j = 0; j < cu->totvert; j++) {
- float frame = cu->bezt[j].vec[1][0];
-
- float eul[3] = {
- eulcu[0] ? evaluate_fcurve(eulcu[0], frame) : 0.0f,
- eulcu[1] ? evaluate_fcurve(eulcu[1], frame) : 0.0f,
- eulcu[2] ? evaluate_fcurve(eulcu[2], frame) : 0.0f
- };
-
- // make eul relative to bone rest pose
- float rot[3][3], rel[3][3], quat[4];
-
- /*eul_to_mat3(rot, eul);
-
- mul_m3_m3m3(rel, irest, rot);
-
- mat3_to_quat(quat, rel);
- */
-
- eul_to_quat(quat, eul);
-
- for (int k = 0; k < 4; k++)
- create_bezt(quatcu[k], frame, quat[k]);
- }
- }
-
- // now replace old Euler curves
-
- for (i = 0; i < 3; i++) {
- if (!eulcu[i]) continue;
-
- action_groups_remove_channel(act, eulcu[i]);
- free_fcurve(eulcu[i]);
- }
-
- chan->rotmode = ROT_MODE_QUAT;
-
- for (i = 0; i < 4; i++)
- action_groups_add_channel(act, grp, quatcu[i]);
- }
-
- bPoseChannel *pchan;
- for (pchan = (bPoseChannel*)ob->pose->chanbase.first; pchan; pchan = pchan->next) {
- pchan->rotmode = ROT_MODE_QUAT;
- }
- }
-#endif
-
- // prerequisites:
- // animlist_map - map animlist id -> animlist
- // curve_map - map anim id -> curve(s)
- Object *translate_animation(COLLADAFW::Node *node,
- std::map<COLLADAFW::UniqueId, Object*>& object_map,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
- COLLADAFW::Transformation::TransformationType tm_type,
- Object *par_job = NULL)
- {
- bool is_rotation = tm_type == COLLADAFW::Transformation::ROTATE;
- bool is_matrix = tm_type == COLLADAFW::Transformation::MATRIX;
- bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
-
- COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == root_map.end() ? node : root_map[node->getUniqueId()];
- Object *ob = is_joint ? armature_importer->get_armature_for_joint(node) : object_map[node->getUniqueId()];
- const char *bone_name = is_joint ? get_joint_name(node) : NULL;
-
- if (!ob) {
- fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", node->getOriginalId().c_str());
- return NULL;
- }
-
- // frames at which to sample
- std::vector<float> frames;
-
- // for each <rotate>, <translate>, etc. there is a separate Transformation
- const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
-
- unsigned int i;
-
- // find frames at which to sample plus convert all rotation keys to radians
- for (i = 0; i < tms.getCount(); i++) {
- COLLADAFW::Transformation *tm = tms[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- if (type == tm_type) {
- const COLLADAFW::UniqueId& listid = tm->getAnimationList();
-
- if (animlist_map.find(listid) != animlist_map.end()) {
- const COLLADAFW::AnimationList *animlist = animlist_map[listid];
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- if (bindings.getCount()) {
- for (unsigned int j = 0; j < bindings.getCount(); j++) {
- std::vector<FCurve*>& curves = curve_map[bindings[j].animation];
- bool xyz = ((type == COLLADAFW::Transformation::TRANSLATE || type == COLLADAFW::Transformation::SCALE) && bindings[j].animationClass == COLLADAFW::AnimationList::POSITION_XYZ);
-
- if ((!xyz && curves.size() == 1) || (xyz && curves.size() == 3) || is_matrix) {
- std::vector<FCurve*>::iterator iter;
-
- for (iter = curves.begin(); iter != curves.end(); iter++) {
- FCurve *fcu = *iter;
-
- if (is_rotation)
- fcurve_deg_to_rad(fcu);
-
- for (unsigned int k = 0; k < fcu->totvert; k++) {
- float fra = fcu->bezt[k].vec[1][0];
- if (std::find(frames.begin(), frames.end(), fra) == frames.end())
- frames.push_back(fra);
- }
- }
- }
- else {
- fprintf(stderr, "expected %d curves, got %u\n", xyz ? 3 : 1, curves.size());
- }
- }
- }
- }
- }
- }
-
- float irest_dae[4][4];
- float rest[4][4], irest[4][4];
-
- if (is_joint) {
- get_joint_rest_mat(irest_dae, root, node);
- invert_m4(irest_dae);
-
- Bone *bone = get_named_bone((bArmature*)ob->data, bone_name);
- if (!bone) {
- fprintf(stderr, "cannot find bone \"%s\"\n", bone_name);
- return NULL;
- }
-
- unit_m4(rest);
- copy_m4_m4(rest, bone->arm_mat);
- invert_m4_m4(irest, rest);
- }
-
- Object *job = NULL;
-
-#ifdef ARMATURE_TEST
- FCurve *job_curves[10];
- job = get_joint_object(root, node, par_job);
-#endif
-
- if (frames.size() == 0)
- return job;
-
- std::sort(frames.begin(), frames.end());
-
- const char *tm_str = NULL;
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- tm_str = "rotation_quaternion";
- break;
- case COLLADAFW::Transformation::SCALE:
- tm_str = "scale";
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- tm_str = "location";
- break;
- case COLLADAFW::Transformation::MATRIX:
- break;
- default:
- return job;
- }
-
- char rna_path[200];
- char joint_path[200];
-
- if (is_joint)
- armature_importer->get_rna_path_for_joint(node, joint_path, sizeof(joint_path));
-
- // new curves
- FCurve *newcu[10]; // if tm_type is matrix, then create 10 curves: 4 rot, 3 loc, 3 scale
- unsigned int totcu = is_matrix ? 10 : (is_rotation ? 4 : 3);
-
- for (i = 0; i < totcu; i++) {
-
- int axis = i;
-
- if (is_matrix) {
- if (i < 4) {
- tm_str = "rotation_quaternion";
- axis = i;
- }
- else if (i < 7) {
- tm_str = "location";
- axis = i - 4;
- }
- else {
- tm_str = "scale";
- axis = i - 7;
- }
- }
-
- if (is_joint)
- BLI_snprintf(rna_path, sizeof(rna_path), "%s.%s", joint_path, tm_str);
- else
- strcpy(rna_path, tm_str);
-
- newcu[i] = create_fcurve(axis, rna_path);
-
-#ifdef ARMATURE_TEST
- if (is_joint)
- job_curves[i] = create_fcurve(axis, tm_str);
-#endif
- }
-
- std::vector<float>::iterator it;
-
- // sample values at each frame
- for (it = frames.begin(); it != frames.end(); it++) {
- float fra = *it;
-
- float mat[4][4];
- float matfra[4][4];
+#include "collada_utils.h"
- unit_m4(matfra);
-
- // calc object-space mat
- evaluate_transform_at_frame(matfra, node, fra);
-
- // for joints, we need a special matrix
- if (is_joint) {
- // special matrix: iR * M * iR_dae * R
- // where R, iR are bone rest and inverse rest mats in world space (Blender bones),
- // iR_dae is joint inverse rest matrix (DAE) and M is an evaluated joint world-space matrix (DAE)
- float temp[4][4], par[4][4];
-
- // calc M
- calc_joint_parent_mat_rest(par, NULL, root, node);
- mul_m4_m4m4(temp, matfra, par);
-
- // evaluate_joint_world_transform_at_frame(temp, NULL, , node, fra);
-
- // calc special matrix
- mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
- }
- else {
- copy_m4_m4(mat, matfra);
- }
-
- float val[4], rot[4], loc[3], scale[3];
-
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- mat4_to_quat(val, mat);
- break;
- case COLLADAFW::Transformation::SCALE:
- mat4_to_size(val, mat);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- copy_v3_v3(val, mat[3]);
- break;
- case COLLADAFW::Transformation::MATRIX:
- mat4_to_quat(rot, mat);
- copy_v3_v3(loc, mat[3]);
- mat4_to_size(scale, mat);
- break;
- default:
- break;
- }
-
- // add keys
- for (i = 0; i < totcu; i++) {
- if (is_matrix) {
- if (i < 4)
- add_bezt(newcu[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(newcu[i], fra, loc[i - 4]);
- else
- add_bezt(newcu[i], fra, scale[i - 7]);
- }
- else {
- add_bezt(newcu[i], fra, val[i]);
- }
- }
-
-#ifdef ARMATURE_TEST
- if (is_joint) {
- switch (tm_type) {
- case COLLADAFW::Transformation::ROTATE:
- mat4_to_quat(val, matfra);
- break;
- case COLLADAFW::Transformation::SCALE:
- mat4_to_size(val, matfra);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- copy_v3_v3(val, matfra[3]);
- break;
- case MATRIX:
- mat4_to_quat(rot, matfra);
- copy_v3_v3(loc, matfra[3]);
- mat4_to_size(scale, matfra);
- break;
- default:
- break;
- }
-
- for (i = 0; i < totcu; i++) {
- if (is_matrix) {
- if (i < 4)
- add_bezt(job_curves[i], fra, rot[i]);
- else if (i < 7)
- add_bezt(job_curves[i], fra, loc[i - 4]);
- else
- add_bezt(job_curves[i], fra, scale[i - 7]);
- }
- else {
- add_bezt(job_curves[i], fra, val[i]);
- }
- }
- }
-#endif
- }
-
- verify_adt_action((ID*)&ob->id, 1);
-
- ListBase *curves = &ob->adt->action->curves;
-
- // add curves
- for (i = 0; i < totcu; i++) {
- if (is_joint)
- add_bone_fcurve(ob, node, newcu[i]);
- else
- BLI_addtail(curves, newcu[i]);
-
-#ifdef ARMATURE_TEST
- if (is_joint)
- BLI_addtail(&job->adt->action->curves, job_curves[i]);
-#endif
- }
-
- if (is_rotation || is_matrix) {
- if (is_joint) {
- bPoseChannel *chan = get_pose_channel(ob->pose, bone_name);
- chan->rotmode = ROT_MODE_QUAT;
- }
- else {
- ob->rotmode = ROT_MODE_QUAT;
- }
- }
-
- return job;
- }
-
- // internal, better make it private
- // warning: evaluates only rotation
- // prerequisites: animlist_map, curve_map
- void evaluate_transform_at_frame(float mat[4][4], COLLADAFW::Node *node, float fra)
- {
- const COLLADAFW::TransformationPointerArray& tms = node->getTransformations();
-
- unit_m4(mat);
-
- for (unsigned int i = 0; i < tms.getCount(); i++) {
- COLLADAFW::Transformation *tm = tms[i];
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
- float m[4][4];
-
- unit_m4(m);
-
- if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) {
- switch (type) {
- case COLLADAFW::Transformation::ROTATE:
- dae_rotate_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- dae_translate_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::SCALE:
- dae_scale_to_mat4(tm, m);
- break;
- case COLLADAFW::Transformation::MATRIX:
- dae_matrix_to_mat4(tm, m);
- break;
- default:
- fprintf(stderr, "unsupported transformation type %d\n", type);
- }
- }
-
- float temp[4][4];
- copy_m4_m4(temp, mat);
-
- mul_m4_m4m4(mat, m, temp);
- }
- }
-
- // return true to indicate that mat contains a sane value
- bool evaluate_animation(COLLADAFW::Transformation *tm, float mat[4][4], float fra, const char *node_id)
- {
- const COLLADAFW::UniqueId& listid = tm->getAnimationList();
- COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
-
- if (type != COLLADAFW::Transformation::ROTATE &&
- type != COLLADAFW::Transformation::SCALE &&
- type != COLLADAFW::Transformation::TRANSLATE &&
- type != COLLADAFW::Transformation::MATRIX) {
- fprintf(stderr, "animation of transformation %d is not supported yet\n", type);
- return false;
- }
-
- if (animlist_map.find(listid) == animlist_map.end())
- return false;
-
- const COLLADAFW::AnimationList *animlist = animlist_map[listid];
- const COLLADAFW::AnimationList::AnimationBindings& bindings = animlist->getAnimationBindings();
-
- if (bindings.getCount()) {
- float vec[3];
-
- bool is_scale = (type == COLLADAFW::Transformation::SCALE);
- bool is_translate = (type == COLLADAFW::Transformation::TRANSLATE);
-
- if (type == COLLADAFW::Transformation::SCALE)
- dae_scale_to_v3(tm, vec);
- else if (type == COLLADAFW::Transformation::TRANSLATE)
- dae_translate_to_v3(tm, vec);
-
- for (unsigned int j = 0; j < bindings.getCount(); j++) {
- const COLLADAFW::AnimationList::AnimationBinding& binding = bindings[j];
- std::vector<FCurve*>& curves = curve_map[binding.animation];
- COLLADAFW::AnimationList::AnimationClass animclass = binding.animationClass;
- char path[100];
-
- switch (type) {
- case COLLADAFW::Transformation::ROTATE:
- BLI_snprintf(path, sizeof(path), "%s.rotate (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::SCALE:
- BLI_snprintf(path, sizeof(path), "%s.scale (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::TRANSLATE:
- BLI_snprintf(path, sizeof(path), "%s.translate (binding %u)", node_id, j);
- break;
- case COLLADAFW::Transformation::MATRIX:
- BLI_snprintf(path, sizeof(path), "%s.matrix (binding %u)", node_id, j);
- break;
- default:
- break;
- }
-
- if (animclass == COLLADAFW::AnimationList::UNKNOWN_CLASS) {
- fprintf(stderr, "%s: UNKNOWN animation class\n", path);
- continue;
- }
-
- if (type == COLLADAFW::Transformation::ROTATE) {
- if (curves.size() != 1) {
- fprintf(stderr, "expected 1 curve, got %u\n", curves.size());
- return false;
- }
-
- // TODO support other animclasses
- if (animclass != COLLADAFW::AnimationList::ANGLE) {
- fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
- return false;
- }
-
- COLLADABU::Math::Vector3& axis = ((COLLADAFW::Rotate*)tm)->getRotationAxis();
- float ax[3] = {axis[0], axis[1], axis[2]};
- float angle = evaluate_fcurve(curves[0], fra);
- axis_angle_to_mat4(mat, ax, angle);
-
- return true;
- }
- else if (is_scale || is_translate) {
- bool is_xyz = animclass == COLLADAFW::AnimationList::POSITION_XYZ;
-
- if ((!is_xyz && curves.size() != 1) || (is_xyz && curves.size() != 3)) {
- if (is_xyz)
- fprintf(stderr, "%s: expected 3 curves, got %u\n", path, curves.size());
- else
- fprintf(stderr, "%s: expected 1 curve, got %u\n", path, curves.size());
- return false;
- }
-
- switch (animclass) {
- case COLLADAFW::AnimationList::POSITION_X:
- vec[0] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_Y:
- vec[1] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_Z:
- vec[2] = evaluate_fcurve(curves[0], fra);
- break;
- case COLLADAFW::AnimationList::POSITION_XYZ:
- vec[0] = evaluate_fcurve(curves[0], fra);
- vec[1] = evaluate_fcurve(curves[1], fra);
- vec[2] = evaluate_fcurve(curves[2], fra);
- break;
- default:
- fprintf(stderr, "%s: animation class %d is not supported yet\n", path, animclass);
- break;
- }
- }
- else if (type == COLLADAFW::Transformation::MATRIX) {
- // for now, of matrix animation, support only the case when all values are packed into one animation
- if (curves.size() != 16) {
- fprintf(stderr, "%s: expected 16 curves, got %u\n", path, curves.size());
- return false;
- }
-
- COLLADABU::Math::Matrix4 matrix;
- int i = 0, j = 0;
-
- for (std::vector<FCurve*>::iterator it = curves.begin(); it != curves.end(); it++) {
- matrix.setElement(i, j, evaluate_fcurve(*it, fra));
- j++;
- if (j == 4) {
- i++;
- j = 0;
- }
- }
-
- COLLADAFW::Matrix tm(matrix);
- dae_matrix_to_mat4(&tm, mat);
-
- return true;
- }
- }
-
- if (is_scale)
- size_to_mat4(mat, vec);
- else
- copy_v3_v3(mat[3], vec);
-
- return is_scale || is_translate;
- }
-
- return false;
- }
-
- // gives a world-space mat of joint at rest position
- void get_joint_rest_mat(float mat[4][4], COLLADAFW::Node *root, COLLADAFW::Node *node)
- {
- // if bind mat is not available,
- // use "current" node transform, i.e. all those tms listed inside <node>
- if (!armature_importer->get_joint_bind_mat(mat, node)) {
- float par[4][4], m[4][4];
-
- calc_joint_parent_mat_rest(par, NULL, root, node);
- get_node_mat(m, node, NULL, NULL);
- mul_m4_m4m4(mat, m, par);
- }
- }
-
- // gives a world-space mat, end's mat not included
- bool calc_joint_parent_mat_rest(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end)
- {
- float m[4][4];
-
- if (node == end) {
- par ? copy_m4_m4(mat, par) : unit_m4(mat);
- return true;
- }
-
- // use bind matrix if available or calc "current" world mat
- if (!armature_importer->get_joint_bind_mat(m, node)) {
- if (par) {
- float temp[4][4];
- get_node_mat(temp, node, NULL, NULL);
- mul_m4_m4m4(m, temp, par);
- }
- else {
- get_node_mat(m, node, NULL, NULL);
- }
- }
-
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (unsigned int i = 0; i < children.getCount(); i++) {
- if (calc_joint_parent_mat_rest(mat, m, children[i], end))
- return true;
- }
-
- return false;
- }
-
-#ifdef ARMATURE_TEST
- Object *get_joint_object(COLLADAFW::Node *root, COLLADAFW::Node *node, Object *par_job)
- {
- if (joint_objects.find(node->getUniqueId()) == joint_objects.end()) {
- Object *job = add_object(scene, OB_EMPTY);
-
- rename_id((ID*)&job->id, (char*)get_joint_name(node));
-
- job->lay = object_in_scene(job, scene)->lay = 2;
-
- mul_v3_fl(job->size, 0.5f);
- job->recalc |= OB_RECALC_OB;
-
- verify_adt_action((ID*)&job->id, 1);
-
- job->rotmode = ROT_MODE_QUAT;
-
- float mat[4][4];
- get_joint_rest_mat(mat, root, node);
-
- if (par_job) {
- float temp[4][4], ipar[4][4];
- invert_m4_m4(ipar, par_job->obmat);
- copy_m4_m4(temp, mat);
- mul_m4_m4m4(mat, temp, ipar);
- }
-
- TransformBase::decompose(mat, job->loc, NULL, job->quat, job->size);
-
- if (par_job) {
- job->parent = par_job;
-
- par_job->recalc |= OB_RECALC_OB;
- job->parsubstr[0] = 0;
- }
-
- where_is_object(scene, job);
-
- // after parenting and layer change
- DAG_scene_sort(CTX_data_main(C), scene);
-
- joint_objects[node->getUniqueId()] = job;
- }
-
- return joint_objects[node->getUniqueId()];
- }
-#endif
-
-#if 0
- // recursively evaluates joint tree until end is found, mat then is world-space matrix of end
- // mat must be identity on enter, node must be root
- bool evaluate_joint_world_transform_at_frame(float mat[4][4], float par[4][4], COLLADAFW::Node *node, COLLADAFW::Node *end, float fra)
- {
- float m[4][4];
- if (par) {
- float temp[4][4];
- evaluate_transform_at_frame(temp, node, node == end ? fra : 0.0f);
- mul_m4_m4m4(m, temp, par);
- }
- else {
- evaluate_transform_at_frame(m, node, node == end ? fra : 0.0f);
- }
-
- if (node == end) {
- copy_m4_m4(mat, m);
- return true;
- }
- else {
- COLLADAFW::NodePointerArray& children = node->getChildNodes();
- for (int i = 0; i < children.getCount(); i++) {
- if (evaluate_joint_world_transform_at_frame(mat, m, children[i], end, fra))
- return true;
- }
- }
-
- return false;
- }
-#endif
-
- void add_bone_fcurve(Object *ob, COLLADAFW::Node *node, FCurve *fcu)
- {
- const char *bone_name = get_joint_name(node);
- bAction *act = ob->adt->action;
-
- /* try to find group */
- bActionGroup *grp = action_groups_find_named(act, bone_name);
-
- /* no matching groups, so add one */
- if (grp == NULL) {
- /* Add a new group, and make it active */
- grp = (bActionGroup*)MEM_callocN(sizeof(bActionGroup), "bActionGroup");
-
- grp->flag = AGRP_SELECTED;
- BLI_strncpy(grp->name, bone_name, sizeof(grp->name));
-
- BLI_addtail(&act->groups, grp);
- BLI_uniquename(&act->groups, grp, "Group", '.', offsetof(bActionGroup, name), 64);
- }
-
- /* add F-Curve to group */
- action_groups_add_channel(act, grp, fcu);
- }
-
- void add_bezt(FCurve *fcu, float fra, float value)
- {
- BezTriple bez;
- memset(&bez, 0, sizeof(BezTriple));
- bez.vec[1][0] = fra;
- bez.vec[1][1] = value;
- bez.ipo = U.ipo_new; /* use default interpolation mode here... */
- bez.f1 = bez.f2 = bez.f3 = SELECT;
- bez.h1 = bez.h2 = HD_AUTO;
- insert_bezt_fcurve(fcu, &bez, 0);
- calchandles_fcurve(fcu);
- }
-};
/*
-
COLLADA Importer limitations:
-
- no multiple scene import, all objects are added to active scene
-
*/
+
+// #define COLLADA_DEBUG
+// creates empties for each imported bone on layer 2, for debugging
+// #define ARMATURE_TEST
+
/** Class that needs to be implemented by a writer.
IMPORTANT: The write functions are called in arbitrary order.*/
-class Writer: public COLLADAFW::IWriter
-{
+/*
private:
std::string mFilename;
@@ -3240,43 +104,58 @@ private:
std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
std::map<COLLADAFW::UniqueId, Object*> object_map;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
std::vector<const COLLADAFW::VisualScene*> vscenes;
+ std::vector<Object*> libnode_ob;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map;
+ */
+ // find root joint by child joint uid, for bone tree evaluation during resampling
// animation
// std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > uid_fcurve_map;
// Nodes don't share AnimationLists (Arystan)
// std::map<COLLADAFW::UniqueId, Animation> uid_animated_map; // AnimationList->uniqueId to AnimatedObject map
-public:
+//public:
/** Constructor. */
- Writer(bContext *C, const char *filename) : mFilename(filename), mContext(C),
- armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
- mesh_importer(&armature_importer, CTX_data_scene(C)),
- anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C)) {}
+ DocumentImporter::DocumentImporter(bContext *C, const char *filename) :
+ mImportStage(General),
+ mFilename(filename),
+ mContext(C),
+ armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
+ mesh_importer(&unit_converter, &armature_importer, CTX_data_scene(C)),
+ anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C))
+ {}
/** Destructor. */
- ~Writer() {}
+ DocumentImporter::~DocumentImporter() {}
- bool write()
+ bool DocumentImporter::import()
{
+ /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
COLLADASaxFWL::Loader loader;
COLLADAFW::Root root(&loader, this);
- // XXX report error
if (!root.loadDocument(mFilename))
return false;
+
+ /** TODO set up scene graph and such here */
+
+ mImportStage = Controller;
+
+ COLLADASaxFWL::Loader loader2;
+ COLLADAFW::Root root2(&loader2, this);
+
+ if (!root2.loadDocument(mFilename))
+ return false;
+
return true;
}
-
- /** This method will be called if an error in the loading process occurred and the loader cannot
- continue to load. The writer should undo all operations that have been performed.
- @param errorMessage A message containing informations about the error that occurred.
- */
- virtual void cancel(const COLLADAFW::String& errorMessage)
+
+ void DocumentImporter::cancel(const COLLADAFW::String& errorMessage)
{
// TODO: if possible show error info
//
@@ -3286,14 +165,50 @@ public:
// The latter sounds better.
}
- /** This is the method called. The writer hast to prepare to receive data.*/
- virtual void start()
- {
- }
+ void DocumentImporter::start(){}
/** This method is called after the last write* method. No other methods will be called after this.*/
- virtual void finish()
+ void DocumentImporter::finish()
{
+ if(mImportStage!=General)
+ return;
+
+ /** TODO Break up and put into 2-pass parsing of DAE */
+ std::vector<const COLLADAFW::VisualScene*>::iterator it;
+ for (it = vscenes.begin(); it != vscenes.end(); it++) {
+ PointerRNA sceneptr, unit_settings;
+ PropertyRNA *system, *scale;
+ // TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
+ Scene *sce = CTX_data_scene(mContext);
+
+ // for scene unit settings: system, scale_length
+ RNA_id_pointer_create(&sce->id, &sceneptr);
+ unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
+ system = RNA_struct_find_property(&unit_settings, "system");
+ scale = RNA_struct_find_property(&unit_settings, "scale_length");
+
+ switch(unit_converter.isMetricSystem()) {
+ case UnitConverter::Metric:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC);
+ break;
+ case UnitConverter::Imperial:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL);
+ break;
+ default:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE);
+ break;
+ }
+ RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter());
+
+ const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
+
+ for (unsigned int i = 0; i < roots.getCount(); i++) {
+ write_node(roots[i], NULL, sce, NULL, false);
+ }
+ }
+
+ armature_importer.make_armatures(mContext);
+
#if 0
armature_importer.fix_animation();
#endif
@@ -3302,13 +217,36 @@ public:
const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
for (unsigned int i = 0; i < roots.getCount(); i++)
- translate_anim_recursive(roots[i]);
+ translate_anim_recursive(roots[i],NULL,NULL);
}
+ if (libnode_ob.size()) {
+ Scene *sce = CTX_data_scene(mContext);
+
+ fprintf(stderr, "got %d library nodes to free\n", (int)libnode_ob.size());
+ // free all library_nodes
+ std::vector<Object*>::iterator it;
+ for (it = libnode_ob.begin(); it != libnode_ob.end(); it++) {
+ Object *ob = *it;
+
+ Base *base = object_in_scene(ob, sce);
+ if (base) {
+ BLI_remlink(&sce->base, base);
+ free_libblock_us(&G.main->object, base->object);
+ if (sce->basact==base)
+ sce->basact= NULL;
+ MEM_freeN(base);
+ }
+ }
+ libnode_ob.clear();
+
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
+ }
}
- void translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
+ void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
{
if (par && par->getType() == COLLADAFW::Node::JOINT) {
// par is root if there's no corresp. key in root_map
@@ -3339,11 +277,8 @@ public:
/** When this method is called, the writer must write the global document asset.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
+ bool DocumentImporter::writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
{
- // XXX take up_axis, unit into account
- // COLLADAFW::FileInfo::Unit unit = asset->getUnit();
- // COLLADAFW::FileInfo::UpAxisType upAxis = asset->getUpAxisType();
unit_converter.read_asset(asset);
return true;
@@ -3351,44 +286,86 @@ public:
/** When this method is called, the writer must write the scene.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeScene ( const COLLADAFW::Scene* scene )
+ bool DocumentImporter::writeScene ( const COLLADAFW::Scene* scene )
{
// XXX could store the scene id, but do nothing for now
return true;
}
- Object *create_camera_object(COLLADAFW::InstanceCamera *camera, Object *ob, Scene *sce)
+ Object* DocumentImporter::create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce)
{
const COLLADAFW::UniqueId& cam_uid = camera->getInstanciatedObjectId();
if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) {
- fprintf(stderr, "Couldn't find camera by UID. \n");
+ fprintf(stderr, "Couldn't find camera by UID.\n");
return NULL;
}
- ob = add_object(sce, OB_CAMERA);
+ Object *ob = add_object(sce, OB_CAMERA);
Camera *cam = uid_camera_map[cam_uid];
Camera *old_cam = (Camera*)ob->data;
- old_cam->id.us--;
ob->data = cam;
- if (old_cam->id.us == 0) free_libblock(&G.main->camera, old_cam);
+ old_cam->id.us--;
+ if (old_cam->id.us == 0)
+ free_libblock(&G.main->camera, old_cam);
return ob;
}
- Object *create_lamp_object(COLLADAFW::InstanceLight *lamp, Object *ob, Scene *sce)
+ Object* DocumentImporter::create_lamp_object(COLLADAFW::InstanceLight *lamp, Scene *sce)
{
const COLLADAFW::UniqueId& lamp_uid = lamp->getInstanciatedObjectId();
if (uid_lamp_map.find(lamp_uid) == uid_lamp_map.end()) {
fprintf(stderr, "Couldn't find lamp by UID. \n");
return NULL;
}
- ob = add_object(sce, OB_LAMP);
+ Object *ob = add_object(sce, OB_LAMP);
Lamp *la = uid_lamp_map[lamp_uid];
Lamp *old_lamp = (Lamp*)ob->data;
- old_lamp->id.us--;
ob->data = la;
- if (old_lamp->id.us == 0) free_libblock(&G.main->lamp, old_lamp);
+ old_lamp->id.us--;
+ if (old_lamp->id.us == 0)
+ free_libblock(&G.main->lamp, old_lamp);
return ob;
}
+
+ Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
+ {
+ Object *obn = copy_object(source_ob);
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
+ scene_add_base(sce, obn);
+
+ if (instance_node)
+ anim_importer.read_node_transform(instance_node, obn);
+ else
+ anim_importer.read_node_transform(source_node, obn);
+
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
+
+ COLLADAFW::NodePointerArray &children = source_node->getChildNodes();
+ if (children.getCount()) {
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ COLLADAFW::Node *child_node = children[i];
+ const COLLADAFW::UniqueId& child_id = child_node->getUniqueId();
+ if (object_map.find(child_id) == object_map.end())
+ continue;
+ COLLADAFW::InstanceNodePointerArray &inodes = child_node->getInstanceNodes();
+ Object *new_child = NULL;
+ if (inodes.getCount()) {
+ const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
+ new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, is_library_node);
+ }
+ else {
+ new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
+ }
+ bc_set_parent(new_child, obn, mContext, true);
+
+ if (is_library_node)
+ libnode_ob.push_back(new_child);
+ }
+ }
+
+ return obn;
+ }
- void write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par)
+ void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
{
Object *ob = NULL;
bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
@@ -3402,39 +379,64 @@ public:
COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
+ int geom_done = 0;
+ int camera_done = 0;
+ int lamp_done = 0;
+ int controller_done = 0;
+ int inst_done = 0;
// XXX linking object with the first <instance_geometry>, though a node may have more of them...
// maybe join multiple <instance_...> meshes into 1, and link object with it? not sure...
// <instance_geometry>
- if (geom.getCount() != 0) {
- ob = mesh_importer.create_mesh_object(node, geom[0], false, uid_material_map,
+ while (geom_done < geom.getCount()) {
+ ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
material_texture_mapping_map);
+ ++geom_done;
}
- else if (camera.getCount() != 0) {
- ob = create_camera_object(camera[0], ob, sce);
+ while (camera_done < camera.getCount()) {
+ ob = create_camera_object(camera[camera_done], sce);
+ ++camera_done;
}
- else if (lamp.getCount() != 0) {
- ob = create_lamp_object(lamp[0], ob, sce);
+ while (lamp_done < lamp.getCount()) {
+ ob = create_lamp_object(lamp[lamp_done], sce);
+ ++lamp_done;
}
- else if (controller.getCount() != 0) {
- COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[0];
+ while (controller_done < controller.getCount()) {
+ COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
ob = mesh_importer.create_mesh_object(node, geom, true, uid_material_map, material_texture_mapping_map);
+ ++controller_done;
}
// XXX instance_node is not supported yet
- else if (inst_node.getCount() != 0) {
- return;
+ while (inst_done < inst_node.getCount()) {
+ const COLLADAFW::UniqueId& node_id = inst_node[inst_done]->getInstanciatedObjectId();
+ if (object_map.find(node_id) == object_map.end()) {
+ fprintf(stderr, "Cannot find node to instanciate.\n");
+ ob = NULL;
+ }
+ else {
+ Object *source_ob = object_map[node_id];
+ COLLADAFW::Node *source_node = node_map[node_id];
+
+ ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
+ }
+ ++inst_done;
}
// if node is empty - create empty object
// XXX empty node may not mean it is empty object, not sure about this
- else {
+ if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
ob = add_object(sce, OB_EMPTY);
- rename_id(&ob->id, (char*)node->getOriginalId().c_str());
}
// check if object is not NULL
if (!ob) return;
+
+ rename_id(&ob->id, (char*)node->getOriginalId().c_str());
- object_map[node->getUniqueId()] = ob;
+ object_map[node->getUniqueId()] = ob;
+ node_map[node->getUniqueId()] = node;
+
+ if (is_library_node)
+ libnode_ob.push_back(ob);
}
anim_importer.read_node_transform(node, ob);
@@ -3442,20 +444,23 @@ public:
if (!is_joint) {
// if par was given make this object child of the previous
if (par && ob)
- set_parent(ob, par, mContext);
+ bc_set_parent(ob, par, mContext);
}
// if node has child nodes write them
COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes();
for (unsigned int i = 0; i < child_nodes.getCount(); i++) {
- write_node(child_nodes[i], node, sce, ob);
+ write_node(child_nodes[i], node, sce, ob, is_library_node);
}
}
/** When this method is called, the writer must write the entire visual scene.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
+ bool DocumentImporter::writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
{
+ if(mImportStage!=General)
+ return true;
+
// this method called on post process after writeGeometry, writeMaterial, etc.
// for each <node> in <visual_scene>:
@@ -3467,17 +472,6 @@ public:
// we link Objects with Meshes here
vscenes.push_back(visualScene);
-
- // TODO: create a new scene except the selected <visual_scene> - use current blender
- // scene for it
- Scene *sce = CTX_data_scene(mContext);
- const COLLADAFW::NodePointerArray& roots = visualScene->getRootNodes();
-
- for (unsigned int i = 0; i < roots.getCount(); i++) {
- write_node(roots[i], NULL, sce, NULL);
- }
-
- armature_importer.make_armatures(mContext);
return true;
}
@@ -3485,22 +479,39 @@ public:
/** When this method is called, the writer must handle all nodes contained in the
library nodes.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
+ bool DocumentImporter::writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
{
+ if(mImportStage!=General)
+ return true;
+
+ Scene *sce = CTX_data_scene(mContext);
+
+ const COLLADAFW::NodePointerArray& nodes = libraryNodes->getNodes();
+
+ for (unsigned int i = 0; i < nodes.getCount(); i++) {
+ write_node(nodes[i], NULL, sce, NULL, true);
+ }
+
return true;
}
/** When this method is called, the writer must write the geometry.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeGeometry ( const COLLADAFW::Geometry* geom )
+ bool DocumentImporter::writeGeometry ( const COLLADAFW::Geometry* geom )
{
+ if(mImportStage!=General)
+ return true;
+
return mesh_importer.write_geometry(geom);
}
/** When this method is called, the writer must write the material.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeMaterial( const COLLADAFW::Material* cmat )
+ bool DocumentImporter::writeMaterial( const COLLADAFW::Material* cmat )
{
+ if(mImportStage!=General)
+ return true;
+
const std::string& str_mat_id = cmat->getOriginalId();
Material *ma = add_material((char*)str_mat_id.c_str());
@@ -3511,7 +522,7 @@ public:
}
// create mtex, create texture, set texture image
- MTex *create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
+ MTex* DocumentImporter::create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
int i, TexIndexTextureArrayMap &texindex_texarray_map)
{
COLLADAFW::SamplerPointerArray& samp_array = ef->getSamplerPointerArray();
@@ -3536,7 +547,7 @@ public:
return ma->mtex[i];
}
- void write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
+ void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
{
COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType();
@@ -3548,8 +559,7 @@ public:
// phong
else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
ma->spec_shader = MA_SPEC_PHONG;
- // XXX setting specular hardness instead of specularity intensity
- ma->har = ef->getShininess().getFloatValue() * 4;
+ ma->har = ef->getShininess().getFloatValue();
}
// lambert
else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
@@ -3674,8 +684,10 @@ public:
/** When this method is called, the writer must write the effect.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeEffect( const COLLADAFW::Effect* effect )
+ bool DocumentImporter::writeEffect( const COLLADAFW::Effect* effect )
{
+ if(mImportStage!=General)
+ return true;
const COLLADAFW::UniqueId& uid = effect->getUniqueId();
if (uid_effect_map.find(uid) == uid_effect_map.end()) {
@@ -3701,8 +713,11 @@ public:
/** When this method is called, the writer must write the camera.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeCamera( const COLLADAFW::Camera* camera )
+ bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
{
+ if(mImportStage!=General)
+ return true;
+
Camera *cam = NULL;
std::string cam_id, cam_name;
@@ -3737,6 +752,75 @@ public:
}
break;
}
+
+ switch(camera->getDescriptionType()) {
+ case COLLADAFW::Camera::ASPECTRATIO_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ {
+ double ymag = camera->getYMag().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xmag = aspect*ymag;
+ cam->ortho_scale = (float)xmag;
+ }
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xfov = aspect*yfov;
+ // xfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)xfov*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ /* XXX correct way to do following four is probably to get also render
+ size and determine proper settings from that somehow */
+ case COLLADAFW::Camera::ASPECTRATIO_AND_X:
+ case COLLADAFW::Camera::SINGLE_X:
+ case COLLADAFW::Camera::X_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getXMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double x = camera->getXFov().getValue();
+ // x is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)x*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ case COLLADAFW::Camera::SINGLE_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getYMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ // yfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)yfov*(M_PI/180.0f));
+ }
+ break;
+ }
+ }
+ break;
+ case COLLADAFW::Camera::UNDEFINED:
+ // read nothing, use blender defaults.
+ break;
+ }
+
this->uid_camera_map[camera->getUniqueId()] = cam;
// XXX import camera options
return true;
@@ -3744,8 +828,11 @@ public:
/** When this method is called, the writer must write the image.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeImage( const COLLADAFW::Image* image )
+ bool DocumentImporter::writeImage( const COLLADAFW::Image* image )
{
+ if(mImportStage!=General)
+ return true;
+
// XXX maybe it is necessary to check if the path is absolute or relative
const std::string& filepath = image->getImageURI().toNativePath();
const char *filename = (const char*)mFilename.c_str();
@@ -3753,8 +840,8 @@ public:
char full_path[FILE_MAX];
BLI_split_dirfile(filename, dir, NULL);
- BLI_join_dirfile(full_path, dir, filepath.c_str());
- Image *ima = BKE_add_image_file(full_path, 0);
+ BLI_join_dirfile(full_path, sizeof(full_path), dir, filepath.c_str());
+ Image *ima = BKE_add_image_file(full_path);
if (!ima) {
fprintf(stderr, "Cannot create image. \n");
return true;
@@ -3766,8 +853,11 @@ public:
/** When this method is called, the writer must write the light.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeLight( const COLLADAFW::Light* light )
+ bool DocumentImporter::writeLight( const COLLADAFW::Light* light )
{
+ if(mImportStage!=General)
+ return true;
+
Lamp *lamp = NULL;
std::string la_id, la_name;
@@ -3786,6 +876,38 @@ public:
lamp->g = col.getGreen();
lamp->b = col.getBlue();
}
+ float constatt = light->getConstantAttenuation().getValue();
+ float linatt = light->getLinearAttenuation().getValue();
+ float quadatt = light->getQuadraticAttenuation().getValue();
+ float d = 25.0f;
+ float att1 = 0.0f;
+ float att2 = 0.0f;
+
+ float e = 1.0f/constatt;
+
+ /* NOTE: We assume for now that inv square is used for quadratic light
+ * and inv linear for linear light. Exported blender lin/quad weighted
+ * most likely will result in wrong import. */
+ /* quadratic light */
+ if(IS_EQ(linatt, 0.0f) && quadatt > 0.0f) {
+ //quadatt = att2/(d*d*(e*2));
+ float invquadatt = 1.0f/quadatt;
+ float d2 = invquadatt / (2 * e);
+ d = sqrtf(d2);
+ }
+ // linear light
+ else if(IS_EQ(quadatt, 0.0f) && linatt > 0.0f) {
+ //linatt = att1/(d*e);
+ float invlinatt = 1.0f/linatt;
+ d = invlinatt / e;
+ } else {
+ printf("no linear nor quad light, using defaults for attenuation, import will be incorrect: Lamp %s\n", lamp->id.name);
+ att2 = 1.0f;
+ }
+
+ lamp->dist = d;
+ lamp->energy = e;
+
COLLADAFW::Light::LightType type = light->getLightType();
switch(type) {
case COLLADAFW::Light::AMBIENT_LIGHT:
@@ -3796,9 +918,9 @@ public:
case COLLADAFW::Light::SPOT_LIGHT:
{
lamp->type = LA_SPOT;
- lamp->falloff_type = LA_FALLOFF_SLIDERS;
- lamp->att1 = light->getLinearAttenuation().getValue();
- lamp->att2 = light->getQuadraticAttenuation().getValue();
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
lamp->spotsize = light->getFallOffAngle().getValue();
lamp->spotblend = light->getFallOffExponent().getValue();
}
@@ -3811,8 +933,9 @@ public:
case COLLADAFW::Light::POINT_LIGHT:
{
lamp->type = LA_LOCAL;
- lamp->att1 = light->getLinearAttenuation().getValue();
- lamp->att2 = light->getQuadraticAttenuation().getValue();
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
}
break;
case COLLADAFW::Light::UNDEFINED:
@@ -3828,45 +951,50 @@ public:
}
// this function is called only for animations that pass COLLADAFW::validate
- virtual bool writeAnimation( const COLLADAFW::Animation* anim )
+ bool DocumentImporter::writeAnimation( const COLLADAFW::Animation* anim )
{
+ if(mImportStage!=General)
+ return true;
+
// return true;
return anim_importer.write_animation(anim);
}
// called on post-process stage after writeVisualScenes
- virtual bool writeAnimationList( const COLLADAFW::AnimationList* animationList )
+ bool DocumentImporter::writeAnimationList( const COLLADAFW::AnimationList* animationList )
{
+ if(mImportStage!=General)
+ return true;
+
// return true;
return anim_importer.write_animation_list(animationList);
}
/** When this method is called, the writer must write the skin controller data.
@return The writer should return true, if writing succeeded, false otherwise.*/
- virtual bool writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
+ bool DocumentImporter::writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
{
return armature_importer.write_skin_controller_data(skin);
}
// this is called on postprocess, before writeVisualScenes
- virtual bool writeController( const COLLADAFW::Controller* controller )
+ bool DocumentImporter::writeController( const COLLADAFW::Controller* controller )
{
+ if(mImportStage!=General)
+ return true;
+
return armature_importer.write_controller(controller);
}
- virtual bool writeFormulas( const COLLADAFW::Formulas* formulas )
+ bool DocumentImporter::writeFormulas( const COLLADAFW::Formulas* formulas )
{
return true;
}
- virtual bool writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
+ bool DocumentImporter::writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
{
return true;
}
-};
-void DocumentImporter::import(bContext *C, const char *filename)
-{
- Writer w(C, filename);
- w.write();
-}
+
+
diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h
index babf8f65d7f..e312268c458 100644
--- a/source/blender/collada/DocumentImporter.h
+++ b/source/blender/collada/DocumentImporter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,11 +21,132 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file DocumentImporter.h
+ * \ingroup collada
+ */
+
+#ifndef __DOCUMENTIMPORTER_H__
+#define __DOCUMENTIMPORTER_H__
+
+#include "COLLADAFWIWriter.h"
+#include "COLLADAFWMaterial.h"
+#include "COLLADAFWEffect.h"
+#include "COLLADAFWColor.h"
+#include "COLLADAFWImage.h"
+#include "COLLADAFWInstanceGeometry.h"
+#include "COLLADAFWController.h"
+#include "COLLADAFWMorphController.h"
+#include "COLLADAFWSkinController.h"
+
+#include "BKE_object.h"
+
+#include "TransformReader.h"
+#include "AnimationImporter.h"
+#include "ArmatureImporter.h"
+#include "MeshImporter.h"
+
+
struct Main;
struct bContext;
-class DocumentImporter
+/** Importer class. */
+class DocumentImporter : COLLADAFW::IWriter
{
public:
- void import(bContext *C, const char *filename);
+ //! Enumeration to denote the stage of import
+ enum ImportStage {
+ General, //!< First pass to collect all data except controller
+ Controller, //!< Second pass to collect controller data
+ };
+ /** Constructor */
+ DocumentImporter(bContext *C, const char *filename);
+
+ /** Destructor */
+ ~DocumentImporter();
+
+ /** Function called by blender UI */
+ bool import();
+
+ /** these should not be here */
+ Object* create_camera_object(COLLADAFW::InstanceCamera*, Scene*);
+ Object* create_lamp_object(COLLADAFW::InstanceLight*, Scene*);
+ Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, bool);
+ void write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
+ MTex* create_texture(COLLADAFW::EffectCommon*, COLLADAFW::Texture&, Material*, int, TexIndexTextureArrayMap&);
+ void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);
+ void translate_anim_recursive(COLLADAFW::Node*, COLLADAFW::Node*, Object*);
+
+ /** This method will be called if an error in the loading process occurred and the loader cannot
+ continue to load. The writer should undo all operations that have been performed.
+ @param errorMessage A message containing informations about the error that occurred.
+ */
+ void cancel(const COLLADAFW::String& errorMessage);
+
+ /** This is the method called. The writer hast to prepare to receive data.*/
+ void start();
+
+ /** This method is called after the last write* method. No other methods will be called after this.*/
+ void finish();
+
+ bool writeGlobalAsset(const COLLADAFW::FileInfo*);
+
+ bool writeScene(const COLLADAFW::Scene*);
+
+ bool writeVisualScene(const COLLADAFW::VisualScene*);
+
+ bool writeLibraryNodes(const COLLADAFW::LibraryNodes*);
+
+ bool writeAnimation(const COLLADAFW::Animation*);
+
+ bool writeAnimationList(const COLLADAFW::AnimationList*);
+
+ bool writeGeometry(const COLLADAFW::Geometry*);
+
+ bool writeMaterial(const COLLADAFW::Material*);
+
+ bool writeEffect(const COLLADAFW::Effect*);
+
+ bool writeCamera(const COLLADAFW::Camera*);
+
+ bool writeImage(const COLLADAFW::Image*);
+
+ bool writeLight(const COLLADAFW::Light*);
+
+ bool writeSkinControllerData(const COLLADAFW::SkinControllerData*);
+
+ bool writeController(const COLLADAFW::Controller*);
+
+ bool writeFormulas(const COLLADAFW::Formulas*);
+
+ bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
+
+ private:
+
+ /** Current import stage we're in. */
+ ImportStage mImportStage;
+ std::string mFilename;
+
+ bContext *mContext;
+
+ UnitConverter unit_converter;
+ ArmatureImporter armature_importer;
+ MeshImporter mesh_importer;
+ AnimationImporter anim_importer;
+
+ std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
+ std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
+ std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
+ std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
+ std::map<COLLADAFW::UniqueId, Object*> object_map;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
+ std::vector<const COLLADAFW::VisualScene*> vscenes;
+ std::vector<Object*> libnode_ob;
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
+
};
+
+#endif
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
new file mode 100644
index 00000000000..d20cb74ba9f
--- /dev/null
+++ b/source/blender/collada/EffectExporter.cpp
@@ -0,0 +1,306 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <map>
+
+#include "COLLADASWEffectProfile.h"
+
+#include "EffectExporter.h"
+#include "MaterialExporter.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_texture_types.h"
+
+#include "BKE_customdata.h"
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+// OB_MESH is assumed
+static std::string getActiveUVLayerName(Object *ob)
+{
+ Mesh *me = (Mesh*)ob->data;
+
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+ if (num_layers)
+ return std::string(bc_CustomData_get_active_layer_name(&me->fdata, CD_MTFACE));
+
+ return "";
+}
+
+
+EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+void EffectsExporter::exportEffects(Scene *sce)
+{
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<EffectsExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void EffectsExporter::operator()(Material *ma, Object *ob)
+{
+ // create a list of indices to textures of type TEX_IMAGE
+ std::vector<int> tex_indices;
+ createTextureIndices(ma, tex_indices);
+
+ openEffect(translate_id(id_name(ma)) + "-effect");
+
+ COLLADASW::EffectProfile ep(mSW);
+ ep.setProfileType(COLLADASW::EffectProfile::COMMON);
+ ep.openProfile();
+ // set shader type - one of three blinn, phong or lambert
+ if (ma->spec_shader == MA_SPEC_BLINN) {
+ ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+ // shininess
+ ep.setShininess(ma->har);
+ }
+ else if (ma->spec_shader == MA_SPEC_PHONG) {
+ ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+ // shininess
+ ep.setShininess(ma->har);
+ }
+ else {
+ // XXX write warning "Current shader type is not supported"
+ ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+ }
+ // index of refraction
+ if (ma->mode & MA_RAYTRANSP) {
+ ep.setIndexOfRefraction(ma->ang);
+ }
+ else {
+ ep.setIndexOfRefraction(1.0f);
+ }
+
+ COLLADASW::ColorOrTexture cot;
+
+ // transparency
+ if (ma->mode & MA_TRANSP) {
+ // Tod: because we are in A_ONE mode transparency is calculated like this:
+ ep.setTransparency(ma->alpha);
+ // cot = getcol(1.0f, 1.0f, 1.0f, 1.0f);
+ // ep.setTransparent(cot);
+ }
+
+ // emission
+ cot=getcol(ma->emit, ma->emit, ma->emit, 1.0f);
+ ep.setEmission(cot);
+
+ // diffuse multiplied by diffuse intensity
+ cot = getcol(ma->r * ma->ref, ma->g * ma->ref, ma->b * ma->ref, 1.0f);
+ ep.setDiffuse(cot);
+
+ // ambient
+ cot = getcol(ma->ambr, ma->ambg, ma->ambb, 1.0f);
+ ep.setAmbient(cot);
+
+ // reflective, reflectivity
+ if (ma->mode & MA_RAYMIRROR) {
+ cot = getcol(ma->mirr, ma->mirg, ma->mirb, 1.0f);
+ ep.setReflective(cot);
+ ep.setReflectivity(ma->ray_mirror);
+ }
+ // else {
+ // cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+ // ep.setReflective(cot);
+ // ep.setReflectivity(ma->spec);
+ // }
+
+ // specular
+ if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) {
+ cot = getcol(ma->specr * ma->spec, ma->specg * ma->spec, ma->specb * ma->spec, 1.0f);
+ ep.setSpecular(cot);
+ }
+
+ // XXX make this more readable if possible
+
+ // create <sampler> and <surface> for each image
+ COLLADASW::Sampler samplers[MAX_MTEX];
+ //COLLADASW::Surface surfaces[MAX_MTEX];
+ //void *samp_surf[MAX_MTEX][2];
+ void *samp_surf[MAX_MTEX][1];
+
+ // image to index to samp_surf map
+ // samp_surf[index] stores 2 pointers, sampler and surface
+ std::map<std::string, int> im_samp_map;
+
+ unsigned int a, b;
+ for (a = 0, b = 0; a < tex_indices.size(); a++) {
+ MTex *t = ma->mtex[tex_indices[a]];
+ Image *ima = t->tex->ima;
+
+ // Image not set for texture
+ if(!ima) continue;
+
+ std::string key(id_name(ima));
+ key = translate_id(key);
+
+ // create only one <sampler>/<surface> pair for each unique image
+ if (im_samp_map.find(key) == im_samp_map.end()) {
+ // //<newparam> <surface> <init_from>
+ // COLLADASW::Surface surface(COLLADASW::Surface::SURFACE_TYPE_2D,
+ // key + COLLADASW::Surface::SURFACE_SID_SUFFIX);
+ // COLLADASW::SurfaceInitOption sio(COLLADASW::SurfaceInitOption::INIT_FROM);
+ // sio.setImageReference(key);
+ // surface.setInitOption(sio);
+
+ // COLLADASW::NewParamSurface surface(mSW);
+ // surface->setParamType(COLLADASW::CSW_SURFACE_TYPE_2D);
+
+ //<newparam> <sampler> <source>
+ COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
+ key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX,
+ key + COLLADASW::Sampler::SURFACE_SID_SUFFIX);
+ sampler.setImageId(key);
+ // copy values to arrays since they will live longer
+ samplers[a] = sampler;
+ //surfaces[a] = surface;
+
+ // store pointers so they can be used later when we create <texture>s
+ samp_surf[b][0] = &samplers[a];
+ //samp_surf[b][1] = &surfaces[a];
+
+ im_samp_map[key] = b;
+ b++;
+ }
+ }
+
+ // used as fallback when MTex->uvname is "" (this is pretty common)
+ // it is indeed the correct value to use in that case
+ std::string active_uv(getActiveUVLayerName(ob));
+
+ // write textures
+ // XXX very slow
+ for (a = 0; a < tex_indices.size(); a++) {
+ MTex *t = ma->mtex[tex_indices[a]];
+ Image *ima = t->tex->ima;
+
+ // Image not set for texture
+ if(!ima) continue;
+
+ // we assume map input is always TEXCO_UV
+
+ std::string key(id_name(ima));
+ key = translate_id(key);
+ int i = im_samp_map[key];
+ COLLADASW::Sampler *sampler = (COLLADASW::Sampler*)samp_surf[i][0];
+ //COLLADASW::Surface *surface = (COLLADASW::Surface*)samp_surf[i][1];
+
+ std::string uvname = strlen(t->uvname) ? t->uvname : active_uv;
+
+ // color
+ if (t->mapto & MAP_COL) {
+ ep.setDiffuse(createTexture(ima, uvname, sampler));
+ }
+ // ambient
+ if (t->mapto & MAP_AMB) {
+ ep.setAmbient(createTexture(ima, uvname, sampler));
+ }
+ // specular
+ if (t->mapto & MAP_SPEC) {
+ ep.setSpecular(createTexture(ima, uvname, sampler));
+ }
+ // emission
+ if (t->mapto & MAP_EMIT) {
+ ep.setEmission(createTexture(ima, uvname, sampler));
+ }
+ // reflective
+ if (t->mapto & MAP_REF) {
+ ep.setReflective(createTexture(ima, uvname, sampler));
+ }
+ // alpha
+ if (t->mapto & MAP_ALPHA) {
+ ep.setTransparent(createTexture(ima, uvname, sampler));
+ }
+ // extension:
+ // Normal map --> Must be stored with <extra> tag as different technique,
+ // since COLLADA doesn't support normal maps, even in current COLLADA 1.5.
+ if (t->mapto & MAP_NORM) {
+ COLLADASW::Texture texture(key);
+ texture.setTexcoord(uvname);
+ texture.setSampler(*sampler);
+ // technique FCOLLADA, with the <bump> tag, is most likely the best understood,
+ // most widespread de-facto standard.
+ texture.setProfileName("FCOLLADA");
+ texture.setChildElementName("bump");
+ ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
+ }
+ }
+ // performs the actual writing
+ ep.addProfileElements();
+ bool twoSided = false;
+ if (ob->type == OB_MESH && ob->data) {
+ Mesh *me = (Mesh*)ob->data;
+ if (me->flag & ME_TWOSIDED)
+ twoSided = true;
+ }
+ if (twoSided)
+ ep.addExtraTechniqueParameter("GOOGLEEARTH", "show_double_sided", 1);
+ ep.addExtraTechniques(mSW);
+
+ ep.closeProfile();
+ if (twoSided)
+ mSW->appendTextBlock("<extra><technique profile=\"MAX3D\"><double_sided>1</double_sided></technique></extra>");
+ closeEffect();
+}
+
+COLLADASW::ColorOrTexture EffectsExporter::createTexture(Image *ima,
+ std::string& uv_layer_name,
+ COLLADASW::Sampler *sampler
+ /*COLLADASW::Surface *surface*/)
+{
+
+ COLLADASW::Texture texture(translate_id(id_name(ima)));
+ texture.setTexcoord(uv_layer_name);
+ //texture.setSurface(*surface);
+ texture.setSampler(*sampler);
+
+ COLLADASW::ColorOrTexture cot(texture);
+ return cot;
+}
+
+COLLADASW::ColorOrTexture EffectsExporter::getcol(float r, float g, float b, float a)
+{
+ COLLADASW::Color color(r,g,b,a);
+ COLLADASW::ColorOrTexture cot(color);
+ return cot;
+}
+
+//returns the array of mtex indices which have image
+//need this for exporting textures
+void EffectsExporter::createTextureIndices(Material *ma, std::vector<int> &indices)
+{
+ indices.clear();
+
+ for (int a = 0; a < MAX_MTEX; a++) {
+ if (ma->mtex[a] &&
+ ma->mtex[a]->tex &&
+ ma->mtex[a]->tex->type == TEX_IMAGE &&
+ ma->mtex[a]->texco == TEXCO_UV){
+ indices.push_back(a);
+ }
+ }
+}
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
new file mode 100644
index 00000000000..3a3de95458b
--- /dev/null
+++ b/source/blender/collada/EffectExporter.h
@@ -0,0 +1,66 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file EffectExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __EFFECTEXPORTER_H__
+#define __EFFECTEXPORTER_H__
+
+#include <string>
+#include <vector>
+
+#include "COLLADASWColorOrTexture.h"
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWSampler.h"
+#include "COLLADASWLibraryEffects.h"
+
+#include "DNA_image_types.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+class EffectsExporter: COLLADASW::LibraryEffects
+{
+public:
+ EffectsExporter(COLLADASW::StreamWriter *sw);
+ void exportEffects(Scene *sce);
+
+ void operator()(Material *ma, Object *ob);
+
+ COLLADASW::ColorOrTexture createTexture(Image *ima,
+ std::string& uv_layer_name,
+ COLLADASW::Sampler *sampler
+ /*COLLADASW::Surface *surface*/);
+
+ COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a);
+
+ //returns the array of mtex indices which have image
+ //need this for exporting textures
+ void createTextureIndices(Material *ma, std::vector<int> &indices);
+};
+
+#endif
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
new file mode 100644
index 00000000000..a637bdc5155
--- /dev/null
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -0,0 +1,477 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADASWPrimitves.h"
+#include "COLLADASWSource.h"
+#include "COLLADASWVertices.h"
+#include "COLLADABUUtils.h"
+
+#include "GeometryExporter.h"
+
+#include "DNA_meshdata_types.h"
+#include "BKE_customdata.h"
+#include "BKE_material.h"
+
+#include "collada_internal.h"
+
+// TODO: optimize UV sets by making indexed list with duplicates removed
+GeometryExporter::GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
+
+
+void GeometryExporter::exportGeom(Scene *sce)
+{
+ openLibrary();
+
+ mScene = sce;
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<GeometryExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void GeometryExporter::operator()(Object *ob)
+{
+ // XXX don't use DerivedMesh, Mesh instead?
+
+#if 0
+ DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
+#endif
+ Mesh *me = (Mesh*)ob->data;
+ std::string geom_id = get_geometry_id(ob);
+ std::vector<Normal> nor;
+ std::vector<Face> norind;
+
+ // Skip if linked geometry was already exported from another reference
+ if (exportedGeometry.find(geom_id) != exportedGeometry.end())
+ return;
+ exportedGeometry.insert(geom_id);
+
+ bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
+
+ create_normals(nor, norind, me);
+
+ // openMesh(geoId, geoName, meshId)
+ openMesh(geom_id);
+
+ // writes <source> for vertex coords
+ createVertsSource(geom_id, me);
+
+ // writes <source> for normal coords
+ createNormalsSource(geom_id, me, nor);
+
+ bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
+
+ // writes <source> for uv coords if mesh has uv coords
+ if (has_uvs)
+ createTexcoordsSource(geom_id, me);
+
+ if (has_color)
+ createVertexColorSource(geom_id, me);
+
+ // <vertices>
+ COLLADASW::Vertices verts(mSW);
+ verts.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX));
+ COLLADASW::InputList &input_list = verts.getInputList();
+ COLLADASW::Input input(COLLADASW::InputSemantic::POSITION, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::POSITION));
+ input_list.push_back(input);
+ verts.add();
+
+ // XXX slow
+ if (ob->totcol) {
+ for(int a = 0; a < ob->totcol; a++) {
+ createPolylist(a, has_uvs, has_color, ob, geom_id, norind);
+ }
+ }
+ else {
+ createPolylist(0, has_uvs, has_color, ob, geom_id, norind);
+ }
+
+ closeMesh();
+ closeGeometry();
+
+#if 0
+ dm->release(dm);
+#endif
+}
+
+// powerful because it handles both cases when there is material and when there's not
+void GeometryExporter::createPolylist(int material_index,
+ bool has_uvs,
+ bool has_color,
+ Object *ob,
+ std::string& geom_id,
+ std::vector<Face>& norind)
+{
+ Mesh *me = (Mesh*)ob->data;
+ MFace *mfaces = me->mface;
+ int totfaces = me->totface;
+
+ // <vcount>
+ int i;
+ int faces_in_polylist = 0;
+ std::vector<unsigned long> vcount_list;
+
+ // count faces with this material
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ if (f->mat_nr == material_index) {
+ faces_in_polylist++;
+ if (f->v4 == 0) {
+ vcount_list.push_back(3);
+ }
+ else {
+ vcount_list.push_back(4);
+ }
+ }
+ }
+
+ // no faces using this material
+ if (faces_in_polylist == 0) {
+ fprintf(stderr, "%s: no faces use material %d\n", id_name(ob).c_str(), material_index);
+ return;
+ }
+
+ Material *ma = ob->totcol ? give_current_material(ob, material_index + 1) : NULL;
+ COLLADASW::Polylist polylist(mSW);
+
+ // sets count attribute in <polylist>
+ polylist.setCount(faces_in_polylist);
+
+ // sets material name
+ if (ma) {
+ polylist.setMaterial(translate_id(id_name(ma)));
+ }
+
+ COLLADASW::InputList &til = polylist.getInputList();
+
+ // creates <input> in <polylist> for vertices
+ COLLADASW::Input input1(COLLADASW::InputSemantic::VERTEX, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::VERTEX), 0);
+
+ // creates <input> in <polylist> for normals
+ COLLADASW::Input input2(COLLADASW::InputSemantic::NORMAL, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL), 1);
+
+ til.push_back(input1);
+ til.push_back(input2);
+
+ // if mesh has uv coords writes <input> for TEXCOORD
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ for (i = 0; i < num_layers; i++) {
+ // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
+ COLLADASW::Input input3(COLLADASW::InputSemantic::TEXCOORD,
+ makeUrl(makeTexcoordSourceId(geom_id, i)),
+ 2, // offset always 2, this is only until we have optimized UV sets
+ i // set number equals UV layer index
+ );
+ til.push_back(input3);
+ }
+
+ if (has_color) {
+ COLLADASW::Input input4(COLLADASW::InputSemantic::COLOR, getUrlBySemantics(geom_id, COLLADASW::InputSemantic::COLOR), has_uvs ? 3 : 2);
+ til.push_back(input4);
+ }
+
+ // sets <vcount>
+ polylist.setVCountList(vcount_list);
+
+ // performs the actual writing
+ polylist.prepareToAppendValues();
+
+ // <p>
+ int texindex = 0;
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ if (f->mat_nr == material_index) {
+
+ unsigned int *v = &f->v1;
+ unsigned int *n = &norind[i].v1;
+ for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
+ polylist.appendValues(v[j]);
+ polylist.appendValues(n[j]);
+
+ if (has_uvs)
+ polylist.appendValues(texindex + j);
+
+ if (has_color)
+ polylist.appendValues(texindex + j);
+ }
+ }
+
+ texindex += 3;
+ if (f->v4 != 0)
+ texindex++;
+ }
+
+ polylist.finish();
+}
+
+// creates <source> for positions
+void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
+{
+#if 0
+ int totverts = dm->getNumVerts(dm);
+ MVert *verts = dm->getVertArray(dm);
+#endif
+ int totverts = me->totvert;
+ MVert *verts = me->mvert;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::POSITION) +
+ ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totverts);
+ source.setAccessorStride(3);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+ /*main function, it creates <source id = "">, <float_array id = ""
+ count = ""> */
+ source.prepareToAppendValues();
+ //appends data to <float_array>
+ int i = 0;
+ for (i = 0; i < totverts; i++) {
+ source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+ }
+
+ source.finish();
+
+}
+
+void GeometryExporter::createVertexColorSource(std::string geom_id, Mesh *me)
+{
+ if (!CustomData_has_layer(&me->fdata, CD_MCOL))
+ return;
+
+ MFace *f;
+ int totcolor = 0, i, j;
+
+ for (i = 0, f = me->mface; i < me->totface; i++, f++)
+ totcolor += f->v4 ? 4 : 3;
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::COLOR));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::COLOR) + ARRAY_ID_SUFFIX);
+ source.setAccessorCount(totcolor);
+ source.setAccessorStride(3);
+
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("R");
+ param.push_back("G");
+ param.push_back("B");
+
+ source.prepareToAppendValues();
+
+ int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
+
+ MCol *mcol = (MCol*)me->fdata.layers[index].data;
+ MCol *c = mcol;
+
+ for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++)
+ for (j = 0; j < (f->v4 ? 4 : 3); j++)
+ source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f);
+
+ source.finish();
+}
+
+std::string GeometryExporter::makeTexcoordSourceId(std::string& geom_id, int layer_index)
+{
+ char suffix[20];
+ sprintf(suffix, "-%d", layer_index);
+ return getIdBySemantics(geom_id, COLLADASW::InputSemantic::TEXCOORD) + suffix;
+}
+
+//creates <source> for texcoords
+void GeometryExporter::createTexcoordsSource(std::string geom_id, Mesh *me)
+{
+#if 0
+ int totfaces = dm->getNumFaces(dm);
+ MFace *mfaces = dm->getFaceArray(dm);
+#endif
+ int totfaces = me->totface;
+ MFace *mfaces = me->mface;
+
+ int totuv = 0;
+ int i;
+
+ // count totuv
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+ if (f->v4 == 0) {
+ totuv+=3;
+ }
+ else {
+ totuv+=4;
+ }
+ }
+
+ int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ // write <source> for each layer
+ // each <source> will get id like meshName + "map-channel-1"
+ for (int a = 0; a < num_layers; a++) {
+ MTFace *tface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, a);
+ // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, a);
+
+ COLLADASW::FloatSourceF source(mSW);
+ std::string layer_id = makeTexcoordSourceId(geom_id, a);
+ source.setId(layer_id);
+ source.setArrayId(layer_id + ARRAY_ID_SUFFIX);
+
+ source.setAccessorCount(totuv);
+ source.setAccessorStride(2);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("S");
+ param.push_back("T");
+
+ source.prepareToAppendValues();
+
+ for (i = 0; i < totfaces; i++) {
+ MFace *f = &mfaces[i];
+
+ for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
+ source.appendValues(tface[i].uv[j][0],
+ tface[i].uv[j][1]);
+ }
+ }
+
+ source.finish();
+ }
+}
+
+
+//creates <source> for normals
+void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor)
+{
+#if 0
+ int totverts = dm->getNumVerts(dm);
+ MVert *verts = dm->getVertArray(dm);
+#endif
+
+ COLLADASW::FloatSourceF source(mSW);
+ source.setId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL));
+ source.setArrayId(getIdBySemantics(geom_id, COLLADASW::InputSemantic::NORMAL) +
+ ARRAY_ID_SUFFIX);
+ source.setAccessorCount((unsigned long)nor.size());
+ source.setAccessorStride(3);
+ COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
+ param.push_back("X");
+ param.push_back("Y");
+ param.push_back("Z");
+
+ source.prepareToAppendValues();
+
+ std::vector<Normal>::iterator it;
+ for (it = nor.begin(); it != nor.end(); it++) {
+ Normal& n = *it;
+ source.appendValues(n.x, n.y, n.z);
+ }
+
+ source.finish();
+}
+
+void GeometryExporter::create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me)
+{
+ int i, j, v;
+ MVert *vert = me->mvert;
+ std::map<unsigned int, unsigned int> nshar;
+
+ for (i = 0; i < me->totface; i++) {
+ MFace *fa = &me->mface[i];
+ Face f;
+ unsigned int *nn = &f.v1;
+ unsigned int *vv = &fa->v1;
+
+ memset(&f, 0, sizeof(f));
+ v = fa->v4 == 0 ? 3 : 4;
+
+ if (!(fa->flag & ME_SMOOTH)) {
+ Normal n;
+ if (v == 4)
+ normal_quad_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co, vert[fa->v4].co);
+ else
+ normal_tri_v3(&n.x, vert[fa->v1].co, vert[fa->v2].co, vert[fa->v3].co);
+ nor.push_back(n);
+ }
+
+ for (j = 0; j < v; j++) {
+ if (fa->flag & ME_SMOOTH) {
+ if (nshar.find(*vv) != nshar.end())
+ *nn = nshar[*vv];
+ else {
+ Normal n = {
+ vert[*vv].no[0]/32767.0,
+ vert[*vv].no[1]/32767.0,
+ vert[*vv].no[2]/32767.0
+ };
+ nor.push_back(n);
+ *nn = (unsigned int)nor.size() - 1;
+ nshar[*vv] = *nn;
+ }
+ vv++;
+ }
+ else {
+ *nn = (unsigned int)nor.size() - 1;
+ }
+ nn++;
+ }
+
+ ind.push_back(f);
+ }
+}
+
+std::string GeometryExporter::getIdBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix) {
+ return geom_id + getSuffixBySemantic(type) + other_suffix;
+}
+
+
+COLLADASW::URI GeometryExporter::getUrlBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix) {
+
+ std::string id(getIdBySemantics(geom_id, type, other_suffix));
+ return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
+
+}
+
+COLLADASW::URI GeometryExporter::makeUrl(std::string id)
+{
+ return COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, id);
+}
+
+
+/* int GeometryExporter::getTriCount(MFace *faces, int totface) {
+ int i;
+ int tris = 0;
+ for (i = 0; i < totface; i++) {
+ // if quad
+ if (faces[i].v4 != 0)
+ tris += 2;
+ else
+ tris++;
+ }
+
+ return tris;
+ }*/
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
new file mode 100644
index 00000000000..0b9abaebc25
--- /dev/null
+++ b/source/blender/collada/GeometryExporter.h
@@ -0,0 +1,121 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file GeometryExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __GEOMETRYEXPORTER_H__
+#define __GEOMETRYEXPORTER_H__
+
+#include <string>
+#include <vector>
+#include <set>
+
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryGeometries.h"
+#include "COLLADASWInputList.h"
+
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+// TODO: optimize UV sets by making indexed list with duplicates removed
+class GeometryExporter : COLLADASW::LibraryGeometries
+{
+ struct Face
+ {
+ unsigned int v1, v2, v3, v4;
+ };
+
+ struct Normal
+ {
+ float x, y, z;
+ };
+
+ Scene *mScene;
+
+public:
+ GeometryExporter(COLLADASW::StreamWriter *sw);
+
+ void exportGeom(Scene *sce);
+
+ void operator()(Object *ob);
+
+ // powerful because it handles both cases when there is material and when there's not
+ void createPolylist(int material_index,
+ bool has_uvs,
+ bool has_color,
+ Object *ob,
+ std::string& geom_id,
+ std::vector<Face>& norind);
+
+ // creates <source> for positions
+ void createVertsSource(std::string geom_id, Mesh *me);
+
+ void createVertexColorSource(std::string geom_id, Mesh *me);
+
+ std::string makeTexcoordSourceId(std::string& geom_id, int layer_index);
+
+ //creates <source> for texcoords
+ void createTexcoordsSource(std::string geom_id, Mesh *me);
+
+ //creates <source> for normals
+ void createNormalsSource(std::string geom_id, Mesh *me, std::vector<Normal>& nor);
+
+ void create_normals(std::vector<Normal> &nor, std::vector<Face> &ind, Mesh *me);
+
+ std::string getIdBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix = "");
+
+ COLLADASW::URI getUrlBySemantics(std::string geom_id, COLLADASW::InputSemantic::Semantics type, std::string other_suffix = "");
+
+ COLLADASW::URI makeUrl(std::string id);
+
+ /* int getTriCount(MFace *faces, int totface);*/
+private:
+ std::set<std::string> exportedGeometry;
+};
+
+struct GeometryFunctor {
+ // f should have
+ // void operator()(Object* ob)
+ template<class Functor>
+ void forEachMeshObjectInScene(Scene *sce, Functor &f)
+ {
+
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_MESH && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+
+ }
+ }
+};
+
+#endif
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
new file mode 100644
index 00000000000..e87f6208d59
--- /dev/null
+++ b/source/blender/collada/ImageExporter.cpp
@@ -0,0 +1,94 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADABUURI.h"
+#include "COLLADASWImage.h"
+
+#include "ImageExporter.h"
+#include "MaterialExporter.h"
+
+#include "DNA_texture_types.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_utildefines.h"
+#include "BLI_fileops.h"
+#include "BLI_path_util.h"
+#include "BLI_string.h"
+
+ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
+{}
+
+void ImagesExporter::exportImages(Scene *sce)
+{
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<ImagesExporter>(sce, *this);
+
+ closeLibrary();
+}
+
+void ImagesExporter::operator()(Material *ma, Object *ob)
+{
+ int a;
+ for (a = 0; a < MAX_MTEX; a++) {
+ MTex *mtex = ma->mtex[a];
+ if (mtex && mtex->tex && mtex->tex->ima) {
+
+ Image *image = mtex->tex->ima;
+ std::string name(id_name(image));
+ name = translate_id(name);
+ char rel[FILE_MAX];
+ char abs[FILE_MAX];
+ char src[FILE_MAX];
+ char dir[FILE_MAX];
+
+ BLI_split_dirfile(mfilename, dir, NULL);
+
+ BKE_rebase_path(abs, sizeof(abs), rel, sizeof(rel), G.main->name, image->name, dir);
+
+ if (abs[0] != '\0') {
+
+ // make absolute source path
+ BLI_strncpy(src, image->name, sizeof(src));
+ BLI_path_abs(src, G.main->name);
+
+ // make dest directory if it doesn't exist
+ BLI_make_existing_file(abs);
+
+ if (BLI_copy_fileops(src, abs) != 0) {
+ fprintf(stderr, "Cannot copy image to file's directory. \n");
+ }
+ }
+
+ if (find(mImages.begin(), mImages.end(), name) == mImages.end()) {
+ COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name, name); /* set name also to mNameNC. This helps other viewers import files exported from Blender better */
+ img.add(mSW);
+
+ mImages.push_back(name);
+ }
+ }
+ }
+}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.h b/source/blender/collada/ImageExporter.h
index 963c8f20435..901e6be3ecb 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.h
+++ b/source/blender/collada/ImageExporter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,42 +17,38 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPU_CANVAS_H
-#define __GPU_CANVAS_H
+/** \file ImageExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __IMAGEEXPORTER_H__
+#define __IMAGEEXPORTER_H__
+
+#include <vector>
+#include <string>
-#include <iostream>
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryImages.h"
-#include "KXH_ketsji_hooks.h"
-#include "GPC_Canvas.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
-class GPU_Canvas : public GPC_Canvas
+class ImagesExporter: COLLADASW::LibraryImages
{
-private:
-
- /** Handle to the drawing resource. */
- KXH_plugin_handle m_plugin;
-
+ const char *mfilename;
+ std::vector<std::string> mImages; // contains list of written images, to avoid duplicates
public:
- GPU_Canvas(KXH_plugin_handle display, int width, int height);
- virtual ~GPU_Canvas();
+ ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename);
- virtual void Init(void);
-
- bool BeginDraw(void);
- void EndDraw(void);
- virtual void SwapBuffers(void);
-
+ void exportImages(Scene *sce);
+ void operator()(Material *ma, Object *ob);
};
-#endif // __GPU_CANVAS_H
-
+#endif
diff --git a/source/blender/collada/InstanceWriter.cpp b/source/blender/collada/InstanceWriter.cpp
new file mode 100644
index 00000000000..a135b51f025
--- /dev/null
+++ b/source/blender/collada/InstanceWriter.cpp
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWInstanceMaterial.h"
+
+#include "BKE_customdata.h"
+#include "BKE_material.h"
+
+#include "DNA_mesh_types.h"
+
+#include "InstanceWriter.h"
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+
+void InstanceWriter::add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob)
+{
+ for(int a = 0; a < ob->totcol; a++) {
+ Material *ma = give_current_material(ob, a+1);
+
+ COLLADASW::InstanceMaterialList& iml = bind_material.getInstanceMaterialList();
+
+ if (ma) {
+ std::string matid(id_name(ma));
+ matid = translate_id(matid);
+ COLLADASW::InstanceMaterial im(matid, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+
+ // create <bind_vertex_input> for each uv layer
+ Mesh *me = (Mesh*)ob->data;
+ int totlayer = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+
+ for (int b = 0; b < totlayer; b++) {
+ char *name = bc_CustomData_get_layer_name(&me->fdata, CD_MTFACE, b);
+ im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", b));
+ }
+
+ iml.push_back(im);
+ }
+ }
+}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Engine.h b/source/blender/collada/InstanceWriter.h
index 8d237073fb0..03be8d2426c 100644
--- a/source/gameengine/GamePlayer/common/windows/GPW_Engine.h
+++ b/source/blender/collada/InstanceWriter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,29 +17,27 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __GPW_ENGINE_H
-#define __GPW_ENGINE_H
+/** \file InstanceWriter.h
+ * \ingroup collada
+ */
+
+#ifndef __INSTANCEWRITER_H__
+#define __INSTANCEWRITER_H__
+
+#include "COLLADASWBindMaterial.h"
-#include "GPC_Engine.h"
+#include "DNA_object_types.h"
-class GPW_Engine : public GPC_Engine
+class InstanceWriter
{
-public:
- GPW_Engine(char *customLoadingAnimation,
- int foregroundColor, int backgroundColor, int frameRate);
- virtual ~GPW_Engine();
- bool Initialize(HDC hdc, int width, int height);
+protected:
+ void add_material_bindings(COLLADASW::BindMaterial& bind_material, Object *ob);
};
-#endif // __GPW_ENGINE_H
-
+#endif
diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp
new file mode 100644
index 00000000000..d13a053b8fe
--- /dev/null
+++ b/source/blender/collada/LightExporter.cpp
@@ -0,0 +1,139 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string>
+
+#include "COLLADASWColor.h"
+#include "COLLADASWLight.h"
+
+#include "DNA_lamp_types.h"
+
+#include "BLI_math.h"
+
+#include "LightExporter.h"
+#include "collada_internal.h"
+
+template<class Functor>
+void forEachLampObjectInScene(Scene *sce, Functor &f)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == OB_LAMP && ob->data) {
+ f(ob);
+ }
+ base= base->next;
+ }
+}
+
+LightsExporter::LightsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryLights(sw){}
+
+void LightsExporter::exportLights(Scene *sce)
+{
+ openLibrary();
+
+ forEachLampObjectInScene(sce, *this);
+
+ closeLibrary();
+}
+void LightsExporter::operator()(Object *ob)
+{
+ Lamp *la = (Lamp*)ob->data;
+ std::string la_id(get_light_id(ob));
+ std::string la_name(id_name(la));
+ COLLADASW::Color col(la->r, la->g, la->b);
+ float att1, att2;
+ float e, d, constatt, linatt, quadatt;
+ att1 = att2 = 0.0f;
+
+ if(la->falloff_type==LA_FALLOFF_INVLINEAR) {
+ att1 = 1.0f;
+ att2 = 0.0f;
+ }
+ else if(la->falloff_type==LA_FALLOFF_INVSQUARE) {
+ att1 = 0.0f;
+ att2 = 1.0f;
+ }
+ else if(la->falloff_type==LA_FALLOFF_SLIDERS) {
+ att1 = la->att1;
+ att2 = la->att2;
+ }
+
+ e = la->energy;
+ d = la->dist;
+
+ constatt = linatt = quadatt = MAXFLOAT;
+ if(e > 0.0f) {
+ constatt = 1.0f/e;
+ linatt = att1/(d*e);
+ quadatt = att2/(d*d*(e*2));
+ }
+
+ // sun
+ if (la->type == LA_SUN) {
+ COLLADASW::DirectionalLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ addLight(cla);
+ }
+ // hemi
+ else if (la->type == LA_HEMI) {
+ COLLADASW::AmbientLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ addLight(cla);
+ }
+ // spot
+ else if (la->type == LA_SPOT) {
+ COLLADASW::SpotLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setFallOffAngle(la->spotsize);
+ cla.setFallOffExponent(la->spotblend);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+ // lamp
+ else if (la->type == LA_LOCAL) {
+ COLLADASW::PointLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+ // area lamp is not supported
+ // it will be exported as a local lamp
+ else {
+ COLLADASW::PointLight cla(mSW, la_id, la_name, e);
+ cla.setColor(col);
+ cla.setConstantAttenuation(constatt);
+ cla.setLinearAttenuation(linatt);
+ cla.setQuadraticAttenuation(quadatt);
+ addLight(cla);
+ }
+}
diff --git a/source/blender/verify/BLO_signer_info.h b/source/blender/collada/LightExporter.h
index 39059cf94a7..685a50ff17e 100644
--- a/source/blender/verify/BLO_signer_info.h
+++ b/source/blender/collada/LightExporter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,29 +17,31 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
- *
*/
-#include "BLO_sign_verify_Header.h"
+/** \file LightExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __LIGHTEXPORTER_H__
+#define __LIGHTEXPORTER_H__
-/* external struct for signer info */
+#include "COLLADASWStreamWriter.h"
+#include "COLLADASWLibraryLights.h"
-struct BLO_SignerInfo {
- char name[MAXSIGNERLEN];
- char email[MAXSIGNERLEN];
- char homeUrl[MAXSIGNERLEN];
- /* more to come... */
-};
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
-struct BLO_SignerInfo *BLO_getSignerInfo(void);
-int BLO_isValidSignerInfo(struct BLO_SignerInfo *info);
-void BLO_clrSignerInfo(struct BLO_SignerInfo *info);
+class LightsExporter: COLLADASW::LibraryLights
+{
+public:
+ LightsExporter(COLLADASW::StreamWriter *sw);
+ void exportLights(Scene *sce);
+ void operator()(Object *ob);
+};
+#endif
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp b/source/blender/collada/MaterialExporter.cpp
index bb7b55fbcf1..a0d66e6467d 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_Canvas.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,52 +17,37 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
*/
-
-//#include <iostream>
-#include "GPU_Canvas.h"
-GPU_Canvas::GPU_Canvas(KXH_plugin_handle p, int width, int height)
- : GPC_Canvas(width, height), m_plugin(p)
-{
- /* intentionally empty */
-}
+#include "MaterialExporter.h"
+#include "COLLADABUUtils.h"
+#include "collada_internal.h"
-GPU_Canvas::~GPU_Canvas(void)
-{
- /* intentionally empty */
-}
+MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
-void GPU_Canvas::Init(void)
+void MaterialsExporter::exportMaterials(Scene *sce)
{
- /* intentionally empty */
-}
+ openLibrary();
-void GPU_Canvas::SwapBuffers(void)
-{
- if (m_plugin) KXH_swap_buffers(m_plugin);
-}
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<MaterialsExporter>(sce, *this);
-bool
-GPU_Canvas::BeginDraw(void)
-{
- if (m_plugin) {
- return KXH_begin_draw(m_plugin);
- } else {
- return false;
- }
+ closeLibrary();
}
-void GPU_Canvas::EndDraw(void)
+void MaterialsExporter::operator()(Material *ma, Object *ob)
{
- if (m_plugin) KXH_end_draw(m_plugin);
+ std::string name(id_name(ma));
+
+ openMaterial(translate_id(name), name);
+
+ std::string efid = translate_id(name) + "-effect";
+ addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
+
+ closeMaterial();
}
diff --git a/source/blender/collada/MaterialExporter.h b/source/blender/collada/MaterialExporter.h
new file mode 100644
index 00000000000..033c8526346
--- /dev/null
+++ b/source/blender/collada/MaterialExporter.h
@@ -0,0 +1,98 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file MaterialExporter.h
+ * \ingroup collada
+ */
+
+#ifndef __MATERIALEXPORTER_H__
+#define __MATERIALEXPORTER_H__
+
+#include <string>
+#include <vector>
+
+#include "COLLADASWLibraryMaterials.h"
+#include "COLLADASWStreamWriter.h"
+
+#include "BKE_material.h"
+
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "GeometryExporter.h"
+#include "collada_internal.h"
+
+class MaterialsExporter: COLLADASW::LibraryMaterials
+{
+public:
+ MaterialsExporter(COLLADASW::StreamWriter *sw);
+ void exportMaterials(Scene *sce);
+ void operator()(Material *ma, Object *ob);
+};
+
+// used in forEachMaterialInScene
+template <class Functor>
+class ForEachMaterialFunctor
+{
+ std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
+ Functor *f;
+public:
+ ForEachMaterialFunctor(Functor*f) : f(f) {}
+
+ void operator ()(Object *ob)
+ {
+ int a;
+ for(a = 0; a < ob->totcol; a++) {
+
+ Material *ma = give_current_material(ob, a+1);
+
+ if (!ma) continue;
+
+ std::string translated_id = translate_id(id_name(ma));
+ if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
+ (*this->f)(ma, ob);
+
+ mMat.push_back(translated_id);
+ }
+ }
+ }
+};
+
+struct MaterialFunctor {
+ // calls f for each unique material linked to each object in sce
+ // f should have
+ // void operator()(Material* ma)
+ template<class Functor>
+ void forEachMaterialInScene(Scene *sce, Functor &f)
+ {
+ ForEachMaterialFunctor<Functor> matfunc(&f);
+ GeometryFunctor gf;
+ gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc);
+ }
+};
+
+
+#endif
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
new file mode 100644
index 00000000000..d458b47885f
--- /dev/null
+++ b/source/blender/collada/MeshImporter.cpp
@@ -0,0 +1,915 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <algorithm>
+
+#if !defined(WIN32) || defined(FREE_WINDOWS)
+#include <iostream>
+#endif
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWMeshVertexData.h"
+#include "COLLADAFWPolygons.h"
+
+extern "C" {
+#include "BKE_blender.h"
+#include "BKE_customdata.h"
+#include "BKE_displist.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_material.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+#include "BLI_string.h"
+
+#include "MEM_guardedalloc.h"
+}
+
+#include "ArmatureImporter.h"
+#include "MeshImporter.h"
+#include "collada_utils.h"
+
+// works for COLLADAFW::Node, COLLADAFW::Geometry
+template<class T>
+static const char *bc_get_dae_name(T *node)
+{
+ const std::string& name = node->getName();
+ return name.size() ? name.c_str() : node->getOriginalId().c_str();
+}
+
+static const char *bc_primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
+{
+ switch (type) {
+ case COLLADAFW::MeshPrimitive::LINES:
+ return "LINES";
+ case COLLADAFW::MeshPrimitive::LINE_STRIPS:
+ return "LINESTRIPS";
+ case COLLADAFW::MeshPrimitive::POLYGONS:
+ return "POLYGONS";
+ case COLLADAFW::MeshPrimitive::POLYLIST:
+ return "POLYLIST";
+ case COLLADAFW::MeshPrimitive::TRIANGLES:
+ return "TRIANGLES";
+ case COLLADAFW::MeshPrimitive::TRIANGLE_FANS:
+ return "TRIANGLE_FANS";
+ case COLLADAFW::MeshPrimitive::TRIANGLE_STRIPS:
+ return "TRIANGLE_FANS";
+ case COLLADAFW::MeshPrimitive::POINTS:
+ return "POINTS";
+ case COLLADAFW::MeshPrimitive::UNDEFINED_PRIMITIVE_TYPE:
+ return "UNDEFINED_PRIMITIVE_TYPE";
+ }
+ return "UNKNOWN";
+}
+
+static const char *bc_geomTypeToStr(COLLADAFW::Geometry::GeometryType type)
+{
+ switch (type) {
+ case COLLADAFW::Geometry::GEO_TYPE_MESH:
+ return "MESH";
+ case COLLADAFW::Geometry::GEO_TYPE_SPLINE:
+ return "SPLINE";
+ case COLLADAFW::Geometry::GEO_TYPE_CONVEX_MESH:
+ return "CONVEX_MESH";
+ case COLLADAFW::Geometry::GEO_TYPE_UNKNOWN:
+ default:
+ return "UNKNOWN";
+ }
+}
+
+
+UVDataWrapper::UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
+{}
+
+#ifdef COLLADA_DEBUG
+void WVDataWrapper::print()
+{
+ fprintf(stderr, "UVs:\n");
+ switch(mVData->getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+ if (values->getCount()) {
+ for (int i = 0; i < values->getCount(); i += 2) {
+ fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i+1]);
+ }
+ }
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
+ if (values->getCount()) {
+ for (int i = 0; i < values->getCount(); i += 2) {
+ fprintf(stderr, "%.1f, %.1f\n", (float)(*values)[i], (float)(*values)[i+1]);
+ }
+ }
+ }
+ break;
+ }
+ fprintf(stderr, "\n");
+}
+#endif
+
+void UVDataWrapper::getUV(int uv_index[2], float *uv)
+{
+ switch(mVData->getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+ if (values->empty()) return;
+ uv[0] = (*values)[uv_index[0]];
+ uv[1] = (*values)[uv_index[1]];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
+ if (values->empty()) return;
+ uv[0] = (float)(*values)[uv_index[0]];
+ uv[1] = (float)(*values)[uv_index[1]];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
+ default:
+ fprintf(stderr, "MeshImporter.getUV(): unknown data type\n");
+ }
+}
+
+void MeshImporter::set_face_indices(MFace *mface, unsigned int *indices, bool quad)
+{
+ mface->v1 = indices[0];
+ mface->v2 = indices[1];
+ mface->v3 = indices[2];
+ if (quad) mface->v4 = indices[3];
+ else mface->v4 = 0;
+#ifdef COLLADA_DEBUG
+ // fprintf(stderr, "%u, %u, %u \n", indices[0], indices[1], indices[2]);
+#endif
+}
+
+// not used anymore, test_index_face from blenkernel is better
+#if 0
+// change face indices order so that v4 is not 0
+void MeshImporter::rotate_face_indices(MFace *mface) {
+ mface->v4 = mface->v1;
+ mface->v1 = mface->v2;
+ mface->v2 = mface->v3;
+ mface->v3 = 0;
+}
+#endif
+
+void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
+{
+ int uv_indices[4][2];
+
+ // per face vertex indices, this means for quad we have 4 indices, not 8
+ COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
+
+ // make indices into FloatOrDoubleArray
+ for (int i = 0; i < 3; i++) {
+ int uv_index = indices[tris_indices[i]];
+ uv_indices[i][0] = uv_index * 2;
+ uv_indices[i][1] = uv_index * 2 + 1;
+ }
+
+ uvs.getUV(uv_indices[0], mtface->uv[0]);
+ uvs.getUV(uv_indices[1], mtface->uv[1]);
+ uvs.getUV(uv_indices[2], mtface->uv[2]);
+}
+
+void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, int index, bool quad)
+{
+ int uv_indices[4][2];
+
+ // per face vertex indices, this means for quad we have 4 indices, not 8
+ COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
+
+ // make indices into FloatOrDoubleArray
+ for (int i = 0; i < (quad ? 4 : 3); i++) {
+ int uv_index = indices[index + i];
+ uv_indices[i][0] = uv_index * 2;
+ uv_indices[i][1] = uv_index * 2 + 1;
+ }
+
+ uvs.getUV(uv_indices[0], mtface->uv[0]);
+ uvs.getUV(uv_indices[1], mtface->uv[1]);
+ uvs.getUV(uv_indices[2], mtface->uv[2]);
+
+ if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
+
+#ifdef COLLADA_DEBUG
+ /*if (quad) {
+ fprintf(stderr, "face uv:\n"
+ "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
+ "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+ uv_indices[0][0], uv_indices[0][1],
+ uv_indices[1][0], uv_indices[1][1],
+ uv_indices[2][0], uv_indices[2][1],
+ uv_indices[3][0], uv_indices[3][1],
+
+ mtface->uv[0][0], mtface->uv[0][1],
+ mtface->uv[1][0], mtface->uv[1][1],
+ mtface->uv[2][0], mtface->uv[2][1],
+ mtface->uv[3][0], mtface->uv[3][1]);
+ }
+ else {
+ fprintf(stderr, "face uv:\n"
+ "((%d, %d), (%d, %d), (%d, %d))\n"
+ "((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+ uv_indices[0][0], uv_indices[0][1],
+ uv_indices[1][0], uv_indices[1][1],
+ uv_indices[2][0], uv_indices[2][1],
+
+ mtface->uv[0][0], mtface->uv[0][1],
+ mtface->uv[1][0], mtface->uv[1][1],
+ mtface->uv[2][0], mtface->uv[2][1]);
+ }*/
+#endif
+}
+
+#ifdef COLLADA_DEBUG
+void MeshImporter::print_index_list(COLLADAFW::IndexList& index_list)
+{
+ fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str());
+ for (int i = 0; i < index_list.getIndicesCount(); i += 2) {
+ fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1));
+ }
+ fprintf(stderr, "\n");
+}
+#endif
+
+bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
+{
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+
+ const char *name = bc_get_dae_name(mesh);
+
+ for (unsigned i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+ COLLADAFW::MeshPrimitive::PrimitiveType type = mp->getPrimitiveType();
+
+ const char *type_str = bc_primTypeToStr(type);
+
+ // OpenCollada passes POLYGONS type for <polylist>
+ if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
+
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
+
+ for(unsigned int j = 0; j < vca.getCount(); j++){
+ int count = vca[j];
+ if (count < 3) {
+ fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n",
+ type_str, name);
+ return false;
+ }
+ }
+
+ }
+ else if(type != COLLADAFW::MeshPrimitive::TRIANGLES) {
+ fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
+ return false;
+ }
+ }
+
+ if (mesh->getPositions().empty()) {
+ fprintf(stderr, "Mesh %s has no vertices.\n", name);
+ return false;
+ }
+
+ return true;
+}
+
+void MeshImporter::read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
+{
+ // vertices
+ COLLADAFW::MeshVertexData& pos = mesh->getPositions();
+ int stride = pos.getStride(0);
+ if(stride==0) stride = 3;
+
+ me->totvert = mesh->getPositions().getFloatValues()->getCount() / stride;
+ me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
+
+ MVert *mvert;
+ int i;
+
+ for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) {
+ get_vector(mvert->co, pos, i, stride);
+ }
+}
+
+int MeshImporter::triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri)
+{
+ ListBase dispbase;
+ DispList *dl;
+ float *vert;
+ int i = 0;
+
+ dispbase.first = dispbase.last = NULL;
+
+ dl = (DispList*)MEM_callocN(sizeof(DispList), "poly disp");
+ dl->nr = totvert;
+ dl->type = DL_POLY;
+ dl->parts = 1;
+ dl->verts = vert = (float*)MEM_callocN(totvert * 3 * sizeof(float), "poly verts");
+ dl->index = (int*)MEM_callocN(sizeof(int) * 3 * totvert, "dl index");
+
+ BLI_addtail(&dispbase, dl);
+
+ for (i = 0; i < totvert; i++) {
+ copy_v3_v3(vert, verts[indices[i]].co);
+ vert += 3;
+ }
+
+ filldisplist(&dispbase, &dispbase, 0);
+
+ int tottri = 0;
+ dl= (DispList*)dispbase.first;
+
+ if (dl->type == DL_INDEX3) {
+ tottri = dl->parts;
+
+ int *index = dl->index;
+ for (i= 0; i < tottri; i++) {
+ int t[3]= {*index, *(index + 1), *(index + 2)};
+
+ std::sort(t, t + 3);
+
+ tri.push_back(t[0]);
+ tri.push_back(t[1]);
+ tri.push_back(t[2]);
+
+ index += 3;
+ }
+ }
+
+ freedisplist(&dispbase);
+
+ return tottri;
+}
+
+int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
+{
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+ unsigned int i;
+ int tottri = 0;
+
+ for (i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+ int type = mp->getPrimitiveType();
+ size_t prim_totface = mp->getFaceCount();
+ unsigned int *indices = mp->getPositionIndices().getData();
+
+ if (type == COLLADAFW::MeshPrimitive::POLYLIST ||
+ type == COLLADAFW::MeshPrimitive::POLYGONS) {
+
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
+
+ for (unsigned int j = 0; j < prim_totface; j++) {
+ int vcount = vcounta[j];
+
+ if (vcount > 4) {
+ std::vector<unsigned int> tri;
+
+ // tottri += triangulate_poly(indices, vcount, me->mvert, tri) - 1; // XXX why - 1?!
+ tottri += triangulate_poly(indices, vcount, me->mvert, tri);
+ }
+
+ indices += vcount;
+ }
+ }
+ }
+ return tottri;
+}
+
+// TODO: import uv set names
+void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
+{
+ unsigned int i;
+
+ // allocate faces
+ me->totface = mesh->getFacesCount() + new_tris;
+ me->mface = (MFace*)CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface);
+
+ // allocate UV layers
+ unsigned int totuvset = mesh->getUVCoords().getInputInfosArray().getCount();
+
+ for (i = 0; i < totuvset; i++) {
+ if (mesh->getUVCoords().getLength(i) == 0) {
+ totuvset = 0;
+ break;
+ }
+ }
+
+ for (i = 0; i < totuvset; i++) {
+ COLLADAFW::MeshVertexData::InputInfos *info = mesh->getUVCoords().getInputInfosArray()[i];
+ CustomData_add_layer_named(&me->fdata, CD_MTFACE, CD_CALLOC, NULL, me->totface, info->mName.c_str());
+ //this->set_layername_map[i] = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
+ }
+
+ // activate the first uv layer
+ if (totuvset) me->mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
+
+ UVDataWrapper uvs(mesh->getUVCoords());
+
+#ifdef COLLADA_DEBUG
+ // uvs.print();
+#endif
+
+ MFace *mface = me->mface;
+
+ MaterialIdPrimitiveArrayMap mat_prim_map;
+
+ int face_index = 0;
+
+ COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
+
+ bool has_normals = mesh->hasNormals();
+ COLLADAFW::MeshVertexData& nor = mesh->getNormals();
+
+ for (i = 0; i < prim_arr.getCount(); i++) {
+
+ COLLADAFW::MeshPrimitive *mp = prim_arr[i];
+
+ // faces
+ size_t prim_totface = mp->getFaceCount();
+ unsigned int *indices = mp->getPositionIndices().getData();
+ unsigned int *nind = mp->getNormalIndices().getData();
+ unsigned int j, k;
+ int type = mp->getPrimitiveType();
+ int index = 0;
+
+ // since we cannot set mface->mat_nr here, we store a portion of me->mface in Primitive
+ Primitive prim = {mface, 0};
+ COLLADAFW::IndexListArray& index_list_array = mp->getUVCoordIndicesArray();
+
+#ifdef COLLADA_DEBUG
+ /*
+ fprintf(stderr, "Primitive %d:\n", i);
+ for (int j = 0; j < totuvset; j++) {
+ print_index_list(*index_list_array[j]);
+ }
+ */
+#endif
+
+ if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
+ for (j = 0; j < prim_totface; j++){
+
+ set_face_indices(mface, indices, false);
+ indices += 3;
+
+#if 0
+ for (k = 0; k < totuvset; k++) {
+ if (!index_list_array.empty() && index_list_array[k]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, false);
+ }
+ }
+#else
+ for (k = 0; k < index_list_array.getCount(); k++) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, false);
+ }
+#endif
+
+ test_index_face(mface, &me->fdata, face_index, 3);
+
+ if (has_normals) {
+ if (!flat_face(nind, nor, 3))
+ mface->flag |= ME_SMOOTH;
+
+ nind += 3;
+ }
+
+ index += 3;
+ mface++;
+ face_index++;
+ prim.totface++;
+ }
+ }
+ else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
+ COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
+ COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
+
+ for (j = 0; j < prim_totface; j++) {
+
+ // face
+ int vcount = vcounta[j];
+ if (vcount == 3 || vcount == 4) {
+
+ set_face_indices(mface, indices, vcount == 4);
+
+ // set mtface for each uv set
+ // it is assumed that all primitives have equal number of UV sets
+
+#if 0
+ for (k = 0; k < totuvset; k++) {
+ if (!index_list_array.empty() && index_list_array[k]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, k, *index_list_array[k], index, mface->v4 != 0);
+ }
+ }
+#else
+ for (k = 0; k < index_list_array.getCount(); k++) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, k);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[k], index, mface->v4 != 0);
+ }
+#endif
+
+ test_index_face(mface, &me->fdata, face_index, vcount);
+
+ if (has_normals) {
+ if (!flat_face(nind, nor, vcount))
+ mface->flag |= ME_SMOOTH;
+
+ nind += vcount;
+ }
+
+ mface++;
+ face_index++;
+ prim.totface++;
+
+ }
+ else {
+ std::vector<unsigned int> tri;
+
+ triangulate_poly(indices, vcount, me->mvert, tri);
+
+ for (k = 0; k < tri.size() / 3; k++) {
+ int v = k * 3;
+ unsigned int uv_indices[3] = {
+ index + tri[v],
+ index + tri[v + 1],
+ index + tri[v + 2]
+ };
+ unsigned int tri_indices[3] = {
+ indices[tri[v]],
+ indices[tri[v + 1]],
+ indices[tri[v + 2]]
+ };
+
+ set_face_indices(mface, tri_indices, false);
+
+#if 0
+ for (unsigned int l = 0; l < totuvset; l++) {
+ if (!index_list_array.empty() && index_list_array[l]) {
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, l);
+ set_face_uv(&mtface[face_index], uvs, l, *index_list_array[l], uv_indices);
+ }
+ }
+#else
+ for (unsigned int l = 0; l < index_list_array.getCount(); l++) {
+ int uvset_index = index_list_array[l]->getSetIndex();
+
+ // get mtface by face index and uv set index
+ MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, uvset_index);
+ set_face_uv(&mtface[face_index], uvs, *index_list_array[l], uv_indices);
+ }
+#endif
+
+
+ test_index_face(mface, &me->fdata, face_index, 3);
+
+ if (has_normals) {
+ unsigned int ntri[3] = {nind[tri[v]], nind[tri[v + 1]], nind[tri[v + 2]]};
+
+ if (!flat_face(ntri, nor, 3))
+ mface->flag |= ME_SMOOTH;
+ }
+
+ mface++;
+ face_index++;
+ prim.totface++;
+ }
+
+ if (has_normals)
+ nind += vcount;
+ }
+
+ index += vcount;
+ indices += vcount;
+ }
+ }
+
+ mat_prim_map[mp->getMaterialId()].push_back(prim);
+ }
+
+ geom_uid_mat_mapping_map[mesh->getUniqueId()] = mat_prim_map;
+}
+
+void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i, int stride)
+{
+ i *= stride;
+
+ switch(arr.getType()) {
+ case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
+ {
+ COLLADAFW::ArrayPrimitiveType<float>* values = arr.getFloatValues();
+ if (values->empty()) return;
+
+ v[0] = (*values)[i++];
+ v[1] = (*values)[i++];
+ v[2] = (*values)[i];
+
+ }
+ break;
+ case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+ {
+ COLLADAFW::ArrayPrimitiveType<double>* values = arr.getDoubleValues();
+ if (values->empty()) return;
+
+ v[0] = (float)(*values)[i++];
+ v[1] = (float)(*values)[i++];
+ v[2] = (float)(*values)[i];
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+bool MeshImporter::flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count)
+{
+ float a[3], b[3];
+
+ get_vector(a, nor, *nind, 3);
+ normalize_v3(a);
+
+ nind++;
+
+ for (int i = 1; i < count; i++, nind++) {
+ get_vector(b, nor, *nind, 3);
+ normalize_v3(b);
+
+ float dp = dot_v3v3(a, b);
+
+ if (dp < 0.99999f || dp > 1.00001f)
+ return false;
+ }
+
+ return true;
+}
+
+MeshImporter::MeshImporter(UnitConverter *unitconv, ArmatureImporter *arm, Scene *sce) : unitconverter(unitconv), scene(sce), armature_importer(arm) {}
+
+Object *MeshImporter::get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid)
+{
+ if (uid_object_map.find(geom_uid) != uid_object_map.end())
+ return uid_object_map[geom_uid];
+ return NULL;
+}
+
+MTex *MeshImporter::assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
+ Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+ MTex *color_texture)
+{
+ const COLLADAFW::TextureMapId texture_index = ctexture.getTextureMapId();
+ const size_t setindex = ctexture.getSetIndex();
+ std::string uvname = ctexture.getSemantic();
+
+ const CustomData *data = &me->fdata;
+ int layer_index = CustomData_get_layer_index(data, CD_MTFACE);
+ CustomDataLayer *cdl = &data->layers[layer_index+setindex];
+
+ /* set uvname to bind_vertex_input semantic */
+ BLI_strncpy(cdl->name, uvname.c_str(), sizeof(cdl->name));
+
+ if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
+
+ fprintf(stderr, "Cannot find texture array by texture index.\n");
+ return color_texture;
+ }
+
+ std::vector<MTex*> textures = texindex_texarray_map[texture_index];
+
+ std::vector<MTex*>::iterator it;
+
+ for (it = textures.begin(); it != textures.end(); it++) {
+
+ MTex *texture = *it;
+
+ if (texture) {
+ BLI_strncpy(texture->uvname, uvname.c_str(), sizeof(texture->uvname));
+ if (texture->mapto == MAP_COL) color_texture = texture;
+ }
+ }
+ return color_texture;
+}
+
+MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ Object *ob, const COLLADAFW::UniqueId *geom_uid,
+ MTex **color_texture, char *layername, MTFace *texture_face,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
+{
+ Mesh *me = (Mesh*)ob->data;
+ const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
+
+ // do we know this material?
+ if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
+
+ fprintf(stderr, "Cannot find material by UID.\n");
+ return NULL;
+ }
+
+ Material *ma = uid_material_map[ma_uid];
+ assign_material(ob, ma, ob->totcol + 1);
+
+ COLLADAFW::TextureCoordinateBindingArray& tex_array =
+ cmaterial.getTextureCoordinateBindingArray();
+ TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
+ unsigned int i;
+ // loop through <bind_vertex_inputs>
+ for (i = 0; i < tex_array.getCount(); i++) {
+
+ *color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
+ *color_texture);
+ }
+
+ // set texture face
+ if (*color_texture &&
+ strlen((*color_texture)->uvname) &&
+ strcmp(layername, (*color_texture)->uvname) != 0) {
+
+ texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
+ (*color_texture)->uvname);
+ strcpy(layername, (*color_texture)->uvname);
+ }
+
+ MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
+ COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
+
+ // assign material indices to mesh faces
+ if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
+
+ std::vector<Primitive>& prims = mat_prim_map[mat_id];
+
+ std::vector<Primitive>::iterator it;
+
+ for (it = prims.begin(); it != prims.end(); it++) {
+ Primitive& prim = *it;
+ i = 0;
+ while (i++ < prim.totface) {
+ prim.mface->mat_nr = mat_index;
+ prim.mface++;
+ // bind texture images to faces
+ if (texture_face && (*color_texture)) {
+ texture_face->mode = TF_TEX;
+ texture_face->tpage = (Image*)(*color_texture)->tex->ima;
+ texture_face++;
+ }
+ }
+ }
+ }
+
+ return texture_face;
+}
+
+
+Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
+ bool isController,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map)
+{
+ const COLLADAFW::UniqueId *geom_uid = &geom->getInstanciatedObjectId();
+
+ // check if node instanciates controller or geometry
+ if (isController) {
+
+ geom_uid = armature_importer->get_geometry_uid(*geom_uid);
+
+ if (!geom_uid) {
+ fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
+ return NULL;
+ }
+ }
+ else {
+
+ if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
+ // this could happen if a mesh was not created
+ // (e.g. if it contains unsupported geometry)
+ fprintf(stderr, "Couldn't find a mesh by UID.\n");
+ return NULL;
+ }
+ }
+ if (!uid_mesh_map[*geom_uid]) return NULL;
+
+ Object *ob = add_object(scene, OB_MESH);
+
+ // store object pointer for ArmatureImporter
+ uid_object_map[*geom_uid] = ob;
+
+ // name Object
+ const std::string& id = node->getOriginalId();
+ if (id.length())
+ rename_id(&ob->id, (char*)id.c_str());
+
+ // replace ob->data freeing the old one
+ Mesh *old_mesh = (Mesh*)ob->data;
+
+ set_mesh(ob, uid_mesh_map[*geom_uid]);
+
+ if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
+
+ char layername[100];
+ MTFace *texture_face = NULL;
+ MTex *color_texture = NULL;
+
+ COLLADAFW::MaterialBindingArray& mat_array =
+ geom->getMaterialBindings();
+
+ // loop through geom's materials
+ for (unsigned int i = 0; i < mat_array.getCount(); i++) {
+
+ texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
+ &color_texture, layername, texture_face,
+ material_texture_mapping_map, i);
+ }
+
+ return ob;
+}
+
+// create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
+bool MeshImporter::write_geometry(const COLLADAFW::Geometry* geom)
+{
+ // TODO: import also uvs, normals
+ // XXX what to do with normal indices?
+ // XXX num_normals may be != num verts, then what to do?
+
+ // check geometry->getType() first
+ if (geom->getType() != COLLADAFW::Geometry::GEO_TYPE_MESH) {
+ // TODO: report warning
+ fprintf(stderr, "Mesh type %s is not supported\n", bc_geomTypeToStr(geom->getType()));
+ return true;
+ }
+
+ COLLADAFW::Mesh *mesh = (COLLADAFW::Mesh*)geom;
+
+ if (!is_nice_mesh(mesh)) {
+ fprintf(stderr, "Ignoring mesh %s\n", bc_get_dae_name(mesh));
+ return true;
+ }
+
+ const std::string& str_geom_id = mesh->getOriginalId();
+ Mesh *me = add_mesh((char*)str_geom_id.c_str());
+
+ // store the Mesh pointer to link it later with an Object
+ this->uid_mesh_map[mesh->getUniqueId()] = me;
+
+ int new_tris = 0;
+
+ read_vertices(mesh, me);
+
+ new_tris = count_new_tris(mesh, me);
+
+ read_faces(mesh, me, new_tris);
+
+ make_edges(me, 0);
+
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ return true;
+}
diff --git a/source/blender/collada/MeshImporter.h b/source/blender/collada/MeshImporter.h
new file mode 100644
index 00000000000..1a9f698a7ce
--- /dev/null
+++ b/source/blender/collada/MeshImporter.h
@@ -0,0 +1,156 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file MeshImporter.h
+ * \ingroup collada
+ */
+
+#ifndef __BC__MESHIMPORTER_H__
+#define __BC__MESHIMPORTER_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWIndexList.h"
+#include "COLLADAFWInstanceGeometry.h"
+#include "COLLADAFWMaterialBinding.h"
+#include "COLLADAFWMesh.h"
+#include "COLLADAFWMeshVertexData.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWTextureCoordinateBinding.h"
+#include "COLLADAFWTypes.h"
+#include "COLLADAFWUniqueId.h"
+
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
+
+#include "ArmatureImporter.h"
+#include "collada_utils.h"
+
+// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
+class MeshImporterBase
+{
+public:
+ virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid) = 0;
+};
+
+class UVDataWrapper
+{
+ COLLADAFW::MeshVertexData *mVData;
+public:
+ UVDataWrapper(COLLADAFW::MeshVertexData& vdata);
+
+#ifdef COLLADA_DEBUG
+ void print();
+#endif
+
+ void getUV(int uv_index[2], float *uv);
+};
+
+class MeshImporter : public MeshImporterBase
+{
+private:
+
+ UnitConverter *unitconverter;
+
+ Scene *scene;
+ ArmatureImporter *armature_importer;
+
+ std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
+ std::map<COLLADAFW::UniqueId, Object*> uid_object_map; // geom uid-to-object
+ // this structure is used to assign material indices to faces
+ // it holds a portion of Mesh faces and corresponds to a DAE primitive list (<triangles>, <polylist>, etc.)
+ struct Primitive {
+ MFace *mface;
+ unsigned int totface;
+ };
+ typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
+ std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
+
+
+ void set_face_indices(MFace *mface, unsigned int *indices, bool quad);
+
+ // not used anymore, test_index_face from blenkernel is better
+#if 0
+ // change face indices order so that v4 is not 0
+ void rotate_face_indices(MFace *mface);
+#endif
+
+ void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, unsigned int *tris_indices);
+
+ void set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
+ COLLADAFW::IndexList& index_list, int index, bool quad);
+
+#ifdef COLLADA_DEBUG
+ void print_index_list(COLLADAFW::IndexList& index_list);
+#endif
+
+ bool is_nice_mesh(COLLADAFW::Mesh *mesh);
+
+ void read_vertices(COLLADAFW::Mesh *mesh, Mesh *me);
+
+ int triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector<unsigned int>& tri);
+
+ int count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me);
+
+ // TODO: import uv set names
+ void read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris);
+
+ void get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i, int stride);
+
+ bool flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count);
+
+public:
+
+ MeshImporter(UnitConverter *unitconv, ArmatureImporter *arm, Scene *sce);
+
+ virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid);
+
+ MTex *assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBinding &ctexture,
+ Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+ MTex *color_texture);
+
+ MTFace *assign_material_to_geom(COLLADAFW::MaterialBinding cmaterial,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ Object *ob, const COLLADAFW::UniqueId *geom_uid,
+ MTex **color_texture, char *layername, MTFace *texture_face,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index);
+
+
+ Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
+ bool isController,
+ std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+ std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map);
+
+ // create a mesh storing a pointer in a map so it can be retrieved later by geometry UID
+ bool write_geometry(const COLLADAFW::Geometry* geom);
+
+};
+
+#endif
diff --git a/source/blender/collada/SConscript b/source/blender/collada/SConscript
index a473d31e1de..10c3fcaeb96 100644
--- a/source/blender/collada/SConscript
+++ b/source/blender/collada/SConscript
@@ -30,11 +30,12 @@ Import ('env')
sources = env.Glob('*.cpp')
defs = []
+# TODO sanitize inc path building
# relative paths to include dirs, space-separated, string
if env['OURPLATFORM']=='darwin':
- incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter [OPENCOLLADA]/COLLADABaseUtils [OPENCOLLADA]/COLLADAFramework [OPENCOLLADA]/COLLADASaxFrameworkLoader '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
+ incs = '../blenlib ../blenkernel ../windowmanager ../blenloader ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter [OPENCOLLADA]/COLLADABaseUtils [OPENCOLLADA]/COLLADAFramework [OPENCOLLADA]/COLLADASaxFrameworkLoader '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
else:
- incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter/include [OPENCOLLADA]/COLLADABaseUtils/include [OPENCOLLADA]/COLLADAFramework/include [OPENCOLLADA]/COLLADASaxFrameworkLoader/include '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
+ incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../blenloader ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter/include [OPENCOLLADA]/COLLADABaseUtils/include [OPENCOLLADA]/COLLADAFramework/include [OPENCOLLADA]/COLLADASaxFrameworkLoader/include '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
if env['BF_BUILDINFO']:
defs.append('NAN_BUILDINFO')
diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp
new file mode 100644
index 00000000000..3e778e09ddf
--- /dev/null
+++ b/source/blender/collada/SkinInfo.cpp
@@ -0,0 +1,331 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <algorithm>
+
+#if !defined(WIN32) || defined(FREE_WINDOWS)
+#include <stdint.h>
+#endif
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "BKE_object.h"
+#include "DNA_armature_types.h"
+#include "DNA_modifier_types.h"
+#include "ED_mesh.h"
+#include "ED_object.h"
+#include "BKE_action.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
+
+#include "SkinInfo.h"
+#include "collada_utils.h"
+
+// use this for retrieving bone names, since these must be unique
+template<class T>
+static const char *bc_get_joint_name(T *node)
+{
+ const std::string& id = node->getOriginalId();
+ return id.size() ? id.c_str() : node->getName().c_str();
+}
+
+// This is used to store data passed in write_controller_data.
+// Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+// so that arrays don't get freed until we free them explicitly.
+SkinInfo::SkinInfo() {}
+
+SkinInfo::SkinInfo(const SkinInfo& skin) : weights(skin.weights),
+ joint_data(skin.joint_data),
+ unit_converter(skin.unit_converter),
+ ob_arm(skin.ob_arm),
+ controller_uid(skin.controller_uid),
+ parent(skin.parent)
+{
+ copy_m4_m4(bind_shape_matrix, (float (*)[4])skin.bind_shape_matrix);
+
+ transfer_uint_array_data_const(skin.joints_per_vertex, joints_per_vertex);
+ transfer_uint_array_data_const(skin.weight_indices, weight_indices);
+ transfer_int_array_data_const(skin.joint_indices, joint_indices);
+}
+
+SkinInfo::SkinInfo(UnitConverter *conv) : unit_converter(conv), ob_arm(NULL), parent(NULL) {}
+
+// nobody owns the data after this, so it should be freed manually with releaseMemory
+template <class T>
+void SkinInfo::transfer_array_data(T& src, T& dest)
+{
+ dest.setData(src.getData(), src.getCount());
+ src.yieldOwnerShip();
+ dest.yieldOwnerShip();
+}
+
+// when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
+void SkinInfo::transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest)
+{
+ dest.setData((int*)src.getData(), src.getCount());
+ dest.yieldOwnerShip();
+}
+
+void SkinInfo::transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest)
+{
+ dest.setData((unsigned int*)src.getData(), src.getCount());
+ dest.yieldOwnerShip();
+}
+
+void SkinInfo::borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin)
+{
+ transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getJointsPerVertex(), joints_per_vertex);
+ transfer_array_data((COLLADAFW::UIntValuesArray&)skin->getWeightIndices(), weight_indices);
+ transfer_array_data((COLLADAFW::IntValuesArray&)skin->getJointIndices(), joint_indices);
+ // transfer_array_data(skin->getWeights(), weights);
+
+ // cannot transfer data for FloatOrDoubleArray, copy values manually
+ const COLLADAFW::FloatOrDoubleArray& weight = skin->getWeights();
+ for (unsigned int i = 0; i < weight.getValuesCount(); i++)
+ weights.push_back(bc_get_float_value(weight, i));
+
+ unit_converter->dae_matrix_to_mat4_(bind_shape_matrix, skin->getBindShapeMatrix());
+}
+
+void SkinInfo::free()
+{
+ joints_per_vertex.releaseMemory();
+ weight_indices.releaseMemory();
+ joint_indices.releaseMemory();
+ // weights.releaseMemory();
+}
+
+// using inverse bind matrices to construct armature
+// it is safe to invert them to get the original matrices
+// because if they are inverse matrices, they can be inverted
+void SkinInfo::add_joint(const COLLADABU::Math::Matrix4& matrix)
+{
+ JointData jd;
+ unit_converter->dae_matrix_to_mat4_(jd.inv_bind_mat, matrix);
+ joint_data.push_back(jd);
+}
+
+void SkinInfo::set_controller(const COLLADAFW::SkinController* co)
+{
+ controller_uid = co->getUniqueId();
+
+ // fill in joint UIDs
+ const COLLADAFW::UniqueIdArray& joint_uids = co->getJoints();
+ for (unsigned int i = 0; i < joint_uids.getCount(); i++) {
+ joint_data[i].joint_uid = joint_uids[i];
+
+ // // store armature pointer
+ // JointData& jd = joint_index_to_joint_info_map[i];
+ // jd.ob_arm = ob_arm;
+
+ // now we'll be able to get inv bind matrix from joint id
+ // joint_id_to_joint_index_map[joint_ids[i]] = i;
+ }
+}
+
+// called from write_controller
+Object *SkinInfo::create_armature(Scene *scene)
+{
+ ob_arm = add_object(scene, OB_ARMATURE);
+ return ob_arm;
+}
+
+Object* SkinInfo::set_armature(Object *ob_arm)
+{
+ if (this->ob_arm)
+ return this->ob_arm;
+
+ this->ob_arm = ob_arm;
+ return ob_arm;
+}
+
+bool SkinInfo::get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node)
+{
+ const COLLADAFW::UniqueId& uid = node->getUniqueId();
+ std::vector<JointData>::iterator it;
+ for (it = joint_data.begin(); it != joint_data.end(); it++) {
+ if ((*it).joint_uid == uid) {
+ copy_m4_m4(inv_bind_mat, (*it).inv_bind_mat);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Object *SkinInfo::get_armature()
+{
+ return ob_arm;
+}
+
+const COLLADAFW::UniqueId& SkinInfo::get_controller_uid()
+{
+ return controller_uid;
+}
+
+// check if this skin controller references a joint or any descendant of it
+//
+// some nodes may not be referenced by SkinController,
+// in this case to determine if the node belongs to this armature,
+// we need to search down the tree
+bool SkinInfo::uses_joint_or_descendant(COLLADAFW::Node *node)
+{
+ const COLLADAFW::UniqueId& uid = node->getUniqueId();
+ std::vector<JointData>::iterator it;
+ for (it = joint_data.begin(); it != joint_data.end(); it++) {
+ if ((*it).joint_uid == uid)
+ return true;
+ }
+
+ COLLADAFW::NodePointerArray& children = node->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (uses_joint_or_descendant(children[i]))
+ return true;
+ }
+
+ return false;
+}
+
+void SkinInfo::link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ TransformReader *tm)
+{
+ Main *bmain = CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+
+ ModifierData *md = ED_object_modifier_add(NULL, bmain, scene, ob, NULL, eModifierType_Armature);
+ ((ArmatureModifierData *)md)->object = ob_arm;
+
+ copy_m4_m4(ob->obmat, bind_shape_matrix);
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+#if 1
+ bc_set_parent(ob, ob_arm, C);
+#else
+ Object workob;
+ ob->parent = ob_arm;
+ ob->partype = PAROBJECT;
+
+ what_does_parent(scene, ob, &workob);
+ invert_m4_m4(ob->parentinv, workob.obmat);
+
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
+
+ DAG_scene_sort(bmain, scene);
+ DAG_ids_flush_update(bmain, 0);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+#endif
+
+ ((bArmature*)ob_arm->data)->deformflag = ARM_DEF_VGROUP;
+
+ // create all vertex groups
+ std::vector<JointData>::iterator it;
+ int joint_index;
+ for (it = joint_data.begin(), joint_index = 0; it != joint_data.end(); it++, joint_index++) {
+ const char *name = "Group";
+
+ // skip joints that have invalid UID
+ if ((*it).joint_uid == COLLADAFW::UniqueId::INVALID) continue;
+
+ // name group by joint node name
+
+ if (joint_by_uid.find((*it).joint_uid) != joint_by_uid.end()) {
+ name = bc_get_joint_name(joint_by_uid[(*it).joint_uid]);
+ }
+
+ ED_vgroup_add_name(ob, (char*)name);
+ }
+
+ // <vcount> - number of joints per vertex - joints_per_vertex
+ // <v> - [[bone index, weight index] * joints per vertex] * vertices - weight indices
+ // ^ bone index can be -1 meaning weight toward bind shape, how to express this in Blender?
+
+ // for each vertex in weight indices
+ // for each bone index in vertex
+ // add vertex to group at group index
+ // treat group index -1 specially
+
+ // get def group by index with BLI_findlink
+
+ for (unsigned int vertex = 0, weight = 0; vertex < joints_per_vertex.getCount(); vertex++) {
+
+ unsigned int limit = weight + joints_per_vertex[vertex];
+ for ( ; weight < limit; weight++) {
+ int joint = joint_indices[weight], joint_weight = weight_indices[weight];
+
+ // -1 means "weight towards the bind shape", we just don't assign it to any group
+ if (joint != -1) {
+ bDeformGroup *def = (bDeformGroup*)BLI_findlink(&ob->defbase, joint);
+
+ ED_vgroup_vert_add(ob, def, vertex, weights[joint_weight], WEIGHT_REPLACE);
+ }
+ }
+ }
+}
+
+bPoseChannel *SkinInfo::get_pose_channel_from_node(COLLADAFW::Node *node)
+{
+ return get_pose_channel(ob_arm->pose, bc_get_joint_name(node));
+}
+
+void SkinInfo::set_parent(Object *_parent)
+{
+ parent = _parent;
+}
+
+Object* SkinInfo::get_parent()
+{
+ return parent;
+}
+
+void SkinInfo::find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ std::vector<COLLADAFW::Node*>& result)
+{
+ std::vector<COLLADAFW::Node*>::const_iterator it;
+ for (it = root_joints.begin(); it != root_joints.end(); it++) {
+ COLLADAFW::Node *root = *it;
+ std::vector<JointData>::iterator ji;
+ for (ji = joint_data.begin(); ji != joint_data.end(); ji++) {
+ COLLADAFW::Node *joint = joint_by_uid[(*ji).joint_uid];
+ if (find_node_in_tree(joint, root)) {
+ if (std::find(result.begin(), result.end(), root) == result.end())
+ result.push_back(root);
+ }
+ }
+ }
+}
+
+bool SkinInfo::find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root)
+{
+ if (node == tree_root)
+ return true;
+
+ COLLADAFW::NodePointerArray& children = tree_root->getChildNodes();
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ if (find_node_in_tree(node, children[i]))
+ return true;
+ }
+
+ return false;
+}
diff --git a/source/blender/collada/SkinInfo.h b/source/blender/collada/SkinInfo.h
new file mode 100644
index 00000000000..42cb7cd99eb
--- /dev/null
+++ b/source/blender/collada/SkinInfo.h
@@ -0,0 +1,137 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file SkinInfo.h
+ * \ingroup collada
+ */
+
+#ifndef __BC_SKININFO_H__
+#define __BC_SKININFO_H__
+
+#include <map>
+#include <vector>
+
+#include "COLLADAFWUniqueId.h"
+#include "COLLADAFWTypes.h"
+#include "COLLADAFWNode.h"
+#include "COLLADAFWSkinController.h"
+#include "COLLADAFWSkinControllerData.h"
+
+#include "DNA_object_types.h"
+#include "BKE_context.h"
+
+#include "TransformReader.h"
+#include "collada_internal.h"
+
+// This is used to store data passed in write_controller_data.
+// Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+// so that arrays don't get freed until we free them explicitly.
+class SkinInfo
+{
+private:
+ // to build armature bones from inverse bind matrices
+ struct JointData {
+ float inv_bind_mat[4][4]; // joint inverse bind matrix
+ COLLADAFW::UniqueId joint_uid; // joint node UID
+ // Object *ob_arm; // armature object
+ };
+
+ float bind_shape_matrix[4][4];
+
+ // data from COLLADAFW::SkinControllerData, each array should be freed
+ COLLADAFW::UIntValuesArray joints_per_vertex;
+ COLLADAFW::UIntValuesArray weight_indices;
+ COLLADAFW::IntValuesArray joint_indices;
+ // COLLADAFW::FloatOrDoubleArray weights;
+ std::vector<float> weights;
+
+ std::vector<JointData> joint_data; // index to this vector is joint index
+
+ UnitConverter *unit_converter;
+
+ Object *ob_arm;
+ COLLADAFW::UniqueId controller_uid;
+ Object *parent;
+
+public:
+
+ SkinInfo();
+ SkinInfo(const SkinInfo& skin);
+ SkinInfo(UnitConverter *conv);
+
+ // nobody owns the data after this, so it should be freed manually with releaseMemory
+ template <typename T>
+ void transfer_array_data(T& src, T& dest);
+
+ // when src is const we cannot src.yieldOwnerShip, this is used by copy constructor
+ void transfer_int_array_data_const(const COLLADAFW::IntValuesArray& src, COLLADAFW::IntValuesArray& dest);
+
+ void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray& src, COLLADAFW::UIntValuesArray& dest);
+
+ void borrow_skin_controller_data(const COLLADAFW::SkinControllerData* skin);
+
+ void free();
+
+ // using inverse bind matrices to construct armature
+ // it is safe to invert them to get the original matrices
+ // because if they are inverse matrices, they can be inverted
+ void add_joint(const COLLADABU::Math::Matrix4& matrix);
+
+ void set_controller(const COLLADAFW::SkinController* co);
+
+ // called from write_controller
+ Object *create_armature(Scene *scene);
+
+ Object* set_armature(Object *ob_arm);
+
+ bool get_joint_inv_bind_matrix(float inv_bind_mat[][4], COLLADAFW::Node *node);
+
+ Object *get_armature();
+
+ const COLLADAFW::UniqueId& get_controller_uid();
+
+ // check if this skin controller references a joint or any descendant of it
+ //
+ // some nodes may not be referenced by SkinController,
+ // in this case to determine if the node belongs to this armature,
+ // we need to search down the tree
+ bool uses_joint_or_descendant(COLLADAFW::Node *node);
+
+ void link_armature(bContext *C, Object *ob, std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid, TransformReader *tm);
+
+ bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node);
+
+ void set_parent(Object *_parent);
+
+ Object* get_parent();
+
+ void find_root_joints(const std::vector<COLLADAFW::Node*> &root_joints,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& joint_by_uid,
+ std::vector<COLLADAFW::Node*>& result);
+
+ bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root);
+
+};
+
+#endif
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
new file mode 100644
index 00000000000..04711775f14
--- /dev/null
+++ b/source/blender/collada/TransformReader.cpp
@@ -0,0 +1,127 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "TransformReader.h"
+
+TransformReader::TransformReader(UnitConverter* conv) : unit_converter(conv) {}
+
+void TransformReader::get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map, Object *ob)
+{
+ float cur[4][4];
+ float copy[4][4];
+
+ unit_m4(mat);
+
+ for (unsigned int i = 0; i < node->getTransformations().getCount(); i++) {
+
+ COLLADAFW::Transformation *tm = node->getTransformations()[i];
+ COLLADAFW::Transformation::TransformationType type = tm->getTransformationType();
+
+ switch(type) {
+ case COLLADAFW::Transformation::TRANSLATE:
+ dae_translate_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::ROTATE:
+ dae_rotate_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::SCALE:
+ dae_scale_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::MATRIX:
+ dae_matrix_to_mat4(tm, cur);
+ break;
+ case COLLADAFW::Transformation::LOOKAT:
+ case COLLADAFW::Transformation::SKEW:
+ fprintf(stderr, "LOOKAT and SKEW transformations are not supported yet.\n");
+ break;
+ }
+
+ copy_m4_m4(copy, mat);
+ mul_m4_m4m4(mat, cur, copy);
+
+ if (animation_map) {
+ // AnimationList that drives this Transformation
+ const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();
+
+ // store this so later we can link animation data with ob
+ Animation anim = {ob, node, tm};
+ (*animation_map)[anim_list_id] = anim;
+ }
+ }
+}
+
+void TransformReader::dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADAFW::Rotate *ro = (COLLADAFW::Rotate*)tm;
+ COLLADABU::Math::Vector3& axis = ro->getRotationAxis();
+ float angle = (float)(ro->getRotationAngle() * M_PI / 180.0f);
+ float ax[] = {axis[0], axis[1], axis[2]};
+ // float quat[4];
+ // axis_angle_to_quat(quat, axis, angle);
+ // quat_to_mat4(m, quat);
+ axis_angle_to_mat4(m, ax, angle);
+}
+
+void TransformReader::dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADAFW::Translate *tra = (COLLADAFW::Translate*)tm;
+ COLLADABU::Math::Vector3& t = tra->getTranslation();
+
+ unit_m4(m);
+
+ m[3][0] = (float)t[0];
+ m[3][1] = (float)t[1];
+ m[3][2] = (float)t[2];
+}
+
+void TransformReader::dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ COLLADABU::Math::Vector3& s = ((COLLADAFW::Scale*)tm)->getScale();
+ float size[3] = {(float)s[0], (float)s[1], (float)s[2]};
+ size_to_mat4(m, size);
+}
+
+void TransformReader::dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4])
+{
+ unit_converter->dae_matrix_to_mat4_(m, ((COLLADAFW::Matrix*)tm)->getMatrix());
+}
+
+void TransformReader::dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3])
+{
+ dae_vector3_to_v3(((COLLADAFW::Translate*)tm)->getTranslation(), v);
+}
+
+void TransformReader::dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3])
+{
+ dae_vector3_to_v3(((COLLADAFW::Scale*)tm)->getScale(), v);
+}
+
+void TransformReader::dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3])
+{
+ v[0] = v3.x;
+ v[1] = v3.y;
+ v[2] = v3.z;
+}
diff --git a/source/blender/collada/TransformReader.h b/source/blender/collada/TransformReader.h
new file mode 100644
index 00000000000..3997d8bb1d7
--- /dev/null
+++ b/source/blender/collada/TransformReader.h
@@ -0,0 +1,74 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file TransformReader.h
+ * \ingroup collada
+ */
+
+#ifndef __BC_TRANSFORMREADER_H__
+#define __BC_TRANSFORMREADER_H__
+
+#include "COLLADAFWNode.h"
+#include "COLLADAFWTransformation.h"
+#include "COLLADAFWTranslate.h"
+#include "COLLADAFWRotate.h"
+#include "COLLADAFWScale.h"
+#include "COLLADAFWMatrix.h"
+#include "COLLADAFWUniqueId.h"
+#include "Math/COLLADABUMathVector3.h"
+
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
+#include "collada_internal.h"
+
+//struct Object;
+
+class TransformReader : public TransformBase
+{
+protected:
+
+ UnitConverter *unit_converter;
+
+public:
+ struct Animation {
+ Object *ob;
+ COLLADAFW::Node *node;
+ COLLADAFW::Transformation *tm; // which transform is animated by an AnimationList->id
+ };
+
+ TransformReader(UnitConverter* conv);
+
+ void get_node_mat(float mat[][4], COLLADAFW::Node *node, std::map<COLLADAFW::UniqueId, Animation> *animation_map, Object *ob);
+
+ void dae_rotate_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_translate_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_scale_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_matrix_to_mat4(COLLADAFW::Transformation *tm, float m[][4]);
+ void dae_translate_to_v3(COLLADAFW::Transformation *tm, float v[3]);
+ void dae_scale_to_v3(COLLADAFW::Transformation *tm, float v[3]);
+ void dae_vector3_to_v3(const COLLADABU::Math::Vector3 &v3, float v[3]);
+};
+
+#endif
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
new file mode 100644
index 00000000000..c74f23599e8
--- /dev/null
+++ b/source/blender/collada/TransformWriter.cpp
@@ -0,0 +1,100 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BKE_object.h"
+
+#include "TransformWriter.h"
+
+#include "BLI_math.h"
+
+void TransformWriter::add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4])
+{
+ float loc[3], rot[3], scale[3];
+ float local[4][4];
+
+ if (parent_mat) {
+ float invpar[4][4];
+ invert_m4_m4(invpar, parent_mat);
+ mul_m4_m4m4(local, mat, invpar);
+ }
+ else {
+ copy_m4_m4(local, mat);
+ }
+
+ TransformBase::decompose(local, loc, rot, NULL, scale);
+
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob)
+{
+ float rot[3], loc[3], scale[3];
+
+ if (ob->parent) {
+ float C[4][4], tmat[4][4], imat[4][4], mat[4][4];
+
+ // factor out scale from obmat
+
+ copy_v3_v3(scale, ob->size);
+
+ ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
+ object_to_mat4(ob, C);
+ copy_v3_v3(ob->size, scale);
+
+ mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL);
+
+ // calculate local mat
+
+ invert_m4_m4(imat, ob->parent->obmat);
+ mul_m4_m4m4(mat, tmat, imat);
+
+ // done
+
+ mat4_to_eul(rot, mat);
+ copy_v3_v3(loc, mat[3]);
+ }
+ else {
+ copy_v3_v3(loc, ob->loc);
+ copy_v3_v3(rot, ob->rot);
+ copy_v3_v3(scale, ob->size);
+ }
+
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_node_transform_identity(COLLADASW::Node& node)
+{
+ float loc[] = {0.0f, 0.0f, 0.0f}, scale[] = {1.0f, 1.0f, 1.0f}, rot[] = {0.0f, 0.0f, 0.0f};
+ add_transform(node, loc, rot, scale);
+}
+
+void TransformWriter::add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3])
+{
+ node.addTranslate("location", loc[0], loc[1], loc[2]);
+ node.addRotateZ("rotationZ", COLLADABU::Math::Utils::radToDegF(rot[2]));
+ node.addRotateY("rotationY", COLLADABU::Math::Utils::radToDegF(rot[1]));
+ node.addRotateX("rotationX", COLLADABU::Math::Utils::radToDegF(rot[0]));
+ node.addScale("scale", scale[0], scale[1], scale[2]);
+}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_System.h b/source/blender/collada/TransformWriter.h
index bd9a0cd709f..a0cda4c464f 100644
--- a/source/gameengine/GamePlayer/common/windows/GPW_System.h
+++ b/source/blender/collada/TransformWriter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,42 +17,36 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed,
+ * Nathan Letwory
*
* ***** END GPL LICENSE BLOCK *****
- * Timing routine taken and modified from KX_BlenderSystem.cpp
*/
-#ifndef _GPW_SYSTEM_H_
-#define _GPW_SYSTEM_H_
+/** \file TransformWriter.h
+ * \ingroup collada
+ */
-#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
+#ifndef __TRANSFORMWRITER_H__
+#define __TRANSFORMWRITER_H__
-#include "GPC_System.h"
+#include "COLLADASWNode.h"
-#if defined(__CYGWIN32__)
-# define __int64 long long
-#endif
+#include "DNA_object_types.h"
-class GPW_System : public GPC_System
-{
-public:
- GPW_System();
+#include "collada_internal.h"
- virtual double GetTimeInSeconds();
+class TransformWriter : protected TransformBase
+{
protected:
+ void add_node_transform(COLLADASW::Node& node, float mat[][4], float parent_mat[][4]);
- __int64 m_freq;
- __int64 m_lastCount;
- __int64 m_lastRest;
- long m_lastTime;
+ void add_node_transform_ob(COLLADASW::Node& node, Object *ob);
-};
+ void add_node_transform_identity(COLLADASW::Node& node);
-#endif //_GPW_SYSTEM_H_
+private:
+ void add_transform(COLLADASW::Node& node, float loc[3], float rot[3], float scale[3]);
+};
+#endif
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index a519db3332c..e285197f8f7 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,19 +21,22 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_main.h"
-#include "BKE_scene.h"
-#include "BKE_context.h"
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
#include "DocumentExporter.h"
#include "DocumentImporter.h"
extern "C"
{
+#include "BKE_scene.h"
+#include "BKE_context.h"
+
int collada_import(bContext *C, const char *filepath)
{
- DocumentImporter imp;
- imp.import(C, filepath);
+ DocumentImporter imp (C, filepath);
+ imp.import();
return 1;
}
diff --git a/source/blender/collada/collada.h b/source/blender/collada/collada.h
index 1c724bef6a6..a167784e217 100644
--- a/source/blender/collada/collada.h
+++ b/source/blender/collada/collada.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file collada.h
+ * \ingroup collada
+ */
+
#ifndef BLENDER_COLLADA_H
#define BLENDER_COLLADA_H
diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp
new file mode 100644
index 00000000000..b3ac62bb6a4
--- /dev/null
+++ b/source/blender/collada/collada_internal.cpp
@@ -0,0 +1,269 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "collada_internal.h"
+
+UnitConverter::UnitConverter() : unit(), up_axis(COLLADAFW::FileInfo::Z_UP) {}
+
+void UnitConverter::read_asset(const COLLADAFW::FileInfo* asset)
+{
+ unit = asset->getUnit();
+ up_axis = asset->getUpAxisType();
+}
+
+UnitConverter::UnitSystem UnitConverter::isMetricSystem()
+{
+ switch(unit.getLinearUnitUnit()) {
+ case COLLADAFW::FileInfo::Unit::MILLIMETER:
+ case COLLADAFW::FileInfo::Unit::CENTIMETER:
+ case COLLADAFW::FileInfo::Unit::DECIMETER:
+ case COLLADAFW::FileInfo::Unit::METER:
+ case COLLADAFW::FileInfo::Unit::KILOMETER:
+ return UnitConverter::Metric;
+ case COLLADAFW::FileInfo::Unit::INCH:
+ case COLLADAFW::FileInfo::Unit::FOOT:
+ case COLLADAFW::FileInfo::Unit::YARD:
+ return UnitConverter::Imperial;
+ default:
+ return UnitConverter::None;
+ }
+}
+
+float UnitConverter::getLinearMeter()
+{
+ return (float)unit.getLinearUnitMeter();
+}
+
+void UnitConverter::convertVector3(COLLADABU::Math::Vector3 &vec, float *v)
+{
+ v[0] = vec.x;
+ v[1] = vec.y;
+ v[2] = vec.z;
+}
+
+// TODO need also for angle conversion, time conversion...
+
+void UnitConverter::dae_matrix_to_mat4_(float out[][4], const COLLADABU::Math::Matrix4& in)
+{
+ // in DAE, matrices use columns vectors, (see comments in COLLADABUMathMatrix4.h)
+ // so here, to make a blender matrix, we swap columns and rows
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ out[i][j] = in[j][i];
+ }
+ }
+}
+
+void UnitConverter::mat4_to_dae(float out[][4], float in[][4])
+{
+ copy_m4_m4(out, in);
+ transpose_m4(out);
+}
+
+void UnitConverter::mat4_to_dae_double(double out[][4], float in[][4])
+{
+ float mat[4][4];
+
+ mat4_to_dae(mat, in);
+
+ for (int i = 0; i < 4; i++)
+ for (int j = 0; j < 4; j++)
+ out[i][j] = mat[i][j];
+}
+
+void TransformBase::decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size)
+{
+ mat4_to_size(size, mat);
+ if (eul) {
+ mat4_to_eul(eul, mat);
+ }
+ if (quat) {
+ mat4_to_quat(quat, mat);
+ }
+ copy_v3_v3(loc, mat[3]);
+}
+
+/**
+Translation map.
+Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be
+included. Look at the IDREF XSD declaration for more.
+Follows strictly the COLLADA XSD declaration which explicitly allows non-english chars,
+like special chars (e.g. micro sign), umlauts and so on.
+The COLLADA spec also allows additional chars for member access ('.'), these
+must obviously be removed too, otherwise they would be heavily misinterpreted.
+*/
+const unsigned char translate_start_name_map[256] = {
+95, 95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+65, 66, 67, 68, 69, 70, 71, 72,
+73, 74, 75, 76, 77, 78, 79, 80,
+81, 82, 83, 84, 85, 86, 87, 88,
+89, 90, 95, 95, 95, 95, 95, 95,
+97, 98, 99, 100, 101, 102, 103, 104,
+105, 106, 107, 108, 109, 110, 111, 112,
+113, 114, 115, 116, 117, 118, 119, 120,
+121, 122, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 192,
+193, 194, 195, 196, 197, 198, 199, 200,
+201, 202, 203, 204, 205, 206, 207, 208,
+209, 210, 211, 212, 213, 214, 95, 216,
+217, 218, 219, 220, 221, 222, 223, 224,
+225, 226, 227, 228, 229, 230, 231, 232,
+233, 234, 235, 236, 237, 238, 239, 240,
+241, 242, 243, 244, 245, 246, 95, 248,
+249, 250, 251, 252, 253, 254, 255};
+
+const unsigned char translate_name_map[256] = {
+95, 95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 45, 95, 95, 48,
+49, 50, 51, 52, 53, 54, 55, 56,
+57, 95, 95, 95, 95, 95, 95, 95,
+65, 66, 67, 68, 69, 70, 71, 72,
+73, 74, 75, 76, 77, 78, 79, 80,
+81, 82, 83, 84, 85, 86, 87, 88,
+89, 90, 95, 95, 95, 95, 95, 95,
+97, 98, 99, 100, 101, 102, 103, 104,
+105, 106, 107, 108, 109, 110, 111, 112,
+113, 114, 115, 116, 117, 118, 119, 120,
+121, 122, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 95, 95,
+95, 95, 95, 95, 95, 95, 183, 95,
+95, 95, 95, 95, 95, 95, 95, 192,
+193, 194, 195, 196, 197, 198, 199, 200,
+201, 202, 203, 204, 205, 206, 207, 208,
+209, 210, 211, 212, 213, 214, 95, 216,
+217, 218, 219, 220, 221, 222, 223, 224,
+225, 226, 227, 228, 229, 230, 231, 232,
+233, 234, 235, 236, 237, 238, 239, 240,
+241, 242, 243, 244, 245, 246, 95, 248,
+249, 250, 251, 252, 253, 254, 255};
+
+typedef std::map< std::string, std::vector<std::string> > map_string_list;
+map_string_list global_id_map;
+
+void clear_global_id_map()
+{
+ global_id_map.clear();
+}
+
+/** Look at documentation of translate_map */
+std::string translate_id(const std::string &id)
+{
+ if (id.size() == 0)
+ { return id; }
+ std::string id_translated = id;
+ id_translated[0] = translate_start_name_map[(unsigned int)id_translated[0]];
+ for (unsigned int i=1; i < id_translated.size(); i++)
+ {
+ id_translated[i] = translate_name_map[(unsigned int)id_translated[i]];
+ }
+ // It's so much workload now, the if() should speed up things.
+ if (id_translated != id)
+ {
+ // Search duplicates
+ map_string_list::iterator iter = global_id_map.find(id_translated);
+ if (iter != global_id_map.end())
+ {
+ unsigned int i = 0;
+ bool found = false;
+ for (i=0; i < iter->second.size(); i++)
+ {
+ if (id == iter->second[i])
+ {
+ found = true;
+ break;
+ }
+ }
+ bool convert = false;
+ if (found)
+ {
+ if (i > 0)
+ { convert = true; }
+ }
+ else
+ {
+ convert = true;
+ global_id_map[id_translated].push_back(id);
+ }
+ if (convert)
+ {
+ std::stringstream out;
+ out << ++i;
+ id_translated += out.str();
+ }
+ }
+ else { global_id_map[id_translated].push_back(id); }
+ }
+ return id_translated;
+}
+
+std::string id_name(void *id)
+{
+ return ((ID*)id)->name + 2;
+}
+
+std::string get_geometry_id(Object *ob)
+{
+ return translate_id(id_name(ob->data)) + "-mesh";
+}
+
+std::string get_light_id(Object *ob)
+{
+ return translate_id(id_name(ob)) + "-light";
+}
+
+std::string get_joint_id(Bone *bone, Object *ob_arm)
+{
+ return translate_id(id_name(ob_arm) + "_" + bone->name);
+}
+
+std::string get_camera_id(Object *ob)
+{
+ return translate_id(id_name(ob)) + "-camera";
+}
diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h
index 242fce749c4..815113400b4 100644
--- a/source/blender/collada/collada_internal.h
+++ b/source/blender/collada/collada_internal.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,12 +21,25 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef BLENDER_COLLADA_H
-#define BLENDER_COLLADA_H
+
+/** \file collada_internal.h
+ * \ingroup collada
+ */
+
+#ifndef COLLADA_INTERNAL_H
+#define COLLADA_INTERNAL_H
+
+#include <string>
+#include <vector>
+#include <map>
#include "COLLADAFWFileInfo.h"
#include "Math/COLLADABUMathMatrix4.h"
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
+#include "BLI_math.h"
+
class UnitConverter
{
private:
@@ -35,61 +48,50 @@ private:
public:
- UnitConverter() : unit(), up_axis(COLLADAFW::FileInfo::Z_UP) {}
+ enum UnitSystem {
+ None,
+ Metric,
+ Imperial
+ };
+
+ // Initialize with Z_UP, since Blender uses right-handed, z-up
+ UnitConverter();
- void read_asset(const COLLADAFW::FileInfo* asset)
- {
- }
+ void read_asset(const COLLADAFW::FileInfo* asset);
- // TODO
- // convert vector vec from COLLADA format to Blender
- void convertVec3(float *vec)
- {
- }
+ void convertVector3(COLLADABU::Math::Vector3 &vec, float *v);
+
+ UnitConverter::UnitSystem isMetricSystem(void);
+
+ float getLinearMeter(void);
// TODO need also for angle conversion, time conversion...
- void dae_matrix_to_mat4(float out[][4], const COLLADABU::Math::Matrix4& in)
- {
- // in DAE, matrices use columns vectors, (see comments in COLLADABUMathMatrix4.h)
- // so here, to make a blender matrix, we swap columns and rows
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- out[i][j] = in[j][i];
- }
- }
- }
-
- void mat4_to_dae(float out[][4], float in[][4])
- {
- copy_m4_m4(out, in);
- transpose_m4(out);
- }
-
- void mat4_to_dae_double(double out[][4], float in[][4])
- {
- float mat[4][4];
-
- mat4_to_dae(mat, in);
-
- for (int i = 0; i < 4; i++)
- for (int j = 0; j < 4; j++)
- out[i][j] = mat[i][j];
- }
+ void dae_matrix_to_mat4_(float out[][4], const COLLADABU::Math::Matrix4& in);
+
+ void mat4_to_dae(float out[][4], float in[][4]);
+
+ void mat4_to_dae_double(double out[][4], float in[][4]);
};
class TransformBase
{
public:
- void decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size)
- {
- mat4_to_size(size, mat);
- if (eul)
- mat4_to_eul(eul, mat);
- if (quat)
- mat4_to_quat(quat, mat);
- copy_v3_v3(loc, mat[3]);
- }
+ void decompose(float mat[][4], float *loc, float eul[3], float quat[4], float *size);
};
-#endif
+extern void clear_global_id_map();
+/** Look at documentation of translate_map */
+extern std::string translate_id(const std::string &id);
+
+extern std::string id_name(void *id);
+
+extern std::string get_geometry_id(Object *ob);
+
+extern std::string get_light_id(Object *ob);
+
+extern std::string get_joint_id(Bone *bone, Object *ob_arm);
+
+extern std::string get_camera_id(Object *ob);
+
+#endif /* COLLADA_INTERNAL_H */
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
new file mode 100644
index 00000000000..31ef8064b1f
--- /dev/null
+++ b/source/blender/collada/collada_utils.cpp
@@ -0,0 +1,109 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* COLLADABU_ASSERT, may be able to remove later */
+#include "COLLADABUPlatform.h"
+
+#include "COLLADAFWGeometry.h"
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWMeshVertexData.h"
+
+#include "DNA_customdata_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
+#include "BKE_object.h"
+
+#include "WM_api.h" // XXX hrm, see if we can do without this
+#include "WM_types.h"
+
+float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index)
+{
+ if (index >= array.getValuesCount())
+ return 0.0f;
+
+ if (array.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT)
+ return array.getFloatValues()->getData()[index];
+ else
+ return array.getDoubleValues()->getData()[index];
+}
+
+// copied from /editors/object/object_relations.c
+int bc_test_parent_loop(Object *par, Object *ob)
+{
+ /* test if 'ob' is a parent somewhere in par's parents */
+
+ if(par == NULL) return 0;
+ if(ob == par) return 1;
+
+ return bc_test_parent_loop(par->parent, ob);
+}
+
+// a shortened version of parent_set_exec()
+// if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting
+int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space)
+{
+ Object workob;
+ Main *bmain = CTX_data_main(C);
+ Scene *sce = CTX_data_scene(C);
+
+ if (!par || bc_test_parent_loop(par, ob))
+ return false;
+
+ ob->parent = par;
+ ob->partype = PAROBJECT;
+
+ ob->parsubstr[0] = 0;
+
+ if (is_parent_space) {
+ float mat[4][4];
+ // calc par->obmat
+ where_is_object(sce, par);
+
+ // move child obmat into world space
+ mul_m4_m4m4(mat, ob->obmat, par->obmat);
+ copy_m4_m4(ob->obmat, mat);
+ }
+
+ // apply child obmat (i.e. decompose it into rot/loc/size)
+ object_apply_mat4(ob, ob->obmat, 0, 0);
+
+ // compute parentinv
+ what_does_parent(sce, ob, &workob);
+ invert_m4_m4(ob->parentinv, workob.obmat);
+
+ ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
+ par->recalc |= OB_RECALC_OB;
+
+ DAG_scene_sort(bmain, sce);
+ DAG_ids_flush_update(bmain, 0);
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+
+ return true;
+}
+
diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h
new file mode 100644
index 00000000000..06cf8259dac
--- /dev/null
+++ b/source/blender/collada/collada_utils.h
@@ -0,0 +1,54 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file collada_utils.h
+ * \ingroup collada
+ */
+
+#ifndef __BC_UTILS_H__
+#define __BC_UTILS_H__
+
+#include "COLLADAFWMeshPrimitive.h"
+#include "COLLADAFWGeometry.h"
+#include "COLLADAFWFloatOrDoubleArray.h"
+#include "COLLADAFWTypes.h"
+
+#include <vector>
+#include <map>
+
+#include "DNA_object_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_texture_types.h"
+#include "BKE_context.h"
+
+typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
+
+extern float bc_get_float_value(const COLLADAFW::FloatOrDoubleArray& array, unsigned int index);
+
+extern int bc_test_parent_loop(Object *par, Object *ob);
+extern int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space=true);
+extern char *bc_CustomData_get_layer_name(const CustomData *data, int type, int n);
+extern char *bc_CustomData_get_active_layer_name(const CustomData *data, int type);
+
+#endif
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 2e2de166b6e..651cb66833d 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -19,40 +19,39 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(animation)
-ADD_SUBDIRECTORY(armature)
-ADD_SUBDIRECTORY(curve)
-ADD_SUBDIRECTORY(datafiles)
-ADD_SUBDIRECTORY(gpencil)
-ADD_SUBDIRECTORY(interface)
-ADD_SUBDIRECTORY(mesh)
-ADD_SUBDIRECTORY(metaball)
-ADD_SUBDIRECTORY(object)
-ADD_SUBDIRECTORY(physics)
-ADD_SUBDIRECTORY(render)
-ADD_SUBDIRECTORY(screen)
-ADD_SUBDIRECTORY(sculpt_paint)
-ADD_SUBDIRECTORY(sound)
-ADD_SUBDIRECTORY(space_action)
-ADD_SUBDIRECTORY(space_api)
-ADD_SUBDIRECTORY(space_buttons)
-ADD_SUBDIRECTORY(space_console)
-ADD_SUBDIRECTORY(space_file)
-ADD_SUBDIRECTORY(space_graph)
-ADD_SUBDIRECTORY(space_image)
-ADD_SUBDIRECTORY(space_info)
-ADD_SUBDIRECTORY(space_logic)
-ADD_SUBDIRECTORY(space_nla)
-ADD_SUBDIRECTORY(space_node)
-ADD_SUBDIRECTORY(space_outliner)
-ADD_SUBDIRECTORY(space_script)
-ADD_SUBDIRECTORY(space_sequencer)
-ADD_SUBDIRECTORY(space_sound)
-ADD_SUBDIRECTORY(space_text)
-ADD_SUBDIRECTORY(space_time)
-ADD_SUBDIRECTORY(space_userpref)
-ADD_SUBDIRECTORY(space_view3d)
-ADD_SUBDIRECTORY(transform)
-ADD_SUBDIRECTORY(util)
-ADD_SUBDIRECTORY(uvedit)
-
+add_subdirectory(animation)
+add_subdirectory(armature)
+add_subdirectory(curve)
+add_subdirectory(datafiles)
+add_subdirectory(gpencil)
+add_subdirectory(interface)
+add_subdirectory(mesh)
+add_subdirectory(metaball)
+add_subdirectory(object)
+add_subdirectory(physics)
+add_subdirectory(render)
+add_subdirectory(screen)
+add_subdirectory(sculpt_paint)
+add_subdirectory(sound)
+add_subdirectory(space_action)
+add_subdirectory(space_api)
+add_subdirectory(space_buttons)
+add_subdirectory(space_console)
+add_subdirectory(space_file)
+add_subdirectory(space_graph)
+add_subdirectory(space_image)
+add_subdirectory(space_info)
+add_subdirectory(space_logic)
+add_subdirectory(space_nla)
+add_subdirectory(space_node)
+add_subdirectory(space_outliner)
+add_subdirectory(space_script)
+add_subdirectory(space_sequencer)
+add_subdirectory(space_sound)
+add_subdirectory(space_text)
+add_subdirectory(space_time)
+add_subdirectory(space_userpref)
+add_subdirectory(space_view3d)
+add_subdirectory(transform)
+add_subdirectory(util)
+add_subdirectory(uvedit)
diff --git a/source/blender/editors/Makefile b/source/blender/editors/Makefile
deleted file mode 100644
index 168d919e6de..00000000000
--- a/source/blender/editors/Makefile
+++ /dev/null
@@ -1,71 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/editors
-DIRS = armature \
- mesh \
- animation \
- object \
- sculpt_paint \
- datafiles \
- transform \
- screen \
- curve \
- metaball \
- gpencil \
- physics \
- render \
- uvedit \
- space_outliner \
- space_time \
- space_view3d \
- interface \
- util \
- space_api \
- space_console \
- space_graph \
- space_image \
- space_node \
- space_buttons \
- space_info \
- space_file \
- space_sound \
- space_action \
- space_nla \
- space_script \
- space_text \
- space_sequencer \
- space_logic \
- space_userpref \
- sound
-
-include nan_subdirs.mk
diff --git a/source/blender/editors/SConscript b/source/blender/editors/SConscript
index 226e9247f91..e8159bdf03f 100644
--- a/source/blender/editors/SConscript
+++ b/source/blender/editors/SConscript
@@ -3,38 +3,38 @@ Import ('env')
SConscript(['datafiles/SConscript',
- 'space_api/SConscript',
- 'util/SConscript',
- 'interface/SConscript',
- 'animation/SConscript',
- 'armature/SConscript',
- 'mesh/SConscript',
- 'metaball/SConscript',
- 'object/SConscript',
- 'curve/SConscript',
- 'gpencil/SConscript',
- 'physics/SConscript',
- 'render/SConscript',
- 'sound/SConscript',
- 'space_buttons/SConscript',
- 'space_file/SConscript',
- 'space_image/SConscript',
- 'space_info/SConscript',
- 'space_graph/SConscript',
- 'space_node/SConscript',
- 'space_outliner/SConscript',
- 'space_time/SConscript',
- 'space_view3d/SConscript',
- 'space_sound/SConscript',
- 'space_action/SConscript',
- 'space_nla/SConscript',
- 'space_script/SConscript',
- 'space_text/SConscript',
- 'space_sequencer/SConscript',
- 'space_logic/SConscript',
- 'space_console/SConscript',
- 'space_userpref/SConscript',
- 'transform/SConscript',
- 'screen/SConscript',
- 'sculpt_paint/SConscript',
- 'uvedit/SConscript'])
+ 'space_api/SConscript',
+ 'util/SConscript',
+ 'interface/SConscript',
+ 'animation/SConscript',
+ 'armature/SConscript',
+ 'mesh/SConscript',
+ 'metaball/SConscript',
+ 'object/SConscript',
+ 'curve/SConscript',
+ 'gpencil/SConscript',
+ 'physics/SConscript',
+ 'render/SConscript',
+ 'sound/SConscript',
+ 'space_buttons/SConscript',
+ 'space_file/SConscript',
+ 'space_image/SConscript',
+ 'space_info/SConscript',
+ 'space_graph/SConscript',
+ 'space_node/SConscript',
+ 'space_outliner/SConscript',
+ 'space_time/SConscript',
+ 'space_view3d/SConscript',
+ 'space_sound/SConscript',
+ 'space_action/SConscript',
+ 'space_nla/SConscript',
+ 'space_script/SConscript',
+ 'space_text/SConscript',
+ 'space_sequencer/SConscript',
+ 'space_logic/SConscript',
+ 'space_console/SConscript',
+ 'space_userpref/SConscript',
+ 'transform/SConscript',
+ 'screen/SConscript',
+ 'sculpt_paint/SConscript',
+ 'uvedit/SConscript'])
diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt
index d5eef6bbd34..f506d278cae 100644
--- a/source/blender/editors/animation/CMakeLists.txt
+++ b/source/blender/editors/animation/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../makesdna
../../makesrna
@@ -31,4 +30,24 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_animation "${SRC}" "${INC}")
+set(SRC
+ anim_channels_defines.c
+ anim_channels_edit.c
+ anim_deps.c
+ anim_draw.c
+ anim_filter.c
+ anim_ipo_utils.c
+ anim_markers.c
+ anim_ops.c
+ drivers.c
+ fmodifier_ui.c
+ keyframes_draw.c
+ keyframes_edit.c
+ keyframes_general.c
+ keyframing.c
+ keyingsets.c
+
+ anim_intern.h
+)
+
+blender_add_lib(bf_editor_animation "${SRC}" "${INC}")
diff --git a/source/blender/editors/animation/Makefile b/source/blender/editors/animation/Makefile
deleted file mode 100644
index f120091e917..00000000000
--- a/source/blender/editors/animation/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_animation
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/animation/SConscript b/source/blender/editors/animation/SConscript
index ec4b577b349..17f8d32ccf1 100644
--- a/source/blender/editors/animation/SConscript
+++ b/source/blender/editors/animation/SConscript
@@ -4,7 +4,11 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
+<<<<<<< .working
incs += ' ../../windowmanager ../../bmesh'
incs += ' #/intern/guardedalloc #/extern/glew/include'
+=======
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
+>>>>>>> .merge-right.r35190
env.BlenderLib ( 'bf_editors_animation', sources, Split(incs), [], libtype=['core'], priority=[125] )
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 09fbdf2d70d..1e2112bf82f 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
+#include <stdio.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -42,16 +43,20 @@
#include "DNA_space_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_meta_types.h"
#include "DNA_node_types.h"
#include "DNA_world_types.h"
+#include "DNA_gpencil_types.h"
#include "RNA_access.h"
+
#include "BKE_curve.h"
#include "BKE_key.h"
#include "BKE_context.h"
+#include "BKE_utildefines.h" /* FILE_MAX */
#include "UI_interface.h"
#include "UI_interface_icons.h"
@@ -61,6 +66,7 @@
#include "ED_keyframing.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -74,6 +80,8 @@
/* size of indent steps */
#define INDENT_STEP_SIZE 7
+#define ANIM_CHAN_NAME_SIZE 256
+
/* macros used for type defines */
/* get the pointer used for some flag */
#define GET_ACF_FLAG_PTR(ptr) \
@@ -83,18 +91,13 @@
}
-/* XXX */
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
-
-
/* *********************************************** */
/* Generic Functions (Type independent) */
/* Draw Backdrop ---------------------------------- */
/* get backdrop color for top-level widgets (Scene and Object only) */
-static void acf_generic_root_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_generic_root_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
/* darker blue for top-level widgets */
UI_GetThemeColor3fv(TH_DOPESHEET_CHANNELOB, color);
@@ -115,12 +118,12 @@ static void acf_generic_root_backdrop(bAnimContext *ac, bAnimListElem *ale, floa
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
uiSetRoundBox((expanded)? (1):(1|8));
- gl_round_box(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
+ uiDrawBox(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
/* get backdrop color for data expanders under top-level Scene/Object */
-static void acf_generic_dataexpand_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_generic_dataexpand_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
/* lighter color than top-level widget */
UI_GetThemeColor3fv(TH_DOPESHEET_CHANNELSUBOB, color);
@@ -166,7 +169,7 @@ static void acf_generic_channel_color(bAnimContext *ac, bAnimListElem *ale, floa
if ( (saction && !(saction->flag & SACTION_NODRAWGCOLORS)) &&
((grp) && (grp->customCol)) )
{
- char cp[3];
+ unsigned char cp[3];
if (indent == 2) {
VECCOPY(cp, grp->cs.solid);
@@ -207,11 +210,11 @@ static void acf_generic_channel_backdrop(bAnimContext *ac, bAnimListElem *ale, f
/* Indention + Offset ------------------------------------------- */
/* indention level is always the value in the name */
-static short acf_generic_indention_0(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_0(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 0;
}
-static short acf_generic_indention_1(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_1(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 1;
}
@@ -223,7 +226,7 @@ static short acf_generic_indention_2(bAnimContext *ac, bAnimListElem *ale)
#endif
/* indention which varies with the grouping status */
-static short acf_generic_indention_flexible(bAnimContext *ac, bAnimListElem *ale)
+static short acf_generic_indention_flexible(bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
short indent= 0;
@@ -303,7 +306,7 @@ static void acf_generic_idblock_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (id && name)
- strcpy(name, id->name+2);
+ BLI_strncpy(name, id->name+2, ANIM_CHAN_NAME_SIZE);
}
/* Settings ------------------------------------------- */
@@ -357,7 +360,7 @@ static void *acf_generic_dsexpand_setting_ptr(bAnimListElem *ale, int setting, s
}
/* check if some setting exists for this object-based data-expander (datablock only) */
-static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* expand is always supported */
@@ -380,7 +383,7 @@ static short acf_generic_dataexpand_setting_valid(bAnimContext *ac, bAnimListEle
/* Animation Summary ----------------------------------- */
/* get backdrop color for summary widget */
-static void acf_summary_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_summary_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
// FIXME: hardcoded color - same as the 'action' line in NLA
// reddish color
@@ -405,31 +408,31 @@ static void acf_summary_backdrop(bAnimContext *ac, bAnimListElem *ale, float ymi
* - special hack: make the top a bit higher, since we are first...
*/
uiSetRoundBox((1|8));
- gl_round_box(GL_POLYGON, 0, yminc-2, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
+ uiDrawBox(GL_POLYGON, 0, yminc-2, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
/* name for summary entries */
-static void acf_summary_name(bAnimListElem *ale, char *name)
+static void acf_summary_name(bAnimListElem *UNUSED(ale), char *name)
{
if (name)
- strcpy(name, "DopeSheet Summary");
+ BLI_strncpy(name, "DopeSheet Summary", ANIM_CHAN_NAME_SIZE);
}
// TODO: this is really a temp icon I think
-static int acf_summary_icon(bAnimListElem *ale)
+static int acf_summary_icon(bAnimListElem *UNUSED(ale))
{
return ICON_BORDERMOVE;
}
/* check if some setting exists for this channel */
-static short acf_summary_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_summary_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
/* only expanded is supported, as it is used for hiding all stuff which the summary covers */
return (setting == ACHANNEL_SETTING_EXPAND);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_summary_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_summary_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
if (setting == ACHANNEL_SETTING_EXPAND) {
/* expanded */
@@ -461,7 +464,7 @@ static void *acf_summary_setting_ptr(bAnimListElem *ale, int setting, short *typ
else {
/* can't return anything useful - unsupported */
*type= 0;
- return 0;
+ return NULL;
}
}
@@ -486,13 +489,13 @@ static bAnimChannelType ACF_SUMMARY =
/* Scene ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_scene_icon(bAnimListElem *ale)
+static int acf_scene_icon(bAnimListElem *UNUSED(ale))
{
return ICON_SCENE_DATA;
}
/* check if some setting exists for this channel */
-static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* muted only in NLA */
@@ -514,7 +517,7 @@ static short acf_scene_setting_valid(bAnimContext *ac, bAnimListElem *ale, int s
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_scene_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_scene_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -562,7 +565,7 @@ static void *acf_scene_setting_ptr(bAnimListElem *ale, int setting, short *type)
return NULL;
default: /* unsupported */
- return 0;
+ return NULL;
}
}
@@ -628,7 +631,7 @@ static void acf_object_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (ob && name)
- strcpy(name, ob->id.name+2);
+ BLI_strncpy(name, ob->id.name+2, ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
@@ -657,7 +660,7 @@ static short acf_object_setting_valid(bAnimContext *ac, bAnimListElem *ale, int
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_object_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_object_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -706,7 +709,7 @@ static void *acf_object_setting_ptr(bAnimListElem *ale, int setting, short *type
return NULL;
default: /* unsupported */
- return 0;
+ return NULL;
}
}
@@ -731,7 +734,7 @@ static bAnimChannelType ACF_OBJECT =
/* Group ------------------------------------------- */
/* get backdrop color for group widget */
-static void acf_group_color(bAnimContext *ac, bAnimListElem *ale, float *color)
+static void acf_group_color(bAnimContext *UNUSED(ac), bAnimListElem *ale, float *color)
{
/* highlight only for action group channels */
if (ale->flag & AGRP_ACTIVE)
@@ -755,7 +758,7 @@ static void acf_group_backdrop(bAnimContext *ac, bAnimListElem *ale, float yminc
/* rounded corners on LHS only - top only when expanded, but bottom too when collapsed */
uiSetRoundBox((expanded)? (1):(1|8));
- gl_round_box(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
+ uiDrawBox(GL_POLYGON, offset, yminc, v2d->cur.xmax+EXTRA_SCROLL_PAD, ymaxc, 8);
}
/* name for group entries */
@@ -765,11 +768,11 @@ static void acf_group_name(bAnimListElem *ale, char *name)
/* just copy the name... */
if (agrp && name)
- strcpy(name, agrp->name);
+ BLI_strncpy(name, agrp->name, ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
-static short acf_group_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_group_setting_valid(bAnimContext *ac, bAnimListElem *UNUSED(ale), int setting)
{
/* for now, all settings are supported, though some are only conditionally */
switch (setting) {
@@ -819,7 +822,7 @@ static int acf_group_setting_flag(bAnimContext *ac, int setting, short *neg)
}
/* get pointer to the setting */
-static void *acf_group_setting_ptr(bAnimListElem *ale, int setting, short *type)
+static void *acf_group_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
{
bActionGroup *agrp= (bActionGroup *)ale->data;
@@ -880,7 +883,7 @@ static short acf_fcurve_setting_valid(bAnimContext *ac, bAnimListElem *ale, int
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fcurve_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fcurve_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -905,7 +908,7 @@ static int acf_fcurve_setting_flag(bAnimContext *ac, int setting, short *neg)
}
/* get pointer to the setting */
-static void *acf_fcurve_setting_ptr(bAnimListElem *ale, int setting, short *type)
+static void *acf_fcurve_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
{
FCurve *fcu= (FCurve *)ale->data;
@@ -934,13 +937,13 @@ static bAnimChannelType ACF_FCURVE =
/* Object Action Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillactd_icon(bAnimListElem *ale)
+static int acf_fillactd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ACTION;
}
/* check if some setting exists for this channel */
-static short acf_fillactd_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_fillactd_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* only select and expand supported */
@@ -954,7 +957,7 @@ static short acf_fillactd_setting_valid(bAnimContext *ac, bAnimListElem *ale, in
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillactd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillactd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -987,13 +990,13 @@ static void *acf_fillactd_setting_ptr(bAnimListElem *ale, int setting, short *ty
GET_ACF_FLAG_PTR(adt->flag);
}
else
- return 0;
+ return NULL;
case ACHANNEL_SETTING_EXPAND: /* expanded */
GET_ACF_FLAG_PTR(act->flag);
default: /* unsupported */
- return 0;
+ return NULL;
}
}
@@ -1018,19 +1021,19 @@ static bAnimChannelType ACF_FILLACTD =
/* Drivers Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_filldrivers_icon(bAnimListElem *ale)
+static int acf_filldrivers_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ANIM_DATA;
}
-static void acf_filldrivers_name(bAnimListElem *ale, char *name)
+static void acf_filldrivers_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Drivers");
+ BLI_strncpy(name, "Drivers", ANIM_CHAN_NAME_SIZE);
}
/* check if some setting exists for this channel */
// TODO: this could be made more generic
-static short acf_filldrivers_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_filldrivers_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
/* only expand supported */
@@ -1043,7 +1046,7 @@ static short acf_filldrivers_setting_valid(bAnimContext *ac, bAnimListElem *ale,
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_filldrivers_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_filldrivers_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1071,7 +1074,7 @@ static void *acf_filldrivers_setting_ptr(bAnimListElem *ale, int setting, short
GET_ACF_FLAG_PTR(adt->flag);
default: /* unsupported */
- return 0;
+ return NULL;
}
}
@@ -1096,18 +1099,18 @@ static bAnimChannelType ACF_FILLDRIVERS =
/* Materials Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillmatd_icon(bAnimListElem *ale)
+static int acf_fillmatd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MATERIAL_DATA;
}
-static void acf_fillmatd_name(bAnimListElem *ale, char *name)
+static void acf_fillmatd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Materials");
+ BLI_strncpy(name, "Materials", ANIM_CHAN_NAME_SIZE);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillmatd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillmatd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1142,18 +1145,18 @@ static bAnimChannelType ACF_FILLMATD=
/* Particles Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_fillpartd_icon(bAnimListElem *ale)
+static int acf_fillpartd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_PARTICLE_DATA;
}
-static void acf_fillpartd_name(bAnimListElem *ale, char *name)
+static void acf_fillpartd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Particles");
+ BLI_strncpy(name, "Particles", ANIM_CHAN_NAME_SIZE);
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_fillpartd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_fillpartd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1210,14 +1213,14 @@ static short acf_filltexd_offset(bAnimContext *ac, bAnimListElem *ale)
}
// TODO: just get this from RNA?
-static int acf_filltexd_icon(bAnimListElem *ale)
+static int acf_filltexd_icon(bAnimListElem *UNUSED(ale))
{
return ICON_TEXTURE_DATA;
}
-static void acf_filltexd_name(bAnimListElem *ale, char *name)
+static void acf_filltexd_name(bAnimListElem *UNUSED(ale), char *name)
{
- strcpy(name, "Textures");
+ BLI_strncpy(name, "Textures", ANIM_CHAN_NAME_SIZE);
}
/* get pointer to the setting (category only) */
@@ -1258,7 +1261,7 @@ static void *acf_filltexd_setting_ptr(bAnimListElem *ale, int setting, short *ty
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_filltexd_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_filltexd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1294,19 +1297,19 @@ static bAnimChannelType ACF_FILLTEXD=
/* Material Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmat_icon(bAnimListElem *ale)
+static int acf_dsmat_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MATERIAL_DATA;
}
/* offset for material expanders */
-static short acf_dsmat_offset(bAnimContext *ac, bAnimListElem *ale)
+static short acf_dsmat_offset(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale))
{
return 21;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmat_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmat_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1376,13 +1379,13 @@ static bAnimChannelType ACF_DSMAT=
/* Lamp Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dslam_icon(bAnimListElem *ale)
+static int acf_dslam_icon(bAnimListElem *UNUSED(ale))
{
return ICON_LAMP_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dslam_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dslam_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1452,13 +1455,13 @@ static bAnimChannelType ACF_DSLAM=
/* Texture Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dstex_icon(bAnimListElem *ale)
+static int acf_dstex_icon(bAnimListElem *UNUSED(ale))
{
return ICON_TEXTURE_DATA;
}
/* offset for texture expanders */
-static short acf_dstex_offset(bAnimContext *ac, bAnimListElem *ale)
+static short acf_dstex_offset(bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
short offset = 21;
@@ -1477,7 +1480,7 @@ static short acf_dstex_offset(bAnimContext *ac, bAnimListElem *ale)
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dstex_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dstex_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1547,13 +1550,13 @@ static bAnimChannelType ACF_DSTEX=
/* Camera Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dscam_icon(bAnimListElem *ale)
+static int acf_dscam_icon(bAnimListElem *UNUSED(ale))
{
return ICON_CAMERA_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dscam_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dscam_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1639,7 +1642,7 @@ static int acf_dscur_icon(bAnimListElem *ale)
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dscur_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dscur_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1709,13 +1712,13 @@ static bAnimChannelType ACF_DSCUR=
/* Shape Key Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsskey_icon(bAnimListElem *ale)
+static int acf_dsskey_icon(bAnimListElem *UNUSED(ale))
{
return ICON_SHAPEKEY_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsskey_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsskey_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1785,13 +1788,13 @@ static bAnimChannelType ACF_DSSKEY=
/* World Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dswor_icon(bAnimListElem *ale)
+static int acf_dswor_icon(bAnimListElem *UNUSED(ale))
{
return ICON_WORLD_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dswor_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dswor_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1861,13 +1864,13 @@ static bAnimChannelType ACF_DSWOR=
/* Particle Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dspart_icon(bAnimListElem *ale)
+static int acf_dspart_icon(bAnimListElem *UNUSED(ale))
{
return ICON_PARTICLE_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dspart_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dspart_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -1937,13 +1940,13 @@ static bAnimChannelType ACF_DSPART=
/* MetaBall Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmball_icon(bAnimListElem *ale)
+static int acf_dsmball_icon(bAnimListElem *UNUSED(ale))
{
return ICON_META_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmball_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmball_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2013,13 +2016,13 @@ static bAnimChannelType ACF_DSMBALL=
/* Armature Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsarm_icon(bAnimListElem *ale)
+static int acf_dsarm_icon(bAnimListElem *UNUSED(ale))
{
return ICON_ARMATURE_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsarm_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsarm_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2089,13 +2092,13 @@ static bAnimChannelType ACF_DSARM=
/* NodeTree Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsntree_icon(bAnimListElem *ale)
+static int acf_dsntree_icon(bAnimListElem *UNUSED(ale))
{
return ICON_NODETREE;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsntree_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsntree_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2165,13 +2168,13 @@ static bAnimChannelType ACF_DSNTREE=
/* Mesh Expander ------------------------------------------- */
// TODO: just get this from RNA?
-static int acf_dsmesh_icon(bAnimListElem *ale)
+static int acf_dsmesh_icon(bAnimListElem *UNUSED(ale))
{
return ICON_MESH_DATA;
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_dsmesh_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_dsmesh_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2238,6 +2241,82 @@ static bAnimChannelType ACF_DSMESH=
acf_dsmesh_setting_ptr /* pointer for setting */
};
+/* Lattice Expander ------------------------------------------- */
+
+// TODO: just get this from RNA?
+static int acf_dslat_icon(bAnimListElem *UNUSED(ale))
+{
+ return ICON_LATTICE_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_dslat_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return LT_DS_EXPAND;
+
+ case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
+ return ADT_NLA_EVAL_OFF;
+
+ case ACHANNEL_SETTING_VISIBLE: /* visible (only in Graph Editor) */
+ *neg= 1;
+ return ADT_CURVES_NOT_VISIBLE;
+
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return ADT_UI_SELECTED;
+
+ default: /* unsupported */
+ return 0;
+ }
+}
+
+/* get pointer to the setting */
+static void *acf_dslat_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+ Lattice *lt= (Lattice *)ale->data;
+
+ /* clear extra return data first */
+ *type= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ GET_ACF_FLAG_PTR(lt->flag);
+
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+ case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+ if (lt->adt)
+ GET_ACF_FLAG_PTR(lt->adt->flag)
+ else
+ return NULL;
+
+ default: /* unsupported */
+ return NULL;
+ }
+}
+
+/* node tree expander type define */
+static bAnimChannelType ACF_DSLAT=
+{
+ "Lattice Expander", /* type name */
+
+ acf_generic_dataexpand_color, /* backdrop color */
+ acf_generic_dataexpand_backdrop,/* backdrop */
+ acf_generic_indention_1, /* indent level */ // XXX this only works for compositing
+ acf_generic_basic_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_dslat_icon, /* icon */
+
+ acf_generic_dataexpand_setting_valid, /* has setting */
+ acf_dslat_setting_flag, /* flag for setting */
+ acf_dslat_setting_ptr /* pointer for setting */
+};
+
/* ShapeKey Entry ------------------------------------------- */
/* name for ShapeKey */
@@ -2249,14 +2328,14 @@ static void acf_shapekey_name(bAnimListElem *ale, char *name)
if (kb && name) {
/* if the KeyBlock had a name, use it, otherwise use the index */
if (kb->name[0])
- strcpy(name, kb->name);
+ BLI_strncpy(name, kb->name, ANIM_CHAN_NAME_SIZE);
else
- sprintf(name, "Key %d", ale->index);
+ BLI_snprintf(name, ANIM_CHAN_NAME_SIZE, "Key %d", ale->index);
}
}
/* check if some setting exists for this channel */
-static short acf_shapekey_setting_valid(bAnimContext *ac, bAnimListElem *ale, int setting)
+static short acf_shapekey_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
{
switch (setting) {
case ACHANNEL_SETTING_SELECT: /* selected */
@@ -2271,7 +2350,7 @@ static short acf_shapekey_setting_valid(bAnimContext *ac, bAnimListElem *ale, in
}
/* get the appropriate flag(s) for the setting when it is valid */
-static int acf_shapekey_setting_flag(bAnimContext *ac, int setting, short *neg)
+static int acf_shapekey_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
{
/* clear extra return data first */
*neg= 0;
@@ -2328,126 +2407,154 @@ static bAnimChannelType ACF_SHAPEKEY=
acf_shapekey_setting_ptr /* pointer for setting */
};
-/* Grease Pencil entries ------------------------------------------- */
-// XXX ... this is currently not restored yet
+/* GPencil Datablock ------------------------------------------- */
-#if 0
-static void dummy_olddraw_gpencil ()
+/* get backdrop color for gpencil datablock widget */
+static void acf_gpd_color(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), float *color)
{
- /* determine what needs to be drawn */
- switch (ale->type) {
- case ANIMTYPE_GPDATABLOCK: /* gpencil datablock */
- {
- bGPdata *gpd = (bGPdata *)ale->data;
- ScrArea *sa = (ScrArea *)ale->owner; // XXX depreceated...
-
- indent = 0;
- group= 3;
+ /* these are ID-blocks, but not exactly standalone... */
+ UI_GetThemeColorShade3fv(TH_DOPESHEET_CHANNELSUBOB, 20, color);
+}
+
+// TODO: just get this from RNA?
+static int acf_gpd_icon(bAnimListElem *UNUSED(ale))
+{
+ return ICON_GREASEPENCIL;
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpd_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+ switch (setting) {
+ /* only select and expand supported */
+ case ACHANNEL_SETTING_SELECT:
+ case ACHANNEL_SETTING_EXPAND:
+ return 1;
- /* only show expand if there are any channels */
- if (gpd->layers.first) {
- if (gpd->flag & GP_DATA_EXPAND)
- expand = ICON_TRIA_DOWN;
- else
- expand = ICON_TRIA_RIGHT;
- }
+ default:
+ return 0;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_gpd_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return AGRP_SELECTED;
- switch (sa->spacetype) {
- case SPACE_VIEW3D:
- {
- /* this shouldn't cause any overflow... */
- //sprintf(name, "View3D:%s", view3d_get_name(sa->spacedata.first)); // XXX missing func..
- strcpy(name, "View3D");
- special= ICON_VIEW3D;
- }
- break;
- case SPACE_NODE:
- {
- SpaceNode *snode= sa->spacedata.first;
- char treetype[12];
-
- if (snode->treetype == 1)
- strcpy(treetype, "Composite");
- else
- strcpy(treetype, "Material");
- sprintf(name, "Nodes:%s", treetype);
-
- special= ICON_NODETREE;
- }
- break;
- case SPACE_SEQ:
- {
- SpaceSeq *sseq= sa->spacedata.first;
- char imgpreview[10];
-
- switch (sseq->mainb) {
- case 1: sprintf(imgpreview, "Image..."); break;
- case 2: sprintf(imgpreview, "Luma..."); break;
- case 3: sprintf(imgpreview, "Chroma..."); break;
- case 4: sprintf(imgpreview, "Histogram"); break;
-
- default: sprintf(imgpreview, "Sequence"); break;
- }
- sprintf(name, "Sequencer:%s", imgpreview);
-
- special= ICON_SEQUENCE;
- }
- break;
- case SPACE_IMAGE:
- {
- SpaceImage *sima= sa->spacedata.first;
-
- if (sima->image)
- sprintf(name, "Image:%s", sima->image->id.name+2);
- else
- strcpy(name, "Image:<None>");
-
- special= ICON_IMAGE_COL;
- }
- break;
-
- default:
- {
- sprintf(name, "<Unknown GP-Data Source>");
- special= -1;
- }
- break;
- }
- }
- break;
- case ANIMTYPE_GPLAYER: /* gpencil layer */
- {
- bGPDlayer *gpl = (bGPDlayer *)ale->data;
+ case ACHANNEL_SETTING_EXPAND: /* expanded */
+ return GP_DATA_EXPAND;
+ }
+
+ /* this shouldn't happen */
+ return 0;
+}
+
+/* get pointer to the setting */
+static void *acf_gpd_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+ bGPdata *gpd= (bGPdata *)ale->data;
+
+ /* all flags are just in gpd->flag for now... */
+ GET_ACF_FLAG_PTR(gpd->flag);
+}
+
+/* gpencil datablock type define */
+static bAnimChannelType ACF_GPD =
+{
+ "GPencil Datablock", /* type name */
+
+ acf_gpd_color, /* backdrop color */
+ acf_group_backdrop, /* backdrop */
+ acf_generic_indention_0, /* indent level */
+ acf_generic_group_offset, /* offset */
+
+ acf_generic_idblock_name, /* name */
+ acf_gpd_icon, /* icon */
+
+ acf_gpd_setting_valid, /* has setting */
+ acf_gpd_setting_flag, /* flag for setting */
+ acf_gpd_setting_ptr /* pointer for setting */
+};
+
+/* GPencil Layer ------------------------------------------- */
+
+/* name for grase pencil layer entries */
+static void acf_gpl_name(bAnimListElem *ale, char *name)
+{
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+
+ if (gpl && name)
+ BLI_strncpy(name, gpl->info, ANIM_CHAN_NAME_SIZE);
+}
+
+/* check if some setting exists for this channel */
+static short acf_gpl_setting_valid(bAnimContext *UNUSED(ac), bAnimListElem *UNUSED(ale), int setting)
+{
+ switch (setting) {
+ /* unsupported */
+ case ACHANNEL_SETTING_EXPAND: /* gpencil layers are more like F-Curves than groups */
+ case ACHANNEL_SETTING_VISIBLE: /* graph editor only */
+ return 0;
+
+ /* always available */
+ default:
+ return 1;
+ }
+}
+
+/* get the appropriate flag(s) for the setting when it is valid */
+static int acf_gpl_setting_flag(bAnimContext *UNUSED(ac), int setting, short *neg)
+{
+ /* clear extra return data first */
+ *neg= 0;
+
+ switch (setting) {
+ case ACHANNEL_SETTING_SELECT: /* selected */
+ return GP_LAYER_SELECT;
- indent = 0;
- special = -1;
- expand = -1;
- group = 1;
+ case ACHANNEL_SETTING_MUTE: /* muted */
+ return GP_LAYER_HIDE;
- if (EDITABLE_GPL(gpl))
- protect = ICON_UNLOCKED;
- else
- protect = ICON_LOCKED;
-
- if (gpl->flag & GP_LAYER_HIDE)
- mute = ICON_MUTE_IPO_ON;
- else
- mute = ICON_MUTE_IPO_OFF;
+ case ACHANNEL_SETTING_PROTECT: /* protected */
+ //*neg= 1; - if we change this to edtiability
+ return GP_LAYER_LOCKED;
- sel = SEL_GPL(gpl);
- BLI_snprintf(name, 32, gpl->info);
- }
- break;
- }
-
- if (group == 3) {
- /* only for gp-data channels */
- UI_ThemeColorShade(TH_GROUP, 20);
- uiSetRoundBox((expand == ICON_TRIA_DOWN)? (1):(1|8));
- gl_round_box(GL_POLYGON, x+offset, yminc, (float)ACHANNEL_NAMEWIDTH, ymaxc, 8);
+ default: /* unsupported */
+ return 0;
}
}
-#endif
+
+/* get pointer to the setting */
+static void *acf_gpl_setting_ptr(bAnimListElem *ale, int UNUSED(setting), short *type)
+{
+ bGPDlayer *gpl= (bGPDlayer *)ale->data;
+
+ /* all flags are just in agrp->flag for now... */
+ GET_ACF_FLAG_PTR(gpl->flag);
+}
+
+/* grease pencil layer type define */
+static bAnimChannelType ACF_GPL =
+{
+ "GPencil Layer", /* type name */
+
+ acf_generic_channel_color, /* backdrop color */
+ acf_generic_channel_backdrop, /* backdrop */
+ acf_generic_indention_flexible, /* indent level */
+ acf_generic_group_offset, /* offset */
+
+ acf_gpl_name, /* name */
+ NULL, /* icon */
+
+ acf_gpl_setting_valid, /* has setting */
+ acf_gpl_setting_flag, /* flag for setting */
+ acf_gpl_setting_ptr /* pointer for setting */
+};
/* *********************************************** */
/* Type Registration and General Access */
@@ -2457,7 +2564,7 @@ static bAnimChannelType *animchannelTypeInfo[ANIMTYPE_NUM_TYPES];
static short ACF_INIT= 1; /* when non-zero, the list needs to be updated */
/* Initialise type info definitions */
-void ANIM_init_channel_typeinfo_data (void)
+static void ANIM_init_channel_typeinfo_data (void)
{
int type= 0;
@@ -2494,12 +2601,12 @@ void ANIM_init_channel_typeinfo_data (void)
animchannelTypeInfo[type++]= &ACF_DSARM; /* Armature Channel */
animchannelTypeInfo[type++]= &ACF_DSMESH; /* Mesh Channel */
animchannelTypeInfo[type++]= &ACF_DSTEX; /* Texture Channel */
+ animchannelTypeInfo[type++]= &ACF_DSLAT; /* Lattice Channel */
animchannelTypeInfo[type++]= &ACF_SHAPEKEY; /* ShapeKey */
- // XXX not restored yet
- animchannelTypeInfo[type++]= NULL; /* Grease Pencil Datablock */
- animchannelTypeInfo[type++]= NULL; /* Grease Pencil Layer */
+ animchannelTypeInfo[type++]= &ACF_GPD; /* Grease Pencil Datablock */
+ animchannelTypeInfo[type++]= &ACF_GPL; /* Grease Pencil Layer */
// TODO: these types still need to be implemented!!!
// probably need a few extra flags for these special cases...
@@ -2538,14 +2645,14 @@ void ANIM_channel_debug_print_info (bAnimListElem *ale, short indent_level)
/* print info */
if (acf) {
- char name[256]; /* hopefully this will be enough! */
+ char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
/* get UI name */
if (acf->name)
acf->name(ale, name);
else
- sprintf(name, "<No name>");
-
+ BLI_strncpy(name, "<No name>", sizeof(name));
+
/* print type name + ui name */
printf("ChanType: <%s> Name: \"%s\"\n", acf->channel_type_name, name);
}
@@ -2777,7 +2884,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
/* step 5) draw name ............................................... */
if (acf->name) {
- char name[256]; /* hopefully this will be enough! */
+ char name[ANIM_CHAN_NAME_SIZE]; /* hopefully this will be enough! */
/* set text color */
if (selected)
@@ -2790,6 +2897,17 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
offset += 3;
UI_DrawString(offset, ytext, name);
+
+ /* draw red underline if channel is disabled */
+ if ((ale->type == ANIMTYPE_FCURVE) && (ale->flag & FCURVE_DISABLED))
+ {
+ // FIXME: replace hardcoded color here, and check on extents!
+ glColor3f(1.0f, 0.0f, 0.0f);
+ glLineWidth(2.0);
+ fdrawline((float)(offset), yminc,
+ (float)(v2d->cur.xmax), yminc);
+ glLineWidth(1.0);
+ }
}
/* step 6) draw backdrops behidn mute+protection toggles + (sliders) ....................... */
@@ -2856,7 +2974,7 @@ void ANIM_channel_draw (bAnimContext *ac, bAnimListElem *ale, float yminc, float
/* ------------------ */
/* callback for (normal) widget settings - send notifiers */
-static void achannel_setting_widget_cb(bContext *C, void *poin, void *poin2)
+static void achannel_setting_widget_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
}
@@ -2910,6 +3028,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
ID *id= (ID *)id_poin;
FCurve *fcu= (FCurve *)fcu_poin;
+ ReportList *reports = CTX_wm_reports(C);
Scene *scene= CTX_data_scene(C);
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -2933,7 +3052,7 @@ static void achannel_setting_slider_cb(bContext *C, void *id_poin, void *fcu_poi
flag |= INSERTKEY_REPLACE;
/* insert a keyframe for this F-Curve */
- done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ done= insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
if (done)
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
@@ -2947,6 +3066,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
KeyBlock *kb= (KeyBlock *)kb_poin;
char *rna_path= key_get_curValue_rnaPath(key, kb);
+ ReportList *reports = CTX_wm_reports(C);
Scene *scene= CTX_data_scene(C);
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -2975,7 +3095,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi
flag |= INSERTKEY_REPLACE;
/* insert a keyframe for this F-Curve */
- done= insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ done= insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
if (done)
WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
@@ -2992,7 +3112,7 @@ static void draw_setting_widget (bAnimContext *ac, bAnimListElem *ale, bAnimChan
short negflag, ptrsize, enabled, butType;
int flag, icon;
void *ptr;
- char *tooltip;
+ const char *tooltip;
uiBut *but = NULL;
/* get the flag and the pointer to that flag */
@@ -3244,7 +3364,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b
uiBut *but;
/* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
- but= uiDefAutoButR(block, &ptr, prop, array_index, "", 0, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
+ but= uiDefAutoButR(block, &ptr, prop, array_index, "", ICON_NULL, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
/* assign keyframing function according to slider type */
if (ale->type == ANIMTYPE_SHAPEKEY)
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index e229de42006..aa09cd0ac01 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -110,6 +116,8 @@ void ANIM_set_active_channel (bAnimContext *ac, void *data, short datatype, int
case ANIMTYPE_DSMBALL:
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
+ case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
if (ale->adt) {
@@ -153,8 +161,10 @@ void ANIM_set_active_channel (bAnimContext *ac, void *data, short datatype, int
case ANIMTYPE_DSMBALL:
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
+ // XXX: ale may be null!
if (ale->adt)
ale->adt->flag |= ADT_UI_ACTIVE;
}
@@ -229,11 +239,17 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
if ((ale->adt) && (ale->adt->flag & ADT_UI_SELECTED))
sel= ACHANNEL_SETFLAG_CLEAR;
}
break;
+
+ case ANIMTYPE_GPLAYER:
+ if (ale->flag & GP_LAYER_SELECT)
+ sel= ACHANNEL_SETFLAG_CLEAR;
+ break;
}
}
}
@@ -312,6 +328,7 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* need to verify that this data is valid for now */
if (ale->adt) {
@@ -320,6 +337,14 @@ void ANIM_deselect_anim_channels (bAnimContext *ac, void *data, short datatype,
}
}
break;
+
+ case ANIMTYPE_GPLAYER:
+ {
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+
+ ACHANNEL_SET_FLAG(gpl, sel, GP_LAYER_SELECT);
+ }
+ break;
}
}
@@ -462,7 +487,7 @@ void ANIM_flush_setting_anim_channels (bAnimContext *ac, ListBase *anim_data, bA
break;
/* store this level as the 'old' level now */
- prevLevel= level;
+ prevLevel= level; // XXX: prevLevel is unused
}
}
}
@@ -502,7 +527,7 @@ void ANIM_fcurve_delete_from_animdata (bAnimContext *ac, AnimData *adt, FCurve *
/* ****************** Operator Utilities ********************************** */
/* poll callback for being in an Animation Editor channels list region */
-int animedit_poll_channels_active (bContext *C)
+static int animedit_poll_channels_active (bContext *C)
{
ScrArea *sa= CTX_wm_area(C);
@@ -518,7 +543,7 @@ int animedit_poll_channels_active (bContext *C)
}
/* poll callback for Animation Editor channels list region + not in NLA-tweakmode for NLA */
-int animedit_poll_channels_nla_tweakmode_off (bContext *C)
+static int animedit_poll_channels_nla_tweakmode_off (bContext *C)
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene = CTX_data_scene(C);
@@ -541,132 +566,65 @@ int animedit_poll_channels_nla_tweakmode_off (bContext *C)
}
/* ****************** Rearrange Channels Operator ******************* */
-/* This operator only works for Action Editor mode for now, as having it elsewhere makes things difficult */
-
-#if 0 // XXX old animation system - needs to be updated for new system...
/* constants for channel rearranging */
/* WARNING: don't change exising ones without modifying rearrange func accordingly */
enum {
- REARRANGE_ACTCHAN_TOP= -2,
- REARRANGE_ACTCHAN_UP= -1,
- REARRANGE_ACTCHAN_DOWN= 1,
- REARRANGE_ACTCHAN_BOTTOM= 2
+ REARRANGE_ANIMCHAN_TOP= -2,
+ REARRANGE_ANIMCHAN_UP= -1,
+ REARRANGE_ANIMCHAN_DOWN= 1,
+ REARRANGE_ANIMCHAN_BOTTOM= 2
};
-/* make sure all action-channels belong to a group (and clear action's list) */
-static void split_groups_action_temp (bAction *act, bActionGroup *tgrp)
-{
- bActionChannel *achan;
- bActionGroup *agrp;
-
- /* Separate action-channels into lists per group */
- for (agrp= act->groups.first; agrp; agrp= agrp->next) {
- if (agrp->channels.first) {
- achan= agrp->channels.last;
- act->chanbase.first= achan->next;
-
- achan= agrp->channels.first;
- achan->prev= NULL;
-
- achan= agrp->channels.last;
- achan->next= NULL;
- }
- }
-
- /* Initialise memory for temp-group */
- memset(tgrp, 0, sizeof(bActionGroup));
- tgrp->flag |= (AGRP_EXPANDED|AGRP_TEMP);
- strcpy(tgrp->name, "#TempGroup");
-
- /* Move any action-channels not already moved, to the temp group */
- if (act->chanbase.first) {
- /* start of list */
- achan= act->chanbase.first;
- achan->prev= NULL;
- tgrp->channels.first= achan;
- act->chanbase.first= NULL;
-
- /* end of list */
- achan= act->chanbase.last;
- achan->next= NULL;
- tgrp->channels.last= achan;
- act->chanbase.last= NULL;
- }
-
- /* Add temp-group to list */
- BLI_addtail(&act->groups, tgrp);
-}
+/* defines for rearranging channels */
+static EnumPropertyItem prop_animchannel_rearrange_types[] = {
+ {REARRANGE_ANIMCHAN_TOP, "TOP", 0, "To Top", ""},
+ {REARRANGE_ANIMCHAN_UP, "UP", 0, "Up", ""},
+ {REARRANGE_ANIMCHAN_DOWN, "DOWN", 0, "Down", ""},
+ {REARRANGE_ANIMCHAN_BOTTOM, "BOTTOM", 0, "To Bottom", ""},
+ {0, NULL, 0, NULL, NULL}
+};
-/* link lists of channels that groups have */
-static void join_groups_action_temp (bAction *act)
-{
- bActionGroup *agrp;
- bActionChannel *achan;
-
- for (agrp= act->groups.first; agrp; agrp= agrp->next) {
- ListBase tempGroup;
-
- /* add list of channels to action's channels */
- tempGroup= agrp->channels;
- addlisttolist(&act->chanbase, &agrp->channels);
- agrp->channels= tempGroup;
-
- /* clear moved flag */
- agrp->flag &= ~AGRP_MOVED;
-
- /* if temp-group... remove from list (but don't free as it's on the stack!) */
- if (agrp->flag & AGRP_TEMP) {
- BLI_remlink(&act->groups, agrp);
- break;
- }
- }
+/* Reordering "Islands" Defines ----------------------------------- */
+
+/* Island definition - just a listbase container */
+typedef struct tReorderChannelIsland {
+ struct tReorderChannelIsland *next, *prev;
- /* clear "moved" flag from all achans */
- for (achan= act->chanbase.first; achan; achan= achan->next)
- achan->flag &= ~ACHAN_MOVED;
-}
+ ListBase channels; /* channels within this region with the same state */
+ int flag; /* eReorderIslandFlag */
+} tReorderChannelIsland;
+/* flags for channel reordering islands */
+typedef enum eReorderIslandFlag {
+ REORDER_ISLAND_SELECTED = (1<<0), /* island is selected */
+ REORDER_ISLAND_UNTOUCHABLE = (1<<1), /* island should be ignored */
+ REORDER_ISLAND_MOVED = (1<<2) /* island has already been moved */
+} eReorderIslandFlag;
-static short rearrange_actchannel_is_ok (Link *channel, short type)
-{
- if (type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= (bActionGroup *)channel;
-
- if (SEL_AGRP(agrp) && !(agrp->flag & AGRP_MOVED))
- return 1;
- }
- else if (type == ANIMTYPE_ACHAN) {
- bActionChannel *achan= (bActionChannel *)channel;
-
- if (VISIBLE_ACHAN(achan) && SEL_ACHAN(achan) && !(achan->flag & ACHAN_MOVED))
- return 1;
- }
-
- return 0;
-}
-static short rearrange_actchannel_after_ok (Link *channel, short type)
+/* Rearrange Methods --------------------------------------------- */
+
+static short rearrange_island_ok (tReorderChannelIsland *island)
{
- if (type == ANIMTYPE_GROUP) {
- bActionGroup *agrp= (bActionGroup *)channel;
-
- if (agrp->flag & AGRP_TEMP)
- return 0;
- }
+ /* island must not be untouchable */
+ if (island->flag & REORDER_ISLAND_UNTOUCHABLE)
+ return 0;
- return 1;
+ /* island should be selected to be moved */
+ return (island->flag & REORDER_ISLAND_SELECTED) && !(island->flag & REORDER_ISLAND_MOVED);
}
+/* ............................. */
-static short rearrange_actchannel_top (ListBase *list, Link *channel, short type)
+static short rearrange_island_top (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
+ if (rearrange_island_ok(island)) {
+ /* remove from current position */
+ BLI_remlink(list, island);
/* make it first element */
- BLI_insertlinkbefore(list, list->first, channel);
+ BLI_insertlinkbefore(list, list->first, island);
return 1;
}
@@ -674,17 +632,18 @@ static short rearrange_actchannel_top (ListBase *list, Link *channel, short type
return 0;
}
-static short rearrange_actchannel_up (ListBase *list, Link *channel, short type)
+static short rearrange_island_up (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- Link *prev= channel->prev;
+ if (rearrange_island_ok(island)) {
+ /* moving up = moving before the previous island, otherwise we're in the same place */
+ tReorderChannelIsland *prev= island->prev;
if (prev) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
+ /* remove from current position */
+ BLI_remlink(list, island);
/* push it up */
- BLI_insertlinkbefore(list, prev, channel);
+ BLI_insertlinkbefore(list, prev, island);
return 1;
}
@@ -693,235 +652,442 @@ static short rearrange_actchannel_up (ListBase *list, Link *channel, short type)
return 0;
}
-static short rearrange_actchannel_down (ListBase *list, Link *channel, short type)
+static short rearrange_island_down (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- Link *next = (channel->next) ? channel->next->next : NULL;
+ if (rearrange_island_ok(island)) {
+ /* moving down = moving after the next island, otherwise we're in the same place */
+ tReorderChannelIsland *next = island->next;
if (next) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* move it down */
- BLI_insertlinkbefore(list, next, channel);
-
- return 1;
- }
- else if (rearrange_actchannel_after_ok(list->last, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add at end */
- BLI_addtail(list, channel);
-
- return 1;
- }
- else {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add just before end */
- BLI_insertlinkbefore(list, list->last, channel);
-
- return 1;
+ /* can only move past if next is not untouchable (i.e. nothing can go after it) */
+ if ((next->flag & REORDER_ISLAND_UNTOUCHABLE)==0) {
+ /* remove from current position */
+ BLI_remlink(list, island);
+
+ /* push it down */
+ BLI_insertlinkafter(list, next, island);
+
+ return 1;
+ }
}
+ /* else: no next channel, so we're at the bottom already, so can't move */
}
return 0;
}
-static short rearrange_actchannel_bottom (ListBase *list, Link *channel, short type)
+static short rearrange_island_bottom (ListBase *list, tReorderChannelIsland *island)
{
- if (rearrange_actchannel_is_ok(channel, type)) {
- if (rearrange_actchannel_after_ok(list->last, type)) {
- /* take it out off the chain keep data */
- BLI_remlink(list, channel);
-
- /* add at end */
- BLI_addtail(list, channel);
+ if (rearrange_island_ok(island)) {
+ tReorderChannelIsland *last = list->last;
+
+ /* remove island from current position */
+ BLI_remlink(list, island);
+
+ /* add before or after the last channel? */
+ if ((last->flag & REORDER_ISLAND_UNTOUCHABLE)==0) {
+ /* can add after it */
+ BLI_addtail(list, island);
+ }
+ else {
+ /* can at most go just before it, since last cannot be moved */
+ BLI_insertlinkbefore(list, last, island);
- return 1;
}
+
+ return 1;
}
return 0;
}
+/* ............................. */
-/* Change the order of action-channels
- * mode: REARRANGE_ACTCHAN_*
+/* typedef for channel rearranging function
+ * < list: list that channels belong to
+ * < island: island to be moved
+ * > return[0]: whether operation was a success
*/
-static void rearrange_action_channels (bAnimContext *ac, short mode)
+typedef short (*AnimChanRearrangeFp)(ListBase *list, tReorderChannelIsland *island);
+
+/* get rearranging function, given 'rearrange' mode */
+static AnimChanRearrangeFp rearrange_get_mode_func (short mode)
{
- bAction *act;
- bActionChannel *achan, *chan;
- bActionGroup *agrp, *grp;
- bActionGroup tgrp;
-
- short (*rearrange_func)(ListBase *, Link *, short);
- short do_channels = 1;
-
- /* Get the active action, exit if none are selected */
- act= (bAction *)ac->data;
-
- /* exit if invalid mode */
switch (mode) {
- case REARRANGE_ACTCHAN_TOP:
- rearrange_func= rearrange_actchannel_top;
- break;
- case REARRANGE_ACTCHAN_UP:
- rearrange_func= rearrange_actchannel_up;
+ case REARRANGE_ANIMCHAN_TOP:
+ return rearrange_island_top;
+ case REARRANGE_ANIMCHAN_UP:
+ return rearrange_island_up;
+ case REARRANGE_ANIMCHAN_DOWN:
+ return rearrange_island_down;
+ case REARRANGE_ANIMCHAN_BOTTOM:
+ return rearrange_island_bottom;
+ default:
+ return NULL;
+ }
+}
+
+/* Rearrange Islands Generics ------------------------------------- */
+
+/* add channel into list of islands */
+static void rearrange_animchannel_add_to_islands (ListBase *islands, ListBase *srcList, Link *channel, short type)
+{
+ tReorderChannelIsland *island = islands->last; /* always try to add to last island if possible */
+ short is_sel=0, is_untouchable=0;
+
+ /* get flags - selected and untouchable from the channel */
+ switch (type) {
+ case ANIMTYPE_GROUP:
+ {
+ bActionGroup *agrp= (bActionGroup *)channel;
+
+ is_sel= SEL_AGRP(agrp);
+ is_untouchable= (agrp->flag & AGRP_TEMP) != 0;
+ }
break;
- case REARRANGE_ACTCHAN_DOWN:
- rearrange_func= rearrange_actchannel_down;
+ case ANIMTYPE_FCURVE:
+ {
+ FCurve *fcu= (FCurve *)channel;
+
+ is_sel= SEL_FCU(fcu);
+ }
break;
- case REARRANGE_ACTCHAN_BOTTOM:
- rearrange_func= rearrange_actchannel_bottom;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)channel;
+
+ is_sel= SEL_NLT(nlt);
+ }
break;
+
default:
+ printf("rearrange_animchannel_add_to_islands(): don't know how to handle channels of type %d\n", type);
return;
}
- /* make sure we're only operating with groups */
- split_groups_action_temp(act, &tgrp);
+ /* do we need to add to a new island? */
+ if ((island == NULL) || /* 1) no islands yet */
+ ((island->flag & REORDER_ISLAND_SELECTED) == 0) || /* 2) unselected islands have single channels only - to allow up/down movement */
+ (is_sel == 0)) /* 3) if channel is unselected, stop existing island (it was either wrong sel status, or full already) */
+ {
+ /* create a new island now */
+ island = MEM_callocN(sizeof(tReorderChannelIsland), "tReorderChannelIsland");
+ BLI_addtail(islands, island);
+
+ if (is_sel)
+ island->flag |= REORDER_ISLAND_SELECTED;
+ if (is_untouchable)
+ island->flag |= REORDER_ISLAND_UNTOUCHABLE;
+ }
+
+ /* add channel to island - need to remove it from its existing list first though */
+ BLI_remlink(srcList, channel);
+ BLI_addtail(&island->channels, channel);
+}
+
+/* flatten islands out into a single list again */
+static void rearrange_animchannel_flatten_islands (ListBase *islands, ListBase *srcList)
+{
+ tReorderChannelIsland *island, *isn=NULL;
- /* rearrange groups first (and then, only consider channels if the groups weren't moved) */
- #define GET_FIRST(list) ((mode > 0) ? (list.first) : (list.last))
- #define GET_NEXT(item) ((mode > 0) ? (item->next) : (item->prev))
+ /* make sure srcList is empty now */
+ BLI_assert(srcList->first == NULL);
- for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
- /* Get next group to consider */
- grp= GET_NEXT(agrp);
+ /* go through merging islands */
+ for (island = islands->first; island; island = isn) {
+ isn = island->next;
- /* try to do group first */
- if (rearrange_func(&act->groups, (Link *)agrp, ANIMTYPE_GROUP)) {
- do_channels= 0;
- agrp->flag |= AGRP_MOVED;
- }
+ /* merge island channels back to main list, then delete the island */
+ BLI_movelisttolist(srcList, &island->channels);
+ BLI_freelinkN(islands, island);
+ }
+}
+
+/* ............................. */
+
+/* performing rearranging of channels using islands */
+static short rearrange_animchannel_islands (ListBase *list, AnimChanRearrangeFp rearrange_func, short mode, short type)
+{
+ ListBase islands = {NULL, NULL};
+ Link *channel, *chanNext=NULL;
+ short done = 0;
+
+ /* don't waste effort on an empty list */
+ if (list->first == NULL)
+ return 0;
+
+ /* group channels into islands */
+ for (channel = list->first; channel; channel = chanNext) {
+ chanNext = channel->next;
+ rearrange_animchannel_add_to_islands(&islands, list, channel, type);
}
- if (do_channels) {
- for (agrp= GET_FIRST(act->groups); agrp; agrp= grp) {
- /* Get next group to consider */
- grp= GET_NEXT(agrp);
+ /* perform moving of selected islands now, but only if there is more than one of 'em so that something will happen
+ * - scanning of the list is performed in the opposite direction to the direction we're moving things, so that we
+ * shouldn't need to encounter items we've moved already
+ */
+ if (islands.first != islands.last) {
+ tReorderChannelIsland *first = (mode > 0) ? islands.last : islands.first;
+ tReorderChannelIsland *island, *isn=NULL;
+
+ for (island = first; island; island = isn) {
+ isn = (mode > 0) ? island->prev : island->next;
- /* only consider action-channels if they're visible (group expanded) */
- if (EXPANDED_AGRP(agrp)) {
- for (achan= GET_FIRST(agrp->channels); achan; achan= chan) {
- /* Get next channel to consider */
- chan= GET_NEXT(achan);
-
- /* Try to do channel */
- if (rearrange_func(&agrp->channels, (Link *)achan, ANIMTYPE_ACHAN))
- achan->flag |= ACHAN_MOVED;
- }
+ /* perform rearranging */
+ if (rearrange_func(&islands, island)) {
+ island->flag |= REORDER_ISLAND_MOVED;
+ done = 1;
}
}
}
- #undef GET_FIRST
- #undef GET_NEXT
- /* assemble lists into one list (and clear moved tags) */
- join_groups_action_temp(act);
+ /* ungroup islands */
+ rearrange_animchannel_flatten_islands(&islands, list);
+
+ /* did we do anything? */
+ return done;
}
-/* ------------------- */
+/* NLA Specific Stuff ----------------------------------------------------- */
-static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
+/* Change the order NLA Tracks within NLA Stack
+ * ! NLA tracks are displayed in opposite order, so directions need care
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_nla_channels (bAnimContext *UNUSED(ac), AnimData *adt, short mode)
{
- bAnimContext ac;
- short mode;
+ AnimChanRearrangeFp rearrange_func;
- /* get editor data - only for Action Editor (for now) */
- if (ANIM_animdata_get_context(C, &ac) == 0)
- return OPERATOR_CANCELLED;
- if (ac.datatype != ANIMCONT_ACTION)
- return OPERATOR_PASS_THROUGH;
-
- /* get mode, then rearrange channels */
- mode= RNA_enum_get(op->ptr, "direction");
- rearrange_action_channels(&ac, mode);
+ /* hack: invert mode so that functions will work in right order */
+ mode *= -1;
- /* send notifier that things have changed */
- WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+ /* get rearranging function */
+ rearrange_func = rearrange_get_mode_func(mode);
+ if (rearrange_func == NULL)
+ return;
- return OPERATOR_FINISHED;
+ /* only consider NLA data if it's accessible */
+ //if (EXPANDED_DRVD(adt) == 0)
+ // return;
+
+ /* perform rearranging on tracks list */
+ rearrange_animchannel_islands(&adt->nla_tracks, rearrange_func, mode, ANIMTYPE_NLATRACK);
}
-
-void ANIM_OT_channels_move_up (wmOperatorType *ot)
+/* Drivers Specific Stuff ------------------------------------------------- */
+
+/* Change the order drivers within AnimData block
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_driver_channels (bAnimContext *UNUSED(ac), AnimData *adt, short mode)
{
- /* identifiers */
- ot->name= "Move Channel(s) Up";
- ot->idname= "ANIM_OT_channels_move_up";
+ /* get rearranging function */
+ AnimChanRearrangeFp rearrange_func = rearrange_get_mode_func(mode);
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ if (rearrange_func == NULL)
+ return;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* only consider drivers if they're accessible */
+ if (EXPANDED_DRVD(adt) == 0)
+ return;
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_UP, "Direction", "");
+ /* perform rearranging on drivers list (drivers are really just F-Curves) */
+ rearrange_animchannel_islands(&adt->drivers, rearrange_func, mode, ANIMTYPE_FCURVE);
}
-void ANIM_OT_channels_move_down (wmOperatorType *ot)
+/* Action Specific Stuff ------------------------------------------------- */
+
+/* make sure all action-channels belong to a group (and clear action's list) */
+static void split_groups_action_temp (bAction *act, bActionGroup *tgrp)
{
- /* identifiers */
- ot->name= "Move Channel(s) Down";
- ot->idname= "ANIM_OT_channels_move_down";
+ bActionGroup *agrp;
+ FCurve *fcu;
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ if (act == NULL)
+ return;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* Separate F-Curves into lists per group */
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ if (agrp->channels.first) {
+ fcu= agrp->channels.last;
+ act->curves.first= fcu->next;
+
+ fcu= agrp->channels.first;
+ fcu->prev= NULL;
+
+ fcu= agrp->channels.last;
+ fcu->next= NULL;
+ }
+ }
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_DOWN, "Direction", "");
+ /* Initialise memory for temp-group */
+ memset(tgrp, 0, sizeof(bActionGroup));
+ tgrp->flag |= (AGRP_EXPANDED|AGRP_TEMP);
+ BLI_strncpy(tgrp->name, "#TempGroup", sizeof(tgrp->name));
+
+ /* Move any action-channels not already moved, to the temp group */
+ if (act->curves.first) {
+ /* start of list */
+ fcu= act->curves.first;
+ fcu->prev= NULL;
+ tgrp->channels.first= fcu;
+ act->curves.first= NULL;
+
+ /* end of list */
+ fcu= act->curves.last;
+ fcu->next= NULL;
+ tgrp->channels.last= fcu;
+ act->curves.last= NULL;
+ }
+
+ /* Add temp-group to list */
+ BLI_addtail(&act->groups, tgrp);
}
-void ANIM_OT_channels_move_top (wmOperatorType *ot)
+/* link lists of channels that groups have */
+static void join_groups_action_temp (bAction *act)
{
- /* identifiers */
- ot->name= "Move Channel(s) to Top";
- ot->idname= "ANIM_OT_channels_move_to_top";
+ bActionGroup *agrp;
- /* api callbacks */
- ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ ListBase tempGroup;
+
+ /* add list of channels to action's channels */
+ tempGroup= agrp->channels;
+ BLI_movelisttolist(&act->curves, &agrp->channels);
+ agrp->channels= tempGroup;
+
+ /* clear moved flag */
+ agrp->flag &= ~AGRP_MOVED;
+
+ /* if temp-group... remove from list (but don't free as it's on the stack!) */
+ if (agrp->flag & AGRP_TEMP) {
+ BLI_remlink(&act->groups, agrp);
+ break;
+ }
+ }
+}
+
+/* Change the order of anim-channels within action
+ * mode: REARRANGE_ANIMCHAN_*
+ */
+static void rearrange_action_channels (bAnimContext *ac, bAction *act, short mode)
+{
+ bActionGroup tgrp;
+ short do_channels;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* get rearranging function */
+ AnimChanRearrangeFp rearrange_func = rearrange_get_mode_func(mode);
- /* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_TOP, "Direction", "");
+ if (rearrange_func == NULL)
+ return;
+
+ /* make sure we're only operating with groups (vs a mixture of groups+curves) */
+ split_groups_action_temp(act, &tgrp);
+
+ /* rearrange groups first
+ * - the group's channels will only get considered if nothing happened when rearranging the groups
+ * i.e. the rearrange function returned 0
+ */
+ do_channels = rearrange_animchannel_islands(&act->groups, rearrange_func, mode, ANIMTYPE_GROUP) == 0;
+
+ if (do_channels) {
+ bActionGroup *agrp;
+
+ for (agrp= act->groups.first; agrp; agrp= agrp->next) {
+ /* only consider F-Curves if they're visible (group expanded) */
+ if (EXPANDED_AGRP(agrp)) {
+ rearrange_animchannel_islands(&agrp->channels, rearrange_func, mode, ANIMTYPE_FCURVE);
+ }
+ }
+ }
+
+ /* assemble lists into one list (and clear moved tags) */
+ join_groups_action_temp(act);
+}
+
+/* ------------------- */
+
+static int animchannels_rearrange_exec(bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ short mode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get mode */
+ mode= RNA_enum_get(op->ptr, "direction");
+
+ /* get animdata blocks */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ for (ale = anim_data.first; ale; ale = ale->next) {
+ AnimData *adt= ale->data;
+
+ switch (ac.datatype) {
+ case ANIMCONT_NLA: /* NLA-tracks only */
+ rearrange_nla_channels(&ac, adt, mode);
+ break;
+
+ case ANIMCONT_DRIVERS: /* Drivers list only */
+ rearrange_driver_channels(&ac, adt, mode);
+ break;
+
+ case ANIMCONT_GPENCIL: /* Grease Pencil channels */
+ // FIXME: this case probably needs to get moved out of here or treated specially...
+ printf("grease pencil not supported for moving yet\n");
+ break;
+
+ case ANIMCONT_SHAPEKEY: // DOUBLE CHECK ME...
+
+ default: /* some collection of actions */
+ // FIXME: actions should only be considered once!
+ if (adt->action)
+ rearrange_action_channels(&ac, adt->action, mode);
+ else if (G.f & G_DEBUG)
+ printf("animdata has no action\n");
+ break;
+ }
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_move_bottom (wmOperatorType *ot)
+static void ANIM_OT_channels_move (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Move Channel(s) to Bottom";
- ot->idname= "ANIM_OT_channels_move_to_bottom";
+ ot->name= "Move Channels";
+ ot->idname= "ANIM_OT_channels_move";
+ ot->description = "Rearrange selected animation channels";
/* api callbacks */
ot->exec= animchannels_rearrange_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= animedit_poll_channels_nla_tweakmode_off;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* props */
- RNA_def_enum(ot->srna, "direction", NULL /* XXX add enum for this */, REARRANGE_ACTCHAN_BOTTOM, "Direction", "");
+ ot->prop= RNA_def_enum(ot->srna, "direction", prop_animchannel_rearrange_types, REARRANGE_ANIMCHAN_DOWN, "Direction", "");
}
-#endif // XXX old animation system - needs to be updated for new system...
-
/* ******************** Delete Channel Operator *********************** */
-static int animchannels_delete_exec(bContext *C, wmOperator *op)
+static int animchannels_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1004,7 +1170,7 @@ static int animchannels_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_delete (wmOperatorType *ot)
+static void ANIM_OT_channels_delete (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Channels";
@@ -1022,7 +1188,7 @@ void ANIM_OT_channels_delete (wmOperatorType *ot)
/* ******************** Set Channel Visibility Operator *********************** */
/* NOTE: this operator is only valid in the Graph Editor channels region */
-static int animchannels_visibility_set_exec(bContext *C, wmOperator *op)
+static int animchannels_visibility_set_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1055,7 +1221,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op)
BLI_freelistN(&anim_data);
/* make all the selected channels visible */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_SEL | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1081,7 +1247,7 @@ static int animchannels_visibility_set_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
+static void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Visibility";
@@ -1090,7 +1256,7 @@ void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
/* api callbacks */
ot->exec= animchannels_visibility_set_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1100,7 +1266,7 @@ void ANIM_OT_channels_visibility_set (wmOperatorType *ot)
/* ******************** Toggle Channel Visibility Operator *********************** */
/* NOTE: this operator is only valid in the Graph Editor channels region */
-static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
+static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1154,7 +1320,7 @@ static int animchannels_visibility_toggle_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
+static void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Visibility";
@@ -1163,7 +1329,7 @@ void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
/* api callbacks */
ot->exec= animchannels_visibility_toggle_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1172,7 +1338,7 @@ void ANIM_OT_channels_visibility_toggle (wmOperatorType *ot)
/* ********************** Set Flags Operator *********************** */
/* defines for setting animation-channel flags */
-EnumPropertyItem prop_animchannel_setflag_types[] = {
+static EnumPropertyItem prop_animchannel_setflag_types[] = {
{ACHANNEL_SETFLAG_TOGGLE, "TOGGLE", 0, "Toggle", ""},
{ACHANNEL_SETFLAG_CLEAR, "DISABLE", 0, "Disable", ""},
{ACHANNEL_SETFLAG_ADD, "ENABLE", 0, "Enable", ""},
@@ -1182,7 +1348,7 @@ EnumPropertyItem prop_animchannel_setflag_types[] = {
/* defines for set animation-channel settings */
// TODO: could add some more types, but those are really quite dependent on the mode...
-EnumPropertyItem prop_animchannel_settings_types[] = {
+static EnumPropertyItem prop_animchannel_settings_types[] = {
{ACHANNEL_SETTING_PROTECT, "PROTECT", 0, "Protect", ""},
{ACHANNEL_SETTING_MUTE, "MUTE", 0, "Mute", ""},
{0, NULL, 0, NULL, NULL}
@@ -1286,7 +1452,7 @@ static int animchannels_setflag_exec(bContext *C, wmOperator *op)
}
-void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
+static void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Enable Channel Setting";
@@ -1308,7 +1474,7 @@ void ANIM_OT_channels_setting_enable (wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
}
-void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
+static void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Disable Channel Setting";
@@ -1330,7 +1496,7 @@ void ANIM_OT_channels_setting_disable (wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
}
-void ANIM_OT_channels_setting_invert (wmOperatorType *ot)
+static void ANIM_OT_channels_setting_invert (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Invert Channel Setting";
@@ -1352,7 +1518,7 @@ void ANIM_OT_channels_setting_invert (wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
}
-void ANIM_OT_channels_setting_toggle (wmOperatorType *ot)
+static void ANIM_OT_channels_setting_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Channel Setting";
@@ -1374,7 +1540,7 @@ void ANIM_OT_channels_setting_toggle (wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, 0, "Type", "");
}
-void ANIM_OT_channels_editable_toggle (wmOperatorType *ot)
+static void ANIM_OT_channels_editable_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Channel Editability";
@@ -1419,7 +1585,7 @@ static int animchannels_expand_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_expand (wmOperatorType *ot)
+static void ANIM_OT_channels_expand (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Expand Channels";
@@ -1461,7 +1627,7 @@ static int animchannels_collapse_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_collapse (wmOperatorType *ot)
+static void ANIM_OT_channels_collapse (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Collapse Channels";
@@ -1479,9 +1645,73 @@ void ANIM_OT_channels_collapse (wmOperatorType *ot)
ot->prop= RNA_def_boolean(ot->srna, "all", 1, "All", "Collapse all channels (not just selected ones)");
}
+/* ******************* Reenable Disabled Operator ******************* */
+
+static int animchannels_enable_poll (bContext *C)
+{
+ ScrArea *sa= CTX_wm_area(C);
+
+ /* channels region test */
+ // TODO: could enhance with actually testing if channels region?
+ if (ELEM(NULL, sa, CTX_wm_region(C)))
+ return 0;
+
+ /* animation editor test - Action/Dopesheet/etc. and Graph only */
+ if (ELEM(sa->spacetype, SPACE_ACTION, SPACE_IPO) == 0)
+ return 0;
+
+ return 1;
+}
+
+static int animchannels_enable_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* loop through filtered data and clean curves */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ FCurve *fcu = (FCurve *)ale->data;
+ fcu->flag &= ~FCURVE_DISABLED;
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* send notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static void ANIM_OT_channels_fcurves_enable (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Revive Disabled F-Curves";
+ ot->idname= "ANIM_OT_channels_fcurves_enable";
+ ot->description= "Clears 'disabled' tag from all F-Curves to get broken F-Curves working again";
+
+ /* api callbacks */
+ ot->exec= animchannels_enable_exec;
+ ot->poll= animchannels_enable_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ********************** Select All Operator *********************** */
-static int animchannels_deselectall_exec(bContext *C, wmOperator *op)
+static int animchannels_deselectall_exec (bContext *C, wmOperator *op)
{
bAnimContext ac;
@@ -1501,7 +1731,7 @@ static int animchannels_deselectall_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_select_all_toggle (wmOperatorType *ot)
+static void ANIM_OT_channels_select_all_toggle (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select All";
@@ -1529,7 +1759,17 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
View2D *v2d= &ac->ar->v2d;
rctf rectf;
- float ymin=0, ymax=(float)(-ACHANNEL_HEIGHT);
+ float ymin, ymax;
+
+ /* set initial y extents */
+ if (ac->datatype == ANIMCONT_NLA) {
+ ymin = (float)(-NLACHANNEL_HEIGHT);
+ ymax = 0.0f;
+ }
+ else {
+ ymin = 0.0f;
+ ymax = (float)(-ACHANNEL_HEIGHT);
+ }
/* convert border-region to view coordinates */
UI_view2d_region_to_view(v2d, rect->xmin, rect->ymin+2, &rectf.xmin, &rectf.ymin);
@@ -1541,7 +1781,10 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
/* loop over data, doing border select */
for (ale= anim_data.first; ale; ale= ale->next) {
- ymin= ymax - ACHANNEL_STEP;
+ if (ac->datatype == ANIMCONT_NLA)
+ ymin= ymax - NLACHANNEL_STEP;
+ else
+ ymin= ymax - ACHANNEL_STEP;
/* if channel is within border-select region, alter it */
if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
@@ -1558,6 +1801,16 @@ static void borderselect_anim_channels (bAnimContext *ac, rcti *rect, short sele
agrp->flag &= ~AGRP_ACTIVE;
}
break;
+ case ANIMTYPE_NLATRACK:
+ {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ /* for now, it's easier just to do this here manually, as defining a new type
+ * currently adds complications when doing other stuff
+ */
+ ACHANNEL_SET_FLAG(nlt, selectmode, NLATRACK_SELECTED);
+ }
+ break;
}
}
@@ -1603,7 +1856,7 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_select_border(wmOperatorType *ot)
+static void ANIM_OT_channels_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
@@ -1627,7 +1880,7 @@ void ANIM_OT_channels_select_border(wmOperatorType *ot)
/* ******************** Mouse-Click Operator *********************** */
/* Handle selection changes due to clicking on channels. Settings will get caught by UI code... */
-static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, short selectmode)
+static int mouse_anim_channels (bAnimContext *ac, float UNUSED(x), int channel_index, short selectmode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -1733,6 +1986,7 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSNTREE:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* sanity checking... */
if (ale->adt) {
@@ -1834,7 +2088,9 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
{
bGPdata *gpd= (bGPdata *)ale->data;
- /* toggle expand */
+ /* toggle expand
+ * - although the triangle widget already allows this, the whole channel can also be used for this purpose
+ */
gpd->flag ^= GP_DATA_EXPAND;
notifierFlags |= (ND_ANIMCHAN|NA_EDITED);
@@ -1842,29 +2098,20 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
break;
case ANIMTYPE_GPLAYER:
{
-#if 0 // XXX future of this is unclear
- bGPdata *gpd= (bGPdata *)ale->owner; // xxx depreceated
bGPDlayer *gpl= (bGPDlayer *)ale->data;
- if (x >= (ACHANNEL_NAMEWIDTH-16)) {
- /* toggle lock */
- gpl->flag ^= GP_LAYER_LOCKED;
- }
- else if (x >= (ACHANNEL_NAMEWIDTH-32)) {
- /* toggle hide */
- gpl->flag ^= GP_LAYER_HIDE;
+ /* select/deselect */
+ if (selectmode == SELECT_INVERT) {
+ /* invert selection status of this layer only */
+ gpl->flag ^= GP_LAYER_SELECT;
}
- else {
- /* select/deselect */
- //if (G.qual & LR_SHIFTKEY) {
- //select_gplayer_channel(gpd, gpl, SELECT_INVERT);
- //}
- //else {
- //deselect_gpencil_layers(data, 0);
- //select_gplayer_channel(gpd, gpl, SELECT_INVERT);
- //}
+ else {
+ /* select layer by itself */
+ ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ gpl->flag |= GP_LAYER_SELECT;
}
-#endif // XXX future of this is unclear
+
+ notifierFlags |= (ND_ANIMCHAN|NA_EDITED);
}
break;
default:
@@ -1885,7 +2132,6 @@ static int mouse_anim_channels (bAnimContext *ac, float x, int channel_index, sh
static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
View2D *v2d;
int mval[2], channel_index;
@@ -1899,7 +2145,6 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
v2d= &ar->v2d;
@@ -1932,7 +2177,7 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *
return OPERATOR_FINISHED;
}
-void ANIM_OT_channels_click (wmOperatorType *ot)
+static void ANIM_OT_channels_click (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Mouse Click on Channels";
@@ -1970,17 +2215,15 @@ void ED_operatortypes_animchannels(void)
// XXX does this need to be a separate operator?
WM_operatortype_append(ANIM_OT_channels_editable_toggle);
- // XXX these need to be updated for new system... todo...
- //WM_operatortype_append(ANIM_OT_channels_move_up);
- //WM_operatortype_append(ANIM_OT_channels_move_down);
- //WM_operatortype_append(ANIM_OT_channels_move_top);
- //WM_operatortype_append(ANIM_OT_channels_move_bottom);
+ WM_operatortype_append(ANIM_OT_channels_move);
WM_operatortype_append(ANIM_OT_channels_expand);
WM_operatortype_append(ANIM_OT_channels_collapse);
WM_operatortype_append(ANIM_OT_channels_visibility_toggle);
WM_operatortype_append(ANIM_OT_channels_visibility_set);
+
+ WM_operatortype_append(ANIM_OT_channels_fcurves_enable);
}
// TODO: check on a poll callback for this, to get hotkeys into menus
@@ -2022,11 +2265,11 @@ void ED_keymap_animchannels(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0);
- /* rearranging - actions only */
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_up", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_down", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_top", PAGEUPKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
- //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_to_bottom", PAGEDOWNKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ /* rearranging */
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_UP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_DOWN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "direction", REARRANGE_ANIMCHAN_BOTTOM);
/* Graph Editor only */
WM_keymap_add_item(keymap, "ANIM_OT_channels_visibility_set", VKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index 5312e97c604..be4110c68b9 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "DNA_sequence_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -90,13 +91,13 @@ void ANIM_list_elem_update(Scene *scene, bAnimListElem *ale)
else {
/* in other case we do standard depsgaph update, ideally
we'd be calling property update functions here too ... */
- DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive?
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX or do we want something more restrictive?
}
}
/* tags the given ID block for refreshes (if applicable) due to
* Animation Editor editing */
-void ANIM_id_update(Scene *scene, ID *id)
+void ANIM_id_update(Scene *UNUSED(scene), ID *id)
{
if (id) {
AnimData *adt= BKE_animdata_from_id(id);
@@ -106,7 +107,7 @@ void ANIM_id_update(Scene *scene, ID *id)
adt->recalc |= ADT_RECALC_ANIM;
/* set recalc flags */
- DAG_id_flush_update(id, OB_RECALC_ALL); // XXX or do we want something more restrictive?
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX or do we want something more restrictive?
}
}
@@ -121,7 +122,7 @@ void ANIM_id_update(Scene *scene, ID *id)
*/
/* perform syncing updates for Action Groups */
-static void animchan_sync_group (bAnimContext *ac, bAnimListElem *ale)
+static void animchan_sync_group (bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
bActionGroup *agrp= (bActionGroup *)ale->data;
ID *owner_id= ale->id;
@@ -154,7 +155,7 @@ static void animchan_sync_group (bAnimContext *ac, bAnimListElem *ale)
}
/* perform syncing updates for F-Curves */
-static void animchan_sync_fcurve (bAnimContext *ac, bAnimListElem *ale)
+static void animchan_sync_fcurve (bAnimContext *UNUSED(ac), bAnimListElem *ale)
{
FCurve *fcu= (FCurve *)ale->data;
ID *owner_id= ale->id;
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index b564780f6c0..9b307b92bec 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -232,7 +232,7 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag)
/* Draw dark green line if slow-parenting/time-offset is enabled */
if (flag & DRAWCFRA_SHOW_TIMEOFS) {
- Object *ob= (scene->basact) ? (scene->basact->object) : 0;
+ Object *ob= OBACT;
if(ob) {
float timeoffset= give_timeoffset(ob);
// XXX ob->ipoflag is depreceated!
@@ -256,7 +256,7 @@ void ANIM_draw_cfra (const bContext *C, View2D *v2d, short flag)
/* Draw current frame number in a little box */
if (flag & DRAWCFRA_SHOW_NUMBOX) {
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(CTX_wm_region(C), v2d, 1);
draw_cfra_number(scene, v2d, vec[0], (flag & DRAWCFRA_UNIT_SECONDS));
}
}
@@ -352,14 +352,13 @@ static short bezt_nlamapping_apply(KeyframeEditData *ked, BezTriple *bezt)
*/
void ANIM_nla_mapping_apply_fcurve (AnimData *adt, FCurve *fcu, short restore, short only_keys)
{
- KeyframeEditData ked;
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc map_cb;
/* init edit data
* - AnimData is stored in 'data'
* - only_keys is stored in 'i1'
*/
- memset(&ked, 0, sizeof(KeyframeEditData));
ked.data= (void *)adt;
ked.i1= (int)only_keys;
@@ -393,7 +392,7 @@ float ANIM_unit_mapping_get_factor (Scene *scene, ID *id, FCurve *fcu, short res
if (RNA_SUBTYPE_UNIT(RNA_property_subtype(prop)) == PROP_UNIT_ROTATION)
{
/* if the radians flag is not set, default to using degrees which need conversions */
- if ((scene) && (scene->unit.flag & USER_UNIT_ROT_RADIANS) == 0) {
+ if ((scene) && (scene->unit.system_rotation == USER_UNIT_ROT_RADIANS) == 0) {
if (restore)
return M_PI / 180.0f; /* degrees to radians */
else
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index 0ff75c1cded..dd406acff79 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -69,6 +69,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_animsys.h"
@@ -78,11 +79,14 @@
#include "BKE_global.h"
#include "BKE_group.h"
#include "BKE_key.h"
+#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_sequencer.h"
+#include "BKE_utildefines.h"
#include "ED_anim_api.h"
+#include "ED_markers.h"
/* ************************************************************ */
/* Blender Context <-> Animation Context mapping */
@@ -91,7 +95,7 @@
/* Get shapekey data being edited (for Action Editor -> ShapeKey mode) */
/* Note: there's a similar function in key.c (ob_get_key) */
-Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction)
+static Key *actedit_get_shapekeys (bAnimContext *ac)
{
Scene *scene= ac->scene;
Object *ob;
@@ -105,23 +109,7 @@ Key *actedit_get_shapekeys (bAnimContext *ac, SpaceAction *saction)
//if (saction->pin) return NULL;
/* shapekey data is stored with geometry data */
- switch (ob->type) {
- case OB_MESH:
- key= ((Mesh *)ob->data)->key;
- break;
-
- case OB_LATTICE:
- key= ((Lattice *)ob->data)->key;
- break;
-
- case OB_CURVE:
- case OB_SURF:
- key= ((Curve *)ob->data)->key;
- break;
-
- default:
- return NULL;
- }
+ key= ob_get_key(ob);
if (key) {
if (key->type == KEY_RELATIVE)
@@ -153,15 +141,17 @@ static short actedit_get_context (bAnimContext *ac, SpaceAction *saction)
case SACTCONT_SHAPEKEY: /* 'ShapeKey Editor' */
ac->datatype= ANIMCONT_SHAPEKEY;
- ac->data= actedit_get_shapekeys(ac, saction);
+ ac->data= actedit_get_shapekeys(ac);
ac->mode= saction->mode;
return 1;
case SACTCONT_GPENCIL: /* Grease Pencil */ // XXX review how this mode is handled...
- ac->datatype=ANIMCONT_GPENCIL;
- //ac->data= CTX_wm_screen(C); // FIXME: add that dopesheet type thing here!
- ac->data= NULL; // !!!
+ /* update scene-pointer (no need to check for pinning yet, as not implemented) */
+ saction->ads.source= (ID *)ac->scene;
+
+ ac->datatype= ANIMCONT_GPENCIL;
+ ac->data= &saction->ads;
ac->mode= saction->mode;
return 1;
@@ -317,7 +307,7 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
/* get useful default context settings from context */
ac->scene= scene;
if (scene) {
- ac->markers= &scene->markers;
+ ac->markers= ED_context_get_markers(C);
ac->obact= (scene->basact)? scene->basact->object : NULL;
}
ac->sa= sa;
@@ -437,7 +427,7 @@ short ANIM_animdata_get_context (const bContext *C, bAnimContext *ac)
/* this function allocates memory for a new bAnimListElem struct for the
* provided animation channel-data.
*/
-bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, short ownertype, ID *owner_id)
+static bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, short ownertype, ID *owner_id)
{
bAnimListElem *ale= NULL;
@@ -642,6 +632,19 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
ale->adt= BKE_animdata_from_id(data);
}
break;
+ case ANIMTYPE_DSLAT:
+ {
+ Lattice *lt= (Lattice *)data;
+ AnimData *adt= lt->adt;
+
+ ale->flag= FILTER_LATTICE_OBJD(lt);
+
+ ale->key_data= (adt) ? adt->action : NULL;
+ ale->datatype= ALE_ACT;
+
+ ale->adt= BKE_animdata_from_id(data);
+ }
+ break;
case ANIMTYPE_DSSKEY:
{
Key *key= (Key *)data;
@@ -797,7 +800,7 @@ bAnimListElem *make_new_animlistelem (void *data, short datatype, void *owner, s
/* ----------------------------------------- */
/* NOTE: when this function returns true, the F-Curve is to be skipped */
-static int skip_fcurve_selected_data(bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
+static int skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
{
if (GS(owner_id->name) == ID_OB) {
Object *ob= (Object *)owner_id;
@@ -1065,7 +1068,7 @@ static int animdata_filter_action (bAnimContext *ac, ListBase *anim_data, bDopeS
* - for normal filtering (i.e. for editing), we only need the NLA-tracks but they can be in 'normal' evaluation
* order, i.e. first to last. Otherwise, some tools may get screwed up.
*/
-static int animdata_filter_nla (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, AnimData *adt, int filter_mode, void *owner, short ownertype, ID *owner_id)
+static int animdata_filter_nla (bAnimContext *UNUSED(ac), ListBase *anim_data, bDopeSheet *UNUSED(ads), AnimData *adt, int filter_mode, void *owner, short ownertype, ID *owner_id)
{
bAnimListElem *ale;
NlaTrack *nlt;
@@ -1182,38 +1185,28 @@ static int animdata_filter_shapekey (bAnimContext *ac, ListBase *anim_data, Key
return items;
}
-#if 0
-// FIXME: switch this to use the bDopeSheet...
-static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter_mode)
+/* Grab all Grase Pencil datablocks in file */
+// TODO: should this be amalgamated with the dopesheet filtering code?
+static int animdata_filter_gpencil (ListBase *anim_data, void *UNUSED(data), int filter_mode)
{
bAnimListElem *ale;
- ScrArea *sa, *curarea;
bGPdata *gpd;
bGPDlayer *gpl;
int items = 0;
/* check if filtering types are appropriate */
+ if (!(filter_mode & (ANIMFILTER_ACTGROUPED|ANIMFILTER_CURVESONLY)))
{
- /* special hack for fullscreen area (which must be this one then):
- * - we use the curarea->full as screen to get spaces from, since the
- * old (pre-fullscreen) screen was stored there...
- * - this is needed as all data would otherwise disappear
- */
- // XXX need to get new alternative for curarea
- if ((curarea->full) && (curarea->spacetype==SPACE_ACTION))
- sc= curarea->full;
-
- /* loop over spaces in current screen, finding gpd blocks (could be slow!) */
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- /* try to get gp data */
- // XXX need to put back grease pencil api...
- gpd= gpencil_data_get_active(sa);
- if (gpd == NULL) continue;
+ /* for now, grab grease pencil datablocks directly from main*/
+ for (gpd = G.main->gpencil.first; gpd; gpd = gpd->id.next) {
+ /* only show if gpd is used by something... */
+ if (ID_REAL_USERS(gpd) < 1)
+ continue;
/* add gpd as channel too (if for drawing, and it has layers) */
if ((filter_mode & ANIMFILTER_CHANNELS) && (gpd->layers.first)) {
/* add to list */
- ale= make_new_animlistelem(gpd, ANIMTYPE_GPDATABLOCK, sa, ANIMTYPE_SPECIALDATA);
+ ale= make_new_animlistelem(gpd, ANIMTYPE_GPDATABLOCK, NULL, ANIMTYPE_NONE, NULL);
if (ale) {
BLI_addtail(anim_data, ale);
items++;
@@ -1229,7 +1222,7 @@ static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter
/* only if editable */
if (!(filter_mode & ANIMFILTER_FOREDIT) || EDITABLE_GPL(gpl)) {
/* add to list */
- ale= make_new_animlistelem(gpl, ANIMTYPE_GPLAYER, gpd, ANIMTYPE_GPDATABLOCK);
+ ale= make_new_animlistelem(gpl, ANIMTYPE_GPLAYER, gpd, ANIMTYPE_GPDATABLOCK, (ID*)gpd);
if (ale) {
BLI_addtail(anim_data, ale);
items++;
@@ -1244,7 +1237,6 @@ static int animdata_filter_gpencil (ListBase *anim_data, bScreen *sc, int filter
/* return the number of items added to the list */
return items;
}
-#endif
/* NOTE: owner_id is either material, lamp, or world block, which is the direct owner of the texture stack in question */
static int animdata_filter_dopesheet_texs (bAnimContext *ac, ListBase *anim_data, bDopeSheet *ads, ID *owner_id, int filter_mode)
@@ -1389,15 +1381,35 @@ static int animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data
short ok = 0;
/* for now, if no material returned, skip (this shouldn't confuse the user I hope) */
- if (ELEM(NULL, ma, ma->adt))
- continue;
-
+ if (ma == NULL) continue;
+
/* check if ok */
ANIMDATA_FILTER_CASES(ma,
{ /* AnimData blocks - do nothing... */ },
ok=1;,
ok=1;,
ok=1;)
+
+ /* need to check textures */
+ if (ok == 0 && !(ads->filterflag & ADS_FILTER_NOTEX)) {
+ int mtInd;
+
+ for (mtInd=0; mtInd < MAX_MTEX; mtInd++) {
+ MTex *mtex = ma->mtex[mtInd];
+
+ if(mtex && mtex->tex) {
+ ANIMDATA_FILTER_CASES(mtex->tex,
+ { /* AnimData blocks - do nothing... */ },
+ ok=1;,
+ ok=1;,
+ ok=1;)
+ }
+
+ if(ok)
+ break;
+ }
+ }
+
if (ok == 0) continue;
/* make a temp list elem for this */
@@ -1407,7 +1419,6 @@ static int animdata_filter_dopesheet_mats (bAnimContext *ac, ListBase *anim_data
}
/* if there were no channels found, no need to carry on */
- // XXX: textures with no animated owner material won't work because of this...
if (mats.first == NULL)
return 0;
@@ -1580,6 +1591,14 @@ static int animdata_filter_dopesheet_obdata (bAnimContext *ac, ListBase *anim_da
expanded= FILTER_MESH_OBJD(me);
}
break;
+ case OB_LATTICE: /* ---- Lattice ---- */
+ {
+ Lattice *lt = (Lattice *)ob->data;
+
+ type= ANIMTYPE_DSLAT;
+ expanded= FILTER_LATTICE_OBJD(lt);
+ }
+ break;
}
/* special exception for drivers instead of action */
@@ -1838,6 +1857,19 @@ static int animdata_filter_dopesheet_ob (bAnimContext *ac, ListBase *anim_data,
}
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((ads->filterflag & ADS_FILTER_NOLAT) == 0) {
+ ANIMDATA_FILTER_CASES(lt,
+ { /* AnimData blocks - do nothing... */ },
+ obdata_ok= 1;,
+ obdata_ok= 1;,
+ obdata_ok= 1;)
+ }
+ }
+ break;
}
if (obdata_ok)
items += animdata_filter_dopesheet_obdata(ac, anim_data, ads, base, filter_mode);
@@ -2029,7 +2061,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
if ((ads->source == NULL) || (GS(ads->source->name)!=ID_SCE)) {
printf("DopeSheet Error: Not scene!\n");
if (G.f & G_DEBUG)
- printf("\tPointer = %p, Name = '%s' \n", ads->source, (ads->source)?ads->source->name:NULL);
+ printf("\tPointer = %p, Name = '%s' \n", (void *)ads->source, (ads->source)?ads->source->name:NULL);
return 0;
}
@@ -2135,7 +2167,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
}
/* additionally, dopesheet filtering also affects what objects to consider */
- if (ads->filterflag) {
+ {
/* check selection and object type filters */
if ( (ads->filterflag & ADS_FILTER_ONLYSEL) && !((base->flag & SELECT) /*|| (base == sce->basact)*/) ) {
/* only selected should be shown */
@@ -2192,7 +2224,7 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
int a;
/* firstly check that we actuallly have some materials */
- for (a=0; a < ob->totcol; a++) {
+ for (a=1; a <= ob->totcol; a++) {
Material *ma= give_current_material(ob, a);
if (ma) {
@@ -2351,6 +2383,23 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
dataOk= !(ads->filterflag & ADS_FILTER_NOMESH);)
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+ dataOk= 0;
+ ANIMDATA_FILTER_CASES(lt,
+ if ((ads->filterflag & ADS_FILTER_NOLAT)==0) {
+ /* for the special AnimData blocks only case, we only need to add
+ * the block if it is valid... then other cases just get skipped (hence ok=0)
+ */
+ ANIMDATA_ADD_ANIMDATA(lt);
+ dataOk=0;
+ },
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);,
+ dataOk= !(ads->filterflag & ADS_FILTER_NOLAT);)
+ }
+ break;
default: /* --- other --- */
dataOk= 0;
break;
@@ -2385,89 +2434,6 @@ static int animdata_filter_dopesheet (bAnimContext *ac, ListBase *anim_data, bDo
if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
continue;
}
- else {
- /* check data-types */
- actOk= ANIMDATA_HAS_KEYS(ob);
- keyOk= (key != NULL);
-
- /* materials - only for geometric types */
- matOk= 0; /* by default, not ok... */
- if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) && (ob->totcol))
- {
- int a;
-
- /* firstly check that we actuallly have some materials */
- for (a=0; a < ob->totcol; a++) {
- Material *ma= give_current_material(ob, a);
-
- if ((ma) && ANIMDATA_HAS_KEYS(ma)) {
- matOk= 1;
- break;
- }
- }
- }
-
- /* data */
- switch (ob->type) {
- case OB_CAMERA: /* ------- Camera ------------ */
- {
- Camera *ca= (Camera *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(ca);
- }
- break;
- case OB_LAMP: /* ---------- Lamp ----------- */
- {
- Lamp *la= (Lamp *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(la);
- }
- break;
- case OB_CURVE: /* ------- Curve ---------- */
- case OB_SURF: /* ------- Nurbs Surface ---------- */
- case OB_FONT: /* ------- Text Curve ---------- */
- {
- Curve *cu= (Curve *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(cu);
- }
- break;
- case OB_MBALL: /* -------- Metas ---------- */
- {
- MetaBall *mb= (MetaBall *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(mb);
- }
- break;
- case OB_ARMATURE: /* -------- Armature ---------- */
- {
- bArmature *arm= (bArmature *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(arm);
- }
- break;
- case OB_MESH: /* -------- Mesh ---------- */
- {
- Mesh *me= (Mesh *)ob->data;
- dataOk= ANIMDATA_HAS_KEYS(me);
- }
- break;
- default: /* --- other --- */
- dataOk= 0;
- break;
- }
-
- /* particles */
- partOk = 0;
- if (ob->particlesystem.first) {
- ParticleSystem *psys = ob->particlesystem.first;
- for(; psys; psys=psys->next) {
- if(psys->part && ANIMDATA_HAS_KEYS(psys->part)) {
- partOk = 1;
- break;
- }
- }
- }
-
- /* check if all bad (i.e. nothing to show) */
- if (!actOk && !keyOk && !dataOk && !matOk && !partOk)
- continue;
- }
/* since we're still here, this object should be usable */
items += animdata_filter_dopesheet_ob(ac, anim_data, ads, base, filter_mode);
@@ -2501,7 +2467,7 @@ static short animdata_filter_dopesheet_summary (bAnimContext *ac, ListBase *anim
/* dopesheet summary
* - only for drawing and/or selecting keyframes in channels, but not for real editing
- * - only useful for DopeSheet Editor, where the summary is useful
+ * - only useful for DopeSheet/Action/etc. editors where it is actually useful
*/
// TODO: we should really check if some other prohibited filters are also active, but that can be for later
if ((filter_mode & ANIMFILTER_CHANNELS) && (ads->filterflag & ADS_FILTER_SUMMARY)) {
@@ -2602,9 +2568,12 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
switch (datatype) {
case ANIMCONT_ACTION: /* 'Action Editor' */
{
+ SpaceAction *saction = (SpaceAction *)ac->sa->spacedata.first;
+ bDopeSheet *ads = (saction)? &saction->ads : NULL;
+
/* the check for the DopeSheet summary is included here since the summary works here too */
if (animdata_filter_dopesheet_summary(ac, anim_data, filter_mode, &items))
- items += animdata_filter_action(ac, anim_data, NULL, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
+ items += animdata_filter_action(ac, anim_data, ads, data, filter_mode, NULL, ANIMTYPE_NONE, (ID *)obact);
}
break;
@@ -2618,7 +2587,7 @@ int ANIM_animdata_filter (bAnimContext *ac, ListBase *anim_data, int filter_mode
case ANIMCONT_GPENCIL:
{
- //items= animdata_filter_gpencil(anim_data, data, filter_mode);
+ items= animdata_filter_gpencil(anim_data, data, filter_mode);
}
break;
diff --git a/source/blender/editors/animation/anim_intern.h b/source/blender/editors/animation/anim_intern.h
index 274d33e4833..4f88f3ed194 100644
--- a/source/blender/editors/animation/anim_intern.h
+++ b/source/blender/editors/animation/anim_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index b71e9ac3507..a9ff27e970a 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,13 +37,14 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
-#include "BKE_utildefines.h"
-
#include "RNA_access.h"
+#include "ED_anim_api.h"
+
/* ----------------------- Getter functions ----------------------- */
/* Write into "name" buffer, the name of the property (retrieved using RNA from the curve's settings),
@@ -74,7 +75,8 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* try to resolve the path */
if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
- char *structname=NULL, *propname=NULL, *arrayname=NULL, arrayindbuf[16];
+ char *structname=NULL, *propname=NULL, arrayindbuf[16];
+ const char *arrayname=NULL;
short free_structname = 0;
/* For now, name will consist of 3 parts: struct-name, property name, array index
@@ -157,6 +159,9 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* icon for this should be the icon for the base ID */
// TODO: or should we just use the error icon?
icon= RNA_struct_ui_icon(id_ptr.type);
+
+ /* tag F-Curve as disabled - as not usable path */
+ fcu->flag |= FCURVE_DISABLED;
}
}
@@ -169,14 +174,14 @@ int getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
/* step between the major distinguishable color bands of the primary colors */
#define HSV_BANDWIDTH 0.3f
-/* used to determine the colour of F-Curves with FCURVE_COLOR_AUTO_RAINBOW set */
+/* used to determine the color of F-Curves with FCURVE_COLOR_AUTO_RAINBOW set */
//void fcurve_rainbow (unsigned int cur, unsigned int tot, float *out)
void getcolor_fcurve_rainbow (int cur, int tot, float *out)
{
float hue, val, sat, fac;
int grouping;
- /* we try to divide the colours into groupings of n colors,
+ /* we try to divide the color into groupings of n colors,
* where n is:
* 3 - for 'odd' numbers of curves - there should be a majority of triplets of curves
* 4 - for 'even' numbers of curves - there should be a majority of quartets of curves
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 719b46738d3..6aa8e010cc2 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "RNA_enum_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
@@ -56,6 +57,7 @@
#include "UI_view2d.h"
#include "UI_resources.h"
+#include "ED_anim_api.h"
#include "ED_markers.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -65,23 +67,48 @@
/* ************* Marker API **************** */
-static ListBase *context_get_markers(const bContext *C)
+/* helper function for getting the list of markers to work on */
+static ListBase *context_get_markers(Scene *scene, ScrArea *sa)
{
-
-#if 0
- /* XXX get them from pose */
- if ((slink->spacetype == SPACE_ACTION) && (saction->flag & SACTION_POSEMARKERS_MOVE)) {
- if (saction->action)
- markers= &saction->action->markers;
- else
- markers= NULL;
+ /* local marker sets... */
+ if (sa) {
+ if (sa->spacetype == SPACE_ACTION) {
+ SpaceAction *saction = (SpaceAction *)sa->spacedata.first;
+
+ /* local markers can only be shown when there's only a single active action to grab them from
+ * - flag only takes effect when there's an action, otherwise it can get too confusing?
+ */
+ if (ELEM(saction->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY) && (saction->action))
+ {
+ if (saction->flag & SACTION_POSEMARKERS_SHOW)
+ return &saction->action->markers;
+ }
+ }
}
- else
-#endif
- return &CTX_data_scene(C)->markers;
+ /* default to using the scene's markers */
+ return &scene->markers;
+}
+
+/* ............. */
+
+/* public API for getting markers from context */
+ListBase *ED_context_get_markers(const bContext *C)
+{
+ return context_get_markers(CTX_data_scene(C), CTX_wm_area(C));
+}
+
+/* public API for getting markers from "animation" context */
+ListBase *ED_animcontext_get_markers(const bAnimContext *ac)
+{
+ if (ac)
+ return context_get_markers(ac->scene, ac->sa);
+ else
+ return NULL;
}
+/* --------------------------------- */
+
/* Get the marker that is closest to this point */
/* XXX for select, the min_dist should be small */
TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x)
@@ -175,8 +202,10 @@ void ED_markers_get_minmax (ListBase *markers, short sel, float *first, float *l
*last= max;
}
+/* --------------------------------- */
+
/* Adds a marker to list of cfra elems */
-void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
+static void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
{
CfraElem *ce, *cen;
@@ -218,6 +247,46 @@ void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short only_sel)
add_marker_to_cfra_elem(lb, marker, only_sel);
}
+/* --------------------------------- */
+
+/* Get the first selected marker */
+TimeMarker *ED_markers_get_first_selected(ListBase *markers)
+{
+ TimeMarker *marker;
+
+ if (markers) {
+ for (marker = markers->first; marker; marker = marker->next) {
+ if (marker->flag & SELECT)
+ return marker;
+ }
+ }
+
+ return NULL;
+}
+
+/* --------------------------------- */
+
+/* Print debugging prints of list of markers
+ * BSI's: do NOT make static or put in if-defs as "unused code". That's too much trouble when we need to use for quick debuggging!
+ */
+void debug_markers_print_list(ListBase *markers)
+{
+ TimeMarker *marker;
+
+ if (markers == NULL) {
+ printf("No markers list to print debug for\n");
+ return;
+ }
+
+ printf("List of markers follows: -----\n");
+
+ for (marker = markers->first; marker; marker = marker->next) {
+ printf("\t'%s' on %d at %p with %d\n", marker->name, marker->frame, marker, marker->flag);
+ }
+
+ printf("End of list ------------------\n");
+}
+
/* ************* Marker Drawing ************ */
/* function to draw markers */
@@ -239,10 +308,11 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
/* vertical line - dotted */
#ifdef DURIAN_CAMERA_SWITCH
- if ((marker->camera) || (flag & DRAW_MARKERS_LINES)) {
+ if ((marker->camera) || (flag & DRAW_MARKERS_LINES))
#else
- if (flag & DRAW_MARKERS_LINES) {
+ if (flag & DRAW_MARKERS_LINES)
#endif
+ {
setlinestyle(3);
if (marker->flag & SELECT)
@@ -271,7 +341,6 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
UI_icon_draw(xpos*xscale-5.0f, 16.0f, icon_id);
- glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_BLEND);
/* and the marker name too, shifted slightly to the top-right */
@@ -313,7 +382,7 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
/* Draw Scene-Markers in time window */
void draw_markers_time(const bContext *C, int flag)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
View2D *v2d= UI_view2d_fromcontext(C);
TimeMarker *marker;
@@ -333,12 +402,103 @@ void draw_markers_time(const bContext *C, int flag)
}
}
+/* ************************ Marker Wrappers API ********************* */
+/* These wrappers allow marker operators to function within the confines
+ * of standard animation editors, such that they can coexist with the
+ * primary operations of those editors.
+ */
+
+/* maximum y-axis value (in region screen-space) that marker events should still be accepted for */
+#define ANIMEDIT_MARKER_YAXIS_MAX 40
+
+/* ------------------------ */
+
+/* special poll() which checks if there are selected markers first */
+static int ed_markers_poll_selected_markers(bContext *C)
+{
+ ListBase *markers = ED_context_get_markers(C);
+
+ /* first things first: markers can only exist in timeline views */
+ if (ED_operator_animview_active(C) == 0)
+ return 0;
+
+ /* check if some marker is selected */
+ return ED_markers_get_first_selected(markers) != NULL;
+}
+
+/* special poll() which checks if there are any markers at all first */
+static int ed_markers_poll_markers_exist(bContext *C)
+{
+ ListBase *markers = ED_context_get_markers(C);
+
+ /* first things first: markers can only exist in timeline views */
+ if (ED_operator_animview_active(C) == 0)
+ return 0;
+
+ /* list of markers must exist, as well as some markers in it! */
+ return (markers && markers->first);
+}
+
+/* ------------------------ */
+
+/* Second-tier invoke() callback that performs context validation before running the
+ * "custom"/third-tier invoke() callback supplied as the last arg (which would normally
+ * be the operator's invoke() callback elsewhere)
+ *
+ * < invoke_func: (fn(bContext*, wmOperator*, wmEvent*)=int) "standard" invoke function
+ * that operator would otherwise have used. If NULL, the operator's standard
+ * exec() callback will be called instead in the appropriate places.
+ */
+static int ed_markers_opwrap_invoke_custom(bContext *C, wmOperator *op, wmEvent *evt,
+ int (*invoke_func)(bContext*,wmOperator*,wmEvent*))
+{
+ ScrArea *sa = CTX_wm_area(C);
+ int retval = OPERATOR_PASS_THROUGH;
+
+ /* only timeline view doesn't need calling-location validation as it's the only dedicated view */
+ if (sa->spacetype != SPACE_TIME) {
+ /* restrict y-values to within ANIMEDIT_MARKER_YAXIS_MAX of the view's vertical extents, including scrollbars */
+ if (evt->mval[1] > ANIMEDIT_MARKER_YAXIS_MAX) {
+ /* not ok... "pass-through" to let normal editor's operators have a chance at tackling this event... */
+ //printf("MARKER-WRAPPER-DEBUG: event mval[1] = %d, so over accepted tolerance\n", evt->mval[1]);
+ return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
+ }
+ }
+
+ /* allow operator to run now */
+ if (invoke_func)
+ retval = invoke_func(C, op, evt);
+ else if (op->type->exec)
+ retval = op->type->exec(C, op);
+ else
+ BKE_report(op->reports, RPT_ERROR, "Programming error: operator doesn't actually have code to do anything!");
+
+ /* return status modifications - for now, make this spacetype dependent as above */
+ if (sa->spacetype != SPACE_TIME) {
+ /* unless successful, must add "pass-through" to let normal operator's have a chance at tackling this event */
+ if (retval != OPERATOR_FINISHED)
+ retval |= OPERATOR_PASS_THROUGH;
+ }
+
+ return retval;
+}
+
+/* standard wrapper - first-tier invoke() callback to be directly assigned to operator typedata
+ * for operators which don't need any special invoke calls. Any operators with special invoke calls
+ * though will need to implement their own wrapper which calls the second-tier callback themselves
+ * (passing through the custom invoke function they use)
+ */
+static int ed_markers_opwrap_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, NULL);
+}
+
/* ************************** add markers *************************** */
/* add TimeMarker at curent frame */
-static int ed_marker_add(bContext *C, wmOperator *op)
+static int ed_marker_add(bContext *C, wmOperator *UNUSED(op))
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
int frame= CTX_data_scene(C)->r.cfra;
@@ -352,16 +512,17 @@ static int ed_marker_add(bContext *C, wmOperator *op)
}
/* deselect all */
- for(marker= markers->first; marker; marker= marker->next)
+ for (marker= markers->first; marker; marker= marker->next)
marker->flag &= ~SELECT;
marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
marker->flag= SELECT;
marker->frame= frame;
- sprintf(marker->name, "F_%02d", frame); // XXX - temp code only
+ BLI_snprintf(marker->name, sizeof(marker->name), "F_%02d", frame); // XXX - temp code only
BLI_addtail(markers, marker);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
@@ -375,7 +536,8 @@ static void MARKER_OT_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_add;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -395,7 +557,7 @@ functions:
exit() cleanup, send notifier
- cancel() to escpae from modal
+ cancel() to escape from modal
callbacks:
@@ -419,7 +581,7 @@ typedef struct MarkerMove {
/* return 0 if not OK */
static int ed_marker_move_init(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
MarkerMove *mm;
TimeMarker *marker;
int totmark=0;
@@ -487,8 +649,13 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return OPERATOR_CANCELLED;
}
+static int ed_marker_move_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_move_invoke);
+}
+
/* note, init has to be called succesfully */
-static void ed_marker_move_apply(bContext *C, wmOperator *op)
+static void ed_marker_move_apply(wmOperator *op)
{
MarkerMove *mm= op->customdata;
TimeMarker *marker;
@@ -507,10 +674,11 @@ static void ed_marker_move_apply(bContext *C, wmOperator *op)
static void ed_marker_move_cancel(bContext *C, wmOperator *op)
{
RNA_int_set(op->ptr, "frames", 0);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
ed_marker_move_exit(C, op);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
}
@@ -534,17 +702,18 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE:
- if(WM_modal_tweak_exit(evt, mm->event_type)) {
+ if (WM_modal_tweak_exit(evt, mm->event_type)) {
ed_marker_move_exit(C, op);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
break;
case MOUSEMOVE:
- if(hasNumInput(&mm->num))
+ if (hasNumInput(&mm->num))
break;
-
+
dx= v2d->mask.xmax-v2d->mask.xmin;
dx= (v2d->cur.xmax-v2d->cur.xmin)/dx;
@@ -558,11 +727,11 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND))
apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, FPS, 0.1*FPS, 0);
else
- apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
+ apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, 0 /*was: U.flag & USER_AUTOGRABGRID*/);
offs= (int)fac;
RNA_int_set(op->ptr, "frames", offs);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
/* cruft below is for header print */
for (a=0, marker= mm->markers->first; marker; marker= marker->next) {
@@ -577,19 +746,19 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
SpaceTime *stime= (SpaceTime *)mm->slink;
if (stime->flag & TIME_DRAWFRAMES)
- sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
+ BLI_snprintf(str, sizeof(str), "Marker %d offset %d", selmarker->frame, offs);
else
- sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
+ BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
}
else if (mm->slink->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)mm->slink;
if (saction->flag & SACTION_DRAWTIME)
- sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
+ BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
else
- sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
+ BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
}
else {
- sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
+ BLI_snprintf(str, sizeof(str), "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
}
}
else {
@@ -597,44 +766,46 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
SpaceTime *stime= (SpaceTime *)mm->slink;
if (stime->flag & TIME_DRAWFRAMES)
- sprintf(str, "Marker offset %d ", offs);
+ BLI_snprintf(str, sizeof(str), "Marker offset %d ", offs);
else
- sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
+ BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", FRA2TIME(offs));
}
else if (mm->slink->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)mm->slink;
if (saction->flag & SACTION_DRAWTIME)
- sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
+ BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", FRA2TIME(offs));
else
- sprintf(str, "Marker offset %.2f ", (double)(offs));
+ BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", (double)(offs));
}
else {
- sprintf(str, "Marker offset %.2f ", (double)(offs));
+ BLI_snprintf(str, sizeof(str), "Marker offset %.2f ", (double)(offs));
}
}
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
ED_area_headerprint(CTX_wm_area(C), str);
}
}
- if(evt->val==KM_PRESS) {
+ if (evt->val==KM_PRESS) {
float vec[3];
char str_tx[256];
-
+
if (handleNumInput(&mm->num, evt))
{
applyNumInput(&mm->num, vec);
outputNumInput(&mm->num, str_tx);
-
+
RNA_int_set(op->ptr, "frames", vec[0]);
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
// ed_marker_header_update(C, op, str, (int)vec[0]);
// strcat(str, str_tx);
- sprintf(str, "Marker offset %s", str_tx);
+ BLI_snprintf(str, sizeof(str), "Marker offset %s", str_tx);
ED_area_headerprint(CTX_wm_area(C), str);
-
+
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
}
}
@@ -644,7 +815,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
static int ed_marker_move_exec(bContext *C, wmOperator *op)
{
if(ed_marker_move_init(C, op)) {
- ed_marker_move_apply(C, op);
+ ed_marker_move_apply(op);
ed_marker_move_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -660,9 +831,9 @@ static void MARKER_OT_move(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_move_exec;
- ot->invoke= ed_marker_move_invoke;
+ ot->invoke= ed_marker_move_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -692,9 +863,9 @@ callbacks:
/* duplicate selected TimeMarkers */
-static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
+static void ed_marker_duplicate_apply(bContext *C)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker, *newmarker;
if (markers == NULL)
@@ -719,6 +890,7 @@ static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
#endif
/* new marker is added to the begining of list */
+ // FIXME: bad ordering!
BLI_addhead(markers, newmarker);
}
}
@@ -726,7 +898,7 @@ static void ed_marker_duplicate_apply(bContext *C, wmOperator *op)
static int ed_marker_duplicate_exec(bContext *C, wmOperator *op)
{
- ed_marker_duplicate_apply(C, op);
+ ed_marker_duplicate_apply(C);
ed_marker_move_exec(C, op); /* assumes frs delta set */
return OPERATOR_FINISHED;
@@ -735,10 +907,15 @@ static int ed_marker_duplicate_exec(bContext *C, wmOperator *op)
static int ed_marker_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *evt)
{
- ed_marker_duplicate_apply(C, op);
+ ed_marker_duplicate_apply(C);
return ed_marker_move_invoke(C, op, evt);
}
+static int ed_marker_duplicate_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_duplicate_invoke);
+}
+
static void MARKER_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
@@ -748,9 +925,9 @@ static void MARKER_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_duplicate_exec;
- ot->invoke= ed_marker_duplicate_invoke;
+ ot->invoke= ed_marker_duplicate_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -784,12 +961,12 @@ static void select_timeline_marker_frame(ListBase *markers, int frame, unsigned
static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
View2D *v2d= UI_view2d_fromcontext(C);
float viewx;
int x, y, cfra;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_PASS_THROUGH;
x= evt->x - CTX_wm_region(C)->winrct.xmin;
@@ -806,27 +983,27 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
#ifdef DURIAN_CAMERA_SWITCH
- if(camera) {
+ if (camera) {
Scene *scene= CTX_data_scene(C);
Base *base;
TimeMarker *marker;
int sel= 0;
-
+
if (!extend)
scene_deselect_all(scene);
-
+
for (marker= markers->first; marker; marker= marker->next) {
if(marker->frame==cfra) {
sel= (marker->flag & SELECT);
break;
}
}
-
+
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->camera) {
- if(marker->frame==cfra) {
+ if (marker->camera) {
+ if (marker->frame==cfra) {
base= object_in_scene(marker->camera, scene);
- if(base) {
+ if (base) {
ED_base_object_select(base, sel);
if(sel)
ED_base_object_activate(C, base);
@@ -834,15 +1011,16 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
}
}
}
-
+
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
#endif
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
- /* allowing tweaks */
- return OPERATOR_PASS_THROUGH;
+ /* allowing tweaks, but needs OPERATOR_FINISHED, otherwise renaming fails... [#25987] */
+ return OPERATOR_FINISHED|OPERATOR_PASS_THROUGH;
}
static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
@@ -855,6 +1033,11 @@ static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return ed_marker_select(C, evt, extend, camera);
}
+static int ed_marker_select_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_select_invoke);
+}
+
static void MARKER_OT_select(wmOperatorType *ot)
{
/* identifiers */
@@ -863,8 +1046,8 @@ static void MARKER_OT_select(wmOperatorType *ot)
ot->idname= "MARKER_OT_select";
/* api callbacks */
- ot->invoke= ed_marker_select_invoke;
- ot->poll= ED_operator_areaactive;
+ ot->invoke= ed_marker_select_invoke_wrapper;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -899,7 +1082,7 @@ callbacks:
static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
{
View2D *v2d= UI_view2d_fromcontext(C);
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
float xminf, xmaxf, yminf, ymaxf;
int gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
@@ -911,34 +1094,34 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf);
UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf);
- /* XXX disputable */
- if(yminf > 30.0f || ymaxf < 0.0f)
- return 0;
-
- if(markers == NULL)
+ if (markers == NULL)
return 0;
/* XXX marker context */
- for(marker= markers->first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
switch (gesture_mode) {
case GESTURE_MODAL_SELECT:
- if ((marker->flag & SELECT) == 0)
- marker->flag |= SELECT;
+ marker->flag |= SELECT;
break;
case GESTURE_MODAL_DESELECT:
- if (marker->flag & SELECT)
- marker->flag &= ~SELECT;
+ marker->flag &= ~SELECT;
break;
}
}
}
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return 1;
}
+static int ed_marker_select_border_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_border_select_invoke);
+}
+
static void MARKER_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
@@ -948,10 +1131,10 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_border_select_exec;
- ot->invoke= WM_border_select_invoke;
+ ot->invoke= ed_marker_select_border_invoke_wrapper;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -964,21 +1147,15 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
int action = RNA_enum_get(op->ptr, "action");
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
- for(marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
- action = SEL_DESELECT;
- break;
- }
- }
+ action = (ED_markers_get_first_selected(markers) != NULL) ? SEL_DESELECT : SEL_SELECT;
}
for(marker= markers->first; marker; marker= marker->next) {
@@ -990,16 +1167,13 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
marker->flag &= ~SELECT;
break;
case SEL_INVERT:
- if (marker->flag & SELECT) {
- marker->flag &= ~SELECT;
- } else {
- marker->flag |= SELECT;
- }
+ marker->flag ^= SELECT;
break;
}
}
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
@@ -1013,7 +1187,8 @@ static void MARKER_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_select_all_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_markers_exist;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1022,32 +1197,39 @@ static void MARKER_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-/* ******************************* remove marker ***************** */
+/* ***************** remove marker *********************** */
/* remove selected TimeMarkers */
-static int ed_marker_delete_exec(bContext *C, wmOperator *op)
+static int ed_marker_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker, *nmarker;
short changed= 0;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
- for(marker= markers->first; marker; marker= nmarker) {
+ for (marker= markers->first; marker; marker= nmarker) {
nmarker= marker->next;
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
BLI_freelinkN(markers, marker);
changed= 1;
}
}
- if (changed)
+ if (changed) {
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
+ }
return OPERATOR_FINISHED;
}
+static int ed_marker_delete_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ // XXX: must we keep these confirmations?
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_operator_confirm);
+}
static void MARKER_OT_delete(wmOperatorType *ot)
{
@@ -1057,35 +1239,90 @@ static void MARKER_OT_delete(wmOperatorType *ot)
ot->idname= "MARKER_OT_delete";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
+ ot->invoke= ed_marker_delete_invoke_wrapper;
ot->exec= ed_marker_delete_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+/* **************** rename marker ***************** */
+
+/* rename first selected TimeMarker */
+static int ed_marker_rename_exec(bContext *C, wmOperator *op)
+{
+ TimeMarker *marker= ED_markers_get_first_selected(ED_context_get_markers(C));
+
+ if (marker) {
+ RNA_string_get(op->ptr, "name", marker->name);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
+
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+static int ed_marker_rename_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ /* must initialise the marker name first if there is a marker selected */
+ TimeMarker *marker = ED_markers_get_first_selected(ED_context_get_markers(C));
+ if (marker)
+ RNA_string_set(op->ptr, "name", marker->name);
+ /* now see if the operator is usable */
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_operator_props_popup);
}
+static void MARKER_OT_rename(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Rename Marker";
+ ot->description= "Rename first selected time marker";
+ ot->idname= "MARKER_OT_rename";
+
+ /* api callbacks */
+ ot->invoke= ed_marker_rename_invoke_wrapper;
+ ot->exec= ed_marker_rename_exec;
+ ot->poll= ed_markers_poll_selected_markers;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop = RNA_def_string(ot->srna, "name", "RenamedMarker", sizeof(((TimeMarker *)NULL)->name), "Name", "New name for marker");
+ //RNA_def_boolean(ot->srna, "ensure_unique", 0, "Ensure Unique", "Ensure that new name is unique within collection of markers");
+}
+
+/* **************** make links to scene ***************** */
+
static int ed_marker_make_links_scene_exec(bContext *C, wmOperator *op)
{
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene"));
TimeMarker *marker, *marker_new;
- if(scene_to==NULL) {
+ if (scene_to==NULL) {
BKE_report(op->reports, RPT_ERROR, "Scene not found");
return OPERATOR_CANCELLED;
}
- if(scene_to == CTX_data_scene(C)) {
- BKE_report(op->reports, RPT_ERROR, "Can't link objects into the same scene");
+ if (scene_to == CTX_data_scene(C)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't re-link markers into the same scene");
return OPERATOR_CANCELLED;
}
/* copy markers */
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
marker_new= MEM_dupallocN(marker);
+ marker_new->prev= marker_new->next = NULL;
+
BLI_addtail(&scene_to->markers, marker_new);
}
}
@@ -1099,12 +1336,13 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Links to Scene";
- ot->description= "Link markers to another scene";
+ ot->description= "Copy selected markers to another scene";
ot->idname= "MARKER_OT_make_links_scene";
/* api callbacks */
ot->exec= ed_marker_make_links_scene_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1119,25 +1357,20 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot)
#ifdef DURIAN_CAMERA_SWITCH
/* ******************************* camera bind marker ***************** */
-/* remove selected TimeMarkers */
-static int ed_marker_camera_bind_exec(bContext *C, wmOperator *op)
+static int ed_marker_camera_bind_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- ListBase *markers= context_get_markers(C);
+ ListBase *markers= ED_context_get_markers(C);
TimeMarker *marker;
- short changed= 0;
- if(markers == NULL)
+ marker= ED_markers_get_first_selected(markers);
+ if(marker == NULL)
return OPERATOR_CANCELLED;
- for(marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
- marker->camera= scene->camera;
- }
- }
+ marker->camera= scene->camera;
- if (changed)
- WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
@@ -1151,7 +1384,8 @@ static void MARKER_OT_camera_bind(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_camera_bind_exec;
- ot->poll= ED_operator_areaactive;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1170,6 +1404,7 @@ void ED_operatortypes_marker(void)
WM_operatortype_append(MARKER_OT_select_border);
WM_operatortype_append(MARKER_OT_select_all);
WM_operatortype_append(MARKER_OT_delete);
+ WM_operatortype_append(MARKER_OT_rename);
WM_operatortype_append(MARKER_OT_make_links_scene);
#ifdef DURIAN_CAMERA_SWITCH
WM_operatortype_append(MARKER_OT_camera_bind);
@@ -1201,6 +1436,7 @@ void ED_marker_keymap(wmKeyConfig *keyconf)
WM_keymap_verify_item(keymap, "MARKER_OT_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_verify_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "MARKER_OT_rename", MKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
#ifdef DURIAN_CAMERA_SWITCH
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 9b9c9435518..c08b902a13e 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,8 @@
#include "BLO_sys_types.h"
+#include "BLI_utildefines.h"
+
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
@@ -45,6 +47,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_anim_api.h"
#include "ED_screen.h"
#include "anim_intern.h"
@@ -151,7 +154,7 @@ static int change_frame_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-void ANIM_OT_change_frame(wmOperatorType *ot)
+static void ANIM_OT_change_frame(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Change frame";
@@ -206,18 +209,19 @@ static int previewrange_define_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_previewrange_set(wmOperatorType *ot)
+static void ANIM_OT_previewrange_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Preview Range";
ot->idname= "ANIM_OT_previewrange_set";
+ ot->description= "Interactively define frame range used for playback";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= previewrange_define_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -233,7 +237,7 @@ void ANIM_OT_previewrange_set(wmOperatorType *ot)
/* ****************** clear preview range operator ****************************/
-static int previewrange_clear_exec(bContext *C, wmOperator *op)
+static int previewrange_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
ScrArea *curarea= CTX_wm_area(C);
@@ -252,16 +256,17 @@ static int previewrange_clear_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_previewrange_clear(wmOperatorType *ot)
+static void ANIM_OT_previewrange_clear(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clear Preview Range";
ot->idname= "ANIM_OT_previewrange_clear";
+ ot->description= "Clear Preview Range";
/* api callbacks */
ot->exec= previewrange_clear_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -269,7 +274,7 @@ void ANIM_OT_previewrange_clear(wmOperatorType *ot)
/* ****************** time display toggle operator ****************************/
-static int toggle_time_exec(bContext *C, wmOperator *op)
+static int toggle_time_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *curarea= CTX_wm_area(C);
@@ -319,16 +324,17 @@ static int toggle_time_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void ANIM_OT_time_toggle(wmOperatorType *ot)
+static void ANIM_OT_time_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Toggle Frames/Seconds";
ot->idname= "ANIM_OT_time_toggle";
+ ot->description= "Toggle whether timing is displayed in frames or seconds for active timeline view";
/* api callbacks */
ot->exec= toggle_time_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_animview_active;
}
/* ************************** registration **********************************/
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index 9edcf637cdc..11795b76905 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,18 +27,30 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stdio.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "BKE_animsys.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
#include "BKE_context.h"
+#include "BKE_report.h"
+#include "BKE_material.h"
+#include "BKE_texture.h"
+
+#include "ED_keyframing.h"
#include "UI_interface.h"
@@ -48,6 +60,11 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "anim_intern.h"
+
+/* called by WM */
+void free_anim_drivers_copybuf (void);
+
/* ************************************************** */
/* Animation Data Validation */
@@ -58,7 +75,7 @@
* 1 - add new Driver FCurve,
* -1 - add new Driver FCurve without driver stuff (for pasting)
*/
-FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_index, short add)
+static FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_index, short add)
{
AnimData *adt;
FCurve *fcu;
@@ -115,7 +132,7 @@ FCurve *verify_driver_fcurve (ID *id, const char rna_path[], const int array_ind
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block
*/
-short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short flag, int type)
+short ANIM_add_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short flag, int type)
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -126,7 +143,9 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Add Driver: Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -153,7 +172,10 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* set the type of the driver */
driver->type= type;
- /* fill in current value for python */
+ /* creating drivers for buttons will create the driver(s) with type
+ * "scripted expression" so that their values won't be lost immediately,
+ * so here we copy those values over to the driver's expression
+ */
if (type == DRIVER_TYPE_PYTHON) {
PropertyType proptype= RNA_property_type(prop);
int array= RNA_property_array_length(&ptr, prop);
@@ -180,6 +202,17 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
BLI_snprintf(expression, maxlen, "%.3f", fval);
}
}
+
+ /* for easier setup of drivers from UI, a driver variable should be
+ * added if flag is set (UI calls only)
+ */
+ if (flag & CREATEDRIVER_WITH_DEFAULT_DVAR) {
+ /* assume that users will mostly want this to be of type "Transform Channel" too,
+ * since this allows the easiest setting up of common rig components
+ */
+ DriverVar *dvar = driver_add_new_variable(driver);
+ driver_change_variable_type(dvar, DVAR_TYPE_TRANSFORM_CHAN);
+ }
}
/* set the done status */
@@ -193,23 +226,21 @@ short ANIM_add_driver (ID *id, const char rna_path[], int array_index, short fla
/* Main Driver Management API calls:
* Remove the driver for the specified property on the given ID block (if available)
*/
-short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_remove_driver (ReportList *UNUSED(reports), ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
AnimData *adt;
FCurve *fcu;
int success= 0;
- /* get F-Curve
- * Note: here is one of the places where we don't want new F-Curve + Driver added!
- * so 'add' var must be 0
- */
/* we don't check the validity of the path here yet, but it should be ok... */
adt= BKE_animdata_from_id(id);
- if(adt) {
- if(array_index == -1) {
+ if (adt) {
+ if (array_index == -1) {
+ /* step through all drivers, removing all of those with the same base path */
FCurve *fcu_iter= adt->drivers.first;
- while((fcu= iter_step_fcurve(fcu_iter, rna_path))) {
+
+ while ((fcu = iter_step_fcurve(fcu_iter, rna_path)) != NULL) {
/* store the next fcurve for looping */
fcu_iter= fcu->next;
@@ -222,8 +253,12 @@ short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index,
}
}
else {
+ /* find the matching driver and remove it only
+ * Note: here is one of the places where we don't want new F-Curve + Driver added!
+ * so 'add' var must be 0
+ */
fcu= verify_driver_fcurve(id, rna_path, array_index, 0);
- if(fcu) {
+ if (fcu) {
BLI_remlink(&adt->drivers, fcu);
free_fcurve(fcu);
@@ -262,7 +297,7 @@ short ANIM_driver_can_paste (void)
/* Main Driver Management API calls:
* Make a copy of the driver for the specified property on the given ID block
*/
-short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_copy_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -271,7 +306,9 @@ short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short fl
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Copy Driver: Could not find Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not find Driver to copy, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -307,7 +344,7 @@ short ANIM_copy_driver (ID *id, const char rna_path[], int array_index, short fl
* Add a new driver for the specified property on the given ID block or replace an existing one
* with the driver + driver-curve data from the buffer
*/
-short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short flag)
+short ANIM_paste_driver (ReportList *reports, ID *id, const char rna_path[], int array_index, short UNUSED(flag))
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop;
@@ -316,13 +353,15 @@ short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short f
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Paste Driver: Could not add Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not paste Driver, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
/* if the buffer is empty, cannot paste... */
if (channeldriver_copypaste_buf == NULL) {
- printf("Paste Driver: No Driver to paste. \n");
+ BKE_report(reports, RPT_ERROR, "Paste Driver: No Driver to paste.");
return 0;
}
@@ -360,28 +399,104 @@ short ANIM_paste_driver (ID *id, const char rna_path[], int array_index, short f
/* ************************************************** */
/* UI-Button Interface */
+/* Temporary wrapper for driver operators for buttons to make it easier to create
+ * such drivers by rerouting all paths through the active object instead so that
+ * they will get picked up by the dependency system.
+ *
+ * < C: context pointer - for getting active data
+ * <> ptr: RNA pointer for property's datablock. May be modified as result of path remapping.
+ * < prop: RNA definition of property to add for
+ *
+ * > returns: MEM_alloc'd string representing the path to the property from the given PointerRNA
+ */
+static char *get_driver_path_hack (bContext *C, PointerRNA *ptr, PropertyRNA *prop)
+{
+ ID *id = (ID *)ptr->id.data;
+ ScrArea *sa = CTX_wm_area(C);
+
+ /* get standard path which may be extended */
+ char *basepath = RNA_path_from_ID_to_property(ptr, prop);
+ char *path = basepath; /* in case no remapping is needed */
+
+ /* Remapping will only be performed in the Properties Editor, as only this
+ * restricts the subspace of options to the 'active' data (a manageable state)
+ */
+ // TODO: watch out for pinned context?
+ if ((sa) && (sa->spacetype == SPACE_BUTS)) {
+ Object *ob = CTX_data_active_object(C);
+
+ if (ob && id) {
+ /* only id-types which can be remapped to go through objects should be considered */
+ switch (GS(id->name)) {
+ case ID_MA: /* materials */
+ {
+ Material *ma = give_current_material(ob, ob->actcol);
+
+ /* assumes: material will only be shown if it is active objects's active material it's ok */
+ if ((ID*)ma == id) {
+ /* create new path */
+ // TODO: use RNA path functions to construct instead?
+ path = BLI_sprintfN("material_slots[\"%s\"].material.%s",
+ ma->id.name+2, basepath);
+
+ /* free old one */
+ MEM_freeN(basepath);
+ }
+ }
+ break;
+
+ case ID_TE: /* textures */
+ {
+ Material *ma = give_current_material(ob, ob->actcol);
+ Tex *tex = give_current_material_texture(ma);
+
+ /* assumes: texture will only be shown if it is active material's active texture it's ok */
+ if ((ID*)tex == id) {
+ /* create new path */
+ // TODO: use RNA path functions to construct step by step instead?
+ path = BLI_sprintfN("material_slots[\"%s\"].material.texture_slots[\"%s\"].texture.%s",
+ ma->id.name+2, tex->id.name+2, basepath);
+
+ /* free old one */
+ MEM_freeN(basepath);
+ }
+ }
+ break;
+ }
+
+ /* fix RNA pointer, as we've now changed the ID root by changing the paths */
+ if (basepath != path) {
+ /* rebase provided pointer so that it starts from object... */
+ RNA_pointer_create(&ob->id, ptr->type, ptr->data, ptr);
+ }
+ }
+ }
+
+ /* the path should now have been corrected for use */
+ return path;
+}
+
/* Add Driver Button Operator ------------------------ */
static int add_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index, all= RNA_boolean_get(op->ptr, "all");
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
-
+ uiContextActiveProperty(C, &ptr, &prop, &index);
+
if (all)
index= -1;
-
- if (ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+
+ if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
+ char *path= get_driver_path_hack(C, &ptr, prop);
+ short flags = CREATEDRIVER_WITH_DEFAULT_DVAR;
if (path) {
- success+= ANIM_add_driver(ptr.id.data, path, index, 0, DRIVER_TYPE_PYTHON);
+ success+= ANIM_add_driver(op->reports, ptr.id.data, path, index, flags, DRIVER_TYPE_PYTHON);
MEM_freeN(path);
}
@@ -389,6 +504,8 @@ static int add_driver_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
+ uiContextAnimUpdate(C);
+
DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
@@ -419,27 +536,28 @@ void ANIM_OT_driver_button_add (wmOperatorType *ot)
static int remove_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index, all= RNA_boolean_get(op->ptr, "all");
/* try to find driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
if (all)
index= -1;
-
- if (ptr.data && prop) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
- success= ANIM_remove_driver(ptr.id.data, path, index, 0);
+
+ if (ptr.id.data && ptr.data && prop) {
+ char *path= get_driver_path_hack(C, &ptr, prop);
+
+ success= ANIM_remove_driver(op->reports, ptr.id.data, path, index, 0);
MEM_freeN(path);
}
if (success) {
/* send updates */
+ uiContextAnimUpdate(C);
+
DAG_ids_flush_update(CTX_data_main(C), 0);
WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
@@ -470,22 +588,22 @@ void ANIM_OT_driver_button_remove (wmOperatorType *ot)
static int copy_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index;
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if (ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+ if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
+ char *path= get_driver_path_hack(C, &ptr, prop);
if (path) {
/* only copy the driver for the button that this was involved for */
- success= ANIM_copy_driver(ptr.id.data, path, index, 0);
+ success= ANIM_copy_driver(op->reports, ptr.id.data, path, index, 0);
+
+ uiContextAnimUpdate(C);
MEM_freeN(path);
}
@@ -514,22 +632,22 @@ void ANIM_OT_copy_driver_button (wmOperatorType *ot)
static int paste_driver_button_exec (bContext *C, wmOperator *op)
{
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
- char *path;
short success= 0;
int index;
/* try to create driver using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if (ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
- path= RNA_path_from_ID_to_property(&ptr, prop);
+ if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
+ char *path= get_driver_path_hack(C, &ptr, prop);
if (path) {
/* only copy the driver for the button that this was involved for */
- success= ANIM_paste_driver(ptr.id.data, path, index, 0);
+ success= ANIM_paste_driver(op->reports, ptr.id.data, path, index, 0);
+
+ uiContextAnimUpdate(C);
MEM_freeN(path);
}
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index 35e6cb66d45..0b8619c1f6e 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,6 +43,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_fcurve.h"
@@ -52,10 +53,11 @@
#include "RNA_access.h"
-
#include "UI_interface.h"
#include "UI_resources.h"
+#include "ED_anim_api.h"
+
/* ********************************************** */
/* UI STUFF */
@@ -74,7 +76,7 @@
}
/* callback to verify modifier data */
-static void validate_fmodifier_cb (bContext *C, void *fcm_v, void *dummy)
+static void validate_fmodifier_cb (bContext *UNUSED(C), void *fcm_v, void *UNUSED(arg))
{
FModifier *fcm= (FModifier *)fcm_v;
FModifierTypeInfo *fmi= fmodifier_get_typeinfo(fcm);
@@ -215,7 +217,7 @@ static void draw_modifier__generator(uiLayout *layout, ID *id, FModifier *fcm, s
/* --------------- */
/* draw settings for generator modifier */
-static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *col;
PointerRNA ptr;
@@ -225,20 +227,20 @@ static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm
/* add the settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "function_type", 0, "", 0);
- uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, &ptr, "function_type", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 0); // no grouping for now
- uiItemR(col, &ptr, "amplitude", 0, NULL, 0);
- uiItemR(col, &ptr, "phase_multiplier", 0, NULL, 0);
- uiItemR(col, &ptr, "phase_offset", 0, NULL, 0);
- uiItemR(col, &ptr, "value_offset", 0, NULL, 0);
+ uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NULL);
}
/* --------------- */
/* draw settings for cycles modifier */
-static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col;
PointerRNA ptr;
@@ -253,21 +255,21 @@ static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, shor
/* before range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "Before:", 0);
- uiItemR(col, &ptr, "mode_before", 0, "", 0);
- uiItemR(col, &ptr, "cycles_before", 0, NULL, 0);
+ uiItemL(col, "Before:", ICON_NULL);
+ uiItemR(col, &ptr, "mode_before", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NULL);
/* after range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "After:", 0);
- uiItemR(col, &ptr, "mode_after", 0, "", 0);
- uiItemR(col, &ptr, "cycles_after", 0, NULL, 0);
+ uiItemL(col, "After:", ICON_NULL);
+ uiItemR(col, &ptr, "mode_after", 0, "", ICON_NULL);
+ uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NULL);
}
/* --------------- */
/* draw settings for noise modifier */
-static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col;
PointerRNA ptr;
@@ -276,20 +278,20 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short
RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr);
/* blending mode */
- uiItemR(layout, &ptr, "blend_type", 0, NULL, 0);
+ uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NULL);
/* split into 2 columns */
split= uiLayoutSplit(layout, 0.5f, 0);
/* col 1 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "scale", 0, NULL, 0);
- uiItemR(col, &ptr, "strength", 0, NULL, 0);
+ uiItemR(col, &ptr, "scale", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "strength", 0, NULL, ICON_NULL);
/* col 2 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "phase", 0, NULL, 0);
- uiItemR(col, &ptr, "depth", 0, NULL, 0);
+ uiItemR(col, &ptr, "phase", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "depth", 0, NULL, ICON_NULL);
}
/* --------------- */
@@ -374,7 +376,7 @@ static int binarysearch_fcm_envelopedata_index (FCM_EnvelopeData array[], float
/* callback to add new envelope data point */
// TODO: should we have a separate file for things like this?
-static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *dummy)
+static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *UNUSED(arg))
{
Scene *scene= CTX_data_scene(C);
FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
@@ -426,7 +428,7 @@ static void fmod_envelope_addpoint_cb (bContext *C, void *fcm_dv, void *dummy)
/* callback to remove envelope data point */
// TODO: should we have a separate file for things like this?
-static void fmod_envelope_deletepoint_cb (bContext *C, void *fcm_dv, void *ind_v)
+static void fmod_envelope_deletepoint_cb (bContext *UNUSED(C), void *fcm_dv, void *ind_v)
{
FMod_Envelope *env= (FMod_Envelope *)fcm_dv;
FCM_EnvelopeData *fedn;
@@ -454,7 +456,7 @@ static void fmod_envelope_deletepoint_cb (bContext *C, void *fcm_dv, void *ind_v
}
/* draw settings for envelope modifier */
-static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed;
@@ -469,12 +471,12 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
/* general settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Envelope:", 0);
- uiItemR(col, &ptr, "reference_value", 0, NULL, 0);
+ uiItemL(col, "Envelope:", ICON_NULL);
+ uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NULL);
row= uiLayoutRow(col, 1);
- uiItemR(row, &ptr, "default_min", 0, "Min", 0);
- uiItemR(row, &ptr, "default_max", 0, "Max", 0);
+ uiItemR(row, &ptr, "default_min", 0, "Min", ICON_NULL);
+ uiItemR(row, &ptr, "default_max", 0, "Max", ICON_NULL);
/* control points header */
// TODO: move this control-point control stuff to using the new special widgets for lists
@@ -509,7 +511,7 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
/* --------------- */
/* draw settings for limits modifier */
-static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *split, *col, *row;
PointerRNA ptr;
@@ -526,13 +528,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_x", 0, NULL, 0);
- uiItemR(col, &ptr, "min_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NULL);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_y", 0, NULL, 0);
- uiItemR(col, &ptr, "min_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NULL);
}
/* row 2: maximum */
@@ -544,20 +546,20 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_x", 0, NULL, 0);
- uiItemR(col, &ptr, "max_x", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NULL);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_y", 0, NULL, 0);
- uiItemR(col, &ptr, "max_y", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NULL);
}
}
/* --------------- */
/* draw settings for stepped interpolation modifier */
-static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, short width)
+static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, short UNUSED(width))
{
uiLayout *col, *subcol;
PointerRNA ptr;
@@ -567,24 +569,24 @@ static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, sho
/* block 1: "stepping" settings */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "frame_step", 0, NULL, 0);
- uiItemR(col, &ptr, "frame_offset", 0, NULL, 0);
+ uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NULL);
/* block 2: start range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_start", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_start"));
- uiItemR(subcol, &ptr, "frame_start", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "frame_start", 0, NULL, ICON_NULL);
/* block 3: end range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_end", 0, NULL, 0);
+ uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_end"));
- uiItemR(subcol, &ptr, "frame_end", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "frame_end", 0, NULL, ICON_NULL);
}
/* --------------- */
@@ -616,16 +618,16 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
uiBlockSetEmboss(block, UI_EMBOSSN);
/* expand */
- uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* checkbox for 'active' status (for now) */
- uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* name */
if (fmi)
- uiItemL(subrow, fmi->name, 0);
+ uiItemL(subrow, fmi->name, ICON_NULL);
else
- uiItemL(subrow, "<Unknown Modifier>", 0);
+ uiItemL(subrow, "<Unknown Modifier>", ICON_NULL);
/* right-align ------------------------------------------- */
subrow= uiLayoutRow(row, 0);
@@ -633,7 +635,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
/* 'mute' button */
- uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
uiBlockSetEmboss(block, UI_EMBOSSN);
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index 02e141a7a69..fb09b8d5c85 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,6 +39,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -47,6 +48,7 @@
#include "DNA_scene_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_meta_types.h"
@@ -58,7 +60,7 @@
#include "BKE_key.h"
#include "BKE_material.h"
#include "BKE_global.h" // XXX remove me!
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -135,6 +137,49 @@ static void nupdate_ak_bezt (void *node, void *data)
ak->key_type= BEZT_KEYTYPE_KEYFRAME;
}
+/* ......... */
+
+/* Comparator callback used for ActKeyColumns and GPencil frame */
+static short compare_ak_gpframe (void *node, void *data)
+{
+ ActKeyColumn *ak= (ActKeyColumn *)node;
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ if (gpf->framenum < ak->cfra)
+ return -1;
+ else if (gpf->framenum > ak->cfra)
+ return 1;
+ else
+ return 0;
+}
+
+/* New node callback used for building ActKeyColumns from GPencil frames */
+static DLRBT_Node *nalloc_ak_gpframe (void *data)
+{
+ ActKeyColumn *ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumnGPF");
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ /* store settings based on state of BezTriple */
+ ak->cfra= gpf->framenum;
+ ak->sel= (gpf->flag & GP_FRAME_SELECT) ? SELECT : 0;
+
+ /* set 'modified', since this is used to identify long keyframes */
+ ak->modified = 1;
+
+ return (DLRBT_Node *)ak;
+}
+
+/* Node updater callback used for building ActKeyColumns from GPencil frames */
+static void nupdate_ak_gpframe (void *node, void *data)
+{
+ ActKeyColumn *ak= (ActKeyColumn *)node;
+ bGPDframe *gpf= (bGPDframe *)data;
+
+ /* set selection status and 'touched' status */
+ if (gpf->flag & GP_FRAME_SELECT) ak->sel = SELECT;
+ ak->modified += 1;
+}
+
/* --------------- */
/* Add the given BezTriple to the given 'list' of Keyframes */
@@ -146,6 +191,15 @@ static void add_bezt_to_keycolumns_list(DLRBT_Tree *keys, BezTriple *bezt)
BLI_dlrbTree_add(keys, compare_ak_bezt, nalloc_ak_bezt, nupdate_ak_bezt, bezt);
}
+/* Add the given GPencil Frame to the given 'list' of Keyframes */
+static void add_gpframe_to_keycolumns_list(DLRBT_Tree *keys, bGPDframe *gpf)
+{
+ if ELEM(NULL, keys, gpf)
+ return;
+ else
+ BLI_dlrbTree_add(keys, compare_ak_gpframe, nalloc_ak_gpframe, nupdate_ak_gpframe, gpf);
+}
+
/* ActBeztColumns (Helpers for Long Keyframes) ------------------------------ */
/* maximum size of default buffer for BezTriple columns */
@@ -392,7 +446,7 @@ static const float _unit_diamond_shape[4][2] = {
};
/* draw a simple diamond shape with OpenGL */
-void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel, short key_type, short mode)
+void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel, short key_type, short mode, float alpha)
{
static GLuint displist1=0;
static GLuint displist2=0;
@@ -441,23 +495,30 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
switch (key_type) {
case BEZT_KEYTYPE_BREAKDOWN: /* bluish frames for now */
{
- if (sel) glColor3f(0.33f, 0.75f, 0.93f);
- else glColor3f(0.70f, 0.86f, 0.91f);
+ if (sel) glColor4f(0.33f, 0.75f, 0.93f, alpha);
+ else glColor4f(0.70f, 0.86f, 0.91f, alpha);
}
break;
case BEZT_KEYTYPE_EXTREME: /* redish frames for now */
{
- if (sel) glColor3f(95.0f, 0.5f, 0.5f);
- else glColor3f(0.91f, 0.70f, 0.80f);
+ if (sel) glColor4f(0.95f, 0.5f, 0.5f, alpha);
+ else glColor4f(0.91f, 0.70f, 0.80f, alpha);
+ }
+ break;
+
+ case BEZT_KEYTYPE_JITTER: /* greenish frames for now? */
+ {
+ if (sel) glColor4f(0.38f, 0.75f, 0.26f, alpha);
+ else glColor4f(0.58f, 0.90f, 0.46f, alpha);
}
break;
case BEZT_KEYTYPE_KEYFRAME: /* traditional yellowish frames for now */
default:
{
- if (sel) UI_ThemeColorShade(TH_STRIP_SELECT, 50);
- else glColor3f(0.91f, 0.91f, 0.91f);
+ if (sel) UI_ThemeColorShadeAlpha(TH_STRIP_SELECT, 50, -255*(1.0f-alpha));
+ else glColor4f(0.91f, 0.91f, 0.91f, alpha);
}
break;
}
@@ -467,7 +528,7 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
if ELEM(mode, KEYFRAME_SHAPE_FRAME, KEYFRAME_SHAPE_BOTH) {
/* exterior - black frame */
- glColor3ub(0, 0, 0);
+ glColor4f(0.0f, 0.0f, 0.0f, alpha);
glCallList(displist1);
}
@@ -479,7 +540,7 @@ void draw_keyframe_shape (float x, float y, float xscale, float hsize, short sel
glTranslatef(-x, -y, 0.0f);
}
-static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos)
+static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos, short channelLocked)
{
ActKeyColumn *ak;
ActKeyBlock *ab;
@@ -522,6 +583,10 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* draw keys */
if (keys) {
+ /* locked channels are less strongly shown, as feedback for locked channels in DopeSheet */
+ // TODO: allow this opacity factor to be themed?
+ float kalpha = (channelLocked)? 0.35f : 1.0f;
+
for (ak= keys->first; ak; ak= ak->next) {
/* optimisation: if keyframe doesn't appear within 5 units (screenspace) in visible area, don't draw
* - this might give some improvements, since we current have to flip between view/region matrices
@@ -532,7 +597,7 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* draw using OpenGL - uglier but faster */
// NOTE1: a previous version of this didn't work nice for some intel cards
// NOTE2: if we wanted to go back to icons, these are icon = (ak->sel & SELECT) ? ICON_SPACE2 : ICON_SPACE3;
- draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH);
+ draw_keyframe_shape(ak->cfra, ypos, xscale, 5.0f, (ak->sel & SELECT), ak->key_type, KEYFRAME_SHAPE_BOTH, kalpha);
}
}
@@ -553,7 +618,7 @@ void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -571,7 +636,7 @@ void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -589,7 +654,7 @@ void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -607,7 +672,7 @@ void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, (fcu->flag & FCURVE_PROTECTED));
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -625,7 +690,7 @@ void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float y
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, (agrp->flag & AGRP_PROTECTED));
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -643,7 +708,7 @@ void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos)
BLI_dlrbTree_linkedlist_sync(&keys);
BLI_dlrbTree_linkedlist_sync(&blocks);
- draw_keylist(v2d, &keys, &blocks, ypos);
+ draw_keylist(v2d, &keys, &blocks, ypos, 0);
BLI_dlrbTree_free(&keys);
BLI_dlrbTree_free(&blocks);
@@ -655,11 +720,11 @@ void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos)
BLI_dlrbTree_init(&keys);
- gpl_to_keylist(ads, gpl, &keys, NULL);
+ gpl_to_keylist(ads, gpl, &keys);
BLI_dlrbTree_linkedlist_sync(&keys);
- draw_keylist(v2d, &keys, NULL, ypos);
+ draw_keylist(v2d, &keys, NULL, ypos, (gpl->flag & GP_LAYER_LOCKED));
BLI_dlrbTree_free(&keys);
}
@@ -753,6 +818,8 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
/* add material's data */
action_to_keylist(ma->adt, ma->adt->action, keys, blocks);
+
+ // TODO: textures...
}
}
@@ -808,6 +875,14 @@ void ob_to_keylist(bDopeSheet *ads, Object *ob, DLRBT_Tree *keys, DLRBT_Tree *bl
action_to_keylist(me->adt, me->adt->action, keys, blocks);
}
break;
+ case OB_LATTICE: /* ------- Lattice ---------- */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((lt->adt) && !(filterflag & ADS_FILTER_NOLAT))
+ action_to_keylist(lt->adt, lt->adt->action, keys, blocks);
+ }
+ break;
}
/* Add Particle System Keyframes */
@@ -898,26 +973,14 @@ void action_to_keylist(AnimData *adt, bAction *act, DLRBT_Tree *keys, DLRBT_Tree
}
-void gpl_to_keylist(bDopeSheet *ads, bGPDlayer *gpl, DLRBT_Tree *keys, DLRBT_Tree *blocks)
+void gpl_to_keylist(bDopeSheet *UNUSED(ads), bGPDlayer *gpl, DLRBT_Tree *keys)
{
bGPDframe *gpf;
- ActKeyColumn *ak;
if (gpl && keys) {
- /* loop over frames, converting directly to 'keyframes' (should be in order too) */
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- ak= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
- BLI_addtail((ListBase *)keys, ak);
-
- ak->cfra= (float)gpf->framenum;
- ak->modified = 1;
- ak->key_type= 0;
-
- if (gpf->flag & GP_FRAME_SELECT)
- ak->sel = SELECT;
- else
- ak->sel = 0;
- }
+ /* although the frames should already be in an ordered list, they are not suitable for displaying yet */
+ for (gpf= gpl->frames.first; gpf; gpf= gpf->next)
+ add_gpframe_to_keycolumns_list(keys, gpf);
}
}
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index 17d674784f8..23c2a5a013b 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,12 +33,14 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_camera_types.h"
#include "DNA_key_types.h"
#include "DNA_lamp_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_mesh_types.h"
#include "DNA_material_types.h"
#include "DNA_object_types.h"
@@ -51,7 +53,7 @@
#include "BKE_fcurve.h"
#include "BKE_key.h"
#include "BKE_material.h"
-#include "BKE_utildefines.h"
+
#include "ED_anim_api.h"
#include "ED_keyframes_edit.h"
@@ -318,6 +320,16 @@ static short ob_keyframes_loop(KeyframeEditData *ked, Object *ob, KeyframeEditFu
}
}
break;
+ case OB_LATTICE: /* ---- Lattice ------ */
+ {
+ Lattice *lt= (Lattice *)ob->data;
+
+ if ((lt->adt) && !(filterflag & ADS_FILTER_NOLAT)) {
+ if (adt_keyframes_loop(ked, lt->adt, key_ok, key_cb, fcu_cb, filterflag))
+ return 1;
+ }
+ }
+ break;
}
/* Add Particle System Keyframes */
@@ -369,7 +381,7 @@ static short scene_keyframes_loop(KeyframeEditData *ked, Scene *sce, KeyframeEdi
}
/* This function is used to loop over the keyframe data in a DopeSheet summary */
-static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int filterflag)
+static short summary_keyframes_loop(KeyframeEditData *ked, bAnimContext *ac, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb, int UNUSED(filterflag))
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -541,7 +553,7 @@ static short ok_bezier_framerange(KeyframeEditData *ked, BezTriple *bezt)
return ok;
}
-static short ok_bezier_selected(KeyframeEditData *ked, BezTriple *bezt)
+static short ok_bezier_selected(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
/* this macro checks all beztriple handles for selection...
* only one of the verts has to be selected for this to be ok...
@@ -677,7 +689,7 @@ void bezt_remap_times(KeyframeEditData *ked, BezTriple *bezt)
/* Transform */
/* snaps the keyframe to the nearest frame */
-static short snap_bezier_nearest(KeyframeEditData *ked, BezTriple *bezt)
+static short snap_bezier_nearest(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]+0.5));
@@ -713,7 +725,7 @@ static short snap_bezier_nearmarker(KeyframeEditData *ked, BezTriple *bezt)
}
/* make the handles have the same value as the key */
-static short snap_bezier_horizontal(KeyframeEditData *ked, BezTriple *bezt)
+static short snap_bezier_horizontal(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT) {
bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1];
@@ -768,7 +780,7 @@ static short mirror_bezier_cframe(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short mirror_bezier_yaxis(KeyframeEditData *ked, BezTriple *bezt)
+static short mirror_bezier_yaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
float diff;
@@ -780,7 +792,7 @@ static short mirror_bezier_yaxis(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short mirror_bezier_xaxis(KeyframeEditData *ked, BezTriple *bezt)
+static short mirror_bezier_xaxis(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
float diff;
@@ -841,7 +853,7 @@ KeyframeEditFunc ANIM_editkeyframes_mirror(short type)
/* Settings */
/* Sets the selected bezier handles to type 'auto' */
-static short set_bezier_auto(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_auto(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) {
if (bezt->f1 & SELECT) bezt->h1= HD_AUTO; /* the secret code for auto */
@@ -859,7 +871,7 @@ static short set_bezier_auto(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets the selected bezier handles to type 'vector' */
-static short set_bezier_vector(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_vector(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if ((bezt->f1 & SELECT) || (bezt->f3 & SELECT)) {
if (bezt->f1 & SELECT) bezt->h1= HD_VECT;
@@ -879,7 +891,7 @@ static short set_bezier_vector(KeyframeEditData *ked, BezTriple *bezt)
/* Queries if the handle should be set to 'free' or 'align' */
// NOTE: this was used for the 'toggle free/align' option
// currently this isn't used, but may be restored later
-static short bezier_isfree(KeyframeEditData *ked, BezTriple *bezt)
+static short bezier_isfree(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if ((bezt->f1 & SELECT) && (bezt->h1)) return 1;
if ((bezt->f3 & SELECT) && (bezt->h2)) return 1;
@@ -887,7 +899,7 @@ static short bezier_isfree(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets selected bezier handles to type 'align' */
-static short set_bezier_align(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_align(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f1 & SELECT) bezt->h1= HD_ALIGN;
if (bezt->f3 & SELECT) bezt->h2= HD_ALIGN;
@@ -895,7 +907,7 @@ static short set_bezier_align(KeyframeEditData *ked, BezTriple *bezt)
}
/* Sets selected bezier handles to type 'free' */
-static short set_bezier_free(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezier_free(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f1 & SELECT) bezt->h1= HD_FREE;
if (bezt->f3 & SELECT) bezt->h2= HD_FREE;
@@ -925,21 +937,21 @@ KeyframeEditFunc ANIM_editkeyframes_handles(short code)
/* ------- */
-static short set_bezt_constant(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_constant(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_CONST;
return 0;
}
-static short set_bezt_linear(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_linear(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_LIN;
return 0;
}
-static short set_bezt_bezier(KeyframeEditData *ked, BezTriple *bezt)
+static short set_bezt_bezier(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
bezt->ipo= BEZT_IPO_BEZ;
@@ -962,27 +974,34 @@ KeyframeEditFunc ANIM_editkeyframes_ipo(short code)
/* ------- */
-static short set_keytype_keyframe(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_keyframe(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_KEYFRAME;
return 0;
}
-static short set_keytype_breakdown(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_breakdown(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_BREAKDOWN;
return 0;
}
-static short set_keytype_extreme(KeyframeEditData *ked, BezTriple *bezt)
+static short set_keytype_extreme(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
BEZKEYTYPE(bezt)= BEZT_KEYTYPE_EXTREME;
return 0;
}
+static short set_keytype_jitter(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
+{
+ if (bezt->f2 & SELECT)
+ BEZKEYTYPE(bezt)= BEZT_KEYTYPE_JITTER;
+ return 0;
+}
+
/* Set the interpolation type of the selected BezTriples in each F-Curve to the specified one */
KeyframeEditFunc ANIM_editkeyframes_keytype(short code)
{
@@ -993,6 +1012,9 @@ KeyframeEditFunc ANIM_editkeyframes_keytype(short code)
case BEZT_KEYTYPE_EXTREME: /* extreme keyframe */
return set_keytype_extreme;
+ case BEZT_KEYTYPE_JITTER: /* jitter keyframe */
+ return set_keytype_jitter;
+
case BEZT_KEYTYPE_KEYFRAME: /* proper keyframe */
default:
return set_keytype_keyframe;
@@ -1038,7 +1060,7 @@ static short select_bezier_subtract(KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static short select_bezier_invert(KeyframeEditData *ked, BezTriple *bezt)
+static short select_bezier_invert(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
/* Invert the selection for the whole bezier triple */
bezt->f2 ^= SELECT;
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index 5073cfe08b8..aea8c2407b4 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -42,6 +43,12 @@
#include "BKE_fcurve.h"
#include "BKE_utildefines.h"
+#include "BKE_report.h"
+#include "BKE_library.h"
+#include "BKE_global.h"
+
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
#include "ED_anim_api.h"
#include "ED_keyframing.h"
@@ -82,6 +89,12 @@ void delete_fcurve_key(FCurve *fcu, int index, short do_recalc)
/* Delete this keyframe */
memmove(&fcu->bezt[index], &fcu->bezt[index+1], sizeof(BezTriple)*(fcu->totvert-index-1));
fcu->totvert--;
+
+ if (fcu->totvert == 0) {
+ if (fcu->bezt)
+ MEM_freeN(fcu->bezt);
+ fcu->bezt= NULL;
+ }
/* recalc handles - only if it won't cause problems */
if (do_recalc)
@@ -106,11 +119,18 @@ void delete_fcurve_keys(FCurve *fcu)
}
/* Free the array of BezTriples if there are not keyframes */
- if (fcu->totvert == 0) {
- if (fcu->bezt)
- MEM_freeN(fcu->bezt);
- fcu->bezt= NULL;
- }
+ if(fcu->totvert == 0)
+ clear_fcurve_keys(fcu);
+}
+
+
+void clear_fcurve_keys(FCurve *fcu)
+{
+ if (fcu->bezt)
+ MEM_freeN(fcu->bezt);
+ fcu->bezt= NULL;
+
+ fcu->totvert= 0;
}
/* ---------------- */
@@ -366,7 +386,7 @@ void sample_fcurve (FCurve *fcu)
int sfra, range;
int i, n, nIndex;
- if(fcu->bezt==NULL) /* ignore baked */
+ if (fcu->bezt==NULL) /* ignore baked */
return;
/* find selected keyframes... once pair has been found, add keyframes */
@@ -433,8 +453,10 @@ void sample_fcurve (FCurve *fcu)
*/
/* globals for copy/paste data (like for other copy/paste buffers) */
-ListBase animcopybuf = {NULL, NULL};
+static ListBase animcopybuf = {NULL, NULL};
static float animcopy_firstframe= 999999999.0f;
+static float animcopy_lastframe= -999999999.0f;
+static float animcopy_cfra= 0.0;
/* datatype for use in copy/paste buffer */
typedef struct tAnimCopybufItem {
@@ -447,6 +469,8 @@ typedef struct tAnimCopybufItem {
int totvert; /* number of keyframes stored for this channel */
BezTriple *bezt; /* keyframes in buffer */
+
+ short id_type; /* Result of GS(id->name)*/
} tAnimCopybufItem;
@@ -475,6 +499,7 @@ void free_anim_copybuf (void)
/* restore initial state */
animcopybuf.first= animcopybuf.last= NULL;
animcopy_firstframe= 999999999.0f;
+ animcopy_lastframe= -999999999.0f;
}
/* ------------------- */
@@ -483,6 +508,7 @@ void free_anim_copybuf (void)
short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
{
bAnimListElem *ale;
+ Scene *scene= ac->scene;
/* clear buffer first */
free_anim_copybuf();
@@ -491,7 +517,7 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
for (ale= anim_data->first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->key_data;
tAnimCopybufItem *aci;
- BezTriple *bezt, *newbuf;
+ BezTriple *bezt, *nbezt, *newbuf;
int i;
/* firstly, check if F-Curve has any selected keyframes
@@ -504,6 +530,7 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* init copybuf item info */
aci= MEM_callocN(sizeof(tAnimCopybufItem), "AnimCopybufItem");
aci->id= ale->id;
+ aci->id_type= GS(ale->id->name);
aci->grp= fcu->grp;
aci->rna_path= MEM_dupallocN(fcu->rna_path);
aci->array_index= fcu->array_index;
@@ -521,7 +548,11 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
memcpy(newbuf, aci->bezt, sizeof(BezTriple)*(aci->totvert));
/* copy current beztriple across too */
- *(newbuf + aci->totvert)= *bezt;
+ nbezt= &newbuf[aci->totvert];
+ *nbezt= *bezt;
+
+ /* ensure copy buffer is selected so pasted keys are selected */
+ BEZ_SEL(nbezt);
/* free old array and set the new */
if (aci->bezt) MEM_freeN(aci->bezt);
@@ -531,6 +562,8 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* check if this is the earliest frame encountered so far */
if (bezt->vec[1][0] < animcopy_firstframe)
animcopy_firstframe= bezt->vec[1][0];
+ if (bezt->vec[1][0] > animcopy_lastframe)
+ animcopy_lastframe= bezt->vec[1][0];
}
}
@@ -539,76 +572,287 @@ short copy_animedit_keys (bAnimContext *ac, ListBase *anim_data)
/* check if anything ended up in the buffer */
if (ELEM(NULL, animcopybuf.first, animcopybuf.last))
return -1;
-
+
+ /* incase 'relative' paste method is used */
+ animcopy_cfra= CFRA;
+
/* everything went fine */
return 0;
}
+/* ------------------- */
+
+/* most strict method: exact matches only */
+static tAnimCopybufItem *pastebuf_match_path_full(FCurve *fcu, const short from_single, const short to_simple)
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if (to_simple || (aci->rna_path && fcu->rna_path)) {
+ if (to_simple || (strcmp(aci->rna_path, fcu->rna_path) == 0)) {
+ if ((from_single) || (aci->array_index == fcu->array_index))
+ break;
+ }
+ }
+ }
+
+ return aci;
+}
+
+/* medium match strictness: path match only (i.e. ignore ID) */
+static tAnimCopybufItem *pastebuf_match_path_property(FCurve *fcu, const short from_single, const short UNUSED(to_simple))
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if (aci->rna_path && fcu->rna_path) {
+ /* find the property of the fcurve and compare against the end of the tAnimCopybufItem
+ * more involved since it needs to to path lookups.
+ * This is not 100% reliable since the user could be editing the curves on a path that wont
+ * resolve, or a bone could be renamed after copying for eg. but in normal copy & paste
+ * this should work out ok.
+ */
+ if (BLI_findindex(which_libbase(G.main, aci->id_type), aci->id) == -1) {
+ /* pedantic but the ID could have been removed, and beats crashing! */
+ printf("paste_animedit_keys: error ID has been removed!\n");
+ }
+ else {
+ PointerRNA id_ptr, rptr;
+ PropertyRNA *prop;
+
+ RNA_id_pointer_create(aci->id, &id_ptr);
+ RNA_path_resolve(&id_ptr, aci->rna_path, &rptr, &prop);
+
+ if (prop) {
+ const char *identifier= RNA_property_identifier(prop);
+ int len_id = strlen(identifier);
+ int len_path = strlen(fcu->rna_path);
+ if (len_id <= len_path) {
+ /* note, paths which end with "] will fail with this test - Animated ID Props */
+ if (strcmp(identifier, fcu->rna_path + (len_path-len_id))==0) {
+ if ((from_single) || (aci->array_index == fcu->array_index))
+ break;
+ }
+ }
+ }
+ else {
+ printf("paste_animedit_keys: failed to resolve path id:%s, '%s'!\n", aci->id->name, aci->rna_path);
+ }
+ }
+ }
+ }
+
+ return aci;
+}
+
+/* least strict matching heuristic: indices only */
+static tAnimCopybufItem *pastebuf_match_index_only(FCurve *fcu, const short from_single, const short UNUSED(to_simple))
+{
+ tAnimCopybufItem *aci;
+
+ for (aci= animcopybuf.first; aci; aci= aci->next) {
+ /* check that paths exist */
+ if ((from_single) || (aci->array_index == fcu->array_index)) {
+ break;
+ }
+ }
+
+ return aci;
+}
+
+/* ................ */
+
+/* helper for paste_animedit_keys() - performs the actual pasting */
+static void paste_animedit_keys_fcurve(FCurve *fcu, tAnimCopybufItem *aci, float offset, const eKeyMergeMode merge_mode)
+{
+ BezTriple *bezt;
+ int i;
+
+ /* First de-select existing FCuvre */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ bezt->f2 &= ~SELECT;
+ }
+
+ /* mix mode with existing data */
+ switch (merge_mode) {
+ case KEYFRAME_PASTE_MERGE_MIX:
+ /* do-nothing */
+ break;
+
+ case KEYFRAME_PASTE_MERGE_OVER:
+ /* remove all keys */
+ clear_fcurve_keys(fcu);
+ break;
+
+ case KEYFRAME_PASTE_MERGE_OVER_RANGE:
+ case KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL:
+ {
+ float f_min;
+ float f_max;
+
+ if (merge_mode==KEYFRAME_PASTE_MERGE_OVER_RANGE) {
+ f_min= aci->bezt[0].vec[1][0] + offset;
+ f_max= aci->bezt[aci->totvert-1].vec[1][0] + offset;
+ }
+ else { /* Entire Range */
+ f_min= animcopy_firstframe + offset;
+ f_max= animcopy_lastframe + offset;
+ }
+
+ /* remove keys in range */
+ if (f_min < f_max) {
+ /* select verts in range for removal */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
+ if ((f_min < bezt[0].vec[1][0]) && (bezt[0].vec[1][0] < f_max)) {
+ bezt->f2 |= SELECT;
+ }
+ }
+
+ /* remove frames in the range */
+ delete_fcurve_keys(fcu);
+ }
+ break;
+ }
+ }
+
+ /* just start pasting, with the the first keyframe on the current frame, and so on */
+ for (i=0, bezt=aci->bezt; i < aci->totvert; i++, bezt++) {
+ /* temporarily apply offset to src beztriple while copying */
+ bezt->vec[0][0] += offset;
+ bezt->vec[1][0] += offset;
+ bezt->vec[2][0] += offset;
+
+ /* insert the keyframe
+ * NOTE: no special flags here for now
+ */
+ insert_bezt_fcurve(fcu, bezt, 0);
+
+ /* un-apply offset from src beztriple after copying */
+ bezt->vec[0][0] -= offset;
+ bezt->vec[1][0] -= offset;
+ bezt->vec[2][0] -= offset;
+ }
+
+ /* recalculate F-Curve's handles? */
+ calchandles_fcurve(fcu);
+}
+
+/* ------------------- */
+
+EnumPropertyItem keyframe_paste_offset_items[] = {
+ {KEYFRAME_PASTE_OFFSET_CFRA_START, "START", 0, "Frame Start", "Paste keys starting at current frame"},
+ {KEYFRAME_PASTE_OFFSET_CFRA_END, "END", 0, "Frame End", "Paste keys ending at current frame"},
+ {KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE, "RELATIVE", 0, "Frame Relative", "Paste keys relative to the current frame when copying"},
+ {KEYFRAME_PASTE_OFFSET_NONE, "NONE", 0, "No Offset", "Paste keys from original time"},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem keyframe_paste_merge_items[] = {
+ {KEYFRAME_PASTE_MERGE_MIX, "MIX", 0, "Mix", "Overlay existing with new keys"},
+ {KEYFRAME_PASTE_MERGE_OVER, "OVER_ALL", 0, "Overwrite All", "Replace all keys"},
+ {KEYFRAME_PASTE_MERGE_OVER_RANGE, "OVER_RANGE", 0, "Overwrite Range", "Overwrite keys in pasted range"},
+ {KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL, "OVER_RANGE_ALL", 0, "Overwrite Entire Range", "Overwrite keys in pasted range, using the range of all copied keys."},
+ {0, NULL, 0, NULL, NULL}};
+
+
/* This function pastes data from the keyframes copy/paste buffer */
-short paste_animedit_keys (bAnimContext *ac, ListBase *anim_data)
+short paste_animedit_keys (bAnimContext *ac, ListBase *anim_data,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
bAnimListElem *ale;
+
const Scene *scene= (ac->scene);
- const float offset = (float)(CFRA - animcopy_firstframe);
- short no_name= 0;
+ const short from_single= (animcopybuf.first == animcopybuf.last);
+ const short to_simple= (anim_data->first == anim_data->last);
+
+ float offset = 0.0f;
+ int pass;
+
/* check if buffer is empty */
- if (ELEM(NULL, animcopybuf.first, animcopybuf.last)) {
- //error("No data in buffer to paste");
+ if (animcopybuf.first == NULL) {
+ BKE_report(ac->reports, RPT_WARNING, "No data in buffer to paste");
+ return -1;
+ }
+
+ if (anim_data->first == NULL) {
+ BKE_report(ac->reports, RPT_WARNING, "No FCurves to paste into");
return -1;
}
- /* check if single channel in buffer (disregard names if so) */
- if (animcopybuf.first == animcopybuf.last)
- no_name= 1;
- /* from selected channels */
- for (ale= anim_data->first; ale; ale= ale->next) {
- FCurve *fcu = (FCurve *)ale->data; /* destination F-Curve */
- tAnimCopybufItem *aci= NULL;
- BezTriple *bezt;
- int i;
+ /* mathods of offset */
+ switch(offset_mode) {
+ case KEYFRAME_PASTE_OFFSET_CFRA_START:
+ offset= (float)(CFRA - animcopy_firstframe);
+ break;
+ case KEYFRAME_PASTE_OFFSET_CFRA_END:
+ offset= (float)(CFRA - animcopy_lastframe);
+ break;
+ case KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE:
+ offset= (float)(CFRA - animcopy_cfra);
+ break;
+ case KEYFRAME_PASTE_OFFSET_NONE:
+ offset= 0.0f;
+ break;
+ }
+
+ if (from_single && to_simple) {
+ /* 1:1 match, no tricky checking, just paste */
+ FCurve *fcu;
+ tAnimCopybufItem *aci;
+
+ ale= anim_data->first;
+ fcu= (FCurve *)ale->data; /* destination F-Curve */
+ aci= animcopybuf.first;
- /* find buffer item to paste from
- * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
- * - if names do matter, only check if id-type is ok for now (group check is not that important)
- * - most importantly, rna-paths should match (array indices are unimportant for now)
+ paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode);
+ }
+ else {
+ /* from selected channels
+ * This "passes" system aims to try to find "matching" channels to paste keyframes
+ * into with increasingly loose matching heuristics. The process finishes when at least
+ * one F-Curve has been pasted into.
*/
- // TODO: the matching algorithm here is pathetic!
- for (aci= animcopybuf.first; aci; aci= aci->next) {
- /* check that paths exist */
- if (aci->rna_path && fcu->rna_path) {
- // FIXME: this breaks for bone names!
- if (strcmp(aci->rna_path, fcu->rna_path) == 0) {
- /* should be a match unless there's more than one of these */
- if ((no_name) || (aci->array_index == fcu->array_index))
+ for (pass= 0; pass < 3; pass++) {
+ unsigned int totmatch= 0;
+
+ for (ale= anim_data->first; ale; ale= ale->next) {
+ /* find buffer item to paste from
+ * - if names don't matter (i.e. only 1 channel in buffer), don't check id/group
+ * - if names do matter, only check if id-type is ok for now (group check is not that important)
+ * - most importantly, rna-paths should match (array indices are unimportant for now)
+ */
+ FCurve *fcu = (FCurve *)ale->data; /* destination F-Curve */
+ tAnimCopybufItem *aci= NULL;
+
+ switch (pass) {
+ case 0:
+ /* most strict, must be exact path match data_path & index */
+ aci= pastebuf_match_path_full(fcu, from_single, to_simple);
+ break;
+
+ case 1:
+ /* less strict, just compare property names */
+ aci= pastebuf_match_path_property(fcu, from_single, to_simple);
+ break;
+
+ case 2:
+ /* Comparing properties gave no results, so just do index comparisons */
+ aci= pastebuf_match_index_only(fcu, from_single, to_simple);
break;
}
- }
- }
-
-
- /* copy the relevant data from the matching buffer curve */
- if (aci) {
- /* just start pasting, with the the first keyframe on the current frame, and so on */
- for (i=0, bezt=aci->bezt; i < aci->totvert; i++, bezt++) {
- /* temporarily apply offset to src beztriple while copying */
- bezt->vec[0][0] += offset;
- bezt->vec[1][0] += offset;
- bezt->vec[2][0] += offset;
- /* insert the keyframe
- * NOTE: no special flags here for now
- */
- insert_bezt_fcurve(fcu, bezt, 0);
-
- /* un-apply offset from src beztriple after copying */
- bezt->vec[0][0] -= offset;
- bezt->vec[1][0] -= offset;
- bezt->vec[2][0] -= offset;
+ /* copy the relevant data from the matching buffer curve */
+ if (aci) {
+ totmatch++;
+ paste_animedit_keys_fcurve(fcu, aci, offset, merge_mode);
+ }
}
- /* recalculate F-Curve's handles? */
- calchandles_fcurve(fcu);
+ /* dont continue if some fcurves were pasted */
+ if (totmatch)
+ break;
}
}
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index fc5649be869..adc580c253d 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -49,6 +50,7 @@
#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
@@ -72,6 +74,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "anim_intern.h"
@@ -86,15 +89,15 @@ short ANIM_get_keyframing_flags (Scene *scene, short incl_mode)
/* standard flags */
{
/* visual keying */
- if (IS_AUTOKEY_FLAG(AUTOMATKEY))
+ if (IS_AUTOKEY_FLAG(scene, AUTOMATKEY))
flag |= INSERTKEY_MATRIX;
/* only needed */
- if (IS_AUTOKEY_FLAG(INSERTNEEDED))
+ if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED))
flag |= INSERTKEY_NEEDED;
- /* default F-Curve color mode - RGB from XYZ indicies */
- if (IS_AUTOKEY_FLAG(XYZ2RGB))
+ /* default F-Curve color mode - RGB from XYZ indices */
+ if (IS_AUTOKEY_FLAG(scene, XYZ2RGB))
flag |= INSERTKEY_XYZ2RGB;
}
@@ -230,6 +233,10 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
dst->vec[1][1] += dy;
dst->vec[2][1] += dy;
+ dst->f1= bezt->f1;
+ dst->f2= bezt->f2;
+ dst->f3= bezt->f3;
+
// TODO: perform some other operations?
}
}
@@ -287,13 +294,12 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
*/
int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
{
- BezTriple beztr;
+ BezTriple beztr= {{{0}}};
int a;
/* set all three points, for nicer start position
* NOTE: +/- 1 on vec.x for left and right handles is so that 'free' handles work ok...
*/
- memset(&beztr, 0, sizeof(BezTriple));
beztr.vec[0][0]= x-1.0f;
beztr.vec[0][1]= y;
beztr.vec[1][0]= x;
@@ -348,7 +354,7 @@ enum {
KEYNEEDED_JUSTADD,
KEYNEEDED_DELPREV,
KEYNEEDED_DELNEXT
-} eKeyNeededStatus;
+} /*eKeyNeededStatus*/;
/* This helper function determines whether a new keyframe is needed */
/* Cases where keyframes should not be added:
@@ -569,6 +575,7 @@ static short visualkey_can_use (PointerRNA *ptr, PropertyRNA *prop)
case CONSTRAINT_TYPE_CHILDOF:
return 1;
case CONSTRAINT_TYPE_TRANSFORM:
+ case CONSTRAINT_TYPE_TRANSLIKE:
return 1;
case CONSTRAINT_TYPE_FOLLOWPATH:
return 1;
@@ -636,51 +643,48 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
if (strstr(identifier, "location")) {
return ob->obmat[3][array_index];
}
- else if (strstr(identifier, "rotation")) {
+ else if (strstr(identifier, "rotation_euler")) {
float eul[3];
- mat4_to_eul( eul,ob->obmat);
+ mat4_to_eulO(eul, ob->rotmode, ob->obmat);
return eul[array_index];
}
+ // FIXME: other types of rotation don't work
}
}
else if (ptr->type == &RNA_PoseBone) {
- Object *ob= (Object *)ptr->id.data; /* we assume that this is always set, and is an object */
bPoseChannel *pchan= (bPoseChannel *)ptr->data;
- float tmat[4][4];
+ bPoseChannel tchan;
- /* Although it is not strictly required for this particular space conversion,
- * arg1 must not be null, as there is a null check for the other conversions to
- * be safe. Therefore, the active object is passed here, and in many cases, this
- * will be what owns the pose-channel that is getting this anyway.
+ /* make a copy of pchan so that we can apply and decompose its chan_mat, thus getting the
+ * rest-pose to pose-mode transform that got stored there at the end of posing calculations
+ * for B-Bone deforms to use
+ * - it should be safe to just make a local copy like this, since we're not doing anything with the copied pointers
*/
- copy_m4_m4(tmat, pchan->pose_mat);
- constraint_mat_convertspace(ob, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
+ memcpy(&tchan, pchan, sizeof(bPoseChannel));
+ pchan_apply_mat4(&tchan, pchan->chan_mat, TRUE);
/* Loc, Rot/Quat keyframes are supported... */
if (strstr(identifier, "location")) {
/* only use for non-connected bones */
if ((pchan->bone->parent) && !(pchan->bone->flag & BONE_CONNECTED))
- return tmat[3][array_index];
+ return tchan.loc[array_index];
else if (pchan->bone->parent == NULL)
- return tmat[3][array_index];
+ return tchan.loc[array_index];
}
else if (strstr(identifier, "rotation_euler")) {
- float eul[3];
-
- /* euler-rotation test before standard rotation, as standard rotation does quats */
- mat4_to_eulO( eul, pchan->rotmode,tmat);
- return eul[array_index];
+ return tchan.eul[array_index];
}
else if (strstr(identifier, "rotation_quaternion")) {
- float trimat[3][3], quat[4];
-
- copy_m3_m4(trimat, tmat);
- mat3_to_quat_is_ok( quat,trimat);
-
- return quat[array_index];
+ return tchan.quat[array_index];
+ }
+ else if (strstr(identifier, "rotation_axisangle")) {
+ /* w = 0, x,y,z = 1,2,3 */
+ if (array_index == 0)
+ return tchan.rotAngle;
+ else
+ return tchan.rotAxis[array_index - 1];
}
- // TODO: axis-angle...
}
/* as the function hasn't returned yet, read value from system in the default way */
@@ -697,25 +701,26 @@ static float visualkey_get_value (PointerRNA *ptr, PropertyRNA *prop, int array_
* the keyframe insertion. These include the 'visual' keyframing modes, quick refresh,
* and extra keyframe filtering.
*/
-short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, short flag)
+short insert_keyframe_direct (ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, float cfra, short flag)
{
float curval= 0.0f;
/* no F-Curve to add keyframe to? */
if (fcu == NULL) {
- printf("ERROR: no F-Curve to add keyframes to \n");
+ BKE_report(reports, RPT_ERROR, "No F-Curve to add keyframes to");
return 0;
}
/* F-Curve not editable? */
- if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ) {
- if (G.f & G_DEBUG)
- printf("WARNING: not inserting keyframe for locked F-Curve \n");
+ if (fcurve_is_keyframable(fcu) == 0) {
+ BKE_reportf(reports, RPT_ERROR,
+ "F-Curve with path = '%s' [%d] cannot be keyframed. Ensure that it is not locked or sampled. Also, try removing F-Modifiers.",
+ fcu->rna_path, fcu->array_index);
return 0;
}
/* if no property given yet, try to validate from F-Curve info */
if ((ptr.id.data == NULL) && (ptr.data==NULL)) {
- printf("ERROR: no RNA-pointer available to retrieve values for keyframing from\n");
+ BKE_report(reports, RPT_ERROR, "No RNA-pointer available to retrieve values for keyframing from");
return 0;
}
if (prop == NULL) {
@@ -724,9 +729,11 @@ short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, fl
/* try to get property we should be affecting */
if ((RNA_path_resolve(&ptr, fcu->rna_path, &tmp_ptr, &prop) == 0) || (prop == NULL)) {
/* property not found... */
- char *idname= (ptr.id.data) ? ((ID *)ptr.id.data)->name : "<No ID-Pointer>";
+ const char *idname= (ptr.id.data) ? ((ID *)ptr.id.data)->name : "<No ID-Pointer>";
- printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", idname, fcu->rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
+ idname, fcu->rna_path);
return 0;
}
else {
@@ -815,7 +822,7 @@ short insert_keyframe_direct (PointerRNA ptr, PropertyRNA *prop, FCurve *fcu, fl
*
* index of -1 keys all array indices
*/
-short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
+short insert_keyframe (ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
{
PointerRNA id_ptr, ptr;
PropertyRNA *prop = NULL;
@@ -825,13 +832,14 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
/* validate pointer first - exit if failure */
if (id == NULL) {
- printf("Insert Key: no ID-block to insert keyframe in (Path = %s) \n", rna_path);
+ BKE_reportf(reports, RPT_ERROR, "No ID-block to insert keyframe in (Path = %s)", rna_path);
return 0;
}
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Insert Key: Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n",
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)",
(id)? id->name : "<Missing ID-Block>", rna_path);
return 0;
}
@@ -844,7 +852,9 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
act= verify_adt_action(id, 1);
if (act == NULL) {
- printf("Insert Key: Could not insert keyframe, as this type does not support animation data (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR,
+ "Could not insert keyframe, as this type does not support animation data (ID = %s, Path = %s)",
+ id->name, rna_path);
return 0;
}
@@ -900,7 +910,7 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
}
/* insert keyframe */
- ret += insert_keyframe_direct(ptr, prop, fcu, cfra, flag);
+ ret += insert_keyframe_direct(reports, ptr, prop, fcu, cfra, flag);
}
}
@@ -917,7 +927,7 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_
* The flag argument is used for special settings that alter the behaviour of
* the keyframe deletion. These include the quick refresh options.
*/
-short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag)
+short delete_keyframe (ReportList *reports, ID *id, bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short UNUSED(flag))
{
AnimData *adt= BKE_animdata_from_id(id);
PointerRNA id_ptr, ptr;
@@ -927,14 +937,14 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
/* sanity checks */
if ELEM(NULL, id, adt) {
- printf("ERROR: no ID-block and/or AnimData to delete keyframe from \n");
+ BKE_report(reports, RPT_ERROR, "No ID-Block and/Or AnimData to delete keyframe from");
return 0;
}
/* validate pointer first - exit if failure */
RNA_id_pointer_create(id, &id_ptr);
if ((RNA_path_resolve(&id_ptr, rna_path, &ptr, &prop) == 0) || (prop == NULL)) {
- printf("Delete Key: Could not delete keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)\n", id->name, rna_path);
+ BKE_reportf(reports, RPT_ERROR, "Could not delete keyframe, as RNA Path is invalid for the given ID (ID = %s, Path = %s)", id->name, rna_path);
return 0;
}
@@ -953,7 +963,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
cfra= BKE_nla_tweakedit_remap(adt, cfra, NLATIME_CONVERT_UNMAP);
}
else {
- printf("ERROR: no Action to delete keyframes from for ID = %s \n", id->name);
+ BKE_reportf(reports, RPT_ERROR, "No Action to delete keyframes from for ID = %s \n", id->name);
return 0;
}
}
@@ -997,7 +1007,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
if ( (fcu->flag & FCURVE_PROTECTED) || ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ) {
if (G.f & G_DEBUG)
- printf("WARNING: not inserting keyframe for locked F-Curve \n");
+ printf("WARNING: not deleting keyframe for locked F-Curve \n");
continue;
}
@@ -1027,7 +1037,7 @@ short delete_keyframe (ID *id, bAction *act, const char group[], const char rna_
enum {
COMMONKEY_MODE_INSERT = 0,
COMMONKEY_MODE_DELETE,
-} eCommonModifyKey_Modes;
+} /*eCommonModifyKey_Modes*/;
/* Polling callback for use with ANIM_*_keyframe() operators
* This is based on the standard ED_operator_areaactive callback,
@@ -1064,7 +1074,7 @@ static int insert_key_exec (bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
- int type= RNA_int_get(op->ptr, "type");
+ int type= RNA_enum_get(op->ptr, "type");
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success;
@@ -1129,11 +1139,12 @@ void ANIM_OT_keyframe_insert (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is enabled, since this operator is assumed to be called independently
*/
@@ -1146,7 +1157,7 @@ void ANIM_OT_keyframe_insert (wmOperatorType *ot)
* then calls the menu if necessary before
*/
-static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene= CTX_data_scene(C);
@@ -1158,7 +1169,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
}
else {
/* just call the exec() on the active keyingset */
- RNA_int_set(op->ptr, "type", 0);
+ RNA_enum_set(op->ptr, "type", 0);
RNA_boolean_set(op->ptr, "confirm_success", 1);
return op->type->exec(C, op);
@@ -1172,6 +1183,7 @@ void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot)
/* identifiers */
ot->name= "Insert Keyframe Menu";
ot->idname= "ANIM_OT_keyframe_insert_menu";
+ ot->description= "Insert Keyframes for specified Keying Set, with menu of available Keying Sets if undefined";
/* callbacks */
ot->invoke= insert_key_menu_invoke;
@@ -1181,17 +1193,19 @@ void ANIM_OT_keyframe_insert_menu (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- prop= RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is disabled so that if a menu is shown, this doesn't come up too
*/
// XXX should this just be always on?
prop= RNA_def_boolean(ot->srna, "confirm_success", 0, "Confirm Successful Insert", "Show a popup when the keyframes get successfully added");
RNA_def_property_flag(prop, PROP_HIDDEN);
+
/* whether the menu should always be shown
* - by default, the menu should only be shown when there is no active Keying Set (2.5 behaviour),
* although in some cases it might be useful to always shown (pre 2.5 behaviour)
@@ -1207,7 +1221,7 @@ static int delete_key_exec (bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
KeyingSet *ks= NULL;
- int type= RNA_int_get(op->ptr, "type");
+ int type= RNA_enum_get(op->ptr, "type");
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
short success;
@@ -1258,6 +1272,8 @@ static int delete_key_exec (bContext *C, wmOperator *op)
void ANIM_OT_keyframe_delete (wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Delete Keyframe";
ot->idname= "ANIM_OT_keyframe_delete";
@@ -1270,10 +1286,12 @@ void ANIM_OT_keyframe_delete (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- /* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
- */
- RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
+ /* keyingset to use (dynamic enum) */
+ prop= RNA_def_enum(ot->srna, "type", DummyRNA_DEFAULT_items, 0, "Keying Set", "The Keying Set to use");
+ RNA_def_enum_funcs(prop, ANIM_keying_sets_enum_itemf);
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+ ot->prop= prop;
+
/* confirm whether a keyframe was added by showing a popup
* - by default, this is enabled, since this operator is assumed to be called independently
*/
@@ -1308,7 +1326,7 @@ static int delete_key_v3d_exec (bContext *C, wmOperator *op)
for (fcu= act->curves.first; fcu; fcu= fcn) {
fcn= fcu->next;
- success+= delete_keyframe(id, NULL, NULL, fcu->rna_path, fcu->array_index, cfra, 0);
+ success+= delete_keyframe(op->reports, id, NULL, NULL, fcu->rna_path, fcu->array_index, cfra, 0);
}
}
@@ -1349,7 +1367,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
char *path;
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1361,10 +1379,9 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
flag = ANIM_get_keyframing_flags(scene, 1);
/* try to insert keyframe using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if ((ptr.data && prop) && RNA_property_animateable(&ptr, prop)) {
+ if ((ptr.id.data && ptr.data && prop) && RNA_property_animateable(&ptr, prop)) {
path= RNA_path_from_ID_to_property(&ptr, prop);
if (path) {
@@ -1378,7 +1395,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
length= 1;
for (a=0; a<length; a++)
- success+= insert_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, flag);
+ success+= insert_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index+a, cfra, flag);
MEM_freeN(path);
}
@@ -1387,7 +1404,7 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
NlaStrip *strip= (NlaStrip *)ptr.data;
FCurve *fcu= list_find_fcurve(&strip->fcurves, RNA_property_identifier(prop), flag);
- success+= insert_keyframe_direct(ptr, prop, fcu, cfra, 0);
+ success+= insert_keyframe_direct(op->reports, ptr, prop, fcu, cfra, 0);
}
else {
if (G.f & G_DEBUG)
@@ -1396,8 +1413,8 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
}
}
else if (G.f & G_DEBUG) {
- printf("ptr.data = %p, prop = %p,", ptr.data, prop);
- if(prop)
+ printf("ptr.data = %p, prop = %p,", (void *)ptr.data, (void *)prop);
+ if (prop)
printf("animateable = %d \n", RNA_property_animateable(&ptr, prop));
else
printf("animateable = NULL \n");
@@ -1405,6 +1422,8 @@ static int insert_key_button_exec (bContext *C, wmOperator *op)
if (success) {
/* send updates */
+ uiContextAnimUpdate(C);
+
DAG_ids_flush_update(bmain, 0);
/* send notifiers that keyframes have been changed */
@@ -1437,7 +1456,7 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
PropertyRNA *prop= NULL;
char *path;
float cfra= (float)CFRA; // XXX for now, don't bother about all the yucky offset crap
@@ -1445,24 +1464,23 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
int a, index, length, all= RNA_boolean_get(op->ptr, "all");
/* try to insert keyframe using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if (ptr.data && prop) {
+ if (ptr.id.data && ptr.data && prop) {
path= RNA_path_from_ID_to_property(&ptr, prop);
if (path) {
if (all) {
length= RNA_property_array_length(&ptr, prop);
- if(length) index= 0;
+ if (length) index= 0;
else length= 1;
}
else
length= 1;
for (a=0; a<length; a++)
- success+= delete_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, 0);
+ success+= delete_keyframe(op->reports, ptr.id.data, NULL, NULL, path, index+a, cfra, 0);
MEM_freeN(path);
}
@@ -1470,12 +1488,14 @@ static int delete_key_button_exec (bContext *C, wmOperator *op)
printf("Button Delete-Key: no path to property \n");
}
else if (G.f & G_DEBUG) {
- printf("ptr.data = %p, prop = %p \n", ptr.data, prop);
+ printf("ptr.data = %p, prop = %p \n", (void *)ptr.data, (void *)prop);
}
if (success) {
/* send updates */
+ uiContextAnimUpdate(C);
+
DAG_ids_flush_update(bmain, 0);
/* send notifiers that keyframes have been changed */
@@ -1558,7 +1578,7 @@ short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter)
/* Checks whether an Action has a keyframe for a given frame
* Since we're only concerned whether a keyframe exists, we can simply loop until a match is found...
*/
-short action_frame_has_keyframe (bAction *act, float frame, short filter)
+static short action_frame_has_keyframe (bAction *act, float frame, short filter)
{
FCurve *fcu;
@@ -1586,7 +1606,7 @@ short action_frame_has_keyframe (bAction *act, float frame, short filter)
}
/* Checks whether an Object has a keyframe for a given frame */
-short object_frame_has_keyframe (Object *ob, float frame, short filter)
+static short object_frame_has_keyframe (Object *ob, float frame, short filter)
{
/* error checking */
if (ob == NULL)
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index ab236de9ac5..d71c494705e 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_scene_types.h"
@@ -59,6 +60,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "anim_intern.h"
@@ -107,7 +109,7 @@ static int keyingset_poll_activePath_edit (bContext *C)
/* Add a Default (Empty) Keying Set ------------------------- */
-static int add_default_keyingset_exec (bContext *C, wmOperator *op)
+static int add_default_keyingset_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
short flag=0, keyingflag=0;
@@ -286,7 +288,7 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
char *path = NULL;
short success= 0;
int index=0, pflag=0;
@@ -306,7 +308,7 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
keyingflag |= ANIM_get_keyframing_flags(scene, 0);
- if (IS_AUTOKEY_FLAG(XYZ2RGB))
+ if (IS_AUTOKEY_FLAG(scene, XYZ2RGB))
keyingflag |= INSERTKEY_XYZ2RGB;
/* call the API func, and set the active keyingset index */
@@ -322,11 +324,10 @@ static int add_keyingset_button_exec (bContext *C, wmOperator *op)
ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
/* try to add to keyingset using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
/* check if property is able to be added */
- if (ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
+ if (ptr.id.data && ptr.data && prop && RNA_property_animateable(&ptr, prop)) {
path= RNA_path_from_ID_to_property(&ptr, prop);
if (path) {
@@ -387,7 +388,7 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
KeyingSet *ks = NULL;
PropertyRNA *prop= NULL;
- PointerRNA ptr;
+ PointerRNA ptr= {{NULL}};
char *path = NULL;
short success= 0;
int index=0;
@@ -408,10 +409,9 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
ks= BLI_findlink(&scene->keyingsets, scene->active_keyingset-1);
/* try to add to keyingset using property retrieved from UI */
- memset(&ptr, 0, sizeof(PointerRNA));
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if (ptr.data && prop) {
+ if (ptr.id.data && ptr.data && prop) {
path= RNA_path_from_ID_to_property(&ptr, prop);
if (path) {
@@ -419,12 +419,9 @@ static int remove_keyingset_button_exec (bContext *C, wmOperator *op)
/* try to find a path matching this description */
ksp= BKE_keyingset_find_path(ks, ptr.id.data, ks->name, path, index, KSP_GROUP_KSNAME);
-
+
if (ksp) {
- /* just free it... */
- MEM_freeN(ksp->rna_path);
- BLI_freelinkN(&ks->paths, ksp);
-
+ BKE_keyingset_free_path(ks, ksp);
success= 1;
}
@@ -464,7 +461,7 @@ void ANIM_OT_keyingset_button_remove (wmOperatorType *ot)
/* Change Active KeyingSet Operator ------------------------ */
/* This operator checks if a menu should be shown for choosing the KeyingSet to make the active one */
-static int keyingset_active_menu_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int keyingset_active_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* call the menu, which will call this operator again, hence the cancelled */
ANIM_keying_sets_menu_setup(C, op->type->name, "ANIM_OT_keying_set_active_set");
@@ -503,7 +500,7 @@ void ANIM_OT_keying_set_active_set (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* keyingset to use
- * - here the type is int not enum, since many of the indicies here are determined dynamically
+ * - here the type is int not enum, since many of the indices here are determined dynamically
*/
RNA_def_int(ot->srna, "type", 0, INT_MIN, INT_MAX, "Keying Set Number", "Index (determined internally) of the Keying Set to use", 0, 1);
}
@@ -512,7 +509,7 @@ void ANIM_OT_keying_set_active_set (wmOperatorType *ot)
/* REGISTERED KEYING SETS */
/* Keying Set Type Info declarations */
-ListBase keyingset_type_infos = {NULL, NULL};
+static ListBase keyingset_type_infos = {NULL, NULL};
/* Built-In Keying Sets (referencing type infos)*/
ListBase builtin_keyingsets = {NULL, NULL};
@@ -558,7 +555,7 @@ KeyingSet *ANIM_builtin_keyingset_get_named (KeyingSet *prevKS, const char name[
/* --------------- */
/* Add the given KeyingSetInfo to the list of type infos, and create an appropriate builtin set too */
-void ANIM_keyingset_info_register (const bContext *C, KeyingSetInfo *ksi)
+void ANIM_keyingset_info_register (KeyingSetInfo *ksi)
{
KeyingSet *ks;
@@ -605,7 +602,7 @@ void ANIM_keyingset_info_unregister (const bContext *C, KeyingSetInfo *ksi)
/* --------------- */
-void ANIM_keyingset_infos_exit ()
+void ANIM_keyingset_infos_exit (void)
{
KeyingSetInfo *ksi, *next;
@@ -676,10 +673,86 @@ int ANIM_scene_get_keyingset_index (Scene *scene, KeyingSet *ks)
return 0;
}
+/* Get Keying Set to use for Auto-Keyframing some transforms */
+KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformKSName)
+{
+ /* get KeyingSet to use
+ * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
+ * or otherwise key transforms only
+ */
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (scene->active_keyingset))
+ return ANIM_scene_get_active_keyingset(scene);
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL))
+ return ANIM_builtin_keyingset_get_named(NULL, "Available");
+ else
+ return ANIM_builtin_keyingset_get_named(NULL, tranformKSName);
+}
+
/* Menu of All Keying Sets ----------------------------- */
+/* Dynamically populate an enum of Keying Sets */
+EnumPropertyItem *ANIM_keying_sets_enum_itemf (bContext *C, PointerRNA *UNUSED(ptr), int *free)
+{
+ Scene *scene = CTX_data_scene(C);
+ KeyingSet *ks;
+ EnumPropertyItem *item= NULL, item_tmp= {0};
+ int totitem= 0;
+ int i= 0;
+
+ if (C == NULL) {
+ return DummyRNA_DEFAULT_items;
+ }
+
+ /* active Keying Set
+ * - only include entry if it exists
+ */
+ if (scene->active_keyingset) {
+ /* active Keying Set */
+ item_tmp.identifier= item_tmp.name= "Active Keying Set";
+ item_tmp.value= i++;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+
+ /* separator */
+ RNA_enum_item_add_separator(&item, &totitem);
+ }
+ else
+ i++;
+
+ /* user-defined Keying Sets
+ * - these are listed in the order in which they were defined for the active scene
+ */
+ if (scene->keyingsets.first) {
+ for (ks= scene->keyingsets.first; ks; ks= ks->next) {
+ if (ANIM_keyingset_context_ok_poll(C, ks)) {
+ item_tmp.identifier= item_tmp.name= ks->name;
+ item_tmp.value= i++;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+ }
+ }
+
+ /* separator */
+ RNA_enum_item_add_separator(&item, &totitem);
+ }
+
+ /* builtin Keying Sets */
+ i= -1;
+ for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
+ /* only show KeyingSet if context is suitable */
+ if (ANIM_keyingset_context_ok_poll(C, ks)) {
+ item_tmp.identifier= item_tmp.name= ks->name;
+ item_tmp.value= i--;
+ RNA_enum_item_add(&item, &totitem, &item_tmp);
+ }
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */
-void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
+void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op_name[])
{
Scene *scene= CTX_data_scene(C);
KeyingSet *ks;
@@ -687,14 +760,14 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
uiLayout *layout;
int i = 0;
- pup= uiPupMenuBegin(C, title, 0);
+ pup= uiPupMenuBegin(C, title, ICON_NULL);
layout= uiPupMenuLayout(pup);
/* active Keying Set
* - only include entry if it exists
*/
if (scene->active_keyingset) {
- uiItemIntO(layout, "Active Keying Set", 0, op_name, "type", i++);
+ uiItemIntO(layout, "Active Keying Set", ICON_NULL, op_name, "type", i++);
uiItemS(layout);
}
else
@@ -706,7 +779,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
if (scene->keyingsets.first) {
for (ks= scene->keyingsets.first; ks; ks= ks->next) {
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, 0, op_name, "type", i++);
+ uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i++);
}
uiItemS(layout);
}
@@ -716,7 +789,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, char title[], char op_name[])
for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
/* only show KeyingSet if context is suitable */
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, 0, op_name, "type", i--);
+ uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i--);
}
uiPupMenuEnd(C, pup);
@@ -805,6 +878,7 @@ void ANIM_relative_keyingset_add_source (ListBase *dsources, ID *id, StructRNA *
int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingSet *ks, short mode, float cfra)
{
Scene *scene= CTX_data_scene(C);
+ ReportList *reports = CTX_wm_reports(C);
KS_Path *ksp;
int kflag=0, success= 0;
char *groupname= NULL;
@@ -863,6 +937,14 @@ int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingS
int arraylen, i;
short kflag2;
+ /* skip path if no ID pointer is specified */
+ if (ksp->id == NULL) {
+ BKE_reportf(reports, RPT_WARNING,
+ "Skipping path in Keying Set, as it has no ID (KS = '%s', Path = '%s'[%d])",
+ ks->name, ksp->rna_path, ksp->array_index);
+ continue;
+ }
+
/* since keying settings can be defined on the paths too, extend the path before using it */
kflag2 = (kflag | ksp->keyingflag);
@@ -900,26 +982,24 @@ int ANIM_apply_keyingset (bContext *C, ListBase *dsources, bAction *act, KeyingS
for (; i < arraylen; i++) {
/* action to take depends on mode */
if (mode == MODIFYKEY_MODE_INSERT)
- success += insert_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
+ success += insert_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
else if (mode == MODIFYKEY_MODE_DELETE)
- success += delete_keyframe(ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
+ success += delete_keyframe(reports, ksp->id, act, groupname, ksp->rna_path, i, cfra, kflag2);
}
/* set recalc-flags */
- if (ksp->id) {
- switch (GS(ksp->id->name)) {
- case ID_OB: /* Object (or Object-Related) Keyframes */
- {
- Object *ob= (Object *)ksp->id;
-
- ob->recalc |= OB_RECALC_ALL; // XXX: only object transforms only?
- }
- break;
+ switch (GS(ksp->id->name)) {
+ case ID_OB: /* Object (or Object-Related) Keyframes */
+ {
+ Object *ob= (Object *)ksp->id;
+
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME; // XXX: only object transforms only?
}
-
- /* send notifiers for updates (this doesn't require context to work!) */
- WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
+ break;
}
+
+ /* send notifiers for updates (this doesn't require context to work!) */
+ WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
/* return the number of channels successfully affected */
diff --git a/source/blender/editors/armature/BIF_generate.h b/source/blender/editors/armature/BIF_generate.h
index e73ba962365..3c9f517726f 100644
--- a/source/blender/editors/armature/BIF_generate.h
+++ b/source/blender/editors/armature/BIF_generate.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/armature/BIF_retarget.h b/source/blender/editors/armature/BIF_retarget.h
index 7c590a48b35..fe0ac53cfaf 100644
--- a/source/blender/editors/armature/BIF_retarget.h
+++ b/source/blender/editors/armature/BIF_retarget.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -154,7 +154,11 @@ typedef struct RigControl {
void BIF_retargetArc(struct bContext *C, ReebArc *earc, RigGraph *template_rigg);
RigGraph *RIG_graphFromArmature(const struct bContext *C, struct Object *ob, struct bArmature *arm);
int RIG_nbJoints(RigGraph *rg);
-char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index);
+const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index);
void RIG_freeRigGraph(BGraph *rg);
+/* UNUSED */
+void BIF_retargetArmature(bContext *C);
+void BIF_adjustRetarget(bContext *C);
+
#endif /* BIF_RETARGET_H */
diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt
index 9e22bbd7d44..8bbfc3465e3 100644
--- a/source/blender/editors/armature/CMakeLists.txt
+++ b/source/blender/editors/armature/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../makesdna
../../makesrna
@@ -32,8 +31,24 @@ SET(INC
../../../../intern/opennl/extern
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ armature_ops.c
+ editarmature.c
+ editarmature_generate.c
+ editarmature_retarget.c
+ editarmature_sketch.c
+ meshlaplacian.c
+ poseSlide.c
+ poseUtils.c
+ poselib.c
+ poseobject.c
+ reeb.c
+
+ BIF_generate.h
+ BIF_retarget.h
+ armature_intern.h
+ meshlaplacian.h
+ reeb.h
+)
-BLENDERLIB(bf_editor_armature "${SRC}" "${INC}")
+blender_add_lib(bf_editor_armature "${SRC}" "${INC}")
diff --git a/source/blender/editors/armature/Makefile b/source/blender/editors/armature/Makefile
deleted file mode 100644
index 707ceb55246..00000000000
--- a/source/blender/editors/armature/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_armature
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_OPENNL)/include
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/armature/SConscript b/source/blender/editors/armature/SConscript
index 3ac38d7b727..e9694bab63f 100644
--- a/source/blender/editors/armature/SConscript
+++ b/source/blender/editors/armature/SConscript
@@ -3,7 +3,7 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf ../../blenloader'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../render/extern/include ../../bmesh'
incs += ' ../../gpu ../../makesrna #/intern/opennl/extern'
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index fadb4f234d9..2a1185f99c0 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,9 +51,7 @@ void ARMATURE_OT_align(struct wmOperatorType *ot);
void ARMATURE_OT_calculate_roll(struct wmOperatorType *ot);
void ARMATURE_OT_switch_direction(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivs(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivide_simple(struct wmOperatorType *ot);
-void ARMATURE_OT_subdivide_multi(struct wmOperatorType *ot);
+void ARMATURE_OT_subdivide(struct wmOperatorType *ot);
void ARMATURE_OT_parent_set(struct wmOperatorType *ot);
void ARMATURE_OT_parent_clear(struct wmOperatorType *ot);
@@ -66,6 +64,8 @@ void ARMATURE_OT_select_linked(struct wmOperatorType *ot);
void ARMATURE_OT_delete(struct wmOperatorType *ot);
void ARMATURE_OT_duplicate(struct wmOperatorType *ot);
void ARMATURE_OT_extrude(struct wmOperatorType *ot);
+void ARMATURE_OT_hide(struct wmOperatorType *ot);
+void ARMATURE_OT_reveal(struct wmOperatorType *ot);
void ARMATURE_OT_click_extrude(struct wmOperatorType *ot);
void ARMATURE_OT_fill(struct wmOperatorType *ot);
void ARMATURE_OT_merge(struct wmOperatorType *ot);
@@ -76,6 +76,7 @@ void ARMATURE_OT_flip_names(struct wmOperatorType *ot);
void ARMATURE_OT_flags_set(struct wmOperatorType *ot);
+void ARMATURE_OT_layers_show_all(struct wmOperatorType *ot);
void ARMATURE_OT_armature_layers(struct wmOperatorType *ot);
void ARMATURE_OT_bone_layers(struct wmOperatorType *ot);
@@ -90,6 +91,7 @@ void POSE_OT_visual_transform_apply(struct wmOperatorType *ot);
void POSE_OT_rot_clear(struct wmOperatorType *ot);
void POSE_OT_loc_clear(struct wmOperatorType *ot);
void POSE_OT_scale_clear(struct wmOperatorType *ot);
+void POSE_OT_transforms_clear(struct wmOperatorType *ot);
void POSE_OT_copy(struct wmOperatorType *ot);
void POSE_OT_paste(struct wmOperatorType *ot);
@@ -101,10 +103,10 @@ void POSE_OT_select_hierarchy(struct wmOperatorType *ot);
void POSE_OT_select_linked(struct wmOperatorType *ot);
void POSE_OT_select_constraint_target(struct wmOperatorType *ot);
void POSE_OT_select_grouped(struct wmOperatorType *ot);
+void POSE_OT_select_flip_active(struct wmOperatorType *ot);
void POSE_OT_group_add(struct wmOperatorType *ot);
void POSE_OT_group_remove(struct wmOperatorType *ot);
-void POSE_OT_group_remove(struct wmOperatorType *ot);
void POSE_OT_group_assign(struct wmOperatorType *ot);
void POSE_OT_group_unassign(struct wmOperatorType *ot);
void POSE_OT_group_select(struct wmOperatorType *ot);
@@ -170,10 +172,17 @@ LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, cha
/* PoseLib */
/* poselib.c */
+void POSELIB_OT_new(struct wmOperatorType *ot);
+void POSELIB_OT_unlink(struct wmOperatorType *ot);
+
+void POSELIB_OT_action_sanitise(struct wmOperatorType *ot);
+
void POSELIB_OT_pose_add(struct wmOperatorType *ot);
void POSELIB_OT_pose_remove(struct wmOperatorType *ot);
void POSELIB_OT_pose_rename(struct wmOperatorType *ot);
+
void POSELIB_OT_browse_interactive(struct wmOperatorType *ot);
+void POSELIB_OT_apply_pose(struct wmOperatorType *ot);
/* ******************************************************* */
/* Pose Sliding Tools */
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 908aa5bb432..26414e59a3c 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -57,9 +57,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_align);
WM_operatortype_append(ARMATURE_OT_calculate_roll);
WM_operatortype_append(ARMATURE_OT_switch_direction);
- WM_operatortype_append(ARMATURE_OT_subdivs);
- WM_operatortype_append(ARMATURE_OT_subdivide_simple);
- WM_operatortype_append(ARMATURE_OT_subdivide_multi);
+ WM_operatortype_append(ARMATURE_OT_subdivide);
WM_operatortype_append(ARMATURE_OT_parent_set);
WM_operatortype_append(ARMATURE_OT_parent_clear);
@@ -72,6 +70,8 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_delete);
WM_operatortype_append(ARMATURE_OT_duplicate);
WM_operatortype_append(ARMATURE_OT_extrude);
+ WM_operatortype_append(ARMATURE_OT_hide);
+ WM_operatortype_append(ARMATURE_OT_reveal);
WM_operatortype_append(ARMATURE_OT_click_extrude);
WM_operatortype_append(ARMATURE_OT_fill);
WM_operatortype_append(ARMATURE_OT_merge);
@@ -82,6 +82,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(ARMATURE_OT_flags_set);
+ WM_operatortype_append(ARMATURE_OT_layers_show_all);
WM_operatortype_append(ARMATURE_OT_armature_layers);
WM_operatortype_append(ARMATURE_OT_bone_layers);
@@ -105,6 +106,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_rot_clear);
WM_operatortype_append(POSE_OT_loc_clear);
WM_operatortype_append(POSE_OT_scale_clear);
+ WM_operatortype_append(POSE_OT_transforms_clear);
WM_operatortype_append(POSE_OT_copy);
WM_operatortype_append(POSE_OT_paste);
@@ -117,6 +119,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_select_linked);
WM_operatortype_append(POSE_OT_select_constraint_target);
WM_operatortype_append(POSE_OT_select_grouped);
+ WM_operatortype_append(POSE_OT_select_flip_active);
WM_operatortype_append(POSE_OT_group_add);
WM_operatortype_append(POSE_OT_group_remove);
@@ -130,7 +133,7 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_autoside_names);
WM_operatortype_append(POSE_OT_flip_names);
-
+
WM_operatortype_append(POSE_OT_quaternions_flip);
WM_operatortype_append(POSE_OT_flags_set);
@@ -140,11 +143,17 @@ void ED_operatortypes_armature(void)
/* POSELIB */
WM_operatortype_append(POSELIB_OT_browse_interactive);
+ WM_operatortype_append(POSELIB_OT_apply_pose);
WM_operatortype_append(POSELIB_OT_pose_add);
WM_operatortype_append(POSELIB_OT_pose_remove);
WM_operatortype_append(POSELIB_OT_pose_rename);
+ WM_operatortype_append(POSELIB_OT_new);
+ WM_operatortype_append(POSELIB_OT_unlink);
+
+ WM_operatortype_append(POSELIB_OT_action_sanitise);
+
/* POSE SLIDING */
WM_operatortype_append(POSE_OT_push);
WM_operatortype_append(POSE_OT_relax);
@@ -157,23 +166,29 @@ void ED_operatormacros_armature(void)
wmOperatorTypeMacro *otmacro;
ot= WM_operatortype_append_macro("ARMATURE_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
- WM_operatortype_macro_define(ot, "ARMATURE_OT_duplicate");
- otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
- RNA_enum_set(otmacro->ptr, "proportional", 0);
+ if(ot) {
+ WM_operatortype_macro_define(ot, "ARMATURE_OT_duplicate");
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ RNA_enum_set(otmacro->ptr, "proportional", 0);
+ }
ot= WM_operatortype_append_macro("ARMATURE_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER);
- otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
- RNA_enum_set(otmacro->ptr, "forked", 0);
- otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
- RNA_enum_set(otmacro->ptr, "proportional", 0);
+ if(ot) {
+ otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
+ RNA_enum_set(otmacro->ptr, "forked", 0);
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ RNA_enum_set(otmacro->ptr, "proportional", 0);
+ }
// XXX would it be nicer to just be able to have standard extrude_move, but set the forked property separate?
// that would require fixing a properties bug 19733
ot= WM_operatortype_append_macro("ARMATURE_OT_extrude_forked", "Extrude Forked", OPTYPE_UNDO|OPTYPE_REGISTER);
- otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
- RNA_enum_set(otmacro->ptr, "forked", 1);
- otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
- RNA_enum_set(otmacro->ptr, "proportional", 0);
+ if(ot) {
+ otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
+ RNA_enum_set(otmacro->ptr, "forked", 1);
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
+ RNA_enum_set(otmacro->ptr, "proportional", 0);
+ }
}
void ED_keymap_armature(wmKeyConfig *keyconf)
@@ -203,7 +218,10 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "snap", 1);
/* only set in editmode armature, by space_view3d listener */
-// WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "ARMATURE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "unselected", 1);
+ WM_keymap_add_item(keymap, "ARMATURE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_align", AKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_calculate_roll", NKEY, KM_PRESS, KM_CTRL, 0);
@@ -251,6 +269,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
RNA_enum_set(kmi->ptr, "mode", 0); // clear
/* armature/bone layers */
+ WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ARMATURE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
@@ -270,8 +289,10 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Pose", 0, 0);
keymap->poll= ED_operator_posemode;
- // XXX: set parent is object-based operator, but it should also be available here...
+ /* set parent and add object are object-based operators, but we make them
+ available here because it's useful to do in pose mode too */
WM_keymap_add_item(keymap, "OBJECT_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, 0, 0);
kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
@@ -311,6 +332,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "POSE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "POSE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "POSE_OT_select_flip_active", FKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_constraint_add_with_targets", CKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_constraints_clear", CKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
@@ -328,6 +350,7 @@ void ED_keymap_armature(wmKeyConfig *keyconf)
RNA_enum_set(kmi->ptr, "mode", 0); // clear
/* armature/bone layers */
+ WM_keymap_add_item(keymap, "ARMATURE_OT_layers_show_all", ACCENTGRAVEKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "POSE_OT_armature_layers", MKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "POSE_OT_bone_layers", MKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 1c25b12c917..5616a3424ba 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,7 @@
#include <string.h>
#include <math.h>
#include <float.h>
+#include <assert.h>
#include "DNA_anim_types.h"
@@ -43,6 +44,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
@@ -88,10 +90,6 @@
#include "reeb.h"
#endif
-/* ************* XXX *************** */
-static void BIF_undo_push(const char *msg) {}
-/* ************* XXX *************** */
-
/* **************** tools on Editmode Armature **************** */
/* Sync selection to parent for connected children */
@@ -122,7 +120,7 @@ void ED_armature_validate_active(struct bArmature *arm)
EditBone *ebone= arm->act_edbone;
if(ebone) {
- if(ebone->flag & BONE_HIDDEN_A || (ebone->flag & BONE_SELECTED)==0)
+ if(ebone->flag & BONE_HIDDEN_A)
arm->act_edbone= NULL;
}
}
@@ -155,6 +153,91 @@ void ED_armature_edit_bone_remove(bArmature *arm, EditBone *exBone)
bone_free(arm, exBone);
}
+/* context: editmode armature */
+EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
+{
+ EditBone *eboflip= NULL;
+ char name[32];
+
+ if (ebo == NULL)
+ return NULL;
+
+ flip_side_name(name, ebo->name, FALSE);
+
+ for (eboflip= edbo->first; eboflip; eboflip=eboflip->next) {
+ if (ebo != eboflip) {
+ if (!strcmp (name, eboflip->name))
+ break;
+ }
+ }
+
+ return eboflip;
+}
+
+/* helper function for tools to work on mirrored parts.
+ it leaves mirrored bones selected then too, which is a good indication of what happened */
+static void armature_select_mirrored(bArmature *arm)
+{
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ EditBone *curBone, *ebone_mirr;
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & BONE_SELECTED) {
+ ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ if (ebone_mirr)
+ ebone_mirr->flag |= BONE_SELECTED;
+ }
+ }
+ }
+ }
+
+}
+
+static void armature_tag_select_mirrored(bArmature *arm)
+{
+ EditBone *curBone;
+
+ /* always untag */
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ curBone->flag &= ~BONE_DONE;
+ }
+
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL)) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ if (ebone_mirr && (ebone_mirr->flag & BONE_SELECTED) == 0) {
+ ebone_mirr->flag |= BONE_DONE;
+ }
+ }
+ }
+ }
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (curBone->flag & BONE_DONE) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, curBone);
+ curBone->flag |= ebone_mirr->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ }
+ }
+ }
+}
+
+
+/* only works when tagged */
+static void armature_tag_unselect(bArmature *arm)
+{
+ EditBone *curBone;
+
+ for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
+ if (curBone->flag & BONE_DONE) {
+ curBone->flag &= ~(BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL|BONE_DONE);
+ }
+ }
+}
/* converts Bones to EditBone list, used for tools as well */
EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone *actBone)
@@ -163,46 +246,48 @@ EditBone *make_boneList(ListBase *edbo, ListBase *bones, EditBone *parent, Bone
EditBone *eBoneAct= NULL;
EditBone *eBoneTest= NULL;
Bone *curBone;
- float delta[3];
- float premat[3][3];
- float postmat[3][3];
- float imat[3][3];
- float difmat[3][3];
for (curBone=bones->first; curBone; curBone=curBone->next) {
eBone= MEM_callocN(sizeof(EditBone), "make_editbone");
/* Copy relevant data from bone to eBone */
eBone->parent= parent;
- BLI_strncpy(eBone->name, curBone->name, 32);
+ BLI_strncpy(eBone->name, curBone->name, sizeof(eBone->name));
eBone->flag = curBone->flag;
/* fix selection flags */
+
if (eBone->flag & BONE_SELECTED) {
+ /* if the bone is selected the copy its root selection to the parents tip */
eBone->flag |= BONE_TIPSEL;
- if (eBone->parent && (eBone->flag & BONE_CONNECTED))
+ if (eBone->parent && (eBone->flag & BONE_CONNECTED)) {
eBone->parent->flag |= BONE_TIPSEL;
- else
+ eBone->flag &= ~BONE_ROOTSEL; /* this is ignored when there is a connected parent, so unset it */
+ }
+ else {
eBone->flag |= BONE_ROOTSEL;
+ }
}
- else
- eBone->flag &= ~BONE_ROOTSEL;
-
- VECCOPY(eBone->head, curBone->arm_head);
- VECCOPY(eBone->tail, curBone->arm_tail);
-
- eBone->roll= 0.0f;
-
- /* roll fixing */
- sub_v3_v3v3(delta, eBone->tail, eBone->head);
- vec_roll_to_mat3(delta, 0.0f, postmat);
-
- copy_m3_m4(premat, curBone->arm_mat);
-
- invert_m3_m3(imat, postmat);
- mul_m3_m3m3(difmat, imat, premat);
-
- eBone->roll = (float)atan2(difmat[2][0], difmat[2][2]);
+ else {
+ /* if the bone is not selected, but connected to its parent
+ * copy the parents tip selection state */
+ if(eBone->parent && (eBone->flag & BONE_CONNECTED)) {
+ /* selecting with the mouse gives this behavior */
+ if(eBone->parent->flag & BONE_TIPSEL) {
+ eBone->flag |= BONE_ROOTSEL;
+ }
+ else {
+ eBone->flag &= ~BONE_ROOTSEL;
+ }
+
+ /* probably not selected but just incase */
+ eBone->flag &= ~BONE_TIPSEL;
+ }
+ }
+
+ copy_v3_v3(eBone->head, curBone->arm_head);
+ copy_v3_v3(eBone->tail, curBone->arm_tail);
+ eBone->roll = curBone->arm_roll;
/* rest of stuff copy */
eBone->length= curBone->length;
@@ -317,9 +402,11 @@ void ED_armature_from_edit(Object *obedit)
newBone= MEM_callocN(sizeof(Bone), "bone");
eBone->temp= newBone; /* Associate the real Bones with the EditBones */
- BLI_strncpy(newBone->name, eBone->name, 32);
- memcpy(newBone->head, eBone->head, sizeof(float)*3);
- memcpy(newBone->tail, eBone->tail, sizeof(float)*3);
+ BLI_strncpy(newBone->name, eBone->name, sizeof(newBone->name));
+ copy_v3_v3(newBone->arm_head, eBone->head);
+ copy_v3_v3(newBone->arm_tail, eBone->tail);
+ newBone->arm_roll = eBone->roll;
+
newBone->flag= eBone->flag;
if (eBone == arm->act_edbone) {
@@ -354,7 +441,6 @@ void ED_armature_from_edit(Object *obedit)
BLI_addtail(&newBone->parent->childbase, newBone);
{
- float M_boneRest[3][3];
float M_parentRest[3][3];
float iM_parentRest[3][3];
float delta[3];
@@ -363,10 +449,6 @@ void ED_armature_from_edit(Object *obedit)
sub_v3_v3v3(delta, eBone->parent->tail, eBone->parent->head);
vec_roll_to_mat3(delta, eBone->parent->roll, M_parentRest);
- /* Get this bone's matrix (rotation only) */
- sub_v3_v3v3(delta, eBone->tail, eBone->head);
- vec_roll_to_mat3(delta, eBone->roll, M_boneRest);
-
/* Invert the parent matrix */
invert_m3_m3(iM_parentRest, M_parentRest);
@@ -379,8 +461,11 @@ void ED_armature_from_edit(Object *obedit)
}
}
/* ...otherwise add this bone to the armature's bonebase */
- else
+ else {
+ copy_v3_v3(newBone->head, eBone->head);
+ copy_v3_v3(newBone->tail, eBone->tail);
BLI_addtail(&arm->bonebase, newBone);
+ }
}
/* Make a pass through the new armature to fix rolling */
@@ -393,7 +478,7 @@ void ED_armature_from_edit(Object *obedit)
armature_rebuild_pose(obt, arm);
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
void ED_armature_apply_transform(Object *ob, float mat[4][4])
@@ -491,32 +576,20 @@ static EditBone *editbone_name_exists (ListBase *edbo, const char *name)
}
/* note: there's a unique_bone_name() too! */
+static int editbone_unique_check(void *arg, const char *name)
+{
+ struct {ListBase *lb;void *bone;} *data= arg;
+ EditBone *dupli= editbone_name_exists(data->lb, name);
+ return dupli && dupli != data->bone;
+}
+
void unique_editbone_name (ListBase *edbo, char *name, EditBone *bone)
{
- EditBone *dupli;
- char tempname[64];
- int number;
- char *dot;
+ struct {ListBase *lb; void *bone;} data;
+ data.lb= edbo;
+ data.bone= bone;
- dupli = editbone_name_exists(edbo, name);
-
- if (dupli && bone != dupli) {
- /* Strip off the suffix, if it's a number */
- number= strlen(name);
- if (number && isdigit(name[number-1])) {
- dot= strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
-
- for (number = 1; number <= 999; number++) {
- sprintf(tempname, "%s.%03d", name, number);
- if (!editbone_name_exists(edbo, tempname)) {
- BLI_strncpy(name, tempname, 32);
- return;
- }
- }
- }
+ BLI_uniquename_cb(editbone_unique_check, &data, "Bone", '.', name, sizeof(bone->name));
}
/* helper for apply_armature_pose2bones - fixes parenting of objects that are bone-parented to armature */
@@ -531,7 +604,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
/* apply current transform from parent (not yet destroyed),
* then calculate new parent inverse matrix
*/
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
what_does_parent(scene, ob, &workob);
invert_m4_m4(ob->parentinv, workob.obmat);
@@ -543,7 +616,7 @@ static void applyarmature_fix_boneparents (Scene *scene, Object *armob)
static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
bArmature *arm= get_armature(ob);
bPose *pose;
bPoseChannel *pchan;
@@ -570,8 +643,8 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
curbone= editbone_name_exists(arm->edbo, pchan->name);
/* simply copy the head/tail values from pchan over to curbone */
- VECCOPY(curbone->head, pchan->pose_head);
- VECCOPY(curbone->tail, pchan->pose_tail);
+ copy_v3_v3(curbone->head, pchan->pose_head);
+ copy_v3_v3(curbone->tail, pchan->pose_tail);
/* fix roll:
* 1. find auto-calculated roll value for this bone now
@@ -598,10 +671,11 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
}
/* clear transform values for pchan */
- pchan->loc[0]= pchan->loc[1]= pchan->loc[2]= 0.0f;
- pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
- pchan->quat[1]= pchan->quat[2]= pchan->quat[3]= 0.0f;
- pchan->quat[0]= pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
+ zero_v3(pchan->loc);
+ zero_v3(pchan->eul);
+ unit_qt(pchan->quat);
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ pchan->size[0]= pchan->size[1]= pchan->size[2]= 1.0f;
/* set anim lock */
curbone->flag |= BONE_UNKEYED;
@@ -640,10 +714,9 @@ void POSE_OT_armature_apply (wmOperatorType *ot)
/* set the current pose as the restpose */
-static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
+static int pose_visual_transform_apply_exec (bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C); // must be active object, not edit-object
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); // must be active object, not edit-object
/* don't check if editmode (should be done by caller) */
if (ob->type!=OB_ARMATURE)
@@ -655,25 +728,19 @@ static int pose_visual_transform_apply_exec (bContext *C, wmOperator *op)
* at once are to be predictable*/
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
{
- float delta_mat[4][4], imat[4][4], mat[4][4];
-
- where_is_pose_bone(scene, ob, pchan, CFRA, 1);
-
- copy_m4_m4(mat, pchan->pose_mat);
-
- /* calculate pchan->pose_mat without loc/size/rot & constraints applied */
- where_is_pose_bone(scene, ob, pchan, CFRA, 0);
- invert_m4_m4(imat, pchan->pose_mat);
- mul_m4_m4m4(delta_mat, mat, imat);
-
- pchan_apply_mat4(pchan, delta_mat);
-
- where_is_pose_bone(scene, ob, pchan, CFRA, 1);
+ float delta_mat[4][4];
+
+ /* chan_mat already contains the delta transform from rest pose to pose-mode pose
+ * as that is baked into there so that B-Bones will work. Once we've set this as the
+ * new raw-transform components, don't recalc the poses yet, otherwise IK result will
+ * change, thus changing the result we may be trying to record.
+ */
+ copy_m4_m4(delta_mat, pchan->chan_mat);
+ pchan_apply_mat4(pchan, delta_mat, TRUE);
}
CTX_DATA_END;
-
- // ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -748,7 +815,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
for (achan= act->chanbase.first; achan; achan= achan->next) {
if (strcmp(achan->name, pchan->name)==0)
- BLI_strncpy(achan->name, curbone->name, 32);
+ BLI_strncpy(achan->name, curbone->name, sizeof(achan->name));
}
}
}
@@ -792,7 +859,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
if (ob->partype==PARBONE) {
/* bone name in object */
if (!strcmp(ob->parsubstr, pchan->name))
- BLI_strncpy(ob->parsubstr, curbone->name, 32);
+ BLI_strncpy(ob->parsubstr, curbone->name, sizeof(ob->parsubstr));
}
/* make tar armature be new parent */
@@ -802,7 +869,7 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
}
/* join armature exec is exported for use in object->join objects operator... */
-int join_armature_exec(bContext *C, wmOperator *op)
+int join_armature_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1060,7 +1127,7 @@ static void separated_armature_fix_links(Object *origArm, Object *newArm)
* sel: remove selected bones from the armature, otherwise the unselected bones are removed
* (ob is not in editmode)
*/
-static void separate_armature_bones (Scene *scene, Object *ob, short sel)
+static void separate_armature_bones(Object *ob, short sel)
{
bArmature *arm= (bArmature *)ob->data;
bPoseChannel *pchan, *pchann;
@@ -1112,19 +1179,17 @@ static void separate_armature_bones (Scene *scene, Object *ob, short sel)
}
/* separate selected bones into their armature */
-static int separate_armature_exec (bContext *C, wmOperator *op)
+static int separate_armature_exec (bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Object *oldob, *newob;
Base *oldbase, *newbase;
- bArmature *arm;
/* sanity checks */
if (obedit == NULL)
return OPERATOR_CANCELLED;
- arm= obedit->data;
/* set wait cursor in case this takes a while */
WM_cursor_wait(1);
@@ -1161,15 +1226,15 @@ static int separate_armature_exec (bContext *C, wmOperator *op)
/* 3) remove bones that shouldn't still be around on both armatures */
- separate_armature_bones(scene, oldob, 1);
- separate_armature_bones(scene, newob, 0);
+ separate_armature_bones(oldob, 1);
+ separate_armature_bones(newob, 0);
/* 4) fix links before depsgraph flushes */ // err... or after?
separated_armature_fix_links(oldob, newob);
- DAG_id_flush_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DAG_id_flush_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ DAG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
+ DAG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
/* 5) restore original conditions */
@@ -1209,15 +1274,11 @@ void ARMATURE_OT_separate (wmOperatorType *ot)
Bone *get_indexed_bone (Object *ob, int index)
{
bPoseChannel *pchan;
- int a= 0;
-
if(ob->pose==NULL) return NULL;
index>>=16; // bone selection codes use left 2 bytes
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next, a++) {
- if(a==index) return pchan->bone;
- }
- return NULL;
+ pchan= BLI_findlink(&ob->pose->chanbase, index);
+ return pchan ? pchan->bone : NULL;
}
/* See if there are any selected bones in this buffer */
@@ -1349,8 +1410,9 @@ static EditBone *editbone_get_child(bArmature *arm, EditBone *pabone, short use_
for (curbone= arm->edbo->first; curbone; curbone= curbone->next) {
if (curbone->parent == pabone) {
if (use_visibility) {
- if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A))
+ if ((arm->layer & curbone->layer) && !(pabone->flag & BONE_HIDDEN_A)) {
chbone = curbone;
+ }
}
else
chbone = curbone;
@@ -1374,7 +1436,7 @@ static int pose_setflag_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, CTX_data_active_object(C));
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ED_object_pose_armature(CTX_data_active_object(C)));
return OPERATOR_FINISHED;
}
@@ -1546,6 +1608,7 @@ void POSE_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Connected";
ot->idname= "POSE_OT_select_linked";
+ ot->description= "Select bones related to selected ones by parent/child relationships";
/* api callbacks */
ot->exec= NULL;
@@ -1645,6 +1708,7 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Connected";
ot->idname= "ARMATURE_OT_select_linked";
+ ot->description= "Select bones related to selected ones by parent/child relationships";
/* api callbacks */
ot->exec= NULL;
@@ -1748,34 +1812,12 @@ static EditBone *get_nearest_editbonepoint (ViewContext *vc, short mval[2], List
return NULL;
}
-/* context: editmode armature */
-EditBone *ED_armature_bone_get_mirrored(ListBase *edbo, EditBone *ebo)
-{
- EditBone *eboflip= NULL;
- char name[32];
-
- if (ebo == NULL)
- return NULL;
-
- flip_side_name(name, ebo->name, FALSE);
-
- for (eboflip= edbo->first; eboflip; eboflip=eboflip->next) {
- if (ebo != eboflip) {
- if (!strcmp (name, eboflip->name))
- break;
- }
- }
-
- return eboflip;
-}
-
-
/* previously delete_armature */
/* only editmode! */
-static int armature_delete_selected_exec(bContext *C, wmOperator *op)
+static int armature_delete_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
bArmature *arm;
- EditBone *curBone, *next;
+ EditBone *curBone, *ebone_next;
bConstraint *con;
Object *obedit= CTX_data_edit_object(C); // XXX get from context
arm = obedit->data;
@@ -1784,24 +1826,13 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- /* Select mirrored bones */
- if (arm->flag & ARM_MIRROR_EDIT) {
- for (curBone=arm->edbo->first; curBone; curBone=curBone->next) {
- if (arm->layer & curBone->layer) {
- if (curBone->flag & BONE_SELECTED) {
- next = ED_armature_bone_get_mirrored(arm->edbo, curBone);
- if (next)
- next->flag |= BONE_SELECTED;
- }
- }
- }
- }
+ armature_select_mirrored(arm);
/* First erase any associated pose channel */
if (obedit->pose) {
- bPoseChannel *pchan, *next;
- for (pchan=obedit->pose->chanbase.first; pchan; pchan=next) {
- next= pchan->next;
+ bPoseChannel *pchan, *pchan_next;
+ for (pchan=obedit->pose->chanbase.first; pchan; pchan= pchan_next) {
+ pchan_next= pchan->next;
curBone = editbone_name_exists(arm->edbo, pchan->name);
if (curBone && (curBone->flag & BONE_SELECTED) && (arm->layer & curBone->layer)) {
@@ -1839,8 +1870,8 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *op)
}
- for (curBone=arm->edbo->first;curBone;curBone=next) {
- next=curBone->next;
+ for (curBone=arm->edbo->first; curBone; curBone= ebone_next) {
+ ebone_next= curBone->next;
if (arm->layer & curBone->layer) {
if (curBone->flag & BONE_SELECTED) {
if(curBone==arm->act_edbone) arm->act_edbone= NULL;
@@ -1862,6 +1893,7 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "Delete Selected Bone(s)";
ot->idname= "ARMATURE_OT_delete";
+ ot->description= "Remove selected bones from the armature";
/* api callbacks */
ot->invoke = WM_operator_confirm;
@@ -1874,10 +1906,9 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
/* toggle==0: deselect
* toggle==1: swap (based on test)
- * toggle==2: only active tag
- * toggle==3: swap (no test)
+ * toggle==2: swap (no test), CURRENTLY UNUSED
*/
-void ED_armature_deselectall(Object *obedit, int toggle, int doundo)
+void ED_armature_deselect_all(Object *obedit, int toggle)
{
bArmature *arm= obedit->data;
EditBone *eBone;
@@ -1897,39 +1928,60 @@ void ED_armature_deselectall(Object *obedit, int toggle, int doundo)
}
else sel= toggle;
- if(sel==2) {
- arm->act_edbone= NULL;
- } else {
- /* Set the flags */
- for (eBone=arm->edbo->first;eBone;eBone=eBone->next) {
- if (sel==3) {
- /* invert selection of bone */
- if ((arm->layer & eBone->layer) && (eBone->flag & BONE_HIDDEN_A)==0) {
- eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- if(arm->act_edbone==eBone)
- arm->act_edbone= NULL;
- }
- }
- else if (sel==1) {
- /* select bone */
- if(arm->layer & eBone->layer && (eBone->flag & BONE_HIDDEN_A)==0) {
- eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- if(eBone->parent)
- eBone->parent->flag |= (BONE_TIPSEL);
- }
- }
- else {
- /* deselect bone */
- eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ /* Set the flags */
+ for (eBone=arm->edbo->first;eBone;eBone=eBone->next) {
+ if (sel==2) {
+ /* invert selection of bone */
+ if(EBONE_VISIBLE(arm, eBone)) {
+ eBone->flag ^= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
if(arm->act_edbone==eBone)
arm->act_edbone= NULL;
}
}
+ else if (sel==1) {
+ /* select bone */
+ if(EBONE_VISIBLE(arm, eBone)) {
+ eBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ if(eBone->parent)
+ eBone->parent->flag |= (BONE_TIPSEL);
+ }
+ }
+ else {
+ /* deselect bone */
+ eBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ if(arm->act_edbone==eBone)
+ arm->act_edbone= NULL;
+ }
}
ED_armature_sync_selection(arm->edbo);
}
+void ED_armature_deselect_all_visible(Object *obedit)
+{
+ bArmature *arm= obedit->data;
+ EditBone *ebone;
+
+ for (ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ /* first and foremost, bone must be visible and selected */
+ if (EBONE_VISIBLE(arm, ebone) && (ebone->flag & BONE_UNSELECTABLE)==0) {
+ ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ }
+ }
+
+ ED_armature_sync_selection(arm->edbo);
+}
+
+/* accounts for connected parents */
+static int ebone_select_flag(EditBone *ebone)
+{
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ return ((ebone->parent->flag & BONE_TIPSEL) ? BONE_ROOTSEL : 0) | (ebone->flag & (BONE_SELECTED|BONE_TIPSEL));
+ }
+ else {
+ return ebone->flag & (BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ }
+}
/* context: editmode armature in view3d */
int mouse_armature(bContext *C, short mval[2], int extend)
@@ -1948,7 +2000,7 @@ int mouse_armature(bContext *C, short mval[2], int extend)
if (nearBone) {
if (!extend)
- ED_armature_deselectall(obedit, 0, 0);
+ ED_armature_deselect_all(obedit, 0);
/* by definition the non-root connected bones have no root point drawn,
so a root selection needs to be delivered to the parent tip */
@@ -1999,7 +2051,9 @@ int mouse_armature(bContext *C, short mval[2], int extend)
if(nearBone) {
/* then now check for active status */
- if(nearBone->flag & BONE_SELECTED) arm->act_edbone= nearBone;
+ if(ebone_select_flag(nearBone)) {
+ arm->act_edbone= nearBone;
+ }
}
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
@@ -2048,136 +2102,140 @@ void ED_armature_to_edit(Object *ob)
/* adjust bone roll to align Z axis with vector
* vec is in local space and is normalized
*/
-float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3])
+
+float ED_rollBoneToVector(EditBone *bone, const float align_axis[3], const short axis_only)
{
- float mat[3][3], nor[3], up_axis[3], vec[3];
- float roll;
+ float mat[3][3], nor[3];
sub_v3_v3v3(nor, bone->tail, bone->head);
-
- vec_roll_to_mat3(nor, 0, mat);
- VECCOPY(up_axis, mat[2]);
-
- roll = angle_normalized_v3v3(new_up_axis, up_axis);
-
- cross_v3_v3v3(vec, up_axis, new_up_axis);
-
- if (dot_v3v3(vec, nor) < 0)
- {
- roll = -roll;
- }
-
- return roll;
-}
+ vec_roll_to_mat3(nor, 0.0f, mat);
+ /* check the bone isnt aligned with the axis */
+ if(!is_zero_v3(align_axis) && angle_v3v3(align_axis, mat[2]) > FLT_EPSILON) {
+ float vec[3], align_axis_proj[3], roll;
-/* Set roll value for given bone -> Z-Axis Point up (original method) */
-static void auto_align_ebone_zaxisup(Scene *scene, View3D *v3d, EditBone *ebone)
-{
- float delta[3], curmat[3][3];
- float xaxis[3]={1.0f, 0.0f, 0.0f}, yaxis[3], zaxis[3]={0.0f, 0.0f, 1.0f};
- float targetmat[3][3], imat[3][3], diffmat[3][3];
-
- /* Find the current bone matrix */
- sub_v3_v3v3(delta, ebone->tail, ebone->head);
- vec_roll_to_mat3(delta, 0.0f, curmat);
-
- /* Make new matrix based on y axis & z-up */
- VECCOPY(yaxis, curmat[1]);
-
- unit_m3(targetmat);
- VECCOPY(targetmat[0], xaxis);
- VECCOPY(targetmat[1], yaxis);
- VECCOPY(targetmat[2], zaxis);
- normalize_m3(targetmat);
-
- /* Find the difference between the two matrices */
- invert_m3_m3(imat, targetmat);
- mul_m3_m3m3(diffmat, imat, curmat);
-
- // old-method... let's see if using mat3_to_vec_roll is more accurate
- //ebone->roll = atan2(diffmat[2][0], diffmat[2][2]);
- mat3_to_vec_roll(diffmat, delta, &ebone->roll);
-}
-
-void auto_align_ebone_topoint(EditBone *ebone, float *cursor)
-{
- float delta[3], curmat[3][3];
- float mat[4][4], tmat[4][4], imat[4][4];
- float rmat[4][4], rot[3];
- float vec[3];
-
- /* find the current bone matrix as a 4x4 matrix (in Armature Space) */
- sub_v3_v3v3(delta, ebone->tail, ebone->head);
- vec_roll_to_mat3(delta, ebone->roll, curmat);
- copy_m4_m3(mat, curmat);
- VECCOPY(mat[3], ebone->head);
-
- /* multiply bone-matrix by object matrix (so that bone-matrix is in WorldSpace) */
- invert_m4_m4(imat, mat);
-
- /* find position of cursor relative to bone */
- mul_v3_m4v3(vec, imat, cursor);
-
- /* check that cursor is in usable position */
- if ((IS_EQ(vec[0], 0)==0) && (IS_EQ(vec[2], 0)==0)) {
- /* Compute a rotation matrix around y */
- rot[1] = (float)atan2(vec[0], vec[2]);
- rot[0] = rot[2] = 0.0f;
- eul_to_mat4( rmat,rot);
+ /* project the new_up_axis along the normal */
+ project_v3_v3v3(vec, align_axis, nor);
+ sub_v3_v3v3(align_axis_proj, align_axis, vec);
- /* Multiply the bone matrix by rotation matrix. This should be new bone-matrix */
- mul_m4_m4m4(tmat, rmat, mat);
- copy_m3_m4(curmat, tmat);
+ if(axis_only) {
+ if(angle_v3v3(align_axis_proj, mat[2]) > M_PI/2) {
+ negate_v3(align_axis_proj);
+ }
+ }
- /* Now convert from new bone-matrix, back to a roll value (in radians) */
- mat3_to_vec_roll(curmat, delta, &ebone->roll);
- }
-}
+ roll = angle_v3v3(align_axis_proj, mat[2]);
+
+ cross_v3_v3v3(vec, mat[2], align_axis_proj);
+
+ if (dot_v3v3(vec, nor) < 0) {
+ roll = -roll;
+ }
-static void auto_align_ebone_tocursor(Scene *scene, View3D *v3d, EditBone *ebone)
-{
- float cursor_local[3];
- float *cursor= give_cursor(scene, v3d);
- float imat[3][3];
+ return roll;
+ }
- copy_m3_m4(imat, scene->obedit->obmat);
- invert_m3(imat);
- copy_v3_v3(cursor_local, cursor);
- mul_m3_v3(imat, cursor_local);
- auto_align_ebone_topoint(ebone, cursor_local);
+ return 0.0f;
}
+
static EnumPropertyItem prop_calc_roll_types[] = {
- {0, "GLOBALUP", 0, "Z-Axis Up", ""},
- {1, "CURSOR", 0, "Z-Axis to Cursor", ""},
+ {0, "X", 0, "X Axis", ""},
+ {1, "Y", 0, "Y Axis", ""},
+ {2, "Z", 0, "Z Axis", ""},
+ {5, "ACTIVE", 0, "Active Bone", ""},
+ {6, "VIEW", 0, "View Axis", ""},
+ {7, "CURSOR", 0, "Cursor", ""},
{0, NULL, 0, NULL, NULL}
};
+
static int armature_calc_roll_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
Object *ob= CTX_data_edit_object(C);
- void (*roll_func)(Scene *, View3D *, EditBone *) = NULL;
+ const short type= RNA_enum_get(op->ptr, "type");
+ const short axis_only= RNA_boolean_get(op->ptr, "axis_only");
+ const short axis_flip= RNA_boolean_get(op->ptr, "axis_flip");
+
+ float imat[3][3];
+
+ bArmature *arm= ob->data;
+ EditBone *ebone;
+
+ copy_m3_m4(imat, ob->obmat);
+ invert_m3(imat);
+
+ if(type==7) { /* Cursor */
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C); /* can be NULL */
+ float cursor_local[3];
+ float *cursor= give_cursor(scene, v3d);
- /* specific method used to calculate roll depends on mode */
- switch (RNA_enum_get(op->ptr, "type")) {
- case 1: /* Z-Axis point towards cursor */
- roll_func= auto_align_ebone_tocursor;
- break;
- default: /* Z-Axis Point Up */
- roll_func= auto_align_ebone_zaxisup;
- break;
+
+ copy_v3_v3(cursor_local, cursor);
+ mul_m3_v3(imat, cursor_local);
+
+ /* cursor */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ float cursor_rel[3];
+ sub_v3_v3v3(cursor_rel, cursor_local, ebone->head);
+ if(axis_flip) negate_v3(cursor_rel);
+ ebone->roll= ED_rollBoneToVector(ebone, cursor_rel, axis_only);
+ }
+ }
}
-
- /* recalculate roll on selected bones */
- CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones) {
- /* roll func is a callback which assumes that all is well */
- roll_func(scene, v3d, ebone);
+ else {
+ float vec[3]= {0.0f, 0.0f, 0.0f};
+ if(type==6) { /* View */
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ if(rv3d==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No region view3d available");
+ return OPERATOR_CANCELLED;
+ }
+
+ copy_v3_v3(vec, rv3d->viewinv[2]);
+ mul_m3_v3(imat, vec);
+ }
+ else if (type==5) {
+ float mat[3][3], nor[3];
+ ebone= (EditBone *)arm->act_edbone;
+ if(ebone==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active bone set");
+ return OPERATOR_CANCELLED;
+ }
+
+ sub_v3_v3v3(nor, ebone->tail, ebone->head);
+ vec_roll_to_mat3(nor, ebone->roll, mat);
+ copy_v3_v3(vec, mat[2]);
+ }
+ else { /* Axis */
+ assert(type >= 0 && type <= 5);
+ if(type<3) vec[type]= 1.0f;
+ else vec[type-2]= -1.0f;
+ mul_m3_v3(imat, vec);
+ }
+
+ if(axis_flip) negate_v3(vec);
+
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) {
+ /* roll func is a callback which assumes that all is well */
+ ebone->roll= ED_rollBoneToVector(ebone, vec, axis_only);
+ }
+ }
+ }
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if((EBONE_VISIBLE(arm, ebone) && EBONE_EDITABLE(ebone)) == 0) {
+ EditBone *ebone_mirr= ED_armature_bone_get_mirrored(arm->edbo, ebone);
+ if (ebone_mirr && (EBONE_VISIBLE(arm, ebone_mirr) && EBONE_EDITABLE(ebone_mirr))) {
+ ebone->roll= -ebone_mirr->roll;
+ }
+ }
+ }
}
- CTX_DATA_END;
-
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -2190,6 +2248,7 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
/* identifiers */
ot->name= "Recalculate Roll";
ot->idname= "ARMATURE_OT_calculate_roll";
+ ot->description= "Automatically fix alignment of select bones' axes";
/* api callbacks */
ot->invoke = WM_menu_invoke;
@@ -2198,9 +2257,11 @@ void ARMATURE_OT_calculate_roll(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* properties */
ot->prop= RNA_def_enum(ot->srna, "type", prop_calc_roll_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "axis_flip", 0, "Flip Axis", "Negate the alignment axis.");
+ RNA_def_boolean(ot->srna, "axis_only", 0, "Shortest Rotation", "Ignore the axis direction, use the shortest rotation to align.");
}
/* **************** undo for armatures ************** */
@@ -2230,6 +2291,8 @@ static void undoBones_to_editBones(void *uarmv, void *armv, void *data)
ebo= uarm->act_edbone;
arm->act_edbone= ebo->temp;
}
+ else
+ arm->act_edbone= NULL;
/* set pointers */
for(newebo= arm->edbo->first; newebo; newebo= newebo->next) {
@@ -2288,7 +2351,7 @@ static void *get_armature_edit(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_armature(bContext *C, char *name)
+void undo_push_armature(bContext *C, const char *name)
{
// XXX solve getdata()
undo_editmode_push(C, name, get_armature_edit, free_undoBones, undoBones_to_editBones, editBones_to_undoBones, NULL);
@@ -2300,11 +2363,11 @@ void undo_push_armature(bContext *C, char *name)
/* *************** Adding stuff in editmode *************** */
/* default bone add, returns it selected, but without tail set */
-EditBone *ED_armature_edit_bone_add(bArmature *arm, char *name)
+EditBone *ED_armature_edit_bone_add(bArmature *arm, const char *name)
{
EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy(bone->name, name, 32);
+ BLI_strncpy(bone->name, name, sizeof(bone->name));
unique_editbone_name(arm->edbo, bone->name, NULL);
BLI_addtail(arm->edbo, bone);
@@ -2343,7 +2406,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
mul_m3_m3m3(totmat, obmat, viewmat);
invert_m3_m3(imat, totmat);
- ED_armature_deselectall(obedit, 0, 0);
+ ED_armature_deselect_all(obedit, 0);
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, "Bone");
@@ -2360,7 +2423,7 @@ void add_primitive_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d)
/* previously addvert_armature */
/* the ctrl-click method */
-static int armature_click_extrude_exec(bContext *C, wmOperator *op)
+static int armature_click_extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d;
bArmature *arm;
@@ -2396,7 +2459,7 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
to_root= 1;
}
- ED_armature_deselectall(obedit, 0, 0);
+ ED_armature_deselect_all(obedit, 0);
/* we re-use code for mirror editing... */
flipbone= NULL;
@@ -2416,19 +2479,19 @@ static int armature_click_extrude_exec(bContext *C, wmOperator *op)
arm->act_edbone= newbone;
if (to_root) {
- VECCOPY(newbone->head, ebone->head);
+ copy_v3_v3(newbone->head, ebone->head);
newbone->rad_head= ebone->rad_tail;
newbone->parent= ebone->parent;
}
else {
- VECCOPY(newbone->head, ebone->tail);
+ copy_v3_v3(newbone->head, ebone->tail);
newbone->rad_head= ebone->rad_tail;
newbone->parent= ebone;
newbone->flag |= BONE_CONNECTED;
}
curs= give_cursor(scene, v3d);
- VECCOPY(newbone->tail, curs);
+ copy_v3_v3(newbone->tail, curs);
sub_v3_v3v3(newbone->tail, newbone->tail, obedit->obmat[3]);
if (a==1)
@@ -2472,7 +2535,7 @@ static int armature_click_extrude_invoke(bContext *C, wmOperator *op, wmEvent *e
fp= give_cursor(scene, v3d);
- VECCOPY(oldcurs, fp);
+ copy_v3_v3(oldcurs, fp);
mx= event->x - ar->winrct.xmin;
my= event->y - ar->winrct.ymin;
@@ -2502,7 +2565,7 @@ static int armature_click_extrude_invoke(bContext *C, wmOperator *op, wmEvent *e
retv= armature_click_extrude_exec(C, op);
/* restore previous 3d cursor position */
- VECCOPY(fp, oldcurs);
+ copy_v3_v3(fp, oldcurs);
return retv;
}
@@ -2512,6 +2575,7 @@ void ARMATURE_OT_click_extrude(wmOperatorType *ot)
/* identifiers */
ot->name= "Click-Extrude";
ot->idname= "ARMATURE_OT_click_extrude";
+ ot->description= "Create a new bone going from the last selected joint to the mouse position";
/* api callbacks */
ot->invoke = armature_click_extrude_invoke;
@@ -2531,8 +2595,8 @@ static EditBone *add_points_bone (Object *obedit, float head[], float tail[])
ebo= ED_armature_edit_bone_add(obedit->data, "Bone");
- VECCOPY(ebo->head, head);
- VECCOPY(ebo->tail, tail);
+ copy_v3_v3(ebo->head, head);
+ copy_v3_v3(ebo->tail, tail);
return ebo;
}
@@ -2636,7 +2700,7 @@ EditBone *duplicateEditBoneObjects(EditBone *curBone, char *name, ListBase *edit
if (name != NULL)
{
- BLI_strncpy(eBone->name, name, 32);
+ BLI_strncpy(eBone->name, name, sizeof(eBone->name));
}
unique_editbone_name(editbones, eBone->name, NULL);
@@ -2674,7 +2738,7 @@ EditBone *duplicateEditBone(EditBone *curBone, char *name, ListBase *editbones,
}
/* previously adduplicate_armature */
-static int armature_duplicate_selected_exec(bContext *C, wmOperator *op)
+static int armature_duplicate_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
bArmature *arm;
EditBone *eBone = NULL;
@@ -2780,6 +2844,7 @@ void ARMATURE_OT_duplicate(wmOperatorType *ot)
/* identifiers */
ot->name= "Duplicate Selected Bone(s)";
ot->idname= "ARMATURE_OT_duplicate";
+ ot->description= "Make copies of the selected bones within the same armature";
/* api callbacks */
ot->exec = armature_duplicate_selected_exec;
@@ -2859,10 +2924,10 @@ static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points)
short found= 0;
if (eb_tail) {
- VECCOPY(vec, ebo->tail);
+ copy_v3_v3(vec, ebo->tail);
}
else {
- VECCOPY(vec, ebo->head);
+ copy_v3_v3(vec, ebo->head);
}
for (ebp= points->first; ebp; ebp= ebp->next) {
@@ -2891,11 +2956,11 @@ static void fill_add_joint (EditBone *ebo, short eb_tail, ListBase *points)
ebp= MEM_callocN(sizeof(EditBonePoint), "EditBonePoint");
if (eb_tail) {
- VECCOPY(ebp->vec, ebo->tail);
+ copy_v3_v3(ebp->vec, ebo->tail);
ebp->tail_owner= ebo;
}
else {
- VECCOPY(ebp->vec, ebo->head);
+ copy_v3_v3(ebp->vec, ebo->head);
ebp->head_owner= ebo;
}
@@ -2910,14 +2975,13 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
bArmature *arm= (obedit) ? obedit->data : NULL;
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
- EditBone *newbone=NULL;
ListBase points = {NULL, NULL};
int count;
-
+
/* sanity checks */
- if ELEM(NULL, obedit, arm)
+ if (ELEM(NULL, obedit, arm))
return OPERATOR_CANCELLED;
-
+
/* loop over all bones, and only consider if visible */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones)
{
@@ -2951,7 +3015,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
mul_v3_m4v3(curs, obedit->imat, give_cursor(scene, v3d));
/* Create a bone */
- newbone= add_points_bone(obedit, ebp->vec, curs);
+ /* newbone= */ add_points_bone(obedit, ebp->vec, curs);
}
else if (count == 2) {
EditBonePoint *ebp, *ebp2;
@@ -3012,7 +3076,7 @@ static int armature_fill_bones_exec (bContext *C, wmOperator *op)
/* add new bone and parent it to the appropriate end */
if (headtail) {
- newbone= add_points_bone(obedit, head, tail);
+ EditBone *newbone= add_points_bone(obedit, head, tail);
/* do parenting (will need to set connected flag too) */
if (headtail == 2) {
@@ -3089,13 +3153,13 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
* - tail = head/tail of end (default tail)
* - parent = parent of start
*/
- if ((start->flag & BONE_TIPSEL) && ((start->flag & BONE_SELECTED) || start==arm->act_edbone)==0) {
+ if ((start->flag & BONE_TIPSEL) && (start->flag & BONE_SELECTED)==0) {
copy_v3_v3(head, start->tail);
}
else {
copy_v3_v3(head, start->head);
}
- if ((end->flag & BONE_ROOTSEL) && ((end->flag & BONE_SELECTED) || end==arm->act_edbone)==0) {
+ if ((end->flag & BONE_ROOTSEL) && (end->flag & BONE_SELECTED)==0) {
copy_v3_v3(tail, end->head);
}
else {
@@ -3103,12 +3167,15 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
}
newbone= add_points_bone(obedit, head, tail);
newbone->parent = start->parent;
+
+ /* TODO, copy more things to the new bone */
+ newbone->flag= start->flag & (BONE_HINGE|BONE_NO_DEFORM|BONE_NO_SCALE|BONE_NO_CYCLICOFFSET|BONE_NO_LOCAL_LOCATION|BONE_DONE);
/* step 2a: parent children of in-between bones to newbone */
for (chain= chains->first; chain; chain= chain->next) {
/* ick: we need to check if parent of each bone in chain is one of the bones in the */
+ short found= 0;
for (ebo= chain->data; ebo; ebo= ebo->parent) {
- short found= 0;
/* try to find which bone from the list to be removed, is the parent */
for (ebone= end; ebone; ebone= ebone->parent) {
@@ -3124,6 +3191,9 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
break;
}
}
+ if (found) {
+ break;
+ }
}
/* step 2b: parent child of end to newbone (child from this chain) */
@@ -3135,6 +3205,9 @@ static void bones_merge(Object *obedit, EditBone *start, EditBone *end, EditBone
ebone= (ebo == start) ? (NULL) : (ebo->parent);
bone_free(arm, ebo);
}
+
+ newbone->flag |= (BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
+ ED_armature_sync_selection(arm->edbo);
}
@@ -3158,7 +3231,9 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
/* get chains (ends on chains) */
chains_find_tips(arm->edbo, &chains);
if (chains.first == NULL) return OPERATOR_CANCELLED;
-
+
+ armature_tag_select_mirrored(arm);
+
/* each 'chain' is the last bone in the chain (with no children) */
for (chain= chains.first; chain; chain= nchain) {
EditBone *bstart= NULL, *bend= NULL;
@@ -3173,7 +3248,7 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
/* check if visible + selected */
if ( EBONE_VISIBLE(arm, ebo) &&
((ebo->flag & BONE_CONNECTED) || (ebo->parent==NULL)) &&
- ((ebo->flag & BONE_SELECTED) || (ebo==arm->act_edbone)) )
+ (ebo->flag & BONE_SELECTED) )
{
/* set either end or start (end gets priority, unless it is already set) */
if (bend == NULL) {
@@ -3202,6 +3277,8 @@ static int armature_merge_exec (bContext *C, wmOperator *op)
BLI_insertlinkbefore(&chains, nchain, chain);
}
+ armature_tag_unselect(arm);
+
BLI_freelistN(&chains);
}
@@ -3239,8 +3316,90 @@ void ARMATURE_OT_merge (wmOperatorType *ot)
/* ************** END Add/Remove stuff in editmode ************ */
/* *************** Tools in editmode *********** */
+static int armature_hide_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ bArmature *arm= obedit->data;
+ EditBone *ebone;
+ const int invert= RNA_boolean_get(op->ptr, "unselected") ? BONE_SELECTED : 0;
+
+ /* cancel if nothing selected */
+ if (CTX_DATA_COUNT(C, selected_bones) == 0)
+ return OPERATOR_CANCELLED;
+
+ for (ebone = arm->edbo->first; ebone; ebone=ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ if ((ebone->flag & BONE_SELECTED) != invert) {
+ ebone->flag &= ~(BONE_TIPSEL|BONE_SELECTED|BONE_ROOTSEL);
+ ebone->flag |= BONE_HIDDEN_A;
+ }
+ }
+ }
+ ED_armature_validate_active(arm);
+ ED_armature_sync_selection(arm->edbo);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+}
+
+void ARMATURE_OT_hide(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Hide Selected Bones";
+ ot->idname= "ARMATURE_OT_hide";
+ ot->description= "Tag selected bones to not be visible in Edit Mode";
+
+ /* api callbacks */
+ ot->exec= armature_hide_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected.");
+}
+
+static int armature_reveal_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *obedit= CTX_data_edit_object(C);
+ bArmature *arm= obedit->data;
+ EditBone *ebone;
+
+ for (ebone = arm->edbo->first; ebone; ebone=ebone->next) {
+ if(arm->layer & ebone->layer) {
+ if (ebone->flag & BONE_HIDDEN_A) {
+ ebone->flag |= (BONE_TIPSEL|BONE_SELECTED|BONE_ROOTSEL);
+ ebone->flag &= ~BONE_HIDDEN_A;
+ }
+ }
+ }
+ ED_armature_validate_active(arm);
+ ED_armature_sync_selection(arm->edbo);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
+ return OPERATOR_FINISHED;
+}
-void hide_selected_armature_bones(Scene *scene)
+void ARMATURE_OT_reveal(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reveal Bones";
+ ot->idname= "ARMATURE_OT_reveal";
+ ot->description= "Unhide all bones that have been tagged to be hidden in Edit Mode";
+
+ /* api callbacks */
+ ot->exec= armature_reveal_exec;
+ ot->poll= ED_operator_editarmature;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+}
+#if 0 // remove this?
+static void hide_selected_armature_bones(Scene *scene)
{
Object *obedit= scene->obedit; // XXX get from context
bArmature *arm= obedit->data;
@@ -3256,11 +3415,8 @@ void hide_selected_armature_bones(Scene *scene)
}
ED_armature_validate_active(arm);
ED_armature_sync_selection(arm->edbo);
- BIF_undo_push("Hide Bones");
}
-
-#if 0 // remove this?
static void hide_unselected_armature_bones(Scene *scene)
{
Object *obedit= scene->obedit; // XXX get from context
@@ -3279,11 +3435,8 @@ static void hide_unselected_armature_bones(Scene *scene)
ED_armature_validate_active(arm);
ED_armature_sync_selection(arm->edbo);
- BIF_undo_push("Hide Unselected Bones");
}
-#endif
-#if 0 // remove this?
void show_all_armature_bones(Scene *scene)
{
Object *obedit= scene->obedit; // XXX get from context
@@ -3300,7 +3453,6 @@ void show_all_armature_bones(Scene *scene)
}
ED_armature_validate_active(arm);
ED_armature_sync_selection(arm->edbo);
- BIF_undo_push("Reveal Bones");
}
#endif
@@ -3402,7 +3554,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
newbone->segments= 1;
newbone->layer= ebone->layer;
- BLI_strncpy (newbone->name, ebone->name, 32);
+ BLI_strncpy (newbone->name, ebone->name, sizeof(newbone->name));
if (flipbone && forked) { // only set if mirror edit
if (strlen(newbone->name)<30) {
@@ -3431,13 +3583,12 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
if (totbone==1 && first) arm->act_edbone= first;
if (totbone==0) return OPERATOR_CANCELLED;
-
- if(arm->act_edbone && (((EditBone *)arm->act_edbone)->flag & BONE_SELECTED)==0)
- arm->act_edbone= NULL;
/* Transform the endpoints */
ED_armature_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
return OPERATOR_FINISHED;
}
@@ -3446,6 +3597,7 @@ void ARMATURE_OT_extrude(wmOperatorType *ot)
/* identifiers */
ot->name= "Extrude";
ot->idname= "ARMATURE_OT_extrude";
+ ot->description= "Create new bones from the selected joints";
/* api callbacks */
ot->exec= armature_extrude_exec;
@@ -3485,7 +3637,7 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
mul_m3_m3m3(totmat, obmat, viewmat);
invert_m3_m3(imat, totmat);
- ED_armature_deselectall(obedit, 0, 0);
+ ED_armature_deselect_all(obedit, 0);
/* Create a bone */
bone= ED_armature_edit_bone_add(obedit->data, name);
@@ -3498,8 +3650,8 @@ static int armature_bone_primitive_add_exec(bContext *C, wmOperator *op)
add_v3_v3v3(bone->tail, bone->head, imat[2]); // bone with unit length 1, pointing up Z
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
-
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, obedit);
+
return OPERATOR_FINISHED;
}
@@ -3508,6 +3660,7 @@ void ARMATURE_OT_bone_primitive_add(wmOperatorType *ot)
/* identifiers */
ot->name= "Add Bone";
ot->idname= "ARMATURE_OT_bone_primitive_add";
+ ot->description= "Add a new bone located at the 3D-Cursor";
/* api callbacks */
ot->exec = armature_bone_primitive_add_exec;
@@ -3537,10 +3690,7 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
int numcuts, i;
/* there may not be a number_cuts property defined (for 'simple' subdivide) */
- if (RNA_property_is_set(op->ptr, "number_cuts"))
- numcuts= RNA_int_get(op->ptr, "number_cuts");
- else
- numcuts= 1;
+ numcuts= RNA_int_get(op->ptr, "number_cuts");
/* loop over all editable bones */
// XXX the old code did this in reverse order though!
@@ -3595,26 +3745,12 @@ static int armature_subdivide_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-
-void ARMATURE_OT_subdivide_simple(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name= "Subdivide Simple";
- ot->idname= "ARMATURE_OT_subdivide_simple";
-
- /* api callbacks */
- ot->exec = armature_subdivide_exec;
- ot->poll = ED_operator_editarmature;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
+void ARMATURE_OT_subdivide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide Multi";
- ot->idname= "ARMATURE_OT_subdivide_multi";
+ ot->idname= "ARMATURE_OT_subdivide";
+ ot->description= "Break selected bones into chains of smaller bones";
/* api callbacks */
ot->exec = armature_subdivide_exec;
@@ -3624,65 +3760,7 @@ void ARMATURE_OT_subdivide_multi(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* Properties */
- RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10);
-}
-
-
-
-static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
-
- pup= uiPupMenuBegin(C, "Subdivision Type", 0);
- layout= uiPupMenuLayout(pup);
- uiItemsEnumO(layout, "ARMATURE_OT_subdivs", "type");
- uiPupMenuEnd(C, pup);
-
- return OPERATOR_CANCELLED;
-}
-
-static int armature_subdivs_exec(bContext *C, wmOperator *op)
-{
- switch (RNA_int_get(op->ptr, "type"))
- {
- case 0: /* simple */
- RNA_int_set(op->ptr, "number_cuts", 1);
- armature_subdivide_exec(C, op);
- break;
- case 1: /* multi */
- armature_subdivide_exec(C, op);
- break;
- }
-
- return OPERATOR_FINISHED;
-}
-
-void ARMATURE_OT_subdivs(wmOperatorType *ot)
-{
- static EnumPropertyItem type_items[]= {
- {0, "SIMPLE", 0, "Simple", ""},
- {1, "MULTI", 0, "Multi", ""},
- {0, NULL, 0, NULL, NULL}};
-
- /* identifiers */
- ot->name= "subdivs";
- ot->idname= "ARMATURE_OT_subdivs";
-
- /* api callbacks */
- ot->invoke= armature_subdivs_invoke;
- ot->exec= armature_subdivs_exec;
-
- ot->poll= ED_operator_editarmature;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
- /* props */
- RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
-
- /* this is temp, the ops are different, but they are called from subdivs, so all the possible props should be here as well*/
- RNA_def_int(ot->srna, "number_cuts", 2, 1, INT_MAX, "Number of Cuts", "", 1, 10);
+ RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of Cuts", "", 1, 10);
}
/* ----------- */
@@ -3693,7 +3771,7 @@ void ARMATURE_OT_subdivs(wmOperatorType *ot)
* this to be done easily.
*/
-static int armature_switch_direction_exec(bContext *C, wmOperator *op)
+static int armature_switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
bArmature *arm= (bArmature *)ob->data;
@@ -3703,7 +3781,9 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *op)
/* get chains of bones (ends on chains) */
chains_find_tips(arm->edbo, &chains);
if (chains.first == NULL) return OPERATOR_CANCELLED;
-
+
+ armature_tag_select_mirrored(arm);
+
/* loop over chains, only considering selected and visible bones */
for (chain= chains.first; chain; chain= chain->next) {
EditBone *ebo, *child=NULL, *parent=NULL;
@@ -3759,8 +3839,10 @@ static int armature_switch_direction_exec(bContext *C, wmOperator *op)
/* free chains */
BLI_freelistN(&chains);
+ armature_tag_unselect(arm);
+
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -3770,6 +3852,7 @@ void ARMATURE_OT_switch_direction(wmOperatorType *ot)
/* identifiers */
ot->name= "Switch Direction";
ot->idname= "ARMATURE_OT_switch_direction";
+ ot->description= "Change the direction that a chain of bones points in (head <-> tail swap)";
/* api callbacks */
ot->exec = armature_switch_direction_exec;
@@ -3909,15 +3992,15 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
-static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
EditBone *actbone = CTX_data_active_bone(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", 0);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
int allchildbones = 0;
@@ -3944,6 +4027,7 @@ void ARMATURE_OT_parent_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Make Parent";
ot->idname= "ARMATURE_OT_parent_set";
+ ot->description= "Set the active bone as the parent of the selected bones";
/* api callbacks */
ot->invoke = armature_parent_set_invoke;
@@ -3987,7 +4071,7 @@ static int armature_parent_clear_exec(bContext *C, wmOperator *op)
ED_armature_sync_selection(arm->edbo);
/* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
return OPERATOR_FINISHED;
}
@@ -3997,6 +4081,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear Parent";
ot->idname= "ARMATURE_OT_parent_clear";
+ ot->description= "Remove the parent-child relationship between selected bones and their parents";
/* api callbacks */
ot->invoke = WM_menu_invoke;
@@ -4011,7 +4096,7 @@ void ARMATURE_OT_parent_clear(wmOperatorType *ot)
/* **************** Selections ******************/
-static int armature_select_inverse_exec(bContext *C, wmOperator *op)
+static int armature_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
/* Set the flags */
CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
@@ -4033,6 +4118,7 @@ void ARMATURE_OT_select_inverse(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Inverse";
ot->idname= "ARMATURE_OT_select_inverse";
+ ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
/* api callbacks */
ot->exec= armature_select_inverse_exec;
@@ -4070,7 +4156,8 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
case SEL_INVERT:
if (ebone->flag & BONE_SELECTED) {
ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- } else {
+ }
+ else {
ebone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
if(ebone->parent)
ebone->parent->flag |= (BONE_TIPSEL);
@@ -4088,10 +4175,10 @@ static int armature_de_select_all_exec(bContext *C, wmOperator *op)
void ARMATURE_OT_select_all(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select or Deselect All";
ot->idname= "ARMATURE_OT_select_all";
+ ot->description= "Toggle selection status of all bones";
/* api callbacks */
ot->exec= armature_de_select_all_exec;
@@ -4172,6 +4259,7 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Hierarchy";
ot->idname= "ARMATURE_OT_select_hierarchy";
+ ot->description= "Select immediate parent/children of selected bones";
/* api callbacks */
ot->exec= armature_select_hierarchy_exec;
@@ -4368,7 +4456,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
if (!(extend) || (base != scene->basact)) {
- ED_pose_deselectall(ob, 0, 0);
+ ED_pose_deselectall(ob, 0);
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
arm->act_bone= nearBone;
@@ -4401,7 +4489,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
if (OBACT && OBACT->mode & OB_MODE_WEIGHT_PAINT) {
if (nearBone == arm->act_bone) {
ED_vgroup_select_by_name(OBACT, nearBone->name);
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
}
}
@@ -4415,7 +4503,7 @@ int ED_do_pose_selectbuffer(Scene *scene, Base *base, unsigned int *buffer, shor
test==2: only clear active tag
test==3: swap select (no test / inverse selection status of all independently)
*/
-void ED_pose_deselectall (Object *ob, int test, int doundo)
+void ED_pose_deselectall (Object *ob, int test)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -4427,7 +4515,7 @@ void ED_pose_deselectall (Object *ob, int test, int doundo)
/* Determine if we're selecting or deselecting */
if (test==1) {
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if ((pchan->bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
if (pchan->bone->flag & BONE_SELECTED)
break;
}
@@ -4452,19 +4540,9 @@ void ED_pose_deselectall (Object *ob, int test, int doundo)
}
}
}
-
- if(arm->act_bone && (arm->act_bone->flag & BONE_SELECTED)==0)
- arm->act_bone= NULL;
-
- //countall(); // XXX need an equivalent to this...
-
- if (doundo) {
- if (selectmode==1) BIF_undo_push("Select All");
- else BIF_undo_push("Deselect All");
- }
}
-static int bone_skinnable(Object *ob, Bone *bone, void *datap)
+static int bone_skinnable_cb(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -4513,7 +4591,7 @@ static int bone_skinnable(Object *ob, Bone *bone, void *datap)
return 0;
}
-static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
+static int vgroup_add_unique_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
/* This group creates a vertex group to ob that has the
* same name as bone (provided the bone is skinnable).
@@ -4528,7 +4606,7 @@ static int ED_vgroup_add_unique_bone(Object *ob, Bone *bone, void *data)
return 0;
}
-static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
+static int dgroup_skinnable_cb(Object *ob, Bone *bone, void *datap)
{
/* Bones that are deforming
* are regarded to be "skinnable" and are eligible for
@@ -4584,7 +4662,7 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *datap)
return 0;
}
-static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void add_vgroups__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
/* DerivedMesh mapFunc for getting final coords in weight paint mode */
@@ -4603,7 +4681,8 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
/* for each vertex in the mesh */
for (i=0; i < mesh->totvert; i++) {
- iflip = (dgroupflip)? mesh_get_x_mirror_vert(ob, i): 0;
+ /*BMESH_TODO*/
+ iflip = 0; //(dgroupflip)? mesh_get_x_mirror_vert(ob, i): 0;
/* for each skinnable bone */
for (j=0; j < numbones; ++j) {
@@ -4635,7 +4714,7 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
}
}
-void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int mirror)
+static void add_verts_to_dgroups(ReportList *reports, Scene *scene, Object *ob, Object *par, int heat, int mirror)
{
/* This functions implements the automatic computation of vertex group
* weights, either through envelopes or using a heat equilibrium.
@@ -4667,7 +4746,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
looper_data.list= NULL;
/* count the number of skinnable bones */
- numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+ numbones = bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
if (numbones == 0)
return;
@@ -4676,7 +4755,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
* and fill it with all of the skinnable bones */
bonelist = MEM_callocN(numbones*sizeof(Bone *), "bonelist");
looper_data.list= bonelist;
- bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable);
+ bone_looper(ob, arm->bonebase.first, &looper_data, bone_skinnable_cb);
/* create an array of pointers to the deform groups that
* coorespond to the skinnable bones (creating them
@@ -4685,7 +4764,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
dgroupflip = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgroupflip");
looper_data.list= dgrouplist;
- bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable);
+ bone_looper(ob, arm->bonebase.first, &looper_data, dgroup_skinnable_cb);
/* create an array of root and tip positions transformed into
* global coords */
@@ -4782,14 +4861,22 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
/* compute the weights based on gathered vertices and bones */
if (heat) {
+ const char *error= NULL;
heat_bone_weighting(ob, mesh, verts, numbones, dgrouplist, dgroupflip,
- root, tip, selected);
+ root, tip, selected, &error);
+
+ if(error) {
+ BKE_report(reports, RPT_WARNING, error);
+ }
}
else {
envelope_bone_weighting(ob, mesh, verts, numbones, bonelist, dgrouplist,
dgroupflip, root, tip, selected, mat4_to_scale(par->obmat));
}
-
+
+ /* only generated in some cases but can call anyway */
+ //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 'e');
+
/* free the memory allocated */
MEM_freeN(bonelist);
MEM_freeN(dgrouplist);
@@ -4800,7 +4887,7 @@ void add_verts_to_dgroups(Scene *scene, Object *ob, Object *par, int heat, int m
MEM_freeN(verts);
}
-void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mode, int mirror)
+void create_vgroups_from_armature(ReportList *reports, Scene *scene, Object *ob, Object *par, int mode, int mirror)
{
/* Lets try to create some vertex groups
* based on the bones of the parent armature.
@@ -4811,7 +4898,7 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
/* Traverse the bone list, trying to create empty vertex
* groups cooresponding to the bone.
*/
- bone_looper(ob, arm->bonebase.first, NULL, ED_vgroup_add_unique_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, vgroup_add_unique_bone_cb);
if (ob->type == OB_MESH)
ED_vgroup_data_create(ob->data);
@@ -4821,28 +4908,162 @@ void create_vgroups_from_armature(Scene *scene, Object *ob, Object *par, int mod
* that are populated with the vertices for which the
* bone is closest.
*/
- add_verts_to_dgroups(scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
+ add_verts_to_dgroups(reports, scene, ob, par, (mode == ARM_GROUPS_AUTO), mirror);
}
}
/* ************* Clear Pose *****************************/
-static int pose_clear_scale_exec(bContext *C, wmOperator *op)
+/* clear scale of pose-channel */
+static void pchan_clear_scale(bPoseChannel *pchan)
+{
+ if ((pchan->protectflag & OB_LOCK_SCALEX)==0)
+ pchan->size[0]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_SCALEY)==0)
+ pchan->size[1]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_SCALEZ)==0)
+ pchan->size[2]= 1.0f;
+}
+
+/* clear location of pose-channel */
+static void pchan_clear_loc(bPoseChannel *pchan)
+{
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= 0.0f;
+}
+
+/* clear rotation of pose-channel */
+static void pchan_clear_rot(bPoseChannel *pchan)
+{
+ if (pchan->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
+ /* check if convert to eulers for locking... */
+ if (pchan->protectflag & OB_LOCK_ROT4D) {
+ /* perform clamping on a component by component basis */
+ if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
+ pchan->rotAngle= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->rotAxis[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->rotAxis[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->rotAxis[2]= 0.0f;
+
+ /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
+ if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
+ pchan->rotAxis[1] = 1.0f;
+ }
+ else if (pchan->rotmode == ROT_MODE_QUAT) {
+ if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
+ pchan->quat[0]= 1.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->quat[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->quat[2]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->quat[3]= 0.0f;
+ }
+ else {
+ /* the flag may have been set for the other modes, so just ignore the extra flag... */
+ if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
+ pchan->eul[0]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
+ pchan->eul[1]= 0.0f;
+ if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
+ pchan->eul[2]= 0.0f;
+ }
+ }
+ else {
+ /* perform clamping using euler form (3-components) */
+ float eul[3], oldeul[3], quat1[4] = {0};
+ float qlen = 0.0f;
+
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ qlen= normalize_qt_qt(quat1, pchan->quat);
+ quat_to_eul(oldeul, quat1);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle);
+ }
+ else {
+ copy_v3_v3(oldeul, pchan->eul);
+ }
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+
+ if (pchan->protectflag & OB_LOCK_ROTX)
+ eul[0]= oldeul[0];
+ if (pchan->protectflag & OB_LOCK_ROTY)
+ eul[1]= oldeul[1];
+ if (pchan->protectflag & OB_LOCK_ROTZ)
+ eul[2]= oldeul[2];
+
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ eul_to_quat(pchan->quat, eul);
+
+ /* restore original quat size */
+ mul_qt_fl(pchan->quat, qlen);
+
+ /* quaternions flip w sign to accumulate rotations correctly */
+ if ((quat1[0]<0.0f && pchan->quat[0]>0.0f) || (quat1[0]>0.0f && pchan->quat[0]<0.0f)) {
+ mul_qt_fl(pchan->quat, -1.0f);
+ }
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ copy_v3_v3(pchan->eul, eul);
+ }
+ }
+ } // Duplicated in source/blender/editors/object/object_transform.c
+ else {
+ if (pchan->rotmode == ROT_MODE_QUAT) {
+ unit_qt(pchan->quat);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ /* by default, make rotation of 0 radians around y-axis (roll) */
+ unit_axis_angle(pchan->rotAxis, &pchan->rotAngle);
+ }
+ else {
+ zero_v3(pchan->eul);
+ }
+ }
+}
+
+/* clear loc/rot/scale of pose-channel */
+static void pchan_clear_transforms(bPoseChannel *pchan)
+{
+ pchan_clear_loc(pchan);
+ pchan_clear_rot(pchan);
+ pchan_clear_scale(pchan);
+}
+
+/* --------------- */
+
+/* generic exec for clear-pose operators */
+static int pose_clear_transform_generic_exec(bContext *C, wmOperator *op,
+ void (*clear_func)(bPoseChannel*), const char default_ksName[])
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
-
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
short autokey = 0;
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- if ((pchan->protectflag & OB_LOCK_SCALEX)==0)
- pchan->size[0]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_SCALEY)==0)
- pchan->size[1]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_SCALEZ)==0)
- pchan->size[2]= 1.0f;
-
+ /* sanity checks */
+ if ELEM(NULL, clear_func, default_ksName) {
+ BKE_report(op->reports, RPT_ERROR, "Programming error: missing clear transform func or Keying Set Name");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* only clear relevant transforms for selected bones */
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
+ {
+ /* run provided clearing function */
+ clear_func(pchan);
+
/* do auto-keyframing as appropriate */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
/* clear any unkeyed tags */
@@ -4862,15 +5083,18 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
/* perform autokeying on the bones if needed */
if (autokey) {
+ /* get KeyingSet to use */
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, default_ksName);
+
/* insert keyframes */
ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
/* now recalculate paths */
if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
@@ -4878,14 +5102,21 @@ static int pose_clear_scale_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* --------------- */
+
+static int pose_clear_scale_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_scale, "Scaling");
+}
+
void POSE_OT_scale_clear(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Clear Pose Scale";
ot->idname= "POSE_OT_scale_clear";
+ ot->description = "Reset scaling of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
ot->exec = pose_clear_scale_exec;
ot->poll = ED_operator_posemode;
@@ -4893,57 +5124,31 @@ void POSE_OT_scale_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_clear_loc_exec(bContext *C, wmOperator *op)
+
+static int pose_clear_rot_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
-
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
- short autokey = 0;
-
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- /* clear location */
- if ((pchan->protectflag & OB_LOCK_LOCX)==0)
- pchan->loc[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_LOCY)==0)
- pchan->loc[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
- pchan->loc[2]= 0.0f;
-
- /* do auto-keyframing as appropriate */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- /* clear any unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag &= ~BONE_UNKEYED;
-
- /* tag for autokeying later */
- autokey = 1;
- }
- else {
- /* add unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag |= BONE_UNKEYED;
- }
- }
- CTX_DATA_END;
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_rot, "Rotation");
+}
+
+void POSE_OT_rot_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clear Pose Rotation";
+ ot->idname= "POSE_OT_rot_clear";
+ ot->description = "Reset rotations of selected bones to their default values";
- /* perform autokeying on the bones if needed */
- if (autokey) {
- /* insert keyframes */
- ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
-
- /* now recalculate paths */
- if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
- }
+ /* api callbacks */
+ ot->exec = pose_clear_rot_exec;
+ ot->poll = ED_operator_posemode;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
-
- return OPERATOR_FINISHED;
+
+static int pose_clear_loc_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_loc, "Location");
}
void POSE_OT_loc_clear(wmOperatorType *ot)
@@ -4951,9 +5156,9 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
/* identifiers */
ot->name= "Clear Pose Location";
ot->idname= "POSE_OT_loc_clear";
+ ot->description = "Reset locations of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
ot->exec = pose_clear_loc_exec;
ot->poll = ED_operator_posemode;
@@ -4961,162 +5166,30 @@ void POSE_OT_loc_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_clear_rot_exec(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
-
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
- short autokey = 0;
-
- /* only clear those channels that are not locked */
- CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones) {
- if (pchan->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
- /* check if convert to eulers for locking... */
- if (pchan->protectflag & OB_LOCK_ROT4D) {
- /* perform clamping on a component by component basis */
- if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
- pchan->rotAngle= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->rotAxis[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->rotAxis[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->rotAxis[2]= 0.0f;
-
- /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
- pchan->rotAxis[1] = 1.0f;
- }
- else if (pchan->rotmode == ROT_MODE_QUAT) {
- if ((pchan->protectflag & OB_LOCK_ROTW) == 0)
- pchan->quat[0]= 1.0f;
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->quat[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->quat[2]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->quat[3]= 0.0f;
- }
- else {
- /* the flag may have been set for the other modes, so just ignore the extra flag... */
- if ((pchan->protectflag & OB_LOCK_ROTX) == 0)
- pchan->eul[0]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTY) == 0)
- pchan->eul[1]= 0.0f;
- if ((pchan->protectflag & OB_LOCK_ROTZ) == 0)
- pchan->eul[2]= 0.0f;
- }
- }
- else {
- /* perform clamping using euler form (3-components) */
- float eul[3], oldeul[3], quat1[4] = {0};
-
- if (pchan->rotmode == ROT_MODE_QUAT) {
- copy_qt_qt(quat1, pchan->quat);
- quat_to_eul( oldeul,pchan->quat);
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,pchan->rotAxis, pchan->rotAngle);
- }
- else {
- copy_v3_v3(oldeul, pchan->eul);
- }
-
- eul[0]= eul[1]= eul[2]= 0.0f;
-
- if (pchan->protectflag & OB_LOCK_ROTX)
- eul[0]= oldeul[0];
- if (pchan->protectflag & OB_LOCK_ROTY)
- eul[1]= oldeul[1];
- if (pchan->protectflag & OB_LOCK_ROTZ)
- eul[2]= oldeul[2];
-
- if (pchan->rotmode == ROT_MODE_QUAT) {
- eul_to_quat( pchan->quat,eul);
- /* quaternions flip w sign to accumulate rotations correctly */
- if ((quat1[0]<0.0f && pchan->quat[0]>0.0f) || (quat1[0]>0.0f && pchan->quat[0]<0.0f)) {
- mul_qt_fl(pchan->quat, -1.0f);
- }
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- eulO_to_axis_angle( pchan->rotAxis, &pchan->rotAngle,eul, EULER_ORDER_DEFAULT);
- }
- else {
- copy_v3_v3(pchan->eul, eul);
- }
- }
- } // Duplicated in source/blender/editors/object/object_transform.c
- else {
- if (pchan->rotmode == ROT_MODE_QUAT) {
- pchan->quat[1]=pchan->quat[2]=pchan->quat[3]= 0.0f;
- pchan->quat[0]= 1.0f;
- }
- else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
- /* by default, make rotation of 0 radians around y-axis (roll) */
- pchan->rotAxis[0]=pchan->rotAxis[2]=pchan->rotAngle= 0.0f;
- pchan->rotAxis[1]= 1.0f;
- }
- else {
- pchan->eul[0]= pchan->eul[1]= pchan->eul[2]= 0.0f;
- }
- }
-
- /* do auto-keyframing as appropriate */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- /* clear any unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag &= ~BONE_UNKEYED;
-
- /* tag for autokeying later */
- autokey = 1;
- }
- else {
- /* add unkeyed tags */
- if (pchan->bone)
- pchan->bone->flag |= BONE_UNKEYED;
- }
- }
- CTX_DATA_END;
-
- /* perform autokeying on the bones if needed */
- if (autokey) {
- /* insert keyframes */
- ANIM_apply_keyingset(C, NULL, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
-
- /* now recalculate paths */
- if ((ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS))
- ED_pose_recalculate_paths(C, scene, ob);
- }
-
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
-
- return OPERATOR_FINISHED;
+static int pose_clear_transforms_exec(bContext *C, wmOperator *op)
+{
+ return pose_clear_transform_generic_exec(C, op, pchan_clear_transforms, "LocRotScale");
}
-void POSE_OT_rot_clear(wmOperatorType *ot)
+void POSE_OT_transforms_clear(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Clear Pose Rotation";
- ot->idname= "POSE_OT_rot_clear";
+ ot->name= "Clear Pose Transforms";
+ ot->idname= "POSE_OT_transforms_clear";
+ ot->description = "Reset location, rotation, and scaling of selected bones to their default values";
/* api callbacks */
- ot->invoke = WM_operator_confirm;
- ot->exec = pose_clear_rot_exec;
+ ot->exec = pose_clear_transforms_exec;
ot->poll = ED_operator_posemode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
}
/* ***************** selections ********************** */
-static int pose_select_inverse_exec(bContext *C, wmOperator *op)
+static int pose_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
/* Set the flags */
@@ -5135,10 +5208,10 @@ static int pose_select_inverse_exec(bContext *C, wmOperator *op)
void POSE_OT_select_inverse(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select Inverse";
ot->idname= "POSE_OT_select_inverse";
+ ot->description= "Flip the selection status of bones (selected -> unselected, unselected -> selected)";
/* api callbacks */
ot->exec= pose_select_inverse_exec;
@@ -5153,20 +5226,7 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
int action = RNA_enum_get(op->ptr, "action");
if (action == SEL_TOGGLE) {
- bPoseChannel *pchan= CTX_data_active_pose_bone(C);
- int num_sel = CTX_DATA_COUNT(C, selected_pose_bones);
-
- /* cases for deselect:
- * 1) there's only one bone selected, and that is the active one
- * 2) there's more than one bone selected
- */
- if ( ((num_sel == 1) && (pchan) && (pchan->bone->flag & BONE_SELECTED)) ||
- (num_sel > 1) )
- {
- action = SEL_DESELECT;
- }
- else
- action = SEL_SELECT;
+ action= CTX_DATA_COUNT(C, selected_pose_bones) ? SEL_DESELECT : SEL_SELECT;
}
/* Set the flags */
@@ -5183,7 +5243,8 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
case SEL_INVERT:
if (pchan->bone->flag & BONE_SELECTED) {
pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
- } else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
+ }
+ else if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
pchan->bone->flag |= BONE_SELECTED;
}
break;
@@ -5198,10 +5259,10 @@ static int pose_de_select_all_exec(bContext *C, wmOperator *op)
void POSE_OT_select_all(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Select or Deselect All";
ot->idname= "POSE_OT_select_all";
+ ot->description= "Toggle selection status of all bones";
/* api callbacks */
ot->exec= pose_de_select_all_exec;
@@ -5213,9 +5274,9 @@ void POSE_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-static int pose_select_parent_exec(bContext *C, wmOperator *op)
+static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *pchan,*parent;
/* Determine if there is an active bone */
@@ -5243,8 +5304,9 @@ static int pose_select_parent_exec(bContext *C, wmOperator *op)
void POSE_OT_select_parent(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select parent bone";
+ ot->name= "Select Parent Bone";
ot->idname= "POSE_OT_select_parent";
+ ot->description= "Select bones that are parents of the currently selected bones";
/* api callbacks */
ot->exec= pose_select_parent_exec;
@@ -5257,7 +5319,7 @@ void POSE_OT_select_parent(wmOperatorType *ot)
/* ************* hide/unhide pose bones ******************* */
-static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int hide_selected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5272,7 +5334,7 @@ static int hide_selected_pose_bone(Object *ob, Bone *bone, void *ptr)
return 0;
}
-static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int hide_unselected_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5290,15 +5352,13 @@ static int hide_unselected_pose_bone(Object *ob, Bone *bone, void *ptr)
/* active object is armature in posemode, poll checked */
static int pose_hide_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
if(RNA_boolean_get(op->ptr, "unselected"))
- bone_looper(ob, arm->bonebase.first, NULL,
- hide_unselected_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_unselected_pose_bone_cb);
else
- bone_looper(ob, arm->bonebase.first, NULL,
- hide_selected_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, hide_selected_pose_bone_cb);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5311,6 +5371,7 @@ void POSE_OT_hide(wmOperatorType *ot)
/* identifiers */
ot->name= "Hide Selected";
ot->idname= "POSE_OT_hide";
+ ot->description= "Tag selected bones to not be visible in Pose Mode";
/* api callbacks */
ot->exec= pose_hide_exec;
@@ -5323,7 +5384,7 @@ void POSE_OT_hide(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "");
}
-static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
+static int show_pose_bone_cb(Object *ob, Bone *bone, void *UNUSED(ptr))
{
bArmature *arm= ob->data;
@@ -5338,12 +5399,12 @@ static int show_pose_bone(Object *ob, Bone *bone, void *ptr)
}
/* active object is armature in posemode, poll checked */
-static int pose_reveal_exec(bContext *C, wmOperator *op)
+static int pose_reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
- bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone);
+ bone_looper(ob, arm->bonebase.first, NULL, show_pose_bone_cb);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
@@ -5356,6 +5417,7 @@ void POSE_OT_reveal(wmOperatorType *ot)
/* identifiers */
ot->name= "Reveal Selected";
ot->idname= "POSE_OT_reveal";
+ ot->description= "Unhide all bones that have been tagged to be hidden in Pose Mode";
/* api callbacks */
ot->exec= pose_reveal_exec;
@@ -5367,34 +5429,16 @@ void POSE_OT_reveal(wmOperatorType *ot)
/* ************* RENAMING DISASTERS ************ */
-/* note: there's a unique_editbone_name() too! */
-void unique_bone_name (bArmature *arm, char *name)
+static int bone_unique_check(void *arg, const char *name)
{
- char tempname[64];
- int number;
- char *dot;
-
- if (get_named_bone(arm, name)) {
-
- /* Strip off the suffix, if it's a number */
- number= strlen(name);
- if(number && isdigit(name[number-1])) {
- dot= strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
-
- for (number = 1; number <=999; number++) {
- sprintf (tempname, "%s.%03d", name, number);
- if (!get_named_bone(arm, tempname)) {
- BLI_strncpy (name, tempname, 32);
- return;
- }
- }
- }
+ return get_named_bone((bArmature *)arg, name) != NULL;
+}
+
+static void unique_bone_name(bArmature *arm, char *name)
+{
+ BLI_uniquename_cb(bone_unique_check, (void *)arm, "Bone", '.', name, sizeof(((Bone *)NULL)->name));
}
-#define MAXBONENAME 32
/* helper call for armature_bone_rename */
static void constraint_bone_name_fix(Object *ob, ListBase *conlist, char *oldname, char *newname)
{
@@ -5535,7 +5579,7 @@ void ED_armature_bone_rename(bArmature *arm, char *oldnamep, char *newnamep)
}
-static int armature_flip_names_exec (bContext *C, wmOperator *op)
+static int armature_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
bArmature *arm;
@@ -5555,7 +5599,7 @@ static int armature_flip_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -5568,7 +5612,7 @@ void ARMATURE_OT_flip_names (wmOperatorType *ot)
/* identifiers */
ot->name= "Flip Names";
ot->idname= "ARMATURE_OT_flip_names";
- ot->description= "Flips (and corrects) the names of selected bones";
+ ot->description= "Flips (and corrects) the axis suffixes of the names of selected bones";
/* api callbacks */
ot->exec= armature_flip_names_exec;
@@ -5601,7 +5645,7 @@ static int armature_autoside_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -5657,11 +5701,12 @@ void transform_armature_mirror_update(Object *obedit)
eboflip->tail[1]= ebo->tail[1];
eboflip->tail[2]= ebo->tail[2];
eboflip->rad_tail= ebo->rad_tail;
+ eboflip->roll= -ebo->roll;
/* Also move connected children, in case children's name aren't mirrored properly */
for (children=arm->edbo->first; children; children=children->next) {
if (children->parent == eboflip && children->flag & BONE_CONNECTED) {
- VECCOPY(children->head, eboflip->tail);
+ copy_v3_v3(children->head, eboflip->tail);
children->rad_head = ebo->rad_tail;
}
}
@@ -5671,12 +5716,13 @@ void transform_armature_mirror_update(Object *obedit)
eboflip->head[1]= ebo->head[1];
eboflip->head[2]= ebo->head[2];
eboflip->rad_head= ebo->rad_head;
+ eboflip->roll= -ebo->roll;
/* Also move connected parent, in case parent's name isn't mirrored properly */
if (eboflip->parent && eboflip->flag & BONE_CONNECTED)
{
EditBone *parent = eboflip->parent;
- VECCOPY(parent->tail, eboflip->head);
+ copy_v3_v3(parent->tail, eboflip->head);
parent->rad_tail = ebo->rad_head;
}
}
@@ -5717,7 +5763,7 @@ EditBone * subdivideByAngle(Scene *scene, Object *obedit, ReebArc *arc, ReebNode
parent = ED_armature_edit_bone_add(arm, "Bone");
parent->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
- VECCOPY(parent->head, head->p);
+ copy_v3_v3(parent->head, head->p);
root = parent;
@@ -5742,17 +5788,17 @@ EditBone * subdivideByAngle(Scene *scene, Object *obedit, ReebArc *arc, ReebNode
if (len1 > 0.0f && len2 > 0.0f && dot_v3v3(vec1, vec2) < angleLimit)
{
- VECCOPY(parent->tail, previous);
+ copy_v3_v3(parent->tail, previous);
child = ED_armature_edit_bone_add(arm, "Bone");
- VECCOPY(child->head, parent->tail);
+ copy_v3_v3(child->head, parent->tail);
child->parent = parent;
child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
parent = child; /* new child is next parent */
}
}
- VECCOPY(parent->tail, tail->p);
+ copy_v3_v3(parent->tail, tail->p);
/* If the bone wasn't subdivided, delete it and return NULL
* to let subsequent subdivision methods do their thing.
@@ -5776,13 +5822,8 @@ EditBone * test_subdivideByCorrelation(Scene *scene, Object *obedit, ReebArc *ar
if (scene->toolsettings->skgen_options & SKGEN_CUT_CORRELATION)
{
- float invmat[4][4] = { {1, 0, 0, 0},
- {0, 1, 0, 0},
- {0, 0, 1, 0},
- {0, 0, 0, 1}};
- float tmat[3][3] = { {1, 0, 0},
- {0, 1, 0},
- {0, 0, 1}};
+ float invmat[4][4]= MAT4_UNITY;
+ float tmat[3][3]= MAT3_UNITY;
ReebArcIterator arc_iter;
BArcIterator *iter = (BArcIterator*)&arc_iter;
bArmature *arm= obedit->data;
@@ -5828,13 +5869,8 @@ EditBone * test_subdivideByLength(Scene *scene, Object *obedit, ReebArc *arc, Re
if ((scene->toolsettings->skgen_options & SKGEN_CUT_LENGTH) &&
arcLengthRatio(arc) >= G.scene->toolsettings->skgen_length_ratio)
{
- float invmat[4][4] = { {1, 0, 0, 0},
- {0, 1, 0, 0},
- {0, 0, 1, 0},
- {0, 0, 0, 1}};
- float tmat[3][3] = { {1, 0, 0},
- {0, 1, 0},
- {0, 0, 1}};
+ float invmat[4][4]= MAT4_UNITY;
+ float tmat[3][3]= MAT3_UNITY;
ReebArcIterator arc_iter;
BArcIterator *iter = (BArcIterator*)&arc_iter;
bArmature *arm= obedit->data;
@@ -5871,7 +5907,7 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
obedit= scene->basact->object;
/* Copy orientation from source */
- VECCOPY(dst->loc, src->obmat[3]);
+ copy_v3_v3(dst->loc, src->obmat[3]);
mat4_to_eul( dst->rot,src->obmat);
mat4_to_size( dst->size,src->obmat);
@@ -5953,8 +5989,8 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
bone = ED_armature_edit_bone_add(obedit->data, "Bone");
bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
- VECCOPY(bone->head, head->p);
- VECCOPY(bone->tail, tail->p);
+ copy_v3_v3(bone->head, head->p);
+ copy_v3_v3(bone->tail, tail->p);
/* set first and last bone, since there's only one */
lastBone = bone;
@@ -6018,8 +6054,6 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
}
BLI_ghash_free(arcBoneMap, NULL, NULL);
-
- BIF_undo_push("Generate Skeleton");
}
void generateSkeleton(Scene *scene)
diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c
index 1c9024f6f91..dfab2db5307 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,29 +39,24 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_graph.h"
+#include "BLI_utildefines.h"
-#include "BKE_utildefines.h"
+
#include "ED_armature.h"
#include "armature_intern.h"
#include "BIF_generate.h"
-void setBoneRollFromNormal(EditBone *bone, float *no, float invmat[][4], float tmat[][3])
+void setBoneRollFromNormal(EditBone *bone, float *no, float UNUSED(invmat[][4]), float tmat[][3])
{
if (no != NULL && !is_zero_v3(no))
{
- float tangent[3], vec[3], normal[3];
+ float normal[3];
- VECCOPY(normal, no);
+ copy_v3_v3(normal, no);
mul_m3_v3(tmat, normal);
-
- sub_v3_v3v3(tangent, bone->tail, bone->head);
- project_v3_v3v3(vec, tangent, normal);
- sub_v3_v3(normal, vec);
-
- normalize_v3(normal);
- bone->roll = ED_rollBoneToVector(bone, normal);
+ bone->roll = ED_rollBoneToVector(bone, normal, FALSE);
}
}
@@ -118,7 +113,7 @@ float calcArcCorrelation(BArcIterator *iter, int start, int end, float v0[3], fl
}
}
-int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int start, int end, float head[3], float p[3])
+int nextFixedSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int start, int end, float UNUSED(head[3]), float p[3])
{
static float stroke_length = 0;
static float current_length;
@@ -277,7 +272,7 @@ int nextLengthSubdivision(ToolSettings *toolsettings, BArcIterator *iter, int st
return -1;
}
-EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *editbones, BArcIterator *iter, float invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
+EditBone * subdivideArcBy(ToolSettings *toolsettings, bArmature *arm, ListBase *UNUSED(editbones), BArcIterator *iter, float invmat[][4], float tmat[][3], NextSubdivisionFunc next_subdividion)
{
EditBone *lastBone = NULL;
EditBone *child = NULL;
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index 637c6076314..86df851424c 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_graph.h"
#include "BLI_rand.h"
@@ -97,7 +98,7 @@ typedef enum
ARC_USED = 2
} ArcUsageFlags;
-RigGraph *GLOBAL_RIGG = NULL;
+static RigGraph *GLOBAL_RIGG = NULL;
/*******************************************************************************************************/
@@ -111,7 +112,7 @@ float rollBoneByQuat(EditBone *bone, float old_up_axis[3], float qrot[4]);
/*********************************** EDITBONE UTILS ****************************************************/
-int countEditBoneChildren(ListBase *list, EditBone *parent)
+static int countEditBoneChildren(ListBase *list, EditBone *parent)
{
EditBone *ebone;
int count = 0;
@@ -127,7 +128,7 @@ int countEditBoneChildren(ListBase *list, EditBone *parent)
return count;
}
-EditBone* nextEditBoneChild(ListBase *list, EditBone *parent, int n)
+static EditBone* nextEditBoneChild(ListBase *list, EditBone *parent, int n)
{
EditBone *ebone;
@@ -146,7 +147,7 @@ EditBone* nextEditBoneChild(ListBase *list, EditBone *parent, int n)
return NULL;
}
-void getEditBoneRollUpAxis(EditBone *bone, float roll, float up_axis[3])
+static void getEditBoneRollUpAxis(EditBone *bone, float roll, float up_axis[3])
{
float mat[3][3], nor[3];
@@ -156,7 +157,7 @@ void getEditBoneRollUpAxis(EditBone *bone, float roll, float up_axis[3])
VECCOPY(up_axis, mat[2]);
}
-float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4], float qroll[4], float aligned_axis[3])
+static float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4], float qroll[4], float aligned_axis[3])
{
float nor[3], new_up_axis[3], x_axis[3], z_axis[3];
@@ -185,16 +186,16 @@ float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4],
if (angle_normalized_v3v3(x_axis, new_up_axis) < angle_normalized_v3v3(z_axis, new_up_axis))
{
rotation_between_vecs_to_quat(qroll, new_up_axis, x_axis); /* set roll rotation quat */
- return ED_rollBoneToVector(bone, x_axis);
+ return ED_rollBoneToVector(bone, x_axis, FALSE);
}
else
{
rotation_between_vecs_to_quat(qroll, new_up_axis, z_axis); /* set roll rotation quat */
- return ED_rollBoneToVector(bone, z_axis);
+ return ED_rollBoneToVector(bone, z_axis, FALSE);
}
}
-float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float qroll[4], float up_axis[3])
+static float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float qroll[4], float up_axis[3])
{
if (previous == NULL)
{
@@ -240,7 +241,7 @@ float rollBoneByQuatJoint(RigEdge *edge, RigEdge *previous, float qrot[4], float
/* real qroll between normal and up_axis */
rotation_between_vecs_to_quat(qroll, new_up_axis, normal);
- return ED_rollBoneToVector(edge->bone, normal);
+ return ED_rollBoneToVector(edge->bone, normal, FALSE);
}
}
@@ -251,14 +252,12 @@ float rollBoneByQuat(EditBone *bone, float old_up_axis[3], float qrot[4])
VECCOPY(new_up_axis, old_up_axis);
mul_qt_v3(qrot, new_up_axis);
- normalize_v3(new_up_axis);
-
- return ED_rollBoneToVector(bone, new_up_axis);
+ return ED_rollBoneToVector(bone, new_up_axis, FALSE);
}
/************************************ DESTRUCTORS ******************************************************/
-void RIG_freeRigArc(BArc *arc)
+static void RIG_freeRigArc(BArc *arc)
{
BLI_freelistN(&((RigArc*)arc)->edges);
}
@@ -306,7 +305,7 @@ void RIG_freeRigGraph(BGraph *rg)
/************************************* ALLOCATORS ******************************************************/
-static RigGraph *newRigGraph()
+static RigGraph *newRigGraph(void)
{
RigGraph *rg;
int totthread;
@@ -374,7 +373,7 @@ static RigNode *newRigNodeHead(RigGraph *rg, RigArc *arc, float p[3])
return node;
}
-static void addRigNodeHead(RigGraph *rg, RigArc *arc, RigNode *node)
+static void addRigNodeHead(RigGraph *UNUSED(rg), RigArc *arc, RigNode *node)
{
node->degree++;
@@ -1415,9 +1414,9 @@ static void RIG_findHead(RigGraph *rg)
/*******************************************************************************************************/
-void RIG_printNode(RigNode *node, char name[])
+static void RIG_printNode(RigNode *node, const char name[])
{
- printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, node, node->degree, node->p[0], node->p[1], node->p[2]);
+ printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, (void *)node, node->degree, node->p[0], node->p[1], node->p[2]);
if (node->symmetry_flag & SYM_TOPOLOGICAL)
{
@@ -1430,7 +1429,7 @@ void RIG_printNode(RigNode *node, char name[])
}
}
-void RIG_printArcBones(RigArc *arc)
+static void RIG_printArcBones(RigArc *arc)
{
RigEdge *edge;
@@ -1444,7 +1443,7 @@ void RIG_printArcBones(RigArc *arc)
printf("\n");
}
-void RIG_printCtrl(RigControl *ctrl, char *indent)
+static void RIG_printCtrl(RigControl *ctrl, char *indent)
{
char text[128];
@@ -1457,7 +1456,7 @@ void RIG_printCtrl(RigControl *ctrl, char *indent)
printf("%sFlag: %i\n", indent, ctrl->flag);
}
-void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
+static void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
{
RigControl *ctrl;
char indent[64];
@@ -1481,7 +1480,7 @@ void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
}
}
-void RIG_printArc(RigGraph *rg, RigArc *arc)
+static void RIG_printArc(RigGraph *rg, RigArc *arc)
{
RigEdge *edge;
@@ -1503,7 +1502,7 @@ void RIG_printArc(RigGraph *rg, RigArc *arc)
RIG_printNode((RigNode*)arc->tail, "tail");
}
-void RIG_printGraph(RigGraph *rg)
+static void RIG_printGraph(RigGraph *rg)
{
RigArc *arc;
@@ -1537,8 +1536,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm)
if (obedit == ob)
{
- bArmature *arm = obedit->data;
- rg->editbones = arm->edbo;
+ rg->editbones = ((bArmature *)obedit->data)->edbo;
}
else
{
@@ -1579,7 +1577,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm)
return rg;
}
-RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm)
+static RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm)
{
Object *obedit = CTX_data_edit_object(C);
Scene *scene = CTX_data_scene(C);
@@ -1637,7 +1635,7 @@ static EditBone *add_editbonetolist(char *name, ListBase *list)
{
EditBone *bone= MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy(bone->name, name, 32);
+ BLI_strncpy(bone->name, name, sizeof(bone->name));
unique_editbone_name(list, bone->name, NULL);
BLI_addtail(list, bone);
@@ -1658,7 +1656,8 @@ static EditBone *add_editbonetolist(char *name, ListBase *list)
}
#endif
-void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level_limit)
+#if 0 /* UNUSED */
+static void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level_limit)
{
while (node->multi_level > multi_level_limit && node->link_up)
{
@@ -1691,9 +1690,9 @@ void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level
}
}
-void generateMissingArcs(RigGraph *rigg)
+static void generateMissingArcs(RigGraph *rigg)
{
- ReebGraph *reebg = rigg->link_mesh;
+ ReebGraph *reebg;
int multi_level_limit = 5;
for (reebg = rigg->link_mesh; reebg; reebg = reebg->link_up)
@@ -1710,6 +1709,7 @@ void generateMissingArcs(RigGraph *rigg)
}
}
}
+#endif
/************************************ RETARGETTING *****************************************************/
@@ -1784,7 +1784,7 @@ static void repositionTailControl(RigGraph *rigg, RigControl *ctrl)
finalizeControl(rigg, ctrl, 1); /* resize will be recalculated anyway so we don't need it */
}
-static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], float tail[3], float qrot[4], float resize)
+static void repositionControl(RigGraph *rigg, RigControl *ctrl, float head[3], float UNUSED(tail[3]), float qrot[4], float resize)
{
float parent_offset[3], tail_offset[3];
@@ -1925,8 +1925,6 @@ static RetargetMode detectArcRetargetMode(RigArc *iarc)
mode = RETARGET_LENGTH;
}
- mode = RETARGET_AGGRESSIVE;
-
return mode;
}
@@ -2051,7 +2049,7 @@ static float calcCostLengthDistance(BArcIterator *iter, float **vec_cache, RigEd
}
#endif
-static float calcCostAngleLengthDistance(BArcIterator *iter, float **vec_cache, RigEdge *edge, float *vec0, float *vec1, float *vec2, int i1, int i2, float angle_weight, float length_weight, float distance_weight)
+static float calcCostAngleLengthDistance(BArcIterator *iter, float **UNUSED(vec_cache), RigEdge *edge, float *vec0, float *vec1, float *vec2, int i1, int i2, float angle_weight, float length_weight, float distance_weight)
{
float vec_second[3], vec_first[3];
float length2;
@@ -2734,8 +2732,6 @@ static void retargetGraphs(bContext *C, RigGraph *rigg)
BIF_flagMultiArcs(reebg, ARC_FREE);
/* return to first level */
- reebg = rigg->link_mesh;
-
inode = rigg->head;
matchMultiResolutionStartingNode(rigg, reebg, inode);
@@ -2751,7 +2747,7 @@ static void retargetGraphs(bContext *C, RigGraph *rigg)
ED_armature_from_edit(rigg->ob);
}
-char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index)
+const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index)
{
RigArc *arc = BLI_findlink(&rg->arcs, arc_index);
RigEdge *iedge;
@@ -2796,7 +2792,7 @@ int RIG_nbJoints(RigGraph *rg)
return total;
}
-void BIF_freeRetarget()
+static void BIF_freeRetarget(void)
{
if (GLOBAL_RIGG)
{
@@ -2891,7 +2887,6 @@ void BIF_retargetArc(bContext *C, ReebArc *earc, RigGraph *template_rigg)
Object *ob;
RigGraph *rigg;
RigArc *iarc;
- bArmature *arm;
char *side_string = scene->toolsettings->skgen_side_string;
char *num_string = scene->toolsettings->skgen_num_string;
int free_template = 0;
@@ -2899,14 +2894,12 @@ void BIF_retargetArc(bContext *C, ReebArc *earc, RigGraph *template_rigg)
if (template_rigg)
{
ob = template_rigg->ob;
- arm = ob->data;
}
else
{
free_template = 1;
- ob = obedit;
- arm = ob->data;
- template_rigg = armatureSelectedToGraph(C, ob, arm);
+ ob = obedit;
+ template_rigg = armatureSelectedToGraph(C, ob, ob->data);
}
if (template_rigg->arcs.first == NULL)
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index 241301b8ee1..c11263810cb 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_graph.h"
#include "BLI_ghash.h"
@@ -75,9 +76,12 @@ typedef struct SK_GestureAction {
GestureApplyFct apply;
} SK_GestureAction;
-SK_Point boneSnap;
-int LAST_SNAP_POINT_VALID = 0;
-float LAST_SNAP_POINT[3];
+#if 0 /* UNUSED 2.5 */
+static SK_Point boneSnap;
+#endif
+
+static int LAST_SNAP_POINT_VALID = 0;
+static float LAST_SNAP_POINT[3];
typedef struct SK_StrokeIterator {
@@ -105,10 +109,6 @@ typedef struct SK_StrokeIterator {
void initStrokeIterator(BArcIterator *iter, SK_Stroke *stk, int start, int end);
-void sk_deleteSelectedStrokes(SK_Sketch *sketch);
-
-SK_Point *sk_lastStrokePoint(SK_Stroke *stk);
-
int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch);
@@ -132,7 +132,7 @@ int sk_hasOverdraw(SK_Sketch *sketch, SK_Stroke *stk);
/******************** GESTURE ACTIONS ******************************/
-SK_GestureAction GESTURE_ACTIONS[] =
+static SK_GestureAction GESTURE_ACTIONS[] =
{
{"Cut", sk_detectCutGesture, sk_applyCutGesture},
{"Trim", sk_detectTrimGesture, sk_applyTrimGesture},
@@ -146,10 +146,10 @@ SK_GestureAction GESTURE_ACTIONS[] =
/******************** TEMPLATES UTILS *************************/
-char *TEMPLATES_MENU = NULL;
-int TEMPLATES_CURRENT = 0;
-GHash *TEMPLATES_HASH = NULL;
-RigGraph *TEMPLATE_RIGG = NULL;
+static char *TEMPLATES_MENU = NULL;
+static int TEMPLATES_CURRENT = 0;
+static GHash *TEMPLATES_HASH = NULL;
+static RigGraph *TEMPLATE_RIGG = NULL;
void BIF_makeListTemplates(const bContext *C)
{
@@ -184,7 +184,7 @@ void BIF_makeListTemplates(const bContext *C)
}
}
-char *BIF_listTemplates(const bContext *C)
+char *BIF_listTemplates(const bContext *UNUSED(C))
{
GHashIterator ghi;
char menu_header[] = "Template%t|None%x0|";
@@ -243,7 +243,7 @@ int BIF_currentTemplate(const bContext *C)
return TEMPLATES_CURRENT;
}
-RigGraph* sk_makeTemplateGraph(const bContext *C, Object *ob)
+static RigGraph* sk_makeTemplateGraph(const bContext *C, Object *ob)
{
Object *obedit = CTX_data_edit_object(C);
if (ob == obedit)
@@ -287,7 +287,7 @@ int BIF_nbJointsTemplate(const bContext *C)
}
}
-char * BIF_nameBoneTemplate(const bContext *C)
+const char * BIF_nameBoneTemplate(const bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
SK_Sketch *stk = contextSketch(C, 1);
@@ -309,7 +309,7 @@ char * BIF_nameBoneTemplate(const bContext *C)
return RIG_nameBone(rg, 0, index);
}
-void BIF_freeTemplates(bContext *C)
+void BIF_freeTemplates(bContext *UNUSED(C))
{
if (TEMPLATES_MENU != NULL)
{
@@ -351,7 +351,7 @@ void BIF_setTemplate(bContext *C, int index)
/*********************** CONVERSION ***************************/
-void sk_autoname(bContext *C, ReebArc *arc)
+static void sk_autoname(bContext *C, ReebArc *arc)
{
ToolSettings *ts = CTX_data_tool_settings(C);
if (ts->skgen_retarget_options & SK_RETARGET_AUTONAME)
@@ -399,7 +399,7 @@ void sk_autoname(bContext *C, ReebArc *arc)
}
}
-ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3])
+static ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3])
{
ReebNode *node;
@@ -413,7 +413,7 @@ ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3])
return node;
}
-ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
+static ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
{
ReebArc *arc;
int i;
@@ -437,7 +437,7 @@ ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3])
return arc;
}
-void sk_retargetStroke(bContext *C, SK_Stroke *stk)
+static void sk_retargetStroke(bContext *C, SK_Stroke *stk)
{
ToolSettings *ts = CTX_data_tool_settings(C);
Object *obedit = CTX_data_edit_object(C);
@@ -468,7 +468,7 @@ void sk_retargetStroke(bContext *C, SK_Stroke *stk)
/**************************************************************/
-void sk_cancelStroke(SK_Sketch *sketch)
+static void sk_cancelStroke(SK_Sketch *sketch)
{
if (sketch->active_stroke != NULL)
{
@@ -478,18 +478,18 @@ void sk_cancelStroke(SK_Sketch *sketch)
}
-float sk_clampPointSize(SK_Point *pt, float size)
+static float sk_clampPointSize(SK_Point *pt, float size)
{
return MAX2(size * pt->size, size / 2);
}
-void sk_drawPoint(GLUquadric *quad, SK_Point *pt, float size)
+static void sk_drawPoint(GLUquadric *quad, SK_Point *pt, float size)
{
glTranslatef(pt->p[0], pt->p[1], pt->p[2]);
gluSphere(quad, sk_clampPointSize(pt, size), 8, 8);
}
-void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size)
+static void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size)
{
float vec1[3], vec2[3] = {0, 0, 1}, axis[3];
float angle, length;
@@ -510,7 +510,7 @@ void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size)
gluCylinder(quad, sk_clampPointSize(pt1, size), sk_clampPointSize(pt0, size), length, 8, 8);
}
-void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height)
+static void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height)
{
float vec2[3] = {0, 0, 1}, axis[3];
float angle;
@@ -534,7 +534,7 @@ void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height)
glPopMatrix();
}
-void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end)
+static void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end)
{
float rgb[3];
int i;
@@ -610,7 +610,7 @@ void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end)
gluDeleteQuadric(quad);
}
-void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, NextSubdivisionFunc next_subdividion)
+static void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, NextSubdivisionFunc next_subdividion)
{
SK_Stroke *stk = ((SK_StrokeIterator*)iter)->stroke;
float head[3], tail[3];
@@ -646,7 +646,7 @@ void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, Next
gluDeleteQuadric(quad);
}
-void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
+static void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
{
int head_index = -1;
int i;
@@ -697,7 +697,7 @@ void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk)
}
}
-SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *dist, int *index, int all_pts)
+static SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *dist, int *index, int all_pts)
{
ARegion *ar = CTX_wm_region(C);
SK_Point *pt = NULL;
@@ -730,7 +730,8 @@ SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *di
return pt;
}
-SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short mval[2], int *dist)
+#if 0 /* UNUSED 2.5 */
+static SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short mval[2], int *dist)
{
ARegion *ar = CTX_wm_region(C);
SK_Point *pt = NULL;
@@ -777,6 +778,7 @@ SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short
return pt;
}
+#endif
void sk_resetOverdraw(SK_Sketch *sketch)
{
@@ -794,7 +796,7 @@ int sk_hasOverdraw(SK_Sketch *sketch, SK_Stroke *stk)
(sketch->over.start != -1 || sketch->over.end != -1);
}
-void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+static void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
if (sketch->over.target == NULL)
{
@@ -871,7 +873,7 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
}
/* return 1 on reverse needed */
-int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end)
+static int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end)
{
int retval = 0;
@@ -899,7 +901,7 @@ int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end)
return retval;
}
-void sk_endOverdraw(SK_Sketch *sketch)
+static void sk_endOverdraw(SK_Sketch *sketch)
{
SK_Stroke *stk = sketch->active_stroke;
@@ -928,7 +930,7 @@ void sk_endOverdraw(SK_Sketch *sketch)
}
-void sk_startStroke(SK_Sketch *sketch)
+static void sk_startStroke(SK_Sketch *sketch)
{
SK_Stroke *stk = sk_createStroke();
@@ -938,7 +940,7 @@ void sk_startStroke(SK_Sketch *sketch)
sk_resetOverdraw(sketch);
}
-void sk_endStroke(bContext *C, SK_Sketch *sketch)
+static void sk_endStroke(bContext *C, SK_Sketch *sketch)
{
ToolSettings *ts = CTX_data_tool_settings(C);
sk_shrinkStrokeBuffer(sketch->active_stroke);
@@ -951,7 +953,7 @@ void sk_endStroke(bContext *C, SK_Sketch *sketch)
sketch->active_stroke = NULL;
}
-void sk_updateDrawData(SK_DrawData *dd)
+static void sk_updateDrawData(SK_DrawData *dd)
{
dd->type = PT_CONTINUOUS;
@@ -959,7 +961,7 @@ void sk_updateDrawData(SK_DrawData *dd)
dd->previous_mval[1] = dd->mval[1];
}
-float sk_distanceDepth(bContext *C, float p1[3], float p2[3])
+static float sk_distanceDepth(bContext *C, float p1[3], float p2[3])
{
ARegion *ar = CTX_wm_region(C);
RegionView3D *rv3d = ar->regiondata;
@@ -980,7 +982,7 @@ float sk_distanceDepth(bContext *C, float p1[3], float p2[3])
return distance;
}
-void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float length, float distance)
+static void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float length, float distance)
{
ARegion *ar = CTX_wm_region(C);
ScrArea *sa = CTX_wm_area(C);
@@ -1007,7 +1009,7 @@ void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float
}
}
-void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData *dd)
+static void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData *dd)
{
ARegion *ar = CTX_wm_region(C);
/* copied from grease pencil, need fixing */
@@ -1029,7 +1031,7 @@ void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData
sub_v3_v3v3(vec, fp, dvec);
}
-int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+static int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *UNUSED(sketch), SK_Stroke *stk, SK_DrawData *dd)
{
pt->type = dd->type;
pt->mode = PT_PROJECT;
@@ -1038,7 +1040,7 @@ int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
return 1;
}
-int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+static int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
ARegion *ar = CTX_wm_region(C);
RegionView3D *rv3d = ar->regiondata;
@@ -1053,7 +1055,7 @@ int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_Dra
return 1;
}
-int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+static int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
ToolSettings *ts = CTX_data_tool_settings(C);
int point_added = 0;
@@ -1209,7 +1211,7 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok
return point_added;
}
-int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
+static int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd)
{
int point_added;
ARegion *ar = CTX_wm_region(C);
@@ -1260,7 +1262,7 @@ int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_Dra
return point_added;
}
-void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
+static void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
{
ToolSettings *ts = CTX_data_tool_settings(C);
int point_added = 0;
@@ -1281,7 +1283,7 @@ void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa
}
}
-void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
+static void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
{
int point_added = 0;
@@ -1469,7 +1471,7 @@ static int iteratorStopped(void *arg)
}
}
-void sk_convertStroke(bContext *C, SK_Stroke *stk)
+static void sk_convertStroke(bContext *C, SK_Stroke *stk)
{
Object *obedit = CTX_data_edit_object(C);
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -1561,7 +1563,7 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk)
}
}
-void sk_convert(bContext *C, SK_Sketch *sketch)
+static void sk_convert(bContext *C, SK_Sketch *sketch)
{
ToolSettings *ts = CTX_data_tool_settings(C);
SK_Stroke *stk;
@@ -1587,7 +1589,7 @@ void sk_convert(bContext *C, SK_Sketch *sketch)
/* returns the number of self intersections */
-int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture)
+static int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture)
{
ARegion *ar = CTX_wm_region(C);
int added = 0;
@@ -1636,7 +1638,7 @@ int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture)
return added;
}
-int cmpIntersections(void *i1, void *i2)
+static int cmpIntersections(void *i1, void *i2)
{
SK_Intersection *isect1 = i1, *isect2 = i2;
@@ -1668,7 +1670,7 @@ int cmpIntersections(void *i1, void *i2)
/* returns the maximum number of intersections per stroke */
-int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Stroke *gesture)
+static int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Stroke *gesture)
{
ARegion *ar = CTX_wm_region(C);
ScrArea *sa = CTX_wm_area(C);
@@ -1738,7 +1740,7 @@ int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Strok
return added;
}
-int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
+static int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
{
SK_StrokeIterator sk_iter;
BArcIterator *iter = (BArcIterator*)&sk_iter;
@@ -1773,7 +1775,7 @@ int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture)
return segments->nb_points - 1;
}
-int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectCutGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 1 && gest->nb_intersections == 1)
{
@@ -1783,7 +1785,7 @@ int sk_detectCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyCutGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -1800,7 +1802,7 @@ void sk_applyCutGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 2 && gest->nb_intersections == 1 && gest->nb_self_intersections == 0)
{
@@ -1821,7 +1823,7 @@ int sk_detectTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyTrimGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
float trim_dir[3];
@@ -1856,7 +1858,7 @@ void sk_applyTrimGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectCommandGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 1)
{
@@ -1883,7 +1885,7 @@ int sk_detectCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyCommandGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
int command = 1;
@@ -1918,7 +1920,7 @@ void sk_applyCommandGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectDeleteGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 2 && gest->nb_intersections == 2)
{
@@ -1939,7 +1941,7 @@ int sk_detectDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyDeleteGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *sketch)
{
SK_Intersection *isect;
@@ -1955,7 +1957,7 @@ void sk_applyDeleteGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
ARegion *ar = CTX_wm_region(C);
if (gest->nb_segments > 2 && gest->nb_intersections == 2)
@@ -2003,7 +2005,7 @@ int sk_detectMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyMergeGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -2034,7 +2036,7 @@ void sk_applyMergeGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectReverseGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments > 2 && gest->nb_intersections == 2 && gest->nb_self_intersections == 0)
{
@@ -2076,7 +2078,7 @@ int sk_detectReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyReverseGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
SK_Intersection *isect;
@@ -2093,7 +2095,7 @@ void sk_applyReverseGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
}
}
-int sk_detectConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+int sk_detectConvertGesture(bContext *UNUSED(C), SK_Gesture *gest, SK_Sketch *UNUSED(sketch))
{
if (gest->nb_segments == 3 && gest->nb_self_intersections == 1)
{
@@ -2102,7 +2104,7 @@ int sk_detectConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
return 0;
}
-void sk_applyConvertGesture(bContext *C, SK_Gesture *gest, SK_Sketch *sketch)
+void sk_applyConvertGesture(bContext *C, SK_Gesture *UNUSED(gest), SK_Sketch *sketch)
{
sk_convert(C, sketch);
}
@@ -2127,7 +2129,7 @@ static void sk_freeGesture(SK_Gesture *gest)
BLI_freelistN(&gest->self_intersections);
}
-void sk_applyGesture(bContext *C, SK_Sketch *sketch)
+static void sk_applyGesture(bContext *C, SK_Sketch *sketch)
{
SK_Gesture gest;
SK_GestureAction *act;
@@ -2150,7 +2152,7 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch)
/********************************************/
-int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
+static int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
{
ViewContext vc;
rcti rect;
@@ -2201,7 +2203,8 @@ int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend)
return 0;
}
-void sk_queueRedrawSketch(SK_Sketch *sketch)
+#if 0 /* UNUSED 2.5 */
+static void sk_queueRedrawSketch(SK_Sketch *sketch)
{
if (sketch->active_stroke != NULL)
{
@@ -2214,8 +2217,9 @@ void sk_queueRedrawSketch(SK_Sketch *sketch)
}
}
}
+#endif
-void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names)
+static void sk_drawSketch(Scene *scene, View3D *UNUSED(v3d), SK_Sketch *sketch, int with_names)
{
ToolSettings *ts= scene->toolsettings;
SK_Stroke *stk;
@@ -2343,7 +2347,7 @@ void sk_drawSketch(Scene *scene, View3D *v3d, SK_Sketch *sketch, int with_names)
}
}
-int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
+static int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
{
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -2378,7 +2382,7 @@ int sk_finish_stroke(bContext *C, SK_Sketch *sketch)
return 0;
}
-void sk_start_draw_stroke(SK_Sketch *sketch)
+static void sk_start_draw_stroke(SK_Sketch *sketch)
{
if (sketch->active_stroke == NULL)
{
@@ -2389,12 +2393,12 @@ void sk_start_draw_stroke(SK_Sketch *sketch)
}
}
-void sk_start_draw_gesture(SK_Sketch *sketch)
+static void sk_start_draw_gesture(SK_Sketch *sketch)
{
sketch->gesture = sk_createStroke();
}
-int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
+static int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap)
{
if (sk_stroke_filtermval(dd))
{
@@ -2452,7 +2456,7 @@ void BDR_drawSketch(const bContext *C)
}
}
-static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_delete(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch)
@@ -2460,6 +2464,7 @@ static int sketch_delete(bContext *C, wmOperator *op, wmEvent *event)
sk_deleteSelectedStrokes(sketch);
// allqueue(REDRAWVIEW3D, 0);
}
+ WM_event_add_notifier(C, NC_SCREEN|ND_SKETCH|NA_REMOVED, NULL);
return OPERATOR_FINISHED;
}
@@ -2558,7 +2563,7 @@ SK_Sketch* viewcontextSketch(ViewContext *vc, int create)
return sketch;
}
-static int sketch_convert(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_convert(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2569,7 +2574,7 @@ static int sketch_convert(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_FINISHED;
}
-static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_cancel(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2581,7 +2586,7 @@ static int sketch_cancel(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
}
-static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_finish(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch != NULL)
@@ -2595,7 +2600,7 @@ static int sketch_finish(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_PASS_THROUGH;
}
-static int sketch_select(bContext *C, wmOperator *op, wmEvent *event)
+static int sketch_select(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
SK_Sketch *sketch = contextSketch(C, 0);
if (sketch)
@@ -2771,7 +2776,7 @@ int ED_operator_sketch_mode_active_stroke(bContext *C)
}
}
-int ED_operator_sketch_mode_gesture(bContext *C)
+static int ED_operator_sketch_mode_gesture(bContext *C)
{
ToolSettings *ts = CTX_data_tool_settings(C);
SK_Sketch *sketch = contextSketch(C, 0);
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index ce9f1385f0e..d06464c486b 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,10 +41,11 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#ifdef RIGID_DEFORM
#include "BLI_editVert.h"
@@ -56,16 +57,17 @@
#include "BLO_sys_types.h" // for intptr_t support
#include "ED_mesh.h"
+#include "ED_armature.h"
#include "meshlaplacian.h"
/* ************* XXX *************** */
-static void waitcursor(int val) {}
-static void progress_bar(int dummy_val, const char *dummy) {}
-static void start_progress_bar() {}
-static void end_progress_bar() {}
-static void error(char *str) { printf("error: %s\n", str); }
+static void waitcursor(int UNUSED(val)) {}
+static void progress_bar(int UNUSED(dummy_val), const char *UNUSED(dummy)) {}
+static void start_progress_bar(void) {}
+static void end_progress_bar(void) {}
+static void error(const char *str) { printf("error: %s\n", str); }
/* ************* XXX *************** */
@@ -236,7 +238,7 @@ static void laplacian_triangle_weights(LaplacianSystem *sys, int f, int i1, int
}
}
-LaplacianSystem *laplacian_system_construct_begin(int totvert, int totface, int lsq)
+static LaplacianSystem *laplacian_system_construct_begin(int totvert, int totface, int lsq)
{
LaplacianSystem *sys;
@@ -278,7 +280,7 @@ void laplacian_add_triangle(LaplacianSystem *sys, int v1, int v2, int v3)
sys->totface++;
}
-void laplacian_system_construct_end(LaplacianSystem *sys)
+static void laplacian_system_construct_end(LaplacianSystem *sys)
{
int (*face)[3];
int a, totvert=sys->totvert, totface=sys->totface;
@@ -329,7 +331,7 @@ void laplacian_system_construct_end(LaplacianSystem *sys)
sys->edgehash= NULL;
}
-void laplacian_system_delete(LaplacianSystem *sys)
+static void laplacian_system_delete(LaplacianSystem *sys)
{
if(sys->verts) MEM_freeN(sys->verts);
if(sys->varea) MEM_freeN(sys->varea);
@@ -362,7 +364,7 @@ void laplacian_begin_solve(LaplacianSystem *sys, int index)
}
}
-void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value)
+void laplacian_add_right_hand_side(LaplacianSystem *UNUSED(sys), int v, float value)
{
nlRightHandSideAdd(0, v, value);
}
@@ -398,7 +400,7 @@ typedef struct BVHCallbackUserData {
LaplacianSystem *sys;
} BVHCallbackUserData;
-static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+static void bvh_callback(void *userdata, int index, const BVHTreeRay *UNUSED(ray), BVHTreeRayHit *hit)
{
BVHCallbackUserData *data = (struct BVHCallbackUserData*)userdata;
MFace *mf = data->sys->heat.mface + index;
@@ -564,7 +566,7 @@ static void heat_set_H(LaplacianSystem *sys, int vertex)
sys->heat.H[vertex]= h;
}
-void heat_calc_vnormals(LaplacianSystem *sys)
+static void heat_calc_vnormals(LaplacianSystem *sys)
{
float fnor[3];
int a, v1, v2, v3, (*face)[3];
@@ -642,13 +644,15 @@ static float heat_limit_weight(float weight)
return weight;
}
-void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected)
+void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected, const char **err_str)
{
LaplacianSystem *sys;
MFace *mface;
float solution, weight;
int *vertsflipped = NULL, *mask= NULL;
- int a, totface, j, bbone, firstsegment, lastsegment, thrownerror = 0;
+ int a, totface, j, bbone, firstsegment, lastsegment;
+
+ *err_str= NULL;
/* count triangles and create mask */
if(me->editflag & ME_EDIT_PAINT_MASK)
@@ -683,12 +687,16 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource,
laplacian_system_construct_end(sys);
+#if 0 /*BMESH_TODO*/
if(dgroupflip) {
vertsflipped = MEM_callocN(sizeof(int)*me->totvert, "vertsflipped");
for(a=0; a<me->totvert; a++)
vertsflipped[a] = mesh_get_x_mirror_vert(ob, a);
}
-
+#else
+ dgroupflip = 0;
+#endif
+
/* compute weights per bone */
for(j=0; j<numsource; j++) {
if(!selected[j])
@@ -759,10 +767,8 @@ void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numsource,
}
}
}
- else if(!thrownerror) {
- error("Bone Heat Weighting:"
- " failed to find solution for one or more bones");
- thrownerror= 1;
+ else if(*err_str == NULL) {
+ *err_str= "Bone Heat Weighting: failed to find solution for one or more bones";
break;
}
@@ -1263,11 +1269,9 @@ static int meshdeform_inside_cage(MeshDeformBind *mdb, float *co)
{
MDefBoundIsect *isect;
float outside[3], start[3], dir[3];
- int i, counter;
+ int i;
for(i=1; i<=6; i++) {
- counter = 0;
-
outside[0] = co[0] + (mdb->max[0] - mdb->min[0] + 1.0f)*MESHDEFORM_OFFSET[i][0];
outside[1] = co[1] + (mdb->max[1] - mdb->min[1] + 1.0f)*MESHDEFORM_OFFSET[i][1];
outside[2] = co[2] + (mdb->max[2] - mdb->min[2] + 1.0f)*MESHDEFORM_OFFSET[i][2];
@@ -1400,7 +1404,7 @@ static void meshdeform_bind_floodfill(MeshDeformBind *mdb)
MEM_freeN(stack);
}
-static float meshdeform_boundary_phi(MeshDeformBind *mdb, MDefBoundIsect *isect, int cagevert)
+static float meshdeform_boundary_phi(MeshDeformBind *UNUSED(mdb), MDefBoundIsect *isect, int cagevert)
{
int a;
@@ -1411,7 +1415,7 @@ static float meshdeform_boundary_phi(MeshDeformBind *mdb, MDefBoundIsect *isect,
return 0.0f;
}
-static float meshdeform_interp_w(MeshDeformBind *mdb, float *gridvec, float *vec, int cagevert)
+static float meshdeform_interp_w(MeshDeformBind *mdb, float *gridvec, float *UNUSED(vec), int UNUSED(cagevert))
{
float dvec[3], ivec[3], wx, wy, wz, result=0.0f;
float weight, totweight= 0.0f;
@@ -1562,7 +1566,7 @@ static void meshdeform_matrix_add_semibound_phi(MeshDeformBind *mdb, int x, int
}
}
-static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y, int z, int cagevert)
+static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y, int z, int UNUSED(cagevert))
{
float phi, totweight;
int i, a, acenter;
@@ -1711,7 +1715,7 @@ static void meshdeform_matrix_solve(MeshDeformBind *mdb)
nlDeleteContext(context);
}
-static void harmonic_coordinates_bind(Scene *scene, MeshDeformModifierData *mmd, MeshDeformBind *mdb)
+static void harmonic_coordinates_bind(Scene *UNUSED(scene), MeshDeformModifierData *mmd, MeshDeformBind *mdb)
{
MDefBindInfluence *inf;
MDefInfluence *mdinf;
diff --git a/source/blender/editors/armature/meshlaplacian.h b/source/blender/editors/armature/meshlaplacian.h
index 640eb33c945..74de015e12e 100644
--- a/source/blender/editors/armature/meshlaplacian.h
+++ b/source/blender/editors/armature/meshlaplacian.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -66,7 +66,7 @@ float laplacian_system_get_solution(int v);
void heat_bone_weighting(struct Object *ob, struct Mesh *me, float (*verts)[3],
int numbones, struct bDeformGroup **dgrouplist,
struct bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3],
- int *selected);
+ int *selected, const char **error);
#ifdef RIGID_DEFORM
/* As-Rigid-As-Possible Deformation */
@@ -78,9 +78,7 @@ void rigid_deform_end(int cancel);
/* Harmonic Coordinates */
-void mesh_deform_bind(struct Scene *scene,
- struct MeshDeformModifierData *mmd,
- float *vertexcos, int totvert, float cagemat[][4]);
+/* mesh_deform_bind(...) defined in ED_armature.h */
#endif
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
index 8d8f1bf24ee..5a7c7ffcaf9 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -119,7 +120,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
/* get info from context */
pso->scene= CTX_data_scene(C);
- pso->ob= CTX_data_active_object(C);
+ pso->ob= ED_object_pose_armature(CTX_data_active_object(C));
pso->arm= (pso->ob)? pso->ob->data : NULL;
pso->ar= CTX_wm_region(C); /* only really needed when doing modal() */
@@ -157,7 +158,7 @@ static int pose_slide_init (bContext *C, wmOperator *op, short mode)
}
/* exiting the operator - free data */
-static void pose_slide_exit (bContext *C, wmOperator *op)
+static void pose_slide_exit(wmOperator *op)
{
tPoseSlideOp *pso= op->customdata;
@@ -187,7 +188,7 @@ static void pose_slide_refresh (bContext *C, tPoseSlideOp *pso)
}
/* helper for apply() - perform sliding for some 3-element vector */
-static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], char *propName)
+static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], const char *propName)
{
LinkData *ld=NULL;
char *path=NULL;
@@ -376,7 +377,7 @@ static void pose_slide_apply_quat (tPoseSlideOp *pso, tPChanFCurveLink *pfl)
}
/* apply() - perform the pose sliding based on weighting various poses */
-static void pose_slide_apply (bContext *C, wmOperator *op, tPoseSlideOp *pso)
+static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
{
tPChanFCurveLink *pfl;
@@ -434,7 +435,7 @@ static void pose_slide_autoKeyframe (bContext *C, tPoseSlideOp *pso)
}
/* reset changes made to current pose */
-static void pose_slide_reset (bContext *C, tPoseSlideOp *pso)
+static void pose_slide_reset (tPoseSlideOp *pso)
{
/* wrapper around the generic call, so that custom stuff can be added later */
poseAnim_mapping_reset(&pso->pfLinks);
@@ -501,7 +502,7 @@ static int pose_slide_invoke_common (bContext *C, wmOperator *op, tPoseSlideOp *
/* initial apply for operator... */
// TODO: need to calculate percentage for initial round too...
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
/* depsgraph updates + redraws */
pose_slide_refresh(C, pso);
@@ -528,7 +529,7 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
/* insert keyframes as required... */
pose_slide_autoKeyframe(C, pso);
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
/* done! */
return OPERATOR_FINISHED;
@@ -541,13 +542,13 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
WM_cursor_restore(win);
/* reset transforms back to original state */
- pose_slide_reset(C, pso);
+ pose_slide_reset(pso);
/* depsgraph updates + redraws */
pose_slide_refresh(C, pso);
/* clean up temp data */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
/* cancelled! */
return OPERATOR_CANCELLED;
@@ -562,10 +563,10 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
RNA_float_set(op->ptr, "percentage", pso->percentage);
/* reset transforms (to avoid accumulation errors) */
- pose_slide_reset(C, pso);
+ pose_slide_reset(pso);
/* apply... */
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
}
break;
@@ -579,10 +580,10 @@ static int pose_slide_modal (bContext *C, wmOperator *op, wmEvent *evt)
}
/* common code for cancel() */
-static int pose_slide_cancel (bContext *C, wmOperator *op)
+static int pose_slide_cancel (bContext *UNUSED(C), wmOperator *op)
{
/* cleanup and done */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
@@ -590,13 +591,13 @@ static int pose_slide_cancel (bContext *C, wmOperator *op)
static int pose_slide_exec_common (bContext *C, wmOperator *op, tPoseSlideOp *pso)
{
/* settings should have been set up ok for applying, so just apply! */
- pose_slide_apply(C, op, pso);
+ pose_slide_apply(C, pso);
/* insert keyframes if needed */
pose_slide_autoKeyframe(C, pso);
/* cleanup and done */
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_FINISHED;
}
@@ -612,13 +613,13 @@ static void pose_slide_opdef_properties (wmOperatorType *ot)
/* ------------------------------------ */
/* invoke() - for 'push' mode */
-static int pose_slide_push_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_push_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -635,7 +636,7 @@ static int pose_slide_push_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_PUSH) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -669,13 +670,13 @@ void POSE_OT_push (wmOperatorType *ot)
/* ........................ */
/* invoke() - for 'relax' mode */
-static int pose_slide_relax_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_relax_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -692,7 +693,7 @@ static int pose_slide_relax_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_RELAX) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -726,13 +727,13 @@ void POSE_OT_relax (wmOperatorType *ot)
/* ........................ */
/* invoke() - for 'breakdown' mode */
-static int pose_slide_breakdown_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_slide_breakdown_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
tPoseSlideOp *pso;
/* initialise data */
if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
@@ -749,7 +750,7 @@ static int pose_slide_breakdown_exec (bContext *C, wmOperator *op)
/* initialise data (from RNA-props) */
if (pose_slide_init(C, op, POSESLIDE_BREAKDOWN) == 0) {
- pose_slide_exit(C, op);
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
else
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
index b8b9c354d9a..c9ba7583689 100644
--- a/source/blender/editors/armature/poseUtils.c
+++ b/source/blender/editors/armature/poseUtils.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -161,7 +162,7 @@ void poseAnim_mapping_refresh (bContext *C, Scene *scene, Object *ob)
*/
// FIXME: shouldn't this use the builtin stuff?
if ((arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(scene, ob);
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 6fe584c7f98..13a8cef3d07 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -48,6 +49,8 @@
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_depsgraph.h"
+#include "BKE_idprop.h"
+#include "BKE_library.h"
#include "BKE_context.h"
#include "BKE_report.h"
@@ -73,7 +76,7 @@
/* ******* XXX ********** */
-static void action_set_activemarker() {}
+static void action_set_activemarker(void *UNUSED(a), void *UNUSED(b), void *UNUSED(c)) {}
/* ************************************************************* */
/* == POSE-LIBRARY TOOL FOR BLENDER ==
@@ -94,41 +97,11 @@ static void action_set_activemarker() {}
*/
/* ************************************************************* */
-/* gets list of poses in poselib as a string usable for pupmenu() */
-char *poselib_build_poses_menu (bAction *act, char title[])
-{
- DynStr *pupds= BLI_dynstr_new();
- TimeMarker *marker;
- char *str;
- char buf[64];
- int i;
-
- /* add title first */
- sprintf(buf, "%s%%t|", title);
- BLI_dynstr_append(pupds, buf);
-
- /* loop through markers, adding them */
- for (marker=act->markers.first, i=1; marker; marker=marker->next, i++) {
- BLI_dynstr_append(pupds, marker->name);
-
- sprintf(buf, "%%x%d", i);
- BLI_dynstr_append(pupds, buf);
-
- if (marker->next)
- BLI_dynstr_append(pupds, "|");
- }
-
- /* convert to normal MEM_malloc'd string */
- str= BLI_dynstr_get_cstring(pupds);
- BLI_dynstr_free(pupds);
-
- return str;
-}
/* gets the first available frame in poselib to store a pose on
* - frames start from 1, and a pose should occur on every frame... 0 is error!
*/
-int poselib_get_free_index (bAction *act)
+static int poselib_get_free_index (bAction *act)
{
TimeMarker *marker;
int low=0, high=0;
@@ -159,7 +132,7 @@ int poselib_get_free_index (bAction *act)
}
/* returns the active pose for a poselib */
-TimeMarker *poselib_get_active_pose (bAction *act)
+static TimeMarker *poselib_get_active_pose (bAction *act)
{
if ((act) && (act->active_marker))
return BLI_findlink(&act->markers, act->active_marker-1);
@@ -167,10 +140,35 @@ TimeMarker *poselib_get_active_pose (bAction *act)
return NULL;
}
-/* ************************************************************* */
+/* Get object that Pose Lib should be found on */
+ /* XXX C can be zero */
+static Object *get_poselib_object (bContext *C)
+{
+ ScrArea *sa;
+
+ /* sanity check */
+ if (C == NULL)
+ return NULL;
+
+ sa = CTX_wm_area(C);
+
+ if (sa && (sa->spacetype == SPACE_BUTS))
+ return CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+ else
+ return ED_object_pose_armature(CTX_data_active_object(C));
+}
+
+/* Poll callback for operators that require existing PoseLib data (with poses) to work */
+static int has_poselib_pose_data_poll (bContext *C)
+{
+ Object *ob = get_poselib_object(C);
+ return (ob && ob->poselib);
+}
+
+/* ----------------------------------- */
/* Initialise a new poselib (whether it is needed or not) */
-bAction *poselib_init_new (Object *ob)
+static bAction *poselib_init_new (Object *ob)
{
/* sanity checks - only for armatures */
if (ELEM(NULL, ob, ob->pose))
@@ -178,14 +176,14 @@ bAction *poselib_init_new (Object *ob)
/* init object's poselib action (unlink old one if there) */
if (ob->poselib)
- ob->poselib->id.us--;
+ id_us_min(&ob->poselib->id);
ob->poselib= add_empty_action("PoseLib");
return ob->poselib;
}
/* Initialise a new poselib (checks if that needs to happen) */
-bAction *poselib_validate (Object *ob)
+static bAction *poselib_validate (Object *ob)
{
if (ELEM(NULL, ob, ob->pose))
return NULL;
@@ -195,29 +193,102 @@ bAction *poselib_validate (Object *ob)
return ob->poselib;
}
+/* ************************************************************* */
+/* Pose Lib UI Operators */
+
+static int poselib_new_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob = get_poselib_object(C);
+
+ /* sanity checks */
+ if (ob == NULL)
+ return OPERATOR_CANCELLED;
+
+ /* new method here deals with the rest... */
+ poselib_init_new(ob);
+
+ /* notifier here might evolve? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSELIB_OT_new (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "New Pose Library";
+ ot->idname = "POSELIB_OT_new";
+ ot->description = "Add New Pose Library to active Object";
+
+ /* callbacks */
+ ot->exec = poselib_new_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ------------------------------------------------ */
+
+static int poselib_unlink_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob = get_poselib_object(C);
+
+ /* sanity checks */
+ if (ELEM(NULL, ob, ob->poselib))
+ return OPERATOR_CANCELLED;
+
+ /* there should be a poselib (we just checked above!), so just lower its user count and remove */
+ id_us_min(&ob->poselib->id);
+ ob->poselib = NULL;
+
+ /* notifier here might evolve? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void POSELIB_OT_unlink (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Unlink Pose Library";
+ ot->idname = "POSELIB_OT_unlink";
+ ot->description = "Remove Pose Library from active Object";
+
+ /* callbacks */
+ ot->exec = poselib_unlink_exec;
+ ot->poll= has_poselib_pose_data_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ************************************************************* */
+/* Pose Editing Operators */
/* This tool automagically generates/validates poselib data so that it corresponds to the data
* in the action. This is for use in making existing actions usable as poselibs.
*/
-// TODO: operatorfy me!
-void poselib_validate_act (bAction *act)
+static int poselib_sanitise_exec (bContext *C, wmOperator *op)
{
- DLRBT_Tree keys = {NULL, NULL};
+ Object *ob = get_poselib_object(C);
+ bAction *act = (ob)? ob->poselib : NULL;
+ DLRBT_Tree keys;
ActKeyColumn *ak;
TimeMarker *marker, *markern;
- /* validate action and poselib */
+ /* validate action */
if (act == NULL) {
- //error("No Action to validate");
- return;
+ BKE_report(op->reports, RPT_WARNING, "No Action to validate");
+ return OPERATOR_CANCELLED;
}
/* determine which frames have keys */
BLI_dlrbTree_init(&keys);
- action_to_keylist(NULL, act, &keys, NULL);
+ action_to_keylist(NULL, act, &keys, NULL);
BLI_dlrbTree_linkedlist_sync(&keys);
- /* for each key, make sure there is a correspnding pose */
+ /* for each key, make sure there is a corresponding pose */
for (ak= keys.first; ak; ak= ak->next) {
/* check if any pose matches this */
// TODO: don't go looking through the list like this every time...
@@ -230,13 +301,10 @@ void poselib_validate_act (bAction *act)
/* add new if none found */
if (marker == NULL) {
- char name[64];
-
/* add pose to poselib */
marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker");
- strcpy(name, "Pose");
- BLI_strncpy(marker->name, name, sizeof(marker->name));
+ BLI_strncpy(marker->name, "Pose", sizeof(marker->name));
marker->frame= (int)ak->cfra;
marker->flag= -1;
@@ -256,22 +324,32 @@ void poselib_validate_act (bAction *act)
}
/* free temp memory */
- BLI_freelistN((ListBase *)&keys);
+ BLI_dlrbTree_free(&keys);
- //BIF_undo_push("PoseLib Validate Action");
+ return OPERATOR_FINISHED;
}
-/* ************************************************************* */
-
-/* Pointers to the builtin KeyingSets that we want to use */
-static KeyingSet *poselib_ks_locrotscale = NULL; /* the only keyingset we'll need */
+void POSELIB_OT_action_sanitise (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Sanitise Pose Library Action";
+ ot->idname = "POSELIB_OT_action_sanitise";
+ ot->description = "Make action suitable for use as a Pose Library";
+
+ /* callbacks */
+ ot->exec = poselib_sanitise_exec;
+ ot->poll = has_poselib_pose_data_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
-/* ----- */
+/* ------------------------------------------ */
-static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *arg)
+static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *UNUSED(arg))
{
- Object *ob= CTX_data_active_object(C);
- bAction *act= ob->poselib;
+ Object *ob= get_poselib_object(C);
+ bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
/* set the operator execution context correctly */
@@ -287,34 +365,33 @@ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout,
RNA_int_set(&props_ptr, "frame", marker->frame);
RNA_string_set(&props_ptr, "name", marker->name);
-}
+ }
}
-static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
- bArmature *arm= (ob) ? ob->data : NULL;
+ Object *ob= get_poselib_object(C);
bPose *pose= (ob) ? ob->pose : NULL;
uiPopupMenu *pup;
uiLayout *layout;
/* sanity check */
- if (ELEM3(NULL, ob, arm, pose))
+ if (ELEM(NULL, ob, pose))
return OPERATOR_CANCELLED;
/* start building */
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
/* add new (adds to the first unoccupied frame) */
- uiItemIntO(layout, "Add New", 0, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
+ uiItemIntO(layout, "Add New", ICON_NULL, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
/* check if we have any choices to add a new pose in any other way */
if ((ob->poselib) && (ob->poselib->markers.first)) {
/* add new (on current frame) */
- uiItemIntO(layout, "Add New (Current Frame)", 0, "POSELIB_OT_pose_add", "frame", CFRA);
+ uiItemIntO(layout, "Add New (Current Frame)", ICON_NULL, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu, NULL);
@@ -329,16 +406,16 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int poselib_add_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= get_poselib_object(C);
bAction *act = poselib_validate(ob);
- bArmature *arm= (ob) ? ob->data : NULL;
bPose *pose= (ob) ? ob->pose : NULL;
TimeMarker *marker;
+ KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Whole Character"); /* this includes custom props :)*/
int frame= RNA_int_get(op->ptr, "frame");
char name[64];
/* sanity check (invoke should have checked this anyway) */
- if (ELEM3(NULL, ob, arm, pose))
+ if (ELEM(NULL, ob, pose))
return OPERATOR_CANCELLED;
/* get name to give to pose */
@@ -366,12 +443,10 @@ static int poselib_add_exec (bContext *C, wmOperator *op)
/* validate name */
BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), sizeof(marker->name));
- /* KeyingSet to use depends on rotation mode (but that's handled by the templates code) */
- if (poselib_ks_locrotscale == NULL)
- poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
-
- /* make the keyingset use context info to determine where to add keyframes */
- ANIM_apply_keyingset(C, NULL, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame);
+ /* use Keying Set to determine what to store for the pose */
+ // FIXME: in the past, the Keying Set respected selections (LocRotScale), but the current one doesn't (Whole Character)
+ // so perhaps we need either a new Keying Set, or just to add overrides here...
+ ANIM_apply_keyingset(C, NULL, act, ks, MODIFYKEY_MODE_INSERT, (float)frame);
/* store new 'active' pose number */
act->active_marker= BLI_countlist(&act->markers);
@@ -402,20 +477,19 @@ void POSELIB_OT_pose_add (wmOperatorType *ot)
/* ----- */
-static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr, int *free)
+/* can be called with C == NULL */
+static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
- Object *ob= CTX_data_active_object(C);
- bAction *act= (ob) ? ob->poselib : NULL;
+ Object *ob = get_poselib_object(C);
+ bAction *act = (ob) ? ob->poselib : NULL;
TimeMarker *marker;
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem *item= NULL, item_tmp= {0};
int totitem= 0;
int i= 0;
- if (C==NULL) {
+ if (C == NULL) {
return DummyRNA_DEFAULT_items;
}
-
- memset(&item_tmp, 0, sizeof(item_tmp));
/* check that the action exists */
if (act) {
@@ -436,7 +510,7 @@ static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *ptr,
static int poselib_remove_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= get_poselib_object(C);
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
FCurve *fcu;
@@ -450,7 +524,7 @@ static int poselib_remove_exec (bContext *C, wmOperator *op)
/* get index (and pointer) of pose to remove */
marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "pose"));
if (marker == NULL) {
- BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose");
+ BKE_reportf(op->reports, RPT_ERROR, "Invalid Pose specified %d", RNA_int_get(op->ptr, "pose"));
return OPERATOR_CANCELLED;
}
@@ -492,20 +566,20 @@ void POSELIB_OT_pose_remove (wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= poselib_remove_exec;
- ot->poll= ED_operator_posemode;
+ ot->poll= has_poselib_pose_data_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
prop= RNA_def_enum(ot->srna, "pose", DummyRNA_DEFAULT_items, 0, "Pose", "The pose to remove");
- RNA_def_enum_funcs(prop, poselib_stored_pose_itemf);
+ RNA_def_enum_funcs(prop, poselib_stored_pose_itemf);
ot->prop= prop;
}
static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= get_poselib_object(C);
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
@@ -533,7 +607,7 @@ static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int poselib_rename_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bAction *act= (ob) ? ob->poselib : NULL;
TimeMarker *marker;
char newname[64];
@@ -572,23 +646,25 @@ void POSELIB_OT_pose_rename (wmOperatorType *ot)
/* identifiers */
ot->name= "PoseLib Rename Pose";
ot->idname= "POSELIB_OT_pose_rename";
- ot->description= "Rename nth pose from the active Pose Library";
+ ot->description= "Rename specified pose from the active Pose Library";
/* api callbacks */
ot->invoke= poselib_rename_invoke;
ot->exec= poselib_rename_exec;
- ot->poll= ED_operator_posemode;
+ ot->poll= has_poselib_pose_data_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
+ /* NOTE: name not pose is the operator's "main" property, so that it will get activated in the popup for easy renaming */
+ ot->prop= RNA_def_string(ot->srna, "name", "RenamedPose", 64, "New Pose Name", "New name for pose");
prop= RNA_def_enum(ot->srna, "pose", prop_poses_dummy_types, 0, "Pose", "The pose to rename");
RNA_def_enum_funcs(prop, poselib_stored_pose_itemf);
- RNA_def_string(ot->srna, "name", "RenamedPose", 64, "New Pose Name", "New name for pose");
}
/* ************************************************************* */
+/* Pose-Lib Browsing/Previewing Operator */
/* Simple struct for storing settings/data for use during PoseLib preview */
typedef struct tPoseLib_PreviewData {
@@ -647,8 +723,10 @@ enum {
typedef struct tPoseLib_Backup {
struct tPoseLib_Backup *next, *prev;
- bPoseChannel *pchan;
- bPoseChannel olddata;
+ bPoseChannel *pchan; /* pose channel backups are for */
+
+ bPoseChannel olddata; /* copy of pose channel's old data (at start) */
+ IDProperty *oldprops; /* copy (needs freeing) of pose channel's properties (at start) */
} tPoseLib_Backup;
/* Makes a copy of the current pose for restoration purposes - doesn't do constraints currently */
@@ -672,6 +750,9 @@ static void poselib_backup_posecopy (tPoseLib_PreviewData *pld)
plb->pchan= pchan;
memcpy(&plb->olddata, plb->pchan, sizeof(bPoseChannel));
+ if (pchan->prop)
+ plb->oldprops= IDP_CopyProperty(pchan->prop);
+
BLI_addtail(&pld->backups, plb);
/* mark as being affected */
@@ -682,13 +763,39 @@ static void poselib_backup_posecopy (tPoseLib_PreviewData *pld)
}
}
-/* Restores original pose - doesn't do constraints currently */
+/* Restores original pose */
static void poselib_backup_restore (tPoseLib_PreviewData *pld)
{
tPoseLib_Backup *plb;
for (plb= pld->backups.first; plb; plb= plb->next) {
+ /* copy most of data straight back */
memcpy(plb->pchan, &plb->olddata, sizeof(bPoseChannel));
+
+ /* just overwrite values of properties from the stored copies (there should be some) */
+ if (plb->oldprops)
+ IDP_SyncGroupValues(plb->pchan->prop, plb->oldprops);
+
+ // TODO: constraints settings aren't restored yet, even though these could change (though not that likely)
+ }
+}
+
+/* Free list of backups, including any side data it may use */
+static void poselib_backup_free_data (tPoseLib_PreviewData *pld)
+{
+ tPoseLib_Backup *plb, *plbn;
+
+ for (plb= pld->backups.first; plb; plb= plbn) {
+ plbn= plb->next;
+
+ /* free custom data */
+ if (plb->oldprops) {
+ IDP_FreeProperty(plb->oldprops);
+ MEM_freeN(plb->oldprops);
+ }
+
+ /* free backup element now */
+ BLI_freelinkN(&pld->backups, plb);
}
}
@@ -708,7 +815,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
bAction *act= pld->act;
bActionGroup *agrp;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc group_ok_cb;
int frame= 1;
@@ -721,7 +828,6 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
/* init settings for testing groups for keyframes */
group_ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
- memset(&ked, 0, sizeof(KeyframeEditData));
ked.f1= ((float)frame) - 0.5f;
ked.f2= ((float)frame) + 0.5f;
@@ -743,7 +849,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
}
else if (pchan->bone) {
/* only ok if bone is visible and selected */
- if ( (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone) &&
+ if ( (pchan->bone->flag & BONE_SELECTED) &&
(pchan->bone->flag & BONE_HIDDEN_P)==0 &&
(pchan->bone->layer & arm->layer) )
ok = 1;
@@ -764,6 +870,10 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
bAction *act= pld->act;
bActionGroup *agrp;
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Whole Character");
+ ListBase dsources = {NULL, NULL};
+ short autokey = autokeyframe_cfra_can_key(scene, &pld->ob->id);
+
/* start tagging/keying */
for (agrp= act->groups.first; agrp; agrp= agrp->next) {
/* only for selected action channels */
@@ -771,30 +881,9 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
pchan= get_pose_channel(pose, agrp->name);
if (pchan) {
- if (autokeyframe_cfra_can_key(scene, &pld->ob->id)) {
- ListBase dsources = {NULL, NULL};
- KeyingSet *ks = NULL;
-
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (poselib_ks_locrotscale == NULL)
- poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
-
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
-
- /* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
- * 2) insert keyframes
- * 3) free the extra info
- */
+ if (autokey) {
+ /* add datasource override for the PoseChannel, to be used later */
ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan);
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- BLI_freelistN(&dsources);
/* clear any unkeyed tags */
if (pchan->bone)
@@ -809,6 +898,13 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData
}
}
+ /* perform actual auto-keying now */
+ if (autokey) {
+ /* insert keyframes for all relevant bones in one go */
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ BLI_freelistN(&dsources);
+ }
+
/* send notifiers for this */
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
@@ -839,7 +935,7 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
*/
// FIXME: shouldn't this use the builtin stuff?
if ((pld->arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&pld->ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&pld->ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(pld->scene, pld->ob);
}
@@ -894,91 +990,90 @@ static void poselib_preview_apply (bContext *C, wmOperator *op)
*/
static void poselib_preview_get_next (tPoseLib_PreviewData *pld, int step)
{
- /* check if we no longer have search-string, but don't have any marker */
- if (pld->marker == NULL) {
- if ((step) && (pld->searchstr[0] == 0))
- pld->marker= pld->act->markers.first;
- }
-
- /* the following operations assume that there is a starting point and direction */
- if ((pld->marker) && (step)) {
- /* search-string dictates a special approach */
- if (pld->searchstr[0]) {
- TimeMarker *marker;
- LinkData *ld, *ldn, *ldc;
+ /* stop if not going anywhere, as we assume that there is a direction to move in */
+ if (step == 0)
+ return;
+
+ /* search-string dictates a special approach */
+ if (pld->searchstr[0]) {
+ TimeMarker *marker;
+ LinkData *ld, *ldn, *ldc;
+
+ /* free and rebuild if needed (i.e. if search-str changed) */
+ if (strcmp(pld->searchstr, pld->searchold)) {
+ /* free list of temporary search matches */
+ BLI_freelistN(&pld->searchp);
- /* free and rebuild if needed (i.e. if search-str changed) */
- if (strcmp(pld->searchstr, pld->searchold)) {
- /* free list of temporary search matches */
- BLI_freelistN(&pld->searchp);
-
- /* generate a new list of search matches */
- for (marker= pld->act->markers.first; marker; marker= marker->next) {
- /* does the name partially match?
- * - don't worry about case, to make it easier for users to quickly input a name (or
- * part of one), which is the whole point of this feature
- */
- if (BLI_strcasestr(marker->name, pld->searchstr)) {
- /* make link-data to store reference to it */
- ld= MEM_callocN(sizeof(LinkData), "PoseMatch");
- ld->data= marker;
- BLI_addtail(&pld->searchp, ld);
- }
+ /* generate a new list of search matches */
+ for (marker= pld->act->markers.first; marker; marker= marker->next) {
+ /* does the name partially match?
+ * - don't worry about case, to make it easier for users to quickly input a name (or
+ * part of one), which is the whole point of this feature
+ */
+ if (BLI_strcasestr(marker->name, pld->searchstr)) {
+ /* make link-data to store reference to it */
+ ld= MEM_callocN(sizeof(LinkData), "PoseMatch");
+ ld->data= marker;
+ BLI_addtail(&pld->searchp, ld);
}
-
- /* set current marker to NULL (so that we start from first) */
- pld->marker= NULL;
}
- /* check if any matches */
- if (pld->searchp.first == NULL) {
- pld->marker= NULL;
- return;
- }
-
- /* find first match */
- for (ldc= pld->searchp.first; ldc; ldc= ldc->next) {
- if (ldc->data == pld->marker)
- break;
- }
- if (ldc == NULL)
- ldc= pld->searchp.first;
-
- /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate
- * until step == 0. At this point, marker should be the correct marker.
- */
- if (step > 0) {
- for (ld=ldc; ld && step; ld=ldn, step--)
- ldn= (ld->next) ? ld->next : pld->searchp.first;
- }
- else {
- for (ld=ldc; ld && step; ld=ldn, step++)
- ldn= (ld->prev) ? ld->prev : pld->searchp.last;
- }
+ /* set current marker to NULL (so that we start from first) */
+ pld->marker= NULL;
+ }
+
+ /* check if any matches */
+ if (pld->searchp.first == NULL) {
+ pld->marker= NULL;
+ return;
+ }
+
+ /* find first match */
+ for (ldc= pld->searchp.first; ldc; ldc= ldc->next) {
+ if (ldc->data == pld->marker)
+ break;
+ }
+ if (ldc == NULL)
+ ldc= pld->searchp.first;
- /* set marker */
- if (ld)
- pld->marker= ld->data;
+ /* Loop through the matches in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (ld=ldc; ld && step; ld=ldn, step--)
+ ldn= (ld->next) ? ld->next : pld->searchp.first;
}
else {
- TimeMarker *marker, *next;
-
- /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate
- * until step == 0. At this point, marker should be the correct marker.
- */
- if (step > 0) {
- for (marker=pld->marker; marker && step; marker=next, step--)
- next= (marker->next) ? marker->next : pld->act->markers.first;
- }
- else {
- for (marker=pld->marker; marker && step; marker=next, step++)
- next= (marker->prev) ? marker->prev : pld->act->markers.last;
- }
-
- /* it should be fairly impossible for marker to be NULL */
- if (marker)
- pld->marker= marker;
+ for (ld=ldc; ld && step; ld=ldn, step++)
+ ldn= (ld->prev) ? ld->prev : pld->searchp.last;
+ }
+
+ /* set marker */
+ if (ld)
+ pld->marker= ld->data;
+ }
+ else {
+ TimeMarker *marker, *next;
+
+ /* if no marker, because we just ended searching, then set that to the start of the list */
+ if (pld->marker == NULL)
+ pld->marker= pld->act->markers.first;
+
+ /* Loop through the markers in a cyclic fashion, incrementing/decrementing step as appropriate
+ * until step == 0. At this point, marker should be the correct marker.
+ */
+ if (step > 0) {
+ for (marker=pld->marker; marker && step; marker=next, step--)
+ next= (marker->next) ? marker->next : pld->act->markers.first;
+ }
+ else {
+ for (marker=pld->marker; marker && step; marker=next, step++)
+ next= (marker->prev) ? marker->prev : pld->act->markers.last;
}
+
+ /* it should be fairly impossible for marker to be NULL */
+ if (marker)
+ pld->marker= marker;
}
}
@@ -1044,11 +1139,17 @@ static void poselib_preview_handle_search (tPoseLib_PreviewData *pld, unsigned s
}
/* handle events for poselib_preview_poses */
-static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *event)
+static int poselib_preview_handle_event (bContext *UNUSED(C), wmOperator *op, wmEvent *event)
{
tPoseLib_PreviewData *pld= op->customdata;
int ret = OPERATOR_RUNNING_MODAL;
+ /* only accept 'press' event, and ignore 'release', so that we don't get double actions */
+ if (ELEM(event->val, KM_PRESS, KM_NOTHING) == 0) {
+ //printf("PoseLib: skipping event with type '%s' and val %d\n", WM_key_event_string(event->type), event->val);
+ return ret;
+ }
+
/* backup stuff that needs to occur before every operation
* - make a copy of searchstr, so that we know if cache needs to be rebuilt
*/
@@ -1077,18 +1178,16 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
*/
case PAD0: case PAD1: case PAD2: case PAD3: case PAD4:
case PAD5: case PAD6: case PAD7: case PAD8: case PAD9:
- case PADPLUSKEY: case PADMINUS: case MIDDLEMOUSE:
+ case PADPLUSKEY: case PADMINUS:
+ case MIDDLEMOUSE: case MOUSEMOVE:
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
break;
/* quicky compare to original */
case TABKEY:
- /* only respond to one event */
- if (event->val == 0) {
- pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
- pld->redraw= PL_PREVIEW_REDRAWALL;
- }
+ pld->flag &= ~PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
break;
}
@@ -1115,11 +1214,8 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
/* toggle between original pose and poselib pose*/
case TABKEY:
- /* only respond to one event */
- if (event->val == 0) {
- pld->flag |= PL_PREVIEW_SHOWORIGINAL;
- pld->redraw= PL_PREVIEW_REDRAWALL;
- }
+ pld->flag |= PL_PREVIEW_SHOWORIGINAL;
+ pld->redraw= PL_PREVIEW_REDRAWALL;
break;
/* change to previous pose (cyclic) */
@@ -1212,9 +1308,9 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
/* we add pass through here, so that the operators responsible for these can still run,
* even though we still maintain control (as RUNNING_MODAL flag is still set too)
*/
- case MIDDLEMOUSE:
+ case MIDDLEMOUSE: case MOUSEMOVE:
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
break;
/* view manipulation, or searching */
@@ -1228,7 +1324,7 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
else {
/* view manipulation (see above) */
//pld->redraw= PL_PREVIEW_REDRAWHEADER;
- ret |= OPERATOR_PASS_THROUGH;
+ ret = OPERATOR_PASS_THROUGH;
}
break;
@@ -1247,7 +1343,7 @@ static int poselib_preview_handle_event (bContext *C, wmOperator *op, wmEvent *e
static void poselib_preview_init_data (bContext *C, wmOperator *op)
{
tPoseLib_PreviewData *pld;
- Object *ob= CTX_data_active_object(C);
+ Object *ob= get_poselib_object(C);
int pose_index = RNA_int_get(op->ptr, "pose_index");
/* set up preview state info */
@@ -1343,7 +1439,7 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
* - note: code copied from transform_generics.c -> recalcData()
*/
if ((arm->flag & ARM_DELAYDEFORM)==0)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
else
where_is_pose(scene, ob);
@@ -1357,21 +1453,18 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
action_set_activemarker(act, marker, 0);
/* Update event for pose and deformation children */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* updates */
if (IS_AUTOKEY_MODE(scene, NORMAL)) {
//remake_action_ipos(ob->action);
}
- else {
- /* need to trick depgraph, action is not allowed to execute on pose */
+ else
where_is_pose(scene, ob);
- ob->recalc= 0;
- }
}
- /* free memory used for backups */
- BLI_freelistN(&pld->backups);
+ /* free memory used for backups and searching */
+ poselib_backup_free_data(pld);
BLI_freelistN(&pld->searchp);
/* free temp data for operator */
@@ -1383,11 +1476,12 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
static int poselib_preview_exit (bContext *C, wmOperator *op)
{
tPoseLib_PreviewData *pld= op->customdata;
+ int exit_state = pld->state;
/* finish up */
poselib_preview_cleanup(C, op);
- if (ELEM(pld->state, PL_PREVIEW_CANCEL, PL_PREVIEW_ERROR))
+ if (ELEM(exit_state, PL_PREVIEW_CANCEL, PL_PREVIEW_ERROR))
return OPERATOR_CANCELLED;
else
return OPERATOR_FINISHED;
@@ -1421,7 +1515,7 @@ static int poselib_preview_modal (bContext *C, wmOperator *op, wmEvent *event)
}
/* Modal Operator init */
-static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int poselib_preview_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
tPoseLib_PreviewData *pld;
@@ -1481,12 +1575,12 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
ot->idname= "POSELIB_OT_browse_interactive";
ot->description= "Interactively browse poses in 3D-View";
- /* api callbacks */
+ /* callbacks */
ot->invoke= poselib_preview_invoke;
ot->modal= poselib_preview_modal;
ot->cancel= poselib_preview_cancel;
ot->exec= poselib_preview_exec;
- ot->poll= ED_operator_posemode;
+ ot->poll= has_poselib_pose_data_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
@@ -1499,3 +1593,22 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot)
/* not used yet */
/* RNA_def_float_factor(ot->srna, "blend_factor", 1.0f, 0.0f, 1.0f, "Blend Factor", "Amount that the pose is applied on top of the existing poses", 0.0f, 1.0f); */
}
+
+void POSELIB_OT_apply_pose (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Apply Pose Library Pose";
+ ot->idname = "POSELIB_OT_apply_pose";
+ ot->description = "Apply specified Pose Library pose to the rig";
+
+ /* callbacks */
+ ot->exec= poselib_preview_exec;
+ ot->poll= has_poselib_pose_data_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ // TODO: make the pose_index into a proper enum instead of a cryptic int...
+ ot->prop= RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX);
+}
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index 54d052d52b5..c5ae60e982b 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -70,14 +71,39 @@
#include "armature_intern.h"
-/* ************* XXX *************** */
-static int pupmenu(const char *dummy) {return 0;}
-static void error(const char *dummy) {};
-static void BIF_undo_push(const char *dummy) {}
-/* ************* XXX *************** */
+static int object_pose_context(Object *ob)
+{
+ if( (ob) &&
+ (ob->type == OB_ARMATURE) &&
+ (ob->pose) &&
+ (ob->mode & OB_MODE_POSE)
+ ) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+Object *ED_object_pose_armature(Object *ob)
+{
+ if(ob==NULL)
+ return NULL;
+
+ if(object_pose_context(ob))
+ return ob;
+
+ ob= modifiers_isDeformedByArmature(ob);
+
+ if(object_pose_context(ob))
+ return ob;
+
+ return NULL;
+}
+
/* This function is used to indicate that a bone is selected and needs keyframes inserted */
-void set_pose_keys (Object *ob)
+static void set_pose_keys (Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *chan;
@@ -96,14 +122,15 @@ void set_pose_keys (Object *ob)
/* This function is used to process the necessary updates for */
void ED_armature_enter_posemode(bContext *C, Base *base)
{
+ ReportList *reports= CTX_wm_reports(C);
Object *ob= base->object;
- if (ob->id.lib){
- error ("Can't pose libdata");
+ if (ob->id.lib) {
+ BKE_report(reports, RPT_WARNING, "Can't pose libdata");
return;
}
- switch (ob->type){
+ switch (ob->type) {
case OB_ARMATURE:
ob->restore_mode = ob->mode;
ob->mode |= OB_MODE_POSE;
@@ -114,7 +141,8 @@ void ED_armature_enter_posemode(bContext *C, Base *base)
default:
return;
}
-
+
+ // XXX: disabled as this would otherwise cause a nasty loop...
//ED_object_toggle_modes(C, ob->mode);
}
@@ -132,7 +160,8 @@ void ED_armature_exit_posemode(bContext *C, Base *base)
/* if a selected or active bone is protected, throw error (oonly if warn==1) and return 1 */
/* only_selected==1 : the active bone is allowed to be protected */
-static short pose_has_protected_selected(Object *ob, short only_selected, short warn)
+#if 0 /* UNUSED 2.5 */
+static short pose_has_protected_selected(Object *ob, short warn)
{
/* check protection */
if (ob->proxy) {
@@ -142,8 +171,7 @@ static short pose_has_protected_selected(Object *ob, short only_selected, short
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if (pchan->bone && (pchan->bone->layer & arm->layer)) {
if (pchan->bone->layer & arm->layer_protected) {
- if (only_selected && (pchan->bone == arm->act_bone));
- else if (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone)
+ if (pchan->bone->flag & BONE_SELECTED)
break;
}
}
@@ -155,9 +183,10 @@ static short pose_has_protected_selected(Object *ob, short only_selected, short
}
return 0;
}
+#endif
/* only for real IK, not for auto-IK */
-int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
+static int pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan, int level)
{
bConstraint *con;
Bone *bone;
@@ -167,18 +196,25 @@ int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
for(con= pchan->constraints.first; con; con= con->next) {
if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
bKinematicConstraint *data= con->data;
- if((data->flag & CONSTRAINT_IK_AUTO)==0)
- return 1;
+ if(data->rootbone == 0 || data->rootbone > level) {
+ if((data->flag & CONSTRAINT_IK_AUTO)==0)
+ return 1;
+ }
}
}
for(bone= pchan->bone->childbase.first; bone; bone= bone->next) {
pchan= get_pose_channel(ob->pose, bone->name);
- if(pchan && ED_pose_channel_in_IK_chain(ob, pchan))
+ if(pchan && pose_channel_in_IK_chain(ob, pchan, level + 1))
return 1;
}
return 0;
}
+int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
+{
+ return pose_channel_in_IK_chain(ob, pchan, 0);
+}
+
/* ********************************************** */
/* Motion Paths */
@@ -187,7 +223,7 @@ int ED_pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan)
*
* To be called from various tools that do incremental updates
*/
-void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
+void ED_pose_recalculate_paths(Scene *scene, Object *ob)
{
ListBase targets = {NULL, NULL};
@@ -203,7 +239,7 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
+static int pose_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Scene *scene= CTX_data_scene(C);
@@ -213,7 +249,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
@@ -228,7 +264,7 @@ static int pose_calculate_paths_exec (bContext *C, wmOperator *op)
/* calculate the bones that now have motionpaths... */
// TODO: only make for the selected bones?
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -254,7 +290,7 @@ void POSE_OT_paths_calculate (wmOperatorType *ot)
/* --------- */
/* for the object with pose/action: clear path curves for selected bones only */
-void ED_pose_clear_paths(Object *ob)
+static void ED_pose_clear_paths(Object *ob)
{
bPoseChannel *pchan;
short skipped = 0;
@@ -280,7 +316,7 @@ void ED_pose_clear_paths(Object *ob)
}
/* operator callback for this */
-static int pose_clear_paths_exec (bContext *C, wmOperator *op)
+static int pose_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -289,7 +325,7 @@ static int pose_clear_paths_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if ELEM(NULL, ob, ob->pose)
@@ -321,16 +357,15 @@ void POSE_OT_paths_clear (wmOperatorType *ot)
/* ******************* Select Constraint Target Operator ************* */
-static int pose_select_constraint_target_exec(bContext *C, wmOperator *op)
+static int pose_select_constraint_target_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
- bArmature *arm= ob->data;
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bConstraint *con;
int found= 0;
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone)) {
+ if (pchan->bone->flag & BONE_SELECTED) {
for (con= pchan->constraints.first; con; con= con->next) {
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
@@ -370,6 +405,7 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
/* identifiers */
ot->name= "Select Constraint Target";
ot->idname= "POSE_OT_select_constraint_target";
+ ot->description= "Select bones used as targets for the currently selected bones";
/* api callbacks */
ot->exec= pose_select_constraint_target_exec;
@@ -383,7 +419,7 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= ob->data;
Bone *curbone, *pabone, *chbone;
int direction = RNA_enum_get(op->ptr, "direction");
@@ -400,7 +436,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (pchan->parent == NULL) continue;
else pabone= pchan->parent->bone;
- if ((arm->layer & pabone->layer) && !(pabone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, pabone)) {
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
pabone->flag |= BONE_SELECTED;
arm->act_bone= pabone;
@@ -413,7 +449,7 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
if (pchan->child == NULL) continue;
else chbone = pchan->child->bone;
- if ((arm->layer & chbone->layer) && !(chbone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, chbone)) {
if (!add_to_sel) curbone->flag &= ~BONE_SELECTED;
chbone->flag |= BONE_SELECTED;
arm->act_bone= chbone;
@@ -438,14 +474,15 @@ static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
void POSE_OT_select_hierarchy(wmOperatorType *ot)
{
static EnumPropertyItem direction_items[]= {
- {BONE_SELECT_PARENT, "PARENT", 0, "Select Parent", ""},
- {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""},
- {0, NULL, 0, NULL, NULL}
+ {BONE_SELECT_PARENT, "PARENT", 0, "Select Parent", ""},
+ {BONE_SELECT_CHILD, "CHILD", 0, "Select Child", ""},
+ {0, NULL, 0, NULL, NULL}
};
/* identifiers */
ot->name= "Select Hierarchy";
ot->idname= "POSE_OT_select_hierarchy";
+ ot->description= "Select immediate parent/children of selected bones";
/* api callbacks */
ot->exec= pose_select_hierarchy_exec;
@@ -488,7 +525,7 @@ static short pose_select_same_group (bContext *C, Object *ob, short extend)
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
/* keep track of group as group to use later? */
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone)) {
+ if (pchan->bone->flag & BONE_SELECTED) {
group_flags[pchan->agrp_index] = 1;
tagged= 1;
}
@@ -535,7 +572,7 @@ static short pose_select_same_layer (bContext *C, Object *ob, short extend)
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones)
{
/* keep track of layers to use later? */
- if ((pchan->bone->flag & BONE_SELECTED) || (pchan->bone == arm->act_bone))
+ if (pchan->bone->flag & BONE_SELECTED)
layers |= pchan->bone->layer;
/* deselect all bones before selecting new ones? */
@@ -563,7 +600,7 @@ static short pose_select_same_layer (bContext *C, Object *ob, short extend)
static int pose_select_grouped_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
short extend= RNA_boolean_get(op->ptr, "extend");
short changed = 0;
@@ -603,7 +640,7 @@ void POSE_OT_select_grouped (wmOperatorType *ot)
/* identifiers */
ot->name= "Select Grouped";
- ot->description = "Select all visible bones grouped by various properties";
+ ot->description = "Select all visible bones grouped by similar properties";
ot->idname= "POSE_OT_select_grouped";
/* api callbacks */
@@ -619,13 +656,69 @@ void POSE_OT_select_grouped (wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", "");
}
+
/* ********************************************** */
-void pose_copy_menu(Scene *scene)
+/* context active object, or weightpainted object with armature in posemode */
+static int pose_bone_flip_active_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob_act= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(ob_act);
+
+ if(ob && (ob->mode & OB_MODE_POSE)) {
+ bArmature *arm= ob->data;
+
+ if(arm->act_bone) {
+ bPoseChannel *pchanf;
+ char name[MAXBONENAME];
+ flip_side_name(name, arm->act_bone->name, TRUE);
+
+ pchanf= get_pose_channel(ob->pose, name);
+ if(pchanf && pchanf->bone != arm->act_bone) {
+ arm->act_bone->flag &= ~BONE_SELECTED;
+ pchanf->bone->flag |= BONE_SELECTED;
+
+ arm->act_bone= pchanf->bone;
+
+ /* in weightpaint we select the associated vertex group too */
+ if(ob_act->mode & OB_MODE_WEIGHT_PAINT) {
+ ED_vgroup_select_by_name(ob_act, name);
+ DAG_id_tag_update(&ob_act->id, OB_RECALC_DATA);
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, ob);
+
+ return OPERATOR_FINISHED;
+ }
+ }
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+void POSE_OT_select_flip_active(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Flip Selected Active Bone";
+ ot->idname= "POSE_OT_select_flip_active";
+ ot->description= "Activate the bone with a flipped name.";
+
+ /* api callbacks */
+ ot->exec= pose_bone_flip_active_exec;
+ ot->poll= ED_operator_posemode;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+/* ********************************************** */
+#if 0 /* UNUSED 2.5 */
+static void pose_copy_menu(Scene *scene)
{
Object *obedit= scene->obedit; // XXX context
Object *ob= OBACT;
- bArmature *arm= ob->data;
+ bArmature *arm;
bPoseChannel *pchan, *pchanact;
short nr=0;
int i=0;
@@ -638,11 +731,12 @@ void pose_copy_menu(Scene *scene)
if (pchan==NULL) return;
pchanact= pchan;
-
+ arm= ob->data;
+
/* if proxy-protected bones selected, some things (such as locks + displays) shouldn't be changable,
* but for constraints (just add local constraints)
*/
- if (pose_has_protected_selected(ob, 1, 0)) {
+ if (pose_has_protected_selected(ob, 0)) {
i= BLI_countlist(&(pchanact->constraints)); /* if there are 24 or less, allow for the user to select constraints */
if (i < 25)
nr= pupmenu("Copy Pose Attributes %t|Local Location%x1|Local Rotation%x2|Local Size%x3|%l|Visual Location %x9|Visual Rotation%x10|Visual Size%x11|%l|Constraints (All)%x4|Constraints...%x5");
@@ -692,7 +786,7 @@ void pose_copy_menu(Scene *scene)
for (con= tmp_constraints.first; con; con= con->next)
con->flag |= CONSTRAINT_PROXY_LOCAL;
}
- addlisttolist(&pchan->constraints, &tmp_constraints);
+ BLI_movelisttolist(&pchan->constraints, &tmp_constraints);
/* update flags (need to add here, not just copy) */
pchan->constflag |= pchanact->constflag;
@@ -754,7 +848,7 @@ void pose_copy_menu(Scene *scene)
}
else { /* constraints, optional (note: max we can have is 24 constraints) */
bConstraint *con, *con_back;
- int const_toggle[24];
+ int const_toggle[24]= {0}; /* XXX, initialize as 0 to quiet errors */
ListBase const_copy = {NULL, NULL};
BLI_duplicatelist(&const_copy, &(pchanact->constraints));
@@ -794,14 +888,12 @@ void pose_copy_menu(Scene *scene)
* appending to list of constraints for this channel
*/
copy_constraints(&tmp_constraints, &const_copy, TRUE);
- if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) {
- bConstraint *con;
-
+ if ((ob->proxy) && (pchan->bone->layer & arm->layer_protected)) {
/* add proxy-local tags */
for (con= tmp_constraints.first; con; con= con->next)
con->flag |= CONSTRAINT_PROXY_LOCAL;
}
- addlisttolist(&pchan->constraints, &tmp_constraints);
+ BLI_movelisttolist(&pchan->constraints, &tmp_constraints);
/* update flags (need to add here, not just copy) */
pchan->constflag |= pchanact->constflag;
@@ -814,11 +906,12 @@ void pose_copy_menu(Scene *scene)
ob->pose->flag |= POSE_RECALC;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); // and all its relations
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); // and all its relations
BIF_undo_push("Copy Pose Attributes");
}
+#endif
/* ******************** copy/paste pose ********************** */
@@ -849,7 +942,7 @@ void free_posebuf(void)
static int pose_copy_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* sanity checking */
if ELEM(NULL, ob, ob->pose) {
@@ -888,9 +981,10 @@ void POSE_OT_copy (wmOperatorType *ot)
static int pose_paste_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *chan, *pchan;
int flip= RNA_boolean_get(op->ptr, "flipped");
+ int selOnly= RNA_boolean_get(op->ptr, "selected_mask");
/* sanity checks */
if ELEM(NULL, ob, ob->pose)
@@ -904,17 +998,28 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
/* Safely merge all of the channels in the buffer pose into any existing pose */
for (chan= g_posebuf->chanbase.first; chan; chan=chan->next) {
if (chan->flag & POSE_KEY) {
- /* get the name - if flipping, we must flip this first */
char name[32];
+ short paste_ok;
+
+ /* get the name - if flipping, we must flip this first */
if (flip)
flip_side_name(name, chan->name, 0); /* 0 = don't strip off number extensions */
else
BLI_strncpy(name, chan->name, sizeof(name));
-
- /* only copy when channel exists, poses are not meant to add random channels to anymore */
+
+ /* only copy when:
+ * 1) channel exists - poses are not meant to add random channels to anymore
+ * 2) if selection-masking is on, channel is selected - only selected bones get pasted on, allowing making both sides symmetrical
+ */
pchan= get_pose_channel(ob->pose, name);
- if (pchan) {
+ if (selOnly)
+ paste_ok= ((pchan) && (pchan->bone->flag & BONE_SELECTED));
+ else
+ paste_ok= ((pchan != NULL));
+
+ /* continue? */
+ if (paste_ok) {
/* only loc rot size
* - only copies transform info for the pose
*/
@@ -978,6 +1083,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
else {
float eul[3];
+ normalize_qt(pchan->quat);
quat_to_eul(eul, pchan->quat);
eul[1]*= -1;
eul[2]*= -1;
@@ -1005,16 +1111,9 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
/* keyframing tagging */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
- KeyingSet *ks = NULL;
- /* get KeyingSet to use
- * - use the active KeyingSet if defined (and user wants to use it for all autokeying),
- * or otherwise key transforms only
- */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (scene->active_keyingset))
- ks = ANIM_scene_get_active_keyingset(scene);
- else
- ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
+ /* get KeyingSet to use */
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "LocRotScale");
/* now insert the keyframe(s) using the Keying Set
* 1) add datasource override for the PoseChannel
@@ -1039,7 +1138,7 @@ static int pose_paste_exec (bContext *C, wmOperator *op)
}
/* Update event for pose and deformation children */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1062,13 +1161,14 @@ void POSE_OT_paste (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_boolean(ot->srna, "flipped", 0, "Flipped on X-Axis", "");
+ RNA_def_boolean(ot->srna, "flipped", 0, "Flipped on X-Axis", "Paste the stored pose flipped on to current pose");
+ RNA_def_boolean(ot->srna, "selected_mask", 0, "On Selected Only", "Only paste the stored post on to selected bones in the current pose");
}
/* ********************************************** */
-static int pose_group_add_exec (bContext *C, wmOperator *op)
+static int pose_group_add_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1077,7 +1177,7 @@ static int pose_group_add_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1108,7 +1208,7 @@ void POSE_OT_group_add (wmOperatorType *ot)
}
-static int pose_group_remove_exec (bContext *C, wmOperator *op)
+static int pose_group_remove_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1117,7 +1217,7 @@ static int pose_group_remove_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object */
if (ob == NULL)
@@ -1150,7 +1250,7 @@ void POSE_OT_group_remove (wmOperatorType *ot)
/* ------------ */
/* invoke callback which presents a list of bone-groups for the user to choose from */
-static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1165,7 +1265,7 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1175,20 +1275,20 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt)
/* if there's no active group (or active is invalid), create a new menu to find it */
if (pose->active_group <= 0) {
/* create a new menu, and start populating it with group names */
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
/* special entry - allow to create new group, then use that
* (not to be used for removing though)
*/
if (strstr(op->idname, "assign")) {
- uiItemIntO(layout, "New Group", 0, op->idname, "type", 0);
+ uiItemIntO(layout, "New Group", ICON_NULL, op->idname, "type", 0);
uiItemS(layout);
}
/* add entries for each group */
for (grp= pose->agroups.first, i=1; grp; grp=grp->next, i++)
- uiItemIntO(layout, grp->name, 0, op->idname, "type", i);
+ uiItemIntO(layout, grp->name, ICON_NULL, op->idname, "type", i);
/* finish building the menu, and process it (should result in calling self again) */
uiPupMenuEnd(C, pup);
@@ -1207,7 +1307,6 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
- bArmature *arm;
bPose *pose;
short done= 0;
@@ -1215,12 +1314,12 @@ static int pose_group_assign_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
- arm= ob->data;
+
pose= ob->pose;
/* set the active group number to the one from operator props
@@ -1268,25 +1367,21 @@ void POSE_OT_group_assign (wmOperatorType *ot)
}
-static int pose_group_unassign_exec (bContext *C, wmOperator *op)
+static int pose_group_unassign_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
- bArmature *arm;
- bPose *pose;
short done= 0;
/* since this call may also be used from the buttons window, we need to check for where to get the object */
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
return OPERATOR_CANCELLED;
- pose= ob->pose;
- arm= ob->data;
/* find selected bones to remove from all bone groups */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -1343,7 +1438,7 @@ static void pose_group_select(bContext *C, Object *ob, int select)
CTX_DATA_END;
}
-static int pose_group_select_exec (bContext *C, wmOperator *op)
+static int pose_group_select_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1352,7 +1447,7 @@ static int pose_group_select_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1381,7 +1476,7 @@ void POSE_OT_group_select (wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int pose_group_deselect_exec (bContext *C, wmOperator *op)
+static int pose_group_deselect_exec (bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
Object *ob;
@@ -1390,7 +1485,7 @@ static int pose_group_deselect_exec (bContext *C, wmOperator *op)
if (sa->spacetype == SPACE_BUTS)
ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
else
- ob= CTX_data_active_object(C);
+ ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only continue if there's an object, and a pose there too */
if (ELEM(NULL, ob, ob->pose))
@@ -1421,9 +1516,9 @@ void POSE_OT_group_deselect (wmOperatorType *ot)
/* ********************************************** */
-static int pose_flip_names_exec (bContext *C, wmOperator *op)
+static int pose_flip_names_exec (bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm;
/* paranoia checks */
@@ -1441,7 +1536,7 @@ static int pose_flip_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1454,7 +1549,7 @@ void POSE_OT_flip_names (wmOperatorType *ot)
/* identifiers */
ot->name= "Flip Names";
ot->idname= "POSE_OT_flip_names";
- ot->description= "Flips (and corrects) the names of selected bones";
+ ot->description= "Flips (and corrects) the axis suffixes of the the names of selected bones";
/* api callbacks */
ot->exec= pose_flip_names_exec;
@@ -1468,7 +1563,7 @@ void POSE_OT_flip_names (wmOperatorType *ot)
static int pose_autoside_names_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm;
char newname[32];
short axis= RNA_enum_get(op->ptr, "axis");
@@ -1488,7 +1583,7 @@ static int pose_autoside_names_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* since we renamed stuff... */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
@@ -1523,51 +1618,68 @@ void POSE_OT_autoside_names (wmOperatorType *ot)
/* ********************************************** */
-/* context active object, or weightpainted object with armature in posemode */
-void pose_activate_flipped_bone(Scene *scene)
+/* Show all armature layers */
+static int pose_armature_layers_showall_poll (bContext *C)
{
- Object *ob= OBACT;
- bArmature *arm= ob->data;
-
- if(ob==NULL) return;
-
- if(ob->mode & OB_MODE_WEIGHT_PAINT) {
- ob= modifiers_isDeformedByArmature(ob);
- }
- if(ob && (ob->mode & OB_MODE_POSE)) {
- bPoseChannel *pchanf;
-
- if(arm->act_bone) {
- char name[32];
- flip_side_name(name, arm->act_bone->name, TRUE);
-
- pchanf= get_pose_channel(ob->pose, name);
- if(pchanf && pchanf->bone != arm->act_bone) {
- arm->act_bone->flag &= ~BONE_SELECTED;
- pchanf->bone->flag |= BONE_SELECTED;
-
- arm->act_bone= pchanf->bone;
+ /* this single operator can be used in posemode OR editmode for armatures */
+ return ED_operator_posemode(C) || ED_operator_editarmature(C);
+}
- /* in weightpaint we select the associated vertex group too */
- if(ob->mode & OB_MODE_WEIGHT_PAINT) {
- ED_vgroup_select_by_name(OBACT, name);
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
- }
-
- // XXX notifiers need to be sent to other editors to update
-
- }
- }
- }
+static int pose_armature_layers_showall_exec (bContext *C, wmOperator *op)
+{
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ bArmature *arm = (ob)? ob->data : NULL;
+ PointerRNA ptr;
+ int maxLayers = (RNA_boolean_get(op->ptr, "all"))? 32 : 16;
+ int layers[32] = {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ int i;
+
+ /* sanity checking */
+ if (arm == NULL)
+ return OPERATOR_CANCELLED;
+
+ /* use RNA to set the layers
+ * although it would be faster to just set directly using bitflags, we still
+ * need to setup a RNA pointer so that we get the "update" callbacks for free...
+ */
+ RNA_id_pointer_create(&arm->id, &ptr);
+
+ for (i = 0; i < maxLayers; i++)
+ layers[i] = 1;
+
+ RNA_boolean_set_array(&ptr, "layers", layers);
+
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
+
+ /* done */
+ return OPERATOR_FINISHED;
}
+void ARMATURE_OT_layers_show_all (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Show All Layers";
+ ot->idname= "ARMATURE_OT_layers_show_all";
+ ot->description= "Make all armature layers visible";
+
+ /* callbacks */
+ ot->exec= pose_armature_layers_showall_exec;
+ ot->poll= pose_armature_layers_showall_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All Layers", "Enable all layers or just the first 16 (top row)");
+}
-/* ********************************************** */
+/* ------------------- */
/* Present a popup to get the layers that should be used */
static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1588,7 +1700,7 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_armature_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1650,11 +1762,9 @@ void ARMATURE_OT_armature_layers (wmOperatorType *ot)
/* Present a popup to get the layers that should be used */
static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-
- /* get layers that are active already */
- memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */
+ int layers[32]= {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ /* get layers that are active already */
CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
{
short bit;
@@ -1677,7 +1787,7 @@ static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
@@ -1724,11 +1834,9 @@ void POSE_OT_bone_layers (wmOperatorType *ot)
/* Present a popup to get the layers that should be used */
static int armature_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
- int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
+ int layers[32]= {0}; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
/* get layers that are active already */
- memset(&layers, 0, sizeof(layers)); /* set all layers to be off by default */
-
CTX_DATA_BEGIN(C, EditBone *, ebone, selected_editable_bones)
{
short bit;
@@ -1795,10 +1903,10 @@ void ARMATURE_OT_bone_layers (wmOperatorType *ot)
/* ********************************************** */
-static int pose_flip_quats_exec (bContext *C, wmOperator *op)
+static int pose_flip_quats_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
KeyingSet *ks = ANIM_builtin_keyingset_get_named(NULL, "LocRotScale");
/* loop through all selected pchans, flipping and keying (as needed) */
@@ -1807,11 +1915,8 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op)
/* only if bone is using quaternion rotation */
if (pchan->rotmode == ROT_MODE_QUAT) {
/* quaternions have 720 degree range */
- pchan->quat[0]= -pchan->quat[0];
- pchan->quat[1]= -pchan->quat[1];
- pchan->quat[2]= -pchan->quat[2];
- pchan->quat[3]= -pchan->quat[3];
-
+ negate_v4(pchan->quat);
+
/* tagging */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
@@ -1839,7 +1944,7 @@ static int pose_flip_quats_exec (bContext *C, wmOperator *op)
CTX_DATA_END;
/* notifiers and updates */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
return OPERATOR_FINISHED;
@@ -1863,9 +1968,9 @@ void POSE_OT_quaternions_flip (wmOperatorType *ot)
/* ********************************************** */
/* context: active channel */
+#if 0
void pose_special_editmenu(Scene *scene)
{
-#if 0
Object *obedit= scene->obedit; // XXX context
Object *ob= OBACT;
short nr;
@@ -1888,7 +1993,7 @@ void pose_special_editmenu(Scene *scene)
pose_clear_paths(ob);
}
else if(nr==5) {
- pose_clear_user_transforms(scene, ob);
+ pose_clear_user_transforms(ob);
}
else if(nr==6) {
pose_relax();
@@ -1896,11 +2001,11 @@ void pose_special_editmenu(Scene *scene)
else if(ELEM3(nr, 7, 8, 9)) {
pose_autoside_names(nr-7);
}
-#endif
}
+
/* Restore selected pose-bones to 'action'-defined pose */
-void pose_clear_user_transforms(Scene *scene, Object *ob)
+static void pose_clear_user_transforms(Object *ob)
{
bArmature *arm= ob->data;
bPoseChannel *pchan;
@@ -1928,7 +2033,8 @@ void pose_clear_user_transforms(Scene *scene, Object *ob)
rest_pose(ob->pose);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIF_undo_push("Clear User Transform");
}
+#endif
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index 3f3ae8fe377..3def3dbf611 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_ghash.h"
@@ -59,9 +60,10 @@
#include "reeb.h"
-
-ReebGraph *GLOBAL_RG = NULL;
-ReebGraph *FILTERED_RG = NULL;
+#if 0 /* UNUSED 2.5 */
+static ReebGraph *GLOBAL_RG = NULL;
+static ReebGraph *FILTERED_RG = NULL;
+#endif
/*
* Skeleton generation algorithm based on:
@@ -113,7 +115,7 @@ void flipArcBuckets(ReebArc *arc);
/***************************************** UTILS **********************************************/
-VertexData *allocVertexData(EditMesh *em)
+static VertexData *allocVertexData(EditMesh *em)
{
VertexData *data;
EditVert *eve;
@@ -133,27 +135,27 @@ VertexData *allocVertexData(EditMesh *em)
return data;
}
-int indexData(EditVert *eve)
+static int indexData(EditVert *eve)
{
return ((VertexData*)eve->tmp.p)->i;
}
-float weightData(EditVert *eve)
+static float weightData(EditVert *eve)
{
return ((VertexData*)eve->tmp.p)->w;
}
-void weightSetData(EditVert *eve, float w)
+static void weightSetData(EditVert *eve, float w)
{
((VertexData*)eve->tmp.p)->w = w;
}
-ReebNode* nodeData(EditVert *eve)
+static ReebNode* nodeData(EditVert *eve)
{
return ((VertexData*)eve->tmp.p)->n;
}
-void nodeSetData(EditVert *eve, ReebNode *n)
+static void nodeSetData(EditVert *eve, ReebNode *n)
{
((VertexData*)eve->tmp.p)->n = n;
}
@@ -205,7 +207,7 @@ void REEB_freeGraph(ReebGraph *rg)
MEM_freeN(rg);
}
-ReebGraph * newReebGraph()
+ReebGraph * newReebGraph(void)
{
ReebGraph *rg;
rg = MEM_callocN(sizeof(ReebGraph), "reeb graph");
@@ -230,7 +232,7 @@ void BIF_flagMultiArcs(ReebGraph *rg, int flag)
}
}
-ReebNode * addNode(ReebGraph *rg, EditVert *eve)
+static ReebNode * addNode(ReebGraph *rg, EditVert *eve)
{
float weight;
ReebNode *node = NULL;
@@ -255,7 +257,7 @@ ReebNode * addNode(ReebGraph *rg, EditVert *eve)
return node;
}
-ReebNode * copyNode(ReebGraph *rg, ReebNode *node)
+static ReebNode * copyNode(ReebGraph *rg, ReebNode *node)
{
ReebNode *cp_node = NULL;
@@ -276,7 +278,7 @@ ReebNode * copyNode(ReebGraph *rg, ReebNode *node)
return cp_node;
}
-void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg)
+static void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg)
{
ReebNode *low_node, *high_node;
@@ -319,7 +321,7 @@ ReebNode *BIF_lowestLevelNode(ReebNode *node)
return node;
}
-ReebArc * copyArc(ReebGraph *rg, ReebArc *arc)
+static ReebArc * copyArc(ReebGraph *rg, ReebArc *arc)
{
ReebArc *cp_arc;
ReebNode *node;
@@ -365,7 +367,7 @@ ReebArc * copyArc(ReebGraph *rg, ReebArc *arc)
return cp_arc;
}
-ReebGraph * copyReebGraph(ReebGraph *rg, int level)
+static ReebGraph * copyReebGraph(ReebGraph *rg, int level)
{
ReebNode *node;
ReebArc *arc;
@@ -406,7 +408,7 @@ ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node)
return multi_rg;
}
-ReebEdge * copyEdge(ReebEdge *edge)
+static ReebEdge * copyEdge(ReebEdge *edge)
{
ReebEdge *newEdge = NULL;
@@ -419,7 +421,7 @@ ReebEdge * copyEdge(ReebEdge *edge)
return newEdge;
}
-void printArc(ReebArc *arc)
+static void printArc(ReebArc *arc)
{
ReebEdge *edge;
ReebNode *head = (ReebNode*)arc->head;
@@ -432,7 +434,7 @@ void printArc(ReebArc *arc)
}
}
-void flipArc(ReebArc *arc)
+static void flipArc(ReebArc *arc)
{
ReebNode *tmp;
tmp = arc->head;
@@ -443,7 +445,7 @@ void flipArc(ReebArc *arc)
}
#ifdef DEBUG_REEB_NODE
-void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
+static void NodeDegreeDecrement(ReebGraph *UNUSED(rg), ReebNode *node)
{
node->degree--;
@@ -453,7 +455,7 @@ void NodeDegreeDecrement(ReebGraph *rg, ReebNode *node)
// }
}
-void NodeDegreeIncrement(ReebGraph *rg, ReebNode *node)
+static void NodeDegreeIncrement(ReebGraph *UNUSED(rg), ReebNode *node)
{
// if (node->degree == 0)
// {
@@ -524,7 +526,7 @@ void verifyNodeDegree(ReebGraph *rg)
#endif
}
-void verifyBucketsArc(ReebGraph *rg, ReebArc *arc)
+static void verifyBucketsArc(ReebGraph *UNUSED(rg), ReebArc *arc)
{
ReebNode *head = (ReebNode*)arc->head;
ReebNode *tail = (ReebNode*)arc->tail;
@@ -591,7 +593,7 @@ void verifyArcs(ReebGraph *rg)
}
}
-void verifyMultiResolutionLinks(ReebGraph *rg, int level)
+static void verifyMultiResolutionLinks(ReebGraph *rg, int level)
{
#ifdef DEBUG_REEB
ReebGraph *lower_rg = rg->link_up;
@@ -604,7 +606,7 @@ void verifyMultiResolutionLinks(ReebGraph *rg, int level)
{
if (BLI_findindex(&lower_rg->arcs, arc->link_up) == -1)
{
- printf("missing arc %p for level %i\n", arc->link_up, level);
+ printf("missing arc %p for level %i\n", (void *)arc->link_up, level);
printf("Source arc was ---\n");
printArc(arc);
@@ -619,21 +621,23 @@ void verifyMultiResolutionLinks(ReebGraph *rg, int level)
}
/***************************************** BUCKET UTILS **********************************************/
-void addVertToBucket(EmbedBucket *b, float co[3])
+static void addVertToBucket(EmbedBucket *b, float co[3])
{
b->nv++;
interp_v3_v3v3(b->p, b->p, co, 1.0f / b->nv);
}
-void removeVertFromBucket(EmbedBucket *b, float co[3])
+#if 0 /* UNUSED 2.5 */
+static void removeVertFromBucket(EmbedBucket *b, float co[3])
{
mul_v3_fl(b->p, (float)b->nv);
sub_v3_v3(b->p, co);
b->nv--;
mul_v3_fl(b->p, 1.0f / (float)b->nv);
}
+#endif
-void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc)
+static void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc)
{
if (bDst->nv > 0 && bSrc->nv > 0)
{
@@ -647,7 +651,7 @@ void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc)
}
}
-void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end)
+static void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end)
{
if (aDst->bcount > 0 && aSrc->bcount > 0)
{
@@ -691,12 +695,12 @@ void flipArcBuckets(ReebArc *arc)
}
}
-int countArcBuckets(ReebArc *arc)
+static int countArcBuckets(ReebArc *arc)
{
return (int)(floor(arc->tail->weight) - ceil(arc->head->weight)) + 1;
}
-void allocArcBuckets(ReebArc *arc)
+static void allocArcBuckets(ReebArc *arc)
{
int i;
float start = ceil(arc->head->weight);
@@ -718,7 +722,7 @@ void allocArcBuckets(ReebArc *arc)
}
-void resizeArcBuckets(ReebArc *arc)
+static void resizeArcBuckets(ReebArc *arc)
{
EmbedBucket *oldBuckets = arc->buckets;
int oldBCount = arc->bcount;
@@ -760,7 +764,7 @@ void resizeArcBuckets(ReebArc *arc)
}
}
-void reweightBuckets(ReebArc *arc)
+static void reweightBuckets(ReebArc *arc)
{
int i;
float start = ceil((arc->head)->weight);
@@ -789,7 +793,7 @@ static void interpolateBuckets(ReebArc *arc, float *start_p, float *end_p, int s
}
}
-void fillArcEmptyBuckets(ReebArc *arc)
+static void fillArcEmptyBuckets(ReebArc *arc)
{
float *start_p, *end_p;
int start_index = 0, end_index = 0;
@@ -904,7 +908,7 @@ static void ExtendArcBuckets(ReebArc *arc)
}
/* CALL THIS ONLY AFTER FILTERING, SINCE IT MESSES UP WEIGHT DISTRIBUTION */
-void extendGraphBuckets(ReebGraph *rg)
+static void extendGraphBuckets(ReebGraph *rg)
{
ReebArc *arc;
@@ -916,7 +920,7 @@ void extendGraphBuckets(ReebGraph *rg)
/**************************************** LENGTH CALCULATIONS ****************************************/
-void calculateArcLength(ReebArc *arc)
+static void calculateArcLength(ReebArc *arc)
{
ReebArcIterator arc_iter;
BArcIterator *iter = (BArcIterator*)&arc_iter;
@@ -941,7 +945,7 @@ void calculateArcLength(ReebArc *arc)
arc->length += len_v3v3(arc->tail->p, vec1);
}
-void calculateGraphLength(ReebGraph *rg)
+static void calculateGraphLength(ReebGraph *rg)
{
ReebArc *arc;
@@ -1196,7 +1200,7 @@ void postprocessGraph(ReebGraph *rg, char mode)
/********************************************SORTING****************************************************/
-int compareNodesWeight(void *vnode1, void *vnode2)
+static int compareNodesWeight(void *vnode1, void *vnode2)
{
ReebNode *node1 = (ReebNode*)vnode1;
ReebNode *node2 = (ReebNode*)vnode2;
@@ -1220,7 +1224,7 @@ void sortNodes(ReebGraph *rg)
BLI_sortlist(&rg->nodes, compareNodesWeight);
}
-int compareArcsWeight(void *varc1, void *varc2)
+static int compareArcsWeight(void *varc1, void *varc2)
{
ReebArc *arc1 = (ReebArc*)varc1;
ReebArc *arc2 = (ReebArc*)varc2;
@@ -1247,7 +1251,7 @@ void sortArcs(ReebGraph *rg)
}
/******************************************* JOINING ***************************************************/
-void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_weight)
+static void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_weight)
{
ReebNode *node;
float old_weight;
@@ -1292,7 +1296,7 @@ void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_
}
}
-void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight)
+static void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight)
{
int i;
@@ -1307,7 +1311,7 @@ void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight)
start_node->weight = start_weight;
}
-int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs)
+static int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs)
{
int joined = 0;
int subgraph;
@@ -1389,7 +1393,7 @@ int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs)
}
/* Reweight graph from smallest node, fix fliped arcs */
-void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs)
+static void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs)
{
int subgraph;
@@ -1416,7 +1420,7 @@ void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs)
}
}
-int joinSubgraphs(ReebGraph *rg, float threshold)
+static int joinSubgraphs(ReebGraph *rg, float threshold)
{
int nb_subgraphs;
int joined = 0;
@@ -1457,7 +1461,7 @@ int joinSubgraphs(ReebGraph *rg, float threshold)
/****************************************** FILTERING **************************************************/
-float lengthArc(ReebArc *arc)
+static float lengthArc(ReebArc *arc)
{
#if 0
ReebNode *head = (ReebNode*)arc->head;
@@ -1469,7 +1473,7 @@ float lengthArc(ReebArc *arc)
#endif
}
-int compareArcs(void *varc1, void *varc2)
+static int compareArcs(void *varc1, void *varc2)
{
ReebArc *arc1 = (ReebArc*)varc1;
ReebArc *arc2 = (ReebArc*)varc2;
@@ -1490,7 +1494,7 @@ int compareArcs(void *varc1, void *varc2)
}
}
-void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging)
+static void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging)
{
ReebArc *arc = NULL, *nextArc = NULL;
@@ -1602,7 +1606,7 @@ void filterNullReebGraph(ReebGraph *rg)
}
}
-int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, float threshold_external)
+static int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, float threshold_external)
{
ReebArc *arc = NULL, *nextArc = NULL;
int value = 0;
@@ -1693,7 +1697,7 @@ int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, flo
return value;
}
-int filterCyclesReebGraph(ReebGraph *rg, float distance_threshold)
+static int filterCyclesReebGraph(ReebGraph *rg, float UNUSED(distance_threshold))
{
ReebArc *arc1, *arc2;
ReebArc *next2;
@@ -1724,7 +1728,7 @@ int filterCyclesReebGraph(ReebGraph *rg, float distance_threshold)
return filtered;
}
-int filterSmartReebGraph(ReebGraph *rg, float threshold)
+int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold))
{
int value = 0;
#if 0 //XXX
@@ -1900,7 +1904,7 @@ int filterSmartReebGraph(ReebGraph *rg, float threshold)
return value;
}
-void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external)
+static void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external)
{
int done = 1;
@@ -1939,7 +1943,7 @@ void filterGraph(ReebGraph *rg, short options, float threshold_internal, float t
removeNormalNodes(rg);
}
-void finalizeGraph(ReebGraph *rg, char passes, char method)
+static void finalizeGraph(ReebGraph *rg, char passes, char method)
{
int i;
@@ -1959,7 +1963,7 @@ void finalizeGraph(ReebGraph *rg, char passes, char method)
/************************************** WEIGHT SPREADING ***********************************************/
-int compareVerts( const void* a, const void* b )
+static int compareVerts( const void* a, const void* b )
{
EditVert *va = *(EditVert**)a;
EditVert *vb = *(EditVert**)b;
@@ -1977,7 +1981,7 @@ int compareVerts( const void* a, const void* b )
return value;
}
-void spreadWeight(EditMesh *em)
+static void spreadWeight(EditMesh *em)
{
EditVert **verts, *eve;
float lastWeight = 0.0f;
@@ -2019,7 +2023,7 @@ void spreadWeight(EditMesh *em)
/******************************************** EXPORT ***************************************************/
-void exportNode(FILE *f, char *text, ReebNode *node)
+static void exportNode(FILE *f, const char *text, ReebNode *node)
{
fprintf(f, "%s i:%i w:%f d:%i %f %f %f\n", text, node->index, node->weight, node->degree, node->p[0], node->p[1], node->p[2]);
}
@@ -2065,7 +2069,7 @@ void REEB_exportGraph(ReebGraph *rg, int count)
/***************************************** MAIN ALGORITHM **********************************************/
/* edges alone will create zero degree nodes, use this function to remove them */
-void removeZeroNodes(ReebGraph *rg)
+static void removeZeroNodes(ReebGraph *rg)
{
ReebNode *node, *next_node;
@@ -2151,12 +2155,12 @@ void removeNormalNodes(ReebGraph *rg)
}
-int edgeEquals(ReebEdge *e1, ReebEdge *e2)
+static int edgeEquals(ReebEdge *e1, ReebEdge *e2)
{
return (e1->v1 == e2->v1 && e1->v2 == e2->v2);
}
-ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e)
+static ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e)
{
ReebEdge *nextEdge = NULL;
ReebEdge *edge = NULL;
@@ -2181,7 +2185,7 @@ void addFacetoArc(ReebArc *arc, EditFace *efa)
BLI_ghash_insert(arc->faces, efa, efa);
}
-void mergeArcFaces(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc)
+void mergeArcFaces(ReebGraph *UNUSED(rg), ReebArc *aDst, ReebArc *aSrc)
{
GHashIterator ghi;
@@ -2205,7 +2209,7 @@ void mergeArcEdges(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc, MergeDirection d
e->arc = aDst; // Edge is stolen by new arc
}
- addlisttolist(&aDst->edges , &aSrc->edges);
+ BLI_movelisttolist(&aDst->edges , &aSrc->edges);
}
else
{
@@ -2385,7 +2389,7 @@ int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1)
return result;
}
-void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, ReebEdge *e1)
+static void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, ReebEdge *e1)
{
int total = 0;
while (total == 0 && a0 != a1 && a0 != NULL && a1 != NULL)
@@ -2406,7 +2410,7 @@ void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, Reeb
}
}
-void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2)
+static void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2)
{
ReebArc *a0, *a1, *a2;
a0 = e0->arc;
@@ -2417,7 +2421,7 @@ void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2)
glueByMergeSort(rg, a0, a2, e0, e2);
}
-ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
+static ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
{
ReebEdge *edge;
@@ -2499,7 +2503,7 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2)
return edge;
}
-void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3, EditFace *efa)
+static void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3, EditFace *efa)
{
ReebEdge *re1, *re2, *re3;
ReebEdge *e1, *e2, *e3;
@@ -2558,10 +2562,10 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
EditVert *eve;
EditFace *efa;
int index;
- int totvert;
- int totfaces;
+ /*int totvert;*/
#ifdef DEBUG_REEB
+ int totfaces;
int countfaces = 0;
#endif
@@ -2569,8 +2573,10 @@ ReebGraph * generateReebGraph(EditMesh *em, int subdivisions)
rg->resolution = subdivisions;
- totvert = BLI_countlist(&em->verts);
+ /*totvert = BLI_countlist(&em->verts);*/ /*UNUSED*/
+#ifdef DEBUG_REEB
totfaces = BLI_countlist(&em->faces);
+#endif
renormalizeWeight(em, 1.0f);
@@ -2641,7 +2647,7 @@ void renormalizeWeight(EditMesh *em, float newmax)
eve = em->verts.first;
minimum = weightData(eve);
maximum = minimum;
- for(eve = em->verts.first; eve; eve = eve->next)
+ for(; eve; eve = eve->next)
{
maximum = MAX2(maximum, weightData(eve));
minimum = MIN2(minimum, weightData(eve));
@@ -2690,7 +2696,7 @@ static float cotan_weight(float *v1, float *v2, float *v3)
return dot_v3v3(a, b)/clen;
}
-void addTriangle(EditVert *v1, EditVert *v2, EditVert *v3, int e1, int e2, int e3)
+static void addTriangle(EditVert *v1, EditVert *v2, EditVert *v3, int e1, int e2, int e3)
{
/* Angle opposite e1 */
float t1= cotan_weight(v1->co, v2->co, v3->co) / e2;
@@ -2886,7 +2892,7 @@ EditEdge * NextEdgeForVert(EdgeIndex *indexed_edges, int index)
return indexed_edges->edges[offset];
}
-void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *indexed_edges)
+static void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *indexed_edges)
{
Heap *edge_heap;
EditVert *current_eve = NULL;
@@ -2950,13 +2956,13 @@ void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *ind
BLI_heap_free(edge_heap, NULL);
}
-void freeEdgeIndex(EdgeIndex *indexed_edges)
+static void freeEdgeIndex(EdgeIndex *indexed_edges)
{
MEM_freeN(indexed_edges->offset);
MEM_freeN(indexed_edges->edges);
}
-void buildIndexedEdges(EditMesh *em, EdgeIndex *indexed_edges)
+static void buildIndexedEdges(EditMesh *em, EdgeIndex *indexed_edges)
{
EditVert *eve;
EditEdge *eed;
diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h
index 3bebc423235..05fba609041 100644
--- a/source/blender/editors/armature/reeb.h
+++ b/source/blender/editors/armature/reeb.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -149,7 +149,7 @@ void angleToVCol(struct EditMesh *em, int index);
void renormalizeWeight(struct EditMesh *em, float newmax);
ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
-ReebGraph * newReebGraph();
+ReebGraph * newReebGraph(void);
void initArcIterator(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
void initArcIterator2(BArcIterator *iter, struct ReebArc *arc, int start, int end);
@@ -172,6 +172,8 @@ void sortArcs(ReebGraph *rg);
/*------------ Sanity check ------------*/
void verifyBuckets(ReebGraph *rg);
void verifyFaces(ReebGraph *rg);
+void verifyArcs(ReebGraph *rg);
+void verifyNodeDegree(ReebGraph *rg);
/*********************** PUBLIC *********************************/
@@ -195,7 +197,7 @@ ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
void REEB_freeGraph(ReebGraph *rg);
void REEB_freeArc(BArc *barc);
void REEB_exportGraph(ReebGraph *rg, int count);
-void REEB_draw();
+void REEB_draw(void);
#endif /*REEB_H_*/
diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt
index ab45d73a2de..a73fb9502a6 100644
--- a/source/blender/editors/curve/CMakeLists.txt
+++ b/source/blender/editors/curve/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../makesdna
../../makesrna
@@ -31,4 +30,13 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_curve "${SRC}" "${INC}")
+set(SRC
+ curve_ops.c
+ editcurve.c
+ editfont.c
+ lorem.c
+
+ curve_intern.h
+)
+
+blender_add_lib(bf_editor_curve "${SRC}" "${INC}")
diff --git a/source/blender/editors/curve/Makefile b/source/blender/editors/curve/Makefile
deleted file mode 100644
index d9c51c7420e..00000000000
--- a/source/blender/editors/curve/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_curve
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/curve/SConscript b/source/blender/editors/curve/SConscript
index 299d37aa1b8..721b269edf3 100644
--- a/source/blender/editors/curve/SConscript
+++ b/source/blender/editors/curve/SConscript
@@ -5,7 +5,11 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../gpu ../../bmesh'
+=======
+incs += ' ../../gpu ../../blenloader'
+>>>>>>> .merge-right.r35190
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
env.BlenderLib ( 'bf_editors_curve', sources, Split(incs), [], libtype=['core'], priority=[45] )
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 2567494ddf3..551c03b0ae5 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,7 +33,7 @@
struct wmOperatorType;
/* lorem.c */
-extern char *ED_lorem;
+extern const char ED_lorem[];
/* editfont.c */
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
@@ -106,6 +106,7 @@ void CURVE_OT_de_select_last(struct wmOperatorType *ot);
void CURVE_OT_select_all(struct wmOperatorType *ot);
void CURVE_OT_select_inverse(struct wmOperatorType *ot);
void CURVE_OT_select_linked(struct wmOperatorType *ot);
+void CURVE_OT_select_linked_pick(struct wmOperatorType *ot);
void CURVE_OT_select_row(struct wmOperatorType *ot);
void CURVE_OT_select_next(struct wmOperatorType *ot);
void CURVE_OT_select_previous(struct wmOperatorType *ot);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 89c19d93b0f..43df7fa3528 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,11 +41,11 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_curve.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_transform.h"
-
#include "curve_intern.h"
@@ -117,6 +117,7 @@ void ED_operatortypes_curve(void)
WM_operatortype_append(CURVE_OT_select_all);
WM_operatortype_append(CURVE_OT_select_inverse);
WM_operatortype_append(CURVE_OT_select_linked);
+ WM_operatortype_append(CURVE_OT_select_linked_pick);
WM_operatortype_append(CURVE_OT_select_row);
WM_operatortype_append(CURVE_OT_select_next);
WM_operatortype_append(CURVE_OT_select_previous);
@@ -188,20 +189,26 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "FONT_OT_line_break", RETKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FONT_OT_text_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
+ RNA_boolean_set(WM_keymap_add_item(keymap, "FONT_OT_text_insert", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "accent", 1); // accented characters
/* only set in editmode curve, by space_view3d listener */
keymap= WM_keymap_find(keyconf, "Curve", 0, 0);
keymap->poll= ED_operator_editsurfcurve;
- WM_keymap_add_menu(keymap, "INFO_MT_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_menu(keymap, "INFO_MT_edit_curve_add", AKEY, KM_PRESS, KM_SHIFT, 0);
+
+ WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "CURVE_OT_vertex_add", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_row", RKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "CURVE_OT_extrude", EKEY, KM_PRESS, 0, 0);
@@ -213,14 +220,13 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TRANSFORM_OT_tilt", TKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", TFM_TILT);
+
RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_CURVE_SHRINKFATTEN);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", HKEY, KM_PRESS, 0, 0)->ptr, "type", 3);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_handle_type_set", VKEY, KM_PRESS, 0, 0)->ptr, "type", 2);
WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "unselected", 1);
+ WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 4564b90880f..86d344d566a 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "DNA_key_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
#include "MEM_guardedalloc.h"
@@ -47,6 +48,7 @@
#include "BLI_math.h"
#include "BLI_dynstr.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_context.h"
@@ -58,6 +60,8 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_report.h"
+#include "BKE_animsys.h"
+#include "BKE_action.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -71,6 +75,8 @@
#include "ED_view3d.h"
#include "ED_curve.h"
+#include "curve_intern.h"
+
#include "UI_interface.h"
#include "RNA_access.h"
@@ -81,13 +87,17 @@ typedef struct {
ListBase nubase;
void *lastsel;
GHash *undoIndex;
+ ListBase fcurves, drivers;
+ int actnu;
} UndoCurve;
/* Definitions needed for shape keys */
typedef struct {
- void *origNode;
- int index;
-} NodeKeyIndex;
+ void *orig_cv;
+ int key_index, nu_index, pt_index;
+ int switched;
+ Nurb *orig_nu;
+} CVKeyIndex;
void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatus);
static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short selstatus);
@@ -95,7 +105,7 @@ static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short
/* still need to eradicate a few :( */
#define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name)
-float nurbcircle[8][2]= {
+static float nurbcircle[8][2]= {
{0.0, -1.0}, {-1.0, -1.0}, {-1.0, 0.0}, {-1.0, 1.0},
{0.0, 1.0}, { 1.0, 1.0}, { 1.0, 0.0}, { 1.0, -1.0}
};
@@ -110,7 +120,7 @@ ListBase *curve_get_editcurve(Object *ob)
}
/* this replaces the active flag used in uv/face mode */
-void set_actNurb(Object *obedit, Nurb *nu)
+static void set_actNurb(Object *obedit, Nurb *nu)
{
Curve *cu= obedit->data;
@@ -122,7 +132,7 @@ void set_actNurb(Object *obedit, Nurb *nu)
}
}
-Nurb *get_actNurb(Object *obedit)
+static Nurb *get_actNurb(Object *obedit)
{
Curve *cu= obedit->data;
ListBase *nurbs= ED_curve_editnurbs(cu);
@@ -222,7 +232,7 @@ int isNurbsel(Nurb *nu)
return 0;
}
-int isNurbsel_count(Curve *cu, Nurb *nu)
+static int isNurbsel_count(Curve *cu, Nurb *nu)
{
BezTriple *bezt;
BPoint *bp;
@@ -271,17 +281,21 @@ void printknots(Object *obedit)
/* ********************* Shape keys *************** */
-static NodeKeyIndex *init_nodeKeyIndex(void *node, int index)
+static CVKeyIndex *init_cvKeyIndex(void *cv, int key_index, int nu_index, int pt_index, Nurb *orig_nu)
{
- NodeKeyIndex *nodeIndex = MEM_callocN(sizeof(NodeKeyIndex), "init_nodeKeyIndex");
+ CVKeyIndex *cvIndex = MEM_callocN(sizeof(CVKeyIndex), "init_cvKeyIndex");
- nodeIndex->origNode= node;
- nodeIndex->index= index;
+ cvIndex->orig_cv= cv;
+ cvIndex->key_index= key_index;
+ cvIndex->nu_index= nu_index;
+ cvIndex->pt_index= pt_index;
+ cvIndex->switched= 0;
+ cvIndex->orig_nu= orig_nu;
- return nodeIndex;
+ return cvIndex;
}
-static void free_nodeKeyIndex(NodeKeyIndex *pointIndex)
+static void free_cvKeyIndex(CVKeyIndex *pointIndex)
{
MEM_freeN(pointIndex);
}
@@ -293,7 +307,10 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
GHash *gh;
BezTriple *bezt, *origbezt;
BPoint *bp, *origbp;
- int a, keyindex= 0;
+ CVKeyIndex *keyIndex;
+ int a, key_index= 0, nu_index= 0, pt_index= 0;
+
+ if(editnurb->keyindex) return;
gh= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "editNurb keyIndex");
@@ -302,26 +319,33 @@ static void init_editNurb_keyIndex(EditNurb *editnurb, ListBase *origBase)
a= orignu->pntsu;
bezt= nu->bezt;
origbezt= orignu->bezt;
+ pt_index= 0;
while (a--) {
- BLI_ghash_insert(gh, bezt, init_nodeKeyIndex(origbezt, keyindex));
- keyindex+= 12;
+ keyIndex= init_cvKeyIndex(origbezt, key_index, nu_index, pt_index, orignu);
+ BLI_ghash_insert(gh, bezt, keyIndex);
+ key_index+= 12;
bezt++;
origbezt++;
+ pt_index++;
}
} else {
a= orignu->pntsu * orignu->pntsv;
bp= nu->bp;
origbp= orignu->bp;
+ pt_index= 0;
while (a--) {
- BLI_ghash_insert(gh, bp, init_nodeKeyIndex(origbp, keyindex));
- keyindex+= 4;
+ keyIndex= init_cvKeyIndex(origbp, key_index, nu_index, pt_index, orignu);
+ BLI_ghash_insert(gh, bp, keyIndex);
+ key_index+= 4;
bp++;
origbp++;
+ pt_index++;
}
}
nu= nu->next;
orignu= orignu->next;
+ nu_index++;
}
editnurb->keyindex= gh;
@@ -332,64 +356,65 @@ static void free_editNurb_keyIndex(EditNurb *editnurb)
if (!editnurb->keyindex) {
return;
}
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+ editnurb->keyindex= NULL;
}
-static NodeKeyIndex *getNodeKeyIndex(EditNurb *editnurb, void *node)
+static CVKeyIndex *getCVKeyIndex(EditNurb *editnurb, void *cv)
{
- return BLI_ghash_lookup(editnurb->keyindex, node);
+ return BLI_ghash_lookup(editnurb->keyindex, cv);
}
-static BezTriple *getKeyIndexOrig_bezt(EditNurb *editnurb, void *node)
+static BezTriple *getKeyIndexOrig_bezt(EditNurb *editnurb, BezTriple *bezt)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, bezt);
if (!index) {
return NULL;
}
- return (BezTriple*)index->origNode;
+ return (BezTriple*)index->orig_cv;
}
-static BPoint *getKeyIndexOrig_bp(EditNurb *editnurb, void *node)
+static BPoint *getKeyIndexOrig_bp(EditNurb *editnurb, BPoint *bp)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, bp);
if (!index) {
return NULL;
}
- return (BPoint*)index->origNode;
+ return (BPoint*)index->orig_cv;
}
-static int getKeyIndexOrig_index(EditNurb *editnurb, void *node)
+static int getKeyIndexOrig_keyIndex(EditNurb *editnurb, void *cv)
{
- NodeKeyIndex *index= getNodeKeyIndex(editnurb, node);
+ CVKeyIndex *index= getCVKeyIndex(editnurb, cv);
if (!index) {
return -1;
}
- return index->index;
+ return index->key_index;
}
-static void keyIndex_delNode(EditNurb *editnurb, void *node)
+static void keyIndex_delCV(EditNurb *editnurb, void *cv)
{
if (!editnurb->keyindex) {
return;
}
- BLI_ghash_remove(editnurb->keyindex, node, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, cv, NULL, (GHashValFreeFP)free_cvKeyIndex);
}
static void keyIndex_delBezt(EditNurb *editnurb, BezTriple *bezt)
{
- keyIndex_delNode(editnurb, bezt);
+ keyIndex_delCV(editnurb, bezt);
}
static void keyIndex_delBP(EditNurb *editnurb, BPoint *bp)
{
- keyIndex_delNode(editnurb, bp);
+ keyIndex_delCV(editnurb, bp);
}
static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
@@ -405,7 +430,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bezt, NULL, (GHashValFreeFP)free_cvKeyIndex);
++bezt;
}
} else {
@@ -413,7 +438,7 @@ static void keyIndex_delNurb(EditNurb *editnurb, Nurb *nu)
a= nu->pntsu * nu->pntsv;
while (a--) {
- BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_remove(editnurb->keyindex, bp, NULL, (GHashValFreeFP)free_cvKeyIndex);
++bp;
}
}
@@ -430,11 +455,11 @@ static void keyIndex_delNurbList(EditNurb *editnurb, ListBase *nubase)
}
}
-static void keyIndex_updateNode(EditNurb *editnurb, char *node,
- char *newnode, int count, int size, int search)
+static void keyIndex_updateCV(EditNurb *editnurb, char *cv,
+ char *newcv, int count, int size)
{
int i;
- NodeKeyIndex *index;
+ CVKeyIndex *index;
if (editnurb->keyindex == NULL) {
/* No shape keys - updating not needed */
@@ -442,61 +467,56 @@ static void keyIndex_updateNode(EditNurb *editnurb, char *node,
}
for (i = 0; i < count; i++) {
- for (;;) {
- index= getNodeKeyIndex(editnurb, node);
- if (!search || index) {
- break;
- }
- node += size;
- }
+ index= getCVKeyIndex(editnurb, cv);
- BLI_ghash_remove(editnurb->keyindex, node, NULL, NULL);
+ BLI_ghash_remove(editnurb->keyindex, cv, NULL, NULL);
if (index) {
- BLI_ghash_insert(editnurb->keyindex, newnode, index);
+ BLI_ghash_insert(editnurb->keyindex, newcv, index);
}
- newnode += size;
- node += size;
+ newcv += size;
+ cv += size;
}
}
static void keyIndex_updateBezt(EditNurb *editnurb, BezTriple *bezt,
- BezTriple *newbezt, int count, int search)
+ BezTriple *newbezt, int count)
{
- keyIndex_updateNode(editnurb, (char*)bezt, (char*)newbezt, count, sizeof(BezTriple), search);
+ keyIndex_updateCV(editnurb, (char*)bezt, (char*)newbezt, count, sizeof(BezTriple));
}
static void keyIndex_updateBP(EditNurb *editnurb, BPoint *bp,
- BPoint *newbp, int count, int search)
+ BPoint *newbp, int count)
{
- keyIndex_updateNode(editnurb, (char*)bp, (char*)newbp, count, sizeof(BPoint), search);
+ keyIndex_updateCV(editnurb, (char*)bp, (char*)newbp, count, sizeof(BPoint));
}
static void keyIndex_updateNurb(EditNurb *editnurb, Nurb *nu, Nurb *newnu)
{
if (nu->bezt) {
- keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu, 0);
+ keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu);
} else {
- keyIndex_updateBP(editnurb, nu->bp, newnu->bp, newnu->pntsu * newnu->pntsv, 0);
+ keyIndex_updateBP(editnurb, nu->bp, newnu->bp, newnu->pntsu * newnu->pntsv);
}
}
static void keyIndex_swap(EditNurb *editnurb, void *a, void *b)
{
- NodeKeyIndex *index1= getNodeKeyIndex(editnurb, a);
- NodeKeyIndex *index2= getNodeKeyIndex(editnurb, b);
+ CVKeyIndex *index1= getCVKeyIndex(editnurb, a);
+ CVKeyIndex *index2= getCVKeyIndex(editnurb, b);
BLI_ghash_remove(editnurb->keyindex, a, NULL, NULL);
BLI_ghash_remove(editnurb->keyindex, b, NULL, NULL);
- BLI_ghash_insert(editnurb->keyindex, a, index2);
- BLI_ghash_insert(editnurb->keyindex, b, index1);
+ if(index2) BLI_ghash_insert(editnurb->keyindex, a, index2);
+ if(index1) BLI_ghash_insert(editnurb->keyindex, b, index1);
}
static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
{
int a;
+ CVKeyIndex *index1, *index2;
if (nu->bezt) {
BezTriple *bezt1, *bezt2;
@@ -511,8 +531,15 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
a/=2;
while (a--) {
+ index1= getCVKeyIndex(editnurb, bezt1);
+ index2= getCVKeyIndex(editnurb, bezt2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bezt1 != bezt2) {
keyIndex_swap(editnurb, bezt1, bezt2);
+
+ if(index2) index2->switched= !index2->switched;
}
bezt1++;
@@ -527,7 +554,14 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
bp2= bp1+(a-1);
a/= 2;
while(bp1!=bp2 && a>0) {
+ index1= getCVKeyIndex(editnurb, bp1);
+ index2= getCVKeyIndex(editnurb, bp2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bp1 != bp2) {
+ if(index2) index2->switched= !index2->switched;
+
keyIndex_swap(editnurb, bp1, bp2);
}
@@ -546,7 +580,14 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
a/= 2;
while(bp1!=bp2 && a>0) {
+ index1= getCVKeyIndex(editnurb, bp1);
+ index2= getCVKeyIndex(editnurb, bp2);
+
+ if(index1) index1->switched= !index1->switched;
+
if (bp1 != bp2) {
+ if(index2) index2->switched= !index2->switched;
+
keyIndex_swap(editnurb, bp1, bp2);
}
@@ -563,7 +604,8 @@ static void keyIndex_switchDirection(EditNurb *editnurb, Nurb *nu)
static void switch_keys_direction(Curve *cu, Nurb *actnu)
{
KeyBlock *currkey;
- ListBase *nubase= &cu->editnurb->nurbs;
+ EditNurb *editnurb= cu->editnurb;
+ ListBase *nubase= &editnurb->nurbs;
Nurb *nu;
float *fp;
int a;
@@ -575,20 +617,28 @@ static void switch_keys_direction(Curve *cu, Nurb *actnu)
nu= nubase->first;
while (nu) {
if (nu->bezt) {
+ BezTriple *bezt= nu->bezt;
a= nu->pntsu;
if (nu == actnu) {
while (a--) {
- swap_v3_v3(fp, fp + 6);
- *(fp+9) = -*(fp+9);
- fp += 12;
+ if(getKeyIndexOrig_bezt(editnurb, bezt)) {
+ swap_v3_v3(fp, fp + 6);
+ *(fp+9) = -*(fp+9);
+ fp += 12;
+ }
+ bezt++;
}
} else fp += a * 12;
} else {
+ BPoint *bp= nu->bp;
a= nu->pntsu * nu->pntsv;
if (nu == actnu) {
while (a--) {
- *(fp+3) = -*(fp+3);
- fp += 4;
+ if(getKeyIndexOrig_bp(editnurb, bp)) {
+ *(fp+3) = -*(fp+3);
+ fp += 4;
+ }
+ bp++;
}
} else fp += a * 4;
}
@@ -610,7 +660,8 @@ static void keyData_switchDirectionNurb(Curve *cu, Nurb *nu)
}
keyIndex_switchDirection(editnurb, nu);
- switch_keys_direction(cu, nu);
+ if(cu->key)
+ switch_keys_direction(cu, nu);
}
static GHash *dupli_keyIndexHash(GHash *keyindex)
@@ -623,13 +674,13 @@ static GHash *dupli_keyIndexHash(GHash *keyindex)
for(hashIter = BLI_ghashIterator_new(keyindex);
!BLI_ghashIterator_isDone(hashIter);
BLI_ghashIterator_step(hashIter)) {
- void *node = BLI_ghashIterator_getKey(hashIter);
- NodeKeyIndex *index = BLI_ghashIterator_getValue(hashIter);
- NodeKeyIndex *newIndex = MEM_callocN(sizeof(NodeKeyIndex), "dupli_keyIndexHash index");
+ void *cv = BLI_ghashIterator_getKey(hashIter);
+ CVKeyIndex *index = BLI_ghashIterator_getValue(hashIter);
+ CVKeyIndex *newIndex = MEM_callocN(sizeof(CVKeyIndex), "dupli_keyIndexHash index");
- memcpy(newIndex, index, sizeof(NodeKeyIndex));
+ memcpy(newIndex, index, sizeof(CVKeyIndex));
- BLI_ghash_insert(gh, node, newIndex);
+ BLI_ghash_insert(gh, cv, newIndex);
}
BLI_ghashIterator_free(hashIter);
@@ -701,7 +752,7 @@ static void calc_keyHandles(ListBase *nurb, float *key)
}
else {
++nextp;
- nextfp += 12;;
+ nextfp += 12;
}
++bezt;
@@ -732,7 +783,7 @@ static void calc_shapeKeys(Object *obedit)
int totvert= count_curveverts(&editnurb->nurbs);
float (*ofs)[3] = NULL;
- float *oldkey, *newkey, *fp, *ofp;
+ float *oldkey, *newkey, *ofp;
/* editing the base key should update others */
if(cu->key->type==KEY_RELATIVE) {
@@ -776,7 +827,6 @@ static void calc_shapeKeys(Object *obedit)
for (j= 0; j < 3; ++j) {
VECSUB(ofs[i], bezt->vec[j], oldbezt->vec[j]);
i++;
- fp+= 3;
}
ofs[i++][0]= bezt->alfa - oldbezt->alfa;
} else {
@@ -796,7 +846,6 @@ static void calc_shapeKeys(Object *obedit)
}
i += 2;
++bp;
- fp += 4;
}
}
@@ -809,7 +858,7 @@ static void calc_shapeKeys(Object *obedit)
while(currkey) {
int apply_offset = (ofs && (currkey != actkey) && (editnurb->shapenr-1 == currkey->relative));
- fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
+ float *fp= newkey= MEM_callocN(cu->key->elemsize * totvert, "currkey->data");
ofp= oldkey = currkey->data;
nu= editnurb->nurbs.first;
@@ -874,7 +923,7 @@ static void calc_shapeKeys(Object *obedit)
a= nu->pntsu;
while(a--) {
- index= getKeyIndexOrig_index(editnurb, bezt);
+ index= getKeyIndexOrig_keyIndex(editnurb, bezt);
if (index >= 0) {
curofp= ofp + index;
@@ -912,7 +961,7 @@ static void calc_shapeKeys(Object *obedit)
bp= nu->bp;
a= nu->pntsu*nu->pntsv;
while(a--) {
- index= getKeyIndexOrig_index(editnurb, bp);
+ index= getKeyIndexOrig_keyIndex(editnurb, bp);
if (index >= 0) {
curofp= ofp + index;
@@ -955,6 +1004,185 @@ static void calc_shapeKeys(Object *obedit)
}
}
+/* ********************* Amimation data *************** */
+
+static int curve_is_animated(Object *ob)
+{
+ Curve *cu= (Curve*)ob->data;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+
+ return ad && (ad->action || ad->drivers.first);
+}
+
+static void fcurve_path_rename(AnimData *ad, char *orig_rna_path, char *rna_path, ListBase *orig_curves, ListBase *curves)
+{
+ FCurve *fcu, *nfcu, *nextfcu;
+ int len= strlen(orig_rna_path);
+
+ fcu= orig_curves->first;
+ while (fcu) {
+ nextfcu= fcu->next;
+ if(!strncmp(fcu->rna_path, orig_rna_path, len)) {
+ char *spath, *suffix= fcu->rna_path + len;
+ nfcu= copy_fcurve(fcu);
+ spath= nfcu->rna_path;
+ nfcu->rna_path= BLI_sprintfN("%s%s", rna_path, suffix);
+ BLI_addtail(curves, nfcu);
+
+ if (fcu->grp) {
+ action_groups_remove_channel(ad->action, fcu);
+ action_groups_add_channel(ad->action, fcu->grp, nfcu);
+ }
+ else if (ad->action && &ad->action->curves == orig_curves)
+ BLI_remlink(&ad->action->curves, fcu);
+ else
+ BLI_remlink(&ad->drivers, fcu);
+
+ free_fcurve(fcu);
+
+ MEM_freeN(spath);
+ }
+ fcu= nextfcu;
+ }
+}
+
+static void fcurve_remove(AnimData *ad, ListBase *orig_curves, FCurve *fcu)
+{
+ if(orig_curves==&ad->drivers) BLI_remlink(&ad->drivers, fcu);
+ else action_groups_remove_channel(ad->action, fcu);
+
+ free_fcurve(fcu);
+}
+
+static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
+{
+ int nu_index= 0, a, pt_index;
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
+ Nurb *nu= editnurb->nurbs.first;
+ CVKeyIndex *keyIndex;
+ char rna_path[64], orig_rna_path[64];
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+ ListBase curves= {0, 0};
+ FCurve *fcu, *next;
+
+ while(nu) {
+ if(nu->bezt) {
+ BezTriple *bezt= nu->bezt;
+ a= nu->pntsu;
+ pt_index= 0;
+
+ while (a--) {
+ keyIndex= getCVKeyIndex(editnurb, bezt);
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d].bezier_points[%d]", nu_index, pt_index);
+ sprintf(orig_rna_path, "splines[%d].bezier_points[%d]", keyIndex->nu_index, keyIndex->pt_index);
+
+ if(keyIndex->switched) {
+ char handle_path[64], orig_handle_path[64];
+ sprintf(orig_handle_path, "%s.handle_left", orig_rna_path);
+ sprintf(handle_path, "%s.handle_right", rna_path);
+ fcurve_path_rename(ad, orig_handle_path, handle_path, orig_curves, &curves);
+
+ sprintf(orig_handle_path, "%s.handle_right", orig_rna_path);
+ sprintf(handle_path, "%s.handle_left", rna_path);
+ fcurve_path_rename(ad, orig_handle_path, handle_path, orig_curves, &curves);
+ }
+
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+
+ keyIndex->nu_index= nu_index;
+ keyIndex->pt_index= pt_index;
+ }
+
+ bezt++;
+ pt_index++;
+ }
+ } else {
+ BPoint *bp= nu->bp;
+ a= nu->pntsu * nu->pntsv;
+ pt_index= 0;
+
+ while (a--) {
+ keyIndex= getCVKeyIndex(editnurb, bp);
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d].points[%d]", nu_index, pt_index);
+ sprintf(orig_rna_path, "splines[%d].points[%d]", keyIndex->nu_index, keyIndex->pt_index);
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+
+ keyIndex->nu_index= nu_index;
+ keyIndex->pt_index= pt_index;
+ }
+
+ bp++;
+ pt_index++;
+ }
+ }
+ nu= nu->next;
+ nu_index++;
+ }
+
+ /* remove pathes for removed control points
+ need this to make further step with copying non-cv related curves copying
+ not touching cv's f-cruves */
+ for(fcu= orig_curves->first; fcu; fcu= next) {
+ next= fcu->next;
+
+ if(!strncmp(fcu->rna_path, "splines", 7)) {
+ char *ch= strchr(fcu->rna_path, '.');
+
+ if (ch && (!strncmp(ch, ".bezier_points", 14) || !strncmp(ch, ".points", 7)))
+ fcurve_remove(ad, orig_curves, fcu);
+ }
+ }
+
+ nu_index= 0;
+ nu= editnurb->nurbs.first;
+ while(nu) {
+ keyIndex= NULL;
+ if(nu->pntsu) {
+ if(nu->bezt) keyIndex= getCVKeyIndex(editnurb, &nu->bezt[0]);
+ else keyIndex= getCVKeyIndex(editnurb, &nu->bp[0]);
+ }
+
+ if(keyIndex) {
+ sprintf(rna_path, "splines[%d]", nu_index);
+ sprintf(orig_rna_path, "splines[%d]", keyIndex->nu_index);
+ fcurve_path_rename(ad, orig_rna_path, rna_path, orig_curves, &curves);
+ }
+
+ nu_index++;
+ nu= nu->next;
+ }
+
+ /* the remainders in orig_curves can be copied back (like follow path) */
+ /* (if it's not path to spline) */
+ for(fcu= orig_curves->first; fcu; fcu= next) {
+ next= fcu->next;
+
+ if(!strncmp(fcu->rna_path, "splines", 7)) fcurve_remove(ad, orig_curves, fcu);
+ else BLI_addtail(&curves, fcu);
+ }
+
+ *orig_curves= curves;
+}
+
+/* return 0 if animation data wasn't changed, 1 otherwise */
+int ED_curve_updateAnimPaths(Object *obedit)
+{
+ Curve *cu= (Curve*)obedit->data;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
+
+ if(!curve_is_animated(obedit)) return 0;
+
+ if(ad->action)
+ curve_rename_fcurves(obedit, &ad->action->curves);
+
+ curve_rename_fcurves(obedit, &ad->drivers);
+
+ return 1;
+}
+
/* ********************* LOAD and MAKE *************** */
/* load editNurb in object */
@@ -983,6 +1211,7 @@ void load_editNurb(Object *obedit)
cu->nurb= newnurb;
calc_shapeKeys(obedit);
+ ED_curve_updateAnimPaths(obedit);
freeNurblist(&oldnurb);
}
@@ -1003,7 +1232,8 @@ void make_editNurb(Object *obedit)
set_actNurb(obedit, NULL);
if (ELEM(obedit->type, OB_CURVE, OB_SURF)) {
- actkey = ob_get_keyblock(obedit);
+ actkey= ob_get_keyblock(obedit);
+
if(actkey) {
// XXX strcpy(G.editModeTitleExtra, "(Key) ");
undo_editmode_clear();
@@ -1035,10 +1265,12 @@ void make_editNurb(Object *obedit)
nu= nu->next;
}
- if(actkey) {
+ if(actkey)
editnurb->shapenr= obedit->shapenr;
- init_editNurb_keyIndex(editnurb, &cu->nurb);
- }
+
+ /* animation could be added in editmode even if teher was no animdata i
+ object mode hence we always need CVs index be created */
+ init_editNurb_keyIndex(editnurb, &cu->nurb);
}
}
@@ -1172,8 +1404,8 @@ static int separate_exec(bContext *C, wmOperator *op)
load_editNurb(newob);
free_editNurb(newob);
- DAG_id_flush_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
- DAG_id_flush_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
+ DAG_id_tag_update(&oldob->id, OB_RECALC_DATA); /* this is the original one */
+ DAG_id_tag_update(&newob->id, OB_RECALC_DATA); /* this is the separated one */
WM_event_add_notifier(C, NC_GEOM|ND_DATA, oldob->data);
@@ -1280,13 +1512,9 @@ static void rotateflagNurb(ListBase *editnurb, short flag, float *cent, float ro
while(a--) {
if(bp->f1 & flag) {
- bp->vec[0]-=cent[0];
- bp->vec[1]-=cent[1];
- bp->vec[2]-=cent[2];
+ sub_v3_v3(bp->vec, cent);
mul_m3_v3(rotmat, bp->vec);
- bp->vec[0]+=cent[0];
- bp->vec[1]+=cent[1];
- bp->vec[2]+=cent[2];
+ add_v3_v3(bp->vec, cent);
}
bp++;
}
@@ -1326,7 +1554,7 @@ static void translateflagNurb(ListBase *editnurb, short flag, float *vec)
}
}
-static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /* mode==0: replace, mode==1: multiply */
+static void weightflagNurb(ListBase *editnurb, short flag, float w)
{
Nurb *nu;
BPoint *bp;
@@ -1338,8 +1566,8 @@ static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /*
bp= nu->bp;
while(a--) {
if(bp->f1 & flag) {
- if(mode==1) bp->vec[3]*= w;
- else bp->vec[3]= w;
+ /* a mode used to exist for replace/multiple but is was unused */
+ bp->vec[3]*= w;
}
bp++;
}
@@ -1347,7 +1575,7 @@ static void weightflagNurb(ListBase *editnurb, short flag, float w, int mode) /*
}
}
-static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
+static int deleteflagNurb(bContext *C, wmOperator *UNUSED(op), int flag)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -1404,6 +1632,7 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
for(b=0; b<nu->pntsv; b++) {
if((bp->f1 & flag)==0) {
memcpy(bpn, bp, nu->pntsu*sizeof(BPoint));
+ keyIndex_updateBP(cu->editnurb, bp, bpn, nu->pntsu);
bpn+= nu->pntsu;
} else {
keyIndex_delBP(cu->editnurb, bp);
@@ -1411,12 +1640,11 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
bp+= nu->pntsu;
}
nu->pntsv= newv;
- keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newv * nu->pntsu, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
clamp_nurb_order_v(nu);
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else {
/* is the nurb in V direction selected */
@@ -1444,13 +1672,13 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
for(a=0; a<nu->pntsu; a++, bp++) {
if((bp->f1 & flag)==0) {
*bpn= *bp;
+ keyIndex_updateBP(cu->editnurb, bp, bpn, 1);
bpn++;
} else {
keyIndex_delBP(cu->editnurb, bp);
}
}
}
- keyIndex_updateBP(cu->editnurb, nu->bp, newbp, newu * nu->pntsv, 1);
MEM_freeN(nu->bp);
nu->bp= newbp;
if(newu==1 && nu->pntsv>1) { /* make a U spline */
@@ -1465,13 +1693,16 @@ static int deleteflagNurb(bContext *C, wmOperator *op, int flag)
nu->pntsu= newu;
clamp_nurb_order_u(nu);
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
nu= next;
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
return OPERATOR_FINISHED;
}
@@ -1513,7 +1744,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
nu->pntsv= 2;
nu->orderv= 2;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
}
else {
@@ -1556,7 +1787,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
MEM_freeN(nu->bp);
nu->bp= newbp;
nu->pntsv++;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else if(v==0 || v== nu->pntsu-1) { /* collumn in v-direction selected */
ok= 1;
@@ -1583,7 +1814,7 @@ static short extrudeflagNurb(EditNurb *editnurb, int flag)
MEM_freeN(nu->bp);
nu->bp= newbp;
nu->pntsu++;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
@@ -1681,7 +1912,7 @@ static void adduplicateflagNurb(Object *obedit, short flag)
/* knots */
newnu->knotsu= NULL;
- makeknots(newnu, 1);
+ nurbs_knot_calc_u(newnu);
}
bp++;
}
@@ -1746,14 +1977,14 @@ static void adduplicateflagNurb(Object *obedit, short flag)
if(nu->pntsu==newnu->pntsu && nu->knotsu) {
newnu->knotsu= MEM_dupallocN( nu->knotsu );
} else {
- makeknots(newnu, 1);
+ nurbs_knot_calc_u(newnu);
}
}
if (check_valid_nurb_v(newnu)) {
if(nu->pntsv==newnu->pntsv && nu->knotsv) {
newnu->knotsv= MEM_dupallocN( nu->knotsv );
} else {
- makeknots(newnu, 2);
+ nurbs_knot_calc_v(newnu);
}
}
}
@@ -1769,7 +2000,7 @@ static void adduplicateflagNurb(Object *obedit, short flag)
/**************** switch direction operator ***************/
-static int switch_direction_exec(bContext *C, wmOperator *op)
+static int switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= (Curve*)obedit->data;
@@ -1782,7 +2013,10 @@ static int switch_direction_exec(bContext *C, wmOperator *op)
keyData_switchDirectionNurb(cu, nu);
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1792,6 +2026,7 @@ void CURVE_OT_switch_direction(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Switch Direction";
+ ot->description= "Switch direction of selected splines";
ot->idname= "CURVE_OT_switch_direction";
/* api callbacks */
@@ -1829,7 +2064,7 @@ static int set_goal_weight_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1838,7 +2073,8 @@ static int set_goal_weight_exec(bContext *C, wmOperator *op)
void CURVE_OT_spline_weight_set(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Set Curve Weight";
+ ot->name= "Set Goal Weight";
+ ot->description= "Set softbody goal weight for selected points";
ot->idname= "CURVE_OT_spline_weight_set";
/* api callbacks */
@@ -1881,7 +2117,7 @@ static int set_radius_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -1890,6 +2126,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Curve Radius";
+ ot->description= "Set per-point radius which is used for bevel tapering";
ot->idname= "CURVE_OT_radius_set";
/* api callbacks */
@@ -1906,7 +2143,7 @@ void CURVE_OT_radius_set(wmOperatorType *ot)
/********************* smooth operator ********************/
-static int smooth_exec(bContext *C, wmOperator *op)
+static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -1956,7 +2193,7 @@ static int smooth_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -1965,6 +2202,7 @@ void CURVE_OT_smooth(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth";
+ ot->description= "Flatten angles of selected points";
ot->idname= "CURVE_OT_smooth";
/* api callbacks */
@@ -1978,7 +2216,7 @@ void CURVE_OT_smooth(wmOperatorType *ot)
/**************** smooth curve radius operator *************/
/* TODO, make smoothing distance based */
-static int smooth_radius_exec(bContext *C, wmOperator *op)
+static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -1989,7 +2227,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* use for smoothing */
int last_sel;
- int start_sel, end_sel; /* selection indicies, inclusive */
+ int start_sel, end_sel; /* selection indices, inclusive */
float start_rad, end_rad, fac, range;
for(nu= editnurb->first; nu; nu= nu->next) {
@@ -1999,7 +2237,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* loop over selection segments of a curve, smooth each */
/* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
- start_sel = end_sel = -1;
+ start_sel = -1;
for(bezt=nu->bezt+last_sel, a=last_sel; a<nu->pntsu; a++, bezt++) {
if(bezt->f2 & SELECT) {
start_sel = a;
@@ -2061,7 +2299,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
/* loop over selection segments of a curve, smooth each */
/* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
- start_sel = end_sel = -1;
+ start_sel = -1;
for(bp=nu->bp+last_sel, a=last_sel; a<nu->pntsu; a++, bp++) {
if(bp->f1 & SELECT) {
start_sel = a;
@@ -2121,7 +2359,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -2130,6 +2368,7 @@ void CURVE_OT_smooth_radius(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Smooth Curve Radius";
+ ot->description= "Flatten radiuses of selected points";
ot->idname= "CURVE_OT_smooth_radius";
/* api clastbacks */
@@ -2269,7 +2508,7 @@ void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatu
}
}
-static int de_select_first_exec(bContext *C, wmOperator *op)
+static int de_select_first_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -2293,7 +2532,7 @@ void CURVE_OT_de_select_first(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int de_select_last_exec(bContext *C, wmOperator *op)
+static int de_select_last_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -2449,7 +2688,7 @@ static int hide_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -2474,7 +2713,7 @@ void CURVE_OT_hide(wmOperatorType *ot)
/********************** reveal operator *********************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -2509,7 +2748,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -2531,7 +2770,7 @@ void CURVE_OT_reveal(wmOperatorType *ot)
/********************** select invert operator *********************/
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -2601,7 +2840,7 @@ void CURVE_OT_select_inverse(wmOperatorType *ot)
static void subdividenurb(Object *obedit, int number_cuts)
{
Curve *cu= obedit->data;
- ListBase *editnurb= curve_get_editcurve(obedit);
+ EditNurb *editnurb= cu->editnurb;
Nurb *nu;
BezTriple *prevbezt, *bezt, *beztnew, *beztn;
BPoint *bp, *prevbp, *bpnew, *bpn;
@@ -2611,7 +2850,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
// printf("*** subdivideNurb: entering subdivide\n");
- for(nu= editnurb->first; nu; nu= nu->next) {
+ for(nu= editnurb->nurbs.first; nu; nu= nu->next) {
amount= 0;
if(nu->type == CU_BEZIER) {
/*
@@ -2653,6 +2892,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
}
while(a--) {
memcpy(beztn, prevbezt, sizeof(BezTriple));
+ keyIndex_updateBezt(editnurb, prevbezt, beztn, 1);
beztn++;
if( BEZSELECTED_HIDDENHANDLES(cu, prevbezt) && BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
@@ -2695,7 +2935,10 @@ static void subdividenurb(Object *obedit, int number_cuts)
bezt++;
}
/* last point */
- if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(beztn, prevbezt, sizeof(BezTriple));
+ if((nu->flagu & CU_NURB_CYCLIC)==0) {
+ memcpy(beztn, prevbezt, sizeof(BezTriple));
+ keyIndex_updateBezt(editnurb, prevbezt, beztn, 1);
+ }
MEM_freeN(nu->bezt);
nu->bezt= beztnew;
@@ -2746,6 +2989,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
}
while(a--) {
memcpy(bpn, prevbp, sizeof(BPoint));
+ keyIndex_updateBP(editnurb, prevbp, bpn, 1);
bpn++;
if( (bp->f1 & SELECT) && (prevbp->f1 & SELECT) ) {
@@ -2762,14 +3006,17 @@ static void subdividenurb(Object *obedit, int number_cuts)
prevbp= bp;
bp++;
}
- if((nu->flagu & CU_NURB_CYCLIC)==0) memcpy(bpn, prevbp, sizeof(BPoint)); /* last point */
+ if((nu->flagu & CU_NURB_CYCLIC)==0) { /* last point */
+ memcpy(bpn, prevbp, sizeof(BPoint));
+ keyIndex_updateBP(editnurb, prevbp, bpn, 1);
+ }
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsu+= amount;
if(nu->type & CU_NURBS) {
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
} /* End of 'else if(nu->pntsv==1)' */
@@ -2849,6 +3096,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
if(b<nu->pntsu-1) {
@@ -2889,8 +3137,8 @@ static void subdividenurb(Object *obedit, int number_cuts)
nu->bp= bpnew;
nu->pntsu= (number_cuts+1)*nu->pntsu-number_cuts;
nu->pntsv= (number_cuts+1)*nu->pntsv-number_cuts;
- makeknots(nu, 1);
- makeknots(nu, 2);
+ nurbs_knot_calc_u(nu);
+ nurbs_knot_calc_v(nu);
} /* End of 'if(sel== nu->pntsu*nu->pntsv)' (subdivide entire NURB) */
else {
/* subdivide in v direction? */
@@ -2905,6 +3153,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
}
@@ -2934,7 +3183,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsv+= sel;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
else {
/* or in u direction? */
@@ -2951,6 +3200,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
for(a=0; a<nu->pntsv; a++) {
for(b=0; b<nu->pntsu; b++) {
*bpn= *bp;
+ keyIndex_updateBP(editnurb, bp, bpn, 1);
bpn++;
bp++;
if( (b<nu->pntsu-1) && usel[b]==nu->pntsv && usel[b+1]==nu->pntsv ) {
@@ -2974,7 +3224,7 @@ static void subdividenurb(Object *obedit, int number_cuts)
MEM_freeN(nu->bp);
nu->bp= bpnew;
nu->pntsu+= sel;
- makeknots(nu, 1); /* shift knots
+ nurbs_knot_calc_u(nu); /* shift knots
forward */
}
}
@@ -2993,8 +3243,11 @@ static int subdivide_exec(bContext *C, wmOperator *op)
subdividenurb(obedit, number_cuts);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -3003,6 +3256,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Subdivide";
+ ot->description= "Subdivide selected segments";
ot->idname= "CURVE_OT_subdivide";
/* api callbacks */
@@ -3012,7 +3266,7 @@ void CURVE_OT_subdivide(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_int(ot->srna, "number_cuts", 1, 1, 100, "Number of cuts", "", 1, 100);
+ RNA_def_int(ot->srna, "number_cuts", 1, 1, INT_MAX, "Number of cuts", "", 1, 10);
}
/******************** find nearest ************************/
@@ -3171,7 +3425,7 @@ static int convertspline(short type, Nurb *nu)
nu->orderu= 4;
nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */
nu->flagu |= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
while(a--) {
@@ -3224,7 +3478,7 @@ static int convertspline(short type, Nurb *nu)
if(type== CU_NURBS) {
nu->flagu &= CU_NURB_CYCLIC; /* disable all flags except for cyclic */
nu->flagu |= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
}
}
@@ -3295,7 +3549,10 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
}
if(changed) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3341,19 +3598,20 @@ static int set_handle_type_exec(bContext *C, wmOperator *op)
sethandlesNurb(editnurb, RNA_enum_get(op->ptr, "type"));
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
void CURVE_OT_handle_type_set(wmOperatorType *ot)
{
- static EnumPropertyItem type_items[]= {
- {1, "AUTOMATIC", 0, "Automatic", ""},
- {2, "VECTOR", 0, "Vector", ""},
+ /* keep in sync with graphkeys_handle_type_items */
+ static EnumPropertyItem editcurve_handle_type_items[]= {
+ {HD_AUTO, "AUTOMATIC", 0, "Automatic", ""},
+ {HD_VECT, "VECTOR", 0, "Vector", ""},
+ {5, "ALIGNED", 0, "Aligned", ""},
+ {6, "FREE_ALIGN", 0, "Free", ""},
{3, "TOGGLE_FREE_ALIGN", 0, "Toggle Free/Align", ""},
- {5, "ALIGN", 0, "Align", ""},
- {6, "FREE_ALIGN", 0, "Free Align", ""},
{0, NULL, 0, NULL, NULL}};
/* identifiers */
@@ -3361,6 +3619,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
ot->idname= "CURVE_OT_handle_type_set";
/* api callbacks */
+ ot->invoke= WM_menu_invoke;
ot->exec= set_handle_type_exec;
ot->poll= ED_operator_editcurve;
@@ -3368,7 +3627,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "type", type_items, 1, "Type", "Spline type");
+ ot->prop= RNA_def_enum(ot->srna, "type", editcurve_handle_type_items, 1, "Type", "Spline type");
}
/***************** make segment operator **********************/
@@ -3641,10 +3900,10 @@ static void merge_2_nurb(wmOperator *op, ListBase *editnurb, Nurb *nu1, Nurb *nu
if(nu1->type == CU_NURBS) {
/* merge knots */
- makeknots(nu1, 1);
+ nurbs_knot_calc_u(nu1);
/* make knots, for merged curved for example */
- makeknots(nu1, 2);
+ nurbs_knot_calc_v(nu1);
}
MEM_freeN(temp);
@@ -3701,7 +3960,7 @@ static int merge_nurb(bContext *C, wmOperator *op)
set_actNurb(obedit, NULL);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -3713,10 +3972,9 @@ static int make_segment_exec(bContext *C, wmOperator *op)
Curve *cu= obedit->data;
ListBase *nubase= curve_get_editcurve(obedit);
Nurb *nu, *nu1=0, *nu2=0;
- BezTriple *bezt;
BPoint *bp;
float *fp, offset;
- int a;
+ int a, ok= 0;
/* first decide if this is a surface merge! */
if(obedit->type==OB_SURF) nu= nubase->first;
@@ -3743,14 +4001,15 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* find both nurbs and points, nu1 will be put behind nu2 */
for(nu= nubase->first; nu; nu= nu->next) {
+ if(nu->pntsu == 1)
+ nu->flagu&= ~CU_NURB_CYCLIC;
+
if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */
if(nu->type == CU_BEZIER) {
- bezt= nu->bezt;
if(nu1==0) {
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) nu1= nu;
+ if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) nu1= nu;
else {
- bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu-1])) ) {
nu1= nu;
switchdirectionNurb(nu);
keyData_switchDirectionNurb(cu, nu);
@@ -3758,14 +4017,13 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
}
else if(nu2==0) {
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
keyData_switchDirectionNurb(cu, nu);
}
else {
- bezt= bezt+(nu->pntsu-1);
- if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
+ if( BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu-1])) ) {
nu2= nu;
}
}
@@ -3806,7 +4064,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if((nu1 && nu2) && (nu1!=nu2)) {
if( nu1->type==nu2->type) {
if(nu1->type == CU_BEZIER) {
- bezt =
+ BezTriple *bezt =
(BezTriple*)MEM_mallocN((nu1->pntsu+nu2->pntsu) * sizeof(BezTriple), "addsegmentN");
ED_curve_beztcpy(cu->editnurb, bezt, nu2->bezt, nu2->pntsu);
ED_curve_beztcpy(cu->editnurb, bezt+nu2->pntsu, nu1->bezt, nu1->pntsu);
@@ -3834,7 +4092,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
/* now join the knots */
if(nu1->type == CU_NURBS) {
if(nu1->knotsu==NULL) {
- makeknots(nu1, 1);
+ nurbs_knot_calc_u(nu1);
}
else {
fp= MEM_mallocN(sizeof(float)*KNOTSU(nu1), "addsegment3");
@@ -3855,19 +4113,37 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
freeNurb(nu2); nu2= NULL;
}
- }
-
- set_actNurb(obedit, NULL); /* for selected */
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
-
- return OPERATOR_FINISHED;
+ set_actNurb(obedit, nu1); /* for selected */
+ ok= 1;
+ }
+ } else if(nu1 && !nu2) {
+ if(!(nu1->flagu & CU_NURB_CYCLIC) && nu1->pntsu>1) {
+ if (nu1->type == CU_BEZIER && BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt) &&
+ BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt+(nu1->pntsu-1))) {
+ nu1->flagu|= CU_NURB_CYCLIC;
+ calchandlesNurb(nu1);
+ ok= 1;
+ } else if (nu1->type == CU_NURBS && nu1->bp->f1&SELECT && (nu1->bp+(nu1->pntsu-1))->f1&SELECT) {
+ nu1->flagu|= CU_NURB_CYCLIC;
+ nurbs_knot_calc_u(nu1);
+ ok= 1;
+ }
+ }
}
- else {
+
+ if(!ok) {
BKE_report(op->reports, RPT_ERROR, "Can't make segment");
return OPERATOR_CANCELLED;
}
+
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
+ return OPERATOR_FINISHED;
}
void CURVE_OT_make_segment(wmOperatorType *ot)
@@ -3969,11 +4245,9 @@ int mouse_nurb(bContext *C, short mval[2], int extend)
/******************** spin operator ***********************/
-/* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the
- * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up
- * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view.
-*/
-static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, float *cent, short mode)
+/* 'cent' is in object space and 'dvec' in worldspace.
+ */
+static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cent)
{
Curve *cu= (Curve*)obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -3982,16 +4256,15 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
float bmat[3][3], rotmat[3][3], scalemat1[3][3], scalemat2[3][3];
float persmat[3][3], persinv[3][3];
short a,ok, changed= 0;
-
- unit_m3(persmat);
+
+ copy_m3_m4(persmat, viewmat);
invert_m3_m3(persinv, persmat);
/* imat and center and size */
copy_m3_m4(bmat, obedit->obmat);
invert_m3_m3(imat, bmat);
-
- n[0]=n[1]= 0.0;
- n[2]= 1.0;
+
+ normalize_v3_v3(n, axis);
phi= M_PI/8.0;
q[0]= cos(phi);
@@ -4004,8 +4277,8 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
mul_m3_m3m3(rotmat, imat, tmat);
unit_m3(scalemat1);
- scalemat1[0][0]= sqrt(2.0);
- scalemat1[1][1]= sqrt(2.0);
+ scalemat1[0][0]= M_SQRT2;
+ scalemat1[1][1]= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat1,tmat);
@@ -4013,8 +4286,8 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
mul_m3_m3m3(scalemat1,imat,tmat);
unit_m3(scalemat2);
- scalemat2[0][0]/= sqrt(2.0);
- scalemat2[1][1]/= sqrt(2.0);
+ scalemat2[0][0]/= M_SQRT2;
+ scalemat2[1][1]/= M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat2,tmat);
@@ -4024,29 +4297,22 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
ok= 1;
for(a=0;a<7;a++) {
- if(mode==0 || mode==2) ok= extrudeflagNurb(cu->editnurb, 1);
- else adduplicateflagNurb(obedit, 1);
+ ok= extrudeflagNurb(cu->editnurb, 1);
if(ok==0)
return changed;
changed= 1;
- rotateflagNurb(editnurb, 1,cent,rotmat);
+ rotateflagNurb(editnurb, SELECT, cent, rotmat);
- if(mode==0 || mode==2) {
- if( (a & 1)==0 ) {
- rotateflagNurb(editnurb, 1,cent,scalemat1);
- weightflagNurb(editnurb, 1, 0.25*sqrt(2.0), 1);
- }
- else {
- rotateflagNurb(editnurb, 1,cent,scalemat2);
- weightflagNurb(editnurb, 1, 4.0/sqrt(2.0), 1);
- }
+ if( (a & SELECT)==0 ) {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat1);
+ weightflagNurb(editnurb, SELECT, 0.25*M_SQRT2);
}
- if(dvec) {
- mul_m3_v3(bmat,dvec);
- translateflagNurb(editnurb, 1,dvec);
+ else {
+ rotateflagNurb(editnurb, SELECT, cent, scalemat2);
+ weightflagNurb(editnurb, SELECT, 4.0/M_SQRT2);
}
}
@@ -4055,7 +4321,7 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
if(isNurbsel(nu)) {
nu->orderv= 4;
nu->flagv |= CU_NURB_CYCLIC;
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
}
}
}
@@ -4065,32 +4331,47 @@ static int spin_nurb(bContext *C, Scene *scene, Object *obedit, float *dvec, flo
static int spin_exec(bContext *C, wmOperator *op)
{
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
- float cent[3], axis[3];
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ float cent[3], axis[3], viewmat[4][4];
RNA_float_get_array(op->ptr, "center", cent);
RNA_float_get_array(op->ptr, "axis", axis);
- if(!spin_nurb(C, scene, obedit, axis, cent, 0)) {
+ invert_m4_m4(obedit->imat, obedit->obmat);
+ mul_m4_v3(obedit->imat, cent);
+
+ if(rv3d)
+ copy_m4_m4(viewmat, rv3d->viewmat);
+ else
+ unit_m4(viewmat);
+
+ if(!spin_nurb(viewmat, obedit, axis, cent)) {
BKE_report(op->reports, RPT_ERROR, "Can't spin");
return OPERATOR_CANCELLED;
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int spin_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int spin_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ float axis[3]= {0.0f, 0.0f, 1.0f};
+
+ if(rv3d)
+ copy_v3_v3(axis, rv3d->viewinv[2]);
RNA_float_set_array(op->ptr, "center", give_cursor(scene, v3d));
- RNA_float_set_array(op->ptr, "axis", rv3d->viewinv[2]);
+ RNA_float_set_array(op->ptr, "axis", axis);
return spin_exec(C, op);
}
@@ -4120,51 +4401,145 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
Object *obedit= CTX_data_edit_object(C);
Curve *cu= (Curve*)obedit->data;
EditNurb *editnurb= cu->editnurb;
- Nurb *nu;
+ Nurb *nu, *newnu= NULL;
BezTriple *bezt, *newbezt = NULL;
BPoint *bp, *newbp = NULL;
float mat[3][3],imat[3][3], temp[3];
+ int ok= 0;
copy_m3_m4(mat, obedit->obmat);
invert_m3_m3(imat,mat);
findselectedNurbvert(&editnurb->nurbs, &nu, &bezt, &bp);
- if(bezt==0 && bp==0) return OPERATOR_CANCELLED;
- if(nu->type == CU_BEZIER) {
+ if ((nu == NULL) || (nu->type==CU_BEZIER && bezt==NULL) || (nu->type!=CU_BEZIER && bp==NULL)) {
+ if(mode!='e') {
+ if(cu->actnu >= 0)
+ nu= BLI_findlink(&editnurb->nurbs, cu->actnu);
+
+ if(!nu || nu->type==CU_BEZIER) {
+ newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb");
+ newbezt->radius= 1;
+ newbezt->alfa= 0;
+ BEZ_SEL(newbezt);
+ newbezt->h2= newbezt->h1= HD_AUTO;
+
+ newnu= (Nurb*)MEM_callocN(sizeof(Nurb), "addvert_Nurb newnu");
+ if(!nu) {
+ /* no selected sement -- create new one which is BEZIER tpye
+ type couldn't be determined from Curve bt could be changed
+ in the future, so shouldn't make much headache */
+ newnu->type= CU_BEZIER;
+ newnu->resolu= cu->resolu;
+ newnu->flag |= CU_SMOOTH;
+ } else memcpy(newnu, nu, sizeof(Nurb));
+
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bezt= newbezt;
+ newnu->pntsu= 1;
+
+ temp[0] = 1;
+ temp[1] = 0;
+ temp[2] = 0;
+ copy_v3_v3(newbezt->vec[1], location);
+ sub_v3_v3(newbezt->vec[1], obedit->obmat[3]);
+ sub_v3_v3v3(newbezt->vec[0], newbezt->vec[1],temp);
+ add_v3_v3v3(newbezt->vec[2], newbezt->vec[1],temp);
+
+ ok= 1;
+ nu= newnu;
+ } else if(nu->pntsv == 1) {
+ newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5");
+ newbp->radius= 1;
+ newbp->alfa= 0;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bp= newbp;
+ newnu->orderu= 2;
+ newnu->pntsu= 1;
+
+ copy_v3_v3(newbp->vec, location);
+ sub_v3_v3(newbp->vec, obedit->obmat[3]);
+ mul_m3_v3(imat,newbp->vec);
+ newbp->vec[3]= 1.0;
+
+ newnu->knotsu= newnu->knotsv= 0;
+ nurbs_knot_calc_u(newnu);
+
+ ok= 1;
+ nu= newnu;
+ }
+
+ }
+
+ if(!ok)
+ return OPERATOR_CANCELLED;
+ }
+
+ if(!ok && nu->type == CU_BEZIER) {
/* which bezpoint? */
- if(bezt== nu->bezt) { /* first */
+ if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu);
- *newbezt= *bezt;
- BEZ_SEL(newbezt);
- newbezt->h2= newbezt->h1;
+ ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu);
+ *(newbezt+nu->pntsu)= *bezt;
VECCOPY(temp, bezt->vec[1]);
MEM_freeN(nu->bezt);
nu->bezt= newbezt;
- bezt= newbezt+1;
+ newbezt+= nu->pntsu;
+ BEZ_SEL(newbezt);
+ cu->lastsel= newbezt;
+ newbezt->h2= newbezt->h1;
+ bezt= nu->bezt+nu->pntsu-1;
+ ok= 1;
}
- else if(bezt== (nu->bezt+nu->pntsu-1)) { /* last */
+ else if(bezt== nu->bezt) { /* first */
BEZ_DESEL(bezt);
newbezt =
(BezTriple*)MEM_callocN((nu->pntsu+1) * sizeof(BezTriple), "addvert_Nurb");
- ED_curve_beztcpy(editnurb, newbezt, nu->bezt, nu->pntsu);
- *(newbezt+nu->pntsu)= *bezt;
+ ED_curve_beztcpy(editnurb, newbezt+1, bezt, nu->pntsu);
+ *newbezt= *bezt;
+ BEZ_SEL(newbezt);
+ cu->lastsel= newbezt;
+ newbezt->h2= newbezt->h1;
VECCOPY(temp, bezt->vec[1]);
MEM_freeN(nu->bezt);
nu->bezt= newbezt;
- newbezt+= nu->pntsu;
+ bezt= newbezt+1;
+ ok= 1;
+ }
+ else if(mode!='e') {
+ BEZ_DESEL(bezt);
+ newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb");
+ *newbezt= *bezt;
BEZ_SEL(newbezt);
newbezt->h2= newbezt->h1;
- bezt= nu->bezt+nu->pntsu-1;
+ VECCOPY(temp, bezt->vec[1]);
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bezt= newbezt;
+ newnu->pntsu= 1;
+
+ cu->lastsel= newbezt;
+
+ bezt= newbezt;
+ ok= 1;
}
else bezt= 0;
if(bezt) {
- nu->pntsu++;
-
+ if(!newnu) nu->pntsu++;
+
if(mode=='e') {
copy_v3_v3(newbezt->vec[0], bezt->vec[0]);
copy_v3_v3(newbezt->vec[1], bezt->vec[1]);
@@ -4177,42 +4552,63 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
sub_v3_v3v3(temp, newbezt->vec[1],temp);
add_v3_v3v3(newbezt->vec[0], bezt->vec[0],temp);
add_v3_v3v3(newbezt->vec[2], bezt->vec[2],temp);
- calchandlesNurb(nu);
+
+ if(newnu) calchandlesNurb(newnu);
+ else calchandlesNurb(nu);
}
}
}
- else if(nu->pntsv==1) {
+ else if(!ok && nu->pntsv==1) {
/* which b-point? */
- if(bp== nu->bp) { /* first */
+ if(bp== (nu->bp+nu->pntsu-1)) { /* last */
+ bp->f1= 0;
+ newbp =
+ (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb4");
+ ED_curve_bpcpy(editnurb, newbp, nu->bp, nu->pntsu);
+ *(newbp+nu->pntsu)= *bp;
+ MEM_freeN(nu->bp);
+ nu->bp= newbp;
+ newbp+= nu->pntsu;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
+ bp= newbp - 1;
+ ok= 1;
+ }
+ else if(bp== nu->bp) { /* first */
bp->f1= 0;
newbp =
(BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3");
ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu);
*newbp= *bp;
- newbp->f1= 1;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
MEM_freeN(nu->bp);
nu->bp= newbp;
bp= newbp + 1;
+ ok= 1;
}
- else if(bp== (nu->bp+nu->pntsu-1)) { /* last */
+ else if(mode!='e') {
bp->f1= 0;
- newbp =
- (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb4");
- ED_curve_bpcpy(editnurb, newbp, nu->bp, nu->pntsu);
- *(newbp+nu->pntsu)= *bp;
- MEM_freeN(nu->bp);
- nu->bp= newbp;
- newbp+= nu->pntsu;
- newbp->f1= 1;
- bp= newbp - 1;
+ newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5");
+ *newbp= *bp;
+ newbp->f1|= SELECT;
+ cu->lastsel= newbp;
+
+ newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
+ memcpy(newnu, nu, sizeof(Nurb));
+ BLI_addtail(&editnurb->nurbs, newnu);
+ set_actNurb(obedit, newnu);
+ newnu->bp= newbp;
+ newnu->orderu= 2;
+ newnu->pntsu= 1;
+ newnu->knotsu= newnu->knotsv= NULL;
+
+ bp= newbp;
+ ok= 1;
}
else bp= 0;
if(bp) {
- nu->pntsu++;
-
- makeknots(nu, 1);
-
if(mode=='e') {
copy_v3_v3(newbp->vec, bp->vec);
}
@@ -4221,18 +4617,33 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
sub_v3_v3(newbp->vec, obedit->obmat[3]);
mul_m3_v3(imat,newbp->vec);
newbp->vec[3]= 1.0;
+
+ if(!newnu && nu->orderu<4 && nu->orderu<=nu->pntsu)
+ nu->orderu++;
}
+
+ if(!newnu) {
+ nu->pntsu++;
+ nurbs_knot_calc_u(nu);
+ } else nurbs_knot_calc_u(newnu);
}
}
// XXX retopo_do_all();
- test2DNurb(nu);
+ if(ok) {
+ test2DNurb(nu);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
- return OPERATOR_FINISHED;
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
}
static int add_vertex_exec(bContext *C, wmOperator *op)
@@ -4283,7 +4694,7 @@ void CURVE_OT_vertex_add(wmOperatorType *ot)
/***************** extrude operator **********************/
-static int extrude_exec(bContext *C, wmOperator *op)
+static int extrude_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -4300,15 +4711,18 @@ static int extrude_exec(bContext *C, wmOperator *op)
}
else {
if(extrudeflagNurb(editnurb, 1)) { /* '1'= flag */
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
return OPERATOR_FINISHED;
}
-static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(extrude_exec(C, op) == OPERATOR_FINISHED) {
RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
@@ -4382,7 +4796,7 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
while(a--) {
if( bp->f1 & SELECT ) {
nu->flagu ^= CU_NURB_CYCLIC;
- makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */
+ nurbs_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
break;
}
bp++;
@@ -4397,11 +4811,11 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT) {
if(direction==0 && nu->pntsu>1) {
nu->flagu ^= CU_NURB_CYCLIC;
- makeknots(nu, 1); /* 1==u type is ignored for cyclic curves */
+ nurbs_knot_calc_u(nu); /* 1==u type is ignored for cyclic curves */
}
if(direction==1 && nu->pntsv>1) {
nu->flagv ^= CU_NURB_CYCLIC;
- makeknots(nu, 2); /* 2==v type is ignored for cyclic curves */
+ nurbs_knot_calc_v(nu); /* 2==v type is ignored for cyclic curves */
}
break;
}
@@ -4413,12 +4827,12 @@ static int toggle_cyclic_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4426,18 +4840,20 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event)
uiLayout *layout;
Nurb *nu;
- for(nu= editnurb->first; nu; nu= nu->next) {
- if(nu->pntsu>1 || nu->pntsv>1) {
- if(nu->type==CU_NURBS) {
- pup= uiPupMenuBegin(C, "Direction", 0);
- layout= uiPupMenuLayout(pup);
- uiItemsEnumO(layout, op->type->idname, "direction");
- uiPupMenuEnd(C, pup);
- return OPERATOR_CANCELLED;
+ if(obedit->type == OB_SURF) {
+ for(nu= editnurb->first; nu; nu= nu->next) {
+ if(nu->pntsu>1 || nu->pntsv>1) {
+ if(nu->type==CU_NURBS) {
+ pup= uiPupMenuBegin(C, "Direction", ICON_NULL);
+ layout= uiPupMenuLayout(pup);
+ uiItemsEnumO(layout, op->type->idname, "direction");
+ uiPupMenuEnd(C, pup);
+ return OPERATOR_CANCELLED;
+ }
}
}
}
-
+
return toggle_cyclic_exec(C, op);
}
@@ -4466,24 +4882,99 @@ void CURVE_OT_cyclic_toggle(wmOperatorType *ot)
/***************** select linked operator ******************/
-static int select_linked_exec(bContext *C, wmOperator *op)
+static int select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- RegionView3D *rv3d= ED_view3d_context_rv3d(C);
+ Curve *cu= (Curve*)obedit->data;
+ EditNurb *editnurb= cu->editnurb;
+ ListBase *nurbs= &editnurb->nurbs;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ for(nu= nurbs->first; nu; nu= nu->next) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if( (bezt->f1 & SELECT) || (bezt->f2 & SELECT) || (bezt->f3 & SELECT) ) {
+ a= nu->pntsu;
+ bezt= nu->bezt;
+ while(a--) {
+ select_beztriple(bezt, SELECT, 1, VISIBLE);
+ bezt++;
+ }
+ break;
+ }
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if( bp->f1 & 1 ) {
+ a= nu->pntsu*nu->pntsv;
+ bp= nu->bp;
+ while(a--) {
+ select_bpoint(bp, SELECT, 1, VISIBLE);
+ bp++;
+ }
+ break;
+ }
+ bp++;
+ }
+ }
+ }
+
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return select_linked_exec(C, op);
+}
+
+void CURVE_OT_select_linked(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Linked All";
+ ot->idname= "CURVE_OT_select_linked";
+
+ /* api callbacks */
+ ot->exec= select_linked_exec;
+ ot->invoke= select_linked_invoke;
+ ot->poll= ED_operator_editsurfcurve;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+}
+
+
+/***************** select linked pick operator ******************/
+
+static int select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ ARegion *ar= CTX_wm_region(C);
ViewContext vc;
Nurb *nu;
BezTriple *bezt;
BPoint *bp;
int a, location[2], deselect;
- if(!rv3d)
- return OPERATOR_CANCELLED;
-
deselect= RNA_boolean_get(op->ptr, "deselect");
- RNA_int_get_array(op->ptr, "location", location);
-
+ location[0]= event->x - ar->winrct.xmin;
+ location[1]= event->y - ar->winrct.ymin;
+
view3d_operator_needs_opengl(C);
view3d_set_viewcontext(C, &vc);
+
findnearestNurbvert(&vc, 1, location, &nu, &bezt, &bp);
if(bezt) {
@@ -4506,44 +4997,30 @@ static int select_linked_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
-
- return OPERATOR_FINISHED;
-}
-static int select_linked_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- ARegion *ar= CTX_wm_region(C);
- int location[2];
-
- location[0]= event->x - ar->winrct.xmin;
- location[1]= event->y - ar->winrct.ymin;
- RNA_int_set_array(op->ptr, "location", location);
-
- return select_linked_exec(C, op);
+ return OPERATOR_FINISHED;
}
-void CURVE_OT_select_linked(wmOperatorType *ot)
+void CURVE_OT_select_linked_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked";
- ot->idname= "CURVE_OT_select_linked";
-
+ ot->idname= "CURVE_OT_select_linked_pick";
+
/* api callbacks */
- ot->exec= select_linked_exec;
- ot->invoke= select_linked_invoke;
- ot->poll= ED_operator_editsurfcurve;
+ ot->invoke= select_linked_pick_invoke;
+ ot->poll= ED_operator_editsurfcurve_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect linked control points rather than selecting them.");
- RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384);
}
/***************** select row operator **********************/
-static int select_row_exec(bContext *C, wmOperator *op)
+static int select_row_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -4618,7 +5095,7 @@ void CURVE_OT_select_row(wmOperatorType *ot)
/***************** select next operator **********************/
-static int select_next_exec(bContext *C, wmOperator *op)
+static int select_next_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4645,7 +5122,7 @@ void CURVE_OT_select_next(wmOperatorType *ot)
/***************** select previous operator **********************/
-static int select_previous_exec(bContext *C, wmOperator *op)
+static int select_previous_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4672,7 +5149,7 @@ void CURVE_OT_select_previous(wmOperatorType *ot)
/***************** select more operator **********************/
-static int select_more_exec(bContext *C, wmOperator *op)
+static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -4760,7 +5237,7 @@ void CURVE_OT_select_more(wmOperatorType *ot)
/******************** select less operator *****************/
/* basic method: deselect if control point doesn't have all neighbours selected */
-static int select_less_exec(bContext *C, wmOperator *op)
+static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
@@ -5111,7 +5588,7 @@ void CURVE_OT_select_nth(wmOperatorType *ot)
/********************** add duplicate operator *********************/
-static int duplicate_exec(bContext *C, wmOperator *op)
+static int duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -5121,7 +5598,7 @@ static int duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
duplicate_exec(C, op);
@@ -5161,6 +5638,7 @@ static int delete_exec(bContext *C, wmOperator *op)
BezTriple *bezt, *bezt1, *bezt2;
BPoint *bp, *bp1, *bp2;
int a, cut= 0, type= RNA_enum_get(op->ptr, "type");
+ int nuindex= 0;
if(obedit->type==OB_SURF) {
if(type==0) {
@@ -5168,10 +5646,13 @@ static int delete_exec(bContext *C, wmOperator *op)
} else {
keyIndex_delNurbList(editnurb, nubase);
freeNurblist(nubase);
+
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -5192,6 +5673,9 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt++;
}
if(a==0) {
+ if(cu->actnu == nuindex)
+ cu->actnu= -1;
+
BLI_remlink(nubase, nu);
keyIndex_delNurb(editnurb, nu);
freeNurb(nu); nu= NULL;
@@ -5209,6 +5693,9 @@ static int delete_exec(bContext *C, wmOperator *op)
bp++;
}
if(a==0) {
+ if(cu->actnu == nuindex)
+ cu->actnu= -1;
+
BLI_remlink(nubase, nu);
keyIndex_delNurb(editnurb, nu);
freeNurb(nu); nu= NULL;
@@ -5224,6 +5711,7 @@ static int delete_exec(bContext *C, wmOperator *op)
}
*/
nu= next;
+ nuindex++;
}
/* 2nd loop, delete small pieces: just for curves */
nu= nubase->first;
@@ -5237,6 +5725,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( BEZSELECTED_HIDDENHANDLES(cu, bezt) ) {
memmove(bezt, bezt+1, (nu->pntsu-a-1)*sizeof(BezTriple));
keyIndex_delBezt(editnurb, bezt + delta);
+ keyIndex_updateBezt(editnurb, bezt + 1, bezt, nu->pntsu-a-1);
nu->pntsu--;
a--;
type= 1;
@@ -5248,7 +5737,7 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt1 =
(BezTriple*)MEM_mallocN((nu->pntsu) * sizeof(BezTriple), "delNurb");
memcpy(bezt1, nu->bezt, (nu->pntsu)*sizeof(BezTriple) );
- keyIndex_updateBezt(editnurb, nu->bezt, bezt1, nu->pntsu, 1);
+ keyIndex_updateBezt(editnurb, nu->bezt, bezt1, nu->pntsu);
MEM_freeN(nu->bezt);
nu->bezt= bezt1;
calchandlesNurb(nu);
@@ -5262,6 +5751,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( bp->f1 & SELECT ) {
memmove(bp, bp+1, (nu->pntsu-a-1)*sizeof(BPoint));
keyIndex_delBP(editnurb, bp + delta);
+ keyIndex_updateBP(editnurb, bp+1, bp, nu->pntsu-a-1);
nu->pntsu--;
a--;
type= 1;
@@ -5274,7 +5764,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type) {
bp1 = (BPoint*)MEM_mallocN(nu->pntsu * sizeof(BPoint), "delNurb2");
memcpy(bp1, nu->bp, (nu->pntsu)*sizeof(BPoint) );
- keyIndex_updateBP(editnurb, nu->bp, bp1, nu->pntsu, 1);
+ keyIndex_updateBP(editnurb, nu->bp, bp1, nu->pntsu);
MEM_freeN(nu->bp);
nu->bp= bp1;
@@ -5285,18 +5775,18 @@ static int delete_exec(bContext *C, wmOperator *op)
clamp_nurb_order_u(nu);
}*/
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
nu= next;
}
}
else if(type==1) { /* erase segment */
/* find the 2 selected points */
- bezt1= bezt2= 0;
- bp1= bp2= 0;
- nu= nubase->first;
- nu1= 0;
- while(nu) {
+ bezt1= bezt2= NULL;
+ bp1= bp2= NULL;
+ nu1= NULL;
+ nuindex= 0;
+ for(nu= nubase->first; nu; nu= nu->next) {
next= nu->next;
if(nu->type == CU_BEZIER) {
bezt= nu->bezt;
@@ -5310,8 +5800,9 @@ static int delete_exec(bContext *C, wmOperator *op)
bezt2= bezt+(nu->pntsu-1);
if( (bezt2->f1 & SELECT) || (bezt2->f2 & SELECT) || (bezt2->f3 & SELECT) ) {
nu->flagu &= ~CU_NURB_CYCLIC;
+ calchandlesNurb(nu);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
@@ -5337,7 +5828,7 @@ static int delete_exec(bContext *C, wmOperator *op)
if( bp2->f1 & SELECT ) {
nu->flagu &= ~CU_NURB_CYCLIC;
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
}
@@ -5351,12 +5842,14 @@ static int delete_exec(bContext *C, wmOperator *op)
}
}
if(nu1) break;
-
- nu= nu->next;
+ nuindex++;
}
if(nu1) {
if(bezt1) {
if(nu1->pntsu==2) { /* remove completely */
+ if(cu->actnu == nuindex)
+ cu->actnu= -1;
+
BLI_remlink(nubase, nu);
freeNurb(nu); nu = NULL;
}
@@ -5400,6 +5893,9 @@ static int delete_exec(bContext *C, wmOperator *op)
}
else if(bp1) {
if(nu1->pntsu==2) { /* remove completely */
+ if(cu->actnu == nuindex)
+ cu->actnu= -1;
+
BLI_remlink(nubase, nu);
freeNurb(nu); nu= NULL;
}
@@ -5434,31 +5930,35 @@ static int delete_exec(bContext *C, wmOperator *op)
}
}
else if(type==2) {
+ cu->actnu= -1;
keyIndex_delNurbList(editnurb, nubase);
freeNurblist(nubase);
}
+ if(ED_curve_updateAnimPaths(obedit))
+ WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
-static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int delete_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
uiPopupMenu *pup;
uiLayout *layout;
if(obedit->type==OB_SURF) {
- pup= uiPupMenuBegin(C, "Delete", 0);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 0);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 2);
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "Delete", 0);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "type");
uiPupMenuEnd(C, pup);
@@ -5511,7 +6011,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -5546,7 +6046,7 @@ void CURVE_OT_shade_flat(wmOperatorType *ot)
/************** join operator, to be used externally? ****************/
-int join_curve_exec(bContext *C, wmOperator *op)
+int join_curve_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -5577,7 +6077,9 @@ int join_curve_exec(bContext *C, wmOperator *op)
nu= cu->nurb.first;
while(nu) {
newnu= duplicateNurb(nu);
- CLAMP(newnu->mat_nr, 0, ob->totcol-1); /* TODO, merge material lists */
+ if(ob->totcol) { /* TODO, merge material lists */
+ CLAMP(newnu->mat_nr, 0, ob->totcol-1);
+ } else newnu->mat_nr= 0;
BLI_addtail(&tempbase, newnu);
if( (bezt= newnu->bezt) ) {
@@ -5607,7 +6109,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
cu= ob->data;
- addlisttolist(&cu->nurb, &tempbase);
+ BLI_movelisttolist(&cu->nurb, &tempbase);
DAG_scene_sort(bmain, scene); // because we removed object(s), call before editmode!
@@ -5620,27 +6122,71 @@ int join_curve_exec(bContext *C, wmOperator *op)
}
/************ add primitive, used by object/ module ****************/
-Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
+
+static const char *get_curve_defname(int type)
+{
+ int stype= type & CU_PRIMITIVE;
+
+ if((type & CU_TYPE)==CU_BEZIER) {
+ switch (stype) {
+ case CU_PRIM_CURVE: return "BezierCurve";
+ case CU_PRIM_CIRCLE: return "BezierCircle";
+ case CU_PRIM_PATH: return "CurvePath";
+ default:
+ return "Curve";
+ }
+ }
+ else {
+ switch (stype) {
+ case CU_PRIM_CURVE: return "NurbsCurve";
+ case CU_PRIM_CIRCLE: return "NurbsCircle";
+ case CU_PRIM_PATH: return "NurbsPath";
+ default:
+ return "Curve";
+ }
+ }
+}
+
+static const char *get_surf_defname(int type)
+{
+ int stype= type & CU_PRIMITIVE;
+
+ switch (stype) {
+ case CU_PRIM_CURVE: return "SurfCurve";
+ case CU_PRIM_CIRCLE: return "SurfCircle";
+ case CU_PRIM_PATCH: return "SurfPatch";
+ case CU_PRIM_SPHERE: return "SurfSphere";
+ case CU_PRIM_DONUT: return "SurfTorus";
+ default:
+ return "Surface";
+ }
+}
+
+
+Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
{
static int xzproj= 0; /* this function calls itself... */
- Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
ListBase *editnurb= curve_get_editcurve(obedit);
View3D *v3d= CTX_wm_view3d(C);
+ RegionView3D *rv3d= ED_view3d_context_rv3d(C);
Nurb *nu = NULL;
BezTriple *bezt;
BPoint *bp;
- float vec[3];
- float fac, grid;
- int a, b, cutype, stype;
- int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
-
- cutype= type & CU_TYPE; // poly, bezier, nurbs, etc
- stype= type & CU_PRIMITIVE;
-
- if (v3d) grid = v3d->grid;
- else grid = 1.0;
-
+ Curve *cu= (Curve*)obedit->data;
+ float vec[3], zvec[3]= {0.0f, 0.0f, 1.0f};
+ float umat[4][4]= MAT4_UNITY, viewmat[4][4]= MAT4_UNITY;
+ float fac;
+ int a, b;
+ const float grid= v3d ? v3d->grid : 1.0f;
+ const int cutype= (type & CU_TYPE); // poly, bezier, nurbs, etc
+ const int stype= (type & CU_PRIMITIVE);
+ const int force_3d = ((Curve *)obedit->data)->flag & CU_3D; /* could be adding to an existing 3D curve */
+
+ if(rv3d) {
+ copy_m4_m4(viewmat, rv3d->viewmat);
+ VECCOPY(zvec, rv3d->viewinv[2]);
+ }
setflagsNurb(editnurb, 0);
@@ -5648,17 +6194,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
if (stype!=CU_PRIM_TUBE && stype!=CU_PRIM_DONUT) {
nu = (Nurb*)MEM_callocN(sizeof(Nurb), "addNurbprim");
nu->type= cutype;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
}
switch(stype) {
case CU_PRIM_CURVE: /* curve */
- nu->resolu= 12; /* set as 4 above */
- if(newname) {
- rename_id((ID *)obedit, "Curve");
- rename_id((ID *)obedit->data, "Curve");
- }
+ nu->resolu= cu->resolu;
if(cutype==CU_BEZIER) {
if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 2;
@@ -5720,8 +6262,8 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
for(a=0;a<4;a++, bp++) mul_m4_v3(mat,bp->vec);
if(cutype==CU_NURBS) {
- nu->knotsu= 0; /* makeknots allocates */
- makeknots(nu, 1);
+ nu->knotsu= NULL; /* nurbs_knot_calc_u allocates */
+ nurbs_knot_calc_u(nu);
}
}
@@ -5731,7 +6273,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
nu->pntsv= 1;
nu->orderu= 5;
nu->flagu= CU_NURB_ENDPOINT; /* endpoint */
- nu->resolu= 8;
+ nu->resolu= cu->resolu;
nu->bp= callocstructN(BPoint, 5, "addNurbprim3");
bp= nu->bp;
@@ -5754,17 +6296,14 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
for(a=0;a<5;a++, bp++) mul_m4_v3(mat,bp->vec);
if(cutype==CU_NURBS) {
- nu->knotsu= 0; /* makeknots allocates */
- makeknots(nu, 1);
+ nu->knotsu= NULL; /* nurbs_knot_calc_u allocates */
+ nurbs_knot_calc_u(nu);
}
break;
case CU_PRIM_CIRCLE: /* circle */
- nu->resolu= 12; /* set as 4 above */
- if(newname) {
- rename_id((ID *)obedit, "CurveCircle");
- rename_id((ID *)obedit->data, "CurveCircle");
- }
+ nu->resolu= cu->resolu;
+
if(cutype==CU_BEZIER) {
if (!force_3d) nu->flag |= CU_2D;
nu->pntsu= 4;
@@ -5819,7 +6358,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp->vec[0]+= 0.25*nurbcircle[a][0]*grid-.75*grid;
bp->vec[2]+= 0.25*nurbcircle[a][1]*grid;
}
- if(a & 1) bp->vec[3]= 0.25*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.25*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp->radius = bp->weight = 1.0;
@@ -5827,15 +6366,11 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp++;
}
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
}
break;
case CU_PRIM_PATCH: /* 4x4 patch */
if( cutype==CU_NURBS ) { /* nurb */
- if(newname) {
- rename_id((ID *)obedit, "Surf");
- rename_id((ID *)obedit->data, "Surf");
- }
nu->pntsu= 4;
nu->pntsv= 4;
@@ -5863,25 +6398,25 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
}
}
- makeknots(nu, 1);
- makeknots(nu, 2);
+ nurbs_knot_calc_u(nu);
+ nurbs_knot_calc_v(nu);
}
break;
case CU_PRIM_TUBE: /* Cylinder */
if( cutype==CU_NURBS ) {
- Curve *cu= (Curve*)obedit->data;
-
- if(newname) {
- rename_id((ID *)obedit, "SurfCylinder");
- rename_id((ID *)obedit->data, "SurfCylinder");
- }
-
nu= add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_CIRCLE, 0); /* circle */
- nu->resolu= 4;
+ nu->resolu= cu->resolu;
nu->flag= CU_SMOOTH;
BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
vec[0]=vec[1]= 0.0;
vec[2]= -grid;
+
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) {
+ /* pass */
+ }
+ else {
+ mul_mat3_m4_v3(mat, vec);
+ }
translateflagNurb(editnurb, 1, vec);
extrudeflagNurb(cu->editnurb, 1);
@@ -5903,18 +6438,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
case CU_PRIM_SPHERE: /* sphere */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
- if(newname) {
- rename_id((ID *)obedit, "SurfSphere");
- rename_id((ID *)obedit->data, "SurfSphere");
- }
-
nu->pntsu= 5;
nu->pntsv= 1;
nu->orderu= 3;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
nu->flag= CU_SMOOTH;
nu->bp= callocstructN(BPoint, 5, "addNurbprim6");
nu->flagu= 0;
@@ -5924,21 +6454,21 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
bp->f1= SELECT;
bp->vec[0]+= nurbcircle[a][0]*grid;
bp->vec[2]+= nurbcircle[a][1]*grid;
- if(a & 1) bp->vec[3]= 0.5*sqrt(2.0);
+ if(a & 1) bp->vec[3]= 0.5*M_SQRT2;
else bp->vec[3]= 1.0;
mul_m4_v3(mat,bp->vec);
bp++;
}
nu->flagu= CU_NURB_BEZIER;
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
BLI_addtail(editnurb, nu); /* temporal for spin */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
- else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
- makeknots(nu, 2);
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(viewmat, obedit, zvec, mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
+ nurbs_knot_calc_v(nu);
a= nu->pntsu*nu->pntsv;
bp= nu->bp;
@@ -5952,24 +6482,21 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
case CU_PRIM_DONUT: /* torus */
if( cutype==CU_NURBS ) {
float tmp_cent[3] = {0.f, 0.f, 0.f};
- float tmp_vec[3] = {0.f, 0.f, 0.f};
+ float tmp_vec[3] = {0.f, 0.f, 1.f};
- if(newname) {
- rename_id((ID *)obedit, "SurfTorus");
- rename_id((ID *)obedit->data, "SurfTorus");
- }
-
xzproj= 1;
nu= add_nurbs_primitive(C, mat, CU_NURBS|CU_PRIM_CIRCLE, 0); /* circle */
xzproj= 0;
- nu->resolu= 4;
- nu->resolv= 4;
+ nu->resolu= cu->resolu;
+ nu->resolv= cu->resolv;
nu->flag= CU_SMOOTH;
- BLI_addtail(editnurb, nu); /* temporal for extrude and translate */
- if(newname && (U.flag & USER_ADD_VIEWALIGNED) == 0)
- spin_nurb(C, scene, obedit, tmp_vec, tmp_cent, 2);
- else
- spin_nurb(C, scene, obedit, tmp_vec, mat[3], 2);
+ BLI_addtail(editnurb, nu); /* temporal for spin */
+
+ /* same as above */
+ if(newob && (U.flag & USER_ADD_VIEWALIGNED) == 0) spin_nurb(umat, obedit, tmp_vec, tmp_cent);
+ else if ((U.flag & USER_ADD_VIEWALIGNED)) spin_nurb(viewmat, obedit, zvec, mat[3]);
+ else spin_nurb(umat, obedit, tmp_vec, mat[3]);
+
BLI_remlink(editnurb, nu);
@@ -5982,6 +6509,10 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newname)
}
break;
+
+ default: /* should never happen */
+ BLI_assert(!"invalid nurbs type");
+ return NULL;
}
/* always do: */
@@ -6009,21 +6540,43 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
if (!isSurf) { /* adding curve */
if(obedit==NULL || obedit->type!=OB_CURVE) {
Curve *cu;
+
obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE, layer);
newob = 1;
cu= (Curve*)obedit->data;
cu->flag |= CU_DEFORM_FILL;
+
if(type & CU_PRIM_PATH)
cu->flag |= CU_PATH|CU_3D;
- } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
- } else { /* adding surface */
+ }
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
+ }
+ else { /* adding surface */
if(obedit==NULL || obedit->type!=OB_SURF) {
obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE, layer);
newob = 1;
- } else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ }
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
+ /* rename here, the undo stack checks name for valid undo pushes */
+ if(newob) {
+
+ if(obedit->type==OB_CURVE) {
+ rename_id((ID *)obedit, get_curve_defname(type));
+ rename_id((ID *)obedit->data, get_curve_defname(type));
+ }
+ else {
+ rename_id((ID *)obedit, get_surf_defname(type));
+ rename_id((ID *)obedit->data, get_surf_defname(type));
+ }
+ }
+
+ /* ED_object_add_type doesnt do an undo, is needed for redo operator on primitive */
+ if(newob && enter_editmode)
+ ED_undo_push(C, "Enter Editmode");
+
ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
nu= add_nurbs_primitive(C, mat, type, newob);
@@ -6306,7 +6859,7 @@ void SURFACE_OT_primitive_nurbs_surface_torus_add(wmOperatorType *ot)
/***************** clear tilt operator ********************/
-static int clear_tilt_exec(bContext *C, wmOperator *op)
+static int clear_tilt_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -6336,7 +6889,7 @@ static int clear_tilt_exec(bContext *C, wmOperator *op)
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
return OPERATOR_FINISHED;
}
@@ -6374,23 +6927,35 @@ static void *undo_check_lastsel(void *lastsel, Nurb *nu, Nurb *newnu)
return NULL;
}
-static void undoCurve_to_editCurve(void *ucu, void *cue, void *obdata)
+static void undoCurve_to_editCurve(void *ucu, void *obe, void *obdata)
{
- Curve *cu= cue;
+ Object *obedit= obe;
+ Curve *cu= (Curve*)obedit->data;
UndoCurve *undoCurve= ucu;
ListBase *undobase= &undoCurve->nubase;
ListBase *editbase= ED_curve_editnurbs(cu);
Nurb *nu, *newnu;
EditNurb *editnurb= cu->editnurb;
void *lastsel= NULL;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
freeNurblist(editbase);
if (undoCurve->undoIndex) {
- BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
+ BLI_ghash_free(editnurb->keyindex, NULL, (GHashValFreeFP)free_cvKeyIndex);
editnurb->keyindex= dupli_keyIndexHash(undoCurve->undoIndex);
}
+ if(ad) {
+ if(ad->action) {
+ free_fcurves(&ad->action->curves);
+ copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
+ }
+
+ free_fcurves(&ad->drivers);
+ copy_fcurves(&ad->drivers, &undoCurve->drivers);
+ }
+
/* copy */
for(nu= undobase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
@@ -6407,16 +6972,21 @@ static void undoCurve_to_editCurve(void *ucu, void *cue, void *obdata)
}
cu->lastsel= lastsel;
+ cu->actnu= undoCurve->actnu;
+
+ ED_curve_updateAnimPaths(obedit);
}
-static void *editCurve_to_undoCurve(void *lbe, void *cue)
+static void *editCurve_to_undoCurve(void *obe, void *cue)
{
- Curve *cu= cue;
+ Object *obedit= obe;
+ Curve *cu= (Curve*)obedit->data;
ListBase *nubase= ED_curve_editnurbs(cu);
UndoCurve *undoCurve;
EditNurb *editnurb= cu->editnurb, tmpEditnurb;
Nurb *nu, *newnu;
void *lastsel= NULL;
+ AnimData *ad= BKE_animdata_from_id(&cu->id);
undoCurve= MEM_callocN(sizeof(UndoCurve), "undoCurve");
@@ -6425,6 +6995,13 @@ static void *editCurve_to_undoCurve(void *lbe, void *cue)
tmpEditnurb.keyindex= undoCurve->undoIndex;
}
+ if(ad) {
+ if(ad->action)
+ copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
+
+ copy_fcurves(&undoCurve->drivers, &ad->drivers);
+ }
+
/* copy */
for(nu= nubase->first; nu; nu= nu->next) {
newnu= duplicateNurb(nu);
@@ -6441,6 +7018,7 @@ static void *editCurve_to_undoCurve(void *lbe, void *cue)
}
undoCurve->lastsel= lastsel;
+ undoCurve->actnu= cu->actnu;
return undoCurve;
}
@@ -6451,9 +7029,11 @@ static void free_undoCurve(void *ucv)
freeNurblist(&undoCurve->nubase);
- if (undoCurve->undoIndex) {
- BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_nodeKeyIndex);
- }
+ if(undoCurve->undoIndex)
+ BLI_ghash_free(undoCurve->undoIndex, NULL, (GHashValFreeFP)free_cvKeyIndex);
+
+ free_fcurves(&undoCurve->fcurves);
+ free_fcurves(&undoCurve->drivers);
MEM_freeN(undoCurve);
}
@@ -6461,11 +7041,11 @@ static void free_undoCurve(void *ucv)
static void *get_data(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
- return obedit->data;
+ return obedit;
}
/* and this is all the undo system needs to know */
-void undo_push_curve(bContext *C, char *name)
+void undo_push_curve(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
}
@@ -6482,11 +7062,11 @@ ListBase *ED_curve_editnurbs(Curve *cu)
void ED_curve_beztcpy(EditNurb *editnurb, BezTriple *dst, BezTriple *src, int count)
{
memcpy(dst, src, count*sizeof(BezTriple));
- keyIndex_updateBezt(editnurb, src, dst, count, 0);
+ keyIndex_updateBezt(editnurb, src, dst, count);
}
void ED_curve_bpcpy(EditNurb *editnurb, BPoint *dst, BPoint *src, int count)
{
memcpy(dst, src, count*sizeof(BPoint));
- keyIndex_updateBP(editnurb, src, dst, count, 0);
+ keyIndex_updateBP(editnurb, src, dst, count);
}
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index d6ec6376b14..ef1c53c9f5d 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -61,6 +62,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_curve.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -205,7 +207,7 @@ static char findaccent(char char1, unsigned int code)
}
-void update_string(Curve *cu)
+static void update_string(Curve *cu)
{
EditFont *ef= cu->editfont;
int len;
@@ -236,10 +238,7 @@ static int insert_into_textbuf(Object *obedit, uintptr_t c)
ef->textbuf[cu->pos]= c;
ef->textbufinfo[cu->pos] = cu->curinfo;
ef->textbufinfo[cu->pos].kern = 0;
- if(obedit->actcol>0)
- ef->textbufinfo[cu->pos].mat_nr = obedit->actcol;
- else
- ef->textbufinfo[cu->pos].mat_nr = 0;
+ ef->textbufinfo[cu->pos].mat_nr = obedit->actcol;
cu->pos++;
cu->len++;
@@ -257,31 +256,29 @@ static void text_update_edited(bContext *C, Scene *scene, Object *obedit, int re
{
Curve *cu= obedit->data;
EditFont *ef= cu->editfont;
-
- if(cu->pos)
- cu->curinfo = ef->textbufinfo[cu->pos-1];
- else
- cu->curinfo = ef->textbufinfo[0];
+ cu->curinfo = ef->textbufinfo[cu->pos?cu->pos-1:0];
if(obedit->totcol>0)
- obedit->actcol= ef->textbufinfo[cu->pos-1].mat_nr;
+ obedit->actcol= ef->textbufinfo[cu->pos?cu->pos-1:0].mat_nr;
+
+ if(mode == FO_EDIT)
+ update_string(cu);
- update_string(cu);
BKE_text_to_curve(scene, obedit, mode);
if(recalc)
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
/********************** insert lorem operator *********************/
-static int insert_lorem_exec(bContext *C, wmOperator *op)
+static int insert_lorem_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
- char *p, *p2;
+ const char *p, *p2;
int i;
- static char *lastlorem;
+ static const char *lastlorem;
if(lastlorem)
p= lastlorem;
@@ -304,7 +301,7 @@ static int insert_lorem_exec(bContext *C, wmOperator *op)
insert_into_textbuf(obedit, '\n');
insert_into_textbuf(obedit, '\n');
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -330,7 +327,7 @@ void FONT_OT_insert_lorem(wmOperatorType *ot)
/* note this handles both ascii and utf8 unicode, previously
* there were 3 functions that did effectively the same thing. */
-static int paste_file(bContext *C, ReportList *reports, char *filename)
+static int paste_file(bContext *C, ReportList *reports, const char *filename)
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -371,7 +368,7 @@ static int paste_file(bContext *C, ReportList *reports, char *filename)
}
MEM_freeN(strp);
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -388,7 +385,7 @@ static int paste_file_exec(bContext *C, wmOperator *op)
return retval;
}
-static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int paste_file_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(RNA_property_is_set(op->ptr, "filepath"))
return paste_file_exec(C, op);
@@ -419,9 +416,9 @@ void FONT_OT_file_paste(wmOperatorType *ot)
/******************* paste buffer operator ********************/
-static int paste_buffer_exec(bContext *C, wmOperator *op)
+static int paste_buffer_exec(bContext *C, wmOperator *UNUSED(op))
{
- char *filename;
+ const char *filename;
#ifdef WIN32
filename= "C:\\windows\\temp\\cutbuf.txt";
@@ -631,7 +628,7 @@ static int set_style(bContext *C, int style, int clear)
ef->textbufinfo[i].flag |= style;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -719,7 +716,7 @@ static void copy_selection(Object *obedit)
}
}
-static int copy_text_exec(bContext *C, wmOperator *op)
+static int copy_text_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
@@ -742,7 +739,7 @@ void FONT_OT_text_copy(wmOperatorType *ot)
/******************* cut text operator ********************/
-static int cut_text_exec(bContext *C, wmOperator *op)
+static int cut_text_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -754,7 +751,7 @@ static int cut_text_exec(bContext *C, wmOperator *op)
copy_selection(obedit);
kill_selection(obedit, 0);
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -812,7 +809,7 @@ static int paste_text_exec(bContext *C, wmOperator *op)
if(!paste_selection(obedit, op->reports))
return OPERATOR_CANCELLED;
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -853,7 +850,7 @@ static int move_cursor(bContext *C, int type, int select)
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
EditFont *ef= cu->editfont;
- int cursmove= 0;
+ int cursmove= -1;
switch(type) {
case LINE_BEGIN:
@@ -923,7 +920,7 @@ static int move_cursor(bContext *C, int type, int select)
break;
}
- if(!cursmove)
+ if(cursmove == -1)
return OPERATOR_CANCELLED;
if(select == 0) {
@@ -1017,7 +1014,7 @@ static int change_spacing_exec(bContext *C, wmOperator *op)
ef->textbufinfo[cu->pos-1].kern = kern;
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1062,7 +1059,7 @@ static int change_character_exec(bContext *C, wmOperator *op)
ef->textbuf[cu->pos - 1]= character;
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1105,7 +1102,7 @@ static int line_break_exec(bContext *C, wmOperator *op)
cu->selstart = cu->selend = 0;
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1195,7 +1192,7 @@ static int delete_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1225,7 +1222,7 @@ static int insert_text_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
char *inserted_utf8;
- wchar_t *inserted_text, first;
+ wchar_t *inserted_text;
int a, len;
if(!RNA_property_is_set(op->ptr, "text"))
@@ -1236,7 +1233,6 @@ static int insert_text_exec(bContext *C, wmOperator *op)
inserted_text= MEM_callocN(sizeof(wchar_t)*(len+1), "FONT_insert_text");
utf8towchar(inserted_text, inserted_utf8);
- first= inserted_text[0];
for(a=0; a<len; a++)
insert_into_textbuf(obedit, inserted_text[a]);
@@ -1245,7 +1241,7 @@ static int insert_text_exec(bContext *C, wmOperator *op)
MEM_freeN(inserted_utf8);
kill_selection(obedit, 1);
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1264,6 +1260,12 @@ static int insert_text_invoke(bContext *C, wmOperator *op, wmEvent *evt)
if(RNA_property_is_set(op->ptr, "text"))
return insert_text_exec(C, op);
+
+ if(RNA_property_is_set(op->ptr, "accent")) {
+ if(cu->len!=0 && cu->pos>0)
+ accentcode= 1;
+ return OPERATOR_FINISHED;
+ }
/* tab should exit editmode, but we allow it to be typed using modifier keys */
if(event==TABKEY) {
@@ -1313,12 +1315,12 @@ static int insert_text_invoke(bContext *C, wmOperator *op, wmEvent *evt)
}
kill_selection(obedit, 1);
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
}
else {
inserted_text[0]= ascii;
insert_into_textbuf(obedit, ascii);
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
}
}
else if(val && event == BACKSPACEKEY) {
@@ -1338,6 +1340,9 @@ static int insert_text_invoke(bContext *C, wmOperator *op, wmEvent *evt)
RNA_string_set(op->ptr, "text", inserted_utf8);
}
+ /* reset property? */
+ accentcode= 0;
+
return OPERATOR_FINISHED;
}
@@ -1358,6 +1363,7 @@ void FONT_OT_text_insert(wmOperatorType *ot)
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
+ RNA_def_boolean(ot->srna, "accent", 0, "Accent mode", "Next typed character will strike through previous, for special character input.");
}
@@ -1372,7 +1378,7 @@ static int textbox_poll(bContext *C)
return 1;
}
-static int textbox_add_exec(bContext *C, wmOperator *op)
+static int textbox_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_active_object(C);
Curve *cu= obedit->data;
@@ -1560,7 +1566,7 @@ static int set_case(bContext *C, int ccase)
}
}
- text_update_edited(C, scene, obedit, 1, 0);
+ text_update_edited(C, scene, obedit, 1, FO_EDIT);
return OPERATOR_FINISHED;
}
@@ -1590,7 +1596,7 @@ void FONT_OT_case_set(wmOperatorType *ot)
/********************** toggle case operator *********************/
-static int toggle_case_exec(bContext *C, wmOperator *op)
+static int toggle_case_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -1630,7 +1636,7 @@ void FONT_OT_case_toggle(wmOperatorType *ot)
/* **************** Open Font ************** */
-static void open_init(bContext *C, wmOperator *op)
+static void font_ui_template_init(bContext *C, wmOperator *op)
{
PropertyPointerRNA *pprop;
@@ -1638,7 +1644,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -1647,67 +1653,66 @@ static int open_cancel(bContext *C, wmOperator *op)
static int open_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
VFont *font;
PropertyPointerRNA *pprop;
PointerRNA idptr;
char str[FILE_MAX];
-
RNA_string_get(op->ptr, "filepath", str);
font = load_vfont(str);
-
+
if(!font) {
if(op->customdata) MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
}
-
+
if(!op->customdata)
- open_init(C, op);
+ font_ui_template_init(C, op);
/* hook into UI */
pprop= op->customdata;
-
+
if(pprop->prop) {
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user, so this compensates it */
font->id.us--;
-
+
RNA_id_pointer_create(&font->id, &idptr);
RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
RNA_property_update(C, &pprop->ptr, pprop->prop);
- } else if(ob && ob->type == OB_FONT) {
- cu = ob->data;
- id_us_min(&cu->vfont->id);
- cu->vfont = font;
}
-
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA|NA_EDITED, ob->data);
-
+
MEM_freeN(op->customdata);
-
+
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
VFont *font=NULL;
char *path;
- if (ob && ob->type == OB_FONT) {
- cu = ob->data;
- font = cu->vfont;
+
+ PointerRNA idptr;
+ PropertyPointerRNA *pprop;
+
+ font_ui_template_init(C, op);
+
+ /* hook into UI */
+ pprop= op->customdata;
+
+ if(pprop->prop) {
+ idptr= RNA_property_pointer_get((PointerRNA *)pprop, pprop->prop);
+ font= idptr.id.data;
}
- path = (font && font->name)? font->name: U.fontdir;
-
+
+ path = (font && strcmp(font->name, FO_BUILTIN_NAME) != 0)? font->name: U.fontdir;
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
if(RNA_property_is_set(op->ptr, "filepath"))
return open_exec(C, op);
-
- open_init(C, op);
-
+
RNA_string_set(op->ptr, "filepath", path);
WM_event_add_fileselect(C, op);
@@ -1729,52 +1734,31 @@ void FONT_OT_open(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH);
+ WM_operator_properties_filesel(ot, FOLDERFILE|FTFONTFILE, FILE_SPECIAL, FILE_OPENFILE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
}
/******************* delete operator *********************/
-static int font_unlink_poll(bContext *C)
-{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
-
- if (!ED_operator_object_active_editable(C) ) return 0;
- if (ob->type != OB_FONT) return 0;
-
- cu = ob->data;
- if (cu && strcmp(cu->vfont->name, "<builtin>")==0) return 0;
- return 1;
-}
static int font_unlink_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- Curve *cu;
- VFont *font, *builtin_font;
-
- cu = ob->data;
- font = cu->vfont;
+ VFont *builtin_font;
+
+ PointerRNA idptr;
+ PropertyPointerRNA pprop;
+
+ uiIDContextProperty(C, &pprop.ptr, &pprop.prop);
- if (!font) {
- BKE_report(op->reports, RPT_ERROR, "No font datablock available to unlink.");
+ if(pprop.prop==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Incorrect context for running font unlink");
return OPERATOR_CANCELLED;
}
-
- if (strcmp(font->name, "<builtin>")==0) {
- BKE_report(op->reports, RPT_WARNING, "Can't unlink the default builtin font.");
- return OPERATOR_FINISHED;
- }
- /* revert back to builtin font */
builtin_font = get_builtin_font();
- cu->vfont = builtin_font;
- id_us_plus(&cu->vfont->id);
- id_us_min(&font->id);
-
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA|NA_EDITED, ob->data);
-
+ RNA_id_pointer_create(&builtin_font->id, &idptr);
+ RNA_property_pointer_set(&pprop.ptr, pprop.prop, idptr);
+ RNA_property_update(C, &pprop.ptr, pprop.prop);
+
return OPERATOR_FINISHED;
}
@@ -1787,7 +1771,6 @@ void FONT_OT_unlink(wmOperatorType *ot)
/* api callbacks */
ot->exec= font_unlink_exec;
- ot->poll= font_unlink_poll;
}
@@ -1844,7 +1827,7 @@ static void *get_undoFont(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_font(bContext *C, char *name)
+void undo_push_font(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_undoFont, free_undoFont, undoFont_to_editFont, editFont_to_undoFont, NULL);
}
diff --git a/source/blender/editors/curve/lorem.c b/source/blender/editors/curve/lorem.c
index 449c620af06..1c86acf7b1b 100644
--- a/source/blender/editors/curve/lorem.c
+++ b/source/blender/editors/curve/lorem.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,493 +21,634 @@
*/
#include "curve_intern.h"
-
-char *ED_lorem =
-"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. "
-"Aliquam tristique interdum sem. "
-"Nullam pretium, tortor non euismod varius, nulla odio sodales nulla, at bibendum lorem metus sed nulla. "
-"Vestibulum in lectus at pede blandit viverra. "
-"Fusce scelerisque ipsum nec enim. "
-"Fusce euismod nunc id enim. "
-"In venenatis cursus arcu. "
-"Aenean quis dui. "
-"Maecenas laoreet. "
-"Nulla tempor, arcu pulvinar pretium suscipit, tortor wisi dapibus libero, id ornare felis ipsum suscipit purus. "
-"Maecenas ipsum. "
-"Morbi cursus. "
-"Vestibulum diam purus, commodo et, convallis eu, posuere at, ligula. "
-"Nulla aliquam aliquet lorem. "
-"Nunc et mauris hendrerit est bibendum suscipit. "
-"Donec pellentesque libero eu nisl. "
-"Pellentesque eget libero. "
-"Donec tempus ipsum sed quam. "
-"Sed blandit nunc quis enim. "
-"Quisque lectus diam, adipiscing hendrerit, placerat non, pulvinar id, felis. "
-"In congue magna sit amet urna. "
-"Nunc non augue sed nisl dictum laoreet. "
-"Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. "
-"In venenatis dapibus massa. "
-"Nulla hendrerit sapien et quam. "
-"Nunc ac magna lobortis tellus tincidunt posuere. "
-"Cras augue mauris, mattis lobortis, fermentum at, semper ac, tellus. "
-"Cras vitae ligula sit amet sem posuere iaculis. "
-"Aliquam condimentum eleifend felis. "
-"Ut sit amet sapien. "
-"Suspendisse potenti. "
-"Mauris urna. "
-"Ut eu enim eu ante porta vestibulum. "
-"Aenean scelerisque est ac felis. "
-"Suspendisse auctor. "
-"Nunc pellentesque. "
-"Morbi laoreet ante et nibh. "
-"Donec feugiat arcu eget enim. "
-"Morbi vehicula tortor ac ipsum. "
-"Quisque lacus arcu, elementum ac, faucibus vel, posuere id, est. "
-"Proin commodo gravida sem. "
-"Vivamus tincidunt vehicula libero. "
-"Phasellus wisi. "
-"Maecenas pretium tellus eu sapien. "
-"Nunc sit amet nunc. "
-"In hac habitasse platea dictumst. "
-"Aenean dictum neque sed tortor. "
-"Donec et erat. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed justo turpis, scelerisque ut, mattis sit amet, ornare rutrum, massa. "
-"Vestibulum bibendum enim sit amet velit. "
-"Vivamus tellus ipsum, luctus ut, consectetuer vitae, dignissim non, ligula. "
-"Phasellus lacinia wisi at est. "
-"Donec elit wisi, commodo non, placerat in, convallis id, elit. "
-"Nunc dolor dolor, vestibulum id, bibendum vitae, lacinia id, erat. "
-"Cras sit amet eros. "
-"Suspendisse suscipit lobortis lectus. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Cras orci. "
-"Praesent massa urna, lobortis semper, auctor a, pretium vitae, tellus. "
-"Curabitur at purus. "
-"Morbi tortor quam, imperdiet venenatis, egestas a, cursus eu, est. "
-"Nunc interdum lectus sit amet libero. "
-"Quisque dignissim placerat ligula. "
-"Nunc porttitor posuere arcu. "
-"Mauris faucibus quam at massa. "
-"Vivamus sodales aliquet mauris. "
-"In id ante. "
-"Pellentesque varius ipsum in arcu. "
-"Fusce mauris lacus, tristique ac, lobortis quis, lobortis luctus, pede. "
-"Sed wisi. "
-"Vestibulum mattis. "
-"Maecenas hendrerit sem nec purus. "
-"Proin id quam. "
-"Cras nec mauris. "
-"Integer orci. "
-"Nullam dui sem, molestie sed, egestas quis, cursus in, magna. "
-"Mauris neque lacus, consectetuer nec, sagittis eu, porttitor eget, dui. "
-"Fusce consectetuer. "
-"Donec nec tellus quis leo lobortis ullamcorper. "
-"Etiam metus urna, aliquet pretium, ultrices eu, cursus ut, turpis. "
-"Morbi bibendum vehicula lectus. "
-"Sed non ante vitae arcu pellentesque tempor. "
-"Fusce sed ligula in sem tempor imperdiet. "
-"Aliquam vel est. "
-"Phasellus sollicitudin sollicitudin nibh. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Sed vel leo nec eros blandit imperdiet. "
-"Nulla facilisi. "
-"Suspendisse lobortis, dui ut fringilla hendrerit, justo purus ullamcorper ligula, ultricies ultrices dolor enim in libero. "
-"Sed elementum, pede eget porta convallis, dui nulla dignissim pede, eget vehicula odio ante at sem. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Sed ullamcorper tincidunt ipsum. "
-"Fusce risus nibh, accumsan sit amet, tempus eget, tristique ac, neque. "
-"Sed quis lorem ut tortor facilisis fermentum. "
-"Fusce pulvinar quam sit amet ipsum. "
-"Morbi ac elit quis tellus malesuada blandit. "
-"Maecenas suscipit sollicitudin sem. "
-"Nam sed eros vel lacus lobortis congue. "
-"Proin interdum nunc lobortis orci. "
-"Donec egestas enim eu odio. "
-"Vestibulum id metus. "
-"Pellentesque auctor, sem varius luctus tempus, libero magna cursus neque, et porttitor diam diam quis purus. "
-"Vestibulum sit amet dolor. "
-"Nulla in magna. "
-"Cras id diam at lectus faucibus placerat. "
-"Nunc porta posuere sapien. "
-"Etiam scelerisque. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Aliquam pellentesque mi sed tortor. "
-"Maecenas eleifend diam non urna. "
-"Donec luctus pharetra tellus. "
-"Proin ac ipsum eget libero bibendum volutpat. "
-"Cras id tellus. "
-"Nulla non risus. "
-"In dolor. "
-"Fusce scelerisque quam in massa ultrices porta. "
-"Morbi ut dolor eu massa egestas condimentum. "
-"Mauris vulputate. "
-"In hac habitasse platea dictumst. "
-"Suspendisse potenti. "
-"Mauris vehicula leo in tortor. "
-"Mauris vel erat a urna laoreet semper. "
-"Pellentesque ut metus ac tellus commodo eleifend. "
-"Suspendisse quis urna. "
-"Curabitur lacinia dignissim dui. "
-"Nam nec ante. "
-"In id enim. "
-"Aenean mattis enim. "
-"In ut neque porttitor risus hendrerit tincidunt. "
-"Suspendisse potenti. "
-"Ut vestibulum lectus vitae tortor. "
-"Duis velit. "
-"Nulla facilisi. "
-"Integer sit amet urna. "
-"Cras varius tortor in pede. "
-"Sed facilisis. "
-"Praesent lacinia libero nec nibh. "
-"Donec aliquam risus non nisl. "
-"Nam a nunc et felis tempor feugiat. "
-"Nunc metus. "
-"Vestibulum euismod, metus in semper laoreet, urna ipsum pharetra lorem, sed ultricies magna lorem sit amet wisi. "
-"Sed wisi. "
-"Nullam facilisis elit sed nisl. "
-"Phasellus mattis leo nec massa. "
-"Aenean malesuada. "
-"Cras wisi erat, lobortis nec, cursus eget, lobortis at, libero. "
-"In massa nisl, rutrum non, cursus nec, faucibus sed, lacus. "
-"Pellentesque malesuada. "
-"Cras euismod, neque ac suscipit tempus, velit lorem luctus elit, dapibus rhoncus wisi est ut sem. "
-"Proin vulputate enim in eros elementum accumsan. "
-"Ut lorem nisl, hendrerit et, interdum nec, lacinia in, dolor. "
-"Duis nec quam. "
-"Praesent velit felis, posuere id, luctus quis, laoreet ut, ipsum. "
-"Praesent eget arcu. "
-"Mauris massa felis, ornare non, ultrices id, tristique in, elit. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Phasellus vulputate, mi ac bibendum facilisis, libero enim suscipit leo, non nonummy pede diam eget nibh. "
-"Sed tempus. "
-"Aenean interdum suscipit dui. "
-"Aliquam erat volutpat. "
-"Ut malesuada. "
-"Nam commodo, nulla ut fringilla rutrum, orci elit viverra diam, vitae mollis odio odio et purus. "
-"Aliquam erat volutpat. "
-"Sed aliquet lobortis ipsum. "
-"In ut est. "
-"Etiam condimentum. "
-"Vestibulum pellentesque tortor pulvinar lacus. "
-"Aenean orci. "
-"Suspendisse lacus nulla, nonummy a, dictum vitae, egestas quis, eros. "
-"Donec auctor gravida nisl. "
-"Cras ac est rutrum augue pulvinar ornare. "
-"Phasellus mauris nibh, vulputate in, rhoncus imperdiet, dapibus eget, lacus. "
-"Nam nunc mauris, suscipit at, ultricies a, facilisis at, tellus. "
-"Nam accumsan mollis libero. "
-"Vivamus condimentum mattis est. "
-"Donec lacus. "
-"Nullam ac sapien id massa lobortis molestie. "
-"Pellentesque elementum. "
-"Proin ut purus. "
-"Integer et sapien quis turpis commodo mollis. "
-"Nulla consequat. "
-"Proin a wisi ut tellus blandit elementum. "
-"Aliquam nulla lorem, bibendum ac, malesuada vel, elementum et, metus. "
-"Phasellus egestas nibh et ligula. "
-"Vivamus diam odio, lacinia quis, malesuada quis, sollicitudin ut, eros. "
-"Phasellus aliquet lorem ac ipsum. "
-"Sed cursus tellus ac orci. "
-"Phasellus at nulla. "
-"Donec porta sodales ante. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Sed id lectus at massa ullamcorper tristique. "
-"Suspendisse porttitor lacus. "
-"In hac habitasse platea dictumst. "
-"Nunc non turpis. "
-"Sed sagittis. "
-"Morbi laoreet scelerisque dui. "
-"Nam arcu tellus, tempor vitae, vestibulum et, imperdiet ut, velit. "
-"In sit amet augue a arcu volutpat suscipit. "
-"Donec dictum ultrices lectus. "
-"Phasellus a purus et orci dictum lacinia. "
-"Ut leo. "
-"Cras semper, lorem sit amet tincidunt congue, justo eros varius pede, in bibendum turpis lectus non eros. "
-"Phasellus quam. "
-"Suspendisse mattis sollicitudin magna. "
-"Aenean facilisis diam vel nisl nonummy condimentum. "
-"Suspendisse vel dolor. "
-"Vestibulum nonummy. "
-"Mauris imperdiet semper ante. "
-"Maecenas vulputate eros. "
-"Vestibulum ac dolor. "
-"Fusce risus metus, aliquet eget, facilisis et, feugiat vel, orci. "
-"Ut at nunc id ante sodales vulputate. "
-"Duis tristique mattis ante. "
-"Vestibulum neque mauris, laoreet id, congue interdum, aliquet ut, diam. "
-"Nulla volutpat blandit magna. "
-"Donec accumsan congue diam. "
-"Etiam vel dui eget nisl tempor varius. "
-"Cras dictum massa sed enim. "
-"Cras urna tortor, fringilla ac, ullamcorper in, euismod vel, arcu. "
-"Morbi posuere luctus augue. "
-"Aliquam dui dui, adipiscing in, lobortis eu, luctus eu, nulla. "
-"Cras velit pede, ullamcorper sit amet, feugiat in, auctor vitae, ante. "
-"Suspendisse dictum fringilla mauris. "
-"In a nibh. "
-"Donec ac ligula. "
-"In quam. "
-"Praesent vitae urna ultricies sem aliquam placerat. "
-"Aliquam erat volutpat. "
-"Nam est. "
-"Donec faucibus sodales metus. "
-"Ut congue. "
-"Donec arcu tellus, pharetra ac, vulputate ac, mollis sed, lectus. "
-"Nulla facilisi. "
-"Nullam volutpat nunc et felis. "
-"Sed pede odio, tincidunt in, volutpat malesuada, feugiat gravida, nulla. "
-"Nulla aliquam pede vitae arcu. "
-"Proin velit elit, nonummy sit amet, elementum vitae, varius vitae, dolor. "
-"Donec rutrum ipsum eu mi. "
-"Aliquam et sem. "
-"In adipiscing rhoncus velit. "
-"Nam viverra scelerisque arcu. "
-"Aliquam sem. "
-"Sed tincidunt nulla quis massa. "
-"Mauris faucibus tempus nunc. "
-"Phasellus condimentum. "
-"Curabitur aliquet iaculis sapien. "
-"Nunc rhoncus, odio vitae bibendum dignissim, tellus libero commodo ipsum, ut sollicitudin nisl nisl vel justo. "
-"Nulla facilisi. "
-"Praesent blandit enim ut justo. "
-"Proin elementum, elit eget accumsan pulvinar, orci quam auctor neque, sed convallis diam purus vel felis. "
-"Sed orci leo, eleifend vel, blandit non, semper eu, purus. "
-"Proin bibendum, libero ac consectetuer commodo, eros sapien blandit nisl, eu eleifend nibh nibh vel lectus. "
-"Vivamus placerat. "
-"Integer odio dolor, pharetra non, sodales id, viverra eget, diam. "
-"Nunc mauris magna, egestas quis, feugiat id, fermentum viverra, mi. "
-"Aenean suscipit nisl non nunc. "
-"Proin quis lectus ac tellus nonummy commodo. "
-"Nunc eget diam ac elit vestibulum auctor. "
-"Etiam vulputate, odio sed lacinia consequat, justo mi vulputate purus, sit amet euismod libero metus sed tortor. "
-"Maecenas ac elit sed lorem vulputate gravida. "
-"Proin lectus eros, ullamcorper id, volutpat quis, condimentum tincidunt, sapien. "
-"Sed et massa eget lorem aliquet tempus. "
-"Duis porttitor nisl non risus. "
-"Nam id quam. "
-"Nullam est. "
-"Proin orci diam, posuere et, pharetra commodo, dictum vel, enim. "
-"Proin eget erat. "
-"Donec nisl. "
-"Maecenas auctor velit ut pede. "
-"Nunc vitae lectus nec libero tincidunt hendrerit. "
-"Quisque varius, erat ultrices ultrices euismod, purus lacus dictum eros, at condimentum enim dui nec magna. "
-"Morbi diam. "
-"Phasellus sed est. "
-"Phasellus nec libero in arcu fringilla sollicitudin. "
-"In rutrum nisl at arcu. "
-"Nulla facilisi. "
-"Mauris dignissim. "
-"Etiam est mauris, pharetra sed, viverra et, tincidunt sed, neque. "
-"Ut at lectus id nibh luctus ornare. "
-"Mauris varius porttitor risus. "
-"Ut vulputate aliquet risus. "
-"Vestibulum luctus neque sit amet nunc. "
-"Duis fermentum nibh. "
-"Pellentesque dapibus. "
-"Proin eros libero, aliquam non, condimentum a, sodales ut, turpis. "
-"Integer accumsan mi sed lorem. "
-"Vestibulum pellentesque sodales nisl. "
-"Nulla eu justo quis dui pretium rhoncus. "
-"Praesent viverra commodo mi. "
-"Maecenas dolor libero, viverra a, elementum vitae, aliquet vitae, dui. "
-"Mauris convallis lectus et mi. "
-"Mauris sagittis. "
-"Sed arcu. "
-"Pellentesque auctor. "
-"Donec pellentesque purus non tellus. "
-"Ut leo wisi, ultrices sit amet, ultrices eu, gravida ac, libero. "
-"Mauris fermentum dapibus diam. "
-"Integer quis lacus dapibus odio pellentesque varius. "
-"Fusce pede quam, vehicula ut, pulvinar et, tincidunt sed, felis. "
-"Curabitur eros enim, vulputate sed, aliquam ac, euismod ac, erat. "
-"Ut dignissim, lacus a interdum iaculis, enim orci posuere nunc, nec ultricies lectus risus in odio. "
-"Etiam et massa id dui commodo vehicula. "
-"Nunc blandit tortor quis dui. "
-"Quisque nisl. "
-"Sed venenatis blandit ligula. "
-"Fusce viverra imperdiet magna. "
-"Donec eget nunc quis est pharetra lobortis. "
-"Vestibulum quis lectus. "
-"Mauris vel orci lobortis nunc fermentum bibendum. "
-"Pellentesque eget leo. "
-"Morbi vel urna sit amet erat fermentum facilisis. "
-"Sed vulputate, libero et sollicitudin congue, wisi lectus sodales dolor, eget molestie magna orci vel tellus. "
-"Sed tempor ante et enim. "
-"Mauris elit. "
-"Curabitur ullamcorper vehicula massa. "
-"Sed viverra. "
-"Duis nulla. "
-"Nam bibendum. "
-"Nam tortor lorem, ullamcorper vitae, dictum sed, posuere eu, justo. "
-"Aliquam adipiscing arcu vitae turpis. "
-"Donec malesuada posuere libero. "
-"Ut sed tellus. "
-"Fusce sed nunc eget nisl dapibus malesuada. "
-"Suspendisse potenti. "
-"Integer tristique libero et metus. "
-"Vivamus posuere. "
-"Maecenas non sem non quam fermentum blandit. "
-"Duis risus tellus, rutrum vitae, imperdiet nec, malesuada nec, ipsum. "
-"Nunc quam dolor, luctus eget, placerat non, rhoncus at, tellus. "
-"Duis pede lectus, mattis adipiscing, tempor ut, porta at, mi. "
-"Pellentesque risus nulla, sodales sed, interdum id, nonummy vitae, ligula. "
-"Morbi pulvinar pede ut massa. "
-"Nunc risus mauris, tincidunt et, faucibus eu, suscipit vel, orci. "
-"In faucibus felis in arcu. "
-"Nulla sit amet elit. "
-"Nulla erat sapien, sagittis eget, dignissim eget, viverra eu, felis. "
-"Nam ac ipsum. "
-"Suspendisse vulputate turpis vel sem lacinia ullamcorper. "
-"Mauris ornare ipsum sed ligula. "
-"Duis facilisis neque quis orci. "
-"Nullam et erat et orci lacinia pellentesque. "
-"Donec ac ipsum. "
-"Duis molestie ipsum ac arcu. "
-"Aenean congue accumsan ante. "
-"Integer bibendum, leo ut ornare aliquam, nunc erat condimentum arcu, ut pulvinar mi augue et nulla. "
-"Quisque lacinia aliquet wisi. "
-"Vivamus nec dui. "
-"Etiam wisi leo, euismod vitae, vulputate a, dictum vitae, quam. "
-"Quisque quis tortor. "
-"Etiam interdum. "
-"In massa erat, porttitor sed, tincidunt vel, vehicula fringilla, augue. "
-"Nulla vel urna. "
-"In libero mi, pretium sed, mattis tempus, sagittis sed, massa. "
-"Suspendisse quam wisi, fermentum quis, sagittis at, consequat eget, odio. "
-"Nullam imperdiet, purus quis aliquam cursus, turpis odio egestas justo, placerat gravida turpis wisi vel tortor. "
-"Nunc ultricies porta purus. "
-"Proin elementum erat ac orci. "
-"Ut vel magna nec mi feugiat tincidunt. "
-"Ut ligula. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec et magna in diam porta nonummy. "
-"Maecenas ut sem in turpis fermentum viverra. "
-"Suspendisse at orci. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Pellentesque rutrum eleifend justo. "
-"Nullam vitae pede. "
-"Donec condimentum nibh et odio. "
-"Sed et metus. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Nam tempus. "
-"Sed ac wisi. "
-"In hac habitasse platea dictumst. "
-"Sed sed wisi. "
-"Ut facilisis tellus non ligula. "
-"Integer metus. "
-"In lacinia dui. "
-"Curabitur ornare. "
-"Mauris vel urna. "
-"Nam consectetuer dignissim urna. "
-"Nunc elementum porttitor erat. "
-"Sed blandit, risus non commodo nonummy, ligula erat fermentum nibh, eu facilisis ante neque sed sem. "
-"Etiam scelerisque justo eget wisi. "
-"Nunc dignissim. "
-"Proin pulvinar quam non lectus. "
-"Proin ut turpis quis augue pellentesque dictum. "
-"Fusce et lorem. "
-"Aliquam urna lacus, blandit sed, vestibulum sit amet, placerat et, dolor. "
-"Curabitur auctor erat nec lorem. "
-"Phasellus urna wisi, lacinia ut, molestie tincidunt, condimentum id, odio. "
-"Curabitur convallis ullamcorper justo. "
-"Donec vestibulum est ac quam. "
-"Nullam vitae elit eu massa varius vulputate. "
-"Nulla facilisi. "
-"Suspendisse potenti. "
-"Praesent non libero. "
-"Nullam tristique massa id magna viverra commodo. "
-"Vestibulum libero tortor, luctus ac, viverra congue, consectetuer vel, libero. "
-"Aenean arcu augue, luctus id, laoreet pulvinar, dictum sed, lectus. "
-"Donec vestibulum volutpat dolor. "
-"Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
-"Pellentesque augue turpis, laoreet nec, malesuada at, nonummy vitae, nibh. "
-"Etiam orci sapien, congue in, porttitor sit amet, rutrum vel, nibh. "
-"Integer eu lorem. "
-"Mauris pretium leo et elit. "
-"In nonummy ultricies sapien. "
-"Mauris varius. "
-"Mauris sed libero. "
-"Curabitur ullamcorper elit eu purus. "
-"Vestibulum velit pede, semper sit amet, lobortis vitae, tincidunt vel, dui. "
-"Nulla neque ante, sagittis eu, vestibulum et, lacinia a, libero. "
-"Morbi sit amet wisi. "
-"Pellentesque non felis quis arcu bibendum ornare. "
-"Aenean enim metus, commodo eu, hendrerit nonummy, euismod ut, quam. "
-"Nulla eleifend nisl quis dolor. "
-"Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. "
-"Maecenas pellentesque massa in erat molestie molestie. "
-"Mauris dignissim dapibus libero. "
-"Sed sed risus id neque dictum ornare. "
-"Sed eu ligula at felis sodales accumsan. "
-"Sed interdum, urna non pharetra hendrerit, quam mi ornare libero, id fringilla tortor orci non velit. "
-"Aliquam nec risus. "
-"Donec at nunc vitae tellus molestie vestibulum. "
-"Pellentesque vel justo. "
-"Duis ligula libero, vulputate quis, adipiscing bibendum, feugiat vitae, velit. "
-"Vivamus et arcu. "
-"Fusce eget quam. "
-"Ut ante. "
-"Suspendisse feugiat metus non ipsum. "
-"Nulla tempus leo ut mi. "
-"Curabitur vitae nisl. "
-"Vivamus elementum. "
-"Etiam a orci. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus urna quam, tincidunt at, ultrices vel, feugiat eget, nulla. "
-"Maecenas lacus magna, nonummy eu, iaculis sed, consectetuer quis, enim. "
-"Praesent a eros. "
-"Aliquam nonummy dignissim neque. "
-"Nulla enim. "
-"Praesent molestie, orci quis tristique volutpat, lacus metus luctus sapien, et facilisis eros neque id sapien. "
-"Nunc condimentum dolor vel orci. "
-"Integer wisi diam, porttitor sit amet, feugiat in, dapibus in, lectus. "
-"Aliquam erat volutpat. "
-"Quisque mollis turpis vitae tortor. "
-"Mauris turpis mi, pretium ut, ultrices sed, porta in, justo. "
-"Suspendisse posuere. "
-"Quisque ultricies lacus vitae enim. "
-"Donec lacus. "
-"Suspendisse potenti. "
-"Donec molestie, magna sed euismod dictum, magna magna interdum diam, vitae sagittis leo lorem ac neque. "
-"Cras metus. "
-"Quisque nunc. "
-"Duis consectetuer. "
-"Vestibulum gravida sollicitudin urna. "
-"Integer volutpat, massa quis ultrices pulvinar, eros purus dignissim nunc, eget rhoncus enim lectus quis tortor. "
-"Integer lacinia quam quis erat convallis mattis. "
-"Suspendisse iaculis posuere velit. "
-"Etiam tellus enim, aliquet nec, laoreet a, molestie non, velit. "
-"Quisque lacus velit, eleifend imperdiet, fringilla id, dapibus scelerisque, lectus. "
-"Nulla quis lorem. "
-"Nulla malesuada neque et dui. "
-"Phasellus malesuada ultricies odio. "
-"Phasellus vitae ligula. "
-"Pellentesque feugiat arcu at erat. "
-"Vivamus ut eros ut lorem pulvinar iaculis. "
-"Proin lobortis ipsum id nunc. "
-"Curabitur vel massa. "
-"Suspendisse nulla ipsum, malesuada vel, posuere eget, mollis at, risus. "
-"Vestibulum sed diam id est dapibus ultrices. "
-"Proin tempus, eros a scelerisque vestibulum, ipsum arcu aliquam mi, ut feugiat libero odio in nisl. "
-"Quisque et massa a mauris luctus congue. "
-"Ut id eros. "
-"Fusce ante eros, pharetra non, molestie tristique, bibendum sit amet, wisi. "
-"Phasellus rutrum, dolor et semper elementum, eros ante malesuada massa, sed sollicitudin lectus velit et massa. "
-"In auctor. "
-"Aliquam erat volutpat. "
-"Etiam risus leo, vulputate suscipit, sollicitudin et, sodales eget, nisl. "
-"Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Curabitur lobortis, libero ac laoreet mollis, ligula leo porta wisi, ut euismod felis ligula id elit. "
-"Vivamus malesuada nulla eu enim. "
-"Donec accumsan faucibus orci. "
-"Nulla lacinia ante. "
-"Praesent at nibh. "
-"Mauris porta dignissim wisi. "
-"Ut lacinia tortor nec nunc. "
-"Phasellus et augue. "
-"Integer rhoncus, libero a pellentesque rhoncus, tortor sapien lobortis pede, eget condimentum sapien risus vitae elit. "
-"Suspendisse sed turpis ut dolor placerat dignissim. "
-"Quisque quis leo. "
-"Cras ultrices. "
-"Maecenas hendrerit auctor tortor. "
-"Etiam sit amet arcu. ";
+
+const char ED_lorem[]= {
+76, 111, 114, 101, 109, 32, 105, 112, 115, 117, 109, 32, 100, 111, 108, 111, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 99,
+111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 101, 108, 105, 116, 46, 32, 65, 108, 105,
+113, 117, 97, 109, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 115, 101, 109, 46, 32, 78, 117, 108,
+108, 97, 109, 32, 112, 114, 101, 116, 105, 117, 109, 44, 32, 116, 111, 114, 116, 111, 114, 32, 110, 111, 110, 32, 101, 117, 105, 115, 109, 111, 100, 32,
+118, 97, 114, 105, 117, 115, 44, 32, 110, 117, 108, 108, 97, 32, 111, 100, 105, 111, 32, 115, 111, 100, 97, 108, 101, 115, 32, 110, 117, 108, 108, 97,
+44, 32, 97, 116, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 108, 111, 114, 101, 109, 32, 109, 101, 116, 117, 115, 32, 115, 101, 100, 32, 110, 117,
+108, 108, 97, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 97, 116, 32, 112, 101, 100,
+101, 32, 98, 108, 97, 110, 100, 105, 116, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 70, 117, 115, 99, 101, 32, 115, 99, 101, 108, 101, 114, 105,
+115, 113, 117, 101, 32, 105, 112, 115, 117, 109, 32, 110, 101, 99, 32, 101, 110, 105, 109, 46, 32, 70, 117, 115, 99, 101, 32, 101, 117, 105, 115, 109,
+111, 100, 32, 110, 117, 110, 99, 32, 105, 100, 32, 101, 110, 105, 109, 46, 32, 73, 110, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 99, 117,
+114, 115, 117, 115, 32, 97, 114, 99, 117, 46, 32, 65, 101, 110, 101, 97, 110, 32, 113, 117, 105, 115, 32, 100, 117, 105, 46, 32, 77, 97, 101, 99,
+101, 110, 97, 115, 32, 108, 97, 111, 114, 101, 101, 116, 46, 32, 78, 117, 108, 108, 97, 32, 116, 101, 109, 112, 111, 114, 44, 32, 97, 114, 99, 117,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 112, 114, 101, 116, 105, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 44, 32, 116, 111, 114, 116,
+111, 114, 32, 119, 105, 115, 105, 32, 100, 97, 112, 105, 98, 117, 115, 32, 108, 105, 98, 101, 114, 111, 44, 32, 105, 100, 32, 111, 114, 110, 97, 114,
+101, 32, 102, 101, 108, 105, 115, 32, 105, 112, 115, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 112, 117, 114, 117, 115, 46, 32, 77, 97,
+101, 99, 101, 110, 97, 115, 32, 105, 112, 115, 117, 109, 46, 32, 77, 111, 114, 98, 105, 32, 99, 117, 114, 115, 117, 115, 46, 32, 86, 101, 115, 116,
+105, 98, 117, 108, 117, 109, 32, 100, 105, 97, 109, 32, 112, 117, 114, 117, 115, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 116, 44, 32, 99,
+111, 110, 118, 97, 108, 108, 105, 115, 32, 101, 117, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32, 97, 116, 44, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 78, 117, 108, 108, 97, 32, 97, 108, 105, 113, 117, 97, 109, 32, 97, 108, 105, 113, 117, 101, 116, 32, 108, 111, 114, 101, 109, 46, 32, 78, 117,
+110, 99, 32, 101, 116, 32, 109, 97, 117, 114, 105, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 101, 115, 116, 32, 98, 105, 98, 101, 110,
+100, 117, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 46, 32, 68, 111, 110, 101, 99, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101,
+32, 108, 105, 98, 101, 114, 111, 32, 101, 117, 32, 110, 105, 115, 108, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 103,
+101, 116, 32, 108, 105, 98, 101, 114, 111, 46, 32, 68, 111, 110, 101, 99, 32, 116, 101, 109, 112, 117, 115, 32, 105, 112, 115, 117, 109, 32, 115, 101,
+100, 32, 113, 117, 97, 109, 46, 32, 83, 101, 100, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 117, 110, 99, 32, 113, 117, 105, 115, 32, 101, 110,
+105, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 101, 99, 116, 117, 115, 32, 100, 105, 97, 109, 44, 32, 97, 100, 105, 112, 105, 115, 99,
+105, 110, 103, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 110, 111, 110, 44, 32, 112, 117, 108,
+118, 105, 110, 97, 114, 32, 105, 100, 44, 32, 102, 101, 108, 105, 115, 46, 32, 73, 110, 32, 99, 111, 110, 103, 117, 101, 32, 109, 97, 103, 110, 97,
+32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 117, 114, 110, 97, 46, 32, 78, 117, 110, 99, 32, 110, 111, 110, 32, 97, 117, 103, 117, 101, 32, 115,
+101, 100, 32, 110, 105, 115, 108, 32, 100, 105, 99, 116, 117, 109, 32, 108, 97, 111, 114, 101, 101, 116, 46, 32, 67, 117, 109, 32, 115, 111, 99, 105,
+105, 115, 32, 110, 97, 116, 111, 113, 117, 101, 32, 112, 101, 110, 97, 116, 105, 98, 117, 115, 32, 101, 116, 32, 109, 97, 103, 110, 105, 115, 32, 100,
+105, 115, 32, 112, 97, 114, 116, 117, 114, 105, 101, 110, 116, 32, 109, 111, 110, 116, 101, 115, 44, 32, 110, 97, 115, 99, 101, 116, 117, 114, 32, 114,
+105, 100, 105, 99, 117, 108, 117, 115, 32, 109, 117, 115, 46, 32, 73, 110, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 100, 97, 112, 105, 98,
+117, 115, 32, 109, 97, 115, 115, 97, 46, 32, 78, 117, 108, 108, 97, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 115, 97, 112, 105, 101, 110,
+32, 101, 116, 32, 113, 117, 97, 109, 46, 32, 78, 117, 110, 99, 32, 97, 99, 32, 109, 97, 103, 110, 97, 32, 108, 111, 98, 111, 114, 116, 105, 115,
+32, 116, 101, 108, 108, 117, 115, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 67, 114, 97, 115, 32,
+97, 117, 103, 117, 101, 32, 109, 97, 117, 114, 105, 115, 44, 32, 109, 97, 116, 116, 105, 115, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 102,
+101, 114, 109, 101, 110, 116, 117, 109, 32, 97, 116, 44, 32, 115, 101, 109, 112, 101, 114, 32, 97, 99, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32,
+67, 114, 97, 115, 32, 118, 105, 116, 97, 101, 32, 108, 105, 103, 117, 108, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 115, 101, 109, 32, 112,
+111, 115, 117, 101, 114, 101, 32, 105, 97, 99, 117, 108, 105, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 99, 111, 110, 100, 105, 109, 101, 110,
+116, 117, 109, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 102, 101, 108, 105, 115, 46, 32, 85, 116, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32,
+115, 97, 112, 105, 101, 110, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 77, 97, 117,
+114, 105, 115, 32, 117, 114, 110, 97, 46, 32, 85, 116, 32, 101, 117, 32, 101, 110, 105, 109, 32, 101, 117, 32, 97, 110, 116, 101, 32, 112, 111, 114,
+116, 97, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 46, 32, 65, 101, 110, 101, 97, 110, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117,
+101, 32, 101, 115, 116, 32, 97, 99, 32, 102, 101, 108, 105, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 97, 117, 99, 116,
+111, 114, 46, 32, 78, 117, 110, 99, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 46, 32, 77, 111, 114, 98, 105, 32, 108, 97, 111,
+114, 101, 101, 116, 32, 97, 110, 116, 101, 32, 101, 116, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 102, 101, 117, 103, 105, 97, 116,
+32, 97, 114, 99, 117, 32, 101, 103, 101, 116, 32, 101, 110, 105, 109, 46, 32, 77, 111, 114, 98, 105, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32,
+116, 111, 114, 116, 111, 114, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 97, 99, 117, 115, 32, 97,
+114, 99, 117, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 97, 99, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 118, 101, 108, 44,
+32, 112, 111, 115, 117, 101, 114, 101, 32, 105, 100, 44, 32, 101, 115, 116, 46, 32, 80, 114, 111, 105, 110, 32, 99, 111, 109, 109, 111, 100, 111, 32,
+103, 114, 97, 118, 105, 100, 97, 32, 115, 101, 109, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 118,
+101, 104, 105, 99, 117, 108, 97, 32, 108, 105, 98, 101, 114, 111, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 119, 105, 115, 105, 46, 32,
+77, 97, 101, 99, 101, 110, 97, 115, 32, 112, 114, 101, 116, 105, 117, 109, 32, 116, 101, 108, 108, 117, 115, 32, 101, 117, 32, 115, 97, 112, 105, 101,
+110, 46, 32, 78, 117, 110, 99, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 110, 117, 110, 99, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97,
+98, 105, 116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 65, 101, 110, 101, 97, 110, 32,
+100, 105, 99, 116, 117, 109, 32, 110, 101, 113, 117, 101, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 68, 111, 110, 101, 99, 32, 101,
+116, 32, 101, 114, 97, 116, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114,
+105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32,
+83, 101, 100, 32, 106, 117, 115, 116, 111, 32, 116, 117, 114, 112, 105, 115, 44, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 117, 116,
+44, 32, 109, 97, 116, 116, 105, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 111, 114, 110, 97, 114, 101, 32, 114, 117, 116, 114, 117, 109,
+44, 32, 109, 97, 115, 115, 97, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 101, 110, 105,
+109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 118, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 116, 101, 108, 108, 117, 115,
+32, 105, 112, 115, 117, 109, 44, 32, 108, 117, 99, 116, 117, 115, 32, 117, 116, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32,
+118, 105, 116, 97, 101, 44, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 111, 110, 44, 32, 108, 105, 103, 117, 108, 97, 46, 32, 80, 104,
+97, 115, 101, 108, 108, 117, 115, 32, 108, 97, 99, 105, 110, 105, 97, 32, 119, 105, 115, 105, 32, 97, 116, 32, 101, 115, 116, 46, 32, 68, 111, 110,
+101, 99, 32, 101, 108, 105, 116, 32, 119, 105, 115, 105, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 110, 111, 110, 44, 32, 112, 108, 97, 99, 101,
+114, 97, 116, 32, 105, 110, 44, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 105, 100, 44, 32, 101, 108, 105, 116, 46, 32, 78, 117, 110, 99,
+32, 100, 111, 108, 111, 114, 32, 100, 111, 108, 111, 114, 44, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 100, 44, 32, 98, 105, 98,
+101, 110, 100, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 108, 97, 99, 105, 110, 105, 97, 32, 105, 100, 44, 32, 101, 114, 97, 116, 46, 32, 67,
+114, 97, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 114, 111, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 115,
+117, 115, 99, 105, 112, 105, 116, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 67, 108, 97, 115, 115, 32, 97,
+112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32,
+116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114,
+32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 67, 114, 97, 115, 32, 111, 114, 99, 105, 46, 32,
+80, 114, 97, 101, 115, 101, 110, 116, 32, 109, 97, 115, 115, 97, 32, 117, 114, 110, 97, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 115, 101,
+109, 112, 101, 114, 44, 32, 97, 117, 99, 116, 111, 114, 32, 97, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 116,
+101, 108, 108, 117, 115, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 116, 32, 112, 117, 114, 117, 115, 46, 32, 77, 111, 114, 98, 105,
+32, 116, 111, 114, 116, 111, 114, 32, 113, 117, 97, 109, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 118, 101, 110, 101, 110, 97, 116, 105,
+115, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 97, 44, 32, 99, 117, 114, 115, 117, 115, 32, 101, 117, 44, 32, 101, 115, 116, 46, 32, 78, 117,
+110, 99, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 108, 101, 99, 116, 117, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 108, 105, 98, 101,
+114, 111, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 108,
+105, 103, 117, 108, 97, 46, 32, 78, 117, 110, 99, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 112, 111, 115, 117, 101, 114, 101, 32, 97, 114,
+99, 117, 46, 32, 77, 97, 117, 114, 105, 115, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 113, 117, 97, 109, 32, 97, 116, 32, 109, 97, 115, 115,
+97, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 108, 105, 113, 117, 101, 116, 32, 109, 97, 117, 114, 105,
+115, 46, 32, 73, 110, 32, 105, 100, 32, 97, 110, 116, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 97, 114, 105,
+117, 115, 32, 105, 112, 115, 117, 109, 32, 105, 110, 32, 97, 114, 99, 117, 46, 32, 70, 117, 115, 99, 101, 32, 109, 97, 117, 114, 105, 115, 32, 108,
+97, 99, 117, 115, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 97, 99, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 113, 117, 105,
+115, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 108, 117, 99, 116, 117, 115, 44, 32, 112, 101, 100, 101, 46, 32, 83, 101, 100, 32, 119, 105,
+115, 105, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 109, 97, 116, 116, 105, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32,
+104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 115, 101, 109, 32, 110, 101, 99, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 105,
+100, 32, 113, 117, 97, 109, 46, 32, 67, 114, 97, 115, 32, 110, 101, 99, 32, 109, 97, 117, 114, 105, 115, 46, 32, 73, 110, 116, 101, 103, 101, 114,
+32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 100, 117, 105, 32, 115, 101, 109, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32,
+115, 101, 100, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 99, 117, 114, 115, 117, 115, 32, 105, 110, 44, 32, 109, 97,
+103, 110, 97, 46, 32, 77, 97, 117, 114, 105, 115, 32, 110, 101, 113, 117, 101, 32, 108, 97, 99, 117, 115, 44, 32, 99, 111, 110, 115, 101, 99, 116,
+101, 116, 117, 101, 114, 32, 110, 101, 99, 44, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 101, 117, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111,
+114, 32, 101, 103, 101, 116, 44, 32, 100, 117, 105, 46, 32, 70, 117, 115, 99, 101, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 46,
+32, 68, 111, 110, 101, 99, 32, 110, 101, 99, 32, 116, 101, 108, 108, 117, 115, 32, 113, 117, 105, 115, 32, 108, 101, 111, 32, 108, 111, 98, 111, 114,
+116, 105, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 46, 32, 69, 116, 105, 97, 109, 32, 109, 101, 116, 117, 115, 32, 117, 114, 110,
+97, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 112, 114, 101, 116, 105, 117, 109, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 44,
+32, 99, 117, 114, 115, 117, 115, 32, 117, 116, 44, 32, 116, 117, 114, 112, 105, 115, 46, 32, 77, 111, 114, 98, 105, 32, 98, 105, 98, 101, 110, 100,
+117, 109, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 108, 101, 99, 116, 117, 115, 46, 32, 83, 101, 100, 32, 110, 111, 110, 32, 97, 110, 116, 101,
+32, 118, 105, 116, 97, 101, 32, 97, 114, 99, 117, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 116, 101, 109, 112, 111, 114, 46,
+32, 70, 117, 115, 99, 101, 32, 115, 101, 100, 32, 108, 105, 103, 117, 108, 97, 32, 105, 110, 32, 115, 101, 109, 32, 116, 101, 109, 112, 111, 114, 32,
+105, 109, 112, 101, 114, 100, 105, 101, 116, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 118, 101, 108, 32, 101, 115, 116, 46, 32, 80, 104, 97, 115,
+101, 108, 108, 117, 115, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32,
+110, 105, 98, 104, 46, 32, 67, 108, 97, 115, 115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115,
+113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105,
+97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115,
+46, 32, 83, 101, 100, 32, 118, 101, 108, 32, 108, 101, 111, 32, 110, 101, 99, 32, 101, 114, 111, 115, 32, 98, 108, 97, 110, 100, 105, 116, 32, 105,
+109, 112, 101, 114, 100, 105, 101, 116, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 100, 117, 105, 32, 117, 116, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97,
+32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 44, 32, 106, 117, 115, 116, 111, 32, 112, 117, 114, 117, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114,
+112, 101, 114, 32, 108, 105, 103, 117, 108, 97, 44, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 100,
+111, 108, 111, 114, 32, 101, 110, 105, 109, 32, 105, 110, 32, 108, 105, 98, 101, 114, 111, 46, 32, 83, 101, 100, 32, 101, 108, 101, 109, 101, 110, 116,
+117, 109, 44, 32, 112, 101, 100, 101, 32, 101, 103, 101, 116, 32, 112, 111, 114, 116, 97, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 44, 32, 100,
+117, 105, 32, 110, 117, 108, 108, 97, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 112, 101, 100, 101, 44, 32, 101, 103, 101, 116, 32, 118, 101,
+104, 105, 99, 117, 108, 97, 32, 111, 100, 105, 111, 32, 97, 110, 116, 101, 32, 97, 116, 32, 115, 101, 109, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 83, 101, 100, 32, 117, 108, 108, 97, 109,
+99, 111, 114, 112, 101, 114, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 105, 112, 115, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 114, 105,
+115, 117, 115, 32, 110, 105, 98, 104, 44, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 116, 101, 109,
+112, 117, 115, 32, 101, 103, 101, 116, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 97, 99, 44, 32, 110, 101, 113, 117, 101, 46, 32, 83,
+101, 100, 32, 113, 117, 105, 115, 32, 108, 111, 114, 101, 109, 32, 117, 116, 32, 116, 111, 114, 116, 111, 114, 32, 102, 97, 99, 105, 108, 105, 115, 105,
+115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 113, 117, 97, 109,
+32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 105, 112, 115, 117, 109, 46, 32, 77, 111, 114, 98, 105, 32, 97, 99, 32, 101, 108, 105, 116, 32, 113,
+117, 105, 115, 32, 116, 101, 108, 108, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 98, 108, 97, 110, 100, 105, 116, 46, 32, 77, 97,
+101, 99, 101, 110, 97, 115, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 115, 101, 109,
+46, 32, 78, 97, 109, 32, 115, 101, 100, 32, 101, 114, 111, 115, 32, 118, 101, 108, 32, 108, 97, 99, 117, 115, 32, 108, 111, 98, 111, 114, 116, 105,
+115, 32, 99, 111, 110, 103, 117, 101, 46, 32, 80, 114, 111, 105, 110, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 110, 117, 110, 99, 32, 108, 111,
+98, 111, 114, 116, 105, 115, 32, 111, 114, 99, 105, 46, 32, 68, 111, 110, 101, 99, 32, 101, 103, 101, 115, 116, 97, 115, 32, 101, 110, 105, 109, 32,
+101, 117, 32, 111, 100, 105, 111, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 105, 100, 32, 109, 101, 116, 117, 115, 46, 32, 80, 101,
+108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 99, 116, 111, 114, 44, 32, 115, 101, 109, 32, 118, 97, 114, 105, 117, 115, 32, 108, 117,
+99, 116, 117, 115, 32, 116, 101, 109, 112, 117, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 109, 97, 103, 110, 97, 32, 99, 117, 114, 115, 117, 115,
+32, 110, 101, 113, 117, 101, 44, 32, 101, 116, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 100, 105, 97, 109, 32, 100, 105, 97, 109, 32, 113,
+117, 105, 115, 32, 112, 117, 114, 117, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 100,
+111, 108, 111, 114, 46, 32, 78, 117, 108, 108, 97, 32, 105, 110, 32, 109, 97, 103, 110, 97, 46, 32, 67, 114, 97, 115, 32, 105, 100, 32, 100, 105,
+97, 109, 32, 97, 116, 32, 108, 101, 99, 116, 117, 115, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32,
+78, 117, 110, 99, 32, 112, 111, 114, 116, 97, 32, 112, 111, 115, 117, 101, 114, 101, 32, 115, 97, 112, 105, 101, 110, 46, 32, 69, 116, 105, 97, 109,
+32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 46, 32, 67, 108, 97, 115, 115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116,
+105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101,
+114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104,
+121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109,
+105, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32,
+100, 105, 97, 109, 32, 110, 111, 110, 32, 117, 114, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 108, 117, 99, 116, 117, 115, 32, 112, 104, 97, 114,
+101, 116, 114, 97, 32, 116, 101, 108, 108, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 97, 99, 32, 105, 112, 115, 117, 109, 32, 101, 103, 101, 116,
+32, 108, 105, 98, 101, 114, 111, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 67, 114, 97, 115, 32,
+105, 100, 32, 116, 101, 108, 108, 117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 110, 111, 110, 32, 114, 105, 115, 117, 115, 46, 32, 73, 110, 32, 100,
+111, 108, 111, 114, 46, 32, 70, 117, 115, 99, 101, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 113, 117, 97, 109, 32, 105, 110, 32,
+109, 97, 115, 115, 97, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 114, 116, 97, 46, 32, 77, 111, 114, 98, 105, 32, 117, 116, 32, 100,
+111, 108, 111, 114, 32, 101, 117, 32, 109, 97, 115, 115, 97, 32, 101, 103, 101, 115, 116, 97, 115, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117,
+109, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105,
+116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115,
+115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 108, 101, 111, 32,
+105, 110, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 101, 114, 97, 116, 32, 97, 32, 117, 114, 110,
+97, 32, 108, 97, 111, 114, 101, 101, 116, 32, 115, 101, 109, 112, 101, 114, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 117,
+116, 32, 109, 101, 116, 117, 115, 32, 97, 99, 32, 116, 101, 108, 108, 117, 115, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 108, 101, 105, 102, 101,
+110, 100, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 113, 117, 105, 115, 32, 117, 114, 110, 97, 46, 32, 67, 117, 114, 97, 98,
+105, 116, 117, 114, 32, 108, 97, 99, 105, 110, 105, 97, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 100, 117, 105, 46, 32, 78, 97, 109, 32,
+110, 101, 99, 32, 97, 110, 116, 101, 46, 32, 73, 110, 32, 105, 100, 32, 101, 110, 105, 109, 46, 32, 65, 101, 110, 101, 97, 110, 32, 109, 97, 116,
+116, 105, 115, 32, 101, 110, 105, 109, 46, 32, 73, 110, 32, 117, 116, 32, 110, 101, 113, 117, 101, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32,
+114, 105, 115, 117, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 85, 116, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 101,
+99, 116, 117, 115, 32, 118, 105, 116, 97, 101, 32, 116, 111, 114, 116, 111, 114, 46, 32, 68, 117, 105, 115, 32, 118, 101, 108, 105, 116, 46, 32, 78,
+117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32,
+117, 114, 110, 97, 46, 32, 67, 114, 97, 115, 32, 118, 97, 114, 105, 117, 115, 32, 116, 111, 114, 116, 111, 114, 32, 105, 110, 32, 112, 101, 100, 101,
+46, 32, 83, 101, 100, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 108, 97, 99, 105, 110, 105,
+97, 32, 108, 105, 98, 101, 114, 111, 32, 110, 101, 99, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 97, 108, 105, 113, 117, 97, 109,
+32, 114, 105, 115, 117, 115, 32, 110, 111, 110, 32, 110, 105, 115, 108, 46, 32, 78, 97, 109, 32, 97, 32, 110, 117, 110, 99, 32, 101, 116, 32, 102,
+101, 108, 105, 115, 32, 116, 101, 109, 112, 111, 114, 32, 102, 101, 117, 103, 105, 97, 116, 46, 32, 78, 117, 110, 99, 32, 109, 101, 116, 117, 115, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 109, 101, 116, 117, 115, 32, 105, 110, 32, 115, 101,
+109, 112, 101, 114, 32, 108, 97, 111, 114, 101, 101, 116, 44, 32, 117, 114, 110, 97, 32, 105, 112, 115, 117, 109, 32, 112, 104, 97, 114, 101, 116, 114,
+97, 32, 108, 111, 114, 101, 109, 44, 32, 115, 101, 100, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 109, 97, 103, 110, 97, 32, 108, 111, 114,
+101, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 119, 105, 115, 105, 46, 32, 83, 101, 100, 32, 119, 105, 115, 105, 46, 32, 78, 117, 108, 108,
+97, 109, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 101, 108, 105, 116, 32, 115, 101, 100, 32, 110, 105, 115, 108, 46, 32, 80, 104, 97, 115,
+101, 108, 108, 117, 115, 32, 109, 97, 116, 116, 105, 115, 32, 108, 101, 111, 32, 110, 101, 99, 32, 109, 97, 115, 115, 97, 46, 32, 65, 101, 110, 101,
+97, 110, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 67, 114, 97, 115, 32, 119, 105, 115, 105, 32, 101, 114, 97, 116, 44, 32, 108, 111,
+98, 111, 114, 116, 105, 115, 32, 110, 101, 99, 44, 32, 99, 117, 114, 115, 117, 115, 32, 101, 103, 101, 116, 44, 32, 108, 111, 98, 111, 114, 116, 105,
+115, 32, 97, 116, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 73, 110, 32, 109, 97, 115, 115, 97, 32, 110, 105, 115, 108, 44, 32, 114, 117, 116,
+114, 117, 109, 32, 110, 111, 110, 44, 32, 99, 117, 114, 115, 117, 115, 32, 110, 101, 99, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 115, 101,
+100, 44, 32, 108, 97, 99, 117, 115, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97,
+46, 32, 67, 114, 97, 115, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 110, 101, 113, 117, 101, 32, 97, 99, 32, 115, 117, 115, 99, 105, 112, 105,
+116, 32, 116, 101, 109, 112, 117, 115, 44, 32, 118, 101, 108, 105, 116, 32, 108, 111, 114, 101, 109, 32, 108, 117, 99, 116, 117, 115, 32, 101, 108, 105,
+116, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 114, 104, 111, 110, 99, 117, 115, 32, 119, 105, 115, 105, 32, 101, 115, 116, 32, 117, 116, 32, 115,
+101, 109, 46, 32, 80, 114, 111, 105, 110, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 101, 110, 105, 109, 32, 105, 110, 32, 101, 114, 111, 115,
+32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 97, 99, 99, 117, 109, 115, 97, 110, 46, 32, 85, 116, 32, 108, 111, 114, 101, 109, 32, 110, 105,
+115, 108, 44, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 101, 116, 44, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 110, 101, 99, 44, 32,
+108, 97, 99, 105, 110, 105, 97, 32, 105, 110, 44, 32, 100, 111, 108, 111, 114, 46, 32, 68, 117, 105, 115, 32, 110, 101, 99, 32, 113, 117, 97, 109,
+46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 101, 108, 105, 116, 32, 102, 101, 108, 105, 115, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32,
+105, 100, 44, 32, 108, 117, 99, 116, 117, 115, 32, 113, 117, 105, 115, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 117, 116, 44, 32, 105, 112, 115,
+117, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 101, 103, 101, 116, 32, 97, 114, 99, 117, 46, 32, 77, 97, 117, 114, 105, 115, 32, 109,
+97, 115, 115, 97, 32, 102, 101, 108, 105, 115, 44, 32, 111, 114, 110, 97, 114, 101, 32, 110, 111, 110, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115,
+32, 105, 100, 44, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 105, 110, 44, 32, 101, 108, 105, 116, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115,
+32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 109, 105, 32, 97, 99, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 102, 97, 99, 105, 108,
+105, 115, 105, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 101, 110, 105, 109, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 108, 101, 111, 44, 32,
+110, 111, 110, 32, 110, 111, 110, 117, 109, 109, 121, 32, 112, 101, 100, 101, 32, 100, 105, 97, 109, 32, 101, 103, 101, 116, 32, 110, 105, 98, 104, 46,
+32, 83, 101, 100, 32, 116, 101, 109, 112, 117, 115, 46, 32, 65, 101, 110, 101, 97, 110, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 115, 117, 115,
+99, 105, 112, 105, 116, 32, 100, 117, 105, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116,
+46, 32, 85, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 78, 97, 109, 32, 99, 111, 109, 109, 111, 100, 111, 44, 32, 110, 117, 108,
+108, 97, 32, 117, 116, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 114, 117, 116, 114, 117, 109, 44, 32, 111, 114, 99, 105, 32, 101, 108, 105,
+116, 32, 118, 105, 118, 101, 114, 114, 97, 32, 100, 105, 97, 109, 44, 32, 118, 105, 116, 97, 101, 32, 109, 111, 108, 108, 105, 115, 32, 111, 100, 105,
+111, 32, 111, 100, 105, 111, 32, 101, 116, 32, 112, 117, 114, 117, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111,
+108, 117, 116, 112, 97, 116, 46, 32, 83, 101, 100, 32, 97, 108, 105, 113, 117, 101, 116, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 105, 112, 115,
+117, 109, 46, 32, 73, 110, 32, 117, 116, 32, 101, 115, 116, 46, 32, 69, 116, 105, 97, 109, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109,
+46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 116, 111, 114, 116, 111, 114,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 108, 97, 99, 117, 115, 46, 32, 65, 101, 110, 101, 97, 110, 32, 111, 114, 99, 105, 46, 32, 83, 117,
+115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 108, 97, 99, 117, 115, 32, 110, 117, 108, 108, 97, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 97,
+44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 101, 114,
+111, 115, 46, 32, 68, 111, 110, 101, 99, 32, 97, 117, 99, 116, 111, 114, 32, 103, 114, 97, 118, 105, 100, 97, 32, 110, 105, 115, 108, 46, 32, 67,
+114, 97, 115, 32, 97, 99, 32, 101, 115, 116, 32, 114, 117, 116, 114, 117, 109, 32, 97, 117, 103, 117, 101, 32, 112, 117, 108, 118, 105, 110, 97, 114,
+32, 111, 114, 110, 97, 114, 101, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 109, 97, 117, 114, 105, 115, 32, 110, 105, 98, 104, 44, 32,
+118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 105, 110, 44, 32, 114, 104, 111, 110, 99, 117, 115, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44,
+32, 100, 97, 112, 105, 98, 117, 115, 32, 101, 103, 101, 116, 44, 32, 108, 97, 99, 117, 115, 46, 32, 78, 97, 109, 32, 110, 117, 110, 99, 32, 109,
+97, 117, 114, 105, 115, 44, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 97, 116, 44, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 97, 44,
+32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 97, 116, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32, 78, 97, 109, 32, 97, 99, 99, 117, 109,
+115, 97, 110, 32, 109, 111, 108, 108, 105, 115, 32, 108, 105, 98, 101, 114, 111, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 99, 111, 110, 100, 105,
+109, 101, 110, 116, 117, 109, 32, 109, 97, 116, 116, 105, 115, 32, 101, 115, 116, 46, 32, 68, 111, 110, 101, 99, 32, 108, 97, 99, 117, 115, 46, 32,
+78, 117, 108, 108, 97, 109, 32, 97, 99, 32, 115, 97, 112, 105, 101, 110, 32, 105, 100, 32, 109, 97, 115, 115, 97, 32, 108, 111, 98, 111, 114, 116,
+105, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 108, 101, 109, 101, 110,
+116, 117, 109, 46, 32, 80, 114, 111, 105, 110, 32, 117, 116, 32, 112, 117, 114, 117, 115, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 101, 116, 32,
+115, 97, 112, 105, 101, 110, 32, 113, 117, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 99, 111, 109, 109, 111, 100, 111, 32, 109, 111, 108, 108, 105,
+115, 46, 32, 78, 117, 108, 108, 97, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 46, 32, 80, 114, 111, 105, 110, 32, 97, 32, 119, 105, 115, 105,
+32, 117, 116, 32, 116, 101, 108, 108, 117, 115, 32, 98, 108, 97, 110, 100, 105, 116, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 46, 32, 65, 108,
+105, 113, 117, 97, 109, 32, 110, 117, 108, 108, 97, 32, 108, 111, 114, 101, 109, 44, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 97, 99, 44, 32,
+109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 118, 101, 108, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 101, 116, 44, 32, 109, 101, 116,
+117, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 101, 103, 101, 115, 116, 97, 115, 32, 110, 105, 98, 104, 32, 101, 116, 32, 108, 105,
+103, 117, 108, 97, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 100, 105, 97, 109, 32, 111, 100, 105, 111, 44, 32, 108, 97, 99, 105, 110, 105, 97,
+32, 113, 117, 105, 115, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 113, 117, 105, 115, 44, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117,
+100, 105, 110, 32, 117, 116, 44, 32, 101, 114, 111, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 108, 105, 113, 117, 101, 116, 32,
+108, 111, 114, 101, 109, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 83, 101, 100, 32, 99, 117, 114, 115, 117, 115, 32, 116, 101, 108, 108, 117,
+115, 32, 97, 99, 32, 111, 114, 99, 105, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 116, 32, 110, 117, 108, 108, 97, 46, 32, 68,
+111, 110, 101, 99, 32, 112, 111, 114, 116, 97, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 110, 116, 101, 46, 32, 80, 101, 108, 108, 101, 110, 116,
+101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 115,
+101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 102, 97,
+109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 83, 101, 100, 32, 105, 100, 32, 108, 101,
+99, 116, 117, 115, 32, 97, 116, 32, 109, 97, 115, 115, 97, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 116, 114, 105, 115, 116, 105,
+113, 117, 101, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 108, 97, 99, 117, 115,
+46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105, 116, 97, 115, 115, 101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109,
+115, 116, 46, 32, 78, 117, 110, 99, 32, 110, 111, 110, 32, 116, 117, 114, 112, 105, 115, 46, 32, 83, 101, 100, 32, 115, 97, 103, 105, 116, 116, 105,
+115, 46, 32, 77, 111, 114, 98, 105, 32, 108, 97, 111, 114, 101, 101, 116, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 100, 117, 105,
+46, 32, 78, 97, 109, 32, 97, 114, 99, 117, 32, 116, 101, 108, 108, 117, 115, 44, 32, 116, 101, 109, 112, 111, 114, 32, 118, 105, 116, 97, 101, 44,
+32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 116, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 117, 116, 44, 32, 118, 101,
+108, 105, 116, 46, 32, 73, 110, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 97, 117, 103, 117, 101, 32, 97, 32, 97, 114, 99, 117, 32, 118, 111,
+108, 117, 116, 112, 97, 116, 32, 115, 117, 115, 99, 105, 112, 105, 116, 46, 32, 68, 111, 110, 101, 99, 32, 100, 105, 99, 116, 117, 109, 32, 117, 108,
+116, 114, 105, 99, 101, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 97, 32, 112, 117, 114, 117, 115,
+32, 101, 116, 32, 111, 114, 99, 105, 32, 100, 105, 99, 116, 117, 109, 32, 108, 97, 99, 105, 110, 105, 97, 46, 32, 85, 116, 32, 108, 101, 111, 46,
+32, 67, 114, 97, 115, 32, 115, 101, 109, 112, 101, 114, 44, 32, 108, 111, 114, 101, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 116, 105, 110,
+99, 105, 100, 117, 110, 116, 32, 99, 111, 110, 103, 117, 101, 44, 32, 106, 117, 115, 116, 111, 32, 101, 114, 111, 115, 32, 118, 97, 114, 105, 117, 115,
+32, 112, 101, 100, 101, 44, 32, 105, 110, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 116, 117, 114, 112, 105, 115, 32, 108, 101, 99, 116, 117, 115,
+32, 110, 111, 110, 32, 101, 114, 111, 115, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 113, 117, 97, 109, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 109, 97, 116, 116, 105, 115, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 109, 97, 103, 110, 97,
+46, 32, 65, 101, 110, 101, 97, 110, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 100, 105, 97, 109, 32, 118, 101, 108, 32, 110, 105, 115, 108,
+32, 110, 111, 110, 117, 109, 109, 121, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115,
+101, 32, 118, 101, 108, 32, 100, 111, 108, 111, 114, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 110, 111, 110, 117, 109, 109, 121, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 115, 101, 109, 112, 101, 114, 32, 97, 110, 116, 101, 46, 32, 77,
+97, 101, 99, 101, 110, 97, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 101, 114, 111, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108,
+117, 109, 32, 97, 99, 32, 100, 111, 108, 111, 114, 46, 32, 70, 117, 115, 99, 101, 32, 114, 105, 115, 117, 115, 32, 109, 101, 116, 117, 115, 44, 32,
+97, 108, 105, 113, 117, 101, 116, 32, 101, 103, 101, 116, 44, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 101, 116, 44, 32, 102, 101, 117, 103,
+105, 97, 116, 32, 118, 101, 108, 44, 32, 111, 114, 99, 105, 46, 32, 85, 116, 32, 97, 116, 32, 110, 117, 110, 99, 32, 105, 100, 32, 97, 110, 116,
+101, 32, 115, 111, 100, 97, 108, 101, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 46, 32, 68, 117, 105, 115, 32, 116, 114, 105, 115, 116, 105,
+113, 117, 101, 32, 109, 97, 116, 116, 105, 115, 32, 97, 110, 116, 101, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 110, 101, 113, 117,
+101, 32, 109, 97, 117, 114, 105, 115, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 105, 100, 44, 32, 99, 111, 110, 103, 117, 101, 32, 105, 110, 116,
+101, 114, 100, 117, 109, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 117, 116, 44, 32, 100, 105, 97, 109, 46, 32, 78, 117, 108, 108, 97, 32, 118,
+111, 108, 117, 116, 112, 97, 116, 32, 98, 108, 97, 110, 100, 105, 116, 32, 109, 97, 103, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 99,
+117, 109, 115, 97, 110, 32, 99, 111, 110, 103, 117, 101, 32, 100, 105, 97, 109, 46, 32, 69, 116, 105, 97, 109, 32, 118, 101, 108, 32, 100, 117, 105,
+32, 101, 103, 101, 116, 32, 110, 105, 115, 108, 32, 116, 101, 109, 112, 111, 114, 32, 118, 97, 114, 105, 117, 115, 46, 32, 67, 114, 97, 115, 32, 100,
+105, 99, 116, 117, 109, 32, 109, 97, 115, 115, 97, 32, 115, 101, 100, 32, 101, 110, 105, 109, 46, 32, 67, 114, 97, 115, 32, 117, 114, 110, 97, 32,
+116, 111, 114, 116, 111, 114, 44, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 97, 99, 44, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101,
+114, 32, 105, 110, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 118, 101, 108, 44, 32, 97, 114, 99, 117, 46, 32, 77, 111, 114, 98, 105, 32, 112,
+111, 115, 117, 101, 114, 101, 32, 108, 117, 99, 116, 117, 115, 32, 97, 117, 103, 117, 101, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 100, 117, 105,
+32, 100, 117, 105, 44, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 105, 110, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 101, 117,
+44, 32, 108, 117, 99, 116, 117, 115, 32, 101, 117, 44, 32, 110, 117, 108, 108, 97, 46, 32, 67, 114, 97, 115, 32, 118, 101, 108, 105, 116, 32, 112,
+101, 100, 101, 44, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 102, 101, 117, 103, 105,
+97, 116, 32, 105, 110, 44, 32, 97, 117, 99, 116, 111, 114, 32, 118, 105, 116, 97, 101, 44, 32, 97, 110, 116, 101, 46, 32, 83, 117, 115, 112, 101,
+110, 100, 105, 115, 115, 101, 32, 100, 105, 99, 116, 117, 109, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 109, 97, 117, 114, 105, 115, 46, 32,
+73, 110, 32, 97, 32, 110, 105, 98, 104, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 32, 108, 105, 103, 117, 108, 97, 46, 32, 73, 110, 32, 113,
+117, 97, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 105, 116, 97, 101, 32, 117, 114, 110, 97, 32, 117, 108, 116, 114, 105, 99, 105,
+101, 115, 32, 115, 101, 109, 32, 97, 108, 105, 113, 117, 97, 109, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32, 65, 108, 105, 113, 117, 97, 109,
+32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 78, 97, 109, 32, 101, 115, 116, 46, 32, 68, 111, 110, 101, 99, 32, 102,
+97, 117, 99, 105, 98, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 109, 101, 116, 117, 115, 46, 32, 85, 116, 32, 99, 111, 110, 103, 117, 101,
+46, 32, 68, 111, 110, 101, 99, 32, 97, 114, 99, 117, 32, 116, 101, 108, 108, 117, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 97, 99,
+44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 97, 99, 44, 32, 109, 111, 108, 108, 105, 115, 32, 115, 101, 100, 44, 32, 108, 101, 99, 116,
+117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 118, 111, 108, 117, 116,
+112, 97, 116, 32, 110, 117, 110, 99, 32, 101, 116, 32, 102, 101, 108, 105, 115, 46, 32, 83, 101, 100, 32, 112, 101, 100, 101, 32, 111, 100, 105, 111,
+44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 105, 110, 44, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 109, 97, 108, 101, 115, 117, 97,
+100, 97, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 103, 114, 97, 118, 105, 100, 97, 44, 32, 110, 117, 108, 108, 97, 46, 32, 78, 117, 108, 108,
+97, 32, 97, 108, 105, 113, 117, 97, 109, 32, 112, 101, 100, 101, 32, 118, 105, 116, 97, 101, 32, 97, 114, 99, 117, 46, 32, 80, 114, 111, 105, 110,
+32, 118, 101, 108, 105, 116, 32, 101, 108, 105, 116, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 101,
+108, 101, 109, 101, 110, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 118, 97, 114, 105, 117, 115, 32, 118, 105, 116, 97, 101, 44, 32, 100, 111,
+108, 111, 114, 46, 32, 68, 111, 110, 101, 99, 32, 114, 117, 116, 114, 117, 109, 32, 105, 112, 115, 117, 109, 32, 101, 117, 32, 109, 105, 46, 32, 65,
+108, 105, 113, 117, 97, 109, 32, 101, 116, 32, 115, 101, 109, 46, 32, 73, 110, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 114, 104, 111,
+110, 99, 117, 115, 32, 118, 101, 108, 105, 116, 46, 32, 78, 97, 109, 32, 118, 105, 118, 101, 114, 114, 97, 32, 115, 99, 101, 108, 101, 114, 105, 115,
+113, 117, 101, 32, 97, 114, 99, 117, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 115, 101, 109, 46, 32, 83, 101, 100, 32, 116, 105, 110, 99, 105,
+100, 117, 110, 116, 32, 110, 117, 108, 108, 97, 32, 113, 117, 105, 115, 32, 109, 97, 115, 115, 97, 46, 32, 77, 97, 117, 114, 105, 115, 32, 102, 97,
+117, 99, 105, 98, 117, 115, 32, 116, 101, 109, 112, 117, 115, 32, 110, 117, 110, 99, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 99, 111,
+110, 100, 105, 109, 101, 110, 116, 117, 109, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 108, 105, 113, 117, 101, 116, 32, 105, 97, 99,
+117, 108, 105, 115, 32, 115, 97, 112, 105, 101, 110, 46, 32, 78, 117, 110, 99, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 111, 100, 105, 111, 32,
+118, 105, 116, 97, 101, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 44, 32, 116, 101, 108, 108, 117, 115,
+32, 108, 105, 98, 101, 114, 111, 32, 99, 111, 109, 109, 111, 100, 111, 32, 105, 112, 115, 117, 109, 44, 32, 117, 116, 32, 115, 111, 108, 108, 105, 99,
+105, 116, 117, 100, 105, 110, 32, 110, 105, 115, 108, 32, 110, 105, 115, 108, 32, 118, 101, 108, 32, 106, 117, 115, 116, 111, 46, 32, 78, 117, 108, 108,
+97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 98, 108, 97, 110, 100, 105, 116, 32, 101, 110, 105,
+109, 32, 117, 116, 32, 106, 117, 115, 116, 111, 46, 32, 80, 114, 111, 105, 110, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 44, 32, 101, 108, 105,
+116, 32, 101, 103, 101, 116, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 112, 117, 108, 118, 105, 110, 97, 114, 44, 32, 111, 114, 99, 105, 32, 113,
+117, 97, 109, 32, 97, 117, 99, 116, 111, 114, 32, 110, 101, 113, 117, 101, 44, 32, 115, 101, 100, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32,
+100, 105, 97, 109, 32, 112, 117, 114, 117, 115, 32, 118, 101, 108, 32, 102, 101, 108, 105, 115, 46, 32, 83, 101, 100, 32, 111, 114, 99, 105, 32, 108,
+101, 111, 44, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 118, 101, 108, 44, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 111, 110, 44, 32, 115,
+101, 109, 112, 101, 114, 32, 101, 117, 44, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44,
+32, 108, 105, 98, 101, 114, 111, 32, 97, 99, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 99, 111, 109, 109, 111, 100, 111, 44,
+32, 101, 114, 111, 115, 32, 115, 97, 112, 105, 101, 110, 32, 98, 108, 97, 110, 100, 105, 116, 32, 110, 105, 115, 108, 44, 32, 101, 117, 32, 101, 108,
+101, 105, 102, 101, 110, 100, 32, 110, 105, 98, 104, 32, 110, 105, 98, 104, 32, 118, 101, 108, 32, 108, 101, 99, 116, 117, 115, 46, 32, 86, 105, 118,
+97, 109, 117, 115, 32, 112, 108, 97, 99, 101, 114, 97, 116, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 111, 100, 105, 111, 32, 100, 111, 108, 111,
+114, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 110, 111, 110, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 105, 100, 44, 32, 118, 105, 118,
+101, 114, 114, 97, 32, 101, 103, 101, 116, 44, 32, 100, 105, 97, 109, 46, 32, 78, 117, 110, 99, 32, 109, 97, 117, 114, 105, 115, 32, 109, 97, 103,
+110, 97, 44, 32, 101, 103, 101, 115, 116, 97, 115, 32, 113, 117, 105, 115, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 105, 100, 44, 32, 102, 101,
+114, 109, 101, 110, 116, 117, 109, 32, 118, 105, 118, 101, 114, 114, 97, 44, 32, 109, 105, 46, 32, 65, 101, 110, 101, 97, 110, 32, 115, 117, 115, 99,
+105, 112, 105, 116, 32, 110, 105, 115, 108, 32, 110, 111, 110, 32, 110, 117, 110, 99, 46, 32, 80, 114, 111, 105, 110, 32, 113, 117, 105, 115, 32, 108,
+101, 99, 116, 117, 115, 32, 97, 99, 32, 116, 101, 108, 108, 117, 115, 32, 110, 111, 110, 117, 109, 109, 121, 32, 99, 111, 109, 109, 111, 100, 111, 46,
+32, 78, 117, 110, 99, 32, 101, 103, 101, 116, 32, 100, 105, 97, 109, 32, 97, 99, 32, 101, 108, 105, 116, 32, 118, 101, 115, 116, 105, 98, 117, 108,
+117, 109, 32, 97, 117, 99, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 111, 100, 105, 111,
+32, 115, 101, 100, 32, 108, 97, 99, 105, 110, 105, 97, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 44, 32, 106, 117, 115, 116, 111, 32, 109, 105,
+32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 112, 117, 114, 117, 115, 44, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 117, 105, 115, 109,
+111, 100, 32, 108, 105, 98, 101, 114, 111, 32, 109, 101, 116, 117, 115, 32, 115, 101, 100, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77, 97, 101, 99,
+101, 110, 97, 115, 32, 97, 99, 32, 101, 108, 105, 116, 32, 115, 101, 100, 32, 108, 111, 114, 101, 109, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101,
+32, 103, 114, 97, 118, 105, 100, 97, 46, 32, 80, 114, 111, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 101, 114, 111, 115, 44, 32, 117, 108, 108,
+97, 109, 99, 111, 114, 112, 101, 114, 32, 105, 100, 44, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 113, 117, 105, 115, 44, 32, 99, 111, 110, 100,
+105, 109, 101, 110, 116, 117, 109, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 44, 32, 115, 97, 112, 105, 101, 110, 46, 32, 83, 101, 100, 32, 101,
+116, 32, 109, 97, 115, 115, 97, 32, 101, 103, 101, 116, 32, 108, 111, 114, 101, 109, 32, 97, 108, 105, 113, 117, 101, 116, 32, 116, 101, 109, 112, 117,
+115, 46, 32, 68, 117, 105, 115, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 110, 105, 115, 108, 32, 110, 111, 110, 32, 114, 105, 115, 117, 115,
+46, 32, 78, 97, 109, 32, 105, 100, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 109, 32, 101, 115, 116, 46, 32, 80, 114, 111, 105, 110,
+32, 111, 114, 99, 105, 32, 100, 105, 97, 109, 44, 32, 112, 111, 115, 117, 101, 114, 101, 32, 101, 116, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97,
+32, 99, 111, 109, 109, 111, 100, 111, 44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 101, 108, 44, 32, 101, 110, 105, 109, 46, 32, 80, 114, 111, 105,
+110, 32, 101, 103, 101, 116, 32, 101, 114, 97, 116, 46, 32, 68, 111, 110, 101, 99, 32, 110, 105, 115, 108, 46, 32, 77, 97, 101, 99, 101, 110, 97,
+115, 32, 97, 117, 99, 116, 111, 114, 32, 118, 101, 108, 105, 116, 32, 117, 116, 32, 112, 101, 100, 101, 46, 32, 78, 117, 110, 99, 32, 118, 105, 116,
+97, 101, 32, 108, 101, 99, 116, 117, 115, 32, 110, 101, 99, 32, 108, 105, 98, 101, 114, 111, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 104,
+101, 110, 100, 114, 101, 114, 105, 116, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 118, 97, 114, 105, 117, 115, 44, 32, 101, 114, 97, 116, 32, 117,
+108, 116, 114, 105, 99, 101, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 105, 115, 109, 111, 100, 44, 32, 112, 117, 114, 117, 115, 32,
+108, 97, 99, 117, 115, 32, 100, 105, 99, 116, 117, 109, 32, 101, 114, 111, 115, 44, 32, 97, 116, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117,
+109, 32, 101, 110, 105, 109, 32, 100, 117, 105, 32, 110, 101, 99, 32, 109, 97, 103, 110, 97, 46, 32, 77, 111, 114, 98, 105, 32, 100, 105, 97, 109,
+46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 115, 101, 100, 32, 101, 115, 116, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 110,
+101, 99, 32, 108, 105, 98, 101, 114, 111, 32, 105, 110, 32, 97, 114, 99, 117, 32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 115, 111, 108, 108,
+105, 99, 105, 116, 117, 100, 105, 110, 46, 32, 73, 110, 32, 114, 117, 116, 114, 117, 109, 32, 110, 105, 115, 108, 32, 97, 116, 32, 97, 114, 99, 117,
+46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 100, 105, 103, 110, 105, 115, 115,
+105, 109, 46, 32, 69, 116, 105, 97, 109, 32, 101, 115, 116, 32, 109, 97, 117, 114, 105, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 115,
+101, 100, 44, 32, 118, 105, 118, 101, 114, 114, 97, 32, 101, 116, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 115, 101, 100, 44, 32, 110,
+101, 113, 117, 101, 46, 32, 85, 116, 32, 97, 116, 32, 108, 101, 99, 116, 117, 115, 32, 105, 100, 32, 110, 105, 98, 104, 32, 108, 117, 99, 116, 117,
+115, 32, 111, 114, 110, 97, 114, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 97, 114, 105, 117, 115, 32, 112, 111, 114, 116, 116, 105, 116, 111,
+114, 32, 114, 105, 115, 117, 115, 46, 32, 85, 116, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 97, 108, 105, 113, 117, 101, 116, 32, 114, 105,
+115, 117, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 117, 99, 116, 117, 115, 32, 110, 101, 113, 117, 101, 32, 115, 105, 116,
+32, 97, 109, 101, 116, 32, 110, 117, 110, 99, 46, 32, 68, 117, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 110, 105, 98, 104, 46,
+32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 100, 97, 112, 105, 98, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 101, 114, 111,
+115, 32, 108, 105, 98, 101, 114, 111, 44, 32, 97, 108, 105, 113, 117, 97, 109, 32, 110, 111, 110, 44, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116,
+117, 109, 32, 97, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 117, 116, 44, 32, 116, 117, 114, 112, 105, 115, 46, 32, 73, 110, 116, 101, 103, 101,
+114, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 109, 105, 32, 115, 101, 100, 32, 108, 111, 114, 101, 109, 46, 32, 86, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 115, 111, 100, 97, 108, 101, 115, 32, 110, 105, 115, 108, 46, 32, 78,
+117, 108, 108, 97, 32, 101, 117, 32, 106, 117, 115, 116, 111, 32, 113, 117, 105, 115, 32, 100, 117, 105, 32, 112, 114, 101, 116, 105, 117, 109, 32, 114,
+104, 111, 110, 99, 117, 115, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 118, 105, 118, 101, 114, 114, 97, 32, 99, 111, 109, 109, 111, 100, 111,
+32, 109, 105, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 100, 111, 108, 111, 114, 32, 108, 105, 98, 101, 114, 111, 44, 32, 118, 105, 118, 101,
+114, 114, 97, 32, 97, 44, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32,
+118, 105, 116, 97, 101, 44, 32, 100, 117, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 108, 101, 99,
+116, 117, 115, 32, 101, 116, 32, 109, 105, 46, 32, 77, 97, 117, 114, 105, 115, 32, 115, 97, 103, 105, 116, 116, 105, 115, 46, 32, 83, 101, 100, 32,
+97, 114, 99, 117, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 99, 116, 111, 114, 46, 32, 68, 111, 110, 101, 99,
+32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 112, 117, 114, 117, 115, 32, 110, 111, 110, 32, 116, 101, 108, 108, 117, 115, 46, 32,
+85, 116, 32, 108, 101, 111, 32, 119, 105, 115, 105, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 32, 101, 117, 44, 32, 103, 114, 97, 118, 105, 100, 97, 32, 97, 99, 44, 32, 108, 105, 98, 101, 114, 111, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 100, 97, 112, 105, 98, 117, 115, 32, 100, 105, 97, 109, 46, 32,
+73, 110, 116, 101, 103, 101, 114, 32, 113, 117, 105, 115, 32, 108, 97, 99, 117, 115, 32, 100, 97, 112, 105, 98, 117, 115, 32, 111, 100, 105, 111, 32,
+112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 97, 114, 105, 117, 115, 46, 32, 70, 117, 115, 99, 101, 32, 112, 101, 100, 101, 32,
+113, 117, 97, 109, 44, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 117, 116, 44, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 101, 116, 44, 32,
+116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 115, 101, 100, 44, 32, 102, 101, 108, 105, 115, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32,
+101, 114, 111, 115, 32, 101, 110, 105, 109, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 115, 101, 100, 44, 32, 97, 108, 105, 113, 117, 97,
+109, 32, 97, 99, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 97, 99, 44, 32, 101, 114, 97, 116, 46, 32, 85, 116, 32, 100, 105, 103, 110, 105,
+115, 115, 105, 109, 44, 32, 108, 97, 99, 117, 115, 32, 97, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 105, 97, 99, 117, 108, 105, 115, 44, 32,
+101, 110, 105, 109, 32, 111, 114, 99, 105, 32, 112, 111, 115, 117, 101, 114, 101, 32, 110, 117, 110, 99, 44, 32, 110, 101, 99, 32, 117, 108, 116, 114,
+105, 99, 105, 101, 115, 32, 108, 101, 99, 116, 117, 115, 32, 114, 105, 115, 117, 115, 32, 105, 110, 32, 111, 100, 105, 111, 46, 32, 69, 116, 105, 97,
+109, 32, 101, 116, 32, 109, 97, 115, 115, 97, 32, 105, 100, 32, 100, 117, 105, 32, 99, 111, 109, 109, 111, 100, 111, 32, 118, 101, 104, 105, 99, 117,
+108, 97, 46, 32, 78, 117, 110, 99, 32, 98, 108, 97, 110, 100, 105, 116, 32, 116, 111, 114, 116, 111, 114, 32, 113, 117, 105, 115, 32, 100, 117, 105,
+46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 110, 105, 115, 108, 46, 32, 83, 101, 100, 32, 118, 101, 110, 101, 110, 97, 116, 105, 115, 32, 98, 108,
+97, 110, 100, 105, 116, 32, 108, 105, 103, 117, 108, 97, 46, 32, 70, 117, 115, 99, 101, 32, 118, 105, 118, 101, 114, 114, 97, 32, 105, 109, 112, 101,
+114, 100, 105, 101, 116, 32, 109, 97, 103, 110, 97, 46, 32, 68, 111, 110, 101, 99, 32, 101, 103, 101, 116, 32, 110, 117, 110, 99, 32, 113, 117, 105,
+115, 32, 101, 115, 116, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 108, 111, 98, 111, 114, 116, 105, 115, 46, 32, 86, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 32, 113, 117, 105, 115, 32, 108, 101, 99, 116, 117, 115, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 111, 114, 99, 105,
+32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 110, 117, 110, 99, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 98, 105, 98, 101, 110, 100, 117,
+109, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 101, 103, 101, 116, 32, 108, 101, 111, 46, 32, 77, 111, 114, 98, 105, 32,
+118, 101, 108, 32, 117, 114, 110, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 101, 114, 97, 116, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109,
+32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 46, 32, 83, 101, 100, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 44, 32, 108, 105, 98, 101, 114,
+111, 32, 101, 116, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 99, 111, 110, 103, 117, 101, 44, 32, 119, 105, 115, 105, 32, 108,
+101, 99, 116, 117, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 100, 111, 108, 111, 114, 44, 32, 101, 103, 101, 116, 32, 109, 111, 108, 101, 115, 116,
+105, 101, 32, 109, 97, 103, 110, 97, 32, 111, 114, 99, 105, 32, 118, 101, 108, 32, 116, 101, 108, 108, 117, 115, 46, 32, 83, 101, 100, 32, 116, 101,
+109, 112, 111, 114, 32, 97, 110, 116, 101, 32, 101, 116, 32, 101, 110, 105, 109, 46, 32, 77, 97, 117, 114, 105, 115, 32, 101, 108, 105, 116, 46, 32,
+67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 109,
+97, 115, 115, 97, 46, 32, 83, 101, 100, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 68, 117, 105, 115, 32, 110, 117, 108, 108, 97, 46, 32, 78,
+97, 109, 32, 98, 105, 98, 101, 110, 100, 117, 109, 46, 32, 78, 97, 109, 32, 116, 111, 114, 116, 111, 114, 32, 108, 111, 114, 101, 109, 44, 32, 117,
+108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 118, 105, 116, 97, 101, 44, 32, 100, 105, 99, 116, 117, 109, 32, 115, 101, 100, 44, 32, 112, 111,
+115, 117, 101, 114, 101, 32, 101, 117, 44, 32, 106, 117, 115, 116, 111, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 97, 100, 105, 112, 105, 115, 99,
+105, 110, 103, 32, 97, 114, 99, 117, 32, 118, 105, 116, 97, 101, 32, 116, 117, 114, 112, 105, 115, 46, 32, 68, 111, 110, 101, 99, 32, 109, 97, 108,
+101, 115, 117, 97, 100, 97, 32, 112, 111, 115, 117, 101, 114, 101, 32, 108, 105, 98, 101, 114, 111, 46, 32, 85, 116, 32, 115, 101, 100, 32, 116, 101,
+108, 108, 117, 115, 46, 32, 70, 117, 115, 99, 101, 32, 115, 101, 100, 32, 110, 117, 110, 99, 32, 101, 103, 101, 116, 32, 110, 105, 115, 108, 32, 100,
+97, 112, 105, 98, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111,
+116, 101, 110, 116, 105, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 108, 105, 98, 101, 114, 111, 32,
+101, 116, 32, 109, 101, 116, 117, 115, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 77, 97, 101, 99, 101,
+110, 97, 115, 32, 110, 111, 110, 32, 115, 101, 109, 32, 110, 111, 110, 32, 113, 117, 97, 109, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 98,
+108, 97, 110, 100, 105, 116, 46, 32, 68, 117, 105, 115, 32, 114, 105, 115, 117, 115, 32, 116, 101, 108, 108, 117, 115, 44, 32, 114, 117, 116, 114, 117,
+109, 32, 118, 105, 116, 97, 101, 44, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 32, 110, 101, 99, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100,
+97, 32, 110, 101, 99, 44, 32, 105, 112, 115, 117, 109, 46, 32, 78, 117, 110, 99, 32, 113, 117, 97, 109, 32, 100, 111, 108, 111, 114, 44, 32, 108,
+117, 99, 116, 117, 115, 32, 101, 103, 101, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 110, 111, 110, 44, 32, 114, 104, 111, 110, 99, 117,
+115, 32, 97, 116, 44, 32, 116, 101, 108, 108, 117, 115, 46, 32, 68, 117, 105, 115, 32, 112, 101, 100, 101, 32, 108, 101, 99, 116, 117, 115, 44, 32,
+109, 97, 116, 116, 105, 115, 32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 44, 32, 116, 101, 109, 112, 111, 114, 32, 117, 116, 44, 32, 112, 111,
+114, 116, 97, 32, 97, 116, 44, 32, 109, 105, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 114, 105, 115, 117, 115, 32, 110,
+117, 108, 108, 97, 44, 32, 115, 111, 100, 97, 108, 101, 115, 32, 115, 101, 100, 44, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 105, 100, 44, 32,
+110, 111, 110, 117, 109, 109, 121, 32, 118, 105, 116, 97, 101, 44, 32, 108, 105, 103, 117, 108, 97, 46, 32, 77, 111, 114, 98, 105, 32, 112, 117, 108,
+118, 105, 110, 97, 114, 32, 112, 101, 100, 101, 32, 117, 116, 32, 109, 97, 115, 115, 97, 46, 32, 78, 117, 110, 99, 32, 114, 105, 115, 117, 115, 32,
+109, 97, 117, 114, 105, 115, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 101, 116, 44, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 101,
+117, 44, 32, 115, 117, 115, 99, 105, 112, 105, 116, 32, 118, 101, 108, 44, 32, 111, 114, 99, 105, 46, 32, 73, 110, 32, 102, 97, 117, 99, 105, 98,
+117, 115, 32, 102, 101, 108, 105, 115, 32, 105, 110, 32, 97, 114, 99, 117, 46, 32, 78, 117, 108, 108, 97, 32, 115, 105, 116, 32, 97, 109, 101, 116,
+32, 101, 108, 105, 116, 46, 32, 78, 117, 108, 108, 97, 32, 101, 114, 97, 116, 32, 115, 97, 112, 105, 101, 110, 44, 32, 115, 97, 103, 105, 116, 116,
+105, 115, 32, 101, 103, 101, 116, 44, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 101, 103, 101, 116, 44, 32, 118, 105, 118, 101, 114, 114, 97,
+32, 101, 117, 44, 32, 102, 101, 108, 105, 115, 46, 32, 78, 97, 109, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 116, 117, 114, 112, 105, 115, 32, 118, 101, 108, 32, 115, 101, 109, 32, 108,
+97, 99, 105, 110, 105, 97, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 46, 32, 77, 97, 117, 114, 105, 115, 32, 111, 114, 110, 97, 114,
+101, 32, 105, 112, 115, 117, 109, 32, 115, 101, 100, 32, 108, 105, 103, 117, 108, 97, 46, 32, 68, 117, 105, 115, 32, 102, 97, 99, 105, 108, 105, 115,
+105, 115, 32, 110, 101, 113, 117, 101, 32, 113, 117, 105, 115, 32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 109, 32, 101, 116, 32, 101, 114,
+97, 116, 32, 101, 116, 32, 111, 114, 99, 105, 32, 108, 97, 99, 105, 110, 105, 97, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 46,
+32, 68, 111, 110, 101, 99, 32, 97, 99, 32, 105, 112, 115, 117, 109, 46, 32, 68, 117, 105, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 105,
+112, 115, 117, 109, 32, 97, 99, 32, 97, 114, 99, 117, 46, 32, 65, 101, 110, 101, 97, 110, 32, 99, 111, 110, 103, 117, 101, 32, 97, 99, 99, 117,
+109, 115, 97, 110, 32, 97, 110, 116, 101, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44, 32, 108, 101, 111,
+32, 117, 116, 32, 111, 114, 110, 97, 114, 101, 32, 97, 108, 105, 113, 117, 97, 109, 44, 32, 110, 117, 110, 99, 32, 101, 114, 97, 116, 32, 99, 111,
+110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 97, 114, 99, 117, 44, 32, 117, 116, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 109, 105, 32, 97,
+117, 103, 117, 101, 32, 101, 116, 32, 110, 117, 108, 108, 97, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108, 97, 99, 105, 110, 105, 97, 32, 97,
+108, 105, 113, 117, 101, 116, 32, 119, 105, 115, 105, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 110, 101, 99, 32, 100, 117, 105, 46, 32, 69, 116,
+105, 97, 109, 32, 119, 105, 115, 105, 32, 108, 101, 111, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 118, 105, 116, 97, 101, 44, 32, 118, 117, 108,
+112, 117, 116, 97, 116, 101, 32, 97, 44, 32, 100, 105, 99, 116, 117, 109, 32, 118, 105, 116, 97, 101, 44, 32, 113, 117, 97, 109, 46, 32, 81, 117,
+105, 115, 113, 117, 101, 32, 113, 117, 105, 115, 32, 116, 111, 114, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 105, 110, 116, 101, 114, 100, 117,
+109, 46, 32, 73, 110, 32, 109, 97, 115, 115, 97, 32, 101, 114, 97, 116, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 101, 100, 44,
+32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32, 118, 101, 108, 44, 32, 118, 101, 104, 105, 99, 117, 108, 97, 32, 102, 114, 105, 110, 103, 105, 108,
+108, 97, 44, 32, 97, 117, 103, 117, 101, 46, 32, 78, 117, 108, 108, 97, 32, 118, 101, 108, 32, 117, 114, 110, 97, 46, 32, 73, 110, 32, 108, 105,
+98, 101, 114, 111, 32, 109, 105, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 115, 101, 100, 44, 32, 109, 97, 116, 116, 105, 115, 32, 116, 101, 109,
+112, 117, 115, 44, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 115, 101, 100, 44, 32, 109, 97, 115, 115, 97, 46, 32, 83, 117, 115, 112, 101, 110,
+100, 105, 115, 115, 101, 32, 113, 117, 97, 109, 32, 119, 105, 115, 105, 44, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109, 32, 113, 117, 105, 115, 44,
+32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 97, 116, 44, 32, 99, 111, 110, 115, 101, 113, 117, 97, 116, 32, 101, 103, 101, 116, 44, 32, 111, 100,
+105, 111, 46, 32, 78, 117, 108, 108, 97, 109, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44, 32, 112, 117, 114, 117, 115, 32, 113, 117, 105, 115,
+32, 97, 108, 105, 113, 117, 97, 109, 32, 99, 117, 114, 115, 117, 115, 44, 32, 116, 117, 114, 112, 105, 115, 32, 111, 100, 105, 111, 32, 101, 103, 101,
+115, 116, 97, 115, 32, 106, 117, 115, 116, 111, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 103, 114, 97, 118, 105, 100, 97, 32, 116, 117, 114,
+112, 105, 115, 32, 119, 105, 115, 105, 32, 118, 101, 108, 32, 116, 111, 114, 116, 111, 114, 46, 32, 78, 117, 110, 99, 32, 117, 108, 116, 114, 105, 99,
+105, 101, 115, 32, 112, 111, 114, 116, 97, 32, 112, 117, 114, 117, 115, 46, 32, 80, 114, 111, 105, 110, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109,
+32, 101, 114, 97, 116, 32, 97, 99, 32, 111, 114, 99, 105, 46, 32, 85, 116, 32, 118, 101, 108, 32, 109, 97, 103, 110, 97, 32, 110, 101, 99, 32,
+109, 105, 32, 102, 101, 117, 103, 105, 97, 116, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 46, 32, 85, 116, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110,
+32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101,
+115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32, 68, 111, 110, 101, 99, 32, 101,
+116, 32, 109, 97, 103, 110, 97, 32, 105, 110, 32, 100, 105, 97, 109, 32, 112, 111, 114, 116, 97, 32, 110, 111, 110, 117, 109, 109, 121, 46, 32, 77,
+97, 101, 99, 101, 110, 97, 115, 32, 117, 116, 32, 115, 101, 109, 32, 105, 110, 32, 116, 117, 114, 112, 105, 115, 32, 102, 101, 114, 109, 101, 110, 116,
+117, 109, 32, 118, 105, 118, 101, 114, 114, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 97, 116, 32, 111, 114, 99, 105, 46,
+32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114, 105,
+115, 116, 105, 113, 117, 101, 32, 115, 101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108, 101,
+115, 117, 97, 100, 97, 32, 102, 97, 109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32, 86,
+101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102,
+97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32,
+112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97, 101, 59, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115,
+113, 117, 101, 32, 114, 117, 116, 114, 117, 109, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 106, 117, 115, 116, 111, 46, 32, 78, 117, 108, 108, 97,
+109, 32, 118, 105, 116, 97, 101, 32, 112, 101, 100, 101, 46, 32, 68, 111, 110, 101, 99, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32,
+110, 105, 98, 104, 32, 101, 116, 32, 111, 100, 105, 111, 46, 32, 83, 101, 100, 32, 101, 116, 32, 109, 101, 116, 117, 115, 46, 32, 67, 108, 97, 115,
+115, 32, 97, 112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111,
+114, 97, 32, 116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32,
+112, 101, 114, 32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 78, 97, 109, 32, 116, 101, 109, 112,
+117, 115, 46, 32, 83, 101, 100, 32, 97, 99, 32, 119, 105, 115, 105, 46, 32, 73, 110, 32, 104, 97, 99, 32, 104, 97, 98, 105, 116, 97, 115, 115,
+101, 32, 112, 108, 97, 116, 101, 97, 32, 100, 105, 99, 116, 117, 109, 115, 116, 46, 32, 83, 101, 100, 32, 115, 101, 100, 32, 119, 105, 115, 105, 46,
+32, 85, 116, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 116, 101, 108, 108, 117, 115, 32, 110, 111, 110, 32, 108, 105, 103, 117, 108, 97, 46,
+32, 73, 110, 116, 101, 103, 101, 114, 32, 109, 101, 116, 117, 115, 46, 32, 73, 110, 32, 108, 97, 99, 105, 110, 105, 97, 32, 100, 117, 105, 46, 32,
+67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 111, 114, 110, 97, 114, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 118, 101, 108, 32, 117, 114, 110,
+97, 46, 32, 78, 97, 109, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 117, 114,
+110, 97, 46, 32, 78, 117, 110, 99, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 101, 114, 97,
+116, 46, 32, 83, 101, 100, 32, 98, 108, 97, 110, 100, 105, 116, 44, 32, 114, 105, 115, 117, 115, 32, 110, 111, 110, 32, 99, 111, 109, 109, 111, 100,
+111, 32, 110, 111, 110, 117, 109, 109, 121, 44, 32, 108, 105, 103, 117, 108, 97, 32, 101, 114, 97, 116, 32, 102, 101, 114, 109, 101, 110, 116, 117, 109,
+32, 110, 105, 98, 104, 44, 32, 101, 117, 32, 102, 97, 99, 105, 108, 105, 115, 105, 115, 32, 97, 110, 116, 101, 32, 110, 101, 113, 117, 101, 32, 115,
+101, 100, 32, 115, 101, 109, 46, 32, 69, 116, 105, 97, 109, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 106, 117, 115, 116, 111, 32,
+101, 103, 101, 116, 32, 119, 105, 115, 105, 46, 32, 78, 117, 110, 99, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 46, 32, 80, 114, 111, 105, 110,
+32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 113, 117, 97, 109, 32, 110, 111, 110, 32, 108, 101, 99, 116, 117, 115, 46, 32, 80, 114, 111, 105, 110,
+32, 117, 116, 32, 116, 117, 114, 112, 105, 115, 32, 113, 117, 105, 115, 32, 97, 117, 103, 117, 101, 32, 112, 101, 108, 108, 101, 110, 116, 101, 115, 113,
+117, 101, 32, 100, 105, 99, 116, 117, 109, 46, 32, 70, 117, 115, 99, 101, 32, 101, 116, 32, 108, 111, 114, 101, 109, 46, 32, 65, 108, 105, 113, 117,
+97, 109, 32, 117, 114, 110, 97, 32, 108, 97, 99, 117, 115, 44, 32, 98, 108, 97, 110, 100, 105, 116, 32, 115, 101, 100, 44, 32, 118, 101, 115, 116,
+105, 98, 117, 108, 117, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 101, 116, 44, 32, 100, 111,
+108, 111, 114, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 97, 117, 99, 116, 111, 114, 32, 101, 114, 97, 116, 32, 110, 101, 99, 32, 108,
+111, 114, 101, 109, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 117, 114, 110, 97, 32, 119, 105, 115, 105, 44, 32, 108, 97, 99, 105, 110,
+105, 97, 32, 117, 116, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 44, 32, 99, 111, 110, 100, 105,
+109, 101, 110, 116, 117, 109, 32, 105, 100, 44, 32, 111, 100, 105, 111, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 99, 111, 110, 118, 97,
+108, 108, 105, 115, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 106, 117, 115, 116, 111, 46, 32, 68, 111, 110, 101, 99, 32, 118, 101,
+115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 115, 116, 32, 97, 99, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 109, 32, 118, 105, 116,
+97, 101, 32, 101, 108, 105, 116, 32, 101, 117, 32, 109, 97, 115, 115, 97, 32, 118, 97, 114, 105, 117, 115, 32, 118, 117, 108, 112, 117, 116, 97, 116,
+101, 46, 32, 78, 117, 108, 108, 97, 32, 102, 97, 99, 105, 108, 105, 115, 105, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112,
+111, 116, 101, 110, 116, 105, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 110, 111, 110, 32, 108, 105, 98, 101, 114, 111, 46, 32, 78, 117, 108,
+108, 97, 109, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 109, 97, 115, 115, 97, 32, 105, 100, 32, 109, 97, 103, 110, 97, 32, 118, 105, 118,
+101, 114, 114, 97, 32, 99, 111, 109, 109, 111, 100, 111, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 108, 105, 98, 101, 114, 111, 32,
+116, 111, 114, 116, 111, 114, 44, 32, 108, 117, 99, 116, 117, 115, 32, 97, 99, 44, 32, 118, 105, 118, 101, 114, 114, 97, 32, 99, 111, 110, 103, 117,
+101, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 32, 118, 101, 108, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 65, 101, 110,
+101, 97, 110, 32, 97, 114, 99, 117, 32, 97, 117, 103, 117, 101, 44, 32, 108, 117, 99, 116, 117, 115, 32, 105, 100, 44, 32, 108, 97, 111, 114, 101,
+101, 116, 32, 112, 117, 108, 118, 105, 110, 97, 114, 44, 32, 100, 105, 99, 116, 117, 109, 32, 115, 101, 100, 44, 32, 108, 101, 99, 116, 117, 115, 46,
+32, 68, 111, 110, 101, 99, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 118, 111, 108, 117, 116, 112, 97, 116, 32, 100, 111, 108, 111, 114,
+46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 104, 97, 98, 105, 116, 97, 110, 116, 32, 109, 111, 114, 98, 105, 32, 116, 114,
+105, 115, 116, 105, 113, 117, 101, 32, 115, 101, 110, 101, 99, 116, 117, 115, 32, 101, 116, 32, 110, 101, 116, 117, 115, 32, 101, 116, 32, 109, 97, 108,
+101, 115, 117, 97, 100, 97, 32, 102, 97, 109, 101, 115, 32, 97, 99, 32, 116, 117, 114, 112, 105, 115, 32, 101, 103, 101, 115, 116, 97, 115, 46, 32,
+80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 97, 117, 103, 117, 101, 32, 116, 117, 114, 112, 105, 115, 44, 32, 108, 97, 111, 114, 101,
+101, 116, 32, 110, 101, 99, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 97, 116, 44, 32, 110, 111, 110, 117, 109, 109, 121, 32, 118, 105,
+116, 97, 101, 44, 32, 110, 105, 98, 104, 46, 32, 69, 116, 105, 97, 109, 32, 111, 114, 99, 105, 32, 115, 97, 112, 105, 101, 110, 44, 32, 99, 111,
+110, 103, 117, 101, 32, 105, 110, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 114, 117, 116,
+114, 117, 109, 32, 118, 101, 108, 44, 32, 110, 105, 98, 104, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 101, 117, 32, 108, 111, 114, 101, 109, 46,
+32, 77, 97, 117, 114, 105, 115, 32, 112, 114, 101, 116, 105, 117, 109, 32, 108, 101, 111, 32, 101, 116, 32, 101, 108, 105, 116, 46, 32, 73, 110, 32,
+110, 111, 110, 117, 109, 109, 121, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 115, 97, 112, 105, 101, 110, 46, 32, 77, 97, 117, 114, 105, 115,
+32, 118, 97, 114, 105, 117, 115, 46, 32, 77, 97, 117, 114, 105, 115, 32, 115, 101, 100, 32, 108, 105, 98, 101, 114, 111, 46, 32, 67, 117, 114, 97,
+98, 105, 116, 117, 114, 32, 117, 108, 108, 97, 109, 99, 111, 114, 112, 101, 114, 32, 101, 108, 105, 116, 32, 101, 117, 32, 112, 117, 114, 117, 115, 46,
+32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 118, 101, 108, 105, 116, 32, 112, 101, 100, 101, 44, 32, 115, 101, 109, 112, 101, 114, 32, 115,
+105, 116, 32, 97, 109, 101, 116, 44, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 118, 105, 116, 97, 101, 44, 32, 116, 105, 110, 99, 105, 100, 117,
+110, 116, 32, 118, 101, 108, 44, 32, 100, 117, 105, 46, 32, 78, 117, 108, 108, 97, 32, 110, 101, 113, 117, 101, 32, 97, 110, 116, 101, 44, 32, 115,
+97, 103, 105, 116, 116, 105, 115, 32, 101, 117, 44, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 101, 116, 44, 32, 108, 97, 99, 105, 110,
+105, 97, 32, 97, 44, 32, 108, 105, 98, 101, 114, 111, 46, 32, 77, 111, 114, 98, 105, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 119, 105, 115,
+105, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 110, 111, 110, 32, 102, 101, 108, 105, 115, 32, 113, 117, 105, 115, 32, 97,
+114, 99, 117, 32, 98, 105, 98, 101, 110, 100, 117, 109, 32, 111, 114, 110, 97, 114, 101, 46, 32, 65, 101, 110, 101, 97, 110, 32, 101, 110, 105, 109,
+32, 109, 101, 116, 117, 115, 44, 32, 99, 111, 109, 109, 111, 100, 111, 32, 101, 117, 44, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 110, 111,
+110, 117, 109, 109, 121, 44, 32, 101, 117, 105, 115, 109, 111, 100, 32, 117, 116, 44, 32, 113, 117, 97, 109, 46, 32, 78, 117, 108, 108, 97, 32, 101,
+108, 101, 105, 102, 101, 110, 100, 32, 110, 105, 115, 108, 32, 113, 117, 105, 115, 32, 100, 111, 108, 111, 114, 46, 32, 67, 108, 97, 115, 115, 32, 97,
+112, 116, 101, 110, 116, 32, 116, 97, 99, 105, 116, 105, 32, 115, 111, 99, 105, 111, 115, 113, 117, 32, 97, 100, 32, 108, 105, 116, 111, 114, 97, 32,
+116, 111, 114, 113, 117, 101, 110, 116, 32, 112, 101, 114, 32, 99, 111, 110, 117, 98, 105, 97, 32, 110, 111, 115, 116, 114, 97, 44, 32, 112, 101, 114,
+32, 105, 110, 99, 101, 112, 116, 111, 115, 32, 104, 121, 109, 101, 110, 97, 101, 111, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 112, 101,
+108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 109, 97, 115, 115, 97, 32, 105, 110, 32, 101, 114, 97, 116, 32, 109, 111, 108, 101, 115, 116, 105,
+101, 32, 109, 111, 108, 101, 115, 116, 105, 101, 46, 32, 77, 97, 117, 114, 105, 115, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 100, 97, 112,
+105, 98, 117, 115, 32, 108, 105, 98, 101, 114, 111, 46, 32, 83, 101, 100, 32, 115, 101, 100, 32, 114, 105, 115, 117, 115, 32, 105, 100, 32, 110, 101,
+113, 117, 101, 32, 100, 105, 99, 116, 117, 109, 32, 111, 114, 110, 97, 114, 101, 46, 32, 83, 101, 100, 32, 101, 117, 32, 108, 105, 103, 117, 108, 97,
+32, 97, 116, 32, 102, 101, 108, 105, 115, 32, 115, 111, 100, 97, 108, 101, 115, 32, 97, 99, 99, 117, 109, 115, 97, 110, 46, 32, 83, 101, 100, 32,
+105, 110, 116, 101, 114, 100, 117, 109, 44, 32, 117, 114, 110, 97, 32, 110, 111, 110, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32, 104, 101, 110, 100,
+114, 101, 114, 105, 116, 44, 32, 113, 117, 97, 109, 32, 109, 105, 32, 111, 114, 110, 97, 114, 101, 32, 108, 105, 98, 101, 114, 111, 44, 32, 105, 100,
+32, 102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 116, 111, 114, 116, 111, 114, 32, 111, 114, 99, 105, 32, 110, 111, 110, 32, 118, 101, 108, 105, 116,
+46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 110, 101, 99, 32, 114, 105, 115, 117, 115, 46, 32, 68, 111, 110, 101, 99, 32, 97, 116, 32, 110, 117,
+110, 99, 32, 118, 105, 116, 97, 101, 32, 116, 101, 108, 108, 117, 115, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 118, 101, 115, 116, 105, 98, 117,
+108, 117, 109, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115, 113, 117, 101, 32, 118, 101, 108, 32, 106, 117, 115, 116, 111, 46, 32, 68, 117, 105,
+115, 32, 108, 105, 103, 117, 108, 97, 32, 108, 105, 98, 101, 114, 111, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 113, 117, 105, 115, 44,
+32, 97, 100, 105, 112, 105, 115, 99, 105, 110, 103, 32, 98, 105, 98, 101, 110, 100, 117, 109, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 118, 105,
+116, 97, 101, 44, 32, 118, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 101, 116, 32, 97, 114, 99, 117, 46, 32, 70, 117, 115,
+99, 101, 32, 101, 103, 101, 116, 32, 113, 117, 97, 109, 46, 32, 85, 116, 32, 97, 110, 116, 101, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115,
+115, 101, 32, 102, 101, 117, 103, 105, 97, 116, 32, 109, 101, 116, 117, 115, 32, 110, 111, 110, 32, 105, 112, 115, 117, 109, 46, 32, 78, 117, 108, 108,
+97, 32, 116, 101, 109, 112, 117, 115, 32, 108, 101, 111, 32, 117, 116, 32, 109, 105, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 118, 105,
+116, 97, 101, 32, 110, 105, 115, 108, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 46, 32, 69, 116, 105,
+97, 109, 32, 97, 32, 111, 114, 99, 105, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112, 115, 117, 109,
+32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116, 117, 115, 32,
+101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67, 117, 114, 97,
+101, 59, 32, 86, 105, 118, 97, 109, 117, 115, 32, 117, 114, 110, 97, 32, 113, 117, 97, 109, 44, 32, 116, 105, 110, 99, 105, 100, 117, 110, 116, 32,
+97, 116, 44, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 118, 101, 108, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 101, 103, 101, 116, 44, 32,
+110, 117, 108, 108, 97, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 108, 97, 99, 117, 115, 32, 109, 97, 103, 110, 97, 44, 32, 110, 111, 110,
+117, 109, 109, 121, 32, 101, 117, 44, 32, 105, 97, 99, 117, 108, 105, 115, 32, 115, 101, 100, 44, 32, 99, 111, 110, 115, 101, 99, 116, 101, 116, 117,
+101, 114, 32, 113, 117, 105, 115, 44, 32, 101, 110, 105, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 97, 32, 101, 114, 111, 115, 46, 32,
+65, 108, 105, 113, 117, 97, 109, 32, 110, 111, 110, 117, 109, 109, 121, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 101, 113, 117, 101, 46,
+32, 78, 117, 108, 108, 97, 32, 101, 110, 105, 109, 46, 32, 80, 114, 97, 101, 115, 101, 110, 116, 32, 109, 111, 108, 101, 115, 116, 105, 101, 44, 32,
+111, 114, 99, 105, 32, 113, 117, 105, 115, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 32, 118, 111, 108, 117, 116, 112, 97, 116, 44, 32, 108, 97,
+99, 117, 115, 32, 109, 101, 116, 117, 115, 32, 108, 117, 99, 116, 117, 115, 32, 115, 97, 112, 105, 101, 110, 44, 32, 101, 116, 32, 102, 97, 99, 105,
+108, 105, 115, 105, 115, 32, 101, 114, 111, 115, 32, 110, 101, 113, 117, 101, 32, 105, 100, 32, 115, 97, 112, 105, 101, 110, 46, 32, 78, 117, 110, 99,
+32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 100, 111, 108, 111, 114, 32, 118, 101, 108, 32, 111, 114, 99, 105, 46, 32, 73, 110, 116,
+101, 103, 101, 114, 32, 119, 105, 115, 105, 32, 100, 105, 97, 109, 44, 32, 112, 111, 114, 116, 116, 105, 116, 111, 114, 32, 115, 105, 116, 32, 97, 109,
+101, 116, 44, 32, 102, 101, 117, 103, 105, 97, 116, 32, 105, 110, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 105, 110, 44, 32, 108, 101, 99, 116,
+117, 115, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112, 97, 116, 46, 32, 81, 117, 105, 115, 113,
+117, 101, 32, 109, 111, 108, 108, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 118, 105, 116, 97, 101, 32, 116, 111, 114, 116, 111, 114, 46, 32, 77,
+97, 117, 114, 105, 115, 32, 116, 117, 114, 112, 105, 115, 32, 109, 105, 44, 32, 112, 114, 101, 116, 105, 117, 109, 32, 117, 116, 44, 32, 117, 108, 116,
+114, 105, 99, 101, 115, 32, 115, 101, 100, 44, 32, 112, 111, 114, 116, 97, 32, 105, 110, 44, 32, 106, 117, 115, 116, 111, 46, 32, 83, 117, 115, 112,
+101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 115, 117, 101, 114, 101, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 117, 108, 116, 114, 105, 99, 105,
+101, 115, 32, 108, 97, 99, 117, 115, 32, 118, 105, 116, 97, 101, 32, 101, 110, 105, 109, 46, 32, 68, 111, 110, 101, 99, 32, 108, 97, 99, 117, 115,
+46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32, 112, 111, 116, 101, 110, 116, 105, 46, 32, 68, 111, 110, 101, 99, 32, 109, 111, 108,
+101, 115, 116, 105, 101, 44, 32, 109, 97, 103, 110, 97, 32, 115, 101, 100, 32, 101, 117, 105, 115, 109, 111, 100, 32, 100, 105, 99, 116, 117, 109, 44,
+32, 109, 97, 103, 110, 97, 32, 109, 97, 103, 110, 97, 32, 105, 110, 116, 101, 114, 100, 117, 109, 32, 100, 105, 97, 109, 44, 32, 118, 105, 116, 97,
+101, 32, 115, 97, 103, 105, 116, 116, 105, 115, 32, 108, 101, 111, 32, 108, 111, 114, 101, 109, 32, 97, 99, 32, 110, 101, 113, 117, 101, 46, 32, 67,
+114, 97, 115, 32, 109, 101, 116, 117, 115, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 110, 117, 110, 99, 46, 32, 68, 117, 105, 115, 32, 99, 111,
+110, 115, 101, 99, 116, 101, 116, 117, 101, 114, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 103, 114, 97, 118, 105, 100, 97, 32, 115,
+111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 117, 114, 110, 97, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 118, 111, 108, 117, 116, 112,
+97, 116, 44, 32, 109, 97, 115, 115, 97, 32, 113, 117, 105, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 117, 108, 118, 105, 110, 97, 114,
+44, 32, 101, 114, 111, 115, 32, 112, 117, 114, 117, 115, 32, 100, 105, 103, 110, 105, 115, 115, 105, 109, 32, 110, 117, 110, 99, 44, 32, 101, 103, 101,
+116, 32, 114, 104, 111, 110, 99, 117, 115, 32, 101, 110, 105, 109, 32, 108, 101, 99, 116, 117, 115, 32, 113, 117, 105, 115, 32, 116, 111, 114, 116, 111,
+114, 46, 32, 73, 110, 116, 101, 103, 101, 114, 32, 108, 97, 99, 105, 110, 105, 97, 32, 113, 117, 97, 109, 32, 113, 117, 105, 115, 32, 101, 114, 97,
+116, 32, 99, 111, 110, 118, 97, 108, 108, 105, 115, 32, 109, 97, 116, 116, 105, 115, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101, 32,
+105, 97, 99, 117, 108, 105, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 118, 101, 108, 105, 116, 46, 32, 69, 116, 105, 97, 109, 32, 116, 101, 108,
+108, 117, 115, 32, 101, 110, 105, 109, 44, 32, 97, 108, 105, 113, 117, 101, 116, 32, 110, 101, 99, 44, 32, 108, 97, 111, 114, 101, 101, 116, 32, 97,
+44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 110, 111, 110, 44, 32, 118, 101, 108, 105, 116, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 108,
+97, 99, 117, 115, 32, 118, 101, 108, 105, 116, 44, 32, 101, 108, 101, 105, 102, 101, 110, 100, 32, 105, 109, 112, 101, 114, 100, 105, 101, 116, 44, 32,
+102, 114, 105, 110, 103, 105, 108, 108, 97, 32, 105, 100, 44, 32, 100, 97, 112, 105, 98, 117, 115, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117,
+101, 44, 32, 108, 101, 99, 116, 117, 115, 46, 32, 78, 117, 108, 108, 97, 32, 113, 117, 105, 115, 32, 108, 111, 114, 101, 109, 46, 32, 78, 117, 108,
+108, 97, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 110, 101, 113, 117, 101, 32, 101, 116, 32, 100, 117, 105, 46, 32, 80, 104, 97, 115, 101,
+108, 108, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 117, 108, 116, 114, 105, 99, 105, 101, 115, 32, 111, 100, 105, 111, 46, 32, 80,
+104, 97, 115, 101, 108, 108, 117, 115, 32, 118, 105, 116, 97, 101, 32, 108, 105, 103, 117, 108, 97, 46, 32, 80, 101, 108, 108, 101, 110, 116, 101, 115,
+113, 117, 101, 32, 102, 101, 117, 103, 105, 97, 116, 32, 97, 114, 99, 117, 32, 97, 116, 32, 101, 114, 97, 116, 46, 32, 86, 105, 118, 97, 109, 117,
+115, 32, 117, 116, 32, 101, 114, 111, 115, 32, 117, 116, 32, 108, 111, 114, 101, 109, 32, 112, 117, 108, 118, 105, 110, 97, 114, 32, 105, 97, 99, 117,
+108, 105, 115, 46, 32, 80, 114, 111, 105, 110, 32, 108, 111, 98, 111, 114, 116, 105, 115, 32, 105, 112, 115, 117, 109, 32, 105, 100, 32, 110, 117, 110,
+99, 46, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 118, 101, 108, 32, 109, 97, 115, 115, 97, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105,
+115, 115, 101, 32, 110, 117, 108, 108, 97, 32, 105, 112, 115, 117, 109, 44, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 118, 101, 108, 44, 32,
+112, 111, 115, 117, 101, 114, 101, 32, 101, 103, 101, 116, 44, 32, 109, 111, 108, 108, 105, 115, 32, 97, 116, 44, 32, 114, 105, 115, 117, 115, 46, 32,
+86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 115, 101, 100, 32, 100, 105, 97, 109, 32, 105, 100, 32, 101, 115, 116, 32, 100, 97, 112, 105, 98,
+117, 115, 32, 117, 108, 116, 114, 105, 99, 101, 115, 46, 32, 80, 114, 111, 105, 110, 32, 116, 101, 109, 112, 117, 115, 44, 32, 101, 114, 111, 115, 32,
+97, 32, 115, 99, 101, 108, 101, 114, 105, 115, 113, 117, 101, 32, 118, 101, 115, 116, 105, 98, 117, 108, 117, 109, 44, 32, 105, 112, 115, 117, 109, 32,
+97, 114, 99, 117, 32, 97, 108, 105, 113, 117, 97, 109, 32, 109, 105, 44, 32, 117, 116, 32, 102, 101, 117, 103, 105, 97, 116, 32, 108, 105, 98, 101,
+114, 111, 32, 111, 100, 105, 111, 32, 105, 110, 32, 110, 105, 115, 108, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 101, 116, 32, 109, 97, 115, 115,
+97, 32, 97, 32, 109, 97, 117, 114, 105, 115, 32, 108, 117, 99, 116, 117, 115, 32, 99, 111, 110, 103, 117, 101, 46, 32, 85, 116, 32, 105, 100, 32,
+101, 114, 111, 115, 46, 32, 70, 117, 115, 99, 101, 32, 97, 110, 116, 101, 32, 101, 114, 111, 115, 44, 32, 112, 104, 97, 114, 101, 116, 114, 97, 32,
+110, 111, 110, 44, 32, 109, 111, 108, 101, 115, 116, 105, 101, 32, 116, 114, 105, 115, 116, 105, 113, 117, 101, 44, 32, 98, 105, 98, 101, 110, 100, 117,
+109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 44, 32, 119, 105, 115, 105, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 114, 117, 116, 114,
+117, 109, 44, 32, 100, 111, 108, 111, 114, 32, 101, 116, 32, 115, 101, 109, 112, 101, 114, 32, 101, 108, 101, 109, 101, 110, 116, 117, 109, 44, 32, 101,
+114, 111, 115, 32, 97, 110, 116, 101, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 109, 97, 115, 115, 97, 44, 32, 115, 101, 100, 32, 115, 111,
+108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 108, 101, 99, 116, 117, 115, 32, 118, 101, 108, 105, 116, 32, 101, 116, 32, 109, 97, 115, 115, 97,
+46, 32, 73, 110, 32, 97, 117, 99, 116, 111, 114, 46, 32, 65, 108, 105, 113, 117, 97, 109, 32, 101, 114, 97, 116, 32, 118, 111, 108, 117, 116, 112,
+97, 116, 46, 32, 69, 116, 105, 97, 109, 32, 114, 105, 115, 117, 115, 32, 108, 101, 111, 44, 32, 118, 117, 108, 112, 117, 116, 97, 116, 101, 32, 115,
+117, 115, 99, 105, 112, 105, 116, 44, 32, 115, 111, 108, 108, 105, 99, 105, 116, 117, 100, 105, 110, 32, 101, 116, 44, 32, 115, 111, 100, 97, 108, 101,
+115, 32, 101, 103, 101, 116, 44, 32, 110, 105, 115, 108, 46, 32, 86, 101, 115, 116, 105, 98, 117, 108, 117, 109, 32, 97, 110, 116, 101, 32, 105, 112,
+115, 117, 109, 32, 112, 114, 105, 109, 105, 115, 32, 105, 110, 32, 102, 97, 117, 99, 105, 98, 117, 115, 32, 111, 114, 99, 105, 32, 108, 117, 99, 116,
+117, 115, 32, 101, 116, 32, 117, 108, 116, 114, 105, 99, 101, 115, 32, 112, 111, 115, 117, 101, 114, 101, 32, 99, 117, 98, 105, 108, 105, 97, 32, 67,
+117, 114, 97, 101, 59, 32, 67, 117, 114, 97, 98, 105, 116, 117, 114, 32, 108, 111, 98, 111, 114, 116, 105, 115, 44, 32, 108, 105, 98, 101, 114, 111,
+32, 97, 99, 32, 108, 97, 111, 114, 101, 101, 116, 32, 109, 111, 108, 108, 105, 115, 44, 32, 108, 105, 103, 117, 108, 97, 32, 108, 101, 111, 32, 112,
+111, 114, 116, 97, 32, 119, 105, 115, 105, 44, 32, 117, 116, 32, 101, 117, 105, 115, 109, 111, 100, 32, 102, 101, 108, 105, 115, 32, 108, 105, 103, 117,
+108, 97, 32, 105, 100, 32, 101, 108, 105, 116, 46, 32, 86, 105, 118, 97, 109, 117, 115, 32, 109, 97, 108, 101, 115, 117, 97, 100, 97, 32, 110, 117,
+108, 108, 97, 32, 101, 117, 32, 101, 110, 105, 109, 46, 32, 68, 111, 110, 101, 99, 32, 97, 99, 99, 117, 109, 115, 97, 110, 32, 102, 97, 117, 99,
+105, 98, 117, 115, 32, 111, 114, 99, 105, 46, 32, 78, 117, 108, 108, 97, 32, 108, 97, 99, 105, 110, 105, 97, 32, 97, 110, 116, 101, 46, 32, 80,
+114, 97, 101, 115, 101, 110, 116, 32, 97, 116, 32, 110, 105, 98, 104, 46, 32, 77, 97, 117, 114, 105, 115, 32, 112, 111, 114, 116, 97, 32, 100, 105,
+103, 110, 105, 115, 115, 105, 109, 32, 119, 105, 115, 105, 46, 32, 85, 116, 32, 108, 97, 99, 105, 110, 105, 97, 32, 116, 111, 114, 116, 111, 114, 32,
+110, 101, 99, 32, 110, 117, 110, 99, 46, 32, 80, 104, 97, 115, 101, 108, 108, 117, 115, 32, 101, 116, 32, 97, 117, 103, 117, 101, 46, 32, 73, 110,
+116, 101, 103, 101, 114, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 108, 105, 98, 101, 114, 111, 32, 97, 32, 112, 101, 108, 108, 101, 110, 116, 101,
+115, 113, 117, 101, 32, 114, 104, 111, 110, 99, 117, 115, 44, 32, 116, 111, 114, 116, 111, 114, 32, 115, 97, 112, 105, 101, 110, 32, 108, 111, 98, 111,
+114, 116, 105, 115, 32, 112, 101, 100, 101, 44, 32, 101, 103, 101, 116, 32, 99, 111, 110, 100, 105, 109, 101, 110, 116, 117, 109, 32, 115, 97, 112, 105,
+101, 110, 32, 114, 105, 115, 117, 115, 32, 118, 105, 116, 97, 101, 32, 101, 108, 105, 116, 46, 32, 83, 117, 115, 112, 101, 110, 100, 105, 115, 115, 101,
+32, 115, 101, 100, 32, 116, 117, 114, 112, 105, 115, 32, 117, 116, 32, 100, 111, 108, 111, 114, 32, 112, 108, 97, 99, 101, 114, 97, 116, 32, 100, 105,
+103, 110, 105, 115, 115, 105, 109, 46, 32, 81, 117, 105, 115, 113, 117, 101, 32, 113, 117, 105, 115, 32, 108, 101, 111, 46, 32, 67, 114, 97, 115, 32,
+117, 108, 116, 114, 105, 99, 101, 115, 46, 32, 77, 97, 101, 99, 101, 110, 97, 115, 32, 104, 101, 110, 100, 114, 101, 114, 105, 116, 32, 97, 117, 99,
+116, 111, 114, 32, 116, 111, 114, 116, 111, 114, 46, 32, 69, 116, 105, 97, 109, 32, 115, 105, 116, 32, 97, 109, 101, 116, 32, 97, 114, 99, 117, 46
+};
diff --git a/source/blender/editors/datafiles/Bfont.c b/source/blender/editors/datafiles/Bfont.c
index 324bcffde77..1dcf9f72af4 100644
--- a/source/blender/editors/datafiles/Bfont.c
+++ b/source/blender/editors/datafiles/Bfont.c
@@ -30,103 +30,4 @@
int datatoc_Bfont_size= 25181;
-char datatoc_Bfont[]= {"\x80\x01\xe4\x01\x00\x00\x25\x21\x50\x53\x2d\x41\x64\x6f\x62\x65\x46\x6f\x6e\x74\x2d\x31\x2e\x30\x3a\x20\x42\x66\x6f\x6e\x74\x20\x30\x30\x31\x2e\x30\x30\x31\x0a\x31\x31\x20\x64\x69\x63\x74\x20\x62\x65\x67\x69\x6e\x0a\x2f\x46\x6f\x6e\x74\x49\x6e\x66\x6f\x20\x31\x30\x20\x64\x69\x63\x74\x20\x64\x75\x70\x20\x62\x65\x67\x69\x6e\x0a\x2f\x76\x65\x72\x73\x69\x6f\x6e\x20\x28" \
-"\x30\x30\x31\x2e\x30\x30\x31\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x75\x6c\x6c\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x61\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x20\x28\x42\x66\x6f\x6e\x74\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x57\x65\x69\x67\x68\x74\x20\x28\x52\x65\x67\x75\x6c\x61\x72\x29\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x49\x74\x61\x6c\x69\x63\x41\x6e\x67\x6c\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x69\x73\x46\x69\x78\x65\x64\x50\x69\x74\x63\x68\x20\x66\x61\x6c\x73\x65\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x50\x6f\x73\x69\x74\x69\x6f\x6e\x20\x2d\x31\x30\x30\x20\x64\x65\x66\x0a\x2f\x55\x6e\x64\x65\x72\x6c\x69\x6e\x65\x54\x68\x69\x63\x6b\x6e\x65\x73\x73\x20\x35\x30\x20\x64\x65\x66\x0a\x65\x6e\x64\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4e\x61\x6d\x65\x20\x2f\x42\x66\x6f\x6e\x74\x20\x64\x65\x66\x0a\x2f\x45\x6e" \
-"\x63\x6f\x64\x69\x6e\x67\x20\x53\x74\x61\x6e\x64\x61\x72\x64\x45\x6e\x63\x6f\x64\x69\x6e\x67\x20\x64\x65\x66\x0a\x2f\x50\x61\x69\x6e\x74\x54\x79\x70\x65\x20\x30\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x54\x79\x70\x65\x20\x31\x20\x64\x65\x66\x0a\x2f\x46\x6f\x6e\x74\x4d\x61\x74\x72\x69\x78\x20\x5b\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x20\x30\x2e\x30\x30\x31\x20\x30\x20\x30\x5d\x20\x72\x65\x61\x64\x6f\x6e\x6c\x79\x20\x64\x65\x66\x0a\x63\x75\x72\x72\x65\x6e\x74\x64\x69\x63\x74\x20\x65\x6e\x64\x0a\x63\x75\x72\x72\x65\x6e\x74\x66\x69\x6c\x65\x20\x65\x65\x78\x65\x63\x0a\x80\x02\x92\x5e\x00\x00\xd9\xd6\x6f\x63\x3b\x84\x6a\x98\x9b\x99\x74\xb0\x17\x9f\xc6\xcc\x44\x5b\xc2\xc0\x31\x03\xc6\x85\x70\xa7\xb3\x54\xa4\xa2\x80\xae\x6f\xbf\x7f\x98\xf7\x5a\x84\xba\xce\x2d\x03\x6a\x6b\x51\xb8\x48\x49\x31\x59\x1d\x92\xe5\x06\x9e\x62\x26\xd5\xad\xcc\x5d\xe4\xf8\x10\x7a\xa6\x9a\x35\xb5\x5f\x6a\x9b\x4b\x4f\x93\xc5\x6c\x23\xbc\xc6\x1d\xd7\xbf\x8f\x32\xf2\x1d\x58\xe4\x1a\x5f\x79\x0c\xee\x2f\x02\xaf\x49\x86\x95\xe9\x0c\x1d\x0b\xd2\x59\xe7" \
-"\x5b\x02\x19\x30\x0b\x0f\x69\x2c\x33\x77\x9c\x2a\xa6\x7a\xe8\x51\x7a\xbe\x12\x30\x08\x45\x22\x4a\xf6\xad\x5d\xa9\xdb\x9a\x1a\x3a\x40\xfb\x06\xb3\x6a\x9c\xcd\x69\x12\x55\x07\xfc\x2d\xe9\xd0\x41\x84\xc7\x60\x42\xf0\x3f\xcf\xd1\x53\x84\x00\x23\x97\x2a\x81\x2a\xb9\xb3\xcb\x56\x70\xc1\xce\x27\x59\x71\x1c\x75\x29\x42\x62\xd6\xf2\x91\xaf\x9b\x7c\x76\x07\x1e\xda\x7e\x7a\xd0\x26\x21\x62\x32\x22\xb9\x36\x08\x7a\xb2\x7f\xfe\x5f\x07\x86\x47\x06\x65\x92\x18\x3d\xc3\x47\xae\x92\xe6\xbf\x56\xb1\x7b\xed\xce\x13\x68\x46\xf6\xa2\xa3\x76\xab\x8c\x0b\xc0\xff\x4e\x34\x7d\x20\xfd\x0e\xc7\x7e\xfa\xb1\xf0\x63\x31\x00\x14\x8d\x2a\x7d\x2f\xd2\x1f\x12\x5a\xaa\xcd\x8f\xdb\x99\x79\x83\x2b\x67\x0d\x8a\xaa\x76\xd2\x12\xba\xb5\x61\x46\x19\x90\x96\x0c\x35\x6e\xb8\xd8\xe9\xf3\xc6\x5d\x9d\xfe\x7f\x8c\x2c\x8a\x7b\x2b\xe9\x9e\x63\xff\x6c\x86\x88\x3c\x1d\xe5\x07\x8d\xa3\xb9\x1e\x03\xe4\x84\x0d\xdd\x6d\x30\xe3\x3c\xe3\x87\x75\xdc\x80\x43\xc3\x93\x20\x76\x47\xbe\x83\x0b\xf5\xc8\x5d\x1e\xe2\x20\x72\x1a\x27\xe8\x8a\x21\x6d\xe8\x01\x0b\xe9\xd4\x4e\xdd" \
-"\x58\x9e\x87\x5f\x9f\x0e\x26\x1f\x0c\x6a\xff\x33\x93\x2a\x8b\xfe\xd2\x77\x06\x60\xdd\xe2\x8c\xb7\xd5\xde\x05\xcd\x0d\x8c\xfd\xd6\x7d\x67\xe3\x34\x3c\x66\x1f\xfa\xa3\x93\xe4\xa7\x3a\xcf\x9c\x44\xa6\x96\xa7\xa9\x74\x53\xc2\x96\x68\x98\x1f\x07\x9d\x26\x4c\x1d\x0a\xf7\x3f\x39\xc2\x6a\xe6\xb7\x78\x87\xbb\xc9\xd3\x52\xea\xa8\xb6\xa7\x5a\x38\x25\x6d\xa0\x90\x0d\x30\xcc\xbe\x0e\xa9\x67\x7f\x88\x66\x18\x51\x3d\x20\xe9\xe4\x9e\x12\xeb\xbd\x1c\x00\xde\x43\x11\x6e\x8f\x47\xdf\xb5\x21\x11\x42\x51\xd2\x07\x17\xba\xf5\xe5\xc6\x8f\x3e\x71\x21\x50\xec\x57\x94\x41\x2a\x1b\x6f\x80\xdf\xc4\x8c\x2d\x20\x5b\x7b\x9e\x88\x99\xa6\x90\x7e\x73\x85\xdc\xfe\xea\xc0\x7b\x0e\xef\x4b\xc7\x74\x1c\xf1\x19\x1e\x42\xe2\xf8\x9f\x8e\x2e\x29\x0a\xed\x6f\xcd\x1f\xe6\x48\xc4\x31\xc8\x32\x1d\x73\x99\x8d\xc6\xe1\xda\x9d\x56\x38\x43\xf9\x63\x32\x19\x97\x0e\xc8\x23\xba\xfa\xcc\x97\xbb\xd1\x33\x81\xa1\x44\x76\x82\x1f\x19\x86\xff\x4b\xaa\xf0\xe1\x71\x90\x05\xb2\x85\x2d\x55\xf2\x42\x0a\x0a\x41\x8a\x5d\x93\x48\xd2\xfa\xd1\x7b\x94\x87\x0c\x9c\x5e\x0d\xfa\x1f" \
-"\xd3\x9d\x52\x80\x84\x8f\x0b\x9b\x2f\xd3\x97\xe8\x8e\xfd\x52\x68\xea\xe7\xbe\xa9\x4e\x20\x5a\x02\x29\xc9\x7a\x8e\xcd\x90\xea\xcc\xc6\xe3\x38\x39\x06\x3f\x08\xed\x59\xc7\x1e\xe2\xa9\x30\xc6\xbf\x26\x72\x57\x87\xbd\x62\xfb\xe0\xd2\x9a\x3a\x57\x1a\x38\x29\xdb\x77\x7c\x6d\x53\xb6\xa9\xa6\x7b\xff\xbe\x23\x79\xb1\x25\x5c\x80\xf2\xf7\x84\xda\x95\x8c\x74\xb8\xa3\x0d\xf8\x8a\x44\x7c\xe5\xd3\x59\xd2\x65\xac\x95\xdd\xb6\x71\x24\xb6\x2e\x05\x8d\x7f\x93\x36\x76\x43\x6b\x69\xbb\x28\x35\xd0\xaa\x19\x2d\x71\xd8\x6e\x87\x38\x07\x1a\x0e\xe1\x3d\x4f\xe4\x48\x1e\x27\xdc\xc3\xe3\xe5\x99\xc4\x1c\x06\x6b\xf0\x36\x43\x06\x5e\x8f\x00\x22\xb4\x31\x0e\x29\x6f\x09\x29\x5e\xcb\xb8\x8b\x8e\x22\x8c\x8a\x5a\x19\xd8\x59\xfc\x2d\x2e\x84\xa9\x9a\xe6\x83\x0f\x14\x64\x63\xeb\x6a\x49\xb9\x59\x06\x42\xe6\xab\xca\x16\xd5\xe3\xb7\x20\x8a\x74\xfd\xd0\xe6\x79\x10\x3f\xee\x84\x45\x1c\x87\x58\x73\x12\x15\x0b\x66\xac\xc8\x25\xde\xff\x64\xdd\x50\xad\xda\x35\xd2\xfa\x94\xd3\xf1\x61\x96\xb9\x2b\xfa\x8a\x0e\x7a\x85\x1e\xbf\x36\x9e\x76\x16\x0c\xe8\x19\xe4\x3c" \
-"\x65\xce\x77\x1d\x39\x0c\x63\x24\xa7\xb6\x99\x56\xc3\x15\x46\x9a\x66\x6a\x2d\xec\x46\x97\x8f\xb9\xcf\xfc\x6a\x2e\xa8\x50\xd8\xce\x9d\xab\x76\x4d\x52\x99\x18\x36\xa5\x80\xa0\x1b\xc3\x75\xf1\x8d\x5d\x97\xe9\xef\xf4\x49\x7b\x85\x2a\x8a\x7b\x44\x9f\xe1\xd1\xab\xf2\x46\xd4\x06\xa8\x13\x74\xe4\x00\x0e\x94\xbf\x84\x0a\xfe\x53\x7d\x14\x11\x47\x7e\x8e\x38\x50\x37\x30\x7d\xb8\xac\x9c\xa3\xa1\x48\xf9\x69\xcc\xcf\xb3\xd9\x73\xb1\x02\x52\xdc\x8e\x0e\xb4\x8a\xfe\x53\x8b\x24\x46\xcb\x5b\x51\x52\xe5\x14\xfd\x4e\x84\xd5\x40\x9a\xa3\x3b\x5d\xf5\xa8\x26\x94\x30\xe4\x0d\xba\xcc\x5f\x8c\xb8\x76\x16\x82\x6f\x1b\x26\x8b\x7f\x6a\xac\xa1\xfe\x88\xbb\xa6\x30\xa2\x98\x7c\x45\x1b\xba\x32\x7e\x07\x90\x2b\x4b\xb0\x91\x9f\xca\xf4\x07\x4e\xcb\xfa\x20\x2a\xc3\x47\xba\x5a\x5c\xa2\x7e\x62\x2c\xc3\xa3\x2f\x58\x7c\x2b\xb1\x7a\xfb\xfe\x1d\xa1\x46\x62\xeb\x85\x34\x0c\x1c\xb8\x43\x91\x49\x58\x63\x45\x3c\xe3\x8e\x0f\xda\x52\xa7\x39\xe1\xe6\xda\x83\xfb\xab\x0b\x3f\xbf\x41\xec\xb2\x3f\x9f\xd5\xd3\x72\x40\xc8\x55\x49\x28\x5e\x7b\x6c\xab\x59\xa9\xce\x63" \
-"\xc4\x1f\x0f\x98\x8a\x4d\x89\xd2\xc5\xe4\xff\x49\x7e\x78\xf9\xd6\xaa\xd4\xa8\x49\x36\x7d\x71\x4e\xe2\x25\x89\xf9\xbc\xef\x21\xe7\xf4\x7d\x74\x89\x7e\xbb\x1f\xc1\xc2\x76\x79\x13\x50\xfa\x57\x30\x50\x3e\xf6\x1d\x79\xf7\x87\xc6\xc1\xfd\x94\xd3\x11\xd2\x11\xf7\x2c\xcd\x5b\x01\xbe\xc3\xec\x42\x5f\x90\x3a\xeb\x02\x2a\x4f\x19\x52\xa4\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x45\x8d\xa8\x1c\x59\x3c\x74\x5b\xa2\x79\x1c\x7b\x60\xfc\xa5\xb4\x45\x38\xe8\x36\x7a\x8a\xdf\x9e\x83\x5e\xab\x52\x04\x70\x0d\xa0\x75\xaa\x92\x1c\xf1\x9a\xd3\x77\x10\xe9\x8d\x60\x5e\xa7\x0d\x25\x76\x69\x49\xd3\x61\x6d\x94\x83\xbe\x77\x2d\x7c\xd0\xe1\x27\x5e\x30\x3e\x21\xbc\xf8\x9a\xe9\x2e\x9e\x07\x90\x01\x79\x00\xeb\x47\x19\x34\x0d\x2e\x01\x19\xab\x1b\xb3\xaa\xa4\xe7\x02\x19\xb6\xe2\xfa\x60\xc0\x17\xb9\xda\xda\x10\x8c\x24\xb4\xd8\x3b\x5f\x31\xa5\xa2\x86\xfc\x2f\xa8\x41\xf2\xb2\xd3\x3e\x0a\xef\x99\x41\xdb\xf7\x48\x11\x69\x31\xfe\x55\x88\xd3\x75\xf0\xda\x4d\xdd\xa6\x29\x91\xc6\x04\x68\x88\xf1\x30\x00\x9e\xd2\xec\xcf\x1a\x91\x8c\x5f\xa4\x75\xc6\x00\xb7\x68\xa1" \
-"\x3b\x09\xbd\x08\x20\x2c\x1a\xff\x9d\x77\xf5\xfa\x31\xb0\x9c\xe3\x66\xe4\x69\x53\x18\x99\x55\xc4\x81\x85\x80\xd0\x81\xca\x3e\xcc\xad\x89\x5b\xdf\x70\xd0\xf3\x57\xb4\x6d\x52\x8d\x38\xef\xd2\x28\x56\xc8\xad\x1f\x20\xe6\x8c\xca\x3d\xdc\xb0\x5c\x6c\xcf\xb1\xd5\xa9\xee\xac\x9e\xfe\x26\xf2\x8d\x06\x73\xd9\xc1\x86\xa6\xe3\x24\xd0\x77\x56\x2c\x22\xc3\x47\x77\x5e\xea\xf1\x7a\x4f\xa9\xad\x24\xdd\x78\x44\x17\x03\x2c\x7d\x26\x4e\x48\xe6\x19\x3e\x12\xcd\xce\x42\x8c\x4f\x7d\xe5\xdf\x00\x5c\x19\x76\xfd\xa1\xdb\x33\xe4\xe5\xd4\x0d\x9b\x1a\x32\x36\x69\x36\x26\x55\x98\x31\x96\xe9\x58\xbf\x6f\x00\x7a\x93\x5f\xd7\x32\x21\xb0\xd1\x4d\x88\xc6\x06\x47\x61\x64\x98\x00\x9f\x5e\x5b\xca\x07\x94\x7d\xfe\x3a\x26\x6b\x31\x65\x0e\xc2\xa3\x0c\x4f\xfd\x99\x96\x36\x1e\x25\x8c\xbd\xf1\x8d\x2f\x39\x8b\x91\x4a\x58\x0f\xb2\xb3\x3f\xf1\x5b\x81\x1e\x4f\x13\x68\x48\x38\xd7\x25\x7c\xf2\x4d\x51\x6d\x9b\x00\xe9\x7a\xba\x6b\x5b\x91\x5c\xa2\x5a\x04\x71\xaa\x54\xd3\x84\x8e\x40\x1b\x5d\x98\xf8\x6b\x5e\x5d\xa0\x6d\xf9\xf1\xfb\x66\x82\x42\x60\x33\x70\x8c\xf5" \
-"\x97\x41\x2d\xbd\x9d\x75\xbc\x5b\x61\x31\x8a\x6b\x6a\x87\xcc\xcb\x26\x77\x21\x95\x57\x7a\x9e\xc6\x08\x8e\xda\x03\x38\xf9\x50\x56\xfd\x52\xf6\xcb\xe7\x39\xa0\x32\x34\xbb\x18\x6c\x82\xfd\xc1\x18\x33\xc9\x32\x03\x43\xb0\xbb\x7c\xa5\xac\x8e\xfc\x9c\x9b\xdc\xfc\x33\xed\x69\x5e\x30\x2c\xe9\xbb\xbc\x7b\x64\xda\xdf\x24\x72\x36\xdb\xdf\x27\x9c\x70\xce\x2e\x13\x0a\xd5\x8b\x45\x0c\x8a\x86\x2c\x82\x5e\x88\x04\x6f\x4d\x15\x73\xe1\xa2\x0f\x26\x9f\xda\x8a\x66\xab\x02\x8e\x30\x9e\x39\x5e\x3b\xb6\x11\x7f\xbe\xdf\xc4\x42\xee\x6b\x32\x9a\x02\x8e\xa7\x98\x12\x19\xe2\x01\xfd\xfb\x11\x66\x14\x6f\x1c\x61\x88\x0f\x3c\x41\xe6\x27\x31\x19\xa6\x1f\x12\x36\x04\x18\x59\xd3\xe2\xfa\x4a\xe2\xb9\x43\x8a\x1d\x12\x55\x9c\x7c\x91\x54\x11\xaf\xa7\x33\x0d\x36\x52\x61\x40\xce\xc9\x6f\xc7\xd6\xd2\xeb\x94\x37\xb5\xf1\x88\x56\xfe\xdb\x7a\x40\x67\xb3\x4f\x71\xa3\x7e\x4b\x6b\x4f\x66\xf4\x15\x93\xc6\xd2\xfb\x23\x88\x49\x0f\x20\x2d\x96\x86\xfd\x71\x53\x6f\xa1\x6e\xd4\xf2\x21\x0c\x0c\x10\x8f\xc2\xc7\x25\xe4\xfb\x6e\x07\xd5\xc6\x37\x50\x20\xd1\x8c\x22\x2f" \
-"\x66\xf9\xd9\xa6\x76\x1f\x6a\x02\x12\x6a\x2e\x92\x94\x7d\x00\xd0\x59\xd1\xf7\x37\x8f\xb1\x13\xb7\x7f\x47\x76\x14\x88\x03\xe9\x6d\x77\xb5\x73\xdf\x6e\x8b\xb6\xab\x6d\x68\x48\x3e\x98\x8f\x0e\x9d\x52\x9a\xfd\x8e\xd7\x3b\x01\x0b\x62\x6b\x8c\x0c\xf0\x90\x38\x26\x0e\xdc\xed\x9a\xae\x97\xb3\xcf\x68\xea\xde\x54\x7e\x9d\x5a\x34\x76\x7e\x60\x17\xcb\x87\x86\x29\x10\xc4\xd2\x2c\x7d\x44\x91\xe8\xec\x34\xde\x66\x83\x50\x65\xed\xda\xf4\xd7\xcd\x5f\x3a\x60\x12\x42\xd5\x5b\xf7\x3a\x2c\x39\x96\xc1\x8b\x87\x24\x8f\xec\x5e\xd1\xec\xd5\xe3\x2a\xb0\xad\xce\x57\x97\xf0\x91\xb9\x2d\xd1\xb1\xc9\x7b\x20\xc4\x2c\x9e\x53\xcb\xca\x06\x6a\x36\x5d\x2b\xd1\x0c\x72\x4c\x64\xf2\x68\xa5\x8a\x0f\x8f\x05\x21\xe4\xc3\xf3\x6f\x51\xf9\xae\x0f\xa7\x28\xa5\x33\x61\xb9\xd7\x96\x76\xfd\x16\x67\x09\x15\xb9\xee\xbd\x5e\x31\x68\x64\x62\xa5\xc4\x1f\x94\x70\x7d\xc7\x2e\x67\xfc\x4f\x64\xa5\x70\x68\x52\xf9\xdb\xcd\x22\xc6\x1f\xc6\xbf\xb5\x48\xd4\xb6\x3e\x57\x0d\x35\xab\x54\xde\x9c\x83\xc9\xa2\xad\x2f\x2c\xbb\x69\x77\x84\x2f\xe4\xb8\x24\x55\xda\x0b\xfb\xf2\x7c" \
-"\xcd\xa8\xfc\x18\xf5\x31\x54\xa1\x6b\xd3\x15\x3f\xdb\x59\x0f\x74\xc0\x12\xd0\x56\x5f\x4b\x47\xef\xf7\x69\x7c\x55\xae\x90\xdc\x18\xbc\x5e\x28\xd1\x84\xea\xe1\x35\x45\xf0\x2a\x2f\x5c\x12\xf0\x78\xd2\x8c\xa8\xda\x69\x3c\xf6\xf7\xee\xbc\xf7\x0a\xa2\x18\x88\xe2\x5b\x6b\x9d\xa8\x33\xba\x0f\x4f\x44\x9a\xe1\x34\x29\xe4\x7f\x23\x29\xe0\x61\xe1\x2c\x55\x10\xe1\x63\xc6\x30\xb6\x62\xeb\xff\xb2\x18\xd2\x3a\x0e\xc8\x54\x12\x84\x89\x23\xab\x3f\xc3\xee\xc3\xa7\xa7\x08\xcf\xe8\xd6\x64\x5b\xc3\x5a\xe9\x56\x62\xcf\xb9\xe5\xc4\x8c\xfd\xec\xdb\x96\x3e\x3e\x02\x0f\x33\xe8\x9d\x2c\xea\x6b\xbc\xdc\xd6\xd1\x2a\xa5\x12\x5e\x8f\xeb\xf1\xc0\xfe\x6a\x9b\x30\xf6\xef\x7b\x11\x8c\x0c\x65\xfb\x66\x9c\x7e\x82\x02\x26\x3e\xff\x1b\x86\xb6\x78\x17\x9e\x67\x04\x30\x9a\x4e\xec\x0e\xfe\xde\xef\x2a\xe4\xe0\x8a\x57\xd3\xec\x4e\xd4\x01\x6b\x8b\x51\x05\xee\xb9\x54\xcd\x33\x53\x43\x34\x2a\x87\xff\xf4\x7b\x9d\xb9\x74\x72\xa0\x74\xf6\x1e\x93\x7f\x81\x9c\x33\xe5\x27\x7a\x02\x7a\x91\xe5\x19\x7a\x02\x97\x07\x7d\xf6\x4c\x81\xd1\x6e\x8a\xf6\xd3\x21\xb7\x3c\xc0" \
-"\x6c\xa7\xa1\x9d\xad\xbc\x86\xc0\xb3\xcb\xc3\x88\x54\x29\x6e\xc1\x7a\x83\x0b\x4b\x7c\x53\x8b\x50\x0c\x47\x5d\xd6\xb3\x2b\x46\x8b\x5b\x35\xe4\x61\x69\x43\xe6\x76\x5c\xb7\x83\x72\xe7\x4a\x8c\x30\x87\xb4\x0a\xb8\x94\x2e\x4b\xb6\xcd\x53\x2f\x97\xce\x54\xf3\xe8\xe9\x7e\x8e\x1e\x0b\x71\xdb\xfc\x99\x12\x10\xd7\xee\x79\x9b\xff\x15\xd6\x59\x06\xc4\x03\xc9\x83\x30\xbb\x9f\xeb\x0e\x1b\x9b\xf5\x4d\xe5\x82\x70\xa8\xa4\xfd\x45\x17\xfd\xf2\xaf\x13\xe8\x9b\xa1\x1b\x9e\x5f\xa0\x5a\x4f\x6d\x85\xcb\x2a\x46\xb5\x78\xf7\xf4\x55\xbf\xa7\xff\x24\xfb\x73\x36\xbf\x4e\xd3\xb6\xfc\x05\x0c\x64\x20\x30\xc8\x1a\xea\x7b\x19\xa1\xfd\x86\xa8\x3c\x0f\xbb\x3e\x18\xef\xb1\x62\x5c\x6d\xc3\x70\x4e\xf2\xa1\xfa\xe0\xd2\x5e\x6f\x22\x64\xc4\x47\x67\x4a\x7b\xd8\xd9\xb4\xa0\x21\x40\x69\x7b\xb7\x7d\x54\x4d\x50\x63\x6d\xf7\xad\xa8\xef\x7a\x58\xe9\x75\xed\x94\x2b\x90\xc3\xff\xde\x7c\xd6\x85\x9c\x75\xf4\x07\x49\x0d\x64\xa4\x44\xaf\xbf\x5d\xe1\xfc\x80\x60\x4d\xe7\xc4\x96\xdf\x78\x38\x17\x65\x5e\x17\x32\x4c\x26\x1b\x59\xb8\x5d\x8c\x25\x4f\xf9\x42\xc7\x1b\xdc" \
-"\xe6\x72\xb0\xb3\xe4\xc9\x0c\x38\x71\x01\x19\xcf\x68\xb1\xbf\x4f\xed\x8f\xe2\x68\x5c\x15\xf9\x62\xcd\x16\x69\xd7\xb8\x8e\xb2\x6b\x08\xc2\x0d\x20\x9c\x54\x6d\x92\x98\x39\xf1\x48\x3e\x4a\x7a\xd4\x58\xb3\x39\x17\xba\x4a\x49\x52\x25\x50\xb6\xa5\x28\x59\x1e\xf4\xd1\x6e\xa3\x18\xb6\xc9\x8b\x91\xe1\x94\xdb\xb8\x01\x6d\x63\x9c\x25\xf7\xb1\x6f\x32\xd1\xdd\xd0\x4e\x00\x48\x06\xec\x4c\x4f\x3f\x84\x1a\xe3\x48\x8e\xe5\xf8\x78\xa0\x94\x9b\x5b\x33\x3d\x28\x16\xc0\x60\x8b\xc1\xc0\x29\x74\x4f\x8c\x74\x9e\xf8\x40\xa8\xe3\xae\x38\x72\x5c\xa0\x1f\xc8\x5e\x52\x63\x8b\x43\x5f\x2f\x4c\xb4\x98\x2b\x83\x95\xb1\x04\xd4\x38\xd1\xbe\xd1\x66\x7a\xe0\x48\xea\xf4\x6f\xaf\x8a\x78\x17\xcb\x09\x92\xea\xef\x5e\xf1\x1c\x15\xaa\x33\x02\xb0\x7d\xb3\xd9\x63\x53\x11\x10\x71\x7b\x6f\x44\x5e\x9c\xc8\x5a\x75\x1e\xae\x83\x2a\xa1\x5b\x4c\x55\xc7\x2c\x4b\xc7\x00\x9f\x6f\x9e\xec\x3f\xfc\x49\x43\xdc\x71\xa9\x9e\x4a\x07\x51\xd6\x95\x9b\xde\x81\x5b\x3f\xa9\xc4\xa8\xd0\xe6\x53\xa8\x04\x13\x1b\xb0\x9d\x92\x38\x2a\xfe\x8f\xab\x77\x3c\x7f\x39\x25\x6b\x54\xff\xf6" \
-"\x4c\x9f\x26\xb0\xe9\x0d\x61\x6b\x40\x37\xce\xc9\xcc\xda\x03\x8b\x7b\x96\x97\x6e\x1c\xc6\x63\xf7\xa7\x9b\x25\xb8\xfd\xd6\x15\xfd\xfa\xb3\x1a\xe9\x62\xcd\x75\x6d\x5e\xde\x0f\x97\xb8\x77\xdb\x9f\x1a\x34\xea\x37\x42\x64\x6c\xaf\xae\x11\x6f\x87\xbd\xf4\xee\xad\x17\x11\xf1\x88\x4e\x7c\x4b\xcb\x72\x87\xe4\xdd\x4f\xf4\xb4\x54\xd7\x78\x3a\xc1\xea\x11\x15\x84\x6e\x0a\x5d\x5d\x00\xb7\xf5\x86\x3d\x5f\x44\xbf\x8d\xed\x5f\x7e\x57\x3a\x95\x86\xd5\x6e\x74\xd8\xc0\x0a\x70\x26\xe8\x32\x23\x78\x39\x2d\xac\xe8\x25\x4d\xe2\x99\x6e\x83\xfd\xd2\xa8\xb4\x53\x38\x33\x38\xbd\xde\x61\xc1\x88\x8a\x2a\x94\x32\x6f\x18\x13\xfe\xb1\x6d\x2a\x04\x41\xac\x60\xfb\xa0\x36\x3a\xa5\xca\x40\x4b\x26\x3a\x4b\xb0\xd8\x62\x92\x7d\x76\xf8\x0e\x6a\xe4\xe2\x51\xf1\xfb\x7f\x1b\x17\x5c\x9d\x8c\x0c\x3b\x56\xfc\x7a\x0d\x80\x0e\xb8\x37\x9b\x2c\xfd\x1d\x2f\x7b\xbf\xb9\x9a\xa3\x72\xfa\xd8\x30\xda\x18\x29\x89\xba\xc8\xd1\x93\x56\xea\x0b\xfb\x2a\x38\xb5\xf3\xee\xa6\x87\x5c\x97\x56\xae\x59\x4f\x47\x0e\x18\x05\xb3\x57\x83\x87\x66\x3b\xba\x42\x01\x06\x48\x05\x1c\x4f" \
-"\x31\xba\xc2\x3e\xb3\x35\xba\x1f\x8f\x0f\x69\x20\xfb\xbc\x8a\x0b\xf4\x24\x64\x65\x50\xbb\xfd\x35\x5a\x9a\xd4\xb5\x7e\xd1\x3a\x0a\x37\xa8\x1b\xec\x73\x65\xe0\xc1\x67\xe7\xe7\x4c\x82\xa9\x40\xf7\x8f\xa0\x06\x0c\xbb\x3e\x73\x55\x85\x61\x83\x9d\xa4\x05\x12\x33\x45\x35\xe2\xaa\x20\xf8\x85\xc2\x3a\x72\xf3\x9c\x35\xdb\xe4\x25\x33\x96\xf0\xe3\x4a\x64\x42\x8c\x73\x64\x67\x2f\xa0\x91\x27\xa0\x4b\xde\xda\x1c\x6c\xe8\x6b\x5b\x00\x39\xfa\x88\x06\x21\x76\x73\x67\xb3\xdd\x6c\x28\x8e\xaf\xb9\x02\x0c\xc0\x42\xd5\x98\x29\xe9\xdf\x29\xd4\x55\x11\x34\x3a\xd3\xb5\x2e\xd3\xce\xbd\x1a\x08\x5a\x73\xe0\x97\xc3\xe0\xd5\x22\xa2\xbd\xde\xda\x9b\x4e\xc9\x65\xf2\x09\x38\xd7\x98\xef\xf7\x79\x03\x10\xdd\x38\x2d\x23\xf3\x92\x80\x2c\x72\xd7\x84\x65\xdc\xe9\xb4\x02\x1d\x57\xcb\xb9\x90\x10\x25\x71\x3c\xf4\xd6\x8c\xbf\x18\xc0\x25\xff\xa1\x93\xd8\x1e\x28\x9b\x58\x3c\xba\x87\x0b\x17\xe4\x2b\x9d\xcb\x66\xc4\xc5\x01\x01\x57\xda\x7e\x50\x4c\x1e\xb6\xcf\x99\x87\xf8\x06\xb5\xd7\x4d\x80\xc8\x0a\x13\x6b\x8a\xca\x54\x78\xbf\x8c\x75\x32\x20\x1b\x69\xae\xe0" \
-"\xaa\x7b\x35\x4c\x30\xd2\x06\xe3\xc3\x72\xeb\x57\x91\x96\x1a\x15\x11\xd6\xc6\xf5\x7d\x6d\x9c\xaa\xcc\x8f\xe4\x3e\xc4\x80\x15\xf3\x99\x5b\x47\xa4\x71\xa4\xff\x30\x24\xee\x69\xdc\xa3\x5d\x03\x21\x2f\x96\xf1\xd3\xbe\x6f\x9d\xea\xbd\x19\x3a\xf7\x4b\x76\xf7\xa7\xab\x76\xdf\x01\xb4\x62\x53\x00\x02\x6d\x11\xff\x74\xf4\x6b\x65\xdc\x64\x46\x15\x85\xb3\x5a\xd2\x74\x20\xc5\x18\x52\x72\x78\xda\x0e\x93\x50\xc2\x50\x45\x4e\xdf\x9d\xb7\x82\x31\x8b\xa2\x22\x0c\xb0\x2d\xf2\x67\xe8\x80\x44\x58\xe1\xb5\x95\x03\xd2\x14\x26\x9b\x06\xce\x88\x16\xaa\x5c\x9c\xa5\x74\x8e\xfa\x48\xcb\xeb\xc1\x74\xf4\x04\xd1\x37\xba\x1d\x08\x21\xc1\xdd\x49\x1b\xd4\xcc\x16\xc5\xb3\x08\x7a\x86\x08\xff\x60\x33\x02\xa9\xc1\x60\x80\xb2\x6d\x8f\x83\x32\xdb\xd0\x3a\x9f\x67\xe9\x64\x1a\x02\xb1\x81\x7a\xa8\x78\x47\x27\x73\xe4\x6c\x72\xa1\xf3\x18\x0a\xdd\x69\x00\x20\xe6\x4b\xd0\xe9\x04\x46\xf9\x62\x25\x2e\x57\x9e\x91\x3c\x55\xe5\xc7\xec\x7e\x50\xb7\xb5\x0c\x44\x03\x0f\x17\x24\x5c\x92\x6d\x3d\x18\x80\x4e\xef\x58\xe6\xd7\xcc\x5a\x93\x76\xab\x33\xa8\x5f\x5d\x17\x5a" \
-"\xf4\xa4\xac\xc9\xde\x70\x8f\xc1\xd1\x82\xc9\xcf\x76\xaf\x33\x03\x53\x90\x35\x07\x02\xdf\x92\x32\x65\xa8\x9f\x85\x1c\x42\x1d\x40\xe9\x4c\xb6\x85\xac\x44\xdf\x72\xfe\xec\x6f\x1e\x49\x89\x82\xa4\x83\xc4\xbd\x6f\x9b\x93\xd9\x40\xc2\x73\x8f\xc9\x4d\x16\x99\xe4\x53\xbf\x35\xd2\x57\xea\x15\x22\xbb\xb8\x1c\x3f\xb3\xd6\x53\x0e\x70\x20\xa9\x9f\x85\xcf\x13\xa9\xbc\x93\x6f\xba\x72\x2b\x76\x98\x19\x47\xb8\xf7\xef\x3e\x27\x7d\x08\xb0\x5b\x2e\x7f\x25\xa9\xf7\xba\xaa\xe7\x6a\x7c\x5d\x52\xcb\x87\x32\xb1\x55\x4a\x73\xdb\x4c\x60\xad\x2c\xf2\x26\xa3\xab\x0e\x00\x5f\x4c\x63\x4b\x0e\x27\xd5\x74\xb6\x48\x02\xea\xb0\x41\x62\x96\x24\x46\x56\x89\x97\xda\xf5\x8d\x11\x18\xe9\x29\xb9\x3a\xb2\x38\x36\x7a\x94\xe7\x97\x29\xd6\x60\x04\xf3\x2e\x3f\xc8\xe9\x80\xa1\x5f\x8a\xf4\xb7\x8d\x91\x0e\x19\x5b\xc5\x46\x03\xe3\xbb\xcb\xdf\x30\x78\x71\x07\x00\x82\xc1\xa0\x43\x6c\xb9\x47\xed\xab\x65\x9f\x60\x62\x22\x04\x8e\x72\x9b\xa0\x93\xc1\xaa\x30\x73\xfd\xac\xf5\x3b\x91\xb0\x37\xcb\xf5\x3c\x18\xf7\xeb\x4f\x0c\x75\x4a\x12\x97\x0e\xd0\x07\xe3\xe6\x8a\xb6" \
-"\x6b\x21\xac\xd3\xe8\xf4\x5b\x56\x50\xed\x37\x9a\xaf\x20\xdd\x11\x97\x4f\x68\xee\x19\xe2\x4c\x9b\x48\x27\x5a\xd1\x5d\x77\x36\x11\x09\xde\x3e\x12\x88\x19\x0f\x3b\xc2\xcb\x39\x96\x00\x34\x7a\x68\x54\xc7\x68\xb4\x9a\xb4\xb1\x8d\xad\xa9\x9a\x71\x23\x4b\xc6\x9d\x96\x50\x2c\xd4\xf8\xae\xe8\xfb\x8c\x4a\xd6\xbd\x29\x78\x71\x9c\x41\x10\x0f\xc9\x12\x2d\x10\xd2\x68\xf7\x26\x21\x28\xf9\x3d\x77\x99\xb3\x48\x58\x7a\x6d\xd0\x5b\xba\xe7\xf6\xc9\x9a\x1a\x24\x73\x7e\xd9\x2c\xc2\x8c\x67\xe5\x0f\xfa\xe3\x8c\x6a\xcc\x76\xa9\x9d\x54\x96\x1f\x80\xc2\xfe\x90\xdd\x54\x4f\xd3\x94\x21\x3c\x6b\xd3\xaa\x9f\xf8\x69\x3f\x72\x00\x17\xea\x5c\xe6\xf0\x76\x06\xfa\xb5\xb8\xe3\x40\xba\x28\x5e\x43\xe1\x85\x59\x0f\x10\xae\x90\xa5\x3b\x06\x49\x0d\x12\x1d\x0a\x2e\xed\x17\x33\x21\x1b\xc1\xd4\x3f\xc2\x05\x4f\x42\xb1\x51\xc8\x54\xfe\xe1\x24\x6e\xd0\xe1\xca\xd5\x59\xd6\x8c\x8e\xe3\xdf\x3c\xd6\x13\x91\x5c\x5c\xa4\xcf\xde\x9e\xfa\x0c\x92\x96\x43\xcc\x78\xd3\x6d\x5f\xba\x28\xa7\xb2\x5a\x22\x2e\xea\x1c\x6d\xab\xb6\x53\xc5\x24\x33\x45\x98\xa8\x79\x30\x47\xb3" \
-"\x16\xda\xa8\xb6\xa0\x93\xc3\xb1\xb0\xc9\xea\xd5\xd1\x87\xde\x09\x01\x9d\xaa\xf0\xaf\xf6\xda\xff\x5c\x35\x66\xab\x16\xeb\xb4\xf8\x76\x0a\x55\x0e\x18\xda\xb8\x84\xbf\xe1\x70\x42\x03\xe7\x24\xeb\x22\xd6\xb5\x39\x68\x97\x4c\x45\x65\x53\x14\x27\xaa\x6c\xa1\xef\xec\x7e\x09\x90\x1b\x75\xd1\xae\xad\x5c\x10\xb9\x19\x08\x41\x1d\x86\x43\x01\xf8\x3e\xdd\xef\x86\x0c\x0f\xfc\xcb\x8c\xb3\x34\xf7\x03\xe6\x22\xb8\x66\x52\x76\x4c\xda\xfe\xf2\x18\x73\x16\x77\x5a\x04\x95\xec\xb0\x74\x44\x4d\x7b\xc9\xc0\xff\xbc\x6b\xc3\x03\xd9\xb8\x6a\xdb\x74\x51\xcf\xc1\xe3\x65\x29\x1d\xe8\x48\x55\xec\x97\x4a\x5d\x96\xa6\xab\x9b\x51\x83\x51\x6d\xab\xb8\x25\xbe\x72\x6a\x71\x90\xea\x4c\x8f\x5c\x62\xbe\x70\x97\xc6\x97\xb5\x63\x07\xb6\x32\xbe\x9d\x8d\x11\xc7\x94\xe6\x0e\xf0\x5f\xee\x8b\xa1\x60\x55\x89\x9a\x4f\x43\xa8\x65\xfd\x7e\x17\xa5\x8f\x2f\x21\x9d\x64\x06\x82\xfd\xbc\x42\x15\xcd\xf3\x74\x3e\xf1\xa1\xb1\xc7\xea\x3d\x87\x37\x71\x19\x99\x1b\x81\x95\xbd\x8c\x70\xd3\x31\xb0\x26\x2c\x6e\x1d\x87\xb2\x7a\xe9\x03\xa6\x61\xaf\x3d\x9f\x62\x3d\x36\x2e\x3e" \
-"\xf6\x89\x11\x96\xf9\xa5\x63\xd3\xac\x4c\x07\x68\x27\x6a\x77\xdd\x9f\xd2\x60\x21\xec\x57\xa4\x70\x2f\xe2\xf7\xec\x8c\xb9\xb6\x14\xc9\x33\x58\x61\x34\xc6\x46\x31\xf8\x60\x33\x52\x73\xa9\x4e\x49\x70\x7b\x6a\x78\x71\xb8\x5d\xc2\xe0\x44\xd3\xc8\xed\xd1\x29\xa0\x7f\x59\xa3\x37\x09\x1b\xfc\x4e\x5d\x93\x8d\x0c\x9c\x2c\xe2\x6a\x7e\x9f\xb5\x6a\x54\x19\x27\xdc\x29\x86\xb8\xad\x45\x8d\x80\xdd\x39\xc2\x38\x29\x94\x6b\xf2\xf1\xae\x81\x98\x7b\x51\x65\x01\xcc\x09\x6d\x9a\x61\xa9\x3f\xa7\x34\x60\xef\x3f\x74\xa3\x7a\x9e\x5e\xdd\x23\x5a\xb8\x45\xba\xdc\x9b\xcd\x41\xbf\x1f\xd1\x3e\x78\x9c\x4d\x9a\xd4\x3a\xa5\xd0\xfe\x41\xcc\x94\xc8\x79\x4e\x81\x4f\x79\x27\x22\x03\xa9\x76\x78\x34\x23\x77\x8e\x1d\x0f\x90\x9c\x5a\x86\x65\x69\x0b\x70\x20\x4a\x00\xdb\x9f\x84\x64\x07\x6a\x58\x8e\x2a\x9f\x9f\x85\x0b\xaf\x5c\x58\x90\x0c\x37\xb9\x2f\x8e\x1f\x2b\x27\x10\x53\x7a\x36\x07\x96\x9e\xd7\x0e\x8f\x88\x93\x8d\xe7\x9d\x43\x98\x77\xa4\x72\x9f\x47\xd2\x90\x62\x7f\x2c\x84\xda\xaa\xb7\x06\xb9\xd2\x5e\x5f\x63\xf0\x74\x1e\x7e\x4c\x73\xd4\xf6\x66\x5c\x60" \
-"\x9f\xfc\xb1\xad\xee\x57\x91\x78\xef\x53\x67\x94\x6f\xc1\xc8\x9d\xc7\x54\xf5\xa7\x44\x2b\x09\x45\x37\x53\xa4\x6d\x5a\x2e\x65\xd7\x24\x17\x4a\xaa\x49\x1f\x97\x3f\x0d\xe9\x97\x6b\xf8\x1c\x5c\x23\x46\x05\xeb\x55\xdb\x14\xd5\x99\x9d\xf9\xb0\x25\xff\xbf\x31\xdd\xc3\xf3\xcd\x96\xee\xea\xa8\x89\x99\xc9\xde\xcd\xc7\xa2\x77\x92\x29\x59\x69\x72\x90\x1b\xc2\xa7\x0f\x11\x66\x9b\x51\x14\x40\x19\xeb\xd9\x3f\x9a\xf2\xe1\x0d\x21\xb6\x26\x74\x2f\x6b\x32\xcf\x6e\x1d\x88\x37\x21\x8b\x88\xd6\x3f\x5c\x7d\x5a\x76\xca\x07\x0d\x2d\x2b\xa2\x6a\x35\x8f\x0d\xbe\xab\xe2\xc4\x90\x11\x31\x88\x78\xf6\x63\x1c\xdb\xb8\xab\x91\xe8\xf2\xe1\x56\xd8\x1d\xfb\xf9\x29\xf4\x90\x6f\x02\x0d\x43\x45\x61\x3b\xca\x5c\xfe\x47\xbd\x06\x77\xb4\xba\xcb\x22\x12\x55\x73\x67\xb2\x0f\x8b\x2a\x9a\x27\x18\x00\x13\x16\xf0\xff\xfc\x5d\xd9\x97\x76\x59\x4c\xe4\x75\xc8\x89\x0d\xbe\xf7\xff\x18\xfd\xa2\x18\xb8\x14\x46\xad\xf2\x41\xff\x0e\x55\xeb\x63\x67\x83\xb5\x54\x50\x3f\x9c\xb8\xcc\xbf\x3d\x9c\xfc\x3b\x25\x6d\xe5\x66\x8b\x5e\xb2\xb2\xa4\xe7\x31\x9b\x23\x38\xc4\x0f\xa9" \
-"\x90\xfb\xd7\x59\x81\xe6\x48\xdb\x8b\xc5\x4e\x6d\x66\x19\x30\x2c\x7b\xd3\xd8\x6a\xb9\xed\x7c\x85\x27\x25\xa2\x14\xd3\x86\x9b\xa8\x0b\xde\x98\x8f\xd3\x70\x85\x88\x15\xa9\x59\xbb\x5c\x3d\x90\x7e\x8e\xa5\x5b\x40\x2d\x29\x38\xa4\x6c\x31\xf1\x89\x63\x2c\xbf\x64\x0b\xe1\xa6\xf4\xb7\x0e\x45\x8d\xb8\xc1\xdc\x48\xd3\x43\xdf\x10\x2b\xe3\x22\x57\x5b\x20\xe5\x54\xa2\x71\xfb\x7d\xda\x76\x1f\xfe\x10\x21\xaa\xc9\xd1\x31\x1e\x71\x68\xc1\xd4\x52\x40\x50\xd6\x20\x95\xd9\xf4\xed\xc1\xdf\x68\x4d\x80\xe4\x8c\x37\xfc\xcc\xe5\xbb\x24\x63\x99\xf1\x8a\x87\xab\xa9\x3e\xfa\xb8\x3f\xa7\x8b\xb7\x39\xaa\x24\xd9\xc9\x81\xa9\xde\x4e\x99\x41\x99\xc3\xd3\xe5\x9f\xbf\x00\x91\x0c\xd1\x19\xf7\x7a\x13\x6c\xad\xa3\xbb\xeb\xfe\x57\x50\x19\x6e\xb3\x9e\x30\xe8\x14\x8a\x51\xc6\x4e\x12\x2c\x4b\xb5\x12\xee\x60\x3d\xf7\xe5\xfe\x02\x37\xa9\x20\xb4\x88\xb1\xa1\xd5\x84\x80\x6c\x5d\x9f\xc9\xd4\xee\xdf\xe9\xba\xf3\x04\xf8\x05\x21\xd6\xc1\xd6\x5f\x33\x8d\x3c\x48\x3f\x8e\xb8\x25\x7a\x76\x88\x61\x5d\x8e\xf5\x08\x93\xe0\x7e\x43\x5d\xaa\x69\x79\xe7\xab\x55\x69\xbf" \
-"\x7e\x58\x39\x2a\xfd\xb3\x55\xfb\xc1\xa3\x70\x47\x1c\x89\x68\xc7\x79\x0d\x7a\x3a\xe7\xa0\xb0\x32\xc8\x50\x41\x63\x19\x43\x81\x5b\x61\xb2\x83\xc3\x6f\x94\x86\x47\x39\x91\x71\xd1\xb1\x33\x9a\x1d\x1c\xb4\x4a\x0d\x45\x93\x60\xd2\x6c\xb0\x59\xf8\xee\x40\x8c\x55\xc4\xa9\x14\xfb\xee\xc2\x29\x38\x27\x3b\xe2\xbd\x82\xb2\x5a\xb0\xe2\x2e\x6c\x9c\xcc\xae\x55\x76\xa5\x89\xb8\xa0\x85\x59\xaa\xb8\x25\x30\x41\xf1\xe0\x75\xa4\xf8\xd5\x70\x8f\x80\x17\x82\x85\xd8\x42\xbe\x3f\xee\xb3\x54\x47\x1b\x32\x53\xc7\x5b\x7e\xa4\xc0\x4c\x6b\x64\xe5\x06\x19\xa4\x59\xeb\x75\xf7\x3d\x6d\xcd\x4c\x80\xe6\x29\xf3\x55\x3a\xbd\x80\xd8\x15\x35\x44\x50\x01\x19\xab\xcb\x47\xb0\x2e\x06\x54\x23\x96\x5f\x90\x90\xfd\xd2\x4e\x0a\x1f\xda\xb3\xf8\x5f\x51\xf4\x4f\xd7\x3f\xc4\x64\xa5\x78\x36\x0e\xb4\x7d\x98\x6a\xad\x7d\x0e\x6c\xd3\xa1\x83\xe5\x72\x38\xfc\x10\xdd\x10\xf2\x4a\x57\xa8\x79\x7f\xf7\xd4\xc8\x47\xcc\x74\xf6\xff\x9a\x18\x89\x7f\x2d\xb1\xd4\x11\xd4\x66\xec\x1d\x58\xb1\xa6\x87\x6b\xd2\xe6\xdb\x7c\x47\x62\x32\xe6\x6b\xde\x4f\xde\xbe\x25\xf1\xf2\xa7\x1b" \
-"\x75\xfd\xc9\x4c\xfb\xba\x12\x87\x60\xbf\xcf\x0f\x6b\x43\x92\xfb\x69\x66\x19\xc8\x47\xd1\xa5\x7d\xc0\x12\xe4\xa2\xee\xd6\xdd\x8a\x31\x28\x64\x7a\xf9\x14\x79\x39\xc7\x0b\x00\xf3\x4c\x39\x17\xd3\x6e\xd4\xfa\xda\x5f\x9a\x91\xb3\xad\x2d\xe9\x9b\xf6\x43\x23\xcb\x5d\x05\x02\x5b\x79\x74\x5d\x40\x45\x1f\xb6\xb3\x4a\x3b\xc6\x29\x13\x66\x33\x4c\x7e\xe0\x99\x41\xfe\xba\x5a\x10\x5b\xdc\x9a\x82\x14\xbb\x67\x8d\xf8\xbc\xf5\xfa\x8b\xbf\x30\x8a\x28\xc7\xc9\x9b\x93\x53\x3e\xfe\x50\x03\x6b\x68\x24\x67\xba\x5e\xba\xe1\x6b\xa7\x76\xe6\xc7\x55\xf1\xdb\x8b\x14\x1c\xe9\x05\x83\x90\x65\x15\xe4\xec\xf9\x73\x52\x3e\x93\xaf\xfb\xae\x80\xb0\xff\xf8\x8e\xef\x71\xa5\xfe\xee\x16\x63\xa2\xca\x6c\x4f\xeb\xf6\x20\xdc\x0b\x33\xef\x6d\x04\xcc\xb3\xd4\x56\x26\x05\xe8\xaa\x4c\x97\x83\xa5\xce\x7a\x69\x7c\x6b\x1c\x89\xc4\x63\xc2\x06\x7a\x1d\x4b\xb2\x1a\xe8\x46\x21\xe7\x18\x49\x21\xbb\xb5\xf0\x4b\x16\x72\xa3\x62\x72\x06\x5d\x02\x20\x10\x4f\x5d\x77\xdb\x99\x0f\xb6\x81\x7b\xf2\xa2\xb6\x98\xc8\x18\x0e\x5f\x30\x23\x3c\xed\x47\xb7\x98\x5c\x86\x1f\x52\xae" \
-"\x35\x9b\xaa\x60\xdd\x5d\x89\x5a\x1f\x80\x14\x83\x0f\x56\x9a\x5d\xbe\xb2\x7c\xd6\x82\x2b\x40\x86\xf9\x00\x30\xd7\x5c\xec\xca\x18\x2f\x3c\xe8\xbe\x7c\x03\x47\x91\xb7\xd7\xf0\x01\x64\xeb\xcb\xb9\xcd\x7a\xde\x29\xc7\x7f\x04\x4a\x39\x5c\x50\xe3\x6d\x51\xc5\x20\x26\x23\x35\x5e\xf5\x09\x8d\xf5\xdf\xdf\x5f\x2a\xaf\x9d\xd1\xd7\x5a\x40\x00\xf8\xf4\xf6\x19\x3c\x07\xa9\x8a\xf6\xb8\x60\x9b\x44\x5e\x9b\x16\x0f\xf1\xa9\x14\x31\xd7\xd1\x6f\xef\xc8\x90\x05\x21\x99\x8e\xef\x94\x6e\x75\x6d\xf8\x43\x62\x6d\x9d\xbb\xac\xa0\xa9\x55\x36\x00\x99\x81\xd9\x96\x43\x7c\x97\x65\x6a\x83\xcf\x86\x05\xff\x8b\x92\xc0\x00\x73\x5b\x06\x81\x3a\x3c\x67\x6a\xdf\x34\xd3\x66\xfc\x99\x07\x24\x22\x20\x88\x6f\x18\xe7\xda\x65\x72\x31\x80\xb9\x3a\xeb\x1a\x6c\x94\xd8\x02\x6d\x7f\x4c\xaa\xe6\xa7\x4d\xe6\x90\x78\xea\xb7\x4e\xf6\xcc\xe4\x86\xf9\x58\x64\xc4\xc6\xa8\x71\xd8\x2a\x23\xc1\xea\x22\xc3\x98\x7d\x4f\x4f\x18\xa1\xad\x10\xae\x2e\x43\xaa\x83\x9c\xe8\x56\x59\xad\x1e\x27\xd1\xb1\x32\x89\x54\x6d\xcb\x19\xb3\x69\x2a\x97\x8d\x38\x2f\x92\x6d\xaf\xe1\xf3\xd2" \
-"\xce\x51\xc4\xed\x9f\xc9\xa5\x37\xb5\x99\x45\x99\x75\x76\xd9\x82\x41\x8b\x44\x76\x3b\xc9\xca\x52\x81\xa2\x17\x66\x3d\x9b\x6d\xce\x7d\x29\x6f\x8b\x53\xae\x85\xf2\x2c\x02\xeb\xba\x3a\xf7\x63\x88\xad\x6a\xfa\xf8\x22\x98\x85\x03\xd0\xaa\x81\x17\x3c\x49\xd4\x2e\xbf\xbe\x58\xcf\xdd\xa4\xb2\x2d\xd7\x83\xcc\xe1\x75\xad\x8a\xb4\x03\x00\x0f\x0e\xdd\x49\xb8\x16\xa7\x53\xd8\x1f\x89\xfe\x6c\x5a\x15\xeb\x05\x44\x8f\xec\xda\xb1\xaa\xef\xb4\x08\xa8\x8c\xe2\xbd\x10\x91\x3e\xa3\xe1\x5d\xcd\x25\x78\x62\x81\xf9\x81\xfd\xd5\xae\xc8\x13\x8f\x8c\x09\xb1\x32\x69\x86\x45\x71\xf4\x85\x06\x78\x19\x9b\x84\xfe\xe2\xcf\x2b\x38\xa8\x45\xa9\x5f\x53\xa6\x22\x45\xd5\xbb\x62\xf3\x77\x8f\x79\xf9\x77\x81\xa5\x67\x92\x8c\x0d\x88\xee\xa0\xaa\xfd\xab\xd4\x62\xef\xac\xc3\xf9\x44\xcf\x3c\x18\x82\x80\xa7\xa3\xb2\x82\xdc\x06\x8b\xc6\xc9\x6e\x1a\x5b\x9b\x90\x8f\xd4\x55\x6a\x32\xc6\x4a\xd2\xa8\x92\xe8\xac\x1e\x98\xce\x45\x2c\x2f\x58\xa5\xb4\xdd\x2d\xfc\xf8\x2f\x1a\x21\x8e\xbd\x4d\x4d\x14\xb9\xf7\xf9\x58\x43\x75\xf9\x97\x76\x39\x12\x89\x80\xbd\x86\x94\x55" \
-"\x07\x2f\x3c\x8e\x6e\x69\xfc\x2d\xa5\xbb\x86\x32\xff\xb4\x38\x82\x89\x4c\xbd\xda\x98\x2e\x94\x2c\x01\xef\x2f\x48\xc0\x46\x0e\x4a\x5a\x88\xf5\x23\x28\xab\x1d\x11\x61\x4d\xb8\x20\x26\x26\xfc\x0c\x00\xe2\x0b\xde\x84\xb7\x79\xd1\x53\x03\xa4\xf3\x20\x6f\x6d\x91\xcb\x39\xf1\xc0\x05\x6b\xa4\x80\x03\xda\x45\xb2\xc8\xde\x2d\x41\x69\x6e\x73\xb8\x4b\xf3\xdd\x31\xe2\xaa\xbd\x31\xf6\x81\x21\x96\x26\xcb\x03\xd6\x6f\xce\x96\xa8\x89\xa2\xe4\x03\x60\x69\xb8\x1b\x6a\x51\x20\x93\xe6\x3c\xdb\xc7\xb0\x4a\x64\x12\x50\x8c\x46\x80\x73\x77\x6f\x52\xac\x08\x06\xa8\xbc\x38\xc5\x70\x9f\xa9\xd8\xc8\x5a\xfb\x68\x70\x13\xb3\x47\x3b\xb5\x8a\xe0\x9e\xfc\x94\x32\x41\x37\x21\x78\x8e\x89\x6c\x14\x8e\xec\x90\x59\xc5\xbe\xbc\x13\x66\xe3\xf0\x26\xaa\x81\x7b\x45\x7b\xc1\x0d\x25\x85\x2c\xa7\xd2\x8d\xac\x9a\xd0\x2a\x9c\x23\x7e\xb0\x01\x62\xc1\x87\x66\xeb\xe5\x16\x22\xbb\x12\x6f\x40\x53\x6b\x11\x9d\xf1\x75\x3b\x08\xd3\x3c\xc8\x57\xb8\x59\x84\xf9\x3c\x12\x51\xed\xe1\x35\xdd\x83\xff\xda\x40\xef\xc2\x07\xb5\x28\x03\x2e\x6c\xdc\x34\x6c\x3e\xfe\x8c\x25\x74" \
-"\x0f\x28\xa9\x5a\x2f\x88\x66\xfd\x07\xdf\x84\xcf\x3c\xea\x15\x86\x9b\x3f\x70\x25\x48\xde\x37\x3b\x14\x22\xa7\x47\xde\xdd\xa4\xa1\x5c\x83\xf4\xeb\xf3\xed\xb8\x81\x4d\xa5\xa0\x8b\xab\xea\xea\x45\x71\x80\x5d\xd7\x09\x54\x29\xd5\x23\xa4\x18\x78\xcc\xb4\xb2\x99\x2f\xf5\x39\x16\xaf\xce\x0c\xaf\xcb\x81\x27\x5d\x7f\x12\x0c\x37\x2b\x24\xfc\x01\x68\x74\x3b\x87\xc1\x91\xb7\x29\x3e\x4e\xa5\xbd\xe8\x80\xe0\x0b\x8e\xff\x02\xdf\x5f\x50\xdb\x57\xf9\x79\x1f\xb5\x32\xf1\x1f\x7f\xae\x63\xee\xb0\x74\x41\xdc\xa0\xbd\x19\xcc\x67\x14\xe7\x2a\xc3\x22\xb4\x69\x79\x6e\x63\x95\x8b\x01\xdd\x7c\x43\xac\x2f\xbd\xcf\x0e\xe5\x4f\x9e\xbb\xcb\x7e\xec\x0e\x35\x79\xf3\x84\x4e\x27\x48\x07\xa5\x16\x4e\x29\x65\x80\x14\xa8\x88\xc6\x6d\xe2\x20\x87\xa8\x68\x9b\x73\x39\x32\x42\x11\x48\xf5\x7c\x46\xbc\xc2\x90\x59\x8c\x55\x08\x0a\x81\xe3\xa7\x0f\x0f\xc9\x36\xef\xc2\x9a\xcc\x81\x1b\xbe\xf5\x66\xa6\xb2\xc9\x07\xc5\x4e\x95\x45\xf5\x04\x8f\x04\x54\x0d\xd9\x3b\xf2\xdf\xe2\xc7\xe7\x76\xbc\x37\x73\x38\x0f\xd9\x03\x00\xb5\xbe\x03\xa2\x7f\x78\xce\xb5\x08\xe1\x9b" \
-"\x94\xca\x75\x46\x60\x51\xf6\xa5\xfd\x73\x94\xd9\x8a\x2c\xcb\x24\x2c\xdd\x3b\x7a\x44\xaa\xf8\xeb\x58\xf2\xd1\x2a\x47\x1f\x75\x05\x95\xdd\xd8\x9a\x74\x29\xe7\x8a\x7b\x55\x80\x47\x6d\x6f\x11\x48\xa3\xe1\x6d\x07\x28\x85\x4a\x4c\x9b\x6b\x22\xc1\x72\xf0\x3d\x1f\x18\x2e\xd7\xc5\x60\x72\xd5\x12\xd6\x39\x77\x32\x12\x05\xaf\xfe\x15\xf6\x40\x91\xab\xd9\xf3\x9f\xfa\xe7\xe4\x40\xa4\x61\x3d\x96\x09\xe6\x0b\x8a\x84\x5f\xd1\x8a\x61\x57\x8b\xbe\xab\x87\x9e\xaa\x63\xc6\x12\x7f\x2c\x66\x01\xec\x5a\x49\xd6\x87\x74\x6b\xf7\xaf\x2e\xee\x33\x4f\xa3\xf9\x05\x89\x91\x5c\x8a\x17\xcf\x9e\x32\x6d\x83\x54\x3d\xb8\xfc\xe8\x14\x43\x6b\xbd\x3d\xc6\x1b\x06\xbd\x77\x22\xec\x5e\x69\x41\x8c\xb5\xf8\x20\x0c\x77\x7e\x00\x0e\xe2\x4e\x07\x79\x6f\x2f\x1e\x31\xce\xbb\x7d\xf7\xeb\x06\xe5\x22\xa1\xae\x48\x9a\x25\x5e\x08\x58\x7d\x36\xb6\x64\x2e\x54\x90\xd5\xfb\x3e\x47\xb1\x78\xff\xc2\x0e\x69\xce\x97\xb3\x90\x8c\xbf\xa7\xf8\x2c\x46\xe3\x9a\x8e\x20\xae\x9f\xc7\x9a\x4e\xa5\x44\x60\x49\x08\x0d\xf6\xa2\x9b\x30\x07\x79\x5a\xad\x28\xe2\xa6\xbd\x23\x57\xe1\x2d" \
-"\xd1\xdc\x46\x16\x9c\xd8\x27\x7e\x54\x8e\xcf\x64\xdb\x9b\xa6\x2b\xfd\xa1\xff\x8f\x94\x5d\x11\x07\x6d\xb0\x70\x0e\x57\x93\xba\x7b\x20\x9f\xfc\x53\x6f\xb6\xfa\x1c\xef\xcf\x5c\x40\x11\x1a\xd8\x00\x29\x18\x8e\xf6\x13\xac\x20\x89\xea\x45\x93\xfb\xea\xcf\x5f\x06\x71\xd1\x6b\x45\x7a\xc6\x94\x0d\x12\x1c\xee\xbf\xa8\xcd\x90\xea\xb5\xf7\xc0\x97\xb0\x5f\x9d\x3c\xe0\x1a\x78\x18\x10\x42\x66\x33\xb9\x6f\x27\x06\xcd\xbb\x10\x01\x8d\x2d\xea\x30\x90\x1a\x5c\x9b\xd5\xda\x58\x97\x00\x6f\x6d\x1c\x2c\xac\x18\xd7\xcd\xba\x2a\x77\x7c\x30\x29\xc7\x55\x51\xf4\x18\xaa\x47\x9c\x8d\xf9\xea\xc1\xae\x4d\xb8\x2f\x6b\x70\xeb\x7c\xfe\x07\xa3\x9c\x47\x3b\x7a\xe0\xc4\xd7\x47\x51\x91\xcf\xb2\x61\x76\x2d\x9a\x6d\xbe\x8f\x3f\x53\x87\x6e\xa6\xae\x2f\xc3\x21\x00\xea\xd4\xdf\x0b\xf8\xd2\x9e\x11\x8b\xef\x0f\x39\x85\xb9\x98\x47\x38\x02\x3e\x0a\x67\xf3\xf7\xb6\x51\x0a\x26\x31\x07\x83\x0a\xca\xb8\x4f\x95\x54\xd5\x7a\x85\xd0\x18\x8d\x84\x0c\xf4\xfb\xa0\x29\x38\xdb\x7b\x78\x17\xf0\x28\x1d\x20\xd5\xde\x24\x31\xad\xb0\x0b\xd1\x91\x68\x9a\x9a\xb6\xb7\x05\x3c" \
-"\x83\x46\xe0\x2f\x7d\x6e\x2f\xf6\xb4\xde\x7d\xf3\xfb\x37\x19\x93\x4d\xa4\x74\xda\x98\xbf\xf4\x2f\xc7\x44\xd0\xd1\x31\x5a\xc5\xb0\x02\xbf\x7f\xc6\x30\x10\xa8\xf3\x29\xc3\x32\xaf\x21\xac\x5c\xb9\xfe\x60\xdd\x41\x18\x24\xbb\x0a\x68\xf2\x65\xb9\xb0\xce\xd7\xa6\x52\xbd\xf5\xd0\x3e\x26\xcf\x61\xc0\x2d\x2e\x62\x42\xc9\x45\x5f\xce\xd3\xcc\xe1\x89\xcc\x64\x6e\x3a\x54\x1d\x70\x90\x33\x0f\x01\xaa\x4f\x29\xef\x4d\x01\xd0\xd1\x50\xd0\xd6\x1b\xa8\x99\xe5\xbc\x28\xfa\x0d\xf0\x17\x60\x36\xeb\x17\xca\xa5\xd7\x6d\x8f\xa3\xa1\x88\x65\x6d\x62\x66\x36\xe7\x8d\x9d\x16\x05\xc9\x59\x0a\xf1\x71\xe1\xb9\xea\x80\xd4\xce\xba\x3b\x72\x4f\x45\x2b\xab\xd0\xdb\x3f\xdb\x70\x36\x4d\x9c\x74\x96\x8c\x71\xba\x4f\x83\x6d\xe7\xcd\xaa\xfd\x83\x61\x8d\x6b\xf2\x05\xee\xa7\x20\x87\xc2\x8f\x97\x47\x16\x51\xfe\x54\x78\x67\x83\x3d\x56\x7e\x42\x33\xc9\x00\xaa\x46\x12\x26\x98\xe1\x03\x75\x62\x64\x8d\x72\x27\xa1\xbd\x92\x94\x2b\x37\xbd\x12\x9d\xb5\xb9\x07\x75\x4d\x38\xe5\x5b\x50\xe9\x4f\xa5\x8c\x18\x62\xc5\x82\x32\x46\x2c\x6f\xe6\xf1\x5c\xcc\xf6\x4e\x13\x12" \
-"\xe7\xdb\xc9\xcf\x54\xcd\x89\x8a\x71\x2d\x04\x48\x91\xcc\x03\x56\xe6\xc8\xd0\xa6\xda\xb7\xd9\x15\x59\x17\x28\x6b\xa1\x44\xe6\x60\xec\x5b\x6a\x0f\x26\xff\x84\x0d\xf8\x62\x6a\xb1\xdf\x36\xf7\x72\x52\x93\xa1\x2a\x2b\x0a\xc0\x0c\x5e\xc8\xf8\xc8\x55\xe7\xf7\xf6\xc9\xdd\xb4\xd9\x71\x0c\xde\x58\x35\x15\x06\x1a\xd6\xdc\x98\xfd\x5c\x38\x9e\x11\xe9\xda\x5f\xea\x5b\x61\x47\x94\x0b\x03\xe2\xc7\xfa\xc9\x84\x5c\xf4\x12\xd2\xf8\xd4\x59\xb6\x60\x49\x79\xfa\xde\x3b\x79\x76\x13\x1c\xdd\x7e\x30\x77\xbe\xd9\x48\xc2\x5b\x04\xd5\x11\x89\x22\xf6\x07\x06\x8f\xf5\x61\xc0\xfc\x37\x91\x52\x0a\x4d\x6f\x1f\x50\x4a\x9c\x0e\x44\x6f\x52\x4c\xa8\xcb\x09\xdc\x36\xe9\xaf\xba\xa9\x68\xf3\x02\x8f\x6d\xd5\xf7\xa3\xc4\xb5\x25\x10\x32\xda\x1c\x81\x76\xa2\xbb\x62\xca\xe2\xf4\x27\x1b\x5a\xff\xeb\x7d\x62\xce\x9b\xb3\xd3\x3a\x87\x50\x61\xdc\x20\x88\x12\xe2\x3c\xfb\x33\xaa\xa5\x2f\x04\x3f\xa0\x29\x69\x55\x17\x7a\x20\x91\x45\x55\x9f\x93\x49\xd1\xc9\xa9\x19\xe1\xa4\x06\x97\x5c\x09\xdf\x37\x89\xca\x43\xdd\x64\xa1\xf8\x0a\xd1\xc3\x1b\x92\x04\xdb\xe3\xbe\xcb" \
-"\x86\xe4\x0a\xa0\x22\xdd\xfa\x6e\xcb\x21\xba\x3c\x88\xb9\xeb\x48\x2d\x69\xb0\xa1\x24\xa9\xb9\xae\xa8\x92\x17\x39\x80\xc6\xa2\xc2\xc5\x3e\xfe\x66\xc8\x9a\x8c\x62\x28\xd0\x80\x5f\x97\x4d\x28\xbe\x58\x4b\x9c\x2f\xcf\xdc\x0b\x7d\x9f\x18\x59\x8e\x3c\x02\x9c\x19\x2c\xcb\x27\xde\xa6\x7a\x5d\xd7\x5b\x57\x39\xc7\x45\xd3\xf4\x8c\xf1\x6a\x2b\xc1\x0a\x96\x41\xe2\xa3\xca\xa5\x9b\x5d\xdb\xcf\x1c\xae\x9d\xc9\xc7\xa9\xae\x1c\x24\x75\x6a\x9b\x57\xd1\xdf\xab\x68\x48\x4c\xb4\x65\xc4\xf8\xa3\xfc\x96\x21\xe0\x76\x80\x82\x91\xd3\x1c\x50\x11\xae\x21\x9c\x6c\x8b\x78\xe1\x6f\x09\x2e\xe4\x4f\x70\x79\x23\xb5\xaa\x0c\x83\xad\xa9\x04\x28\x08\x65\x22\x9a\xe3\xc8\x39\x32\x76\xdc\x80\x15\xd0\x3e\x83\x44\xc1\x34\xa3\x23\x60\x2d\xe1\x1a\xdb\x32\xc2\x2c\x16\xb5\x53\x15\x52\x23\x64\x0a\xf1\xda\x0c\x68\xf0\xfe\xbe\x36\x30\xd5\x57\x41\xb7\x1b\xe8\x17\xf6\xa9\xb3\xa4\x37\x42\x46\xdb\x07\xd6\x80\x3a\xf4\x78\x34\xff\xd5\xaa\x51\xeb\x10\x2e\x12\xe5\xba\x8b\x76\x7f\x0c\x4a\xad\x6a\xab\xa1\x03\x6c\x03\x71\xd3\x02\x58\x5a\xe3\xca\xc4\xc3\x45\x58\xa8\x28" \
-"\x57\xf7\xd2\x05\x1a\x75\x9f\x2a\x03\x49\x94\xf7\xec\x6e\x10\xec\xa9\xb3\x16\xc6\x20\x4f\x8a\x60\x46\x06\xa1\x1b\x47\x9b\xf1\x70\x3c\xbc\x33\x86\x9a\x00\xcf\xcb\x2b\x66\x58\xb4\x8b\xef\x48\x1a\x2e\xae\x4c\x41\x0e\x87\xca\xd3\x7c\xc9\x04\xe3\x28\x77\x2e\x66\x17\x47\x8f\xa7\xa4\x4d\xc0\x87\x10\x1b\x94\x7f\x7b\xbf\xd1\xa0\x31\x5d\x8a\x5e\xa1\xb5\xcd\x50\x50\x21\x49\xcb\x2d\x24\xc2\xad\x56\x07\xea\xc8\x8a\x14\x3e\x14\x6e\x54\x10\xee\xcf\x7b\xaf\xe9\x28\x87\x33\x55\x88\x40\xcc\xc6\xcf\x97\xa2\x85\xcf\x3a\xf6\xbb\xc9\x5b\xb9\x4c\x2e\xd1\xad\x99\x47\x9e\xf1\x6d\x42\x81\x6d\x13\x46\x1e\xba\x4c\xf9\x7d\xc5\xf3\xdf\xdb\x10\x5d\x86\xe8\x3b\xbc\x2a\x04\x9b\x81\xec\x91\xa6\xf4\xde\x67\x03\xa6\x91\x96\x39\x81\x13\xfd\x9d\xf2\x42\x61\xa5\x6b\x57\xb4\xf5\xf7\x2f\x13\x22\x87\xdb\x5e\x4c\x76\x9c\xf7\x94\x2c\x8e\xa4\x14\xb8\x60\xb3\x8a\x36\x27\xd4\xeb\x60\xd7\x27\x2d\x33\xd7\x27\x2f\x77\x78\x16\xc5\xa6\x9e\x1a\x73\x15\x10\x6e\x17\xa6\x84\xd1\xe8\x67\xf8\xc8\x85\xee\xe0\x0d\x32\x6e\x21\xd3\x9a\x05\xef\x89\xe2\x57\x83\x98\xe1\x3b" \
-"\xd0\x31\xcc\xed\x51\x95\x22\xa7\x2e\xb5\x79\x6e\x1f\x6c\xe2\x0a\x50\x06\x2f\x54\xb4\xb0\x56\x46\xab\xdd\x55\x8f\xac\xe3\x78\xe5\x4b\x8c\x85\xc3\xb0\xad\x5c\x52\xb3\x61\x73\x74\xec\xe0\x46\x2c\xa6\xce\x17\x63\x00\xd5\x2f\xcb\x99\xdd\xb2\xf6\xc4\x1e\x4a\xd0\x64\xf5\x55\x88\x84\x06\xd5\x49\xc7\xf8\x3d\xce\x8d\x4a\x3d\x64\xb5\x9d\x33\x83\x5f\x74\xd9\xda\xa2\x20\x88\x0a\x73\xdd\x41\x10\xdf\x13\xa3\xac\x49\x8c\x61\x45\x43\xc7\x74\x89\xfb\xbc\x6a\x44\x4e\x19\xe1\xca\x28\x75\xa1\x72\x0a\xd0\x1d\x30\xd9\x52\xea\x4b\x86\x9c\x09\xfd\xf1\x90\x16\xba\x8b\x65\x6f\x25\x48\x5f\x21\xb1\x14\xf6\xd2\x84\x01\xff\x54\x99\xab\x8c\xde\x39\x56\x22\xb5\xe4\x27\x0d\x9e\x23\x39\x71\x10\x3d\x61\x6f\x27\x30\xc0\x58\x66\xc9\x53\x49\x71\xe3\x74\x14\x49\xa9\x87\x6b\x08\x60\xfa\x17\x19\xf2\x33\xa6\x1d\xa0\xa9\x2b\xef\x5a\xfe\xc6\xd1\x36\xf9\x1f\xd9\x17\x76\x39\xc0\x14\x45\x4d\x32\x18\x22\xbe\xa6\x1c\xb5\x31\x7e\xde\x85\xab\x00\x55\xd4\xe2\x5e\x23\x0b\xba\xfd\x2a\xa2\xe7\x6f\x29\x35\x15\x00\xc4\xd3\x11\x49\xb4\xd3\x2b\x0a\x0b\xa9\x2a\xd9\x64" \
-"\xdc\x6a\xd3\x08\x44\x2c\x41\x7c\xd6\x67\xc6\x1e\xbf\x19\x47\x36\xaf\x26\xb3\xc7\x46\x8a\x61\x6c\xff\x8a\x7d\x28\xe3\xa1\x4c\xed\x89\xb5\x97\x82\xc7\x93\x32\xca\x3f\xcc\xc9\xd2\xb0\x60\x22\x38\x43\x7b\xb7\x01\x4c\x9a\xeb\xb3\xd8\x0c\x75\xbc\x2e\x9c\xfc\x71\xa0\xe9\xc5\x55\x88\x1e\xf8\x8c\x0c\x5e\x86\x41\x56\xc3\xea\xf6\x5b\xa9\x16\xf6\xb3\x32\x09\x72\xdd\xb5\x75\x4b\xf8\xfa\xb2\x0d\x1b\x11\xfd\xf2\x2e\xd9\x26\xad\x29\xc7\x1d\x4a\x28\x23\x44\xd2\xd0\x3a\xb4\x85\xf4\x8a\x71\xcf\x22\xe1\x7a\x5c\x6f\xdd\xb7\x18\x96\x31\x07\x15\x42\x38\x3a\xa5\x72\x53\x1b\x1f\x30\x0e\x06\xa0\x42\x2d\x40\x57\xb8\x07\x1d\x7b\xf8\xe7\x4c\x01\x85\x52\x7a\x36\xc6\x2b\x8f\x87\x05\xad\x5a\xea\xc1\x0b\x0d\x9e\xc8\xd2\xeb\x22\x10\x93\x22\x0c\xa2\x7d\x11\x2a\x78\xb2\xfe\x46\xf7\x62\xef\xfd\x79\x06\xe4\x88\x8e\xe0\x54\xb5\xf4\x7a\x82\xa5\xf7\x1a\x28\x07\xc2\x4b\x45\x6d\x9a\x08\x45\x49\x13\xbb\x5d\x8d\x85\xa3\x8e\x66\xe6\xa7\x40\x3c\x52\x8c\x49\xcd\xdd\x2c\x8b\x6a\x43\x4b\xe8\xc0\xc9\xc7\xc6\x03\x8a\xe4\x8c\xa1\xd4\x39\x37\x33\x5e\x26\x59\xe1" \
-"\x5c\x25\xef\x38\x23\x32\xcb\x7b\x91\x8c\x3e\x25\x4e\x11\xdf\xec\xd3\x03\x98\x30\xc8\x49\x12\xca\xcb\x64\xb9\xab\x33\xfe\x8f\x27\x8d\x7d\x1c\xec\xb3\x2d\xea\x7e\x14\x41\xae\x61\xf1\xf2\x2d\x3f\x31\x0a\x89\xea\x89\xba\xe1\x84\x24\x36\xc3\xad\x15\xb9\xa3\x76\x7d\xf4\x42\xac\x91\x7c\xf2\x05\x15\xe6\x33\xa5\x18\x47\x9d\x74\xac\xb7\x93\xb0\x94\x88\x58\x54\x0a\x53\x16\xad\x43\xe4\x11\x25\x88\xf8\xea\x4d\xe9\x91\x6f\xfd\x1f\x4d\xd4\x6f\xde\xd7\x2e\x4d\x1d\x0a\xc0\x79\x11\xad\x46\xfc\x35\x88\x10\xb1\xa2\x1c\x71\x7c\xb5\x92\xeb\xf8\x50\x50\xf2\x5e\x15\xc0\xa2\xec\x15\xa3\xf4\xd9\x0f\xa7\x54\xc3\x2b\xd8\xdc\xb1\x45\x63\x23\x3a\xd9\xfc\xc3\x66\x0d\xc4\x69\x06\xd9\x30\xd1\xc7\x8f\x8b\x33\xe3\xb4\x50\x94\xce\xb7\x99\x1f\xf5\x3c\xb6\xcd\xc7\x99\xf4\xe8\xfb\xd1\xa9\x2a\xa3\x43\xd9\xb5\x1b\x39\x73\x6b\x4e\xc0\xfe\xec\xb7\xe6\x72\x2a\x9b\x13\x8e\x53\xcf\xac\x35\x14\xfa\x02\x96\x25\xd6\xba\x23\x08\xb3\xaa\x5a\xd6\xa0\xda\xfb\x82\xc5\x18\xbf\x17\xec\xe3\x9d\x03\x60\x20\xa8\xad\xf8\xd7\x29\x0e\x0e\x50\x86\x22\x41\x6c\x6a\x2e\xc3" \
-"\x96\x96\x7b\x67\x38\x79\xca\xd5\x6b\xf5\xbf\x81\xc0\x28\x5a\x05\x1e\x64\x77\x9c\xd0\x16\xce\x77\x30\x45\x36\x16\xe6\xd9\x61\xa7\x72\x69\x9b\xbc\x4e\x03\xaa\xe2\xd1\xa7\x93\x9a\x5a\x7e\xc1\x0c\xfd\xe4\xa5\x03\x1f\x66\x6a\x02\xeb\x12\x27\x98\xad\xb6\xc2\x7e\xb7\x72\xca\xd1\x20\x44\x62\x63\xb9\x37\x15\x74\x59\xe0\x4f\xa0\xa6\xab\x27\xb3\xad\x92\x4f\xa7\x24\x4b\xc3\x16\xf8\xb1\x61\x7a\x0e\x56\xea\x63\x14\x8a\xfc\x02\x1f\x2f\xbf\xbb\x88\xe0\xe9\xac\x1c\x3b\x4d\xe7\x7c\x56\x43\x19\x09\xde\x77\x9d\x1d\x1e\xa6\x6f\x6b\x8a\x99\xfe\x1a\x69\xf3\x5b\xd0\x02\xf9\xbc\x28\x22\x8a\x5b\x20\xab\xf6\x40\x39\x07\x91\xf3\x9b\x5d\xe4\xe4\x9e\x5e\xb9\x95\x3f\xec\xb0\xba\x23\x91\xab\xd1\xd5\xd6\x01\x9e\x8f\xb9\x21\xf8\x54\x01\x5b\xc9\x00\xae\x70\x34\xa5\xca\x18\x14\xea\x7d\xff\x8e\x23\x8a\x15\x57\x9d\x28\x57\x96\xde\xe2\x72\x77\x7f\xbe\x7b\x19\x0a\xaf\x14\x42\x23\x08\xfd\xcb\x11\x4f\xef\x4f\x31\x5c\x6f\x3e\x40\x5e\x96\x5f\x32\xf6\x13\x4e\x59\xf7\x04\x19\x92\x8e\xc9\x65\x89\x24\xb3\x5d\x50\x9e\x90\x22\xf8\xad\x14\xf5\xb4\x1e\x84\xf1" \
-"\x0a\x78\xcd\x0a\xc8\x77\xc3\xc1\x30\xcd\x8f\x30\x35\x9b\xf2\x32\x63\xb5\x9a\xb6\x2c\xf3\x05\x12\x79\x8c\x3c\x38\x8d\xd5\x9c\x9e\x7a\x1c\x7d\x2a\x98\x53\x2f\x84\x10\x36\xf6\xa4\x7b\x44\xed\x97\x14\xa1\x80\x18\xfb\x99\x24\x09\x64\xe3\xeb\x0f\xcc\x21\x45\x5a\xaf\x47\xc8\xd7\x18\x1c\x88\x7b\xe0\x70\xcd\xb7\xab\x82\x77\x9d\x57\x9b\x37\x59\x32\x79\x8f\x0c\x76\x33\x83\x6d\x6f\x27\xc2\xce\x77\x96\x59\x09\xc7\x56\x58\xcf\x20\xf1\x8d\x6a\x0b\x13\xf1\x8c\x4a\x13\xf1\x74\xba\xe0\xd8\x8b\x53\x23\xba\xbd\x7a\x40\xa8\x79\x3f\xb6\x65\xe8\x98\x60\x04\xa2\xbf\x98\x49\x0c\xf0\x37\x33\x70\xda\xd8\x81\x1e\x27\x31\xd1\x84\x18\x8c\x16\x11\xd8\xda\x78\xdd\xf8\x28\xa9\x18\x4e\xc6\xdb\x63\x56\xe1\xe9\xff\xef\x76\x0d\x2c\xbe\x91\x98\xcf\x65\x66\xa8\xcc\xd4\xb3\x6d\x36\x65\x30\x9b\x5b\xaa\x0a\x57\x83\x31\x5f\xa5\xc7\x3e\xa2\xbb\xef\xba\x07\xe1\x80\xb2\xc9\x27\xdf\xd5\xc2\xca\x41\xd8\xbc\xcc\xa1\x35\x67\xc8\x6c\x38\x77\xcd\x98\xe3\x69\x08\x37\x63\x64\xe2\xe3\xce\x68\xac\xf9\x7e\x27\xb9\x01\xf3\x86\xe2\x68\x24\xb0\xf2\x33\x1b\x53\xfc\xfa" \
-"\xdb\x02\xc9\xc5\x40\x9c\x66\xab\xac\x3b\x23\x3c\x9a\x70\x20\x0e\xfc\x4e\x5b\xa2\x36\x8b\xdf\x9a\x61\x9d\xec\x31\x21\xfd\x43\x3c\x64\x7f\xcc\x53\xeb\x07\xd9\xd7\x88\x55\x4c\xac\xa1\xb4\x36\x3d\x2b\xbb\xcf\x7d\x32\x9d\xf6\x60\x9f\xcb\x11\x3d\x1a\xb8\xce\xce\xe8\x49\x20\xde\xfc\x40\x9c\x4e\x8c\x29\x79\x49\xde\x85\x48\x62\x2d\xa1\xac\x2a\xe6\xa4\xf8\x8b\xff\x8c\x54\x05\xf4\x83\x9e\xb9\xb1\x05\x1b\xc9\x44\x45\x25\x20\x0b\x4f\x0f\xda\xc9\x29\x3d\xdc\x52\x66\x8f\x89\x5d\xa1\x5d\xb8\x85\x8c\x09\x76\xdc\xd9\xb8\x9d\xe3\xb8\x01\xdb\x23\xb7\xb7\x9a\xc3\x7b\x3b\x7c\xa6\xfb\x97\xf8\x53\xc7\x9e\xa3\xce\x04\x83\x20\x45\x89\x5d\x34\xd5\x54\xdb\xe1\x55\x92\x1a\x15\x7a\x8a\x6c\xbd\x5d\x1d\x24\x13\x7f\xb9\xfb\xba\x86\x01\x8b\x82\x94\x18\x93\x71\x99\x12\x9c\x71\xdc\x88\x63\xcf\x10\xe0\x76\x05\x7d\xf7\xdf\xbb\xff\xb0\x2d\xe1\x64\x41\xe6\x5e\xf7\x6a\xec\x8b\x30\xaa\x87\xbc\x6e\x48\xf5\x4d\xe5\x77\x79\xdd\x75\x50\xa1\x0b\x53\x6f\x68\x07\x10\xd7\xc8\x4c\x46\x1e\xeb\x6d\xff\x6c\x33\x16\x27\x76\xa6\xb9\x0a\xc9\x19\x87\x8b\x7b\x2f\xe7" \
-"\x5e\xed\x2c\xcd\xe0\x65\x9f\xdb\x34\x4b\xdb\x75\x7f\x5e\x25\x62\xa6\x1a\xda\xb6\x87\x4f\x61\x80\x2f\x50\x0b\x81\xe8\xc7\x49\xee\x14\x60\x49\x08\x0d\xf6\x96\x71\x10\x5d\x1d\x3f\x63\xb8\x7f\x30\xb8\x0f\xc9\x29\x08\x49\x14\xfe\xba\xbe\x55\x39\x6a\xdb\x32\xde\xf5\x13\x01\xe0\x7e\xcc\xb0\xd4\x2e\xca\xfd\xf6\x8b\x8b\x9d\xa5\xe0\x64\x10\x30\x32\x92\x92\xbd\xd7\x69\xfa\xdb\x07\x69\x1b\xc3\x3a\xb9\xdf\x18\x84\xc7\x79\xb7\x1c\x0f\xf2\xaa\xc4\x78\x74\x10\xc5\xd1\xe2\x39\xdd\x06\x14\x9a\x62\x32\x64\xd1\x44\x23\x39\x4d\xa8\x8b\x65\xb3\x49\xb6\x9e\xed\x36\x8c\x27\xb5\x6c\x9a\x8b\x70\xb9\x70\x58\x33\x7d\x5d\x1a\xca\x4d\x9d\x30\x58\x42\x4a\x40\x37\x99\x4e\x7b\x9c\xab\x3b\x2b\x0b\x8e\xf9\x89\x19\x88\xdb\xf4\xd2\x75\x2c\x9c\x88\x50\xe0\xec\xd5\xbe\x47\xfc\x87\x25\x5f\x07\x05\x1c\xac\xf1\x1b\xd9\x8c\x13\x2a\x8a\x6b\x47\x0c\x4b\xb3\x70\x1d\x81\xbf\x09\x8d\xb3\xff\x01\xa2\x07\x76\x69\x2f\x31\x69\x2c\x14\x56\xb9\x02\x7d\x92\xf1\x9f\x69\xb0\xdd\x73\xd5\x0e\x42\xca\x5f\xfa\xd5\x2b\xf8\xb0\x04\x2e\x27\x54\x13\xba\x50\xf2\x35\xb6\x9c" \
-"\x03\x2b\x08\x4f\x58\x9c\x7f\x0b\xf7\xb3\xc7\xd0\xfb\x25\xd9\x16\xcf\xbf\x80\x35\xa0\x10\x9f\xc5\x13\xd6\xf0\x1d\xc1\xd4\x49\xbf\xf4\x1b\xbd\xe5\x63\xfb\xfe\x32\x2a\xbf\xc7\x0f\x95\x8d\x51\x3c\x19\x87\x78\xe7\x28\x54\x7f\x3b\x96\x7f\x2d\x9a\x87\x7c\x6d\xfc\xba\xcc\x62\x94\xa2\x85\x0a\xea\xe8\x98\x58\xd8\x36\xf2\xce\x4e\xa0\x0c\x4e\x0a\xe4\x02\xee\x32\x09\xe6\x74\xcc\xce\xa0\x09\xc7\x0c\x0c\xe0\x0d\x99\x51\x33\xfd\x8c\xc5\x94\x2f\xc0\x0e\xbb\xff\xd8\x6e\x8d\xc6\x23\xd4\xf4\x43\x4d\x30\x57\x2e\x2e\x71\xcd\xdc\x51\x69\x6d\x09\xf8\xc2\x64\x47\xbb\xa0\x09\xdd\xb2\xb0\x77\xc4\x24\x88\x0c\x44\x22\x71\xdd\xfa\xfa\x04\xfb\x14\x89\x46\xf1\xac\xb2\xb9\xd6\x17\x37\xc4\x1f\xa0\x4c\xd6\xe6\x8b\xc0\x90\x78\xbc\xe1\xd7\x84\x21\x69\xb2\x53\x45\x5c\xc0\x70\x7b\xdd\x22\x07\x49\x91\xe9\x38\x0c\x43\x6a\x98\x4d\x8f\x4d\xd9\x66\x06\xc7\x35\x0e\xa2\x0c\x86\x5b\x3b\xa9\xb5\x12\x2f\x0b\xce\x45\x41\x42\x1b\xa0\x62\x95\x16\x18\x35\xc4\x77\xe7\x54\xd3\xf6\xe7\xda\x63\x78\xc5\x97\x1e\x99\xc0\x78\xfd\x46\xea\xfd\xef\x22\x4a\x06\xe9\x95\x9b" \
-"\xd6\x0c\x7f\x39\x5c\xe1\xc9\xe9\x74\x30\xe2\x5e\x9f\xd4\x4e\xde\x63\x74\x1d\xbb\x03\x3b\xa7\x44\x6c\xa2\x92\x7d\x06\xb2\xe6\x3c\x9e\x3c\x55\x5e\x71\x5d\x02\x4b\xc3\xea\x42\xc8\x94\x80\x32\x38\x3a\xcd\x4f\xe2\x0b\xbd\xbd\x58\x20\x43\x53\x54\xbc\x1f\xb4\x4f\xfc\x09\xb1\xc7\x35\xa3\x42\x36\x6e\xf5\xae\x71\xe1\xcc\xb4\x95\x06\x8d\x12\xfa\x96\xa8\xe5\x63\x6b\x6e\x6c\x3f\x46\x2b\x92\xd8\x40\x2a\x03\xe3\x92\xdf\xe9\x06\x8c\x6c\xee\x15\xf5\x46\x0e\x98\x5c\x6d\x8a\x68\xc8\xc3\xf8\x7d\xe6\x08\x04\x8a\x7d\xe4\xdd\xe1\x62\x92\xe6\x5b\xe1\xf7\xcf\x1d\x70\xb9\xca\x9d\xda\x12\xc1\x2d\x36\x2f\xd7\xa2\x1d\x5c\x5f\x0d\x58\x28\x81\x01\x96\x6a\xcb\x75\x4c\xb0\x9d\xa9\x3d\x2d\xc9\x43\x23\xee\x95\x15\xae\x32\xa2\x96\x78\x16\x90\xc3\xbb\xd6\xef\xb2\xe7\xa5\xc8\xa7\xaa\x6b\x62\xf2\xcd\x48\x71\xa6\xa3\x06\xc5\x39\xd2\x6a\xe7\xc0\x11\x70\x4d\x53\xab\xd8\x7f\x49\x8f\xb6\xe0\x6f\x68\x89\x7b\x77\x34\x99\x2a\xcd\xa1\x91\xae\xa7\x26\x75\x82\x52\x1f\xe4\x66\xea\x1e\xc7\xc2\xcf\x49\x6d\x40\xe7\x37\xdd\x41\xe1\xcb\x1c\x71\x02\x78\xc9\x16\x7d" \
-"\xd3\x4c\x52\x3a\x4b\xb5\x21\x79\xbd\x8a\x46\x7a\x9b\xfc\x85\x33\x23\xf1\xc1\x79\x94\x30\x2c\x9b\x7b\xf0\x09\xa9\x91\x0f\x4f\xd5\xb4\xa0\x1e\xc6\xe1\xd1\xba\x7c\xba\x35\xf0\xf6\x0d\xbc\x34\xd3\xdd\xb5\xd4\x8c\x8f\xbb\xb2\x0b\xb5\xca\x4e\x32\x37\x77\xe4\x71\x78\xe7\xb8\xa5\x7a\x79\x5e\xb5\xde\xf8\xe1\xcc\xf5\xae\xcd\x3f\xdb\xc0\xf6\x52\x65\x6d\x73\xa0\x99\x52\x83\x26\xdb\xe5\x3a\x72\xcd\x8a\x8d\x89\xed\x59\x5e\xf5\x54\xb1\xa6\x00\x26\x10\xad\x38\xf8\x43\x37\x72\xfc\x59\xfb\x92\x5d\x18\x68\x71\xb5\x25\xa4\x25\x9e\x60\x89\xbf\xd6\x15\x33\xd7\x3a\x7b\x6f\xa1\x74\x9d\x70\xd3\xbc\xd2\x34\x69\xdb\x5b\xd5\xbf\x85\xab\x2f\x66\xae\x33\xaa\xb4\x0a\x1e\xb5\x11\x2b\x4c\x0d\xf2\x88\x29\x2d\x9b\x18\x2d\x4f\x92\xda\x06\x6b\x2f\x8e\x20\x8d\x5e\xa5\x0c\x95\x54\xaa\x7a\xca\x43\x82\x7e\x27\x81\xf4\xbb\x13\xe3\x16\x6c\xea\x5e\x62\x3d\x9b\xfb\xe4\xd4\x2b\x25\xfe\x51\xde\x29\x43\x05\xe1\x7c\x35\xcb\x6f\x18\xd4\x40\x11\x55\xc2\xff\x38\xbe\x73\xc0\xcb\x37\xaa\x98\xbb\xa6\x74\x55\x42\xa7\xd5\xf7\x81\x0f\x76\x56\x68\xe0\xc3\x6c\x6d\x06" \
-"\xc8\xbf\x22\x8a\x75\x4a\xb6\xd1\x12\xcc\xb6\x8b\xb8\x1b\x6b\xaf\x0e\x91\x9b\xc5\xfb\x35\x8d\xd1\x62\x82\xe6\x02\x5b\x5b\x5a\xfe\x83\xfc\x5b\x55\x27\xd4\x49\x5a\x39\xb8\x90\x1a\xa3\x06\x20\xf3\xea\xa2\xea\xec\xa7\xea\x49\x71\x32\x4d\xa5\x81\x7a\xd3\x06\x22\xc2\xb8\x1d\x87\xe2\x5b\x72\x0e\x60\xf6\xf3\x16\xc8\xf2\xdc\xae\xe3\xf4\xa8\xc7\xc5\x37\x72\x3e\xd7\xac\x3a\x3c\x52\x29\xcd\x08\x6b\xfd\x3e\x6c\x7a\xf9\x4e\x89\x27\xa7\x0e\x23\x99\x88\x3e\xc1\xd3\x78\x31\xed\xe8\x16\xd7\xbe\x84\xa1\xfa\xf9\xae\xfd\x5a\x5d\xd2\x23\xde\x23\x3e\x3c\xcc\x6b\x3f\xc6\x79\x93\x44\xd5\x4b\x31\x32\x03\x05\x4a\x1e\x5c\x77\x0b\xdf\x85\xde\x1d\xe9\xf8\x5d\x57\xc2\x8b\x54\x34\xd6\x2c\x92\x13\xf1\x52\xcc\xa3\x9a\xfd\x82\x9f\x58\x94\x74\xcf\x1d\x72\x75\x96\x9a\x18\x51\x4e\x5f\x01\xd0\x54\xc5\xac\x8d\x03\x6b\x12\xc0\x78\xc4\x5b\x1e\x52\x5a\xe8\xa3\x0a\x8e\x60\xc6\x3e\x7e\xd4\x99\x64\xcf\x92\x7a\xe9\x5c\xbc\x93\x1b\x09\x66\xcc\x77\xd1\xf2\x47\xde\x6c\x72\xf9\xad\x3b\x0e\x43\x1a\x68\xf0\x88\xc7\x46\x83\x27\x86\x12\x01\x98\x4f\xe0\x82\x68\xc3" \
-"\xb3\xd7\x5a\xba\xf4\xee\x0c\x5a\xb5\x91\x4b\xee\x54\x9e\x6f\x3f\xbb\x79\x98\x84\xa7\x96\x8a\x3e\xcb\x28\x46\x8a\x9a\xd2\x25\x32\xe2\x45\xfd\x8f\x1a\x00\xf3\x83\x05\x8b\x4f\x30\x30\x73\x7a\x3d\x47\x29\x01\xe8\xef\x04\x60\x4a\xd1\xfd\x80\xe0\xde\x9e\x61\x96\x10\x1e\x84\xf0\xc7\xc5\x76\x0d\x47\x38\xa0\xbe\x23\xd7\x6e\xa5\xfe\x1a\x45\x2b\xc3\xa3\x1e\xf5\x8a\x30\x50\x8c\xf5\x59\x53\xa5\x41\x27\x14\x53\x73\x77\x6f\x5a\xca\x65\xac\x5b\xb2\x23\x11\x78\x2d\x76\x5b\x3c\xbd\xb4\x85\x22\x13\x89\x98\x8f\x10\xba\xd6\x04\x2e\xf2\x17\xb3\xe5\xcc\x37\xda\x16\xbc\x05\xde\x8c\x45\xc3\x2b\x1f\x22\x9f\x83\x35\x1c\x53\xd0\x9e\x70\xa3\x10\x3d\xaf\x03\x45\x71\x86\xae\x15\x7d\xa2\x5b\xb6\xfb\x78\x11\x5e\x64\xfc\xc7\x76\x23\xf8\x40\xce\xb3\x26\x79\xb0\x54\xc5\x09\x02\x2d\x6f\xf4\xa1\xfa\xc7\x82\xd0\xa7\xfa\x00\x9b\x39\x00\x5f\x27\xce\xed\x05\x17\x3a\x8e\x89\x4d\xa4\x98\xdb\x5e\x39\xed\x10\xdb\x77\x39\x3a\x65\xbd\x68\xcd\xe4\x1c\xed\x77\x8f\x63\xf1\x05\xa0\x73\x5b\xd7\xf6\xc6\x99\x3c\xba\x40\xf8\x7e\x43\x38\x9b\xb3\x37\x66\x03\x2f\x44" \
-"\x91\x29\xd1\x2d\x94\x6a\x0b\x47\xbf\xab\xf5\x21\x06\x85\xd8\x01\x6d\x80\x38\x78\xf7\x11\xa9\x96\xad\x3d\x6f\x00\x41\x02\x5f\xe5\x3f\x3b\xb9\x94\xd5\x95\x8c\xbe\x39\x97\xa3\x49\x09\xe7\xfa\x4c\x7e\xd3\x0c\xaf\x0e\x26\x92\x1e\x66\x16\x7c\x3a\x89\xef\xb5\x63\xb0\x02\xb8\x30\xc4\x84\xf8\x8c\x5a\xc2\x5f\x06\x5a\xf2\xab\xfe\xbd\xeb\x08\x44\xf4\x73\x59\xd9\x0a\x3d\xac\xfc\x4b\xba\x75\xd4\xd8\x3e\xfd\x62\x9c\xe9\x60\x8b\x37\x5b\xfb\xa8\xdd\x43\xe7\x12\x8c\xfa\x26\xe8\x8f\x41\xdc\xea\x81\x6a\xb8\x3f\xab\x77\x60\x20\x09\x2d\x97\x4a\x47\x51\xa2\x6d\x3a\xc2\x7d\xbf\xa9\xf4\x09\xbe\x25\x26\x62\x24\xee\xb0\x26\x96\x1e\xe3\x00\xbf\x3c\xbd\x00\x04\xb2\xc4\xee\xb6\xe9\x08\x7e\x0e\xec\x49\x64\x10\x96\x31\x1a\x68\x98\xc5\x84\x35\xe5\x64\xc4\xce\x07\x4a\x5b\x8f\x17\xce\x78\xfc\x34\x49\xa1\x94\x29\xa0\x89\x1d\xcf\xde\x0d\x80\x90\xbf\xa2\x3c\x18\xe2\xbb\xfa\x49\x4c\xf6\xf0\x1f\xfe\x6d\x90\x66\xf8\xcf\xd7\x2c\xb6\x1d\xca\x36\x8d\x6b\x7c\xef\xcd\xf3\x36\x9e\x00\x94\xca\x62\x41\xe9\xc9\x3c\xa9\x22\x40\x51\x3e\xcd\xe1\xe4\xe9\xfa\x17" \
-"\x92\x35\x68\x78\x44\x47\xb3\x1a\x9c\xe6\x19\xe1\xeb\x8a\x14\xc4\xdf\x48\xb0\xed\x43\x6b\xca\xd3\x20\x1f\xb8\x1a\xb2\x40\x86\xe1\x73\x08\xe3\x09\xc8\x21\x1f\x1f\x3a\x52\xfb\xf9\x36\x2e\x3c\x0c\xe9\x42\xde\x90\xf3\x6f\x6e\x19\x75\x4d\x6c\xdf\xd3\xd1\x17\x4e\xa2\x9a\x4d\x54\xfb\xa6\x59\xcf\x2d\x4e\x33\x55\x12\x33\x0e\x38\x09\x83\xba\x6f\xe5\xe6\x0b\xc5\xc4\xc9\xb8\x86\x93\x34\x0e\xb9\x91\x0e\x09\xa4\x9d\x52\x03\xfc\x2a\xf4\x8c\xcf\xbd\x4d\x0d\xe8\xf8\x8b\x0a\x89\x1e\xbd\x5b\x5c\xca\x3f\xf9\x61\xd4\x8b\x27\x9b\xfb\xfd\x0a\xf9\x0d\x73\xee\xcb\x70\x93\xba\xb9\x2e\xef\x33\x8f\x94\xfb\xa3\xd0\xfe\x79\xf0\xf3\x16\xa2\x2f\xc4\x2c\xf9\x00\x3b\x7f\x90\x52\x0b\x45\x7c\x4c\x83\xe7\xec\xa9\x61\xac\xa8\x9d\x18\x11\x3d\x6c\xe5\xb6\x99\x00\xc4\x17\x76\x28\x46\xa7\xb2\x4f\x2f\x71\x4b\x5d\x2e\x87\x94\x79\x39\x14\x96\x1c\x42\xd2\x8d\x8e\x5b\x83\x70\xef\xbc\x23\x05\xb5\x80\x02\x3b\x78\x06\xe4\xce\x82\x84\x68\x1e\xdb\x93\x52\x0c\x30\x09\x62\x33\x22\xc4\x87\xec\x73\xb2\x0a\x19\x08\xcd\x1c\xe7\x8c\xc7\xe0\xe0\xa2\x7b\x58\xc2\xca\xda" \
-"\x74\x31\xe9\x89\x70\x48\xeb\x9d\x7d\x89\x4a\x84\x31\x45\xe8\xf9\xf7\xf1\x2f\x08\x70\x05\x48\x8a\x95\x79\x02\x94\xcc\x5d\xe7\x2c\x81\x8c\x95\xce\x68\x25\xd0\xb5\x56\x43\x7a\xa7\x72\xa6\xc8\x86\xb4\xb3\x8b\x78\x10\x6a\xab\x5d\x3a\xb3\xaf\xb3\xf4\x94\x24\x53\xab\x9d\xb6\x92\x6f\x16\x00\x90\x6e\x69\x2f\x5a\xec\xb1\x2f\x2c\x23\xfa\xed\x6f\x8d\x59\x06\xba\x16\xc4\x20\xa6\x17\x8f\x11\x60\x7f\x3a\x8b\x89\x1d\xfa\xa4\x34\x8d\x01\x0d\x75\x52\x5d\xf1\xfe\x78\x8b\xa5\x01\x72\x69\x07\x87\xb4\x39\xfc\xca\xe9\x45\xfd\x26\x0b\x58\xdf\x11\xcb\x40\xa2\xaa\x7f\x3b\xa3\x5a\x08\x3a\x95\x14\xd6\x9f\x1a\xa0\x78\xf4\x7b\x5b\xcb\x1f\x56\xed\x14\xf2\x42\x0e\xb6\xce\x7f\x36\x77\x24\xb6\x29\x81\x80\xc1\x51\x13\xb6\x78\x55\x17\xd2\xdc\xb1\xca\xcc\x66\x8f\x51\xf3\xe9\x0f\x43\xb7\x9d\x60\x7a\x78\x82\x4f\x9a\x76\x24\x4e\x98\x18\x7b\x5a\x56\xa9\xc8\x14\x1d\x39\xd2\x85\x10\x34\x18\xca\x14\xad\x65\xe6\x3d\x2f\x69\x5e\xf4\x2f\xd9\xcf\x57\x57\x5d\xcc\x8a\x6e\x08\x96\xc8\xf8\x81\x8b\x86\xe1\x22\x22\x96\xf7\x46\xc2\x90\xa7\x15\x62\xa1\x07\x26\x4e" \
-"\x03\x24\x2a\x86\xa1\x9d\xcb\x57\x22\xab\x1c\xc7\x40\xba\x82\xdf\x67\x79\x58\x82\x32\xae\x0a\x32\x4f\x0d\x5c\xa2\x63\x01\x55\xa8\x7a\x3d\x84\x50\x55\x70\xee\x06\xb3\xcf\xa2\x35\x10\xc6\xfa\xda\xce\xca\xf2\xf8\x1f\x4a\x56\xc5\x85\xc1\x24\x63\x85\xa0\xdf\x37\x24\x99\x65\xa5\xbc\xb8\xb3\xbd\x24\xc6\xfe\x33\xc7\x0d\x74\x18\x0a\x87\x65\xd0\xa6\x36\x6b\x01\xa6\x61\x26\xc9\x2d\x56\xda\x2c\xa3\x3c\xad\x81\x45\x11\xcc\x37\x55\x8d\x50\x64\x58\x7f\x6c\xcd\x41\x49\x9f\xcc\xd8\xfa\xf0\x11\x79\xc4\xc4\x79\x2e\x40\x19\xd7\x58\x66\xdd\xf4\x23\xf8\x60\x72\x42\x7d\x86\x07\x53\x61\x00\x50\xa6\xe0\xd8\x16\xd5\x12\x2a\xf2\x7e\xb6\x51\xe0\x0a\x25\xc1\x2b\xae\x4a\x9f\x93\x3a\x41\xd9\x93\x6e\xd6\x5f\x7a\xae\x7d\x79\x4a\x42\x90\x4a\x63\x34\x84\x68\x69\x8b\xe1\x80\x3e\x01\xbc\x07\x2b\xb9\xde\x86\x06\xd8\x34\xd3\xd5\x53\x6d\xb0\xa6\x98\xa1\x30\xd3\x7c\xc6\xf1\x34\xed\x8b\x9b\x14\xe9\x8c\x37\x93\x44\x4d\xa6\x6a\x51\xd5\xfa\x4a\x7d\xa5\xd5\x41\x93\x5c\x1f\xd0\xf2\xa9\x5a\x1e\xef\xa5\x8f\xc4\x55\xf7\x79\x93\x26\xb5\xaa\x4b\x1e\xe0\x69\x79" \
-"\x1b\xc5\xf6\xac\x27\x6d\x06\xd1\x2a\xd0\x0d\x94\x99\x61\xf7\x26\xa8\xb9\x4c\x2a\x66\x91\xa6\x1b\xf2\x25\x88\x2d\xf5\x20\xc8\xb1\xe1\xf8\x9a\x75\xac\xb8\x25\x9c\xd0\x64\x97\x40\x10\xc1\xfe\xd5\xcd\x8c\xcf\x99\x40\x9b\x39\x2f\xed\x3b\xe7\x0a\x82\xcc\x48\x1e\x11\x3c\x4c\x73\xa1\xed\x68\x05\x26\xfe\x5a\x98\xd0\x31\xc2\xa0\xf3\x6a\x4e\x29\xfb\x8f\x68\x82\xb4\xf1\x62\xd3\xee\xc2\xe0\x24\xf2\x27\x6d\xb4\x43\x82\xd2\x2c\x08\xa2\x96\x10\x4c\x53\x28\x56\x61\x57\xbb\x2a\x32\x3f\x23\x62\xc0\x17\x8a\xec\x5a\x03\x9d\x13\x05\xfc\xe4\xd3\xef\x01\x55\xbe\x36\x90\xda\xdd\xb8\x13\x59\x4b\x8a\x35\x73\xce\x1f\x64\x63\xbb\x50\xa2\xde\x86\xa7\xee\x75\x54\x24\x3e\xb2\xe0\x93\x77\xa0\x41\xf4\xf5\x9d\xbc\xb8\xde\x2a\x35\xbc\x54\x33\x05\x16\xd6\xe5\x5c\xf9\x11\x4e\x06\x4f\x91\x5c\xc9\x35\x3a\x2d\x57\x5a\x13\xc2\xfd\x12\x44\x57\x3a\x30\xce\x55\xf1\xad\x28\x00\x26\x4b\xd2\xe3\xfe\x96\x75\xa8\x58\x29\xb4\x1f\x4d\xef\x88\x25\x6a\xde\x21\x3f\xef\xd9\xf5\x1d\x0b\xff\x5e\xb5\x84\x5b\x50\x98\x0f\xe0\xfd\xbb\x68\xbf\x5f\xb4\x37\x6c\x18\x41\x20" \
-"\x1b\x93\xc9\x66\x66\x40\xf5\x0e\xc4\x9a\xa9\x85\xbf\x75\x31\x6c\x4b\x85\x48\x5f\x30\x7e\x01\xa6\xbb\x81\xdf\x5e\x60\x27\xe1\xde\xc4\xd2\x81\x23\x18\xba\x91\x06\xad\x52\x43\x82\x61\xa7\x8a\xa7\x39\xb5\xe4\xf9\xf7\x2c\x1d\x09\x8c\xf5\x31\xa4\xd2\x77\x5b\xb0\x0f\x1f\xce\x58\xe5\x9b\x17\x48\x72\xe0\xed\xbe\xc2\x93\x85\xe9\xaa\x16\x40\xf1\xa2\xcc\x34\xd0\x8a\x9f\x1d\x5e\x19\x75\x67\x84\xe8\x41\xc6\x5a\xb7\x71\x06\x4c\x34\x8d\xc7\xa6\xaa\x80\xc7\xfb\x3c\x89\x56\x4e\x34\x10\x48\x40\x70\xae\x43\x36\x49\x3f\x37\xb7\x1e\x0b\x30\x83\x07\x5e\x97\x11\xa6\x73\x3e\x05\xdd\x47\x1e\x89\x23\xb5\xfa\xbb\x44\x1a\xbb\x33\xca\xf9\x4c\xa2\x3f\x0a\x90\x7b\x77\xd9\x9b\x0f\xd6\xd4\x34\x27\xd0\x6d\xd2\xce\xe6\xf2\xba\xfe\xaa\x8a\x34\x28\x82\x07\x66\x43\x1c\x26\x6a\x98\x7a\xac\xb8\xa6\x51\x1e\xec\x95\xd5\xec\xae\x82\x8c\x2c\x8f\xc7\x09\x76\x3a\x0b\x1e\x7e\x8b\x27\x80\x5c\x53\xf2\xcf\xc8\x9d\xf5\x93\x54\xcf\x8c\x78\x3b\x38\xe4\x91\xb1\x82\x30\x8b\x4e\x65\x7c\x2a\xe4\x81\xac\x0e\xf8\x90\x8e\xbd\x26\x9e\x3a\x55\x54\x4b\x88\xb4\xaf\x0d\xb8" \
-"\x00\x1a\x80\xea\x97\xa7\x28\x06\xa3\x08\x17\x39\x45\x2a\x59\xae\x32\x00\xd8\xba\xa6\x07\x8f\x7b\x5f\x17\x1a\x86\x7f\x7d\xc7\x75\x1a\xd7\x81\xd4\x77\x53\x02\x42\x60\xf7\x7e\xf1\x31\xab\xba\xde\x92\xea\x73\xc7\x7b\x70\x4f\x93\x35\xd2\x5f\xc0\xa6\x31\x89\xf5\x50\x78\x0e\xb8\xf2\xed\x83\x1b\x8d\x64\xb2\xb9\x36\xf5\x98\x37\xf3\x58\x2d\x7a\x30\xe5\xd6\x37\x76\x69\xde\x1a\xbd\x44\x2a\x15\x22\x39\xa5\xf6\x6d\x23\x54\x2d\x4c\xc4\x74\x7f\x58\xb4\x0a\xb3\x67\xe2\xd0\x21\x5b\x6f\x0c\xe7\xdd\xa6\x40\xc7\x5d\x57\x3a\xa4\x6c\x17\x7e\xa9\xd8\x77\x44\x68\x18\x33\x9c\x47\xaf\xb5\x5d\xb8\x7c\xab\x22\x48\x73\x5f\x94\x48\xa6\xf1\xb2\xdf\x24\x0a\x0c\xdb\x32\xac\x8b\x98\x1a\xe8\xb9\xf9\x5f\xf9\x08\xf4\x14\x4e\x88\x8d\x91\xa9\xa8\x02\xd0\x09\x1e\x25\x32\x95\x2f\x32\x11\x40\xd6\xa8\x20\x17\xe4\xe8\x1f\x4e\xdb\x4d\x08\x50\xfd\x29\x4f\x08\x7b\x41\xea\x24\x4e\x97\x17\x44\x12\x46\x0a\x09\x09\x21\x8e\x81\x73\x8f\xbf\x7f\xd1\x8d\xca\xbd\x37\x78\x10\x94\xb8\x7a\xb2\x4d\x0a\x95\x12\x1e\x06\x65\x35\x5a\x9b\xef\xfd\x52\x39\x0b\x7d\x54\x07\xaf" \
-"\x74\x3e\xd2\xe8\x70\x82\xfd\x69\x99\xcb\x1f\x78\xfb\xf1\x2d\x29\x7f\x60\x92\x0b\xbb\xb4\x73\x15\x3f\xb6\xd5\xc4\xaf\xff\xa2\x1f\xe9\x41\xc5\x6e\x2a\x88\x36\x76\xea\xb0\x03\xfc\x53\x04\x6b\x85\x13\xe2\x22\xa3\xe8\x1f\x27\xab\xb2\xf2\x24\x45\x40\x21\xa7\x8b\x51\xb8\xa0\xcf\x77\x25\x89\x28\xa5\x32\xa7\xf3\xbc\x52\x8e\x5b\x02\x00\xd1\x10\xa6\x98\x86\x71\xb9\xec\xfd\xa1\x78\x5a\x5e\xbd\x51\xc9\xe0\x3c\x42\x52\x17\x0c\xc7\xc5\x56\xc6\x10\x36\xae\xed\x79\xba\xf4\x8d\x32\x1a\x98\x78\x4e\x34\x47\x73\x28\x5e\x9c\x16\xa2\xf1\xdb\x5a\xd4\xec\x15\x99\xaa\x8e\x14\xc8\xfb\x31\x62\xc0\xad\x0e\xa7\xc7\xa7\xb0\xeb\x6f\x3d\xf3\x1e\xd7\x23\x71\x7f\x7a\xfa\x4f\xa2\x28\x82\x51\x1f\x33\xb1\xf0\x09\x1f\xc0\xd2\x97\xab\x4e\xc9\x32\x66\xe3\x4b\xc4\xef\xe8\xaf\xf0\x77\xcd\xbf\xb4\xd1\x44\x7b\x56\xf4\x72\xf4\xd1\x07\x23\x11\x10\x59\x85\x59\x2a\x09\x12\x7c\x15\xfc\x65\xf4\x58\x4f\xd6\xea\x91\x8c\x34\x76\x2f\x2c\x79\x2b\x0e\x06\x9d\x1a\x10\xac\xfc\x55\x5e\x54\x3b\x86\x13\x77\x0a\x46\x5b\x9d\xf6\x08\x4a\x20\x0f\x17\xe6\x02\xcd\xbc\x67\xed" \
-"\x5c\x13\x58\x15\x93\x87\x75\x7c\x6b\x8c\x27\x98\x33\x38\xf6\x7a\x99\xae\x6a\x91\x8c\x92\x4e\xb4\xf3\xd4\x3e\x2e\x03\x83\x89\x4e\x38\x4f\xa0\xfc\x75\x54\x7e\xc7\xc2\xf0\xe3\x17\xbc\x28\xce\x48\x44\x28\x3a\x5b\xb7\x50\x28\x1f\x41\x09\x46\x17\x22\x40\xc7\xd5\x8a\x50\x8c\x3a\xca\xd7\x73\xdf\x5c\xb5\xda\x74\xfc\xd2\xbe\xd2\x36\xa6\xf1\x42\x84\x3e\x62\x6d\x9e\x33\x34\x59\x45\x18\xab\xb0\xeb\x74\xaf\x12\x6f\x50\xa7\xd1\xaa\x96\xc2\x98\x17\x60\xa2\x29\xf4\xe8\x50\x55\x4c\xe2\x7e\xf0\xc4\xd6\x51\x28\xb7\xe1\x66\x0a\xa6\x39\xe7\xe6\xe8\x95\xa4\x74\x70\x7a\x00\xb6\x35\xc7\xfc\x37\x32\x6f\xf3\xc8\x40\xbf\x1d\xf0\x56\xbb\x7e\x85\x79\xf9\xf9\x25\x3a\xae\xd1\x27\x98\x67\x97\x83\x7f\xcf\x9a\x0e\xbc\xef\x1c\x6b\x21\x0a\x39\x52\x9e\x74\x3f\xe1\x1d\x67\x50\x86\x54\xf5\x25\x0d\x01\x46\x5f\xb4\x52\xbf\x00\x43\xf3\x43\xda\x94\x1e\xf8\xa0\x85\x5c\x53\xbe\xc5\xfb\x96\x75\x1c\xb2\x79\x11\x10\xd1\x04\xbc\x9b\x37\x52\x86\x80\x03\x68\x8e\x84\x90\x20\x65\x00\xdf\xa6\x4f\x31\x6c\x40\xe7\xa2\x06\x1b\x5e\x74\x44\xeb\xa8\x24\x73\x27\xbf\x97" \
-"\x1c\xca\xe4\x23\x5a\x35\xac\xaa\xad\x97\xec\xae\xc5\x13\x55\xd8\xc0\x9e\x80\x23\x06\x58\x15\x19\x9e\x5c\x12\xd5\x16\x88\x77\x95\x7c\xd5\x67\xc5\x06\xce\xae\x24\xc4\xc7\xd0\x44\x39\x54\x1c\xda\xfb\xd6\x4b\x9d\xfe\x2e\x3d\xe4\xbc\x57\x5d\x7d\x9b\x26\xaf\x04\x24\xa0\x1f\xb1\x46\xde\xf5\x55\xf6\x45\x6d\x2d\x4d\x97\xaf\xca\x17\x11\x8b\x42\x4d\xa6\x9b\xfb\x52\x9c\x0b\x4d\x66\xde\x14\xaa\xff\xe8\xa2\x29\x49\x1a\x59\x76\x3a\x7e\xd4\xcf\x6c\x37\x05\x88\x96\xf0\xdf\xb9\x67\xe7\x73\xb6\xbd\x27\xa4\xa2\xb6\x70\x71\x0b\x5d\xfa\x6c\xf7\xe7\x8f\xac\x43\xdf\xdd\xe0\x18\x74\x80\x77\xe8\x8f\x5a\x1b\x95\x31\xe2\xc3\xee\x42\xe9\x0f\x61\x89\xaa\x9b\xec\x7c\xb9\x5f\xc0\x79\x24\x52\x4c\xf9\x1f\x2e\x66\xb9\x0e\xf3\x1e\xf4\xd9\xb8\x9c\x9c\xcf\x23\x26\x59\x6b\xd4\x8b\x4b\xa1\x10\x4e\xe8\x4c\xd1\x07\x5c\x5e\x50\x9f\x3a\xa2\x8a\xd8\xce\xe7\x5d\x55\xc6\x8c\x5a\xc8\xaa\x4f\x76\x1a\x34\xa8\x6f\xa5\xe0\x5b\x2d\x55\x2a\xa2\x8e\x37\x00\x13\xa7\x8e\x56\x4a\xeb\x2b\xe6\x03\xa2\x5d\x21\xef\x2b\xb5\xfd\x9b\x6a\x1c\x30\x96\x2b\xea\x66\xbb\xf7\xbb" \
-"\x28\x2b\x9e\x21\x30\xf2\xd6\x5f\xb6\x7e\x03\x19\xda\x2f\xa3\x8c\xd9\x06\xdd\xc7\x39\x4c\xb6\xf4\x6e\x31\xa8\xf0\x81\x1f\xe2\xb9\x23\x12\xb9\xbd\x02\x11\xbe\x86\x89\x1d\x4c\x76\x30\xd8\x21\xbc\x67\xa0\x42\x8f\x17\xe6\xff\x18\xee\x06\x6f\x12\xd6\xa3\xf4\x1e\x24\x04\xd8\x1f\xa2\x3c\x7f\xeb\xcb\x43\x22\x45\x14\xe3\xdc\x38\x6b\x4e\x51\x0a\xa0\xa9\x13\xff\xd3\x7e\x2e\x4d\x2e\x98\x2e\x72\x87\x8b\x17\x03\xac\x34\x50\x56\x0b\x05\xbe\x33\x56\xbe\x43\x00\x4b\x11\xa0\xe5\x0c\xfe\x98\xdd\x03\xd5\xdc\xd5\xf4\x33\x9d\x49\xfb\xce\xd5\x2b\x71\xf7\xf5\xbd\x34\xe2\xfa\x6d\xd4\x04\xa8\x84\x18\x89\xa0\xaf\xdb\xcc\x9c\x20\xfd\x79\x08\xd1\xc8\x60\x58\x5d\x42\xf3\x54\x4c\x94\x8e\xe5\x56\x1f\x6a\x0a\x17\x88\xc8\x84\x98\x96\x33\x7d\xca\x0d\xca\x3f\x6e\x26\x7d\x0c\x71\x11\xa2\x5c\xd9\x18\x6c\xeb\xd1\x51\x41\xca\xb3\x3c\xb0\x0b\x5b\x3e\x2d\x7e\x60\x09\x42\x99\x86\x0b\x28\xe7\xcd\x42\x05\xf9\x5c\x63\x77\xce\x69\x6c\xcf\x4f\x2c\x3d\x0a\xb3\x12\x07\x21\x0f\x44\xcc\x28\xd6\xab\xdf\xb1\x62\x5e\xb0\xf3\xa5\x98\xe7\x9a\x01\x43\xe2\xec\x6d\x89" \
-"\xca\x48\xea\xf3\x17\x9c\x29\x69\x76\x28\x48\x70\x93\x35\x4c\x7e\x9e\xff\x91\xd5\xd6\x2b\xf1\xc2\x7d\xe3\x68\xf1\xc4\xf4\xed\x8c\xd6\x3e\xd2\xf9\xcf\x8f\x3a\x6a\xb6\x0a\x4b\xf7\x72\x13\x7f\xd2\xd9\x66\xbe\xc8\x95\x24\x3b\x89\xcc\xde\xdf\x7b\x3f\xd7\x54\xf9\x31\x95\x53\x89\xcd\xe0\xc0\x2c\xa6\x65\x6d\xb5\x62\xdb\x11\xa9\xba\x23\x0b\x6c\x83\x4b\xb9\xdc\x3a\xd6\x81\x43\x0f\x6a\xdc\x43\x4c\x07\xf7\x9a\xc9\x92\x19\xe0\x33\xa9\xb4\x3d\x49\xa9\xd8\xa3\x40\xb3\x90\x3d\xb8\xa3\xa3\x08\x71\x28\x2a\x35\x2e\x50\x32\xc7\x9c\x06\x8a\x2c\x56\x82\x0c\xc3\xfb\xbf\x63\x7a\x7f\x74\x9b\xf8\xcd\x56\xac\x31\xc5\x84\x65\x7c\x20\x17\xe1\x4e\xfc\x17\xb6\x1b\x0a\x5d\x87\xdc\x62\xf6\x3e\x9d\x86\x66\x01\x71\xf4\x41\x27\x03\x6a\xa8\x16\x8e\x10\x40\x8c\x0f\x50\x63\x23\x16\xb3\xa5\xa6\x55\x64\xe9\x5a\xe5\x12\x4e\x5c\xcc\xff\xda\xe0\x79\xda\x95\x92\x65\x5a\xed\xd1\x8d\xac\x47\xc1\x5a\xaf\xbd\xa5\xa9\x58\x1b\x0f\xc5\xe1\x84\x20\x7a\xd7\x59\x5c\x82\xaf\xa0\xba\xc9\x14\x3d\x40\xa2\x85\x03\x2b\xf2\x01\xfd\xfc\xb5\x88\xfd\xda\xa3\x82\x6f\x24\x0e" \
-"\x85\x07\xdb\xcc\x91\x22\x20\xaa\xc1\xec\x97\x4a\x4a\x93\x4c\x8a\x6b\x79\x7a\x75\x9e\x1c\xf6\x32\xff\x87\x8a\xa4\x11\x26\xa4\xd2\x4b\xae\x74\xd0\x92\x91\xa3\x36\xa1\x8e\x68\xf2\xfd\x4c\x61\xba\x5c\x83\x45\xbd\xd9\xf1\xe1\x9d\x4e\x25\x4e\x60\xdc\xc2\x03\xf6\xd6\x79\xb2\x5d\x1a\x2e\xa5\x89\x04\xdf\x61\x0e\x5e\x32\x34\xea\x32\x56\x45\x8d\xa5\x79\xca\x98\x25\x55\x16\x87\xd4\xe9\x1e\x6a\xd0\x98\x0a\xc4\x17\x90\x02\xc7\x12\x2b\x2f\xec\x53\x1e\x36\xf9\x07\x91\x74\xef\x24\xbf\x73\xab\x65\x4d\x27\x66\xa7\xf9\x98\xea\xc1\x8d\x18\x8f\xfe\x84\xf1\x31\xdd\xdf\xbd\x67\x0c\xf5\x14\xf0\xd5\x79\x98\x52\x45\xb3\xc0\xba\x06\x42\x38\x16\x16\x90\xf0\x7d\x57\x0d\xf8\x5d\x6c\xe5\xf5\x94\x0e\x3e\x83\x2d\x64\xc9\x3f\x44\x76\xf9\x42\x62\x84\x8d\x4a\x8c\x14\xdc\x51\x86\x8d\xac\xbe\xc7\x95\xcd\x5d\x39\x2d\x71\xf0\x0f\xa1\x04\x7a\xe4\x1c\x96\xdc\xb7\x58\xe2\x33\x75\x06\x6b\x7a\x27\xa5\x19\x0f\xc5\xc7\x95\x9d\x83\xd6\x2c\xfd\xf0\xf7\xf1\x8b\xe5\xe8\xd4\xda\x71\x17\xbc\x84\x93\xfa\xfc\x0e\x91\x07\xf6\x65\x1b\xbe\x9b\x1b\xe0\x14\x25\x3f\x02" \
-"\x36\x26\x05\x22\xba\x02\x6b\xdd\xa1\x42\xf8\xd9\x3f\x4f\xca\x53\x35\xfd\x7f\x57\xfc\x6c\x85\xaf\x0e\x52\x8c\x84\x96\x5e\xea\x78\x78\xd6\x20\xea\x35\x51\x3c\x6b\xff\xa6\xbc\x59\x99\x09\xad\xea\x55\xf4\x0b\x4c\xd9\xbe\x16\x10\x93\x50\x17\x71\x7e\xf1\x54\x39\x86\x54\x98\x2a\x61\x9e\xb0\xf7\x8a\xf9\x36\x6e\x67\x70\xaa\x34\xee\x6d\x1b\x83\x89\x54\x25\x35\xa2\x2d\x0c\x87\xe4\xb3\xc5\x2c\xa3\x8f\x21\x00\x7d\xc6\x2d\x7a\x5d\xfc\x94\xd0\xa3\xf2\x63\x7e\xc3\x7a\xf7\x67\x8d\x16\xd0\x94\x71\xec\xd2\xdf\x39\xf1\x80\x09\x28\x69\xcf\x6d\x45\xe5\xcc\xee\x62\x7c\x64\xe3\x11\xb9\xe2\x12\x77\xc0\x32\x18\x62\xc4\xbb\xe6\xe0\x3c\xbf\x9d\x29\xb3\x5f\x4c\x99\x06\xd9\xe8\x5d\x02\x6e\x29\x94\x8c\xcb\x09\x9c\xe1\xae\x1a\x10\x01\xb6\x14\xf2\xdd\x72\x48\x15\x8d\xe2\xd5\xc8\x11\xc6\x10\x64\xb0\xd8\x49\xf0\x4c\x06\xed\x4e\xc8\x77\x4d\x27\xf0\x9e\x1f\x94\x83\xbb\x3f\xe8\xd2\x40\xb3\xfa\xe8\x35\x4e\x28\x12\x59\x21\x27\x8c\xd1\x38\x70\xf9\x92\xde\x07\x7f\xa1\x41\x92\x21\x92\x7f\x38\x72\x20\x54\x50\x18\x70\xe5\xe6\xd5\x5e\x5b\x94\xf4\x6d\x0d" \
-"\x9d\x6f\x33\xc9\xad\xad\x42\x88\x96\x06\x6f\x6f\x9a\x0b\x11\x74\x0d\x1b\xd1\xf2\x3b\x63\x15\xa9\xde\x44\x48\xde\xa4\x3d\xd9\xc9\x35\xcd\x21\x0f\x8d\x0a\x50\x0a\xd7\x52\x7d\x2b\xa5\x36\xb8\x1a\x97\x47\xcb\xce\x32\x3a\x39\xa1\x34\xa8\x16\xf2\xb3\x7d\x6f\x2b\x5b\x57\x03\x07\x7e\xb1\x36\xa3\x94\x5d\xff\x37\x7c\x2b\x8d\x48\xa6\x22\x93\xa3\x87\x00\x32\x7e\x98\xa5\x01\xf4\x76\x5f\x60\x50\x04\xbb\xce\x6e\xef\xd6\xb7\xd1\x7d\xfc\x28\xb6\x7e\x86\x02\x2d\xb6\x8a\xb3\x02\x66\x8a\x65\x13\x5c\x86\x27\x45\x78\x39\xbe\x39\x82\xf5\x49\xdd\x17\xae\xb7\x5d\x1c\x9d\x2a\xe7\xd9\xce\x8b\x73\x26\xbc\x81\x7c\x0c\x6e\x59\x6c\x84\x33\x8e\xf4\x87\xf5\xfb\x44\x80\x38\xda\x1a\xf8\x81\x22\x9d\xa7\x54\x8a\xf5\x5f\x40\xac\x4a\x09\xfc\x11\xbc\x49\x6e\xe5\x4e\xe6\x99\xe7\x2c\xbf\x2e\x7e\x27\xf1\x7b\xdf\x2e\x2f\x27\x45\x8b\x76\x07\xb8\xb7\xa6\xab\x3d\x70\xc8\x6f\xc4\x3d\x7b\xd9\xbc\xc1\x66\xd4\x69\x5c\x00\x9f\x1b\xb0\x4a\x32\xfa\x6b\x44\x1a\xc4\xcb\xef\x00\x2a\xb8\x23\x8f\x0e\x6a\xac\x4c\x93\x70\x64\x19\xd7\x29\xaa\x7e\x5f\x6c\xda\x52\x24\x09" \
-"\x74\xb1\xb6\x7b\xfe\xbe\x38\x35\x7d\xef\x42\xf3\x91\x0a\x3d\x66\x39\x6d\xc5\x50\x9f\x61\xfd\x78\x30\xf9\x61\xb1\x02\xb9\x99\x0e\xc9\x79\xa5\x6b\x85\x76\xf8\xdc\x44\xce\x60\x89\x9a\x79\xd7\xd9\xbd\x4a\x4c\xcc\xde\x23\xde\xe3\x53\x34\x4d\xb4\x7a\x7b\xb8\xf9\xd4\xf0\x16\xc8\x88\xc2\xce\x6f\x78\xa2\xfd\xba\x9b\xd5\x95\x27\x61\xfc\x84\x5f\x46\xf1\x2f\x36\x13\x8f\xbc\x95\x94\xee\xa1\xc2\x79\x11\x5d\x6f\x85\xf2\xc9\xd4\xb7\x8a\x98\xb2\x25\xe6\x8c\x6b\x89\x7a\xa3\x4b\x05\x87\xe1\xba\x20\x32\x83\x68\xc5\x10\x57\xa3\xb4\xfb\xaa\x1b\xb5\xf1\x55\xb3\x7e\x74\xdb\xce\x4f\xf2\x05\x65\x29\xa5\x50\xdf\x42\x20\x44\x47\x58\x35\x75\xd8\xd1\xac\x70\xd4\x81\x98\x31\x6d\x3d\xec\x4f\xde\x9c\x0b\xef\x1f\xca\x3d\x7b\xcd\x3a\x80\x07\x5f\x1b\x8b\x87\x5b\x77\xc0\xbb\x0d\x63\xa5\x67\xfe\x8c\xc3\xea\x64\x4f\xe7\x9a\xb0\xe9\x52\xd6\xbf\x3c\xc1\x35\x8f\xd5\xfa\x83\x5b\x28\x91\xe1\xd4\x6a\x4d\xc9\x6a\xb9\x78\x8d\xe1\xc3\x05\x6e\x84\xeb\xbd\x5f\x2a\x5a\x37\xc2\x74\xde\x93\x5b\xac\xaf\xdc\xe8\x17\x5f\xc9\x04\x96\x66\xfa\x17\xc4\x56\x78\x1c\x2a" \
-"\xbc\x30\x2e\x90\x42\x55\x7c\x2a\xbb\x89\xd4\xc4\xe6\xf5\x6f\x93\xcc\xa1\x3f\x23\x64\x16\x90\xe8\xd0\x58\x65\x97\x0a\x1f\xd2\x5a\x01\x04\xca\x87\x78\x66\x51\x79\xbd\xc9\x2c\xde\xd1\x30\xbc\x98\x6c\xfa\x41\xad\x0d\xf0\x01\x7b\x6d\x24\xa3\x89\xac\x45\xfa\xa2\x0a\x4b\x59\x39\x66\x93\x4d\x12\x5d\x04\x68\xd8\xe1\xcf\xe5\x18\x39\xbb\xe4\x63\xda\xcc\x3a\x73\x2c\x78\xd1\x63\xc8\xd6\x9c\xdd\x8b\x11\x83\x9f\xa4\xe9\xa0\x06\x02\x1b\x0f\x3c\xcc\xdb\x12\xbe\xa4\xd2\xcb\xbc\x22\x74\x24\x86\x65\xc1\x4b\x58\xbd\xde\xf5\xae\xcb\x00\xc7\xa1\x39\x16\x04\xdb\x4d\x18\x24\x8d\x46\xd7\xdb\x1f\x5c\x69\x0a\x46\x66\xa9\xf4\xd7\xe6\xa9\x58\xf0\x9d\xbe\x05\x82\xba\xe8\x4c\x75\x2d\xe6\xb5\x73\x43\x23\xac\x0f\xa5\x1e\x7d\xb4\x39\xf5\x19\x61\xf4\xaa\xb6\xb4\x6b\x18\xe7\xc3\x8c\x61\x32\xdc\xdc\xc1\xc4\x90\x31\x20\x5a\x3e\xce\x6d\x55\x23\x87\xdc\xf9\xff\x4e\x67\xcf\x62\x9c\xe4\xd5\xfe\x16\xe7\xf7\xbf\x98\xfa\x25\x08\xac\xcc\x88\xb5\x1e\x4b\x09\xae\xe2\xaf\xac\xee\xed\x6b\x1b\xe6\x2e\xc5\xf0\x8c\xa2\xe1\x41\xa5\xf9\xd1\x31\x98\x13\x66\x60\x60" \
-"\xce\x91\x28\x27\x9b\x44\x08\xe4\xb0\x00\x70\x06\x1b\xa4\x0c\xdc\xb9\x8c\x5f\x47\xca\x7d\xea\x0f\xf6\x34\xce\x05\x67\xc6\x06\x41\x0c\xd1\x57\xdf\x79\xef\x7c\x78\x80\x9c\xc2\xfa\xef\x85\xf7\xe3\x4c\x6b\x49\x26\xe4\xf1\x21\x13\x3d\x8a\x46\x25\x2d\x3a\xef\x0d\xb0\x1b\x11\x29\xca\xe9\x3e\xdf\xaf\x9d\x24\xea\xc0\x17\xb4\x40\x3d\xe7\x67\xad\x53\xa9\xf1\x33\xc9\x51\x43\xd9\x4f\xf6\xcb\xf7\xe9\x75\xfd\x99\xfc\x32\x36\xfb\x78\xfe\xd7\x69\xa8\x2f\x80\x3d\x8b\xf3\x5b\x8e\xa6\xb3\x1a\x61\x41\xab\xa7\xf4\x72\xbc\xc0\x65\x17\x37\x73\xcd\xde\xd1\x3b\x6f\x53\x93\xbc\x1a\xa3\x7b\xf4\xfc\x62\x94\x68\x6e\x51\x1b\xa7\x43\xc8\x55\xfb\x50\xa3\x75\x24\x4e\x89\x5f\x22\x3b\xa3\xac\xa4\x59\xf7\x48\x40\xb5\x29\x56\xff\xb8\x9e\xee\xb9\xe2\x46\x70\x7b\xb3\x03\x49\x01\x6f\x6e\xa1\x31\x1d\x70\x7c\xf4\x6e\xee\xf7\x0e\x0e\x4c\xc7\x9f\xc5\xb3\xfa\xf4\xf7\x55\xac\x38\x62\x46\xe8\x63\xcc\xe2\x4b\x79\x49\xef\xcd\xbf\xd2\x4a\x5c\x04\x00\xea\xc1\xc4\xc2\xad\x44\x2c\x0f\x28\x9b\xa6\xcd\xc5\x34\xcf\xa9\x7b\x8f\x05\xb3\xea\x1f\xca\x56\x38\x18\xe9\x3e" \
-"\x79\xd3\x85\x13\xd1\x58\x20\x9e\x55\x46\x55\xf8\xf9\x30\xe1\x2f\x56\x0d\x80\x06\x8c\x24\x1f\x80\x3a\xd7\xb0\x51\x81\x7d\xac\xe0\xd1\xcf\xf6\xad\xcf\xc1\x16\x61\x3c\xad\xb7\x4d\xfd\x9b\x12\xb2\x24\x71\xba\xd8\x46\x35\x2f\xb0\xb0\x6e\x58\x86\x51\xda\xa4\xe6\x2d\xf1\x1b\x50\x64\x61\x07\xf1\x76\x48\xc8\xa5\xbb\x9b\xbe\x5e\x28\x1e\xcd\x99\x47\x68\x8d\x0f\xdc\x0f\x99\xb1\xc8\x9b\xef\x78\x65\x88\x11\x99\xff\x58\xa3\xb9\xdd\xc7\xd8\x62\x45\x5f\x3b\xaf\xa4\xe9\xfd\x85\xe1\x02\x9c\x79\x5d\xe9\x0b\xac\xa4\xfc\x42\x19\x3b\x8d\xc3\x72\x83\xe0\x32\x8b\xe3\x87\xf0\x04\xab\x0e\xce\x8c\xcf\x37\xd3\x9f\x87\x08\xc1\xef\xe9\xcf\x35\xf4\xee\x54\x13\x49\x01\x5e\x68\x2a\x94\x1a\x03\x65\xc6\x99\xef\xef\x22\xe6\xfd\x6c\x06\x36\x3b\x36\xfc\x31\x56\x43\x5a\xae\xc4\x8c\xef\xb5\x40\x55\x0b\x2c\x09\xe5\xf9\x88\x48\x7d\xc7\xbf\xf2\x9c\x91\x51\x46\xc1\x2c\xb5\x85\x24\xd3\xf2\x1e\x90\xf4\x07\x59\x61\x62\xf4\x3d\xb8\x03\xae\x65\xad\xdd\xef\x91\xa6\xe1\xb6\x52\xca\x4c\x4c\x96\xc6\x5d\x78\x64\xfe\x2f\x15\xa8\x3d\x26\xa5\x30\x1f\x4c\x3b\x25\x59" \
-"\x6a\x57\xcb\xb3\xf8\x9c\xa2\x40\x32\x4c\x05\x7b\x71\x09\xd7\xe2\x17\xcd\x2c\xf5\x75\xb3\xfb\xa0\x6a\xcd\x82\xbb\xfd\x97\xe0\x18\x20\x6b\xd2\xdd\x3e\x09\x85\xc0\x77\x8f\xe8\x45\xcc\x62\x05\x56\x79\x11\xf5\xb4\xf9\xe9\x30\xb9\x38\x3e\x14\xd7\x8c\x06\xdc\x8b\x2c\x2e\xb4\xec\xd7\xfa\x51\xc3\xfe\x65\x87\x28\x87\xeb\x8d\x16\xb7\x01\x1f\x03\x59\xfc\x57\xcf\x3a\x18\xa1\xe1\x1c\xd9\xae\x7a\x47\x2e\x64\x19\x55\xbd\xb1\x2d\xb9\x35\xd2\x6d\xde\xf0\xf4\x52\x4b\xbc\x11\xbf\x2d\xb8\xdc\x84\x69\x4b\x97\x0c\x05\xec\x94\x96\x0a\x16\xc7\x1a\x8f\x8e\x9f\x89\x57\x8e\x46\xf1\x43\x05\x0f\xeb\x57\x14\xe0\xcf\xd2\x26\x3c\xf5\x22\xee\x6c\xc1\xcc\xc2\xb3\x07\x83\x9e\x3f\xf5\xff\x5f\x22\xf7\x3f\x64\x27\x55\x33\xb6\xdc\x45\x7d\x58\xdf\x27\xa0\xb0\x73\x64\xe8\x96\x14\x28\xcd\x84\xe7\xc9\x61\x28\x42\xcf\x35\xc3\x27\x3b\x04\xbf\x8c\xd2\x42\x2e\x68\xc4\x40\x23\x16\x97\xd2\x58\xdc\x6c\x60\x5f\xaf\x61\x46\x19\x5a\x6f\x70\x7b\x6a\xcc\x16\x3b\x6a\xf8\xe8\xb2\x95\x20\x24\x10\xfe\xbf\xca\x5f\xb1\xb1\x74\x5f\xd5\xcd\xaa\xfe\x60\xb8\xe9\xa6\x0a\x9c" \
-"\x5f\xfe\x69\xcd\x37\x9e\x3d\x81\xd7\x62\xe6\x6b\x03\x3f\x9d\x9b\xcf\xf7\x9d\x4f\xfe\x8a\xbd\x5e\xf8\xf4\x98\xa7\x6f\x10\xca\xea\x51\x26\xfd\x01\xb4\xd2\x18\x59\xb8\xfc\x55\x06\x23\xdf\x09\x22\x53\xfe\xe0\x45\x8a\xc7\x25\x5a\x18\x15\x88\x0f\x33\x32\x1e\x36\xd8\xe3\x9c\x75\xf2\x64\x34\xa3\x59\x21\xa4\x62\x11\x59\xb0\x15\x9b\x0f\x92\xd8\x56\x75\xa8\x03\x79\x4b\xfc\x74\x50\xc7\xa2\xd7\x4a\x04\x1f\x76\xba\xce\xf9\x74\xdd\x63\x41\x36\x21\x0d\x4e\xd2\x23\xd2\x35\x7a\xbe\xc6\xdd\xb7\x86\xcc\x4f\x08\x19\xd2\xbc\xfd\x55\xc9\x2e\xfa\x03\xe8\xd0\x25\x0c\xdf\x48\x97\x94\xee\xa8\xcc\xfc\x1f\x01\x1c\x76\xf8\xaa\x95\x49\x3b\x20\xca\x65\x97\x0f\x08\xbd\xa3\xd9\x8d\x96\x74\x41\x81\xa6\x93\x36\x01\x42\xd6\xe4\x4d\x4c\x0c\x69\x01\x52\x81\x7b\x1c\x32\x6a\xef\x73\xbd\x51\xa5\x59\x40\xa2\x48\xad\xa2\x0c\x8f\xa1\x2a\xc3\x34\x31\x4f\x82\xe7\xcf\x7d\x71\x15\x2b\xb8\x78\x61\x4f\xa2\x24\x7d\xcc\xfd\x17\xeb\x16\x57\xfa\x81\x2e\x33\x8c\xb8\x7a\x05\xb0\x5b\x4d\x79\x63\x5e\xf6\xd9\xf7\xb5\x64\xbe\x51\x2b\x47\x61\xd8\x52\x90\x32\xd7\x48\x58" \
-"\x88\xca\xa7\x92\x14\x6c\x6f\x30\x08\x80\x4d\x3b\xb3\xe3\x74\x66\x6a\xaa\x7b\xb7\x96\x0f\x14\xe2\xb1\xf4\xc7\xd2\xe1\x60\x0b\xe8\xe6\x6b\xe6\x5c\x58\x07\xc8\xfa\xa2\x8f\xf5\xd7\xc2\xae\x7e\x1f\x91\xd3\x9e\xd2\x7d\xde\x56\x50\x69\xcf\x60\xc5\xf0\x10\x79\xe5\x10\x2b\x20\x12\x61\x74\xf9\x69\x35\x0a\x6d\xa3\xe2\x5a\x2b\xcd\x1b\xbe\x14\x4b\x05\x77\x61\x51\x64\xec\x1e\x0d\x2a\x1e\x94\xed\xe1\x95\x23\x11\x11\x05\x8e\x23\xfa\xd7\xc5\x9b\x11\x6f\x91\x81\x35\x39\x00\xc8\xf9\x59\xb0\xbd\x01\x74\x24\x0f\x8c\xb6\x5f\xd6\x8f\x74\xeb\x52\xa5\x35\xc0\xb5\xb7\x83\x6a\x05\x8e\x23\x1f\xeb\xb1\x5a\xcb\x79\xa7\xd8\xa5\x21\x2f\xe1\x15\xe3\xde\xeb\x52\x4a\xc3\xc5\xd7\x4f\xcd\x6c\x91\xb9\x58\xe0\xcf\xb9\x2b\x94\xc7\x37\xce\x37\x35\x24\x53\xe4\x0f\x9b\xf0\x34\x8b\x24\xa9\xca\x8c\x0b\x94\xc9\x64\x74\x05\x04\x5d\xd1\xff\x0e\x68\x1b\x1e\x8a\xe0\xb6\x88\x44\x1b\x12\x7f\x3d\xe7\x0d\x4f\xd3\x81\xaa\x53\x85\x79\x2a\xc9\x5b\xa1\x9d\x5d\x5c\xe4\xe6\x55\x2a\x48\xfc\x8e\x55\x31\x31\x5a\xf8\x69\x40\x65\x11\xb7\x68\x47\x42\x58\xe7\xf3\xb9\x7f\x6d" \
-"\x60\x10\x90\x43\x89\x8e\x33\x0f\xb0\xe5\xc3\xf4\x79\xe1\xeb\x01\x2f\x1a\xbb\xc7\x1d\x54\x2a\xd1\xc0\x17\x18\x42\x8b\x69\x3b\x2a\x62\x2a\x3b\x79\x2a\x13\xfc\xd8\x53\xaa\x0f\x99\xe3\xd1\xf2\xc0\x54\x7f\xe1\x07\x6a\x34\x7a\x0b\xc5\x0d\x72\xc4\xc2\x43\xd9\x6a\xc9\x09\x21\xbc\x2c\x50\x9c\x8a\x0d\xea\xbd\x1d\xf0\xbe\xf7\xe7\xc2\x71\x91\xb6\x3f\xb8\x51\xcb\x58\xad\x2b\x94\x7e\x3f\x37\x1e\xb3\xa9\x08\x04\xd3\x07\x49\x30\x98\xa9\x41\x8b\xef\x27\x2a\x42\x43\xd1\x04\x14\x66\xc1\x3a\x16\x9b\xe5\xf8\xe9\x63\xee\x3e\xad\x47\x38\x2b\x99\x81\xfd\xa1\x45\x57\x5e\x32\x35\x01\x12\xa7\xb3\xfd\xe8\x05\xf4\xb4\x49\xca\xce\xc7\xb1\x9c\xa8\x90\x9c\x70\xf7\xbb\x5d\x79\xe9\x95\x10\x50\x91\x43\xaf\x39\xfc\xb9\xda\x38\x0d\x00\xa4\xa0\x54\x13\x44\xa8\x0e\x59\x4d\xe1\x02\x0e\x53\x7c\x38\x37\xa2\xe5\x27\xc4\xf9\x1b\xf0\x5a\x85\xf1\xed\x4f\xa9\xe9\xad\x8f\xff\x24\xf9\xa6\x74\x74\xb1\xd8\x95\xe0\x1a\x40\x2c\xb1\x19\x05\xfd\x0d\x32\x41\xed\x0f\x8a\x2b\x5f\x6c\x14\x81\xb8\x8a\x79\x6e\xf0\x5b\x0c\x66\xbb\xb7\xe8\xc4\xfd\x8c\x5a\xae\xab\x09\x96" \
-"\x9f\x58\x61\x38\xe3\x9e\x5c\xe3\xd1\xe3\x89\xf8\xf8\xb6\xa7\xe5\x6e\xbc\x55\x1e\x4a\x07\x48\x63\x6a\xb2\xb5\x5a\xf8\x65\x3b\xb8\x40\x1a\xbc\x01\x4c\x91\xbf\x76\x4e\xa1\x5a\x9d\x6c\x79\xeb\x9a\x5a\x70\xec\xcc\xe2\x43\xc1\xcc\x88\x54\xe0\x2f\xa5\x00\x2c\x2e\xe2\x90\x71\x92\x85\x49\x49\x65\x3d\x31\xb7\x2d\x88\xd1\x0a\xb9\xcf\x18\xf1\xfd\x86\x71\xf8\xe9\x71\x4b\xa1\xb1\x02\x42\xd8\x3e\xb0\x3b\x04\xa3\x5a\xaf\x60\xee\xf3\xc3\x3e\x20\x3d\xe1\x4b\xb2\x7e\x60\x6d\x7a\xe7\xef\xb4\xc4\xcb\x14\xc1\x00\xcb\x31\x92\x22\x7f\xfa\xc0\xcc\x59\xff\x56\x09\x9b\x78\xa1\xed\x40\x94\x32\x36\x78\x5f\xbe\x79\x5d\x41\x7d\xbf\xca\xbe\x10\x70\xbf\x4d\x1c\x7d\x5a\x54\x80\x07\xda\xfb\xb1\x47\x90\xa2\x3c\x2b\xd9\xff\x31\x35\x65\x83\x2a\xc0\x40\x7b\xbc\x21\xd9\x93\xf8\x3f\x4b\x3d\x45\x95\xf8\x5a\x70\x94\x84\x0f\x72\x72\x42\xeb\xc6\xde\xa6\x6c\x8c\xac\xf8\x0e\xfc\x3f\x9e\x99\x91\x3d\x73\xa0\xc2\x1e\xca\x22\x12\x9e\x8b\x84\xaf\x49\x4d\x24\x0a\x55\x9c\xb4\x2c\x5c\xf5\x43\x7c\x15\x37\x03\xb5\xd0\x10\x4e\x90\x2d\x96\x99\xab\x63\xcb\x78\x66\x90" \
-"\xcd\x95\x10\xa8\xf5\x3c\x43\xab\x69\xa3\x4a\x65\xc5\xf3\x4d\xce\xbb\x4f\x7d\x36\xe8\x32\x63\x3c\xd1\x15\xe0\xcb\xf0\x36\x05\x40\xbe\x71\x34\x2b\x72\x99\x39\x18\xf6\xf9\x43\x05\x74\x6c\xa7\x18\x98\x9d\x91\x91\xb8\x87\x09\x15\x13\x28\xd0\x57\xfe\x30\xf9\xff\xa2\x27\x4b\x77\x14\xbc\xf5\xa6\x17\x86\x45\x40\x07\xf2\xb8\x59\x11\xa6\x24\x9e\x4c\x69\xeb\xd4\x4b\x0e\xb3\xa8\x33\xcc\x2a\x32\xbb\x05\x76\x4c\xad\x3a\x9b\xac\xc3\xa8\x2c\x1c\x81\x09\xbc\x08\x72\x4f\x39\xe9\x96\xaf\x24\xd5\x3b\xb0\xcf\x19\x0a\x94\x50\x03\x74\x0e\x78\xa1\xe9\xfa\x24\xd4\x74\x1a\xcb\x25\x81\x2a\x18\x41\xbe\x9d\x41\xc1\x84\xc3\xb5\x1b\x7d\xa1\xed\x11\x35\xcb\x20\x1d\x86\x78\xda\x78\x54\x8b\x27\x79\xf4\xbe\xa7\xb3\xa5\x71\xa9\xdb\x1f\x89\x56\x0f\x2b\xed\x63\x47\x2b\x97\xa7\xdd\xb6\x70\x9d\x6f\x28\x5b\x85\x11\x57\xde\x53\xdd\x27\xbc\x95\x33\x2d\x87\x68\x1b\x94\xf6\xf8\x1c\xa0\xdb\x7d\xc6\x29\x97\xce\x1a\xa7\xa7\x5e\x29\x69\xfb\x04\x23\xfb\xa6\x01\x6f\x9c\xd1\x7e\x27\x5d\x69\xea\xc5\x40\xb9\xb1\x30\xb6\x99\x63\x22\x1b\x6d\x7e\xc0\xb7\x14\x75\x83" \
-"\xd1\x5d\x25\x47\x60\x57\x04\xb7\x34\x10\x04\x7d\x0c\x35\x09\x4c\x68\x97\xaa\x09\xba\x4a\x98\x8c\xad\xe7\x34\x71\x0b\x73\x06\x4b\x3e\xd0\xc0\x66\x47\x70\xcc\x4a\xce\x14\x52\x05\x99\x10\xc2\xba\xb3\xbe\xaa\xdb\xfb\x6d\x18\x58\xdf\x89\xb9\xbe\xd9\xa8\x50\x65\xd2\x69\xdf\x73\x7c\x47\x5b\xc0\x30\x2a\xce\xdc\x0e\x30\x03\xe8\x63\x33\xf7\x27\x92\x97\x94\xe6\x5c\x71\x7b\xb8\x7c\xa9\x37\x05\xf9\xe2\x9c\x56\x51\xa7\x90\xa4\xa9\x49\xf1\x3d\x38\x14\xf7\x74\xac\x93\xaa\x03\x06\x50\xbd\x03\xdc\x0b\x3e\x38\x81\xb3\x91\xcd\x5b\x2e\x41\x1d\x72\xb8\xd0\x76\xef\x67\x21\xe0\xb1\x6d\x96\x13\x13\x64\x88\xa6\x61\x65\xa8\x09\x07\x1d\x8f\xa9\x5d\xba\x4c\x17\x03\xe3\x5d\xf0\xeb\x5e\xc3\x02\x2e\xbc\x4b\x25\xfc\x3c\x3e\xba\xfa\x8f\x85\x60\x7f\xd0\x7f\x37\xb0\xf7\xe8\x63\xc4\x63\xc5\x6b\xa2\xea\x2f\x6d\x1b\x79\x42\x49\xa0\x01\x34\x1d\x48\x59\xfc\xe7\x41\xec\xfa\xc6\xba\x81\x15\x66\x62\x39\x14\xb8\xdd\xae\x30\x25\x0b\xb9\x7b\xbb\x66\x4e\x5c\x03\x45\xa1\xde\x21\x96\xfa\x75\x55\x76\x6f\x04\x91\xf2\x3e\xff\x1b\x30\x48\x57\xfd\x20\x9d\x82\x44" \
-"\x3f\xe0\xdf\xe3\x1d\xd9\xb1\xad\x3d\xce\x22\x0e\xcd\x46\xa1\xe0\x1c\x83\xc5\xcb\x69\x21\xb2\x83\x90\xba\x93\x77\xa7\xac\x07\x74\x34\xd6\x34\xbf\x10\x14\x8a\xf1\x96\x3c\x11\x1e\x5a\x16\x90\xbb\xe3\xa3\x86\xb0\x42\x79\x0e\x01\xe8\x63\x5d\x39\x19\x71\xb1\xf3\x7e\x2e\x31\x00\x43\xcf\xc6\xff\x26\xa4\x34\xdd\x34\xdc\x5a\xc4\xbf\x49\x21\x88\x63\x4a\xc3\x1f\xe7\xc2\xc7\xb6\x8c\x52\x9d\xbc\x08\x0c\x51\x54\x6b\x02\x02\x23\x59\xa8\x3a\x82\x10\x3c\x58\xa3\xd4\x57\x84\xc2\xc2\x3f\xbb\x62\xf3\x73\x40\xf5\xaf\x09\xda\x00\x20\xd2\xc5\x28\xa6\x2c\x0f\xea\xee\x21\x99\xe0\xfa\x78\x33\x00\xe3\x78\xdb\x2c\x1e\x56\x40\x68\xea\xab\x89\x4e\x7d\xcc\xfd\x3c\x86\xd3\xda\x2f\x0f\x91\x32\xe7\x6c\x8f\x7e\x63\x50\x6d\xf2\xd3\x92\x8e\x53\x16\xea\x96\x30\x7b\xe3\x34\xd0\xd5\x89\x53\xd9\x52\x2b\x9b\xd4\xe6\xa2\x8b\x6b\xf3\xdc\x2d\xfd\xdc\xfa\x61\x67\xef\x36\x0e\x16\x83\x4a\xab\x63\xdb\x62\x28\xd8\xb0\x9e\x52\xfa\x6a\xfe\x02\x63\x31\x38\xa8\x77\xb8\x8c\xb6\x74\xba\x1d\x67\xdf\x14\x09\x5f\x06\x24\x1c\x86\x5a\x08\x39\x41\x9e\x21\xee\x9b\x3d\xd2" \
-"\xec\x7e\x6d\x90\xfc\xde\x2c\x68\x6a\xd4\x8c\xc3\x1f\xde\x8d\x83\x37\x01\xa0\xec\x34\x9b\xaa\xad\x9a\x55\xee\x06\x9a\x5d\xf4\xac\x14\xcf\x03\xf9\x8f\x34\x16\x4d\x64\x0e\xe3\xfe\x23\x42\x1b\x25\xde\x62\x07\x16\x91\xca\xd6\x74\xd6\x21\xde\x8a\x20\x9a\x33\x56\x68\x77\x1c\x6b\x44\x0d\xd9\x9b\xc4\xdf\xcd\xb4\x5e\x16\x95\x9c\xa7\xca\x2d\x7d\x25\x69\xcf\x91\x1a\xa2\x9b\xa7\x07\x9b\x33\xc9\x03\x48\xb6\x9a\xd1\x0e\xc5\xd7\x8c\x72\xba\x79\xac\x5e\x4d\x10\x8e\x00\x67\xb8\x17\x1d\x37\x65\xd3\x3c\xe5\x36\x4e\x79\xf6\x4f\xd4\x60\xef\x34\xb6\x84\x2a\xd6\xd0\x1c\x30\xfc\x4f\x71\x91\x5a\x6e\x2e\x91\xbe\x50\x3f\xa6\xd2\x4d\x22\x6f\x7d\x33\x66\x0a\x03\xc2\xd1\x09\xa0\x0f\x9b\x24\xeb\x8e\xfc\x7d\xae\x2c\xba\x4e\xab\x36\x3e\x0e\xe3\xbf\xc0\xea\x2b\x54\x63\x60\xc9\x01\x0c\x65\x62\xed\x0c\xf9\xba\x94\xdd\x11\xd1\x0b\xb5\x94\xa6\xb1\x2c\xa2\x10\x55\x23\xd6\x55\x72\x64\xf9\x4c\x52\x4a\x46\x1e\x92\x63\xe6\x0f\x9d\x75\x9a\xdb\x83\xa3\xc1\xaf\xd8\x1e\x93\xb0\xe0\x74\x52\x90\xe0\x83\xf9\x32\xf7\xc4\xed\x41\xb2\x66\x69\xfc\x14\x1f\xa6\x11" \
-"\xd9\xcf\x8c\xd8\xfe\x7b\x3b\x4d\x11\x6f\x62\xa8\xd2\xed\x4c\x6e\x6b\x10\x64\x28\x2e\xd0\x51\xc9\xa0\x34\x89\x19\xb4\x88\x25\xd6\xad\xac\x5f\x71\xd2\xc3\x5f\xde\xac\x76\x77\xbd\x62\xfd\x7b\x6b\x12\x62\x6f\xc9\xe0\xc5\x6d\x88\x96\x95\x05\x57\x7c\xbc\x25\xc9\x49\xc6\x1a\x06\x3e\x86\xbc\x88\xce\x7e\x65\x2e\xea\x11\xca\x2f\x87\xdf\x39\x3b\x35\x72\x26\x59\x1f\x01\x4c\x4c\xee\x8f\x0b\xbe\x1e\x4c\xe6\x2e\xa2\x33\x00\xba\xcf\x7e\x6b\xdb\x9c\x12\x68\xf7\x9e\xf4\x91\x14\x54\x1f\x44\x8d\x37\xbe\xdd\x69\x66\x38\x51\x9a\x7d\x47\x7b\x7e\xec\xb3\x51\xe7\xdc\xa7\x77\xce\x73\x6a\x3b\xa6\xa6\x03\x89\x2b\x38\x20\x05\x2d\xd7\x91\xa2\x2f\x94\xea\x72\x12\x03\xa6\xf8\xd1\x75\xc0\x67\x23\x53\x4f\x13\xd4\xe6\x0c\x80\xd6\x8e\x94\xad\xea\xd4\x3e\x4e\x90\x08\x8d\x3f\xfc\xff\xbc\x1b\xbf\x84\x35\xd7\xdc\x13\xbf\x4b\xfd\x91\xe6\x7a\x9c\x73\xfa\x49\xab\xd2\x16\xe9\xf4\x5b\x3a\x2f\x4b\x44\x74\xb6\x62\xb6\x4b\x42\x24\x9f\x40\xcd\xb0\x66\x32\xed\x26\x6b\x94\x3a\x3d\x40\x01\xf9\x44\x4b\xeb\x68\x19\xe4\x93\xe9\x2e\x19\xbe\x76\xc4\x22\x27\x01\x3c" \
-"\xc9\x43\x4d\x40\x09\x2b\x00\x96\x29\x49\x39\xfe\xd3\x60\x5d\x81\xe7\x3f\x0c\xb1\x6a\xee\x46\x49\x57\xfb\x07\xfe\x33\xd4\x22\x22\x89\x7f\xd1\xcf\x46\x3c\x44\x47\x4a\xd0\x77\xd3\x99\x64\xad\x15\xb2\x5f\x71\x06\x67\xf4\xcc\xc8\x8d\x3a\x9c\x0d\x15\x6d\xa9\xd7\xce\xb8\x0a\xf8\xd6\xdb\x02\x16\x6c\x25\xf7\x9d\x66\xa7\xfd\x8e\x8b\xb1\x3e\xf3\x3b\x93\x45\xe7\x96\x7b\xb1\xe7\xe0\x21\x1d\x4b\xb8\x73\x8f\xda\x04\x0a\x7d\x23\x32\xc9\x8f\x2c\xaf\x6c\xce\xf7\x98\x51\xf9\x87\xdd\x17\x84\x50\x68\x18\x06\x0a\xd0\x9b\x61\x2d\x09\x34\x1d\xe8\x98\xb0\x4b\xf2\xf1\x6f\x80\x7f\x90\x60\x9f\xab\x49\xfa\x34\xa3\x2b\x9e\xe8\x59\xe3\x41\xdb\x97\x99\xe3\x3d\x2e\xe8\xb1\xaa\xcb\xed\x09\xfd\xe1\xde\xe0\xc8\x56\x92\xb4\x68\x08\x0f\xbd\xb8\x5e\xb1\x24\x39\xaa\xce\x3e\x2f\x98\x43\x4d\x6a\x0a\x1a\xb4\x2c\x7c\xaf\x05\x51\x60\xd7\x8f\x8e\x98\x3d\x02\x51\xd8\x42\x8e\xd8\x47\x08\xaf\xf5\x33\x90\xba\xa6\x1c\xe6\x40\x9f\x96\x5a\xf9\x41\x97\x0a\x88\x5b\x26\x92\x01\xf3\x17\x8d\xe0\x7d\x6c\x04\xa6\xba\xf1\x37\x0a\xca\xfb\xe6\x60\xfc\xf8\xc5\x30\x1d\xef" \
-"\x81\xcc\xb8\x0f\x0a\x59\x82\xaf\x90\x3b\x9b\x21\xab\x79\x20\x13\xfc\x6d\xdc\xbf\x73\xed\x25\xf3\xe9\x79\x7a\x5a\xfa\x42\x8e\x2c\x23\xcb\xda\x91\xf3\x8c\x1c\xa1\xd5\x99\xe7\x4c\x8a\x4c\xfb\x97\x07\x0b\x40\xc1\x49\xe6\xbf\xc4\x99\x53\x05\x5e\x6b\x68\x01\x41\xcb\x95\x99\xd1\x4c\x52\x3c\x00\x15\x99\x3f\xac\x77\x6a\xdf\x33\xd4\xf4\x90\x19\x19\x7e\xd8\x09\x5d\x2a\x2e\xbc\x86\x9a\xc3\x54\x2e\x7e\x80\x88\x6f\x15\x5a\x67\xdb\xc6\x27\xa1\x35\xff\x97\xd5\x69\x87\x73\xe2\x5e\x1c\x30\xfc\x50\x21\x3c\xd5\xce\xf7\xbf\xaf\xc3\xe3\x76\x36\xb9\xcd\xc3\xf8\x0b\xee\xca\x0d\xec\x26\xb6\x01\x01\x33\x6f\xbe\xea\xf9\x57\xbd\xea\x23\x94\xe2\x48\x83\x4d\xf9\xd6\x30\x24\x74\x3a\xe4\x4d\xa8\xde\xbe\x73\xc1\x9d\xae\xd5\x69\x78\x17\x62\x86\x16\xcd\x96\xc0\xca\x80\x41\x80\x55\xfe\x63\x87\xe3\xaa\x50\x60\xea\xe1\xad\xac\x9c\xb3\xea\x51\xb9\x22\xe3\x9b\x29\xf2\xf4\x8a\x94\x3a\xff\xe8\x3f\x92\xb8\xe9\x9d\x69\xce\xb5\x35\x2a\xa5\x3b\x4d\x47\xce\xdb\xa9\xa8\xf6\x3d\x72\xab\x93\x16\x65\xda\x5c\x5d\x3a\x67\x50\xf0\x98\x50\x89\xb3\xb5\xaf\xcb\xf5" \
-"\x6f\xe7\x04\x29\x9e\x5e\xe0\xbd\xac\x7a\x61\x5c\x5d\x7e\x2f\xe5\xef\x34\xe1\x66\x26\x19\x3d\xc4\x79\xe3\x5e\x1b\x94\x85\x3d\x62\xf7\x07\x52\xbb\x9f\x6a\x4a\x33\xf5\xab\x2a\x45\xbc\xe3\x22\xb2\x88\xd2\x89\x3e\x56\x65\x08\xcc\x6a\x06\xea\x69\x85\x33\x45\x32\xa4\x54\xb6\x49\x5e\x6b\x0a\x86\x13\xa5\x6f\xbf\x91\xee\x00\x08\xbc\x39\x7b\xb9\x84\x09\xa9\x2b\xd7\x5c\x4a\x6c\xb0\xdb\x58\x1a\xe3\xff\xac\xc6\xaf\x28\x6a\x78\xe3\x94\x18\x97\xc3\x79\xb6\x46\xb1\xfb\x69\x1b\xa8\x10\x8e\xcf\xb0\x4a\x2f\xd9\xa1\x8b\x1c\x3c\xe4\xc4\xf6\xe9\xf9\xb8\xd4\x24\xc4\x60\x7d\x4f\xc5\x25\x11\x85\xfb\x59\xe2\xbb\xe8\x26\xee\x9e\xb7\x5c\x60\x23\x03\x1c\xf7\x44\x6f\x67\xae\x6e\x51\xa4\x92\xa5\xc3\xdb\x72\x1b\xcf\x53\xff\xfd\x7e\x58\xf2\xc6\x6f\x66\xda\xf9\x72\x09\x99\xdd\xdf\xb0\xbc\x58\x11\xd0\x2e\xb2\xee\x24\xfd\x6d\xe0\xde\x4f\x9a\x7d\x12\xc8\x65\x74\x39\x01\x81\x61\xc9\x97\x6f\xb7\xde\x8c\x87\x72\x9c\x5f\x54\xb2\xf1\x9f\xb1\x70\x3e\x19\x7d\x73\xe8\x66\xfb\x3e\xcb\x0e\x05\x96\x5c\x63\xf1\xdb\x35\xfa\x45\x30\x41\x8d\xf3\x82\x7c\xe1\x1e" \
-"\xb0\x3b\x11\xaf\x91\xfe\x31\xf1\xeb\x89\xe2\x88\x2a\x00\xfb\xa0\xcd\x9c\xc0\x0a\x09\x55\x37\x0e\x3b\x26\xac\xc0\x18\xdd\x42\x36\xed\xee\x93\x5a\xe4\xbd\x16\x09\xdc\xa4\x64\xda\x4c\xb0\x80\xb8\x88\x98\xfc\x43\xa2\xe3\x77\x85\x05\x0f\x6c\x82\xa5\xd3\x18\x13\x22\x4a\xea\xd1\xce\xcb\x05\xe8\x05\x85\x5c\xfb\x6f\xf2\x51\x39\x64\x0c\x74\x8b\xbd\x71\xa7\x8d\xb5\xae\x2f\x0a\x69\xed\x0a\xaa\xc3\x8c\xf5\xb8\xce\x2c\x07\xaf\xb6\x94\x9f\xd1\xef\x8d\xc0\xc2\x07\xbd\xe1\x5d\x25\xa1\x5a\x51\xa7\x61\x20\xa1\x0c\x93\x6e\x51\x80\x0e\x4e\x92\xfc\x13\xfc\xdd\x39\xc4\xe9\x62\xc0\xa6\x31\xc7\x96\x60\x1e\xf7\xa9\xb7\xfc\xd2\xc9\xe2\x17\x72\xc1\xe5\x7b\xfb\x5d\xbb\xbf\x2c\xc3\xd6\xde\xf3\x09\xb4\xd7\x22\x59\x43\xdc\xa2\xc3\xc8\x43\x7e\xf7\x3b\x8e\x23\x52\xee\x80\x19\x33\x87\x98\xee\x64\x34\x3b\x76\x98\x93\x6f\x85\x8a\x29\xc4\xd2\x18\xf1\x0a\x23\x49\xa3\x5e\x61\xb5\x20\x90\x18\xac\xbf\xcd\x0c\x19\xe6\x6c\x82\x8a\xf8\xa4\x62\x8d\x5c\x63\x38\xb4\xc0\x37\x3f\x46\xad\xa4\x39\x1a\x5f\x87\xf3\xff\x9f\xd3\xa3\x2f\x80\x47\x9b\x62\xbb\x51\x9f" \
-"\xbf\x01\x37\xe1\xf1\x10\xae\xf0\xa8\x7a\x25\x28\x61\xcf\x9d\x9d\xb0\x07\xfc\x51\x85\xd6\x80\x53\xf9\x21\x48\x8f\x04\x57\x08\xc5\xe7\x15\xde\x4a\x8a\x84\x95\x6c\x66\x18\xdd\x9a\x53\xbb\x50\x1f\x07\x3f\x74\xb4\xa9\x54\xca\x12\xbc\x0e\x76\x62\xa6\x4b\xf4\x0a\x01\xdb\x4f\x69\xa3\x00\xf9\xfd\x60\x56\xc9\x27\x61\x53\x53\xae\x30\xf9\x49\x27\xbf\xd0\xa8\x22\x43\x97\xfe\x10\x12\x87\x5c\x9d\xe0\xe1\x29\xfe\x2d\xcb\x29\xc5\xd8\x8d\x0f\xd2\x21\xdb\x43\xbd\xdc\x45\x32\x13\x4f\x2b\x4b\x7a\x01\x5d\x2c\x41\xc5\x0f\x1d\xea\x27\xaf\xe9\x88\x05\x41\x7b\x74\x6d\x88\x3f\x5c\x3b\x1f\x9e\x01\x28\xdb\x9e\x5e\x27\xec\xcf\xc6\x7c\xf7\xd1\x96\xa8\x92\x1b\xa4\x50\x6d\xfb\xdc\x65\x96\x1d\x8e\x2c\xc7\x47\xe8\x1b\x24\x76\x45\xe6\x54\x1a\xac\xfc\xe3\x2e\x13\x23\xa8\xef\x05\x0f\xdc\x80\x5f\xd4\x6a\xcd\xf2\x38\x80\x09\x14\x1c\x18\x21\x0b\xb1\xf4\x6e\xed\x83\xe9\xb7\xdf\x79\x73\x5a\xe1\xdf\xa0\x53\x42\x88\x46\x3a\x99\x0d\x68\x88\xcf\x27\xea\x81\x8c\xf7\xdb\xb0\x48\x78\xd3\xb9\x85\x76\x83\xd4\x3b\xba\xb2\xc7\xe4\x36\xe7\x61\xbb\xe0\x61\xed\xce" \
-"\xd7\x09\x16\x0c\x0c\x93\x15\x26\xa5\x4e\x95\xf5\x91\x76\x67\xf5\x81\x78\x05\x8e\x31\x00\xd3\xe0\xef\x4d\x72\x30\xac\x9e\xab\x13\xe0\xc9\x52\xda\x4e\xa8\x5b\x86\x0f\x28\xbb\x72\x2a\x1a\x08\x8e\xd3\x3d\xe9\x08\x9b\xb1\x93\x95\xe8\xa0\x01\xb1\x87\xf5\x90\x45\x16\x9d\x9c\xc8\x6d\x85\xc9\x9d\xd4\xfe\x86\xd5\xbf\xff\x65\xff\x14\xeb\x69\x3e\xdd\xd2\x9f\x40\xf6\x88\xb5\x3c\x29\x95\x81\xe0\x2e\x4f\xad\x88\x69\x7d\xc0\xf4\x10\xec\xac\xc2\xf7\x88\xa0\xbf\xdb\x18\x65\x97\xcc\xbd\xfe\x45\xa0\x4f\x54\x95\x2b\x6c\x5a\x41\x10\x4b\x31\xb6\x1d\xd3\xbc\x87\x91\x83\x6c\x8f\x61\x5f\x26\x26\xf4\x75\x5c\x9d\x5b\x26\x76\x76\x86\x6c\x7b\x53\xd7\xef\xe4\xba\x2d\x70\xca\xa6\x7f\xc7\x50\xb7\xfb\x70\x71\xed\x31\x94\x5c\x1f\x36\xf2\xd0\x0c\x2f\x65\x4a\x4f\x13\x4e\x7a\x3c\x7d\x55\x85\x03\x34\x7b\xec\x3c\x3e\xb2\x65\x6f\x5b\x59\xe4\x3f\x3e\x74\x35\x94\x47\x2e\x99\x85\xf4\x3b\x57\x75\xab\x43\xb6\x77\x03\xcc\xd7\xcd\x80\xf8\x0b\x3b\x22\x0f\x73\xf9\xb1\xf0\xc6\x3a\x34\x17\x65\x84\x76\x27\xb5\xc7\x31\x27\x62\xc4\x17\xb3\xc7\x3e\x41\xa5\xf6\xda" \
-"\xa1\x96\xa3\xfd\x5e\x7c\xd7\x0a\xf5\x47\x87\xa8\x3b\xfb\xe5\x9d\x27\x4b\xb3\xd3\x53\x21\xac\x51\x02\x1e\xde\xae\x42\x50\x0b\xc4\xbb\x7b\xff\x7f\xbb\xd0\xec\x6a\x58\x36\x5d\xfd\x25\x21\x9b\x52\x1a\x9c\x39\x57\x94\x82\x2c\x54\xcf\xab\xc8\x83\x52\x1c\x3d\x7a\x9b\x72\xa0\xfd\x1d\xb1\x32\xa8\x64\x49\x12\x84\x5c\x88\x43\x18\x9c\x95\xa4\x78\x6d\x82\xaa\x9c\xa4\xf8\x68\x53\x98\xe7\xd3\x64\x4e\x3b\xaa\x93\x65\x56\xfe\x7f\x8f\x7c\xb2\xe8\x23\x23\xf3\x03\xdc\xc6\xb6\x92\x47\xfa\x32\x3d\x98\xfd\x65\xdb\xdb\x9f\x3a\x22\xef\x6f\x90\x1d\x08\x63\x18\xd4\x7b\xb0\xab\x00\x84\xfd\x23\x8c\xa6\x9d\x44\xd7\xd9\x69\x4e\xe0\x12\x76\xd8\x4f\xe3\x65\x3b\x99\x1b\xd9\xf3\xfa\xc1\xd5\x64\xb8\x45\x4e\xe5\x07\x90\x6b\x05\xd6\xdf\x8b\x7b\x2c\x8c\xa5\x83\xd7\x41\x4d\xb5\x8f\x65\xda\xc6\x57\x2f\xbf\x0a\x66\xe7\x00\xef\x17\x80\x53\x0b\xda\x3e\x68\xb9\x49\xd3\xd8\x28\x46\xe7\x5c\xbb\xac\xff\x42\x9f\x5d\x9c\x23\xac\x7b\x02\xe6\x7b\xec\xf1\x9a\x58\x88\xb3\x93\xae\x59\x32\x05\x9e\xa9\x80\x7f\xd7\xe7\x52\x53\x9f\x42\xf1\xcd\x67\x8f\x14\xf8\xef\x8f" \
-"\x1f\xd2\xf9\x27\x19\x08\x08\xf2\x6f\x6f\xbc\x23\xbe\xfb\x11\x72\xa4\x31\x18\x71\x9f\x32\x73\x38\xbe\xb4\x5b\x7d\xed\x63\x74\xd3\x24\xd0\x73\x0c\x49\x3d\x63\x6e\x51\x40\x53\xa3\x83\x9a\xd3\x09\xa5\x0b\x1e\xb1\xb1\x2b\xf1\x07\x6c\xcb\xe0\x4b\x19\xf6\xa0\x21\x94\x20\x83\xb7\xbe\x00\xdb\x1c\xd0\xf2\x86\xae\x5b\x5c\x33\x24\xf0\x2b\x8b\x93\x65\xb7\x33\xd8\xf9\x2a\xa6\x34\x85\x73\xf9\x06\xf0\x17\x1b\x17\x4d\xb4\x28\xaf\xf0\xad\x68\x46\x89\x53\x52\xab\x9b\xd7\x88\x83\x04\xac\x13\x64\xff\x92\xa0\xc7\x80\xb1\x82\xa3\x38\x68\x6b\x66\x2c\xb2\xc4\xbb\x00\x26\x35\xe6\xbf\x94\xda\xcf\x69\x42\x6a\x67\x34\xf1\x77\xe9\x3f\x3f\xb6\x2d\x65\x3d\xd2\x59\xaf\x65\x62\x59\xac\xfc\xec\x24\x36\x8f\x83\x37\x23\xbd\x80\x39\x49\x22\xe5\xfa\xce\xfd\x2b\x25\x35\x88\xac\x49\xdd\x1b\xcd\xcf\x15\x78\x5c\x06\xdc\xa6\x42\x5f\x2d\xf1\xd1\x70\x48\x16\x1f\xdd\xe8\xdc\x9d\xf8\x4e\x69\xd6\xe6\x29\xc1\xd3\x2e\xf9\x1a\x0b\xf2\x2a\xe1\x74\xcf\xa6\x8d\x74\xb9\xdf\x56\xda\xbe\xff\xb9\xfa\xc7\xb5\x38\xbc\x84\x25\x1b\x55\xf8\x70\xa1\xb6\xa4\x99\x81\x28\x25" \
-"\x0d\x08\x43\xec\x24\xb6\x97\x82\x60\x83\x41\x1a\x67\xef\x41\xf3\xea\xa2\x07\x5a\xed\x18\x63\x91\x2f\xb5\x63\x41\x26\x24\x70\x9d\xef\xe1\x7f\xa1\xa8\x06\x42\xe7\xfc\x8e\x9a\xe1\x8a\xbd\xf3\x42\x8e\x47\x3d\xef\x37\xe6\x3b\x28\xe0\x86\x68\x64\xbd\xa6\xf9\x42\x5b\x92\x9a\x1c\x43\x4e\x8a\x28\x72\x47\xac\x03\xa8\xe9\x09\x6a\xe4\x8f\x38\xc1\xe3\xf3\x90\x33\xde\x5e\xe0\x2b\x4f\x95\xd4\xf5\x34\x44\xc8\x11\xeb\x2d\xa4\x93\x3e\x76\x34\xd8\xc3\x4e\x0d\x42\xbe\xbc\xf1\x8e\xea\xb6\x55\x30\x94\xd6\x7b\x39\xdf\xbc\xe5\x77\xa9\xb4\xc1\x46\xfa\xd7\xf9\x1d\x58\x7b\x58\xe2\xd2\xab\xaa\x20\x50\x55\x03\x1a\xdb\x6d\x61\x86\x0b\x60\x76\x47\x82\x56\xb6\x4d\x74\x89\xd6\x1c\x8c\xf2\xe3\xb2\xa7\xc8\xd6\xaf\x6b\x60\x84\x21\x28\x40\x5d\xce\x5a\x81\x84\xdd\xaa\xf2\x71\xeb\xfb\xac\xc1\x23\x3a\x55\x46\x09\x4b\x68\x47\xa1\x63\xd6\x06\x21\xcc\xfa\xac\xc7\x21\xb7\xf6\xfa\x6d\xfb\x32\x6a\x72\x10\x86\x96\x13\xdb\x15\x3c\x3f\xfb\xcc\x9d\x2d\x6a\xe9\x85\x9a\x91\x87\xc9\x4d\x3b\xb2\xb0\xd9\x6d\xec\x13\x13\xc8\x05\xa5\xeb\x51\x0e\x2a\x99\x28\xbd\x56" \
-"\x5c\x5a\xef\x4d\x35\x88\x41\x70\x5e\x82\x68\x47\x37\x4f\x16\xfa\x22\xb2\x0e\x5b\x18\x91\xfa\x04\xc5\x60\x48\x76\x8e\x1f\x53\x89\x0e\x39\x73\x24\xca\x90\x0a\x13\x7b\xb0\x17\x5d\x23\x5a\x91\x49\xa3\x7c\x42\x9c\x08\x52\xf3\x16\xcc\x3b\x4d\x31\xde\x01\xf6\x07\x4b\x0f\xea\x6e\x09\xe8\x1d\x9c\xef\xfa\x58\x18\xf4\x7b\x0f\xa9\x42\xb4\xfe\xd2\xe9\x86\x1b\x64\xa2\x67\x9e\xdf\x95\xe2\xa7\x8c\x35\x22\x39\x69\xdd\x70\x74\x48\xcf\xa9\x62\xc8\xbd\x21\x48\xb5\xa2\xa6\x04\x1d\x62\x9d\xb8\xf4\xbc\x7f\xba\x23\xba\xca\x18\x15\xb9\xa0\x3f\x11\x70\x4e\x60\x31\x57\x3c\x9a\xd7\x31\xc4\xb3\x7a\x3c\xfd\x9a\x56\xb1\xe3\x46\x01\x50\xcd\x3a\x42\x67\x92\xaa\x6c\x22\x86\x95\x86\xa0\xe1\x98\x3f\x12\xc7\x65\x9e\xc7\xeb\x7c\x62\x69\x08\x3e\x64\x5c\xf8\x51\x3b\x6c\xbe\x9c\xd8\x6a\x67\x5a\x45\xc7\xa0\x15\x42\xcb\x7d\x9d\xbd\x08\x73\x0f\x9e\x4d\x69\x7c\xab\xb4\xe3\x86\x32\xd0\xf5\xfe\x23\xe7\xd7\xe7\xc1\xda\xd8\x44\xcc\xe5\xe9\x5f\x78\xb1\x69\x6c\x5c\x09\xb5\x77\xc4\x13\x61\x05\x91\xfe\x70\x9c\x46\x09\x44\x27\x54\x21\x50\x02\x15\xe4\xb8\x91\xda" \
-"\x13\xca\xe7\x90\x03\x1d\x16\x0e\x92\xc1\x5a\xd8\x3f\x5f\xc5\x46\xc6\x44\xeb\x84\x10\x1f\x64\xb3\x13\x69\x13\xb2\xd2\xde\x76\x94\x25\xca\x32\xde\x54\xf6\x59\x24\x19\xb7\x50\xaf\x4f\x9a\x26\x77\x59\x7d\x85\x38\x15\x3d\xbb\x7b\x50\xe0\xbb\x0f\x54\x2e\x13\x01\x18\xf6\xfa\x20\xe2\xc1\x31\x76\xfc\x01\x2f\xac\xa1\xaf\x3c\x71\x38\xf8\xc6\x64\x75\x4e\x8a\x9a\x28\xe7\x76\x78\x17\xdf\x08\xef\x91\x33\x2b\x52\x92\x53\x81\x2b\x92\x4b\xab\x14\xba\x9d\xae\x89\xcd\xbb\xc6\x25\x0a\x6c\x41\x9a\xd4\xcf\x3f\xb2\x0b\x33\x05\x3e\xac\x7a\xdb\x93\x10\xdf\xf3\x86\x92\xa1\xad\x76\x71\xb9\xd4\xc7\x1d\x53\x05\xf1\x2a\x36\xa0\x39\x64\x74\x6f\xda\xc1\x27\x42\x43\x8d\xa1\xb3\x8d\x36\x57\x10\x2b\x0f\x5d\x29\xf0\x3e\x42\xe7\x3b\x2a\x30\x2e\xcf\x8d\x1b\xa0\x9c\xf7\x8a\x81\x82\x44\x22\x42\x45\xb1\x2d\x6c\x1a\x24\x32\x6d\x2e\xee\x52\xbb\xdb\xa6\xe1\x73\xcc\x79\xe4\x7a\x5c\x41\x43\x45\xa2\x68\x0a\x75\x11\x21\x71\x6e\x0a\x09\x02\x29\x18\xe3\xad\x31\x0a\x02\x93\x73\xc5\x5d\x85\x8b\x56\x26\x8a\x66\x5c\x11\x5e\x73\x4a\x65\x05\x0c\xde\xba\xe5\x10\x7e" \
-"\x10\xea\x69\xbf\xb8\xb6\x1b\x3b\x98\x76\xb3\x72\x4e\x41\x0f\x15\x2b\xd7\x07\xd7\x6e\xcf\x98\x80\x0e\x6a\xbc\x49\xe6\xb7\x17\x65\x5c\x5f\xfa\x73\xf5\x28\x3a\xa7\x9d\xc9\x01\xe5\xe9\x27\xf3\x67\xfd\x68\x87\xf8\xdb\x4a\x7f\x5b\x87\xe0\xf0\x2a\x06\x46\x46\x30\x17\x34\x4e\x0c\xd4\xcb\x37\x86\x6c\x6b\xb9\xed\x81\x78\xea\x36\xf3\xfc\xe7\x13\xbe\xbe\x2e\x30\x73\xc8\x91\x77\xc3\x8c\x7a\x15\x55\x78\xbd\x21\xd0\x3b\x27\xb5\x39\x37\x80\x90\x95\x78\x41\x4d\x71\x4b\xcb\xc2\xfb\xd9\x4d\x6e\x38\x36\x5d\xf0\x65\xdb\x34\xae\xa3\x99\xc1\x18\x10\x70\x67\xb2\xfc\x39\x02\x07\x37\xb8\x50\xb0\xf8\x80\xec\x49\xfa\x42\xda\x3f\x10\xe6\x95\x20\x95\xed\xc7\xa8\x51\x93\x3f\xd3\xfb\x70\xdf\x3e\x5c\x3c\x72\x9c\xcb\x0c\xe1\xe8\xfa\xa6\x7b\xc2\xe3\x38\x52\x04\x68\xa8\xaa\x26\x5d\x7a\xe8\xcf\xe4\x44\x3a\xf7\xa2\x60\x80\x14\xf9\x72\x5d\x25\xc7\xe5\x98\x86\xa8\x0e\xd4\x99\x89\x1f\xf1\xbd\xa3\xdf\xf7\xc4\x16\x43\x1b\x69\x0a\xeb\x1c\x18\xb1\xf9\xe6\x13\xf7\x91\xe4\x97\xc3\x11\xc9\x5d\xe2\xa7\x4c\xe3\x55\xcf\xc8\x8b\x25\x94\x28\xf3\xd6\x3c\x37\xf1" \
-"\xb7\x7e\xa0\x61\x06\x81\x68\xb6\xcf\xfa\x4d\x7b\xeb\xd3\x9e\xab\x34\xab\xba\x35\x79\x18\x89\x69\xa4\xf7\xac\x84\xc9\x1f\x87\x7b\x00\xa4\xa4\xeb\xa7\x67\x3f\x28\x36\x66\x2e\xc5\xb9\xc2\x0e\xc3\x9f\xb6\x78\x04\x24\x0e\xc2\xdb\x9b\x17\xe9\x94\xa9\x71\x9e\x5c\x67\x44\xf7\x85\xd6\xfc\x09\xdc\x32\xc6\xfb\x4b\x22\x0a\x73\xd1\xac\x93\xa8\xb9\x51\x46\xae\x9b\x50\x6f\xf6\x4e\xc7\x9b\xc0\x02\xf1\xa2\x7b\x7b\x4d\xe4\x65\x16\xf1\x59\xf5\x3f\x03\xeb\x4c\xa2\x14\x0c\x51\xe4\xfe\x32\x92\x4c\x95\x70\xe2\x58\xe7\xa7\xe5\x1b\xfa\x15\x62\x54\xeb\xfb\xd5\xee\xd1\x6f\x22\x90\xb5\xbe\x16\x3c\x70\xf4\x62\xf1\x13\x33\xa3\x04\xc6\x08\x32\xc2\xc8\xf1\x9b\xc0\x61\x5f\xad\x31\x5e\xa9\x70\x15\x57\x17\xe5\xe2\x4b\x3c\x86\x7e\x15\x0a\x56\x54\xee\x71\x13\x4d\xcd\x03\x9e\x69\xf1\x62\x56\xed\xe9\xbe\x61\x88\xca\xea\x93\x79\xfd\x9c\xb0\xee\xde\x47\x23\xb9\x7f\xd4\xd3\x00\x56\x81\x83\x5d\x6f\xa7\x79\x8a\x45\xfb\x04\x5a\xe5\x2b\x30\x90\x8a\x00\x30\xf9\xca\xcb\x2e\x75\xaf\x1b\x60\xe6\x77\x5d\x9c\x81\xba\x7a\x85\x72\xa0\xc4\x32\x51\x61\x3f\x0d\xbc" \
-"\x92\x3f\x04\xdc\xde\xa5\x09\xec\x7c\x75\x91\x5b\xf4\xba\xe9\x23\x4e\xf1\x2d\x26\x7f\xb3\xa5\x14\xfd\x83\xab\x29\xe6\x9e\xa2\x53\x32\x13\x17\x53\x80\x79\x43\xf8\x11\x91\x62\x70\xbe\xfa\xed\xf3\xf8\x40\x92\x29\x10\x2c\x9a\x21\x3c\xa2\xa1\x9c\xe5\xb0\xac\x31\x2a\xf0\xeb\x55\x5a\xa2\x97\xaa\xb7\x1b\x15\xb7\x28\x86\xbb\xc1\x4b\xb7\x4c\x3f\xeb\x1b\x5a\x85\x1a\x8a\x53\x96\x4d\xce\xe9\xa6\xcc\x5a\x7d\xd3\x85\xe5\x0a\xa6\x0c\x92\xb8\x98\x6b\xf2\xf5\x34\x91\x9a\x22\xf9\x0d\x66\xfd\xd1\x14\x03\xe1\x58\x9c\x89\x1e\xb6\xce\xd3\xff\x95\x27\x40\x85\x10\x7d\x05\x73\xdc\x33\x7a\xf2\x79\xde\xd4\xef\xed\xd0\x1f\x48\x62\x24\x83\xb9\x09\x7c\x0e\x37\xec\xc4\x26\x44\x52\x11\xc5\xff\xa8\xc7\x9e\x5e\x34\x3a\x7e\x64\x39\x76\xb8\xd6\x2a\x41\xf9\x9c\x80\x52\x8b\xea\x3f\x77\x37\x59\x6c\xcf\xd1\xe2\x22\xc6\x86\x36\x83\x9a\x57\x60\x1f\x0b\xf1\x01\x0b\x61\x3d\xa7\x14\xdf\xbc\xa3\x1f\xfa\xbd\x0d\x1d\xc4\xd1\xda\x77\x66\x0d\xac\x95\x95\xdb\xfb\x40\xee\xd3\xd4\x88\x52\xed\x96\x8c\xbc\xc9\x7b\xbf\x53\x85\xc1\xfd\x19\x1b\xf6\x48\x3c\xd4\xe3\xf1" \
-"\xd1\xce\x8e\x1d\x0b\x0b\x92\xb6\xcb\xd6\x19\xc0\xec\xc5\xb0\x06\xd8\x69\x91\xbf\x73\xa1\x6b\xaa\xc2\x79\x94\xcd\x41\x74\x9d\x60\xad\xd9\x1e\x60\xae\xef\xb2\x97\x79\x2e\x03\x56\x41\x20\x78\xc3\x42\x56\x90\xce\x5b\x24\x94\x2a\xd8\xd0\xa4\xcb\x95\x45\xe6\x31\x4e\xe0\xb1\x17\xaf\x67\xbf\x6f\xb5\x82\xff\xd7\xbd\xad\x86\xbd\x40\x24\xe2\x86\x59\x74\x8a\x5c\x51\xf6\xca\x0a\xf3\x15\x51\xa5\xd2\xeb\x31\x63\xd9\x13\xb8\x36\x47\x66\x84\x31\x87\xe4\x9c\x43\xaa\x26\xad\xc8\xef\xf4\xff\x41\xd3\x64\xa1\x76\x6f\xda\xdb\x57\x17\x39\x09\xf6\x66\xfc\x9d\xcd\x62\x0c\x61\xc6\xb7\x8d\xdf\x9a\x17\xb4\x7b\x50\x9c\x90\xe7\x5f\x2a\x87\x1f\xf4\xa4\x79\x8a\x74\x9a\xcf\xde\x8a\x20\x54\xb9\x38\x72\x09\xf4\x0b\xd5\xed\xa6\x5b\x1f\xd9\x14\xb3\xa8\x79\x8b\xed\xb5\xdd\x5a\xae\x02\xb0\x22\xd2\x82\xf1\x82\xf0\xb2\x59\xb0\x82\xb9\xf3\x34\x65\x74\x70\x06\x3c\x54\x06\x6e\x1d\xf6\x42\x0a\xa4\x82\x2e\x4b\xa3\xb3\x2d\xfa\x20\x39\x30\x4a\xa9\x85\x2c\xa7\xf1\x67\x1f\x77\xf3\x4a\xd0\x04\xa2\x11\x0b\x48\x7e\x0a\x51\x75\xbc\x67\xde\xa3\x4e\xce\x48\xd8\x49" \
-"\x02\xdd\xe6\x7a\x6b\x8d\x7e\x01\xec\x3f\x33\xa9\xa0\x0e\xa5\xd0\xae\x09\x5b\x4a\xfc\x92\xc6\x4f\xee\xaf\x27\x66\x4b\x96\x28\x6d\x8f\x75\x4d\x99\xea\x52\x26\xa2\x17\xf2\x6b\x7c\xd9\x0d\x33\x37\x5c\x01\x1c\x8a\x3e\xd1\x45\xde\x3f\x3e\x96\xdd\x4a\xe8\xdc\xb5\x15\x24\xcb\xb6\xc1\xb7\xad\x71\x9d\xf1\xd0\x83\xac\x00\xb0\x37\xe5\x3f\x36\x54\xc5\x69\xc4\x9a\x3c\x34\x32\xbf\xe6\xca\x81\x55\xeb\x4b\xf5\xac\x3a\xe6\x00\xfb\xfa\x68\x7b\xf7\xe0\x78\x76\x1e\x32\xdf\x90\xe9\xf3\xd5\x3a\xe4\x7c\x18\xa8\xc2\x18\xc0\x04\x3f\x6b\x27\x37\xca\xc4\xfe\x95\x8d\xbd\x88\xda\x6c\xcb\x64\xc6\x79\xf0\xfc\xd0\xc8\xe6\xb2\x75\xc7\x02\x37\xa5\xd6\xd2\xf6\x8e\xb2\x3f\x56\xf9\x9c\x64\xac\xca\xc5\x94\xde\x4c\xb9\xdd\xf8\x47\x07\xe7\xe0\x9e\xec\x1b\x2c\x35\x3a\xb5\x41\xb0\x92\xdf\xfe\x05\xf9\xcf\xda\xa0\xd4\xf5\x0e\x72\xf6\x99\x8b\x37\xe6\x59\x8f\x7d\x85\x67\xf9\x7b\x5b\xe5\xc3\xd6\x41\xfb\xdb\x0b\x30\xa7\x48\x09\x83\x6e\xcf\xf4\xc5\x9f\x17\x33\xa1\x87\xfb\xdc\x34\xf2\x7a\xc7\x15\xe7\x22\xb9\x54\x8c\x70\x03\xa4\xe7\x40\xa2\xc0\x67\xb6\xa2\x70" \
-"\x02\x8e\x16\x94\x3e\x47\x4f\xe8\x55\x26\x0f\x57\xe6\xe8\x70\xcb\x5e\xe6\xac\xe9\xdb\x9e\xf6\x57\x3d\x9b\x16\x0e\x9d\x17\x3d\x63\xc4\x61\x46\xd8\xad\xec\xd3\x78\xc5\x1c\xe7\x2f\xd7\x42\x47\x2e\x42\x1c\x1d\xdf\x4d\xad\x90\x52\xdc\xde\x63\xe5\x4a\x35\x58\x74\x7b\xa2\xf0\xa8\xd8\x8e\xcd\x90\xb7\x7f\x87\x04\xa2\x5b\xb0\x4e\x1a\xb2\xf9\x68\xc3\x4c\x69\xce\x8f\x14\x9e\xdc\x16\x43\xc9\xed\x4e\xf1\x38\x6f\x3f\xa0\xf0\xa8\x83\xfd\x3e\x08\x33\x58\x2b\xae\xd9\xeb\xf3\x47\x32\xd2\x07\xeb\x38\x3f\x80\x6f\x20\xf4\xbb\xd9\xaa\x4d\x98\x41\x07\xc8\x1e\x2f\x53\x7e\x8b\xaa\x8e\xdb\xb8\x9c\x36\x66\xf9\x5e\x20\x02\xcc\xce\x4d\xe6\x3c\xb8\x8f\xa7\x6e\xf1\xcb\x3c\x2c\xae\x80\x96\xba\xd7\xda\xbd\x57\x6b\xd8\x54\x4c\xa6\xab\x5b\x17\x10\xd0\xd3\xb5\xea\x3d\xcb\xe0\xac\x80\x81\x42\x07\xf9\x00\x4b\x9d\xeb\x31\xf4\x9a\x9d\x6b\xcd\x46\x92\x26\xbc\x06\xda\x85\xe7\xcc\xa8\xea\x85\x11\xf5\x55\xfd\xa3\xf2\xa8\x38\x09\x63\x8e\xec\xed\x43\x14\xe2\x3c\x04\x56\x53\xd0\xf3\x13\x7f\xa8\x06\x9c\x43\xb3\x42\xaa\xf2\xd3\xaa\xc7\xbc\x47\xe7\xbf\x43\x2a" \
-"\x6d\x25\x75\x9a\xe7\x74\x3f\xe8\xce\x6b\x8d\x11\x7f\x8f\x4f\xf7\xa0\x3e\x97\xea\x74\x7e\x0e\xdf\x08\x05\x34\x52\x08\x63\x11\x09\x07\x04\xd0\x6a\x0b\xd0\x9c\x9d\x55\x33\xec\x80\x29\x42\x63\xf3\xdc\x99\x83\x6f\x4e\xbd\x5f\xdb\x33\x64\x29\x96\xbc\xda\x23\x25\xb0\x1f\x7a\xfc\xcf\xde\xd6\x8e\x5f\x13\x88\x9f\xc3\xd1\x27\xb6\x13\x61\xb9\x48\x53\xa5\xd0\xf9\x53\x04\xf4\xe6\x1e\x07\x0d\xa1\x5a\xc8\x79\x8a\x43\x97\xfc\xc5\xa5\x2c\xd7\x09\x51\x76\xb3\x9f\x0f\x03\x9c\x69\x97\x68\x6d\xa1\xca\x8f\xc7\x29\xbb\xac\x9a\x40\x69\x45\x43\xad\xe2\x22\xea\x6f\x45\xf4\x2d\xe6\x31\x0b\x12\x9e\x38\xb8\x37\x7c\x2e\xfc\xd7\x6d\xec\x7c\x9c\xac\x94\x9f\x2c\x93\x81\x32\x31\xe6\x80\xd5\x89\xa1\x7d\x8c\xde\x24\x5a\x75\xdf\x92\xed\x7a\x27\x76\xbc\x5d\x0b\x28\x31\x72\xe6\x50\x1f\xdd\x3a\xc7\xae\xc0\x70\x1f\xec\x62\x38\x4c\x1b\xc7\x4e\x1c\x30\x3e\xf6\xcf\x1e\x55\x32\x1f\x04\x8f\x3a\xf1\x83\x53\xcb\x46\xf1\x7c\x96\xa0\x58\x1e\xe3\xb1\xd5\x4b\x8b\x7a\x53\x53\x29\x61\x8c\x4e\x9d\xbc\xac\x55\x34\xca\x4c\x2f\x91\x4c\x7e\x90\xe4\x31\xef\x67\xc4\x95" \
-"\xcb\x85\x9f\xc9\xd7\xf1\x47\xf5\x72\x31\x7d\xe4\x16\xc0\xeb\xe6\xf6\xf7\x64\x6e\x4c\x4a\xd6\xe2\xdd\x78\x8c\xfa\x6c\x09\xcb\x28\x5c\x13\xb8\x88\x56\x4c\xfa\xb1\x40\x4c\xd6\x4f\xbe\x56\x08\x83\xb2\x00\xc8\xab\xf5\x90\x5e\x02\xec\x0b\xbb\x77\xa5\x53\x82\xfc\x31\x7e\xfe\x83\x26\x2b\xf5\xaa\x35\x07\xb7\xcd\x54\x47\x10\x7f\x56\xf9\x1f\xa9\x41\x21\xcf\x92\x6f\x9b\x2b\x91\x55\xfa\xd8\x26\x5f\x12\x81\xba\x0e\x03\x9e\x2b\xb7\x2c\xcd\x5a\x25\x8d\x1b\x82\x73\x04\x79\x43\x71\x2b\x6d\xfb\x47\x67\x20\x81\xa3\x49\x74\xfc\x20\x95\x11\x96\x75\xa8\xda\x38\xa3\xad\x7d\x54\x67\x88\xc3\x59\x2e\x1b\x2d\x99\x06\xb8\x51\x5d\x83\x1c\x2a\xab\x57\xb1\x87\x6d\x18\x4e\x50\x67\x6e\xa8\x03\xfb\xa5\x8b\xab\x19\x4d\xa6\xfa\xc1\xa6\xa8\xc3\xa0\x0c\x19\x6e\x24\x00\x84\xf7\xc7\xc3\x1e\xb1\x0e\xb0\xc5\x3a\x8e\x5d\x2b\x97\x7e\x1c\xb8\xe7\xb3\x71\xe3\x1a\xa5\x62\xb4\xb7\xda\xb6\x96\x7d\xe7\x66\xe7\xce\x27\x39\x79\xc1\x2b\x0b\xfe\xad\x1d\xfb\x2d\xab\x6a\x57\x72\x26\x3a\x99\x48\x54\xc1\x24\x02\x8e\xd7\x79\x93\xa0\x0b\x25\xf3\xd5\xd9\xb5\x98\x70\xbf" \
-"\x9b\xd9\x88\x75\xaf\xb6\x7d\x86\xda\x3a\xd4\xef\x27\xfa\x77\xdc\x71\xd6\x8f\xcc\x7c\x0b\x99\xc8\x9e\xd7\xfd\x28\x23\x11\xe8\x2d\xd9\x2f\xbf\x9f\xc7\x52\x29\x6a\x9e\xf4\xde\xfe\x85\x6d\x97\x2b\xbb\xcb\xa5\x3d\xa3\xcd\x07\xd9\x0c\xfc\x7b\x5a\xff\xff\x58\xdd\x7a\x4c\xad\xb9\x55\xb9\x21\xe4\xe2\xa1\x48\xd9\x22\xc5\x8c\xbe\x12\x07\x8e\xb1\xcb\x31\x5d\x5b\x0c\x0c\x1d\x23\x64\x88\x3a\x16\xae\x31\x47\xd1\xda\xc7\x7d\x33\x6e\x75\x2d\xcd\x8d\x51\xc0\x94\xd3\xee\xda\x54\xe3\xbf\xa0\x31\x6e\xcf\xbe\x08\x9c\xb8\xa7\x94\xe4\x45\x13\x27\x03\xd2\xcc\xc4\xe6\x7b\x40\x7b\x85\x73\x21\x55\x0f\x2d\x90\xda\x1f\xc0\x22\x3c\xd0\xa6\x71\x97\x7a\xf9\xab\xcf\x08\xa4\xcf\x8a\xf6\xd9\xfb\x22\x1b\x91\x90\x39\x3c\xa5\xcb\x75\xc7\x50\x8d\xda\x24\x41\x18\x73\x21\x98\x8b\x98\x22\x48\x63\xc0\xdb\x31\x41\xbb\xd9\x0e\xd0\x38\x3e\x8f\x0c\x33\xe1\xbb\x26\x13\x72\x53\x76\x75\x11\xf9\xe0\xb9\xe1\xed\x47\x4f\x43\x4b\x33\x00\x5c\x7b\x9b\x7a\x9a\x69\x65\xeb\x11\xa0\x23\x98\x6c\x2d\x97\x9a\x5c\x95\x3f\xff\x4d\x99\x68\x62\xd0\xfb\x70\xbd\x26\x66\xcd\x75" \
-"\xff\xe8\x96\x6d\x33\x46\x05\x0b\xe0\x29\x8d\xc8\xe3\xaa\x01\xdc\x22\x67\x70\xb9\xa9\xcf\x8d\xb7\xac\x3d\x81\x71\x7e\xc8\x3b\xc5\x5d\xf5\xf0\x3a\xe8\x28\x5a\x7d\x25\x86\xd2\x52\x76\xea\xc8\x73\xa9\x7c\xbc\x01\xac\xec\x1f\x4f\xd3\xd5\x92\xc3\xce\x69\x39\xf1\x3b\xed\x91\x20\x06\x18\xfd\x17\x3c\xd3\x02\x5e\x2a\xbe\xb4\xd5\xb1\x17\xa7\x68\x03\xe2\xab\xd0\x5f\x60\x39\x35\x8d\x73\x58\xae\x0a\xce\xea\x96\xb6\x9d\xf2\x5d\x61\x50\x09\x9a\x98\xa6\x5e\x8d\xee\xd4\x44\xe7\xf4\x00\x24\xa7\x02\x09\xa9\x10\x97\xaa\x21\x33\x01\x69\xd2\xc2\xe0\x92\xdd\xe3\x89\x3f\x90\x0e\x05\x8c\x1e\xc1\xcb\x2f\x5a\x14\xe9\xa9\x42\xc0\x5b\xfc\xa1\x8c\x43\xca\x0c\x18\xbe\xf2\x2e\xd0\x79\x08\xc2\xa4\xa4\x7d\xd8\xc2\xf2\x7d\x83\x23\x05\x2d\x12\x98\x9d\xf0\x23\x38\xf6\x90\xaf\x02\x07\x7b\x0d\x9e\xa8\x73\xdd\xc3\x36\xec\x23\x84\xf6\x07\x64\x6c\x78\x11\x17\xd2\x3d\xee\x26\x49\x95\x1c\xf9\x1d\x05\xe8\x1c\x83\x54\x4f\x9b\x1a\x52\x60\x96\xdb\x7a\xa7\xe7\x38\xe9\xb0\x9a\xd5\x7e\x0e\x9b\x0d\x44\x9d\x19\xec\xf4\x40\x7d\x4a\xf7\xf1\x7b\xb1\x66\x2b\xf4\x7a" \
-"\xad\x4b\x84\xf4\xf8\xec\xf6\xa1\x8a\x44\x56\x02\x34\x79\xe8\x60\x64\xcf\xee\xdb\x40\xc5\xa2\x08\x61\x90\x59\x79\x42\x92\xa6\xe9\x07\x91\xd9\xdf\x33\xfe\x80\x01\xd3\x01\x00\x00\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30" \
-"\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x0a\x63\x6c\x65\x61\x72\x74\x6f\x6d\x61\x72\x6b\x0a\x80" \
-"\x03"};
+char datatoc_Bfont[25181]= {128, 1, 228, 1, 0, 0, 37, 33, 80, 83, 45, 65, 100, 111, 98, 101, 70, 111, 110, 116, 45, 49, 46, 48, 58, 32, 66, 102, 111, 110, 116, 32, 48, 48, 49, 46, 48, 48, 49, 10, 49, 49, 32, 100, 105, 99, 116, 32, 98, 101, 103, 105, 110, 10, 47, 70, 111, 110, 116, 73, 110, 102, 111, 32, 49, 48, 32, 100, 105, 99, 116, 32, 100, 117, 112, 32, 98, 101, 103, 105, 110, 10, 47, 118, 101, 114, 115, 105, 111, 110, 32, 40, 48, 48, 49, 46, 48, 48, 49, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 117, 108, 108, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 97, 109, 105, 108, 121, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 87, 101, 105, 103, 104, 116, 32, 40, 82, 101, 103, 117, 108, 97, 114, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 73, 116, 97, 108, 105, 99, 65, 110, 103, 108, 101, 32, 48, 32, 100, 101, 102, 10, 47, 105, 115, 70, 105, 120, 101, 100, 80, 105, 116, 99, 104, 32, 102, 97, 108, 115, 101, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 80, 111, 115, 105, 116, 105, 111, 110, 32, 45, 49, 48, 48, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 84, 104, 105, 99, 107, 110, 101, 115, 115, 32, 53, 48, 32, 100, 101, 102, 10, 101, 110, 100, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 78, 97, 109, 101, 32, 47, 66, 102, 111, 110, 116, 32, 100, 101, 102, 10, 47, 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 97, 110, 100, 97, 114, 100, 69, 110, 99, 111, 100, 105, 110, 103, 32, 100, 101, 102, 10, 47, 80, 97, 105, 110, 116, 84, 121, 112, 101, 32, 48, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 84, 121, 112, 101, 32, 49, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 77, 97, 116, 114, 105, 120, 32, 91, 48, 46, 48, 48, 49, 32, 48, 32, 48, 32, 48, 46, 48, 48, 49, 32, 48, 32, 48, 93, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 99, 117, 114, 114, 101, 110, 116, 100, 105, 99, 116, 32, 101, 110, 100, 10, 99, 117, 114, 114, 101, 110, 116, 102, 105, 108, 101, 32, 101, 101, 120, 101, 99, 10, 128, 2, 146, 94, 0, 0, 217, 214, 111, 99, 59, 132, 106, 152, 155, 153, 116, 176, 23, 159, 198, 204, 68, 91, 194, 192, 49, 3, 198, 133, 112, 167, 179, 84, 164, 162, 128, 174, 111, 191, 127, 152, 247, 90, 132, 186, 206, 45, 3, 106, 107, 81, 184, 72, 73, 49, 89, 29, 146, 229, 6, 158, 98, 38, 213, 173, 204, 93, 228, 248, 16, 122, 166, 154, 53, 181, 95, 106, 155, 75, 79, 147, 197, 108, 35, 188, 198, 29, 215, 191, 143, 50, 242, 29, 88, 228, 26, 95, 121, 12, 238, 47, 2, 175, 73, 134, 149, 233, 12, 29, 11, 210, 89, 231, 91, 2, 25, 48, 11, 15, 105, 44, 51, 119, 156, 42, 166, 122, 232, 81, 122, 190, 18, 48, 8, 69, 34, 74, 246, 173, 93, 169, 219, 154, 26, 58, 64, 251, 6, 179, 106, 156, 205, 105, 18, 85, 7, 252, 45, 233, 208, 65, 132, 199, 96, 66, 240, 63, 207, 209, 83, 132, 0, 35, 151, 42, 129, 42, 185, 179, 203, 86, 112, 193, 206, 39, 89, 113, 28, 117, 41, 66, 98, 214, 242, 145, 175, 155, 124, 118, 7, 30, 218, 126, 122, 208, 38, 33, 98, 50, 34, 185, 54, 8, 122, 178, 127, 254, 95, 7, 134, 71, 6, 101, 146, 24, 61, 195, 71, 174, 146, 230, 191, 86, 177, 123, 237, 206, 19, 104, 70, 246, 162, 163, 118, 171, 140, 11, 192, 255, 78, 52, 125, 32, 253, 14, 199, 126, 250, 177, 240, 99, 49, 0, 20, 141, 42, 125, 47, 210, 31, 18, 90, 170, 205, 143, 219, 153, 121, 131, 43, 103, 13, 138, 170, 118, 210, 18, 186, 181, 97, 70, 25, 144, 150, 12, 53, 110, 184, 216, 233, 243, 198, 93, 157, 254, 127, 140, 44, 138, 123, 43, 233, 158, 99, 255, 108, 134, 136, 60, 29, 229, 7, 141, 163, 185, 30, 3, 228, 132, 13, 221, 109, 48, 227, 60, 227, 135, 117, 220, 128, 67, 195, 147, 32, 118, 71, 190, 131, 11, 245, 200, 93, 30, 226, 32, 114, 26, 39, 232, 138, 33, 109, 232, 1, 11, 233, 212, 78, 221, 88, 158, 135, 95, 159, 14, 38, 31, 12, 106, 255, 51, 147, 42, 139, 254, 210, 119, 6, 96, 221, 226, 140, 183, 213, 222, 5, 205, 13, 140, 253, 214, 125, 103, 227, 52, 60, 102, 31, 250, 163, 147, 228, 167, 58, 207, 156, 68, 166, 150, 167, 169, 116, 83, 194, 150, 104, 152, 31, 7, 157, 38, 76, 29, 10, 247, 63, 57, 194, 106, 230, 183, 120, 135, 187, 201, 211, 82, 234, 168, 182, 167, 90, 56, 37, 109, 160, 144, 13, 48, 204, 190, 14, 169, 103, 127, 136, 102, 24, 81, 61, 32, 233, 228, 158, 18, 235, 189, 28, 0, 222, 67, 17, 110, 143, 71, 223, 181, 33, 17, 66, 81, 210, 7, 23, 186, 245, 229, 198, 143, 62, 113, 33, 80, 236, 87, 148, 65, 42, 27, 111, 128, 223, 196, 140, 45, 32, 91, 123, 158, 136, 153, 166, 144, 126, 115, 133, 220, 254, 234, 192, 123, 14, 239, 75, 199, 116, 28, 241, 25, 30, 66, 226, 248, 159, 142, 46, 41, 10, 237, 111, 205, 31, 230, 72, 196, 49, 200, 50, 29, 115, 153, 141, 198, 225, 218, 157, 86, 56, 67, 249, 99, 50, 25, 151, 14, 200, 35, 186, 250, 204, 151, 187, 209, 51, 129, 161, 68, 118, 130, 31, 25, 134, 255, 75, 170, 240, 225, 113, 144, 5, 178, 133, 45, 85, 242, 66, 10, 10, 65, 138, 93, 147, 72, 210, 250, 209, 123, 148, 135, 12, 156, 94, 13, 250, 31, 211, 157, 82, 128, 132, 143, 11, 155, 47, 211, 151, 232, 142, 253, 82, 104, 234, 231, 190, 169, 78, 32, 90, 2, 41, 201, 122, 142, 205, 144, 234, 204, 198, 227, 56, 57, 6, 63, 8, 237, 89, 199, 30, 226, 169, 48, 198, 191, 38, 114, 87, 135, 189, 98, 251, 224, 210, 154, 58, 87, 26, 56, 41, 219, 119, 124, 109, 83, 182, 169, 166, 123, 255, 190, 35, 121, 177, 37, 92, 128, 242, 247, 132, 218, 149, 140, 116, 184, 163, 13, 248, 138, 68, 124, 229, 211, 89, 210, 101, 172, 149, 221, 182, 113, 36, 182, 46, 5, 141, 127, 147, 54, 118, 67, 107, 105, 187, 40, 53, 208, 170, 25, 45, 113, 216, 110, 135, 56, 7, 26, 14, 225, 61, 79, 228, 72, 30, 39, 220, 195, 227, 229, 153, 196, 28, 6, 107, 240, 54, 67, 6, 94, 143, 0, 34, 180, 49, 14, 41, 111, 9, 41, 94, 203, 184, 139, 142, 34, 140, 138, 90, 25, 216, 89, 252, 45, 46, 132, 169, 154, 230, 131, 15, 20, 100, 99, 235, 106, 73, 185, 89, 6, 66, 230, 171, 202, 22, 213, 227, 183, 32, 138, 116, 253, 208, 230, 121, 16, 63, 238, 132, 69, 28, 135, 88, 115, 18, 21, 11, 102, 172, 200, 37, 222, 255, 100, 221, 80, 173, 218, 53, 210, 250, 148, 211, 241, 97, 150, 185, 43, 250, 138, 14, 122, 133, 30, 191, 54, 158, 118, 22, 12, 232, 25, 228, 60, 101, 206, 119, 29, 57, 12, 99, 36, 167, 182, 153, 86, 195, 21, 70, 154, 102, 106, 45, 236, 70, 151, 143, 185, 207, 252, 106, 46, 168, 80, 216, 206, 157, 171, 118, 77, 82, 153, 24, 54, 165, 128, 160, 27, 195, 117, 241, 141, 93, 151, 233, 239, 244, 73, 123, 133, 42, 138, 123, 68, 159, 225, 209, 171, 242, 70, 212, 6, 168, 19, 116, 228, 0, 14, 148, 191, 132, 10, 254, 83, 125, 20, 17, 71, 126, 142, 56, 80, 55, 48, 125, 184, 172, 156, 163, 161, 72, 249, 105, 204, 207, 179, 217, 115, 177, 2, 82, 220, 142, 14, 180, 138, 254, 83, 139, 36, 70, 203, 91, 81, 82, 229, 20, 253, 78, 132, 213, 64, 154, 163, 59, 93, 245, 168, 38, 148, 48, 228, 13, 186, 204, 95, 140, 184, 118, 22, 130, 111, 27, 38, 139, 127, 106, 172, 161, 254, 136, 187, 166, 48, 162, 152, 124, 69, 27, 186, 50, 126, 7, 144, 43, 75, 176, 145, 159, 202, 244, 7, 78, 203, 250, 32, 42, 195, 71, 186, 90, 92, 162, 126, 98, 44, 195, 163, 47, 88, 124, 43, 177, 122, 251, 254, 29, 161, 70, 98, 235, 133, 52, 12, 28, 184, 67, 145, 73, 88, 99, 69, 60, 227, 142, 15, 218, 82, 167, 57, 225, 230, 218, 131, 251, 171, 11, 63, 191, 65, 236, 178, 63, 159, 213, 211, 114, 64, 200, 85, 73, 40, 94, 123, 108, 171, 89, 169, 206, 99, 196, 31, 15, 152, 138, 77, 137, 210, 197, 228, 255, 73, 126, 120, 249, 214, 170, 212, 168, 73, 54, 125, 113, 78, 226, 37, 137, 249, 188, 239, 33, 231, 244, 125, 116, 137, 126, 187, 31, 193, 194, 118, 121, 19, 80, 250, 87, 48, 80, 62, 246, 29, 121, 247, 135, 198, 193, 253, 148, 211, 17, 210, 17, 247, 44, 205, 91, 1, 190, 195, 236, 66, 95, 144, 58, 235, 2, 42, 79, 25, 82, 164, 167, 244, 114, 188, 192, 101, 23, 55, 69, 141, 168, 28, 89, 60, 116, 91, 162, 121, 28, 123, 96, 252, 165, 180, 69, 56, 232, 54, 122, 138, 223, 158, 131, 94, 171, 82, 4, 112, 13, 160, 117, 170, 146, 28, 241, 154, 211, 119, 16, 233, 141, 96, 94, 167, 13, 37, 118, 105, 73, 211, 97, 109, 148, 131, 190, 119, 45, 124, 208, 225, 39, 94, 48, 62, 33, 188, 248, 154, 233, 46, 158, 7, 144, 1, 121, 0, 235, 71, 25, 52, 13, 46, 1, 25, 171, 27, 179, 170, 164, 231, 2, 25, 182, 226, 250, 96, 192, 23, 185, 218, 218, 16, 140, 36, 180, 216, 59, 95, 49, 165, 162, 134, 252, 47, 168, 65, 242, 178, 211, 62, 10, 239, 153, 65, 219, 247, 72, 17, 105, 49, 254, 85, 136, 211, 117, 240, 218, 77, 221, 166, 41, 145, 198, 4, 104, 136, 241, 48, 0, 158, 210, 236, 207, 26, 145, 140, 95, 164, 117, 198, 0, 183, 104, 161, 59, 9, 189, 8, 32, 44, 26, 255, 157, 119, 245, 250, 49, 176, 156, 227, 102, 228, 105, 83, 24, 153, 85, 196, 129, 133, 128, 208, 129, 202, 62, 204, 173, 137, 91, 223, 112, 208, 243, 87, 180, 109, 82, 141, 56, 239, 210, 40, 86, 200, 173, 31, 32, 230, 140, 202, 61, 220, 176, 92, 108, 207, 177, 213, 169, 238, 172, 158, 254, 38, 242, 141, 6, 115, 217, 193, 134, 166, 227, 36, 208, 119, 86, 44, 34, 195, 71, 119, 94, 234, 241, 122, 79, 169, 173, 36, 221, 120, 68, 23, 3, 44, 125, 38, 78, 72, 230, 25, 62, 18, 205, 206, 66, 140, 79, 125, 229, 223, 0, 92, 25, 118, 253, 161, 219, 51, 228, 229, 212, 13, 155, 26, 50, 54, 105, 54, 38, 85, 152, 49, 150, 233, 88, 191, 111, 0, 122, 147, 95, 215, 50, 33, 176, 209, 77, 136, 198, 6, 71, 97, 100, 152, 0, 159, 94, 91, 202, 7, 148, 125, 254, 58, 38, 107, 49, 101, 14, 194, 163, 12, 79, 253, 153, 150, 54, 30, 37, 140, 189, 241, 141, 47, 57, 139, 145, 74, 88, 15, 178, 179, 63, 241, 91, 129, 30, 79, 19, 104, 72, 56, 215, 37, 124, 242, 77, 81, 109, 155, 0, 233, 122, 186, 107, 91, 145, 92, 162, 90, 4, 113, 170, 84, 211, 132, 142, 64, 27, 93, 152, 248, 107, 94, 93, 160, 109, 249, 241, 251, 102, 130, 66, 96, 51, 112, 140, 245, 151, 65, 45, 189, 157, 117, 188, 91, 97, 49, 138, 107, 106, 135, 204, 203, 38, 119, 33, 149, 87, 122, 158, 198, 8, 142, 218, 3, 56, 249, 80, 86, 253, 82, 246, 203, 231, 57, 160, 50, 52, 187, 24, 108, 130, 253, 193, 24, 51, 201, 50, 3, 67, 176, 187, 124, 165, 172, 142, 252, 156, 155, 220, 252, 51, 237, 105, 94, 48, 44, 233, 187, 188, 123, 100, 218, 223, 36, 114, 54, 219, 223, 39, 156, 112, 206, 46, 19, 10, 213, 139, 69, 12, 138, 134, 44, 130, 94, 136, 4, 111, 77, 21, 115, 225, 162, 15, 38, 159, 218, 138, 102, 171, 2, 142, 48, 158, 57, 94, 59, 182, 17, 127, 190, 223, 196, 66, 238, 107, 50, 154, 2, 142, 167, 152, 18, 25, 226, 1, 253, 251, 17, 102, 20, 111, 28, 97, 136, 15, 60, 65, 230, 39, 49, 25, 166, 31, 18, 54, 4, 24, 89, 211, 226, 250, 74, 226, 185, 67, 138, 29, 18, 85, 156, 124, 145, 84, 17, 175, 167, 51, 13, 54, 82, 97, 64, 206, 201, 111, 199, 214, 210, 235, 148, 55, 181, 241, 136, 86, 254, 219, 122, 64, 103, 179, 79, 113, 163, 126, 75, 107, 79, 102, 244, 21, 147, 198, 210, 251, 35, 136, 73, 15, 32, 45, 150, 134, 253, 113, 83, 111, 161, 110, 212, 242, 33, 12, 12, 16, 143, 194, 199, 37, 228, 251, 110, 7, 213, 198, 55, 80, 32, 209, 140, 34, 47, 102, 249, 217, 166, 118, 31, 106, 2, 18, 106, 46, 146, 148, 125, 0, 208, 89, 209, 247, 55, 143, 177, 19, 183, 127, 71, 118, 20, 136, 3, 233, 109, 119, 181, 115, 223, 110, 139, 182, 171, 109, 104, 72, 62, 152, 143, 14, 157, 82, 154, 253, 142, 215, 59, 1, 11, 98, 107, 140, 12, 240, 144, 56, 38, 14, 220, 237, 154, 174, 151, 179, 207, 104, 234, 222, 84, 126, 157, 90, 52, 118, 126, 96, 23, 203, 135, 134, 41, 16, 196, 210, 44, 125, 68, 145, 232, 236, 52, 222, 102, 131, 80, 101, 237, 218, 244, 215, 205, 95, 58, 96, 18, 66, 213, 91, 247, 58, 44, 57, 150, 193, 139, 135, 36, 143, 236, 94, 209, 236, 213, 227, 42, 176, 173, 206, 87, 151, 240, 145, 185, 45, 209, 177, 201, 123, 32, 196, 44, 158, 83, 203, 202, 6, 106, 54, 93, 43, 209, 12, 114, 76, 100, 242, 104, 165, 138, 15, 143, 5, 33, 228, 195, 243, 111, 81, 249, 174, 15, 167, 40, 165, 51, 97, 185, 215, 150, 118, 253, 22, 103, 9, 21, 185, 238, 189, 94, 49, 104, 100, 98, 165, 196, 31, 148, 112, 125, 199, 46, 103, 252, 79, 100, 165, 112, 104, 82, 249, 219, 205, 34, 198, 31, 198, 191, 181, 72, 212, 182, 62, 87, 13, 53, 171, 84, 222, 156, 131, 201, 162, 173, 47, 44, 187, 105, 119, 132, 47, 228, 184, 36, 85, 218, 11, 251, 242, 124, 205, 168, 252, 24, 245, 49, 84, 161, 107, 211, 21, 63, 219, 89, 15, 116, 192, 18, 208, 86, 95, 75, 71, 239, 247, 105, 124, 85, 174, 144, 220, 24, 188, 94, 40, 209, 132, 234, 225, 53, 69, 240, 42, 47, 92, 18, 240, 120, 210, 140, 168, 218, 105, 60, 246, 247, 238, 188, 247, 10, 162, 24, 136, 226, 91, 107, 157, 168, 51, 186, 15, 79, 68, 154, 225, 52, 41, 228, 127, 35, 41, 224, 97, 225, 44, 85, 16, 225, 99, 198, 48, 182, 98, 235, 255, 178, 24, 210, 58, 14, 200, 84, 18, 132, 137, 35, 171, 63, 195, 238, 195, 167, 167, 8, 207, 232, 214, 100, 91, 195, 90, 233, 86, 98, 207, 185, 229, 196, 140, 253, 236, 219, 150, 62, 62, 2, 15, 51, 232, 157, 44, 234, 107, 188, 220, 214, 209, 42, 165, 18, 94, 143, 235, 241, 192, 254, 106, 155, 48, 246, 239, 123, 17, 140, 12, 101, 251, 102, 156, 126, 130, 2, 38, 62, 255, 27, 134, 182, 120, 23, 158, 103, 4, 48, 154, 78, 236, 14, 254, 222, 239, 42, 228, 224, 138, 87, 211, 236, 78, 212, 1, 107, 139, 81, 5, 238, 185, 84, 205, 51, 83, 67, 52, 42, 135, 255, 244, 123, 157, 185, 116, 114, 160, 116, 246, 30, 147, 127, 129, 156, 51, 229, 39, 122, 2, 122, 145, 229, 25, 122, 2, 151, 7, 125, 246, 76, 129, 209, 110, 138, 246, 211, 33, 183, 60, 192, 108, 167, 161, 157, 173, 188, 134, 192, 179, 203, 195, 136, 84, 41, 110, 193, 122, 131, 11, 75, 124, 83, 139, 80, 12, 71, 93, 214, 179, 43, 70, 139, 91, 53, 228, 97, 105, 67, 230, 118, 92, 183, 131, 114, 231, 74, 140, 48, 135, 180, 10, 184, 148, 46, 75, 182, 205, 83, 47, 151, 206, 84, 243, 232, 233, 126, 142, 30, 11, 113, 219, 252, 153, 18, 16, 215, 238, 121, 155, 255, 21, 214, 89, 6, 196, 3, 201, 131, 48, 187, 159, 235, 14, 27, 155, 245, 77, 229, 130, 112, 168, 164, 253, 69, 23, 253, 242, 175, 19, 232, 155, 161, 27, 158, 95, 160, 90, 79, 109, 133, 203, 42, 70, 181, 120, 247, 244, 85, 191, 167, 255, 36, 251, 115, 54, 191, 78, 211, 182, 252, 5, 12, 100, 32, 48, 200, 26, 234, 123, 25, 161, 253, 134, 168, 60, 15, 187, 62, 24, 239, 177, 98, 92, 109, 195, 112, 78, 242, 161, 250, 224, 210, 94, 111, 34, 100, 196, 71, 103, 74, 123, 216, 217, 180, 160, 33, 64, 105, 123, 183, 125, 84, 77, 80, 99, 109, 247, 173, 168, 239, 122, 88, 233, 117, 237, 148, 43, 144, 195, 255, 222, 124, 214, 133, 156, 117, 244, 7, 73, 13, 100, 164, 68, 175, 191, 93, 225, 252, 128, 96, 77, 231, 196, 150, 223, 120, 56, 23, 101, 94, 23, 50, 76, 38, 27, 89, 184, 93, 140, 37, 79, 249, 66, 199, 27, 220, 230, 114, 176, 179, 228, 201, 12, 56, 113, 1, 25, 207, 104, 177, 191, 79, 237, 143, 226, 104, 92, 21, 249, 98, 205, 22, 105, 215, 184, 142, 178, 107, 8, 194, 13, 32, 156, 84, 109, 146, 152, 57, 241, 72, 62, 74, 122, 212, 88, 179, 57, 23, 186, 74, 73, 82, 37, 80, 182, 165, 40, 89, 30, 244, 209, 110, 163, 24, 182, 201, 139, 145, 225, 148, 219, 184, 1, 109, 99, 156, 37, 247, 177, 111, 50, 209, 221, 208, 78, 0, 72, 6, 236, 76, 79, 63, 132, 26, 227, 72, 142, 229, 248, 120, 160, 148, 155, 91, 51, 61, 40, 22, 192, 96, 139, 193, 192, 41, 116, 79, 140, 116, 158, 248, 64, 168, 227, 174, 56, 114, 92, 160, 31, 200, 94, 82, 99, 139, 67, 95, 47, 76, 180, 152, 43, 131, 149, 177, 4, 212, 56, 209, 190, 209, 102, 122, 224, 72, 234, 244, 111, 175, 138, 120, 23, 203, 9, 146, 234, 239, 94, 241, 28, 21, 170, 51, 2, 176, 125, 179, 217, 99, 83, 17, 16, 113, 123, 111, 68, 94, 156, 200, 90, 117, 30, 174, 131, 42, 161, 91, 76, 85, 199, 44, 75, 199, 0, 159, 111, 158, 236, 63, 252, 73, 67, 220, 113, 169, 158, 74, 7, 81, 214, 149, 155, 222, 129, 91, 63, 169, 196, 168, 208, 230, 83, 168, 4, 19, 27, 176, 157, 146, 56, 42, 254, 143, 171, 119, 60, 127, 57, 37, 107, 84, 255, 246, 76, 159, 38, 176, 233, 13, 97, 107, 64, 55, 206, 201, 204, 218, 3, 139, 123, 150, 151, 110, 28, 198, 99, 247, 167, 155, 37, 184, 253, 214, 21, 253, 250, 179, 26, 233, 98, 205, 117, 109, 94, 222, 15, 151, 184, 119, 219, 159, 26, 52, 234, 55, 66, 100, 108, 175, 174, 17, 111, 135, 189, 244, 238, 173, 23, 17, 241, 136, 78, 124, 75, 203, 114, 135, 228, 221, 79, 244, 180, 84, 215, 120, 58, 193, 234, 17, 21, 132, 110, 10, 93, 93, 0, 183, 245, 134, 61, 95, 68, 191, 141, 237, 95, 126, 87, 58, 149, 134, 213, 110, 116, 216, 192, 10, 112, 38, 232, 50, 35, 120, 57, 45, 172, 232, 37, 77, 226, 153, 110, 131, 253, 210, 168, 180, 83, 56, 51, 56, 189, 222, 97, 193, 136, 138, 42, 148, 50, 111, 24, 19, 254, 177, 109, 42, 4, 65, 172, 96, 251, 160, 54, 58, 165, 202, 64, 75, 38, 58, 75, 176, 216, 98, 146, 125, 118, 248, 14, 106, 228, 226, 81, 241, 251, 127, 27, 23, 92, 157, 140, 12, 59, 86, 252, 122, 13, 128, 14, 184, 55, 155, 44, 253, 29, 47, 123, 191, 185, 154, 163, 114, 250, 216, 48, 218, 24, 41, 137, 186, 200, 209, 147, 86, 234, 11, 251, 42, 56, 181, 243, 238, 166, 135, 92, 151, 86, 174, 89, 79, 71, 14, 24, 5, 179, 87, 131, 135, 102, 59, 186, 66, 1, 6, 72, 5, 28, 79, 49, 186, 194, 62, 179, 53, 186, 31, 143, 15, 105, 32, 251, 188, 138, 11, 244, 36, 100, 101, 80, 187, 253, 53, 90, 154, 212, 181, 126, 209, 58, 10, 55, 168, 27, 236, 115, 101, 224, 193, 103, 231, 231, 76, 130, 169, 64, 247, 143, 160, 6, 12, 187, 62, 115, 85, 133, 97, 131, 157, 164, 5, 18, 51, 69, 53, 226, 170, 32, 248, 133, 194, 58, 114, 243, 156, 53, 219, 228, 37, 51, 150, 240, 227, 74, 100, 66, 140, 115, 100, 103, 47, 160, 145, 39, 160, 75, 222, 218, 28, 108, 232, 107, 91, 0, 57, 250, 136, 6, 33, 118, 115, 103, 179, 221, 108, 40, 142, 175, 185, 2, 12, 192, 66, 213, 152, 41, 233, 223, 41, 212, 85, 17, 52, 58, 211, 181, 46, 211, 206, 189, 26, 8, 90, 115, 224, 151, 195, 224, 213, 34, 162, 189, 222, 218, 155, 78, 201, 101, 242, 9, 56, 215, 152, 239, 247, 121, 3, 16, 221, 56, 45, 35, 243, 146, 128, 44, 114, 215, 132, 101, 220, 233, 180, 2, 29, 87, 203, 185, 144, 16, 37, 113, 60, 244, 214, 140, 191, 24, 192, 37, 255, 161, 147, 216, 30, 40, 155, 88, 60, 186, 135, 11, 23, 228, 43, 157, 203, 102, 196, 197, 1, 1, 87, 218, 126, 80, 76, 30, 182, 207, 153, 135, 248, 6, 181, 215, 77, 128, 200, 10, 19, 107, 138, 202, 84, 120, 191, 140, 117, 50, 32, 27, 105, 174, 224, 170, 123, 53, 76, 48, 210, 6, 227, 195, 114, 235, 87, 145, 150, 26, 21, 17, 214, 198, 245, 125, 109, 156, 170, 204, 143, 228, 62, 196, 128, 21, 243, 153, 91, 71, 164, 113, 164, 255, 48, 36, 238, 105, 220, 163, 93, 3, 33, 47, 150, 241, 211, 190, 111, 157, 234, 189, 25, 58, 247, 75, 118, 247, 167, 171, 118, 223, 1, 180, 98, 83, 0, 2, 109, 17, 255, 116, 244, 107, 101, 220, 100, 70, 21, 133, 179, 90, 210, 116, 32, 197, 24, 82, 114, 120, 218, 14, 147, 80, 194, 80, 69, 78, 223, 157, 183, 130, 49, 139, 162, 34, 12, 176, 45, 242, 103, 232, 128, 68, 88, 225, 181, 149, 3, 210, 20, 38, 155, 6, 206, 136, 22, 170, 92, 156, 165, 116, 142, 250, 72, 203, 235, 193, 116, 244, 4, 209, 55, 186, 29, 8, 33, 193, 221, 73, 27, 212, 204, 22, 197, 179, 8, 122, 134, 8, 255, 96, 51, 2, 169, 193, 96, 128, 178, 109, 143, 131, 50, 219, 208, 58, 159, 103, 233, 100, 26, 2, 177, 129, 122, 168, 120, 71, 39, 115, 228, 108, 114, 161, 243, 24, 10, 221, 105, 0, 32, 230, 75, 208, 233, 4, 70, 249, 98, 37, 46, 87, 158, 145, 60, 85, 229, 199, 236, 126, 80, 183, 181, 12, 68, 3, 15, 23, 36, 92, 146, 109, 61, 24, 128, 78, 239, 88, 230, 215, 204, 90, 147, 118, 171, 51, 168, 95, 93, 23, 90, 244, 164, 172, 201, 222, 112, 143, 193, 209, 130, 201, 207, 118, 175, 51, 3, 83, 144, 53, 7, 2, 223, 146, 50, 101, 168, 159, 133, 28, 66, 29, 64, 233, 76, 182, 133, 172, 68, 223, 114, 254, 236, 111, 30, 73, 137, 130, 164, 131, 196, 189, 111, 155, 147, 217, 64, 194, 115, 143, 201, 77, 22, 153, 228, 83, 191, 53, 210, 87, 234, 21, 34, 187, 184, 28, 63, 179, 214, 83, 14, 112, 32, 169, 159, 133, 207, 19, 169, 188, 147, 111, 186, 114, 43, 118, 152, 25, 71, 184, 247, 239, 62, 39, 125, 8, 176, 91, 46, 127, 37, 169, 247, 186, 170, 231, 106, 124, 93, 82, 203, 135, 50, 177, 85, 74, 115, 219, 76, 96, 173, 44, 242, 38, 163, 171, 14, 0, 95, 76, 99, 75, 14, 39, 213, 116, 182, 72, 2, 234, 176, 65, 98, 150, 36, 70, 86, 137, 151, 218, 245, 141, 17, 24, 233, 41, 185, 58, 178, 56, 54, 122, 148, 231, 151, 41, 214, 96, 4, 243, 46, 63, 200, 233, 128, 161, 95, 138, 244, 183, 141, 145, 14, 25, 91, 197, 70, 3, 227, 187, 203, 223, 48, 120, 113, 7, 0, 130, 193, 160, 67, 108, 185, 71, 237, 171, 101, 159, 96, 98, 34, 4, 142, 114, 155, 160, 147, 193, 170, 48, 115, 253, 172, 245, 59, 145, 176, 55, 203, 245, 60, 24, 247, 235, 79, 12, 117, 74, 18, 151, 14, 208, 7, 227, 230, 138, 182, 107, 33, 172, 211, 232, 244, 91, 86, 80, 237, 55, 154, 175, 32, 221, 17, 151, 79, 104, 238, 25, 226, 76, 155, 72, 39, 90, 209, 93, 119, 54, 17, 9, 222, 62, 18, 136, 25, 15, 59, 194, 203, 57, 150, 0, 52, 122, 104, 84, 199, 104, 180, 154, 180, 177, 141, 173, 169, 154, 113, 35, 75, 198, 157, 150, 80, 44, 212, 248, 174, 232, 251, 140, 74, 214, 189, 41, 120, 113, 156, 65, 16, 15, 201, 18, 45, 16, 210, 104, 247, 38, 33, 40, 249, 61, 119, 153, 179, 72, 88, 122, 109, 208, 91, 186, 231, 246, 201, 154, 26, 36, 115, 126, 217, 44, 194, 140, 103, 229, 15, 250, 227, 140, 106, 204, 118, 169, 157, 84, 150, 31, 128, 194, 254, 144, 221, 84, 79, 211, 148, 33, 60, 107, 211, 170, 159, 248, 105, 63, 114, 0, 23, 234, 92, 230, 240, 118, 6, 250, 181, 184, 227, 64, 186, 40, 94, 67, 225, 133, 89, 15, 16, 174, 144, 165, 59, 6, 73, 13, 18, 29, 10, 46, 237, 23, 51, 33, 27, 193, 212, 63, 194, 5, 79, 66, 177, 81, 200, 84, 254, 225, 36, 110, 208, 225, 202, 213, 89, 214, 140, 142, 227, 223, 60, 214, 19, 145, 92, 92, 164, 207, 222, 158, 250, 12, 146, 150, 67, 204, 120, 211, 109, 95, 186, 40, 167, 178, 90, 34, 46, 234, 28, 109, 171, 182, 83, 197, 36, 51, 69, 152, 168, 121, 48, 71, 179, 22, 218, 168, 182, 160, 147, 195, 177, 176, 201, 234, 213, 209, 135, 222, 9, 1, 157, 170, 240, 175, 246, 218, 255, 92, 53, 102, 171, 22, 235, 180, 248, 118, 10, 85, 14, 24, 218, 184, 132, 191, 225, 112, 66, 3, 231, 36, 235, 34, 214, 181, 57, 104, 151, 76, 69, 101, 83, 20, 39, 170, 108, 161, 239, 236, 126, 9, 144, 27, 117, 209, 174, 173, 92, 16, 185, 25, 8, 65, 29, 134, 67, 1, 248, 62, 221, 239, 134, 12, 15, 252, 203, 140, 179, 52, 247, 3, 230, 34, 184, 102, 82, 118, 76, 218, 254, 242, 24, 115, 22, 119, 90, 4, 149, 236, 176, 116, 68, 77, 123, 201, 192, 255, 188, 107, 195, 3, 217, 184, 106, 219, 116, 81, 207, 193, 227, 101, 41, 29, 232, 72, 85, 236, 151, 74, 93, 150, 166, 171, 155, 81, 131, 81, 109, 171, 184, 37, 190, 114, 106, 113, 144, 234, 76, 143, 92, 98, 190, 112, 151, 198, 151, 181, 99, 7, 182, 50, 190, 157, 141, 17, 199, 148, 230, 14, 240, 95, 238, 139, 161, 96, 85, 137, 154, 79, 67, 168, 101, 253, 126, 23, 165, 143, 47, 33, 157, 100, 6, 130, 253, 188, 66, 21, 205, 243, 116, 62, 241, 161, 177, 199, 234, 61, 135, 55, 113, 25, 153, 27, 129, 149, 189, 140, 112, 211, 49, 176, 38, 44, 110, 29, 135, 178, 122, 233, 3, 166, 97, 175, 61, 159, 98, 61, 54, 46, 62, 246, 137, 17, 150, 249, 165, 99, 211, 172, 76, 7, 104, 39, 106, 119, 221, 159, 210, 96, 33, 236, 87, 164, 112, 47, 226, 247, 236, 140, 185, 182, 20, 201, 51, 88, 97, 52, 198, 70, 49, 248, 96, 51, 82, 115, 169, 78, 73, 112, 123, 106, 120, 113, 184, 93, 194, 224, 68, 211, 200, 237, 209, 41, 160, 127, 89, 163, 55, 9, 27, 252, 78, 93, 147, 141, 12, 156, 44, 226, 106, 126, 159, 181, 106, 84, 25, 39, 220, 41, 134, 184, 173, 69, 141, 128, 221, 57, 194, 56, 41, 148, 107, 242, 241, 174, 129, 152, 123, 81, 101, 1, 204, 9, 109, 154, 97, 169, 63, 167, 52, 96, 239, 63, 116, 163, 122, 158, 94, 221, 35, 90, 184, 69, 186, 220, 155, 205, 65, 191, 31, 209, 62, 120, 156, 77, 154, 212, 58, 165, 208, 254, 65, 204, 148, 200, 121, 78, 129, 79, 121, 39, 34, 3, 169, 118, 120, 52, 35, 119, 142, 29, 15, 144, 156, 90, 134, 101, 105, 11, 112, 32, 74, 0, 219, 159, 132, 100, 7, 106, 88, 142, 42, 159, 159, 133, 11, 175, 92, 88, 144, 12, 55, 185, 47, 142, 31, 43, 39, 16, 83, 122, 54, 7, 150, 158, 215, 14, 143, 136, 147, 141, 231, 157, 67, 152, 119, 164, 114, 159, 71, 210, 144, 98, 127, 44, 132, 218, 170, 183, 6, 185, 210, 94, 95, 99, 240, 116, 30, 126, 76, 115, 212, 246, 102, 92, 96, 159, 252, 177, 173, 238, 87, 145, 120, 239, 83, 103, 148, 111, 193, 200, 157, 199, 84, 245, 167, 68, 43, 9, 69, 55, 83, 164, 109, 90, 46, 101, 215, 36, 23, 74, 170, 73, 31, 151, 63, 13, 233, 151, 107, 248, 28, 92, 35, 70, 5, 235, 85, 219, 20, 213, 153, 157, 249, 176, 37, 255, 191, 49, 221, 195, 243, 205, 150, 238, 234, 168, 137, 153, 201, 222, 205, 199, 162, 119, 146, 41, 89, 105, 114, 144, 27, 194, 167, 15, 17, 102, 155, 81, 20, 64, 25, 235, 217, 63, 154, 242, 225, 13, 33, 182, 38, 116, 47, 107, 50, 207, 110, 29, 136, 55, 33, 139, 136, 214, 63, 92, 125, 90, 118, 202, 7, 13, 45, 43, 162, 106, 53, 143, 13, 190, 171, 226, 196, 144, 17, 49, 136, 120, 246, 99, 28, 219, 184, 171, 145, 232, 242, 225, 86, 216, 29, 251, 249, 41, 244, 144, 111, 2, 13, 67, 69, 97, 59, 202, 92, 254, 71, 189, 6, 119, 180, 186, 203, 34, 18, 85, 115, 103, 178, 15, 139, 42, 154, 39, 24, 0, 19, 22, 240, 255, 252, 93, 217, 151, 118, 89, 76, 228, 117, 200, 137, 13, 190, 247, 255, 24, 253, 162, 24, 184, 20, 70, 173, 242, 65, 255, 14, 85, 235, 99, 103, 131, 181, 84, 80, 63, 156, 184, 204, 191, 61, 156, 252, 59, 37, 109, 229, 102, 139, 94, 178, 178, 164, 231, 49, 155, 35, 56, 196, 15, 169, 144, 251, 215, 89, 129, 230, 72, 219, 139, 197, 78, 109, 102, 25, 48, 44, 123, 211, 216, 106, 185, 237, 124, 133, 39, 37, 162, 20, 211, 134, 155, 168, 11, 222, 152, 143, 211, 112, 133, 136, 21, 169, 89, 187, 92, 61, 144, 126, 142, 165, 91, 64, 45, 41, 56, 164, 108, 49, 241, 137, 99, 44, 191, 100, 11, 225, 166, 244, 183, 14, 69, 141, 184, 193, 220, 72, 211, 67, 223, 16, 43, 227, 34, 87, 91, 32, 229, 84, 162, 113, 251, 125, 218, 118, 31, 254, 16, 33, 170, 201, 209, 49, 30, 113, 104, 193, 212, 82, 64, 80, 214, 32, 149, 217, 244, 237, 193, 223, 104, 77, 128, 228, 140, 55, 252, 204, 229, 187, 36, 99, 153, 241, 138, 135, 171, 169, 62, 250, 184, 63, 167, 139, 183, 57, 170, 36, 217, 201, 129, 169, 222, 78, 153, 65, 153, 195, 211, 229, 159, 191, 0, 145, 12, 209, 25, 247, 122, 19, 108, 173, 163, 187, 235, 254, 87, 80, 25, 110, 179, 158, 48, 232, 20, 138, 81, 198, 78, 18, 44, 75, 181, 18, 238, 96, 61, 247, 229, 254, 2, 55, 169, 32, 180, 136, 177, 161, 213, 132, 128, 108, 93, 159, 201, 212, 238, 223, 233, 186, 243, 4, 248, 5, 33, 214, 193, 214, 95, 51, 141, 60, 72, 63, 142, 184, 37, 122, 118, 136, 97, 93, 142, 245, 8, 147, 224, 126, 67, 93, 170, 105, 121, 231, 171, 85, 105, 191, 126, 88, 57, 42, 253, 179, 85, 251, 193, 163, 112, 71, 28, 137, 104, 199, 121, 13, 122, 58, 231, 160, 176, 50, 200, 80, 65, 99, 25, 67, 129, 91, 97, 178, 131, 195, 111, 148, 134, 71, 57, 145, 113, 209, 177, 51, 154, 29, 28, 180, 74, 13, 69, 147, 96, 210, 108, 176, 89, 248, 238, 64, 140, 85, 196, 169, 20, 251, 238, 194, 41, 56, 39, 59, 226, 189, 130, 178, 90, 176, 226, 46, 108, 156, 204, 174, 85, 118, 165, 137, 184, 160, 133, 89, 170, 184, 37, 48, 65, 241, 224, 117, 164, 248, 213, 112, 143, 128, 23, 130, 133, 216, 66, 190, 63, 238, 179, 84, 71, 27, 50, 83, 199, 91, 126, 164, 192, 76, 107, 100, 229, 6, 25, 164, 89, 235, 117, 247, 61, 109, 205, 76, 128, 230, 41, 243, 85, 58, 189, 128, 216, 21, 53, 68, 80, 1, 25, 171, 203, 71, 176, 46, 6, 84, 35, 150, 95, 144, 144, 253, 210, 78, 10, 31, 218, 179, 248, 95, 81, 244, 79, 215, 63, 196, 100, 165, 120, 54, 14, 180, 125, 152, 106, 173, 125, 14, 108, 211, 161, 131, 229, 114, 56, 252, 16, 221, 16, 242, 74, 87, 168, 121, 127, 247, 212, 200, 71, 204, 116, 246, 255, 154, 24, 137, 127, 45, 177, 212, 17, 212, 102, 236, 29, 88, 177, 166, 135, 107, 210, 230, 219, 124, 71, 98, 50, 230, 107, 222, 79, 222, 190, 37, 241, 242, 167, 27, 117, 253, 201, 76, 251, 186, 18, 135, 96, 191, 207, 15, 107, 67, 146, 251, 105, 102, 25, 200, 71, 209, 165, 125, 192, 18, 228, 162, 238, 214, 221, 138, 49, 40, 100, 122, 249, 20, 121, 57, 199, 11, 0, 243, 76, 57, 23, 211, 110, 212, 250, 218, 95, 154, 145, 179, 173, 45, 233, 155, 246, 67, 35, 203, 93, 5, 2, 91, 121, 116, 93, 64, 69, 31, 182, 179, 74, 59, 198, 41, 19, 102, 51, 76, 126, 224, 153, 65, 254, 186, 90, 16, 91, 220, 154, 130, 20, 187, 103, 141, 248, 188, 245, 250, 139, 191, 48, 138, 40, 199, 201, 155, 147, 83, 62, 254, 80, 3, 107, 104, 36, 103, 186, 94, 186, 225, 107, 167, 118, 230, 199, 85, 241, 219, 139, 20, 28, 233, 5, 131, 144, 101, 21, 228, 236, 249, 115, 82, 62, 147, 175, 251, 174, 128, 176, 255, 248, 142, 239, 113, 165, 254, 238, 22, 99, 162, 202, 108, 79, 235, 246, 32, 220, 11, 51, 239, 109, 4, 204, 179, 212, 86, 38, 5, 232, 170, 76, 151, 131, 165, 206, 122, 105, 124, 107, 28, 137, 196, 99, 194, 6, 122, 29, 75, 178, 26, 232, 70, 33, 231, 24, 73, 33, 187, 181, 240, 75, 22, 114, 163, 98, 114, 6, 93, 2, 32, 16, 79, 93, 119, 219, 153, 15, 182, 129, 123, 242, 162, 182, 152, 200, 24, 14, 95, 48, 35, 60, 237, 71, 183, 152, 92, 134, 31, 82, 174, 53, 155, 170, 96, 221, 93, 137, 90, 31, 128, 20, 131, 15, 86, 154, 93, 190, 178, 124, 214, 130, 43, 64, 134, 249, 0, 48, 215, 92, 236, 202, 24, 47, 60, 232, 190, 124, 3, 71, 145, 183, 215, 240, 1, 100, 235, 203, 185, 205, 122, 222, 41, 199, 127, 4, 74, 57, 92, 80, 227, 109, 81, 197, 32, 38, 35, 53, 94, 245, 9, 141, 245, 223, 223, 95, 42, 175, 157, 209, 215, 90, 64, 0, 248, 244, 246, 25, 60, 7, 169, 138, 246, 184, 96, 155, 68, 94, 155, 22, 15, 241, 169, 20, 49, 215, 209, 111, 239, 200, 144, 5, 33, 153, 142, 239, 148, 110, 117, 109, 248, 67, 98, 109, 157, 187, 172, 160, 169, 85, 54, 0, 153, 129, 217, 150, 67, 124, 151, 101, 106, 131, 207, 134, 5, 255, 139, 146, 192, 0, 115, 91, 6, 129, 58, 60, 103, 106, 223, 52, 211, 102, 252, 153, 7, 36, 34, 32, 136, 111, 24, 231, 218, 101, 114, 49, 128, 185, 58, 235, 26, 108, 148, 216, 2, 109, 127, 76, 170, 230, 167, 77, 230, 144, 120, 234, 183, 78, 246, 204, 228, 134, 249, 88, 100, 196, 198, 168, 113, 216, 42, 35, 193, 234, 34, 195, 152, 125, 79, 79, 24, 161, 173, 16, 174, 46, 67, 170, 131, 156, 232, 86, 89, 173, 30, 39, 209, 177, 50, 137, 84, 109, 203, 25, 179, 105, 42, 151, 141, 56, 47, 146, 109, 175, 225, 243, 210, 206, 81, 196, 237, 159, 201, 165, 55, 181, 153, 69, 153, 117, 118, 217, 130, 65, 139, 68, 118, 59, 201, 202, 82, 129, 162, 23, 102, 61, 155, 109, 206, 125, 41, 111, 139, 83, 174, 133, 242, 44, 2, 235, 186, 58, 247, 99, 136, 173, 106, 250, 248, 34, 152, 133, 3, 208, 170, 129, 23, 60, 73, 212, 46, 191, 190, 88, 207, 221, 164, 178, 45, 215, 131, 204, 225, 117, 173, 138, 180, 3, 0, 15, 14, 221, 73, 184, 22, 167, 83, 216, 31, 137, 254, 108, 90, 21, 235, 5, 68, 143, 236, 218, 177, 170, 239, 180, 8, 168, 140, 226, 189, 16, 145, 62, 163, 225, 93, 205, 37, 120, 98, 129, 249, 129, 253, 213, 174, 200, 19, 143, 140, 9, 177, 50, 105, 134, 69, 113, 244, 133, 6, 120, 25, 155, 132, 254, 226, 207, 43, 56, 168, 69, 169, 95, 83, 166, 34, 69, 213, 187, 98, 243, 119, 143, 121, 249, 119, 129, 165, 103, 146, 140, 13, 136, 238, 160, 170, 253, 171, 212, 98, 239, 172, 195, 249, 68, 207, 60, 24, 130, 128, 167, 163, 178, 130, 220, 6, 139, 198, 201, 110, 26, 91, 155, 144, 143, 212, 85, 106, 50, 198, 74, 210, 168, 146, 232, 172, 30, 152, 206, 69, 44, 47, 88, 165, 180, 221, 45, 252, 248, 47, 26, 33, 142, 189, 77, 77, 20, 185, 247, 249, 88, 67, 117, 249, 151, 118, 57, 18, 137, 128, 189, 134, 148, 85, 7, 47, 60, 142, 110, 105, 252, 45, 165, 187, 134, 50, 255, 180, 56, 130, 137, 76, 189, 218, 152, 46, 148, 44, 1, 239, 47, 72, 192, 70, 14, 74, 90, 136, 245, 35, 40, 171, 29, 17, 97, 77, 184, 32, 38, 38, 252, 12, 0, 226, 11, 222, 132, 183, 121, 209, 83, 3, 164, 243, 32, 111, 109, 145, 203, 57, 241, 192, 5, 107, 164, 128, 3, 218, 69, 178, 200, 222, 45, 65, 105, 110, 115, 184, 75, 243, 221, 49, 226, 170, 189, 49, 246, 129, 33, 150, 38, 203, 3, 214, 111, 206, 150, 168, 137, 162, 228, 3, 96, 105, 184, 27, 106, 81, 32, 147, 230, 60, 219, 199, 176, 74, 100, 18, 80, 140, 70, 128, 115, 119, 111, 82, 172, 8, 6, 168, 188, 56, 197, 112, 159, 169, 216, 200, 90, 251, 104, 112, 19, 179, 71, 59, 181, 138, 224, 158, 252, 148, 50, 65, 55, 33, 120, 142, 137, 108, 20, 142, 236, 144, 89, 197, 190, 188, 19, 102, 227, 240, 38, 170, 129, 123, 69, 123, 193, 13, 37, 133, 44, 167, 210, 141, 172, 154, 208, 42, 156, 35, 126, 176, 1, 98, 193, 135, 102, 235, 229, 22, 34, 187, 18, 111, 64, 83, 107, 17, 157, 241, 117, 59, 8, 211, 60, 200, 87, 184, 89, 132, 249, 60, 18, 81, 237, 225, 53, 221, 131, 255, 218, 64, 239, 194, 7, 181, 40, 3, 46, 108, 220, 52, 108, 62, 254, 140, 37, 116, 15, 40, 169, 90, 47, 136, 102, 253, 7, 223, 132, 207, 60, 234, 21, 134, 155, 63, 112, 37, 72, 222, 55, 59, 20, 34, 167, 71, 222, 221, 164, 161, 92, 131, 244, 235, 243, 237, 184, 129, 77, 165, 160, 139, 171, 234, 234, 69, 113, 128, 93, 215, 9, 84, 41, 213, 35, 164, 24, 120, 204, 180, 178, 153, 47, 245, 57, 22, 175, 206, 12, 175, 203, 129, 39, 93, 127, 18, 12, 55, 43, 36, 252, 1, 104, 116, 59, 135, 193, 145, 183, 41, 62, 78, 165, 189, 232, 128, 224, 11, 142, 255, 2, 223, 95, 80, 219, 87, 249, 121, 31, 181, 50, 241, 31, 127, 174, 99, 238, 176, 116, 65, 220, 160, 189, 25, 204, 103, 20, 231, 42, 195, 34, 180, 105, 121, 110, 99, 149, 139, 1, 221, 124, 67, 172, 47, 189, 207, 14, 229, 79, 158, 187, 203, 126, 236, 14, 53, 121, 243, 132, 78, 39, 72, 7, 165, 22, 78, 41, 101, 128, 20, 168, 136, 198, 109, 226, 32, 135, 168, 104, 155, 115, 57, 50, 66, 17, 72, 245, 124, 70, 188, 194, 144, 89, 140, 85, 8, 10, 129, 227, 167, 15, 15, 201, 54, 239, 194, 154, 204, 129, 27, 190, 245, 102, 166, 178, 201, 7, 197, 78, 149, 69, 245, 4, 143, 4, 84, 13, 217, 59, 242, 223, 226, 199, 231, 118, 188, 55, 115, 56, 15, 217, 3, 0, 181, 190, 3, 162, 127, 120, 206, 181, 8, 225, 155, 148, 202, 117, 70, 96, 81, 246, 165, 253, 115, 148, 217, 138, 44, 203, 36, 44, 221, 59, 122, 68, 170, 248, 235, 88, 242, 209, 42, 71, 31, 117, 5, 149, 221, 216, 154, 116, 41, 231, 138, 123, 85, 128, 71, 109, 111, 17, 72, 163, 225, 109, 7, 40, 133, 74, 76, 155, 107, 34, 193, 114, 240, 61, 31, 24, 46, 215, 197, 96, 114, 213, 18, 214, 57, 119, 50, 18, 5, 175, 254, 21, 246, 64, 145, 171, 217, 243, 159, 250, 231, 228, 64, 164, 97, 61, 150, 9, 230, 11, 138, 132, 95, 209, 138, 97, 87, 139, 190, 171, 135, 158, 170, 99, 198, 18, 127, 44, 102, 1, 236, 90, 73, 214, 135, 116, 107, 247, 175, 46, 238, 51, 79, 163, 249, 5, 137, 145, 92, 138, 23, 207, 158, 50, 109, 131, 84, 61, 184, 252, 232, 20, 67, 107, 189, 61, 198, 27, 6, 189, 119, 34, 236, 94, 105, 65, 140, 181, 248, 32, 12, 119, 126, 0, 14, 226, 78, 7, 121, 111, 47, 30, 49, 206, 187, 125, 247, 235, 6, 229, 34, 161, 174, 72, 154, 37, 94, 8, 88, 125, 54, 182, 100, 46, 84, 144, 213, 251, 62, 71, 177, 120, 255, 194, 14, 105, 206, 151, 179, 144, 140, 191, 167, 248, 44, 70, 227, 154, 142, 32, 174, 159, 199, 154, 78, 165, 68, 96, 73, 8, 13, 246, 162, 155, 48, 7, 121, 90, 173, 40, 226, 166, 189, 35, 87, 225, 45, 209, 220, 70, 22, 156, 216, 39, 126, 84, 142, 207, 100, 219, 155, 166, 43, 253, 161, 255, 143, 148, 93, 17, 7, 109, 176, 112, 14, 87, 147, 186, 123, 32, 159, 252, 83, 111, 182, 250, 28, 239, 207, 92, 64, 17, 26, 216, 0, 41, 24, 142, 246, 19, 172, 32, 137, 234, 69, 147, 251, 234, 207, 95, 6, 113, 209, 107, 69, 122, 198, 148, 13, 18, 28, 238, 191, 168, 205, 144, 234, 181, 247, 192, 151, 176, 95, 157, 60, 224, 26, 120, 24, 16, 66, 102, 51, 185, 111, 39, 6, 205, 187, 16, 1, 141, 45, 234, 48, 144, 26, 92, 155, 213, 218, 88, 151, 0, 111, 109, 28, 44, 172, 24, 215, 205, 186, 42, 119, 124, 48, 41, 199, 85, 81, 244, 24, 170, 71, 156, 141, 249, 234, 193, 174, 77, 184, 47, 107, 112, 235, 124, 254, 7, 163, 156, 71, 59, 122, 224, 196, 215, 71, 81, 145, 207, 178, 97, 118, 45, 154, 109, 190, 143, 63, 83, 135, 110, 166, 174, 47, 195, 33, 0, 234, 212, 223, 11, 248, 210, 158, 17, 139, 239, 15, 57, 133, 185, 152, 71, 56, 2, 62, 10, 103, 243, 247, 182, 81, 10, 38, 49, 7, 131, 10, 202, 184, 79, 149, 84, 213, 122, 133, 208, 24, 141, 132, 12, 244, 251, 160, 41, 56, 219, 123, 120, 23, 240, 40, 29, 32, 213, 222, 36, 49, 173, 176, 11, 209, 145, 104, 154, 154, 182, 183, 5, 60, 131, 70, 224, 47, 125, 110, 47, 246, 180, 222, 125, 243, 251, 55, 25, 147, 77, 164, 116, 218, 152, 191, 244, 47, 199, 68, 208, 209, 49, 90, 197, 176, 2, 191, 127, 198, 48, 16, 168, 243, 41, 195, 50, 175, 33, 172, 92, 185, 254, 96, 221, 65, 24, 36, 187, 10, 104, 242, 101, 185, 176, 206, 215, 166, 82, 189, 245, 208, 62, 38, 207, 97, 192, 45, 46, 98, 66, 201, 69, 95, 206, 211, 204, 225, 137, 204, 100, 110, 58, 84, 29, 112, 144, 51, 15, 1, 170, 79, 41, 239, 77, 1, 208, 209, 80, 208, 214, 27, 168, 153, 229, 188, 40, 250, 13, 240, 23, 96, 54, 235, 23, 202, 165, 215, 109, 143, 163, 161, 136, 101, 109, 98, 102, 54, 231, 141, 157, 22, 5, 201, 89, 10, 241, 113, 225, 185, 234, 128, 212, 206, 186, 59, 114, 79, 69, 43, 171, 208, 219, 63, 219, 112, 54, 77, 156, 116, 150, 140, 113, 186, 79, 131, 109, 231, 205, 170, 253, 131, 97, 141, 107, 242, 5, 238, 167, 32, 135, 194, 143, 151, 71, 22, 81, 254, 84, 120, 103, 131, 61, 86, 126, 66, 51, 201, 0, 170, 70, 18, 38, 152, 225, 3, 117, 98, 100, 141, 114, 39, 161, 189, 146, 148, 43, 55, 189, 18, 157, 181, 185, 7, 117, 77, 56, 229, 91, 80, 233, 79, 165, 140, 24, 98, 197, 130, 50, 70, 44, 111, 230, 241, 92, 204, 246, 78, 19, 18, 231, 219, 201, 207, 84, 205, 137, 138, 113, 45, 4, 72, 145, 204, 3, 86, 230, 200, 208, 166, 218, 183, 217, 21, 89, 23, 40, 107, 161, 68, 230, 96, 236, 91, 106, 15, 38, 255, 132, 13, 248, 98, 106, 177, 223, 54, 247, 114, 82, 147, 161, 42, 43, 10, 192, 12, 94, 200, 248, 200, 85, 231, 247, 246, 201, 221, 180, 217, 113, 12, 222, 88, 53, 21, 6, 26, 214, 220, 152, 253, 92, 56, 158, 17, 233, 218, 95, 234, 91, 97, 71, 148, 11, 3, 226, 199, 250, 201, 132, 92, 244, 18, 210, 248, 212, 89, 182, 96, 73, 121, 250, 222, 59, 121, 118, 19, 28, 221, 126, 48, 119, 190, 217, 72, 194, 91, 4, 213, 17, 137, 34, 246, 7, 6, 143, 245, 97, 192, 252, 55, 145, 82, 10, 77, 111, 31, 80, 74, 156, 14, 68, 111, 82, 76, 168, 203, 9, 220, 54, 233, 175, 186, 169, 104, 243, 2, 143, 109, 213, 247, 163, 196, 181, 37, 16, 50, 218, 28, 129, 118, 162, 187, 98, 202, 226, 244, 39, 27, 90, 255, 235, 125, 98, 206, 155, 179, 211, 58, 135, 80, 97, 220, 32, 136, 18, 226, 60, 251, 51, 170, 165, 47, 4, 63, 160, 41, 105, 85, 23, 122, 32, 145, 69, 85, 159, 147, 73, 209, 201, 169, 25, 225, 164, 6, 151, 92, 9, 223, 55, 137, 202, 67, 221, 100, 161, 248, 10, 209, 195, 27, 146, 4, 219, 227, 190, 203, 134, 228, 10, 160, 34, 221, 250, 110, 203, 33, 186, 60, 136, 185, 235, 72, 45, 105, 176, 161, 36, 169, 185, 174, 168, 146, 23, 57, 128, 198, 162, 194, 197, 62, 254, 102, 200, 154, 140, 98, 40, 208, 128, 95, 151, 77, 40, 190, 88, 75, 156, 47, 207, 220, 11, 125, 159, 24, 89, 142, 60, 2, 156, 25, 44, 203, 39, 222, 166, 122, 93, 215, 91, 87, 57, 199, 69, 211, 244, 140, 241, 106, 43, 193, 10, 150, 65, 226, 163, 202, 165, 155, 93, 219, 207, 28, 174, 157, 201, 199, 169, 174, 28, 36, 117, 106, 155, 87, 209, 223, 171, 104, 72, 76, 180, 101, 196, 248, 163, 252, 150, 33, 224, 118, 128, 130, 145, 211, 28, 80, 17, 174, 33, 156, 108, 139, 120, 225, 111, 9, 46, 228, 79, 112, 121, 35, 181, 170, 12, 131, 173, 169, 4, 40, 8, 101, 34, 154, 227, 200, 57, 50, 118, 220, 128, 21, 208, 62, 131, 68, 193, 52, 163, 35, 96, 45, 225, 26, 219, 50, 194, 44, 22, 181, 83, 21, 82, 35, 100, 10, 241, 218, 12, 104, 240, 254, 190, 54, 48, 213, 87, 65, 183, 27, 232, 23, 246, 169, 179, 164, 55, 66, 70, 219, 7, 214, 128, 58, 244, 120, 52, 255, 213, 170, 81, 235, 16, 46, 18, 229, 186, 139, 118, 127, 12, 74, 173, 106, 171, 161, 3, 108, 3, 113, 211, 2, 88, 90, 227, 202, 196, 195, 69, 88, 168, 40, 87, 247, 210, 5, 26, 117, 159, 42, 3, 73, 148, 247, 236, 110, 16, 236, 169, 179, 22, 198, 32, 79, 138, 96, 70, 6, 161, 27, 71, 155, 241, 112, 60, 188, 51, 134, 154, 0, 207, 203, 43, 102, 88, 180, 139, 239, 72, 26, 46, 174, 76, 65, 14, 135, 202, 211, 124, 201, 4, 227, 40, 119, 46, 102, 23, 71, 143, 167, 164, 77, 192, 135, 16, 27, 148, 127, 123, 191, 209, 160, 49, 93, 138, 94, 161, 181, 205, 80, 80, 33, 73, 203, 45, 36, 194, 173, 86, 7, 234, 200, 138, 20, 62, 20, 110, 84, 16, 238, 207, 123, 175, 233, 40, 135, 51, 85, 136, 64, 204, 198, 207, 151, 162, 133, 207, 58, 246, 187, 201, 91, 185, 76, 46, 209, 173, 153, 71, 158, 241, 109, 66, 129, 109, 19, 70, 30, 186, 76, 249, 125, 197, 243, 223, 219, 16, 93, 134, 232, 59, 188, 42, 4, 155, 129, 236, 145, 166, 244, 222, 103, 3, 166, 145, 150, 57, 129, 19, 253, 157, 242, 66, 97, 165, 107, 87, 180, 245, 247, 47, 19, 34, 135, 219, 94, 76, 118, 156, 247, 148, 44, 142, 164, 20, 184, 96, 179, 138, 54, 39, 212, 235, 96, 215, 39, 45, 51, 215, 39, 47, 119, 120, 22, 197, 166, 158, 26, 115, 21, 16, 110, 23, 166, 132, 209, 232, 103, 248, 200, 133, 238, 224, 13, 50, 110, 33, 211, 154, 5, 239, 137, 226, 87, 131, 152, 225, 59, 208, 49, 204, 237, 81, 149, 34, 167, 46, 181, 121, 110, 31, 108, 226, 10, 80, 6, 47, 84, 180, 176, 86, 70, 171, 221, 85, 143, 172, 227, 120, 229, 75, 140, 133, 195, 176, 173, 92, 82, 179, 97, 115, 116, 236, 224, 70, 44, 166, 206, 23, 99, 0, 213, 47, 203, 153, 221, 178, 246, 196, 30, 74, 208, 100, 245, 85, 136, 132, 6, 213, 73, 199, 248, 61, 206, 141, 74, 61, 100, 181, 157, 51, 131, 95, 116, 217, 218, 162, 32, 136, 10, 115, 221, 65, 16, 223, 19, 163, 172, 73, 140, 97, 69, 67, 199, 116, 137, 251, 188, 106, 68, 78, 25, 225, 202, 40, 117, 161, 114, 10, 208, 29, 48, 217, 82, 234, 75, 134, 156, 9, 253, 241, 144, 22, 186, 139, 101, 111, 37, 72, 95, 33, 177, 20, 246, 210, 132, 1, 255, 84, 153, 171, 140, 222, 57, 86, 34, 181, 228, 39, 13, 158, 35, 57, 113, 16, 61, 97, 111, 39, 48, 192, 88, 102, 201, 83, 73, 113, 227, 116, 20, 73, 169, 135, 107, 8, 96, 250, 23, 25, 242, 51, 166, 29, 160, 169, 43, 239, 90, 254, 198, 209, 54, 249, 31, 217, 23, 118, 57, 192, 20, 69, 77, 50, 24, 34, 190, 166, 28, 181, 49, 126, 222, 133, 171, 0, 85, 212, 226, 94, 35, 11, 186, 253, 42, 162, 231, 111, 41, 53, 21, 0, 196, 211, 17, 73, 180, 211, 43, 10, 11, 169, 42, 217, 100, 220, 106, 211, 8, 68, 44, 65, 124, 214, 103, 198, 30, 191, 25, 71, 54, 175, 38, 179, 199, 70, 138, 97, 108, 255, 138, 125, 40, 227, 161, 76, 237, 137, 181, 151, 130, 199, 147, 50, 202, 63, 204, 201, 210, 176, 96, 34, 56, 67, 123, 183, 1, 76, 154, 235, 179, 216, 12, 117, 188, 46, 156, 252, 113, 160, 233, 197, 85, 136, 30, 248, 140, 12, 94, 134, 65, 86, 195, 234, 246, 91, 169, 22, 246, 179, 50, 9, 114, 221, 181, 117, 75, 248, 250, 178, 13, 27, 17, 253, 242, 46, 217, 38, 173, 41, 199, 29, 74, 40, 35, 68, 210, 208, 58, 180, 133, 244, 138, 113, 207, 34, 225, 122, 92, 111, 221, 183, 24, 150, 49, 7, 21, 66, 56, 58, 165, 114, 83, 27, 31, 48, 14, 6, 160, 66, 45, 64, 87, 184, 7, 29, 123, 248, 231, 76, 1, 133, 82, 122, 54, 198, 43, 143, 135, 5, 173, 90, 234, 193, 11, 13, 158, 200, 210, 235, 34, 16, 147, 34, 12, 162, 125, 17, 42, 120, 178, 254, 70, 247, 98, 239, 253, 121, 6, 228, 136, 142, 224, 84, 181, 244, 122, 130, 165, 247, 26, 40, 7, 194, 75, 69, 109, 154, 8, 69, 73, 19, 187, 93, 141, 133, 163, 142, 102, 230, 167, 64, 60, 82, 140, 73, 205, 221, 44, 139, 106, 67, 75, 232, 192, 201, 199, 198, 3, 138, 228, 140, 161, 212, 57, 55, 51, 94, 38, 89, 225, 92, 37, 239, 56, 35, 50, 203, 123, 145, 140, 62, 37, 78, 17, 223, 236, 211, 3, 152, 48, 200, 73, 18, 202, 203, 100, 185, 171, 51, 254, 143, 39, 141, 125, 28, 236, 179, 45, 234, 126, 20, 65, 174, 97, 241, 242, 45, 63, 49, 10, 137, 234, 137, 186, 225, 132, 36, 54, 195, 173, 21, 185, 163, 118, 125, 244, 66, 172, 145, 124, 242, 5, 21, 230, 51, 165, 24, 71, 157, 116, 172, 183, 147, 176, 148, 136, 88, 84, 10, 83, 22, 173, 67, 228, 17, 37, 136, 248, 234, 77, 233, 145, 111, 253, 31, 77, 212, 111, 222, 215, 46, 77, 29, 10, 192, 121, 17, 173, 70, 252, 53, 136, 16, 177, 162, 28, 113, 124, 181, 146, 235, 248, 80, 80, 242, 94, 21, 192, 162, 236, 21, 163, 244, 217, 15, 167, 84, 195, 43, 216, 220, 177, 69, 99, 35, 58, 217, 252, 195, 102, 13, 196, 105, 6, 217, 48, 209, 199, 143, 139, 51, 227, 180, 80, 148, 206, 183, 153, 31, 245, 60, 182, 205, 199, 153, 244, 232, 251, 209, 169, 42, 163, 67, 217, 181, 27, 57, 115, 107, 78, 192, 254, 236, 183, 230, 114, 42, 155, 19, 142, 83, 207, 172, 53, 20, 250, 2, 150, 37, 214, 186, 35, 8, 179, 170, 90, 214, 160, 218, 251, 130, 197, 24, 191, 23, 236, 227, 157, 3, 96, 32, 168, 173, 248, 215, 41, 14, 14, 80, 134, 34, 65, 108, 106, 46, 195, 150, 150, 123, 103, 56, 121, 202, 213, 107, 245, 191, 129, 192, 40, 90, 5, 30, 100, 119, 156, 208, 22, 206, 119, 48, 69, 54, 22, 230, 217, 97, 167, 114, 105, 155, 188, 78, 3, 170, 226, 209, 167, 147, 154, 90, 126, 193, 12, 253, 228, 165, 3, 31, 102, 106, 2, 235, 18, 39, 152, 173, 182, 194, 126, 183, 114, 202, 209, 32, 68, 98, 99, 185, 55, 21, 116, 89, 224, 79, 160, 166, 171, 39, 179, 173, 146, 79, 167, 36, 75, 195, 22, 248, 177, 97, 122, 14, 86, 234, 99, 20, 138, 252, 2, 31, 47, 191, 187, 136, 224, 233, 172, 28, 59, 77, 231, 124, 86, 67, 25, 9, 222, 119, 157, 29, 30, 166, 111, 107, 138, 153, 254, 26, 105, 243, 91, 208, 2, 249, 188, 40, 34, 138, 91, 32, 171, 246, 64, 57, 7, 145, 243, 155, 93, 228, 228, 158, 94, 185, 149, 63, 236, 176, 186, 35, 145, 171, 209, 213, 214, 1, 158, 143, 185, 33, 248, 84, 1, 91, 201, 0, 174, 112, 52, 165, 202, 24, 20, 234, 125, 255, 142, 35, 138, 21, 87, 157, 40, 87, 150, 222, 226, 114, 119, 127, 190, 123, 25, 10, 175, 20, 66, 35, 8, 253, 203, 17, 79, 239, 79, 49, 92, 111, 62, 64, 94, 150, 95, 50, 246, 19, 78, 89, 247, 4, 25, 146, 142, 201, 101, 137, 36, 179, 93, 80, 158, 144, 34, 248, 173, 20, 245, 180, 30, 132, 241, 10, 120, 205, 10, 200, 119, 195, 193, 48, 205, 143, 48, 53, 155, 242, 50, 99, 181, 154, 182, 44, 243, 5, 18, 121, 140, 60, 56, 141, 213, 156, 158, 122, 28, 125, 42, 152, 83, 47, 132, 16, 54, 246, 164, 123, 68, 237, 151, 20, 161, 128, 24, 251, 153, 36, 9, 100, 227, 235, 15, 204, 33, 69, 90, 175, 71, 200, 215, 24, 28, 136, 123, 224, 112, 205, 183, 171, 130, 119, 157, 87, 155, 55, 89, 50, 121, 143, 12, 118, 51, 131, 109, 111, 39, 194, 206, 119, 150, 89, 9, 199, 86, 88, 207, 32, 241, 141, 106, 11, 19, 241, 140, 74, 19, 241, 116, 186, 224, 216, 139, 83, 35, 186, 189, 122, 64, 168, 121, 63, 182, 101, 232, 152, 96, 4, 162, 191, 152, 73, 12, 240, 55, 51, 112, 218, 216, 129, 30, 39, 49, 209, 132, 24, 140, 22, 17, 216, 218, 120, 221, 248, 40, 169, 24, 78, 198, 219, 99, 86, 225, 233, 255, 239, 118, 13, 44, 190, 145, 152, 207, 101, 102, 168, 204, 212, 179, 109, 54, 101, 48, 155, 91, 170, 10, 87, 131, 49, 95, 165, 199, 62, 162, 187, 239, 186, 7, 225, 128, 178, 201, 39, 223, 213, 194, 202, 65, 216, 188, 204, 161, 53, 103, 200, 108, 56, 119, 205, 152, 227, 105, 8, 55, 99, 100, 226, 227, 206, 104, 172, 249, 126, 39, 185, 1, 243, 134, 226, 104, 36, 176, 242, 51, 27, 83, 252, 250, 219, 2, 201, 197, 64, 156, 102, 171, 172, 59, 35, 60, 154, 112, 32, 14, 252, 78, 91, 162, 54, 139, 223, 154, 97, 157, 236, 49, 33, 253, 67, 60, 100, 127, 204, 83, 235, 7, 217, 215, 136, 85, 76, 172, 161, 180, 54, 61, 43, 187, 207, 125, 50, 157, 246, 96, 159, 203, 17, 61, 26, 184, 206, 206, 232, 73, 32, 222, 252, 64, 156, 78, 140, 41, 121, 73, 222, 133, 72, 98, 45, 161, 172, 42, 230, 164, 248, 139, 255, 140, 84, 5, 244, 131, 158, 185, 177, 5, 27, 201, 68, 69, 37, 32, 11, 79, 15, 218, 201, 41, 61, 220, 82, 102, 143, 137, 93, 161, 93, 184, 133, 140, 9, 118, 220, 217, 184, 157, 227, 184, 1, 219, 35, 183, 183, 154, 195, 123, 59, 124, 166, 251, 151, 248, 83, 199, 158, 163, 206, 4, 131, 32, 69, 137, 93, 52, 213, 84, 219, 225, 85, 146, 26, 21, 122, 138, 108, 189, 93, 29, 36, 19, 127, 185, 251, 186, 134, 1, 139, 130, 148, 24, 147, 113, 153, 18, 156, 113, 220, 136, 99, 207, 16, 224, 118, 5, 125, 247, 223, 187, 255, 176, 45, 225, 100, 65, 230, 94, 247, 106, 236, 139, 48, 170, 135, 188, 110, 72, 245, 77, 229, 119, 121, 221, 117, 80, 161, 11, 83, 111, 104, 7, 16, 215, 200, 76, 70, 30, 235, 109, 255, 108, 51, 22, 39, 118, 166, 185, 10, 201, 25, 135, 139, 123, 47, 231, 94, 237, 44, 205, 224, 101, 159, 219, 52, 75, 219, 117, 127, 94, 37, 98, 166, 26, 218, 182, 135, 79, 97, 128, 47, 80, 11, 129, 232, 199, 73, 238, 20, 96, 73, 8, 13, 246, 150, 113, 16, 93, 29, 63, 99, 184, 127, 48, 184, 15, 201, 41, 8, 73, 20, 254, 186, 190, 85, 57, 106, 219, 50, 222, 245, 19, 1, 224, 126, 204, 176, 212, 46, 202, 253, 246, 139, 139, 157, 165, 224, 100, 16, 48, 50, 146, 146, 189, 215, 105, 250, 219, 7, 105, 27, 195, 58, 185, 223, 24, 132, 199, 121, 183, 28, 15, 242, 170, 196, 120, 116, 16, 197, 209, 226, 57, 221, 6, 20, 154, 98, 50, 100, 209, 68, 35, 57, 77, 168, 139, 101, 179, 73, 182, 158, 237, 54, 140, 39, 181, 108, 154, 139, 112, 185, 112, 88, 51, 125, 93, 26, 202, 77, 157, 48, 88, 66, 74, 64, 55, 153, 78, 123, 156, 171, 59, 43, 11, 142, 249, 137, 25, 136, 219, 244, 210, 117, 44, 156, 136, 80, 224, 236, 213, 190, 71, 252, 135, 37, 95, 7, 5, 28, 172, 241, 27, 217, 140, 19, 42, 138, 107, 71, 12, 75, 179, 112, 29, 129, 191, 9, 141, 179, 255, 1, 162, 7, 118, 105, 47, 49, 105, 44, 20, 86, 185, 2, 125, 146, 241, 159, 105, 176, 221, 115, 213, 14, 66, 202, 95, 250, 213, 43, 248, 176, 4, 46, 39, 84, 19, 186, 80, 242, 53, 182, 156, 3, 43, 8, 79, 88, 156, 127, 11, 247, 179, 199, 208, 251, 37, 217, 22, 207, 191, 128, 53, 160, 16, 159, 197, 19, 214, 240, 29, 193, 212, 73, 191, 244, 27, 189, 229, 99, 251, 254, 50, 42, 191, 199, 15, 149, 141, 81, 60, 25, 135, 120, 231, 40, 84, 127, 59, 150, 127, 45, 154, 135, 124, 109, 252, 186, 204, 98, 148, 162, 133, 10, 234, 232, 152, 88, 216, 54, 242, 206, 78, 160, 12, 78, 10, 228, 2, 238, 50, 9, 230, 116, 204, 206, 160, 9, 199, 12, 12, 224, 13, 153, 81, 51, 253, 140, 197, 148, 47, 192, 14, 187, 255, 216, 110, 141, 198, 35, 212, 244, 67, 77, 48, 87, 46, 46, 113, 205, 220, 81, 105, 109, 9, 248, 194, 100, 71, 187, 160, 9, 221, 178, 176, 119, 196, 36, 136, 12, 68, 34, 113, 221, 250, 250, 4, 251, 20, 137, 70, 241, 172, 178, 185, 214, 23, 55, 196, 31, 160, 76, 214, 230, 139, 192, 144, 120, 188, 225, 215, 132, 33, 105, 178, 83, 69, 92, 192, 112, 123, 221, 34, 7, 73, 145, 233, 56, 12, 67, 106, 152, 77, 143, 77, 217, 102, 6, 199, 53, 14, 162, 12, 134, 91, 59, 169, 181, 18, 47, 11, 206, 69, 65, 66, 27, 160, 98, 149, 22, 24, 53, 196, 119, 231, 84, 211, 246, 231, 218, 99, 120, 197, 151, 30, 153, 192, 120, 253, 70, 234, 253, 239, 34, 74, 6, 233, 149, 155, 214, 12, 127, 57, 92, 225, 201, 233, 116, 48, 226, 94, 159, 212, 78, 222, 99, 116, 29, 187, 3, 59, 167, 68, 108, 162, 146, 125, 6, 178, 230, 60, 158, 60, 85, 94, 113, 93, 2, 75, 195, 234, 66, 200, 148, 128, 50, 56, 58, 205, 79, 226, 11, 189, 189, 88, 32, 67, 83, 84, 188, 31, 180, 79, 252, 9, 177, 199, 53, 163, 66, 54, 110, 245, 174, 113, 225, 204, 180, 149, 6, 141, 18, 250, 150, 168, 229, 99, 107, 110, 108, 63, 70, 43, 146, 216, 64, 42, 3, 227, 146, 223, 233, 6, 140, 108, 238, 21, 245, 70, 14, 152, 92, 109, 138, 104, 200, 195, 248, 125, 230, 8, 4, 138, 125, 228, 221, 225, 98, 146, 230, 91, 225, 247, 207, 29, 112, 185, 202, 157, 218, 18, 193, 45, 54, 47, 215, 162, 29, 92, 95, 13, 88, 40, 129, 1, 150, 106, 203, 117, 76, 176, 157, 169, 61, 45, 201, 67, 35, 238, 149, 21, 174, 50, 162, 150, 120, 22, 144, 195, 187, 214, 239, 178, 231, 165, 200, 167, 170, 107, 98, 242, 205, 72, 113, 166, 163, 6, 197, 57, 210, 106, 231, 192, 17, 112, 77, 83, 171, 216, 127, 73, 143, 182, 224, 111, 104, 137, 123, 119, 52, 153, 42, 205, 161, 145, 174, 167, 38, 117, 130, 82, 31, 228, 102, 234, 30, 199, 194, 207, 73, 109, 64, 231, 55, 221, 65, 225, 203, 28, 113, 2, 120, 201, 22, 125, 211, 76, 82, 58, 75, 181, 33, 121, 189, 138, 70, 122, 155, 252, 133, 51, 35, 241, 193, 121, 148, 48, 44, 155, 123, 240, 9, 169, 145, 15, 79, 213, 180, 160, 30, 198, 225, 209, 186, 124, 186, 53, 240, 246, 13, 188, 52, 211, 221, 181, 212, 140, 143, 187, 178, 11, 181, 202, 78, 50, 55, 119, 228, 113, 120, 231, 184, 165, 122, 121, 94, 181, 222, 248, 225, 204, 245, 174, 205, 63, 219, 192, 246, 82, 101, 109, 115, 160, 153, 82, 131, 38, 219, 229, 58, 114, 205, 138, 141, 137, 237, 89, 94, 245, 84, 177, 166, 0, 38, 16, 173, 56, 248, 67, 55, 114, 252, 89, 251, 146, 93, 24, 104, 113, 181, 37, 164, 37, 158, 96, 137, 191, 214, 21, 51, 215, 58, 123, 111, 161, 116, 157, 112, 211, 188, 210, 52, 105, 219, 91, 213, 191, 133, 171, 47, 102, 174, 51, 170, 180, 10, 30, 181, 17, 43, 76, 13, 242, 136, 41, 45, 155, 24, 45, 79, 146, 218, 6, 107, 47, 142, 32, 141, 94, 165, 12, 149, 84, 170, 122, 202, 67, 130, 126, 39, 129, 244, 187, 19, 227, 22, 108, 234, 94, 98, 61, 155, 251, 228, 212, 43, 37, 254, 81, 222, 41, 67, 5, 225, 124, 53, 203, 111, 24, 212, 64, 17, 85, 194, 255, 56, 190, 115, 192, 203, 55, 170, 152, 187, 166, 116, 85, 66, 167, 213, 247, 129, 15, 118, 86, 104, 224, 195, 108, 109, 6, 200, 191, 34, 138, 117, 74, 182, 209, 18, 204, 182, 139, 184, 27, 107, 175, 14, 145, 155, 197, 251, 53, 141, 209, 98, 130, 230, 2, 91, 91, 90, 254, 131, 252, 91, 85, 39, 212, 73, 90, 57, 184, 144, 26, 163, 6, 32, 243, 234, 162, 234, 236, 167, 234, 73, 113, 50, 77, 165, 129, 122, 211, 6, 34, 194, 184, 29, 135, 226, 91, 114, 14, 96, 246, 243, 22, 200, 242, 220, 174, 227, 244, 168, 199, 197, 55, 114, 62, 215, 172, 58, 60, 82, 41, 205, 8, 107, 253, 62, 108, 122, 249, 78, 137, 39, 167, 14, 35, 153, 136, 62, 193, 211, 120, 49, 237, 232, 22, 215, 190, 132, 161, 250, 249, 174, 253, 90, 93, 210, 35, 222, 35, 62, 60, 204, 107, 63, 198, 121, 147, 68, 213, 75, 49, 50, 3, 5, 74, 30, 92, 119, 11, 223, 133, 222, 29, 233, 248, 93, 87, 194, 139, 84, 52, 214, 44, 146, 19, 241, 82, 204, 163, 154, 253, 130, 159, 88, 148, 116, 207, 29, 114, 117, 150, 154, 24, 81, 78, 95, 1, 208, 84, 197, 172, 141, 3, 107, 18, 192, 120, 196, 91, 30, 82, 90, 232, 163, 10, 142, 96, 198, 62, 126, 212, 153, 100, 207, 146, 122, 233, 92, 188, 147, 27, 9, 102, 204, 119, 209, 242, 71, 222, 108, 114, 249, 173, 59, 14, 67, 26, 104, 240, 136, 199, 70, 131, 39, 134, 18, 1, 152, 79, 224, 130, 104, 195, 179, 215, 90, 186, 244, 238, 12, 90, 181, 145, 75, 238, 84, 158, 111, 63, 187, 121, 152, 132, 167, 150, 138, 62, 203, 40, 70, 138, 154, 210, 37, 50, 226, 69, 253, 143, 26, 0, 243, 131, 5, 139, 79, 48, 48, 115, 122, 61, 71, 41, 1, 232, 239, 4, 96, 74, 209, 253, 128, 224, 222, 158, 97, 150, 16, 30, 132, 240, 199, 197, 118, 13, 71, 56, 160, 190, 35, 215, 110, 165, 254, 26, 69, 43, 195, 163, 30, 245, 138, 48, 80, 140, 245, 89, 83, 165, 65, 39, 20, 83, 115, 119, 111, 90, 202, 101, 172, 91, 178, 35, 17, 120, 45, 118, 91, 60, 189, 180, 133, 34, 19, 137, 152, 143, 16, 186, 214, 4, 46, 242, 23, 179, 229, 204, 55, 218, 22, 188, 5, 222, 140, 69, 195, 43, 31, 34, 159, 131, 53, 28, 83, 208, 158, 112, 163, 16, 61, 175, 3, 69, 113, 134, 174, 21, 125, 162, 91, 182, 251, 120, 17, 94, 100, 252, 199, 118, 35, 248, 64, 206, 179, 38, 121, 176, 84, 197, 9, 2, 45, 111, 244, 161, 250, 199, 130, 208, 167, 250, 0, 155, 57, 0, 95, 39, 206, 237, 5, 23, 58, 142, 137, 77, 164, 152, 219, 94, 57, 237, 16, 219, 119, 57, 58, 101, 189, 104, 205, 228, 28, 237, 119, 143, 99, 241, 5, 160, 115, 91, 215, 246, 198, 153, 60, 186, 64, 248, 126, 67, 56, 155, 179, 55, 102, 3, 47, 68, 145, 41, 209, 45, 148, 106, 11, 71, 191, 171, 245, 33, 6, 133, 216, 1, 109, 128, 56, 120, 247, 17, 169, 150, 173, 61, 111, 0, 65, 2, 95, 229, 63, 59, 185, 148, 213, 149, 140, 190, 57, 151, 163, 73, 9, 231, 250, 76, 126, 211, 12, 175, 14, 38, 146, 30, 102, 22, 124, 58, 137, 239, 181, 99, 176, 2, 184, 48, 196, 132, 248, 140, 90, 194, 95, 6, 90, 242, 171, 254, 189, 235, 8, 68, 244, 115, 89, 217, 10, 61, 172, 252, 75, 186, 117, 212, 216, 62, 253, 98, 156, 233, 96, 139, 55, 91, 251, 168, 221, 67, 231, 18, 140, 250, 38, 232, 143, 65, 220, 234, 129, 106, 184, 63, 171, 119, 96, 32, 9, 45, 151, 74, 71, 81, 162, 109, 58, 194, 125, 191, 169, 244, 9, 190, 37, 38, 98, 36, 238, 176, 38, 150, 30, 227, 0, 191, 60, 189, 0, 4, 178, 196, 238, 182, 233, 8, 126, 14, 236, 73, 100, 16, 150, 49, 26, 104, 152, 197, 132, 53, 229, 100, 196, 206, 7, 74, 91, 143, 23, 206, 120, 252, 52, 73, 161, 148, 41, 160, 137, 29, 207, 222, 13, 128, 144, 191, 162, 60, 24, 226, 187, 250, 73, 76, 246, 240, 31, 254, 109, 144, 102, 248, 207, 215, 44, 182, 29, 202, 54, 141, 107, 124, 239, 205, 243, 54, 158, 0, 148, 202, 98, 65, 233, 201, 60, 169, 34, 64, 81, 62, 205, 225, 228, 233, 250, 23, 146, 53, 104, 120, 68, 71, 179, 26, 156, 230, 25, 225, 235, 138, 20, 196, 223, 72, 176, 237, 67, 107, 202, 211, 32, 31, 184, 26, 178, 64, 134, 225, 115, 8, 227, 9, 200, 33, 31, 31, 58, 82, 251, 249, 54, 46, 60, 12, 233, 66, 222, 144, 243, 111, 110, 25, 117, 77, 108, 223, 211, 209, 23, 78, 162, 154, 77, 84, 251, 166, 89, 207, 45, 78, 51, 85, 18, 51, 14, 56, 9, 131, 186, 111, 229, 230, 11, 197, 196, 201, 184, 134, 147, 52, 14, 185, 145, 14, 9, 164, 157, 82, 3, 252, 42, 244, 140, 207, 189, 77, 13, 232, 248, 139, 10, 137, 30, 189, 91, 92, 202, 63, 249, 97, 212, 139, 39, 155, 251, 253, 10, 249, 13, 115, 238, 203, 112, 147, 186, 185, 46, 239, 51, 143, 148, 251, 163, 208, 254, 121, 240, 243, 22, 162, 47, 196, 44, 249, 0, 59, 127, 144, 82, 11, 69, 124, 76, 131, 231, 236, 169, 97, 172, 168, 157, 24, 17, 61, 108, 229, 182, 153, 0, 196, 23, 118, 40, 70, 167, 178, 79, 47, 113, 75, 93, 46, 135, 148, 121, 57, 20, 150, 28, 66, 210, 141, 142, 91, 131, 112, 239, 188, 35, 5, 181, 128, 2, 59, 120, 6, 228, 206, 130, 132, 104, 30, 219, 147, 82, 12, 48, 9, 98, 51, 34, 196, 135, 236, 115, 178, 10, 25, 8, 205, 28, 231, 140, 199, 224, 224, 162, 123, 88, 194, 202, 218, 116, 49, 233, 137, 112, 72, 235, 157, 125, 137, 74, 132, 49, 69, 232, 249, 247, 241, 47, 8, 112, 5, 72, 138, 149, 121, 2, 148, 204, 93, 231, 44, 129, 140, 149, 206, 104, 37, 208, 181, 86, 67, 122, 167, 114, 166, 200, 134, 180, 179, 139, 120, 16, 106, 171, 93, 58, 179, 175, 179, 244, 148, 36, 83, 171, 157, 182, 146, 111, 22, 0, 144, 110, 105, 47, 90, 236, 177, 47, 44, 35, 250, 237, 111, 141, 89, 6, 186, 22, 196, 32, 166, 23, 143, 17, 96, 127, 58, 139, 137, 29, 250, 164, 52, 141, 1, 13, 117, 82, 93, 241, 254, 120, 139, 165, 1, 114, 105, 7, 135, 180, 57, 252, 202, 233, 69, 253, 38, 11, 88, 223, 17, 203, 64, 162, 170, 127, 59, 163, 90, 8, 58, 149, 20, 214, 159, 26, 160, 120, 244, 123, 91, 203, 31, 86, 237, 20, 242, 66, 14, 182, 206, 127, 54, 119, 36, 182, 41, 129, 128, 193, 81, 19, 182, 120, 85, 23, 210, 220, 177, 202, 204, 102, 143, 81, 243, 233, 15, 67, 183, 157, 96, 122, 120, 130, 79, 154, 118, 36, 78, 152, 24, 123, 90, 86, 169, 200, 20, 29, 57, 210, 133, 16, 52, 24, 202, 20, 173, 101, 230, 61, 47, 105, 94, 244, 47, 217, 207, 87, 87, 93, 204, 138, 110, 8, 150, 200, 248, 129, 139, 134, 225, 34, 34, 150, 247, 70, 194, 144, 167, 21, 98, 161, 7, 38, 78, 3, 36, 42, 134, 161, 157, 203, 87, 34, 171, 28, 199, 64, 186, 130, 223, 103, 121, 88, 130, 50, 174, 10, 50, 79, 13, 92, 162, 99, 1, 85, 168, 122, 61, 132, 80, 85, 112, 238, 6, 179, 207, 162, 53, 16, 198, 250, 218, 206, 202, 242, 248, 31, 74, 86, 197, 133, 193, 36, 99, 133, 160, 223, 55, 36, 153, 101, 165, 188, 184, 179, 189, 36, 198, 254, 51, 199, 13, 116, 24, 10, 135, 101, 208, 166, 54, 107, 1, 166, 97, 38, 201, 45, 86, 218, 44, 163, 60, 173, 129, 69, 17, 204, 55, 85, 141, 80, 100, 88, 127, 108, 205, 65, 73, 159, 204, 216, 250, 240, 17, 121, 196, 196, 121, 46, 64, 25, 215, 88, 102, 221, 244, 35, 248, 96, 114, 66, 125, 134, 7, 83, 97, 0, 80, 166, 224, 216, 22, 213, 18, 42, 242, 126, 182, 81, 224, 10, 37, 193, 43, 174, 74, 159, 147, 58, 65, 217, 147, 110, 214, 95, 122, 174, 125, 121, 74, 66, 144, 74, 99, 52, 132, 104, 105, 139, 225, 128, 62, 1, 188, 7, 43, 185, 222, 134, 6, 216, 52, 211, 213, 83, 109, 176, 166, 152, 161, 48, 211, 124, 198, 241, 52, 237, 139, 155, 20, 233, 140, 55, 147, 68, 77, 166, 106, 81, 213, 250, 74, 125, 165, 213, 65, 147, 92, 31, 208, 242, 169, 90, 30, 239, 165, 143, 196, 85, 247, 121, 147, 38, 181, 170, 75, 30, 224, 105, 121, 27, 197, 246, 172, 39, 109, 6, 209, 42, 208, 13, 148, 153, 97, 247, 38, 168, 185, 76, 42, 102, 145, 166, 27, 242, 37, 136, 45, 245, 32, 200, 177, 225, 248, 154, 117, 172, 184, 37, 156, 208, 100, 151, 64, 16, 193, 254, 213, 205, 140, 207, 153, 64, 155, 57, 47, 237, 59, 231, 10, 130, 204, 72, 30, 17, 60, 76, 115, 161, 237, 104, 5, 38, 254, 90, 152, 208, 49, 194, 160, 243, 106, 78, 41, 251, 143, 104, 130, 180, 241, 98, 211, 238, 194, 224, 36, 242, 39, 109, 180, 67, 130, 210, 44, 8, 162, 150, 16, 76, 83, 40, 86, 97, 87, 187, 42, 50, 63, 35, 98, 192, 23, 138, 236, 90, 3, 157, 19, 5, 252, 228, 211, 239, 1, 85, 190, 54, 144, 218, 221, 184, 19, 89, 75, 138, 53, 115, 206, 31, 100, 99, 187, 80, 162, 222, 134, 167, 238, 117, 84, 36, 62, 178, 224, 147, 119, 160, 65, 244, 245, 157, 188, 184, 222, 42, 53, 188, 84, 51, 5, 22, 214, 229, 92, 249, 17, 78, 6, 79, 145, 92, 201, 53, 58, 45, 87, 90, 19, 194, 253, 18, 68, 87, 58, 48, 206, 85, 241, 173, 40, 0, 38, 75, 210, 227, 254, 150, 117, 168, 88, 41, 180, 31, 77, 239, 136, 37, 106, 222, 33, 63, 239, 217, 245, 29, 11, 255, 94, 181, 132, 91, 80, 152, 15, 224, 253, 187, 104, 191, 95, 180, 55, 108, 24, 65, 32, 27, 147, 201, 102, 102, 64, 245, 14, 196, 154, 169, 133, 191, 117, 49, 108, 75, 133, 72, 95, 48, 126, 1, 166, 187, 129, 223, 94, 96, 39, 225, 222, 196, 210, 129, 35, 24, 186, 145, 6, 173, 82, 67, 130, 97, 167, 138, 167, 57, 181, 228, 249, 247, 44, 29, 9, 140, 245, 49, 164, 210, 119, 91, 176, 15, 31, 206, 88, 229, 155, 23, 72, 114, 224, 237, 190, 194, 147, 133, 233, 170, 22, 64, 241, 162, 204, 52, 208, 138, 159, 29, 94, 25, 117, 103, 132, 232, 65, 198, 90, 183, 113, 6, 76, 52, 141, 199, 166, 170, 128, 199, 251, 60, 137, 86, 78, 52, 16, 72, 64, 112, 174, 67, 54, 73, 63, 55, 183, 30, 11, 48, 131, 7, 94, 151, 17, 166, 115, 62, 5, 221, 71, 30, 137, 35, 181, 250, 187, 68, 26, 187, 51, 202, 249, 76, 162, 63, 10, 144, 123, 119, 217, 155, 15, 214, 212, 52, 39, 208, 109, 210, 206, 230, 242, 186, 254, 170, 138, 52, 40, 130, 7, 102, 67, 28, 38, 106, 152, 122, 172, 184, 166, 81, 30, 236, 149, 213, 236, 174, 130, 140, 44, 143, 199, 9, 118, 58, 11, 30, 126, 139, 39, 128, 92, 83, 242, 207, 200, 157, 245, 147, 84, 207, 140, 120, 59, 56, 228, 145, 177, 130, 48, 139, 78, 101, 124, 42, 228, 129, 172, 14, 248, 144, 142, 189, 38, 158, 58, 85, 84, 75, 136, 180, 175, 13, 184, 0, 26, 128, 234, 151, 167, 40, 6, 163, 8, 23, 57, 69, 42, 89, 174, 50, 0, 216, 186, 166, 7, 143, 123, 95, 23, 26, 134, 127, 125, 199, 117, 26, 215, 129, 212, 119, 83, 2, 66, 96, 247, 126, 241, 49, 171, 186, 222, 146, 234, 115, 199, 123, 112, 79, 147, 53, 210, 95, 192, 166, 49, 137, 245, 80, 120, 14, 184, 242, 237, 131, 27, 141, 100, 178, 185, 54, 245, 152, 55, 243, 88, 45, 122, 48, 229, 214, 55, 118, 105, 222, 26, 189, 68, 42, 21, 34, 57, 165, 246, 109, 35, 84, 45, 76, 196, 116, 127, 88, 180, 10, 179, 103, 226, 208, 33, 91, 111, 12, 231, 221, 166, 64, 199, 93, 87, 58, 164, 108, 23, 126, 169, 216, 119, 68, 104, 24, 51, 156, 71, 175, 181, 93, 184, 124, 171, 34, 72, 115, 95, 148, 72, 166, 241, 178, 223, 36, 10, 12, 219, 50, 172, 139, 152, 26, 232, 185, 249, 95, 249, 8, 244, 20, 78, 136, 141, 145, 169, 168, 2, 208, 9, 30, 37, 50, 149, 47, 50, 17, 64, 214, 168, 32, 23, 228, 232, 31, 78, 219, 77, 8, 80, 253, 41, 79, 8, 123, 65, 234, 36, 78, 151, 23, 68, 18, 70, 10, 9, 9, 33, 142, 129, 115, 143, 191, 127, 209, 141, 202, 189, 55, 120, 16, 148, 184, 122, 178, 77, 10, 149, 18, 30, 6, 101, 53, 90, 155, 239, 253, 82, 57, 11, 125, 84, 7, 175, 116, 62, 210, 232, 112, 130, 253, 105, 153, 203, 31, 120, 251, 241, 45, 41, 127, 96, 146, 11, 187, 180, 115, 21, 63, 182, 213, 196, 175, 255, 162, 31, 233, 65, 197, 110, 42, 136, 54, 118, 234, 176, 3, 252, 83, 4, 107, 133, 19, 226, 34, 163, 232, 31, 39, 171, 178, 242, 36, 69, 64, 33, 167, 139, 81, 184, 160, 207, 119, 37, 137, 40, 165, 50, 167, 243, 188, 82, 142, 91, 2, 0, 209, 16, 166, 152, 134, 113, 185, 236, 253, 161, 120, 90, 94, 189, 81, 201, 224, 60, 66, 82, 23, 12, 199, 197, 86, 198, 16, 54, 174, 237, 121, 186, 244, 141, 50, 26, 152, 120, 78, 52, 71, 115, 40, 94, 156, 22, 162, 241, 219, 90, 212, 236, 21, 153, 170, 142, 20, 200, 251, 49, 98, 192, 173, 14, 167, 199, 167, 176, 235, 111, 61, 243, 30, 215, 35, 113, 127, 122, 250, 79, 162, 40, 130, 81, 31, 51, 177, 240, 9, 31, 192, 210, 151, 171, 78, 201, 50, 102, 227, 75, 196, 239, 232, 175, 240, 119, 205, 191, 180, 209, 68, 123, 86, 244, 114, 244, 209, 7, 35, 17, 16, 89, 133, 89, 42, 9, 18, 124, 21, 252, 101, 244, 88, 79, 214, 234, 145, 140, 52, 118, 47, 44, 121, 43, 14, 6, 157, 26, 16, 172, 252, 85, 94, 84, 59, 134, 19, 119, 10, 70, 91, 157, 246, 8, 74, 32, 15, 23, 230, 2, 205, 188, 103, 237, 92, 19, 88, 21, 147, 135, 117, 124, 107, 140, 39, 152, 51, 56, 246, 122, 153, 174, 106, 145, 140, 146, 78, 180, 243, 212, 62, 46, 3, 131, 137, 78, 56, 79, 160, 252, 117, 84, 126, 199, 194, 240, 227, 23, 188, 40, 206, 72, 68, 40, 58, 91, 183, 80, 40, 31, 65, 9, 70, 23, 34, 64, 199, 213, 138, 80, 140, 58, 202, 215, 115, 223, 92, 181, 218, 116, 252, 210, 190, 210, 54, 166, 241, 66, 132, 62, 98, 109, 158, 51, 52, 89, 69, 24, 171, 176, 235, 116, 175, 18, 111, 80, 167, 209, 170, 150, 194, 152, 23, 96, 162, 41, 244, 232, 80, 85, 76, 226, 126, 240, 196, 214, 81, 40, 183, 225, 102, 10, 166, 57, 231, 230, 232, 149, 164, 116, 112, 122, 0, 182, 53, 199, 252, 55, 50, 111, 243, 200, 64, 191, 29, 240, 86, 187, 126, 133, 121, 249, 249, 37, 58, 174, 209, 39, 152, 103, 151, 131, 127, 207, 154, 14, 188, 239, 28, 107, 33, 10, 57, 82, 158, 116, 63, 225, 29, 103, 80, 134, 84, 245, 37, 13, 1, 70, 95, 180, 82, 191, 0, 67, 243, 67, 218, 148, 30, 248, 160, 133, 92, 83, 190, 197, 251, 150, 117, 28, 178, 121, 17, 16, 209, 4, 188, 155, 55, 82, 134, 128, 3, 104, 142, 132, 144, 32, 101, 0, 223, 166, 79, 49, 108, 64, 231, 162, 6, 27, 94, 116, 68, 235, 168, 36, 115, 39, 191, 151, 28, 202, 228, 35, 90, 53, 172, 170, 173, 151, 236, 174, 197, 19, 85, 216, 192, 158, 128, 35, 6, 88, 21, 25, 158, 92, 18, 213, 22, 136, 119, 149, 124, 213, 103, 197, 6, 206, 174, 36, 196, 199, 208, 68, 57, 84, 28, 218, 251, 214, 75, 157, 254, 46, 61, 228, 188, 87, 93, 125, 155, 38, 175, 4, 36, 160, 31, 177, 70, 222, 245, 85, 246, 69, 109, 45, 77, 151, 175, 202, 23, 17, 139, 66, 77, 166, 155, 251, 82, 156, 11, 77, 102, 222, 20, 170, 255, 232, 162, 41, 73, 26, 89, 118, 58, 126, 212, 207, 108, 55, 5, 136, 150, 240, 223, 185, 103, 231, 115, 182, 189, 39, 164, 162, 182, 112, 113, 11, 93, 250, 108, 247, 231, 143, 172, 67, 223, 221, 224, 24, 116, 128, 119, 232, 143, 90, 27, 149, 49, 226, 195, 238, 66, 233, 15, 97, 137, 170, 155, 236, 124, 185, 95, 192, 121, 36, 82, 76, 249, 31, 46, 102, 185, 14, 243, 30, 244, 217, 184, 156, 156, 207, 35, 38, 89, 107, 212, 139, 75, 161, 16, 78, 232, 76, 209, 7, 92, 94, 80, 159, 58, 162, 138, 216, 206, 231, 93, 85, 198, 140, 90, 200, 170, 79, 118, 26, 52, 168, 111, 165, 224, 91, 45, 85, 42, 162, 142, 55, 0, 19, 167, 142, 86, 74, 235, 43, 230, 3, 162, 93, 33, 239, 43, 181, 253, 155, 106, 28, 48, 150, 43, 234, 102, 187, 247, 187, 40, 43, 158, 33, 48, 242, 214, 95, 182, 126, 3, 25, 218, 47, 163, 140, 217, 6, 221, 199, 57, 76, 182, 244, 110, 49, 168, 240, 129, 31, 226, 185, 35, 18, 185, 189, 2, 17, 190, 134, 137, 29, 76, 118, 48, 216, 33, 188, 103, 160, 66, 143, 23, 230, 255, 24, 238, 6, 111, 18, 214, 163, 244, 30, 36, 4, 216, 31, 162, 60, 127, 235, 203, 67, 34, 69, 20, 227, 220, 56, 107, 78, 81, 10, 160, 169, 19, 255, 211, 126, 46, 77, 46, 152, 46, 114, 135, 139, 23, 3, 172, 52, 80, 86, 11, 5, 190, 51, 86, 190, 67, 0, 75, 17, 160, 229, 12, 254, 152, 221, 3, 213, 220, 213, 244, 51, 157, 73, 251, 206, 213, 43, 113, 247, 245, 189, 52, 226, 250, 109, 212, 4, 168, 132, 24, 137, 160, 175, 219, 204, 156, 32, 253, 121, 8, 209, 200, 96, 88, 93, 66, 243, 84, 76, 148, 142, 229, 86, 31, 106, 10, 23, 136, 200, 132, 152, 150, 51, 125, 202, 13, 202, 63, 110, 38, 125, 12, 113, 17, 162, 92, 217, 24, 108, 235, 209, 81, 65, 202, 179, 60, 176, 11, 91, 62, 45, 126, 96, 9, 66, 153, 134, 11, 40, 231, 205, 66, 5, 249, 92, 99, 119, 206, 105, 108, 207, 79, 44, 61, 10, 179, 18, 7, 33, 15, 68, 204, 40, 214, 171, 223, 177, 98, 94, 176, 243, 165, 152, 231, 154, 1, 67, 226, 236, 109, 137, 202, 72, 234, 243, 23, 156, 41, 105, 118, 40, 72, 112, 147, 53, 76, 126, 158, 255, 145, 213, 214, 43, 241, 194, 125, 227, 104, 241, 196, 244, 237, 140, 214, 62, 210, 249, 207, 143, 58, 106, 182, 10, 75, 247, 114, 19, 127, 210, 217, 102, 190, 200, 149, 36, 59, 137, 204, 222, 223, 123, 63, 215, 84, 249, 49, 149, 83, 137, 205, 224, 192, 44, 166, 101, 109, 181, 98, 219, 17, 169, 186, 35, 11, 108, 131, 75, 185, 220, 58, 214, 129, 67, 15, 106, 220, 67, 76, 7, 247, 154, 201, 146, 25, 224, 51, 169, 180, 61, 73, 169, 216, 163, 64, 179, 144, 61, 184, 163, 163, 8, 113, 40, 42, 53, 46, 80, 50, 199, 156, 6, 138, 44, 86, 130, 12, 195, 251, 191, 99, 122, 127, 116, 155, 248, 205, 86, 172, 49, 197, 132, 101, 124, 32, 23, 225, 78, 252, 23, 182, 27, 10, 93, 135, 220, 98, 246, 62, 157, 134, 102, 1, 113, 244, 65, 39, 3, 106, 168, 22, 142, 16, 64, 140, 15, 80, 99, 35, 22, 179, 165, 166, 85, 100, 233, 90, 229, 18, 78, 92, 204, 255, 218, 224, 121, 218, 149, 146, 101, 90, 237, 209, 141, 172, 71, 193, 90, 175, 189, 165, 169, 88, 27, 15, 197, 225, 132, 32, 122, 215, 89, 92, 130, 175, 160, 186, 201, 20, 61, 64, 162, 133, 3, 43, 242, 1, 253, 252, 181, 136, 253, 218, 163, 130, 111, 36, 14, 133, 7, 219, 204, 145, 34, 32, 170, 193, 236, 151, 74, 74, 147, 76, 138, 107, 121, 122, 117, 158, 28, 246, 50, 255, 135, 138, 164, 17, 38, 164, 210, 75, 174, 116, 208, 146, 145, 163, 54, 161, 142, 104, 242, 253, 76, 97, 186, 92, 131, 69, 189, 217, 241, 225, 157, 78, 37, 78, 96, 220, 194, 3, 246, 214, 121, 178, 93, 26, 46, 165, 137, 4, 223, 97, 14, 94, 50, 52, 234, 50, 86, 69, 141, 165, 121, 202, 152, 37, 85, 22, 135, 212, 233, 30, 106, 208, 152, 10, 196, 23, 144, 2, 199, 18, 43, 47, 236, 83, 30, 54, 249, 7, 145, 116, 239, 36, 191, 115, 171, 101, 77, 39, 102, 167, 249, 152, 234, 193, 141, 24, 143, 254, 132, 241, 49, 221, 223, 189, 103, 12, 245, 20, 240, 213, 121, 152, 82, 69, 179, 192, 186, 6, 66, 56, 22, 22, 144, 240, 125, 87, 13, 248, 93, 108, 229, 245, 148, 14, 62, 131, 45, 100, 201, 63, 68, 118, 249, 66, 98, 132, 141, 74, 140, 20, 220, 81, 134, 141, 172, 190, 199, 149, 205, 93, 57, 45, 113, 240, 15, 161, 4, 122, 228, 28, 150, 220, 183, 88, 226, 51, 117, 6, 107, 122, 39, 165, 25, 15, 197, 199, 149, 157, 131, 214, 44, 253, 240, 247, 241, 139, 229, 232, 212, 218, 113, 23, 188, 132, 147, 250, 252, 14, 145, 7, 246, 101, 27, 190, 155, 27, 224, 20, 37, 63, 2, 54, 38, 5, 34, 186, 2, 107, 221, 161, 66, 248, 217, 63, 79, 202, 83, 53, 253, 127, 87, 252, 108, 133, 175, 14, 82, 140, 132, 150, 94, 234, 120, 120, 214, 32, 234, 53, 81, 60, 107, 255, 166, 188, 89, 153, 9, 173, 234, 85, 244, 11, 76, 217, 190, 22, 16, 147, 80, 23, 113, 126, 241, 84, 57, 134, 84, 152, 42, 97, 158, 176, 247, 138, 249, 54, 110, 103, 112, 170, 52, 238, 109, 27, 131, 137, 84, 37, 53, 162, 45, 12, 135, 228, 179, 197, 44, 163, 143, 33, 0, 125, 198, 45, 122, 93, 252, 148, 208, 163, 242, 99, 126, 195, 122, 247, 103, 141, 22, 208, 148, 113, 236, 210, 223, 57, 241, 128, 9, 40, 105, 207, 109, 69, 229, 204, 238, 98, 124, 100, 227, 17, 185, 226, 18, 119, 192, 50, 24, 98, 196, 187, 230, 224, 60, 191, 157, 41, 179, 95, 76, 153, 6, 217, 232, 93, 2, 110, 41, 148, 140, 203, 9, 156, 225, 174, 26, 16, 1, 182, 20, 242, 221, 114, 72, 21, 141, 226, 213, 200, 17, 198, 16, 100, 176, 216, 73, 240, 76, 6, 237, 78, 200, 119, 77, 39, 240, 158, 31, 148, 131, 187, 63, 232, 210, 64, 179, 250, 232, 53, 78, 40, 18, 89, 33, 39, 140, 209, 56, 112, 249, 146, 222, 7, 127, 161, 65, 146, 33, 146, 127, 56, 114, 32, 84, 80, 24, 112, 229, 230, 213, 94, 91, 148, 244, 109, 13, 157, 111, 51, 201, 173, 173, 66, 136, 150, 6, 111, 111, 154, 11, 17, 116, 13, 27, 209, 242, 59, 99, 21, 169, 222, 68, 72, 222, 164, 61, 217, 201, 53, 205, 33, 15, 141, 10, 80, 10, 215, 82, 125, 43, 165, 54, 184, 26, 151, 71, 203, 206, 50, 58, 57, 161, 52, 168, 22, 242, 179, 125, 111, 43, 91, 87, 3, 7, 126, 177, 54, 163, 148, 93, 255, 55, 124, 43, 141, 72, 166, 34, 147, 163, 135, 0, 50, 126, 152, 165, 1, 244, 118, 95, 96, 80, 4, 187, 206, 110, 239, 214, 183, 209, 125, 252, 40, 182, 126, 134, 2, 45, 182, 138, 179, 2, 102, 138, 101, 19, 92, 134, 39, 69, 120, 57, 190, 57, 130, 245, 73, 221, 23, 174, 183, 93, 28, 157, 42, 231, 217, 206, 139, 115, 38, 188, 129, 124, 12, 110, 89, 108, 132, 51, 142, 244, 135, 245, 251, 68, 128, 56, 218, 26, 248, 129, 34, 157, 167, 84, 138, 245, 95, 64, 172, 74, 9, 252, 17, 188, 73, 110, 229, 78, 230, 153, 231, 44, 191, 46, 126, 39, 241, 123, 223, 46, 47, 39, 69, 139, 118, 7, 184, 183, 166, 171, 61, 112, 200, 111, 196, 61, 123, 217, 188, 193, 102, 212, 105, 92, 0, 159, 27, 176, 74, 50, 250, 107, 68, 26, 196, 203, 239, 0, 42, 184, 35, 143, 14, 106, 172, 76, 147, 112, 100, 25, 215, 41, 170, 126, 95, 108, 218, 82, 36, 9, 116, 177, 182, 123, 254, 190, 56, 53, 125, 239, 66, 243, 145, 10, 61, 102, 57, 109, 197, 80, 159, 97, 253, 120, 48, 249, 97, 177, 2, 185, 153, 14, 201, 121, 165, 107, 133, 118, 248, 220, 68, 206, 96, 137, 154, 121, 215, 217, 189, 74, 76, 204, 222, 35, 222, 227, 83, 52, 77, 180, 122, 123, 184, 249, 212, 240, 22, 200, 136, 194, 206, 111, 120, 162, 253, 186, 155, 213, 149, 39, 97, 252, 132, 95, 70, 241, 47, 54, 19, 143, 188, 149, 148, 238, 161, 194, 121, 17, 93, 111, 133, 242, 201, 212, 183, 138, 152, 178, 37, 230, 140, 107, 137, 122, 163, 75, 5, 135, 225, 186, 32, 50, 131, 104, 197, 16, 87, 163, 180, 251, 170, 27, 181, 241, 85, 179, 126, 116, 219, 206, 79, 242, 5, 101, 41, 165, 80, 223, 66, 32, 68, 71, 88, 53, 117, 216, 209, 172, 112, 212, 129, 152, 49, 109, 61, 236, 79, 222, 156, 11, 239, 31, 202, 61, 123, 205, 58, 128, 7, 95, 27, 139, 135, 91, 119, 192, 187, 13, 99, 165, 103, 254, 140, 195, 234, 100, 79, 231, 154, 176, 233, 82, 214, 191, 60, 193, 53, 143, 213, 250, 131, 91, 40, 145, 225, 212, 106, 77, 201, 106, 185, 120, 141, 225, 195, 5, 110, 132, 235, 189, 95, 42, 90, 55, 194, 116, 222, 147, 91, 172, 175, 220, 232, 23, 95, 201, 4, 150, 102, 250, 23, 196, 86, 120, 28, 42, 188, 48, 46, 144, 66, 85, 124, 42, 187, 137, 212, 196, 230, 245, 111, 147, 204, 161, 63, 35, 100, 22, 144, 232, 208, 88, 101, 151, 10, 31, 210, 90, 1, 4, 202, 135, 120, 102, 81, 121, 189, 201, 44, 222, 209, 48, 188, 152, 108, 250, 65, 173, 13, 240, 1, 123, 109, 36, 163, 137, 172, 69, 250, 162, 10, 75, 89, 57, 102, 147, 77, 18, 93, 4, 104, 216, 225, 207, 229, 24, 57, 187, 228, 99, 218, 204, 58, 115, 44, 120, 209, 99, 200, 214, 156, 221, 139, 17, 131, 159, 164, 233, 160, 6, 2, 27, 15, 60, 204, 219, 18, 190, 164, 210, 203, 188, 34, 116, 36, 134, 101, 193, 75, 88, 189, 222, 245, 174, 203, 0, 199, 161, 57, 22, 4, 219, 77, 24, 36, 141, 70, 215, 219, 31, 92, 105, 10, 70, 102, 169, 244, 215, 230, 169, 88, 240, 157, 190, 5, 130, 186, 232, 76, 117, 45, 230, 181, 115, 67, 35, 172, 15, 165, 30, 125, 180, 57, 245, 25, 97, 244, 170, 182, 180, 107, 24, 231, 195, 140, 97, 50, 220, 220, 193, 196, 144, 49, 32, 90, 62, 206, 109, 85, 35, 135, 220, 249, 255, 78, 103, 207, 98, 156, 228, 213, 254, 22, 231, 247, 191, 152, 250, 37, 8, 172, 204, 136, 181, 30, 75, 9, 174, 226, 175, 172, 238, 237, 107, 27, 230, 46, 197, 240, 140, 162, 225, 65, 165, 249, 209, 49, 152, 19, 102, 96, 96, 206, 145, 40, 39, 155, 68, 8, 228, 176, 0, 112, 6, 27, 164, 12, 220, 185, 140, 95, 71, 202, 125, 234, 15, 246, 52, 206, 5, 103, 198, 6, 65, 12, 209, 87, 223, 121, 239, 124, 120, 128, 156, 194, 250, 239, 133, 247, 227, 76, 107, 73, 38, 228, 241, 33, 19, 61, 138, 70, 37, 45, 58, 239, 13, 176, 27, 17, 41, 202, 233, 62, 223, 175, 157, 36, 234, 192, 23, 180, 64, 61, 231, 103, 173, 83, 169, 241, 51, 201, 81, 67, 217, 79, 246, 203, 247, 233, 117, 253, 153, 252, 50, 54, 251, 120, 254, 215, 105, 168, 47, 128, 61, 139, 243, 91, 142, 166, 179, 26, 97, 65, 171, 167, 244, 114, 188, 192, 101, 23, 55, 115, 205, 222, 209, 59, 111, 83, 147, 188, 26, 163, 123, 244, 252, 98, 148, 104, 110, 81, 27, 167, 67, 200, 85, 251, 80, 163, 117, 36, 78, 137, 95, 34, 59, 163, 172, 164, 89, 247, 72, 64, 181, 41, 86, 255, 184, 158, 238, 185, 226, 70, 112, 123, 179, 3, 73, 1, 111, 110, 161, 49, 29, 112, 124, 244, 110, 238, 247, 14, 14, 76, 199, 159, 197, 179, 250, 244, 247, 85, 172, 56, 98, 70, 232, 99, 204, 226, 75, 121, 73, 239, 205, 191, 210, 74, 92, 4, 0, 234, 193, 196, 194, 173, 68, 44, 15, 40, 155, 166, 205, 197, 52, 207, 169, 123, 143, 5, 179, 234, 31, 202, 86, 56, 24, 233, 62, 121, 211, 133, 19, 209, 88, 32, 158, 85, 70, 85, 248, 249, 48, 225, 47, 86, 13, 128, 6, 140, 36, 31, 128, 58, 215, 176, 81, 129, 125, 172, 224, 209, 207, 246, 173, 207, 193, 22, 97, 60, 173, 183, 77, 253, 155, 18, 178, 36, 113, 186, 216, 70, 53, 47, 176, 176, 110, 88, 134, 81, 218, 164, 230, 45, 241, 27, 80, 100, 97, 7, 241, 118, 72, 200, 165, 187, 155, 190, 94, 40, 30, 205, 153, 71, 104, 141, 15, 220, 15, 153, 177, 200, 155, 239, 120, 101, 136, 17, 153, 255, 88, 163, 185, 221, 199, 216, 98, 69, 95, 59, 175, 164, 233, 253, 133, 225, 2, 156, 121, 93, 233, 11, 172, 164, 252, 66, 25, 59, 141, 195, 114, 131, 224, 50, 139, 227, 135, 240, 4, 171, 14, 206, 140, 207, 55, 211, 159, 135, 8, 193, 239, 233, 207, 53, 244, 238, 84, 19, 73, 1, 94, 104, 42, 148, 26, 3, 101, 198, 153, 239, 239, 34, 230, 253, 108, 6, 54, 59, 54, 252, 49, 86, 67, 90, 174, 196, 140, 239, 181, 64, 85, 11, 44, 9, 229, 249, 136, 72, 125, 199, 191, 242, 156, 145, 81, 70, 193, 44, 181, 133, 36, 211, 242, 30, 144, 244, 7, 89, 97, 98, 244, 61, 184, 3, 174, 101, 173, 221, 239, 145, 166, 225, 182, 82, 202, 76, 76, 150, 198, 93, 120, 100, 254, 47, 21, 168, 61, 38, 165, 48, 31, 76, 59, 37, 89, 106, 87, 203, 179, 248, 156, 162, 64, 50, 76, 5, 123, 113, 9, 215, 226, 23, 205, 44, 245, 117, 179, 251, 160, 106, 205, 130, 187, 253, 151, 224, 24, 32, 107, 210, 221, 62, 9, 133, 192, 119, 143, 232, 69, 204, 98, 5, 86, 121, 17, 245, 180, 249, 233, 48, 185, 56, 62, 20, 215, 140, 6, 220, 139, 44, 46, 180, 236, 215, 250, 81, 195, 254, 101, 135, 40, 135, 235, 141, 22, 183, 1, 31, 3, 89, 252, 87, 207, 58, 24, 161, 225, 28, 217, 174, 122, 71, 46, 100, 25, 85, 189, 177, 45, 185, 53, 210, 109, 222, 240, 244, 82, 75, 188, 17, 191, 45, 184, 220, 132, 105, 75, 151, 12, 5, 236, 148, 150, 10, 22, 199, 26, 143, 142, 159, 137, 87, 142, 70, 241, 67, 5, 15, 235, 87, 20, 224, 207, 210, 38, 60, 245, 34, 238, 108, 193, 204, 194, 179, 7, 131, 158, 63, 245, 255, 95, 34, 247, 63, 100, 39, 85, 51, 182, 220, 69, 125, 88, 223, 39, 160, 176, 115, 100, 232, 150, 20, 40, 205, 132, 231, 201, 97, 40, 66, 207, 53, 195, 39, 59, 4, 191, 140, 210, 66, 46, 104, 196, 64, 35, 22, 151, 210, 88, 220, 108, 96, 95, 175, 97, 70, 25, 90, 111, 112, 123, 106, 204, 22, 59, 106, 248, 232, 178, 149, 32, 36, 16, 254, 191, 202, 95, 177, 177, 116, 95, 213, 205, 170, 254, 96, 184, 233, 166, 10, 156, 95, 254, 105, 205, 55, 158, 61, 129, 215, 98, 230, 107, 3, 63, 157, 155, 207, 247, 157, 79, 254, 138, 189, 94, 248, 244, 152, 167, 111, 16, 202, 234, 81, 38, 253, 1, 180, 210, 24, 89, 184, 252, 85, 6, 35, 223, 9, 34, 83, 254, 224, 69, 138, 199, 37, 90, 24, 21, 136, 15, 51, 50, 30, 54, 216, 227, 156, 117, 242, 100, 52, 163, 89, 33, 164, 98, 17, 89, 176, 21, 155, 15, 146, 216, 86, 117, 168, 3, 121, 75, 252, 116, 80, 199, 162, 215, 74, 4, 31, 118, 186, 206, 249, 116, 221, 99, 65, 54, 33, 13, 78, 210, 35, 210, 53, 122, 190, 198, 221, 183, 134, 204, 79, 8, 25, 210, 188, 253, 85, 201, 46, 250, 3, 232, 208, 37, 12, 223, 72, 151, 148, 238, 168, 204, 252, 31, 1, 28, 118, 248, 170, 149, 73, 59, 32, 202, 101, 151, 15, 8, 189, 163, 217, 141, 150, 116, 65, 129, 166, 147, 54, 1, 66, 214, 228, 77, 76, 12, 105, 1, 82, 129, 123, 28, 50, 106, 239, 115, 189, 81, 165, 89, 64, 162, 72, 173, 162, 12, 143, 161, 42, 195, 52, 49, 79, 130, 231, 207, 125, 113, 21, 43, 184, 120, 97, 79, 162, 36, 125, 204, 253, 23, 235, 22, 87, 250, 129, 46, 51, 140, 184, 122, 5, 176, 91, 77, 121, 99, 94, 246, 217, 247, 181, 100, 190, 81, 43, 71, 97, 216, 82, 144, 50, 215, 72, 88, 136, 202, 167, 146, 20, 108, 111, 48, 8, 128, 77, 59, 179, 227, 116, 102, 106, 170, 123, 183, 150, 15, 20, 226, 177, 244, 199, 210, 225, 96, 11, 232, 230, 107, 230, 92, 88, 7, 200, 250, 162, 143, 245, 215, 194, 174, 126, 31, 145, 211, 158, 210, 125, 222, 86, 80, 105, 207, 96, 197, 240, 16, 121, 229, 16, 43, 32, 18, 97, 116, 249, 105, 53, 10, 109, 163, 226, 90, 43, 205, 27, 190, 20, 75, 5, 119, 97, 81, 100, 236, 30, 13, 42, 30, 148, 237, 225, 149, 35, 17, 17, 5, 142, 35, 250, 215, 197, 155, 17, 111, 145, 129, 53, 57, 0, 200, 249, 89, 176, 189, 1, 116, 36, 15, 140, 182, 95, 214, 143, 116, 235, 82, 165, 53, 192, 181, 183, 131, 106, 5, 142, 35, 31, 235, 177, 90, 203, 121, 167, 216, 165, 33, 47, 225, 21, 227, 222, 235, 82, 74, 195, 197, 215, 79, 205, 108, 145, 185, 88, 224, 207, 185, 43, 148, 199, 55, 206, 55, 53, 36, 83, 228, 15, 155, 240, 52, 139, 36, 169, 202, 140, 11, 148, 201, 100, 116, 5, 4, 93, 209, 255, 14, 104, 27, 30, 138, 224, 182, 136, 68, 27, 18, 127, 61, 231, 13, 79, 211, 129, 170, 83, 133, 121, 42, 201, 91, 161, 157, 93, 92, 228, 230, 85, 42, 72, 252, 142, 85, 49, 49, 90, 248, 105, 64, 101, 17, 183, 104, 71, 66, 88, 231, 243, 185, 127, 109, 96, 16, 144, 67, 137, 142, 51, 15, 176, 229, 195, 244, 121, 225, 235, 1, 47, 26, 187, 199, 29, 84, 42, 209, 192, 23, 24, 66, 139, 105, 59, 42, 98, 42, 59, 121, 42, 19, 252, 216, 83, 170, 15, 153, 227, 209, 242, 192, 84, 127, 225, 7, 106, 52, 122, 11, 197, 13, 114, 196, 194, 67, 217, 106, 201, 9, 33, 188, 44, 80, 156, 138, 13, 234, 189, 29, 240, 190, 247, 231, 194, 113, 145, 182, 63, 184, 81, 203, 88, 173, 43, 148, 126, 63, 55, 30, 179, 169, 8, 4, 211, 7, 73, 48, 152, 169, 65, 139, 239, 39, 42, 66, 67, 209, 4, 20, 102, 193, 58, 22, 155, 229, 248, 233, 99, 238, 62, 173, 71, 56, 43, 153, 129, 253, 161, 69, 87, 94, 50, 53, 1, 18, 167, 179, 253, 232, 5, 244, 180, 73, 202, 206, 199, 177, 156, 168, 144, 156, 112, 247, 187, 93, 121, 233, 149, 16, 80, 145, 67, 175, 57, 252, 185, 218, 56, 13, 0, 164, 160, 84, 19, 68, 168, 14, 89, 77, 225, 2, 14, 83, 124, 56, 55, 162, 229, 39, 196, 249, 27, 240, 90, 133, 241, 237, 79, 169, 233, 173, 143, 255, 36, 249, 166, 116, 116, 177, 216, 149, 224, 26, 64, 44, 177, 25, 5, 253, 13, 50, 65, 237, 15, 138, 43, 95, 108, 20, 129, 184, 138, 121, 110, 240, 91, 12, 102, 187, 183, 232, 196, 253, 140, 90, 174, 171, 9, 150, 159, 88, 97, 56, 227, 158, 92, 227, 209, 227, 137, 248, 248, 182, 167, 229, 110, 188, 85, 30, 74, 7, 72, 99, 106, 178, 181, 90, 248, 101, 59, 184, 64, 26, 188, 1, 76, 145, 191, 118, 78, 161, 90, 157, 108, 121, 235, 154, 90, 112, 236, 204, 226, 67, 193, 204, 136, 84, 224, 47, 165, 0, 44, 46, 226, 144, 113, 146, 133, 73, 73, 101, 61, 49, 183, 45, 136, 209, 10, 185, 207, 24, 241, 253, 134, 113, 248, 233, 113, 75, 161, 177, 2, 66, 216, 62, 176, 59, 4, 163, 90, 175, 96, 238, 243, 195, 62, 32, 61, 225, 75, 178, 126, 96, 109, 122, 231, 239, 180, 196, 203, 20, 193, 0, 203, 49, 146, 34, 127, 250, 192, 204, 89, 255, 86, 9, 155, 120, 161, 237, 64, 148, 50, 54, 120, 95, 190, 121, 93, 65, 125, 191, 202, 190, 16, 112, 191, 77, 28, 125, 90, 84, 128, 7, 218, 251, 177, 71, 144, 162, 60, 43, 217, 255, 49, 53, 101, 131, 42, 192, 64, 123, 188, 33, 217, 147, 248, 63, 75, 61, 69, 149, 248, 90, 112, 148, 132, 15, 114, 114, 66, 235, 198, 222, 166, 108, 140, 172, 248, 14, 252, 63, 158, 153, 145, 61, 115, 160, 194, 30, 202, 34, 18, 158, 139, 132, 175, 73, 77, 36, 10, 85, 156, 180, 44, 92, 245, 67, 124, 21, 55, 3, 181, 208, 16, 78, 144, 45, 150, 153, 171, 99, 203, 120, 102, 144, 205, 149, 16, 168, 245, 60, 67, 171, 105, 163, 74, 101, 197, 243, 77, 206, 187, 79, 125, 54, 232, 50, 99, 60, 209, 21, 224, 203, 240, 54, 5, 64, 190, 113, 52, 43, 114, 153, 57, 24, 246, 249, 67, 5, 116, 108, 167, 24, 152, 157, 145, 145, 184, 135, 9, 21, 19, 40, 208, 87, 254, 48, 249, 255, 162, 39, 75, 119, 20, 188, 245, 166, 23, 134, 69, 64, 7, 242, 184, 89, 17, 166, 36, 158, 76, 105, 235, 212, 75, 14, 179, 168, 51, 204, 42, 50, 187, 5, 118, 76, 173, 58, 155, 172, 195, 168, 44, 28, 129, 9, 188, 8, 114, 79, 57, 233, 150, 175, 36, 213, 59, 176, 207, 25, 10, 148, 80, 3, 116, 14, 120, 161, 233, 250, 36, 212, 116, 26, 203, 37, 129, 42, 24, 65, 190, 157, 65, 193, 132, 195, 181, 27, 125, 161, 237, 17, 53, 203, 32, 29, 134, 120, 218, 120, 84, 139, 39, 121, 244, 190, 167, 179, 165, 113, 169, 219, 31, 137, 86, 15, 43, 237, 99, 71, 43, 151, 167, 221, 182, 112, 157, 111, 40, 91, 133, 17, 87, 222, 83, 221, 39, 188, 149, 51, 45, 135, 104, 27, 148, 246, 248, 28, 160, 219, 125, 198, 41, 151, 206, 26, 167, 167, 94, 41, 105, 251, 4, 35, 251, 166, 1, 111, 156, 209, 126, 39, 93, 105, 234, 197, 64, 185, 177, 48, 182, 153, 99, 34, 27, 109, 126, 192, 183, 20, 117, 131, 209, 93, 37, 71, 96, 87, 4, 183, 52, 16, 4, 125, 12, 53, 9, 76, 104, 151, 170, 9, 186, 74, 152, 140, 173, 231, 52, 113, 11, 115, 6, 75, 62, 208, 192, 102, 71, 112, 204, 74, 206, 20, 82, 5, 153, 16, 194, 186, 179, 190, 170, 219, 251, 109, 24, 88, 223, 137, 185, 190, 217, 168, 80, 101, 210, 105, 223, 115, 124, 71, 91, 192, 48, 42, 206, 220, 14, 48, 3, 232, 99, 51, 247, 39, 146, 151, 148, 230, 92, 113, 123, 184, 124, 169, 55, 5, 249, 226, 156, 86, 81, 167, 144, 164, 169, 73, 241, 61, 56, 20, 247, 116, 172, 147, 170, 3, 6, 80, 189, 3, 220, 11, 62, 56, 129, 179, 145, 205, 91, 46, 65, 29, 114, 184, 208, 118, 239, 103, 33, 224, 177, 109, 150, 19, 19, 100, 136, 166, 97, 101, 168, 9, 7, 29, 143, 169, 93, 186, 76, 23, 3, 227, 93, 240, 235, 94, 195, 2, 46, 188, 75, 37, 252, 60, 62, 186, 250, 143, 133, 96, 127, 208, 127, 55, 176, 247, 232, 99, 196, 99, 197, 107, 162, 234, 47, 109, 27, 121, 66, 73, 160, 1, 52, 29, 72, 89, 252, 231, 65, 236, 250, 198, 186, 129, 21, 102, 98, 57, 20, 184, 221, 174, 48, 37, 11, 185, 123, 187, 102, 78, 92, 3, 69, 161, 222, 33, 150, 250, 117, 85, 118, 111, 4, 145, 242, 62, 255, 27, 48, 72, 87, 253, 32, 157, 130, 68, 63, 224, 223, 227, 29, 217, 177, 173, 61, 206, 34, 14, 205, 70, 161, 224, 28, 131, 197, 203, 105, 33, 178, 131, 144, 186, 147, 119, 167, 172, 7, 116, 52, 214, 52, 191, 16, 20, 138, 241, 150, 60, 17, 30, 90, 22, 144, 187, 227, 163, 134, 176, 66, 121, 14, 1, 232, 99, 93, 57, 25, 113, 177, 243, 126, 46, 49, 0, 67, 207, 198, 255, 38, 164, 52, 221, 52, 220, 90, 196, 191, 73, 33, 136, 99, 74, 195, 31, 231, 194, 199, 182, 140, 82, 157, 188, 8, 12, 81, 84, 107, 2, 2, 35, 89, 168, 58, 130, 16, 60, 88, 163, 212, 87, 132, 194, 194, 63, 187, 98, 243, 115, 64, 245, 175, 9, 218, 0, 32, 210, 197, 40, 166, 44, 15, 234, 238, 33, 153, 224, 250, 120, 51, 0, 227, 120, 219, 44, 30, 86, 64, 104, 234, 171, 137, 78, 125, 204, 253, 60, 134, 211, 218, 47, 15, 145, 50, 231, 108, 143, 126, 99, 80, 109, 242, 211, 146, 142, 83, 22, 234, 150, 48, 123, 227, 52, 208, 213, 137, 83, 217, 82, 43, 155, 212, 230, 162, 139, 107, 243, 220, 45, 253, 220, 250, 97, 103, 239, 54, 14, 22, 131, 74, 171, 99, 219, 98, 40, 216, 176, 158, 82, 250, 106, 254, 2, 99, 49, 56, 168, 119, 184, 140, 182, 116, 186, 29, 103, 223, 20, 9, 95, 6, 36, 28, 134, 90, 8, 57, 65, 158, 33, 238, 155, 61, 210, 236, 126, 109, 144, 252, 222, 44, 104, 106, 212, 140, 195, 31, 222, 141, 131, 55, 1, 160, 236, 52, 155, 170, 173, 154, 85, 238, 6, 154, 93, 244, 172, 20, 207, 3, 249, 143, 52, 22, 77, 100, 14, 227, 254, 35, 66, 27, 37, 222, 98, 7, 22, 145, 202, 214, 116, 214, 33, 222, 138, 32, 154, 51, 86, 104, 119, 28, 107, 68, 13, 217, 155, 196, 223, 205, 180, 94, 22, 149, 156, 167, 202, 45, 125, 37, 105, 207, 145, 26, 162, 155, 167, 7, 155, 51, 201, 3, 72, 182, 154, 209, 14, 197, 215, 140, 114, 186, 121, 172, 94, 77, 16, 142, 0, 103, 184, 23, 29, 55, 101, 211, 60, 229, 54, 78, 121, 246, 79, 212, 96, 239, 52, 182, 132, 42, 214, 208, 28, 48, 252, 79, 113, 145, 90, 110, 46, 145, 190, 80, 63, 166, 210, 77, 34, 111, 125, 51, 102, 10, 3, 194, 209, 9, 160, 15, 155, 36, 235, 142, 252, 125, 174, 44, 186, 78, 171, 54, 62, 14, 227, 191, 192, 234, 43, 84, 99, 96, 201, 1, 12, 101, 98, 237, 12, 249, 186, 148, 221, 17, 209, 11, 181, 148, 166, 177, 44, 162, 16, 85, 35, 214, 85, 114, 100, 249, 76, 82, 74, 70, 30, 146, 99, 230, 15, 157, 117, 154, 219, 131, 163, 193, 175, 216, 30, 147, 176, 224, 116, 82, 144, 224, 131, 249, 50, 247, 196, 237, 65, 178, 102, 105, 252, 20, 31, 166, 17, 217, 207, 140, 216, 254, 123, 59, 77, 17, 111, 98, 168, 210, 237, 76, 110, 107, 16, 100, 40, 46, 208, 81, 201, 160, 52, 137, 25, 180, 136, 37, 214, 173, 172, 95, 113, 210, 195, 95, 222, 172, 118, 119, 189, 98, 253, 123, 107, 18, 98, 111, 201, 224, 197, 109, 136, 150, 149, 5, 87, 124, 188, 37, 201, 73, 198, 26, 6, 62, 134, 188, 136, 206, 126, 101, 46, 234, 17, 202, 47, 135, 223, 57, 59, 53, 114, 38, 89, 31, 1, 76, 76, 238, 143, 11, 190, 30, 76, 230, 46, 162, 51, 0, 186, 207, 126, 107, 219, 156, 18, 104, 247, 158, 244, 145, 20, 84, 31, 68, 141, 55, 190, 221, 105, 102, 56, 81, 154, 125, 71, 123, 126, 236, 179, 81, 231, 220, 167, 119, 206, 115, 106, 59, 166, 166, 3, 137, 43, 56, 32, 5, 45, 215, 145, 162, 47, 148, 234, 114, 18, 3, 166, 248, 209, 117, 192, 103, 35, 83, 79, 19, 212, 230, 12, 128, 214, 142, 148, 173, 234, 212, 62, 78, 144, 8, 141, 63, 252, 255, 188, 27, 191, 132, 53, 215, 220, 19, 191, 75, 253, 145, 230, 122, 156, 115, 250, 73, 171, 210, 22, 233, 244, 91, 58, 47, 75, 68, 116, 182, 98, 182, 75, 66, 36, 159, 64, 205, 176, 102, 50, 237, 38, 107, 148, 58, 61, 64, 1, 249, 68, 75, 235, 104, 25, 228, 147, 233, 46, 25, 190, 118, 196, 34, 39, 1, 60, 201, 67, 77, 64, 9, 43, 0, 150, 41, 73, 57, 254, 211, 96, 93, 129, 231, 63, 12, 177, 106, 238, 70, 73, 87, 251, 7, 254, 51, 212, 34, 34, 137, 127, 209, 207, 70, 60, 68, 71, 74, 208, 119, 211, 153, 100, 173, 21, 178, 95, 113, 6, 103, 244, 204, 200, 141, 58, 156, 13, 21, 109, 169, 215, 206, 184, 10, 248, 214, 219, 2, 22, 108, 37, 247, 157, 102, 167, 253, 142, 139, 177, 62, 243, 59, 147, 69, 231, 150, 123, 177, 231, 224, 33, 29, 75, 184, 115, 143, 218, 4, 10, 125, 35, 50, 201, 143, 44, 175, 108, 206, 247, 152, 81, 249, 135, 221, 23, 132, 80, 104, 24, 6, 10, 208, 155, 97, 45, 9, 52, 29, 232, 152, 176, 75, 242, 241, 111, 128, 127, 144, 96, 159, 171, 73, 250, 52, 163, 43, 158, 232, 89, 227, 65, 219, 151, 153, 227, 61, 46, 232, 177, 170, 203, 237, 9, 253, 225, 222, 224, 200, 86, 146, 180, 104, 8, 15, 189, 184, 94, 177, 36, 57, 170, 206, 62, 47, 152, 67, 77, 106, 10, 26, 180, 44, 124, 175, 5, 81, 96, 215, 143, 142, 152, 61, 2, 81, 216, 66, 142, 216, 71, 8, 175, 245, 51, 144, 186, 166, 28, 230, 64, 159, 150, 90, 249, 65, 151, 10, 136, 91, 38, 146, 1, 243, 23, 141, 224, 125, 108, 4, 166, 186, 241, 55, 10, 202, 251, 230, 96, 252, 248, 197, 48, 29, 239, 129, 204, 184, 15, 10, 89, 130, 175, 144, 59, 155, 33, 171, 121, 32, 19, 252, 109, 220, 191, 115, 237, 37, 243, 233, 121, 122, 90, 250, 66, 142, 44, 35, 203, 218, 145, 243, 140, 28, 161, 213, 153, 231, 76, 138, 76, 251, 151, 7, 11, 64, 193, 73, 230, 191, 196, 153, 83, 5, 94, 107, 104, 1, 65, 203, 149, 153, 209, 76, 82, 60, 0, 21, 153, 63, 172, 119, 106, 223, 51, 212, 244, 144, 25, 25, 126, 216, 9, 93, 42, 46, 188, 134, 154, 195, 84, 46, 126, 128, 136, 111, 21, 90, 103, 219, 198, 39, 161, 53, 255, 151, 213, 105, 135, 115, 226, 94, 28, 48, 252, 80, 33, 60, 213, 206, 247, 191, 175, 195, 227, 118, 54, 185, 205, 195, 248, 11, 238, 202, 13, 236, 38, 182, 1, 1, 51, 111, 190, 234, 249, 87, 189, 234, 35, 148, 226, 72, 131, 77, 249, 214, 48, 36, 116, 58, 228, 77, 168, 222, 190, 115, 193, 157, 174, 213, 105, 120, 23, 98, 134, 22, 205, 150, 192, 202, 128, 65, 128, 85, 254, 99, 135, 227, 170, 80, 96, 234, 225, 173, 172, 156, 179, 234, 81, 185, 34, 227, 155, 41, 242, 244, 138, 148, 58, 255, 232, 63, 146, 184, 233, 157, 105, 206, 181, 53, 42, 165, 59, 77, 71, 206, 219, 169, 168, 246, 61, 114, 171, 147, 22, 101, 218, 92, 93, 58, 103, 80, 240, 152, 80, 137, 179, 181, 175, 203, 245, 111, 231, 4, 41, 158, 94, 224, 189, 172, 122, 97, 92, 93, 126, 47, 229, 239, 52, 225, 102, 38, 25, 61, 196, 121, 227, 94, 27, 148, 133, 61, 98, 247, 7, 82, 187, 159, 106, 74, 51, 245, 171, 42, 69, 188, 227, 34, 178, 136, 210, 137, 62, 86, 101, 8, 204, 106, 6, 234, 105, 133, 51, 69, 50, 164, 84, 182, 73, 94, 107, 10, 134, 19, 165, 111, 191, 145, 238, 0, 8, 188, 57, 123, 185, 132, 9, 169, 43, 215, 92, 74, 108, 176, 219, 88, 26, 227, 255, 172, 198, 175, 40, 106, 120, 227, 148, 24, 151, 195, 121, 182, 70, 177, 251, 105, 27, 168, 16, 142, 207, 176, 74, 47, 217, 161, 139, 28, 60, 228, 196, 246, 233, 249, 184, 212, 36, 196, 96, 125, 79, 197, 37, 17, 133, 251, 89, 226, 187, 232, 38, 238, 158, 183, 92, 96, 35, 3, 28, 247, 68, 111, 103, 174, 110, 81, 164, 146, 165, 195, 219, 114, 27, 207, 83, 255, 253, 126, 88, 242, 198, 111, 102, 218, 249, 114, 9, 153, 221, 223, 176, 188, 88, 17, 208, 46, 178, 238, 36, 253, 109, 224, 222, 79, 154, 125, 18, 200, 101, 116, 57, 1, 129, 97, 201, 151, 111, 183, 222, 140, 135, 114, 156, 95, 84, 178, 241, 159, 177, 112, 62, 25, 125, 115, 232, 102, 251, 62, 203, 14, 5, 150, 92, 99, 241, 219, 53, 250, 69, 48, 65, 141, 243, 130, 124, 225, 30, 176, 59, 17, 175, 145, 254, 49, 241, 235, 137, 226, 136, 42, 0, 251, 160, 205, 156, 192, 10, 9, 85, 55, 14, 59, 38, 172, 192, 24, 221, 66, 54, 237, 238, 147, 90, 228, 189, 22, 9, 220, 164, 100, 218, 76, 176, 128, 184, 136, 152, 252, 67, 162, 227, 119, 133, 5, 15, 108, 130, 165, 211, 24, 19, 34, 74, 234, 209, 206, 203, 5, 232, 5, 133, 92, 251, 111, 242, 81, 57, 100, 12, 116, 139, 189, 113, 167, 141, 181, 174, 47, 10, 105, 237, 10, 170, 195, 140, 245, 184, 206, 44, 7, 175, 182, 148, 159, 209, 239, 141, 192, 194, 7, 189, 225, 93, 37, 161, 90, 81, 167, 97, 32, 161, 12, 147, 110, 81, 128, 14, 78, 146, 252, 19, 252, 221, 57, 196, 233, 98, 192, 166, 49, 199, 150, 96, 30, 247, 169, 183, 252, 210, 201, 226, 23, 114, 193, 229, 123, 251, 93, 187, 191, 44, 195, 214, 222, 243, 9, 180, 215, 34, 89, 67, 220, 162, 195, 200, 67, 126, 247, 59, 142, 35, 82, 238, 128, 25, 51, 135, 152, 238, 100, 52, 59, 118, 152, 147, 111, 133, 138, 41, 196, 210, 24, 241, 10, 35, 73, 163, 94, 97, 181, 32, 144, 24, 172, 191, 205, 12, 25, 230, 108, 130, 138, 248, 164, 98, 141, 92, 99, 56, 180, 192, 55, 63, 70, 173, 164, 57, 26, 95, 135, 243, 255, 159, 211, 163, 47, 128, 71, 155, 98, 187, 81, 159, 191, 1, 55, 225, 241, 16, 174, 240, 168, 122, 37, 40, 97, 207, 157, 157, 176, 7, 252, 81, 133, 214, 128, 83, 249, 33, 72, 143, 4, 87, 8, 197, 231, 21, 222, 74, 138, 132, 149, 108, 102, 24, 221, 154, 83, 187, 80, 31, 7, 63, 116, 180, 169, 84, 202, 18, 188, 14, 118, 98, 166, 75, 244, 10, 1, 219, 79, 105, 163, 0, 249, 253, 96, 86, 201, 39, 97, 83, 83, 174, 48, 249, 73, 39, 191, 208, 168, 34, 67, 151, 254, 16, 18, 135, 92, 157, 224, 225, 41, 254, 45, 203, 41, 197, 216, 141, 15, 210, 33, 219, 67, 189, 220, 69, 50, 19, 79, 43, 75, 122, 1, 93, 44, 65, 197, 15, 29, 234, 39, 175, 233, 136, 5, 65, 123, 116, 109, 136, 63, 92, 59, 31, 158, 1, 40, 219, 158, 94, 39, 236, 207, 198, 124, 247, 209, 150, 168, 146, 27, 164, 80, 109, 251, 220, 101, 150, 29, 142, 44, 199, 71, 232, 27, 36, 118, 69, 230, 84, 26, 172, 252, 227, 46, 19, 35, 168, 239, 5, 15, 220, 128, 95, 212, 106, 205, 242, 56, 128, 9, 20, 28, 24, 33, 11, 177, 244, 110, 237, 131, 233, 183, 223, 121, 115, 90, 225, 223, 160, 83, 66, 136, 70, 58, 153, 13, 104, 136, 207, 39, 234, 129, 140, 247, 219, 176, 72, 120, 211, 185, 133, 118, 131, 212, 59, 186, 178, 199, 228, 54, 231, 97, 187, 224, 97, 237, 206, 215, 9, 22, 12, 12, 147, 21, 38, 165, 78, 149, 245, 145, 118, 103, 245, 129, 120, 5, 142, 49, 0, 211, 224, 239, 77, 114, 48, 172, 158, 171, 19, 224, 201, 82, 218, 78, 168, 91, 134, 15, 40, 187, 114, 42, 26, 8, 142, 211, 61, 233, 8, 155, 177, 147, 149, 232, 160, 1, 177, 135, 245, 144, 69, 22, 157, 156, 200, 109, 133, 201, 157, 212, 254, 134, 213, 191, 255, 101, 255, 20, 235, 105, 62, 221, 210, 159, 64, 246, 136, 181, 60, 41, 149, 129, 224, 46, 79, 173, 136, 105, 125, 192, 244, 16, 236, 172, 194, 247, 136, 160, 191, 219, 24, 101, 151, 204, 189, 254, 69, 160, 79, 84, 149, 43, 108, 90, 65, 16, 75, 49, 182, 29, 211, 188, 135, 145, 131, 108, 143, 97, 95, 38, 38, 244, 117, 92, 157, 91, 38, 118, 118, 134, 108, 123, 83, 215, 239, 228, 186, 45, 112, 202, 166, 127, 199, 80, 183, 251, 112, 113, 237, 49, 148, 92, 31, 54, 242, 208, 12, 47, 101, 74, 79, 19, 78, 122, 60, 125, 85, 133, 3, 52, 123, 236, 60, 62, 178, 101, 111, 91, 89, 228, 63, 62, 116, 53, 148, 71, 46, 153, 133, 244, 59, 87, 117, 171, 67, 182, 119, 3, 204, 215, 205, 128, 248, 11, 59, 34, 15, 115, 249, 177, 240, 198, 58, 52, 23, 101, 132, 118, 39, 181, 199, 49, 39, 98, 196, 23, 179, 199, 62, 65, 165, 246, 218, 161, 150, 163, 253, 94, 124, 215, 10, 245, 71, 135, 168, 59, 251, 229, 157, 39, 75, 179, 211, 83, 33, 172, 81, 2, 30, 222, 174, 66, 80, 11, 196, 187, 123, 255, 127, 187, 208, 236, 106, 88, 54, 93, 253, 37, 33, 155, 82, 26, 156, 57, 87, 148, 130, 44, 84, 207, 171, 200, 131, 82, 28, 61, 122, 155, 114, 160, 253, 29, 177, 50, 168, 100, 73, 18, 132, 92, 136, 67, 24, 156, 149, 164, 120, 109, 130, 170, 156, 164, 248, 104, 83, 152, 231, 211, 100, 78, 59, 170, 147, 101, 86, 254, 127, 143, 124, 178, 232, 35, 35, 243, 3, 220, 198, 182, 146, 71, 250, 50, 61, 152, 253, 101, 219, 219, 159, 58, 34, 239, 111, 144, 29, 8, 99, 24, 212, 123, 176, 171, 0, 132, 253, 35, 140, 166, 157, 68, 215, 217, 105, 78, 224, 18, 118, 216, 79, 227, 101, 59, 153, 27, 217, 243, 250, 193, 213, 100, 184, 69, 78, 229, 7, 144, 107, 5, 214, 223, 139, 123, 44, 140, 165, 131, 215, 65, 77, 181, 143, 101, 218, 198, 87, 47, 191, 10, 102, 231, 0, 239, 23, 128, 83, 11, 218, 62, 104, 185, 73, 211, 216, 40, 70, 231, 92, 187, 172, 255, 66, 159, 93, 156, 35, 172, 123, 2, 230, 123, 236, 241, 154, 88, 136, 179, 147, 174, 89, 50, 5, 158, 169, 128, 127, 215, 231, 82, 83, 159, 66, 241, 205, 103, 143, 20, 248, 239, 143, 31, 210, 249, 39, 25, 8, 8, 242, 111, 111, 188, 35, 190, 251, 17, 114, 164, 49, 24, 113, 159, 50, 115, 56, 190, 180, 91, 125, 237, 99, 116, 211, 36, 208, 115, 12, 73, 61, 99, 110, 81, 64, 83, 163, 131, 154, 211, 9, 165, 11, 30, 177, 177, 43, 241, 7, 108, 203, 224, 75, 25, 246, 160, 33, 148, 32, 131, 183, 190, 0, 219, 28, 208, 242, 134, 174, 91, 92, 51, 36, 240, 43, 139, 147, 101, 183, 51, 216, 249, 42, 166, 52, 133, 115, 249, 6, 240, 23, 27, 23, 77, 180, 40, 175, 240, 173, 104, 70, 137, 83, 82, 171, 155, 215, 136, 131, 4, 172, 19, 100, 255, 146, 160, 199, 128, 177, 130, 163, 56, 104, 107, 102, 44, 178, 196, 187, 0, 38, 53, 230, 191, 148, 218, 207, 105, 66, 106, 103, 52, 241, 119, 233, 63, 63, 182, 45, 101, 61, 210, 89, 175, 101, 98, 89, 172, 252, 236, 36, 54, 143, 131, 55, 35, 189, 128, 57, 73, 34, 229, 250, 206, 253, 43, 37, 53, 136, 172, 73, 221, 27, 205, 207, 21, 120, 92, 6, 220, 166, 66, 95, 45, 241, 209, 112, 72, 22, 31, 221, 232, 220, 157, 248, 78, 105, 214, 230, 41, 193, 211, 46, 249, 26, 11, 242, 42, 225, 116, 207, 166, 141, 116, 185, 223, 86, 218, 190, 255, 185, 250, 199, 181, 56, 188, 132, 37, 27, 85, 248, 112, 161, 182, 164, 153, 129, 40, 37, 13, 8, 67, 236, 36, 182, 151, 130, 96, 131, 65, 26, 103, 239, 65, 243, 234, 162, 7, 90, 237, 24, 99, 145, 47, 181, 99, 65, 38, 36, 112, 157, 239, 225, 127, 161, 168, 6, 66, 231, 252, 142, 154, 225, 138, 189, 243, 66, 142, 71, 61, 239, 55, 230, 59, 40, 224, 134, 104, 100, 189, 166, 249, 66, 91, 146, 154, 28, 67, 78, 138, 40, 114, 71, 172, 3, 168, 233, 9, 106, 228, 143, 56, 193, 227, 243, 144, 51, 222, 94, 224, 43, 79, 149, 212, 245, 52, 68, 200, 17, 235, 45, 164, 147, 62, 118, 52, 216, 195, 78, 13, 66, 190, 188, 241, 142, 234, 182, 85, 48, 148, 214, 123, 57, 223, 188, 229, 119, 169, 180, 193, 70, 250, 215, 249, 29, 88, 123, 88, 226, 210, 171, 170, 32, 80, 85, 3, 26, 219, 109, 97, 134, 11, 96, 118, 71, 130, 86, 182, 77, 116, 137, 214, 28, 140, 242, 227, 178, 167, 200, 214, 175, 107, 96, 132, 33, 40, 64, 93, 206, 90, 129, 132, 221, 170, 242, 113, 235, 251, 172, 193, 35, 58, 85, 70, 9, 75, 104, 71, 161, 99, 214, 6, 33, 204, 250, 172, 199, 33, 183, 246, 250, 109, 251, 50, 106, 114, 16, 134, 150, 19, 219, 21, 60, 63, 251, 204, 157, 45, 106, 233, 133, 154, 145, 135, 201, 77, 59, 178, 176, 217, 109, 236, 19, 19, 200, 5, 165, 235, 81, 14, 42, 153, 40, 189, 86, 92, 90, 239, 77, 53, 136, 65, 112, 94, 130, 104, 71, 55, 79, 22, 250, 34, 178, 14, 91, 24, 145, 250, 4, 197, 96, 72, 118, 142, 31, 83, 137, 14, 57, 115, 36, 202, 144, 10, 19, 123, 176, 23, 93, 35, 90, 145, 73, 163, 124, 66, 156, 8, 82, 243, 22, 204, 59, 77, 49, 222, 1, 246, 7, 75, 15, 234, 110, 9, 232, 29, 156, 239, 250, 88, 24, 244, 123, 15, 169, 66, 180, 254, 210, 233, 134, 27, 100, 162, 103, 158, 223, 149, 226, 167, 140, 53, 34, 57, 105, 221, 112, 116, 72, 207, 169, 98, 200, 189, 33, 72, 181, 162, 166, 4, 29, 98, 157, 184, 244, 188, 127, 186, 35, 186, 202, 24, 21, 185, 160, 63, 17, 112, 78, 96, 49, 87, 60, 154, 215, 49, 196, 179, 122, 60, 253, 154, 86, 177, 227, 70, 1, 80, 205, 58, 66, 103, 146, 170, 108, 34, 134, 149, 134, 160, 225, 152, 63, 18, 199, 101, 158, 199, 235, 124, 98, 105, 8, 62, 100, 92, 248, 81, 59, 108, 190, 156, 216, 106, 103, 90, 69, 199, 160, 21, 66, 203, 125, 157, 189, 8, 115, 15, 158, 77, 105, 124, 171, 180, 227, 134, 50, 208, 245, 254, 35, 231, 215, 231, 193, 218, 216, 68, 204, 229, 233, 95, 120, 177, 105, 108, 92, 9, 181, 119, 196, 19, 97, 5, 145, 254, 112, 156, 70, 9, 68, 39, 84, 33, 80, 2, 21, 228, 184, 145, 218, 19, 202, 231, 144, 3, 29, 22, 14, 146, 193, 90, 216, 63, 95, 197, 70, 198, 68, 235, 132, 16, 31, 100, 179, 19, 105, 19, 178, 210, 222, 118, 148, 37, 202, 50, 222, 84, 246, 89, 36, 25, 183, 80, 175, 79, 154, 38, 119, 89, 125, 133, 56, 21, 61, 187, 123, 80, 224, 187, 15, 84, 46, 19, 1, 24, 246, 250, 32, 226, 193, 49, 118, 252, 1, 47, 172, 161, 175, 60, 113, 56, 248, 198, 100, 117, 78, 138, 154, 40, 231, 118, 120, 23, 223, 8, 239, 145, 51, 43, 82, 146, 83, 129, 43, 146, 75, 171, 20, 186, 157, 174, 137, 205, 187, 198, 37, 10, 108, 65, 154, 212, 207, 63, 178, 11, 51, 5, 62, 172, 122, 219, 147, 16, 223, 243, 134, 146, 161, 173, 118, 113, 185, 212, 199, 29, 83, 5, 241, 42, 54, 160, 57, 100, 116, 111, 218, 193, 39, 66, 67, 141, 161, 179, 141, 54, 87, 16, 43, 15, 93, 41, 240, 62, 66, 231, 59, 42, 48, 46, 207, 141, 27, 160, 156, 247, 138, 129, 130, 68, 34, 66, 69, 177, 45, 108, 26, 36, 50, 109, 46, 238, 82, 187, 219, 166, 225, 115, 204, 121, 228, 122, 92, 65, 67, 69, 162, 104, 10, 117, 17, 33, 113, 110, 10, 9, 2, 41, 24, 227, 173, 49, 10, 2, 147, 115, 197, 93, 133, 139, 86, 38, 138, 102, 92, 17, 94, 115, 74, 101, 5, 12, 222, 186, 229, 16, 126, 16, 234, 105, 191, 184, 182, 27, 59, 152, 118, 179, 114, 78, 65, 15, 21, 43, 215, 7, 215, 110, 207, 152, 128, 14, 106, 188, 73, 230, 183, 23, 101, 92, 95, 250, 115, 245, 40, 58, 167, 157, 201, 1, 229, 233, 39, 243, 103, 253, 104, 135, 248, 219, 74, 127, 91, 135, 224, 240, 42, 6, 70, 70, 48, 23, 52, 78, 12, 212, 203, 55, 134, 108, 107, 185, 237, 129, 120, 234, 54, 243, 252, 231, 19, 190, 190, 46, 48, 115, 200, 145, 119, 195, 140, 122, 21, 85, 120, 189, 33, 208, 59, 39, 181, 57, 55, 128, 144, 149, 120, 65, 77, 113, 75, 203, 194, 251, 217, 77, 110, 56, 54, 93, 240, 101, 219, 52, 174, 163, 153, 193, 24, 16, 112, 103, 178, 252, 57, 2, 7, 55, 184, 80, 176, 248, 128, 236, 73, 250, 66, 218, 63, 16, 230, 149, 32, 149, 237, 199, 168, 81, 147, 63, 211, 251, 112, 223, 62, 92, 60, 114, 156, 203, 12, 225, 232, 250, 166, 123, 194, 227, 56, 82, 4, 104, 168, 170, 38, 93, 122, 232, 207, 228, 68, 58, 247, 162, 96, 128, 20, 249, 114, 93, 37, 199, 229, 152, 134, 168, 14, 212, 153, 137, 31, 241, 189, 163, 223, 247, 196, 22, 67, 27, 105, 10, 235, 28, 24, 177, 249, 230, 19, 247, 145, 228, 151, 195, 17, 201, 93, 226, 167, 76, 227, 85, 207, 200, 139, 37, 148, 40, 243, 214, 60, 55, 241, 183, 126, 160, 97, 6, 129, 104, 182, 207, 250, 77, 123, 235, 211, 158, 171, 52, 171, 186, 53, 121, 24, 137, 105, 164, 247, 172, 132, 201, 31, 135, 123, 0, 164, 164, 235, 167, 103, 63, 40, 54, 102, 46, 197, 185, 194, 14, 195, 159, 182, 120, 4, 36, 14, 194, 219, 155, 23, 233, 148, 169, 113, 158, 92, 103, 68, 247, 133, 214, 252, 9, 220, 50, 198, 251, 75, 34, 10, 115, 209, 172, 147, 168, 185, 81, 70, 174, 155, 80, 111, 246, 78, 199, 155, 192, 2, 241, 162, 123, 123, 77, 228, 101, 22, 241, 89, 245, 63, 3, 235, 76, 162, 20, 12, 81, 228, 254, 50, 146, 76, 149, 112, 226, 88, 231, 167, 229, 27, 250, 21, 98, 84, 235, 251, 213, 238, 209, 111, 34, 144, 181, 190, 22, 60, 112, 244, 98, 241, 19, 51, 163, 4, 198, 8, 50, 194, 200, 241, 155, 192, 97, 95, 173, 49, 94, 169, 112, 21, 87, 23, 229, 226, 75, 60, 134, 126, 21, 10, 86, 84, 238, 113, 19, 77, 205, 3, 158, 105, 241, 98, 86, 237, 233, 190, 97, 136, 202, 234, 147, 121, 253, 156, 176, 238, 222, 71, 35, 185, 127, 212, 211, 0, 86, 129, 131, 93, 111, 167, 121, 138, 69, 251, 4, 90, 229, 43, 48, 144, 138, 0, 48, 249, 202, 203, 46, 117, 175, 27, 96, 230, 119, 93, 156, 129, 186, 122, 133, 114, 160, 196, 50, 81, 97, 63, 13, 188, 146, 63, 4, 220, 222, 165, 9, 236, 124, 117, 145, 91, 244, 186, 233, 35, 78, 241, 45, 38, 127, 179, 165, 20, 253, 131, 171, 41, 230, 158, 162, 83, 50, 19, 23, 83, 128, 121, 67, 248, 17, 145, 98, 112, 190, 250, 237, 243, 248, 64, 146, 41, 16, 44, 154, 33, 60, 162, 161, 156, 229, 176, 172, 49, 42, 240, 235, 85, 90, 162, 151, 170, 183, 27, 21, 183, 40, 134, 187, 193, 75, 183, 76, 63, 235, 27, 90, 133, 26, 138, 83, 150, 77, 206, 233, 166, 204, 90, 125, 211, 133, 229, 10, 166, 12, 146, 184, 152, 107, 242, 245, 52, 145, 154, 34, 249, 13, 102, 253, 209, 20, 3, 225, 88, 156, 137, 30, 182, 206, 211, 255, 149, 39, 64, 133, 16, 125, 5, 115, 220, 51, 122, 242, 121, 222, 212, 239, 237, 208, 31, 72, 98, 36, 131, 185, 9, 124, 14, 55, 236, 196, 38, 68, 82, 17, 197, 255, 168, 199, 158, 94, 52, 58, 126, 100, 57, 118, 184, 214, 42, 65, 249, 156, 128, 82, 139, 234, 63, 119, 55, 89, 108, 207, 209, 226, 34, 198, 134, 54, 131, 154, 87, 96, 31, 11, 241, 1, 11, 97, 61, 167, 20, 223, 188, 163, 31, 250, 189, 13, 29, 196, 209, 218, 119, 102, 13, 172, 149, 149, 219, 251, 64, 238, 211, 212, 136, 82, 237, 150, 140, 188, 201, 123, 191, 83, 133, 193, 253, 25, 27, 246, 72, 60, 212, 227, 241, 209, 206, 142, 29, 11, 11, 146, 182, 203, 214, 25, 192, 236, 197, 176, 6, 216, 105, 145, 191, 115, 161, 107, 170, 194, 121, 148, 205, 65, 116, 157, 96, 173, 217, 30, 96, 174, 239, 178, 151, 121, 46, 3, 86, 65, 32, 120, 195, 66, 86, 144, 206, 91, 36, 148, 42, 216, 208, 164, 203, 149, 69, 230, 49, 78, 224, 177, 23, 175, 103, 191, 111, 181, 130, 255, 215, 189, 173, 134, 189, 64, 36, 226, 134, 89, 116, 138, 92, 81, 246, 202, 10, 243, 21, 81, 165, 210, 235, 49, 99, 217, 19, 184, 54, 71, 102, 132, 49, 135, 228, 156, 67, 170, 38, 173, 200, 239, 244, 255, 65, 211, 100, 161, 118, 111, 218, 219, 87, 23, 57, 9, 246, 102, 252, 157, 205, 98, 12, 97, 198, 183, 141, 223, 154, 23, 180, 123, 80, 156, 144, 231, 95, 42, 135, 31, 244, 164, 121, 138, 116, 154, 207, 222, 138, 32, 84, 185, 56, 114, 9, 244, 11, 213, 237, 166, 91, 31, 217, 20, 179, 168, 121, 139, 237, 181, 221, 90, 174, 2, 176, 34, 210, 130, 241, 130, 240, 178, 89, 176, 130, 185, 243, 52, 101, 116, 112, 6, 60, 84, 6, 110, 29, 246, 66, 10, 164, 130, 46, 75, 163, 179, 45, 250, 32, 57, 48, 74, 169, 133, 44, 167, 241, 103, 31, 119, 243, 74, 208, 4, 162, 17, 11, 72, 126, 10, 81, 117, 188, 103, 222, 163, 78, 206, 72, 216, 73, 2, 221, 230, 122, 107, 141, 126, 1, 236, 63, 51, 169, 160, 14, 165, 208, 174, 9, 91, 74, 252, 146, 198, 79, 238, 175, 39, 102, 75, 150, 40, 109, 143, 117, 77, 153, 234, 82, 38, 162, 23, 242, 107, 124, 217, 13, 51, 55, 92, 1, 28, 138, 62, 209, 69, 222, 63, 62, 150, 221, 74, 232, 220, 181, 21, 36, 203, 182, 193, 183, 173, 113, 157, 241, 208, 131, 172, 0, 176, 55, 229, 63, 54, 84, 197, 105, 196, 154, 60, 52, 50, 191, 230, 202, 129, 85, 235, 75, 245, 172, 58, 230, 0, 251, 250, 104, 123, 247, 224, 120, 118, 30, 50, 223, 144, 233, 243, 213, 58, 228, 124, 24, 168, 194, 24, 192, 4, 63, 107, 39, 55, 202, 196, 254, 149, 141, 189, 136, 218, 108, 203, 100, 198, 121, 240, 252, 208, 200, 230, 178, 117, 199, 2, 55, 165, 214, 210, 246, 142, 178, 63, 86, 249, 156, 100, 172, 202, 197, 148, 222, 76, 185, 221, 248, 71, 7, 231, 224, 158, 236, 27, 44, 53, 58, 181, 65, 176, 146, 223, 254, 5, 249, 207, 218, 160, 212, 245, 14, 114, 246, 153, 139, 55, 230, 89, 143, 125, 133, 103, 249, 123, 91, 229, 195, 214, 65, 251, 219, 11, 48, 167, 72, 9, 131, 110, 207, 244, 197, 159, 23, 51, 161, 135, 251, 220, 52, 242, 122, 199, 21, 231, 34, 185, 84, 140, 112, 3, 164, 231, 64, 162, 192, 103, 182, 162, 112, 2, 142, 22, 148, 62, 71, 79, 232, 85, 38, 15, 87, 230, 232, 112, 203, 94, 230, 172, 233, 219, 158, 246, 87, 61, 155, 22, 14, 157, 23, 61, 99, 196, 97, 70, 216, 173, 236, 211, 120, 197, 28, 231, 47, 215, 66, 71, 46, 66, 28, 29, 223, 77, 173, 144, 82, 220, 222, 99, 229, 74, 53, 88, 116, 123, 162, 240, 168, 216, 142, 205, 144, 183, 127, 135, 4, 162, 91, 176, 78, 26, 178, 249, 104, 195, 76, 105, 206, 143, 20, 158, 220, 22, 67, 201, 237, 78, 241, 56, 111, 63, 160, 240, 168, 131, 253, 62, 8, 51, 88, 43, 174, 217, 235, 243, 71, 50, 210, 7, 235, 56, 63, 128, 111, 32, 244, 187, 217, 170, 77, 152, 65, 7, 200, 30, 47, 83, 126, 139, 170, 142, 219, 184, 156, 54, 102, 249, 94, 32, 2, 204, 206, 77, 230, 60, 184, 143, 167, 110, 241, 203, 60, 44, 174, 128, 150, 186, 215, 218, 189, 87, 107, 216, 84, 76, 166, 171, 91, 23, 16, 208, 211, 181, 234, 61, 203, 224, 172, 128, 129, 66, 7, 249, 0, 75, 157, 235, 49, 244, 154, 157, 107, 205, 70, 146, 38, 188, 6, 218, 133, 231, 204, 168, 234, 133, 17, 245, 85, 253, 163, 242, 168, 56, 9, 99, 142, 236, 237, 67, 20, 226, 60, 4, 86, 83, 208, 243, 19, 127, 168, 6, 156, 67, 179, 66, 170, 242, 211, 170, 199, 188, 71, 231, 191, 67, 42, 109, 37, 117, 154, 231, 116, 63, 232, 206, 107, 141, 17, 127, 143, 79, 247, 160, 62, 151, 234, 116, 126, 14, 223, 8, 5, 52, 82, 8, 99, 17, 9, 7, 4, 208, 106, 11, 208, 156, 157, 85, 51, 236, 128, 41, 66, 99, 243, 220, 153, 131, 111, 78, 189, 95, 219, 51, 100, 41, 150, 188, 218, 35, 37, 176, 31, 122, 252, 207, 222, 214, 142, 95, 19, 136, 159, 195, 209, 39, 182, 19, 97, 185, 72, 83, 165, 208, 249, 83, 4, 244, 230, 30, 7, 13, 161, 90, 200, 121, 138, 67, 151, 252, 197, 165, 44, 215, 9, 81, 118, 179, 159, 15, 3, 156, 105, 151, 104, 109, 161, 202, 143, 199, 41, 187, 172, 154, 64, 105, 69, 67, 173, 226, 34, 234, 111, 69, 244, 45, 230, 49, 11, 18, 158, 56, 184, 55, 124, 46, 252, 215, 109, 236, 124, 156, 172, 148, 159, 44, 147, 129, 50, 49, 230, 128, 213, 137, 161, 125, 140, 222, 36, 90, 117, 223, 146, 237, 122, 39, 118, 188, 93, 11, 40, 49, 114, 230, 80, 31, 221, 58, 199, 174, 192, 112, 31, 236, 98, 56, 76, 27, 199, 78, 28, 48, 62, 246, 207, 30, 85, 50, 31, 4, 143, 58, 241, 131, 83, 203, 70, 241, 124, 150, 160, 88, 30, 227, 177, 213, 75, 139, 122, 83, 83, 41, 97, 140, 78, 157, 188, 172, 85, 52, 202, 76, 47, 145, 76, 126, 144, 228, 49, 239, 103, 196, 149, 203, 133, 159, 201, 215, 241, 71, 245, 114, 49, 125, 228, 22, 192, 235, 230, 246, 247, 100, 110, 76, 74, 214, 226, 221, 120, 140, 250, 108, 9, 203, 40, 92, 19, 184, 136, 86, 76, 250, 177, 64, 76, 214, 79, 190, 86, 8, 131, 178, 0, 200, 171, 245, 144, 94, 2, 236, 11, 187, 119, 165, 83, 130, 252, 49, 126, 254, 131, 38, 43, 245, 170, 53, 7, 183, 205, 84, 71, 16, 127, 86, 249, 31, 169, 65, 33, 207, 146, 111, 155, 43, 145, 85, 250, 216, 38, 95, 18, 129, 186, 14, 3, 158, 43, 183, 44, 205, 90, 37, 141, 27, 130, 115, 4, 121, 67, 113, 43, 109, 251, 71, 103, 32, 129, 163, 73, 116, 252, 32, 149, 17, 150, 117, 168, 218, 56, 163, 173, 125, 84, 103, 136, 195, 89, 46, 27, 45, 153, 6, 184, 81, 93, 131, 28, 42, 171, 87, 177, 135, 109, 24, 78, 80, 103, 110, 168, 3, 251, 165, 139, 171, 25, 77, 166, 250, 193, 166, 168, 195, 160, 12, 25, 110, 36, 0, 132, 247, 199, 195, 30, 177, 14, 176, 197, 58, 142, 93, 43, 151, 126, 28, 184, 231, 179, 113, 227, 26, 165, 98, 180, 183, 218, 182, 150, 125, 231, 102, 231, 206, 39, 57, 121, 193, 43, 11, 254, 173, 29, 251, 45, 171, 106, 87, 114, 38, 58, 153, 72, 84, 193, 36, 2, 142, 215, 121, 147, 160, 11, 37, 243, 213, 217, 181, 152, 112, 191, 155, 217, 136, 117, 175, 182, 125, 134, 218, 58, 212, 239, 39, 250, 119, 220, 113, 214, 143, 204, 124, 11, 153, 200, 158, 215, 253, 40, 35, 17, 232, 45, 217, 47, 191, 159, 199, 82, 41, 106, 158, 244, 222, 254, 133, 109, 151, 43, 187, 203, 165, 61, 163, 205, 7, 217, 12, 252, 123, 90, 255, 255, 88, 221, 122, 76, 173, 185, 85, 185, 33, 228, 226, 161, 72, 217, 34, 197, 140, 190, 18, 7, 142, 177, 203, 49, 93, 91, 12, 12, 29, 35, 100, 136, 58, 22, 174, 49, 71, 209, 218, 199, 125, 51, 110, 117, 45, 205, 141, 81, 192, 148, 211, 238, 218, 84, 227, 191, 160, 49, 110, 207, 190, 8, 156, 184, 167, 148, 228, 69, 19, 39, 3, 210, 204, 196, 230, 123, 64, 123, 133, 115, 33, 85, 15, 45, 144, 218, 31, 192, 34, 60, 208, 166, 113, 151, 122, 249, 171, 207, 8, 164, 207, 138, 246, 217, 251, 34, 27, 145, 144, 57, 60, 165, 203, 117, 199, 80, 141, 218, 36, 65, 24, 115, 33, 152, 139, 152, 34, 72, 99, 192, 219, 49, 65, 187, 217, 14, 208, 56, 62, 143, 12, 51, 225, 187, 38, 19, 114, 83, 118, 117, 17, 249, 224, 185, 225, 237, 71, 79, 67, 75, 51, 0, 92, 123, 155, 122, 154, 105, 101, 235, 17, 160, 35, 152, 108, 45, 151, 154, 92, 149, 63, 255, 77, 153, 104, 98, 208, 251, 112, 189, 38, 102, 205, 117, 255, 232, 150, 109, 51, 70, 5, 11, 224, 41, 141, 200, 227, 170, 1, 220, 34, 103, 112, 185, 169, 207, 141, 183, 172, 61, 129, 113, 126, 200, 59, 197, 93, 245, 240, 58, 232, 40, 90, 125, 37, 134, 210, 82, 118, 234, 200, 115, 169, 124, 188, 1, 172, 236, 31, 79, 211, 213, 146, 195, 206, 105, 57, 241, 59, 237, 145, 32, 6, 24, 253, 23, 60, 211, 2, 94, 42, 190, 180, 213, 177, 23, 167, 104, 3, 226, 171, 208, 95, 96, 57, 53, 141, 115, 88, 174, 10, 206, 234, 150, 182, 157, 242, 93, 97, 80, 9, 154, 152, 166, 94, 141, 238, 212, 68, 231, 244, 0, 36, 167, 2, 9, 169, 16, 151, 170, 33, 51, 1, 105, 210, 194, 224, 146, 221, 227, 137, 63, 144, 14, 5, 140, 30, 193, 203, 47, 90, 20, 233, 169, 66, 192, 91, 252, 161, 140, 67, 202, 12, 24, 190, 242, 46, 208, 121, 8, 194, 164, 164, 125, 216, 194, 242, 125, 131, 35, 5, 45, 18, 152, 157, 240, 35, 56, 246, 144, 175, 2, 7, 123, 13, 158, 168, 115, 221, 195, 54, 236, 35, 132, 246, 7, 100, 108, 120, 17, 23, 210, 61, 238, 38, 73, 149, 28, 249, 29, 5, 232, 28, 131, 84, 79, 155, 26, 82, 96, 150, 219, 122, 167, 231, 56, 233, 176, 154, 213, 126, 14, 155, 13, 68, 157, 25, 236, 244, 64, 125, 74, 247, 241, 123, 177, 102, 43, 244, 122, 173, 75, 132, 244, 248, 236, 246, 161, 138, 68, 86, 2, 52, 121, 232, 96, 100, 207, 238, 219, 64, 197, 162, 8, 97, 144, 89, 121, 66, 146, 166, 233, 7, 145, 217, 223, 51, 254, 128, 1, 211, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 99, 108, 101, 97, 114, 116, 111, 109, 97, 114, 107, 10, 128, 3};
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index d37ee338733..a359b0ef6f5 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -19,8 +19,45 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
+set(INC "")
-SET(INC "")
+set(SRC
+ Bfont.c
+ add.png.c
+ bfont.ttf.c
+ blenderbuttons.c
+ blob.png.c
+ blur.png.c
+ bmonofont.ttf.c
+ clay.png.c
+ clone.png.c
+ crease.png.c
+ darken.png.c
+ draw.png.c
+ fill.png.c
+ flatten.png.c
+ grab.png.c
+ inflate.png.c
+ layer.png.c
+ lighten.png.c
+ mix.png.c
+ multiply.png.c
+ nudge.png.c
+ pinch.png.c
+ preview.blend.c
+ prvicons.c
+ scrape.png.c
+ smear.png.c
+ smooth.png.c
+ snake_hook.png.c
+ soften.png.c
+ splash.png.c
+ startup.blend.c
+ subtract.png.c
+ texdraw.png.c
+ thumb.png.c
+ twist.png.c
+ vertexdraw.png.c
+)
-BLENDERLIB(bf_editor_datafiles "${SRC}" "${INC}")
+blender_add_lib(bf_editor_datafiles "${SRC}" "${INC}")
diff --git a/source/blender/editors/datafiles/Makefile b/source/blender/editors/datafiles/Makefile
deleted file mode 100644
index c76014df60e..00000000000
--- a/source/blender/editors/datafiles/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_datafiles
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/datafiles/SConscript b/source/blender/editors/datafiles/SConscript
index ab404b9c7ea..0cbeb96ffdb 100644
--- a/source/blender/editors/datafiles/SConscript
+++ b/source/blender/editors/datafiles/SConscript
@@ -6,4 +6,4 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../bmesh #/intern/guardedalloc'
-env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core'], priority=[235] )
+env.BlenderLib ( 'bf_editor_datafiles', sources, Split(incs), [], libtype=['core', 'player'], priority=[235, 30] )
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index f4afe8b0252..27f5dd23d5a 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,6560 +1,6579 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 209697;
+int datatoc_blenderbuttons_size= 210319;
char datatoc_blenderbuttons[]= {
-137,
- 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163,
- 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,
-116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,
-244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17,
- 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,
-163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,
-224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,
-190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128,
- 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,
-230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69,
- 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48,
- 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,
-178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153,
- 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191,
- 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238,
- 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,
-228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129,
- 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88,
- 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,
-176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,
-131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,
-160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128,
- 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,
-112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,
-193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,
-186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116,
- 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108,
- 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,
-129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,
-194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55,
- 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,
-100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226,
- 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182,
- 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,
-149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,
-119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,
-149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,
-169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195,
- 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,
-124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116,
- 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171,
- 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,
-217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,
-111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,
-113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,
-105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,
-199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101,
- 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,
-185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,
-183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,
-154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,
-103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,
-155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209,
- 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239,
- 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127,
- 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,
-178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,
-133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,
-220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198,
- 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,
-152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140,
- 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,
-188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,
-131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,
-107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,
-205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178,
- 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,
-129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27,
- 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,
-210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205,
- 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,
-215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,
-179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210,
- 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247,
- 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98,
- 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,
-207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231,
- 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,
-187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,
-189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217,
- 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,
-143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174,
- 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,
-190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,
-167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131,
- 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96, 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 3, 40, 76,
- 73, 68, 65, 84,120,218,236, 93,119,120, 20,197, 3,125,187,183, 87,114,119,201,165, 55, 18, 72,161, 67, 0,105, 10, 72,239, 66,
- 40, 22, 4, 17, 69,108, 63,105, 22, 4, 65, 17,165,131, 34, 85, 69,196, 6, 40,210, 68, 16, 80,138, 72,239, 69,122,135, 0,233,
- 61,151,235,109,231,247, 71,110,207,203,113, 45, 16, 80, 96,222,247,237,119,183,237,237,204,206,236,236,219, 55,141, 33,132,128,
-130,130,130,130,130,130,130,130,162,242,193,210, 91, 64, 65, 65, 65, 65, 65, 65, 65,241, 31,193,134, 13, 27, 42, 98,129,117,246,
-151,211,190,180,251,175,115,222,197,184,147, 74,228,108,103,231,252,248, 62, 9,103,187,255, 42,167, 16,223, 10,240,118,174, 72,
- 62,170,172,251,233, 20, 78, 82,217,225,188, 91,156,149,245, 28,185, 9, 39,185, 11,233,254,241,125, 18,206,118,255, 53, 78,215,
-252,227, 39,111,133, 56,253,204, 83, 21, 13, 39,169,236,112,222, 45,206, 59,125,142,188,132,147,220,105, 94,242,144,246, 31,227,
- 33, 1, 33, 4,220, 93, 20, 89,126, 35, 53, 53,149,113,226,103,254,171,156,206,247, 65,224,175,204,176, 86, 34,118, 84, 54,167,
-203,253,172, 44,124,156,154,154,202,108,216,176, 97, 39,128,118,149, 25,247,202, 72,119,151,184, 86, 10,239,109,136,172, 10,113,
- 86, 86,190,191,219,156,149,245, 44,185,114, 86, 70,190,119,151,238,119, 49,141, 42, 43,156,149,242, 44,221,141, 60,239, 38,255,
-220, 49,175, 43,103,101, 60, 75,174,156,149,145,239,239, 5,103,101, 60, 75,238, 56, 43, 35,223,123, 74,251,135,205,160, 98,111,
-231,166,221, 69,167,172,253,127, 89, 16,221, 45,177, 89, 1, 7,230, 95,231,172,228, 52,250,216,206, 89,153, 95, 55,237, 43, 43,
-141,238, 70,126,119,230,172, 44,126, 87,158,202, 72, 39,119,156,119, 26, 94, 15,225,172,244,184,223,105,190,191, 87,156,149,156,
- 70,149,242, 44,185,112,182,175,228,143,129,246, 78,235, 31, 87, 38,103,101, 61, 75,110,194,121,199,233,228,142,243, 78,195,235,
- 33,156,149, 30,247,202,120,135,220, 45,222, 7, 26,119,171,250,172,178, 57, 43,200,253, 64,113, 86,176,122,166,243, 93, 72,251,
-127, 53,156,149,201,233, 26,198,202,172,238,185,155,225,172, 76,206, 10,132,245,129,227,188,223,210,253,191,120, 63, 61,241,221,
- 73,181,148, 39,119,244,110,132,179, 50, 57,253,228,126, 32, 56,239, 32,237, 31, 40, 84,184,234,240, 94, 8,184, 74,254, 50, 65,
- 37, 59, 48,119, 83,184, 86,102, 56,219,223, 13,135,240, 46,160,210,195,105,255, 82,254,232, 46,196,253,126,185,167,244, 89,162,
-207,210,127,238, 89,114,201,147,237, 43,209, 41,170, 84,231,217,149,179, 50,174,225,204, 81, 89,121,244,110,199,189, 50,159,165,
-187,145,246, 20,119,224, 66, 80, 78,202, 73, 57, 41, 39,229,164,156,148,243,161,229,124,224, 64, 8,161,195, 59, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,220, 71,240,218, 70,171, 74,149, 42, 27, 20, 10, 69, 13, 79,251,181, 90,109,
- 86, 86, 86, 86, 7,122, 27,255, 61,208, 52,162,184,143,192,226,159, 94,206, 60, 0, 98, 95, 40, 40, 40, 40, 30,104,120, 20, 90,
- 50,153, 44,249,220,185,115,181,120,158,135,205,102,131,213,106,117,252,154, 76, 38,180,109,219,182,194, 13,233,163,163,163,119,
-137, 68,162,196,138,156, 99,179,217,110,228,228,228,180,246,114,200, 62, 0,201, 12,243, 79,155, 64,225,191,167, 95, 0,153, 22,
-139,165,137, 55, 78,134, 97,146, 93,249, 60,112, 9,255,189,114, 6, 7, 7, 31,225, 56, 46,222, 29,151,167,255, 60,207, 95,205,
-203,203,107,117, 47,211,232, 97, 70,116,116,244, 46,142,227, 42,156, 63,179,179,179, 61,230,207,216,216,216,227, 44,203, 86,169,
- 0,165,136,231,249, 11, 89, 89, 89,173,189, 8,145,125, 0,146,189,145,184,230, 39,134, 97,210,109, 54, 91, 51, 95,207,145, 55,
- 46, 55,121,212, 23,167, 67,100,113, 28, 55, 35, 42, 42,234, 13,157, 78,103, 0, 64, 68, 34, 17,113, 10, 27, 0,192,106,181,230,
- 21, 23, 23, 55,160, 57,145,130,130,226,161, 16, 90, 60,207,179, 70,163, 17, 23, 47, 94,132,135,249, 16,109,183,113,189, 90, 71,
-255,220, 26, 21, 20, 21, 13,171,217, 12,101, 68,164,131, 59,231,236,105, 88, 45,102, 88, 77, 38, 84,107,222, 66, 8, 3,234,213,
-171, 39,242,193, 25, 63,115,230,204,168,160,160, 32, 24, 12, 6, 24, 12, 6, 24,141, 70, 24, 12, 6,152, 76, 38,152, 76, 38,152,
-205,102,152,205,102, 88,173, 86, 24,141, 70,108,219,182,205,102,177, 88,188,114, 78,157, 58, 53, 74,165, 82, 57,248,132, 69,224,
- 20,120, 45, 22, 11, 12, 6, 3,182,111,223,238,149,147,227,184,248,204,204,204, 40,137, 68, 2, 66, 8,120,158, 7, 33,164,220,
-226,138,234,213,171,155,189, 5,242, 46,165,209,195,140, 90, 83,151,111,140, 10,150,203, 96,229,121,164, 54,170,238,216,113,245,
-155, 85, 32, 86, 27,120,171, 21, 53,135, 15,114,108,175, 91,183,174,215,252, 73, 8, 73,152,186,124, 99,136,191,156, 5, 5, 5,
-250, 58,117,234,100,162,108,112, 63, 79, 66, 43, 94,175,215, 71,217,249,111, 17, 68, 44,203,150, 91, 54,111,222,140,212,212, 84,
- 95,113,143,127,251,237,183,163, 44, 22, 11, 76, 38, 19,140, 70, 35, 44, 22, 11,172, 86,171, 99,177,217,108,142,197,100, 50,225,
-224,193,131,254, 58, 89, 51,187,116,233, 50,100,227,198,141,202, 95,127,253, 85,153,152,152, 8,137, 68, 2,145, 72, 4,145, 72,
- 4,150,101,193,113, 28, 30,123,236, 49,134,102, 65, 10, 10,138,135, 70,104, 25,141,198,107,141, 27, 55, 38,246,255,113, 50,153,
- 76,226,242,149, 91,165,102,205,154, 23, 92,207,243, 85, 93, 21, 20, 21,141,113, 85,195, 0, 0, 19,174, 23, 56, 94, 16,159,180,
-122,196,113,204,164,140, 18, 0,128, 92, 46, 7,227,252, 25,237, 1, 74,165, 18, 93,186,116,129, 84, 42, 69,179,102,205, 32, 22,
-139,221, 46, 18,137, 4, 98,177,216,231, 77, 97, 24, 6,129,129,129,152, 56,113,162, 32,146,160, 12,144, 97, 68,171,102, 8, 0,
-193,215,167, 47,193,196, 19,112, 28,231, 88,252,225,148, 72, 36, 56,117,234, 20, 56,142,131, 72, 36,114,252, 10,255,215,175, 95,
-143,103,158,121, 6, 28,199, 65, 46,151, 3, 62, 70, 14,118, 78, 35,147,201, 20, 43,149, 74,205, 0, 4,113, 38, 97, 24, 38,230,
-118,210,232, 97, 70,176, 92,134, 23, 23,174, 5, 0,220,156, 51,220,145,118, 7,135, 78,112, 28,147,240,218,179, 96, 24, 6, 98,
-177, 24, 44,203, 86, 26,103, 97, 97,161,126,192,128, 1,123,130,130,130, 54,171,213,106,248, 16,112,184,121,243, 38, 56,142,243,
-152,223, 89,150,197,236,217,179,113,249,242,101,191,226,110, 48, 24,176,120,241, 98,216,108,182,114,188,194,127,215,109,126,138,
-172, 41, 93,187,118, 29,180,113,227,198, 80,134, 97,240,249,231,159, 67, 34,145,160, 71,143, 30, 8, 15, 15,199,150, 45, 91, 32,
-145, 72, 48,102,204, 24,154,249, 40, 40, 40,188,149,121, 98, 0,143, 0,136,180,155, 8,165, 0, 66,156, 14,201,179,255, 70, 10,
-235, 12,195, 28,118,195,211,220,126, 76, 30,195, 48,135,157,214, 77, 0,164,110,182, 23, 0,144,219, 23, 35,202,220,255, 20,167,
-235, 8,231,193,211,117, 57,160,108,254, 33, 0, 59, 0,180, 79, 77, 77,221, 9, 0,217,217,217, 79,100,103,103, 3, 0,146,147,
-147,207, 93,184,112,161,142,160,121,236,213, 83, 18,171,213, 90, 75,168,170, 18,220,162,206,157, 59,123,253,194,183,154,205,183,
- 8, 16,119, 90,202, 93,117,133, 39, 1, 99, 54,155,241,236,179,207, 2,128,199,151,142,243,226,135,118,131,201,100, 2,199,113,
-168, 93, 53, 18, 31,118,107,140, 71,137, 5, 90, 13, 3,107,137, 22,125, 2, 45, 56, 87,175, 9, 22,221,200,195,117,181, 6, 28,
-199,249,197,201,243,188, 71,145, 37, 18,137,176,112,225, 66, 12, 24, 48, 0, 34,145,200, 47, 62,231, 52, 74, 74, 74,218,120,225,
-194,133,112,134, 97,140,246, 52,146, 89,173, 86,149,213,106, 13,183,217,108,225, 21, 73,163,135, 25, 86,158,119,155, 15, 61,229,
- 89,127,210,201, 31,206,194,194, 66,125,106,106,234, 1,153, 76,182, 36, 58, 58, 58, 51, 61, 61,221,167,208,114, 21, 63,174, 31,
- 21,159,125,246, 25,230,207,159,143, 14, 29, 58,248, 21, 78,163,209, 8,134, 97,176,104,209,162, 91,246, 77,158, 60,249,150,235,
-249,224,100, 0,176, 85,170, 84, 25,250,199, 31,127,168,132, 99, 35, 34, 34, 32, 22,139,209,160, 65, 3, 4, 5, 5, 97,207,158,
- 61,176,217,108,126, 63,151, 20, 20, 20, 15, 46,220,105, 17, 39,180, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,
-246,237, 91,206, 48,204, 6,167, 50, 49,213, 94,190,110, 16,214, 9, 33,205,157, 69,143, 93,172, 69, 50, 12,179, 65, 56,222,121,
- 93,248, 37,132,116, 6, 32, 21,214,199,141, 27,151, 50, 99,198,140,105, 99,199,142,125,127,250,244,233,146,113,227,198, 53,156,
- 49, 99,198, 52,225, 58,238,194,225,206,209,242, 58,247,148, 80, 69,117,254,252,121, 79, 85, 84,206, 47, 0,175,165,165, 50, 34,
-210,225,100, 77, 74, 8,119,108,159,152, 94,236,120,129, 45,104, 90, 3, 74,165, 18,221, 38,125,234,151, 83,100, 50,153,144,155,
-155,235,112, 25,124, 45,254,114, 42,228, 1,216,246,118, 3,220, 44,144,226,227,253,133,216,248,247,101,136,197, 98,116,175,215,
- 0, 79, 72,130, 48, 62, 65,138,183, 47,165,193, 66,252,107,211, 75, 8,113, 43,176,132,255, 66, 21,138,191, 66,203, 37,141,110,
- 26, 12,134,130,139, 23, 47,234,249,178, 23,187,156, 16, 18,202, 48, 76,169,221,229,138,245, 55,141, 30,102,164, 54,170,238,112,
-157, 14, 6,117,114,108,127, 70,123,202,145, 38,163, 22,126, 2, 0,232,208,228, 49,159,207,131, 63,156, 5, 5, 5,250,214,157,
-218,239,180,233, 77, 63, 12, 26, 52,232,218, 95,127,253, 37,247, 39,172,238,132,150,224,218, 10, 34,139,227, 56,152, 76, 38,191,
-226,110, 50,153, 60, 62, 31, 18,137,228,118, 28, 45,104,181, 90,211,186,117,235,176, 96,193, 2,132,135,135,163,107,215,174,136,
-141,141,197,170, 85,171, 64, 8,193,240,225,195, 33,151,203, 5,247,154,102, 64, 10,138,135, 27,222,180,136,108,198,140, 25,211,
- 92,133,140,243,186,179,128,114, 17, 83,206, 98, 45,197,199,251,127,131,171,120, 18,174,203, 48,204,134,233,211,167,167,250, 8,
- 71,158, 39,161,229,117, 72,124,163,209,120,173, 81,163, 70,126,169, 9,157, 78,151,237, 75,108,184,251,170,119,118, 9, 2, 3,
- 3,161, 84, 5,130,245,179,220,181, 88, 44, 14,161,178,117,235, 86,200,229,114,244,232,209,227,142, 28, 45,179,217, 12,169, 68,
- 12, 54, 34, 26, 47,206,249, 11, 5,165,122,199, 11,102,199,213,107, 56,150,147,139,183, 91,118,130, 82,158, 11,141,201,228,151,
-243,198,243,252, 45, 34,139,227, 56, 60,251,236,179, 14, 55,193,185,221, 10,188, 84, 29,134,135,135, 31,225, 56, 46,222, 41,141,
- 2,146,147,147,129,127,218,245, 48, 60,207,107, 66, 66, 66,126, 1, 80,133, 16, 18, 15, 32,200,159, 52,162,112,159, 63, 93,183,
-243, 46, 78,213,237,112, 22, 20, 20,232, 83, 83, 83, 15,216,244,166, 31, 50, 50, 50, 14, 0, 8,120,244,209, 71, 43, 44,180, 4,
-129, 37, 22,139, 49,123,246,108,204,159, 63,223,177,223, 95,161,101,181, 90,203, 9,168, 75,151, 46,149,187,150,171,176,243, 81,
-109, 74, 80,214,187,144, 79, 78, 78,118,156, 19, 19, 19,131,144,144, 16,240, 60, 15,158,231, 17, 16, 16, 0,185, 92, 14,137, 68,
- 66, 51, 29, 5, 5,133, 55, 45,162, 31, 59,118,236,251, 12,195,108,176, 59, 75,167,189, 8, 42,119,218,163,185,139, 88,203,243,
-112, 92,170, 59,177,229,252, 95,192,184,113,227, 82, 92,195,225,174,186,210, 81,170,186, 12,187, 95, 14,206, 85, 84,149,245, 18,
-243,246, 34, 11, 12, 81, 65,174, 84, 66, 36, 98,193, 48, 12,241,197,101, 54,155, 29, 5,255, 27,111,188,225,181,221,138,191,237,
-169,204,102, 51, 88, 78,132,172,152, 36,216,216,221,142,115,133,133,229,196,184, 30, 83, 7,162,243,199, 33,246,243,133,235,234,
-104, 13, 31, 62, 28,139, 23, 47, 6,203,178,142,123,194,113, 28,106,214,172,137,107,215,174,121,229,226, 56, 46,254,250,245,235,
- 81,206,247, 81, 16,177,132, 16,216,108, 54, 84,175, 94,221,112,241,226,197, 55,233,163,123,103, 34,203,211,118,155,141,247,219,
-133,113,119, 92, 65, 65,129,190, 95,191,126, 59, 75, 74, 74,126,168, 95,191,254, 37,148, 31, 2,193, 39, 31,199,113,229, 4,150,
- 32,178,230,205,155, 87, 78, 20, 89, 44, 22,191, 62, 4, 44, 22,203, 45,130,103,214,172, 89,229,126, 1,160, 85,171, 86,126, 57,
-195, 0, 8,203,178, 68, 34,145,160, 75,151, 46,104,216,176, 33,126,253,245, 87,240, 60,143, 97,195,134, 65, 46,151, 99,238,220,
-185,176, 90,173,152, 57,115, 38,117,180, 40, 40, 40,188,105, 17,227,244,233,211, 79, 79,159, 62,221,225, 44,185, 58, 90, 30,222,
-187, 61,237,162, 42, 82, 16,105, 0,140,238, 4,145, 59,151,204, 85,128, 57,111,155, 49, 99,198, 52,215,112,184, 86, 87,150, 19,
- 90,247, 10,217,103, 78,225,211,199, 27, 3, 40, 95, 93,184,240,177, 58, 80, 6, 42,161, 12, 10, 68,191,245,187, 1,192, 94,232,
-143,245,203,209, 18,132, 86, 65, 65,129, 87,145, 85, 17, 71,139,149,114, 88, 29, 95, 4, 34, 21,131, 51, 89,202, 9, 45, 17, 39,
-198,205,240, 36,176, 98, 9, 56,155,213, 47, 78, 66,200, 45, 85,133,131, 7, 15, 6,195, 48,142, 30, 98,141, 26, 53,114,230, 98,
-124,189, 28, 71,135,149,181,193,115,173,142,157,153,111,160, 79,236,237,228,207, 35,223,224,220,154,161, 0,128,214, 90,173, 35,
- 45,166, 54,250,167,239,192,156, 83, 59, 29,238,227, 36,188,123, 91,156, 5, 5, 5,250, 71,235,166, 28,144,132, 5,255,112,227,
-198,141, 3, 0,216,254,253,251,135, 52,106,212,200,175,103, 82,232, 92,225, 42,178,156,157, 44,225,215, 71, 15, 91, 39,225,104,
-243, 75, 64, 9,213,136,126,228,121, 34,228,109,149, 74,133,192,192, 64, 71,143,219,128,128, 0, 40, 20, 10, 71,251, 78, 63,133,
- 27, 5, 5,197,195,139, 80, 65,232,216,197, 82, 57,167,201,222,182, 42,213,121,221,157,227,101,119,160,118,249, 40, 95, 55,218,
- 5,154, 91, 8,206,154,203, 57, 27, 60,137, 52, 78, 80,144,206,191, 49, 49, 49,191, 7, 6, 6, 38,249, 27,251,138,244, 98,179,
- 89,204,183, 56, 91, 12,195, 32, 48, 40, 16,242, 64, 37,228, 65,129, 30, 93, 47,111, 66, 75,112,138,132,151,206,146, 37, 75, 16,
- 24, 24,136,151, 94,122,169,194,109,180, 28, 66, 75,194, 98,139,108, 59, 68, 82,174,156,200,226, 56, 14, 34,177, 24,217,129,177,
- 96,197, 98,112, 86,255, 92,178,146,146, 18,112, 28,135, 15, 63,252,208,241, 5,239, 44,178, 42, 18,103,111, 96, 25, 70,112,183,
-100, 53,106,212,120,151, 97,152, 4, 0,137, 90,173, 86,150,149,149,213,145, 62,175, 94,148,129,205,114,139, 11,229,201,125,189,
- 93, 78,193,201,146,132, 5,255, 80,167, 78, 29,135,147,165, 80, 40,132,222,166,190,211,152,101,221,138, 44,215, 30,130, 28,199,
-149,229,101, 31,189, 35,157, 29,173,233,211,167, 59,120,157,157, 44, 1, 21,121,142,132,176,238,220,185, 19,199,142, 29,195, 27,
-111,188, 1,185, 92,142,249,243,231,195,106,181, 98,242,228,201,144,203,229,144, 74,165, 52,243, 81, 80, 80, 55,171,156, 22,113,
- 65,158, 75, 59, 40,198, 69,212,228,185, 19, 88,206,213,132,194,127,134, 97, 44,110,120, 77, 46, 85,138,174,219,133,223,130,233,
-211,167,255, 37, 56, 89, 78,219,203,133,195,167,163, 37,147,201,146, 46, 94,188,232, 24, 8,211,219,175,201,100, 66,135, 14, 29,
-252,118,198,132, 94,135, 28, 39, 42, 39, 44, 20, 65,129, 80,168,130, 32, 15, 12,116, 21, 28,140,175, 66, 92,248, 34,118, 22, 90,
- 31,125,244, 17, 56,142,195,226,197,139, 1, 0,239,190,251,174,223,109,180, 4, 78,216, 24,164,147, 43,104, 60,231, 25,152,126,
-180, 32,103,239, 9,112, 28,135,168, 22, 79,128,127,244, 25,232,228,129,224,108, 86,191,123, 29, 22, 22, 22,226,218,181,107, 16,
-137, 68,120,231,157,119,202,141,117,228,218,147,109,235,214,173, 62,227,238,206,201,250,232, 70,161,131, 71, 46,151,179, 39, 78,
-156, 72,226,121, 62, 89,175,215,215,104,213,170, 21, 79, 31,101, 31,162,136,183,250, 37,170,252,205,159,174,156, 66,155,172,146,
-146,146, 31,110,220,184,113, 16, 0, 59,104,208,160, 16,133, 66,129,111,191,253, 86, 7, 64,186,106,213, 42,185, 47, 81, 36,228,
- 27, 95, 34, 75, 44, 22,151,229,101,127,226, 78,202, 15, 89,226,171, 97,188, 63,121, 94, 8, 43,195, 48,176,217,108,144,203,229,
-229,156,172,128,128, 0,200,100, 50,154,241, 40, 40, 40,124,149, 37,135,253, 46,199, 9,105,238, 36,170, 14,223, 14,111, 69,174,
-231, 11,156, 39,161, 97, 52, 26,113,246,236, 89,127,121,252, 30, 24,179,106,179,199, 48, 41,163, 4, 12,195,224,235, 86,245,161,
- 84, 5, 66,161, 84,226,233, 95,119, 58, 10,238, 83,211,222,133, 76, 25,136, 42,109,186,250, 85,144, 11, 85,135,206, 66,171,184,
-184, 24, 98,177, 24, 83,166, 76, 1,203,178,152, 57,115, 38,226,226,226,144,149,149,133, 85,171, 86,249,229,104,137,108, 34,196,
-190, 80, 23,138,193,193, 80,189,208, 22,161, 93, 62, 66,134,137,195, 62,131, 2,109, 13,103, 32,221, 50, 15, 38,222,230,119, 15,
- 44,171,213,138,157, 59,119,186, 54,120,119,180,169,178, 90,173,176, 88, 44, 48,155,205,152, 57,115,166, 63, 61, 60,111, 73, 55,
-225, 30,218, 7, 65, 21, 93,184,112, 33,146, 16, 18, 6, 32, 24, 64, 62,125, 92,189, 35,182,197,112, 68, 54,251, 31, 0, 96,253,
-244,151, 29,219, 63, 60,245, 79,254,156,253, 99,217, 4, 0,117, 18,187, 86,136,179,160,160, 64,223,189, 67,171, 93, 6, 94,252,
-125,131, 6, 13,202, 57, 89, 1, 1, 1,140,125,221, 47,187,140,101, 89,136, 68,162, 91,170, 11, 61,137, 45,127,218,104, 89,173,
- 86,199, 64,162,222,218, 51,222,142,163,245,242,203, 47, 35, 54, 54,214,225,100, 77,154, 52, 9,114,185, 28,227,198,141,131,197,
- 98,193,188,121,243,104,230,163,160,160,184,231,162,236, 94,192,109, 73,106, 48, 24,210, 26, 54,108, 8, 15,251,226, 2, 2, 2,
-196, 46,145,170, 82,179,102,205, 11,110,170, 16, 59, 3,216,230,174, 80,103, 24, 6, 65,170, 32, 4, 4, 42,161,112,113,177, 2,
-130, 84,144, 5, 6,130,149,184, 45,204,111,225, 20,218,150, 56, 11, 45, 97, 41, 41, 41,129, 88, 44,198,130, 5, 11,160, 82,169,
- 96, 52, 26,125,114, 10, 47, 29,145, 72, 4,221,205, 82,156,155,182, 13,210,128,125,168,209,117, 0, 98,197,114, 72,246,252, 2,
-189,205,226,107,192,210, 91, 56,107,213,170,133, 9, 19, 38,220, 50,172,131, 39,196,197,197,249,140,187,171,147, 53,187,126, 53,
- 72,164, 18,140, 58,115, 19, 70,163,145, 25, 48, 96, 0, 15, 64, 15, 32, 79,175,215,223,240,231,126, 86, 2,238,123, 78,111,189,
- 98, 5,240,196,230, 78,192,184,229, 20,156, 44, 3, 47,254,254,218,181,107,130,147, 21,172, 80, 40,240,213, 87, 95,233, 0,176,
-147, 39, 79, 86, 36, 36, 36,136,252,201, 75, 34,145, 8,115,230,204,113,219, 38,203,157,232,170,200,115,228,124,110,187,118,237,
-220, 14, 88,234, 65,188,221,194, 41,132, 53, 60, 60,220,225,100,217,108, 54, 71,111, 67, 97,244,121, 47, 31, 21, 52,127, 82, 78,
-202,249,240,112, 62,144,112, 91, 2,103,101,101,117,247,116, 66,245,234,213, 47, 94,188,120,177,166, 48, 21,135,189,224,148, 24,
- 12,134, 90,173, 90,181,242,105,237,240, 60, 15,153, 76, 6, 66, 8, 58, 78,152, 1,134, 5, 88,148,127,137, 69, 61,222, 9, 34,
- 17, 7,190,108,170, 15,159,189, 14,245,122,125,185,151,131,187, 69,163,209,192,104, 52,250, 61,154,183,193, 96, 40, 55, 4, 3,
- 67,120, 92,255,115,229, 45,189, 15,133,197,223,118, 59, 1, 1, 1,229,170,126,124, 56, 86,140, 63,142,150,115,213,163, 68, 42,
- 1, 39, 17, 11,142, 86,233,165, 75,151,250,209,108,238, 63,132, 14, 11, 0, 80,187, 85, 15,240,188, 13,196,102, 43, 55, 77, 82,
-221,164,238,224,137, 13,102,139, 14, 70,163,209,215,176, 39, 76,126,126,190,190, 95,191,126, 59, 1,124,215,167, 79,159, 11, 40,
- 27, 93,152, 4, 6, 6,202,196, 98, 49, 15,160, 16, 0, 41, 42, 42, 10,206,200,200,224, 13, 6, 67, 53, 95,225,220,184,113, 35,
-206,158, 61,139, 54,109,218,148,155, 14, 74,112, 69,157, 71,119,247, 39,127, 10,213,229,238, 70,132,247, 36,228,252,133, 72, 36,
- 66,112,112, 48, 36, 18, 9,166, 76,153, 2,137, 68, 2,133, 66, 1, 0,152, 55,111,158, 99,240, 85, 10, 10, 10,138,135, 70,104,
-249, 42, 55,189, 84, 43,122,173, 66,180, 90,173,233, 9, 9, 9, 21,186,152,205,102,203,241, 33,220,210, 87,173, 90, 37,113,118,
- 33,124,253, 18, 66,114,124,188,108,211,215,175, 95, 47,113,231,110,120,154, 96,218, 23,167,205,102, 75, 79, 76, 76,244,232,152,
-184,131,197, 98,201,240, 37, 90,103,228,233,203,137,132, 81,103,110,122,156, 59,145,194,103, 94,243,146, 63, 63,184,221,252,121,
-169,118,237,218, 25, 33, 33, 33,155,162,163,163, 11,246,238,221, 27,222,188,121,243,112,231, 99,154, 55,111, 30,235,114,154, 9,
-158,231, 57, 4,195, 48,233,125,250,244,113,155,231, 5,209,228, 38,127,166,251,202,243,135, 14, 29,146, 56,159,239,137,223,233,
- 57, 74,247, 67,184, 94,111,220,184, 49,235,204,227, 41,239, 91, 44,150, 60,154, 11, 41, 40, 40, 30,122,161,165,215,235,111, 54,
-108,216,208,234, 97,223, 13,111,231, 22, 20, 20, 52,171,236, 8, 88, 44,150, 86,247, 3,103,126,126,126,165,198,221,106,181,166,
-219, 7, 40,245,122, 12,205,226,255, 94, 26, 1, 64,110,110,238,163, 0,160,213,106,225,107, 90,157, 10, 8,194, 74,207,159, 86,
-171,181,213,221,184,167,133,133,133, 45,105,206,162,160,160,160, 66,171, 2,160,147, 17,255, 55,112, 55, 68, 43, 5, 5, 5, 5,
- 5, 5, 69,229,130,165,183,128,130,130,130,130,130,130,130,226,238,128, 65, 89,207, 1,119,168, 72,111,130,206,183,113,237,109,
-148,147,114, 82, 78,202, 73, 57, 41, 39,229,124,232, 56,125,113, 63, 48,189, 25,239, 69,123,233,206,148,147,114, 82, 78,202, 73,
- 57, 41, 39,229,164,156, 15, 35, 8, 33,180,234,144,130,130,130,130,130,130,130,226,110,129,163,183,224, 95,131, 8, 21, 24, 81,
-223, 15,213, 28, 10,192,211,132,113, 38,134, 97,138,110,131,147, 1, 32,177, 47,194, 64, 71, 22, 0,102, 0,102,134, 97,136,111,
-142,143,217,204,204,208, 20, 98, 19, 55, 39, 12, 35,230,121,252, 93,173, 90,213,227, 12,243,132, 9, 0,148,209,117,235, 5, 42,
-229,157,141,102, 83,146, 76, 44, 61, 91,172,213,108, 53,230, 94, 76,163,217,131,130,226, 95, 65, 47, 0, 19, 81,214,172,100, 58,
-128,149,244,150, 80, 80,220, 37,161, 21, 24, 24,120,132,101,217,120, 95,227,243, 8,176,207,101,150, 94, 84, 84,212,172, 2,215,
-238, 23, 24, 24,216, 65, 44, 22, 63, 14, 0, 22,139,101,175, 70,163,249, 11,192, 42, 0,214,219,140,147, 10,192,179, 0, 6,218,
-215,127,178, 23, 22,234,219,228,107, 24, 28, 28,188, 70, 44, 22,147,252,252,252, 22, 0, 16, 30, 30,126,192, 98,177, 48,106,181,
-250,105, 0, 39, 43,200,199,138,197,226,217, 45, 90,180,104,187,123,247,238,239, 0, 44,168,164,180,148,177, 44,235, 86,160,240,
- 60,159,120, 27, 34, 75, 2, 32,120,193,130, 5,225,203,150, 45,107,156,158,158,222, 0, 0,226,227,227, 79, 13, 26, 52,232,248,
-136, 17, 35, 10, 8, 33, 37, 12,195,152,189,241,100,102,134,166,228,102, 95,125, 35, 39,247,236,179, 0, 16, 19,219, 96,165, 72,
-196, 74, 8, 57,186, 95, 17, 49, 48,162,102,141,196,255,253,252,237, 2, 73, 98, 82, 85,108,223,119,236,145, 17,111,190,159,146,
- 1,124, 70,197,214,189, 67, 80, 80,208, 17,150,101,227,189, 61,227,238,158,121,155,205,150, 94, 88, 88,216,204, 19, 39,199,113,
-241,222,202, 11,119,219,120,158,191,154,159,159,239,118,168, 9,149, 74,181,159,227,184, 36,127,185,132, 95,171,213,154,238,169,
-151,174, 74,165, 58, 34, 18,137,226,189,197,211,221, 62,158,231,175,230,229,229,121, 10,231, 45,113,175,140,112,222, 14,167,183,
-112, 10,229, 17,128,121,225,225,225,143, 21, 20, 20, 60, 15,224,125,181, 90,221, 72, 36, 18, 33, 44, 44,236,125,147,201,116, 57,
- 56, 56,248,155,146,146,146,125, 0,222, 4, 64,231, 75,165,160,168, 44,168, 84,170, 28,141, 70, 67, 4,240, 60, 79, 44, 22, 11,
- 49, 26,141, 68,175,215, 19,173, 86, 75, 52, 26, 13, 81,171,213,164,164,164,132, 20, 20, 20,144,200,200, 72,215,193, 27, 61,213,
-225, 54, 80,169, 84, 23,103,204,152, 97,188,118,237, 26, 49,155,205,196,108, 54,147,180,180, 52,242,233,167,159, 26, 85, 42,213,
- 69, 0, 13, 60,156,219,217, 67, 97,209, 5,192,242,198,141, 27,155, 54,110,220, 72, 12, 6, 3,209,106,181,100,229,202,149,164,
-126,253,250, 38, 0,203,237,199,176,126,114, 2, 64,235,152,152,152,244, 43, 87,174,216,182,110,221,106, 14, 14, 14,222, 22, 28,
- 28,188, 45, 45, 45,205,118,229,202, 21, 62, 34, 34, 34, 29, 64,235, 10,132, 19, 0,158, 25, 53,106, 84, 78, 90, 90, 26,105,215,
-174,221,223, 78,219, 25,248,158,231,174,179, 59, 39,139, 16, 18, 67, 8,137, 69,217, 32,151,183, 44,132,144, 88,251, 49,161,126,
-114, 42,175, 94,189, 90, 53, 58, 58,122, 6,195, 48, 38, 87, 62,134, 97, 76,209,209,209, 51,174, 94,189, 90,149, 16,162,244,198,
-153,126, 99,225,171,155, 54,118, 42,214, 22,157, 39,218,162,243,228,187,239,219,171, 95, 31,241,252,242,216,234, 77, 22,135,196,
-167, 44, 56,123,254,210, 34, 66,200,162,191, 14, 95, 92,244,209,151,191, 47,122,114,196,220,175,194, 19, 26,191, 94,129,251,121,
- 39,160,156, 0, 66, 66, 66,178,181, 90, 45, 33,132, 16,155,205, 70,204,102, 51, 49, 26,141, 68,167,211, 17,141, 70, 67, 74, 75,
- 75, 29,207,121, 73, 73,137,227,127, 84, 84,148,199,231, 61, 52, 52, 52, 71,175,215,151, 43, 59, 76, 38,147,163,252,208,233,116,
- 68,167,211, 17,173, 86,235, 88, 52, 26, 13,169, 82,165,202, 77, 47,225,204, 18,194,201,243, 60,177, 90,173,196,108, 54, 59,120,
- 13, 6, 67,185,197,104, 52, 18,163,209, 72, 18, 18, 18,252, 14,167, 63,156, 6,131,129,196,199,199,103,122,226, 12, 11, 11,203,
- 49, 24, 12,229, 56,157,227,239,202, 43,172,199,196,196,100, 87,132,211,159,112,122,187,159,118, 44,184,112,225, 2,209,235,245,
- 36, 46, 46,174,224,233,167,159,182,216,108, 54,178,113,227, 70,210,184,113, 99,190,125,251,246,230,252,252,124,242,210, 75, 47,
- 17, 47, 31,133,244, 57,162,156, 20,158, 77, 11,207,142, 22,195, 48, 80, 42,149, 88,177, 98,133,199,233, 56,156,255, 87,171, 86,
-205,223,235, 54, 75, 74, 74,218,185,103,207, 30,121,108,236, 63, 3, 98,155, 76, 38,132,134,134, 98,216,176, 97,210, 94,189,122,
-213,236,218,181,235,129,235,215,175,183, 3,112,196, 7,223, 83,145,145,145,159,127,248,225,135,209,253,251,247, 71,120,120,185,
- 65,183,209,175, 95, 63, 60,253,244,211,146, 11, 23, 46, 12, 88,178,100,201,128,133, 11, 23,102,107, 52,154, 17, 0,126,241, 70,
- 42,151,203,251, 84,169, 82,229,171, 61,123,246, 68, 69, 69, 69, 33, 57, 57,153, 29, 51,102, 76,205, 90,181,106,201,227,227,227,
-217,172,172, 44,252,250,235,175,113,207, 61,247,220,234,156,156,156,255,153,205,230,117,126,196, 93, 26, 30, 30,254,254,255,254,
-247,191, 8,181, 90,109, 61,122,244,232, 69, 97,187, 84, 42,157,220,178,101,203,230, 59,118,236,248, 17,192, 55,183,227,100, 17,
- 66,212,248,167,138, 79,128, 69,216,239,143,179, 69, 8,145,254,253,247,223, 97, 45, 91,182,252,197,104, 52, 54,121,227,141, 55,
-110, 76,155, 54, 77,174, 82,169, 84, 0, 24,181, 90, 93, 52,113,226, 68,211,220,185,115,223,171, 87,175, 94,167,253,251,247, 63,
- 69, 8,177,216, 5,217,173,124, 12,227, 8,207,205,140, 60,236,220,199, 75, 39,140,123, 55,254,147,169, 73,215, 15,159,185,201,
-115,114, 21,126,219,117, 26, 57, 5, 26,252,190,255, 12, 98,194,131, 24,137, 76,156, 18, 28, 87,191, 93, 73,198,153, 93,240, 50,
- 66, 58, 69,229,128, 97, 24, 40, 20, 10,252,246,219,111,183, 76, 93,229,110, 90, 43,142,227, 16, 18, 18,226,115,118,131,128,128,
- 0,108,221,186,213,237,220,139,238,166,244, 9, 14, 14,134,183,143, 13,134, 97, 16, 16, 16,128,189,123,247,130,101, 89,183, 83,
- 3,185,110, 83, 42,149, 96,189,204,117, 37,112,238,218,181,203, 39,151,240, 27, 24, 24, 8,148, 85,253,123,126, 40,101, 50,236,
-217,179,199, 99,156, 93,255, 7,218,231,123,245,197,185,119,239,222,114, 83,127,185, 78, 9,230,188,174, 84, 42,193,248, 32, 13,
- 13, 13,109, 17, 31, 31,143, 67,135, 14, 97,213,170, 85, 97, 41, 41, 41,184,116,233, 18, 24,134,193,180,105,211,152,250,245,235,
-139,179,179,179,209,166, 77, 27,172, 93,187,182,149, 90,173,166, 15, 12,197,191, 37, 88,196, 0, 30, 1, 16,137,178,102, 55,165,
- 0, 66, 80, 54,147,134, 20, 64, 1, 0,185,125, 49, 2,208, 0,136,176,159,158,111, 47, 91,156, 5, 66,158,243,228,211,132,144,
-230,118,110, 97,134,138, 72,167, 99,133,107,184,174,187,254,186,229,230, 0, 96,195,134, 13,194,203,172,125,106,106,234, 78,231,
-200,249, 35,178,132,121,202,220, 60,211,174, 93, 52,101, 74,165,114,205,129, 3, 7,228,145,145,255,196,193,104, 52,162,180,180,
- 20, 26,141, 6,165,165,165, 8, 10, 10,194,170, 85,171,228,157, 58,117, 90, 83, 90, 90, 90,203,126,211, 60,113,206,201,202,202,
-138,182, 90,173,144, 74,221, 55, 81, 98, 89, 22,117,235,214,197,251,239,191,143,110,221,186,197,116,232,208, 97,142,139,208,186,
-165, 43,169, 66,161,248,234,232,209,163, 81, 10,133, 2, 23, 47, 94, 68,122,122, 58, 70,141, 26, 85,149,231,121,220,188,121, 19,
-151, 46, 93, 66, 70, 70, 6,150, 44, 89, 18,213,183,111,223,175,220, 8, 45,119,221, 83,223,120,251,237,183,235,132,134,134,178,
-159,126,250,105,177, 86,171,253,194,190,125,194,252,249,243, 95,104,219,182,109,212, 43,175,188, 66,246,238,221,187,204,158,112,
- 30,239,167,115,155, 44,123, 53, 31,236,153,239,156,203, 57,117,157,246,131, 16, 18, 3,192,200, 48, 76,177, 27, 78, 6, 64,112,
-215,174, 93,223, 49, 26,141, 77,246,236,217,115,249,241,199, 31, 79, 0,144, 37,100,190,224,224, 96,229,156, 57,115,162, 83, 83,
- 83, 47,116,236,216,177, 73,215,174, 93,223,201,203,203,155, 70, 8,201,115,106,179,229,224,228,121,252, 29, 19,219, 96,229,174,
-253, 35,158,221,177,215, 36,121,247,205,143,110, 84,171,154, 88,242,247,197, 66,219,153,171,121, 40,213, 91,241,100,199,178, 9,
-204, 91, 52,168,134,207, 87,236,193,176,183, 62, 16,255,178,114,233,211,151, 9,148,154,204, 51, 27,189,220,207, 59, 5,229,132,
-163,138, 9, 98,177, 24, 79, 60,241, 4, 24,134,185,101, 46, 79,177, 88,140,253,251,247,163, 99,199,142, 16,139,197,120,249,229,
-151,253,226,228, 56, 14, 93,187,118,117,204,163,232,204,231, 42, 26, 60,104,130,109,183,124, 29,114, 28, 88,150,245, 56,145,182,
- 43,167,175,114, 73, 8,167, 55, 46,231,125,190,194,105,159,242,200,111,145,229, 47,167, 16, 78,142,227,208,170, 85, 43, 28, 63,
-126,220,171,232,242,160, 47,203,197,189,168,168,232,197, 90,181,106,237, 90,176, 96, 65, 24, 0, 20, 20, 20, 56, 38,188, 23,137,
- 68, 56,127,254, 60, 76, 38, 19, 62,254,248, 99,179, 90,173,126,133, 62, 71,148,243,110,114,122,211, 34, 0,218,142, 27, 55,174,
-217,140, 25, 51,166,181,108,217,242,231,125,251,246, 45,103, 24,102, 3, 33, 36, 85,248, 29, 55,110, 92,202,140, 25, 51,166,141,
- 29, 59,246,253,233,211,167,159,102, 24,102, 3, 0,184,174,219,203,146, 84, 23, 17, 23, 41,240,216,159,185,114,199,186, 91,119,
-253,117,199,237, 16, 90, 0,144,154,154,202,216, 35,201, 56, 23,106,254, 10, 45,127,230,238,227, 56,110,248,180,105,211,162,189,
-137, 44,141, 70,131,204,204, 76, 36, 36, 36,224,229,151, 95,142, 94,176, 96,193,112,171,213, 58,203, 11,173, 68, 36, 18,225,208,
-161, 67,200,205,205, 69,195,134, 13,145,148,148, 84,238,128, 43, 87,174, 96,211,166, 77, 40, 46, 46, 70,211,166, 77,129,178,198,
-221,110,209,168, 81,163,143,235,214,173,219,149,101, 89,171, 92, 46,199,223,127,255,141, 38, 77,154, 96,197,138, 21,168, 86,173,
- 26, 20, 10, 5, 46, 92,184,128,134, 13, 27, 98,231,206,157,136,140,140, 68,227,198,141,173,106,181,122,119, 97, 97,225, 95,215,
-175, 95,255,216, 83, 56,227,226,226, 62,122,253,245,215,165,153,153,153,252, 15, 63,252,176, 7,192, 30, 0,195, 63,248,224,131,
- 33,221,186,117,139, 58,118,236, 88,201,225,195,135, 15,122, 16, 89,254, 56, 89, 86,215,151,146,205,102, 51,234,245,122,147,209,
-104,180,176, 44,155,198, 48,140,201,102,179,213,242,100, 66, 12, 30, 60,184,122,126,126,254,176,183,222,122,235,154, 93,100,157,
- 71, 89, 3,120, 0,128,213,106, 53,106, 52, 26,117,203,150, 45, 19,158,123,238,185,203,203,151, 47, 31, 54,120,240,224, 85, 63,
-252,240,131, 6,128,222,149,176, 90,181,170,199, 69, 34, 86,162, 45, 13,187,186,122,213, 55,111,111, 90, 63,188,234,205,155, 25,
- 53,195, 35, 34,181,146,192,200,204, 85, 63,125,127, 4,128, 41, 51, 79,141,147, 87,178, 33, 22,139,112,246,102, 9,218,118,239,
- 39,190,124,113,106,107, 0, 27,233,183,220,221,255, 88, 20, 38,161,222,177, 99,135, 87, 71,107,255,254,253, 16,139,197,144,203,
-229,152, 59,119,174, 87, 82, 65, 24, 8,110,145, 47, 49, 35, 76,142,238,205,125,226,121,222, 49,209,187,235,242,197, 23, 95,224,
-173,183,222, 42,119, 13,187,216, 96,124,113,122, 10, 95, 66, 98, 34,114,115,114,202,109,243,103, 82,122,155,205, 6,177, 88,140,
-197,139, 23, 35, 53, 53, 21, 27, 54,108,240,250,251,196, 19, 79,128,101, 89,226,207,253,108,213,170, 21,204,102,179, 35,204,231,
-207,159,119,203,187,112,225, 66, 95,193,236, 5, 96, 98,147, 38, 77, 84, 29, 58,116,192,174, 93,187,240,244,211, 79, 27,205,102,
-243, 69, 0,232,217,179,103,237, 5, 11, 22, 72,143, 30, 61,138,240,240,112,241,141, 27, 55,190, 3,109, 32, 79,113,151,225, 78,
-139, 8,239,188, 25, 51,102, 76,115, 21, 49,206, 16,246, 51, 12,179, 97,250,244,233,169,206,162,200,121, 93,112,157, 92, 68, 92,
-138,179, 35,229, 44,162, 60, 9, 40,151,247,173,243,241,121,110,133,150, 61, 98,237,157, 93, 32,161,240,245, 37,178,188,124, 57,
-150, 67,112,112,112,143, 39,159,124,210, 33,114, 12, 6,131, 67, 96, 9, 34, 75, 88,191,112,225, 2,154, 53,107, 38, 9, 14, 14,
-238, 81, 80, 80, 48,203, 15, 17,135, 42, 85,170, 32, 63, 63, 31,167, 78,157, 66, 66, 66, 2, 44, 22, 11, 54,111,222,140,146,146,
- 18,136,197, 98, 72, 36, 18,152,205, 94,219,110,163,110,221,186, 79, 44, 91,182,172,217,210,165, 75,139,132, 47,186,159,126,250,
- 9,132, 16, 68, 70, 70, 66,167,211, 33, 39, 39, 7,127,253,245, 23,172, 86, 43, 2, 3, 3,145,156,156, 44,237,211,167, 79,235,
-137, 19, 39,138,189, 8,173, 86, 79, 63,253,116,176, 74,165,194,155,111,190, 73,204,102,243,116,251,182,143, 70,140, 24, 17,158,
-150,150,102,122,245,213, 87, 15,153,205,230, 79, 5, 51,209, 89,224,120, 72, 88,143, 78,150,197, 98, 17,238,233, 53,141, 70,131,
-136,136,136, 4,103,103,203,147, 24,220,187,119,111, 43, 0,162,201,147, 39, 7, 0,200,113, 14,131,201,100,130, 70,163,129, 86,
-171,181,148,148,148,228,142, 30, 61,218,186,124,249,114,145,253,156,179,238,132, 22,195, 60, 97, 82,169, 20, 82, 66, 68, 31, 44,
- 90,180, 40,176, 91,183,110,108, 96, 96, 32, 74, 75, 75, 85,191,255,241, 71, 96,167, 14,173,147,167,205,248,100,139, 42,190, 97,
-206,222,191,175, 34, 35,187, 4, 38,139, 5,201,177,193,101,126, 24,197, 93,135,189, 35,139,195,209,114, 22, 21,187,118,237, 66,
-247,238,221, 29,207,186, 68, 34, 41,231,124,249,226,228, 56, 14,221,187,119,191,197,225,217,177, 99,135, 91,247,201, 23,156, 69,
-145,171, 56,114, 39,192, 88,150,245, 57, 96,160,224,230,185, 19, 91,206,174,190,139,120,243, 85,205, 1,142,227, 48, 98,196, 8,
-136,197, 98,140, 25, 51, 6, 28,199,161,113,227,198,224, 56, 14, 45, 91,182,132, 88, 44, 70,199,142, 29, 43, 28,247, 3, 7, 14,
-160, 73,147, 38,142, 48, 53,110,220, 24,205,155, 55, 7,199,113,104,211,166, 13,196, 98, 49,186,118,237,234, 15,231,251,165,165,
-165,141, 2, 3, 3,113,225,194, 5,136, 68, 34, 48, 12,115, 9, 64, 35, 0,136,141,141,189,172,211,233,170, 27, 12, 6,188,254,
-250,235,140,201,100,106, 56,102,204,152, 15, 12, 6, 3, 21, 90, 20,119, 13,174, 90,196, 9,250,177, 99,199,190,207, 48,204, 6,
-193,161,114,117,158,220,173,187, 41,155, 4, 7,234,176,253, 89,109,238, 34,226,242, 24,134, 57, 76, 8,233,233,233, 92, 0, 38,
- 23, 97, 85,174,234,208,185,218,208,167,163, 37, 20,190,254, 10, 45, 95, 48, 24, 12,143, 68, 69, 69,121, 20, 89,206,191, 38,147,
- 9, 73, 73, 73, 48, 24, 12,143, 84,244,165, 17, 27, 27, 11,179,217,140,111,190,249, 6, 18,137, 4, 18,201, 63,250,194,100,242,
-110, 22,157, 57,115,230,218,129, 3, 7,154, 52,109,218, 52,116,237,218,181,121,237,218,181,139,236,214,173, 27,228,114, 57,244,
-122, 61, 44, 22, 11, 90,180,104,129,186,117,235, 34, 61, 61, 29,191,255,254,123,126,173, 90,181, 34, 14, 30, 60,200,103,103,103,
- 95,247, 66,221,165, 83,167, 78, 96, 24, 6,127,252,241, 71, 62,128,195, 50,153,108,211,212,169, 83, 67, 77, 38, 19, 63,104,208,
-160, 27,133,133,133,111, 1, 48, 75,165,210,249,237,218,181,107,185,109,219,182, 31,121,158,159, 91,209,140,234,122,111,181, 90,
- 45, 2, 2, 2,252, 25, 74, 66, 92, 88, 88,216, 0, 0,148, 74,101, 24,128,203,142, 28,174,215,151, 19,195, 38,147,201, 16, 22,
- 22,166, 4, 0,251, 57, 98, 15,156,145, 86, 43, 86, 95,191,126, 53,200,185,253, 92, 72, 72, 8, 6, 62,247, 28,251,120,171, 86,
-210, 70,143, 60,210,117,252,103, 75, 87, 84, 9, 87,153,146,171,132,195, 98,179, 96,219,150,205, 60,225, 45, 91,104,177,115,111,
-132,150, 32, 54, 92, 29, 45,177, 88,140,157, 59,119,222,178, 77, 34,145,224,235,175,191,246, 75, 24, 8,162,202, 83,213,153, 75,
- 85, 23,227, 75,192,136,197, 98,136, 68, 34, 44, 94,188, 24, 60,207,227,237,183,223, 46, 87,157,232,204,239,151,157,231, 36, 2,
-235,126,196, 3, 48, 33,125,182,204,113,190,107,120,237,231,248,229,146, 45, 88,176,192, 47, 71,171,103,207,158, 62,133,171,115,
- 13,131,115,184,142, 31, 63,238,150,119,209,162, 69, 62,239,167,205,102,195,198,141, 27, 29, 34, 85,192,248,241,227, 95,151, 74,
-165,209,187,119,239, 70,118,118, 54,180, 90, 45, 52, 26, 13, 90,180,104,145,204,178,236,223,217,217,217,105,103,207,158,125,146,
- 62, 61, 20,247,208,209, 50, 78,159, 62,253,244,244,233,211,221, 58, 86,174,206,146, 55,231, 73, 16, 88,118, 65, 20, 41,136, 55,
-148, 53,171, 57,236,235, 92, 0, 82,215,170, 67,175, 70,144,139,138,156,232,174,240,245,167,250,208, 79, 59,157, 99, 24, 6, 6,
-131,193,173,192,114, 22, 7,102,179, 25,133,133,133,176,217,108,183, 61,214,151,187, 47, 89, 95, 66,235,212,169, 83, 47, 13, 25,
- 50, 36, 51, 56, 56,184, 81, 94, 94, 94, 46,207,243, 29,247,239,223, 31,201,113, 28, 84, 42, 21, 84, 42, 21, 54,109,218, 4,133,
- 66,129, 17, 35, 70,228,218,108,182, 93, 65, 65, 65,225,122,189,254, 68,118,118,246,120,143, 10, 70, 44,238,218,166, 77, 27, 28,
- 61,122, 20, 69, 69, 69, 91, 1, 52,126,254,249,231,187, 87,173, 90,149,153, 58,117,170,225,202,149, 43,115, 1,228, 42,149,202,
-101,203,150, 45,235,208,180,105,211,160, 65,131, 6, 97,231,206,157,139, 0, 24,252,141,179, 86,171, 45, 39,176,212,106, 53, 74,
- 75, 75,161, 84, 42,173,126,222, 51, 49,254,233, 97, 8, 66,136, 35,109,236,110,150,144, 62,132,227, 56,161, 87,163, 39,145, 5,
-165, 82, 57,121,233,210,165,114,215, 78, 10, 54,155, 13, 57, 57, 57, 80,169, 84,248,112,252,120,201,164, 81,175, 52, 17, 5, 70,
-239,103, 89, 6, 38, 51, 41, 38,188,105,179, 54,167,255,110,224, 99, 90,242,220, 3, 8,194,160,119,239,222,183, 84, 23, 74, 36,
- 18,108,221,186, 21,125,251,246,117,124,184, 52,109,218,212,231,199,149, 32, 12,122,245,234,229,112,134, 54,111,222,236,182,218,
- 79,112,164,252, 17,132,194,177, 35, 71,142, 4,199,113,248,252,243,207,241,206, 59,239,128,101, 89,204,158, 61, 27, 44,203, 98,
-194,132, 9,126,139, 76,103, 1,147,246, 73,217,111,252, 59,106, 20, 44,140, 6, 0, 4,169, 84, 66,132, 42, 84,246,112, 28,231,
-112,178, 30,121,228, 17,136,197, 98,180,108,217, 18, 28,199, 57,156,172, 30, 61,122, 56,223, 71,226, 15, 39,199,113,184,120,241,
-162, 35,204, 45, 91,182, 44,231,100,113, 28,135,158, 61,123,250, 19,204,105, 33, 33, 33, 19,235,214,173, 91,111,206,156, 57, 98,
-145, 72,132, 78,157, 58,213,142,137,137,185,110,181, 90,195, 39, 79,158,172,112,115,142, 28, 64,163,122,245,234, 41,233, 83, 67,
-113, 23, 29,173,137,110,118,133, 58,183,185,170,192,135,228, 6,231,227, 5, 14, 87,113,100,119,200,118,249,226,114,119,174, 47,
-112,130,130,244,102,169,251, 35,180,236,182,179,215,139, 41, 20,138,147,185,185,185, 45,229,114,121, 57,145,229, 78,112,137, 68,
- 34,100,103,103, 67,161, 80,156, 52, 26,141,149,150,136,190,170, 14, 1, 24, 46, 93,186, 52,202,105,189,115,143, 30, 61,126,216,
-186,117,107,236,182,109,219,112,240,224, 65, 68, 70, 70, 98,193,130, 5, 89, 57, 57, 57, 47, 1,216,154,159,159,239,243,186,213,
-171, 87,111, 16, 24, 24,136,189,123,247, 2,192, 78, 0,175, 12, 27, 54,140,177, 88, 44, 88,184,112,161, 22,192, 31, 33, 33, 33,
- 27, 87,173, 90,213,164, 81,163, 70,210,109,219,182,169, 15, 30, 60,248,167,159, 34,203,198,243,252, 45, 2,203,249,158, 6, 5,
- 5,249,227,104, 89,130,131,131, 79,169,213,234,126,122,189, 94, 45,147,201,130,212,106,181,209, 89, 96, 9,252, 28,199,137, 47,
- 94,188,152, 9, 32, 57, 56, 56,248, 20, 60, 84,115,114, 28,215,169, 83,167, 78,156,107, 26,228,228,228, 32, 59, 59, 27,102,179,
- 25, 77,155, 54,101, 68,140, 69, 84,116,243,164,203,176, 14, 84,100,221, 35, 71,139, 8,207,186,208, 75,208, 93, 79,195,205,155,
- 55, 59,214, 89,150,197,247,223,127,239,151, 40,218,186,117,171,215, 6,235, 46, 85,135, 62,173,113,225,248, 47,191,252,178,108,
-122, 11,187,147,197,178, 44,198,142, 29, 11,153, 76,134,169, 83,167, 98,236,216,177,224, 56,206,103,213,161,179,128, 73, 28,163,
-115,254, 56, 42,123, 40,236,237,161, 24,134,113, 22, 91,140,191,226,205,155,155,231, 79, 77,128, 51,167,112, 94, 64, 64,128,199,
-134,240, 46,156,222, 46,240, 27,128,171,177,177,177,123, 91,182,108, 25,124,228,200, 17,204,158, 61, 91, 98, 52, 26,171,109,219,
-182,205,113, 93,119,247, 75,171,213,202,233,147, 67,113, 55,220, 44, 47,187,243, 92,218, 87, 49,206,213,120, 94,126, 93,143,135,
-211, 54,103,222, 60,134, 97, 44,110,174,151,231, 70, 92,185, 94,195,249,152, 60,143,142,150,175,194,194,151,224,242,199,209,210,
-233,116,127,254,241,199, 31,205,159,123,238, 57,206, 91,181,161, 86,171, 69,116,116, 52, 78,159, 62,109,213,233,116,127,250,225,
-148, 85,166,208,114,197,182,220,220, 92,145,197, 98, 65,205,154, 53, 17, 23, 23, 7,131,193,128,226,226, 98, 17,128,173,126,114,
- 72,148, 74,165, 8, 0,138,139,139,129,178,174,166,181,107,213,170,133,163, 71,143,162,176,176,240, 23, 0,221, 38, 78,156,216,
-180, 69,139, 22,146, 21, 43, 86,232,222,120,227,141, 95, 44, 22,139, 95, 74,131,231,121,147,213,106, 77, 98, 89,214, 92, 92, 92,
-156,225,124, 63,163,163,163,195,148, 74, 37,147,147,147, 99,241, 71,104, 53,106,212,232,208,141, 27, 55, 48,121,242,228,188,105,
-211,166,213, 42, 45, 45, 45, 42, 41, 41,177, 58,139, 45,131,193,192, 70, 68, 68,200, 22, 46, 92, 40, 7,128, 70,141, 26, 29,242,
- 36,180,180, 90,109, 85,133,226,159, 15, 99,163,209,136,236,236,108,100,103,103, 35, 39, 39, 7,165,165,165, 72, 78, 78,134, 78,
-167, 75,160,197,204,191, 38,180,202, 85,159, 57, 63,223,206, 47,242,138, 60,235,206, 2,166,119,239,222,142,182, 93,130, 67, 38,
- 44,171, 87,175,118,109, 96,238,151,208,250,242,203, 47, 49,114,228, 72, 4, 4, 4, 96,206,156, 57,229,170, 14, 93,197, 1,207,
-243,140, 63,113, 79,122, 79,143,236,249, 97, 16,139,197, 8,127, 35,167, 92, 21,157, 27,193,225, 87, 56,167, 77,155, 86, 41, 85,
-135,206,156, 9, 9,101,143,202,226,197,139,209,175, 95, 63,236,222,189,251,182,171, 14, 83, 82, 82,126,218,176, 97, 67,240,153,
- 51,103,160, 86,171,145,151,151, 7,163,209,136,244,244,116,143,181, 2,246,178, 60,128, 62, 57, 20,247,184,156, 58,124, 47,121,
- 43,243,122,156,143, 23,184,223, 66,203, 31, 71,203,104, 52,206,121,243,205, 55,135,117,238,220, 57, 44, 40, 40, 8,153,153,153,
-183,136, 44,141, 70,131,192,192, 64,232,245,122,172, 95,191, 94,109, 52, 26,231,248, 18, 7, 22,139, 5, 81, 81, 81,200,207,207,
- 7,239,161,253, 52,203,178,144,203,229,208,104, 52,128,143, 70,230,238, 94, 24,102,179, 25, 22,139, 5, 22,139, 5,102,179,185,
-162, 51,114, 43,148, 74,165, 32, 60, 0, 64, 91,165, 74,149,154, 1, 1, 1,184,118,237, 26, 80,214,179,175,115,247,238,221,197,
- 5, 5, 5,228,213, 87, 95,221, 67, 8,121, 29,222, 71,199, 55,237,218,181, 43, 9, 0,228,114,249, 5, 0, 72, 79, 79,183, 20,
- 23, 23,151,115, 10, 21, 10, 5,233,219,183,111, 44, 33, 4,187,118,237, 74,146, 72, 36, 4,158,123, 53, 26,214,173, 91,119, 38,
- 56, 56,120,249,140, 25, 51,158, 75, 77, 77, 61,221,160, 65,131, 36,173, 86,155,171,215,235,245, 6,131,129,136, 68, 34, 73,104,
-104,104,192,150, 45, 91, 46,239,223,191,191,179, 74,165, 90,190,110,221,186, 51,158,156, 55,165, 82,153,174,211,233, 18,133, 52,
-117, 22, 89,217,217,217, 32,132,224,234,213,171, 80, 40, 20, 55,124, 85,235, 82,220, 61, 8, 31, 85,174,206,139,235, 54,127, 69,
-150,179, 48,216,178,101,139,215, 49,180,252,229,116, 22, 69,239,188,243, 14,230,207,159,127,139,163, 53,117,234, 84, 0,192,248,
-241,227,253,110,163, 37,184, 87,217,243,195, 16, 51,178,176, 92,216, 1,128, 17,194, 87,177,103, 30, 28,199, 97,242,228,201,183,
- 52, 82,119,174,218,243,179,138,175, 92, 56,115,115,115,193,113, 28,194,194,194, 48,112,224, 64,116,237,218,213, 81, 5, 89, 81,
-222,115,231,206,237,125,239,189,247, 26,166,164,164, 96,202,148, 41,133, 33, 33, 33, 65,175,189,246, 26, 87, 92, 92,204,120,115,
-180,168,208,162,160,168, 4,161, 37, 60, 96,254,246, 58,244, 80, 88,118, 70,249,177, 54, 74,116, 58,221,192, 46, 93,186,172, 93,
-185,114,165,188,122,245,234, 56,119,238, 28, 10, 11, 11, 97, 50,153, 32,145, 72, 16, 27, 27,139,226,226, 98,124,255,253,247,122,
-157, 78, 55, 16, 64,137, 15,206, 15,154, 53,107,246,213,172, 89,179, 2, 26, 55,110,140,194,194, 66,104, 52, 26,135, 16, 98, 24,
- 6, 42,149, 10,114,185, 28,135, 14, 29,194,230,205,155,245, 0, 62,240,193,233, 78,205,193,108, 54, 59, 4,151, 31, 66,203,153,
- 83, 41,184, 58, 58,157, 14, 0, 44, 85,171, 86,141, 1,128,171, 87,175, 2, 64, 90,114,114,242,196,234,213,171, 51,203,150, 45,
- 35,132,144,205, 30, 68,150,131,147, 97,152, 66, 66, 72, 17,128, 24,147,201, 36, 1,128,146,146, 18,115, 68, 68, 68,148, 76, 38,
-227,229,114, 57, 31, 16, 16,192,103,102,102, 90,173, 86,171, 4, 0,218,180,105, 99, 2,144,237, 50, 71,161, 51, 39, 79, 8, 81,
- 47, 90,180,104,226,160, 65,131, 90,182,106,213, 42,101,232,208,161,167, 94,125,245, 85, 54, 46, 46, 46,180,180,180,212,112,233,
-210,165,162,207, 62,251,172,244,192,129, 3,157,197, 98,241,245, 69,139, 22, 77, 4,160,102, 24,134,119,199,105,181, 90,255,220,
-182,109,219, 75,169,169,169, 92, 70, 70, 6,114,114,114, 28, 34, 43, 39, 39, 7,117,235,214,197,254,253,251,109,102,179,121, 91,
- 5,238,103,101,129,114,150,125,132, 16,225, 89,247, 36,176,132,143, 41,127, 57,157, 69, 81,191,126,253,202,185, 88, 18,137, 4,
-107,214,172,113, 91,110,184,121,174,202,197,221,121,140,175,247,222,123,175,156,104,251,240,195, 15, 61, 22,103,190,238,167,192,
- 83,178, 56,174,124,175, 67, 15,207,185,183,112, 10,101,167, 88, 44,198,135, 31,126,232,183,163,133, 91,219,104,221,194, 41,196,
-189, 93,187,118,208,233,116, 14, 33,235,201,209,242,117, 63,109, 54,219,200,249,243,231, 19,149, 74,245,152, 90,173,126,254,198,
-141, 27, 75,116, 58,221,163, 37, 37, 37, 94, 29, 45,163,209, 40,163,207, 17,229,196,221, 25,159,235,225, 17, 90,246,151, 36,170,
- 86,173, 90,110,238, 44,150,101,203, 45, 21,105,103, 96,199,150,139, 23, 47, 62,245,248,227,143,255, 56,114,228,200,160,198,141,
- 27,139, 19, 19, 19,161,213,106,113,237,218, 53,156, 62,125,218,186,110,221, 58,181, 78,167,123, 30,128, 63,189,206,150,158, 57,
-115,102,115,183,110,221, 38,180,104,209,226,127, 31,125,244,145,168,118,237,218, 40, 41, 41, 65,104,104, 40,162,162,162,112,254,
-252,121,172, 95,191,222,150,159,159,255, 21,128, 73,112, 83,135,234,235,131,223,108, 54, 99,192,128, 1,224,121, 30,115,231,206,
-133, 63, 19, 42, 59,193,108, 54,155, 9, 0,198,222,158, 75,103, 31, 93, 26,151, 46, 93, 2,128,235, 73, 73, 73, 65, 0,176,109,
-219, 54, 6,101,227,107,249,243,133, 79, 8, 33, 14,103,171,110,221,186,215, 92, 11, 71,193,201, 18, 92, 48, 95,225,102, 24,198,
- 64, 8,201,213,233,116,221,222,121,231,157, 9, 95,126,249,229,115, 95,126,249,229, 45,199,169, 84,170,229,179,103,207,158,244,
-236,179,207,230, 50, 12,227,177, 29,153, 86,171, 29,255,226,139, 47, 62,123,242,228,201,160,128,128, 0,104,181, 90, 20, 20, 20,
-192,108, 54, 35, 57, 57, 25,185,185,185, 88,186,116,105,169, 94,175,255,152, 62,142,255, 14,156,133,129, 39, 87,203, 15,145,229,
-209,213,249,237,183,223,220,142, 81, 85, 81, 78, 87,177,225,239,216, 86,222, 62,138,132, 97,105,220, 13, 25, 81,193,114,237, 22,
- 94,142,227,240,233,167,159, 58, 6,109,117,231,100, 85,196,209, 18, 56,195,194,194,202,108,114,133, 2, 60,207,163,103,207,158,
-119,194,203, 3, 24,225, 52,226,251,180,209,163, 71, 79,172, 91,183,110,109, 0, 50,231,123, 80, 65, 23,159,130,130,194,151,208,
-178,217,108,233,117,234,212, 41, 87,192,249,154,204,212, 98,177,164,251,121,221,205, 90,173, 54,121,246,236,217,111, 42,149,202,
-206, 58,157,174,161,189,224, 56,169,213,106,183, 25,141,198,121,168,216, 36,208,121, 0,134, 31, 56,112, 96,110,183,110,221,166,
-118,236,216,241,153, 81,163, 70, 49,132, 16, 44, 92,184,144, 92,185,114,101,181,221,197,186,114, 59, 55, 41, 44, 44,236,204,247,
-223,127, 31,189,118,237, 90, 88, 44, 22,204,155, 55, 15, 65, 65, 65,103, 10, 11, 11,253,165,200,221,190,125,251, 15,173, 90,181,
-122, 97,255,254,253, 75, 1,156,216,185,115,231,146,214,173, 91,191,184,127,255,254,159, 0,156,254,235,175,191,150,180,104,209,
-226,197,195,135, 15,175, 2,112,188, 2,133,175,195,217,178, 90,221,215, 52,122,112,178,188,113,170, 9, 33,230, 33, 67,134,140,
-122,246,217,103,191, 57,124,248,240,163,197,197,197, 13, 1, 32, 36, 36,228,100,243,230,205, 15,173, 92,185,242,188,221,201,242,
-213, 88, 63, 79,171,213,246,109,216,176,225, 47, 83,166, 76, 81,166,164,164,112, 53,107,214, 68, 90, 90, 26, 78,157, 58,101,253,
-238,187,239, 52,122,189,190, 55,128, 34,250, 56,254,123, 66,139, 16,130,144,144,144,114, 31, 81, 66,151,255,138, 86, 23, 58,191,
-152,133,169,122, 92,121, 61,113,122, 27, 54, 65, 64, 96, 96,160, 99,112, 83,127,154, 44,240,188,247,241,216, 8, 33, 14, 78, 97,
-241, 67,100,249,236, 33,104,159, 2,199,111, 78,127,134,119, 80, 42,149,176, 88, 44, 14, 94, 63,122,126, 86, 84, 45,254, 6,224,
- 55,139,197,114, 9, 64, 13, 42,174, 40, 40,238,162,208, 42, 42, 42,106,118,151,175,173, 54, 26,141,147,140, 70,227, 36, 97,131,
-193, 96,184, 83,206, 43, 0,158,221,190,125,251,172,237,219,183, 11,245, 8,147,225,123,190, 68,175, 56,119,238, 92,170, 88, 44,
-254,122,249,242,229, 45, 8, 33, 8, 14, 14, 62,144,150,150,246, 90, 69, 56,108, 54,219,144,253,251,247, 15,131,189, 45,147,217,
-108, 30,178,119,239,222, 55, 81, 54, 31, 19,108, 54,219,144,131, 7, 15, 58,214, 43,248,162, 36,132, 16, 35, 33,164,138,135, 67,
-140, 21,116,224, 4,103,203,180,114,229, 74, 13,128,191,241,207, 56, 89, 22,251, 98,112,169, 46,244,134,191,180, 90,109,205, 15,
- 63,252,112,154, 72, 36,234,164,213,106,227,148, 74,229, 77,171,213,250,167, 78,167,251, 0,101,115, 84, 81,252, 75, 48,153, 76,
- 25,117,234,212,225,220,125, 64,121,123,145,123,251,176,178,217,108,233,181,106,213,242,249,113,230,134, 51,195,139,104,184,158,
-156,156,204,250,203, 37,192,108, 54,231,122, 11,103,114,114, 50, 42,202,233, 43,238, 73, 73, 73,110,227,238, 67, 16,122,140,187,
-213,106,189, 45, 78,111,247,211, 27,244,122,125, 81,100,100,164,198, 96, 48,136,141, 70,163,216,106,181,150,179, 31,229,114,121,
-158, 94,175,167, 15, 15, 5,197,157, 8,173,251, 28, 71, 80, 54,189, 68,101,193,120,242,228,201, 23, 28,246, 84,110,238,237,242,
-184, 42, 73,141,143,245,138, 8,163, 74,119,132,236, 66, 74, 87, 73,116,249, 26,141,230, 85, 97, 69,104, 3, 66,241,239,163,160,
-160,224,177,202,230, 44, 44, 44,172,244, 15,181,252,252,252,150,119, 33,238,205, 30, 86, 78,111,200,204,204,124,204,135, 16,163,
- 15, 14, 5,133,159, 96,233, 45,160,160,160,160,160,160,160,160,184, 59, 96, 80,214,115,192, 29, 42,210,155,160,243,109, 92,123,
- 27,229,164,156,148,147,114, 82, 78,202, 73, 57, 31, 58, 78, 95,220, 15, 76,111,198,123,209,206,177, 51,229,164,156,148,147,114,
- 82, 78,202, 73, 57, 41,231,195, 8, 66, 8,173, 58,164,160,160,160,160,160,160,160,184, 91,160, 66,139,130,130,130,130,130,130,
-130,130, 10, 45, 10, 10,138,251, 20,181,171, 86,173,122,182,118,237,218, 25, 0, 6,223,229,107, 13,108,209,162, 69,129, 76, 38,
-219, 2,160, 54,189,245, 20, 20, 20, 84,104, 81, 80, 80, 60,208, 34,171, 97,195,134,123,206,157, 59, 87,119,219,182,109, 85,226,
-226,226, 62,185,155, 23,107,214,172,217,204,221,187,119,135,253,241,199, 31, 93, 98, 98, 98,118,221,166,216,170, 93,173, 90,181,
-179,181,107,215, 78, 7, 48,176,146,131, 56,184,101,203,150,133, 82,169,116, 51, 21,130, 20, 15, 1, 26, 0,104, 72,133, 22, 5,
- 5, 5,197, 93, 20, 89,251,246,237, 11, 55, 24, 12, 56,119,238, 28,242,242,242,142,223,205, 11, 94,184,112,161,104,223,190,125,
-136,143,143,199, 79, 63,253, 20,153,148,148,180,187,130,130,166,118,195,134, 13,247,156, 61,123,182,238,182,109,219,226,162,162,
-162, 62,171,204,240, 61,250,232,163, 83,119,239,222, 29,186,101,203,150,174,145,145,145,183, 43, 4, 41, 40,254,203,144, 1,120,
-129, 97,152, 67, 13, 26, 52, 56,153,146,146,114,130, 97,152,253, 0,250,225,193, 29,187,211, 63,108,216,176, 97,231,134, 13, 27,
-118,210, 60, 66, 65, 65, 81, 9, 72, 73, 73, 73,209,106,181, 90,146,151,151, 71, 62,255,252,115, 18, 22, 22,102, 6,240, 39,128,
-117,110,150,247, 1,168,252,228, 86,217,143,119,199,243,103, 88, 88,152,249,243,207, 63, 39, 87,175, 94, 37,103,206,156, 33,181,
-107,215,214,251, 41,104,106, 55,108,216, 48, 95, 8,243,166, 77,155, 8,199,113,155, 43,243,166,168, 84,170,211,187,118,237, 34,
- 87,174, 92, 33, 91,182,108, 33,209,209,209,185, 84,108, 81, 60, 32, 72, 4, 48, 51, 48, 48,176,176, 87,175, 94,228,219,111,191,
- 37,235,215,175, 39,191,252,242, 11,153, 51,103, 14,233,208,161, 3,145, 74,165, 25, 0,198, 0, 8,121, 88,180, 8, 33,164,108,
- 86,251, 13, 27, 54, 16, 0,237, 1, 32, 53, 53,149,138, 45, 10, 10,138, 59,197, 62,157, 78,215, 82,167,211,161,180,180, 20, 85,
-171, 86,133, 88, 44,118,123, 96,110,110, 46,246,238,221,139, 17, 35, 70,156,201,206,206,110, 11,239,243, 94,134, 54,105,210,100,
-223, 95,127,253, 85, 59, 40, 40,200,177,145,231,121,152,205,102, 88, 44, 22,152,205,102, 24,141, 70, 24,141, 70, 72,165, 82,200,
-229,114,132,133,133,157,130,247, 42, 12,135,251,166,215,235,113,236,216, 49, 12, 26, 52, 40,175,160,160,160, 45,128, 11,149,120,
- 95,106, 71, 69, 69,237, 90,186,116,105,100,114,114, 50,110,220,184,129,151, 95,126, 57,255,250,245,235,109, 42,249, 58, 20, 20,
-247, 18, 99,159,122,234,169,169,209,209,209,108,131, 6, 13, 16, 27, 27, 11,163,209, 8,189, 94, 15, 66, 8, 56,142, 3, 33, 4,
- 37, 37, 37,216,181,107, 23,254,250,235, 47, 99, 81, 81,209,247, 0,230, 1,184,232, 36,178, 30, 56, 45, 82, 78,104,165,166,166,
- 50, 52,175, 80, 80, 80, 84, 18, 78,150,148,148, 52, 48, 26,141,208,106,181,126,157,112,245,234, 85, 12, 30, 60,248, 76,118,118,
-246,227,112, 63,169,188,170, 73,147, 38, 7,119,237,218, 85,219, 96, 48, 64,173,246, 61,239,188, 84, 42, 69, 64, 64, 0,194,195,
-195,247, 3,104,229,233, 75,188, 65,131, 6, 71,246,239,223, 31,166,215,235,113,252,248,113, 12, 28, 56,208, 92, 88, 88,184, 7,
-128,167,192, 23,162,108, 30,213,235,110,246, 37, 0,120,211,254,133,239, 14,202,200,200,200,214,203,150, 45,147, 84,175, 94, 29,
- 58,157, 14,253,250,245, 43,188,112,225, 66,115, 0,215,104,214,161,184, 15,113,225,220,185,115,181,108, 54, 27,242,243,243, 97,
- 52, 26,161,211,233, 28, 66, 75, 36, 18,129, 16, 2,171,213,234,248, 48, 58,122,244, 40,182,109,219, 70,174, 94,189,250,145,253,
- 89,122, 32,181, 8, 21, 90, 20, 20, 20,119, 11,181,107,213,170,117,252,247,223,127, 15,144, 72, 36, 88,191,126, 61, 62,250,232,
- 35, 75, 97, 97,225,110, 87,241, 18, 29, 29,157,178,100,201,146,164,228,228,100,156, 56,113, 2, 79, 63,253,244, 7, 0,166,185,
-225,124, 95,173, 86, 79, 53,155,205, 56,126,252, 56, 94,124,241,197,107, 57, 57, 57,167, 93, 69, 76, 82, 82, 82,155,207, 62,251,
- 76,220,180,105, 83,168,213,106, 60,243,204, 51,186,243,231,207,183, 0,112,218, 67, 88, 63, 43, 44, 44,124,199,102,179,161,180,
-180, 20,241,241,241,144, 72, 36, 94, 35,167,215,235,145,152,152,184, 63, 47, 47,239, 22,241, 22, 30, 30,190,253,198,141, 27, 29,
-228,114,185, 87, 14,179,217,140,244,244,116, 72,165, 82, 24,141, 70,212,168, 81,227,123, 0, 67,104,214,161,184, 31,133,214,223,
-127,255, 93,235,231,159,127, 70,147, 38, 77, 80,175, 94, 61,104, 52, 26,135,232, 50,153, 76,176, 88, 44,183,156,164, 86,171,241,
-246,219,111, 95,132,189,250,252, 65, 21, 90, 66,195,180,137, 66,157,104,106,106,106, 59,154,103, 40, 40, 40,238,180,224,189,120,
-241, 98,227,206,157, 59,239, 94,189,122,117, 68,143, 30, 61, 80,163, 70, 13,241,147, 79, 62, 25,169,211,233, 58, 57, 31,152,147,
-147, 19,250,226,139, 47, 30,185,121,243,102,146,125, 83,115, 15,156,205,131,130,130,112,245,234, 85, 65,100, 53,131, 75, 53,163,
- 84, 42,221,252,247,223,127,139,165, 82, 41, 14, 31, 62,140,193,131, 7,231, 95,187,118,205, 87,181, 92,136,201,100,130, 72, 36,
- 2, 0,164,167,167,251,140,220,141, 27, 55,192,243,188,209,221, 62,150,101,101, 71,143, 30, 69,149, 42, 85,188,114,176, 44,235,
- 42,232,138,105,182,161,184, 79, 97, 49,153, 76,104,214,172, 25,174, 93,187,134,163, 71,143, 58, 4, 87,126,126, 62, 50, 51, 51,
-203, 29,124,232,208, 33, 28, 59,118, 12,109,219,182,117,229,121, 32,181,136, 67, 57,110,216,176,161,157, 61,114, 59,105,158,161,
-160,160,168, 36,212,174, 82,165,202,174,165, 75,151, 70,198,198,198,162, 67,135, 14, 55,179,179,179,171,185, 57,110, 29, 33,164,
-247,213,171, 87, 81,189,122,245,245, 0,250,220,206, 49, 9, 9, 9,121,135, 15, 31,142, 56,115,230, 12, 6, 14, 28,152,103,111,
-243,229,171,237, 83, 82,221,186,117, 15,111,217,178, 37,140,101, 89,156, 62,125,218,159,170,195, 52,148,181, 47,185,238,102, 95,
- 2,128, 15, 1,132,121, 56, 87, 89,171, 86,173,214, 71,142, 28,145, 48, 12,131,180,180, 52,161,234,176,153,157,151,130,226,126,
- 67,223, 42, 85,170,124, 55,108,216,176,224, 22, 45, 90, 32, 61, 61, 29, 25, 25, 25, 40, 42, 42, 66,227,198,141,145,146,146,130,
- 43, 87,174, 96,243,230,205, 56,118,236, 24,100, 50, 25,226,227,227, 17,184,252,103,124,205,224, 12,128,148, 7, 85,139,220,139,
-185, 14, 41, 40, 40, 40,106, 75, 36,146,205,113,113,113,185,112, 63, 46, 85,232, 51,207, 60,147,105,179,217,200,149, 43, 87, 8,
-202,122, 15,194,131,208, 34, 87,174, 92, 33,209,209,209, 87, 1,132,186, 57,102,112, 76, 76,204, 77,133, 66,113, 10, 21, 28,214,
-161,102,205,154,121,231,207,159, 39, 55,111,222, 36,127,252,241, 7, 9, 15, 15,191, 27, 61, 2,107,215,169, 83, 39,191,180,180,
-148, 24, 12, 6,178,107,215, 46,146,144,144,144, 7,218,243,144,226,254, 71, 16,128,201,201,201,201,134, 89,179,102,145,205,155,
- 55,147,197,139, 23,147,169, 83,167,146, 81,163, 70,145,150, 45, 91,146,150, 45, 91,146,126,253,250,145,119,222,121,135,116,239,
-222,157, 4, 6, 6,150, 0,120,242, 65,190, 41, 84,104, 81, 80, 80,252, 27, 72, 0, 48,199, 46,168,214, 61,243,204, 51,153, 70,
-163,145,100,100,100,144, 53,107,214, 16,148, 13,221,224, 14,239,103,103,103,147,236,236,108, 97,104,132,171,248,103, 88,135,111,
-237,188,119, 36,130, 18, 19, 19,243,142, 28, 57, 66,210,210,210,200,166, 77,155,136, 93,176, 85, 26,228,114,249, 22,181, 90, 77,
- 12, 6, 3,217,190,125, 59, 29,222,129,226, 65, 68, 20,128, 5,245,235,215,183,204,157, 59,151,172, 91,183,142,124,254,249,231,
-164,111,223,190,100,204,152, 49,164,127,255,254, 36, 50, 50,210, 8, 96, 6,128,224, 7,253,102,220, 11,161, 69,103, 54,167,156,
-148,147,114,186, 98,243,153, 51,103,136, 0,155,205, 70, 50, 50, 50,200,150, 45, 91, 72, 76, 76,204,105,148, 31, 79,203,153, 83,
- 85,175, 94,189,115,231,207,159, 39, 55,110,220, 32,102,179,217,193,113,238,220, 57, 2, 96,103, 37,132,179,118, 92, 92, 92,238,
-142, 29, 59,200,249,243,231, 73, 76, 76,204,205,202,140,123, 98, 98, 98,110, 94, 94, 30,217,190,125, 59,137,140,140,244, 37,178,
-104, 94,162,156,247, 51,103, 34,128,101, 77,155, 54,181,205,159, 63,159,252,239,127,255, 35, 9, 9, 9, 54,251, 71, 81,220,195,
-162, 58,157, 27,195, 83, 80, 80, 80,220, 43,200, 14, 28, 56, 0,153, 76,230,216,112,226,196, 9,231,113,180, 60,141,219,160, 62,
-123,246,236,227, 61,122,244,216, 61,127,254,252,122,206,189,152,118,236,216, 1, 0,198, 74, 8,219,133,140,140,140,182,221,186,
-117,155, 23, 30, 30,254, 72,118,118,246,132,202,140,120, 90, 90,218, 59, 13, 27, 54,156, 86, 90, 90,170,214,233,116,253, 64,199,
-206,162,120,112,145, 6, 96,208,209,163, 71, 63, 57,122,244,232, 7, 0, 8,128, 41, 0,206, 62,108, 55,130, 10, 45, 10, 10,138,
-123,141,193,175,190,250,170,107, 99,241,195, 0,190,240, 34,178, 4, 20, 93,187,118,173, 85,207,158, 61,135,161,124,239, 68,161,
-113,122,101,224,130,201,100,234,234,218, 83,170,146,240, 83,118,118,246, 79, 52, 11, 80, 60, 68, 56, 13,160,255,195,124, 3,168,
-208,162,160,160,184,215,184, 14,224,229, 59, 56, 95, 13,247,227,108, 81, 80, 80, 80,252,231, 64, 39,149,166,160,160,160,160,160,
-160,160,160, 66,139,130,130,130,130,130,130,130,226,254, 2, 3,207, 61, 7,182, 85,128,231,118,122, 52,108,163,156,148,147,114,
- 82, 78,202, 73, 57, 41,231, 67,199,233,139,123, 27, 30, 16,208,225, 29, 40, 39,229,164,156,148,147,114,222, 13, 78,198,190,176,
-246, 69, 88,255, 47,199,157,249, 15,199,253, 97,225,124,224,240,111, 14,239, 32, 36, 4,143,178, 46,159, 20,255, 61, 56, 63, 32,
-132,166, 19, 5, 5, 69, 5,203, 14,145,211,203,214,102, 95,240, 31, 44, 75,156, 69, 1,127,135,239,165,187, 17,247,135,153,243,
-129,128, 55,161,245,136, 82,169,252, 72, 42,149, 38, 51, 12, 99,211,106,181, 39,141, 70,227, 34, 0,251,239,240,154,223, 70, 71,
- 71, 15, 46, 40, 40,224, 89,150, 5,203,178, 96, 24, 6, 44,203, 66, 44, 22,235, 75, 74, 74, 84,183, 67, 26,217,160,239,187, 28,
-195,140,180, 17,219,162,220, 83,235,167,250,218, 78,225,253,129,145, 72, 36, 79,133,133,133,133,228,229,229, 17,150, 45,107,202,
- 39, 18,137,132,137,112,173, 37, 37, 37, 63,248, 75, 22, 26, 26,122, 40, 44, 44, 44, 68, 56,159, 97, 24, 20, 20, 20, 20,231,230,
-230, 62, 10, 0, 1, 1, 1,123,149, 74,101, 56,199,113, 16,137, 68, 16,137, 68,208,233,116, 5, 5, 5, 5,143,211,164,184, 63,
-177,106,213, 42, 81,183,184,151,107,112, 68,223,136,101, 73, 48,207, 51, 37, 86, 70,126, 98,115,198,183,151,253, 57,191, 95,191,
-126, 54,122, 23,239, 29,164, 82,233,220,232,232,232, 87, 52, 26,141,142, 97, 24,194, 48, 12, 24,166,236, 59,203,245,215,102,179,
-165, 23, 20, 20, 52,243,241,178, 21, 75,165,210,217, 49, 49, 49, 47,234,116, 58,157,157,207, 45, 47, 0, 88, 44,150,244,252,252,
-252,102,126,149,245,145,145,139,228,114,249,243, 58,157, 78,203, 48, 12,239,226, 30, 56,191,204,175,228,231,231,183,241, 37, 12,
-164, 82,233,188,232,232,232,151,236,113,119,132,243, 78,227, 30, 29, 29,253,162, 86,171,245,139,211, 75,220,111,225,188, 27,225,
-252,143,114, 62,248, 66,171,113,227,198, 63, 31, 60,120,176,150, 88, 44, 6, 0, 24, 12,134,134, 11, 22, 44,120,225,189,247,222,
-155, 1, 96,220,109, 94,111, 73,155, 54,109, 6,236,218,181,139, 93,183,110, 29,219,188,121,115, 48, 12, 3,155,205, 6,155,205,
-134, 6, 13, 26,200,111, 55, 34,193, 74,197,216, 99, 91,191, 14,120,164,243,171, 35,115,129,169,190,182,123, 19,152, 0,198, 3,
- 72,174, 96, 16,242,236,247,229,152, 7,177,177,143,101,217, 10,113,242, 60,127,181,168,168,168,149, 23, 1, 83,233,156,118,145,
-245,116,155, 54,109,130,183,109,219,198,220,188,121,147,145,203,229,224,121, 30, 54,155, 13, 22,139, 5,245,235,215,175,144, 19,
- 26, 18, 18,162, 26, 59,118,108,141, 39,158,120, 2,107,214,172,193, 11, 47,188,128,214,173, 91, 95,204,205,205, 5, 0, 40,149,
-202,240, 51,103,206,212, 10, 11, 11,131, 78,167, 67, 73, 73, 9,186,116,233,130,130,130,130,251,250,225,122,172,113,252, 20,134,
-101, 28, 99, 69, 17,171,173,240,224,137,204,241,119,202, 27, 22, 22,118, 76, 38,147, 69,251, 84,203, 78, 47, 50,131,193,144, 83,
- 88, 88,216,196,199, 41,137, 0,122,137, 68,162,154, 28,199,213, 1,144,104,181, 90,163, 1, 64, 34,145,228,136, 68,162, 52,139,
-197,114,222,100, 50, 93, 2,240, 27,188, 76,128,220, 45,238,229, 26,140, 85,247, 76,169,145,239,161,168, 62,163,182,238,202,216,
- 11, 10,153,110, 83,183,184,151, 87,251, 43,182,254, 69,212, 6,176, 18,101, 19, 74,255, 15,101,227, 0,221, 9,226, 0,244, 70,
-217,156,143, 73,102,179, 57, 31,192, 81,148,181, 67,185, 8, 32, 33, 50, 50,242, 39,158,231,141, 5, 5, 5, 47,195,205, 68,213,
- 45,154, 86, 61,194,178,108,188,224, 9,240,196,150,126,224,104,122,165,188,160, 88,150,157,151,154,154,250,210,234,213,171, 21,
- 71,143, 30, 85,212,171, 87,207,241, 65,196,243,252, 45,109, 76,146,146,146,124,185, 26, 28,203,178,115,159,121,230,153,231,150,
- 45, 91,166,184,126,253,186,162, 74,149, 42, 14, 78,103,177, 37,160, 74,149, 42,254,230,253,111,187,118,237, 58,104,233,210,165,
-226,245,235,215,203, 35, 34, 34, 16, 30, 30, 14,137, 68,114,203,177,143, 63,254, 56,239, 59,234,236,188, 62,125,250, 12, 90,177,
- 98,133,226,224,193,131,138, 6, 13, 26, 64, 36, 18,221,113,220,251,246,237,251,220,207, 63,255,172, 56,121,242,164,162,102,205,
-154, 16, 76, 5, 87, 62,150,101, 81,181,106, 85,191, 56,123,247,238,253,220,202,149, 43, 21,199,142, 29, 83,212,169, 83,199,113,
- 63, 9, 33,183, 29,206,255, 56,231, 67,225,104, 73,205,102, 51,118,238,220, 9,150,101, 17, 22, 22,134,193,131, 7, 99,235,214,
-173, 99,183,111,223,190,225, 54,156,173,111,237, 34, 75, 12, 0,191, 60,223, 23, 87,197,192,136, 92, 19, 36, 18, 9,174, 92,185,
- 2,145, 72, 84, 97,107, 81, 38,147,189, 72, 8,249, 80,151,113, 88,166,215, 91, 96,200, 60,162,144,203,229,142, 23,128, 46,211,
-190, 61,235,136, 66, 46,151, 95, 17,137, 68,147, 53, 26,205, 18, 79,124, 53,107,214,252,241,244,233,211,117,221, 61,184,222,160,
-211,233, 80,173, 90,181,132,194,194,194,154,238,246,139,197,226,248,235,215,175, 71, 73,165, 82, 16, 66, 28, 15,177,235,175,240,
-223,108, 54,163,126,253,250,102,111,215,244,198,105,181, 90, 17, 16, 16, 0,193,141, 50,153, 76,208,104, 52,190, 56, 25,137, 68,
-242,148, 32,178, 0, 96,249,242,229,136,137,137, 65, 84, 84, 20,148, 74, 37,228,114,185,131,211, 95,136, 68, 34,116,235,214, 13,
- 31,127,252, 49,102,204,152,129,209,163, 71,151, 43,104,197, 98, 49,194,194,194,240,199, 31,127, 64,165, 82, 33, 33, 33, 1,130,
-192,191,175,109, 65,150, 9,219,127,228,134,195,161,237,222,177, 46,247, 88, 19,238, 75,251,171, 18, 44, 11,240,124,217,171,147,
- 97, 64,172, 22,190,232,200,201,204, 9,126,220,207, 42,105,105,105, 81,254,222, 35,171,213,138, 42, 85,170,136,124, 28,214, 35,
- 37, 37,229,151,161, 67,135, 74,106,214,172,201, 72, 36, 18,112, 28, 7,142,227, 4,129,158, 64, 8, 73,224,121,190,125, 78, 78,
- 14, 89,176, 96,193, 39, 59,118,236,120, 18,192, 38,183, 5, 11,209, 55, 42, 53,242, 61,118, 31,199,163,207,116,126, 15,127,172,
- 26,251,104,155,198, 60,130, 20,250,203, 0,254,203, 66,171,118, 74, 74,202,241,131, 7, 15, 6,152,205,102,180,104,209,226,192,
-133, 11, 23,154,226,246, 70,112, 15, 5,240,217,184,113,227, 6, 13, 29, 58, 84, 20, 18, 18, 2,169, 84,138,210,210, 82, 92,190,
-124,249,197, 31,126,248,129,124,245,213, 87, 95, 0, 8, 74, 75, 75,107,121,232,208, 33,116,232,208,225, 77, 0,111,223,170, 8,
- 68,241,123, 15, 93,139, 18,214,123,119,107, 40,105,217,140,205, 41,115,113, 92,143, 38,224,109,124,250,161,191, 51,252, 17, 98,
-159,244,237,219,119,224,234,213,171, 3, 1, 96,225,194,133,120,234,169,167, 16, 22, 22, 6,133, 66, 1,137, 68, 2,177, 88, 92,
-238,215,199,203, 86, 4,224,147,254,253,251, 63,179,108,217,178, 32, 0, 88,182,108, 25,250,246,237,139,240,240,112, 4, 5, 5,
- 65, 42,149, 66, 36, 18, 85,248,102,134,133,133,125,219,250,209, 71,135, 44, 93,186, 20, 0,240,193, 91,111,225,137,199, 30, 67,
-160, 66, 14,133, 92, 10,225, 94, 72, 69, 98,116, 31, 49,210,167,190, 4, 48,235,169,167,158,122,118,197,138, 21, 65, 0,112,244,
-232, 81,228,230,230, 34, 58, 58, 26,114,185, 28, 82,169,212, 17,103,134, 97, 32,151,203,253,138,251, 83, 79, 61,245,204,207, 63,
-255, 28, 4, 0, 75,150, 44, 65,183,110,221, 28,113,151,201,100,144, 72, 36,229, 22, 87,209,233,142,243,201, 39,159,124,102,229,
-202,149, 65, 0,240,195, 15, 63,160,115,231,206, 8, 13, 13,117,220, 79,129,171, 34,105,244, 31,231,124, 56,132,214,241,227,199,
-159, 86, 42,149,211, 1, 68, 74,165,210,144,231,158,123,174,234,144, 33, 67,208,191,127,127,108,223,190,253,245, 10, 10, 45, 38,
- 58, 58,122,240,174, 93,187, 28,111,104, 19,185, 69, 48, 85,248, 5,110,199,135, 71, 94,127, 61,102,198,101, 13, 14, 28, 58,143,
- 0,176,204,161, 89,179, 34, 13,151, 46,193,102, 50, 97,210,149,210,178,237, 86,194,236,124,103, 68,204, 35,115,191,248, 16,192,
- 18, 47, 46,128,204,104, 52,226,226,197,139, 21, 10,196,205,155, 55,193,243,188,209,155,187, 32,145, 72,112,234,212, 41,191,122,
- 33, 36, 36, 36,120,123, 0,125,114,110,222,188, 25,163, 70,141,194,249,243,231, 33, 76, 85,226, 7, 39, 19, 22, 22, 22, 34,136,
- 44, 65, 4,201,229,114,136,197, 98,134,227, 56, 70,168,218,179, 63, 92,126, 9, 99,150,101,241,227,143, 63, 98,230,204,153, 24,
- 51,102, 12, 22, 45, 90,132, 70,141, 26,253,147, 9, 57, 14,106,181, 26,161,161,161, 8, 13, 13, 45, 39, 16,239,103,184, 38,243,
-236, 57,243, 21,224, 73, 89, 35, 16,194, 3, 60, 64, 64,192, 19, 30, 57, 25,151,241,209,199,159,250,253,246, 17,139,197,184,116,
-233,146, 35, 31, 8,206,176, 32,140,156, 93,131,196,196, 68,159,121, 73, 34,145, 76,252,245,215, 95,165, 63,254,248, 35, 86,172,
- 88, 1,134, 97, 32,147,201,160, 84, 42, 17, 18, 18,130,240,240,112,199, 18, 31, 31,207,124,247,221,119,146, 70,141, 26, 77, 84,
-171,213,155,220,167, 57, 9, 86, 84,159, 81,251,153,206,239, 1, 0,158,121,143,160,232,226,212, 71,216,226, 9,193,255,101,145,
-213,176, 97,195, 61,251,246,237, 11,208,233,116,224,121, 30,155, 54,109, 82,116,238,220,121,247,181,107,215,218, 84, 84,108, 37,
- 38, 38,174,223,183,111,223,227,145,145,145, 40, 41, 41,129, 90,173,134,197, 98,129, 72, 36, 66, 66, 66, 2, 62,249,228, 19,166,
- 79,159, 62,195, 95,124,241, 69,131, 92, 46, 23,156,141, 68,247,121,169,124,102, 90,240,249,151, 33,132,148,229, 31,194,147,114,
-191,133,185,105,120,235,157,143,252, 10, 99,213,170, 85,255,183,102,205,154, 64,103,103,201, 89, 4, 56,139, 44, 97,241, 33, 12,
-216,106,213,170, 13,249,233,167,159, 28,156, 17, 17, 17,224, 56, 14, 98,177, 24, 28,199,129,101, 89,236,222,189, 27,211, 39,142,
- 67,104,100, 21,204,255,124,161,207,112, 70, 70, 70, 46,234,214,173,219,243, 75,150,252, 83,116, 55,172, 94, 29, 61, 31,127, 12,
- 81, 17, 42, 68,132, 6,149,221, 39,158,193,137,243,215,124,190,143, 0,176, 85,171, 86,125,121,213,170, 85,129,206, 31,132, 66,
- 92,133,143,103,193,197, 55,153, 76,104,214,172,153, 95,113,119,230, 20,220, 54, 65,180, 9,247, 83,184,142,240,188,250, 8,231,
- 16, 65, 8,219, 5,103, 57, 14,177, 88,140, 85,127, 44,245,232,102,223, 46,103, 69,211,221,149, 51, 45, 45, 13,211,166, 77,131,
-240,209,230,220, 84, 40, 46, 46, 14,243,231,207,247, 89, 46,185, 60, 3,205, 1, 68, 58,109, 50, 1,144, 58,253,230, 49, 12,115,
-216,205,113,194,118,177,189,198, 42, 18,101,237,198, 74, 1,132,184,225,243,196,147,111,127,231, 69,186, 28, 95,238, 58, 30,133,
-214,134, 13, 27,132,167,184,125,106,106,234, 78,251,255, 98,153, 76,118, 83,161, 80,196, 0, 40,221,180,105, 19, 94,123,237, 53,
-216,173,213,222,193,193,193,167,221,184, 58,199,141, 70,227,123, 0,114,236,155,132, 46,154,108, 97, 97, 33,191,117,235, 86,118,
-217,147, 93, 97, 34, 64,227, 15,167,163, 91,106, 42, 54,199, 73, 33, 2,240,232,185,124, 40, 20, 10, 78,173, 86, 91,156,219,109,
-185,105,187,181,205, 37, 67,137, 2, 56, 14, 45,246,108,196,168, 61, 27,241,168, 82,138,130,213, 43, 81,186,119, 23, 88,150, 65,
- 91,101, 4, 70, 15,220,138, 86, 42, 25,164, 70, 45, 88,150,117,151,179, 29,156, 23, 47, 94,236,167, 82,169,166,187,220, 96,127,
-112, 21,101,243, 56,193, 67, 56, 65, 8, 65,163, 70,141,192, 48,140,195, 45, 16, 22,225,161, 19,150, 99,199,220,214, 64,122,228,
-180, 87,193, 65,169, 84,226,207, 63,255,116, 28,211,169, 83, 39, 24, 12, 6,132,133,133,249,197,153,151,151, 71, 50, 51, 51,153,
-101,203,150, 65, 44, 22, 35, 60, 60, 28, 10,133,130, 89,186,116,233, 56,137, 68, 18,111, 48, 24,120,147,201, 4,169, 84, 58, 95,
- 72, 31,142,227,180,106,181, 58,220, 19,167, 72, 36,194,208,161, 67,241,238,187,239, 98,209,162, 69,120,253,245,215,111,113,188,
- 12, 6, 3, 34, 34, 34, 28, 98,203,205, 3,120, 55,186,251,222, 93, 78,158,224,244,177,205, 56,115,114, 27,120, 27, 15, 27, 79,
- 64,136, 13,188, 21, 56,186,245, 64,173,172,171,153,113, 4,164,172,233, 45, 0, 89,137,198,218, 46, 92, 90, 7,192,186,157, 5,
-166,185,190,194,201,113, 28, 12, 6, 3,126,253,245, 87,156, 59,119, 14,155, 54,109,130, 94,175, 71, 68, 68, 4, 66, 66, 66,240,
-216, 99,143,225,197, 23, 95, 68, 98, 98,162,207,184, 19, 66,150,220,188,121,179,113,235,214,173,153,226,226, 98, 20, 23, 23, 67,
-175,215,195,102,179,193,106,181,130,227, 56, 4, 4, 4, 64, 46,151, 35, 58, 58, 26, 6,131,129, 24,141,198, 37,158, 56,121,158,
- 41,209, 93, 25,123,225,143, 85, 99, 31,125,230, 61,130,213, 51, 25,212,168, 38,211,253,121, 36,104,200,186, 61,163,187, 0, 32,
- 60,113, 88, 11,196, 98,227,243,223, 29,247,217,240,123,158, 70,183,138,172,112,189, 94,143,210,210,210, 50, 91, 95, 42,197,234,
-213,171, 35,122,245,234,181, 43, 51, 51,179,173, 23,177,117, 11,103, 80, 80, 80,130, 72, 36,194,169, 83,167,240,213, 87, 95,225,
-207, 63,255, 68, 78, 78, 78, 81,149, 42, 85,130,219,183,111,207,190,245,214, 91,104,220,184, 49,190,255,254,251, 0, 95,156,132,
- 16,164, 93,220,141,180, 75,123,192,243,101,174,117,217,226,254, 63,241, 51,238, 90,173,214,112,252,248,241,192,111,190,249, 6,
- 81, 81, 81, 72, 74, 74,130, 66,161, 64, 64, 64, 64,185,151,172,243,139,215,215,179,169,215,235, 13,105,105,105,129, 63,255,252,
- 51,194,195,195,145,152,152, 8,133, 66, 1,169, 84, 10,142,227,192, 48, 12,150, 45, 91,134,229, 31, 15, 68,218,249,147,232,219,
-179,139,207,112, 42, 20,138,231,151, 44, 89, 82,206, 2,137, 14, 13, 5, 39,102, 33, 18, 51, 8,237,244, 36, 0,160,104,251, 90,
-111,163, 67, 58,115, 50,165,165,165,134,131, 7, 15, 6, 30, 57,114, 4, 60,207, 35, 49, 49, 17, 58,157, 14, 42,149,202, 17,255,
-173, 91,183,162, 79,159, 62,248,241,199, 31,209,178,101, 75,159,113,215,104, 52,134,147, 39, 79, 6,254,244,211, 79, 8, 11, 11,
- 67,213,170, 85, 29,113, 23, 22,177, 88, 12,145, 72,132,228,228,100,148,148,148, 32, 48, 48,208,103, 26, 29, 61,122, 52,240,167,
-159,126, 66,104,104, 40,226,227,227, 29,142,155, 32,142,102,126,249,113, 57,130, 0, 38,246,142, 57, 43,154,238,174,156,125,251,
-246, 69,141, 26, 53,160, 82,169,160, 84, 42, 29,220,222, 56, 61,104, 17,135,222,102, 24,102,131,211, 51,145,202, 48,204, 6,231,
- 95, 79,199,217,255,182, 29, 55,110, 92,179, 25, 51,102, 76,107,217,178,229,207,251,246,237, 91,238,137,207, 19,207,184,113,227,
- 82,102,204,152, 49,205,249,120, 55,215,241,236,104,165,166,166, 50,246, 72, 50, 0,146,154, 54,109,122,120,251,246,237, 97, 65,
- 65, 65,142,131,111,220,184,129,226,226, 98, 4, 5, 5,169,102,207,158,173,106,223,190, 61,162,163,163, 29, 95, 0, 23, 47, 94,
-172, 95,187,118,109, 53, 0, 87,223,150,103, 89, 22,173, 90,181,194,105,123,109, 71,183,212, 84,196,199,199, 59, 26,121, 4, 4,
- 4, 96,248,240,225,204,168, 81,163, 56,193,205, 32,132, 64,175,215, 35, 54, 54, 86,238,205,213, 1,128, 20,125, 62,214,182,111,
- 11,150, 1,116,199, 14, 65, 34,101,192,138, 24, 52, 33, 5,248,189, 67, 91, 48, 0, 76,127,239,135, 31, 46,204, 49, 0, 93,238,
-142,195, 65,112,249,242,101,191, 28, 45,123,188,152,219,229, 20, 28,141,125,251,246,193,102,179,249,203, 73, 88,150,133, 82,169,
- 68, 76, 76, 12,228,114, 57, 20, 10, 5,243,243,207, 63,143, 79, 74, 74,138, 29, 53,106, 20,171, 86,171,217, 86,173, 90,225,169,
-167,158,226,132, 42,206,148,148, 20,159,113,217,185,115, 39,190,250,234, 43,188,254,250,235,110, 29, 45,134, 97, 16, 25, 25, 9,
-149, 74,133, 7, 5, 60, 0,179,213, 2,157, 70,239,168,210,181,217,108, 56,185,227,239, 90, 87,255,190,152,178,225,231, 31,197,
- 0, 96,216,177,214,249,180,216,167,190, 92, 89,187, 93,168,248,224,206, 34,203, 65,111,121,158,227, 56, 12, 30, 60, 24, 51,102,
-204,192,243,207, 63,143, 77,155, 54, 97,194,132, 9,120,229,149, 87,110,113,181,124,125, 57, 90, 44,150,175, 95,120,225,133,215,
- 87,175, 94, 93,231,189,247,222, 99, 5, 71, 75,161, 80,128, 97, 24, 24, 12, 6, 24,141, 70,232,245,122,156, 63,127,158,127,245,
-213, 87, 47,152, 76,166,175, 61, 86, 87, 50,242, 19, 10,153,110, 83,245,120,182,134,246,218,167, 65,173, 31, 75,212, 51,242,166,
- 37, 79,214,238, 76,122, 12, 78, 12, 5, 33, 32, 60,192, 19,192,104,212, 98,248,240, 55, 69,255, 98, 82, 57, 68,150,193, 96,192,
-241,227,199,209,161, 67, 7,220,188,121, 19,103,207,158, 69,173, 90,181,176,116,233,210,200,231,158,123,110, 87,110,110,110, 91,
-127,157,173,147, 39, 79,142,123,228,145, 71,230,105, 52,154, 66,141, 70, 51, 15,192,114, 0,197,151, 47, 95,174,119,249,242,229,
- 5,155, 55,111,110,243,209, 71, 31,137, 92,218,232,136, 60,217,163, 22,139, 21,122,189,209,171,192, 18,214, 9,225,253,138, 56,
-195, 48,164, 78,157, 58,232,213,171, 23,196, 98, 49, 20, 10, 5, 2, 3, 3,203, 85,155,185, 10, 46,111,229, 7, 0,158, 97, 24,
- 84,169, 82, 5, 61,122,244,128, 68, 34, 41,199, 41,228,195, 30, 61,122, 96,228,164, 15,241,245,200,142,248,234,133, 90,232, 60,
- 37,199,107, 56,117, 58,157,230,175,191,254,146,191,251,250,235,120,164,102, 77, 68,168, 84,168, 22, 29, 9,185, 76, 10,137,115,
-152, 24,191, 76,118, 2,128, 23,137, 68,104,208,160, 1,114,114,114,112,237,218, 53, 92,187,118, 13, 44,203,162,117,235,214, 14,
- 23,230,210,165, 75,152, 52,105, 18,140, 70,163,223,113,175, 89,179, 38, 58,118,236, 8,169, 84, 10,133, 66, 81,174,202, 80,184,
-167,165,165,165,168, 81,163, 6,214,173, 91,135,218,181,107,251,228,172, 91,183, 46,218,181,107, 87,238,126,202,229,114,135, 40,
- 2,128,155, 7, 53,142,107,196,197,197, 85,136,115,203,161, 27,248,102,235, 95, 48,154,120,168,117,150,114, 39,196, 70,168,176,
-231,167,247,252,138,187,192,185,120,241, 98, 20, 23, 23, 59,140, 3,225,163, 92, 48, 81,170, 86,173,138,133, 11,221, 59,153, 46,
- 90,196,221, 59, 47,213,207,247,173,112,156,144,185,100, 51,102,204,152,230,122,190, 47, 62,231,253, 46,231,155, 92,196, 89, 78,
-133,170, 14,101, 50,217,251,127,253,245, 87, 88, 73, 73, 9, 46, 93,186, 4,150,101, 29,117,234, 28,199,193,108, 54,227,202,149,
- 43, 8, 11, 11, 67,110,110, 46,100, 50, 25, 68, 34, 17, 76, 38, 19, 0, 52,241,244, 2, 39,132, 96,100, 94, 89, 19,161, 63,170,
- 72,144, 6,160,103, 94,217,131, 33, 52,136, 95,179,102, 13, 2, 3, 3, 17, 20, 20,228,248,245, 85,141,116,242,218,101,228,136,
- 25,176,251,119,131, 97, 1,150, 1, 24, 17,192,178, 4, 44,195,128,221,191, 11, 12, 3, 40,195, 67, 43, 90, 0,251,106, 24,239,
-181, 1,188, 39,247,201,157,139,229,250,127,199,142, 29,240,151,179, 70,141, 26, 8, 12, 12,116, 44,155, 55,111, 46,231,104,217,
-108, 54,132,135,135,251,195, 73,202,220, 8, 30, 81, 81, 81, 16,139,197,204,210,165, 75,199, 37, 39, 39,199,190,243,206, 59,172,
- 72, 36,194,177, 99,199,112,230,204, 25, 36, 38, 38,250,221,102,171,184,184, 56,107,220,184,113,182,113,227,202,250, 80,164,164,
-164,160,184,184, 56, 87,216,175, 86,171, 11,186,118,237, 90,174,221, 70,126,126,254,253,221, 18,222,126, 31,173,102, 43,116, 6,
- 3, 52,165, 58,135, 59,148,155,153, 19,242,222,168,183,197,179,134,191, 4, 0, 24, 53,247,115,148, 46,250,167, 32, 91, 59,106,
- 64,212,147,159,173, 24, 11,160,143, 55,126,141, 70, 3,131,193,128,234,213,171, 99,223,190,125, 40, 45, 45, 69,247,238,221,193,
- 48,140,163,135,104, 5, 96,202,200,200,120, 60, 53, 53,245,240,156, 57,115,170,215,171, 87,143,209,106,181,208,233,116,112,254,
- 61,121,242, 36, 89,190,124,249, 85,157, 78,215,202,110,157,187,197,230,140,111, 47,119,139,123,121,245,159,199, 68,169, 81, 53,
- 46,168, 50,138,170, 91, 11, 50,100, 90,181,254,188,193, 70,206,128,216, 0, 27,120, 16, 43, 15,155,189,218,235,223,130, 92, 46,
- 95,176,103,207,158,112,131,193,128,163, 71,143, 98,208,160, 65,166,252,252,124, 41, 0, 60,255,252,243,166,101,203,150, 73,107,
-212,168,129,165, 75,151, 70, 62,245,212, 83,171,180, 90,109, 3, 63,169,127,204,202,202,250,209,117, 99,120,120,248,252, 27, 55,
-110,180,119,110,243, 99,181, 90, 29,193,113,251, 96,242,128,197, 98,129, 94,111, 68, 73, 73, 41, 76,102,139,189,204,228, 97,179,
- 89,237,191, 60,172,246,114, 84, 42,225,130,154, 52,136,209, 16, 66,192, 50, 76,241,209, 83,217, 85,189,137,118,119, 85, 92,126,
-186, 89,174,176, 9,189,204,194,195,195, 33, 22,139,241,227,143, 63,226,196,222,205,144,138, 8,108, 86, 11,172, 22, 51,108, 22,
- 19,196, 34, 17,254, 60,118, 13, 93,234, 6,249, 37, 8, 35, 34, 34,208,179,101, 75,164,182,108, 89,214,189,141,227, 16, 40,147,
- 65, 33, 9, 40,115,178, 0, 16, 27,235,239, 32, 2,188, 16,206,232,232,104, 28, 57,114, 4, 35, 71,142,196,204,153, 51, 33,151,
-203, 29,189,159,207,157, 59,135,149, 43, 87,162, 75,151, 46, 21,142,187,224,224,141, 29, 59, 22,153,153,153,152, 59,119, 46,154,
- 54,109, 10,177, 88,140,226,226, 98,180,106,213, 10, 57, 57, 57,126,113, 58, 87,239, 73,165,210,114,238,147, 32, 0, 43,154, 70,
-206,156, 47,245,141,197,250,189,203,193,128,193,129,159,222, 46, 39, 10, 23,174,216, 93, 97,206, 9, 19, 38,148, 11,167, 63,110,
-150,191,112,113,157,124, 30,199, 48,204, 81,193,108, 29, 59,118,236,251, 12,195,108, 24, 59,118,236,251,211,167, 79, 63,237, 15,
-159,187,253, 12,195,108,180,139,176,158, 78,219,142, 86, 72,104, 41, 20,138, 71, 3, 3, 3,113,233,210, 37,116,239,222,221, 84,
- 80, 80,112, 65, 44, 22,215,202,207,207,151,229,230,230, 66,167,211,105, 38, 79,158,124, 13,128,188, 69,139, 22, 53,254,252,243,
- 79,220,188,121, 19,203,150, 45, 3,128,181,238,219,108,176,224,121,222,145, 41, 92, 63,219, 68, 34, 17,246,239,223,143,253,251,
-203, 55,253,250,230,155,111,124,190, 48,158,250,245, 55, 28, 59,118, 12,206,195, 3, 8,255,157,183, 5, 4, 4, 0,222,123,120,
-148,131,175,134,241,190, 26,192,187,131,191,109,191,220,245,204,241,132,140,140, 12,143,231,239,223,191,191,156,163,229,139, 83,
- 36, 18,193,102,179, 65, 46,151, 51, 18,137,132,145, 72, 36,241,130,200, 18,137, 68,142, 7, 70, 38,147, 65, 38,147,149,251, 74,
-245,132,204,204,204, 14,153,153,153, 30,247,231,229,229, 61,158,151,151,135, 7, 17,102,139, 5,122,157, 9,165, 26, 61, 38, 78,
-255,190,108,227, 68, 28, 4,112,240,241,255,141,196,208,110, 93, 58, 86,180,154, 90,184,223, 81, 81, 81,216,185,115, 39, 24,134,
-193,170, 85,171, 16, 28, 28,140,110,221,186, 65,165, 82, 97,236,216,177,232,215,175, 95, 69, 11,179,146,130,130,130,199,223,122,
-235,173,195,159,126,250,105,181,170, 85,171,194,100, 50,193,108, 54,195,100, 50,225,242,229,203, 88,190,124,249, 77,157, 78,247,
- 56,128, 18, 95,100,155, 51,190,189,252,203,174, 81,153,157,251, 63,165, 63,151,243, 7,178,179, 11, 96,181,102,128,183, 89, 97,
-182,218,202, 28, 62,171, 21, 86,171, 13, 18,137, 72,245,233,212,183,183,242, 32, 96, 89,198, 4,224,137,123,149, 70, 33, 33, 33,
- 41,121,121,121,184,120,241, 34, 94,124,241,197,236,130,130,130,179, 0, 58, 1, 64, 65, 65,193,158, 65,131, 6,213, 91,178,100,
- 73, 76, 82, 82, 18, 2, 3, 3, 85, 90,173,214, 23,101, 32,128,161, 0,186,162,172, 29,136,128, 66, 0,147, 89,150,149, 29, 61,
-122,244,150,158,118,187,118,237, 2,128,131,238,191,128,236,142,150,193,128,188,130, 34,188,242,191,241,255,124, 25,129,148, 19,
- 23, 4, 4,111,140, 64, 0, 0,228,231, 92,198, 75,175,140,148,249,250, 32,112,247, 34,172, 64, 27,157,114, 31,106, 66, 30, 13,
- 12, 12, 44,171,126, 91,183, 28, 27, 63,251, 31, 96, 51,131, 88,244,128, 89, 7,152, 53,224, 77, 58, 48, 18, 57, 96,209,251, 37,
-180, 2, 3, 3, 17, 40,151, 35, 42, 36,164,108, 16, 72,145, 8, 98, 49, 7,222, 2, 48, 54,198, 33, 72,121,255, 6, 6,113,124,
- 84,202,229,114,164,165,165, 97,232,208,161, 48,155,205,232,219,183, 47, 76, 38, 19, 12, 6, 3,244,122, 61,146,147,147,161,211,
-233,252,226, 19,122, 43, 6, 6, 6, 66, 34,145,224,237,183,223, 70,179,102,205, 48,105,210, 36,140, 25, 51, 6,201,201,201,120,
-227,141, 55,176,124,249,114,164,164,164,248,226, 37,206,105, 36,220, 79, 65,108, 57, 87,241, 1,168,112, 26,185,114, 50, 12, 91,
- 78,176, 9,203,155, 47,116,170, 48,231,140, 25, 51,144,151,151,119,139,147, 37,252,143,139,139,195,151, 95,126,121,187, 53, 67,
-130,123, 20,237,102, 95, 79, 87, 39,138, 16,210,220,222,118,202, 56,125,250,244,211,211,167, 79, 79,101, 24,102,195,244,233,211,
- 83, 61, 57, 90,238,120,220,236,247,251,165,197,185,212,141,182,119,222, 41,220,232,176,176, 48, 81,181,106,213, 88,149, 74,133,
-226,226, 98, 68, 70, 70,146,188,188,188,254, 10,133,226,227,159,127,254,185,134, 70,163,193,185,115,231, 48,127,254,252,131, 0,
-230,121, 19, 90,155, 34,237,214,177,221,201,114, 94,239,213,171, 23,146,146,146,202,185, 89,114,185,220,107,230, 17,246, 9,142,
-144, 72, 36, 66,237,218,181,229, 87,175, 94,213, 75, 36, 18,196,199,199,203,179,179,179,245, 18,137,164,194, 61, 93,124, 53,140,
-247,213, 0,222,157,240,105,222,188,121, 57, 7,203,249,215,249,255,250,245,235,125, 86, 29, 10,156,245,234,213,115,220,175,160,
-160, 32,225, 92, 0, 64,247,238,221,193,243, 60, 34, 34, 34,252,226, 20, 68,173,189, 1, 60, 12, 6, 3, 95, 90, 90,202, 30, 61,
-122, 20, 82,169, 20, 65, 65, 65,142,182, 58, 1, 1, 1, 14, 55,147,194, 93,129,192,195,100,177, 64,175,215, 67,163,209, 0, 0,
- 46,159, 90, 83, 94,136, 25,213,183,205, 47, 20,176,133,133,133,216,188,121, 51,254,248,227, 15, 52,107,214,204,173,168,174,128,
-224,202, 43, 44, 44,108, 61,122,244,232, 3, 83,166, 76,169, 18, 22, 22, 6,179,217,140, 27, 55,110,224,187,239,190,203,212,233,
-116,173, 43, 82,192,128, 0, 22,139, 21, 6,157, 17, 37,234, 82,124, 60,245, 7,143, 89, 15, 0, 10,115,207,163, 87,239,126,210,
-123,153, 78,153,153,153,239,180,110,221,122,106,105,105,105,177, 78,167,235, 7, 96,150,243,247, 84, 65, 65, 65,155,222,189,123,
-207, 9, 11, 11,107,154,155,155,251,190, 31,148, 99,211,210,210,222, 79, 72, 72, 40,183,209,104, 52, 34, 33, 33,161,118,110,110,
-238,192,182,109,219,126, 8, 32,204,105,119, 16,128, 45, 0,190,244,148,151,132,170, 67,141, 70, 15, 85, 72, 44, 50,174,237,244,
- 25, 16,137,200, 0,194,243, 94,203, 16,225, 3,216,211,226,163,103,220, 45, 65, 21,142, 21, 94,216, 79, 60,253, 2,158, 24, 58,
- 3, 10, 49, 48,237,165,199,145, 28, 2, 64, 30, 6, 73,219,247,192,132,216,239,209,208,223,252, 34, 31,243,213, 87, 56,102, 47,
-143,227, 35, 35, 49,186,127,127, 16, 11,176,239,204, 25,172,248,235, 47,244,239,208, 1,138,128, 0,191, 63, 88,120,158,135, 68,
- 34,193,229,203,151,177,111,223, 62,212,173, 91, 23,151, 46, 93, 42, 55, 12, 5, 33,196,223,248, 59,226, 46,147,201, 32, 22,139,
-145,157,157,141,212,212, 84, 72, 36, 18,252,240,195, 15,216,185,115, 39, 70,143, 30,141, 33, 67,134,160,125,251,246, 56,123,246,
-172, 95,156,132,144, 91,122, 43,186, 86,231, 86, 52,141, 92, 57, 93,223,251,183,147,238, 2,231,148, 41, 83,220,118,168,240,135,
-211,157, 22,113,147,118, 71,157,197,144,224, 60, 57, 11, 35,215,117, 0,161,194,182,177, 99,199,190,239,239,121,206,235,130, 35,
- 86,145, 42, 76,135,208, 74, 77, 77, 45, 23,243,194,194,194, 3, 7, 14, 28,168,175, 84, 42,113,254,252,121,169, 74,165,170, 47,
- 20,232, 44,203, 98,213,170, 85, 65, 61,122,244,216, 58,107,214,172,120,158,231,145,147,147,131,119,223,125, 87, 99,181, 90, 7,
- 0,176,122,122,129,251,114,166,126,251,237,214,135,109,221,186,117,126, 85,129, 8, 66,138,227, 56,132,134,134,234,245,122, 61,
- 20, 10, 5, 66, 67, 67,245, 58,157, 14, 74,165, 82,168, 43,102,241, 79, 79, 5, 95,238,147,175,134,241,174, 13,224,125,226,204,
-153, 51,126, 29,103,175,106,245, 43,151,167,165,165,121, 44, 72,118,238,220, 9,222, 94,208,250,203,105,255,202, 35,130,240, 83,
- 40, 20, 8, 11, 11,131, 76, 38,131, 92, 46, 47, 39,178,100, 50,153,207, 7,199,215,128,164, 1, 1, 1,135,148, 74,101,136,176,
- 95, 44, 22,163,180,180,180,184,176,176,240,209,251,186,234, 16, 4, 86,179, 21,122,189, 1,154, 82,125,165,243,155, 76, 38,200,
-100, 50, 44, 95,190, 28,143, 63,254, 56, 90,180,104,113,139,200,186, 77,123, 62,189,176,176,176,253,188,121,243, 14,206,158, 61,
- 59, 84,163,209,224,251,239,191, 47,209,104, 52,237, 1,164, 87, 72,108,242, 4, 22,179, 25, 58,131, 17, 90, 77,217, 61,184,114,
-122,205,127, 45,169,150,103,103,103, 47,247,178,255,138,213,106, 77, 21,198,125,243, 3,143, 37, 36, 36, 32, 59, 59,187,220,198,
-235,215,175,195,102,179, 25, 81, 54, 78,214,203,206, 70, 50,254, 25, 61,219,211, 87,124,153, 59,170, 55, 66,163, 41,115, 65, 12,
-218,252,202,201,167,118,177,225,169, 77,214,237,228, 33,134, 97, 28,141,190,135, 15, 31,142,147, 39, 78,160, 83, 21, 53,146, 99,
-130, 64,212, 25,144,116,252, 8,127,231,201, 49,107,206,166, 10,115,175,116,106, 2, 49,107,229, 74,183,251,174,244,233, 83,161,
-184, 95,184,112, 1,114,185, 28, 54,155,237,150,247, 77, 69,227,239, 44, 96,230,204,153,131,209,163, 71,227,135, 31,126,192,201,
-147, 39,241,200, 35,143,160,115,231,206,200,205,205,197,137, 19, 39, 96, 52, 26,253, 14,167,115,187,185, 11, 87,207, 96,219,190,
-223,113, 61,253, 26, 50,179,111,222,118,186, 59,115,186, 10,173, 95,182, 29,199,211, 93,154,220, 22,231,199, 31,127,140,220,220,
-220,114, 78,150,115,185,228,201,209,114,213, 34, 46,200,119,105, 11, 37,172,155, 92, 68,143,235,186,235,241, 0,144, 11, 64,228,
-227, 60,215,245,252,233,211,167,239, 16,156, 48, 59,175,200, 87,251,172,114,142,150, 11,102,244,233,211,167,247,252,249,243, 35,
- 3, 2, 2, 28, 61,144,198,142, 29,139,209,163, 71,163,122,245,234,136,136,136,136, 11, 9, 9, 65, 65, 65, 1,102,206,156,137,
-180,180,180,215,224,102,160, 61, 87,161,213,230,106, 41,164,210,127, 62, 88, 5,103, 11, 0,134, 12, 25,114,139,163, 37, 36,144,
- 55, 88, 44, 22,132,135,135, 67,167,211, 65, 36, 18,161,111,223,190,162, 83,167, 78,217,186,117,235,134, 39,159,124, 82,116,226,
-196, 9, 91,207,158, 61, 33, 18,137,208,177, 99, 71,245, 47,191,252, 50, 10,192,103,126,136,173, 74,107, 24, 47,100, 50,127,199,
- 62,242, 71, 92,122,227,100, 24, 6, 58,157, 14, 28,199, 57, 26,202,251,195, 41, 84, 29, 58, 63,128, 44,203, 34, 36, 36,196, 81,
-120, 8,142,150, 32,180,124,241,250, 26,144, 84,161, 80,168,206,159, 63, 95, 67,232,120,145,159,159,143,142, 29, 59, 94, 44, 44,
- 44,188,191, 45, 45, 30, 48, 91,109,208,232, 13,208,232,117,149, 70, 43, 60, 15,139, 22, 45,194,217,179,103, 97, 48, 24,176, 96,
-193, 2, 71,167, 2,103,145,117, 7,130,235,178, 92, 46,231,187,119,239,142, 3, 7, 14, 64, 38,147, 89,112, 27,227, 95,241,132,
-135,217,106,133, 65,175,135,198,119,149,219,131, 2,135,170, 62,123,246, 44, 76, 38, 19, 38, 77,154,100, 59,124,248,240, 14,148,
- 13,128, 42, 56,120, 3,219,181,107, 55, 89,169, 84,134,108,220,184,241, 77, 0, 63,120,123,121, 91,172,118,209, 94,137,247,209,
-185, 70,192, 93,155,172,219, 25,102,197,249,197,202,243, 60, 94,123,245, 85,116,174,162,198,147, 77, 35,161,205,186, 8, 69,112,
- 36,152,144, 68,204,154,179, 9,167,175,250,221, 20,147, 0, 64,247,118,125,208,168,238,173,195,131,181,238, 84,246, 77,182,231,
-207, 67,200,201,207,172,112,220,181, 90,173, 71,231,170, 2,142,150,227,153, 19,238, 95,227,198,141, 81,171, 86, 45,236,216,177,
- 3, 77,154, 52,193,165, 75,151,112,233,210, 37,164,165,165,225,228,201,147, 40, 42, 42,170,112, 26,253,186,101, 5,138, 74, 11,
- 33,149, 72, 81, 88,156,143,235, 25,215, 16, 29, 30,115,199,233, 46,160, 78,207,143, 1, 0, 85, 34,131, 43, 36,180,156, 57, 63,
-249,228,147, 91,196,251,157, 14,217,195, 48,204, 33,111,235, 21, 61,255, 94,194,147,208,186,150,151,151,215,162,127,255,254, 99,
- 1, 52,183,111, 43, 1,176,114,235,214,173,125,162,162,162, 58,180,108,217,146,147, 74,165,216,183,111, 31,126,249,229,151, 31,
- 0,172,240,118, 33,169, 84,170, 79, 76, 76,148, 11, 25, 81,120, 16, 85, 42,149,104,230,204,153,204, 55,223,124,227,209,229,242,
-149, 64, 37, 37, 37,208,106,181, 8, 14, 14,134,217,108, 70,247,238,221,109,103,207,158,133, 68, 34, 65,239,222,189,109,103,206,
-156,113, 36,244,226,197,139,227,245,122,125,171, 63,254,248,163, 43,128,182, 21,184, 87, 66,195,248, 64,248,217, 0,222,211, 87,
-158, 63,240,183, 58,206, 19,231,200,145, 35,111,139, 83, 34,145, 88,133,145,223, 89,150,133,217,108, 70,147, 38, 77,144,155,155,
-235,120,104,148, 74,165, 67,100,249, 35,180,124, 13, 72,202,113, 28, 76, 38, 19,218,182,109, 11,134, 97,240,249,231,159, 63, 24,
-213,145, 60,207, 4, 6,134,163, 74,149,218,136,140, 50,128,231, 43,119, 86,153, 49, 99,198,148, 19, 83,238, 70, 94, 22,238,255,
-237, 64,224,186,147,217,231, 9,224,168,242,210,106, 13,247, 93, 18, 70, 69, 69,181,200,205,205, 93,231,178,185, 16,192,100, 47,
- 31,150,142,132,190,121,243, 38,186,117,235,134,223,127,255, 93,180,118,237,218, 78,235,215,175, 63,115,241,226,197,155, 77,154,
- 52,169,250,250,235,175,203,218,182,109,139,252,252,124, 52,109,218,116, 98, 70, 70,134, 23,161,101,191,143, 6, 35,180,218,202,
-119, 71,221,185, 89,119,242, 98, 20,242,228,132, 9, 31,162,115,108, 49,250, 62, 18,140, 37, 27,246, 98, 96, 99, 57, 96,146, 85,
-152, 79, 8, 75, 88,149, 36, 36,166,180,184,101,191, 76, 85, 54,150,107, 98, 74, 11,176, 55, 47, 85, 56,238,206, 97,118, 21, 85,
-183,227,232, 57,223,207, 87, 94,121, 5,239,189,247, 30,186,118,237,138, 75,151, 46, 97,215,174, 93,184,116,233, 18, 70,142, 28,
-137,148,148, 20, 60,242,200, 35, 21,226, 92,191,109, 53,212,154, 18,176, 12,139,194,146, 2, 24,140,122,140,121, 99,194, 29,167,
-187,227,229,191,109, 58, 0, 96,205,214, 99,183,205,249,193, 7, 31, 32, 59, 59,187,156,147,117, 39,237,178,238,119,120, 27, 45,
-237, 26,128,215, 92, 55,154, 76,166,160, 73,147, 38,117,137,136,136, 0,195, 48,152, 51,103, 14,194,194,194, 30, 7,112,218,100,
- 50,229,107,181,218,209, 78, 34,164, 51,236, 99,109,228,228,228,184,237,183,175,213,106,205, 93,186,116, 17,199,198,198,150,235,
-109,168, 84, 42, 61,185, 59, 14, 78, 97,159,213,106,197,152, 49, 99, 48,109,218, 52, 84,171, 86, 13, 61,123,246, 68,106,106, 42,
- 24,134, 65,247,238,221,209,179,231, 63, 85,185, 33, 33, 33,146,223,127,255,189, 29,203,178,103,156, 94, 32,229, 56,221, 65,104,
- 24,111,177, 88,252,109, 0, 95,142, 83,200,108, 35, 71,142,196,180,105,211,240,254,251,222,155,122,124,245,213, 87,192,173,237,
-169,238, 58,103, 97, 97, 97,185,194, 94,161, 80,124,254,228,147, 79,114, 55,111,222, 44, 39,174,156, 23, 55, 5, 81, 57, 78, 95,
- 3,146,138, 68, 34, 68, 71, 71, 99,202,148, 41, 8, 15, 15, 71, 76, 76,140,187,129,252,124,166,209,109,224,174,114,218, 8,127,
-244,211, 25, 31,182,254,126,217,122,177, 76, 10,236,223,181, 6,234,162,242,213, 73, 70,243, 63, 93,169,165, 77, 58,193,116,236,
- 79,191,242,146, 32,166, 63,254,248, 99,124,252,241,199, 94, 3,180,104,209,162, 59,142,187,159, 98,235, 86, 78,158, 48, 10,101,
- 40, 2,148, 85, 80, 63, 37, 20, 60,177,254,167,210,200, 3, 14, 31, 58,116,168,119,120,120, 56,210,211,211, 35,197, 98,113,239,
-114,118,149, 94,143,196,196,196,218,121,121,121,173,124,113,142, 28, 57,210, 56,126,252,120,217,128, 1, 3,240,228,147, 79, 98,
-192,128, 1, 50,137, 68, 82,147, 16, 2,179,217,140,244,244,116,252,249,231,159,200,203,203, 59,231, 45,156, 60, 33,140, 92, 17,
-130, 0,101, 44,234, 55, 8, 1,207, 91, 43, 37,238,206,174,184,179,155, 85, 65,145,229, 54,127, 2,192,225, 63,215, 97,194,219,
- 13,240,195,198,131,152,127, 8,104, 20,146,139,250,145,121,224,243,206,225,221,129,205, 48,235,167, 35, 0,128, 93, 59,125,166,
- 17,241,150, 7, 13,122,243, 29,197,221,217,185,114,190,142, 31,109,180,110,225, 20, 62, 18, 75, 75, 75, 81, 92, 92,140, 37, 75,
-150,224,165,151, 94, 66,110,110, 46,210,210,210,112,241,226, 69,252,252,243,207, 80, 40, 20,183,149, 70,163, 94,253, 0,227,103,
-189, 3, 2,130, 58, 53,234, 99,236,208,143,209,188, 81,203, 59, 78,119, 87,248,225,102,121,228,156, 59,119,238,237,230,165,135,
- 78,104,185, 69, 68, 68,196,128,118,237,218,193, 96, 48, 32, 50, 50, 18,105,105,105, 96, 89,182, 58, 80, 86,133, 23, 23, 23,183,
- 50, 47, 47,175,186,191,124, 34,145, 8, 86,171,213,209,246, 71, 88, 0,160, 87,175, 94,248,237,183,223,124,126, 81,196,196,196,
-160,106,213,170,120,235,173,183,110,233,229,224,220,211, 65, 46,151, 99,227,198,141,217,133,133,133,133,132,144, 10,117,115, 19,
- 26,198,239,217,179,199,239, 6,240,206, 48,155,205, 55, 47, 94,188, 24,187,104,209, 34,145,151,151,159, 3,187,118,237,178,194,
- 71, 85,205,221,224,116,247,101, 74, 8,241, 40,178,252, 25, 70,192,215,128,164, 28,199,225,194,133, 11,152, 48, 97, 2, 24,134,
-193,154, 53,107, 30,136,135,235,212,249,130,111, 88,150, 13,237,245, 68,235,134, 96, 24,152, 77,183,214, 84, 7, 22,105, 28, 34,
-235,201,207, 86, 96,237,168,254,254,136,158,203,187,119,239, 14, 91,180,104, 17,231, 79,186,239,222,189,219, 74, 8,169,112,181,
-159,240,194, 49,155,205,208,235,111,207, 69, 33,132,236,155, 62,117,124,151,165, 63,110, 18, 51,140, 9,251,119,174, 65, 73,177,
-251,230, 12, 82, 49,135,111,150,252, 98,149,136, 69, 55,255,229,164,251,162,111,223,190, 3, 22, 44, 88, 80,223,221, 78, 63, 58,
-193,164, 25, 12, 6,100,100,100, 64,167,211,173, 30, 55,110,156,121,211,166, 77, 47, 63,245,212, 83,120,228,145, 71, 16, 27, 27,
-139,172,172, 44, 92,190,124, 25, 75,150, 44, 33,123,247,238, 93, 13, 96,152,143,251,184,110,198,212,241, 47, 46,249,105,147,148,
-101,204,216,191,107, 13, 74, 92, 68,251,173,238,180, 24,223,254,240,139, 89, 34, 17,159,247,229, 22, 57,187, 89,149,249, 98,236,
- 61,104, 40,158,156, 55, 31,213,155,119,195,140,153,157,241,237,212,126,152,221, 93, 2,243,170,129,104,244,204, 82, 44,159,212,
- 3, 0, 80,229, 91, 63,221, 18, 78,130, 27,110, 28,171,226,146, 0,187,184,169,152,107, 42,196,221,155,115, 85, 81, 71,139,101,
- 89, 36, 37, 37,161,122,245,234,120,252,241,199,209,164, 73, 19,116,232,208, 1, 39, 78,156,192,137, 19, 39, 48,114,228, 72,111,
- 34,203,103, 26,181,111,213, 5, 7,219,156,191,227,180,113, 77,247,202,128, 63,121,105,232,208,161, 0,240, 80,185, 91, 21, 22,
- 90,106,181,250, 4,207,243, 13,131,131,131, 5, 71,202,177,239,250,245,235,224,121, 94, 87,209,132, 49,153, 76,194,224,152,229,
-198,101, 18, 26,199,123,123,240, 9, 33,182,194,194, 66,180,107,215, 14,109,218,180,113, 84,159, 56, 47, 78,194, 4,107,215,174,
- 5, 33,164,194,141,172,157, 26,198,107, 80,193, 6,240, 0,144,155,155,219,173,109,219,182, 91, 57,142,243,107, 22, 77,158,231,
-211,114,114,114,158,184,215,156,238,210,135,231,121,143, 34,203,159,130,200,215,128,164, 28,199, 65,169, 84,226,215, 95,127, 69,
- 68, 68,196, 3,245,128,157, 56,155,247,137,183,253,237,194,165, 59, 1, 68, 62,249,217,138, 27, 59, 11,204, 9, 79,126,182,226,
-250,218, 81,253,171,121, 59, 39, 59, 59,187,107,255,254,253,127,247, 55,221,173, 86,235,181,236,236,236, 10, 15,151, 64, 8,193,
-249,243,231,249, 87, 94,121, 37, 63, 47, 47,175,223,237,196,127,236,132,249,179,167, 77, 28, 30,222,189, 75,139,230, 96, 1,147,
-231,198,191,132, 1, 8, 39, 22,221, 28,253,254,220, 87,251,245,235,247,111, 38,155, 58, 59, 59,251,241,167,159,126,122, 24,254,
-105, 58, 81, 78, 72,193, 67,239,106, 59,230, 85,173, 90,181,129, 72, 36,146, 1,152, 0,224,250,222,189,123,191,216,187,119,111,
- 87, 0,143,137, 68,162, 88,155,205,150, 97,255,232, 89, 1,224,111,223,249, 40,247,117, 16, 62,190,123,231,199,186,129, 97,136,
-201,100,244,241,129, 4, 2, 66,136, 68, 34, 62,127,248, 68, 86, 35,111, 31, 82, 78, 51,112, 84,122,149,253,176, 97,195, 48,108,
-216, 48, 71,126,250,252,243, 54, 88,125,106, 15,158,105,148, 14,227,215,173,193,168,170,249,253,193, 7, 0, 31,124,248, 74,165,
-133,205, 57,238,206,142,150,187,231,160, 34,109,180, 68, 34, 17,242,243,243,113,225,194, 5,228,228,228, 64,167,211,225,236,217,
-179, 48,155,205, 40, 42, 42, 66,131, 6, 13,110, 59,156,149,149, 70,255, 38,231,195, 88,125, 88, 97,161,101, 54,155, 63, 74, 74,
- 74, 18, 7, 4, 4,212,183,217,108, 32,132,192,102,179, 17,187,168,169,112, 47, 60,177, 88,108,168, 85,171, 22,227,174,119,130,
-240, 95,169, 84,234,189,184, 37,211, 19, 19, 19,199, 49, 12, 35,242,244, 21, 34,252,231,121,222,198,113,220,244,219,188, 87,119,
-218, 48, 94,155,151,151,215,178,146,211,239,110,112,186,166,143,182,110,221,186,142, 25,237, 93,199, 68,177, 79,182,170,245, 33,
-206,189, 14, 72,170,213,106,179,186,117,235,102,115,222,239, 60,160,233, 3, 13,134, 92,239, 49,224,229,132,157, 5,230, 4, 0,
- 16,196, 22, 8,185,238,229, 44,125,118,118,118,187,187, 29,180,171, 87,175,154, 30,123,236,177, 31, 75, 75, 75,135, 2,184,237,
-214,252,239,127,244,249,251,247, 97,202,168, 1, 76,187,205,115,175, 23, 20, 20,116,116,217,246,183, 32,168,132,113,237, 42, 44,
-218,207,229, 87,250,216, 98, 86,171, 53,189,122,245,234, 21,114,110, 44, 22, 75,186,175,253,174, 99,132, 57,227, 52,130,241,254,
- 1,160,172,243,119,129, 95,156, 6,131,161,176,101,203,150,226, 10,198, 45,215,223,184,199,198,198,162, 74,149, 42,142, 95, 1,
-174,219,125,133,211,106,181,166,199,199,199, 35, 34, 34,194,227,136,239,174,109,178,252,225,172,236, 52,242,198, 89,165,202,210,
- 74,231,188,221,112, 82,248,135,206,148,147,114, 82,206,251,150, 83, 68,239, 39,229,164,156,148,243, 30,114, 62,112, 32,132,128,
-182, 82,163,160,160,240, 4, 27,189, 5, 20, 20, 20, 20,119, 6,198,139, 42,173, 72, 79,159,219, 81,182,219, 40, 39,229,164,156,
-148,147,114, 82, 78,202,249,208,113,250,226,174,236,158,198,255, 26,238,100,120,156,187, 41,192, 40, 39,229,164,156,148,147,114,
- 82, 78,202,249,240,113, 62,112,160, 85,135, 20, 20, 20, 20, 20, 20, 20, 20,119, 17, 84,104, 81, 80, 80, 80, 80, 80, 80, 80, 80,
-161, 69, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20,247, 21, 8, 33,101, 83,240,108,216,176,193, 49,208, 67,106,106, 42, 67,111, 13, 5, 5, 5, 5,
- 5, 5,197,189,196,131,170, 69, 56, 42,176, 40, 40, 40, 40, 40, 40, 40,254, 11,120, 16,181, 8,235, 78, 73, 82, 80, 80, 80, 80,
- 80, 80, 80,220,107, 60,136, 90,132,125,144, 85, 36, 5, 5, 5, 5, 5, 5,197,253,131, 7,222,209,162,174, 22, 5, 5, 5, 5,
- 5, 5,197,191,133,251, 88,139, 16,251,226,188, 78, 65, 65, 65, 65, 65, 65, 65, 65,113,135, 2,203,227, 47,157,235,144,130,130,
-130,130,130,130,130,226,246,193,184, 89,191,167,110, 22,157,217,156,114, 82, 78,202, 73, 57, 41, 39,229,164,156, 15, 37, 28,227,
-104, 81, 80, 80, 80, 80, 80, 80, 80, 80,220,153,174,114,250,239,112,186,168,208,162,160,160,160,160,160,160,160,184,115,145,197,
-184, 91,167,109,180, 40, 40, 40, 40, 40, 40, 40, 40,238, 18,168,163, 69, 65, 65, 65, 65, 65, 65, 65,113,103,112,109, 4, 79,171,
- 14, 41, 40, 40, 40, 40, 40, 40, 40, 42, 89,108,185,221,232,169,231,192,182, 10,144,223, 78,239,131,109,148,147,114, 82, 78,202,
- 73, 57, 41, 39,229,124,232, 56,125,113,111,195,253,135,118, 0,118, 0,104,111,255, 5, 0,134,144,187, 63,210, 3,237,250, 74,
- 57, 41, 39,229,164,156,148,147,114, 82,206, 7, 29,174, 3,150,150,173,208, 1, 75, 41,252, 0, 7,239, 85,204,190,246, 83, 80,
- 80, 80, 80, 80, 60,108, 98,139, 56,191, 36,221,161, 38,128,247, 1, 4, 59,109, 59, 4, 96,186,203,113, 63, 1, 80, 56,173,107,
- 1, 76, 2,112,201,103,104, 8,145,216,249,101,246,133, 7, 96, 0, 96, 4, 80,202, 48,140,133,166,217,191,142,150, 0, 82,237,
-255, 55, 0,216, 95,193,253, 15, 20, 98, 99, 99,229,161,161,161, 93,143, 29, 59, 38, 61,123,246, 44,118,239,222, 77,190,249,230,
- 27,115, 81, 81,209,150,172,172, 44, 61,205, 46, 15, 4,186, 1, 24,107,255, 63, 3,192,230, 59,228, 99, 20, 10,197, 72,165, 82,
-217, 67, 38,147, 85,177, 90,173,140, 78,167,203,212,106,181, 91,173, 86,235,103,246,114,175,162,232, 19, 22, 22,246,114,157, 58,
-117,106,166,165,165,101,100,102,102,254, 4, 96, 21,128,126, 85,170, 84, 25,152,152,152, 24,119,254,252,249, 75,133,133,133,223,
- 2, 88,247, 47,134,147,130,226, 97, 2,227,205,141,112,135, 9,132,144,129,229, 24,152, 91, 57, 58,118,236,216,123,203,150, 45,
- 10,158,231, 33, 44,114,185,220, 10, 96,176, 15,145, 21,190,111,223,190,132,161, 67,135, 62,153,153,153,217,172,180,180,244, 81,
- 0, 80, 40, 20, 7,163,162,162, 14,207,155, 55,239,103, 66, 72, 58,195, 48,165, 21,140, 40, 39, 22,139, 95, 10, 13, 13,237, 97,
-181, 90,155, 16, 66, 32, 22,139,143, 21, 21, 21,109,182, 88, 44,223, 2,184, 29,241, 38,229, 56,110,152, 76, 38,235,102,181, 90,
- 27, 2, 0,199,113, 39,141, 70,227,102,171,213,250, 5, 0,211,109,112, 6, 72,165,210, 97, 42,149,170,139,201,100,106, 8, 0,
- 82,169,244,164, 90,173,222,106, 50,153,190,176, 11,206,127, 27, 28,128, 84, 66,136, 24, 0, 68, 34, 81,159, 71, 31,125, 52,129,
- 97, 24,158, 97, 24, 66, 8, 97, 14, 30, 60,216,216,102,179,177,246,252,145, 10,224, 48, 0,235,253,248,132, 68, 68, 68, 76,227,
-121,190,138,215, 68, 11, 8,104,118,236,216,177, 58, 43, 87,174,180,125,253,245,215,197, 67,134, 12, 9, 28, 58,116, 40,247,249,
-231,159,127,145,149,149,245,166,235,241,225,225,225,179, 89,150,141,240,231,250, 60,207,231, 23, 20, 20,188, 67,203,170,127, 29,
- 99,191,220, 86,218,150, 16, 96, 88,151, 32,246, 78,133, 86, 92, 92,220,146, 23, 95,124,113, 64,195,134, 13, 57, 66, 8, 44, 22,
- 11,140, 70, 99,157,253,251,247,183, 95,179,102, 77,179,210,210,210,126, 21,164,124,245,189,247,222,155, 50,121,242,228, 8,177,
- 88,204, 88, 44,150, 26, 43, 87,174,108,242,250,235,175,191,181,104,209,162,170,207, 62,251,108,144,176,125,194,132, 9,205,103,
-204,152,145, 12,224,179,127, 33,156, 20, 20, 15, 27,218,161,124, 27,173,137, 0, 62,246, 38,180,148,246,151,103, 14,202,156, 44,
- 56,253, 58,176,125,251,246,245, 28,199, 9,142,214,163, 90,173, 54, 26,229, 93, 48,119, 34, 43,113,208,160, 65, 45, 87,175, 94,
- 61,237,217,103,159,205, 86, 40, 20,181,158,122,234,169, 82,134, 97, 68, 43, 87,174,108, 92,189,122,117,121,175, 94,189, 6,117,
-236,216,113, 20, 33,100, 55,195, 48,121,126, 70,178,126, 88, 88,216, 47,159,124,242, 73, 66,183,110,221, 36, 17, 17, 17, 32,132,
- 32, 51, 51, 51,110,227,198,141,221, 39, 78,156, 56,170,176,176,176, 47,128, 51, 21,184,113,205,229,114,249,234,137, 19, 39,198,
-118,239,222,157,139,137,137,129,193, 96,192,217,179,103, 59,111,222,188,185,237,162, 69,139,222,212,235,245,207,216, 5,134,191,
-120, 52, 56, 56,120,205,247,239,189, 23,221,226,165,151,184,176,176, 48, 16, 66,144,151,151,215,121,207,210,165,237,223,248,228,
-147, 55, 75, 74, 74,158,118,119,191,255, 77, 72,165, 82,118,217,178,101,143, 72,165, 82, 0,128,201,100, 66, 74, 74, 10,243,192,
-124,138, 48, 76,124,102,102,102,176, 68, 34,113,187,223,102,179,161,109,219,182, 73, 18,137, 4,159,125,246,153, 37, 63, 63,191,
-241,130, 5, 11,142, 45, 95,190, 60,226,139, 47,190,120, 6,192, 45, 66,139,101,217,136,244,244,116,183,156, 54,155, 13,102,179,
- 25, 86,171, 21, 38,147, 9,245,234,213,163,197,212,127, 3, 9, 0,176,233,132, 1, 0,194,238,148, 76,169, 84,214,125,238,185,
-231,184,188,188, 60,136,197, 98,152,205,102,100,103,103, 35, 37, 37, 69,244,227,143, 63,214,174, 40, 95,141, 26, 53,134,204,152,
- 49, 35,114,211,166, 77,230,101,203,150,153,186,116,233, 34, 30, 50,100,136,170,109,219,182,245,226,227,227,217,239,190,251,206,
-184,117,235, 86,203,160, 65,131,164,211,167, 79,143,220,184,113, 99,175, 51,103,206,124,118,175,195, 73, 65,241, 16, 98, 7,254,
- 25,226, 65,248,245, 42,180,224, 36,174,250, 0,128, 88, 44,110, 28, 29, 29,189,196,106,181,198,216, 93,157,236,156,156,156,207,
- 44, 22,203,113,251,177,235,120,158,239,237,203,201, 26, 52,104, 80,203,223,127,255,125,214,254,253,251, 75, 10, 10, 10, 98,214,
-175, 95,111, 24, 53,106, 84, 26, 0, 92,189,122, 53,185, 87,175, 94,113,195,135, 15, 79,239,218,181,235,188, 14, 29, 58,140, 32,
-132,108,101, 24, 70,235, 75,100,165,164,164,236,219,181,107, 87, 80, 72, 72, 72,185, 29,137,137,137, 24, 49, 98,132,164,119,239,
-222,213, 59,117,234,180,247,242,229,203,109, 0,156,242, 71, 16,213,172, 89,115,219,246,237,219, 3, 67, 67, 67, 81, 92, 92,140,
-236,236,108,232,116, 58,168, 84, 42, 60,251,236,179,146,118,173, 31,175, 58,124,228,155,219,210, 51, 50, 58,251, 41,182, 30,125,
-188,126,253,109,203,167, 79, 15,180,220,184, 1,185, 92, 14,141, 70, 3, 0, 8, 10, 10, 66,179,164, 36,238,200,210,165,113, 3,
-199,140,217,118,248,194,133,206,255,146,216,146,217,127,141, 0, 54,136, 68,162, 62, 82,169,148,237,211,167, 15,182,109,219,198,
- 24, 12, 6,206,238,238, 88,251,244,233, 3,185, 92, 14,147,201,196,163,172,234,208,122, 63, 63, 37, 82,169, 20,151, 47, 95, 46,
-183,173,180,180, 20,121,121,121, 40, 40, 40,128,209,104, 68,113,113, 49,120,158,103,228,114,121, 30,207,243, 96,217, 50, 67,207,
- 19,167, 68, 34,193,133, 11, 23,202,109,179, 90,173,208,106,181, 48, 26,141, 48,155,205, 40, 45, 45,149, 7, 5, 5,213,140,136,
-136, 72, 7,176,174,176,176,240,179,156,156,156,235,180,220,250, 87,112, 99,195,113, 67, 53,148, 57,213,215, 42,129,143, 7,128,
-221,187,119, 35, 39, 39, 7,249,249,249,200,203,203, 67,124,124, 60, 8, 33, 21,174,142,187,124,249,242,151, 13, 26, 52, 96, 78,
-159, 62,189, 25,192,231, 43, 87,174, 28, 92, 88, 88, 56,118,244,232,209, 97,159,126,250,105,225,152, 49, 99,102, 0,248, 97,229,
-202,149,255,171, 91,183,110,143,115,231,206, 45,250, 55,194, 73, 65, 81,217, 32,132, 52, 7, 16,105, 95,205,183,151,187,225, 78,
-235, 39, 24,134, 49, 57, 29,103, 2, 32,117,243, 43, 64, 88,207, 99, 24,230,176,211,121,121, 12,195, 28,190,221, 96,186,252,150,
-125,116, 3,192,134, 13, 27,136,176,184, 59, 51, 42, 42,106,100,199,142, 29,103, 29, 61,122,180, 94, 86, 86, 86,104, 86, 86, 86,
-232,209,163, 71,235,117,236,216,113, 86, 84, 84,212, 72,167, 27,225,122,234, 54,167,125,146,125,251,246, 37,252,242,203, 47, 51,
-182,109,219, 86,210,184,113, 99,211,246,237,219,173, 93,187,118,205,181,191,160,173, 93,187,118,205,253,235,175,191,108, 45, 90,
-180,144,255,254,251,239, 55,247,238,221, 59,123,245,234,213,209,132, 16,145, 59, 78, 59,196, 33, 33, 33,191,238,220,185,243, 22,
-145,229,140,170, 85,171, 98,195,134, 13,170,144,144,144,117, 0, 36,158,194,105, 71, 64, 64, 64,192,154,191,254,250, 43, 48, 40,
- 40, 8,185,185,185, 16,139,197,136,138,138, 66, 73, 73, 9,178,179,178,112,253,226, 69,176, 38, 19,230, 76,157, 28, 36,151,203,
- 87,187, 36,160, 91,206,224,224,224, 53,203,167, 77, 11, 44,216,182, 13,127, 79,153, 2,179,217,236,168,114, 53,155,205,216, 59,
-116, 40,242,254,252, 19,223, 77,152, 16, 24, 28, 28,188, 6, 64,128, 15,206,202,128, 51,231, 80, 0,133,246,101, 40,128,253, 41,
- 41, 41, 71,207,158, 61,139, 54,109,218, 96,213,170, 85,141, 70,143, 30, 61,116,244,232,209, 67, 87,173, 90,213,168, 77,155, 54,
- 56,123,246, 44, 82, 82, 82,142,162,124,251,172,187, 29,206,187,198,105,179,217,202, 45, 60,255,207, 59,166, 74,149, 42,185,191,
-252,242, 11,158,125,246, 89, 86, 42,149,102,245,239,223, 95,182,103,207, 30, 98, 23,153,126,135,211, 96, 48, 64,175,215, 67,171,
-213,226,234,213,171,242, 79, 62,249,164,245,199, 31,127, 92, 99,219,182,109,113,239,191,255,254, 27,145,145,145,199,162,163,163,
- 19, 30,132,251,121, 31,114,102, 3, 48,163,172,189,233,245, 59,225,236,216,177, 99,131, 26, 53,106, 68,175, 60, 29,138, 34, 73,
- 29,240,146, 16,240,146, 16,216,194,155,227,178,244, 9, 84,171, 86, 45, 58, 48, 48,176,101, 5,195,185,236,244,233,211,143,217,
-191,148, 11, 0,204, 26, 51,102,204, 68,134, 97,118,143, 25, 51,102, 50,128, 89,246,237, 83,206,157, 59,215, 2,192,242,127, 41,
-156, 52, 47, 81,206, 10,195,135, 22,137,100, 24,102, 3,195, 48, 27,198,141, 27,215, 1, 64,184,203,122, 43,231,227, 0, 72,221,
-253, 10,139,211,246, 72, 66, 72, 79,167,243, 34,111, 51,248,140,155,229, 31,161, 5, 0,169,169,169, 76,106,106,170,176,227, 16,
-195, 48,235, 1, 28, 18,139,197,141, 31,121,228,145, 62,127,252,241, 71, 80,100,228, 63,215,143,140,140,196,234,213,171,131,234,
-215,175,223, 71, 44, 22, 55, 6,112, 72,165, 82,173,247,226,194,132, 12, 29, 58,244,201, 23, 94,120, 65,221,184,113, 99, 0, 40,
- 62,115,230,140,162, 69,139, 22, 90,171,213,202, 88,173, 86,166, 69,139, 22,218, 51,103,206, 40, 44, 22, 75,105,243,230,205,149,
-157, 58,117, 74,123,231,157,119, 6,185, 17, 28,206,120,110,230,204,153,241,161,161,161,222,148, 48, 74, 75, 75, 17, 29, 29,141,
-161, 67,135,198,136,197,226,151,189,221, 45,142,227,134,205,156, 57, 51, 42, 36, 36, 4, 69, 69, 69,136,143,143,135,201,100,194,
-133, 11, 23, 96,208,106, 96, 41, 85,195,162, 46, 70,222,149, 75, 8, 17,115, 24,212, 59, 53,154,227,184, 97, 62,220,146, 97,223,
-142, 25, 19,109, 74, 75,195,213, 85,171, 96,179,222,106,254, 88,205,102,156, 92,188, 24,134,244,116,204,120,229,149,104,169, 84,
- 58,236, 30, 59, 89,159, 18, 66,228,132, 16, 57,195, 48,243, 90,182,108,249,163, 92, 46, 31, 58,125,250,244,110, 91,182,108,233,
-190,107,215,174,246, 86,171, 85,108,181, 90,197,187,119,239,110, 99, 48, 24, 56,153, 76, 6,142,227, 8, 30, 80,136,197, 98, 72,
- 36, 18,200,229,114,180,110,221,250,202, 55,223,124, 99,137,143,143, 23,175, 89,179, 38,180, 74,149, 42,202,207, 63,255,188,184,
-180,180,116,166,191,124,102,179, 25, 70,163, 17,122,189, 30, 6,131, 1,219,183,111, 79, 26, 62,124, 56,103, 48, 24,108,189,122,
-245, 42,180, 88, 44,198, 49, 99,198,168,194,194,194, 70,209,111,216,127, 5, 86, 0, 26,187,208, 50,186, 60, 31, 13,157, 28, 95,
-159, 40, 46, 46, 94,244,237,183,223,198,179,178, 16,236, 49,245,192,207,252, 68,108, 9,254, 28,185, 9,239, 34, 42,190, 6, 6,
- 12, 24, 16, 69, 8,249,188, 18,194,188, 0, 64, 91, 0,243,110,231,228,123, 16,206, 4,165, 82,185, 42, 40, 40,104,143, 82,169,
- 92, 5,123,245,236,157,160, 75, 13,116,238, 93,151, 77,239, 82, 29,164,119, 93, 54,189, 75, 13, 58,212,192,131, 2, 23, 45,226,
-140, 60, 66, 72, 42, 33, 36,117,198,140, 25,211,156,222,239,194,186,220, 79,103, 44,149, 16,146, 90, 78, 33,149, 9,172, 59, 54,
-221,220, 44,101,154,194, 89, 73, 58, 69,206,209,187, 48, 58, 58,122,201,146, 37, 75,130, 92, 25,179,178,178,160, 86,171, 49,126,
-252,248,160, 23, 94,120,225,205,244,244,244, 23,125, 4, 66,154,157,157,221,100,224,192,129, 1,102,179,185,136,231,121, 86,173,
- 86,115,193,193,193, 54,225,128,224,224, 96, 91, 73, 73,137, 88,171,213,138,108, 54,155,241,133, 23, 94,144,190,242,202, 43,205,
- 0,136, 60,145, 70, 70, 70,118,233,209,163,135,212,211,126,139,197, 2,173, 86, 11,173, 86, 11,179,217,140,214,173, 91,203,190,
-249,230,155,174,185,185,185, 11, 61, 42, 14,153,172, 75,151, 46, 93,196,133,133,133, 8, 14, 14,198,245,235,215,113,237,218, 53,
- 24, 53, 26,152, 53,106,152, 53,165,176,150,170, 65,212, 37, 40,184,116, 30, 45,234,214,145,252, 36,147,117,211,106,181,179, 61,
-113,170, 84,170, 46, 45, 6, 15,230,148, 74, 37,218, 15, 44,235,103,240,123,221,186, 32, 54, 27,120,155, 13, 54,171, 21,221, 46,
- 92,128,197, 98, 1,203,178,104, 94, 88,200,169,150, 46,237,146,151,151, 55,235,223,200,236, 50,153,140, 91,182,108,217,115, 82,
-169, 20,132, 16,198,100, 50, 97,203,150, 45, 15,221, 67, 47,149, 74, 17, 16, 16, 0,179,217,140,196,196, 68,253,192,129, 3,247,
- 77,157, 58,181, 26,203,178, 74,137, 68,242, 71, 65, 65,193,180,172,172,172,171,254,242, 89, 44, 22,152, 76, 38,152, 76, 38,232,
-245,122, 92,185,114, 37, 38, 41, 41,137, 25, 58,116,168, 77,167,211, 37,207,159, 63,255,242,150, 45, 91, 20, 51,103,206,124, 10,
-192, 8, 90,236,222,219,228, 6, 16, 92, 45,156,211,138, 69,208, 0, 8,178,139,130,167, 24,134,105, 81,175, 94,189,208,179,103,
-207, 22, 17, 66, 14, 0,248, 25, 64,150, 55, 50,158,231, 25,158,231,241,250,163,197, 24,218, 82, 4,139,165, 4, 37, 37, 37,184,
-126,253, 58,206,156, 57,131,131, 7,207,220,238,179,249,114, 96, 96, 96,215,128,128,128, 68,171,213,202,106, 52,154,235, 58,157,
-110, 27,207,243,139,224, 82,101,225, 15,238, 86, 56, 5, 40,149,202, 79,222,127,255,253,199,131,131,131,113,252,248,241,228, 21,
- 43, 86,124,162,213,106,239,168,113,125,128,152,253,110,246,220,207,227,226,162, 66,112, 98,215,111,113,211,190, 90,249, 29,192,
-199,211, 44,124,255,195, 69,139, 56,139,161,195,132,144,158, 12,195,108,112, 21, 74, 21,178,157,238,240,124, 31,142,150,235,196,
-210,229,133,150, 7, 5, 9,171,213, 26,227,236,100, 17, 66,144,149,149,133,140,140, 12,228,229,229, 33, 52, 52, 20,102,179, 57,
-198,159,242,161,180,180,244,209,240,240,112,157, 88, 44, 54,234,245,122, 40, 20, 10, 94, 44, 22, 19,251,117, 24,123,175, 69,155,
-209,104,100, 56,142,179, 4, 5, 5, 5, 26,141,198, 58,240,210,150,140, 16,242,104,120,120,184,219,125, 70,163, 17, 26,141, 6,
- 90,173, 22, 26,141, 6, 70,163, 17,209,209,209,176, 90,173, 77,188,126,210, 90,173, 13, 35, 35, 35,145,153,153, 9,185, 92,142,
-244,244,116,152, 52,165, 48,151,150,194,170, 85,195, 86, 82, 2, 94,173, 6,175, 85,195, 98,210, 33,174, 86, 93, 8, 61, 18, 61,
-193,100, 50, 53, 12, 15, 15,135, 86,251, 79,115, 51, 98, 23, 88, 86,171, 21, 86,123,227,104,161, 58, 49, 34, 34, 2, 66,143,196,
-123, 4, 35,128,209, 44,203,206,147,201,100,220, 27,111,188,129,172,172,172,114,121,226,141, 55,222,112,180,201,106,219,182,237,
-238,128,128, 0,107, 94, 94, 30,140, 70,163,248, 65,125,232, 25,134, 1,195, 48,101,105,100,181, 34, 34, 34, 66,155,159,159,127,
-176,184,184,248,185,219,225,179, 88, 44, 66,143, 46,232,245,122, 16, 66,112,252,248,113, 4, 4, 4,136,109, 54,219,105,171,213,
-170, 16,139,197, 96,237,141,191, 40,238, 25,218,215, 9,145,206,158,222, 34, 42,228,145, 94, 74,173, 66, 42,210,242,215, 31, 73,
-252,254,211, 51, 43, 94, 24,244,114,208,164, 73,147, 18, 34, 34, 34, 2, 46, 95,190,108,152, 60,121,114,210,178,101,203, 24,148,
- 85,211,121,196,141, 27, 55,214,190,255,254,251, 97, 61,122,244, 72,150,201,100, 76, 73, 73, 9,242,242,242,144,147,147,131,107,
-215,174,145, 19, 39, 78, 92, 49, 26,141,171, 42, 18,200,216,216,216,111,158,123,238,185, 23,154, 54,109, 42, 22, 28, 82,173, 86,
-219,120,231,206,157,189,127,255,253,247, 54, 90,173,182,194,249,242,230,205,155,171, 62,248,224, 3,229, 19, 79, 60, 81, 71, 38,
-147,177,149, 17, 78,103,176, 44, 27, 29, 24, 24,136,109,219,182, 33, 36, 36, 4, 44,203, 70,223,105, 98, 25,204,124, 92,149,152,
-112, 24,246,206, 70,157,200, 4, 24,204,124, 28,205,194, 15,142,163,229,225, 93,223, 92,112,164,124,136, 37,253,216,177, 99,223,
-103, 24,102,195,216,177, 99,223,119,231,104,217,255,218,156,143,115, 58,222, 88,217, 98,171, 66, 3, 77,242, 60,143,140,140, 12,
-100,102,102, 34, 35, 35, 3, 5, 5, 5, 96, 89, 22,132, 16,127,122,159, 17,134, 97,248,173, 91,183,134,238,219,183, 79,219,188,
-121,243, 98,161,253,139,213,106,101, 44, 22, 11, 99,111, 23,195, 92,191,126, 93,178,103,207,158,144,115,231,206, 69,163,172,193,
- 26,239,195, 10,188,101,155, 32,176,156, 23,131,193,128,128,128, 0,255, 84,135,253, 69,120,252,232,209, 50,145,165, 41,181, 87,
- 25,150,192,166, 46, 1,209,150, 66,106,179, 64, 10, 2,198,160,243,251,254, 57, 67, 16, 89,102,187,208, 50,153, 76,176, 88, 44,
-224,121, 30, 86,235,191,210,174,252,203, 70,141, 26, 53, 89,187,118,237,144,140,140,140, 91,118,246,237,219, 23, 35, 70,140,192,
-240,225,195,207,245,236,217,243,196,111,191,253,134, 97,195,134,129,231,249, 71, 0,148, 0,248,253, 65,123,232,141, 70,163,195,
-129, 50, 24, 12, 48,155,205,128,151,198,239,190,242,166,144,182, 86,171, 85,224,102,214,174,253, 5,187,119,239,102,207,156, 57,
- 29,255,198, 27, 67,133, 6,247,180,196,189, 55,120, 66,202, 50, 95,143,108, 24, 22, 48,170, 81,184, 86,202, 49,154, 11, 95,191,
-175,185, 86, 77,165,141,174,170, 48,197, 39,133, 84,153, 54,109,106,236,185,115,231,141,227,199,143, 63,219,191,127,255,168, 81,
-163, 70,213, 91,179,102, 77, 27,131,193,240, 45,128, 98, 79,166, 75,239,222,189, 15, 68, 69, 69, 37,125,245,213, 87,185, 55,111,
-222, 12,181, 88, 44, 74,179,217,204,107,181,218,107,122,189,126,155,217,108,222, 6,224,104, 69, 2, 27, 20, 20,212,104,240,224,
-193,226,226,226, 98,112, 28, 7,179,217,140,220,220, 92, 60,254,248,227,162,245,235,215,215,191,157, 27, 80, 84, 84, 52,251,219,
-111,191,221,177,124,249,242,174, 42,149,170,169, 76, 38,139, 1, 96, 43, 45, 45,205,209,106,181,127,223, 78, 56,203,149,115, 54,
- 91,206,209,163, 71,171,171, 84, 42,220,184,113, 3, 54,155, 45,231, 78, 19, 45, 64,194,222, 60,185,107,125,213,186, 17, 73,216,
-179,239, 0, 2, 36,236, 77, 58,212,215, 3, 15,161, 13, 21,156, 5,148, 27,129,180,111,250,244,233,242, 25, 51,102, 96,250,244,
-233,167,221, 57, 90,130,224,154, 62,125,250,105,225, 56,167,227,119,221, 65, 24, 61, 59, 90,158, 20, 36, 80,214,187, 48, 47, 47,
- 47, 52, 36, 36,196, 33,176, 50, 51, 51,145,153,153, 9,169, 84,138,235,215,175, 67, 42,149,102,249,243, 17, 34,151,203,143, 52,
-110,220,184,246,213,171, 87, 37,147, 39, 79,174,122,244,232, 81,213,227,143, 63,222, 64, 46,151,219, 8, 33, 48, 24, 12,236,217,
-179,103, 3,103,205,154, 21,247,232,163,143,154, 30,125,244,209, 99, 43, 87,174,212,195,203,248, 87, 12,195, 28,202,202,202, 74,
- 78, 76, 76, 20, 68, 91, 57,113,229, 44,184,128,178, 42, 79,142,227,142,121, 11, 40,199,113, 39, 47, 92,184,208, 89, 17, 32,131,
-169, 84, 13,179, 70, 13,107,105, 41,108,165, 37,176,149,148, 0, 90, 53,164, 86, 43,196, 54, 11,228, 1, 1,200, 72, 79, 7,199,
-113, 39,189,113, 74,165,210,147, 57, 57, 57,157, 67, 66, 66, 28, 47, 81,139,213, 90,182,216,108, 48, 89,173, 14, 71, 75, 44, 22,
-227,230,205,155,144, 74,165, 39,239,117, 78,102, 89,214, 38, 12,225,224, 33, 30,136,142,142,230, 91,180,104,129, 97,195,134,193,
-102,179,217,147,129,105, 15, 96, 15,202,218,183,220,151,112, 39,110,133, 70,235,122,189, 30, 26,141, 6, 69, 69, 69,156, 92, 46,
-175, 29, 23, 23,119,192,100, 50,173,178, 90,173,223, 93,187,118, 77,237,137,211, 46,204, 28,162,139,231,121, 16, 66, 96,179,217,
- 96,177, 88, 32,145, 72,248,157, 59,119, 97,214,156, 79,176,228,187,101,164,119,239,222,204,250,245,235,193,243,124, 58, 45, 87,
-239, 9, 62, 43,254,121,106, 0,172, 54,173,113,231,114,205,143, 23,213,218, 73, 63,206, 61, 98,146,138,212,205,218, 69, 55, 76,
- 78,170, 45, 10, 9, 9,101, 23, 46,154, 87,240,211,178,213,151,111,220,184,161,254,226,139, 47, 90,214,174, 93, 59,248,239,191,
-255,142,243, 36,180, 20, 10, 69,205,151, 95,126,121,112, 81, 81,145,100,201,146, 37, 43,179,178,178,142,160,108,104, 25,231, 30,
-212, 61, 1,252,128,178, 42,203,104,123, 57,183, 7,192,100,111,223,107, 12,195,224,175,191,254,186,165,119, 32,127,103,234, 60,
-164, 70,141, 26,207, 94,189,122,117,119, 78, 78,206,211,174, 59, 37, 18,201,164, 90,181,106,117, 59,125,250,244, 68, 0,155, 42,
- 66,172,211,233,198,172, 94,189,250, 83,145, 72, 84,197,102,179,101,234,245,250, 49,119,236,104, 89,248, 87,166, 47, 92,177, 88,
-111,178, 85,147, 75, 69, 55, 12, 22,254, 85,154,149, 31, 92, 55,203,142, 60, 39, 55, 42, 15,101,243, 8, 58,175,255,109,127, 25,
-153, 8, 33,194,177,121, 78, 46,150,201,197, 5,115,183, 47,239, 14, 6, 75,119,215,227,144,241,230,104,141, 3,240, 40,128, 67,
- 57, 57, 57,243, 94,120,225,133, 89, 63,253,244, 83,144, 90,173, 70, 78, 78, 14,114,115,115,193,113, 28, 84, 42, 21,190,252,242,
- 75,125, 78, 78,206, 60,231,115,112,235, 8,242, 0, 96,136,136,136, 56,178,108,217,178,152,175,191,254,154,123,241,197, 23,175,
-247,236,217,179,206,151, 95,126,121, 85, 34,145, 16,155,205,198, 24,141, 70,230,245,215, 95,175, 62,103,206,156, 52,145, 72,164,
-120,246,217,103, 25,165, 82,121, 8, 94,134, 13,200,203,203,219,250,235,175,191, 62,249,206, 59,239,200, 76, 38,147, 91, 39, 75,
-216, 22, 18, 18,130,189,123,247,154,138,138,138,182,248,112, 49,182,254,177,105, 99,219,231,251,247,151, 88, 74,213,176,148,170,
- 97, 85,171, 97, 43, 45, 6,163, 81, 67,108,179, 66, 46,225, 17, 19, 31, 0,171, 62, 16, 27, 15,255,109, 49, 26,141, 94, 7, 54,
- 84,171,213, 91,247, 44, 89,210,254,209,132, 4,110,239,200,145, 48, 91, 44,120,226,194, 5,135,184, 50,155,205, 88,215,176, 33,
-108, 12,131, 71, 94,123, 13,151,172, 86,171, 90,173,222,250, 95,124, 24, 78,156, 56,145, 59,112,224,192,163, 60,207, 55,169,136,
-187,243, 95,135,197, 98,185,197,141,178,217,108,101,174, 99,153,115, 32,221,184,113, 99,219,179,103,207, 74, 78,157, 58,133,221,
-187,119, 63,242,211, 79, 63,141,171, 86,173, 90,195, 27, 55,110,100,251, 18,111,238, 6,253,133,189,253,225,202,229,171,240,191,
-255,253,143,201,206,206,198,207, 63,255, 12, 95,131,167, 82, 84, 26,180,176,218,228,166,157,203, 53, 61, 55,221, 40,221,159,165,
-159, 12, 96, 51, 12, 54,114,233, 24, 57,209,180,105,104, 4, 0, 24, 13,182,152,154, 53,107,182,227, 56, 78, 10, 0,129,129,129,
- 77,195,195,195,191, 44, 40, 40,104,237, 46, 77, 83, 83, 83, 91, 68, 69, 69, 53,254,253,247,223,255,206,202,202, 58, 13,224,160,
-235, 65,213,171, 87, 31,127,238,220,185,230, 98,177,152,241,145, 71, 0, 0,237,218,181,171, 45,147,201,194, 55, 93, 12,134, 90,
- 82, 3, 68, 84, 2,112, 1,176,133, 52,194,117, 73, 61,196,199, 31, 8, 47, 42, 42,122,164,164,164,228,239, 10,222,131, 14, 79,
- 62,249,228,119, 75,150, 44,137,111,215,174, 29, 57,118,236, 24, 11, 23,123,168,122,245,234, 93,247,239,223,223,228,213, 87, 95,
-253,106,197,138, 21, 67, 81,190,167,173, 47, 92,183,143, 55, 88,105,216,122, 25,219, 0, 91,130,221, 51,163,185,248, 33, 64, 69,
-134, 92,184,131,225, 25,238, 40,136, 30, 13, 12, 15,219, 31,181,143,137,245,168,197, 98, 57,126,226,196,137,117,207, 62,251,172,
-166,160,160, 0,225,225,225, 72, 76, 76, 4,195, 48,248,242,203, 47,245,215,174, 93, 91, 99, 31, 75,235,209,204,204,204,222,118,
-177,229, 14,165,243,231,207, 95,177,116,233,210,144,163, 71,143,138,172, 86,171,170, 78,157, 58,186,125,251,246, 5,138,197, 98,
- 34,145, 72,248,163, 71,143, 42,170, 87,175,110, 96, 24, 70,246,231,159,127, 22, 28, 56,112,160,218,232,209,163,191, 69, 89,119,
-107, 79, 88, 62,101,202,148,140,171, 87,175,194,104, 52, 66,173, 86,163,164,164,196,177, 20, 23, 23,163,164,164, 4, 98,177, 24,
-217,217,217,248,229,151, 95,178,236,163,196,123,115, 54,190,248,252,203,133,121, 89, 55,174, 67,165,144,195,170, 46,134,173,164,
- 0, 40, 45,129,212, 98,134, 82,108, 67,213, 26,114, 4, 40, 84,200, 81,107,176,100,223,225,108,251, 40,241, 30, 97, 50,153,190,
- 24, 49,103, 78,142, 85, 34, 65, 66,191,126, 48,219,171, 10,157,133,150,141, 97, 80,173, 83, 39,176,193,193,152,182,102, 77,142,
-125,148,248,123, 10,158,231, 69, 38,147,201, 91, 60,192,243,124,250,217,179,103, 87, 0,216,193, 48, 12, 97, 24,134,160,108,176,
- 54,205,253,252, 32, 91, 44, 22, 76,152, 48, 1, 18,137, 4, 19, 38, 76,192, 71, 31,125,132, 89,179,102, 97,225,194,133,248,241,
-199, 31,177,113,227,198,164, 61,123,246, 72,118,237,218, 69,166, 79,159,158, 95,189,122,117,209,107,175,189, 22, 34,151,203,223,
-246,198, 57,102,204, 24, 4, 5, 5, 97,204,152, 49,248,228,147, 79,240,205, 55,223, 96,221,186,117,216,187,119, 47, 68, 34, 17,
-159,158,126, 19, 6,131,129,204,159, 63, 63, 99,221,186,117,250,121,243,230,129,227, 56,134, 22,173,247, 4, 31,200, 7,126,120,
- 54,100,241,249, 43,251,179,244, 31, 0,248, 67,248, 34, 85,169, 84,242,181,107,127,229, 0, 96,205,234, 95,196, 23, 46, 92, 8,
-254,245,215, 95, 3,162,162,162,240,227,143, 63, 6,200,229,242, 40, 15,156,182,117,235,214, 25,165, 82,105,248, 43,175,188,210,
-189,121,243,230,111,217, 63, 68, 59, 1,168,143,178,222,139, 93,174, 92,185,114, 38, 34, 34,226,226,150, 45, 91,180,254, 4,180,
-180,180,244,219, 31,126,248, 33,177,208, 22,134, 77,218, 39,177,132,255, 20, 27, 67,190,195,245,132,143,160,168,210, 12,207, 61,
-247, 92, 21,155,205,182,184,130,241,127,174,111,223,190, 63, 44, 89,178, 36,254,149, 87, 94,201, 62,118,236, 88, 14,128, 37, 0,
-150, 57, 47,231,206,157,203,127,225,133, 23,178, 22, 47, 94, 28,251,236,179,207, 46, 4,240, 52,205, 58, 20, 20,229,191,133,224,
-161,215,161,167,194,124,157,213,106,237,205,113,220,122,148, 31,176,244, 77,147,201, 20,203, 48, 12,145, 72, 36,217, 57, 57, 57,
-243,156, 7, 44, 77, 79, 79,239, 29, 31, 31,239, 56, 7,101,179,123, 59,143,165,165,122,226,137, 39, 58,239,223,191,127,193,134,
- 13, 27,114, 75, 75, 75, 3, 87,175, 94, 45,159, 49, 99,198,117,158,231,201,123,239,189,151,208,173, 91, 55,157,205,102,203,122,
-237,181,215,170, 39, 37, 37,189,118,238,220,185,109, 12,195, 56, 11,173,114,156,118,212,175, 81,163,198,222, 53,107,214,168, 66,
- 66, 66,144,155,155,139,194,194, 66,104,181, 90,216,108, 54,136,197, 98,228,229,229, 97,242,228,201,234,204,204, 76,119, 3,150,
-186,227,124, 52, 49, 46,110,235,188,137, 19,130, 66, 56, 22, 5,231,207,194, 90, 84, 0,177,213,130,170,245,131, 33,145,202,113,
-233, 66, 41,222, 94,254, 75,233,141,194, 98,119, 3,150,186,229,108, 86,179,230,182,175, 70,143, 14, 52,220,188,137,216,151, 94,
-130, 78,167,131,217,108, 6,203,178,184, 50,111, 30, 36,145,145, 24,191,114,165,246,244,141, 27,157,112,235, 80, 25,238, 56,239,
- 20,206,156, 67, 25,134,113, 52,134,239,219,183,111,185, 3,127,253,245, 87, 44, 92,184, 16, 70,163,209, 74, 8,121, 19,192,151,
- 0, 2,237,187, 53,247, 48,156,149,206, 25, 22, 22, 54,239,247,223,127, 79,140,138,138, 98,156, 71,108,183,139, 79, 0,192,176,
- 97,195, 58, 29, 56,112, 64,214,184,113, 99, 99,126,126,126,243,200,200,200,237,203,150, 45,139,120,246,217,103, 51,207,156, 57,
- 19,231,202, 25, 30, 30, 62,107,205,154, 53, 53,106,212,168,193, 10,174,152,107,245,228,144, 33, 67, 58, 47, 91,182, 76,250,228,
-147, 79, 26,181, 90,109,116, 80, 80,208,229, 53,107,214, 68,244,233,211, 39,251,204,153, 51,177,247,235,253,124, 16, 56,235,215,
-175,127,233,244,233,211, 53,132,117,189, 94,143,188,188, 60,228,231,231, 35, 36, 36, 4, 93,186,116,185,146,150,150, 86,195, 3,
-103,227,103,158,121,102,226,226,197,139, 59, 43,149, 74,201,174, 93,187,180,219,182,109, 51, 92,191,126,221,106,177, 88, 72,108,
-108, 44,215,186,117,235,128, 30, 61,122, 40,101, 50, 25,251,225,135, 31,230, 79,157, 58, 53,130, 97,152,229, 0, 6,186,227,108,
-220,184,241,193, 63,254,248,227, 81,134, 97, 32, 18,137, 96, 50,153, 81, 92, 92,140,140,140,116,156, 57,115, 6,251,247,239,199,
-150, 45, 91,254,214,106,181,141,253,140,123, 56,128, 93, 70,163,177,142, 84, 42,245, 91,216,219,108, 54,112, 28,119, 30, 64, 87,
- 0,233, 52, 47, 81, 78,138, 50,137, 3, 55,141,225, 9, 33, 94,123,243,193,238, 78,173,179,127,153, 31,114, 51,132,195, 56, 0,
- 19,156, 92, 48, 95,118,158,154, 16,178,187,115,231,206,195, 58,117,234, 52,167,107,215,174, 89, 89, 89, 89,201,179,103,207,142,
-183, 90,173,230, 51,103,206,176,151, 47, 95,190,126,228,200,145, 26,181,106,213,122,237,220,185,115, 59, 93, 68,150, 39,156,185,
-124,249,242,227, 29, 58,116,248,229,181,215, 94,171,214,162, 69, 11,105, 72, 72, 8, 56,142,195,213,171, 87,241,247,223,127,155,
- 86,174, 92,153, 94, 92, 92, 92,145, 41,120, 14,165,101,100,116,121,118,248,155,107, 94,235,219, 43,226,177, 58,181,165,177,177,
-177,128, 94,143,243, 55,178,113,224,252,223,230,111,118, 31,200, 51, 26,141, 79,195,255, 41,120, 14, 29,185,116,169,115,199,209,
-163,215, 76,122,254,249,104,100,101,113,177,177,177,144, 74,165,184,118,237, 26, 46,243,188,117,230,162, 69, 57,106,181,250,223,
-152,130, 71, 6,224, 83,158,231, 57, 0,144,203,229, 24, 49, 98, 4,156,167,220, 89,184,112, 33,244,122, 61, 0,112, 12,195,124,
- 10,224,187,251,221,197, 18, 80, 88, 88, 56,254,137, 39,158,152,206,113,156,199, 81,111, 67, 67, 67, 81, 90, 90, 10,171,213,106,
-203,200,200, 56, 31, 26, 26, 10,177, 88, 12, 66,136,219,231,168,160,160, 96,252,211, 79, 63, 61,133,101, 89, 79,206, 7, 84, 42,
-213,245,237,219,183,215,124,245,213, 87,217,239,191,255,254,234, 43,175,188, 34,219,190,125,187,141, 16,242, 11, 45,183,254, 99,
-165,168, 83,199, 6,251, 71,156,183,161, 20,142,175, 94,189,122,206,145, 35, 71, 34,135, 13, 27,150,252,252,243,207,171, 58,116,
-232, 16,232,124,128, 94,175,231,127,251,237, 55,237,194,133, 11, 75,118,239,222,157, 54,100,200,144, 22,240, 50,119,234,141, 27,
- 55, 54, 78,155, 54, 45,184, 71,143, 30,181, 0, 56,218,103,229,229,229,225,250,245,235, 56,117,234,212,117,179,217,188,190, 2,
- 81, 42, 0, 48,105,192,128, 1,159, 46, 93,186,180,202, 43,175,188,146,189,114,229,202, 83, 40, 27,176,216, 21, 33,125,251,246,
-109,184,116,233,210,216, 87, 94,121, 37, 27,101,237,200,104, 59, 66, 10,138,127,208, 30,183,182,211,242,250, 1,243,131,201,100,
- 34, 6,131,129,232,116, 58,162,209,104, 8,220,207, 2,191, 46, 51, 51,147,164,167,167,147, 27, 55,110,144,180,180, 52, 2,224,
- 71, 23,197,235,174,192, 82,254,244,211, 79, 53,226,226,226, 38, 42, 20,138,205, 34,145, 72, 45, 18,137,212, 50,153,236,143,240,
-240,240,143,102,206,156, 25, 71, 8,145,120, 81,209,158,192,137,197,226, 87,163,162,162,214,133,133,133,165,135,134,134,166, 71,
- 69, 69,173, 19,139,197,255, 3, 32,246,161,204, 61, 33,128,227,184,119,149, 74,229, 86,153, 76,150, 43,147,201,114,149, 74,229,
- 86,142,227,222,133,247,129, 84,189,114, 74,165,210,119, 35, 35, 35,183,170, 84,170, 92,149, 74,149, 27, 25, 25,185, 85, 42,149,
-222, 9,231,157,124,149, 8, 66, 75, 71,236, 96, 24,198,242,200, 35,143,124,213,164, 73,147, 47,155, 52,105,242,101,163, 70,141,
-190,102, 24,198, 34,236, 7,160,131,231,193, 27,239,102, 56,255, 53,206,148,148,148,101, 75,151, 46,229,199,143, 31,175,174, 85,
-171, 86,225,248,241,227,213, 75,151, 46,229, 83, 82, 82,150,221, 46,103,116,116,116, 66, 74, 74, 74,225,226,197,139,173, 23, 46,
- 92, 32,139, 23, 47,182,166,164,164, 20,186,140, 12,255, 64,222,207,255, 58,103,253,250,245, 47, 17, 39,152, 76, 38,146,151,151,
- 71, 46, 92,184, 64,118,239,222, 77,226,227,227, 47,249,193, 25, 14,224,117, 0,191,197,196,196,156,107,217,178,229,141,199, 31,
-127,252, 70, 66, 66,194, 85,177, 88,188, 31,101, 35,188,167,216,151, 79, 1,212,242,193,217, 50, 36, 36,100, 90,124,124,252,250,
-154, 53,107,238, 77, 76, 76,220, 31, 22, 22,182, 33, 32, 32, 96, 6,254, 25, 25,187,162,113,239,240,228,147, 79, 94,215,104, 52,
-182,166, 77,155,158,115,119, 82,221,186,117,247,104, 52, 26, 91,255,254,253,211, 1,164,210,188, 68, 57,239, 18,231, 3,253,129,
-230,138,154,118,193,180,206,105, 25,231,230,184,113, 46,199,252, 96, 63,215,103, 66, 16, 66, 68,132, 16, 37, 33, 36,152, 16, 18,
- 70, 8, 9, 33,132, 4, 18, 66,100,132, 16,150,102,194,127,133,115,168, 93, 64,233,236,255, 93,225,107,255, 3,125, 63,227,226,
-226, 66,155, 55,111, 62,124,237,218,181,239, 94,185,114,229,221,181,107,215,190,219,188,121,243,225,113,113,113,161,119, 18,206,
-232,232,232,132,122,245,234, 45,168, 91,183,110,122,189,122,245, 22,184,136, 44,154, 63,255, 37,206,164,164,164,223, 27, 54,108,
-120,169, 81,163, 70,151, 27, 53,106,116,169,126,253,250,151,234,212,169,115,169,122,245,234,151,170, 86,173,122, 41, 34, 34,226,
-247,219, 8,103, 24,128, 88,220, 58, 13,216,191, 29,247,246, 41, 41, 41, 7, 2, 2, 2,220,142, 13,198,113,220,164, 70,141, 26,
-157, 68, 89, 79, 73,154,151, 40, 39, 21, 90,149, 32,180,104,134,121,120, 57,101,240, 62,205,136,175,253,244,126, 82, 78,202, 73,
- 57, 41, 39,229,164,176, 11, 45, 58,250, 52,133, 43,140,240, 62, 50,174,175,253, 20, 20, 20, 20, 20, 20, 15,157,166,114, 89,218,
- 9, 59, 24, 47,170,180, 34,189, 9,110, 71,217,110,163,156,148,147,114, 82, 78,202, 73, 57, 41,231, 67,199, 41, 96,142,135,237,
-231, 93,214,191,190, 79,133, 23, 67,171, 14, 41, 39,229,164,156,148,147,114, 82, 78,202,249, 95,225,116,135,215,238, 83,145,213,
- 14,240, 49,188, 3, 5, 5, 5, 5, 5, 5, 5, 5, 69,133,225,123, 82,233, 85,171, 86,137,132,255, 3, 6, 12, 24, 98,179,217,
-134, 11,235, 34,145,232,243,159,127,254,249, 59,111, 87,232,215,175,159,205, 27,167, 59,248,186,142, 59,206,250,181, 84,111,132,
- 7, 43,222, 44, 46,209,205,189,154,105,219,109, 48, 24,234, 9,251, 2, 2, 2,206,126,247,221,119, 23, 43, 59,156, 67,134, 12,
-169,229,122,157,196,120,113,251,176,160,128, 17,133,197,154,217,167, 47,105,190,166,121,236, 95, 65, 4,128,212,160, 0, 73,239,
-250, 33,146,150,167, 10, 12,251,180,102,219,111, 40,235, 13, 91,244, 32, 70, 56, 38, 38,166,142, 74,165, 26, 4,160,190, 78,167,
-139, 82, 40, 20,185, 0,206,168,213,234,101,217,217,217,231,253,229,105,151,136,235, 0,170,217, 87,111,236, 76, 67,130, 63,251,
-124,161,107,117, 24, 8, 32, 99, 24,152,183, 92,134, 99, 2,205,110, 53, 96,224,201,173,219,187,214,128,137, 16, 72, 24,192,184,
-229, 10, 2, 30,160,164, 82, 1,232,130,178, 33, 28, 78, 0,216,130,178,158,187, 20, 20, 20, 15, 14, 92, 39,148,118,172,115, 30,
-196, 68, 91, 9,199, 44, 32, 32, 33, 0, 9, 55, 26,141, 98,169, 84, 10,147,201, 4,133, 66,254,197,235,175, 12,153, 8, 22,197,
- 22, 43, 70,124,247,221,119,183, 61,211,117, 69,174, 3,224, 47,215,243, 67, 85,242, 41, 59,126,123, 47,180,109,207,153, 51, 76,
-215,242,199,148,150,150,178, 50,153, 12, 70,163, 17,193,193,193,143,191,241,218,107, 77, 89, 49, 49, 73, 36,202,125,115,230,204,
-201,190,221,112,190,253,246,219, 49,102,179,161, 21,207,243, 82,147,201, 36,115,189, 78,176, 66, 57,115,199,111,239, 41,218,165,
-206,152, 8, 80,161,245, 47, 64,154, 16,170,220, 57,119, 64,251,186, 45,235,215, 4,127,102, 23, 12, 38,115,239, 29,233,154,222,
- 31,237,207,124, 39, 93, 99,110, 2, 47, 3, 65,222,135, 16, 37, 39, 39, 15,139,140,140,236,191,104,209, 34, 73,114,114, 50, 2,
- 2, 2,160,215,235, 99,175, 92,185, 18,251,198, 27,111,180,147,203,229, 43,174, 94,189,250, 5,252,155, 8,174,218,142, 31, 62,
- 4, 0, 60, 62,104,114, 53, 0,239, 58, 9, 1,199,190,246,131, 39, 87, 3, 48, 26,229, 39, 70,206, 2,176,222, 67,169, 35,221,
-176,116, 22,122,191,240, 46, 7,224, 13, 71,224, 89,224,143, 31,231,161,251,128, 55,203,109,103, 8,184,223,150,206, 66,234, 11,
-239,122,156,213,188, 91, 77,198,194,243,196,163, 19,207,178,140,117,243, 37,226,110,130,225, 28, 0,238,230, 35,237,134,178, 9,
-157,221, 30,223,179,142, 40,199,108,177,185, 29,112, 86, 34, 22,229,110, 60,111,187,229,220, 23, 27,195, 98,177,149,149,173, 18,
- 14,182,117, 87,131,119,124,240,193, 7, 92,106,106, 42,190,249,230,155,214, 95,127,253,245,107,165,165,165,127,218,239,219,101,
-250,248, 82, 80, 60,208,130,203,189,208,226, 68,248,106,253,154,239,106,228,228,230,227,197, 87, 71, 97,249,242,229, 40, 42, 42,
- 66,104,104, 40,164, 18,137,120,238,167, 31,198,168, 84,202,152, 23, 95, 27,243, 21,128, 58,183, 27,154, 10, 94,167,166,235,249,
-140,125, 14, 68, 78,196,138,165, 82, 41,187, 98,197, 10, 20, 23, 23, 35, 36, 36, 4, 82,169,152,157, 51, 99,156, 92,165, 10,148,
-191, 60,116,108,107, 0,171,110, 55,156, 38,147,166,245,218,229,223,169,242,242,242, 48,248,127, 99,224,122, 29,137, 68, 98, 19,
- 94, 44, 52,143,253, 43,248, 96,209,136, 23,234, 54, 8, 2,204,167,247, 66, 44, 18, 65, 17, 28,138, 46,156, 8, 34, 6,245, 94,
-220,156,246, 62,128,143, 30,148,200, 38, 39, 39, 15,235,215,175, 95,255, 41, 83,166, 72, 88,182,172,227,176, 86,171,133, 94,175,
- 71, 92, 92, 28,118,236,216, 33, 25, 63,126,124,255, 95,127,253, 21, 87,175, 94,157, 95, 81,254,211,167, 79, 39, 86,171, 86,205,
- 0, 0,189, 26, 6,185,238, 75, 16,246, 1, 64, 80, 80,144, 79,190,240, 16,165,241,244,233, 3,245,133,243,134,117,138,179,121,
-216,110, 0,160,240,198,197,243,132,219,178,224, 13,143,251, 95,157,242,147,245,196,170,221,117,146,147,147,245,206,219, 3, 3,
- 3, 61,157, 18,173,209,104,170,185,110, 20,142, 55, 91,108, 81,158,174,215,117,196, 66,183, 2,204, 98, 3,247,211, 79, 63, 1,
- 0, 62,123,119,160,104,241,193,124,142,227,202,138,218, 79, 63,253, 20,147, 38, 77,146,110,222,188,185,199,210,165, 75,123,172,
- 91,183,110,174, 39,161, 74, 65, 65,113, 95,138, 44,231, 95,207, 66,139,101,152, 32, 85, 80, 32,158,121,238,117,252,254,251, 31,
-104,219,182,173, 99, 95, 82, 82, 18,250, 61,221, 7, 63,255, 48, 7, 0,130,238, 36, 68,119,122,157,162, 18,237, 71,221,251, 47,
-152,124, 35, 91,179,127,195,134, 13,104,211,166, 77,185,243,159,123,246, 25,252,248,237,167,240, 50,202,188, 95, 96, 8, 43, 9,
- 82, 41, 49,224,197,255,193,221,117, 94, 27,220,119, 67,183,126,243, 58,231, 20,104,231,208,124,118,239, 81, 35, 38,188,107,195,
-186,117, 80,244,203, 23,248,187,216,128,223, 51, 13,120,185,203, 99, 72, 9,147,163,141,213,134, 24,165,184, 99,182,214,242, 64,
- 8,173,152,152,152, 58,145,145,145,229, 68, 86,105,105, 41, 52, 26, 13,212,106, 53, 74, 75, 75,193,178, 44,198,140, 25, 35,217,
-185,115,103,255,152,152,152,109,126, 84, 35,222,176, 59, 89,128, 72,172,153, 48, 97,130, 49, 42, 42,202,168, 80, 40, 8, 39,145,
-149,182, 31, 60, 57, 8, 0, 88, 78, 82, 58,119,238, 92, 83, 92, 92,156,129,227, 56,233,155,111,190,233,215,240, 48, 70,163,145,
- 56,115,154, 76, 70,199,246,153, 51,103,154,162,163,163,141, 10,133,130,152,205,254,155,142, 39,175, 21, 66, 38, 17, 65, 38, 17,
- 33, 64, 42, 70, 80, 98,115,200,138, 78,193,106,181,226,147, 79, 62, 49,199,196,196,152, 20, 10, 5,145, 74,165,146,145, 35, 71,
-250, 12,231,144, 33, 67, 72, 72, 72,136, 89,161, 80, 72, 38, 77,154,116,203,180, 25,219, 79,100, 64, 46, 21, 67, 33,227, 80, 51,
- 41, 30, 50,162,247, 59,172, 34, 81,249,214, 8, 50,153, 12,173, 91,183, 70,253,250,245,177,110,221,186,246, 84,104, 81, 80, 60,
- 16,240, 56,221, 14, 7, 0, 27, 54,108,104, 7, 96, 7, 0,164,166,166, 50,101,103, 16,140, 30,246, 52, 94, 30, 60, 0, 54, 27,
-239, 24,221,148, 97, 25, 12,125,169, 7,120,222,159, 26, 9,223, 93, 60,111,227, 58,255, 76, 82,205,176, 34, 0,168,145, 16, 75,
- 94,123,249,121,216,120,254,159,138, 18, 17,240,250,224,238,101,219, 42, 33,156, 34,216, 48,234,141,167,224,238, 58,117,106, 84,
- 97,173,102, 3,152,242,147, 61,222,141,201, 54, 41,167, 27,212,175, 26, 91,221,162,215,195, 96,176, 96,201,249, 66,253,214, 12,
-109, 20, 27,146,150, 55,239,153, 22, 1,162,188, 76, 36, 4, 73,107,102,107, 45, 15, 68,220, 85, 42,213,160, 69,139, 22,221, 34,
-178,114,114,114, 88,141, 70, 3,179,217,204,151,150,150,194,102,179, 97,236,216,177,226,241,227,199, 15,202,206,206,158, 36,104,
- 30,119,156,246,118, 87,163, 79,159, 62,157,240,193, 7, 31,152, 59,118,236,120, 35, 41, 41, 73, 43, 18,137, 16, 27, 27, 59,175,
- 75,151, 46, 97, 83,166, 76, 49,247,232,209, 35, 77, 36, 18,161,102,205,154,218, 83,167, 78, 37, 0,144,251, 27,119,103,206,239,
-182,127, 78, 0,128, 97, 24,116,233,210,229,122,205,154, 53,181, 34,145, 8, 23,127,155, 73,252,189,159, 98,142, 69,173,184, 96,
-123, 33,194, 0,242, 64, 71, 75,188, 46, 93,186,164,215,169, 83, 71,195,178, 44, 78,158, 60, 25,143, 91,167,181,186,133, 83, 46,
-151, 91,158,123,238,185, 27,231,207,159,119,119, 60, 56, 17,139, 22,117,236, 6, 86, 92, 19, 32,125,143,199,112,138, 69,176,142,
- 31, 54,144, 11, 9, 0,100, 65, 17, 70,181, 90, 13,149, 74, 85,230,144,153,205, 56,126,252, 56, 90,182,108,217,110,213,170, 85,
- 59,233,243, 78, 57, 41,231, 63,112,167, 69,238, 67, 55,139,113, 90, 47,215, 70,107,135,107,164,108, 54, 43,146,170, 69, 99,230,
-135, 67, 96,179,241,176,217,108,176,218,127,109, 54, 27, 44,102,115,165,132,236, 78,174, 19,170,146, 79,249, 99,197,136,208,142,
-125, 63,237, 52,253,131,193, 91,109, 54,128,231, 45,176, 88, 0, 27,111, 1,111,179,193, 98,169,156,166, 57, 22,158, 71, 66,124,
- 12,166,127, 48, 24,174,215, 89,246,243,170, 94,219,215,143, 81,180, 77,157, 49,234,226,117,221, 39, 84,216,223, 91, 4, 72,100,
- 28,225, 2, 96, 50, 89, 81,106,226, 77, 0,180, 6, 11,111, 38,202,136, 0, 0,224, 88,230, 65,234, 93, 91, 63, 57, 57,185,156,
-200,154, 53,107, 86,196,151, 95,126, 25, 7, 0, 79, 63,253,116, 70,167, 78,157,242, 47, 92,184,128,216,216, 88, 38, 63, 63,191,
- 39,128, 55,237,231,142, 6,240,165, 7, 94,109,181,106,213, 12,145,145,145, 70, 65, 16,177, 44, 11,142,227, 80,173, 90, 53, 67,
- 84, 84,148,177,102,205,154, 90,137, 68, 2,150,101, 33, 8, 61,191, 62,243, 24, 6, 34,145, 8, 2,167,171,219, 35,112, 86, 4,
- 98,142,189,181,120,115,226,100, 89,214,237,245, 60,230,161,128, 0, 2,192,227,241, 34,214,169,120,228,188,183, 16, 88,114, 28,
- 98, 0, 59, 8, 33, 56,118,236, 24,174, 94,189, 10,137, 68,130,152,152, 24, 76,154, 52, 9, 70, 99,153,222,237,215,175, 95, 59,
- 0, 39,233, 19, 76, 65,225,192,142,251, 80, 96,185,186, 90,222,219,104,109,216,176,161, 93,106,106,234, 78, 65, 0,149,137, 29,
- 55,226,199, 98,133,197, 98, 6, 42, 97, 32, 46,111,215,177,217,120,175,215, 17,218,104,241, 60,225,220,138, 44,158,135,213, 98,
-169,148,187,199,219, 44,224,121, 11,220, 93,135, 97, 88,155,189,192,151,208,231,228,222, 35,166, 90, 2,107,169,150,132,221, 86,
- 3,226,194,101, 82,228,235,145, 92,187,174,232,184,206,130,189, 39,206, 34, 34, 80,245,192,164,139, 78,167,139, 10, 8, 8,128,
- 86,171,117, 56, 89, 95,126,249,101,156,201,100, 98, 1,128,227,196,241,121,124, 92,128,141, 7,130, 85, 89, 40, 42, 42, 9, 39,
-132, 48,118,193,243, 41,128,239,224,101,100,127,137, 68,226, 16, 40,206, 2, 72, 38,147,221,150,128, 17, 32,136, 51,137, 68,226,
-118,187,107,245,154, 47, 72,156,133, 22, 72,153,171,229, 34,182, 68, 34, 17,132,182, 81,190, 32,149, 74, 29,113,119, 7, 78,228,
-116, 61, 81,197,155, 98,154,205,102,104, 52, 26, 20, 23, 23, 35, 32,160,204, 48, 35,132,128, 97,152, 55, 1,188, 69,159, 98, 10,
- 10,247, 90,228, 62, 22, 91,238,133, 22,202, 44, 59, 6, 0,172, 22,179, 91,241,179,234,183,189,184,145,173, 69, 76,196, 33, 16,
- 47,117,146,238,208,191,127,255, 31, 98, 99, 99, 91, 8,235, 50,121, 96,248,107, 35, 62,134,213,106, 70,144,156,197,171,131,186,
-151, 19, 89,101,142,150, 9,158,228, 92, 81,137,246,163,238,253,230, 79, 14, 86,133,239,119, 21, 63,211,151, 28,125,166, 72,109,
-140,103,217,195, 40, 98, 98,109,253, 94,255,120,136, 83,225,126, 98,197,194, 9,239,248,237, 7, 50,172,248,153, 55,230,189, 70,
-184,192,122, 10,182,116,215,123,131, 31, 91,235, 44,230,194,194,194, 54,116,125,102,110,231,156, 66,218, 70,235,223, 64, 80,112,
- 8, 27,223,172, 61,154,189,185, 0,219,199,189, 71,128, 34,132,199,198,177, 29,134, 77, 69, 96,179, 94, 56,240,234, 32, 30, 40,
-124, 32,226,170, 80, 40,114,117, 58, 93,172, 94,175,135, 90,173,134, 90,173, 46, 47, 8,196, 98,230,181,255, 13,143, 16, 75,164,
-176,152, 77,248,125,217, 84,159,156,194, 16, 14,189, 26, 6, 65, 36,150,150,158, 73, 78,158,199,113, 28, 88,150,197,111, 95,188,
-247,230, 47,179, 71, 4, 1,192,137, 13, 95,168, 7,140,249,124, 62,203,178, 48, 26,141,178,138,132,251,230,205,155,241, 70,163,
-209, 96, 23,104,130,240,195,181,107,215,170, 26,141, 70,189,243,118,127, 32, 87, 4, 1, 33, 73,128, 34,234, 22,247, 44, 45, 45,
-173,138,197, 98,209,113, 28, 7,147,201,228,151, 42, 98, 89, 86,114,242,228,201,120,158,231,221, 30, 95,191,122, 21, 32,166, 33,
- 32, 13,246, 59,206,254,140, 8,109, 23, 91, 4, 21, 44, 75, 41, 40, 30,116,103,235, 62,124, 38, 24, 15,255, 29, 66,171,253,134,
- 13, 27,136,243, 23,162,213, 98,177,139,172,127, 68,143,205,198, 35, 51,207,128, 11, 23, 46, 98,238,220,185,216,123,224,221,224,
- 41, 83,166,200,198,143, 31,111,236,223,191,255,108,158,231, 27,177, 44,123, 2,255, 84, 85,148,119,133,120,190,234,209,163, 71,
-147,133,117,139,197,130,160,160, 32, 4, 5, 5,161, 78,205,248, 91, 68,150,205,102,131,217, 75,213,161,208, 70,139, 33, 60,177,
- 88,108,176,241,188, 67,252, 20,169,141,241,235,183, 29,171,225,116,120,109,225, 79,235,230,245, 60,139,193, 55, 38, 57,226,177,
- 98,225,132,119,166,124,243,141,172,200, 22, 57,114,192, 51, 47,167,244, 27, 48, 8,207, 61,245, 68, 59,163,201,180, 78,196, 18,
-222,226,184, 30, 88, 16,184,182,209,162,184, 71,184, 92,172,181,136,101,114, 4,198, 36,226,162,198, 38, 17,137, 68,135,174, 20,
-235, 36,172,136, 3,203, 73,112,166,200, 96,121,128,162,123,230,242,229,203,177, 85,171, 86,133, 90,173,134,213,106,229,159,126,
-250,233, 12,142, 19,199,115, 98, 49,147, 58, 96, 56,159,157,157,105, 97, 89, 17, 8,177,225,137,126,111, 48,178, 0,185,196,108,
- 50, 89, 81, 86,117,232,206,205,114, 30,194, 33,168, 75,151, 46, 97, 66, 79,192, 95,102,143, 8,114,218,167,106,218,180,105,152,
-115,175, 67, 63,221, 34,166,127,255,254,242,106,213,170, 49, 0,112,120,217, 7,130,123,198,244,234,213, 43,160, 90,181,178,118,
-248,127,126, 49,194,111,206, 8, 5, 1, 74,174, 1, 37,105,183, 56, 89,189,122,245,146, 37, 39, 39, 87,232, 89,180, 55,128,247,
- 56,118,151,146,179, 2,217,199,252,226,122,177, 49, 44,113,129,224,102, 63,193, 66, 26, 24,110,108,241,222,230,131, 84,108, 81,
- 80,248, 5, 23, 45,114, 95,161,157, 93, 32,182,183,255, 58, 4, 23, 7, 0,118,139,142,113,210, 89,176, 88,205,183,136, 44,155,
-205, 6, 49, 99,196,220,185,115,241,214, 91,111, 1,128,228,157,119,222, 89, 59,101,202,148, 39,121,158,111, 68, 8,105,195, 48,
-140,183,175,198, 29,177,177,177, 57,132, 16, 49,203,178,109,190,248,226,139,176, 30, 61,122, 32, 40, 40, 8,132, 39,183,136, 44,
-155,141,135,217,108,130, 39, 75, 43, 84, 37,159,242,199,170,145,161, 29,251,124,218,201,198,243, 91, 5,145,197,219,108, 0, 95,
-118, 82, 65,110, 6,182,252,190, 14, 95, 45,252,170, 8, 12, 57, 7, 2,222, 46, 6,225, 65, 12, 54,218,115,248,108,155,214,205,
-235, 97,202, 55,223,200, 78, 31,205, 90, 59,252,237,247, 83,250, 13, 24,132, 85, 63, 47, 3,107, 45, 62,230, 44,178,108, 22, 30,
- 37, 69,249,189,254,162,109,180,254, 45,132,109,217,186,149, 25, 52,104, 16, 95, 90, 90, 10,137, 84,202, 91, 44, 22, 81,171, 86,
-173,108,111,189,245, 22,155,157,157, 13,117,169,134, 3, 16,134, 7,192,214, 82,171,213,203,222,120,227,141,118,187,118,237,146,
-176, 44, 11,181, 90,141, 14, 29, 58,228,231,241,113, 1,175,253,111,120, 68,102,102,134, 85, 37,231,140, 18,137, 24,185,185,185,
-124,187, 30, 3,245, 3,134,188, 85,229,173, 15,166, 47,202,218,183,240, 75,127,174,225,220, 19,208,117,223,226,197,139, 77,113,
-113,113, 6,153, 76, 38, 29, 60,120,176, 95,245,135, 38,147,137,204,156, 57,211,232,218,187,208,100, 50,145,185,115,231,154,226,
-227,227,141,114,185,156, 88, 44,190,219,125,178, 44, 99,125,117,202, 79, 86,171,213, 90,206,197, 18, 68,150,133,103, 52, 11, 22,
- 44, 48,199,199,199,155, 20, 10, 5,145,201,100, 18,127,194, 57,124,248,112, 18, 26, 26,106, 86, 42,149,146, 49, 99,198,220, 81,
-175, 67,139, 13,220,148, 47, 28,195, 59,200,130,130,130, 80, 90, 90,234, 8,107,108,108, 44, 21, 91, 20, 20,110,112,139, 22,185,
- 63, 93, 56,255,198,209,226, 1, 77, 78,110,126, 84, 68,116, 34,172, 86,171,125,177,192,106,177, 96,228,235, 3, 48,123,225, 2,
- 0, 16,196, 86,151,119,222,121,103, 45, 0,159,133,217,138, 21, 43, 38,191,243,206, 59,170,156,156,156,205, 63,252,240, 67,216,
-192,129, 3, 49,122,244,104,124,250,233,167, 16, 75, 3, 16, 22, 89,213,113, 29,225,186,249,121,133, 32, 32, 26, 15, 62,157,185,
-172,144, 2, 23, 30,153, 0,139,205, 2,222, 98,129,197, 98, 1, 35, 42,139,218,150,223,215, 97,224, 75,195, 33,150,169, 66, 63,
-159,251,137, 62,165, 89,236,147,227, 95,121,197,232,135, 9,200,158, 62,154,181,118,248, 91, 99,186, 8, 34,107,205,178,133,231,
- 62, 27,219,103,185, 76,202, 57,174, 99,225,121,176,172,136,182,209,250,151, 68,150, 76, 38, 91,189,105,211,166, 75, 77,154, 52,
- 97,180, 90, 45, 44, 22, 11,242,243,243,177,118,237,218, 51,132, 16,132,134,134, 98,211,166, 77,252,192,129, 3, 87, 27,141,198,
-103,238,119,177,149,157,157,125, 94, 46,151,175,120,255,253,247, 7,140, 29, 59, 86,204,243, 60, 46, 92,184, 0, 48, 12, 17, 75,
-164, 96, 89, 22, 98, 49,135,146, 18, 53,175, 8, 12,201, 50, 19,145, 66, 44,145,130, 21, 73,188,117, 19,190, 97, 31,140, 20, 44,
- 39, 41, 21,122, 2, 74, 36, 18, 28, 88, 53, 75,221,126,240,100, 21, 0, 72,100,242,162,174, 93,187, 94,175, 87,175,158,246,200,
-145, 35, 9,184,181,215,161,235,243,105,237, 59,120,140, 72, 33, 15,208,118,233,210,229,134,192,153,182,245,115,245,160,161, 31,
- 48,140, 72,170, 77, 77, 77,189,158,146,146,162, 21,137, 68, 56,187,238, 19,117,223,193, 99, 2, 24, 47,131,172,110,190, 68, 94,
- 61,177,106,119,157,169, 83,167, 90,122,244,232,113, 83,104, 47,150,150,150, 86,165,103,207,158,178, 57,115,230, 88,122,246,236,
-153,222,160, 65, 3, 13,203,178, 56,122,244,104,188, 55,167, 74,128, 92, 46,183,188,252,242,203, 55, 78,157, 58,117,187,189, 14,
-189,162,106,213,170,224,121, 30, 29, 58,116,128,193, 96,160,206, 22, 5,197,131, 9,215,113,180, 60,143, 12,111,177, 90,134,191,
-254,230,196,207, 1, 38,208,169, 20,248,199, 88, 34, 96,222,125,119,148, 18,128, 92, 16, 91,111,191,253,182,207,105, 78,156, 68,
- 86,179,129, 3, 7, 98,220,184,113,248,236,179,207,108,159,126,250,169,232,252,197,107,230,193, 67, 63, 42,118,185, 14, 8,136,
-134,183,240,195,221,241, 21,149,104, 63,106,211,115,198,196,140, 28,221,158,193,111,140,119,148, 94, 54, 0,106, 38,214, 6, 0,
- 95, 45, 92,168, 21,203, 84,202,126, 3, 6, 1, 64,151,207,231,126,178,118, 10,190,241, 45,182, 8, 83,119,248,219, 99, 66, 5,
-145,245,197,156,169,167,130,153,156, 5, 35, 70,157,177, 56, 95, 7, 0,194,130,176,182, 77,207, 25,221,114, 11,181,243,104, 62,
-187,119,144, 74,165,147,183,111,223,174,108,216,176, 33, 83, 80, 80, 0,155,173, 44, 69,204,102, 51, 74, 74, 74, 80, 90, 90, 10,
-163,209,136,166, 77,155,178,243,231,207, 87,142, 24, 49, 98,178,201,100, 26,122,191,199,251,234,213,171, 95,172, 95,191, 30, 59,
-119,238,236, 63,118,236, 88,113, 76, 76, 12, 19, 28,156,195, 88,204, 38, 0,132,228,229,229,241,138,192,144,172,136,232,248, 27,
-153,217,185,117, 45,102, 19,120,155,217, 99,107,115,251,240, 14,239,158, 62,125, 58,113,214,172, 89, 38,231,158,128, 3,198,124,
- 62,191,105,211,166, 97, 11, 22, 44, 48,165,166,166, 94, 23, 26,175,251,211, 24,126,203, 21,188,121,250,244,201,250,174,156,237,
- 95,155,245,173,192,233,220, 27,177,215,168, 69,223,214,172, 89, 51, 44, 37, 37,229,186, 55,222,228,228,100,125,108,108,172,169,
- 78,157, 58, 26,177, 88,252,127,246,206, 58, 60,138,171,141,226,103,102, 93,227, 78, 72, 8, 22,197, 37,184, 91,209, 22, 45, 78,
- 41, 86,172, 80,138,180,120,161, 80,188, 88,129,150, 2,165,248, 71,139,107,113, 39, 9,193, 18, 36, 16,119,151,117,153,251,253,
-145,108,154,132,200,110, 66, 75,105,231,247, 60,243,108, 50,114,246,142,238,153,247,222,251,222,252, 72,150, 94,175,172, 89,179,
- 38,227,236,236,172,245,243,243,203,179,180,209,190, 88, 44, 38,166,168, 88,105, 88,210,235,144,199,129, 97,216,176, 97,133,153,
-225,103,213,169,147, 56, 98,196, 8,215,153, 51,103, 98,231,206,157,184,121,243,230, 27,102,191,125,251,246,184,118,237,218, 18,
-252,139, 18,235,178,176,252,199, 40, 63,143, 86, 73,118,237,218,251, 7,138,180,105, 42,141,101,203,150, 9, 11, 34, 89, 93, 63,
-255,252,115,168, 84, 42,219, 82, 86,235,130,130, 92, 27,165,153,172, 85,171, 86,237, 39,132,184, 3,104, 99, 52, 50,119,127,252,
-105, 87,199,178,190,111,208,160, 65,111,104, 18,138,230,208, 52,149, 39,224,145, 7, 63,236,216,249,107,177,245,243, 27,191,123,
-131,194,195,205, 27, 86,169, 0,116, 45,105,182,240,231, 48, 35,133,154, 38, 38, 78,154, 88,104,178, 54,111, 88,117, 33,160,169,
-199, 71,243, 63,253,166, 84,115,246,205,162, 9, 82,154,166, 90,149,104,163,245,134,230, 91,128,213,252,147,142,195,134, 13,107,
- 16, 24, 24, 72, 23, 53, 89, 90,173,182, 48,113,167,169,177,120,124,124, 60,218,183,111, 79, 55,104,208,160,222,189,123,247, 58,
-226,207,225,156,222,215,125, 55,190,126,253,122,163,139,139,203,197,133, 11, 23,142, 72, 75, 75,235,149,153,153,101,127,114,215,
- 55,232, 49,104, 18,213,190,231, 80,133,150,112, 69,113,137,201, 62, 87, 78,239,179, 59,115,112, 11,116, 90,237, 4, 0,225,248,
- 51,189, 67, 73, 77,165, 41,141,131,143,143,143,162,168, 81,241,240,240, 80,187,185,185,105, 2, 2, 2, 10,231,151,209,155,239,
-141,125,183, 84,179,160,253,151,162,162,227,105, 50,109, 37,211, 70, 72, 36, 18,152,204,151, 37,229, 44,218,219,178,212, 7,101,
-197,189, 14, 11, 53, 11,210, 59, 20,243,105,123,247,238,237,178,119,239,222,166, 0, 30, 32,127,172, 67, 61,144, 95,149, 88,164,
-209,252,226,130,137,189,223, 89,205,255,170,230,251, 76,123,252,217, 54, 11,200,111,171,117,181, 76,163, 85, 17,166,134,239, 0,
-232, 25, 51,102,100,170, 84, 42,219, 17, 35, 70,148,187, 77, 82, 82,210,206, 61,123,246, 20, 51, 89,253,251,247, 31,115,228,200,
-145,139, 41, 41, 41,149,218, 43, 91, 43,241,178,171, 39,230,216,182,239,189,242,115, 0,171,203, 8,228, 49, 1, 77, 93, 63,218,
-188, 97,213,111, 37,204,214, 47, 0,250,151,229, 74,187,125,208, 15,251,118,109, 54,181,237, 18, 63, 14,138, 63, 51, 36,100,105,
-169,189, 21,109,100,194,165, 5,229,152,201,182,209,250,123,224,243,249, 29,230,206,157,203, 87, 40, 20,111,152,172,146, 70, 43,
- 39, 39, 7, 15, 31, 62,196,232,209,163,133,161,161,161, 29,116, 58,221,229,127,195, 49, 72, 74, 74,122, 86,144,140,116,186, 41,
-133,131, 80, 36,230, 15,253,228,115,247,194, 94,135, 7,183, 64,163, 86, 1, 0,215,156,244, 14, 92, 46,151, 31, 26, 26,234,105,
-138, 90,233,116, 58,161,105,126, 80, 80,144,167, 41,183,150, 90,173, 54,187,215,225, 95,165,249,232,209, 35,119, 83,239, 72, 83,
-239, 66, 46,151,203, 15, 14, 14,118, 55,105,106, 52, 26,179,122, 29, 10, 4, 2,126,104,104,168,187,209,104,124,107,189, 14,139,
- 26, 99,228,143,179, 88,108,172,197,130,182,101, 20, 69, 81,132,173, 54,100, 97,121,239, 41,217, 83,178,252, 65,165, 43,194,212,
-240,221,130, 77,184,213,171, 87,239,246,241,199, 31, 23, 51, 89, 3, 7, 14, 52, 30, 61,122,244,138,171,171,107, 50, 77,211,207,
- 44, 45, 71, 97, 27, 45,188,241, 6, 9,154,166, 31,182,105,230, 7,154,166, 31,206,255,244, 83,205, 50,252, 84,204,108, 29,251,
-237, 80,247,184,204,167,165, 91, 51, 0,246, 78,213, 48,108,204, 20, 12, 27, 51,197, 22, 64,107,160,236,222,138,229,149,131,229,
-175,129,162, 40,129,155,155,219, 99,181, 90, 13,138,162,160,209,104, 10, 13, 86,110,110, 46,178,179,179, 11,255,215,233,116, 72,
- 77, 77,133,135,135, 7, 40,138,250, 87,183,163,211,233,116,134,185, 75,214,236,225,112,249, 6,134,209, 81, 58,157,238, 19, 75,
-238,243,185,115,231,210, 40,165,237,213,212,169, 83, 75,157,255,174, 52,191,250,234,171, 82,123, 9, 78,157, 58,181,220,222,131,
-101,241,197, 23, 95,188,181, 94,135,230, 63,190, 88, 88, 88,254,101,148,218,117,175, 82, 70,139,166,233,135,165,244, 46,164, 0,
- 16,154,166, 31,150,146,229,192, 16, 19, 19,179,196,198,198,102,130, 66,161, 56,219,191,127,255, 25, 3, 7, 14, 52, 2,249, 13,
-228, 43,187, 71,153,217,138, 69, 29,250,124, 55, 51, 43, 79,179,169,228,178,146,145, 39,147,217,218,242,253,170,173,191, 29, 57,
- 48, 48, 41, 33,110,107, 89,251, 86,150,161, 42,171,183, 98,118,142,106, 73,135, 62,223,125,158,153,163, 98,219,104,253, 77, 24,
-141,198,243, 98,177,152, 50, 13,166, 92, 52,122,149,147,147, 3,165, 82,137,130, 33,105, 0, 0,121,121,121,176,182,182,134,209,
-104, 36,255,178, 67,161, 1,240,101, 65,180, 10, 0,190,140,188,178,177,232,181,253,168,232,178,114,162, 89,137,230, 12, 16, 93,
-218,118,229, 45,251, 11, 52,147,203, 25, 32,186, 60,146, 45,212, 75, 6, 0, 62,143,147, 82,214,224,209,124, 30, 39,165,156,118,
-251, 22,190, 55, 80, 4,192, 18,246,206,102, 97,121,127,223,255,223,213, 23,119, 97, 53, 89, 77, 86,243,111,209, 20, 22, 76,230,
- 46, 99,143, 39,171,201,106,178,154,255, 52,205,210, 24,255,158, 24, 45, 82,202, 4, 66, 8,254, 77, 99,192,177,176,252,151,209,
- 84,114, 25, 11, 11, 11, 11, 75,213,121, 99, 48,233,162, 11,202,114,165,150,244, 38,168,140,179,189,200,106,178,154,172, 38,171,
-201,106,178,154,172,230,127, 78,179, 34,237,162,219,143, 7,176,227, 61, 49, 91,111,152, 44, 66,254,250,214, 42,108, 88,149,213,
-100, 53, 89, 77, 86,147,213,100, 53, 89,205,202,194, 86, 29,178,176,176,176,176,176,176,176,252,199,177, 44, 97, 41, 75, 41,120,
-244,155, 15, 6, 95, 21, 28,206, 85,136, 61,182,248,223,182,139, 3, 7, 14,228, 88,178,126,100,164, 13, 29, 2,215,181, 86, 82,
-126,159, 60,133,126, 45, 19,178,104, 83, 69, 23,162, 67,205,198, 35, 37, 34,201,103, 90,173,214, 75, 38,151,167,100,164,167,110,
-203,136,121,180,165,200, 58, 86,119,239,222,117, 13, 12, 12, 76, 0,144, 91,228, 77,129,133,133,229,109, 98,227, 87, 29, 20,245,
- 9, 64,254,236,118,201,144,167,200, 14,223, 85,108, 61,107,223, 49,160, 41,255, 34,115, 84, 32,248, 17, 89, 97,177, 21,252,224,
-216, 68, 68, 68,120,214,174, 93, 59, 26, 64, 86,201,111, 47,101, 25,123,159,179,188,207,180, 71,241,132,165,133,247, 66,213,141,
- 86,157,254, 94, 48,208,163, 64, 48, 28, 20, 66, 17,121,100, 64,165,116,106,125, 84, 13, 12,183, 57,128,198, 0,105, 44, 21,139,
- 26,169,180,186, 20,134,144,145,120,117,232,129,197,122, 94, 3, 39,161,236,225, 44,150, 32,242,200, 15, 22,233, 49,228,235,251,
-215,142, 10,109, 36, 20,106, 55,233, 63, 27,197, 51, 56, 87, 22, 1,128,182, 52, 77,251, 75, 36, 18, 87,165, 82,153,202, 48, 76,
- 44,242,235,167, 51, 43,169, 73, 3, 24, 43,147, 74,123,120,202, 5,141, 99,210,178,227,115,245,198,235,200, 79,232,154,249,182,
-174,168,124,147,229,178,227,243,161,129,163, 87, 77,235, 2,155, 14,223,205, 86, 2,229, 25, 45,202,221,187,213,177, 33, 31, 15,
-234, 48,121,252,104, 89, 53, 71, 25, 18,211, 20,246, 63,236,220,187,102,239,222,125,189, 63, 29,210,181, 7, 0,124,243,205, 55,
- 31, 86,175, 94,189, 6,135,195,137, 92,176, 96,193, 47,139, 22, 45, 34, 84,217, 35,149,187, 22, 92,195,166, 7,190, 20, 64, 0,
-128,154, 0, 94, 3,120,130,226, 89,198, 43,195,123,161, 89,173, 90, 53, 55,134, 97, 62,117,118,118,238,149,156,156,124,138,166,
-233,159,226,227,227, 19,222,229, 83,135, 16,178,157,162,168,241,132,144, 29, 22,124, 78,176,228, 59, 68, 34, 81,178, 90,173,118,
- 42,248, 59, 69,173, 86, 59,255, 85,251,243,119,126,215,223,244,254, 61,238,252,141, 39, 61,138,206,234,214,198,191,148, 39, 10,
-229,127,254,198,211,118,197,215, 11, 48,150,241, 12,164, 8, 33, 88,178,100, 9,181,116,233,210, 49,181,106,213,170, 67,211,244,
-243,133, 11, 23, 22, 75,125, 83,114, 89,145,251,156, 53, 91, 44,239, 43,150, 13, 42, 93, 33,126, 3,165, 80,147,129, 0, 53,186,
-125,179, 70,109, 38,140,236, 67, 17,142, 8, 67,199,205, 49, 88,172,229, 57, 90, 8,142,106, 89,125,127,239, 25,131,250,116,161,
-155, 6,212,128,171,163, 53, 64,243,176,253,116,148,253,166, 85, 11,182, 2, 8,172, 68, 41, 23,189,186,189,223, 41, 49,203, 8,
-138, 2, 40, 10,160, 41, 32, 79,205,160,219,135,163, 22, 1,248,193,194,167, 18,109, 35,161, 48, 99,191, 26, 0, 56,111,225,164,
-212,112,116,116, 28, 51,125,250,116,105, 64, 64,128,141, 72, 36, 18,168,213,106,231,136,136, 8,199, 5, 11, 22, 4,168, 84,170,
- 19, 0,238, 91,168,233, 81,219,221,237,208,166, 25, 99,155, 55,168,233, 9,158, 54, 15,140, 70, 81,253, 69,196,203,150, 19,183,
- 30, 30,247, 52, 67,253, 49, 42, 49,100, 66, 90, 90, 26, 5, 0, 14, 14, 14,164,184,201,106, 49,122,253,204,110,152,177,238, 60,
-148,106,237,175,229,105,216,213,104, 56,226,163,143,250,117, 88,254,245, 84, 89,124,186, 14,161,145, 42,216,201,248, 88,244,229,
- 36,129, 70,163,111,185,245,151,189,227, 55,175,156,243,163,209,104,236, 4,160,169,209,104, 12, 2,240,203,146, 37, 75,202,122,
-248, 46, 5,240, 85,193, 5,189,143,195,225, 92,232,216,177,163,215,167,159,126, 74, 53,105,210, 4,193,193,193, 53,247,239,223,
-223,229,212,169, 83,145, 70,163,241, 17,128,231, 40, 24,246,196, 12,120, 0,188, 57, 28, 78,253,127,178,166,171,171,171, 88,171,
-213,142,114,119,119, 31,223,170, 85,171,250,125,250,244,161,188,189,189,241,236,217,179, 38,103,206,156, 89,116,253,250,245, 71,
-113,113,113, 59, 4, 2,193,158,196,196, 68,213,223,254, 59, 78, 81,227, 1,184, 21,248,228, 37,102,124, 38, 32, 63,151, 84,162,
-185,223,161, 86,171,157, 76,141, 77, 41,138,114,250, 43,247,199,194,239, 10,163, 40,202,174, 96, 93,148,247, 73,211, 52, 12, 6,
-131,194,104, 52,214,170, 64,211,187,224, 69,202,108,175, 11,160,188, 68,208, 98, 0,232,214,218, 63, 3, 20,158, 22, 70,180,222,
-124,201,124, 90,104,192, 8,252,207,223,124,106, 87, 44, 10, 86,242, 45,118,201, 18,106,209,162, 69, 88,188,120,113, 31, 0,109,
- 25,134,185,238,235,235,187,177,152, 36,195, 20, 46, 91,180,104,209,247,229,220,231, 44, 44,239, 11, 29, 96,201,160,210,101,190,
-255,212, 26,208, 14, 70,140,246,180,119, 26, 56,237,211,193,226, 0,223,218, 80, 67,134,168, 52, 35, 78,159, 60, 3, 0, 7, 45,
-139, 58, 13,110,202,229,170,247,172, 90,252,165, 79,219,230, 1,120, 28,175, 71, 80,188, 17,202, 72, 61, 56,180, 30, 70,134, 0,
- 4,234,202,238,117, 92,166, 1, 55,158,107, 65, 83, 0,135, 6,104,154, 2,135,174,164, 24,163,125,241,205,174,144,128,180,100,
- 6, 96,180, 47,170,120, 66,252,235,214,173, 59, 98,233,210,165, 54, 73, 73, 73,210,224,224, 96, 8,133, 66,216,218,218,114, 92,
- 93, 93,221,214,173, 91,167,154, 54,109, 90, 47,157, 78, 23, 5, 32,205, 76, 77,223,158, 77,235,223,218,177,234, 27,107,253,221,
- 51,200, 58,240, 63,112,104, 2,190, 84, 6, 47,177, 24,103, 62,170,109, 55,240,100,228,209,123,201, 10, 95, 0,241, 21,137,133,
-135,135,115, 52, 26,205,199, 86, 86, 86, 45,120, 60,158,179,200,182, 6,147,192,109,154,158, 74,213,124,157,226,164,108, 55,179,
-139,115,143,181,159,119,196,140,117,231,177, 97,255,157,221,141,145,180,176,188,188,217, 18,137,108,194,180,207, 62,149,197,165,
-233,176,236,104, 26,118, 93,203,193,168,182,114,204,248,192, 26,195,134, 14,145, 30,254,223,145, 9, 0,126, 44,178,201, 51, 95,
- 95, 95, 42, 60, 60,188,180,135,175, 45,128, 57, 90,173,150,230,243,249,148, 72, 36, 26,177,124,249,114,221,208,161, 67,227, 76,
- 43,180,109,219, 22,109,219,182,165,114,115,115,107, 94,190,124,185,230,222,189,123, 13,183,111,223, 14, 3,112,172,236,136,133,
- 56, 70,173, 86, 85, 23,137,197,202, 31,182,110, 93,219,174, 93, 59, 70, 40,252, 51,253, 84,101, 52, 1,192,218,218,250, 71, 39,
- 39, 39,106,222,188,121, 9,111, 75,179, 70,141, 26,231,155, 55,111,222,177, 91,183,110,220,214,173, 91,195,205,205,173,112,153,
-131,131, 3,218,182,109, 75,197,198,198, 54,184,126,253,250,214,243,231,207,111,124,240,224,193,229,168,168,168,110,127,115, 68,
-107, 71,129,153, 72,180,112,253,247, 30,138,162,100,219,183,111,119, 50,141,201,168,215,235, 97, 52, 26, 11, 63, 77, 19,195, 48,
- 48, 26,141, 88,190,124,185, 81,161, 80,152,115,140, 20, 69,222,154, 77, 19, 83,218,167, 64, 32,112, 48, 37,236,173,224,201,254,
-212, 85,152,229, 39,149, 74, 61, 1,244,132, 99,157, 57,197, 87,200,127,127, 86, 40, 20,209,137, 26,155,167, 0,218,149,163,102,
-179,116,233,210, 81,139, 23, 47,238, 87, 36, 74, 91,127,208,160, 65, 37,135,189,170, 95,240,169,160, 40,234, 10, 77,211, 39, 0,
-236,194, 91,140,186,179,252,187, 32,132, 52, 3,224, 88,100,150, 22,249,181, 66, 40,248,157,164, 0,216,151,152, 95,116, 61,211,
-103,106,193,124,199,130,237, 72, 17,221, 84,138,162,238, 87,178,136, 87, 81, 70, 59, 45, 46, 0,156, 60,121,146,244,238,221,155,
- 50,125,150,110,138, 6,158, 30, 59,180,111,143, 94,157, 91,129, 22,217,226, 69, 10,112, 59,134,128, 75,235, 65,131,224,238,205,
-203, 4, 92,102, 79,137,173,202,142,158,212, 24,240, 69,253, 0,223,239,126, 90, 53,157, 19,150,194,197,174,235, 74,232,212,121,
- 72, 77,138, 65, 74, 66, 52, 18,227, 94, 35, 62,230,245, 35,128, 90,100,182,230, 27, 39, 6, 48, 50, 5,239,128, 12, 74,139,232,
-153,175,169, 83,132,215,244, 14, 8,200, 20, 24, 1,157, 34,220,140,175, 47, 75,179, 94,157, 58,117,134,126,253,245,215,118, 79,
-158, 60, 17, 43,149, 74,205,153, 51,103,158, 69, 69, 69, 89,185,186,186,102, 76,154, 52,169,142,155,155,155, 85,255,254,253, 5,
- 7, 14, 28,248, 16,197,187,181,150,165, 25,208,183, 69,163,219, 59, 55,174,151,166, 31,222, 4,109,196, 67,156, 78, 84,224,102,
-178,146,212,180, 22, 82, 83, 26, 56, 66, 38,228,226,155,214,110,178,158,191, 69,124,167,103,152, 97,229,105,222,186,117,203, 85,
- 34,145,172, 27, 62,124,184,235,212,169, 83,133, 70,174, 13,247,200,237,116,235, 57, 91,111,187, 41, 53, 58,206,208,142, 53, 48,
-115,120,125,204,220,112,201,100,178,198,123,121,101, 49, 33, 33,101,107,234,117, 58, 47,119, 39, 43,132, 70,169,176,235, 90, 14,
-254,248,218, 13,157,151, 39,160,127, 99, 46,124, 61,100, 48,232,244,222,131, 6, 13,218, 83,240,214,126, 31,192,135,131, 6, 13,
-242,225,112, 56,151, 0,252, 94,209, 57, 18,137, 74, 31, 61,197,214,214, 22,237,219,183,135,175,175, 47,183, 93,187,118,245, 75,
- 24,152, 98,154, 58,157,214,149, 97, 8,228,114,185,216,222,222,222, 86, 46,151,167,151,246, 67,101,137, 38, 0,216,217,217, 13,
-104,223,190, 61,119,255,254,253,105,145,145,145,119,135, 14, 29,250,218,202,202,170, 88,244, 87, 42,149,162, 78,157, 58, 88,176,
- 96, 1,183, 71,143, 30, 21,106, 58, 59, 59,119,221,187,119, 47, 40,138, 42,252,209,126, 35, 88,236,233, 9, 23, 23, 23,244,236,
-217,147, 59, 96,192,128,174, 81, 81, 81,149,186,143, 44,224, 98, 41, 17,173, 37, 37,206, 83,153,213,111,165,173,111,198,121, 79,
- 49, 69,151, 10,244, 80,133,123,179,220,234, 78,145, 72, 84, 24,133, 42,229,187,222,208,164,105, 26,243,231,207, 7, 69, 81,224,
-241,120,224,243,249,165,126,118,232,208,193,210,114,198, 82, 20, 69,243,249,252, 57, 92, 46,247, 83,141, 70,227, 46, 18,137, 18,
-140, 70,227,110,141, 70,179, 28,128,158, 16, 98, 83,134,201, 42, 85, 83, 42,149,122,190,120,241,162,110, 89, 5,209,104, 52,168,
- 95,191, 62,160, 65, 88,121,154, 17, 17, 17,158,181,106,213,242, 6, 96, 26,162,237, 26, 33,164, 93,145,255,139,114,141, 16,242,
- 65,193,223,207, 95,189,122,229, 89,187,118,237,204,191,235,250,100, 53,255,121,154, 21,120, 17, 71,138,162, 78, 22,185, 87,123,
-155,254,159, 59,119,238, 87, 43, 86,172,120, 66, 81,212,201,162,243,139,174, 87,244,179,224,121,115,146, 16,210,123,222,188,121,
- 1, 43, 87,174,252,214,180,238, 95, 97, 18, 45,137,104, 89,165,170,165,184, 30, 99, 5, 46,199, 8, 46, 77,129,203, 1, 64, 40,
- 68, 71, 69, 32, 55, 39,235, 6, 34,143, 70,154, 23,201, 26,216,186, 97,195,122,171,246,109,152, 77,255,124, 93,137, 44,133, 26,
-225, 15,174,224,254,149,223,147,140, 6,227,239,160, 72, 16, 64, 7,227, 53,243, 12, 56, 82,185, 49, 46, 40,194,205, 55, 90, 5,
-230,170,152,217,122,103, 52,240,241,241, 25,178, 96,193, 2,135,144,144, 16, 81,118,118,118,238,190,125,251, 18, 52, 26, 77, 20,
-128,115,209,209,209, 62,223,127,255,189, 96,213,170, 85,245,234,213,171,231,122,232,208, 33,109, 41,195, 25,189,161,249,229,232,
- 97,183, 63,157,246,185, 40,236,208, 22, 8,194,130, 49,255, 97,154,241,143, 68,229,215, 0, 54, 32, 54,175,117,170,218,112, 97,
-125,251,234,116, 13, 57, 31,181,109, 4, 29,194, 51,212,229, 70,178, 36, 18,201,186,189,123,247,122, 54,107,214,140, 6,128,235,
-207, 13,194, 57, 91,111,187,157, 91,209,154,106,237,111,143,148, 44, 13,166,111, 9,197,153,219, 41,103, 77, 38,171,162, 66,202,
-229,242,212,184,148, 28,103,123,153, 8, 35,219,200,208,121,121, 2, 6, 54, 21, 66,200,167,240, 44, 50, 9,181,107,213,160, 66,
-111, 28,107, 90, 96,178,154, 37, 38, 38, 2, 64, 83, 0,145,177,177,177,174,129,129,129,217, 69,228, 50, 1,124, 39, 16, 8,230,
- 83, 20, 69,154, 53,107, 22, 90,175, 94,189, 60, 91, 91, 91,168, 84, 42,104, 52, 26,240,249,124,168, 84, 42, 68, 71, 71,227,238,
-221,187,176,181,181,181,232, 68,229,229,229, 65, 46,151,131, 97,152, 42,107, 26,141, 70,106,219,182,109,210, 39, 79,158, 72,143,
- 28, 57,226, 60, 99,198,140,116, 63, 63,191,160, 33, 67,134,188,116,114,114,210, 60,124,248, 16,183,110,221, 66,102,102, 38, 90,
-180,104, 97,150,166, 86,171, 5,151,203,133, 74,165,130, 80, 40, 4,151,203,133,193, 96, 0,195, 48,133,230, 43, 47, 47, 15, 25,
- 25, 25,224,243,249,208,106,181,239,226, 13,244,141, 8, 85,121,213,111,149,137,104, 21, 53,106,102,154,172,138, 34, 81,101, 86,
-119,102,101,101,137,109,108,108,230, 0, 72,172,232,187, 40,138, 2,135,195, 1,159,207, 7, 69, 81,104,215,174, 29,198,142, 29,
-139,198,141, 27, 35, 34, 34, 2, 7, 14, 28,192,253,251,247,193,227,241, 10,215, 55,187,126,162, 67, 7,142, 72, 36,186,213,183,
-111,223,128,175,191,254, 90, 84,163, 70, 13,132,133,133,121,172, 92,185,114,206,197,139, 23,251, 41, 20,138,166,166,167, 93,249,
- 81,250,130, 42,193,252,234,194,158, 26,141, 6, 97, 97, 97,150,108,243, 6,181,107,215,142,166,105,250, 37,195, 48,215, 1,212,
- 39,132,180,163, 40,234, 12,242,219, 37, 22, 69, 65, 8,249,128,162,168, 28, 0,143,104,154,126,206, 48, 76, 52, 27,183, 97, 49,
-227,185,210,187,228,255, 20, 69,157, 92,177, 98, 69,239,210,204, 85, 41,247,102,177,249, 43, 87,174,252,182,200,255, 85,137,168,
-182, 71,241,198,240, 29, 10,162, 92,127, 26,173,147, 39, 79,150,239, 64, 24,244, 63,121,116,255,157,206, 58,120, 6, 52,105, 91,
- 36, 58, 68, 16,124,247, 22, 0,178,219,172,162,184,246, 22,211, 28,238,238,109,223, 78,165,183, 95, 81, 34, 54, 33, 5,183, 78,
-239, 70,106, 98,212, 46,128,204, 64,228,145,156, 42,159,137, 26,253,235, 57,217, 59,216,168,117, 4, 12, 1,240,134,217,122, 39,
- 52,246,246,246, 30,112,251,246,109, 7,181, 90, 45,186,113,227,134,114,239,222,189, 73, 58,157,238, 10,128,155, 5,235,132,164,
-166,166, 14, 42, 48, 38, 28, 46,151, 43,208,233,116,229,181, 93,104,252,229,167,163,110,124,183,109,167,232,229,227, 80,124,127,
-228, 52,178,148, 74,227,149, 20,213,135, 0, 76,142,254, 82, 72,154, 42,158,128, 84,231,209, 20, 92,165, 60,151,240, 12,181, 8,
- 40,189, 74, 86,163,209, 12, 29, 62,124,184,171,201,100, 1, 64, 90,174,158,171,212,232, 57,173,253,237,209,164,227, 32, 4, 95,
- 62,140, 67,215,226, 81,203, 81,114,205, 75,154,101,214, 17, 77, 77, 73,220,182,126,211,246,245,223, 45,249, 82, 48,179,167, 53,
- 6, 54,229, 65,196,167, 96, 37,225, 97,249,198, 31,245, 33,119,175, 61,116,117,117, 61, 9,224,195,196,196, 68,184,186,186,230,
- 1,120,206,225,112, 34,141, 70, 99,105,141,186, 23, 2,112,222,179,103, 15,173,215,235,243, 34, 34, 34,224,226,226, 2,103,103,
-103, 88, 91, 91, 35, 60, 60, 28,127,252,241, 7,158, 61,123, 6,134, 97,208,176, 97, 67,139, 78, 86,122,122, 58, 30, 62,124,136,
-158, 61,123,205, 72, 77, 77,177,178,181,179, 87,220,184,126,109, 77,101, 52, 25,134,161, 0, 32, 32, 32, 0, 1, 1, 1,162,248,
-248,120,247,147, 39, 79, 58, 45, 91,182, 44,198,211,211,115,159, 74,165, 42, 22, 57, 48,215,104,153,204,133,201, 4,138, 68, 34,
-240,249,124,228,228,228, 32, 57, 57, 25,185,185,249,157, 54,109,108,108,222,137,209, 42, 35, 66,245,214,214,255,139,205,225, 27,
-213,157, 54, 54, 54,195, 1,204, 49,115, 95, 96, 48, 24,192,231,243, 17, 24, 24,136, 77,155, 54,225,254,253,251,248,253,247,223,
-225,225,225,129,209,163, 71,131,166,105, 60,121,242,196,210, 34, 50,183,111,223,158,243,225,135, 31, 6,236,217,179, 71, 20, 29,
- 29,141,103,207,158,193,198,198, 6,155, 54,109, 18,142, 31, 63,190,246,229,203,151, 23, 34,191,243, 75,249, 20,233, 93,168, 16,
-187, 14,174, 95,191,254, 27,171,184,184,184, 88,159, 59,119,206,169,208,128,149,236,145,248, 38, 89, 11, 23, 46, 92,239,235,235,
-187,161,160,186,176, 45, 0, 41, 33,164,195,145, 35, 71, 40, 0, 24, 56,112, 32,161, 40,202,244,131,244,232,240,225,195, 29,195,
-195,195,201,226,197,139,217, 54, 90, 44,101,121,145,241,166,123,178, 44, 3,101,137, 81, 43, 26,241, 50, 49,111,222,188,128, 21,
- 43, 86,220,171,162,201, 42,250,198, 68, 76,102,171,240,199,180,204, 42,195,194,216, 23,237,234,226,100,111, 55,119,116,107, 48,
- 12, 96, 48, 2, 6, 35,129, 66,169, 66,216,227,251, 74,136,168, 35,102, 21, 71, 40, 88,181,236,235,207,107,134,198,209, 72,200,
-212,225,234,177,237, 36, 53, 49,106, 0, 34, 15,127,242,118, 76,214,224,250, 46,206, 78, 87,247,111,255,134,190,255, 90, 11, 35,
-147,239,179, 24,134, 20,254,253, 14,112,113,116,116, 28,118,231,206, 29, 71,161, 80, 40,122,241,226, 5,115,248,240,225, 76,157,
- 78,119,177,136,201, 2,128,214, 77,155, 54, 53,200,100, 50, 40, 20, 10,157, 78,167, 83,151, 99,178,220, 59, 52,110,112,237,187,
-109, 59, 69,106,173, 22,217, 42, 13, 56,246, 78, 37, 77, 22, 0,180,234, 88,183, 90, 53, 74, 36, 7, 1, 16,149,163, 75, 40,203,
-100, 1,128, 80, 40,236, 50,117,234,212, 98,227,226, 57,200,121, 6,137,144,103,188,249, 52,141, 9,190,124, 24,215,159,164, 49,
- 34, 62,199,232, 72, 94,215, 52,247, 0,100,197, 61,221,246,251,241,147, 23,190, 88,176, 42, 79,169,200, 69, 45, 55, 49,242,114,
-179,177,124,197,119,250,219,183,175, 95,153, 51, 99, 98,203,195,135, 15,175, 68,126, 99,112, 0,120,126,248,240,225, 81, 11, 22,
- 44,248, 5,127,166,121, 40, 73,194,176, 97,195,226,252,253,253,179,125,125,125,179,211,211,211,241,244,233, 83,100,102,102,226,
-251,239,191, 71, 88, 88, 24, 76, 17, 65,179,218,170,188,105,144,144,153,153, 33, 35,132, 32, 51, 35, 93,250,245,215, 95, 91, 87,
- 70,211,104, 52, 22,187,183,170, 85,171,134, 73,147, 38,241,149, 74,165, 77, 76, 76,140, 85,209,101,230,106,106,181,218,194,140,
-195,132, 16,104,181, 90,100,103,103, 67,171,213,226,229,203,151,133, 38,171,224,251,223, 89, 68,203,244,183, 72, 36, 74, 54, 93,
-203,166, 42, 56,145, 72,148, 82,214,250, 85,161,200,119,145,130,191, 45, 53,135, 21,238,143,153,231, 29,124, 62, 31, 99,199,142,
-197,189,123,247, 16, 17, 17, 1, 14,135, 3,133, 66, 1,165, 82,137,174, 93,187, 66, 32, 16, 88, 26,209, 34,124, 62,127,248, 87,
- 95,125, 37,138,140,140, 68, 90, 90,154,169, 49, 61,140, 70, 35,102,204,152, 33, 22, 10,133,195, 45, 13,221, 39, 38, 38,118,127,
-249,242,165,119,201, 41, 41, 41, 41,187,104,155,194,202,114,228,200, 17,106,224,192,129,100,224,192,129,196,100,184, 88, 88, 74,
-163, 12, 47,178,163,172,136,214,219,136,138,153, 34, 91, 40,232, 32, 82, 9, 76, 38,171,125, 17,227, 69,153, 34, 92,230, 85, 29,
-214, 26,220,200,217,222,238,242,158, 45, 75,101, 39, 31, 83,136,139,141, 66,106, 98, 52,154,182,236,128,176,199,161, 96,244,198,
-163,120,121,164,226,150,156, 53, 6,214,245,245,245,251,172,125,203,122, 88,117, 50, 15, 47,130,207, 33, 43, 53,113, 51,162, 14,
- 31,125, 43,103,200,115, 96, 3,103, 39,187,203,191,108, 89,106,115,230, 41,141,216,216, 40, 28,251,101, 61,209,235, 52, 89, 40,
-222,147,203,226,183,102, 49,163, 21,228,101, 37, 67,155,107,132,136, 86,138, 44,172,164, 72, 2,112,125,253,250,245,157, 91,180,
-104, 33, 24, 54,108, 88, 82,102,102,230, 49, 0,119,138,172,227, 95,183,110,221,158,155, 54,109,114,142,141,141,197,197,139, 23,
-147,144,223,245,191, 44,226,174,133, 62,222,250,199, 47, 63,126, 41,174,233,131,239,191,250,194,112,228,254,211,190, 0,206, 20,
- 89,199,183, 75,253,186, 39,151,205,154, 76, 51, 33,103,241, 48, 58, 25,175,179, 53,127,148, 37,152,150,150, 70, 41,149, 74, 79,
- 27, 27,155,162, 23, 36, 92,165, 10,205,236,193,117, 19,186,206,185,225,166,214, 25, 33,228,209,100,122, 63,207,132,123,199,142,
-216,167,169,211, 40, 83,111,196,138, 24, 55,164, 75,191, 45,123,127, 27,121,242,228,169,207,116, 26,117, 61, 31, 31,111, 18,116,
-251,242,195, 57, 51, 38,246,168,228, 25,151,221,187,119,143,230,112, 56,197, 12,122,209, 8,145,165,145, 34, 75, 48, 87,179,164,
-209, 50, 97, 48, 24,168,202,106,106, 52,154, 82,135,118, 40,173,173, 22,195, 48,127,201,254, 91, 18,161, 42, 90,101,104,106, 79,
-167, 86,171,157, 10,218,108, 57,191,205,136, 86, 85,122, 34,150, 87,125,105, 73,249,104,154, 6,195, 48,224,243,249,104,216,176,
- 33, 78,158, 60, 9, 59, 59, 59, 88, 89, 89,193,202,202, 10, 98,177, 24,246,246,246,133, 70,139,166,205,238,165, 67, 52, 26,141,
-135,135,135, 7, 94,190,124, 9,145, 72, 84, 56, 9,133, 66, 4, 4, 4, 64,161, 80, 84,195,187,140,221,179,176,252,181,207,149,
-147, 69,205, 18, 69, 81, 39,231,206,157,251, 85,101,245,230,206,157,251, 85,105, 17,174, 42, 26,174, 98,209, 45,110, 81, 7, 89,
-170,147, 44, 48, 89,187, 54, 47,177,250,237, 1, 16, 23, 23,137, 11,135, 54,230,234,117,218, 76,134,209,123,190,126, 22, 10,208,
-216,109, 86, 17,104,210,188, 95,207,142,212,133, 39, 90,228,100,165,226,121,208,185, 40,168, 4,243,222,154,201,114,118,184,188,
-103,203, 18,155, 19,143, 41,196,198, 70,225,204,254,239,115,244, 58, 93, 23, 68, 30, 9,170,138,244,112, 62,191, 31,191,122, 76,
-239, 79,219, 38,192, 72, 25, 49, 60, 44,252,131,148, 36,244, 75,188, 81,126,207,176,162,164,166,166, 30, 91,191,126, 61,181,122,
-245,234,246,106,181,250,127, 0,138,134, 40,235,213,170, 85,235,227, 29, 59,118,216,197,198,198,242,110,220,184,161,184,124,249,
- 50, 1,112,162,130,136,203,236,174,159, 76,226, 52,174, 81,109,106, 72, 84,124, 95, 0,103,139, 44, 14,232,221,196,255,230,206,
- 21, 11,229,250,155, 71,144,151, 24,139,121, 55,227,114, 0,152,125,188,245,122, 61,178,179,179,161,207, 75, 55, 52,117, 85,100,
- 47, 30,228,164, 73,206, 84,115,121,140,210,224,107,149,162,185,156,254,154, 35,145, 72, 44, 58,150, 91, 86,124,185, 23,192,222,
- 65,131, 6,237,121,116,251, 84, 83, 87, 87,215, 83,190,190,190, 20, 0,148,209,195,176, 44,150, 2,152,209,170, 85, 43, 42, 48,
- 48,240,238,134, 13, 27,206,151,103, 86, 42, 19,209,170, 8,115, 53, 25,134,161,203, 56,190, 84,101, 53,139, 70,180, 42, 50, 90,
-239, 50,162, 85,154,105, 41,106, 18,139, 26,161,127, 66,175,195,242,204,148, 37,229, 51,181,147,227,243,249, 8, 13, 13, 69,245,
-234,213,161,211,233, 32,151,203, 33,151,203, 33,147,201,144,155,155, 11, 30,143, 7, 11,247,153, 17,137, 68, 49, 79,159, 62,245,
-118,116,116,132,209,104, 44,102,182, 94,188,120, 1,169, 84, 26,111,105, 68,203,213,213,245, 92, 65,175,195, 98,184,184,184, 88,
-191,141,227, 90, 52,146, 53,112,224, 64,182,138,144,165,220,104, 86, 25, 81,173,212, 18,145, 40,109,145,255, 83,145,159,195,173,
-119,193,223, 40,229,111,109, 41,243,210, 87,172, 88,113,185, 72,251,174,212, 42,238,130, 41,197, 67,177, 30, 46,220,138, 34, 89,
- 78,118,182,151,127,250,126,177,213,161, 96, 32, 62, 54, 18, 87,143,110,202, 54, 24,117,157,192,144,196,219, 23,143, 30, 1, 5,
- 37, 94, 31,185,106,222, 35, 2,141, 27,251,121,226,247, 39,122,164,198,189, 0, 33,204, 46,164,236, 85, 86,249,236,212,234,223,
-208,201,206,225,242,174, 77,139,173,127, 11,165, 16, 23, 27,137, 11,135, 54,229, 24,244,202,206,136, 60, 26, 92, 89,217,177,128,
- 45, 71, 42,218, 58,160, 67,227,193,158,181,220,193, 16, 61, 24, 62, 65,255,217, 14,220,231, 33,202,223,175,139,178, 15, 49,121,
-204,103,241,119,204,107, 64,151,151,151,247, 59,128, 32, 20, 79,175,208,160, 78,157, 58,131,183,110,221,234, 24, 23, 23, 39, 10,
- 9, 9, 81,109,223,190, 61,133, 97,152,223, 0,152, 83,149,250, 69, 72, 84,252, 79, 40,158, 47,167,193,151,159, 12,187, 61,108,
-204,167,162,200,139,123, 97, 27, 25,134, 89, 55, 19,140,207, 51,181, 67, 11,162,107,165,226,224,224, 64,210,210,210,162,179,178,
-178,188,165, 82, 41,210,211,211,145,145,145,129,236,236,108,104,114, 50, 12,246,198, 44, 5,101,200, 0,143,199, 67, 74,172, 30,
- 70,163, 49,201,220,104, 22, 0,219,165, 75,151,142, 99, 24,198,148, 17,177, 88,239,194, 34,235,153,174, 7,239, 65,131, 6,237,
- 41,210,235, 48,187,168, 22,242,211, 59, 80, 5,233, 29, 90,156, 61,123, 54,188, 71,143, 30,113,165,153, 21,161, 80,104,113, 67,
-233,178,122, 49, 86, 70,179,172,136, 86,201,249,150,104,154,170, 47, 77,141,224, 75,206, 55,193,225,112,192, 48, 12,204,232, 84,
-241,151,154,150,162,189, 3, 43, 99,114, 74,156,155,114, 19,135, 86,178, 39,226, 91,141,104,153,206, 5,159,207,199,241,227,199,
- 49,102,204, 24, 24,141, 70, 72, 36, 18,200,100, 50, 72,165, 82, 28, 61,122, 20,166,244, 15,150,248, 87,189, 94,255,235,138, 21,
- 43,190,218,182,109,155,152, 16, 2,129, 64, 80,104,180, 22, 47, 94,172,210,233,116,191,154,101,180, 76, 25,223, 25,242, 84, 42,
- 53,148,219,235,176,180,109,202,104,175,101,179,116,233,210, 81, 12,195,244, 67,137, 20, 14, 37,214, 43,150,250,129, 77,239,192,
- 98,198,243,228,254, 63,184,120, 38,131, 69, 21,137,100, 21, 26, 46,186, 60,243,226,104,107,115,249,199,239, 23, 91,237,187, 79,
- 33,242,245,107, 92,249,223,198,124,147,245,234,208, 3, 68, 31, 73, 70,228,145, 54,120,125,164,187,217,111, 79, 20,213,216,205,
-201, 6, 25, 10, 6, 57,105, 49, 0, 65,200,219, 48, 89,142,182,142,151,127,222,180,216,250,240, 3, 26,145,145,145,184,112,104,
- 99,182,193,160,238, 84, 21,147, 53,156,207,239, 87,167,174,123,196,252,113,253, 6, 7,214,118,129,125, 76, 56, 78,140, 30,140,
-111, 14,124, 4,185, 35, 7,205,123,202, 49,118,185,203, 96,215, 0,225, 75,215, 54,232,103,129,116, 81,147,213,216,203,203,107,
-240,157, 59,119, 28,234,215,175, 47,122,246,236,153,122,251,246,237, 41, 42,149,234, 60,128, 80, 11, 52,139,154,172,198,115,199,
-143,190,253,221,143,123, 68, 52, 95,128, 85,191,158,192,180,107,113,198, 83,209, 57,131, 80,188, 90,177, 84, 52, 26,205,197, 77,
-155, 54,105,104,154, 70, 70, 70, 6,210,210,210,144,146,146, 82,248,153,149,149, 5, 14,135,131, 75,151, 46,105,115,114,114,238,
-152, 91,192, 91,183,110,121,197,199,199,251, 38, 38, 38, 54, 45,152,158, 33,191,119,161,172,200,188,166,137,137,137,237, 1,220,
- 55,205,143,139,139,171,113,247,238, 93,215,138,244,229,114, 57,248,124,126,177,136,150, 80, 40,132,179,179, 51, 12, 6, 3, 14,
- 30, 60, 8, 0, 25,229,105,240,249,130, 68,154,166,192, 16, 70, 35, 18,137, 24, 87, 87,215, 82, 13,150, 37,154, 5,196,125,240,
-193, 7,234,224,224,224, 82, 35, 90,149,209, 36,132, 40,187,117,235,134,132,132, 4,136, 68,162,194, 31,107,147,161,162,105, 26,
- 66,161, 16, 73, 73, 73,152, 48, 97, 2, 8, 33,202,191,251,201, 83,180, 77, 83,129, 25,162, 0, 80, 5, 70,232,141,118, 90,230,
-182,129, 50, 85, 13, 18, 66, 96, 50, 92, 37,150, 23,126,151, 57,217,219, 75,180,233, 26,159,149,149,245, 93,126,113,200,246, 18,
-159, 59, 44,248, 81, 40, 52, 90, 97, 97, 97,216,179,103, 15,178,178,178, 32, 16, 8,144,153,153,137,157, 59,119,226,233,211,167,
- 16, 8, 4, 48, 29, 11,115,253, 91, 96, 96,224,119,215,175, 95,127, 58,116,232, 80, 85,104,104, 40, 84, 42, 21, 66, 67, 67,209,
-189,123,119,245,205,155, 55, 35, 84, 42,213, 82,152, 83,117,104,202,248, 94, 48,188,142, 70,163, 65, 72, 72, 72,169, 83, 89,219,
-148, 36, 34, 34,194,211,104, 52,122, 19, 66,218, 18, 66,172, 80,144,194,161,224,255,162,211, 7, 5,203,172, 8, 33,109,141, 70,
- 99,157,136,136, 8, 79,214, 78,176,188,167, 92, 45, 98,182, 72, 17,147,117,181,252,136, 22, 67,111,250,105,227, 18,171, 95,239,
-209,136,141,142, 64,208,233,173,217, 70, 70,223,201,194,225,112,186,160, 72,174, 13,145, 88, 90,143,161,242,187, 51,231,164,197,
- 2,132, 83, 25,163, 85, 76, 19, 12,189,105,231,198,197,214,251,131, 40, 36,196,190,194,205, 99, 91,178, 13, 6, 77,103,188, 62,
- 18, 82, 25,205,225,124,254, 2, 30,135,154,223,173,117, 35,126,155, 70,117, 33, 77,137, 66, 82, 92, 2, 14,134,165,102, 68,100,
-106, 62,189, 73,233, 16,253, 74,243, 83,207,113,118,118,182, 46, 60,244,158,104,111,119,231, 68,206,239, 20, 79,161, 35, 58,178,
- 34,241,102,225,176, 20,197,203,249, 38, 46,114,185,124,104, 80, 80,144,149, 72, 36, 18, 7, 5, 5, 49,219,183,111, 79, 87,169,
- 84,167, 1,220, 54,107,223,223,196,189, 89,221, 90, 87,191,221,242,163, 40, 79,161,132, 66,171,131,208,217,213,248,219,237,199,
- 3, 80,118, 2,204, 98,154, 66,161,112,255,254,253,251,123,182,107,215,206,179, 94,189,122,116, 70, 70, 6,242,242,242, 10, 27,
- 87, 59, 58, 58, 34, 44, 44,140,137,140,140, 76, 16, 10,133, 7,204, 45,103,171, 86,173, 34,105,154,126, 86, 80,141,246, 12, 37,
-122, 23, 22, 89,213, 59, 49, 49,177,153,171,171,235, 85, 0,146, 34,189, 14,139,106,154,210, 59,124, 5,128,166, 40,234,126,104,
-104,104, 94,143, 30, 61, 32, 22,139,161, 80, 40,224,225,225, 1,131,193,128,211,167, 79, 35, 56, 56, 88,193, 48,204,213, 82,204,
-107,177,114,170,213, 42, 15, 0,180, 74,169,108, 56,106,212,168,246, 51,103,206, 44,214, 37,221,201,201, 9,118,118,118, 22,105,
- 2, 64, 70, 70,134,223,217,179,103, 63, 15, 13, 13,253,162,103,207,158,214, 95,125,245,149,208,203,203, 11, 70,163,145,174,172,
-102,102,102,166,117, 72, 72,200,154, 54,109,218, 76,238,209,163, 7,247,219,111,191,133,181,181, 53,140, 70, 35,196, 98, 49,114,
-114,114,176,116,233, 82,220,184,113,195, 64, 8,217,146,157,157, 61,203,194,107, 9, 85,189, 55,203,138, 0,149,149,146,161,140,
-245,255,242,114,150,104,211,133,130, 20, 14,115,202,200, 96, 15,115,175,121,147,209,226,112, 56,136,138,138,194,246,237,219,223,
-200,163,101, 74,255, 80,134,118,105,251, 78,174, 92,185, 98,164, 40,170,101, 80, 80,208,156,145, 35, 71,126,170, 80, 40,220,165,
- 82,105,130, 94,175,223,173, 82,169,150, 35,191, 61, 42,223,146,103,136, 66,161,136, 46,173,215, 97,201,117, 0,155,114, 53, 75,
-164,119, 40,150,194,161,196, 54,197, 82, 63,148,146,222,225, 47, 63,239,172,230, 63, 82,243,125, 55, 91,101, 39, 44,125,131,198,
-227,121, 60,149,190,254,245, 8,170, 42, 38,235,205,104,137, 90, 25,177,112,127, 76, 35,173, 70, 13, 69,118,242,115, 68, 29, 76,
-169,210,110, 21,148,243, 90, 4,133,168,200, 87,184,119,114, 75,126, 57, 95, 31,169,116, 57, 41, 96,222, 15,103,142,240, 41,107,
- 59, 60,252,124, 12, 18,178, 20, 56,243, 58,243, 16, 81,106, 62,251, 21,200,196, 13,128, 54,104,174,239,252, 58,105,107,219,254,
-214,131, 29,170,241,176,238,203,221, 16,205,181,231, 55,239,220,206,146, 49, 16,147, 68, 34,209,245,239,191,255,190, 75,219,182,
-109,133,131, 6, 13, 42,173,129,188,165,196,221,127,241,234,135, 83,219,214,126,105, 95,191, 5, 54, 47,152,109,220,127,251,113,
-201, 94,136,229,226,235,235,107,188,117,235,214,204, 9, 19, 38,172,235,210,165,139, 91,223,190,125, 5, 30, 30, 30, 16, 10,133,
-120,245,234, 21,174, 95,191,174,125,253,250,117,130, 82,169,156,217,160, 65, 3, 75,114,156,101, 46, 92,184,240,187,130,239,160,
- 10,170, 11,155,162,160,119,161,105,165,130,164,165, 77, 1, 72, 22, 47, 94, 60, 18, 0,202,232,246,189, 16,192, 54, 0, 92, 66,
- 72,210,222,189,123, 91, 30, 59,118,172,229,140, 25, 51,248, 61,123,246,196,157, 59,119,112,225,194, 5,157, 78,167,187, 93, 96,
- 92,205, 29, 42,135, 1, 16, 98, 48, 24, 30,175, 90,181,170, 37,135,195, 89,104, 90,240,244,233, 83,236,218,181,171, 50,154, 6,
- 0,107,146,147,147,127,216,187,119,239,194,139, 23, 47,126, 50,106,212, 40, 43,189, 94,143,176,176, 48,252,252,243,207,149,210,
-204,206,206,254,220,193,193, 97,254,233,211,167,119,159, 63,127,254,195, 17, 35, 70,208,211,166, 77,195,166, 77,155,240,191,255,
-253,143, 49, 26,141,199,120, 60,222,168,180,180, 52,197,187,120,234, 20, 84,195, 37, 88, 56,214, 97,133,186, 85,169, 26, 52,147,
-196,170, 10,152,246,163, 67,135, 14,133, 81, 70, 83, 20,174,232, 58, 20, 69, 89, 92,117, 8,192,134, 16,194, 0,216,130,252,241,
- 69,139,102,133,231,224,207,204,241,230, 42,250, 39,106,108,158, 66,131,176,242, 7,149,182, 1, 8,252, 43, 80,203, 90,184,112,
-225,250, 69,139, 22,173, 47,153,194,161,232, 74, 37, 83, 63, 44, 89,178, 4,108,122, 7,150,127, 43,165, 27,173,144, 29,122,125,
-205, 1, 95,125,255,237,236, 69, 6,189, 54,155, 64, 55, 16,175,142,134, 86,245,203, 8, 67,230, 94,218,183,120, 19, 8, 50,137,
-209, 48,167,202,165,255,139,202, 73, 89,219, 33,119,233, 36,252,239, 73, 2, 73, 82,232, 63,250, 85,167, 43, 22, 13,202,111,147,
-197, 12,185,172,206, 60,104,235,198,251,237,243, 78,246,212,169,140,145, 22,127, 79, 74, 74,202,241,245,235,215,211,107,215,174,
-109,175, 84, 42, 75, 54,144,175, 44,179,251, 76,157,203,105, 94,199,115,234,189,151,209,253, 96, 70,117, 97, 73, 90,181,106,149,
- 24, 30, 30, 62,236,252,249,243, 67,175, 93,187,214, 69,161, 80,120, 82, 20, 5,137, 68, 18,173,209,104, 46, 10,133,194,253, 22,
-154, 44, 0,192,162, 69,139,200,146, 37, 75,168,240,240,112,194,225,112,254, 0, 16,201,225,112,162,138, 54,130, 47, 58,223,180,
-205,226,197,139,205,249, 65,188,150,151,151, 23,188,116,233,210,118, 75,151, 46,109, 88, 16, 21,186,134, 63,219,124, 89,138, 30,
-192, 53, 62, 95,144, 64, 81,148, 59, 95, 32, 84,220,186,117,235, 98, 21, 53,149, 58,157,110, 78,108,108,236,186,117,235,214, 45,
-151, 74,165,205,158, 62,125,250, 71, 85, 52, 11, 76,212, 0, 59, 59, 59,183, 61,123,246, 28,222,185,115,103, 11, 46,151,123,135,
-162,168, 65,217,217,217,239,116, 80,233,130, 1,162,151, 88, 48,214,161, 89,186,111, 59, 73,233, 95, 97,220,140, 70, 99,222,252,
-249,243, 83, 74, 26,175,146,209, 43,211,255, 5,169, 92,204, 57,166,150,244,162,172,192,184, 80,121, 0,144, 63,118, 97,254,176,
- 58,230, 14, 42, 13, 64, 85,209,125, 78,211,244, 49, 0,207,105,154,126, 89,178,163, 75,209,101, 75,150, 44,169,232, 62,103, 97,
-121,175, 49,227,201,182,152, 6, 22, 87,182, 37,237,223, 24,174,124, 59,229, 28,198,231, 47,161,129, 47, 1, 80, 4, 88,247,171,
- 78,247,117,121, 27,186,180,194,114, 66, 97, 70,193,193,252, 54,233, 38,150, 85, 98,223,171,193,140,241, 7, 45,212,244, 65,249,
- 3,202,190,161, 57,112,224, 64, 78, 25, 63,230,197, 6,149, 46,139, 35, 71, 10,179,248,151, 85,206,162,215,155,252,238,221,187,
-110,129,129,129,137, 40,222,232,191,180,249,196,194,125,231, 0, 48,190,229,227,249, 94,104,214,170, 85, 75,240,234,213, 43,237,
- 63,235,222,100, 53,255,145,154, 54,126,213, 65, 97, 28,138,230, 14, 42, 55,162, 85,196,160, 17,242, 51,178,194, 98,203, 40,167,
-233, 62,183,137,136,136,240,172, 93,187,118, 52,128,172, 18,229, 40,109, 25, 97,207,209,127, 94,179, 52,198,163,248, 80,116,239,
- 21,165,245, 14,199, 95,112, 34, 88, 77, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53, 43,107,180,222, 91, 8, 33,160,193,194,
-194,194,194,194,194,194,194,242,151, 64,149,227, 74, 45, 9, 9, 86,198,217, 94,100, 53, 89, 77, 86,147,213,100, 53, 89, 77, 86,
-243, 63,167, 89,145,118,209,237,223,215,170,195,241, 0,118,176, 85,135,172, 38,171,201,106,178,154,172, 38,171,201,106,254, 83,
- 52,203, 50, 44,239, 45,132, 16, 51,199, 58,100, 97, 97, 97, 97, 97, 97,249, 71,208,165, 46, 92,185, 70,208,103, 95,153,213,137,
-170, 66,122,212, 66, 53, 0,120, 91,122,255, 81, 92, 1,244, 42,242,255, 41, 20,244,140,103,141,214,251, 75, 29, 0, 95, 1,176,
- 46, 50,239, 30,128, 21, 37,214,219, 7,160,232,128,132, 10,228,143, 19,248,210,146, 47,163,105,122, 69,187,118,237, 62,187,113,
-227,198, 90,131,193,176,180, 18,229,245,116,117,117,253,142,162,168, 38, 0,120, 20, 69,189, 74, 78, 78, 94, 97, 48, 24,170,210,
-107,165,166,139,139,203, 74, 0,141,104,154,230, 81, 20, 21,145,156,156,188,204, 96, 48, 92,169,130,166,220,217,217,185, 53, 33,
-196, 5, 0,135,199,227,165,199,199,199,223, 69, 37,115, 43, 13, 92, 28,198,207, 81, 24,120, 0, 96, 37,229,234,143, 44,246,211,
-153, 59,143,189,196, 89, 88,254,219,144,252,158,201,197,232, 94, 11,203,137, 1,179,140, 0,213,205, 11, 27,207, 69, 98, 86, 89,
-219, 83,165,244,106, 46,169,217,189, 22,150, 27, 73,190, 70,183, 90, 88,115,238, 21,202,237,105,111,142,166,137, 29, 0, 61,222,
-140, 81, 10, 40,243,122, 95,255,211,233,133,226, 85,156,133, 85,158,229, 26,173, 33,117,225,106,228,130,123, 36, 12,166,110,188,
-114, 0, 13, 11,126,228, 95, 34, 63, 87, 81,110, 21, 11,247,190,104,254,211, 88, 72, 8, 25, 86,236, 98, 45, 37, 15, 81,167, 78,
-157,250,158, 63,127, 94, 98, 26,239,142, 97, 24,136,197, 98, 3,128,209, 22,124,151,211,144, 33, 67,230,254,244,211, 79, 24, 60,
-120,240,252,147, 39, 79,174, 7,144,103,238,198,182,182,182, 3,109,108,108, 54,253,248,227,143,142, 45, 90,180,164, 4, 2, 1,
- 94,189,138,112,159, 48, 97, 66,189,240,240,240, 99, 41, 41, 41,159, 90,186,243,118,118,118,195,109,108,108,214,109,223,190,221,
-161, 77,155, 54,160, 40, 10,193,193,193,238,159,127,254,121,195,152,152,152, 3,201,201,201,147, 45,213,180,183,183,175,107,109,
-109,221,113,243,230,205,226,214,173, 91, 67, 36, 18, 33, 52, 52, 84, 54,113,226, 68,151,248,248,248,176,228,228,228,171,150,154,
-172, 71,193, 39, 62, 52,232, 52,171, 0,128,203, 23,206,110,177,238,246,137, 71,151, 79,244,169,104,222,192,197, 97,191,179,102,
-139,133,133,165, 40,195,221,224, 66, 8,190, 60,255,243, 2, 26, 0,186,125,242,205,180,225,110, 88,251,107, 66,217, 99,216, 90,
-168, 55,107, 84, 53,108,218, 19,143,228,170,148,115, 7, 64,127,206,229, 78,107, 30, 24,232, 48,229,230,205, 8, 29,176,251, 63,
-114,138, 74,173,230, 44,211,104, 13,240,195, 82, 67,126,196,132,234, 81, 27, 7, 46, 68,114,174,119,234,212,169,246,216,177, 99,
-169,198,141, 27, 35, 56, 56,184,238,129, 3, 7,122,157, 58,117, 42,194,104, 52, 6, 3,120, 2,243,179, 90,243, 0, 4,112, 56,
-156, 38,255,112,205,127, 50,210, 2,115,149,140, 63, 19,157,190,145,240,244,210,165, 75,199,185, 92,174, 41,162,213, 92,161, 80,
- 56,151,136,130,153, 67, 13,189, 94,143,103,207,158,129,166,105, 30, 0, 47,188, 57,164, 70, 89,184, 75, 36,146,173,183,239, 5,
-219, 83, 92, 49, 50,213, 0,212, 58, 8,100,206,248,105,215, 94,187,153,211, 39, 15,184,114,229,202,245,220,220,220, 95, 44, 40,
-143,151, 84, 42, 93,255,240,225, 67,123,137, 68, 2,134, 97,144,155,155, 11, 23, 23, 23,252,248,227,143, 54, 51,103,206, 28,150,
-147,147,115, 69,173, 86,255,207, 18,115,110,109,109,221,241,241,227,199, 98,211,128,210, 90,173, 22,238,238,238,216,183,111,159,
-112,218,180,105,126, 89, 89, 89,113, 90,173,246,181,185,130, 57, 10, 3,207,160,211,172,218,179,101,113,117, 0, 24, 53,121,241,
- 42, 65,174,213,105,115,230,229, 40, 12,167, 0,176, 70,139,229,239,166,137,131,131,195,145,180,180,180,171, 0, 62,197,219,137,
- 52,212, 21,137, 68, 13, 24,134,113,161,105, 26, 28, 14, 39, 73,161, 80, 60, 4,240,162,178,130,246,181, 58,244,129, 80, 50, 6,
-132,105, 72, 3,160,104, 58,212,168, 83,238, 74,127,113,229, 68,149, 52, 5,226, 79, 0,210,144, 6, 24,138,166, 31, 50, 6,229,
-143,105,207,174,156,249,167,156,156, 59,217,240,174,229, 98,254,192,152,111, 67,239,227,154,112,165, 25,208,251,162,204,175, 86,
-156, 10,244,156, 62,125,186,203,228,207, 62,163,198,140, 30, 93,231,234,141, 27, 84,123, 75, 70, 43,120, 63, 41,179,193,126,169,
- 70,107,160, 31,108, 9, 48,231,192,166,175,104, 46,135, 67, 13,157,190, 98,216,206, 45,107,232,174,125, 6, 21, 86,159,180,109,
-219, 22,109,219,182,165, 86,173, 90, 85,231,143, 63,254,168,179,111,223, 62,195,237,219,183, 31, 2, 56, 88,214,151,117,175, 5,
- 21, 3,136,248, 60,174, 98,232,130, 95,182, 7, 6, 6, 66, 40, 20,162, 42,154, 0,208,181, 54,253,154,103, 87,243,225,208,169,
- 11,163, 91,180,104, 69,222,134,230,123,196, 61,160,112, 80,107,219,234,213,171,183, 54, 24, 12, 34, 0,224,114,185,234,216,216,
-216,169,200, 31, 27, 16, 0,142, 49, 12,211,215, 2,109, 26,192,162,190,125,251,206,159, 50,101, 10, 60, 60, 60, 48,109,218, 52,
-232,245,250,224, 51,103,206, 44, 4,176, 18, 21,220, 60, 78, 78, 78, 11,183,110,221,106,199, 21, 72,209,120, 78, 36, 18,179, 12,
- 0, 0,153, 16, 56, 62,137, 96,218,180,105, 86, 65, 65, 65,203, 44, 49, 90, 78, 78, 78, 75,127,252,241, 71, 59,137, 68, 2, 66,
- 72,225, 88,140,121,121,121,200,203,203,195,228,201,147,173,194,194,194,190,179,196,104, 57, 59, 59,183,222,188,121,179, 88, 36,
- 18, 33, 47, 47,143,175,211,233,168,220,220, 92, 40,149, 74,162,213,106,117, 83,167, 78, 21, 62,121,242,164, 67, 98, 98,226,107,
-176,252, 83,224, 0,248,136,199,227,245,175, 93,187,118,211,151, 47, 95, 62, 48, 24, 12, 71, 1, 28,125, 11, 47, 83,157,221,220,
-220,150, 39, 36, 36,108, 6,176,247,191,114, 64,157,157,157,143,222,186,117,171,250,214,173, 91, 71,175, 93,187,246, 52,128,255,
- 85, 65,142,207,231,243, 7,180,111,223,190,250,168, 81,163, 4,206,206,206,208,104, 52,136,140,140,180, 58,116,232,144,103,104,
-104,104, 92,193,136, 24,102,191, 80,216,215,109, 37, 3,215,234, 64,203, 86,173,219, 12, 30,240,145,220,217,222, 26, 42,173, 17,
- 47,163, 19, 61,206,158, 62,222, 62,156, 47,190,165,211,101,127,156,254,226, 86,158,165,154, 29, 59,118,110,211,165,115,103,185,
-181,141, 53,178, 21, 58,188,138,138,247,188,124,225, 68, 91, 46, 87,124,141,161,244, 35, 82, 30, 95, 80,190,203,115, 51, 13,224,
- 42, 68,246, 13, 26,182,106, 28,212,109,236,178,166,132, 16,208, 4, 27, 75, 70,179,166, 1,220,141,249,195,126, 89,164, 7, 66,
- 8, 69, 97, 77,209,104, 86,247, 90, 88, 78, 8,102,129, 6,213,189,130,106, 74, 19,221, 0,161,141,157, 93,224,196,241,227,169,
-220,156, 28,132,134,134, 42, 75,154,172,245,213,192,191, 70,163,198,177,216,202,155,237,127,104, 52,171,212,170, 67,179,243,104,
- 73, 36,146, 82,231, 91, 91, 91,163, 99,199,142, 88,177, 98, 5, 23, 64,147, 18,139,139, 15,178, 10, 8, 79,110,155, 7,107,169,
-144,246,240,240,144, 91, 89, 89, 85, 89, 19, 0, 64, 24,175, 86, 30,228,131,251,191,124, 53,250,226,190,117, 1,138,220, 44, 94,
-201, 85,100, 50, 25,188,189,189, 49,127,254,124,243, 52,171,206,223,170,233,226,226,226,211,182,109,219, 38,151,174, 94,181, 73,
- 72, 72, 16, 38, 36, 36, 8,207, 95,186,100,211,178,101,203, 38, 46, 46, 46, 62,133,135,234,205,174,166,229,149,243,155, 45, 91,
-182, 44, 60,118,236, 24,221,182,109, 91,216,218,218,162, 99,199,142, 56,125,250, 52,119,237,218,181,223, 2,152, 95, 81, 57,105,
-154,110,211,182,109, 91, 10,132, 32, 41,219,128,187, 43,124, 16,186,198, 23,185,106,130,140,236, 28,168, 84,106, 72, 36, 18, 17,
-242,171,123,205,221,247, 86, 45, 91,182,164, 0, 20,154,171,220,220,252, 41, 47, 79, 1,173, 86, 7,161, 80, 40, 7, 32, 50, 87,
-147, 16,226,210,186,117,107, 0,128, 78,167, 43,124,195,203,202,202,162,178,179,179,161,213,106,193,227,241,248,168,184, 93, 99,
-161,166,149,148,171,231,242,133,179, 71, 77, 94, 28, 59,106,242,226, 88, 46, 95, 56, 91, 43,207, 49,154, 51,207, 74,202,213,191,
-227,235,211,145,166,233,159,107,213,170, 21, 70,211,244, 30, 0, 46, 85,212,108, 6,224, 91,177, 88,124,209,215,215, 55, 86, 34,
-145, 92, 42, 48,234, 45, 43,169, 41,144, 72, 36,151,190,253,246,219,195, 15, 30, 60, 24,252,199, 31,127,120, 61,122,244,104,192,
-170, 85,171, 14,200,100,178,235, 40,222, 46,209,226,123,211,203,203,107,231,221,187,119,155,181,106,213,234, 39, 0,194,183,116,
-191,115, 0, 52,130, 89, 35,114,188,147,243,238,214,184,113,227,234, 34,145, 8, 93,186,116, 1,128, 14, 85,209,228,243,249, 3,
-230,207,159, 95,107,193,130, 5,130,196,196, 68, 92,186,116, 9,247,238,221,131,193, 96,192,164, 73,147,132,163, 70,141,170, 41,
-151,203, 7, 88, 84, 78,174,213,129,233,159,207,232,241,229,180,113,242,135, 49, 58,236,186, 24,131,223,111, 39, 34, 69, 41, 64,
-159, 1,163,172,187,247, 27,210, 93, 32,180, 62, 96,169,230,220, 57,115,122,140,255,100,152,252,105, 34,131,227,119,146,112,231,
- 89, 54, 12, 60, 27,244, 28,240,169,109,195,214, 61,122,113,193,219,253,174,207,209,143, 64,139,233,211,167, 59,206, 94,243,235,
- 77,183,102, 31,109, 76,205, 68,219,162,198,167, 46, 96, 99, 39,149,126,244,172,125,251,113,226,252,241, 98,203,213, 44,166,215,
-164,223,166,148, 76,180, 43,218, 62,171,157, 29,234, 20, 84, 43,114,206,255,188,128, 38, 20,166, 13,119, 43,246, 28, 40,181,156,
- 87,128,193,211,103,204,224, 89,219,218, 98,203,150, 45,208, 40, 20,197,218,204,118,174,142, 30, 23, 37,220,184,154,190,238, 97,
- 29, 61,169,235,255,194,247,149,241,101, 70,180, 78,158, 60, 73,122,247,238, 77, 1,192,145, 48,100, 14,240,195,119, 67,166,124,
- 59,159,162, 41, 82, 35,160,213,211,106,181,252, 21,246,246,246, 80, 42,149,208,104, 52,224,243,249, 80,171,213,136,137,137,193,
-157, 59,119, 96,107,107,107, 81, 73,114,114,114, 32,147,201, 32,147,201,222,138,230,188,209, 93,132,175, 98, 83,133,231,238, 92,
-105,255,253,103,255,107, 81,171, 81,135, 71,157,135, 76,123,108,229,232,166,126,244,232, 17,110,221,186,133,204,204, 76, 4, 6,
- 6,254, 91, 78,230,189,130, 54, 89,247, 0,216,214,174, 93,219,253,220,197,107,182,121,106,198, 42, 42, 89,207, 99, 24, 6, 18,
-137,171,225,224,145,227,217,131, 7,244,161,146,146,146, 82, 0,220, 43, 48,183, 21,141,169, 40, 2,224, 51,112,224,192,185,159,
-125,246, 25, 34, 34, 34, 48,110,220, 56,213,189,123,247,210, 91,181,106,101,255,227,143, 63,138,103,206,156,137,171, 87,175, 46,
- 58,121,242,228,111, 0, 34, 1,148, 58, 86, 27, 33,132,207,231,243, 97, 40,176, 13, 58, 35, 83,232,239,115,114,114, 64, 84,153,
-224,243,249, 28, 0,142, 48,179, 29, 29,195, 48,124, 30,143, 87,104,178, 98,146,115, 16,147,162, 68, 78,158, 22, 42,149, 1, 90,
- 21, 1, 71, 98,207, 5,162,156, 1, 68,153, 27, 29, 17,137, 68, 48, 24, 12,200,205,205, 47,134, 41, 82,166,213,106,145,157,157,
- 13, 14,135, 35, 3, 96, 5, 32,195, 28,193,130, 70,238,191, 23, 84, 3,226,254,175,125, 29, 94,158,154, 87,108,158,149,148,171,
- 63, 50,211,143, 99,239,222,240, 70,163,193,187,125, 11,231,189,219,246, 89, 66, 71, 71,199,203,135, 15, 31,246,171, 83,167, 14,
- 34, 35, 35,125, 7, 13, 26, 20,152,152,152,216, 8,150,143,201, 40,161,105,250,187, 81,163, 70,125, 54,116,232, 80,170,110,221,
-186,224,114,185, 48, 24, 12,238, 17, 17, 17, 29, 15, 29, 58, 52,103,231,206,157, 63, 26,141,198, 47, 96,126,187, 63, 90, 32, 16,
- 28,220,190,125,123,187,192,192, 64,236,217,179, 7,247,238,221, 99,154, 53,107, 70,143, 28, 57, 18,158,158,158,129, 35, 71,142,
-252, 93,163,209,244,172,100,100,203,179,101,203,150,213, 57, 28, 14, 90,181,106,197,191,117,235, 86, 99, 0,183,170,120, 76,101,
-238,238,238, 87, 59,116,232,208,232,226,197,139, 33, 73, 73, 73, 29, 44,216, 95, 0,232,231,230,230,182,202,218,218,218,214,130,
-103,172, 50, 62, 62,126, 22,128, 35,102,110,210,162, 73,147, 38,136,142,142,134,143,143, 15,248,124,126, 75,157, 78, 55, 1, 64,
- 15, 0, 95, 3, 8,179,160,188,117, 59,119,238, 92,189, 67,135, 14,212,145, 35, 71, 10,219,135,210, 52, 13,131,193, 0, 62,159,
-143, 22, 45, 90,208,193,193,193,213,238,223,191, 95, 23,102, 84, 35,218,215,234,208,167, 85,155,246,109,218, 5, 54,160,215, 30,
-121, 9, 35, 99, 4,135, 50,128, 75, 49, 96,244, 66, 8,249, 28,212, 13,104,202,121,246,228, 97,160, 86,163,235,147,254,226,226,
- 9,115, 52,123,116,235,218,214,207,167, 46,253,253,239,175,144, 21, 31,102,140, 15,191,150, 70,115,104,248, 53,233,228, 80,215,
-191, 17,167, 81, 96, 7, 94, 66,228,147,142,106,117,187, 46,153, 17,215, 46,190,139, 27,114, 9,192,113,175,230,240, 81,239,174,
- 29,248,137, 9, 9,138, 67, 71, 78, 60, 86,234,113, 7, 0,174, 2, 84, 79,160, 65,253,230,205,219,255,184,114,165,189,171,171,
- 43,111,196,208,161,134, 29, 33, 33, 33, 40,163,234,119, 9,192,113,112,113,233, 50,113,226, 68, 78, 98, 66, 2, 57,116,244,212,
- 35,147, 30,242,223, 82,234, 55,112,247,237, 13,197, 51,139,170, 41,251, 0, 2,103, 23, 23,191, 9, 19, 38, 32, 41, 33, 1,123,
-246,238,205, 83, 3,183, 77, 81,172,227, 28,108,246,175,229, 50,102,246,167,125,169,234,174, 14,152,184,104, 71,203,142,186,148,
- 90, 72,252,243,252, 23,245, 34,239,177,201, 26, 95,170,209, 42,201,255,194,176, 80,206,135,215,161, 67,251,233,212, 92,157, 34,
- 34, 34, 2, 14, 14, 14,112,117,117,133,181,181, 53,158, 62,125,138, 75,151, 46,225,249,243,231, 96, 24, 6, 13, 27, 54,180,168,
- 52,105,105,105,120,248,240, 33,108,109,109,223,154,102,173,234,142,152, 82,221,145,159,156,158,195,191,120,239,121,224,142,121,
- 3,252,105,223, 1, 59,139, 14, 18,171,213,106,241, 47,161,176,119, 97,245,234,213, 91,239,218,181,139,175, 49, 64, 94,119,194,
-237,213, 10,181, 81, 10, 0, 82, 17, 71, 17,188,202,251,139,111,190,249, 70,241,201, 39,159,248,198,198,198,174, 48, 35,214,191,
-188,115,231,206, 95, 18, 66,120,211,167, 79, 7, 0,140, 26, 53, 42,231,206,157, 59,117, 1,164, 92,186,116,201,109,236,216,177,
- 47, 46, 95,190, 44,153, 49, 99, 6,199, 96, 48, 60,229,114,185,228,228,201,147, 75, 1, 44,126,227, 23,145,166,131, 66, 66, 66,
-106,184,121,122,195,211,158, 70,219,249,207,243, 31,112, 18, 6,113, 81,175, 16,254,232, 30, 92, 92, 92,172, 93, 93, 93,195,226,
-226,226,116,241,241,241,115, 20, 10,197,214, 10,202, 24, 26, 28, 28,236,234,233,233,137,188,188, 60,196,165, 42, 49,237,168, 4,
- 57,170,252, 32, 6, 15, 42, 52,170,238, 45, 23,211,218,123, 41, 41, 41, 58,173, 86,187, 32, 59, 59,123, 87,121,154, 60, 30, 47,
-253,209,163, 71, 50, 15, 15, 15,168,213,106,146,145,145, 65, 41, 20, 10,228,230,230, 82,167, 78,157,250, 48, 49, 49,177,153,151,
-151, 23,229,238,238,190, 52, 49, 49, 81, 21, 31, 31, 63,206,156,170,201, 2,195,100,228,114,185,107,199,143, 31, 63,248,183,223,
-126, 11, 58,178,216,175, 95,145,234, 18,235,128,128,128,115, 13, 26,248,187,237, 93, 83,127, 35,128,213,255,128,107,107,204, 87,
- 95,125,229,103,103,103,135,137, 19, 39, 98,201,146, 37, 88,184,112, 97,157,137, 19, 39,142, 7,176,222, 2, 29,177,139,139,203,
-253,239,191,255,222,183,117,235,214, 56,125,250, 52,246,239,223,143,215,175, 95, 27,188,188,188,184,129,129,129, 88,180,104, 17,
-186,119,239, 62,110,234,212,169,237, 19, 18, 18, 26,155,105, 62, 62, 89,180,104, 81,191, 54,109,218, 96,244,232,209,154, 43, 87,
-174, 12, 6,112,254,194,133, 11,157,174, 94,189,122,228,215, 95,127, 21,127,251,237,183, 93,102,206,156, 57, 17,192,166, 74,236,
-255,135,237,218,229,143,161,220,166, 77, 27,172, 90,181,170,123, 21,141,150,192,222,222,254,212,158, 61,123, 26,121,123,123, 99,
-196,136, 17,141, 7, 15, 30,124, 42, 51, 51,179, 43, 0,179, 30, 72,213,170, 85,251,238,216,177, 99,181,203,170, 89, 40, 13,141,
- 70, 99,247,209, 71, 31,173,140,138,138,178,200,104,237,219,183, 15,179,102,205, 66,195,134, 13, 27,180,104,209, 98,219,132, 9,
- 19, 48,112,224,192,206, 79,159, 62,117, 70,126,175,229, 10, 17,137, 68, 13, 62,254,248, 99,193,221,187,119, 1, 0, 1, 1, 1,
-104,212,168, 17,162,163,163, 17, 20, 20, 4,141, 70, 3,103,103,103,244,239,223, 95, 20, 21, 21,213, 32, 45, 45,173, 66,163, 69,
- 11, 37, 99,250,245,238, 41, 63,126, 39, 17, 70,198,128,166,181,173, 16,232,235,132,103,113, 57, 8, 14,139,131, 81,203,135,149,
-157, 61, 90,182,239,102,151, 20,255,122, 76, 58, 80,113,123, 45,161,100, 76,255,126,189,100,199,111, 39, 32, 43, 33,156,188,188,
-247,219, 37,189, 90, 49, 14, 0,130,254, 56,176,205,197, 94,220,181,110,147,166,156, 14, 93,251,218, 30,221,159, 52, 38,243,239,
- 25,219,239, 13,174, 86,199,118, 79, 94,218,168,217,195,218, 18,158,173,251, 61,185, 94,191,217,180,172, 59,208,109,206, 87, 95,
-181,248,116,252,120, 17,195, 48,248,245,151, 95,114, 30,134,132, 60, 27, 15, 48, 19,202,208,219, 12,120, 14,238,215, 79, 40,183,
-178,194,231,211,166, 65,174,215, 95, 46, 60, 36, 64,231,207,191,252,178,245,228,201,147,197,219,150,126, 22,212,125,236,178, 38,
- 12, 33,148,169,154,114, 95,249,161,184,102, 99,251,245,131,220,202, 10,211,167, 79, 7,165,211,157, 43, 52, 80, 92, 92,254,228,
-195,182,129,195,250,180, 1, 5, 10,251, 79,222,192,203,232,212, 71,151, 19,241,234,125,117, 85, 37, 40,179,141, 86,185, 85,135,
-185, 58, 36,119,238, 53, 32,177,110,221,186,185,117,234,212,201, 77, 79, 79,199,227,199,143,145,153,153,137, 77,155, 54, 33, 60,
- 60, 28, 12,195, 84,218,192, 48, 12,131,183,173, 9, 0,206,246, 86, 24,209,179, 57, 87,163, 86,136, 82, 83, 83,139, 85, 31,253,
-139,140, 86, 33, 6,131, 65,228,229,229, 5, 26,160,178,149,122, 89,210,190,118, 84,210,190,118, 84,182, 82, 47,211,106,181,180,
- 76, 38,131, 70,163, 17,153, 33,197,251,224,131, 15,190,252,237,183,223,120,203,151, 47, 71,189,122,245,160,211,233,112,231,206,
-157, 56, 0, 41, 5,235, 36, 92,187,118, 45,193,100,132, 87,172, 88,129,163, 71,143, 82, 93,186,116,153, 83,218,245,148,152,152,
-248,221,132, 9, 19, 50,148,185, 25,216, 62, 68,133, 35, 35, 82,241,115,191,215, 24,106,127, 24, 25,201, 49,216,177, 99, 7, 46,
- 92,184, 72,157, 63,127,129,127,229,202, 21,105,175, 94,189, 54, 86,171, 86,237,100,121,133, 76, 72, 72, 88, 62,121,242,228,172,
-220,220, 92,228,230,230, 66,165, 82, 35, 67, 1, 60, 90,231,135, 71,235,252,160,102,196,216,178,121, 43,253,232,209, 35,135,215,
-175, 95,187,245,233,211,103,157,171,171,235,206,242, 52,227,227,227,239, 78,153, 50, 69,157,147,147, 3,173, 86,171, 51, 26,141,
- 90,149, 74,165, 63,112,224,192, 12,123,123,251,150,167, 79,159,230, 93,184,112,145,123,229,202, 85,254,165, 75,151,172, 59,118,
-236,120,208,217,217,121,183, 57,145, 50, 14,135,179, 97,239,222,189, 99,182,108,217,226, 28, 24, 24,232, 95,162, 42,202,181,107,
-215,174, 53,126,249,229,151,106,171, 86,173,154,131,252, 14, 40,239, 20, 7, 7,135,169,253,250,245,195,150, 45, 91,112,226,196,
-137,153, 27, 55,110,196, 7, 31,124, 0, 55, 55,183, 41, 48,191,218, 11, 0, 86,175, 95,191,222,215,215,215, 23,163, 70,141,210,
-142, 27, 55,238,139, 93,187,118,121, 93,191,126,157,191,123,247,238, 26, 19, 39, 78,156, 62,108,216, 48,117,205,154, 53,177,105,
-211,166,218, 52, 77,111, 48,235,254,118,118,158, 49,116,232, 80,172, 89,179, 6, 87,174, 92, 25,128,252, 31, 84, 45,128, 51, 55,
-111,222,236,243,237,183,223, 98,192,128, 1,112,119,119,159, 94,153,200,147,159,159,223,130, 30, 61,122,224,250,245,235,104,220,
-184, 49, 90,182,108, 57, 19,128, 67, 37, 15, 39, 45,147,201, 14,238,218,181,171,109,141, 26, 53,176,108,217, 50,212,170, 85, 11,
- 59,119,238,108, 43,149, 74, 15,194,204,230, 27,214,214,214, 50,137, 68,130, 57,115,230,144, 1, 3, 6,100, 84, 52,205,156, 57,
-147, 8,133, 66,216,218,218, 90,155,107,138, 69, 34, 81,171,122,245,234,225,206,157, 59,184,112,225, 2,230,207,159,143, 25, 51,
-102, 32, 53, 53, 21, 31,127,252,177, 4,192, 64, 11,246,219,201,209,209, 17, 57, 57,249,227,194,215,171, 87, 15, 15, 30, 60, 64,
-106,106, 42,220,221,221,145,148,148, 4,123,123,123,120,123,123,131, 97, 24, 39,243, 36, 73, 61, 7, 59,107,164,100,106,192,133,
- 1, 77,234, 58,224,242,227,116,196,164,106,225,100,111,131,164,148, 84, 84,179, 23,161,122,117, 15, 16,194,212, 51,203, 1,115,
-232, 38, 66,145, 24, 25,185, 58,196,135, 93, 73,215, 25, 53, 19,178, 34,111,198,102, 69,222,140,213,105,212, 19,130,110, 92, 72,
-175,225, 44, 70,245,234,213, 65, 17,166,249,187,184, 31, 7,121,160,186, 84,204, 29,117,225,231, 5,212,201, 31,231, 81,154,244,
-152,102, 61,156,243, 35,203,142,128,215,160,143, 63,110,245,197, 23, 95,136,146,147,147,153, 97, 67,134,100, 44, 95,188,248,226,
-217, 10, 94, 12,242,128, 58, 93,187,118, 5, 13,224,236,249,243,138, 36, 32, 14, 0,156,129,234,125, 63,250,168,221, 87,115,231,
-138,211,210,211,153, 59, 17,121,199,195, 83, 72,127, 59, 35,188,204,105,159,101, 4,234,155,116,207,157, 59, 71, 84, 64, 16, 0,
-116,168,142, 41,221, 90, 7, 4,142,236,215, 14,137, 41,153,152,190,252,103,108, 59,116,245,156,181,158,116,250, 23,253, 20,143,
-175,148,209, 42,168,250,121, 99,158, 82,249,102,237, 65, 85, 13,204, 95,161, 89, 26,255, 70,163,101, 66,175,207,175, 37,209,234,
- 25,104,245,140,233,173, 22, 42,149,202,108,137,115,231,206,237,153, 54,109, 26,214,173, 91,135, 23, 47, 94,128,207,231,163, 94,
-189,122,174, 0,100,166,103,126,147, 38, 77,156,104,154,198,179,103,207,176,118,237, 90,124,242,201, 39,228,214,173, 91, 59, 81,
-122,190,148, 7, 25, 25, 25,155, 39,140,251, 36, 43, 51, 57, 6,122, 85, 38, 82,226, 95, 65,163,200,194,178, 21,223, 65,169,231,
- 34, 41, 91,135,164,108, 29,104,161, 29,182,253,184,139,227,231,231,215,131,195,225,244, 46,167,156,119,146,147,147,127,156, 52,
-105, 82, 86, 82, 82, 82,225,254,105,245, 4, 90,125,241,235, 85, 34,145, 96,195,134, 13,214,117,235,214,237,199,229,114, 59,150,
-163,153, 24, 27, 27, 27, 62,105,210, 36,109,114,114, 50,178,179,179,113,252,248,241, 62, 53,106,212,176, 93,185,122, 29,165,208,
-113,145,148,165, 67, 82,150, 14, 2,153, 19, 14, 30,249,141,227,237,237, 61,140,203,229,182,172,200,100,253,250,235,175, 35,135,
- 12, 25, 34, 95,189,122,117,198,177, 99,199,182, 0, 40,122, 66,158,109,216,176,225,208,193,131, 7,115,191,252,242, 75,187, 85,
-171, 86,205,124,199,102,171,227,144, 33, 67,124, 24,134,193,225,195,135, 31, 1, 88,255,219,111,191,221,215,104, 52,248,248,227,
-143,189, 10,170,145,204,161,217,176, 97,195, 62,107,219,182, 45, 62,255,252,115,221,197,139, 23,155, 0, 88,135,252,170, 92, 2,
- 32, 26,192,198,171, 87,175, 54,156, 58,117,170,166,121,243,230, 24, 61,122,244, 39, 0,218, 86,160,219,106,232,208,161,190, 12,
-195,224,192,129, 3, 15, 1,156, 46,177,252,210,145, 35, 71,238,104,181, 90, 12, 31, 62,188, 38, 0, 75, 30,228,124,161, 80,120,
-248,155,111,190,177,137,143,143,199,200,145, 35, 53,207,158, 61,195,226,197,139,197,214,214,214,167,139,220, 3,102, 35, 20, 10,
-119,252,240,195, 15,253,234,215,175,143, 73,147, 38,105,183,110,221, 58,237,179,207, 62,211, 54,105,210, 4, 91,182,108,233, 39,
- 16, 8, 44, 26, 90, 36, 33, 33, 33, 43, 44, 44,204,190,162, 41, 46, 46,206,220,238,249, 18,153, 76,118, 59, 32, 32, 32,167, 94,
-189,122, 77, 13, 6, 3,158, 62,125,250,106,207,158, 61, 76,189,122,245,176,121,243,102,172, 90,181, 10,189,123,247, 6,135,195,
- 49,219,104,113, 56, 28,232,116, 58, 72, 36, 18,112,185, 92,188,122,245,202,148, 90, 6,124, 62, 31, 0, 32,149, 74, 33, 22,139,
- 65,211,180, 89,189,209, 40, 10, 36, 71,169, 7,143, 71,131, 75, 51, 8,143,206,134, 78,207, 64,196,231,128,199,165, 0,194,192,
- 70,202,131, 72,192, 1, 77, 81,140,153,154,200, 86,232, 32,224,211,224,241, 5, 20,109, 48,138, 11,127, 28,185, 70,177, 88, 44,
-160, 28,172,132, 16,241,255, 65,195, 2, 83,249, 13,203,199, 0, 60,169,135,199,224, 53,107,215, 10,114,242,242, 48, 96,192,128,
-140,168,251,247,247,170,128,251,237, 43,232,164, 68,115,185,117, 59,180,111,143,224,144, 16,228,102,102,190, 4,242, 27,199, 11,
-220,220,134,108,216,176, 65,160, 82,171, 49,160,127,255,172, 23, 55,110,252, 26,155,135,147, 7,162,243,141, 88,133,231,157,207,
-119, 49,233,102,103,102,102, 2,249, 41, 36,156, 29,101, 43, 39, 15,235,142, 92,165, 26,179,191,219,203,132,132, 39, 78,185, 30,
-135, 94,191, 37, 32,251, 95,246, 51, 60,190,196, 4,192,140,132,165,166,232, 82, 69,102, 69,163,209,188,117, 3, 84, 85,205,210,
- 76, 98, 85, 53,255,137,112,185, 92,245,243,231,207, 5, 86,246,110,140,189,156,151, 89,227,147, 27,214, 0, 96, 39,227,102,235,
-140,122, 38, 33, 33, 1, 66,161, 80,109,102,117,195,184, 29, 59,118, 44, 3,224,207,229,114, 79,238,218,181,139,218,187,119,175,
-237,208,161, 67, 35,194,194,194,226, 3, 2, 2, 60,119,237,218,101, 5, 0, 27, 55,110, 36, 7, 15, 30,236,142,252,148, 25,101,
-230,113, 73, 78, 78, 94,156,158,158,126,107,242,228,201,155, 4, 2,129,173, 84, 42,181,191,126,253, 58,165,214, 17, 52,251, 42,
-186,176, 39,162,149,152,198,181,121, 86, 24, 63,126, 60, 39, 44, 44,108, 69,124,124,252,201,114, 52,231,100,101,101, 93,127,241,
-226,197, 58,107,247, 70,142, 82,207,175,172, 3,231, 61, 3, 0,120, 58,240, 64, 23, 60, 23,179,178,178,144,154,154,138,207, 62,
-251,204, 54, 34, 34, 98, 78,124,124,252,229,114,162, 90, 87,211,210,210,226,158, 60,121,210,129,199,227, 9,164, 82,105,179,219,
-183,111, 83,106, 45,131, 6,115,162,145,145,151, 95, 78, 59, 25, 23, 65,223, 56, 99,202,148, 41,220,151, 47, 95,126,151,152,152,
-216,166,212,135, 25, 77,175, 42,106,178,102,207,158, 29, 10,160, 38,128, 98, 85,163, 70,163,145, 26, 62,124,248, 99, 0,245,190,
-252,242, 75, 59, 66,200,204, 57,115,230,100, 0,216,254,119, 95, 75, 86, 86, 86, 43, 39, 76,152,128,131, 7, 15, 34, 51, 51,115,
- 3, 0,228,228,228,172,223,183,111,223,129,113,227,198,225,151, 95,126, 89,153,154,154,122, 22, 21,119,213,254,224,227,143, 63,
-198,153, 51,103,240,199, 31,127, 44, 0,240,180,140,245, 94, 92,191,126,125,206,177, 99,199,190, 31, 58,116, 40,126,254,249,231,
- 30, 0,202,107, 32,219,181,123,247,238, 56,125,250, 52,210,211,211,183,148,182, 66, 86, 86,214,214,227,199,143,183,232,222,189,
- 59, 86,172, 88,209, 21,192, 37, 51,118,221,215,218,218,122,215,247,223,127,223,172,126,253,250, 24, 54,108,152, 90,167,211,245,
-248,242,203, 47, 79,236,223,191, 95,190,103,207,158,166,227,199,143,191, 91,144,243,237,142, 89,161, 44,154,254,118,237,218,181,
- 99, 59,116,232,128,153, 51,103, 26,206,157, 59,215, 23,192,249,179,103,207, 70,204,158, 61,251,212,218,181,107, 57,107,214,172,
- 25, 59,125,250,244, 84,134, 97,222,149,185,254,102,227,198,141, 45,186,117,235,134, 87,175, 94,225,206,157, 59,208,233,116,191,
-220,190,125,251, 90,157, 58,117,190,209,106,181, 39,164, 82,233, 40,185, 92, 30,208,168, 81,163, 78, 65, 65, 65, 18,152,215, 78,
- 47, 57, 50, 50,210,198,218,218, 26, 6,131, 1,143, 30, 61,130,135,135, 7,116, 58, 29, 94,191,126,141,250,245,235,131,207,231,
- 35, 57, 57, 25, 69,162,229, 21,152, 34,250, 81, 68, 84, 66, 77, 59,185, 20, 48,138,240,224, 89, 28, 28, 29,108, 97,164,104, 36,
- 37, 37,162,145,143, 59, 40,138, 66, 86,122, 18, 40,138,122,108,142,166,145, 48,193, 49, 9, 41,213,236,229, 66,212,111,209,205,
-254,246,217,212,189, 86, 53, 91,143,231,114, 40,142, 64, 40,219, 62,118,244,104, 7,134, 33,200, 74, 79, 6,151,166,239,189,139,
- 19,116, 56, 6,177,237,107,137, 30,116, 27,187,172, 17, 69, 64, 84, 58,236,249, 57, 25,153, 18,160,209,198,175,191,182,177,119,
-112,192,176, 97,195,152,244,248,248,139, 74, 51, 19, 43,215,172, 83,199, 89, 38,151,227,230,205,155,224,228,183,177,197, 78,192,
-119,213,236,217,246, 78, 46, 46,248,100,236, 88, 38, 57, 38,230,146, 10, 72,176,164,172, 53,107,213,226,153,116,233, 2,221, 68,
- 14,166,125,217,183,173, 80, 42, 22,226,219,109,191, 33, 54, 77,113,224,118, 34,182,253, 75,227, 29, 59,202,141,104,149,213,248,
- 44,191, 81,181,164, 92,179, 34, 18,137, 10,163, 41, 22,188,233,189,117,205,138,248, 43, 52,223, 33,243, 0, 28, 3, 48, 47, 54,
- 54, 54,124,236,216,177, 58,131, 78,147,123,107, 89,205,185, 33, 43,106, 76,186,189,216,117,210,239,211,172,231, 42,179, 51,114,
- 55,110,220,168,143,141,141, 13, 47,186, 77, 5,218, 49, 0, 78,239,222,189,123,235,225,195,135, 81,175, 94, 61, 60,125,250,212,
- 73,161, 80, 52,126,252,248,177,157,175,175, 47,246,238,221,139,131, 7, 15,174, 3,112,161, 60,147,101,194, 96, 48, 92, 76, 74,
- 74,242,142,142,142,174,109, 99, 99,163,183,177,177, 65,201,158,136, 57, 42, 6,233, 89,217,176,179,179,135,149,149,149,151, 25,
-230,252,116, 82, 82, 82, 93,198,214,167, 93,221,180, 13,217,193,223, 86, 71,240,183,213,113,122,142, 27, 92,109, 4,200,204,204,
- 68,106,106, 42, 82, 83, 83, 65, 81, 20,244,122,189,159, 25,154,175, 19, 19, 19,127,138,137,137, 57,230,236,236, 12,185, 92, 14,
- 2, 32, 41, 75,143,208, 53,190, 8, 93,227,139,164, 44, 61,114,114,115, 81,163, 70, 13,200,229,242,178,170, 40,232,106,213,170,
-245, 28, 50,100,136, 28, 0, 10, 12, 84,103, 66,200,164, 82,166,137, 6,131,161,181,105,221, 89,179,102,217, 1,232,254, 55, 95,
- 79, 28, 0,147,199,141, 27,215, 84, 36, 18, 97,243,230,205,175, 1,252,106,122,214,111,221,186,245, 25, 0, 76,155, 54, 45, 0,
-192, 76,148,145, 9,186, 48, 52,196,231, 55,241,243,243,195,237,219,183, 1,224,183, 10,190,251,200,173, 91,183, 80,167, 78, 29,
-136, 68,162,102, 21,172,235, 85,189,122,117, 60,123,246, 12, 0, 30,148,177,206,131,103,207,158,229, 87,247, 80,148,151, 25,251,
-222,175, 91,183,110,143, 46, 95,190,220,172, 85,171, 86, 24, 59,118,172,246,238,221,187, 61, 1, 92,123,240,224, 65,199,225,195,
-135, 43,234,214,173,139,171, 87,175,250, 14, 31, 62,252, 22, 77,211,203,204,208,252,100,233,210,165,243, 62,252,240, 67, 44, 93,
-186,148, 28, 58,116,104, 24,128,243, 5,203,206, 29, 56,112, 96,228,242,229,203, 73,255,254,253,177,100,201,146,121, 0, 38,149,
- 39,166, 80, 40,178,141, 70, 35, 20, 10,133, 89, 33,121,115,215,119,112,112,248,160, 91,183,110,152, 63,127, 62,170, 85,171,134,
- 19, 39, 78, 16, 0, 39, 1, 92,215,106,181,237, 0,172, 85, 40, 20,191,223,190,125, 27, 93,187,118,229,163,248, 16, 35,229,125,
-255,163,125,251,246,105,172,173,173,225,233,233,137,154, 53,107, 34, 41, 41, 9, 81, 81, 81,168, 95,191, 62,154, 52,105, 2,131,
-193,128,159,126,250, 73,157,155,155,107, 86, 78, 62,131, 86,177,231,194,169,163,217,246,114, 33,220,157,172, 81,163,154, 29,242,
-178,210,144,154,148,128, 38,126, 30,104,223,164, 6,210,178,181, 56,119,242,104,102,110,174,114,143, 89, 33,124,141,114,215,197,
-179, 39,178,109,229,124,120,251, 4, 96,248,216,105,141, 26, 53, 14,188,208,188,121,235,115,171, 87,126,219,160,115, 75, 63, 42,
- 46, 77,141, 51, 39,127,203,204,206,201,217,245, 46, 30,244, 75, 0,142,218,186,238,181, 45,199,130,127,242,239, 49,238,167,240,
- 56,108, 0, 0, 61,135,227,219,243,131, 15, 16, 23, 23,135,163,135, 15, 39, 42,129,135,230,234,137,197, 98, 26, 0,178,179,179,
- 33, 44,104,119,103, 0,124,122,245,234,133,212,180, 52,236,251,245,215,212, 51, 64,136, 37,229,236, 3, 8, 36,226,252,128, 96,
-118,118, 54, 40, 32, 7, 0, 40, 46,122, 54,175, 87, 7,169, 25, 57,184,124, 47, 60,175,134, 10,159,149,167,243, 30, 55,132,175,
- 92, 27, 45, 0,105, 51,103,206,132, 80, 40,132,171,171,107,161, 57, 50,153, 21,129, 64, 0, 87, 87, 87, 24, 12, 6, 28, 56,112,
- 0, 0,210,202,125,195, 3, 52,125, 39,173, 96, 52,122,162,228,241,120,111, 69,179,224,205, 81, 51, 96,246,207,204,217, 91,165,
-119,138,169,140,230,123, 64,243,130,156, 88,205, 1,100, 70, 69, 69,197, 13, 30,208, 55, 59, 58,226, 73,146, 34, 43, 33, 49, 39,
- 61, 54, 49,246,245,227,164,175,230,204,204,142,139,139,139, 69,126, 46,173,230, 9, 9, 9,166,109,204, 97,230,224,193,131,127,
- 24, 55,110, 28, 9, 13, 13, 5, 0, 4, 7, 7, 99,244,232,209,100,228,200,145, 27, 0,204,173, 68,185, 21, 42,149,170, 88, 52,
- 68,103,100, 10,171,252,114,114,114,144,144,144, 0,173, 86,107,182, 35,126,113,110,205,243,140,168, 32,125,128,167, 20, 1,158,
- 82,248, 86,151,128, 50,228, 21,154,172,212,212, 84,211,155,179,218,130,114,230,104, 52,154, 98,229, 44, 90, 53,153,147,147,131,
-164,164, 36, 24,141,198,178,126,200,152,248,248,248,115, 7, 15, 30,204, 5,128,213,171, 87,103, 80, 20,245, 7, 69, 81, 63,148,
- 50,109,227,114,185, 55, 77,235,174, 89,179, 38, 3,111, 86,137,253,149,124, 88,191,126,253,204,121,243,230,109,158, 62,125, 58,
-182,109,219,134,196,196,196,185,248, 51, 23, 15,147,150,150, 54,123,203,150, 45, 24, 51,102, 12, 22, 46, 92,184,166,113,227,198,
- 57, 0,134,151, 37,232,232,232,232,206,229,114, 17, 18, 18,146, 3,224, 85, 5,223,159, 20, 18, 18,146, 76, 81, 20, 92, 93, 93,
-107,149,183,162,157,157, 93,109,185, 92,142,248,248,120,160,224,141,185, 20,162, 18, 18, 18,136, 64, 32,128,155,155, 91,157,138,
-118,222,214,214,118,246, 79, 63,253,196,125,242,228, 9, 58,119,238, 28,119,245,234,213,174, 0, 76, 93,210, 67,130,131,131,219,
-118,236,216,241,249,133, 11, 23,240,221,119,223, 81, 13, 27, 54,156, 84,145,166,167,167,231,196, 79, 62,249, 4,155, 54,109,194,
-246,237,219, 39, 1, 56, 92, 98,149,253, 91,182,108,153,182,125,251,118,140, 29, 59, 22, 94, 94, 94,195,203,211,139,142,142,158,
-211,161, 67,135,224, 23, 47, 94,152, 53,226,129,153,235,119, 12, 12, 12,172,173, 82,169,176,107,215,174, 87,181,107,215,190,127,
-248,240,225,153,120,243, 7,251,247,163, 71,143, 98,196,136, 17,104,216,176,225, 46, 0, 67,205,185, 45,195,194,194, 98, 47, 93,
-186,196,240,249,124,120,122,122,162,119,239,222, 24, 54,108, 24, 26, 52,104, 0,157, 78,135,163, 71,143, 50,143, 31, 63,142,211,
-106,181,102,229, 82, 74,127,113,229, 68,100,228,243,155, 33,119,175,233,185, 28, 26, 30,174,118,248,168, 75, 35,124, 58,176, 53,
-154,248, 86, 67,116,138, 10,151, 46, 93,208, 71, 70,190,186,109, 78,143, 67,147,102,248,211,135,183,158,132,220, 48,240,184, 20,
-124,125,234, 98,254, 87,179,109,151, 47,154, 99, 83,183,150, 7, 30,190,206,198,133,243,103,244, 9,113,177,151,223, 85,143,195,
-171, 0, 95, 38,164,164, 28,154,134,145, 22, 42, 56, 5, 29,105,234,249,251,123, 59,187,184,224,212,169, 83,160, 45,232, 17,122,
- 21,224,203,100,249,181,224,121,121,121, 48,233,213,246,241,241,241,240,244,196,233, 83,167,192, 97,152,176,246, 22, 38, 24,125,
-150, 95, 13, 93,168, 75, 1,234,207,170, 67, 94,187,186,147,143,173,181, 20,119, 31,190,132, 70, 79,238,253,154,137,119,154,143,
-236, 47,100, 60, 42, 89,117,184,122,219,182,109,205,127,250,233,167,174, 51,103,206,148,141, 26, 53, 10, 34,145, 8, 74,165, 18,
-238,238,238, 48, 26,141, 56,123,246, 44,130,130,130,242, 24,134,185,128, 55,211, 6,116, 65,145, 94, 26,231, 94, 65,156,239,183,
-148,205,143, 13, 26,244, 86, 52, 1, 64,246,146,177, 74,175,161,221,187,241,240,141,254,251,206,133, 80,159, 15,109, 79, 55,241,
-169, 14, 0,112,118,118,134,149,149,149,197,154,111,129,191, 92,179,104,181,110, 82, 82,210,179,164,164,164,148,113,227,198,249,
-154, 26,190, 11,133, 66,117, 65, 36, 43,179,180,109,204, 40,167, 14,192,103, 63,253,244,211,241,236,236,236,115, 95,126,249, 37,
-150, 47, 95,142, 19, 39, 78,180, 5,112,179,146,251,110,204,204,204,204,186,119,239,158,115, 29,191,198,168,233,196, 67,187, 5,
- 47, 64, 8,129,189,132, 32, 55, 43, 3, 15, 30,132, 32, 55, 55,247,174, 37,229,212,233,116, 89, 41, 41, 41, 14, 78, 78, 78,200,
-200,200, 64, 90, 90, 90,161,201,202,204,204, 68, 70, 70, 6,161,168, 55,114,182,148,167,169, 72, 73, 73, 81,134,135,135, 11,156,
-171,215, 65, 45, 39, 62, 2,191,122, 6, 16, 2, 15, 59, 26,185, 57, 89,184,125,251, 54,178,179,179,175,148,165,201, 48,204, 23,
-195,135, 15,231, 0, 24,249,229,151, 95,218, 1,104, 56,123,246,236, 11, 40,209,179,144,203,229,174,223,187,119,111, 61, 83, 21,
-227,156, 57,115,214, 1,248,233,239,186,150,236,237,237,191, 56,117,234,148, 92,167,211, 97,227,198,141, 88,183,110,221, 78,188,
-153,168,242,212,230,205,155,183,208, 52, 61,121,202,148, 41,152, 48, 97,130,164,105,211,166, 51, 19, 19, 19,127, 45, 77, 51, 62,
- 62,126,126,147, 38, 77, 22,166,164,164,124,107,150, 89,126,241, 98,124,147, 38, 77,230,167,164,164,172, 42,239, 28, 73,165, 82,
-169,209,104, 68,100,100,100, 38, 80,102,251, 14,117,100,100,100,188,209,104,116,151, 72, 36,118, 21, 93,159,153,153,153,223, 54,
-109,218,116,113,114,114,242,121, 0,203, 74, 49,228,161,137,137,137, 1,211,167, 79,159,186,114,229,202,254, 73, 73, 73, 7, 42,
-210,140,142,142,254,182, 99,199,142, 11,158, 63,127,190, 27,101, 87, 1,111, 94,178,100,137,110,239,222,189,147, 34, 35, 35, 87,
- 84,160,121, 50, 45, 45,237,164, 5,231,183,172,245, 11, 53, 57, 28,206,236,149, 43, 87,210,219,182,109, 3, 33,100,141,209,104,
- 44,171,156, 15,127,255,253,247, 61,173, 91,183, 30,117,248,240, 97, 81, 64, 64,192, 4,141, 70,179,191,162,235, 83,169, 84, 30,
- 61,124,248,112,255,135, 15, 31,186,143, 26, 53, 74,228,237,237, 13,157, 78,135,196,196, 68,108,219,182, 77,253,248,241,227,184,
-172,172,172,163,150, 60, 67, 12,218,156,161,183, 46, 29,219, 31,245,226,113,203, 14, 61,250,217,106,117,238, 16,166,115,144,149,
-158,132,179, 39,143,102, 70, 70,190,186,173, 84,102, 13,181, 68, 83,167,201,254,248,246,229,227, 7,226, 34,195, 91,180,235,216,
-211, 86,173,245,132,144, 79, 35, 61, 57, 30,103, 79, 29,203,136,140,124,125, 93,173,215,140,126, 87,207,121,142, 23,150,113,146,
-130,198, 77,236,211, 8, 98, 91,247, 7, 60, 96, 99,107, 64,236,224,236,204, 47,184,119, 32,203,111,243,104,150,102, 50, 32,168,
- 83, 80, 75,165, 84, 42,193, 3,180, 99, 0,158,163,163,163, 24, 0,158, 63,127, 14, 73,126,173,134, 69,229,204, 3,164,146, 34,
-186, 52,160, 76,231,162, 90,109, 43, 41, 5, 0,113, 73,233,208,234,203,253,221,120,223,217, 81,196,112,237,168,140, 0, 31, 64,
- 23,153, 76,182,124,225,194,133,107,238,222,189,187,166,119,239,222,107,132, 66,225,242,130,131,205, 47,231, 68,252,109,154,205,
-220, 96,215,177, 22,117,173, 91,109,138,153,216,214,214, 56, 58, 80,170,237,212,169,211,150, 42,150,179, 42, 55,203, 95,169,121,
- 76,175,215, 19,228, 87,219, 29, 67,217, 85,130,243,138, 44, 79,138,137,137, 33, 5,127, 91, 82, 78,135, 33, 67,134, 48,185,185,
-185,100,240,224,193, 4, 21, 15,225, 83,174,166, 80, 40,236,216,174, 93, 59,125,114,106, 6,121,246, 58,158,220, 9,126, 74,206,
- 93,186, 69, 14, 28, 61, 69, 54,109,217, 78, 26, 52,104,160, 5,224,105,137, 38,151,203,237,212,177, 99,199,244,228,228,100, 18,
- 30, 30, 78,174, 93,187, 70,142, 28, 57, 66,182,111,223, 78,126,248,225, 7, 82,189,122,245,100, 0,206,150,104,138,197,226,126,
- 31,124,240,129, 62, 43, 71, 73, 34,227,211,201,163,240, 72,114,243,222, 35,114,246,210, 77,242,235,254,195,196,223,223, 95,109,
-134, 38,135,195,225,108, 58,112,224, 64, 14, 33,132,244,235,215, 47, 14,197, 19,169,214,252,226,139, 47, 82, 8, 33,100,213,170,
- 85,233, 40,189, 33,252, 95,125, 45,245,168, 86,173,218, 51, 62,159,127, 10,192,200, 10,182,251,152,203,229,158,112,113,113,185,
- 15,224,163,119,112, 31,245,118,114,114,186, 3,160,162, 17, 14, 76,235,125,248, 47,185,223,255, 10,205, 78, 92, 46,247, 26, 80,
-254, 32,194, 69,158,215,223,112, 56,156,211, 0, 58, 91, 88,206,186, 14, 14, 14,131,109,109,109, 63,183,181,181,253,220,201,201,
-105,176, 64, 32,168, 91,149,125,183,175,219,165,143, 71,227,190,191, 87,111,216, 43,218,163, 81,239,104,175, 38,253,126,183,175,
-219,165, 79, 85, 53, 61,155,244, 59,230,209,168,119,140, 71,163, 62, 81, 53,155,245,251,221,193,167,203, 7,239,242, 28,141,172,
- 6,183,174, 53, 97, 32,215, 22, 16,114,109, 1,233, 82, 19, 76, 75, 27,248, 55, 7,228,221,187,116, 89, 75,140,198,181,253, 63,
-252,112,109, 29,192,158, 0,156,146, 83,105,154,141, 1,171,194,109,251,245, 91, 91, 11,112,232, 10, 72,218,183,109,187,134, 24,
-141,107,135,127,252,241, 90, 15,192,165, 52,189,178, 52, 9,192,169, 6,184, 21,213,117, 0,106, 15,244, 66,192,188, 62, 94,132,
- 92, 91, 64,150, 12,242, 38, 77,156, 49,178, 2,205,178, 34, 69,239,109, 68,171,180,182,226, 21, 33, 45,120,184,174, 40,248,148,
-190,133,139,240,173,107,182,112,133,119,151,218, 84,120, 79, 31,110, 6,242,187, 36, 75,255,133, 15,201,221, 90,173,150,168,213,
-106,162, 84, 42, 73, 94, 94, 94, 73, 3, 85,104,200, 18, 18, 18, 72, 92, 92, 28,137,137,137, 33, 81, 81, 81, 4,127,182,189, 49,
-187,156, 86, 86, 86, 63, 13, 26, 52,200,200,227,241, 54,189,141,125,183,179,179, 91, 17, 24, 24,168,251,254,251,239,201,239,191,
-255, 78,126,252,241, 71, 50,101,202, 20, 82,175, 94, 61,141,141,141,205,208,202,104,186,184,184,204,247,241,241, 73,223,185,115,
- 39,249,245,215, 95,201,134, 13, 27,200,215, 95,127,109,116,119,119, 79,146,203,229,221, 43,163,233,228,228,180,163, 77,155, 54,
-186, 29, 59,118,144, 11, 23, 46,144,125,251,246,145, 47,190,248,130,248,250,250,106,164, 82,233, 0, 51, 53, 57, 92, 46,119,237,
-196,137, 19,147,220,220,220, 78,149, 88, 38,241,247,247,191, 63,124,248,240, 4, 0,115,254, 69,215, 39,171,201,106,178,154,127,
-129,209, 26,230,134,106, 4,224, 72,248,252,143,219,183,109,187,134, 15,124,108,169, 41, 18,113, 56, 3, 91, 7, 6,174,225, 3,
- 67, 77,235,138, 56,156,129,237,219,182, 93,195,227,112, 70,148,165, 87,158, 38, 1, 56,124, 46,119, 78,235,150, 45,215,114,129,
-175, 76,243, 58,213,164,194,190,232, 81,157,180,245,164, 94,142,112,130,228, 95,108,180, 74,165, 50, 70,171, 48,128,240, 23, 92,
-132,239,139,230, 63,229,166,174, 83, 96,152,142, 89, 16,209, 58,134,252, 81,212,235, 84,178,156,226,183,188,239,245, 29, 28, 28,
-206,212,169, 83, 39,181, 70,141, 26, 9,182,182,182,251, 1,184, 87, 81, 51,192,197,197,229, 23,103,103,231, 23,174,174,174, 15,
- 29, 28, 28,214, 35, 63,235,124,165, 53,121, 60, 94,160,179,179,243, 21, 47, 47,175, 44, 79, 79,207,100, 7, 7,135, 3,165, 68,
-178,204,209,116, 69,233, 15, 21,126,193, 50,246, 71,135,213,100, 53, 89,205, 98, 6,166, 91, 45,172,236, 90, 19,134,174, 53, 97,
-236,230,133,245, 69, 13, 74,111, 64, 92, 89, 83, 52, 26, 16,150, 92,191, 34,189,138, 52, 9,192,105, 5,200, 74,110,211,211, 29,
-254,102,106,190,239, 17, 45,211,115,190, 88, 68,139, 91, 73, 65,195, 95, 80,200,247, 69,243,159,194, 75,148,211, 24,185, 8, 43,
-222,226,119,170,222,242, 62, 60, 74, 75, 75,251, 32, 45,237,173,246, 77,120,146,148,148, 52,242,109, 10,234,245,250,187,201,201,
-201, 29,222,130, 84, 89, 93,175,117, 48,179, 91, 54, 11, 11,203,127, 7, 10, 48,226, 21,230,118,169,139,141, 92, 35,232,179,175,
- 17, 95,162, 75,158,138,170,140,102, 62,198,221,165, 60,227,169,202,150,243, 79,242,222,208,136,195, 83,234,191,115,218, 18,145,
-223, 70,203,252, 60, 90, 44, 44, 44, 44, 44, 44, 44,239,142,139, 47,216, 23,177,247,128, 83, 40, 30,125, 59, 85,196,136,150, 25,
-250,180,164, 39, 69,101,194,167, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,213,252,207,105,154, 40,107,236,212,103, 37,254,
-175, 84, 47,190,127, 2, 85,105,163,245, 87, 26, 48, 86,147,213,100, 53, 89, 77, 86,147,213,100, 53,255,123,154,239, 51,101,246,
- 58,100,171, 14, 89, 88, 88, 88, 88, 88, 88, 88,170, 70,153, 81, 55,214,104,177,176,176,176,176,176,176,176, 84, 13, 87,228, 15,
- 81,117, 10,127, 14, 85,181,131, 53, 90, 44, 44, 44, 44, 44, 44, 44, 44, 85,167, 23,254,236,109, 88, 44,186, 69,179,199,134,133,
-133,133,133,133,133,133,165,202,140, 47,242,201,166,119, 96, 97, 97, 97, 97, 97, 97, 97,121, 75,152,215, 51,242,228,201,147,132,
- 61, 86, 44, 44, 44, 44, 44, 44, 44,239,138,247,212,139,152,162, 88,197, 70,249, 96,123, 29,178,176,176,176,176,176,176,176, 84,
-157, 29, 69, 12, 87,177,121,172,209, 98, 97, 97, 97, 97, 97, 97, 97,169, 26, 38,131,117, 10, 37,134, 84,163, 1,182,202,144,133,
-133,133,133,133,133,229,221,242,158,123,145, 29, 5,211, 27,195, 37,153,122, 29,118, 40,216,193, 14,236,169,102, 97, 97, 97, 97,
- 97, 97,121, 7,188,207, 94,196, 21,165,180,209, 98, 97, 97, 97, 97, 97, 97, 97, 97,169, 58,227, 75,124, 2,200,111, 12, 79,177,
-199,134,133,133,133,133,133,133,133,229,173, 24,173,162,236,248, 59, 6,149,102, 97, 97, 97, 97, 97, 97, 97,249, 79, 66, 8,249,
-203, 51,195,179, 35,155,179,154,172, 38,171,201,106,178,154,172, 38,171,249, 95, 96, 60, 74,100,133, 7,216,244, 14, 44, 44, 44,
- 44, 44, 44, 44, 44,111,195,100,237, 40,237,127,118,172, 67, 22, 22, 22, 22, 22, 22, 22,150,191, 8, 54,162,197,194,194,194,194,
-194,194,194, 82, 53,118,160,148,172,240,172,209, 98, 97, 97, 97, 97, 97, 97, 97,121,123,102,235, 13,216,170, 67, 22, 22, 22, 22,
- 22, 22, 22,150,170, 49,190,172,255, 41,148,221,115,224,162, 5, 95, 80,153,222, 7, 23, 89, 77, 86,147,213,100, 53, 89, 77, 86,
-147,213,252,207,105, 86,164,125, 17,239, 31,165, 54,134,255, 59,242,104,177, 93, 95, 89, 77, 86,147,213,100, 53, 89, 77, 86,147,
-213,252,183, 99, 26,130,199, 52,185, 2,249,121,180,216, 54, 90, 44, 44,239, 57,228, 48, 56,200,244,241, 2, 33,110,224, 8, 18,
-145,248,232, 21,181, 24, 76,149, 53,147,253, 61, 33,214, 59,195, 32, 74, 69,242,195,215, 85,213,100, 97, 97, 97,249, 23,147,136,
- 50,218,104,177, 70,139,133,229,125, 39,213,215, 27, 92,172, 0, 13, 87, 16, 93, 4, 28,253, 87, 0, 79, 31, 87, 89,147,207, 44,
-131,145,118, 7,209, 61,135,147,207, 74,224,217, 83,246, 96,179,176,176,176, 88,198,223,222, 24,158,199,227, 37, 3, 96, 68, 34,
-209, 81,176,163, 92,179,252,181,184, 22, 92,103, 76,193,117,103, 9, 50, 46,151,187, 80, 34,145, 92, 22, 10,133, 41, 66,161, 48,
- 69, 42,149, 94,230,114,185, 11, 1,200,254, 41, 59, 72,126,169, 39, 1,109,252, 64,171,103,170,157,125,148,229,164,212, 24,189,
- 65, 27,122,146,157,117,101, 85,210,228, 82,221,212, 58,198,227,215,123, 74,103,133,214,224, 7,130, 42,105, 22,193,134,207,231,
-159, 5,224,192, 94,158,255, 78,252,128,166, 77,185,220, 89,190, 64, 39,128, 29, 79,151,133,229,111, 55, 90,122,189,222, 41, 45,
- 45,141,218,179,103, 79, 95,107,107,235, 8, 46,151, 59, 15, 0,255,191,114,192,101, 50,217, 45, 43, 43,171,100,107,107,235,100,
- 43, 43,171,144,138,230,255, 75,241,118,116,116,140,182,179,179,123, 94,116,166, 99,131,143, 90,213,105, 61,114,145,189,127,191,
-246, 85,212,231,115,185,220,121,214,214,214, 17,123,246,236,233, 27, 31, 31, 79,233,245,122, 39, 11,182,111,103,107,107, 27,118,
-247,238,221, 5,105,105,105,237, 99,239,236,116, 76,186,187,221, 49,250,202,218, 14, 65,167, 55, 45,176,177,177,126, 10,160,221,
- 63,226, 72,170, 25,103,208,156,142, 79, 18,149,146,196, 28,189,115,112,148, 82, 14,112, 58, 64, 91,133,151,152,108,198, 25, 32,
-157, 66,227, 84,210, 91, 25,142,206,215, 95,105,172, 64,211, 29,161,166, 92,170,252,192,161,233, 73, 12,195,116,229,243,249,159,
-179,143,223,127, 39, 2,154,110,125,171,111,223,101,115, 26, 52,152,234, 11,244, 41,195,108, 81, 0,166,249,250,250,158, 1,240,
-241, 91,252,250,239,124,124,124,226, 1, 76,103,207, 4,203,223, 76, 99,211, 11, 62,138,180,209,178,200,104, 13,244, 66,235,161,
- 53,113,117,176, 23,114,135,212, 68,222,136,154,184, 49,192, 11,157, 42, 83, 26,123,123,123,180,107,215,142, 19, 31, 31, 47,254,
-226,139, 47, 22,137, 68,162, 72, 0,221, 43,163, 37, 22,139,131, 36, 18, 73, 44,151,203, 45, 86, 22,137, 68, 18, 36,149, 74, 99,
-185, 92,110,231,162,243,229,114,249, 45, 43, 43,171,100,185, 92, 30, 82,134, 17, 10,178,178,178, 74,150,201,100, 65, 69,231,115,
-185,220,206, 50,153, 44, 78, 46,151,151,156,223, 73, 46,151,199,150,156, 95, 22, 60, 30,207, 61, 54, 54,214, 41, 46, 46,206, 73,
- 32, 16, 56, 23,157, 31, 19, 19,227, 20, 27, 27, 91,108,190, 37,112,185,220, 78, 82,169, 52, 86, 34,145, 4,149, 54,191,228, 62,
-149, 69,145, 99,215,201,156,249,150,154,172,110,221,186,221, 72, 76, 76,244,176,177,177,177, 41,186,192,206,218,166,251, 47, 59,
-183,204,236,215,179,219, 36, 71,191, 15,235, 87, 82,191,187, 72, 36,138,252,226,139, 47, 22,197,199,199,139, 91,182,108,201,161,
-105,139,222, 39,186,244,235,215,239, 88,114,114,114,181,134, 13, 27,114, 12, 6, 3,158, 28, 95, 8,201,195,207, 33,138,220,134,
-234,226, 84,110,196,133,149,238,221, 58, 52, 61,134,119,220, 24,148, 28,246,227,131, 98,218, 49,132, 56,134,197,171, 29,123,245,
- 29,196,125, 16,171,114,212, 27,141,118, 0,167, 3,217,229, 41,172,148, 38, 87,223,150, 33,196,249,143, 40,158, 99,199,193, 83,
- 57,151,162,184,142,122,163,209, 30, 52,218, 87, 70,179,232,229,207,225,112,102,174, 93,187,150, 6, 48, 5,128,224,191,244, 20,
-110,238,134,106,157,106,115,238, 53,118, 69,235,183, 40, 27, 80,112,191,123,255, 83,246, 83,203, 48,207, 14,188,126,125,110, 68,
-237,218,189,231, 52,104, 48,166, 20,179, 69, 1,152,179,114,229,202,145, 79,158, 60,113,172, 89,179,230,132,183,244,210,191, 97,
-229,202,149,179,159, 60,121,226,230,229,229,181, 4,108,250,162,127, 21,132, 16, 1, 33,164, 35, 33,164, 23, 33,164, 51, 33,164,
-121,193,223,205, 10,166, 94,132,144, 46, 37, 62,155, 21,108,107, 90, 30, 88,134, 70,175,146,219, 21,217,166,228,255,197,254, 46,
-197,104,245, 66,126, 91,173, 94,197,118,224,228,201,147,164,232,103, 73,134,120, 97,241,212, 86,213,148, 97, 39,246,145,188,216,
-215, 36, 51,252, 1,121,176,227, 91, 50,181,153,163,114, 88, 77,124,103,249,241, 34,228,230,205,155,228,201,147, 39, 36, 47, 47,
-143,188,120,241,130, 4, 6, 6,170, 36, 18,201, 31, 0,188, 44, 17,147,203,229,201,127,252,241, 7,233,214,173, 91,182, 76, 38,
- 91, 99,186,185,172,172,172,146,111,222,188, 73,186,117,235,150, 45,151,203, 55, 0,224, 0,192,128, 1, 3, 82, 8, 33,196,209,
-209, 49,161, 52,189,126,253,250,101, 18, 66,136,181,181,181,169,170,137, 35,151,203, 55, 76,158, 60, 57,239,254,253,251,196,214,
-214,214, 52,159,182,178,178, 90, 51,101,202,148,188,224,224,224,162,243,203,197,206,206, 46,214,104, 52,146, 19, 39, 78, 16, 39,
- 39,167,194, 50,216,218,218,198, 26,141, 70,114,236,216,177, 50,203, 86, 94,160, 64, 38,147,173, 30, 49, 98, 68,110, 84, 84, 20,
-177,183,183, 79, 46, 50,127,205,168, 81,163,114, 99, 98, 98,136,131,131,131, 89,101,180,183,183, 79,190,117,235, 22,233,223,191,
-127, 78,209, 99,106,111,111,159,124,251,246,109,211,252,213,230, 60,200,220,220,220, 38, 56, 57, 57, 37, 56, 57, 57, 37,216,216,
-216, 44,119,117,117, 77, 74, 77, 77, 37,132, 16, 82,171, 86,173,148,162,145, 44,167,128,190, 51,182, 29,190,125,247,218,227,244,
-212, 6, 93, 39,173,182,110,208,207,218,130, 99,224, 37,145, 72,254,104,223,190,189, 42, 54, 54,150, 40, 20, 10,242,240,225, 67,
-114,243,230, 77,242,242,229, 75, 2,192,156, 62,182,114,153, 76, 22,175,209,104, 24,141, 70,195,164,166,166, 26, 83, 82, 82,140,
-225,107, 92, 9,249,153, 87, 56,101, 29,235, 67,146,174,173, 96,172,100,146, 56, 0,242,119,246,224,217,226,239, 78,182,251, 28,
-120,186,208, 35,252,218,202, 30,122, 18,117,137,236, 27,227,168,191, 58,163, 90, 4,249,193,247,127,100,187, 95,245, 74,105,254,
-224,183,239,225,215, 30,207, 54, 45,153,166,143,142,142, 38,179, 70,245, 48,156,159, 90,237, 21,217,230,123,184, 50,154, 69, 24,
-250,209, 71, 31,229,197,196,196, 16,127,127,127, 5,135,195, 25,251, 95, 50, 89, 93,188, 5,241, 15,127,157,197,244, 9,144,164,
-191, 37,179, 21,224,228,228,148,182,123,247,110, 34,151,203, 83,254, 65,102,139,242, 5,250,238,105,208,224, 24, 51,112,160,113,
- 79,131, 6,199,124,129,190, 5, 6,139, 2, 48,119,213,170, 85,193,122,189, 62,120,215,174, 93,193,125,251,246, 13, 6, 48,171,
-138,223,249,253,119,223,125, 71,244,122, 61,217,181,107, 23,233,219,183, 47, 1,176,209,220,141,101, 50, 89,157,250,245,235,239,
-245,247,247,143,105,216,176,161,214,207,207, 79,237,237,237, 29, 21, 16, 16,176, 91, 40, 20,122,129,229,111,161, 60, 47, 66, 8,
-105, 62,119,238,220,121, 0,200,220,185,115,231, 17, 66,122, 21,248,137, 94, 69,255, 46,249,105, 50, 79,166,255, 75,211, 48, 77,
-165,105,150,246, 29, 37,190, 7,101, 68,178,198, 23,148,251,207,157, 59,121,242,100,251,147, 39, 79, 94, 45,185,115,131,106,162,
-213,212, 86,213, 84,170,212, 68,242,248,219,207,201,229,142,238,228,102, 7, 23,242,124,230, 71, 36,241,215, 13,228,179, 70,182,
-202,129, 53,209,209, 82,163, 21, 28, 28, 76,130,131,131, 73, 72, 72, 8,137,140,140, 36,217,217,217,228,224,193,131, 70,123,123,
-123,149, 80, 40, 92, 9, 64,108,142,152,149,149, 85, 50, 33,132,104, 52, 26,178,124,249,114,117, 65,164,202,217,218,218, 58,153,
- 16, 66,178,178,178,200,202,149, 43,213,214,214,214, 15, 1,184, 57, 56, 56,196,190,126,253,154, 56, 59, 59,151,106,102,108,109,
-109,147,159, 61,123,102, 50, 78,213,108,109,109, 31, 31, 63,126, 92, 71, 8, 33,113,113,113,196,206,206, 46, 25,128,179,189,189,
-253,131,147, 39, 79,234, 8, 33, 36, 33, 33,193, 52,223, 44,163,165, 82,169,200,249,243,231,139,149,193, 52,255,204,153, 51,197,
- 12,152, 25, 56, 91, 91, 91, 7, 31, 60,120, 80,107, 52, 26,201,227,199,143, 77, 38,209,217,198,198, 38,228,240,225,195, 90,163,
-209, 72,194,195,195,205, 54,131, 53,106,212, 72, 33,132, 16,131,193, 64,182,109,219,166, 49, 29, 83,211,124,173, 86, 75,182,110,
-221,170,177,178,178, 10, 6, 80,110,244,205,193,193, 33, 65,171,213,146,172,172, 44, 18, 24, 24,152,119,243,230, 77,146,147,147,
- 67, 8, 33,164, 70,141, 26, 41, 0,224,211,126,236, 55,119, 95,228,229,124, 50,123,203, 33,175,230,195,190, 61,119, 47, 62,238,
-167,223,131,130, 29, 2,250,245, 48, 39,168, 41, 20, 10, 87,186,186,186,170,175, 95,191,110,212,233,116, 36, 38, 38,134,132,132,
-132, 20, 94, 99,143, 30, 61, 50,203,104,113,185,220,133,119,239,222,213, 25,141, 70, 38, 45, 45,205,152,146,146, 98, 76, 73, 73,
- 49,148, 52, 90,228,103, 30, 73, 59, 51,142,156,218, 49, 93,203,231,243, 23,190,155,104, 22, 56,100,187, 79, 63,178,221, 39,120,
-247, 8,135,180,220,144,253,132, 92,152, 78, 94,125, 83,147, 44,236, 33,207,101,182,251, 4,147,237,190, 3,201,226,246, 92,139,
- 52,119,248,245, 33,219,125,130,191, 27,228,153,254, 32,248, 62,185,122,245, 42,217,186, 97, 21,153,218,165,154,130,217,238, 19,
- 76,126,240,235,111,137,102, 81,132, 66,225,139, 27, 55,110,144,107,215,174,145, 37, 75,150, 16,137, 68, 18,243, 54,162,122,228,
- 7,111, 79,242,163,119,123,178,179,174, 43,185,210,254, 31,215,193,167,185, 27,170,117,245, 22,196,165, 61,248,157,144,140,151,
- 36,105,141, 63,233,225,195,171,170,217, 10,112,114,114, 74,141,138,138, 34, 73, 73, 73,100,221,186,117,196,202,202,234, 31,109,
-182,124,128,126, 0,230,173, 94,189,186,208,100,109,217,178, 37,248,209,163, 71,193, 30, 30, 30,167,171,240, 93, 27, 87,175, 94,
- 93,104,178,182,108,217, 66, 30, 61,122, 68, 60, 61, 61, 99, 43,218,112,196,136, 17,146, 86,173, 90, 5, 15, 31, 62, 92,185,123,
-247,110, 18, 21, 21, 69, 30, 62,124, 72, 86,175, 94, 77, 22, 45, 90, 68,126,254,249,103,210,191,127,127, 69, 96, 96,224,221,129,
- 3, 7,138, 44,140, 40,112, 11,162, 48, 2, 66, 8,143, 16, 98, 50,154, 92, 0, 60,211,203, 63, 75,113,163, 85,150, 23, 41,203,
- 76,149,101,176, 74, 46, 43,199,136,149,107,216,204,248,190, 66, 83, 85,198,117, 80, 44, 34,113,165,119,239,222,237,223,248,241,
- 33, 88, 58,254,139,111, 68,145,187,215, 33,249,224,102,112,178,146,193,203, 77,135,230,198, 41,232,111, 28,199,200,150, 45,197,
- 98,138, 90,102,233, 1, 21, 8, 4, 16, 8, 4,224,243,249, 80, 42,149, 72, 72, 72, 64,155, 54,109,232,144,144, 16,209,132, 9,
- 19,166,139,197,226, 24, 0, 31, 86,120, 55, 83,249, 17,233, 91,183,110, 97,220,184,113,194,189,123,247, 54,116,116,116, 12, 53,
- 26,141, 2, 0, 8, 15, 15,199,144, 33, 67,132,251,247,239,175,231,230,230, 22,162,211,233, 36, 66,161, 16, 28, 14,167, 76, 61,
-129, 64, 0,189, 94, 47,172, 91,183,238,195,208,208,208,128,222,189,123,243,162,163,163,241,250,245,107,232,245,122,129,183,183,
-247,163,144,144,144,134,189,122,245,226,197,198,198, 34, 58, 58,186,176, 28,230,148, 87,171,213, 66, 40, 20,162,104,149, 22, 69,
- 81,208,104, 52, 16, 8, 4,102,107,113,185,220, 78,190,190,190,143, 66, 67, 67, 27,247,235,215,143,127,255,254,125,196,197,197,
-193,104, 52, 10,252,252,252, 30,133,134,134, 54,234,219,183, 47,255,225,195,135, 72, 78, 78,134,185, 85,104,166,245, 66, 67, 67,
- 49,124,248,112,193,217,179,103, 27,185,186,186, 62, 52, 24, 12, 2, 0,120,244,232, 17,134, 12, 25, 34, 56,119,238, 92,227,234,
-213,171, 63,172,160, 42,145, 3, 0,122,189, 30, 19, 38, 76,144, 90, 89, 89, 33, 54, 54, 22, 12,195,192,104, 52, 2, 0,210, 51,
-211, 31,133, 62,122, 28, 62,114,232,160,246, 42,157, 70,115,251, 94, 80, 88,173, 26,158,238, 20, 69,106, 84, 80,212, 15,165, 82,
-105,204,154, 53,107,102, 68, 69, 69, 9,125,125,125,233, 87,175, 94, 33, 55, 55, 23,124, 62,191,240, 26, 51,119,191, 5, 2, 65,
- 7,127,127,127,174, 90,173, 6,195, 48, 0, 64,104,154, 46,245,100,136,178,110,192,207,217,192, 19,139,197, 29,222,201, 19, 41,
-199,223, 30, 12,186, 70,167,106,133, 66, 27,119,185,204,213, 27,136,185,134,154,142, 66,112,104,142,232,254,107,165, 20, 32, 93,
-225,145,102,111,153, 38,211,245,117,138, 86,168,183,171, 39,115,115,247, 64,122,122, 58,170,215,242,133, 90,224, 40,184,245, 82,
- 33, 3,101,161,230,159,180,173, 91,183,174, 75,157, 58,117,144,150,150,134,198,141, 27,195,214,214,214, 22, 64,215, 74,155,172,
- 93,158, 66,228,160, 53, 64,175,129,145, 90, 2, 61,119, 5, 94,166, 54, 38,219, 27,243,254, 73, 38,203, 74, 38,184,179,255,192,
-193,106,246, 30,126,192,169, 79,224,108, 35,196,206, 73,141,237, 28,173,133,199, 42,105,182, 2,156,157,157, 47,221,189,123,215,
- 65, 36, 18, 33, 36, 36, 4,254,254,254, 88,183,110,157,163,173,173,237,181,127,136,217, 34,225,192,137,239, 30, 62,220,181, 55,
- 34,226,228,136,218,181,123, 15,247,246, 94, 62,241,227,143,199, 78,155, 54, 13,171, 86,173,194,177, 99,199,208,186,117,107,140,
- 31, 63, 94, 31, 19, 19,179,167,146,223,179,121,205,154, 53, 83,167, 79,159, 94, 82, 83, 23, 29, 29, 93,110,109,139,191,191,191,
-251,139, 23, 47,226,103,206,156,217,120,239,222,189, 98,137, 68,130,172,172, 44,252,248,227,143,152, 55,111, 30, 40,138, 2, 33,
- 4, 63,255,252,179,100,204,152, 49,205, 35, 34, 34,226, 61, 61, 61, 43,108,214, 65, 8,161, 8, 33, 34, 0,146,130, 73, 10, 64,
-178,127,255,126,235,126,253,250, 89, 21,204, 19, 23, 76, 66,176,148,164, 84, 47, 82,228,183,242,100,137,227,221,187,228,188,146,
-203, 8, 33,189,203,211,176,208, 64,151,246,125,167,202, 51, 91, 69,127,129, 58,148,234, 34,129, 6, 46, 94, 62,200,190,112, 24,
- 98, 46, 5, 49,167, 96,226, 82,160, 95, 61, 66,117, 17, 15,122, 66, 2, 42,107,180, 76, 19,143,199,131, 82,169,132,209,104,196,
-188,121,243,132,231,207,159,183,167,105,250,127, 21,233, 20, 53, 76,207,159, 63,135,159,159, 31,117,226,196, 9,231, 41, 83,166,
-136, 77,223,147,157,157,141, 58,117,234, 80,103,206,156,113,250,250,235,175,101,229,153, 25,138,162,192,231,243, 49,125,250,116,
-241,189,123,247,236,220,220,220,240,234,213, 43,100,100,100, 64, 38,147, 97,250,244,233,226,187,119,239, 58,186,185,185, 33, 42,
- 42, 10,217,217,217,144,201,100, 22, 27, 45, 62,159, 95,108, 27,138,162,160,211,233, 44, 50, 6,214,214,214,251,130,131,131, 29,
-173,173,173,241,240,225, 67, 24, 12, 6, 88, 91, 91, 99,234,212,169,226,224,224, 96, 71, 27, 27, 27,132,135,135,131, 16, 2, 43,
- 43, 43,139,202, 8, 0, 12,195, 32, 60, 60, 28, 53,106,212,192,181,107,215,156, 38, 78,156, 40, 50,205,127,249,242, 37,220,221,
-221,113,237,218, 53, 39,169, 84,186,175, 44, 45,134, 97,144,152,152,136, 39, 79,158,224,213,171, 87, 72, 77, 77, 69, 90, 90, 26,
-114,115,115, 97, 48, 24, 0, 0,146,220,156, 83,251, 15,157, 8, 21,139,197, 18,127,239,186, 30,143, 30, 63, 77, 17,139,197, 18,
- 79, 15, 15,111, 96, 49, 93,142, 33,252, 95,116,116,180,253,152, 49, 99,248, 73, 73, 73,200,204,204, 4,151,203,125,227,218, 18,
- 8,204,107, 10,100, 48, 24,252, 68, 34, 17,165,211,233, 10, 35, 96, 2,129, 0, 51,246, 41,225,191, 16,197,166,143, 55,164,128,
- 24,245,208,106,181,126,127,251, 47, 24, 64,129,210,214, 5, 69, 53,190,243, 74, 97,215,182,247, 80, 62, 94,159, 5, 24, 61, 64,
-115,209,161,129, 59,247,216, 35,133, 51, 8, 26, 64, 3, 95, 66, 42,238,249, 69, 0, 10,208,213, 1,168,166,231, 95, 24,236, 91,
-127, 52,137, 31, 31, 31, 15, 62,159, 15,161, 80,136,198,157, 6,112,247,135,234, 93, 64,161, 33,116,240, 49, 71,179, 88,216, 81,
- 44, 94,176,104,209, 34,105, 81,205,177, 99,199, 74,173,173,173, 23, 85,218,100, 41, 36, 45, 97, 32,211,159,196, 43,107, 44, 63,
-149,228, 23,145,162,242, 1, 33, 51, 1,125,163,183, 96,182, 58, 8,133,194,215, 0,218, 84,201,100,201, 5,183, 15, 28, 56, 88,
-205,174,122,190,201,130, 65, 13,240,196,112,113,180,193,206, 25, 29,237, 28,109,196,150,154,173, 0,103,103,231, 63,238,220,185,
-227, 32, 18,137, 16, 28, 28, 12, 62,159, 15,145, 72,132,250,245,235, 99,251,246,237,142,118,118,118,255, 40,179,181,242,225,195,
-221, 43,158, 60,121, 62, 55, 32,192,247, 67,169,212,110,242,240,225,214, 95,127,253,245,201,227,199,143,239,234,213,171, 87,218,
-189,123,247,214, 3, 56,108,105,196, 12,192,150,181,107,215, 78, 54, 25,183,175,191,254,250,231,227,199,143,175,232,213,171, 87,
-226,189,123,247,102, 2,216, 82,158, 64, 94, 94,222,241,249,243,231, 91,127,244,209, 71,166,255,113,227,198, 13,236,217,179, 7,
- 82,169,180,216,186,125,251,246,197,184,113,227,108,181, 90,109,185,191, 73, 78, 78, 78,157,239,220,185,227,143,252, 14, 94, 66,
-147,209,122,252,248,177, 77, 78, 78,142,141, 76, 38,179,113,117,117,149,155,204,214, 71, 31,125,100,195,229,114,219,128, 5, 21,
-121,145,162, 70,199,156,121,149, 93,223, 92,179, 85, 98, 86,153, 57,180,138, 25,173,222,189,123, 95, 69, 25, 61,169,116, 25,201,
- 16,194, 8, 49,135,130,132, 83,196,108,129, 1, 55, 59, 5, 84, 37, 58,240,150,246, 99, 40, 16, 8,192,225,112,160,213,106,145,
-158,158,110,145, 41,176,178,178,130, 76, 38,131, 74,165,130,193, 96,128, 72, 36, 50,153, 17, 88, 89, 89,129,199,227,129,199,227,
- 65, 36, 18,189, 17, 77, 42, 25,205,225,243,249,144, 74,165, 72, 76, 76, 68,116,116, 52, 24,134,129, 76, 38,131, 84, 42,133, 64,
- 32, 64, 66, 66, 2, 18, 18, 18, 64, 8,129, 84, 42,133, 84, 42,133, 37, 13,174,141, 70, 99,169, 63,254,122,189,222,162,136,150,
-193, 96, 64, 88, 88, 24, 98, 98, 98, 32, 18,137, 10,247, 85, 40, 20,226,229,203,151, 72, 74, 74,130, 68, 34,129,149,149, 21,172,
-173,173,205,214, 53,237,139, 92, 46,135, 88, 44, 70,102,102, 38,148, 74,101,225, 49,181,178,178,130, 84, 42, 69,118,118, 54, 82,
- 82, 82,202,221,119,163,209,136,132,132, 4,164,166,166, 34, 54, 54, 22,105,105,105,133,102,171, 32,106, 84,181,192, 78, 78, 14,
-210,211,211, 11, 35,145,101, 77,230,192, 48, 12,114,115,115,113,231,206, 29,138, 97, 24,100,101,101, 49,169, 73, 73,198,207, 18,
- 4, 56,182,248, 7,114,240,236, 3,245,254,211,193,170,163,127, 60, 81,109, 57,250, 72, 37, 10, 92, 98,120, 39,143,161,173, 1,
-214,208,243,186,165,229,233,133,169, 58,190,181,115, 64, 23,224,245, 25,128,230, 2, 34, 91,180,168, 87, 19,209,153, 70,233,179,
-100,173, 8, 20,186, 99,139,183,173, 89,154, 70, 94,215,212, 92,189, 48, 74,231,104,229,215,160, 9,146,147,147, 33, 20, 10, 33,
- 20, 10,209,180,117, 23,188, 78, 55, 74,158,198,171, 36, 32,232,102,150,230,159,212,146,201,100, 45,219,180,105, 67, 21,213,236,
-217,179, 39, 40,138,170, 15,192,215,162,135,220,198, 90, 2,232, 36, 45,192, 37,211,159, 38, 42,221,142, 61, 86,123,247,249,112,
-128,221,247, 23, 83,252,194,146, 52, 94, 32,250, 47, 64,116, 77,170, 96,182,218,203,229,242,147,155, 54,109,242, 18,137, 68,103,
- 0,180,173,140,136, 76,204,217,182, 96,242,208,106,182, 38,147,165, 87, 2, 92, 49,192, 19, 3, 92, 49, 92,156, 28,176,108, 92,
- 87, 59,137,136,119,212, 2,195,186,127,203,150, 45,142, 37, 77,150,105,106,220,184, 49, 22, 46, 92,232,104,103,103,183,239, 29,
-255, 88,118,179,182,182,222,219,165, 75,151, 59, 9,114,249,184,196, 38, 77, 4,127, 88, 91,103,119,206,206,182,246,124,252, 88,
-231, 3, 60, 2,176, 53, 46, 46,174,135, 5, 38,235, 99, 43, 43,171,224,206,157, 59,235,228,114,121,204,186,117,235, 62,155, 50,
-101, 10, 86,173, 90,133,249,243,231,255, 8,224, 83, 0, 95,197,197,197,185, 85,100,178, 0, 32, 41, 41,105,216,156, 57,115,210,
-210,210,210, 0, 0,245,235,215, 71, 86, 86, 22,102,205,154,133,207, 63,255, 28, 0,208,168, 81, 35, 16, 66,144,156,156,140, 53,
-107,214, 36, 39, 37, 37,141,174,224,217, 30,123,248,240,225,230, 58,157,206, 29,249,213,131,194,172,172, 44,171,140,140, 12,185,
- 78,167,147, 50, 12, 35,181,177,177,145, 1,144,140, 28, 57,146,251,244,233, 83, 63,131,193, 16,207,122,171, 63, 41,207,139, 84,
- 6,138,162, 78, 85, 37,114, 85, 90, 68,172, 12,202,143,104,245,238,221,155, 42,250, 89, 44, 98, 68,225, 97, 76,208, 53,216, 5,
- 52, 41, 22,205,146,112, 40,136,173,172,241, 58, 54, 26,124, 80, 79,222,150,209,202,204,204,196,103,159,125,166, 26, 54,108, 88,
- 58,195, 48, 3,204, 53, 5,214,214,214,176,182,182,198,211,167, 79, 73,255,254,253,147,215,173, 91,167, 42,106,180,158, 63,127,
- 78,186,117,235,150,178,104,209,162,188,242,140,150, 41,162,181,114,229, 74, 85,135, 14, 29, 82,159, 60,121, 66, 76,102, 74, 38,
-147, 97,205,154, 53,170,142, 29, 59, 38,223,191,127,159,152,230, 89, 18,209,162,105,186,208,104, 21,221,134,166,105, 48, 12, 99,
-145,209, 82, 40, 20,195,122,245,234,149, 28, 30, 30, 78, 76,251,105,109,109,141,117,235,214,169,186,118,237,154,252,228,201, 19,
- 98,154,103,101,101,101,182, 25, 52,125,191, 92, 46,135,149,149, 21,158, 62,125, 74,186,117,235,150,188,113,227, 70,117,209,249,
- 97, 97, 97,164,111,223,190,201,185,185,185,195,202, 51, 47,166,234, 60,131,193, 0,181, 90,141,180,180, 52,196,198,198, 22, 86,
- 29,170,164, 86, 61,134, 14,238,211, 80,165, 82, 41,159, 62,127, 17, 83,191,158,191,147, 74,165, 82, 70,199,196, 60, 7, 22, 51,
-229,104, 15, 8, 8, 8, 72,255,236,179,207, 84,153,153,153, 85, 54, 90, 2,129, 32,156,203,229,146,182,109,219, 18,173, 86, 75,
- 98, 99, 99,245,105,153,153, 6,223,111,191, 37, 79,102,204,160,196, 65, 65, 66,153, 76, 70, 21,104,210,175, 94,189, 98,196, 98,
-113,248,223,254, 36,162, 25, 23, 80,164,205,245, 23,121, 54, 93,251, 12, 17, 80, 73,247, 0, 93, 30, 32,180, 5,132,182,224, 74,
-237,241, 65,219, 70,156,221,119,114, 92, 64,152, 86,224, 11,221, 43,212,228, 17,103,128,105,123,225,185,218,182,205,192,169,130,
-140,140, 12,112, 56,156, 66, 83, 36,145, 74,209,249,195,145,244,207,247, 52, 46, 0,105, 13,138,227,110,193,189, 62,123,193,130,
- 5,252,204,204, 76,208, 52,253,167,166, 68,130,137, 19, 39, 10,173,172,172,230,155,253,240, 59,236,199, 7, 79,216, 2, 32,159,
- 63, 75, 82,187, 29,127,164,242,249, 98,229, 78,113, 64,163,230,152,208,193, 73,188,242, 84, 74, 64,104,172,170, 38, 96,156, 1,
-131,182,105, 37,204, 86, 91,185, 92,126, 42, 40, 40, 72,210,179,103, 79,172, 89,179, 70, 42, 22,139,207, 84,230,193,175,200, 51,
- 78, 89,186,241,151,228,135,235,187, 3, 58, 69,190,193, 42, 50,165,228, 49, 88,184,243, 82,182, 94, 79,134,154,171,169, 82,169,
- 70,125,250,233,167,233, 71,143, 30,125,195,100,137, 68, 34, 68, 70, 70, 98,249,242,229, 25, 25, 25, 25,163,223,165,201,154, 50,
-101,202,242,184,184, 56,159, 11, 23, 46,112, 83, 83, 83,157,214,254,244, 83,246,145,236,236,140, 21,143, 31, 63,251,170, 94,189,
-186,115, 27, 52, 24, 93, 78,234,135, 82, 77,214,228,201,147,247,199,197,197, 53,190,120,241, 34, 47, 53, 53,213,125,242,228,201,
- 88,189,122, 53,230,207,159,191, 29,192, 4,152,215,225,229,207, 0,130, 78,247, 44, 51, 51,179,119,247,238,221,179, 50, 51, 51,
-209,160, 65, 3,244,233,211, 7, 46, 46, 46,112,115,115, 67,191,126,253,224,237,237,141,244,244,116, 12, 29, 58, 52, 35, 53, 53,
-181, 59,128, 87,229,105,166,167,167, 71,236,219,183,239,249,212,169, 83, 27,199,197,197,249, 1,176,207,205,205,149,230,230,230,
- 10,181, 90,173,216,214,214,214,182, 81,163, 70, 14,227,199,143,151, 61,120,240,192, 47, 46, 46, 46, 15, 64, 52,107,175, 10, 77,
- 86,153, 94, 4, 64,106,129,225,209,150,248, 76,173, 96,153,185,219,150,250,183, 25,235,149, 52, 91, 69,167, 55,170, 14, 75,191,
- 24,129,133,123, 14,239, 86, 11, 60,234,192,218,167, 33, 36, 34, 17,196, 2, 1,196,182,246,208, 48, 12,126,138, 76, 82, 42, 8,
-153,111,233, 1, 45,249, 67, 72, 81, 20, 54,111,222,108,104,217,178,165,250,210,165, 75,155, 84, 42,149, 7,128,223, 45, 49, 5,
- 27, 55,110, 84, 78,159, 62, 61, 52, 37, 37,165,161, 72, 36,210,154,230,111,218,180, 73, 57,114,228,200,199,113,113,113,141, 37,
- 18,137,178,172,246, 89, 69,141,150, 80, 40,212,164,164,164, 52, 31, 59,118,108,248,214,173, 91, 21, 18,137, 4, 82,169, 20, 66,
-161, 80,155,146,146,210,240,179,207, 62, 11, 93,189,122,181, 82, 44, 22, 67, 42,149, 90, 84, 45, 71, 8,121,195, 80, 21,157,111,
- 46, 6,131,225, 82, 74, 74, 74,195,233,211,167, 63,248,254,251,239, 21, 38, 3, 84,180,140,107,215,174, 85,202,100, 50,139, 34,
- 90,166,245,164, 82, 41, 54,108,216,160,156, 58,117,106,104, 74, 74, 74, 67,161, 80,168, 45, 50, 95, 49,101,202,148, 7, 41, 41,
- 41, 13, 13, 6,195,165,114,222,240,140, 57, 57, 57,224,114,185,120,252,248,177,134,207,231,131,166,105,188,124,249,178,208,104,
-217,217,217,249, 55,172, 95,207,247,151,253,135,175,138,249, 66, 97,203,230, 77,253, 94, 69, 69,199, 17, 66, 69, 85, 80,212,223,
- 85, 42,149,199,165, 75,151, 54,181,108,217, 82,189,121,243,102, 67, 89,145, 45,115,208,104, 52, 87, 67, 66, 66,244, 34,145,136,
- 74, 76, 76, 52,112, 56, 28, 24,141, 70,162,105,222, 92, 83,255,251,239,201,211,185,115, 41, 43,169,148,203,231,243, 33,145, 72,
-168,179,103,207,106,149, 74,229,213,191,223,104, 65, 2, 10,226, 23, 41, 26,185,136, 54, 80,120,254,123,190,201, 18,217, 0, 34,
- 91, 64,100,139,106,213,220,113, 47, 82, 41, 7, 13, 1,140,102,228, 16, 35, 68, 10, 10,146,199,201,144,243, 4, 98, 42, 41, 41,
-169,208, 16,153, 38,175, 58,126, 8,137,206,147,129, 34, 66,112, 96, 73, 10,146,222,246,246,246,220,196,196,196, 55, 52,253,253,
-253, 57,122,189,222,252,212, 46, 9, 70, 87,128,153,252, 60, 73,237,250, 91,168,194,103,198,138,159,197, 98, 99, 22, 16,180, 17,
- 1,181,220, 48, 99, 96, 35,193,215,199, 83, 3,238, 71, 41,107,129, 67, 38,128,201,115,180,160,156,109,228,114,249,153,251,247,
-239, 75,228,114, 57, 94,189,122,133,230,205,155, 99,199,142, 29, 18,137, 68,114, 26,128, 69,237,241,238, 38, 35, 58, 47,215,216,
-114,246,225,152,164,135,137,134, 98, 38, 43, 85, 65,240,233,119,199,179, 50,115,212, 3,238,196,150,125,255,148,194,131,172,172,
-172,110,243,231,207, 79, 79, 77, 77, 45,102,178,162,163,163, 77,134,160, 3,128, 39,239,234,199,210,218,218,122,248,138, 21, 43,
-112,255,254,125,244,236,217, 19,215,174, 93, 67, 70, 70, 6, 14,156, 57,243, 98,223,139, 23, 95,153,218,108,149,145,250,161, 84,
-172,172,172,190, 88,177, 98, 5,130,130,130, 10, 53,211,211,211,177, 98,197,138, 56, 0,147, 44, 53, 89, 38, 82, 82, 82,238, 61,
-123,246,172,123,131, 6, 13,194, 54,109,218, 20,231,234,234,202,140, 31, 63, 30,159,126,250, 41, 28, 29, 29,141, 27, 54,108,136,
-105,219,182,237,227,136,136,136, 46, 74,165,242,145, 57,239, 2,105,105,105,183,118,236,216,113,167, 83,167, 78,146, 81,163, 70,
- 57, 30, 59,118,204, 94,169, 84,186, 9,133, 66, 39,173, 86, 43, 8, 11, 11,227, 28, 57,114,196,229,233,211,167,145,106,181,250,
- 94,101,203,254, 95,131,162,168,251, 20, 69,157,162, 40,234, 98,137,207,251,229, 45,179, 96,219,178,254, 46,119,189, 18,197,220,
- 81, 98, 50,159,225,181,176,120, 98, 61,185,242,214,136, 22, 36,105,124, 27,146, 60,196,143,220,104,111, 71,198,214,166, 20,163,
- 42,153,222, 65,165, 82, 21, 78, 71,143, 30, 37, 46, 46, 46, 10,185, 92,110,113,122, 7, 23, 23,151,228,156,156, 28,210,172, 89,
-179, 12, 71, 71,199,194, 84, 4,174,174,174,201, 10,133,130,180,104,209, 34,195,201,201,105, 3, 10, 26,101,187,187,187,199, 18,
- 66,136,167,167,103, 66, 89,122, 6,131,129,184,184,184,152,122,232,241,236,236,236,126, 8, 12, 12,204, 72, 78, 78, 38,174,174,
-174,133,169, 19, 28, 29, 29,215, 52,111,222,188,228,252,138,202, 27, 27, 23, 23, 71,226,226,226, 72,245,234,213, 19,138,206,143,
-142,142, 38,209,209,209,196,221,221,221,226,244, 14,142,142,142,171, 75, 41, 75,165,202,232,225,225,145,172, 82,169, 72,171, 86,
-173,138, 29, 83, 15, 15,143,100,181, 90,109,154,111, 86,122, 7,177, 88, 60, 65, 36, 18, 37,136, 68,162, 4,161, 80,184,188, 70,
-141, 26, 41,135, 14, 29, 34, 27, 54,108, 48,117, 73,135,163,127,223,150,117, 90,141,254,202,209,191,223, 23, 85, 73,239, 32,151,
-203,255,112,113,113, 81, 28, 61,122,180,216,245,165, 82,169,204, 78,239, 32, 22,139,227,242,242,242,152,228,228,100,253,205,155,
- 55,149, 65, 65, 65,202,199,143, 31, 43, 35, 35, 35, 85,233, 41, 41,186,228,228,100, 85,118,118,182, 38, 52, 52, 84, 35,145,188,
-155,244, 14,100,135,119, 29,242,131,239,241,136,165, 94, 79,167,183,147,168, 31, 45,107, 72,200,255, 62, 34,228,244,167,132, 92,
-154, 77,238,109, 31, 79, 90,121, 9,141, 55,103, 85,127, 78,182,249,252,102, 78, 74, 6,178,163,126, 29,242,131,239,233, 23, 75,
-188,158,142,106,235,166,254,105,235, 6,114,247,238, 93,242,248,241, 99,242,234,213, 43,114,250,247, 67,164, 85, 45, 73,190,230,
- 15,190,199, 45, 76,243,208, 90, 40, 20,230,173, 91,183,142,220,185,115,167, 80,243,248,241,227, 68, 34,145, 40, 1,243,122, 45,
- 19,128, 34, 63,248,127,104,216,234,115,253,235,174,178,220,244,147,179, 9,121,180,155,144, 29, 1,132,236, 10, 36,228, 80, 47,
- 66, 78,140, 38,119, 54, 12, 36,173,189,248,122,178,205,231, 26,217,238,111,118, 99,123, 30,143,151,115,244,232, 81,146,144,144,
- 64,174, 93,187, 70,130,130,130, 72,120,120, 56,137,137,137, 33,167, 78,157, 34, 60, 30, 79,141, 74, 12, 91, 22,232, 12,207, 46,
-117,249,137,161, 43, 91, 19,114,108, 40, 73,221, 55,156,244,174, 39,207,104, 81,189, 74,249,232, 26,217,219,219,167,157, 58,117,
-138, 68, 70, 70,146,171, 87,175, 18, 39, 39,167, 52, 0, 1,239,250, 7,177, 75,151, 46,119, 9, 33,193, 61,123,246, 12, 6,112,
-182, 75,151, 46,193,175, 95,191, 14,110,222,188,249, 29,148,159,250,161, 76, 58,119,238,172, 35,132,144,158, 61,123, 18, 0, 9,
- 93,186,116, 33,175, 95,191, 38,205,155, 55,215,190,165, 98,115, 0,140,230,241,120, 63,217,217,217, 93,182,181,181,189,196,225,
-112,118, 0, 24,129,202,231,227,226, 0,112, 3,224, 15,160,105,193,228, 87, 48,143,237,113,248, 31,161, 48,189,131, 57, 12,244,
- 66,235, 49,181,168,171,195,106, 34,119,104, 77,228,125, 82,155, 50, 39, 97,105,151,178,140, 22,195, 48,228,249,243,231,164, 99,
-199,142, 10,169, 84, 26, 15,243, 19,150, 22,211,116,112,112, 8,114,114,114,122, 35,137,102,145,249,197, 18,150, 58, 57, 57,221,
-114,117,117, 77,118,116,116, 12, 41, 77,211,193,193, 33,200,213,213, 53,217,193,193,161, 88,114, 79, 14,135,211,211,193,193, 33,
-190,228,124, 46,151,219,201,201,201, 41,182,228,252, 50,246, 29, 46, 46, 46,177, 9, 9, 9, 36, 53, 53,149,120,120,120, 36,148,
- 52, 96, 73, 73, 73,197, 12,152, 57,154, 21,149,165,156, 50,150,170,105,198, 49,173,204,121, 55,225, 93,173, 90,181,148,181,107,
-215, 18,153, 76,150, 82,116,129, 79,187, 79, 22,220,125,145,151,243,233,156, 31, 14,149,146,176,212,220,228,160,221,165, 82,105,
-124,199,142, 29, 21,207,159, 63, 39, 12,195, 16,134, 97,202, 50, 90,165,105,246,104,218,180,105,122, 90, 90,154, 49, 55, 55,215,
- 16, 27, 27,171,121,253,250,181,106,217,178,101,186,212,212, 84,117, 94, 94,158,246,225,195,135, 26, 87, 87,215, 84, 0, 61, 44,
- 61, 71,149,253,237, 42, 89,125, 70,182,251,181, 38,219,252, 78,133, 47,242, 12, 27, 29, 40,213, 4,175,237, 73,200,165,217,228,
-206, 15,159,146,150, 94,130,124, 67,180,221,247, 12,249,217,187, 29,217, 88, 75, 96,150,230, 79,181,219,146,237,190,103,158, 46,
-244, 12,251,168,137,163,118,255,238,237,228,229,203,151,228,248,145,125,164, 69,205, 2,147,181,205,239, 60,249,193,175,163, 57,
-154,165,153,173,157, 59,119,146,151, 47, 95,146,223,126,251,205, 92,147,213,165, 52,163, 53,175,139, 44,235,211, 64,145,102,104,
- 35,129,182, 95, 0, 95,215,173, 14,223,208,202,147,107,108,232, 74, 51,126,142, 32,221,124,196, 26,178,205,231, 26,217,230,215,
-221,220,114, 10, 4,130, 24, 20,201,169, 83,114, 18, 10,133,169,229, 24,173, 46, 21,154, 45,111, 97,226, 31, 75, 59,145, 62, 13,
-228,233,102,154,172,138,174,165, 70, 14, 14, 14,105,187,118,237, 34,206,206,206,169,102,154,172,191,252,250,180,182,182,222,155,
-151,151, 23,124,238,220,185,224, 46, 93,186, 4,239,221,187, 55,248,198,141, 27,193, 18,137,100,175, 41, 56, 81,210,108,249,189,
-249,252,239, 82, 34,162, 21,156,155,155, 75,206,157, 59, 71,186,116,233, 66,246,238,221, 75,110,220,184, 65, 36, 18, 73,112,101,
-203,249, 87,236, 59,171,249,159,102,124, 41,147,101, 70,235, 45,158, 8,162, 86,171,201,172, 89,179,180, 34,145, 72,201,231,243,
- 45, 29,130,231,189,190, 8, 29, 28, 28,110, 57, 59, 59, 39, 59, 59, 59, 23, 51,123, 69,231, 59, 56, 56,132,252,203,111, 64,111,
- 62,159, 31,205,227,241,138, 15,193,227,223,183,101,237,214,163,230, 59, 7,244,253,160,138,229,228,243,249,252,121, 34,145, 72,
- 57,107,214, 44,109, 94, 94,158, 37, 70, 11, 0,186, 74, 36,146,248, 61,123,246,168, 94,188,120,161,207,200,200, 48,220,189,123,
- 87, 31, 20, 20,164, 93,188,120,113,174, 68, 34,137, 71,217,105, 9,254,150,227, 73, 54,214, 18,152,204,214,163,249,158,225,125,
-234, 73,116, 59,102,118, 35, 45,107,148, 48, 89,101,103,114, 47, 93,179,192,108, 61,248,218, 35,188,163,183,204,176, 98,254, 12,
-210,162,166,184,184,201,178, 64,179,164,217,146, 72, 36,185,139, 22, 45,178, 36,146, 85,220, 16,254,228,227, 65,182,251,238,205,
- 55, 81, 21, 76, 63,248,252, 72, 54,251,120,252, 83,238,163, 64,103,120,118,246, 22, 62,177, 32,146,101, 78, 57, 27,217,218,218,
-134, 89, 16,201,250, 59,246,189,219,196,137, 19,131, 95,191,126, 29,252,234,213,171,224, 27, 55,110, 4,127,248,225,135,193, 0,
-186, 21, 89,167,208,108,233,250,247,215, 52,162,233, 25, 21,104,126, 60,113,226, 68,242,250,245,107,242,234,213, 43,114,227,198,
- 13,242,225,135, 31, 18, 88, 54,124, 15,107,138, 88,163,245, 78, 34, 90,127,245,128,159, 93, 0, 92, 44, 58, 67, 36, 18, 37,171,
-213,106, 71,153, 76,246,123, 94, 94,222, 84,228,119,139,172,146,230, 95, 81, 78, 86,243, 95,161,233, 42,147,201, 54,229,229,229,
-125, 40, 18,137, 82,213,106,181,179, 5,154, 54, 66,161,112,134, 72, 36,234,168, 84, 42,189, 1, 64, 42,149, 62,215,104, 52,151,
- 85, 42,213,122, 0, 89,239,122,223,201,198, 90, 2, 8, 4, 77, 65, 48, 55, 56, 70, 81,115,197,185, 12,207,153,157,108, 99, 90,
-213,150, 70,130,199,124, 7, 74,115,143, 26, 19,173,177, 88, 83, 76, 53,135,145, 55,247, 94,148,178,198,119, 23,114, 61,191,232,
- 40,139,105, 85, 75, 22, 3,130,239, 32, 84,222,182, 84,179,164,217,146, 74,165,123, 20, 10,197, 56, 0,151, 45,221,119,114,216,
-143, 15,133,190, 26,244,156,122, 32,229, 12,225, 67,136, 18, 52,231, 49,146,144, 76, 45, 14,211,177,247,209,223,174,217, 77, 38,
-147, 13,247,245,245,173,245,244,233,211, 87, 74,165,242, 87, 0,231, 75,172, 67,249, 2, 29, 37, 92,110, 67,149,193,112, 45, 12,
- 8,170, 64,243, 99,153, 76,246,133,175,175,111,192,211,167, 79,159, 40,149,202,181, 0, 14,176,231,232, 95,165,249,175, 52, 90,
-127,123, 22,101,211,143, 93, 94, 94, 30,123, 6, 88,254,106, 18,243,242,242,250, 23, 92,119,150,110,155,165,209,104, 22,106, 52,
-154,133, 40,104, 63,146,153,153,249,143,106,180, 74, 77,123,165, 37, 27,107, 5, 65, 32, 88,217,196, 67, 60,245,232, 68,177, 18,
-132,138, 3,143,217, 80,129,201,170, 72,243, 30,196,250,149,205, 61,197,159,255, 54, 65,172, 4, 65, 18, 8,214, 87, 96,178,204,
-229,166, 66,161,168, 89,233,125, 30, 20,166, 3, 16, 73,128, 40, 44, 46,231, 69,113, 49, 8,197, 54, 50,126,151,156,207,203,203,
- 59,127,239,222,189,114,127,131,194,129, 75, 48,152,221, 25,224, 64, 94, 94,222,129, 10, 52, 89, 88,254,113,112,217, 67,192,194,
- 82,241, 75,201, 63,181, 96,212,180, 87, 90,114,216,239, 62,210, 56,179, 64,163, 38, 96,136,134,194,144, 68, 77,139,214, 86, 81,
-243, 46,210,168,233,224,192, 27, 2, 67, 4,242,180, 73,212,164,104,237, 63,102,191, 1,130,197,172,145, 98, 97, 97,249,199, 48,
- 30,197,123, 26, 22,254,207, 26, 45, 22,150,247,156,130, 40, 79, 92,193,244,143,213,100, 97, 97, 97,249, 15, 26, 46, 80, 40,187,
- 65,155, 37,117,175,149,105, 20,119,145,213,172,148, 38, 7,128, 53, 0, 27,228, 15,227, 96,234, 38, 92, 81,154,141, 15, 0,232,
-217,227,201,106,178,154,172, 38,171,201,106,190, 99,205,138,180,223,199,182, 95,165,101,134,223,241,174,122, 29,178,154,149,167,
- 59,123, 60, 89, 77, 86,147,213,100, 53, 89,205,127,169,230,191, 14, 66, 72,165, 19,177,177,188, 27, 68,236, 33, 96, 97, 97, 97,
- 97, 97,249,199,209,184,224,211, 21,249,209, 45, 87,211,130,119,218, 70, 75,108, 95,215, 21, 92,186, 1,197, 16, 95, 0, 32, 52,
- 21, 14, 3,243, 80,149,254, 34,177,170,218, 50, 55,111, 59, 2,193, 97, 10,218, 65,121, 9,207, 51,170,170, 87,207,219,170,191,
-179,131,124,120, 82,122,246,158, 39,207,242,142, 89,178,173,181,181,167,181,200,206,118,160, 70,167,175, 39,224,243, 99,116, 89,
- 57, 59, 50, 51, 95,229, 86,162, 24,118,229, 45, 92,188,152, 80, 39, 19, 67, 40,190, 68, 71,219, 91,241,169, 60,228,145,188, 68,
- 25,227,149, 21, 73,142, 28, 25, 68, 44, 61, 55, 20,141, 14, 82,185,188,137, 80, 36,105, 46,145,219,214,101, 8,144,145, 28, 31,
-165,213, 27,110, 24,181,202, 96,194,224,202,219, 56, 87, 44, 44, 44, 44, 44, 44,255, 2,163, 21, 2,160, 23,242,219,104, 85,220,
- 24,222,211,191,205,125,145, 72,236, 5, 0, 12, 33, 96, 8,160,200,201, 10, 78,122, 21,212, 29, 0, 28,106, 52, 62,199, 19, 89,
- 53, 97, 72,254,114, 35, 3, 24,116,234,200,156,232,187,205,204, 41,145,212,209,251,163, 78, 93, 58,247,239,221,187,151, 79,253,
-122,245,107, 3,192,163,199,143, 34, 78,158, 60,245,236,210, 69,234,168, 34,245,249,111, 85,217, 99, 2,209, 55, 77,155, 54,106,
- 19, 20, 20,178, 20,192,228,170, 30, 65,123,123,217,212,243,255,155,213,174,115,255, 53, 82,192, 50,163, 37,178,179, 29,216,175,
- 79,143, 70, 95, 78,155, 72,127, 58,235, 91,175,251, 55,175,172,146,185, 6,100, 17, 70,127, 94,145, 60,228,122,121, 3, 39,151,
-244,143,101, 25,172, 95, 51,206,210, 27,118,181,180, 85,101, 68, 12, 33,140,113, 8, 69, 81,224, 8, 36, 71, 28,107,181, 57,100,
-211, 97,102, 38, 0,179,123,140, 89,185,250,119,113,114,117, 63, 58,228,147, 25, 34,137,181, 51, 23, 28, 62, 0, 10, 9, 81, 97,
-184,116, 96,133,237,231, 75,118, 54,190,249, 48,218,240,199,255,182,168, 41, 62,175,191, 50,241, 41,155, 75,133,133,133,133,133,
-229,191,204,169, 2,115,117,170,228,130, 50,141,150, 72, 36,246,186,115,229,164,221,111, 55, 98, 1, 0, 93, 26,187,224,171,101,
-155,186,237,221, 24,244, 12, 0, 90,118,234,237,189,116,222, 52,220,122,146, 2, 66, 8, 26,213,177,199, 7,253, 6,153,103, 60,
-156,253,154, 13, 28, 56, 96,216,172, 89, 95,244,125,249,242,101,212,254,253,251,175, 3, 64,219,118,237,234,124,251,237,183,131,
-215,216,218, 9, 15, 30,249, 95,188, 58, 57,236,126,101,246, 86,228, 86,171,154, 79,221,154,195, 15,254,188,137,238,208,125,192,
-208, 40, 40, 86,168, 19, 94,197,155,179,173,131,131,195,116, 30,143,103, 13, 0, 12,243,167,255,209,233,136, 11, 0, 24,140,140,
-220,214,205, 39,151,195, 23, 25,133, 66,254,211,220,188,188, 61, 57,241, 97, 63,149,167,169,209,235, 3, 62,159, 52,134,126,240,
- 42, 29, 94, 1,109, 57, 27, 86,124, 13,198,168,183,157, 49,111,217,192,160,187, 7,161, 72,198, 85, 51,119,141, 87,114, 70,181,
-106, 45, 56,223,172,144,117,165, 40,140,246,108,249,201,135, 75,119, 31,225, 53,173, 99, 5,141,158,193,153,224,244,150, 63,172,
-255,102,245,205, 31,122,157, 0,176, 29,192, 31, 0, 42, 52,117,118,246,118,191, 78,159,191, 94,166,208,254,153,166,168,192,100,
-225,199, 61,135, 17, 26,203,192,215,199,151,235, 50,125,149,108,251,178,241,187,149,249, 99,119,177,176,176,176,176,176,252, 87,
- 73, 68,241,222,134, 59, 42, 52, 90, 0, 32, 19,115,241,236,117, 18, 0,192, 70, 12, 76,157, 48, 10,233,105,169,222, 90, 3,131,
- 79, 70,141, 64, 72,120, 34,158, 69,166,130, 16, 2,111,119,137,217,165,225,128,105,250,201,216, 79,218,159, 59,127,254,222,130,
-249, 11,126,161, 40,220, 6,128,237, 59,126,108,185,112,209,194,113, 35, 70,141,232,122,228,200,145, 39, 0, 42,101,180,184,148,
-124,211,234,149,203, 5,113,105,106,245,244, 89,115,153, 47,102, 78,223, 0, 96,128, 89, 78,134,199,179,142,139,139,147,209,116,
-241,230,107,223, 45,159,123,173,107,255, 53, 47,162, 98,178, 30,156, 59,126,188,153,191,191, 63,226,226,147, 90,175,250,126, 91,
-195, 51,231,196, 99,114,115, 84,253,149,105, 97,165, 14,218, 44,228,241,158, 44, 89,245, 67, 35,198,166, 14,253,213,184,158, 8,
-168,237,134,248,148, 44,180,235,222,151, 27,124,255,126, 55,192,108,163, 85, 50, 65,227, 64, 45,147,210,240,219, 61,119, 59,127,
-216,202,173, 41, 77,115,144,167,210, 35, 53, 91, 3, 35, 3,180,245,179, 70,143,189,223,115, 51, 20,250,143,150,253, 47,246,163,
-219, 27,123, 39,171,179, 19,166, 0, 56, 90,254,215, 16, 59,119, 39, 43, 60,139,205, 45,213,100, 41,212, 6, 0, 0,159, 99, 4,
- 5, 98,207,222, 95, 44, 44, 44, 44, 44,255,113, 74,237,117, 8, 20,140, 74,126,242,228,201, 82,219,239, 24,141, 4,207, 34, 19,
-241, 44, 50, 17,247,194, 83,161, 35, 60,108, 88,181, 4,107, 87, 44, 66,134,138,198,111,183, 98,241, 60, 50, 9,207, 35,147,144,
-150, 89,106,166,247, 98, 85, 74,107, 86,136, 27,175, 95,111,181,186, 91, 59,105, 7, 59, 91, 91,219, 23, 79,126, 81, 44,156,153,
-236,183,228,243, 88, 62, 79, 43,140,147,202,164,173, 14, 31, 62,228,239,236,232, 36,149,201,228,179, 37,213, 26,238,180,182,110,
- 96, 93,158,102, 73,196, 78,190,125,251,246,234,209,201,197,197,153,153,184, 33, 56,188,158,159,175,190,110,157,186,173,197, 78,
-117,251,150,179, 89,161, 38,195, 48,160,105, 26,201,201,201, 72, 72, 72,192,235,215,175,241,252,249,115,196,198, 70, 37, 51,132,
-240,140, 96,104, 87, 87,119,112,185, 2,120,213,240,196, 15, 27, 86, 72,150, 45,254,170,185, 72, 42, 56, 86,194, 8, 21,106,170,
- 51, 50,143,156, 62,123, 62,254,204,254, 31,140, 0,144,146,153,135, 75,247, 95, 34,228,105,172,165, 39,178,100, 10,135, 26,241,
-209, 47,115, 12,145,167, 56, 75,191,254, 34,246,198,141,155, 81,217,185, 90,228, 42,117, 80,170,245,208,104,141,208, 27, 25,120,
- 58,138,240,251,220,122, 56,126,249,161, 51, 69, 81,235, 43, 58,158, 26,141,222,216,198, 87,138,161, 29,171,195,215, 93,138,248,
-103,183, 49,125,254,122, 4,189,214, 32, 51, 51, 11,122, 69, 26,152,188, 56,164, 69,134,192, 96, 52,146,138,206,251, 91,130,213,
-100, 53, 89, 77, 86,147,213,252, 23,107,150,229, 69,222, 19,118,148, 50,161,208,104,149, 69, 68,108, 6,158,189, 78, 66, 19,223,
-106,168, 93,195, 21,247,158,103,226,215, 75,177,216,121, 46, 26,151, 66, 83,193,112,229, 72,202, 1, 94, 68, 37,227, 69,116, 90,
-133,249,179, 57, 66,222,144,207, 63,207,158, 85,223, 63,167,197,149, 51, 83, 81,205,241,133,255,156, 57, 89, 83, 57, 66,222, 16,
-219,234,242,253,115,103,205, 24, 46,151, 72, 4, 90,141, 22,181,106,122,138,166, 77,153, 58,134,178, 21,238, 55,119, 47,229,213,
-252,108,133, 98,241, 79,203, 22,207, 22,174,255,237, 69,140, 66, 11,197,209,219,201,175,190,152,187, 48,131,203, 19,253, 32,175,
-230,103,107,174,150, 94,175,135, 70,163,129, 86,171,133, 78,167, 67,124,108, 88,223, 63,126,251,178,123,205,234,118,221,133, 34,
- 17, 8,128, 28,149, 1,175, 19,149,232,216,185, 43,167, 73,227,198, 1, 50, 87,191,177,165,105,101,103, 71,103, 51,132, 35, 63,
-249,251, 62,206,161, 11, 15,240,203,201,251, 56,118,249, 1,238, 93, 61, 99, 32,140,190,112,252, 47,153,107, 29,111,153,107,253,
-104,153, 91,131,228,194,169, 90,189,160,114,143, 41,135, 38, 29, 59,119,185, 56, 97,242,180, 43,202,220,244,148,159, 54, 45,137,
- 79, 77,136, 10, 19,242, 41,131, 68,200, 65,158,218,128,221,127, 36, 96,224,138, 80, 60,141,201, 3, 33,164,194, 1,188, 25, 96,
-230,144,177, 95, 26,245, 58, 29,124, 60,100,216,183, 99, 37,250,118,108,136, 78,245,109,209,172,182, 20, 18,174, 6, 79,194,159,
-225,192,190,221, 6,134,161,191, 96, 95,100, 88, 88, 88, 88, 88,216,136, 86,225,228, 90,116, 65,153, 85,135,106,181, 42,114,192,
-144, 17,112,117,114,145,245,235, 48,154, 31, 28,145,133,212,196,104,188,124,254, 24, 74,181, 30,124,219,154,128,200, 5, 53,188,
- 60,241,240,217, 49,221,198,213,167,242, 24,131, 38,178, 44,189,190,125, 93,221, 95,134, 83,244,234, 85, 30,119,158, 63,203,108,
-178,111,254, 46, 12, 27, 38,115, 88,189,202,227, 78,212, 43, 41, 45, 17,145, 86, 99, 70, 13,165,104,138, 96,206,156, 89,232,215,
-187, 7, 62, 25, 51,146,218,179,103,119,139, 44, 51,247,146, 1,111,243,188,175,151, 8,146,179, 12,218,123,207,243, 52, 18,169,
- 88,124,243, 69,158, 34,192,203, 67,220,179,255,232,132, 83,135,127, 90, 15, 96,148, 57, 90, 38,131,165,215,235,161,211,233, 0,
-192, 8, 0, 52,157,255,153,158,171, 69, 74,150, 6,201, 89, 26, 24,140, 12,250, 15, 25, 37,190, 31, 20, 58, 10, 64, 25,237,181,
- 24, 70,111,208,227,232,133, 16,196,223, 63,194, 80, 52, 39,187, 72, 99,120,200, 92,235,120,187,184,120, 92,235,221,127,164,163,
- 64,148, 95, 13,155,171,208, 96,207,182, 85,229,150,147,166, 40,194, 24, 13, 89, 6,189, 94, 81,171,102,173,120, 95,255,134,162,
- 27, 87,206,245,189,121,241,104,158,161,214, 72,155,136,168, 68,112,120, 66,112,248, 34,104,116,230,189, 44, 36,191,188,179, 5,
- 0, 53,246,179, 89, 27,102,124,249, 21,103,230,198,235,208,170,149,208,168, 20,200,201,206,132,152,171,199,147, 91,199, 13,196,
-168,159,161, 72,124,176,133,189,191, 88, 88, 88, 88, 88,254,227,148, 28,126,167,112, 94,153, 70, 43,250,233,141,102, 0,224,221,
-180, 91,186, 76,196,181,227,210, 20,146,227, 34,176,103,205,116, 48, 12, 65,207,113,171, 33,247,114,129,152,207,129, 38, 47, 61,
- 47, 35,226,106,185,109,117, 40, 74,223,117,203,246,120,175,207, 38,213,178,218,183, 47,143, 7, 0,251,246,229,241, 38, 77,172,
-110,181,117,123,164, 87, 96,155, 38, 32, 70, 35,122,247, 27,128, 33, 31, 15, 65, 84,146, 18,255,187, 22, 3,133, 74,107, 86,111,
- 57,177,131,111, 67, 7,123,199, 30,159,143,238, 33,229,114, 40,170,174,167, 53, 39, 54, 85,111,224,112,120,198, 19,247,179, 19,
-250,247,255,216,225,210,233, 67,157,140, 14,190, 13, 85,105,225,161, 21,233,105, 52, 26, 24,141, 70,104, 52, 26,232,245,122,216,
- 57,212, 60,221,117,192,154,184,196,164,220, 83, 73,153,234, 64,133,222,128,228, 44, 13, 82,178, 52,200, 82,232,224, 34,183,133,
- 65,175,173, 95,150, 30, 33,228,151, 15, 7,140, 24, 9,128,166,104,195,174,188,196,240,231,249, 75,254, 52, 89, 61,250, 13,115,
-188, 22, 28,129,151, 65,103, 50, 9, 99,200,207,226, 78, 49,113,229, 31, 87, 16, 14, 5,134,207,165,244, 28,154,102,116,186, 60,
-189,147,147,227,165,171,151,206,246, 81, 27, 94,129,195, 23, 22,174,171,210, 26,205,190, 98,146, 95,222,217, 12, 0,223,111,220,
-176,182, 85,215, 97,252,171, 33,145, 80,233,129,150,141,189,241,251,193, 31, 53,132,232,191, 84, 36, 62,216,204,222, 91, 44, 44,
- 44, 44, 44, 44,197, 12,214, 41,228, 55,142, 47, 30,209, 50,213,141,246,238,221,187,100,131,107,196, 39,103,192, 94,198,133,163,
-155, 23,134, 79, 95,139, 95,214,207,132,209,168, 7, 33,128,193,104, 94,102, 2, 66,120, 23, 38, 79,242,242,173,225,197,113, 28,
- 62, 76,162,250,117,159, 82, 60,124,152, 68, 85,175,190,125,246,228, 73, 94,145,185,106,143,214, 6,163, 17, 55,159,164,224,113,
-100, 54, 30, 71,229, 64, 38, 54, 63,205, 23, 71,192,159,180,106,229, 10, 62,151, 67, 81, 79,162,243,242,226,210, 13,121, 28, 30,
- 79, 39, 17, 11,136,150,112, 53, 81,105, 36,189,243,135, 99, 84, 39,246,126, 63, 22,192,148,178,116, 76, 61, 13, 77,145, 44,211,
- 39, 33,132, 80, 0,195, 80, 70, 99, 92,154, 26,121, 58, 61,146, 51,255, 52, 90,148,161,236,154, 83,153,107, 29,111, 43,185,236,
- 44,135,195, 17, 18, 2,232,117,134,193,112,173,211, 61, 47,241,229,243,162, 38,235,206,147, 4, 68, 60,184,152,108,212, 41, 71,
- 40, 83,158,253, 97,238,190, 83, 20, 8,135, 3,134, 67, 83, 12, 69,129,225,209, 68, 11, 66,152,146, 37, 82, 90, 96,180, 76,102,
- 75,192,227,204, 63,127, 96,189,211, 39,189,252,112,240, 90,190,231, 83,231,166,230, 40,226, 89,147,197,194,194,194,194,242,118,
- 41,207,139,188, 71, 81,173, 55, 35, 90,229,237, 16, 33,192,139,232, 52,212,112,119,132,123,141,218,120, 30,246,240,207,101, 0,
- 12, 70,243,170,163,142, 31, 79,140, 91,187,214,138,153, 57, 51,187,229,170, 85, 30,183, 39, 77,172,110, 93,175,190,125,246,236,
-217, 49, 45,215,173,179,190,125,225, 14,207, 72, 10,242,117,153,114,115, 89, 54, 70, 16,221,188,161,127, 77,206,146,125, 47, 98,
-254,120,148,155,194,231,243,245, 46,182, 34, 74, 46, 19,112, 56, 52, 79,160,209,211, 26,239,128,198,156, 19, 52,213,184, 60, 21,
-147,209, 42, 89,117,152,158, 26,209,247,252,255,102,213,235,240,225,106,187,248, 84, 21,178,181,156,194,170, 67, 14, 77,225, 81,
- 88, 52,192,225, 63, 46, 77,211, 74,110,119,110,255,175,191,120,172, 91,181, 28, 58,131, 17,147,103, 46,192,152, 81, 35,206,193,
-181, 78,119, 15, 47,159,224,235, 39,118, 73,186, 79,252, 1,209,207,130,146, 12,154,156, 3,150,152,172, 66,179, 5, 16, 35, 97,
-232,140,204, 28,153,198, 0, 17, 74,241,125, 26, 29, 83,169, 43, 39, 79,101,192,137,187, 73, 56,249,219, 1, 88,203,165,236,147,
-128,133,133,133,133,229,173,243,158,154, 43,148, 48, 87, 64, 89, 17,173,242,240,116,119,198,221,199,145,168,239, 91, 19,214, 86,
-114,132, 71,196,129, 67,243, 64, 83,128,222, 96,190, 25, 34, 58,253,193,117,235,172, 17, 29, 41,165,183,254, 16,233, 53,121,146,
- 87,228,186,117,214,183,137, 78,127, 16,192, 8, 66,242,199, 5, 50, 37, 72, 53, 90,224, 11, 8,163,175,238,108, 39,225, 4,189,
- 82,164,211, 52, 71, 99,111, 45, 98,236,173,133,180,189, 92,192,227,243, 56,140,129,208, 58,119, 39, 47, 53, 97,152,134,230,232,
- 21,173, 58, 52, 26,141,160, 40,218, 88, 96,196,164,177,233, 42,100,171, 57, 72,206,210, 32, 51, 87,135,186,213,164,184,120,233,
-136,210,168, 87,237, 43, 77,139,195,227, 91,215,246,114,199, 87,223,172,131, 74, 99,196,139,248, 60,240,133, 66, 23,103,151,128,
-208, 17,159,205, 21, 78,219, 17,129,177,157,236, 49,243,122, 68,188, 50, 89, 52,215,146, 51,107, 52, 26,161, 82,107,249,201,105,
-153,182, 57,185, 10, 43,177, 72,168,114,180,179, 78, 43,109, 93,181,133, 17, 45, 19, 18, 17, 23,125, 90,184, 64,173, 27, 10,149,
-198,128, 91,127, 28,101,159, 8, 44, 44, 44, 44, 44, 44,127,178,163,172, 5,102, 25, 45,153, 68, 4,194, 17,225,122,112, 4,124,
-252, 27, 96,247,241,123,168, 83,191, 5, 18,115, 13, 32,160, 43,236,109,104, 98,214, 60, 85, 8,128,144,190,125, 37,238, 31,125,
- 84,173, 43, 33,188, 11, 63,108,207,137, 3,128,154,245,242,101, 24,134,128, 16,128, 48,249,134,203,108, 40,110,116,100, 98, 78,
- 13, 47, 23, 41,158,198,233, 52, 82, 33,159,182,149, 10, 56,142,214, 2, 62,159,203,133,145, 80,154,196,196, 8, 13, 5, 68,153,
- 35, 87,178,234, 80, 34,115, 61,221,249,195,213,169, 81, 49,217, 65,117, 51,148, 13,179,117, 2, 16, 2,212,173, 38,197,227, 59,
-167,140,201,241, 47, 95,168,146,159,109, 43, 77,139, 97,192,209, 25, 24,132,190,202, 70,150, 66,143,172, 60, 29, 90,119,236,195,
-111,221,165, 47,174, 63, 78, 3, 99,208, 99,213,143,167,114,141, 68, 63, 4, 8,211, 91,176,211,244,221,144, 39,238,169,153, 10,
- 33,143,203,205,242,173,227,249, 90,192,231, 25,114,114,114, 4,197,215,226, 64, 42, 22, 32, 35, 79, 15, 0,122, 75,175,158,108,
-133, 30,199,239, 36,225,196,209,253, 16,139,197, 32,236, 13,197,194,194,194,194,194, 82, 20, 87,228, 15,191,115,170,224,179,208,
-124,153, 53,168,180,145, 33,112,176,183,131, 72,106,133,200,100, 29,114, 41, 39,100, 42, 9,140,198,252,136, 86, 57,129,167, 82,
- 71,247, 62,126, 60, 49,238,216,177,180,157,199,143, 39, 22,105,232,253,103, 36,171,240,147, 33,102,107, 82,196,120,241,248,153,
- 43,217,125, 3, 29,109,105, 14, 71,197,231,209, 26, 46,159,163,227,115,105, 61,159, 75,107,157,173,120,156, 43, 39, 14, 8, 8,
-133, 43, 21,105,170,213,106,116,233,210, 5, 61,123,246, 68,191,126,253, 48,104,208, 32,120,123,251, 57,209, 28, 74, 75, 40,134,
-113, 20,228,162,182, 35, 5,174, 58, 22,127, 28,248, 78,249,248,230,239,161, 70,141,186, 15,138, 91,206, 63, 53, 9, 97, 50,178,
- 53, 80,235,140,200,204,211, 33, 83,161,131,193,177, 37,126,191,149, 0,149,214,136,232,224, 35,170,212,164,184,233,154,148,151,
-145, 21,156,138, 57,197,255, 37,113,159,126, 50, 42, 85, 46,162, 95,182,109,213, 44,213,193,222,206, 64, 81,127, 70, 94, 41,138,
-130,200,202, 9,182, 54,114, 68,134,156,193,249, 85,157, 85, 0,190, 54,231,120, 22,197, 74,194, 69,223, 64, 23,244,233, 63, 20,
-245, 91,116, 55,199, 88,179, 35,218,179,154,172, 38,171,201,106,178,154,255, 37, 76, 99, 28,154, 62,205,203, 12,111, 50, 64,181,
- 92,165,168, 83, 77, 10,181,206, 9,106,173, 17, 10,181, 17, 57, 74, 29,114,148,122, 68, 38, 41,241,248,120,213, 75,152, 31,197,
-202,207,248, 73, 8, 0, 42,223,224,153, 27, 61, 17,232,180,223,172, 93,245,237,224, 3,141, 27,105,167,245,114,173,254, 48, 82,
-155, 64, 81,180,138,230,112,245,118,114, 46, 47, 60,252, 97,234,237,107,167,219,137, 12,198,145,202,114,116, 12, 6, 67,118,181,
-106,213, 0, 20, 31,130,199,175,182,184,223,205, 83,115,106,182,239,187,202,113,253,242, 89, 74,154,195,103, 40, 46,255,177, 81,
-175,218,175, 74,126,246, 3,202,177, 31, 52, 95, 20,118,247,193,211, 22, 54,118,213,241, 50, 94, 1,133,218, 0,157,129,129,173,
-140,143,184, 71,231,116,145,225, 65,135,242, 18, 30,238,174,196, 97,219,247, 60,236,177,123,143, 30,221, 7,180,104,209,146,179,
-112,225, 2,248,248,248, 64,165, 82,129,166,105, 84,175, 81, 27,145,207, 31,224,206,169,111,140,202,244,168,109, 0,150, 2, 72,
-181,244, 75,210,114,180, 56, 19,148,130, 83,191, 29, 4,135, 39, 96,111, 39, 22, 22, 22, 22, 22,150, 55, 25, 95,226,115,135, 89,
- 70, 75,173, 86, 71,182,233,210, 7, 12, 67, 96, 36, 0, 99, 44,136, 60, 49,127, 70,159,140,122,117,100, 85, 75,199, 48,198,123,
-155,119,236,236,217,184,121,123,142,191,135, 12, 57,233, 73,184,115,243,178, 1, 12,185,109,206,246,233,233, 47,242,196,206,117,
- 6, 12, 30,248,209,225, 81,159, 76,204,106,215,177,163,212,201,201, 69, 19, 23, 31,167,252,121,239,175,250,115,167,143,181, 99,
- 96,248, 56, 61,253,101, 94,121, 58,217,217,217,223,151, 54, 95, 40,144,181, 6, 80,147,195,165,180,170,212, 23, 22,181, 8, 79,
-139,143,237,255,237, 55,139,163,134,141,155, 33,168, 85,173, 54, 82,178, 57,136,140, 75, 66,248,181, 99,154,248,231,247,127,203,
-137, 11, 25,107,166, 84, 98, 41,243,226, 0,172,191,115,231,118, 64,143, 30, 61,186,119,234,212,137,140, 31, 63, 30,132, 0,127,
-236,152, 68, 50, 34,239, 28, 65,126, 20,235, 85, 37,207, 75,244,181,219, 15,236, 6,181,107,202,181,151,143,197,206,131,167,245,
- 32, 76, 52,123, 63,177,176,176,176,176,176, 20, 82,249, 54, 90,177, 97,249,249,180,254,106,114,147, 82, 70,236,222,253,203,178,
- 95,246, 30,104,173,214,106,171, 17,240, 99,141, 6,237,213, 60, 35, 22,154,171,161, 74,126, 25,100,111, 95,183,222,207, 63,110,
-254,250,231,157, 91,219,131, 49,250, 82, 64, 20,161,112, 69,164, 55,142,170,200,100,149,107,150,210,114,183,119, 29,176, 70,149,
-158,158,247,139,165,219,170,210,159, 37,209, 28, 93,245,237, 27,190, 89, 77,211,156,110, 70, 35,195, 99,140,250,151, 70,157,250,
- 59, 85,234,179,227, 48,187,149, 27, 50,202, 89,246, 4,192,147, 75,151, 46,181,189,116,233, 82,115, 0,223, 35,127, 12,197,160,
-170,156, 23, 77,122,110,231, 47,103,125,249,199, 23,160, 60, 25,134,192, 96,100,162,249, 42,101,103,246,158, 98, 97, 97, 97, 97,
- 97, 41,100, 60,222, 76, 90,106, 94, 68,235,239, 34, 51,243, 85, 46, 50, 49,173,170, 58,233,233, 47,242, 0,188,209,115, 79, 89,
- 69,221,199, 47,114,254,135, 23, 57,255,171,236,246,138,148,215,169,192,235, 81, 85, 44,134, 57, 13,217,175, 23, 76,111,133,180,
-180, 48, 5,210, 16,200,222, 67, 44, 44, 44, 44, 44, 44, 22, 27, 46,243, 26,195,179,176,176,176,176,176,176,176,176, 84,104,178,
-138,126, 2,200,111,123, 94, 86,207, 1, 75, 70,230,174, 76,239,131,139,172,102,149, 53,121, 0, 4, 0,100, 0, 42,170,210,236,
-142,130,241, 26,217,227,201,106,178,154,172, 38,171,201,106,190, 67,205,138,180, 47,226, 95,130,101,137,215, 43, 7,219,245,149,
-213,100, 53, 89, 77, 86,147,213,100, 53, 89,205,127, 59,227, 75,153, 64, 8,249,231,180,209, 98, 97, 97, 97, 97, 97,249,187,176,
-183,175, 43, 3, 10,219,245, 86,136,196,193,207, 25, 0,148,105, 97,201,236,209, 99, 41,133,162,227, 28,190,149, 54, 90, 60,154,
- 43,248, 82, 34,183, 15,147, 90,219,199,255,199, 15, 46,229, 93, 67, 58,181,107, 59,175,223,125,106,138,251, 89,178,161,196,209,
-123,151, 75,237,192, 24,169,147,247, 84,184, 54, 22, 87,165, 16, 82,167,154,142,178,234, 77,111,202,171, 5,124,240, 23,236,163,
-208,223,223,191,165,191,191,127, 75, 0,194,183, 33, 40,113,242, 30,234, 94,167,197, 53,167, 90,141, 46, 75,157,235, 14,124,219,
- 5,150,185,214,177,151, 85,111,242, 63,153, 91,131, 76,153,107,131, 28,153,123,147,171,114, 7,191, 90, 21,109, 87,189,239,183,
-190, 75,246, 63,222, 95,189,239,183,190,165, 45,183,237,177, 81,190,232,192,139,229,246,125,190,147,177,207,149,202, 81,189,245,
- 80, 27,215,246, 95,216, 91,186, 93, 53,239, 22, 79,106, 4,180, 77,113,171, 27,248,216,220,109,220,125, 90,134,120,250,183, 78,
-118,247,110, 25,196, 30,121,243, 16, 57,214,108, 41,178,245, 56, 37,180,245, 56, 45,180,171,217,177,170,122,174,174,174, 98, 95,
- 95,223, 30, 45, 90,180,152,208,185,115,231,207, 27, 53,106, 52,222,211,211,179, 27,222, 97,103, 44,137,147,247, 60, 13,143, 74,
-211,240,168, 52,137,147,247,188,138,159,175, 62,203, 40,218,152, 64,209,198, 4,169,147,207,178,127,202,185, 18, 58,123,123, 74,
-156,188,215,201, 93,252,239,137,157,234,246,177,116,123, 91, 91,219,110,142,142,142, 31,154, 38, 91, 91,219,110,236, 29, 80,105,
- 10,163, 88, 37,254,174,212,133,206,225, 9, 37, 55,134,125, 50,185,222,202,197,115, 69, 27,118,254,142, 13,203,103, 61,213, 40,
-178,252,255,137,123,238, 80,179,121, 16,135,230,184, 23,157,103,100,140,113,105,175,239, 53,125, 27,250, 62, 53,196, 99,191,158,
- 61, 98,230,208,193, 93, 60,187,244,158, 78, 61,123,173, 58,102,190, 69, 67,195, 67,255,251,173,250,181, 43,151, 55,238,220,185,
- 99,105,170,193,103, 29, 79,200,221,156, 19,251, 36,203,146, 50, 88, 57,214,170,201,149, 58, 92,107,211,111,178, 75,240,197, 95,
-119, 27,181, 76, 87,101, 90,145,209,191, 43,143, 99,237,218,181,155,113, 56, 28,251,169, 83,167,242, 1, 96,253,250,245,117,140,
- 70, 99,122, 68, 68,196,125, 84, 34,249,105,190,193,244, 25,241,253,234, 37,191,124,240, 65, 79, 36,164, 41,176,106,221,150, 14,
-103, 79, 30, 26,164, 72,126,113,228,109,156, 19, 27, 27, 47, 43,240,229,143,166,207, 94,234,212,163, 67, 51, 78,158,218,128,179,
-215, 30,180,253,117,203,210,123,128, 95,243,220,180,176, 50,115,138, 49,202,236,249,206, 50,210,131, 81,102, 3,192,208, 55,126,
-236,101,250, 46,142, 98, 99, 15, 87, 33,247, 65, 58, 80,225,160,143, 54, 53, 90,159,227, 9,133,158, 52, 77,131,166, 0,154,166,
-192,161,168,252,113, 66,117,170,232,248,240,235,221,255, 9,247,137,220,163,121, 18, 56, 92,123,154,250,179,124, 20, 93,240, 73,
- 72, 78,210,139, 27,246,111,225,107,172,235,213,177, 9,104, 93, 71,241,243,213,215, 25, 82,110,187,207, 79, 81,132,222, 26,115,
-125, 93,168, 89, 6, 64, 36,178, 61,113,226,132, 99,143, 30, 61,172,157, 2,250, 93, 53,103, 27, 1, 39,207,255,228,201,227,252,
- 30, 61,186, 91,112,125,122,119, 5, 77,239,165, 0, 30,195,144,245, 28,134, 28,202, 75,127, 30, 1, 88, 54,250,148,216,201,103,
- 44, 13, 98,246,115,134, 1, 21,164, 74,121,182,179,178, 7,151, 43,180,234,204,227,243, 63,175,233, 93,191,113,124,212,203, 32,
- 69, 94,238, 58,131, 38,251,170,197, 66,122,195,151, 23,175, 7,127,192,229,241,168, 30,157, 3, 57, 26,224,114, 85, 78,186,179,
-179,243,135,155, 54,109,170,213,178,101, 75, 0,128,193, 96,176, 58,124,248,176,203, 55,223,124, 35,125,254,252,121,101, 7, 78,
-173,230,232,232,232, 33, 16, 8,170, 1,128, 86,171,141, 79, 77, 77,141, 1, 80,225,139,191,212,185,150, 3, 8,150, 94,191,118,
-141, 11, 0,109,219,182, 91,230,209,102,138, 45,135, 47, 83,149,122, 56,180,185,210,172,136,203, 51,238,220,189, 77, 1, 64,139,
-192,150,115, 37, 14,126,155,223,101,100, 75,228,228, 19, 72, 3, 51, 91,180,237,210,127,200,199, 35,232,128,186, 30,232,214,181,
-211, 28, 21,112,194,162,107,134,203, 21,223,187,119,175, 54, 77,211, 28,131,193,160,110,209,162, 69, 76, 85,202,229,230,221,242,
- 22, 5,186,186,206,160,253, 49,245, 85,208, 50,224,141,129, 99, 56,214,213, 27,127, 13, 14,119, 28,195, 48,177,185, 49, 65,173,
-254,133, 17,173, 55,143,179,165, 74, 52, 87,240,249,208, 49,159,213,155,241,197, 87,162,233, 27, 46,225,212,150,185,105,255, 84,
-147, 5, 0, 28,154,227,126,238,252, 57, 39,137,128, 3, 0,200, 83, 27,240, 65,143, 30, 21,255, 34,212,104,126,133,166, 40, 31,
-211,128, 54, 70,131, 78,196,229, 9,212, 84,190, 65, 2, 5,192,193,173,198, 37,103,195, 13,201,208,193, 93, 60,247, 30,184, 16,
- 23, 19,151,110,241, 67,141,226,240,209,162, 93, 55,116,233,218,221,250,222,221, 91, 75,119,108,251, 97,158, 65,167,255,129,209,
- 51,235,212, 25, 47, 19, 42,124,152,187,212,109, 34,144, 57,156,237, 63,225, 27,123, 53,109,135,133,203,191,119,184,118,102,223,
-213,248,216,134, 76,116,116,172,154, 80,212,211,204,140,196,207, 21, 73, 17,207,204, 61,100, 50,153,172,150, 76, 38,107,216,160,
- 65, 3,209,172, 89,179,120, 29, 58,116,248,211,178,143, 31,207,191,114,229,138,235,154, 53,107,122, 62,124,248, 80,157,151,151,
- 23,154,151,151,247, 10, 22, 52,180,119,113,113,156, 50,224,163, 62,232,212,127, 50,140, 12,133,241,159,205,192,185, 51, 71, 39,
- 2,120, 43, 70, 75, 47,177,250,102,220,132, 89,142, 45,154, 53,226, 44,221,247, 12, 98, 1, 23,221,155,250, 80, 99,166,206,183,
-217,185,113,233, 79, 72, 67,251,210, 34, 89,140, 50,123,126, 61, 7,237,199,125, 91,214,196,241,253,218,143,209,121, 54,104,137,
-245,178,216,227, 95,133, 3, 64,173, 30, 83,229, 66, 99,234, 38, 55, 27,142,147,208,152,186,169, 86,143,169, 23, 95,157,221,148,
- 91, 94, 89,120, 66,161,231,254,125,251,234,218,202,249,224,210, 20, 56, 28, 10, 92, 14, 13,181,214,136, 65,131, 63,126,107,151,
-185,216,169,110, 79, 26, 24,147,255,131,141, 93,170,148, 23,167, 45, 57, 39, 20,135,111,127,242,248,111, 92, 39,107, 33, 56, 28,
- 10, 28, 26,224,208, 20,162,146, 85, 24, 59,118,140,117, 85, 13,251, 7,173,157,154,125, 57,196,167,123,139,122,118, 13, 14,222,
-166,172, 91,124, 48,196, 62, 77, 45, 25,125,224,216,229,143, 73,219, 25,119, 9, 97, 86,199,221,248,254,124,121, 34, 26,141, 38,
-185,123,143, 15,172, 40,174, 84,114,241,247,221,237,184, 52, 5,189,145,192, 96, 36, 48, 22,140,141, 74, 21,188,193,208, 52, 5,
-194, 16,140, 27, 55, 22,221,123,124,160,100, 12, 76,156,249, 15, 57,122,239,217,139, 55, 29, 53,122, 6,107, 54,237, 92,170,200,
- 78, 93,250, 58,220, 62, 42, 47, 59,109,134, 42,229,133,217,227, 96,208, 32, 77, 99, 95, 61,158,176,239,228, 29,212,243,247,131,
-145,201, 47,167,143,187, 20,251, 78,221,129,175,143,111,126,185, 25, 2,239,234, 50, 52,107,218, 12, 0, 42,101,180,184, 66,249,
-194,246,189, 70, 44,233, 61,232, 19, 56, 57, 58,130, 38,250,222, 23, 79,237,235,189,107,235,234, 47, 13,234,156, 53, 22,137, 17,
- 99,225,239, 2, 97,152, 42, 71,157,220,220,220, 28,155, 53,251, 51, 29,163,193, 96,128,151,151, 23,226,227,227,125, 42,243,158,
-230,234,234,218,107,209,162, 69, 78, 61,123,246,228,185,184,184, 0, 0,146,146,146,170,157, 61,123,182,241,162, 69,139, 82, 18,
- 19, 19, 79,161,156,140, 62, 70, 61,205,167,185,224,136, 68,146,252,125, 4, 69,207,154, 50,178,129,179,171,155,166,180,245, 83,
- 83,147, 4,179, 39, 95,166,184, 92,126,193,250,160, 9, 97,168,114,162, 68, 93,120, 60, 94,169, 53, 20, 58,142, 85, 11,194,179,
-254,148,230,208,249, 23,171, 65,159,154, 25, 19,226,103, 65, 36, 46,128, 39,224,255, 48, 96,200, 39,173, 6,246,239, 7, 87, 71,
-107, 92,188,241, 16, 19,167,204,212, 27,116,250,117,149,122,120,112, 56,220,148,148,148, 40, 91, 91, 91,151,170,255,222, 82, 53,
- 47,156, 59,227,116,241,143, 75,115,215,110,216, 56, 73,167, 53,232, 25, 66, 10,199, 49, 22,139,133,188,174,189, 7, 91, 57,213,
-110, 33,218,184,232, 83,222,191, 48,162,181,227,173, 24, 45,129, 88, 62,120,193,236,169,162,111,126,189,131, 83, 91, 38,166, 41,
-115,210, 28, 11,223, 20,172,108, 66, 20, 57, 89,141, 43, 83, 66,153,163,119, 75,138,195,157, 64,113, 56, 82,138,166, 4,140,145,
-137, 53,104,181,203, 84,233, 47, 18,171,186,247, 12, 67,240,191, 91, 41,150, 25, 32,130, 58,123, 15,254,230,244,127,246,206, 58,
- 60,138,227,255,227,239, 61,215,184, 39, 36, 1, 66, 66,176, 0,193,221, 61, 56,197,165, 56,133,210, 66,105,129, 66,177, 2,165,
- 80,188,180, 64, 41, 80,164,184, 6,119, 43,154, 64, 32, 64, 18,136,251,197, 46,231,126,243,251, 35,210, 64,163,208,254,190,149,
-121, 61,207, 61,201,222,237,189,111,118,119,118,247,189,159,249,204,140,155,189, 0, 58,163, 5,195, 70,140,198,158, 61,123,108,
- 92,236,248,208, 25,204, 88,179,118,173, 82,149,112,198, 53, 33, 57, 47,181,107,223,217, 23, 99,227,101,207,146,210,117,135,170,
- 90, 54,189,209, 2,133,198, 12,141,158,133,128,250,205,176,102, 93, 29, 97, 82, 98,220,236,221,187,118,204,124,254,156,189,199,
-202,102, 45,213,165,191, 72, 46,245,164,115,111,208,195,214,193,233,215,129, 83, 86,216,199,200, 56, 32, 48,226,181,173, 16, 67,
-199,205,180,245,115, 23, 65, 34,100,219,199, 37,166,122,204,249,252,243,219,177, 22,210, 92,145, 21, 27, 87, 81,121,170, 87,175,
- 62, 40, 36, 36, 68,252,217,103,159,113,189,189,189,177,107,255, 97,223,118, 61, 62,232,155,150,158,233, 77, 8,129,155,171,107,
-242,164, 15, 63, 56,125,246,236,217,196,228,228,100,238,234,213,171, 91, 28, 63,126,188, 94, 70, 70, 70,165,159, 76, 45,132, 64,
-167,183,192, 82,120,131,204,202,215, 87,217,159,122,121,121, 9, 82, 83, 83,245, 37,162, 12,204,239,129, 66,166, 71,151, 14, 45,
- 56,219,206,197, 67,165,179, 64, 34,228, 34, 62, 83,131,166,141,131,152,159, 44,230, 70,165, 9, 78, 24,218,103,161,155,148,244,
-236,215,170, 38, 92, 29,196,216,249,253, 10,156,186, 27,215, 51, 83,197, 96, 51, 97, 79,241, 16,112,186, 73,172,233,155, 59, 54,
-173,229,222,185,137, 47, 30, 54,173,229,126, 51, 44, 42, 90,244,193,218,143, 83, 85,220,203,121,231,103, 42, 75,191,240,176,224,
-104,195,195,207, 23, 18, 33, 22,114, 32, 17,114, 32, 17, 20,252,101,177,152,247,123,170,245,168,235,205,182, 90, 38,176,217,156,
- 9,195,135,126,224, 57,114,248, 7, 4,108, 22, 14, 31, 61,221,127,223,190,189,233, 38,163, 97,135,133,197,254,185,172,250,243,
-198, 14,101, 1,174,118,124,124,190,227, 25,108, 69, 92,216,136,185,176, 21,115,209,185,161, 11,216,239, 62, 8,140,195,212,254,
-126,189,167, 14,172,222, 41,208, 71, 26,240,228,117,254,243, 9,203, 31,109,184, 46,239,244,233,247,235,235, 57,169,228, 6,206,
-162, 57,147, 56, 41,105,105,157, 14,159,190,209,217, 98, 24, 31,101, 54,170,191,204,138, 56, 92,106, 84, 56, 37,234,110,176, 87,
-203, 33, 66,163,202,244,244, 73, 84, 74,173, 60,189, 0,145, 9, 10, 72,132, 28, 72,139,246,173,144, 3,137,144, 11,169,144,131,
-180,148,120,228,170,217,183, 83,157, 88,157,112,227,174,185, 42, 5,215, 25, 45,120, 28,167, 66,245,192,198,240,240,240,132,161,
-247,168,234,247,175, 30, 61,249,224,198,137,111, 52, 25, 47,191,172,172,206,254,208,123,152, 55,107, 74, 24, 3,132, 23,222,164,
-131, 23,173,218,210,100,217,188,233,111,188, 55,103,233,166, 38,239, 30,201,178, 89,216,121,224, 71, 75,219,117, 27, 8,101,110,
- 38,126,187,120, 8, 61, 66, 6, 99,212,248, 79, 96,111,239,188,102,221,242, 47,158,152,245,138,171,127,184,230,186,215,105, 27,
-212,160,238, 62, 47, 79, 79,111,171,181, 96,150, 15, 66, 0,149, 50, 31, 95,124, 58, 9, 86, 66,208, 40,184,121,103, 97,187,110,
-132, 20,206, 6,146,157,147,173,142,122,249,188,171, 78, 22,117,191,210,251, 82,167, 51,101,101,101,225,241,227,199,136,142,142,
- 70,100,100, 36,114,114,114, 96,103,103,167, 82,171,213, 85, 10,222, 55,108,216,112,228,213,171, 87,133, 14, 14, 14,197,111, 26,
- 12, 6,216,216,216, 96,228,200,145,220,238,221,187,123,245,233,211,103,236,179,103,207,246, 3, 80,148, 90,158,220, 87,105, 54,
-110,129, 91, 59,116,236, 48, 13, 0, 68,182, 30,113,155,119,157,142, 44,247,129,214,206,211,183,117,235, 54,181, 64, 8, 24,144,
-141,154,156,232,140,114,162, 68,146,123,247,238,249,177,217,108,206,239,247, 32, 43,126,216,121,176,206,165, 91, 79, 7,173, 90,
-243,157,208, 86, 34, 64, 86,190, 1, 19, 71, 13,172,244, 61, 88,228, 22,216,187,117,235,246, 39,151, 45,253,138, 35,149, 72,112,
-241,126, 44, 62,254,244,115, 93,122,194,179,239,136,149,187, 69,147, 21, 45,123,207, 91,229,159,210, 61, 46,160,154, 20, 54,253,
-122, 8,167,142,233, 39, 52,152, 44,144,171, 77,208, 27, 45,176, 88, 9,242,213, 38, 60, 79, 82,194,217,182,234, 83,185, 17, 66,
-154, 1,112, 1,144,197, 48,204,195,146,203, 69, 15,116, 69,222,248,173,229,236,194,251,131, 19, 0, 3, 10,122,234, 23, 87,159,
-194,229,178,222, 47,250,254,115, 0,117, 11, 53, 45, 0, 30, 48, 12,147, 87,134,217,250, 67,148,139, 19, 26, 26, 74, 66, 66, 66,
-138,175,248,111, 47,191,141,128,199,245,148,216,185,128,144, 23, 40, 57,129,177,171,187, 87,206,119,235, 54, 56,206,248,104, 74,
-162, 66,158,235, 91,248,246,229,202,220, 44, 56, 12,123, 93,135, 54, 45,187, 79,251,232, 35, 4,250, 85,227, 89, 44, 22,242, 44,
- 58,206,180,251,231,157,227,110,222,229,111, 80,164, 60, 91, 88, 34, 4, 89,165,110,159, 22,171, 37,229,237, 8,150,197,106,121,
-251,233,246, 15,154, 12, 3,216, 75,249,216,122, 46, 30,132, 0, 12, 8,236, 36, 92, 28,184,158,130,184,176, 99,138,144, 70, 10,
-245,200, 85, 75, 58,119,234, 61,243,234,243,215,186, 67, 50,153,238, 2,128,140,242, 52, 75,191,160, 91,161, 55, 90, 96, 50,155,
-113,228,244,105,244,236,220, 2,173, 91,183, 64,251,118,173, 57,143,194, 34,198,127, 52,109,146, 55,126,239,221, 81,172, 41,116,
-243,111, 38,181,115, 62, 52,104,218,106,155,167, 41,102,112,216, 64, 77,119, 17, 28,109,120, 48,152, 25, 36,100, 25, 11,207, 28,
-123,124, 60,103,169,227,188,217,211,206, 42,178,248, 13,128, 23,198,242,182, 93,163,209,240, 71,143, 30,205, 53,153, 76,198,145,
- 19, 63,233,158,145,145,213,255,135,141,223, 10, 92, 93,221,160,209,153, 17, 22,249,170,238,178,101, 75,107,158, 62,127,253,196,
-146,207,167,158,236,217,179,167,221,193,131, 7,173, 21,237,207, 55,158, 16, 51,179,191,223,185,239,200,158,245,223,173, 68, 84,
- 98, 30,126,222,182, 5,196, 98,222, 90,193,174, 42,169, 73, 70,143, 30, 45, 58,113,226, 68,181,148,148, 20,133, 70,163,201,122,
- 35, 30,193, 98, 56,153,185, 26, 56,219,240,193,227,176,224,230, 32,132,171,157, 0, 92, 54,192, 98, 24, 75,105,154, 63, 31, 58,
-179,220,170,201,199,169, 95, 13,195,119,126,191, 2,227,103, 44,192,179,108,254,121,150,216,110,249,244,225,131,230,185,136, 44,
- 61, 61,237, 89,174,157,155, 84,135, 68,200,195,252,153,163,209, 60, 44,193, 53, 85,110, 93,144,165,101, 55, 94,122,190,120,178,
-238,203,111, 6, 71, 10, 34, 88, 54, 98, 46,206,239, 91, 35, 83,231,103,229, 23, 53,201, 25,244,186,196, 74, 86,227,203,165, 60,
-217,206,107, 28, 84,127,197,180,201, 19, 88,109, 90, 53, 39, 44, 22, 23,217, 74, 3, 67, 8,240,233,199, 83, 49,125,234, 36,247,
-228, 52,217,162, 45, 91,182, 46,188,122,137,124,173,206,122,185,164, 60, 77, 22, 83, 16, 5,146, 10, 57,144,138, 10,140,139, 84,
-200,129,206, 96, 1,195,128,109,239, 19,156,207, 20, 68,114,211,114, 19,203,124, 2,127, 67,211,209,167,254,149, 75,113, 54,117,
-242, 14,229,221,141, 79,139, 92, 30, 22,145,249, 0, 64,174,119,123,251,177, 70, 51,129, 74,103, 70,124,166, 6,102, 35, 97,198,
-247,242, 69,141, 33, 76,224,202,157,225,123,206, 69,192,182,196, 69,255, 13,205,212,123, 71,116, 78, 13, 6, 14, 91,191,105,219,
-195,239, 86, 44, 96,103,231, 27, 96, 37, 4, 66, 62, 27, 34, 62,167,240,197,134, 86,157,143, 45, 63,254,148, 97, 6, 51, 8, 55,
-110,152,171, 82, 63, 97, 37,163, 6,246,110,127,128, 1,248, 12,139,151,226,233, 91,221,183, 75,223,113,194, 46,253, 70,195, 98,
- 54,204, 11,187, 69,174,105,100, 81, 87, 42,163,217,160, 94, 93, 48, 64,184, 90, 22, 61, 21, 0, 36,174,181,183,214, 9,172,211,
-228,237,247,252,253, 3,155, 84,230,184, 23, 71, 74,133, 54, 51, 28, 28, 93, 22, 4,214,111,236,154,153,167,103,108,156,170, 33,
- 62,230, 49,126,253,113,209, 94,171,206,176,244,202,153, 67, 43, 54,252,124,124,104,151,158, 3,177,243,135,111,231,231,164, 23,
- 27,173,203, 37,162, 85,163,118,239,216,238,205,229, 11, 96, 50, 91, 97,178,144,130,191,102, 11,114,115,243, 96, 50, 91, 33, 20,
-219,192,108,101, 96,178, 88, 97, 50, 91,161, 55,152, 37, 83, 71,247,249, 72, 7,220, 47,173,156, 94,117, 58, 92,224, 9, 4,190,
- 4, 5,115,215, 18, 66, 16,159,161,101,121,120,120,236, 7, 0,129, 64, 0,129, 64, 0,171,213,138,176,168,172, 25,206,129,181,
-167,161,208,224, 89,140,134, 68,121,194,157, 30,101,109,187,187,187,123,223,183, 77,150, 78,167,131, 74,165,194,173,187, 15,237,
-118,236, 57,210, 51, 62, 49,197,207, 74,236,244, 54,174,126, 61,148,178,216,190,101,237, 79,101,102,212, 71,182, 45, 39,177, 62,
-155, 62,214,127,211,238,208, 7,175, 46, 44, 47, 55, 79,171, 70,151,185,134,207,166, 12,110,186,106,227,207, 49,121,119,182,206,
-170,232, 24,113, 56, 28,110, 86, 86, 86,241,249,189,249,167, 95,155,134, 71,165, 14,216,176,126,131, 48, 44, 86,137,167,241,105,
- 24,219,213,167,224, 9,167, 18,199, 93,226,230,231, 92,179, 86,173,253, 91, 54,174,226,196,164,233,240,253,177, 7,184,122,114,
-235,173, 12,217,253,158,200, 76,215,190,203, 53,228, 79, 48, 90,101,106, 94,139,200,134, 74,103,134,222, 96,134,201, 74,160,208,
-152, 32,147, 27,160,208, 24,161,210,154, 49,182,155, 79,169,223,171,192,143,184, 48, 12, 19, 74, 8, 9, 33,132,116, 5,192, 47,
- 90, 46,184,103, 51,161,133,134,236,141,229,121,243,230,125,249,205, 55,223, 68, 22,173, 91,244,126,209,186,229,189, 95,226,251,
- 78,243,231,207,111,176,106,213,170,149,173, 90,181, 58,240,219,111,191,197, 1,200,171,108,243, 33,167,228,198,132,134,134, 86,
-180,163,253,140, 38,163,192, 86,196, 69,205, 26, 62,248,240,203,157,206,191,172,154, 32, 19,242, 57,236,115,231,206, 57,230, 24,
-164, 96,177,216,149,126, 68,145,186, 4,180,230,241,248,103,214,174, 93,139,225,125,219,137,146,178, 77,170,136, 36,109,166,218,
- 0,179,171, 75,109,254,242,149,171,164,171, 86,175,153, 30,122,202, 42, 87,101, 62, 95, 83,122, 19, 95,211, 71,108,166, 68, 14,
- 22,195,128, 88, 45, 41,121, 9, 15,155, 2,192,251,228, 98,169,116, 38,176, 11,115,107, 24, 6,208,232,204, 96,179, 25,153, 60,
-234,208,243,145, 95, 47,239,188,247,192,165, 52,194,178, 87,170,213,241, 98, 20,204, 57, 88,101,116, 6, 11,244, 38, 11, 34,159,
-132,161,125,203,122,104,221,180, 14, 52, 58, 11, 52,122, 51,106,212, 10, 4, 0,231, 82, 15, 28,155, 21, 71, 44, 38, 29, 33, 22,
-155,144,102, 46,112,181,231,195,195, 65, 0, 1,159, 3,147, 25,208, 26,172,208, 25, 44, 72,144,105,161,212,138, 16,212,225,131,
-154, 78, 30,143,244, 25, 9,162, 19,185, 73,143, 6,149,107, 78, 45, 22,236,222,127,196, 63, 45, 45,179,255,217, 19,251, 4, 89,
- 10, 19, 34, 18,212,144,201,245, 0,219, 5,139, 87,126, 47,152, 59,107,242,128,221,191, 30, 77,236,210,174, 69, 98, 85,183, 89,
-147, 21,181,247,208,225, 35, 91, 67, 66, 6,136, 34,239,159, 69,204,227, 43, 43,212,178, 42,229,103,177, 26, 53,106,100,158, 60,
-121,178,114,229,202,149,222,167, 78,157,170,145,149,149,245, 24,128,201,222,222,190, 78,109,127,223, 39, 23,207,159,243,234, 51,
-224, 3,110, 74,182, 22,118, 98, 30,124, 93,197,184,123,235,130,137,207,231,150,154,111, 82,216, 60, 56, 2, 93,190,192,169,187,
-113, 61, 35,115,132,215, 39, 77, 24,155,120,241,102, 84,206,230, 61, 23,191,245,146,154, 30, 11,173, 89,155, 31, 53,173,229, 62,
-239,227,209,248,102,211, 94,220, 8,139,146,169, 89, 30, 43,210,245,230, 75,101,135,210, 1, 14,155,129,141,136, 11,181, 34, 43,
-255,117,248,249,218,127, 82,152,122,236,197, 19,123, 89,185, 74, 19,146,179,117, 76, 90,174, 18, 22, 43,129,189,152, 7,179,149,
- 64,158,155,205,236,219,187, 7, 15, 31,222,101,129,205,154, 8, 96, 73,185, 59,148, 41,104, 42,148, 10,185, 5, 17, 33, 81,193,
- 95,147,197,138, 64,255, 90,216,190,121,157,173,179,171, 27,218,182,175,124,110,180,141,147,111,163, 3,187, 54,227,250,111,225,
- 29,111,108,248,190,153,212,211,101, 19,195, 88,190, 3,129, 78,111,180, 32, 95,158, 7,190, 33, 25,205,189,178,224, 40,182, 32,
- 65,225,129,103, 25, 49,210,138, 46,248, 57,207,142, 63,102,200,128,133, 71, 78, 95,253,166, 71,183,142,120,150,160,128,136,207,
-129,144,207,134,144,207, 6,151,177, 96,221,143, 91, 77,121,249,202,144,156,200,147,217,239, 80, 63, 47, 23, 62,253, 22,152, 59,
-139,202,101,239,166,133,191, 76,250, 98,117,143,158, 3,199, 49,207, 30, 94,251, 82, 3, 92,169,220,131, 30,169,212,123, 86,107,
-229,239,113, 66, 27,231,141, 51,231, 46,159,217, 61,228, 3,176,217, 28,152, 76, 38, 28, 61,184, 23,187,190, 95,252,210,160,202,
- 25, 7,192,106,144,177, 39, 31,218,251,227, 7, 95, 44, 90,199, 52,104,212,188,197,181,244, 63, 78, 71,107,101, 51,219,198, 76,
-152, 50,204,205,205,205,230,247,136, 22, 65,237,192,122,232,221,111, 48, 46,156, 60,142,231,145, 17,176,146, 2,195,100,181, 18,
-200,243,114, 50,204, 38,195,238, 50, 91, 60,132, 66,223,157,187,246, 4,176, 88, 12,140, 38, 43, 12,102, 43,102,125,244,161, 97,
-234,167, 95,182,237,221,189, 67, 36,159, 13, 69, 66, 82,186,253,221,240, 23, 65, 86,174,212,123,194,156,117, 60,157,222,130,124,
-141, 9,103,127, 46,219,235, 8, 29,124, 90, 85,111,210,123,194,212,175,182, 11, 4,108,150,177,126,109,239,184, 14, 45,235, 39,
-251,120, 58, 43,151,173,250,190,249,237,251,225,189,135,142,156, 32, 28, 91,167, 9,227,233, 36,178,249,112,228,192,134, 22,179,
-113,140, 38, 55,185,204,241, 5,185, 98, 7,185, 79, 13,127,205,239, 17,163,218,199, 24,130,154,111, 56, 15, 6,113,218,204,232,
- 65, 0,224,225,233,163,227, 10,108,149, 85,136,192, 16, 0,216,244,211,175, 77,159, 68,167, 77, 90,191,126,131, 56, 44, 86,137,
-199,177,249, 16,240, 88, 48,154,172, 96, 42, 25,212,182, 18,246,148, 5,243,231,217,230,169, 45,184, 30,145,133,200, 71,215,136,
- 65,165, 27, 41, 54,219, 14,130,171,205, 24, 0,181, 0,188,102, 24,178, 77,157,233,126, 18,184, 97,174,106,189,183, 90, 11,158,
-151,109, 93,252,106, 90, 56,130,222, 92,190,164, 21,195,144,250, 12,129, 3, 64, 82,115, 11,239,169,149,117,106,234,204,104,172,
- 94,185, 8, 27,119, 28, 71, 90,142, 14,118,150,100,156,252,121, 57, 62,251,102, 63,180,250,178,179, 26, 42,242, 35,165, 25,163,
-183, 13, 87,209,255, 69,235,125,243,205, 55, 33,111, 29,155,144, 50,142,217, 31,214, 43,250,254,170, 85,171, 86,150,248, 92, 83,
- 89,147, 85,108,180,138, 54,170, 2,179, 85,219,197,195,247,183,147, 39,142, 57,228,169,140, 16,242,216,240,169,225,143, 37,155,
- 79,186,244,106,234,140,108,163, 29,126,221,254, 93,174, 78,163, 60, 88,169,139,133,107, 96, 11,145, 84,114,246,216,209,227,240,
-243,113,229,237,187,149, 27, 31, 30,167, 45, 14,245, 42,178, 18,249, 53,108, 53,156, 65, 3, 7,138,175, 92,189,246,169, 10, 40,
-213,104,177, 25,118,181,159,246, 28,117,181, 17,113,193, 48,128, 82,107,198,164, 49,131,223,255, 54, 70,172,236, 9,227,198,130,
- 41, 52, 89,138,156, 12,124, 57,247, 35,157,196, 20,243, 60, 41, 33, 41,181,107,223,207,174, 40, 84,140,110,216,232,143, 30, 62,
-143,254, 38, 79,163,121,183, 73,126,244, 6, 11,244, 70, 43, 98, 99, 95, 99,214,216,110,224,178, 89, 96,179,173, 5,201,210,230,
-178, 43,163, 42, 45, 58, 23,238,188, 33,123,215,206,248,201,211,205,213, 73, 42, 17, 17,169, 88,192,212,175, 19,192,107,217,178,
- 53,191, 70, 96, 67,222,173, 23, 90, 36,101,105, 17,151,150, 15,129, 91, 99,206,240,206,189,176,119,195,156,142,185, 73,143, 88,
-248, 99,146,226, 27, 92,186,126,175,239,142, 31,215, 11, 50,229, 70,188, 76, 82, 33, 35, 79,135,244, 60, 61, 50,114,117,144,138,
-184,104,223,111,178,224,204,201,109,125,187,180,107,177,233, 93,182, 59, 46, 46,254, 76, 66,106,250, 7, 13,131,155, 99,239, 47,
-187,218,217,219,215,176,149,203,227, 21,149, 61, 58,203,151, 47,231,175, 90,181,138,179,121,243,102, 69,203,150, 45,221,231,207,
-159,223, 67, 38,147, 61,168, 94,189,122,224,133, 99,187,175, 54,110,223,191, 25,172, 70,151,118, 29, 58,241, 4, 86, 14, 46,134,
-134, 26, 15, 29,220,151,163,213, 42,167,150,107, 56,196,118,203, 51, 85, 12, 92,188,188, 34,165,124, 75, 55, 14, 75, 30,157,119,
-126,230,158, 60,224,152, 95,207,143, 47, 95,123, 20, 21,221, 52, 44,193,245,106,216, 43, 89,174,198, 88, 59,246,252,103,229, 94,
-120,217, 12, 3, 46,155, 5, 27, 17, 7,172,194,171,170,212,179,225, 43, 48,140, 75, 81,228,148, 1, 83,248, 23, 96, 24,164,229,
- 37, 61,174, 68,206, 6, 67,172, 4,136, 74, 81, 67,165, 43, 8,205, 87,115, 22, 35, 43, 51, 5, 63,108,218,141,240, 71, 15,209,
-189, 87, 63,108,249,105, 31, 38,141,249, 64, 87,209,211, 15,139, 85, 24,209, 42, 17,205,146,138, 56, 0, 24,200,213, 38, 28,189,
-157,140, 90, 53, 89,149,190, 49, 0,128,141, 84,140,124,165, 22, 44,158, 13, 94,135,157, 21,159,187,118,127,254,194,175,215,127,
-158,151, 30,145,244,234,233, 45, 4, 58,231,163,166,151, 17,145, 25,182,120,148, 83, 3,129,254,126, 96,241, 30, 86, 74, 59, 59,
- 50,104,245, 73,214,209,144,166,141,235,181,242,117,181,135,214, 96, 41,140,106,177,177,107,231, 30, 36,196,167, 76,200,121,126,
- 50,252,207,112,180,106, 89, 92,150,192,213,127,250,211,251, 87,226, 6,142,156, 14, 15, 47,159, 70,242,164,199,149, 78, 91,168,
-204,123,150, 74, 26, 45,158,216,126,254,172, 5,223,206,236,222,103, 8,238,221,186,130,199,145,175,209,162, 69, 51,244, 26, 48,
- 28, 74, 69,110,157,195,123, 54,116, 51,107,148, 23, 56, 2,243,204,230,173, 59, 51, 86,139, 5, 49, 47,159,189, 46, 77, 75,155,
- 30,245,248,110,122,148,237, 27,205, 83,206,117, 26, 73,237, 28, 31,235,141, 22,164,166,166,224,206,111,215,131,181,233, 81,143,
-171,178,191, 4, 60, 54, 46,134,203, 96, 52, 89, 97, 52, 91,209,190, 67, 55, 3,143,165,111,183, 98,253,206,150,233,105,233, 44,
-137,173,179,213,209,171, 46,207, 67, 96,212, 63,137,205,231, 25, 77, 86,248,121, 74,202,213,116,241,244, 95, 57,103,206,172,186,
-108,158, 8, 74,181,222,144,158,150,234,190,253,215,107,170, 23, 47,159,122, 85,115,181,179,253,118,195, 54,158, 66,199, 64,150,
-175, 71,174, 82,193,140,156,242,133,231,142,239,191, 25, 85,158,209, 42, 37, 93,164,230,153,139,183,234, 56,216,240, 24,149,206,
-108,205, 81, 24, 45, 35, 7,188, 95,167,203, 66,147, 53,121,253,186, 13,226,240, 88, 37,158,196,230, 67,200, 99,131,207, 99,193,
- 96,178,162,146,167, 19,203,221,213,125,106,235,166, 65,184,240, 56, 27,108, 54, 11, 90,101,158,134,131,156,232,166, 29,187,139,
-155, 52,111,137, 78, 29, 59,224, 85,116,148, 79,232,169,163, 93,238,222,185,145, 97, 54,214,158,161,206,138, 62, 94,165,192,130,
- 70,195, 54,241,221, 63,244,240,170,222,102,208,240, 15,237,124,125,188, 24, 87,103, 39,152, 9, 7,147,199, 12,174,244,153, 95,
- 96,204,129, 85, 95,207,135, 94,111,128,139, 61, 31,132, 0, 59, 55, 45,129,193, 96,128,167,147, 0,249,234,178,103,147,171,200,
-143,148, 21,133,170, 82,238, 73, 9, 51, 86,222,251, 12,195,132,206,155, 55,239, 75, 0,100,222,188,121, 95, 22, 45,127,243,205,
- 55, 90, 0,105, 21, 52, 29,110,127,195,104, 21,109, 92,217,103, 55, 47,208,217,201,227,238,197, 11,231,237, 78, 60,177,226,222,
-241, 71,232,211,194, 3, 60, 14, 11, 98, 59, 79, 60,137,207,199,153, 99, 63,202, 79, 30,216,150,170,215,235,215, 84,220,214,236,
-223, 84, 42,150, 92,248,101,239, 65,171,179,147, 19,235,135,139, 89,177, 57, 74,115,113,147, 86,244,253, 83,214, 71, 23,182,123,
- 16, 48,231,133, 66,161,191,193, 96,112,168,232,192,238,188,152, 88,152,196,203,252, 25,215, 86, 48,108,182,101,239,190,189,112,
-182,229, 67,111,178, 98,222,231,159,104,199,118,151,202, 71, 14, 29,222,185, 83,239,153, 87,185,146,128, 43,173,131, 3, 72,227,
-198,141,229,108, 54,187, 82,169, 20,174,174,174, 75, 88, 44,214, 8, 62,159,111, 99, 48, 24,148, 6,171, 78,172,214, 25,160, 51,
- 2, 26,141, 14, 92, 94,129, 89,228,178, 25,104,117, 6,104,180,134,242, 79,140,140,103,183, 1,212, 86,148,136, 41, 93,121,225,
-199,223,127,248,228, 39, 67,134, 14, 91,232,213,104,128, 52, 62, 61, 31, 60,198,136,102,117, 61,112,237,252,113,146,146, 16, 61,
-171, 34,147, 5, 0,178,172, 92,111, 23, 23, 55,132,199,169,144,154,163, 69, 70,161,201, 74,207,211, 67,169, 85,162,161,175, 39,
-228,249,249,222,239,188,127,129,227, 23, 46, 92,248,160,119,255, 97,152,249,249,210,182, 63,255,248, 93,132,132,207, 29,175,206,
-140,185, 94, 25,163,245,236,217,179,220,185,115,231,214,250,233,167,159, 88,163, 70,141,210, 6, 5, 5, 9, 71,143, 30,221,118,
-207,158, 61, 66,177, 88,168,125,114,235,212,194,137, 31,207,235,191,125,227,242, 70,121,121,121,140,217,100, 58,103,204,203,155,
-167,170,192,204, 37,159,250,242,229,226, 88,227,184,110,237, 92, 78, 57,138, 89,245, 5,196, 48, 28,117,151, 28,196,139, 37,198,
-216,243,155,149,162, 15,214,126,156, 38,183, 46,208,177, 92, 87, 84,100,178, 0,128,197,102, 96, 48, 91, 96, 35,226,130,197, 98,
- 21,153,120,143, 93, 7,207,137, 93,236,248,224,178, 89,224,176, 25, 40, 52, 38,100, 43,140,152,254, 97,255, 74, 63, 9,152, 45,
- 4, 90,131, 25,154,194,167, 67,165, 34, 27,243, 63,159,141, 94,125, 7, 98,226,212,217,200,211, 2,143,226,148, 48,154, 76, 21,
-158, 20, 44,134, 5,141,222,140,241,221,125,145,171, 50, 66,173, 53,195, 96,182, 66,204,231,128,203, 97, 65, 34,228,192, 86,204,
- 5, 8,225, 21, 93, 76,184, 92,174,206,100, 50,237, 45,231,137, 30, 53,188,221,160, 53,177,208,124,216,119,232,218,170, 54, 34,
-111, 31,229,220,184,247,180,230,167,159, 47,192, 39,147,250,226,200,203, 90,112,116,245,133, 84, 34,130,137,176, 0,144, 74, 38,
-236, 45,177,178,140, 3, 71,108,253,105,103,212,178, 69,243,132,114, 53, 3, 1,143,141,171, 87, 46,227,238,253, 71, 27,179,159,
-159,220,139, 63, 17, 46, 97,185,217,218,218, 66,200,103,195, 96,212, 27, 42,159,186, 64, 64,128, 96,137,107,237,173,133, 79,252,
-193, 22, 43, 74,121,175, 98,163,197, 17,218,206,155,241,249,178,149,221,251, 12,193,197,208, 35, 56,124,228,160,165, 85,207, 9,
-236,125,187,126, 68,219,174,253,208,182,251, 48,156, 59,190,103,182,218,202,212,155, 60,115,225,215,237, 59,247,198,197, 51, 71,
-144,153,145,178,182,178,229,101,115,153,153,157,187,245,133,206, 96, 65,187, 46, 33, 56,127,250,248,199, 40,236,100, 81,249,155,
-216, 91,215,103,176,204,179,103,205,228,202,228, 6,110,150,194,128,148, 44, 13,226, 51, 53, 56,121,224,103, 82,249,235,133,161,
- 89,251,134,213,184,147, 87, 95, 77,246,174,230,161,231,234,181,162,232,215,177,117, 38,126, 56,150, 91,211,191, 14, 75,150,175,
- 71, 86,190, 30,217,249,122,168,116,102,248, 87, 11, 96,153,204, 76,171,170, 30,103,103, 59, 62,119,203,233, 56,216, 74,184,104,
- 93,231,221, 59,218, 90,173,214,223, 77,214,250, 2,147, 21, 17,151, 15, 1,143, 13, 1,143, 5, 1,143, 13,179,133, 84,234,193,
- 69,228, 90,187,247,244, 25, 31,121, 26,204, 64, 78,190, 1, 28, 54, 3, 87,103, 7, 73,179, 70, 35,176,243,187,143, 1, 0,147,
-230,254,128,137,227, 71,163,110,253, 32,200,243,242,220, 71, 12,233,189, 30,192,241,202,150,245,236,197,235, 62, 23,111,134,207,
-157, 62,103,177,116,104,223, 78,236,199,177,249, 72,207,213,227,117,180,178, 74,145, 55, 0, 48, 91,172, 32, 32,216,125, 48, 20,
- 34, 62, 7, 89,249, 70, 16, 66,176,124,243, 33,216,136,184, 72,207, 43,104,238, 47,143,114,253, 72, 57, 17,169, 42, 68, 27, 67,
- 80,144,203,229, 82,217,136,214, 55,223,124, 19,249,205, 55,223,148, 26, 33, 43, 97,178,222,109, 82,105, 30, 79, 82,199,214,201,
-249,222,197,243,103,109,142, 63,177,224,218,147, 28, 12,105, 87, 13,170,220, 36,172,249,124,104, 46, 3, 98, 96,177,217,114,189,
- 86,115, 76,171, 85,175, 0, 96, 44,183,210,184,215, 14,150, 8,165,151,183,108,255,197,236,236,234,138,189,183,114, 83,242,212,
-102,211,239,205, 86, 38,230,209,133,237, 53,205, 86, 83, 79, 93,230,171,135, 21, 61,137, 91, 9,120,223,252,120, 18, 0,129,213,
-106, 5,177, 90,193, 21, 74, 37,206,126, 45, 51, 11, 47,116, 66, 14,139,209,149,188, 2, 16,171, 57, 37, 59,174,252, 48, 40, 3,
-192, 78,204,197,193, 27,169, 0,144,201, 86,134,189, 24, 57,180,160,185, 80,103, 16, 42,234,215,170, 69,154, 53,107, 38, 23,137,
- 42, 53,252, 21,219,205,205,237,193,194,133, 11,235, 76,156, 56, 81,192,231,243, 97, 54,155, 29,183,109,223,110,221,190, 98, 18,
- 6,125,188, 5, 60,190, 0, 90,157, 17, 92, 46, 7,121,249, 42,200, 21, 26, 40, 53,166,170,215,160,216, 88, 67, 22,176,250,196,
-113,254,192, 30,210,134,205,249, 44, 30,154, 4,122,224,218,133, 19,228,222,249,157,147,180,178,232, 95, 42, 89, 17,161,210,153,
-144,150,163, 67,106,142, 14, 25,121, 58,100,228,234,145,145,167, 3,195, 48,208, 25,204,239,117,227, 82,203,162, 14,239,253,101,
- 71, 63,189, 17,195,219,119, 31,136,217,139,183,248,238,221,186,234,114, 28, 97,181,169,100,162,173, 37, 50, 50, 50,225,195, 15,
- 63,108,244,235,175,191,178, 27, 52,104,160,125,241,226,133,184,208, 68, 26,165, 82,177,232,231,239,191,185,208,188,121,243, 3,
-169,209, 47,175, 22,182,167, 87,120, 97,247,237, 48, 78, 32, 50,134, 79,246,145,180,238,225,231, 46,134,143, 68,217,163,142,244,
-201,154,156,206,159,172,204,186,186, 81,150,174, 55, 95,202,210,178, 27,167,170,184,149,202,193, 51,233,117,137,131,134, 12, 7,
-155, 97,193,168,211, 36, 22, 85, 46, 87, 59, 62,150,236,123, 9,169,144, 11, 27, 17, 7, 82, 17, 23,109,235, 57,162, 10,215, 51,
- 98,178, 88,161,209, 91,160,213,155,161, 51,152,225,236,237,128,159,246, 30, 70,146, 76,139,147, 15,179, 17,149,168, 68, 64, 53,
- 9, 8,169,248, 50,105,181,152,212,125, 7,143,178, 97,179, 24,176, 89, 12,171, 94,157,218,200, 85, 25,193,227,176,192, 19,138,
- 32, 17,112, 96, 43,226,130,199,227, 66, 38,147, 65,175,215,195,199,199, 71, 88,190, 21, 36,176,145,138, 16, 80,211, 19, 70,147,
- 25,103,111, 62,199,138, 89,131,208,173,125, 83, 48, 92, 41, 94,234,131, 97,227,104, 3, 43,139, 5,163,217, 10,131,209, 2,128,
-165, 43, 75,207,219,219,187,179, 68, 34,145,104, 52, 26,101, 82, 82,210,245,140,168,227, 73, 22,118,255,201,231, 47, 94,221, 27,
-210,171, 27,194, 35, 34,113,228,248,169, 91,217, 78,249,115,138,190, 83,191,126,253,150,206,206,206,210,156,156, 28,197,179,103,
-207, 30,188,235,115, 1, 97,177, 62,109,213,182, 35, 84,114, 25, 50,147,227, 43,253, 20, 93,215,215, 6, 95,125,179,165, 73, 96,
-237,192, 38, 22, 82, 96,188,234,249,216,224,179,197,155,154,212, 10,168,221,164,168, 67, 72, 93,159,242,135,101,227,136,109,186,
-143,153, 56,251,155,126, 67,198,225,234,197, 83, 88,183,226,243,189, 18, 59,151,186,142, 14,118,141, 27,180,236,142, 91,151, 79,
- 65,104,227, 14, 7, 39,247,182,163,198,207,232, 58,100,212, 20,220,189,117, 25, 27, 87,125,185,199,162, 87,238,175, 76, 89, 37,
-174, 53, 93, 26, 5, 55, 31,105,227,232, 6,121,190, 18, 54, 14,174,168,219,176,217,200,231, 79,244,115,213,178,184,172,119, 54,
- 29,132, 64,111, 36,200, 83, 25,145,156,165, 69, 66, 70,129,209,178, 90,171,144, 19,100,177, 50, 82, 33,135,227,104,122,229,243,
-244,242, 85,226,235,237,198,172,254,250,115,182, 17, 66,100,201, 11, 76, 86,150,194,128,172,124, 3, 84, 58, 19, 28, 37, 28, 88,
- 45,214, 42, 63,117,231,169,140,176, 17,115, 97, 39,230, 85, 58,202, 88, 26, 63,238, 58, 24,248, 36, 58,109,192,186,117, 27,196,
-143,227, 74,152, 44,110, 65, 52, 75,192, 99,195, 98,181, 2,149, 56,227,185, 28,238,204,254,189,187, 34, 57, 91, 91,208,107,153,
-197, 32, 32,168, 57,156, 69, 86,116, 25, 54, 15, 0,208,183,119, 65,106, 91, 92,186, 26,167,239,101, 1,111, 38,118,151,127, 45,
-214,106,217,219,247,157,249,244,240,161, 3,118, 58, 11, 7,219,206, 37, 64,163, 55, 67,200, 99, 67,192, 99, 67,196, 99,191,145,
-143, 93,177,209, 42,200,185, 75,202, 54, 65,163,211, 65,161, 53,129, 0,120,240, 74, 5,173,193,140,124,181, 9, 45,235, 56,188,
- 95, 32,132, 97,206, 16, 66,250,188,109,136,222, 54, 75, 37, 34, 82,165,105, 60, 44,169, 81,180,126, 89, 70,174,100,206, 22,128,
- 42,245,224,226,188,237, 28, 75, 46,243, 36, 14,117,237,108,236,238,157, 63, 23, 42, 61,254,196,138,235, 17, 5, 38,203,164,205,
-198,218,185, 35, 82, 20,242,236, 78, 0, 98, 43,251, 99, 98,231,186, 13,133,124,193,213,111, 55,108, 51,186,186,121, 89,143,221,
-147,203,242, 53,150, 55,220,132, 69,175,103, 17, 43,225,233, 50, 95, 85,170, 13,129,197, 98,140,139, 63, 30, 8, 43, 33, 88,178,
-225, 48, 86,206, 25, 6,169,104,148,152, 97, 24,177, 90,103,198,172,165, 59,176,246,171, 9, 54, 98, 1, 7, 12, 83,144, 19, 53,
-102,248,192,202, 85, 64,157, 25,175,239,255,170, 82,198,133,190, 40,217, 92,216,162,109,175, 71, 45, 90,180,144, 59, 56, 56, 64,
- 36, 18,253, 30,169, 40, 3, 55, 55,183,175, 22, 47, 94, 28, 56,117,234,212,226,193, 62, 57, 28, 14,166,127,244, 17,203, 98, 33,
- 56,119,110, 39, 92,170, 7,227,212,165,123,232,217,185, 25, 84, 26, 29,114,229, 74, 88,193,126,231,138,168,148,103, 95,205, 72,
-120,218,188, 77,167,190,184,126,225, 4,185,119,238,231, 73, 85, 25,163,199,193,209, 33, 57,236,233,235,186, 12,227, 88, 16,209,
- 42, 52, 89, 6,147, 21,190,110, 98, 36, 39,188,134,189,157, 93,114,101,245, 68, 46,129,253, 25, 22,153,202,128,236, 84,103,198,
- 28, 6, 64,212,233, 47, 70, 28,222,191, 61, 34,242,217,227, 21, 33, 35,103,114,186, 15,249,136,189,245,155, 25, 95, 2,168,236,
-192,123,198,168,168,168,231, 19, 38, 76,104,125,247,238, 93, 11, 0, 13,195, 48, 38, 54,155, 45, 54, 24, 12,188, 78,157, 58,229,
-191,124,249,242, 6, 74, 79, 90,124,131,182, 31, 30,118,102, 4,202, 94,124,171,113,132,175,141,178, 91,167,118,173,208,170,190,
- 55,146,219,181, 2,128,153,137, 42,105,160,174,214,142,131, 38,179,232,236,214, 93,167, 87, 78, 26,214,117,214, 94,206,146,117,
-233,161, 75,202, 77, 68, 77,126,113,163, 71,105, 54,158,195,102,193, 70,196,133, 84,196,129,141,136, 11, 27, 33, 23, 38, 51,169,
-202,147, 35, 49,153,173, 5, 17, 45,131, 25, 42,173, 25, 87, 31,103, 34, 35,223, 0,185,210, 8,173,209, 2, 2, 82,240, 52, 90,
-137,171,121,214,171, 59,246, 69,119, 82,123,159,224,252,237,155,191,179, 61,122, 59,165,184, 71,159,157,152, 15, 27,113, 65,111,
-236,155, 55,111,194,201,169,226,167,125,171,213,138, 35,231, 31, 96,221,238,171, 56,191,243, 11, 8,121,108, 52,236,191, 20,227,
- 6,180,128,149, 88,241, 58, 42, 50, 51,160, 94, 35, 55, 22, 75, 4, 22,195, 64,111,178, 2, 32,101,238, 79,131,193,224,148,148,
-148,164,240,247,247,119,247,244,244, 28,194,102,179, 9,148,143,245, 39, 14,228,106,174,132,238, 23,171,181,122,139,216,156,191,
-211, 63, 93,219, 7,254,254, 96, 24,134,216,218,218,242,174, 94,189,170, 10, 10, 10,114,121,199, 83,137, 37,114,173,189,113,226,
-180, 79,135,212,242,243,195,225,253, 59, 65, 8,115,180,178, 95,222,119,250, 46,190,158,255,102, 15,195,207, 22,111,106,178,118,
-233,204, 55,222,155, 54,127, 93,185,189, 14, 69, 2,233,156, 65, 35, 38,227,209,131,223,176,102,233,103, 7,244,170,220,113, 38,
-179,233,131,220,244,184, 3, 53,235,181, 0, 49, 42,113,241,208,119, 24, 54,122,146,160,123,200, 16,220,189,117, 25, 43,191,156,
-182, 79, 35,151,125,136, 74, 38, 57, 91, 9,119,106,167, 30, 3,184, 90,189, 17,155, 86, 47,194,148, 57, 43,208,178,115, 95,238,
-179,199,247,166, 2, 88, 86,233,116, 8,163, 5,157,130,156, 11,204,179,201,138, 83,113,108, 78,105, 53,144,195,102, 88,141,253,
-236,161, 53,152,161,168,224,161,146,195,227,102,200,243, 21,213,191, 95,249, 41, 91,173, 51, 35, 43,223, 0, 89,190, 30,217,242,
-223, 13, 86,118,190, 30, 89,249, 6,112, 57, 12,162, 99, 19,193,226,114,170,156,159,151,167, 50,161,121,109,135,130,115,244, 29,
- 91, 71, 76, 28,219, 22,231,111, 60, 25,180,110,221,122,225,147,120, 37, 34,226, 20,133,145, 44, 54, 4, 92, 22,248,133,255, 91,
-172, 5,185,145,229, 97,235,226, 87,115,236,152, 81, 93,108,165, 34,164,197,200,192, 97, 23, 12, 17, 99,231,234, 13, 59,129, 14,
- 51,166, 77,134,179,147, 61,146,178,245,216,120, 60, 26, 17,207, 95,193,170,173,218,102,111,218,118,160,231,196,233,159,217,179,
-184,124,236,185, 16, 95, 80, 78,182, 5, 47,239,157,214,165,189,126,170, 86, 41,114, 8,136,165,146, 57,200, 12, 49, 91, 10,170,
-219,202, 37,243,112, 96,247, 15,184, 16, 38, 43,174,129,183,143,174,197,167,243,151, 35, 91, 97, 64,105,245,178, 60, 63, 2, 32,
-171, 68, 36,234, 15,203, 37,204, 81,105,203, 76,225,178,161, 12, 13,195, 91,230,202,240,214,251,134,183,244, 74, 27,251,111,123,
-133, 77,135,127, 48, 69,246, 46, 13,196, 66,201,111,231,206,157,150,156,136, 32,197, 38,203,168,201, 38, 43,102,246, 77, 81,200,
-179,186, 87,201,100,185, 4, 52, 16,136, 5, 55, 22, 46,223,168,119,243,170,110, 62,251, 88,145,163,212, 89,204,127,204, 65,144,
- 88, 36,118, 46, 58, 14, 95,176,142,171, 53, 44,202,206,126,161,174, 40,242,100, 37, 4,161,247, 51, 64, 72,193, 35,210,161,155,
-169, 40,124, 50,135,197, 90,208,172,114,233,177, 12,156,194, 60,148,202,134,191,127,220,246,131,162, 79, 80,190,122,228,202, 37,
-197,205,133, 45, 27, 21, 68,178,108,109,109, 97,111,111, 15,169, 84,138,138,154, 14, 25,134, 25, 51,113,226,196, 63, 60,253,203,
-100, 50,116,237,210, 9,155,127,248, 9,141,186,140,197,165, 59, 23, 96, 52, 89,209,176,158, 31,170,123, 58, 32, 57, 83,249, 78,
- 39,186,196, 45,112,122,243, 78, 3,190,108,219,185, 47,174,158, 63, 70,238,157,223, 53,185,170, 3, 33,246,233,218,250,244,215,
- 95, 47,169,185,112,197,247, 2, 27, 33, 7, 47, 84, 6,176, 24, 6,190,110, 98, 56, 73, 88,184,126, 98,143,110, 88,223,214,149,
- 30, 28,207,219,219,107,239,218,205,219, 37,107, 87, 45,237,244, 40,140,185,170, 74,139,206, 5, 0, 77,102,212,234,151,192,243,
-106,191, 93, 60,219,168,195, 64,184,121,250,117,139,203,124, 89,105,179, 1, 64, 19, 27, 27, 27,183,112,225,194,192, 85,171, 86,
- 17, 54,155,109, 5, 32,216,176, 97,131, 38, 38, 38,230, 49, 10,186,230,162,162,155, 77,151,110,245,103, 73,249,150,150,142, 98,
- 86,125, 63,119, 49, 90,213, 47,104, 21, 29,214,167, 45,188,125,124, 16,155,161,105,156,171,177,114, 85, 6,182,223,150,109, 17,
- 15,107, 56,179, 39,153,181,134,231, 0, 78,190, 67,179,105,113,130,124, 81, 52,203, 70,196,133,181,160,174, 84,201,104,233,141,
- 22,104,245, 22,104, 13,102,168, 13, 22,104, 12, 22, 88, 73,193, 57,193, 48, 12,140,102, 43, 42,245,216,252, 86,221,183,117,116,
-134, 95, 13, 6,182,226,130,178,217, 22, 14,247,192, 0,112,114,114,130,171,171,107,165,162,162, 6, 99,193, 41,110, 48, 89,139,
-155,245, 13, 70, 51, 8, 33,136,142,142,250, 34, 33, 46,174,191,127,128,127,251,122, 13, 27, 57,138, 5, 44, 0, 40,211,104,105,
- 52, 26,139,141,141,141,171,163,163, 35, 43, 53, 53,181,216, 60,251, 55,238,100, 62,126,236, 40, 6, 13, 26,168,122,241,224, 73,
-113, 23,119,173, 86,203,180,105,211,198,214,219,219,155,165,215,235, 21, 85, 61, 76, 18,151,218, 3, 28,156, 28, 87,140,249,112,
- 74,237, 78, 93,123,226,218,149,139, 56,121,236,215, 95, 52, 89,209, 23, 43, 43, 18, 24, 88,231, 15,189, 14,107, 5,212,254, 67,
-175,195,234, 53, 3,202, 53, 90,245, 26, 54,107, 65, 24, 14, 46,132, 30, 34, 58,150,113, 26, 0,171, 69,167, 60,116,240,199,175,
-150,141,152, 58,191, 86,239,126, 35, 48,102,244, 56,112, 56,108, 92,191,116, 26,107,151,206, 62,163,202,151,141,173, 76,154, 64,
- 65,232,173, 46,207, 75,228,253,137, 79,173, 6, 8,187,119, 11,175,163,159, 69, 62,121,120,183,190,127, 80, 75,184,120,250,126,
-146,232,204, 94,133, 23, 47,140, 21,201, 24,116,186,196,113, 99, 71,163,100,175,195, 86,193,129, 78,204,219, 39, 0, 0,141, 82,
-102,252,249,187, 89, 49, 69,189, 14,173, 70, 67, 98, 89,186,249,121, 89, 71,174,223,185, 63,167,127,159,158,172,108,133,161, 32,
-130,149,111, 40,124,233,145, 93,244,191, 66,143, 0, 79, 41,162, 34,195,172,186,252,236,163, 85, 60, 47,117,227, 62,232,241,188,
-168,238, 90,173, 4, 12,160,171,114,179, 20,215,118,242,234, 53,235,132, 79,226, 84,136,136, 87, 20, 52, 21,114,217, 5, 6,139,
-203, 42, 54, 93, 5,189,217, 43,136, 14, 49,236,149,227,199, 14, 71,182,194, 8,171, 21,224,176, 89,133, 47, 30,146,148, 12,146,
-149, 26,100,231,101, 33, 46, 33, 17,242,140,215, 96,177, 88,112,246,172, 93,233,145,164, 45,132,239,161, 49,144,160, 33,125,218,
-115,142,253,150, 14,177,128, 3,189, 50, 19,231, 14,126,151,165, 87, 41, 86,104, 53,170, 99,149, 25,207,241,247, 20, 4, 38, 75,
-161,210,185, 9,184,108, 28,222,253, 61, 62, 24, 55,237,141,171,239, 23, 11,190, 6, 88, 12,114,243,148, 96, 24, 38,171,106,215,
- 37,230, 97,121,203,239, 24, 25,123,111,141, 82,204,214, 31, 31, 20,202,126, 26, 37,231, 46,158, 63, 45,185,157, 32,192,131,168,
-244, 66,147,149,101, 93,254,113,159, 20,101,126,110, 15, 0,209, 85,123, 46,100,245, 24, 54,126, 78,164, 95,237,122,250,107,207,
- 84,241,114,181,169,204, 60,135, 86, 67, 22, 70, 62, 58,179,185,119,190, 41,246, 35,137, 71, 61,139,213,108, 94,173,205,138, 94,
- 90, 70,211, 33,127,233,198,195,197,205,134,115, 87,237, 41,248,223, 98,129,133, 88, 65,172,192,140,175,126,132,217,106,129,213,
- 98,129,213, 66, 96,178, 16,113, 69,197,117,245,172,126, 44,239,229,161, 58, 35,151,253,177,185,208,222,222, 30, 78, 78, 78,112,
-114,114,130,173,173,109,133, 70,139,203,229, 74, 57,156, 55,119,117, 98, 98, 34, 18, 18, 18, 96,107,107, 11, 98, 53,193, 96, 2,
- 26,180,236,142,167,175,159,225,242,237,199, 32, 86, 11, 36,210,170,207,242, 34,113, 11,252,168, 89,199,254,223,119,238, 55, 1,
-151,142,109, 35, 15,111,158,158,162,149, 69,239,168,116,132,222, 98, 97, 76, 38, 19,250,116,239,152, 24, 30,249,234,252,130, 57,
- 83,123,182, 14,153, 34,104, 21,232, 5,157,193,130,148,132,215,184,126, 98,151,174,118, 77,143, 11, 93,218,181, 72, 52,153, 76,
-176, 88, 44, 21,222,200,117, 6, 99, 54,155, 43,146, 12, 31, 62,146,251,240,193,131,163, 18,151,128,195, 22,134,245,132, 33,214,
-134, 12, 33,131, 26, 54,172, 11,163,201, 10,141, 70,145, 87,213,109, 86, 42,149,113, 59,119,238,172, 57,118,236, 88,113,189,122,
-245,184,175, 95,191,198,218,181,107,115,148, 74,101, 92,101, 53, 46,222,140,218,192, 97,242, 98,138, 34, 90, 73,109, 91, 97,120,
- 72, 91, 28, 56,115, 27,215,111,221, 69,162, 74,250, 88,101,230,156, 72, 78, 76,211,215,119, 84, 28,237,215,170, 58,251,240,238,
-188,163,145, 29,231, 13, 37, 68,112, 49,251,198, 18,117,229, 79,110, 64,169, 53,193, 86, 92, 48,222, 83, 81,100,139,205, 48,149,
-118, 68, 12, 16,119,235,110, 88,131,166, 1,245, 16, 30,151, 15,153, 92, 15,173,222, 12,171,149,192, 10, 2, 39, 27, 62,132, 60,
- 22,146, 18,226, 96, 37,198,248, 42,222, 42,178, 58,180,239,192, 1, 24, 48, 12,225,112, 57, 28, 16, 20,140,175, 40, 18,137, 84,
-174,174,174,149,138,104, 25,205,102, 12,234,217, 2, 45,155, 53, 68,255, 41, 5, 99,102, 94,249,101, 30, 28,164, 92, 28,216,187,
- 3,201, 55, 55,236,173,217,106,234,197,103, 79, 35, 7, 71,134,255, 54,178, 87, 19, 81, 99,119, 78, 26,175,172, 48,169, 90,173,
- 62, 10,128,207,227,241,122,182,111,223,222,241,232,209,163,114,103,103,103, 43,159,199,203,234,215, 55,196,202,229,241,114,139,
-214,189,115,231, 14,119,202,148, 41, 54,121,121,121, 73,153,153,153,119, 1,152,202,127, 16, 12,236, 10, 22,126, 5,195, 8,165,
- 34,113, 98,141, 26,126,158,205, 90,182,176, 27, 48,232, 3, 8,248, 2, 92,186,120, 30,155,214,175, 58,164, 74,127, 49,190, 42,
-123,242,207,234,117,152,146, 20, 31,167,209,234,131, 26, 52,237,200,220,186,120, 98,166, 17,206,235,217, 2,227,119, 93, 7, 77,
-171, 21,151,166,194,166,111,190,128,131,157, 4,241,175, 95,106, 99, 94, 60,253,209,164, 83,124, 81,105,147, 5, 64,156, 99, 25,
-220,106,116, 79, 7,189,209,130,155, 87,207,232,172,102,107,207,187, 55,206,190,174, 86,187,153,176, 65,179, 46, 14,217, 39,119,
- 12,210, 0, 7, 42,210, 73,125,249,199, 8, 46, 49,200,227,175, 92,189,108,231,230, 91,159,205,128,129, 81,175, 67, 86,236, 67,
-179, 38,243,165, 66,145,250,172, 82,189,112,115,146,241,213,252,197,223,126,212,172,105, 83, 9,129,240,141, 8, 86,145,193,202,
- 86, 24,224,108,195,135, 86,145,133,152,135,231,117,154, 44,118,185,227,157,153, 13,106,113,182, 44,147,255,123, 58, 67,116,203,
-242,214,207,150,101,242,205, 6,181,184,226, 91, 29, 27,182, 18, 62,158,198,167, 22, 39,190, 11,184, 5,185, 89,124, 46,187, 56,
- 79,171,232, 90, 80, 1, 29,121, 66,123,164,230,232,192,128,192,106, 49,195,108, 50, 64,169, 80, 32, 53, 45, 3,153, 25,153, 80,
- 42,229, 16, 75, 29,208,160,113,115,216, 72,132,120,114,253, 16, 8, 33,149, 26,215,208,196,112, 3,155,181,108, 39,120,150, 80,
-144,139, 37,228, 18,156,254,117, 85,142, 74, 33,107,167, 74,143,137,169,234,181,216,108,177, 92,142,120, 30, 83,191,154, 71, 13,
-230,241,235,124,236,253,105, 51, 12,133,145, 77,147,201,130,103, 73,106,164,231,106,144, 20,251,130, 88, 45,150,203,248,143,192,
- 41, 59, 0, 8, 78,195, 6,117,209,125,212, 0,252,240,195,143,136,141, 75,176,174,152,217, 59, 73,165,148,247,170,130,201,234,
-138,194,177, 54, 52,153, 81,171,181, 14,205, 82, 78,133,231,178,180, 6, 82,110,130,143,208,197, 23,237,198,175,189,160, 85,230,
-242, 45,122, 13,231,244,222,241,191,150,166, 89,224,160, 97, 88,241,217, 48, 72, 69, 28, 48, 12,131,162,230,194, 45, 95, 79,134,
- 88, 80,208,182,172,213,155, 49,106,214, 58,236, 93, 55, 27, 4,192,136, 15,110,107,202, 42, 39, 10,230, 46,156,225,129, 7,213,
- 18, 19,100,169, 93,251,126,118, 69,103, 20,232, 67, 6,142,125,212,180,105, 83,185, 72, 36,130, 72, 36,130,173,173, 45, 28, 28,
- 28, 96,111,111, 95,225,182,155, 76, 38,149,193, 96,112,226,243,249,176, 90,173,136,143,143, 71,124,124, 60,242,243,243,145,149,
-149, 5,181, 74, 97,126,112,229, 48,167, 65,171,222,240,244, 11,130,111, 64, 35,112,217, 12, 56, 28, 22,174,159,250,169,172,114,
-150,110,178, 58,244,219,210,165,255, 68, 92, 58,182,157, 60,188,121,122,170, 86, 22,253, 83,101,143, 81, 97,115,207,147, 65,131,
- 6, 5, 77,153, 50,133,183,120,206,148, 11,103, 46, 94,143, 62, 28,186,189,111, 94,158,220,155, 16, 2,123, 59,187,228, 97,125,
- 91,159,238,212,166, 89,226,149, 43, 87,172,191,254,250,171,158, 97,152,167,229,105, 22, 92,164,100,191, 92,185,124,117, 73,187,
- 14, 29,177, 99,247,175, 29, 34,159,191,232,240,250,117, 12,188,125,253, 80,163,102, 0, 52,140, 3,174,222,184, 5,149, 92,246,
- 75,101,202,249, 86, 84,139,201,203,203,251,109,216,176, 97,221,111,223,190,205, 26, 54,108,152, 38, 59, 59,251, 78,137, 40, 22,
-169, 72,243,238,214,129, 89, 0,126,241,237, 48,238, 80,170, 81,254, 9,128, 85, 62,190, 62,184,126,235, 46,238,222,190,255, 99,
-182,216,103,233,248, 81, 31, 78,174,222,143, 61,177, 95,171,234,108, 87, 7, 49,246,111, 95,203, 62,117, 55, 97, 93, 66,142,101,
-199,170, 27, 75,190,174,204, 49, 42,190,113, 40,141,104, 83,215, 17, 38, 11,129,149, 20, 92,112,109,132,220,178, 46,188,127,208,
-228, 24, 4,227,167, 78,153,242,186, 65,195,198,159,142,250,112, 42,175,177,159, 55, 30,188,146, 3, 12, 3, 71,119, 9,210,211,
-211,113,243,200,118,115, 94,234,203, 31,217,108,235,178, 42,236, 79,228, 37, 62,246, 47,177, 56, 57, 59, 59, 27,215,175, 95, 71,
-145,193,114,113,113, 41,203,104,189,161,153,147,153,118,231,235, 53,219,218, 76, 26, 51, 16, 33, 29,235,227,198,195,215, 48, 20,
-142,215, 84,212,149, 60,238,238, 86,254, 39,195,252, 12, 31, 13,170,173,208,154,248, 9, 95,197,231,223, 68,193, 28,172,214, 50,
-202,105,200,205,205, 61, 21, 21, 21,213,182, 81,163, 70,213,207,158, 61,155, 27,121,255,194,204,146,133,248,236,179,207,164, 63,
-252,240,131,152, 16,114,199, 96, 48,196, 86,106,219, 89,216, 31,246,232,145,147,209,100,197,173,251, 79,234,118,105,211, 24, 86,
- 2, 60,124,248, 16, 59,126,222,161,123, 26,241,248, 59,117,166,251,178,114,204, 75,169,251,211,242,126,189, 14,139, 53,211, 83,
- 19,190,187,116,230,200,222,102, 29,250, 98,228,140,101,203,174,159,249,117, 73,147,118, 33,172,186,205,186, 35,236,238, 85, 92,
- 62,123,254, 91,163, 42,119, 9, 42,206, 29, 41,181,156, 2,145,248,227,122, 77, 58, 32, 41, 49, 1,241, 49,207,126,209,229,190,
- 74, 75,124,205,254, 37, 45, 37,113,106,205,250,109,112,251,194,129,153,229, 24,173,114,235,188,183,139,104,251,217,208, 83,195,
- 83, 82,182,186,171,181, 58, 1, 33, 68, 39,224,115, 50,164, 44,229, 65, 69,165,203,249,194,152,149, 86,125,208, 7,163,166,158,
-217,180,105, 61,215,205, 94,140,140, 60, 29, 20, 90, 35,148, 26, 35, 88, 12, 3,127, 79, 9, 52,202, 92,220, 56,178,198,100, 80,
-229, 13, 3, 94, 27,203,210,148,184, 6, 46,207,123,117,117,198,103,211,174,129,111,231,237, 89,163,243,252,114,163,117,202,212,
-199,125, 63,155,118, 58,144, 16,210, 69,226, 26,168, 84,203,162, 22,150,181,237, 12, 83,112,126,143,236,228, 13,163,185, 96,252,
- 49,179, 21,176, 88,173,133, 81, 62,128, 20,183,231, 51, 21,108, 59, 99, 61,120,230, 14,210, 50,229,208, 26, 76,208, 27,204, 48,
-154, 44, 96,177,217,176,119,176, 71, 64,141, 96,216,217,219, 34, 51, 35, 13,119,175,156, 66,116,196,141, 59, 12,193, 82,109, 86,
-204,149,202, 28, 35,158,200, 62,208,195,211,157,149,174, 48, 64,196,103,227,241,141,179, 70,147, 65,255, 93, 37, 77,214, 31, 52,
-229, 57,185,235, 62,157,243,249,136, 93, 59,119,187, 7,213,180, 69, 74,182, 22, 41, 89, 58, 40,117,166, 66, 35,102,133, 94,149,
-141,136,171,187, 51, 44, 58,229, 58,252, 71, 40,211,104,153,141, 58,229,209,243, 15,156,230, 45, 89,195,126,245, 58,214,180,252,
-147, 62, 41, 90,149,162,119,149, 35, 89, 37,216, 53,189,230,129,191, 98, 35,254,208, 92, 72,172,176, 18,130,211,247, 51,138,155,
- 11,173,133,153,151,225,175,203,159, 70,176,228,220,133, 29,123,207,188, 20, 17,165,220,167,213,102,218,189,124,245, 93, 30, 0,
-176,217,236,226, 87, 81,110,150, 78,167, 51, 84,208,132,178,231,167,159,126,154, 59,117,234, 84, 65,114,114, 50, 94,191,126, 13,
-185, 92, 14,161, 80,136,243,231,207,155, 96, 53,127, 23,113,251,120,124, 84,216,197, 69,129, 77,187, 87, 11,106,213, 27, 98,177,
- 4, 28, 82,249,100, 76,177,107,237,225, 77, 59,244,251,190,203,128, 73,184,124,252, 39,242,240,198,169,105,218,172,232,237, 85,
-221,151,114,185, 60, 18, 64,204,119,223,125,215,120,199,142, 29, 53,231,204,153, 19,187,231,251, 37,155, 0, 32, 39, 39, 7, 0,
- 16, 30, 30, 78,166, 77,155,166,215,233,116,113,121,121,121, 97,168,160, 3, 4, 0,104,179,196, 43,119,108, 89,213, 32, 57, 53,
-125,160, 95,131,230,112,169,217, 28,238,254, 45,144,167, 52,226,193,171, 52,196,190,184,130, 23,183,142,156,213, 72,205, 75, 80,
-197,241,141, 27, 53,106,228,205, 98,177,106,168, 84, 42,247,122,245,234, 53,146, 72, 36,225,141, 26, 53, 10,230,112, 56, 41,143,
- 30, 61, 74,168,138, 86,226,141,221,122,223, 14,227, 54, 38, 42,109, 58,197,102,104,130, 19,149, 54,225, 26,129,221,236,172,171,
- 27,245,187,216, 94,235,136, 49, 59,242,240,110,197,209,253,219,215,178, 71, 77,254,204,242, 44,223,225, 19,142,136,127,169,106,
-225,106, 86,250, 71, 99,251,255, 62,188, 67, 97, 36,171,240,255, 74,133,233,243,243, 35,242, 1,204,141,120,206,253,254,217, 39,
- 83,190,110,216,172,205,232,246,189,134,177,204, 60, 41, 46, 28,223, 74,226, 34,174, 30,230, 16,203, 2,109, 37,102, 3,168,176,
- 57,200, 96,168,140,201,250, 99, 25,147, 37, 29, 15,255,250,243,184,163,199,143,125, 51,160, 95,127,167, 45, 95, 13,197,154,109,
- 39, 32, 17, 9, 64,172, 86, 12,237,228, 61,100,209,196, 58,125,189,221,132, 94, 71,175,165,220,156,177,254,217, 92,141,198, 24,
- 93,137, 72, 12,201,206,206,190, 37,149, 74,179,218,182,109,219, 82, 32, 16, 48,217,217,217, 28, 87, 87, 87,179,157,157,157, 33,
- 37, 37, 69,163,215,235,143, 2,168,210,176,227, 70,147, 21,241,153, 58,156, 60,118, 20, 79,238, 95,193,139, 23, 81,202, 23,207,
- 95,108,102, 56,100,189, 58, 51, 38, 23,168,242, 3, 62,172,165,246, 58, 36, 85,238,117,104,209, 43,247,239,249,113,121,103,141,
- 78, 63,174, 81,235, 62,168, 94,183, 13,203,104,178,224,233,195,107,184,118,100,253, 26,163, 42,119,222,251, 28, 99,207,106, 53,
- 3, 8,155,143,223,174,159, 1,177, 90,127, 4, 0, 98,181,254, 24,126,251,236,212, 22,189, 39,194,209,181,122, 35,121, 82, 56,
-131,119, 24, 61,156,199, 97,169,207, 29,221,117, 60, 62, 62, 30, 47, 95,190,196,171, 87,175,144,155,155,139,253,251,227,171,116,
-124, 52,121, 9,151,162,159,179,122, 12, 30, 58,242,244,144,225, 99,132, 53, 3,130, 88,129,213, 28,224, 36,229, 32,234, 85, 2,
-162, 31, 69, 88,163, 30,156,213, 25, 21,178, 1,218,188,132, 50,141,159,216,185,174, 27, 96,153, 87, 52,119, 97,171, 86,109, 2,
- 63, 95,241, 77, 75, 39, 23,215, 82,175,227, 57, 89, 50,254, 23, 51, 78, 5,222,189,247, 91,165,230, 58,180, 90, 44, 57,147,199,
- 13,179,178, 11, 38, 10, 69,113,156,186,112,239, 21, 60, 76, 21,188, 79,172,230, 10, 35,248, 31, 14,108, 7,179,213, 10,181,214,
- 8,133, 90,143,124,165, 14,233,178, 28, 60,137,136,192,141,211,167,240, 58,234, 73,156,201, 96,184,200, 98, 49, 71,180,153,209,
- 55,170,214,210,196,169,233,228,232,136,184, 92, 21,132,124, 14, 18,162, 31,233,213,138,252,125,239, 90,143,180, 57, 49,233, 50,
- 54,211,125,216,176,225,231, 59,247,232,103,215,172,117, 87,177,179,173, 61,120, 28,130,152,248, 52,132,221, 57,175,142,125,114,
- 83, 97, 50,168,122,254, 25,179,190,252,205,169,184,215,161, 81,175,238, 59,162,127,135, 99,108, 54,135,111,181,154,245, 70,131,
-126,240,251,152,172,191, 10, 66, 44, 41,227, 70, 12,124,227,217,192,108, 37,162, 17, 31, 92,208,150,124, 86, 48, 89,136,120,196,
- 7,119, 52, 5, 23,144,178, 19,251, 60, 60, 28,251, 20,205, 93,152,152,152,243, 48, 55, 87,127, 13, 64,138, 78,167,123,231, 50,
-102,102,102,126,189, 98,197,138, 16,141, 70, 83,167, 99,199,142, 2, 91, 91, 91,228,228,228,224,226,197,139,166,208,208,208,231,
- 50,153,108, 17, 32, 51,107, 17,252, 75,132,238,248,216,168, 71, 23, 23,213,105,218,163, 90, 80,235,222,149,191,152, 9, 68,147,
- 58,247,155,192, 92, 62,241, 19,121,112,253,196, 71,218,172,152,109,239,177, 91,141, 58,157,238,190, 78,167,123,182, 96,193,130,
-102,110,110,110,110,139, 22, 45, 18, 42, 20, 10,238,150, 45, 91,116,217,217,217, 25, 10,133,226, 46,202,201,167,249, 35,225,166,
-252, 84, 12, 58,119,244,167, 78,228,232, 79,221,236,157,189,186,219,185, 84,171, 37,207, 74,141,203,207, 74,187, 8,224,114,225,
- 64,145, 85,162,113,227,198,126, 12,195, 12, 3,208, 64, 34,145,248, 75,165, 82, 1, 33,164, 14,195, 48,145, 86,171, 53,162, 94,
-189,122,161,207,159, 63,175,210, 96,178,137, 55,118,235,189, 3,219,252,154,171,177,242, 12, 44,222,175,137, 55,118,235, 1, 64,
-118,233,115, 13,128,147,207, 59,206, 29,116,234,110,194,166,200, 60,187,153, 89,215,191, 57, 85,213, 50,231,167, 60,241,255,179,
-234,191, 46,253,121, 10,128,113, 17,143,176,246,105,248,221,197, 12, 1,215, 2,243,114,173,236,213,163, 63, 67,159,203,229,234,
-188,188,188, 74,237, 93, 40, 16, 8,116,122,125,121, 1,148, 27,102, 85, 58,118, 0, 29,118, 31, 59,180,123,220,137, 83, 39,191,
-105,223,101,128,147,176, 90, 53,212,112,101,176,123, 94,147,153, 87,194,179, 30,244,251,252,230, 15,177,105,186, 8, 84, 49, 31,
- 70,165, 82, 69, 3,200, 83,169, 84,253, 9, 33,201, 12,195,120,231,229,229, 61, 54,153, 76, 79,171,108, 8,172, 24,217,170, 85,
-243,253, 12,195,112,136,217,186,250, 46,151,253,171, 46,253, 69, 10,222,115, 90,146,160, 26,182,152,181,104, 99,147, 90,254,181,
-155, 20,205,117, 88,191,186, 13,166,204, 93,219,164,122,205,128, 38,191,207,127, 88, 97,154, 0, 49,105,242,198, 31,251,121,245,
-205,240,123,215,190,116,246,168, 94, 61, 35, 37,246, 69,242,171,199, 95, 91,116,138, 99,239,123,156,227, 95, 69,174,223,241,221,
-220, 57,233,169,113, 59, 52, 89, 49,207, 0, 64,147, 21,243,236, 69, 24,190,202,206, 72,153,147, 35,139,253,238, 93,247,133, 90,
-173, 78,219,183,111,159,125,155, 54,109, 88,110,110,110,200,202,202,194,181,107,215,172, 86,171, 53,181,202, 90,185,113,215,212,
-185,140,227, 47,219,190, 95,205,147,216,244, 54,155,205,158,132, 0, 28, 14, 39,221,160, 81,156, 87,178, 36,159, 35, 47, 65, 87,
-254, 61,195,202, 0, 96, 21,205, 93,104,181, 90,153,213,155,118, 39,112,133, 54,165, 14,134,104,210, 41,197, 86,171,181,210,115,
- 29,202,147,194,106,253, 89,231, 55, 67,200,210, 70, 77, 91,126,105, 50, 25,117,133,231,135, 14,128,142, 16,228,176, 88,204, 13,
-182,213,116, 65,241, 30, 15, 83, 12, 3, 91,194,112, 96, 35,226,128, 1, 3, 85,126, 46,169, 74, 78, 86,169,134, 88, 22, 29,169,
-145,117,240, 61,103, 56, 52,246,234,165,179, 31, 88, 44,150, 26,133, 49,131,120,189, 86,125, 88,149,238,240, 11,240,200,140,127,
- 63,103,138,204, 22,243, 23,255, 80,165,154, 81,254, 78,154,129, 53, 69,253,171,121,185,141,141, 79,144, 61,136, 77,214,252,130,
- 55,167,213,121,159,114,178,221,220,220,190, 98, 24,102, 52,159,207,151, 26, 12, 6, 53, 33,100, 79,102,102,230,215,248,195,228,
-191,193, 92,145,171,118, 44, 95, 40, 94,104,212,169,127,211,200,162, 71, 86,180,237, 98,151,218,221,133, 18,201, 92,157, 86,189,
- 71,147, 25,189,251, 79,222,159,118, 2,129, 32, 88, 42,149,114,179,179,179,239, 3,200,255, 59, 29,247, 70,141, 26,249,176, 88,
-172, 26, 86,171,213, 13,128, 29, 10,122,133,100,115, 56,156,212,194,136, 22,169,170,102,219, 15, 15, 59,119,233, 86,127,214,197,
-155, 81, 27, 10,155, 21,139,241, 26,178, 78, 56,186,119,167,207,126, 57,118,178,180, 94,135,255,184, 58,255,255,167,217,129, 35,
-245,200, 30,199,226,219, 45,239, 18,168,211,100,167,165, 78,187,245, 52,235, 62, 0,229,251,148,147,199,227,141, 50, 26,141, 34,
- 30,143,167, 53, 26,141,251,254, 46,219, 46,114, 13,156,192, 2,169,244,204, 20, 86, 48,143,222,234,180,242,111,169, 75,236,160,
-160,160,118, 60, 30,207,199, 98,177,136, 13, 6,131, 70,171,213,198, 39, 36, 36,252,134,178, 39, 62,255, 75,203, 41,113, 13, 88,
-207,227, 9, 62, 1, 0,163, 81,191, 81, 45,139,153, 85,222, 23,203, 89,255, 31,125,140,156,107, 52,141,225,176,185, 46, 40, 28,
-152,219,106, 54,103,101,198, 61, 12,248, 31,150,243, 95, 7, 33,228, 47,255,141,174, 84,147,106, 82, 77,170, 89, 10, 44,186, 63,
-169,230,255, 82, 83,232, 81,215, 91,232, 81,183,210,131, 46,151,177, 62,221,159,148, 34, 38,151,242, 2, 33, 4, 28,186,111, 40,
- 20,202,255, 0, 43,221, 5,148,255, 37,186,244, 23,201,127,229,250,148,255, 28,101,230, 68, 51,229,184,210,170,132, 4,223,197,
-217, 94,166,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 34,237,127, 98,147,228,228,183,150,207, 0, 72,167, 77,135,
- 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,187,104,254,155, 40,110, 58,100,209,125, 65,161, 80, 40, 20, 10,133,242,215, 64,
-115,180, 40, 20, 10,133, 66,161, 80,222,143,210,154, 14,169,209,162, 80, 40, 20, 10,133, 66,249, 19, 40, 51, 25,158, 54, 29, 82,
- 40, 20, 10,133, 66,161,188, 31, 69, 17, 45, 15,148, 24,222,129, 26, 45, 10,133, 66,161, 80, 40,148, 63,143,116,148, 22,221, 10,
- 13, 13, 37,165,253, 79,161, 80, 40, 20, 10,133,242,255,193, 63,220,139,148,140,100, 77, 46, 92,126,179,215, 33, 53, 88, 20, 10,
-133, 66,161, 80,254, 46,102,235, 31, 70, 81, 36,171,232, 85, 60,105,118,177,209, 10, 9, 9, 97,168,217,162, 80, 40, 20, 10,133,
-242,191,226,223,232, 69, 88,111,111, 32, 61,204, 20, 10,133, 66,161, 80,254,151,102,235,223,180, 61,116,120, 7, 10,133, 66,161,
- 80, 40,148,247,195, 3, 64,159, 18,203,103, 80,162,249,144, 66,161, 80, 40, 20, 10,133,242,238, 76, 46,109,153, 16, 66, 35, 90,
- 20, 10,133, 66,161, 80, 40,127,129,217,162, 80, 40, 20, 10,133, 66,161,252, 85,252,127, 76, 42, 77,103, 54,167,154, 84,147,106,
- 82, 77,170, 73, 53,169,230,191,157,162,113,180,128, 18,227,104, 1,116,100,120, 10,133, 66,161, 80, 40,148,247,165, 15, 10,198,
-207,154, 92,248,183, 15, 53, 90, 20, 10,133, 66,161, 80, 40,127, 46,127,152,126,135, 26, 45, 10,133, 66,161, 80, 40,148, 63,215,
- 96,109,167, 70,139, 66,161, 80, 40, 20, 10,229, 47,134, 26, 45, 10,133, 66,161, 80, 40,148,191, 8, 6,101,247, 28,184, 92, 5,
-157,119,233,125,112,153,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180, 47,227,159, 71,209,200,240,103,240,123,
- 34,252,118, 66,254,250,105, 27,105,215, 87,170, 73, 53,169, 38,213,164,154, 84,147,106,254,219,153,252,214, 95, 0,255, 63,227,
-104, 81, 40, 20, 10,133, 66,161,252,215,204, 86,177,225,162, 83,240, 80, 40, 20, 10,133, 66,161,188, 31,219,203,250,128, 70,180,
- 40, 20, 10,133, 66,161, 80,222,143,201,101, 45, 83,163, 69,161, 80, 40, 20, 10,133,242,215, 24, 46,106,180, 40, 20, 10,133, 66,
-161, 80,254, 68,147, 53,185,212, 79, 67, 67, 67, 9,221, 71, 20, 10,133, 66,161, 80,254, 87,252,219,188, 72,241,240, 14, 69, 27,
- 70,205, 22,133, 66,161, 80, 40,148,255,165,201,250,135,122, 17, 15,252,222,219,112,114,225, 50, 8, 33,180,215, 33,133, 66,161,
- 80, 40, 20,202,123,210, 7,111,246, 60,156, 92,180, 76,141, 22,133, 66,161, 80, 40, 20,202,251, 51,185,220, 79,105,179, 33,133,
- 66,161, 80, 40,148,255, 37,255,198, 28, 45,134, 30, 86, 10,133, 66,161, 80, 40,148,247,162,180,104,214,255,203, 92,135, 20, 10,
-133, 66,161, 80, 40,255, 73,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 95, 96,178,138,140,214, 95, 61, 96, 41,157,217,156,106,
- 82, 77,170, 73, 53,169, 38,213,164,154,255, 21,147, 85,114,136, 7, 0,180,215, 33,133, 66,161, 80, 40, 20,202,251, 66, 39,149,
-166, 80, 40, 20, 10,133, 66,249,139,160,147, 74, 83, 40, 20, 10,133, 66,161,252, 63, 27, 46,106,180, 40, 20, 10,133, 66,161, 80,
-254, 68,147,245,134,217,162, 57, 90, 20, 10,133, 66,161, 80, 40,239, 71,153, 57, 90, 12,202,238, 57,112,185, 10, 63,240, 46,189,
- 15, 46, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246,101,252,243,153,140,255,167, 1, 75,105,215, 87,170,
- 73, 53,169, 38,213,164,154, 84,147,106,254,215,152, 12, 20,140,163, 69,155, 14, 41, 20, 10,133, 66,161, 80,254, 4, 99, 85, 26,
-212,104, 81, 40, 20, 10,133, 66,161,188, 31,116, 28, 45, 10,133, 66,161, 80, 40,148,191, 8, 15, 20, 68,181,138,254, 6, 83,163,
- 69,161, 80, 40, 20, 10,133,242,231,208, 7, 5, 81,173,162,191,212,104, 81, 40, 20, 10,133, 66,161,252,137,148, 58,142, 22, 3,
- 0,161,161,161, 69,253, 15, 59,134,132,132,220,160,251,138, 66,161, 80, 40, 20,202,255, 39,255, 70, 47, 66, 8,249, 61,162, 21,
- 18, 18,194, 0,184, 78, 15, 53,133, 66,161, 80, 40,148,255, 5,255, 70, 47,194,122,203, 73,118,164,135,153, 66,161, 80, 40, 20,
-202,255,130,127,163, 23,225,188,229, 34, 41, 20, 10,133, 66,161, 80,254, 39,252,131,189,136, 7, 10, 18,225,207, 20,254, 5, 10,
-135,124,160,227,104, 81, 40, 20, 10,133, 66,161,188, 31, 69,189, 13, 39,227,173, 49,181,104, 20,139, 66,161, 80, 40, 20, 10,229,
-253, 40,109,100,248,255,151,185, 14, 41, 20, 10,133, 66,161, 80,254,147,208,185, 14, 41, 20, 10,133, 66,161, 80,254, 28, 74, 70,
-181,182,255,127,253, 40,157,217,156,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 37,147, 85,188,252,198, 56, 90, 20, 10,133,
- 66,161, 80, 40,148, 63, 23,218,116, 72,161, 80, 40, 20, 10,133,242,126, 20,245, 56, 44,185, 76,141, 22,133, 66,161, 80, 40, 20,
-202,159,104,182,254, 0,109, 58,164, 80, 40, 20, 10,133, 66,121, 63, 38,151,245, 1, 53, 90, 20, 10,133, 66,161, 80, 40,127,145,
-225, 98, 80,118,207,129,203, 85, 16,126,151,222, 7,151,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,172, 72,251, 50,
-254,121,252,207, 6, 44,165, 93, 95,169, 38,213,164,154, 84,147,106, 82, 77,170,249,159,132, 14,239, 64,161, 80, 40, 20, 10,133,
-242, 23, 82, 21,163,229,194,225,112,190, 20,137, 68, 63,136, 68,162,109, 28, 14,231, 59, 0, 14, 85,253, 65,137, 68, 50,211,221,
-221,253,165,187,187,123,138,143,143,207, 89, 27, 27,241,167,126, 2,180, 7,192,253,147,182, 39, 16,192,167, 34,145,232,133, 80,
- 40, 76, 0,176, 23,192,167, 0,156,223, 71,248,107, 79, 12,126,246, 73,255, 19, 95,123, 98,240, 91, 31,245,113,115,115,187, 5,
-160,251,159,117, 80,134,139,209,117,136, 4, 73, 67, 36, 72, 26, 46,126,247,167, 6, 27, 27,155,209, 30, 30, 30,119,157,156,156,
- 82, 61, 60, 60,238, 8,133,194, 33, 85,148,112,117,115,115, 91,227,237,237, 29,237,233,233,185, 1, 5,179,147,255,109,105, 39,
- 64,187,150, 2,100,181,226, 67,217,134,143, 31, 90,241,209,173, 27, 32,126, 71,185,182, 0,142,216,218,218, 62,230,112, 56,161,
- 0, 6, 21,214,175, 65, 28, 14, 39,212,214,214,246, 49,128, 35,133,235,189, 75, 61, 93, 3, 32, 21,192,202,194,229,143,189,189,
-189,149, 13, 27, 54, 76,104,216,176,225, 46,127,127,255, 49,149, 21, 19,139,197,221,188,189,189,143,250,248,248, 36,180,106,213,
- 42,215,203,203, 43,170, 90,181,106,187, 5, 2, 65, 71,122,137,163, 80, 40,148,191, 63,125, 1,124, 3, 96,115, 68, 68, 68, 24,
- 33, 36,140, 16, 18, 22, 17, 17, 17, 6,224, 7, 0,171, 80,118, 8,241,141,247,157,156,156,150, 46, 95,190, 92,151,158,158, 78,
-178,178,178, 72,116,116, 52, 89,191,112,174,181,135, 35,135,248,185, 56,104, 60, 60, 60, 94,251, 86,171,118,160,190,148, 53, 23,
- 64,173,202,104,150,192, 65, 36, 18,221, 95,184,112,161,234,214,173, 91, 42,131,193,160,178, 90,173,170,180,180, 52,213,229,203,
-151, 85,109,218,180, 81, 1,152, 5,128, 93, 5,205, 98,150,121,226, 6,249,249, 43,178,204, 19, 55, 74,190, 95,167, 78,157,231,
- 86,171,149, 12, 30, 60, 88, 15,192,171, 42,154,111,227, 5, 8,235,219,194,126,136, 20,153,230,221, 95, 19,178,101, 14, 25, 34,
- 65,210,187,104,186,186,186,158,156, 57,115,166, 34, 53, 53,149,232,245,122,146,148,148, 68,166, 76,153,146,239,234,234,186,175,
-146,219,238, 20, 20, 20,148,121,247,238, 93,171, 92, 46, 39,215,175, 95,183, 54,104,208, 32,179,146,102,171,235, 91,101,217,238,
-233,233,121,182, 42, 47, 87, 87,215, 29, 85, 61, 70, 45, 4, 72, 50,134, 93, 35,228,225, 69,114,106,112, 43,178,190,105, 53, 50,
-200,145, 47,111,203,199,199, 29, 74, 31,202,164, 44,205, 15, 58,116,232,160,126,250,244,169, 37, 39, 39,135, 60,127,254,220, 58,
-105,210, 36, 29,128,200, 73,147, 38,233,158, 63,127,110,205,201,201, 33, 79,159, 62,181,116,232,208, 65, 13, 96, 98, 21,202,201,
- 2,176,115,201,146, 37,132, 16, 66,150, 47, 95, 78, 26, 54,108, 72, 58,119,238, 76, 84, 42, 21, 33,132, 36, 16, 66,118,153,205,
-230,113,149,209,180,179,179, 27, 61,115,230, 76,149, 70,163, 33, 69, 88,173, 86, 34,151,203,201,230,205,155,213,238,238,238,103,
-203,120,200,160, 77, 30, 84,147,106, 82,205,191,155,230, 63, 25, 15, 20,228,105, 21,189, 60,128,130,166,195,138, 24, 49,119,238,
-220, 34, 83,117,174,109,219,182, 15,198,141, 27, 23, 54,110,220,184,176,182,109,219, 94, 7,112,225,209,163, 71, 97, 95,124,241,
- 69, 24,128, 17, 21, 28, 8,135,214,173, 91,203, 51, 50, 50, 72, 64, 64, 0,169, 94,189, 58,201,200,200, 32,132, 16,242,240,131,
- 38,228, 74, 93,144,228,155,231,200,197,227, 71,200, 36, 15, 14,105,231, 97,103,242,112,119,207,113,118,118, 94,129,130,164,253,
-242, 14,238,192,186,117,235, 42, 35, 35, 35, 85, 49, 49, 49,170,165, 75,151,170, 58,119,238,172, 10, 10, 10, 82, 13, 26, 52, 72,
-181,105,211, 38,149,209,104, 84,237,216,177, 67,101,107,107, 27, 89,138,217,122,103,163,197,225,112, 54, 70, 68, 68,144,215,175,
- 95,147,194, 40, 69, 89,154,118,246,246,246, 61, 29, 28, 28,102,217,219,219,247, 4, 96, 7, 0, 1,128,180,145, 29,124, 62,110,
-228, 87, 39,116, 68,215, 90,155,187, 54,107, 50,196,134, 37, 55,125, 63,135,144,193, 62,239,100,180,236,236,236, 70,127,250,233,
-167, 74,189, 94, 79, 52, 26, 13, 81,169, 84, 68,163,209, 16,165, 82, 73, 70,140, 24,161, 16, 10,133, 3, 43,210,116,118,118,254,
-250,230,205,155,230,140,140, 12,114,243,230, 77,114,246,236, 89,178,101,203, 22,171,171,171,235,186,170,158,128,238,238,238,151,
- 46, 94,188, 24, 22, 30, 30, 30,118,255,254,253, 48,147,201, 20,102, 52, 26,195,140, 70, 99, 88,104,104,104,216,177, 99,199,194,
- 14, 30, 60, 24,102, 48, 24,194, 12, 6, 67,152, 94,175, 15,171, 89,179,230,249,170, 30,163,230, 2, 36, 27,110,157, 34,100,221,
-116,146,255,237, 52, 34,159,221,155,200,166,180, 39, 63, 52,171, 70,218,139,112,250,173,122, 84,166, 38,151,203,189,145,144,144,
- 96,157, 63,127,190,161, 94,189,122,249,227,199,143,215,233,245,122, 66, 8, 33,122,189,158,140, 31, 63, 94, 87,175, 94,189,252,
-249,243,231, 27,226,227,227,173, 28, 14,231,114, 21,202,185,170,200,100,221,184,113,131,148, 68,165, 82,145,206,157, 59, 39, 52,
-108,216,112, 87,141, 26, 53, 70, 86,164, 41,149, 74,251,207,155, 55, 79, 69, 74,193,100, 50, 17,165, 82, 73,226,227,227,173,213,
-171, 87, 79, 3,224, 68, 47,230, 84,147,106, 82, 77,106,180,254, 50,202,156,130,167,220,157,248,197, 23, 95,132, 17, 66,194, 22,
- 44, 88, 16, 86, 24,217,226, 1,144, 22,190, 56, 0,134,207,155, 55, 47,140, 16, 18, 54,119,238,220,162,117,202, 58, 16,125, 15,
- 31, 62,108,220,176, 97, 3,113,115,115, 35,238,238,238,100,227,198,141,196,106,181,146,140,208,125,228, 74, 93,144, 23, 95,142,
- 37,132, 16, 18,189, 98, 6,185, 82, 23, 36,246,199,101,100,212,168, 81, 26,177, 88, 60,162,156,131,235,216,164, 73, 19,165, 86,
-171, 85,237,222,189, 91, 37, 22,139, 31, 2,168,135,130,166, 72,166,176,172, 99,234,213,171,167,120,246,236,153,234,215, 95,127,
- 85, 1, 88, 90,201, 10, 83, 11, 64, 39,137, 68, 50,104,158, 23, 55,134,252,252, 21,153,231,134,167, 0, 26, 0,112, 41, 92,199,
-115,238,220,185,132, 16, 66,188,189,189,111,150,161,105, 23, 20, 20, 52, 55, 38, 38,102,177,201,100, 90, 28, 30, 30,190,184,118,
-237,218,243,251,213,244,104,117, 98, 68,183,224,252,101,211,130,201,218,217, 65,223,245,106,222,245,192,176,142, 35, 62,172,225,
-124,107,188,171, 80, 51,212,142,173,124,171,233,176, 82, 21,219,203,203,235,126, 82, 82, 82,177,185, 82, 42,149, 36, 53, 53,149,
-196,197,197,145, 91,183,110, 17, 15, 15,143, 43, 21,105,186,187,187, 63, 79, 74, 74, 34, 63,174, 95, 79, 6, 55,168, 67,218,219,
-219,144, 14, 14, 54,164,169, 84,168,174, 11, 52,173,170,209,122,252,248,113, 24,128, 48, 0, 97, 57, 57, 57, 97, 57, 57, 57, 97,
-121,121,121,197,239, 1, 8,203,207,207, 15,203,207,207, 15, 51, 24, 12, 97,126,126,126, 85, 54, 90,109,132,104,211, 66,136,220,
- 86, 2,104,251,122, 57,167, 77,171,233,108,185, 55,162, 21,201,155,222,153,108, 8,246, 34,109,249,248,184,146,154,125,249,124,
-254,117, 0,115, 10, 77,249,216,158, 61,123,106, 8, 33,164,103,207,158, 26, 0, 99, 11,223,255,180,208,100,245,172,100, 57, 89,
-254,254,254,234,162, 72, 22,128,223,252,253,253,213, 13, 27, 54, 36, 13, 27, 54, 36,222,222,222,202, 66,237, 74, 93,208,106,213,
-170, 21,173,213,106,139, 13,160, 92, 46, 39,105,105,105, 36, 54, 54,150, 68, 70, 70,146,135, 15, 31,146,132,132, 4,114,232,208,
- 33,139,189,189,253, 25,122, 49,167,154, 84,147,106, 82,163,245,151, 26,173,183, 95,111, 26,173,208,208,208,183,109,215,183,143,
- 30, 61, 10,155, 55,111, 94, 24,202, 25,136, 11,192,228, 5, 11, 22, 20, 69,189,190, 41,231,230,191, 35, 58, 58,154,140, 29, 59,
-150, 4, 6, 6,146,192,192, 64, 50,110,220, 56,146,159,159, 79, 84,175,158,145, 43,117, 65, 30, 14,109, 74, 8, 33, 68,249, 34,
-156, 92,169, 11, 18, 54,170, 53,121,242,228, 9,169, 86,173,218,197,114,126,255,244,157, 59,119,178,246,237,219,151,129,130,124,
- 44, 46,128,150, 0, 54,138, 68,162,157, 40,104, 46,172, 14,192, 33, 32, 32, 32, 87,163,209,168, 6, 15, 30,172, 2,224, 83,142,
-102,135,192,192,192,215, 59,118,236, 32, 50,153,140,228,230,230,146,213,109,106, 19,242,243, 87,100,121,211,234,214, 31,127,252,
- 81, 63,103,206, 28,181,163,163, 99, 40, 0,207,193,131, 7,155, 9, 33,164,125,251,246,153,165,137,217,219,219,247,140,137,137,
- 89,172,211,233, 22,203,229,242,197,185,185,185,139, 79,157, 56,177,184, 71,131,218, 99,243,151, 77, 11, 62, 49,162, 91,112, 47,
- 47,135, 65,235,186, 55,155,154, 58,127,226,224, 5,173,235,189,208,173,250,228,218, 7, 53,221,214,188,203,209,118,113,113, 73,
-215,235,245, 4,192, 31, 94,175, 95,191, 38, 78, 78, 78, 73, 21,105, 56, 58, 58, 46,248,116,248, 48,203,192,234, 94,228,245,134,
-133,196,116,233, 87, 98, 58,187,155,188,250,118, 54,233,231,238,172,104,201, 99,205,171,108,121,220,221,221, 47,221,191,127,255,
- 13,163,149,151,151, 87,170,209, 82, 40, 20, 97, 6,131, 33,204,223,223,255,252,251,214,250,150,124,248,117, 16,177, 31,134,143,
-109, 71,178,166,117, 38, 61,237,184, 9,239, 33, 55, 28,192,117, 0,163,170,248, 61, 22,128, 85, 69,134,234,219,111,191, 37,132,
- 16,226,239,239,175,198,251,141, 99,103, 87,167, 78,157,184,137, 19, 39,154,235,214,173, 43,107,211,166,141,252,193,131, 7,228,
-198,141, 27,228,236,217,179,228,200,145, 35,228,217,179,103, 36, 53, 53,149, 68, 71, 71,147, 62,125,250,200, 1,116,160,215, 66,
- 10,133,242,119,166, 20, 47,242,143,166,184,215, 97,104,104, 40, 9, 9, 9, 97, 74,108,160, 29, 0, 97,211,166, 77,179, 86,173,
- 90,181, 22, 5,195,202, 51, 65,108,124,208, 89,196,121,210, 89,196,121, 18,196,198, 7,133, 17,163,237, 43, 86,172,248,186, 97,
-195,134,233, 0, 68, 0,220,203,248,177,118, 78, 78, 78, 72, 74, 74,130,157,157, 29,236,236,236,144,148,148, 4, 66, 8,204, 4,
- 48, 17, 64,111, 52, 66,171,213, 66,103, 37,208, 90, 1,133, 74, 5,119,119,119, 24,141, 70,191, 50,182,161,209,208,161, 67,253,
-130,130,130,178,190,248,226,139, 52, 20,228,202,236,156, 48, 97,194,165,223,126,251, 45, 72,165, 82,229, 70, 70, 70,234, 26, 52,
-104,208, 19,128,123, 76, 76,204,232,205,155, 55, 99,236,216,177, 40,231,166,211,160, 79,159, 62,103,159, 61,123,230, 55,106,212,
- 40, 92,191,126, 29,171, 87,175, 70,118,118, 54, 1, 0,189, 94, 79, 44, 22,139,177,117,235,214,198, 13, 27, 54, 52,111,223,190,
-253,253,154, 53,107,178, 1, 32, 46, 46,238, 85,105,130, 12,195,212,246,245,245,133, 94,175, 71, 86, 86, 22,158, 61,123, 6, 27,
- 59, 59, 68,164,101,187,117, 92,247, 99,206,151, 39, 46,113,135, 55, 15,114,156,213,173,141,126,229,197,235, 1,245, 60,221,220,
- 12, 70,147,123,116,122,102,218,187, 28, 88, 30,143,151,148,157,157, 13,131,193, 0,173, 86, 11,133, 66,129,156,156, 28,100,103,
-103, 35, 45, 45, 13, 60, 30,239,117, 69, 26,182,185,185, 55,227,238,220, 96, 14,109,253, 22,126,230, 92,112,142,110, 4,231,228,
- 15,168,101,200,194,182,133, 83,108, 12, 78, 46, 75,108,109,108,242,236,237,237,183, 3,240,175, 72, 47, 56, 56, 24, 57, 57, 57,
-200,201,201,129,147,147, 19, 28, 28, 28,224,224,224, 0,185, 92,142,252,252,124, 40, 20, 10, 4, 4, 4,160, 81,163, 70,216,179,
-103,207,159, 82,193,239, 25, 16,107,134,101,218,165,168, 52,240, 36, 18,212,116,144,250, 54,147,194,177,156,175,116,230,114,185,
-135, 29, 29, 29, 47, 2,152, 14, 64, 2, 96,186,163,163,227, 69, 46,151, 59, 0,192,114, 0,251,170, 88,140,149, 75,150, 44,153,
- 27, 19, 19, 35,126,242,228, 9,190,248,226, 11, 44, 93,186, 20,175, 94,189,250, 30,128,181,112,157,143,156,156,156, 66, 89, 44,
-214, 79, 0,122, 3,232,233,225,225,209,165, 2,221, 1,115,230,204,209, 53,105,210, 36,250,197,139, 23, 3,238,220,185,211,116,
-246,236,217,249,137,137,137,136,142,142,134,135,135, 7,188,189,189,161, 82,169,144,151,151,135, 1, 3, 6,216,217,218,218,142,
-160,151,113, 10,133,242,119, 54, 89,111,121,145,127, 90, 68,171,212,229, 82,159,168,197, 98,241,146,176,176,176, 86, 13, 27, 54,
-228, 0, 56, 4, 0, 65,108, 12, 25,208,186,241,206, 19,219,191,109,120,108,195,194,134, 61, 26, 6,236, 12, 98,163,168, 23, 91,
-104,211,166, 77, 29,194,194,194, 90, 11, 4,130,143,203, 50,118, 0,224,224,224, 0, 59, 59, 59,216,219,219,195,193,193, 1, 86,
-171, 21, 42,141, 14,106, 11,160,212, 25,144,159,159, 15,101,225,178, 74,111,132, 90,173, 46,254,110, 41,116,156, 56,113, 98,214,
-230,205,155,101,233,233,233,223, 2,104, 48,118,236,216,254,155, 54,109,194,213,171, 87,117,189, 3,107, 57,173,104,215,248,235,
-122,233,175, 22, 7,114, 49, 9,192,205,155, 55,111,162,117,235,214, 96, 24,102, 88,105,130, 34,145,232,135, 3, 7, 14,136, 34,
- 35, 35, 81,171, 86,173,200, 97,195,134,125,240,237,183,223,250, 73, 84,185,183, 1,192,156,147, 17, 57, 99,198,140,175, 86,172,
- 88,145,149,149,149,101,212,104, 52,174,253,250,245, 67, 82, 82, 18, 82, 83, 83,127, 43,195,100, 70,135,135,135,147,252,252,124,
-196,198,198, 34, 60, 60, 92,244,213, 87, 95, 53,183,176, 88,253, 83, 96,243,225,216, 54, 77,155,143,106,217, 24,251,238, 62,225,
-221,138,138,179,111, 90,221,203,225,113,114,122, 13, 19,131,215,239,114,180,149, 74,229,198,175,191,254, 90,165, 82,169,144,146,
-146,130,167, 79,159,226,197,139, 23, 72, 72, 72,192,234,213,171, 85,185,185,185,155, 42,210,240, 20,114, 62, 91, 51,123, 2,195,
-121,254, 27,240,228, 6,160, 81, 2, 90, 21,244, 47,195,176,235,101, 6,182, 28, 61,206, 79, 76, 74,178, 63,120,240,224, 68, 31,
- 31,159, 48, 0, 1, 21,185,122, 0, 96,177, 88,111,155, 80,176, 88, 44, 37,128, 12,137, 68,146,108, 99, 99,147,204, 98,177, 50,
- 8, 33,234, 63,163,230,179,204, 48,130,205, 6,248, 34,176,184,229, 78,237,249,193,176, 97,195, 14, 36, 39, 39,247,136,141,141,
-109,181,105,211,166,175,133, 66, 97,196,166, 77,155,190,142,141,141,109,149,156,156,220, 99,216,176, 97, 7, 0,140,169,202,239,
-251,251,251,207, 88,188,120, 49, 86,175, 94,141, 70,141, 26, 33, 32, 32, 64,179,100,201,146,141, 0, 22, 2,248,216,223,223,255,
-246,140, 25, 51,198,203,100, 50,247,148,148,148, 70,223,127,255,253,148,141, 27, 55, 54, 75, 75, 75, 19, 86, 32,221,182,123,247,
-238, 56,119,238, 28, 0,164, 3,136,205,201,201, 49,167,165,165,161, 78,157, 58,104,222,188, 57, 84, 42, 21, 84, 42, 21,228,114,
- 57,124,125,125, 97,181, 90, 91,209, 75, 57,133, 66,161,252,191, 26,174,210,141,150, 80, 40,116, 8, 14, 14, 70,205,154, 53, 29,
- 80,216, 91,203,137,207,153, 63,107,226,112,177, 52,236, 60,152,240, 43, 24,214,174,190,216,137,207,153, 95,248, 21,142,175,175,
-175, 32, 56, 56, 24, 18,137,196,171,140, 31,191,158,145,145,129,224,224, 96,216,219,219,195,206,206, 14,193,193,193, 48, 26,141,
-200, 87, 42,161,182, 0, 26,147, 21,249,249,249,200,205,202,132,198, 2,152,109,156,144,144,144, 0, 54,155, 29, 87,134,166, 71,
-173, 90,181,178, 34, 34, 34,178, 0,220, 4, 48,117,233,210,165,152, 55,111, 30, 22, 45, 90,116, 64,156, 30,223,253,192,185,147,
- 78,251,151,124,228, 18,192,103,134, 3, 48, 38, 39, 39,195,222,222, 30, 18,137,164, 84, 99,208,190,125,251, 38, 18,137, 4,187,
-119,239, 38, 41, 41, 41,109, 80,208,133, 63,142, 97, 10,204,158,136,133,124, 0, 27,195,194,194, 90,124,245,213, 87, 81, 93,187,
-118,229,182,108,217, 18,203,151, 47, 7,128,208,210, 52,229,114,249,189, 49, 99,198, 24,174, 93,187,134,151, 47, 95, 74, 78,156,
- 56, 49,100,249,242,229,245, 19, 19, 19, 5,167,207,158,239,181, 55, 89, 49,228,219,139,183,132, 43, 46, 92,191,231,108, 43,169,
- 87,195,217, 17,225,137,169, 60, 11, 27, 15, 42, 58,162, 45,184,236,137, 29,133,156,240,118, 2, 86,122, 71, 33, 39,172, 25,151,
- 61, 65,169, 84, 30, 60,117,234,212,133,217,179,103,171,100, 50, 25,108,108,108,144,147,147,131,149, 43, 87,170,194,195,195,143,
- 26, 12,134,211, 21,233, 90,172,164,137,119,117, 31,224,117, 68,241,123, 70, 43,193, 3, 3, 15, 33, 83, 63, 65, 96,157, 58, 48,
- 24, 12,104,208,160, 1,179,116,233, 82,137,157,157,221,231, 21,154, 30,214, 31,170,155,153, 97,152, 12, 66, 72,170, 74,165, 74,
- 17,137, 68,137, 60, 30, 47, 49, 55, 55, 55,133, 16,146,249,103,248, 44,194,194,103,173, 27,248, 3, 2, 17, 18,115, 84,105, 15,
- 85,200, 45,109, 69, 27, 27,155, 9, 91,182,108, 17,254,252,243,207,166, 25, 51,102,232,167, 76,153,194,213,106,181,174, 83,166,
- 76,225,206,152, 49, 67,255,243,207, 63,155,182,108,217, 34,148, 74,165,131,222,165, 32, 38,147, 9, 17, 17, 17,223,190,122,245,
- 74,130,130,225, 70, 62, 89,178,100,201,216,152,152, 24,225,230,205,155,113,228,200, 17, 28, 57,114, 4,253,251,247,199,204,153,
- 51,177,120,241,226,242,228,196, 13, 27, 54, 12,118,114,114,194,141, 27, 55,210, 0, 36, 2,104, 34,149, 74,109,250,247,239,143,
- 30, 61,122, 64,167,211,193,104, 52, 22, 27, 45, 54,155, 13,123,123,123, 39,122, 13,164, 80, 40,148,191,220,100,189, 97,182, 56,
- 0, 80, 20,170, 11, 9, 9, 97,202,187, 49, 90,242,100,144,171, 53, 72,200,215, 32, 41,207,250,198,103, 86,171,181,220, 95, 79,
- 75, 75, 59,125,247,238,221, 9,193,193,193,156,180,180,130, 22,177,224,224, 96,104, 52, 26,164, 61,185, 15,181, 21,144,212, 10,
-130, 90,173, 70,222,139,199,144, 54,108, 5,167, 62,163,176,110,243,102,125, 78, 78,206,214,210, 52,249,124, 62,183, 90,181,106,
- 89,113,113,113,102, 0,185,118,118,118,221,125,124,124,112,253,250,117, 0,216, 71,128, 53, 8,191, 6,220, 56, 6, 82, 16, 82,
-145,250,250,250, 66, 38,147, 65,165, 82, 93, 47, 77,243,238,221,187, 49, 38,147,169, 65,191,126,253,152, 95,126,249,229,144, 66,
-161, 88, 4,224,169,222, 10,246,147,228, 76,168, 45, 16, 2,232,230,224,224,240,233,226,197,139,187,204,152, 49, 3,167, 78,157,
-194,197,139, 23,141, 40,200, 5,187, 91,138,108,126,108,108,236,182, 57,115,230,180,100,177, 88, 83, 47, 93,186,100, 14, 8, 8,
- 80, 24,141, 70, 75,237,192, 64,214,162,165,203,120,211,167, 78,182,207,209,224,121,143,218, 30,173, 25, 6,120,158, 42, 75,124,
-165, 66, 78,121,251,180, 61,159, 29, 58,160, 77,195,246, 19,134,245,149, 74,106,213,131,250,217,125,247,109,135,207,174, 19,133,
-199,132,220,144,201,250,159, 58,117,106,200,245,235,215,167, 27, 12,134,154, 2,129,224,181, 92, 46,223,160, 82,169, 42, 52, 89,
-108, 54,187,143,222,163,154,131, 60, 55, 23,194,194, 72,148,194,100, 69,182,222,140,151,246, 1, 24, 81,205,187,184, 25, 52, 35,
- 35, 3,238,238,238,140,197, 98,233, 91,158,230,197,139, 23, 17, 18, 18, 82,100, 60,193, 48, 12, 24,134,201, 14, 12, 12,204, 20,
- 8, 4, 57, 60, 30, 79,177,102,205, 26,157, 78,167, 3,135,195, 17, 90, 44, 22,246,251,212,246,230, 98,184, 10, 8,243,195,148,
-126,157,186, 54,170, 87,135,220,124,248,132,201,211,232,118,149, 19, 5,252,222,223,223,159,147,155,155,123, 26,192, 75,147,201,
-180,255,208,161, 67,194,209,163, 71,235, 14, 31, 62, 60, 18,128,223,218,181,107,135,168, 84,170,237, 85, 41,199,171, 87,175,190,
- 95,177, 98,197,220, 5, 11, 22, 96,207,158, 61, 51, 94,189,122, 53,175, 48,210,213,127,241,226,197, 88,179,102, 13,246,236,217,
- 99,125,249,242,229, 89,171,213,250,106,246,236,217, 13,221,220,220,178,211,211,211, 95,149, 35,219,180,103,207,158,250,219,183,
-111,243,149, 74,229, 45, 0,159, 78,155, 54,109, 98,139, 22, 45, 20,195,134, 13,147,230,230,230,202,197, 98, 49,127,199,142, 29,
- 14, 28, 14, 7,106,181, 26, 12,195, 64,169, 84, 26,232,117,144, 66,161,252, 93, 41,203,139,252, 67, 40,243,222,192, 41,109, 3,
- 53, 26, 77,102, 82, 82, 82,157,212,212, 84, 51, 0, 51, 0,228, 24,204,223,172,216,113,236,231, 65, 45,253, 37,233, 38, 19, 78,
- 60,140,212,228, 24,204, 69,201,239,230,212,212, 84,101, 98, 98,162,141, 86,171, 85,149,241, 91,191,253,240,195, 15,218,107,215,
-174,217,196,198,198,194, 98,177,160, 73,147, 38,136,142,142, 70,222,203, 8, 72,234, 52,129,164, 67, 8, 34,195, 30, 34,252,226,
-101,196,171, 12,230,168,133, 43,242, 85,106,245, 98,163,209,120,162, 52, 65, 46,151,155, 11,128, 16, 66, 44, 0,160, 80, 40,158,
-170, 84,170,118,110,110,110,120,254,252,185, 68,109,193,204, 33,243,215,109, 34,132, 88,120, 5,189,185,102, 13, 27, 54, 12,143,
- 30, 61, 2,128, 71,165,105, 42, 20,138, 25,147, 38, 77,186,182,123,247,110, 78,108,108,108,143,159,127,254,185, 71, 84, 84, 20,
- 97,114,147, 44,183, 53, 92,248,141,157,217,236, 71,223,192,139, 33, 33, 33,240,240,240,192,142, 29, 59,176, 97,195, 6,211, 71,
- 31,125, 20,179, 97,195,134,102, 50,153,108,127, 25,219,159, 47,151,203,207, 59, 57, 57, 77,175, 95,191,190, 82,173, 86, 35, 39,
- 39, 7,105,105,105,112,116,114, 98,153,193,106,237, 98,111,191,255,116,134, 82,194, 57,127, 15,247, 83,210,203,141,102,181,228,
-178,199, 12,106,223,184,253,199, 11,230, 75,113,251, 4,152, 73,139, 65,126,254, 26,159,140, 27, 98,163,211,239,239,160,126,146,
- 48, 58, 76,161,216,171, 80, 40,142, 84,177,178,244,108,221,186,245,129, 21, 43, 86,136,190, 92,189, 2,107,235,120,193,156,147,
-131, 44,189, 5,217,122, 51, 20,121, 47,241,252,121, 36,156,156,156, 17, 31, 31, 15,157, 78,135, 23, 47, 94, 16, 54,155,125,186,
-162,136, 78, 17, 37,154, 11,229, 2,129, 32,135,203,229,102,114, 56,156,220,216,216, 88,181, 78,167, 3,139,197,146, 88, 44, 22,
- 81, 37,202, 90,205,217,217,121, 54, 10, 6, 19, 61,165,204,206,222, 24,204,133, 61, 56,232,232,235,236,212,107,225,148,209,206,
- 62,158,174,242,216,152,215,166,173, 23,238,100,235,244,101,119,214, 0, 16,154,155,155, 91, 28,145, 60,124,248,240, 39,135, 15,
- 31,158, 8, 96, 39, 10,230,221,186, 44,151,203,127,124,135,147,111,225,209,163, 71,231, 46, 88,176, 0, 34,145,168,120,240, 84,
-145, 72, 36, 4,128, 95,127,253, 21,207,159, 63,111,129,194,124, 45,171,213,122, 32, 61, 61,189, 34, 77,191,160,160,160,216, 99,
-199,142,241, 1,120, 78,155, 54,173,213,166, 77,155, 48,110,220,184,172,200,200,200,150, 0,226, 0,248, 77,157, 58,245,193,158,
- 61,123, 28,172, 86, 43,242,242,242, 96, 48, 24,226,232,165,156, 66,161, 80,179,245,151, 16, 12, 32, 28, 5,227,103,245, 1,112,
- 6, 5,105, 29,101,226, 93,232,206, 46, 0,232, 87,116,127, 44, 35, 25, 30, 40,232,145,117, 30,192, 79, 0,220,202, 18,117,114,
-114,250,124,236,216,177,166,148,148, 20,146,145,145, 65,142, 28, 57, 66,102, 77, 24,107,233, 86,203,211, 90,203,211, 77,237,226,
-226, 18,237,225,236,184,171,177, 24,179, 0, 84,171,196,134,141,141,138,138,154, 60,118,236,216, 9,133,191, 59,225,192,129, 3,
-170, 75,151, 46,169,216,108,118, 40, 10,134,118, 40, 50,148, 99,250,246,237,171,210,235,245,170,192,192,192, 92, 20, 36,238,151,
-197,144,142, 29, 59,230,157, 59,119,142, 88, 44,150, 63,140, 81,148,149,149, 69, 46, 94,188, 72,218,180,105, 35, 7, 48,186, 75,
-151, 46,215,239,220,185,115,189,109,219,182, 71, 43, 42,176,179,179,243,252, 39, 79,158, 60, 74, 72, 72, 8, 59,115,230, 76,216,
-254,253,251,195,166, 78,157,250,180, 97,195,134,218,152,152, 24,171,217,108, 38, 79, 30, 63, 38,129,181,107,171, 1,248,150,165,
-211, 89,196,121,160,216,241, 53,209, 45, 31, 71,116, 3,188, 9, 0,162, 92,247, 57,201,156,209,149, 68, 79,239, 69, 58, 9,217,
-119,223,165,166, 56, 58, 58, 94,120,244,232, 17, 81, 42,149,228,217,179,103,100, 76, 72, 15,114,119, 98, 87,114,190,135, 63,217,
-211,161, 6, 89,215,189, 33,233,209,161, 29,249,225,135, 31,200,177, 99,199,200,252,249,243,173,206,206,206, 74,148,147,163,229,
-238,238,126,233,208,161, 67, 97, 0,194,216,108,118,152, 66,161, 8, 83, 42,149,167,147,147,147,183, 4, 6, 6,206,173, 95,191,
-254,200, 58,117,234,116,238, 84,195,119,110, 23, 27, 65,116, 87, 91,225,235,218, 82,241, 58,252,113,220,171, 98,236, 0,223, 90,
-126,126,202, 27, 55,110, 88,245,122, 61,185,117,235,150,181,110,237, 0,221,218,161, 61,143,198,239, 88,117, 84,119,238,151, 11,
-154,147,219,239, 28,254, 48, 36,162,163,152,245, 75, 43, 73,241,112, 28,239,202,112, 0, 39,240,123,175,195,177, 0, 78,162,252,
- 94,136, 44, 0, 59,151, 47, 95, 94,178,167, 33, 0,176, 26, 54,108, 24, 70, 8, 9,107,216,176, 97, 88, 85, 11, 34, 22,139,103,
-159, 58,117,106,137,143,143,207,234, 97,195,134,237,144,203,229,103, 70,142, 28, 25,129,130,206, 32, 12, 10,102, 71,232, 91,173,
- 90,181,172,240,240,112,114,253,250,117, 50,120,240, 96, 37,143,199, 27, 69, 47,227, 20, 10,133,242,151, 48,185,180,191, 21,141,
-163,181, 34, 34, 34,162,104, 12,173,105,229,137,207,155, 55, 47,236,209,163, 71, 97, 40, 24, 37,190, 92, 56, 28,206,241,143, 62,
-250,136,184,185,185,169, 92, 93, 93,143,115,217,236,137,222, 34, 4,227,221,186,186,183,219,187,119,111,255,239,191,255,190, 15,
-128, 22, 0,184, 94, 94, 94,105, 25, 25, 25,170, 59,119,238,168,218,180,105,163,114,118,118,150, 5, 5, 5,169,214,174, 93,171,
- 50,153, 76,170,217,179,103,171,240,199,241,190, 74, 67, 8, 96, 58,159,207, 63, 94,183,110,221,136,133,253, 58,155, 86,207,156,
- 72,198,250,187,168, 0,124, 15,224, 35, 0,246, 0,184, 67,134, 12,185,242,226,197,139, 11, 65, 65, 65,219, 42,161,235, 89,191,
-126,253,171, 7, 14, 28,120,116,236,216,177,176,207, 63,255,252,145,147,147, 83, 74, 76, 76,140, 85,167,211,145,188,188, 60, 34,
-151,203,201,153, 51,103, 44,142,142,142,155,203,220,112, 1, 59,157, 92,220, 87,234, 16, 14,201, 11, 70,145, 54,124, 86,234,187,
-212, 20,137, 68,146,155,147,147, 67, 50, 50, 50, 72,108,108, 44, 57,122,244, 40,233,217,186, 57, 57, 56,117, 16,217, 55,161, 63,
- 89,211,179, 57,105, 97, 35, 84,187,219, 72, 31,217,216,216,200, 42,211,235,208,221,221,253,146, 94,175, 47, 30,190,161, 90,181,
-106, 97,129,129,129,199,130,130,130,214,157, 58,117,234,147,245,235,215,247,239, 84,195,119,238,202, 30,173,181,154,203,135,137,
-242,208,247,100, 94,147, 0, 93,161,153, 47, 21, 47, 39,199,189, 55,174, 95,183, 22,153, 95,179,217, 76, 78, 28, 63, 78,134,246,
-234, 22,145,127,254,215,159,110, 45,158,113, 96,118,147,128, 19,109,132, 24, 94,158, 97, 43,126, 20,145,194,169,189, 45,107, 75,
-111, 31,199,244,118,118,172,239, 91,218,188, 49,189,212,208,128,128,128, 88, 66, 72,122,157, 58,117, 98, 1,236,171, 83,167, 78,
-201,229, 15,203,144, 45, 30,156,116,201,146, 37,164,240,252, 96, 1, 88,180, 98,197,138, 48, 66, 72,152,191,191,255,109, 0,104,
- 36,129,115, 7, 59,214, 79,253,252,220,114, 58,216,177,126,106, 36, 41,125,202, 40, 95, 30,106,183,115, 17,223,234,239,239,161,
-236,232,101,119,115,223,174,159, 87,247,238,221,123, 7,128,205, 0,190,118,114,114,186, 53,124,248,240,231,123,246,236,121,190,
-118,237, 90, 99, 76, 76, 12, 25, 63,126,188, 90, 32, 16,124, 77,175,131, 20, 10,133,242,151, 81, 52, 50,188, 71, 85,140, 86,223,
-185,115,231,134, 17, 66,138,198,210, 26, 93,202, 58,253, 22, 44, 88, 16, 70, 8, 41, 26, 29,254,237, 1,204, 74, 27,208,108,201,
-150, 45, 91,136, 64, 32,248,233, 29, 55,166,164,166,251,128, 1, 3, 90, 42, 20,138,102,110,110,110,205, 10, 35, 87,222,206,206,
-206,177,251,247,239, 87,105,181, 90, 21, 33, 68,101, 54,155, 85,143, 30, 61, 82,117,236,216, 81, 85,226,169,191,162,114,190,193,
-151,238,184,253,112,225, 4,242,165, 59,110,191,245,209,168,157, 59,119,158,139,139,139, 59,109,107,107,251, 69, 37, 53,189, 93,
- 92, 92, 22, 57, 58, 58, 94,112,118,118,254,210,209,209, 49,221,104, 52,146,188,188, 60, 18, 29, 29, 77,174, 95,191, 78,238,222,
-189, 75, 28, 29, 29, 83,202, 42,103, 23, 17,231, 94,222,234,233,196,186,115, 5, 49,108,154, 79, 0, 16,249,250,121, 36,251,135,
-165,228,225,164, 30,164,163,144,253,219, 59,236, 79,216,219,219,111, 63,126,252,184,245,213,171, 87, 36, 52, 52,148,156, 57,115,
-134,204,156, 57,147,212,246,244,208,183,228,179, 50,219, 9, 56, 23,222,101,192, 82,189, 94, 31,166, 80, 40,194, 84, 42, 85, 88,
-221,186,117,195,154, 55,111,126,172,101,203,150,235, 14, 31, 62,252,201,202,149, 43,251,119,177, 17, 68,107, 46, 31, 38,228,243,
- 94,132, 76,111, 75, 94, 79,236, 72, 58,139, 56, 79,202,212,116,115, 75, 41, 26,173, 93,173, 86,147,155, 55,111,146,171, 87,175,
- 18,119,103,103, 69,123, 17,123,114, 27, 1, 58,180,177,133,125,101,203,217,201,142,181,235,222, 15,223, 88,180,231,246,144, 95,
-199,246, 50,119,180,103,109, 41,177,222, 65, 66, 72,250,224,193,131,227, 9, 33,233, 71,143, 30, 77, 38,132,164, 15, 26, 52, 40,
-158, 16,146, 14,224, 64,105,154,111, 13, 78,186,179,208,100, 77, 95,178,100, 73, 24, 33, 36,108,201,146, 37, 97, 64,193, 32,170,
- 29,236, 88,187,239,111, 91, 99,213,159,217, 77, 14,143,239, 99,233, 96,199,218, 93,106, 57,237, 57,167,195,119,174, 39,134, 11,
-251,200,241,153, 35, 45,109,221,109,111, 4, 4, 4,172,249,228,147, 79,142,221,189,123,247,169,197, 98,121, 30, 27, 27,251,124,
-243,230,205,207, 91,181,106,117,219,201,201, 41,130,207,231,127, 84,209, 49,250,147,160,154, 84,147,106, 82, 77, 74, 9, 8, 33,
- 40,175,191,251,233,111,191,253, 86, 66, 8,153, 61,100,200, 16,172, 90,181,106,104,253,250,245,135,123,121,121,185, 0, 64, 90,
- 90,154,230,217,179,103,138, 33, 67,134, 96,209,162, 69, 88,189,122,245, 58, 20,228,178,252,127,146,113,226,196,137,106, 51,102,
-204,144,173, 92,185,210, 58,126,252,248, 58, 0,158,101,103,103,215, 30, 57,114,228,116, 14,135, 51,196,215,215, 55, 40, 61, 61,
- 61, 75,171,213,238, 3,176, 13, 21,180,153,150,133,128, 5, 75,211,234, 30,184,192,130,165,196,219,189, 22, 45, 90, 52,108,208,
-160, 65,198,245,235,215,155, 21, 10,197,169, 74,202, 37,103,101,101, 45, 43, 90,112,116,116,116,127,242,228,201, 71,174,174,174,
-172,216,216, 88,232,245,122,188,122,245,202,138,130,166,169, 82, 81,153,201,198, 31,143, 94, 10,156, 61, 42,196, 86,243,242, 49,
-120,108, 54, 76, 92, 62, 50,238, 93,192,206,155, 47, 21,106, 35, 54,189,203,118,202,229,242,239,102,206,156, 57,242,139, 47,190,
- 16,250,250,250, 50,191,253,246, 27, 14, 29, 58,164,151,201,100, 61, 1,220,248,125,232,167,170, 97,181, 90,193,231,243, 1, 0,
-243,230,205, 3,139,197,226,202,100, 50, 62,195, 48, 2,134, 97,196, 12,195,176, 77,113,207, 97, 85,228, 33, 51, 79,142,228, 76,
-121,185,122, 22,171,245,208,253,251,247,103, 53,110,220,152,245,240,225, 67,100,101,101,225,213,171, 87,196, 66,200,129,155, 90,
- 75, 65, 82,162,190,242,229, 19, 59, 58, 13,104,228, 32, 96,241,119, 45, 66,123, 3,139,189,213,138,193, 40, 24, 75, 11, 0,118,
- 50, 12,195, 3,144, 83,183,110,221, 78, 47, 94,188, 16,213,173, 91, 87,251,242,229,203,115, 12,195,120, 1,216, 93,154,166, 72,
- 36,202, 6,144,125,244,232, 81, 0,152,132,130,157,215,100,241,226,197,233, 55,111,222,196,146, 37, 75, 50, 1,108, 1, 0,169,
-131, 83,191, 32, 59, 30,195,255,101, 9, 90,233,193,218,100, 37,165, 70, 93,165,174,110,157,235, 75, 88,224,254,252, 21,154,185,
- 7,178,248,102, 99,131,165, 75,151,222, 84,169, 84,250,131, 7, 15, 26, 62,252,240, 67,118, 76, 76,204, 3, 0,183, 0, 28, 69,
- 97,142, 37,133, 66,161, 80,254, 82,222, 30,214,161,194, 28,173,183, 93,235, 42, 0, 63, 70, 69, 69, 21, 79, 42, 29, 21, 21, 21,
- 6, 96, 43, 10, 70,131,239, 91, 5,199,187,176, 48,162,181,237, 29, 55,230,109, 77, 97,112,112,176,232,197,139, 23, 60,148, 62,
-225, 49,243, 14,154,127,160,180,185, 14, 3, 2, 2, 54,152, 76,166, 99, 91,183,110, 61,204,102,179, 71,190,135,219,247,245,247,
-247,207,219,191,127,191, 53, 52, 52,148, 44, 92,184,208,226,225,225,145,135, 63,230,104,189,161,217,158,207, 62, 50,167,142,151,
-226,209,232,182,228,245, 39,253,200,173, 81, 29,201,100, 47,169,162,189,144,125,232, 61,159, 74,252,237,236,236,118,138, 68, 34,
-133,173,173,237, 37, 0,173,223,231, 24, 57, 57, 57,237,113,119,119,191, 84,242,229,230,230,118,204,197,197,229,123,103,103,231,
-133,246,246,246, 83,252,132,252,245,159,212,246,212, 69, 12,168, 75, 46,183,113, 33,163,156,249,111, 55, 29,190, 93, 78, 15, 63,
- 63,191,156,189,123,247, 90, 79,159, 62, 77,230,207,159,111,173, 94,189,186, 2,229,228,181,149, 27,209,178,103, 31, 58, 50,168,
-165, 53,179,143, 23, 89, 85,199,198,218,201,129, 93, 86, 15,197, 81,133, 6,120,108, 69,154,181,106,213,218, 74, 8,217,181,124,
-249,242, 93,248,125, 46,208,110, 75,151, 46, 93, 76, 8, 89,188,116,233,210,197, 0,122, 0, 64,123, 59,214,222,125,253,155, 90,
-210,122,123,146,111,234, 72, 45,237,237, 88,123, 75,141,100, 58,114, 78,156,156,216,199,154, 62,177, 13, 89,228, 47,177,180,116,
- 20, 92,225,243,249,159,160, 32,226,220, 28, 0,159, 62, 53, 83, 77,170, 73, 53,105, 68,235,239, 97,188, 42, 51,169,116, 73,220,
- 29, 29, 29,119,214,172, 89,243,176,175,175,239, 97,169, 84,186, 14, 5, 73,243, 85, 61, 16,126, 43, 86,172, 80,216,217,217, 53,
-250, 19, 15,174, 43, 0, 47,252,113,226,220, 63,173,194, 44,243,192,140,152, 47,134, 62, 89,230,129, 25, 37,222,110, 94,167, 78,
-157,111, 80, 48,154,247,251, 86, 66, 95, 71, 71,199,205,142,142,142, 41,133,185, 89,190,149,209,108,202,102,143,236, 36,100,255,
-214,154,207,202,232, 36,228,220,105,198,102,143,248,135,158,128,229,117,182, 40, 75,179,154,179,179,243,122, 71, 71,199, 52,103,
-103,231,205, 85, 52, 89,111,104, 54, 18,193,163,179, 61,251, 68,107, 27, 70,221,217,142,125,180,169,184,236, 78, 29, 85,216,246,
-224, 37, 75,150,140, 35,132,140,243,244,244, 28, 82,194,248, 7, 45, 90,180, 40,132, 16, 18, 82, 52, 2,124,115, 49, 92, 59,218,
-179,247,183,177,101,228, 29,237,217,251,155,139,225, 90, 86, 57, 59,217,179, 15,181,177,101,228,237,109, 89,251,125, 4,168, 78,
- 47,230, 84,147,106, 82, 77,106,180,254, 29, 70,139, 86, 24,170, 73, 53,169, 38,213,164,154, 84,147,106, 82,163, 85,186,177, 42,
-249,242, 40, 50, 90, 28,186,111, 40, 20, 10,133, 66,161, 80,222,139, 50, 7, 44,101,202,113,165, 85, 73,108,127, 23,103,123,153,
-106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,138,180,255,191, 59,214,253,101,208,166, 67,170, 73, 53,169, 38,213,164,
-154, 84,147,106,254, 93, 52,255,117, 16, 66,222,105,144, 80, 10,133, 66,161, 80, 40, 20,202,239, 4, 23,254, 45, 30,184,180, 40,
-154, 85,106,142, 22,167,249,242, 76,179,217,236, 10, 0, 28, 14, 71,102,122,176,208,163, 60,117, 46,208,197, 92, 48,253, 14, 56,
-192, 36, 51,112,169, 20,205, 75,102,179,217,161, 80, 51,207,244, 96, 97,143,114, 53,155, 47,191, 80,114,125,243,131,133,221,254,
-224, 20, 1, 54,183,249,242,180,183,202,234, 89,217,189,194,224,141, 49,177,254,178,114,254, 83, 52,255,203,112, 91, 44,207, 52,
-153, 10,234, 17,151,203,145, 25,239,151, 95,143,120, 45,150,167,149, 92,223,116,127,161, 91,121,154, 98,145, 32,167,150,151,203,
-186,242, 52, 99,211,178,103,171, 53, 58,167,242, 52,171,122,110,122,123,120,116,177, 20,158,155,108, 96, 82, 74,122,250,165,191,
- 89, 93,106, 10, 96, 33, 0,219, 18,239, 69, 0,248,148,214, 74, 10,133,242, 15, 51, 90,225, 40,152,231,112,123,161,217,218, 94,
-166,209, 50,155,205,174, 97,199, 23, 67,173, 7,186,140, 89,238,234, 55, 96,219, 31, 38, 74, 54,235,242,248,242,200,131, 65,108,
-147,194,193,133, 99,180, 77, 75, 75, 99, 0,128, 97,152,159, 0,248,148,162,233, 16,118,124, 49, 52, 6,160,253,240,165, 14, 62,
-128,109, 22,143,247,153, 72, 34,233,164,213,106,235, 3,128, 72, 36,138,212,170,213,215, 92,140,198,181,111,175, 95,214,150,149,
- 44,107,231,209,203, 93,235, 12,216, 54,211, 98,181,242, 83, 31,110,109,175,203,142,225,112,205,250, 45, 95, 2,231, 22,151, 98,
-170,202,208,251,253,119, 63,152,239,196, 5, 58,243,133,194, 70,246, 14, 14,237,172,132,212,181, 90,173,140,197,108,126,174,200,
-207,191,101, 53,155,159,152, 13,106,167,176, 83,223, 88,203, 43,231,219,219,242, 1,192, 57, 14, 12,145, 72,165,157,216, 92,110,
-107, 0,176,152, 76,191,169, 85,170,107, 3,129, 35,149,217,246,202,238,159,119, 93,255,191,134,201,100,118,141,187,176, 24,122,
- 19, 16, 60,248, 27,215,134, 35,127,217, 15, 0, 6,217, 19, 55, 85,204,169, 22, 0, 32,169, 21,114, 95,224, 30,156, 9, 0,156,
-196,116,215,232,208, 5,208,155,128,186, 33, 75, 93, 43,210,252,112,209, 33,167, 47, 38, 15, 18, 0,192,197,163,223,215,190,122,
-236,199, 94, 0,208,121,208,180,115,221, 7,207,136, 6,128,213,219,143, 57, 29,248,102,104,185,154,149, 59, 55,243,121,249, 49,
-161,254, 6, 69,186,189,183,132,227, 30, 19, 19,195, 2, 0, 79, 79,207, 74,157,155,213, 0,187,116, 96, 58,139,205,110, 87,203,
-223, 63, 24, 0,137,125,253, 58,220, 98, 54,223,246, 0,182,252,201,117,105, 38, 33,111, 14,206,202, 48, 12,173,144, 20, 10,229,
-159,198,153, 66,115,117,230, 15, 15,179,101,125, 67,173, 7,110,188, 2, 58,180,108,136,201, 35,123, 75, 75,126,118,100,219, 82,
-159,152,135, 39,235,252,252,203, 90, 86,195,134, 13, 17, 23, 23, 87,169, 82,104, 12,192,245, 24, 0,242, 23, 54,121, 18,201,235,
-245,107,214,216,118,235,214,141,227,233,233, 9,134, 97,144,145,145,209,242,242,229,203, 77,103,205,154, 53, 21,242, 23,121, 26,
- 3,148,215, 99, 42,214, 45, 42,107,253,218,213,177,112,198, 80, 59, 0,248,114,204,150,166, 15,163, 50, 29, 95,191,126,221,101,
-238,220,185, 57,236,107,215,126,116, 6,118,101, 2,201,149, 41,231,158,211,247,133,118,233,191,250,141,154, 49,227,168,191,191,
-191,212,215,215,151,177,177,177, 1,155,205, 70, 94, 94,158,207,179,103,207,122, 61,120,240, 64,125,249,198, 79,252, 71, 15,250,
-197,202,132, 45,116,149,218,118,109,154,240,162,141, 77,228,232,129, 3,171, 13, 29, 58, 84, 88,171, 86, 45, 0,192,235,215,175,
- 3,142, 28, 57, 50,252,232,209,163,139,160, 77, 51,107, 12,208, 85,180,237,197,154, 0,132, 64,107,123, 87,215, 81,108, 46,183,
-190,217,108,246, 42,140, 54,164, 90, 76,166, 72,185, 76,182,239,237,245, 41,127, 68,111, 2, 94,164, 3, 93,219, 5, 99,244,160,
-174, 18, 0,152, 59,108, 69,203,196,248, 87, 60,131,193,128,218,129,117,219,124,253,205,186, 11, 96,177,176,247,216,229,226,245,
- 43,163, 25,241, 34, 14,139,191, 94,143,180,167, 71, 90, 90,242, 95,117, 82, 42,242,217, 0, 96,107,103, 55,232,200,193, 95,175,
-121, 6, 13,185,247, 42,219, 88, 41,205,242,206,205,243, 7, 55,123,164, 60,187, 86,239,135,139, 59,185, 62, 62, 62,120,250,244,
-105,213,206,205,252, 40, 27,171,135,199,243,181,159,127,238,222,190,125,123, 72,165, 82,112, 56, 28,152,205,230,174,183,111,223,
-238,186,120,241,226,105,200,143, 82, 87,246,220,172, 4,107, 25,134,233,244,225,228,153, 30,189,251, 15,193,160,158,109,104, 69,
-164, 80, 40,255, 52,138,162, 87, 37,123, 30,110, 47,215,104,113, 56, 28, 89,183,177, 43, 93,219,181,104,128,135, 79,162,243, 19,
-146,210, 85, 69,159,229, 70, 30,169,221,191,141, 87,189,155, 55,111, 64,175,215,227,183,223,126,195,147, 39, 79, 16, 31, 31,143,
- 41, 83,166,232, 11,155, 14, 75,211,204,107, 63,124,169, 3,242, 99,164, 1,252,168, 26,151, 95,190,100,235,116, 58,220,188,121,
- 19,121,121,121,224,243,249,168, 86,173, 26,186,119,239,206,121,249,242,165, 99,151,110, 61,237,218,247, 28, 17, 7,187, 0, 21,
-135,195,201, 43,107, 30, 17, 14,135, 35,235, 50,102,185,107,189,128,234,120,157,144,150,191,240,155,159, 85, 86, 43,225,196,198,
- 39, 26,111,220,184,129,224,224, 96, 92,186,116,201, 41, 55, 55,247,171, 45, 91,182, 44,228,126,251,195, 70,147, 33,103, 14,202,
-214,203,107, 63,124,169,131,147,236,176,239,213,243, 39,120,145,145,145,188,173, 91,183, 34, 39, 39, 7,124, 62, 31,246,246,246,
-112,119,119, 71,237,218,181,153, 47,191,252, 82, 26, 18, 18,137,143, 39, 13,241, 53,250, 77,140, 42,171,156,197,219,174, 74, 20,
- 59, 43, 46,214, 58,118,230, 12,171,109,219,182,111, 60,182,215,172, 89, 19, 61,122,244, 16,142, 26, 53,170,214,208,225, 35,173,
-237,251,124,248, 26, 82, 95, 77,133,154,234,100,145,147,230,174,103,215,225,195, 79, 45, 93,186,212,222,221,221, 29, 18,137, 4,
- 0,144,159,159, 95, 45, 33, 33,161,229,162, 69,139, 6,223,143, 56,200,105, 31,146,156, 6,137,183,182,188,253,249, 95,133,203,
-229,200,138,162, 72, 54, 18, 81, 94,114, 74,166, 26, 0, 12, 6, 3, 12, 6, 3,244,122, 61, 62,154, 54,133, 61,105,112,115,127,
-223,118, 51, 31,199,167,102,230,214,189,124,207,177,232,187,166, 10, 52, 57,154,120,185, 60,233,202,164,197,159,127,238,238,230,
-246,123,139,224,222, 61,123,216,185,185,185, 93, 23, 47, 94, 92,143,136, 59,202,235,134, 44,181, 47, 79,179,188,115, 83, 30,125,
-166,198,215, 51,122, 52,218,246, 77, 40, 44, 22, 11,238,222,189,139,155, 55,111, 98,221,186,117,228,220,185,115,249,182, 18,201,
- 36,148,123,110, 70,217,180,245,200,240,251,246,219,163,140, 64, 32,192,201,147, 39,241,242,229, 75,176, 88, 44, 52,108,216, 16,
-163, 71,143, 70,215,174, 93,221, 39, 79,158, 66,218,247, 28, 22, 11,187, 64,229,123,214, 37, 22,128,153,243, 23,127,235, 49,102,
-226,116,172,254,250, 75,106,180, 40, 20,202, 63, 57,154, 85,230, 16, 15, 8, 13, 13, 37,133,175, 14, 0, 64, 0, 86,205, 1,219,
- 14, 28,126,100, 61, 83,115,192,182, 3, 4, 96, 17,128,101, 11, 84,111,220,184,177, 73, 46,151,147, 7, 15, 30,144,143, 62,250,
- 72,189,113,227,198,107,103,206,156, 57, 98, 54, 26,119,120,122,120,124, 71, 80,122,130, 61, 1, 88,190,128,157, 88, 44,206, 74,
- 74, 74, 34,103,207,158, 37, 75,150, 44, 33,251,246,237, 35,231,206,157, 35,151, 47, 95, 38,231,206,157, 35, 7, 14, 28, 32, 17,
- 17, 17, 36, 58, 58,154, 72, 36,146, 44, 95,192,174, 28, 77, 54, 1,216,181, 7,108,157,115,244,161,105,105,224,128,109,179, 8,
-192,118, 0,234, 52,110,220,216,114,228,200, 17,178,119,239, 94,242,203, 47,191,144,136,136, 8,146,157,157, 77, 56, 2, 73, 86,
-209,247,202, 42, 39, 1, 88, 94, 94, 94, 89,114,185,156,120,123,123, 19, 62,159, 79,220,220,220, 72,237,218,181, 73,203,150, 45,
- 73,175, 94,189,200,200,145, 35,201, 87, 95,125, 69,228,114, 57, 17, 10,133,153, 69,223, 43, 75, 51, 24, 16, 73, 36,146,164,176,
-176, 48, 82, 22, 90,173,150,100,103,103,147, 11, 23, 46, 16,137, 68,146, 20, 12,136,202,211, 20, 1, 77,130,130,130,178,178,179,
-179,137,209,104, 36, 73, 73, 73,228,217,179,103,228,229,203,151, 36, 41, 41,137,104,181,218, 98,237,232,232,104,226,231,231,151,
- 37, 2,154,148,165,249, 95,166,168, 78,188,253,242,113,115,235,229,238,238,174, 61,122,244, 40, 73, 77, 77, 37,187,119,239, 38,
- 44, 96,197,219,235,149,167,201, 7,186,183,109,219,214,114,247,238, 93,242,248,241, 99, 50,111,222, 60,210,163, 71, 15,210,179,
-103, 79,178,120,241, 98,146,146,146, 66, 82, 82, 82, 72,175, 94,189, 44,124,160,123, 69,245,179,180,115,211, 14,240, 9, 9, 9,
-209, 26,141, 70, 18, 27, 27, 75,234,215,175,159,194, 6, 70, 73,128,122, 29, 0, 65, 69,245,211, 11,112,240,240,240, 72,191,123,
-247, 46, 57,118,236, 24,241,245,245,205, 98, 3, 31,218, 2, 53,109,129,154,108,224,195,154, 53,107,102,221,189,123,151,228,228,
-228, 16, 31, 31,159,116, 47,192,225, 61,234, 18, 11,192,206,249,139,191, 37, 81, 41,106, 50,127,241,183, 4, 64, 18, 41,200, 30,
-189, 68,107, 36,133,242,223,227,109, 47,242,143,191,175, 16,242,102,175,195,144,144, 16, 6,192,245,242,190,164,101,179, 87,174,
- 94,189,154,163,211,233,240,243,207, 63, 43, 63, 24, 60,248,112,135,118,237, 98,107,248,250,202, 25, 22,171,194,217,134,179, 4,
-130, 79, 86,175, 94,109,111, 48, 24,240,232,209, 35, 52,109,218, 20,238,238,238,144, 74,165,144, 74,165,112,117,117, 69, 96, 96,
- 32,100, 50, 25,108,108,108,240,197, 23, 95,216,101, 9, 4,159, 84,164,107,181, 18, 14, 0, 88,172, 86, 62, 15,152,236,215,172,
-217,163, 69,139, 22,177,156,156,156,224,232,232, 8,169, 84,138,151, 47, 95,194, 96, 48, 64, 44, 18, 87,106,144, 86, 22,139,197,
-146, 74,165,184,122,245, 42,102,206,156,137,214,173, 91,195,222,222, 30, 54, 54, 54,168, 95,191, 62,186,119,239,142, 73,147, 38,
- 33, 54, 54, 22, 76, 37,146, 74,158,115, 56,211, 39, 77,154,228, 26, 28, 28, 92,234,231, 58,157, 14,114,185, 28, 89, 89, 89,168,
- 86,173, 26,134, 12, 25,226,250,156,195,153, 94,150,158, 19,224, 94, 45, 32,224,212,131, 7, 15,156, 37, 18, 9,246,238,221,139,
- 19, 39, 78,224,252,249,243, 56,123,246, 44, 66, 67, 67,113,242,228, 73,100,101,101, 1, 0, 2, 2, 2,112,232,208, 33,103,169,
-171,107,168, 19,224, 78, 79,233,202,145,152,153,121,177,126, 70,134,243,168,145, 35,111,169, 84, 42,140, 26, 53, 10, 43, 87,173,
-250,146, 11,204,170,204,247, 3, 1, 59, 71, 15,143, 93,223,126,251, 45, 43, 35, 35, 3, 3, 7, 14,204, 94,187,106,213,132,240,
- 11, 23,106,133,157, 63, 95,107,229,210,165, 19, 58,116,232,144,157,146,146,130, 61,123,246,176,220,124,124,118, 5, 2,118, 85,
- 45,167, 18,152,185, 97,195, 6,161, 78,167, 67,183,110,221, 98,173,145,145,129,102,224, 87, 21,240,242, 58, 96,172,232,251,233,
-192,244, 47,190,248,194, 93, 32, 16,224,179,207, 62,203,214, 36, 38, 54, 48, 3,191,228, 3, 9,249, 64,130, 25,248, 69, 25, 23,
-215, 96,204,152, 49,217, 2,129, 0,235,215,175,119, 79,255,125,210,237,202,210, 20,192, 41, 0, 55, 0,164,125, 56,121,230,135,
-193,205, 91, 97,207,142, 45,248,102,233,220, 93, 0, 62, 96, 24,102, 31,128, 57,180,230, 81, 40,255, 77, 42,227, 69,254,166, 76,
- 46,235, 3, 78, 73, 39, 9,160, 99,121, 42, 14, 78, 78, 77, 27, 52,104,128,155, 55,111, 34, 40, 40,232,129,189,189,189,153, 39,
- 16,128,203,229,130, 88, 43,244, 89, 16, 73, 36, 93,186,118,237,202,185,119,239, 30,252,252,252, 32, 18,137,192,229,114,223,120,
-241,120, 60,120,120,120, 64,161, 80,160, 75,151, 46,220, 77,155, 54,117,129, 94,255,117,133, 55,196,152,103,210,172,123,223,142,
-252,105,247,174,154,237,219,183, 71,126,190, 2, 86,171, 21, 98,177, 24, 6,131, 1, 28, 14,167,160, 9,200, 68, 20,149,217, 99,
- 22,139,197,194,102,179,225,231,231,135,149, 43, 87, 66,167,211,129,199,227, 1, 0, 20, 10, 5,228,114, 57,158, 61,123,134,132,
-132, 4,144, 74,140, 72,102, 99,103,215,123,232,208,161,165, 78,248,171,215,235,145,159,159,143,252,252,124,200,229,114,232,116,
- 58,180,106,213,138,127, 38, 52,180, 55,114,114,214,150,250, 29,161,112,240,158, 61,123, 92,249,124, 62,180, 90, 45,148, 74, 37,
-146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16, 8, 6, 12, 24,192, 40, 20, 10, 48, 12,131,
-144,144, 16,167,253,123,247, 14,133,193,176,142,158,210,149,227, 34,160,111, 98, 48,244,109,209,188,249,213, 7, 15, 31, 6,127,
-242,201, 39,136,136,136,248, 86,124,240,224, 13, 13,240,164,188,239,198, 2,211,191, 43, 97, 96, 72, 98, 98,144, 17,200, 42,177,
- 74,130,111, 92,220,249, 49, 99,198, 60,141,136,136,112, 94,191,126,189,251, 7, 3, 7, 78, 7,176,162, 42,101,180,177,179,107,
-230,225,225,129,115,231,206, 33, 41, 62,126,174, 25,208, 86, 41,188,196,102,183,109,223,190, 61, 78,158, 60,137,148,196,196,185,
-230, 55,203, 88,240,160, 4,100,113, 98, 99,231,238,218,181,107,231,248,241,227,193,230,112,218,194, 92,165,134,195, 63, 36,190,
-143,159,242, 9,118,109,223,180, 11,192, 68, 0, 86, 0, 15,104,141,163, 80,254,219, 81,173,138,188,200, 63,200,108,109, 7, 80,
-181,136,150,171,171,171,151, 84, 42, 69, 90, 90, 26,234,214,169, 35, 19, 8, 4,224,115,185, 16,242,249,149, 42,129, 70,163, 9,
-242,244,244, 68,126,126, 62,156,157,157,193,227,241,138, 95,124, 62,191,248,127, 27, 27, 27,176, 88, 44,248,248,248, 64,163,209,
- 4, 85,168,155,249,204,245,224,166,105, 31,221,189,113,174,230,192,129,131,224,224,224, 8,111,239,106,112,117,117,133, 72, 36,
-130,183,183, 55,106,213,170, 69,214,174, 93, 11,177,107,195, 74, 93,200, 75,154, 39, 14,135, 3,139,197,130,204,204, 76, 68, 69,
- 69, 33, 34, 34, 2,119,239,222,197,227,199,143,161, 84, 42, 43, 53,242,171, 70,171,109,196,225,112, 74, 53, 89,114,185, 28,114,
-185,188,216,104,101,101,101, 33, 33, 33, 1, 42,181,186,113, 57,166,119, 80,131, 6, 13,216, 0, 32, 18,137,208,184,113, 99,108,
-219,182,205,124,250,196,137, 97,245,238,222,117,244,190,112,193,254,167,173, 91,135, 13, 25, 50,196,114,239,222, 61, 40, 20, 10,
-188,120,241, 2, 46, 46, 46, 28,190, 80, 56,148,158,206, 85, 35, 12, 80, 59, 43,149, 61, 91,183,110, 29,151,159,159,143, 53,107,
-214,176,184, 54, 54,219,151,150,209,196, 87, 12,155,221,166,125,251,246, 56,117,234, 20,210, 18, 19,231, 37,150, 98, 96, 18,129,
-172,164,216,216,121,187,118,237, 66,247,238,221,193,112, 56, 85, 78, 84,106,217,178,101, 3,171,213,138,167, 79,159,194, 30,184,
- 95,213,239,215,242,247, 15, 46,138,252, 74,128, 91,101,173, 39, 1,110,133,135,135, 67, 36, 18,161,110,189,122, 77,170,248, 51,
-107, 25,134, 73, 31, 63,229, 19, 28, 59,127, 7, 0,176,107,251,166,204, 18, 38,139, 66,161,208,136,214, 63, 53,162, 85,100,172,
- 74,190,240,134,209,170,164,249, 0, 0,112,185, 92,240, 5, 2,240,249,252, 2,131, 36, 16, 84, 90,131, 97, 24, 8,133,194, 98,
- 99, 85,210, 96,149,252, 95, 44, 22, 87,122,232,250,188, 87,231,219, 77,156, 48,158, 47, 16, 8, 96, 48,232, 65, 8,129, 64, 32,
-132,189,189, 61,252,252,252,160, 80, 40,208,186, 77, 7,125,178,156, 23,234, 84,119, 64,196,187,236, 61,179,217, 12,181, 90,141,
-188,188, 60,228,230,230, 66,161, 80, 64,171,213, 86,186, 43,186,213,106,101, 39, 39, 39,227,215, 95,127, 69, 78, 78, 14,128,130,
- 68,235, 34,115, 85,244, 55, 46, 46, 14,123,247,238, 69,124,124,124,149,142, 79,187,118,237, 16, 26, 26,202,238,216,165,203,142,
- 75,190,190,105,151,124,125,211, 58,118,233,178,227,212,169, 83,108, 47, 47, 47, 36, 36, 36,224,209,163, 71,200,203,203, 3, 33,
-132,246,159,127, 7, 94, 3,121,154,220,220,241, 95,126,249, 37,145, 74,165, 88,243,221,119,141, 86, 0, 35, 42,107, 96,236,202,
- 49, 48,118,239,103, 96, 64, 8,129,213,106,133,197, 98,121,167,109, 99, 24,134,225,114,185, 85, 29, 90,161, 42, 43, 23, 39,190,
-127,241,213, 74,156, 61,121,164,232,253, 24,106,178, 40, 20,202,191,128, 50, 19,225, 57, 37, 28,100,241,223,178,200,204,204, 76,
- 85,171,213, 53,125,125,125,145,146,146,226,234,227,227,147,200,231,114,193,227,243,193,176, 42,246, 4, 98,177,248,105, 90, 90,
- 90, 27, 47, 47, 47,152,205,230, 98, 83,245,118,211, 97, 81,148,230,241,227,199, 16,139,197, 79,161, 43,119,228, 4, 88, 12,121,
-213,155, 52,105, 82, 28, 25,178,183,183,135,189,189, 29, 4, 2, 33, 22, 44, 88, 96, 93,191,118,237, 22,159,206, 75,243,199,205,
-250,146,124,185, 98,199,159,186,103, 43,123, 99, 18,139,197, 79,189,189,189, 91,217,217,217,225,216,177, 99, 72, 72, 72, 64, 94,
- 94, 30, 52, 26, 13,244,122, 61, 52, 26, 13, 12, 6, 3,132, 66, 33,234,213,171, 7, 91, 91, 91, 92,190,124,249, 41,244,250,210,
-205,101, 78,206,177,167, 79,159,182,106,222,188,121,113, 68,165, 83,167, 78, 76,167, 78,157,156,139,163,104, 26, 13,178,179,179,
-241,224,193, 3, 92,190,124, 25, 12,195, 32, 38, 38,198,162,215,106, 15,208,115,226,221,208, 1,191,177,119,237,218, 57,117,234,
-212, 9,109,218,180,129, 5,232, 5, 96,239,255,208,192, 0, 0,238,222,189,251,204, 98,177,180,169, 93,187, 54,228, 64, 11, 0,
- 39,171,100, 34, 95,189, 10, 55,155,205, 93, 26, 53,106,132, 99,135, 15,183, 3,144, 80,218,122,106,160, 93,112,112, 48,180, 90,
- 45, 94, 60,127, 30, 86, 5,147,181, 99,254,226,111, 63, 28, 51,113, 58,246,236,216,130, 93,219, 55, 37,239,220,182,209, 27,149,
-200, 31,163, 80, 40,255,169,104, 86,133, 94,228,111,202,228,178,204, 23,167, 42, 42,249,121,121, 97,225,225,225, 53,155, 52,105,
-130, 29, 59,118, 52,111,221,170, 85, 42,143,207, 55,243,121, 60,176, 42,113, 35,209,170,213, 87,174, 92,185,210, 98,192,128, 1,
-156,123,247,238,193,221,221,189,216,104, 21,253,229,112, 56, 32,132, 64, 44, 22,227,248,241,227, 70,173, 90,125,165,194,104,145,
-197,106, 97, 21, 26, 61, 66, 8,228,114, 57,120, 60, 30,214,173, 91,143,205,107,215,142,180, 0, 71, 2, 36, 46,159, 3, 16,254,
-207,110,208, 26,205,213,179,103,207, 54, 93,180,104, 17,183, 90,181,106,144,203,229,200,203,203, 67, 78, 78, 14, 20, 10, 5, 20,
- 10, 5,242,242,242, 32,151,203, 33, 20, 10, 17, 17, 17, 97,210,105, 52, 87,203,210, 19,232,116, 71,199,142, 29,251, 69,120,120,
-184, 7,135,195,129,201,100,130,213,106,133,213,106,133,209,104,196,171, 87,175, 16, 25, 25,137,151, 47, 95, 34, 55, 55, 23, 92,
- 46, 23,108, 54, 27,143, 31, 63,206,147,152, 76,135, 13,244,156,126,103,184,192,177,219,183,111, 79, 24, 61,122, 52, 60,171, 85,
-235,128,148,148, 74, 25,152, 19,229, 24,152,252,119, 51, 48,191, 27, 32,165,242, 97, 92, 92, 92,155,142, 29, 59,194,163, 90,181,
-111,235,165,164, 92,122, 94,133, 60, 45,139,217,124,235,246,237,219, 93,198,140, 25,131, 29, 59,118,124,235, 18, 23,119, 62,235,
-173,102, 78, 23,192,165, 70,173, 90,223,126,248,225,135,184,120,241, 34, 44,102,243,173,114, 36, 75,142,248, 94,253,195,201, 51,
-189,223, 74,124,223,198, 48,204, 12, 0,107,104,141,162, 80, 40,255,230,136, 86,149,154, 14, 69, 22,203,252, 57,115,230,152, 88,
- 44, 22, 6, 13, 26,100,115,242,212,169, 33,143,159, 60,241,147,201,100,246, 22,139,165, 66, 45, 23,189,126,227,156, 57,115,228,
- 6,131, 1,129,129,129,200,205,205,133,197, 98, 1,135,195, 1,135,195, 1,195, 48, 96,177, 88,144, 74,165, 8, 15, 15,199,206,
-157, 59, 21, 46,122,253,198, 10,111, 18, 22,203,211,189,123,247,130,205,102, 19,161, 80, 8,134, 97,192,225,112,176,126,253,122,
-217,102,224, 24, 0,176, 89, 44, 3, 0,176, 88, 76,101,179,119, 43,108,183,228,243,249,176, 22,116, 2,168,112, 93, 7,189,126,
-195,234,213,171,149, 47, 94,188,128, 90,173, 46,142,190,169, 84,170,226,228,122,185, 92, 14,134, 97,160, 86,171,113,234,212, 41,
-165,131, 94,191,161, 44,189, 28, 32, 35, 37, 38,166, 95,243,230,205,115,226,226,226,144,159,159,143,167, 79,159,226,242,229,203,
- 56,116,232, 16, 46, 94,188,136, 87,175, 94,193,108, 54,195,203,203, 11,132, 16,156, 56,113, 34,223,172, 84,246,202, 1, 50,232,
- 57, 81, 54,213,221,221,187,184,185,186, 38,185, 56, 59,167, 84,119,119,239,242,246,231,118, 64,116,116,116, 52,204,102, 51,252,
-252,252, 28,203,203,211, 34,102,243,237,219,183,111, 99,204,152, 49,240,174, 89,115,149, 47,224,242,246, 58,190,128,139,111,173,
- 90,171,138, 12, 12, 49,155,111, 87,181,204, 54,192,166,207, 63,255, 92,203,227,241,112,240,224, 65, 63,147,191,255, 75, 14, 48,
- 66, 10,212,233, 8,240, 42,250,190, 7,176,229,171,175,190,202, 96, 24, 6,251,246,237,115,182,171, 85,235, 25, 7, 24,107, 7,
- 84,183, 3,170,115,128,177,118,181,106, 61, 59,120,240,160,179,217,108,198,172, 89,179, 50, 60,128, 45,229, 72,206, 36,132,244,
- 37,132,180, 39,132,120,239,220,182, 17,103, 79, 30, 41, 50, 89, 19, 81,144,244, 62, 26,192, 51, 90,227, 40, 20,202,191,153, 82,
-195, 80,156,230,203, 51, 1,226,218,161,101, 67, 60,124, 18,149,239,236, 96,123,161,232,179,220,200, 35,181, 59, 7,217, 54,252,
-225,135, 31,192,229,114,145,156,156,140,231,207,159,195,214,214, 22, 35, 71,142,212,107,149,202,126, 37,230, 58,236, 10,224,114,
-161,102,193,124,106,249, 49,210, 90,156,136,154,231,207,134,178,237,236,236,160, 82,169,192, 98,177, 32, 20, 10, 33, 22,139, 33,
- 18,137,240,232,209, 35,244,233,219,223,146, 37,110,255,251,128,165,191,207,167, 86,172, 89, 52,214, 80, 11, 64, 28, 14,124,230,
-234,233, 57,103,225,194,133,162, 30, 61,122,128,199,227,161, 90,245,128, 12,191,158,107, 54,177, 88,140, 57, 37, 71,177,160, 86,
-117, 79,187,231, 49, 9, 0, 24,153,233,193, 66,207, 18,115, 29,254,161,156, 62,134, 27,126,199,127, 89,107,219,184,113, 65, 62,
-186, 92, 46, 71,102,102, 38,100, 50, 25,228,114, 57,212,106, 53, 0, 32, 52, 52, 20,103,111,190, 84,104,171, 13,137, 45,171,156,
-191,111,123,148,141,167,241,126,141,253,123,127, 97,187,184,184, 32, 51, 51, 19, 89, 89, 89,144,203,229,208,106,181,176, 88, 44,
-200,205,205,197,207,187,126,177,228, 72,219,199, 23, 15, 8, 89,158,166, 58, 89,228,168,186,227, 21, 92,207,151, 76,152, 48,193,
-198,214,214, 22, 86,171, 21,121,121,121, 72, 74, 74, 66, 92, 92, 28,110,222,188,169,150,201, 13, 80, 59,119, 75, 41, 30,176,180,
- 20,205, 63,145,127,156,102,201,113,171, 60, 61, 60,210, 18, 19, 19, 93, 45, 22, 11,188,188,188,204,242,220,220, 85,124,224,162,
- 13,144, 14,128,100, 3, 11, 55,108,218, 52,190,127,255,254,104,214,172, 89,114, 70,102,102,141,210,234, 18, 1,216,129,128,157,
-166, 90,181,200, 7, 15, 30,184, 39, 37, 37, 97,204,152, 49,217,137,175, 95,207,179, 43,204,215,202, 7,218,249,214,170,181,234,
-224,193,131,206, 53,107,214, 68, 80, 80, 80,134, 48, 41,169,126, 20,144, 95, 70,253, 44,243,220,148, 71,159,169, 49,109, 96,131,
-102, 31,125,244, 17,204,102, 51,110,222,188,137,251,247,239, 35, 49, 49, 17,119,238,220,145,219, 74, 36,195, 74,204,117, 88,106,
-253,236, 21,160,246,219,183,111, 47,195,227,241,176,107,215, 46,132,135,135, 3, 0,130,131,131,241,225,135, 31,194,108, 54, 99,
-212,168,209,228, 76,148, 40,182,188,250, 9,160, 1,128,239, 80, 96,242,154, 17, 66,132, 12,195,164, 1,240, 70,213,114,178,104,
-253,164,154, 84,243,191,163,249,175,162,220, 73,165, 75,206,167,182,252, 71,216,189, 57,205,199,164,180, 35,219,150,114,218,182,
-107, 95,103,233,146,197,172,230,205,155,195,219,219, 27,193,193,193, 72, 74, 74, 18,216,219,219, 87, 52,159,154,170,125,207, 17,
-113, 13, 27, 54,180,159, 55,111,158, 93,247,238,221,185,222,222,222, 32,132, 32, 60, 60, 28,199,142, 29, 51,238,216,177, 67,161,
-113,235, 43, 15,187,246,171,170, 50,243,169,221, 7, 52, 0,150, 85, 75, 75,219, 62,125,218,180,197,141,155, 52,153,176,100,201,
- 18,150, 84, 44,226,174, 92, 48, 81, 8, 0,203,191, 63,100,215,127,200, 72,108,240, 7, 58,140, 40,125, 30,185,146,229, 76, 74,
-153,148,216,123, 96, 23,255,207,102,140,183, 12, 29, 58, 84, 98,107,107, 11,111,111,111, 56, 56, 56, 32, 54, 54, 22, 41, 41, 41,
-228,244,233,211,170,187,143,163,185, 39, 46, 62, 76, 20,218,121, 84,102, 94, 66,101,251, 30, 31,196,247,238,221,219, 97,236,216,
-177, 54, 77,155, 54,229, 10, 4, 2, 8, 4, 2,100,102,102,226,213,171, 87,198,211,167, 79,171, 52,174,189,242,194,174, 29, 84,
- 86,114,174, 67,109,251,225, 75, 95,221,186,180,100, 86,228,211,167,163,173, 64, 35,163,209,232,101,177, 88, 24, 22,139,149,110,
-181, 90,159, 26,149,202,157,250,224, 37,235,233, 92,135,149,195, 98,177,240, 44, 22, 11,228,114, 57, 46, 93,186,196,121,253,250,
-245,194, 39, 79,158, 44, 76, 75, 75,131,201,100,194,224,193,131, 17, 28, 28,140,107,215,174, 33, 43, 51,243,116,121, 90, 81, 64,
-190, 32, 37,229,195, 73,147, 38,157,219,187,119, 47,235,201,147, 39,206,187,118,237,250,185, 52, 3, 51,122,244,104,107,102, 82,
-210,135,122, 32,191,156,250, 89,222,185,153,125,254,224,230, 39, 3, 6, 13,169,183,100,209, 66,110,235,214,173,225,236,236,140,
-118,237,218,193,104, 52,218,215,173, 91,183,162,115, 83,217,190,231,176,216, 70,141, 26, 73,214,175, 95,239, 62,126,252,120,204,
-152, 49, 3, 0,160,213,106,113,241,226, 69,204,154, 53, 43, 35,137,211, 66, 93, 81,253, 44,140, 84, 21, 25,176, 27, 0,218, 3,
-136, 5, 77,124,167, 80, 40,255, 78,138, 38,149,246, 64,193,196,210,103, 80,240,112, 94,241, 92,135,183,238, 63, 67,201,105, 62,
- 10,240,120,110,246, 25,251,122,202,156, 85, 65,108,147,194,129,203,232,108, 99,162,163,153,138,230, 60, 44,158, 79,205, 46, 64,
-229, 20,119,160,249,202,229,203, 63,217,176, 97, 67,151,162, 33, 28,196, 98,241, 83,173, 90,125,197, 69,175,223,168,177, 11,184,
- 82,213,185,249, 82,128, 76, 0,211, 28,194,194, 54,133,244, 31,188, 90,232,232,199,253,114,197, 14, 29,155,197, 50,188, 74,203,
-194, 6,127, 64, 82,137, 14,146, 26, 3, 16, 41,247, 48,103, 58, 13,137,250,234,243,207, 63, 91,190,108, 89,115,169, 84,218,193,
-104, 54, 7, 88,173, 86,192,106,141,209,168,213, 55,136,209,248, 64, 31,188,104,173,208,206,131, 84,122, 94, 66,251,186, 74,199,
-248, 35,205,119,239,220, 57,243,240,225,195,127,216,118, 39,189,126,147,198,190,238,229,202,108,123,201,117,116,192,111,144,201,
-126, 43, 47,116, 73,231, 58,172, 28, 28,171,117,178,131,131,195,158, 46, 93,186, 8,187,118,237,138, 62,125,250,160,117,235,214,
-176, 90,173, 32,132, 64,169, 84,226,208,161, 67, 88,189,122,117, 76, 13, 96, 89, 69,122,122,224,138,224,236,217, 94,141, 26, 53,
-218, 85,158,129, 41, 52, 89, 21,230, 36,150,127,110, 10, 98,204,118,253, 18,134, 79, 95,233,111, 80,164,219, 59,137,205,238,145,
-207,158,178, 42,127,110, 6, 42, 45,225,135, 90, 12, 30, 56,112, 58,155,195,105, 87,216, 3,146,188,120,254, 60,172,104, 82,105,
- 4,127,120,169,138,117,169,104,236, 58,154,248, 78,161, 80,254,237, 70,171, 15, 10,242,181,138,167,228, 41,115,174,195,162,168,
- 15,135,195,145,197,158,152, 50,178, 60,117, 46,208,165, 48,146,133, 10,231, 58, 44,252, 63, 1, 80, 66,175,255,250,141,193, 72,
- 75,244, 46,228,190,181,126, 85,134, 69,204, 3,162, 96,214,135, 64,246, 28, 56, 53,173, 64,175,249,242,185, 37,183,169,204,155,
-236, 27,191,203,203,213, 1,183,160, 82,221,130, 74, 85,106,210, 46,151,195,203,173,168,156,111,111,123, 18,160,120,223,109,127,
- 91,179, 66,243,240, 30,251,243,191, 70,106,118,246, 9, 0,210,106,161,161,110,231, 67, 67,135,126, 54,123,246, 96, 15, 79,207,
- 90,206,206,206, 14, 54, 54, 54,172,123,247,238,197,153,117,186, 77,141,129,221,133,209,212, 10,209, 3, 87, 2,147,146,234,127,
- 48,112,224,116,134,195,105, 91,210,192, 16,179,249,142, 31,176,165,188, 72,214,187,158,155,222, 2,143, 46,133,145, 44,176,129,
- 73,149,169, 27, 41, 5,229, 88, 1,179,121, 5, 34, 34, 74,169,243, 85,174, 75,203, 25,134, 81,130, 38,190, 83, 40,148,127, 47,
- 69,243, 29,158,249,255,254,225,174, 84,147,106,254,139, 52,217, 40,232, 69, 71,247, 39,213,164,154, 84,147,106, 82,202,165,104,
-174, 67, 14,221, 21, 20, 74,165,177,224,247,102, 48, 10,133, 66,161, 80,138, 40,202,205, 42,201,118,160, 32,117,167, 44, 87, 90,
-149,222, 4,239,226,108, 47, 83, 77,170, 73, 53,169, 38,213,164,154, 84,243, 63,167, 89,145,246, 63,177, 55, 99, 81, 78, 86,113,
-110, 86,101,103,183,121, 95,104, 88,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255,118, 60, 10, 77, 86,241,171,168,233,144,
- 69,247, 13,133, 66,161, 0, 75,150,128, 69, 8, 24, 66,150,176, 8, 57,204, 38,100, 8,155, 16,188,215, 84, 32, 67,134,148, 62,
-152,237,199, 35, 29,108,232, 30,167, 80,254, 85,164,163,140, 73,165,105,142,214,255, 22, 31,119,119,247,109, 0,152,140,140,140,
-201, 0,146,232, 46,249,251,225,232,232,216,197,108, 54, 67,161, 80, 92,249, 55,110, 95,189, 90, 24, 72, 88,168, 91,252, 6, 65,
-210,139, 87,216, 83,218,186,117,253, 49, 6,204,239, 99,113, 49, 86,188,120,254, 26,199,171,240,115,172, 94, 93,189,183, 0,192,
-185,203,201,211,241,215,140,171, 85,219,197,197,229, 2,135,195,225, 88, 44,150,105, 50,153, 44,180,108, 35, 52,132, 13, 0, 92,
-114,109,190, 60,195,117,222,167, 83, 25,174, 70,191, 83,174,215,170,243,217, 92,118,188,128,235,126,123,202,120,214,185, 60, 85,
-171,231,165,125,255,200,145, 35,101,206,226, 93,223, 31,189, 88,150,122,125,131, 27,196,197,126,183,177,249,134, 14,126,206,220,
-184,228,199,210,111,183,230,111,227,219,251,246, 29, 51,148, 9,229,136,153,209, 59,119,230,168,232, 89, 86,121, 86, 2,142, 70,
- 32,136, 43, 16,120, 91,204,102, 55, 6, 32,108, 14, 39,211,164,215, 39,243,128,136,249,128,252,223,174,201, 19, 8,170, 89,204,
-102, 55, 0,248, 59,150,147,242, 38,101, 26, 45,169, 84,250,136,197, 98, 85, 43, 57, 25,110,209,124,130, 69,239,149,252,140, 97,
- 24, 88, 44,150,148,188,188,188,166, 85,248,125, 91, 0, 67, 1, 20,117, 81,223, 15,224, 16,222, 61,225,216,150,199,227,205,145,
- 72, 36,157,181, 90,109,125, 0, 16,137, 68,145,106,181,250,170,209,104,252,238, 29,117, 57, 0, 62,144, 74,165,157, 88, 44, 86,
- 39, 66, 8, 67, 8,185,166, 82,169,174, 2, 56, 12,224, 93, 70, 74, 16,185,186,186,174,112,116,116, 28, 49,127,254,252, 28, 39,
- 39,167,192, 89,179,102, 61,204,205,205,253, 53, 59, 59,123, 1,170, 48, 71,221, 95, 76, 45,119,119,247,253, 92, 46,151,157,156,
-156,220, 9, 0,188,189,189,175, 25, 12, 6,139, 76, 38, 27, 9,224,117, 21,245, 36, 0, 90, 74,165,210,166, 82,169,180,189,197,
- 98,169, 91, 56, 63,227, 11,149, 74,117,211,104, 52, 62, 2,112, 15,128,250,111,116,142,216,112, 56,156,189,133,117, 61, 0,128,
-242,223,118, 17, 32, 44,212,125, 30,249, 50,176,216,120,213,175, 83,246,202, 12,124, 74, 89,183,210, 70,171,115, 7,143,190,253,
-250,117, 99, 1,128,193,116,174,239,213, 27,233, 39,255,108,147, 53,104,208,160,223,246,238,221,235,160,215,235, 49,121,242,228,
-253,151, 47, 95,222,162, 80, 40,230,151,123,225,144, 58,204, 90,179,254,162,152, 97, 88, 0,224,106,181, 90, 92, 83, 83, 95, 7,
- 60,127,246, 91,207,200,200,187, 43,181, 47,175,222,179, 50,220, 41, 70,180,123, 89,153, 66,212,245, 67, 72,223,193, 3,251, 44,
- 91,182, 4, 35,134,141,168, 30, 25,169, 19,121,217,198,242,115,181, 18,127, 39, 23,215,126,203,150, 31, 97,110,223, 58,209,111,
-239,174,165, 87,199,143,119,234, 76,205, 86,165, 96,150,115, 56, 45,237,252,253,219, 15, 59,113, 2, 82,111,111, 14, 71, 32, 96,
- 1,128, 89,175,247, 86, 37, 39,123, 28,236,215,175,197,146,232,232,235, 75,128,251, 84,243,127,162, 73,169,138,209, 98,177, 88,
-213, 82, 83, 83, 93, 37, 18, 73,193,197,152, 16, 88, 44, 22, 88, 44,150,226,201,139, 9, 33,197,127,205,102, 51,234,212,169, 83,
-169, 39, 90, 0,157, 1,140,235,216,177,227,144,239,190,251,142, 27, 20, 20, 84, 52,101, 72,187, 47,191,252,242,251,240,240,240,
-163, 0,118,163, 96,240,198,202, 62,241,246,144, 72, 36,251,214,172, 89, 99,219,173, 91, 55,142,167,167, 39, 24,134, 65, 70, 70,
- 70,203,203,151, 47, 55,157, 53,107,214, 52,181, 90, 61, 10,192,133, 42,236,159, 6, 54, 54, 54, 71, 6, 14, 28, 88,173, 67,135,
- 14,194,122,245,234,193, 98,177,224,241,227,199,227, 31, 61,122, 52,252,232,209,163,139,149, 74,229, 16, 84,126,190, 54, 70, 42,
-149,142,181,181,181, 93,177,104,209, 34,199, 81,163, 70,241,159, 61,123,150,231,231,231,199,220,190,125,219,229,208,161, 67,211,
- 86,173, 90,245,129, 66,161, 88,160, 82,169,126, 65, 37,230, 80,180,177,177,121,196, 98,177,170, 85,198, 8, 3,168,138, 25,110,
- 92,163, 70,141, 67,183,110,221,170,145,144,144, 96, 25, 48, 96,192, 30, 0,184,122,245,106,144,201,100, 98,186,119,239,126, 46,
- 37, 37,101, 40,128,199,149,220,246,134,142,142,142, 39, 71,140, 24,225, 88,171, 86, 45,113,141, 26, 53, 24,137, 68, 2, 54,155,
-141,252,252,124,207,103,207,158,117,189,127,255,190,246,242,229,203,185,122,189,190, 31,128,136, 42, 28,167,214,174,174,174,163,
-185, 92,110, 3,179,217,236, 5, 0, 28, 14, 39,213,100, 50, 61,147,201,100,123, 1,252,246,174, 39,136,155,155,219,230, 21, 43,
- 86, 56,203,100, 50,178,106,213,170,205, 74,165,114,236,191,245, 98,176,255,215,195,120,244,240, 62, 80, 48,109, 14, 83, 74,253,
- 99, 0,240, 62,253,116, 54,154, 54,107,129,145, 35, 62,168, 80,179,119,151,106,107,184,124,158,147, 78,167,251, 45, 95,163, 63,
- 44, 17, 11,135,142, 24, 30, 18, 3, 0,231,206, 95, 31,218,188,185,195, 53, 59,177,224, 3,161, 80,216,218,100, 48,230,156,189,
-146,242,121, 85, 76,149,151,151,215, 5, 7, 7, 7,113,110,110,110, 70, 86, 86,214,143,125,251,246, 93,190,123,247,110,135,184,
-184, 56, 36, 39, 39,227,147, 79, 62,145,166,164,164, 76,143,136,136,184,107, 48, 24,202,140,108, 41,149,185, 27,191,156,215,127,
-145,157,157, 51, 91, 34,182,133,141,157, 35,252,106, 53, 66,203,214,125,209,171,207, 4,188,138, 9,111,185,123,215,178,240,212,
-212,203,223, 72, 29,107, 46,151,203,107,148,121, 93,170, 87, 27, 29,250, 13, 44, 48, 89,139, 22, 45, 65,244,203,151,202,132,120,
-214,199,103, 78,112,196,189,186,212, 17,152, 13, 25, 9,183,111,157,168,209,182,221, 0, 0,104,186,119,215,210,171, 31,143,116,
-232,178,121,127,158,146,222,146,202,190,118, 46,227,114,199,246, 88,191,222, 53,120,218, 52,158, 42, 62,222, 24,187,117,171, 38,
-243,230, 77, 11, 71, 32, 32,222, 61,123, 50, 46,157, 58, 9,167,189,120,193,187,179,106, 85,123,238,210,165,126, 11,140,198,125,
- 84,243,255, 85,243,191, 78, 81, 18,124,201,222,135,219,203, 53, 90, 12,195, 64, 34,145,224,224,193,131,224,114,185,224,112, 56,
-224,114,185,101,254,239,227,227, 83,153,130, 12,114,119,119,255,126,203,150, 45,110, 61,122,244,128, 80, 40, 44,254,128,205,102,
-163, 91,183,110,232,218,181, 43, 55, 45, 45,109,248,193,131, 7,135,175, 92,185, 50, 83, 46,151,207, 64,225,196,208,229,208, 41,
- 48, 48,240,216,197,139, 23, 69, 58,157, 14, 55,111,222, 68, 94, 94, 30,248,124, 62,170, 85,171,134,238,221,187,115, 94,190,124,
-233,216,173, 91,183, 99,209,209,209, 33, 0,174, 85,162,172, 77, 93, 93, 93,111, 28, 62,124, 88,216,168, 81, 35,230,213,171, 87,
- 8, 14, 14, 6, 0,228,231,231, 99,192,128, 1,194, 81,163, 70,213, 26, 62,124,248, 61,153, 76,214, 1,192,163, 10,244,154,184,
-187,187,255, 50,112,224, 64,207,149, 43, 87,218,218,216,216, 32, 33, 33, 33,221,221,221, 61,160,104,127, 15, 31, 62,156,223,183,
-111, 95,143,213,171, 87,111, 60,114,228,200,231, 50,153,108, 44,128,176,114, 93,107,161, 33, 22,139,197,200,204,204,196,254,253,
-251, 49,125,250,116,176,217,108,200,100, 50, 28, 58,116, 8, 31,127,252,113,145,161,169,148, 25, 22,139,197, 93,253,253,253,127,
-190,122,245,106, 53,123,123,123,120,122,122,178,190,250,234,171, 6,126,126,126,162,234,213,171,179,211,211,211,113,236,216, 49,
-191,209,163, 71,159, 76, 74, 74, 26,175,215,235, 43,108, 82,115,115,115,219,121,230,204, 25,159,200,200, 72,108,221,186, 21,185,
-185,185,224,243,249,176,183,183,135,187,187, 59, 2, 2, 2,152,121,243,230,137,251,246,237, 43,158, 49, 99,198, 78,131,193,208,
-184, 18,199,168,145,171,171,235,182, 78,157, 58,249, 45, 93,186,212,222,221,221, 29, 69, 15, 6,249,249,249,213, 18, 18, 18, 90,
- 46, 90,180,104,200,163, 71,143,226,100, 50,217, 20, 0, 79,170,120,226, 52,174, 87,175, 94,200,128, 1, 3,216,233,233,233,216,
-187,119,111,136, 82,169,108, 92, 5,115,249,143,226,209,195,251,152,252,209, 39, 42, 79,111,111,222,197, 11, 63, 15, 58,114,188,
-246, 67,123, 81,193,132,212,114, 45,140, 67, 6, 70, 55,235,222, 99, 2,175,119,159, 1,170,237, 63,108,148, 86,198,104,113,249,
- 60,167,253,251,214, 37,221,186,253,168,193,165,203,247,123, 14,234,215,143,240,120,246,126, 0,240,249,172, 79,185,199, 78,157,
-218,213,173,107,139,180,118,109,155, 38,141, 28, 53,219,167, 10,197,173, 93,187,118,237,235,225,225,225,110, 2,129, 0,185,185,
-185, 78,219,183,111, 95,215,182,109, 91, 86,108,108, 44, 94,190,124,137,248,248,120,228,231,231,163, 91,183,110,210,176,176,176,
- 31, 1,148,105,180,140,172,206, 43, 60,171,155, 54, 57,137, 36, 53,140, 22,133, 43, 49,165,215,187,116,230, 82,195, 3,123,181,
-193,110, 30,117, 2,198,125,184, 24,203,150, 31,229,254,186,255,219, 69, 87, 46, 31, 0, 88, 53,202,158, 17,128,160,245,151, 11,
-230, 67,161,212, 99,212,136, 73, 24, 61, 98,146, 19,129,193,131, 88,116, 18,131, 54,207,222,134,247, 34,116,203,142,117, 3, 1,
- 84, 43, 97,182,174, 80,179, 85, 54,203, 56,156, 22, 33,223,127,239,210, 96,226, 68,193,147,165, 75,213,217, 55,111,106,253,123,
-247,206, 11,158, 58, 85, 15, 0,202,248,120, 94,244,226,197, 98,151,246,237, 69,173,230,204,113,176, 24, 12,238,203,150, 45,107,
-190,168, 96,242,242, 42,105,250, 12, 29,106, 89,180,107, 87,179,155,179,103,119,100, 76, 38,118,207, 86,173, 30,175,218,187, 55,
-245,125, 52,255,204,114,166,221,184,161,207,245,243, 67,240,128, 1, 57, 62,174,174,250, 63,115,219,223,167,156,148, 98,138,114,
-181, 38,151,124, 66, 69,104,104,104, 7, 0,215, 1, 44, 13, 9, 9, 89, 2, 0,118,118,118,153,114,185,220,245,216,177, 99, 21,
-154, 44, 46,151, 11, 15, 15, 15, 4, 4, 4,200,100, 50,153, 91, 57, 5, 72,182, 90,173,213, 8, 33,197,209,151,178,208,235,245,
-136,137,137, 65,195,134, 13, 83, 80, 48, 17,109,153, 65, 29,177, 88, 28,251,242,229, 75,231,231,207,159,227,209,163, 71,240,243,
-243,131,131,131, 3,184, 92, 46, 76, 38, 19, 20, 10, 5, 2, 3, 3, 33, 16, 8,208,164, 73,147,108,181, 90,237, 87, 65, 19,144,
- 64, 34,145,196,220,184,113,195, 59, 56, 56, 24, 15, 30, 60,128,183,183, 55,220,221,221, 1, 0,241,241,241,184,125,251, 54,122,
-247,238,141,240,240,112, 12, 30, 60, 56, 89,173, 86, 7, 0,208,151, 37,232,232,232,152,126,245,234,213,148,160,160, 32,157, 90,
-173,102,101,102,102,114,111,222,188,105, 86, 42,149,210,252,252,124,174, 92, 46,231, 42, 20, 10,142, 90,173,230,178, 88, 44,158,
- 86,171,229, 94,185,114,133,109, 52, 26,203, 29, 32,179,232, 56,157, 58,117, 10, 65, 65, 65, 56,118,236, 24, 62,251,236, 51,220,
-185,115, 7,222,222,222, 56,124,248, 48,230,204,153,131,168,168, 40, 56, 59, 59,163, 94,189,122, 21, 29, 35,212,170, 85,235,213,
-211,167, 79,107,241,120,188,162,121, 29,139,230,203, 67, 86, 86, 22, 94,191,126,141,212,212, 84,248,251,251, 99,196,136, 17,175,
- 83, 83, 83,253, 43,170,121, 94, 94, 94, 89,145,145,145,206, 13, 27, 54, 68,102,102, 38,236,237,237, 97,103,103, 7,123,123,251,
-226,255,253,252,252, 48,123,246,108,184,187,187,203,116, 58,157, 91, 69, 38, 40, 40, 40,232,194,149, 43, 87,156,109,109,109,145,
-145,145, 1,133, 66, 1, 14,135, 3,177, 88, 12,103,103,231, 98, 35, 31, 19, 19,131, 62,125,250,100,199,198,198,246,168,130, 73,
- 98,185,185,185,189,140,136,136, 8, 32,132, 32, 41, 41, 9, 81, 81, 81,248,232,163,143, 98,116, 58, 93, 29,252,139,230,236, 43,
-145,119,197, 27,251,225,100,222,192,254,173, 13, 47, 34, 67, 25,129, 53, 10,141, 27,216,230, 3,192,227,103, 10, 59, 61, 43, 16,
-117,235,135,144,227, 39,127,227,255,178,123, 59, 23, 86,184,129, 65,212,139, 24,124, 93,150,118,247, 78, 30, 19, 63,253,116,124,
-131,142,109, 59,176,148,106,181,235,143, 63,174,111, 18, 27,251,194, 21, 0,252,252,234,202,166, 77,155, 21,102, 35,145,200,174,
-223,190, 97,221,176, 97,231,179,139,215,210,119, 84,162,200,126, 1, 1, 1,119, 79,157, 58,229,236,234,234, 10, 59, 59, 59,168,
-213,106, 24,141, 70, 60,127,254, 92,119,240,224, 65,147,173,173,173, 77, 70, 70, 6,228,114, 57, 24,134,193,169, 83,167,146, 0,
-248,190, 45, 84,148,163, 5, 0, 31,245,170,203,173,215, 57,192,129, 39, 48,139, 68,220,104, 15, 48, 22, 1, 67,164,110,231, 46,
- 60,110,120,238,210,131,145, 3, 7,125,230,210,174,195, 64, 44, 90, 56,196,148,150,150, 20,108, 68,187,151,165,229,104,213,241,
- 71,231, 1,131, 7,126,176,108,217, 18, 44, 89,180, 20,161,167, 78,228, 75, 37, 44,189,173, 61,215,174,125,203, 54,186,217,211,
-251, 39,171, 84,105,222,203, 86, 31, 28,209,167,255,236,106,109,219, 13,192,237, 91, 39,176,119,215,210, 71,140,136,208,102,196,
-183, 88, 2, 56,216,251,249, 77,153, 25, 19,195,123,178,100,137,202,156,150,150,215,116,214,172,236,210,214, 77,185,116, 73,194,
-247,244,180,117,232,215,207,113,163,175, 47, 49,201,100,219, 74,203, 49, 42, 77,243,178, 84,106,127,224,220,185, 46,132,203,237,
-240,197,220,185,162,144,144, 16, 40, 20, 10, 28, 61,122, 20,219,182,110,213,123,120,120, 60,245,124,246, 44,188,129, 66,177,176,
-178,154, 77,103,205,202,182, 88, 44,204, 7,115,230,116,139,140,143,239,156, 33,147, 85, 7, 0, 15, 71,199,228,166,126,126,143,
-118,134,134, 70,109,174, 81,195, 90,217,114,254,116,254,188,219,145,132,132,137,142,142,142,162, 76,153,140, 35,224,243,115, 90,
-214,171,119,248,135, 5, 11,174,155, 35, 34,120,194,106,213,108,237, 66, 66,170,188,237, 77,103,205,202,206, 85, 42, 57, 51,151,
- 47,111,147,152,153, 89, 93,165,215,251,203,149, 74,119,139,201,196,178, 21,139,115,106, 6, 6,202,180, 55,111,166,215,212,104,
- 62,217, 1,200,254,170, 99, 93,154, 23,249, 7,241,246, 56, 90,103, 8, 33,111,204,117,120, 61, 36, 36,228, 15,189,107, 8, 33,
-149,138,102,113,185,220, 55,154,169,202,129,199, 48, 12,194,194,194,224,228,228, 4,119,119,119, 8, 4,111, 78, 62,152,149,149,
-133, 59,119,238,224,197,139, 23,104,212,168, 81, 81, 51, 70,217,142, 72, 32,248,116,245,234,213,246, 6,131, 1,143, 30, 61, 66,
-211,166, 77, 33, 16, 8,192,227,241,222, 48,129, 50,153, 12,245,235,215,199, 23, 95,124, 97,183,114,229,202, 79,245,122,125,153,
- 79,164, 28, 14,103,198,164, 73,147, 92,139, 34, 88,201,201,201,104,210,164, 73,241,231, 46, 46, 46,120,252,248, 49,154, 54,109,
-138,106,213,170, 97,200,144, 33,174,123,247,238,157, 97, 54,155,191, 43, 75,147,207,231,179,130,130,130,154, 1,128, 68, 34, 1,
-139,197,138,182,181,181,117,113,115,115,147,216,218,218,254, 97, 27,119,237,218, 37,103,177, 88,166, 10,221, 0,139,133,140,140,
- 12, 52,104,208, 0,249,249,249, 0, 0,181, 90, 13,127,127,127, 40, 20,138, 98,211,234,233,233, 9,173,182,252,212,175,134, 13,
- 27, 46,169, 83,167, 78,119,137, 68, 34,224,114,185,120,242,228, 9,130,131,131,113,240,224, 65,248,248,248, 64, 44, 22, 35, 38,
- 38, 6, 65, 65, 65,184,113,227, 6, 92, 92, 92, 80,191,126,125,129,171,171,235,173,220,220,220,107,137,137,137, 75,202, 41, 39,
- 75, 42,149,226,198,141, 27,216,185,115, 39,226,227,227,145,150,150, 6, 27, 27, 27, 52,110,220, 24,245,234,213, 67,235,214,173,
- 17, 19, 19, 3,166,226,202,228, 30, 16, 16, 16,250,224,193, 3,103, 66, 8,246,238,221, 11,149, 74, 5,131,193, 0, 22,139, 5,
-161, 80, 8, 7, 7, 7,116,238,220, 25, 46, 46, 46, 8, 8, 8,192,161, 67,135,156,123,245,234,117, 86, 38,147, 53, 6,144, 81,
-209,126,117,112,112,248,100,241,226,197,222,174,174,174, 72, 72, 72, 64,126,126, 62,220,220,220,208,177, 99, 71,175,203,151, 47,
-127, 98, 50,153,214,255, 91,110,100, 37, 18,223,153,139, 23,126, 30, 20, 80, 51, 47,168, 81,160,216,251, 88,168,155,247,193, 80,
- 89,125, 0,104, 80,215, 45,114, 80,136, 56,249, 73,100,104,242,197, 11, 39, 30,189,136,198, 49, 84,162,105, 59, 95,163, 63,124,
-233,242,253,158,193,141,154, 88, 87,127, 59,167,207,244,143, 38, 10, 92,221, 38, 32, 51,233, 4, 46, 95, 13,243,153,243,217, 36,
-151,239,214,254,116,238,210,229,251,172,124,141,126, 97,229, 66, 89, 62,155,119,255,208,218, 89,153,125, 4,175, 94,242, 33,178,
-105, 0, 63,191,218, 80, 40, 20, 16, 10,133,194, 17, 35, 70, 88,230,207,159,175,177,181,181, 21, 51, 12,131,107,215,174,201, 0,
-244,168, 72, 87,231,234, 64, 44, 70,147,153,240,217, 86,194,216,104, 25, 75, 46,255,217,243, 56,116,239,218, 41,179,109,139, 6,
- 43,231, 47, 91,251,101, 64,237, 96,151,241, 19,151,114,151, 47, 25,185, 21, 12,218,149,166,243,242, 21,174, 50,135,143,139, 0,
-244, 89,246,245, 18,196,198,198, 56, 76, 30, 39, 95,202, 17,136, 60,235,248,182,177,217,186,243, 90, 79,127,255, 26,213,103,207,
- 24,114,102,221,247,235,250,148,140,108,237,222,181,248, 36,128, 46,149,217,183,255, 33, 26,142, 14, 13,133, 42, 41,201,148,123,
-235,150,174,203,247,223,103,123,247,232,177,222, 96, 52, 58, 23, 93, 42, 88, 12, 3,166, 40,117,194,106,101, 56, 95,124,193, 34,
- 28, 14, 76, 14, 14,227,144,151, 87,187, 34,205,207,210,211, 7,141,156, 56,177,207,201,243,231, 81,163, 70,141,226,251,153,189,
-189, 61,230,204,153,131, 89,179,102, 9, 30, 63,126,220,252,200,145, 35,205,191, 91,179,198, 13,192,160,202,148,243,226,189,123,
- 14, 83,151, 45, 91,208,168,105, 83,159, 61,251,247, 11,106,213,170, 5, 0,120,253,250,117,192,183,171, 86,249, 54, 8, 10,202,
- 92,249,233,167,187, 35,231,207,175, 15,224, 86,121,154, 25, 55,111, 26,142, 36, 36, 76,188,122,237,154,125,131, 6, 13, 0, 0,
- 81, 81, 81,174, 27, 55,110,156, 84,127,200,144, 81,203,166, 77, 91, 24,162,211,201,109,179,178, 4, 33,155, 55,115, 14,124,240,
- 65,133,154, 69,229, 4,128,142,227,199,127,218,174, 83,167,122,131, 38, 78,116,244,241,241, 97,164, 82, 41,140, 70, 35,210,210,
-210, 28, 34, 35, 35,107,133, 42,149,138,227,247,238,237,133,197,210,237, 47, 60,214,165,122,145,127, 88, 36,235,143,158,162,240,
-111,199,208,208, 80, 2,160, 99, 72, 72,200,141,162, 27,184,197, 98,169,148,201,226,112, 56, 96, 24,166,178,102, 11,132, 16,100,
-103,103, 35, 59, 59,187,184,233, 72, 38,147,225,234,213,171,136,137,137, 1,151,203, 5,143,199,131,209, 88,241, 28,180, 18,137,
-164,107,215,174, 93, 57,247,238,221,131,159,159, 31, 68, 34, 81,113,185,138, 94, 60, 30, 15, 30, 30, 30, 80, 40, 20,232,210,165,
- 11,119,211,166, 77, 93,203, 51, 90,118,118,118,189,135, 14, 29,202, 47, 90, 86,169, 84, 96,179,217,197,166, 69,165, 82, 33, 55,
- 55, 23,114,185, 28, 58,157, 14,173, 90,181,226,135,134,134,246,206,201,201,249,174, 50,219,175,209,104, 84, 50,153,204,190, 93,
-187,118, 14,187,119,239,142,106,213,170, 85,224, 27, 53,237,250,117,157, 78,167,227,178, 88,172, 74,205,163,183,111,223,190,226,
-125,159,154,154,138,173, 91,183, 22,127, 22, 19, 19,131, 77,155, 54, 21, 79, 5, 80,222, 49,170, 83,167, 78,175,189,123,247, 54,
-221,179,103, 79, 30,155,205, 70, 84, 84, 20,246,239,223, 15, 66, 8, 92, 92, 92,160,209,104,144,153,153,137,107,215,174,193,108,
- 54, 67, 42,149,194,203,203, 75, 56, 99,198,140,182, 75,151, 46,229,150,103,180, 44, 22,139,133,205,102,195,215,215, 23,139, 22,
- 45,130, 78,167, 3,143, 87,224, 47, 21, 10, 5,228,114, 57,194,195,195,145,144,144, 0, 82,193, 40,111, 66,161,112,200,158, 61,
-123, 92,249,124, 62,180, 90, 45,148, 74, 37,146,147,147,145,152,152,168,147,201,100,102, 27, 27, 27,150,175,175, 47, 75, 32, 16,
- 8, 6, 12, 24,192, 20, 25,206,144,144, 16,167,189,123,247, 14, 51, 24, 12, 21,153, 36, 23,119,119,247, 47, 39, 77,154, 36, 44,
- 89,103, 51, 50, 50, 48,104,208, 32,241,111,191,253, 54, 95,161, 80,236, 7,144,245, 47,187,161,145, 35,199,107, 63,124,116, 57,
- 42,232, 88,168,155,119, 98,138,165,205,156,207,215,114, 0, 96,251,182,111,218, 28, 11, 77,189, 83,167, 70,102,242,145,227,181,
- 31, 58, 56,188,168,200, 8,176, 58,119,240,232, 43, 17, 11,135, 14,234,215,143,252,248,227,250, 38,211, 63,154, 40,240,173, 61,
-167, 32,194,201,117, 69, 23,243,215,140, 70,251, 90,248,227,143,235,155, 12,234, 55, 56, 60, 62, 62, 97, 91,231, 14,130, 67, 87,
-111,164,159, 46, 47, 98,232,234, 36,244, 18, 11,212,240,242,171,135,192,186, 18, 60,126, 18,133,163,135,239,162,110,253,150,208,
-235,245, 48,155,205,146,190,125,251,106, 14, 30, 60,168,139,142,142, 86,106,181,218, 14, 0,162, 43,218,248,148,148,231,214, 64,
-247,150, 70,158, 72, 96, 86,230,243, 52,243, 22, 30,249,160, 73,139,238, 77, 29, 60,188,184, 46, 18,235,233, 94,221,154,239,223,
-185, 99,209,172,133,139,247,163, 89,243,238,173, 94, 68,221,170, 7,224,105,169,230, 53, 22,161,172,163,199,205,177,175, 94,245,
- 73, 76, 72, 72,169,237,230,110,120, 45, 39,166, 79,230,253,212,173, 93,135, 33, 13,107,213,109,207,127,241,252, 6,179,232,139,
- 97,191, 46, 91,189,110, 68,145,217,186,114,233,215, 14,227,198,221,229,239,222, 93,118,116,252,191, 6, 79, 32,168, 38,245,245,
-229,196,239,222,173,245,235,219, 55, 15, 0, 12, 70,163,115,124, 66,130,157, 88, 44, 6, 33, 4, 38,147,233,141, 28,226,162,188,
-225, 6,129,129,110,149,209,140,255,234,171,134, 95,124,241, 5, 50, 50, 50, 96, 54,155,193,229,114,223,190,102, 67,173, 86, 99,
-220,184,113,216,188,102, 77,203,202,104, 90, 44, 22,102,234,178,101, 11,230, 46, 88, 80,107,202,148, 41,172,146,215, 94, 71, 71,
- 71, 28, 57,122,148,191,101,203,150,106, 95,110,222, 60,110,164, 64, 16, 11,189,190, 92,205,108,127,127, 56,102,102,138,138, 76,
- 22, 0, 4, 6, 6, 98,235,214,173,130, 9, 19, 38,240,251,246,237,187,246,113,163, 70, 27,215,183,109,251,202,169,118,109, 91,
-190, 64, 80,173, 34,205,162,253, 9, 0, 74,157,174,193,250,141, 27, 29,238,223,191,143,204,204, 76,100,100, 20, 60,143, 50, 12,
-131,102,205,154, 49,163, 71,143,182,171,233,237,221, 28, 22,203, 95,121,184,255,224, 69,254, 65, 76, 46,229,189,223,115,180, 10,
- 55,136, 41,220, 64,166,196,205,241, 13,195, 82,145,209,122, 23,228,114, 57,228,114, 57,118,236,216, 1, 30,143, 87,124,243, 5,
- 0,131,193, 80, 25,211, 18,228,233,233,137,252,252,124,212,174, 93,251,141, 72, 22,143,199, 3,135,195, 1,143,199,131, 64, 32,
-128, 94,175,135,143,143, 15, 52, 26, 77, 80,121,154, 90,173,182,177,163,163, 99,241, 13, 86, 95, 88, 89,245,122,125,113,121, 13,
- 6, 3,242,242,242,160, 82,169,160, 84, 42,161, 86,171,131, 43,179,189, 86,171, 21,207,158, 61,123, 29, 24, 24,216,152,205,102,
- 67, 42,149, 74,212,106,117,113,110, 81,110,110, 46,126,249,229, 23,245,152, 49, 99,156, 79,157, 58, 85,161,209, 98, 24, 6, 31,
-127,252, 49, 4, 2, 1, 52, 26, 13,126,252,241, 71,204,156, 57, 19, 60, 30, 15, 74,165, 18, 91,183,110,197,236,217,179,193,225,
-112, 96, 48, 24,176,113,227,198, 50,181,158, 63,127, 30,127,239,222,189,224, 38, 77,154, 56, 28, 63,126, 60,171, 91,183,110, 46,
- 61,122,244,128, 72, 36,130, 86,171,133,201,100, 66,203,150, 45, 81,167, 78, 29,200,100, 50,156, 59,119, 46, 59, 32, 32,192,249,
-254,253,251,214,140,140,140,196, 10,204, 53, 41, 17, 49,132,197, 98, 65,102,102, 38,228,114, 57,178,178,178,144,150,150,134,148,
-148, 20,112, 56,156, 10, 71,211,117,114,114, 26,220,160, 65, 3, 54, 0,136, 68, 34, 52,110,220, 24, 11, 22, 44, 48,107,181,218,
-161, 0,206, 21,174,214,235,167,159,126, 58,126,251,246,109,142,167,167, 39, 94,190,124, 9, 23, 23, 23,142, 80, 40,172,208,104,
-185,187,187,239, 58,125,250,180, 99,145,185, 46,218,207, 26, 77,193,225, 24, 52,104,144,227,158, 61,123,118,153,205,230,222,255,
-182,155,154,189, 8,188,198, 13,108,243, 15,134,202,234,207,249,124, 45,167, 78,131,130,135,215,201, 83,192,249,110,205,103,245,
- 71,245,183, 61, 99, 47, 82,240, 42,210,233,213,213,123, 75,191,126,221, 88, 35,134,135,196,240,120,246,126,219,182, 47,117,117,
-117,155, 80,194,134,217,194,201,217, 22,126,190,124,230,200,153, 23,174,243,230,127,173,223,183,103, 93,236,175, 7, 66,123,242,
-185,151,186,159,187,156, 60,173, 44,237,232,215,242, 83, 26,189,176,174, 34, 39,130,113,116,107,131,198,141, 2,225,234,146,135,
-159,118, 29, 68,141,154,205,160,215,235, 97,107,107, 43,182, 88, 44, 70, 54,155,189,175, 50, 38, 11, 0,174, 92,145, 91,235,215,
-151, 27,216, 74,171,121,250,204,239, 6,118,235,213,175, 94,231,206, 93,173, 23, 47,253, 31,123, 87, 29, 31,197,241,190,159,221,
- 61,205,197,229,226, 2, 4, 8, 4,130, 21,105,113,215, 80,164, 88, 11, 5, 74,209,210, 2,133, 34, 69, 75, 5, 41,180, 64,113,
-104, 11, 20,119, 8, 30, 74,112, 13, 18, 15, 36, 16,191,184, 92,114,126, 43,191, 63, 34,223, 4, 34,119,129, 26,191,125, 62,159,
-253,236,221,222,238,115, 51, 59,179, 59,207,188,243,206, 59, 23, 13, 29, 90, 25, 20,253,250,180,204, 56,127,105,211, 83, 69,218,
-243,134, 77,155,117, 68,100,196,149,190, 28,135,112,130,168,220,250, 20,241, 12,231,181,108,228,149,131, 7, 39,177, 26,246,161,
-197,119,223,135,245, 27, 48, 96,108, 64,231, 78,157,217, 75,193,127,234,197,200,142,178,233,216, 62,245,179, 79,251, 29,255,117,
-239,250,222,231,207,253,222,160, 64,153, 24,196,139,172,151, 58,105, 52,237, 34,144, 72,200,172, 43, 87,232,102, 19, 38,232, 74,
-159, 71,153, 76,134,147, 39, 79, 66, 44, 22,151,109, 34,145,168,236,179,139,139, 11,136,146,105,164,166,112, 2,128, 66,161, 64,
-122,122, 58,108,109,109, 33,151,203,145,158,158,142, 91,183,110, 33, 54, 54, 22, 66,161, 16,125,251,246, 5, 89,133,111,243,203,
-156,195,231,204,233,229,223,172,153,247,203, 34, 11, 0, 12, 6, 3,114,115,115, 49,104,208, 32,242,220,185,115,174,231,147,146,
-222, 7,176,183, 58,206, 86, 3, 6,228,100, 28, 57, 82,233,127,191,243,206, 59,196,205,155, 55, 37,125,251,244,153, 53,251,251,
-239, 55,253,178,103, 79, 50, 67,211,174,230,228,157, 36, 73,146, 32, 8,120,121,121, 33, 55, 55, 23, 69, 69,197, 35,216, 86, 86,
- 86,176,183,183,135,209,104, 4,203,113,194,191,178,172,171,210, 34,255, 17,108, 47, 39,184,182,191, 98,209, 42,201, 20, 0,116,
- 45,223,176,176, 44,107,146,200, 18, 10,133, 53,250, 92,153, 98,229,122, 25,166, 8,173,210,180, 74,165,210,178, 7,173,188,192,
- 42, 77, 39, 73,146,160, 40,202,164,144,248, 44,203, 82,133,133,133, 56,122,244, 40,186,116,233, 82, 54, 44, 85, 80, 80,128,252,
-252,124, 20, 20, 20, 64,171,213,226,197,139, 23,184,124,249, 50, 26, 52,104, 0,192,180,224,175,241,241,241, 15,234,214,173,219,
-186,180, 17,239,214,173,155,231,174, 93,187,210,250,247,239,239,206,113, 28, 22, 45, 90,148,253,238,187,239, 58,149,111,228,107,
- 2, 69, 81,184,117,235, 22, 26, 52,104, 0,142,227, 32, 18,137, 16, 19, 19, 3,103,103,103,176, 44, 11,129, 64,128,172,172, 44,
- 88, 91, 87, 31, 35, 49, 60, 60,124,252, 39,159,124,146,102,107,107,219, 60, 39, 39, 71, 33,145, 72, 58, 93,187,118,205,203, 96,
- 48,192,198,198, 6, 54, 54, 54, 56,123,246, 44,236,236,236, 48,115,230,204, 36,141, 70,115,203,210,210,210, 69,163,209, 60, 73,
- 79, 79, 95,100, 78,121,211, 52, 13,149, 74,133,188,188, 60,228,230,230, 66,169, 84, 66,171,213,214,152,198,202,208,169, 83, 39,
- 4, 5, 5, 81, 43, 86,172,248, 53, 62, 62, 30, 0,224,235,235,139,153, 51,103, 82, 30, 30, 30,120,241,226, 5, 30, 60,120, 0,
-131,193, 0,142,227,170,125,120, 5, 2, 65,183,143, 63,254,184,163,183,183, 55, 97, 48, 24,192,178, 44,116, 58, 29, 74, 63, 39,
- 37, 37,193,223,223,159,244,241,241,121, 47, 62, 62,190, 27, 76,155, 88,193, 3, 64, 70,210, 9,120, 8,157, 1,210, 6,156,230,
- 4,114,178,107, 23,197, 37, 51, 51,243,251,185,139,111, 78,248,101,181,193, 37, 69, 1, 52, 10, 24,140,134, 77,122, 96,252, 24,
- 26, 43,126, 60, 10,111,159, 70, 72, 76, 76, 68,183,110,221, 68,105,105,105,159, 20, 21, 21,205, 49,149,251,210,165, 59,204,197,
-179,231,134, 13, 31, 57,182,117,207,158,253,233, 11, 23,206, 34,252,201,133,136, 79, 70,126,144,201,177, 69,132,131,157,197,195,
-152,232,251, 13,155,183,236, 10, 61,205,116, 2,150,173, 6,150,113, 85, 63,239,208,159, 57,227, 70,158, 57,241,251,152, 15, 71,
-143,107,209,163, 71,111,227,133, 75,167,241,224,246,165,199,107, 87, 79,188,186, 98,253,161,110,189,250,126,208, 84,238,114,235,
-108,128,159,238, 83, 47, 71,219,184, 29,187,114,249,202, 82,217,179, 41,149,178, 40,121, 47,146, 4, 1,142,227, 42,136,172,151,
-133, 22, 73,146, 53, 26, 0,202,115,150,111,139, 74, 59,212,219,182,109,131, 68, 34,129, 88, 44,134, 80, 40,172,209,253,162, 60,
-103,196,139, 23,221,119,239,221, 43,169, 76,100,229,228,228, 32, 39, 39, 7, 69, 69, 69, 24, 53,106,148,232,155,251,247,223, 65,
-137,235, 71, 85,156,222,110,110, 58, 75, 11,139,140,200,200, 72,247, 38, 77,154, 84, 72,175, 82,169,132,133,133, 5,246,238,219,
- 39, 10, 28, 48, 96, 90,143,179,103,215,162,134,248, 87,149,229,157, 32, 8, 56, 59, 59,195,222,222, 30, 4, 65,128,166,105,164,
-167,167, 35, 34, 34, 2,247,239,223, 7, 69, 16,244, 95, 89,198,149,105,145,255,160, 85,107,123,165, 67,135, 85,141,137,154, 35,
-180, 40,138,170,181, 85,171, 42,152, 50,116, 40,147,201,194,210,210,210, 58,120,120,120,128,166,233, 50,161,245,242,208, 97,169,
-245,227,209,163, 71,144,201,100, 97, 90,173,182, 90, 78,142,227,222,107,219,182, 45,142, 29, 59,134, 43, 87,174,224,249,243,231,
- 80,171,213,208,233,116,208,104, 52,136,136,136, 0,203,178, 8, 8, 8,128,165,165, 37,100, 50, 89,152, 78, 87,125, 71, 84,165,
- 82, 41,132, 66, 97, 35, 11, 11,139,178, 99,110,110,110,200,201,201, 97,141, 70, 35,118,239,222,173,116,117,117,181,180,176,176,
- 48, 89,184, 18, 4,129,204,204, 76,120,122,122,150,249,104, 21, 22, 22,194,217,217,185, 84, 88, 64,167,211,193,218,218,186,198,
-161, 67, 0,218,103,207,158,205, 46,247,189,205,240,225,195,247, 31, 60,120,176, 94,112,112, 48,238,222,189, 11,185, 92,142, 31,
-126,248,225,121, 66, 66,194,135, 0,238,103,102,190, 89,191, 72, 83,234, 80, 78, 78,206,209,176,176,176,247,218,182,109, 91,246,
-150,232,214,173, 27,209,173, 91, 55,167,242,166,254,172,172, 44,220,187,119, 15,193,193,193, 32, 8, 2, 79,159, 62,101, 52, 26,
-205,254,234, 70, 41, 60, 60, 60,118, 45, 92,184,208,138,166,233,178,186,109, 97, 97, 1,169, 84, 10,145, 72, 4,138,162,144,144,
-144,128, 65,131, 6,217,110,220,184,241,119,157, 78, 87, 31,128, 1,111, 9,242, 53, 48, 60, 10, 87,218, 6,248,187, 68,108,223,
-182,162,195,164,201, 40, 29, 58,164, 3,252,157, 35, 30,133,103,216,182,118,174, 57,191,231,130,147, 63,211, 27,207, 13, 60,119,
- 62,100,196, 87,179,102, 10,125,125,253, 51,131,255, 12,245,238, 65,127, 75, 56, 58,217, 32, 39, 91,137,132,164, 12,196, 39,234,
- 57, 95, 95,255,204, 7,247,194, 36, 63,254,188,174,161, 74,173, 45, 29, 58,172,182,158, 94,191,245,124,240,218, 13,146,171, 99,
- 63,105, 35,182,176,112, 71,110,118, 24,188,189,229, 24, 20,216, 28,191,237,185, 5, 91, 91, 7,184,184,184,128, 36, 73, 75, 83,
-243,158,157,157, 77, 28, 61,112,125,194,199,227, 38,190,219,167,247, 0,250,252,133, 51,130, 43, 23, 79,221,250,125,251,215,199,
- 57, 74, 37, 35,184, 66,139, 58,117, 93,159,196, 61,123,244, 97,247,158,163, 96, 33,178,110, 0, 52,174,180,194,150, 77, 48,224,
-144,116,236,224, 50,233,199,227, 38,181,239,211,231,125,250,194,133, 19,184,112,118,207,157,165, 75,235,156,125,158,186, 79,116,
-251,126,138,116,240,176,169,121, 65,231,162,244, 31, 12,172, 27,235,110,217, 82, 3, 60,231, 85, 85,249,142,164, 64,144, 65,235,
-116, 94,158,125,250, 80,234,196, 68,161,149,139, 11, 13, 0, 70,163,177, 70,161,133, 42,134,160, 95,230, 52, 53, 45,106,181, 26,
-108, 21,177, 19, 95,230, 76,207,204,172, 83,210, 9, 47,131,209,104, 44, 19, 89, 57, 57, 57,200,207,207,135,165,165, 37,178,116,
- 58, 23, 83, 56,123,183,107,183,251,155,101,203,230, 28, 57,122, 84, 84, 94,100,149,110, 66,161, 16,171, 86,175, 22,125,241,213,
- 87, 83,167, 9, 4, 51, 64,211, 38,223,207,210, 78, 59, 69, 81, 16, 8, 4, 72, 76, 76, 68, 82, 82, 18, 18, 19, 19,145,152,152,
- 8, 11, 11, 11,112,127,241, 36,160,255,176,127, 86,169,200, 42,191, 47,179,114, 85, 27,222,193, 28,103,120, 83,133, 1, 99,198,
-248,174, 41, 66, 75,165, 82, 5, 95,190,124,185,221,224,193,131, 5,119,238,220,129,171,171,107,153,208, 42,221,151, 14, 71,201,
-100, 50, 28, 63,126,220,160, 82,169,130,107,120,152, 46,159, 61,123,182,245,146, 37, 75,132,227,199,143, 71,100,100, 36, 38, 79,
-158,140,252,252,124, 40,149, 74,228,228,228, 64,173, 86,163, 93,187,118,144, 74,165,120,242,228,137, 81,173, 86, 95,174,193, 98,
-199,101,102,102, 22,201,229,114,183,151,127, 27, 54,108,152,203,230,205,155,213,209,209,209,198, 14, 29, 58,216,152, 42, 56, 74,
-113,224,192,129, 50, 75, 93,108,108, 44, 54,111,222, 92,230,147, 21, 26, 26,138, 53,107,214,148,197, 62, 51, 19,247,179,179,179,
-105,163,209,136, 6, 13, 26,192,195,195, 3, 90,173, 22,235,214,173,163, 1,220,255,167,106,179, 86,171, 61, 50,118,236,216,121,
- 15, 31, 62,116, 19, 8, 4,197, 38,237,146,252, 25, 12, 6, 60,123,246, 12, 17, 17, 17,136,142,142, 70,110,110,110, 89, 71,224,
-209,163, 71,121, 70,163,241, 80, 85,188,114,185,124,209,111,191,253,230, 42,147,201, 42,212,231, 82,107,104,169,149, 52, 43, 43,
- 11,118,118,118,232,209,163,135,243,229,203,151, 23,233,116,186, 37,111, 73,155, 70, 12, 27, 18,219,230,139,207, 6, 99,104,160,
- 44,249, 88, 80,234,205, 53, 63,206, 46,113,134,119,142, 24, 26,232,145,252, 56,198, 14,195,134,156,104, 3, 32, 5,213, 59,108,
-179,127, 94, 85,156,108,219,214,254,202,177, 83,167,126, 95, 48,119, 86,232,156,217, 19,229,106, 77,156,212,215, 71, 76, 0, 64,
-124,162,158,123, 18,201,106,215,172,157, 21,186, 98,245, 70, 50, 35, 39,127,242,189,123, 85,135, 55, 40, 47, 94, 72, 18, 82,223,
-198, 93,210, 26,250,117,172,123,231,214, 94, 88,201, 52,104,212,184, 13,250,244,126, 15, 87, 66, 30, 33, 61, 75, 11,133, 66, 1,
-157, 78, 87,109,184,132,232, 39,199,199,112, 4,231, 77,112, 68, 18, 65,114,210, 49, 99, 63,237, 52, 96,192,251, 92, 80,208, 41,
-250,196,241,189, 55, 14,253,177,225, 8, 41, 18, 10, 52,122, 91, 61, 65,104, 11, 64,134, 71, 22,169,138, 59, 52, 66,137,168,106,
-243,107, 73, 96,215, 38, 77, 27,187,142, 25, 59,217,182,127,191, 65,220,217,179, 39,216, 67, 7,119, 95, 57,180,179,217, 94,150,
- 84,138, 20,201,106, 73,129,210, 88,192, 17, 98,187, 34, 37,171,206,136,175,175,117, 31, 48,204, 0, 28,225,213, 85,249,118, 64,
-167, 75, 41, 74, 78,118,115,232,210, 69,242,108,217, 50,153, 75,187,118, 90,162,196,135,184, 58,161, 69, 81, 20, 64,146,172, 41,
-156,166,166, 69,163,209,128, 5,140,181,225,164,105,186,130,200, 42, 21, 90,165,207,139, 41,156,219,151, 46,189,227,221,167, 79,
-110, 72, 72,136, 75,215,174, 93,137,194,194, 66, 20, 22, 22, 86, 16, 91,238,238,238, 68,147,128, 0,217,129, 43, 87,124, 77,189,
-159,166,228,157, 36,201,191, 92,104,253,199,177,189, 74,235, 97,117, 87,149, 90,180, 76, 17, 90, 38, 90,180,140, 70,163, 17,206,
-206,206,200,206,206,174,178,225, 39, 73, 18, 22, 22, 22,165, 99,196,213,206,188,211,233,116,235,230,204,153, 51,189, 95,191,126,
- 78,141, 26, 53, 66, 86, 86, 22, 92, 92, 92, 32,149, 74,203,124,199, 74,249, 66, 67, 67,241,219,111,191, 41,117, 58,221,186, 26,
- 56,127, 94,189,122,245,103, 67,135, 14,117,112,117,117,133,189,189, 61,158, 60,121, 2,123,123,123, 40,149, 74,196,196,196,192,
-218,218,186,204,111,231,212,169, 83,133, 58,157,238,231, 26,196, 27,119,237,218, 53,131,181,181,245,147,172,172, 44, 42, 55, 55,
- 87,144,151,151, 39, 80, 42,149,194,130,130, 2,225,249,243,231,157,108,109,109,213,127,254,249,103,150,183,183, 55,245,252,249,
-115,202,104, 52,214,168, 94, 9,130,192,140, 25, 51, 32, 18,137,160,211,233,176,110,221, 58,204,153, 51,167,204, 39,107,245,234,
-213, 88,184,112, 97,153,112,222,177, 99,135, 89, 53,135,227, 56, 24, 12, 6, 24,141, 70, 24,141, 70,147,196,239,235,192, 68,193,
-158,254,244,233,211,192,182,109,219, 94, 60,124,248,176, 99, 73, 76, 50,100,100,100, 32, 35, 35, 3, 89, 89, 89, 40, 42, 42, 2,
- 77,211,240,240,240, 64, 70, 70, 6, 78,156, 56, 81, 80, 88, 88,216, 7,213,204, 56,164, 40,106,108,167, 78,157, 4, 47,167,161,
-180,151, 87, 42,222, 37, 18, 9,210,210,210,208,173, 91, 55,113, 72, 72,200, 88, 0,255,105,161, 85, 62,188, 67,239, 62, 19, 68,
-254, 77,219,235, 31, 71, 4, 37, 55,174,155,145, 60,122,144,205, 25, 0,120, 20,158, 97,251, 56,198, 14,254, 77, 3,185,222,125,
-236, 91,103,164,111,111, 6,192, 80,221,114, 61, 0, 96, 43,147, 12,239,213,179, 93,154,181,165, 37,185,102,237,142,115, 91,182,
-252,252,206,145, 51,255, 11,239,176,102,109,113,120,135, 94, 61,219,177,209, 81,209,195, 1,236, 52, 85,188, 4, 6, 14,124,248,
-219,174,223, 16, 29,241,167,251,188, 25,205,197,185, 25, 70, 88, 88,121,161,117, 75, 23,108,223, 21,134,199,143, 31,167,235,245,
-250,110,213,214,111,130,243,142,136, 12,247,107,214,180,137,235,152,177,147,108, 2, 3, 7, 33, 40,232, 36,254,216,189,243,218,
- 7,163,134,254,154,154,167,164,156,133, 50,145,140, 99,197,148,200, 86, 32,146, 88,100,234,245,197,115, 32,132, 66,169, 13, 48,
-188,218,134,103,202,164,209,182,221,123, 14,194,153,179, 39,241,199,238,237, 87, 23, 55, 29,182,179,110, 43,127,162,221, 59, 63,
- 78,173, 91,175,174,143,170, 40, 67, 73, 18, 98,131, 86,203, 90,255,184, 59,225,167,248,133, 99,227, 1,172, 5, 63,235,176, 60,
-158,252,209,191,127,219, 47,226,226, 68,242,142, 29, 45,210,174, 92,145,149,172, 68, 82,173,208, 18, 8, 4,224,170, 30,234,170,
-192, 73,236,217, 67, 2,168,118, 18,150, 72, 36,130, 90,173,134,177,106, 11,118, 5, 78,183, 11, 23,146,227,226,226, 26, 58, 56,
- 56, 84, 16, 89,185,185,185,101,159,181, 90, 45,212,106, 53, 44, 44, 44, 34, 52,149,143,136, 84,224,204,184,118, 77,187,114,198,
-140, 37, 31,142, 26,181, 33,248,242,101,169,163,163, 35, 10, 10, 10, 42, 8, 45,189, 94,143,238, 61,122,136, 86, 63,124, 56, 6,
- 74,229, 82, 83,238,167, 75,183,110, 53,250, 3, 83, 20, 5,246, 47, 30, 58,124, 11, 48,169, 50,225, 69,214, 52,132, 99,234,172,
-195, 42, 26,200,151, 87,247, 94,216,186,117,107,109,108,108, 44,188,189,189,203,196, 74,249,255,180,177,177,129,157,157, 29, 66,
- 67, 67,241,253,247,223,107, 0, 44,172,129,179, 80,173, 86,143,236,213,171,151, 70, 32, 16,160,113,227,198,101,241,179, 88,150,
-133, 88, 44,134,165,165, 37, 30, 62,124,136,129, 3, 7,170,213,106,245, 72,188, 26, 67,235,101,206, 2,181, 90,253, 81,239,222,
-189,213,145,145,145,232,212,169, 19, 30, 63,126,140,162,162, 34, 20, 21, 21,225,197,139, 23,104,210,164, 9,212,106, 53, 54,111,
-222,172, 81,171,213, 31, 1, 40,168,142,179,176,176,112,224,156, 57,115,168,253,251,247,215,245,240,240,104,218,166, 77,155, 70,
- 61,122,244,168, 63,100,200, 16,159,254,253,251,187, 53,108,216, 80,219,167, 79, 31,121,191,126,253,228,106,181, 90,120,243,230,
- 77,133,209,104,236, 87, 67, 58,203,196, 73,108,108,108,217, 80,161, 64, 32, 64,118,118,118, 89,228,254,210,151, 82, 21, 66,184,
-103, 77, 98,187, 84, 96,149, 10, 46, 19,252,220, 42,227,172,241, 34,177, 88, 92,106,241,228, 76,224,124, 20, 21, 21,213,171, 75,
-151, 46,143, 38, 76,152, 80,152,158,158, 14,107,107,107,248,250,250,194,207,207, 15, 78, 78, 78, 48, 24, 12, 56,126,252,184,234,
-196,137, 19, 97, 5, 5, 5,221,240,106, 12,173,158, 47,221,199, 23,149,189,100, 75,173, 89,165, 66, 75, 42,149,194,195,195,163,
-244,222,190, 48,231,126,214, 18,127, 45,103,137,128,233,209,189, 79,189,254, 3, 6,219, 30, 63,121, 75,188, 97,211,137,176,214,
- 61,177,195,177,142,242,148, 99, 29,229,169,214, 61,177, 99,195,166, 19, 97,199, 79,222, 18,247, 31, 48,216,182, 71,247, 62,245,
- 34, 35,162, 27,149, 95,247,176,178,116, 74,165,210,246,157, 58,182,206, 11,185,113,149, 93,177,122, 35,217,189,219, 7, 15,119,
-254,122,252,248,206, 95,143, 31,239,222,237,131,135, 43, 86,111, 36, 67,110, 92,101, 59,117,108,157, 39,149, 74,219,155,146,247,
- 41,147, 70,219, 14,232, 63, 8, 65, 65,199,233, 35, 7, 54,175, 62,120,244,105,151, 79,167, 95,203,136,141,125,204,101,166, 92,
-128,144, 76, 68, 84, 84, 84, 65,137,200,138, 53,133,115,242,196,209,229, 69,214,117, 71,215, 78, 59,162,162,192, 92,186,116,218,
-120,249,242, 67,205,245, 71,153, 5, 15, 34,179,115,211,178,114,159, 43,149, 57,122,150,101,192, 48, 12,245,205, 55,101, 14,187,
-149,150, 81,135, 14, 93,241,103,240, 62,236,222,181,173,128,101,161, 29,126,228, 8, 51,124,248, 50,206,167, 78, 29,159,189, 7,
-246, 17,129,239, 15,182,229, 0,118,224,208, 65,118,251, 15,238, 39,234, 53,168, 87,199,215,183, 44,164,205,127,175, 46,253, 5,
-156,203,128, 60,101, 98,226,213,208,141, 27,117, 46, 35, 71, 58,136, 93, 92,108,192, 48, 68,233,251,189,170, 77, 32, 16,188,108,
-129,169,146,211,195,201, 41,245,212,169, 83,240,243,243,131,135,135, 7,202,251,200,150, 6,228,118,116,116,196,209,163, 71,193,
- 85, 12, 78, 93, 37,103,171,186,117, 67, 87,173, 92,169,103, 89, 22,121,121,121,175, 88,179,242,242,242,192,178, 44,206,158, 57,
-163, 87, 22,175, 4, 98, 82,222,187, 81, 84,209,135,157, 59,175, 24, 48, 96,128, 33, 46, 46, 14, 44,203,162,188,101, 43, 51, 51,
- 19, 86, 86, 86,208,234,116, 94, 0,100,166,112,102,158, 63,111,137, 26,222,235,149, 88,180,254,138,114,255,175,139,172,242, 11,
- 74, 79, 50,201,162, 69,211, 52,188,188,188, 42, 44,233, 66,146,100,133,205,204, 25,135,123, 34, 35, 35, 47,244,233,211,103,201,
-187,239,190, 59,101,201,146, 37, 84,163, 70,141, 80, 80, 80, 0,123,123,123, 56, 59, 59, 35, 38, 38, 6,167, 78,157, 98,178,179,
-179,183, 2, 88, 14,211,166,208, 95,121,250,244,105, 96,243,230,205, 15,206,159, 63,223,182,119,239,222, 66, 47, 47, 47,112, 28,
-135,135, 15, 31,226,216,177, 99,134,157, 59,119, 42, 75, 68,150,169,206,203, 23,211,210,210, 62,232,215,175,223,222,177, 99,199,
- 90, 51, 12, 35,124,241,226, 5,116, 58, 29,140, 70, 35,146,146,146, 12, 65, 65, 65, 69,106,181,122, 52,128,139, 38,240,133,230,
-231,231, 55,185,116,233,210,216,155, 55,111,126, 63, 97,194, 4,199, 30, 61,122,136,104,154,198,141, 27, 55,178, 90,181,106,229,
-156,153,153,105, 56,122,244,104,142, 86,171, 93,200, 48,140, 73, 75,240, 16, 4, 1,165, 82, 9, 39, 39, 39,232,116, 58,176, 44,
- 11,189, 94, 15, 43, 43,171,178,101,147, 56,142,131, 57,206,245, 47,213, 1,202, 96, 48, 96,212,168, 81, 96, 89, 22,235,214,173,
- 3, 77,211,102,147,217,218,218, 62,120,244,232, 81, 96,203,150, 45,203,196, 75,105, 29,146, 72, 36,112,114,114,130,163,163, 35,
-130,130,130, 32, 20, 10, 31,212,228,239, 86,130,199,217,217,217,173, 46, 93,186,212, 62, 44, 44,236, 99, 0, 45, 13, 6,131, 7,
-195, 48, 4, 73,146, 10,142,227,158, 40,149,202, 95, 97,226, 18, 60,153,153,153,223,143, 27, 55,174,213,190,125,251,172, 4,130,
-255, 61, 26, 2,129, 0, 18,137, 4,165,193, 49, 57,142,131, 94,175,199,162, 69,139,148, 42,149,234,251,183,229, 45,209,186, 77,
- 59,108,223,188,222,234,242,159, 23,178,162,158,226, 88, 37, 33, 28, 82, 50,210,183, 55, 75, 75, 78,182,106,221,166,157, 73,156,
- 70,189, 33,231,163,209, 95,122,151, 44,193,179,232,197,139,132,109,123,247,252, 20, 15, 0, 63,254,188,174, 97, 70, 78,254,228,
-232,168,232,225,219,182, 29,104,111,212, 27,114, 76,225,252,159,120,217, 91, 0, 14, 90, 0,119, 31,134,101,212, 29, 56,242,252,
-194, 6,245,108,222,207,204,209,164, 22, 21,169, 63, 7, 16,111,106,222, 59,118,232,130, 63, 47,238,199, 31,187,247, 42, 57,150,
-210, 58, 57, 57,113, 0, 16, 21,229,196, 69, 69,229,115,255,243, 43,182, 83, 9,185,199,203,191,252,188,199,151, 5,202,220,159,
-215,109,174,126, 40,165,121,139,119,209,188,197,187,152,254,249,215,182, 77,154, 54,246, 6,128, 35, 71,192, 52,109, 16,121,122,
-201,226,101,239, 47, 95,190, 12,202, 66, 29,150, 47, 47, 94,174, 39, 38, 60,242, 76,124, 60,244,124,155, 85, 17, 75,104,250, 46,
-190,252,178,161, 58, 55, 87,222,113,222, 60, 39,193, 87, 95,145,213, 57,195,151,127,126, 77,225,188,255,228,201,153,201,159,126,
-154,186,116,201,146, 62, 91,183,109,179,104,214,172, 25,210,211,211,209,184,113, 99,120,120,120,224,210,165, 75, 56,122,232,144,
- 42,191,176,112, 33,128, 45,166,112,238, 57,123, 54,166, 81,211,166,217,219,182,109,115, 31, 48, 96, 0,161, 82,169, 80, 80, 80,
-128,130,130, 2,232,116, 58,148, 4,132,230, 98,159, 62,141, 50, 26,141, 91, 77,205, 59,147,149, 37, 93,222,174, 93,138,136,101,
- 87,125, 48,116,232,156,229,223,126, 43,169, 87,175, 30,161,211,233,202,172, 90, 6,131, 1, 86, 86, 86, 6,189, 94,239, 8, 64,
-109, 10,167,100,231, 78, 58, 43, 43, 11,114,185,188, 44, 92, 83,249,184,132,133,133,133,224, 56,142, 15,166, 91, 11, 84,169,144,
-236,237,237, 31, 8, 4, 2,207,242,214,173,202,214,206, 43,127,204,104, 52,166,100,103,103,183,126, 73,241, 86,229, 15,229, 11,
-224,135,238,221,187,127, 48,123,246,108, 34, 36, 36, 4, 39, 78,156,224,226,227,227,143,148, 88,177,226,171,233,233, 84,197,105,
- 45,145, 72,102, 90, 90, 90,246, 44, 13,225, 32,147,201,194, 84, 42, 85,112,201,112, 97, 97, 45, 56,109, 36, 18,201, 12, 75, 75,
-203, 94, 37,203,175,192,218,218,250,145, 74,165,186,164,211,233,214,163,234,133,170,171,227,180,176,181,181,253,222,201,201,233,
-163,175,190,250,202,241,218,181,107,138, 63,255,252, 83,148,159,159,191, 79,175,215, 87,183,168,244, 43,156, 14, 14, 14, 15, 40,
-138,242,252,139,202, 8,205,155, 55, 15, 26, 56,112,224,128,209,163, 71,195,104, 52, 98,203,150, 45,184,116,233,210,153,103,207,
-158, 5,214,208, 27,125,153,211,201,211,211, 51,100,202,148, 41, 62,163, 70,141,146,217,219,219, 67, 32, 16, 64,165, 82,225,217,
-179,103,120,248,240, 33,119,242,228,201,162,208,208,208, 20,181, 90,221, 21, 64,182, 25,247,243,117,122,205, 21, 56, 5, 2, 65,
- 23, 47, 47,175, 3, 75,151, 46,181,238,213,171,151,133,163,163, 35, 40,138,130,209,104,132, 66,161, 64,120,120, 56, 46, 92,184,
-160, 58,114,228,136, 42, 39, 39,103, 20,128,171,255, 68, 58,223, 36,167,127, 67, 44,126,105,161,232, 42,163,189,215,112,110,141,
-233,236,222,197,109,208,240, 15,250,245, 5,128,195, 71,207,157, 55, 97, 81,233, 42,211, 89, 83, 90, 77,225,108,220,128, 92, 26,
- 17, 25, 94, 33,160,101,211, 38, 1,177,254,205,134,126,103, 10, 81,185,200,240, 21,242, 94,110, 56,182,188, 77,183,194, 48,171,
-191, 47, 2, 7, 13, 31, 50,224,235,133, 11,240,195,247, 43,112,242,240,241, 51, 81,241, 21,150, 9,250,207,213,165,191,152,147,
-248, 78, 32,120, 87,230,230,214,121, 29,203, 46,120, 28, 30,110, 85,190,195, 86,106,121, 46,223,169,116,119,119,207, 84, 40, 20,
- 46,166,112, 6,254,242,139, 65,109,105, 41, 89,176,106, 85,151, 34,173,182,203,242,229,203, 5,247,239,223,199,230,141, 27,105,
-109, 74,202,222, 44, 96, 70, 21,163, 33, 85,114,250,204,152, 33,157,187,121,243,120,223, 6, 13,156, 63,254,248, 99,161, 80, 40,
-132, 74,165, 66,114,114, 50, 46, 94,184,160,143,140,138,138, 84, 42,149,239, 3, 72, 51,149, 51,240,151, 95, 12,118,190,190,144,
-201,229,220,229, 43, 87,108, 39,207,156, 57,165, 78,221,186,182,125,250,246, 21,218,216,216, 32, 47, 47, 15, 47, 94,188,192,241,
-227,199, 51,139,138,138,220, 1, 48,166,112,238,189,121,179,249,217,171, 87,135,125,247,221,119,226,128,128, 0,216,218,218,162,
-176,176, 16,225,225,225,184,122,245,170,110,235,214,173, 5, 5, 5, 5, 83, 24,134, 57,245, 23,150,251,219, 96,213, 42,197,246,
-210,209,159,191,218,195,223,148,130,104, 13, 96,113,201,231,111, 81,243,154,129,111,211,203,199,219,193,193, 97,187, 86,171,229,
- 52, 26,205,100, 0, 73,255,194,116, 10, 90,183,110,189, 57, 51, 51,179, 61,199,113,176,181,181,189, 21, 17, 17, 49, 13, 85,204,
-188,169,129,147, 2,208,222,202,202,170,157,181,181,117, 23,157, 78,231, 95, 50,252, 22,165, 82,169,174, 26, 12,134,187, 37,214,
- 39,230, 31,206, 59, 5,160,151,187,187,251,167, 44,203, 54, 32, 8,194,142, 97, 24, 24,141,198,124,150,101,159, 21, 20, 20,236,
- 4,112,233, 95,144,206, 55,194,217,164, 62,134,112, 36,252,171, 18, 4, 21,132,214, 75, 2,130, 96, 17, 21, 25,135,227,102,164,
-147,236,215,211,107, 19, 80, 60, 51, 17, 53, 59,215,254, 79,104,153, 32, 94,204, 22,153,245,169,113, 28,193, 85,224, 36, 56, 34,
-169,113,243, 33,127,188,142,208, 50, 21, 77,252,208, 5, 28,218,179, 28,238, 70, 63,195,159,111,241,187,238,141,113,254, 0, 56,
-108,180,183,191, 69, 10, 4,174, 0,200, 18,235, 11,203, 18, 4,195, 17, 4, 93,126,120,235,165,142,101,181,156, 6,160,153, 80,
- 34,241, 98,104,218, 37, 29,176, 58,203, 48,239,104, 57,174,200, 19, 88,252, 8,136,169, 77, 58, 13, 64, 51, 74, 34,241, 62,203,
-113,131,178, 44, 45,155,103,106, 52,114, 0,156,149,165,101,148, 82,165,218,173,213,106, 55,225,213,145,139, 26, 57, 69, 18,137,
- 39, 67,211, 46, 0, 64, 10, 4,153, 7,117, 58,175, 20, 27,155,143,181, 58,157,143,149,149,149, 81,175,215, 43,181, 90,237,104,
-154,166, 47,155,147,247,103, 52,221,228, 38, 73,118, 50, 88, 90, 58, 26, 8,194, 82, 79,211, 6,189,193,144,172,213,106,195, 0,
-252, 4, 32,238, 47, 46,247,183, 10,166,132,147,122, 83, 15, 11,207,201,115,242,156, 60, 39,207,201,115,242,156,127, 61,167, 12,
-128,119, 73,103,241,191,152,247,183,202,186, 85, 58,251, 95,192,223, 11, 30, 60,120,240,224,193,227,173,128, 26,149,248,100,241,
-248,103, 65, 84,163, 74,205, 49, 9,214, 70,217, 6,243,156, 60, 39,207,201,115,242,156, 60, 39,207,249,255,142,179, 38,238,255,
-226,144,228, 43,107, 29,114, 28,183,253,239,248, 99,222,252,203,115,242,156, 60, 39,207,201,115,242,156, 60,231,255, 59,148, 14,
- 29,146,252,173,168, 18, 46, 37,219,155, 62,151,199,219, 93, 23, 94,134, 71,201,102,206,249,110,252, 45,231,193,131, 7,143,183,
- 3,255,132,208, 50,181,209,122,157,198,237,117,133,207, 10,130, 64, 26, 65, 32, 13,192,138, 55,120,110, 77,112,119,114,114,250,
-162, 73,147, 38,123, 93, 92, 92,166, 3,112, 54,243,250,134, 50,153,108,189,165,165,101,136,165,165,101,136, 76, 38, 91, 15,160,
-225, 27, 42, 55, 2,192,100,137, 68,114,197,205,205, 45, 85, 44, 22, 95, 1, 48, 5,181,159,185,218, 8,197,113,210,190, 5,208,
-220,156, 11,157,155, 14, 58, 36,111, 58,232,137,188,233,160,112,199,128,129, 13,229, 77, 7,133,203,155, 14,122,226,220,116,208,
-161,191,160,190,190, 78,249,174, 32, 8, 36, 17, 4,146, 76,188,246, 39, 2, 72, 38, 8,164,188,129,186,196,131, 7, 15, 30, 60,
-254,107,112,119,119,255,192,205,205, 45,216,205,205,237,146,187,187,251, 7, 38, 92,210,179,146,134,135, 33, 8, 48, 53, 52, 36,
-213,157, 87,147,185,178,252,181,107, 76,204, 90,121, 78, 23,130, 0,195,149,128, 32,192, 58, 59, 59,111,112,115,115, 91,241,242,
-230,236,236,188,129, 32,192,150, 59,151, 41, 39,240,204, 53,171,186,140, 25, 51,230,112, 94, 94, 94,144, 94,175, 15,122,250,244,
-105, 80,215,174, 93, 15,190,100,221,168,146, 83, 42,149,126,216,182, 93,251,208,171, 55,238, 62,141,125,150,144, 22, 25,243, 60,
-225,244,249,203,247, 3,154, 53,191, 39,149, 74, 63, 52,163,140, 8, 0,147, 5, 2,193, 21, 43, 43,171, 20,129, 64,112, 5,192,
- 84,138,162, 78,173, 92,185, 50, 33, 34, 34, 34,227,230,205,155,249, 87,175, 94, 77,157, 48, 97,194, 51,130, 32, 78, 87, 34,216,
-123, 86, 98,165,121,217,170,179, 36, 49, 49,241,188, 66,161,184, 96, 97, 97,241,189, 9,231,151,113,202,155, 14,122,146, 89, 96,
-224, 50, 11, 12,156,188,233, 32,174,220,231, 39,102,222,243,154,202,232,149,186, 32,145, 72,188,107, 16,244, 61,171,186, 22,128,
-107,201,111,173, 1,252, 82,178,149, 78, 61,119,149, 74, 36,111,170, 46,189,137,188,243,156, 60, 39,207,201,115,254,221,156,255,
-101,180, 42,217,187,161,216, 95,203,173,182,179, 14, 63,123,250,244,169, 21, 0,248,249,249, 77, 3,112,212, 28, 33, 65, 16,152,
-203,178, 28, 9, 0, 36, 73,204,235,214,173,123, 43, 11, 11,139, 10, 81,144, 53, 26,141,248,202,149, 63,123,176, 44, 71,148,156,
- 55,151,227,176, 30, 64,134,169,255,161,215,235, 72,161, 80, 12,146, 36,190, 12, 8,104, 86, 39, 59, 59,251, 26, 73,146,123, 83,
- 83, 83,243,204, 54,227, 16, 4,118,236,216,225,231,230,230,246, 74,180,102,133, 66, 33, 30, 52,232,125,179,248,198, 1, 18,157,
- 68,210, 78, 68, 16,110, 12, 77,219, 1,128, 64, 32,200,187, 47, 22,183,254,225,187,239,100, 4, 65,176, 57, 57, 57,208,104, 52,
-152, 53,107,150, 69,100,100,228,224,236,236,236, 77, 53,208,250, 53,111,209,106,214,133, 11,231,253,149,185,121,218, 29, 63,111,
- 11,213, 8, 68,234,186, 77, 26,139, 54,111,223,109, 63,105,252,232,207,163,163, 35, 30,161,242,229, 72,202,131, 4,112,124,230,
-204,153, 77, 3, 3, 3,197,133,133,133, 82,141, 70, 83,103,239,222,189,139, 90,183,110,109,213,178,101, 75,241,129, 3, 7,136,
-130,130, 2,112, 28, 39,107,220,184, 49, 55, 98,196, 8,237,193,131, 7,167, 3,216, 80,141,240,157, 91,124, 47,201,117,141, 26,
- 53, 90, 10, 0, 79,159, 62, 21,149,187,199, 66,127,127,127, 75, 0,136,137,137,249,134,227,216,153, 0,192,113, 88, 13, 96, 65,
- 37,166,181,167, 77, 59, 14, 7, 8, 52,136,184,113, 88,218,180,211,112, 45, 56, 60, 35,128,167, 37, 29,130,229, 64,185,184, 80,
- 21, 17,149,150,150, 86,171,181, 9, 7, 12, 8, 36, 8,130, 56, 18, 26, 26,122, 52, 51, 51,179, 46,203, 50, 19,171, 75,231, 75,
-245,136,112,116,116, 28,151,157,157,189, 2,192,167, 81, 81, 81,173, 0,192,223,223, 95, 4,224,129,141,141, 77, 7,131, 94, 79,
-240,239, 42, 30, 60,120,240,248,207, 10,173,135, 0, 6,224,127, 75,240,108, 7, 96,182,208, 18, 3,192,181,107,215, 0, 64, 82,
-139,132, 16,229, 5,204,140, 25, 51,224,230,230,246,178,120, 65, 72,200,149,215,201,108,133,255,248,246,219,111,173,242,243,243,
-123,254,250,235,175,157, 57,142, 91,147,150,150,118,167,134,235, 51, 56, 14,171, 73,146,152, 71, 16, 4, 36, 18,105,236,148, 41,
- 83, 30,150,252, 86,231,244,233,211,178,129, 3, 7,170, 1, 36, 0,128, 68, 34,245,160, 40,210,175, 88,185, 98,117,117,130,112,
- 24,224, 75,139,197,221, 39,255,242, 11,253,206,192,129, 2, 75,185,156, 0,128,132,232,104,199,213, 63,254,216, 33, 47, 62, 94,
-172,113,116,204,201, 81,169, 52,177,177,177,144, 72, 36, 4, 69, 81,239,212,148, 97, 75, 75,203, 47,190,251, 97,149,165, 50, 55,
- 95,163, 85, 22,234, 41,218,168,179,182,144, 49, 25,233,153, 57, 86, 22,150,234,121,139,151,137, 63,155, 56,246, 11,149, 74, 53,
-173, 6,170,233, 95,126,249,165,127,219,182,109, 61, 14, 29, 58, 68, 20, 20, 20, 64, 32, 16, 88,181,108,217, 18,173, 91,183,102,
-254,252,243, 79,162,110,221,186, 8, 8, 8,192,141, 27, 55,112,235,214, 45,162, 85,171, 86,178, 99,199,142,141, 49, 26,141, 27,
-106, 18,215, 20, 69,206,106,220,184,113, 75, 75, 75, 75,189,159,159, 31, 38, 78,156, 8,142,227,208,179,103,207, 0, 43, 43,171,
-163, 42,149, 74, 28, 19, 19,221,185, 38,145,157, 25,113,114, 68,169,101, 11, 64, 51,112,120,150, 21,113,178,121,185, 83,252, 99,
- 98, 98,222,205,203,203, 43,115, 70, 44, 93,192,188,115,231,206,230,212,165, 12,142,195,234,129, 3, 3,231, 1, 4,209,179,103,
-207,252,233,211,167,147,209,209,209, 31, 13, 25, 50, 56,224,233,211,103,168, 38,157,229,235, 17, 49,110,220,248, 12, 43, 43,171,
-161, 71,142, 28,137, 81, 40, 20, 2,145,168, 76,103, 82,206,206,206,114, 63, 63,191,169, 14, 14, 14,153, 20, 73, 58,115,224,184,
-154,234, 18, 15, 30, 60,120,240,248, 87,225, 76,137,184, 58,243,242, 15, 2, 0, 8, 10, 10, 42, 11, 95, 26, 24, 24, 88,101,175,
-154,227,184,140,199,143, 31,123,169,213,106,112, 28,103, 74, 35, 80,126,138,102, 6, 65,144,155, 73,146,152, 70, 16, 4, 2, 2,
-154, 61, 95,183,110, 93,101,107,122,233, 3, 2,154, 61,167, 40,178, 30,199,113, 32, 8,114, 11,199,177, 25, 85,112, 86,218, 48,
-138,197,146,185, 0,224,234,234, 22,127,238,220, 57,253,176, 97,195,240,227,143, 63,138,230,207,159, 63, 71, 32, 16, 76, 79, 74,
- 74, 74,175, 38,157, 0,176, 64, 46,119,150,237,216,177,195,111,202,148, 41, 15, 21, 10,197, 2, 0,112,115,115, 91, 1,160, 9,
-128,132,114,199,176,117,235,193,212,137, 19, 39,198,102,102,102, 46,168,138,115, 40, 80,223,171,113,227,238,203,175, 93,227, 72,
-157,142,200,190,126, 93,153,149,145, 97,140,203,202,146,237,122,240, 32,112,209,138, 21, 66, 47,111,111,132,156, 58,229,148,173,
- 86,103, 21,232,116,218,140,140, 12,142,166,233, 91, 38,228,189,169,179,220, 89,182,237,167, 45,247,173,133, 20,235,236,233, 65,
- 8, 29, 28, 4,164,204, 70, 76, 9, 72, 93,189, 58, 13,197, 0,154,214, 84, 70, 34,145,104, 76,239,222,189,101, 7, 15, 30, 36,
- 2, 2, 2, 96,103,103,135,235,215,175,227,209,163, 71,200,203,203, 35,141, 70, 35,218,180,105,131, 85,171, 86,193,219,219, 27,
-249,249,249, 72, 74, 74,114, 18,139,197,114,163,209, 88,213,253,172, 80,159,230,206,157, 11, 55, 55, 55,208, 52,141,220,220, 92,
-208, 52, 13, 43, 43, 43, 0, 64, 74, 74, 10, 78,157, 58,105, 74, 93,170, 17, 28,199,225,189,247,222, 43, 36, 8, 34,234,101,139,
-150, 57,156, 30, 30, 30, 7,178,178,178,251,117,239,222, 29,121,121,121,198,101,203,150,161,121,243,230,240,243,243, 51, 37,157,
- 11, 68, 34,241,175, 62, 62, 62, 63,205,152, 49,195,205,193,193, 1, 58,157,110, 81,122,122, 58,166, 78,157, 10, 0,232,223,191,
-127,115,161, 80,120,110,194,132, 9,168, 91,183,110,106,110,110,110, 82,104,104,232, 68,181, 90, 29, 94,219,188,155, 8,158,147,
-231,228, 57,121,206,127, 21,167,169, 90,228, 95, 10, 69,169, 5,171, 4,219, 43, 8,173,192,192, 64, 34, 40, 40,136, 51, 33, 99,
- 57,158,158,158, 94, 22, 22, 22, 0,144, 99,110, 42, 88,150,157,238,232,232,152,185, 96,193,130,142,126,126,126,250,233,211,167,
-135, 39, 36, 36, 44, 44,127, 78,157, 58,117,190,223,184,113, 35, 98, 99, 99, 19, 86,172, 88,113, 35, 39, 39,199,220,117,204,230,
-115, 28,214,149, 88,199,178, 79,157, 58,213,252,218,181,107,211,126,254,249,103,249,103,159,125, 38,250,226,139, 47, 70, 3,248,
-177, 38, 18,138,162,212,149, 13, 23, 86, 6, 55, 55, 55, 61, 69, 81, 85, 6,137, 11, 4, 44,164, 98,113,183,229,215,174,113,250,
-132, 4,245,111,107,215, 90,111,187,119,111,169,145,227, 92,156,157,157,209,169, 67,135, 34, 41, 69,101,103,166,167,179,206,245,
-235, 83, 47,206,157,115,210,136,197,105, 7, 15, 30, 44,200,201,201, 57, 81,163, 9,143, 32,148, 44,199,233,173, 60,189,141,195,
- 6,247, 10,184,127,247, 81,180,181,179, 19,217,170,101, 64,243,232,216,132, 80,176,172,129, 32, 8,101, 77, 60,182,182,182,126,
- 57, 57, 57, 80, 42,149,144,203,229, 88,183,110, 29, 92, 93, 93,161, 86,171, 17, 17, 17,193,121,122,122, 18,215,174, 93,131,167,
-167, 39,178,178,178,160,215,235, 81, 88, 88,152,169,211,233,170, 90,155, 49,131, 36,169,223, 73,146, 24, 79, 16, 4,234,213,243,
- 77,220,180,105,147,158,101, 89,248,251,251, 99,200,144, 33, 56,118,236, 24, 34, 34, 34, 74, 45, 79,122, 31,159, 58,137, 36, 73,
-248,148,104,165, 90, 91,117, 74,151,246, 73, 75, 75, 27, 90,203,135,134,116,119,119, 31,221,160, 65,131,105, 31,126,248,161, 81,
- 44, 22, 67,165, 82,149,222, 11, 99,191,126,253,243, 7, 14, 12,180, 61,115,230, 76,181,233,212,235,245,241, 5, 5, 5,159,126,
-249,229,151,123,183,110,221,106,191,112,225, 66,176, 44, 11,142,227, 64,211,116,217,162,223, 44,203,226,248,241,227,136,139,139,
-251,254, 37,145,197,131, 7, 15, 30,255, 47, 96,134, 22,249, 55,194, 13,197,195,134,120, 89,108,253,237,145,225, 41,138,218,118,
-241,226,197,150,157, 59,119, 22,244,232,209, 35,224,252,249,243, 1,169,169,169,225, 37,214,131,128, 30, 61,122, 4, 56, 59, 59,
- 99,253,250,245,106,138,162,182,213,242,111,202, 26,189,244,244,244,135, 0,214, 28, 59,118,108,245,228,201,147,225,234,234,218,
- 68,161, 80,252,173,121,182,145, 72, 90, 77, 88,183,142, 22, 26,141,228, 47,107,214,216,172,189,114,101,245,161,195,135, 5,239,
-189,247, 30,193,113, 28,194,158, 60,177, 88,181, 97,131,108,212,224,193, 9, 49,241,241,244,201, 11, 23,140, 25,169,169,185,169,
- 89, 89, 75, 0,228,214,196,111, 52, 26,111, 63,125,250,212,189, 83,151,247, 60,174,222, 11,127, 52,108,112,255,238, 66, 1, 73,
- 60, 75, 72,121,224,230,234,100, 27,114, 37, 88, 99, 52, 26,111,215,196,163, 82,169, 94,208, 52,237,192,113,156, 60, 36, 36, 4,
-114,185, 28,121,121,121, 48, 26,141,208,235,245,122,181, 90, 45,205,201,201,129, 86,171,133, 78,167,131,141,141, 13,194,194,194,
- 50,104,154,254,179, 42, 78,134, 97, 38, 72, 36,146,111,133, 66,161, 88, 36, 18,165, 61,120,240, 0, 74,165,178,142,157,157,221,
-143, 52, 77, 35, 45, 45, 13,215,174, 93,251,202,198,198, 38, 1, 0,164, 82, 41,196, 98,137,163, 78,167,163, 1,164,214,246,158,
-191,206, 26, 83,174,174,174,222, 22, 22, 22,203,231,205,155,235,223,162, 69, 75,100,101,101,129,101, 89, 88, 90, 90, 66,173, 86,
-195,198,198, 6,237,219,183,127,177,124,249,114, 5,199, 97, 82, 77, 98, 48, 51, 51, 51, 75, 32, 16, 76,159, 60,121,242,183,126,
-126,126,245, 56,142, 67,195,134, 13,209,187,119,111,156, 59,119, 14,177,177,177, 80,169, 84,204,157, 59,119,246, 43, 20,138,211,
-252,235,150, 7, 15, 30, 60,254,115,120,197, 55,171,130, 69,235,239, 68,102,102,102, 86,116,116,244,249,208,208,208,192, 17, 35,
- 70, 32, 36, 36,100, 28,128, 47, 1, 64, 34,145,140, 27, 49, 98, 4, 66, 67, 67, 17, 29, 29,125, 62, 51, 51, 51,235, 77,252,167,
- 88, 44,214,234,245,197,198, 41,169, 84, 42, 53,243,242, 58, 37, 67,134, 0, 80,167,154, 99, 85,155, 70, 4, 2,183,102,125,251,
- 10,242, 30, 61, 82,238,184,123,247,219,189,123,247, 10, 58,118,236, 72, 24, 13, 6, 48, 44, 11, 95, 95, 95,162, 71,207,158,150,
-191,239,221,235,192,168, 84,215,190,155, 55,239,250,246, 9, 19,138,158,150,248,129,213, 4,157, 78,183, 97,218,212, 79,123, 94,
- 9,185,238,209,164,113,125,135,243, 23,175, 60,116,116,180,149,249, 53,104, 96,153,147,151,203, 44,156,255,149, 64,167,211,253,
- 82, 19,143, 70,163, 57, 30, 28, 28, 60,216,203,203, 75, 30, 30, 30, 14,189, 94, 15,134, 97,208,163, 71, 15,112, 28, 39, 1,192,
- 10, 4, 2, 68, 71, 71,195, 96, 48,100, 62,125,250, 52,237,217,179,103, 18, 0, 43,107, 72, 95,162, 78,167, 67, 84, 84,241,168,
-157,167,167,103,175, 1, 3, 6,128,166,105,244,237,219, 23, 39, 79,158,236, 21, 21, 21,181,182,188,230,123,221, 50, 47,177,144,
-249,187,187,187, 31, 43, 57,100,146, 19,188,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60, 61, 61,193,113, 28,236,237,237,
-160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,166, 90,220,210,210,210,158,165,165,165,141,200,
-204,204, 20,229,231,231,183,238,213,171,215,250,158, 61,123,226,225,195,135,184,126,253,250, 40,137, 68,146,105, 48, 24,104, 87,
- 87,215, 73, 4, 65,216, 24, 12,134,125, 57, 57, 57, 10,254,221,197,131, 7, 15, 30,255, 9,148,250,104,161,220,222, 60,139,150,
-191,191,191,101, 66, 66,194,199,117,234,212, 17, 3,128,133,133, 69, 19, 95, 95,223, 57,241,241,241,133,230,166, 70,173, 86, 31,
-218,187,119,111,239,159,126,250, 73,212,191,127,255,250,199,142, 29,107, 11, 0,253,251,247,175,111,109,109,141,189,123,247, 26,
-212,106,245, 27,139,137,100, 52, 26, 59,183,105,211, 6,185,185,185, 72, 72, 72, 48,107, 88,230,244,233,211, 50, 20,251,101, 85,
-123,172, 58,208,122,189,189,157,135, 7,153,122,229,138, 33, 87,169,116,235,220,165, 11, 97, 52, 24, 64,146, 36,114,114,114,144,
-148,148, 4, 91, 59, 59, 34,250,233, 83,171,157,115,231,158,174,211,162,133,152,209,235, 29,205, 72,166, 42, 59, 51, 99,252,231,
-211, 63, 59,190,111,223,126,121,190, 82, 25,103, 97, 33,211, 73, 36, 34,215, 25,159,127,206,228,230,230,142, 5, 80,100, 2,207,
-202,125,251,246,245,237,219,183,239, 19,111,111,111,231,172,172, 44,215,252,252,124, 38, 55, 55,151, 66,177,175, 21, 1, 0, 87,
-174, 92,129, 82,169,164, 25,134,185,134,226, 88, 88,122, 83, 19,234,227,227, 99,219,186,117,235,174,114,185, 28, 5, 5, 5,112,
-116,116, 68,203,150, 45,187, 82, 20,245,107, 98, 98, 98,193,155,172,245,151, 46, 93,178,230, 56,238, 93,142,227,208,183,111, 95,
-147,174, 97, 24,230,147, 1, 3, 6,136, 8,130,128, 70,163,134, 84,106, 1, 75, 75, 43, 88, 91,219,192,207,175, 17,210,210,210,
-208,167, 79, 31,125, 92, 92,220,102,133, 66, 97,118, 29, 45, 40, 40, 24,212,190,125,251,217, 83,167, 78, 5, 77,211, 24, 52,104,
- 16,146,147,147,215,190,120,241,226,160,187,187,251,232, 79, 62,249, 68,238,232,232,136,217,179,103, 91, 0,248,134,127,119,241,
-224,193,131,199,127, 2, 47,251,104,189,106,209,170,110, 76,212,213,213,181, 19, 65, 16,139, 52, 26,141,184,116, 72,134, 32, 8,
-177, 92, 46, 63,169,209,104, 86, 40, 20, 10,179,156,226,242,243,243,149,207,159, 63, 63,121,251,246,237,225, 67,135, 14,197,165,
- 75,151,198, 2,192,208,161, 67,113,251,246,109, 60,127,254,252,100,126,126,190,242, 77,228,220,195,195,163, 95,151, 46, 93,134,
-182,105,211, 6, 65, 65, 65, 96, 24,230,150, 57,215,151,159, 97,136, 74,102, 29,150, 30, 51,137,140,162, 64, 16, 4,104,154, 6,
- 0,100,103,101, 33, 54, 38, 6,185,121,121,208,105,181, 80,169,213,140, 95,221,186,154, 2,189, 94, 72, 0,230,142,125, 37,134,
-222,191,147,164, 86,169,156, 29,237, 29, 52, 50,153, 4,249,202, 2,209,131,251,119,138, 0,196,153,200,161,231, 56,174,203,185,
-115,231,150, 80, 20, 53,194,202,202, 10,211,166, 77,163,186,118,237, 10,145, 72, 4,157, 78,135,252,252,124,236,221,187, 55,139,
- 97,152,122, 37,215, 88,201,100,178,221, 20, 69,165, 20, 22, 22, 46,170,241, 15,244,250,254,129,129,129, 2,189, 94,143,239,190,
-251, 14, 75,151, 46, 69,223,190,125, 5,247,239,223,239, 15, 96,223,155,170,241, 44,203,162, 87,175, 94,229,157,225,163, 76,185,
- 78, 40, 20, 6, 52,104,208, 0, 89, 89, 89,200,202,202,130, 92, 46,135,187,187, 59, 92, 93, 93,177,118,237, 90,110,253,250,245,
-231, 13, 6,195,230,236,236,236,140, 90,212,197, 73, 99,199,142,157, 52,124,248,112, 20, 21, 21,225,246,237,219,232,208,161, 3,
- 86,175, 94,237,118,237,218,181, 47,219,180,105, 3,161, 80,136,144,144, 16,208, 52,157,204,191,183,120,240,224,241,255, 13,255,
- 81,255,172,106, 81,173, 69,203,203,203,203,142, 97,152,175, 6, 12, 24,208,107,240,224,193,232,211,167, 79,133,223,247,237,219,
-103,125,244,232,209, 21, 27, 54,108,232,107, 48, 24, 86,154, 51,212,199,178,236,241,125,251,246,245,127,239,189,247,100,221,186,
-117,243, 5, 0,137, 68,162,223,183,111,159,154,101,217,227,181,200, 75,105,112,199, 12, 0,112,119,119,111, 46, 16, 8,134,246,
-235,215,175,249,248,241,227, 17, 17, 17,129,189,123,247, 62,243,243,243,187,145,145, 97, 86, 27,153, 80,195,172,195, 21, 53, 89,
-183, 40,177, 56, 39, 63, 61,221,206,202,219, 91,104,111,109,173, 8, 10, 10,242,234,217,179, 39,145,156,156,140,188,188, 60,104,
-181, 90,220,191,127,159, 21, 0,137, 2,123,123, 34,241,246,109,130, 18,139,115, 80,113, 38, 95,141,240,114,179,111,184,120,254,
-148, 58, 90,157,182,105, 65, 65, 1, 45, 16, 10,133,158,174,118,201, 49,113,102,141,196,233,100, 50, 89,107, 0, 2,150,101,213,
- 14, 14, 14,178,139, 23, 47, 66, 44, 22,131, 32, 8, 52,107,214, 12, 82,169, 84,196,113, 92, 18, 0, 88, 91, 91,139,183,109,219,
-102, 59,122,244,232,235, 53, 17,183,106,213, 74, 40,145, 72,222,247,243,243,195,237,219,183, 17, 30, 30,158,120,251,246,109,159,
- 86,173, 90,193,219,219,251,125, 55, 55,183,195, 15, 31, 62, 52,190,137,138, 93, 60, 99,213,124,103,120,134, 97, 88,130, 32, 64,
-146, 36, 88,150, 69, 86, 86, 22,234,213,171,135, 77,155, 54, 97,221,186,117,223, 41, 20,138, 83,181, 73,143,191,191,191,168, 94,
-189,122, 99,135, 15, 31,142,248,248,120,172, 88,177, 34, 91,161, 80, 92,185,112,225,194, 7, 83,167, 78,165, 58,116,232,128,156,
-156, 28,252,254,251,239,244,131, 7, 15,126, 75, 79, 79,223,195,191,114,121,240,224,193,227, 45, 22, 90, 94, 94, 94,195, 69, 34,
-209,236,145, 35, 71, 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,
-160, 69,139, 22,157,230,206,157,219, 65, 32, 16,108, 74, 75, 75,219,109,202, 31,103,102,102,170, 73,146, 60, 50,109,218,180,149,
-143, 30, 61,172, 7, 0,247,238,221,123,158,150,150, 54, 63, 51, 51, 83,109,102, 62, 74,131, 98, 18, 18,137,244,110,195,134, 13,
- 95,180,110,221,218,102,240,224,193,144,203,229, 8, 13, 13,197,170, 85,171,158,234,245,250, 37, 87,175, 94,165,255,238,155, 76,
-235,116,233, 15, 78,156,176,238,250,209, 71, 54, 51, 6, 12, 88,243,217,180,105, 63, 45, 94,188, 88,208,168, 81, 35, 66,173, 86,
-227,238,221,187,220,209,163, 71,141,191,127,251,237, 58, 88, 90, 10,111, 31, 61, 42,214,235,245,137,102, 90, 75,186,116,236,220,
-169,209,154,159, 54, 64,171, 41,194,221, 91,103,144,151,151,133,109,219,143, 53,242,240,224,186,164,166,166, 94, 53,149,139, 32,
- 8,191, 75,151, 46, 57,115, 28, 7,177, 88,140,229,203,151,195,221,221, 29, 54, 54, 54, 40, 44, 44,196,151, 95,126,105, 59,115,
-230, 76, 91, 0,136,136,136, 40, 11,207, 80, 19,210,210,210,218, 79,153, 50,197,154,166,105,156, 63,127, 94, 79, 16,196,162,224,
-224,224, 95,155, 53,107, 38,238,212,169,147,245,158, 61,123, 58, 0, 8,121, 83, 66,171,150,215, 61,187,120,241, 98,155, 17, 35,
- 70,112, 66,161,144,200,207,207,135,157,157, 29, 54,109,218,164, 82, 40, 20,103,106, 93, 7,104, 90, 44,147,201,196, 28,199,225,
-200,145, 35, 72, 76, 76,252, 36, 39, 39, 39,157, 97,152, 99, 95,125,245,213,156, 70,141, 26,213,141,137,137, 73, 44, 44, 44, 92,
-157,153,153,249,130,127, 53,241,224,193,131,199,127, 10,165, 78,240,165,179, 15,207,160,120, 56,177,106,161,197, 48,204,148, 11,
- 23, 46, 80, 44,203, 98,251,246,237,120,240,224, 1, 39,147,201, 22,201,100,178,141, 22, 22, 22,140, 70,163,153, 60,113,226,196,
-209, 75,151, 46, 37, 59,117,234,132,219,183,111,147,245,234,213, 27, 11,160,188,208,234,137,106, 98,109, 20, 20, 20,220,207,200,
- 72,175, 87, 46, 64,101, 61,137, 68,122,191,134,204,188,204,249,114, 80,204,118,203,151, 47, 87,185,185,185,233,195,195,195,177,
-117,235, 86,246,193,131, 7, 87,196, 98,241, 54,133, 66,161, 51,145,243, 77,160,140, 83, 76,211,161,127,204,153,227,255,206,160,
- 65,236,167,179,103, 23,137, 44, 44,190, 88,179, 97,195,220,252,194, 66,119, 16, 4,231,104,107,155,184,125,249,242, 21,125,223,
-127,191, 40,226,234, 85,233,163, 75,151,132,114,163,241,177, 57,233, 76, 77, 77,189, 26, 18,114, 29,187,118,252, 4,131, 65, 7,
- 69,106,177, 78,203,206, 41, 64, 13, 34,235, 21, 78,154,166, 11, 62,248,224, 3, 17, 0,139, 49, 99,198,136, 51, 51, 51, 81,191,
-126,125, 0,128, 82,169,196,153, 51,103,208,184,113, 99, 0, 64, 88, 88, 88,217,231,154,210,105,105,105,249,126,135, 14, 29,144,
-152,152,136,136,136,136,203, 10,133, 34, 7,192,229,228,228,228,254,109,218,180,193,241,227,199, 7, 86, 35,180,204, 42, 35, 19,
-133,214, 43,156, 22, 22, 22,243,143, 29, 59,246,201,173, 91,183, 70,204,153, 51, 71,216,163, 71, 15, 0, 64, 97, 97,161, 26, 0,
- 83, 27,206,242,105, 50, 26,141, 96, 89, 22, 14, 14, 14,170,156,156, 28,100,102,102,190,200,204,204,156, 22, 23, 23, 87, 43,206,
- 55, 81, 63,121, 78,158,147,231,228, 57,255, 37,156,111, 3, 76,143, 12,207,113, 28,205,178, 44, 66, 66, 66,112,236,216, 49,198,
- 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,233,131, 15, 62,216, 29, 19, 19, 67, 69, 70, 70,130,227, 56,198,156,212,
-104,181, 90, 35, 65,188,122,236,117,115,185,107,215, 46,164,167,167, 27,146,147,147,131,105,154, 62,254,154,179, 23, 95,123,214,
-225, 46, 64,247,161, 94, 31,188,180, 99,199, 94, 75, 46, 93,146,124,250,245,215,186,113,227,199,127,197,232,245, 70, 74, 36, 98,
-197,150,150, 36, 35,145, 8, 35,174, 94,149,174,159, 58,213, 65,163,211,157,223,107,134,131,121,169, 69,171,107,215, 78, 24,247,
-233, 44,104,202, 89,180,110,223,143,133,206, 0,179, 44, 90, 58,157,174,169, 66,161,128, 84, 42, 77, 2,224,250,241,199, 31,131,
-101, 89,104, 52, 26, 20, 22, 22, 34, 45, 45,173, 96,252,248,241, 76,137,120, 18, 12, 29, 58,212,198, 20, 94, 95, 95, 95,119,161,
- 80,136,243,231,207, 67, 40, 20,158, 1, 0,161, 80,120,230,210,165, 75,253, 71,141, 26, 5, 15, 15, 15,223,248,248,120, 2, 53,
-248,167, 57, 55, 29,116,136, 3, 26,130, 64,131, 98, 19, 28, 26,200,155, 14,122, 66, 0, 79, 75,162,198, 71,181,106,213, 10, 48,
-209, 47,171, 60, 74, 38,119,172, 51, 26,141,135,231,206,157, 59,173, 93,187,118,189,151, 46, 93, 74, 0,160,222,196, 19, 72,211,
-244,107,133,158,224,193,131, 7, 15, 30,255,106,171,214, 43,168, 82,104, 17, 4,177,189, 75,151, 46,147, 0, 80, 4, 65,108, 77,
- 75, 75, 11,123,249, 28,133, 66, 17,235,238,238,254, 99,221,186,117, 39, 3,224, 8,130,216,110,102,162, 50, 56, 14,171, 72,146,
-152, 91, 44,238,106, 21,160,178,116,169,147,185, 0, 8,146,164,118, 63,124,248,240,235,164,164,164, 44, 19, 45, 16,213,226, 77,
-204, 58, 4,128,253,192,139,145,137,137, 23,102, 7, 4,244,236, 59,117, 42,154,247,237,107,227,238,227,195,104, 12, 6, 54,236,
-198, 13,226,214,145, 35,162, 71,151, 46, 9, 53, 58,221,249,227, 64,146,185,233, 76, 77, 77,189,250,231,149,171, 23,135, 13,237,
-223,219,183,174,123,177,104,120,145,134,236,220,130,139,230,136,172,151, 68,239,160, 77,155, 54,157, 18,137, 68,130,242, 75,217,
- 24, 12,134, 92,157, 78,215, 20, 0,242,242,242,220,183,111,223,126,128, 36,201,196,154,248, 34, 35, 35, 79, 46, 89,178,100,104,
- 66, 66,194,197,228,228,228, 4, 0, 72, 74, 74, 74, 48, 26,141,187, 21, 10,197,208,196,196,196,163, 48, 97, 18, 0, 7, 52,140,
-184,113,184, 25, 0, 52,237, 56, 28, 17, 55, 14, 75, 1, 52,107,218,113, 56, 0,160,182,107, 25,150, 71, 73,104,133, 69,183,111,
-223,222,215,187,119,239,137,120,141,152, 94, 0,160,215,235,141, 26,141,134,102, 24, 70, 96, 48, 24, 56,189, 94,111,228,223, 73,
- 60,120,240,224, 97, 58, 56,142,107, 3, 64, 94,242,181,212,128, 34,127,233,179, 30, 37,203, 5,150,190,126, 75,190,103, 17, 4,
-113,191, 28, 71,217,113, 19,174, 5,128,108, 0, 79, 8,130,168,202, 8,178,189,170,239, 85, 10,173,180,180,180,163, 48, 97,209,
-104, 83,207,171, 6, 11, 74,214,137, 3,106,191,182, 91, 25, 7,195, 48, 25, 73, 73, 73,175, 93,160, 36, 73,190, 24, 56,112,160,
- 89,231,215,116,206, 65, 32,241,115,157,110, 79,208, 47,191,180, 60,191,117,171, 7, 67,211,142, 4,192, 81, 98,113,142, 94,175,
- 79,144, 27,141,143,205,181,100, 85,176,198, 60, 79,237, 19,255, 60, 21, 13, 26, 52,224,158, 61,123, 86,108,235,121, 61, 60, 86,
-169, 84, 94, 53, 85, 1,181, 90,221,201, 68, 49,184, 63, 53, 53,117,127, 37,130,253,128, 66,161, 56, 96,106,162,202, 22,149, 6,
- 72,150, 96,135, 53,237, 56,252, 8, 0,182,116, 81,233, 55,137,244,244,244, 24,148,196,121,123, 29, 36, 38, 38,234, 8,130,248,
- 99,213,170, 85, 99, 30, 61,122,116, 48, 45, 45, 77,199,191, 54,121,240,224,193,195, 60,145, 69, 16, 68, 80,201,247,192, 18,163,
- 80,208,203,159, 75,207, 41, 61,175,252, 57,165, 28, 47, 31,175,238, 90, 0,152, 63,127,254,215, 43, 86,172,144, 1, 48,117, 49,
-230, 90, 47, 42,253, 87, 33,227, 95,194, 81, 94, 20,236,248, 43, 50,250, 11,160, 7, 77,223, 1, 93,206, 39,223,248,102,141, 27,
-207,158, 61, 35,222,230, 7,174,116, 81,233,114, 8,248, 47,164, 59, 33, 33, 97,147,183,183,247,182,180,180, 52, 26, 60,120,240,
-224,193,195, 28,200, 43, 19, 70, 85,136,178,192,234,126,175,208,113,175,228,188,202,190, 19, 4, 17,180, 98,197,138, 64, 51,210,
- 91,102,209, 34,249,178,227,193,227,239,195, 63, 49,235,149, 7, 15, 30, 60,120, 84,142,151,173, 88,165,226,235,229,239,243,231,
-207,255, 26,213,143, 56,185,161,216,138,229, 86,242,189,204, 95,139, 64,241,204,129,202, 96,206,108,130,158,181,200, 95, 48,207,
-201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,174, 68, 16, 13,168,106,168,175,186, 97,196,151, 63,215,116,
-109, 77,231, 18, 4, 81, 85,152,159,210,161,194,178, 61,199,113,219,241, 55,160, 39,207,201,115,242,156, 60, 39,207,201,115,242,
-156, 60,231,235,128,227,184, 54, 28,199, 13, 64,241,132, 41,142,227,184, 1, 28,199,245,157, 63,127,254,130,210, 99,243,231,207,
- 95,192,113, 92,143,210,243, 74,206, 41,187,166,244,216,203,251,151,143, 85,119,110, 53, 73,156,244,210,231, 73,165,147,200,254,
- 45, 62, 90, 60,120,240,224,193,131, 7, 15, 30,149,162,116,198, 96, 57,107, 83, 22,128,176, 21, 43, 86,228,149,243,157,202, 2,
-240, 24, 64,139,146,243,178, 74, 68, 90,121,223, 42,125,201,119,125, 37,231,232, 77, 57,183, 10,108,175,226, 51, 47,180,170, 66,
- 11, 87,242, 91,111, 79,231,214, 37, 5, 0,142,101, 1, 0,108, 73, 12, 36,174, 52, 24, 18,203,130,227, 56,164,101,230,135,134,
-101, 98,113,109,255,207,207, 29, 14,206, 82,233, 58,150,227, 58,150, 28,186, 90,144,163,155, 21,161, 68,190,169, 28,141, 93,224,
- 47, 37,241, 21,203,161, 57, 0,144, 4,158,104, 89,252, 24,157, 97,126, 60,169,202,234,121, 83, 57, 38,137, 45,100, 35,109,237,
-236, 27,228,229,101, 63, 53,104,117,135, 35,179,176, 13,230,175,203, 8, 95,123,188,203,114,248, 26, 0, 41, 36,177,246,105,174,
-201, 51, 57,120,240,224,193,227,117,173, 35,175, 21, 23,143, 32, 8,166, 18, 78,226, 53, 57,249, 0,123, 38,136,173, 74, 14,223,
-171,228,216,253,127, 83,186,205, 18, 90, 77,228,152, 10, 2,203, 0,112,224,240, 77,100, 22,182,152,117,189, 27,122, 74, 41,106,
- 39, 0, 74,107, 96,102,115, 44,174, 85,122, 51, 73,116,150,138,168,181, 0, 88, 45,195, 76,136, 84,152,238, 47,214,212, 3,125,
- 5, 44,249, 7,203,113, 66,134,229,118,131, 67,144,149, 8, 55,239,164, 66,107, 78, 90,189, 61,157, 91,159,184,167,232,125,101,
-203, 12,180,107, 94, 31, 28, 67, 3,172, 17,178, 78, 95,225,242,207, 31,163,157,191, 55, 56,214, 8,176, 52,172,250,173, 65,191,
- 0, 91, 46, 44,179,118,235, 96,251,185,195,193,199,201, 57,124,199,142,157,174,238,190, 77, 8,150, 54, 32,230,222,197,209, 51,
-231, 46,233,222, 20, 5, 1,166,136,173,230,110,248,212,187, 78,163,175,102, 45,251,137,114,115,247,178,100,141, 58, 58,253, 69,
- 84,171, 13,171,151, 28, 21,145,137,107,159, 40,176,211,212,186,220, 68,142,201, 2,137,120,184,133,212,178,129, 90, 93,248,140,
- 49, 24, 15,147, 66, 65,223, 31,215,172,107,217,181, 87,127, 43,166, 48,157, 52,178,104,114,232,224, 1,159, 95, 54,109,238, 31,
-174, 96,222, 7,192,154,147,103,150,195,220,216, 61,147,250, 11, 5, 20,225,255,201, 14, 10,160,107, 37,180,252,157,241, 33,193,
-161,198,240, 18, 28,129,235, 81,153,216, 95,155,255,104,236,140, 95, 9, 14,126, 32,112,132,224,112, 32, 50, 11,153,252, 43,143,
- 7,143,183, 11, 36, 73, 94, 97, 89,182,219, 27, 22, 6,239,114, 28,119,135,191,187,255,191, 97,158, 69,139,192,119, 17,113,201,
-246, 96, 12,104,234,231,251, 45, 96,158,208,146, 82,212,238,251, 79, 51, 92, 65, 27,176,227,251,105, 7,245, 70,128, 54, 26,192,
-208, 70, 48,180, 17, 52,109, 0, 99, 52,130, 51,234,176,228,183, 43,128,190, 16,173, 3, 26,238, 6, 24, 55, 83,255, 67,200,145,
-127,132,222,184,232, 64,232, 11,176,127,203,138,207,147,179,138, 62, 15,126,146,150,221,196, 89,179, 32, 50, 19,191,155, 35, 8,
-174,108,157,129,189,199,207,164,172,255, 85, 21,205,114, 28, 28,108, 44, 26,141, 14,140,240,218,115,242, 74,242,186,221,218,104,
- 0,176,181, 20, 55, 26,251,228,169,247,235, 20,130,179, 84,186,110,219,230, 95, 92,221, 28, 45, 8,250,214, 74,208, 12, 3, 47,
-159, 1,212,130,233,163,221,190,251,121,231,207, 80,234,198, 85,119,125, 35,103, 52,169, 83,215,127,246,238, 51,183,188, 85,202,
- 76,253,197,125, 95,199, 65, 7,163,171,135,191,240,219, 21, 63, 81, 11,231,205,248, 82,207,164,220,141,201, 68,100, 77,239, 26,
-127,103,156, 92,177,114, 77,243,238,253, 2,173,216,162, 44, 74,171, 42,242,219,241,219,206,101,141,155,183,149,117, 10,240, 20,
-101, 30,158, 66,104, 10,115, 97, 32,165,146,238, 77,123,218,104,198,140, 50,238,216,181,119,122,100, 38, 54,152,147,103,166,220,
-176, 53,203,214, 62,234, 58,193,161,211,163, 59, 87, 38, 51,105,247,193, 49, 70,128, 49,148,237,193, 24,193,177,197,251,118, 83,
-126, 3, 80, 59,161, 69,114,232, 29,124,227,190, 91, 70,186,162,205,207,107,126, 88,192,221,191,127, 14, 12,254,136,202,197, 85,
-115, 5, 38, 15, 30, 60,254,213, 22, 19,154,227, 56,193, 27,230,236,207,113,220,217,215,164,249, 10,192,167, 37,159,119, 2,248,
-241, 13, 36,205, 19,128,107,201,231,116, 0, 41,124, 13,120, 45,148,197,205,122,249,187,185, 21, 74, 10,142, 5,142, 12, 6, 0,
- 11,115, 83,193, 1, 82, 16, 20, 96, 84, 97, 80,191, 94,112,114,118, 5,140,106,192,160, 6,140, 26,192,168, 2,140, 26,100, 43,
- 18, 1,131, 10,136, 63, 7,154,227, 36,102,103, 87, 87, 0,196, 30, 70,143, 86,222,144,219, 74, 49, 99, 80, 19,167,237,231, 99,
-119,238,188, 24,211, 51, 50, 19, 35, 77, 74, 43,199,161, 93,179, 6, 88,191, 83, 21,125,250, 97, 86, 31, 0,232,223,194,241,124,
-187, 38, 62, 94,235,118,107,163,207,134,229,245, 5,128,190, 77,109,206,181,109,228,230,205,162,246, 86, 95,150,227, 58,185,215,
-105, 64, 48,143,182,129, 85,166, 64,169,212, 32,229,197, 30,216,123,188, 67, 50, 44,186,212,116,189, 5,133,249, 95, 44, 92, 37,
- 84, 43, 51,244,172, 33,139,145, 83,121,148, 64,204, 18, 72,189,170, 43, 98,243,153, 89,147, 62,166,103, 47,254,126, 62,128,209,
-213,241, 52,113,198,244,181,107,215, 53,235,208,186,177,115,250,209, 25, 68, 81, 94, 6,104, 74, 38, 25,244, 94, 7,216, 53,108,
-194,102,132,172, 37,196,190, 61, 97,231,232,139,212, 91,251,144,112,231, 24,209,177,213, 80,201,239,251, 69, 99, 0, 67,165, 66,
-171,129, 19, 58,246,233,220,246,160,175,183,187, 27,199,177, 96, 89, 14, 28,203,160, 72,107,196,130, 67,241, 96, 24, 6, 31,244,
-233,216,195, 82, 76,112, 44,203,130,227, 88, 36,167,231,168,255,188, 27,221, 35, 62, 15,119, 77,177, 84,181,120,183, 91,199, 39,
-161,119, 26, 27, 99, 79,163,245,232, 21,209, 4,112,163, 92,157,235,248,240,194,239,141,129,223,106,175,229, 8, 48, 9,231, 87,
-194,187,243, 36,106,219,254,243,242,130,172,212,177, 71,247,108, 30,182,101,219,182,189,209,153,152,194,191, 95,120,240,120, 59,
-192,113,220, 27, 23, 91,137,137,137,105,175, 35,182, 60, 60, 60, 58,167,166,166,174, 46,245, 86, 33, 8, 98,117,157, 58,117,150,
-252,175,163, 90,161,175, 87,192, 48,204,232,212,212,212,107,213,113, 14, 24, 48,192,253,204,153, 51,117,203,113,214, 5, 80,183,
-178,115,237,236,236,152,246,237,219, 39,156, 57,115, 38,141,175, 33,181, 18, 92,102, 11,173,232,164,195, 51, 90,233, 20, 69, 0,
- 16,109,194,249, 21,134,252,180, 70,102,229,174,101, 31,175,108, 90,199, 1,133, 42, 61, 46, 62, 72, 0,195, 24,193,208,116,137,
-101,139, 6, 67, 27,209,167,133, 19,218,107,167, 96, 67, 80, 12,104,134, 93, 81, 29,231,203, 48,112,236,135, 45,123,142, 56,196,
-178,156, 88, 34, 36, 11,252,188, 28,157,103,127,208,130,156, 49,168, 41, 52, 6,122,196,190,144,184, 63,163, 50,177,195, 36, 78,
-246,213,144, 71, 92,101,199, 24,186,198,188, 87, 99,141,106,215,179,107, 39, 27, 78, 87, 0, 99,118, 60, 10,213, 70,196,231, 24,
-145,174,205,135,132, 80,152,196,201,114,104,238,233,225, 38,187,121,112,222, 11, 71, 74, 41,112,166,104,145,152,164,193,176, 28,
-197,229, 71,234, 28, 26,247, 18,150,250,109, 85,151, 78, 11,153,245,199,157,123, 15,176, 77,218, 55,137,176,240,235, 3,231, 86,
- 94,120,113,109, 23, 50, 31, 4, 33, 39, 45,129,176,209,230,195,197,177, 62,250,141, 30,137, 31, 71,182, 65,161,178, 16,148, 34,
-206, 86, 44,148,216, 1,134, 74, 57, 57, 6,163,215,174,250,222, 77, 64,145,197,247,179,116, 99,140,208,232,116, 0, 67, 67, 42,
- 96, 65,112,165,191, 25,193, 24, 13,178,230, 67,231, 77, 3,152,187, 53,229, 61, 42, 19,251,155,200,209, 9,172,177, 49,103,212,
-128, 0,110, 68,102,253, 79,252,248, 59,227,195,119,250,140,239,196, 17,184, 94,155, 50, 10,112, 68, 96,235,186, 86,150,150,202,
-104,164, 28,249, 28,113,144,114, 46, 29, 62,197,135,159, 76,151,109,223,190,125, 32,192, 77, 69, 69, 31,181,191, 98,145, 85,158,
-147,231,252, 79,114,218,216,216,212,171, 83,167,206, 18,163,209,216, 89, 36, 18,185, 24, 12, 6,176, 44,155, 46, 22,139,175, 39,
- 36, 36, 44, 87, 42,149,207,255,109,121,127,242,228,137, 57, 98,171, 70, 78,161, 80,136,152,152,152,103,102,136,173,224,151,174,
-255,227,198,141, 27, 56,116,232, 16, 0, 32, 54, 54, 22, 13, 27, 54,180,172,236,194, 23, 47, 94, 88,118,237,218,245, 15, 0, 94,
-213,113,134,133,133,213, 59,125,250, 52,142, 28, 57, 2, 0,136,137,137,129,159,159, 95,165,137,185,113,227, 6,245,209, 71, 31,
-213, 3,144,246, 55,148,209,219, 32,178,202,239,255, 39,180,130,130,130,184,192,192, 64,226,229,207,149, 32,222,219, 94,220, 10,
- 90, 6, 0,226,205, 77, 65, 84, 6, 86,173,223,115,161,239,229, 35,155, 58, 75, 69, 36,150,238,152,157,156,149, 91,248,174,128,
- 40, 30,126,161, 57,144,246, 86,226,219, 43,198,182,240,206, 43,210,226,212,189,212,107,145,153,230,153, 72, 35, 21,184, 4,176,
-118,197,223, 24,104, 53,153,126, 99,127,188,116,224,192,252,190,205,103, 13,106,142,147,183, 18,102, 1,116,141, 81,223, 57,150,
- 5,199,210,101,206,239, 37, 93, 7,128,173,184, 40, 48, 11,174,248, 24,107,158, 69,171, 11, 32,200,115, 70, 63,107,153,120,227,
-228,201, 19,109,140, 89, 79,145,171, 23, 33, 57, 79,139,116,141, 16, 69, 2,103,164, 70,135, 49, 36,129, 75, 53,154, 92, 8, 40,
- 57, 90,107,103, 47,182, 34, 3,122, 77,243, 80,158,255, 58, 79, 76,208,148,205,144,239,236,178, 47,255,148, 64,171,178, 84, 4,
-129, 26,195,207,219,218,218, 53,212,230, 36, 80, 5,121,217,176,115,109,138,190, 35, 2,241,205,128, 38, 40, 84,170,144,149,123,
-155,107,224,102, 67, 36, 94,223,139,133,253,252,145,147,161,128,206, 8, 16, 42, 93,174, 86,175, 45,170,242, 62,146,216, 54,115,
-206,220, 15,125,220,228,150,165,147, 10, 56,150, 65, 11,127, 95,244,234,220, 14,151,110,220,196,253,176, 88,176, 37,147, 10, 56,
-150, 69, 74,102, 94,134,214,192,236, 50,235,134, 50, 52, 56,163,182, 82, 33,134, 90, 12, 25, 6, 56, 67,198, 0,139,219,212,179,
-158, 48, 63,208,199,218, 82, 66, 64,107,100,160,213, 27, 81,120,115, 35, 28,235, 52,131, 76, 42, 37, 90, 65, 35,120, 8,240,235,
- 22,242,224, 81, 14,195,134, 13,147,102,100,100,132,120,121,121, 53,233,213,171,151,172, 83,167, 78, 80,169, 84,184,120,241, 34,
- 84, 42,149,143,151,151,151,207,197,139, 23,135, 38, 37, 37, 69,122,122,122,118, 61,114,228,136,201, 62,180, 37, 2,136, 42,123,
- 5, 3, 52, 65, 16, 40, 57, 70,148, 28,171,245, 58,183, 98,177, 24,137,137,137,111,220,178,149,154,154,250,172, 54,150,173,162,
-162, 34,145,135,135, 7,228,114, 57, 24,134,129, 74,165,194,137, 19, 39, 80, 80, 80, 0,150,101, 97, 97, 97,129,239,214,238, 64,
-244,195, 16,220,189,123, 23, 5, 5, 5,162,154, 56, 83, 82, 82,136, 22, 45, 90, 64,167,211,129,166,105,104,181, 90, 4, 7, 7,
-151,125, 23, 8, 4,152,251,237,207,136,125, 16,130, 71,143, 30, 33, 37, 37,229,111, 89,109,196, 12, 45,242,111, 68,149, 49,179,
-254,246, 89,135, 12, 67, 47,216,190,251,192,237, 5, 83, 70, 98,250,168,158, 94,203, 55, 29,235, 25,149,141,221, 0,224,239,132,
-177, 99,186, 53,240,182,147, 9,241,205,190, 7, 0,199, 45,120,221,255,139,200, 69,108, 19, 23,118,214,241,187,137, 33, 95,143,
-108, 5, 95, 55,155,134,121,226, 92,113,124,188, 9,107, 10,178, 52,236,173, 36,141,250,183,112, 60, 15,150,133,157,181,164, 49,
- 24, 26,118, 86,146, 70,125,155,218,156, 3, 0, 27,153,176,113,101,150,175,170,208,218, 75, 56, 73, 38, 17, 76,178,180,182,243,
- 30, 55,176,151, 69,255,129, 67, 45,172,132, 52,114,238, 94,132, 82,232, 9,163,131, 15,116,198, 92,164, 60,143, 99, 46,223,137,
- 74,205, 46,212,205,174, 49,153, 28,174,165, 62,143,145,215,107,222,203, 62, 59,104, 97,102,189,241,251,234,146, 96,201,194,189,
- 67, 50, 44,157,219, 90,220,139,127, 94,196,114,149, 90,116, 42, 64, 89, 80,144, 96,100,224,166, 97, 4,214,113, 87,126,199,252,
-126,205,144,151,155, 9,173,129, 70,129,134, 54,184,218, 73, 37,186,231,225,208, 25,104,232,141, 44,132,118, 30,184,120, 59, 44,
-155, 53, 26,207, 85,197, 25,159,131, 71,241, 39, 30, 89,149, 63,230,235,132, 22,243,108, 44, 30,193,168, 65, 98, 74, 26,118,159,
-185,221, 42, 62, 7,143, 94,167,156, 57,150, 46, 30,126, 46,103,201, 34, 56,116,170,141, 19,124, 99,103,180, 21, 73, 69,191,172,
-158,245, 81,147,247,252, 28, 36,108,202,109, 16,172, 1,150,140, 0, 26, 49, 3, 91, 47, 95,176,250, 66, 78,173,213,230, 71, 0,
-124,164,119, 30, 60,202,161, 81,163, 70,174,169,169,169, 17,115,230,204,113, 24, 50,100, 8,142, 31, 63, 14,165, 82,137, 93,187,
-118, 97,221,186,117, 88,182,108, 25,140, 70, 35,182,111,223, 46, 59,122,244,104,219,205,155, 55,167,120,123,123, 55, 77, 74, 74,
- 74,175, 65, 96, 17, 0, 36, 0,132, 37,109, 23, 1,128, 61,123,246, 44,250,247,239,143,179,103,207,178, 37,199, 24, 20,119,126,
-106,181,158,168, 88, 44,134, 88, 44, 70, 65, 65,193, 27, 17, 91, 66,161, 16, 86, 86, 86, 16,139,197, 40, 44, 44, 52, 91,108,209,
- 52, 77,165,164,164,160,160,160, 0,189, 6, 14,196,207, 43, 86,160, 91,183,110,232,213,171, 23, 56,142, 67,112,112, 48,122,118,
- 8,192,200,247,187, 34, 42, 42, 10, 52, 77,155,148,222,244,244,116,100,100,100,160,239,192,129,216,177,121, 51,218,181,107,135,
- 70,141, 26,129,166,105,132,132,132, 96, 88,159, 14,144, 14,238,137,216,216, 88,190, 82,155,110,205,122, 35, 62, 90,175,141,136,
- 44,220, 97, 79, 94, 13, 26,213,167,109,224,192,142, 77,176,227,224,229,239, 33, 87, 30, 0, 0, 71,157,228,187,143,187,249, 34,
- 50, 41, 15,151, 31,165, 5, 69,101,227,141,204,214, 96, 25, 56, 57,218,200, 0, 74, 12,141,129,165,109,226,107,118, 96,102, 57,
- 14,178,206,243, 48,102, 96,164, 87,187, 38, 94, 94,165,179, 14,173,250,255,132,177, 97,207,188,219, 52,114,245, 6, 99, 4, 24,
- 35,108, 70,238, 3,190,181,172, 49, 29, 29,234,138, 47,205,156, 49,163,125,191,193, 35, 44,196, 50, 91, 48,202,100, 24,211,195,
-144,243,244, 26, 84,178,134, 72, 79,140,199,161, 11,119, 11,158,166,228, 40, 73, 18, 23, 51, 10,116, 95,197,231,161,168, 38, 94,
-173, 17, 43,150, 44,156, 61,224,208,129,131,214, 18,223,142, 68,220,198,254, 5, 98, 1, 45,145,215,125,135, 84, 75,157,184, 31,
-118, 29,180, 81,233,177,178, 38, 30,181, 74,121, 44,248,226,249,145, 13,234,117,180,126,113,255, 12, 52, 90, 29,116, 70,160,105,
-219,174, 96, 24, 78, 76,144, 4,107, 67, 81, 68,102, 78, 30, 8, 35,147,113,253,241, 11,197,141,199,241,148,206, 26, 43,171,141,
- 46,242,178,186, 39,168, 47, 6,118,109, 9, 24, 53,120,191,115, 51,252,188,247,242,231, 0, 51,254,245, 10,185,216,162,197, 1,
- 29,155,200,177,149,227,208,241,193,137,117,141, 91, 15,158, 9,115, 44, 90, 77,157,208,207,191,158,251,239, 63,127, 55,207,193,
-209,179, 33, 69,176, 70,112,174,205, 1,101, 10, 71,164,220,134,173, 71, 59, 48,238, 29,176,125,195,154, 34,150,229, 14, 0,224,
-167,100,243,224, 81,254,125,164,213, 30, 91,181,106,149, 67, 96, 96, 96,169, 69, 6,183,111,223,198,206,157, 59, 97,105, 89,241,
- 61,217,191,127,127,112, 28,231,176,116,233,210, 99, 0,222,171,138,179,125,251,246, 3, 31, 61,122,148,214,178,101,203,248, 18,
-177, 37, 2, 64,134,135,135,147,201,201,201,132,189,189, 61,231,238,238,110, 76, 75, 75, 99, 1, 48,159,124,242, 9,117,248,240,
-225, 6, 42,149,234,106,109,133,150, 88, 44,126, 35, 62, 91, 66,161, 16, 4, 65, 64, 44, 22, 67, 36, 18,129,227, 56,179,196, 22,
-195, 48,130,179,103,207,226,193,131, 7, 88,214,178, 37,102,121,120,192,193,193, 1, 33, 33, 33,224, 56, 14,150,150,150,200,205,
-205,197,129, 3, 7,208,189,123,119,208, 52, 45, 50,133,247,200,145, 35, 8, 13, 13,197,183,173, 91, 99,150,173, 45,172,172,172,
- 16, 28, 92, 60, 26, 40,145, 72,144,152,152,136,224,224, 96,116,237,218,149,175,212,175, 9,147, 43, 79, 23, 64,144, 75,192,213,
-160,215,128,163, 57,128,128,187,191, 63, 68, 81, 81, 21,157,115, 76, 1, 73, 98,225,134,221, 65, 3,126,154, 57,144,152, 52,168,
-149,251,242,223,175, 76, 5,128, 9, 31,248,121,200, 36, 2,172, 63, 25,201,145, 36, 22,190,137, 12,250,251, 67, 68,228, 96,106,
-175,118,141,144,150,175, 71, 92, 90,254,159, 81, 38, 14,245, 92,254,105, 12,246,156, 10, 73, 94,183, 71, 27,205,113, 28,236,172,
- 36,141,198, 62,137,243,254,253,108,104,210,218, 67,218,104,142,229, 96, 39, 19, 54, 30, 31,213,161,198, 89,135,173,189,132,147,
-190,156, 61,187,195,160,241,115,164,116,244, 97,232,227, 46,128, 53,104,160, 52,136,144, 79,185, 34, 37, 41, 9, 63,108, 15, 74,
- 86,170,244, 35, 35,178,204, 19,152, 79,115, 80, 36, 32,148, 67,126,248,230,235, 75, 43,190, 91,106,165,137, 15, 41,162, 8, 90,
- 67,213,233, 34,248,110,217, 79, 68,161, 78, 63, 34, 62, 15,133, 53,241,232,172,177,114,213,218, 13, 3, 38,142, 30, 26,237,215,
-176,139, 35,147,246,220, 81,171, 84,102,238, 59, 31,234, 90,210, 83, 36, 0, 32, 46, 37, 7, 89, 5, 42,154,161,141, 87,173,133,
- 88, 30,105,138,117,176, 4,245,156, 33, 15,236,216,244, 35,185,181, 8,154,162,124, 56, 91, 11,209,167, 93,253,143,140,247, 98,
-231, 61,207, 52, 71,174,189, 44,180,140,224,140, 26,220, 89,217,189, 49,199, 24, 27,131, 49,194,240,228, 15,243, 45, 99, 4,102,
- 77,239,108,101, 99,175,127, 65, 66,101, 9, 88, 56,129,176,241, 1,108,235, 18, 66,255, 17, 72,139,143,160, 63,255,104,116,206,
-243,132,148, 95,157, 44,222,200,204, 31, 30, 60,222, 42, 36, 38, 38,126,188, 96,193,130, 27,237,218,181,115,113,114,114, 66,179,
-102,205,112,234,212, 41,204,153, 51,167,236,156,150, 45, 91,130,227, 56,228,230,230, 98,213,170, 85,233,105,105,105, 31, 87,219,
- 65,143,136,136,222,179,103, 79,231, 38, 77,154, 24, 68, 34, 81, 62, 0, 73,126,126,190, 52, 55, 55,151,208,106,181, 96, 89,150,
-181,181,181,101,210,210,210,140, 35, 71,142,212,221,186,117,171,190, 74,165, 74,124, 29,139,150,151,151, 87,120, 78, 78, 78, 1,
- 65, 16,175, 29,250,161, 84,100, 57, 57, 57,201,139,138,138, 88, 0,121,181, 9,253, 64,211, 52, 90,183,110,141, 11,215, 30,226,
-236,229, 91, 80,166,197, 96,234,196,143,209,172, 89, 51, 92,184,112,161,214,101,214,162, 69, 11,156, 15,190,129, 27, 15, 30, 35,
- 49,246, 9, 62,159, 58, 17, 77,155, 54,197,249,243,231,249, 10,109, 58,206,160,162,111,214,153,151,133, 86,215,160,160,160,210,
-158,249, 43,242,181,177, 19, 90, 8,237,196,127, 44,237, 87,223, 95,216,107, 41, 8,161, 5, 14, 55, 60,223, 97,225, 15, 27,163,
- 41,231,196,209,225,153, 53,207, 14,171,240,208,100, 34,130,187, 27,189,255,113, 84,227,143,222,111,231,133, 29,167,100,139, 1,
- 96, 68,167,122,184,247, 52, 11,119, 99, 51,247, 71,102, 33,226,117,115, 29,224, 12, 25,147,141,253,171,190, 24,212,213,199,211,
- 21, 59,143,223, 0, 65,224,152, 73, 13, 46,199,113,237,154,248, 96,221,158,151,103, 24,186,122,175, 61,164,141,190, 24, 81,216,
- 15, 0,122, 53,150,157,107, 83,223,222,155, 43,239,184, 85, 9, 44,196,130,201,253,134,142,145,210,177,167,128,132, 96, 16,180,
- 14, 26, 3, 11, 69,118, 33,212,182, 94, 8,185,253, 88, 83,160,213,207,140,204,170,157, 21, 47, 42, 27,241,162,251,143,147,138,
- 84, 26, 55,153,188,190,150, 34, 89,182, 72,199,225, 94,100,130, 50, 50, 29, 49,166,112,196,199, 67,255,174, 7,221,105,235,238,
- 67, 75,132, 34,241, 8,138, 0,225,108,103, 41,223,250,211,183,176,182,182, 2,171, 47, 2, 84, 89, 24,242,217, 15, 89,225,105,
-198,122, 0,208,208, 17, 86,157,234, 9,119, 11, 72, 34,229, 74,156, 97, 81, 77,255, 65, 24, 49,101,116,159,150, 66, 86,175,194,
- 23,171, 14, 98,219,188, 65, 24,211,195, 95,120,230,102,236, 20, 0,203,107, 91,214, 28, 67,131, 51,106,240,222,215,215,162, 9,
-224, 6, 7,116,124,112,232,187,198,192, 67,147, 57, 90, 1, 66, 70, 64,248, 55,247,182, 20,177, 41, 55,193,166,220,228, 40,175,
- 14, 32,188, 59, 19,132,107,107,238,151,213,203, 84, 59,118,236,188,200,146,248,198,132, 80, 25, 60,120,252,127, 69,124, 90, 90,
- 90,223,254,253,251, 95,190,112,225,130, 67, 64, 64, 0, 0,224,193,131, 7,197,157,206,214,173,225,231,231,135,140,140, 12,140,
- 26, 53, 42, 91,161, 80,244, 69, 13, 62,191,133,133,133,207,143, 28, 57,226,162, 82,169, 90, 46, 90,180, 40,211,199,199, 71,169,
-213,106,137,252,252,124,150,166,105,216,219,219,139, 91,182,108,137,246,237,219, 23,221,190,125,187, 78,114,114,114, 33,128,132,
-218, 36,126,208,160, 65,184,118,173,120,210,222,155,136,171, 37, 18,137, 16, 16, 16,224, 17, 31, 31,159, 90,210,182,152,253,142,
- 47,223,188, 60,126,252, 24, 87, 31,166, 64,160,215, 64,156,149,134, 59,199,143, 96,224,228,105,160,233,218,123, 49, 60,126,252,
- 24, 39,130,239,192, 82, 34, 64, 76, 76, 4,142, 28, 57,130,169, 83,167,190, 22,103, 45, 81,173, 22,249,151, 67,129, 42,252,180,
- 4, 0, 16, 24, 24,120,181,212, 90, 81, 30,190,190, 16, 75,138,176,180, 87, 43,143,185, 35, 58,214,167,140,202, 52,176, 12, 11,
- 74, 8, 56, 59,217,224,143, 63,246,215,219,127,240,224,237,205,155, 54,111, 96,105,122, 97,120, 38,212,102, 36,106,233, 79, 7,
-111,140,248, 99,118, 87,193,212,126,141, 29, 0, 64, 36, 32,177,254, 84, 4, 13, 96,233,235,228,246, 93, 15, 72,139,140,152,228,
-236,104,187,120,193,167, 3, 28,186,182,246,195,213,187,225,216,112,228,246, 53,113, 38,246,152, 92,185, 89, 35, 94,214, 79,149,
-205, 58, 4, 91,179,223, 37,195,112,174, 34, 75,123, 24, 18,174, 0, 6, 45,180, 58, 3,146,115, 24, 36,231,106, 33,144,137,240,
- 32, 54, 69,227,152,142,160,215,200, 54, 97, 41,147,186, 47,249,126,173,167, 86, 83, 68, 43,243,178,105,145,248,142, 80,102, 33,
- 81,152,227,170,112, 39, 21,218,206,117,133,239, 0, 44, 37,150,114,234,175,191, 28,103,153, 26,121, 1, 13,200, 52, 16, 28, 7,
- 11,255, 1,176,182,160, 68, 29,235, 8,147, 0,192,210, 82, 38, 94,245,205, 28,219,153,243,190,169,209, 7,204, 31, 16,249,249,
-186,206, 12,240,177,199,181,208,104, 92, 11, 75,140,184,246, 32,166,105,183,102,238,240,243,180,155, 33,206,203, 95, 25, 5,243,
- 45,164,197, 5, 67, 3, 70,109,217,172, 67,127,103,124,216,102,196,162,170,102, 27, 86,138,186, 0, 27,203,112, 32, 40, 10, 32,
-200,226, 25,144,201, 55, 33,176,243,229,246, 31, 58,161,222,185,115,207,183, 81,217,188, 21,139, 7,143,154, 80, 80, 80,240, 36,
- 42, 42,170, 79,243,230,205,119,125,241,197, 23,214,163, 71,143,118,159, 56,113, 34, 9, 0, 25, 25, 25,236,186,117,235,210,126,
-249,229,151,130,236,236,236,241, 70,163, 49,204,148, 39, 92,161, 80,220,250,245,215, 95,179,174, 95,191,222,180,109,219,182,146,
-119,222,121,135,181,183,183, 23, 72, 36, 18, 70,175,215,107, 99, 99, 99,153,248,248,120,183,252,252,252,103, 0,226, 80,139, 97,
-253, 18,235,213,114,138,162,150,112, 28, 23,240, 38,124,180,100, 50,153, 59,128,103, 4, 65, 52, 48,119,216,240,149, 6, 91, 32,
- 64, 94, 94, 30,212,233, 17,144,166, 60, 69,115, 75, 18, 77,236,173, 96, 99, 99,243, 90,162,168,160,160, 0, 80,165,226,198,141,
-199, 0, 77,195,214,214, 22,182,182,182,127,187,208,170, 74,139,252, 71, 48,169,146, 99,213,251,104, 53,145, 99,170,133, 30,235,
- 38, 15,168, 47,170,235,237, 9, 93,202, 3, 60, 78, 46,194,194,119,219, 70, 82, 18,107,237,228,143, 7,181, 30, 58,172, 14,186,
-182,111, 67,212,117,179,157,177,242,167, 45,159, 53, 65,246,156,200, 76,172, 55, 37, 69,145, 89,120,206, 34,115,231,149, 39, 41,
- 83, 60,101, 26,176, 44,135, 43, 97, 10,132, 37,228,237,140,206,194,115,115,114,215,196, 13, 61, 5, 32, 15,114, 28, 39,181,181,
-180, 44,108,226,231,233,212,243,189, 22,100,223, 46,173, 33,162,128, 27,247, 30, 99,214, 79,199,238,176, 44, 55,192,228, 25, 98,
- 44,251,138,128, 42,158, 97,104,172, 48,195,144,227, 56,174,120,214, 97,245,110, 95, 20, 69,164,171, 19,239,187, 10, 29, 27, 66,
- 19,119, 5, 9,121, 44, 18, 51, 11,161, 20,184, 66,151,154, 10,112,108,210,213,215,112,172,118,114,114,114,174,215,196,175,254,
-198,221, 71, 96, 80, 23,224,121,200, 46, 20,229, 41,240,221,214, 83,245, 61, 60, 28,187,164,166,166, 94, 53,227,101,227,119, 57,
-104,191, 51, 56,128, 18, 74,112,102,243, 33,100, 59, 90,192, 73, 38, 2,171,201,194,228,153,163,109,251,245, 26,109, 11, 0,137,
- 49,143,224, 35,211,152,196,107,112,196,208, 17,221, 26,217,193,168,193,238,243,143,180, 36,208,119,207,197,136,184,110,141,237,
-164, 35, 58,250,216, 47, 79,203,255, 0, 57,181, 11, 42, 90,106,209, 42,179,240,213, 98,182,225, 17,128,105,204, 34,238,224,173,
- 76,203, 97,189,222,145,137, 4, 4,193, 21,165,130,179,112,194,150,221,135,139,196, 70,108, 7, 15, 30, 60, 76,130, 70,163, 9,
-213,104, 52,205,190,250,234,171, 15,191,254,250,235,206,150,150,150,245, 0, 64,165, 82, 61, 55, 26,141,215, 74,158, 79,115,102,
- 7,114, 0,158,197,197,197, 61,143,139,139,115,217,187,119,175, 29, 0,105,201,111, 90, 0,249, 0, 50,240, 26, 51, 14, 75, 69,
- 21, 65, 16, 75,222,212,125, 40, 21, 85, 4, 65, 52,168,205,245, 36, 73, 50, 4, 65,128, 32, 8, 72, 36, 18, 92,191,126, 29,195,
- 7,244, 66,212,153,124, 4,216, 89,161,237,248,201, 56,120,233, 18, 40,138, 2, 65, 16,160, 40,202,172,118, 68, 32, 16,224,198,
-141, 27, 24, 51,106, 24, 36, 2,192,214,214, 22, 95,125,245, 21, 78,158, 60, 9,129,128, 95,165,207, 12,108, 47, 39,184, 76,140,
-163, 69, 96,249,165, 93, 63,136,192, 24,113,122,215, 26, 4,133, 23,233, 99,178,176,176, 81, 22,214, 29, 65, 33,155,245,211,158,
- 41,151,110,132,255,248,201,200, 64, 89,247,110,189,208,189,107, 55, 65,211, 54, 93, 22, 3, 21,132, 86, 79, 84, 19,107,131, 97,
-241,237,246,243,209,147, 15,134,196, 18, 48, 20, 98,100,239, 54, 28,195,226,219, 26, 50,243, 10,167,173,133,213,193, 27,183,111,
-219,195, 80,132,132, 71,127, 74,235,212,171, 15, 48, 6, 60,123,246, 20,191,236, 62,206,134,220,139,249, 67, 79,227,139,248, 60,
-168, 76,229, 44, 86, 86, 52,108, 45,197,141,250, 54,181, 57,199,130,131,157, 76,212,152, 99, 25,216,201,132,141,123, 53,150,157,
-227, 56,142,179,182, 16, 54,230, 24, 99,141,156, 26, 61,189,109,247,111, 59,215, 78,152, 48,193, 50, 59, 37, 29,105,202,112, 20,
-137, 61, 96,148,121, 33,238,209, 53,141, 90, 71,155,210,136, 87,121, 63,179,179,179, 51, 67,239,230,226,224,214, 21, 48,234,117,
-200, 76, 41,214,170,105,217, 74,216, 56,121,220, 78, 77, 77, 53,153,211, 64,179, 5, 67, 71, 79, 18, 89, 88,195, 98,204,208, 64,
-113, 92,142, 14,173,220,173,139, 95, 26, 69, 89,136, 10,190,129,174, 37, 62,166,241,201, 36,124, 90,184,155,148, 78,107,169,232,
-139,126,239,120,224,121,146, 2,215, 35, 82,119, 63,207, 69, 26, 19,173,216, 29,151,150, 63,101,208,187,222,248,249,100,228,231,
-128,113,191, 57,121,247,119,198,135, 28,135,142,197,206,240, 26,112, 64, 71,127,103,124,104,226, 76,195, 87, 56, 5, 34,124,180,
-246, 92,226,162,195,247,179, 7,205,253,168,147, 77,251,246,253,197,160,245, 40,212,232,140, 81,249, 80,190, 78, 25,189, 6,120,
- 78,158,243,191,202,201, 0,248,195,104, 52,254,145,159,159,255, 38, 57,211,240,106, 92,167,215,202,123,249, 97, 66,142,227, 4,
- 37,214,172,154,156,225,171,229, 44, 63, 76,200,113,220,217, 18,107, 86, 77, 86,173, 10,156, 44,203,166,181,110,221,218, 97,224,
-192,129, 96, 24, 6, 79,159, 62, 69, 98,114, 50,122, 78,249, 28,118,118,118,184,246,228, 9, 98, 98, 98,176,100,201, 18, 24,141,
- 70,156, 56,113, 34,165, 38, 78,129, 64, 96,168, 95,191,190,104,240,224,193,160,105, 26,241,241,241, 72, 77, 77,197,172, 89,179,
- 96,107,107,139,208,208,208, 50,206,236,236,108, 8, 4, 2, 67, 37,214,173,191,162, 46,253,215,241,138,200,170, 94,104, 1, 12,
- 24, 35, 10, 46, 45,197,250,235, 48, 24,140,104, 28,153,133, 23,145,255,179, 72,109,161,238, 62, 57,253, 36, 60,250,121,232,205,
-238, 98,100,134,193,220,158,196,211, 28, 40,172,165,133,133, 48, 20,218, 32,254, 28, 94,100, 20, 22, 61,205,129,194,236, 30, 3,
-203, 16, 48,168, 1,197, 3,220,186,118, 21, 33,119, 30,227,126, 88, 52,115, 43, 52,246, 32,201,226,219,168, 28, 60,173, 69, 47,
- 4, 86, 3,126,198,184,176,103,222,109,252, 92,188,193,208,224, 88, 35,108, 71,238,199,248,200,246,222,109,124,237,188,139, 45,
- 89, 70,216,127,250, 39,176, 86, 90, 45,223,131,100,227,118,241,201, 11, 31, 20,230,231,188,219,163,203,123,150,182,254,253,144,
-253, 44, 22, 79, 31,223,208,132,134,199,221,122,144,108,124, 45,107,137,135,135, 71,231, 30, 93, 26, 97,228,228, 5, 48,168, 11,
- 16, 31,242, 27,138,114,211,113,253,182, 21,162,149,202,247, 0,152,108,209,186,157, 68, 55, 69, 82, 30, 58,212, 17, 38, 89, 67,
-231,250,113,224, 64, 72, 8, 45, 88,157, 18,132, 58, 27,113,169,250,130, 15,182, 38, 51, 0, 32,147, 16, 2, 75,174,192,198, 36,
-203,163,143, 99, 67, 25,101,196,158, 75, 17, 96,217,226,229,155, 88, 22, 91,246,252, 25, 55,229,219, 49,173,208,196,219,190,197,
-163,212, 76, 2,102,152,252, 9, 14,157,238, 31,252,166,177,246,242, 98,128, 53,224,198, 12,135,198,157,214,231,118, 66, 45,151,
-219, 9, 79, 67, 42,128, 41, 16,168,183,205, 88,127,126,113,235, 75,145, 29,103,127, 58,200, 6, 28,191, 0, 59, 15, 30, 60,254,
-126, 20, 21, 21, 77, 30, 63,126,252, 54,161, 80, 40, 7, 64,176, 44, 11,150,101, 5, 63,254,248,163,144, 97, 24,146, 36, 73,134,
-162, 40,250,236,217,179, 70,134, 97,178,180, 90,237,228,154, 56,105,154,142,155, 54,109, 90,253,154,102, 40, 30, 56,112,160, 84,
-100,197,241, 37, 97,146,200, 42,191, 47,179,114, 85,221,120,112,248,166,195,152,165, 75, 1, 16,224,176, 44, 50, 11, 47, 94, 62,
- 37, 44, 23,105, 77, 40,195,172,166,109,186, 44, 45,189,198,220,148,105, 25,102, 88,155,102,126, 7, 0, 64,199, 49, 99,106,147,
- 59,165, 78, 51,162,101,155,247, 14,178, 28, 39,160, 57,110, 39,201,226,168,150, 70,148, 41, 51,237,170, 66, 90,102,126,104,191,
- 0, 91, 14, 40, 30, 50, 44, 27, 46, 44, 9,227,192,113, 28, 87, 54, 92,184, 70,138,236, 2, 93,141,113,160,110,190,208,247,210,
-211,247, 39, 93,188,249,104, 50,195,112,174, 20, 69,164,107,244,244,182,215, 21, 89, 0,144,154,154,122, 53,248, 82,234,197, 39,
- 45, 92,122, 59,201, 74,172, 92,106, 32, 91,141,139,169, 89, 69, 87,107,195,153,167, 50, 14,250,122,221,201, 83, 98, 33, 37, 0,
-199, 21, 7, 20,229, 56,104, 13, 76,238,237, 36,186, 41, 0, 52,115,128,251, 87, 39,232, 3, 20, 69, 36,214,196,119, 55, 70,241,
-243,200,149,193,115, 34, 18,242,118, 38,228, 35, 28, 0, 18,242, 17,126,232,198,139,197,113,233,133,115,194, 19,243,214,192, 76,
-191, 10,142,192,245, 54, 35,151,190,114,236,117,239,103,180, 2,143, 1, 12, 1, 82,122,141,156,253,203,108,130, 0,191,252, 4,
- 15, 30,255,143, 80,106,213, 34, 73,114,249, 27,228, 60, 75, 16, 68,127, 0,207,204,184,236,110, 81, 81, 81,179, 55,156,189, 28,
-154,166,115, 76, 57,241, 31,112,136,255,175,226, 31,115, 45,233,201,115,254,253,156, 13, 26, 52,224,204, 16, 44,252,253,228, 57,
-121, 78,158,243,255, 21, 39,199,113,212,235,108, 85,112, 18,175,179,241,101,244,159,199,203,206,240,147, 74,141, 19,252,112,200,
- 91,136,103,207,158, 17,252, 93,224,193,131, 7,143,202, 65, 16, 4,243, 23,112,242,193,139,121,148, 10,174, 10,214, 45,146,191,
- 39, 60,120,240,224,193,131, 7, 15, 30,111, 68,100,149,223, 23,139,112, 84,109,254, 51,103, 54, 65,109, 76,136,193, 60, 39,207,
-201,115,242,156, 60, 39,207,201,115,254,191,227,172,137,251,173,152,205, 88, 67, 28,243, 55, 6,222, 31,128,231,228, 57,121, 78,
-158,147,231,228, 57,121,206,183, 29, 85,250,104,241, 67,135, 60,120,240,224,193,131, 7, 15, 30,127, 17,120,103,120, 30, 60,120,
-240,224,193,131, 7,143,215, 67,141,139, 74,243,224,193,131, 7, 15, 30, 60,120,240,168, 29,170, 95, 84,154, 7, 15, 30, 60,120,
-240,224,193,131, 71,173, 97,254,162,210, 60,120,240,224,193,131, 7, 15, 30, 60, 76,194,118,254, 22,240,224,193,131, 7, 15, 30,
- 60,120,252, 61,168, 56,235, 48, 40, 40,136, 43,191,231,193,131, 7, 15, 30, 60,120,240,248, 59,241,182,106, 17,126,232,144, 7,
- 15, 30, 60,120,240,224,193,227,245, 48,137, 23, 90, 60,120,240,224,193,131, 7, 15, 30,127, 13,170,244,209, 42, 13, 88,218,181,
-196, 84,215,149,191, 87, 60,120,240,224,193,131, 7,143,127, 0,111,183, 22,225,253,179,120,240,224,193,131, 7, 15, 30,188, 22,
-121, 51, 40,117,134,231,193,131, 7, 15, 30, 60,120,240,224,241,122,224,215, 58,228,193,131, 7, 15, 30, 60,120,240,248,155, 5,
-215, 95, 46,180,248,149,205,121, 78,158,147,231,228, 57,121, 78,158,147,231,252,255, 36,178, 42,136, 45,126,214, 33, 15, 30, 60,
-120,240,224,193,131,199,235,161,198, 89,135, 60,120,240,224,193,131, 7, 15, 30, 60,106,135, 73, 0, 2, 75, 62, 7,162,156, 85,
-139,183,104,241,224,193,131, 7, 15, 30, 60,120,188, 30,182, 3,112, 43, 17, 88,103, 0, 40,120,161,197,131, 7, 15, 30, 60,120,
-240,224,241,102, 80,222, 47,107, 64, 57,241,197, 11, 45, 30, 60,120,240,224,193,131, 7,143,215, 68,149, 62, 90, 4,170,158, 57,
- 16,108,198, 31,212,102,246, 65, 48,207,201,115,242,156, 60, 39,207,201,115,242,156,255,239, 56,107,226, 14,198,127, 15,175,132,
-117,224, 56,110,251,223,241,199,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,223,225, 47, 11, 88,218, 10,176,
-224,111,239, 91, 9,151,146,141, 7, 15, 30, 60,120,240,224, 81, 61,254,154, 89,135,254,192,167,163, 3,228, 91,141,225, 89, 54,
-225,128,186,186,115,229,114,249, 54,153, 76, 54, 90,173, 86,171, 8,130, 96,203, 43, 64, 0,229, 23, 7,138,207,202,202,234, 84,
-211,127,139,197,226,117, 46, 46, 46,159, 22, 21, 21,169, 9,130,224, 8,130, 0, 65, 16, 0,240,202,158, 97,152,148,156,156,156,
-214,255,113,169, 76, 57,185,184,220, 19, 82,148,135,185,151, 50, 44,251, 34, 51, 35,227, 61, 51, 46, 89, 65, 16,152, 91,252,183,
- 88, 13, 96,193, 91,215,243, 0, 40, 83,206, 11, 0,172, 99,129,145, 12, 73,126, 46, 4, 54,233, 88,118, 43, 0, 16, 0, 83,219,
-255,214,221, 69,125,130, 67, 11,130,128, 45,199,161,128, 35,240, 88,210, 14,113,255,208,173, 24, 42, 20, 10, 7,217,216,216, 88,
-229,228,228, 92, 5,112, 0,192, 40, 71, 71,199, 46, 74,165,178,200,104, 52,158, 4,112,172, 54,196,157, 90, 96,158, 88, 36,252,
- 68,107, 48,174,186,249, 24,191,117,105, 5, 71,154,197, 74,169, 72,208, 73,167,167, 87,223,120,130,157,102, 82, 18, 37, 91,233,
- 59,195,236, 69,197, 14,155, 88,238, 0,112,194,222,222, 79, 34,183,185, 44, 20, 83, 47,242, 51,138, 70, 15,203,204, 76, 30,254,
- 26,229,254,111,132,147,147,211, 56,146, 36,191,231, 56, 14, 12,195, 44,204,205,205,221,245,134,168, 23, 2,176, 43,249,156, 15,
-224,251,215,228, 75, 4,224, 93,242, 57, 9,128, 15,223,174,215, 26, 91,142, 31, 63, 62,165, 91,183,110,248,249,231,159,177,101,
-203,150,132,172,172,172,149, 0,118, 3,208,255, 3, 60, 60,170, 66, 19,160,255,143,125,218, 49,198,223,191,101,203, 29,238, 89,
-197,195,252,235,199, 31,127,108,224, 56,142,139,137,137,225,244,122, 61,103, 52, 26, 57,154,166, 57,154,166, 57,163,209, 88,182,
-121,120,120,164,190,116,249, 43,156, 36, 73,174,255,224,131, 15, 10, 57,142,227, 30, 60,120,192,105, 52, 26, 78,167,211,113,122,
-189,158,211,106,181,156, 70,163,169,176,185,184,184,100, 84,199,105, 99, 99,243,192,222,222, 62,195,222,222, 62,195,193,193, 33,
-195,193,193, 33,195,209,209,177,108,115,114,114, 42,219,228,114,121,134, 92, 46,207,112,112,112,120, 80, 83, 58, 75,208, 7,192,
- 85, 19,182, 62,149, 92,219,179,188,208,114,115,115,203,224,106, 1, 79, 79,207,100, 19,210, 89, 10, 23,130, 0, 83,122, 45, 65,
-128,149, 72, 36,222,229,127,199,171,150,174, 26, 77,202,238,238,238, 31,184,185,185, 5,187,185,185, 93,114,119,119,255,192,132,
- 42, 86,129,211,218,218,250,129,147,147, 83,134,171,171,107,102,233,230,230,230, 86, 97,115,119,119, 47,219, 92, 92, 92, 50,236,
-237,237,171, 44, 35, 14,160,170,218, 66, 0,129, 4,232, 46,160,168, 32, 23, 23, 23,101, 88, 88, 24,195,113, 28, 71,146,100,106,
-233, 57,230,228,253,101,145,165,190,129,133,217, 87, 36,119,139, 94,172, 44,200,190, 34,185,171,190,129,133,186,187,168, 95, 91,
- 78, 19, 81, 25,231,216,177, 99,199, 62,206,200,200, 72,205,207,207, 87,108,221,186, 53, 86, 42,149,222,216,186,117,107,108,126,
-126,190, 34, 35, 35, 35,117,236,216,177,143, 1, 76, 51,131, 19, 0,240, 94, 11,188, 59, 97,168,155,250,241,137, 49,234,238,109,
- 4,143, 58, 4, 32,176,215,123,162,212,141,243,253,213,215,118,116, 84,119,123,135, 12, 55,147,147, 16, 8, 4,237,189,189,189,
- 63,145,203,229, 31,151,108, 99, 74, 55, 87, 87,215, 49,174,174,174, 99,236,237,237,135, 87,199,121, 24,160, 76,217,188,164,210,
-246,195,235,121,171, 19,151, 47,227,194,102,126,206,125,226,235,165, 28,230,236, 92,231, 31, 40,163,191,148,211,217,217, 57,205,
-104, 52,114, 6,131,129,115,116,116, 76,123,131,233, 92,195,113,220, 26,142,227,214, 0, 88,243, 6, 56,203,222,103,102, 8,236,
-234, 56,165, 2,146,156, 45, 19,139, 47, 73, 4,130, 76,137, 64,144, 41, 19,139, 47, 9, 72,114, 14, 0,233,191,169,140,254, 2,
- 78, 43,185, 92,254,124,221,186,117,156, 90,173,230,212,106, 53,183,110,221, 58, 78, 46,151, 63, 7, 96,101, 6,103,109,121,222,
- 38, 11, 86,133,173,116,232,240,141, 88,180,252,129,214,221, 91, 52, 56, 58, 99,220, 72,176, 71,214, 17, 53,244,152,126,125,175,
-117,235, 79,118,239,222, 13, 0, 24, 61,104, 16,122,183,109, 11,107, 43, 75,136,197,197,201, 33, 56, 2, 34,161, 8,131,103,125,
-105,202,223,175, 30, 60,120,240, 71, 71,142, 28,177, 2,128, 45, 91,182, 96,232,208,161,112,112,112,128, 76, 38,131, 72, 36,130,
- 80, 40,172,176,175, 9, 20, 69,121,166,166,166, 58, 75,165,210, 50, 43, 27,203,178, 21,182,242,171,114,211, 52,141,134, 13, 27,
-154,122,187,230, 23, 20, 20,116, 86,169, 84,101, 28,149,109,245,234,213, 3,128, 11,166, 16,126,255,221,183, 96,105, 21, 4, 2,
-128,166, 1,157,129, 4,203, 85, 42,110, 48,109,218,180,215, 90, 77,124,192,128, 64,130, 32,136, 35,161,161,161, 71, 51, 51, 51,
-235,178, 44, 51,177,150,150,174,207,158, 62,125,106, 5, 0,126,126,126,211, 0, 28, 53, 39, 29, 2,129,192,243,201,147, 39,206,
- 18,137,164, 74,203,101, 57, 11, 38, 12, 6, 3, 90,181,106, 69,155,243, 31, 46,128,119, 46, 73, 78,108,249,206, 59,147,150, 14,
- 30, 44,189,119,239,158,148, 36, 73,208, 52,141, 31,127,252,145,230, 56,206,174, 9, 96, 19, 9, 40,171,161,249, 26,192,184,146,
-198, 96, 39,128, 31, 43,168, 5, 14, 45, 52, 70, 73, 96,124,209,224,182,237,234,204, 67,100, 68, 88, 91, 95,171, 19,176, 22,232,
-226,128,191,215,170,101, 99, 99, 51,232,231,159,127,150,239,220,185, 83, 25, 19, 19, 99,216,186,117,171,124,242,228,201,214, 6,
-131, 1, 83,166, 76,201,106,212,168,145,232,231,159,127,150, 31, 59,118,172,187, 74,165,218,108, 86,121, 17,248,118,212,160,222,
-208, 26, 73, 24,141,180,220, 77,110,253,199,140,177, 93,133, 28,167,199,158,147,161, 48,210,236,111,102, 90,178,222, 27, 54,108,
-152,239,254,253,251, 5,209,209,209,130,198,141, 27,131,101, 89, 48, 12, 3,163,209, 8, 0, 96, 89, 22, 13, 26, 52,120,237,251,
-242, 9,224,231,228,226,112,233,189,254,253, 44,220,164, 18, 56,228,101, 97,130, 72, 96,189, 75,166,219, 11,160,253, 91,101,217,
-229, 56, 8, 4, 2, 36, 39, 39,195,217,217,217,130,101, 89, 5,128,101,121,121,121,219,241,246,162,173, 88, 32, 56,186,231,183,
-245,174,237,218,183,167, 92,220,156, 17,251, 52, 9, 2,130,233,249,228,126,104,215, 79,166,206,158,161,167,233, 15, 0,220,123,
-219, 50,238,218,126,218, 16,130,164,182, 16, 28,139,111, 54,158, 42, 92,177,122,157,108,202,196,177,212,172, 89,179,224,229,229,
- 85,119,200,144, 33,171, 1, 76,173,145,167,221,180, 33,160,200, 45,224, 56, 44,253,229, 84,225, 15,171,215,201,166,214,130,231,
- 63,142, 42,159,145,215, 22, 90,254,128,111, 83, 47,231,139, 43,230, 78, 21,114,231,126, 39,213, 57,153, 85,158, 43,151,203,183,
-245,237,219,119,244,174, 93,255,179, 70,191, 23, 16,128, 33,221, 59,194,217,209, 22, 50, 75,113,113,115,196, 18,120, 28,243,194,
- 36, 65,224,229,229, 53,229,232,209,163, 86,229,197,132, 72, 36, 42,219,202,139,172,210,173,180, 1,174, 14, 82,169, 20,193,193,
-193, 16, 8, 4,160, 40, 10, 2,129,160,108, 43,255,157,162, 40,184,184,152,229,186,180,210,214,214,182,121, 97, 97,161, 77,126,
-126, 62,188,189,189,149, 0,158,148,251,189,121, 86, 86,150,141, 57,132, 44,173,194,172, 9,254, 16,234,239, 64, 47,108, 11,141,
-160, 3,110,221,143, 66,208,133,171, 72, 77, 75, 71,199,119, 91,226,227, 15,135,225,210,165, 75, 96, 24,179, 71, 58, 50, 56, 14,
-171, 7, 14, 12,156, 7, 16, 68,207,158, 61,243,167, 79,159, 78, 70, 71, 71,127, 52,100,200,224,128,167, 79,159,149, 88, 21,137,
-185, 28,135,245, 0, 50, 76,228, 21, 3,192,181,107,215, 0, 64, 82,155,186, 39,145, 72,112,251,246,109,148, 14, 19,147, 36, 9,
-146, 36, 65, 81, 20, 78, 63,115,130, 74, 79, 66,157, 17,142,207, 3,189, 81,175, 94, 61,144,100,205, 46,137, 93, 1,233, 45, 96,
- 8, 33, 20,206,114,115,119,175,219,197,215, 87, 22, 28, 28, 76, 1,128,143,143, 15,167, 80, 40,242, 79,158, 60, 89, 40, 0,182,
-248,112,220,238,234, 68,150,151,151, 87,135,212,212,212,239, 75,239, 57, 65, 16,171,235,212,169,179,164,172,220, 88, 22,203,126,
- 83, 9,103,204,152, 41,106,215,117, 17, 0,160,221,192,253, 80,198,175,240, 39,114,191,182,253,187,223, 18, 74,165,242, 96,131,
- 6, 13,168,156,156,156, 91, 0, 18,141, 70,227,252, 63,254,248,195,121,194,132, 9,153,123,247,238, 93, 9,192,125,213,170, 85,
- 93, 85, 42,213, 33,115,120, 59, 54, 71,255,119,154, 7,188,235,237,229,133,171,183,238, 65, 36, 22,218, 77, 27, 23, 8, 43, 43,
- 1,214,236, 60,195, 38,166,228, 78,191,241, 4,187,205, 16, 89,109,135, 13, 27, 86,119,255,254,253, 98, 0,120,242,228, 9,210,
-211,211, 33,151,203, 97, 97, 97, 1,161, 80, 8,138,162, 32, 20, 10,223,136,200,178,245,114,188,123,226,196, 73, 11, 7, 7, 59,
-108,252,114, 6, 62,206,204,128,157,181, 21,140, 69,170,186,111, 89, 67,225,215,169, 83, 39, 41,195, 48, 80,169, 84, 8, 9, 9,
-177,181,176,176,176,245,244,244, 92, 90, 93, 35, 82,201,187, 51, 67,171,213, 58,151,124,206,212,106,181, 46, 0,148, 18,137,164,
-244, 61, 93, 84,178, 55,117, 56, 49, 17,175, 14, 19, 38, 17, 4, 81,254, 88,109,209,166,109,155,230,193,199,142,236,179, 42, 40,
- 76,135,157,125, 38, 72, 20, 96,251,246, 77,176,176,176,193,210,165, 95, 11, 94,244,236,238,209,167,255, 7,193, 17, 81,177, 61,
-223, 58,177,197, 17,219,123, 14, 28,237, 96, 33,179, 46,105, 75,140,216,181, 99, 6, 72,146,196,146, 37, 75,208,180,105,211, 73,
- 17, 17, 17,139, 0,228, 86, 79,131,237,205, 58,143,112, 16, 75,139,139,152,101,140,216,122, 96, 78, 49,207,130,201, 24, 53,176,
-222,164,175,134, 61, 63,223,212, 23,133, 37, 29,115,141,144, 68, 18,209, 14,101,130, 33, 40, 40,168, 75, 96, 96,224,213,170,190,
-255, 7,224,134,255,197,207,170, 32,190, 4, 65, 65, 65, 92, 96, 96, 32, 81, 46,115, 21,190, 87,135, 22,128,147,189,173, 44,120,
-203,178, 25, 86,130, 59,103, 40, 77,210, 51,164,105, 43, 52,228, 21,166,104,202,100,178,209,187,118,237,170, 96, 82,242,118,113,
-134, 72, 36,132, 80, 68,192,174, 83,113,244,250,252,235, 65, 32,136, 42, 69, 86, 5, 78,149, 74,165,125,244,232,145,213,206,157,
- 59,225,236,236,140,186,117,235, 66, 38,147, 65, 42,149, 86, 16, 87,229, 5, 87, 37, 66,171, 2,103,233,239, 2,129, 0, 36, 73,
-226,210,165, 75,160,105, 26,195,134, 13,123, 69,100, 9, 4,130,170,132, 91, 85,211, 83, 47, 0,120,194,113, 92,231,146, 6,248,
- 9,128, 46,229,126,239, 35,151,203,231, 3, 88,105, 42, 39, 69,113,160,180,183,192,122,174,131, 32,121, 6,244,194, 22,184,114,
- 35, 20,187,182,253, 12, 0,168,219,184, 13,134, 15, 9, 44,179,198,153,152,206, 50,120,120,120, 28,200,202,202,238,215,189,123,
-119,228,229,229, 25,151, 45, 91,134,230,205,155,195,207,207,207,164, 50,170,162,231,156,241,228,201, 19, 47,141, 70, 3,142,227,
- 76, 17,103,175,112, 18, 4,129, 63,254,248, 3, 90,173,246,149,147,237,187,252,128, 57, 67,125, 48,254,243,221, 88, 29,115, 8,
-155, 55,111,174, 54,239, 50,160,185,214,182,193,122, 49, 69, 55, 95,249,245,103,146,143, 63,254,152, 26, 63,126, 60,146,146,146,
- 48, 97,194, 4,237,165, 75,151,244,233, 10,197, 73, 49,203,110, 52, 84, 20,198, 85,114, 74, 36,146, 61, 23, 46, 92,192,161, 67,
-197,186, 36, 54, 54, 22, 13, 27, 54,180,172, 32,146,115, 15,163, 48,113, 35,238,158,142, 70,187,129,251,113,247,244,135, 96,242,
-207, 8, 91, 55, 68,129, 57,247,179, 22,168,140,243, 80, 78, 78, 78,153,136,218,187,119,175,197,222,189,123, 7, 3, 56, 5,224,
- 16, 0,228,230,230,254,100, 38, 39, 64, 96,252,136,161,131, 33, 16, 89, 35,250, 89, 10,186,188,215, 10, 46,206,206,120, 18, 21,
-135,196,212,220, 12,130,192,184, 62,237,197, 43, 53, 26,253,162,235,143,241,107, 13,156,132,167,167,167,223,225,195,135, 69,229,
- 44,208,101,207, 56, 69, 81,101,223, 75,133,119,109,234,103,169,200,178,246,180,186,251,237,166, 14,150,119,195,246,162,161, 79,
-127,216,247, 15,196,175, 23, 47,226,105, 68,164, 86,175,166,123,252, 3,101,244, 87,113,250, 13, 29, 58,244,214,190,125,251,236,
-146,147,147,113,237,218, 53,212,173, 91, 23,106,181,218,148, 14,111, 5, 78,173, 86,235, 92,122, 13, 65, 16,206,165,134,119,189,
- 94, 95, 90, 24,165, 15,162, 93,185,243,236,170,225,244, 46,119, 94,169,184,242,121, 3,121, 23, 75, 69,162,195, 39,142, 29,176,
-138,140,190,134,150, 45,222,133,149,109, 19,176, 76, 58,114,114,139,144,247, 44, 13,223,125,183, 26, 75,151, 45,196,169,227, 71,
-172, 26,249,183, 56,170,167,233, 6, 0,180,111, 77,185, 19,220,164,224,211,123,183, 16, 28, 11, 77, 70,180, 68,168,122, 46, 27,
-253,225, 7,212,200,145, 35,113,234,212, 41, 68, 68, 68,108,169, 70,100, 5,151,179,204, 79, 10,191,118,104, 11, 56, 14,154,204,
-104,137, 72,243, 92, 54,246,163,225,212,199,163,122,227,206,159,235,209,187,229,243,112,119,103, 12,201, 43,145,216, 2, 10, 57,
- 18, 41,110,114,119,113,167,156,216, 10, 1, 64,148, 19, 88, 33,248,159, 15,230,127, 1, 3, 74,132,213,164,151, 59, 38,130,218,
- 8, 44, 0,104, 8, 88, 17, 98,209,221, 93, 75, 63,115,151, 37, 69, 8,116,225,183,145,166, 99,185,173, 9, 52,219, 10,176,120,
- 8,104, 94,190, 70,173, 86,171,226,226,226, 44,198, 13, 25,130,246, 1, 1,112,115,116, 68, 3, 79, 79, 88, 72,196, 16,139,132,
- 21,186,172, 38,143, 33, 16, 4,215,168, 81, 35, 12, 28, 56, 16, 66,161, 16, 50,153, 12, 86, 86, 86, 16,139,197,149, 90,179, 76,
-237,229,114, 28, 7,138,162, 16, 30, 30,142,196,196, 68,216,217,217,225,230,205,155,232,209,163,199, 43, 86,173,242,226,204, 28,
- 19,125, 37, 13,127,169, 16,187, 96, 14, 23,195, 16, 40,226, 90, 64,154, 48, 29,106,162, 21,116, 58, 26, 58,157, 14,191,222, 48,
-224, 94,156, 10, 6,131, 30, 58,157,174,186,255,172, 10,164,187,187,251,232, 6, 13, 26, 76,251,240,195, 15,141, 98,177, 24, 42,
-149, 10,106,181, 26, 17, 17, 17,198,126,253,250,231, 15, 28, 24,104,123,230,204, 25,174,100,232, 48,195, 12,238, 28, 15, 15, 15,
-175,146,225,217,156,218,212,106,130, 32,202, 68,204,203, 24,247, 83, 36, 4, 84,113,153,108,217,178, 5, 12,195,128,227,184, 42,
- 11, 73, 75, 16,151,151,253,176,214,118,213,186,223, 96,235,224,130,171, 87,175, 50,231,207,159, 47, 36,128,216,167, 17, 17, 63,
-189, 15,156, 61, 12, 24,204, 73, 95, 94, 94,158, 69,221,186,117,225,233,233, 9,150,101, 97, 52, 26,203,172, 47, 57, 57, 57,208,
-104, 52,112,176,204, 71,125, 71, 79,208,133, 33, 80,132,127, 3, 55,171,104,236,190,160, 55,190,227,135,199,255,130, 23,199,239,
- 37,219,107,246,154,225,225,236,234, 5,146, 51, 34, 45, 51, 7,131, 7,244, 6, 37,178,194,139,228,108,180,104,226,235,246,209,
-251, 29,220, 40,130,198,220,149,251,167, 1,236,175, 53,209, 21, 21, 21, 49,209,209,209,120,242,164, 88,239,218,216,216,192,210,
-210,178,194, 51, 78,146,228,107, 89,180, 74, 69,214, 15, 91,122, 88,146, 66, 21,148, 76, 48,118,254, 17,138, 22,141, 2,177,245,
-238,125, 45,147,145,219,115,141, 86, 27,123,224, 63,108,204,112,117,117,157,204,178,236, 82,142,227,242, 59,118,236,232,178,127,
-255,126,251,212,212, 84,132,134,134, 98,201,146, 37, 89, 12,195,208, 28,199, 17, 28,199,125,243, 6,254,142, 45, 39,176,222, 36,
-132, 50, 41, 62,119,178, 33, 6, 9, 72,155,186,180,178,232, 69,182,158, 59,169,166,217, 95, 0, 24,171,125,185,145,228,167, 71,
- 14,110,113,119,146,179,232, 42,239, 14, 69,134, 1, 63,124, 57, 22, 57, 57,133,248,117,199, 10, 0, 98, 24,104, 10,157,187,126,
- 0,103,103, 15, 76,154, 56,201,117,203,182,173,159,209, 44,187, 6,111, 9,210,111,109, 62, 14, 32, 88, 46,151, 71,124, 54,105,
-146,188,110,221, 49,144, 74,165, 56,112,224, 0,246,111,220,200,172, 3,134, 75,128, 43, 83,128,227,213,242,220,253, 31,207,140,
- 41, 83,228,254,254, 83, 32,145, 72,240,231,249,223,161, 77,255,163,112, 64,123, 24,212, 90, 12,168, 51,144,115, 72, 56, 77,228,
- 10,133,120, 6, 0, 66, 41, 20, 0, 94, 30, 6,251,175, 9,172, 82,156,193,255,102, 26, 78,170, 96,209,170,245,187, 83, 40, 14,
-219, 49,115,148,143, 11,116,132,254,198,105,164,234, 88,102,213, 83, 3,245,176,128,155, 19, 85,137,200, 42,169,216,172,183,183,
- 55,186,183,110,141, 33,157, 58, 65, 32, 16, 64, 42, 22,193, 90,106, 1,142, 41,182,100,149, 14, 29, 86,211, 38,162, 50,235,147,
-163,163, 35, 68, 34, 81,153,192, 50,195,154, 85, 41, 39,203,178, 16, 8, 4,120,242,228, 9, 58,118,236, 8, 47, 47, 47, 28, 58,
-116, 8,125,250,244,121,101, 40,209, 92,145, 85, 42,180, 94, 26,198,235, 3,160,212,146,101,150,208,210,234, 9,100,235, 91,128,
- 32, 2, 64,211, 0,195, 1, 58,173, 22, 28, 7,112, 28, 96, 52,232,161,213,106,203,254,211,148, 33, 89, 87, 87, 87,111, 11, 11,
-139,229,243,230,205,245,111,209,162, 37,178,178,178,192,178, 44, 44, 45, 45,161, 86,171, 97, 99, 99,131,246,237,219,191, 88,190,
-124,185,130,227, 48,201, 76,145,245,218, 40,189,231, 23, 47, 94,172, 48,108, 88,186,169, 20, 41, 24,255,197, 94,136, 5,197, 67,
- 75,165, 62, 60,213,189,119,187,117,238,128, 91, 15, 99,233, 79,231,174,215, 9,115, 66, 87,186,178,236,174,148,215,200, 23,199,
-113,200,206,206, 70, 70, 70, 6, 6, 13, 30,140,253,251,246, 33, 33, 33, 1, 77,154, 52, 65,183,110,221,224,236,236,140,132,132,
- 4,220,187,174,131, 46, 47, 23,185,250, 80,200,172,219,225,196,213, 56,221,146, 45,134,184,127,240,133, 49, 8,192, 88, 27, 27,
-155,122,106,181, 90, 65,211,244, 97, 0,135, 1, 12, 23, 8, 4,195,101, 50,153,155, 82,169,124,142,226,217, 68, 39,107, 34,179,
-144, 74, 29, 37, 82, 27,176,180, 14, 2,129, 0, 94, 94,117,193, 49,122,228, 41, 53, 24, 55,114, 32, 30, 62,137,194,249, 43,119,
-104,163,145,221, 96,202,109,165, 40,138,243,243,243, 67,102,102, 38,132, 66, 33, 44, 44, 44, 96,101,101,133, 5, 11, 22, 96,227,
-198,141,101, 34,171,182, 66,235, 19,192,207,198,219,234,206,247,155,138, 69, 86,122,154, 2, 25, 41, 66,200, 29, 93,176, 97,227,
- 58, 85, 94, 66,122,187,223,128,216,255,122, 35,203,178,236, 55,169,169,169,206, 2,129,192,149,166,105, 36, 39, 39,227,193,131,
- 7,152, 62,125,122, 70, 78, 78, 78, 87,212, 50,143, 82,169, 52,179,212,146, 85, 50,116, 88,213,112, 98,126, 57, 75, 86,126, 53,
-148, 85, 13, 19,250,214,245,180,190,180,227,231, 89,222,109,218,181, 39,101, 2,155,188,162,103,233, 29,111, 92,187,218,126,250,
-207,191,126,150,152, 87,212, 27, 64,124, 85,164, 18,161,176,223,187, 29, 58, 8,192,101, 64, 32,238,136,213,171, 70, 34, 43, 91,
-137,188,220, 66,136, 68,150,208, 27, 41, 48, 44,129,246, 29, 59,225,247,221, 7,209,116,226, 4, 74, 44, 20,246,162,245,250,183,
- 70,104,149, 96,197, 47,191,252,226,221,168, 81, 35,236,218,181, 11, 87,246,236,193,199, 5, 5,184, 74,146,148, 81, 40,116, 58,
-107, 52,110, 71, 13, 66,171, 60, 79,211,166, 77,241,219,111,191,225,143, 63,254, 72, 26,221, 35,243,232,172,209,112, 54, 24,208,
- 55, 52, 6, 14,117, 6, 2,161, 49,112,120,167, 17, 26,208, 2, 60, 35,136,138,225,160,130,130,130,186,148,223,255,199,160, 64,
- 21, 67,236, 2, 0, 93,131,130,130,184,242,251, 26, 95,156,242,134, 83, 86,244,174,231, 19, 80,223,155, 48, 30, 90,143,100, 21,
-173, 95, 20, 99, 16, 63, 45,226,102, 69, 1,235,170,233, 65,112, 20, 69,193,218,194, 2,114, 59,187, 98, 51, 63, 73, 2, 44,192,
- 26, 1,130, 41, 22, 0, 28, 75,128, 99,204,122, 97, 64, 44, 22, 87,234,248,110,174,111, 86,121,206,194,194, 66,188,120,241, 2,
-147, 38, 77,130, 76, 38, 43, 86,238,233,233,240,241,241,129, 64, 32, 64,106,106, 42,254,252,243, 79,212,171, 87, 15, 18,137,196,
- 44,181, 85,206,186,212, 28,197,179, 12,155, 43, 20, 10, 27, 55, 55, 55,152,109,209, 98, 57,168,117, 4,244,122, 6, 79,159, 62,
- 69, 90, 90, 26, 94, 60,127,134, 54, 42, 37, 56, 80,224, 56,206, 44,139,150,135,135, 71,128,175,175,239,214,149, 43, 87,138, 60,
- 61, 61,193,113, 28,236,237,237,160, 86,171,145,157,157,131, 38, 77,154,192,203,203, 11, 43, 87,174, 4,128,253,127,183,200,122,
-169, 78,149, 9,173,242,130,235,139,247,189,145,155,107, 5,138, 34,203,132,115, 13, 62, 90, 34, 0,232,218,123,168,224,210,249,
-179,150, 52,176, 60,157,162,150, 11,106, 46, 71, 35,195,178,178,170,126, 79, 78, 78,134, 80, 40,196,145,195,135,145,155,145,129,
- 22, 45, 90,160,109,219,182,120,246,236, 25, 30, 62,124, 8, 71, 71, 71,200, 61,223,195,213,231, 6, 68,166,105, 96,107,107,139,
-184, 20,242,159, 12, 25, 48,177,103,207,158, 75,126,250,233, 39,103, 87, 87, 87, 97, 86, 86, 86,163, 77,155, 54,181,216,180,105,
-211,140,207, 62,251,204,229,179,207, 62,179,151,203,229,130,244,244,116,191, 47,191,252,242,157,224,224,224,122, 0,214, 86, 71,
-104,105,105,237, 64,137, 44, 65, 16, 2,216,217,218, 67, 32,182, 4, 75, 11,192,176,128,141,173, 28,183, 30, 30,193,205,176,194,
-201,153, 57, 56,108,146,125,172,164,220, 29, 29, 29, 95,177, 84, 79,159, 62, 29, 59,118,236, 40, 27, 70,172,173,200,250, 97, 83,
- 15, 43,162, 68,100,165, 39, 11, 64,232,234,225,244,241,219,249,121, 9,233, 29,223, 6,145, 85,250,142,227, 56, 14,207,159, 63,
-135, 90,173,198,245,235,215,241,205, 55,223,100,189, 44,178,156,157,157, 39,218,216,216, 44, 43, 42, 42, 90,157,158,158,190,190,
-198,142, 95,177,136, 42,253, 92,186,175,116, 56,209,196,164,250, 84,102,201,242,114,147, 94,120,120,125,175,143, 45,247,152, 64,
-226, 36,224,169, 50,194,250,174,115,231,254,109, 6,144,173, 54,127, 91,167,237,228, 5, 23,146,149,218, 70, 85, 89,182, 88,134,
-105,101,105,101, 13, 32, 19,161, 15, 66,202, 68, 86, 78,110, 1,116, 6, 10, 58, 61, 1,173,129, 68,247,158,125,177,113,235, 31,
- 72,205,204, 5,195, 48,205,222, 50,145,229, 16, 16, 16, 48,101,248,240,225, 88,190,124, 57,130,127,250, 73, 63,149, 32,148, 2,
-128, 59,195, 48, 96, 57,142, 32, 77,115, 98,175,192,179,102,205,154,227, 0, 70,173,156,142,247,242,138, 48,206,125, 32,231, 80,
-103, 96,241,137,195,230,113, 0,224,144, 21, 92,177,201, 12, 12, 12, 36, 74, 71,214,204, 29, 97,251,183, 67, 16, 24, 24,120, 53,
- 40, 40, 8,229,247,213, 93, 96,237,210,168,255, 87,179,167,173,106,211,167, 19,161,152,221, 11,185, 74, 45,253,117,164, 65,156,
-162,169, 94,100,149,199, 87,155, 54,225, 97,108,241,115,236,233,236,140,185, 31,125, 4,142, 6,110, 70, 68,226, 96,112, 48, 70,
-246,236, 9, 75,169,212,100,203, 6,203,178,149, 90,177,202, 91,179,204,181, 58,229,231,231,227,240,225,195,104,219,182, 45,100,
- 50, 25, 4, 2, 1,154, 55,111,142,168,168, 40,248,250,250,130, 32, 8,156, 56,113, 2, 67,134, 12, 65,124,124, 60,222,123,239,
- 61,171,196,196, 68,179,133, 86,100,100,164, 13,199,113,157, 75,173, 31,181,133, 78,167, 67,116,116, 52, 6, 14, 28, 8,123,123,
-123,120,120,236, 71,240,133,189,144, 5,124, 12,130,128, 89, 66,139, 97,152, 79, 6, 12, 24, 32, 34, 8, 2, 26,141, 26, 82,169,
- 5, 44, 45,173, 96,109,109, 3, 63,191, 70, 72, 75, 75, 67,159, 62,125,244,113,113,113,155, 21, 10,197, 33,115,211,234,239,239,
-111,153,144,144,240,113,157, 58,117,196, 0, 96, 97, 97,209,196,215,215,119, 78,124,124,124,161,185, 86,173, 82,129, 69, 16, 4,
- 40,138, 42, 19, 90, 2,146,132,155,171,115,217,247, 18,255, 52,162, 26, 46,101,106,142, 78, 2, 0,222,222,222,216,184,237, 20,
- 57, 96,192, 0,204,152, 49, 3, 70,163, 17,155, 55, 23, 79,178,251,240,195, 15, 97, 48, 24,112,244,104,241, 36, 73,129, 64, 80,
-173,217,228,193,131, 7, 8, 13, 13,133,209,104, 68, 65, 65, 1,206,157, 59,135,171,215,174,225,192,137,203, 72,120,254, 12,205,
- 27,249, 96,194,132, 79, 32, 20, 10,177,123,247,110,116,236,216,241, 31,125, 33, 8,133,194,209, 59,118,236,112,219,181,107, 87,
-254,137, 19, 39, 84,239,190,251,174,100,221,186,117,206, 27, 55,110,148,235,245,122,204,156, 57, 51,243,206,157, 59,186,193,131,
- 7, 91,110,223,190,221,173,126,253,250,189,104,154,174, 76,104, 89, 2, 24, 9, 96, 76, 94,161, 94,144, 95,168, 1, 75,235,241,
- 60,225, 5, 10,138,244, 96, 25, 3,146, 82,210, 80,164,101,144,147, 91,136,230,173,122,255, 18, 18, 18,178,208, 96, 48,124, 13,
- 32,168,166,116, 70, 68, 68,224,206,157, 59, 72, 72, 72,192,243,231,207, 43, 42,197,137, 19,241,199, 31,127,152,109,209,170, 92,
-100, 81, 32,116,190, 8, 58,113, 55, 63,243,153,226,173, 17, 89, 37,239,160,165,110,110,110, 75,221,220,220,164, 23, 47, 94,180,
-173, 83,167, 14,104,154,214,191,108,201,234,218,181,235,162, 29, 59,118,184,249,250,250, 78, 7,176,254,223,144,118,146,196,196,
-213, 91,166, 56, 89,139,147,210,240,116,109, 73, 44, 65, 10, 80, 43,129,144,125, 16,116, 88,252, 98,250,224,121,246,243,119, 45,
-159,200,130,173,114,134,108, 92,124, 50,182,108,217,136, 89, 51,199,225,247, 95, 87,131,101, 5,208, 25, 41,120,215,125, 23, 58,
- 3, 11,130, 20,160, 69,171,214,184, 18,114, 29, 66, 18, 56,188,107,203, 91,166,179,144, 27, 30, 30,190,249,196,137, 19,159,207,
-152, 49, 3, 44,203,138,151,109,217,162,201,202,202, 90, 1,243,226, 95,189,204, 51,100,203,150, 45,177,243, 55,102, 29,159, 53,
- 26, 84,194,105, 34, 55, 52, 6, 14,195,230,113, 56,178,138,192, 59,141,144, 43,171,188,137,191,246,210,254,237, 16, 90,165, 74,
-178,252,190, 50,180,106, 88,239, 91, 91, 7,251, 79, 72,107, 15,167,185, 51,166, 10,226,211,181, 56, 90,231,163,162, 63,247,108,
-176, 76,167, 37,191,196, 65,187,206,156, 63, 62,248,231,159,101,159,127,220,191,191,210,223, 20,195,134,153,220, 51,171,202,138,
-101,174, 37, 11, 0,100, 50,153, 93,175, 94,189,208,163, 71, 15,124,240,193, 7,101, 62, 89, 45, 91,182,196,129, 3, 7, 48,116,
-232, 80, 60,122,244, 8,110,110,110,104,220,184, 49, 26, 55,110,140,179,103,207,154,251,146, 3,195, 48, 8, 8, 8, 40,157,117,
-216, 60, 37, 37,197,166,182, 5,169,211,233,144,147,147, 3, 7, 7, 7,136,197, 98,180,107,215, 22,159,127,209, 14, 78,110,191,
- 33,192,191, 17, 84, 42, 85,217,244,119, 19, 26,219,128, 6, 13, 26, 32, 43, 43, 11, 89, 89, 89,144,203,229,112,119,119,135,171,
-171, 43,214,174, 93,203,173, 95,191,254,188,193, 96,216,156,157,157,109,182, 37,203,213,213,181, 19, 65, 16,139, 52, 26,141,184,
- 92, 15, 87, 44,151,203, 79,106, 52,154, 21, 10,133,194,100, 71, 80,130, 32, 96, 48, 24, 64, 16, 4,206, 60,119,135, 74, 79, 64,
-153, 18,138, 25,239,251, 84, 16, 94, 66,161,176,198,225, 82,142,227, 84,163, 70,141,114,246,242,242, 68,114, 92, 4,142, 28,225,
-240,211, 79, 63,149,206,138, 68,108, 73,199,160,244,123,183,110,221, 80,183,110, 93,112,102,196,202, 96, 89, 22, 79,158, 60,193,
-254,147, 87,225,230,227,143,164,167,209,120,120,246, 52,234,200, 29,208,180, 85,107, 24,141,198,215, 10,189,241, 38, 96, 52, 26,
-119, 54,108,216,144,211,235,245, 87, 1,108, 12, 11, 11, 27,167, 80, 40,102,158, 58,117,202,125,248,240,225,105,167, 79,159, 94,
- 7, 96, 87, 88, 88,216,148,239,190,251,174, 7, 77,211,149,206, 22,164, 40,234,247, 47,191,252,178,235,240,225,195, 9, 17,105,
-212, 95,188,176, 91, 64,211, 70,226,171,175,119, 50, 33, 55,174,146, 52,109, 36, 62, 24,245, 37,123,246,207, 48,114,242, 23, 63,
- 50, 45,223, 29,128,240,240,112,215,192,192,192,239,140, 70, 99,181, 66,171,212, 82, 85,149,133,146,162, 40,140, 27, 55, 14, 7,
- 14,152,238, 65, 53, 1,240,181,241,177,186,243,195,166,158, 86,132,160,168,156,200,170,143,160, 19,119,243, 51,158,166,189, 85,
- 34, 11, 0,114,114,114,182, 1,216,198,178,108,134,165,165, 37, 10, 11, 11, 43,171,127,210,176,176, 48,169, 88, 44, 70,239,222,
-189, 29,130,131,131, 99, 73,146, 92,159,150,150, 86,165,226,168,108,152,176,178,225, 68,188,198,172, 67,123, 57, 2,219,117,106,
-101, 29, 99,187,220, 90, 42,208, 62,170, 19, 43,181, 33, 0, 20,232, 92,158,223, 74, 28,169, 36, 50, 37, 45, 91,119,123, 7, 54,
- 2,203,192,124,186,176, 82,161, 69, 82,212,195,130,188,252,126,202, 66, 61,110,220, 12,199,168,145, 13,160, 51, 16, 96, 89, 18,
- 69, 42, 29, 64, 9, 65, 2,248,240,163,177,224, 8, 1,114, 51,210, 64, 81, 84, 24,104, 26,111, 25, 22, 76,153, 50,165,223,215,
- 95,127, 93,111,238,220,185,152, 59,119,174,207,142, 29, 59,182,253,240,195, 15,115,179,178,178,154,161,134,224,227,213,240,212,
- 57,125, 96,241,236,147,215,183, 22, 12,104,175,121,250, 78,163, 98,203,215, 59,141,144, 43, 20,226,153,128, 66, 14,199, 85,116,
- 51, 10, 12, 12,236, 82,126,255, 31,195,203, 78,240,101,223, 77,242,209,106, 80,207,163,111,171,150, 1, 95, 44,252,122,161,117,
-212,173, 16,204,255,118, 35,215,176,117,175,194,109,215, 31,234,139, 44,235,246, 43,202,126,118,211, 84,125, 1, 0,125,187, 15,
- 69,243, 38,109, 95,249,177, 99,183,226, 96,237, 55,174, 60, 64, 70, 86,170,201,141,109,137, 56,168,212, 39,203,148, 41,253, 47,
- 67,163,209,228,135,135,135, 59,167,164,164, 84,112,124,175, 91,183, 46, 8,130,192,221,187,119,113,231,206, 29,140, 26, 53, 10,
- 2,129, 0, 66,161, 16, 87,175, 94, 53,203, 26, 83,206,186,244, 4,197,179, 14,251,120,122,122, 86, 53,219,176, 70, 46,141, 70,
-131,130,130, 2, 92,184,112, 1, 13, 26, 52,192, 15, 63,252, 0,119, 55, 23, 44, 92, 56, 27, 44,203, 66,169, 84,130, 97, 24, 83,
- 45, 90,108,169,181,136,101, 89,100,101,101,161, 94,189,122,216,180,105, 19,214,173, 91,247,157, 66,161, 56,101,110, 26,189,188,
-188,236, 24,134,249,106,192,128, 1,189, 6, 15, 30,140, 62,125, 42,198, 99,221,183,111,159,245,209,163, 71, 87,108,216,176,161,
-175,193, 96, 88,153,153,153,153,101, 10,239,111,191, 21,135, 95,146,189,187, 20,243,135,215,193,152,105,187,177,118,237, 49, 72,
- 36,146, 10, 13,239,242,229,203,171, 21, 49, 44,199, 53, 20,101,223, 74,155, 61,111,141,243,138, 21,193, 8, 14,206, 4, 73,146,
-112,115,115, 3, 73,146,120,241,226, 5, 72,146,132,143,143, 15, 72,146, 68,106,106,106,169, 79, 96, 30, 42,153,245, 88,121, 47,
-156,132, 86,171, 69,114, 82, 2, 82,226, 98, 97,165, 76,135,220, 70,134,188,136, 39,104, 62, 97, 98, 89,252,167,127, 24,127,232,
-245,250, 63,202,125, 95,115,250,244,105, 61, 65, 16, 31,160,216, 79,163,212,162,241, 29, 77,211,223, 85, 69,242,238,187,239,182,
-252,250,235,175,133,165,225, 54,220,189,191,167, 13, 6, 3, 11, 0,141,154,119,174,160,246,159, 61,123,134,181,107,215, 66,165,
- 82, 65, 36, 18,137, 76,185, 15, 44,203,150,205, 48,172, 76,132,153, 35,178, 0,192,209,199,243,151,187,161, 87,153,199,113, 91,
- 53, 97, 49,231, 44, 20, 73, 36, 72,253,219, 43,178, 94,182,108,121,122,122, 46,101, 89,150,227, 56,110,113,185,159, 36,222,222,
-222,215, 47, 94,188,232, 72,211, 52, 54,108,216, 96,151,158,158,110,215,185,115,231,249, 0,170, 20, 90,149, 13, 19, 86, 54,156,
-136,114,179, 14, 37, 18,137,131, 94, 95,165,241,228,149, 89,135, 12, 3, 63, 27,107, 59,228, 33, 5, 58, 39, 99,203,124, 71, 58,
-247,146, 98,226, 35,247,196, 86, 77, 44, 25, 99, 61, 82,169,135,135,204, 14, 44,199, 85, 57, 53, 90,103, 52,158,123, 20,250,176,
-183,183, 87, 3,234, 84,208, 53, 12, 26, 50, 28, 58, 29, 9,173,145, 0, 65, 9, 65, 80, 34, 52,107,222, 10,141,155, 54, 7, 7,
-224,193,189, 91,180,222,104,188,244, 54,149,189, 91,135,207, 71, 17, 4,214,131, 99,185, 74,226,104,213, 27, 50,100,200, 10, 0,
- 95,212,196,227,252,238,231,163, 72,178,152,167,124, 28,173, 47, 63,159,130,136,123, 66,219,107,161,171, 68,125,222,197,153,172,
- 96, 2, 50,233,255,102, 29, 10,201,215, 10,205,241, 95, 17, 92, 53, 11, 45, 47, 47, 47, 59, 27,137,244,183,207, 38,124, 98,157,
-248,248, 54,210, 35,239,226,230,181,216,188,131, 71,143,229,170,114, 50, 39,152, 33,178,202,134,249, 28, 93,235,160,174,255,171,
- 66, 75,106, 37, 7, 0,212,245,111, 11,202,210,214,220, 33,143, 87,172, 89,181, 17, 89,229, 95,216,149,197,208,154, 60,121, 50,
-118,236,216,129, 14, 29, 58,160, 97,195,134,101, 47,123,115,173,102,149, 88,151,204,158,109, 88, 30,133,133,133,240,241,241,193,
-246,237,219, 17, 22, 22, 6,107,107,107,140, 26, 53, 10,133,133,133,101, 2,203, 84,103,120,142,227,158, 93,188,120,177,205,136,
- 17, 35, 56,161, 80, 72,228,231,231,195,206,206, 14,155, 54,109, 82, 41, 20,138, 51,181, 16, 89,195, 69, 34,209,236,145, 35, 71,
- 82,141, 26, 53, 66, 70, 70, 6,108,108,108,140, 4, 65, 8, 1,192,206,206,206,104, 97, 97,129, 41, 83,166,160, 69,139, 22,157,
-230,206,157,219, 65, 32, 16,108, 74, 75, 75,219, 93, 93, 93, 34, 8,162,172, 65,157,176, 62, 26,122,125,113, 3,189,121,243,102,
-148,248,186,253,111,136, 32, 46, 14, 48, 97, 38,139,149,149, 21, 26, 54,108, 88,105,217,119,234,212, 9, 15, 30, 60, 40, 30,154,
- 20, 8,224,236,236,140,155, 55,111,154, 52,147,170, 52, 16,100,120,120, 56,252,235, 58, 33, 44,248, 34,156,100, 66,180,112,119,
-133,103,167, 46,136,141,141,253, 39,173, 89, 4,138,253, 48,122,150,212,193,157, 0, 38,151,251,190, 9,192, 47,230, 16,210, 52,
-205,145, 36, 73, 36, 39, 39, 27,100, 50, 25,225,224,224, 32,144, 72, 36,208,233,116,101,130,235,217,179,103, 8, 10, 10, 66, 74,
- 74, 10, 28, 28, 28, 72, 91, 91, 91, 24, 12,134, 60, 83,248,253,252,252,224,234,234, 90,193,241,125,194,132, 9,181, 18, 89,227,
-128,128, 29,223,175,172, 35, 33, 41, 91,127,167,190,120, 30,253, 66, 75,234, 33,253,255, 32,178, 0, 32, 63, 63,127, 27,128,109,
-165,223,157,156,156,198, 83, 20,181, 80,167,211,217, 94,189,122,213, 78, 46,151, 19,187,119,239, 54, 46, 94,188, 56,159,162,168,
- 60,130, 32,126,254,231,197, 33, 34,179, 11,226,124,132,246,238,236, 99, 45,119,107,102,242,252,198,121,194, 6,114,162,105, 0,
-134,100, 70,221, 24, 79,199,181,207, 80,164,147, 28,216,200,106,222,193, 59,231,127,189,252,171,216,232,135,222, 82, 27, 41, 38,
- 79,249, 26,103,206, 95, 1, 65, 10,113,253,214, 93,232, 13, 12,178,115, 11, 48,242,195,209,240,116,115, 66,228,157, 11, 89, 52,
-203,110,122,187, 68, 54,187,177,247,160,241,246, 18, 11, 89,201, 61, 97,240,199,175,179, 65,146,235,177,100,201, 18, 4, 4, 4,
- 76, 11, 15, 15,255, 6, 53,196,209, 34, 8,118, 99,179, 46, 31,218,139, 36,197, 60, 28,203, 96,251,225,249, 37,113,180,102, 97,
-211,182,163,205,154,214,125,190,172,186, 56, 90,111,145,200, 42,191,175, 94,104,249,248,248, 72, 44,133,152, 36,164, 4,115, 63,
-251,104,176, 60, 51, 46, 2, 41, 81, 15,139,135, 23, 12, 26, 67,250,211, 40, 83, 66,161,247, 68,197,248, 29, 92,117, 67, 87, 90,
-173, 73, 61,250, 10,156,165, 13,238,203,214, 44, 51, 69,214, 43,156,229,197, 86,249,184, 89, 94, 94, 94, 88,177, 98,133, 41,113,
-180, 94,206,123, 41,250,160,216, 1,190,188, 51,124, 31, 19, 69, 86,165,156,114,185, 28, 57, 57,197, 17, 18,186,118,237,138,174,
- 93,255, 55,159,193, 96, 48,148, 89,177,172,173,173, 43,179,104,189,194,105, 97, 97, 49,255,216,177, 99,159,220,186,117,107,196,
-156, 57,115,132, 61,122,244, 40, 21,115,106,152,182,182, 91, 5, 78,134, 97,166, 92,184,112,129, 98, 89, 22,219,183,111,199,131,
- 7, 15, 56,153, 76,182, 72, 38,147,109,180,176,176, 96, 52, 26,205,228,137, 19, 39,142, 94,182,108, 25,217,169, 83, 39,220,190,
-125,155,172, 87,175,222, 88,160, 66, 16,203, 74,243,126,247,238, 93,144, 36, 9, 58, 55, 9,211,230, 31,132,165,133, 0,209,209,
-209,200,205,205,125, 37,136,169, 41,247,179,188,165,164,116,235,212,169, 83,217, 48,100,187,118,237, 64, 81, 20, 30, 61,122, 84,
-213, 48,108,121, 78,206,209,209,177,172,126,136, 68, 34, 92,185,114, 5,223,126,251, 45,188, 29,236,144, 23, 21, 6,215,174,221,
-209,235,147,137, 24, 53,106, 20, 40,138,130,131,131, 67,153,229,215,132,186,244, 58, 40,207,249,137,191,191,255,216,200,200, 72,
-207,102,205,154,185,133,135,135,119, 11, 8, 8,240, 9, 11, 11, 43,253, 46,129,105,190, 57,101,156,247,239,223, 63,178,113,227,
-198, 41,227,198,141, 19,177, 44,203, 36, 38, 38, 26, 1, 16,174,174,174,212,253,251,247,217, 83,167, 78, 65,163,209,192,211,211,
-147,244,240,240, 32, 46, 93,186,196, 70, 69, 69,221,229, 56,238,107, 83,242,206, 48, 76,133, 48, 14,165,159,247,237,219,103,246,
-243, 94,167,177,223, 15, 61, 58, 55,242,202, 78,123, 4, 69,106, 28,152, 2,185, 33,232,196,105,157,153, 34,235,175, 46,163,191,
-147,115,249,211,167, 79, 61,116, 58, 29,196, 98, 49, 54,111,222,108, 88,177, 98, 69,100,118,118,118, 71, 84, 62,163,188, 2,103,
- 45,103, 29,230, 86,195,249,202,172,195,130, 28,156, 57,113,242,126, 27,171, 33, 59, 49, 45, 45,171,204,177,145, 35, 8,135, 99,
- 46, 77, 58,202,218, 54, 75, 37,207, 46, 37, 11, 25,245,153,106,242,174,215,232,245,195,135, 12,253,240,242,129, 3,251,173, 22,
- 47, 93,138,155,119,195,144,147, 95, 4,150,163,192, 18, 4, 22, 46, 92, 12, 87, 39, 7, 40,211,158,170,117, 6,195, 16, 84,140,
-161,245,159, 47,119,130, 32,167, 95, 58,181,123, 61, 73,128, 85,101,196, 72,168,194, 56,217,152, 81, 67, 4,195,135, 15,199,177,
- 99,199, 16, 30, 30,190,181, 26,145, 85,198,201,113,228,244,176,171, 7,215, 19, 0,171,201,138,145, 8,138,158,203,198,126, 52,
- 68, 48,106,212, 40, 28, 15,186,133, 3,167,159,111, 57,112, 26,167,241,118,195,252,200,240,214, 2,132,119,108,226,235,209,169,
- 85, 83,169,128,209, 32, 37, 42, 14,185, 42, 45, 46, 69, 36,230,147, 28, 89,235,216, 58,197, 47, 72, 17,146,146,158, 86,210,179,
-146,150, 52,232, 90,179, 56, 73,146,172, 96,205,122, 29, 75, 86,249,116,186,184,184, 84, 88,206,165,124,195, 93,234, 3, 84,139,
-208, 14,243,147,146,146,108,146,146,146,192,113, 28,238,222,189,107,211,174, 93,187,249,175, 99,205,154, 61,123,118,153,213,234,
-229,125,101,199,106, 66,137, 83,250, 58,163,209,120,120,238,220,185,211,218,181,107,215,123,233,210,165, 4,204, 88,128,247, 37,
-107, 14,205,178, 44, 66, 66, 66,112,236,216, 49,198, 96, 48, 76, 82, 40, 20, 97,229, 78,217, 16, 26, 26,122,105,232,208,161,187,
- 99, 98, 98,168,200,200, 72,112, 92,205,243, 78, 53, 26, 13, 26, 54,108, 8,154,166,177,106,154, 23, 10, 11,155,129,166,105, 48,
- 12, 3, 75, 75,203, 50, 43, 94,121,241, 92, 83, 61, 98, 24,230, 21,161,117,247,238, 93, 80, 20,133,142, 29, 59,226,225,195,135,
-101, 22,173,154, 44, 80, 6,131, 33,201,197,197,197,101,249,242,229,101,233,202,202,202,194,197,139, 23,241,238,123,237,209,100,
-210,100,164,165,165,225,231,159,127,134,187,187, 59,126,248,225, 7,228,230,230,130,166,233,191,219,156,222, 47, 50, 50,210,243,
-163,143, 62,202, 12, 11, 11,243, 12, 10, 10,178, 11, 12, 12,180,252,240,195, 15, 51,195,194,194, 60, 9,130,104, 15, 51,157,160,
- 89,150, 93,176,112,225,194,243, 63,252,240,195,252, 47,190,248,162,221,184,113,227,132, 66,161,144, 77, 77, 77,165,247,239,223,
- 79, 52,108,216,144, 20,137, 68,196,133, 11, 23,216,123,247,238,221,161,105,122, 21,128,235,230, 88,156,203,139, 44,138,162, 76,
- 21, 89, 21, 48,211, 89, 50,214,154,204,234,184,113,243, 10,178, 81, 93, 79,195,158,253, 23,147,175,223,126, 26, 79,233,232,153,
-191, 85, 19, 26,224,109, 6, 69, 81,135,252,253,253,199, 79,159, 62,221,162, 79,159, 62,146,101,203,150, 21, 20, 22, 22, 86, 37,
-178, 42,233, 48,255, 45,179, 14,127, 93, 48, 39,104,230,151,205,198,251,126,234, 90, 7,193,170, 76,228, 9, 40,210,198,142, 68,
- 43, 31, 10,133,217,207,228,167, 47,239,122, 1,160,166,184,108,247, 67,159,132,247,108,218,172,229,209, 85, 63,172,114, 94, 52,
-111,174,240,104,208, 57,112,180, 1,119,175, 94,133,149,136,225,162, 66,131, 51,116, 6,253, 96,188,133, 75,240, 40,110,254,114,
- 0,192, 73, 7, 7,135,199,159,140, 27,215,208,223,255, 67,200,100, 50, 28, 57,114, 4,127,108,216,192,172, 3, 70, 72,128,135,
- 83,106,136,167,151,121,167,140,231,209,196, 79, 62,241,107,213,234, 83,200,100, 50, 28, 62,124, 24,187,215,173, 51,153,231, 63,
-142,210,200,240,103,240,191, 8,241, 53,248,104,145, 68,225,157,167,137, 69,119,159, 38, 22,129,229, 56,150,227,116, 36,137,100,
-149,193,240,195,211,231,169,181, 18, 5,165, 67,135,223,125, 63,253,205,141,121,148, 19, 63,181,157,210, 93,137,200, 74, 41,191,
- 70, 90,249, 70,186,170,207, 70,163, 49,197, 68,250,149,222,222,222,175, 28,171,189,233,151, 51, 75,100,153, 26, 71, 11, 0,114,
-114,114, 20, 0, 22,221,190,125,123, 95,239,222,189, 39, 2, 72,173,101, 25,109,239,210,165,203, 36, 0, 20, 65, 16, 91,211,210,
-210,194, 94,121,224, 21,138, 88,119,119,247, 31,235,214,173, 59,185,184, 99, 74,108,175,161, 33,127,222,172, 89, 51, 67,101,101,
- 81,213,119,150,101,107, 44,163,252,252,124,180,109,219,246,149, 53, 45, 57,142, 67, 98, 98, 98,169,197,169,236,222, 87, 39,224,
-138,138,138, 38,127,254,249,231,219,132, 66,161, 55, 0,162, 84,228, 50, 12, 67,253,242,203, 47, 82,134, 97, 40, 0, 4, 73,146,
-180, 80, 40,212, 30, 59,118,140,166,105, 58, 73,167,211, 77,254,155, 95, 16,135,137,226,165, 24, 84,145,145,145,141, 74, 44, 89,
- 41,225,225,225,143, 14, 28, 56, 32, 7,112,176,150,188,215,213,106,245,245, 21, 43, 86,116,218,188,121,243,130,201,147, 39,183,
- 29, 53,106,148,160,107,215,174, 56,115,230, 12, 19, 18, 18,114, 87,163,209,172, 52, 71, 96,149,148,101,129,151,151, 87,153,224,
-170,225, 89,174,214,145,215,209, 71,178,113,244, 84,119,233,246,149, 23,139,178,211,244,183,140, 69,250,175,119, 1,225,248,127,
-140,140,140,140, 57, 0, 22,255,252,243,207,105, 45, 90,180,144,136, 68, 34,189,169, 34,235,111, 4,205,230, 23,245,255,169,215,
-176,147, 93, 22,126, 94,183, 87,183,142, 50,175, 58,206, 30, 81,113, 25,120,118,251,140,234,241,233,239, 19, 56, 93,222, 32, 0,
-166,120,174,223,211, 25, 12, 13,102,207,157, 61, 77, 44, 20,246,102, 24,166,121,143, 75, 39, 56,138,162,194,244, 70,227,165,146,
-225, 66,237, 91, 92,228,223,253,248,227,143, 13,253,253,253,113,228,200, 17, 92,218,187, 23, 35,179,179,113,133,162, 40, 82, 36,
-114, 60,109, 48,172,129,105, 2,233,187,181,107,215,250, 5, 4, 4,224,208,161, 67,184,176,123, 55, 70,212,142,167,170,182,174,
- 13, 0,121,201,215,108, 0, 49, 0,222, 1, 96, 1, 64,135,226,165,157,156,202, 55, 97, 37,191,149,254,126,141, 32,136,191,210,
- 17,182,230,200,240, 47, 35,252, 89,194, 59,111, 58, 21, 26,141, 38,183, 97,195,134,102,205,185, 54, 26,141,213,142,225,210, 52,
-157,226,235,235,107,178,213,194, 20, 81,148,155,155,219,250, 47, 44,140,215,242,197,170,208,136,176,108,130,155,155, 27, 91,218,
-232, 87, 38,194, 42, 59,198, 1, 47,204,249,159,244,244,244, 24, 0, 95,214, 54,157,105,105,105, 71, 97,194,162,209,166,158, 7,
- 0,121,121,121,111,124, 49, 95,130,227, 82,151, 45, 91,102,150,192, 6,199, 85, 39, 62,195,138,138,138,218,153,242,223, 6,131,
- 1,255, 32, 14,149,108,100,120,120,248, 68,130, 32,250,160,120, 72, 96, 43,222, 76, 52,239,235, 74,165,242,250,234,213,171, 59,
-109,223,190,125, 38,199,113, 80, 42,149,235,204, 21, 88,101,189,231,204,204, 51,111, 42,227,185, 25,250, 63,247,111, 77,233,174,
-201, 55,204,220, 81,164,223, 13, 30,101,198, 40,142,227,126, 31, 51,102,204,187, 0,118,189, 46, 89, 21,179, 14, 95, 23, 47,216,
-188,130, 22, 87,102,127,251,201, 21, 59,235, 1, 96, 4,141,160, 39, 79, 67,159,115, 6,192,111, 48,205,205,161, 44,191, 52,203,
-174,165,245,250,181,229, 26,151,255, 15,229,236, 16, 16, 16, 48,115,252,248,241, 88,188,120, 49, 46,172, 89, 99,152, 74, 16, 5,
- 66,128, 59, 95,220,209, 36, 9, 96,158,169, 60, 99,199,142,197,226,197,139,113,118,213,170,218,242, 84, 7, 57, 65, 16, 65, 0,
- 48,127,254,252,175, 87,172, 88, 97,191, 96,193,130,230, 43, 87,174,252,161,228,123, 68,233,239, 37,109, 93,224,130, 5, 11,154,
-150,251,189, 16,192,253,191,248,126, 86, 26, 25,254,175, 70, 79,158,147,231,228, 57,121, 78,158,147,231,228, 57,121,206,215, 1,
-199,113, 3,138,119, 85,239,171,250, 92,110,143,191, 57,205,197, 19,161,248,142, 27, 15, 30, 60,120,240,224,193,227,191,136,242,
- 86,172,218,252,254, 6, 81,234,163, 85, 30,219,129,226,105,221, 85,169, 82,115,102, 61,212, 70,217, 6,243,156, 60, 39,207,201,
-115,242,156, 60, 39,207,249,255,142,179, 38,238, 87,174,231, 56,110, 0, 65, 16, 65, 28,199, 5, 86,181, 47, 21, 86, 47,127, 46,
-183,127, 99,110, 7,149,160,212, 55,171,204, 71,235,239, 10,217,195,155, 85,121, 78,158,147,231,228, 57,121, 78,158,147,231,124,
- 45,148, 14, 1, 2,224,230,207,159,191,224, 95, 56,116,232, 86, 34,178,202,182, 26,135, 14, 57,238, 48,149,154, 10, 27,177, 88,
- 38, 2, 0,189, 94,109,240,240,128,146, 32,134,255,147, 11,222,242,248,111,162,116,186,119,198, 27, 62,151, 7, 15, 30, 60,120,
-252,255, 64, 86,169,165, 10, 64, 22, 0,162,228,187,190,100,159, 85, 34,200, 94,254, 92,225,247,191, 16, 10, 84,225,252, 46,168,
- 74,100,101,103,203,156, 4,130, 60, 63,134,209, 54, 6, 0,129,128,140,206,206,182,143,229,184,195,217,181, 17, 91, 78,206,206,
-161, 66,138,242, 48,229, 92, 35,195,164,102,103,100, 84, 12, 29, 79, 16,111,131,192, 51, 85, 68,188,142,216,248,203,133,138,147,
-147,147,139,139,139,203,251, 54, 54, 54,239,229,231,231,223,203,202,202, 58, 94,205,186,135, 43, 8, 2,115,139,235, 21, 86, 3,
- 88, 80, 13,181, 57,231,190,140,134, 50,153,108, 26, 65, 16, 1, 37, 15, 88,184, 90,173,222, 12,224,233,255,195, 23,146, 5,128,
-193, 2,129, 96,172,147,147, 83,219,244,244,244,101, 0,106, 27,205, 91, 0, 96,182,157,157,221, 72, 59, 59, 59,223,220,220,220,
-120,165, 82,121, 8,192, 90, 0, 53, 78,149, 94,246,133,219,123, 93,251,116, 93, 20,114, 33,228,187,101, 27, 20,183, 95,249,125,
-182,155, 99,239, 94, 29, 22,135,156,190,181,252,235, 77,105,185,102,166,141, 44,217,128,226,217,145, 28, 94, 13,246,250,186, 16,
- 2, 24, 8,160, 43,128, 16, 0,167, 77,201,119, 21,120, 23,192,215, 37,105, 94, 11,224,202,191,188, 30, 89,186,184,184,172, 2,
- 48, 80, 32, 16, 68,166,166,166, 78, 2,144,242, 15,167, 73, 0,160, 13,128, 0, 20,135,225,184, 15,211, 66, 56,212, 8, 71, 71,
-199, 64,129, 64, 48,173, 36,180,203,230,156,156,156,160,127,107,193,136,197,226,117,174,174,174,159,106, 52, 26, 53, 65, 16, 92,
-249,120,143, 52, 77,167,100,103,103,183,126,219, 94,106, 4, 65,220,255,151, 39,113, 82, 37,199,170,142,163,149,154, 10, 27,129,
- 32,207, 47, 51, 61,108,100,154,226,201, 8, 0,112,119,107,126,200,217,181,217,193,212, 84,177,193,181,209, 16, 43,161, 76,176,
-153,162,132, 45,181,122,157,147, 80, 32,204, 54,208,198, 71,164,158,155,150, 30,115,188,210, 96,139, 66,138,242, 72,136,189,226,
- 76, 27,114, 33,148,186, 67,104,225, 93,101,106,221,221,221,107,149, 75,123,123, 95,107,131, 68, 58, 83, 40,164,122,177, 28, 29,
-192,177, 0, 73, 8,195,105,198,120, 89,164,211,253,148,151, 23, 95, 88,219, 59,216,200, 17,174, 28, 48, 10, 4,122,129,195, 37,
- 2, 56, 16,147,131,116, 51, 40, 76, 21, 17,175, 35, 54,202, 95,251, 51,128, 57,111,186, 38,121,120,120,216, 7, 6, 6,174,251,
-246,219,111, 45,172,172,172,136,164,164,164, 62,243,230,205,235,252,224,193,131, 47, 83, 83, 83,211, 94, 22,125, 4,129,185, 44,
-203,145, 0, 64,146,196, 60,185,220, 89, 70, 81,212, 43,177,141, 24,134,145,101,101,101, 78,103, 89,142, 40, 57,119, 46,199, 97,
-189, 41,130, 81, 42,149,126, 24,208,172,229,151,171,126, 92,107,229,226,236,108, 73, 51,172,225, 69, 98,130,108,209,252, 57,237,
-226,158, 61, 93,175,213,106,247,215,230,185,166, 40,106,164, 68, 34, 9, 4,224, 95,114, 44, 74,167,211, 5, 49, 12,115,208,212,
- 6,221,197,197,229, 26, 69, 81,117,204,249, 99,134, 97,146, 50, 50, 50, 58,214,178,136,134,123,123,123,255,214,165, 75, 23, 89,
-219,182,109, 33, 22,139,177,120,241,226,217, 10,133,162, 38,161, 37, 0, 48, 91, 38,147,141,180,180,180,244, 45, 42, 42,138,211,
-104, 52, 71,197, 98,113,207,245,235,215,123,117,232,208,193, 58, 35, 35,131,160, 40,202,229,236,217,179, 31,175, 91,183,174, 15,
- 77,211, 61,106,106,228, 10,226,184, 69,146,129,254,157, 10,226,174, 44, 2,208,239,229,223,105,173,116, 44, 71,121, 5,106,184,
-135,201, 37,226,195,100,145, 37, 20, 10,215,187,186,186,142,215, 22,199, 10,224, 94,110,112, 0, 64,175,215,231,229,231,231, 55,
-170,205, 35, 15, 96,130,157,157,221,248,175,190,250,202,190, 95,191,126,216,187,119,239,103, 59,118,236,200, 83, 42,149,191,163,
- 56, 16,102,140,153,156,115,211,211,211,251, 11,133, 66,194,203,203,139,210,104, 52,230, 8, 45, 63, 20, 47,194,124, 31,192,102,
- 20,135, 46,232, 6, 20, 63,239, 0, 86,151, 10, 55,146, 36, 55, 55,106,212,232,253,168,168,168, 45, 0,190,171,237,179,238,234,
-234,186,109,211,166, 77, 35, 6, 13, 26, 68,101,101,101,121,180,104,209, 98, 95,122,122,122,167, 55,240, 26,249, 68, 34,145,204,
-106,222,188,121,147,152,152,152, 88,165, 82,185,182,228,126, 86,247, 76,121, 2,232,105,103,103,215, 99,225,194,133, 86,129,129,
-129,216,190,125,123,255, 29, 59,118, 20, 21, 22, 22, 94, 70,177, 79,207,107,137, 64,129, 64, 48, 45, 37, 37,197,137,227, 56,184,
-185,185, 77, 3,240,175, 20, 90, 36, 73,174, 31, 58,116,232,248,125,251,246,201, 18, 18, 18,100, 30, 30, 30,101,193,179, 9,130,
-168,117,251,201,227,181,177,189,156,224,170, 57,142,150, 88, 44, 19, 49,140,182,113,154,226,201,136,206, 93,126,177, 5,128,107,
- 87, 63, 31,225,236,218, 52, 92, 44,150,197, 74,108,164,199,134, 14,236,217,114, 88, 96, 23,194,211,205, 25, 41,138, 76,151, 95,
- 15, 92,232, 27,116,225,202, 49, 20, 7, 16,171, 20,180, 33, 23, 22,134, 96,196,220,216, 0,167,174,105,216,120, 54, 5,183, 31,
-191,128,186, 32, 27,117, 92, 45,240,227,204,222,112,181,151,213,174,235,229,220,176, 27, 45,144, 28,252,232,195, 49,182,239, 15,
-246, 23,250,184,186,130,227, 36,136,141, 43,106,127,238,226,149, 54, 71, 15,239,159,102, 41,108, 56, 82,149,249,212,228,151, 91,
- 43, 55, 88,168, 12, 24, 44,160,136,143, 59,180,110,210,227,195,254,157,200, 38,254, 13, 16, 25, 17,213,251,228,159,119,127, 36,
-111, 69, 92,166, 25,110,143,165, 8, 39, 30, 42,170, 13,232,247,138,224,232,209,163,103, 39,137, 68, 82, 33,120,146, 78,167, 19,
- 93,190, 28,252,110,109,196, 70,233,127,232,245, 58, 82, 40, 20,131, 36,137, 47, 3, 2,154,249,103,103,103, 95, 33, 8,226,183,
-180, 52,243,172, 5,159, 3,226, 60,129,224, 29, 82, 34,113, 99,244,122, 71, 0, 32,196,226,188, 23, 36,217,108,225,215, 95, 91,
- 81, 20,197,230,228,228, 64,173, 86, 19, 19, 39, 78,148,198,197,197, 13, 77, 77, 77,221, 80, 67,143, 4, 59,118,236,240,115,115,
-115,123,101,245, 88,133, 66, 33, 30, 52,232,253,218, 20,189, 95,243, 22,173,102, 93,184,112,222, 95,153,155,167,221,241,243,182,
- 80,163, 84,166,171,231,223, 72,184,121,251,110,219, 73,227, 71,127, 30, 29, 29,241, 8,230,173, 87,231,109, 97, 97,113,108,205,
-154, 53, 1,221,186,117, 19, 58, 59, 59, 35, 35, 35, 3, 81, 81, 81, 1,127,254,249,231,224,221,187,119,207,214,104, 52, 67, 1,
-147, 22, 68,109,120,121,207,111,206,150, 14,142, 96,140, 70,184, 55,111, 85,230, 32,249,236,207,139,160, 13, 6,176, 70, 35,252,
- 3, 7,151, 88,147, 57,248,251,251,215, 54,234,174,123,211,166, 77,255,248,225,135, 31, 68, 58,157, 14,119,239,222,197,149, 43,
- 87, 88,133, 66, 81, 83, 64, 92, 1, 65, 16, 23,151, 46, 93,234,217,177, 99, 71,235,236,236,108, 48, 12,227,116,226,196,137,105,
- 45, 91,182,180,241,242,242, 18,239,217,179, 7, 69, 69, 69,160,105,218,193,215,215,215,225,195, 15, 63,212,239,217,179,103, 54,
-128, 85, 85, 89,178,148,113,220, 34, 5,225,219,183,209, 59, 99,145, 78,156,239, 59,171, 47,206,217,212, 39,202, 44, 91,125,125,
-125,173,149,169,178,121, 86, 54,205, 28,148,169,193,243,250,250,250,238, 56, 31,111, 82,103,136, 44,105,108, 62, 58,112,224,128,
- 44, 42, 42, 74,230,239,239, 15,150,101,203, 34,240,151, 6,156,109,216,176, 97,109,238,227,202, 41, 83,166,204, 27, 49, 98, 4,
-154, 55,111, 94, 22, 20,117,201,146, 37,152, 55,111,158,253,181,107,215,102,239,223,191,127,246,241,227,199, 87, 1,152,111,166,
- 53,166, 20,230,150,241, 55,207,159, 63, 31,126,236,216,177,209,115,231,206,109, 8, 96, 58,128,197, 57, 57, 57, 93, 74,172, 49,
-226, 18,161,245,201,236,217,179,167,206,159, 63, 31,253,251,247, 95,124,247,238,221,239,107,105,229,163,104,154,238, 63,104,208,
- 32,202,104, 52,194,210,210, 18, 70,163,177,254,235, 26, 37, 0,108,154, 60,121,242,212, 41, 83,166,192,222,222, 30, 70,163,209,
-239,192,129, 3, 59, 22, 47, 94,252, 30,128, 9, 85,164,117,236,212,169, 83, 63, 24, 51,102, 12, 90,183,110, 13,129,160,248, 54,
-174, 89,179, 6,203,151, 47,183,186,120,241,226,224, 61,123,246, 12, 62,121,242,228, 81, 84, 92,182,203, 44,176, 44, 11,129, 64,
-128,228,228,100, 56, 59, 59, 75, 88,150,189, 64, 16,196,246,220,220,220,227,255,162,198,124,245,240,225,195, 63,218,183,111,159,
- 21, 0,252,248,227,143,152, 53,107, 22, 92, 92, 92, 96,101,101,197, 75,157,127,143, 69,107, 82,141, 22,173,154,160, 86,171, 91,
- 45,248,226, 99,144,100,113,175,177, 65, 61,111,172,248,122, 18,113, 50,232, 66,171,106,109,240, 82,119,196,220,216, 0,137,215,
- 76,232,140, 52,238, 60,126,142, 75, 63,246, 41,110, 45,251, 45,132,206,208,163,180,177,113, 16, 91, 88,172,214, 51,204, 77,184,
-186,222, 69, 98, 98, 86, 77, 34, 75,238,234, 18,180,117,235, 42,139,128,250,141, 96,160,141, 72,205, 76, 5, 65, 72,224,233, 97,
-141, 79,198,246, 19,118,233,226,238,244,205, 55,219,206,164,179, 24,162,206,126, 90, 99,192, 80, 63, 39,236,106, 21,208,112,196,
-135, 3, 58, 74,154, 5, 52,133, 72, 98, 81,246,219, 59,173, 91,227,157,214,173,201,249, 69,133,189,238,221, 15,237,117,228,226,
- 29,157,218,152,120, 40, 54, 27,227,106,120,201,148, 9,142, 25, 51,102,192,197,197,165,194, 9, 25, 25, 25,248,243,207,203,149,
- 94, 99,198,139,172,236, 63,190,255,254,123,235,188,188,188,126, 59,119,238,236,206,178,236,247,233,233,233, 55, 76, 33, 25, 3,
-212, 41,144, 72,122,140, 95,187,150,109,249,254,251,148,157,171, 43,201, 50, 12,145, 22, 31,239,248,243,134, 13, 93,115,159, 61,
-179, 80, 57, 56,228,230,105, 52,234,216,216, 88, 72,165, 82, 66, 32, 16,180,169,132, 42,131,227,176,154, 36,137,121, 4, 65, 64,
- 34,145,198, 78,153, 50,229, 97,201,111,117, 78,159, 62, 45, 27, 56,112,160, 26, 64, 2, 0, 72, 36, 82, 15,138, 34,253,138, 29,
- 8,177,218, 20,129,105,105,105,249,197,119, 63,172,178, 84,230,230,107, 12, 42,149, 81,110, 99, 69, 16, 86,214,148,178,160,176,
- 48, 85,145,165, 91,184,108, 57, 53,249,147, 49, 95,168, 84,170,105,166,138,172, 22, 45, 90,220, 59,118,236,152,179,163,163, 35,
-242,243,243,145,147,147,131,123,247,238,129,101, 89, 12, 29, 58, 84,210,190, 93,219, 86, 95, 47, 92,116, 59, 57, 53,245, 61, 83,
-196,150,165,131, 19,126,236,216,178,184,177, 78,200, 41, 43,159,237,195, 3,203,206, 89,158, 82, 80,106,157,123,157, 37,164,222,
-235,209,163,135, 8, 0, 38, 76,152,160, 44, 44, 44, 92, 1, 96, 31,106,142,232, 63,123,209,162, 69, 30,245,234,213,243,217,183,
-111, 31,138,138,138, 0,192,185, 94,189,122,240,243,243, 99, 66, 66, 66,224,231,231, 7,107,107,107, 92,187,118, 13,183,111,223,
- 70,235,214,173,173, 69, 34,209, 8,131,193, 80,169,208,234,218,167,235, 34,201, 64,255, 78,141,222, 25, 11, 43, 27, 55,236,216,
-127, 16, 49,161,187, 59,233, 12, 81,139, 68,204,213, 49, 26, 78, 50, 46, 43,201,106,126,157,214, 93, 28, 27, 52,125, 31, 62,239,
- 60,116,210, 50,215,159, 47,234, 85,111,165, 64,170,221,189,108,173, 34,167, 42,145, 5,224,199,161, 67,135, 14, 63,112,224,128,
- 29, 0,132,133,133, 33, 35, 35, 3,114,185, 28, 82,169, 20, 66,161,176,108,125,210, 90, 98,220,230,205,155,203, 68, 27, 77,211,
-101,171, 0,200,100, 50,116,238,220, 25, 45, 91,182,196,241,227,199,199, 85, 33,180, 58,182,107,215,110,175,143,143,143, 87,249,
-131, 42,149, 10,163, 70,141, 2, 0,116,233,210,165,135,133,133, 5, 87, 42, 8, 21, 10, 69,209,253,251,247,123, 1,184, 91,133,
-178,212,164,166,166,226,171,175,190,194,139, 23, 47, 62,219,186,117,107, 34, 0,169, 88, 44, 46,235, 31, 3,240,107,218,180,233,
-250, 89,179,102, 33, 46, 46, 14,145,145,145,247, 80,251,161, 84,198,210,210,242,153,209,104,108, 77,211, 52, 52, 26, 13,134, 12,
- 25, 34, 61,122,244,104, 6, 69, 81,209,217,217,217,163, 81,236,147, 98, 42,164, 0,214, 78,153, 50,101,234,220,185,115,113,249,
-242,101,156, 60,121, 18, 99,198,140,193,204,153, 51, 97,101,101, 53,126,230,204,153,183, 81,188,160,249,203,232,177,121,243,102,
- 48, 12,243,202,179, 33,149, 74,209,177, 99, 71, 52,105,210, 4, 39, 79,158,236,241, 26, 66,203,167, 99,199,142, 98,150,101,161,
- 82,169, 16, 18, 18, 98,101, 97, 97, 97,229,233,233, 57, 17,192,191, 70,104,249,248,248, 76, 57,112,224,128, 85,249,209, 31,137,
- 68,130,114,245,128,199, 63,111,209,170,182,135, 85, 6,189, 94,109, 16, 8,200,104,119,183,230,135,174, 93,253,188,108,232, 16,
- 32,163,245,122,181, 1, 0, 24,150,131, 82, 77,195, 66, 66, 34, 33,189, 16, 17,241,217,149, 81, 85,152,162, 41,180,240,134,164,
-109, 2, 56,142,131,222,192, 64, 87,144,142, 21,103,212,136, 74,209, 66,175,202,131,222, 80,236,134,229,228,228, 36,184,112,225,
-220,172,224,224, 63,167,254,254,251,239, 84,138,173,109,100, 33,208,170, 50, 78,123,123, 95,107, 86, 44, 62,180,101,235, 98, 11,
-142,138, 71,108,146, 10, 13, 60,219,194,201,206, 11,233,217, 42,220,140, 60,139,232,167, 65,168,231,230,131,153, 95,244,149,126,
-247,195,190,131, 34,186,174,119,126,254, 11,101, 85,233, 44,237, 69,109, 59, 31, 11, 58, 55, 30, 76, 78, 28,152,194,180, 87, 78,
-176,146,123,227,157,110, 30,144,123,213,151,140,155,185,124, 44, 80, 65,104,149,231,204, 32, 8,114, 11, 73, 18, 83, 9,130, 64,
-243,230, 45, 82,214,174, 93, 91, 89, 40,112, 67,243,230, 45, 82, 40,138,244, 44,126,177,147,155, 57,142,205,168, 33,157, 21, 68,
-141, 88, 44,153, 91,108,246,119, 75, 62,115,230,140, 97,248,240,225, 88,179,102,141,120,222,188,121, 11, 41,138,154, 80,201,240,
- 94, 5,206, 33,128,183, 93,253,250,189,191,191,121,147, 19, 26,141, 68,238,189,123,202,124,133,130, 78, 47, 44, 20, 31,142,142,
-238,255,233,156, 57, 98, 47, 47, 47,220, 8, 10,114,204, 82,169,184,124,157, 78,147,159,159,207,209, 52,125,175, 10,206, 5,114,
-185,179,108,199,142, 29,126, 83,166, 76,121,168, 80, 40, 22, 0,128,155,155,219, 10, 0, 77, 0, 36,148, 59,134,173, 91, 15,166,
- 78,156, 56, 49, 54, 51, 51,115, 65,117,233, 44,135,166,206,114,103,217,254,109,123,158, 56, 88, 91,144,114, 79,119, 82,104,103,
- 39,160,197, 22, 34, 22,208,212,243,170,111, 9,160,105, 21,215,190,204, 73, 88, 88, 88, 28, 59,117,234,148,179, 80, 40, 4,195,
- 48,144,203,229,120,241,226, 5,242,243,243, 81, 88, 88,136,231,209, 81,168,235,229,133,111,230,207,115,155, 62,111,254, 49,181,
- 90,221,250,165,198,236,213, 5,144,141,134, 87, 44,123,149,173, 98,240,242,176,151,137,229, 94, 30, 47,146,146,146, 96,101,101,
-133,128,128, 0,171,155, 55,111, 94,175, 70,100,149, 95, 4,120, 68,135, 14, 29,172,247,237,219,135,214,173, 91,195,214,214, 22,
- 33, 33, 33, 8, 11, 11,131,193, 96, 32,139,138,138, 96,101,101,133,149, 43, 87,194,219,219, 27,133,133,133, 72, 72, 72,112, 20,
- 10,133, 78, 47, 69,180, 47,227, 12,185, 16,242, 93, 65,220,149, 69,233,196,249,190, 59,246, 31,196,196, 15, 71,194,149,139,191,
-110, 91,159,248,174,247,192, 14, 75, 56,202, 43,208,210,186,185,125,195,128,129, 16,137,173, 48,125,238,114,196,134,159,182, 87,
- 23, 62,249,140, 96,146,189,150,173, 61, 60,163,146,188, 19, 0, 72, 47, 47,175, 79, 15, 31, 62,108, 93,102,122,161,168,178, 53,
- 15,203, 47, 2, 95,205,130,239, 53,222, 79,130, 32,240,226,197, 11, 56, 59, 59,195,202,202,170,108, 1,241,168,168, 40,220,185,
-115, 7,165,171, 81, 84,193, 57, 58, 56, 56,216,203,210,210,178,194, 9, 28,199, 33, 59, 59, 27, 52, 77, 67, 38,147,129, 97, 24,
- 24, 12, 6, 24,141, 70,104,181, 90,171, 38, 77,154, 76, 51, 26,141,119, 43,227,100, 89,246,203, 17, 35, 70,116,184,123,247,174,
-239,134, 13, 27,160,215,235,127, 76, 79, 79,199, 7, 31,124, 0,150,101,209,163, 71,143,119, 57,142,139, 89,184,112, 33, 0, 96,
-214,172, 89, 70,149, 74, 53,165, 54,121, 47, 65,147,119,222,121,199,247,242,229,203,232,212,169, 19,116, 58, 29,214,172, 89, 99,
-179,117,235, 86,155, 61,123,246,200,231,206,157,251, 91, 86, 86, 86,159, 26, 56, 9, 0, 63,186,186,186, 78,237,218,181,171, 69,
-201, 26,166,216,189,123, 55,190,249,230,155, 3, 0, 22,158, 59,119,110,233,201,147, 39,199,126,250,233,167,248,230,155,111,102,
-230,231,231,239,172,138,243,249,243,231,144,203,229,176,177,177, 41,126, 89, 26, 12,120,244,232, 17, 46, 93,186,132,198,141, 27,
-155,146,167,170,210,233, 51,116,232,208,223,246,239,223,111,157,156,156,140,107,215,174,161,110,221,186, 80,171,213,166,172, 13,
- 27,252, 23, 52,216, 85,114,106, 52, 26,109, 82, 82,146,213,170, 85,171,224,230,230, 6, 31, 31, 31, 72,165, 82, 16, 4, 1,163,
-209, 88, 93, 56,129, 26,211,217,165, 11, 4,217,169,246,131,108,237,236, 63,227, 56, 78, 80, 80,144,183,205,128,252, 35,241,241,
-208,255,141,121,255, 47,163, 21,128,135,168,184,230,161,162, 76,104, 5, 5, 5,113,129,129,129, 68,233,222,195, 3,202,236,108,
-251, 88,103,215,102, 7,157, 93,155,150,172,251, 69, 70, 83,148,125,172,139,139, 90, 9, 0, 6,154,195,173,232,124, 60,121,150,
-142,176,103,233,176,148,152,102,124,209, 25,232, 98,143, 85,142,131,182,232,127,157, 86,131, 58, 15, 58, 67,177,187,135, 94,167,
- 70, 65, 86, 36, 49,124, 72, 47,233,212,169,147,225,230,230, 33,175,138,207, 32,145,206,156, 62,171,191,157,131,157, 16, 65, 55,
-207,227,221,198, 67, 32,149, 8,145, 83,160, 5, 8,224,105,252, 37,128,181, 70,120,108, 18,218, 53,149,161, 79,111,127,171,227,
- 71, 98,230, 0, 88,108, 74,122,233,148,123, 16, 53,236, 7, 33, 99,132, 49, 59, 6,108,126, 34, 96,233, 10, 13, 97,133, 28, 69,
- 34,162,175, 31, 53,169,207,200,178,236,103, 78, 78, 78,249, 11, 23, 46,236,218,160, 65, 3,195,180,105,211, 30, 39, 38, 38,126,
-249, 82,111,229,167,205,155, 55,227,217,179,103,169,223,127,255,125, 72,118,118,246, 34, 51, 11,122, 62,199, 97, 93,201, 80, 92,
-246,137, 19, 39,222,185,122,245,234,204,117,235,214,185,124,254,249,231,226,207, 63,255,252, 19, 0,223, 86, 55, 92,168,148, 72,
-122,126,127,237, 26, 71,167,164,232,254,248,229, 23,241,166, 91,183, 22, 26, 88,214,221,201,217,153,104,223,174,157, 74, 70,146,
-217, 57, 25, 25,180,220,215,151,122,113,233,146, 35,103, 97,145,118,238,220, 57,101, 81, 81, 81,149, 75,231, 80, 20,165,174,108,
-184,176, 50,184,185,185,233, 43,243,225,170,166, 65, 84,178, 28,103,176,171, 87,143,235,221,227,189, 6,207, 98,226,227,165,118,
-118, 84,195, 6,117, 27, 69, 68,191,184,199, 49,140,150, 32, 8,165, 73, 99, 37, 20, 53,114,221,186,117,205,108,108,108,192,178,
- 44,108,109,109,145,149,149, 5,189, 94, 15,165, 82, 9,125, 97, 1,244, 5, 5, 8, 75,124,129, 14, 93,187,226,255,216,187,234,
-240, 40,174,246,123,102,125, 55,187,113, 23, 8, 16, 8, 16, 8, 4,183, 64, 8, 78, 9, 20,247,162,133, 82,130, 67, 9, 80,138,
- 20, 8, 45,238, 78,113,183, 18, 92,131, 4,143, 19, 72, 32, 46, 27,247,245, 29,249,253, 17,105, 8,145, 77,160,223,239,251,218,
- 61,207,179,207,202,204,156,189,115,239,157,185,103,222,247,189,239, 29,209,175,143,203,177,203,127,142,162, 40,234,116,149,254,
-188,150,173, 75, 45, 89,171,235,153,255,229, 11, 74,204, 45, 21, 93,191,181,118, 6, 79, 34, 65,239,249, 62, 95,114,161, 7, 94,
-187,118,237,250,208,161, 67,191, 89,184,112, 33, 75, 42,149,222,140,141,141,237, 2,224,109, 85, 7, 73, 36,146,134,153,153,153,
- 40, 44, 44,132,177,177, 49,182,110,221, 10,107,107,107,200,229,114,188,122,245,138,113,112,112, 32, 30, 62,124, 8, 7, 7, 7,
-100,101,101, 65,163,209, 64,161, 80,164,170,213,234, 74,221,229,197,238,193,254,243,250,225,198,251, 55, 71,187,218, 19, 49,175,
- 70, 46,240,248,240, 62,244, 93,194,237, 59, 79,127, 37,149,194,196,220,164,187,139, 27,180, 11,180,152,185,104, 21,118,110, 88,
-129,247, 47, 30,101, 91,215,205,223, 37, 34, 84, 71,170, 42,175, 76, 38, 83,190,123,247,206, 48, 56, 56, 24, 4, 65,192,216,216,
- 24, 6, 6, 6, 21,138,173, 90,128, 85,214, 2, 37,147,201,192,227,241, 96,110,110,142,131, 7, 15,150, 14,188,245,235,215,175,
-138, 99, 95,239,222,189, 71,213,173, 91,215,176,236,143,237,218,181,195,244,233,211,177,103,207, 30, 4, 4, 4,124,178,158,102,
-106,106,170, 84,171,213, 86,117,222,185,105,105,105,253,134, 12, 25,242,230,241,227,199, 70, 7, 15, 30, 4, 73,146, 21,190, 14,
- 28, 56,128,231,207,159, 47, 7,240,174,150,253,168,233,176, 97,195, 30,157, 56,113,194, 36, 35, 35, 3, 37,125, 67, 38,147,129,
-162, 40, 52,105,210,132, 32, 73,178,186,184, 55, 22,155,205,190,188, 99,199,142,129,223,127,255, 61, 56, 28, 14,212,106, 53,118,
-236,216,129,197,139, 23,167, 21, 63,148,106, 0, 44, 59,114,228,200,132, 65,131, 6,193,205,205,205,229,193,131,202, 35, 59, 10,
- 11, 11, 81, 88, 88, 8, 46,151, 11, 27, 27, 27,172, 89,179, 6,106,117,209,109,165,113,227,198,165,151, 49,128,125,141, 27, 55,
- 30, 24, 25, 25,185, 17, 69,177,107,159,193,198,198,102, 8,195, 48,211, 40,138, 42,232,218,181,171,249,169, 83,167, 12,147,147,
-147,241,230,205, 27, 44, 95,190, 60,135,166,105,138,166,105, 66,161, 80,196, 88, 89, 89,189, 17, 8, 4, 34,185, 92,158,157,149,
-149,181, 14,192,205,255,175,145,156, 32, 8,130,203,229, 98,202,148, 41,224,112, 56, 16,137, 68, 80, 42,149,208,106,181,165, 98,
- 30, 53,116, 75, 55,106, 36, 49,231,128,247,189,169, 97,179,185, 35,230,120, 89,218,218,217,195,196, 72,128,136,136,183, 93,238,
-223,187,179,131,207,121,191,151, 86,107,247,190,143,203,251,219, 23,187, 47,175, 69,254, 71,133,214,103,107, 30,114, 42,110,204,
- 17, 20,195,156,203, 76, 78,230,107,248,124,131,200, 18, 43,151,181,181, 60,159, 32, 70, 80,150,205,191, 5,169,209, 22,223, 40,
-152,226,151,142, 66, 75, 75,225,195,251, 48, 60,190,253, 39, 44,228,201,200,140,105, 5,240, 90, 64,173,200,131, 82,173, 41, 22,
- 37, 20,130,223,220, 67,126, 94, 54, 92,219,122, 1, 44,214,243,202,248,140,205, 9,175,206,109, 90,178, 63, 36,132,161, 93,227,
-225,112,114,232,138,120,105, 62,114, 11, 85,200,201, 87,162,149,171, 15, 50,114, 20,200,151, 43,241,246,195, 49,216,219, 57,177,
- 8, 78,116, 79, 93,133,150,234,237, 69,168,222, 93, 1,207,177, 11,248, 77, 6,129,237,232,142,132,144, 7, 8,190,177, 5, 73,
-225, 79,192,208, 20,108, 27,183,215,245, 34,217,113,243,230,205,246, 93,186,116,225,244,234,213,203,237,250,245,235,110, 82,169,
- 52,184, 88, 96,184,245,234,213,203,205,210,210, 18,219,182,109, 83, 16, 4,177,163,150,141, 93,106, 1, 75, 79, 79,127, 9, 96,
-237,197,139, 23,119, 76,159, 62, 29, 86, 86, 86, 45, 82, 82, 82, 42, 61, 48,131,203,117,155,184,110, 29,195,101,179,153,211, 59,
-119,242, 86,221,188,185,233,143, 35, 71,120, 61, 60, 61, 9,134, 97, 16, 20, 20,100,240,219,206,157, 6, 99,191,253, 54, 46, 62,
- 61,157,244, 15, 8,208, 72,147,146, 10,210,101,178, 85, 82,169, 52,245,255,163,103,107,181,218,103, 49,177, 49,246,109, 59,180,
-178, 12,140,136, 9,239,219,163,115,103, 22,139,197,122, 31, 29, 31, 96,105,105,100,112,231,246, 29,141, 86,171,125,166, 11,151,
- 64, 32,240,234,209,163, 7, 39, 39, 39, 7,118,118,118,200,200,200, 64,114,114,114,145,197, 33, 47, 7,154,188, 60,104,243,115,
- 65,201, 10, 17,243,234, 37, 90, 57, 53, 16,156, 19, 8,188,228,114,121,149, 66,171,228, 41,179,162,133,174, 75,126,227, 27, 26,
-130, 47,145,128,168,185,219,240, 91, 19, 19,147,197,185,185,185,215, 1,172,209,104, 52,222,139, 23, 47,110,183,125,251,118,139,
-181,107,215, 26, 77,155, 54,237, 92, 97, 97, 97, 43, 20, 45,170, 90,217, 0,246,145, 36, 73,115, 0,214,247,238,221,131,149,149,
- 21,242,242,242, 74, 44, 45,106,185, 92, 46,204,202,202,130, 74,165,130, 90,173,134,145,145, 17, 94,191,126,157, 77,146,228,213,
-234, 10,103,212,144, 88,163,210, 68,252,108,238, 34, 78,209,144,166, 30,233,217,116,206,202, 77,210,213, 0, 54,245,115,114, 58,
-160,161, 31,197, 68,133, 93, 53,141,125,245, 48, 59, 37, 74,230,116,240,122, 76, 85, 49, 90, 12, 0,154, 32, 8,166,113,227,198,
-200,200,200, 0,155,205,134,129,129, 1, 36, 18, 9,150, 44, 89,130, 29, 59,118,212, 70,104, 9,197, 98,241, 58, 22,139, 53,138,
-197, 98, 89, 82, 20, 5, 31, 31, 31, 12, 28, 56, 16,124, 62, 31, 26,141,166,212,162, 89, 98,165,170,198,210, 17,244,252,249,115,
-163,231,207, 63,185,109,121, 90, 88, 88,220, 87,169, 84,136,142,142,198,229,203,151,187, 3,240,175, 97, 91, 71, 7, 5, 5,245,
-115,119,119, 63,218,166, 77,155,134, 12,195,160, 69,139, 22, 24, 61,122, 52,142, 29, 59,134,224,224, 96,228,229,229,209,119,238,
-220,249, 3,192,198,154,142,225,197,245,219,100,216,176, 97, 79, 78,158, 60,105,154,149,149, 5,133, 66, 1,153, 76,134,115,231,
-206,161, 75,151, 46,176,176,176,192,137, 19, 39, 72,134, 97,170,106,123, 22,139,197, 58,184,119,239,222,129, 83,167, 78,197,174,
- 93,187,112,250,244,105, 12, 26, 52, 8,163, 70,141, 66, 70, 70,134,245,134, 13, 27, 38, 20,187, 9, 87,140, 30, 61, 26,133,133,
-133,120,245,234, 85,132,142,215, 60,114,115,115,145,155,155, 11,145, 72, 84,246, 26, 35, 0, 28,219,178,101,203,152,185,115,231,
-194,201,201,105, 69, 76, 76,204, 22, 84, 48, 75,148,166,233, 31,146,147,147, 77, 57, 28,142, 57, 73,146, 72, 76, 76,196,235,215,
-175, 49,115,230,204,236,236,236,236,233, 0,226, 1, 44,155, 50,101,202,154,249,243,231,151,246,165,249,243,231,251, 93,191,126,
-189,223,127,218,154,211,184,177, 73,115, 62, 91, 48, 39,167,128,109,158,147,147, 83,122,239, 80,171,213, 80,169, 84,159, 88,178,
-120, 60,174,121,187, 86,117,175, 41,228, 5, 75,223, 70,229, 86,186, 64,186, 75, 67,227,150, 6, 98,227,185, 93,186,246, 24,215,
-167,223, 96, 54,169,213,226,214,173,171, 56,116,104, 55, 60,221, 27,195,169, 81, 11,204,154, 61,199, 88,165, 38,125,238,220,185,
-185,216,228,249,227,155, 5,249,185, 75,170,226,252,151,227, 90,177,184,186, 86,161,235,176, 34, 5, 89,156,194, 33,167,248,171,
-133,169,169,233, 78,138,162, 60,141,140,140, 64,231, 70,226,237,235, 23,200,206,225, 66,165,160, 64, 51, 69, 98, 75, 39,225,162,
- 82,227,209,173, 43,216,186,101, 19,178,178,178,224,222,173, 59, 10, 57,117, 80,183, 78, 93, 40, 21,242,226,139, 6,208,168,181,
-176,180,118, 68, 96, 96,176, 54, 95, 38,171,244,134,196, 19,106, 92,234, 90, 55,134, 74,211, 9, 66, 62, 31,121, 5,106,228, 20,
-139,172, 19,231, 71, 66, 37, 87,128, 84,107, 64,170,181,176,172, 59, 12, 77,173,123,128,166,174, 54,175, 81,245,209, 20, 52,177,
-143,160,137,125, 4, 81,167,217,248,211,119, 76,185,129, 84,183,117,119, 51, 50, 50,210,195,195,195,175, 6, 5, 5, 13, 25, 57,
-114, 36, 30, 60,120, 48, 13,192,140, 98,247,205,180,145, 35, 71, 34, 40, 40, 8,225,225,225, 87, 51, 50, 50,210,191, 70,203,243,
-249,124,133, 74, 85, 52,198, 26, 24, 24, 8,171,217,215,190,221,208,161,172,188,192,192,252, 45, 79,159,174, 56,112,240, 32,175,
- 87,207,158,132,150, 36, 65, 83, 20, 26, 57, 59, 19,125,250,244, 17, 31, 59,123,214,156,173,213, 62, 95,228,237,125,111,207,248,
-241, 5, 47,101, 50, 93, 3,205,235, 21,187, 12, 1,160, 94, 21,191,233, 12,149, 74,181,253,135,239, 39,245,242,127,244,164, 78,
-221, 58,246, 70,183,238,248, 7, 11, 68,124,150, 83,253,134,236,156,188,108,206,234, 21, 75, 69, 42,149, 74, 87,209,234, 98, 97,
- 97,129,212,212, 84,124,248,240, 1, 42,149, 10, 90,173, 22,180, 92, 6,117, 78, 46,212,121,217, 32,148, 10, 8, 40, 10,202,204,
- 52,212,115,106, 0,252, 53, 35,177, 90, 87, 84, 69, 66,171,228, 93,104,100, 4,158, 88, 2, 22,151,171,243,226,232, 0,218,180,
-111,223,254,236,133, 11, 23,120,147, 39, 79,238,112,247,238,221,157, 0,226,147,147,147,123, 46, 95,190,252,229,206,157, 59, 5,
-211,167, 79,111,178,113,227,198, 9, 0,246, 85, 70,162, 84, 42,207, 94,187,118,109,172,163,163,163,117,104,104, 40,148, 74, 37,
-104,154, 70,255,254,253,129,162,216, 26, 0,192,251,247,239, 21, 74,165, 50, 61, 44, 44, 44, 63, 62, 62, 94, 3, 29,102, 9,174,
-220, 46,125,150,159,250,104,168,181,141,253,115,161,168, 94,125,166, 48,112,200,188,225,246, 27,182,156, 79, 86,222,140,142, 46,
-248,185,119,131,245,178,130,144,153, 38, 14,133,187,110,250,197,232, 18, 8, 95, 58,187,208,220,220, 28, 28, 14, 7, 92, 46, 23,
- 60, 30, 15, 4, 65, 96,246,236,217,216,191,127,127,117,174,195, 79, 68,150,161,161, 97,248,170, 85,171, 28,166, 79,159,206, 19,
- 10,133,200,201,201,193,137, 19, 39, 48,101,202, 20, 28, 58,116,168,194,248, 23, 29, 92, 74,229,173,165,115,199,143, 31, 15,181,
- 90,141,209,163, 71,227,192,129, 3,115, 41,138,242,175,197, 37,253, 60, 56, 56,216, 57, 56, 56,216, 8,192,160, 81,163, 70, 29,
- 25, 54,108, 24,252,253,253,113,245,234,213,238, 40,154,244,161, 0,224, 11,192,170,248,189,170,235, 83,108,109,109,189,155,166,
-233, 65,150,150,150,193,141, 27, 55,118, 61,121,242,164, 73,122,122,122,201,228, 7,196,198,198,226,240,225,195,210,131, 7, 15,
-230, 83, 20,101,206, 98,177,174,229,230,230, 46,169, 66,176, 29,220,178,101,203,164, 98,119, 32, 46, 92,184,192,108,218,180,137,
- 88,190,124, 57,114,114,114,224,233,233,137,189,123,247,206, 41, 44, 44,116,219,180,105,211,247, 35, 70,140,192,234,213,171, 33,
-147,201,182, 84,247,176, 82,133,248, 34, 0,116,222,178,101,139,227,220,185,115,113,225,194, 5,180,105,211, 70, 20, 19, 19,179,
- 7,192,212,138,218,143, 97, 24,196,196,196, 64, 46,151,227,201,147, 39, 88,177, 98, 69, 78, 25,145, 53,103,198,140, 25,107,230,
-204,153,131,117,235,214, 49,161,161,161,233,195,134, 13,179,222,191,127, 63,187, 81,163, 70,115,228,114,249,127, 76,104, 53,105,
-100,182,190, 93,155,174,139,109,237, 27,225,196,201, 83,200,206,206, 46,173,147,146,122, 97, 24, 6, 5, 5, 5, 72, 77, 77,133,
-177,145, 33, 54,108, 92,243,205,143,211, 38,213, 65, 81, 26,140,207, 77,150, 78,166, 27,135,141,154,188, 96,244,216, 73, 8, 13,
-126,131, 99, 71,246, 33, 44, 52,168,148,143,212,106, 16, 25,241, 26,145, 17,175, 97,109,227,136, 62,189,186, 19, 99,198,140,233,
- 63,126,236, 40, 75, 0,127, 91,234,136,255, 97,107, 22,240,121, 30,173,253,159, 8,173,106,204,117, 22,166,166,166,225,103,206,
-156, 49,119,119,119,103,147, 36,137,155,183,110, 97,230,140,239, 48, 97,188, 15, 52, 48, 5,169,230,129,230, 9,117, 42,137, 66,
- 33, 7, 3, 6, 50,153, 12, 1, 1, 1, 96,104, 18,199,246,111, 2,195,208,165, 66, 11, 96,160,214,104, 96, 95,183, 9,118, 31,
- 88, 75,130,203,125, 9,109,197,169,107,242,179,216,148,150,100,144,156,158,128, 4,105, 24,140, 13,235,130,195,173,139,172, 92,
- 57, 56, 44, 27,104,149,239, 65, 21, 31, 43,151, 37, 65,161,249,178,246,163, 42,176,158, 50, 53,184,233, 42, 20,138,227,199,143,
- 31,255,102,243,230,205,252, 1, 3, 6, 52, 62,127,254,124,103, 0, 24, 48, 96, 64, 99, 35, 35, 35, 28, 63,126, 92,173, 80, 40,
-142,127, 69,139, 79,143,246,237,219, 35, 39, 39, 7,177,177,177,193, 85,158,155, 90,109, 46,177,178, 98,167, 63,120,160,205,200,
-201,169,211,163, 71, 15, 66, 75,146, 96, 17, 4,178,243,242, 16, 31, 23, 7, 19, 19, 19, 34,252,253,123,201,142, 89,179, 46, 53,
-118,117,229,148,204, 72,212, 5, 87,175, 94, 53, 64, 81, 92, 86,149,191,213, 16,178,244,180,212, 73,222,222,222,151,142, 31, 63,
- 97,156,150,158, 22, 41,224,243, 73,137, 68,104, 55,126,220,143,156,220,220,220,177, 0, 10,117, 37,203,201,201, 65, 76, 76, 12,
- 68, 34, 17,120, 92, 46,104,133, 28,148,172, 16,202,236, 12,176, 53,106,240, 41, 10,102, 6, 2,212,177,182, 70, 93, 75, 11,157,
- 56, 63,220,191, 93, 26,248, 94,214, 93,184,161,189, 11,248, 98, 9,248,134, 18,252,232,247,176,248,105,148, 7, 44,255, 85, 23,
- 90, 11,123,123,251, 63, 79,158, 60,201,203,200,200, 64, 80, 80, 80, 48,128, 60, 0,134, 0,232,136,136,136,187, 97, 97, 97, 94,
-197,179,238,170,155, 45,182,233,226,197,139,189,221,221,221,201,250,245,235,139,211,211,211,235,228,228,228,208, 82,169,244, 19,
-147,208,237,219,183, 5, 5, 5, 5, 50,154,166, 47, 21,139,172,106,243, 23,205, 27,110, 47, 12, 8,196,108,143,190,245, 90, 24,
- 89,180, 68, 54, 25,216,226,121,176,116,246,188,225,246,219,183,156, 79, 86,138, 8,213, 17,130, 74,172,195, 17, 42,117, 13, 98,
-102,128,162, 88,169,128,128, 0,196,199,199, 35, 38, 38,230, 19, 65, 53,109,218, 52, 28, 59,118, 76, 39,139,150, 88, 44, 94,183,
-114,229, 74,135,185,115,231,242,202,136, 34,120,123,123, 35, 47, 47, 15, 7, 14, 28,128,183,183,119,141, 7,254,114,104,208,163,
- 71,143, 1,182,182,182,200,202,202,130,141,141, 13,220,221,221, 7,250,251,251,215, 7, 16, 91,203,126,255, 99,223,190,125,215,
-172, 90,181, 10, 90,173, 22, 83,166, 76, 65, 84, 84,212,217,168,168,168,173,117,235,214,157,253,211, 79, 63, 89, 91, 91, 91, 99,
-228,200,145, 98,146, 36,135, 86, 70, 98,102,102,230,187,111,223,190,177, 3, 6, 12, 96,105, 52,154,110,247,239,223, 71, 92, 92,
- 28,212,106, 53, 72,146,196,199,143, 31,225,237,237, 45, 45,158,221,248, 81,135,114, 77, 94,182,108,217,164,217,179,103,227,183,
-223,126,195,202,149, 43,255, 48, 54, 54,118,109,213,170, 85,235,149, 43, 87, 98,209,162, 69,112,116,116,132,185,185,121,211,229,
-203,151,187,204,159, 63, 31,219,183,111,199,138, 21, 43,254, 0,112,184, 54, 21, 65,211, 52,177,126,253,122,183, 45, 91,182,216,
-150,136, 44, 22,139,133, 51,103,206, 32, 48, 48,112, 96,116,116,116, 69,199,236,181,177,177,153,102,107,107,203,191,115,231,142,
-196,209,209, 17, 36, 73,106,139, 69,214,142,186,117,235,206,252,248,241, 35, 6, 12, 24,128,232,232,232,227, 0, 38, 24, 27, 27,
-203,230,207,159,111, 32, 18,137,140,229,114, 57,254, 83, 96,179,136,137,235, 86, 47,194,171,192,247,184,120,145,135, 87,175, 94,
-193,218,218, 26, 2,129, 0, 12,195, 64,165, 82, 33, 35, 35, 3, 90,141, 10, 45,154, 55,192,209,131,235,145,158,158, 1,176,136,
- 74, 67,110, 8, 22, 49,110,210,119, 67,240,248,201, 45,236,217,179, 15,133,133,178, 74, 30,190,133,104,212,216, 5,246,118, 86,
- 72, 76, 74, 4,193,130,197,223,121,174,255,227,174,195,210, 91, 16,116, 73,239, 80, 22, 38, 38, 38, 91, 79,159, 62,109,238,233,
-233,201,150,201,100,160,105, 26, 93,221,221, 49,123,238, 92, 92, 61,121, 18,206, 29, 70,131, 80, 75, 64, 26,232, 54,235, 65,169,
-144,163, 89,235,206, 24, 49,114, 20, 18,226,227,209,215,107, 24,148, 74,121,233, 19, 70,137, 69, 75,173,214,192,194,170, 14,110,
-223,190,205,198,148, 41,111,177,163, 98,163, 4,165,225,135, 68,126, 84,118,201, 85, 4, 34,224,213, 49,104, 84, 26,180,104,177,
- 28, 26,218, 28, 86, 14,211,160,213, 94, 70,126,198,253, 34, 55,134,185, 39,146, 18, 18,192, 98,243,194,107, 91,131,180, 44,227,
-139,110,186,121,121,121,121, 49, 49, 49,231, 3, 2, 2,198, 13, 29, 58, 20,183,111,223,254, 30, 0,134, 14, 29,138,128,128, 0,
-196,196,196,156,207,203,203,203,251, 26,173,109,107,107, 59,168,123,247,238,163,219,181,107, 7, 63, 63, 63, 48, 12,243, 88,167,
- 11,155,203,101, 88, 44, 22,104,154, 6, 1, 32, 43, 55, 23, 81, 81, 81,200,202,204,132, 86,171,133,172,176,144,118,105,220,184,
-144,161,105,195,154,148,167,236, 12, 67, 84, 48,235,176,228,183, 90,156,106,252,203,231, 79, 19, 10, 10, 11, 45, 77, 77, 76, 11,
-248,124, 62,149,147,155,155,247, 54, 60, 84,173,227,224, 80,130,136,176,176, 48,215,148,148, 20, 36, 36, 36,128,148, 21,128,173,
- 82,131,165,146,163,103,231, 78, 16,129,129, 16, 52,184,180, 22, 92, 54, 23, 5, 69,179,243,170,117,119, 80,101, 30, 18, 74, 68,
- 22, 65, 16, 69,238, 66,177, 24,124,137,225, 39, 22, 46, 93,250,147, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26,
- 14, 14, 14, 77,237,236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55,160, 67, 29,144, 12,195,
-244,121,252,248,241,130,167, 79,159,142, 16,139,197,196,172, 89,179, 56,253,251,247,135, 64, 32,128, 92, 46, 71, 78, 78, 14, 78,
-157, 58,149, 73,211,116,201,164, 20,115, 3, 3,131,195, 4, 65,196,202,100,178,185,229, 9,143,110,110, 97,151,158, 77, 79, 97,
- 10, 13,134,120,244,173,215,162, 71,223, 94,104,224,220, 3, 61,250, 38, 0,192,122, 51, 78,220,232,223,151,153, 92, 50, 49, 36,
- 14,223,190,121,103,133,187, 71,143,101,139, 11, 31,172,249,109,127,110,181,241,116, 4, 65,128,166,233, 79,114, 7,149,223, 62,
- 97,194, 4,156, 57,115,166,218,122,100,177, 88,163,166, 79,159,206, 43,103,121, 70,114,114, 50,188,188,188, 48,116,232,208, 79,
-132,150,133,133, 5,108,108,108, 16, 23, 23, 7, 0, 89, 58,246,171,217,147, 39, 79, 38, 20, 10, 5,166, 78,157,138, 3, 7, 14,
- 96,244,232,209,132,191,191,255,108, 0,115,107,218,217, 89, 44,214,134,159,126,250,105,129,183,183, 55,178,179,179,113,253,250,
-117,244,239,223, 31,103,206,156,177,188,126,253,250, 58, 79, 79, 79,176,217,108,248,249,249,129, 36,201, 42,115,125,241,120,188,
- 65, 3, 6, 12, 96, 37, 38, 38,130,199,227,161,109,219,182, 72, 74, 74,130, 92, 46, 71,114,114, 50,230,204,153,147,154,149,149,
-213, 93,215,235,136,199,227,205,157, 61,123, 54, 78,159, 62, 13, 31, 31,159, 35, 0,166,230,229,229,141,120,250,244,233,233,111,
-191,253, 22,201,201,201,184,116,233, 18, 86,172, 88, 65, 76,152, 48, 1,187,118,237,194,156, 57,115,254, 40,182, 58, 85,214,241,
- 11,210,211,211,141, 27, 54,108,136,180,180, 52, 20, 22, 22,226,210,165, 75, 86, 55,110,220,168,111,111,111,111, 20, 19, 19, 67,
-253,250,235,175,252,185,115,231, 98,235,214,173, 8, 10, 10,194,177, 99,199,208,163, 71, 15, 50, 58, 58,186, 66, 43, 89,113,202,
-134, 75, 12,195,220, 17,139,197, 40, 40, 40, 40,185,238, 22,250,248,248,120,251,250, 22, 25,217, 83, 82, 82, 48,113,226,196,241,
-247,238,221,163, 61, 61, 61, 13,120, 60, 30,148, 74,165,236, 63, 57,106,211, 20, 13,128, 70,253, 58, 18,220,186,122, 16,111,130,
-163,241, 38, 56, 12,124, 65, 81, 16,188, 66, 33, 71,235, 22,141,208,161,109,123,164, 72,147,113,252,216, 65,152, 89,216, 87,121,
- 31, 97, 24, 6, 60, 14, 5,151,198, 54, 56,121,108, 31,252,174,223,195,177,227,167, 74, 99,222, 56, 28, 46, 90,181,238,128,182,
-109,221, 17, 29,243, 17, 7, 15,238,129,165, 85, 29,189,115,176,150, 40,117, 29,150,125, 47,167,252,123,184,187,187,179, 11, 11,
- 11,161, 84, 42,145,154,154,138,184,184, 56,152,152,154, 32, 58, 37, 22,221, 13, 52, 72,165,243, 17, 17, 28, 78, 17,108,110, 80,
-117,127, 56,192,163, 21,224,209, 10, 51, 39,143,174,226,145,149,129,216,200,162,200,117, 67,146, 31,176,125, 59, 89,153,208, 34,
- 41,237,221, 91,119,238,183,159, 60, 97, 16,247,246,253, 3,208,170,105, 40,180,198,144, 41,213,144,105,184, 96, 25,247, 7, 50,
-253,193,230, 8,208,209,173, 17, 46, 93,188,161, 97, 72,237, 61,157, 43,200,218, 21,100, 90, 88, 25,161,149, 94,206,239, 96,166,
-179,235,176,116,224,165,168, 51, 39, 78,156, 24,220,169, 83, 39, 3, 79, 79,207,134,197, 3,167,230,196,137, 19,242,226,100,152,
- 53,197, 39,217,224,109,108,108, 90,243,120,188,209,253,251,247,111, 61,105,210, 36,188,125,251, 22,199,143, 31,143,108,212,168,
-209, 3,169,180,242, 25,217,108, 62, 63,171, 48, 61,221, 68, 82,191, 62,199,212,208, 48,229,198,245,235,142,189,122,247, 38, 18,
- 18, 18,144,149,149, 5,165, 82,137,160,224, 96,134,203,102, 39, 17, 70, 70,172,247,129,129, 44, 54,159,159, 85,153,181,177, 2,
-196, 85, 51,235,208,183,182,214,173, 58,182,166, 13, 87,248,252,208, 64,169, 82,186,230,231,231,147, 28, 46,151,235, 96, 99, 18,
-255,254,163,238,247, 68,149, 74,229,119,247,238,221,193,189,122,245, 18, 68,134, 4,129,204,203,131, 58, 47, 7, 60,154,130, 89,
-107, 55,176, 53, 42, 64,173,133,189, 11, 3,101,174, 1,252, 95,188,215,170, 84,170,106,147, 26,150, 8, 45, 86, 57, 97,192,151,
- 72, 32, 48, 52,130, 64, 34, 41, 47, 24,170,123,146, 51,232,211,167, 79,207,142, 29, 59,130, 97, 24,236,223,191, 31, 26,141,134,
-175,209,104,160, 86,171,161,209,104,144,159,159,143, 99,199,142, 97,247,238,221, 79, 1,252,161,195,233,147, 34,145,232, 91,130,
- 32,172, 56, 28,142,220,210,210, 82,124,230,204,153,210,116, 19,173, 90,181,130,161,161, 33, 15,197, 73, 33,173,172,172,184,135,
- 14, 29, 50, 25, 56,112,224,163, 10,221, 29, 45,154, 46,106, 64,154,122, 8, 69,245,234, 27, 89,180, 68, 3,231, 30, 0,128,222,
- 94,147,209,160, 81, 93,228,103,134,212, 87, 42,226,134,240, 56, 57,166,225,219,147,223,138, 6,184, 78,146,165, 63,140, 66,197,
-211,251, 43, 28, 40, 88, 44, 86,165,238, 88, 93, 68, 86,145,102, 97, 89,150,196,249, 0, 64, 86, 86, 22,164, 82, 41, 34, 34, 34,
-208,164, 73, 19,100,103,103,195,222,222, 30,106,181, 26,237,218,181,131, 66,161,192,150, 45, 91,240,228,201,147,167, 0,230,232,
-240, 31, 34,103,103,231,137,173, 91,183,198,245,235,215,241,234,213,171,228, 91,183,110,217,187,187,187,163,126,253,250,147, 98,
- 99, 99,151, 22,187,250,116,133,216,221,221,125,150,183,183, 55,194,194,194,240,195, 15, 63,100, 37, 38, 38, 94, 58,123,246,236,
-212, 21, 43, 86,176,250,246,237, 11,169, 84,138, 13, 27, 54, 80, 79,158, 60,217, 8, 96,117, 53,245,248, 46, 49, 49,209, 65,169,
- 84, 34, 59, 59, 27, 36, 73, 66, 46,151,227,198,141, 27, 56,118,236, 88, 90,177,200,250,160,107,225,220,220,220,154,177, 88, 44,
-156, 62,125, 26, 0,126, 70, 81,198,254, 75, 67,134, 12, 73,254,245,215, 95,237,151, 44, 89,130,239,191,255, 30, 26,141, 6,191,
-253,246, 27,150, 44, 89,114,173, 88,100, 85,117, 19,221,108, 99, 99, 51,237,135, 31,126,104, 58,127,254,124, 4, 4, 4, 88,189,
-126,253,186,109, 80, 80, 16,234,212,169,131,172,172, 44,142,185,185, 57,182,110,221,138,121,243,230, 93, 0,144,249,236,217,179,
- 81, 49, 49, 49,190, 0, 54, 84, 35,218,247,218,219,219, 79, 99, 24,134,145,203,229,113, 62, 62, 62, 27,214,174, 93,139,121,243,
-230, 33, 60, 60, 28,121,121,121, 48, 52, 52, 36,126,250,233,167,137, 63,255,252, 51,166, 76,153,194,200,100,178,221,255,233,129,
-154, 97, 40,200,115,194, 64,169, 76,209,170, 69, 19,180,114,173,135, 91,247,223, 0, 0,122, 14,115,135, 92, 86,128, 35, 71,246,
-227,195,135, 40,112,184, 92,152,152,217,232, 98, 9,132, 58,255, 29,114, 53, 82,244,242,108,139,254,125,187,227,143,163,103, 64,
-106, 53,152, 58,121, 44,114,114,115,113,244,232, 65, 68,199,124, 4,135,203,133,185,197,223,159, 8,181, 42, 45,242, 63, 47,180,
-116,112, 63,129,166,105, 36, 39, 39,227,245,235,215,136,141,141,133,129,129, 1, 20, 36, 69,239,185,251,132, 38, 8, 94, 18,205,
- 48, 79, 25,178, 52, 75,241,231, 28, 20,149, 92, 38, 99,173,177,169,169, 41, 95,165, 82,128, 36,181,101, 70, 21, 2, 32, 0, 30,
- 7,176,181,107,128,196,132, 68, 70,169, 84, 62,172,242, 9, 74,165,220,122,229,210, 57,239,206, 93,220, 45,250,247, 92,133, 75,
-151,151, 35, 39, 63, 31, 74, 13, 23, 50,165, 6,114, 37, 96, 98,214, 24,237, 90,180, 68, 74, 74, 22, 66, 94,249, 23,114, 84,114,
- 93, 2, 69,163,118, 44,155,236, 60,121,230, 34,136, 28,187, 64, 21,113, 9,116, 97, 90,169, 69, 75, 40, 49,133, 89, 93, 23,228,
-202, 84, 56,119,239, 13, 80,131,165, 94,210,211,211,229,108, 54,251,132,183,183,247,111,111,222,188,118, 0,128, 55,111,222, 36,
- 73,165,210,197,233,233,233, 53,181, 73,151,100,131, 39,132, 66,209,155, 70,141, 26,165,180,109,219,214,120,200,144, 33,176,176,
-176, 64, 80, 80, 16,124,125,125,223,105, 52,154, 69,254,254,254, 85,186,122,212,106,117,242,155,203,151,141,186,127,247,157,201,
-162,129, 3, 55,120,123,123,111, 93,189,122, 53,215,217,217,153,208,106, 52, 8, 13, 13,101, 78,158, 56,161,221,189,100,201, 22,
-190, 88,204,121,121,229, 10,151, 84,169,146,255,191, 59,177,189,189,189,135,123,183,174, 46, 27, 55,111,135, 82, 81,136, 23, 1,
-215,144,147,147,129,125,251, 47,186,216,219, 51, 30,201,201,201,254,186, 10,224,195,135, 15, 47,232,208,186,117,107,167, 58,117,
- 16, 26, 31, 11, 62, 77,129, 71,146, 96,107, 84, 96,145, 74,212,113,101, 64,176, 12, 33, 77,205,199,218,211,231,195,116, 17,198,
- 77,191, 25,132,213, 73,121, 32, 8, 2,155, 58,185,130,111, 40, 1, 79, 44,193,143,127,222, 47, 21, 6,126,171,151,128, 47,145,
-160, 97, 7,157, 18,194,203, 31, 60,120,240, 58, 52, 52,180,157,171,171, 43, 22, 44, 88,128,184,184, 56,208, 52,141,180,180, 52,
-165, 84, 42, 77,206,200,200,136, 67, 81,254,159, 3,213, 12, 98,101, 85,135,189,191,191,127,169,187,225,222,189,123,176,179,179,
-131,177,177, 49,242,243,243, 49,125,250,116,147, 95,126,249, 5, 0,240,250,245,107,148, 21, 40,229, 17,250, 38, 98, 99,110, 1,
-147,195, 20, 6, 14,201, 38, 3, 91,244,232,155,136,222, 94,147,112,199,239, 15,220,191,117, 23,102,156,184, 88,136, 11,110,100,
-198,102,230, 39,201,156,247,186,180,153,202,150,202,110,237,157, 53, 40,146,109,107, 75,159, 91,178, 39, 63,183,170,178, 58, 59,
- 59,195,218,218,186, 52, 70,139,195,225, 96,202,148, 41, 96, 24, 70, 87,145, 85, 60,214,208, 25, 74,165,210, 90, 40, 20, 34, 53,
- 53, 21, 31, 63,126, 68,116,116,116,105,234, 0,154,166,181, 11, 23, 46,228,206,154, 53, 11,123,246,236,193,195,135, 15,159, 2,
- 88, 5, 64,215,135,181,177, 35, 71,142, 52, 84,171,213, 56,117,234, 20, 9,192,235,220,185,115,175,219,181,107,199,233,215,175,
-159,225,174, 93,187,198, 22,183,145,206, 66,203,200,200,136,167,209,104,176,107,215, 46, 36, 38, 38,122, 0,136,120,249,242,229,
-222,145, 35, 71,238,118,117,117,109, 20, 22, 22, 22, 85, 88, 88,248, 35,128,144,234,200,210,210,210, 38,183,109,219,246, 28, 77,
-211,142,189,122,245, 18,111,222,188,217,232,253,251,247,112,112,112, 0, 77,211,161,168,225, 18, 86, 81, 81, 81, 17, 82,169,212,
-165,123,247,238,184,113,227,198,122,138,162,214, 1,248,109,198,140, 25,246,241,241,241,104,221,186, 53,204,204,204,240,254,253,
-251, 2,169, 84,186, 27, 69, 75, 18, 85,103,194,141, 1,176,120,239,222,189, 45,247,238,221, 59,218,204,204,172, 99, 80, 80, 16,
- 30, 63,126,140,141, 27, 55,226,151, 95,126, 65,215,174, 93,177, 96,193,130, 76, 0,163, 1,144, 49, 49, 49, 58,229,205, 43,177,
-108, 1, 64,155, 54,109, 82,124,125,125, 49,117,234, 84,230,208,161, 67,219, 78,156, 56, 49,119,236,216,177,165, 99,224,196,137,
- 19,153,227,199,143, 79, 68,209, 50, 76,255, 73,104, 53, 26, 53,140,204, 26,160, 48, 55, 1, 25,137, 1, 48, 48,180, 65,223, 30,
-110,144, 43,212,184,122,229, 2, 66, 66,131,193, 98,177, 96,109, 83, 7, 38,166, 22,136,140,140, 2,170,158,109,172,213,104, 52,
- 48, 52,173,135,194,188, 68,168,211,223, 64, 36,177,194,164,239,134, 64,174,208,224,226,165, 11, 8, 11, 11, 1,155,205,134,141,
-109, 29, 24,155, 20,113, 18, 76,213, 51,152,245, 0, 80, 65, 62,173,106,133, 22,155,205,126,112,243,230,205,225, 29, 58,116,224,
-124,248,240, 1, 31, 62, 20, 61,220,228,228,228,144, 4,168,243,233,161, 87,198, 84,113,120, 47, 20,207,206, 40,187,118,161,196,
-208, 48,249,253,187, 8,235,156,236, 52, 4, 7, 62,193,135,200, 80,196, 70, 71, 64,163, 81,130,205, 98,129,197,102,161, 94,131,
-230,120,242, 52, 64,173, 36,201,128,202, 56,139,202, 17, 93, 32,182,114, 30,181,102,245, 82,191,121,139, 86,138, 70, 12,223,131,
-144,247,111, 81, 72,218,128, 97, 0, 27,115, 49, 90, 57,253,132,228,148, 12,156,254, 99,151,156,214,104,198,149,203,161,245, 25,
- 39, 0, 88,103,162,217,238,253,127, 76, 57,112,236,228,202, 69,179,166, 91,127, 59,116, 28,248,217,111,161, 77,121,131, 6,237,
-250,131, 16,152,224,250,237,251,240,127,253, 54,141,166,152,149,214, 89, 56, 20, 89, 13,103, 89,228,230,230, 62, 75, 77,149, 58,
-148,201, 2,239, 32, 16, 8,171,155, 29, 87,158,243,147,140,243,108, 54,171,205,154, 53,107,180,214,214,214,154,176,176, 48,236,
-217,179,135,126,243,230,205,109, 22,139,181, 67, 42,149, 42,171,227,180,212,106,131, 79,250,248, 52,107, 63,116, 40, 51,102,214,
- 44, 57, 4,130,217, 27, 54,109,242,201,200,201,177, 99,104, 26,150,102,102, 73, 27,150, 44,241, 29, 62,114,100, 78,248,147, 39,
-162,128,203,151, 69,124,146,124,163, 67, 57,191, 6, 42,229, 76, 78, 78,246,127,248,240, 49,142, 28,216, 12,141, 70, 5,105,114,
- 60, 0, 32, 51, 43, 15,213,136,172,242,156,140, 92, 46, 31,250,243, 47,191, 60,255,121,222, 92,155,110, 61,123, 33, 33, 56, 8,
-154,236, 12, 16, 90, 18, 92,130, 3, 89,186, 1,210,211, 10,177,248,248,217,244, 66,185,124,104, 5,131, 68,133,229, 44,177, 88,
- 9,140, 12,193, 19, 75,192,151, 24,126, 98,197, 18, 26, 25,129, 47,150,128,195,231, 87, 20,192,253, 25,103, 97, 97,225,176,225,
-195,135,135,188,124,249,210,116,234,212,169,232,220,185,115,160, 66,161,240, 4, 80, 80,219,250,164,105, 58,185, 91,183,110, 44,
-130, 32, 36,227,198,141, 19,100,100,100,148,102, 86, 47, 44, 44,196,141, 27, 55,208,164, 73,209,172,254,240,240,112, 52,111,222,
-188, 82,206,239, 23,135, 37, 3, 88, 61,111,184,253,134,231,193,210,217, 0,214, 55,104, 84, 7,247,111,221,197,227,251, 1, 62,
- 29, 93,233,237,223,140,107,247,171,129,231,200, 69, 46,109,166,178, 37, 70,182, 56,122,241, 2, 59,226,205,193,181,114,121,104,
- 67,236,185,180,176,178,114, 18, 4, 1,134, 97, 62, 75,229,192,102,179,113,226,196,137,154,158,251,217, 3, 7, 14,204,248,225,
-135, 31,120, 82,169, 20,239,222,189,131, 76, 38,131, 80, 40,196,173, 91,183, 72, 0,187, 78,156, 56,113,235,196,137, 19,253, 80,
- 52,155,232, 94, 77,250,167, 88, 44,246,238,219,183, 47,222,189,123,135, 87,175, 94, 93, 0, 16, 18, 24, 24,120,225,195,135, 15,
-163,186,118,237,138, 63,254,248,195, 91,161, 80, 28,168, 9, 39, 77,211,101,115, 38,149,172,248, 16, 92, 88, 88,216, 49, 32, 32,
-160,166,237, 46,205,202,202,234, 82, 44,172, 19,173,173,173,141,130,131,131, 81,183,110, 93,104, 52,154, 14, 53,237, 75,121,121,
-121,155,119,236,216,113,104,242,228,201,248,245,215, 95,199,157, 61,123,118,220, 55,223,124,131, 1, 3, 6,224,240,225,195, 8,
- 9, 9, 89, 15,221,150, 21,171,232,220, 67, 0,132, 88, 91, 91,207,172, 83,167, 14, 54,110,220,136,208,208, 80,223,213,171, 87,
- 47, 9, 9, 9, 65,147, 38, 77, 4, 17, 17, 17,100,109,238, 33, 0, 96,100,100,100,164,213,106,113,249,242,229, 23, 0,230,141,
- 27, 55,206,106,235,214,173,163, 37, 18, 9,178,179,179, 21, 97, 97, 97, 99, 1, 92,249, 79,223,235, 24,130, 88, 54,245,251,217,
-123,191,159, 58, 86,216,182, 77, 43,200,243,147,160, 40, 76,131,188, 32, 21, 59, 14,220, 6, 65,176, 96,105,105, 11, 43, 27, 7,
-196,199, 39,224,233,181,235,106,153, 92,177,149,175,165,215, 87,205, 57,171,136,179,117, 17,167, 92,150, 14, 69, 97,122, 41,167,
-149,149, 93, 49,103, 60,158, 4, 92, 87, 42,100,178,205,106,134,248,253,111, 62,247,255,101,212,108,173,195,178,200,201,201,153,
- 51,125,250,116,207,197,139, 23,155,147, 36,201, 54, 51, 51, 67,124,124, 60,121,254,252,249,236,194,194,194, 57,181, 41, 13,135,
-203, 13,113,110,220,196,243,219,111,191, 37, 7, 13, 26,200, 27, 63,185, 31,199,210,202, 10,121,185, 89,136,124, 23,132,247,111,
-223,192,185,137, 27, 86,172,222, 2,152,152, 84,187,144,100,241,178, 58, 94,171,126, 94,120,166,139, 71, 31,163, 38,205,221,120,
-173, 26, 26, 67,163, 37,145,148,148,132, 43,151,131, 53, 97,175, 31,231,211,164,122,148, 60, 83,183, 37,120,252, 1, 18, 89,216,
-231,106,165, 57,177,110,195,142, 5,187,246, 29, 89,180,120,246, 84,113, 87,247,222, 8,189,251, 7, 46,248,157,145, 41, 85,234,
- 13, 60, 54, 54,133,101, 65, 30, 89,195, 58, 80, 42,149,154,242,227,169, 82,169,212,124,105, 75, 31, 62,124, 24,105,105,105,234,
-184,184,184,155, 36, 73,158,173, 98,177,231,207,176, 3, 80, 15, 81,169,238,254,236,238,222,239,231, 91,183,132, 19,127,250, 73,
- 61,110,252,248,133, 80,169, 52,224,243, 25,142, 88,204,130, 64,192, 13,127,242, 68,180,109,198, 12, 51, 66,173,190,115,164,138,
-180, 1, 21,224,171,207, 58, 44,177,104,117,239,222, 21, 19,167,206,131,162,140, 69,235,217,171, 72,168, 52,208,217,162, 85,140,
-132,184,196,196,142,179,151,253,124,113, 84,223,158, 46,174,142,245, 4,150,245,235, 65, 98, 99,131,172,140, 12, 60,121,245, 94,
-187,250,204,197,176, 98,145,165, 83, 94, 25,154,166,139,130,220, 1,244,156,179, 24, 4,155, 13, 20,167,113, 40,153, 57, 84,191,
- 93,103, 16, 28, 14, 40,134,134, 74,165,210, 37,232, 47,233,227,199,143,195,198,141, 27,119,207,207,207,143,213,183,111,223, 86,
-151, 46, 93,162,191,164,239, 40, 20,138,142, 0, 32, 20, 10, 99, 77, 76, 76,236, 39, 79,158, 12,173, 86, 11,185, 92,142,188,188,
- 60, 36, 37, 37,229, 78,158, 60, 89, 3, 0, 34,145,136, 63,124,248,112,163,234, 56,183,156, 79, 86,206, 27,110,191,221,140, 19,
- 55, 58, 63, 51,164,190, 25, 39, 46,182,163, 43,189,125,203,249,100,165,145,157,108, 77,102,156,127,164, 84,118,107,239,209,139,
- 23,216, 19,134, 12,163, 28, 36, 81, 62, 66, 43,230,124,117,188, 4, 65,124,150,156, 84, 71,145,245, 9, 10, 10, 10,150, 44, 95,
-190,124, 64, 78, 78,142, 67,191,126,253,120, 46, 46, 46,120,254,252, 57,252,252,252,200,103,207,158, 37,202,100,178,165, 0,148,
- 0,110,215,166, 78, 27, 55,110, 92,159,195,225,148,184,210,118, 22,255,188,243,210,165, 75,163,166, 78,157,138,122,245,234, 53,
-139,136,136, 16,160, 6,215, 17,195, 48,165, 94,134,175, 9,130, 32,162,183,109,219,102,111, 99, 99, 67,220,184,113,131,100,179,
-217,181,177,220, 28, 62,120,240, 96, 7,173, 86,251,253,180,105,211,224,225,225, 1,146, 36,113,252,248,113, 28, 60,120, 80, 87,
-145, 85, 37, 34, 35, 35,223, 36, 38, 38,118, 91,184,112, 33, 54,110,220,184,100,225,194,133, 72, 76, 76, 68,100,100,100,208,151,
-240,230,231,231, 43, 18, 18, 18, 12, 58,117,234,212, 54, 44, 44, 44,204,211,211,179,249,212,169, 83,177,126,253,122,230,225,195,
-135,195, 1,220,248,255, 24,189,223,127,200, 62,198,165, 56,183, 86,175,217,252, 75, 67,167,250, 63, 76,153, 52,146,221,216,185,
- 57,100,121, 73, 48,183,176,134, 67,157, 6,200, 72,207,196,205,155, 55,168,204,204,220,195, 20,139, 88,245,225, 67,118,202,151,
-112,218, 59, 52, 64,122,122, 58,174, 95,191, 78,229,230,228,239,135,150,181, 58, 34, 62, 55, 13,122,232, 98,201,154,134, 42,178,
-196, 87, 5, 11, 83, 83,211, 83, 70, 70, 70,105, 70, 70, 70,105,166,166,166,167, 0,157,102, 31,244, 42,115,119, 96,127,242, 26,
- 62, 92, 8,161,176, 35, 56,156,249, 38,166,166, 55,140,141,141,179,186,119,239,174,222,187,119,175, 50, 34, 34,156, 78, 78, 78,
-100,140,141,141,243, 74,247,175,136,179, 28, 76, 77,157, 12,197,182,205,127, 49,118,104,245, 68, 98,219,172, 64, 98,219,172,192,
-216,193,237,169,216,182,217, 74, 83, 83, 39, 67,157,202, 89, 9, 26, 88,193,210,217, 2,187,154, 88, 18, 10,103, 11,236,106, 96,
- 5, 75,157,207,189,106,183, 31, 69, 16,160, 80, 52, 13, 27,181,224, 44,225,160,217,108,246, 17, 7, 7, 7, 91,212, 44, 97,221,
-103,156,227,129,122,227, 5,130,239,207,249,248, 76,140,125,248,112, 92,126, 76,204,152,188,232,232,145, 65,103,206,140,218, 57,
-106,212,248, 49, 2,193,180,225,128,147,174,156,182,182,182,190,111,222,188,241,211,245, 85, 70,120,233, 92,159, 78, 13,236,111,
-245,237,213,129,241,158, 62,148,241,158, 62,148,233,219,171, 3,227,212,192,254,214, 23,180, 17,193,102,179, 71, 27, 24, 24,156,
- 18, 27, 24,132,138, 13, 12, 66, 13, 12, 12, 78,177,217,236,209,168, 58,134,234, 19, 78,115,115,243,215,214,214,214,105, 53,121,
- 89, 88, 88, 4,214,160,156, 99,234,215,175,159,200, 98,177,182,212,240,154,174,138,211, 89, 36, 18, 69,139,197,226,164,178, 47,
-145, 72, 84, 54, 49,148,185,129,129,193, 85,177, 88,188, 85, 23,206,223,151, 53,255,229,233,237,153, 33,191, 47,107,254, 75,249,
-109,179, 6,155, 78,126,126,111, 85,214,172,193,166,147,117, 41,167,149,149,213, 67, 43, 43, 43,169,149,149,149,212,218,218,186,
-202,151,133,133,197,107, 29, 56,133,134,134,134, 91, 13, 13, 13,211,196, 98, 49, 37,145, 72,210,196, 98,241, 22,148, 73,109, 81,
-219,250,100,177, 88,235,155, 53,107,166,100,179,217,135,202,109,218,216,176, 97, 67, 37,135,195,217, 80, 67, 78,163,174, 93,187,
- 82,193,193,193,140,135,135, 7, 3,192,244, 43,182,187,141,169,169,233, 13, 35, 35,163, 4, 67, 67,195, 29, 0,196,181,228, 36,
- 0,140,182,183,183, 15,234,209,163,135,220,222,222, 62, 0,192,183, 95,177,156, 3, 6, 15, 30, 76, 39, 36, 36, 48, 12,195, 48,
- 9, 9, 9,204,224,193,131,105, 20, 37,138,252,146,123,242,178, 25, 51,102, 48,207,158, 61, 99,158, 61,123,198, 4, 4, 4, 48,
- 3, 6, 12,160, 1,124,247,133,247,121,124,173,115,119,105, 96,225,212,180,145,233,217,177,195,220,233,219, 87,182, 48, 43,150,
-254,192,244,246,104,206, 52,105,104,122,209,217,217,220,249,107,112,254,178,116, 58,211,171, 91, 51,218,197,201,244,140, 75, 3,
- 11,167,255,240,185,255,163,172, 90, 37, 15,210,127,119,192,217, 95,166,197, 79,197, 82,197,176,179,179, 67, 86, 86, 7, 33,135,
-227, 46, 16, 8, 60, 89,108,246,131,236,140,140,185,197,143, 91,212,127,202, 84, 91,229,128,238, 4,126, 21, 75, 18,212,134,243,
-147, 64,246, 90,114,214,132, 67, 39,206,202, 22,149,166, 85,170, 20,115,146,124,189, 3, 85,214,193, 39,156,246,246,246,223,211,
- 52, 93, 95,215, 2,177, 88,172,216,228,228,228, 3,181,169,207, 70,141, 26, 49,197,238,109,226,107,182,251,223,209,151,254, 77,
-156, 71, 55,183,176,107,210,162,233,162,208, 55, 17, 27,139,221,138,165, 88, 57,203,212,208,189, 71,247,229, 79,238, 63,252,117,
-229,142,156,130,255,231,115,103, 65,199,152,182,175,192, 89,146, 36,180, 70,156, 92, 46,119,111,251,246,237,191,127,254,252,249,
- 33,138,162,166,253, 75,251,231, 0, 54,155,189,176,113,227,198,173, 34, 35, 35,131, 40,138,218,136, 10, 18, 69,214,162,156, 75,
-235,215,175,255, 35,143,199, 19, 20, 22, 22,230,164,164,164, 44, 7,112,246,191,173, 62, 93, 26,153,181,101,152,210,164,219,107,
-223,125,204,126,249,213, 56, 25,154,162, 25,246,154,200,152,172,192,255,135,118,255,199,136,172, 98,161,181,255, 63,241,199,189,
-244,156,122, 78, 61,167,158, 83,207,249,213, 57, 69,250,250,212,115,254, 3, 57,255, 81, 40,177,104,113,244, 85,161,135, 30,122,
-232,241, 63, 7,133,190, 10,244,208,227,191, 14,101,173, 90,165,214, 44,162, 10, 85, 90, 19,147, 96,109,148,237, 93, 61,167,158,
- 83,207,169,231,212,115,234, 57,245,156,255, 58,206,127,170,200, 42,235, 42,156,166,119, 29,234, 57,245,156,122, 78, 61,167,158,
- 83,207,169,231,252,111,226,252, 95, 23, 90, 40, 39,180,244,174, 67, 61,254, 51,216, 62, 4,246, 0, 48,251, 18,146,255,142,253,
-245,208, 67, 15, 61,244,208,227,255, 25,251, 81,137,235,240,191, 65,104,217, 1,232,136,162,133,111,223, 3,120, 12, 32,231, 11,
-248, 44, 0,140, 36, 8, 98, 4, 0, 48, 12,115, 14, 69,179, 70, 50,117, 57, 88, 40, 20,166, 41,149, 74,171,226,207,233, 74,165,
-178,236, 90, 6, 4, 62,159,205,198,148,121, 85,136,250,245,235,167,169, 84, 42, 43, 29,254, 62,143, 97,152, 16, 22,139, 21, 42,
-145, 72,238, 71, 70, 70,250,213,228,196, 61, 61, 61, 39,178,217,236,181, 0, 64, 81,212,178, 7, 15, 30, 28,249, 27,219,173, 67,
- 29, 59,155, 63, 52, 90, 13,153,150,145,189, 28,159, 39,242, 3, 0,236,242,130, 47, 65, 98, 81,241,231, 13, 51,253,170,206,163,
- 83,211,253,171, 64, 91, 46,151,235,109,109,109,221, 63, 41, 41,233, 53,128,159,128,234,179, 26,215,169, 83,231, 59, 14,135, 51,
-142,162, 40, 39, 54,155, 29, 77,146,228,137,196,196,196, 99,250,123,136, 30,122,232,161,135, 30, 58,136,173,207, 80, 35,161,213,
-196, 28, 54, 12, 48, 26, 4,122,131,193, 29, 2, 56,253, 62, 11,169,186, 30,255, 77, 19,104,181,100,209,127,242, 88,160,110,124,
-100,237,239,223,191,191,195,172, 89,179,208,185,115,103, 60,127,254,188,211,225,195,135, 39,159, 61,123, 54,132,166,233, 7, 0,
-158, 3, 58,165, 82, 16,163, 40, 79,203,216,254,253,251,247, 90,187,118, 45,187,121,243,230, 80, 40, 20,120,248,240,161,251,134,
- 13, 27,182, 62,125,250,244, 46,128,147,197,130,160,210, 5,240,148, 74,165, 85,201, 98,156, 4, 65, 88, 13, 31, 62,252,101, 89,
-113, 85,188,190, 26,193, 48,204, 51,130, 32, 2, 40,138,122,126,254,252,249,196, 38, 64,135,233,245,121,231,231,198,106, 28,202,
-115,170, 84, 42,171,203,191,175, 3, 71, 32,128,170, 32, 31,157, 38,253, 37,122,239,252,178, 8, 4, 77,130, 13, 38,199,115,205,
-214, 16, 0,161, 41, 41, 41, 33, 30, 30, 30,177, 53,109, 97, 54,155,189,246,230,205,155,182, 12,195,160,111,223,190,107, 1,252,
- 93, 66, 75,208,177,173,219,131,171, 23, 78, 9, 11,179,211,208,239,219, 81, 39,162, 18,211, 39, 2,184,240,137,104,234, 15,107,
-130,192,162, 25,235, 78,178, 1, 96,247,210,177, 63,109,233,131,237,243,110, 35, 21,128,103,177,248, 1,128,223, 1, 60,216,213,
- 31,214, 0, 22,207, 88,119,146, 0,128, 61, 75,199, 46,218,213, 31,219,102,222,168,113,218,138, 31, 39, 78,156,184,125,237,218,
-181,108, 91, 91, 91, 36, 39, 39,247,107,214,172, 89,227,252,252,252,102,168, 34,136,184, 94,189,122,103,186,246, 24,216, 96,232,
-136,209, 6,150, 22,166, 72,145,102, 26,157, 57,117,104, 58,251,217,195,254,113,113,113,163,244,247, 16, 61,244,208, 67, 15, 61,
- 42, 65,237, 51,195,183,182,133, 72,166,193, 96, 14,155,248,174, 75,219,102, 61,199,124,211,149,213,204,165, 17,222,134, 71,244,
-185,114,255,197, 6, 86, 64,248, 61,146, 98,142,137,121,184, 28, 40,173,122, 38,140,150, 4,231,246,229,147, 69, 35,225,228,177,
-236,151, 47, 95, 54,106,211,166, 77,233,210, 48, 61,123,246, 68,207,158, 61,137,221,187,119,187,221,190,125,219,237,224,193,131,
-154,123,247,238,253,129,170,243,163,120, 55,108,216,112,195,246,237,219, 5, 30, 30, 30, 16, 8, 4,165, 27, 36, 18, 9, 6, 14,
- 28,136,129, 3, 7,178, 83, 82, 82,250, 94,189,122,181,239,239,191,255,174,142,143,143, 95,136,191,178, 52, 87,137,229,203,151,
-183,173,224,231,155, 4, 65,124, 36, 73, 50,200,205,205, 45,177, 49,208,104,250, 55,157,239,252,216,197, 89, 60,119,201,225, 10,
-121, 56,124, 62,142, 78, 44, 26,171,203, 10,173,216,251, 55, 32, 49, 50,204, 50, 48, 52, 12, 1, 16, 10, 32,132, 97,152,208,232,
-232,232,136,166,128, 91, 71, 83,214, 31,135,114,232,150, 53, 16, 91, 72, 76, 76,132,177,177,177,200,195,195, 67, 74, 16,196,202,
-135, 15, 31,126,237,128,188, 14, 43, 23,253,200,203,137, 11, 65,234,187,103,152, 63,194,221, 96,238,142, 63,127, 85,170,181, 23,
-170, 58,136, 32, 88,172,223, 3,104, 31, 20, 45,198,187, 60, 43, 43,203, 3, 0,204,205,205,249, 0, 30,108,121,129,111,230,117,
- 33,190, 36,183, 27,143,205,102,239, 58,124,248,240,212,239,190,251,174,104,233,136, 39, 79, 32,145, 72,176,122,245,234,122, 11,
- 22, 44,240, 37, 73,114, 78,101,150,172,174, 61, 6, 54,216,182,241,215,102, 5,217,121,170,125,187,206,190,178,115,109,194,154,
-225,189,192,112,155, 70,101, 67, 81,212,119,122,203,150, 30,122,232,161,135, 30, 53,177,102, 85, 43,180, 26, 91,224, 72,107, 87,
-231,145, 99, 6,184, 11, 90,184, 54, 7, 79,240, 87,234,150, 54,109,219,162, 77,219,182, 44,159,194,130,222, 47, 95,189,233,125,
-254,246,115,149, 92, 27,127, 54, 50, 19, 19,117, 45, 85,201,162,180,107,191,181,238, 33,203, 77, 23, 2,128,216,196, 74,185,244,
-114,234,253, 46, 93,186,192,193,193,129,119,239,222,189, 41,213, 8,173,165,239,223,191, 23,176,217, 85,231, 67,181,179,179,195,
-240,225,195,209,164, 73, 19,126,247,238,221,151, 86, 38,180,132, 66, 97, 58, 65, 16, 86, 0, 96,102,102, 70,173, 92,185, 50,136,
- 41, 2, 0, 48, 12,195, 60, 99,177, 88,207,105,154,126,241,231,159,127, 38, 53, 3,172,250,181,105,242,248,199,241,195, 13,152,
-243, 91, 43, 21, 9,202,252,252, 10,127, 55,144,136, 51, 68, 98,113,136,192, 64, 24,138,162,181,188, 66, 29, 28, 28, 34,154, 1,
- 14,237,155,212,191,189,123,222, 88,195, 67,211,126,173,182, 46, 91,183,110,221,184,101,203,150, 66,138,162, 32,147,201,176,103,
-207, 30, 99,145, 72,100,220,191,127,255, 21,101, 59,128, 11,208, 98,152, 29,123,218,170, 20,106,102, 45, 58,146, 73,215, 78,109,
-227,134, 15,236,111,212,182, 99, 87, 68, 61, 56,142,236,236, 2,228,229, 22,130,166,233,207,242,250,204,188,129,180, 93, 94,216,
-176,123,201,216,197, 4,139, 69,184, 13,249, 9,131,108,242,102,239,221,187, 55, 28, 0,151,207,231,151,237,135,118, 34,123,215,
- 13,141,250,116,197,158,101,227,193,208, 52, 3, 96, 67, 13,172, 89, 86,134,134,134, 87,110,223,190,221,161, 93,187,118,120,254,
-252, 57, 98, 98, 98,240,227,143, 63,170,103,206,156,201,155, 48, 97, 2, 49,127,254,252, 89,191,255,254,251,121, 0, 79, 63,187,
- 16, 56,156,113,223, 14, 29,197, 47,204,205, 87,170, 85, 26,181,153,133, 9,173,146, 41,229,153, 57,249,202, 81, 99,191, 87,135,
- 7,190, 24, 7,224, 51,161,245,133,245,169,135, 30,122,232,161,135, 14, 96, 24,166, 29, 0, 75, 0, 25, 4, 65,188, 42,251,189,
-120,151,146,213, 90,202,127,207, 68,145, 87,202,188, 12, 93, 38,138,194,125, 44, 1, 80, 0, 94, 18, 4,145,243,133, 69,172,122,
-233, 29, 63, 63, 63,166,236,123, 25,161,197, 48, 12,195,104,179, 62, 50,170,200, 27,140,252,213,129,207, 94,138,240, 11,140,244,
-229, 89,230,197,201, 95,152,198, 22, 85,175,194,254, 77, 19,104,199,182, 4, 51,163, 29,152, 57,221, 77,148, 47, 95,190,188, 71,
-211,180,159, 79, 87, 48,204,219,147, 12,243,246, 36, 51,175, 19,152,243,231,207,223,244,245,245,245, 59,118,236,152, 31,128,234,
-226,148,210, 10, 94, 5, 48, 47,172,192, 84,134,247,239,223, 51,123,247,238,101,150, 44, 89,194, 28, 58,116,136, 65, 53, 25,212,
-251,246,237,251, 48, 44, 44,140,153, 48, 97, 66, 16,170, 72, 12,232, 2,136,199,213,179,121,167, 58,179, 85,163,254,174, 5,147,
-211, 77, 88,225,249,219,218,218,126, 82,158,245,206, 54,204,206,246,206,204,145,222,109, 82, 25,134,185,201, 48,204,122,134, 97,
- 70, 49, 12,211, 4, 0, 90, 3, 70,223,218,154,127, 80,158,221,166, 80, 79,235, 88,237,186,119,173, 91,183,110,188,112,225,194,
-108,181, 90,205,196,198,198, 50,251,246,237, 99,238,220,185,195, 92,190,124,153,113,119,119, 79, 41, 83, 94,235,201, 77, 28,211,
-212, 7, 87,169,106,211,139,184,108,246,206, 87,119,206, 51, 31, 30,159, 99, 94,158,246,101, 78,252, 60,134,153,245,109, 7,141,
-145, 72,160, 4,208,163,178,227,102,118, 65,163, 38,245, 44, 35,227,227,227, 25,141, 70,195, 76,154, 52,137,233,219,183, 47,211,
-167, 79, 31,166, 87,175, 94, 76,207,158, 61,153, 30, 61,122, 48,247,239,223,103, 82, 82, 82,152, 94, 93,219,200,188, 92,208,182,
- 6, 69,115,117,116,116, 76,141,141,141,101, 52, 26, 13,115,239,222, 61,230,248,241,227,204,189,123,247, 24, 31, 31, 31, 6,192,
-145, 25, 51,102, 40,114,114,114,152,190,125,251, 38,161,130,172,241,142,142,142, 17, 97,145,137,137, 91,214, 29,184,127,116,231,
-169,251, 23,207,223,185,127,229,214,203,107,151,111,189, 58,251, 34, 56,250,178,163,163, 99, 68, 5,237,255, 69,245,169,135, 30,
-122,232,161, 71,245, 90,164, 88,104, 13, 40, 54,118, 12, 96, 24,166, 87,185,239, 3,138,133,211,103,223,125,124,124,150,148,253,
- 94,178,143,143,143,207, 18, 0, 76,167, 78,157, 78, 49, 12,211,232, 43, 20,127, 90,249, 87,141,102, 29,146, 73, 47,193,115,238,
- 15, 46,165,133, 54,243, 61,232,220,120, 64,108, 3, 5, 33, 65,150, 52, 30,239, 30, 95,168,122, 33,137, 98, 92,127, 15, 46,128,
-123, 17, 17, 17,120,247,238, 29, 18, 19, 19, 97, 96, 96,240,217,126, 79,158, 60,129, 72, 36,130,173,173,173,110, 74, 87,253,233,
- 56, 23,210,198, 17,146, 78, 30,200, 28,243, 3,238,221,187,135,244,244,116,240,120, 60,240,249,124,144, 36, 89, 45, 31,139, 85,
-180,226,111,137, 21,171,162,125, 60, 0,142,192, 76,114,117,247,138, 57,245, 89,207,252,184,138,132, 15, 72, 81, 82,186, 89,242,
- 36, 98, 24,136, 13,164, 34,145, 65, 8,138,221,133, 0, 66, 9,130,136,106, 13,112,197, 18,225,213, 63,214,204,183, 97, 7,222,
- 19, 42, 62,132, 84,200,209,171, 87,175,233, 0, 86, 48, 12,147,219,178,101, 75,235,181,107,215,154, 38, 39, 39,227,237,219,183,
- 56,123,246,108, 6, 89,116,162, 4,195, 48,171, 0,160, 35, 32, 52,177, 52,185,181,243,151, 57,134,120,112,134, 95,155, 94,100,
-236, 50,240,218,176, 9, 51,102,110,159, 51, 16,178, 2, 5, 78,222, 9,196,205, 55, 31, 7, 1,120,130, 42,226,222,118, 61,197,
- 7, 32,163,231,208,161, 67,131, 30, 61,122,100,113,240,224, 65,144, 36, 89,225,235,224,193,131,184,251,248,205,108, 0,175,117,
- 44,150, 93,253,250,245,239,190,120,241,194,210,192,192, 0,119,238,220, 65,110,110,110,169, 37,107,226,196,137, 68,110,110,238,
-232, 61,123,246, 12,139,139,139,219,248,248,241,227, 44, 20,173, 5,249, 73, 71, 96,179,217, 31, 73, 82,211,212,214,165, 17,103,
-196,192,174, 93, 11,179, 66, 32, 49,111,137,103,193, 31,175,230,230,100, 41,216,108,246,199,178,251,127,141,250,212, 67, 15, 61,
-244,208,163,102, 32, 8,194,143, 97, 24, 47,130, 32,252,202,255, 86,254,115,201,126,190,190,190,165,223, 75,142, 89,191,126,253,
-186, 50,223,229, 95,169,120, 85, 6,195,119, 47, 86,144,221, 43,218, 73,245,246, 34, 84,239,174,128,231,216, 5,252, 38,131,192,
-118,116, 71, 66,200, 3, 4,223,216,130,164,240, 39, 96,104, 10,182,141,219,235, 90, 16,101,211,166, 77,161, 84, 22,133,102,169,
- 84, 42,240,196,166,202,249,211,198, 10, 1,128,230, 8, 85,101, 20,172, 78,132,134, 93, 60,209, 62,141,193, 75,235, 34, 67, 69,
-251,180,162,227,214, 76,154, 4, 30,143, 7, 30,143, 7,162, 56,244, 71, 23,161, 69, 20,239, 76, 23,185,175, 42, 42, 4, 33, 23,
-112, 79,158, 94,225,221, 94, 16, 23,202, 87,133, 61, 67,138,138,102,174,166, 81,215,116, 41,175,129,216, 32, 89,100, 96, 16, 42,
-146,136, 75,133, 22, 65, 16, 31, 1,128,225,114,143, 29, 95,229,221, 82,156, 22, 45, 86,190,186, 7,169,146,214, 84, 66,179,234,
-198,141, 27, 86, 28, 14,199,134,162, 40, 36, 36, 36, 32, 60, 60, 28,219,182,109, 75, 43, 40, 40,232, 30, 24, 24, 24, 89, 86, 59,
- 82, 34,254,217, 99,171,231, 52,224,132,248, 11, 85, 31,195,106,220,123, 44, 92, 7,247, 29,212,221,237,218,244,241,203, 48,248,
-155, 62,152,208,189, 25, 19,155,146,173, 4,112,167,216,244, 90, 29,146, 3, 3, 3,123,119,235,214,237, 68,171, 86,173, 92, 24,
-134, 65,139, 22, 45, 48,122,244,104, 28, 59,118, 12,193,193,193,200,207,207,215,220,190,125,123, 43,128,195, 58, 22,203,192,212,
-212,244,230,253,251,247, 45, 13, 12, 12,112,251,246,109, 40, 20, 10,216,218,218, 98,230,204,153,252,245,235,215, 31,205,207,207,
- 31,225,235,235, 43,140,141,141,221,121,235,214,173,122, 40, 90,119,238,179, 78,160, 86,171,247,159, 60,118,100,251, 76,239, 89,
-246,247,159,191,189,167, 42, 44, 48,118,116, 76,204,183, 52,149, 24,110,253,109, 85, 93,181, 90, 61,189,226,250,124, 88,171,250,
-212, 67, 15, 61,244,208,227, 51, 84,169, 69,202,138,167,242, 98,171, 38, 34, 13,128,194,199,199,103, 41, 65, 16,126, 62, 62, 62,
- 75,125,125,125, 21, 0, 82,254, 14,145, 85, 42,180,188,188,188,252,253,252,252,224,229,229,229, 95, 41, 5, 77, 65, 19,251, 8,
-154,216, 71, 16,117,154,141, 63,125,199,148, 59,121,186,214,165, 27,184,250,206,125,149, 74,197, 57,114,228, 72,105,220, 22, 0,
- 80, 20,245,213, 91,177, 38, 66,171, 88,232,125, 86,136,250, 2,137,255,254,121, 35, 58,154, 83,114,174,250,201, 85, 36,171,104,
-114,227, 7,141,252, 85, 46,243,123,101,156,151,231, 78, 71,226,227,187, 48,144, 72, 18,167, 62, 10, 45,181, 98, 21,139,172, 24,
- 0,168, 39, 48,188,183,119,206, 96,119, 27, 30,120,234,107,231,144,162,162, 85,123,227,180,135, 43,233,108, 96, 24, 6, 49, 49,
- 49,144,203,229, 8, 8, 8,192,133, 11, 23, 50, 42, 16, 89,168, 47,144, 60, 60,244,211,184, 14, 70, 5,169, 60,245,171,187, 72,
- 81,209, 58,185,186, 44, 90, 12,238,194, 99, 17,183, 9, 22, 91,212,179, 99, 99,204,253,126, 8,182, 28,250,147, 84, 91,117,245,
-218,126,229,250,200, 66,149,102,169,142, 34,171,212,216, 24, 24, 24,216, 44, 48, 48, 80, 0,192,115,244,232,209,215,135, 13, 27,
- 6,127,127,127, 92,189,122,213, 25,128,180,120,191,213, 40, 90, 40,251,119, 0,209,149, 25, 30,121, 60,222,233,187,119,239, 54,
-183,179,179,195,221,187,119,161, 80, 40, 48, 99,198, 12,181,183,183, 55,111,226,196,137, 68, 94, 94, 94,169, 37, 43, 32, 32, 32,
-171, 50,145, 5, 0,201,201,201, 55, 46,156, 61,222,185, 91,183,110, 67, 26, 56, 55, 49,138, 46,200, 79, 55, 48, 16,138, 30,251,
- 63,224,189,122,241,116,103,114,114,242,203,138,235,243,158,206,245,169,135, 30,122,232,161, 71,229,208, 73,139,148,179, 76,213,
- 4,101,142,227,250,250,250,134,251,250,250,126, 98,241,250, 66,148,159,117,120,173,100, 76,171, 85, 30, 45, 42, 47,225,243, 19,
-160,233,154,156,236,103,191,153,154,154,146, 34,145,232, 19,161, 69,235,200,153,125,233, 20,162,127, 28, 91,106,201, 42,177,108,
-161,223,196, 47, 18, 90, 52, 77, 7, 0,248,164, 16, 6, 86,141,199,108, 29,232,210,165, 89, 3,123,150,246,236, 54, 36,201, 73,
-229,138,247, 26,229,187, 2,102, 80, 68, 5, 65,214,165,156,164, 22, 66,177, 40, 94, 36, 17,151, 23, 89,113, 0, 32,182,118, 30,
-182,177,127,147,238,110, 77, 26,178,200, 51,155,145, 44,215, 22,250, 68,104, 52,209, 50,230, 98, 37,117,184,162, 79,159, 62, 43,
-204,205,205,133,219,183,111, 55,118,116,116, 4, 73,146,234,242, 34,203,192,170,241,152,109,131, 93,187, 52,182, 49,101,105,207,
-239, 64,162,130,146,111,139,214, 30,213, 69,100, 89, 24, 75,110,237, 93,247,163,200, 64,192,133, 82,169,196,250,221,231,113,251,
-105,152, 87,102,216,229, 91, 0,110,125, 65,135,156,234,229,229,181,101,245,234,213,208,106,181,152, 50,101, 10, 62,126,252,120,
-251,253,251,247,219,234,214,173,187,240,167,159,126,178,179,177,177,193,200,145, 35,121, 90,173,118, 98, 37, 28,191,157, 60,121,
-210,203,205,205, 13,254,254,254,200,205,205,133,173,173, 45,188,189,189,249,190,190,190, 71,243,243,243, 71,172, 91,183, 78, 24,
- 19, 19, 83,165, 37,235,147,126, 77, 81,107,246,109,249,113, 97,187,142,238,172, 15, 31, 34,201,132,246, 30,172, 7,119,175, 62,
- 50, 55, 55, 63,154,144,144,240, 87,125, 14,105, 81,227,250,212, 67, 15, 61,244,208,227,235,128, 32,136,107,197,113, 87,159, 88,
-185,202,139,176, 18,139, 85,217,239,229,247, 47,222,254, 53, 30,150,247, 87, 32,188, 62, 77,239,224,229,229,165,243,180,122, 90,
-150,161,147,120, 42,143,111,154, 64,107, 47, 1,103,169, 7, 11, 60,177,169,114,224,234, 59,247, 43,219, 87, 44, 22,235,108,209,
-162, 85,202,234, 26,165, 70, 66,171, 56, 70,235, 38,195, 48,159, 8, 45, 99,235,198, 30,139,127,154,179,213,125, 88, 63, 86,218,
-247,157,144, 91,168, 82,253,244,150,164,147,228, 85,139,172,162, 81, 92, 27,107, 32,150,132, 10,197, 6,101, 69, 86, 2, 0, 8,
-173, 26,182, 95, 52,119,230,238, 30, 99, 6, 18, 25, 51,220,145,147,171, 80, 45, 12, 39,137,100, 5, 51, 34, 2,120, 80, 17,221,
-253,251,247,247, 1,216,231,225,225,145, 38, 22,139, 81, 88, 88,248, 89, 27,148,148,183,203,176,126,172,180,169, 29,144, 45,211,
-168,126, 10, 39,145,162,160, 79, 87, 39,178, 44, 77, 12,111,237, 93,251,163, 65, 74, 82, 28,120, 60, 30, 36, 18, 9,238, 60, 9,
- 69,102,248,149, 47, 17, 88, 96,177, 88, 43,125,124,124, 86,204,156, 57, 19, 89, 89, 89,184,122,245, 42,190,249,230, 27,156, 58,
-117,202,241,250,245,235, 91, 60, 61, 61,193,102,179,225,231,231, 7,173, 86, 27, 85, 9,205,144,105,211,166, 45, 28, 54,108, 24,
- 94,190,124, 9,169, 84,250,137, 37, 43, 55, 55,119,244,238,221,187,135,197,198,198, 86,107,201, 42,135,246,245, 27,182,230, 45,
- 89,190, 9, 42,121, 58, 39, 35,249,185,255,189, 59,172,103,217,217,217, 6, 0,242,106, 91,159,122,232,161,135, 30,122,232,108,
-213,170, 76,139,100, 20,139,168,140,138,190,151, 17, 88, 21,125, 39,202, 89,193,212,229,182, 7,255,157,231,164,147, 69,139, 99,
-237, 10, 50, 45,172,140,208, 74,255,100,187,208,208, 76, 39,215,161,150, 4,103,239,225,210, 60, 90,194,172,172, 44,161,133,133,
-133,178,172, 64, 48, 48, 48,128,157,157, 29,114,114,114,176,127,255,126,160,250,160,104,210,104,216,120,180, 31, 51, 5,175, 28,
-248, 96,180,154, 82,203,214,222, 73,147, 62, 17, 91, 60, 30,175, 36, 54,172,186, 65,247, 69,177,165,233, 25, 0,166,181,115,131,
- 95,133, 98,241, 36,161, 69, 29,139,185, 63, 78,229,198,166,171,112,223,125, 73,238,249,223, 22, 75, 18, 25,201,204, 4,228, 61,
-173,134, 47,250,219, 61,199,203, 91,178,146, 90, 57, 55, 88, 38, 52, 16,126,207, 55,171,103,227, 51,255, 71,110,108,154,138,184,
-223,254,167,252, 11,191,255,100, 16, 3,195,133, 73,200,125,160, 67,243,172,248,230,155,111, 86, 48, 12,195,208, 52,189, 28, 0,
-202,150,119,190,247,247,220,232, 84, 37,238,185, 47,203,185,240,219, 98,195, 68, 84, 93, 94,139, 22,131,187, 88,155, 26,221,218,
-187,110,166,129, 52, 57, 30, 2,129, 0,134,134,134, 72, 76,203, 3,151,195, 86,124, 97,127, 19,116,237,218,117,241,143, 63,254,
-136,208,208, 80,204,152, 49, 67,154,144,144,112,241,204,153, 51, 51,126,249,229, 23, 78,223,190,125, 33,149, 74,177, 97,195, 6,
-237,147, 39, 79,214, 1,216, 80, 97,127,228,112,166,254,250,235,175, 76, 74, 74, 10, 17, 19, 19, 3, 91, 91, 91,204,154, 53,139,
-191,110,221,186,210,152,172,154, 88,178, 74,144,156,156,236,127,251,238, 51, 12,186,177, 21,164, 86,229,159,155,149,240,232, 93,
-116,142,191, 25,159,191,192,190,117,139, 90,213,167, 30,122,232,161,135, 30, 95,197,138,245,170,170,239,255, 5,168,200,117,168,
-147,208,138,218,177,108,178,243,228,153,139, 32,114,236, 2, 85,196, 37,208,133,105,165, 22, 45,161,196, 20,102,117, 93,144, 43,
- 83,225,220,189, 55, 0, 16, 85,147, 82, 21, 20, 20,160, 77,155, 54,216, 53,177,113, 15,101, 65,150, 80, 4, 64, 37, 48, 82, 94,
-230,119,189,127,253,250,117, 57, 77,211,167, 1, 92,175,134,102,101,243,230,205,119,110,218,180,137,239, 50,102, 50, 10,159, 63,
- 46,111, 65,129, 72, 36,130, 64, 32, 64, 72, 72, 8,238,223,191,175, 6,176,178,154, 6,125, 65,146,100,240,153, 51,103,146, 26,
- 53,176,239,215,166, 85,203,217, 75,151,248, 24,190,125,124, 27,203,215,237,164, 27,181,237,155,183,254,212,229,130, 60, 73,221,
-158, 10,233,251, 32, 29, 78, 53,184,156,200, 74,105, 90,191, 78,143, 86,174,205, 23, 45, 95,190,204, 40,252,241, 29,252,242,251,
- 94,198,217,173, 87,222,239, 23,174,228,103, 26,212,235,163, 76,127,247, 82,151, 58,244,247,247,223, 7, 96, 95,201,247,242,229,
-245, 89,189,141,110,220,174, 95,206,250, 83, 23,100,249,134,117,123, 85, 85, 94, 75,151, 33,157, 29, 44, 77,111,237, 88,243,131,
- 65,106,114, 2, 4, 2, 1, 36, 18, 9, 18,164,185, 88,177,245,172, 76, 67,211,253,190, 84,104, 25, 26, 26, 10, 52, 26, 13,118,
-237,218,133,132,132,132, 78, 0, 18, 94,191,126,189,119,212,168, 81,219, 91,180,104,209, 52, 60, 60, 60,170,176,176,112, 38,128,
-119,149,145,152,152,152,116,178,180,180, 36,158, 61,123,134, 31,126,248, 65, 61,107,214, 44,222,132, 9, 19,136,156,156,156,218,
- 90,178, 0, 0,246,246,246, 30,189,123,118, 68,151,222, 51,252,213,202,220, 71,177,239,142,250,179,152,167,194,218,214,167, 30,
-122,232,161,135, 30,255, 26,212, 46, 49,184, 7,192,105,108,142,233,205,237,121,169,199,126,155,197, 20, 68, 7, 48,138,151,251,
-152,252, 75,223, 51,215, 54, 76, 96,174,239,152,203,204, 24,208,156,105,106, 69,164, 54, 54,199,116,143,207,133,219, 39,171,123,
-127,211, 4,218,222, 13,193,244,110, 8,102, 64, 99,104, 1, 44,109,221,186,245,101,239,246,127,229,209,242,110, 15, 6,192, 15,
- 0, 36,149, 20,171,162, 21,195,109, 1,236,111,211,166, 13,249,224,193, 3,230,253,136, 94, 76, 96, 83, 11,102,230,204,153,204,
- 47,191,252,194,140, 29, 59,150,177,180,180, 36,139, 43,194,182, 58,206, 65,131, 6, 57, 0, 64,157, 58,117, 76,218,186, 52, 74,
- 13,185,119,149,121,116,108, 59,115,200,123, 40,211,161,133, 75,166, 77,211,110,193, 34,219, 38,173,170,169,190, 82, 78, 27, 27,
-155, 37, 12,195,244, 99, 24,198, 22, 0,156,157,205, 37,173,155, 54, 74, 9,190,123,149,121,124,124, 39,115,200,123, 40,211,177,
-101,179, 44, 7, 23,207,119, 66,171,166,237,117,225,172, 8, 21,150,215,181,105,166,117,163,206, 65, 85,148,183,148,179, 65,251,
-145, 87,146, 82,210,152, 23, 47, 94, 48,215,175, 95,103, 30, 63,126,204, 28, 59,115,133,169,219,110, 68,161, 69,139,193, 93,106,
-208,117, 42, 43,167,241,128, 1, 3,152,168,168, 40,166,127,255,254, 12, 0,227, 90,114, 94,142,141,141,101,194,194,194,152,165,
- 75,151, 50, 0,142,252,248,227,143,138,188,188, 60,166, 87,175, 94, 9,197, 2,139, 83,155,114, 58,213,183, 95, 63,100, 96,215,
-149,222, 63, 12,243,248,210,250,252,138,208,115,234, 57,245,156,122,206,127, 3,231,255, 50,108,139,173, 90, 37,239,173,117,202,
-163,229, 15,144,200,194, 62, 87, 43,205,137,117, 27,118, 44,216,181,239,200,162,197,179,167,138,187,186,247, 70,232,221, 63,112,
-193,239,140, 76,169, 82,111,224,177,177, 41, 44, 11,242,200,106, 74, 81,156, 71,235, 19, 4, 6, 6, 26,152, 53,252, 43, 7,211,
-135,162,220,172,123,107,120,130, 82, 0,211,222,188,121,179,201,211,211,115,237,247, 93,218, 15,245,238,220, 3, 90,173, 22,199,
-142, 29, 67,124,124,252, 69, 0,203,116,181,184,133,134,134,102, 54,107,232, 56,135,203,230, 44,154, 57,118,136,101,198,199,183,
- 72,138, 8, 4, 0,168, 84, 10,109,106,212, 35,183,154, 20, 78, 36, 18,189,176,180,180,124,111,105,105,153,211,184, 65,157,105,
- 2,112,151,207, 24,253,173, 85, 86,236, 59, 36,134, 23,121, 70, 85, 74,185, 38, 41,234, 65,211,218,180,174,163,163,163, 64,204,
-197,244, 10,203,171, 86,106,211, 62,188,107,165, 11,143, 92,165, 94,183,106,203,177, 62,107, 22, 77, 18, 24, 25, 25,225, 77,216,
- 7, 44,223,124, 74,166, 80,107,251,101,134, 94,254, 42,238, 49,134, 97,160,213,106,117,158,232, 80, 9, 22,187,185,185, 53, 89,
-187,118,173,243,196,137, 19,241,165,150,172,178,136,142, 77,246,177,175,227,212,236,195,251, 55,158,102, 34,222,137, 47,169, 79,
- 61,244,208, 67, 15, 61,254, 53, 24, 80,108,204,153, 86,230, 61, 16, 58, 62,245, 35, 44, 29,114, 0,171, 27,176, 11,247, 46, 89,
-187,101, 5,139,216, 58,137,102,152, 63, 72, 22, 86,197,100, 33,227, 11, 11, 39,231,114, 64,246, 25, 60,150, 3, 0, 92, 78,237,
- 6,200, 98, 68, 1, 24,118,224,233,203,118, 7,158,190,252,185,248,183, 53, 0,106,228,203, 53,228, 32,204,189,153,147,125,215,
-214,205,133,108, 74,129,164,136,143,200,150, 41,113, 39, 60, 62,151,197,176,254,168,105,161, 98, 98, 98, 30, 2,128,181,177, 65,
- 68,215,102, 13,235,118,107,211,220,128, 75,168,145,244,246, 13,242, 20,106,220, 14,143,207, 3, 65,212, 58,160,250,107,149, 55,
- 45,244,202,171, 63, 65,244, 34, 8,226,238, 82,239, 49,130, 21,155, 79,127, 85,145, 5, 64,158,156,156,156, 37,151,203,205, 83,
- 82, 82,212,168,125,146,184, 15,249,249,249, 45,230,206,157,187,122,225,194,133,139,126,251,237, 55, 94,109, 98,178, 42, 67, 78,
-114,252,165,110,205,191, 94,251,235,161,135, 30,122,232,241,175,192,180,114,239,208, 89,104,149, 10,134,116,100, 0,152,233,228,
-196,204,143,142,134,250,107,149,172, 34, 75,215, 23,226, 21,128,129,181, 62,154, 69, 20, 60,143,138, 47,124, 17, 21, 95, 8,154,
- 97,104,134, 81,177, 88, 72,148,105, 52,235,162, 98,146,107, 63,235,142, 32,168, 87, 31, 18, 20,175, 63, 38, 42, 25,154,102,104,
-134, 81, 19, 4, 82,181, 90,122, 93,120, 76,252,149,255,134,242,102,134, 94,126,234, 71, 18, 93,159,190, 8,155, 47,147,105,118,
-102, 70, 92, 14,248,138,237,162, 13, 13, 13, 29,215,169, 83,167,201, 20, 69,237, 5,160,253, 2, 46, 53, 73,146,139,215,175, 95,
-127, 49, 52, 52,244,108, 64, 64,128,244,107,136,172,191,181,253,245,208, 67, 15, 61,244,248,167,162,118,139, 74, 87,134,175, 41,
-178,254, 27, 17,246, 33,174,205,223,193, 27,254, 33,206,245,127,161,188,105, 17,151, 94,167, 1,163,255,166,234,189, 77, 81,212,
-237,175, 41,170,111,222,188, 89, 31, 21, 44,171,243,223,214,254,122,232,161,135, 30,122,252, 99, 49,173, 50,241,197,209,215,141,
- 30,255, 0, 48, 95, 75,100,233,161,135, 30,122,232,161, 71, 45, 80,169, 69,139, 64,229, 51, 7,238,214,224, 15,106, 51,251,224,
-174,158, 83,207,169,231,212,115,234, 57,245,156,122,206,127, 29,231, 63, 17,182, 40, 10,136,191, 86,252, 14,134, 97,246,255, 39,
-254, 88, 63,245, 85,207,169,231,212,115,234, 57,245,156,122, 78, 61,231, 63, 29,159, 5,194,151,164,119, 96,233,235, 70, 15, 61,
-244,208, 67,143,191, 17,130,226, 87,109,183,235,161,199,255,162,216, 42, 21, 92,181,137,209,106, 84,252,254,225,111, 44,172,183,
-173,173,237,180,150, 45, 91,186,240,120, 60, 86, 65, 65,193,170, 7, 15, 30,172, 44,191, 83,215,102,156,215,108, 22, 28,254,250,
-133, 0, 8, 54,192, 98,129, 98,144,244, 56, 68,209, 86,223,238,255,213,112, 20, 25, 89,254, 73,176,216,124,138,212,128,210,106,
- 80, 20,110, 85, 4,154, 38,227, 41,141,170,111,101, 7,219,184, 13,169, 75, 82,244,111, 0,179, 11, 96,253, 8,208,187, 9,112,
-102, 48, 32,247, 16, 96,255, 0, 54,243, 59, 40,226, 39, 14,151,189, 68, 26,120, 62,241,159, 80, 97,231,206,157, 99,127,201,241,
- 35, 70,140,168,112, 1, 81, 59, 59, 59, 63, 3, 3,131,134,149, 29, 39,147,201,164, 82,169,212,243, 31,222, 31,187, 1,216, 1,
-160,121,185,223,223, 1,152, 3,224,222,151,254,129, 7,192,177, 6,166,243,128,159, 0, 64, 3,252,158, 6,236,243,255, 47,138,
- 49,180,180,180,124,196,225,112,156,101, 50,153,172,160,160,192,201,208,208, 48, 90, 44, 22,139, 73,146,140,202,200,200,232, 86,
- 67,186, 31,241,215, 82, 90,139, 0,236,174,225,118, 61,244,248, 95,193, 23,205, 58,108, 92,116,127,128, 7,128,110,237,218,181,
-179,150,201,100,120,247,238, 93, 26,128, 71, 0,252,139, 95,145, 95,163,164, 44, 22,107,227,150, 45, 91, 22,204,154, 53,171,116,
- 49,232,144,144, 16,184,185,125,158, 35,148,205,130,195,131,171,119,173, 94,133, 70,162, 93,175,225,197, 66,139, 5,200,164,240,
-236,221,190,182, 69, 48, 52, 53, 53, 93, 69, 16,196, 8, 22,139, 85,237,160, 70,211, 52,197, 48,204,185,156,156,156, 21, 0, 10,
-106,242, 71, 98, 3,129,150,164,168, 10,255,131,195,102, 83, 50,185,170,210,180, 23,102,102,102, 1, 44, 22,171, 65,217, 5,179,
-129, 79, 23,208,174,108, 27, 73,146, 73,153,153,153,186,136, 80, 33,139,195,155, 67, 16,188,222, 96,209,141, 1, 2, 4, 88,145,
- 52,165,190, 67,147,154,109, 0,148, 95, 34,178,108,235, 56, 61,158,183,108,189, 67, 88,196, 59, 44,245, 30,139,223,118, 28,193,
-146, 57,147,177,109,255, 41,204,153, 54, 6,205,154, 53, 71, 85,203,138,211,224,173, 91, 54,123, 68, 47,223, 93,103,221,151,204,
- 28, 33,240,221,117,174,235, 82,239, 81,252,117, 59,207,118, 93,234, 61, 82,224,187,243,172,251,146,217, 35, 68,235,118,159,167,
- 1,140,175, 77, 33,199, 56,219,201, 8,146,172,240,105,155,225,112, 84,167,162, 82,196,255, 31, 87,244,196,137, 19, 91, 42, 20,
-138, 55, 99,123,183, 94,223,170,177,125,114, 69,251,100,165, 38,219, 71,191, 15,244,225,242, 68,109,190,245, 57, 18, 82,165,201,
- 65, 32,104,240,238,221, 59,103,154,166, 65, 81, 20, 72,146, 44,125, 87,171,213,232,214,173,219,215,154, 56, 51, 16,192,170,162,
-139, 21,190, 0,206,126, 1,151,132,195,225,204,227,243,249, 30, 36, 73,186, 0, 0,151,203,141, 80,169, 84,254, 36, 73,110, 1,
- 80, 88, 67,190,173,201,201,201,205, 36, 18, 9, 52, 26, 77,233, 2,244,108, 54,187,105,221,186,117,119, 41,149, 74,231, 47, 61,
-121,107, 96,122,103,119,247,109, 19, 22, 44, 96, 43, 30, 61,194,182,195,135,183, 34, 63, 31, 0,118, 85,119, 44,159,207,191,197,
- 98,177, 28,107,242,127, 52, 77,199,171,213,234,190, 53, 57,134,195,225, 56,167,164,164, 88,217,217,217,161,160,160, 0, 98,177,
- 88, 92,242,189, 22,150,172, 13, 12,195,136,138,239,237,219, 58,118,236,216,137, 32, 8, 18, 0, 67,211, 52,235,197,139, 23, 99,
-104,154,230, 20,223,159, 54, 0, 56, 12, 64,165, 31,179,245,248, 31,181,102,237,175,169,208,186, 14,192,163, 93,187,118,162,209,
-163, 71,195,195,195, 3,206,206,206, 16, 10,133, 69, 55,241,172, 44,235,160,160,160,145,143, 30, 61, 26,121,245,234, 85,188,125,
-251, 86, 1,224, 9,128, 10, 47,234,158, 94,238,179,132, 18,193,118, 0,200, 72,202,146, 38,197,164,111,151, 74,165, 27, 0,148,
- 77, 17,238, 52,126,252,248,249,179,103,207,134,159,159, 31, 78,157, 58, 5,149, 74,133,130,130, 42,244,139, 60, 29, 57,247,215,
- 3,226, 88, 32,193, 31, 48,176, 2,196,214,181,174, 41, 83, 83,211, 85,115,230,204,153,219,172, 89,179,210, 44,230, 90,173, 22,
- 36, 73, 66,171,213, 34, 39, 39, 7,243,231,207, 47, 26,104, 25, 6, 52, 77,227,198,141, 27,179,166, 77,155,134,156,156,156,121,
- 21,113,118,108, 83,231, 53,139, 96, 57,148,216,106, 24,138, 74,122, 30,148,212,150,164, 40,182, 82,169,169,112,165,114,161,144,
- 87,165,200,227,114,185, 14,111,255,252,211,138,197,231,131,161, 40,128,166,193,208,116,113,117, 22,191,152,162,223, 24,138, 6,
-163,165, 64,147, 52, 72,133, 10,237,127,252, 81,151,170,232,204,229,139, 78,141,251,126,129, 77,135,142, 29,185,245,234,216,129,
-164,104,124,140, 77,178,121,243,250,121,151,115, 71,119,205, 80, 43, 10,198, 0,168, 85,158, 45,190,129,209,237,157,123, 14, 56,
-188, 10, 10,195,189, 7,143,112,247,190, 63, 0,224,214,131,128, 18,193, 93,109, 83,129, 44,108, 49,103,202, 96,193,250,157,167,
-185,115,166, 12, 97,255,182,243, 12,119,246,228,111,217,235,183,159,226,205,158,252, 45,123,253,142, 83,188,217, 83, 6,179,125,
-183, 29,106, 9,192, 20, 64, 78,101,100,149,181, 17, 65,146,130, 19,209,105,108, 0,200,216,187, 23,218,244,116,216,173, 88, 1,
- 0, 24,231,100,173,179,187,195,194,194,226, 53,151,203,117,168,110, 63,173, 86, 91,173, 8,158, 56,113,162,155, 66,161,120, 77,
-146, 36,195,225,112,124,198, 14,233,115,185, 95, 87,183,172,178,251,132,132, 4,155,175, 91,247,231,224,179,111, 10,152,145,109,
- 12,223,248,109,156,216,214,107,225,145,224, 42, 6,100,150, 74,165, 66, 84, 84, 20,202, 46,242, 94, 6, 84,109,159,157, 0,108,
- 51, 55, 55,239,144,149,149, 53, 14,192,210,252,252,252,150,108, 54, 27,102,102,102, 75,213,106,245, 71, 99, 99,227,131,121,121,
-121, 1,197, 86, 35, 93,151, 12,232,102,100,100,116,236,210,165, 75,166,173, 91,183,102,101,102,102,162,126,253,250,200,206,206,
-110,255,232,209,163, 54, 83,166, 76,153, 82, 80, 80,240, 93,241,195,160,174,104, 98, 96, 96,192, 76,152, 48,129,160,168,191, 78,
-247,208,161, 67,232,235, 74, 54,180, 52, 49,144, 43,213, 76,222,189, 40,227, 31,120, 60,222,147,248,248,248,188,154, 86, 6, 15,
-248,105,194,130, 5,108, 73, 92, 28, 36,193,193, 24,151,159,207,249,173,200,186, 85,173,208, 98,177, 88,142,199, 78,253,225,204,
-231,243, 65,146,100,169, 24, 44,185, 71,105,181, 90,104, 52, 26,104,181, 90, 80, 20, 5,173, 70, 11,223, 53,191,215,250, 94,104,
- 96, 96, 96, 96,107,107,155,102, 96, 96, 96,240, 53, 70, 33,129, 64,192, 57,122,244,232, 24, 62,159, 15, 0, 80,171,213,112,117,
-117, 37,244,227,179, 30,255, 48,177,245,153,149,171, 42,161,213, 63, 63, 63, 31, 20, 69,193,208,208, 16,108,246,167,227,190,185,
-185, 57,122,247,238,141,110,221,186, 97,244,232,209,120,251,246,173,104,244,232,209,189, 43, 35, 27,187,192, 11,117,156,173,139,
- 7, 19,218,246,233,181,160,245,135,126, 61,111,153,154,154,186,160,204,110, 83,166, 79,159, 78,100,101,101, 97,196,136, 17,143,
- 84, 42,213, 32, 0,249,149,113, 82, 52,146, 60, 71,143, 3,205, 16,162, 45, 47, 14, 16,106,165,130, 97,177, 88,138, 18,215, 97,
-109,106,137, 32,136, 17,118,118,118, 56,125,250, 52,212,234,207,211,133, 25, 25, 25, 33, 60, 60,252, 47,171, 26,155,141,142, 29,
- 59,178, 9,130, 24, 1, 96, 94,197,156, 44,135,167,175,226,172, 74,190,123,245,110,206,235,216,134,149,150,146, 38, 99, 0, 16,
-203,150, 45, 43, 21,110, 0,176,106,213, 42, 93,202, 9, 22,151,139, 12,127,255,191,110,196, 28, 22, 88, 60, 2, 4, 23, 96,113,
-138,188,168, 96, 0,134, 2,104, 18,160,181,128,208,182,142, 46,213,208,222,190,174,179,223,186,205,187, 77, 84, 90, 6,167,175,
-220, 67,108,108, 12,216, 44, 22,156, 26, 58,163, 79,247,174,220, 54,237, 58,213,249,125,229,130,171, 41, 9, 31,250, 3,120, 89,
-227,138,166, 25, 97,195,186, 22, 56,120,232, 13, 44, 77, 37, 24, 49,248, 27,136,132, 2,252,182,227, 15,172, 89,226, 13,103, 39,
- 71,236,219,186,182,210,195,141,141,141, 87,187, 56, 55,116,220,125,244, 26, 92,154, 54,101,239, 62,118, 13, 46,205,138,223,155,
-187,176,119, 31,187,134,102,205,155,177,119, 31,187,134,150,205,155,212,123, 45,125,177, 58, 59, 59,219,187,242,250, 44,215, 70,
-125,138,218,136, 91, 72,151, 14, 4,113, 51,102, 0, 64,169,208,170, 9,184, 92,174, 67, 74, 74,138, 85,117,251, 85,103, 53, 40,
-182,100,189, 38, 73, 18,233,233,233, 68,110,110, 46, 99, 98, 98, 50,248,230,190,165,151,250,186,187,101, 3, 64,112,112,176,153,
-175,239,186,193,103, 94,231, 67,241,124, 39,113,226, 79,127,122,220, 32,143,215, 87,214, 79,108,131,226, 37, 33,202, 67,165, 82,
-197,182,106,213,138, 41,254,108, 47, 16, 8,120,229,250,155, 93,163, 70,141, 62,179, 90,235,224, 82,220,246,236,217, 51,239,102,
-205,154,161,105,211,166, 1, 29, 58,116, 48, 18,139,197,184,121,243, 38, 92, 92, 92,154, 27, 25, 25,189, 56,119,238, 28,119,241,
-226,197,110,135, 15, 31, 6,128, 89, 58, 84,103, 47, 79, 79,207,211,126,126,126, 66, 30,143, 7,133, 66,129,240,240,112, 24, 27,
- 27,131,207,231,227,219,111,191,101,119,233,210,197,188,123,247,238, 23, 34, 35, 35,199,160, 6, 51,160,148, 74, 37,179,116,233,
- 82, 24, 24, 24,192,192,192, 0, 98,177, 24, 98,177, 24, 18, 33,136,189,115,234,138,102,239,207, 21,205, 91,177,119,253,177,221,
- 43, 31,212,169, 67,255,146,152,152,152, 91,211,190,160,120,244, 8,146,224, 96,160,204,181,171, 43,140,197,102,240,241,241,169,
-206, 34, 5, 30,143,135,206,157, 59, 87,203,103,102,102,118,145,195,225,124,242,100, 74,146,164,208,199,199,135,138,140,140, 20,
-179, 88, 44, 49, 77,211,240,241,241,161, 72,146, 20, 90, 89, 89, 5,208, 52,157,150,153,153, 57, 84,135,226,170, 0, 44, 98,177,
- 88,219, 4, 2, 1,167, 94,189,122,241,203,151, 47,127, 86,108,205, 4,195, 48,172,122,245,234,181, 23,137, 68,142, 42,149,138,
- 68,145,235, 80,111,205,210,163, 66, 48, 12,211,166,200, 40, 92, 10, 53, 0,126,241,231,172,162,209, 14, 22,229,126, 7,128,204,
-226, 7, 69,235, 74,190,103, 1,120, 11,160, 9, 0,171,226,109,175, 8,130,200,174, 69, 49, 43,183,104,249,249,249,149, 62,194,
-122,121,121,149, 14, 44,134,134,134,120,245,234, 21, 8,130,128,161,161, 33,140,140,140, 96,108,108,140,252,252,124,188,125,251,
- 22,239,222,189, 67, 92, 92, 28, 8,130,128,147,147, 19, 74, 46,160, 50, 40,189,193,157,220,228, 7,161, 68, 0,130, 0, 90,247,
-104,137,150,221, 92,209,238,101,244,156,215,119,137,253, 82,169, 52, 10, 0,199,213,213,117, 74,199,142, 29,177,121,243,102,168,
- 84,170,205,149,136,172, 82,206,199,111,201,182, 0, 96,107,107,187,240,248,205,143, 6,227,251, 53,148, 75,165,210,141,181,168,
-156, 79,110,196,153,153,153, 58,175,197, 71,211, 52,114,114,114,170,228, 44,111, 33,216,178,109,167, 73, 65, 94, 26,126,253,237,
- 56,180, 90, 45, 22, 44, 88, 0,154,166, 75, 95,185,185,185, 58,149,147,161,168,207,109, 7,172, 34,239, 41,193, 1,234,142, 42,
-210, 21, 9,167,119,130, 96, 0,130, 2,240,249,121,149, 31,132,132,108,158,232,204,202,223,182,155, 4,190, 75,194,149,123,129,
-208,228, 39, 67, 26,124,169,200,228,216,121, 12,206,170,216,232,208,178, 33,230, 46,251,221,244,231,185,223,157, 81, 43, 10,154,
-226, 83, 55,226,221,234, 47, 26, 10,191,174, 94,141,253,219, 55,227,247,205,219,145,159,151, 11, 46,215,162,248, 70, 79,129,162,
-168,170,207,157, 97,250,249,204,153, 68,252,182,231, 34,218, 55,179,197,133,155, 47,225,222,202, 17,151,110,191, 70,183, 54,245,
-113,229,110, 32,122,116,104,136,235,254, 97,152, 59,125, 12, 49,230,214,225,126, 53,105,163,173, 91,119,154, 20,228,167,193,111,
-237, 81,164,239,218,133,120,111,111,180, 47,222,231, 37, 65,128,231,224, 0,240,170,111,163,242,136,136,136,128, 74,165,170,232,
-105, 31, 46, 46, 46,213,182,187, 66,161,120, 67,146, 36,147,150,150, 70,164,165,165, 65, 44, 22, 19,225,225, 97, 84,243,230,174,
- 67,152,119,231, 15, 0,128,175,239,186, 33,103,223,228, 67, 30,176, 29,138,103, 59,192,171, 31,194,218,191,106,186,102,218,138,
-125,111,202, 92,163,159,148, 51, 53, 53,181,127,106,106, 42, 0,160, 65,131, 6,239, 34, 35, 35,155,148,184,154,139, 93,136, 60,
-146, 36,157, 75,220,137, 36, 73, 66,165, 82,161, 87,175, 94,236,170,206,221,212,212,180,163,139,139, 11, 2, 3, 3,177,125,251,
-118, 51, 79, 79, 79,124,248,240, 1, 4, 65, 96,221,186,117, 68,179,102,205,184,153,153,153,232,219,183, 47, 46, 94,188,216, 57,
- 63, 63,191,186,250, 52, 20,139,197,135,175, 94,189, 42,100,177, 88, 40, 40, 40, 0, 77,211,232,210,165, 11, 88, 44, 22,194,194,
-194,176,108,217, 50, 92,188,120, 17,151, 47, 95, 22,181,105,211,230,176, 92, 46,119,193,167,110,253,202,218,136, 81, 42,149,140,
- 64, 32,128, 64, 32,128, 80, 40,132, 80, 40, 4,159,207, 71,161, 18,152,182, 37, 94,197, 22, 90,208,205, 91,185, 55,156, 52,123,
- 29,107,227,242,201,247, 1, 92,209,181,207, 3, 69, 49, 89,219,254,248, 99,251,184,188, 60, 22, 0, 28, 36, 8, 90,195, 48,191,
-235,114,189, 3, 64,161, 50, 15,142, 78, 14,184,112,230, 50,134,141, 26, 92,161,200,226,114,121,224,113,185, 48, 50, 19, 87,203,
-201,227,241,172,223,189,123,103,206,229,114,193, 48, 12, 40,138,130, 70,163, 73,251,249,231,159, 45, 7, 12, 24, 96,120,227,198,
- 13,214,128, 1, 3,104, 83, 83, 83,217,203,151, 47,211, 73,146, 52,239,218,181,107, 77,250,252,238,150, 45, 91,182,190,116,233,
-210,100, 31, 31,159,215, 11, 23, 46,252,181,236,198, 13, 27, 54,172,190,126,253,186,227,144, 33, 67,142, 5, 7, 7,239,174,201,
- 61,228, 75,239,243,122,206,255, 62,206,202,180, 72, 49,172, 9,130,240, 43,115,207,246, 42,249,238,227,227,179,212,215,215, 55,
-156, 32, 8,191,178,191,151,236, 87,252,176,232, 87,209,247,226, 99,205,150, 44, 89,226,186,126,253,250,117,157, 58,117, 58, 29,
- 16, 16, 16, 3,160,166, 66,171,234, 24,173,146, 19, 42,123,146,229, 6, 53,228,231,231, 35, 63, 63, 31,137,137,137,216,187,119,
-111,241, 5,205, 5,135,195, 1,135,195, 41,141,103,168, 12,247,252,158,236, 0,176,163,117,235,214,220,208,103,231,110,252,180,
-127,118,207,182,189, 90,179,223,220, 11, 29,142,162,245, 8,251, 79,152, 48,193, 2, 0,142, 30, 61,154, 9,224,198,255,147,106,
- 62, 23, 21, 21, 53,215,214,214,182, 52, 70,165,172,251,144, 36, 73, 8,133, 66,148,196,178, 40,149, 74,236,221,187,151,100, 24,
-230, 92, 21,156,136, 12,191,143,168,240, 7, 69,199,209, 52,104,234,175,227, 87,174, 92, 89, 58, 13, 20, 0,102, 20, 91, 78,170,
- 21,121, 21,213, 57, 83,238,189,220,239, 12, 69, 85,227,158,224,205, 30,254,157,183, 45, 77,112,240,231,253, 32,112,185, 92,208,
-101,172,153, 92,118,209,211,114,248,135, 20,216, 89, 55,199,160, 49,211,109, 46, 29,219, 57,155,212, 40,127,171,105, 93, 55,109,
-217, 9,115,230,206,197,129,253,251,177,108,197,234, 82, 5, 64, 82, 20,200,106,203,201, 98,245,234,226, 10,178, 48, 5,108, 54,
- 27, 61,218, 55, 4,155,205, 70,239, 78,141,193,102,179,209,183, 75, 83,112, 56, 28,244,115,111,134, 70,141, 26,129,195,225,176,
-170,105,119, 68,134,223, 67, 84,248,195, 50,162,151, 1, 3, 64, 35,149,126,182,191, 86, 42, 5, 83,215,188,166,125, 11, 83,166,
- 76,201, 77, 76, 76,212,148,223, 86,167, 78, 29,222,163, 71,143, 76, 42,113,219,149, 66, 36, 18,181,225,112, 56,111,178,179,179,
-105, 3, 3, 3, 22, 77, 83,116,243,230,174,236,155,251,150, 94, 42,217,103,201,146,165,151, 70,182, 49, 26,114,252,156, 31,195,
-171,231, 78, 16, 92, 1,249,253,138,125, 60, 46, 79,212, 6, 80,232,242,240,192, 82,169, 84,120,255,254, 61,170, 43, 15,195, 48,
- 85,186,126,114,114,114, 38,184,184,184, 60,218,177, 99,135, 25, 65, 16,120,252,248, 49,216,108,118,233, 43, 58, 58, 26, 44, 22,
- 11, 63,253,244,147, 38, 63, 63,127,106,117,101,227,112, 56,115, 47, 92,184, 96,204,231,243, 81, 80, 80, 80,122,221,176,217,108,
-188,123,247, 14, 27, 55,110,196,132, 9, 19,144,144,144, 0, 59, 59, 59, 44, 88,176, 64,178,126,253,250,185, 26,141,102,181, 14,
- 77, 20,162, 86,171,219, 26, 24, 24, 64, 40, 20,162, 68,112, 1,192,237,112,110,152, 66,161,104, 97,110, 46,183,177,244,247,251,
-179,179,231, 32, 55,115, 75,219, 78, 82,169,244, 74, 77,250,192, 71, 96,127, 44, 69,253,220,255,210, 37,171,167,151, 46,209,207,
-175, 94, 77, 18, 20, 20,236,211,185, 15,105, 89,136,143, 78, 66,155, 54,109,240,230,205, 27,180,105,211,166,172,104, 2,159,207,
- 7,143,199, 3,143,199,131,133,169, 78, 33, 20, 12,139,197,194,211,167, 79, 65, 81, 20,212,106, 53,212,106, 53,154, 53,107,150,
-253,224,193, 3, 9, 0, 68, 71, 71, 51,227,199,143,207,125,241,226, 5, 90,181,170,122, 61,117,107,107,235, 71,108, 54,187, 94,
-217,223,178,178,178, 76,135, 14, 29,138,156,156,156,111,134, 14, 29,234, 94,124,253, 38,159, 63,127,126, 60, 0,240,249,124,176,
- 88, 44, 10,122,252,235, 81,157, 22, 41, 43,148,202, 11, 46, 95, 95, 95,175,242,191,149, 21, 85, 21,125, 46,123,236,250,245,235,
-215,149,225, 86,212,162,248,213,199,104,249,249,249, 49, 21, 40, 72,157, 81,157,208, 42, 65, 96, 96,160,214,206,206,238, 64, 84,
- 80, 92,207,134, 45,157, 32, 18, 11,250, 0,216, 33, 16, 8,230,127,247,221,119,120,254,252, 57,194,194,194, 14,225, 11,103,225,
-184,186,186,222, 18, 8, 4,142,149,184, 73,226,195,194,194,250, 86, 50, 48,172,184,122,245, 42,170, 10,134,191,127,255,126,217,
- 65,169,108, 48,124,197, 29,131,102,160,213,104, 33,147, 43,254, 26,196,139,133,150, 76, 38,195,168, 81,163, 62,177,104,165,167,
-167, 87,123,126, 4, 65, 96,227,149, 43,184,115,238, 28,190,113,115,195,197,151, 47,177,254,187,177,104,234,104, 15,134, 34,192,
- 16, 64,194,169,157,200,202, 47,196,201,123, 79,145, 93, 32,199,184,174, 93,225,108,100, 81, 53, 47,151,215,187,125,199, 78,188,
-187, 1,111,193,229,114,192, 2, 13, 70, 43,135,157, 75,119,176, 89, 44, 24, 91,215, 7,143,203, 5,151,203, 65,116, 98, 38, 92,
- 92,219,241,253,248,194,222,181, 17, 90,117, 28,235,131,162, 40, 76,152, 48, 1,167, 79,159,134,185,141, 35,140,235,184, 98,205,
-230,253,248,166, 87,215,106,207,191,228, 9,158,195,225,128,205,102,127,246, 94,242, 89, 23,235, 36, 67, 51,208,148,111, 35,154,
- 1, 24, 6, 14,107,215,194, 97,237, 90,188, 44,254,207,102, 50, 25, 20, 10, 5,208,161,121,141, 68,150, 90,173, 70, 98, 98,162,
- 38, 53, 53,213,186,130,237,105,106,181,186, 90, 97,115,228,200,145,144,137, 19, 39,182, 53, 51, 51,123, 29, 18, 28,172,109,233,
-230,198,189,177,119,233,229, 18,183, 33, 0,184,185,185,101, 47, 93,186,244,242,248, 17, 94,131,119,251,140,166,126, 92,125,140,
- 35, 16,137,218,122, 45, 60, 18,114,106,196,136,234,253, 61, 42, 85,108,203,150, 45, 25, 93,206, 75, 46,151,167, 86,177,121, 32,
-128, 85,173, 91,183, 54,242,244,244,196,163, 71,143, 48,108,216, 48,149, 70,163,137, 2,128, 1, 3, 6, 52, 62,121,242, 36,255,
-237,219,183,176,180,180,228,198,199,199, 31, 70, 53, 1,242,124, 62,191,123,187,118,237, 88, 42,149,234, 51,145,181,126,253,122,
-140, 25, 51, 6,141, 27, 55, 6, 77,211, 40, 44, 44,132,167,167, 39,119,251,246,237,221,117, 20, 90,115,154, 54,109,186, 17, 69,
-179, 14,203,222, 11, 35, 80,228,214, 66, 86, 86, 86,106,208,139,123,225, 93,123, 13,109, 91,175,145,171,109, 88,200,155, 42, 9,
-173,172,172,150,176, 88,172,145, 52, 77,179,243,243,243, 19,131,212,234, 70,205, 28, 29,173,187, 12, 30,140, 60, 46,151,189,237,
-222, 61, 86, 90, 65,129, 4,128, 78, 46, 72,165, 86, 6, 71,167,162, 80,191, 97,163, 6,227,205,155, 55, 24, 62,122, 8,120, 60,
- 30, 56, 28,110,209,181,201, 43,178,104,153, 88, 24,233,212, 55,181, 90,109,233, 61,188, 36,206, 75,163,209,160, 36, 52,203,192,
-192,160,116,155, 74,165, 2, 65, 16, 85,245, 13,231,179,171,151, 91,137,140,140, 65,105,181,104, 62,120,120,105,159,126,113,112,
-183, 8, 52, 45,202,141,143,197,172,115, 87,185,208, 67,143, 74,172, 90, 85,105,145,178, 66,233, 75, 65, 16,132,159,143,143,207,
- 82, 0,140,143,143,207,210,146,239,190,190,190, 10, 0,201,181, 20, 91,159, 89,185, 56, 95, 67,100,149,184, 23,170,130,167,167,
-231, 44, 67, 67,195,237, 37,223, 19,159, 39, 35,241,121, 50, 92,154, 52,239,210,218,173,109,222,152, 49, 99, 96,110,110,142,133,
- 11, 23, 50, 0, 14,213,244,255,163, 35,195, 37, 0, 24, 91, 91,219,133,197, 55,100,183,151, 47, 95, 90,190,122,245, 10,237,218,
-181,251,203,116,175,209,192,221,221,189, 42,170,130,226,160,246,121, 95,207, 74, 70, 67,163,209, 64, 46, 87, 64,173,214,128,212,
-210, 32, 73, 18,109,154, 27,226,216,126,159,162,223,200, 18,235, 89,145,213,204,193,198, 16,134, 18,174,150,197, 34, 20,175, 67,
- 82, 43,188, 99,170,213,106,132,196,199, 35, 56, 46, 14, 0, 48,200,183,234,192,215, 99,247, 30,161, 89,179,102,213,149,182,161,
-131,157, 13, 82,238,132, 20,221,188, 21,137,120,245,228, 44, 12, 13, 37, 0,128,230, 30,227,192,227, 21, 9, 45,153, 66, 3,139,
- 38,117, 64, 48, 76,165,105, 1, 12, 76,109,110,113,120, 66, 71,134,162,193, 48, 52, 24,154, 2,195,208, 96,115,121, 6,179,102,
- 76, 6, 77, 83,104,223,190, 61, 8, 54, 27,148, 86,133, 17, 3,123, 35, 39,175, 0,230, 38,186, 13, 18, 60, 30, 15, 30, 30, 30,
-162,202,182,127,248,240, 65, 81, 86,152, 85,221, 70, 90,200,100, 10,168, 84, 42,104,212, 36, 52, 90, 18, 84, 3, 30,126,253,121,
- 44, 72, 13, 9,249,232, 78,208,104, 73,208,115,135, 64,163,214, 34,193,128,197,106,233, 98,161,101,129, 80, 4, 69,100, 24, 85,
- 39,180, 74,196, 65,101,168, 40, 38,176, 18,177, 21, 60,113,226,196, 54, 45,221,220,222,140,236,229,182, 41, 52, 44, 60, 37, 52,
- 44,252,179,253, 28, 27,187,197,254,184,254,244, 2, 46, 79,212,198,107, 97,213,179, 14,203,162,172, 27,241, 11,177,180,160,160,
-160,165, 68, 34, 65,100,100, 36,216,108, 54, 8,130,248, 0,160, 37, 0,216,218,218,126,228,112, 56, 78,108, 54, 27,187,118,237,
- 34, 56, 28, 78,139, 78,157, 58, 45, 85, 42,149,103,171,120,160,115, 49, 52, 52,252,196,154,197,227,241,224,227,227,131,241,227,
-199,151,138, 44, 30,143,135, 35, 71,142,160,109,219,182, 80,171,213, 46, 58,150,247, 21,128,174, 58, 88,252,136, 98,113, 94,173,
- 24, 37, 73,114, 98,214,200,145,141,224,239,143, 46, 78, 78,205,218,180,105, 3,141,230, 47,131,166,147,147, 83,157,130,130,130,
- 84,133, 66,113, 2, 69,169, 13,130,170, 20, 69, 74, 26,241,209, 69,225,167,111,222,188, 65,251,246,237, 75, 45, 88,101,173, 89,
- 60, 30, 15, 34,190,164, 70, 66,139,166,139,238, 75, 5, 5, 5, 44,127,127,127,139,166, 77,155, 18, 0,208,180,105, 83, 34, 40,
- 40,200,204,192,192, 32,179, 97,195,134,213, 62, 0,139,140,140,113,100,226, 40, 0,192, 47,189,250,149, 62, 24,221, 92,181, 20,
- 92, 46, 23, 61, 23, 46,253,172,223,211, 52,205,134, 30,122,145,165,131, 22,249, 90, 34,171,188, 69,203,215,215, 55,220,215,215,
-247, 51,235, 88, 13, 81,189, 69,171,172,233,174,166, 40,185, 88, 43,195,230,205,155,209,162, 69,139, 42, 7,162,237,219,183,227,
-248,241,227,155, 1, 68,215,216,228,216,179,117,115,108,185, 20,238,212,184, 57, 1, 0,171,231, 14,100,201,100, 50, 60,125,250,
- 20,198,198,198,248,240, 65,231,180, 95,134,198,198,198,171, 88, 44,214, 8,118,249, 25, 0, 21, 11, 76,138,166,233,115,121,121,
-121,149,166,119, 96, 24, 64,163, 37, 33,147, 43,161, 86,171, 49,247,167,157,213, 22,194, 23, 32, 52,234, 2,142, 71,183, 78,162,
-202, 44, 58,237, 91,116,199,204,239, 36,159, 13,222,108, 22,192, 98, 1,173,218, 23, 89, 92,130, 94,134,131,166, 1,138, 6, 44,
-172, 76,113,232,212,166, 42, 69, 62, 73,209,197, 79,199, 20, 10, 85, 20, 92, 58,122, 33, 41,194,191,212,130,196,231, 21,185,140,
-121, 92, 46,104,134, 40,202,250, 80,153, 16,226,139, 28,115,164,209,206,251,253, 66, 49,205,171, 5,206,223, 13,193,240, 94, 45,
-241,224,197, 91,120,118,104,134,240,168, 56, 52,119,174,135, 93,135,207,129, 97, 80,176,103,203,154,212,191, 6, 52, 50, 94, 23,
-139,214,243,231,207, 21,229,173, 88,101,223,153,234,199, 67, 48,204, 95, 22, 45,133, 82,133,133, 75,116, 74,231, 83,212, 70, 93,
- 59,138,116,217,185, 42,139,149, 46, 66,172,188,101, 11,213,164,103,105, 0,160, 45,176,248,255,243,198, 73, 81, 20,174, 93,187,
- 86,218, 30, 21,181, 99,217,182,211, 65,228, 32, 62, 62, 30,225,225,225,232,216,177, 35,242,242,242,192,101,177,176, 32, 52, 20,
-205,190,251, 14,106, 30, 15, 52, 77,131,207,231, 99,250,244,233, 58,215,103, 13,239,206,197,193,220, 84,117,228,155, 58,117,234,
-212, 40, 82, 38, 67,248,187,119,232,181,114, 37, 0,224,250,245,235,159,244,137,249,243,231,243,223,190,125, 59,229,245,235,215,
- 83, 82, 82, 82, 54, 3, 88, 80,233,125,150, 81,149,198,104,141, 28, 59, 12,141,154, 54,192,241, 63, 78,149,110,159,191,104, 14,
-184, 92, 30,184, 60, 46, 76,140, 77,116, 58, 27,173, 86, 91, 42, 90,229,114, 57,235,250,245,235, 14,189,123,247,230,205,153, 51,
-135, 0,128,227,199,143,179,118,236,216, 33,190,115,231, 14,207,222,222, 94, 90,173,184,212,104, 62,107, 99,130, 32,192,229,114,
-193,227,243, 0,154, 6, 65, 16,226, 13, 27, 54,172, 14, 15, 15,111,215,180,105, 83,168, 84,170,239, 80, 52, 81, 67,159, 71, 75,
- 47,182,170,212, 34, 21,197, 90, 21, 91,165, 42, 67, 70,217,184,173,202,132, 90,217,152, 45,212,110, 82,134,110, 49, 90, 21,129,
-205,102, 87,107,173, 98,177, 88,213,186, 14,231,207,159, 15, 67, 67,195,202, 6, 32, 38, 52, 52,244,173, 84, 42,221, 15, 96,103,
-173, 26,231, 94, 96,248,170,121, 67, 10, 80,236, 91, 53, 49, 49,201,236,209,163, 71, 33, 0,205,217,179,159, 62, 32,171, 84,170,
- 74, 7,112, 99, 99,227, 85, 7, 15, 30,156, 61,120,240, 96, 86,249, 20, 3,101,221,123, 37, 47,173, 86,139,179,103,207,206, 94,
-188,120, 49,242,242,242,230, 85, 53,136,203,101, 10, 40,138, 3,161, 63,134,157,215,245,166, 94,233, 38,137,137, 45, 28, 26,180,
-172,116, 48, 97,241,138, 98,136,172,235,254, 53,128, 25, 26, 10, 65, 85,193, 73, 16,172,232,184,132, 20,251, 58, 54,102,248,152,
-152, 1,235,122, 45,144,147,252, 87, 61,112, 56,108,112,139, 93,135, 38, 70, 98,100,164,167,131,197, 98, 87, 41,140,215,156, 12,
-196,139,176, 56, 92,184, 27, 4,141, 82,134, 45, 71,111, 66,163, 42,132, 70, 41,131, 70, 89,244,190,110,241,247, 32, 8,164,106,
- 85,178,198, 53,105,119, 14,135,131, 14, 29, 58, 84, 42,116,146,147,147,117,180,104, 49,165, 22, 45,133,178,134,109,164,219,147,
- 83,149, 22,171,146,237,181, 21, 6, 37, 41, 31, 68, 34, 81,219, 35, 71, 42, 79,227, 80, 17,108,108,108,110, 72, 36,146,250,186,
-238, 95,131,228,165,235, 76, 76, 76, 86, 53,109,218,212,101,203,150, 45, 92, 54,155,141,158, 61,123, 54,182,177,177,137, 7,128,
-230,205,155,219,149,220, 99,126,252,241, 71,230,249,243,231, 97, 69,207, 24,149,131,207,231,191, 51, 54, 54,110,235,233,233,137,
-188,188, 60, 36, 38, 38, 66, 44, 22,163,217,166, 77, 8,253,241, 71,184,237,221, 11, 86,143, 30, 32, 8, 2,124, 62, 31,161,161,
-161, 16,137, 68,239,148,202, 74, 83,190,117, 0,240, 59,128, 46,248,203, 93,200, 0,120,138,162,180, 11, 47, 42,184,223,177, 0,
-128,162,233,234, 26,107,236,194,133, 11,145,203,229, 2, 3, 6,128, 23, 29, 13,141, 70,131,142, 29, 59,150, 90,217, 59,118,236,
- 8, 14,135,131,150, 45, 91,194,206,206, 14,187,118,237, 26, 91,149,208, 82, 22,106, 16, 31,157,132, 78,157, 58,149, 90,174, 6,
- 12, 24, 80,106,209,226,114,185,165,150, 45,130,170, 94,184, 18, 4,193,148,125, 72,166, 40,138,224,112, 56,156,121,243,230, 17,
-195,134, 13, 99,212,106, 53,205,231,243, 89, 23, 46, 92, 32, 30, 60,120,192,145,201,100,213, 62,136,187, 14, 25,129, 95,122,247,
- 47,186,246,235, 91,130,203,227,130,207,227, 97,225,187,164,210,118, 49, 58,114,154,191,126,253,250,225, 77,155, 54, 45,114,195,
- 3, 28,125, 30, 45, 61,170, 49,244,100,148, 19, 73,234, 50,223, 51, 0, 16,197,223, 51,202, 8,170, 12,130, 32, 94, 49, 12,211,
-174,220,190, 37,219,213,229,222, 75,182, 7,215,162,248, 37,107, 29,126, 38,190,170,122, 34,142,122,246,236,153,115,155, 54,109,
-144,144,144,240,217, 76,184,146,129, 75, 44, 22, 67, 36, 18, 33, 32, 32, 0, 0,162, 42, 35,123,240,224,193, 14, 20,101, 93, 46,
- 42,145,173,109, 39,207,145,221, 3,218,247,107,135,147,190,167,242,164, 82,105, 75,252,149, 67,135,176,179,179, 27,207,229,115,
- 70, 57,185,214,245, 0, 77,255,126,239,234,211,149, 85,157,161, 83,227,230,133, 0, 20, 37,179, 14,107, 57,251, 16, 44, 22,107,
-196,224,193,131, 89,111,223,190,197,168, 81,163,112,252,248,241, 74,247, 29, 63,126, 60, 78,159, 62,141,193,131, 7,179,150, 44,
- 89, 82,105,122,135, 79,173, 37,234,175,214, 41, 35, 63, 4,227,216,233,131,149,198, 32, 89, 89, 21,197, 99,165,167,103,150,254,
-214,174, 77,213,158, 17,154, 84,223, 9,124,253,178, 83,231,110, 61,121,137,105,185,160, 73, 21,148, 5,127, 29, 47,207, 77, 3,
- 67, 42,193, 51, 48,131,141,133, 49,222, 60,187,173,214,168,149,119,170,226,156, 61,184, 57,126, 28,232, 2, 48, 52,134, 44, 56,
- 4,191,157,179, 74,159,160,221,135,205,193,189,179,219,116,142,241, 43, 15, 46,151,139,208,208, 80, 69,101,214, 44, 54,155,173,
- 75, 78,174, 98,171,163, 22,114,185, 2,114,133,242,107,222, 59, 44,173,173,173,247,152,154,154, 10, 43, 17, 82,150,150,150,150,
-123,204,205,205,133,186,186, 14, 43, 19, 89,197,121,181, 94, 79,156, 56,177, 70, 98, 75, 32, 16,212,143,138,138, 42, 77, 86, 90,
-213,187, 90,173,134,167,167,167,174,201, 75,175, 2,136,177,181,181,125,218,172, 89, 51,227,143, 31, 63,226,212,169, 83, 60, 46,
-151, 91,183,228,254, 81, 80, 80, 0, 54,155,141,244,244,116, 45,128,201,168,198,117,166, 82,169,252,253,253,253, 91, 13, 28, 56,
-144,253,238,221, 59,176,217,236,162,114,117,234, 4,183,189,123, 17, 54,111, 30, 60,226,226,160,212,104, 32, 20, 10,113,235,214,
- 45,141, 92, 46,247,175,140, 79, 36, 18,237,143,141,141,109, 46, 20, 10,161,209,104, 64,211, 52, 88, 44, 22,193,225,112,220, 77,
- 76, 76,182, 3,104, 87,174,177,172,220,218,121, 54,161, 72,146,146, 38,124,204,168,174, 2,178,178,178,112,245,234, 85,116,236,
-216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134, 13, 27, 86,111,209, 99,
-105,209,176, 73,125,240,120,188, 34, 11, 17,151, 87,252,224,195, 45,181,100,241,184, 60,112, 57, 92, 8, 69, 66,157, 45, 90, 4,
- 65,128,197, 98,129, 32, 8,136, 68,162,146,135,108,218,193,193, 65,154,157,157,109, 11,128, 45, 18,137, 64, 81,148, 78, 15, 45,
- 37, 99, 68,137,200,226,241,121,165,150, 45, 0,200,205,205, 85, 14, 30, 60,248,132, 74,165,154,132,218,173, 80,162,199,191, 12,
- 4, 65,188,250,255, 56,182, 6, 24, 80, 44,172, 62, 11,138,175,170,131,127,211,185,115,231,189, 99,198,140,233,185,117,235, 86,
- 72, 36, 18, 72,165,210,210, 1,145,207,231,163, 78,157, 58,200,206,206,198,190,125,251,144,148,148,116, 31,192,116, 93, 75, 36,
-149, 74,159,127, 8,138,202,242, 28,222,217,188,121,231, 38, 38,137, 81, 73, 29,165, 82,105, 64,177,200, 58, 52,102,254, 55,147,
- 60,135,182, 7,143,207, 69,226,135, 84,220,187,250,244, 63,210,152,108, 54,155, 77, 16, 4, 70,141, 26,165,211,254,163, 71,143,
-134,191,191, 63,170,114, 51,210, 37, 22, 45,185, 18, 50,197,215,123, 88,155, 57,107, 60,102,206, 26, 95, 42, 38,116,113,189, 0,
-128,157,221,153, 42,132,150,102,171,223,153,125,211, 90,183,239,228,216,182,121,125,188,120, 29,132,147,123,255, 50, 50, 28,222,
-177, 26,191, 29,190,143, 58,214,166,208,168,100,184,113,254, 64,170, 70, 37,223, 90, 75,163, 92,145,184, 37, 8, 48, 12, 93,163,
-115, 47, 17, 79, 92, 46, 23,174,174,174,149, 90,180,178,179,179, 21,213, 13, 12,165,109,164,214,162, 80,166,128, 66,254,213,132,
-150,155,187,187,251,157,115,231,206,153, 91, 89, 89, 33, 37, 37,165,188,208,114,235,210,165,203,157,115,231,206,153, 91, 91, 91,
- 35, 49, 49, 81,231,180, 34, 21,136, 44,100,100,100, 16, 57, 57, 57,180,169,169,105,141,196, 22,139,197,130, 74,165, 66, 68, 68,
-132,174,127,171,243, 12, 49, 99, 99,227, 35,167, 79,159, 54,206,204,204, 4,155,205, 70, 68, 68,196, 39,179, 14, 75, 94,135, 14,
- 29,226, 13, 25, 50,228, 96,110,110,110,149,211,218, 72,146,220, 60,126,252,248, 41,201,201,201,166, 86, 86, 86,144, 74,165,224,
-243,249, 96, 24, 6,132,167, 39,186,198,196, 64, 67, 81, 16,137, 68,136,140,140,196,254,253,251,101,197,169, 98, 42, 52,144, 17,
- 4,225,204,227,241, 48,110,220,184, 79, 54, 28, 61,122, 20,131,218,178,219, 90, 26,115, 10, 73, 8, 85,105,162,254, 55,216,108,
- 54,225,214,161, 71,227, 14,221, 6,184,190, 15,123,241, 49, 35, 45,169,186,155,146, 86,173, 86,163,105,211,166,120,245,234, 21,
-238,222,189,139, 30, 61,122,192,195,195, 3, 33, 33, 33,184,125,251, 54, 2, 3, 3, 65, 16, 4,204,205,205, 75,194, 47,170,140,
-193, 80,203, 73,164,167,100,125,102,189, 42,255,157,199,227, 65,165,208,232,212, 70,239,222,189,195,171, 87,175, 74, 83,203,176,
-217,108,242,187,239,190, 3,195, 48, 76,108,108, 44, 12, 13, 13,153,137, 19, 39, 82, 28, 14,135, 76, 78,214, 45, 62,184, 68, 84,
-149,136, 44, 14,143,251,137, 64,163,105,186, 32, 36, 36,100, 26,128,144, 98, 75, 22,160,207,163,165,199,255, 54,174,225,243,133,
-165,171,181,104,197, 0,232,117,234,212,169,177,151, 47, 95,222,188,125,251,118, 75, 47, 47, 47,228,228,228,192,209,209, 17,182,
-182,182,240,243,243,195,245,235,215, 51, 41,138, 90, 0,160, 34,211, 79, 47, 84,145,179, 38,249,163,244,156,170,176,240,199, 54,
- 30, 46,184,127,246,177,175,141,141,205,116, 54,155, 61,119,226,210,111, 39,117, 31,220, 14,145,129,177,120,126, 59, 20,105, 9,
-153,213,114,150, 15,134, 55, 49, 49,153, 98, 96, 96,192, 7,160,169,224,169,184,252,172,195, 82, 78,138,162, 40,181, 90,141, 51,
-103,206,232, 36,182, 78,157, 58, 5,165, 82, 9,234,115,255,106, 41, 39, 67, 51, 4,135, 43,128, 93,157,166,208,104,100,160,233,
- 90, 79,168, 44,229, 44,121, 2,253,200,231,195, 42, 51, 19, 47, 94,188,208, 77,114, 15, 24, 80, 93, 27, 41,213,202,130,113,219,
-214, 46,244,243,246,249,221,164, 71,231, 86,248,101,211, 81,104, 52,135,193, 98,179, 32, 18,240,208,166,125, 23,176,161,194,158,
-245,139,114,229,249, 57,227,240,249, 82, 60,159,112, 50, 85,121, 88, 24,128,162,105,220,125,244, 82,231,115, 47, 29,237, 41, 10,
- 28, 14, 7, 31, 62,124, 80, 84, 52,219,144,205, 46,114,115,150, 60,169, 87,197,201,208, 52,193,229, 9, 81,199,177, 25,212,170,
-194,175,210, 70, 86, 86, 86,139, 46, 93,186,100, 94,146, 42, 33, 36, 36, 4, 4, 65, 68,252,101,113, 44,218,174, 80, 40, 16, 22,
- 22,134,144,144, 16,160,104,134,155,206,215, 81,137, 37, 43, 35, 35,131,144, 74,165, 48, 48, 48, 96,133,132,132,168, 90,182,108,
-249,186,154,235,187,148, 83,169, 84,198, 85, 22, 63,169, 84, 42,237,133, 66, 33,183,220, 32,106,215,168, 81,163,200, 10, 92,136,
-159,149, 51, 47, 47,239,197,226,197,139,219,244,235,215, 15,139, 22, 45,202, 54, 53, 53, 53,220,179,103, 15,135,205,102, 19,222,
-222,222, 84,122,122,122,225,129, 3, 7,140, 47, 95,190,140,220,220,220, 0, 29,206,189, 64,169, 84, 78,235,220,185,243,209,155,
- 55,111, 26, 56, 59, 59, 35, 63, 63, 31, 12,195,224,200,145, 35,240,246,246,134, 80, 40, 68,100,100, 36, 6, 13, 26, 36,151,203,
-229,211,240,121,236,100, 9, 39, 65, 16, 4, 67,211, 52,150, 47, 95, 94,154,156,180, 36, 89,169,161,136,192,254,249, 13,196,115,
- 14,228,137,199,254,114,224, 59, 0,160, 72,146,122, 31,246,226,227,145,157,191, 60,224,241,120,143,170,105,163,101,115,230,204,
-217, 51, 96,192, 0,145, 68, 34, 65,118,118, 54,158, 62,125,138,103,207,158,225,249,243,231, 80,171,213, 48, 55, 55,135,169,169,
- 41,164, 82, 41,222,189,123,167, 0,176,172, 42, 78,190, 1, 23, 78,141, 75,102,254, 22, 89,176,184,101,102, 27,150,181,110,241,
-184, 92,157,174,163,110,221,186,161, 67,135, 14, 37, 2,136,138,143,143,151,170, 84, 42,162,140,232, 79, 46, 17,228,117,235,214,
- 37,143, 31, 63,206, 84,197,249,124,255, 46,220,252,117, 25,248, 60, 30, 22, 68, 36,150,138,174,163, 61, 90,131,203,231,193,101,
-224,176,178,199,238, 70,145,187, 16,229, 68, 86, 85, 99,199, 23, 95,155,122,206,255, 90,206,255,101, 72, 81,139, 37,120, 74,112,
- 82,169, 84,222,248,254,251,239,215,187,185,185,125,191,101,203, 22,130,199,227, 97,229,202,149, 76, 74, 74,202, 31,197, 79, 33,
- 57,181, 41, 21,195, 48,127, 60,188, 24, 48, 99,130,207, 96, 98,254,214,137,238,175,239,133,189,107,209,217, 25, 45, 58, 59,227,
-245,253,183,216,185,244,212,113, 74, 75, 45, 79, 77, 77, 77,168,134, 74,213,171, 75,147,242,193,240,230,254, 15,238,153,215,116,
-214, 33, 77,211,231, 78,157, 58, 53,123,232,208,161,172,151, 47, 95,126, 22,147, 85,178,236, 14, 77,211,184,115,231, 14, 52, 26,
- 13,254,248,227, 15,154,166,233,202,243,104,129,185,178,109,235,250, 9,127, 28,187,194,231,243, 8, 60,123,116, 1,121, 57, 85,
-207,234,226,241,184, 56,116,228,162,134,199,227,190,175,104,187, 70,163, 73,188,119,239,158,117, 95,138,226,178, 88,172,138, 4,
- 84,133, 56,119,238,156,150,166,233,248,106,118, 11, 72, 75, 74, 24,184,102,209,228, 83, 3, 70,126,111,221,185,179, 59,215,194,
-202, 26, 4, 65, 32, 61, 45, 29,145, 97, 47,181, 55, 46, 28, 76,147,201,117, 91,130,103,242,198,135,165, 49, 89, 0,224,229,189,
-189, 52, 62, 11, 0, 6, 78, 92, 12,207,142,205, 65,232, 98,122,250, 75,100,209, 36, 73, 66, 44, 22,131, 36,201, 10, 83, 60, 24,
- 27, 27,139,148, 74,165,162, 56, 17, 99,149,166, 34, 6,248,234,109, 68, 81,148, 75, 78, 78, 14,100, 50, 25,158, 61,123,198,172,
- 93,187, 54, 35, 35, 35,163, 52,104, 83,171,213,186,100,103,103,163,176,176, 16, 1, 1, 1,204,250,245,235, 51,178,178,178,150,
-214,228, 26, 18,137, 68,109, 57, 28,206,235,156,156, 28,218,192,192,128,165,213,106,181, 45, 91,182, 20,136, 68, 34,157, 23, 84,
-151, 74,165,253, 42,219,230,228,228, 20, 21, 21, 21,213,136,162,168,178,107, 32,242,148, 74,165,115,231,206,157,117,185,127,204,
- 57,124,248, 48, 46, 94,188,216, 62, 63, 63,127,124,124,124,252, 81, 0,237, 57, 28, 14,130,130,130, 34,148, 74,229,152,161, 67,
-135, 30,201,201,201,121,129,162, 37,120,116,193,205,200,200,200,113, 46, 46, 46,135, 87,173, 90, 37,241,240,240,224,216,217,217,
-161, 93,187,118,136,140,140,196,181,107,215,180,187,119,239,150,201,229,242,201, 0,238, 84,221,236, 32, 72,146, 4,159,207, 47,
-125, 9, 4, 2,240,120, 60, 20, 40, 24, 76,221, 20,173, 32, 33, 82,108, 94, 57,237, 26, 3, 16,169,137,209,153,233,169,137, 47,
- 8,130,120, 36,149, 74,243, 42,169, 51,190, 82,169,108,197, 48, 12,155, 32,136,173, 26,141,102,226,172, 89,179,108,215,173, 91,
-135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,200,192,203,151, 47, 41,185, 92,190, 23,192,106, 20,199,143, 84,
-134,220,204,124, 56,216,212,253,196,242,201, 48, 12, 24, 10,208,170, 40, 80, 26, 6,106, 66, 11, 46, 87, 11, 30,143,167,139,229,
-137,161,105, 26, 57,182,182,160,195,194,240,252,249,115, 48, 12, 83,169, 85,173,105,211,166, 58,220,216,105,240, 5,252, 79,220,
-133, 4, 65,128,199,231,131,203,231, 85, 52,115, 70,111,197,210,227, 31, 13, 93,125,227,185, 0,166, 7, 7, 7, 31,237,222,189,
-187, 31,195, 48, 92, 20,249, 35, 31,127,201,159,167,166,166,190, 9,184,246,102,137,181,131,233,250,254,227,221,209,164,149, 35,
- 40,146,194,211,235, 65,248, 99,221,229,211,201,137,201, 19,161,195,218,103, 52, 77, 63,232,210,182, 9, 11,101,114,117,219,217,
-217,209,181,153,117,152,151,151,183, 98,193,130, 5, 88,180,104, 81,109,102, 29, 86,136,208,119, 25,211, 9, 48, 14, 3,251,119,
-237, 11,130,197,168,213,170, 42,110,124, 40,205, 92,202,227,113,223,191, 10,145,182,172,104,191,140,140,140,190,147, 38, 77,186,
-195,225,112,234,215,164,206,105,154,142, 79, 75, 75,235, 89,253,158,228, 83,149, 34,223,249,234,233,125,243,110, 94, 60,220,151,
-166,169,134, 4, 0, 54,135,247, 81,171,209,220, 82, 41,242,183, 64,199, 69,165, 55, 76,239,132, 57,219,110, 99,215,162,129,152,
-181,254, 44, 14, 46,159,138, 37,155, 78,225,247, 69,115,176,118,251, 9,252, 50,103, 28,134,143,157, 68, 51, 4,235,137,174,231,
-193,102,179,111,238,219,183,111,194,212,169, 83, 75, 39, 45, 48, 12,243,201,141, 93,171,213, 42,104,154,198,222,189,123,105, 0,
- 55,171,226,251,180,141, 8,166,170,120, 41, 93,219, 40, 63, 63,127,114,167, 78,157,142, 0, 16, 48, 12,243, 33, 39, 39,231, 7,
-224,175,165,161, 10, 11, 11, 39,119,238,220,249, 8,195, 48, 2,130, 32, 62,219,174, 11,138, 83, 61,180, 53, 53, 53,125, 93,108,
-201, 18,212, 38, 32,190,170,170,174,194,173,168,139, 11,145, 6, 48,171, 76,198,247,117,237,219,183, 47,187,168,116, 68, 78, 78,
- 78,219, 90,148,235,142, 66,161,104,190,124,249,242,121, 66,161,208, 83, 46,151, 55, 6, 0,177, 88, 28,169, 82,169, 30, 40, 20,
-138, 45,168, 62, 55,149,154,166,233, 72,146, 36, 93, 45, 45, 45,139,102,212, 22,139, 45, 0,248,243, 53,245, 26,160,218, 21, 25,
-197, 79,234, 92,176,235,215,175,215, 51, 53, 53,237, 67, 16,196,112,134, 97,154, 22, 20, 20,168,150, 47, 95, 30,112,238,220,185,
-188,250,245,235,247, 31, 48, 96, 0, 97,102,102,134, 87,175, 94, 49, 89, 89, 89, 23, 0, 44,133, 14, 51,173,105,154,142,223,176,
- 97, 3,106,122,189, 87,181, 93,163,209,164, 94,191,126,221,162, 95,122, 58,135,166,105, 12, 28, 56,240, 19, 1, 87, 30,239,223,
-191,135, 74,165,170, 50,153,163, 42, 47, 7, 61,230, 45, 6,138,103,127,150,160,200,146,197,128, 81,235,117,149, 30,255, 46,252,
-221, 11,122,234,100, 90,180,181,181, 29, 37, 20, 11,102, 58, 54,182,109,153, 18,157,254,182, 32, 79,126, 92, 42,149,238,171,228,
- 70,174, 19,103, 13, 19,150,234,205,191,127, 19,231, 95,121,180, 40, 48, 12, 5,134,102,192, 48, 52,104,154, 42, 90,240,154,161,
-193, 80, 20, 65, 16,120,162, 86, 84,153, 25,188,124, 57, 77, 45, 44, 44, 86, 51, 12,211,143,205,102,179,202, 26,195,202,126, 46,
-182,100,221,204,200,200,248,165, 2,203,235,255, 92,125,158, 59,119,174, 66,241,175,235,172,195, 17, 35, 70, 80, 53,188, 54, 31,
-136,197, 98,219,138,182,201,100,178, 4,169, 84,218,231,191,164, 62,203,206, 24,172, 9,103,141,103, 29, 86,199,233,232,232, 40,
-208,104, 52,173, 1, 56, 19, 4, 97, 2, 32, 91,163,209,220,202,204,204, 76, 3,208, 22,192,242,226, 99,126, 5,240,250,255,249,
-122, 23, 89, 88, 88, 28,102,177, 88, 14,186, 28, 76,146,164, 58, 59, 59,123, 66,185, 7,130, 82, 78,115,115,243,215, 28, 14,199,
- 65, 7,158,164,172,172,172,182,250,251,167,158,243, 31,132,242, 65,240,211, 24,134,217,255,159,248,227, 94,122, 78, 61,167,158,
- 83,207,169,231,212,115,234, 57,245,156,255, 2,161,133,114, 66, 11, 12,195,232,167,213,234,161,135, 30,122,232,161,135, 30,122,
-124, 33,174,149, 19, 91,215, 74, 62, 16, 85,168,210,154,152, 4,107,163,108,239,234, 57,245,156,122, 78, 61,167,158, 83,207,169,
-231,252,215,113,254, 43,240,183,172, 76,241,149, 26, 72,207,169,231,212,115,234, 57,245,156,122, 78, 61,231,191,143,243,127, 25,
-149,186, 14, 89,250,186,209, 67, 15, 61,244,208, 67, 15, 61,244,248,123,160,179,208, 18, 91, 55,117,177,112,108,121,196,212,161,
- 69,136,169, 67,139, 16, 11,199,150, 71,196,214, 77, 93,254,165,245, 38, 2, 48,150,195,225,220,177,177,177,201, 71, 37, 75,239,
-252, 3, 96, 4, 96, 56,138,242,251, 12, 1, 96,240, 53,201, 61, 0,206, 40, 96,230,119, 64,194,119, 64,194, 40, 96,166,199, 63,
-112, 57,142,149,179,109, 59, 61,186, 49,246,198,202,217,182,157, 42,220,190,192,214,252,249,237, 17,219,214,205,180, 51,251, 74,
-127,105,104,101,101,181,223,218,218, 58,206,202,202, 42,222,202,202,234, 48, 0, 99,253,237, 78, 15, 61,244,208,227,111, 67, 73,
-140, 86,201,171, 52, 70,139, 3, 0,126,126,126, 30, 0, 30, 2,232,238,229,229,229, 95,254,104,211,186,174, 83, 27, 54,104,184,
-104,205,202,165,132,141,149,133, 1, 73,209,154,216,184,196,102, 43,214,172, 63,159,194,231,108,206, 73, 8, 59, 88,139, 66, 17,
-108, 54,123,148, 64, 32,240, 2, 80, 34,216, 34, 84, 42,149, 31, 69, 81,103,160,219, 52,109, 88, 91, 91, 63, 98,179,217,245,106,
-242,199, 20, 69, 37,164,165,165,185,215,178, 50, 71,212,173, 91,247,176,135,135,135, 65,251,246,237,193,231,243,177,124,249,242,
- 5, 82,169,116,139,174, 4,166,166, 78,134, 26,129,112, 46,135,207,239,205,104,213,174, 12, 24,128, 37, 8,163, 73,213, 61,158,
- 74,181, 57, 39, 39,186, 64, 71,170,165, 0, 38, 22,215,213, 65, 0, 27,190,164,151, 76,104, 5,173,150, 42,234, 19, 60, 14,168,
- 43, 49,198, 15,151, 45, 91,198,241,242,242,194,193,131, 7,221,247,239,223, 63,173,160,160,224, 30,128, 63, 1,124,252,210, 94,
-105, 13, 76,239,236,238,190,109,194,130, 5,108,197,163, 71,216,118,248,240, 86, 20,229, 91,218, 85,211,190,196,227, 97,184,133,
- 5,215,139, 97,208,154, 0, 8, 2, 8,202,200,162,175,107, 52,212, 25,232,144,139,173, 10,140,197,167,211,241, 79,214,148, 32,
-239, 35,243,179, 96,160, 75,215,188,143, 15,126, 6,208,191,252,118, 82, 41,156,192,176,235,120, 41,152,192, 68, 0,155,190,176,
- 90, 13, 44, 45, 45, 67,174, 92,185,226,208,190,125,123, 14, 0,188,126,253,250, 59, 47, 47,175, 30, 25, 25, 25,174, 0,242,255,
-159,110, 66, 66, 14,139, 53,147,207,229,246,166, 40,170, 5, 0,176,217,236, 80,181, 86,123,135,164,233, 93,208, 49, 39,155, 30,
-122,232,241,207, 69,117, 90,228,191, 28,149,102,134, 47, 57, 57,166,236,123, 89,136,173,154, 52,235,216,115,216,251,188, 2,185,
- 50, 46, 46, 57,103,254,204,181,119,166,205,217,120,121,211, 1,191,235,254, 47, 34,158,187,180,239,243, 86,108,213,164, 89, 37,
-212,149,249,112,235,138, 68,162, 55,187,119,239,214, 68, 70, 70, 50,185,185,185,204,251,247,239,153, 11, 23, 46, 48, 51,102,204,
- 80,138, 68,162, 55, 0,234,234,194,105,109,109,157,246,254,254,109, 38, 41, 36,144,137,127,253,130,209,106,181,140, 70,163, 97,
- 52, 26, 13,243,246,166, 31, 19,242,231, 69, 38,232,194, 25, 70,173, 86, 51,106,181,154, 81,169, 84, 76,131, 6, 13, 82,116, 44,
-103,121,216, 53,111,222, 92,237,231,231,199,156, 63,127,158, 89,176, 96, 1,227,230,230, 70, 1,240,214,245,220,197, 86,206,158,
-134,246, 45, 51,166,250,236,210, 92, 11,184,197,132,199, 4, 49,225, 49, 81,204,185,187, 17,204,196,133,219, 53,134,246,110, 25,
- 98, 43,103,207,234,206,221,212,212,180, 35, 65, 16, 76, 9, 0, 48,245,234,213, 43, 44,251,170, 91,183,238, 39,175, 58,117,234,
- 20,214,175, 95,255,163,185,185,121,235,138, 56,199,180, 0,195,188, 61,201, 48,111, 79, 50,203,186,129, 9, 15, 15,127,206, 48,
-204,195,146,151, 66,161,120,120,233,210,165,135,223,126,251,237, 67, 0,131,170,168, 39,157,234,243, 59, 32,161,224,202, 21,134,
-217,178,133, 97, 60, 60,152, 8,128,249, 14, 72,168, 33,103, 3, 27, 27,110,208,198, 13,211,212, 87,174,252,193,220,184,113,141,
-185,126,221,143,185,124,233, 48,179,117,203, 76,141,181, 53, 55, 12, 64,163, 26,112,114, 0,172, 5,176, 25, 69,150,203,200,140,
-140, 12, 38, 53, 53,149, 1, 16, 89,252,219,102, 75, 75,203, 77,168,216,250,214,171,172, 37,107, 94, 63,155, 27, 35,251,187, 51,
- 5,121, 41,204,200,254,238,204,188,126, 54,159, 88,182,250, 57, 57, 25,206, 26,216, 34, 35,252,245,113,106,214,192, 22, 25,253,
-156,156, 12,107, 89,159, 4,138,214, 9,221,125,255,254,125,146, 41, 3,173, 86,203, 28, 61,122,148, 50, 53, 53,253,163, 6,156,
-141, 45, 45, 45,227,205,204,204, 34,203,254,104,217,114, 72,231,166, 93,191, 91, 97,222,236, 91,143, 26,148,179,189,144,199, 75,
-186,115,118, 15,149,149, 16,202,168, 21,105, 76,222,135, 64, 38, 41,226, 57,115,116,223,102, 45,159,195, 73, 2,208,254, 75,250,
- 82, 13,161,231,212,115,234, 57,255, 11, 57,171,210, 34,255,139,248, 44,189, 67,101, 39, 38, 16,240,125, 86, 44, 91, 76,228,102,
-229, 42,148,249, 5,106,173, 82,169,100,241, 24,101,232,219,152,116, 22,135,157, 59,111,206,108, 67,159, 37,203,124,100,192, 56,
- 29,255,187,174,155,155,219,203,139, 23, 47, 90,153,153,153, 33, 47, 47, 15, 89, 89, 89,120,249,242, 37, 24,134,193,208,161, 67,
- 5, 29,218,181,107,253,243,242,229,207,146,146,147, 59,161,242,129,247, 47,241, 98,102,129, 13,238, 69,107,209,254, 18,151, 85,
- 52,234, 16, 4,246,143,240, 42,221,103,117, 82, 94,209, 99,181, 80, 88,186, 32,113, 45,208,169,103,207,158, 60, 0,152, 50,101,
- 74,126, 65, 65,129,111,177,133, 67,167,149, 86,197, 86,206,158, 22,182,118,126,123,246,110, 16,181,104,232, 12,141,150, 68,124,
-106, 10, 56, 92, 19, 56, 56,240, 48,105, 92,111,110,183,206,102, 22,107,127,221,127, 45,149,198, 16,121,102,212,173,202,184, 76,
- 76, 76,142,158, 57,115, 6,103,207,158, 5, 0, 68, 70, 70,194,217,217, 89, 92, 93, 25,194,194,194,156, 6, 13, 26,116, 58, 43,
- 43,171, 81,117,251,150, 79,140, 47, 16, 8,224,238,238,142,102,205,154,225,202,149, 43,221,139, 45, 91, 95, 4,197,163, 71,144,
- 4, 7, 3,254,181,122,120,105,208,166,141,227,243,235,215,142, 91, 92,187, 30,129, 77,155, 14,227,227,199, 34, 67,155,147,147,
- 19,198,142, 25,193, 13, 13, 13,104, 62,124,248,216,128,199,143, 63,186, 23, 11,165,234,176,234,192,129, 3, 75,235,215,175,143,
-225,195,135,143,104,222,188,185,141,145,145, 17,246,237,219, 7, 91, 91, 91, 39,181, 90,253,225,202,149, 43,118,169,169,169,152,
- 61,123, 54,210,210,210, 22, 84, 70,212,189,111,247,159, 5, 3, 93,186, 54,105, 51, 1, 18, 35, 91, 28, 56,117, 6,239,223, 28,
-237,170,210, 68,252,204,163,252,199, 43, 24,193,196,140, 4,137, 79,189,182, 30,230,141,154, 15,130, 99,155, 64, 11, 37,245, 56,
-230,231,222, 13,214,115,132,202,163, 43, 55, 73,179, 62, 35, 29,126,142,237,154,255,206, 44,236, 14,178,128,149,116,137,192, 42,
-181,214, 50, 24,212,173, 91,183,210,134,139,139,139,131, 74,165,130,139,139, 11, 75,173, 86,123,234, 88,175,141,251,244,233,243,
-228,250,245,235,230,141, 27, 55,206,200,206,206, 46,221, 96, 99,110,210,215,255,226,214,217,107,183,157,104,122,140, 33,114, 51,
- 34, 46,135, 86,195,213,190, 75,199, 54,119,111, 92, 60, 46, 33, 10, 19,193, 55,201, 4,232, 44, 68,159, 62, 4,194,192, 12,163,
-102,204,231,120,246,236, 97,223,187,255,176,187,239,163, 62,246, 4,240, 74,255, 92,175,135, 30,255,106,171, 22,243, 79, 59,167,
- 82,161,229,229,229, 69, 84,116,130, 52, 67,183,180,182, 50, 23,109,221,120,228, 21, 91,163, 86,139, 77,140,213, 92, 99, 35,154,
- 48, 52,102,107,212,218, 66, 71, 39, 71, 62,205,208, 45, 43,225, 47, 63,197,147, 16,137, 68, 23,255,252,243, 79, 43, 46,151, 11,
-154,166, 97,105,105,137,216,216, 88,228,230,230,162,160,160, 0, 31, 35, 34, 80,191,110, 29,172,244, 89,108, 59,123,177,207, 69,
-185, 92,222, 22,159,186, 17, 63,155, 54, 74,105, 63, 93, 55,186,100, 9,150,207, 30,249,139,127,171, 96,155,174, 83, 81, 99, 19,
- 18, 18, 32,145, 72,224,234,234, 42,121,250,244,233,227, 42, 68,214, 39,156,166,166, 78,134,180,128,127,118,247,158,229, 34,141,
- 54, 12,111,163,179,209,164,126, 87, 88,155,215, 69, 74,182, 26,207, 95,254,137,176,144,147,104,104, 95, 23,222, 51,122, 8,215,
-111, 56,127,134, 71,214,175,155,155, 27,155, 95, 17,103,126,126,190,164, 65,131, 6,168, 91,183,104,221, 51,138,162,240,246,237,
- 91, 80, 20, 85,250,189,236,251,145, 11,247, 65,230,199, 99,194,119,223, 33, 43, 43, 75, 82, 17, 39,151, 13,114,254,180,177, 28,
- 17, 23,224,139,205,212,133,133,133,165,211, 83, 53, 26, 13,130,130,130,208,169, 83, 39,143,115,231,206, 85,167,138,116,170, 79,
- 13,240,251,182, 63,254,216, 62, 46, 47,143, 5, 0, 7, 9,130,214, 48,204,239,186,246, 37, 43, 43,238,133,155, 55,142, 89,176,
- 89,239, 96,102,252, 27, 94,190,140,135, 70, 83, 84,222,172,172,116,204,154,153, 15, 30,215, 16, 87,174,156, 48,119,113,113,191,
-144,154,170,113,197,167,110,196,138,202, 41,188,113,227, 6,102,205,154,133,183,111,223,218,177,217,108,188,120,241, 2, 34,145,
- 8, 27, 55,110,100,187,184,184,216,137,197, 98,220,188,121, 19,105,105,105, 68, 85,229,124,120,235,225,154,188,143, 15,126, 78,
- 37,110,246, 59,112,234, 12,190, 31, 51, 10, 54, 76,244, 99,227,134,196,154, 62, 3,187,252,194,176,235,120,137, 13, 91,154, 58,
-187, 14, 4,143, 47,129,247, 79,171, 17, 25,118,213, 84, 94, 16, 50,147,160, 18,235,172,220,116,110,206,103,229, 60, 63,130,154,
-114,242,105,155, 59,117, 95, 57, 6, 7, 77,123, 33, 13,220, 31,242,151,208,114,226, 16, 44,202,184,228, 73,234,195,135, 15,248,
-248,241, 35, 56, 28, 14, 20, 10, 5, 72,146,172,176,156,118,118,118,211, 73,146,252,165,184,157,143, 8,133,194,201,199,143, 31,
- 55, 47, 43,180, 45, 91, 14,233,108,110, 40,238,153,150,158,149, 19,240, 42,252,253,252,233,195,187, 63,122, 30,150,168,225,126,
-155,144, 23,114, 37,175,146,250, 20,138,248,252, 11, 55, 47,157,144,104, 99,238, 67,236,210, 29, 92,137, 51, 40,109, 50,228, 57,
- 50, 20,124,148, 66,181,103, 39, 90,205,156,135,171,151,207, 75,154,183,104,123, 78,165,213, 58, 3, 80,215,226,218,172, 9,244,
-156,122, 78, 61,231,127, 39,103,165, 90,132, 97,152, 54, 0,172,139,191,102, 21,235, 2, 11, 0,153, 40, 90, 69,198,186,248,222,
-193, 47,115, 88,249,239,101,247, 45,255,189,236,231,172,226,207, 86,197,239,175, 8,130,200,174,166,232,182, 40, 90,154,240, 90,
-241, 59, 80,236, 74,172, 54,240,152, 32, 88,249, 20, 69, 11,120,150, 86,202, 41, 35,123,182,184,125,247,117,144,129,133, 17,167,
-111,247,214, 30, 47, 67, 99,158, 17, 44, 66, 75, 16, 44,157,226, 62,216,108,246,168,173, 91,183,182, 48, 50, 50, 2, 77,211, 48,
- 54, 54, 70, 70, 70, 6,212,106, 53,242,242,242,160, 42,200,135,166, 32, 31,193,137,113,232,226,209, 29,195,250,245,113, 57,113,
-249,207, 81, 20, 69,157,174,138,215,174,101,235, 82, 75,214,234,122,230,127,153, 38, 18,115, 75, 69,215,111,173,157,193,147, 72,
-208,123,190,207,151,244,129,192,107,215,174,221, 24, 58,116,104,255,133, 11, 23,178,164, 82,233,205,216,216,216, 46, 0,222, 86,
- 43, 42, 4,194,185, 63,206,245, 50, 53,149, 48, 56,119,231, 79,116,107, 61, 6, 6,124, 54,178,242, 53, 32, 8, 32, 34,252, 34,
- 8,194, 12, 33,145, 82,116,109,101,132, 62,125, 93, 36,151,207, 71, 44,196, 95,241, 65,159, 53, 77, 78, 78, 14,210,211,211,161,
-213,106,161,213,106, 49,124,196, 8, 28, 59,122, 20, 50,153, 12, 10,133, 2,106,181, 26, 20, 69,129,197, 98,225,142,223, 57, 36,
-198, 68,160,115,167, 78, 64, 37, 75, 47, 29, 13, 2, 23,192,243,247,239,223, 35, 34, 34, 2, 73, 73, 73, 16, 10,133,176,177,177,
-193,234,213,171,161, 82, 21,173, 81, 54, 98,196, 8, 15, 0,161, 95,122, 65,125, 4,246,199, 82,212,207,253, 47, 93,178,122,122,
-233, 18,253,252,234,213, 36, 65, 65,193, 62, 93,142,229,241, 48,124,195,239, 51,154,136,197, 98, 36, 37,108, 69,211,166, 60, 44,
-152,103, 14,223,223, 50, 1, 0,179,103, 57,160, 93, 91, 11,228,231,158,135,133,213, 82,108,223, 62,167,225,196,137,155,191,147,
-203,169, 35,213, 80,255,252,231,159,127, 14,115,118,118,182, 15, 12, 12, 36,248,124, 62, 68, 34, 17, 68, 34, 17,132, 66, 33,210,
-211,211, 17, 27, 27,203,108,216,176, 33, 25,192,207, 85, 17,173,220, 46,125, 6,160,255,188,126,184,241,254,205,209,174,246,236,
-152,224, 97,222,238,113, 33,207, 3, 11,110,223,121,250, 43,169, 20, 38,230, 38,221, 93,220,160, 93,160,197,204, 69,171,176,115,
-195, 10,188,127,241, 40,219,186,110,254, 46, 17,161,170,176,156, 30, 30, 43, 57,182,214,102,228,244,137,195, 76,174, 90, 7, 76,
-191,206, 33, 50, 82, 51,223,108, 68,108,160, 66,208,168,245,248,198, 78, 44,245,253,251,247, 69,221,186,117,131, 82,169, 44,181,
- 76, 30, 63,126,156, 38, 73,242, 65,133,125, 83,163,249, 37, 57, 57,217, 86,161, 80,160, 95,191,126,179, 55,110,220, 40, 46, 89,
-163,142,162,168, 79, 44, 89,107,182, 28,187, 53,247,151, 93, 15,110,157,254,205,110,141,207,228,238,227,188,215, 62, 64, 37,235,
- 72,114, 88,172,153, 87, 47, 29,182, 17,154,106, 33, 50,235, 3,101,154, 2,239,247,127, 15,121,190, 18,237,214,172, 2,192,135,
- 90,203,194,190,129,195,193, 53,183,195,138,169,147,237,150,237, 59, 48,131,166,233,173,250,231,122, 61,244,208,163, 28,172, 9,
-130,240, 3, 0, 31, 31,159,165,190,190,190,225, 4, 65,248, 49, 12,227, 85,108, 64,241, 99, 24,198,171,100,159, 98,113,246,217,
-247,146,125,203,127, 47,255,121,201,146, 37,205,215,175, 95,191,174, 83,167, 78,167, 3, 2, 2, 98, 0, 84, 39,180, 6, 20, 11,
-171,242, 75,241, 20,205, 58,244,242,242, 34,202,190,127, 98,209,162,233, 71, 31, 98,226,228,125,122,117,112,240,243, 15,125, 53,
-105,210,128,158,163, 6,118,235, 27,155,144, 21,209,208,209,198, 34, 60, 60,212,136,166,233, 71,186,212,146, 64, 32,240,234,209,
-163, 7, 39, 39, 39, 7, 6, 6, 6,200,200,200, 64,114,114, 50, 52, 26, 13,148,121,185, 80,229,229, 66,153,155, 3, 77, 94, 14,
- 62,190,126,137,150, 13,157, 4,197,193,242, 85,162,196,234, 82,222, 82, 85,214,178,197, 55, 52,132,192,208, 16, 68,205,221,134,
-223,154,152,152, 60, 47, 25, 84, 53, 26,205,204,197,139, 23,103,210, 52,141,181,107,215, 26, 73, 36,146,115, 0, 4,213,145, 24,
- 90,178,189, 58,181,114,101,189,139, 13,129,187,219, 4, 52,110,240, 13, 98,211, 20,200, 44,208, 32, 61, 87,131,118,221,118,160,
-158,219, 42,212,105,229,139,136,248,108,216,217, 59,179,192, 17, 84,185,248,115, 98, 98,226, 39,223, 79,159, 58, 5,185, 92,142,
-134, 13, 27, 98,204,152, 49, 88,188,120, 49,198,140, 25, 3, 59, 59, 59,140, 27, 57, 8, 43, 86,172, 64,106,106,106,117, 69, 85,
- 53,110,220, 88,229,232,232,168,114,116,116, 84,105, 52, 26, 20, 22, 22, 34, 55, 55,183,124,125,207,169,105, 69, 90, 89, 89, 45,
-177,177,177, 9,177,178,178, 10, 23, 8, 4,215,131, 8,226,157,210,209,209,186,203,224,193, 68,179,145, 35,217,241, 34, 17,225,
- 15, 72,116,225,178, 48,227, 14,240,236,209,159,159,155,115,184,212, 72, 53,121,146, 37,158,248, 55,199,211,199,109, 49,107,102,
- 67, 16, 44, 33, 8, 22, 31,114,217,125,116,104,223,137,103, 98, 66, 84,215,151,198, 2, 8,234,210,165,139,157,183,183, 55, 33,
- 16, 8, 48,123,246,108,205,212,169, 83,163,198,140, 25, 19,117,239,222, 61,202,209,209, 17,117,234,212, 33,234,212,169, 99, 11,
- 32,168,248,152, 42, 97,212,144, 88,163,210, 68, 60, 54,113, 22,199, 80,176,232, 92,168, 21, 12, 95,185, 73,154,181,102,119,204,
-166,216,247,114,167,247, 47, 30,101, 69,133, 93,165, 99, 95, 61,204, 76,137, 42,112, 90,179, 59,102,211,210, 93, 41, 21, 94,212,
-254,254,160, 47,250,249,107,228, 50, 57,103,240, 64, 79,249,244, 41,163, 26,155, 73,154, 31,135,125, 31,183,122,117, 29,198,173,
- 88,183, 93, 51,117,198, 92,205,193, 67,135,153,130,130, 2,228,231,231, 99,251,246,237,228,213,171, 87,147, 41,138,154, 91,217,
- 51, 16, 0,104,181, 90, 76,159, 62, 93,108,100,100,132,196,196,196, 82,139, 40, 0, 72, 51,178, 66,159,190, 10,123, 55,255,135,
- 17, 30, 50,149, 74,117,235,225,235,136,102,206,142, 14, 4,193, 84, 58, 17,133,207,229,246,110,219,161, 3,155, 97,114, 65,112,
-234,226,227,209, 13,200, 79,205, 70,126,122, 54,216, 92, 49, 72, 8,160,165,249, 48,105,217, 30,145,175, 2, 97,111,105,205, 17,
-112,185,125,245,227,137, 30,122,252, 59, 81,149, 22, 41, 43,150,214,175, 95,191,174,170,237,101,222,213,229,190,151, 10,169,242,
- 34,172,236,103, 0, 88,191,126,253, 58,134, 97,188, 2, 2, 2, 78, 1, 80,232,120, 10,211,202,188, 79,251, 68,104, 85,105,133,
- 82,170,125, 23, 46,254, 25,166,198, 34,227,246,173,157,109,174,220,244,127,253, 40,224,117, 68,189, 58, 22,150,140, 86,109,250,
-251,230,157, 14,132, 92,177, 94,199, 66,184, 88, 88, 88, 64,163,209,224,195,135, 15, 72, 74, 74,130, 70,163, 1, 41,147, 65,149,
-155, 11,101, 78, 14, 40, 89, 1,120, 20, 5, 69, 70, 58,204, 13,132,192, 95, 51, 18,171,177,188, 17, 21, 10,173,146,119,161,145,
- 17, 4,134, 70, 96,113,185, 21,186, 21, 43, 65,155,246,237,219,159, 13, 11, 11,235,208,171, 87,175, 95, 81, 52, 69, 62, 62, 57,
- 57,185,231,242,229,203, 85,214,214,214,152, 62,125,122, 19, 0, 19,170, 21,153,124,181,139,163, 77, 19, 52,118,154,128,122,117,
-122, 32, 87,166, 69, 70,190, 22,233,185, 26,236,219,209, 9, 23, 14,182,199,147, 11, 93, 17,118,171, 55,114,181, 54,144,216,125,
- 11,134, 82, 55,175,138,243,206,157, 59, 88,189,122, 53,126,253,245, 87,172, 93,187, 22,191,254,250, 43,146,147,147,225,234,234,
-138,132,132, 4,220,184,113, 3, 82,169, 20, 22, 22, 22,120,249,242, 37,182,108,217,130, 39, 79,158, 84,123,210,186,100,179, 45,
-222,167, 70,190,116,146, 36, 39, 74, 7, 15,110,145,102,102,214,172,117,235,214,253,103,207,158,237,212,165, 75,151,210,237, 78,
- 78, 78,117, 69, 34, 81, 42,138,102, 80,182,170,138,139, 6, 90, 91, 90,186, 66,173,122, 87,220,198, 92, 16,132, 16, 61,122, 71,
-160, 75,215,215,208,104,121, 96, 17, 2,176, 88, 66,144,100, 22, 76, 77,237,192, 48,132,107, 53, 69, 92,158,145,145,225,124,247,
-238, 93, 86,108,108, 44,132, 66, 33, 0,196,173, 92,185,114,231,166, 77,155,222,154,155,155, 83,126,126,126,184,124,249, 50,188,
-188,188,216, 83,167, 78,117,174, 83,167,206,222,234,206,123,229,118,233,179,147,155,111,140,230,106, 77, 91, 9, 69,245,234, 67,
- 38,249,246, 71, 15, 11, 49, 0,220,140,142, 46,176,170,155,191, 94, 86, 16,146, 96,226, 80,248,219,205,232,234,102,156,174,164,
-223, 68,189,123,126,242,210,205,188,244,180, 28,110,235, 22,205, 21,190,171, 23,241,234,213,111,244,251,138,197, 63,216, 36,231,
- 11,115,123,207,190,241,238,226,205,151,133,227, 39,125, 79, 78,153,230,173,188,113,243,206, 37,154,166, 91,160,146, 25,135, 52,
- 77, 67, 42,149, 34, 60, 60, 28,209,209,209,200,200,200, 64,102,102, 38, 10, 10, 10, 74,221,141, 6, 5,249,215,118,254,113, 53,
- 88, 44, 18, 25,116,104,225, 92,247, 69,224,219,116,177, 72,100,224, 92,191,110, 99, 96,101,133,247, 17,138,162, 90, 8, 13, 68,
- 0, 8,228,134, 61, 66, 97, 78, 33, 10,115, 11, 81,144, 93, 8,149,134, 13,165,138, 5,133,154, 5, 71,143, 62, 40,148, 41, 81,
-152,149, 7,154,162,220,244,195,141, 30,122,232, 81,197, 88,239,231,227,227,179, 84,199,125,117,118,111,150, 23, 94, 62, 62, 62,
- 75, 9,130,240, 91,178,100, 73,115, 84, 62,161,170, 44,246, 87,240, 2,160, 67,122,135,172,172,168, 66, 67,194,101,232,188,159,
-126,185,113,234,208, 14, 43,149, 74,158, 96,110, 42,161, 36, 6,124,139, 41,211,215,162,160, 48,103,136, 76,247,116, 4,200,201,
-201, 65, 76, 76, 12, 68, 34, 17,120, 92, 46, 40,133, 2,148, 66, 6, 69, 78, 22, 88, 26, 21,120, 20, 5, 51, 3, 17, 28,237,108,
- 80,207,218, 70, 39,206, 15,247,111,151, 6,190,151,117, 23,110,104,239, 2,190, 88, 2,190,161, 4, 63,250, 61, 4, 0,240,120,
- 60, 96,249,175, 58, 25, 77,236,237,237,255, 60,121,242, 36, 47, 35, 35, 3, 65, 65, 65,193, 0,242, 0, 24, 2,160, 35, 34, 34,
-238,134,133,133,121, 57, 59, 59, 3, 64,195,234,200,242, 51, 89,148,150,100,144,152, 26,135,216,164, 64,152, 25, 55, 0,215,160,
- 49,210,115, 53, 16,136, 26, 64,171,250,203,251,168,204,143,135, 66,195,214,233,220,213,106, 53, 72,146, 4, 73,146, 80,171,213,
-152, 54,109, 26,158, 6, 4,224,244,229,123,136,249, 24,137, 38,245,109,240,221,119,227,209,190,125,123, 4, 4, 4, 84,201, 53,
-161, 21,180,246, 18,112, 54,247,103,129, 47, 49, 87,117, 92,124,235, 69,117, 98,139, 32, 8, 6,149,184, 34,203, 97, 83,167, 78,
-157, 26, 69,202,100, 8,127,247, 14,189, 86,174, 4, 0, 92,191,126,253,147,115,153, 63,127, 62,255,237,219,183, 83, 94,191,126,
- 61, 37, 37, 37,101, 51,128,138,131,205, 25,224,218,181,103,248,225,135,183,200,200,200, 0, 0,156, 57,245,151, 46,141,141,209,
-160,223,128, 34,143,150,137,137, 9, 54,111,118,213,169, 62, 41,138,194,254,253,251, 75,221,133, 0,192,225,112,186,204,159, 63,
-127,104, 69,251, 55,106,212,136, 87, 29,231,188,225,246,194, 39,193,204, 76,227, 70,245,154, 27, 89,180, 68,150, 54,208, 53, 48,
- 89, 58,107,222,112,251,173, 91,206, 39, 43, 69,132,234, 8, 65, 37,214,225, 8,149, 71,117, 41, 99,244,205, 29,234, 44,199,137,
- 71, 83, 51,242,151,121,127, 63,214,220,200,196, 74,118,112,167,175, 41,139,205, 98,254,124,173,201,109,238,100,110,242,109,199,
-109,133, 63,204, 91, 30,168, 38, 19,189,145,248,103, 36,170, 72,113, 65, 81, 20, 82, 82, 82,144,145,145,129,132,132, 4,100,102,
- 22,185, 95, 51, 51, 51, 65,211,244,151,220, 16,161, 72, 72, 64,252,165,131,168, 55,126, 60,218,253,186, 26, 20,205,129, 66, 78,
- 97,115,231,158,200,201, 83, 64, 69, 19,176,107,211, 25,223, 95,127, 12, 22, 67, 1,251,118,233, 71, 18, 61,244,248,151, 66,151,
-244, 14, 37,130,200,215,215,215,235,107,255,127, 89,177,229,235,235, 27,238,235,235, 91,147,255, 42,239, 50, 44,253, 94, 18,163,
-245,176, 76, 0,218,103,131,102, 65,102, 68,244,219,183,156, 20,153, 66,102, 96,109,101,169, 50, 16, 10,232,188,252, 2,118, 96,
-104,176, 70,150,250,241,125, 13,206, 35, 34, 44, 44,204, 53, 37, 37, 5, 9,241,241, 32, 21, 50,176, 84,106, 48, 74, 57,122,185,
-119,134, 16,128,144, 69,128, 71,107,192, 97,243, 81, 80,152, 15, 0, 17,213, 14,142, 90,237,103,150, 45,130, 32,192, 55, 52, 4,
- 95, 44, 6, 95, 98,248,137,133, 75, 23,139,141, 64, 32, 56,121,238,220, 57, 91,123,123,123,172, 94,189, 26, 14, 14, 14, 77,237,
-236,236,228,198,198,198, 34,107,107,107, 52,107,214, 12,157, 59,119,198,141, 27, 55, 0, 29,114, 74,105, 73, 97,200,251, 56,116,
-201,204, 14,192,227,135,123,160, 86,168,208,218, 99, 15, 52,156,122,176,108,190, 10,244,135,227,144,167, 94, 41,178, 30,216, 12,
- 68, 82, 66, 28, 8, 54, 63, 92, 87,203, 83,201,231,224,224, 96,156,186,226, 15, 91, 71, 23, 36, 68,189,195,187, 7,119,241,212,
-210, 28,142, 46,205, 74,221, 64,149,150,145, 2,103,205,174,162, 52, 81, 63,207, 28, 43,200,206,206, 22,152,153,153,169, 74,234,
-206,214,214,246, 75,196,214,216,133, 11, 23, 34,151,203, 5, 6, 12, 0, 47, 58, 26, 26,141, 6, 29, 59,118, 68,187,118,237, 0,
- 0, 29, 59,118, 4,135,195, 65,203,150, 45, 97,103,103,135, 93,187,118,141,173, 76,104,177, 8, 4,145,100, 86, 83, 39, 39,167,
- 82,161,117,244, 88, 6, 2, 95,247, 6, 1, 62,182,239,252, 80,186,111,221,186,117,145, 42,141, 6, 65, 48, 97,213,148,241, 87,
- 27, 27,155,229,182,182,182, 78,155, 54,109, 98, 11,133, 66,204,152, 49,163, 65, 97, 97, 97,189, 98, 83, 50,150, 44, 89, 2, 0,
- 88,177, 98, 5, 86,174, 92, 9,149, 74, 37,175,140,236,232,230, 22,118,233,217,244, 20,166,208, 96,136,167, 69,189, 22, 61,250,
-246, 66, 3,231, 30,232,209, 55, 1, 0,214,153,113,226, 70,254,190,204,228,146,137, 33,113,248,246,205, 59, 43,220, 61,122, 44,
- 91, 92,248, 96,205,111,251,115,171,141,121,204,139, 63, 82,240,158, 63,106,203,142,189,199,182,252,178,100,142, 48, 33, 67,157,
-147,156,195, 20, 74, 4, 28, 73, 67,107, 66, 50,235,167, 95, 99, 82, 82,162, 23, 32,241,102,181, 51, 45,105,154, 70,116,116,116,
-105, 76,159, 82,169,132, 76, 38, 67, 98, 98, 98,105,159, 81,136,141,250,121, 79, 26,232, 38, 83, 40,228, 47, 66,163, 18,126,158,
- 61,174,147, 76,161,144, 71,197, 38, 68, 2,219, 43, 84, 99, 44, 22, 43, 84, 94, 32,239, 37,207, 85, 34, 35,232, 61, 28,122, 58,
- 66, 75, 18, 80,147, 20, 50,178, 10,160, 34, 1,138,197, 69,243,145,223,129, 34, 56,200, 76, 73, 6,139,205, 14,198,167, 65,251,
-122,232,161,199,191, 7, 85,106,145, 18,139, 86,167, 78,157, 78,151,181, 58,149,124, 6,160, 66,213,161, 60, 25,101,197, 84,137,
- 59,177,178,255, 41,199,171, 43, 62,139,209,170, 54,189, 67,201,127,214, 49,206,183,219,176, 98,156, 3, 77,146, 77,210, 51,211,
- 72, 14, 71,192,173, 99,172,144,102, 39,232,254,239, 42,149,202,239,238,221,187,131,123,247,238, 45,136, 10, 13,134, 58, 47, 15,
-234,188, 92,112,105, 18,102,162,182, 96,105, 84, 32,212,106,216, 55,165,161, 44, 16,193,255,105,152, 86,165, 82,249,233, 42,180,
- 88,108,246,167,113, 89, 18, 9, 4,134, 70, 16, 72, 36,229, 93,139,213,137, 2,131, 62,125,250,244,236,216,177, 35, 24,134,193,
-254,253,251,161,209,104,248, 26,141, 6,106,181, 26, 26,141, 6,249,249,249, 56,118,236, 24,118,239,222,253, 20,192, 31,213, 14,
-102,164,250,238,173, 59,247,219, 79, 30,231,197,189,238,183, 25,164,154,130,130,112,128, 76,166, 69,161,218, 0,148,249,120, 32,
-237, 26,216, 28, 33, 58,181,108,128, 43,231, 47,106, 64,170,238,233,168,194, 63,177, 10, 37, 38,196, 33,233, 99, 36, 36,249,169,
-176, 52, 50,128, 60, 58, 18,173,191,155, 80, 43,235, 68,157, 58,117, 64,211, 52, 60, 61, 61, 75,131,171,107, 43,182,178,178,178,
-112,245,234, 85,116,236,216, 17, 30, 30, 30, 72, 78, 78, 70,116,116, 52,190,249,230,155,210,125,130,131,131, 17, 24, 24,136,134,
- 13,171, 54, 18,102,102,107,175, 39, 37, 6,141,248,246,219,111,121,207,159, 63, 7,195, 48,112,118, 54,130,145,161, 24, 4, 75,
- 0, 23, 23, 43, 0, 69,207, 0,221,187,119, 71,126,126, 52,153,147,195, 92,175,230,116, 79, 2,184,172, 86,171, 63,116,235,214,
-205,238,227,199,143,152, 55,111, 30,231,204,153, 51, 37,166,100,248,248,124, 58,153, 66,161,168,220,117,223,164, 69,211, 69, 13,
- 72, 83, 15,161,168, 94,125, 35,139,150,104,224,220, 3, 0,208,219,107, 50, 26, 52,170,139,252,204,144,250, 74, 69,220, 16, 30,
- 39,199, 52,100,123,242, 91,209, 0,215, 73,202,244,135, 81, 40,114,157, 86,219,236,138,168, 51,105, 9,220,241,103, 47,255,121,
- 99,250, 55, 94,131,184, 90,138, 36, 93, 29,185, 38,231, 46, 93, 75, 79,142, 79,216,134,132,155, 97,127,217,255,170,180,226, 81,
-249,249,249, 16,139,197, 8, 11, 11, 83, 13, 24, 48, 64,192, 98,177,240,225,195,135, 82,161,101,101, 97,214,172, 75, 59,215,166,
-107,182, 28,187, 37, 22, 8, 4,125,187,183,117,121, 27, 21,159,196, 48, 68, 92,165,214, 86,173,246, 78,104, 80,176,167,165, 93,
- 35,118,244,195,231, 48,239,250, 13, 84, 42, 22, 20,106, 26, 42, 18, 32,217, 60,216,182,234, 0,147,134, 46, 96, 0,188,122,254,
- 84,171,210,106,111,233,199, 26, 61,244,248, 87, 91,181,152,170, 68, 82,241,231,108, 0,113,190,190,190,153,101,172, 77, 25, 0,
-130, 1,184, 21,239,151, 81,238,184, 12,130, 32, 94, 49, 12,211,174, 12, 79, 70, 25,193, 85,246,179,186,220, 62,193, 53, 16, 89,
-101,223, 63, 21, 90,149, 77,169, 4, 0, 11, 11, 11,171,214,173,219, 54, 60,112,232, 44, 24,134,193,251,192,141,200, 73,127,135,
-229,235,158, 53,180,183,183,247, 72, 78, 78,246,215,165, 4, 20, 69,157, 57,124,248,240,130, 14,109, 90,183,174,239,224,128,224,
-184, 88,240, 24, 10, 60,138, 2, 75,163, 2,135, 82,195,193,149, 2,139,144, 32, 37, 37, 15,235, 79,158, 13, 43,206, 18, 95, 37,
-154,126, 51, 8,171,147,242, 64, 16, 4, 54,117,114, 5,223, 80, 2,158, 88,130, 31,255,188, 95, 42,174,252, 86, 47, 1, 95, 34,
- 65,195, 14, 58, 37,132,151, 63,120,240,224,117,104,104,104, 59, 87, 87, 87, 44, 88,176, 0,113,113,113,160,105, 26,105,105,105,
- 74,169, 84,154,156,145,145, 17, 7,224, 18,128, 3,208, 33,243, 56, 79,165,220,234,119,225,168,119, 39,119, 15,139,111,135,236,
-198,229,243,243,145,155,151, 15, 57, 41,130, 76, 73, 66,166, 98,195,204,188, 5, 58,180,108,137,148,228,116,132, 63,191, 85,200,
- 81,201, 55,214,164,131, 18, 4,129,192,192, 64, 56,217, 25, 34,242,177, 63, 44, 12,184,112,179,179,129, 93, 23,247,210,252, 82,
- 85,129,203, 6, 57,118,236,216,210,204,240,125,250,244,137, 29, 63,126,188,237,252,249,243,113,232,208, 33, 60,125,250,244,179,
- 0,109, 15, 15, 15, 60,122,244,104, 21,128, 21,213, 25,245,212,106, 53,154, 54,109,138, 87,175, 94,225,238,221,187,232,209,163,
- 7, 60, 60, 60, 16, 18, 18,130,219,183,111, 35, 48, 48, 16, 4, 65,192,220,220, 28,218, 34,241,172,173,140, 76,163,193,185,223,
-126, 63,188,116,203,150,221,205,199,141, 27,135, 11, 23, 78, 99,242,164, 38, 32, 88, 2, 16,132, 0,131, 6, 54,193,234, 95, 95,
-161, 67,135,238,176,176,224, 98,203,230, 43, 49, 10, 5,117, 76,135,106, 92,115,251,246,109, 59,165, 82,137,220,220, 92, 70, 34,
-145, 16, 89, 89, 69, 51, 90, 43,178,104,201,229,114, 97,101, 68,161,111, 34, 54,230, 22, 48, 57, 76, 97,224,144,108, 50,176, 69,
-143,190,137,232,237, 53, 9,119,252,254,192,253, 91,119, 97,198,137,139,133,184,224, 70,102,108,102,190, 84,230,188,215,165,205,
- 84,118,146,236,214,222, 89,131, 34,217,182,182,244,185, 37,123,242,115,171, 18, 90, 0,136,236,183,199,255,188,196, 96, 80,231,
- 78, 29, 26,185,214,181,229,231,100,166, 51,231,175,220, 8,211,196, 94,184, 90, 70, 96, 49,213, 8,245,213, 62, 62, 62,191, 20,
-127, 62,242,243,207, 63, 79, 93,191,126,189,101,106,106,106,105,140, 86,122,102,246,253,206, 3,102, 81, 89,185,121,234,195, 91,
-126, 26, 46, 18, 10,248, 63,175, 63,252, 80,203,198,243,202,120, 73,154,222, 53,114,222,242, 57, 81,239, 3,237,235,137,248,184,
-242,211, 10, 4,223,126, 0, 45,139,135, 31,238,190,128, 74, 67, 33, 55, 51, 11,247,166,204,132,196,218, 20,187, 31, 94, 72,163,
-105,122,143,126,168,209, 67,143,127, 47, 42,211, 34, 4, 65, 84,148, 99, 47,173,130,223, 94, 85,117, 92, 37, 60, 95, 3,149,102,
-133,215,105, 10, 94,102,102,102,250,163, 71, 47,240,208,111, 13,252,253,214, 32, 60, 48, 24, 41,201,106, 36,167, 41, 97,100,100,
-244,172,138, 67,203,103,142,101,228,114,249,208,159,151,255,146, 42, 20, 25,160, 91,207,158,176,177,180,130, 1,143, 11, 54, 73,
-131, 77,112, 81,152, 97,130,200, 16, 57, 22, 31, 62,158, 94, 40,151, 15,173, 96,144,232, 85,153,200, 32, 8, 2, 2, 35, 67,240,
- 37,134, 16, 24, 26,125,226, 70, 20, 26, 25, 65,104,104, 4, 14,159, 95, 81, 48,252,103,156,133,133,133,195,134, 15, 31,158,147,
-151,151,135,169, 83,167,194,223,223, 63,240,214,173, 91, 70, 33, 33, 33,162,140,140,140, 70, 0,250, 0,216, 87,133,200,250,132,
- 51, 39, 39,186,128, 33, 85,163,124,127,153,171, 80,146,230, 24, 49,225, 12,196,172, 68,144, 20, 13, 6,128,157, 25, 31, 93,122,
-253,138,116,117,103,156,217,187, 86, 78,107,148,227,202,229,208,250,132,147, 97, 24,198,218,218,250,179, 58,184,123,247, 46, 70,
- 12, 31,134,190, 67, 6,195,178,190, 19,172,122,125,131,190, 83,127,192,222,189,123,193, 98,177, 96, 97, 97, 81,126,224, 45,229,
- 60, 26, 4,238,169, 80, 16,167, 66, 65, 28, 9, 4, 7,192,119,199,143, 31,255,205,205,205,237,193,211,167, 79, 55, 2, 24, 85,
-246,191,202, 96,101, 57,107, 86, 69,109,180,108,206,156, 57,138,168,168, 40,136,197, 98,144, 36,137,167, 79,159, 98,247,238,221,
-216,180,105, 19, 2, 3, 3, 97,110,110,142,134, 13, 27, 66,165, 82,225,213,171, 87, 10, 0,203,170,224,164, 51, 50,200, 97,219,
-183,175,207,242,242,234,138,195,135,119,194,198,166, 51,184, 28, 27,112,184,150, 16, 75,154,226,224,129,223,208,191,127,107,252,
-121,229,108,118,102, 22, 57, 12, 0,169, 67, 95, 82,190,120,241, 2,123,247,238,197,240,225,195,147, 71,140, 24, 65,229,229,229,
-149, 90,180, 74, 50,253,174, 44,142, 49, 83,169, 84,130,202, 56,191, 95, 28,150,252,211,218,240,213,105,169,201, 29,253, 31, 60,
- 27,123,255,214, 93,196, 68,221,199,253, 91,119,241,248,126,128, 79, 90,106,114,199,214,237, 27,243,134, 78,245, 94,116,244,226,
- 5,182,196,200, 22, 71, 47, 94, 96,143,153, 53,119,109,219,190, 61,150, 85,215,231,139,219,145, 41, 76, 79, 91,178,110,227,142,
- 66, 82,163,100,109,216,182, 43, 69,145, 33, 93, 86,166, 95, 50,213,245, 79,133, 66,177, 79,169, 84,218, 41,149, 74, 59,149, 74,
-181, 44, 46, 46,174,219,130, 5, 11, 50, 40,138, 42,181,150,102,188,253,243,217,187, 39, 71,214, 89, 89,152,138, 58,183,107,222,
-100,243,190,243, 15, 19, 18,211, 78,148,201,161, 85, 81, 57,149,133, 10,229,176,193, 67,199,203,114,115, 84,232, 52,215, 7,180,
- 80, 2, 21, 5,104, 25, 54, 72,130,131,208, 53,155, 33, 50, 51,196,201,216, 55,242, 60,173,102, 24, 62,205,161, 85,213,185,127,
- 9,244,156,122, 78, 61,231,127, 39,231,255, 50,108,241,233, 90,135,182,159, 88,180,170,155, 82,105,111,111,223,237,219, 65,189,
-208,221,235,103, 48, 12,131,119,111,126, 71, 78,198,123,216,219, 8, 16,157,144,223, 9,128,127, 13, 10,147, 16,151,152,216,113,
-206,178,159, 47,142,232,211,211,197,181,126,125, 65,189,122,142, 16, 91, 89, 33, 51, 51, 3, 79,158,191,213,174, 61,117, 46,172,
- 88,100,233,228,152,164,105,186, 40,200, 29, 64,207, 57,139, 65,176,217, 64,113, 26,135,146,129,177,126,187,206, 32, 56, 28, 80,
- 12, 13,149, 74,165,203,108,185,164,143, 31, 63, 14, 27, 55,110,220, 61, 63, 63, 63, 86,223,190,125, 91, 93,186,116,233, 75,214,
-204,131, 44, 61,234, 1, 0,175,181, 75,166,159,233,216, 99,176,145,115,243,182,188,182,245,216,208,104, 9,164, 36,199,195,239,
-226, 75,205,219, 23,183,242, 25, 82, 57, 74,158, 25,245,160, 42, 46,141, 70,147,208,168, 81, 35,235,189,123,247,150, 6,195, 83,
- 20,133,204,204, 76, 60,123,246, 12, 45,218,117,128,203,164, 41,200,200,200,192,246,237,219, 81,183,110, 93, 12, 28, 56, 16,217,
-217,217, 32, 73, 82, 87,135, 47, 5,224, 86,241, 11,229, 68, 22, 81,188, 4, 80,149,110, 67, 39, 39, 39,190, 82,169,108,197, 48,
- 12,155, 32,136,173,106,181,122,226,146, 37, 75,108,215,173, 91,135, 38, 77,154, 32, 51, 51, 19, 98,177, 24,206,206,206,200,200,
-200,192,203,151, 47, 41,185, 92,190, 23, 69, 11, 89,103, 84, 83,190, 15, 47, 95,198,118,156, 61,251,199,139,191,173,159,238,172,
- 84,117,231,155,153,185,131, 97, 72,100,100,196,161, 32,255,169,230,215,213,127,124, 76, 75,215, 14, 5, 16,165,227, 57,175,240,
-246,246, 6, 0, 33,128,159,163,163,163,131, 92, 92, 92,156, 43,179,104,233,130, 45,231,147,149, 0, 78, 13,235,107, 55, 47, 63,
- 51,196,217,140, 19, 23,219,209,149,222,190,229,124,178,210,200, 78,182, 38, 51,206, 63, 82, 42,187,181,247,232,197, 11,236, 9,
- 67,134, 81, 14,146, 40, 31,161, 21,115, 94, 7,106,198,205,205,173, 14, 65,100, 55, 72,207,122,255,122,242,212,233, 35,141,121,
-138,235,110, 14, 89, 13, 89,117, 91, 11, 3, 3, 3, 99, 81,195,153,161,197,136, 76, 78, 78,238,182,100,201,146, 91, 12,195,124,
- 18,155,144,158,153,125,191,147,151, 55,147,155,155, 23,148, 17,241,167, 46,185,212, 94,190,124, 19,216,211,181, 69,235, 11,191,
-173, 91,111,221,125,206, 2, 78,228,131,135, 0,165, 69,188,255, 67, 80, 2, 53,189, 57,224, 78, 90,158, 70, 51, 4,250,172,240,
-122,232,241,175,183,102, 85,165, 69,254,203, 49, 0,149, 4,195,235,124, 50, 78, 13,236,111, 53,113,174,215,167,174,131, 37, 0,
- 32, 58, 54, 5,209,177,201,183,163, 99,146,251, 86,163,120, 43,155, 94, 89,186,168, 52, 81,156,194,129,209,109, 81,233, 79, 56,
-205,205,205, 95,115, 56, 28,135,154,212, 6, 69, 81, 41,153,153,153,173,117, 44,231,152,250,245,235,175,143,143,143,191, 72,211,
-244,188, 26,170,253, 10, 57, 75, 22,149,102,113,248,189, 24, 82,221, 2, 0, 8, 14, 95,151, 69,165,203,114,182,144, 72, 36,251,
-184, 92,110,221,146,118, 44,137,193,162, 40,138,173,209,104,132, 20, 69,177, 1, 16, 44, 22,139,228,114,185, 74,130, 32, 72,146,
- 36, 19, 84, 42,213,116,252,149,112,180,170,115,175,118,160, 47, 22, 90,168,192,162,117, 23, 0,162,162,162, 26,155,154,154,142,
- 34, 8, 98, 56,195, 48, 77, 11, 10, 10, 84,203,151, 47, 15, 60,119,238, 92,126,253,250,245,251, 13, 24, 48,128, 8, 9, 9, 65,
- 88, 88, 24,147,149,149,117,190,216,138, 21, 93,195,190,196, 18, 8,216,163,205,204, 88, 3, 24, 6,110, 96, 64, 16, 44,132,230,
-229,209,215,229,114,234, 68,177, 96,172,105,255, 44,193,216,122,245,234,253, 17, 27, 27,203,173,204,146, 90,217,185,151,199,239,
-203,154,255,220,169,107,215, 97,207, 30, 63,190,244,211,218,240,213,101,183,205, 26,108, 58,121,204,204, 57,191,159,218,181,237,
-167, 29,151,115, 14,235, 82,206, 86,173, 90, 57, 17, 4, 49, 10,128, 43,195, 48,141, 24,134, 16, 18, 4,147, 67, 16, 68, 56,128,
- 16,181, 90,237,247,246,237,219,164, 47, 56,247,218, 60,225, 86,198, 89,186,168, 52, 40,170, 37, 5, 48, 58, 46, 42,253,159, 46,
-167,158, 83,207,169,231,252,255,227,252, 95,198,180, 10, 6, 72,221, 50,195,151, 32, 58, 38,185,111,116, 76, 50, 26, 53,106,196,
-124,248,240,161, 70, 34,173,178, 65,154,162,168,211,114,185,252,244,151,144,100,101,101,181,253,155, 43,239, 84,108,108,236,169,
-175, 73, 88, 44,164, 86, 23,191,106,139,208,194,194,194, 14,186,238,172,209,104,254,142,186, 33,138,173, 89,171, 42,219,161, 79,
-159, 62,241, 26,141,230, 46,128, 68,130, 32, 76, 0,100,107, 52,154, 91, 36, 73,166,125,248,240,161,237,230,205,155, 75, 50,223,
-255, 10,224,117, 45,203, 65,171, 84,212,201,148, 20,234,228,223,112,142, 39,213,106,245,124,115,115,243,134, 74,165,146,175, 84,
- 42,121,101, 39, 31,136, 68,162,140,170, 2,226,203,194,196,144, 56,194,227,228,152,155, 24, 18,229,133, 20,204,236,113, 65, 33,
- 11,107, 98,102,143, 11,186, 22, 44, 40, 40, 40,218,205,205,237, 56,139,197,170,207, 48,140, 53,192, 24, 51, 12, 50, 24,134,201,
-228,112, 56,201,111,223,190, 77,254, 47,186, 9, 41, 73,154,222, 72,170,213,127,197, 29,234,103, 23,234,161,135, 30,255, 28, 84,
- 26,163,197,169, 41,211,135, 15, 31, 8,125,125,234, 81, 86,108, 85,181, 49, 62, 62, 94, 5, 32,160,248, 85, 30,175, 1, 12,252,
-111, 63, 65,169, 84,218,186,178,109,186,138, 44,160, 40,102, 11, 8,155, 91,209,182,149, 59,114, 10,176,227,226,162,154,150, 45,
- 56, 56, 56, 1, 58,186,216,245,208, 67, 15, 61,244,248,219, 48,173, 50,241,197,209,215,141, 30,122,232,161,135, 30,122,232,161,
-199, 23, 97,127, 25,193,245,137,117,139, 64,229, 51, 7,106,226,123,173,205,236,131,187,122, 78, 61,167,158, 83,207,169,231,212,
-115,234, 57,255,117,156,255, 84,124, 34,178,116, 73,142,254, 53,160,159,250,170,231,212,115,234, 57,245,156,122, 78, 61,167,158,
-243,223, 32,178, 62,121,149,100, 61,208,187, 14,245,208, 67,143,127, 45,206,157, 59,167,211,162,162,163,127, 58,232, 37,145,152,
- 46, 47,204,207, 91,127,122,227,228, 75, 37,191,143, 24, 49,130,210,215,162, 30,122,232,129,218, 4,195, 55,104,224,208,140, 69,
-209, 93, 24,134,197,102, 88,140,150,200, 87,156,137,206,201,249, 36,237, 64,157, 58,117, 76,184, 44, 12, 36, 24, 70, 76, 16, 52,
- 69,179, 89, 79, 99, 98,146,222,214,160, 96,124, 83, 83, 83,111, 30,143,215, 75,173, 86, 59,176, 88,172, 36,149, 74,117, 87, 46,
-151,239,196,231,137, 11,255,223,208,184,113,227, 49, 15, 31, 62, 52,113,119,119, 87,137, 68, 34, 82,161, 80,112,110,222,188,249,
-127,236, 93,119, 88, 20,215,219, 61, 51,179,189,194,210,171, 40, 40,138,162, 2,246, 94, 19,141, 93, 99,137,177, 23,212,152, 24,
- 53,209,104,162,137,221,104, 76,172,137, 37,118,163,198, 26,123, 55, 98,111,216, 80,177, 75,239, 44,176,176,108,159,153,239, 15,
-216,205,138,148, 93,196, 68,127, 31,231,121,134,101,118,103,207,222,153,185,115,239,185,239,125,239,251, 10, 62,250,232,163,236,
-103,207,158,149,107, 69,162,151,151, 87,251,245,235,215,251,119,234,212, 9, 53,106,212, 80, 15, 24, 48,128,215,172, 89, 51,222,
-168, 81,163, 94, 36, 37, 37,157,181,147,174, 14, 65, 16, 91, 9,130,160, 24,134, 25,130,127, 66, 55, 84, 52, 72,146, 36,199, 16,
- 4,209,155,101,217, 0,130, 32,158,179, 44,187,159, 97,152,210, 2,183,150,134,143, 1,116, 33, 73, 50, 12, 0, 24,134,185, 5,
-224, 40, 96,251,202,187,127,147, 83, 44, 22,135, 2, 64,126,126,254,237,138,226, 36, 8, 34, 20, 0, 88,150, 45, 47,231,112,145,
- 72, 52, 26, 0, 52, 26,205,239,176, 33, 29, 84, 81,176,107,130,216,176,217,209, 0,128, 91, 63, 4, 1, 0,236,217, 39,198, 70,
- 19,246,252, 86,113,124,246,112, 20,131, 46,131, 6, 13, 90,240,199, 31,127,252, 0,224,192,219,168,248, 30, 30,190,171,126, 94,
-190,206,107,226,231, 35,127, 68, 65, 70,136,210, 31, 72,224, 3, 62, 69,245,208,211,244,133, 7,192,110, 0, 28, 39, 39,167,129,
-124, 62,191,181, 94,175,247,228,112, 56,201,122,189,254,124, 78, 78,206, 14,148,146, 1,193,230,235,250, 16, 10, 67, 62, 60, 8,
-230,159, 60,111, 44, 9, 29, 79,140, 20,162, 54,178,222,129,102,148, 4,240,101,225,185,110, 64,201,225, 60, 74,107,124, 38,122,
-121,121,245, 86,169, 84,249, 20, 69,177, 40, 88,245, 92,240,167,224,115,130, 97,152, 52,165, 82, 57,164, 44, 46, 73, 21,212,226,
- 75,136,173,180, 17, 26,147,142, 29,167,142, 71,180,212, 23,205, 89, 96, 8, 11, 84, 35, 41,210,149, 97,152,100, 0,103, 73, 19,
- 14,229, 37,225,233, 59,218,185,251, 21, 94,215,170,133,251, 92, 0,238, 0,238, 2,152, 8, 32,175, 82,255,252,107, 40,234, 12,
-127, 4, 64,178, 69,104, 89,133,187,111,219,173, 91,183, 8,127,127,159, 58,125,123,245, 89, 48,118,204, 56,130,162, 72, 68,221,
-191,207,249,116,200,240, 15, 21, 10,133,183, 84,167,171, 13,130, 96,242,133,194, 40,149, 42, 39,113,247,142, 63,100, 65,181,106,
-209, 52,205, 96,205,218,213, 31,237,249,107,223,183, 54,138,173,154, 30, 30, 30, 91,167, 77,155,230,209,163, 71, 15,202,195,195,
- 3, 49, 49, 49,142, 59,119,238,172,181,114,229,202,254, 89, 89, 89, 67, 0, 60, 46,199,201,182,242,112, 34, 63,148,137,136, 14,
-200,165,145,107,196,153, 20, 13, 78, 2,184, 80,222,171,151,159,159,255, 69,126,126,126,147, 70,141, 26,177, 27, 54,108, 32,134,
- 13, 27,198, 18, 4, 65,104, 52,154,205, 0,202, 37,180, 36, 18,201,175,157, 58,117, 10, 12, 12, 12,124,254,236,217,179, 46,187,
-118,237, 58, 58,116,232,208, 0,137, 68,242, 4, 64, 77, 59,233, 54,101,102,102,134,104, 52, 26,248,248,248,108, 0,208,224, 45,
- 84, 34,130,162,168,253,222,222,222,236,226,197,139, 15,132,132,132,184, 43,149, 74,211,148, 41, 83, 58, 94,189,122,245, 35,154,
-166,123,216, 33,182, 20, 4, 65,172,117,119,119,119,249,241,199, 31,159, 54,108,216,240,174, 64, 32,224, 63,121,242, 68, 60,121,
-242,228, 73,143, 31, 63,238,207,178,236, 24,192,174, 14, 66, 65, 16,196, 90, 47, 47, 47,151, 5, 11, 22,196,132,133,133, 69,241,
-120, 60,222,147, 39, 79, 36,223,124,243,205,196,232,232,232,114,113,146, 36,185,166, 73,147, 38,138, 31,126,248,225, 97,173, 90,
-181, 46, 83, 20,197, 79, 72, 72, 32,103,205,154,245,249,169, 83,167,250, 49, 12, 51,182, 60,229,116,115,115, 83,204,154, 53,235,
- 97,179,102,205,174,242,120, 60,222,163, 71,143,200,105,211,166,125,254,244,233, 83,155,203,233,228,228,212,142, 32,136,117, 41,
- 41, 41, 28, 0,240,244,244,108, 44,151,203, 87, 90,231,180, 52,251, 8, 24,141,198, 92,173, 86, 59, 72,169, 84, 22, 27, 8,119,
-216,244, 21,221, 1, 96,165,193,188, 95,240, 90,214, 62,176,230,144, 45, 39, 29,234, 81, 16, 23,239,103,245,136, 94, 0, 48,176,
- 48, 85,248,207,106,128,195,225, 48,161, 30, 19,217,219, 41,118,133,140,233,217,190,125,251, 89,103,207,158, 93,221,182,109,219,
-111,182,109,219,230, 22, 31, 31,191,232,194,133, 11,190,159,124,242,201,176, 51,103,206, 44,204,200,200,216, 83, 81,149,159,207,
- 19, 8, 8,146,128, 72, 40,150,219,114, 60,151, 36,187, 93,238,217,115,244,239,143, 30,133,173,140,142,246, 87,123,122, 54,153,
- 48, 97,130,123,159, 62,125, 72, 95, 95, 95, 60,125,250,212,121,219,182,109,181,127,255,253,247,222,217,217,217, 95, 2,136,125,
- 19,145,165,206, 70, 61,157, 30, 97, 44, 11, 71,203, 3, 75, 32, 91, 96,192, 45,246, 33,238,189, 3, 98,235,251, 77,155, 54,253,
-240,244,233, 83, 44, 92,184, 16, 0, 86,217,249,253,201, 61,123,246,236,186,111,223, 62,209,238,221,187, 69,141, 26, 53,130,135,
-135, 7, 10, 7, 83,150,192,212,254,254,254,182, 93, 51, 6, 63, 47, 59, 58,162, 65,148,242, 24,126,237,147,178, 80,228, 3, 83,
-243,158,129,189,187, 13, 11,131,131,171, 24, 66, 41, 7,217,153,170,186,143,110,197,119,250,123,215,211, 69, 79, 35,211,127, 84,
-199,225,123,148, 28,147,239, 63,129,179,179,243,134, 23, 47, 94,180,147, 72, 36,175,188,255,252,249,243,208,192,192,192, 28, 0,
- 95,217, 43,220, 92, 93, 93,183, 51, 12,163,203,204,204, 28, 9, 0, 50,153,236, 15,137, 68,162, 72, 78, 78,254,246,109, 13,100,
-204, 40,170, 69,222,115,139,150,197, 95,171,184, 92,135, 4, 73, 51, 45,198,142, 25, 71, 12, 24,248, 73,202,211,231, 47, 24, 14,
-151, 63,240,248,137, 19,226, 58,117,234,144,186, 85,171, 96, 74, 79,135,113,210,164,230,167, 79,159, 54,246, 27, 56, 88,195,165,
-136, 77, 1,254,213,196,127,238,216,233,177,111,239,158, 22, 0,202, 18, 90,124, 15, 15,143,173,231,206,157,243,246,247,247, 71,
-118,118, 54, 98, 98, 98,160, 86,171,209,191,127,127,110,139, 22, 45,188,251,246,237,187, 53, 39, 39,167,165, 29,150, 45,247, 26,
- 62,156,195, 99,134,247,169,249,209,135, 45, 36,222,190,213,193,166,104, 17,255, 44,186,209,225,115, 87, 39,108,218,123,244,241,
-211, 28,182, 27,138,207,141, 84, 42, 50, 50, 50,166,246,238,221,123,111,187,118,237, 92, 5, 2, 1,188,188,188,136, 30, 61,122,
-164, 37, 37, 37,205, 46,183,106, 41, 76, 97, 67,146, 36,109,253, 90, 76,122, 32, 91,224,163, 80, 40,160, 80, 40, 0,192,251, 77,
- 71,158,142,142,142,171,100, 50, 89, 95,149, 74,165, 33, 73,146, 37, 8,130,213,235,245, 34,133, 66,113,231, 97,244, 99, 47,157,
- 78, 87, 99,201,178,223,151,183,111, 21, 34, 63,117,234, 20,250,244,233,195,158, 60,121,114,140,173,121,234, 8,130, 88,219,187,
-119,239,252,153, 51,103,106,159, 62,143,241,126,248,248, 57, 33, 17,242, 25, 23, 23, 23,238,245,235,215, 57, 75,151, 46, 21,206,
-154, 53,107, 45,203,178,125,237,184,158,107, 63,249,228, 19,195,215, 95,127,157,252,232,233, 11,183,123, 15,159,178, 82, 33,215,
-228,226,226, 76, 93,189,122,149, 41, 15, 39, 73,146,107,166, 78,157,170, 26, 51,102, 76, 86,166, 50,199, 35, 75,149,199, 10,184,
-148,209,195,195,131,115,224,192, 1,221,246,237,219,201,209,163, 71,175, 97, 24,166,159, 29,215,119, 77,143, 30, 61,114,167, 77,
-155,150,253,228,249, 75,143,123, 15, 30, 67, 44,224, 26,221,221,221,168, 27, 55,110, 24,150, 44, 89, 66,206,155, 55,207,166,114,
- 74, 36,146, 45,187,118,237,226, 28, 56, 80,208,246, 93,185,114,133, 12, 8, 8, 16, 91, 31,163,209,234, 64, 18, 64, 70, 70,134,
-184, 89,179,102, 91, 0,188, 22,220, 55,108,118, 52,134, 77, 7,190,248,226,139,100,123, 43, 75,152,231,132, 50,143,161, 87, 7,
-177, 75,243, 71,244,226,112, 56,204,232,209,163, 83,138,126,174,213,106, 9, 0, 61,176,200,118,177,213,165, 75,151,239,142, 28,
- 57, 82,125,219,182,109,191,108,223,190, 93, 15, 0, 66,161,208,101,231,206,157, 11,251,247,239,143,254,253,251,207,220,179,103,
- 79,133, 9, 45,154,165, 13, 0, 32, 16, 10, 4,209,209,209, 68, 80, 80, 80,169, 94,174, 6,134,185,249,251,163, 71, 13, 63, 11,
- 10,106,164,100,152, 26,188,143, 62,202,155, 60,121,114,134, 74,165, 66, 76, 76, 12, 12, 6, 3,134, 13, 27, 70,181,109,219,214,
-171,127,255,254, 43,114,115,115, 63, 6, 96,176,161, 78, 46,241,246,246, 14,207,201,201,201, 51, 91,117, 90, 14,161, 57,173, 67,
- 77,130,250, 53,140,124, 30,101,226,117,159,196, 16, 39, 87, 17,234, 32,127, 92, 4, 0, 94, 62,210,237, 28, 12, 20, 11,185, 15,
-252,105, 46,230,185,250,136,218,167,199,106,230,168,227, 74, 21, 75, 31, 75, 36,146, 94,106,181,122, 79, 97,231, 92,179, 91,183,
-110,184,122,245, 42, 0,180, 40, 20, 90,237, 73,146,252,148, 97,152,245, 0, 74, 75,229, 54,161,103,207,158, 31,236,219,183, 79,
- 6, 0,123,246,236,129,209,104, 68, 64, 64, 0,120, 60, 30,248,124, 62,184, 92,174, 37, 59,136,141,240,116,117,117,129,139, 3,
- 23, 10, 39,201, 71,223,252,214,147, 83,165,142, 28,105,244,125, 40,217,108,152, 88, 29,120,206, 18,212,234,228,136,176, 15,219,
-147,135,214, 68,125,123,232,215,135, 13,243, 73,116, 71, 44,116,239, 74,207, 78,146,164,224,238,221,187,240,242,242,122,229,125,
-138,162, 0,160,117, 57, 40,103, 62,127,254,188, 89,100,100, 36,218,181,107, 55,179, 94,189,122,157, 35, 34, 34, 60, 50, 51, 51,
-209,174, 93,187, 21, 9, 9, 9, 7,222,246, 57, 89,107,145,255, 21, 83, 23, 89, 68, 73,182, 45, 24, 5,147, 20, 69,145,120,241,
- 60,198,216,174, 93,135,161,113,113,113,210, 38, 77,154,144, 92, 46, 23,234,179,103,161,189,113, 3, 82,169, 20,189,123,247,230,
-158, 63,127, 94, 46,151,202, 71,189,124,241, 50,151,162, 72,176, 44, 89,166,207,131, 66,161,248,252,219,111,191,245, 8, 12, 12,
-132,201,100,178, 68, 52, 55,153, 76,136,143,143,135, 84, 42,197,144, 33, 67,220,196, 98,241,231, 54,158, 71,213,154, 1,110,183,
-206, 29, 93,219, 96,242,216, 46,146,154,226, 83,144,196,127, 9,233,158,207, 80, 59,233, 56,166,245,106, 34, 57,249,235,204,176,
-234, 94, 78,183,172, 76,172, 54, 67,167,211, 93,140,138,138, 26, 21, 17, 17,193, 0,192,223,127,255,205, 62,124,248,112,204,155,
-140, 66, 25,134, 65,118,118, 54, 24,134,161, 10,247,205,175,255,105,125,144,203,229,107, 58,119,238,252, 73,108,108,172,232,216,
-177, 99,206,113,113,113, 46, 47, 95,190,116,173, 89,179, 38,103,225,194,133, 71,180, 58, 3,101,164, 89,189,137, 54,230, 38,223,
-191,255, 60, 43, 53,245,214,198,141, 27, 53, 4, 65,244,182,241, 55, 62,246,244,244,116,158, 62,125, 58, 8,174,184,113,173,218,
-245, 2, 41,174,200,129,228,242, 29, 52, 26, 45,253,226,197,139,248,233,211,167, 87, 11, 9, 9,241, 66,193,244,154, 77,156, 94,
- 94, 94, 46, 95,127,253, 53, 56, 2, 89,104,253,144,176,234,124,129, 68, 70,113, 69,178, 38, 77,154,180,125,254,252,121,210,180,
-105,211, 60, 27, 53,106,100, 23,103,163, 70,141, 20,163, 71,143, 54, 9, 69,178,102,254,254, 1,181,235, 7,215,238, 90,179,102,
-205, 94, 28, 14,199,148,158,158, 30, 59,100,200, 16,207,238,221,187,187,219,195,233,230,230,166,152, 54,109,154,201,215, 47,160,
- 83,167, 15, 62,108,202, 19,201, 28, 56,124,137, 99,126,190,150,126,244,232, 81,236,140, 25, 51, 60, 67, 67, 67,221,108,225,204,
-207,207,231,186,184,184,160,110,221,186,168, 19, 16,128,156,156, 28,236,219,183, 15,155, 54,109,194,250,245,235,177, 99,199, 14,
- 52,108,249, 33,100, 50, 25,146,146,146,160, 82,169,184,255,118,133,162, 87, 7,177, 43,245,225, 61,198,141, 27,151, 52,122,244,
-232, 20,145, 72,196, 20,221,156,156,156,232, 65,131, 6,165, 14,249,102, 89, 15,243,212, 98, 25,150,172,187, 71,143, 30,125,182,
-109,219, 54,212,169, 83, 7,157, 58,117,226, 3,192,231,159,127,206,239,223,191, 63,118,237,218,133, 61,123,246, 60, 8, 12, 12,
-188, 4,160,167, 45,229, 28, 50,100, 72,203,126,253,250, 93,232,215,175,223,237, 1, 3, 6,172, 27, 51,102,204, 43, 61, 87,114,
- 82,194, 77,189, 94,143,144,176, 70,226,185, 27,174, 13, 42,139,239, 33,176,109, 93,116,244,166, 31,239,223,143,157, 89,167,142,
-163,223,203,151, 78,155,151, 44,113, 49, 39,233, 54, 26,141,136,143,143,135, 66,161,192,160, 65,131, 92, 4, 2,193, 16, 27,138,
-185,180,103,207,158,195,227,226,226,164,191,255,254,187,231,237,219,183,189,146,147,147, 61,207,156, 62,225, 58,229,171,207,101,
- 14, 82, 62, 63, 41,157, 37, 0,224,101, 18, 36,209, 47,208,146,101,225,104, 61,157, 88, 46,120, 66, 36,242,193,202,234, 45, 29,
- 31,127,189, 43,116,192,180,195, 97, 46, 10, 79,193,244, 82,190, 81,127,241,226,197,187, 15, 29, 58, 52,176,101,203,150,123, 1,
-136,138, 57, 70,216,176, 97,195,125,187,118,237, 26,222,170, 85,171,139, 0,234,150, 56,138,244,241,233,253,215, 95,127, 57,155,
-247, 93, 92, 92, 32, 20, 10, 95, 19, 89, 60, 30, 15, 36, 73,218,125,122,243,119, 14,228, 56,213,214, 33, 42,235, 40,118, 45,190,
-139,197, 31, 61, 98, 22, 52,127,169, 91, 53, 36, 26, 39,119,221, 69, 26,238,162,203,103,213, 49,112, 70, 72, 71, 49,141,121,239,
- 82, 7,158,158,158,254,105,235,214,173,119,119,233,210, 69, 23, 25, 25,137,244,244,116,120,123, 91,198,218, 41,229,160,116, 18,
-139,197,240,245,245, 69, 96, 96,224,192,243,231,207,123, 24,141, 70,188,124,249, 18,105,105,105,183,254,141,115,178,214, 34,239,
- 25,138, 58,195, 31,121, 77,104, 21,230, 22, 58, 7, 0, 44, 65,168,239, 70, 69,113, 41, 62,127,240, 31,219,183, 11,120, 60, 30,
- 98, 99, 99,241,224,193, 3,228,159, 57, 3,205,229,203, 72, 77, 77, 69, 94, 94, 30,220,221,221,177,118,195, 6,137,158,102, 71,
- 60,122,252,152, 98, 73,214,218,223,160,216, 37,158, 2,129,160, 99,159, 62,125, 74, 20,100, 73, 73, 73,232,210,165, 11,151,162,
-168,226, 86, 53, 20,229, 36,188, 92,137, 67,103,246,206,245,244,228, 63, 0,158, 78, 6,114,111, 1,172, 14, 48,233,129,196,123,
-192,145,217,240,203,139, 38, 78,204, 29,234,225, 45,230, 28, 42, 70, 41,151,181, 20, 53, 32, 40, 40,104,253,224,193,131, 73, 0,
-104,223,190, 61, 17, 20, 20,180, 14, 64, 64, 41,223, 57, 93, 70, 39,121, 53, 43, 43, 11,253,251,247,119,174, 94,189,250,233,254,
-253,251, 59,155,223, 47, 47,167,217,154, 92,167, 78,157, 76,161, 80,184, 3,176,169,129,181,112, 58, 58, 58,174,234,210,165, 75,
-223,237,219,183,243, 0,224,220,185,115, 56,116,232, 16,238,223,191,143, 39, 79,158, 48, 97, 97, 97,174,203,214,239, 94,179,106,
-245,150,165,189, 90,132,120,181,109, 28, 86, 91,154,151,149,231,238,238,222,130,101,217, 0, 27,203,217,101,246,236,217, 15, 30,
- 62,139,117, 32, 57, 92, 14,143,203, 17,200,229, 18,119,133, 76,226,227, 36, 22,122, 11, 72, 66,154,159,159,159,178, 99,199, 14,
- 6, 64, 23, 91, 57,231,206,157,251,226,225,211, 88, 71,130,228,112,184, 28, 46, 79, 42, 21, 59,126,212,169, 93, 35, 0,224,129,
-229,169, 84,170,212, 77,155, 54, 25,236,225,252,225,135, 31,162,148,217,121, 10, 14,151,203,229,112, 40,203,181,148,136, 68,174,
- 98,129,128,175,211,233, 18,151, 47, 95,174,177,135,115,246,236,217, 15, 30, 61,139,115, 34, 9,130, 34, 8,146, 35,151, 73,156,
-157, 29,196,174,174, 82,145,139,152, 67,241, 85, 42, 85,226,214,173, 91,109,226, 52, 24, 12,188,212,212, 84, 60,124,248, 16,190,
-141, 26,225,212,169, 83,168, 82,165, 10,250,247,239,143, 79, 62,249, 4, 34,145, 8,237,155,213,195,244,233,211,241,236,217, 51,
- 24, 12, 6, 65,113,156,102, 63,169,162,240,242,242,138, 44,171,242, 20,249,238, 43,229, 12,245, 0,187, 82, 31,222,195, 90, 96,
-149,196,239,228,228, 68, 23,103,237, 42,202,217,165, 75,151,239,206,156, 57, 83,125,235,214,173, 61,134, 12, 25,114,113,235,214,
-173,104,218,180, 41, 30, 62,124,136,106,213,170, 97,243,230,205,248,228,147, 79, 46,174, 88,177,162, 71,100,100,100,136,191,191,
-255,183,101,113, 14, 24, 48, 96,124,104,104,232,217,148,148,148,102, 74,165,178,238,190,125,251, 70,244,238,221,251,197,192,129,
- 3, 59, 88, 4,163,209,184,253,200,193,189,232,218,163, 15,106, 5,215, 93, 51,236,219,109,245,202,120, 54,217,251,192,186, 77,
-201,201,233,219,181,218,252,254, 92,174, 88,124,237,154,211,158,213,171, 93,172,151,124, 39, 38, 38,162,123,247,238, 92, 30,143,
-215,170,140,114, 46,238,213,171, 87,255,125,251,246, 41,204, 86,157,203,151, 47,227,222,189,123,136,137,137, 65,118,118, 54, 58,
-140,201,195,184,133, 5,220,227, 22,178,248,240,115, 86, 82,206, 54,196, 2, 81, 21,120, 56,203, 57,151, 70, 44,175,245,121,248,
-154, 58, 28,169, 19, 23,127,124,243, 4, 25, 47,117,123, 74,224, 36,154, 53,107,182,173, 95,191,126,132, 94,175,135, 94,175,215,
- 3, 40, 54,170,175,183,183,183,176,126,253,250, 24, 51,102, 12, 41,151,203, 87,148, 84, 78,181, 90,173, 59,122,244, 40,134, 12,
- 25,130, 47,191,252, 18, 53,106,212,128, 66,161, 0,151,203,197,150,109,127,186,124, 50, 98,108,205, 6, 45, 91,135,212,105,208,
-180,126,174,142,106,196, 21, 41, 70,151, 96, 13, 41,246,220,243,220, 34, 17,245,242, 10, 86,246, 72, 96,174,111,206,207,155,242,
-233, 79,209,143, 34, 82,239,127,219,111, 93, 20,123,165,121,198,182,137,113, 72, 53, 62, 68,171,254,126,240, 15, 85, 76,146,248,
- 34,168,188,215,211, 70,216,197, 89,175, 94,189,150,215,175, 95, 23,180,110,221, 26,177,177,177,224,114, 45,227, 41,250, 77,202,
- 57,123,246,108,129, 86,171,197,157, 59,119, 48,116,232,208, 68,131,193, 48,233, 77,202,105,143, 69,203,172, 69,222, 51,172, 43,
-178, 37,151,100,209,154, 13, 0, 70, 6,135, 6, 15, 29,145,127,248,240, 97, 49,159,207, 71,108,108, 44,146,147,147,177,101,211,
- 38,186,189,155, 91,110, 39,111,111,213,150, 77,155, 88,189, 94, 15,150,101, 17, 20, 20,132,190,125,251,138, 62,238, 63, 48,141,
- 80,105,254,180, 97,154,199,211, 60,191, 62, 98,196,136,215, 62,159, 50,101, 10,228,114, 57, 8,130,240,176,225,228,250, 77,152,
-221,203, 71,225,239,152,202,166,108, 81,130, 18, 2, 28, 25,192,145, 3, 66, 7, 64, 32, 3,248, 98,232, 34,207, 42, 73,182, 83,
- 76,159, 86, 35,189, 1,216, 51,213, 3, 47, 47,175,153,103,207,158,117,141,140,140,100, 85, 42, 21,146,147,147,217, 5, 11, 22,
-184,122,121,121,205, 44,239, 29, 73, 74, 74,154,219,181,107,215,212,161, 67,135, 58, 28, 63,126,220,119,232,208,161, 14, 93,187,
-118, 77, 77, 74, 74,154,251, 38,119,154,199,227, 81,247,239,223,119,154, 55,111,222, 39, 0,110, 6, 7, 7,103,122,123,123,223,
- 68,129,211,100,169,144,201,100, 22,145,101,182,174,113, 56, 28,112,185, 92,120,121,121,233,149, 74, 37,221,170, 65,128, 40,200,
-129, 52,122, 9,120, 34, 39,145,208, 71, 38,119,104,146,153,153,121,151, 32,136,231, 54, 78,241,133, 54,110,220,152, 75,179, 92,
-102,220,224,246, 94,159, 15,111,231,246,219,188,209, 85,150,207, 13,247, 94, 60,107, 84,208,220,169,131,218,145, 12,163,173, 86,
-173,154,135,217,161,221, 6,243,121, 88,195,134, 13, 57, 12,184,120,248, 56, 38, 53, 54, 33, 49,247,131,182,205, 44,150,203, 58,
-161, 97,157, 92, 93, 93, 91, 7, 5, 5, 53, 36, 8,194,166, 37,201, 34,145, 40,180, 86,173, 90, 28,146,226, 18,206, 10,153,175,
- 76, 42,114,183, 76,161, 56, 58, 54,119,114,117,237, 71,178,108,142,167,167,167,155, 72, 36, 10,181,227,220, 57, 12,120,112,119,
-115,114,112,117,113,148,118,106,215,162, 70,179,230,205,106,214,107,210,180, 89,112,131,134, 31, 19, 38,147, 42, 32, 32,192,205,
-236, 36, 95,134,165, 85,184,125,251,118,204,155, 55, 15,245,253,252,224,237,237, 13, 55, 55, 55, 92,190,124, 25,215,175, 95,135,
- 66,161, 64, 90, 90, 26,150, 44, 89,130,253,251,247,195, 96, 48,200,236,173, 79,182,136,173,210, 96, 50,153,200,162, 2,171, 36,
-126,145, 72,196,152,157,228, 75,194,209,163, 71,183,153, 45, 89, 19, 39, 78,108,185,108,217,178,139,209,209,209,144, 74,165,184,
-126,253, 58, 70,140, 24,113,113,197,138, 21, 45,199,142, 29,139, 77,155, 54,225,197,139, 23, 27, 74,227, 27, 48, 96,192,172, 81,
-163, 70, 45,143,136,136, 32,221,221,221,161, 80, 40,208,171, 87, 47,108,216,176,129, 99, 50,153, 54,246,235,215,239,118,191,126,
-253,110,211,241, 39,191,219,189,126,193,229,168,187,183, 49,126,194,215,124,189,201, 56,205,134,211,103, 53, 82,105,174,169,117,
-107,229, 46,163, 49,127, 0,143, 39,118,184,125,219,233,208,198,141, 22,177, 53,125,250,116, 56, 56, 56, 0, 5, 14,204, 40,197,
-170, 19,190,127,255,126, 75,123,232,236,236, 12, 62,159, 15, 30,143, 7, 46,151, 11,138,162,112,122,141, 4,171,167, 23,232,139,
-213,211, 9,156, 92, 69,168,223,228,222,137,189, 81, 87,225,206,191,253,217,230,224,144,186, 29,156,113,121,103, 10, 22,116,141,
- 76,184,190, 43,125,178, 54, 13, 63,151,240,181, 6, 83,166, 76,169,147,150,150,134, 27, 55,110,224,198,141, 27, 37, 89,128,180,
- 7, 15, 30, 92,148,151,151, 7,127,127,127,244,236,217,179, 53,128, 70, 37, 60, 55,104,216,176, 33,186,119,239,142,118,237,218,
-161,126,253,250,208, 27, 76,220,126,131,195,107,221,127,145,238,189, 96,201, 2,241,217,191,247,145, 23, 47, 70, 80,219,246,158,
-116,104,214,238,195,229, 60,153,231, 85,136,156, 61,109, 57,207,124, 58, 19,161,158, 31, 97,221,153, 9,228,202,115, 67,165, 91,
- 14,173, 12,144,201,100,196,173, 27,183,141, 91,126,221, 21, 87, 87,210, 51,237,234,206, 76,228, 19, 41,232, 48,220,159,100,128,
-190,239, 74,207, 46, 20, 10,151, 69, 68, 68,120, 24, 12, 6, 68, 69, 69,225,203, 47,191,212,190, 33,165,197, 0,226,235,235,139,
-115,231,206, 97,208,160, 65,218,212,212,212, 43,255,214, 57, 89,107,145,255, 21,112,172, 20,164, 5,241,241,241,217, 10,133,194,
-187, 86,173, 90,164, 94,175, 47,152,146,216,179,135, 94,191,113,227, 17,173, 86, 59, 1, 0,111,213,111,191,173,241,246,241,105,
- 55,120,200, 16,194,104, 52,162,107,215,174,252,195,135, 15, 59, 63, 79, 75,203,181,161,195,121,229,247,134, 13, 27,134,101,203,
-150, 1, 0,190,248,226, 11,139,105,157,176,193, 97, 73,234,128, 46,157,186, 53,148,199, 75, 86,202, 13,205,141,121, 85,159,201,
-174, 74,242, 68, 13, 65,242, 57, 16, 82, 96, 12, 70,211,147,180,222, 55,159, 61,169, 93, 71,164,204,172,214, 49,184, 13,214,159,
-218,218, 37,159,214,238,178,185,193, 17,139, 27, 75,165, 82,220,188,121, 83,217,176, 97,195,108,150,101, 29,230,206,157,235, 34,
- 22,139, 27,191,193,181,127,249,248,241,227,214, 45, 90,180,248,156, 36,201,142, 12,195,156, 78, 77, 77, 93, 5,224,165,141,223,
- 31, 7,224, 7, 0,150,145,165, 94,175, 7, 73,146, 96, 89, 22, 3, 6, 12,192,244,233,211,235,220,187,119, 15,103,207,158,117,
-234,216,177,227, 85, 0,217, 0, 70, 2, 40,214,106,166, 82,169, 52,215,175, 95, 23,157, 61,123, 22, 12,195,192,201,201, 9,114,
-185, 28, 2,129, 0,189,122,245,146, 78,155, 54,173,195,137, 19, 39,210, 84, 85,171, 80,194,228, 68,181, 64, 42,149,193,195,187,
-213,216,129,159, 70,179, 44,187,223,142,198,129, 47,226,152,180, 4,173, 35, 23,127,191,130, 20,243,120,132,144,199,129,128,201,
-199,119,139,230, 19, 60,150,230,192,206,249,121, 30,143,199,147, 9,160,167,248,148, 81, 76,160, 66,162,196, 81, 20,197, 23,242,
- 74,246,199,224,146, 36, 73,146, 36, 15,128,205, 73,251, 4, 2, 1, 79, 38, 96, 75,228, 20, 81, 4, 69, 16, 4, 31, 37,172, 68,
- 11,245, 0,107,182, 34,241, 39, 60,215, 89,139,226, 86,173, 90,225,200,217,155,216,115,232, 52, 50, 98,239, 98,198, 55, 19,209,
-168, 81, 35, 28, 62,124,184,212, 50,153,125,180, 74,178, 46,123,121,121, 69, 38, 37, 37, 53, 40,233,187,165, 77, 25,150, 96,165,
-122,157,255,123, 7,132,205,142, 70, 25, 62, 90, 61, 91,181,106, 53,126,251,246,237,250,206,157, 59,243, 7, 12, 24,128,186,117,
-235,182, 28, 62,124, 56, 0,160, 99,199,142, 88,182,108, 89,203,225,195,135,227,207, 63,255,196,190,125,251,116,109,219,182,253,
-230,220,185,115,137, 40, 88,209,249, 26, 24,134,233,190,118,237,218,162,150, 66,152, 76, 38, 24,141, 70, 79,147,201,228, 89,216,
- 22, 97,249,242, 21, 25, 39, 79, 28,198, 55,223,206,134,155,171, 71,168,141,117,136, 24,246,245,215, 25,155,151, 44,193,146, 63,
-255,196,215,213,170,137,183, 62,120,128,147, 90, 45,118,157, 61,155, 81,248, 59,101,250,102,170,213,106,205,209,163, 71,229,187,
-118,237,130,163,163, 35,106,212,168, 1, 39, 39, 39,112,185, 92,144,148, 8, 20, 79,129, 90,193,141, 1, 92, 7, 0, 84,243,130,
- 58,200, 31, 23, 9, 2,217, 44,105,191, 79,145,160, 10,170,186,248, 8, 35,198,111,170,235, 40,119,227,225,248,170, 56,156, 88,
- 25,191, 95,155,129, 95, 96,194, 35,148,236,243,213,208,223,223, 31,105,105,105, 56,122,244,168, 26, 40, 81,144,129, 97,152, 69,
-191,253,246,219,148,111,191,253, 86, 16, 20, 20, 4, 0,161, 0,110, 20,119,172, 68, 34,129,183,183,183, 69, 88, 14, 24, 58, 54,
- 96,204,228,177,162,222, 31,182, 3,135,227,130,108,181, 17,153,185, 70, 40, 92,164,248,102,114, 63,225,233,134,222,141,214,174,
-248,227,160, 70,131, 70,192,235,237, 1, 65,224,198,181,187, 23,235, 9,131, 0,130, 4,226,201,191, 65,128, 64, 30, 97, 4, 65,
- 81, 44, 77,211,136,139,139, 3,203,178, 24,212,123, 68,124,248,130,125,110, 45, 7,169,224, 91,203, 11, 4,139, 54,239,138, 16,
-112,118,118, 14,205,204,204,196,203,151, 47, 49,116,232,208,196,140,140,140, 83,106,181,122, 68, 82, 82, 18, 0, 40,203, 65,105,
- 17,243,161,161,161,104,220,184, 49,250,247,239, 47,204,207,207,239, 23, 16, 16,224,157,158,158,222,252,109,158, 79, 81, 45,242,
- 63, 37,180,138,125,208,140,198, 90,186, 53,107,160, 62,125, 26,252,147, 39,177,203,203, 43, 79,171,213,126, 5, 32,190,240,193,
-159,184,105,243,230, 75, 61,174, 92,145,235,163,163, 17,112,239, 30,184,142,142,161,246, 22, 96,227,198,141, 80,169, 84,200,201,
-201, 1, 0,172, 92,185, 18, 42,149, 10, 38, 27, 19,206,114,120,104,233,225, 86, 13, 41,120, 2,134, 67, 74, 99,106,229, 55,149,
-106,101, 73,222,113,238,234, 28,210, 27,209,177, 77, 36,154, 76,125, 83,130,210, 67,155,145, 15,239, 22, 53,192, 1,167,165, 61,
-101, 52,207,251,115, 56, 28,229,227,199,143,187,215,172, 89,243, 16, 0,151,242,248, 3, 20,193,211,212,212,212, 9,229,249, 34,
- 69, 81, 63,188,120,241,194,109,195,134, 13,159,207,157, 59,151,181, 22, 90,230,255, 57, 28, 14, 88,150,133,131,131, 3,184, 92,
-174,251,229,203,151,221,155, 52,105,242, 43,195, 48,161, 37,156, 39, 91,183,110, 93,188,120,241, 2, 28, 14, 7, 14, 14, 14, 96,
- 76, 6,204,158, 60, 22, 52, 37,224, 76,157, 58, 53,180, 79,159, 62, 81, 27, 54,108, 48,202,155,181,104,158,153,153,121,127,252,
-160,193, 81, 7, 14, 28,208, 23,134,120, 40,123,136,207,178,183,159, 60,121, 66,249,120,185, 83,172, 41,159,145,240, 0,225,221,
-229, 44, 95,234, 1, 33,135, 98,121, 4, 9,129, 80,228,240, 50, 33, 33,147, 97,152,135,182,112, 50, 12,115,235,197,139, 23, 34,
-119, 55,103, 78,190, 70,159, 39,226,178,252,152, 91, 55,159, 87, 13,107, 24, 0, 0,218, 91,215,207, 9,106,213, 22,197,164,166,
- 75,170, 85,171,102, 19,167, 70,163,185,157,152,152, 72,185,187,187,115, 98,227, 19, 14, 58, 74, 37,174,114, 71,199,166, 0, 96,
-200,205,185, 78,234,116,233, 20,151,227,158,158,153,169,212,104, 52, 47,108, 61,247,103,207,158,113, 60, 61,221,168,227, 39,207,
- 28,114, 23, 11,220,100,124,142, 92, 64, 16,132,152, 34, 84, 60, 19,147, 33, 20,139,221, 94, 38, 36, 40, 89,150, 45,209, 66,248,
- 99,246,224,222, 5,247,107,246,159, 86,220,184,123,247, 46,142, 93,124, 8, 9,171, 7,161,205,193,201, 77,191, 99,208,212,111,
-223,216,239,175, 44,177, 85, 46,107,214,218,218,145, 69,248,145, 92,134, 35,252,160, 65,131,102,111,219,182,205,226,128,242,240,
-225, 67,180,111,223,222, 60,205,129, 78,157, 58,161, 73,147, 38,120,248,240, 33, 2, 3, 3,113,246,236, 89, 1, 69, 81,130,193,
-131, 7, 47,248,227,143, 63,142,150,105,247, 95,183, 14, 35, 70,140, 40,206,177,250, 25, 0, 45,161, 8,202,155,254,227, 22, 23,
-101,102, 6,210,210, 83,110,219,122, 29, 8,130,192,176,175,191,206, 88,171,215, 99,251,181,107, 24, 34,145,136, 55, 63,125,138,
-174, 77,154,160, 94,251,246, 25,182,180,117,102,171,142, 86,171, 5,151,203,133, 92, 46,135,179,179, 51,120, 60, 30, 40,174, 23,
- 56,252, 16,144, 60, 30,194, 90,133, 96,201, 87,146,252,161, 31, 97, 5, 65, 32, 91,192,199, 45,158,184, 68, 95, 29, 66, 82, 5,
-189, 88, 22,170,252,120,252,109, 22, 36, 14,126,112,224,202,184, 39, 71,253, 26,228, 40,119,227,225,216,138, 88,156,252, 53, 97,
-175, 54, 5, 51, 10,175, 5, 83,202, 64,162,158,163,163, 35,226,227,227, 17, 23, 23,247, 0,165, 59,248,231, 63,124,248,240,185,
- 64, 32,168,227,234,234, 10, 0,254, 37, 13,204, 25,134,177,248, 97,109,221,190,219, 37,180,117,128,240,131,150,117,176,229,208,
-124,124,214,111, 5,184, 20, 1,154, 54,224,151,101,221, 64,235,242,208,175, 71, 56,209,166, 99, 96,200,233, 67,250, 81, 70, 77,
-214,239,175, 13, 4, 56,152,247,211, 39,151, 29, 5, 82,178, 30, 24,194,209,197,197, 77,194,227,241,224, 44,247,212,127, 59,102,
- 82, 50,203,178,150,231,134, 75,241,140,100,174,147, 38, 51, 37, 79,228,200,213, 0, 44, 89,181,124,209,108, 42, 30, 9, 9, 9,
- 19, 90,183,110,189, 32, 55, 55, 55, 75,173, 86, 15, 2, 0,127,127,127, 63,146, 36, 5, 0, 74,155, 29,241, 67,241, 97, 33,120,
-247,238,221,131, 76, 38, 67, 98, 98,162,181,241, 5, 12,195,188, 51,139, 0,222, 81,132, 1,184, 5,192, 19, 64, 87, 88,133,119,
- 32, 11, 77,117,109, 14, 31, 62,204, 30, 62,124,184,141,165,243, 98, 89,198,164, 84,130,213, 21, 92, 91, 46,151,203, 2,176, 94,
-209, 36,118,116,116, 36,184, 62, 62, 32, 4, 5,174, 31,108, 5, 46,125, 53, 26,109, 11, 45,195,208,160, 64, 24,192, 90, 13, 90,
-212, 66, 2,243, 93, 58, 96, 2,127, 38, 82,248,142,214, 61, 29, 96, 98, 65,131,161,236, 44, 14,171, 86,171, 97, 50,153, 20,213,
-171, 87, 63, 98, 50,153, 20,133,157, 27,251, 95,221, 81,154,166,159, 83, 20,133,207, 63,255, 28,102,235,143, 94,175, 71, 74, 74,
- 10,116, 58, 29,244,122, 61, 94,188,120,129,156,156, 28,232,245,122,220,191,127, 31,254,254,254,160, 40,202,179,148,198,156,101,
- 89, 22,190,190,190,168, 90,181, 42, 40,130,197,250,197,179,240,221,151, 99,241,137, 63,131,141,171,126, 65,219,182,109,107, 87,
-171, 86,173, 25,135,195,161, 61, 60, 60,120,251,246,237, 59, 72,211,116, 47,216,222,242, 28,157, 62,125,122,213,224,224, 96, 55,
- 71,185,204, 40,224, 83,224, 27,213,172, 64,151,201,114,242, 51,224,235,235,103,130, 72, 28, 56,100,200, 16,186, 36, 43, 68,113,
-156, 95,125,245,149,103, 80, 80,144,131,194, 81,166,230,115,169, 52, 30,216,140,156,187, 55,174, 2, 0,223,213, 77, 11,161,184,
-206,208,161, 67, 77,246,112,206,156, 57,211,223,213,213,213,145, 4,155, 75, 27, 12,255,204,183,235,244,153, 4,151,171, 1,143,
-223,240,139, 47,190, 32,236,225,156, 50,101, 74,181, 58,117,234, 56, 58,202, 37,121, 28, 46,149,204, 99,152,100, 33,152, 20,174,
-222,144, 37,116,117,201,135, 88, 26, 54,100,200,144, 18, 57,205,214,172,105,211,166,197, 23, 17,222, 80, 42,149,208,166, 68,129,
-151, 24,141, 16, 41, 23,141, 92, 21, 16, 8, 4,150,165,239, 37, 85,215,146,124,180,138, 19, 91,182,126,183,225,156, 82,166, 0,
-215,214,142, 44, 26, 55, 43, 41, 41, 9,158,158,158,165, 62, 79,127,252,241,199,183,237,218,181, 75,235,212,169,147,254,200,145,
- 35, 32, 8, 2,103,207,158, 69, 98, 98, 34, 58,117,234, 4,150,101,205,171,218,112,251,246,109,116,236,216, 81,223,186,117,235,
-196,194,248, 90,101, 98,196,136, 17, 48, 26,141,200,203,203,131, 82,169,196,225,195,135, 17, 18, 18,194,138,197,226, 62,148,239,
-135,243,251,141,250,182,121,221,250,161,248,117,197, 18, 61,159,195,253,209,158,231,149, 32, 8, 12,253,234,171,140,156,176, 48,
-229, 86,181, 58,127,152, 92, 46,174, 30, 31,239,116,243,196, 9, 23,131,193, 96, 19,135,217,170,227,227,227, 99, 17, 89, 60, 30,
- 15, 28,190, 43, 40, 73, 61,240,157, 59, 65,236,209, 7,127,223, 18,232, 28, 36,216, 47,147,226,184,196,177,228,208, 14, 98, 95,
-204,111, 62,192,115, 95,139, 79, 60,207,136,171, 96, 67, 97,127, 64,178, 28, 98,223,240, 95,106, 86,119,173, 42,194,149,221, 41,
- 56,249,107,194, 95,218, 20,204, 2,240,180,172,231,220, 96, 48,104,105,154, 6, 73,146,224,112, 56,214, 62,129,151,254,250,235,
- 47,220,188,121, 19,176, 10,219,147,155,155, 75, 83, 20, 5,161, 80, 8, 0,210, 82,218, 59,112,185, 92,112,185, 92,156,187,122,
-222,249,147,143,187, 17,151,239,156, 66,139,144,129,200,204, 51, 32, 53,199,128,236,124, 32,184,209, 12,212,237,184, 31,119, 95,
-228, 34,180,126, 93,138,226, 75,134, 22,199,167,125,137,120,117, 28,250,102, 62, 96,106,232, 19, 68,199,174, 28,120,248,224,252,
-158,187,247,119,254,118,232,105,243, 70,173,213,133,198, 4,228,229,229,177, 4, 65,176,147, 70,127,251,124,235,136, 44,122,197,
-160,187, 12, 71, 39,124,246, 47, 54,245,126,174,174,174,151,157,157,157,207, 22,138, 35, 63,153, 76,118,201,211,211, 51, 26, 5,
- 11, 61, 14, 36, 39, 39, 7,169,213,234, 22, 40, 88,156, 21,155,153,153,217,190,208,242, 20, 91,138, 37,108,131, 74,165,154, 72,
-211,116,143,194,237, 35,154,166, 67,159, 60,121, 82, 39, 52, 52,244, 65, 64, 64,192,237,128,128,128, 99, 1, 1, 1, 7, 3, 2,
- 2, 14,182,107,215,110,153, 57,220,195, 91,158, 54,124, 77,139,188,103, 66, 11,133, 34,107, 93,225, 43, 44, 66, 11,192,185,162,
- 14,104, 38,129,224,190,105,252,120, 56, 30, 60, 8,238,147, 39, 24, 62,116,168, 92, 44, 22,175, 64, 65,140,166, 22, 82,169,244,
-215, 89,179,102,201, 92, 22, 46,132,215,249,243,136, 57,124, 24, 70, 46,247, 70,121, 74,167,209,104,192,225,112, 44,150, 24,137,
- 68, 2,154,166, 81,156,201,247,181, 7,208,132, 43,137,169,209,224,163, 42, 24,176,121,199, 85,173,175, 13,124, 62,195,237,176,
-202, 63,240,169,154, 23, 56,199,181,169,219, 10,191,150,215,212, 4, 39,143,239, 40, 68, 92, 92, 60,104, 48,118,205, 55,107,181,
-218, 28,181, 90,141,208,208, 80,231,155, 55,111, 86, 15, 9, 9,113, 42,124,255,250, 27,222,152,102, 94, 94, 94,187,189,189,189,
- 95,122,121,121,237, 6,208,204,142,239,110,184,112,225, 2, 40,138,194,172, 89,179,144,155,155, 11,131,193,128,204,204, 76,196,
-197,197, 65,175,215, 35, 33, 33, 1,143, 30, 61,130, 94,175, 71, 76, 76, 12,116,186,178, 7, 36, 12,195, 64, 46,151, 67,171,201,
-195,234,249,223, 97,230,180,201,200,121, 22,137,132,164, 84, 56, 58, 72, 48, 97,194, 4, 74,161, 80, 48, 12,195, 84,165,105,186,
- 35,195, 48,107,108,185, 79, 86,245,237,162,175,175,111,221,197,139, 23,215,249,110,254, 26,158,156,147,199, 10,100, 66,134, 47,
- 19,176,252,218, 77, 49, 98,198, 10,222,242,165, 63, 63,190,114,229, 74, 34,108, 11,222, 73, 2,184, 24, 22, 22, 86, 51, 49, 49,
- 49, 36, 40, 40,168,150,139, 95, 53,129,192,211, 59,155,231, 89, 69,197,234,180,215, 8,239, 42,173,214,172, 89, 19,117,233,210,
-165, 36,123, 56, 37, 18, 73,237, 45, 91,182,212,117,119,119,175,203, 21,137,132,249, 57, 57,187, 76,249,234,221,148,163, 66, 72,
-202, 29, 63,218,191,127,127,228,222,189,123, 83,236,225, 12, 12, 12, 12,154, 63,127,126,112,189,122,245,130, 61,252,171, 11, 68,
-222,190,153, 66, 31,191, 76, 81,189, 16, 1,124,170,118,254,245,215, 95,111, 95,185,114,197, 38, 78,138,162, 76, 36, 73,130,203,
-229, 66, 44, 22,227,248,241,227, 24, 63,106, 32,124,189,157, 81, 43, 40, 8, 29, 62,155,136,189,123,247, 90,124,120, 40,138, 42,
-177, 71,223,188,112,194,161, 48, 79, 34, 18,107,107, 71, 98,109,237,200, 48, 79, 34,178, 68,177, 85,248,121,113,199,216,212, 26,
-149, 48,221,104,131,216, 58,122,238,220,185, 69,195,134, 13,227,119,233,210, 5,215,174, 93,195,136, 17, 35, 46,238,219,183, 15,
- 0,112,237,218, 53, 76,154, 52,233,226,153, 51,103, 48,118,236, 88,180,111,223,158,127,225,194,133, 95, 97, 67,236, 31,147,201,
-132,141, 27, 55,194,100, 50, 65, 42,149,194,201,201, 9,221,186,117, 67, 84, 84,212,216, 77,155, 54, 69, 83, 92,238,167, 93,123,
-124,140, 35, 7,247,225,209,253,168,177,155, 23, 12,182, 59, 40, 48, 73,146,232, 50,116,104, 70, 70,112,176,114,179, 74,149, 63,
- 82,161, 16, 7,165,164, 56,253,189,123,183,139, 13, 66,141,160,105,218, 34,174,204,162,195,188,113,248,174,224, 72,234,130, 35,
-107,132,187, 79,121, 70, 94, 19,220,226, 55,194,195,210,226,103,113,249,228,136, 62,223,249,163,207,119,254,232, 57,181,218,112,
-113, 21,172,151, 84,193,184, 46, 95, 86,109, 23,208,200, 1,170, 52, 3, 14,255, 18, 19,171,205,196, 66, 0,143,108,121,206, 25,
-134,121,144,152,152, 8, 62,159,143, 42, 85,170,212, 4, 96,246, 11,220, 48,122,244,232, 47,230,204,153, 51, 25,192,156,194,247,
-164,237,218,181, 11,206,203,203,195,147, 39, 79, 0,224,102, 41,214, 96,203, 42, 67,165, 42, 70, 80,205,171, 30, 66,106,143,129,
- 66, 81, 31,137, 74, 61,146,148,122,172, 95,221, 11,145, 23,230,225,230,201, 33,136, 77, 73,129,200,163, 55,104,147,174,174, 13,
-131,122,175, 59,119,238, 16, 23, 46, 92, 32, 24,134,129,209,104,100,115, 85, 42,246,214,197,139,208, 68, 68, 16,114,185,156,104,
-217,184,117,222,230,121, 71,174,239, 95,117,241,166, 33,223,238,129,250,155, 96,230,243,231,207,155,237,222,189,187, 29,128,153,
-245,234,213,187, 18, 23, 23,215,252,252,249,243,181,124,124,124, 86,148,151,212, 28, 22, 34, 38, 38,230,149,173, 48, 44,132,190,
- 80, 52,116, 41, 20,115, 61, 1, 76,194, 27,172,178,183, 3,231,222, 99,103,248, 35, 40,178,218,176,168,208,178, 14, 20,134, 0,
-133, 66,102, 52, 26, 18, 78,157, 58,101, 32, 73, 18, 98,177, 24,195, 70,140, 32, 87,255,246, 91,171,129,205,154,157, 13,255,224,
-131, 99,103,207,156, 9,107,210,164, 9, 88,150, 5, 73,146,248,243,207, 63, 53, 90,173, 38,211,215,215,215,209,150, 70,195,250,
- 1, 82,169, 84, 22,161,149,147,147, 3,119,119,119,155,167, 14,213, 42,156, 62,115, 60, 50,139,165, 63,139,235,242,116,169,225,
-199,148, 94, 77,178, 25,154,147, 67, 27,145,163, 97,145,171, 5,231, 26,233,212,100, 88, 96,111,195,139,142, 77, 30, 69, 68, 95,
-206,212,210, 90,187, 86, 75,164,165,165,125,215,175, 95,191, 76, 79, 79, 79, 66, 46,151,195,219,219,155,236,217,179,103, 70,124,
-124,252,156,242,222, 17,103,103,231, 79,218,181,107,119, 40, 49, 49,177,111, 68, 68, 68,213,243,231,207,247,109,215,174,221, 33,
-103,103,231, 79,108,164,216,245,237,183,223,170,249,124, 62,154, 54,109,138,220,220, 92, 20,174,242, 41,117,179,101,138,148,199,
-227, 97,237,226, 31, 48,115,218,100, 40,163,175,225,238,197, 83, 56,151, 66, 96,198,252,159,193,227,241,202, 21,235,171,134,171,
-184, 94, 61, 47,217,195, 73, 35, 6, 36, 77,159, 54, 77,118,251,246,109,238, 23, 95, 78, 98, 99,146,149,224,119, 89, 66,161,205,
-119,228, 29,181, 43,186,126,212, 1,179,102,126, 93,175, 48,104,103,169,168,237, 42,174, 87,215, 75,246,224,235,240,129,207,191,
-252,242, 75,209,143, 63,254,168,109,214,172,153, 38, 53, 53, 85, 36, 81, 56, 5,113, 28, 28,235,198, 36,167, 72,155, 53,107,246,
-226,179,207, 62,203,182,151,115,198,140, 25,226, 19, 39, 78,112,250,245,235,103,202,202,202,146,114, 69,162, 80, 66, 32,108,156,
-158,149,229,208,183, 95,191,167,125,251,246,205, 47, 12, 88,106, 51,231,247,223,127, 47,126,244,232, 17,167, 89,179,102,198,148,
-148, 20,153,196,217, 37,132,114,116,106,244, 50, 57, 85,222,184, 73,147,103, 95,124,241,133,186,180,114, 90,139, 20,153, 76,150,
-216,162, 69, 11,252,242,203, 47, 88,190,124, 57, 58,119,238,140,168,251, 81,232,250,197,100,212, 25, 55, 9, 7, 47, 95, 69, 98,
- 98, 34,230,206,157,139,144,144, 16,240,120,188, 71,197, 62,143, 99,163,137,219, 41, 32,110,167,128, 32,198, 70, 19,230,253, 18,
- 45, 91,115,114, 96,125,124,113,199,221,252,190,120, 75, 87,152, 39, 17, 89,154, 31, 86, 89, 98,171,111,223,190,227,205, 33, 28,
- 70,142, 28,121,113,197,138, 21, 45, 71,142, 44, 24,104, 55,109,218, 20,243,230,205,107, 57, 99,198,140,139,243,231,207, 71,135,
- 14, 29, 16, 16, 16, 80,230,194, 23,154,166, 97, 50,153, 48,112,224, 64,152, 76, 38,164,167,167,227,241,227,199, 88,183,110, 29,
- 88,150, 21, 2,128,167,151, 79, 67, 62,159,143, 59,183,110,228,207, 28,217,228, 15, 59, 44, 89,132,245, 32, 38, 47, 47, 15,125,
-199,141,203, 72,168, 81, 67,185, 38, 35, 35,127,148, 66, 33,174, 22, 27,235, 36,211,235,189, 81,138, 95, 34, 65, 16, 96, 24,198,
- 34,172,204,130,171,232, 86,216, 81,218, 4, 67, 62,115,244,252,182, 36, 0, 64,235,193, 94,232, 57,181,218,112,207, 64,241,202,
- 86,131, 10,140,222,123,231, 61,103,115,147,232, 31, 97,196, 3, 59, 44,214,215,174, 93,187, 6, 71, 71, 71,244,235,215, 79, 64,
-146,228, 66,243,120, 21, 5,177,179,150,154,185, 4, 2,193,146, 33, 67,134,144,217,217,217,184,123,247, 46, 0,156, 41,169, 93,
- 98, 89,214,114,238,121, 74, 2, 52,195,199,165, 91,199,113,242,252, 30,188, 76, 76, 71,108,154, 22,224, 56, 64,171, 78,128, 65,
-147, 8,125,246, 45,168,116, 98,155, 10,204,227,241,210,235,213,171,199, 54,106,212,136,101, 89, 22,207,158, 61, 51,197,196,198,
-154,110, 44, 91,198,222, 27, 51,134,144, 61,126,204, 19,137, 68,132,191,191, 63,132, 66, 33, 35, 20, 10, 51,255,197,206,251,173,
-132, 91,120, 11, 97, 33, 42,210,170,197,226,253, 68, 50, 94, 93,109,104, 9, 96, 90, 92,192, 82,176,114,209,128, 61,191,174,118,
-232, 55,112,176, 58, 36, 36, 68,225,237,237, 13,130, 32,208,171,119,111,162, 93, 68,132,140,235,229, 5,231, 6, 13, 44,211, 17,
-167, 79,157,194,241,227,199,213, 71,254,218,239, 61, 98,212,168,238, 0,182,148, 82, 24,142, 64, 32,176,252,110,114,114, 50, 4,
- 2,129,197, 39, 66,165, 82,193,213,213, 21,201,201,201,182,102,190,222, 58,125,218,213,105,105, 77,190,243,111, 34,227, 18,199,
-212, 41,160, 89, 22, 92,130, 6, 52, 44,140, 52,160, 51,178,104, 88,141,114, 58,169, 49, 41, 14, 95,219,247, 2,192, 86,123,174,
-158, 78,167,251,251,246,237,219, 99, 24,134,217, 3,128,140,136,136, 96, 30, 60,120, 48, 30,182, 59,174,191,110,182, 23,139,167,
-158, 61,123,214,105,234,212,169, 89,135, 15, 31,206,233,214,173,155,195,186,117,235,156,218,183,111, 63, 53, 51, 51,115,167, 45,
-134,192,184,184,184, 45,241,241,241,227, 27, 53,106, 4,165, 82, 9,131,193,128,200,200, 72, 4, 6, 6,226,230,205,155,168, 89,
-179, 38,110,220,184,129, 90,181,106,129,166,105,104,181, 90, 48, 12, 67,151,213,152, 43, 51,210,129,204, 56, 36, 93, 59,134,199,
-247, 34,113, 54,137,192,170,157,135, 80,165,170,127,185,226,212,212,116, 19, 7,123,186, 58,159,252,113,246,247,110, 49,127,255,
-137,125, 27, 87, 49,231,142, 29,171,195,151, 97, 76,155,129, 19, 63,214, 27,225, 7,128,223,188, 73, 35,116, 81, 60,162,197, 85,
-145,114,246, 65,233, 1, 22,107,186,137,131,221, 93,156, 79,252,180,112,142,236,217,241,205,216,181,246, 23,118,239,182, 29, 33,
- 90,160, 73,112,112,112, 23,146, 36, 29, 1,104, 11,253,188,108, 74,109, 83, 28,231,233, 67,135,194,180, 64,147, 3, 7, 14,116,
- 17,139,197, 30, 0,140,249,249,249,207,223,132,243,204,225,195, 97,230,114, 18, 4,225, 6,192,192,178,236, 51,216,153,130,167,
-127,255,254,243, 38, 77,154, 52,141,166,105, 87,171,209, 57,181,100,201, 18, 14,195, 48, 20,203,178, 6,146, 36, 13, 39, 78,156,
-160, 77, 38, 83,146, 86,171, 29,247, 38,173,200,199, 31,127,140,171, 87,175,206, 70,193, 34, 12, 91,173,213,175,248,105, 21,166,
-236, 41, 55,127, 68, 68,196,220, 79, 63,253,116,250,206,157, 59, 31,175, 88,177,162,199,216,177, 99,241,231,159,127,162, 70,141,
- 26,184,115,231, 14,190,251,238, 59, 0,104, 57, 99,198,140,131, 27, 54,108, 8,136,137,137, 89, 98,131, 69, 3, 38,147, 9, 59,
-118,236, 64,175, 94,189,224,234,234, 10, 47, 47, 47, 16, 4,241,247,168, 81,163,126, 3, 0,138,160,120, 0,160,211,234,116, 65,
- 65,141,108,182,224,242,120, 60, 75, 91,151,146,146, 98, 89, 41,248,225,167,159,102,172,255,241, 71,252,161,209, 96,148, 66, 33,
- 78,240,241,241, 60,248,236, 89,248,253,130,198,153, 45,205,170, 83,150,200,178,213,165, 65,147,140,111,255, 90,240,210, 3, 64,
-231,214,131,189,208,122,176, 23, 26,245,116, 35, 72,138,192,189,147,153,136, 58,173,220,107, 84,225,111,216,151, 46,231,193,194,
-133, 11, 15,182,105,211,166, 71,237,218,181, 49,122,244,232,207, 54,110,220,200, 51, 26,141, 95,226,159, 48, 15, 14, 36, 73,206,
- 89,187,118,109,184,147,147, 19, 46, 92,184,128,243,231,207,255, 13, 32,174,164,118, 9,128, 37,102, 86, 21,223,154,218, 71, 49,
-121,226,180,196, 75,184,120,225, 47,212, 8,153, 8,145, 71,119, 56, 5,205,135, 33,122, 57,244,153, 39,225,228,219, 13, 9, 49,
-207, 64,113, 4, 81,101, 57,161,176, 44,123, 63, 33, 33, 33, 32, 32, 32,128,120,249,242,165, 9, 0, 75,211, 52,107,104,213,202,
- 88,231,199, 31,185, 81,159,125, 70, 52,127,244,136, 98, 9,130,137,140,140, 4,128,135,255, 69, 47,110, 14,183, 16, 21, 21, 85,
- 82,184, 5,187, 80,175, 94,189,150,231,207,159, 23,104,181, 90,156, 59,119, 14,141, 27, 91,214,118,253,167,209,239,173,181,200,
-123,134,240, 98,222, 91,247,138, 69,235,149,138,205, 16,220, 90, 53,107,210, 60, 18,155,122,117,239,158,127,251,246,109,203,168,
- 79,123,253, 58,212,199,143,131,166,105,176, 44,139,243, 17, 17, 24, 50,120,112, 30,151, 34,214, 87,171, 86,149, 37,216, 87, 98,
-183,116, 44,102,244,208,175, 95,191,126,150,198, 39, 62, 62, 30, 18,137, 4,124, 62, 31, 12,195,192,100, 50,129,162, 40, 56, 56,
- 56,192,100, 50, 21,103,130, 41,202,105,164,149,234,190, 27,186, 14, 74,246,202, 51,176, 99, 28,171,193,143, 39,178, 60,156, 30,
-114, 2, 61, 66,184,112,225,164,177,103,150,124,144,196,232, 50,251,226,245, 21, 93,101, 45,249,175, 89,191,126,253,223,134, 12,
- 25, 66, 2, 64,199,142, 29,201,250,245,235,175, 68,233,169,114, 74,229, 20, 10,133, 2, 0, 56,116,232,144,242,241,227,199,157,
- 15, 29, 58,164,180,126,223, 70,206,117,139, 23, 47,134, 88, 44,134,201,100,130, 94,175,183,248,103, 89,191, 26, 12, 6,184,184,
-184,224,200,145, 35,160,105,250, 72, 89,229,244,245,171, 10,194,181, 58,182, 28, 58,139,243, 25,188,242,136, 44, 11,103,117, 15,
- 73, 45, 15, 23,231, 83, 63, 45,152,235,154,245, 52, 18, 9, 9, 9,236,137,227, 71,174,104,129,196,156, 92,204,204, 86,163,150,
- 70, 15, 97,227, 0,196,157, 90,251, 13, 59,163, 53,140, 40,126,213,160,133,179,142,135,164,150,183,171,243,137,159,127, 90, 32,
-203,126, 26,137,228,148, 20, 28, 61,114,232,182, 22, 48, 79, 55, 14,103, 24,166, 46,195, 48,117, 1, 12, 47, 69,188,216,197,153,
-159,159, 95, 47, 63, 63,191, 94, 69,114,178, 44, 91,143,101, 89,155, 57,173,125,162,150, 46, 93, 26,157,156,156, 60, 36, 45, 45,
-173,147,121,203,202,202,234,152,151,151,215, 54, 63, 63,191,149,102,105, 85,135,252,252,124,183,188,188, 60, 79,173, 86,219, 16,
- 64,164, 29,117,222, 2,235,168,211,201,201,201,179,146,147,147,137,178,202, 73,141,139, 38,182,255,252,245, 95,107,215,174,245,
-124, 67,254, 87,202,153,145,145,177,103,231,206,157,161,254,254,254, 1,195,135, 15,199,154, 53,107,176, 98,197, 10, 29, 0,108,
-216,176, 65,103,101,201,242,141,137,137,105, 84,194,180, 97, 71, 43,107,201,214, 15, 63,252,144, 61,127,254, 60,122,245,234,101,
- 9, 36,250,251,239,191,195,100, 50,169, 58,116,232,192, 0,128, 70,155,175, 98, 25, 22,122, 67,137,243,239,175, 93, 79, 62,159,
-255,145,117,188, 64,115, 48,102, 62,159, 15,150,101, 81,171,101,203,140,236,144, 16,229,198,156,156,252, 89,245,234,201,195,131,
-130,134,215, 6, 6, 23,199, 73, 16,196, 43, 86,157,162,155, 29,150, 44,235,114,166,105,146, 48,250,175, 5, 47,143,155, 45, 91,
- 66, 41, 7,218, 92, 19,246,255,248, 50, 93,155,142,223, 75, 18, 63,165,157,187, 82,169,252,226,199, 31,127,212, 41, 20, 10,124,
-252,241,199,152, 63,127,254,168,150, 45, 91,230,184,185,185, 93,173, 81,163,198,189, 1, 3, 6, 36, 71, 70, 70,126,209,174, 93,
- 59, 60,121,242, 4, 63,255,252,115,118, 86, 86,214,160,210, 56, 9,130,176, 88,242,122,118,237,168, 92,189,242, 23,166, 67,155,
-241, 16,139,228, 48,114,125,161,204, 51, 34, 75,205, 66, 47,104, 2, 62, 79,128, 78,205,130,113,245,196,230,124, 90,175,222, 82,
- 86,157,207,203,203,219, 59,108,216, 48, 21,143,199,131, 94,175,103,185, 92, 46, 4, 5,126,199, 12,183,115,103, 67,243, 7, 15,
- 76, 52,203, 50, 4, 65,224,171,175,190, 82,103,101,101,237, 44,207,115,100, 7,172, 57, 43, 42,220, 66,199, 34,253, 79, 69,132,
-133,120, 27,231,254, 62, 99, 93, 49,219, 63, 22, 45,243,146, 74,243, 43, 65, 48, 52, 77, 51,168,230, 95, 77, 22,243, 50,110, 85,
-255,254,253, 70,118,233,210, 85,220,181,107, 87, 97,112,116,193,104,244,208,161, 67,216,183,111, 95,254,201,147, 39, 85, 2, 46,
-181,193,183,138,175, 59, 77, 51, 32, 8,166, 84, 53, 44,147,201,190,252,246,219,111, 69, 57, 57, 57, 88,177, 98, 5, 19, 26, 26,
- 74, 74, 36, 18, 24, 12, 6,108,216,176,193, 24, 28, 28,204, 37, 73, 18, 57, 57, 57, 32, 73,242,145,141, 39,120, 55, 39, 46,177,
-211,111,237,250,236,107,244,249, 8,231, 58,237,154, 43,218,250,122,195,216,128, 69, 82,252, 75, 60, 62,115, 50,235,254,137,101,
-153,208,166,246, 65,217,233,129,138,235, 8,126, 56,121,242,164,219, 23, 95,124,193,106,181, 90, 34, 46, 46,142, 93,176, 96,129,
-219,232,209,163,127, 72, 74, 74,250,164,156, 55,133,200,206,206, 6, 65, 16, 76, 97, 67, 98, 30,245,219, 51, 47, 23,181,101,203,
-150, 3,189,123,247,238,217,161, 67, 7, 68, 71, 71, 91,166, 8,173,133,150,121,245,225,194,133, 11,179, 1, 76, 47,139,148,203,
-229, 98,197,150, 61,200,206,202,128,187,187, 23,132, 34, 17,202,187,194,146, 79,146,179, 22,205,253,222, 45,227,225, 85, 34,234,
-202, 89,102,247,221,212, 52, 19,205, 22, 31,241, 63, 55,137, 45, 84,255,165,143,102, 72,106,214,162, 5,115, 28,204,211,154, 59,
-111, 37,171, 8,154,253,226,141, 30,145,247,133,243, 95,134,151,151, 23,146,147,147, 9, 47, 47, 47,182,208, 71,139, 45, 69,104,
-189, 90,193, 11,166,203,136,210,166, 13,203,203,255,226,197,139, 5, 13, 26, 52,248,250,201,147, 39,187,235,212,169, 51, 22, 64,
- 21,157, 78,151, 61, 99,198,140,159, 54,108,216, 48,210, 22, 75, 22, 0,252,249,231,159,203, 70,140, 24,113,188,123,247,238,223,
- 48, 12, 83,223,170, 99,127,225,230,230,102,153,194, 77, 79, 77,153, 54,102,228,192,105,121,121, 89, 54,199,185,147, 74,165,225,
- 51,102,204, 16,170,213,106,252,250,235,175, 76,112,112, 48,105, 30, 20,109,219,182,205, 84,179,102, 77, 78,191,241,227, 51,150,
-166,164, 96,222,133, 11,234,105,117,235,134,110,124,252,184, 33, 24,102,107, 73, 86,157,226, 44, 89,102,183,139,114, 34,169, 80,
-108,253, 14,160,115,243,254, 30, 56,176,248, 37,178, 98,244, 63,193,132,103,176, 33, 45, 80, 49, 72,216,187,119,111,167,212,212,
-212, 3,223,127,255,189, 67,195,134, 13, 81,183,110, 93,174, 84, 42,109, 98, 14, 23,147,147,147,131,211,167, 79, 99,205,154, 53,
-250,251,247,239,247, 46,109,186,138,166,233,180,154, 53,107,154,175, 3, 75, 16, 68,166, 74, 71, 56,236,170,221, 68, 58,124,204,
-110,226,226,141,203, 72, 50, 48,208, 25, 25, 84,243, 15, 67,219,206, 75,113,240,216, 61, 58, 41,230,193, 3,163, 38,107,189, 13,
-229,125,246,244,233,211,253,115,231,206,237,255,205, 55,223,136, 50, 50, 50,104,157, 78,199,236,217,179,135, 26, 62,124, 56,205,
-114, 56, 12,143,195,193,151, 95,126,169,201,206,206,254, 11,248, 87, 19, 76,191,149,112, 11,111, 33, 44, 68,133, 89,179,172, 95,
-255, 87, 80,236, 19,202, 80,228,165, 53,107, 87,127,244,231,142,157, 30, 20, 69,122, 60,123,254,252, 70,143, 62,125, 19, 79,157,
- 58,229,196,115,112,104, 12,128,209,143, 29,123,197,160,211, 40, 15, 31, 56,224, 87,173, 90,213,144,194,164,210, 44, 67,145,151,
- 74,251,193,188,188, 60,245,133, 11, 23,242,167, 79,159, 78,196,199,199,111,119,119,119, 31,112,236,216, 49,105,159, 62,125, 52,
-209,209,209,123, 61, 60, 60,122,182,107,215, 78,246,245,215, 95,235,242,242,242,236, 73, 60,250,128, 77,207,170,125,253,251, 37,
-159, 94, 95,188,250, 3,112,168, 22,208,113, 1,198,120, 9,134,220, 83, 0,182,195,142,120, 71,214,144, 72, 36, 33, 98,177, 24,
-183,111,223,206,106,210,164,137, 94,171,213,242,230,207,159,239, 44,145, 72, 66,202,123,225, 89,150,101,179,178,178,192, 48, 12,
- 7, 0, 81,248, 10,198,254,181,248,159,244,232,209,227,192,174, 93,187, 62,236,218,181, 43, 2, 2, 2, 96, 52, 26, 81,179,102,
- 77,232,245,122, 4, 6, 6, 66,167,211, 97,246,236,217,200,201,201,153,140, 82,114,158, 17, 4, 1,147,201,100,113,182,245,246,
-241, 43,136,211,243, 6, 97, 44, 36, 92, 50,224,209,225,141, 72,203,204, 96,118,221, 73, 77,205, 55,208,157,158,166,231,223, 47,
-122, 92, 62, 13,117,187,225, 19, 18, 1, 64,199,148,158,113, 94,194, 71,192,227, 35,191, 35, 53, 45, 3,127,222, 74,206, 86, 27,
-152,206,143,139,225,180,171,156,239, 9,103,216,236,104,244,157, 96,251,177,111, 2, 91, 5, 85, 73,184,157, 2,226,166,120, 35,
-139,181, 27,139,141,145,245,134,252, 7,158, 60,121,114, 0, 0, 30, 60,120, 16, 63,112,224,192,105, 47, 95,190,156, 11,224,104,
- 76, 76,204, 90,123,136, 54,110,220,248, 4,192,136,210,142,217,185,100,196,126, 0,251,237,225,205,205,205,213, 70, 70, 70,106,
-191,254,250,107, 34, 62, 62,254,152,135,135,199,135,199,143, 31, 23,247,233,211, 71, 23, 21, 21,117,198,203,203,171,117,199,142,
- 29,165, 71,175, 93, 75,204,127,246,236,240,225,151, 47,125,140, 12,115,184,180,231,179,130, 69,214, 43, 98,107,255,188,151,139,
- 14, 44,122,217,145,209, 97,175, 62, 11, 87, 0, 36,188, 1,231,249, 75,151, 46,213, 25, 60,120,240,174,110,221,186, 53,175, 83,
-167, 14,170, 84,169,130,199,143, 31, 35, 61, 61, 29,119,239,222,197,161, 67,135, 14,105,181,218, 50, 19,106, 43,149,202,215,211,
- 19, 9,157,188, 54,255, 58,235,208,141,139,141,107,182,234, 58, 76, 84,215,139,129,222,192, 34, 62,246, 25,102,207, 92,159,159,
- 28,251,228,129,193,100,232, 13, 27, 23,234,104, 52,154,117,203,151, 47,231, 30, 62,124,184,235,170, 85,171,100,126,126,126, 20,
-143,199, 35, 1,176, 55,111,222,100, 39, 76,152,160,206,200,200, 56,162, 82,169,214,253,203,125,244,249,231,207,159,135, 81, 20,
- 85,161,225, 22,222, 32, 44, 68, 37, 42, 18,254,254, 62,117,170,251,121,141, 13,168,226, 51,222,223,207,119,104,113, 78,238, 1,
- 10,133,204,191,170,119,120, 64, 21,159,241,213,253,188,198,250,251,251,212,177,193,180, 24, 32,151,203,143,121,122,122,134, 2,
-128,131,131, 67, 79, 71, 71,199,251, 14, 14, 14, 61, 11, 71,129, 61,165, 82,233,195,224,224,224,209,255,162,185,178, 84,206,154,
- 53,107, 14,204,203,203,251,172,102,205,154, 3,205,251,207,158, 61,179,236,151,135,211,215,215,183,195,205,155, 55, 63, 89,178,
-100,201,199, 53,106,212,232,185, 96,193,130,143,255,250,235,175, 79,124,124,124, 26,150,131, 83, 0,224, 15, 46,151,155,202,231,
-243,211,184, 92,110,170,121,227,112, 56,169, 20, 69,165, 2, 88, 91,130,181,172,163,213, 40,231,162,187,187,123,140,187,187,123,
-140,135,135, 71,140,135,135, 71,140,167,167,231,107,155,139,139,203, 69, 91,175,103,144,135,180,101,147, 42,178, 75,245, 60,165,
- 23,107,187, 75,130, 42,226, 30, 5,121, 72, 91, 54,174,226,112,169,158,167,236,194,255, 55,206, 80, 15,176,236,154, 32,150, 93,
- 19,196,134,122,128, 45,107,191, 34,205,254,158,158,158,172,167,167,231,172,183, 53,149, 80, 2,255,191,254,188, 87, 32,103,128,
- 76, 38,219, 89,165, 74, 21,115, 91,215, 93, 46,151,255, 45,149, 74,187, 23,182,117,221, 37, 18, 73, 68,112,112,240,176,178, 56,
-157,156,156,110,186,185,185,165, 20,110,201,238,238,238,201,238,238,238,201,110,110,110, 73,110,110,110, 73,174,174,174,137,230,
-205,209,209,241,106, 57,207,221, 13, 64, 83, 0, 13, 1,200, 43,240,122,250, 3, 24, 83,216, 6,253, 8, 96, 52,128,250, 21,112,
-143, 8,174,200,105,156,192,209,247, 18, 87,234,154,203,149,186,230, 10, 28,124, 46,149,146,130,199, 22,206, 90, 78, 78, 78,243,
-229,114,249, 95, 50,153,236,130, 76, 38, 59,224,226,226,178, 0, 64,173,255,168, 46, 73, 1,108, 64, 65,124,166,163, 40,152, 10,
- 63,128,130, 69, 5,126,239, 96,157,255,255,140,240, 98, 12, 42,248, 55,162, 64,117,172,228,172,228,172,228,172,228,172,228,172,
-228,124, 15, 57,201,202,235, 89, 41,180,236, 20, 90,175,108,102,161,197,169,188, 54,149,168, 68, 37, 42, 81,137, 74,188, 6,166,
-242, 18, 84,194, 78, 20, 59,181, 76,148,162, 74,237,137, 53, 85, 30,101,123,186,146,179,146,179,146,179,146,179,146,179,146,179,
-146,243,255, 29,231,255, 11,252, 91,201, 99, 42,205,170,149,156,149,156,149,156,149,156,149,156,149,156,149,156,255,235,168,156,
- 58,172, 68, 37, 42, 81,137, 74, 84,162, 18,149,120, 75, 88,103, 37,184, 94,153, 66,172, 20, 90,246,131, 4,240, 25,128,190, 0,
-170,163, 32,155,253, 30, 0,191,161,124,115,250,114, 0,211, 0,180, 64,193,234,156, 23, 0, 46,160, 96,117, 78, 94,229,229, 46,
- 30, 46, 46, 46,223,114,185, 92, 71,160, 32,181,137,249,213,250,127,154,166,179, 85, 42,213,130,183, 84, 4, 10, 54, 70, 80, 54,
-151,213,186,108,214,175, 70,163,241,109,150,179, 18,239, 38,106, 58, 57, 57,253,161, 84, 42, 7,193, 42,201,114, 37, 42,241,191,
- 0, 87, 87,215,177, 6,131, 97, 6,143,199,155,159,158,158,190,250,255,209,169,191, 38,178, 94, 17, 90,135, 15, 31,142, 0,128,
-110,221,186,181, 1, 0, 71, 71,199,203, 36, 73,250,219,243, 11, 12,195,188,200,206,206, 46, 49,128,154,163,163,227,101,138,162,
- 94,227, 52, 26,141, 50, 14,135,147, 91,220,119, 76, 38, 83,130, 74,165,106,248,142, 92, 68, 2,192, 97,133, 66,161,157, 59,119,
-238,111,109,219,182,245, 77, 74, 74, 50, 77,157, 58,181,245,157, 59,119,186, 2,248,200, 78,177,213,140, 32,136,205,161,161,161,
-251,135, 14, 29,186,171, 73,147, 38,252,204,204, 76,217,158, 61,123,188,183,108,217, 18,201, 48,204, 32,148,146,104,245,125, 4,
-203,178, 37,230, 74, 44,237,179,162,224,114,185,142, 9, 9, 9, 50,243,247, 10,133, 21,140, 70, 35,140, 70, 35,212,106, 53, 66,
- 66, 66, 42,188,252, 30, 30, 30, 97, 4, 65,172,146, 74,165, 13,243,242,242,110, 0, 24,159,156,156,124,199,158,178,154, 76, 38,
-176, 44,107, 41,103,157, 58,117, 42, 91,102,251, 48,138,207,231,119, 14, 12, 12,108,172,211,233,178, 94,188,120,113,157,166,233,
-239, 81,113, 57,218, 28, 0,124, 47, 16, 8,154, 84,175, 94,221,247,201,147, 39,241, 6,131,225, 26, 10,146, 33,231, 84,132,200,
-106,211,166,205,197, 95,127,253,213,121,220,184,113, 23, 47, 92,184,208,178, 82,108, 85,226,191,130,175,175,175,163, 90,173, 94,
- 15, 32,140,203,229,122, 8,133, 66,136, 68,162, 20,129, 64,112, 91, 36, 18,141,188,116,233, 82,182,189,156, 52, 77,127, 31, 19,
- 19,227,209,180,105,211,197,110,110,110,179, 51, 50, 50,180, 6,131,225, 76, 86, 86,214,100, 0,170,210,190, 91, 84,139,188,103,
- 34,203,250, 21,102,209,197, 41, 60, 49, 22, 64,219, 87, 20, 24,135,227, 19, 27, 27,235, 38, 20, 10,193, 48,140,165, 51, 43,186,
-153,223,215,235,245,168, 91,183,174,161,140, 14,199, 55, 62, 62,222,141,207,231, 91,222,211,235,245,240,246,246,102, 18, 18, 18,
-220, 10,211, 30, 88,160,211,233,224,227,227,243, 46,229, 60,250,204,201,201, 41, 39, 46, 46, 62, 68,171, 51,204, 25,253,197,244,
-111, 7,245,253, 64,113,249,242,101,230,163,143, 62,210, 69, 68, 68,124,134,130,196,169, 54, 53,230, 4, 65,108,153, 58,117,234,
-108,161, 88,238,124,246,242, 3,221,150, 61, 71, 18, 67,107, 86, 35, 38, 79,158, 76, 77,152, 48,225,124, 88, 88,216, 31, 12,195,
- 52,128, 29,150, 45,133, 66,113, 92, 32, 16, 84, 45,188,126,113, 89, 89, 89, 31,190, 75, 53,177, 80, 72,113,240,122,240, 88, 14,
- 65, 16,118, 7,148,205,204,204,132, 70,163,121,109,171, 83,167,206,219,112, 68,228,112,185,220, 3, 11, 23, 46,244, 78, 73, 78,
-198, 47, 75,151, 54, 69,129, 37,179,169, 45, 95, 78, 75, 75,123,173,156, 65, 65, 65,168,132, 93,152, 54,123,246,236,133,159,126,
-250, 41,104,154,134, 70,163,241,122,250,244,105,240,140, 25, 51,122, 63,123,246,172, 49,128,231,111, 58, 24, 15, 12, 12,140,158,
- 56,113,162, 83,227,198,141, 81,152,165,194,235,194,133, 11, 77, 55,108,216, 48, 36, 46, 46, 46, 8, 64,250,155,252,128,147,147,
-211, 31,191,255,254,187,179, 88, 44,198,193,131, 7,157, 59,116,232,112,225,214,173, 91,173,222, 64,108,145,206,206,206, 19, 0,
-180,103, 24,134, 15,224, 90, 86, 86,214, 60,216, 31,213,221, 83, 42,149,238, 37, 73,178,154,213,179, 10,146, 36, 93, 8,130,200,
- 48,191, 71, 16,132, 27,195, 48, 87,148, 74,101,243,202,234,248,126,195,217,217,121, 84,106,106,234,175, 2,129,128,167, 80, 40,
- 32, 22,139,193,225,112,192,225,112,170, 8, 4,130, 42, 2,129,160, 75,187,118,237,198,255,253,247,223,165, 70,216,111, 22,234,
- 62, 28, 36, 49,135, 34, 72, 10, 0, 72,174, 68,238,224,224,128, 57,115,230, 72,122,246,236, 41, 1,128,139, 23, 47, 14, 29, 54,
-108, 88,135,132,132,132,186, 37,137,173,226,180,200,123,132, 18,131,217, 90, 39,149,142,120,229,201, 37, 73,240,249,124, 92,189,
-122, 21,182, 4, 43, 55,167, 72, 40,181, 53, 40,140, 48,126,231,206, 63, 6, 0,115, 71,195,231,243,113,233,210,171, 65,229,155,
- 53,107,102,179,133,163,162,208,183, 78, 65,144,199,221,159, 23,148,171,223,170,130,232,218,187, 63, 15, 66,235,159, 99,209,119,
-194,172, 1,249, 90, 67, 35, 0,234,236,172,172,172, 27,251,246, 37,133,214,172,201,251,227,143, 63, 26,123,123,123,247,181, 67,
-104, 77,107,208,160,193, 94, 74,228,224, 50,116,216,240,161, 35, 57,164, 97,200,152,175,231,199, 39,103,168,195,195,195,247, 29,
- 60,120,112,232,162, 69,139, 30, 78,153, 50,101, 26,128,239,108, 45,191, 80, 40,172,250,232,209,163, 64,154,166, 81,167, 78,157,
-119, 49,141, 65, 40, 10,130,239,125, 10, 96, 71,225,123, 3, 81, 16,185, 63, 12,192,109,123, 44, 91,102, 11, 86,113, 91, 69,195,
-219,219, 59,104,240,224,193, 46,202,140, 12,252,178,116,169,249,237,134, 40, 99, 26,209,252,252,232,245,122,124,252,241,199,131,
-105,154,230,152, 69,160, 78,167,211,231,228,228,104,241,143, 99,105, 58,128, 15,108, 40,142,191, 68, 34,249, 9, 64,152, 70,163,
-241, 6, 0,137, 68,146,200, 48,204,126,181, 90,253, 29,254, 73,224,107,247, 0, 23, 64, 48, 74, 78, 5,197, 46, 92,184,240,201,
-244,233,211,159,255, 7,156, 85,221,221,221, 23,244,235,215, 15, 71,142, 28,193,209,163, 71,141, 34,145,136, 51,108,216, 48, 98,
-252,248,241,138,137, 19, 39,118, 1,176,252, 13,111,115,151,217,179,103, 59,213,174, 93, 27,123,246,236,193,221,187,119, 53,129,
-129,129,162,182,109,219,130,195,225, 56,125,251,237,183, 31, 1,216,252, 38, 63,160, 84, 42,231,125,253,245,215, 91,118,236,216,
- 33,123,241,226, 5, 86,173, 90,229, 50, 96,192,128,136,184,184,184, 54,118,136, 45, 1,128, 9, 0,218, 81, 20,213,106,216,176,
- 97,166, 47,190,248,130, 75,146,164,113,233,210,165,174, 27, 54,108, 24,192,229,114,195, 50, 51, 51,109, 25,164,145, 0,230,140,
- 28, 57,114,196,223,127,255,173,184,126,253, 58,223,217,217, 25, 52, 77, 91, 44,197, 12,195,184,153,235,172,201,100, 66, 80, 80,
-144,143,213,247, 69,239,171,208, 32, 73,210,192, 48, 12, 23,128, 16,128,174,172,253,255, 37,145,229,228,228, 52, 78,169, 84,254,
-230,225,225, 1,119,119,247,215,218, 92,157, 78, 7,161, 80,200,243,240,240,248,189,103,207,158,220, 3, 7, 14,148, 56, 5, 72,
- 80,196,247, 7,119,206,245,118, 82,200, 0, 0,203,214,156,200, 7,128,191,254,250, 11, 73, 73, 73, 80, 40, 20,168, 91,183, 46,
- 53,119,238, 92,207,201,147, 39,255,146,149,149, 53,178, 36,174,162, 90,228, 61,179,104,173, 43,110,191, 84, 31, 45,150,101, 45,
-121,242,108,172,180, 69,223, 58, 93,132,143,208,235,245, 40,106,209, 50, 63,188, 92, 46,183,168,249, 17, 4, 65,176,165,113, 22,
-131, 97, 18,137, 36, 68,173, 86,175,180, 99,116,107,225,220,253,121, 16,182, 8,166, 14, 52,103, 34,237,242,117,193,235, 22, 0,
-151, 95,142, 92,245,107,155, 54,222, 19,102,174,152,165,201, 76,202,248,118,112,247,170,129, 30,206, 34, 73,118, 90,142, 83,173,
- 90,157,138, 88,105,202, 42,103,235,161, 67,135,110, 61,121, 53,134, 16, 10,121, 60, 14, 69,113, 91,214,171,233,236,235, 64, 57,
-200, 0,135,248,231, 79, 46, 15, 31, 62,188,222,148, 41, 83, 90,217,193,137,194, 14, 23,219,182,109, 3, 65, 16,164, 61,231, 94,
-129, 40,122,223,205, 15,113, 40,128, 91,133,251,219,173, 58,149,237,133,239,221, 50,139,173, 98,172, 94,167,139,138, 23,243,244,
-155,209,104,196,176, 97,195, 6,155, 76, 38,142, 85, 35, 81, 84,192, 20, 39, 98,108, 58,119, 79, 79,207,147, 0, 62, 32, 8, 2,
-122,173, 86,255,211,207, 63, 91,127,124,179,136,200, 58, 93,210,179,100, 52, 26, 65,211, 52,231,214,173, 91, 92,171,186,206, 5,
- 32, 1,224,194,178, 44, 72,146,188,103,195, 61, 10, 18,139,197,151, 15, 29, 58, 36,111,216,176, 33,193,231,243, 97, 50,153, 16,
- 21, 21,229,187,104,209,162, 49,167, 79,159,254, 72,173, 86,215,193,235,201,211,109,185,239,193, 23, 46, 92, 80, 7, 4, 4, 20,
- 43, 28, 85, 42, 21,167,102,205,154,109, 74, 16, 69,111,155, 51, 33, 53, 53,181,215, 7, 31,124, 48, 54, 37, 37, 37,218,100, 50,
-125, 3,160,174,139,139,203,173, 62,125,250, 64, 36, 18,181,211,104, 52,203,223,164,206,187,185,185,245,108,222,188, 57, 86,173,
- 90,133, 69,139, 22,117, 4,112, 6, 64, 7,149, 74,117,186, 71,143, 30,112,116,116,236,149,157,157,189,249, 13,158,163,154,173,
- 91,183,254,125,206,156, 57,178, 35, 71,142, 32, 48, 48, 16,185,185,185,248,234,171,175,220,126,248,225,135,115,217,217,217,109,
-173,158,139,146, 56,235, 8, 4,130,205, 59,118,236,144, 6, 4, 4, 4,240,120, 60, 50, 32, 32, 0, 74,165, 18, 90,173, 86, 48,
-127,254,252,122, 34,145,232,206,242,229,203, 55, 3,232, 83, 70, 57, 73, 0,243,214,174, 93, 59, 54, 60, 60,220,113,240,224,193,
-180, 94,175,199,174, 93,187, 64, 81, 20,184, 92, 46,196, 98,177, 37,121, 53,143,199, 67,173, 90,175, 5, 73, 63, 88,202,249,230,
-160,192, 15,213, 17,246, 77,187,158, 46,133,207, 50,245,193,229,114, 33, 20, 10, 33, 20, 10, 33, 16, 8,240,232,209,163,153, 66,
-161,112,105, 9,214,241,215, 56,137,127,212, 69, 8,128,235,101,237,227,117,215,144,183,222,126, 22, 3, 31,130, 32,150, 1,104,
- 87,208,237,146, 17, 46, 46, 46, 95,166,166,166,198,218,202,233,233,233,233,156,153,153,185,220,211,211, 19,238,238,238,150,254,
-219,219,219, 27, 70,163, 17,169,169,169, 96, 89, 22,217,217,217, 16,139,197,240,242,242, 90, 30, 30, 30,190,103,221,186,117,153,
-197,114, 50, 88,212, 99,192,140,239, 41,138, 34, 1,128,226, 72,165, 19,167, 3, 85,171, 86, 69,203,150, 45,161,213,106,145,147,
-147,131,224,224, 96, 14, 65, 16, 67, 9,130,144,179, 44,187, 26,192,217,255, 65, 67, 97,137,206,240,179,139,206,139,154,179,197,
-243,120, 60,155,132, 86,225,241,101,153, 33, 72,163,209, 8, 30,143,247,138, 69,130, 32, 8,208, 52,253,202,251,102,161, 85, 30,
-161, 62,126,252,120,230,247,223,127, 31,155,149,149,181, 6,229,156, 74, 24, 58,116,232,107,254, 30,147, 39, 79, 78, 72, 75, 75,
- 99, 63,238, 20, 34,137, 62,150,148, 92, 93, 33, 21,185,202,100,213,132, 10, 39,199,204,204,204, 43,133,141,137,173,168,209,160,
- 65, 3,209,150,125, 23, 18, 70, 79, 90, 56,183, 97,128,179,188,190,143,139,194,195, 65,196,151,146,132, 90,104, 50, 38, 56, 57,
- 57, 5,218, 91,110,115,187, 32, 22,139, 65,146,228, 59, 97,209,178,154, 46,188,197,178, 44,148, 74, 37,142, 28, 57,130,174, 93,
-187,222, 50,139, 16,149, 74,133,228,228,100,120,122,122,222, 42,180,124,148, 57,141,200, 48, 12, 12, 6, 3, 12, 6,131, 69,192,
- 88,213, 33,139,128, 49, 31, 75, 81,212,189,114,158,194, 92,133, 66,209,186, 93,187,118,252,157,187,118,241, 89,150, 85,163, 32,
-135, 90, 30,203,150,144, 32,187, 8, 76, 38,147,197,202,198,229,114, 17, 23, 23,103,233,184,204,185, 37,133, 66,161,109,166, 12,
-129,224,235, 63,255,252, 83,222,184,113, 99, 34, 51, 51, 19, 12,195, 88, 26,201,223,126,251, 77,216,183,111, 95,239,200,200,200,
-111,117, 58,221,236,242,220,174,146, 4, 17, 0,200,229,114, 19,108,139,152, 93, 38,167,201,100, 34, 90,180,104, 49, 37, 35, 35,
-163,158, 70,163,153,111,203,101, 4,112, 48, 33, 33,193,186, 99,191, 19, 29, 29,173,233,223,191,191,168, 90,181,106, 77, 30, 60,
-120,240, 70,117,181,102,205,154,205,184, 92, 46,174, 93,187,166, 3, 96, 30, 89, 71,220,189,123, 87,215,167, 79, 31,129,175,175,
-111,179,236,108,155, 93, 86,106, 6, 5, 5,157,114,115,115, 19,153,219, 80, 87, 87, 87,238,186,117,235,100,137,137,137, 48, 24,
- 12,152, 54,109, 26,186,117,235, 6, 23, 23, 23, 76,158, 60,217,125,241,226,197,127,228,229,229, 53, 40,205,104,205,231,243,183,
- 62,125,250, 52,208,211,211, 83,116,245,234, 85,212,175, 95, 31, 25, 25, 25, 72, 73, 73, 65, 94, 94, 30, 82, 82, 82, 48,114,228,
- 72,183, 95,126,249,197,203, 6, 75,150, 69,100,173, 91,183, 46,123,239,222,189,212,250,245,235,101, 92, 46,215, 34,180, 56, 28,
-142, 69,104,153,115, 43,150, 99,166, 33,187, 80,180, 57,230,228,228,228,188,193, 45, 18, 0,224, 91,139, 44,129, 64, 0,129, 64,
- 0,161, 80,248, 70,121, 89,223, 19,120, 19, 4,241,128,199,227, 9,196, 98, 49,143, 36, 73, 8, 4,130, 78, 78, 78, 78,247,235,
-214,173, 91,247,212,169, 83, 49,182,144,104,181,218,173, 2,129,128,235,230,230, 6, 0, 8, 12, 12, 68,253,250,245,161, 86,171,
-153,156,156, 28, 56, 58, 58,146,177,177,177,208,104, 52, 72, 78, 78,134,159,159, 31,151, 36,201,173, 40,240, 67,126, 13,151,111,
-165,172, 1,176,198,188,239,226,226,146,106,109,233, 20, 10,133,240,246,246, 70, 98, 98, 34,100, 50, 25,245,195, 15, 63,244,217,
-181,107, 87,239,203,151, 47, 15, 5,176,205,138,106,246,123,236,163,101, 22, 89,214,175,255, 8,173,110,221,186,205, 58,124,248,
-112,155,226, 70,225, 92, 46,183,194,124, 93,204,130, 74, 46,151, 23,181, 90,129, 97,152,146, 44, 90,118,255,142, 80, 40, 20,141,
- 27, 55, 46,119,245,234,213,118,139,173,126,171,162, 45, 86,172,215,134,145,117,234, 92,254,246,219,111,123,254,253,247,223,137,
- 13, 3,170,113, 36, 73,177,121, 66,185,163, 35,124,170,116, 29,214,171,207, 93, 20,172, 62,180, 21, 79,115,115,115, 69,213,125,
-196,122,146,212, 18, 85, 4, 28,153,167,132, 39,240, 80, 40,188,121,122, 93,154, 92,161,224,235,116,186,108,148,146, 4, 26, 0,
-220,221,221, 79,136, 68, 34, 63,243,190, 66,161,112, 96, 89, 22, 98,177, 24,158,158,158, 82,138,162, 30, 91, 61, 92,177,169,169,
-169,157,202, 42,152,163,163,227, 9,129, 64,224, 71,146, 36, 8,130, 0, 69, 81, 32, 73, 18, 36, 73, 90,254,167, 40, 10, 4, 65,
- 32, 63, 63, 63, 54, 38, 38,166,147, 13,231,107, 2, 16, 70, 16,196,173, 35, 71,142,160, 73,147, 38, 56,118,236, 24, 58,119,238,
-140,156,156, 28, 68, 69, 69,161,117,235,214, 0,240,169,173,247,220,218,249,221, 60, 40,120,244,232,145, 69,184, 88,111, 50,153,
-236, 77, 76,236, 23,251,245,235,135,223,127,255,157, 45, 28, 76, 72, 8,130,168,239,224,224,240,232,225,195,135, 54,249,193,176,
- 44, 11,131,225,159, 67,205,157, 87,161, 63,132, 93,201,129, 41,138,234,212,160, 65, 3, 34, 39, 39,199, 44, 32,193,225,112, 64,
- 81, 20, 40,138,194,175,191,254, 42,106,220,184,241, 12,129, 64, 48,133,199,227,169,140, 70,227, 78,173, 86, 59, 31, 64,246,187,
-212, 34,181,106,213,106, 82,124,124,124, 55, 63, 63,191, 67,111, 64,195, 26,141, 70, 61, 0, 17, 69, 81,220, 10,104,163,168,194,
-186,165,181, 18,251,166,194,125, 1, 10,166,137,109,130,139,139,203, 31, 71,143, 30,245,241,243,243,131,209,104,132,201,100, 66,
- 94, 94, 30, 34, 34, 34,160,211,233, 96, 50,153, 16, 24, 24,136,239,191,255, 94,251,229,151, 95, 10,215,174, 93,155,150,151,151,
- 55,168, 12,218, 47,247,236,217, 35,241,244,244, 20,105, 52, 26, 60,127,254, 28, 13, 26, 52, 64,110,110, 46,212,106, 53,242,243,
-243, 97, 48, 24,160, 82,169, 28,105,154,214,151,193, 53,211, 90,100,141, 25, 51,230, 30,159,207,111,240,197, 23, 95, 32, 33, 33,
-193,242,204,143, 30, 61, 26,238,238,238,150,103,169,240,249,180,171, 97,230,112, 56, 16, 8, 4,224,241,120,217, 85,170, 84, 1,
- 65, 16,194,216,216,216,242, 76,197,201, 1,168,184, 92, 46,223, 90, 96, 9, 4, 2, 92,187,118,237, 91, 62,159,191,212, 30, 95,
- 79,182, 72,231, 86,214,254, 59, 48,104, 93,198,227,241, 4, 78, 78, 78, 60,171, 1, 39, 79, 42,149,194,205,205,109, 21,128, 46,
- 54,158,119,168,147,147,147,165,125, 15, 9, 9, 65,124,124,252,254,156,156,156, 33,105,105,105, 32, 73,114, 43, 73,146,189,205,
-131,212,172,172, 44,248,250,250,134,150,196,215, 60,204, 99, 44, 8,246, 21,139, 86,145, 1, 26,228,114, 57, 94,190,124, 9,181,
- 90,205, 62,121,242,132, 24, 55,110, 28,161,215,235, 55, 69, 70, 70, 94, 65,193,106,251, 18,181,200,123, 2,251,125,180,204, 22,
- 45, 91, 59, 0,130, 32,202, 28, 77, 24,141, 70,105,112,112,112,113, 14, 95, 68,113, 66,171,112, 58,169, 92, 21,157,203,229,202,
-202, 43,182,138,226,208,222, 29,238,139,190,159,246,189,147, 87,181,234, 83,166,204,228,116,239,222,253,234,150, 45, 91,104,167,
-218, 93, 58,156, 61,177,205,125,249, 87, 83,143, 29, 61,122, 20, 40,112,140,182, 21, 23, 15, 31, 62,236, 49,121,194,120,124,255,
-245,151,199,229,129, 46,124, 41,225, 36, 17,234,212,233, 82,176, 26, 65,141,160,110,251, 14, 29, 74, 6, 16, 89, 26,137, 88, 44,
-246,123,240,224, 65,160,245, 66, 2,189, 94, 15,177, 88,140,179,103,207,186,138, 68, 34, 87, 0,208,104, 52,168, 91,183,174,173,
- 22, 19,191,199,143, 31, 7,202,100, 50,228,231,231, 67,167,211,193,104, 52,130, 97, 24, 16, 4, 1, 46,151, 11, 62,159, 15,137,
- 68, 98,239,202,190,219, 0, 62,237,218,181,235,246, 99,199,142, 33, 56, 56, 24, 89, 89, 89,136,142,142, 54,139, 44,243,180,161,
- 77, 48, 91,137,172,253,177, 56, 28, 14,254, 8, 8,192,232,164, 36,139,128, 89,230,224,128,239,153,242,101,211,168, 91,183, 46,
-123,241,226, 69, 28, 63,126, 28, 61,122,244, 32, 14, 28, 56, 96,160,105,154,151,148,148,116, 47, 41, 41,201, 38, 14,134, 97, 44,
-101, 53,183,219,214, 2,203, 94,161,101, 50,153,100,124, 62, 31, 90,173, 22,102,203,131,245,230,239,239, 15,165, 82,201, 81,169,
- 84,156,164,164, 36,241,188,121,243,190, 56,119,238,156,103,110,110,238,192,255,178, 21, 90,189,122,181,223,232,209,163,227, 56,
- 28, 14,219,185,115,231,193,177,177,177,189, 60, 61, 61,207,252,253,247,223, 63, 3,168,105, 47,159,139,139,203, 77, 14,135,227,
-163, 82,169,120,187,119,239, 54,230,230,230,242, 92, 93, 93, 83,205,109,135,249, 90, 27,141, 70,155, 86, 46,187,184,184,220,204,
-200,200,224,173, 92,185,210,152,153,153,201,115,119,119, 79, 53,243,100,103,103,243,118,239,222,109, 84,169, 84, 60, 7, 7,135,
-155, 57, 57, 57,101,242,101,100,100, 12, 26, 58,116,232,133, 51,103,206,184, 80, 20,133,216,216, 88,100,102,102,194,209,209, 17,
- 91,183,110,133,159,159, 31,246,236,217,163, 84, 42,149,163,126,250,233,167, 25,133, 34,171, 44, 31,173,214, 77,154, 52,241,203,
-206,206,134,163,163, 35,212,106, 53,110,222,188,137, 58,117,234, 32, 41, 41, 9, 36, 73,194,209,209, 17,191,253,246, 91, 62, 65,
- 16,202,210,136, 68, 34, 81,175,240,240,112, 71, 0, 8, 15, 15,119, 12, 15, 15, 47,182,131,107,214,172, 25, 86,173, 90, 85, 84,
-104,217, 51, 48,176, 88,157,172,196,145,182,105,211,166, 56,119,238,220, 84, 59,197,145,222, 44,218,138, 90,179, 4, 2,129,221,
-139,105, 24,134,225,161,192,165,129,176,101,255, 29, 64, 27,145, 72,196, 43,250,102,126,126, 62,207,211,211,179,149, 29,194,215,
- 89, 36, 42, 48, 56,249,249,249, 33, 39, 39,135,214,235,245, 3,182,109,219,102, 4,128,176,176,176, 1, 52, 77,107, 77, 38, 19,
-197,231,243,161, 86,171,225,230,230,230, 92,138,109,244,155,131, 59,231,121, 20,245,209,242,244,244, 68, 88, 88, 24,116, 58, 29,
-146,147,147, 17, 17, 17, 97,164,105,122,251,234,213,171, 25, 87, 87,215, 17, 31,127,252, 49, 21, 25, 25,249, 57,128, 73, 37,105,
-145,247,204,154,181,174, 68,161, 85,168, 32,207, 1,104, 91,244, 36,139,138,159,210,132, 86, 89, 83,135,124, 62, 63, 59, 46, 46,
- 78, 98,221,169,152, 76, 38,120,121,121, 49, 44,203, 18,197, 9,173, 55, 49, 5,115,185, 92,217,244,233,211,179, 87,175, 94, 61,
-232,229,203,151,179,108,249,206,238,207,131,176,165,136,200, 90,179,104,206,170,149,139,230, 57, 61, 59,190, 9,235, 87, 44,161,
-105, 26,145,245,234,213,107,149,151,151,199,113,144, 24,145,145,141, 99,133, 34,203, 86, 81, 72, 2,216,120,253,250,245,200, 46,
- 93,186, 92,218,248,231, 62,167,164,231,207,175, 8, 84, 25,201,242, 26,129, 28,158,183, 95,239, 92,173,150, 55, 96,192, 0, 87,
- 0, 31,151,213,136,101,103,103, 35, 37, 37,165,168, 0,195,163, 71,143, 94, 59,214,166,194,145, 36,104,154,198,222,189,123, 33,
- 22,139, 33,145, 72, 94,217,204, 34,171,156, 11, 21, 30, 3, 64,231,206,157,161, 84, 42, 33,149, 74,109, 46, 87, 81,241,194,178,
- 44,244,122, 61,244,122, 61, 12, 6, 3, 13,128,203,225,112, 48, 50, 33,193, 98,229,177, 71,192, 20, 69,189,122,245,216,203,151,
- 47,227,210,165, 75, 80,171,213, 88,185,114, 37, 60, 61, 61,219, 3,152,105, 47,151,149,147, 62,173, 82,169,184, 42,149,202, 98,
- 29,228,114,185, 22,235,129,141,150, 60, 30,135,195,177,140, 70,205,155,181, 85,139,162, 40,184,187,187,195,195,195, 3,107,214,
-172,225, 85,171, 86,173,219,127,217, 2, 45, 94,188,184,198,178,101,203, 54,108,217,178,229,216,160, 65,131,118, 69, 69, 69, 13,
-119,112,112,184,119,246,236,217,121, 2,129,128, 41,231,243,237,147,148,148,228,102,253, 22,195, 48, 98,147,201,100, 17,182,249,
-249,249, 54, 15, 48,184, 92,174,207,131, 7, 15,196, 0, 48,111,222, 60, 46, 0,177,217, 25,220,204,153,159,159,207,173, 83,167,
-142,143,173,117,253,194,133, 11,173, 58,118,236,120,249,212,169, 83, 10, 63, 63, 63, 36, 38, 38, 34, 49, 49, 17, 53,106,212,192,
-130, 5, 11,212, 42,149,170, 5,128,199,121,121,121, 7,108,228,244, 82, 40, 20,220,184,184, 56,152, 76, 38,132,134,134,226,183,
-223,126,195,128, 1, 3, 80,183,110, 93,168, 84, 42, 60,120,240, 0,155, 55,111, 86,240,120,188, 82,219, 14,141, 70,115, 96,221,
-186,117,190, 69, 45, 90,131, 7, 15,150,164,166,166, 90,234,228,156, 57,115, 94,153, 66,180,167, 77, 46,156,218, 42,113, 43, 15,
- 76, 38,147, 92, 40, 20,170, 4, 2, 1,223,236,159, 21, 17, 17, 97,183, 53,171,200, 0,208,158,253,255, 12,102,209, 90, 76,223,
- 10, 15, 15, 15,155,121, 4, 2, 1, 97,110, 27, 77, 38, 19,114,114,114,104, 79, 79, 79,203,244,254,173, 91,183,232,170, 85,171,
-210, 20, 69, 81,124, 62, 31, 4, 65, 64, 44, 22,151,216,224,179, 52, 59,167,251,128,153,175,172, 58,156, 56, 29, 48, 24, 12,184,
-117,235, 22, 12, 6, 3, 34, 34, 34,140, 63,253,244, 83, 82,118,118,246, 68, 0,156, 19, 39, 78, 12,157, 58,117, 42,229,230,230,
-214, 49, 45, 45, 13,101,105,145,247, 72,108,189,102,229, 50,247, 66,231,186,117,235, 70, 20, 46,173, 36,204,194,201, 30,161, 85,
-248,240,149,217,243, 18, 4,129,228,228,100,203,190,155,155,155,221,191,101, 43,156,157,157,213,205,154, 53,147,101,100,100, 28,
- 88,188,120,113,185, 44, 89,107, 22,205, 89,181,112,238, 15, 78,202,135, 87,145,144,148, 12,101,154, 49,242,226,189,151,251, 1,
-236, 7, 0,172,173,125,142, 24, 27,253,171,173,156, 65, 46,162, 16, 46,143,179,255,131, 46,221,124,251,135, 79, 34, 63,251,236,
-179,150, 67,135, 14,205, 25, 52,104,208, 4,169, 84, 90,211, 96, 48,100,237, 59,114, 36,166,127,255,254,213,104,154, 30,138, 50,
- 98,142,104, 52,154,216,182,109,219, 90, 95, 79,249,233,211,167,221, 99, 98, 98, 48,126,252,248,244,196,196,196,108,235, 99,109,
- 41,163,193, 96,136, 13, 9, 9, 41,113,186,208, 60,165, 8, 0,185,185,185,177,118, 92,210,129, 40,116,124,207,204,204,196,163,
- 71,143,192,225,112,208,180,105, 83, 92,188,120, 17, 45, 91,182,188,101,143, 85, 75,171,213,194,207,207, 15, 90,173, 22,106,181,
- 58, 31,128, 96,107,181,106, 0,128,207, 51, 51,113,243,167,159,112,117,225, 66, 88,215,103, 91, 81,191,126,125,246,234,213,171,
-184,119,239, 30,116, 58, 29, 70,141, 26, 5, 0, 68, 97,221,181, 39,100, 70, 0, 69, 81,157,187,116,233,226, 5, 0,106,181,154,
-184,126,253, 58,132, 66,161,229, 89, 56,116,232, 16, 18, 19, 19, 65, 16, 4, 20, 10,133, 79, 86, 86, 86, 53, 0, 47, 75, 49,251,
- 19, 47, 95,190,196,143, 63,254, 8,134, 97, 48,117,234, 84, 4, 6, 6, 90, 4, 86,108,108, 44,230,205,155, 7,154,166,241,195,
- 15, 63,160, 70,141, 26, 48, 26,141, 66, 20, 31, 86,227, 95,193,228,201,147,159,237,223,191,255, 88,124,124,252, 71,139, 22, 45,
-106, 67, 16, 4, 51,101,202,148, 31,229,114, 57,253, 38,188, 89, 57,185,120,244, 52,214, 34,132,138,110,174, 46, 78,118,243, 61,
-121, 30,111,249, 62, 77, 91,243,209,112,118, 82,216, 91,196,124,163,209,168,238,221,187,183,227,222,189,123,137, 26, 53,106,224,
-197,139, 23,102,203, 80, 62,236, 15,233,144,168, 84, 42, 3, 41,138,226, 61,125,250, 20, 85,171, 86, 69,147, 38, 77, 48,127,254,
-124,100,100,100,192,100, 50,193,205,205,141, 49, 26,141,183, 12, 6,195,249, 50,184,230,140, 25, 51,134, 7, 96,108,161,101,171,
-222,196,137, 19,153, 37, 75,150,224,214,173, 91, 22, 11,150,181, 51,188,189, 83,135,214, 86, 39,235, 45, 34, 34, 98, 42,159,207,
-103, 1, 92,131,253,129,158,245, 69, 45, 90,229,177,102,189, 45,188,205,149,140,158,158,158, 17, 50,153,172, 91, 86, 86,214, 43,
- 86,173, 22, 45, 90, 24,220,221,221, 47,216,202, 35,149, 74,179, 40,138,114, 6,128,196,196, 68, 72, 36, 18,222,243,231,207, 23,
-162, 32,120, 54,170, 85,171,182, 80,169, 84,242,170, 21,182,167, 30, 30, 30,208,235,245, 37,186,177, 92,185,157,186, 9,192, 38,
-243,190,147,147, 83,114, 78, 78,142,104,201,146, 37,121, 11, 23, 46,212,208, 52,173, 3,112, 54, 59, 59,219, 18, 71, 43, 37, 37,
- 37,135,203,229, 58, 57, 58, 58,122,155,133, 86,113, 90,228, 61, 67,201, 22,173, 66, 37,201, 22, 21, 68, 4, 65,188,230,160, 94,
-134,208, 42, 83,100,209, 52,253,138,149,193,236,240, 94,220,111, 21,118,234,229,154, 58, 44, 20, 89,194,125,251,246,109, 93,188,
-120,241, 53, 91,191,103,237,163,181,246,231,185,139,204, 34,235,238,165, 83, 56, 16,157,147, 49,117,225,210,101,229,189, 3,181,
- 93,196,245,221,221,157,207,253,180, 96,142,252,217,241,205,216,181,246, 23,246,238,141, 27,141,111,220,184, 49,100,252,248,241,
- 85, 10, 43,150, 18,192, 29, 0,253, 97,195, 42,157,196,196,196, 78, 69, 58,225,199, 60, 30,207, 93, 44, 22, 35, 49, 49, 49,239,
-201,147, 39,118, 79,201,100,100,100,116,122, 11, 21,144, 99, 22, 89, 25, 25, 25,120,240,224, 1,218,181,107, 7, 0,184,120,241,
- 34, 90,180,104,129,200,200, 72, 52,104,208,224, 22,128, 70, 40, 35, 80,171,209,104,204,174, 93,187,182,197,186,149,147,147,195,
- 0, 64,120,114, 50,214,121,122,130,195,225,224,234,194,133,248,206,104,196,124, 59, 5,124, 72, 72, 8,123,253,250,117,196,196,
-196,192,100, 50,161,103,207,158, 40,231, 67, 95, 55, 40, 40,232,244,217,179,103, 93,165, 82, 41,212,106, 53,242,242,242, 48,108,
-216, 48, 12, 24, 48, 0, 58,157, 14,187,119,239,198,193,131, 7, 33,147,201,160, 86,171,161, 86,171, 21, 93,187,118,189,252,248,
-241,227,214, 0,158,150, 32,180,216, 78,157, 58,225,194,133, 11,160, 40, 10,141, 27, 55, 70,102,230, 63,139,129,220,221,221,139,
-251,140,250, 47,133, 22,135,195, 97, 35, 34, 34, 22,181,105,211, 6,241,241,241, 31, 53,104,208, 96,229,240,225,195, 19,223,148,
- 87,225, 32, 67, 72,157, 0,232,116, 58,232,116, 58,120,121,121, 33, 55, 55, 23,207,158, 61,131, 78,167,131,187,155,163,221,124,
- 97,117,107, 88,248,220,220,220,160, 86,171,241,242,229, 75,232,245,122,184,184,216, 37,180,124, 59,117,234,244,247,246,237,219,
-157, 55,111,222,172,111,219,182, 45,127,229,202,149,132, 92, 46,135, 85,199, 98, 47, 34, 46, 94,188,232,215,177, 99,199, 90, 15,
- 31, 62, 68, 68, 68, 4,244,122, 61,194,194,194,240,228,201, 19, 52,107,214, 12,121,121,121,215,110,220,184,113,208, 22,195, 48,
-128, 25, 99,198,140,129, 89,108, 93,184,112, 1,201,201,201,144,201,100,175, 9, 45,179,239, 99,225,170,113, 47, 91, 10,107, 22,
- 68, 86,150,167,239, 28, 29, 29, 13, 0,150,149,211,250, 4, 0,136,143,143, 23,212,171, 87, 79, 39, 20, 10,249,133,162,109,233,
-155,240, 85, 36, 42, 96, 37, 99,137,240,240,240,152,232,226,226,210,209,223,223, 31,169,169,169, 60, 62,159,143, 22, 45, 90, 24,
- 26, 53,106,100,240,240,240,248,220, 86, 30,129, 64,240,144,199,227,181, 46, 24, 76,208,136,139,139, 3,203,178, 83,235,214,173,
-251,101,110,110, 46, 50, 51, 51,249,114,185,220, 50,168,174, 85,171, 22,116, 58,221, 67, 59, 44,111,115,170, 86,173, 58,131,199,
-227,205,207,200,200, 40, 46, 44, 4,223,209,209, 81,206,227,241, 96, 48, 24, 94, 17,155, 69,181,200,251, 46,178, 94, 17, 90, 86,
- 42,242, 21,161, 99,143, 69,203, 22,171,129,217,193,222,122,223, 44,234,138,254, 86,121, 99,104, 57, 56, 56,232,204, 34,107,254,
-252,249,215,202,195,177,103,251, 54, 79, 7, 38,223, 55,233,218, 81, 60,190, 23,137,253, 15,178, 51,166, 46, 92, 58,161,251,199,
- 3, 83,139, 10, 51, 91, 16,232, 42,174,235,238,230,124,238,231,197, 11,229,202,135, 87,145,156,146,130,163,215,110, 68, 26,128,
- 7, 0,166, 86,164,105, 25, 40,152, 58,164, 40,234,157,168,176,133,247,216,226, 12,159,156,156,108, 22, 89, 97, 0,208,178,101,
-203, 91,133, 34,203,252, 94,153,177,180,178,179,179,139,166,172,233, 8,192,197,124,254, 28, 14, 7, 45,102,204,176, 91,100, 1,
- 96, 35, 35, 35,161, 84, 42,205, 35,197,242,138, 44,120,120,120,124,125,246,236, 89,215,141, 27, 55,170,182,108,217,146,201, 48,
- 12, 55, 36, 36,196,167, 97,195,134,196,214,173, 91, 1, 0,253,251,247,199,212,169, 83,113,255,254,125, 72, 36, 18,180,108,217,
-146,158, 53,107,150,219,196,137, 19, 63, 79, 77, 77,157, 80,108,239,200, 48, 60,161, 80,120, 6, 64,251,135, 15, 31, 2,192,101,
- 20,164,112, 50, 91, 17, 74,252,204,150,206, 55, 55, 55,151, 43,147,201,138, 13, 13,193, 43, 24, 13,217,107,129,176,112, 94,186,
-116,233,199,159,127,254,121,255, 87, 95,125,245,244, 13, 57,139,181,104,117,235,214, 13, 26,157, 1, 9,169, 57,160,105, 19, 52,
-134, 52,187,249,172, 45, 90,221,186,117, 67,190, 86,143,184,100, 37, 76, 38, 26,185, 26,155,251,114,241, 7, 31,124,112, 98,231,
-206,157, 30, 87,174, 92, 1, 77,211,204,147, 39, 79, 94,246,238,221, 91, 62,101,202, 20,231, 55, 88,100,180, 98,224,192,129,125,
- 47, 93,186,164,172, 85,171,150,211,181,107,215,144,150,150, 6,147,201,132,246,237,219,131,207,231,199, 45, 92,184,144, 7, 96,
-133,173,247,166, 80,108, 25,110,220,184, 49,250,234,213,171, 78, 78, 78, 78,124, 38, 40, 8,201,167, 78, 97,239,222,189,175,125,
- 97,237,218,181,128,141, 81,248,205, 22,167,235,215,175, 87,136,192,122,165,167,230,243,203, 61,253,248,190,226,250,245,235,137,
-159,125,246, 89, 29,185, 92,190,172, 85,171, 86,237,156,157,157, 73,133, 66, 17,225,237,237,253,101, 72, 72,136,205,179, 11, 92,
- 46,119,184, 68, 34,121,102, 50,153,168,188,188, 60,168,213,106, 0,128,201,100,226,147, 36,137,106,213,170, 89,250,146,198,141,
- 27,195,195,195,131,142,142,142, 30,110, 43,127,122,122,250, 43,171, 16,139,193,152, 22, 45, 90,112,116, 58, 29, 98, 98, 98, 46,
- 90,127, 80,156, 22,121, 79, 16, 94,170,248, 50,159,148,245,201,121,123,123,199, 27,141, 70,246, 1,192,222,185,115,135, 13, 15,
- 15, 47,117,211,106,181,172,155,155, 91,114, 49,157, 31,172, 57,117, 58,221, 43,223,211,233,116,172,187,187, 59,173,209,104, 94,
-227,212,104, 52,172,143,143, 79, 98,105,156,197, 96,216,237,219,183, 87,127,247,221,119, 77,236,184, 64, 22, 78,118, 77, 16,187,
-121,243,230, 79, 88,150,109,211,170,142,223,189,126, 33,238,108,139, 64,183,164,131,123,182, 15, 96, 89,182, 77,209,205, 28,224,
-180, 52,206, 32,119, 73,237, 14,193, 85,178,238, 30,223,193,158, 93,242, 5,251,115,207, 64,182,129,143, 44, 59,200, 69,100,111,
-142,152, 50,179,165, 7, 7, 7, 63,102, 24,134,213,235,245,108,112,112,240,147,138,224, 44, 7, 74,227, 12, 69,129, 47,219,192,
- 98,222, 11,125,131,114,222,101, 89,150, 85, 42,149,108, 94, 94, 30,171,211,233, 88,154,166, 89,107, 0,184,107, 3, 39,107, 48,
- 24,216,172,172, 44, 22,182,251,220, 21,203,233,233,233,249,242,249,243,231,108,245,234,213,227, 11,205,241, 19,213,106, 53, 91,
- 20,106,181,154,109,215,174, 29,251,228,201, 19,182,106,213,170,218, 39, 79,158,176,158,158,158,143,202, 40,167,191,175,175,239,
- 25, 23, 23,151, 8, 0,129,118,124, 86,234,245,220,189,123,119, 0,203,178,163, 88,150, 13, 47, 97, 27,197,178,108,208,127,205,
- 89,120,125, 83, 89,150,101,243,243,243, 89,165, 82,201, 38, 37, 37,177,249,249,249,108, 94, 94, 30,123,251,246,109,246,202,149,
- 43,236,189,123,247, 88, 39, 39,167, 84, 91, 56,205,124,122,189,158, 85,169, 84,108, 90, 90, 26,171,209,104, 88,181, 90,205, 70,
- 69, 69,177, 55,111,222,100, 31, 62,124, 88, 28,223,107,156,206,206,206,107, 83, 82, 82,242, 46, 95,190,156,191,102,205,154,124,
- 15, 15,143,135, 0,252, 0,212, 84, 40, 20, 41, 95,124,241, 5, 43,149, 74, 99,203,249, 28,213,225,114,185,183, 23, 45, 90,116,
-253,240,225,195,169, 7, 15, 30,212,111,216,176, 33, 97,252,248,241,231, 57, 28,206,109, 0,117,202,249, 28,185, 57, 58, 58, 94,
-190,118,237,154, 41, 43, 43,139,205,206,206,102, 85, 42, 21,171, 86,171, 89,141, 70,195,234,245,122,214,104, 52,178,231,207,159,
-103,221,221,221,173,167, 37,191, 41,101,144, 53,137,101,217,175, 89,150,229, 84,116, 91,103,197,221,170,162, 56, 43,162,173, 35,
- 73,210, 80,216,118, 52, 45,216, 45,125,255,191, 42,103,135, 14, 29,126, 24, 48, 96, 0,219,185,115,103, 54, 44, 44,236,181,173,
- 65,131, 6,236,184,113,227,216,195,135, 15,179, 63,253,244,211, 15, 21, 80, 78, 14, 10, 22,189, 44,232,208,161,131,241,194,133,
- 11,108,255,254,253, 89, 0,157, 74,211, 34,239,179,224, 50, 47,166, 49,135,119, 32,172, 95, 1,192, 96, 48,196, 63,126,252,216,
-179,150,201, 68, 1,192,175,191,254,250,154,149,194, 26, 23, 46, 92, 48, 17, 4,241,172,180, 95, 55, 24, 12,241,103,207,158,117,
- 95,181,106, 21,215,202, 4, 12,147,201,196, 36, 37, 37,145, 43, 87,174,124,229,248,115,231,206,153, 76, 38, 83,156,157, 39,185,
- 57, 52, 52,116,115, 69, 92,173,243,247, 99,190, 60,113,244, 47,151,166, 77, 90,101,203,157,156,138, 29,133,237,254, 60, 8,196,
-216,210,173, 90, 4,135,156,191,104,193, 28, 71,243, 20,228,159,183, 82,178,181, 58,186, 93,116,134,230,110, 69,223,225,188,188,
-188, 24,243, 74, 64,181, 90, 29,247, 14, 86,194,219, 40,136,113,101, 42,242, 94, 35,188,161,211, 41,195, 48,112,112,112,176, 88,
- 67,203, 97, 17,101,139, 88,210,222,200, 71,128,101,217, 75, 81, 81, 81, 85,135, 13, 27, 38,219,178,101,203,115,154,166,185, 35,
- 71,142, 52,120,120,120,240, 46, 94,188,104, 4, 64,180,105,211,134,147,146,146,194, 38, 38, 38, 42,123,244,232,145, 59,122,244,
-104,231, 59,119,238,240, 25,134, 41, 43,104,225,139,248,248,248, 14,229,248,172, 84,244,235,215,239, 57,222, 60,141,205, 91,231,
- 52, 67,153,173,194,243,152,196,194, 8,230, 12,232,216, 84,139, 95,149,209,104,130, 82,149,105,183, 69,235,217,203,196,194, 20,
- 99, 52,104, 58,169,144,175,192, 33,158,205,202, 47,187, 55,225,112, 90,206,154, 53,171, 11, 73,146,228,213,171, 87,117,139, 23,
- 47,142, 79, 79, 79,239, 9, 32, 14, 0,178,178,178,218,110,222,188,249, 15, 27, 66, 57,148,132, 7, 70,163,177,217, 55,223,124,
- 51, 1, 64, 75, 0, 85, 10,185, 47, 22, 90,178,202, 27,193, 60, 45, 59, 59,251,195, 46, 93,186,156,162, 40,170,154,213,115,228,
- 2, 32,195,252, 92,176, 44,235,150,154,154,250,145, 45,132, 4, 65, 44,125, 91, 13,201,219,228,126,195,118,232,189, 88,201,120,
-230,204,153,217, 61,123,246,228,248,249,249,125,235,231,231, 71,102,101,101, 33, 47, 47, 15, 36, 73,194,195,195, 3,193,193,193,
-240,240,240, 96, 30, 62,124,184, 96,218,180,105,101,198,228,171, 93,187,118,128,209,104,172, 78,146,100, 0,128, 0,150,101, 3,
- 8,130, 8, 0,224, 4, 0,114,185, 92, 94,181,106, 85, 78,211,166, 77,209,164, 73, 19,156, 59,119, 14,123,246,236,217, 4,224,
-132,181, 53,171,168, 22,121, 23,240, 32, 20,108,157,219, 32,238, 55, 64, 27,130,193, 57,150, 68,219,224, 72, 75,156,189,162, 34,
-171,228,164,210,197,152,254, 58,181,111,223,222,242,192,217,208,169,196,148,245,240,165,167,167,119, 26, 62,124,248, 43,156, 52,
- 77,235, 50, 51, 51, 63,107,222,188,249,111, 20, 69, 9,138, 84,216,216,180,180,180,127, 53, 87, 95,209, 56, 90,157,186,244,202,
-120, 83, 78, 41,143,172,254,248,200,239, 72, 77,203,192,159,183, 82,178,114,245,116,219, 39, 25,249, 81,111,163,252,177,177,177,
-157,223,101,169,111, 53,141, 88, 20, 55,237, 73,189, 83, 92,245,178, 33, 32,105, 89, 57,234,136,194,112, 34, 21,242,144,167,164,
-164, 44,153, 49, 99,198,135, 11, 22, 44,112, 61,118,236,152,220,124,254,125,250,244, 73,139,138,138,106, 5, 64,160,213,106, 79,
- 47, 88,176,192,117,206,156, 57,206, 0,156, 1,160,107,215,174,169,169,169,169,171, 80,137, 82, 97, 52, 26, 19,130,107,215,122,
-101,228,104, 30, 0, 90,255,111, 50,153, 18,236,225, 43,142,199,122,159,166,233, 82,249, 40,138,250,170, 73,147, 38,212, 87, 95,
-125,149,122,236,216, 49,115, 34, 93,107,133,246,184,140,160,164,182, 64, 7, 96,113,225, 86,145, 80, 43,149,202,102,118,126,135,
-174,172,141,197, 14, 40,237,217,255, 79,112,224,192,129,153,253,251,247,223,236,228,228,180, 45, 32, 32,160,150,187,187,187, 92,
- 36, 18, 65,167,211,229,234,245,250, 71,143, 31, 63, 30, 52,115,230,204, 23, 54, 89, 56, 54,111,166, 0,240, 24,134, 17,146, 36,
- 41, 1, 32, 39, 8, 66, 97, 22, 90, 4, 65,192, 96, 48, 32, 38, 38, 6,223,125,247, 29,125,230,204,153,159, 0,252, 96, 71,223,
-209, 8,128,171, 85, 59,238, 10, 64,143,130, 0,182,233, 4, 65,220,120,219,215,139, 96,112,174,206,109, 16, 15, 66, 81, 92, 63,
- 81,122, 82,233,146, 30,184,244,244,244,102, 21,253, 16,151,196,153,158,158,238,247,174, 60, 33, 67,117,139,119, 96,237,226, 87,
-242, 28,154, 69, 88,113,251,101, 33, 71, 99, 26,191,226,196,253, 37, 58, 19,203, 24, 76,204,136, 39,233,249, 15,254,191,182, 62,
-165, 9,169, 55,204,107,249, 65, 69, 21,177, 2, 79, 55, 42, 58, 58,186,249,248,241,227,103,138,197,226,198, 0,144,159,159,127,
- 53, 41, 41,105, 46, 10, 87, 21,150,245,121, 37, 74, 70, 70, 70, 70,195,119,145, 79,175,215,127,217,188,121,243,229, 52, 77,255,
-108, 50,153, 46,254, 63,184, 21,218,202,218,248,254, 98,215,174, 93, 47, 0, 52, 3,128,190,125,251, 82, 0,176,103,207, 30,187,
-197,243,176, 97,195,104,150,101, 13,133,245, 65,141,130,213,133, 89,230, 54, 85,173, 86,103, 37, 37, 37, 61,164,105,250, 33,128,
- 63, 96,255,138, 91, 87,130, 32, 14,179, 44,219,173,176,191, 56,204,178,108, 55,235,247,222,182, 85,171,140, 67,202,118,134,175,
- 68, 1,246, 60, 0, 81,116, 42,176,172,253,178,240, 56, 85, 29, 1,160, 65,229,213,253,127,137,231, 73, 73, 73, 67,223,224,243,
- 74,188,127,136,211,235,245, 61,255, 31,157,111, 78,229, 45,255, 31,233,255,202, 33,176,204,120,248,240,225, 91,115, 17,248,175,
- 81,231,246,171, 3,240,162,251, 86, 8, 47, 78,120, 85, 10,173, 74, 84,162, 18,149,168,196,155, 32,187,242, 18, 84,226,127, 25,
-102,223, 44,243,126, 9, 62, 90, 69,253,179, 44,251, 4, 74, 94, 57, 96, 79, 86,242,242,172,146, 56, 93,201, 89,201, 89,201, 89,
-201, 89,201,249,159,115, 58, 2,168, 10, 96, 81, 25,199, 21, 93, 93,152, 10, 32, 3,128,177,242,122, 86,114,190,129,126,176, 9,
- 44,203,118, 45,109,234,144, 32,136, 35,111, 75,104, 89,156,225, 67, 49, 43,248, 54,102,153,247,203, 18, 90, 44,203,174,251, 55,
-132, 96,199, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 74,206, 55, 20, 90,237,166, 77,155, 54, 29, 5,161, 49,216,
-105,211,166, 77,103, 89,182,107,193, 71,108,215,183,249,219,247, 27,160,205,131, 80,176,230,237,126, 3,180, 41,225,208,112,171,
-237,213,240, 14,149,168, 68, 37, 42, 81,137, 74, 84,162, 18,239, 48, 46, 47, 92,184, 48,127,225,194,133,102,199,247,116, 0, 68,
-161,133, 43,253,109,254,112,225, 52,161, 45, 11,165, 74, 79,193,243, 31,192,139,228,240, 6,115,121,130,118, 96,153, 96, 0, 0,
- 73,221,167,245,218,191, 77, 38,195, 54, 0, 73,229, 37, 14, 2,106,215,112, 20, 29,212,209, 52, 47, 62, 87,223, 55,186, 32,205,
-129,221,232, 11,180, 16,240,249, 39, 5,142,142,162,226, 62,215,101,103,107,116,122,253,135,123,128, 75,149,207, 64, 37, 42, 81,
-137, 74, 84,226, 61,129, 68,161, 80,156, 33, 73,210,207,252,134,245,170,239,162, 43,192,105,154, 78, 86, 42,149, 31,162, 96,170,
-248,223,228,180,254,190, 30,229,236,203, 43, 26,182, 78, 29,194, 58,188,131, 85, 20,214, 50, 51,102,215,242,144,180,170, 21,224,
-183, 61, 41, 37,245,150, 74,171, 31,249, 56, 41, 79,105,111, 33, 41,174, 96,180,204,193,113,254, 39,195,191,116, 14,172, 89,139,
-240,245,245, 6, 88, 32, 46, 62,193,253,217,211, 39, 29,118,109, 89, 49, 89,149,163,252,206,168,211,253,110, 47,119,109, 64, 82,
- 69, 42,184,248,251,180, 79, 29, 57, 48, 97,224,188,237,199,137, 60,131,239,195,130,229,166,118,137, 44, 71,103,231, 19, 11, 79,
-159, 22, 41,234,215,127,229, 51,150,101, 11,242,235,221,189, 43,250,246,195, 15, 79,244, 85, 42, 59, 85,138,173,255, 73,120,200,
-229,242,137, 92, 46,183,173,193, 96,240,227,243,249,241, 52, 77, 71,100,101,101, 45, 3,144, 88,121,121, 42, 81,137, 50, 81, 90,
-126,205,255, 44,247, 38, 0, 72,165,210,155, 36, 73,250, 88,139, 0,115,206, 94,243,126,209, 87,134, 97, 94, 40,149,202,230,165,
-208, 6, 56, 57, 57,253, 6,160, 81, 89,225,106, 10, 99,179,221, 80, 42,149,159,161,228,213,122, 50,133, 66, 49,155, 32,136,126,
- 36, 73, 82,101,157, 19,195, 48, 52,203,178,187,179,178,178,126, 0,144, 91,210,113, 10,133,226,116,116,116,116, 35, 55, 55,183,
- 50,173, 52, 38,147, 9,113,113,113,174,141, 27, 55, 62,175, 84, 42,131,222, 38,167, 61, 90,228,191, 68, 41,171, 14, 75,172,232,
- 0, 94,201, 47, 68,148,126, 35, 49,120,227,252,207,188,147, 99,159,122,143, 89,176,163, 38,225, 76,183,125,148,169, 73,177,245,
- 7,121, 66,233,193,102,173, 59,181, 27, 55,225, 43,201,237,168, 71, 56,121,238, 10, 84,106, 29, 40,146,132,163, 76,140,154, 53,
-171, 19, 75,215,237,117,217,180,102,233,207, 87, 47,156,234,170, 85,231,244,176, 75,166,139, 57,223, 77,237,221, 88,226,236, 68,
- 3, 12,141,175,187,132, 72,190, 61,124,235, 59,228,155,166,219, 45,178,206,156, 17,167,165,166, 98,142,151, 23, 56, 38, 19,132,
- 36, 9, 33, 65, 64, 72,146,144, 8,133,232,188, 97, 3,230, 30, 59, 38,158,249,209, 71,149, 98,235,127, 12, 82,169,116,184,151,
-151,215,226,245,235,215, 59,251,251,251, 67, 34,145, 64,169, 84,186, 60,126,252, 56,116,210,164, 73, 67,147,147,147,103,168, 84,
-170,181,149, 87,170, 18,149, 40, 17,161, 0,110,161, 48,127,169, 29,159,149, 8,161, 80,152,170,213,106,221, 74, 59,134,207,231,
-167,233,245,122,247,178,184, 72,146,244, 73, 76, 76,116, 19,139,197,160,105,186, 48, 27, 0, 99, 25, 72, 91,103, 63, 41, 12, 84,
-139,160,160, 32, 67,105,156, 50,153,236,215,180,180,180,142,230, 60,129, 86,130,170, 88, 36, 38, 38,118,172, 83,167,206,175,185,
-185,185, 31,150, 32, 94,102, 79,152, 48, 97, 98,221,186,117,205, 86,160,194, 44, 8, 5,175, 25, 25, 25, 24, 63,126,188,229, 55,
- 24,134,193,169, 83,167, 38, 12, 31, 62, 28, 89, 89, 89,147, 74, 57,119, 63, 55, 55, 55,162, 48,161,120,137,152, 53,107, 22,102,
-205,154,133, 21, 43, 86, 16, 92, 46,215,177,140,235, 89, 33,156,182,106,145,255,194,130, 85, 70,100,248, 35,120, 53,188,195,145,
-215,132,150,173, 32, 89,230,232,188,101,235, 71,206, 25,214,146,216, 56,169, 99,224,216, 21,167,175,144, 60,182,245,195,100,109,
-188, 13,150,172, 17,141,154,119,108, 59,126,226, 84,201,142,191,206,226,241,195,187,136,190,184,243,149, 99, 26,126, 56, 28, 41,
- 25,185, 24, 62,238,107, 41, 65,113,218, 94, 56,125, 96,132, 81,167,217,104,163, 53,203,221, 79,192,255,162,105,227, 96,110,162,
-232, 49, 60, 20, 34,180,108, 80,131,235,123,226,222, 23,106,152,150, 63, 44, 88, 37, 99,151,200, 90,255,233,167,104,101, 52,194,
-141,162, 64, 17, 4, 40, 0, 36, 65, 64,171,211,225,198,224,193,104,188,117, 43,126, 56,116, 72, 60,187,123,119,187,196,150, 68,
- 34,185, 77, 16,132, 34, 47, 47,175, 43, 10, 18, 75,191, 15,168, 35,149, 74,143,176, 44,155,165, 86,171, 67,223,161,114,121,162,
- 96,142,190,232,232,152,135,130, 21, 85,118,101, 22, 22, 8, 4,163,251,246,237,187,116,213,170, 85,226,212,212, 84, 36, 37, 37,
-129,166,105, 8,133, 66, 4, 6, 6, 18,167, 79,159,118,158, 58,117,234,146, 35, 71,142, 8,114,115,115,151,219, 51,176,225,114,
-185,235,156,156,156, 62,114,119,119,151,164,165,165,229,103,103,103,159,210,233,116,163, 81,254,180, 41, 36,151,203, 29, 84,181,
-106,213, 94, 94, 94, 94,238,137,137,137, 25, 9, 9, 9, 7,117, 58,221, 38,148, 51, 81,179,213, 53,173,143,194,104,245, 0,146,
-171, 86,173,122, 63, 38, 38, 38,173, 2, 57,147,170, 86,173,250,160, 28,156, 18, 0,187, 0,120,149,113, 92, 18,128,254,176,211,
-154, 93,137,138, 19, 89,133,217, 30,138, 10,170,210, 62, 43, 21, 58,157,206,213, 96, 48,128, 91, 66,178,120,181, 90, 13,153, 76,
-230,106,107, 33, 69, 34, 17,118,238,220, 9, 46,151, 11, 46,151,139,172,172, 44,248,248,248, 88,246,121, 60,158,229,255, 42, 85,
-170,148,201, 71,211,116, 99,138,162,144,151,151, 7,154,166, 45, 91,118,118, 54, 88,150,133, 64, 32, 0, 77, 23,164,115,178,250,
-188,113, 73,124, 4, 65,244,243,242,242,194,142, 29, 59,160,215,235, 95,251, 92, 46,151, 35, 42,234,159, 36, 35, 20, 69,161, 73,
-147, 38, 36, 65, 16,253, 0, 76, 42,133,151, 5,128,240,240,112, 80, 20, 5,138,162, 64,146,164,229,127,243, 70,211, 52,102,205,
-154, 5, 91,178,118,188, 13,206,119, 13,101, 68,134, 79, 70, 9, 62, 90,100,105,164,181,220, 37,159, 77, 26,216, 49,255,187, 17,
- 93,216,233, 67, 62, 96,167, 14,108,195,126,212,186,222, 95, 20,135, 67, 92,123, 16, 7, 31, 7, 96,211,248, 70,126,190, 46,146,
-168, 96, 39,105,205, 98, 40,172,151,120,122,137, 37,242, 31, 63,251,242,107,233,145,243,247, 16, 23, 31,247,154,200, 2,128,155,
- 39, 55, 33, 57, 41, 17,183,162, 19, 48,104,196,231, 82,185,220,241,199, 34, 13,106,137,203, 70, 29,100,188,159,166,245,111, 41,
-204, 51, 38, 33, 87, 1, 80, 1,124,112,197,106, 76,237, 86, 95, 32,151,241, 74, 75, 85, 97,225, 20,240,249, 39, 23,158, 62,109,
- 17, 89, 45,116, 58, 8,104, 26, 38,154,182,136, 44,189,201, 4,141, 94, 15,207,188, 60, 60, 27, 62, 28,172,209,136, 25,251,247,
-139, 5,124,254, 73, 91,202, 9, 0, 60, 30,207,243,224,193,131, 85,234,213,171,119, 14,182, 7, 51, 61,253, 22,234,142,173,156,
- 13, 66, 66, 66, 34,182,110,221, 90,133,199,227,121, 86, 4,167, 80, 40,252, 88, 34,145,164, 11,133,194,143,203, 89, 78, 18,192,
-188,145, 35, 71, 70, 86,175, 94,253,108,161,176,178,136,154,234,213,171,159, 30, 57,114,228,109, 0,179, 74,168,235,197,113,122,
-123,121,121,205, 95,181,106,149,248,201,147, 39, 72, 76, 76,132,209,104,196,192,129, 3, 65,211, 52, 52, 26, 13,244,122, 61, 22,
- 45, 90, 36,113,118,118,254, 14, 5,137,130,109, 57,119,158,131,131,195,147, 45, 91,182,244,125,249,242,165,244,236,217,179, 68,
- 84, 84,148,100,201,146, 37, 61,157,157,157, 31, 3, 16,148,227,122,146,158,158,158, 27, 15, 28, 56,240, 89, 84, 84,148,207,190,
-125,251,184, 87,175, 94,245, 92,179,102,205, 40, 79, 79,207,173, 0,168,114,222,163, 80,177, 88,220, 97,202,148, 41,204,229,203,
-151, 19, 47, 95,190,156,184,116,233, 82,180,106,213,170,197,156, 57,115,194,202,201,217, 64, 38,147,181,159, 50,101, 10,115,225,
-194,133,164,107,215,174, 37, 44, 89,178,132,108,223,190,125,203,249,243,231,215,183,147,115,215,229,203,151,219,196,199,199,251,
- 39, 36, 36, 84, 75, 72, 72,168,154,144,144, 80, 53, 49, 49,209, 47, 57, 57,185, 74, 74, 74,138,111, 90, 90,154,111, 68, 68, 68,
- 75, 0,219,223,177,231,232,255, 3, 39,199, 44,164,148, 74, 37,142, 28, 57,130, 66,235, 85,168,181,200, 82,169, 84, 72, 78, 78,
- 54,127,198,177,165,156,114,185,252,204,250,245,235, 89,173, 86,139,156,156, 28,164,165,165, 33, 62, 62, 30,207,158, 61, 67,102,
-102, 38, 30, 61,122, 4,177, 88,124,198,150,114, 18, 4, 1,154,166, 45, 66,234,212,169, 83, 24, 57,114, 36,148, 74,165,229, 61,
- 14,135, 99,249,223,252,157,178, 56,205,150, 39,154,166,113,237,218, 53,140, 25, 51, 6, 75,151, 46,197,246,237,219,113,248,240,
- 97, 40,149, 74,139,216, 50,153, 76,101,114,102,100,100,128, 97,108, 27, 51,177, 44,139,156,156, 28,155,239,187,181, 0,226,112,
- 56,175,137, 34,243,102, 79, 93,122, 67,206,119, 22, 54, 68,134, 47,121,132,109,254,167,208, 84,215,246, 21,161, 85,213,227,187,
-197, 19,251,137, 64, 27,192, 26, 53,128, 33, 31, 48,228,129,209,231,131,224,137, 0,163, 6,174, 2, 37,118,141,171, 37,255,102,
-199,243,135,244, 35,162,107,116, 70,238,241, 98,123, 4, 14,111, 80,191, 97, 19,156, 19,210, 84, 72, 76,205, 1, 69,254,211,239,
-133,117, 28, 6, 14, 69,226,250,137, 2,195, 21, 73, 81,200, 81,235,144,157,103, 64,223, 97, 19,157,126, 95,250,253, 32,147, 65,
- 91,106,140,151,186, 64, 96,176, 84,218,187, 78,157, 42,228, 67, 65, 52,194, 62,186, 8,154, 1,216, 11,221, 17,154,229, 70, 5,
-157,228,247, 86,231, 26,230, 71, 1, 79, 74,181,102, 56, 58,138, 20,245,235, 99,142,151, 23, 90, 27,141,224,177, 44, 62, 72, 77,
-197,221,137, 19,161,219,187, 23, 36, 0,222,199, 31,163,221,178,101, 56,239,229, 5, 15,141, 6,217,147, 39,195,245,248,113,240,
-228,114, 17,210,109, 91,252, 64, 16, 4,218,182,109,139,211,167, 79, 59,119,238,220,249,196,189,123,247,250,152, 76,166,243,229,
-185,137, 14, 14, 14, 55, 57, 28,142, 79, 89,199,153, 76,166,132,156,156, 28,187,211,140,112, 56,156,214, 77,154, 52,217,191,111,
-223, 62,133,193, 96,168,144, 81, 8,159,207,239,220,179,103,207,245,171, 87,175,150,143, 26, 53,106,253,225,195,135,243,245,122,
-253,113,123, 44, 57, 0,230,173, 93,187,118,108,120,120,184,227,168, 81,163,216,103,207,158, 89, 91,175, 92, 91,181,106, 85,125,
-253,250,245, 30,141, 26, 53,154, 48,102,204, 24, 30,128, 25,101, 89,121,164, 82,233,184,245,235,215,187,100,100,100, 32, 47, 47,
-207,210,200, 38, 36, 36, 64, 36, 18,129, 36, 73,144, 36, 9, 46,151,139, 31,127,252,209,121,220,184,113, 19,149, 74,229, 68, 27,
-172,100,235,126,251,237, 55,215, 15, 63,252,144,124,249,242, 37, 72,146,132, 80, 40,196,167,159,126, 74,106, 52, 26,197,156, 57,
-115, 54,171,213,234, 1,246, 92, 67, 46,151, 59,104,221,186,117, 53, 91,180,104,193,137,142,142, 70,179,102,205,112,253,250,117,
-124,252,241,199,220,220,220,220,106, 83,167, 78, 29,169,211,233,236,141,227,226, 41, 22,139,235,254,253,247,223,241,190,190,190,
-150,134,165, 90,181,106,116,215,174, 93,149,209,209,209,181, 46, 95,190,156,217,188,121,115,123, 18,150,123,139,197,226,160,163,
- 71,143, 38,207,153, 51,167,195,218,181,107,123, 2, 64,227,198,141, 15,206,157, 59,247,172, 82,169, 12, 62,127,254,188,178,117,
-235,214, 9, 54,242,121,121,122,122,210,227,199,143,151,150,118,208,134, 13, 27,178, 81,144,112,217, 31,192, 11, 84,226,223,130,
- 9, 64, 24, 65, 16,183,142, 28, 57,130, 38, 77,154,224,200,145, 35,232,218,181,235, 45,107, 49, 16, 21, 21,133,214,173, 91,163,
-208,162,101,147,175, 86, 78, 78,206,180, 89,179,102, 93, 24, 52,104,144,248,149,198,128, 36,225,232,232,136, 46, 93,186,104,213,
-106,245, 52, 91, 11, 74,211, 52, 56, 28, 14, 18, 18, 18,176, 97,195, 6, 44, 88,176, 0,129,129,129, 48, 26,141,175,137,173,194,
-118,207,166,198,207,100, 50,225,198,141, 27,216,182,117, 43,102,124,247, 29,100, 50, 25, 0,192, 96, 48, 64,153,149, 5,161, 80,
-104, 17, 99,101, 8,167,221, 79,159, 62,157,232,227,227,243,202,148,161,249,181,176,205, 2,195, 48, 48,153, 76,208,106,181, 88,
-186,116,169,137,101,217,221,101,245, 63,102, 81, 52,113,226, 68,232,116,255, 24,212,235, 23,250, 36, 87,173, 90, 21, 33, 33, 33,
-150,125,146, 36, 89, 91, 57,127,111, 94, 23, 26,171,163,107,205, 90, 2, 0,240,241,241, 65,173, 90,181,224,233,233, 89, 34,103,
-113, 90,228,191,134, 29,145,225, 75, 22, 90, 37,101,202,126,248, 50,101,209,168,169, 75,150, 72,132, 20,247,203, 94,245, 80,197,
-145, 7,136,156,192,107,253, 13, 8,199,130,129, 60,171,124, 1,156,252, 6, 63,247, 86,146,225,127,104,255, 50,208, 10,215,231,
- 89, 89,175, 57,225,113,121,194,118, 1, 53,106, 18,113,201, 74,112, 56, 28, 72, 28, 92,208,188,215, 36, 80, 20, 9,169,163, 11,
- 8, 90,243,143, 34, 38, 41,112, 40, 14,148,185, 26, 84,245,175, 65, 10,132,162,118,234, 50,132,150,220,129,251,219,148, 1,205,
-133,153,166, 4,136,170, 8, 65,155,187, 83, 47, 62, 72,231, 92,124,213, 57, 80, 20,126,240,222,111,200, 49,182,183,229,194, 80,
- 38, 19,220, 40, 10, 6,150,197,221,137, 19, 17,182,110, 29,110,153,133,225,186,117,184, 21, 30, 14, 39, 46, 23, 2,146, 4,107,
- 52,190, 54,167,111,139,208, 2,128,248,248,120,236,221,187,215,169, 95,191,126,251,163,162,162, 6,217, 41, 54,204, 92, 46,215,
-174, 93,115,243,247,247, 47,241,152, 23, 47, 94,160, 97,195,134,118, 79, 79,241,249,252,206,237,219,183,223,177,119,239, 94,135,
- 7, 15, 30,192,205,205,237,141,133,150, 64, 32,104,221,177, 99,199, 29, 91,182,108,145,167,167,167, 99,221,186,117,242,238,221,
-187,111,143,140,140,236,165,211,233,108, 17,155,175,136,172,117,235,214,101,111,216,176,225,119,188, 58, 69,152,188, 97,195,134,
-141,141, 26, 53,250, 44, 60, 60,220, 17,192,216, 66,223,129, 82,197,150, 64, 32,104, 27, 16, 16,240,202,168, 86, 32, 40, 48, 54,
- 73, 36, 18, 56, 56, 56,128,199,227, 65,167,211, 33, 44, 44,140,224,243,249, 45,109, 57,103,153, 76,214,177,119,239,222,228,197,
-139, 23,145,146,146, 2, 71, 71, 71, 72,165, 82,208, 52,141, 81,163, 70, 81, 75,151, 46,109,171, 86,219, 55,195,229,235,235,219,
-179, 67,135, 14,156,251,247,239,227,229,203,151,208,233,116,120,252,248, 49,228,114, 57,134, 12, 25,194, 91,188,120,113,247,196,
-196, 68,123,133, 86,221,240,240,240, 84,107,145,101,134, 68, 34, 33,106,214,172,169,116,118,118,110, 0,192, 30,161, 85,247,243,
-207, 63, 79, 91,184,112, 97,235,211,167, 79, 91,130, 94,158, 62,125,122, 42, 0, 44, 95,190,252,130,171,171,107, 3, 0,182, 10,
- 45,176, 44,203,124,242,201, 39,177,124, 62, 31, 92, 46, 23,124, 62,255,149,141,199,227,129, 36, 73,153,249,113,254, 31, 22, 53,
-141, 0,252,130,130,228,186,223, 1,184,246,142,148,235, 54,128,176,174, 93,187, 90,196,214,177, 99,199,208,185,115,103,100,103,
-103,227,254,253,251,214, 34,203,158, 4,203,183,141, 70,227,157,157, 59,119, 54,239,215,175, 31, 97,245,124,225,193,131, 7,120,
-244,232,209, 45, 91,249, 72,146, 4,195, 48,224,114,185, 88,178,100, 9, 12, 6, 3,254,248,227, 15,236,217,179, 7, 36, 73,130,
- 32, 8, 16, 4, 1,185, 92,142, 21, 43, 86,216,213,238,209, 52,141,205,155, 55,227,155,169, 83, 45, 34,171,112, 38, 3, 30,238,
-238,112,118,113,193,243,231,207,203, 20, 90, 89, 89, 89, 63, 28, 58,116, 8,165, 57,195, 31, 58,116,200,242,127, 17,103,248,178,
-251, 57,138,130, 78,167,195, 7, 31,252,147, 42,246,243,207, 63,183,252,175, 84, 42, 65, 81,148,249, 90, 16,182,114,106, 88,160,
-151,240,159,247,186,124,245,213, 43, 22,186,146, 56, 75,210, 34,239,162,117,171, 24,177, 21, 86,104,157,245, 4,208, 21, 5, 62,
- 90,201, 64, 25, 62, 90, 79,210,212,171, 56, 68,114,200,194,241, 31, 14,171,226,230, 0, 54, 47, 21,188,246, 63,224, 78,186, 8,
- 75,150, 30, 5, 0,124,253,105, 67,212,239, 56, 15,250, 77, 31, 98, 98, 51,138, 63, 56, 65, 55, 5,192,204,215, 27, 70, 38,200,
-199,219, 11,119,158, 69,129, 67, 81,224, 59,184,192,193,201, 29,140, 73,143,156,180,151, 56,183,239, 87, 0,192,218,205,187, 65,
-146, 36, 56, 28, 10, 58, 61,141,192, 42, 94, 96, 24, 38,168,180,114,214, 6,154,183,117,119,105,226,235,231, 72,220, 87,188, 68,
- 77, 55,231, 34, 19, 33, 2, 4, 38, 73,137,102, 82, 81,227,172, 28, 85,243,135,192,229, 50,197, 0, 73,130, 36, 8,136,121, 60,
-232,246,238, 45,240,218, 92, 87,208,103,221, 10, 15, 7,249,215, 95,144, 9, 4,160, 8, 2,156, 66, 19,116,121,160, 82,169, 64,
- 16, 4,182,109,219,166, 24, 50,100,200,246,251,247,239,135,107,181,218,189,246,112,100,103,103,119,109,209,162,197,217,205,155,
- 55,187,122,120,120,188,246,121, 74, 74, 10,134, 13, 27,150,158,157,157,109, 87, 80, 55,161, 80,248,113,207,158, 61,215,111,218,
-180, 73,254,244,233, 83,228,229,229,193,213,213,245, 77,235,104,131,166, 77,155,238,223,187,119,175, 67, 74, 74, 10,114,114,114,
-160,211,233,176,109,219, 54,199, 46, 93,186,236,141,142,142,238, 12, 32,178, 12,142,153,214, 34,107,204,152, 49,247, 0,184, 1,
-248,173,168, 6, 45,252,172,158,149,216,202, 1,176,184,148,145,168,159, 68, 34, 65, 90, 90, 26,134, 13, 27,134, 39, 79,254, 49,
-128,122,121,121, 89, 70,122,207,159, 63,135,171,171, 43, 8,130,112,179,229,164, 93, 93, 93,165,122,189, 30, 35, 71,142, 68,124,
-124,252, 43,156, 9, 9, 9, 32, 8, 66,108,239,133,116,119,119,119,215,104, 52,104,213,170, 21,180,218,130,188,190,253,251,247,
- 7,151,203, 69, 90, 90, 26,184, 92,174, 75, 57,238,143, 75,215,174, 93, 75, 12,173, 34,151,203, 13, 10,133,162,182,157,156,206,
-221,187,119, 79, 92,183,110,221,107, 11, 91,174, 95,191,222,195,201,201,233,180,147,147, 83, 77, 59, 57, 25,107, 81,197,227,241,
- 94, 17, 90, 92, 46, 23, 36, 73, 50,248,223,199, 79, 0,204,171,224, 86, 3, 8,121,135,202,102, 17, 91,199,142, 29, 67,112,112,
- 48,178,178,178, 16, 29, 29, 93, 94,145,101,110,239,190,153, 61,123,246,201, 62,125,250, 72,204,131, 86,145, 72,132,201,147, 39,
-107,242,242,242,190,177,171, 18, 49, 12, 56, 28,142,101,144, 44, 20, 10, 17, 22, 22,102, 17, 89, 4, 65, 32, 63, 63, 31, 28, 14,
-199,188, 34,145,176,177,140,240,244,240,128, 76, 38, 67,141,192, 64, 60, 45,108, 71,204,255, 11, 4, 2, 16, 4, 1,147,169, 76,
- 67, 94,110,161, 83,251,164, 10,190, 55,172, 89, 20,149,106, 58,246,242, 2,195, 48,102,145,201, 86, 4,167,139,139, 11,242,242,
-242,108,229,124, 39, 81,130, 69,203, 44,180,186,162,192, 87,235,181,240, 14,109, 0,156,195,171, 75, 42,201,218,238,210, 13, 11,
-199,117, 24,246, 97,176, 11, 52,233, 47, 33,148,185,128,112,172,138, 37, 75,143,226,254,139, 76, 0,192,146,237, 55,177, 99, 78,
- 23, 64,228,132, 90, 14, 25,240,144,113,122, 63, 74,123, 93,104, 17, 96, 9,134,101,193,161,200,194,185, 91, 10, 20, 69, 66,153,
-158,140,101, 63,140, 45, 20, 89,123,112,228, 66, 52,124, 2,130,255,153,199, 37, 8,128, 45,189,114,187, 58,240,214,141,235,211,
- 84,148, 74, 36,195,209, 75, 12,161,176,136,126, 84,240, 64, 84, 37, 49,190,173,143,248,198, 33,237,186,135, 57,134, 50, 59, 10,
- 33, 73, 22, 56,191, 19, 68,177,206, 61,100,225,103, 20, 65, 20, 68,127,101,236,107,211,205, 66, 94, 36, 18,193, 96, 48,128,162,
- 40,172, 92,185,210,177, 99,199,142,191,217, 43,180, 0, 60, 72, 77, 77,237, 50,106,212,168, 99,187,119,239,118,113,113,113,121,
-101,244, 48,106,212,168,140,212,212,212, 46,176,211,233,158,203,229,254,182,122,245,106,121, 76, 76, 12,242,243,243, 33, 18,137,
- 44,141, 79,121,235,103,227,198,141, 79, 28, 63,126, 92,145,147,147, 3,131,193, 0,145, 72, 4,150,101, 65, 81, 20,254,252,243,
- 79,231,110,221,186, 29,141,139,139,107, 95, 90, 89, 69, 34, 81,175, 66,225,132,240,240,112,199,240,240,240, 54, 64,137,145,122,
- 45, 8, 15, 15,119,156, 52,105, 82,119,141, 70,179,184,148,115,142, 87, 42,149, 30, 34,145, 8,251,246,237,131, 84, 42,133, 88,
- 44,134,151,151, 23,148, 74, 37,196, 98, 49, 88,150,133,209,104, 52, 55, 22,153,182,156,120,122,122,122,158,201,100,114, 56,118,
-236, 24, 50, 51,255,249, 74,149, 42, 85,144,157,157, 13,134, 97,242,237,189,152, 73, 73, 73,169, 4, 65,248,222,185,115, 7, 49,
- 49, 49,232,220,185, 51,254,250,235, 47, 52,108, 88, 48, 59,172,215,235,203, 19,196,143,166, 40,138, 45,165,222, 18, 0, 20, 21,
-201, 89,216,121,217,197,201, 48, 12, 99, 22, 89,214,175,214,226,171,140,223,252, 95,129,131,245, 56,225, 93, 45,100,231,206,157,
-161, 84, 42, 33,149, 74, 43,194, 63,231,138, 70,163,121,124,224,192,129, 6, 93,187,118, 5,159,207,199,227,199,143, 17, 25, 25,
- 25, 13,224,138,189, 66,139,203,229, 98,246,236,217, 24, 59,118, 44,220,221,221,241,205, 55,223,128,195,225, 88, 54,130, 32, 44,
- 22, 46,123,224,230, 94,250,194, 71,179, 67,124, 89,198,112, 7, 7,135,217, 36, 73,246,163,108,184,112, 52, 77,211, 12,195,236,
-206,201,201, 41, 53,188,131,217,113,221,150,123, 97,125, 13,202,232,211,222,152,179, 4, 45,242,159,163,232,106,195, 18, 44, 90,
-230, 85,135,175,165, 2, 50,159,229,185, 66,147,221, 57,107,145,245,227,216,118,195, 62, 12, 86,224,224,153,107,224, 25,178, 1,
-125,110, 41,119,216, 8,130, 39,129,187, 3,183, 88, 95, 33,130,164, 30, 37, 36, 38,193, 89, 33, 45, 20, 89,133, 27, 73,162,126,
-112,193, 96,246,200,133,104,248,248, 7,131, 67, 81,224, 80, 20,164, 34, 1, 82, 83,146,193,225,144,143, 74,250,217,186, 20,250,
-244,169,233, 91, 85,225,204, 69,134,171, 30,158,238, 37, 24, 6, 26,200,224,227,201, 71, 39,103,161, 95, 93, 10,125, 74,149,229,
- 44,107, 17, 90, 6,147, 9,188,143, 63,182, 76, 23,222, 10, 15, 71,216,186,117,160,123,246,132,218, 96,120,197, 84, 92, 94,161,
- 37, 18,137,144,155,155,139, 65,131, 6, 41,141, 70,227,103,229,172, 11,145,153,153,153,125, 7, 15, 30,156,105, 22, 48, 6,131,
- 1,131, 7, 15,206,204,204,204,236,107,131,149,232, 53, 24,141,198,207, 26, 54,108,168,204,200,200,176,148,179, 60, 13,142, 25,
- 78, 78, 78, 71, 54,108,216,224,164,211,233, 96, 50,153, 44,156, 34,145, 8, 20, 69,193,213,213, 21, 59,118,236,112,117,114,114,
- 42, 53,103,149, 70,163, 57,176,110,221,186,108, 0, 88,183,110, 93, 54, 65, 16, 17, 4, 65,172, 33, 8, 98,117,145,109, 13, 65,
- 16, 17,214,199,106, 52,154,253,165,113,235,245,250,136,232,232,104, 86, 44, 22,131,162, 40, 24, 12, 6, 8,133, 66,139, 73, 92,
-165, 82, 65,163, 41,152,230,142,140,140,132,209,104,188,104,203,185,231,230,230,158,217,188,121, 51, 83,165, 74, 21, 4, 7, 7,
- 35, 44, 44, 12, 77,155, 54,133,159,159, 31,230,206,157, 75,171,213,234,115,229, 16, 90, 71,118,237,218,101,244,245,245, 69,131,
- 6, 13, 32, 16, 8, 80,191,126,125,120,121,121, 97,193,130, 5,250,156,156,156, 99,229,184, 77,113, 81, 81, 81, 84, 41, 34, 87,
- 14, 27, 86,239, 22, 65,252,141, 27, 55,168,166, 77,155, 30, 44,250, 65,227,198,141, 15, 74,165, 82, 7,179,137,221,158, 17,185,
-181,184, 18, 8, 4,150,205,252, 62,135,195,249,255, 96,209,154, 8,224, 30, 10,226, 48,125,243,142,149,205,226,248,158,153,153,
-137,232,232,104, 68, 70, 70,162,105,211,166,184,120,241, 34,240,143,131,188,221,200,201,201,249,102,206,156, 57,106,243, 74,190,
-239,190,251, 78,147,155,155,251,141,189,109, 48,203,178,224,114,185,168, 85,171, 22, 38, 77,154,132,163, 71,143,226,241,227,199,
- 48, 26,141, 22, 33,100,246,201,180,199,162,197,227,241,224,238,238, 14,163,209,104,177,102, 1,192,211, 39, 79,192,225,112,192,
- 48, 12,244,122,125,153, 22, 45, 7, 7,135,217,235,215,175,159,144,145,145,225,153,158,158,238,102,189,165,166,166,186, 37, 39,
- 39,187, 37, 38, 38,186,197,199,199,187,197,198,198,186,189,124,249,210,115,209,162, 69, 19, 28, 28, 28,102,219, 82, 78,138,162,
- 80,191,126,125,124,254,249,231,150,109,213,170, 85,150,237,220,185,115,118, 59,175, 83, 20,133, 90,179,150,160, 75, 58,107,217,
-142,186, 18,150,237,254,215, 99, 74,227, 44,170, 69,222, 9,152, 87, 27, 90, 39,150, 46, 6,230, 85,135,230,182,204,226,182, 81,
-212, 25, 30, 0, 16,228, 33,158,247,227,232,214,195, 62,168,237,128, 3,103,110, 98,206,254, 23,143, 2,135,185,214,170,174, 72,
- 7,147, 30,141,175, 63,109,136, 37,219,111, 2, 40,152, 58,100,210,238,131,205,122, 14, 86,230,139,151,202,140, 98,167, 29, 76,
-122,237,217, 23,207,158,180,171, 85,183, 17,153,146,145,247,202,242,207,176,182,125, 65, 16, 4,188,253,131, 65,113, 56,160, 40,
- 18, 28,138,130,163, 92,136,232, 59,119, 24,157, 70,115,182, 56,206, 54, 0,135, 47,226,175,250,180, 83,125, 97, 18, 63, 13,174,
-158, 18,240,184, 5,218,145,125,209,183, 72, 15,193, 1,234,202, 48, 60,209, 89,116, 54, 85,187, 74,161, 54, 28,140, 40, 97, 4,
-200, 48, 12,164, 2, 1,180, 58, 29, 52, 38, 19,218, 46, 91,102,153, 46, 36, 9, 2,183, 1,212, 91,182, 12,151,247,238,133,156,
-207, 7, 4, 2,155, 87,133, 20, 39,180, 50, 50, 50, 48,116,232,208,204,228,228,228, 33,229,241,209, 50, 67,167,211,157, 79, 73,
- 73, 25,210,183,111,223,109,251,246,237,115,234,219,183,175, 50, 37, 37,101,136,141,126, 79,175, 65,171,213,238,141,143,143,207,
- 31, 58,116,232,214,237,219,183, 59,187,184,184, 88, 70, 34,229,170,172, 4,145,209,161, 67, 7,129, 45,199,149,113,200,156, 66,
-231,246,177,133,150,173,122, 99,198,140,185,140, 2,255, 43,107,204, 90,187,118,109,127,171, 41,198, 53, 0,150,149, 70,172, 82,
-169, 86, 79,154, 52,105,196,249,243,231, 93,132, 66, 33, 8,130, 0,143,199, 67,141, 26, 53, 44,171,104,184, 92, 46, 88,150,197,
- 87, 95,125,149,145,150,150,182,220,198,123, 51,102,206,156, 57,173,181, 90,173, 98,232,208,161,148, 80, 40, 68,106,106, 42,150,
- 46, 93, 74,111,218,180, 41, 91,173, 86, 15, 43,135, 16,222,252,253,247,223,183,205,203,203,243, 31, 53,106, 20, 47, 39, 39, 7,
- 26,141, 6, 83,166, 76,209,111,220,184, 49, 65,163,209,216, 29,240,183, 89,179,102,207, 98, 99, 99, 91,230,231,231,103,137,197,
-226,162,214, 62, 66, 34,145, 52, 2,176,213, 30,206,176,176,176,231,113,113,113, 77,231,205,155, 23, 97, 52, 26,185,215,175, 95,
-239,105, 22, 89, 43, 87,174, 60, 39, 20, 10, 59,160,132,101,209,165,212, 17, 70, 32, 16,188, 98,193, 42,250, 63,135,195,249,255,
- 96,209, 58,135,130,144, 25,239, 26, 94, 17, 89,247,239,223, 71,187,118,237, 0, 0, 23, 47, 94, 68,139, 22, 45,112,241,226, 69,
-180,108,217,210,238, 88, 90,133,248, 91,165, 82,197,158, 59,119,174,142,175,175, 47,174, 92,185,242, 18,192,223,246, 22,210, 44,
-180, 56, 28, 14, 6, 14, 28,136,142, 29, 59,162, 74,149, 42,175,172, 54, 52,255,111,143,216, 48,153, 76,168, 91,183, 46,116,122,
- 61,120, 60,158,101,106,146,195,225,192,213,205, 13,207,158, 61,179,201,162, 69,146,100,191, 94,189,122,145, 15, 30, 60,192,128,
- 1, 3,176,109,219,182, 18,143, 29, 60,120, 48,118,238,220,137, 94,189,122,145,211,167, 79, 47, 53,188,131,217, 9,221,150,115,
- 50,247,211,101,181,251, 21,197,105,173, 69,222, 53, 88,133,118, 40, 14,225,197,188,183,238, 21,161,101, 21, 36, 12,254,174,226,
-225, 29,107,112,112,224,236, 77,204, 57, 16,183,153,102,217,125,251,110,101, 29,254,166, 5, 96,216,253, 41,234,247,221, 90, 48,
- 93, 8,128, 73,187, 15,195,238,193, 32,196, 46,184,144,200, 69,142,198,112,164,248,138,103,216,246,215, 31,191, 78,106,250, 91,
- 75, 87, 79, 55, 7, 40,115, 52, 22,177,117,235,220, 30, 0, 64,159, 49,243,193,161, 10,166, 20,229, 82, 33, 68, 60, 10,123,183,
- 44,207, 48, 24,180,197,214,174, 92, 46, 57,118,122,243, 26, 14,124,137, 17, 42, 15, 22,193,174,255,100,202, 33,252,247,188, 46,
-184, 66, 21,112,185,159,133, 79,171, 75,229,203, 31,100,143,133,145, 89,245, 90,135,152,157,173,201,190,115, 71,212,121,253,122,
- 92, 31, 50, 4,222, 52,141, 8, 47, 47, 56,113,185,112, 16, 8, 64, 18, 4, 52,135, 15,227,242,190,125,112, 23, 8, 0,153, 12,
-166,185,115,161,139,142,134, 49, 55, 87, 83,142,145, 25,250,247,239,159,145,145,145,209, 87,175,215,159,127,211,138,160,209,104,
-142,199,199,199,143,109,214,172,217,111, 70,163,241, 51,141, 70,115,252, 77,248,244,122,253,241,148,148,148,143,251,247,239,191,
-103,255,254,253, 46,142,142,142,229,230,202,204,204,108, 88, 65,245,157, 1, 48,163,208,185,125,108,120,120,184,227,141, 27, 55,
- 70,108,216,176,225, 55,171,209,132,219,200,145, 35, 71, 23, 17, 89,101,174, 58, 4, 16,151,150,150, 54,119,242,228,201,243,127,
-254,249,103,169,217,241,253,238,221,187, 48,153, 76,224,114,185,160,105, 26, 35, 71,142,204,203,204,204, 92,130,146, 35, 58,191,
- 86,181, 84, 42, 85,141,121,243,230,109, 88,182,108, 89, 71,138,162, 36, 52, 77,171,243,243,243, 35,180, 90,237, 48,148, 47,142,
- 22,147,158,158, 62,116,230,204,153, 67,151, 46, 93,218,139, 36, 73, 55,147,201,148,145,155,155,123, 72,163,209,108, 68, 57,166,
-146,174, 92,185,146,254,233,167,159,190, 72, 79, 79, 15,242,241,241,201,145, 74,165,122,189, 94, 79,137, 68, 34,185, 68, 34, 9,
- 3,112,133, 32,136,135,246,112,222,186,117, 43,101,212,168, 81, 49, 58,157,174,214,154, 53,107, 46,200,229,242, 51, 4, 65, 16,
- 60, 30, 79, 33, 18,137,218, 1,136, 32, 8,226,169, 61,156, 36, 73, 50,214,214,171,162,254, 89,124, 62,255,255,139,143,214,187,
- 8, 75,120,135,140,140, 12, 60,120,240,192, 44,178,194, 0,160,101,203,150,183,204, 98, 43, 50, 50, 18, 13, 26, 52,184, 5,128,
-107,111,125, 85,169, 84,147, 7, 13, 26,116,188,112,112, 60,185, 28, 3, 63,139,208, 50, 11,170, 42, 85,170, 88,246,173, 55, 43,
- 31, 45,155, 64,211, 52,120, 60, 30, 56, 28, 14, 60,189,188, 44,191,197,178, 44,158, 61,123, 6,165, 82,105,147,208,162, 40,138,
- 34, 8, 2, 3, 6,216,182, 32,249,147, 79, 62, 65, 68, 68, 4, 40, 27, 85, 33, 69, 81,168, 90,181,106,153,199,152,117,169,173,
-156, 62, 62, 62,229,230,180,214, 34,239,146,192, 42,238,255,226, 68, 85, 73, 15,196,107,120,158,166,153, 55,248,151, 75,211, 31,
-166,104,247, 69,167,230, 79, 2,192,238,190, 47, 62, 89,223,149,250,240,195,154, 9,208,173,107, 9, 66, 94, 16,188,141,205, 75,
- 6, 33,113, 71, 2,227,141, 89, 7, 31,165,152, 64,148,228,255,146,148,151,151, 51, 99,203,250,149, 63,143, 28,247,149,244,254,
-243, 84,228,228,233, 64, 81,164,117,227, 9, 14,135,130, 92, 34,132,175,135, 3,182,255,254, 75,110,174, 42,123, 38, 74,200,123,
- 88, 69,198, 27,211,161, 81,117, 1,207, 83,141, 90,245,250,131, 18,254, 35, 2,216,148, 18,102, 7, 91,156,196, 71,113,106,225,
- 95,113,234, 49,183,179,244,175, 11, 45,189,254,195,239, 58,117, 58, 49,231,232, 81,113,227,205,155,241,124,228, 72,120,105, 52,
- 16, 20, 78, 37,146, 4, 1, 41,143, 7, 41,143, 87, 32,178,150, 46,133,198,100,194,178, 33, 67,242,117,122,125, 39,123, 30,242,
-204,204, 76,244,236,217, 51, 61, 41, 41,169, 11,202, 49,181, 87, 18,212,106,245, 94, 0,123, 43,138, 79,167,211,157, 79, 72, 72,
-248,168,103,207,158, 71,143, 31, 63,238,250,142, 4,153, 51,139, 45,195,141, 27, 55, 70, 95,184,112,225, 57, 94, 77, 44,154,125,
-225,194,133,231,163, 70,141, 34, 54,108,216,176, 17,192,247,176, 49,128,167, 90,173, 94,121,234,212, 41,180,110,221,250,251,133,
- 11, 23, 58, 55,108,216, 16,110,110,110,200,205,205, 69,100,100, 36, 38, 78,156,168, 84,169, 84, 11,179,179,179,127,182,179,204,
- 6,157, 78, 55,216,122, 41,117, 69, 92, 7,157, 78,183, 41, 57, 57,121, 83, 69, 17,142, 31, 63,254,238,179,103,207, 50, 93, 93,
- 93,155,240,120,188,122, 40,240, 3, 74, 1,176,209, 94, 65,100,198,184,113,227,238, 60,123,246, 44,195,219,219,187,105, 33,167,
- 35, 10,210, 24,173, 47, 7,103,210,205,155, 55,125, 26, 53,106, 68,114,185, 92,150,162, 40,112,185, 92,150,195,225,176,133,126,
- 53, 44, 0, 28, 58,116, 72, 0, 64,137, 74,252,219,176,132,119, 72, 78, 78,182, 22, 89,102,171, 85, 88,203,150, 45,111, 21,138,
- 44,243,103,229,241, 47, 59,205, 48,204, 27,229,235,101, 89, 22,115,230,204,193,218,181,107, 81, 86, 68,243,194,213,125, 68, 89,
-124,102,139, 22, 77,211, 48, 24, 12,184,127,255,190, 37,102,151,121,186,208, 28,218,193,100, 50,149,186, 90,157,166,105, 90,175,
-215,227,207, 63,255,180, 73,108,237,216,177, 3, 90,173, 22,116, 25, 10,206, 58, 20, 67, 72, 72, 8,148, 74,165,101,177, 79, 88,
-216, 63,161,242, 12, 6,131, 93,194,213,204, 89,171, 86, 45,100,100,100,192,236, 47,236, 59,228, 31, 99,143, 73,253, 63, 27, 63,
-184, 68,139,150,205, 61,102,125, 7, 7, 7, 29,223,184,191, 71,176,160,109,191, 48, 7,248,123,200,192,229, 9,145,164, 50,225,
-244, 67, 21,214,159, 75,137,215, 24,233,110, 79,210,243,163, 74,227, 17,136,229,199, 27, 54,239,216, 98,200,232,137,146, 60, 29,
-141,152,152, 88,164,167, 37,131, 36, 72,120,122,251,192,207,175, 42, 68,124, 18,219,214,253,172,190,117,249,204,165,188,220,172,
-206, 37,113,117,117,224, 93, 94,250,113,139,166, 1, 1, 50, 2, 38, 35, 64, 27, 1,147, 17, 96, 10, 95,205,239, 49,175,214,185,
- 7, 15,178,217,233,183,149, 87,143,228, 24,138,205, 89,213, 23,104,225,232,228,116, 98,214,161, 67, 98,198, 96, 64,230,228,201,
- 16,155, 76, 16, 22,142, 74, 10, 78, 68, 0,211,220,185, 5, 34,107,240,224,252,156,236,108,187, 82,240,184,184,184,220, 36, 8,
-194, 37, 61, 61,253,189,138, 12,239,234,234,122,132,101,217,140,140,140,140,134,239, 80,185,220, 0,100, 3, 48, 20, 51,144,112,
-133,253,254, 63,102, 84,117,117,117,157, 78,146,100, 51,150,101,157, 73,146,204, 98, 24,230, 74, 90, 90,218, 34, 0,207, 42,251,
-211,255, 12,230,200,240,213,202, 56, 46, 13,192,151, 40,112, 10,142,169,188,108,255, 58, 42, 60, 5, 79, 69,194,201,201,233,218,
-137, 19, 39, 26,250,251,251,147,214, 14,239,230, 88,121,230,233, 45, 14,167, 64,203,157, 63,127,222, 52, 96,192,128, 43,169,169,
-169,173, 75,226,148,201,100, 39,239,221,187,247, 65, 78, 78,206,107,130,202, 58, 82,188,121, 95,173, 86, 99,220,184,113,167, 74,
- 74,193,227,224,224,176,244,231,159,127,158,208,167, 79, 31,210, 28,142,194,122, 51,167, 11, 50,111, 6,131, 1, 91,183,110,101,
-150, 47, 95,190, 34, 39, 39,167,196,169, 67, 79, 79,207,248,164,164, 36, 31,115,168, 5, 91,130,138, 86,173, 90, 53, 57, 54, 54,
-214,235,223,228,124,143, 5,215, 58,107,225,109,175,105,130,168,229, 38,233,207, 2,253, 72, 48,117, 73,130,224,155, 88, 60, 6,
-139,147, 98, 78,254,111,183,146, 97,211,212, 25, 87, 36, 26, 47,147, 42,126,232, 51,232,115,231,170, 1,129,132,187,167, 55, 8,
-144, 72, 77, 73, 68,236,139, 39,236,254, 63,126,205, 84,171,148,179, 53, 26,245,175,165,241,212, 6, 2,170,201,121,187,249, 52,
-106,194, 44,128,138,228,167,122,109,196, 1,192,192, 37, 31,197,228, 26,251, 63, 44,101,218,199, 44,182,102,236,223, 47,230,215,
-172,249, 90,160, 56,134, 97,160,139,142,198,178, 33, 67,236, 22, 89,149,168, 68, 37, 42, 4,254, 40, 59, 70,150, 17, 5,241,185,
- 76,149,151,235, 63,193, 59,155, 84, 26,128,196,201,201,233, 12, 69, 81,126,102,139,140,181,181,190,152,132,210, 49,169,169,169,
- 29, 0,148,182, 66, 56, 64, 38,147,253, 74,211,116, 99, 91,146, 74, 83, 20,117, 61, 55, 55,119, 60, 74, 73, 42,253, 54, 86, 29,
- 58, 59, 59, 63,139,141,141, 13, 48,175,162,182,238, 43,139, 91, 89,254,244,233, 83,180,105,211, 38, 54, 37, 37,165,234,191,201,
-249,174,162,132, 85,135,225,197,220, 99,251, 44, 90,111, 1, 94, 60,129,116, 40, 95, 36,108,207, 24, 77,181, 64, 0, 28, 46,247,
-145, 94,171, 57,171,211,228,109, 65, 9,211,133,255, 38,250, 2, 45, 4,124,254, 73,158, 92, 46, 42, 78,180, 25,115,115, 53, 58,
-189,254,195, 74,145, 85,137, 74, 84,162, 18,149,120,143, 80,211,201,201,233, 4,151,203, 21, 88,139,201,162,255,155, 97, 50,153,
-180,233,233,233,157, 1, 60,254,151, 57,223,107,216, 19,196,252, 21,216,233,164,214,209, 86,206,194,173,205,187,206,249, 22,207,
-157,173, 64,206, 54,133,156,179,222,147,114,182,121, 87, 57,205,231,107, 7,111, 71,123,234, 81, 69, 93, 79,171,114,178, 21, 93,
-206,183,197, 89, 81,207, 81, 49,229,100,223,194,125,159,245,158,148,179,205,187,198, 89,180,254,216,200,107, 23,167,141,117,202,
-222,114,178, 21, 93,206,183,197,249,166,207, 81, 41,229,100,223,180, 46,149,112,239,103,225, 61,196,131, 80,176, 15, 66,193,222,
-111, 80,108,220,198,226, 44, 90, 96, 89, 22,118, 57, 18,190,173,149, 0,230,176,251,133,252,196,187,202,105,125, 29, 42, 50, 85,
-192, 91, 72, 59,112,174,162, 57,139, 92,207,138,194,172,194, 21, 38, 17,176, 33,224,168, 61,231, 94, 17,247,189,200,185, 86, 8,
-111, 57, 68,150, 93,156, 21, 85,239,223, 54,103, 69, 61, 75, 69, 57, 43,162,222, 23,119,223,223,226, 61,170,168,114, 86,200,179,
-244, 54,234,124, 49,245,231,141,121,139,114, 86,196,179, 84,148,179, 34,234,253,191,193, 89, 17,207, 82,113,156, 21, 81,239, 75,
-186,247,239,171,133,202, 60, 93, 88, 24,226,129,176, 65,108,173, 3, 0,178, 60, 23,237,109,224,109, 36,146,172,104, 65,244,182,
-196,166, 29, 22,152,255,156,179,130,239,209,172, 66,206,138, 28,221,180,173,168,123,244, 54,234,187, 53,103, 69,241, 23,229,169,
-136,251, 84, 28,231,155,150,183,132,114, 86,248,185,191,105,189,255,183, 56, 43,248, 30, 85,200,179, 84,132,179,109, 5, 15, 6,
-218, 90,237,207,170, 72,206,138,122,150,138, 41,231, 27,223,167,226, 56,223,180,188, 37,148,179,194,207,189, 34,250,144,183,197,
-251, 95, 90,180, 88,178,196, 58,177,174,200,246,175, 8,141,255,108, 74,206, 78,238,255, 41, 78, 59,167,103, 58,190,133,123,255,
-159,150,179, 34, 57,139,150,177, 34,167,123,222,102, 57, 43,146,211,142,178,254,207,113,190,111,247,253, 93,188,158, 37,241,189,
-201,180, 84, 73,214,209,183, 81,206,138,228,180,145,251,127,130,243, 13,238,253,255, 12,202, 53,117,248, 54, 97,190,240, 21, 60,
- 50, 65, 5, 91, 96,222,218,121, 87,112, 57,219,190, 13, 11,225, 91, 64,133,151,179,112,164,252,195, 91, 56,247,247,229,154, 86,
- 62, 75,149,207,210, 59,247, 44, 21,169,147,109, 43,208, 82, 84,161,150,231,162,156, 21,241, 27,214, 28, 21, 85, 71,223,246,185,
- 87,228,179,244, 54,238,253,251,134,255, 27, 0,133,106,237, 30,181,247, 74, 74, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
+ 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,
+104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,
+136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4,
+ 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,
+188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,
+196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,
+120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,
+122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,
+128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48,
+ 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133,
+ 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185,
+ 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129,
+ 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34,
+ 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94,
+ 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,
+196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,
+224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227,
+ 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62,
+ 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,
+119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,
+176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96,
+ 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250,
+ 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4,
+ 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,
+200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143,
+ 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,
+195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192,
+ 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,
+147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137,
+ 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178,
+ 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,
+106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,
+135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,
+151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,
+152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149,
+ 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,
+150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79,
+ 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,
+187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231,
+ 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,
+235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,
+167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,
+121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60,
+ 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,
+227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,
+205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228,
+ 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147,
+ 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,
+195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,
+238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,
+131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,
+194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,
+149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246,
+ 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,
+255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237,
+ 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,
+232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,
+223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,
+204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200,
+ 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,
+119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121,
+ 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,
+144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,
+172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,
+179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,
+219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,
+202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,
+138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,
+230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,
+131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,
+209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,
+174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,
+143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247,
+ 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,
+204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,
+149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,
+206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,
+185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,
+111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,
+213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,
+203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,
+126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120,
+ 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147,
+ 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0,
+ 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 9, 30,
+ 17, 28, 2,215, 58, 34, 2, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217,146, 77,
+ 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,
+242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55,203,182,
+ 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, 0, 7,
+231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, 87, 57,
+242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185,195,217,
+ 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153,191, 43,
+167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,153,204,234,213,171,183, 2, 24,208,156,113,
+111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251,222,130,
+247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, 81,150,
+ 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252,229,156,
+205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, 13,175,
+151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78,206,230,
+ 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214,220,156,
+ 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, 9, 97,
+189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171,184,247,
+215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135,211,241,
+166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155,227, 26,
+174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206,235,150,
+243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,226, 31, 5,175,237,187,113,113,113,171,
+149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, 16,199,
+ 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, 51,250,
+247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10,195,252,
+161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159,227,184,
+ 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45,245,154,
+ 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, 63, 49,
+ 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8,128, 72,
+ 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242,242,242,
+ 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155,213, 2,
+155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70,152, 76,
+ 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79,206,105,
+211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, 18, 37,
+149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, 33, 10,
+ 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, 18, 66,
+ 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, 16,177,
+ 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173,176,217,
+108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255,172, 74,
+ 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, 76, 38,
+ 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, 91,135,
+ 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169,112,219,
+109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, 17, 69,
+ 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10,142,227,
+ 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, 50,153,
+204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158,103,223,
+113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215,106,181,
+240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, 0,118,
+187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, 49,124,
+248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, 48, 17,
+234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243,176,191,
+ 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, 0, 40,
+ 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18,221,162,
+ 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215,135,142,
+235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, 78,118,
+238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, 36,146,
+128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35,154,114,
+143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209,209, 37,
+197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12,131,249,
+243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2,207,243,
+232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156,216, 51,
+ 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, 30,135,
+ 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,
+198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229,173,137,
+202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, 97,239,
+125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, 53,214,
+ 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75,252, 46,
+ 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, 27,232,
+ 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253,150,135,
+ 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, 91, 81,
+100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231,206, 69,
+ 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197,245, 13,
+ 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, 25,134,
+ 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254,196,134,
+167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62,252,170,
+ 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, 48, 84,
+138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, 68,196,
+126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,
+143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, 16,116,
+211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,168,208,178,217,108,141, 4,212,233,211,167,
+ 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, 8, 10,
+ 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4,149, 39,
+237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,225,240,212, 92,233,172, 85,221,166,221,111,
+ 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255,204, 51,
+207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132,228,212,
+ 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, 79, 46,
+142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,198,188,188,188, 23,105,209,189, 58,145,229,
+109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, 4,191,
+124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,213,106,189, 76,240,124,252,241,199,141, 62,
+ 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, 60,247,
+220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, 49, 99,
+134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, 43,107,
+186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168,130,213,
+ 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129,200,120,
+112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,
+136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, 39,127,
+120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, 77,157,
+210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, 58, 89,
+226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, 40, 8,
+ 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,105,114,244,173,202,116,253,237,201,241,114,
+ 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106,181, 58,
+ 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, 58, 69,
+226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100,113, 28,
+ 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77,137,179,
+ 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6,118,235,
+101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44,235, 81,
+100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186,117,235,
+ 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, 71, 65,
+ 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, 53, 41,
+186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244,245,105,
+ 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, 85,226,
+226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147,179, 72,
+159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234,234,106,
+ 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39,143, 66,
+161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254,116,231,
+ 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203,151, 43,
+252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48,176,219,
+237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170,246, 93,
+ 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, 12,131,
+255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23,155, 14,
+ 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, 3,114,
+180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219,240, 41,
+204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, 31, 4,
+ 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243,136,236,
+249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184,125, 80,
+159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222,196, 86,
+ 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, 20, 10,
+ 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187,118,133,
+151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70,144, 90,
+ 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, 49,119,
+238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, 44,175,
+128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,155,214,193, 27,226,227,227,253,198,221,221,
+201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244,108, 6,
+252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74,124,241,
+197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82,142, 92,
+207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239,227,165,
+130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,182,109,219,230,229,229,229,181, 23,151,226,
+112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, 31, 98,
+ 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,171,175,175,135,201,100, 10,120, 54,111,163,
+209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, 28, 45,
+215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, 14, 98,
+183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1,252,239,
+158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26,219,248,
+ 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35,188, 55,
+ 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228,171, 20,
+ 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71,184, 21,
+ 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187,221, 94,
+156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94,243,145,
+ 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, 94,189,
+122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238,221, 43,
+117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197,117, 47,
+180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, 89,217,
+172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, 78, 19,
+ 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, 45, 33,
+ 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148,209, 4,
+ 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229,164,156,
+148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,
+163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, 97, 24,
+226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238,212, 89,
+173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67,183,146,
+ 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212,179, 9,
+215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0,224, 17,
+199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149,209,106,
+181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71,129, 34,
+ 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,
+113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101,153, 68,
+194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248,102,218,
+ 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, 28,199,
+ 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173,216,219,
+ 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, 78, 95,
+225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102,243,153,
+144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136,213,106,
+ 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, 27,189,
+181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, 52,154,
+ 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, 25,185,
+225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, 29, 18,
+ 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, 50, 96,
+192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, 97, 1,
+114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242,197, 89,
+124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, 52, 33,
+109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, 94, 13,
+ 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212,213,213,
+ 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245,122,162,
+215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156,188, 70,
+163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135,151, 25,
+141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, 64,226,
+227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, 23,241,
+241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64,175,217,
+ 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, 31, 58,
+116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73,183, 49,
+106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, 66,161,
+184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,219,119,232,208, 65,145,144,144,192, 94,188,
+120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233,167, 91,
+105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, 90,252,
+209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63,125,250,
+116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66,136,213,
+ 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83,104,240,
+ 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, 41,154,
+ 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97,227,198,
+141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200,125,159,
+ 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219,189,198,
+217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176,222, 9,
+ 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210,210, 82,
+244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, 20, 13,
+ 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151,131, 91,
+ 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, 2, 17,
+ 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135,250,250,
+122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139,209, 54,
+155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, 13, 37,
+ 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211,167, 79,
+227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126,244,209,
+ 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,255, 77,118,236,216,177,216,113,227,188,166,
+167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144,161, 67,
+135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204,204,204,
+189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114,118,141,
+123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2,230,189,
+187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132,179,137,
+ 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, 8,136,
+147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237,206,233,
+175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, 58,228,
+ 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,
+117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, 51, 43,
+ 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, 76,120,
+115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121, 28,101,174,209,177,158,126,187,127,122,226,
+110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86,125,125,
+ 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221,139,242,
+242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, 17,221,
+186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64,169, 84,
+ 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115,239,122,
+ 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, 97,195,
+162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, 44,203,
+ 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, 1, 30,
+ 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249,166, 30,
+128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,174,122,190,117, 81,209,133,246, 17,173, 34,
+117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153,188,105,
+125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207,158,237,
+147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233,165, 70,
+215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, 64,102,
+102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242,200, 59,
+111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0,119,222,
+121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, 47, 43,
+ 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, 92, 69,
+148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, 9, 25,
+126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170,170,143,
+ 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, 82,169,
+ 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100,100, 36,
+244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, 8,173,
+ 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249,228,147,
+123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116,117,182,
+188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107,107,203,
+ 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245,176, 97,
+195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, 66,105,
+ 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, 93, 42,
+149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, 0, 99,
+ 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127,253,117,
+112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, 83,122,
+122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220,220, 92,
+ 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, 26,141,
+ 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152,240, 38,
+195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, 78,111,
+231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171,200,114,
+253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74,255,208,
+ 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, 13,131,
+ 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61,123,246,
+ 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204,108, 54,
+ 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140,234,158,
+182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176,217,108,
+ 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,251,207,133,134,134,226,145,135, 31,102,111,
+233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186,129, 86,
+ 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84,121,107,
+ 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64,118,158,
+139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222,233, 87,
+184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126,251,237,
+167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221, 59,133,101,217,195,165,165,165,133, 39, 78,
+156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, 65, 20,
+ 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59,157, 99,
+ 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232,209,163,
+255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163,193,218,
+181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249,161,253,
+250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217,217, 0,
+202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, 18, 88,
+ 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, 56,170,
+209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123,227,255,
+221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223,125,247,
+101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, 12,173,
+ 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150,197,204,
+153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, 49, 66,
+ 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,
+199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78,157, 58,
+207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117,238,220,
+ 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203,241,199,
+229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35,145,229,
+ 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, 33,195,
+135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177,178,178,
+210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, 58, 0,
+235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153,192,114,
+ 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44,145,159,
+227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134,210,210,
+ 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35,
+ 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199,127,254,
+249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, 5, 76,
+210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243,130,130,
+130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, 76,109,
+178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248,116, 63,
+ 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, 16, 71,
+ 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250,223, 2,
+112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, 99,128,
+ 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,
+122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, 82, 83,
+ 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234,212,138,
+233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,149,124,222,188,121, 10, 0,232,214,173,219,
+ 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148,148, 20,
+232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, 75,116,
+200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14,221,197,
+129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233,211,155,
+165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213,171, 67,
+142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212,190, 63,
+147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7,163,164,
+164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, 10,149,
+149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,
+139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,
+246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64,113,113,
+177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87,174, 92,
+121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, 68, 34,
+ 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122,125,146,
+120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238,251, 2,
+ 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, 0, 0,
+111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76,157, 58,
+245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212,217, 4,
+217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213,212,212,
+ 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228,182,219,
+110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106,240,245,
+215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190,190,222,
+ 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78,193, 21,
+128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109,219,150,
+ 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180,106,213,
+ 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163,208,149,
+ 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, 88, 93,
+ 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120,226,180,
+217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93,187,236,
+ 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, 35, 23,
+ 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107,117,230,
+ 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143,214,101,
+156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107,181,218,
+ 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, 57, 30,
+146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, 23,130,
+211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117,182,232,
+248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,
+157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2,102,207,
+158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, 1, 32,
+ 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, 12,195,
+ 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,126,217,113, 26,141,102,233,204,153, 51,223,
+123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135,170,170,
+ 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, 16, 89,
+ 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172,215, 46,
+227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238,188,243,
+206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130,194,159,
+208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47,170, 84,
+170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97,195,134,
+ 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240,240,227,
+ 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, 55,125,
+250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, 97,239,
+222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60,254,248,
+227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59,229,112,
+178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, 61,122,
+212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191,169,205,
+133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, 8,113,
+114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169,106,241,
+ 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201,100,122,
+ 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60,121, 50,
+147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158,131,163,
+ 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, 8, 33,
+113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54,235,116,
+186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138,191, 8,
+102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,135, 14, 29,252,190,156,121,224,188,224, 67,
+ 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, 35, 8,
+189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141,236, 71,
+133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,
+126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, 32, 20,
+127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,184,247,188, 94, 57,125,161,164,164,228,102,
+ 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, 48,228,
+ 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, 73, 57,
+ 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21,
+ 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, 0, 32,
+149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39, 79,118,202,206,206,142,139,143,143,255,176,
+ 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106,106,106,
+ 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, 22, 20,
+ 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, 88,178,
+100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51,124, 55,
+221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111,151, 46,
+ 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161,160,160,
+104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, 0, 52,
+ 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,252,248,113,146,154,154,106, 8, 80,208,164,
+118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97,195, 6,
+ 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,124,245,213, 87,100,213,170, 85,228,199, 31,
+127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153,153,153,
+ 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, 59,118,
+236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,230,205,169,193,193,193,206,157,130, 32,192,
+ 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, 55,131,
+193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,
+231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108,151, 46,
+ 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, 46, 93,
+250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,130,130,162,153,112,164,182,182,182,139,201,
+100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,168,188,166,123,247,238,123,114,114,114, 82,
+141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215,174, 93,
+225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2,120,209,
+241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160,128,102,
+ 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176,217,108,
+206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208,161,195,
+161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, 97,114,
+ 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51,102, 76,
+ 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58,213, 27,
+192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82,210,174,
+138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50,153,208,
+174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,135,238,221,187,163,115,231,206,168,175,175,
+119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17,219, 68,
+ 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209,174, 93,
+ 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56,123, 5,
+ 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, 91, 89,
+ 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150,101,229,
+ 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, 2, 28,
+ 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69,156,202,
+113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52,104, 80,
+ 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111,223,190,
+ 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59,118, 44,
+144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12,131,194,
+194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92,184,112,
+ 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,
+195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57,114,100,
+137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152,152,152,
+ 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, 4,166,
+118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, 74,138,
+241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,
+188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202,145, 35,
+ 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,150,150,146,210,210, 82,113,106,132,124,252,
+ 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10,133, 98,
+131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114,229, 74,
+242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,
+156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198,243,105,
+185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166,198,199,
+199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100,100,164,
+ 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142,151,162,
+248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,185,227,247,223,127,119,157, 71,203,219,188,
+ 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184,112,161,
+255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213,235,245,
+163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, 10, 45,
+ 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, 57, 52,
+ 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, 7,175,
+231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, 5, 5,
+ 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33,155,114,
+ 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207,230,100,
+ 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226,239, 7,
+215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18,113,191,
+158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205,175,162,
+163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70,188,202,
+ 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217,134,174,
+124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, 77,121,
+121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, 21,255,
+ 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57,127,212,
+168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, 63,237,
+118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90,139, 43,
+ 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202,202,126,
+254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247,203, 56,
+ 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62,246,198,
+ 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219,237,176,
+219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, 38,128,
+183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211,236,156,
+ 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, 13, 77,
+114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, 3, 0,
+ 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118, 27,170,170,170,254,209,133,235,230,244,132,
+247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, 51, 26,
+141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50,137, 68,
+ 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89,169,250,
+179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6,241, 0,
+238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19,240,176,
+ 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215,138, 21,
+ 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228,200,145,
+ 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209,139, 22,
+ 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123,238, 25,
+253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71,142, 40,
+219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, 59,118,
+236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236,216,177,
+216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, 74,113,
+246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, 31, 0,
+250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, 79, 5,
+215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44,196,238,
+159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245,254, 56,
+ 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12,
+ 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131,196,196,
+ 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, 65,104,
+120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147,248, 57,
+108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, 16, 6,
+150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114,200, 27,
+ 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244,238,221,
+123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186,186, 58,
+156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,
+174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, 23, 2,
+ 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,
+231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,
+131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112,199,205,
+ 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, 7, 3,
+192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119,223,200,
+239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247,222, 59,
+114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132,214,161,
+ 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122,170,137,
+ 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245,216,189,
+247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113,246,255,
+ 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244,232,209,
+203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, 15, 15,
+ 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, 31,124,
+240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32,254,147,
+225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, 15,207,
+243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223,126,251,
+ 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254,121, 0,
+ 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, 6, 0,
+ 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, 2,214,
+174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107,161,213,
+106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70,146,231,
+188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,244,202,228,128,194,216,186,117,235,167,127,
+248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86,224, 56,
+ 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, 97,195,
+134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2,191,207,
+ 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40,238,174,
+156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242,234,102,
+ 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94,114, 43,
+ 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, 66, 61,
+240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, 46,151,
+ 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, 55, 0,
+148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227,101,144,
+ 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48,126,251,
+ 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150,245,148,
+179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, 97,156,
+110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, 97, 52,
+ 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180,104,162,
+ 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, 62,139,
+ 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111,203,114,
+ 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144,134,174,
+183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228,201,147,
+ 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178,176,168,
+168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, 40, 16,
+ 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1,131,118,
+109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61,186, 92,
+100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93,198, 25,
+ 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129,236, 75,
+ 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, 59, 9,
+ 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214,245,193,
+235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, 24,134,
+193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,
+199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239,223, 15,
+ 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223,184,215,
+215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164,160,182,
+182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191,219,136,
+ 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180,136, 83,
+111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119,
+ 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, 73, 6,
+ 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, 53, 3,
+ 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71,107,199,
+176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177,177,177,
+ 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, 7, 3,
+192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236,220,185,
+ 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228,216,241,
+227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190,192, 83,
+ 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, 71,182,
+ 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37,235, 30,
+ 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,243,206, 59,248,247,191,255,125,153,171,229,
+239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209,104,132,
+201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155,192,182,
+211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,
+255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, 69,139,
+ 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190,254, 83,
+ 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171,213, 6,
+131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106,117,163,
+102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, 23,222,
+155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182,111,143,
+ 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, 20, 20,
+160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113,235,173,
+183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,149, 43,145,154,154,234,151,179, 83,167, 78,
+ 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,111, 18,231,134,189,231,241,229,198,205, 48,
+153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, 92, 52,
+ 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221,207,247,
+199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,195,107,107,107,113,250,244,105,176, 44,235,
+108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187,183, 7,
+ 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112,112,176,
+243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3,134, 1,
+ 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59,168,213,
+106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, 22, 77,
+ 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, 66,104,
+ 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36,129, 64,
+ 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51,103,222,
+243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168,168, 40,
+235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109,228,229,
+229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, 6, 0,
+224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,
+112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, 69, 68,
+243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68,198, 55,
+201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, 24,176,
+224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, 60, 9,
+ 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250,219,172,
+172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52,154, 81,
+ 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, 40,186,
+246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252, 32, 18,137,240,237,183,223,226,198,165, 19,
+144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199,142,136,
+238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225,183,223,
+126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45,120, 51,
+103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, 29,135,
+247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10,215,239,
+186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, 69, 16,
+196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20,138,246,
+158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186,249,243,
+231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, 86, 10,
+231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28,195, 3,
+216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,
+133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, 8, 4,
+165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60,143,176,
+ 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48,181,253,
+126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248,240,225,
+213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, 72, 78,
+ 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, 15,200,
+206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146,132, 5,
+192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, 95, 28,
+ 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, 81, 0,
+ 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132,119,230,
+252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, 31,157,
+ 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132,
+ 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72,
+ 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, 70,163,
+ 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, 15,177,
+177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, 0, 84,
+187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161,161, 88,
+183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,157, 50,199,197,197,221,138,139,139,139, 38,
+ 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,118,119,220,105,191,209,190,190,190,130,240,
+240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190,125, 27,
+171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37,151,203,
+ 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, 98,177,
+184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116,104,231,
+108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128,135,201,
+100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,
+104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, 7,188,
+252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, 62,124,
+136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, 64, 65,
+238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253,169,252,
+252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102,179, 25,
+245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, 58, 35,
+148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99,237, 47,
+236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31,118,139,
+ 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33,147,185,
+221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, 47,205,
+187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241,227,209,
+189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, 96,193,
+ 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206,156,229,
+238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15,220,185,
+115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201,193, 71,
+ 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, 66, 33,
+124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125,170,202,
+ 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134,214, 93,
+ 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, 84, 38,
+147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19,116, 90,
+ 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10,186,175,
+ 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, 6,147,
+ 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127,213,171,
+ 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, 71,141,
+102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113,243,198,
+ 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237,222,237,
+114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198,140, 25,
+216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, 92, 82,
+ 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249,217,103,
+159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231,227, 1,
+ 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240,224, 65,
+171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249,249, 88,
+188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47,103,209,
+178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, 67,135,
+ 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, 94,201,
+220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, 80,169,
+ 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61,123,246,
+188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68,152, 76,
+ 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80,131,248,
+ 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175,191,254,
+122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155,104,175,
+197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125,214, 93,
+ 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85,210, 39,
+187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52,105,130,
+179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79,238, 66,
+161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, 66,203,
+145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48,114,228,
+200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246,239,223,
+191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111,174,208,
+202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, 32, 38,
+ 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29,224, 43,
+234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109,139,220,
+220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53,107,214,
+ 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145,151,237,
+247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211,230, 2,
+ 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123,247,238,
+163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251,104, 50,
+ 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48,186,141,
+ 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118,222, 29,
+211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238,221,187,
+135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34,118,210,
+220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214,179,142,
+202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, 9,192,
+ 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, 33, 33,
+101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, 68, 71,
+ 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, 43,216,
+ 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40,239, 79,
+245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5,
+ 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56,246,218,
+210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150,235, 63,
+186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66,225,225,
+ 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, 18, 13,
+ 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232,208,161,
+ 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, 8,185,
+ 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60,136,185,
+ 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206,159,171,
+178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, 8,241,
+241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, 99,206,
+178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77,235,210,
+ 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,
+221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193,193,193,
+168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77,115,179,
+ 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, 79,163,
+138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231,130, 32,
+ 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, 87, 42,
+178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227,170, 61,
+236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219,135,226,
+ 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181,211,141,
+ 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107,132,132,
+132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, 76, 66,
+ 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, 98, 28,
+ 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118,206,235,
+ 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107,209, 34,
+ 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211,166, 85,
+ 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89,183,170,
+ 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236,193, 49,
+203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76,112,224,
+192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, 21, 77,
+150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,
+247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90,111,232,
+151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, 75,224,
+ 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, 3, 9,
+ 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54,108, 10,
+254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94,186,116,
+169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, 65, 16,
+156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101,202, 20,
+ 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251,255, 38,
+212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, 64, 98,
+ 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, 63,109,
+208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184,154,157,
+ 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, 53,188,
+ 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, 91,213,
+ 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,131,224,210,250,143,122,179,222,185,124,107,
+ 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, 78, 6,
+ 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,223,211,105,219, 31,118, 65,101,143,107, 87,
+109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240,198,172,
+171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74,127,237,
+112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78,157,109,
+181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151,224,189,
+212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231,228, 57,
+121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, 57,121,
+206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, 15, 30,
+ 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193,131, 7,
+ 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, 15, 30,
+ 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, 15, 30,
+ 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60,120, 60,
+ 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120,240,224,
+193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, 33,127,
+ 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, 8, 87,
+235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1,126,232,
+144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115,242,156,
+ 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, 87,158,
+147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60,120,240,
+224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111,135,109,
+191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, 3,208,
+ 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245,235,215,
+ 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246,127, 17,
+128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253,165,173,
+221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163,235,215,
+175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220,232, 50,
+ 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114,189,201,
+147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, 32,180,
+213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,
+222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, 38,145,
+ 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104,142,227,
+ 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63,162, 1,
+252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175, 95,191,222,116,247,238,221,204,215, 95,127,
+ 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206,245, 89,
+150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, 0,136,
+151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104,104,124,
+ 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225,213,164,
+124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,109,223,126,251,237,247, 55,110,220, 88,119,
+196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, 57,128,
+207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, 39, 43,
+152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176,123,247,
+238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95,178,100,
+ 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8,128,132,
+106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113,162,235,
+198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190,224, 56,
+ 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, 90, 34,
+145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118,237,218,
+ 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, 36, 73,
+250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, 99, 98,
+ 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224,216, 13,
+ 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, 41,248,
+246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199,143, 87,
+118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, 33, 33,
+225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,
+167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60,126,252,
+248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78,157, 58,
+ 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, 82,149,
+217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55,110,124,
+250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221,169,211,
+222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0,188,188,
+188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2,193, 96,
+137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100,232,144,
+126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, 9,185,
+ 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, 86,104,
+181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,123,194,217,207,179, 11,162,248,120,217,125,
+ 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, 23, 46,
+ 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110,221,186,
+117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238,221,239,
+ 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214,111, 16,
+ 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37,157,110,
+ 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203,231,218,
+181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,229,203,151,235,237,223,191,127,209,233,211,
+167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, 65,126,
+252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, 57,162,
+110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11,185,185,
+185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186,104,236,
+203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, 67,253,
+227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, 94, 75,
+ 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, 38, 34,
+ 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, 35, 70,
+140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164,164,200,
+151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221,234,244,
+127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, 72,123,
+156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, 5,225,
+225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136,141,141,
+157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, 16, 71,
+ 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, 47,160,
+134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214,173, 91,
+ 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, 74,229,
+161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105,130,166,
+105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71,188,190,
+120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, 78, 89,
+188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250,254, 61,
+168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27,127,104,
+171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65,172,234,
+216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184,208,197,
+100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, 44, 44,
+ 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194,100, 50,
+225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146,249,140,
+137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43,104, 0,
+ 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216,207,113,
+210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,
+172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220,160,102,
+100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46,119,211,
+ 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130,226,227,
+227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217,217,109,
+ 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, 94,192,
+ 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122,189, 30,
+122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,
+183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135,102, 77,
+197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179,102,224,
+ 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81,217,165,
+ 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88,173, 86,
+212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238,242, 81,
+ 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, 58,249,
+228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198,201,161,
+196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, 14,205,
+155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5,160,168,
+ 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,122,246,145,201,100,245,105,154, 38,117, 58,
+ 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191,255,254,
+123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110,216,189,
+ 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95,133, 69,
+203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227,227, 3,
+171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135,176,205,
+ 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179,217, 12,
+157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, 38,228,
+114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131,125, 70,
+ 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, 15,251,
+140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86,215,174,
+ 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, 94,222,
+207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45,154,166,
+ 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235,220,228,
+172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8,244,108,
+ 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,156,156,108,154, 63,127,126,131,237,219,183,
+ 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114,114,114,
+240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, 45,164,
+122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,209,158,217,179,103,123,188,242,202, 43, 77,
+165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178,161,117,
+130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198,153, 51,
+103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, 34, 35,
+ 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249,242,101,
+125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131,108,189,
+ 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167,181, 13,
+ 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,
+150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, 98,234,
+212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, 22, 40,
+147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194,173,176,
+ 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, 42,227,
+124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176,149,159,
+ 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57,115,230,
+ 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,
+193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, 58,137,
+245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90,212,228,
+ 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175,255,163,
+ 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155,231, 15,
+213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226,228,139,
+ 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, 72,160,
+100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, 19, 34,
+151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, 56,152,
+ 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16,191,100,
+101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148,148,212,
+ 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61,
+ 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212,162, 37,
+ 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192,148, 41,
+ 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, 20,202,
+229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, 56, 48,
+ 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155,254,132,
+179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62,248,224,
+ 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43,127,179,
+ 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93,187,182,
+227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,
+214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, 79,229,
+102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125,111,221,
+186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69,177, 19,
+226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156,214,255,
+176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, 9,128,
+246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, 74, 37,
+214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,219,183,111, 15,254,250,235,175,133, 49, 49,
+ 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, 64, 32,
+ 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151,150, 44,
+251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64,105, 53,
+160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, 54,212,
+104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67,
+ 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9,125, 52,
+243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92,184,112,
+161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,176,249, 31,238,222,185, 7,239,188,243, 14,
+145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, 51,164,
+ 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62,171, 22,
+ 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, 63, 0,
+152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142,142,238,
+ 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, 85,212,
+ 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142,176,176,
+171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,248,176,110,221,186,113,215,175, 95, 39,157,
+ 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, 53,156,
+ 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111,139,137,
+213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, 51, 62,
+120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,218,182,109,155,234,218,181,107, 2,154,166,
+149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31,127,204,
+191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, 23, 23,
+151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235,213, 89,
+ 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67,252,229,
+ 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, 8,132,
+247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,
+224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167,159,126,
+138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139,136,136,
+ 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, 60,120,
+ 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133,196, 83,
+106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, 65,116,
+ 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248,193,158,
+ 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223,202,228,
+114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148,204, 94,
+140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, 31,138,
+120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200,214,248,
+248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,243,198,142, 29,155,181,105,211,166,144, 17,
+ 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120,233,222,
+189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8,130,226,
+ 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,123,247,250,247,232,209,195,192,178, 44,119,
+236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21,167,253,
+ 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219,219, 27,
+106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175,240, 6,
+ 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23,189,229,
+114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, 68,198,
+196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107,214, 12,
+147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,
+127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83,166, 76,
+169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214,153,147,
+101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161,197,100,
+ 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, 33, 21,
+170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217,150, 42,
+ 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, 77,189,
+175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239,223,223,
+ 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96,177, 88,
+ 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, 18, 98,
+215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, 44,231,
+179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85,230, 60,
+ 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, 18, 18,
+200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, 71,143,
+ 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139,138,138,
+170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206,195,108,
+ 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,235,221,115,198,140,125,243,254,243,159, 32,
+100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150,178, 44,
+ 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110,197,178,
+163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, 62, 62,
+ 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153,198,111,
+189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152,215, 0,
+188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, 62,126,
+ 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123,247,238,
+ 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245,235,215,
+175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245,207, 82,
+171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76,152, 48,
+ 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, 60,120,
+240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, 51, 51,
+ 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208,207, 21,
+ 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, 66,145,
+ 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, 9,133,
+194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, 62, 10,
+ 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,
+235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223,153,206,
+167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100,228,246,
+154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, 36,242,
+ 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46,103,152,
+ 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194,169,213,
+106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, 59,117,
+234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, 59,212,
+184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167,211, 49,
+ 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, 31,133,
+198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57,142,243,
+229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174,239,103,
+104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212,231,113,
+210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, 45, 13,
+109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56,203,161,
+ 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113,175,110,
+221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, 13, 38,
+ 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, 84,181,
+159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,
+158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,
+170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117,102, 19,
+212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, 21, 94,
+ 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,248,140,138,172,110,246, 21,126,232,144, 7,
+ 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, 64,176,
+230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138,138, 13,
+ 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126,152,168,
+187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207,124,211,
+101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,
+163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, 1, 82,
+130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, 74, 9,
+ 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137,175, 56,
+112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182,108,169,
+241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181,164, 84,
+ 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31,124, 16,
+108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, 20, 32,
+169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174,179,182,
+ 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198,144,251,
+247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, 28, 37,
+ 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, 63, 18,
+ 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177,111, 99,
+130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3,154, 10,
+114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159,157, 61,
+123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, 46,215,
+ 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177,104,229,
+210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34,137, 68,
+ 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252,159, 26,
+193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222,248,238,
+216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201,108,195,
+134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21,207,153,
+ 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158,125, 31,
+ 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, 78,120,
+242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46,220,121,
+163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207,121, 66,
+161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, 30, 60,
+158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208,160, 1,
+134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,145, 95,205,127,152,173,187,114,228,200, 17,
+116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, 93,103,
+226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, 34, 19,
+142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122, 46,132, 86,112,112,112,211,128,128,128, 50,
+ 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27,195,136,
+ 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, 88,187,
+114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188,120,177,
+ 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210,194, 63,
+ 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, 42,171,
+ 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4,101,189,
+ 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200,145, 35,
+221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126,163, 63,
+ 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13,148, 8,
+128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248,119,124,
+108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7,153, 64,
+157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90,173,172,
+ 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110,213,155,
+ 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254,253, 83,
+ 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162,210, 26,
+ 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138,138, 74,
+111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, 58, 30,
+ 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, 70, 3,
+165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, 34,207,
+160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, 47,195,
+ 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, 44, 5,
+138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, 28,138,
+ 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19,197, 90,
+ 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195,134, 13,
+203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225,225,166,
+128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, 23,122,
+110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, 29,146,
+201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, 22,139,
+ 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114,182,106,
+ 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171,162,235,
+ 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, 32, 25,
+ 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, 13, 20,
+ 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, 0, 8,
+133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22,139, 75,
+ 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171,150,147,
+216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, 81, 81,
+ 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152,236, 8,
+ 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29,236,235,
+ 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245,159,246,
+ 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120,135,198,
+253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,164,246,252,199,227,254,117,192, 81,204,249,
+250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, 14, 40,
+132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, 26,161,
+209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48,176,165,
+ 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, 84,236,
+154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, 54, 27,
+ 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,
+146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, 69,144,
+230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75,244, 48,
+ 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57,203,178,
+173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208,180,113,
+ 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250,122, 35,
+135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81,175,189,
+ 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, 34, 61,
+ 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148,221,132,
+228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217,217,153,
+ 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84,148,175,
+125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, 0,240,
+235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212,114,150,
+172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, 79, 8,
+151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111,169,224,
+ 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241,244,233,
+211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236,178,118,
+237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123,166,249,
+244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112,183,193,
+129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114,248,168,
+ 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, 51,102,
+ 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197,115, 96,
+214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, 84,255,
+204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94,191,206,
+157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, 47, 94,
+108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176,131,166,
+105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, 58,149,
+243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109,105, 90,
+ 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154,166,109,
+ 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249,211,167,
+ 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, 99,191,
+110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, 78, 30,
+ 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, 48,245,
+253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, 37,149,
+ 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,
+118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, 17,203,
+178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, 41, 16,
+ 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, 11,251,
+244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138,122,104,
+231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198,197,202,
+136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, 6, 12,
+144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139,
+ 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, 16, 7,
+ 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123,251,185,
+239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109,163, 14,
+171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148,138,111,
+167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, 78,180,
+ 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15,104,208,
+197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224,171, 0,
+ 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119,129,149,
+ 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180,221,112,
+158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,
+144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,247,237,126,251,246,237,174,115,231,206,225,
+214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173,131,243,
+187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112,248,130,
+157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42,114,250,
+ 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, 95,214,
+164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, 17,173,
+177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,212,168, 81,252,121,243,230,225,224,193,131,
+184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, 14,133,
+252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, 68, 86,
+ 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, 36,138,
+ 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140,148,113,
+106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116,172,224,
+163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158,150,150,
+134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, 91,190,
+124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108,114,243,
+226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212,173, 91,
+ 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, 35,140,
+141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144,144,144,
+ 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229,155, 5,
+148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145,113,240,
+240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215,126, 27,
+230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, 30,218,
+169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251, 49,207,224,163,245,207,128,205,102,251, 45,
+ 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,199,114,163,163,163,253,228,114,249,141,255,
+194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,
+117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, 28,117,
+248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195,225,176,
+163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, 96,192,
+103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, 58,125,
+250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211,165, 19,
+ 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, 10, 64,
+ 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69,
+ 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, 48,217,
+ 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, 84, 26,
+ 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, 43,161,
+ 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, 65,131,
+ 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60,105,196,
+214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, 39,191,
+ 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, 0, 80,
+ 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246,188,106,
+172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, 85, 60,
+154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52,112, 26,
+ 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0,181,180,
+104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38,168,141,
+178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, 79, 18,
+208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,
+255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125,218, 39,
+ 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46,147,201,
+234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, 24, 96,
+128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180,166,136,
+ 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, 57,163,
+ 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55,117, 64,
+ 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, 44, 86,
+ 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73,146,108,
+102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, 46, 71,
+152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, 74,128,
+234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, 57,218,
+111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117,165,114,
+190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81,212, 68,
+ 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233,241, 61,
+ 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114,231, 69,
+ 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37,177,106,
+213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21,149,174,
+ 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, 46, 24,
+226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240,169, 69,
+ 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, 90, 26,
+ 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18,135,132,
+132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150,172, 24,
+148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, 23, 89,
+237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77,203,149,
+ 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218,168, 84,
+170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145,104,221,
+186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,
+239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31,223,250,
+210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157,188, 82,
+135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107,117, 91,
+ 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213,169, 89,
+ 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197,138, 21,
+ 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192,231, 2,
+ 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, 81,225,
+ 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, 18, 21,
+ 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81,178, 87,
+171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70,130,203,
+229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120,223,219,
+ 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, 51, 69,
+ 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, 52,120,
+155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, 77,167,
+204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, 83, 0,
+236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93,187, 86,
+ 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,
+108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, 0, 88,
+ 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,118,221,122,245,234,197,236,212,169, 19,156,
+156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, 41,169,
+215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170,236, 91,
+243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154,132,189,
+ 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, 3,160,
+ 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110,146, 36,
+121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, 76,215,
+110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70,247,235,
+215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, 4,141,
+ 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, 9,228,
+146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, 10,168,
+ 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, 15, 63,
+ 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230,131, 6,
+ 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,
+112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222,187,119,
+143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, 68,183,
+122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18,227,208,
+237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0,190, 30,
+ 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93,186,116,
+241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, 0, 88,
+ 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4,141, 26,
+ 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133,163,163,
+ 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149,181,215,
+225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, 75, 65,
+ 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, 51,143,
+199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, 29,145,
+ 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175,141,219,
+ 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68,152,113,
+ 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237,233,218,
+237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, 98,130,
+240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, 90,180,
+240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, 36,222,
+ 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, 21, 21,
+197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203,139,127,
+242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, 5, 37,
+ 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, 27,111,
+ 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102,239,138,
+198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, 27, 46,
+184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223,199,199,
+ 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, 82,176,
+217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, 74,165,
+ 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, 75,159,
+ 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, 66,169,
+ 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, 88,180,
+180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,
+217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89,123,157,
+199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11,175, 93,
+187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104,216,176,
+ 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16,192, 51,
+146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107,179,220,
+244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6,133,157,
+ 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61,235,102,
+146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219,216, 90,
+ 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,
+228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28,115,103,
+227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139,
+ 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,
+232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,
+221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,
+124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,
+132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,
+114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, 0,158,
+158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171,208,210,
+136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, 66,245,
+209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, 48, 30,
+ 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127,253,181,
+231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13,126,169,
+ 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5,203,151,
+ 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164,103,167,
+ 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75,131,197,
+139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189,141,245,
+162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204,105, 16,
+157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, 77, 62,
+122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, 58,117,
+234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57,251,181,
+106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, 72, 42,
+148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, 56,133,
+240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69,112,115,
+ 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117,234,212,
+152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, 32, 63,
+ 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63,252,240,
+131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,242,221,187,119,230,218,243,116,229,148,201,
+100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,150,122,253,159,204,162,165,249,205,227,241,
+ 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102,179, 49,
+ 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209,108, 54,
+123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123,129, 64,
+208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193,101,128,
+ 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11,151,110,
+ 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, 6,165,
+ 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59,145,116,
+234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, 22,160,
+124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118,111,223,
+190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107,215, 50,
+ 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, 86, 27,
+143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, 90, 90,
+ 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13,181,201,
+145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28,113,227,
+233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162,208,210,
+ 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,
+177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5,194,194,
+194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221,186,117,
+235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, 97,218,
+ 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, 42, 73,
+181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241,139, 78,
+ 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135,119,173,
+180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245,155,232,
+155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, 63,118,
+149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, 0,206,
+215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126,185,153,
+226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135,216, 75,
+ 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, 67, 14,
+ 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15,182,109,
+219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22,173,202,
+ 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114,185, 28,
+102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168,
+ 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, 87,109,
+ 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, 42,249,
+ 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186,113, 96,
+123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183,116,187,
+ 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,240,209,113, 27,212,194,222,218,246,198,161,
+224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, 15,246,
+107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, 55, 7,
+186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,169,169,169,188,168,168, 40,241,222,189,123,
+179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, 2,171,
+196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,
+230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213,154, 5,
+192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103,120, 77,
+122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, 86,101,
+209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14,172,141,
+200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, 48, 54,
+ 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, 17, 77,
+211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101,203, 84,
+225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255,226,238,
+105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127,219, 81,
+ 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230,188, 3,
+104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135,136,172,
+145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24,104,215,
+215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,250,245,135,222,191,127,223,214,219,219,155,
+ 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145,108, 14,
+130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151,135,156,
+156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,251,186,118,240,222,189,123,245,211,210,210,
+ 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, 1,191,
+ 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, 57, 2,
+146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86,109, 56,
+105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, 20,208,
+ 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70,112, 85,
+152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216,216, 88,
+ 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249,248,248,
+108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,187,183,228,238,221,187, 9, 98,177,120, 21,
+116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, 52,237,
+ 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1,159, 41,
+110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, 81,138,
+ 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200,224,131,
+ 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, 88,218,
+171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208,119,146,
+181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, 71, 51,
+ 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135,115, 91,
+119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185,199,142,
+ 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, 38,166,
+115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207,231,223,
+ 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, 8,117,
+235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164,164,197,
+152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,188,188,188,166,127,252,241,199,156,232,232,
+232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220,185,243,
+140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, 52, 77,
+239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, 88, 88,
+ 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118,250,230,
+205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94,139, 82,
+127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, 31, 42,
+ 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, 34,235,
+125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73,137,111,
+240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222,230,159,
+164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111,145, 13,
+187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245,209,171,
+ 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,106,225,225,225,161,186,119,239,222,188, 41,
+ 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109,122, 73,
+ 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45,109, 3,
+192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185,115,217,
+125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160,160, 14,
+ 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218,248, 49,
+ 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185,114,229,
+235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226,174,163,
+ 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221,134, 32,
+ 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, 72, 17,
+ 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202,149, 43,
+ 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230,116,244,
+135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126,123,145,
+ 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, 27,173,
+247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53,114,157,
+249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, 87,130,
+ 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52,131,193,
+248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, 89,181,
+106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, 31,200,
+ 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182,182,118,
+ 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58,212,137,
+247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, 39,138,
+178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190,174, 24,
+232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156,126, 6,
+176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, 77, 45,
+182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, 89, 22,
+255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222,159,159,
+ 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, 75, 75,
+160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180,225, 24,
+253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109,133,214,
+103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13,156, 6,
+ 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, 56, 13,
+156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64,254,241,
+ 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23,141, 0,
+ 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116,233, 50,
+253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43,149,202,
+ 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193,193,161,
+ 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, 8, 13,
+108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216,113, 57,
+ 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, 13,246,
+ 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, 26, 11,
+ 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, 73, 30,
+162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, 7, 14,
+ 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, 3,193,
+225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110,217,187,
+119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, 99,227,
+110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, 51,111,
+233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96,236,239,
+ 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210,171,174,
+ 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38,200,129,
+ 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248,162,225,
+132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90,179, 0,
+120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, 69,171,
+157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, 27,239,
+142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, 69, 69,
+191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223,114,222,
+188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118,118,198,
+209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, 0, 48,
+102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, 1,152,
+136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126,253,193,
+ 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, 36,249,
+148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228,209, 36,
+221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, 42, 29,
+223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, 27, 62,
+241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,
+136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158,142,152,
+185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, 82, 82,
+ 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, 53,107,
+ 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, 4, 5,
+ 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,111,111,191,106,255,254,253,214,198,198,198,
+160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119,238, 52,
+226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63,129, 64,
+240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94,166,186,
+ 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,158,203,238,221,187,199,110,222,188,249, 34,
+128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60,121,210,
+ 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177,128, 88,
+166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247,232,222,
+221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229,177,153,
+ 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, 75, 47,
+ 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181,207,212,
+201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, 67,135,
+ 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27,182,103,
+ 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142,110,241,
+ 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95,223,214,
+215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235,211,207,
+213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, 75,107,
+234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44,129,177,
+177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151,107, 6,
+128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98,177, 81,
+179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50,205,220,
+132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154,135,135,
+ 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,122,242,228,201,208, 63,255,252,179,254,179,
+103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, 30, 0,
+192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62,132,147,
+205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238,152, 49,
+ 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, 16, 32,
+171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225,220,253,
+ 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182,221,130,
+ 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86,203, 89,
+142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, 7, 42,
+237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218,192,195,
+ 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27,135,125,
+187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130,119,239,
+222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, 54,247,
+242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,121,246,236, 25,238,221,187,135,252,252,124,
+248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, 40,138,
+130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254,254,139,
+166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,223,191,223,104,222,188,121,184,117,235,214,
+138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, 22,231,
+131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, 43, 33,
+ 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,
+138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6,196,163,
+ 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,150, 67,127,241, 40,155,246,105,253,179,184,
+118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, 36,185,
+113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, 15,238,
+ 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182,109, 75,
+142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,
+223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, 11, 0,
+ 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201,104,210,
+164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, 67,203,
+252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126,253, 59,
+118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35,254,197,
+ 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139,187,157,
+ 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, 23,228,
+ 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220,187, 93,
+187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212,169, 83,
+ 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71,199,166,
+ 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194,183,197,
+212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,208,170,136,223, 98,177,220,140,141,250, 39,
+ 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, 9,138,
+162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, 33,251,
+218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, 29, 98,
+ 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145,146,146,
+178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235,250,245,
+235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239,137, 72,
+146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, 58, 90,
+240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140,212,236,
+ 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, 60, 84,
+ 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225,194,215,
+ 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205,147, 39,
+ 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126,252, 23,
+156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, 30, 60,
+ 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,219,183,111,149,245,235,215,103,250,248,248,
+ 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198,216,177,
+ 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, 83, 1,
+ 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, 91, 54,
+110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172,106,100,
+161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,254,251,239,209,162, 69,139,230,237,219,183,
+223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, 0,192,
+211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, 39,167,
+ 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77,133, 74,
+198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, 65,122,
+ 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, 44, 99,
+ 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55,208,107,
+225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232,192,129,
+ 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113,239, 9,
+107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2,138,137,
+ 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, 86,181,
+ 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, 28,140,
+184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, 55,124,
+244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48,149,201,
+100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, 28,247,
+239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231,147, 64,
+ 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219,183, 15,
+ 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, 25, 51,
+ 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61,123,102,
+251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201,228, 42,
+149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,175, 49,111,222,188,197,190,126,253,186, 69,
+183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134,162,248,
+ 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187,112,254,
+252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, 25, 51,
+ 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, 13, 16,
+ 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1,184,116,
+247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195,209,170,
+ 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,235,213,171,135, 53,107,214,192,205,205, 13,
+ 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,225, 66,122,240,224,193,121, 53,125,230,205,
+155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93,138,185,
+115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60,121,130,
+236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, 20, 76,
+ 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, 20, 48,
+131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, 59, 87,
+115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, 66,154,
+251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192,192,107,
+127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, 44, 90,
+100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, 60, 6,
+ 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, 71,241,
+228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, 37,145,
+ 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205,102,195,
+203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,155, 49,126,252,120,250,222,189,123, 7, 81,
+121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81,162, 96,
+ 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, 79,155,
+ 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50,187, 85,
+195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, 68,114,
+ 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, 61,108,
+216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157, 60,113,226, 68,209,252,249,243,173,131,130,
+130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, 15,175,
+175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128,100, 0,
+ 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69,225,248,
+241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, 94,189,
+218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159,126,250,
+105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122,149,232,
+ 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,132,167,167,103,161,151,151, 87, 27,165, 82,
+137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,
+185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52,
+ 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2,143,195,
+ 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53,231,130,
+199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61,122, 20,
+ 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97,219,182,
+109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, 48, 63,
+ 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73,135,240,
+ 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229,252, 55,
+130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233,233,233,
+224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, 18, 98,
+ 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153,153, 25,
+152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104,110, 68,
+226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225,220,210,
+206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, 97, 97,
+ 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, 66,243,
+133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, 36,131,
+180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77,207, 91,
+184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225,214,163,
+ 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, 63,255,
+ 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207,222,189,
+123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,191,190, 39,128,235, 58,
+108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142,153, 29,
+ 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, 94,190,
+124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, 83,137,
+235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86,203,100,
+178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, 5,148,
+ 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53,136, 34,
+242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4,129,130,
+220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, 52,153,
+201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27,239, 73,
+175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, 75,187,
+ 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, 35,198,
+ 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, 17, 23,
+235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240,120,188,
+ 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, 92, 90,
+116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113,218,203,
+212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, 30, 30,
+ 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, 82, 97,
+105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213,164,139,
+123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, 40, 20,
+138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209,155, 60,
+144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, 84,119,
+154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181,225,241,
+120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67,108,118,
+235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197,197, 5,
+241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209,182, 99,
+199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143,145, 35,
+ 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158,119,249,
+248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137,116, 50,
+201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,
+216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174,174,104,
+208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, 79, 41,
+ 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,186,232,218,186, 30,114,
+132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39,204,106,
+217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, 83,220,
+232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, 77, 77,
+197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, 57, 57,
+ 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, 26, 33,
+ 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, 62,191,
+ 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170,160, 75,
+ 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128,252,164,
+164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,
+105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,
+210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200,100, 50,
+157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91,243,230,
+ 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187,124,226,
+196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135,247,135,
+196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,
+130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, 84, 84,
+ 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126,
+ 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64,247,238,
+221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90,180,152,
+ 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239,222,189,
+152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,189,210,169,226,129,142,237,187,249,248,248,
+ 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, 90,180,
+104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208,188,121,
+115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, 71, 81,
+181, 81,252,204,246,190,155,186, 73, 72, 72, 8, 45,149,142, 84,233,161, 72, 23, 81, 68, 16, 43,162,130, 72,177,125, 34, 86, 4,
+105, 34,136, 20, 69, 65, 4, 20, 69, 90,164,136, 40,145, 78, 2,132, 0, 33,129,244,186,233,101,179,125,103,238,247, 71,138, 33,
+164,236, 38, 40,150,251,123,158,121, 38,185,179,115,246,206,157,118,246,189, 45,225,212,197,115, 81, 54, 1,159, 7,127, 31, 55,
+ 60, 24,209, 13,207, 76,238,143, 30, 33,190, 72,203, 51,226,248,241,159,109, 41, 41, 73,103, 28,233,113, 88,173, 25,127, 45,246,
+244,213,139, 39,237, 66, 1,131,144,224,142, 88,244,191, 87, 93,151,188,253,154, 75,199,118,254,136, 77, 46,197,207, 71, 15,217,
+178, 51, 51,126,189, 87, 61, 14, 79, 0, 34,165,132, 81,240,121, 60,176, 60, 73, 5,191,170, 35, 77,167,176,176, 32, 47,111,111,
+ 68, 70, 70,130,231, 68,143,208, 19,128, 72,169,172,172, 5,215,235,245,168,214,107, 31, 28, 28,236, 31, 16,128,159, 34, 35,193,
+231,184,235,131,156, 28, 96,244, 70,101, 53,116,141, 46, 3,152, 94,104, 13, 85,251,214,218, 96, 87,141, 2,231, 98,111,194,108,
+ 35,231,191, 41,198, 61, 29,143,236, 79,100, 38,154, 89,117,184, 98,227,198,141,189,190,248,226,139,225,243,231,207, 87,206,152,
+ 49, 3, 82,169, 20, 6,131, 1,126,126,126, 96, 89, 22,135, 15, 31, 70,116,116,180,158,227,184,159,113,231,176, 1, 17,168,213,
+ 75,227, 72, 18,100,149,126,203,208,107,223,195, 15,223, 21, 77, 0, 80,222,228,212,133,109, 44,219,215,238, 62, 57,105,199,145,
+139,204,203, 83, 7,241,122, 4,183, 6, 0,120,121,121, 65,173, 86, 59,173,121, 23,248,211, 53,107, 87,235,230,230,230,222,200,
+205,205,205,123,246,217,103, 67,170, 27,190, 75, 36, 18, 83, 85, 36,171,184,190,125, 28,200,167, 21,192, 11, 95,124,241,197,254,
+210,210,210, 35,175,188,242, 10,150, 44, 89,130, 3, 7, 14, 12, 0,112,170,153,199,206, 22, 23, 23,151,156, 63,127,222,171, 67,
+104,119,180,213, 10, 49,240,173, 68, 16, 66,224, 46, 39, 40, 47, 41,194,165, 75, 23, 81, 94, 94,126,206,153,124, 90,173,214,146,
+188,188, 60, 15,173, 86,139,162,162, 34, 20, 20, 20,212,152,172,226,226, 98, 20, 21, 21, 17,134,185, 99,204,150,198, 52, 43,242,
+242,242, 12,241,241,241, 98,175,214, 29,208, 78, 43, 66,239,255,221, 0, 8,129,191, 27, 15,229,101, 37, 56,115,230, 12, 74, 75,
+ 75,127,107, 72,147,227,184, 5,211,166, 77,227, 3,120,252,149, 87, 94,113, 3,208,245,213, 87, 95,253, 25,117,122, 22, 10, 4,
+130,143,183,111,223,222,169,186,138,241,181,215, 94, 91, 13,224,139,191,234, 90,114,119,119, 95, 16, 25, 25,169,178, 90,173, 88,
+187,118, 45, 86,175, 94,189, 5,119, 14, 84, 25,249,233,167,159,174,231,241,120, 47,206,158, 61, 27,207, 61,247,156,188,103,207,
+158,243,115,114,114,190,169, 79, 51, 43, 43,107, 81,143, 30, 61, 22,231,229,229,125,232,144, 89, 78, 76,156,217,163, 71,143, 69,
+121,121,121,203, 27, 59, 71, 10,133, 66,193,178, 44, 82, 82, 82,138,129, 6,219,119,152, 82, 82, 82,178, 88,150,245,147,203,229,
+110, 77, 93,159,197,197,197, 31,246,236,217,243, 29,157, 78,119, 20,192, 7,245, 24,242,203, 57, 57, 57,225,115,231,206,157,179,
+108,217,178, 73,185,185,185,187,154,210, 76, 75, 75,251,112,200,144, 33,111, 37, 36, 36,108, 69,195, 85,192,159,190,251,238,187,
+214,237,219,183, 63,159,146,146,178,180, 9,205,131, 5, 5, 5, 7,157, 56,191, 13,125,190, 70,147,207,231,191,186,108,217, 50,
+222,198,141, 27, 65, 8, 89,201,178,108, 67,249,140,221,187,119,239,182,254,253,251,207,216,189,123,183, 52, 60, 60,252, 57,179,
+217,188,179,169,235,211, 96, 48,236,217,189,123,247,164,216,216, 88,191, 25, 51,102, 72,131,130,130, 96,181, 90,145,147,147,131,
+141, 27, 55,154,226,226,226, 50, 75, 74, 74,246, 56,243, 12,177, 91,202,166,158, 62,190,111,103,106, 98, 92,223,193,163, 38,184,
+ 90,172,126,144, 20,242, 81, 82,152,139,195, 7,247, 20,167,164, 36,157, 49, 24, 74,166, 58,163,105, 53,151, 62,122,230,215,253,
+187, 50, 83,226,251, 12, 28, 50,218,213,100, 9,128, 68,196, 67,161, 46, 11,135, 35,247, 21,165,164, 36,255,110,178,153,159,184,
+ 87,207,121,126, 32, 62,224,231, 70, 63, 59,107, 92, 55,200, 92,253, 46, 9,129,181,253, 1,153,135,151,151,168,234,222,129,178,
+178,205,163, 67,154, 58, 64,220,161,170,150,202, 96, 48, 64, 8, 88,158, 4,132,158,158,158, 50, 0, 72, 72, 72,128,188,178, 86,
+195,169,124,234, 1,133,188,150, 46, 15, 48, 20, 10,224,219, 94,173, 96, 0, 32, 51,183, 16, 22, 91,163,239,141,127, 58,155,107,
+ 25,174,205,205, 17, 16, 1,136, 80, 42,149, 75, 22, 47, 94,188,242,220,185,115, 43,199,142, 29,187, 82, 34,145, 44,169, 42,108,
+ 81, 35, 39,226, 47,211,188,175, 21,220,134,180, 99,162, 70,180,103,184, 89, 3, 92,217, 39,122, 43, 44, 67,135, 14, 93,223,194,
+124,182,228,102,249, 51, 53,247,217,108, 54,130,202,106,187,125,104,184, 74,240,141, 90,219,115,211,211,211, 73,213,223,206,228,
+211, 99,202,148, 41, 92,121,121, 57,121,228,145, 71, 8,154,158,194,167, 81, 77,137, 68, 50,100,224,192,129, 54, 93,126, 17,185,
+145,156, 69,206,198, 92, 35, 71,142,159, 38,187,246, 68,146,117,235, 55,145, 46, 93,186, 88, 0, 4, 56,163, 41, 16, 8,134, 14,
+ 25, 50,164, 80,167,211,145,248,248,120, 18, 21, 21, 69,190,255,254,123,178,105,211, 38,178, 97,195, 6,210,186,117,107, 29, 0,
+ 47,103, 52,101, 50,217,132, 7, 30,120,192, 86, 82,102, 32, 41, 89,133,228, 74,124, 10, 57,117,254, 10, 57,124,252, 20,249,102,
+231,110, 18, 22, 22,102,114, 64,147,207,231,243,215,237,218,181,171,140, 16, 66, 38, 76,152,144,137,219, 7, 82,109,187, 96,193,
+130, 60, 66, 8, 89,190,124,121, 33,234,111, 8,255,103, 95, 75,163,124,125,125,111,136, 68,162, 72, 0,143, 55,177,223,163, 2,
+129,224,128,183,183,247, 5, 0, 15,222,131,251,104,172, 86,171, 61, 11,160,169, 25, 14,170, 63, 55,241, 95,114,191,255, 25,154,
+ 67, 5, 2, 65, 20,208,248, 36,194,181,158,215,239,243,249,252,159, 0, 12,115, 50,159, 29, 61, 60, 60, 30,113,117,117,125,217,
+213,213,245,101,173, 86,251,136, 88, 44,238,216,146, 99,119,239, 24, 49,206,191,251,248,189,173,187,142, 73,243,239, 54, 54, 45,
+176,199,132,189,238, 29, 35,198,181, 84, 51,160,199,132,125,254,221,198,166,251,119, 27,151,218,246,190, 9,123, 61,130, 35, 30,
+184,151,231,232,113, 95,180, 26,222, 22,118, 18,245, 22, 33, 81,111,145,136,182,224,250,186, 32,172, 23,160, 26, 25, 17,177,138,
+176,236,170, 73, 19, 39,174,234, 0,184, 19,128, 95,119,169, 79,179, 59,160,174,217,119,194,132, 85,237, 0,143,225,128,124,208,
+128, 1, 43, 9,203,174,154,246,232,163,171,252, 1,239,250,244, 26,210, 36, 0,223, 23,104, 85, 91,215, 3,104, 63, 57, 16,225,
+111,140, 11, 36, 36,234, 45,242,238,195, 65,164,135, 23, 30,111, 66,179,161, 72,209, 63, 58,162,229, 44,138,170,135,235,210,170,
+181,226, 46, 92,132,119, 93,179,143, 15,130, 34,218, 51,241,163,131, 5, 69,168,236,146,172,248, 23, 62, 36,183, 90, 44, 22, 98,
+ 50,153,136,193, 96, 32,122,189,190,174,129,170, 49,100,217,217,217, 36, 51, 51,147,164,167,167,147,212,212, 84,130, 63,218,222,
+ 56,156, 79,181, 90,253,197,195, 15, 63,204, 10,133,194,117,119,227,216,221,220,220,150,246,238,221,219,250,201, 39,159,144,189,
+123,247,146,207, 63,255,156,204,158, 61,155,116,234,212,201,236,226,226, 50,181, 57,154,222,222,222,139,130,131,131, 11,183,108,
+217, 66,190,249,230, 27,178,102,205, 26,242,230,155,111,178,126,126,126,185, 42,149,106,100,115, 52,181, 90,237,230,251,239,191,
+223,186,121,243,102,242,243,207, 63,147, 29, 59,118,144, 5, 11, 22,144,144,144, 16,179, 66,161,120,200, 65, 77,190, 64, 32, 88,
+ 53,107,214,172,220, 86,173, 90, 69,214,217, 38, 15, 11, 11,187, 48,109,218,180,108, 0,175,253,139,174, 79,170, 73, 53,169,230,
+159, 96,180, 30,107, 5, 95, 2,240,229, 34,209,163,131, 6, 12, 88, 41, 2, 30,117,214, 20, 73,249,252,201,253,123,247, 94, 41,
+ 2,166, 86,127, 86,202,231, 79, 30, 52, 96,192, 74, 33,159, 63,189, 33,189,198, 52, 9,192, 23, 9, 4,175,245,239,219,119,149,
+ 0,248, 95,117,218,208,182,204,245, 5,163, 90,147, 1, 1,204,205,233, 90,200,255,197, 70,235,174, 35,248, 19, 46,194,127,138,
+230,223,229,166,238, 80,101,152,246, 57, 17,209,218,135,202, 89,212, 59, 52, 51,159,178,187,124,236,157, 61, 60, 60, 14,117,232,
+208, 33,191, 77,155, 54,217,174,174,174, 59, 1,248,181, 80, 51,220,219,219,251,107, 47, 47,175, 68, 31, 31,159, 88, 15, 15,143,
+143, 81, 57,234,124,179, 53,133, 66, 97,111, 47, 47,175,223, 2, 3, 3, 75, 2, 2, 2,116, 30, 30, 30,187,234,137,100, 57,162,
+233,131,250, 31, 42,162,170,109,244,165, 67, 53,169, 38,213,188,205,192,140,104,135,101,195,219,194, 62,188, 45,216, 17,129,248,
+184,182, 65, 25, 11,200,154,107,138,158, 0, 36,117, 63,223,148, 94, 83,154, 4,224,247, 3,148,117,247, 25,237,135, 48, 7, 53,
+255,233, 17,173,234,231,188,115,195, 59, 52,128,253, 79,200,228, 63, 69,243,239,194, 77, 52,210, 24,185, 22, 75,239,226,119, 26,
+239,242, 49, 92, 41, 40, 40,120,160,160,224,174,246, 77,184,154,155,155,251,248,221, 20,180,217,108,231,116, 58,221,224,187, 32,
+213, 80,215,107, 43, 28,236,150, 77,161, 80,254, 59, 48, 0,139, 36,188, 30,209, 17,107, 5, 44,120,135,147,145, 85,167, 75,158,
+145,105,142,102, 37,236,214,122,158,241, 76,115,243,249, 7,250, 59, 52, 50,113,141,249,239,156,182, 28, 84,182,209,106,177,209,
+162, 80, 40, 20, 10,133,242, 23,112, 44,145,254, 16,251, 7, 16,137,219,163,111,145,181,140,104,131,161, 79,103,122, 82, 52, 39,
+124,122,140,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,106, 26,154, 59,245, 70,157,255,155,213,139,239,191, 2,173,
+103,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,102,143,163, 69,161, 80, 40, 20, 10,133, 66,105,156, 6,163,110,212,
+104, 81, 40, 20, 10,133, 66,161,180, 12, 31, 84, 78, 81, 21,137, 63,166,170,218, 76,141, 22,133, 66,161, 80, 40, 20, 74,203, 25,
+131, 63,122, 27,222, 22,221,226,209,178,161, 80, 40, 20, 10,133, 66,105, 49, 51,107,173,105, 27, 45, 10,133, 66,161, 80, 40,148,
+187,132, 99, 61, 35, 15, 30, 60, 72,104, 89, 81, 40, 20, 10,133, 66,185, 87,252, 67,189, 72,117, 20,235,142, 89, 62,104, 68,139,
+ 66,161, 80, 40, 20, 10,165,101,108,174,101,184,110, 75,163, 70,139, 66,161, 80, 40, 20, 10,165,101, 84, 27,172, 72,212,153, 82,
+141, 7,208, 42, 67, 10,133, 66,161, 80, 40,247,150,127,184, 23,217, 92,181,220, 49, 93, 82,117,175,195,193, 85, 7, 56,152,158,
+106, 10,133, 66,161, 80, 40,247,128,127,178, 23,241, 65, 3,109,180, 40, 20, 10,133, 66,161, 80, 40, 45, 99,102,157,117, 13, 12,
+ 45, 27, 10,133, 66,161, 80, 40,148,187, 98,180,106, 67, 39,195,166, 80, 40, 20, 10,133, 66,249, 39, 67,103, 54,167,154, 84,147,
+106, 82, 77,170, 73, 53,169,230,127,129,153,168, 51, 42, 60, 64,135,119,160, 80, 40, 20, 10,133, 66,185, 27, 38,107,115,125,255,
+211,185, 14, 41, 20, 10,133, 66,161, 80,254, 36,104, 68,139, 66,161, 80, 40, 20, 10,165,101,108, 70, 61,163,194, 83,163, 69,161,
+ 80, 40, 20, 10,133,114,247,204,214, 29,208,170, 67, 10,133, 66,161, 80, 40,148,150, 49,179,161,255, 25, 52,220,115,224,152, 19,
+ 95,208,156,222, 7,199,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,108, 74,251, 24,254,121, 52,216, 24,254,207,134,
+118,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,234, 41,120,170,151,154,169,120,104, 27, 45, 10,229, 31, 14,217,
+ 13, 62,138,131, 3, 65, 72, 43,240,197, 57,200,185,146,196,188, 3,174,197,154,186,176, 0,200,108, 94,176, 75,243,161,139, 77,
+110,169, 38,133, 66,161,252,139,201, 65, 3, 17, 44,106,180, 40,148,127, 58,249, 33, 65, 16, 96, 41,120,240, 1,177,222,130,103,
+216, 82,224, 90, 92,139, 53, 69,220, 7, 96,121,126, 32,214, 4,104,131,151, 1, 55,174,209,112,241,142,135, 0, 0, 32, 0, 73,
+ 68, 65, 84,194,166, 80, 40, 20,231,248,203, 27,195, 11,133, 66, 29, 0, 78, 42,149,238, 1,157,229,154,242,231,226, 83,117,157,
+113, 85,215,157, 51, 40, 5, 2,193, 98,185, 92,254,171, 68, 34,201,147, 72, 36,121, 10,133,226, 87,129, 64,176, 24,128,242,239,
+114,128,228,235, 78,114,240,216, 7, 44, 54,206,247,240,149, 18,173,193,204, 6,129,103, 31, 77,182,116, 84,182, 72, 83,192,140,
+ 48, 89, 57,255,111,206, 27,188, 42, 44,246, 80, 16,180, 72,179, 22, 46, 34,145,232, 48, 0, 15,122,121,254, 59, 9, 5,122,246,
+ 20, 8, 22,134, 0, 67, 65,231,211,165, 80,254,122,163,101,179,217,180, 5, 5, 5,204,182,109,219,198,107, 52,154, 91, 2,129,
+224, 13, 0,162,255, 74,129, 43,149,202,211,106,181, 90,167,209,104,116,106,181,250, 98, 83,233,255, 82,130, 60, 61, 61,211,220,
+220,220, 18,106, 39,122,118,121,176, 95,135,254,143,191,237, 30, 54, 97, 80, 11,245, 69, 2,129,224, 13,141, 70,115,107,219,182,
+109,227,179,178,178, 24,155,205,166,117, 98,255,129,174,174,174,215,207,157, 59,247, 86, 65, 65,193,160,140,179, 91, 60,115,207,
+109,242, 76,251,109,213,224,232,159,214,189,229,226,162,185, 6, 96,224,223,162, 36, 77,156, 23,120,252, 33, 87,115, 12,242,156,
+ 50,155, 87, 76,170, 65, 5,240, 7,195,210,130, 31, 49,165,156, 23, 64,134, 94,206, 52, 42, 78, 23,121,122,253,158,100, 86,131,
+199, 27, 2, 19,227,221,226, 7, 14,143,247, 60,199,113,195, 69, 34,209,203,244,241,251,239, 68,204,227,245, 63, 61,126,252, 7,
+175,117,233, 50, 39, 4, 24,215,128,217, 98, 0,188, 20, 18, 18,114, 8,192,163,119,241,235, 63, 10, 14, 14,206, 2, 48,151,158,
+ 9,202, 95, 76,247,234, 31,248,168,211, 70,203, 97,163, 53, 57, 16,253,167,182,197,137, 71, 2, 81, 62,165, 45,244,211,219,226,
+228, 67,129, 24,218,156,220,184,187,187, 99,224,192,129,252,172,172, 44,217,130, 5, 11,222,150, 74,165, 41, 0, 70, 54, 71, 75,
+ 38,147, 69,203,229,242, 12,129, 64,112, 91, 94,228,114,121,180, 66,161,200, 16, 8, 4,195,106,167,171, 84,170,211,106,181, 90,
+167, 82,169, 46, 54, 96,132,162,213,106,181, 78,169, 84, 70,215, 78, 23, 8, 4,195,148, 74,101,166, 74,165,170,155, 62, 84,165,
+ 82,101,212, 77,111, 8,161, 80,232,151,145,145,161,205,204,204,212,138,197, 98,175,218,233,233,233,233,218,140,140,140,219,210,
+157, 65, 32, 16, 12, 85, 40, 20, 25,114,185, 60,186,190,244,186,199,212, 16,181,202,110,168, 35,233,206,154,172, 17, 35, 70,156,
+204,201,201,241,119,113,113,113,169,189,193, 77,227, 50,242,235, 45,235,231, 79, 24, 61,226,121,207,208,137,157,155,169, 63, 82,
+ 42,149,166, 44, 88,176,224,237,172,172, 44, 89,223,190,125,249, 60,158, 83,191, 39, 34, 38, 76,152,176, 79,167,211,249,118,237,
+218,149,111,183,219,113,117,255, 98,200, 99, 95,134, 52,101, 35, 90,203,242, 5,183,126, 94,230, 55, 98,112,207,125,184,199,141,
+ 65,201,238, 80, 17, 24,110, 32, 71,136,231,245, 44,147,231,152,241, 15, 11, 46,101, 24, 61,109, 44,235, 6,240, 7,147,175, 2,
+ 36,205,210, 20,216, 6,112,132,120,253,146, 42,244, 28,242,200, 28,254,241, 84,129,167,141,101,221,193,195,160,230,104,214,190,
+252,249,124,254,252, 85,171, 86,241, 0,204, 6, 32,254, 47, 61,133,123,181,130,239,208,246,252,243,221,125,208,255, 46,202,134,
+ 87,221,239, 65,127,151,227,180,112,220,141, 93,201,201, 71,166,183,111, 63,246,181, 46, 93,158,172,199,108, 49, 0, 94, 91,182,
+108,217,227, 87,175, 94,245,108,219,182,237,115,119,233, 71,255,154,101,203,150,189,122,245,234,213, 86,129,129,129,239,130, 14,
+ 95,244,175,130, 16, 34, 38,132, 12, 33,132,140, 33,132, 12, 35,132,244,170,250,251,190,170,101, 12, 33, 36,162,206,250,190,170,
+125,171,183,247,110, 64, 99, 76,221,253,106,237, 83,247,255,219,254,174,199,104,141, 65,101, 91,173, 49,183, 29,192,193,131, 7,
+ 73,237,117, 93,166, 4,226,157, 57,253,124, 13,215, 15,236, 32,250,140,100, 82, 28,127,137, 92,218,252, 33,153,115,159,167,225,
+177,182,248,200,249,242, 34,228,212,169, 83,228,234,213,171, 68,175,215,147,196,196, 68,210,187,119,111,163, 92, 46,255, 5, 64,
+160, 51, 98, 42,149, 74,247,203, 47,191,144, 17, 35, 70,148, 42,149,202,149,213, 55,151, 90,173,214,157, 58,117,138,140, 24, 49,
+162, 84,165, 82,173, 1,192, 7,128,135, 30,122, 40,143, 16, 66, 60, 61, 61,179,235,211,155, 48, 97, 66, 49, 33,132,104, 52,154,
+234,170, 38,190, 74,165, 90,243,226,139, 47,234, 47, 92,184, 64, 92, 93, 93,171,211,121,106,181,122,229,236,217,179,245, 49, 49,
+ 49,181,211, 27,197,205,205, 45,131,101, 89,114,224,192, 1,162,213,106,107,242,224,234,234,154,193,178, 44,217,183,111, 95,131,
+121,107, 44, 80,160, 84, 42, 87, 76,159, 62,189, 60, 53, 53,149,184,187,187,235,106,165,175,156, 49, 99, 70,121,122,122, 58,241,
+240,240,112, 40,143,238,238,238,186,211,167, 79,147, 73,147, 38,149,213, 46, 83,119,119,119,221,153, 51,103,170,211, 87, 56,242,
+ 32,107,213,170,213,115, 90,173, 54, 91,171,213,102,187,184,184, 44,241,241,241,201,205,207,207, 39,132, 16,210,174, 93,187,188,
+218,145, 44,109,248,248,121, 27,119,159, 57, 23, 21, 87,152,223,101,248,243, 43, 52, 93, 38,104,156, 40,131, 64,185, 92,254,203,
+160, 65,131,140, 25, 25, 25,164,162,162,130,196,198,198,146, 83,167, 78,145,155, 55,111, 18, 0,196,145,203, 73,169, 84,102,153,
+205,102,206,108, 54,115,249,249,249,108, 94, 94, 30, 27,191,210,135,144, 47,133, 53, 75,201,190,113, 36, 55,106, 41,167, 86,202,
+ 51, 1,168,238,217,131,103,125,152, 31,217, 20,188,235,218, 98,255,248,168,101,163,108, 36,245, 56,217,241,164,167,237,196, 60,
+223, 91,100, 67,200, 15,100, 83,104,235,102,105,110, 8,221, 17,251,166,255,141,117,239,190,100, 75, 75, 75, 35, 11,103,140,178,
+ 31,157,227,155, 68, 54,134,236,110,142,102, 45,166, 62,248,224,131,250,244,244,116, 18, 22, 22, 86,193,231,243,159,254, 47,153,
+172,136, 32,113, 86,236, 55, 11,185,113,225,242,194,187,100,182,194,181, 90,109,193,214,173, 91,137, 74,165,202,251, 27,153, 45,
+ 38, 4, 24,191,173, 75,151,125,220,228,201,236,182, 46, 93,246,133, 0,227,171, 12, 22, 3,224,245,229,203,151,199,216,108,182,
+152,175,190,250, 42,102,252,248,241, 49, 0, 22,182,240, 59, 63,249,232,163,143,136,205,102, 35, 95,125,245, 21, 25, 63,126, 60,
+ 1,176,214,209,157,149, 74,101,135,206,157, 59,111, 15, 11, 11, 75,239,218,181,171, 37, 52, 52,212, 20, 20, 20,148, 26, 30, 30,
+190, 85, 34,145, 4,130,242,151,208,152, 23, 33,132,244,122,253,245,215,223, 0, 64, 94,127,253,245, 55, 8, 33, 99,170,252,196,
+152,218,127,215, 93, 87,155,167,234,255,235,211,168, 94,234,211,172,239, 59,234,124, 15, 26,136,100,205,188,227,224, 14, 30, 60,
+ 56,232,224,193,131, 39,234, 30,220,195,109,209,111, 78, 63, 95,163, 49, 63,135,196,125,248, 50,249,117,136, 31, 57, 53,216,155,
+ 36,204,127,144,228,124,179,134,188,208,205,213, 48,185, 45,134, 56,107,180, 98, 98, 98, 72, 76, 76, 12,185,120,241, 34, 73, 73,
+ 73, 33,165,165,165,228,219,111,191,101,221,221,221,141, 18,137,100, 25, 0,153, 35, 98,106,181, 90, 71, 8, 33,102,179,153, 44,
+ 89,178,196, 84, 21,169,242,210,104, 52, 58, 66, 8, 41, 41, 41, 33,203,150, 45, 51,105, 52,154, 88, 0,173, 60, 60, 60, 50,146,
+147,147,137,151,151, 87,189,102,198,213,213, 85,119,227,198,141,106,227,228,235,234,234, 26,183,127,255,126, 43, 33,132,100,102,
+102, 18, 55, 55, 55, 29, 0, 47,119,119,247, 75, 7, 15, 30,180, 18, 66, 72,118,118,118,117,186, 67, 70,203,104, 52,146,163, 71,
+143,222,150,135,234,244, 67,135, 14,221,102,192, 28,192, 75,163,209,196,124,251,237,183, 22,150,101, 73, 92, 92, 92,181, 73,244,
+114,113,113,185,184,123,247,110, 11,203,178, 36, 62, 62,222, 97, 51,216,166, 77,155, 60, 66, 8,177,219,237,100,227,198,141,230,
+234, 50,173, 78,183, 88, 44,228,179,207, 62, 51,171,213,234, 24, 0,141, 70,223, 60, 60, 60,178, 45, 22, 11, 41, 41, 41, 33,189,
+123,247,214,159, 58,117,138,148,149,149, 17, 66, 8,105,211,166, 77, 30, 0, 4, 15,122,250,253,115,137,250,178,167, 94, 93,255,
+ 93, 96,175,199, 62, 60,114, 62, 43,243,139,189,209, 49, 30,225, 19, 70, 57, 18,212,148, 72, 36,203,124,124,124, 76,191,255,254,
+ 59,107,181, 90, 73,122,122, 58,185,120,241, 98,205, 53,118,229,202, 21,135,140,150, 64, 32, 88,124,238,220, 57, 43,203,178, 92,
+ 65, 65, 1,155,151,151,199,230,229,229,217,235, 26, 45,242,165,144, 20, 28,122,150, 68,110,158,107, 17,137, 68,139,239, 77, 52,
+ 11,124,178, 41,120, 2,217, 20, 28,179,117,186, 71, 65,249,197,157,132,252, 60,151, 36,189,223,150, 44, 30,165, 42,231, 54, 5,
+199,144, 77, 33,147,201, 59,131, 4, 78,105,110, 14, 29, 71, 54, 5,199,124,244,112, 64,225,165,152, 11,228,196,137, 19,228,179,
+ 53,203,201,156, 8,223, 10,110, 83,112, 12,217, 16, 58,201, 25,205,218, 72, 36,146,196,147, 39, 79,146,168,168, 40,242,238,187,
+239, 18,185, 92,158,126, 55,162,122,100, 67, 80, 0,249, 60,104, 16,217,210,209,135,252, 54,232,111,215,193,167, 87, 43,248, 14,
+ 15, 18,103, 22, 92,218, 75, 72,209, 77,146,187, 50,140,140, 10, 22,182,212,108,133,107,181,218,252,212,212, 84,146,155,155, 75,
+ 86,175, 94, 77,212,106,245,223,218,108, 5, 3, 19, 0,188,177, 98,197,138, 26,147,181,126,253,250,152, 43, 87,174,196,248,251,
+251,255,212,130,239, 90,187, 98,197,138, 26,147,181,126,253,122,114,229,202, 21, 18, 16, 16,144,209,212,142,211,167, 79,151,247,
+235,215, 47,102,218,180,105,134,173, 91,183,146,212,212, 84, 18, 27, 27, 75, 86,172, 88, 65,222,126,251,109,242,229,151, 95,146,
+ 73,147, 38, 85,244,238,221,251,220,228,201,147,165, 78, 70, 20, 4, 85, 81, 24, 49, 33, 68, 72, 8,169, 54,154, 2, 0,194,234,
+ 31,255, 20,199,188, 72, 67,102,170, 33,131, 85,119, 91, 35, 70,172, 81,195,230,192,247,221,105,170,234, 70, 66,106,253,253,219,
+216,177, 99, 7,221,241,242, 33,120,111,230,130,247,165, 41, 91, 87, 67,247,237,167,224,151,232, 32, 44, 47,132,249,100, 36,108,
+ 39,247,227,241,190,125,101, 50,134,249,192,217, 2, 21,139,197, 16,139,197, 16,137, 68, 48, 24, 12,200,206,206,198,253,247,223,
+207,187,120,241,162,244,185,231,158,155, 43,147,201,210, 1, 76,108,242,110,102, 42, 35,210,167, 79,159,198,179,207, 62, 43,217,
+190,125,123, 87, 79, 79,207,203, 44,203,138, 1, 32, 62, 62, 30, 83,166, 76,145,236,220,185,179, 83,171, 86,173, 46, 90,173, 86,
+185, 68, 34, 1,159,207,111, 80, 79, 44, 22,195,102,179, 73, 58,118,236, 24,123,249,242,229,240,177, 99,199, 10,211,210,210,144,
+156,156, 12,155,205, 38, 14, 10, 10,186,114,241,226,197,174, 99,198,140, 17,102,100,100, 32, 45, 45,173, 38, 31,142,228,215, 98,
+177, 64, 34,145,160,118,149, 22,195, 48, 48,155,205, 16,139,197, 14,107, 9, 4,130,161, 33, 33, 33, 87, 46, 95,190,220,125,194,
+132, 9,162, 11, 23, 46, 32, 51, 51, 19, 44,203,138, 67, 67, 67,175, 92,190,124,185,219,248,241,227, 69,177,177,177,208,233,116,
+112,180, 10,173,250,115,151, 47, 95,198,180,105,211,196,135, 15, 31,238,230,227,227, 19,107,183,219,197, 0,112,229,202, 21, 76,
+153, 50, 69,124,228,200,145,238,173, 91,183,142,109,162, 42,145, 15, 0, 54,155, 13,207, 61,247,156, 66,173, 86, 35, 35, 35, 3,
+ 28,199,129,101, 89, 0, 64, 97,113,225,149,203, 87,226,226, 31,159,250,240, 32,163,213,108, 62,115, 62,250,122,187, 54, 1,126,
+ 12, 67,218, 52,145,213,137, 10,133, 34,125,229,202,149,243, 82, 83, 83, 37, 33, 33, 33,188,164,164, 36,148,151,151, 67, 36, 18,
+213, 92, 99,142, 30,183, 88, 44, 30, 28, 22, 22, 38, 48,153, 76,224, 56, 14, 0, 8,143,199,171,247,100, 72, 75, 78, 34,212,203,
+ 46,148,201,100,131,239,201, 19,169, 44,204, 29, 28,134,167,229, 91, 36, 18, 23, 63,149,210, 39, 8, 72,143, 66, 91, 79, 9,248,
+ 60,190,244, 66,178, 65, 1,144,225,240, 47,112,119, 78,147, 27,158,156,103,145,216,220, 58, 41, 91,249,249,163,176,176, 16,173,
+219,133,192, 36,246, 20,159,190, 89,161, 4,227,164,230, 31, 12,232,216,177,163,119,135, 14, 29, 80, 80, 80,128,238,221,187,195,
+213,213,213, 21,192,240,102,155,172,175, 2, 36, 40, 67,127,128,183, 18, 44,243, 46,108,130,165,184,153,223,157,108,234, 46,252,
+ 59,153, 44,181, 82,124,118,231,174,111,125,221,253, 67,129,200,167,224,229, 34,193,150,231,187,187,121,106, 36,251,154,105,182,
+194,189,188,188,142,159, 59,119,206, 67, 42,149,226,226,197,139, 8, 11, 11,195,234,213,171, 61, 93, 93, 93,163,254, 38,102,139,
+196, 3, 7, 62,138,141,253,106,251,173, 91, 7,167,183,111, 63,118, 90, 80,208,146, 89,143, 62,250,244, 75, 47,189,132,229,203,
+151, 99,223,190,125,232,223,191, 63,102,206,156,105, 75, 79, 79,223,214,204,239,249,116,229,202,149,115,230,206,157, 91, 87,211,
+154,150,150,214,104,109, 75, 88, 88,152, 95, 98, 98, 98,214,252,249,243,187,111,223,190, 93, 38,151,203, 81, 82, 82,130,207, 63,
+255, 28,111,188,241, 6, 24,134, 1, 33, 4, 95,126,249,165,252,201, 39,159,236,117,235,214,173,172,128,128,128, 38,155,117, 16,
+ 66, 24, 66,136, 20,128,188,106, 81, 0,144,239,220,185, 83, 51, 97,194, 4,117, 85,154,172,106,145,128, 82,151,122,189, 72,173,
+119,229,193, 58,229, 61,182,110, 90,221,109,132,144,177,141,105, 56,105,160,235,251,190,200,198,204, 86,237, 55,208,224,122, 93,
+ 36,208,197, 59, 48, 24,165, 63,239,134, 76,192, 64,198,175, 90, 4, 12,120, 73, 87,208, 90, 42,132,141,144,240,230, 26,173,234,
+ 69, 40, 20,194, 96, 48,128,101, 89,188,241,198, 27,146,163, 71,143,186,243,120,188, 31,154,210,169,109,152, 18, 18, 18, 16, 26,
+ 26,202, 28, 56,112,192,107,246,236,217,178,234,239, 41, 45, 45, 69,135, 14, 29,152, 67,135, 14,105,223,124,243, 77,101, 99,102,
+134, 97, 24,136, 68, 34,204,157, 59, 87,118,254,252,121,183, 86,173, 90, 33, 41, 41, 9, 69, 69, 69, 80, 42,149,152, 59,119,174,
+236,220,185,115,158,173, 90,181, 66,106,106, 42, 74, 75, 75,161, 84, 42,157, 54, 90, 34,145,232,182,125, 24,134,129,213,106,117,
+202, 24,104, 52,154, 29, 49, 49, 49,158, 26,141, 6,177,177,177,176,219,237,208,104, 52,152, 51,103,142, 44, 38, 38,198,211,197,
+197, 5,241,241,241, 32,132, 64,173, 86, 59,149, 71, 0,224, 56, 14,241,241,241,104,211,166, 13,162,162,162,180,179,102,205,146,
+ 86,167,223,188,121, 19,126,126,126,136,138,138,210, 42, 20,138, 29, 13,105,113, 28,135,156,156, 28, 92,189,122, 21, 73, 73, 73,
+200,207,207, 71, 65, 65, 1,202,203,203, 97,183,219, 1, 0,242,242,178,200,157,223, 29,184, 44,147,201,228, 97, 65, 29,253,175,
+196, 93,203,147,201,100,242, 0,127,255, 32,224, 29, 94, 35,134,240,135,180,180, 52,247, 39,159,124, 82,148,155,155,139,226,226,
+ 98, 8, 4,130, 59,174, 45,177,216,177,166, 64,118,187, 61, 84, 42,149, 50, 86,171,181, 38, 2, 38, 22,139, 49,111,135, 1, 97,
+139,113,219,242,232,154, 60, 16,214, 6,139,197, 18,250,151,191,193, 0, 6,140,165, 35, 24,166,251,217,164, 10,183, 1, 99,167,
+138,144,124, 24,224,108, 0, 79,128,193, 93,252, 4,251,174, 84,120,129,160, 11,204, 8, 33,164,233,158, 95, 4, 96, 0,107, 7,
+128,233,121, 52,209,238,222,255,193,231, 69, 89, 89, 89, 16,137, 68,144, 72, 36,232, 62,244, 33,193,206,203, 54,111, 48,232, 10,
+ 43,130, 29,209,188, 45,236, 40,147,189,245,246,219,111, 43,106,107, 62,253,244,211, 10,141, 70,243,118,179, 77, 86,133,188, 47,
+236,100,238,213, 44, 67,155, 37,145,185,161,183,242,140,193, 32,100, 62, 96,235,118, 23,204,214, 96,137, 68,146, 12,224,254, 22,
+153, 44,149,248,204,174, 93,223,250,186,181,174, 52, 89,176,155, 0,161, 12,222,158, 46,216, 50,111,136,155,167,139,204, 89,179,
+ 21,238,229,229,245,203,217,179,103, 61,164, 82, 41, 98, 98, 98, 32, 18,137, 32,149, 74,209,185,115,103,108,218,180,201,211,205,
+205,237,111,101,182,150,197,198,110, 93,122,245,106,194,235,225,225, 33, 19, 21, 10,183, 23,167, 77,211,188,249,230,155, 7,247,
+239,223,255,213,152, 49, 99, 10,206,159, 63,255, 49,128,221,206, 70,204, 0,172, 95,181,106,213,139,213,198,237,205, 55,223,252,
+114,255,254,253, 75,199,140, 25,147,115,254,252,249,249, 0,214, 55, 38,160,215,235,247, 47, 90,180, 72,243,224,131, 15, 86,255,
+143,147, 39, 79, 98,219,182,109, 80, 40, 20,183,125,118,252,248,241,120,246,217,103, 93, 45, 22, 75,163,239, 36,173, 86, 59,236,
+236,217,179, 97,168,236,224, 37,169, 54, 90,113,113,113, 46,101,101,101, 46, 74,165,210,197,199,199, 71, 85,109,182, 30,124,240,
+ 65, 23,129, 64,112, 63, 40,104,202,139,212, 54, 58,142,164, 53,247,243,142,154,173, 58, 73, 13,142,161,117,155,209, 26, 59,118,
+236, 9, 52,208,147,202, 90,164,131, 4, 44,100,124, 6,114,126, 45,179, 5, 14,130,210, 60, 48,205,232,192, 91,223,203, 80, 44,
+ 22,131,207,231,195, 98,177,160,176,176,208, 41, 83,160, 86,171,161, 84, 42, 97, 52, 26, 97,183,219, 33,149, 74,171,205, 8,212,
+106, 53,132, 66, 33,132, 66, 33,164, 82,233, 29,209,164,186,209, 28,145, 72, 4,133, 66,129,156,156, 28,164,165,165,129,227, 56,
+ 40,149, 74, 40, 20, 10,136,197, 98,100,103,103, 35, 59, 59, 27,132, 16, 40, 20, 10, 40, 20, 10, 56,211,224,154,101,217,122, 95,
+254, 54,155,205,169,136,150,221,110,199,245,235,215,145,158,158, 14,169, 84, 90,115,172, 18,137, 4, 55,111,222, 68,110,110, 46,
+228,114, 57,212,106, 53, 52, 26,141,195,186,213,199,162, 82,169, 32,147,201, 80, 92, 92, 12,131,193, 80, 83,166,106,181, 26, 10,
+133, 2,165,165,165,200,203,203,107,244,216, 89,150, 69,118,118, 54,242,243,243,145,145,145,129,130,130,130, 26,179, 85, 21, 53,
+106, 89, 96,167,172, 12,133,133,133, 53,145,200,134, 22, 71,224, 56, 14,229,229,229, 56,123,246, 44,195,113, 28, 74, 74, 74,184,
+252,220, 92,246,133,108, 49,246,189,179,129,124,123,248,146,105,231, 79, 49,198, 61,191, 92, 53,174,223,115,197, 40,237,253,174,
+253,158, 60,134, 62, 11,215,192, 38, 28, 81,160,183, 73,242,173, 34,141, 87,120, 4,144,124, 8,224, 9, 0,169, 43,250,116,106,
+139,180, 98, 86,113, 67,103,145,130,193, 72,172, 15,114,117, 72,147, 21, 14,207, 47,183, 73, 82,173,158,234,208, 46, 61,160,211,
+233, 32,145, 72, 32,145, 72,208,179,127, 4,146, 11, 89,249,181, 44,163, 28, 4, 35, 28,210,252,131,118, 74,165,178,239,253,247,
+223,207,212,214, 28, 61,122, 52, 24,134,233, 12, 32,196,169,135,220,218,118, 98, 88,229,125, 32, 32,115,175,229, 24, 90,237,139,
+ 51, 5,141,155,248,144,219, 39,199,242, 66,175,231,154, 3, 65,108, 11, 64,172, 61, 90, 96,182, 6,169, 84,170,131,235,214,173,
+ 11,148, 74,165,135, 0, 12,104,142,136, 82,198,223,248,214,139, 83,125, 93,171, 77,150,205, 0, 8,100,128, 80, 6, 8,100,240,
+214,122,224,131,103,135,187,201,165,194, 61, 78, 24,214,157,235,215,175,247,172,107,178,170,151,238,221,187, 99,241,226,197,158,
+110,110,110, 59,238,241,203,114,132, 70,163,217, 30, 17, 17,113, 54, 91,165,122, 54,167, 71, 15,241, 47, 26, 77,233,176,210, 82,
+ 77, 64, 92,156, 53, 24,184, 2,224,179,204,204,204, 81, 78,152,172, 71,213,106,117,204,176, 97,195,172, 42,149, 42,125,245,234,
+213, 47,204,158, 61, 27,203,151, 47,199,162, 69,139, 62, 7,240, 12,128,255,101,102,102,182,106,202,100, 1, 64,110,110,238, 99,
+175,189,246, 90, 65, 65, 65, 1, 0,160,115,231,206, 40, 41, 41,193,194,133, 11,241,242,203,149,157, 98,187,117,235, 6, 66, 8,
+116, 58, 29, 86,174, 92,169,203,205,205,125,162,137,103,123,198,238,221,187,123, 89,173, 86, 63, 84, 86, 15, 74, 74, 74, 74,212,
+ 69, 69, 69, 42,171,213,170,224, 56, 78,225,226,226,162, 4, 32,127,252,241,199, 5,215,174, 93, 11,181,219,237, 89,212, 91,253,
+ 65, 99, 94,164, 57, 48, 12, 19,217,146,200, 85,125, 17,177, 6,104, 60,162, 53,118,236, 88,166,246,250,182,136, 17,131,216,244,
+232, 40,184,133,247,184, 45,154, 37,231, 51,144,169, 53, 72,206, 72,131, 8,204,213,187,101,180,138,139,139,241,194, 11, 47, 24,
+ 31,123,236,177, 66,142,227, 30,114,212, 20,104, 52, 26,104, 52, 26, 92,187,118,141, 76,154, 52, 73,183,122,245,106, 99,109,163,
+149,144,144, 64, 70,140, 24,145,247,246,219,111,235, 27, 51, 90,213, 17,173,101,203,150, 25, 7, 15, 30,156,127,245,234, 85, 82,
+109,166,148, 74, 37, 86,174, 92,105, 28, 50,100,136,238,194,133, 11,164, 58,205,153,136, 22,143,199,171, 49, 90,181,247,225,241,
+120,224, 56,206, 41,163, 85, 81, 81,241,216,152, 49, 99,116,241,241,241,164,250, 56, 53, 26, 13, 86,175, 94,109, 28, 62,124,184,
+238,234,213,171,164, 58, 77,173, 86, 59,108, 6,171,191, 95,165, 82, 65,173, 86,227,218,181,107,100,196,136, 17,186,181,107,215,
+154,106,167, 95,191,126,157,140, 31, 63, 94, 87, 94, 94,254, 88, 99,230,165,186, 58,207,110,183,195,100, 50,161,160,160, 0, 25,
+ 25, 25, 53, 85,135, 70,133,122,212,212, 71,198,117, 53, 26,141,134,107, 9,137,233,157, 59,133,105,141, 70,163, 33, 45, 61, 61,
+ 1,120,135,107, 68,251,161,240,240,240,194, 23, 94,120,193, 88, 92, 92,220, 98,163, 37, 22,139,227, 5, 2, 1, 25, 48, 96, 0,
+177, 88, 44, 36, 35, 35,195, 86, 80, 92,108, 15,249,240, 67,114,117,222, 60, 70, 22, 29, 45, 81, 42,149, 76,149, 38, 47, 41, 41,
+137,147,201,100,241,127,249,147,136,199,121,131, 33,247,255,158,168,119, 25, 62,110,138,152,201, 61, 15, 88,245,128,196, 21,144,
+184, 66,160,112,199, 3, 3,186,241,183,158, 45,243, 6,225,250, 65, 36,241,107, 82, 83, 72,188, 0,110,192,207, 9, 38,215,251,
+ 39,207, 17, 23, 21, 21,129,207,231,215,152, 34,185, 66,129, 97, 19, 31,231,125,121,222,236, 13,144,254, 96,248,126, 78,220,235,
+175,190,245,214, 91,162,226,226, 98,240,120,188, 63, 52,229,114,204,154, 53, 75,162, 86,171, 23, 57,252,240,219, 29, 42,130, 80,
+210, 7, 32, 47,223,200, 53,181,218,127,197, 24,188, 96,217, 22, 89,120,183, 94,120,110,176, 86,182, 44, 50, 47,252,114,134,177,
+ 45,192,206,131,221,210,179, 25,102,107,128, 74,165,138,140,142,142,150,143, 30, 61, 26, 43, 87,174, 84,200,100,178, 67,205,121,
+240, 87,232,217,217,239,173,253, 90, 23,251,241, 72,192, 90, 81,105,176,106, 45,121,122, 14,139,183, 28, 47,181,217,200, 84, 71,
+ 53,141, 70,227,140,103,158,121,166,112,207,158, 61,119,152, 44,169, 84,138,148,148, 20, 44, 89,178,164,168,168,168,232,137,123,
+105,178,102,207,158,189, 36, 51, 51, 51,248,231,159,127, 22,228,231,231,107, 87,125,241, 69,233,247,165,165, 69, 75,227,226,110,
+252,175, 83,167,142,175,119,233,242, 68, 35, 67, 63,212,107,178, 94,124,241,197,157,153,153,153,221,143, 29, 59, 38,204,207,207,
+247,123,241,197, 23,177, 98,197, 10, 44, 90,180,104, 19,128,231,224, 88,135,151, 63, 2, 8, 86,235,141,226,226,226,177, 35, 71,
+142, 44, 41, 46, 46, 70,151, 46, 93, 48,110,220, 56,120,123,123,163, 85,171, 86,152, 48, 97, 2,130,130,130, 80, 88, 88,136,169,
+ 83,167, 22,229,231,231,143, 4,144,212,152,102, 97, 97,225,173, 29, 59,118, 36,204,153, 51,167,123,102,102,102, 40, 0,247,242,
+242,114, 69,121,121,185,196, 98,177,200, 92, 93, 93, 93,187,117,235,230, 49,115,230, 76,229,165, 75,151, 66, 51, 51, 51,245, 0,
+210,168,189,170, 49, 89, 13,122, 17, 0,249, 85,134,199, 82,103,157,223,196, 54, 71,247,173,247,111, 7, 62, 87,215,108,213, 94,
+238,168, 58,172,255, 98, 4, 22,111,219,189,213, 36,246,239, 0, 77,112, 87,200,165, 82,200,196, 98,200, 92,221, 97,230, 56,124,
+145,146,107,168, 32,100,145,179, 5, 90,247, 69,200, 48, 12, 62,253,244, 83,123,223,190,125, 77,199,143, 31, 95,103, 52, 26,253,
+ 1,236,117,198, 20,172, 93,187,214, 48,119,238,220,203,121,121,121, 93,165, 82,169,165, 58,125,221,186,117,134,199, 31,127, 60,
+ 46, 51, 51,179,187, 92, 46, 55, 52,212, 62,171,182,209,146, 72, 36,230,188,188,188, 94, 79, 63,253,116,252,103,159,125, 86, 33,
+151,203,161, 80, 40, 32,145, 72, 44,121,121,121, 93, 95,120,225,133,203, 43, 86,172, 48,200,100, 50, 40, 20, 10,167,170,229, 8,
+ 33,119, 24,170,218,233,142, 98,183,219,143,231,229,229,117,157, 59,119,238,165, 79, 62,249,164,162,218, 0,213,206,227,170, 85,
+171, 12, 74,165,210,169,136, 86,245,231, 20, 10, 5,214,172, 89, 99,152, 51,103,206,229,188,188,188,174, 18,137,196, 82, 43,189,
+ 98,246,236,217,151,242,242,242,186,218,237,246,227,141,252,194, 99,203,202,202, 32, 16, 8, 16, 23, 23,103, 22,137, 68,224,241,
+120,184,121,243,102,141,209,114,115,115, 11,235,218,185, 83,200,215, 59,119,159,144,137, 36,146,190,189,122,134, 38,165,166,101,
+ 18,194,164, 54,145,213,189, 70,163,209,255,248,241,227,235,250,246,237,107,250,244,211, 79,237, 13, 69,182, 28,193,108, 54,159,
+184,120,241,162, 77, 42,149, 50, 57, 57, 57,118, 62,159, 15,150,101,137,185, 87, 47,115,231, 79, 62, 33,215, 94,127,157, 81, 43,
+ 20, 2,145, 72, 4,185, 92,206, 28, 62,124,216, 98, 48, 24, 78,252,245, 70, 11,114, 48,144, 37,230,153, 85, 82,158,157, 65,194,
+222, 74,147, 37,117, 1,164,174,128,212, 21,190,190,126, 56,159, 98, 80,129, 7, 49, 88, 7,198, 16, 35, 68, 1, 6,242, 56, 29,
+ 84, 66,177,140,201,205,205,173, 49, 68,213, 75, 96,135, 80, 92, 76,211, 43,193, 16, 9,248,112,102, 8,146,177,238,238,238,130,
+156,156,156, 59, 52,195,194,194,248, 54,155,205,241,161, 93,178, 89, 31,128,123, 49, 33,215,228,243,227,229,138,224,121, 75,191,
+148,201,216, 18, 32,122, 45,194,219,181,194,188,201,221,196,111,238,207, 15,191,144,106,104, 7, 62,121, 14,156,222,211,137,124,
+222,175, 82,169, 14, 93,184,112, 65,174, 82,169,144,148,148,132, 94,189,122, 97,243,230,205,114,185, 92,254, 19, 0,167,218,227,
+157,211, 33, 77, 95,206,246,125,117,119,122,110,108,142,253, 54,147,149, 95, 65,240,204, 71,251, 75,138,203, 76, 15,157,205,104,
+248,254,169,135, 75, 37, 37, 37, 35, 22, 45, 90, 84,152,159,159,127,155,201, 74, 75, 75,171, 54, 4,131, 1, 92,189, 87, 47, 75,
+141, 70, 51,109,233,210,165,184,112,225, 2, 70,143, 30,141,168,168, 40, 20, 21, 21, 97,215,161, 67,137, 59, 18, 19,255, 87,221,
+102,171,129,161, 31,234, 69,173, 86, 47, 88,186,116, 41,162,163,163,107, 52, 11, 11, 11,177,116,233,210, 76, 0,207, 59,107,178,
+170,201,203,203, 59,127,227,198,141,145, 93,186,116,185,190,110,221,186, 76, 31, 31, 31,110,230,204,153,120,230,153,103,224,233,
+233,201,174, 89,179, 38,125,192,128, 1,113,183,110,221,138, 48, 24, 12, 87, 28,249, 45, 80, 80, 80,112,122,243,230,205,103,135,
+ 14, 29, 42,159, 49, 99,134,231,190,125,251,220, 13, 6, 67, 43,137, 68,162,181, 88, 44,226,235,215,175,243,191,255,254,123,239,
+107,215,174,165,152, 76,166,243,205,205,251,127, 13,134, 97, 46, 48, 12, 19,201, 48,204,177, 58,235, 11,141,109,115, 98,223,134,
+254,110,244,115,117,178,185,185,206,226, 56,211,218,225,157, 89,157, 84,134,211,211,251,144,220,153,247, 19,221,148, 80,114,114,
+144, 27,121,186, 61, 83, 49,163,153,195, 59, 24,141,198,154,101,207,158, 61,196,219,219,187, 66,165, 82, 57, 61,188,131,183,183,
+183,174,172,172,140,220,119,223,125, 69,158,158,158, 53, 67, 17,248,248,248,232, 42, 42, 42, 72,159, 62,125,138,180, 90,109,205,
+240, 14,126,126,126, 25,132, 16, 18, 16, 16,144,221,144,158,221,110, 39,222,222,222,213, 61,244,132,110,110,110, 27,122,247,238,
+ 93,164,211,233,136,143,143, 79,205,208, 9,158,158,158, 43,123,245,234, 85, 55,189,169,252,102,100,102,102,146,204,204, 76,210,
+186,117,235,236,218,233,105,105,105, 36, 45, 45,141,248,249,249, 57, 61,188,131,167,167,231,138,122,242,210,172, 60,250,251,251,
+235,140, 70, 35,233,215,175,223,109,101,234,239,239,175, 51,153, 76,213,233, 14, 13,239, 32,147,201,158,147, 74,165,217, 82,169,
+ 52, 91, 34,145, 44,105,211,166, 77,222,119,223,125, 71,214,172, 89, 83,221, 37, 29,158, 97,227,251,118,232,247,196,255, 60,195,
+ 38, 44,104,201,240, 14, 42,149,234, 23,111,111,239,138, 61,123,246,220,118,125, 25,141, 70,135,135,119,144,201,100,153,122,189,
+158,211,233,116,182, 83,167, 78, 25,162,163,163, 13,113,113,113,134,148,148, 20, 99, 97, 94,158, 85,167,211, 25, 75, 75, 75,205,
+151, 47, 95, 54,203,229,247,102,120, 7,178, 57,168, 3,217, 16,178,255,214,123,129,215,230, 14,148,155,174,124,208,149,144, 31,
+ 30, 36,228,167,103, 8, 57,254, 42, 57,191,105, 38,233, 23, 40, 97, 79, 45,108,157, 64, 54, 6,255,232,200,144, 12,100,115,231,
+ 14,100, 67,200, 79,137,239, 6, 94,155, 49,160,149,233,139,207,214,144,115,231,206,145,184,184, 56,146,148,148, 68,126,218,251,
+ 29,233,215, 78, 94,169,185, 33,100,191,147,195, 60,244,151, 72, 36,250,213,171, 87,147,179,103,207,214,104,238,223,191,159,200,
+229,114, 3,224, 88,175,101, 2, 48,100, 67,216, 68,251,103,193,191,191, 57, 92, 89, 94,120,240, 85, 66,174,108, 37,100,115, 56,
+ 33, 95,245, 38,228,187, 49,132, 28,120,130,156, 93, 51,153,244, 15, 20,217,200,198,224, 40,178, 41,204,225,198,246, 66,161,176,
+108,207,158, 61, 36, 59, 59,155, 68, 69, 69,145,232,232,104, 18, 31, 31, 79,210,211,211, 73,100,100, 36, 17, 10,133, 38, 52, 99,
+218,178,222, 94, 8,136,232, 40,202,185,188,172, 63, 33,251,166,146,252, 29,211,200,216, 78,170,162, 62,173, 91, 52, 30, 93, 55,
+119,119,247,130,200,200, 72,146,146,146, 66, 78,156, 56, 65,180, 90,109, 1,128,240,123,253, 66,140,136,136, 56, 71, 8,137, 25,
+ 61,122,116, 12,128,195, 17, 17, 17, 49,201,201,201, 49,189,122,245, 58,139,198,135,126,104,144, 97,195,134, 89, 9, 33,100,244,
+232,209, 4, 64,118, 68, 68, 4, 73, 78, 78, 38,189,122,245,178,220,165,108,243, 1, 60, 33, 20, 10,191,112,115,115,251,213,213,
+213,245, 56,159,207,223, 12, 96, 58,154, 63, 30, 23, 31, 64, 43, 0, 97, 0,122, 86, 45,161, 85,105,180,199, 33,229, 78, 38, 7,
+162,255,147,237,152, 19,143,181, 69,249,212,182,208, 63,213,158,113,100,192,210,136,134,140, 22,199,113, 36, 33, 33,129, 12, 25,
+ 50,164, 66,161, 80,100,193,241, 1, 75,111,211,244,240,240,136,214,106,181,119, 12,162, 89, 43,253,182, 1, 75,181, 90,237,105,
+ 31, 31, 31,157,167,167,231,197,250, 52, 61, 60, 60,162,125,124,124,116, 30, 30, 30,183, 13,238,201,231,243, 71,123,120,120,100,
+213, 77, 23, 8, 4, 67,181, 90,109, 70,221,244, 6,142, 29,222,222,222, 25,217,217,217, 36, 63, 63,159,248,251,251,103,215, 53,
+ 96,185,185,185,183, 25, 48, 71, 52,155,202, 75, 35,121,172, 87,211,129, 50,109,206,121,175, 38,200,215,215, 55,111,213,170, 85,
+ 68,169, 84,230,213,222, 16, 60,240,169,183,206, 37,234,203,158,121,109,195,119,245, 12, 88,234,232,224,160, 35, 21, 10, 69,214,
+144, 33, 67, 42, 18, 18, 18, 8,199,113,132,227,184,134,140, 86,125,154,163,122,246,236, 89, 88, 80, 80,192,150,151,151,219, 51,
+ 50, 50,204,201,201,201,198, 15, 62,248,192,154,159,159,111,210,235,245,150,216,216, 88,179,143,143, 79, 62,128, 81,206,158,163,
+230,190,187,234, 86,159,145, 77,161,253,201,198,208,200,248,183, 3,174, 63,209, 91, 97,142, 89, 53,154,144,227,175,146,179, 27,
+158, 33,125, 3,197,149,134,104, 83,200, 33,242,101,208, 64,178,182,157,216, 33,205, 47,218, 15, 32,155, 66, 14, 93, 91, 28,112,
+253,193, 30,158,150,157, 91, 55,145,155, 55,111,146,253,223,239, 32,125,218, 86,153,172,141,161, 71,201,134,208, 33,142,104,214,
+103,182,182,108,217, 66,110,222,188, 73,126,252,241, 71, 71, 77, 86, 68,125, 70,235,141, 8,101,201, 51,189,165,230,169,221,196,
+150, 9,225, 34,235,136, 14, 34,123,191, 0, 1,219,213,135,199,133,122,130,140, 8,150,153,201,198,224, 40,178, 49,116,164,163,
+249, 20,139,197,233,168, 53,166, 78,221, 69, 34,145,228, 55, 98,180, 34,154, 52, 91, 65,146,156, 95,222, 27, 74,198,117, 81, 21,
+ 58,104,178,154,186,150,186,121,120,120, 20,124,245,213, 87,196,203,203, 43,223, 65,147,245,167, 95,159, 26,141,102,187, 94,175,
+143, 57,114,228, 72, 76, 68, 68, 68,204,246,237,219, 99, 78,158, 60, 25, 35,151,203,183, 87, 7, 39,234,154,173,208, 59,159,255,
+ 17,117, 34, 90, 49,229,229,229,228,200,145, 35, 36, 34, 34,130,108,223,190,157,156, 60,121,146,200,229,242,152,230,230,243,207,
+ 56,118,170,249,159,102, 38, 26,168, 58,252,211,127,220,212,103,180, 76, 38, 19, 89,184,112,161, 69, 42,149, 26, 68, 34,145,179,
+ 83,240,252,163, 47, 66, 15, 15,143,211, 94, 94, 94, 58, 47, 47,175,219,204, 94,237,116, 15, 15,143,139,255,242, 27, 48, 72, 36,
+ 18,165, 9,133,194,219,167,224, 9, 27,223,183,125,255, 25,139,188,194,199, 63,208,194,124,138, 68, 34,209, 27, 82,169,212,176,
+112,225, 66,139, 94,175,119,198,104, 1,192,112,185, 92,158,181,109,219, 54, 99, 98, 98,162,173,168,168,200,126,238,220, 57, 91,
+116,116,180,229,157,119,222, 41,151,203,229, 89,104,120, 88,130,191,164, 60,201,218,118,226,106,179,117,101, 81, 64,252,184, 78,
+114,235,230,249, 35, 72,223, 54,117, 76, 86,195, 35,185,215,175, 89,101,182, 46,189,233, 31, 63, 36, 72,105, 95,186,104, 30,233,
+211, 86,118,187,201,114, 66,179,174,217,146,203,229,229,111,191,253,182, 51,145,172,219, 13,225, 23,193,254,100, 83,200,246, 74,
+ 19,213,196,178, 33,248,115,242,105,176,255,223,229, 62,234,237,133,128, 97, 65,146,171, 78, 68,178, 28,201,103, 55, 87, 87,215,
+235, 78, 68,178,254,138, 99, 31, 49,107,214,172,152,228,228,228,152,164,164,164,152,147, 39, 79,198, 76,156, 56, 49, 6,192,136,
+ 90,159,169, 49, 91,214, 73,147,204,221,120,188,121, 77,104, 62, 58,107,214, 44,146,156,156, 76,146,146,146,200,201,147, 39,201,
+196,137, 19, 9,156,155,190,135,154, 34,106,180,238, 9,127,246,132,159, 17, 0,142,213, 78,144, 74,165, 58,147,201,228,169, 84,
+ 42,247,234,245,250, 57,168,236, 22,217, 34,205, 63, 35,159, 84,243, 95,161,233,163, 84, 42,215,233,245,250,137, 82,169, 52,223,
+100, 50,121, 57,161,233, 34,145, 72,230, 73,165,210, 33, 6,131, 33, 8, 0, 20, 10, 69,130,217,108,254,213,104, 52,126, 12,160,
+228, 94, 31, 59, 89,219, 78, 12,177,184, 39, 8, 94,143, 73,175,104,187,244, 72, 81,192,252,161,174,233,253,218, 43, 82, 32,228,
+ 62, 2, 99, 62,207, 60,153,102,118, 90, 83,198,244, 2, 43,124,253,124,170,161,205, 71, 63,151, 7, 44, 24,162, 76,239,215, 78,
+153, 14,130,143, 32, 49,156,113, 86,179,174,217, 82, 40, 20,219, 42, 42, 42,158, 5,240,171,179,199, 78,118,135,138, 80, 97,243,
+133,141,223, 9,164,145, 41,124, 8, 49,128,199,143, 67, 46,116,204, 59,215,173,244, 62,250,203, 53, 71, 40,149,202,105, 33, 33,
+ 33,237,174, 93,187,150,100, 48, 24,190, 1,112,180,238,251, 39, 4, 24, 34, 23, 8,186, 26,237,246,168,235, 64,116, 19,154,143,
+ 42,149,202, 5, 33, 33, 33,225,215,174, 93,187,106, 48, 24, 86, 1,216, 69,207,209,191, 74,243, 95,201, 95, 62,138,114,245,203,
+ 78,175,215,211,210,167,252,217,228,232,245,250, 73, 85,215,157,179,251,150,152,205,230,197,102,179,121,113,245, 15,146,226,226,
+226,191, 85,163, 85,230,165, 36, 11, 89,219, 46, 26, 98,241,178, 30,254,178, 57,123,102,201, 12, 32, 76, 38,132,220,154, 38, 76,
+ 86, 83,154,231, 33,179, 45,235, 21, 32,123,249,199,231,100, 6, 16,228,130,224,227, 38, 76,150,163,156,170,168,168,104,219,236,
+ 99,126,248,186, 21, 64, 10, 1, 82,241, 78, 35, 63, 20,223, 1, 97,104, 35,227,123,201, 81,189, 94,127,244,252,249,243,141,125,
+134,196, 3, 4,249, 91,179, 0, 0, 32, 0, 73, 68, 65, 84,199, 97,119,184, 51,192, 46,189, 94,191,171, 9, 77, 10,133, 26, 45,
+ 10,229, 31,200,223,246,133,205,188,148,100, 33,187, 67, 47,160,128,191, 16, 60,180, 5,236,105,168,176,231, 50, 47,165, 89, 90,
+168,121, 14, 5,204, 92,240, 17, 4,177,253, 22,244,150, 92,230,249, 52,203,223,230,184, 1,130,119,168,145,162, 80, 40,127, 27,
+102,226,246,158,134, 53,255, 83,163, 69,161,252,195,169,138,242,100, 86, 45,127, 91, 77, 10,133, 66,249, 15, 26, 46, 48,104,184,
+ 65,155, 51,117,175,205,105, 20,119,140,106, 54, 75,147, 15, 64, 3,192, 5,149,211, 56, 84,119, 19,110,106,152,141, 7, 0,216,
+104,121, 82, 77,170, 73, 53,169, 38,213,188,199,154, 77,105,255, 19,219,126,213,215,203,112,243, 95,241,197,180, 71,198,221,101,
+ 36, 45, 79,170, 73, 53,169, 38,213,164,154,255, 82,205,127, 37, 60, 90, 4,255, 40,164,180, 8, 40, 20, 10,133, 66,249,219,209,
+189,106,237,131,202,232,150, 79,245,134,123,218, 70, 75,230,222,209, 7, 2, 94, 23,134, 35, 33, 0, 64,120, 76, 60,236, 92,172,
+177, 48, 49,167,165,218,202, 86, 65,110, 4,226,221, 12, 44, 15,235,179, 19,138, 90,170,215, 41, 72, 61,201,203, 67, 53, 45,183,
+176,116,219,213, 27,250,125,206,236,171,209, 4,104,164,110,174,147,205, 86, 91, 39,177, 72,148,110, 45, 41,219, 92, 92,156, 84,
+222,140,108,184, 53,182,241,157,119, 8,115, 48,231, 34, 35,146, 91,121,238,106, 17,163,135,158,232,115,148, 92, 96, 73, 10,249,
+254,251,135,137,179,231,134,225, 97,176, 66,165,234, 33,145,202,123,201, 85,174, 29, 57, 2, 20,233,178, 82, 45, 54,251, 73,214,
+ 98,136, 33, 28,126,187, 27,231,138, 66,161, 80, 40,148,127,129,209,186, 8, 96, 12, 42,171, 12,155,110, 12, 31, 16,118,255, 5,
+169, 84, 22, 8, 0, 28, 33,224, 8, 80, 81, 86, 18,147,155, 20, 61, 18, 0, 60,218,116, 63, 34,148,170,123,112,164,114, 59,203,
+ 1,118,171, 41,165, 44,237,220,125,142,228, 72,225, 25,244,224,208,136, 97,147,198,142, 29, 19,220,185, 83,231,246, 0,112, 37,
+238,202,173,131, 7, 35,111, 28, 63,198,236,169,200, 79,248,177, 37, 71, 76, 32,125,191,103,207,110,247, 71, 71, 95,124, 15,192,
+139, 45, 45, 65,119,119,229,156,163, 63, 44, 28, 56,108,210, 74, 5,224,156,209,146,186,185, 78,158, 48,110, 84,183, 87, 94,154,
+197,123,102,225,135,129, 23, 78,253,182, 92,233, 19, 94, 66, 56,219,209, 10,221,148,223, 27,155, 56,185,174,127,108,200, 96,125,
+ 83,116,152,183,230,171,190,174,198,162, 91, 83, 8,199, 78, 97, 24, 6,124,177,252,123,207,118,247,127,231, 50,120,126, 49, 0,
+135,123,140,169,125,194, 34,180, 62,126,123,166, 60, 53, 79, 42,215,120, 9,192, 23, 1, 96,144,157,122, 29,199,119, 45,117,125,
+249,221, 45,221, 79,197,166,217,127,249, 97,189,137, 17, 9, 39, 25,114,174,209,177, 84, 40, 20, 10,133,242, 95, 38,178,202, 92,
+ 69,214,221,208,160,209,146, 74,101,129,103,127, 59,232,246,227,201, 12, 0, 64, 68,119,111,252,239,131,117, 35,182,175,141,190,
+ 1, 0,125,135,142, 13,122,239,141,151,112,250,106, 30, 8, 33,232,214,193, 29, 15, 76,120,216, 49,227,225, 21,122,223,228,201,
+ 15, 61,182,112,225,130,241, 55,111,222, 76,221,185,115,231,239, 0, 48, 96,224,192, 14, 31,126,248,225, 35, 43, 93,221, 36,223,
+126,255, 67,150, 73,119,253, 66,115,142, 86,218,170,157,111,112,199,182,211,190,253,114, 29,111,240,200,135,166,166,162, 98,169,
+ 41, 59, 41,203,145,125, 61, 60, 60,230, 10,133, 66, 13, 0,112,220, 31,254,199,106, 37,222, 0, 96,103, 57,149,107,171,224,114,
+190, 72,202, 74, 36,162,107,229,122,253,182,178,172,235, 95, 52,166,105,182,217,194, 95,126,254, 73,222,165,164, 66, 4,134, 15,
+224,175, 89,250, 38, 56,214,230, 58,239,141, 15, 38, 71,159,251, 22, 21, 58,156,112,240,208,132,117, 19,124,125,251,240,223, 95,
+170, 28,206, 48,120, 34,160,239, 83, 19,223,219,250,189,176,103, 7, 53,204, 54, 14,135, 98, 10,251,110,248,248,253, 21,167, 54,
+140, 57, 0, 96, 19,128, 95, 0, 52,105,234,220,220,221,190,153,187,232, 99,101,133,229,143, 97,138,170, 76, 22, 62,223,182, 27,
+151, 51, 56,132, 4,135, 8,188,231, 46, 87,110,250, 96,230, 86, 67,229,220, 93, 20, 10,133, 66,161,252, 87,201,193,237,141,223,
+ 55, 55,105,180, 0, 64, 41, 19,224, 70,114, 46, 0,192, 69, 6,204,121,110, 6, 10, 11,242,131, 44,118, 14, 79,205,152,142,139,
+241, 57,184,145,146, 15, 66, 8,130,252,228, 14,231,134, 15,174,231, 83, 79, 63, 53,232,200,209,163,231,223, 90,244,214,215, 12,
+131, 51, 0,176,105,243,231,125, 23,191,189,248,217,233, 51,166, 15,255,254,251,239,175, 2,104,150,209, 18, 48,170,117, 43,150,
+ 45, 17,103, 22,152, 76,115, 23,190,206, 45,152, 63,119, 13,128,135, 28,114, 50, 66,161, 38, 51, 51, 83,201,227,221,222,124,237,
+163, 37,175, 71, 13,159,180, 50, 49, 53,189,228,210,145,253,251,239, 11, 11, 11, 67,102, 86,110,255,229,159,108,236,122,232,136,
+236,201,242, 50,227, 36, 67,193,245,122, 39,109,150, 8,133, 87,223, 93,190,161, 27,231,210,129,247,191,103, 71, 35,188,125, 43,
+100,229,149, 96,224,200,241,130,152, 11, 23, 70, 0, 14, 27,173,186, 3, 52, 78,182,112,121, 93, 63,220,118,110,216,196,126,173,
+122,242,120,124,232,141, 54,228,151,154,193,114,192,128, 80, 13, 70,109,255, 68, 80, 84, 97,123,240,131, 31, 50, 30, 60,179,118,
+172,206, 84,154, 61, 27,192,158,198,191,134,184,249,105,213,184,145, 81, 94,175,201,170, 48,217, 1, 0, 34, 62, 11, 6,196,157,
+222, 95, 20, 10,133, 66,249,143,211, 96,175, 67, 30, 0, 28, 60,120,176,222,246, 59, 44, 75,112, 35, 37, 7, 55, 82,114,112, 62,
+ 62, 31, 86, 34,196,154,229,239, 98,213,210,183, 81,100,228,225,199,211, 25, 72, 72,201, 69, 66, 74, 46, 10,138,235, 29,233,253,
+182, 42,165,149, 75,101,221, 63,254, 88,189, 98,196, 64,197, 96, 55, 87, 87,215,196,171, 95, 87, 44,158,175, 11,125,247,229, 12,
+145,208, 34,201, 84, 40, 21,253,118,239,254, 46,204,203, 83,171, 80, 42, 85,175,202,125,187,110,209,104,186,104, 26,211,172,139,
+ 76, 27, 50,126,252,152, 81, 67,189,189,189,184, 89,107, 98,226, 59,133,134,216, 58,118,232,216, 95,166,237, 56,190,145,221,106,
+ 52, 57,142, 3,143,199,131, 78,167, 67,118,118, 54,146,147,147,145,144,144,128,140,140, 84, 29, 71,136,144, 5,199,243,241,241,
+131, 64, 32, 70, 96,155, 0,108, 88,179, 84,254,193, 59,255,235, 37, 85,136,247,213, 49, 66, 53,154,166,162,226,239,127, 58,124,
+ 52,235,208,206, 13, 44, 0,228, 21,235,113,252,194, 77, 92,188,150,225,236,137,172, 59,132, 67,155,172,180,155,101,246,148, 72,
+254,123,111, 46,200, 56,121,242, 84,106,105,185, 5,229, 6, 43, 12, 38, 27,204, 22, 22, 54,150, 67,128,167, 20,123, 95,239,132,
+253,191,198,122, 49, 12,243,113, 83,229,105, 54,219,216,251, 67, 20,152, 58,164, 53, 66,252, 20,200,186,113, 6,115, 23,125,140,
+232,100, 51,138,139, 75, 96,171, 40, 0,167,207, 68, 65,202, 69,216, 89,150, 52,117,222,239, 18, 84,147,106, 82, 77,170, 73, 53,
+255,197,154, 13,121,145,127, 8,155,235, 89, 80, 99,180, 26,226, 86, 70, 17,110, 36,231,162, 71,136, 47,218,183,241,193,249,132,
+ 98,124,115, 60, 3, 91,142,164,225,248,229,124,112, 2, 21,114,203,128,196, 84, 29, 18,211, 10,154, 28, 63,155, 47, 17, 78,121,
+249,229,210,133,157,195,202,250,252,118,104, 14,124, 61, 19,195, 94,123,173,100, 14, 95, 34,156,226,218, 90,181,243,245,133,243,
+166,169,228,114,177,197,108, 65,187,182, 1,210,151,102,207,121,146,113,149,236,116,244, 40, 85,190,161,174, 18,153,236,139, 15,
+222,121, 85,242,241,143,137,233, 21, 22, 84,236, 57,163, 75, 90,240,250,226, 34,129, 80,186, 65,229, 27,234,234,168,150,205,102,
+131,217,108,134,197, 98,129,213,106, 69, 86,198,245,241,191,252,248,202,200,182,173,221, 70, 74,164, 82, 16, 0,101, 70, 59,146,
+115, 12, 24, 50,108, 56,191, 71,247,238,225, 74,159,208,167,235,211, 42, 45, 77, 43,229, 8, 95,117,112,239, 14,254,119, 63, 95,
+194,215, 7, 47, 96,223,175,151,112,254,196, 33, 59,225,108, 53,243,127, 41,125, 58, 4, 41,125, 58,167, 41, 91,117,209,213, 44,
+190,157,162, 27, 45, 83, 62,143, 12, 25, 22,113,236,185, 23, 95,250,205, 80, 94,152,247,197,186,119,179,242,179, 83,175, 75, 68,
+140, 93, 46,225, 67,111,178, 99,235, 47,217,152,188,244, 50,174,165,235, 65, 8,105,114, 2,111, 14,152, 63,229,233, 87, 88,155,
+213,138, 96,127, 37,118,108, 94,134,241, 67,186, 98,104,103, 87,220,215, 94, 1,185,192,140,171,241, 55,176,107,199, 86, 59,199,
+241, 22,208, 31, 50, 20, 10,133, 66,161, 17,173,154,197,167,246,134, 6,171, 14, 77, 38, 99,202, 67, 83,166,195, 71,235,173,156,
+ 48,248, 9, 81,204,173, 18,228,231,164,225,102, 66, 28, 12, 38, 27, 68,174,109, 1,169, 55,218, 4, 6, 32,246,198, 62,235,218,
+ 21,145,122,206,110, 78,105, 72,111,252,120, 31,191,155,241, 12,111,197,114,255,179, 9, 55,138,123,236, 88,244, 21, 30,123, 76,
+233,177, 98,185,255,217,212, 36, 5, 79, 46, 37,253,158,156, 49,149,225, 49, 4,175,189,182, 16, 19,198,142,194, 83, 79, 62,206,
+108,219,182,181, 79,137,131, 71,201, 65,248,233, 27,111,190, 43,214,149,216, 45,231, 19,244,102,185, 66, 38, 59,149,168,175, 8,
+ 15,244,151,141,158,244, 68,118,228,238, 47, 62, 6, 48,195, 17,173,106,131,101,179,217, 96,181, 90, 1,128, 5, 0, 30,175,114,
+ 93, 88,110, 65, 94,137, 25,186, 18, 51,236, 44,135, 73, 83,102,200, 46, 68, 95,158, 1,160,129,246, 90, 28,103,179,219,176,231,
+231,139,200,186,240, 61,199,240,248,165,181, 26,195, 67,233,211, 33,200,219,219, 63,106,236,164,199, 61,197,210,202,106,216,242,
+ 10, 51,182,109, 92,222,104, 62,121, 12, 67, 56,214, 94, 98,183,217, 42,218,181,109,151, 21, 18,214, 85,122,242,183, 35,227, 79,
+ 29,219,163,183,183,123,220,229, 86,106, 14,248, 66, 9,248, 34, 41,204, 86,199,126, 44,232,110,158, 93, 15,128,121,250,133,133,
+107,230,189,242, 63,254,252,181,191,195, 98, 50,192,108,172, 64, 89,105, 49,100, 2, 27,174,158,222,111, 39,172,109, 94, 69,206,
+165,245,244,254,162, 80, 40, 20,202,127,156,186,211,239,212,164, 53,104,180,210,174,157,188, 15, 0,130,122,142, 40, 84, 74, 5,
+110, 2, 30, 3, 93,230, 45,108, 91, 57, 23, 28, 71, 48,250,217, 21, 80, 5,122, 67, 38,226,195,172, 47,212, 23,221, 58,209,104,
+ 91, 29,134,177, 13, 95,191, 41, 43,240,133,231,219,169,119,236,208, 11, 1, 96,199, 14,189,240,249, 89,173,213,159,109, 74, 9,
+236,125,127, 15, 16,150,197,216, 9, 15, 97,202,163, 83,144,154,107,192, 15, 81,233,168, 48, 90, 28,234, 45, 39,243, 8,233,234,
+225,238, 57,234,229, 39, 70, 41, 4,124,134,233, 24,160,225,103,228,219,236,124,190,144, 61,112,161, 52,123,210,164, 71, 61,142,
+255,244,221, 80,214, 35,164,171,177, 32,254,114, 83,122,102,179, 25, 44,203,194,108, 54,195,102,179,193,205,163,237, 79,195, 31,
+ 90,153,153,147, 91, 30,153, 91,108,234, 93, 97,179, 67, 87, 98, 70, 94,137, 25, 37, 21, 86,120,171, 92, 97,183, 89, 58, 55,164,
+ 71, 8,249,122,226, 67,211, 31, 7,192, 99,120,246,175,244, 57,241, 9,149, 91,254, 48, 89,163, 38, 60,230, 25, 21,115, 11, 55,
+163, 15, 21, 19,206, 94, 57,138, 59,195,101, 54, 94,174, 32,124, 6,156, 72,192,216,248, 60, 30,103,181,234,109, 90,173,231,241,
+ 19,199, 15,143, 51,217,147,192, 23, 73,106, 62,107,180,176, 14, 95, 49,186,155,103, 63, 5,128, 79,214,174, 89,213,111,248, 99,
+162, 19, 23, 83, 96,180, 1,125,187, 7, 97,239,183,159,155, 9,177,189, 82,145,115,233, 83,122,111, 81, 40, 20, 10,133,114,155,
+193,138, 68,101,227,248,219, 35, 90,213,117,163, 99,199,142,173,219,224, 26, 89,186, 34,184, 43, 5,240,108, 21,136,105,115, 87,
+225,235,143,231,131,101,109, 32, 4,176,179,142,141, 76, 64,136,240,231, 23,159, 15, 12,105, 19,200,247,156,246,152,220,248,205,
+ 14,131,108,218, 99,114, 99,167,206,238,165, 47, 62, 31,152, 82,110,242,239,111,103, 89,156,186,154,135,184,148, 82,196,165,150,
+ 65, 41,115,124,152, 47,190, 88,244,252,242,101, 75, 69, 2, 62,195, 92, 77,211,235, 51, 11,237,122,190, 80,104,149,203,196,196,
+ 66, 4,230,212, 2, 82, 56,108,226,147,198, 3,219, 63,121, 26,192,236,134,116,170,123, 26, 86, 71,178,170,215,132, 16,194, 0,
+ 28,199,176,108,102,129, 9,122,171, 13,186,226, 63,140, 22, 99,111,184,230, 84,233,211, 33, 72,173, 82, 30,230,243,249, 18, 66,
+ 0,155,213,254, 8,124, 58,140,212,231,220, 76,168,109,178,206, 94,205,198,173, 75,199,116,172,213, 48,221,144,119,227, 23, 71,
+143,157, 97, 64,248,124,112,124, 30,195, 49, 12, 56, 33,143, 88, 64, 8, 87, 55, 71, 6, 39,140, 86,181,217, 18, 11,249,139,142,
+238,250, 88,251,212,152, 80,124, 27, 85,233,249, 76,229,249,101, 21, 89,212,100, 81, 40, 20, 10,229,238,210,152, 23,249, 7, 69,
+181,238,140,104, 53,118, 64,132, 0,137,105, 5,104,227,231, 9,191, 54,237,145,112, 61,246,143,109, 0,236,172, 99,213, 81,251,
+247,231,100,174, 90,165,230,230,207, 47,237,187,124,185,255,153,231,103,181,214,116,234,236, 94,250,234,171,233,125, 87,175,214,
+156,249,249,172,144, 37, 85,227,117, 85,143,205, 69,136, 51,237,226,120,189,186,134,181,229,191,187, 35, 49,253,151, 43,229,121,
+ 34,145,200,230,237, 42,101, 84, 74, 49,159,207, 19,138,205, 54,158, 57, 40,188, 59,255, 0,143,233,222,152, 74,181,209,170, 91,
+117, 88,152,127,107,252,209, 31, 22,118, 26, 60,113,133, 91, 86,190, 17,165, 22,126, 77,213, 33,159,199,224,202,245, 52,128, 47,
+138,171, 79, 83,173,114, 59,178,243,155,175,253, 87, 47, 95, 2,171,157,197,139,243,223,194,147, 51,166, 31,129, 79,135,145,254,
+129,193, 49,191, 31,248, 74, 62,114,214, 6,164,221,136,206,181,155,203,118, 57, 99,178,106,204, 22, 64, 88,194,241,138,138,203,
+148,102, 59,164,168,199,247,153,173, 92,179,174, 28,189,209,142, 3,231,114,113,240,199, 93,208,168, 20,244, 73, 64,161, 80, 40,
+148,187,206, 63,212, 92,161,142,185, 2, 26,138,104, 53, 70,128,159, 23,206,197,165,160,115, 72, 91,104,212, 42,196,223,202, 4,
+159, 39, 4,143, 1,108,118,199,205, 16,177,218,190, 93,189, 90,131,180, 20, 5,239,179, 13, 41,129, 47, 62, 31,152,178,122,181,
+230, 12,177,218,190, 5, 48,157, 16,160,210,108, 85, 26, 46,214, 9, 95, 64, 56, 91,107, 47, 55, 57, 63, 58,169,162,144,199,227,
+155,221, 53, 82,206, 93, 35,225,185,171,196, 66,145,144,207,217, 9,207,234,167, 13, 52, 17,142,235,234,136, 94,237,170, 67,150,
+101,193, 48, 60,182,202,136, 41, 50, 10,141, 40, 53,241,161, 43, 49,163,184,220,138,142,190, 10, 28, 59,254,189,129,181, 25,119,
+212,167,197, 23,138, 52,237, 3,253,240,191,247, 87,195,104,102,145,152,165,135, 72, 34,241,246,242, 14,191, 60,253,133,215, 37,
+ 47,109,190,133,167,135,186, 99,254,239,183,178, 12, 58,233,235,206,156, 89,150,101, 97, 52, 89, 68,186,130, 98,215,178,242, 10,
+181, 76, 42, 49,122,186,105, 10,234,251,172,201,201,136, 86, 53,114,169, 0,227,250,120,195,100,157, 10,163,217,142,211,191,236,
+161, 79, 4, 10,133, 66,161, 80,254,160,193, 9,164, 29, 50, 90, 74,185, 20,132, 47,197,239, 49,183, 16, 28,214, 5, 91,247,159,
+ 71,135,206,125,144, 83,110, 7, 1,175,201,222,134,213, 44,124,195,120, 17,192,197,241,227,229,126, 15, 62,232, 59,156, 16,225,
+207, 27, 54,149,101, 2, 64,219, 78,149, 50, 28, 71, 64, 8, 64,184, 74,195,229, 48,140, 32, 45, 37,167,172, 77,160,183, 2,215,
+ 50,173,102,133, 68,196,115, 85,136,249,158, 26,177, 72, 36, 16,128, 37,140, 57, 39,231,150,153, 1, 82, 29,145,171, 91,117, 40,
+ 87,250,252, 52,108,226,138,252,212,244,210,232,142, 69,134,174,165, 86, 49, 8, 1, 58,250, 42, 16,119, 54,146,213,101,221, 76,
+ 52,234,110,108,172, 79,139,227,192,183,218, 57, 92, 78, 42, 69, 73,133, 13, 37,122, 43,250, 15, 25, 39,234, 31, 49, 30,191,199,
+ 21,128,179,219,176,252,243,200,114,150,216,166, 0,215,109, 78, 28, 52,239,220,197,171,126,249,197, 21, 18,161, 64, 80, 18,210,
+ 33, 32, 89, 44, 18,218,203,202,202,196,183,127,138, 15,133, 76,140, 34,189, 13, 0,108,206, 94, 61,165, 21, 54,236, 63,155,139,
+ 3,123,118, 66, 38,147,129,208, 27,138, 66,161, 80, 40,148,218,248,160,114,250,157,200,170,117,141,249,114,104, 82,105,150, 35,
+240,112,119,131, 84,161, 70,138,206,138,114, 70,139, 98, 3, 1,203, 86, 70,180, 26, 9, 60,213, 59,187,247,254,253, 57,153,251,
+246, 21,108,217,191, 63,167, 86, 67,239, 63, 34, 89, 53,107,142, 56,172,201, 16,246,216,254, 67,191,149,142,239,237,233,202,227,
+243,141, 34, 33,207, 44, 16,241,173, 34, 1,207, 38, 18,240, 44, 94,106, 33,255,183, 3,187,196,132,193,111, 77,105,154, 76, 38,
+ 68, 68, 68, 96,244,232,209,152, 48, 97, 2, 30,126,248, 97, 4, 5,133,106,121,124,198, 66, 24,142,243, 20,151,163,189, 39, 3,
+129, 41, 3,191,236,250,200, 16,119,106,239,101,214,108, 26,135,219, 45,231, 31,154,132,112, 69,165,102,152,172, 44,138,245, 86,
+ 20, 87, 88, 97,247,236,139,189,167,179, 97,180,176, 72,139,249,222,152,159,155, 57,215,156,119, 51,165,137, 83,241,218,237,255,
+146,204,103,158,154,145,175,146,242,110, 14,232,119, 95,190,135,187,155,157, 97,254,136,188, 50, 12, 3,169, 90, 11, 87, 23, 21,
+ 82, 46, 30,194,209,229,195,140, 0,222,116,164, 60,107,163,150, 11, 48,190,183, 55,198, 77,154,138,206,125, 70, 58, 98,172,233,
+140,246, 84,147,106, 82, 77,170, 73, 53,255, 75, 84,207,113, 88,189,118,108,100,248,106, 3,212,206, 71,129, 14,190, 10,152,172,
+ 90,152, 44, 44, 42, 76, 44,202, 12, 86,148, 25,108, 72,201, 53, 32,110,127,203,115, 88, 25,197,170, 28,241,147, 16, 0, 76,165,
+193,115, 52,122, 34,182, 90,222, 95,181,252,195, 71,118,117,239,102,121,105,140, 79,235,216, 20, 75, 54,195,240,140, 60,190,192,
+230,166, 18, 8,227,227, 99,243,207, 68,253, 52, 80,106,103, 31, 55, 52,162, 99,183,219, 75,125,125,125, 1,220, 62, 5, 79,104,
+123,217,132, 83,145,175,181, 29, 52,126,185,231,199, 75, 22, 26,120,124, 17,199, 8, 68,113,172,205,184,211,168,187,177, 1,141,
+216, 15,158, 72,122,253,220,165,107,125, 92,220, 90,227,102, 86, 5, 42, 76,118, 88,237, 28, 92,149, 34,100, 94, 57, 98, 77,137,
+143,254, 78,159, 29,187,181, 25,197,182, 35,225,122,156,223,168, 81, 35, 31,234,211,167, 47,127,241,226,183, 16, 28, 28, 12,163,
+209, 8, 30,143,135,214,109,218, 35, 37,225, 18,206, 70,190,207, 26, 10, 83, 55, 2,120, 15, 64,190,179, 95, 82, 80,102,193,161,
+232, 60, 68,254,248, 45,248, 66, 49,189,157, 40, 20, 10,133, 66,185,147,153,117,214,155, 29, 50, 90, 38,147, 41,229,254,136,113,
+224, 56, 2,150, 0, 28, 91, 21,121,226,254,136, 62,177, 54, 83, 74, 75,115,199,113,236,249, 79, 55,111, 25,221,189,215, 32,126,
+152,191, 18,101,133,185, 56,123,234, 87, 59, 56,114,198,145,253, 11, 11, 19,245, 50,175, 14, 15, 61, 50,249,193,221, 51,158,154,
+ 85, 50,112,200, 16,133, 86,235,109,206,204,202, 52,124,185,253, 27,219,145,159,246, 13,228, 96,127,180,176,240,166,190, 49,157,
+210,210,210, 79,234, 75,151,136,149,253, 1,180,229, 11, 24,139, 49, 63,209,169, 22,225, 5, 89, 25,147, 62,124,255,157,212,199,
+158,157, 39,110,231,219, 30,121,165,124,164,100,230, 34, 62,106,159, 57, 43,225,194,143,101,153, 23,159,118, 80, 42,167,158,180,
+ 76, 0, 31,159, 61,123, 38,124,212,168, 81, 35,135, 14, 29, 74,102,206,156, 9, 66,128, 95, 54, 63, 79,138, 82,206,126,143,202,
+ 40, 86, 82, 51,207, 75, 90,212,153, 75,110, 15, 15,236, 41,112, 87, 61,141, 45,223,254,100, 3,225,210,232,253, 68,161, 80, 40,
+ 20, 74, 13,205,111,163,149,113,189,114, 60,173, 63,155,242,220,188,233, 91,183,126,253,193,215,219,119,245, 55, 89, 44,190, 4,
+162, 12,214,110, 57,161,103,177,216, 81, 13,163,238,102,180,187,123,199, 78, 95,126,254,233,155, 95,110,249,108, 16, 56, 54,132,
+ 1, 82, 9,131,223,164, 54,118, 70, 83, 38,171, 81,179, 84, 80,190,105,248, 67, 43,141,133,133,250,175,157,221,215, 88,120, 35,
+151,199,183,182,222,180,230,253, 21, 60, 30,127, 4,203,114, 66,142,181,221,100,173,166,143,140,249, 55,246,195,225, 86,110, 40,
+106,100,219, 85, 0, 87,143, 31, 63, 62,224,248,241,227,189, 0,124,130,202, 57, 20,163, 91,114, 94,204,133,229,195, 94, 89,248,
+202, 47, 11,192, 4,112, 28,129,157,229,210, 68, 70,195, 48,122, 79, 81, 40, 20, 10,133, 82,195, 76,220, 57,104,169, 99, 17,173,
+191,138,226,226,164,114, 20,227,165,150,234, 20, 22, 38,234, 1,220,209,115,207,208, 66,221,184,196,178, 31,144, 88,246, 67,115,
+247,175,200, 75,206, 7,146,103,180, 48, 27,142, 52,100,255,189,106,185, 43, 20, 20, 92,175, 64, 1,122,211,123,136, 66,161, 80,
+ 40, 20,167, 13,151, 99,141,225, 41, 20, 10,133, 66,161, 80, 40, 77,154,172,218,107, 0,149,109,207, 27,234, 57,224,204,204,220,
+205,233,125,112,140,106,182, 88, 83, 8, 64, 12, 64, 9,160,169, 42,205,145,168,154,175,145,150, 39,213,164,154, 84,147,106, 82,
+205,123,168,217,148,246, 49, 80,254, 84, 3, 70, 53,169, 38,213,164,154, 84,147,106, 82,205,255,158,230, 63,153,153,245, 44, 0,
+254, 70,109,180, 40, 20, 10,133, 66,249,171,112,119,239,168, 4,106,218,245, 54,137,220, 35,212, 11, 0, 12, 5,215,117,180,244,
+ 40,245, 80,123,158,195,187,210, 70, 75,200, 19,136, 95,145,171,220,175, 43, 52,238, 89,255,241,194,101,130,218, 40,230, 12, 31,
+ 24,184, 55,184,173,108,130, 51, 59,202, 61,131,190,242,110,223, 59, 93,161, 13,154, 3,159,238,178,150,100, 66,161,109,235,169,
+108,221,243,148,202, 55,252,129, 63,225, 24, 37, 97, 97, 97,125,195,194,194,250, 2,144,220, 13, 65,185, 54,104,170, 95,135, 62,
+ 81,218,118,221,126, 85,120,117,156,124,183, 51,172,244,233,224,174,108,221,227, 7,101,171, 46,197, 74,159, 46,101, 74,191, 30,
+ 39, 84, 30,161,237,154,218,175,245,248, 15, 67,222,221, 25,183,179,245,248, 15, 67,234,219,238, 58,106,173,234,237, 93,137, 75,
+220,199,125,164,164,207,149,230,209,186,255, 84, 23,159, 65, 11,220,157,221,207, 55,168,207,213, 54,225, 3,242, 90,117,236, 29,
+231,232, 62,126,193,125, 47, 6,132,245,215,249, 5,245,141,166, 37,239, 24, 82,207,182,125,165,174,254,145, 18, 87,255,159, 36,
+110,109,135,180, 84,207,199,199, 71, 22, 18, 18, 50,170, 79,159, 62,207, 13, 27, 54,236,229,110,221,186,205, 12, 8, 8, 24,113,
+ 47,127,232,203,181, 65,111,152,133, 76,129, 89,200, 20,200,181, 65,111, 52,253,124, 13,254,128,225,177,217, 12,143,205, 86,104,
+131, 63,248,187,156, 43,137, 87, 80,128, 92, 27,180, 90,229, 29,118, 94,166,237, 56,206,217,253, 93, 93, 93, 71,120,122,122, 78,
+172, 94, 92, 93, 93, 71,208, 59,160,217,212,142, 98,181, 56,162,197, 23, 74,228, 39, 31,123,234,197, 78,203,222,121, 93,186,102,
+203, 94,172, 89,178,240,154,185,162, 36,236,239,120,228, 30,109,123, 69,243,121,124,191,218,105, 44,199,102, 22, 36,159,239,121,
+ 55,244,131,219,200,158,126,243,213,233,243,167, 62, 18, 17, 16, 49,118, 46,115, 35,217,184,207,113,139,134,174,223,253,240, 99,
+235,168,223,126, 93,187,101,203,230,247,242,237,193,171,133, 18,193,167,101, 25, 87, 75,156,201,131,218,179, 93, 91,129,194, 35,
+234,254, 9, 47,122,199, 28,251,102, 43,107,225,134, 27, 10,106,205,254,221,124, 60,219,183,111,127, 31,159,207,119,159, 51,103,
+142, 8, 0, 62,254,248,227, 14, 44,203, 22,222,186,117,235, 2,154, 49,248,105,165,193, 12,158,254,201,138,119,191,126,224,129,
+209,200, 46,168,192,242,213,235, 7, 31, 62,248,221,195, 21,186,196,239,239,198, 57,113,113, 9, 84, 67,164,186, 50,247,213,247,
+180,163, 6,223,199,215,155,236, 56, 28,117,105,192, 55,235,223, 59, 15,132,246, 42, 47,184,222,224,152, 98,156,161,116,145,151,
+146,140,226, 12,165, 0, 48,245,142,151,189,210, 22,225, 41, 99, 71,249, 72, 4,151, 10,129, 38, 39,125,116,105,211,255,136, 80,
+ 34, 9,224,241,120,224, 49, 0,143,199,128,207, 48,149,243,132, 90,141,105, 89,241,191,143,252, 59,220, 39, 42,255, 94,185,224,
+ 11,220,121,204, 31,249, 99,120, 85,107, 66,202,114, 19, 79,186,223,133,175,209,116,234,224, 18,222,191, 67,197,151, 39,146,139,
+ 20,130,129, 47, 71, 50,132,247, 89,250,239,171, 47, 59,100, 0,164, 82,215, 3, 7, 14,120,142, 26, 53, 74,163, 13,159,112,194,
+145,125,196,124,125,216,193,131,251, 69,163, 70,141,116,226,250, 12, 26, 14, 30,111, 59, 3, 8, 57,142,124,204,231,200,119,250,
+194,132, 91,128,115,179, 79,201,180,193, 79,243, 64, 28,126,206,112, 96,162,141,121, 55,182, 52,183,112, 5, 18,245, 48,161, 72,
+244,114,219,160,206,221,179, 82,111, 70, 87,232,203, 87,219,205,165, 39,156, 22,178,217, 95, 57,246,123,204, 3, 2,161,144, 25,
+ 53,172, 55,223, 12,252,218,146,147,238,229,229, 53,113,221,186,117,237,250,246,237, 11, 0,176,219,237,234,221,187,119,123,191,
+255,254,251,138,132,132,132,230, 78,156,234,235,233,233,233, 47, 22,139,125, 1,192, 98,177,100,229,231,231,167, 3,104,242,135,
+191,194,171,157, 7, 8,222,251, 61, 42, 74, 0, 0, 3, 6, 12,252,192,255,254,217,174,124,145,210, 88,111,113, 88,202, 21, 37,
+183,126,157,119,246,220, 25, 6, 0,250,244,238,251,186,220, 35,244,211,123, 25,217,146,106,131,123,243,128,249,125, 6, 68, 76,
+154,242,232,116, 94,120, 71,127,140, 24, 62,244, 53, 35,112,192,169,107, 70, 32,144,157, 63,127,190, 61,143,199,227,219,237,118,
+ 83,159, 62,125,210, 91,146,175, 86, 65,125, 79, 51,224,181,182,218, 45,159,231, 39, 69,127, 0,220, 49,113, 12, 95,211,186,251,
+155,224, 11,158,229, 56, 46,163, 60, 61,186,223,191, 48,162,117,103, 57, 59,171,196, 19,136, 95,158,250,228, 11,157,230, 45,248,
+159,116,238,154,227,136, 92,255,122,193,223,213,100, 1, 0,159,199,247, 59,114,244,136, 86, 46,230, 3, 0,244, 38, 59, 30, 24,
+ 53,170,233, 55, 66,155, 94,191,241, 24, 38,184,122, 66, 27,214,110,149, 10,132, 98, 19, 83,105,144,192, 0,240,104,213,230,184,
+151,253,164,124,234, 35, 17, 1,219,119,253,156,153,158, 89,232,244, 67,141,225,139,208,103,224, 8, 68, 12, 31,169, 57,127,238,
+244,123,155, 55,110,120,195,110,181,109,224,108,220,106, 83,209,205,236, 38, 31,230,222, 29,123,136,149, 30,135, 39, 61,247,190,
+187,137,231,134,197, 75, 62,241,136, 58,180,227, 68, 86, 70, 87, 46, 45, 45,195, 68, 24,230, 90,113, 81,206,203, 21,185,183,110,
+ 56, 90,100, 74,165,178,157, 82,169,236,218,165, 75, 23,233,194,133, 11,133,131, 7, 15,254,195,178,207,156, 41,250,237,183,223,
+124, 86,174, 92, 57, 58, 54, 54,214,164,215,235, 47,235,245,250, 36, 56,209,208,222,219,219,115,246, 67, 15,142,195,208, 73, 47,
+130,229, 24,204,124, 97, 30,142, 28,218, 51, 11,192, 93, 49, 90, 54,185,250,253,103,159, 91,232,217,231,190,110,252,247,118,220,
+128, 76, 44,192,200,158,193,204,147,115, 22,185,108, 89,251,222, 23, 40,192,160,250, 34, 89,156,161,116, 81, 39, 15,203,163,227,
+251,182,197,254,157,150, 71, 49,236, 85,240,228,154, 15, 50,246,255, 47, 30, 0,218,141,154,163,146,176,249,235, 90,185,240,181,
+ 18, 54,127, 93,187, 81,115,142, 37, 29, 94, 87,222, 88, 94,132, 18, 73,192,206, 29, 59, 58,186,170, 68, 16,240, 24,240,249, 12,
+ 4,124, 30, 76, 22, 22, 15, 63,242,232, 93,187,204,101,218,142,163,121,192,147,149, 47,108,124,101,204, 75,252,201,153,115,194,
+240, 69,238, 7,247,255, 40,208,106, 36,224,243, 25,240,121, 0,159,199, 32, 85,103,196,211, 79, 63,169,105,169, 97,127,160,191,
+246,190, 87,166, 4,143,236,211,201,173,203,183,103, 24, 77,159, 7,166,184, 23,152,228, 79,236,218,247,235,163,100,192,188,115,
+132,112, 43, 50, 79,126,114,180, 49, 17,179,217,172, 27, 57,234, 1, 53, 35, 80,200,143,237,221, 58, 80,192, 99, 96, 99, 9,236,
+ 44, 1, 91, 53, 55, 42, 83,245, 11,134,199, 99, 64, 56,130,103,159,125, 26, 35, 71, 61, 96,224,236, 92,166,227, 15, 57,222,246,
+195,199, 78,121,154,109, 28, 86,174,219,242, 94, 69,105,254,123,201,241,238,169,250,210,130,121,198,188, 68,135,231,193,224,129,
+244,204, 72,138,123,110,199,193,179,232, 20, 22, 10,150,171,204,103,176,159, 2, 59, 34,207, 34, 36, 56,164, 50,223, 28,249, 63,
+123,103, 29, 29,197,245,183,241,103,214, 53,238, 9,193, 3,193, 18,220,221,139,107,209, 66,113, 90, 74,141, 34, 45, 45, 80,180,
+ 20,167, 64, 11,148, 82,160,184, 7, 11, 14,165,104,128,144, 0, 73,136, 19,223,216,186,239,220,247,143, 77, 40, 18,217, 0,125,
+251,107,123, 63,231,236,217,204,100,247,217, 59,115,103,238, 60,247,123, 13,181, 3,229,104,214,180, 25, 0,188,150,209,226,137,
+156,190,233,208,123,244,130, 62, 67,199,193,219,203, 11, 28, 98,233,115,238,196,111,125,126,217,248,253, 23, 86,131,106, 69,133,
+196,136,237,217,115,129,176,236, 27, 71,157,252,253,253,189,154, 53,251,115, 58, 70,171,213,138,106,213,170, 33, 61, 61, 61,248,
+117,234,105,126,126,126,189,231,205,155,231,221,171, 87, 47,190,175,175, 47, 0, 32, 43, 43, 43,224,244,233,211,141,231,205,155,
+151,147,153,153,121, 2,101,204,232, 99,179,112, 4, 28, 30,184, 98,177,212,126,140, 96, 56, 51,166,189, 23,234,227,231,111, 44,
+233,243, 10, 69,150,112,230,135, 23, 25, 30, 79, 80,244,121,112, 8, 97,153, 50,162, 68, 93,249,124,126,137, 45, 20,102,174,115,
+ 75,194,119,153,192,225,114,236, 23,171,213,162, 40, 72,189, 91,183, 2,145,184,250,124,161, 96,211,224, 97,227, 90, 15, 25,212,
+ 31,126, 94, 46, 56,247,123, 36,166, 76,251,204, 98, 53, 91, 86,189, 86,225,193,229,242,114,114,114,146,221,220,220,124,223,252,
+121,203, 84, 63,123,230,148,247,185,243, 23,102,175, 92,179,110,170,217,100,181,176,132, 60, 91,199, 88, 34, 17,241,187,245,121,
+215,217,187,102, 75,241,186,121, 19,248,255,194,136,214,230,183, 98,180,132, 18,167,119,191,158,249,145,120,225,174, 27, 56,177,
+ 97, 74,174, 78,149,235,245,172,166,224,236,122, 87,171, 42,108,252, 58, 41,148,123,213,110,197,112,121,147, 25, 46, 87,198,112,
+ 24, 33,107, 99,159, 90, 77,166, 69,250,188,184,204, 55, 61,122,150, 37, 56,248, 71, 78,197, 12, 16, 65,208,206,189,135,189,125,
+ 92, 69, 48,152,109, 24, 54, 98, 52,118,236,216,225,228,229, 34,132,193,100,197,247, 43, 87,170, 53,201, 39,188,147,159, 22,164,
+119,237,251, 89,120, 66, 82, 78, 84,106,166, 97, 95, 69,211,102, 52,219,160,210, 89,161, 51,114, 80,171,126, 51,124,191,170,142,
+ 56, 53, 37,241,179,237,191,108,157,254,240, 33,119, 7,203,229, 44, 48,100, 62,122, 90,226, 77,231,219,160,135,179,155,199,238,
+129,147, 23,187,198,229,240, 64, 96, 70,188,179, 24,239,142,157,238, 92,195, 87, 2,153,152,235,154,152,146,238, 55,227,139, 47,
+126, 79,176,145,230, 42, 69, 66, 98,121,233,169, 90,181,234,160, 62,125,250, 72, 63,255,252,115,126, 96, 96, 32,126,249,109,127,
+149,118, 61,134,246,205,200,204, 14, 36,132,192,199,219,251,233,196,247,135, 30, 63,121,242,100,202,211,167, 79,249,203,151, 47,
+111,113,248,240,225,122, 89, 89, 89, 14,215, 76,109,132,192, 96,180,193, 86,244,128, 84, 40,141, 21,246,167, 1, 1, 1,162,244,
+244,116,227,115, 81, 6,230,207, 64, 33,211,163, 75,135, 22,188,159, 78, 37, 65, 99,176, 65, 38,230, 35, 41, 91,135,166,141, 66,
+152, 45, 54,107,195,146, 4,199,191,219,123,174,143,156,244,236,215,170, 58,188,221,164,216,246,195, 98, 28,187,158,216, 51, 91,
+195, 96, 61,225, 78,246, 19,241,186,201,216,204,245, 29,155,214,244,237,220,164, 10,110, 55,173,233,123, 37, 34, 38, 86, 50,116,
+229, 71,233, 26,254,185,130,211,211,213, 37, 23, 60, 28,184, 59, 9,240,243,153, 20, 72,197, 60,200,196, 60,200, 68,246,119, 14,
+135,121,179, 90,173, 95,221, 64, 46,107, 27,207,229,242,198, 15,127,119,168,255,200,225, 67, 9,184, 28,236, 63,120,188,255,174,
+ 93, 59, 51, 45,102,211, 86, 27,135,251,115,105,215,207, 11, 39,148, 3,120,187, 8,241,197,214, 40, 56, 75,248,112,146,242,225,
+ 44,229,163,115,168, 23,184,175, 63, 9,140,219,148,254, 53,122, 77, 25, 88,181, 83,112,101,121,173,251,241,202,135,227, 23,221,
+ 89,115,169,176,211, 39, 63,172,174,231,161, 41, 52,241,190,153, 49,145,151,150,145,209,105,255,241,203,157,109,166,113, 49, 86,
+179,246, 75, 69,228,254, 18,163,194,105, 49,215, 27, 7,180, 28, 34, 54,107, 44, 15,238,199,164,213, 44, 48,138, 16,157,172,130,
+ 76,204,131,188,248,220,138,121,144,137,249,144,139,121,200, 72, 75, 66,190,150,251,123,186, 7,167, 19, 46, 95,183, 86, 36,225,
+ 6,179, 13,247, 18, 53,168, 26,220, 8,126,126,254, 48,245, 26, 85,245,230,133,131, 71,111, 93, 62,178, 84,151,245,248, 75, 71,
+117,126, 11,187,129,217,159, 78,142, 96,128,187, 69, 15,233,198,223, 44,219,208,228,219,217, 31,190,176,111,198,130,117, 77, 94,
+ 63,146,229, 52,183,243,192, 15, 22,180,235, 54, 16,234,252,108,252, 17,190, 15, 61,250, 12,198,168,113, 31,195,213,213,243,251,
+ 85,139,102,222,183, 26, 85, 23, 94, 41,115,125,235,180, 13,105, 80,119, 87,128,191,127, 32,203,218, 87,249, 32, 4,208,168,149,
+152,249,201, 68,176,132,160, 97,227,230,157,197,237,186, 17, 82,180, 26, 72,110, 94,174, 54,230,241,195,174,134,156,152,155, 14,
+159, 75,131,193,162, 80, 40,112,239,222, 61,196,198,198, 34, 58, 58, 26,121,121,121,112,113,113,209,104,181,218, 10, 5,239, 67,
+ 67, 67, 71, 94,184,112, 65,236,230,230,246,108,167,201,100,130,147,147, 19, 70,142, 28,201,239,222,189,123, 64,239,222,189,199,
+ 68, 69, 69,253, 6, 64, 85, 98,122,242,159,100, 56,249, 4,255,216,161, 99,135,169, 0, 32,113,246, 75, 92,255,203,241,232, 50,
+ 43,180, 46,254, 85, 90,183,110, 83, 19,132,128, 1, 89,171,203,139,205, 42, 35, 74, 36,187,113,227, 70, 13, 46,151,203,251,243,
+ 25,196, 98,227,182,189,117,206, 94,125, 48,104,217,247, 43,196,206, 50, 17, 20, 74, 19, 38,140, 26,232,240, 51, 88,226, 19,220,
+171,117,235,246, 71,191, 93,240, 53, 79, 46,147, 33,252,102, 2, 62,250,228, 11, 67,102,114,212, 10,194,242, 55,232, 20,177, 57,
+111,248,168, 36,120, 11,212,170, 36,135, 83,191, 30,226, 41,239,245, 19,155, 44, 54, 20,106, 45, 48,154,109,176,177, 4, 74,173,
+ 5, 15, 83,213,240,116,174,248, 82,110,132,144,102, 0,188, 0, 40, 24,134,185,253,252,118,113,133,174,216, 27,191,180,157, 91,
+244,124,240, 0, 96,130,125,164,254,179,203,167,104,187,180,253,197,223,127, 8,160,110,145,166, 13,192, 45,134, 97, 10, 74, 49,
+ 91,175, 68,185,120, 97, 97, 97,164, 79,159, 62,207, 74,252,151,183, 95, 70, 36,224,251,203, 92,188, 64,200, 35, 60,191,128,177,
+183,111, 64,222,138, 85,107,220,167,125, 48, 57, 69, 85,152, 95,165,104,247, 57, 71, 30, 22, 60,134,187,170, 67,155,150,221,167,
+126,240, 1,130,107, 84, 18,216,108, 54, 18, 21,155,104,217,254,243,182,177, 87,174, 11,215,168,210,162,230, 62, 23,130,172,208,
+176, 79, 27,107, 75,123, 57,130,101, 99,109, 47,215,110, 95,209,100, 24,192, 85, 46,196,143,167,146, 64, 8,192,128,192, 69,198,
+199,158, 75,105, 72,140, 56,164,234,211, 80,165, 29,185,108,126,231, 78,189,166, 95,120, 24,111,216,151,147, 99, 56, 3, 32,171,
+ 44,205,146, 11,116, 22, 70,179, 13, 22,171, 21, 7,142, 31, 71,207,206, 45,208,186,117, 11,180,111,215,154,119, 39, 34,114,220,
+ 7, 83, 39, 6,226,207,209, 29,207, 52,197, 62, 65,205,228, 46,158,251, 6, 77, 93,238,244, 32,205, 10, 30, 23,168,238, 43,129,
+187,147, 0, 38, 43,131,100,133,185,232,206,113,197, 71, 51,218, 68,194,144, 0, 0, 32, 0, 73, 68, 65, 84, 22,184,207,254,108,
+234, 73,149, 66,216, 0,120,100, 46,235,216,117, 58,157,112,244,232,209,124,139,197, 98, 30, 57,225,227,238, 89, 89,138,254, 27,
+215,126, 39,242,246,246,129,206, 96, 69, 68,244,147,186,223,126,187,160,250,241,211,151,142,204,255, 98,202,209,158, 61,123,186,
+236,221,187,151, 45,239,124,190, 80, 67,204,206,253, 97,219,174, 3, 59, 86,175, 88,130,152,148, 2,252,252,211, 6, 16,155,245,
+199,114, 78,213,243,154,100,244,232,209,146, 35, 71,142, 84, 74, 75, 75, 83,233,116, 58,197, 11,241, 8, 14,195,203,206,215,193,
+211, 73, 8, 1,143, 3, 31, 55, 49,188, 93, 68,224,115, 1, 14,195,216, 74,210,252,121,223,137, 69,172, 78,137, 99,187, 77,195,
+183,253,176, 24,227,166,125,133,168, 92,225,105,142,212,101,209,135,195, 7,205,246,146,216,122,250,187,114,188, 59, 55,169, 10,
+153, 88,128, 57,211, 71,163,121, 68,178,119,122, 33,251,149, 66,207,109,180,224,244,179,197,186,207,189, 24, 28,177, 71,176,156,
+164,124,156,222,245,125,142, 86,169, 80, 22, 55,201,153,140,134, 20, 7, 47,227,115, 37,212,108,103, 55, 10,169,191,120,234,164,
+241,156, 54,173,154, 19, 14,135,143, 92,181,137, 33, 4,248,228,163, 41,248,112,202, 68,223,167, 25, 57,223,108,216,240,227,220,
+ 11,103,201, 66,173,226,241,252,178, 52, 57,140, 61, 10, 36, 23,243, 32,151,216,141,139, 92,204,131,193,100, 3,195,128,235, 90,
+185,177,146,177, 71,114, 51,242, 83, 74,173,129,191,160,233, 94,185,254,249,179,137, 78,117, 10,246, 21, 92, 79,202,136, 94, 20,
+ 17,153,125, 11, 64,126, 96,123,215, 49,102, 43,129,198, 96, 69, 82,182, 14, 86, 51, 97,198,189, 83, 5,213,134, 48,193, 75,182,
+221,221,113, 42, 18,206,207, 21,250, 47,104,166,223, 56, 96,240,104, 48,112,216,234,117, 63,221, 94,177,248, 43,110,174,210, 4,
+150, 16,136,133, 92, 72,132,188,162, 23, 23,122,173, 18, 27, 54,109,201,178,130, 25,132,203,151,173, 21,185, 62,193,146, 81, 3,
+123,181,223,195, 0, 66,134, 35, 72,243,175, 82,181, 74,151,190, 99,197, 93,250,141,134,205,106,154, 29,113,149, 92,212,229,196,
+156,119, 68,179, 65,189,186, 96,128,187,218,156,216, 41, 0, 32,243,174,253, 99,157,224, 58, 77, 94,222, 23, 20, 20,220,196,145,
+124,127, 22, 41, 21, 59, 77,115,115,247,250, 42,184,126, 35,239,236, 2, 35,227,228, 81, 9, 73,113,247,176,123,211, 55, 59, 89,
+131,105,193,249, 19,251, 22,175,249,249,240,187, 93,122, 14,196,182,141,223,205,201,203,124,102,180,206, 61, 23,173, 26,181,125,
+235,230, 64,190, 80, 4,139,149,133,197, 70,236,239, 86, 27,242,243, 11, 96,177,178, 16, 75,157, 96,101, 25, 88,108, 44, 44, 86,
+ 22, 70,147, 85, 54,101,116,239, 15, 12,192,205,146,210, 25, 80,167,195, 25,129, 72, 84,133,192,190,118, 45, 33, 4, 73, 89,122,
+142,159,159,223,111, 0, 32, 18,137, 32, 18,137,192,178, 44, 34, 98, 20,211, 60,131,107, 79, 69,145,193,179,153, 77, 41,133,201,
+215,122,148,118,236,190,190,190,125, 95, 54, 89, 6,131, 1, 26,141, 6, 87,175,223,118,217,186,227, 64,207,164,148,180, 26, 44,
+113, 49, 58,121,215,232,161,206, 73,232, 91,218,249, 84,103,199,124,224,220,114, 34,231,243, 15,199, 4,173,219, 30,118,235,201,
+153, 69,101,246,211,170,214,101,150,233,243,201,131,155, 46, 91,251,115, 92,193,181, 31, 63, 45, 47,143,120, 60, 30, 95,161, 80,
+ 60,187,191,215,111,217,221,244,110, 76,250,128, 53,171,215,136, 35, 18,212,120,144,148,129, 49, 93, 43,219,107, 56, 14,228,187,
+204,167,134,103,245,154, 53,127,219,176,118, 25, 47, 46,195,128, 31, 14,221,194,133,163, 63, 94,205,202,185,217, 19,217,153,250,
+215, 41, 67,222,130,209, 42, 85,243, 98,100, 46, 52, 6, 43,140, 38, 43, 44, 44,129, 74,103, 65, 78,161, 9, 42,157, 25, 26,189,
+ 21, 99,186, 85, 46,241,123,229,248, 17, 47,134, 97,194, 8, 33,125, 8, 33, 93, 1, 8,139,183,237,207,108, 38,172,200,144,189,
+176, 61,123,246,236, 47,151, 46, 93, 26, 93,252,217,226,253,197,159, 45,107,255,115,223,247,152, 51,103, 78,131,101,203,150, 45,
+105,213,170,213,158, 63,254,248, 35, 17, 64,129,163,205,135,188,231, 15, 38, 44, 44,172,188, 19, 93,195,108, 49,139,156, 37,124,
+ 84,175, 86, 25,239,127,185,205,243,215,101,227,115,196, 66, 30,247,212,169, 83,238,121, 38, 57, 56, 28,174,195, 85, 20,185, 87,
+173,214, 2,129,240,196,202,149, 43, 49,188,111, 59, 73,106,174, 69, 19,153,170,207,214,154, 96,245,246,170, 45, 92,180,100,153,
+124,217,242,239, 63, 12, 59,198, 22,106,178, 31,126, 95,114, 19, 95,211, 59, 92,230,185, 62, 88, 12, 3,194,218,210, 10,146,111,
+ 55, 5,128, 55,233,139,165, 49, 88,192, 45,234, 91,195, 48,128,206, 96, 5,151,203,228, 20,198,236,123, 56,114,225,162,206, 59,
+247,156,205, 32, 28, 87,181, 86,155, 36,133,125,205,193, 10, 99, 48,217, 96,180,216, 16,125, 63, 2,237, 91,214, 67,235,166,117,
+160, 51,216,160, 51, 90, 81,173,102, 48, 0,120,150,152,113, 92, 78, 34,177, 89, 12,132,216,156,250, 52,243,130,183,171, 16,126,
+110, 34,136,132, 60, 88,172,128,222,196,194, 96,178, 33, 57, 71, 15,181, 94,130,144, 14, 67,171,123,248,221, 49,102, 37, 75,142,
+228,167,222, 25, 84,166, 57,181,217,176,253,183, 3, 65, 25, 25,217,253, 79, 30,217, 37, 82,168, 44,136, 76,214, 34,167,208, 8,
+112,189, 48,111,201, 15,162, 89,159, 78, 26,176,125,247,193,148, 46,237, 90,164, 84,244,152,117,138,152,157,251,246, 31,248,177,
+ 79,159, 1,146,232,155, 39, 17,119,239,252, 98,109, 78,133,250,103,113, 26, 54,108,104,157, 52,105,146,122,201,146, 37,129,199,
+142, 29,171,166, 80, 40,238, 1,176,184,186,186,214,169, 29, 84,229,126,248,233, 83, 1,189, 7, 12,229,167,229,234,225, 34, 21,
+160,138,183, 20,215,175,158,177, 8,133,252, 18,251,155, 20, 53, 15,142, 64,151,153, 56,118, 61,177,103,116,158,248,210,196,241,
+ 99, 82,194,175,196,228,173,223, 17,254, 93,128,220,114, 79,204, 42,214,223,105, 90,211,119,246, 71,163,177,116,221, 78, 92,142,
+136,201,209,114,252, 22,103, 26,173,103, 75, 15,165, 3, 60, 46, 3, 39, 9, 31, 90,149, 66, 25,127,247,116,237,183, 20,166, 30,
+ 19,126,100, 39, 39, 95,109,193,211, 92, 3,147,145,175,134,141, 37,112,149, 10, 96,101, 9, 10,243,115,153, 93, 59,119,224,246,
+237,235, 28,112, 57, 19, 0,204, 47,243,132, 50,246,166, 66,185,152,111,143, 8, 73,236,239, 22, 27,139,224,160,154,216,188,126,
+149,179,167,183, 15,218,182,119,188,111,180,147, 71,149,134,123,126, 89,143, 75,127,220,237,120,121,205, 15,205,228,254, 94,235,
+ 24,198,182, 2, 4, 6,163,217, 6,101, 97, 1,132,166,167,104, 30,160,128,187,212,134,100,149, 31,162,178,226,228,229, 21,248,
+121, 81,135,239, 49,100,192,220, 3,199, 47, 44,237,209,173, 35,162,146, 85,144, 8,121, 16, 11,185, 16, 11,185,224, 51, 54,172,
+218,244,163,165, 64,169,238,147, 23,125, 52,247, 53,174,207,115, 69,181, 95,187,185,179,105,188,118,174,155,251,235,196,153,203,
+123,244, 28, 56,150,137,186,125,241, 75, 29,112,222,177,138, 30,113,104, 31,203, 58,254,140, 19, 59,121,174,157, 62,107,209,244,
+238,125,134,130,203,229,193, 98,177,224,224,222,157,248,229,135,121,143, 77,154,188,177, 0, 88, 83, 14,119,210,190,157,155,134,
+206,252,102, 21,211,160, 97,243, 22, 23, 51, 95, 93,142,150,229, 50, 63,189, 55,126,242, 48, 31, 31, 31,167, 63, 35, 90, 4,181,
+131,235,161, 87,191,193, 56,115,244, 48, 30, 70, 71,130, 37,118,195,196,178, 4,133, 5,121, 89, 86,139,105,123,169, 45, 30, 98,
+113,149,109,191,236,168,197,225, 48, 48, 91, 88,152,172, 44, 62,253,224,125,211,148, 79,190,108,219,171,123,135,104, 33, 23,170,
+228,212, 76,215,235,119, 31,133,176,124,121,224,248, 25,171, 4, 6,163, 13, 74,157, 5, 39,127, 46,221,235,136,221, 42,183,170,
+218,164,215,248, 41, 95,111, 22,137,184, 28,115,253,218,129,137, 29, 90,214,127, 90,217,223, 83,253,237,178, 31,154,255,126,243,
+110,175,119, 71,142, 23,143,169,211,132,241,247,144, 56,189, 63,114, 96,168,205,106,126, 79,151,255,180,212,249, 5,249, 82,183,
+194,202,213,130,116,127, 70,140,106, 31, 98, 8,170,191,224, 60, 24, 36,234,179, 99, 7, 1,128,159,127,101, 3, 95,228,172,174,
+ 64, 4,134, 0,192,186, 45,187,155,222,143,205,152,184,122,245, 26,105, 68,130, 26,247, 18,148, 16, 9, 56, 48, 91, 88, 48, 14,
+ 6,181, 89,194,157,252,213,156,217,206, 5, 90, 27, 46, 69, 42, 16,125,231, 34, 49,105, 12, 35,165, 86,231, 65,240,118,122, 15,
+ 64, 77, 0,241, 12, 67,126,210,102,251, 30, 5, 46, 91, 43,122,221,179,172,189,190,236,236, 85,163,186,141, 39,234,197, 23,202,
+ 90, 49, 12,169,207, 16,184, 1, 36, 61,191,232,153,234,168, 83,211,102,199, 98,249,146,111,176,118,235, 97,100,228, 25,224, 98,
+123,138,163, 63, 47,194,231, 75,127,131,222, 88,122,175,134,242,252, 72, 73,198,232,101,195, 85,252,119,241,231,150, 46, 93,218,
+231,165,188,233, 83, 74,158,189,242,185,226,239, 47, 91,182,108,201,115,255,215, 57,106,178,158, 25,173,226,131, 42,199,108,213,
+246,242,171,242,199,209, 35,135,220, 10, 52,102,136, 5, 92, 84,174, 22,132,249,235,143,122,189,211,212, 19,185,102, 23,236,222,
+188, 34,223,160, 83,239,117,168,176,240, 14,110, 33,145,203, 78, 30, 58,120, 24, 53, 42,123, 11,118, 93,205, 79,186,155,168,127,
+ 22,234, 85, 41, 82,132,213,156,117,188, 65, 3, 7, 74,207, 95,184,248,137, 6, 40,209,104,113, 25,110,165, 45, 59, 14,122, 59,
+ 73,248, 96, 24, 64,173,183, 98,226,123,131,223,252, 49, 70, 88,238,248,177, 99,192, 20,153, 44, 85, 94, 22,190,156,245,129, 65,
+102,137,123,152,154,156,154,222,181,239,231,231, 85, 26,198, 48,108,244, 7,183, 31,198, 46, 45,208,233, 94,111,145, 31,163,201,
+ 6,163,153, 69, 66, 66, 60, 62, 29,211, 13,124, 46, 7, 92, 46,107,239, 44,109, 45,253, 98,212,100,196,230,195, 87, 48,100,231,
+202,105, 91,252,125,188, 61,228, 50, 9,145, 75, 69, 76,253, 58,181, 4, 45, 91,182, 22, 86, 11, 14, 21, 92,125,164, 71,170, 66,
+143,196, 12, 37, 68, 62,141,120,195, 59,191,131,157,107,102,116,204, 79,189,195,193,171,157, 20, 95,224,236,165, 27,125,183,110,
+ 90, 45,202, 46, 52,227,113,170, 6, 89, 5, 6,100, 22, 24,145,149,111,128, 92,194, 71,251,126,147, 68, 39,142,254,212,183, 75,
+187, 22,235, 94,231,184, 19, 19,147, 78, 36,167,103, 14, 13,109,220, 28, 59,127,253,165,157,171,107, 53,231,194,194, 36,149,163,
+185,179,104,209, 34,225,178,101,203,120,235,215,175, 87,181,108,217,210,119,206,156, 57, 61,114,114,114,110, 85,173, 90, 53,248,
+204,161,237, 23, 26,181,239,223, 12,172,217,171, 93,135, 78, 2, 17,203, 67,120, 88,152,121,223,222, 93,121,122,189,122, 74,153,
+134, 67,234,178, 40, 91,195,192, 43, 32, 32, 90, 46,180,117,227,113, 10, 99, 11, 78, 79,223, 81, 0, 28,170,209,243,163,115, 23,
+239,196,196, 54,141, 72,246,190, 16,241, 36, 39, 95,103,174,157,112,250,243, 50, 11, 94, 46,195,128,207,229,192, 73,194, 3,167,
+168, 84,149,251,135, 62, 1,195,120, 21, 71, 78, 25, 48, 69,239, 0,195, 32,163, 32,245,158, 3,125, 54, 24,194, 18, 32, 38, 77,
+ 11,141,193, 30,154,175,228, 41,133, 34, 59, 13, 27,215,109,199,221, 59,183,209,253,157,126,216,176,101, 23, 38,190, 55,212, 80,
+ 94,237,135,195, 41,138,104, 61, 23,205,146, 75,120, 0, 24, 20,106, 45, 56,248,251, 83,212,172,206,113,248,193, 0, 0, 78,114,
+ 41,148,106, 61, 56, 2, 39,196, 71,156,148,158,186,120,115,206,220,133,171,191, 40,200,140, 76,125,242,224, 42,130, 61,149,168,
+ 30, 96, 70,116,150, 51,238,228, 85, 67,112, 80, 13,112, 4,183, 29,210,206,141, 14, 89,126,148,115,176, 79,211, 70,245, 90, 85,
+241,118,133,222,100, 43,138,106,113,241,203,182, 29, 72, 78, 74, 27,159,247,240,232,221,183,225,104,181, 57,137, 10,145,119,208,
+135, 15,110,158, 79, 28, 56,242, 67,248, 5, 84,110, 88,152,122,207,225,110, 11,142,236,179, 57,104,180, 4, 82,215, 57,159,126,
+245,221,244,238,189,135,224,198,213,243,184, 23, 29,143, 22, 45,154,225,157, 1,195,161, 86,229,215,217,191, 99, 77, 55,171, 78,
+125,134, 39,178, 78,111,222,186, 51,195,218,108,136,123, 28, 21, 95,146,150, 62, 51,230,222,245,204, 24,231, 23,154,167, 60,235,
+ 52,148,187,184,223, 51,154,109, 72, 79, 79,195,181, 63, 46, 53,214,103,198,220,171,200,249, 18, 9,184, 8,191,155, 3,179,133,
+133,217,202,162,125,135,110, 38, 1,199,216,110,241,234,109, 45, 51, 51, 50, 57, 50,103, 79,214, 61,160,174,192, 79,100, 54,222,
+ 79, 80, 10,204, 22, 22, 53,252,101,101,106,122,249, 7, 45,153, 49,227,211,186, 92,129, 4,106,173,209,148,153,145,238,187,121,
+247, 69,205,163,199, 15, 2, 42,121,187, 56,127,183,230, 39,129,202,192, 32, 71,105, 68,190, 90,197,140,156, 60,211,127,235, 15,
+ 75, 71,149,101,180, 74,232, 46, 82,253, 68,248,213, 58,110, 78, 2, 70, 99,176,178,121, 42,179,109,228,128, 55, 27,116, 89,100,
+178, 38,173, 94,181, 70,122, 55, 65,141,251, 9, 74,136, 5, 92, 8, 5, 28,152, 44, 44, 28,188,157, 56,190,222,190, 83, 90, 55,
+ 13,193,153,123,185,224,114, 57,208,171, 11,116, 60,228,197, 54,237,216, 93,218,164,121, 75,116,234,216, 1, 79, 98, 99, 42,135,
+ 29, 59,216,229,250,181,203, 89, 86,115,237,105, 90, 69,236,225, 10, 5, 22,116, 58,174, 69,232,251,190, 95, 64,213, 54,131,134,
+191,239, 82,165,114, 0,227,237,233, 1, 43,225, 97,210,123,131, 29,190,243,237,198, 28, 88,182,112, 14,140, 70, 19,188, 92,133,
+ 32, 4,216,182,110, 62, 76, 38, 19,252, 61, 68, 80,106, 75, 95, 77,174, 60, 63, 82, 90, 20,170, 66,125, 79,158, 51, 99,101,237,
+103, 24, 38,108,246,236,217, 95, 2, 32,179,103,207,254,178,120,123,233,210,165,122, 0, 25,229, 52, 29,110,126,193,104, 21, 31,
+ 92,233,119,183, 32,216,211,195,239,122,248,153,211, 46, 71,238,179,184,113,248, 14,122,183,240,131,128,199,129,212,197, 31,247,
+147,148, 56,113,104, 83,225,209, 61, 63,165, 27,141,198,239,203,111,107, 14,106, 42,151,202,206,252,186,115, 47,235,233,225,193,
+217, 24,174, 72,200, 83, 91,159, 53,105,197,222, 60,198,222, 57,179,217,143,128, 57, 45, 22,139,131, 76, 38,147, 91,121, 25,187,
+ 45, 60,165,168, 19, 47,243, 54,202, 86, 48, 92,174,109,231,174,157,240,116, 22,194,104, 97, 49,251,139,143,245, 99,186,203, 11,
+ 71,190, 59,188,115,167, 94,211, 47,240,101,181,206,183,110, 92,139, 52,106,212,168,144,203,229, 58,212,149,194,219,219,123, 62,
+135,195, 25, 33, 20, 10,157, 76, 38,147,218,196, 26,164, 90,131, 9, 6, 51,160,211, 25,192, 23,216,205, 34,159,203, 64,111, 48,
+ 65,167, 55,149,125, 99,100, 69,253, 14,160,182,234,185,152,210,249, 71, 53,132,191,237, 63,250,241,144,119,135,205, 13,104, 56,
+ 64,158,148,169,132,128, 49,163, 89, 93, 63, 92, 60,125,152,164, 37,199,126, 90,158,201, 2,128, 28, 69,126,160,151,151, 15,238,
+ 38,106,144,158,167, 71, 86,145,201,202, 44, 48, 66,173, 87, 35,180,138, 63, 10,149,202,192,215, 62,191,192,225, 51,103,206, 12,
+237,213,127, 24,166,127,177,160,237,207,155, 86, 68,202,132,252,113,218,236,184, 75,142, 24,173,168,168,168,252, 89,179,102,213,
+220,178,101, 11,103,212,168, 81,250,144,144, 16,241,232,209,163,219,238,216,177, 67, 44,149,138,245,247,175, 30,155, 59,225,163,
+217,253, 55,175, 93,212,176,160,160,128,177, 90, 44,167,204, 5, 5,179, 53,229,152,185,167,199,190,124, 60, 47,193, 60,182, 91,
+ 59,175, 99,238, 82, 78,125, 17, 49, 13, 71,221,249,123,241,104,190, 57,225,244,122,181,100,232,202,143, 50, 10,217,175, 12, 28,
+239,197,229,153, 44, 0,224,112, 25,152,172, 54, 56, 73,248,224,112, 56,197, 38,222,239,151,189,167,164, 94, 46, 66,240,185, 28,
+240,184, 12, 84, 58, 11,114, 85,102,124,248,190,163, 51,132, 16,214,106, 35,208,155,172,208, 21,213, 14,213,170, 92,204,249,226,
+ 51,188,211,119, 32, 38, 76,249, 12, 5,122,224, 78,162, 26,102,139,165,220,155,130,195,112,160, 51, 90, 49,174,123, 21,228,107,
+204,208,234,173, 48, 89, 89, 72,133, 60,240,121, 28,200,196, 60, 56, 75,249, 0, 33,130,226,194,132,207,231, 27, 44, 22,203,206,
+ 50,106,244,168, 22,232, 3,189,133,131,230,195, 86,160,107,171,218,136,254,253, 32,239,242,141, 7,213, 63,249,226, 43,124, 60,
+177, 47, 14, 60,174, 9,119,239, 42,144,203, 36,176, 16, 14, 0,226, 96,135,189,249, 44,199, 60,112,196,143, 91,182,197,124,251,
+205,108,113,161,150,129, 72,192,197,133,243,231,112,253,230,157,181,185, 15,143,238,196, 91,132, 79, 56, 62,206,206,206, 16, 11,
+185, 48,153,141, 38,199,187, 46, 16, 16,160,177,204,187,246,143, 69, 53,254,198, 54, 22, 37,236, 43,223,104,241,196,206,179,167,
+125,241,237,146,238,189,135, 32, 60,236, 0,246, 31,216,107,107,213,115, 60,119,215, 47,155,208,182,107, 63,180,237, 62, 12,167,
+ 14,239,248, 76,203, 50,245, 38, 77,159,187,176,125,231, 94, 8, 63,113, 0,217, 89,105, 43, 29, 77, 47,151,207, 76,239,220,173,
+ 47, 12, 38, 27,218,117,233,131,211,199, 15,127,132,162, 65, 22,142, 63,196, 94, 42,159,193,177,126,246,233,116,126, 78,161,137,
+175, 80,153,144,166,208, 33, 41, 91,135,163,123,126, 38,142,151, 23,166,102,237, 67, 43,241, 39, 45,191,240, 52,176,146,159,145,
+111,212, 75, 98,227, 19,234, 76,120,127, 12,191,122, 80, 29, 78,142,210, 8,133,210,136, 92,165, 17, 26,131, 21, 65,149,106,113,
+ 44, 86,166, 85, 69,243,217,211, 69,200,223,112, 60, 17,206, 50, 62, 90,215,121,253,129,182, 44,203,254,105,178, 86,219, 77, 86,
+100,162, 18, 34, 1, 23, 34, 1, 7, 34, 1, 23, 86, 27,113,168,226, 34,241,174,221,235,195,105, 31,248,155,172, 64,158,210, 4,
+ 30,151,129,183,167,155,172, 89,195, 17,216,182,226, 35, 0,192,196, 89, 27, 49, 97,220,104,212,173, 31,130,194,130, 2,223, 17,
+ 67,122,173, 6,112,216,209,180,158, 12,191, 84, 57,252,202,221, 89, 31,206,152, 39,127,183,111, 39,238,189, 4, 37, 50,243,141,
+136,143, 85, 87, 40,242, 6, 0, 86, 27, 11, 2,130,237,123,195, 32, 17,242,160, 80,154, 65, 8,193,162,245,251,224, 36,225, 35,
+179,192,222,220, 95, 22,101,250,145, 50, 34, 82, 21,136, 54,246,129,189, 47,151,151,163, 17,173,165, 75,151, 70, 47, 93,186,180,
+196, 8,217,115, 38,235,245, 22,149, 22, 8,100,117,156, 61, 60,111,132,159, 62,233,116,248,190, 13, 23,239,231, 97, 72,187, 74,
+208,228,167,226,251, 47,222,205,103, 64, 76, 28, 46,183,208,168,215, 29,210,235,181,139, 1,152,203,188,104,124,107, 55,150,137,
+229,231, 54,108,254,213,234,233,237,141,157, 87,243,211, 10,180, 86,203,159,205, 86, 22,230,206,153,205,213,173,172,165,167, 33,
+251,201,237,242,106,226, 44,129, 96,233,166,163, 0, 8, 88,150, 5, 97, 89,240,197,114,153,103,141,150,217, 69, 5,157,152,199,
+ 97, 12,207,151, 0,132,181,166,229, 38,150, 29, 6,101, 0,184, 72,249,216,123, 57, 29, 0,178,185,234,136, 71, 35,223,181, 55,
+ 23, 26, 76, 98, 85,253,154, 53, 73,179,102,205, 10, 37, 18,135,166,191,226,250,248,248,220,154, 59,119,110,157, 9, 19, 38,136,
+132, 66, 33,172, 86,171,251, 79,155, 55,179,155, 23, 79,196,160,143, 54, 64, 32, 20, 65,111, 48,131,207,231,161, 64,169, 65,161,
+ 74, 7,181,206, 82,241, 43, 40, 33,193,164, 0,150, 31, 57, 44, 28,216, 67, 30,218, 92,200, 17,160, 73,176, 31, 46,158, 57, 66,
+110,156,222, 54, 81,159, 19,251,171,131, 23, 34, 52, 6, 11, 50,242, 12, 72,207, 51, 32,171,192,128,172,124, 35,178, 10, 12, 96,
+ 24, 6, 6,147,245,141, 30, 92,218,156,152,253, 59,127,221,218,207,104,198,240,246,221, 7,226,179,121, 27,170,236,252,113,217,
+185, 68,194,105,227, 96, 71, 91, 91,116,116,116,242,251,239,191,223,112,247,238,221,220, 6, 13, 26,232, 31, 61,122, 36, 45, 50,
+145,102,185, 92, 42,249,249,135,165,103,154, 55,111,190, 39, 61,246,241,133,162,246,244,114, 11,246, 42, 29,198,138, 36,230,187,
+147, 42,203, 90,247,168,225, 43, 69,101,153,186, 71, 29,249,253,239,243, 58,127,188, 68,113, 97,109, 78,166,209,122, 86,161,231,
+ 54, 74,215,240, 29,234,131,103, 49, 26, 82, 6, 13, 25, 14, 46,195,129,217,160, 75, 41,190,184,188, 93,132,152,191,235, 49,228,
+ 98, 62,156, 36, 60,200, 37,124,180,173,231,142, 10,148,103,196, 98, 99,161, 51,218,160, 55, 90, 97, 48, 89,225, 25,232,134, 45,
+ 59,247, 35, 53, 71,143,163,183,115, 17,147,162, 70,173, 74, 50, 16, 82,126, 49,201,218, 44,218,190,131, 71, 57,113, 57, 12,184,
+ 28,134, 83,175, 78,109,228,107,204, 16,240, 56, 16,136, 37,144,137,120,112,150,240, 33, 16,240,145,147,147, 3,163,209,136,202,
+149, 43,139,203,182,130, 4, 78,114, 9,106, 85,247,135,217, 98,197,201, 43, 15,177,248,211, 65,232,214,190, 41, 24,190, 28,143,
+141,141,225,228,238, 4,150,195,129,217,202,194,100,182, 1,224, 24, 74,211, 11, 12, 12,236, 44,147,201,100, 58,157, 78,157,154,
+154,122, 41, 43,230,112,170,141,219,127,210,233,240, 11, 59,251,188,211, 13,119, 35,163,113,224,240,177,171,185, 30,202, 25,197,
+223,169, 95,191,126, 75, 79, 79, 79,121, 94, 94,158, 42, 42, 42,234,214,235,214, 11, 8,135,243, 73,171,182, 29,161, 41,204, 65,
+246,211, 36,135,107,209,117,171, 56,225,235,165, 27,154, 4,215, 14,110, 98, 35,118,227, 85,175,178, 19, 62,159,183,174, 73,205,
+ 90,181,155, 20, 15, 8,169, 91,185,236,105,217,120, 82,167,238,239, 77,248,108,105,191, 33, 99,113, 33,252, 24, 86, 45,254, 98,
+167,204,197,171,174,187,155, 75,163, 6, 45,187,227,234,185, 99, 16, 59,249,194,205,195,183,237,168,113,211,186, 14, 25, 53, 25,
+215,175,158,195,218,101, 95,238,176, 25,213,191, 57,146, 86,153,119,117,175,134,141,155,143,116,114,247, 65,161, 82, 13, 39, 55,
+111,212, 13,109, 54,242,225,125,227, 44,109, 78,162,226,181, 77, 7, 33, 48,154, 9, 10, 52,102, 60, 85,232,145,156,101, 55, 90,
+ 44, 91,129, 62, 65, 54,150,145,139,121, 60,119,203,147,202, 15,206, 93, 32, 85, 2,125,152,229, 11,191,224,154, 33,134,162,208,
+110,178, 20, 42, 19, 20, 74, 19, 52, 6, 11,220,101, 60,176, 54,182,194,181,238, 2,141, 25, 78, 82, 62, 92,164, 2,135,163,140,
+ 37,177,233,151,189,193,247, 99, 51, 6,172, 90,181, 70,122, 47,241, 57,147,197,183, 71,179, 68, 2, 46,108, 44, 11, 56,112,199,
+243,121,252,233,253,123,117,197,211, 92,189,125,212, 50,135, 65,173,144,230,240,148,176,232, 50,108, 54, 0,160,111, 47,123,215,
+182,196, 76, 45,142,223, 80, 0, 47,118,236, 46,187, 44,214,235,185,155,119,157,248,100,255,190, 61, 46, 6, 27, 15, 63,157, 74,
+134,206,104,133, 88,192,133, 72,192,133, 68,192,125,161, 63,118,249, 70,203,222,231, 46, 53,215, 2,157,193, 0,149,222, 2, 2,
+224,214, 19, 13,244, 38, 43,148, 90, 11, 90,214,113,123,179, 64, 8,195,156, 32,132,244,126,217, 16,189,108,150,158,139, 72,149,
+164,113,251,121,141,226,207,151,102,228,158,239,179, 5,160, 66, 35,184,120, 47, 59,199,231,183, 5, 50,183,186, 46, 78, 46, 55,
+ 78,159, 10,147, 31,190,207,226, 82,164,221,100, 89,244,185, 88, 57,107, 68,154,170, 48,183, 19,128, 4, 71,127, 76,234, 89, 55,
+ 84, 44, 20, 93,248,110,205, 79,102,111,159, 0,246,208,141,194, 28,165,206,246,130,155,176, 25,141, 28,194, 18,129, 33,251,137,
+ 67,109, 8, 28, 14, 99,158,247,209, 64,176,132, 96,254,154,253, 88, 50, 99, 24,228,146, 81, 82,134, 97,164, 90,131, 21,159, 46,
+216,138,149, 95,143,119,146,138,120, 96, 24,123,159,168,247,134, 15,116,236, 2, 52, 88, 17,127,115,183, 70,157, 24,246,232,249,
+230,194, 22,109,223,185,211,162, 69,139, 66, 55, 55, 55, 72, 36,146, 63, 35, 21,165,224,227,227,243,245,188,121,243,130,167, 76,
+153,242,108,178, 79, 30,143,135, 15, 63,248,128, 99,179, 17,156, 58,181, 13, 94, 85, 27,227,216,217, 27,232,217,185, 25, 52, 58,
+ 3,242, 11,213, 96,193,125,237, 11, 81, 93,152,123, 33, 43,249, 65,243, 54,157,250,226,210,153, 35,228,198,169,159, 39, 86,100,
+142, 30, 55,119,183,167, 17, 15,226,235, 50,140,187, 61,162, 85,100,178, 76, 22, 22, 85,124,164,120,154, 28, 15, 87, 23,151,167,
+142,234, 73,188,130,251, 51, 28, 50,133, 1,217,166,205,142,219, 15,128,104, 51, 31,141,216,255,219,230,200,232,168,123,139,251,
+140,156,206,235, 62,228, 3,238,143, 75,167,125, 9,192,209,137,247,204, 49, 49, 49, 15,199,143, 31,223,250,250,245,235, 54, 0,
+ 58,134, 97, 44, 92, 46, 87,106, 50,153, 4,157, 58,117, 82, 62,126,252,248, 50, 74,238,180,248, 2,109,223,223,239,201,136,212,
+239, 8, 89,243,136, 42, 78,234,110,157,218,181, 66,171,250,129,120,218,174, 21, 0, 76, 79,209,200,131, 13, 53,183,238,181, 88,
+ 37, 39,127,252,229,248,146,137,195,186,126,186,147, 55,127, 85,102,216,252, 50, 59,162, 62,125,116,185, 71, 73, 54,158,199,229,
+192, 73,194,135, 92,194,131,147,132, 15, 39, 49, 31, 22, 43,169, 72,205,145, 88,172,172, 61,162,101,178, 66,163,183,226,194,189,
+108,100, 41, 77, 40, 84,155,161, 55,219, 64, 64,236,181, 81, 7, 74,115,197,147,107,174,197, 79, 82,215,202,141,149,155,215,175,
+112, 62,248,123,218,179, 17,125, 46, 82, 33,156,164,246,209,216, 87,174, 92,129,135, 71,249,181,125,150,101,113,224,244, 45,172,
+218,126, 1,167,183,205,132, 88,192, 69,104,255, 5, 24, 59,160, 5, 88,194, 34, 62, 38, 58,187, 86,189,134, 62, 28,142, 4, 28,
+134,129,209,194, 2, 32,165,158, 79,147,201,228,145,154,154,170, 10, 10, 10,242,245,247,247, 31,194,229,114, 9,212,247,140, 71,
+246,228,235,206,135,253, 38,213,234,141, 54,169, 85,185, 45, 40, 83,223, 27, 65, 65, 96, 24,134, 56, 59, 59, 11, 46, 92,184,160,
+ 9, 9, 9,241,122,205, 91,137, 35,241,174,189,118,194,212, 79,134,212,172, 81, 3,251,127,219, 6, 66,152,131,142,126,121,215,
+241,235, 88, 56,231,197, 17,134,159,207, 91,215,100,229,130,233, 47,236,155, 58,103, 85,153,163, 14, 37, 34,249,140, 65, 35, 38,
+225,206,173, 63,240,253,130,207,247, 24, 53,249, 99, 45, 86,203,208,252,204,196, 61,213,235,181, 0, 49,171, 17,190,111, 5,134,
+141,158, 40,234,222,103, 8,174, 95, 61,135, 37, 95, 78,221,165, 43,204,121, 31, 14,118,114,102, 9,127, 74,167, 30, 3,248,122,
+163, 25,235,150,127,131,201, 51, 22,163,101,231,190,252,168,123, 55,166, 0,248,214,225,238, 16,102, 27, 58,133,120,218,205,179,
+133,197,177, 68, 46,175,164, 43,144,199,101, 56,141,106,184, 66,111,178, 66, 85, 78,165,146, 39,224,103, 21, 42, 85, 85,127, 88,
+242, 9, 87,107,176, 66,161, 52, 33, 71,105, 68,110,225,159, 6, 43, 87,105,132, 66,105, 2,159,199, 32, 54, 33, 5, 28, 62,175,
+194,253,243, 10, 52, 22, 52,175,237,102,191, 71, 95,179,117,196,194,115,110,113,250,242,253, 65,171, 86,173, 22,223, 79, 82, 35,
+ 50, 81, 85, 20,201,226, 66,196,231, 64, 88,244,183,141,181,247,141, 44, 11,103,175, 26,213,199,188, 55,170,139,179, 92,130,140,
+184, 28,240,184,246, 41, 98, 92,188, 3,225, 34, 50, 96,218,212, 73,240,244,112, 69,106,174, 17,107, 15,199, 34,242,225, 19,176,
+250,138, 29,246,186,159,246,244,156,240,225,231,174, 28,190, 16, 59,206, 36,217,211,201,181,225,241,141,227,134,140,248, 7, 90,
+141, 42,143,128,216, 28,236,131,204, 16,171,205,126,185, 45,153, 63, 27,123,182,111,196,153,136,156,103, 87,224,239, 7, 87,226,
+147, 57,139,144,171, 50,161,164,235,178, 44, 63, 2, 64,241, 92, 36,234,149,237,231,204, 81, 73,219, 76,209,182,169, 20, 13,211,
+ 75,230,202,244,210,126,211, 75,122, 37,205,253,183,185,220,166,195, 87, 76,145,171, 87, 3,169, 88,246,199,169, 83,199,101, 71,
+ 34,201, 51,147,101,214,229,146,197,211,251,166,169, 10, 21,221, 43,100,178,188,106, 53, 16, 73, 69,151,231, 46, 90,107,244, 9,
+168,106, 61,121, 79,149,167, 54,216,172,175,246, 65,144,217,100, 46, 94, 6,158, 80,180,138,175, 55,125,147,155,251, 72, 91, 94,
+228,137, 37, 4, 97, 55,179, 64,136,189,138,180,239, 74, 58,138,106,230,176,177,246,102,149,179,247,114,192, 43,234,135,226,104,
+248,123,211, 79, 27, 85,189, 67,148,218,145, 75,230, 63,107, 46,108,217,208, 30,201,114,118,118,134,171,171, 43,228,114, 57,202,
+107, 58,100, 24,230,189, 9, 19, 38,188, 82,251,207,201,201, 65,215, 46,157,176,126,227, 22, 52,236, 50, 6,103,175,157,129,217,
+194, 34,180, 94, 13, 84,245,119,195,211,108,245,107,221,232, 50,159,224, 15,155,119, 26,240,101,219,206,125,113,225,244, 33,114,
+227,244, 47,147, 42, 58, 17, 98,239,174,173,143, 47, 92, 56,191,250,220,197, 63,136,156,196, 60, 60,210,152,192, 97, 24, 84,241,
+145,194, 67,198,193,165, 35, 59, 12,195,250,182,118,120,114,188,192,192,128,157, 43,215,111,150,173, 92,182,160,211,157, 8,230,
+130, 38, 35, 54, 31, 0,116,217, 49,203, 31, 3, 15, 43,253, 17,126,178, 97,135,129,240,241,175,209, 45, 49,251,177,195,102, 3,
+128, 46, 33, 33, 33,113,238,220,185,193,203,150, 45, 35, 92, 46,151, 5, 32, 90,179,102,141, 46, 46, 46,238, 30,236, 67,115, 81,
+222,195,166, 75,183,250,159,202,133,182,150,238, 82, 78,253, 26,190, 82,180,170,111,111, 21, 29,214,187, 45, 2, 43, 87, 70, 66,
+150,174, 81,190,142,229,107, 76,220, 26, 27,126,138,188, 93,205,147, 59,209,170, 55, 61, 4,112,180,162,249,195,224,207, 14,242,
+197,209, 44, 39, 9, 31,172,253, 90,169,144,209, 50,154,109,208, 27,109,208,155,172,208,154,108,208,153,108, 96,137,253,158, 96,
+ 24, 6,102, 43, 11,135,170,205, 47, 93,251,206,238,158,168, 81,141,129,179,212,158, 54,231,162,233, 30, 24, 0, 30, 30, 30,240,
+246,246,118, 40, 42,106, 50,219,111,113,147,133,125,214,172,111, 50, 91, 65, 8, 65,108,108,204,204,228,196,196,254, 65,181,130,
+218,215, 11,109,232, 46, 21,113, 0,160, 84,163,165,211,233,108, 78, 78, 78,222,238,238,238,156,244,244,244,103,230, 57,168, 81,
+ 39,235,225, 67, 7, 49,104,208, 64,205,163, 91,247,159, 13,113,215,235,245, 76,155, 54,109,156, 3, 3, 3, 57, 70,163, 81, 85,
+209,108,146,121,213, 30,224,230,225,190,248,189,247, 39,215,238,212,181, 39, 46,158, 15,199,209, 67,187,127,213, 41, 98,195, 29,
+ 21, 9, 14,174,243,202,168,195,154,181,106,191, 50,234,176,106,245, 90,101, 26,173,122,161,205, 90, 16,134,135, 51, 97,251,136,
+129, 99,158, 10,128,181, 25,212,251,246,110,250,250,219, 17, 83,230,212,236,213,111, 4,222, 27, 61, 22, 60, 30, 23,151,206, 30,
+199,202, 5,159,157,208, 40,115,198, 56,210, 77,192, 30,122,171, 43, 8,144, 4,126, 92,185,102, 3, 68,220,184,138,248,216,168,
+232,251,183,175,215, 15, 10,105, 9, 47,255, 42, 31,167,120,114,151,225,209, 35,115,121, 50, 38,131, 33,101,236,152,209,120,126,
+212, 97,171,198,193, 30,204,203, 55, 0, 0,157, 58,199,252,243,138, 79,227,138, 71, 29,178,102, 83, 74,105,186,202, 2,197,129,
+ 75,215,110,206,232,223,187, 39, 39, 87,101,178, 71,176,148,166,162,151, 17,185,197,127,171,140,168,229, 47, 71, 76,116, 4,107,
+ 80,230, 30,172,224,125,105, 24, 59,180,199,195,226,107,151,101, 9, 24,192, 80,225,102, 41,190,243,164,229,223,175, 18,223, 79,
+212, 32, 50, 73,101,111, 42,228,115,237, 6,139,207,121,102,186,236,163,217,203,137, 14, 49,220, 37,227,198, 12, 71,174,202, 12,
+150, 5,120, 92, 78,209, 75,128, 84, 53,131,167,106, 29,114, 11, 20, 72, 76, 78, 65, 97, 86, 60, 56, 28, 14, 60,253,107, 59, 60,
+147,180,141, 8,253,116, 38, 18, 50,164,119,123,222,161, 63, 50, 33, 21,241, 96, 84,103,227,212,222, 21, 10,163, 70,181, 88,175,
+211, 28,114,100, 62,199, 63,187, 32, 48, 10,149,198,224, 35,226,115,177,127,251, 15, 24, 58,118,234, 11,165,239,204,175, 22, 2,
+ 28, 6,249, 5,106, 48, 12,163,168, 88,185,196,220, 46,107,251, 53, 35, 99,111,172, 81,130,217,122,181,162, 80,122,109,148,156,
+ 10, 63,125, 92,246,123,178, 8,183, 98, 50,139, 76,150,130, 93,244, 81,239, 52,181, 50,191, 7,128,216,138,213, 11, 57, 61,134,
+141,155, 17, 93,163,118, 61,227,197, 40, 77, 82,161,214, 82,106, 63,135, 86, 67,230, 70,223, 57,177,190,151,210,146,240,129,204,
+175,158,141,181, 90,151,235, 21,177, 11, 74,105, 58, 20, 46, 88,187,255, 89,179,225,172,101, 59,236,127,219,108,176, 17, 22,132,
+ 5,166,125,189, 9, 86,214, 6,214,102, 3,107, 35,176,216,136,180,188,228,122,251, 87, 61, 84,240,120, 95,157,145,223,190,218,
+ 92,232,234,234, 10, 15, 15, 15,120,120,120,192,217,217,185, 92,163,197,231,243,229, 60,222,139,167, 58, 37, 37, 5,201,201,201,
+112,118,118, 6, 97, 45, 48, 89,128, 6, 45,187,227, 65,124, 20,206,253,126, 15,132,181, 65, 38,175,248, 42, 47, 50,159,224, 15,
+154,117,236,255, 67,231,126,227,113,246,208, 79,228,246,149,227,147,245, 57,177, 91, 29,142,208,219,108,140,197, 98, 65,239,238,
+ 29, 83,238, 70, 63, 57,253,213,140, 41, 61, 91,247,153, 44,106, 21, 28, 0,131,201,134,180,228,120, 92, 58,242,139,161,118,117,
+191, 51, 93,218,181, 72,177, 88, 44,176,217,108,229, 62,200, 13, 38,115, 46,151, 47,145, 13, 31, 62,146,127,251,214,173,131, 50,
+175, 90,251,109, 12,231, 62, 67,216, 80,134,144, 65,161,161,117, 97,182,176,208,233, 84, 5, 21, 61,102,181, 90,157,184,109,219,
+182,234, 99,198,140,145,214,171, 87,143, 31, 31, 31,143,149, 43, 87,230,169,213,234, 68, 71, 53,194,175,196,172,225, 49, 5,113,
+197, 17,173,212,182,173, 48,188, 79, 91,236, 57,241, 59, 46, 93,189,142, 20,141,252,158,198,202, 59,242, 52, 37,195, 88,223, 93,
+117,176, 95,171,170,220,253,219, 11, 14, 70,119,156,253, 46, 33,162,240,220,203,243,181,142,223,220,128, 90,111,129,179,212, 62,
+223, 83,113,100,139,203, 48, 14, 59, 34, 6, 72,188,122, 61,162, 65,211, 90,245,112, 55, 81,137,156, 66, 35,244, 70, 43, 88,150,
+128, 5,129,135,147, 16, 98, 1, 7,169,201,137, 96,137, 57,169,130,143, 10, 69,135,246, 29,120, 0, 3,134, 33, 60, 62,143, 7,
+ 2,251,252,138, 18,137, 68,227,237,237,237, 80, 68,203,108,181, 98, 80,207, 22,104,217, 44, 20,253, 39,219,231,204, 60,255,235,
+108,184,201,249,216,179,115, 43,158, 94, 89,179,179,122,171, 41,225, 81, 15,162, 7, 71,223,253, 99,228, 59, 77, 36,141,124,121,
+ 25,130,210,194,164, 90,173,246, 32, 0,161, 64, 32,232,217,190,125,123,247,131, 7, 15, 22,122,122,122,178, 66,129, 64,209,175,
+111, 31,150, 47, 16,228, 23,127,246,218,181,107,252,201,147, 39, 59, 21, 20, 20,164,102,103,103, 95, 7, 96, 41,187, 34, 24,220,
+ 21, 28,236, 6,195,136,229, 18,105, 74,181,106, 53,252,155,181,108,225, 50, 96,208, 80,136,132, 34,156, 13, 63,141,117,171,151,
+237,211,100, 62, 26, 87,145, 51,249,182, 70, 29,166,165, 38, 37,234,244,198,144, 6, 77, 59, 50, 87,195,143, 76, 55,195,115, 53,
+ 87,100, 94,209,117,208,212,154,137, 25, 26,172, 91, 58, 19,110, 46, 50, 36,197, 63,214,199, 61,122,176,201, 98, 80,205,116,216,
+100, 1,144,230,217, 6,183, 26,221,211,205,104,182,225,202,133, 19, 6,214,202,246,188,126,249,100,124,165,218,205,196, 13,154,
+117,113,203, 61,186,117,144, 14,216, 83,158, 78,250,227, 87, 35,184,196, 84,152,116,254,194, 57, 23,159, 42,245,185, 12, 24,152,
+141, 6, 40, 18,110, 91,117,217,143, 85,170,244, 40,135, 70,225,230, 61,197,215,115,230,125,247, 65,179,166, 77,101, 4,226, 23,
+ 34, 88,197, 6, 43, 87,101,130,167,147, 16,122,149, 2,113,183, 79, 27,116, 10,110,153,243,157, 89, 77, 90,105,110, 78,182,240,
+207,238, 12,177, 45,203,250,124,110, 78,182,208,106,210, 74,203,127,212,113,225, 44, 19,226, 65, 82,250,179,142,239, 34,190,189,
+111,150,144,207,125,214, 79,171,184, 44, 40,135,142, 2,177, 43,210,243, 12, 96, 64,192,218,172,176, 90, 76,221, 61,207,163, 0,
+ 0, 32, 0, 73, 68, 65, 84, 80,171, 84, 72,207,200, 66,118, 86, 54,212,234, 66, 72,229,110,104,208,168, 57,156,100, 98,220,191,
+180, 15,132, 16,135,230, 53,180, 48,252,224,102, 45,219,137,162,146,237,125,177,196,124,130,227,187,151,229,105, 84, 57,237, 52,
+153,113,113, 21, 45,139,173, 54,219,185,200,135,113,245, 43,249, 85, 99,238,197, 43,177,115,203,122,152,138, 34,155, 22,139, 13,
+ 81,169, 90,100,230,235,144,154,240,136,176, 54,219, 57,252, 71,224,149, 30, 0, 4, 47,180, 65, 93,116, 31, 53, 0, 27, 55,110,
+ 66, 66, 98, 50,187,120,122,175, 84,141,186,240,157, 10,152,172,174, 40,154,107, 67,151, 29,179, 92,239,214, 44,237,216,221,124,
+142,222, 68,202,236,224, 35,246,170,130,118,227, 86,158,209,171,243,133, 54,163,142,119,124,231,184,221, 37,105,218, 29, 52, 76,
+139, 63, 31, 6,185,132, 7,134, 97, 80,220, 92,184, 97,225, 36, 72, 69,246,182,101,189,209,138, 81,159,174,194,206, 85,159,129,
+ 0, 24, 49,244,119, 93,105,233,132,125,237,194,105,126,184, 85, 41, 37, 57, 39,189,107,223,207,207, 27,204, 34, 99,159,129, 99,
+238, 52,109,218,180, 80, 34,145, 64, 34,145,192,217,217, 25,110,110,110,112,117,117, 45,247,216, 45, 22,139,198,100, 50,121, 8,
+133, 66,176, 44,139,164,164, 36, 36, 37, 37, 65,169, 84, 66,161, 80, 64,171, 81, 89,111,157,223,207,107,208,170, 23,252,107,132,
+160, 74,173,134,224,115, 25,240,120, 28, 92, 58,182,165,180,116,150,108,178, 58,244,219,208,165,255, 4,156, 61,180,153,220,190,
+114,124,138, 62, 39,118,139,163,121, 84,212,220,115,127,208,160, 65, 33,147, 39, 79, 22,204,155, 49,249,204,137,240, 75,177,251,
+195, 54,247, 45, 40, 40, 12, 36,132,192,213,197,229,233,176,190,173,143,119,106,211, 44,229,252,249,243,236,238,221,187,141, 12,
+195, 60, 40, 75,211, 94, 72,229,252,122,254,220,133,249,237, 58,116,196,214,237,187, 59, 68, 63,124,212, 33, 62, 62, 14,129, 85,
+106,160, 90,245, 90,208, 49,110,184,112,249, 42, 52,133, 57,191, 58,146,206,151,162, 90, 76, 65, 65,193, 31,195,134, 13,235,254,
+251,239,191,115,134, 13, 27,166,203,205,205,189,246, 92, 20,139,148,167,121,253,199,129, 10, 0,191, 86,233, 48,118, 95,186,185,
+240, 99, 0,203, 42, 87,169,140, 75, 87,175,227,250,239, 55, 55,229, 74, 43, 47, 24, 55,234,253, 73, 85,251,113, 39,244,107, 85,
+149,235,237, 38,197,111,155, 87,114,143, 93, 79, 94,149,156,103,219,186,236,242,252,133,142,228,209,179, 7,135,218,140, 54,117,
+221, 97,177, 17,176,196, 94,224, 58,137,249,165, 21,188,175,104,242, 76,162,113, 83, 38, 79,142,111, 16,218,232,147, 81,239, 79,
+ 17, 52,170, 17,136, 91, 79, 10, 1,134,129,187,175, 12,153,153,153,184,114, 96,179,181, 32,253,241, 38, 46,151,253,182, 2,231,
+ 19, 5, 41,247,130,158,219,156,148,155,155,139, 75,151, 46,161,216, 96,121,121,121,149,102,180, 94,208,204,203,206,184,182,240,
+251,159,218, 76,124,111, 32,250,116,172,143,203,183,227, 97, 42,154,175,169,120, 40,121,226,245, 31,133, 31, 15,171, 97,250, 96,
+ 80,109,149,222, 34, 76,254, 58, 73,121, 5,246, 53, 88,217, 82,210,105,202,207,207, 63, 22, 19, 19,211,182, 97,195,134, 85, 79,
+158, 60,153, 31,125,243,204,244,231, 19,241,249,231,159,203, 55,110,220, 40, 37,132, 92, 51,153, 76, 9, 14, 29, 59, 7,191, 69,
+220,185,227, 97,182,176,184,122,243,126,221, 46,109, 26,129, 37,192,237,219,183,177,245,231,173,134, 7,145,247, 86,104,179,125,
+191, 45,195,188,148,120, 62,109,111, 54,234,240,153,102,102,122,242,138,179, 39, 14,236,108,214,161, 47, 70, 78,251,246,219, 75,
+ 39,118,207,111,210,174, 15,167,110,179,238,136,184,126, 1,231, 78,158,254,206,172,201,159,143,242,251,142,148,152, 78,145, 68,
+250, 81,189, 38, 29,144,154,146,140,164,184,168, 95, 13,249, 79, 50, 82,226,185,191,102,164,165, 76,169, 94,191, 13,126, 63,179,
+103,122, 25, 70,171,204,107, 62,208, 75,178,249,100,216,177,225,105,105, 63,250,106,245, 6, 17, 33,196, 32, 18,242,178,228, 28,
+245, 94,149,195,233,124,100, 86,100, 84, 29, 52,116,212,148, 19,235,214,173,230,251,184, 74,145, 85, 96,128, 74,111,134, 90,103,
+ 6,135, 97, 16,228, 47,131, 78,157,143,203, 7,190,183,152, 52, 5,195,128,120,115,105,154, 50,239,224, 69, 5, 79, 46, 76,251,
+124,234, 69, 8, 93, 2,253,171,117,158, 83,102,180, 78,157,126,175,239,231, 83,143, 7, 19, 66,186,200,188,131,213,218,156,152,
+185,165, 29, 59,195,216,239,239,145,157, 2, 97,182,218,231, 31,179,178,128,141,101,139,162,124, 0,121,214,158,207,148,115,236,
+ 12,187,247,196, 53,100,100, 23, 66,111,178,192,104,178,194,108,177,129,195,229,194,213,205, 21,181,170, 53,134,139,171, 51,178,
+179, 50,112,253,252, 49,196, 70, 94,190,198, 16, 44,208, 43,226,206, 59,146, 71, 2,137,107,176,159,191, 47, 39, 83,101,130, 68,
+200,197,189,203, 39,205, 22,147,113,133,131, 38,235, 21,205,194,188,252, 85,159,204,248, 98,196, 47,219,182,251,134, 84,119, 70,
+ 90,174, 30,105, 10, 3,212, 6, 75,145, 17, 99, 97,212,228, 34,242,194,246, 44,155, 65,189, 10,255, 17, 74, 53, 90, 86,179, 65,
+125,240,244, 45,143,217,243,191,231, 62,137, 79,176, 44,250,184,119,154, 94,163,234, 85,225, 72,214,115,252,242, 97,245, 61,127,
+197, 65,188,210, 92, 72, 88,176,132,224,248,205,172,103,205,133,108, 81,207,203,187,241,101, 47, 35,248,252,218,133, 29,123, 77,
+ 63, 27, 25,163,222,165,215,103,187, 60,126,178,162, 0, 0,184, 92,238,179, 87,113,223, 44,131,193, 96, 42,167, 9,101,199,150,
+ 45, 91,102, 77,153, 50, 69,244,244,233, 83,196,199,199,163,176,176, 16, 98,177, 24,167, 79,159,182,128,181,174,136,252,253,112,
+ 82, 76, 68,248, 55,193, 77,187, 87, 10,105,213, 11, 82,169, 12, 60,226,120,103, 76,169,119,237,225, 77, 59,244,251,161,203,128,
+137, 56,119,120, 11,185,125,249,216, 84,189, 34,118,115, 69,207,101, 97, 97, 97, 52,128,184, 21, 43, 86, 52,218,186,117,107,245,
+ 25, 51,102, 36,236,248, 97,254, 58, 0,200,203,203, 3, 0,220,189,123,151, 76,157, 58,213,104, 48, 24, 18, 11, 10, 10, 34, 80,
+206, 0, 8, 0,208, 43,164, 75,182,110, 88,214,224,105,122,230,192, 26, 13,154,195,171,122,115,248, 6,181, 64,129,218,140, 91,
+ 79, 50,144,240,232, 60, 30, 93, 61,112, 82, 39,183,206, 71, 5,231, 55,110,216,176, 97, 32,135,195,169,166,209,104,124,235,213,
+171,215, 80, 38,147,221,109,216,176, 97, 99, 30,143,151,118,231,206,157,228,138,104,165, 92,222,110,172,210, 97,236,218, 20,181,
+ 83,167,132, 44, 93,227, 20,181,211, 93,157,200,229, 51,197,133,181,198, 95,184, 1,171,136, 57, 55,122,255,118,213,193,223, 54,
+175,228,142,154,244,185, 45, 74,233,246, 49, 79, 34, 60, 91,177,112, 53, 39,243,131, 49,253,255,156,222,161, 40,146, 85,244,183,
+ 67, 97,122,165, 50, 82, 9, 96, 86,228, 67,254, 15, 81, 31, 79, 94, 24,218,172,205,232,246,239, 12,227, 88, 5,114,156, 57,252,
+ 35, 73,140,188,176,159, 71,108, 95,233, 29, 88, 13,160,220,230, 32,147,201, 17,147,245,106, 26,159,202, 58,238,223,253,243,216,
+131,135, 15, 45, 29,208,175,191,199,134,175,223,197,247, 63, 29,129, 76, 34, 2, 97, 89,188,219, 41,112,200, 55, 19,234,244, 13,
+244, 17, 7, 28,188,152,118,101,218,234,168, 89, 58,157, 57,214,129, 72, 12,201,205,205,189, 42,151,203, 21,109,219,182,109, 41,
+ 18,137,152,220,220, 92,158,183,183,183,213,197,197,197,148,150,150,166, 51, 26,141, 7, 1, 84,104,218,113,179,133, 69, 82,182,
+ 1, 71, 15, 29,196,253,155,231,241,232, 81,140,250,209,195, 71,235, 25, 30, 89,173,205,142,203, 7, 42, 92,193, 7, 91,226,168,
+ 67, 82,225, 81,135, 54,163,250,183, 29,155, 22,117,214, 25,140, 99, 27,182,238,141,170,117,219,112,204, 22, 27, 30,220,190,136,
+139, 7, 86,127,111,214,228,207,126,147, 60,246,175, 84,189, 22,225, 10,241,199,165, 19, 32, 44,187, 9, 0, 8,203,110,186,251,
+251,201, 41, 45,122, 77,128,187,119,213,134,133,169,119, 25,188,198,236,225, 2, 30, 71,123,234,224, 47,135,147,146,146,240,248,
+241, 99, 60,121,242, 4,249,249,249,248,237,183,164, 10,229,143,174, 32,249,108,236, 67, 78,143,193,239,142, 60, 62,100,248,123,
+226,234,181, 66, 56,193,149,220,224, 33,231, 33,230, 73, 50, 98,239, 68,178, 49,183, 78, 26,204,170,156, 1,250,130,228, 82,141,
+159,212,179,174, 15, 96,155, 93,188,118, 97,171, 86,109,130,191, 88,188,180,165,135,151,119,137,229,120,158, 34, 71, 56,115,218,
+177,224,235, 55,254,112,104,173, 67,214,102,203,155, 52,118, 24,203,181, 47, 20,138,103,113,234,162,179,103,175, 76,217,247, 19,
+214, 90,110, 4,255,253,129,237, 96,101, 89,104,245,102,168,180, 70, 40,213, 6,100,230,228,225,126,100, 36, 46, 31, 63,134,248,
+152,251,137, 22,147, 41,156,195, 97, 14,232,179, 99, 47, 87,172,165,137, 87,221,195,221, 29,137,249, 26,136,133, 60, 36,199,222,
+ 49,106, 85,202, 93,175,123, 29,233,243,226, 50,115,184, 76,247, 97,195,134,159,238,220,163,159, 75,179,214, 93,165,158,206,174,
+ 16,240, 8,226,146, 50, 16,113,237,180, 54,225,254, 21,149,197,164,233,249, 54, 86,125,249, 31,167,252, 81,135,102,163,182,239,
+136,254, 29, 14,113,185, 60, 33,203, 90,141,102,147,113,240,155,152,172,191, 10, 66,108,105, 99, 71, 12,124,161,110, 96,101,137,
+100,196,208, 51,250,231,235, 10, 22, 27,145,142, 24,122, 77,103, 47, 64, 74,239,216,231,231,231,222,187,120,237,194,148,148,188,
+219,249,249,198,139, 0,210, 12, 6,195,107,167, 49, 59, 59,123,225,226,197,139,251,232,116,186, 58, 29, 59,118, 20, 57, 59, 59,
+ 35, 47, 47, 15,225,225,225,150,176,176,176,135, 57, 57, 57,223, 0, 57, 86, 61, 26,255, 26,105, 56, 60, 38,230, 78,248, 55,117,
+154,246,168, 20,210,186,151,227,133,153, 72, 50,177,115,191,241,204,185, 35, 91,200,173, 75, 71, 62,208, 43,226,126,122,131,211,
+106, 54, 24, 12, 55, 13, 6, 67,212, 87, 95,125,213,204,199,199,199,231,155,111,190, 17,171, 84, 42,254,134, 13, 27, 12,185,185,
+185, 89, 42,149,234, 58,202,232, 79,243, 42,119, 45,202,116, 12, 58,117,112, 75, 39,114,112, 75, 55, 87,207,128,238, 46, 94,149,
+106, 22, 42,210, 19,149,138,140,112, 0,231,138, 38,138,172, 16,141, 26, 53,170,193, 48,204, 48, 0, 13,100, 50, 89,144, 92, 46,
+ 23, 17, 66,234, 48, 12, 19,205,178,108,100,189,122,245,194, 30, 62,124, 88,161,201,100, 83, 46,111, 55, 6, 6,183,217,157,175,
+ 99, 5, 38,142, 96,119,202,229,237, 70, 0,200, 57,251,133, 14,192,209,135, 29,103, 13, 58,118, 61,121, 93,116,129,203,116,197,
+165,165,199, 42,154,102,101,218,253,160,183,117,253, 27, 50, 31,166, 1, 24, 27,121, 7, 43, 31,220,189, 62,143, 33,224,219, 96,
+ 93,164,207,121,114,231,109,232,243,249,124, 67, 64, 64, 64,137,163, 11, 69, 34,145,193,104, 44, 43,128,114,217,170,201,196, 86,
+160,195,246, 67,251,182,143, 61,114,236,232,210,246, 93, 6,120,136, 43, 85, 66, 53,111, 6,219,103, 55,153,126,254,174,226, 86,
+191, 47,174,108, 76,200, 48, 68,162,130,253, 97, 52, 26, 77, 44,128, 2,141, 70,211,159, 16,242,148, 97,152,192,130,130,130,123,
+ 22,139,229, 65,133, 13, 1,139,145,173, 90, 53,255,141, 97, 24, 30,177,178,203,175,243,185,187, 13,153,143,210,240,134,203,146,
+132, 84,115,198,167,223,172,109, 82, 51,168,118,147,226,181, 14,235, 87,117,194,228, 89, 43,155, 84,173, 94,171,201,159,235, 31,
+150,219, 77,128, 88,116, 5,227, 14,253,188,252,202,221, 27, 23,191,244,244,171, 90, 53, 43, 45,225,209,211, 39,247, 22,218, 12,
+170, 67,111,154,207, 73, 79,162, 87,111, 93, 49,107, 70,102,122,226, 86,157, 34, 46, 10, 0,116,138,184,168, 71, 17,248, 58, 55,
+ 43,109, 70, 94, 78,194,138,215, 61, 23, 90,173, 54, 99,215,174, 93,174,109,218,180,225,248,248,248, 64,161, 80,224,226,197,139,
+ 44,203,178,233, 21,214,202, 79,188,168,205,103,220,127,253,233,135,229, 2,153, 83, 47,171,213,234, 79, 8,192,227,241, 50, 77,
+ 58,213,105, 53, 71,246, 5, 10,146, 13,101, 63, 51, 88, 6, 0,167,120,237, 66,150,101,153,229,235,182, 39,243,197, 78, 37, 78,
+134,104, 49,168,165, 44,203, 58,188,214, 97, 97,106, 68,205,183,117,127, 51,132, 44,104,216,180,229,151, 22,139,217, 80,116,127,
+ 24, 0, 24, 8, 65, 30,135,195, 92,230,178,150, 51,170, 55,168, 76, 49, 12,156, 9,195,131,147,132, 7, 6, 12, 52,202,124, 82,
+145, 62, 89, 37, 26,226,156,216,104, 93, 78,135, 42,167, 76,251,198, 92, 56,123,114,168,205,102,171, 86, 20, 51, 72, 50,234,181,
+251, 53,153,110,191, 2,119,172,248,247,115,162,216,108, 49,127,241, 15, 57,212,140,242,191,164, 25, 92, 93,210,191, 82,128,207,
+152,164,228,156, 91, 9, 79,117,191,226,197,101,117,222, 36,157, 92, 31, 31,159,175, 25,134, 25, 45, 20, 10,229, 38,147, 73, 75,
+ 8,217,145,157,157,189, 16,175, 44,254,219,152, 47,241,214,143, 17,138,165,115,205, 6,237, 31,186,156,216,145,229, 29,187,212,
+171,118,119,177, 76, 54,203,160,215,238,208,101,199,110,127,203,231,211, 69, 36, 18, 53,150,203,229,252,220,220,220,155, 0,148,
+255, 75,249,222,176, 97,195,202, 28, 14,167, 26,203,178, 62, 0, 92, 96, 31, 21,146,203,227,241,210,139, 34, 90,164,162,154,109,
+223,223,239,217,165, 91,253, 79,195,175,196,172, 41,106, 86,124, 70,192,144, 85,226,209,189, 58,125,254,235,161,163, 37,141, 58,
+252,199, 93,243,255,127,154, 29,120,114,191,220,177, 28,161,203,162, 46,193, 6, 93,110, 70,250,212,171, 15, 20, 55, 1,168,223,
+ 36,157, 2,129, 96,148,217,108,150, 8, 4, 2,189,217,108,222,245,191,114,236, 18,239,224,241, 28, 16,135, 87,166, 96,193,220,
+121,105,208,202,191,229, 90,226,134,132,132,180, 19, 8, 4,149,109, 54,155,212,100, 50,233,244,122,125, 82,114,114,242, 31, 40,
+125,225,243,191, 52,157, 50,239, 90,171, 5, 2,209,199, 0, 96, 54, 27,215,106,115,226, 62, 45,235,139,101,124,254, 31,157, 71,
+158,213,154,198,241,184,124, 47, 20, 77,204,205, 90,173,138,236,196,219,181,254,198,116, 82, 94, 51,115,169, 38,213,164,154, 84,
+243,101, 56,244,124, 82,205,191, 83, 83,236, 87, 55, 80,236, 87,215,225, 73,151, 75,249, 60, 61,159,148, 98, 38,149,240, 2,224,
+192,132,165, 20, 10,133,242, 23,192,210, 83, 64,249, 59, 49,100, 62,122,250, 87,126,158,242,159,163,212, 62,209, 76, 25,174,180,
+ 34, 33,193,215,113,182,231,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211, 44, 79,251,159,216, 36, 57,233,165,237, 19,
+ 0,254, 95, 58,252,211,176, 42,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,107, 60, 51, 94, 28,122, 46, 40, 20, 10,133, 66,
+161, 80,254, 26,104, 31, 45, 10,133, 66,161, 80, 40,148, 55,163,164,166, 67,106,180, 40, 20, 10,133, 66,161, 80,222, 2,165,118,
+134,167, 77,135, 20, 10,133, 66,161, 80, 40,111, 70,113, 68,203, 15, 47, 77,239, 64,141, 22,133, 66,161, 80, 40, 20,202,219, 33,
+ 19, 37, 69,183,194,194,194, 72, 73,127, 83, 40, 20, 10,133, 66,161,252,127,240, 15,247, 34,207, 71,178, 38, 21,109, 3,120, 46,
+162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179,245, 15,163, 56,146, 85,252,202,124,197,104,245,233,211,135,161,102,139, 66,
+161, 80, 40, 20,202,223,197,191,209,139,112, 94, 62, 64,154,205, 20, 10,133, 66,161, 80,254, 78,179,245,111, 58, 30, 58,189, 3,
+133, 66,161, 80, 40, 20,202,155,225, 7,160,247,115,219,255,111, 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,218, 54,141,
+104, 81, 40, 20, 10,133, 66,161,188,125,179, 69,161, 80, 40, 20, 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170,
+ 73, 53,169,230,191,157,226,121,180,128,210,230,209,162, 80, 40, 20, 10,133, 66,161,188, 22,189, 97,159, 63,107, 82,209,123,111,
+106,180, 40, 20, 10,133, 66,161, 80,222, 46,175, 44,191, 67,141, 22,133, 66,161, 80, 40, 20,202,219, 53, 88,155,169,209,162, 80,
+ 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10,229, 47,130, 65,233, 35, 7,206, 85, 64,231,117, 70, 31,156,163,
+154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 60,237,115,248,231, 81, 60, 51,252, 9,252,217, 17,126,243,255,199, 15,
+211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,183, 51,233,165,247,103,208,166, 67, 10,133, 66,161, 80, 40,148,183,
+107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,111,137, 82,155, 9,105, 68,139, 66,161, 80, 40, 20, 10,229,205, 40,117, 81,105,
+106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 91, 52, 89,147, 74,252,111, 88, 88, 24,
+161,231,136, 66,161, 80, 40, 20,202,223,197,191,214,139, 20, 31, 24, 53, 91, 20, 10,133, 66,161, 80,168, 23,169, 48,126,248,115,
+180,225,164,162,109, 0,116,212, 33,133, 66,161, 80, 40, 20,202,155,210, 27, 47,142, 60,156, 84,188, 77,141, 22,133, 66,161, 80,
+ 40, 20,202,155, 51,169,204,255,210,102, 67, 10,133, 66,161, 80, 40,127, 39,255, 70, 47,194,208,108,165, 80, 40, 20, 10,133, 66,
+121, 35, 74,138,102,109,166,167,133, 66,161, 80, 40, 20, 10,229,175, 53, 92, 20, 10,133, 66,161, 80, 40,148,191,194,100,253,213,
+ 19,150,210,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 95, 49, 89,207, 79,241, 0,128,142, 58,164, 80, 40, 20, 10,
+133, 66,121, 83,232,162,210, 20, 10,133, 66,161, 80, 40,127, 17,116, 81,105, 10,133, 66,161, 80, 40,148,255,103,195, 69,141, 22,
+133, 66,161, 80, 40, 20,202, 91, 52, 89, 47,152, 45,218, 71,139, 66,161, 80, 40, 20, 10,229,205, 40,181,143, 22,131,210, 71, 14,
+156,171,192, 15,188,206,232,131,115, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,207,105,150,167,125, 14,255,124, 38,225,255,
+105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,111,219, 88,
+189, 12, 53, 90, 20, 10,133, 66,161, 80, 40,111, 6,157, 71,139, 66,161, 80, 40, 20, 10,229, 47,194, 15,246,168, 86,241,123, 99,
+106,180, 40, 20, 10,133, 66,161, 80,222, 14,189, 97,143,106, 21,191, 83,163, 69,161, 80, 40, 20, 10,133,242, 22, 41,113, 30, 45,
+ 6, 0,194,194,194, 72,209,118,199, 62,125,250, 92,166,231,138, 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 44,162,213,167,
+ 79, 31, 6,192, 37,154,213, 20, 10,133, 66,161, 80,254, 14,254,141, 94,132,243,146,147,236, 72,179,153, 66,161, 80, 40, 20,202,
+223,193,191,209,139,240, 94,114,145, 20, 10,133, 66,161, 80, 40,127, 11,255, 96, 47,226, 7,123, 71,248, 19, 69,239, 64,209,148,
+ 15,116, 30, 45, 10,133, 66,161, 80, 40,148, 55,163,120,180,225, 43, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,155, 81,210,
+204,240,155,233,105,161, 80, 40, 20, 10,133, 66,249, 11,161, 17, 45, 10,133, 66,161, 80, 40,148, 55,231,249,168,214,255, 91, 52,
+139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, 82,205,255,146,201,122, 97,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23,
+ 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 25,197, 35, 14,159,223,166, 70,139, 66,161, 80, 40, 20, 10,229, 45,154,173, 87,160,
+ 77,135, 20, 10,133, 66,161, 80, 40,111,198,164,210,254, 65,141, 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 62,114,224,
+ 92, 5,132, 95,103,244,193, 57,170, 73, 53,169, 38,213,164,154, 84,147,106,254,231, 52,203,211, 62,135,127, 30,127,219,132,165,
+116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,179,208,166, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,197,227,
+241,190,148, 72, 36, 27, 37, 18,201, 79, 60, 30,111, 5, 0,183,138,254,160, 76, 38,155,238,235,235,251,216,215,215, 55,173,114,
+229,202, 39,157,156,164,159,212, 16,161, 61, 0,254, 91, 58,158, 96, 0,159, 72, 36,146, 71, 98,177, 56, 25,192, 78, 0,159, 0,
+240,124, 19,225,133,254, 24, 28,245,113,255, 35, 11,253, 49,248,165,127,245,246,241,241,185, 10,160,251,219,202,148,225, 82,116,
+ 29, 34, 67,234, 16, 25, 82,135, 75, 95,191,214,224,228,228, 52,218,207,207,239,186,135,135, 71,186,159,159,223, 53,177, 88, 60,
+164,130, 18,222, 62, 62, 62,223, 7, 6, 6,198,250,251,251,175,129,125,117,242,255, 89,218,137,208,174,165, 8,138, 86, 66,168,
+219, 8,177,177,149, 16,221,186, 1,210,215,148,107, 11,224,128,179,179,243, 61, 30,143, 23, 6, 96, 80,209,245, 53,136,199,227,
+133, 57, 59, 59,223, 3,112,160,232,115,175,115,157,126, 15, 32, 29,192,146,162,237,143, 2, 3, 3,213,161,161,161,201,161,161,
+161,191, 4, 5, 5,189,231,168,152, 84, 42,237, 22, 24, 24,120,176,114,229,202,201,173, 90,181,202, 15, 8, 8,136,169, 84,169,
+210,118,145, 72,212,145, 22,113, 20, 10,133,242,191, 79, 95, 0, 75, 1,172,143,140,140,140, 32,132, 68, 16, 66, 34, 34, 35, 35,
+ 35, 0,108, 4,176, 12,165,135, 16, 95,216,239,225,225,177, 96,209,162, 69,134,204,204, 76,162, 80, 40, 72,108,108, 44, 89, 61,
+119, 22,219,195,157, 71,106,120,185,233,252,252,252,226,171, 84,170,180,167,190,156, 51, 11, 64, 77, 71, 52,159,195, 77, 34,145,
+220,156, 59,119,174,230,234,213,171, 26,147,201,164, 97, 89, 86,147,145,145,161, 57,119,238,156,166, 77,155, 54, 26, 0,159, 2,
+224, 86, 64,243, 25,223,250,227, 50,249,249,107,242,173, 63, 46, 63,191,191, 78,157, 58, 15, 89,150, 37,131, 7, 15, 54, 2, 8,
+168,136,230,203, 4, 0,226,250,206,112, 29, 34, 71,182,117,251, 66, 66, 54,204, 32, 67,100, 72,125, 29, 77,111,111,239,163,211,
+167, 79, 87,165,167,167, 19,163,209, 72, 82, 83, 83,201,228,201,147,149,222,222,222,187, 28, 60,118,143,144,144,144,236,235,215,
+175,179,133,133,133,228,210,165, 75,108,131, 6, 13,178, 29, 52, 91, 93, 95, 74,203,102,127,127,255,147, 21,121,121,123,123,111,
+173,104, 30,181, 16, 33,213, 28,113,145,144,219,225,228,216,224, 86,100,117,211, 74,100,144,187,176,176,173, 16, 31,117, 40,121,
+ 42,147,210, 52,135,118,232,208, 65,251,224,193, 3, 91, 94, 94, 30,121,248,240, 33, 59,113,226, 68, 3,128,232,137, 19, 39, 26,
+ 30, 62,124,200,230,229,229,145, 7, 15, 30,216, 58,116,232,160, 5, 48,161, 2,233,228, 0,216, 54,127,254,124, 66, 8, 33,139,
+ 22, 45, 34,161,161,161,164,115,231,206, 68,163,209, 16, 66, 72, 50, 33,228, 23,171,213, 58,214, 17, 77, 23, 23,151,209,211,167,
+ 79,215,232,116, 58, 82, 12,203,178,164,176,176,144,172, 95,191, 94,235,235,235,123,178,148, 74, 6,109,242,160,154, 84,147,106,
+254,175,105,254,147,241,131,189,159, 86,241,203,225,192,196,136, 89,179,102, 21,155,170, 83,109,219,182,189, 53,118,236,216,136,
+177, 99,199, 70,180,109,219,246, 18,128, 51,119,238,220,137,152, 57,115,102, 4,128, 17,229,100,132, 91,235,214,173, 11,179,178,
+178, 72,173, 90,181, 72,213,170, 85, 73, 86, 86, 22, 33,132,144,219, 67,155,144,243,117, 65,158, 94, 57, 69,194, 15, 31, 32, 19,
+253,120,164,157,159,139,197,207,215, 55,207,211,211,115, 49, 94, 92,147,177,164,204, 29, 88,183,110, 93,117,116,116,180, 38, 46,
+ 46, 78,179, 96,193, 2, 77,231,206,157, 53, 33, 33, 33,154, 65,131, 6,105,214,173, 91,167, 49,155,205,154,173, 91,183,106,156,
+157,157,163, 75, 48, 91,175,109,180,120, 60,222,218,200,200, 72, 18, 31, 31, 79,138,162, 20,165,105,186,184,186,186,246,116,115,
+115,251,212,213,213,181, 39, 0, 23, 0,168, 5,200, 27,186,160,242, 71, 13,107,212, 9, 27,209,181,230,250,174,205,154, 12,113,
+226, 20, 90,126,152, 65,200,224,202,175,101,180, 92, 92, 92, 70,127,242,201, 39,106,163,209, 72,116, 58, 29,209,104, 52, 68,167,
+211, 17,181, 90, 77, 70,140, 24,161, 18,139,197, 3,203,211,244,244,244, 92,120,229,202, 21,107, 86, 86, 22,185,114,229, 10, 57,
+121,242, 36,217,176, 97, 3,235,237,237,189,170,162, 55,160,175,175,239,217,240,240,240,136,187,119,239, 70,220,188,121, 51,194,
+ 98,177, 68,152,205,230, 8,179,217, 28, 17, 22, 22, 22,113,232,208,161,136,189,123,247, 70,152, 76,166, 8,147,201, 20, 97, 52,
+ 26, 35,170, 87,175,126,186,162,121,212, 92,132,167,166,171,199, 8, 89,245, 33, 81,126, 55,149, 20,126,214,139,228, 76,110, 79,
+ 54, 54,171, 68,218, 75,112, 28,175,174,237, 89,162, 38,159,207,191,156,156,156,204,206,153, 51,199, 84,175, 94, 61,229,184,113,
+227, 12, 70,163,145, 16, 66,136,209,104, 36,227,198,141, 51,212,171, 87, 79, 57,103,206, 28, 83, 82, 82, 18,203,227,241,206, 85,
+ 32,157,203,138, 77,214,229,203,151,201,243,104, 52, 26,210,185,115,231,228,208,208,208, 95,170, 85,171, 54,178, 60, 77,185, 92,
+222,127,246,236,217, 26, 82, 2, 22,139,133,168,213,106,146,148,148,196, 86,173, 90, 53, 3,128, 7, 45,204,169, 38,213,164,154,
+212,104,253,101, 76, 42,103,187,228,147, 56,115,230,204, 8, 66, 72,196, 87, 95,125, 21, 81, 20,217, 18, 0,144, 23,189,120, 0,
+134,207,158, 61, 59,130, 16, 18, 49,107,214,172,226,207,148,150, 17,125,247,239,223,111, 94,179,102, 13,241,241,241, 33,190,190,
+190,100,237,218,181,132,101, 89,146, 21,182,139,156,175, 11,242,232,203, 49,132, 16, 66, 98, 23, 79, 35,231,235,130, 36,108,250,
+150,140, 26, 53, 74, 39,149, 74, 71,148,145,185,238, 77,154, 52, 81,235,245,122,205,246,237,219, 53, 82,169,244, 54,128,122,176,
+ 55, 69, 50, 69,105,125,175, 94,189,122,170,168,168, 40,205,238,221,187, 53, 0, 22, 56,120,193,212, 4,208, 73, 38,147, 13,154,
+ 29,192,143, 35, 63,127, 77,102,251,224, 1,128, 6, 0,188,138, 62,227, 63,107,214, 44, 66, 8, 33,129,129,129, 87, 74,209,116,
+ 9, 9, 9,153, 21, 23, 23, 55,207, 98,177,204,187,123,247,238,188,218,181,107,207,233, 87,221,175,213,145, 17,221, 26, 43,191,
+157,218,152,172,252, 44,100,197, 59,205,187,238, 25,214,113,196,251,213, 60,175,142,243, 22,235,222,117,225,170, 95,106, 58,116,
+232,194, 14, 8, 8,184,153,154,154,250,204, 92,169,213,106,146,158,158, 78, 18, 19, 19,201,213,171, 87,137,159,159,223,249,242,
+ 52,125,125,125, 31,166,166,166,146, 77,171, 87,147,193, 13,234,144,246,174, 78,164,131,155, 19,105, 42, 23,107,235, 2, 77, 43,
+106,180,238,221,187, 23, 1, 32, 2, 64, 68, 94, 94, 94, 68, 94, 94, 94, 68, 65, 65,193,179,125, 0, 34,148, 74,101,132, 82,169,
+140, 48,153, 76, 17, 53,106,212,168,176,209,106, 35, 70,155, 22, 98,228,183, 18, 65,223, 55,192, 51, 99,106,117, 79,219,141, 17,
+173, 72,193,135,157,201,154,198, 1,164,173, 16, 31, 57,168,217, 87, 40, 20, 94, 2, 48,163,200,148,143,233,217,179,167,142, 16,
+ 66,122,246,236,169, 3, 48,166,104,255, 39, 69, 38,171,167,131,233,228, 4, 5, 5,105,139, 35, 89, 0,254, 8, 10, 10,210,134,
+134,134,146,208,208, 80, 18, 24, 24,168, 46,210,118,168, 64,171, 89,179,102,172, 94,175,127,102, 0, 11, 11, 11, 73, 70, 70, 6,
+ 73, 72, 72, 32,209,209,209,228,246,237,219, 36, 57, 57,153,236,219,183,207,230,234,234,122,130, 22,230, 84,147,106, 82, 77,106,
+180,254, 82,163,245,242,235, 69,194,194,194,200, 75,187,190,187,115,231, 78,196,236,217,179, 35,202,113,102,147,190,250,234,171,
+226,168,215,210, 50, 30,254, 91, 99, 99, 99,201,152, 49, 99, 72,112,112, 48, 9, 14, 14, 38, 99,199,142, 37, 74,165,146,104,158,
+ 68,145,243,117, 65,110,191,219,148, 16, 66,136,250,209, 93,114,190, 46, 72,196,168,214,228,254,253,251,164, 82,165, 74,225,101,
+252,254,241,107,215,174, 41,118,237,218,149, 5,123,127, 44, 62,128,150, 0,214, 74, 36,146,109,176, 55, 23, 86, 5,224, 86,171,
+ 86,173,124,157, 78,167, 25, 60,120,176, 6, 64,229, 50, 52, 59, 4, 7, 7,199,111,221,186,149,228,228,228,144,252,252,124,178,
+188, 77,109, 66,126,254,154, 44,106, 90,149,221,180,105,147,113,198,140, 25, 90,119,119,247, 48, 0,254,131, 7, 15,182, 18, 66,
+ 72,251,246,237,179, 75, 18,115,117,117,237, 25, 23, 23, 55,207, 96, 48,204, 43, 44, 44,156,151,159,159, 63,239,216,145, 35,243,
+122, 52,168, 61, 70,249,237,212,198, 71, 70,116,107,252, 78,128,219,160, 85,221,155, 77, 73,159, 51, 97,240, 87,173,235, 61, 50,
+ 44,251,248,226,208,234, 62,223,191, 78,110,123,121,121,101, 26,141, 70, 2,224,149, 87,124,124, 60,241,240,240, 72, 45, 79,195,
+221,221,253,171, 79,134, 15,179, 13,172, 26, 64,226,215,204, 37,150,179,187,137,229,228,118,242,228,187,207, 72, 63, 95, 79, 85,
+ 75, 1,103,182,163,233,241,245,245, 61,123,243,230,205, 23,140, 86, 65, 65, 65,137, 70, 75,165, 82, 69,152, 76,166,136,160,160,
+160,211,111,122,213,183, 20,162, 70, 7, 9,247,246,221, 49,237,136, 98,106,103,210,211,133,159,252, 6,114,195, 1, 92, 2, 48,
+170,130,223,227, 0, 88, 86,108,168,190,251,238, 59, 66, 8, 33, 65, 65, 65, 90,188,217, 96, 20,151, 58,117,234, 36, 78,152, 48,
+193, 90,183,110,221,156, 54,109,218, 20,222,186,117,139, 92,190,124,153,156, 60,121,146, 28, 56,112,128, 68, 69, 69,145,244,244,
+116, 18, 27, 27, 75,122,247,238, 93, 8,160, 3, 45, 11, 41, 20,202,255, 50, 37,120,145,127, 60,156,226, 3,235,211,167, 15,243,
+220, 1,186, 0, 16, 55,109,218, 84,177,108,217,178,149,176,207, 5,193,132,112, 49,180,179,132,119,191,179,132,119, 63,132,139,
+161, 69, 17,163,205,139, 23, 47, 94, 24, 26, 26,154, 9, 64, 2,192,183,164, 31, 34,132,180,243,240,240, 64,106,106, 42, 92, 92,
+ 92,224,226,226,130,212,212, 84, 16, 66, 96, 37,128,133, 0, 70,179, 25,122,189, 30, 6,150, 64,207, 2, 42,141, 6,190,190,190,
+ 48,155,205, 53, 74, 73,127,195,119,223,125,183, 70, 72, 72,136, 98,230,204,153, 25,176,247,149,217, 54,126,252,248,179,127,252,
+241, 71,136, 70,163,201,143,142,142, 54, 52,104,208,160, 39, 0,223,184,184,184,209,235,215,175,199,152, 49, 99, 80,198, 67,167,
+ 65,239,222,189, 79, 70, 69, 69,213, 24, 53,106, 20, 46, 93,186,132,229,203,151, 35, 55, 55,151, 0,128,209,104, 36, 54,155,205,
+220,186,117,107,243,154, 53,107,154,183,111,223,254,102,245,234,213,185, 0,144,152,152,248,164, 36, 65,134, 97,106, 87,169, 82,
+ 5, 70,163, 17, 10,133, 2, 81, 81, 81,112,114,113, 65,100, 70,174, 79,199, 85,155,242,190, 60,114,150, 63,188,121,136,251,167,
+221,218, 24,151,132, 95,170, 85,207,223,199,199,100,182,248,198,102,102,103,188, 78,166, 10, 4,130,212,220,220, 92,152, 76, 38,
+232,245,122,168, 84, 42,228,229,229, 33, 55, 55, 23, 25, 25, 25, 16, 8, 4,241,229,105, 56,231,231, 95, 73,188,118,153,217,247,
+227,119,168, 97,205, 7,239,224, 90,240,142,110, 68, 77,147, 2, 63,205,157,236,100,242,240,154,239,236,228, 84,224,234,234,186,
+ 25, 64, 80,121,122,141, 27, 55, 70, 94, 94, 30,242,242,242,224,225,225, 1, 55, 55, 55,184,185,185,161,176,176, 16, 74,165, 18,
+ 42,149, 10,181,106,213, 66,195,134, 13,177, 99,199,142,183,114,113,223, 48, 33,193, 10,219,212,179, 49, 25, 16,200,100,168,238,
+ 38,175,210, 76, 14,247, 50,190,210,153,207,231,239,119,119,119, 15, 7,240, 33, 0, 25,128, 15,221,221,221,195,249,124,254, 0,
+ 0,139, 0,236,170, 96, 50,150,204,159, 63,127, 86, 92, 92,156,244,254,253,251,152, 57,115, 38, 22, 44, 88,128, 39, 79,158,252,
+ 0,128, 45,250,204, 7, 30, 30, 30, 97, 28, 14,103, 11,128, 94, 0,122,250,249,249,117, 41, 71,119,192,140, 25, 51, 12, 77,154,
+ 52,137,125,244,232,209,128,107,215,174, 53,253,236,179,207,148, 41, 41, 41,136,141,141,133,159,159, 31, 2, 3, 3,161,209,104,
+ 80, 80, 80,128, 1, 3, 6,184, 56, 59, 59,143,160,197, 56,133, 66,249, 95, 54, 89, 47,121,145,127, 90, 68,171,196,237, 18,107,
+212, 82,169,116,126, 68, 68, 68,171,208,208, 80, 30,128,125, 0, 16,194,197,144, 1,173, 27,109, 59,178,249,187,208, 67,107,230,
+134,246, 8,173,181, 45,132,139,226, 81,108, 97, 77,155, 54,117,139,136,136,104, 45, 18,137, 62, 42, 37, 17, 4, 0,220,220,220,
+224,226,226, 2, 87, 87, 87,184,185,185,129,101, 89,104,116, 6,104,109,128,218, 96,130, 82,169,132,186,104, 91, 99, 52, 67,171,
+213, 62,251,110, 9,116,156, 48, 97,130, 98,253,250,245, 57,153,153,153,223, 1,104, 48,102,204,152,254,235,214,173,195,133, 11,
+ 23, 12,189,130,107,122, 44,110,215,104, 97,189,204, 39,243,130,249,152, 8,224,202,149, 43, 87,208,186,117,107, 48, 12, 51,172,
+ 36, 65,137, 68,178,113,207,158, 61,146,232,232,104,212,172, 89, 51,122,216,176, 97, 67,191,251,238,187, 26, 50, 77,254,239, 0,
+ 96,205,203,138,158, 54,109,218,215,139, 23, 47, 86, 40, 20, 10,179, 78,167,251, 63,246,190, 59, 44,138,171,125,251,158,237,203,
+238,210,219,210, 85,138, 96, 65,197,222,176,183,136,157,216, 53,246, 88,162,209, 24, 99, 11,197,168,177, 68,141, 26, 19, 77,108,
+ 17,141, 5, 81, 17, 99,195,222, 21, 80, 84, 4, 65,144, 38,101,105,203, 22,182,176,229,124,127, 32, 4, 13,213,188,239,239,123,
+147,204,125, 93,123, 45,236,156,185,231,156,153,115,102,238,121,206,115,158,199,110,248,240,225,200,204,204,196,155, 55,111,238,
+214, 34, 50, 95,198,197,197,145,210,210, 82,164,166,166, 34, 46, 46,206,228,235,175,191,238,100, 96, 48, 70,100,195,116,218,212,
+238, 29, 58, 77,234,210, 14,135,239, 61,225,220, 74, 74,179,232,208,196,201,242,113, 86,110, 83, 29,133, 87, 31,114,181,229,114,
+249,246,111,190,249, 70,161, 80, 40,144,157,157,141,167, 79,159,226,197,139, 23, 72, 79, 79,199,166, 77,155, 20,197,197,197, 59,
+234,227,112,228,179,190,216,188,100, 6,197, 74,184, 11, 60,185, 1,148,201, 1,149, 2,154,196, 88, 28, 72,204,195,174,147,167,
+184, 25,153,153, 22,199,142, 29,155,233,234,234, 26, 11,192,171, 46, 62, 66, 42, 46, 33,131,193,120, 95,132,130,193, 96,200, 1,
+228, 9,133,194, 44, 83, 83,211, 44, 6,131,145, 71, 8, 81,254, 71,222, 36,244, 40, 7,147, 9,112, 77,192, 96,215,153,218,243,
+227,113,227,198, 29,205,202,202, 26,148,154,154,218,117,199,142, 29,223,240,249,252,248, 29, 59,118,124,147,154,154,218, 53, 43,
+ 43,107,208,184,113,227,142, 2,152,210,152,227,123,122,122, 46, 8, 14, 14,198,166, 77,155,208,182,109, 91,120,121,121,149,133,
+132,132,108, 7,176, 26,192,103,158,158,158,183, 23, 44, 88, 48, 93, 34,145,136,179,179,179,219,254,240,195, 15,115,182,111,223,
+222, 49, 39, 39,135, 95, 15,117,143,129, 3, 7,226,252,249,243, 0,144, 11, 32,181,168,168, 72,159,147,147, 3, 31, 31, 31,116,
+234,212, 9, 10,133, 2, 10,133, 2, 82,169, 20,110,110,110, 48, 26,141, 93,233, 91, 57, 13, 26, 52,104,252,159, 10,174,154,133,
+ 22,159,207,183,244,243,243, 67,179,102,205, 44,241,118,181,150, 53,151,181, 98,241,204,241, 2, 81,236, 5, 80,113, 87, 48,174,
+103, 43,129, 53,151,181,226,237, 46, 44, 55, 55, 55,158,159,159, 31,132, 66,161, 83, 45, 7,191,158,151,151, 7, 63, 63, 63, 88,
+ 88, 88,192,220,220, 28,126,126,126, 40, 47, 47, 71,169, 92, 14,165, 1, 40,211, 25, 81, 90, 90,138,226,130,124,148, 25, 0,189,
+169, 53,210,211,211,193,100, 50,211,106,225,116,240,240,240, 40,136,143,143, 47, 0,112, 19,192,167,161,161,161, 88,190,124, 57,
+130,130,130,142, 10,114, 95, 15, 60,122,254,140,245,145,144,121,182, 94, 92,106, 60,128,242,172,172, 44, 88, 88, 88, 64, 40, 20,
+214, 40, 12,252,253,253,219, 11,133, 66, 28, 60,120,144,100,103,103,119, 71,197, 18,254, 52,138,170, 16,123, 38, 12,148, 2,216,
+ 30, 27, 27,219,249,235,175,191, 78,234,223,191, 63,187, 75,151, 46, 88,187,118, 45, 0, 68,213,196, 41,149, 74,239, 79,153, 50,
+ 69,123,237,218, 53, 36, 38, 38, 10, 79,159, 62, 29,184,118,237,218, 86, 25, 25, 25,188,179,191, 95, 24, 18,150, 37, 11,220,120,
+233, 22,127,221,197,235,247,109,204,132, 45,155,218, 88, 33, 46,227, 13,199,192,196,195,250,174,104,103, 54,115,102,111, 62, 43,
+174, 39,143,145,219,155,207, 66,159, 74, 59, 0, 0, 32, 0, 73, 68, 65, 84,138,237,200,102,206,144,203,229,199, 34, 35, 35, 47,
+ 46, 89,178, 68, 33,145, 72, 96,106,106,138,162,162, 34,172, 95,191, 94, 17, 23, 23,119, 82,171,213,158,173,143,215, 96, 36,237,
+ 93,154,184, 2,175,226,171,126, 43, 55, 18, 60,212,114, 16,240,233, 34,120,251,248, 64,171,213,162,117,235,214, 84,104,104,168,
+208,220,220,252,203,122, 69, 15,227, 79,221, 77, 79, 81, 84, 30, 33,228,141, 66,161,200, 54, 49, 49,201,224,112, 56, 25,197,197,
+197,217,132,144,252,255,132,206, 34, 12,124,209,173,181, 39,192, 51, 65, 70,145, 34,231,145, 2,197, 53, 21, 52, 53, 53,157,177,
+107,215, 46,254,190,125,251,116, 11, 22, 44,208,204,153, 51,135,173, 82,169,236,230,204,153,195, 94,176, 96,129,102,223,190,125,
+186, 93,187,118,241, 69, 34,209,232, 15,169,136, 78,167, 67,124,124,252,198,148,148, 20, 33, 42,194,141, 44, 10, 9, 9,153,154,
+156,156,204,223,185,115, 39,194,195,195, 17, 30, 30,142, 17, 35, 70, 96,225,194,133, 8, 14, 14,174,139, 78,208,166, 77, 27, 63,
+107,107,107,220,184,113, 35, 7, 64, 6,128,246, 34,145,200,116,196,136, 17, 24, 52,104, 16,212,106, 53,202,203,203,171,132, 22,
+147,201,132,133,133,133, 53,125, 15,164, 65,131, 6,141,255,186,200,122, 71,108,177, 0,160,210, 84, 23, 16, 16, 64,213,245, 96,
+ 52,148, 72, 32, 85,150, 33,189,180, 12,153, 37,198,119,182, 25,141,198, 58,143,158,147,147,115,246,222,189,123, 51,252,252,252,
+ 88, 57, 57, 21, 51, 98,126,126,126, 40, 43, 43, 67,206,147, 7, 80, 26, 1,161,135, 47,148, 74, 37, 74, 94, 60,134,168, 77, 87,
+ 88, 15,157,132,173, 59,119,106,138,138,138,118,215,196,201,229,114,217,206,206,206, 5,105,105,105,122, 0,197,230,230,230, 3,
+ 93, 93, 93,113,253,250,117, 0, 56, 76,128,205,136,187, 6,220,136, 0,169, 48,169,136,220,220,220, 32,145, 72,160, 80, 40,174,
+215,196,121,239,222,189,100,157, 78,215,122,248,240,225,212,175,191,254,122, 92, 38,147, 5, 1,120,170, 49,130,249, 36, 43, 31,
+ 74, 3,248, 0, 6, 88, 90, 90,126, 30, 28, 28,220,111,193,130, 5,136,140,140,196,165, 75,151,202, 81,225, 11,118,175, 6,218,
+210,212,212,212, 61, 75,151, 46,237,194, 96, 48, 62,189,124,249,178,222,203,203, 75, 86, 94, 94,110,104,238,237,205, 8, 10, 93,
+195,153,255,233,108,139,162, 50, 36, 12,106,238,208,141,162,128,132, 55,146,140, 20, 5,138,234, 58,167,254, 92,102,212,200,238,
+109,252,103,140, 27, 38, 18,122,180,132,242,217, 3,241,158, 19,191,111, 53,137, 75, 14,184, 33,145,140,136,140,140, 12,188,126,
+253,250,124,173, 86,219,140,199,227,189,146, 74,165,223, 43, 20,138,122, 69, 22,147,201, 28,170,113,112,182,148, 22, 23,131,255,
+214, 18, 37,211, 25, 81,168,209, 35,209,194, 11, 19,156, 93,170,166, 65,243,242,242, 32, 22,139, 41,131,193, 48,172, 46,206, 75,
+151, 46, 33, 32, 32,160, 82,120,130,162, 40, 80, 20, 85,232,237,237,157,207,227,241,138, 56, 28,142,108,243,230,205,106,181, 90,
+ 13, 22,139,197, 55, 24, 12,204,191,210,219, 59, 9, 96,199, 35,212,143,115,134,247,233,223,182,165, 15,185,249,232, 9, 85, 82,
+166, 62, 80,135, 21,240, 7, 79, 79, 79, 86,113,113,241, 89, 0,137, 58,157,238,200,241,227,199,249,147, 39, 79, 86,159, 56,113,
+ 98, 34, 0,247, 45, 91,182, 4, 42, 20,138, 70,165, 84, 72, 73, 73,249, 97,221,186,117, 95,173, 90,181, 10,135, 14, 29, 90,144,
+146,146,178,252,173,165,107, 68,112,112, 48, 54,111,222,140, 67,135, 14, 25, 19, 19, 19,127, 55, 26,141, 41, 75,150, 44,105, 99,
+111,111, 95,152,155,155,155, 82, 7,109,135,193,131, 7,107,110,223,190,205,149,203,229,183, 0,124, 62,119,238,220,153,157, 59,
+119,150,141, 27, 55, 78, 84, 92, 92, 44, 21, 8, 4,220,189,123,247, 90,178, 88, 44, 40,149, 74, 80, 20, 5,185, 92,174,165,239,
+131, 52,104,208,248, 95, 69,109, 90,228,111,130, 90,159, 13,172,154, 26, 88, 86, 86,150,159,153,153,233,243,230,205, 27, 61, 0,
+ 61, 0, 20,105,245,223,174,219, 27,177,111,116, 23, 79, 97,174, 78,135,211,143,158,151, 21,105,245,149,206,239,250, 55,111,222,
+200, 51, 50, 50, 76, 85, 42,149,162,150, 99,221,253,241,199, 31, 85,215,174, 93, 51, 77, 77, 77,133,193, 96, 64,251,246,237,241,
+242,229, 75,148, 36,198, 67,232,211, 30,194, 94, 1,120, 30,251, 8,113,151,162,241, 90,161,213, 39,173, 94, 87,170, 80, 42,131,
+203,203,203, 79,215, 68,200,102,179,139, 1, 16, 66,136, 1, 0,100, 50,217, 83,133, 66,209,211,222,222, 30, 9, 9, 9, 66,165,
+ 1, 11, 3, 87,108,221, 65, 8, 49,112, 42, 86,115, 45, 30, 55,110, 28, 98, 98, 98, 0, 32,166, 38, 78,153, 76,182, 96,214,172,
+ 89,215, 14, 30, 60,200, 74, 77, 77, 29,180,111,223,190, 65, 73, 73, 73,132, 42,206, 52,220, 46, 99,195,125,234,194,142, 63,185,
+121, 95, 10, 8, 8,128,131,131, 3,246,238,221,139,239,191,255, 94, 55,111,222,188,228,239,191,255,190,163, 68, 34, 57, 82, 75,
+251, 75,165, 82,233, 5,107,107,235,249,173, 90,181,146, 43,149, 74, 20, 21, 21, 33, 39, 39, 7, 86,214,214, 12, 61, 24,221,108,
+ 45, 44,142,156,205,147, 11, 89, 23,238,227, 65,118,110,157,214,172, 46,108,230,148,209,254,237,252, 63, 91,181, 66,132,219,167,
+ 65,205, 10, 6,217,247, 13, 22,125, 18,104,170,214, 28,233,165,124,146, 62, 57, 86, 38, 11,147,201,100,225,141,236, 44,131,187,
+117,235,118,116,221,186,117, 38, 43, 55,173,195, 22, 31, 39,232,139,138, 80,160, 49,160, 80,163,135,172, 36, 17, 9, 9,207, 97,
+109,109,131,215,175, 95, 67,173, 86,227,197,139, 23,132,201,100,158,173,207,162, 83,137,106,211,133, 82, 30,143, 87,196,102,179,
+243, 89, 44, 86,113,106,106,170, 82,173, 86,131,193, 96, 8, 13, 6,131, 73, 3,234,234,108, 99, 99,179, 4, 21,193, 68, 35,229,
+133,133,219,253,216,176, 0, 11,189,221,108,172,135,172,158, 51,217,198,213,209, 78,154,154,252, 74,183,251,226,157, 66,181,166,
+246,197, 26, 0,162,138,139,139,171, 44,146, 39, 78,156, 88,116,226,196,137,153, 0,246,163, 34,239, 86,180, 84, 42,253,233, 3,
+ 6,223,234,147, 39, 79,126,181,106,213, 42,152,152,152, 84, 5, 79, 53, 49, 49,225, 3,192,111,191,253,134,132,132,132,206,120,
+235,175,101, 52, 26,143,230,230,230,214,199,233,238,235,235,155, 26, 17, 17,193, 5,224, 56,119,238,220,174, 59,118,236,192, 39,
+159,124, 82,240,252,249,243, 46, 0,210, 0,184,127,250,233,167, 15, 15, 29, 58,100,105, 52, 26, 81, 82, 82, 2,173, 86,155, 70,
+223,202,105,208,160, 65,139,173,255, 10,252, 0,196,161, 34,126,214, 80, 0,231, 80,225,214, 81, 43, 92,222,170,179,139, 0,134,
+ 87, 62, 31,107,113,134, 7, 42, 86,100, 93, 0,240, 11, 0,251,218, 72,173,173,173,191,156, 58,117,170, 46, 59, 59,155,228,229,
+229,145,240,240,112,178,120,198, 84,195, 0, 15, 71,163,135,163,189,210,214,214,246,165,131,141,213,129,118, 2, 44, 6,224,220,
+128,134, 77, 77, 74, 74,154, 61,117,234,212, 25,111,143, 59,227,232,209,163,138,203,151, 47, 43,152, 76,102, 20, 42, 66, 59, 84,
+ 10,202, 41,195,134, 13, 83,104, 52, 26,133,183,183,119, 49, 42, 28,247,107, 67, 96,239,222,189, 75,206,159, 63, 79, 12, 6,195,
+159, 98, 20, 21, 20, 20,144, 75,151, 46,145,238,221,187, 75, 1, 76,238,215,175,223,245, 59,119,238, 92,239,209,163,199,201,250,
+ 42,108, 99, 99,179,226,201,147, 39, 49,233,233,233,177,231,206,157,139, 61,114,228, 72,236,167,159,126,250,180, 77,155, 54,170,
+228,228,100,163, 94,175, 39, 79, 30, 63, 38,222,205,155, 43, 1,184,213,198,211,215,132,245, 80,182,247, 27,162, 94,251, 9, 81,
+143,116, 33, 0,136,124,235,151, 36,127, 65,127,242,114,254, 16,210,135,207,188,247, 33, 61,197,202,202,234, 98, 76, 76, 12,145,
+203,229,228,217,179,103,100, 74,192, 32,114,111,102,127,114, 97,144, 39, 57,212,171, 41,217, 58,176, 13, 25,212,171, 39,249,241,
+199, 31, 73, 68, 68, 4, 89,177, 98,133,209,198,198, 70,142, 58,124,180,196, 98,241,229,227,199,143,199, 2,136,101, 50,153,177,
+ 50,153, 44, 86, 46,151,159,205,202,202,218,229,237,237,253, 85,171, 86,173, 38,250,248,248,244,237,211,212,237,171,126,166,188,
+151,253,205,248,175,154,139, 4, 91,241,231,184, 87, 85, 48, 7,220, 60,220,221,229, 55,110,220, 48,106, 52, 26,114,235,214, 45,
+ 99,139,230, 94,234, 45, 99, 7,159,124,189,119,195, 73,245,249, 95, 47,150,157,249,249,206,137,105, 1,241,189, 5,140, 95,187,
+ 10,171,194,113,124, 40,198, 3, 56,141, 63, 86, 29, 78, 5,112, 6,117,175, 66,100, 0,216,191,118,237,218,234, 43, 13, 1,128,
+209,166, 77,155, 88, 66, 72,108,155, 54,109, 98, 27, 91, 17,129, 64,176, 36, 50, 50, 50,196,213,213,117,211,184,113,227,246, 74,
+165,210,115, 19, 39, 78,140, 71,197, 98, 16, 10, 21,217, 17,134, 57, 59, 59, 23,196,197,197,145,235,215,175,147, 49, 99,198,200,
+ 57, 28,206, 36,250, 54, 78,131, 6, 13, 26,255, 21,204,174,229,187, 78,172,139,143,143,175,140,161, 53,183, 46,242,229,203,151,
+199,198,196,196,196,162, 34, 74,124,157, 96,177, 88,167,230,205,155, 71,236,237,237, 21,118,118,118,167,216, 76,230, 76, 23, 19,
+248,225,195,150,186,247, 12, 11, 11, 27,241,195, 15, 63, 12, 5,208, 25, 0,219,201,201, 41, 39, 47, 47, 79,113,231,206, 29, 69,
+247,238,221, 21, 54, 54, 54, 18, 95, 95, 95,197,150, 45, 91, 20, 58,157, 78,177,100,201, 18, 5,254, 28,239,171, 38,240, 1,204,
+231,114,185,167, 90,180,104, 17,191,122,120, 95,221,166,133, 51,201, 84, 79, 91, 5,128, 31, 0,204, 3, 96, 1,128, 29, 24, 24,
+120,229,197,139, 23, 23,125,125,125,247, 52,128,215,177, 85,171, 86, 87,143, 30, 61, 26, 19, 17, 17, 17,251,229,151, 95,198, 88,
+ 91, 91,103, 39, 39, 39, 27,213,106, 53, 41, 41, 41, 33, 82,169,148,156, 59,119,206, 96,101,101,181,179,214,134,243,152,185,228,
+210,225, 26, 67, 56,100,173,154, 68,186,115, 25,111, 62,164,167, 8,133,194,226,162,162, 34,146,151,151, 71, 82, 83, 83,201,201,
+147, 39,201,224,110,157,200,177, 79, 71,147,195, 51, 70,144,205,131, 59,145,206,166,124,165,216, 84, 20, 99,106,106, 42,105,200,
+170, 67,177, 88,124, 89,163,209, 84,133,111,112,118,118,142,245,246,246,142,240,245,245,221, 26, 25, 25,185,104,219,182,109, 35,
+250, 52,117,251,106,253,160,110,170,178,232, 19, 68,126,252, 7,178,188,189,151,250,173,152,175, 17, 78,214, 86, 97, 55,174, 95,
+ 55, 86,138, 95,189, 94, 79, 78,159, 58, 69,198, 14, 25, 16, 95,122,225,183, 95,110, 5, 47, 56,186,164,189,215,233,238,124,140,
+175, 75,176, 85,189,138,136, 96,237,111,198,216,245,145,171, 85,110, 79,115,198, 15, 93, 76,223, 73, 47, 53,214,203,203, 43,149,
+ 16,146,235,227,227,147, 10,224,176,143,143, 79,245,255,167,213, 66, 91, 21,156, 52, 36, 36,132,188, 29, 31, 12, 0, 65,235,214,
+173,139, 37,132,196,122,122,122,222, 6,128,182, 66,216,244, 50,103,252, 50,220,221,190,168,151, 57,227,151,182,194,154, 83, 70,
+185,113,208,188,167,173,224,214, 8, 79, 7,121,111, 39,243,155,135, 15,236,219,244,209, 71, 31,237, 5,176, 19,192, 55,214,214,
+214,183,198,143, 31,159,112,232,208,161,132, 45, 91,182,148, 39, 39, 39,147,233,211,167, 43,121, 60,222, 55,244,125,144, 6, 13,
+ 26, 52,254,107,168,140, 12,239,208, 24,161, 53,236,171,175,190,138, 37,132, 84,198,210,154, 92, 67,153,225,171, 86,173,138, 37,
+132, 84, 70,135,127, 63,128, 89, 77, 1,205, 66,118,237,218, 69,120, 60,222, 47, 31,216,152,234,156,226,145, 35, 71,118,145,201,
+100, 29,237,237,237, 59,190,181, 92,185,216,216,216,164, 30, 57,114, 68,161, 82,169, 20,132, 16,133, 94,175, 87,196,196,196, 40,
+122,247,238,173,168,246,214, 95, 95, 61,223,193, 74, 49,110, 63, 90, 61,131,172, 20,227,246,123,155, 38,237,223,191,255,124, 90,
+ 90,218, 89, 51, 51,179,101, 13,228,116,177,181,181, 13,178,178,178,186,104, 99, 99,179,210,202,202, 42,183,188,188,156,148,148,
+148,144,151, 47, 95,146,235,215,175,147,123,247,238, 17, 43, 43,171,236,218,234,217,207,132,117,191,100,211,124, 98,220,191,142,
+104,119,172, 32, 0,136,116,219,114, 82,248, 99, 40,121, 52,107, 16,233,205,103,222,253,128,243, 9, 11, 11,139,159, 79,157, 58,
+101, 76, 73, 73, 33, 81, 81, 81,228,220,185,115,100,225,194,133,164,185,163,131,166, 11,151,145,223,147,199,186,248, 33, 1, 75,
+ 53, 26, 77,172, 76, 38,139, 85, 40, 20,177, 45, 90,180,136,237,212,169, 83, 68,151, 46, 93,182,158, 56,113, 98,209,250,245,235,
+ 71,244, 51,229,189, 44,139, 62, 65,200,151, 67, 8,153,223,131,188,154,217,155,244, 53, 97, 61,169,149,211,222, 62,187, 50, 90,
+187, 82,169, 36, 55,111,222, 36, 87,175, 94, 37, 98, 27, 27,153,191, 9,115,118,119, 30,122,117, 55,131, 69, 67,235,217,199,156,
+113,224,254,143,223, 26, 84,231, 15,145,223,166, 14,209,247,182, 96,236,170, 86,238, 24, 33, 36,119,204,152, 49,175, 9, 33,185,
+ 39, 79,158,204, 34,132,228,142, 30, 61,250, 53, 33, 36, 23,192,209,154, 56,223, 11, 78,186,255,173,200,154, 31, 18, 18, 18, 75,
+ 8,137, 13, 9, 9,137, 5, 42,130,168,246, 50,103, 28,124,176,103,179, 81,115,238, 32, 57, 49,125,168,161,151, 57,227, 96,141,
+245,180, 96,157,141,219,191,141,104, 47, 30, 38,167, 22, 78, 52,244, 16,155,221,240,242,242,218,188,104,209,162,136,123,247,238,
+ 61, 53, 24, 12, 9,169,169,169, 9, 59,119,238, 76,232,218,181,235,109,107,107,235,120, 46,151, 59,175,190,107,244, 31, 2,205,
+ 73,115,210,156, 52, 39,141,247, 13, 76,117,108, 59,187,113,227, 70, 33, 33,100, 73, 96, 96, 32, 54,108,216, 48,182, 85,171, 86,
+227,157,156,156,108, 1, 32, 39, 39,167,236,217,179,103,178,192,192, 64, 4, 5, 5, 97,211,166, 77, 91, 81,225,203,242,127,137,
+188,211,167, 79, 59, 47, 88,176, 64,178,126,253,122,227,244,233,211,125, 0, 60, 43, 44, 44,108, 62,113,226,196,249, 44, 22, 43,
+208,205,205,205, 55, 55, 55,183, 64,165, 82, 29, 6,176, 7,245,204,153,214, 6, 30, 3,134, 14, 77, 28,112,145, 1, 67,181,159,
+135, 4, 5, 5,141, 27, 61,122,116,249,182,109,219,244, 50,153, 44,178,129,116, 89, 5, 5, 5,107, 42,255,177,178,178, 18, 63,
+121,242,100,158,157,157, 29, 35, 53, 53, 21, 26,141, 6, 41, 41, 41, 70, 84, 76, 77,213, 8,133,158,108,255,233,228,101,239, 37,
+147, 2,204,202, 18, 31,131,195,100, 66,199,230, 34,239,254, 69,236,191,153, 40, 83,150, 99,199,135,180, 83, 42,149,126,183,112,
+225,194,137,203,150, 45,227,187,185,185, 81,119,239,222,197,241,227,199, 53, 18,137,100, 48,128, 27,127,132,126,106, 28,140, 70,
+ 35,184, 92, 46, 0, 96,249,242,229, 96, 48, 24,108,137, 68,194,165, 40,138, 71, 81,148,128,162, 40,166, 46, 45, 1, 70, 89, 9,
+242, 75,164,200,202,151,214,201,103, 48, 26,143, 63,120,240, 96,113,187,118,237, 24,143, 30, 61, 66, 65, 65, 1, 82, 82, 82,136,
+129,144,163, 55, 85,134, 10,167, 68, 77,195,235, 39,176,178, 30,217,214,146,199,224, 30, 8,130,191,150,193,220,109,196, 24, 84,
+196,210, 2,128,253, 20, 69,113, 0, 20,181,104,209,162,207,139, 23, 47, 76, 90,180,104,161, 74, 76, 76, 60, 79, 81,148, 19,128,
+131, 53,113,154,152,152, 20, 2, 40, 60,121,242, 36, 0,204, 66,197,201,107, 31, 28, 28,156,123,243,230, 77,132,132,132,228, 3,
+216, 5, 0, 34, 75,235,225,190,230, 28,138,251,107, 8,186,106,192,216, 97, 36, 53, 90, 93, 69,118,246,125, 91, 9, 25, 96,239,
+251, 26, 29,197,222, 12,174,190,188,117,104,104,232, 77,133, 66,161, 57,118,236,152,118,218,180,105,204,228,228,228,135, 0,110,
+ 1, 56,137,183, 62,150, 52,104,208,160, 65,227,191,138,247, 45, 88,245,250,104,189,175, 90, 55, 0,248, 41, 41, 41,169, 42,169,
+116, 82, 82, 82, 44,128,221,168,136, 6, 63,172, 17,138,119,245, 91,139,214,158, 15,108,204,251,156,124, 63, 63, 63,147, 23, 47,
+ 94,112, 80,115, 18, 71,234, 3, 56,255,132,154,114, 29,122,121,121,125,175,211,233, 34,118,239,222,125,130,201,100, 78,252, 11,
+106,223,205,211,211,179,228,200,145, 35,198,168,168, 40,178,122,245,106,131,131,131, 67, 9,254,236,163,245, 14,167, 63,151, 25,
+190,212,199, 73, 22, 51,185, 7,121,181,104, 56,185, 53,169, 55,153,237, 36,146,249,243,153,199,255,226, 91,137,167,185,185,249,
+126, 19, 19, 19,153,153,153,217,101, 0,221,254,202, 53,178,182,182, 62, 36, 22,139, 47, 87,255,216,219,219, 71,216,218,218,254,
+ 96, 99, 99,179,218,194,194, 98,142, 59,159,187,109, 81,115, 71,117,252,200, 22, 36,186,187, 45,153,100,195,125,127,234,240,253,
+122, 58,184,187,187, 23,133,133,133, 25,207,158, 61, 75, 86,172, 88, 97,108,210,164,137, 12,117,248,181,213,105,209,178, 96, 30,
+ 15, 31,221,197,152, 63,212,137,108,240, 49, 53,246,177,100,214,182, 66,113,210, 91, 1, 60,181, 62, 78, 15, 15,143,221,132,144,
+ 3,107,215,174, 61,128, 63,114,129, 14, 8, 13, 13, 13, 38,132, 4,135,134,134, 6, 3, 24, 4, 0,254,230,140,176,195, 35, 58,
+ 24,114, 62,114, 36,223,250,136, 12,254,230,140,176, 26, 45,153, 86,172,211,103,102, 14, 53,230,206,236, 78,130, 60,133,134, 46,
+ 86,188, 43, 92, 46,119, 17, 42, 44,206,157, 0,112,233,183,102,154,147,230,164, 57,105,139,214,255,156,240,106, 16,196, 86, 86,
+ 86,251,155, 53,107,118,194,205,205,237,132, 72, 36,218,138, 10,167,249,198, 94, 8,247,117,235,214,201,204,205,205,219,254, 7,
+ 47,174, 29, 0, 39,252, 57,113,238,127,172,195,172,113,192,130,228,101, 99,159,172,113,192,130,106, 63,119,242,241,241,249, 22,
+ 21,209,188,255,106, 39,116,179,178,178,218,105,101,101,149,253,214, 55,203,173, 33,156, 29,152,204,137,125,248,204,187,221,184,
+140,188, 62,124,214,157,142, 76,230,132,191,233, 0,172,107,177, 69,109,156,206, 54, 54, 54,219,172,172,172,114,108,108,108,118,
+ 54, 82,100,189,195,217,214, 4, 14,125, 45,152,167,187,153, 82,202,190,230,204,147, 29, 4,181, 47,234,104, 68,219,253, 66, 66,
+ 66, 62, 33,132,124,226,232,232, 24, 88, 77,248,251, 6, 5, 5, 5, 16, 66, 2, 42, 35,192,119, 18,192,174,183, 5,243, 72,119,
+ 51, 74,218,219,130,121,164,147, 0,118,181,213,179,143, 5,243,120,119, 51, 74,234,111,198, 56,226,202, 67, 19,250,102, 78,115,
+210,156, 52, 39, 45,180,254, 25, 66,139,238, 48, 52, 39,205, 73,115,210,156, 52, 39,205, 73,115,210, 66,171,102, 97, 85,253, 83,
+ 53,195,198,162,207, 13, 13, 26, 52,104,208,160, 65,131,198, 95, 66,173, 1, 75,169, 58, 84,105, 99, 28,219, 63, 68,217, 70,211,
+156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,172,143,251,255,122, 97,221,223, 26,180, 89,149,230,164, 57,105, 78,154,
+147,230,164, 57,105,206,127, 45, 24,244, 41,160, 65,131, 6, 13, 26, 52,104,208,248, 75,240,123,251,253,126,224,210,154,125,180,
+ 88,157,214,230,235,245,122, 59, 0, 96,177, 88, 18,221,195,213, 14,117,177,179,129,126,250,138,244, 59, 96, 1,179,244,192,229,
+ 26, 56, 47,235,245,122,203,183,156, 37,186,135,171, 7,213,201,217,105,237,197,234,229,245, 15, 87, 15,120,191, 12, 1,152,236,
+ 78,107,115,222,171,171, 99, 67,207, 10,133,119, 98, 98,253,215,234,249,119,225,252, 55,131,221,121,109,190, 78, 87,209,143,216,
+108,150,164,252, 65,221,253,136,211,121,109, 78,245,242,186, 7,171,237,235,226, 20,152,240,138, 60,156,108,183,214,197,153,154,
+ 83,184, 68, 89,166,182,174,139,179,177, 99,211,197,193,161,159,225,237,216,100, 2,179,178,115,115, 47,255,143,245,165, 14, 0,
+ 86, 3, 48,171,246, 91, 60,128,207,233, 94, 73,131, 6,141,191,153,208,138, 67, 69,158,195,159,223,138,173,159,107, 21, 90,122,
+189,222, 46,246, 84, 48,148, 26,160,223,148,181,118,238, 35,247,252, 41, 81,178, 94, 93,194,149, 62, 63,230,203,212,201, 44,109,
+ 89,229,102, 57, 57, 57, 20, 0, 80, 20,245, 11, 0,215, 26, 56, 45, 99, 79, 5,163, 76, 11,248,143, 15,181,116, 5,204, 10, 56,
+156, 47, 76,132,194, 62, 42,149,170, 21, 0,152,152,152, 60, 87, 41,149,215,108,203,203,183,188, 95,190,182,150, 85,175,107,223,
+201,107,237,124, 70,238, 89,104, 48, 26,185,111, 30,237,246, 87, 23, 38,179,216,122,205,174,149,192,249,224, 26, 68, 85, 45,124,
+127, 28,247,227, 21,214,108,160, 47,151,207,111,107, 97,105,217,211, 72, 72, 11,163,209, 72, 25,244,250, 4, 89,105,233, 45,163,
+ 94,255, 68,175, 85, 90,199, 70,126,107,172,171,158,239,183,229, 99,128,117, 10, 8, 20,138, 68,125,152,108,118, 55, 0, 48,232,
+116,119,149, 10,197,181, 81, 64,120, 67,218,222,208,243,243,161,229,255,109,208,233,244,118,105, 23,131,161,209, 1,126, 99,190,
+181,107, 51,241,215, 35, 0,160,149, 60,177, 87, 36, 71,118, 6, 0,161, 71,192, 3,158,216, 47, 31, 0, 88, 25,185,118, 47,163,
+ 86, 65,163, 3, 90, 4,132,218,213,199, 57, 45,232,184,245,178,217,163,121, 0,112,233,228, 15,205,175, 70,252, 52, 4, 0,250,
+142,158,123,126,224,152, 5, 47, 1, 96,211,207, 17,214, 71,191, 29, 91, 39,103,195,198,102, 41,167, 52, 57,202, 83, 43,203,181,
+112, 17,178,196,201,201,201, 12, 0,112,116,116,108,208,216,116, 6,204,115,129,249, 12, 38,179,167,135,167,167, 31, 0,146,250,
+234, 85,156, 65,175,191,237, 0,236,250, 15,247,165,133,132,188, 27,156,149,162, 40,186, 67,210,160, 65,227,239,134,115,111,197,
+213,185, 63,189,204,214,182,135, 82, 3,220, 72, 1,122,117,105,131,217, 19, 63, 18, 85,223, 22,190, 39,212, 53,249,209, 25,159,
+125,191,110, 97,180,105,211, 6,105,105,105, 13,170, 69,153, 22,184,158, 12, 64,250,194,180, 68, 40,124,181,109,243,102,179, 1,
+ 3, 6,176, 28, 29, 29, 65, 81, 20,242,242,242,186, 68, 71, 71,119, 88,188,120,241,167,144,190, 40, 41,211, 66,126, 61,185,126,
+222,202,186,182,106,222, 4,171, 23,140, 53, 7,128,149, 83,118,117,120,148,148,111,245,234,213,171,126, 95,125,245, 85, 17,243,
+218,181,159,108,128, 3,249, 64, 86, 67,234,121,232,236, 3,190,121,238,111,238,147, 22, 44, 56,233,233,233, 41,114,115,115,163,
+ 76, 77, 77,193,100, 50, 81, 82, 82,226,250,236,217,179, 33, 15, 31, 62, 84, 70,223,248,133, 27,243,112,120,170,132,223, 89,221,
+160,182,171,114,248,151, 76, 77,159, 79, 30, 53,202,121,236,216,177,124, 15, 15, 15, 0,192,171, 87,175,188,194,195,195,199,159,
+ 60,121, 50, 8,170, 28,125,153, 22,234,250,218, 94,197, 9,128, 15,116,179,176,179,155,196,100,179, 91,233,245,122,167,183,214,
+134, 55, 6,157,238,185, 84, 34, 57,252,126,121, 26,127,134, 70, 7,188,200, 5,250,247,244,195,228,209,253,133, 0,240,213,184,
+117, 93, 50, 94,167,112,180, 90, 45,154,123,183,232,254,205,183, 91, 47,130,193, 64, 88, 68,116, 85,249,134,112,198,191, 72, 67,
+240, 55,219,144,243, 52,188,139,161, 52,165,143, 92, 86,202, 4, 0, 51,115,243,209,225,199,126,187,230,232, 27,120, 63,165,176,
+188, 65,156,117,141,205, 11,199,118, 58,100, 63,187,214,242,199, 75,251,217,174,174,174,120,250,244,105,227,198,102,105,146,169,
+209,193, 33, 97,203,151, 95,138,253,253,253, 33, 18,137,192, 98,177,160,215,235,251,223,190,125,187,127,112,112,240, 92,148, 38,
+ 41, 27, 58, 54, 27,128, 45, 20, 69,245,153, 54,123,161,195, 71, 35, 2, 49,122,112,119,186, 35,210,160, 65,227,239,134, 74,235,
+ 85,245,149,135, 63,215, 41,180, 88, 44,150,100,192,212,245,118, 61, 59,183,198,163, 39, 47, 75,211, 51,115, 21,149,219,138,159,
+135, 55, 31,209,221,169,229,205,155, 55,160,209,104,112,247,238, 93, 60,121,242, 4,175, 95,191,198,156, 57,115, 52,111,167, 14,
+107,226, 44,241, 31, 31,106,137,210,100,145, 23, 55,169,105,116, 98, 34, 83,173, 86,227,230,205,155, 40, 41, 41, 1,151,203,133,
+179,179, 51, 6, 14, 28,200, 74, 76, 76,180,234, 55, 96,176,185,255,224, 9,105, 48,247, 82,176, 88,172,146,218,242,136,176, 88,
+ 44, 73,191, 41,107,237, 90,122, 53,193,171,244,156,210,213,223,238, 83, 24,141,132,149,250, 58,163,252,198,141, 27,240,243,243,
+195,229,203,151,173,139,139,139,191,222,181,107,215,106,246,198, 31,183,235,180, 69, 75, 81, 59, 95,137,255,248, 80, 75,107,201,
+ 9,183,171, 23, 78,115,158, 63,127,206,217,189,123, 55,138,138,138,192,229,114, 97, 97, 97, 1,177, 88,140,230,205,155, 83, 43,
+ 87,174, 20, 5, 4, 60,199,103,179, 2,221,202,221,103, 38,213, 86,207,170,182, 43, 50, 4, 54,178, 75, 30, 17,231,206, 49,122,
+244,232,241,206,107,123,179,102,205, 48,104,208, 32,254,164, 73,147, 60,198,142,159,104,244, 31, 58,237, 21, 68,110,101,245,114,
+ 42,179, 76,172,203,238, 57,246, 31, 63, 62, 50, 52, 52,212, 66, 44, 22, 67, 40, 20, 2, 0, 74, 75, 75,157,211,211,211,187, 4,
+ 5, 5,141,121, 16,127,140,229, 31,144,149, 3,161,139,170,174,243,249,111, 5,155,205,146, 84, 90,145, 76,133, 38, 37, 89,217,
+249, 74, 0,208,106,181,208,106,181,208,104, 52,152, 55,119, 14,115,214,152, 78,158,110, 61, 23, 62,126,253, 38,191,184, 69,244,
+125,171,202,125,117,245,112,178,202, 94, 75,165,153, 87,102, 5,127,249,165,216,222,254,143, 25,193,176, 67,135,152,197,197,197,
+253,131,131,131, 91, 18, 65,111,105,139,128, 80,139,186, 56,235, 26,155,210,151,231,154,126,179, 96, 80,219, 61,223, 70,193, 96,
+ 48,224,222,189,123,184,121,243, 38,182,110,221, 74,206,159, 63, 95,106, 38, 20,206, 66,157, 99, 51,201,180,135, 67,158,251,198,
+141, 39, 41, 30,143,135, 51,103,206, 32, 49, 49, 17, 12, 6, 3,109,218,180,193,228,201,147,209,191,127,127,241,236,217,115,136,
+255,224,113,169, 48,247,150,255,197,190,196, 0,176,112, 69,240, 70,135, 41, 51,231, 99,211, 55, 43,105,161, 69,131, 6,141,191,
+179, 53,171,214, 16, 15,136,138,138, 34,111, 63,189, 0,128, 0,140,102, 35,247, 28, 61, 17, 99, 60,215,108,228,158,163, 4, 96,
+ 16,128, 97, 6, 52,105,215,174,157, 78, 42,149,146,135, 15, 31,146,121,243,230, 41,183,111,223,126,237,220,185,115,225,250,242,
+242,189,142, 14, 14,223,145, 90, 28,236, 9,192,112, 3,204, 5, 2, 65, 65,102,102, 38,249,253,247,223, 73, 72, 72, 8, 57,124,
+248, 48, 57,127,254, 60,137,142,142, 38,231,207,159, 39, 71,143, 30, 37,241,241,241,228,229,203,151, 68, 40, 20, 22,184, 1,230,
+117,112, 50, 9,192,108, 62,114,247,210,147,143,116,161,222, 35,247, 44, 38, 0,211, 18,240,105,215,174,157, 33, 60, 60,156,132,
+133,133,145, 95,127,253,149,196,199,199,147,194,194, 66,194,226, 9, 11, 42,247,171,173,158, 4, 96, 56, 57, 57, 21, 72,165, 82,
+226,226,226, 66,184, 92, 46,177,183,183, 39,205,155, 55, 39, 93,186,116, 33, 67,134, 12, 33, 19, 39, 78, 36, 95,127,253, 53,145,
+ 74,165,132,207,231,231, 87,238, 87, 27,167, 31, 96, 34, 20, 10, 51, 99, 99, 99, 73,109, 80,169, 84,164,176,176,144, 92,188,120,
+145, 8,133,194, 76, 63,192,164, 46, 78, 19,160,189,175,175,111, 65, 97, 97, 33, 41, 47, 47, 39,153,153,153,228,217,179,103, 36,
+ 49, 49,145,100,102,102, 18,149, 74, 85,197,253,242,229, 75,226,238,238, 94, 96, 2,180, 39,244, 34,136, 90,251,210,251, 31, 87,
+123,251, 33, 98,177, 88,117,242,228, 73,242,230,205, 27,114,240,224, 65,194, 0,214,189, 95,174, 46, 78, 46, 48,176, 71,143, 30,
+134,123,247,238,145,199,143, 31,147,229,203,151,147, 65,131, 6,145,193,131, 7,147,224,224, 96,146,157,157, 77,178,179,179,201,
+144, 33, 67, 12, 92, 96, 96,125,253,179,166,177,105, 14,184, 6, 4, 4,168,202,203,203, 73,106,106, 42,105,213,170, 85, 54, 19,
+152, 36, 4, 90,246, 2,120,245,245, 79, 39,192,210,193,193, 33,247,222,189,123, 36, 34, 34,130,184,185,185, 21, 48,129,105,102,
+ 64, 51, 51,160, 25, 19,152,214,172, 89,179,130,123,247,238,145,162,162, 34,226,234,234,154,235, 4, 88,254,133,190,196, 0,176,
+127, 69,240, 70,146,148,173, 36, 43,130, 55, 18, 0,153,132, 16,130, 26,124, 60,105,208,160,241,207,199,251, 90,228,159,130,170,
+155,100, 64, 64, 0, 5,224,122, 93,133, 85, 76,230,250, 77,155, 54,177,212,106, 53,246,237,219, 39,255,120,204,152, 19,189,122,
+246, 76,109,234,230, 38,165, 24,140,122,179, 13, 23,240,120,139, 54,109,218,100,161,213,106, 17, 19, 19,131, 14, 29, 58, 64, 44,
+ 22, 67, 36, 18, 65, 36, 18,193,206,206, 14,222,222,222,144, 72, 36, 48, 53, 53,197,178,101,203,204, 11,120,188, 69,245,241, 26,
+141,132, 5, 0, 6,163,145,203, 1,102,187,119,236, 24, 19, 20, 20,196,176,182,182,134,149,149, 21, 68, 34, 17, 18, 19, 19,161,
+213,106, 33, 48, 17, 52, 40, 72, 43,131,193, 96,136, 68, 34, 92,189,122, 21, 11, 23, 46, 68,183,110,221, 96, 97, 97, 1, 83, 83,
+ 83,180,106,213, 10, 3, 7, 14,196,172, 89,179,144,154,154, 10,170, 1, 78, 37, 9, 44,214,252, 89,179,102,217,249,249,249,213,
+184, 93,173, 86, 67, 42,149,162,160,160, 0,206,206,206, 8, 12, 12,180, 75, 96,177,230,215,198,103, 13,136,157,189,188, 34, 31,
+ 62,124,104, 35, 20, 10, 17, 22, 22,134,211,167, 79,227,194,133, 11,248,253,247,223, 17, 21, 21,133, 51,103,206,160,160,160, 0,
+ 0,224,229,229,133,227,199,143,219,136,236,236,162,172, 1, 49, 61,164, 27,134,140,252,252, 75,173,242,242,108, 38, 77,156,120,
+ 75,161, 80, 96,210,164, 73, 88,191, 97,195, 74, 54,176,184, 33,251,123, 3,230, 86, 14, 14, 7, 54,110,220,200,200,203,203,195,
+168, 81,163, 10,183,108,216, 48, 35,238,226, 69,143,216, 11, 23, 60,214,135,134,206,232,213,171, 87, 97,118,118, 54, 14, 29, 58,
+196,176,119,117, 61,224, 13,152, 55,182,158,114, 96,225,247,223,127,207, 87,171,213, 24, 48, 96, 64,170,241,249,115,111, 61,240,
+155, 2, 72,188, 14,148,215,183,127, 46, 48,127,217,178,101, 98, 30,143,135, 47,190,248,162,176, 44, 35,163,181, 30,248,181, 20,
+ 72, 47, 5,210,245,192,175,242,180,180,214, 83,166, 76, 41,228,241,120,216,182,109,155, 56,247,143,164,219, 13, 69, 7, 0,145,
+ 0,110, 0,200,153, 54,123,225, 52,191, 78, 93,113,104,239, 46,124, 27,250,213, 1, 0, 31, 83, 20,117, 24,192, 82,186,231,209,
+160,241,239, 68, 67,180,200,255, 40,106, 77,185,195,170,174, 36, 1,244,174,139,197,210,218,186, 67,235,214,173,113,243,230, 77,
+248,250,250, 62,180,176,176,208,115,120, 60,176,217,108, 16, 99,189, 58, 11, 38, 66, 97,191,254,253,251,179,238,223,191, 15,119,
+119,119,152,152,152,128,205,102,191,243,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 7,141,230,155,
+122, 31,136,201,207, 68, 5,247, 55, 78,252,229,224,129,102,254,254,254, 40, 45,149,193,104, 52, 66, 32, 16, 64,171,213,130,197,
+ 98, 85, 76, 1,233,136,172, 33,103,204, 96, 48, 24,152, 76, 38,220,221,221,177,126,253,122,168,213,106,112, 56, 28, 0,128, 76,
+ 38,131, 84, 42,197,179,103,207,144,158,158,142,183,111,225,117,194,212,220,252,163,177, 99,199,214,152,240, 87,163,209,160,180,
+180, 20,165,165,165,144, 74,165, 80,171,213,232,218,181, 43,247, 92, 84,212, 71, 40, 42,218, 82,227, 62,124,254,152, 67,135, 14,
+217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,
+141, 28, 57,146,146,201,100,160, 40, 10, 1, 1, 1,214, 71,194,194,198, 66,171,221, 74, 15,233,134,225, 18,160,105,175,213, 14,
+235,220,169,211,213,135,143, 30,249, 45, 90,180, 8,241,241,241, 27, 5,199,142,221, 40, 3,158,212,181,111, 42, 48,255,187,106,
+ 2,134,100,100,248,150, 3, 5,213,138,164,187,165,165, 93,152, 50,101,202,211,248,248,120,155,109,219,182,137, 63, 30, 53,106,
+ 62,128,117,141,169,163,169,185,121, 71, 7, 7, 7,156, 63,127, 30,153,175, 95,127,165, 7, 84,141,122,227, 98, 50,123,248,251,
+251,227,204,153, 51,200,206,200,248, 74,255,110, 29, 43, 94,148,128, 2, 86,106,234, 87, 7, 14, 28,216, 63,125,250,116, 48, 89,
+172, 30,208, 55,106,226,240, 79,142,239,211,231, 44,194,129,159,119, 28, 0, 48, 19,128, 17,192, 67,186,199,209,160,241,239,182,
+106,213,167, 69,254, 70, 98,235,231, 70, 91,180,236,236,236,156, 68, 34, 17,114,114,114,208,194,199, 71,194,227,241,192,101,179,
+193,231,114, 27, 84,131,178,178, 50, 95, 71, 71, 71,148,150,150,194,198,198, 6, 28, 14,167,234,195,229,114,171,254, 54, 53, 53,
+ 5,131,193,128,171,171, 43,202,202,202,124,235,229,205,127,102,119,108,199,220,121,247,110,156,111, 54,106,212,104, 88, 90, 90,
+193,197,197, 25,118,118,118, 48, 49, 49,129,139,139, 11, 60, 60, 60,200,150, 45, 91, 32,176,107,211,160, 27,121,117,241,196, 98,
+177, 96, 48, 24,144,159,159,143,164,164, 36,196,199,199,227,222,189,123,120,252,248, 49,228,114, 57, 26,160,179, 80,166, 82,181,
+101,177, 88, 53,138, 44,169, 84, 10,169, 84, 90, 37,180, 10, 10, 10,144,158,158, 14,133, 82,217,174, 14,209, 59,186,117,235,214,
+ 76, 0, 48, 49, 49, 65,187,118,237,176,103,207, 30,253,217,211,167,199,181,188,119,207,202,229,226, 69,139, 95,118,239, 30, 23,
+ 24, 24,104,184,127,255, 62,100, 50, 25, 94,188,120, 1, 91, 91, 91, 22,151,207, 31, 75, 15,231,198, 33, 22, 80,218,200,229,131,
+187,117,235,150, 86, 90, 90,138,205,155, 55, 51,216,166,166, 63,135,214, 50,197, 87, 5, 38,179,187,191,191, 63, 34, 35, 35,145,
+147,145,177, 60,163, 6, 1,147, 1, 20,100,166,166, 46, 63,112,224, 0, 6, 14, 28, 8,138,197,106,180,163, 82,151, 46, 93, 90,
+ 27,141, 70, 60,125,250, 20, 22,192,131,198,238,239,225,233,233, 87,105,249, 21, 2,183,106, 43, 39, 4,110,197,197,197,193,196,
+196, 4, 45, 90,182,108,223,200,195,108,161, 40, 42,119,250,156, 69,136,184,112, 7, 0,112,224,231, 29,249,213, 68, 22, 13, 26,
+ 52,104,139,214,223,213,162, 85, 41,172,170,127,240,142,208,106,160,248, 0, 0,176,217,108,112,121, 60,112,185,220, 10,129,196,
+227, 53,152,131,162, 40,240,249,252, 42, 97, 85, 93, 96, 85,255, 91, 32, 16, 52, 72,192, 0, 64, 73,202,133,158, 51,103, 76,231,
+242,120, 60,104,181, 26, 16, 66,192,227,241, 97, 97, 97, 1,119,119,119,200,100, 50,116,235,222, 75,147, 37,229, 68, 89,183, 24,
+ 25,255, 33,103, 79,175,215, 67,169, 84,162,164,164, 4,197,197,197,144,201,100, 80,169, 84, 13, 94,138,110, 52, 26,153, 89, 89,
+ 89,248,237,183,223, 80, 84, 84, 4,160,194,209,186, 82, 92, 85,126,167,165,165, 33, 44, 44, 12,175, 95,191,110,212,245,233,217,
+179, 39,162,162,162,152,189,251,245,219,123,217,205, 45,231,178,155, 91, 78,239,126,253,246, 70, 70, 70, 50,157,156,156,144,158,
+158,142,152,152, 24,148,148,148,128, 16, 66,175,159,255, 0,188, 2, 74,202,138,139,167,175, 92,185,146,136, 68, 34,108,254,238,
+187,182,235,128, 9, 13, 21, 48,230,117, 8, 24,243,191, 38, 96, 64, 8,129,209,104,132,193, 96,248,160,182, 81, 20, 69,177,217,
+236,198,134, 86,104, 76,225, 42,199,247,101, 95,175,199,239,103,194, 43,127, 79,166, 69, 22, 13, 26, 52,254, 1,168,213, 17,158,
+ 85, 77, 65, 86,125,215,134,252,252,252, 55, 74,165,178,153,155,155, 27,178,179,179,237, 92, 93, 93, 51,184,108, 54, 56, 92, 46,
+ 40, 70,253,154, 64, 32, 16, 60,205,201,201,233,238,228,228, 4,189, 94, 95, 37,170,222,159, 58,172,180,210, 60,126,252, 24, 2,
+129,224, 41,212,117, 70, 78,128, 65, 91,210,164,125,251,246, 85,150, 33, 11, 11, 11, 88, 88,152,131,199,227, 99,213,170, 85,198,
+109, 91,182,236,114,237, 27, 90,250,201,226,149,100,229,186,189,255,209, 51,219,208, 7,147, 64, 32,120,234,226,226,210,213,220,
+220, 28, 17, 17, 17, 72, 79, 79, 71, 73, 73, 9,202,202,202,160,209,104, 80, 86, 86, 6,173, 86, 11, 62,159,143,150, 45, 91,194,
+204,204, 12,209,209,209, 79,161,209,212, 44, 46,139,138, 34,158, 62,125,218,181, 83,167, 78, 85, 22,149, 62,125,250, 80,125,250,
+244,177,169,178,162,149,149,161,176,176, 16, 15, 31, 62, 68,116,116, 52, 40,148, 28,221,209, 0, 0, 32, 0, 73, 68, 65, 84,138,
+ 66,114,114,178, 65,163, 82, 29,165,199,196,135, 65, 13,220,101, 30, 56,176,255,211, 79, 63,157,209,189,123,119, 24,128, 33, 0,
+194,254, 63, 10, 24, 0,192,189,123,247,158, 25, 12,134,238,205,155, 55,135, 20,232, 12,224, 76,163, 68,100, 74, 74,156, 94,175,
+239,215,182,109, 91, 68,156, 56,209, 19, 64,122, 77,229,148, 64, 79, 63, 63, 63,168, 84, 42,188, 72, 72,136,109,132,200,218,187,
+ 34,120,227,180, 41, 51,231,227,208,222, 93, 56,240,243,142,172,253,123,182,187,160, 1,254, 99, 52,104,208,248, 87, 89,179,234,
+213, 34,255,163,152, 93,155,248, 98, 53,134,165,180,164, 36, 54, 46, 46,174, 89,251,246,237,177,119,239,222, 78,221,186,118,125,
+195,225,114,245, 92, 14, 7,140, 6, 60, 72, 84, 74,229,149, 43, 87,174,116, 30, 57,114, 36,235,254,253,251, 16,139,197, 85, 66,
+171,242,155,197, 98,129, 16, 2,129, 64,128, 83,167, 78,149,171,148,202, 43,245, 90,139, 12, 70, 3,227,173,208, 35,132, 64, 42,
+149,130,195,225, 96,235,214,109,216,185,101,203, 68, 3, 16,238, 37,180,253, 18, 0,255,255,219, 3,186,172,236,234,239,191,255,
+222, 33, 40, 40,136,237,236,236, 12,169, 84,138,146,146, 18, 20, 21, 21, 65, 38,147, 65, 38,147,161,164,164, 4, 82,169, 20,124,
+ 62, 31,241,241,241, 58,117, 89,217,213,218,248,120,106,245,201,169, 83,167, 46,139,139,139,115, 96,177, 88,208,233,116, 48, 26,
+141, 48, 26,141, 40, 47, 47, 71, 74, 74, 10,158, 63,127,142,196,196, 68, 20, 23, 23,131,205,102,131,201,100,226,241,227,199, 37,
+ 66,157,238,132,150, 30,211, 31, 12, 54, 16,113,251,246,237, 25,147, 39, 79,134,163,179,115, 47,100,103, 55, 72,192,156,174, 67,
+192,148,126,152,128,249, 67, 0,201,229,143,210,210,210,186,247,238,221, 27, 14,206,206, 27, 91,102,103, 95, 78,104,132,159,150,
+ 65,175,191,117,251,246,237,126, 83,166, 76,193,222,189,123, 55,218,166,165, 93, 40,120,111,154,211, 22,176,109,234,225,177,113,
+218,180,105,184,116,233, 18, 12,122,253,173, 58, 40,171, 71,124,111, 50,109,246, 66,151,247, 28,223,247, 80, 20,181, 0,192,102,
+186, 71,209,160, 65,227,159,108,209,106,212,212,161,137,193,176, 98,233,210,165, 58, 6,131,129,209,163, 71,155,158,137,140, 12,
+124,252,228,137,187, 68, 34,177, 48, 24, 12,245,114,217,106, 52,219,151, 46, 93, 42,213,106,181,240,246,246, 70,113,113, 49, 12,
+ 6, 3, 88, 44, 22, 88, 44, 22, 40,138, 2,131,193,128, 72, 36, 66, 92, 92, 28,246,239,223, 47,179,213,104,182,215,251,144, 48,
+ 24,158,134,133,133,129,201,100, 18, 62,159, 15,138,162,192, 98,177,176,109,219, 54,201, 78, 32, 2, 0,152, 12,134, 22, 0, 24,
+ 12,170,161,222,187,245,206, 91,114,185, 92, 24, 43, 22, 1,212, 91,214, 82,163,249,126,211,166, 77,242, 23, 47, 94, 64,169, 84,
+ 86, 89,223, 20, 10, 69,149,115,189, 84, 42, 5, 69, 81, 80, 42,149,136,140,140,148, 91,106, 52,223,215,198, 87, 4,228,101, 39,
+ 39, 15,239,212,169, 83, 81, 90, 90, 26, 74, 75, 75,241,244,233, 83, 68, 71, 71,227,248,241,227,184,116,233, 18, 82, 82, 82,160,
+215,235,225,228,228, 4, 66, 8, 78,159, 62, 93,170,151,203,135, 20, 1,121,244,152,168, 29, 77,196,226,126,246,118,118,153,182,
+ 54, 54,217, 77,196,226,126,239,111, 55, 7, 94,190,124,249, 18,122,189, 30,238,238,238, 86,117,249,105, 17,189,254,246,237,219,
+183, 49,101,202, 20,184, 52,107,182,193, 13,176,125,191,140, 27, 96,235,230,225,177,161, 82,192, 16,189,254,118, 99,235,108, 10,
+236,248,242,203, 47, 85, 28, 14, 7,199,142, 29,115,215,121,122, 38,178,128, 9, 34,192,167, 55,192,169,111,127, 7, 96,215,215,
+ 95,127,157, 71, 81, 20, 14, 31, 62,108, 99,238,225,241,140, 5, 76, 53, 7,154,152, 3, 77, 88,192, 84,115, 15,143,103,199,142,
+ 29,179,209,235,245, 88,188,120,113,158, 3,176,171, 14,202,133,132,144, 97,132, 16,127, 66,136,203,254, 61,219,241,251,153,240,
+ 74,145, 53, 19, 21, 78,239,147, 1, 60,163,123, 28, 13, 26, 52,254,201,168,209, 12,197,234,180, 54, 31, 32,118,189,186,180,193,
+163, 39, 73,165, 54,150,102, 23, 43,183, 21, 63, 15,111,222,215,215,172,205,143, 63,254, 8, 54,155,141,172,172, 44, 36, 36, 36,
+192,204,204, 12, 19, 39, 78,212,168,228,242,225,213,114, 29,246, 7, 16,253,150,179, 34,159, 90,105,178,200,131, 21,223,236,194,
+239, 81, 76,115,115,115, 40, 20, 10, 48, 24, 12,240,249,124, 8, 4, 2,152,152,152, 32, 38, 38, 6, 67,135,141, 48, 20, 8,252,
+255, 8, 88,250, 71, 62,181, 42,206,202, 88, 67,157, 1, 65, 28,240,133,157,163,227,210,213,171, 87,155, 12, 26, 52, 8, 28, 14,
+ 7,206, 77,188,242,220, 7,111,222,193, 96, 80,250,236, 34,217, 42,143, 38,142,230, 9,201,233, 0, 40,137,238,225,106,199,106,
+185, 14,255, 84, 79, 87,237, 13,247, 83,191,110, 49,107,215,174,194, 31, 93, 42,149, 34, 63, 63, 31, 18,137, 4, 82,169, 20, 74,
+165, 18, 0, 16, 21, 21,133,223,111, 38,202, 84,206,129,169,181,213,243,143,182, 39,153, 58,150, 63,104,122, 36,236, 87,166,173,
+173, 45,242,243,243, 81, 80, 80, 0,169, 84, 10,149, 74, 5,131,193,128,226,226, 98,236, 59,240,171,161, 72,228,255,186, 42, 32,
+100, 93,156,202, 44, 19, 43,197, 29, 39,191,150,110,100,198,140, 25,166,102,102,102, 48, 26,141, 40, 41, 41, 65,102,102, 38,210,
+210,210,112,243,230, 77,165, 68,170,133,210,102, 64,118, 85,192,210, 26, 56,255,131,248,219,113, 86,143, 91,229,232,224,144,147,
+145,145, 97,103, 48, 24,224,228,228,164,151, 22, 23,111,224, 2,151, 76,129, 92, 0,164, 16, 88,253,253,142, 29,211, 71,140, 24,
+129,142, 29, 59,102,229,229,231, 55,173,169, 47, 17,128,233, 13,152,151, 57, 59, 63,127,248,240,161, 56, 51, 51, 19, 83,166, 76,
+ 41,204,120,245,106,121,165,191, 86, 41,208,211,205,195, 99,195,177, 99,199,108,154, 53,107, 6, 95, 95,223, 60,126,102,102,171,
+ 36,160,180,150,254, 89,235,216,148,190, 60,215,116,238,168,214, 29,231,205,155, 7,189, 94,143,155, 55,111,226,193,131, 7,200,
+200,200,192,157, 59,119,164,102, 66,225,184,106,185, 14,107,236,159, 67,188,148,238,135, 15,135, 81, 28, 14, 7, 7, 14, 28, 64,
+ 92, 92, 28, 0,192,207,207, 15,211,166, 77,131, 94,175,199,164, 73,147,201,185, 36,147,212,186,250, 39,128,214, 0,190, 67,133,
+200,235, 72, 8,225, 83, 20,149, 3,192, 5,141,243,201,162,251, 39,205, 73,115,254,123, 56,255,145,168, 55,215,225,218,159, 96,
+254,110,154,143, 89, 57,225,123, 66, 89, 61,122,250,251,132,134, 4, 51, 58,117,234, 4, 23, 23, 23,248,249,249, 33, 51, 51,147,
+103, 97, 97, 81, 95, 62, 53,133,255,224, 9,105,109,218,180,177, 88,190,124,185,249,192,129, 3,217, 46, 46, 46, 32,132, 32, 46,
+ 46, 14, 17, 17, 17,229,123,247,238,149,149,217, 15,147,198, 94,251, 77,209,144,124,106, 15,128, 50, 0,107,156,115,114,126,158,
+ 63,119,110,112,187,246,237,103,132,132,132, 48, 68, 2, 19,246,250, 85, 51,249, 0,176,246,135,227,230, 35, 2, 39,226,123, 79,
+160,215,132,154,243,200, 85,175,103,102,246,172,140,143, 70,245,243,252, 98,193,116,195,216,177, 99,133,102,102,102,112,113,113,
+129,165,165, 37, 82, 83, 83,145,157,157, 77,206,158, 61,171,184,247,248, 37,251,244,165, 71, 25,124,115,135,134,228, 37,148,251,
+ 15,250,248,245, 71, 31,125,100, 57,117,234, 84,211, 14, 29, 58,176,121, 60, 30,120, 60, 30,242,243,243,145,146,146, 82,126,246,
+236, 89, 69,153,221,144,146,216,107,199,228, 13,204,117,168,242, 31, 31,154,114,235,114,200,226,231, 79,159, 78, 54, 2,109,203,
+203,203,157, 12, 6, 3,197, 96, 48,114,141, 70,227,211,114,185,124,191,198, 47,100, 27,157,235,176, 97, 48, 24, 12, 28,131,193,
+ 0,169, 84,138,203,151, 47,179, 94,189,122,181,250,201,147, 39,171,115,114,114,160,211,233, 48,102,204, 24,248,249,249,225,218,
+181,107, 40,200,207, 63, 91, 23, 87, 18, 80,202,203,206,158, 54,107,214,172,243, 97, 97, 97,140, 39, 79,158,216, 28, 56,112, 96,
+ 95, 77, 2,102,242,228,201,198,252,204,204,105, 26,160,180,142,254, 89,215,216, 44,188,112,108,231,147,145,163, 3, 91,134, 4,
+173,102,119,235,214, 13, 54, 54, 54,232,217,179, 39,202,203,203, 45, 90,180,104, 81,223,216,148,251, 15, 30,151,218,182,109, 91,
+225,182,109,219,196,211,167, 79,199,130, 5, 11, 0, 0, 42,149, 10,151, 46, 93,194,226,197,139,243, 50, 89,157,149,245,245,207,
+183,150,170, 74, 1,118, 3,128, 63,128, 84,208,142,239, 52,104,208,248,103,162, 50,169,180, 3, 42, 18, 75,159, 67,197,203,121,
+253,185, 14,111, 61,120,134,234,105, 62, 42,224,144,160,119,157,250,106,206,210, 13,190, 76,157,204,146, 77,169,205,146, 95,190,
+164,234,203,121, 88,149, 79,205,220, 75, 97,157,118,180,211,250,181,107, 23,125,255,253,247,253, 42, 67, 56, 8, 4,130,167, 42,
+165,242,138,173, 70,179,189,204,220,235, 74, 99,115,243,101, 3,249, 0,230, 90,198,198,238, 8, 24, 49,102, 19,223,202,157,189,
+114,221, 94, 53,147,193,208,166,228, 20,224,123, 79, 64,216,128, 5,146,101, 90,224,185,212, 65,159,111, 29,152,244,245,151, 95,
+126,177,118,205,154, 78, 34,145,168, 87,185, 94,239,101, 52, 26, 1,163, 49,185, 76,169,188, 65,202,203, 31,106,252,130,182,240,
+205, 29, 72,131,243, 18, 90,180,144, 91,189, 14,239,116,112,255,254,133, 39, 78,156,248, 83,219,173, 53,154, 29,101, 22, 45,162,
+ 27,210,246,234,101,212,192, 93, 72, 36,119,235, 50, 93,210,185, 14, 27,248,246, 97, 52,206,182,180,180, 60,212,175, 95, 63,126,
+255,254,253, 49,116,232, 80,116,235,214, 13, 70,163, 17,132, 16,200,229,114, 28, 63,126, 28,155, 54,109, 74,110, 10,172,169,143,
+ 79, 3, 92,225,253,254,251,144,182,109,219, 30,168, 75,192,188, 21, 89,245,250, 36,214, 61, 54,121,201,122,243,225,233,227,231,
+175,247,212,202,114, 45,172, 5,122,241,243,103, 79, 25, 13, 31,155,222,114, 67,220,241,206, 99, 70,141,154,207,100,177,122,190,
+ 93, 1, 73, 94, 36, 36,196, 86, 38,149,134,223,180,203,141,236, 75,149,177,235,104,199,119, 26, 52,104,252,211,133,214, 80, 84,
+248,107, 85,165,228,169, 53,215, 97,165,213,135,197, 98, 73, 82, 79,207,153, 88, 23, 59, 27,232,247,214,146,133,122,115, 29,190,
+253, 59, 29,144, 67,163,249,230,157, 96,164,213, 86, 23,178,223, 43,223,152,176,136, 37, 64, 18,244,154, 0, 72, 18,128,200,185,
+ 21,124,157,214,126, 85,189, 77,181, 62,100,223, 57, 46,167, 88, 13,220,130, 66,113, 11, 10, 69,141, 78,187,108, 22,167,184,190,
+122,190,223,246, 76, 64,246, 87,219,254, 62,103,189,226,225, 47,156,207,127, 27,222, 20, 22,158, 6, 32,114,142,138,178,191, 16,
+ 21, 53,246,139, 37, 75,198, 56, 56, 58,122,216,216,216, 88,154,154,154, 50,238,223,191,159,166, 87,171,119,180, 3, 14,190,181,
+166,214, 11, 13,112,197, 59, 51,179,213,199,163, 70,205,167, 88,172, 30,213, 5, 12,209,235,239,184, 3,187,234,178,100,125,232,
+216,116,225, 57,244,123,107,201, 2, 19,152,213,144,190,145, 93, 81,143,117,208,235,215, 33, 62,190,134, 62,223,232,190,180,150,
+162, 40, 57,104,199,119, 26, 52,104,252,115, 81,153,239,240,220,255,245,129,251,211,156, 52,231, 63,136,147,137,138, 85,116,244,
+249,164, 57,105, 78,154,147,230,164,209, 32,176,232, 83, 64,131, 70,131, 97,192, 31,211, 96, 52,104,208,160, 65,131, 70, 37, 42,
+125,179,170,227,103,160,194,117,167, 54, 85,218,152,213, 4, 31,162,108,163,105, 78,154,147,230,164, 57,105, 78,154,147,230,252,
+215,113,214,199,253,119, 92,205, 88,233,147, 85,229,155,245,127, 5,218,172, 74,115,210,156, 52, 39,205, 73,115,210,156, 52,231,
+ 63, 29, 14,111, 69, 86,245, 15,128, 70, 6, 44,165, 65,131, 6,141,127, 42, 66, 66,192, 32, 4, 20, 33, 33, 12, 66, 78, 48, 9,
+ 9,100, 18,130,191,148, 10, 36, 48,176,230, 96,182,159, 77,180, 52,165,207, 56, 13, 26,255, 40,228,162,150,164,210,180,143,214,
+255, 95,184,138,197,226, 61, 0,168,188,188,188,217, 0, 50,233, 83,242,191, 7, 43, 43,171,126,122,189, 30, 50,153,236,202, 63,
+177,125, 45, 61, 48,138, 48,208,162,234, 7,130,204, 23, 41, 56, 84, 83,217, 22,158,152, 2,234,143, 88, 92,148, 17, 47, 18, 94,
+225, 84, 35, 14,199, 24,210,223,101, 23, 0,156,143,206,154,143,255, 78, 92,173,230,182,182,182, 23, 89, 44, 22,203, 96, 48,204,
+149, 72, 36, 81,181, 11,161, 64, 38, 0,176,201,181, 21,210, 60,187,229,159,127, 74,177,203, 52,251,165, 26,149,178,148,201,102,
+190,230,177,197,183,231, 76,103,156, 47, 81,116, 77,168,105,255,240,240,240, 90,179,120,183,242,196, 16,134,161,229, 48,191,214,
+105,169,223,109,239,244,125, 47,119, 27,118, 90,214, 99,209,198,221,165,123,184, 22,110,195,166,140,165,162, 88, 2,106,242,254,
+253, 69, 10,122,148, 53, 28,235, 1,171,114,192,151,205,227,185, 24,244,122,123, 10, 32, 76, 22, 43, 95,167,209,100,113,128,248,
+ 21,128,244,159,206,201,225,241,156, 13,122,189, 61, 0,252, 47,214,147,198,187,168, 85,104,137, 68,162, 24, 6,131,225, 92, 61,
+ 25,110,101, 62,193,202,223,170,111,163, 40, 10, 6,131, 33,187,164,164,164, 67, 35,142,111, 6, 96, 44,128,202, 37,234, 71, 0,
+ 28,199,135, 59, 28,155,113, 56,156,165, 66,161,176,175, 74,165,106, 5, 0, 38, 38, 38,207,149, 74,229,213,242,242,242,239, 62,
+144,151, 5,224, 99,145, 72,212,135,193, 96,244, 33,132, 80,132,144,107, 10,133,226, 42,128, 19, 0, 62, 36, 82,130,137,157,157,
+221, 58, 43, 43,171, 9, 43, 86,172, 40,178,182,182,246, 94,188,120,241,163,226,226,226,223, 10, 11, 11, 87,161, 17, 57,234,254,
+203,240, 16,139,197, 71,216,108, 54, 51, 43, 43,171, 15, 0,184,184,184, 92,211,106,181, 6,137, 68, 50, 17,192,171, 70,242, 9,
+ 1,116, 17,137, 68, 29, 68, 34,145,191,193, 96,104,241, 54, 63,227, 11,133, 66,113,179,188,188, 60, 6,192,125, 0,202,255,161,
+ 49, 98,202, 98,177,194,222,246,117, 47, 0,242,127,218, 77,128, 48,208, 34,225,121,162,119,149,240,106,229, 83,123, 97, 10,174,
+ 53,148,109,176,208,234,219,203, 97,216,240,225, 3, 24, 0,160,213,157, 31,118,245, 70,238,153,255,112,115,154,143, 30, 61,250,
+110, 88, 88,152,165, 70,163,193,236,217,179,143, 68, 71, 71,239,146,201,100, 43,234,188,113,136, 44, 23,111,222,118, 73, 64, 81,
+ 12, 0,176, 51, 26, 13,118,111,222,188,242, 74,120,118,119,240,243,231,247,214,171, 18,175,222, 55, 82,236, 57,229,232,153,216,
+144, 74,180,112, 71,192,176, 49,163,134,174, 89, 19,130, 9,227, 38, 52,121,254, 92,109,226,100,150,202, 45, 86, 9, 61,173,109,
+237,134,175, 89, 27, 78,221,190,117,122,120,216,129,208,171,211,167, 91,247,165,197, 86,131, 64,173,101,177,186,152,123,122,250,
+143, 59,125, 26, 34, 23, 23, 22,139,199, 99, 0,128, 94,163,113, 81,100,101, 57, 28, 27, 62,188,115,200,203,151,215, 67,128, 7,
+ 52,231,255, 23, 78, 26,141, 17, 90, 12, 6,195,249,205,155, 55,118, 66,161,176,226,102, 76, 8, 12, 6, 3, 12, 6, 67, 85,242,
+ 98, 66, 72,213,183, 94,175,135,143,143, 79,131,222,104, 1,244, 5,240, 73,239,222,189, 3,191,251,238, 59,182,175,175,111,101,
+202,144,158, 43, 87,174,252, 33, 46, 46,238, 36,128,131,168, 8,222,216,208, 55,222, 65, 66,161,240,240,230,205,155,205, 6, 12,
+ 24,192,114,116,116, 4, 69, 81,200,203,203,235, 18, 29, 29,221, 97,241,226,197,115,149, 74,229, 36, 0, 23, 27,113,126, 90,155,
+154,154,134,143, 26, 53,202,185, 87,175, 94,252,150, 45, 91,194, 96, 48,224,241,227,199,211, 99, 98, 98,198,159, 60,121, 50, 88,
+ 46,151, 7,162,225,249,218, 40,145, 72, 52,213,204,204,108, 93, 80, 80,144,213,164, 73,147,184,207,158, 61, 43,113,119,119,167,
+110,223,190,109,123,252,248,241,185, 27, 54,108,248, 88, 38,147,173, 82, 40, 20,191,162, 1, 57, 20, 77, 77, 77, 99, 24, 12,134,
+115, 67,132, 48,128,198,136,225,118, 77,155, 54, 61,126,235,214,173,166,233,233,233,134,145, 35, 71, 30, 2,128,171, 87,175,250,
+234,116, 58,106,224,192,129,231,179,179,179,199, 2,120,220,192,182,183,177,178,178, 58, 51, 97,194, 4, 43, 15, 15, 15, 65,211,
+166, 77, 41,161, 80, 8, 38,147,137,210,210, 82,199,103,207,158,245,127,240,224,129, 42, 58, 58,186, 88,163,209, 12, 7, 16,223,
+136,235,212,205,206,206,110, 50,155,205,110,173,215,235,157, 0,128,197, 98,189,209,233,116,207, 36, 18, 73, 24,128,187, 31, 58,
+ 64,236,237,237,119,174, 91,183,206, 70, 34,145,144, 13, 27, 54,236,148,203,229, 83,255,169, 55,131, 35,191,157, 64,204,163, 7,
+ 64, 69,218, 28,170,134,254, 71, 1,224,124,254,249, 18,116,232,216, 25, 19, 39,124, 92, 47,231, 71,253,156, 55,179,185, 28,107,
+181, 90,125,183,180, 76,115, 66, 40,224,143,157, 48, 62, 32, 25, 0,206, 95,184, 62,182, 83, 39,203,107,230, 2,222,199,124, 62,
+191,155, 78, 91, 94,244,251,149,236, 47, 27, 35,170,156,156,156, 46, 90, 90, 90, 10,138,139,139,243, 10, 10, 10,126, 26, 54,108,
+216,218,131, 7, 15, 90,166,165,165, 33, 43, 43, 11,139, 22, 45, 18,101,103,103,207,143,143,143,191,167,213,106,107,181,108,201,
+229,197,219, 87, 46, 31, 17,100,110,110,195, 20, 10,204, 96,106,110, 5,119,143,182,232,210,109, 24,134, 12,157,129,148,228,184,
+ 46, 7, 15,172,137,123,243, 38,250, 91,145, 85,179,181, 82,105,211, 90,239, 75, 45,155,163,215,240, 81, 21, 34, 43, 40, 40, 4,
+ 47, 19, 19,229,233,175, 25,159,157, 59,205, 18, 12,233,231,195,211,107,243,210,111,223, 58,221,180, 71,207,145, 0,208, 33,236,
+ 64,232,213,207, 38, 90,246,219,121,164, 68, 78, 63,146,106,191,119,174, 97,179,167, 14,218,182,205,206,111,238, 92,142,226,245,
+235,242,212,221,187,203,242,111,222, 52,176,120, 60,226, 50,120, 48,101,219,167, 15,127,238,139, 23,156, 59, 27, 54,248,179, 67,
+ 67,221, 87,149,151, 31,166, 57,255, 79, 57,255,237,168,116,130,175,190,250,240,231, 58,133, 22, 69, 81, 16, 10,133, 56,118,236,
+ 24,216,108, 54, 88, 44, 22,216,108,118,173,127,187,186,186, 54,164, 34,163,197, 98,241, 15,187,118,237,178, 31, 52,104, 16,248,
+124,126,213, 6, 38,147,137, 1, 3, 6,160,127,255,254,236,156,156,156,241,199,142, 29, 27,191,126,253,250,124,169, 84,186, 0,
+111, 19, 67,215,129, 62,222,222,222, 17,151, 46, 93, 50, 81,171,213,184,121,243, 38, 74, 74, 74,192,229,114,225,236,236,140,129,
+ 3, 7,178, 18, 19, 19,173, 6, 12, 24, 16,241,242,229,203, 0, 0,215, 26, 80,215, 14,118,118,118, 55, 78,156, 56,193,111,219,
+182, 45,149,146,146, 2, 63, 63, 63, 0, 64,105,105, 41, 70,142, 28,201,159, 52,105,146,199,248,241,227,239, 75, 36,146, 94, 0,
+ 98,234,225,107, 47, 22,139,127, 29, 53,106,148,227,250,245,235,205, 76, 77, 77,145,158,158,158, 43, 22,139,189, 42,207,247,248,
+241,227,185,195,134, 13,115,216,180,105,211,246,240,240,240, 47, 37, 18,201, 84, 0,177,117,170,214,183,130, 88, 32, 16, 32, 63,
+ 63, 31, 71,142, 28,193,252,249,243,193,100, 50, 33,145, 72,112,252,248,113,124,246,217,103,149,130,166, 65, 98, 88, 32, 16,244,
+247,244,244,220,119,245,234, 85,103, 11, 11, 11, 56, 58, 58, 50,190,254,250,235,214,238,238,238, 38, 77,154, 52, 97,230,230,230,
+ 34, 34, 34,194,125,242,228,201,103, 50, 51, 51,167,107, 52,154,122,167,212,236,237,237,247,159, 59,119,206,245,249,243,231,216,
+189,123, 55,138,139,139,193,229,114, 97, 97, 97, 1,177, 88, 12, 47, 47, 47,106,249,242,229,130, 97,195,134, 9, 22, 44, 88,176,
+ 95,171,213,182,107,192, 53,106,107,103,103,183,167, 79,159, 62,238,161,161,161, 22, 98,177, 24,149, 47, 6,165,165,165,206,233,
+233,233, 93,130,130,130, 2, 99, 98, 98,210, 36, 18,201, 28, 0, 79, 26, 57,112,218,181,108,217, 50, 96,228,200,145,204,220,220,
+ 92,132,133,133, 5,200,229,242,118,141, 16,151,127, 43,196, 60,122,128,217,243, 22, 41, 28, 93, 92, 56,151, 46,238, 27, 29,126,
+170,249, 35, 11,147,138,132,212, 82, 21,202, 3, 71,189,236, 56,112,208, 12,206, 71, 67, 71, 42,126,254,113,187,168, 33, 66,139,
+205,229, 88, 31, 57,188, 53,243,214,237,152,214,151,163, 31, 12, 30, 61,124, 56,225,112, 44,220, 1,224,203,197,159,179, 35, 34,
+ 35, 15, 12,232,223, 57,167,103,143, 14,153, 19, 39, 45,113,109, 68,117,155, 55,111,222,252,122, 92, 92,156, 61,143,199, 67,113,
+113,177,245,207, 63,255,188,181, 71,143, 30,140,212,212, 84, 36, 38, 38,226,245,235,215, 40, 45, 45,197,128, 1, 3, 68,177,177,
+177, 63, 1,168, 85,104,149, 51,250,174,115,108,162,219, 97,109, 34,108, 90,110,144,217, 17, 93,110,203,203,231, 46,183, 57, 26,
+166,242,179,119,240,241,250,100, 90, 48,214,172, 61,201,254,237,200,198,160, 43,209, 71, 1, 70,211,218, 51, 2, 16,116, 91,185,
+106, 5,100,114, 13, 38, 77,152,133,201, 19,102, 89, 19,104, 29,136, 65, 45,212,170, 74, 44, 76, 57, 47,162,118,237,221, 58, 10,
+128,115, 53,177,117,133, 22, 91,181, 99, 13,139,213, 57,224,135, 31,108, 91,207,156,201,123, 18, 26,170, 44,188,121, 83,229,249,
+209, 71, 37,126,159,126,170, 1, 0,249,235,215,156,151,193,193, 2, 91,127,127,147,174, 75,151, 90, 26,180, 90,241,154, 53,107,
+ 58, 5, 85, 36, 47,111, 20,167,235,216,177,134,160, 3, 7, 58,222, 92,178,164, 55,165,211, 49, 7,119,237,250,120, 67, 88,216,
+155,191,194,249,159,172,103,206,141, 27,154, 98,119,119,248,141, 28, 89,228,106,103,167,249, 79,182,253,175,212,147, 70, 21, 42,
+125,181,102, 87,127, 67, 69, 84, 84, 84, 47, 0,215, 1,132, 6, 4, 4,132, 0,128,185,185,121,190, 84, 42,181,139,136,136,168,
+ 87,100,177,217,108, 56, 56, 56,192,203,203, 75, 34,145, 72,236,235,168, 64,150,209,104,116, 38,132, 84, 89, 95,106,131, 70,163,
+ 65,114,114, 50,218,180,105,147,141,138, 68,180,181, 26,117, 4, 2, 65,106, 98, 98,162, 77, 66, 66, 2, 98, 98, 98,224,238,238,
+ 14, 75, 75, 75,176,217,108,232,116, 58,200,100, 50,120,123,123,131,199,227,161,125,251,246,133, 74,165,210,189,158, 41, 32,158,
+ 80, 40, 76,190,113,227,134,139,159,159, 31, 30, 62,124, 8, 23, 23, 23,136,197, 98, 0,192,235,215,175,113,251,246,109,124,244,
+209, 71,136,139,139,195,152, 49, 99,178,148, 74,165, 23, 0, 77,109,132, 86, 86, 86,185, 87,175, 94,205,246,245,245, 85, 43,149,
+ 74, 70,126,126, 62,251,230,205,155,122,185, 92, 46, 42, 45, 45,101, 75,165, 82,182, 76, 38, 99, 41,149, 74, 54,131,193,224,168,
+ 84, 42,246,149, 43, 87,152,229,229,229,117, 6,200,172,188, 78,145,145,145,240,245,245, 69, 68, 68, 4,190,248,226, 11,220,185,
+115, 7, 46, 46, 46, 56,113,226, 4,150, 46, 93,138,164,164, 36,216,216,216,160,101,203,150,245, 93, 35,120,120,120,164, 60,125,
+250,212,131,195,225, 84,230,117,172,204,151,135,130,130, 2,188,122,245, 10,111,222,188,129,167,167, 39, 38, 76,152,240,234,205,
+155, 55,158,245,245, 60, 39, 39,167,130,231,207,159,219,180,105,211, 6,249,249,249,176,176,176,128,185,185, 57, 44, 44, 44,170,
+254,118,119,119,199,146, 37, 75, 32, 22,139, 37,106,181,218,190, 62, 17,228,235,235,123,241,202,149, 43, 54,102,102,102,200,203,
+203,131, 76, 38, 3,139,197,130, 64, 32,128,141,141, 77,149,144, 79, 78, 78,198,208,161, 67, 11, 83, 83, 83, 7, 53, 66, 36, 49,
+236,237,237, 19,227,227,227,189, 8, 33,200,204,204, 68, 82, 82, 18,230,205,155,151,172, 86,171,125,240, 15,202,217, 87,205,239,
+138, 51,117,218,108,206,168, 17,221,180, 47,158, 71, 81, 60, 99, 18,218,181, 54, 43, 5,128,199,207,100,230, 26,134, 55, 90,180,
+ 10, 32,167,206,220,229,254,122,240,103, 54,140,176, 7,133,164, 23,201,248,166, 54,238,129,125, 28,102,126,254,249,244,214,189,
+123,244, 98,200,149, 74,187,159,126,218,214, 62, 53,245,133, 29, 0,184,187,183,144,204,157,187, 56,214, 84, 40,148, 92,191,125,
+195,248,253,247,251,159, 93,186,150,187,183, 1, 85,118,247,242,242,186, 23, 25, 25,105, 99,103,103, 7,115,115,115, 40,149, 74,
+148,151,151, 35, 33, 33, 65,125,236,216, 49,157,153,153,153,105, 94, 94, 30,164, 82, 41, 40,138, 66,100,100,100, 38, 0,183,247,
+137, 42,125,180, 0, 96,222,144, 22,236,150,125,189, 44, 57, 60,189,137, 9,251,165, 3, 40, 3,143, 34, 34,251,243, 23, 31,183,
+ 57,127,249,225,196, 81,163,191,176,237,217,107, 20,130, 86, 7,234,114,114, 50,253,202,209, 51,177, 38, 31, 45, 31, 79,244, 29,
+ 57,102,212,199,107,214,132, 32, 36, 40, 20, 81,145,167, 75, 69, 66,134,198,204,130,109,238,223,165,187,122,201,252, 17, 89, 10,
+ 69,142,203,154, 77,199, 38, 12, 29,177,196,185, 71,207,145,184,125,235, 52,194, 14,132,198, 80, 38,132,158, 70,124, 15, 33,128,
+165,133,187,251,156,133,201,201,156, 39, 33, 33, 10,125, 78, 78, 73,135,197,139, 11,107, 42,155,125,249,178,144,235,232,104,102,
+ 57,124,184,213,118, 55, 55,162,147, 72,246,212,228, 99, 84, 19,103,180, 72,100,113,244,252,249,126,132,205,238,181,236,171,175,
+ 76, 2, 2, 2, 32,147,201,112,242,228, 73,236,217,189, 91,227,224,224,240,212,241,217,179,184,214, 50,217,234,134,114,118, 88,
+188,184,208, 96, 48, 80, 31, 47, 93, 58,224,249,235,215,125,243, 36,146, 38, 0,224, 96,101,149,213,193,221, 61,102,127, 84, 84,
+210,206,166, 77,141, 13,173,231, 47, 23, 46,216,135,167,167,207,180,178,178, 50,201,151, 72, 88, 60, 46,183,168, 75,203,150, 39,
+126, 92,181,234,186, 62, 62,158,195,119,118, 54, 51, 15, 8,104,116,219, 59, 44, 94, 92, 88, 44,151,179, 22,174, 93,219, 61, 35,
+ 63,191,137, 66,163,241,148,202,229, 98,131, 78,199, 48, 19, 8,138,154,121,123, 75, 84, 55,111,230, 54, 43, 43, 91,180, 23,144,
+252,183,174,117, 77, 90,228,111,132,247,227,104,253, 41,215,225,245,128,128,128, 63,173,174, 33,132, 52,200,154,197,102,179,223,
+153,166,170, 3, 28,138,162, 16, 27, 27, 11,107,107,107,136,197, 98,240,120,239, 38, 31, 44, 40, 40,192,157, 59,119,240,226,197,
+ 11,180,109,219,182,114, 26,163,118, 69,196,227,125,190,105,211, 38, 11,173, 86,139,152,152, 24,116,232,208, 1, 60, 30, 15, 28,
+ 14,231, 29, 17, 40,145, 72,208,170, 85, 43, 44, 91,182,204,124,253,250,245,159,107, 52,154, 90,223, 72, 89, 44,214,130, 89,179,
+102,217, 85, 90,176,178,178,178,208,190,125,251,170,237,182,182,182,120,252,248, 49, 58,116,232, 0,103,103,103, 4, 6, 6,218,
+133,133,133, 45,208,235,245,223,213,198,201,229,114, 25,190,190,190, 29, 1, 64, 40, 20,130,193, 96,188, 52, 51, 51,179,181,183,
+183, 23,154,153,153,253,169,141, 7, 14, 28,144, 50, 24, 12, 93,189,106,128,193, 64, 94, 94, 30, 90,183,110,141,210,210,138, 12,
+ 46, 74,165, 18,158,158,158,144,201,100, 85,162,213,209,209, 17, 42, 85,221,174, 95,109,218,180, 9,241,241,241, 25, 40, 20, 10,
+121,108, 54, 27, 79,158, 60,129,159,159, 31,142, 29, 59, 6, 87, 87, 87, 8, 4, 2, 36, 39, 39,195,215,215, 23, 55,110,220,128,
+173,173, 45, 90,181,106,197,179,179,179,187, 85, 92, 92,124, 45, 35, 35, 35,164,142,122, 50, 68, 34, 17,110,220,184,129,253,251,
+247,227,245,235,215,200,201,201,129,169,169, 41,218,181,107,135,150, 45, 91,162, 91,183,110, 72, 78, 78, 6, 85,127,103, 18,123,
+121,121, 69, 61,124,248,208,134, 16,130,176,176, 48, 40, 20, 10,104,181, 90, 48, 24, 12,240,249,124, 88, 90, 90,162,111,223,190,
+176,181,181,133,151,151, 23,142, 31, 63,110, 51,100,200,144,223, 37, 18, 73, 59, 0,121,245,157, 87, 75, 75,203, 69,193,193,193,
+ 46,118,118,118, 72, 79, 79, 71,105,105, 41,236,237,237,209,187,119,111,167,232,232,232, 69, 58,157,110,219, 63,229, 65, 86,205,
+241,157,186,116,113,223,104,175,102, 37,190,109,189, 5, 46, 17, 81,246, 46,199,162, 36,173, 0,160,117, 11,251,231,163, 3, 4,
+ 89, 79,158, 71,101, 93,186,120, 58,230,197, 75, 68,160, 1, 83,219,165,101,154, 19,151,163, 31, 12,246,107,219,222,184,105,227,
+210,161,243,231,205,228,217,217,207, 64,126,230,105, 68, 95,141,117, 93,250,197, 44,219,239,182,252,114,254,114,244, 3, 70,105,
+153,102,117,195, 76, 89,174, 59, 15,254,216,205, 70, 94, 24,142,148, 68, 46, 76, 76, 91,195,221,189, 57,100, 50, 25,248,124, 62,
+127,194,132, 9,134, 21, 43, 86,148,153,153,153, 9, 40,138,194,181,107,215, 36, 0, 6,213,199,171,182,179, 36,134,114,157,158,
+112,153, 70, 66,153,170, 40, 67, 49,247, 89, 66, 26, 6,246,239,147,223,163,115,235,245, 43,214,108, 89,233,213,220,207,118,250,
+204, 80,246,218,144,137,187, 65,161,103, 77, 60,137, 41,184, 74,157, 56,101, 2, 96,232,154,111, 66,144,154,154,108, 57,251, 19,
+105, 40,139,103,226,232,227,214,221,116,247,254,107,131, 61, 61,155, 54, 89,178, 32,240,220,214, 31,182, 14,173,110,217, 58,120,
+ 32,248, 12,128,126, 13, 57,183,255, 34,180,153, 28, 21, 5, 69,102,166,174,248,214, 45,117,191, 31,126, 40,116, 25, 52,104,155,
+182,188,220,166,242, 86,193,160, 40, 80,149,174, 19, 70, 35,197, 90,182,140, 65, 88, 44,232, 44, 45, 63, 65, 73, 73,243,250, 56,
+191,200,205, 29, 61,113,230,204,161,103, 46, 92, 64,211,166, 77,171,158,103, 22, 22, 22, 88,186,116, 41, 22, 47, 94,204,123,252,
+248,113,167,240,240,240, 78,223,109,222,108, 15, 96,116, 67,234,121,233,254,125,203, 79,215,172, 89,213,182, 67, 7,215, 67, 71,
+142,240, 60, 60, 60, 0, 0,175, 94,189,242,218,184, 97,131, 91,107, 95,223,252,245,159,127,126,240,249,138, 21,173, 0,220,170,
+139, 51,239,230, 77,109,120,122,250,204,171,215,174, 89,180,110,221, 26, 0,144,148,148,100,183,125,251,246, 89,173, 2, 3, 39,
+173,153, 59,119,117,128, 90, 45, 53, 43, 40,224, 5,236,220,201, 58,250,241,199,245,114, 86,214, 19, 0,122, 79,159,254,121,207,
+ 62,125, 90,142,158, 57,211,202,213,213,149, 18,137, 68, 40, 47, 47, 71, 78, 78,142,229,243,231,207, 61,162,228,114,217,169,251,
+247,195, 96, 48, 12,248, 47, 94,235, 26,181,200,223,204,146,245,103, 77,241,246,187,119, 84, 84, 20, 1,208, 59, 32, 32,224, 70,
+229, 3,220, 96, 48, 52, 72,100,177, 88, 44, 80, 20,213, 80,177, 5, 66, 8, 10, 11, 11, 81, 88, 88, 88, 53,117, 36,145, 72,112,
+245,234, 85, 36, 39, 39,131,205,102,131,195,225,160,188,188,254, 28,180, 66,161,176,127,255,254,253, 89,247,239,223,135,187,187,
+ 59, 76, 76, 76,170,234, 85,249,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 95,151,208, 50, 55, 55,
+255,104,236,216,177,220,202,255, 21, 10, 5,152, 76,102,149,104, 81, 40, 20, 40, 46, 46,134, 84, 42,133, 90,173, 70,215,174, 93,
+185, 81, 81, 81, 31, 21, 21, 21,125,215,144,246,151,149,149, 41, 36, 18,137, 69,207,158, 61, 45, 15, 30, 60,152,212,181,107, 87,
+239,119,122,218,245,235,106,181, 90,205,102, 48, 24, 13,202,163,119,248,240,225,170,115,255,230,205, 27,236,222,189,187,106, 91,
+114,114, 50,118,236,216, 1, 66, 8, 8, 33,117, 94, 35, 31, 31,159, 33, 97, 97, 97, 29, 14, 29, 58, 84,194,100, 50,145,148,148,
+132, 35, 71,142,128, 16, 2, 91, 91, 91,148,149,149, 33, 63, 63, 31,215,174, 93,131, 94,175,135, 72, 36,130,147,147, 19,127,193,
+130, 5, 61, 66, 67, 67,217,117, 9, 45,131,193, 96, 96, 50,153,112,115,115, 67, 80, 80, 16,212,106, 53, 56,156, 10,125, 41,147,
+201, 32,149, 74, 17, 23, 23,135,244,244,116, 16, 66,234,124,200,240,249,252,192, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,
+114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,141, 28, 57,146,170, 20,156, 1, 1,
+ 1,214, 97, 97, 97,227,180, 90,109,125, 34,201, 86, 44, 22,175,156, 53,107, 22,191,122,159,205,203,203,195,232,209,163, 5,119,
+239,222, 93, 33,147,201,142, 0, 40,248,135, 61,208, 72,248,169,230,143, 98,162,147,124, 35,162,236, 93, 50,178, 13,221,151,126,
+185,133, 5, 0, 63,239,249,182,123, 68,212,155, 59, 62, 77,243,179,194, 79, 53,127,100,105,249,162, 62, 33,192,232,219,203, 97,
+152, 80,192, 31, 59,122,248,112,242,211, 79,219,218,207,159, 55,147,231,214,124,105,133,133,147,109,135,126,250,111,168, 50,213,
+ 43,254, 79, 63,109,107, 63,122,248,152,184,215,175,211,247,244,237,197, 59,126,245, 70,238,217,186, 44,134,118,214,124, 39, 1,
+ 79, 9, 39,247,150,240,110, 33,196,227, 39, 73, 56,121,226, 30, 90,180,234, 2,141, 70, 3,189, 94, 47, 28, 54,108, 88,217,177,
+ 99,199,212, 47, 95,190,148,171, 84,170, 94, 0, 94,214,215,248,236,236, 4,163,183,184, 75, 57,199,132,167,151,151,114,202,150,
+175, 14,255,184,125,231,129, 29, 44, 29,156,216,182, 66,227,217, 33, 3, 58, 29,217,191, 55,104,241,234,224, 35,232,216,105, 96,
+215, 23, 73,183, 90, 2,120, 90,163,120, 77, 69, 20,227,228, 41,125,106, 74,202,208,140,244,244,236,230,246, 98,237, 43, 41,209,
+ 45, 90,254,203,128,158,189, 2,219,120,180,240,231,190, 72,184, 65, 5, 45, 27,247,219,154, 77, 91, 39, 84,138,173, 43,151,127,
+235,245,201, 39,247,184, 7, 15,214,110, 29,255,183,129,195,227, 57,139,220,220, 88,175, 15, 30, 84,185, 15, 27, 86, 2, 0,218,
+242,114,155,215,233,233,230, 2,129, 0,132, 16,232,116,186,119,124,136, 43,253,134, 91,123,123,219, 55,132,243,245,215, 95,183,
+ 89,182,108, 25,242,242,242,160,215,235,193,102,179,223,191,103, 67,169, 84,226,147, 79, 62,193,206,205,155,187, 52,132,211, 96,
+ 48, 80,159,174, 89,179,234,171, 85,171, 60,230,204,153,195,168,126,239,181,178,178, 66,248,201,147,220, 93,187,118, 57,175,220,
+185,243,147,137, 60, 94, 42, 52,154, 58, 57, 11, 61, 61, 97,149,159,111, 82, 41,178, 0,192,219,219, 27,187,119,239,230,205,152,
+ 49,131, 59,108,216,176, 45,143,219,182,221,190,173, 71,143, 20,235,230,205,205,184, 60,158,115,125,156,149,231, 19, 0,228,106,
+117,235,109,219,183, 91, 62,120,240, 0,249,249,249,200,203,171,120, 31,165, 40, 10, 29, 59,118,164, 38, 79,158,108,222,204,197,
+165, 19, 12,134,255,230,229,254,147, 22,249, 27, 97,118, 13,191,253,225,163,245,182, 65,212,219, 6, 82,213, 30,142,239, 8,150,
+250,132,214,135, 64, 42,149, 66, 42,149, 98,239,222,189,224,112, 56, 85, 15, 95, 0,208,106,181, 13, 17, 45,190,142,142,142, 40,
+ 45, 45, 69,243,230,205,223,177,100,113, 56, 28,176, 88, 44,112, 56, 28,240,120, 60,104, 52, 26,184,186,186,162,172,172,204,183,
+ 46, 78,149, 74,213,206,202,202,170,234, 1,171,121,219, 89, 53, 26, 77, 85,125,181, 90, 45, 74, 74, 74,160, 80, 40, 32,151,203,
+161, 84, 42,253, 26,210, 94,163,209,136,103,207,158,189,242,246,246,110,199,100, 50, 33, 18,137,132, 74,165,178,202,183,168,184,
+184, 24,191,254,250,171,114,202,148, 41, 54,145,145,145,245, 10, 45,138,162,240,217,103,159,129,199,227,161,172,172, 12, 63,253,
+244, 19, 22, 46, 92, 8, 14,135, 3,185, 92,142,221,187,119, 99,201,146, 37, 96,177, 88,208,106,181,216,190,125,123,173, 92, 9,
+ 9, 9,175,239,223,191,239,215,190,125,123,203, 83,167, 78, 21, 12, 24, 48,192,118,208,160, 65, 48, 49, 49,129, 74,165,130, 78,
+167, 67,151, 46, 93,224,227,227, 3,137, 68,130,243,231,207, 23,122,121,121,217, 60,120,240,192,152,151,151,151,241,255,216,187,
+238,240, 40,170,246,123,102,123, 73,175,164,144, 80, 34,164,211, 12,160,244, 18, 90, 18, 12,162, 20, 69, 81, 81,154, 5, 20, 68,
+ 16, 5, 68, 52,128,162,136,130, 82, 44, 96, 16,144,110,168, 1, 19,144, 34, 66, 8, 37, 29, 2,169,187,201,110, 54,201,110,178,
+125,218,239, 15,146,124, 33, 38,217, 77,192,239,167,126,115,158,103,159,157,157,189,115,230,222,185,119,102,206,125,239,123,223,
+107, 67, 92,179,141, 44,134,160,105, 26,229,229,229,168,174,174,134, 90,173,134, 66,161, 64, 73, 73, 9, 4, 2, 1,108,232, 44,
+120,120,120, 60, 21, 25, 25,201, 7, 0,153, 76,134,222,189,123, 99,233,210,165,148,209,104,156, 12,224, 88, 93,178,113, 91, 22,
+186,136,224, 0, 0, 32, 0, 73, 68, 65, 84,183,110, 61,112,238,220, 57,129,159,159, 31,178,179,179,225,229,229, 37,144, 74,165,
+ 54,133,150,143,143,207,247,191,252,242,139,123,189,184,174,191,206, 6,195,189,234,152, 56,113,162,251,142, 29, 59,190,167, 40,
+ 42,230,223,246, 82,115,149, 65,212, 59,210, 89,187, 59, 73, 21,177,240,237,117,130,208,200,123,157,215,153,179, 32,248,244,147,
+ 5, 17,211,226,157,143,184,202,116, 34, 91, 60,227,162, 3, 54, 62,241,196, 40,222, 51, 83,227,242, 68, 34,215,160,205, 91, 62,
+240,246,238, 48,163,145, 12,115,134,135,167, 51,130, 58,137,137,189, 71,178,188, 23, 47,249,208,156,184,227,179,252,159,118, 37,
+141, 21, 11,147, 71, 31, 59, 85, 60,167, 37,238,220,219,213,135, 13,102,105,152, 78,115,157,112,239, 48, 16,189,123,133,192,219,
+171, 10, 91,191,223,141, 46, 93,251,194,108, 54,195,217,217, 89, 78,211,180,149,207,231, 39,218, 35,178, 0,224,244,233,106, 38,
+ 34,162,218,194,175, 97,168, 87,223,248,244,201, 81,227,158, 8, 31, 49, 34,154, 57,153,124,210, 58,176,143, 85, 57,110, 76,239,
+242,227,201, 27,243,148,138, 59,221, 35,122, 12, 66,102, 70,202, 88,150,197, 77,130,104,222,250,148,113, 11,199, 77, 76,102,202,
+238,221, 51, 25, 35,115, 85,182,234,163, 27,227, 98, 99,167, 71, 14, 25, 60,132, 73, 62,245,171, 69,140,138, 44,231, 65, 3, 74,
+ 95,125,121,220,129,111, 19,191, 24,125,252,216,247,221,180,186,194, 36, 78,100, 53,233,164, 81, 84, 7,129, 68,194, 83,167,164,
+ 80, 61,102,204, 48,215,223,143,114,185, 28,135, 14, 29,130, 88, 44,110,248,136, 68,162,134,237, 14, 29, 58,128,168,155, 70,106,
+ 15, 39, 0, 40,149, 74,148,149,149,193,197,197, 5, 94, 94, 94, 40, 43, 43,195,133, 11, 23,144,155,155, 11,161, 80,136,177, 99,
+199,130,215,130,111,115, 83,206, 73, 11, 23,142, 10,235,209, 35,176,169,200, 2, 0,171,213,138,202,202, 74,196,199,199,243,142,
+ 29, 59,230,115,188,168,232, 9, 0,137,173,113,246,137,141,213,148,239,221,219,236,185, 31,125,244, 81,226,252,249,243,146,177,
+ 99,198,188,185,224,163,143, 54,126,185, 99, 71, 49, 77, 81, 62,109, 41, 59,143,199,227, 17, 4,129,128,128, 0, 84, 86, 86,162,
+182,246,222, 8,182,163,163, 35,220,220,220, 64,146, 36, 24,150, 21,254,149,117,221,146, 22,249,135, 96, 75, 35,193,181,229, 79,
+ 22,173,186, 66, 1,192,176,198, 47, 22,134, 97,236, 18, 89, 66,161,208,166,207,149, 61, 86,174,166,176, 71,104,213,231, 85, 42,
+149, 54,220,104,141, 5, 86,125, 62,121, 60, 30,248,124,190,205,151,120,157, 24,226,215,212,212, 96,223,190,125, 24, 58,116,104,
+195,176,148, 86,171, 69,117,117, 53,180, 90, 45, 76, 38, 19,238,222,189,139,211,167, 79,163, 91,183,110,128,157,193, 95,243,243,
+243,175,116,233,210, 37,170,254, 37, 62,124,248,240,142, 63,252,240,131, 34, 38, 38,198,143,101, 89,188,247,222,123, 21,143, 61,
+246,152,103,227,151,188, 45,240,249,124, 92,184,112, 1,221,186,117, 3,203,178, 16,137, 68,200,201,201,129,183,183, 55, 24,134,
+129, 64, 32,128, 90,173,134,147, 83,235, 49, 18,111,222,188,249,226, 75, 47,189,164,112,113,113,233,169,209,104,148, 18,137,100,
+240,217,179,103, 3,172, 86, 43,156,157,157,225,236,236,140,163, 71,143,194,213,213, 21,243,231,207, 47, 50, 26,141, 23, 28, 28,
+ 28, 58, 24,141,198,235,101,101,101,239,181,165,190, 41,138,130, 94,175, 71, 85, 85, 21, 42, 43, 43,161,211,233, 96, 50,153,108,
+230,177, 57, 12, 30, 60, 24, 73, 73, 73,252,132,132,132,111,243,243,243, 1, 0, 65, 65, 65,152, 63,127, 62,223,223,223, 31,119,
+239,222,197,149, 43, 87, 96,181, 90,193,178,108,171, 55,175, 64, 32, 24,254,252,243,207, 15, 10, 12, 12, 36,172, 86, 43, 24,134,
+129,217,108, 70,253,118, 81, 81, 17,194,194,194,120,157, 58,117,122, 60, 63, 63,127, 56,236,155, 88,193, 1, 64,121,209, 65,248,
+ 11,189, 1,158, 51, 88,227, 65,104, 42,218, 23,197, 69,165, 82,125,180,232,253,243, 51,190, 92,107,237, 80,162, 4, 66, 34, 39,
+160,123,248, 72,188,248, 28,133,132, 79,246, 33,176, 83, 8, 10, 11, 11, 49,124,248,112,145, 66,161,120,169,182,182,118,161,189,
+220,201,201,191,211, 39,143, 30,123,122,210,148,233, 81,209,209, 49,212,137, 19, 71,113,243,250,137,140,151,166, 60,165, 98,153,
+ 90,194,221, 85,118, 53, 39,251,114,247,158,189,135,193, 66,209,131,129, 21,107,129, 21,108,203,247, 59, 44, 71,142,248,242,142,
+ 28,252,254,185,103,166,189,208,107,228,200,209,228,137,228, 95,112,229, 98,242,181,117,107, 95, 57,147,240,197,158,225,163,198,
+ 62, 21,225,213,225,194,209,200, 96,243,203, 1, 30, 46,183,183,254, 80,201, 53,150,230,238, 77,169,148, 65,221,115,145, 71, 16,
+ 96, 89,246, 62,145,213, 84,104,241,120, 60,155, 6,128,198,156,141,223, 69,245, 29,234,205,155, 55, 67, 34,145, 64, 44, 22, 67,
+ 40, 20,218,116,191,104,204,153,113,247,238,136,237,137,137,146,230, 68,150, 70,163,129, 70,163, 65,109,109, 45,166, 78,157, 42,
+250,224,242,229, 71, 81,231,250,209, 18,103,160,175,175,217, 65, 38, 43,207,204,204,244, 11, 15, 15,191, 47,191, 58,157, 14, 50,
+153, 12,137, 59,119,138,226, 98, 99,231,142, 60,122,116, 29,108,196,191,106,174,236, 4, 65,192,219,219, 27,110,110,110, 32, 8,
+ 2, 20, 69,161,172,172, 12, 25, 25, 25,184,124,249, 50,248, 4, 65,253,149,117,220,156, 22,249, 7, 90,181,182, 52, 59,116,216,
+210,152,104, 91,132, 22,159,207,111,183, 85,171, 37,216, 51,116, 40,151,203,111, 40, 20,138,129,254,254,254,160, 40,170, 65,104,
+ 53, 29, 58,172,183,126,164,167,167, 67, 46,151,223, 48,153, 76,173,114,178, 44,251,120,191,126,253,176,127,255,126,164,164,164,
+224,206,157, 59, 48, 24, 12, 48,155,205, 48, 26,141,200,200,200, 0,195, 48,136,140,140,132,131,131, 3,228,114,249, 13,179,185,
+245,142,168, 94,175, 87, 10,133,194, 16,153, 76,214,176,207,215,215, 23, 26,141,134, 33, 73, 18,219,183,111,215,249,248,248, 56,
+200,100, 50,187,133, 43, 65, 16, 80,169, 84,232,216,177, 99,131,143, 86, 77, 77, 13,188,189,189,235,133, 5,204,102, 51,156,156,
+156,108, 14, 29, 2, 48,221,186,117,107, 65,163,223,125, 39, 77,154,244,211,238,221,187,187,158, 58,117, 10,151, 46, 93,130,151,
+151, 23, 62,254,248,227, 59, 5, 5, 5,207, 0,184,172, 82, 61, 92,191, 72,123,218,144, 70,163,217,119,227,198,141,199,251,245,
+235,215,240,148, 24, 62,124, 56, 49,124,248,112,207,198,166,126,181, 90,141, 63,254,248, 3,167, 78,157, 2, 65, 16,200,203,203,
+163,141, 70,227, 79,173,141, 82,248,251,251,255,176,116,233, 82, 71,138,162, 26,218,182, 76, 38,131, 84, 42,133, 72, 36, 2,159,
+207, 71, 65, 65, 1,226,227,227, 93,190,250,234,171,239,205,102,243, 35, 0,172,248,151,160,218, 8,107,250, 77,157, 75,100, 88,
+135,140, 45,155, 19, 6,206,156,133,250,161, 67, 42, 50,204, 59, 35,253,102,185, 75,148,183,237,242, 30, 59, 85,252,170,133, 60,
+ 54,254,216,241,212,201,111,191, 57, 95, 24, 20, 20,166, 58,245,107, 90,224, 72,234, 67,194,195,211, 25,154, 10, 29, 10,138,202,
+145, 95,104, 97,131,130,194, 84, 87,254,184, 33,249,228,243,245,221,245, 6, 83,253,208, 97,171,237,244,183, 11,119, 38,172,219,
+ 32, 57, 51,253,165,190, 98,153,204, 15,149, 21, 55, 16, 24,232,133,248,184,158,248,110,199, 5,184,184,184,163, 67,135, 14,224,
+241,120, 14,246,150,189,162,162,130,216,183,235,183, 25,207,191,240,202, 99, 99, 70,199, 82,199, 79, 28, 17,164,156, 60,124,225,
+251, 45,239, 30, 96,249,122, 57,193,214,200, 58,119,241,185,126,251, 86,250, 51, 35,162,167, 66, 38,114,234, 6,132, 54,219, 96,
+ 27, 38, 24,176, 40,218,191,123,133,244,249, 23,102, 14, 24, 51,230, 9,234,196,137,131, 56,113,116,199,239,203,151,119, 62,122,
+167,116,167,232,226,229, 18,233,132,167,231, 84, 37, 29,203,178, 60, 53,190, 75,174,159, 67,111, 35,112,135, 83, 85,141, 59,146,
+ 2, 65, 57,101, 54, 7,116, 28, 51,134,111, 40, 44, 20, 58,118,232, 64, 1, 0, 73,146, 54,133, 22, 90, 24,130,110,202,105,111,
+ 94, 12, 6, 3,152, 22, 98, 39, 54,229, 44, 83,169, 58,215,117,194, 27, 64,146,100,131,200,210,104, 52,168,174,174,134,131,131,
+ 3,212,102,115, 7,123, 56, 71,247,239,191,253,131, 21, 43, 22,238,221,183, 79,212, 88,100,213,127,132, 66, 33,214,172, 93, 43,
+122,227,237,183,231,204, 21, 8,230,129,162,236,190,158,245,157,118, 62,159, 15,129, 64,128,194,194, 66, 20, 21, 21,161,176,176,
+ 16,133,133,133,144,201,100, 96,255,226, 73, 64,255, 96,255,172,122,145,213,248,187,193,202,213,106,120,135,182, 56,195,219, 43,
+ 12,232, 54,140,239,218, 35,180,244,122,253,169,211,167, 79,247,159, 48, 97,130,224,247,223,127,135,143,143, 79,131,208,170,255,
+174, 31,142,146,203,229, 56,112,224,128, 85,175,215,159,178,113, 51,157, 62,122,244,104,212,178,101,203,132, 47,190,248, 34, 50,
+ 51, 51, 49,107,214, 44, 84, 87, 87, 67,167,211, 65,163,209,192, 96, 48,160,127,255,254,144, 74,165,184,126,253, 58,105, 48, 24,
+ 78,219,176,216,177, 42,149,170,214,203,203,203,183,233,127, 79, 63,253,116,135, 77,155, 54, 25,178,179,179,201,129, 3, 7, 58,
+219, 43, 56,234,177,107,215,174, 6, 75, 93,110,110, 46, 54,109,218,212,224,147,149,150,150,134, 79, 63,253,180, 33,246, 89, 27,
+113,185,162,162,130, 34, 73, 18,221,186,117,131,191,191, 63, 76, 38, 19,214,175, 95, 79, 1,184,252,255,213,154, 77, 38,211,222,
+233,211,167,191,115,245,234, 85, 95,129, 64,112,207,164, 93, 87, 62,171,213,138, 91,183,110, 33, 35, 35, 3,217,217,217,168,172,
+172,108,232, 8,164,167,167, 87,145, 36,185,167, 37, 94, 47, 47,175,247,190,251,238, 59, 31,185, 92,126, 95,123,174,183,134,214,
+ 91, 73,213,106, 53, 92, 93, 93, 49,114,228, 72,239,211,167, 79,191,103, 54,155,151,253, 75,222,105,196,211, 79,230,246,125,227,
+213, 9,152, 24, 39, 47,222,159, 84,122,254,211, 79, 22,212, 57,195,123,103, 76,140,243, 47,190,150,227,138,167,159, 60,216, 23,
+ 64, 9, 90,119,216,102,126, 61,163, 60,212,175,159, 91,202,254,195,135,191, 95,178,232,205,180,133, 11, 94,241, 50, 24,111, 75,
+131, 58,137, 9, 0,200, 47,180,176,215, 51, 25,211,167,235,222, 76, 75, 88,251, 21,175, 92, 83, 61,235,143, 63, 90, 14,111,208,
+ 88,188,240,120,144, 6,133, 14, 85,116, 15, 30,212,229,247, 11,137,112,148, 27, 17, 18,218, 23, 99, 70, 63,142,148,212,116,148,
+169, 77, 80, 42,149, 48,155,205,173,134, 75,200,190,126,224, 57,150, 96, 3, 9,150, 40, 34,120,172,244,185,233, 47, 15,142,141,
+125,130, 77, 74, 58, 76, 29, 60,144,120,110,207,143, 27,246,242, 68, 66,129,209,226, 98, 33, 8,147, 22,188,155,153,181,250,123,
+ 29, 26,161, 68,212,178,249,181, 46,176,107,120, 68,168,207,115,211,103,185,196,140,139,103,143, 30, 61,200,236,217,189, 61,101,
+207,182, 30,137, 12, 79, 39, 82, 22, 27, 36, 90, 29,169,101, 9,177,107,173,142, 49,148,231, 63, 98,242,139,125,218, 10,236,229,
+212, 85,227,247,128,217, 92, 82, 91, 92,236,235, 62,116,168,228,214,138, 21,242, 14,253,251,155,136, 58, 31,226,214,132, 22,159,
+207, 7,120, 60,198, 30, 78,123,243, 98, 52, 26,193, 0,100,123, 56, 41,138,186, 79,100,213, 11,173,250,251,197, 30,206, 45,203,
+151,255, 30, 56,102, 76,101,106,106,106,135, 97,195,134, 17, 53, 53, 53,168,169,169,185, 79,108,249,249,249, 17,225,145,145,242,
+ 93, 41, 41, 65,246, 94, 79,123,202,206,227,241,254,114,161,245, 15, 71,139, 11, 73,183,186, 4, 79,189, 69,203, 30,161,101,167,
+ 69,139, 36, 73, 18,222,222,222,168,168,168,104,241,197,207,227,241, 32,147,201,234,199,136, 91,157,121,103, 54,155,215, 47, 92,
+184,240,181,113,227,198,121,134,132,132, 64,173, 86,163, 67,135, 14,144, 74,165, 13,190, 99,245,124,105,105,105,248,238,187,239,
+116,102,179,121,189, 13,206,207,215,174, 93,251,234,196,137, 19,221,125,124,124,224,230,230,134,235,215,175,195,205,205, 13, 58,
+157, 14, 57, 57, 57,112,114,114,106,240,219, 57,124,248,112,141,217,108,254,220,134,120, 99,207,158, 61,107,117,114,114,186,174,
+ 86,171,249,149,149,149,130,170,170, 42,129, 78,167, 19,106,181, 90,225,241,227,199, 61, 93, 92, 92, 12,191,254,250,171, 58, 48,
+ 48,144,127,231,206, 29, 62, 73,146, 54,213, 43, 65, 16,152, 55,111, 30, 68, 34, 17,204,102, 51,214,175, 95,143,133, 11, 23, 54,
+248,100,173, 93,187, 22, 75,151, 46,109, 16,206, 91,183,110,109, 83,203, 97, 89, 22, 86,171, 21, 36, 73,130, 36, 73,187,196,239,
+131,192, 78,193, 94,150,151,151, 23,215,175, 95,191,147, 63,255,252,179, 71, 93, 76, 50,148,151,151,163,188,188, 28,106,181, 26,
+181,181,181,160, 40, 10,254,254,254, 40, 47, 47,199,193,131, 7,181, 53, 53, 53, 99,208,202,140, 67, 62,159, 63,125,240,224,193,
+130,166,121,168,239,229,213,139,119,137, 68, 2,133, 66,129,225,195,135,139, 83, 83, 83,167, 3,248, 71, 11,173,198,225, 29, 70,
+143,153, 33, 10,139, 24, 96,185,150,145, 84, 28,218,165,188,120, 90,188,243, 17, 0, 72,191, 89,238,114, 45,199, 21, 97, 17,113,
+236,232, 49,110, 81,229,101, 91,122, 0,176,182,182, 92, 15, 0,184,200, 37,147, 70, 69,247, 87, 56, 57, 56,240, 62, 93,183,245,
+216,215, 95,127,254,232,222, 35,255, 9,239,240,233,186,123,225, 29, 70, 69,247,103,178,179,178, 39, 1,216,102,175,120,137,139,
+ 27,127,245,187, 31,190, 67,118,198,175,126,239,204,235, 41,174, 44, 39, 33,115, 12, 64, 84,239, 14,216,242,195, 13, 92,187,118,
+173,204, 98,177, 12,111,181,125, 19,108, 96, 70,230,205,224, 30, 17,225, 62,207, 77,159,233, 28, 23, 23,143,164,164, 67,248,113,
+251,182,179, 79, 77,157,248,109,105,149,142,239, 45,148,139,228, 44, 35,230,139, 92, 4, 34,137, 76,101,177,220,155, 3, 33, 20,
+ 74,157,129, 73,173,190,120,102,207,156,230, 50, 34, 58, 30, 71,142, 30,194,143,219,183,156,121, 63,226,233,109, 93,250,132, 17,
+253, 31,253,100, 78,151,174, 93, 58,233,107,203,117, 60, 66,108, 53,153, 24,167, 79,182, 23,124,150,191,116,122, 62,128,117,224,
+102, 29, 54,198,245, 31, 99, 98,250,189,113,251,182,200,107,208, 32,153, 34, 37, 69, 94,183, 18, 73,171, 66, 75, 32, 16,128,109,
+121,168,235, 62, 78, 98,199, 14, 30,128, 86, 39, 97,137, 68, 34, 24, 12, 6,144, 45, 91,176,239,227,244, 61,113,162,248,246,237,
+219,221,221,221,221,239, 19, 89,149,149,149, 13,219, 38,147, 9, 6,131, 1, 50,153, 44,195,216,252,136,200,125,156,229,103,207,
+154, 86,207,155,183,236,153,169, 83, 55,156, 58,125, 90,234,225,225, 1,173, 86,123,159,208,178, 88, 44, 24, 49,114,164,104,237,
+213,171,207, 65,167, 91,110,207,245,236, 48,124,184, 77,127, 96, 62,159, 15,230, 47, 30, 58,252, 23, 96,102,115,194,139,103,107,
+ 8,199,222, 89,135, 45,188, 32,155,174,238,189, 52, 42, 42,202,148,155,155,139,192,192,192, 6,177,210,248,156,206,206,206,112,
+117,117, 69, 90, 90, 26, 62,250,232, 35, 35,128,165, 54, 56,107, 12, 6,195,148, 81,163, 70, 25, 5, 2, 1, 66, 67, 67, 27,226,
+103, 49, 12, 3,177, 88, 12, 7, 7, 7, 92,189,122, 21,227,199,143, 55, 24, 12,134, 41,248,115, 12,173,166,156, 90,131,193,240,
+236,232,209,163, 13,153,153,153, 24, 60,120, 48,174, 93,187,134,218,218, 90,212,214,214,226,238,221,187, 8, 15, 15,135,193, 96,
+192,166, 77,155,140, 6,131,225, 89, 0,218,214, 56,107,106,106,198, 47, 92,184,144,255,211, 79, 63,117,241,247,247,143,232,219,
+183,111,200,200,145, 35, 31,121,242,201, 39, 59,197,196,196,248,118,239,222,221, 52,102,204, 24,175,113,227,198,121, 25, 12, 6,
+225,249,243,231,149, 36, 73,142,179,145,207, 6,113,146,155,155,219, 48, 84, 40, 16, 8, 80, 81, 81,209, 16,185,191,254,161,212,
+130, 16,142,182, 37,182,235, 5, 86,189,224,178,195,207,173, 57, 78,155, 7,137,197,226,122,139, 39,107, 7,103,122, 86, 86,214,
+168,161, 67,135,166,207,152, 49,163,166,172,172, 12, 78, 78, 78, 8, 10, 10, 66,112,112, 48, 60, 61, 61, 97,181, 90,113,224,192,
+ 1,253,193,131, 7,111,104,181,218,225,248,115, 12,173,232, 38,215,241,110,115, 15,217,122,107, 86,189,208,146, 74,165,240,247,
+247,175,191,182,119,219,114, 61,219,137,191,150,179, 78,192,140, 28, 49,166,107, 76,236, 4,151, 3,135, 46,136, 55,108, 60,120,
+ 35, 42, 26, 91, 61, 58,235, 14,123,116,214, 29,142,138,198,214, 13, 27, 15,222, 56,112,232,130, 56, 38,118,130,203,200, 17, 99,
+186,102,102,100,135, 52, 94,247,176,185,124, 74,165,210, 1,131, 7, 69, 85,165,158, 59,195, 36,172,253,138, 55, 98,248, 83, 87,
+183,125,123,224,192,182,111, 15, 28, 24, 49,252,169,171, 9,107,191,226,165,158, 59,195, 12, 30, 20, 85, 37,149, 74, 7,216, 83,
+246,217, 51,167,185,196,198,196, 35, 41,233, 0,181,119,215,166,181,187,247,229, 13,125,249,181,179,229,185,185,215, 88, 85,201,
+ 9, 8,121,133,200,202,202,210,214,137,172, 92,123, 56,103,189, 50,173,177,200,250,205,195,103,240,214,172, 44,208,201,201,191,
+144,167, 79, 95, 53,254,150,174,210, 94,201,172,168, 84,168, 43,239,232,116, 26, 11,195,208,160,105,154,255,193, 7, 13, 14,187,
+205,214,209,192,129,195,240,235,169,157,216,254,195,102, 45,195,192, 52,105,239, 94,122,210,164, 21,108,167,206,157, 59, 37,238,
+218, 73,196, 61, 49,193,133, 5,152,241, 19,227, 93,127,218,253, 19,209,181, 91,215,206, 65, 65, 13, 33,109,254,121,109,233, 47,
+224, 92, 1, 84,233, 10, 11,207,164,125,245,149,185,195,148, 41,238,226, 14, 29,156, 65,211, 68,253,243,189,165,143, 64, 32,104,
+106,129,105,145,211,223,211,179,244,240,225,195, 8, 14, 14,134,191,191, 63, 26,251,200,214, 7,228,246,240,240,192,190,125,251,
+192,222, 31,156,186, 69,206, 62, 93,186,164,173, 89,189,218,194, 48, 12,170,170,170,254,100,205,170,170,170, 2,195, 48, 56,122,
+228,136, 69,119,111, 37, 16,187,202, 62,156,207,175,125,102,200,144,132,216,216, 88,235,237,219,183,193, 48, 12, 26, 91,182, 84,
+ 42, 21, 28, 29, 29, 97, 50,155, 3, 0,200,237,225, 84, 29, 63,238, 0, 27,207,245,102, 44, 90,127, 69,189,255,211, 69, 86,227,
+ 5,165,103,218,101,209,162, 40, 10, 1, 1, 1,247, 45,233,194,227,241,238,251,180,113,198,225,142,204,204,204, 19, 99,198,140,
+ 89,246,216, 99,143,205, 94,182,108, 25, 63, 36, 36, 4, 90,173, 22,110,110,110,240,246,246, 70, 78, 78, 14, 14, 31, 62, 76, 87,
+ 84, 84,124, 3, 96, 37,236,155, 66,159,146,151,151, 23,215,179,103,207,221,139, 23, 47,118, 25, 61,122,180, 48, 32, 32, 0, 44,
+203,226,234,213,171,216,191,127,191,117,219,182,109,186, 58,145,101,175,243,242, 73,133, 66,241,212,184,113,227, 18,167, 79,159,
+238, 68,211,180,240,238,221,187, 48,155,205, 32, 73, 18, 69, 69, 69,214,164,164,164, 90,131,193, 48, 13,192, 73, 59,248,210,170,
+171,171,195,147,147,147,167,159, 63,127,254,163, 25, 51,102,120,140, 28, 57, 82, 68, 81, 20,206,157, 59,167,238,211,167,143,183,
+ 74,165,178,238,219,183, 79, 99, 50,153,150,210, 52,109,215, 18, 60, 4, 65, 64,167,211,193,211,211, 19,102,179, 25, 12,195,192,
+ 98,177,192,209,209,177, 97,217, 36,150,101,209, 22,231,250, 38,109,128,111,181, 90, 49,117,234, 84, 48, 12,131,245,235,215,131,
+162,168, 54,147,185,184,184, 92, 73, 79, 79,143,235,221,187,119,131,120,169,111, 67, 18,137, 4,158,158,158,240,240,240, 64, 82,
+ 82, 18,132, 66,225, 21, 91,254,110,117,184, 86, 81, 81,209, 39, 57, 57,121,192,141, 27, 55,158, 7,208,219,106,181,250,211, 52,
+ 77,240,120, 60, 37,203,178,215,117, 58,221,183,176,115, 9, 30,149, 74,245,209, 11, 47,188,208,103,231,206,157,142, 2,193,127,
+110, 13,129, 64, 0,137, 68,130,250,224,152, 44,203,194, 98,177,224,189,247,222,211,233,245,250,143,254, 45, 79,137,168,190,253,
+177,101,211, 23,142,167,127, 61,161,206,202,195,254,102, 66, 56,148,148,151,109,233,161, 40, 46,118,140,234,219,223, 46, 78,210,
+ 98,213, 60, 59,237,173,192,186, 37,120,222,187,123,183, 96,115,226,142,207,242, 1,224,147,207,215,119, 47,215, 84,207,202,206,
+202,158,180,121,243,174, 1,164,197,170,177,135,243, 63,226, 37, 81, 11, 22, 38, 0,151,174,222, 40,239, 50,126,202,241,165,221,
+186, 58, 63,161,210, 24, 75,107,107, 13,175, 3,200,183,183,236,131, 6, 14,197,175, 39,127,194,143,219, 19,117, 44,195, 55,121,
+122,122,178, 0,144,149,229,201,102,101, 85,179,255,241, 43,118,213, 11,217,107, 43,223,122,125,228, 91, 90, 93,229,231,235, 55,
+181, 62,148,210,179,215, 99,232,217,235, 49,188,246,250,187, 46,225, 17,161,129, 0,176,119, 47,232,136,110,153,191, 44,123,127,
+197, 19, 43, 87,174,128,174,198,140,250,229,122,114,110,102, 30,201,207,135,133,123,103,221,143,101, 20,117, 9,111,189,213,221,
+ 80, 89,233, 53,232,157,119, 60, 5,111,191,205,107,205, 25,190,241,253,107, 15,231,229,235,215,143,204,122,249,229,210,229,203,
+150,141,249,102,243,102, 89,143, 30, 61, 80, 86, 86,134,208,208, 80,248,251,251, 35, 57, 57, 25,251,246,236,209, 87,215,212, 44,
+ 5,240,181, 61,156, 59,142, 30,205, 9,137,136,168,216,188,121,179, 95,108,108, 44,161,215,235,161,213,106,161,213,106, 97, 54,
+155, 81, 23, 16,154,205,205,203,203, 34, 73,242, 27,123,203, 78,171,213,210,149,253,251,151,136, 24,102,205, 83, 19, 39, 46, 92,
+249,225,135,146,174, 93,187, 18,102,179,185,193,170,101,181, 90,225,232,232,104,181, 88, 44, 30, 0, 12,246,112, 74,182,109,163,
+212,106, 53,188,188,188, 26,194, 53, 53,142, 75, 88, 83, 83, 3,150,101,185, 96,186,237, 64,139, 10,201,205,205,237,138, 64, 32,
+232,216,216,186,213,220,218,121,141,247,145, 36, 89, 82, 81, 81, 17,213, 68,241,182,228, 15, 21, 4,224,227, 17, 35, 70, 60,181,
+ 96,193, 2, 34, 53, 53, 21, 7, 15, 30,100,243,243,243,247,214, 89,177,242, 91,233,233,180,196,233, 36,145, 72,230, 59, 56, 56,
+ 68,215,135,112,144,203,229, 55,244,122,253,169,186,225,194,154,118,112, 58, 75, 36,146,121, 14, 14, 14,163,234,150, 95,129,147,
+147, 83,186, 94,175, 79, 54,155,205, 95,160,229,133,170, 91,227,148,185,184,184,124,228,233,233,249,236,219,111,191,237,113,246,
+236, 89,229,175,191,254, 42,170,174,174,222,105,177, 88, 90, 91, 84,250, 79,156,238,238,238, 87,248,124,126,199,191,168,142,208,
+179,103,207,164,241,227,199,199, 78,155, 54, 13, 36, 73,226,235,175,191, 70,114,114,242,145, 91,183,110,197,217,232,141, 54,229,
+244,236,216,177, 99,234,236,217,179, 59, 77,157, 58, 85,238,230,230, 6,129, 64, 0,189, 94,143, 91,183,110,225,234,213,171,236,
+161, 67,135,106,211,210,210, 74, 12, 6,195, 48, 0, 21,109,184,158, 15,210,107,190,143, 83, 32, 16, 12, 13, 8, 8,216,181,124,
+249,114,167, 81,163, 70,201, 60, 60, 60,192,231,243, 65,146, 36,148, 74, 37,110,222,188,137, 19, 39, 78,232,247,238,221,171,215,
+104, 52, 83, 1,156,249,255,200,231,195,228, 12,235,142,247,155, 44, 20,221, 98,180,119, 27,105,109,230,115,196, 80,223,248, 73,
+ 79,141, 27, 11, 0, 63,239, 59,118,220,142, 69,165, 91,204,167,173,188,218,195, 25,218,141,183, 60, 35,243,230,125, 1, 45, 35,
+194, 35,115,195,122, 76, 92,101, 15, 81,163,200,240,247,149,189,209,112,108, 99,155,238,125,195,172, 97, 65,136,139,159,244,100,
+236,187, 75,151,224,227,143, 18,112,232,231, 3, 71,178,242,239, 91, 38,232, 31,215,150,254, 98, 78, 98,149, 64,240,152,220,215,
+119,200,122,134, 89,114,237,230, 77,199,198, 29,182,122,203,115,227, 78,165,159,159,159, 74,169, 84,118,176,135, 51,238,203, 47,
+173, 6, 7, 7,201,146, 53,107,134,214,154, 76, 67, 87,174, 92, 41,184,124,249, 50, 54,125,245, 21,101, 42, 41, 73, 84, 3,243,
+ 90, 24, 13,105,145,179,211,188,121,210, 69,155, 54,189, 24,212,173,155,247,243,207, 63, 47, 20, 10,133,208,235,245, 40, 46, 46,
+198,201, 19, 39, 44,153, 89, 89,153, 58,157,238, 9, 0, 10,123, 57,227,190,252,210,234, 26, 20, 4,185,151, 23,123, 58, 37,197,
+101,214,252,249,179, 59,119,233,226, 50,102,236, 88,161,179,179, 51,170,170,170,112,247,238, 93, 28, 56,112, 64, 85, 91, 91,235,
+ 7,128,182,135, 51,241,252,249,158, 71,207,156,121,122,213,170, 85,226,200,200, 72,184,184,184,160,166,166, 6, 55,111,222,196,
+153, 51,103,204,223,124,243,141, 86,171,213,206,166,105,250,240, 95, 88,239,255, 6,171, 86, 61,182,216, 20, 90,255,197, 27, 48,
+ 10,192,251,117,219, 31,194,246,154,129,255,166,135, 79,160,187,187,251, 22,147,201,196, 26,141,198, 89, 0,138,254,134,249, 20,
+ 68, 69, 69,109, 82,169, 84, 3, 88,150,133,139,139,203,133,140,140,140,185,104, 97,230,141, 13, 78, 62,128, 1,142,142,142,253,
+157,156,156,134,154,205,230,176,186,225,183, 44,189, 94,127,198,106,181, 94,170,179, 62,209,255,207,101,231, 3, 24,229,231,231,
+247, 50,195, 48,221, 8,130,112,165,105, 26, 36, 73, 86, 51, 12,115, 75,171,213,110, 3,144,252, 55,200,231, 67,225, 12,127, 4,
+ 79,178, 60,132,181, 36, 8,238, 19, 90, 77, 4, 4,193, 32, 43,243, 54, 14,180, 33,159,188,113,209, 1, 27,129,123, 51, 19, 97,
+219,185,246, 63, 66,203, 14,241,210,102,145,249, 8,255, 5,150, 96,239,227, 36, 88,162, 40,180,231,147, 63, 62,136,208,178, 23,
+225,193, 24, 10, 22, 3, 24, 22,151,178,111,225,215,127,241,179,238,161,113,126, 12,184,127,229,230,118,129, 39, 16,248, 0,224,
+213, 89, 95, 24,134, 32,104,150, 32,168,198,195, 91, 77, 58,150,173,114, 90,129, 30, 66,137, 36,128,166,168, 14,101,128,227, 81,
+154,126,212,196,178,181, 29,129,247,211,129,156,246,228,211, 10,244,224, 75, 36,129, 71, 89, 54, 94,237,224,208, 83,101, 52,122,
+ 1, 96, 29, 29, 28,178,116,122,253,118,147,201,180, 17,127, 30,185,176,201, 41,146, 72, 58,210, 20,213, 1, 0,120, 2,129,106,
+183,217, 28, 80,226,236,252,188,201,108,238,228,232,232, 72, 90, 44, 22,157,201,100,154, 70, 81,212,233,182,148,253, 22, 69,133,
+159,231,241, 6, 91, 29, 28, 60,172, 4,225, 96,161, 40,171,197,106, 45, 54,153, 76, 55, 0,124, 6,224,246, 95, 92,239, 28,218,
+121,179,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,215,115,202, 1, 4,214,117, 22,255,137,101,255, 55,193, 62, 31, 45,
+ 14, 28, 56,112,224,192,129,195, 63, 6, 6, 52,227,147,197,225,255, 23, 68, 43,170,180, 45, 38,193,246, 40,219, 83, 28, 39,199,
+201,113,114,156, 28, 39,199,201,113,254,207,113,218,226,254, 39, 14, 73,182,184,214,225, 95, 13,206,252,203,113,114,156, 28, 39,
+199,201,113,114,156, 28,231,255, 44,120,220, 37,104, 17, 29,234, 62, 15, 59, 45,135,127,119, 91,104, 10,255,186, 79, 91,210,251,
+114,151,156, 3, 7, 14, 28, 56,161,245, 87,191,180, 30,228,229,246,160,194, 39,129, 32,160, 32, 8, 40, 0, 36, 60,196,180,182,
+224,231,233,233,249, 70,120,120,120, 98,135, 14, 29, 94, 3,224,221,198,227,187,203,229,242, 47, 28, 28, 28, 82, 29, 28, 28, 82,
+229,114,249, 23, 0,186, 63,164,122, 35, 0,204,146, 72, 36, 41,190,190,190,165, 98,177, 56, 5,192,108,180,127,230,106, 8,238,
+197, 73,251, 16, 64,207,182, 28,232, 29, 17,191,199, 43, 34,254,186, 87, 68,252, 77,143,200,241,221,189, 34,226,111,122, 69,196,
+ 95,247,142,136,223,243, 23,180,215, 7,169,223, 4,130, 64, 17, 65,160,200,206, 99, 63, 35,128, 98,130, 64,201, 67,104, 75, 28,
+ 56,112,224,192,225,159, 6, 63, 63,191,167,124,125,125, 79,249,250,250, 38,251,249,249, 61,101,199, 33,209,205,188,120,104,130,
+ 0,109,227, 69,210, 90, 58, 91,230,202,198,199,126,106,103,209, 26,115,118, 32, 8,208,108, 29, 8, 2,140,183,183,247, 6, 95,
+ 95,223,132,166, 31,111,111,239, 13, 4, 1,166, 81, 90,186,145,192,107,171, 89,181,195,115,207, 61,247,115, 85, 85, 85,146,197,
+ 98, 73,202,203,203, 75, 26, 54,108,216,238, 38,214,141, 22, 57,165, 82,233, 51,253,250, 15, 72, 59,115,238, 82, 94,238,173, 2,
+ 69,102,206,157,130, 95,142,159,190, 28,217,163,231, 31, 82,169,244,153, 54,212, 17, 1, 96,150, 64, 32, 72,113,116,116, 44, 17,
+ 8, 4, 41, 0,230,240,249,252,195,171, 87,175, 46,200,200,200, 40, 63,127,254,124,245,153, 51,103, 74,103,204,152,113,139, 32,
+136, 95,154, 17,236,209,205, 88,105,154, 90,117,150, 21, 22, 22, 30, 87, 42,149, 39,100, 50,217, 71,118,164,111,224,244,138,136,
+191,174,210, 90, 89,149,214,202,122, 69,196,179,141,182,175,183,241,154,219,170,163, 63,181, 5,137, 68, 18,104, 67,208, 71,183,
+116, 44, 0,159,186,255,162, 0,124, 89,247,169,159,122,238, 35,149, 72, 30, 86, 91,122, 24,101,231, 56, 57, 78,142,147,227,252,
+111,115,254,147,209,167,238,219, 23,247,252,181, 26,222,221,109,157,117,248,106, 94, 94,158, 35, 0, 4, 7, 7,207, 5,176,175,
+ 45, 66,130, 32,176,136, 97, 88, 30, 0,240,120,196, 59,195,135,143,232, 35,147,201,238,139,130,108, 52, 26,197, 41, 41,191,142,
+100, 24,150,168, 75,183,136,101,241, 5,128,114,123,207, 97,177,152,121, 66,161, 24, 60, 30,241, 86,100,100,143,206, 21, 21, 21,
+103,121, 60, 94, 98,105,105,105, 85,155,205, 56, 4,129,173, 91,183, 6,251,250,250,254, 41, 90,179, 82,169, 20,199,199, 63,209,
+ 38,190, 23, 0,137, 89, 34,233, 47, 34, 8, 95,154,162, 92, 1, 64, 32, 16, 84, 93, 22,139,163, 62, 94,181, 74, 78, 16, 4,163,
+209,104, 96, 52, 26,241,230,155,111,202, 50, 51, 51, 39, 84, 84, 84,108,180, 65, 27,220,179, 87,159, 55, 79,156, 56, 30,166,171,
+172, 50,109,253,124,115,154, 81, 32, 50,116, 9, 15, 21,109,218,178,221,109,230,139,211, 94,207,206,206, 72, 71,243,203,145, 52,
+ 6, 15,192,129,249,243,231, 71,196,197,197,137,107,106,106,164, 70,163,177,115, 98, 98,226,123, 81, 81, 81,142,189,123,247, 22,
+239,218,181,139,208,106,181, 96, 89, 86, 30, 26, 26,202, 78,158, 60,217,180,123,247,238,215, 0,108,104, 69,248, 46,186,119, 45,
+121,235, 67, 66, 66,150, 3, 64, 94, 94,158,168,209, 53, 22,134,133,133, 57, 0, 64, 78, 78,206, 7, 44,203,204, 7, 0,150,197,
+ 90, 0, 75,154, 49,173,229, 69, 12,154, 4, 16,232,150,113,238,103,105,196,224, 73, 38,176,184, 69, 0,121,117, 29,130,149, 64,
+163,184, 80,247, 35, 75,161, 80,180,107,109,194,216,216, 56,130, 32,136,189,105,105,105,251, 84, 42, 85, 23,134,161, 95,105, 45,
+159, 77,218, 17,225,225,225,241, 66, 69, 69, 69, 2,128,151,179,178,178,250, 0, 64, 88, 88,152, 8,192, 21,103,103,231,129, 86,
+139,133,224,158, 85, 28, 56,112,224,240,143, 21, 90, 87, 1,196,226, 63, 75,240,108,105,143,208, 18, 3,192,217,179,103, 1, 64,
+210,142,140, 16,141, 5,204,188,121,243,224,235,235,219, 84,188, 32, 53, 53,229, 65, 10,123,223, 57, 62,252,240, 67,199,234,234,
+234,232,111,191,253,118, 8,203,178,159, 42, 20,138,223,109, 28, 95,206,178, 88,203,227, 17,239, 16, 4, 1,137, 68,154, 59,123,
+246,236,171,117,255,117,254,229,151, 95,228,227,199,143, 55, 0, 40, 0, 0,137, 68,234,207,231,243,130, 89,150,173,127,225,182,
+ 40, 8,159, 6,130, 40,177,120,196,172, 47,191,164, 30, 29, 63, 94,224,224,229, 69, 0, 64, 65,118,182,199,218, 79, 62, 25, 88,
+149,159, 47, 54,122,120,104, 52,122,189, 49, 55, 55, 23, 18,137,132,224,243,249,143,218, 42,176,131,131,195, 27,171, 62, 94,227,
+160,171,172, 54,154,116, 53, 22, 62, 69,154,157,100,114,186,188, 76,165,113,148, 57, 24,222,121,127,133,248,213, 87,166,191,161,
+215,235,231,218,160,122,237,173,183,222, 10,235,215,175,159,255,158, 61,123, 8,173, 86, 11,129, 64,224,216,187,119,111, 68, 69,
+ 69,209,191,254,250, 43,209,165, 75, 23, 68, 70, 70,226,220,185,115,184,112,225, 2,209,167, 79, 31,249,254,253,251,159, 35, 73,
+114,131, 45,113,205,231,243,222, 12, 13, 13,237,237,224,224, 96, 9, 14, 14,198, 43,175,188, 2,150,101, 17, 29, 29, 29,233,232,
+232,184, 79,175,215,139,115,114,178,135,216, 18,217,170,140, 67,147,235, 45, 91, 0,122,128,197, 45,117,198,161,198,195,143, 97,
+ 57, 57, 57,143, 85, 85, 85,225, 94,189,176, 13, 11,152, 15, 25, 50,164, 45,109,169,156,101,177,118,252,248,184,119, 0,130,136,
+142,142,174,126,237,181,215,120,217,217,217,207, 62,249,228,132,200,188,188, 91,104, 37,159,141,219, 17,241,194, 11, 47,150, 59,
+ 58, 58, 78,220,187,119,111,142, 82,169, 20,136, 68, 13, 58,147,239,237,237,237, 21, 28, 28, 60,199,221,221, 93,197,231,241,188,
+ 89,176,172,173,182,196,129, 3, 7, 14, 28,254, 86, 56, 82, 39,174,142, 52,253, 67, 0, 0, 73, 73, 73, 13,145,105,227,226,226,
+ 90,236, 85,179, 44, 91,126,237,218,181, 0,131,193, 0,150,101,237,121, 9, 52,158,162, 89, 78, 16,188, 77, 60, 30, 49,151, 32,
+ 8, 68, 70,246,184,179,126,253,250,230,214,244,178, 68, 70,246,184,195,231,243,186,178, 44, 11,130,224,125,205,178, 76,121, 11,
+156,205,190, 24,197, 98,201, 34, 0,240,241,241,205, 63,118,236,152,229,233,167,159,198, 39,159,124, 34, 90,188,120,241, 66,129,
+ 64,240, 90, 81, 81, 81, 89, 43,249, 4,128, 37, 94, 94,222,242,173, 91,183, 6,207,158, 61,251,170, 82,169, 92, 2, 0,190,190,
+190, 9, 0,194, 1, 20, 52,218,135,111,190,217, 93,250,202, 43,175,228,170, 84,170, 37, 45,113, 78, 4, 30, 9, 8, 13, 29,177,
+242,236, 89,150,103, 54, 19, 21,191,253,166, 83,151,151,147,183,213,106,249, 15, 87,174,196,189,151,144, 32, 12, 8, 12, 68,234,
+225,195,158, 21, 6,131, 90,107, 54,155,202,203,203, 89,138,162, 46,216, 81,246, 8,111, 47,111,249,230,207,190,190,236, 36,228,
+ 51,222, 29,253, 9,161,187,187,128, 39,119, 22,243, 5, 60,115,215,206,221,197, 0, 34,108,213,145, 72, 36,122,110,244,232,209,
+242,221,187,119, 19,145,145,145,112,117,117,197,111,191,253,134,244,244,116, 84, 85, 85,241, 72,146, 68,223,190,125,177,102,205,
+ 26, 4, 6, 6,162,186,186, 26, 69, 69, 69,158, 98,177,216,139, 36,201,150,174,231,125,237,105,209,162, 69,240,245,245, 5, 69,
+ 81,168,172,172, 4, 69, 81,112,116,116, 4, 0,148,148,148,224,240,225, 67,246,180, 37,155, 96, 89, 22,143, 63,254,120, 13, 65,
+ 16, 89, 77, 45, 90,109,225,244,247,247,223,165, 86, 87,140, 27, 49, 98, 4,170,170,170,200, 21, 43, 86,160,103,207,158, 8, 14,
+ 14,182, 39,159, 75, 68, 34,241,183,157, 58,117,250,108,222,188,121,190,238,238,238, 48,155,205,239,149,149,149, 97,206,156, 57,
+ 0,128,152,152,152,158, 66,161,240,216,140, 25, 51,208,165, 75,151,210,202,202,202,162,180,180,180, 87, 12, 6,195,205,246,150,
+221, 78,112,156, 28, 39,199,201,113,254,173, 56,237,213, 34,127, 83, 40,113,127, 56,135, 45,247, 9,173,184,184, 56, 34, 41, 41,
+137,181,163, 96,154,142, 29, 59, 6,200,100, 50, 0,208,180, 53, 23, 12,195,188,230,225,225,161, 90,178,100,201,160,224,224, 96,
+203,107,175,189,118,179,160,160, 96,105,227, 52,157, 59,119,254,232,171,175,190, 66,110,110,110, 65, 66, 66,194, 57,141, 70,211,
+214,117,204, 22,179, 44,214,215, 89,199, 42, 14, 31, 62,220,243,236,217,179,115, 63,255,252,115,175, 87, 95,125, 85,244,198, 27,
+111, 76, 3,240,137, 45, 18, 62,159,111,104,110,184,176, 57,248,250,250, 90,248,124,126,139, 65,226,226, 0,153, 84, 44, 30,190,
+242,236, 89,214, 82, 80, 96,248,110,221, 58,167,205,127,252,177,156,100,217, 14,222,222,222, 24, 60,112, 96,173,148,207,175, 80,
+149,149, 49,222,143, 60,194,191,123,236,152,167, 81, 44, 86,236,222,189, 91,171,209,104, 14,218, 52,225, 17,132,142, 97, 89,139,
+ 99,199, 64,242,233, 9,163, 34, 47, 95, 74,207,118,242,246,228,245,233, 29,217, 51, 59,183, 32, 13, 12, 99, 37, 8, 66,103,139,
+199,197,197, 37, 88,163,209, 64,167,211,193,203,203, 11,235,215,175,135,143,143, 15, 12, 6, 3, 50, 50, 50,216,142, 29, 59, 18,
+103,207,158, 69,199,142, 29,161, 86,171, 97,144,143,144,232, 0, 0, 32, 0, 73, 68, 65, 84,177, 88, 80, 83, 83,163, 50,155,205,
+ 45,173,205, 88,206,227,241,191,231,241,136, 23, 9,130, 64,215,174, 65,133, 27, 55,110,180, 48, 12,131,176,176, 48, 60,249,228,
+147,216,191,127, 63, 50, 50, 50,234, 45, 79,150, 78,157, 58, 23,242,120, 68,167, 58,173,212,110,171, 78,253,210, 62, 10,133, 98,
+ 98, 59,111, 26,158,159,159,223,180,110,221,186,205,125,230,153,103, 72,177, 88, 12,189, 94, 95,127, 45,200,113,227, 98,170,199,
+143,143,115, 57,114,228, 72,171,249,180, 88, 44,249, 90,173,246,229,183,222,122, 43,241,155,111,190,113, 91,186,116, 41, 24,134,
+ 1,203,178,160, 40,170, 97,209,111,134, 97,112,224,192, 1,220,190,125,251,163, 38, 34,139, 3, 7, 14, 28,254, 39,208, 6, 45,
+242,119,132, 47,238, 13, 27,162,169,216,250,175, 71,134,231,243,249,155, 79,158, 60,217,123,200,144, 33,130,145, 35, 71, 70, 30,
+ 63,126, 60,178,180,180,244,102,157,245, 32,114,228,200,145,145,222,222,222,248,226,139, 47, 12,124, 62,127,115, 59, 79,211,240,
+210, 43, 43, 43,187, 10,224,211,253,251,247,175,157, 53,107, 22,124,124,124,194,149, 74,229,127,181,204,206, 18, 73,159, 25,235,
+215, 83, 66,146,228,125,249,233,167,206,235, 82, 82,214,238,249,249,103,193,227,143, 63, 78,176, 44,139, 27,215,175,203,214,108,
+216, 32,159, 58, 97, 66, 65, 78,126, 62,117,232,196, 9,178,188,180,180,178, 84,173, 94, 6,160,210, 22, 63, 73,146, 23,243,242,
+242,252, 6, 15,125,220,255,204, 31, 55,211,159,158, 16, 51, 66, 40,224, 17,183, 10, 74,174,248,250,120,186,164,166,156, 50,146,
+ 36,121,209, 22,143, 94,175,191, 75, 81,148, 59,203,178, 94,169,169,169,240,242,242, 66, 85, 85, 21, 72,146,132,197, 98,177, 24,
+ 12, 6,169, 70,163,129,201,100,130,217,108,134,179,179, 51,110,220,184, 81, 78, 81,212,175, 45,113,210, 52, 61, 67, 34,145,124,
+ 40, 20, 10,197, 34,145, 72,113,229,202, 21,232,116,186,206,174,174,174,159, 80, 20, 5,133, 66,129,179,103,207,190,237,236,236,
+ 92, 0, 0, 82,169, 20, 98,177,196,195,108, 54, 83, 0, 74,219,123,205, 89,150,109,119,125,249,248,248, 4,202,100,178,149,239,
+188,179, 40,172, 87,175,222, 80,171,213, 96, 24, 6, 14, 14, 14, 48, 24, 12,112,118,118,198,128, 1, 3,238,174, 92,185, 82,201,
+178,152,105, 75, 12,170, 84, 42,181, 64, 32,120,109,214,172, 89, 31, 6, 7, 7,119,101, 89, 22,221,187,119,199,232,209,163,113,
+236,216, 49,228,230,230, 66,175,215,211,191,255,254,251, 79, 74,165,242, 23,238,113,203,129, 3, 7, 14,255, 56,252,201, 55,235,
+ 62,139,214,127, 19, 42,149, 74,157,157,157,125, 60, 45, 45, 45,110,242,228,201, 72, 77, 77,125, 1,192, 91, 0, 32,145, 72, 94,
+152, 60,121, 50,210,210,210,144,157,157,125, 92,165, 82,169, 31,198, 57,197, 98,177,201, 98,185,103,156,146, 74,165,210, 54, 30,
+222,185,110,200, 16, 0, 58,183,178,175,101,211,136, 64,224,219, 99,236, 88, 65, 85,122,186,110,235,165, 75, 31, 38, 38, 38, 10,
+ 6, 13, 26, 68,144, 86, 43,104,134, 65, 80, 80, 16, 49, 50, 58,218,225,251,196, 68,119, 90,175, 63,187,234,157,119,126,219, 50,
+ 99, 70,109, 94,157, 31,152, 45,152,205,230, 13,115,231,188, 28,157,146,250,155,127,120,232, 35,238,199, 79,166, 92,245,240,112,
+145, 7,119,235,230,160,169,170,164,151, 46,126, 91, 96, 54,155,191,180,197, 99, 52, 26, 15,156, 58,117,106, 66, 64, 64,128,215,
+205,155, 55, 97,177, 88, 64,211, 52, 70,142, 28, 9,150,101, 37, 0, 24,129, 64,128,236,236,108, 88,173, 86, 85, 94, 94,158,226,
+214,173, 91, 18, 0,171,109,228,175,208,108, 54, 35, 43,235,222,168, 93,199,142, 29, 71,197,198,198,130,162, 40,140, 29, 59, 22,
+135, 14, 29, 26,149,149,149,181,174,177,230,123,208, 58,175,179,144,133,249,249,249,237,175,219,101,151, 19,188,191,191,127,100,
+ 80, 80,208, 55,171, 87,175, 22,117,236,216, 17, 44,203,194,205,205, 21, 6,131, 1, 21, 21, 26,132,135,135, 35, 32, 32, 0,171,
+ 87,175, 6,128,159,236,181,184, 41, 20,138, 91, 10,133, 98,178, 74,165, 18, 85, 87, 87, 71,141, 26, 53,234,139,232,232,104, 92,
+189,122, 21,191,253,246,219, 84,137, 68,162,178, 90,173,148,143,143,207, 76,130, 32,156,173, 86,235, 78,141, 70,163,228,158, 93,
+ 28, 56,112,224,240,143, 64,189,143, 22, 26,125,183,205,162, 21, 22, 22,230, 80, 80, 80,240,124,231,206,157,197, 0, 32,147,201,
+194,131,130,130, 22,230,231,231,215,180, 53, 55, 6,131, 97, 79, 98, 98,226,232,207, 62,251, 76, 20, 19, 19,243,200,254,253,251,
+251, 1, 64, 76, 76,204, 35, 78, 78, 78, 72, 76, 76,180, 26, 12,134,135, 22, 19,137, 36,201, 33,125,251,246, 69,101,101, 37, 10,
+ 10, 10,218, 52, 44,243,203, 47,191,200,113,207, 47,171,213,125,173,129,178, 88,220, 92,253,253,121,165, 41, 41,214, 74,157,206,
+119,200,208,161, 4,105,181,130,199,227, 65,163,209,160,168,168, 8, 46,174,174, 68,118, 94,158,227,182, 69,139,126,233,220,171,
+151,152,182, 88, 60,218,144, 77,125,133,170,252,197,215, 95,123,245,192,206,157, 63,121, 85,235,116,183,101, 50,185, 89, 34, 17,
+249,204,123,253,117,186,178,178,114, 58,128, 90, 59,120, 86,239,220,185,115,236,216,177, 99,175, 7, 6, 6,122,171,213,106,159,
+234,234,106,186,178,178,146,143,123,190, 86, 4, 0,164,164,164, 64,167,211, 81, 52, 77,159,197,189, 88, 88, 22,123, 51,218,169,
+ 83, 39,151,168,168,168, 97, 94, 94, 94,208,106,181,240,240,240, 64,239,222,189,135,241,249,252,111, 11, 11, 11,181, 15,179,213,
+ 39, 39, 39, 59,177, 44,251, 24,203,178, 24, 59,118,172, 93,199,208, 52,253, 82,108,108,172,136, 32, 8, 24,141, 6, 72,165, 50,
+ 56, 56, 56,194,201,201, 25,193,193, 33, 80, 40, 20, 24, 51,102,140,229,246,237,219,155,148, 74,101,155,219,168, 86,171,141, 31,
+ 48, 96,192,130, 57,115,230,128,162, 40,196,199,199,163,184,184,120,221,221,187,119,119,251,249,249, 77,123,233,165,151,188, 60,
+ 60, 60,176, 96,193, 2, 25,128, 15,184,103, 23, 7, 14, 28, 56,252, 35,208,212, 71,235,207, 22,173,214,198, 68,125,124,124, 6,
+ 19, 4,241,158,209,104, 20,215, 15,201, 16, 4, 33,246,242,242, 58,100, 52, 26, 19,148, 74,101,155,156,226,170,171,171,117,119,
+238,220, 57,116,241,226,197, 73, 19, 39, 78, 68,114,114,242,116, 0,152, 56,113, 34, 46, 94,188,136, 59,119,238, 28,170,174,174,
+214, 61,140,146,251,251,251,143, 27, 58,116,232,196,190,125,251, 34, 41, 41, 9, 52, 77, 95,104,203,241,141,103, 24,162,153, 89,
+135,245,251,236, 34,227,243, 65, 16, 4, 40,138, 2, 0, 84,168,213,200,205,201, 65,101, 85, 21,204, 38, 19,244, 6, 3, 29,220,
+165,139, 81,107,177, 8, 9,160,173, 99, 95,133,105,151,127, 47, 50,232,245,222, 30,110,238, 70,185, 92,130,106,157, 86,116,229,
+242,239,181, 0,110,219,201, 97, 97, 89,118,232,177, 99,199,150,241,249,252,201,142,142,142,152, 59,119, 46,127,216,176, 97, 16,
+137, 68, 48,155,205,168,174,174, 70, 98, 98,162,154,166,233,174,117,199, 56,202,229,242,237,124, 62,191,164,166,166,230, 61,155,
+ 39,176, 88, 98,226,226,226, 4, 22,139, 5,171, 86,173,194,242,229,203, 49,118,236, 88,193,229,203,151, 99, 0,236,124, 88, 45,
+158, 97, 24,140, 26, 53,170,177, 51,124,150, 61,199, 9,133,194,200,110,221,186, 65,173, 86, 67,173, 86,195,203,203, 11,126,126,
+126,240,241,241,193,186,117,235,216, 47,190,248,226,184,213,106,221, 84, 81, 81, 81,222,142,182, 56,115,250,244,233, 51, 39, 77,
+154,132,218,218, 90, 92,188,120, 17, 3, 7, 14,196,218,181,107,125,207,158, 61,251, 86,223,190,125, 33, 20, 10,145,154,154, 10,
+138,162,138,185,231, 22, 7, 14, 28,254,215,240, 15,245,207,106, 21,173, 90,180, 2, 2, 2, 92,105,154,126, 59, 54, 54,118,212,
+132, 9, 19, 48,102,204,152,251,254,223,185,115,167,211,190,125,251, 18, 54,108,216, 48,214,106,181,174,110,203, 80, 31,195, 48,
+ 7,118,238,220, 25,243,248,227,143,203,135, 15, 31, 30, 4, 0, 18,137,196,178,115,231, 78, 3,195, 48, 7,218, 81,150,250,224,
+142,229, 0,224,231,231,215, 83, 32, 16, 76, 28, 55,110, 92,207, 23, 95,124, 17, 25, 25, 25, 72, 76, 76,188, 21, 28, 28,124,174,
+188,188, 77,239,200, 2, 27,179, 14, 19,108, 89,183,248, 98,177,166,186,172,204,213, 49, 48, 80,232,230,228,164, 76, 74, 74, 10,
+136,142,142, 38,138,139,139, 81, 85, 85, 5,147,201,132,203,151, 47, 51, 2,160, 80,224,230, 70, 20, 94,188, 72,240,197, 98, 13,
+238,159,201,103, 19, 1,190,110,221,223, 95, 60,187,179,201,108,138,208,106,181,148, 64, 40, 20,118,244,113, 45,206,185,221,166,
+145, 56,179, 92, 46,143, 2, 32, 96, 24,198,224,238,238, 46, 63,121,242, 36,196, 98, 49, 8,130, 64,143, 30, 61, 32,149, 74, 69,
+ 44,203, 22, 1,128,147,147,147,120,243,230,205, 46,211,166, 77,251,205, 22,113,159, 62,125,132, 18,137,228,137,224,224, 96, 92,
+188,120, 17, 55,111,222, 44,188,120,241, 98,167, 62,125,250, 32, 48, 48,240, 9, 95, 95,223,159,175, 94,189, 74, 62,140,134,125,
+111,198,106,219,157,225,105,154,102, 8,130, 0,143,199, 3,195, 48, 80,171,213,232,218,181, 43, 54,110,220,136,245,235,215,175,
+ 82, 42,149,135,219,147,159,176,176, 48, 81,215,174, 93,167, 79,154, 52, 9,249,249,249, 72, 72, 72,168, 80, 42,149, 41, 39, 78,
+156,120,106,206,156, 57,252,129, 3, 7, 66,163,209,224,251,239,191,167,174, 92,185,242, 93, 89, 89,217, 14,238,145,203,129, 3,
+ 7, 14,255, 98,161, 21, 16, 16, 48, 73, 36, 18, 45,152, 50,101, 10, 63, 36, 36, 4,229,229,229,112,118,118, 38, 9,130, 16, 2,
+128,171,171, 43, 41,147,201, 48,123,246,108,244,234,213,107,240,162, 69,139, 6, 10, 4,130,141, 10,133, 98,187, 61, 39, 86,169,
+ 84, 6, 30,143,183,119,238,220,185,171,211,211,175,118, 5,128, 63,254,248,227,142, 66,161, 88,172, 82,169, 12,109, 44, 71,125,
+ 80, 76, 66, 34,145, 94,234,222,189,251,221,168,168, 40,231, 9, 19, 38,192,203,203, 11,105,105,105, 88,179,102, 77,158,197, 98,
+ 89,118,230,204, 25,234,191,125,145, 41,179,185,236,202,193,131, 78,195,158,125,214,121, 94,108,236,167,175,206,157,251,217,251,
+239,191, 47, 8, 9, 9, 33, 12, 6, 3, 46, 93,186,196,238,219,183,143,252,254,195, 15,215,195,193, 65,120,113,223, 62,177,197,
+ 98, 41,108,163,181,100,232,160, 33,131, 67, 62,253,108, 3, 76,198, 90, 92,186,112, 4, 85, 85,106,108,222,178, 63,196,223,159,
+ 29, 90, 90, 90,122,198, 94, 46,130, 32,130,147,147,147,189, 89,150,133, 88, 44,198,202,149, 43,225,231,231, 7,103,103,103,212,
+212,212,224,173,183,222,114,153, 63,127,190, 11, 0,100,100,100, 52,132,103,176, 5,133, 66, 49, 96,246,236,217, 78, 20, 69,225,
+248,241,227, 22,130, 32,222, 59,117,234,212,183, 61,122,244, 16, 15, 30, 60,216,105,199,142, 29, 3, 1,164, 62, 44,161,213,206,
+227,110,157, 60,121,178,239,228,201,147, 89,161, 80, 72, 84, 87, 87,195,213,213, 21, 27, 55,110,212, 43,149,202, 35,237,110, 3,
+ 20, 37,150,203,229, 98,150,101,177,119,239, 94, 20, 22, 22,190,164,209,104,202,104,154,222,255,246,219,111, 47, 12, 9, 9,233,
+146,147,147, 83, 88, 83, 83,179, 86,165, 82,221,229, 30, 77, 28, 56,112,224,240,143, 66,189, 19,124,253,236,195, 35,184, 55,156,
+216,178,208,162,105,122,246,137, 19, 39,248, 12,195, 96,203,150, 45,184,114,229, 10, 43,151,203,223,147,203,229, 95,201,100, 50,
+218,104, 52,206,122,229,149, 87,166, 45, 95,190,156, 55,120,240, 96, 92,188,120,145,215,181,107,215,233, 0, 26, 11,173,104,180,
+ 18,107, 67,171,213, 94, 46, 47, 47,235,218, 40, 64,101, 87,137, 68,122,217, 70, 97,154,114, 54, 13,138,217,127,229,202,149,122,
+ 95, 95, 95,203,205,155, 55,241,205, 55,223, 48, 87,174, 92, 73, 17,139,197,155,149, 74,165,217, 78,206,135,129, 6, 78, 49, 69,
+165,253,184,112, 97,216,163,241,241,204,203, 11, 22,212,138,100,178, 55, 62,221,176, 97, 81,117, 77,141, 31, 8,130,245,112,113,
+ 41,220,178,114,101,194,216, 39,158,168,205, 56,115, 70,154,158,156, 44,244, 34,201,107,109,201,103,105,105,233,153,212,212,223,
+240,195,214,207, 96,181,154,161, 44,189,167,211, 42, 52, 90,216, 16, 89,127,226,164, 40, 74,251,212, 83, 79,137, 0,200,158,123,
+238, 57,177, 74,165,194, 35,143, 60, 2, 0,208,233,116, 56,114,228, 8, 66, 67, 67, 1, 0, 55,110,220,104,216,182,149, 79, 7,
+ 7,135, 39, 6, 14, 28,136,194,194, 66,100,100,100,156, 86, 42,149, 26, 0,167,139,139,139, 99,250,246,237,139, 3, 7, 14,140,
+111, 69,104,181,169,142,236, 20, 90,127,226,148,201,100,139,247,239,223,255,210,133, 11, 23, 38, 47, 92,184, 80, 56,114,228, 72,
+ 0, 64, 77, 77,141, 1, 0,221, 30,206,198,121, 34, 73, 18, 12,195,192,221,221, 93,175,209,104,160, 82,169,238,170, 84,170,185,
+183,111,223,110, 23,231,195,104,159, 28, 39,199,201,113,114,156,127, 19,206,127, 3,236,143, 12,207,178, 44,197, 48, 12, 82, 83,
+ 83,177,127,255,126,218,106,181,206, 84, 42,149, 55, 26, 37,217,144,150,150,150,252,212, 83, 79,109,207,201,201,225,103,102,102,
+130,101, 89,186, 45,185, 49,153, 76, 36, 65,252,121,223,131,150,242,135, 31,126, 64, 89, 89,153,181,184,184,248, 20, 69, 81, 7,
+ 30,112,246,226, 3,207, 58,252, 1, 48, 63, 99,177,156, 90, 62,104,208,168,101,201,201,146,151,223,125,215,252,194,139, 47,190,
+ 77, 91, 44, 36, 95, 36, 98,196, 14, 14, 60, 90, 34, 17,102,156, 57, 35,253, 98,206, 28,119,163,217,124, 60,177, 13, 14,230,245,
+ 22,173, 97,195, 6,227,133,151,223,132,177,145, 69,235,226,229, 92,152,173,104,147, 69,203,108, 54, 71, 40,149, 74, 72,165,210,
+ 34, 0, 62,207, 63,255, 60, 24,134,129,209,104, 68, 77, 77, 13, 20, 10,133,246,197, 23, 95,164,235,196,147, 96,226,196,137,206,
+246,240, 6, 5, 5,249, 9,133, 66, 28, 63,126, 28, 66,161,240, 8, 0, 8,133,194, 35,201,201,201, 49, 83,167, 78,133,191,191,
+127, 80,126,126, 62, 1, 27,254,105,222, 17,241,123, 88,160, 59, 8,116,187,103,130, 67, 55,175,136,248,235, 4,144, 87, 23, 53,
+ 62,171, 79,159, 62,128,157,126, 89,141, 81, 55,185, 99, 61, 73,146, 63, 47, 90,180,104,110,255,254,253, 71, 47, 95,190,156, 0,
+192,127, 24,119, 32, 69, 81, 15, 20,122,130, 3, 7, 14, 28, 56,252,173,173, 90,127, 66,139, 66,139, 32,136, 45, 67,135, 14,157,
+ 9,128, 79, 16,196, 55, 10,133,226, 70,211, 52, 74,165, 50,215,207,207,239,147, 46, 93,186,204, 2,192, 18, 4,177,165,141,153,
+ 42,103, 89,172,225,241,136, 69,247,196, 93,187, 2, 84,214, 47,117,178, 8, 0,193,227,241,183, 95,189,122,245,221,162,162, 34,
+181,157, 22,136, 86,241, 48,102, 29, 2,192, 79,192,221, 41,133,133, 39, 22, 68, 70, 70,143,157, 51, 7, 61,199,142,117,246,235,
+212,137, 54, 90,173,204,141,115,231,136, 11,123,247,138,210,147,147,133, 70,179,249,248, 1,160,168,173,249, 44, 45, 45, 61,243,
+107,202,153,147, 79, 79,140, 25, 29,212,197,239,158,104,184,171, 64, 69,165,246,100, 91, 68, 86, 19,209, 27,191,113,227,198,195,
+ 34,145, 72,208,120, 41, 27,171,213, 90,105, 54,155, 35, 0,160,170,170,202,111,203,150, 45,187,120, 60, 94,161, 45,190,204,204,
+204, 67,203,150, 45,155, 88, 80, 80,112,178,184,184,184, 0, 0,138,138,138, 10, 72,146,220,174, 84, 42, 39, 22, 22, 22,238,131,
+ 29,147, 0, 88,160,123,198,185,159,123, 0, 64,196,160, 73,200, 56,247,179, 20, 64,143,136, 65,147, 0, 0,237, 93,203,176, 49,
+234, 66, 43,188,119,241,226,197,157,163, 71,143,126, 5, 15, 16,211, 11, 0, 44, 22, 11,105, 52, 26, 41,154,166, 5, 86,171,149,
+181, 88, 44, 36,247, 76,226,192,129, 3, 7,251,193,178,108, 95, 0, 94,117, 63,235, 13, 40, 94, 77,182, 45,168, 91, 46,176,254,
+241, 91,247, 91, 77, 16,196,229, 70, 28, 13,251,237, 56, 22, 0, 42, 0, 92, 39, 8,162, 37, 35,200,150,150,126,183, 40,180, 20,
+ 10,197, 62,216,177,104,180,189,233, 90,193,146,186,117,226,128,246,175,237,214,192, 65,211,116,121, 81, 81,209, 3, 87, 40,143,
+199,187, 59,126,252,248, 54,165,183,149,102, 55, 80,248,186,217,188, 35,233,203, 47,123, 31,255,230, 27,127,154,162, 60, 8,128,
+229,139,197, 26,139,197, 82,224, 69,146,215,218,106,201,186,207, 26,115,167,116, 76,254,157, 82,116,235,214,141,189,117,235,214,
+ 61, 91,207,131,225,154, 94,175, 15,176,213, 4, 12, 6,195, 96, 59,197,224, 79,165,165,165, 63, 53, 35,216,119, 41,149,202, 93,
+246,102,170, 97, 81,105,128,199, 16,204,211, 17,131, 38,237, 5,192,212, 47, 42,253, 48, 81, 86, 86,150,131,186, 56,111, 15,130,
+194,194, 66, 51, 65, 16, 63,174, 89,179,230,185,244,244,244,221, 10,133,194,204, 61, 54, 57,112,224,192,161,109, 34,139, 32,136,
+164,186,223,113,117, 70,161,164,166,219,245,105,234,211, 53, 78, 83,207,209,116,127,107,199, 2,192,226,197,139,223, 77, 72, 72,
+144, 3,176,119, 49,230,118, 47, 42,253, 87,161,252,111,194,209, 88, 20,108,253, 43, 10,250, 37, 96, 1, 69,253, 14,170,145, 79,
+ 62,249,112,141, 27,183,110,221, 34,254,205, 55, 92,253,162,210,141, 16,249, 79,200,119, 65, 65,193,198,192,192,192,205, 10,133,
+130, 2, 7, 14, 28, 56,112,104, 11,188,154, 19, 70, 45,136,178,184,214,254,191,175,227,222, 76,186,230,126, 19, 4,145,148,144,
+144, 16,215,134,252, 54, 88,180,120, 92,221,113,224,240,223,195,255,199,172, 87, 14, 28, 56,112,224,208, 60,154, 90,177,234,197,
+ 87,211,223,139, 23, 47,126, 23,173,143, 56,249,226,158, 21,203,183,238,119,131,191, 22,129,123, 51, 7,154, 67, 91,102, 19, 68,
+183,163,124,167, 56, 78,142,147,227,228, 56, 57, 78,142,147,227,252,159,227,180,197,125,170, 25, 65, 20,219,210, 80, 95,107,195,
+136, 77,183,109, 29,107, 43, 45, 65, 16, 45,133,249,169, 31, 42,108,250,253,151, 35,154,227,228, 56, 57, 78,142,147,227,228, 56,
+ 57, 78,142,243, 65,192,178,108, 95,150,101, 99,113,111,194, 20,203,178,108, 44,203,178, 99, 23, 47, 94,188,164,126,223,226,197,
+139,151,176, 44, 59,178, 62, 93, 93,154,134, 99,234,247, 53,253,110,186,175,181,180,173,100,113,102,147,237,134,223,127, 23, 31,
+ 45, 14, 28, 56,112,224,192,129, 3,135,102, 81, 63, 99,176,145,181, 73, 13,224, 70, 66, 66, 66, 85, 35,223, 41, 53,128,107, 0,
+122,213,165, 83,215,137,180,198,190, 85,150,186,223,150,102,210, 88,236, 73,219, 2,182,180,176,205, 9,173,150,208,203,135,247,
+ 97, 96, 71,239,168,186, 10, 0,203, 48, 0, 0,166, 46, 6, 18, 91, 31, 12,137, 97,192,178, 44, 20,170,234,180, 27, 42,188,223,
+222,243, 5,251,193,221, 91, 42, 93,207,176,236,160,186, 93,103,180, 26,243,155, 25, 58, 84,219,203, 17,218, 1, 97, 82, 30,222,
+102, 88,244, 4, 0, 30,129,235, 38, 6,159,100,151,183, 61,158, 84,115,237, 60,194, 11, 51,197, 50,249, 20, 23, 87,183,110, 85,
+ 85, 21,121, 86,147,249,231, 76, 53, 54,163,237,235, 50, 34,200, 13,143, 49, 44,222, 5,192, 19,242,176, 46,175,210,238,153, 28,
+ 28, 56,112,224,240,160,214,145, 7,138,139, 71, 16, 4,221, 12, 39,241,128,156, 92,128, 61, 59,196, 86, 51,187,255,104,102,223,
+229,191, 83,190,219, 36,180,194,189, 48, 7, 4, 86, 0, 96,193,226,131, 76, 53,190,110,211,241,190,136,150,242,249,219, 0,240,
+ 77, 86,122, 1,203,224,108,179, 23,147,135, 33, 82, 17,127, 29, 0,198, 68,211, 51, 50,149,246,251,139, 69,248, 99,172,128,225,
+253,200,176,172,144,102,216,237, 96,145,228, 40,194,249,223, 75, 97,106, 75, 94, 3, 59,122, 71, 29,252, 67, 57, 58,229,235,121,
+232,223,243, 17,176, 52, 5, 48, 36,228,131,223,198,233,207,159, 71,255,176, 64,176, 12, 9, 48, 20, 28,199,125,138,113,145, 46,
+236, 13, 85,251,214,193, 14,246,131,123, 39, 79,239,155, 91,183,110,243,241, 11, 10, 39, 24,202,138,156, 63, 78, 78,155,191,104,
+217,136, 8,104, 35,237, 17, 91, 61,125,241,114, 96,231,144,183,223, 92,241, 25,223,215, 47,192,129, 33,205, 84,217,221,172, 62,
+ 27,214, 46,219, 39,226, 21,174,187,174,196, 54,123,219,114,184, 23,102, 9, 36,226, 73, 50,169, 67, 55,131,161,230, 22,109, 37,
+127,230, 9, 5, 99, 63,249,116,125,239, 97,163, 98, 28,233,154, 50, 30,201, 32,124,207,238, 93,157,190,220,184, 41,230,166,146,
+126, 2, 0,211,150, 50, 51, 44, 22,229,238,152, 25, 35, 20,240,137,176,151,182,242, 1,170, 93, 66, 43,204, 27,207, 16, 44,108,
+134,151, 96, 9,252,150,165,194, 79,237, 57, 71,168, 55,190, 37, 88, 4,131,192, 94,130,197,174, 76, 53, 84,220, 35,143, 3,135,
+127, 23,120, 60, 94, 10,195, 48,195, 31,178, 48,120,140,101,217,223,185,171,251,191,141,182, 89,180, 8,172,202,184, 93,236, 6,
+218,138,136,224,160, 15,129,182, 9, 45, 41,159,191,253,114, 94,185, 15, 40, 43,182,126, 52,119,183,133, 4, 40,210, 10,154, 34,
+ 65, 83, 36, 40,202, 10,154, 36,193,146,102, 44,251, 46, 5,176,212, 32, 42,178,251,118,128,246,181,247, 28, 66,150,247, 99,218,
+185,147,238,132, 69,139,159,190, 78,120,189, 88, 93,251,250,169,235,138,138,112,111,227,146, 76, 21,190,111,139, 32, 72,249,102,
+ 30, 18, 15, 28, 41,249,226, 91,125, 54,195,178,112,119,150,133, 76,139,203, 8,216,113, 40,165,120,253,118, 83, 54, 0,184, 56,
+136, 67,166, 95,207, 11,124,144, 74,240,150, 74,215,111,222,244,165,143,175,135,140,160, 46,172, 6, 69,211, 8,232, 20,203, 95,
+242,218, 52,223, 85,159,111,251, 28, 58,243, 11,173, 29, 31,226,141,240,206, 93,194, 22,108, 63,114, 33, 80,175, 83, 89, 78,238,
+124,247, 54,204, 32,125,252,195,132, 31, 38,124,198, 95,250,206,188,183, 44,116,201,165, 28, 21, 50,109, 61,107,194,188,113, 40,
+ 97,245,167, 61, 71,140,139,115,100,106,213,124,147,190, 54,120,235,119,219, 86,132,246,236, 39, 31, 28,217, 81,164,250,121, 54,
+ 97,172,169,132,149, 39,149,140,136,136,118, 54, 62, 55,149,220,250, 67,226,107,153, 42,108,104, 75,153,105,246, 63,109,143, 97,
+218, 31,117,157, 96, 49, 56,253,247,148, 89,180,226, 50, 88,154, 4,104,107,195, 55,104, 18, 44,115,239,187,255,236,239, 0,180,
+ 79,104,241, 88,140, 62,117,238,178,111,121,153,178,239,231,159,126,188,132,189,124,249, 24,104,252,152, 85,137, 51,109, 21,152,
+ 28, 56,112,248, 91, 91, 76, 40,150,101, 5, 15,153, 51,134,101,217,163, 15, 72,243, 54,128,151,235,182,183, 1,248,228, 33,100,
+173, 35, 0,159,186,237, 50, 0, 37, 92, 11,120, 32, 52,117,126,111,119, 28, 45, 41, 88, 6,216, 59, 1, 0,100,109,205, 5, 11,
+ 72, 65,240, 1, 82,143,248,113,163,224,233,237, 3,144, 6,192,106, 0, 72, 35, 64,234, 1,210,136, 10,101, 33, 96,213, 3,249,
+199, 64,177,172,164,205,197, 53,107,129,220,159, 49,178, 79, 32,188, 92,164,152, 23, 31,238,185,229,120,238,182,109, 39,115,162,
+ 51, 85,152, 98, 87, 94, 89, 22,253,123,116,195, 23,219,244,217,191, 92, 85,143, 1,128,152, 94, 30,199,251,135,119, 10, 88,191,
+221,148,125,244, 70,213, 88, 0, 24, 27,225,124,172, 95,136,111, 32,131,246, 91,125, 25,150, 29,236,215,185, 27, 65,167,111, 6,
+163, 43,129, 78,103, 68,201,221, 29,112,243,127,148, 71, 51, 24,106,235,120, 25, 31,139,223, 88,186, 70,104,208,149, 91, 24,171,
+154,246,226, 87,241, 5, 98,134, 64,233, 25,115, 45, 83, 77,191, 57,243,121,106,193,251, 31, 45, 6, 48,173, 53,158,112,111,188,
+182,110,221,250, 30, 3,163, 66,189,203,246,205, 35,106,171,202, 65,241,229,146,248,199, 7,194,181,123, 56, 83,158,186,142, 16,
+ 7, 69,195,213, 35, 8,165, 23,118,162,224,247,253,196,160, 62, 19, 37,223,255, 36,122, 14,176, 54, 43,180,186,121, 98,208,152,
+ 33,253,118, 7, 5,250,249,178, 44, 3,134, 97,193, 50, 52,106, 77, 36,150,236,201, 7, 77,211,120,106,204,160,145, 14, 98,130,
+101, 24, 6, 44,203,160,184, 76, 99,248,245, 82,246,200,252, 42, 92,178,199, 82,213,235,177,225,131,174,167,253, 30, 74,230,254,
+130,168,105, 9,217, 4,112,174, 81,155, 27,116,245,196,247,161,192,119,237,215,114, 4,232,130,227,171, 17, 56,100, 38,127,243,
+ 79,199,189,180,234,210,233,251,118,108,122,250,235,205,155, 19,179, 85,152,205, 61, 95, 56,112,248,119,128,101,217,135, 46,182,
+ 10, 11, 11, 21, 15, 34,182,252,253,253,135,148,150,150,174,173,247, 86, 33, 8, 98,109,231,206,157,151,253,167,163,122, 95, 95,
+ 79, 75,211,244,180,210,210,210,179,173,113,198,198,198,250, 29, 57,114,164, 75, 35,206, 46, 0,186, 52,151,214,213,213,149, 30,
+ 48, 96, 64,193,145, 35, 71, 20, 92, 11,105,151,224,106,179,208,202, 46,250,121, 94, 31,179,178, 22, 0,178,237, 72,127,223,144,
+159,137,164, 87,255,176,226,249,213, 17,157,221, 81,163,183,224,228,149, 2,208, 52, 9,154,162,234, 44, 91, 20,104,138,196,152,
+ 94,158, 24, 96,154,141, 13, 73, 57,160,104, 38,161, 53,206,166,176,178,204, 51,189,163, 39,239, 97, 24, 86, 44, 17,242,180,193,
+ 1, 30,222, 11,158,234,197,155, 23, 31, 1,163,149,154,188, 51,245,246,175, 89, 42,108,181,139,147,249,115,200, 35,182,185,125,
+ 52,101,179,236,173, 88,163,250, 71, 15, 27,236,204,154,181, 32, 43,242, 81, 99, 32,145,175, 33, 81,102,170,134,132, 80,218,197,
+201,176,232,217,209,223, 87,126,126,247, 59,119, 61,248, 58,129, 55,159, 18,137,121, 20,104,134,229,179,213,153,102,247,208, 81,
+194,122,191,173,214,242, 41,147, 59, 61, 63,100,116,172, 75,209,206,153,132, 44,120, 12,188,251, 4,224,238,217, 31,160,186,146,
+ 4,141,162,128,112, 54, 85,163,131,199, 35, 24, 55,109, 10, 62,153,210, 23, 53,186, 26,240,149,183, 93,196, 66,137, 43, 96,109,
+150,147,165, 49,109,221,154,143,124, 5,124,222,189,235, 89,255,161, 73, 24,205,102,128,166, 32, 21, 48, 32,216,250,255, 72,208,
+164, 85,222,115,226, 59,115, 1,250,146,173,178,103,169,240, 83,184, 23, 6,131, 33, 67, 89,210, 8, 2, 56,151,169,254,143,248,
+ 9,243,198, 51,143,142,121,113, 48, 75,224,183,246,212, 81,164, 7,226,162,186, 56, 58, 56,232,178, 81,178,247,117,220,134,148,
+237, 48,240,101, 60,243,210,107,242, 45, 91,182,140, 7,216, 57,184,223, 71,237,175, 88,100,149,227,228, 56,255,145,156,206,206,
+206, 93, 59,119,238,188,140, 36,201, 33, 34,145,168,131,213,106, 5,195, 48,101, 98,177,248,183,130,130,130,149, 58,157,238,206,
+223,173,236,215,175, 95,111,139,216,178,201, 41, 20, 10,145,147,147,115,171, 13, 98,235, 84,147,227,127, 60,119,238, 28,246,236,
+217, 3, 0,200,205,205, 69,247,238,221, 29,154, 59,240,238,221,187, 14,195,134, 13,251, 17, 64, 64,107,156, 55,110,220,232,250,
+203, 47,191, 96,239,222,189, 0,128,156,156, 28, 4, 7, 7, 55,155,153,115,231,206,241,159,125,246,217,174, 0, 20,255,133, 58,
+250, 55,136,172,198,223,255, 17, 90, 73, 73, 73,108, 92, 92, 28,209,116,187, 25,228, 7,186,137,251,192, 68, 3, 64,126, 91,115,
+144, 85,142, 53, 95,236, 56, 49,246,244,222,141, 67,164, 34, 30,150,111, 93, 80,172,174,172,121, 76, 64,220, 27,126,161, 88,240,
+220, 28,197, 23, 19,166,247, 10,172,170, 53,225,240, 31,165,103, 51, 85,109, 51,145,102, 42,145, 12, 48,174,247,126,209, 48, 25,
+ 85,193,211, 63, 73,222,181,107,241,216,158,111,198,247,196,161, 11, 5,111, 2,148,205,168,239, 44,195,128,101,168, 6,231,247,
+186,174, 3,192,220,191, 40, 48, 3,246,222, 62,166,109, 22,173,161,128,160,202, 27,227,156,228,226,175,102,205,122,197,153, 84,
+231,161,210, 34, 66,113,149, 9,101, 70, 33,106, 5,222, 40,205,190, 65,243, 8, 36,219, 52,185, 16,208,177,148,201,213, 77,236,
+200,139, 28, 53,215, 95,119,252,221, 42, 49, 65,241,157,159, 92,229, 90,113,250,179, 2, 74,175,214, 19, 4,108,134,159,119,113,
+113,237,110,210, 20,240,181, 85, 21,112,245,137,192,216,201,113,248, 32, 54, 28, 53, 58, 61,212,149, 23,217,110,190,206, 68,225,
+111,137, 88, 58, 46, 12,154,114, 37,204, 36, 64,232,205,149, 38,139,169,182,197,235,200,195,230,249, 11, 23, 61,211,201,215,203,
+161,126, 82, 1,203,208,232, 21, 22,132, 81, 67,250, 35,249,220,121, 92,190,145, 11,166,110, 82, 1,203, 48, 40, 81, 85,149,155,
+172,244, 15,109,186,160, 52, 5,150, 52, 53, 43,196,208,142, 33,195, 72,111,200,105,224,253,190, 93,157,102, 44,142,235,228,228,
+ 32, 33, 96, 34,105,152, 44, 36,106,206,127, 5,143,206, 61, 32,151, 74,137, 62, 48, 10,174, 2,220,186,133, 28, 56, 52,194,211,
+ 79, 63, 45, 45, 47, 47, 79, 13, 8, 8, 8, 31, 53,106,148,124,240,224,193,208,235,245, 56,121,242, 36,244,122,125,167,128,128,
+128, 78, 39, 79,158,156, 88, 84, 84,148,217,177, 99,199, 97,123,247,238,181,219,135,182, 78, 0,241, 27, 30,193, 0, 69, 16, 4,
+234,246, 17,117,251,218,189,206,173, 88, 44, 70, 97, 97,225, 67,183,108,149,150,150,222,106,143,101,171,182,182, 86,228,239,239,
+ 15, 47, 47, 47,208, 52, 13,189, 94,143,131, 7, 15, 66,171,213,130, 97, 24,200,100, 50,172, 90,183, 21,217, 87, 83,113,233,210,
+ 37,104,181, 90,145, 45,206,146,146, 18,162, 87,175, 94, 48,155,205,160, 40, 10, 38,147, 9,167, 78,157,106,248, 45, 16, 8,176,
+232,195,207,145,123, 37, 21,233,233,233, 40, 41, 41,249,175,172, 54,210, 6, 45,242,119, 68,139, 49,179,254,235,179, 14,105,154,
+ 90,178,101,251,174,139, 75,102, 79,193,107, 83,163, 3, 86,110,220, 31,157, 85,129,237, 0, 16,230,137,233,207, 13,239, 22,232,
+ 42, 23,226,131,157, 87, 0,150, 93,242,160,231,203,168, 68,110,120, 7,230,205, 3,151, 10, 83,223,157,210, 7, 65,190,206,221,
+171,196,149,226,252,124, 59,214, 20,100, 40,184, 57, 74, 66, 98,122,121, 28, 7,195,192,213, 73, 18, 10,154,130,171,163, 36,100,
+108,132,243, 49, 0,112,150, 11, 67,155,179,124,181,132,168, 0,225, 76,185, 68, 48,211,193,201, 53,240,133,241,163,100, 49,227,
+ 39,202, 28,133, 20, 52,151, 78, 66, 39,236, 8,210,189, 19,204,100, 37, 74,238,220,166, 79,255,158, 85, 90, 81, 99, 94, 96, 51,
+155, 44,206,150,222,201,241,234,218,115,148, 91, 69,210, 82, 85,215, 23,119,118,225,129,225,213, 36, 62, 89,238,224,221, 79,246,
+ 71,254,157, 90,134,109,214,162,115, 31,116, 90,109, 1, 73,195,215, 72, 11,156,110,167,124,143,197,227,122,160,170, 82, 5,147,
+149,130,214, 72, 89,125, 92,165, 18,243,157,155, 48, 91, 41, 88, 72, 6, 66, 87,127,156,188,120,163,130, 33,201, 99, 45,113,230,
+107,144,158,127, 48,221,177,241,190, 32, 79,244,122,199, 89,150, 14,210,136,194, 18, 5,182, 31,185,216, 39, 95,131,244, 7,169,
+103,150,161,238, 13, 63, 55,178,100, 17, 44, 6,183,199, 9, 62,212, 27,253, 68, 82,209,151,107,223,124, 54,252,241, 96,119, 9,
+ 83,114, 17, 4, 99,133, 3, 45,128, 81, 76,195, 37, 32, 8,140,165,134, 53,152, 76,213, 25, 0, 23,233,157, 3,135, 70, 8, 9,
+ 9,241, 41, 45, 45,205, 88,184,112,161,251,147, 79, 62,137, 3, 7, 14, 64,167,211,225,135, 31,126,192,250,245,235,177, 98,197,
+ 10,144, 36,137, 45, 91,182,200,247,237,219,215,111,211,166, 77, 37,129,129,129, 17, 69, 69, 69,101, 54, 4, 22, 1, 64, 2, 64,
+ 88,247,238, 34, 0, 48, 71,143, 30, 69, 76, 76, 12,142, 30, 61,202,212,237,163,113,175,243,211,174,245, 68,197, 98, 49,196, 98,
+ 49,180, 90,237, 67, 17, 91, 66,161, 16,142,142,142, 16,139,197,168,169,169,105,179,216,162, 40,138, 95, 82, 82, 2,173, 86,139,
+ 81,227,199,227,243,132, 4, 12, 31, 62, 28,163, 70,141, 2,203,178, 56,117,234, 20,162, 7, 70, 98,202, 19,195,144,149,149, 5,
+138,162,236,202,111, 89, 89, 25,202,203,203, 49,118,252,120,108,221,180, 9,253,251,247, 71, 72, 72, 8, 40,138, 66,106,106, 42,
+158, 30, 51, 16,210, 9,209,200,205,205,229, 26,181,253,214,172,135,226,163,245,192,200, 80,227,119,230,208,153,164,169, 99,250,
+197,141, 31, 20,142,173,187, 79,127, 4, 47,221, 46, 0,240, 48, 75, 86, 61, 63, 60, 8,153, 69, 85, 56,157,174, 72,202,170,192,
+ 67,153,173,193,208,240,244,112,150, 3,124, 49,140, 86,134,114,206,183,237,192,204,176, 44,228, 67,222,193,115,227, 51, 3,250,
+135, 7, 4,212,207, 58,116,140,249, 12,211,111,220, 10,236, 27,226, 19, 8,154, 4,104, 18,206, 83,118, 2, 31, 58,216,204,199,
+192, 46,226,228,249,243,230, 13, 24, 55, 97,178, 76, 44,119, 1,173, 43, 6, 89,118, 3,154,188,179,208,203,187,163,172, 48, 31,
+123, 78, 92,210,230,149,104,116, 60, 30, 78,150,107,205,111,231, 87,161,214, 22,175,137, 68,194,178,165, 11, 98,247,236,218,237,
+ 36, 9, 26, 68,220,254, 42, 70, 43, 22, 80, 18,175, 46,143,242, 12, 82, 79,246,227, 31,118, 59,235, 45, 88,109,139,199,160,215,
+237, 63,117,242,248,148,110, 93, 7, 57,221,189,124, 4, 70,147, 25,102, 18,136,232, 55, 12, 52,205,138, 9, 30,193, 56,243,249,
+132, 74, 83, 5,130,164,203,127,187,118, 87,121,238, 90, 62,223,236,132,213,173, 70, 23,105,170,238, 9,254, 27,227,135,245, 6,
+ 72, 35,158, 24,210, 3,159, 39,158,126, 29,160, 95,124,176, 74,190,103,209, 98,129, 65,225, 94,248,134,101, 49,232,202,193,245,
+161, 81, 19,230,163, 45, 22,173, 8, 79,140, 11,235,234,247,253,231,171,222,113,247,232,216,157, 79, 48, 36, 88,159,158,128,174,
+132, 37, 74, 46,194,197,191, 63,104,191,129,216,178,225,211, 90,134, 97,119, 1,224,166,100,115,224,208,248,121,100, 50,237, 95,
+179,102,141,123, 92, 92, 92,189, 69, 6, 23, 47, 94,196,182,109,219,224,224,112,255,115, 50, 38, 38, 6, 44,203,186, 47, 95,190,
+124, 63,128,199, 91,226, 28, 48, 96,192,248,244,244,116, 69,239,222,189,243,235,196,150, 8, 0,239,230,205,155,188,226,226, 98,
+194,205,205,141,245,243,243, 35, 21, 10, 5, 3,128,126,233,165,151,248, 63,255,252,115, 55,189, 94,127,166,189, 66, 75, 44, 22,
+ 63, 20,159, 45,161, 80, 8,130, 32, 32, 22,139, 33, 18,137,192,178,108,155,196, 22, 77,211,130,163, 71,143,226,202,149, 43, 88,
+209,187, 55,222,244,247,135,187,187, 59, 82, 83, 83,193,178, 44, 28, 28, 28, 80, 89, 89,137, 93,187,118, 97,196,136, 17,160, 40,
+ 74,100, 15,239,222,189,123,145,150,150,134, 15,163,162,240,166,139, 11, 28, 29, 29,113,234,212,189,209, 64,137, 68,130,194,194,
+ 66,156, 58,117, 10,195,134, 13,227, 26,245, 3,194,238,198, 51, 20, 16, 84, 18,240,177, 90,140, 96, 41, 22, 32,224, 23, 22, 6,
+ 81, 86,214,253,206, 57,246,128,199,195,210, 13,219,147, 98, 63,155, 63,158,152, 25,223,199,111,229,247, 41,115, 0, 96,198, 83,
+193,254,114,137, 0, 95, 28,202,100,121, 60, 44,125, 24, 5, 12, 11,131,136,208, 96,206,168,254, 33, 80, 84, 91,112, 91, 81,253,
+107,150,157, 67, 61,167, 63,123, 14, 59, 14,167, 22,175,223, 97,202,102, 89, 22,174,142,146,144,233,215,111, 7,126,127, 52,173,
+104,221, 30, 83, 54,203,176,112,149, 11, 67, 95,204, 26,104,115,214, 97, 84,128,112,230, 91, 11, 22, 12,140,127,113,161,148,202,
+254, 25,150,219, 39,192, 88,141,208, 89, 69,168,230,251,160,164,168, 8, 31,111, 73, 42,214,233, 45, 83, 50,212,109, 19,152,121,
+ 26,212, 10, 8,221,147, 31,127,240,110,114,194,170,229,142,198,252,212, 90, 62, 65, 25,249,157,135, 10, 86,173,248,140,168, 49,
+ 91, 38,231, 87,161,198, 22,143,217, 9,171,215,172,219, 16,251,202,180,137,217,193,221,135,122,208,138, 59, 30, 38,157, 78,181,
+243,120,154, 79, 93, 79,145, 0,128,219, 37, 26,168,181,122,138,166,200, 51, 78, 66,172,204,180,199, 58, 88,135,174,222,240,138,
+ 27, 20,241,172,151,147, 8,198,218,106,120, 59, 9, 49,166,255, 35,207,146,127,228,190,115, 71,213, 22,185,214, 84,104,145, 96,
+ 73, 35,126, 95, 61, 34,148,165,201, 80,208, 36,172,215,127,108,187,101,140,192,155,175, 13,113,116,118,179,220,229, 65,239, 0,
+200, 60, 65, 56,119, 2, 92,186, 16,194,176,201, 80,228,103, 80,175, 63, 59, 77,115,167,160,228, 91, 79,217, 67,153,249,195,129,
+195,191, 10,133,133,133,207, 47, 89,178,228, 92,255,254,253, 59,120,122,122,162, 71,143, 30, 4, 75, 75,198, 0, 0, 32, 0, 73,
+ 68, 65, 84, 56,124,248, 48, 22, 46, 92,216,144,166,119,239,222, 96, 89, 22,149,149,149, 88,179,102, 77,153, 66,161,120,190,213,
+ 14,122, 70, 70,246,142, 29, 59,134,132,135,135, 91, 69, 34, 81, 53, 0, 73,117,117,181,180,178,178,146, 48,153, 76, 96, 24,134,
+113,113,113,161, 21, 10, 5, 57,101,202, 20,243,133, 11, 23, 30,209,235,245,133, 15, 98,209, 10, 8, 8,184,169,209,104,180, 4,
+ 65, 60,112,232,135,122,145,229,233,233,233, 85, 91, 91,203, 0,168,106, 79,232, 7,138,162, 16, 21, 21,133, 19,103,175,226,232,
+233, 11,208, 41,114, 48,231,149,231,209,163, 71, 15,156, 56,113,162,221,117,214,171, 87, 47, 28, 63,117, 14,231,174, 92, 67, 97,
+238,117,188, 62,231, 21, 68, 68, 68,224,248,241,227, 92,131,182, 31, 71,112,191,111,214,145,166, 66,107, 88, 82, 82, 82,125,207,
+252, 79,242, 53,212, 19,189,132,174,226, 31,151,143,123, 36, 76, 56,106, 57, 8,161, 12, 63,119, 63, 62,112,233,199, 95,101,243,
+189, 11,167,221, 84,217,158, 29,118,223, 77,163, 66, 6,123, 41,251,167,107, 89,161,207, 62,209, 63, 0, 91, 15,203,223, 7,128,
+201,131,187,226,143, 60, 53, 46,229,170,126,202, 84, 35,227, 65, 75, 29,233, 13, 57, 93,129,159,214,188, 17, 63,172, 83, 71, 31,
+108, 59,112, 14, 4,129,253,118,189,112, 89,150,237, 31,222, 9,235,119, 52,157, 97,232, 19,184,110,143, 41,251,100, 70,205, 56,
+ 0, 24, 21, 42, 63,214,247, 17,183, 64,182,177,227, 86, 51,144,137, 5,179,198, 77,124, 78, 74,229, 30, 6, 10, 78,129,160,204,
+ 48, 90, 25, 40, 43,106, 96,112, 9, 64,234,197,107, 70,173,201, 50, 63, 83,221, 62, 43, 94, 86, 5,242, 69,151,175, 21,213,234,
+141,190,114,175, 71, 76,124, 30,195,212,154, 89,252,145, 89,160,203, 44, 67,142, 61, 28,249,249,176, 60,230, 79, 13,254,102,251,
+158,101, 66,145,120, 50,159, 0,225,237,234,224,245,205,103, 31,194,201,201, 17,140,165, 22,208,171,241,228,171, 31,171,111, 42,
+200,174, 0,208,221, 3,142,131,187, 10,183, 11,120, 68, 73,202,109,235,123,182,206, 65,144,152, 61,109, 76,111, 33, 99,209,227,
+141, 53,187,177,249,157,120, 60, 55, 50, 76,120,228,124,238,108, 0, 43,219, 91,215, 44, 77,129, 37,141,120,252,221,179,217, 4,
+112,142, 5, 6, 93,217,179, 42, 20,184,106, 55, 71, 31, 64, 72, 11,136,176,158,129, 14, 34,166,228, 60,152,146,243, 44, 63, 96,
+ 32,136,192, 33, 4,225, 19,197,126,185,118,133,126,235,214,109, 39, 25, 30, 62,176, 35, 84, 6, 7, 14,255,171,200, 87, 40, 20,
+ 99, 99, 98, 98, 78,159, 56,113,194, 61, 50, 50, 18, 0,112,229,202,149,123,157,206,168, 40, 4, 7, 7,163,188,188, 28, 83,167,
+ 78,173, 80, 42,149, 99, 97,195,231,183,166,166,230,206,222,189,123, 59,232,245,250,222,239,189,247,158,170, 83,167, 78, 58,147,
+201, 68, 84, 87, 87, 51, 20, 69,193,205,205, 77,220,187,119,111, 12, 24, 48,160,246,226,197,139,157,139,139,139,107, 0, 20,180,
+ 39,243,241,241,241, 56,123,246,222,164,189,135, 17, 87, 75, 36, 18, 33, 50, 50,210, 63, 63, 63,191,180,238,221,210,230,103,124,
+227,215,203,181,107,215,112,230,106, 9, 4, 22, 35,196,106, 5,126, 63,176, 23,227,103,205, 5, 69,181,223,139,225,255,216, 59,
+239,240, 40,170, 54,138,159, 41,219,178,233,101,211, 11, 33,144, 64, 32,244, 78, 16,144,166, 18, 62,138, 84, 65,154, 64, 64, 20,
+ 16,165, 35, 69,165, 35, 69, 58,168,244,142,148,160, 2, 81,122, 9,157,132, 36, 4, 2,132,180, 77,239,217, 62,229,251, 35,197,
+ 4, 82,118, 19,108, 56,191,231,153,103,182,204,158,157,153,187, 59,247,204,123,239,125,239,253,251,247,113, 60,244, 6,204,165,
+ 52, 30, 61,122,136, 35, 71,142, 96,226,196,137,181,210,172, 33, 85,122,145,127, 56, 74, 84,210, 79,139, 6,128,160,160,160,139,
+ 37,209,138,178,248,248, 64, 34, 45,192,130, 30, 45,220,102, 12, 14,172, 71, 25,242,146,193,177, 28, 40, 17,224,232, 96,133, 61,
+123,246,215,221,127,240,224,245, 77, 27, 55,173,231, 24,102,110, 68, 26, 84, 38,236,212,130,111, 15, 94, 25,188,103,122, 23,122,
+226,187, 13,237, 0, 64, 76,147, 88,119,242, 33, 3, 96, 65,109,142,182,157, 27,100, 5, 6,140,119,180,183,158, 63,251,163,222,
+118, 93, 90,249,225, 98, 88, 4,214, 31,185,126, 73,146,134,221, 70,255,184, 57, 3, 94,246, 79, 21,141, 58, 4, 87,125,191, 75,
+150,229,157,197,230,182,208,199,157, 7,244, 26,104,180,122, 36,100,178, 72,200,210,128,150,139,113, 59, 38, 81,109,159,130,144,
+ 90, 28, 54, 97, 46,151,185,126,249,205,106,119,141,186,128,201,203,206, 96,196,146, 27, 34,185,153, 84,105, 74, 87,133, 27, 73,
+208,188,229, 45,106, 9,112,148, 68,198,171,230,124, 54,202, 60, 41,242, 12,234,147,201, 32,120, 30,102,254,189, 97,105, 70,137,
+ 3,235,136,226, 1,192,220, 92, 46, 89,190,232,115,235,169, 51, 23, 85,219, 7,204, 31, 16,251,249, 56, 79, 13,240,178,197,165,
+ 59,209,184, 20,254,226,225,165,219,143, 26,119,109,226, 10, 63,119,155, 41,146,236,156,101, 81, 48, 61, 66, 90, 84, 48, 12, 96,
+208,148,142, 58,244,119,196,176,214,131,231, 85, 54,218,176, 66,188, 1, 46,134,229, 65, 80, 20, 64,144, 69, 35, 32, 19,174,130,
+182,241,225,247, 31, 58,174,218,177, 99,247, 87, 81, 25, 66, 20, 75, 64,160, 58,114,115,115, 31, 68, 69, 69,245,106,218,180,233,
+206, 79, 63,253,212,114,248,240,225,174,227,198,141, 35, 1, 32, 53, 53,149, 91,187,118,109,242,119,223,125,151,155,145,145, 49,
+218, 96, 48,132, 27,243, 15, 87, 42,149,215,190,255,254,251,244,203,151, 47, 55,110,211,166,141,180,101,203,150,156,173,173, 45,
+ 45,149, 74, 89,157, 78,167,137,137,137, 97,159, 62,125,234,146,147,147,243, 4, 64, 44,106,208,172, 95, 28,189, 90, 76, 81,212,
+151, 60,207, 7,188,142, 62, 90,114,185,220, 21,192, 19,130, 32,234,155,218,108,248, 74,133, 77,211,200,206,206,134, 42,229, 33,
+100,137,143,209,212,156, 68, 35, 91, 11, 88, 89, 89,213,202, 20,229,230,230, 2,133, 73,184,114,229, 62,192, 48,176,182,182,134,
+181,181,245, 95,110,180, 42,243, 34,255, 18,198, 87,240, 90,213,125,180, 26, 41, 48,209, 76,135,181, 19,122,215, 19,123,123,186,
+ 67,155,120, 27,247, 19, 10, 48,183, 93,155, 72, 74,106,169,153,240, 97,223, 86, 3, 6,214, 65,151, 14,173, 9,111, 23,235, 41,
+203,190,221,252,113, 35,100,124, 30,153,134,117,198,236, 81,100, 58,158,113, 72,219,113,254, 65, 98,176,187, 92, 13,142,227,113,
+ 62, 92,137,240,184,236, 29,209,233,120,102,202,209, 53,114, 65,119, 26,228, 65,158,231,101,214,230,230,249,141,252,220, 29,186,
+183,111, 70,190,211,185, 21,196, 20,112,229,230,125, 76,251,246,216, 13,142,227,123, 27, 61, 66,140,227, 94, 49, 80, 69, 35, 12,
+ 13,229, 70, 24,242, 60,207, 23,141, 58,172,186,219, 23, 69, 17, 41,170, 23,183,156, 69,246,190, 80,199,158, 71, 92, 54,135, 23,
+105,249,200,163,157,161, 77, 74, 2,120, 46,254, 98, 45, 58, 86, 59, 56, 56, 56,214,109,228, 87,111,195,174, 35,208,171,114,241,
+236,194, 78, 20,100, 43,241,245,150,147,245,220,220,236, 59, 39, 37, 37, 93, 52,225, 98,227,247, 91,200,126, 71,240, 0, 37,146,
+226,244,166, 67,200,176, 55,131,131, 92, 12, 78,157,142, 9, 83,135, 91,191,219, 99,184, 53, 0,188,120,116, 15, 94,114,181, 81,
+186,122,123, 12, 24,220,181,129, 13, 12,106,236,250,245,158,134, 4,222,217,125,246, 97,108,215,134, 54,178,193,129, 94,182,139,
+147,115,222, 71,102,205,146,138,150, 68,180, 74, 35,124, 53, 24,109,120, 4, 96, 27,114,136, 61,120, 45,205,124, 96,143,150,114,
+ 49, 77, 16,124, 65, 18,120, 51, 7,108,222,117,184, 64, 98,248,107,102, 98, 23, 16,120, 19, 80,171,213,119,212,106,117,147, 47,
+190,248, 98,216,156, 57,115,222, 50, 55, 55,175, 11, 0,133,133,133,207, 12, 6,195,165,226,255,167, 41,163, 3,121, 0, 79, 98,
+ 99, 99,159,197,198,198, 58,237,221,187,215, 6,128,172,248, 61, 13,128, 28, 0,169,168,197,136,195, 18, 83, 69, 16,196,151,175,
+235, 60,148,152, 42,130, 32,234,215,228,243, 36, 73,178, 4, 65,128, 32, 8, 72,165, 82, 92,190,124, 25,131,122,247, 64,212,233,
+ 28, 4,216, 88,160,205,232, 9, 56,120,238, 28, 40,138, 2, 65, 16,160, 40,202,164,122,132,166,105, 92,185,114, 5, 35,134, 14,
+132,148, 6,172,173,173,241,197, 23, 95,224,196,137, 19,160,105, 97,150, 62, 19,216, 86,198,112, 25,153, 71,139,192,226,115, 59,
+151,136,193, 26,112,106,231, 42,132, 68, 20,232, 30,165, 99,110,131,116,172, 61,130,124, 46,253,219,221,193,231,174, 68,172, 28,
+ 51, 36, 72,254,118,215, 30,120,187, 75, 87,186,113,235,206,243,129,114, 70,171, 59,170,200,181,193,114,248,106,219,175,209, 19,
+ 14, 94,136, 33,160,207,199,144,158,173,121,150,195, 87,213, 28,204, 43,154,214,102, 22, 7,175, 92,191,110, 11,125, 1,226,238,
+253, 46,171, 83,183, 30,192,234,241,228,201, 99,124,183,235, 39,238,194,205, 71,123,116, 12, 62,125,154,141, 66, 99, 53,139,156,
+ 21, 3,107,115, 73,131,119, 26, 91,253,194,129,135,141, 92,220,144,231, 88,216,200, 69, 13,123, 52,148,255,194,243, 60,111,105,
+ 38,106,200,179,134,106, 53,213, 58,102,235,174, 31,118,172, 30, 59,118,172,121, 70, 98, 10,146,243, 34, 80, 32,113,131, 65,238,
+129,216,123,151,212, 42, 45, 99, 76, 37, 94,233,249,204,200,200, 72,187, 19,150,133,131, 91,150,194,160,211, 34, 45,177,200,171,
+ 38,103,228,193,202,193,237,122, 82, 82,146,209,154,122,134,203, 29, 48,124,188,216,204, 18,102, 35, 6, 4, 73, 98, 51,181,104,
+225,106, 89,116,209, 40, 72, 71, 84,232, 21,116, 41,238, 99,250, 52,129,132, 87, 51, 87,163,246,211, 82, 38,254,244,221,150,110,
+120, 22,175,196,229,135, 73,187,158,101, 33,153,141, 86,238,138, 77,206, 9,238,219,206, 19,107, 78, 68,126, 2, 24,246,155,114,
+236,254,142, 24,198,243, 8, 44,234, 12,175, 6, 15, 4,250, 59, 98,152,145, 35, 13, 95,209,164,197,248, 96,245, 47, 47,230, 29,
+190,149,209,119,198, 7,157,172, 58,116,120, 79, 2, 70,135,124,181,214, 16,149,131,188,218,148, 81, 45, 16, 52, 5,205,127,171,
+ 38, 11, 96,143,193, 96,216,147,147,147,243, 58, 53,147,241,106, 94,167, 90, 29,123,217,102, 66,158,231,233,226,104, 86,117,157,
+225,171,212, 44,219, 76,200,243,252,207,197,209,172,234,162, 90,229, 52, 57,142, 75,110,213,170,149, 93,159, 62,125,192,178, 44,
+ 30, 63,126,140, 23, 9, 9,232, 30,252, 9,108,108,108,112,233,193, 3, 60,122,244, 8, 95,126,249, 37, 12, 6, 3,142, 31, 63,
+158, 88,157, 38, 77,211,250,122,245,234,137,251,245,235, 7,134, 97,240,244,233, 83, 36, 37, 37, 97,218,180,105,176,182,182,198,
+157, 59,119, 74, 53, 51, 50, 50, 64,211,180,190,130,232,214,159,241, 91,250,183,243,138,201,170,218,104, 1, 44, 88, 3,114,207,
+ 45,192,186,203,208,235, 13,104, 24,153,142,231,145,127, 68,164, 54, 83, 97, 15, 78, 61,136,136,126,118,231,234,219, 18,164,133,
+195,212, 59,137,199,153, 80, 90,202,242,243,161,207,183,194,211, 95,240, 60, 53,191,224,113, 38,148, 38,223, 49,112, 44, 1,189,
+ 10, 80,222,198,181, 75, 23,113,225,198,125,220, 10,143,102,175,221,137, 57, 72,114,248, 42, 42, 19,143,107,112, 23, 2,139,222,
+107, 48, 42,252,137,103,107, 63, 39, 79,176, 12,120,206, 0,235, 33,251, 49, 58,178,131,103,107, 31, 27,207,162, 72,150, 1,182,
+ 31,253, 14,172,150, 85,169,119, 59,193,176, 77,114,226,204,251,249, 57,153,237,186,117,110,111,110,237,255, 46, 50,158,196,224,
+241,253, 43,234, 59, 17,177,215,110, 39, 24,106, 21, 45,113,115,115,123,171, 91,231, 6, 24, 50, 97, 54,244,170, 92, 60,189,240,
+ 3, 10,178, 82,112,249,186, 5,162,243,242,218, 3, 48, 58,162,117, 61,158,105,140,248,108,116,172, 35,138,183,132,214,249,195,
+160, 62,144, 18, 26,112,218, 60, 16,170, 12,196, 38,233,114,223,223,146,192, 2,128, 92, 74,208,230,124,174,149, 81,145, 71, 47,
+123, 95, 57,101,192,238,115, 15,193,113, 69,211, 55,113, 28, 54,239,254, 61, 54,248,171, 17, 45,208,200,211,182,217,189,164, 52,
+ 2, 38,132,252, 9, 30,157,110, 29, 92,212, 80,243,219,124,128,211,227,202, 20,187,134,157,214,101,117, 66, 13,167,219,137, 72,
+ 70, 18,128, 96,208,170,173, 83,214,253, 58,191,213,185,200,192,233, 31,245,181, 2, 47, 76,192, 46, 32, 32,240,215, 83, 80, 80,
+ 48, 97,244,232,209, 91, 69, 34,145, 2, 0,193,113, 28, 56,142,163, 87,174, 92, 41, 98, 89,150, 36, 73,146,165, 40,138,249,249,
+231,159, 13, 44,203,166,107, 52,154, 9,213,105, 50, 12, 19, 59,105,210,164,122,213,141, 80, 60,112,224, 64,137,201,138, 21, 74,
+194, 40,147, 85,118, 93, 26,229,170,188,242,224,177,168,227,136, 5, 11, 0, 16,224,177, 48, 50, 29,207, 95,222, 36, 60, 11,201,
+141, 40,253,180,198,173, 59, 47, 40,249,140,169,123,166, 97,217,129,173,155,248, 29, 0, 0, 45,207,142,168,201,209,229,105,213,
+131,155,183,110,127,144,227,121,154,225,249, 29, 36,135,163, 26, 6, 81,198,140,180,171,140,228,180,156, 59,239, 6, 88,243, 64,
+ 81,147, 97,105,115, 97,113, 26, 7,158,231,249,210,230,194, 85, 50,100,228,106,171,205, 3,117,245,185,174,135,142,185, 53,254,
+236,213,123, 19, 88,150,119,166, 40, 34, 69,173, 99,182,214,214,100, 1, 64, 82, 82,210,197,208,115, 73,103, 31, 52,115,234,233,
+ 32, 47,142,114,169,128, 12, 21,206, 38,165, 23, 92,172,137,102,118,161,161,239,156,181, 39, 78, 74, 68, 20, 13,158, 47, 74, 40,
+202,243,208,232,217,172,235,241, 76, 99, 0,104, 98, 7,215, 47,142, 51, 7, 40,138,120, 81,157, 94,216, 35,229,154, 33,203, 66,
+ 63,127, 24,151,189, 35, 46, 7, 17, 0, 16,151,131,136, 67, 87,158,207,143, 77,201,255, 60,226, 69,246, 42,152,216,175,130, 39,
+112,185,245,144, 5,175,188, 86,219,243, 25,173,196,125, 0,253,129,196, 30, 67,166,127, 55,157, 32, 32, 76, 63, 33, 32,240, 31,
+162, 36,170, 69,146,228,226,215,168,249, 51, 65, 16,239, 1,120, 98,194,199,194, 10, 10, 10,154,188,230,195,203,100, 24, 38,211,
+152, 13,255,134, 14,241,255, 86,254,182,174, 37,221, 5,205,191, 94,179,126,253,250,188, 9,134, 69, 56,159,130,166,160, 41,104,
+254,167, 52,121,158,167,106,179, 84,162, 73,212,102, 17,202,232, 95,207,248,202,158, 11,205, 33,111, 32, 79,158, 60, 33,132,179,
+ 32, 32, 32, 32, 80, 49, 4, 65,176,127,130,166,144,188, 88,160,196, 96,149,139,110,145,194, 57, 17, 16, 16, 16, 16, 16, 16, 16,
+120, 45, 38,171,236,186,200,132,163,242,240,159, 41,163, 9,106, 18, 66, 12, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,
+ 63,167, 89,157,182, 48,154,241, 79, 54, 96,130,166,160, 41,104, 10,154,130,166,160, 41,104,254,247, 52,255,205, 84,218, 71, 75,
+104, 58, 20, 16, 16, 16, 16, 16, 16, 16,248,147, 16, 58,195, 11, 8, 8, 8, 8, 8, 8, 8,212,142,106, 39,149, 22, 16, 16, 16,
+ 16, 16, 16, 16, 16,168, 25, 85, 79, 42, 45, 32, 32, 32, 32, 32, 32, 32, 32, 80, 99, 76,159, 84, 90, 64, 64, 64, 64, 64, 64, 64,
+ 64,192, 40,182, 9,167, 64, 64, 64, 64, 64, 64, 64, 64,224,175,161,252,168,195,144,144, 16,190,236, 90, 64, 64, 64, 64, 64, 64,
+ 64,224,175,228, 77,245, 34, 66,211,161,128,128,128,128,128,128,128, 64,237, 24, 47, 24, 45, 1, 1, 1, 1, 1, 1, 1,129, 63,
+135, 74,251,104,149, 36, 44,237, 82, 28,170,235, 34,156, 43, 1, 1, 1, 1, 1, 1,129,191,129, 55,219,139, 8,253,179, 4, 4,
+ 4, 4, 4, 4, 4, 4, 47, 34, 32, 32, 32, 32, 32, 32, 32, 32,240, 79, 66,152,235, 80, 64, 64, 64, 64, 64, 64, 64,224, 47, 54,
+ 92,127,186,209, 18,102, 54, 23, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,100,178,202,153, 45, 97,212,161,128,128,128,
+128,128,128,128, 64,237,168,118,212,161,128,128,128,128,128,128,128,128, 64,205, 24, 15, 32,168,248,113, 16,202, 68,181,132,136,
+150,128,128,128,128,128,128,128, 64,237,216, 6,192,165,216, 96,157, 6,160, 20,140,150,128,128,128,128,128,128,128,192,235,161,
+108,191,172,222,101,204,151, 96,180, 4, 4, 4, 4, 4, 4, 4, 4,106, 73,165,125,180, 8, 84, 62,114, 32,212,132, 47,168,201,
+232,131, 80, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,115,154,213,105,135,226,223,199,120, 83,204,215,235, 68, 24,250,
+ 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150,215, 62,234,176, 5, 96, 38,156,214, 55, 18,167,226, 69, 64, 64, 64,
+ 64, 64, 64,160,106,254,156, 81,135,254,192, 71,195, 3, 20, 91, 12, 17,233, 86, 17,128,170,170,109, 21, 10,197, 86,185, 92, 62,
+ 92,165, 82, 21, 18, 4,193,149,188,206,243, 60, 0,148,157,235,232,105,122,122,122,167,234,190, 91, 34,145,172,117,114,114,250,
+168,160,160, 64, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 87,214, 44,203, 38,102,102,102,182,250, 87, 23, 33,207, 83, 14, 78, 78,
+ 55, 69, 20,229,102,234, 71, 89,142,123,158,150,154,218,222,132,143, 44, 37, 8,204, 40,250, 90,172, 0, 48,251, 77,251, 71,240,
+ 0,101,204,118, 1,128,101, 12, 48,132, 37,201, 79, 68,192, 70, 45,199,109, 1, 0, 2, 96,107,250,221,218, 48,212, 35,120, 52,
+ 35, 8, 88,243, 60,114,121, 2,247,165,109, 17,251, 55,157,138, 1, 34,145,168,175,149,149,149, 69,102,102,230, 69, 0, 7, 0,
+ 12,181,183,183,239,156,151,151, 87, 96, 48, 24, 78, 0, 56, 86, 19,225, 78,205, 48, 83, 34, 22,141,209,232, 13,203,175,222,199,
+ 15,157, 91,192,158,225,176, 76, 38,166, 59,105,117,204,138, 43, 15,176,195, 68, 73,162,120, 41,185,102,152, 60, 71,218, 97, 35,
+203, 29, 0,142,219,218,250, 73, 21, 86,191,137, 36,212,243,156,212,130,225, 3,211,210, 18, 6,213,162,220,255,137, 56, 56, 56,
+140, 34, 73,242, 27,158,231,193,178,236,220,172,172,172,157,175, 73,122, 46, 0,155,226,199, 57, 0,190,169,165,222, 11, 0,158,
+197,143,227, 1,120, 9,245,122,141,217,252,211, 79, 63, 5,119,237,218, 21,107,214,172,193,230,205,155,227,210,211,211,151, 1,
+216, 5, 64,247, 55,232, 8, 84, 70, 35,224,189,149,189,218,178,134, 31,191,226,202,188,220,189,146, 63,243,247, 31,126,248,161,
+158,231,121,254,209,163, 71,188, 78,167,227, 13, 6, 3,207, 48, 12,207, 48, 12,111, 48, 24, 74, 23, 55, 55,183,164,151, 62,254,
+138, 38, 73,146,235,222,127,255,253,124,158,231,249,219,183,111,243,106,181,154,215,106,181,188, 78,167,227, 53, 26, 13,175, 86,
+171,203, 45, 78, 78, 78,169, 85,105, 90, 89, 89,221,182,181,181, 77,181,181,181, 77,181,179,179, 75,181,179,179, 75,181,183,183,
+ 47, 93, 28, 28, 28, 74, 23,133, 66,145,170, 80, 40, 82,237,236,236,110, 87,183,159,197,244, 2,112,209,136,165, 87, 5,159,237,
+ 94,214,104,185,184,184,164,242, 53,192,221,221, 61,193,136,253, 44,193,137, 32,192,150,124,150, 32,192, 73,165, 82,207,178,239,
+227,213, 72, 87,181, 33,101, 87, 87,215,247, 93, 92, 92, 66, 93, 92, 92,206,185,186,186,190,111,196, 79,172,156,166,165,165,229,
+109, 7, 7,135, 84,103,103,231,180,146,197,197,197,165,220,226,234,234, 90,186, 56, 57, 57,165,218,218,218, 86, 90, 70, 60, 64,
+ 85,182, 92, 0,104, 41,240, 54, 77, 81, 33, 78, 78, 78,121,225,225,225, 44,207,243, 60, 73,146, 73, 37,219,152,114,236, 47,155,
+ 44,213, 21,204,205, 56, 47, 13, 43,120,190, 44, 55,227,188, 52, 76,117, 5,115,181, 97,168, 87, 83, 77, 35,169, 72,115,228,200,
+145, 35,239,167,166,166, 38,229,228,228, 40,183,108,217, 18, 35,147,201,174,108,217,178, 37, 38, 39, 39, 71,153,154,154,154, 52,
+114,228,200,251, 0, 38,153,160, 9, 0,104,223, 12,237,198, 14,112, 81,221, 63, 62, 66,245,118,107,250, 94,199, 0, 4,245,104,
+ 47, 78,218, 48,203, 95,117,105,123,160,170,107, 75, 50,194, 68, 77,130,166,233, 14,158,158,158, 99, 20, 10,197,135,197,203,136,
+146,197,217,217,121,132,179,179,243, 8, 91, 91,219, 65, 85,105, 30, 6, 40, 99, 22, 15,153,172,195,160,186,158,170, 23,139, 23,
+242,225, 83, 63,225,199,248,120,228, 13,116,116,172,243, 55,148,209,159,170,233,232,232,152,108, 48, 24,120,189, 94,207,219,219,
+219, 39,191,198,253, 92,197,243,252, 42,158,231, 87, 1, 88,245, 26, 52, 75,175,103, 38, 24,236,170, 52,101, 52, 73, 78,151, 75,
+ 36,231,164, 52,157, 38,165,233, 52,185, 68,114,142, 38,201,207, 1,200,254, 73,101,244, 39,104, 90, 40, 20,138,103,107,215,174,
+229, 85, 42, 21,175, 82,169,248,181,107,215,242, 10,133,226, 25, 0, 11, 19, 52,107,170,243, 38, 69,176, 94, 94, 94, 95, 68,203,
+ 31,104,245,118,179,250, 71,167,140, 26, 2,238,200, 90,162,154, 59,166,239,219,183,106, 53,102,215,174, 93, 0,128,225,125,251,
+162,103,155, 54,176,180, 48,135, 68, 82,180, 59, 4, 79, 64, 44, 18,163,223,180,207,140,249,250, 21,253,250,245,251,224,200,145,
+ 35, 22, 0,176,121,243,102, 12, 24, 48, 0,118,118,118,144,203,229, 16,139,197, 16,137, 68,229,214,213, 65, 81,148,123, 82, 82,
+146,163, 76, 38, 43,141,178,113, 28, 87,110,225,121,190, 36,250, 6,134, 97,224,235,235,107,236,233,154,149,155,155,251, 86, 97,
+ 97, 97,169, 70, 69, 75,221,186,117, 1,224,140, 49,130,223,124,253, 21, 56,166, 16, 52, 13, 48, 12,160,213,147,224,248, 10,205,
+ 13, 38, 77,154, 84,186,223, 53,161,119,239, 32,130, 32,136, 35,119,238,220, 57,154,150,150,230,205,113,236,184, 26, 70,186, 62,
+126,252,248,177, 5, 0,248,249,249, 77, 2,112,212,148,253,160,105,218,253,193,131, 7,142, 82,169,180,210,200,101,153, 8, 38,
+244,122, 61, 90,180,104,193,152,242, 29, 78,128,103, 22, 73,142,107,222,178,229,248, 5,253,250,201,110,222,188, 41, 35, 73, 18,
+ 12,195, 96,229,202,149, 12,207,243, 54,141, 0,171, 72, 32,175, 10,153, 57, 0, 70, 21, 87, 6, 59, 0,172, 44,231, 22,120, 52,
+ 83, 27,164, 65, 79, 11,250,181,105, 91,103, 38, 34, 31,134,183,241,177, 56, 14, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,
+107,214,172, 81,236,216,177, 35,239,209,163, 71,250, 45, 91,182, 40, 38, 76,152, 96,169,215,235, 17, 28, 28,156,222,160, 65, 3,
+241,154, 53,107, 20,199,142, 29,123,187,176,176,112,147, 73,229, 69,224,171,161,125,123, 66, 99, 32, 97, 48, 48, 10, 23,133,229,
+158, 41, 35,187,136,120, 94,135,221, 39,238,192,192,112, 63,152, 24,201,106, 63,112,224, 64,159,253,251,247,211,209,209,209,116,
+195,134, 13,193,113, 28, 88,150,133,193, 96, 0, 0,112, 28,135,250,245,235,215,250,188,140, 1,252, 28,156,236,206,181,127,239,
+ 93, 51, 23,153, 20,118,217,233, 24, 43,166, 45,119,202,181,123, 1,116,120,163, 34,187, 60, 15,154,166,145,144,144, 0, 71, 71,
+ 71, 51,142,227,148, 0, 22,102,103,103,111,195,155, 75, 27, 9, 77, 31,221,253,195, 58,231,182, 29, 58, 80, 78, 46,142,136,121,
+ 28, 15,154, 96,187, 63,184,117,167,203,152,137,211,167,232, 24,230,125, 0, 55,223,180, 3,119,238, 48,169, 63, 65, 82,155, 9,
+158,195,162, 13, 39,243,151,174, 88, 43, 15, 30, 55,146,154, 54,109, 26, 60, 60, 60,188,251,247,239,191, 2,192,196,106,117,218,
+ 78,234, 15,138,220, 12,158,199,130,239, 78,230, 47, 89,177, 86, 62,177, 6, 58,255,114, 42,253,143,212,218,104,249, 3, 62,141,
+ 61, 28,207, 46,157, 49, 81,196,255,242, 35,169,202, 76,171,116, 91,133, 66,177,245,157,119,222, 25,190,115,231, 31,209,232,246,
+ 1, 1,232,255,118, 32, 28,237,173, 33, 55,151, 20, 85, 71, 28,129,251,143,158, 27,101, 8, 60, 60, 60,130,143, 30, 61,106, 81,
+214, 76,136,197,226,210,165,172,201, 42, 89, 74, 42,224,170,144,201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 46,101,
+159, 83, 20, 5, 39, 39,147,186, 46, 45,179,182,182,110,154,159,159,111,149,147,147, 3, 79, 79,207, 60, 0, 15,202,188,223, 52,
+ 61, 61,221,202, 20, 65,142, 41,196,180,177,254, 16,233,110, 64, 39,106, 3, 53,221, 17,215,110, 69, 33,228,204, 69, 36, 37,167,
+ 32,176, 93,115,124, 56,108, 32,206,157, 59, 7,150, 53,185,165, 35,149,231,177,162, 79,159,160,153, 0, 65,116,239,222, 61,103,
+242,228,201,100,116,116,244, 7,253,251,247, 11,120,252,248, 73,113, 84,145,152,193,243, 88, 7, 32,213, 72, 93, 9, 0, 92,186,
+116, 9, 0,164, 53,249,237, 73,165, 82, 92,191,126, 29, 37,205,196, 36, 73,130, 36, 73, 80, 20,133, 83, 79, 28, 80,168, 35,161,
+ 74,141,192, 39, 65,158,168, 91,183, 46, 72,178,250, 46,137, 93, 0,217, 53,160, 63, 33, 18, 77,115,113,117,245,238,236,227, 35,
+ 15, 13, 13,165, 0,192,203,203,139, 87, 42,149, 57, 39, 78,156,200,167,129,205, 94, 60,191,171, 42,147,229,225,225,209, 49, 41,
+ 41,233,155,146,115, 78, 16,196,138, 58,117,234,124, 89, 90,110, 28,135,133, 63, 20,138,166, 76,153, 42,110,219,101, 30, 0,160,
+109,159,253,200,123,186,212,159,200,154, 99,253, 87, 95, 37,242,242,242, 14,214,175, 95,159,202,204,204,188, 6,224,133,193, 96,
+152,181,103,207, 30,199,177, 99,199,166,237,221,187,119, 25, 0,215,229,203,151,119, 41, 44, 44, 60,100,138,110, 96, 83,188,215,
+178,105, 64, 59, 79, 15, 15, 92,188,118, 19, 98,137,200,102,210,168, 32, 88, 88,208, 88,181,227, 52,247, 34, 49,107,242,149, 7,
+216,101,130,201,106, 51,112,224, 64,239,253,251,247, 75, 0,224,193,131, 7, 72, 73, 73,129, 66,161,128,153,153, 25, 68, 34, 17,
+ 40,138,130, 72, 36,122, 45, 38,203,218,195, 62,236,248,241, 19,102,118,118, 54,216,240,217, 20,124,152,150, 10, 27, 75, 11, 24,
+ 10, 10,189,223,176,138,194,175, 83,167, 78, 50,150,101, 81, 88, 88,136, 11, 23, 46, 88,155,153,153, 89,187,187,187, 47,128, 9,
+163,167,100, 50, 89,170, 70,163,113, 44,126,156,166,209,104,156, 0,228, 73,165,210,146,235,116, 65,241,218,216,230,196, 23,120,
+181,153, 48,158, 32,136,178,175,213,148,214,109, 90, 55, 13, 61,118,100,159, 69,110,126, 10,108,108,211, 64, 34, 23,219,182,109,
+132,153,153, 21, 22, 44,152, 67, 63,239,254,182, 91,175,247,222, 15,125, 24, 21,211,253,141, 51, 91, 60,177,173,123,159,225,118,
+102,114,203,226,186,196,128,157,219,167,128, 36, 73,124,249,229,151,104,220,184,241,248,135, 15, 31,206, 3,144, 85,181, 12,182,
+ 53,121,107,176,157, 68, 86, 84,196, 28,107,192,150, 3,159, 23,233,204,158,128,161,125,234,142,255, 98,224,179, 95, 27,251, 32,
+191,248,198, 92, 45, 34, 17, 79,180, 69,169, 97, 8, 9, 9,233, 28, 20, 20,116,177,178,231,255, 2, 92,240, 71,254,172,114,230,
+139, 14, 9, 9,225,131,130,130,136, 50, 7, 87,238,121, 85, 52, 3, 28,108,173,229,161,155, 23, 78,177,160,111,156,166,212,241,
+ 79,144,172, 41, 87,145,151, 27,162, 41,151,203,135,239,220,185,179, 92, 72,201,211,201, 17, 98,177, 8, 34, 49, 1,155, 78, 69,
+217,235,115, 46,135,128, 32, 42, 53, 89,229, 52, 11, 11, 11, 53,247,238,221,179,216,177, 99, 7, 28, 29, 29,225,237,237, 13,185,
+ 92, 14,153, 76, 86,206, 92,149, 53, 92, 21, 24,173,114,154, 37,239,211, 52, 13,146, 36,113,238,220, 57, 48, 12,131,129, 3, 7,
+190, 98,178,104,154,174,204,184, 85, 54, 60,245, 12,128, 7, 60,207,191, 85, 92, 1, 63, 0,208,185,204,251,189, 20, 10,197, 44,
+ 0,203,140,213,164, 40, 30,148,230, 26, 56,247,181,160, 19,166, 64, 39,106,134,243, 87,238, 96,231,214, 53, 0, 0,239,134,173,
+ 49,168,127, 80,105, 52,206,200,253, 44,197,205,205,237, 64,122,122,198,187,111,191,253, 54,178,179,179, 13, 11, 23, 46, 68,211,
+166, 77,225,231,231,103, 84, 25, 85,114,231,156,250,224,193, 3, 15,181, 90, 13,158,231,141, 49,103,175,104, 18, 4,129, 61,123,
+246, 64,163,209,188,178,177,109,231, 37,248,124,128, 23, 70,127,178, 11, 43, 30, 29,194,166, 77,155,170, 60,118, 57,208, 84, 99,
+ 93,127,157,132, 98,154, 46,155,243,177,244,195, 15, 63,164, 70,143, 30,141,248,248,120,140, 29, 59, 86,115,238,220, 57, 93,138,
+ 82,121, 66,194,113, 27,244,229,141,113,165,154, 82,169,116,247,153, 51,103,112,232, 80,145, 47,137,137,137,129,175,175,175,121,
+ 57,147,156,117, 24,249, 47, 54, 32,236, 84, 52,218,246,217,143,176, 83,195,192,230,156, 22,181,242, 69,174, 41,231,179, 6, 84,
+164,121, 40, 51, 51,179,212, 68,237,221,187,215,108,239,222,189,253, 0,156, 4,112, 8, 0,178,178,178,190, 53, 81, 19, 32, 48,
+122,240,128,126,160,197,150,136,126,146,136,206,237, 91,192,201,209, 17, 15,162, 98,241, 34, 41, 43,149, 32, 48,170, 87, 7,201,
+ 50,181, 90, 55,239,242,125,124, 95,141, 38,225,238,238,238,119,248,240, 97,113,153, 8,116,233,127,156,162,168,210,231, 37,198,
+187, 38,191,207, 18,147,101,233,110, 17,246,213,198,142,230, 97,225,123,225,235,245, 30,108,223, 11,194,247,103,207,226,241,195,
+ 72,141, 78,197,116,251, 27,202,232,207,210,244, 27, 48, 96,192,181,125,251,246,217, 36, 36, 36,224,210,165, 75,240,246,246,134,
+ 74,165, 50,230,134,183,156,166, 70,163,113, 44,249, 12, 65, 16,142, 37,129,119,157, 78, 87, 82, 24, 37,127, 68,155, 50,219,217,
+ 84,161,233, 89,102,187, 18,115,229,245, 26,142, 93, 34, 19,139, 15, 31, 63,118,192, 34, 50,250, 18,154, 55,107, 7, 11,235, 70,
+224,216, 20,100,102, 21, 32,251, 73, 50,190,254,122, 5, 22, 44,156,139,147, 63, 29,177,104,224,223,236,168,142, 97,234, 3,208,
+188, 49,229, 78,240,227, 67, 79,237,221, 76,240, 28,212,169,209, 82, 81,225, 51,249,240, 97,239, 83, 67,134, 12,193,201,147, 39,
+241,240,225,195,205, 85,152,172,208, 50,145,249,241, 17,151, 14,109, 6,207, 67,157, 22, 45, 21,171,159,201, 71,126, 48,136,250,
+112,104, 79,220,248,125, 29,122, 54,127, 22,225,234,136,254,217,197, 22,155,166,144, 41,149,225, 42, 31,134, 27,101,204,214, 5,
+ 0, 68, 25,131,117, 1,127,244,193,252, 55,208,187,216, 88,141,127,249,198,132,174,137,193, 2, 0, 95,192,130,144,136,195,118,
+ 46,248,216, 85, 30,255,144,214, 70, 92, 71,178,150,227,183,196, 49, 92, 11,192,236, 46,160,126,249, 51, 42,149,170, 48, 54, 54,
+214,108, 84,255,254,232, 16, 16, 0, 23,123,123,212,119,119,135,153, 84, 2,137, 88, 84,238,150,213,232, 54, 4,130,224, 27, 52,
+104,128, 62,125,250, 64, 36, 18, 65, 46,151,195,194,194, 2, 18,137,164,194,104,150,177,119,185, 60,207,131,162, 40, 68, 68, 68,
+224,197,139, 23,176,177,177,193,213,171, 87,209,173, 91,183, 87,162, 90,101,205,153, 41, 33,250, 10, 42,254, 18, 35,118,198, 20,
+ 45,150, 37, 80,192, 55,131, 44,110, 50, 84, 68, 11,104,181, 12,180, 90, 45,190,191,162,199,205,216, 66,232,245, 58,104,181,218,
+170,190,179, 50, 72, 87, 87,215,225,245,235,215,159, 52,108,216, 48,131, 68, 34, 65, 97, 97, 33, 84, 42, 21, 30, 62,124,104,120,
+247,221,247,114,250,244, 9,178, 62,125,250, 52, 95,220,116,152,106,130,118,166,155,155,155, 71,113,243,108,102, 77,126,213, 4,
+ 65,148,154,152,151, 25,245,109, 36,104,170,168, 76, 54,111,222, 12,150,101,193,243,124,165,133,164, 33,136,223, 22, 46, 89,109,
+189,124,237, 15,176,182,115,194,197,139, 23,217, 95,127,253, 53,159, 0, 98, 30, 63,124,248,237,255,128,159, 15, 3,122, 83,246,
+ 47, 59, 59,219,204,219,219, 27,238,238,238,224, 56, 14, 6,131,161, 52,250,146,153,153, 9,181, 90, 13, 59,243, 28,212,179,119,
+ 7,147,127, 1,202,136, 69,112,177,136,198,174, 51, 58, 67, 75, 63,220,255, 7, 92, 56,126, 44, 94,106,121,215, 12, 55, 71,103,
+ 15,144,188, 1,201,105,153,232,215,187, 39, 40,177, 5,158, 39,100,160, 89, 35, 31,151, 15,254,215,209,133, 34, 24,204, 88,182,
+127, 18,192,125, 95,157, 92, 65, 65, 1, 27, 29, 29,141, 7, 15,138,252,174,149,149, 21,204,205,205,203,253,199, 73,146,172, 85,
+ 68,171,196,100, 45,217,220,205,156, 20, 21, 34,143, 13,197,142, 61,119,208,172, 65, 16,182,132,221,210,176,169, 89,221, 87,105,
+ 52, 49, 7,254,197,193, 12,103,103,231, 9, 28,199, 45,224,121, 62, 39, 48, 48,208,105,255,254,253,182, 73, 73, 73,184,115,231,
+ 14,190,252,242,203,116,150,101, 25,158,231, 9,158,231, 23,189,134,175,227,202, 24,172,215,137, 72, 46,195, 39, 14, 86, 68, 95,
+154,180,242,102,242, 10,158,103,232,248, 19, 42,134,251, 14,128,161,202,139, 27, 73,126,116,228,224,102, 87, 7, 5,135, 46,138,
+183,161, 76,213, 99,201,103, 35,145,153,153,143,239,183, 47, 5, 32,129,158,161,240, 86,151,247,225,232,232,134,241,227,198, 59,
+111,222,186,229, 99,134,227, 86,225, 13, 33,229,218,166,159, 0,132, 42, 20,138,135, 31,143, 31,175,240,246, 30, 1,153, 76,134,
+ 3, 7, 14, 96,255,134, 13,236, 90, 96,144, 20, 56, 31, 12,252, 84,165, 78,216, 31, 58, 83,130,131, 21,254,254,193,144, 74,165,
+248,253,215, 31,161, 73,217,147,223,187, 3,244, 42, 13,122,215,233,195,219,197,157, 34,178, 68, 34, 60, 1, 0,145, 12, 74, 0,
+ 47, 55,131,253,219, 12, 86, 9,167,241, 71,191,172,241,229, 34, 90, 53,190,118,138, 36,225,219,167, 14,245,114,130,150,208, 93,
+ 57,133, 36, 45,199, 46,127,172,167,238,230,242,159, 71, 85, 96,178,138,127,216,156,167,167, 39,222,110,213, 10,253, 59,117, 2,
+ 77,211,144, 73,196,176,148,153,129,103,139, 34, 89, 37, 77,135, 85,212,137,168, 40,250,100,111,111, 15,177, 88, 92,106,176, 76,
+136,102, 85,168,201,113, 28,104,154,198,131, 7, 15, 16, 24, 24, 8, 15, 15, 15, 28, 58,116, 8,189,122,245,122,165, 41,209, 84,
+147, 85, 98,180, 94,106,198,235, 5,160, 36,146,101,146,209,210,232, 8,100,232,154,129, 32, 2,192, 48, 0,203, 3, 90,141, 6,
+ 60, 15,240, 60, 96,208,235,160,209,104, 74,191,211,152, 38, 89,103,103,103, 79, 51, 51,179,197, 51,103,206,240,111,214,172, 57,
+210,211,211,193,113, 28,204,205,205,161, 82,169, 96,101,101,133, 14, 29, 58, 60, 95,188,120,177,146,231, 49,222, 68,147, 85,107,
+ 74,206,249,217,179,103,203, 53, 27,150, 44,133,202, 68,140,254,116, 47, 36,116, 81,211, 82, 73, 31,158,170,174,187, 93,223,234,
+136,107,119, 99,152,143,102,172,211,138, 50,239, 44,115,230,184,157,137,181, 56, 46,158,231,145,145,145,129,212,212, 84,244,237,
+215, 15,251,247,237, 67, 92, 92, 28, 26, 53,106,132,174, 93,187,194,209,209, 17,113,113,113,184,121, 89, 11,109,118, 22,178,116,
+119, 32,183,108,139,227, 23, 99,181, 95,110,214,199,254,141, 23,140,190, 0, 70, 90, 89, 89,213, 85,169, 84, 74,134, 97, 14, 3,
+ 56, 12, 96, 16, 77,211,131,228,114,185, 75, 94, 94,222, 51, 20,141, 38, 58, 81,157,152,153, 76,102, 47,149, 89,129, 99,180,160,
+105, 26, 30, 30,222,224, 89, 29,178,243,212, 24, 53,164, 15,238, 62,136,194,175,231,111, 48, 6, 3,183,222,152,211, 74, 81, 20,
+239,231,231,135,180,180, 52,136, 68, 34,152,153,153,193,194,194, 2,179,103,207,198,134, 13, 27, 74, 77, 86, 77,141,214, 24,192,
+207,202,211,226,198, 55, 27,139, 76, 86, 74,178, 18,169,137, 34, 40,236,157,176,126,195,218,194,236,184,148,182, 63, 0, 49,255,
+246, 74,150,227,184, 69, 73, 73, 73,142, 52, 77, 59, 51, 12,131,132,132, 4,220,190,125, 27,147, 39, 79, 78,205,204,204,236,130,
+ 26, 30,163, 76, 38, 75, 43,137,100, 21, 55, 29, 86,214,156,152, 83, 38,146,149, 83,133,100,101,205,132, 62,222,238,150,231,182,
+175,153,230,217,186,109, 7, 82, 78, 91,101, 23, 60, 73, 9,188,114,233, 98,135,201,107,190,255,248, 69,118, 65, 79, 0, 79, 43,
+ 19,149,138, 68,239,182,235,216,145, 6,159, 10, 90, 18,136, 21,203,135, 32, 61, 35, 15,217, 89,249, 16,139,205,161, 51, 80, 96,
+ 57, 2, 29, 2, 59,225,199, 93, 7,209,120,220, 88, 74, 34, 18,245, 96,116,186, 55,198,104, 21,179,244,187,239,190,243,108,208,
+160, 1,118,238,220,137,243,187,119,227,195,220, 92, 92, 36, 73,202, 32, 18, 57,252,108, 48,108, 67, 53, 70,171,172, 78,227,198,
+141,241,195, 15, 63, 96,207,158, 61,241,195,187,165, 29,157, 54, 28,142,122, 61,222,185,243, 8,118,117,250, 0,119, 30,193,174,
+101, 3,212,103,104, 60, 33,136,242,233,160, 66, 66, 66, 58,151, 93,255,203, 80,162,146, 38,118, 26, 64,151,144,144, 16,190,236,
+186,218, 11,232, 44, 71,207, 0, 0, 32, 0, 73, 68, 65, 84,167,194, 55,120,105,207,186, 94, 1,245, 60, 9,195,161,117, 72, 40,
+100,116,243, 30,233, 37,143, 11,248,105, 81,192,218, 42,238, 32,120,138,162, 96,105,102, 6,133,141, 77, 81,152,159, 36, 1, 14,
+224, 12, 0,193, 22, 25, 0,158, 35,192,179, 38, 93, 48, 32,145, 72, 42,236,248,110,106,223,172,178,154,249,249,249,120,254,252,
+ 57,198,143, 31, 15,185, 92, 94,228,220, 83, 82,224,229,229, 5,154,166,145,148,148,132,223,127,255, 29,117,235,214,133, 84, 42,
+ 53,201,109,149,137, 46, 53, 69,209, 40,195,166, 74,165,210,202,197,197, 5, 38, 71,180, 56, 30, 42, 45, 1,157,142,197,227,199,
+143,145,156,156,140,231,207,158,160,117, 97, 30,120, 80,224,121,222,164,136,150,155,155, 91,128,143,143,207,150,101,203,150,137,
+221,221,221,193,243, 60,108,109,109,160, 82,169,144,145,145,137, 70,141, 26,193,195,195, 3,203,150, 45, 3,128,253,127,181,201,
+122,233, 55, 85,106,180,202, 26,174, 79,255,231,137,172, 44, 11, 80, 20, 89,106,156,171,233,163, 37, 6,128, 46, 61, 7,208,231,
+126,253,217,156, 1, 22,167, 80,212, 98,186,250,114, 52,176, 28, 39,175,236,253,132,132, 4,136, 68, 34, 28, 57,124, 24, 89,169,
+169,104,214,172, 25,218,180,105,131, 39, 79,158,224,238,221,187,176,183,183,135,194,189, 61, 46, 62,211, 35, 50, 89, 13,107,107,
+107,196, 38,146,127,103,202,128,113,221,187,119,255,242,219,111,191,117,116,118,118, 22,165,167,167, 55,216,184,113, 99,179,141,
+ 27, 55, 78,249,248,227,143,157, 62,254,248, 99, 91,133, 66, 65,167,164,164,248,125,246,217,103, 45, 67, 67, 67,235, 2, 88, 93,
+149,160,185,185,165, 29, 37, 54, 7, 65,208,176,177,182, 5, 45, 49, 7,199,208, 96, 57,192,202, 90,129,107,119,143,224,106,120,
+254,132,180, 76, 28, 54, 42, 62, 86, 92,238,246,246,246,175, 68,170, 39, 79,158,140,237,219,183,151, 54, 35,214,212,100, 45,217,
+216,205,130, 40, 54, 89, 41, 9, 52, 8,109, 93,156,250,233,122, 78,118, 92, 74,224,155, 96,178, 74,174,113, 60,207,227,217,179,
+103, 80,169, 84,184,124,249, 50, 22, 45, 90,148,254,178,201,114,116,116, 28,103,101,101,181,176,160,160, 96, 69, 74, 74,202,186,
+106,111,252,138, 76, 84,201,227,146,117,133,205,137, 70,238,170, 87, 69,145, 44, 15, 23,217,153,187,151,247,122, 89,243,247, 9,
+188, 24, 15, 60,206,123,104, 25,230,248,214,123,173,123,147, 45, 54,125, 85,167,205,132,217,103, 18,242, 52, 13, 42,139,108,113,
+ 44,219,194,220,194, 18, 64, 26,238,220,190, 80,106,178, 50,179,114,161,213, 83,208,234, 8,104,244, 36,222,238,254, 14, 54,108,
+217,131,164,180, 44,176, 44,219,228, 13, 51, 89,118, 1, 1, 1,193,131, 6, 13,194,226,197,139, 17,250,237,183,186,137, 4,145,
+ 71, 3,252,105,150, 5,199,243, 4,105, 92, 39,246,114, 58,171, 86,173,250, 9,192,208,101,147,209, 62,187, 0,163, 92,251,240,
+118,117,250, 20,109, 56,112, 38, 15, 0,118,233,161,229,171,204,160,160, 32,162,164,101,205,212, 22,182,127, 58,116, 80, 80,208,
+197,144,144, 16,148, 93, 87,245, 1, 75,167, 6,239,125, 49,125,210,242,214,189, 58, 17,202,233, 61,144,149,167, 97,230, 68,234,
+ 37,137,234,170, 77, 86, 89,190,216,184, 17,119, 99,138,254,199,238,142,142,152,241,193, 7,224, 25,224,234,195, 72, 28, 12, 13,
+197,144,238,221, 97, 46,147, 25, 29,217,224, 56,174,194, 40, 86,217,104,150,169, 81,167,156,156, 28, 28, 62,124, 24,109,218,180,
+129, 92, 46, 7, 77,211,104,218,180, 41,162,162,162,224,227,227, 3,130, 32,112,252,248,113,244,239,223, 31, 79,159, 62, 69,251,
+246,237, 45, 94,188,120, 97,178,209,138,140,140,180,226,121,254,173,146,232, 71, 77,209,106,181,136,142,142, 70,159, 62,125, 96,
+107,107, 11, 55,183,253, 8, 61,179, 23,242,128, 15, 65, 16, 48,201,104,177, 44, 59,166,119,239,222, 98,130, 32,160, 86,171, 32,
+147,153,193,220,220, 2,150,150, 86,240,243,107,128,228,228,100,244,234,213, 75, 23, 27, 27,187, 73,169, 84, 30, 50,117, 95,253,
+253,253,205,227,226,226, 62,172, 83,167,142, 4, 0,204,204,204, 26,249,248,248,124,254,244,233,211,124, 83,163, 90, 37, 6,139,
+ 32, 8, 80, 20, 85,106,180,104,146,132,139,179, 99,233,243,226,254,105, 68, 21, 90,121, 73,153, 90, 41, 0,120,122,122, 98,195,
+214,147,100,239,222,189, 49,101,202, 20, 24, 12, 6,108,218, 84, 52,200,110,216,176, 97,208,235,245, 56,122,180,104,144, 36, 77,
+211, 85,134, 77,110,223,190,141, 59,119,238,192, 96, 48, 32, 55, 55, 23,191,252,242, 11, 46, 94,186,132, 3,199,127, 67,220,179,
+ 39,104,218,192, 11, 99,199,142,129, 72, 36,194,174, 93,187, 16, 24, 24,248,183, 94, 16, 68, 34,209,240,237,219,183,187,236,220,
+185, 51,231,248,241,227,133,237,218,181,147,174, 93,187,214,113,195,134, 13, 10,157, 78,135,169, 83,167,166,221,184,113, 67,219,
+175, 95, 63,243,109,219,182,185,212,171, 87,175, 7,195, 48, 21, 25, 45,115, 0, 67, 0,140,200,206,215,209, 57,249,106,112,140,
+ 14,207,226,158, 35,183, 64, 7,142,213, 35, 62, 49, 25, 5, 26, 22,153, 89,249,104,218,162,231,119, 23, 46, 92,152,171,215,235,
+231, 0, 8,169,110, 63, 31, 62,124,136, 27, 55,110, 32, 46, 46, 14,207,158, 61, 43,239, 20,199,141,195,158, 61,123, 76,142,104,
+ 85,108,178, 40, 16, 90, 31,132, 28, 15,203, 73,123,162,124, 99, 76, 86,241, 53,104,129,139,139,203, 2, 23, 23, 23,217,217,179,
+103,173,235,212,169, 3,134, 97,116, 47, 71,178,186,116,233, 50,111,251,246,237, 46, 62, 62, 62,147, 1,172,251, 39,236, 59, 73,
+ 98,220,138,205,193, 14,150,146,248,100, 60, 94, 93,156, 75,144, 2, 84,121,192,133,125,160, 59,206,127, 62,185,223, 76,219, 89,
+ 59, 23,143,227,192, 85, 58, 66, 54,246,105, 2, 54,111,222,128,105, 83, 71,225,199,239, 87,128,227,104,104, 13, 20, 60,189,219,
+ 65,171,231, 64,144, 52,154,181,104,133,243, 23, 46, 67, 68, 2,135,119,110,126,195,124, 22,178, 34, 34, 34, 54, 29, 63,126,252,
+147, 41, 83,166,128,227, 56,201,194,205,155,213,233,233,233, 75, 97, 90,254,171,151,117,250,111,222,188, 57,102,214,134,244,159,
+166, 13, 7, 21,119,138,200,186,243, 8,118, 3,103,242, 56,178,156, 64,203, 6,200,146, 87, 92,197, 95,122,105,253,102, 24,173,
+ 18, 39, 89,118, 93, 17, 45,124,235,126,101,109,103, 59,134,180,116,115,152, 49,101, 34,253, 52, 69,131,163,117, 62, 40,248,125,
+247,122,243, 20, 70,250, 93, 44, 52,107, 77,249,226,131,191,255, 94,250,120,229,254,253, 21,190,167, 28, 56,208,232, 59,179,202,
+162, 88,166, 70,178, 0, 64, 46,151,219,244,232,209, 3,221,186,117,195,251,239,191, 95,218, 39,171,121,243,230, 56,112,224, 0,
+ 6, 12, 24,128,123,247,238,193,197,197, 5, 13, 27, 54, 68,195,134, 13,241,243,207, 63,155,122,145, 3,203,178, 8, 8, 8, 40,
+ 25,117,216, 52, 49, 49,209,170,166, 5,169,213,106,145,153,153, 9, 59, 59, 59, 72, 36, 18,180,109,219, 6,159,124,218, 22, 14,
+ 46, 63, 32,192,191, 1, 10, 11, 11, 75,135,191, 27, 81,217, 6,212,175, 95, 31,233,233,233, 72, 79, 79,135, 66,161,128,171,171,
+ 43,156,157,157,177,122,245,106,126,221,186,117,191,234,245,250, 77, 25, 25, 25, 38, 71,178,156,157,157, 59, 17, 4, 49, 79,173,
+ 86, 75,202,220,225, 74, 20, 10,197, 9,181, 90,189, 84,169, 84, 26,221, 17,148, 32, 8,232,245,122, 16, 4,129,211,207, 92, 81,
+168, 35,144,151,120, 7, 83,254,231, 85,206,120,137, 68,162,106,155, 75,121,158, 47, 28, 58,116,168,163,135,135, 59, 18, 98, 31,
+226,200, 17, 30,223,126,251,109,201,168, 72,196, 20,223, 24,148, 60,239,218,181, 43,188,189,189,193,155,144, 43,131,227, 56, 60,
+120,240, 0,251, 79, 92,132,139,151, 63,226, 31, 71,227,238,207,167, 80, 71, 97,135,198, 45, 90,193, 96, 48,212, 42,245,198,235,
+192, 96, 48,236,240,245,245,229,117, 58,221, 69, 0, 27,194,195,195, 71, 41,149,202,169, 39, 79,158,116, 29, 52,104, 80,242,169,
+ 83,167,214, 2,216, 25, 30, 30, 30,252,245,215, 95,119, 99, 24,166,194,209,130, 20, 69,253,248,217,103,159,117, 25, 52,104, 16,
+ 33, 38, 13,186,179,103,118,209, 12, 99, 32,190,152,179,131,189,112,229, 34,201, 48, 6,226,253,161,159,113, 63,255, 30, 78, 78,
+248,116, 37,219,188, 93,111, 68, 68, 68, 56, 7, 5, 5,125,109, 48, 24,170, 52, 90, 37,145,170,202, 34,148, 20, 69, 97,212,168,
+ 81, 56,112,192,248, 30, 84, 99, 1, 31, 43, 47,139, 27, 75, 54,118,183, 32,232,130, 50, 38,171, 30, 66,142,135,229,164, 62, 78,
+126,163, 76, 22, 0,100,102,102,110, 5,176,149,227,184, 84,115,115,115,228,231,231, 87,244,251,147,133,135,135,203, 36, 18, 9,
+122,246,236,105, 23, 26, 26, 26, 67,146,228,186,228,228,228, 74, 29, 71, 69,205,132, 21, 53, 39,162, 22,163, 14,109, 21, 8,106,
+219,169,133,229, 35,235,197,150, 50, 90,115,175, 78,140,204,138, 0,144,171,117,122,118,237,197,144, 60, 34, 77,218,188, 85,215,
+150,176,162,205,131,114,152,252, 10,141, 22, 73, 81,119,115,179,115,222,205,203,215,225,202,213, 8, 12, 29, 82, 31, 90, 61, 1,
+142, 35, 81, 80,168, 5, 40, 17, 72, 0,195, 62, 24, 9,158,160,145,149,154, 12,138,162,194,193, 48,120,195,152, 29, 28, 28,252,
+238,156, 57,115,234,206,152, 49, 3, 51,102,204,240,218,190,125,251,214, 37, 75,150,204, 72, 79, 79,111,130,106,146,143, 87,161,
+ 83,231,212,129,249,211, 79, 92,222,146,219,187,131,250,113,203, 6, 69,145,175,150, 13,144, 37, 18,225, 9, 77, 33,147,231,203,
+119, 51, 10, 10, 10,234, 92,118,253, 47,227,229, 78,240,165,207,141,234,163, 85,191,174,219, 59, 45,154, 7,124, 58,119,206, 92,
+203,168,107, 23, 48,235,171, 13,188,111,171, 30,249, 91, 47,223,213, 21,152,123,191, 91,144,241,228,170,177,254, 2, 0,222,121,
+123, 0,154, 54,106,243,202,155,129, 93,139,146,181, 95, 57,127, 27,169,233, 73, 70, 87,182,197,230,160,194, 62, 89,198, 12,233,
+127, 25,181, 90,157, 19, 17, 17,225,152,152,152, 88,174,227,187,183,183, 55, 8,130, 64, 88, 88, 24,110,220,184,129,161, 67,135,
+130,166,105,136, 68, 34, 92,188,120,209,164,104, 76,153,232, 82,201,168,195, 94,238,238,238,149,141, 54,172, 86, 75,173, 86, 35,
+ 55, 55, 23,103,206,156, 65,253,250,245,177,100,201, 18,184,186, 56, 97,238,220,233,224, 56, 14,121,121,121, 96, 89,214,216,136,
+ 22, 87, 18, 45,226, 56, 14,233,233,233,168, 91,183, 46, 54,110,220,136,181,107,215,126,173, 84, 42, 79,154,186,143, 30, 30, 30,
+ 54, 44,203,126,209,187,119,239, 30,253,250,245, 67,175, 94,229,243,177,238,219,183,207,242,232,209,163, 75,215,175, 95,255,142,
+ 94,175, 95,150,150,150,150,110,140,238, 15, 63, 20,165, 95,146,183, 91,128, 89,131,234, 96,196,164, 93, 88,189,250, 24,164, 82,
+105,185,138,119,241,226,197, 85,154, 24,142,231,125,197, 25,215,146,167,207, 92,229,184,116,105, 40, 66, 67,211, 64,146, 36, 92,
+ 92, 92, 64,146, 36,158, 63,127, 14,146, 36,225,229,229, 5,146, 36,145,148,148, 84,210, 39, 48, 27, 21,140,122,172,248, 46,156,
+132, 70,163, 65, 66,124, 28, 18, 99, 99, 96,145,151, 2,133,149, 28,217, 15, 31,160,233,216,113,165,249,159,254,102,246,232,116,
+186, 61,101,158,175, 58,117,234,148,142, 32,136,247, 81,212, 79,163, 36,162,241, 53,195, 48, 95, 87, 38,210,174, 93,187,230,115,
+230,204, 17,149,164,219,112,245,252,134,209,235,245, 28, 0, 52,104,250, 86, 57,183,255,228,201, 19,172, 94,189, 26,133,133,133,
+ 16,139,197, 98, 99,206, 3,199,113,165, 35, 12, 43, 50, 97,166,152, 44, 0,176,247,114,255, 46,236,206, 69,246,126,236, 22,117,
+248,163, 95,204,148,241, 36, 72,221,155,107,178, 94,142,108,185,187,187, 47,224, 56,142,231,121,126,126,153,183,164,158,158,158,
+151,207,158, 61,107,207, 48, 12,214,175, 95,111,147,146,146, 98,243,214, 91,111,205, 2, 80,169,209,170,168,153,176,162,230, 68,
+148, 25,117, 40,149, 74,237,116,186, 74,131, 39,175,140, 58,100, 89,248, 89, 89,218, 32, 27,137,208, 58, 24,154,231,216, 51, 89,
+231,148,227,238,185,190,104,209,200,156, 53,212, 37,243,116,112,147,219,128,227,249, 74,135, 70,107, 13,134, 95,238,221,185,219,
+211,211,163, 62,117, 50,228, 18,250,246, 31, 4,173,150,132,198, 64,128,160, 68, 32, 40, 49,154, 52,109,129,134,141,155,130, 7,
+112,251,230, 53, 70,103, 48,156,123,147,202,222,165,227, 39, 67, 9, 2,235,192,115,124, 5,121,180,234,246,239,223,127, 41,128,
+ 79,171,211,113,108,247,201, 80,146, 44,210, 41,155, 71,235,179, 79,130,241,240,166,200,250,210,157,229,226, 94,237,112, 58, 61,
+148,128, 92,246,199,168, 67, 17, 89,171,212, 28,255, 22,195, 85,189,209,242,240,240,176,177,146,202,126,248,120,236, 24,203, 23,
+247,175, 35, 37, 50, 12, 87, 47,197,100, 31, 60,122, 44,171, 48, 51,109,172, 9, 38,171,180,153,207,222,185, 14,188,253, 95, 53,
+ 90, 50, 11, 5, 0,192,219,191, 13, 40,115,211,210, 8, 85, 20,205,170,137,201, 42,123,193,174, 40,135,214,132, 9, 19,176,125,
+251,118,116,236,216, 17,190,190,190,165, 23,123, 83,163,102, 21, 68,151, 76, 30,109, 88,150,252,252,124,120,121,121, 97,219,182,
+109, 8, 15, 15,135,165,165, 37,134, 14, 29,138,252,252,252, 82,131,101,108,103,120,158,231,159,156, 61,123,182,245,224,193,131,
+121,145, 72, 68,228,228,228,192,198,198, 6, 27, 55,110, 44, 84, 42,149,167,107, 96,178, 6,137,197,226,233, 67,134, 12,161, 26,
+ 52,104,128,212,212, 84, 88, 89, 89, 25, 8,130, 16, 1,128,141,141,141,193,204,204, 12,193,193,193,104,214,172, 89,167, 25, 51,
+102,116,164,105,122, 99,114,114,242,174,170,126, 75, 4, 65,148, 86,168, 99,215, 69, 67,167, 43,170,160, 55,109,218,132,226,190,
+110,127, 52, 17,196,198, 2, 70,140,100,177,176,176,128,175,175,111,133,101,223,169, 83, 39,220,190,125,187,168,105,146,166,225,
+232,232,136,171, 87,175, 26, 53,146,170, 36, 17,100, 68, 68, 4,252,189, 29, 16, 30,122, 22, 14,114, 17,154,185, 58,195,189, 83,
+103,196,196,196,252,157,209, 44, 2, 69,253, 48,186, 23,255, 6,119, 0,152, 80,230,249, 70, 0,223,153, 34,200, 48, 12, 79,146,
+ 36,145,144,144,160,151,203,229,132,157,157, 29, 45,149, 74,161,213,106, 75, 13,215,147, 39, 79, 16, 18, 18,130,196,196, 68,216,
+217,217,145,214,214,214,208,235,245,217,198,232,251,249,249,193,217,217,185, 92,199,247,177, 99,199,214,200,100,141, 2, 2,182,
+127,179,172,142,148,164,172,253, 29,222,193,179,232,231, 26, 82, 7,217,127,193,100, 1, 64, 78, 78,206, 86, 0, 91, 75,158, 59,
+ 56, 56,140,166, 40,106,174, 86,171,181,190,120,241,162,141, 66,161, 32,118,237,218,101,152, 63,127,126, 14, 69, 81,217, 4, 65,
+172,249,251,205, 33, 34, 51,114, 99,189, 68,182,174,220,125, 13,127,109,106,194,172,134,217,162,250, 10,162,113, 0,250,167, 69,
+ 93, 25,205,196,118, 72, 85,166,144, 60,184,200, 42,174,193, 59,102,205, 89,252, 69, 76,244, 93, 79,153,149, 12, 19,130,231,224,
+244,175,231, 65,144, 34, 92,190, 22, 6,157,158, 69, 70, 86, 46,134, 12, 27, 14,119, 23, 7, 68,222, 56,147,206,112,220,198, 55,
+203,100,115, 27,122,246, 29,109, 43, 53,147, 23,159, 19, 22,123,190,159, 14,146, 92,135, 47,191,252, 18, 1, 1, 1,147, 34, 34,
+ 34, 22,161,154, 60, 90, 4,193,109,104,210,121,152,173, 88, 90,164,195,115, 44,182, 29,158, 85,156, 71,107, 26, 54,110, 61,218,
+164,177,247,179,133, 85,229,209,122,131, 76, 86,217,117,213, 70,203,203,203, 75,106, 46,194,120, 17, 69,207,248,248,131,126,138,
+180,216,135, 72,140,186, 91,212,188,160, 87,235, 83, 30, 71, 25,147, 10,189, 59,202,231,239,224,171,106,186,210,104,140,186,163,
+ 47,167, 89, 82,225,190, 28,205, 50,209,100,189,162, 89,214,108,149,205,155,229,225,225,129,165, 75,151, 26,147, 71,235,229, 99,
+ 47,161, 23,138, 58,192,151,237, 12,223,203, 72,147, 85,161,166, 66,161, 64,102,102, 81,134,132, 46, 93,186,160, 75,151, 63,198,
+ 51,232,245,250,210, 40,150,165,165,101, 69, 17,173, 87, 52,205,204,204,102, 29, 59,118,108,204,181,107,215, 6,127,254,249,231,
+162,110,221,186,149,152, 57, 21,140,155,219,173,156, 38,203,178,193,103,206,156,161, 56,142,195,182,109,219,112,251,246,109, 94,
+ 46,151,207,147,203,229, 27,204,204,204, 88,181, 90, 61, 97,220,184,113,195, 23, 46, 92, 72,118,234,212, 9,215,175, 95, 39,235,
+214,173, 59, 18, 40,151,196,178,194, 99, 15, 11, 11, 3, 73,146, 96,178,226, 49,105,214, 65,152,155,209,136,142,142, 70, 86, 86,
+214, 43, 73, 76,141, 57,159,101, 35, 37, 37, 75,167, 78,157, 74,155, 33,219,182,109, 11,138,162,112,239,222,189,202,154, 97,203,
+106,242,246,246,246,165,191, 15,177, 88,140,243,231,207,227,171,175,190,130,167,157, 13,178,163,194,225,220,229,109,244, 24, 51,
+ 14, 67,135, 14, 5, 69, 81,176,179,179, 43,141,252, 26,241, 91,170, 13,101, 53,199,248,251,251,143,140,140,140,116,111,210,164,
+137, 75, 68, 68, 68,215,128,128, 0,175,240,240,240,146,231, 82, 24,215, 55,167, 84,243,214,173, 91, 71, 54,108,216, 16, 60,106,
+212, 40, 49,199,113,236,139, 23, 47, 12, 0, 8,103,103,103,234,214,173, 91,220,201,147, 39,161, 86,171,225,238,238, 78,186,185,
+185, 17,231,206,157,227,162,162,162,194,120,158,159, 99,204,177,179, 44, 91, 46,141, 67,201,227,125,251,246,153,252,127,175,211,
+208,111, 73,183,183, 26,120,100, 36,223,131, 50, 41, 22,108,174, 66, 31,114,252,148,214, 68,147,245,103,151,209, 95,169,185,248,
+241,227,199,110, 90,173, 22, 18,137, 4,155, 54,109,210, 47, 93,186, 52, 50, 35, 35, 35, 16, 21,143, 40, 47,167, 89,195, 81,135,
+ 89, 85,104,190, 50,234, 48, 55, 19,167,143,159,184,213,218,162,255, 14, 76, 74, 78, 47,237,216,200, 19,132,221, 49,167, 70,129,
+242, 54, 77,146,200,159, 23,144,249,172,234,116, 21,199,174, 83,235,116,131,250, 15, 24,246,219,129, 3,251, 45,230, 47, 88,128,
+171, 97,225,200,204, 41, 0,199, 83,224, 8, 2,115,231,206,135,179,131, 29,242,146, 31,171,180,122,125,127,148,207,161,245,175,
+ 47,119,130, 32, 39,159, 59,185,107, 29, 73,128, 43, 76,125, 36,165,242, 99,229, 35,134,246,167, 7, 13, 26,132, 99,199,142, 33,
+ 34, 34, 98, 75, 21, 38,171, 84,147,231,201,201,225, 23, 15,174, 35, 0, 78,157,254, 72, 74, 23, 60,147,143,252,160, 63, 61,116,
+232, 80,252, 20,114, 13, 7, 78, 61,219,124,224, 20, 78,225,205,198,244,204,240,150, 52, 34, 2, 27,249,184,117,106,209, 88, 70,
+179,106, 36, 70,197, 34,171, 80,131,115, 15, 95,228,144, 60, 89,227,220, 58, 69, 23, 72, 49,226,227, 31, 87,112,103, 37, 43,174,
+208, 53, 38,105,146, 36, 89, 46,154, 85,155, 72, 86,217,253,116,114,114, 42, 55,157, 75,217,138,187,164, 15, 80, 13, 82, 59,204,
+138,143,143,183,138,143,143, 7,207,243, 8, 11, 11,179,106,219,182,237,172,218, 68,179,166, 79,159, 94, 26,181,122,121, 93,209,
+107,213, 81,220, 41,125,173,193, 96, 56, 60, 99,198,140, 73,109,219,182,237,185, 96,193, 2, 2, 38, 76,192,251, 82, 52,135,225,
+ 56, 14, 23, 46, 92,192,177, 99,199, 88,189, 94, 63, 94,169, 84,134,151,217,100,253,157, 59,119,206, 13, 24, 48, 96,215,163, 71,
+143,168,200,200, 72,240,124,245,227, 78,213,106, 53,124,125,125,193, 48, 12,150, 79,242, 64,126,126, 19, 48, 12, 3,150,101, 97,
+110,110, 94, 26,197, 43,107,158,171,251, 29,177, 44,251,138,209, 10, 11, 11, 3, 69, 81, 8, 12, 12,196,221,187,119, 75, 35, 90,
+213, 69,160,244,122,125,188,147,147,147,211,226,197,139, 75,247, 43, 61, 61, 29,103,207,158, 69,187,246, 29,208,104,252, 4, 36,
+ 39, 39, 99,205,154, 53,112,117,117,197,146, 37, 75,144,149,149, 5,134, 97,254,234,112,250,187,145,145,145,238, 31,124,240, 65,
+ 90,120,120,184,123, 72, 72,136, 77, 80, 80,144,249,176, 97,195,210,194,195,195,221, 9,130,232, 0, 19, 59, 65,115, 28, 55,123,
+238,220,185,191, 46, 89,178,100,214,167,159,126,218,118,212,168, 81, 34,145, 72,196, 37, 37, 37, 49,251,247,239, 39,124,125,125,
+ 73,177, 88, 76,156, 57,115,134,187,121,243,230, 13,134, 97,150, 3,184,108, 74,196,185,172,201,162, 40,202, 88,147, 85,142,169,
+142,210,145,150,100,122,224,134, 77, 75,201, 6,222,238,250,221,251,207, 38, 92,190,254,248, 41,165,101,166,254, 80, 69,106,128,
+ 55, 25,138,162, 14,249,251,251,143,158, 60,121,178, 89,175, 94,189,164, 11, 23, 46,204,205,207,207,175,204,100, 85,112,195,252,
+151,140, 58,252,126,246,231, 33, 83, 63,107, 50,218,231, 35,231, 58, 8, 45, 76, 67, 54, 77,145, 86, 54, 36, 90,120, 81,200,207,
+120,162, 56,245,219,206,231, 0,170,203,203,118,235,206,131,136,238,141,155, 52, 63,186,124,201,114,199,121, 51,103,136,142,134,
+252, 2,158,209, 35,236,226, 69, 88,136, 89, 62,234, 78,104,170, 86,175,235,135, 55,112, 10, 30,229,213,239, 14, 0, 56, 97,103,
+103,119,127,204,168, 81,190,254,254,195, 32,151,203,113,228,200, 17,236, 89,191,158, 93, 11, 12,150, 2,119,131,171,201,167,151,
+118,163, 84,231,222,184, 49, 99,252, 90,180,248, 8,114,185, 28,135, 15, 31,198,174,181,107,141,214,249,151, 83,146, 25,254, 52,
+254,200, 16, 95, 77, 31, 45,146,200,191,241,248, 69, 65,216,227, 23, 5,224,120,158,227,121, 45, 73, 34,161, 80,175, 95,242,248,
+ 89, 82,141, 76, 65, 73,211,225,215,223, 76,126,125,109, 30,101,204, 79, 77,135,116, 87, 96,178, 18,203,206,145, 86,182,146,174,
+236,177,193, 96, 72, 52, 82,126,153,167,167,231, 43,175,213, 60,244,203,155,100,178,140,205,163, 5, 0,153,153,153, 74, 0,243,
+174, 95,191,190,175,103,207,158,227, 0, 36,213,176,140,182,117,238,220,121, 60, 0,138, 32,136, 45,201,201,201,225,175,252,225,
+149,202, 24, 87, 87,215,149,222,222,222, 19,138,110, 76,137,109,213, 84,228,207,154, 52,105,162,175,168, 44, 42,123,206,113, 92,
+181,101,148,147,147,131, 54,109,218,188, 50,167, 37,207,243,120,241,226, 69, 73,196,169,244,220, 87,101,224, 10, 10, 10, 38,124,
+242,201, 39, 91, 69, 34,145, 39, 0,162,196,228,178, 44, 75,125,247,221,119, 50,150,101, 41, 0, 4, 73,146,140, 72, 36,210, 28,
+ 59,118,140, 97, 24, 38, 94,171,213, 78,248,139, 47, 16,135,137,162,169, 24, 10, 35, 35, 35, 27, 20, 71,178, 18, 35, 34, 34,238,
+ 29, 56,112, 64, 1,224, 96, 13,117, 47,171, 84,170,203, 75,151, 46,237,180,105,211,166,217, 19, 38, 76,104, 51,116,232, 80,186,
+ 75,151, 46, 56,125,250, 52,123,225,194,133, 48,181, 90,189,204, 20,131, 85, 92,150,185, 30, 30, 30,165,134,171,154,255,114,149,
+ 29,121,237,189,164, 27,134, 79,116,149,109, 91,118,182, 32, 35, 89,119,205, 80,160,155,179, 19,136,192,127,152,212,212,212,207,
+ 1,204, 95,179,102, 77,114,179,102,205,164, 98,177, 88,103,172,201,250, 11, 97,184,156,130,247,190,237, 49,240, 68,231,185,159,
+120,247,232, 26, 40,247,168,227,232, 22, 21,155,138, 39,215, 79, 23,222, 63,245, 77, 28,175,205,238, 11,192,152,158,235, 55,181,
+122,125,253,233, 51,166, 79,146,136, 68, 61, 89,150,109,218,237,220,113,158,162,168,112,157,193,112,174,184,185, 80,243, 6, 23,
+249,215, 43, 87,174,244,245,247,247,199,145, 35, 71,112,110,239, 94, 12,201,200,192,121,138,162, 72,177,216,254,148, 94,191, 10,
+198, 25,164,175, 87,175, 94,237, 23, 16, 16,128, 67,135, 14,225,204,174, 93, 24, 92, 51,157,202,234,186,214, 0, 20,197, 79, 51,
+ 0, 60, 2,208, 18,128, 25, 0, 45,138,166,118,114, 40, 91,133, 21,191, 87,242,254, 37,130, 32,254,204,142,176,213,103,134,127,
+153,136, 39,113, 45, 95,247, 94,168,213,234, 44, 95, 95, 95,147,198, 92, 27, 12,134, 42,219,112, 25,134, 73,244,241,241, 49, 58,
+106, 97,140, 41,202,202,202,106,245, 39, 22, 70,173,250, 98,149,171, 68, 56, 46,206,197,197,133, 43,169,244, 43, 50, 97, 21,189,
+198, 3,207, 77,249,158,148,148,148, 71, 0, 62,171,233,126, 38, 39, 39, 31,133, 17,147, 70, 27,187, 29, 0,100,103,103,191,246,
+201,124, 9,158, 79, 90,184,112,161, 73, 6, 27, 60, 95,149,249, 12, 47, 40, 40,104,107,204,119,235,245,122,252,141, 28, 42, 94,
+200,136,136,136,113, 4, 65,244, 66, 81,147,192, 22,188,158,108,222,151,243,242,242, 46,175, 88,177,162,211,182,109,219,166,242,
+ 60,143,188,188,188,181,166, 26,172,210,187,231,180,180,211,175,235,192,179, 82,117,191,239,223,146,248,182, 58, 71, 63,117,123,
+129,110, 23, 4, 74,131, 81, 60,207,255, 56, 98,196,136,118, 0,118,214, 86,172,146, 81,135,181,229, 57,151,157,219,236,252,244,
+175,198,156,183,177,236, 13,150,110, 0, 29,121, 10,186,204,211, 0,126,128,113,221, 28, 74,143,151,225,184,213,140, 78,183,186,
+ 76,229,242, 95, 40,103,187,128,128,128,169,163, 71,143,198,252,249,243,113,102,213, 42,253, 68,130,200, 21, 1,252,175, 69, 55,
+154, 36, 1,204, 52, 86,103,228,200,145,152, 63,127, 62,126, 94,190,188,166, 58, 85,161, 32, 8, 34, 4, 0,102,205,154, 53,103,
+233,210,165,182,179,103,207,110,186,108,217,178, 37,197,207, 31,150,188, 95, 92,215, 5,205,158, 61,187,113,153,247,243, 1,220,
+250,147,207,103,133,153,225,255,108,186, 11,154,130,166,160, 41,104, 10,154,130,166,160, 41,104,214, 6,158,231,123, 23,173, 42,
+ 95, 87,246,184,204,250,111,129,134,128,128,128,128,128,128,128,192,191,144,178, 81,172,154,188,255, 26, 41,233,163, 85,150,109,
+ 64,209,176,238,202, 92,169, 41,163, 30,106,226,108, 67, 5, 77, 65, 83,208, 20, 52, 5, 77, 65, 83,208,252,207,105, 86,167,253,
+202,231,121,158,239, 77, 16, 68, 8,207,243, 65,149,173, 75,140,213,203,143,203,172, 95, 91,183,131, 10, 40,233,155,245, 74, 31,
+173, 63, 27, 33,172, 42,104, 10,154,130,166,160, 41,104, 10,154,130,102,173, 40,105, 2, 4,192,207,154, 53,107,246, 63,176,233,
+208,165,216,100,149, 93, 0, 84,209,116,200,243,135,169,164, 36, 88, 73, 36,114, 49, 0,232,116, 42,189,155, 27,242, 8, 98,208,
+223, 57,225,173,192,191,147,146,225,222,169,175,121, 91, 1, 1, 1, 1,129,255, 6,233, 37,145, 42, 0,233, 0,136,226,231,186,
+226,117,122,177, 33,123,249,113,185,247,255, 68,148,168, 36,146, 69, 87,102,178, 50, 50,228, 14, 52,157,237,199,178,154,134, 0,
+ 64,211,100,116, 70,134,109, 12,207, 31,206,168,137,217,114,112,116,188, 35,162, 40, 55, 99,182, 53,176,108, 82, 70,106,106,249,
+212,241, 4,241, 38, 24, 60, 99, 77, 68,109,204,198,159,110, 84, 28, 28, 28,156,156,156,156,254,103,101,101,213, 62, 39, 39,231,
+102,122,122,250, 79, 85,204,123,184,148, 32, 48,163,232,119,133, 21, 0,102, 87, 33,109,202,182, 47,227, 43,151,203, 39, 17, 4,
+ 17, 80,252, 7,139, 80,169, 84,155, 0, 60,254, 15, 94,144,204, 0,244,163,105,122,164,131,131, 67,155,148,148,148,133, 0,106,
+154,205,155, 6, 48,221,198,198,102,136,141,141,141, 79, 86, 86,214,211,188,188,188, 67, 0, 86, 3,168,118,168,244,194, 79, 93,
+218,119,233,213,101,222,133, 51, 23,190, 94,184, 94,121,253,149,247,167,187,216,247,236,209,113,254,133, 83,215, 22,207,217,152,
+156,101,226,190,145,197, 11, 80, 52, 58,146,199,171,201, 94,107,139, 8, 64, 31, 0, 93, 0, 92, 0,112,202,152,227,174,132,118,
+ 0,230, 20,239,243,106, 0,231,255,225,191, 35,115, 39, 39,167,229, 0,250,208, 52, 29,153,148,148, 52, 30, 64,226,223,188, 79,
+ 52,128,214, 0, 2, 80,148,134,227, 22,140, 75,225, 80, 45,246,246,246, 65, 52, 77, 79, 42, 78,237,178, 41, 51, 51, 51,228,159,
+ 90, 48, 18,137,100,173,179,179,243, 71,106,181, 90, 69, 16, 4, 95, 54,223, 35,195, 48,137, 25, 25, 25,173,222,180,139, 26, 65,
+ 16,183,254,225,187, 56,190,130,215, 42,207,163,149,148, 4, 43,154,206,246, 75, 75, 9, 31,146,172,124, 48, 24, 0, 92, 93,154,
+ 30,114,116,110,114, 48, 41, 73,162,119,110,208,223, 66, 36,167, 55, 81,148,168,185, 70,167,117, 16,209,162, 12, 61, 99,184, 71,
+234,248, 73, 41,143,126,170, 48,217,162,136,162,220,226, 98,206, 59, 50,250, 44,136,100,174, 16,153,121, 86,186,183,174,174,174,
+ 53, 58, 74, 91, 91, 31, 75,189, 84, 54, 85, 36,162,122,112, 60, 19,192,115, 0, 73,136, 34, 24,214,240,155, 88,171,253, 54, 59,
+251,105,126, 77,207, 96, 3,123, 56,243,192, 80, 16,232, 1, 30,231, 8,224,192,163, 76,164,152, 32, 97,172,137,168,141,217, 40,
+251,217, 53, 0, 62,127,221,191, 36, 55, 55, 55,219,160,160,160,181, 95,125,245,149,153,133,133, 5, 17, 31, 31,223,107,230,204,
+153,111,221,190,125,251,179,164,164,164,228,151, 77, 31, 65, 96, 6,199,241, 36, 0,144, 36, 49, 83,161,112,148, 83, 20,245, 74,
+110, 35,150,101,229,233,233,105,147, 57,142, 39,138,183,157,193,243, 88,103,140, 97,148,201,100,195, 2,154, 52,255,108,249,202,
+213, 22, 78,142,142,230, 12,203,233,159,191,136,147,207,155,245,121,219,216, 39,143,215,105, 52,154,253, 53,249, 95, 83, 20, 53,
+ 68, 42,149, 6, 1,240, 47,126, 45, 74,171,213,134,176, 44,123,208,216, 10,221,201,201,233, 18, 69, 81,117, 76,249, 98,150,101,
+227, 83, 83, 83, 3,107, 88, 68,131, 60, 61, 61,127,232,220,185,179,188, 77,155, 54,144, 72, 36,152, 63,127,254,116,165, 82, 89,
+157,209,162, 1, 76,151,203,229, 67,204,205,205,125, 10, 10, 10, 98,213,106,245, 81,137, 68,210,125,221,186,117, 30, 29, 59,118,
+180, 76, 77, 77, 37, 40,138,114,250,249,231,159, 63, 92,187,118,109, 47,134, 97,186, 85, 87,201,229,198,242,243,164,125,252, 59,
+229,198,158,159, 7,224,221,151,223,103, 52,178,145, 60,229, 17,164,230,239, 38, 20,155, 15,163, 77,150, 72, 36, 90,231,236,236,
+ 60, 90, 83,148, 43,128,127,185,194, 1, 0,157, 78,151,157,147,147,211,160, 38,127,121, 0, 99,109,108,108, 70,127,241,197, 23,
+182,239,190,251, 46,246,238,221,251,241,246,237,219,179,243,242,242,126, 68, 81, 34,204, 71, 38,106,206, 72, 73, 73,121, 79, 36,
+ 18, 17, 30, 30, 30,148, 90,173, 54,197,104,249,161,104, 18,230, 91, 0, 54,161, 40,117, 65, 87,160,232,255, 14, 96, 69,137,113,
+ 35, 73,114, 83,131, 6, 13,254, 23, 21, 21,181, 25,192,215, 53,253,175, 59, 59, 59,111,221,184,113,227,224,190,125,251, 82,233,
+233,233,110,205,154, 53,219,151,146,146,210,233, 53, 92, 70,198, 72,165,210,105, 77,155, 54,109,244,232,209,163,152,188,188,188,
+213,197,231,179,170,255,148, 59,128,238, 54, 54, 54,221,230,206,157,107, 17, 20, 20,132,109,219,182,189,183,125,251,246,130,252,
+252,252,223, 80,212,167,167, 86, 38,144,166,233, 73,137,137,137, 14, 60,207,195,197,197,101, 18,128,127,164,209, 34, 73,114,221,
+128, 1, 3, 70,239,219,183, 79, 30, 23, 23, 39,119,115,115, 43, 77,158, 77, 16, 68,141,235, 79,129, 90,179,173,140,225,170, 62,
+143,150, 68, 34, 23,179,172,166, 97,178,242,193,224,183, 58,127,103, 13, 0,151, 46,126, 50,216,209,185,113,132, 68, 34,143,145,
+ 90,201,142, 13,232,211,189,249,192,160,206,132,187,139, 35, 18,149,105, 78,223, 31, 56,243, 78,200,153,243,199, 80,148, 64,172,
+ 66, 24,125, 22,204,244,161,120,116,101, 61, 28,186, 36, 99,195,207,137,184,126,255, 57, 84,185, 25,168,227,108,134,149, 83,123,
+194,217, 86, 94,179, 91, 47, 71,223,174, 12, 45, 61,248,193,176, 17,214,255,235,231, 47,242,114,118, 6,207, 75, 17, 19, 91,208,
+225,151,179,231, 91, 31, 61,188,127,146,185,200,119, 72, 97,218, 99,163, 47,110, 45, 92, 96, 86,168, 71, 63,154, 34, 62,236,216,
+170, 81,183, 97,239,117, 34, 27,249,215, 71,228,195,168,158, 39,126, 15, 91, 73, 94,123,248, 27,195,242,187,205,197, 56,126, 87,
+ 89,101, 66,191, 87, 12, 71,183,110,221, 59, 73,165,210,114,201,147,180, 90,173,248,183,223, 66,219,213,196,108,148,124,135, 78,
+167, 37, 69, 34, 9, 72,146,248, 44, 32,160,137,127, 70, 70,198,121,130, 32,126, 72, 78, 54, 45, 90,240, 9, 32,201,166,233,150,
+164, 84,234,194,234,116,246, 0, 64, 72, 36,217,207, 73,178,201,220, 57,115, 44, 40,138,226, 50, 51, 51,161, 82,169,136,113,227,
+198,201, 98, 99, 99, 7, 36, 37, 37,173,175,230,142, 4,219,183,111,247,115,113,113,121,101,246, 88,165, 82, 41,233,219,247,127,
+ 53, 41,122,191,166,205, 90, 76, 59,115,230, 87,255,188,172,108,205,246, 53, 91,239, 24,100,114,109, 93,255, 6,162, 77,219,118,
+ 89,143, 31, 61,252,147,232,232,135,247, 96,218,124,117,158,102,102,102,199, 86,173, 90, 21,208,181,107, 87,145,163,163, 35, 82,
+ 83, 83, 17, 21, 21, 21,240,251,239,191,247,219,181,107,215,116,181, 90, 61, 0, 48,106, 66, 84,223,223,118,255,224,104,110,103,
+ 15,214, 96,128,107,211, 22,165,249,205,158,252,126, 22,140, 94, 15,206, 96,128,127, 80,191,226,104, 50, 15,127,127,255,154,102,
+221,117,109,220,184,241,158, 37, 75,150,136,181, 90, 45,194,194,194,112,254,252,121, 78,169, 84, 86,151, 16,151, 38, 8,226,236,
+130, 5, 11,220, 3, 3, 3, 45, 51, 50, 50,192,178,172,195,241,227,199, 39, 53,111,222,220,202,195,195, 67,178,123,247,110, 20,
+ 20, 20,128, 97, 24, 59, 31, 31, 31,187, 97,195,134,233,118,239,222, 61, 29,192,242,202, 34, 89,121,177,252, 60, 37,225,243, 78,
+131,150, 35,145, 66,252,250,206,180,119,240,139, 85, 61,162, 52,178,245,142,143,143,101, 94,146,124,166,133, 85, 19,187,188,164,
+208,153,239,248,248,108,255,245,169, 81, 55, 67,100,113,101,243,193,129, 3, 7,228, 81, 81, 81,114,127,127,127,112, 28, 87,154,
+129,191, 36,225,172,175,175,111, 77,206,227,178,224,224,224,153,131, 7, 15, 70,211,166, 77, 75,147,162,126,249,229,151,152, 57,
+115,166,237,165, 75,151,166,239,223,191,127,250, 79, 63,253,180, 28,192, 44, 19,163, 49, 37,152, 90,198,139,158, 61,123, 54,232,
+216,177, 99,195,103,204,152,225, 11, 96, 50,128,249,153,153,153,157,139,163, 49,146, 98,163, 53,102,250,244,233, 19,103,205,154,
+133,247,222,123,111,126, 88, 88,216, 55, 53,140,242, 81, 12,195,188,215,183,111, 95,202, 96, 48,192,220,220, 28, 6,131,161, 94,
+109,131, 18, 0, 54, 78,152, 48, 97, 98,112,112, 48,108,109,109, 97, 48, 24,252, 14, 28, 56,176,125,254,252,249,237, 1,140,173,
+100, 95, 71, 78,156, 56,241,253, 17, 35, 70,160, 85,171, 86,160,233,162,211,184,106,213, 42, 44, 94,188,216,226,236,217,179,253,
+118,239,222,221,239,196,137, 19, 71, 81,126,218, 46,147,224, 56, 14, 52, 77, 35, 33, 33, 1,142,142,142, 82,142,227,206, 16, 4,
+177, 45, 43, 43,235,167,127, 80,101,190, 98,208,160, 65, 31,236,219,183,207, 2, 0, 86,174, 92,137,105,211,166,193,201,201, 9,
+ 22, 22, 22,130,213,249,231, 68,180,198, 87, 27,209,170, 14,149, 74,213, 98,246,167, 31,130, 36,139,238, 26,235,215,245,196,210,
+ 57,227,137, 19, 33,103, 90, 84, 25,131,151,185,226,209,149,245,144,122, 76,133,214,192,224,198,253,103, 56,183,178, 87, 81,109,
+249,238, 92,104,245,221, 74, 42, 27, 59,137,153,217, 10, 29,203, 94,133,179,115, 24, 94,188, 72,175,206,100, 41,156,157, 66,182,
+108, 89,110, 22, 80,175, 1,244,140, 1, 73,105, 73, 32, 8, 41,220,221, 44, 49,102,228,187,162,206,157, 93, 29, 22, 45,218,122,
+ 58,133, 67,127, 85,198,227,106, 19,134,250, 57, 96,103,139, 0,223,193,195,122, 7, 74,155, 4, 52,134, 88,106, 86,250, 94,203,
+ 86,173,208,178, 85, 43,114, 86, 65,126,143,155,183,238,244, 56,114,246,134, 86,101,120,113, 40, 38, 3,163,170,185,200,148, 26,
+142, 41, 83,166,192,201,201,169,220, 6,169,169,169,248,253,247,223, 42,252,140, 9, 23,178,210,239,248,230,155,111, 44,179,179,
+179,223,221,177, 99,199,219, 28,199,125,147,146,146,114,197, 24,145, 17, 64,157, 92,169,180,219,232,213,171,185,230,255,251, 31,
+101,227,236, 76,114, 44, 75, 36, 63,125,106,191,102,253,250, 46, 89, 79,158,152, 21,218,217,101,101,171,213,170,152,152, 24,200,
+100, 50,130,166,233,214, 21, 72,165,242, 60, 86,144, 36, 49,147, 32, 8, 72,165,178,152,224,224,224,187,197,239,213, 57,117,234,
+148,188, 79,159, 62, 42, 0,113, 0, 32,149,202,220, 40,138,222, 54, 21,243, 0, 0, 32, 0, 73, 68, 65, 84,244, 43,202,196,142,
+ 21,198, 24, 76,115,115,243, 79,191, 94,178,220, 60, 47, 43, 71,173, 47, 44, 52, 40,172, 44, 8,194,194,146,202,203,205,207, 79,
+ 82,166,107,231, 46, 92, 76, 77, 24, 51,226,211,194,194,194, 73,198,154,172,102,205,154,221, 60,118,236,152,163,189,189, 61,114,
+114,114,144,153,153,137,155, 55,111,130,227, 56, 12, 24, 48, 64,218,161,109,155, 22,115,230,206,187,158,144,148,212,222, 24,179,
+101,110,231,128,149,129,205,139, 42,235,184,204,210,242,217, 54, 40,168,116,155,197,137,185, 37,209,185,218, 76, 33,213,190, 91,
+183,110, 98, 0, 24, 59,118,108, 94,126,126,254, 82, 0,251, 80,125, 70,255,233,243,230,205,115,171, 91,183,174,215,190,125,251,
+ 80, 80, 80, 0, 0,142,117,235,214,133,159,159, 31,123,225,194, 5,248,249,249,193,210,210, 18,151, 46, 93,194,245,235,215,209,
+170, 85, 43, 75,177, 88, 60, 88,175,215, 87,104,180,186,244,234, 50, 79,218,199,191, 83,131,150, 35, 97, 97,229,130,237,251, 15,
+226,209,157, 93,157,180,250,168,121, 98,246,226, 8, 53, 47, 29,149, 30,111, 49,171, 78,171,206,246,245, 27,255, 15, 94, 45,239,
+ 58,104,216,203,207,230,245,168,187,140,150,105,118, 45, 92,173,204,172,204,100, 1, 88, 57, 96,192,128, 65, 7, 14, 28,176, 1,
+128,240,240,112,164,166,166, 66,161, 80, 64, 38,147, 65, 36, 18,149,206, 79, 90, 67, 70,109,218,180,169,212,180, 49, 12, 83, 58,
+ 11,128, 92, 46,199, 91,111,189,133,230,205,155,227,167,159,126, 26, 85,137,209, 10,108,219,182,237, 94, 47, 47, 47,143,178, 47,
+ 22, 22, 22, 98,232,208,161, 0,128,206,157, 59,119, 51, 51, 51,227, 75, 12,161, 82,169, 44,184,117,235, 86, 15, 0, 97,149, 56,
+ 75,117, 82, 82, 18,190,248,226, 11, 60,127,254,252,227, 45, 91,182,188, 0, 32,147, 72, 36,165,247,199, 0,252, 26, 55,110,188,
+110,218,180,105,136,141,141, 69,100,100,228, 77,212,188, 41,149, 53, 55, 55,127, 98, 48, 24, 90, 49, 12, 3,181, 90,141,254,253,
+251,203,142, 30, 61,154, 74, 81, 84,116, 70, 70,198,112, 20,245, 73, 49, 22, 25,128,213,193,193,193, 19,103,204,152,129,223,126,
+251, 13, 39, 78,156,192,136, 17, 35, 48,117,234, 84, 88, 88, 88,140,158, 58,117,234,117, 20, 77,104,254, 50,221, 54,109,218, 4,
+150,101, 95,249,111,200,100, 50, 4, 6, 6,162, 81,163, 70, 56,113,226, 68,183, 90, 24, 45,175,192,192, 64, 9,199,113, 40, 44,
+ 44,196,133, 11, 23, 44,204,204,204, 44,220,221,221,199, 1,248,199, 24, 45, 47, 47,175,224, 3, 7, 14, 88,148,109,253,145, 74,
+165, 40,243, 59, 16,248,251, 35, 90, 85,222, 97,149,162,211,169,244, 52, 77, 70,187,186, 52, 61,116,233,226, 39,165, 77,135, 0,
+ 25,173,211,169,244, 0,192,114, 60,242, 84, 12,204,164, 36,226, 82,242,241,240,105, 70, 69, 82,229,134,104,138,204, 60, 33,109,
+ 19, 7,158,231,161,211,179,208,230,166, 96,233,105, 21,162, 18, 53,208, 21,102, 67,167, 47,234,134,229,224,224, 64,159, 57,243,
+203,180,208,208,223, 39,254,248,227,143, 84,162,181,117,100, 62,208,162, 34, 77, 91, 91, 31, 75, 78, 34, 57,180,121,203,124, 51,
+158,122,138,152,248, 66,212,119,111, 3, 7, 27, 15,164,100, 20,226,106,228,207,136,126, 28,130,186, 46, 94,152,250,233, 59,178,
+175,151,236, 59, 40,102,188, 61,115,114,158,231, 85,182,159, 37,119, 81, 91,127,141, 1,147,245, 20,108,102, 44,216,252,228, 87,
+ 54,176, 80,120,162,101, 87, 55, 40, 60,234, 73, 71, 77, 93, 60, 18, 40,103,180,202,106,166, 18, 4,185,153, 36,137,137, 4, 65,
+160,105,211,102,137,171, 87,175,174, 40, 21,184,190,105,211,102,137, 20, 69,186, 23, 93,216,201, 77, 60,207,165, 86,179,159,229,
+ 76,141, 68, 34,157, 81, 20,246,119, 73, 56,125,250,180,126,208,160, 65, 88,181,106,149,100,230,204,153,115, 41,138, 26, 91, 65,
+243, 94, 57,205,254,128,167, 77,189,122, 61,191,185,122,149, 23, 25, 12, 68,214,205,155,121, 57, 74, 37,147,146,159, 47, 57, 28,
+ 29,253,222, 71,159,127, 46,241,240,240,192,149,144, 16,251,244,194, 66, 62, 71,171, 85,231,228,228,240, 12,195,220,172, 68,115,
+182, 66,225, 40,223,190,125,187, 95,112,112,240, 93,165, 82, 57, 27, 0, 92, 92, 92,150, 2,104, 4, 32,174,204,107,216,178,229,
+ 96,210,184,113,227, 98,210,210,210,102, 87,181,159,101,104,236,168,112,148,239,223,186,251,129,157,165, 25,169,112,119, 37, 69,
+ 54, 54, 52, 35, 49, 19,115,128,186,174, 71, 61,115, 0,141, 43,249,236,203,154,132,153,153,217,177,147, 39, 79, 58,138, 68, 34,
+176, 44, 11,133, 66,129,231,207,159, 35, 39, 39, 7,249,249,249,120, 22, 29, 5,111, 15, 15, 44,154, 53,211,101,242,204, 89,199,
+ 84, 42, 85,171,151, 42,179, 87, 39, 64, 54,232, 95,137,236, 85, 52,139,193,203,205, 94, 70,150,123, 89,158,199,199,199,195,194,
+194, 2, 1, 1, 1, 22, 87,175, 94,189, 92,133,201, 42, 59, 9,240,224,142, 29, 59, 90,238,219,183, 15,173, 90,181,130,181,181,
+ 53, 46, 92,184,128,240,240,112,232,245,122,178,160,160, 0, 22, 22, 22, 88,182,108, 25, 60, 61, 61,145,159,159,143,184,184, 56,
+123,145, 72,228,240, 82, 70,251, 82,205, 11,103, 46,124,157, 27,123,126, 94, 10,241,235, 59,219,247, 31,196,184, 97, 67,224,204,
+ 63,189,108, 93,143,248,186,103,159,142, 95,242,148, 71,144,185,101, 83, 91,223,128, 62, 16, 75, 44, 48,121,198, 98,196, 68,156,
+178, 85,229, 63,248,152, 96, 19, 60, 22,174, 62, 60,165,130, 99, 39, 0,144, 30, 30, 30, 31, 29, 62,124,216,178, 52,244, 66, 81,
+165,115, 30,150,157, 4,190,138, 9,223,171, 61,159, 4, 65,224,249,243,231,112,116,116,132,133,133, 69,233, 4,226, 81, 81, 81,
+184,113,227, 6, 74,102,163,168, 68,115,120,104,104,168,135,185,185,121,185, 13,120,158, 71, 70, 70, 6, 24,134,129, 92, 46, 7,
+203,178,208,235,245, 48, 24, 12,208,104, 52, 22,141, 26, 53,154,100, 48, 24,194, 42,210,228, 56,238,179,193,131, 7,119, 12, 11,
+ 11,243, 89,191,126, 61,116, 58,221,202,148,148, 20,188,255,254,251,224, 56, 14,221,186,117,107,199,243,252,163,185,115,231, 2,
+ 0,166, 77,155,102, 40, 44, 44, 12,174,201,177, 23,211,168,101,203,150, 62,191,253,246, 27, 58,117,234, 4,173, 86,139, 85,171,
+ 86, 89,109,217,178,197,106,247,238,221,138, 25, 51,102,252,144,158,158,222,171, 26, 77, 2,192, 74,103,103,231,137, 93,186,116,
+ 49, 43,158,195, 20,187,118,237,194,162, 69,139, 14, 0,152,251,203, 47,191, 44, 56,113,226,196,200,143, 62,250, 8,139, 22, 45,
+154,154,147,147,179,163, 50,205,103,207,158, 65,161, 80,192,202,202,170,232, 98,169,215,227,222,189,123, 56,119,238, 28, 26, 54,
+108,104,204, 49, 85,182,159, 94, 3, 6, 12,248, 97,255,254,253,150, 9, 9, 9,184,116,233, 18,188,189,189,161, 82,169,140,153,
+ 27, 54,244, 79,168,176, 43,213, 84,171,213,154,248,248,120,139,229,203,151,195,197,197, 5, 94, 94, 94,144,201,100, 32, 8, 2,
+ 6,131,161,170,233,213,170,221,207,206,157, 65,103, 36,217,246,181,182,177,253,152,231,121, 58, 55, 55,123,171, 30, 57, 71,158,
+ 62,133,238, 47, 60,246,127, 51, 45, 0,220, 69,249, 57, 15,149,165, 70, 43, 36, 36,132, 15, 10, 10, 34, 74,214,110,110,200,203,
+200,176,141,113,116,110,114,208,209,185,113,241,188, 95,100, 52, 69,217,198, 56, 57,169,242, 0, 64,207,240,184, 22,157,131, 7,
+ 79, 82, 16,254, 36, 5,230, 82,227,130, 47, 90, 61, 83,212, 99,149,231,161, 41,248,227,166, 85,175,202,134, 86, 95,212,221, 67,
+167, 85, 33, 55, 61,146, 24,212,191,135,108,226,196, 9,112,113,113, 83, 84,166,167,151,202,166, 78,158,246,158,141,157,141, 8,
+ 33, 87,127, 69,187,134,253, 33,147,138,144,153,171, 1, 8,224,241,211,115, 0,103,137,136,152,120,180,109, 44, 71,175,158,254,
+255,103,239,186,195,162,184,218,239,153,237,176,187,244, 94, 44, 88, 0,123,239, 40, 98, 67, 99,239, 88, 98,239,216, 27,106,140,
+ 37, 42, 26, 77,236,189,196, 96,239,137,216, 80, 84, 44, 88,233,136, 88, 0, 41, 11, 82,150,165,108,223,157,157,249,253, 65, 9,
+ 42,101, 65,243,253,190,228,219,243, 60,243,192,236,206,156,125,231,222, 59,115,207,188,247,222,247, 21, 94,190, 16,191, 4,192,
+106,125,236, 37,211,158,131,227,218, 15,108,157, 22,218,156,120, 80,121,201,128,192, 30, 10, 66, 8,113, 70, 50, 94, 63,188,168,
+215, 59, 35, 69, 81,115,172,173,173,243, 86,173, 90,213,189, 97,195,134,154,217,179,103, 71, 38, 39, 39, 47,250,236,109,229,215,
+125,251,246,225,221,187,119,162,141, 27, 55,222,207,201,201,249,161,154, 21,237, 71,211,216, 81, 60, 20,151,115,229,202,149, 54,
+ 33, 33, 33, 11,118,236,216, 97, 55,119,238, 92,238,220,185,115, 39, 3,248,169,178,225,194, 2, 30,175,215,198, 7, 15,104, 50,
+ 45, 77,117, 98,247,110,238,222,208,208, 85, 26,138,114,180,182,181, 37, 58,119,232, 32,227, 51, 24, 57,226,204, 76,210,166,126,
+125,102,210,237,219, 86,180,177,113,250,141, 27, 55, 10,164, 82,105,133,169,115,152, 76,166,188,188,225,194,242,224,224,224,160,
+ 46,111, 14, 87, 37, 29, 98, 1, 69,211, 26,243,122,245,232, 62, 61, 59, 53,124, 23,159,144, 96,100,110,206,116,109,232,226, 30,
+251, 58,233, 57,173,211, 41, 9,130, 40,208,107,172,132,201, 28,189, 99,199,142,230,166,166,166,160, 40, 10,102,102,102,200,206,
+206,134, 90,173, 70, 65, 65, 1,212,133,249, 80,231,231, 35, 58, 57, 9, 93,186,119,199,200,190,125, 26, 7, 92,249,115,180, 78,
+167, 59, 83,233,120, 94,139,214,165,158,172,245,117,173,254, 26, 11, 74,205, 43, 21, 93, 91, 90,187,130, 35, 20,162,247, 34,191,
+175,185,209,195,175, 93,187,118,125,216,176, 97,223, 45, 89,178,132,145,145,145,113, 51, 41, 41,169, 11,128, 87,149,157, 36, 20,
+ 10, 27,228,228,228, 64, 42,149,194,204,204, 12, 59,118,236,128,157,157, 29,228,114, 57, 94,188,120, 65, 59, 59, 59, 19,247,239,
+223,135,179,179, 51,196, 98, 49, 52, 26, 13, 20, 10,197, 71,181, 90, 93,225,112,121,241,240, 96,191,133,125,113, 35, 62,236,247,
+174, 78, 68,226,139, 81,139, 61,223,197, 71,191, 78, 9,186,253,248, 39, 82,105,148,154,151,118,103,121,189,118,225,214,115,150,
+174,195,158,173,107, 16,255,236, 65,174, 93,237,130,189,198,132,234,120,101,246,202,100, 50,229,235,215,175, 77, 34, 35, 35, 65,
+ 16, 4,204,204,204,192,231,243,203, 21, 91, 53, 0,163,172, 7, 74, 38,147,129,195,225,192,202,202, 10, 71,142, 28, 41,237,120,
+ 93, 92, 92, 42,227, 56,216,187,119,239,209,181,107,215, 54, 41,251, 97,187,118,237, 48, 99,198, 12,236,223,191, 31,161,161,161,
+159,228,211,252,248,241, 99,134, 86,171,173,236,186,243, 50, 51, 51,251, 14, 29, 58, 52,236,225,195,135,166, 71,142, 28, 1, 73,
+146,229,110,135, 15, 31,198,211,167, 79, 87, 3,120, 93,195,118,212,104,248,240,225, 15, 78,158, 60,105,158,157,157,141,146,182,
+ 33,147,201,160,211,233,224,238,238, 78,144, 36, 89,213,188, 55, 6,147,201,188,178,123,247,238,129,211,166, 77, 3,139,197,130,
+ 90,173,198,238,221,187,177,124,249,242,204,226,151, 82, 13,128, 85,199,143, 31,159, 48,104,208, 32,180,108,217,178,241,189,123,
+ 21,207,236,144, 74,165,144, 74,165, 96,179,217,176,183,183,199,134, 13, 27,160, 86, 23, 61, 86,220,220,220, 74,111, 99, 0, 7,
+221,220,220, 6,190,121,243,102, 27,138,230,174,125, 1,123,123,251,161, 52, 77, 79,215,233,116,133, 93,187,118,181, 58,125,250,
+180,137, 72, 36, 66, 88, 88, 24, 86,175, 94, 45,161, 40, 74, 71, 81, 20,161, 80, 40, 18,109,109,109,195,120, 60,158,177, 92, 46,
+207, 21,139,197,155, 0,220,252,255,234,201, 9,130, 32,216,108, 54,166, 76,153, 2, 22,139, 5, 99, 99, 99, 40,149, 74,104,181,
+218, 82, 49,143,106, 14, 75, 55,108, 40,180, 98,129, 51,205,194,164,201,130,145,243, 7,216, 56, 56, 58,193,220,148,135,184,184,
+ 87, 93,238, 6,223,222,205,101,197, 31,160,212,218, 3,241, 31,242,255,246,100,247,159,107,145,127,168,208,250, 34,231, 33,171,
+252,202, 28,169,163,233,243, 57, 34, 17, 87,195,229,242,223,148,120,185,236,236,228, 5, 4, 49, 82,103,211,116, 48, 72,141,182,
+248, 65, 65, 23,111,122, 10, 45,173, 14,239,226, 99,240, 48,232, 79, 88,203, 69,200, 73,108, 5,112,154, 67,173,200,135, 82,173,
+ 41, 22, 37, 58, 68,134, 5,163, 32, 63, 23,205,218, 14, 0, 24,140,167, 21,241,153, 89, 17, 3, 58,183,105,193,124,151, 18,131,
+118,110, 35, 80,223,185, 43,146, 51, 10,144, 39, 85, 65, 82,160, 68,171,102,126,200,150, 40, 80, 32, 87,226,213,187, 0, 56, 57,
+214,103, 16,172,132,158,250, 10, 45,213,171, 75, 80,189,254, 3,156, 58, 93,192,117, 31, 4,102, 29, 15,164, 68,221, 67,228,141,
+237, 72,139,125, 4,154,210,193,193,173,189,190, 55,201,238,155, 55,111,182,239,210,165, 11,171, 87,175, 94, 45,175, 95,191,222,
+ 50, 35, 35, 35,178, 88, 96,180,236,213,171, 87, 75, 27, 27, 27,236,220,185, 83, 65, 16,196,238, 26, 86,118,169, 7, 44, 43, 43,
+235, 57,128,141,151, 46, 93,218, 61, 99,198, 12,216,218,218, 54, 79, 79, 79,175,240,196,108, 54,187,229,196, 77,155,104, 54,147,
+ 73,159,217,179,135,179,238,230,205, 95,126, 59,126,156,211,195,203,139,160,105, 26, 17, 17, 17,252, 45,123,246,240,199, 14, 30,
+252, 33, 57, 43,139, 12, 9, 13,213,100,164,165, 21,102,201,100,235, 50, 50, 50, 62,254,127,180,108,173, 86,251, 36, 49, 41,209,
+169,109,135, 86, 54,225,113,137,177,222, 61, 58,119,102, 48, 24,140,248,132,228, 80, 27, 27, 83,254,237,160,219, 26,173, 86,251,
+ 68, 31, 46, 30,143, 55,160, 71,143, 30, 44,137, 68, 2, 71, 71, 71,100,103,103, 67, 36, 18, 21,121, 28,242, 37,208,228,231, 67,
+ 91,144, 7,157, 76,138,196, 23,207,209,170,126, 61,222,121, 30,111,128, 92, 46,175, 84,104,149,188,101,150,151,232,186,228, 51,
+174,137, 9,184, 66, 33,136,234, 15, 27, 14, 54, 55, 55, 95,158,151,151,119, 29,192, 6,141, 70,227,187,124,249,242,118,187,118,
+237,178,222,184,113,163,233,244,233,211,207, 75,165,210, 86, 40, 74,170, 90, 81, 7,246,158, 36, 73, 43, 0,118,193,193,193,176,
+181,181, 69,126,126,126,137,167, 69, 45,151,203,141,196, 98, 49, 84, 42, 21,212,106, 53, 76, 77, 77,241,242,229,203, 92,146, 36,
+175, 86,101,156,105, 3, 98,131, 74, 19,247,131, 85, 99, 65,186,134,180,240,204,202,165, 36,107,127,201, 88, 15,224,151,190,245,
+235, 31,214, 80, 15, 18,223,198, 92,181, 72,122,113, 63, 55,253,173,172,254,145,235,137,149,205,209,162, 1, 80, 4, 65,208,110,
+110,110,200,206,206, 6,147,201, 4,159,207,135, 80, 40,196,138, 21, 43,176,123,247,238,154, 8, 45, 35,129, 64,176,137,193, 96,
+140,102, 48, 24, 54, 58,157, 14,126,126,126, 24, 56,112, 32,184, 92, 46, 52, 26, 77,169, 71,179,196, 75, 85,133,167, 35,226,233,
+211,167,166, 79,159,126,242,216,242,178,182,182,190,171, 82,169,144,144,144,128, 43, 87,174,116, 7, 16, 82,205,186, 78,136,136,
+136,232,235,225,225,241,123,155, 54,109, 26,208, 52,141,230,205,155,195,199,199, 7, 1, 1, 1,136,140,140, 68,126,126, 62,117,
+251,246,237,223, 0,108,171,110, 31, 94, 92,190,238,195,135, 15,127,116,234,212, 41, 11,177, 88, 12,133, 66, 1,153, 76,134,243,
+231,207,163, 75,151, 46,176,182,182,198,201,147, 39, 73,154,166, 43,171,123, 6,131,193, 56,114,224,192,129,129, 83,167, 78,197,
+222,189,123,113,230,204, 25, 12, 26, 52, 8,163, 71,143, 70,118,118,182,221,214,173, 91, 39, 20, 15, 19,174,241,241,241,129, 84,
+ 42,197,139, 23, 47,226,244,188,231,145,151,151,135,188,188, 60, 24, 27, 27,151,189,199, 8, 0, 1,219,183,111, 31,179, 96,193,
+ 2,212,175, 95,127, 77, 98, 98,226,118,148,179, 74,148,162,168,153, 34,145,200,130,197, 98, 89,145, 36,137,212,212, 84,188,124,
+249, 18,115,230,204,201,205,205,205,157, 1, 32, 25,192,170, 41, 83,166,108, 88,180,104, 81,105, 91, 90,180,104, 81,224,245,235,
+215,251,254,167,189, 57,110,110,230, 77,185, 76,222,124, 73, 33,211, 74, 34,145,148, 62, 59,212,106, 53, 84, 42,213, 39,158, 44,
+ 14,135,109,213,174, 85,237,107, 10,121,225,202, 87,111,243, 42, 76,144,222,184,129, 89, 11,190,192,108, 65,151,174, 61,198,245,
+233, 59,132, 73,106,181,184,117,235, 42,142, 30,221, 7, 47, 15, 55,212,111,216, 28,115,231,205, 55, 83,169, 73,191,219,183,111,
+ 46, 55,127,250,240,102, 97, 65,222,138,202, 56,255,199,113,173, 88, 92, 93, 43,119,232,176, 60, 5, 89, 28,194, 65, 82,188,107,
+109, 97, 97,177, 71,167,211,121,153,154,154,130,202,123,131, 87, 47,159, 33, 87,194,134, 74,161, 3, 69, 23,137, 45,189,132,139,
+ 74,141, 7,183,254,192,142,237,191, 64, 44, 22,195,163, 91,119, 72, 89,181, 80,187, 86,109, 40, 21,242,226,155, 6,208,168,181,
+176,177,171,131,240,240, 72,109,129, 76, 86,225, 3,137, 99,164,105, 92,219,206, 13, 42, 77, 39, 24,113,185,200, 47, 84, 67, 82,
+ 44,178, 78, 94, 24, 5,149, 92, 1, 82,173, 1,169,214,194,166,246,112, 52,178,235, 1, 74,119,181,105,181,138,143,210, 65,147,
+244, 0,154,164, 7, 48,238, 52, 15,127,250,143,249,172, 35,213, 47,239,110,118,118,118, 86,108,108,236,213,136,136,136,161,163,
+ 70,141,194,189,123,247,166, 3,152, 85, 60,124, 51,125,212,168, 81,136,136,136, 64,108,108,236,213,236,236,236,172,111, 81,243,
+ 92, 46, 87,161, 82, 21,245,177,124, 62,223,168,138, 99,157,218, 13, 27,198,200, 15, 15, 47,216,254,248,241,154,195, 71,142,112,
+122,245,236, 73,104, 73, 18,148, 78,135,134,174,174, 68,159, 62,125, 4, 1,231,206, 89, 49,181,218,167, 75,125,125,131,247,143,
+ 31, 95,248, 92, 38,211,119,162,121,221,226, 33, 67, 0,168, 91,201,103,122, 67,165, 82,237,154, 57,109, 82,175,144, 7,143,106,
+213,174,229,100,122,235,118, 72, 36,207,152,203,168,239,210,128, 41,201,207,101,173, 95,179,210, 88,165, 82,233, 43, 90, 27, 91,
+ 91, 91,227,227,199,143,120,247,238, 29, 84, 42, 21,180, 90, 45, 40,185, 12,106, 73, 30,212,249,185, 32,148, 10,240,116, 58, 40,
+115, 50, 81,183,126, 61,224,175, 21,137, 85, 14, 69,149, 39,180, 74,254, 26,153,154,130, 35, 16,130,193,102,235,157, 28, 29, 64,
+155,246,237,219,159,187,120,241, 34,103,242,228,201, 29,238,220,185,179, 7, 64,178, 72, 36,234,185,122,245,234,231,123,246,236,
+225,205,152, 49,195,125,219,182,109, 19, 0, 28,172,136, 68,169, 84,158,187,118,237,218,216, 58,117,234,216, 69, 71, 71, 67,169,
+ 84,130,162, 40,244,235,215, 15, 40,154, 91, 3, 0,136,143,143, 87, 40,149,202,172,152,152,152,130,228,228,100, 13,244, 88, 37,
+184,118, 87,198,147,130,143, 15,134,217,217, 59, 61, 53, 50,174,235, 66, 75,195,135, 46, 28,225,180,117,251, 5,145,242,102, 66,
+ 66,225, 15,189,235,109,150, 21, 70,205, 49,119,150,238,189, 25,152,168,207, 68,248,210,213,133, 86, 86, 86, 96,177, 88, 96,179,
+217,224,112, 56, 32, 8, 2,243,230,205,195,161, 67,135,170, 26, 58,252, 68,100,153,152,152,196,174, 91,183,206,121,198,140, 25,
+ 28, 35, 35, 35, 72, 36, 18,156, 60,121, 18, 83,166, 76,193,209,163, 71,203,157,255,162,199,144,210,231,222,210, 5,227,199,143,
+135, 90,173,134,143,143, 15, 14, 31, 62,188, 64,167,211,133,212,224,150,126, 26, 25, 25,233, 26, 25, 25,105, 10, 96,208,232,209,
+163,143, 15, 31, 62, 28, 33, 33, 33,184,122,245,106,119, 20, 45,250, 80, 0,240, 7, 96, 91,252,183,178,251, 83, 96,103,103,183,
+143,162,168, 65, 54, 54, 54,145,110,110,110,205, 78,157, 58,101,158,149,149, 85,178,248, 1, 73, 73, 73, 56,118,236, 88,198,145,
+ 35, 71, 10,116, 58,157, 21,131,193,184,150,151,151,183,162, 18,193,118,100,251,246,237,147,138,135, 3,113,241,226, 69,250,151,
+ 95,126, 33, 86,175, 94, 13,137, 68, 2, 47, 47, 47, 28, 56,112, 96,190, 84, 42,109,249,203, 47,191, 76, 27, 57,114, 36,214,175,
+ 95, 15,153, 76,182,189,170,151,149, 74,196, 23, 1,160,243,246,237,219,235, 44, 88,176, 0, 23, 47, 94, 68,155, 54,109,140, 19,
+ 19, 19,247, 3,152, 90, 94,253,209, 52,141,196,196, 68,200,229,114, 60,122,244, 8,107,214,172,145,148, 17, 89,243,103,205,154,
+181, 97,254,252,249,216,180,105, 19, 29, 29, 29,157, 53,124,248,112,187, 67,135, 14, 49, 27, 54,108, 56, 95, 46,151,255,199,132,
+150,123, 67,203,205,237,218,116, 93,238,224,212, 16, 39, 79,157, 70,110,110,110,105,153,148,148, 11, 77,211, 40, 44, 44,196,199,
+143, 31, 97,102,106,130,173,219, 54,124, 55,123,250,164, 90, 40, 10,131,241,165,203,178,190,197,182,225,163, 39, 47,246, 25, 59,
+ 9,209,145, 97, 8, 56,126, 16, 49,209, 17,165,124,164, 86,131, 55,113, 47,241, 38,238, 37,236,236,235,160, 79,175,238,196,152,
+ 49, 99,250,141, 31, 59,218, 6,192,223, 22, 58,226, 31,236,205, 2,190,140,163,117,232, 19,161, 85,133,187,206,218,194,194, 34,
+246,236,217,179, 86, 30, 30, 30, 76,146, 36,113,243,214, 45,204,153,245, 61, 38,140,247,131, 6, 22, 32,213, 28, 80, 28, 35,189,
+ 44, 81, 40,228,160, 65, 67, 38,147, 33, 52, 52, 20, 52, 69, 34,224,208, 47,160,105,170, 84,104, 1, 52,212, 26, 13,156,106,187,
+ 99,223,225,141, 36,216,236,231,208,150, 31,186,166, 64,204,212,105, 73, 26,162,172, 20,164,100,196,192,204,164, 54, 88,236,218,
+ 16,231,201,193, 98,216, 67,171,140,135,174,248, 92,185, 44, 13, 10,205,215,213,159,174, 28,239, 41, 93,141,135,174, 66,161, 56,
+113,226,196,137,239,126,253,245, 87,110,255,254,253,221, 46, 92,184,208, 25, 0,250,247,239,239,102,106,106,138, 19, 39, 78,168,
+ 21, 10,197,137,111,232,241,233,209,190,125,123, 72, 36, 18, 36, 37, 37, 69, 86,122,109,106,181,149,208,214,150,153,117,239,158,
+ 54, 91, 34,169,213,163, 71, 15, 66, 75,146, 96, 16, 4,114,243,243,145,252,225, 3,204,205,205,137,216,248,120,225,238,185,115,
+ 47,187, 53,107,198, 42, 89,145,168, 15,174, 94,189,202, 71,209,188,172, 74, 63,171, 38,100, 89,153, 31, 39,249,250,250, 94, 62,
+113,226,164, 89,102, 86,230, 27, 30,151, 75, 10,133, 70,142,227,199,205,102,229,229,229,141, 5, 32,213,151, 76, 34,145, 32, 49,
+ 49, 17,198,198,198,224,176,217,160, 20,114,232,100, 82, 40,115,179,193,212,168,193,213,233, 96,201,231,161,150,157, 29,106,219,
+ 88,235,197,249,238,110, 80,233,196,247,178,195,133, 91,219, 55, 6, 87, 32, 4,215, 68,136,217,129,247,139,223, 70, 57,192,234,
+159,244,161,181,118,114,114,250,243,212,169, 83,156,236,236,108, 68, 68, 68, 68, 2,200, 7, 96, 2,128,138,139,139,187, 19, 19,
+ 19, 51,160,120,213, 93, 85,171,197,126,185,116,233, 82,111, 15, 15, 15,210,197,197, 69,144,149,149, 85, 75, 34,145, 80, 25, 25,
+ 25,159,184,132,130,130,130,120,133,133,133, 50,138,162, 46, 23,139,172, 42,227, 23, 45, 28,225,100, 20, 26,142,121,158,222,117,
+155,155, 90,183, 64, 46, 25,222,252,105,100,198,188,133, 35,156,118,109,191, 32, 82, 26, 19,170,227,132, 46,181, 22,203, 72,169,
+239, 36,102, 26, 40,154, 43, 21, 26, 26,138,228,228,100, 36, 38, 38,126, 34,168,166, 79,159,142,128,128, 0,189, 60, 90, 2,129,
+ 96,211,218,181,107,157, 23, 44, 88,192, 41, 35,138,224,235,235,139,252,252,124, 28, 62,124, 24,190,190,190,213,238,248, 63, 67,
+189, 30, 61,122,244,119,112,112,128, 88, 44,134,189,189, 61, 60, 60, 60, 6,134,132,132,184, 0, 72,170, 97,187,159,237,237,237,
+189, 97,221,186,117,208,106,181,152, 50,101, 10,222,190,125,123,238,237,219,183, 59,106,215,174, 61,111,217,178,101,118,118,118,
+118, 24, 53,106,148,128, 36,201, 97, 21,145, 88, 90, 90,250, 31, 60,120,112,108,255,254,253, 25, 26,141,166,219,221,187,119,241,
+225,195, 7,168,213,106,144, 36,137,247,239,223,195,215,215, 55,163,120,117,227,123, 61,236,154,188,106,213,170, 73,243,230,205,
+195,150, 45, 91,176,118,237,218,223,204,204,204,154,181,106,213,170,245,218,181,107,177,116,233, 82,212,169, 83, 7, 86, 86, 86,
+141, 86,175, 94,221,120,209,162, 69,216,181,107, 23,214,172, 89,243, 27,128, 99, 53, 41, 8,138,162,136,205,155, 55,183,220,190,
+125,187, 67,137,200, 98, 48, 24, 56,123,246, 44,194,195,195, 7, 38, 36, 36,148,119,206, 1,123,123,251,233, 14, 14, 14,220,219,
+183,111, 11,235,212,169, 3,146, 36,181,197, 34,107,119,237,218,181,231,188,127,255, 30,253,251,247, 71, 66, 66,194, 9, 0, 19,
+204,204,204,100,139, 22, 45,226, 27, 27, 27,155,201,229,242,255, 84,231, 13, 38,131,152,184,105,253, 82,188, 8,143,199,165, 75,
+ 28,188,120,241, 2,118,118,118,224,241,120,160,105, 26, 42,149, 10,217,217,217,208,106, 84,104,222,180, 30,126, 63,178, 25, 89,
+ 89,217, 0,131,168,112,202, 13,193, 32,198, 77,250,126, 40, 30, 62,186,133,253,251, 15, 66, 42,149, 85,240,242,109,132,134,110,
+141,225,228,104,139,212,180, 84, 16, 12, 88,255,157,215,250, 15, 31, 58, 44,125, 4, 65,159,240, 14,101, 97,110,110,190,227,204,
+153, 51, 86, 94, 94, 94, 76,153, 76, 6,138,162,208,213,195, 3,243, 22, 44,192,213, 83,167,224,218,193, 7,132, 90, 8,146,175,
+223,170, 7,165, 66,142, 38,173, 59, 99,228,168,209, 72, 73, 78,134,247,128,225, 80, 42,229,165,111, 24, 37, 30, 45,181, 90, 3,
+107,219, 90, 8, 10, 10, 98, 98,202,148, 87,216, 93,190, 83, 66,167,225, 70,189,121,175,236,146,167, 8, 71,232,139, 0,104, 84,
+ 26, 52,111,190, 26, 26,202, 10,182,206,211,161,213, 94, 65, 65,246,221,162, 97, 12, 43, 47,164,165,164,128,193,228,196,214,180,
+ 4, 41, 89,246, 87, 61,116,243,243,243,243, 19, 19, 19, 47,132,134,134,142, 27, 54,108, 24,130,130,130,166, 1,192,176, 97,195,
+ 16, 26, 26,138,196,196,196, 11,249,249,249,249,223,162,182, 29, 28, 28, 6,117,239,222,221,167, 93,187,118, 8, 12, 12, 4, 77,
+211, 15,245,186,177,217,108,154,193, 96,128,162, 40, 16, 0,196,121,121,120,251,246, 45,196, 57, 57,208,106,181,144, 73,165, 84,
+ 99, 55, 55, 41, 77, 81, 38,213,177,167,236, 10, 67,148,179,234,176,228,179, 26, 92,106,242,243,167,143, 83, 10,165, 82, 27, 11,
+115,139, 66, 46,151,171,147,228,229,229,191,138,141, 86,235,217, 57,148, 32, 46, 38, 38,166, 89,122,122, 58, 82, 82, 82, 64,202,
+ 10,193, 84,169,193, 80,201,209,179,115, 39, 24,131,134, 17, 40,176, 41, 45,216, 76, 54, 10,139, 86,231, 85, 57,220,161, 43,243,
+146, 80, 34,178, 8,130, 40, 26, 46, 20, 8,192, 21,154,124,226,225,210,167, 61,241,120,188, 83,231,207,159,119,112,114,114,194,
+250,245,235,225,236,236,220,200,209,209, 81,110,102,102,102,108,103,103,135, 38, 77,154,160,115,231,206,184,113,227, 6,244, 40,
+ 3,146,166,233, 62, 15, 31, 62, 92,252,248,241,227,145, 2,129,128,152, 59,119, 46,171, 95,191,126,224,241,120,144,203,229,144,
+ 72, 36, 56,125,250,116, 14, 69, 81, 37,139, 82,172,248,124,254, 49,130, 32,146,100, 50,217,130,207, 9,127,255,181,185, 99, 86,
+ 46, 53,133,150,242,135,122,122,215,109,222,195,187, 23,234,185,246, 64, 15,239, 20, 0,216,108,201,250,224,243,243, 42,243,203,
+230, 38,196,177,160,155,183,215,120,120,246, 88,181, 92,122,111,195,150, 67,121, 85,206,167, 35, 8, 2, 20, 69,125, 18, 59,232,
+243,239, 39, 76,152,128,179,103,207, 86, 89,142, 12, 6, 99,244,140, 25, 51, 56,159,121,158, 33, 18,137, 48, 96,192, 0, 12, 27,
+ 54,236, 19,161,101,109,109, 13,123,123,123,124,248,240, 1, 0,196,122,182,171,121,147, 39, 79, 38, 20, 10, 5,166, 78,157,138,
+195,135, 15,195,199,199,135, 8, 9, 9,153, 7, 96, 65,117, 27, 59,131,193,216,186,108,217,178,197,190,190,190,200,205,205,197,
+245,235,215,209,175, 95, 63,156, 61,123,214,230,250,245,235,155,188,188,188,192,100, 50, 17, 24, 24, 8,146, 36, 43,141,245,197,
+225,112, 6,245,239,223,159,145,154,154, 10, 14,135,131,182,109,219, 34, 45, 45, 13,114,185, 28, 34,145, 8,243,231,207,255, 40,
+ 22,139,187,235,123, 31,113, 56,156, 5,243,230,205,195,153, 51,103,224,231,231,119, 28,192,212,252,252,252,145,143, 31, 63, 62,
+ 51,120,240, 96,136, 68, 34, 92,190,124, 25,107,214,172, 33, 38, 76,152,128,189,123,247, 98,254,252,249,191, 21,123,157, 42,106,
+248,133, 89, 89, 89,102, 13, 26, 52, 64,102,102, 38,164, 82, 41, 46, 95,190,108,123,227,198, 13, 23, 39, 39, 39,211,196,196, 68,
+221, 79, 63,253,196, 93,176, 96, 1,118,236,216,129,136,136, 8, 4, 4, 4,160, 71,143, 30,100, 66, 66, 66,185, 94,178,226,144,
+ 13,151,105,154,190, 45, 16, 8, 80, 88, 88, 88,114,223, 45,241,243,243,243,245,247, 47,114,178,167,167,167, 99,226,196,137,227,
+131,131,131, 41, 47, 47, 47, 62,135,195,129, 82,169,148,253, 39,123,109, 74, 71, 1,160,224, 82, 75,136, 91, 87,143, 32, 44, 50,
+ 1, 97,145, 49,224,242,138, 38,193, 43, 20,114,180,110,222, 16, 29,218,182, 71,122,134, 8, 39, 2,142,192,210,218,169,210,231,
+ 8, 77,211,224,176,116,104,236,102,143, 83, 1, 7, 17,120, 61, 24, 1, 39, 78,151,206,121, 99,177,216,104,213,186, 3,218,182,
+245, 64, 66,226,123, 28, 57,178, 31, 54,182,181, 12,131,131, 53, 68,233,208, 97,217,191,159, 41,255, 30, 30, 30, 30, 76,169, 84,
+ 10,165, 82,137,143, 31, 63,226,195,135, 15, 48,183, 48, 71, 66,122, 18,186,243, 53,248, 72, 21, 32, 46, 50, 86, 71, 48,217, 17,
+ 85,253, 96,127,207, 86,128,103, 43,204,153,236, 83,201, 43, 43, 13,129,169,117,209,208, 13, 73,190,195,174, 93,100, 69, 66,139,
+212,105,239,220,186,125,183,253,228, 9,131,216, 65,119, 15, 67,171,166,160,208,154, 65,166, 84, 67,166, 97,131, 97,214, 15,200,
+ 9, 1,147,197, 67,199,150, 13,113,249,210, 13, 13, 77,106,131,245, 46, 32,187,102, 32, 51, 99,202, 8,173,172,207,198, 29, 44,
+245, 30, 58, 44,237,120,117,186,179, 39, 79,158, 28,210,169, 83, 39,190,151,151, 87,131,226,142, 83,115,242,228, 73,121,113, 48,
+204,234,226,147,104,240,246,246,246,173, 57, 28,142, 79,191,126,253, 90, 79,154, 52, 9,175, 94,189,194,137, 19, 39,222, 52,108,
+216,240, 94, 70, 70,197, 43,178,153, 92,174, 88,154,149,101, 46,116,113, 97, 89,152,152,164,223,184,126,189, 78,175,222,189,137,
+148,148, 20,136,197, 98, 40,149, 74, 68, 68, 70,210,108, 38, 51,141, 48, 53,101,196,135,135, 51,152, 92,174,184, 34,111, 99, 57,
+248, 80,197,170, 67,255,154,122,183,106, 57, 88, 52, 88,227, 55,179,158, 82,165,108, 86, 80, 80, 64,178,216,108,182,179,189,121,
+114,252,123,253,159,137, 42,149, 42,240,206,157, 59, 67,122,245,234,197,123, 19, 21, 1, 50, 63, 31,234,124, 9, 56,148, 14,150,
+173, 91,130,169, 81, 1,106, 45,156, 26,211, 80,230,241, 17,242, 44, 94,171, 82,169,170, 12,106, 88, 34,180, 24,159, 9, 3,174,
+ 80, 8,158,137, 41,120, 66,225,231,130,161,170, 55, 57,126,159, 62,125,122,118,236,216, 17, 52, 77,227,208,161, 67,208,104, 52,
+ 92,141, 70, 3,181, 90, 13,141, 70,131,130,130, 2, 4, 4, 4, 96,223,190,125,143, 1,252,166,199,229,147,198,198,198,131, 9,
+130,176,101,177, 88,114, 27, 27, 27,193,217,179,103, 75,195, 77,180,106,213, 10, 38, 38, 38, 28, 20, 7,133,180,181,181,101, 31,
+ 61,122,212,124,224,192,129, 15,202, 29,238,104,222,104,105, 61,210,194,211,200,184,174,139,169,117, 11,212,115,237, 1, 0,232,
+ 61, 96, 50,234, 53,172,141,130,156, 40, 23,165,226,195, 80, 14, 75, 98, 17,187, 75,244,202,184,127,179, 73,178,172,251,111, 81,
+254,242,254,114, 59, 10, 6,131, 81,225,112,172, 62, 34,171, 72,179, 48,108, 74,230,249, 0,128, 88, 44, 70, 70, 70, 6,226,226,
+226,224,238,238,142,220,220, 92, 56, 57, 57, 65,173, 86,163, 93,187,118, 80, 40, 20,216,190,125, 59, 30, 61,122,244, 24,192,124,
+ 61,126,195,216,213,213,117, 98,235,214,173,113,253,250,117,188,120,241, 66,116,235,214, 45, 39, 15, 15, 15,184,184,184, 76, 74,
+ 74, 74, 90, 89, 60,212,167, 47, 4, 30, 30, 30,115,125,125,125, 17, 19, 19,131,153, 51,103,138, 83, 83, 83, 47,159, 59,119,110,
+234,154, 53,107, 24,222,222,222,200,200,200,192,214,173, 91,117,143, 30, 61,218, 6, 96,125, 21,229,248, 58, 53, 53,213, 89,169,
+ 84, 34, 55, 55, 23, 36, 73, 66, 46,151,227,198,141, 27, 8, 8, 8,200, 44, 22, 89,239,244, 53,174,101,203,150, 77, 24, 12, 6,
+206,156, 57, 3, 0, 63,160, 40, 98,255,229,161, 67,135,138,126,250,233, 39,167, 21, 43, 86, 96,218,180,105,208,104, 52,216,178,
+101, 11, 86,172, 88,113,173, 88,100, 85,246, 16,253,213,222,222,126,250,204,153, 51, 27, 45, 90,180, 8,161,161,161,182, 47, 95,
+190,108, 27, 17, 17,129, 90,181,106, 65, 44, 22,179,172,172,172,176, 99,199, 14, 44, 92,184,240, 34,128,156, 39, 79,158,140, 78,
+ 76, 76,244, 7,176,181, 10,209,126,192,201,201,105, 58, 77,211,180, 92, 46,255,224,231,231,183,117,227,198,141, 88,184,112, 33,
+ 98, 99, 99,145,159,159, 15, 19, 19, 19, 98,217,178,101, 19,127,248,225, 7, 76,153, 50,133,150,201,100,251,254,211, 29, 53, 77,
+235, 32,151,196, 64,167,178, 64,171,230,238,104,213,172, 46,110,221, 13, 3, 0,244, 28,238, 1,185,172, 16,199,143, 31,194,187,
+119,111,193, 98,179, 97,110,105,175,143, 39, 16,234,130,215,200,211,100,160,151, 87, 91,244,243,238,142,223,126, 63, 11, 82,171,
+193,212,201, 99, 33,201,203,195,239,191, 31, 65, 66,226,123,176,216,108, 88, 89,255,253,129, 80, 43,211, 34,255,120,161,165,199,
+240, 19, 40,138,130, 72, 36,194,203,151, 47,145,148,148, 4, 62,159, 15, 5,169,163,246,223,121, 68, 17, 4, 39,141,162,233,199,
+ 52, 89, 26,165,248, 75, 14,157, 78, 84, 38, 98,173,153,133,133, 5, 87,165, 82,128, 36,181,101,122, 21, 2, 32, 0, 14, 11,112,
+112,172,135,212,148, 84, 90,169, 84,222,175,244, 13, 74,165,220,241,199,229,243,190,157,187,120, 88,247,235,185, 14,151,175,172,
+134,164,160, 0, 74, 13, 27, 50,165, 6,114, 37, 96,110,233,134,118,205, 91, 32, 61, 93,140,168, 23, 33, 82,150, 74,174,207, 68,
+209,183,187, 87, 77,118,157, 60,103, 41,140,235,116,129, 42,238, 50, 40,105,102,169, 71,203, 72,104, 1,203,218,141,145, 39, 83,
+225,124,112, 24, 80,141, 84, 47, 89, 89, 89,114, 38,147,121,210,215,215,119, 75, 88,216, 75,103, 0, 8, 11, 11, 75,203,200,200,
+ 88,158,149,149, 85, 93,159,116, 73, 52,120,194,200,200, 56,172, 97,195,134,233,109,219,182, 53, 27, 58,116, 40,172,173,173, 17,
+ 17, 17, 1,127,127,255,215, 26,141,102,105, 72, 72, 72,165, 67, 61,106,181, 90, 20,118,229,138,105,247,239,191, 55, 95, 58,112,
+224, 86, 95, 95,223, 29,235,215,175,103,187,186,186, 18, 90,141, 6,209,209,209,244,169,147, 39,181,251, 86,172,216,206, 21, 8,
+ 88,207,255,248,131, 77,170, 84,162,255,239, 70,236,228,228,228,233,209,173,107,227,109,191,238,130, 82, 33,197,179,208,107,144,
+ 72,178,113,240,208,165,198, 78, 78,180,167, 72, 36, 10,209, 87, 0, 31, 59,118,108,113,135,214,173, 91,215,175, 85, 11,209,201,
+ 73,224, 82, 58,112, 72, 18, 76,141, 10, 12, 82,137, 90,205,104, 16, 12, 19,100,124, 44,192,198, 51, 23, 98,244, 17,198,141,190,
+ 27,132,245,105,249, 32, 8, 2,191,116,106, 6,174,137, 16, 28,129, 16,179,255,188, 91, 42, 12, 2,215,175, 0, 87, 40, 68,131,
+ 14,122, 5,132,151,223,187,119,239,101,116,116,116,187,102,205,154, 97,241,226,197,248,240,225, 3, 40,138, 66,102,102,166, 50,
+ 35, 35, 67,148,157,157,253, 1, 69,241,127, 14, 87,209,137,149, 85, 29, 78, 33, 33, 33,165,195, 13,193,193,193,112,116,116,132,
+153,153, 25, 10, 10, 10, 48, 99,198, 12,243, 31,127,252, 17, 0,240,242,229, 75,148, 21, 40,159, 35, 58, 44,110, 91, 94, 33, 45,
+161,165,225, 67,115,201,240,230, 61,188, 83,209,123,192, 36,220, 14,252, 13,119,111,221,129, 37,235, 67, 18, 4,133, 55,114,146,
+114, 10,210,100,174, 7, 26,183,153,202,204,144,221, 58, 48,119,208, 27,166,131, 3,117,126,197,254,130,188,202,108,117,117,117,
+133,157,157, 93,233, 28, 45, 22,139,133, 41, 83,166,128,166,105,125, 69, 86,113, 95, 67,101, 43,149, 74, 59,196,253, 47,128, 0,
+ 0, 32, 0, 73, 68, 65, 84, 35, 35, 35,124,252,248, 17,239,223,191, 71, 66, 66, 66,105,232, 0,138,162,180, 75,150, 44, 97,207,
+157, 59, 23,251,247,239,199,253,251,247, 31, 3, 88, 7, 64,223,151,181,177,163, 70,141, 50, 81,171,213, 56,125,250, 52, 9, 96,
+192,249,243,231, 95,182,107,215,142,213,183,111, 95,147,189,123,247,142, 45,174, 35,189,133,150,169,169, 41, 71,163,209, 96,239,
+222,189, 72, 77, 77,245, 4, 16,247,252,249,243, 3,163, 70,141,218,215,172, 89,179,134, 49, 49, 49,111,165, 82,233,108, 0, 81,
+ 85,145,101,102,102, 78,110,219,182,237,121,138,162,234,244,234,213, 75,240,235,175,191,154,198,199,199,195,217,217, 25, 20, 69,
+ 69,163,154, 41,172,222,190,125, 27,151,145,145,209,184,123,247,238,184,113,227,198,102,157, 78,183, 9,192,150, 89,179,102, 57,
+ 37, 39, 39,163,117,235,214,176,180,180, 68,124,124,124, 97, 70, 70,198, 62, 20,165, 36,170,202,133,155, 8, 96,249,129, 3, 7,
+ 90, 28, 56,112,192,199,210,210,178, 99, 68, 68, 4, 30, 62,124,136,109,219,182,225,199, 31,127, 68,215,174, 93,177,120,241,226,
+ 28, 0, 62, 0,200,196,196, 68,189,226,230,149,120,182, 0,160, 77,155, 54,233,254,254,254,152, 58,117, 42,125,244,232,209,157,
+ 39, 79,158, 92, 48,118,236,216,210, 62,112,226,196,137,244,137, 19, 39, 38,162, 40, 13,211,127, 18, 90,141, 70, 13, 83,203,122,
+144,230,165, 32, 59, 53, 20,124, 19,123,120,247,104, 9,185, 66,141,171,127, 92, 68, 84,116, 36, 24, 12, 6,236,236,107,193,220,
+194, 26,111,222,188, 5, 42, 95,109,172,213,104, 52, 48,177,168, 11,105,126, 42,212, 89, 97, 48, 22,218, 98,210,247, 67, 33, 87,
+104,112,233,242, 69,196,196, 68,129,201,100,194,222,161, 22,204,204,139, 56, 9,186,242, 21,204, 6, 0, 40, 39,158, 86,149, 66,
+139,201,100,222,187,121,243,230,136, 14, 29, 58,176,222,189,123,135,119,239,138, 94,110, 36, 18, 9, 73, 64,119, 33, 43,250,143,
+ 49,149,156,222, 11,197,171, 51,202,230, 46, 20,154,152,136,226, 95,199,217, 73,114, 51, 17, 25,254, 8,239,222, 68, 35, 41, 33,
+ 14, 26,141, 18, 76, 6, 3, 12, 38, 3,117,235, 53,197,163,199,161,106, 37, 73,134, 86,196, 89,100, 71, 66,161,192,214,117,244,
+134,245, 43, 3, 23, 46, 93,107, 60,114,196,126, 68,197,191,130,148,180, 7, 77, 3,246, 86, 2,180,170,191, 12,162,244,108,156,
+249,109,175,156,210,104,198,125, 22, 67,235, 11, 78, 0,176,203, 65,147,125,135,126,155,114, 56,224,212,218,165,115,103,216, 13,
+ 30, 54, 14,220,220, 87,208,166,135,161, 94,187,126, 32,120,230,184, 30,116, 23, 33, 47, 95,101, 82, 58,122,173,157, 24, 71,223,
+ 84,193, 89, 22,121,121,121, 79, 62,126,204,112, 46, 19, 5,222,153,199, 51,170,106,117,220,231,156,159, 68,156,103, 50, 25,109,
+ 54,108,216,160,181,179,179,211,196,196,196, 96,255,254,253, 84, 88, 88, 88, 16,131,193,216,157,145,145,161,172,138,211, 70,171,
+141, 60,229,231,215,164,253,176, 97,244,152,185,115,229,224,241,230,109,253,229, 23,191,108,137,196,145,166, 40,216, 88, 90,166,
+109, 93,177,194,127,196,168, 81,146,216, 71,143,140, 67,175, 92, 49,230,146,100,152, 30,118,126, 11, 84,200, 41, 18,137, 66,238,
+223,127,136,227,135,127,133, 70,163, 66,134, 40, 25, 0,144, 35,206, 71, 21, 34,235,115, 78, 90, 46,151, 15,251,225,199, 31,159,
+254,176,112,129,125,183,158,189,144, 18, 25, 1, 77,110, 54, 8, 45, 9, 54,193,130, 44,139,143,172, 76, 41,150,159, 56,151, 37,
+149,203,135,149,211, 73,148,107,103,137,199,138,103,106, 2,142, 64, 8,174,208,228, 19, 47,150,145,169, 41,184, 2, 33, 88, 92,
+110,121, 19,184,191,224,148, 74,165,195, 71,140, 24, 17,245,252,249,115,139,169, 83,167,162,115,231,206,225, 10,133,194, 11, 64,
+ 97, 77,203,147,162, 40, 81,183,110,221, 24, 4, 65, 8,199,141, 27,199,203,206,206, 46,141,172, 46,149, 74,113,227,198, 13,184,
+187, 23,173,234,143,141,141, 69,211,166, 77, 43,228,156,182, 60, 70, 4, 96,253,194, 17, 78, 91,159, 70,102,204, 3,176,185, 94,
+195, 90,184,123,235, 14, 30,222, 13,245,235,216,140,218,245,221,184,118, 63,241,189, 70, 45,109,220,102, 42, 83,104,234,128,223,
+ 47, 93,100,198,133, 29,217, 40,151, 71, 55,192,254,203, 75, 42,178,147, 32, 8,208, 52,253, 69, 40, 7, 38,147,137,147, 39, 79,
+ 86,247,218,207, 29, 62,124,120,214,204,153, 51, 57, 25, 25, 25,120,253,250, 53,100, 50, 25,140,140,140,112,235,214, 45, 18,192,
+222,147, 39, 79,222, 58,121,242,100, 95, 20,173, 38, 10,174, 78,251, 20, 8, 4,190,222,222,222,120,253,250, 53, 94,188,120,113,
+ 17, 64, 84,120,120,248,197,119,239,222,141,238,218,181, 43,126,251,237, 55, 95,133, 66,113,184, 58,156, 20, 69,149,141,153, 84,
+146,241, 33, 82, 42,149,118, 12, 13, 13,173,110,189,103,136,197,226, 46,197,194, 58,213,206,206,206, 52, 50, 50, 18,181,107,215,
+134, 70,163,233, 80,221,182,148,159,159,255,235,238,221,187,143, 78,158, 60, 25, 63,253,244,211,184,115,231,206,141,251,238,187,
+239,208,191,127,127, 28, 59,118, 12, 81, 81, 81,155,161, 95, 90,177,242,174, 61, 10, 64,148,157,157,221,156, 90,181,106, 97,219,
+182,109,136,142,142,246, 95,191,126,253,138,168,168, 40,184,187,187,243,226,226,226,200,154, 60, 67, 0,192,212,212,212, 84,171,
+213,226,202,149, 43,207, 0, 44, 28, 55,110,156,237,142, 29, 59,124,132, 66, 33,114,115,115, 21, 49, 49, 49, 99, 1,252,241,159,
+126,214,209, 4,177,106,234,180,121, 7,166, 77, 29,107,212,182, 77, 43,200, 11,210,160,144,102, 66, 94,248, 17,187, 15, 7,129,
+ 32, 24,176,177,113,128,173,189, 51,146,147, 83,240,248,218,117,181, 76,174,216,193,213, 82,155, 43,231,156, 91,196,217,186,136,
+ 83, 46,203,130, 66,154, 85,202,105,107,235, 88,204,153,140, 71,161,215,149, 10,153,236, 87, 53, 77,252,252, 55, 95,251, 63, 25,
+213,203,117, 88, 22, 18,137,100,254,140, 25, 51,188,150, 47, 95,110, 69,146, 36,211,210,210, 18,201,201,201,228,133, 11, 23,114,
+165, 82,233,252,154, 88,195, 98,179,163, 92,221,220,189, 6, 15, 30, 76, 14, 26, 52,144, 51,126,114, 95,150,141,173, 45,242,243,
+196,120,243, 58, 2,241,175,194,224,234,222, 18,107,214,111, 7,204,205,171, 76, 36, 89,156, 86,103,192,186, 31,150,156,237,226,
+217,199,212,189,105, 75, 78,171, 6,102,208,104, 73,164,165,165,225,143, 43,145,154,152,151, 15, 11, 40, 82, 61, 90,158,163, 95,
+ 10,158, 16,128,132, 24, 7,155,217,106, 78,110,218,186,123,241,222,131,199,151, 46,159, 55, 85,208,213,163, 55,162,239,252,134,
+139,129,103,101, 74,149,122, 43,135,137, 95, 98,196,144,191,169,102, 25, 40,149, 74,205,231,253,169, 82,169,212,124,109, 77, 31,
+ 59,118, 12,153,153,153,234, 15, 31, 62,220, 36, 73,242, 92, 37,201,158,191,192,110, 64, 61, 84,165,186,243,131,135, 71,223, 31,
+110,221, 50,154,184,108,153,122,220,248,241, 75,160, 82,105,192,229,210, 44,129,128, 1, 30,143, 29,251,232,145,241,206, 89,179,
+ 44, 9,181,250,246,241, 74,194, 6,148,131,111,190,234,176,196,163,213,189,123, 87, 76,156,186, 16,138, 50, 30,173, 39, 47,222,
+ 64,165,129,222, 30,173, 98,164,124, 72, 77,237, 56,111,213, 15,151, 70,123,247,108,220,172, 78, 93,158,141, 75, 93, 8,237,237,
+ 33,206,206,198,163, 23,241,218,245,103, 47,197, 20,139, 44,189,226,202, 80, 20, 85, 52,201, 29, 64,207,249,203, 65, 48,153, 64,
+113, 24,135,146,149, 67, 46,237, 58,131, 96,177,160,163, 41,168, 84, 42,125, 38,253,165,189,127,255,126,248,184,113,227,130, 3,
+ 3, 3, 25,222,222,222,173, 46, 95,190, 76,125, 77,219, 81, 40, 20, 29, 1,192,200,200, 40,201,220,220,220,105,242,228,201,208,
+106,181,144,203,229,200,207,207, 71, 90, 90, 90,222,228,201,147, 53, 0, 96,108,108,204, 29, 49, 98,132,105, 85,156,219, 47,136,
+148, 11, 71, 56,237,178,100,125,240, 41,200,137,114,177,100,125, 72,234,216,140,218,181,253,130, 72,105,234, 40,219,144,243, 33,
+228, 77,134,236,214,129,223, 47, 93,100, 78, 24, 58, 92,231, 44,124,235,103,100, 75, 95,168,138,151, 32,136, 47,130,147,234, 41,
+178, 62, 65, 97, 97,225,138,213,171, 87,247,151, 72, 36,206,125,251,246,229, 52,110,220, 24, 79,159, 62, 69, 96, 96, 32,249,228,
+201,147, 84,153, 76,182, 18,128, 18, 64, 80, 77,202,212,205,205,205,133,197, 98,149, 12,165,237, 41,254,120,207,229,203,151, 71,
+ 79,157, 58, 21,117,235,214,109, 18, 23, 23,199, 67, 53,238, 35,154,166, 75, 71, 25,190, 37, 8,130, 72,216,185,115,167,147,189,
+189, 61,113,227,198, 13,146,201,100,214,196,115,115,236,200,145, 35, 29,180, 90,237,180,233,211,167,195,211,211, 19, 36, 73,226,
+196,137, 19, 56,114,228,136,190, 34,171, 82,188,121,243, 38, 44, 53, 53,181,219,146, 37, 75,176,109,219,182, 21, 75,150, 44, 65,
+106,106, 42,222,188,121, 19,241, 53,188, 5, 5, 5,138,148,148, 20,126,167, 78,157,218,198,196,196,196,120,121,121, 53,157, 58,
+117, 42, 54,111,222, 76,223,191,127,127, 4,128, 27,255, 31,189,119,252,187,220, 0,182,142,117,107,253,134, 95,127,108, 80,223,
+101,230,148, 73,163,152,110,174, 77, 33,203, 79,131,149,181, 29,156,107,213, 67,118, 86, 14,110,222,188,161,203,201,201, 59,166,
+ 99, 16,235,222,189,203, 77,255, 26, 78, 39,231,122,200,202,202,194,245,235,215,117,121,146,130, 67,208, 50,214,199, 37,231,101,
+194, 0,125, 60, 89,211, 81, 73,148,248,202, 96,109, 97, 97,113,218,212,212, 52,211,212,212, 52,211,194,194,226, 52,160,215,234,
+131, 94,101,158, 14,204, 79,182, 17, 35,140, 96,100,212, 17, 44,214, 34,115, 11,139, 27,102,102,102,226,238,221,187,171, 15, 28,
+ 56,160,140,139,139,165, 68,162, 84,218,204,204, 44,191,244,248,242, 56, 63,131,133, 69,125, 19,129, 67,211, 31,205,156, 91, 61,
+ 18, 58, 52, 41, 20, 58, 52, 41, 52,115,110,249, 88,224,208,100,173,133, 69,125, 19,189,236,172, 0,245,108, 97,227,106,141,189,
+238, 54,132,194,213, 26,123,235,217,194, 70,239,107,175,124,216, 79, 71, 16,208,161,104, 25, 54,106,192, 89,194, 65, 49,153,204,
+227,206,206,206, 14,168, 94,192,186, 47, 56,199, 3,117,199,243,120,211,206,251,249, 77, 76,186,127,127, 92, 65, 98,226,152,252,
+132,132, 81, 17,103,207,142,222, 51,122,244,248, 49, 60,222,244, 17, 64,125,125, 57, 29, 28, 28,252,195,194,194, 2,245,221,202,
+ 8, 47,189,203,179,126, 61,167, 91,222,189, 58,208,190, 51,134,209,190, 51,134,209,222,189, 58,208,245,235, 57,221,250,138, 58,
+ 34,152, 76,166, 15,159,207, 63, 45,224,243,163, 5,124,126, 52,159,207, 63,205,100, 50,125, 80,249, 28,170, 79, 56,173,172,172,
+ 94,218,217,217,101, 86,103,179,182,182, 14,175,134,157, 99, 92, 92, 92, 82, 25, 12,198,246,106,222,211,149,113,186, 26, 27, 27,
+ 39, 8, 4,130,180,178,155,177,177,113,217,192, 80, 86,124, 62,255,170, 64, 32,216,161, 15,231,207,171,154,254,248, 56,104, 78,
+212,207,171,154,254,248,249,119,115,135, 88, 76,126, 26,188, 78, 60,119,136,197,100,125,236,180,181,181,189,111,107,107,155, 97,
+107,107,155, 97,103,103, 87,233,102,109,109,253, 82, 15, 78, 35, 19, 19,147, 29, 38, 38, 38,153, 2,129, 64, 39, 20, 10, 51, 5,
+ 2,193,118,148, 9,109, 81,211,242,100, 48, 24,155,155, 52,105,162,100, 50,153, 71, 63,251,106, 91,131, 6, 13,148, 44, 22,107,
+107, 53, 57, 77,187,118,237,170,139,140,140,164, 61, 61, 61,105, 0, 22,223,176,222,237, 45, 44, 44,110,152,154,154,166,152,152,
+152,236, 6, 32,168, 33, 39, 1,192,199,201,201, 41,162, 71,143, 30,114, 39, 39,167, 80, 0,131,191,161,157,253,135, 12, 25, 66,
+165,164,164,208, 52, 77,211, 41, 41, 41,244,144, 33, 67, 40, 20, 5,138,252,154,103,242,170, 89,179,102,209, 79,158, 60,161,159,
+ 60,121, 66,135,134,134,210,253,251,247,167, 0,124,255,149,207,121,124,171,107,111, 92,207,186,126,163,134, 22,231,198, 14,247,
+160,130,254,216, 78,175, 89, 57,147,238,237,217,148,118,111, 96,113,201,213,213,202,245, 91,112,254,184,114, 6,221,171, 91, 19,
+170,113,125,139,179,141,235, 89,215,255, 15, 95,251,191,209,171,133,191,123,194,217, 95,174,197, 79,197, 82,249,112,116,116,132,
+ 88,220,193,136,197,242,224,241,120, 94, 12, 38,243, 94,110,118,246,130,226,215, 45,221,127,202, 85, 91,105,135, 94, 31,220, 74,
+ 82, 18,212,132,243,147,137,236, 53,228,172, 14,135, 94,156, 21, 37,149,166, 84,170,116, 43,146,124,185, 27,149,150,193, 39,156,
+ 78, 78, 78,211, 40,138,114,209,215, 32, 6,131,145, 36, 18,137, 14,215,164, 60, 27, 54,108, 72, 23, 15,111, 19,223,178,222,255,
+142,182,244,191,196,249,251,175,205, 29,221,155, 55, 90, 26, 29, 22,183,173,120, 88,177, 20,107,231, 90,152,120,244,232,190,250,
+209,221,251, 63,173,221, 45, 41,252,127,190,118, 6,244,156,211,246, 13, 56, 75,130,132, 86,139,147,205,102, 31,104,223,190,253,
+180,167, 79,159, 30,213,233,116,211,255, 71,219,103,127, 38,147,185,196,205,205,173,213,155, 55,111, 34,116, 58,221, 54,148, 19,
+ 40,178, 6,118,174,116,113,113,153,205,225,112,120, 82,169, 84,146,158,158,190, 26,192,185,255,182,242,108,220,208,178, 45, 77,
+151, 6,221,222,248,250,125,238,243,111,198, 73, 83, 58,138,102,110,120,147, 40, 14,255,127,168,247,127,155,200, 58,244,159,248,
+225, 94, 6, 78, 3,167,129,211,192,105,224,252,230,156,198,134,242, 52,112,254, 11, 57,255,149, 96, 25,138,192, 0, 3, 12, 48,
+224, 31, 7,133,161, 8, 12, 48,224,191, 14,101,189, 90,165,222, 44,162, 18, 85, 90, 29,151, 96, 77,148,237, 29, 3,167,129,211,
+192,105,224, 52,112, 26, 56, 13,156,255,115,156,255, 86,145,117,168,146,253,191, 13, 6,183,170,129,211,192,105,224, 52,112, 26,
+ 56, 13,156, 6,206,255, 5,161, 85,238,190, 97,232,208,128,191, 29,187,134,194, 9, 0,230, 93,134,232,239, 56,222, 0, 3, 12,
+ 48,192, 0, 3,254,159,113, 8, 21, 12, 29,254, 55, 8, 45, 71, 0, 29, 81,148,248, 54, 30,192, 67, 0,146,175,224,179, 6, 48,
+138, 32,136,145, 0, 64,211,244,121, 20,173, 26,201,209,231,100, 35, 35,163, 76,165, 82,105, 91,252,127,150, 82,169, 44,155,203,
+128,192,151,171,217,232, 50, 91,185,112,113,113,201, 84,169, 84,182,122,252,124, 62, 77,211, 81, 12, 6, 35, 90, 40, 20,222,125,
+243,230, 77, 96,117, 46,220,203,203,107, 34,147,201,220, 8, 0, 58,157,110,213,189,123,247,142,255,141,245,214,161,150,163,253,
+111, 26,173,134,204,204,206, 93,141, 47, 3,249, 1, 0,246, 14,128, 63, 65, 98,105,241,255, 91,231, 4, 86, 30, 71,167,186,199,
+ 87,130,182,108, 54,219,215,206,206,174, 95, 90, 90,218, 75, 0,203,128,170,163, 26,215,170, 85,235,123, 22,139, 53, 78,167,211,
+213,103, 50,153, 9, 36, 73,158, 76, 77, 77, 13, 48, 60, 67, 12, 48,192, 0, 3, 12,208, 67,108,125,129,106, 9, 45,119, 43,216,
+211,128, 15, 8,244, 6,141,219, 4,112, 38, 94,140,143,250,158,255,157, 59,180, 90,178,232, 55, 57, 12,232,110,188,103, 28,234,
+215,175,159,243,220,185,115,209,185,115,103, 60,125,250,180,211,177, 99,199, 38,159, 59,119, 46,138,162,168,123, 0,158, 2,122,
+133, 82, 16,160, 40, 78,203,216,126,253,250,245,218,184,113, 35,179,105,211,166, 80, 40, 20,184,127,255,190,199,214,173, 91,119,
+ 60,126,252,248, 14,128, 83,197,130,160,194, 4,120, 74,165,210,182, 36, 25, 39, 65, 16,182, 35, 70,140,120, 94, 86, 92, 21,231,
+ 87, 35,104,154,126, 66, 16, 68,168, 78,167,123,122,225,194,133, 84,119,160,195, 12, 23,206,133, 5, 73, 26,231,207, 57, 85, 42,
+149,237,149,159, 55,129,197,227, 65, 85, 88,128, 78,147,254, 18,189,183,127, 92, 10,130, 34,193, 4, 45,241,218,176, 35, 10, 64,
+116,122,122,122,148,167,167,103, 82,117,107,152,201,100,110,188,121,243,166, 3, 77,211,240,246,246,222, 8,224,239, 18, 90,188,
+142,109, 91,222,187,122,241,180,145, 52, 55, 19,125, 7,143, 62,249, 54, 53,107, 34,128,139,159,136,166,126,176, 35, 8, 44,157,
+181,233, 20, 19, 0,246,173, 28,187,108,123, 31,236, 90, 24,132,143, 0,188,138,197, 15, 0,252, 12,224,222,222,126,176, 3,176,
+124,214,166, 83, 4, 0,236, 95, 57,118,233,222,126,216, 57,231, 70,181,195, 86,204,158, 56,113,226,174,141, 27, 55, 50, 29, 28,
+ 28, 32, 18,137,250, 54,105,210,196,173,160,160,160, 9, 42,153, 68, 92,183,110,221,179, 93,123, 12,172, 55,108,164, 15,223,198,
+218, 2,233, 25, 57,166,103, 79, 31,157,193,124,114,191,223,135, 15, 31, 70, 27,158, 33, 6, 24, 96,128, 1, 6, 84,128,154, 71,
+134,111,237, 0, 99,153, 6, 67, 88, 76,226,251, 46,109,155,244, 28,243, 93, 87, 70,147,198, 13,241, 42, 54,174,207, 31,119,159,
+109,101,132,198, 6,147, 58, 58, 64,192,193,149,240,140,202, 87,194,104, 73,176,130,174,156, 42,234, 9, 39,143,101, 62,127,254,
+188, 97,155, 54,109, 74, 83,195,244,236,217, 19, 61,123,246, 36,246,237,219,215, 50, 40, 40,168,229,145, 35, 71, 52,193,193,193,
+191,161,242,248, 40,190, 13, 26, 52,216,186,107,215, 46,158,167,167, 39,120, 60, 94,233, 23, 66,161, 16, 3, 7, 14,196,192,129,
+ 3,153,233,233,233,222, 87,175, 94,245,254,249,231,159,213,201,201,201, 75,240, 87,148,230, 74,177,122,245,234,182,229,124,124,
+147, 32,136,247, 36, 73, 70,180,108,217, 50,213, 13,104, 56,227,187,206,183,103,119,113, 21, 44, 88,113,172, 92, 30, 22,151,139,
+223, 39, 22,245,213,101,133, 86,210,221, 27, 16,154,154,136,249, 38, 38, 81, 0,162, 1, 68,209, 52, 29,157,144,144, 16,215, 8,
+104,217,209,130,241,219, 81, 9,213,162, 26, 98, 11,169,169,169, 48, 51, 51, 51,246,244,244,204, 32, 8, 98,237,253,251,247,191,
+245,132,188, 14,107,151,206,230, 72, 62, 68,225,227,235, 39, 88, 52,210,131,191, 96,247,159, 63, 41,213,218,139,149,157, 68, 16,
+ 12,198,207,161,148, 31,138,146,241,174, 22,139,197,158, 0, 96,101,101,197, 5,112,111,251, 51,124,183,176, 11,241, 53,177,221,
+ 56, 76, 38,115,239,177, 99,199,166,126,255,253,247, 69,169, 35, 30, 61,130, 80, 40,196,250,245,235,235, 46, 94,188,216,159, 36,
+201,249, 21,121,178,186,246, 24, 88,111,231,182,159,154, 20,230,230,171, 14,238, 61,247,194,177,153, 59, 99,150,239, 98,147,157,
+ 26,149,189, 78,167,251,222,224,217, 50,192, 0, 3, 12, 48,160, 58,222,172, 42,133,150,155, 53,142,183,110,230, 58,106, 76,127,
+ 15, 94,243,102, 77,193,225,253, 21,186,165, 77,219,182,104,211,182, 45,195, 79, 90,216,251,249,139,176,222, 23,130,158,170,228,
+218,228,115,111,114, 48, 81, 95,171, 74,146,210,110, 28,108,215, 67,150,151,101, 4, 0, 2,115, 91,229,202, 43, 31,239,118,233,
+210, 5,206,206,206,156,224,224,224, 41, 85, 8,173,149,241,241,241, 60, 38,179,242,120,168,142,142,142, 24, 49, 98, 4,220,221,
+221,185,221,187,119, 95, 89,145,208, 50, 50, 50,202, 34, 8,194, 22, 0, 44, 45, 45,117,107,215,174,141,160,139, 0, 0, 52, 77,
+211, 79, 24, 12,198, 83,138,162,158,253,249,231,159,105, 77, 0,219,190,109,220, 31,206, 30, 63,130, 79, 95,216, 81,161, 72, 80,
+ 22, 20,148,251, 57, 95, 40,200, 54, 22, 8,162,120,124,163,104, 20,229,242,138,118,118,118,142,107, 2, 56,183,119,119, 9,218,
+183,112,172,201,209,233, 63, 85, 89,150,173, 91,183,118,107,209,162,133,145, 78,167,131, 76, 38,195,254,253,251,205,140,141,141,
+205,250,245,235,183,166,108, 3,104, 12, 52, 31,238,200,156,190, 46, 93, 55,167, 6, 13,201,188,107,167,182, 31, 70, 12,236,103,
+218,182, 99, 87,188,189,119, 2,185,185,133,200,207,147,130,162,168, 47,226,250,204,185,129,204,189, 3,176,117,223,138,177,203,
+ 9, 6,131,104, 57,116, 25, 6,217,231,207, 59,112,224, 64, 44, 0, 54,151,203, 45,219, 14, 29,141,157,154,109,109,216,167, 43,
+246,175, 26, 15,154,162,104, 0, 91,171,225,205,178, 53, 49, 49,249, 35, 40, 40,168, 67,187,118,237,240,244,233, 83, 36, 38, 38,
+ 98,246,236,217,234, 57,115,230,112, 38, 76,152, 64, 44, 90,180,104,238,207, 63,255,124, 1,192,227, 47,110, 4, 22,107,220,224,
+ 97,163,185,210,188, 2,165, 90,165, 81, 91, 90,155, 83, 42,153, 82,158, 35, 41, 80,142, 30, 59, 77, 29, 27,254,108, 28,128, 47,
+132,214, 87,150,167, 1, 6, 24, 96,128, 1,122,128,166,233,118, 0,108, 0,100, 19, 4,241,162,236,126,241, 33, 37,217, 90, 62,
+223,207, 65,209,168,148, 85, 25,186, 28, 20, 77,247,177, 1,160, 3,240,156, 32, 8,201, 87,154, 88,249, 42,195,192,192, 64,186,
+236,223, 50, 66,139,166,105,154,214,138,223,211,170, 55, 55,104,249,139,195, 95,108,138,216,139,116,198,243,115,244,179, 83, 63,
+210,110,214,149,103, 97,255,206, 29,218,177, 45, 64,207,106, 7,122,126,119,115,229,243,231,207,131, 41,138, 10,244,235, 10,154,
+126,117,138,166, 95,157,162, 23,118, 2,125,225,194,133,155,254,254,254,129, 1, 1, 1,129, 0,170,154,167,148, 89,248, 34,148,
+126,102, 11,186, 34,196,199,199,211, 7, 14, 28,160, 87,172, 88, 65, 31, 61,122,148, 70, 21, 17,212,189,189,189,239,199,196,196,
+208, 19, 38, 76,136, 64, 37,129, 1, 27, 3,130,113,117,237, 95,171,206,238,208,168,191,111, 78, 75,186, 25,149,123,253, 14, 14,
+ 14,159,216,179,217,213,158,222,211,222,149, 62,222,187,205, 71,154,166,111,210, 52,189,153,166,233,209, 52, 77,187, 3, 64,107,
+192,116,176,131,213, 59,229,185,157, 10,245,244,142, 85,230,189,107,221,186,181,219,146, 37, 75,114,213,106, 53,157,148,148, 68,
+ 31, 60,120,144,190,125,251, 54,125,229,202, 21,218,195,195, 35,189,140,189,118,147,221,235,100,170,143,172, 83,213,164, 21,177,
+153,204, 61, 47,110, 95,160,223, 61, 60, 79, 63, 63,227, 79,159,252, 97, 12, 61,119,112, 7,141,169, 49, 79, 9,160, 71, 69,231,
+205,233,130,134,238,117,109,222, 36, 39, 39,211, 26,141,134,158, 52,105, 18,237,237,237, 77,247,233,211,135,238,213,171, 23,221,
+179,103, 79,186, 71,143, 30,244,221,187,119,233,244,244,116,186, 87,215, 54,178, 1,141,209,182, 26,166, 53,171, 83,167,206,199,
+164,164, 36, 90,163,209,208,193,193,193,244,137, 19, 39,232,224,224, 96,218,207,207,143, 6,112,124,214,172, 89, 10,137, 68, 66,
+123,123,123,167,161,156,168,241,117,234,212,137,139,121,147,154,186,125,211,225,187,191,239, 57,125,247,210,133,219,119,255,184,
+245,252,218,149, 91, 47,206, 61,139, 76,184, 82,167, 78,157,184,114,234,255,171,202,211, 0, 3, 12, 48,192,128,170,181, 72,177,
+208,234, 95,236,236,232, 79,211,116,175,207,246,251, 23, 11,167, 47,246,253,252,252, 86,148,221, 47, 57,198,207,207,111, 5, 0,
+186, 83,167, 78,167,105,154,110,248, 13,204,159, 94,206, 86,181, 71,171, 4,100,218,115,112, 92,251,129,173,211, 66,155, 19, 15,
+ 42, 47, 25, 16,216, 67, 65, 8, 33,206, 72,198,235,135, 23, 43, 79, 36, 81,140,235,241, 96, 3, 8,142,139,139,195,235,215,175,
+145,154,154, 10, 62,159,255,197,113,143, 30, 61,130,177,177, 49, 28, 28, 28,244, 83,186,234, 79,251,185,168, 54,117, 32,236,228,
+137,156, 49, 51, 17, 28, 28,140,172,172, 44,112, 56, 28,112,185, 92,144, 36, 89, 37, 31,131, 81,148,241,183,196,139, 85,222, 49,
+158, 0,139,103, 41,188,186,111,205,124, 23,198,147, 64,182, 34,229, 29,210,149, 58,253, 60,121, 66, 1,248, 2,126,134,177, 49,
+191,116,184, 16, 64, 52, 65, 16,111, 91, 3,108,129,208,232,234,111, 27, 22,217, 51,195,131,141, 20,239,162,202,229,232,213,171,
+215, 12, 0,107,104,154,206,107,209,162,133,221,198,141, 27, 45, 68, 34, 17, 94,189,122,133,115,231,206,101,147, 69, 23, 74,208,
+ 52,189, 14, 0, 58, 2, 70,230, 54,230,183,246,252, 56,223, 4,247,206,114,107,210,138,204, 26, 15,188, 54,124,194,172, 57,187,
+230, 15,132,172, 80,129, 83,183,195,113, 51,236,253, 32, 0,143, 80,201,188,183,189,143,241, 14,200,238, 57,108,216,176,136, 7,
+ 15, 30, 88, 31, 57,114, 4, 36, 73,150,187, 29, 57,114, 4,119, 30,134,205, 3,240, 82, 79,179, 28, 93, 92, 92,238, 60,123,246,
+204,134,207,231,227,246,237,219,200,203,203, 43,245,100, 77,156, 56,145,200,203,203,243,217,191,127,255,240, 15, 31, 62,108,123,
+248,240,161, 24, 69,185, 32, 63,105, 8, 76, 38,243, 61, 73,106, 26, 57, 52,110,200, 26, 57,176,107, 87,169, 56, 10, 66,171, 22,
+120, 18,249,254,106,158, 68,172, 96, 50,153,239,203, 30,255, 45,202,211, 0, 3, 12, 48,192,128,234,129, 32,136, 64,154,166, 7,
+ 16, 4, 17,248,249,103,159,255, 95,114,156,191,191,127,233,126,201, 57,155, 55,111,222, 84,102, 95,254,141,204,171,116, 50,124,
+247, 98, 5,217,189,188,131, 84,175, 46, 65,245,250, 15,112,234,116, 1,215,125, 16,152,117, 60,144, 18,117, 15,145, 55,182, 35,
+ 45,246, 17,104, 74, 7, 7,183,246,250, 26,162,108,212,168, 17,148,202,162,169, 89, 42,149, 10, 28,129,133,114,209,244,177, 70,
+ 0, 64,177,140, 84,101, 20,172, 94,132, 38, 93,188,208, 62,147,198,115,187, 34, 71, 69,251,204,162,243, 54, 76,154, 4, 14,135,
+ 3, 14,135, 3,162,120,234,143, 62, 66,139, 40, 62,152, 42, 26,190, 42,207, 8, 66,206, 99,159, 58,179,198,183, 61,239, 67, 52,
+ 87, 21,243, 4,233, 42,138,190,154,169,187,166,143,189,124, 1, 95,100,204,231, 71, 27, 11, 5,165, 66,139, 32,136,247, 0, 64,
+179,217, 1, 39,214,249,182, 16,100, 38, 8,148, 47,130,145,161,164, 52, 21,208,172,187,113,227,134, 45,139,197,178,215,233,116,
+ 72, 73, 73, 65,108,108, 44,118,238,220,153, 89, 88, 88,216, 61, 60, 60,252, 77, 89,237,168, 51,230,158, 11, 88, 63,191, 30, 43,
+ 42,196, 72,245, 62,166,218,173,199,186,217, 16,239, 65,221, 91, 94,155, 49,126, 21,134,124,215, 7, 19,186, 55,161,147,210,115,
+149, 0,110, 23,187, 94,171,130, 40, 60, 60,188,119,183,110,221, 78,182,106,213,170, 49, 77,211,104,222,188, 57,124,124,124, 16,
+ 16, 16,128,200,200, 72, 20, 20, 20,104,130,130,130,118, 0, 56,166,167, 89,124, 11, 11,139,155,119,239,222,181,225,243,249, 8,
+ 10, 10,130, 66,161,128,131,131, 3,230,204,153,195,221,188,121,243,239, 5, 5, 5, 35,253,253,253,141,146,146,146,246,220,186,
+117,171, 46,138,242,206,125,209, 8,212,106,245,161, 83, 1,199,119,205,241,157,235,116,247,233,171, 96,149,180,208,172, 78,157,
+212, 2, 27, 11,161,201,142, 45,235,106,171,213,234, 25,229,151,231,253, 26,149,167, 1, 6, 24, 96,128, 1, 95,160, 82, 45, 82,
+ 86, 60,125, 46,182,170, 35,210, 0, 40,252,252,252, 86, 18, 4, 17,232,231,231,183,210,223,223, 95, 1, 32,253,239, 16, 89,165,
+ 66,107,192,128, 1, 33,129,129,129, 24, 48, 96, 64, 72,133, 20,148, 14,154,164, 7,208, 36, 61,128,113,167,121,248,211,127,204,
+103, 23, 79,213,216,186,129,235,111,223, 85,169, 84,172,227,199,143,151,206,219, 2, 0,157, 78,247,205,107,177, 58, 66,171, 88,
+232,125, 97,132, 11, 79, 24,114,104,225,200,142, 86, 58, 57, 91,253,232, 42, 68, 42,138,220,246, 78, 35,127,145, 71,255, 92, 17,
+231,149, 5, 51,144,250,240, 14,248, 66, 97,234,212, 7,209,165, 94,172, 98,145,149, 8, 0,117,121, 38,193, 7,230, 15,241,176,
+231,128,163,190,118, 30,233, 42, 74,117,224,131,246, 88, 5,141, 13, 52, 77, 35, 49, 49, 17,114,185, 28,161,161,161,184,120,241,
+ 98,118, 57, 34, 11, 46, 60,225,253,163,203,198,117, 48, 45,252,200, 81,191,184,131,116, 21,165,215, 80,151,117,243, 33, 93, 56,
+ 12, 34,136, 96, 48,141,123,118,116,195,130,105, 67,177,253,232,159,164,218,182,235,128, 93,127, 92, 31, 37, 85,105, 86,234, 41,
+178, 74,157,141,225,225,225, 77,194,195,195,121, 0,188,124,124,124,174, 15, 31, 62, 28, 33, 33, 33,184,122,245,170, 43,128,140,
+226,227,214,163, 40, 81,246,207, 0, 18, 42,114, 60,114, 56,156, 51,119,238,220,105,234,232,232,136, 59,119,238, 64,161, 80, 96,
+214,172, 89,106, 95, 95, 95,206,196,137, 19,137,252,252,252, 82, 79, 86,104,104,168,184, 34,145, 5, 0, 34,145,232,198,197,115,
+ 39, 58,119,235,214,109,104, 61, 87,119,211,132,194,130, 44, 62,223,200,248, 97,200, 61,206,139,103,143,247,136, 68,162,231,229,
+151,103,176,222,229,105,128, 1, 6, 24, 96, 64,197,208, 75,139,124,230,153,170, 14,202,156,199,246,247,247,143,245,247,247,255,
+196,227,245,149,248,124,213,225,181,146, 62,173, 70,113,180,116,249, 41, 95, 94, 0, 69, 85,231, 98,191,248,204,194,194,130, 52,
+ 54, 54,254, 68,104, 81,122,114,230, 94, 62,141,132,217, 99, 75, 61, 89, 37,158, 45,244,157,248, 85, 66,139,162,168, 80, 0,159,
+ 24,193,183,117, 27,179, 99, 96,227, 46, 77,234, 57, 49,180,231,118, 34, 77, 78, 42,215,196,107,148,175, 11,233, 65,113,229, 76,
+178, 46,229, 36,181, 48, 18, 24, 39, 27, 11, 5,159,139,172, 15, 0, 32,176,115, 29,190,173,159,123,247,150,238, 13, 24,228,217,
+ 95, 33,146,107,165,126,113, 26, 77,130,140,190, 84, 65, 25,174,233,211,167,207, 26, 43, 43, 43,163, 93,187,118,153,213,169, 83,
+ 7, 36, 73,170, 63, 23, 89,124, 91,183, 49, 59,135, 52,235,226,102,111,193,208, 94,216,141, 84,133, 78,190, 51, 65,251,187, 62,
+ 34,203,218, 76,120,235,192,166,217,198,124, 30, 27, 74,165, 18,155,247, 93, 64,208,227,152, 1, 57, 49, 87,110, 1,184,245, 21,
+ 13,114,234,128, 1, 3,182,175, 95,191, 30, 90,173, 22, 83,166, 76,193,251,247,239,131,226,227,227,119,214,174, 93,123,201,178,
+101,203, 28,237,237,237, 49,106,212, 40,142, 86,171,157, 88, 1,199,150, 83,167, 78, 13,104,217,178, 37, 66, 66, 66,144,151,151,
+ 7, 7, 7, 7,248,250,250,114,253,253,253,127, 47, 40, 40, 24,185,105,211, 38,163,196,196,196, 74, 61, 89,159,180,107,157,110,
+195,193,237,179,151,180,235,232,193,120,247,238, 13,153,210,222,147,113,239,206,213, 7, 86, 86, 86,191,167,164,164,252, 85,158,
+ 67,155, 87,187, 60, 13, 48,192, 0, 3, 12,248, 54, 32, 8,226, 90,241,188,171, 79,188, 92,159,139,176, 18,143, 85,217,253,207,
+143, 47,254,254, 91,188, 44, 31, 42, 71,120,125, 26,222, 97,192,128, 1,122, 47,171,167,100,217,122,137,167,207,241,157, 59,180,
+ 78, 66,176, 86,122, 50,192, 17, 88, 40, 7,174,191,125,183,162, 99, 5, 2,129,222, 30, 45, 74,165,172,170, 82,170, 37,180,138,
+231,104,221,164,105,250, 19,161,101,102,231,230,185,124,217,252, 29, 30,195,251, 50, 50,167,117, 66,158, 84,165, 90,246,138,164,
+210,228,149,139,172,162, 94, 92,155,196, 23, 8,163,141, 4,252,178, 34, 43, 5, 0,140,108, 27,180, 95,186, 96,206,190, 30, 99,
+ 6, 18,217,179, 60, 32,201, 83,168,150,196,146,132, 72, 65,143,140, 3,238,149, 71,119,247,238,221,131, 0, 14,122,122,122,102,
+ 10, 4, 2, 72,165,210, 47,234,160,196,222, 46,195,251, 50, 50,167,118, 64,174, 76,163, 90, 22, 75, 34, 93, 65,157,169, 74,100,
+217,152,155,220, 58,176,113, 54, 63, 61,237, 3, 56, 28, 14,132, 66, 33,110, 63,138, 70, 78,236, 31, 95, 35,176,192, 96, 48,214,
+250,249,249,173,153, 51,103, 14,196, 98, 49,174, 94,189,138,239,190,251, 14,167, 79,159,174,115,253,250,245,237, 94, 94, 94, 96,
+ 50,153, 8, 12, 12,132, 86,171,125, 91, 1,205,208,233,211,167, 47, 25, 62,124, 56,158, 63,127,142,140,140,140, 79, 60, 89,121,
+121,121, 62,251,246,237, 27,158,148,148, 84,165, 39,235, 51,180,119,105,208,154,179, 98,245, 47, 80,201,179, 88,217,162,167, 33,
+193,183, 25, 79,114,115,115,249, 0,242,107, 90,158, 6, 24, 96,128, 1, 6,232,237,213,170, 72,139,100, 23,139,168,236,242,246,
+203, 8,172,242,246,137,207,188, 96,234,207,190,143,252, 59,175, 73, 47,143, 22,203,174, 25,200,204,152, 50, 66, 43,235,147,239,
+141, 76, 44,245, 26, 58,212,146, 96, 29, 56, 86, 26, 71,203, 72, 44, 22, 27, 89, 91, 91, 43,203, 10, 4, 62,159, 15, 71, 71, 71,
+ 72, 36, 18, 28, 58,116, 8,168,122, 82, 52,105, 58,124, 60,218,143,153,130, 23,206, 92,208, 90, 77,169,103,235,192,164, 73,159,
+136, 45, 14,135, 83, 50, 55,172,170, 78,247, 89,177,167,233, 9, 0,186,181,107,189,159,140, 4,130, 73, 70,214,181,172, 23,204,
+158,202, 78,202, 82,225,174,199,138,188, 11, 91,150, 11, 83,105,225,156, 20,228, 63,174,130, 47, 97,240,254, 19,159,123,178,210,
+ 90,185,214, 91,101,196, 55,154,198,181,172,107,239,183,104, 54, 59, 41, 83, 69,220,109,191,172,224,226,207,203,248,137, 48, 89,
+146,134,188,123,122, 84,207,154,239,190,251,110, 13, 77,211, 52, 69, 81,171, 1,160,172,189,139,124,167,177, 19, 62, 42, 17,236,
+177, 74,114,113,203,114,147, 84, 84,110,175,117,243, 33, 93,236, 44, 76,111, 29,216, 52,135,159, 33, 74, 6,143,199,131,137,137,
+ 9, 82, 51,243,193,102, 49, 21, 95,217,222,120, 93,187,118, 93, 62,123,246,108, 68, 71, 71, 99,214,172, 89, 25, 41, 41, 41,151,
+206,158, 61, 59,235,199, 31,127,100,121,123,123, 35, 35, 35, 3, 91,183,110,213, 62,122,244,104, 19,128,173,229,182, 71, 22,107,
+234, 79, 63,253, 68,167,167,167, 19,137,137,137,112,112,112,192,220,185,115,185,155, 54,109, 42,157,147, 85, 29, 79, 86, 9, 68,
+ 34, 81, 72,208,157, 39, 24,116, 99, 7, 72,173, 42, 36, 79,156,242,224,117,130, 36,196,146,203, 93,236,212,186,121,141,202,211,
+ 0, 3, 12, 48,192,128,111,226,197,122, 81,217,254,127, 1,202, 27, 58,212, 75,104,189,221,189,106,178,235,228, 57, 75, 97, 92,
+167, 11, 84,113,151, 65, 73, 51, 75, 61, 90, 70, 66, 11, 88,214,110,140, 60,153, 10,231,131,195, 0,224,109,117,172, 42, 44, 44,
+ 68,155, 54,109,176,119,162, 91, 15,101,161,216,200, 24,128,138,103,170,188,194,237,122,247,250,245,235,114,138,162,206, 0,184,
+ 94, 5,205,218,166, 77,155,238,249,229,151, 95,184,141,199, 76,134,244,233,195,207, 61, 40, 48, 54, 54, 6,143,199, 67, 84, 84,
+ 20,238,222,189,171, 6,176,182,138, 10,125, 70,146,100,228,217,179,103,211, 26,214,115,234,219,166, 85,139,121, 43, 87,248,153,
+188,122, 24,132,213,155,246, 80, 13,219,122,231,111, 62,125,165, 48, 95, 88,187,167, 34, 35, 62, 66,143, 75,141,252, 76,100,165,
+ 55,114,169,213,163, 85,179,166, 75, 87,175, 94,101, 26,251,240, 54,126,252,249, 0,237,218,178, 87,254,207, 23,255, 40,200,225,
+215,237,163,204,122,253, 92,159, 50, 12, 9, 9, 57, 8,224, 96,201,254,231,246,250,173,223, 73,185,181,235, 43,217,124,250,162,
+172,192,164,118,175,202,236,181,105, 60,180,179,179,141,197,173,221, 27,102,242, 63,138, 82,192,227,241, 32, 20, 10,145,146,145,
+135, 53, 59,206,201, 52, 20,213,247,107,133,150,137,137, 9, 79,163,209, 96,239,222,189, 72, 73, 73,233, 4, 32,229,229,203,151,
+ 7, 70,143, 30,189,171,121,243,230,141, 98, 99, 99,223, 74,165,210, 57, 0, 94, 87, 68, 98,110,110,222,201,198,198,134,120,242,
+228, 9,102,206,156,169,158, 59,119, 46,103,194,132, 9,132, 68, 34,169,169, 39, 11, 0,224,228,228,228,217,187,103, 71,116,233,
+ 61, 43, 68,173,204,123,144,244,250,247, 16, 6,253,216,168,166,229,105,128, 1, 6, 24, 96,192,255, 12,106, 22, 24,220, 19, 96,
+185, 89, 97, 70, 83, 39,206,199,128, 45,115,233,194,132, 80, 90,241,252, 32, 93,112,121, 26,125,109,235, 4,250,250,238, 5,244,
+172,254, 77,233, 70,182,196, 71, 55, 43,204,240,252, 82,184,125,146,221,251, 59,119,104,123, 55, 0,221,187, 1,232,254,110,208,
+ 2, 88,217,186,117,235, 43,190,237,255,138,163,229,219, 30, 52,128,153, 0,132, 21,152, 85, 94,198,112, 7, 0,135,218,180,105,
+ 67,222,187,119,143,142, 31,217,139, 14,111,100, 77,207,153, 51,135,254,241,199, 31,233,177, 99,199,210, 54, 54, 54,100,113, 65,
+ 56, 84,197, 57,104,208, 32,103, 0,168, 85,171,150,121,219,198, 13, 63, 70, 5, 95,165, 31, 4,236,162,143,250, 14,163, 59, 52,
+111,156, 99,223,168, 91,164,177,131,123,171, 42,138,175,148,211,222,222,126, 5, 77,211,125,105,154,118, 0, 0, 87, 87, 43, 97,
+235, 70, 13,211, 35,239, 92,165, 31,158,216, 67, 31,245, 29, 70,119,108,209, 68,236,220,216,235,181,145,109,163,246,250,112,150,
+135,114,237,109,214, 40,199,104,243, 99,239, 0, 0, 32, 0, 73, 68, 65, 84,174, 97,231,136, 74,236, 45,229,172,215,126,212, 31,
+105,233,153,244,179,103,207,232,235,215,175,211, 15, 31, 62,164, 3,206,254, 65,215,110, 55, 82,106,221,124, 72,151,106, 52,157,
+138,236, 52,235,223,191, 63,253,246,237, 91,186, 95,191,126, 52, 0,179, 26,114, 94, 73, 74, 74,162, 99, 98, 98,232,149, 43, 87,
+210, 0,142,207,158, 61, 91,145,159,159, 79,247,234,213, 43,165, 88, 96,177,106, 98,103,125, 23,167,205, 67, 7,118, 93,235, 59,
+115,184,231,215,150,231, 55,132,129,211,192,105,224, 52,112,254, 47,112,254,147,225, 80,236,213, 42,249,219, 90, 47,143, 86, 8,
+ 64, 66,140,131,205,108, 53, 39, 55,109,221,189,120,239,193,227, 75,151,207,155, 42,232,234,209, 27,209,119,126,195,197,192,179,
+ 50,165, 74,189,149,195,196, 47, 49, 98,200,223, 84, 97, 69,113, 28,173, 79, 16, 30, 30,206,183,108,240, 87, 12,166,119, 69,177,
+ 89, 15, 84,243, 2, 51, 0, 76, 15, 11, 11,251,197,203,203,107,227,180, 46,237,135,249,118,238, 1,173, 86,139,128,128, 0, 36,
+ 39, 39, 95, 2,176, 74, 95,143, 91,116,116,116, 78,147, 6,117,230,179,153,172,165,115,198, 14,181,201,126,255, 10,105,113,225,
+ 0, 0,149, 74,161,253,248,246, 65,203,234, 24,103,108,108,252,204,198,198, 38,222,198,198, 70,226, 86,175,214,116, 30,216,171,
+103,249, 12,182, 21, 39,189, 70,106,108,209,200,168, 74, 41,215,164,189,189,215,168, 38,181, 91,167, 78, 29,158,128,141, 25,229,
+218,171, 86,106, 51,223,189,110,165, 15,143, 92,165,222,180,110,123, 64,159, 13, 75, 39,241, 76, 77, 77, 17, 22,243, 14,171,127,
+ 61, 45, 83,168,181,125,115,162,175,124,147,225, 49,154,166,161,213,106,245, 94,232, 80, 1,150,183,108,217,210,125,227,198,141,
+174, 19, 39, 78,196,215,122,178,202, 34, 33, 73,228,231, 84,171,126,147,119,241, 97, 94,150,198,156,147, 95, 83,158, 6, 24, 96,
+128, 1, 6,252,207,160,127,177, 51,103,122,153,191,225, 85, 10,173, 18,196,100, 65, 14, 96,125, 61,166,244,192,138,141,219,215,
+ 48,136, 29,147, 40,154,254,141,100, 96, 93,162, 24,217, 95,105,156,156,205, 2,217,103,200, 88, 22, 0,176, 89, 53,235, 32,139,
+241, 22,192,240,195,143,159,183, 59,252,248,249, 15,197,159,109, 0, 80,173,177, 92, 19, 22, 98, 60,154,212,119,234,218,186,169,
+ 17, 83,167, 64, 90,220,123,228,202,148,184, 29,155,156,199,160, 25,191, 85,215,168,196,196,196,251, 0, 96,103,198,143,235,218,
+164, 65,237,110,109,154,242,217,132, 26,105,175,194,144,175, 80, 35, 40, 54, 57, 31, 4, 81,227, 9,213,223,202,222,204,232, 63,
+ 94,252, 9,162, 23, 65, 16,119, 86,250,142,225,173,249,245,204, 55, 21, 89, 0,228, 34,145, 72, 44,151,203,173,210,211,211,213,
+168,121,144,184,119, 5, 5, 5,205, 23, 44, 88,176,126,201,146, 37, 75,183,108,217,194,169,201,156,172,138, 32, 17, 37, 95,238,
+214,244,219,213,191, 1, 6, 24, 96,128, 1,255, 19,152,254,217, 95,232, 45,180, 74, 5, 67, 22,178, 1,204,169, 95,159, 94,148,
+144, 0,245,183,178,172, 60, 79,215, 87,226, 5,128,129, 53, 62,155, 65, 20, 62,125,155, 44,125,246, 54, 89, 10,138,166, 41,154,
+ 86, 49, 24, 72,149,105, 52,155,222, 38,138,106,190,234,142, 32,116, 47,222,165, 40, 94,190, 79, 85,210, 20, 69, 83, 52,173, 38,
+ 8,124,212,106,169, 77,177,137,201,127,252, 55,216,155, 19,125,229,113, 32, 73,116,125,252, 44,102,145, 76,166,217,147, 19,119,
+ 37,244, 27,214,139, 54, 58, 58,122, 92,167, 78,157, 38,235,116,186, 3, 0,180, 95,193,165, 38, 73,114,249,230,205,155, 47, 69,
+ 71, 71,159, 11, 13, 13,205,248, 22, 34,235,111,173,127, 3, 12, 48,192, 0, 3,254,173,168, 89, 82,233,138,240, 45, 69,214,127,
+ 35, 98,222,125,104,243,119,240,198,190,251,208,236,159, 96,111,102,220,229,151,153,128,207,223, 84,188, 65, 58,157, 46,232, 91,
+138,234,155, 55,111,186,160,156,180, 58,255,109,245,111,128, 1, 6, 24, 96,192,191, 22,211, 43, 18, 95, 44, 67,217, 24,240, 47,
+ 0,253,173, 68,150, 1, 6, 24, 96,128, 1, 6,212, 0, 21,122,180, 8, 84,188,114,224, 78, 53,126,160, 38,171, 15,238, 24, 56,
+ 13,156, 6, 78, 3,167,129,211,192,105,224,252,159,227,252, 55,194, 1, 69, 19,226,175, 21,255,173, 84,124,125, 75, 24,150,190,
+ 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,183,163,220,137,240, 64,209,228, 97, 3, 12, 48,192, 0, 3, 12,248,187,
+192, 43,222,106,250,189, 1, 6,252, 19,197, 86,169,224,170,201, 28,173,134,197,127,223,253,141,198,250, 58, 56, 56, 76,111,209,
+162, 69, 99, 14,135,195, 40, 44, 44, 92,119,239,222,189,181,159, 31,212,181, 9,235, 37,147, 1,231,191, 62, 33, 0,130, 9, 48,
+ 24,208,209, 72,123, 24,165,104,107,168,247,255,106,212, 49, 54,181,249,147, 96, 48,185, 58, 82, 3,157, 86,131,162,233, 86, 69,
+160, 40, 50, 89,167, 81,121, 87,116,178,125,203,161,181, 73, 29,181, 5,160,247, 2,140,217, 0,181,143, 0,107, 22, 13,114, 63,
+ 1,230, 76, 48,233,159,161, 35,150,177,216,204, 21, 25,225, 23, 82,255, 13, 5,118,254,252,121,230,215,156, 63,114,228,200,114,
+ 19,136, 58, 58, 58, 6,242,249,252, 6, 21,157, 39,147,201, 50, 50, 50, 50,188,254,229,237,177, 27,128,221, 0,154,126,246,249,
+107, 0,243, 1, 4,127,237, 15,120, 2, 44, 59, 96, 6, 7, 88, 6, 0, 26,224,231, 76,224, 96,200,127,209, 28, 67, 27, 27,155,
+ 7, 44, 22,203, 85, 38,147,201, 10, 11, 11,235,155,152,152, 36, 8, 4, 2, 1, 73,146,111,179,179,179,187, 85,147,110, 54,254,
+ 74,165,181, 20,192,190,106,126,111,128, 1,255, 20,124,213,170, 67,183,162,231, 3, 60, 1,116,107,215,174,157,157, 76, 38,195,
+235,215,175, 51, 1, 60, 0, 16, 82,188,189,249, 22,150, 50, 24,140,109,219,183,111, 95, 60,119,238,220,210,100,208, 81, 81, 81,
+104,217,242,203, 24,161, 76, 6,156,239, 93,189, 99,251, 34,250, 13,218,245, 26, 81, 44,180, 24,128, 44, 3, 94,189,219,215,212,
+ 4, 19, 11, 11,139,117, 4, 65,140,100, 48, 24, 85,118,106, 20, 69,233,104,154, 62, 47,145, 72,214, 0, 40,172,206, 15, 9,248,
+ 60, 45,169,211,149,251, 27, 44, 38, 83, 39,147,171, 42, 12,123, 97,105,105, 25,202, 96, 48,234,149, 77,152, 13,124,154, 64,187,
+162,239, 72,146, 76,203,201,201,209, 71,132, 26, 49, 88,156,249, 4,193,233, 13, 6,229, 6, 16, 32,192,120, 67,233,212,183, 41,
+ 82,179, 19,128,242,107, 68,150, 67,173,250, 15, 23,174,218,236, 28, 19,247, 26, 43,125,199, 98,203,238,227, 88, 49,127, 50,118,
+ 30, 58,141,249,211,199,160, 73,147,166,168, 44,173, 56, 5,206,166, 85,243, 70,246,242,223,123,206, 99,197,156,145, 60,255,189,
+231,187,174,244, 29,205,221,180,231, 92,215,149,190,163,120,254,123,206,121,172,152, 55,210,120,211,190, 11, 20,128,241, 53, 49,
+114,140,171,163,140, 32,201,114,223,182,105, 22, 75,117,250,109,186,224,255,227,142,158, 56,113, 98, 11,133, 66, 17, 54,182,119,
+235,205,173,220,156, 68,229, 29, 35,254, 40,114, 74,136, 15,247, 99,115,140,219, 12,246, 59, 30, 85,169,203,129,199,171,247,250,
+245,107, 87,138,162,160,211,233, 64,146,100,233, 95,181, 90,141,110,221,186,125,171,133, 51, 3, 1,172, 43,186, 89,225, 15,224,
+220, 87,112, 9, 89, 44,214, 66, 46,151,235, 73,146,100, 99, 0, 96,179,217,113, 42,149, 42,132, 36,201,237, 0,164,213,228,219,
+ 33, 18,137,154, 8,133, 66,104, 52,154,210, 4,244, 76, 38,179, 81,237,218,181,247, 42,149, 74,215,175,189,120, 59, 96, 70,103,
+ 15,143,157, 19, 22, 47,102, 42, 30, 60,192,206, 99,199,118,160,160, 0, 0,246, 86,117, 46,151,203,189,197, 96, 48,234, 84,231,
+247, 40,138, 74, 86,171,213,222,213, 57,135,197, 98,185,166,167,167,219, 58, 58, 58,162,176,176, 16, 2,129, 64, 80,178, 95, 3,
+ 79,214, 86,154,166,141,139,159,237, 59, 59,118,236,216,137, 32, 8, 18, 0, 77, 81, 20,227,217,179,103, 99, 40,138, 98, 21, 63,
+159,182, 2, 56, 6, 64,101,232,179, 13,248,135,122,179, 14, 85, 87,104, 93, 7,224,217,174, 93, 59, 99, 31, 31, 31,120,122,122,
+194,213,213, 21, 70, 70, 70, 69, 15,113,177,216, 46, 34, 34, 98,212,131, 7, 15, 70, 93,189,122, 21,175, 94,189, 82, 0,120, 4,
+160,220,155,186,231, 0,143,185, 70, 66,222, 46, 0,200, 78, 19,103,164, 37,102,237,202,200,200,216, 10,160,108,136,240,250,227,
+199,143, 95, 52,111,222, 60, 4, 6, 6,226,244,233,211, 80,169, 84, 40, 44,172, 68,191,200,179, 32,185,187, 25, 16, 36, 1, 41,
+ 33, 0,223, 22, 16,216,213,184,164, 44, 44, 44,214,205,159, 63,127, 65,147, 38, 77, 74,163,152,107,181, 90,144, 36, 9,173, 86,
+ 11,137, 68,130, 69,139, 22, 21,117,180, 52, 13,138,162,112,227,198,141,185,211,167, 79,135, 68, 34, 89, 88, 30,103,199, 54,181,
+ 94, 50, 8,134,115,137,175,134,214,233,210,158, 70,164,181, 37,117, 58,166, 82,169, 41, 55, 83,185,145, 17,167, 82,145,199,102,
+179,157, 95,253,249,167, 45,131,203, 5,173,211, 1, 20, 5,154,162,138,139,179,120,163,139, 62,163,117, 20,104,173, 14, 20, 73,
+129, 84,168,208,126,246,108,125,138,162, 51,155,107,124,122,220,180,197,246, 29, 58,118,100,215,173,229, 8, 82, 71,225,125, 82,
+154,125,216,203,167, 93,206,255,190,119,150, 90, 81, 56, 6, 64,141,226,108,113,249,166, 65,123,246, 31,118,126, 17, 17,131,224,
+123, 15,112,231,110, 8, 0,224,214,189,208, 18,193, 93,101, 85,129,148, 54,159, 63,101, 8,111,243,158, 51,236,249, 83,134, 50,
+183,236, 57,203,158, 55,121, 48,115,243,174,211,156,121,147, 7, 51, 55,239, 62,205,153, 55,101, 8,211,127,231,209, 22, 0, 44,
+ 0, 72, 42, 34,171,168,142, 8,146,228,157, 76,200,100, 2, 64,246,129, 3,208,102,101,193,113,205, 26, 0,192,184,250,118,122,
+ 15,119, 88, 91, 91,191,100,179,217,206, 85, 29,167,213,106,171, 20,193, 19, 39, 78,108,169, 80, 40, 94,146, 36, 73,179, 88, 44,
+191,177, 67,251, 92,233,219,181,165,184,236, 49, 81, 81,145, 86,155, 54,253, 57,228, 92, 88, 33, 61,170,141, 73, 88,224,182,137,
+109, 7, 44, 57, 30, 89, 73,135,204, 80,169, 84,120,251,246, 45,202, 38,121, 47, 3, 93, 77,223,157, 0,236,180,178,178,234, 32,
+ 22,139,199, 1, 88, 89, 80, 80,208,130,201,100,194,210,210,114,165, 90,173,126,111,102,102,118, 36, 63, 63, 63,180,216,107,164,
+111,202,128,110,166,166,166, 1,151, 47, 95,182,104,221,186, 53, 35, 39, 39, 7, 46, 46, 46,200,205,205,109,255,224,193,131, 54,
+ 83,166, 76,153, 82, 88, 88,248,125,241,203,160,190,112,231,243,249,244,132, 9, 19, 8,157,238,175,203, 61,122,244, 40,188,155,
+145, 13,108,204,249,114,165,154,206, 15,126,107, 54,147,195,225, 60, 74, 78, 78,206,175,110, 97,112,128,101, 19, 22, 47,102, 10,
+ 63,124,128, 48, 50, 18,227, 10, 10, 88, 91,138,188, 91, 85, 10, 45, 6,131, 81, 39,224,244,111,174, 92, 46, 23, 36, 73,150,138,
+193,146,103,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131, 86,163,133,255,134,159,107,252, 44,228,243,249,124, 7, 7,135,
+ 76, 62,159,207,255, 22,189, 16,143,199, 99,253,254,251,239, 99,184, 92, 46, 0, 64,173, 86,163, 89,179,102,132,161,127, 54,224,
+ 95, 38,182,190,240,114, 85, 38,180,250, 21, 20, 20, 64,167,211,193,196,196, 4, 76,230,167,253,190,149,149, 21,122,247,238,141,
+110,221,186,193,199,199, 7,175, 94,189, 50,246,241,241,233, 93, 17,217,216,197, 3, 80,203,213,174,184, 51,161, 28, 30, 95,139,
+216,124,244,167, 11, 54, 31, 63,126, 92, 92,230,176, 41, 51,102,204, 32,196, 98, 49, 70,142, 28,249, 64,165, 82, 13, 2, 80, 80,
+ 17,167,142, 66,154,151,207, 56, 80, 52, 97,188,253,217, 97, 66,173, 84,208, 12, 6, 67, 81, 50,116, 88,147, 82, 34, 8, 98,164,
+163,163, 35,206,156,249, 63,246,190, 59, 46,138,107,125,255,153,217,190, 44,189,131, 10, 42,136,130, 32,216, 16,108,216, 53, 17,
+ 19,107,188,246, 36, 38,222, 36,150, 88, 18,177, 69, 99,131,196, 26, 19,141,154,196, 88,174, 13,187,216, 98,197,196,174, 40, 82,
+ 20, 20,105,194, 2, 75, 95,216, 54,187, 51,243,251, 3, 88, 1,217,130,201,253,221,251,189,217,231,243,217,207,238,236,204,190,
+123,230,156,153, 57,207,121,222,247,188,231, 32, 52,154,215,211,133,217,218,218, 34, 57, 57,249,149,170,198,225, 32, 44, 44,140,
+ 67, 16,196, 56, 0,115,155,182, 73,182,188,113, 47,203,181,110, 59,114,112, 32, 63,172, 43, 89,152, 95, 88,205, 2, 32,150, 44,
+ 89,162, 39,110, 0,240,245,215, 95,155, 83, 78,144, 60, 30,100,241,241,175, 30,196, 92, 18, 36,159, 0,193, 3, 72,110,141, 23,
+ 21, 44,192,210, 0,163, 3, 24, 45, 32,242,104,101, 78, 53,132,182,240,242,139, 91,187,113,155,189, 90,203,226,224,201,203,200,
+204,124, 1, 14, 73,194,199,215, 15, 67,250,245,225,117,237, 30,222,234,219, 21,243, 79,231,231, 60,123, 11,192,221,102, 87, 52,
+195,138,124,189,156,241,243, 47, 15,224,226, 96,141,113, 35,223,134, 88, 36,196, 55,223,255,138,213,139,102,194,207,199, 27, 59,
+ 54,175, 49,248,115, 59, 59,187,149, 1,126,190,222,219,246,156, 65,128,191, 63,103,219,222, 51, 8,232, 88,251, 30, 24,192,217,
+182,247, 12, 58, 6,118,228,108,219,123, 6,193,129, 29, 90,223,151,222, 89, 89, 90, 90, 58,211,112,125, 54,106,163, 33, 53,109,
+196,171, 98,244, 29, 65,214, 39,159, 0,128,158,104, 53, 7, 60, 30,175,101,126,126,190,171,169,227, 76,169, 6,181, 74,214,125,
+157, 78,135,162,162, 34,162,188,188,156,181,183,183, 31,121,126,199,226,227, 67,123,135,148, 2,192,163, 71,143, 28,163,163,215,
+142, 60,116,191, 18,202,219, 63, 16,255, 58, 21,207, 76,122, 39,226,254,201,152,105, 93, 81,187, 36, 68, 99,168,213,234,204,206,
+157, 59,179,181,159, 91, 8,133, 66,126,163,235,205,179, 93,187,118,175,169,214,102,184, 20,191,187,117,235,214,204,142, 29, 59,
+194,223,223,255,102,143, 30, 61,108, 37, 18, 9,206,159, 63,143,128,128,128, 64, 91, 91,219, 59,177,177,177,188,133, 11, 23,134,
+236,218,181, 11, 0,102,153, 81,157,131,250,247,239,127, 48, 46, 46, 78,196,231,243,161, 84, 42,145,156,156, 12, 59, 59, 59, 8,
+ 4, 2,188,251,238,187,156, 94,189,122, 57,245,235,215,239,104, 90, 90,218, 4, 52, 99, 6,148, 74,165, 98, 23, 47, 94, 12, 43,
+ 43, 43, 88, 89, 89, 65, 34,145, 64, 34,145,192, 90, 4, 98,251, 28, 47,241,236,157,229,226,185,203,183,199,236,221,182,226,106,
+171, 86,204, 87,185,185,185,229,205,189, 22,148,215,175,195,250,209, 35,160,222,189,107, 46,236, 36,142,136,138,138, 50,165, 72,
+129,207,231,163,103,207,158, 38,237, 57, 58, 58, 30,227,114,185, 13, 70,166, 58,157, 78, 20, 21, 21, 69,167,165,165, 73, 72,146,
+148, 48, 12,131,168,168, 40, 90,167,211,137, 92, 93, 93,111, 50, 12, 83, 88, 92, 92, 60,218,140,226,170, 1,124, 65,146,228,119,
+ 66,161,144,219,186,117,235,236,101,203,150,221,170, 85, 51,193,178, 44,217,186,117,235, 80,177, 88,236,173, 86,171,117,168,113,
+ 29, 90,212, 44, 11,154, 4,203,178, 93,107, 68, 97, 61, 52, 0, 4,181,159, 75,106,122, 59, 56, 55,250, 30, 0,138,107, 7,138,
+110, 6,182, 75, 0,164, 0,232, 0,192,181,118,223, 61,130, 32, 74,223,160,152,134, 21,173,184,184, 56,253, 16, 54, 50, 50, 82,
+223,177,216,216,216,224,222,189,123, 32, 8, 2, 54, 54, 54,176,181,181,133,157,157, 29, 42, 43, 43,145,146,146,130, 39, 79,158,
+ 32, 43, 43, 11, 4, 65,192,199,199, 7,117, 55, 80, 61,232, 31,112,251, 55,196, 65,100, 45, 4, 65, 0, 93, 6, 4, 35,184,111,
+ 16,186,223,205,152,115,255, 18,177, 83, 42,149,166, 3,224, 6, 5, 5,125, 24, 22, 22,134,141, 27, 55, 66,173, 86,111, 52, 64,
+178,244, 54,127, 79,209,117, 3, 0, 15, 15,143, 5,251,206, 63,183,154, 60,204, 87, 33,149, 74,215,191, 65,229, 52,120, 16, 23,
+ 23, 23,155,189, 22, 31,195, 48, 40, 43, 43, 51,106,179,177, 66,176,233,187, 31,236,229, 21,133, 88,245,205, 62,104,181, 90,204,
+159, 63, 31, 12,195,232, 95,229,229,229,102,149,147,165,233,215,181, 3,178,198,123, 74,112, 1,175,241, 53,188, 34,231,224, 15,
+ 32, 88,128,160, 1,188,126, 94,141, 59, 33, 17,135, 47, 62,180,226,155, 45,246, 9, 79, 94,226,228,229, 4, 80,149,121,144, 62,
+ 58, 94, 35, 57,246,156,128,195,106, 14,122, 4,251,226,243, 37,223, 58, 44,253,124,202, 33,141, 82,238,143,134,110,196, 75,166,
+111, 26, 26,171, 86,174,196,206, 45, 27,241,237,198, 45,168,172, 40, 7,143,231, 92,251,160,167, 65,211,180,241,115,103,217, 97,
+ 81,115,222, 39,190,249,241, 24, 66, 59,122,224,232,249,187,232,221,217, 27,199,127,187,143,190, 93,219,224,228,165, 4, 12,232,
+225,139,179,241, 73,248,124,198, 4, 98,194,133, 93,195,154,211, 70,155, 55,255, 96, 47,175, 44, 68,220,154, 61, 40,218,186, 21,
+217, 51,103, 34,180,246,152,187, 4, 1,126,203,150, 0,223,116, 27, 53, 70,106,106, 42,212,106,117, 83,163,125, 4, 4, 4,152,
+108,119,165, 82,249, 64,167,211,177,133,133,133, 68, 97, 97, 33, 36, 18, 9,145,156,156, 68, 7, 6, 6,141, 98,159, 28,249, 9,
+ 0,162,163,215,142, 58,252,160, 18,138,155, 91,160,188,245, 61,248,109, 18,201,157, 95,207,160, 62, 94,190,227, 65,189,123,180,
+ 65, 57, 11, 10, 10,222, 42, 40, 40, 0, 0,180,109,219,246, 73, 90, 90, 90,135, 58, 87,115,173, 11,145,175,211,233,252,234,220,
+137, 58,157, 14,106,181, 26,131, 6, 13,226, 24, 59,119, 7, 7,135,176,128,128, 0, 36, 36, 36, 96,203,150, 45,142,253,251,247,
+199,179,103,207, 64, 16, 4,214,174, 93, 75,116,236,216,145, 87, 92, 92,140,161, 67,135,226,216,177, 99, 61, 43, 43, 43, 77,213,
+167,141, 68, 34,217,117,250,244,105, 17, 73,146,144,203,229, 96, 24, 6,189,122,245, 2, 73,146, 72, 74, 74,194,146, 37, 75,112,
+236,216, 49,156, 56,113, 66,220,181,107,215, 93, 10,133, 34, 0, 13,221,250,134,218,136, 85,169, 84,172, 80, 40,132, 80, 40,132,
+ 72, 36,130, 72, 36,130, 64, 32, 64,149, 10,248,120, 83,182,154, 35,114,102, 2, 59,247,246,125,127,246, 90,114,253,178, 15,174,
+ 0, 56,105,238, 53, 15,212,196,100,125,247,235,175, 91, 38, 85, 84,144, 0,240, 51, 65, 48, 20,203,126,107,206,253, 14, 0, 85,
+170, 10,120,251,180,196,209, 67, 39, 48,102,252,200, 38, 73, 22,143,199, 7,159,199,131,173,163,196,164, 77, 62,159,239,246,228,
+201, 19, 39, 30,143, 7,150,101, 65,211, 52, 40,138, 42, 92,186,116,169,203,240,225,195,109,206,157, 59, 71, 14, 31, 62,156,113,
+112,112,168,190,123,247,110,145, 78,167,115,234,211,167, 79,115,174,249,109,193,193,193, 93,142, 31, 63,254, 65, 84, 84,212,253,
+ 5, 11, 22,172,170,191,115,221,186,117, 43,207,158, 61,235, 61,106,212,168,189,143, 30, 61,218,214,156,103,200,159,125,206, 91,
+108,254,247,217, 52,196, 69,106,225, 70, 16, 68, 92,189,103,118,100,221,118, 84, 84,212,226,232,232,232,100,130, 32,226,234,127,
+ 95,119, 92,237, 96, 49,174,169,237,218,223, 58, 46, 90,180, 40, 40, 38, 38,102,109,120,120,248,193,155, 55,111,190, 0,208, 92,
+162,101, 60, 70,171,238,132,234,159,100,163, 78, 13,149,149,149,168,172,172, 68,110,110, 46,182,111,223, 94,123, 67,243,192,229,
+114,193,229,114,245,241, 12,134,112, 57,238,143,239, 1,124,223,165, 75, 23,222,227, 91,177,231,190,220, 57,123, 96,183, 65, 93,
+ 56, 15, 46, 63, 30,139,154,245, 8,223,154, 58,117,170, 51, 0,236,217,179,167, 24,192,185,255, 16,107,142, 77, 79, 79,255,220,
+195,195, 67, 31,163, 82,223,125,168,211,233, 32, 18,137, 80, 23,203,162, 82,169,176,125,251,118, 29,203,178,177, 70,108, 34, 45,
+249, 10,210,147,175,214,252,142, 97,192,208,175,126,191, 98,197, 10,176, 44,171,239,236, 63,169, 85, 78, 76,146,188,166,234,156,
+109,244,222,232,123,150,166, 77,184, 39,248,179,199, 78,153,233,193, 16, 92,156,186,242, 16, 60, 30, 15, 76, 61, 53,147,199,169,
+ 25, 45, 39, 63,203,135,167, 91, 32,222,153, 48,195,253,248,222, 31,102,235, 40,213, 55,205,173,107,255,224,112,204,249,252,115,
+252,180,115, 39,150, 44, 95,169,103, 0, 58,154,134,206,100, 57, 73,114, 80,175, 32,232,170,242,193,225,112, 48, 32,212, 23, 28,
+ 14, 7,131,195,219,131,195,225, 96,104, 47,127,112,185, 92, 12,235,221, 17,237,218,181, 3,151,203, 37, 77,180, 59,210,146, 47,
+ 35, 61,249, 90, 61,210,203,130, 5, 64, 73,165,175, 29,175,149, 74,193,122, 57, 53,247,218,194,135, 31,126, 88,158,155,155, 75,
+ 53,222,215,170, 85, 43,254,245,235,215,237, 13,184,237,244, 16,139,197, 93,185, 92,238,131,210,210, 82,198,202,202,138,100, 24,
+154, 9, 12, 12,226,156,223,177,248,120,221, 49,139, 22, 45, 62,254, 94, 87,219, 81,251, 98,227, 88,126,235,222, 4,193, 19,234,
+ 62, 90,190,131,207,227,139,187, 2, 74,115, 6, 15,164, 90,173,198,211,167, 79, 97,170, 60, 44,203, 26,117,253,148,149,149, 77,
+ 13, 8, 8,184,254,253,247,223, 59, 18, 4,129,223,127,255, 29, 28, 14, 71,255,202,200,200, 0, 73,146,248,242,203, 47,169,202,
+202,202,233,166,202,198,229,114, 63, 63,122,244,168,157, 64, 32,128, 92, 46,215,223, 55, 28, 14, 7, 79,158, 60,193,250,245,235,
+ 49,117,234, 84,228,228,228,192,211,211, 19,243,231,207,183,142,137,137,249,156,162,168,149,102, 52, 81,162, 70,163,233,102,101,
+101, 5,145, 72,132, 58,194, 5, 0,191, 37,243,146,148, 74,101, 39, 39, 39,133,187, 75,124,220,169,158,253,223, 9,113,114,241,
+ 8,151, 74,165,205, 90, 58,235, 57,176, 51,147,166,151,190,117,252,184,235,141,227,199,153,219,167, 79,191, 20,202,229, 59,204,
+190,134,180, 36,178, 51, 94,162,107,215,174,120,240,224, 1,186,118,237, 90,159, 52, 65, 32, 16,128,207,231,131,207,231,195,217,
+193,172, 16, 10,150, 36, 73,220,184,113, 3, 52, 77, 67,163,209, 64,163,209,160, 99,199,142,165, 87,175, 94,181, 6,128,140,140,
+ 12,118,242,228,201,229,119,238,220, 65,231,206,198,215, 83,119,115,115,187,206,225,112, 90,215,255,174,164,164,196, 97,244,232,
+209, 40, 43, 43,123,123,244,232,209,189,107,239,223,188, 35, 71,142, 76, 6, 0,129, 64, 0,146, 36,105, 88,240,183,135, 41, 46,
+ 82,159, 40, 53, 38, 92,209,209,209,145,141,191,171, 79,170,154,250, 92,255,183, 49, 49, 49,107,235,217, 86,190, 65,241, 77,199,
+104,197,197,197,177, 77, 48, 72,179, 97,138,104,213, 33, 33, 33, 65,235,233,233,249, 83,250,195,172,129,190,193, 62, 16, 75,132,
+ 67, 0,124, 47, 20, 10,231, 77,153, 50, 5,183,111,223, 70, 82, 82,210, 47,248,147,179,112,130,130,130, 46, 8,133, 66,111, 3,
+110,146,236,164,164,164,161, 6, 58,134,229,167, 79,159,134,177, 96,248, 43, 87,174,212,239,148,234, 7,195, 55,125, 97, 48, 44,
+180,148, 22,213, 10,229,171, 78,188,150,104, 85, 87, 87, 99,252,248,241, 13, 20,173,162,162, 34,147,231, 71, 16, 4,214,159, 60,
+137,139,177,177,120, 59, 36, 4,199,238,222, 69,204,148,137,240,247,110, 1,150, 38,192, 18, 64,206,129, 31, 80, 82, 89,133,253,
+151,111,160, 84,174,192,164, 62,125,224,103,235,108,220, 46,143, 63, 56, 52, 44,156,127,233,102, 10,120, 60, 46, 72, 48, 96,181,
+ 10,120, 6,244, 3,135, 36, 97,231,214, 6,124, 30, 15, 60, 30, 23, 25,185,197, 8, 8,234, 46,136, 19,136, 6,191, 9,209,106,
+229,221, 6, 52, 77, 99,234,212,169, 56,120,240, 32,156,220,189, 97,215, 42, 8,171, 55,238,196,219,131,250,152, 60,255,186, 17,
+ 60,151,203, 5,135,195,121,237,189,238,179, 57,234, 36,203,176,160, 26,183, 17,195, 2, 44,139,150,107,214,160,229,154, 53,184,
+ 91,251,159, 29,171,171,161, 84, 42,129, 30,129,205, 34, 89, 26,141, 6,185,185,185, 84, 65, 65,129, 91, 19,251, 11, 53, 26,141,
+ 73, 98,179,123,247,238,196,105,211,166,117,115,116,116,188,159,248,232,145, 54, 56, 36,132,119,110,251,226, 19,117,110, 67, 0,
+ 8, 9, 9, 41, 93,188,120,241,137,201,227, 34, 71,110,139,250, 7,253,233,202,189, 92,161, 88,220, 45,114,193,238,196, 3,227,
+198,153,246,247,168,213,153,193,193,193,172, 57,231,165, 80, 40, 10,140,236, 30, 1,224,235, 46, 93,186,216,246,239,223, 31,215,
+175, 95,199,152, 49, 99,212, 20, 69,165, 3,192,240,225,195,219,239,223,191, 95,144,146,146, 2, 23, 23, 23, 94,118,118,246, 46,
+152, 8,144, 23, 8, 4,253,186,119,239, 78,170,213,234,215, 72, 86, 76, 76, 12, 38, 76,152,128,246,237,219,131, 97, 24, 84, 85,
+ 85,161,127,255,254,188, 45, 91,182,244, 51,147,104,205,241,247,247, 95,143,154, 89,135,245,159,133,169,168,113,107,161,164,164,
+164,224,225,157,203,201,125, 6,141,238,214,186, 93,144, 71, 82,226, 3,163, 6, 93, 93, 93, 23,145, 36,249, 30,195, 48,156,202,
+202,202,220,135, 26, 77,187,142,222,222,110,189, 70,142, 68, 5,143,199,249,238,242,101,178, 80, 46,183, 6, 96,150, 11, 82,165,
+173,134,183, 79, 77,168,223,152,241, 35,241,224,193, 3,140,253,199, 40,240,249,124,112,185,188,154,123,147, 95,163,104,217, 59,
+219,154,117,109,106,181, 90,253, 51,188, 46,206,139,162, 40,212,133,102, 89, 89, 89,233,247,169,213,106, 16, 4, 97,236,218,240,
+ 59,188,114,153,171,216,214, 14,180, 86,139,192,145, 99,245,215,244,157,159,183,137,193, 48,226,242,236, 76,204,138, 61,205,131,
+ 5, 22, 24, 80,181,140,113,145,250, 68,233,207,130, 32,136,184,168,168,168,197, 0,216,168,168,168,197,117,219,209,209,209, 74,
+ 0,121,111, 72,182, 94, 83,185,184,127, 5,201,170,115, 47, 24, 67,255,254,253,103,217,216,216,108,169,219,206,189,157,135,220,
+219,121, 8,232, 16,216,171, 75, 72,183,138, 9, 19, 38,192,201,201, 9, 11, 22, 44, 96, 1,252,210,220,255,207, 72, 75,182, 6,
+192,122,120,120, 44,168,125, 32,135,220,189,123,215,229,222,189,123,232,222,189,251, 43,233,158,162,208,187,119,111, 99,166,228,
+181, 65,237,115,255, 58,149,140, 1, 69, 81, 80, 40,148,208,104, 40,232,180, 12,116, 58, 29,186, 6,218, 96,239,206,168,154,239,
+116,117,234, 89,141,106,214,210,221, 6, 54,214, 60, 45, 73, 18,202,251,137, 5, 77, 62, 49, 53, 26, 13, 18,179,179,241, 40, 43,
+ 11, 0,240, 78,180,241,192,215,189,151,175,163, 99,199,142,166, 74,235,219,210,211, 29,249, 23, 19,107, 30,222,202, 92,220,251,
+227, 48,108,108,172, 1, 0,129, 17,147,192,231,215, 16,173,106, 37, 5,231, 14,173, 64,176,172,193,180, 0, 86, 14,238, 23,184,
+124,145, 55, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124,171, 89,159,124, 0,134,161, 17, 26, 26, 10,130,195, 1,173, 85,
+ 99,220,136,193, 40,171,144,195,201,222,188, 78,130,207,231, 35, 34, 34, 66,108,104,255,179,103,207,148,245,137,153,241, 54,210,
+162,186, 90, 9,181, 90, 13, 74,163, 3,165,213,129,110,203,199,170,165, 19,161,163,116, 80,252, 35, 28,148, 86, 7,230,243, 81,
+160, 52, 90,228, 88,145,100,112,128,179,150, 4,161,124,152, 42,179, 53, 69,180,234,200,129, 33, 52, 21, 19,104,128,108, 61,154,
+ 54,109, 90,215,224,144,144, 7,239, 13, 10,217,240, 56, 41, 57,255,113, 82,242,107,199,121,183, 15,201,252, 52,230,224,124, 30,
+ 95,220, 53,114,129,241, 89,135,245, 81,223,141,248, 39,177, 88, 46,151, 7, 91, 91, 91, 35, 45, 45, 13, 28, 14, 7, 4, 65, 60,
+ 3, 16, 12, 0, 30, 30, 30,207,185, 92,174, 15,135,195,193,214,173, 91, 9, 46,151,219, 41, 60, 60,124,177, 74,165, 58,108,100,
+ 64, 23, 96, 99, 99,211, 64,205,226,243,249,136,138,138,194,228,201,147,245, 36,139,207,231, 99,247,238,221,232,214,173, 27, 52,
+ 26, 77,128,153,229,189, 7,160,143, 25,138, 31, 81, 75,206, 77,146, 81,157, 78, 55,173,228,189,247,218, 33, 62, 30,189,124,124,
+ 58,118,237,218, 21, 20,245, 74,208,244,241,241,105, 37,151,203, 11,148, 74,229,191, 80,147,218,224,161, 81, 82,164, 98,144,157,
+ 81, 19,126,250,224,193, 3,132,134,134,234, 21,172,250,106, 22,159,207,135, 88, 96,221, 44,162,197, 48, 53,207, 37,185, 92, 78,
+198,199,199, 59,251,251,251, 19, 0,224,239,239, 79, 60,124,248,208,209,202,202,170,216,215,215,215,228, 0, 88,108,107,135,221,
+211,198, 3, 0,190, 26, 52, 76, 63, 48, 58,255,245, 98,240,120, 60, 12, 92,176,248,181,235,158, 97, 24, 14, 44,176,144, 44, 51,
+184,200, 95, 69,178, 26, 43, 90,209,209,209,201,209,209,209,175,169, 99,205,132,105, 69,171,190,116,215, 92,212,221,172,134,176,
+113,227, 70,116,234,212,201,104, 71,180,101,203, 22,236,219,183,111, 35,128,140,102, 75,142, 3,187, 4, 98,211,241,100,159,246,
+129, 4, 0,172,252,124, 4, 89, 93, 93,141, 27, 55,110,192,206,206, 14,207,158,153,157,246,203,198,206,206,238,107,146, 36,199,
+113, 26,207, 0,104,154, 96,210, 12,195,196, 86, 84, 84, 24, 76,239,192,178, 0,165,213,161, 90,161,130, 70,163,193,231, 95,254,
+ 96,178, 16,209, 0, 65,105,228,220,136,190,225, 98, 67,138, 78,104,167,126,248,108,138,245,107,157, 55,135, 4, 72, 18,232, 28,
+ 90,163,184, 60,188,155, 12,134, 1,104, 6,112,118,117,192, 47, 7, 54, 24, 37,249, 58,154,169, 29, 29,211,168, 82,211, 8, 8,
+139,196,203,212,120,189,130, 36,224,215,184,140,249, 60, 30, 24,150,168,201,250, 96,136, 8, 9,196,222,101,210, 12,191,157,113,
+143,241,113,100, 39, 28,185,148,136,177,131,130,113,245, 78, 10,250,247,232,136,228,244, 44, 4,250,181,198,214, 93,177, 96, 89,
+200,127,220,180,186,224, 85,135,166,203, 54, 71,209,186,125,251,182,178,177,138, 85,255,157, 53,221, 31,130,101, 95, 41, 90, 74,
+149, 26, 11, 22,153,149,206,167,166,141,250,132,137,205, 57,216,152, 98,101, 14, 17,107,172,108,193, 68,122,150,182, 0,186, 1,
+ 11,255,147, 15, 78,154,166,113,230,204, 25,125,123, 52,213,142,245,219,206, 12,146,131,236,236,108, 36, 39, 39, 35, 44, 44, 12,
+ 21, 21, 21,224,145, 36,230, 63,126,140,142, 83,166, 64,195,231,131, 97, 24, 8, 4, 2,204,152, 49,195,236,250,108,230,211,185,
+ 54,152,155, 54,101,124, 67,120,120,120,187,180,234,106, 36, 63,121,130, 65, 43, 86, 0, 0,206,158, 61,219,224,154,152, 55,111,
+158, 32, 37, 37,229,195,251,247,239,127,152,159,159,191, 17,192,124,131,207, 89, 86,173,143,209,122,111,226, 24,180,243,111,139,
+125,191, 30,208,239,159,247,197, 28,240,120,124,240,248, 60,216,219,217,155,117, 54, 90,173, 86, 79, 90, 21, 10, 5,121,246,236,
+217,150,131, 7, 15,230,207,153, 51,135, 0,128,125,251,246,145,223,127,255,189,228,226,197,139,252, 22, 45, 90, 72, 77,146, 75,
+138,122,173,141, 9,130, 0,143,199, 3, 95,192, 7, 24, 6, 4, 65, 72,214,173, 91,183, 50, 57, 57,185,187,191,191, 63,212,106,
+245, 20,212, 76,212,176,228,209,178,144, 45,163, 92,164,169, 88,171, 90, 85,202, 16,100,245,227,182, 12, 17,181,250, 49, 91,120,
+179, 73, 25,230,197,104, 53, 5, 14,135, 99, 82,173, 34, 73,210,164,235,112,222,188,121,176,177,177, 49,212, 1,177,143, 31, 63,
+ 78,145, 74,165, 59, 1,252,240, 70,141,115, 57, 33,249,235,185,163,228,168,245,173,218,219,219, 23, 15, 24, 48,160, 10, 0,117,
+248,112,195, 1,178, 90,173, 54,216,129,219,217,217,125,253,243,207, 63,207, 30, 57,114, 36,217, 56,197, 64,125,247, 94,221, 75,
+171,213,226,240,225,195,179, 23, 46, 92,136,138,138,138,185,198, 58,113, 69,181, 18,202,218, 64,232,231, 73, 71,204,125,168, 27,
+220,101,109,239,129,150,109,131, 13,118, 38, 36,191, 38,134,200,205,235, 85, 7,102, 99, 35, 2,109,196, 38, 65,144, 25, 89, 57,
+249, 45, 90,185, 59,226,121,174, 12,110,173, 59,161, 44,239, 85, 61,112,185, 28,240,106, 93,135,246,182, 18,200,138,138, 64,146,
+ 28,163,196,120,245,254, 4,220, 73,202,194,209, 75, 15, 65,169,170,177,105,207,121, 80,234, 42, 80,170,106, 80,170,154,247,181,
+ 11, 63, 2, 65,160, 64,171,174,110,223,156,118,231,114,185,232,209,163,135, 65,162,147,151,151,103,166,162,197,234, 21, 45,165,
+170,153,109,100,222,200,201,168, 98, 85,183,255, 77,137, 65, 93,202, 7,177, 88,220,109,247,110,195,105, 28,154,130,187,187,251,
+ 57,107,107,235, 54,230, 30,223,140,228,165,107,237,237,237,191,246,247,247, 15,216,180,105, 19,143,195,225, 96,224,192,129,237,
+221,221,221,179, 1, 32, 48, 48,208,179,238, 25,243,233,167,159,178,183,111,223, 78,170, 25, 99, 24,134, 64, 32,120, 98,103,103,
+215,173,127,255,254,168,168,168, 64,110,110, 46, 36, 18, 9, 58,110,216,128,199,159,126,138,144,237,219, 65, 14, 24, 0,130, 32,
+ 32, 16, 8,240,248,241, 99,136,197,226, 39, 42,149,193,148,111, 61, 0,124, 11,160, 23, 94,185, 11, 89, 0, 55, 80,147,118,225,
+ 78, 19,207, 59, 18, 0,104,134, 49,213, 88, 19, 23, 44, 88,128,114, 30, 15, 24, 62, 28,252,140, 12, 80, 20,133,176,176, 48,189,
+202, 30, 22, 22, 6, 46,151,139,224,224, 96,120,122,122, 98,235,214,173, 19,141, 17, 45, 85, 21,133,236,140,151, 8, 15, 15,215,
+ 43, 87,195,135, 15,215, 43, 90, 60, 30, 79,175,108, 17,180,105,226, 74, 16, 4, 91,127,144, 76,211, 52,193,229,114,185,115,231,
+206, 37,198,140, 25,195,106, 52, 26, 70, 32, 16,144, 71,143, 30, 37,174, 94,189,202,173,174,174, 54, 57, 16, 15, 26, 53, 14, 95,
+ 13,126,171,230,222,111,227, 2, 30,159, 7, 1,159,143, 5, 79, 94,234,219,197,118,247, 65, 65, 76, 76,204, 88,127,127,255, 26,
+ 55, 60,192,181,228,209,178,192,132,208, 35,107, 68,146, 52,245,182,101, 0,136,218,109, 89, 61, 66, 37, 35, 8,226, 30,203,178,
+221, 27, 29, 91,183, 95,211,232,189,110,255,163, 55, 40,126,221, 90,135,175,145, 47, 99, 35,226,244, 91,183,110,249,117,237,218,
+ 21, 57, 57, 57,175,205,132,171,235,184, 36, 18, 9,196, 98, 49,110,222,188, 9, 0,233,134,140, 93,189,122,245,123,212,100, 93,
+174, 41,145,135, 71,120,255,247,250,221, 12, 29,214, 29,251,163, 15, 84, 72,165,210, 96,188,202,161, 67,120,122,122, 78,230, 9,
+184,227,125,130,188, 34,192, 48,223, 94, 62,125, 99,133,177, 51,244,105, 31, 88, 5, 64, 89, 55,235,240, 13,103, 31,130, 36,201,
+113, 35, 71,142, 36, 83, 82, 82, 48,126,252,120,236,219,183,207,224,177,147, 39, 79,198,193,131, 7, 49,114,228, 72,114,209,162,
+ 69, 6,211, 59, 52, 84, 75, 52,127,217, 69,153,246,236, 17,246, 30,252,217, 96, 12,146,171,107, 77, 60, 86, 81, 81,177,254,187,
+238, 93,141,123, 70, 24,157,230, 98,194,253,187,225, 61,251, 14,228,231, 22,150,131,209,169,161,146,191,250,189,162,188, 16,172,
+ 78, 5,190,149, 35,220,157,237,240,224,214,111, 26, 74,163,186,104,204,230,236,145,129,248,116, 68, 0,192, 50, 24, 53,255, 23,
+196,253, 48, 75, 63,130,238, 61,102, 14, 46, 31,254,206,236, 24,191,198,224,241,120,120,252,248,177,210,144,154,197,225,112,204,
+201,201, 85,171, 58,106,161, 80, 40,161, 80,170,254,202,103,135,139,155,155,219,143, 14, 14, 14, 34, 3, 68,202,197,197,197,229,
+ 71, 39, 39, 39,145,185,174, 67, 67, 36,171, 54,175,214,253,105,211,166, 53,139,108, 9,133,194, 54,233,233,233,250,100,165,198,
+222, 53, 26, 13,250,247,239,111,110,242,210,211, 0, 94,120,120,120,220,232,216,177,163,221,243,231,207,113,224,192, 1, 62,143,
+199,243,170,123,126,200,229,114,112, 56, 28, 20, 21, 21,105, 1,124, 0, 19,174, 51,181, 90, 29, 31, 31, 31,223,121,196,136, 17,
+156, 39, 79,158,128,195,225,212,148, 43, 60, 28, 33,219,183, 35,105,238, 92, 68,100,101, 65, 69, 81, 16,137, 68,184,112,225, 2,
+165, 80, 40,226, 13,217, 19,139,197, 59, 51, 51, 51, 3, 69, 34, 17, 40,138, 2,195, 48, 32, 73,146,224,114,185,189,237,237,237,
+183, 0,232,222,168,177, 92, 67,186,247,239, 64,235,116,180, 52,231,185,204, 84, 5,148,148,148,224,244,233,211, 8, 11, 11, 67,
+ 68, 68, 4,242,242,242,144,145,145,129,183,223,126, 91,127,204,163, 71,143,144,144,144, 0, 95, 95, 95,211,138, 30,169,133,111,
+135, 54,224,243,249, 53, 10, 17,143, 95, 59,240,225,233,149, 44, 62,143, 15, 30,151, 7,145, 88,100,182,162, 69, 16, 4, 72,146,
+ 4, 65, 16, 16,139,197,117,131,108,166,101,203,150,210,210,210, 82, 15, 0, 13, 3, 10, 12, 0, 0, 32, 0, 73, 68, 65, 84, 28,
+177, 88, 12,154,166,205, 26,180,212,245, 17,117, 36,139, 47,224,235,149, 45, 0, 40, 47, 47, 87,141, 28, 57,242, 95,106,181,250,
+125,188,217, 10, 37, 22,252,205, 64, 16,196,189,255,196,111,155,129,225,181,196,234,181,160,120, 99, 23,248,219, 61,123,246,220,
+ 62, 97,194,132,129,155, 55,111,134,181,181, 53,164, 82,169,190, 67, 20, 8, 4,104,213,170, 21, 74, 75, 75,177, 99,199, 14,188,
+124,249,242, 10,128, 25,230,150, 72, 42,149,222,126,246, 48,189,164,255,216,158, 78,129, 61, 59,216,231,166,191, 12,147, 74,165,
+ 55,107, 73,214, 47, 19,230,189,253,126,255,209,161,224, 11,120,200,125, 86,128,203,167,111,252,127,105, 76, 14,135,195, 33, 8,
+ 2,227,199,143, 55,235,248,127,252,227, 31,136,143,143,135, 49, 55, 35, 83,167,104, 41, 84,168, 86,254,117,131,181,207,102, 77,
+198,103,179, 38,235,201,132, 57,174, 23, 0,240,244, 60,100,132,104, 81,155,227, 14,237,248,184, 75,104,184,119,183,192, 54,184,
+115,255, 33,246,111,127, 37, 50,236,250,126, 37,190,217,117, 5,173,220, 28, 64,169,171,113,238,200, 79, 5,148, 90,177,249, 13,
+ 69,185, 26,114, 75, 16, 96, 89,166, 89,231, 94, 71,158,120, 60, 30,130,130,130, 12, 42, 90,165,165,165, 74, 83, 29,131,190,141,
+ 52, 90, 84, 85, 43,161, 84,252,101, 68, 43,164,119,239,222, 23, 99, 99, 99,157, 92, 93, 93,145,159,159,223,152,104,133,244,234,
+213,235, 98,108,108,172,147,155,155, 27,114,115,115,205, 78, 43,210, 4,201,130, 76, 38, 35,202,202,202, 24, 7, 7,135,102,145,
+ 45,146, 36,161, 86,171,145,154,154,106,238,223,154, 61, 67,204,206,206,110,247,193,131, 7,237,138,139,139,193,225,112,144,154,
+154,218, 96,214, 97,221,235,151, 95,126,225,143, 26, 53,234,231,242,242,114,163,211,218,116, 58,221,198,201,147, 39,127,152,151,
+151,231,224,234,234, 10,169, 84, 10,129, 64, 0,150,101, 65,244,239,143, 62, 47, 94,128,162,105,136,197, 98,164,165,165, 97,231,
+206,157,213,181,169, 98,154, 20,200, 8,130,240,227,243,249,152, 52,105, 82,131, 29,123,246,236,193, 59,221, 56,221, 92,236,184,
+ 85, 58,136,212,133,226,183,206,113, 56, 28, 34,164,199,128,246, 61,250, 14, 15,122,154,116,231,185,172,240,165,169,135,146, 86,
+163,209,192,223,223, 31,247,238,221,195,165, 75,151, 48, 96,192, 0, 68, 68, 68, 32, 49, 49, 17,191,253,246, 27, 18, 18, 18, 64,
+ 16, 4,156,156,156,234,194, 47,140,198, 96,104, 20, 58, 20,229,151,188,166, 94, 53,222,230,243,249, 80, 43, 41,179,218,232,201,
+147, 39,184,119,239,158, 62,181, 12,135,195,209, 77,153, 50, 5, 44,203,178,153,153,153,176,177,177, 97,167, 77,155, 70,115,185,
+ 92, 93, 94,158,121,241,193,117,164,170,142,100,113,249,188, 6, 4,141, 97, 24,121, 98, 98,226,199, 0, 18,107,149, 44,192,146,
+ 71,203,130,255,219, 56,131,215, 23,150, 54,169,104,189, 0, 48,232,192,129, 3, 19, 79,156, 56,177,113,203,150, 45, 46,145,145,
+145, 40, 43, 43,131,183,183, 55, 60, 60, 60, 16, 23, 23,135,179,103,207, 22,211, 52, 61, 31, 64, 83,210,207, 32, 24,201, 89,147,
+247, 92, 26,171,174,170,250,180,107, 68, 0,174, 28,254, 61,218,221,221,125, 6,135,195,249,124,218,226,119,223,239, 55,178, 59,
+210, 18, 50,113,251,183,199, 40,204, 41, 54,105,179,113, 48,188,189,189,253,135, 86, 86, 86, 2, 0, 84, 19,163,226,198,179, 14,
+245, 54,105,154,166, 53, 26, 13, 14, 29, 58,100, 22,217, 58,112,224, 0, 84, 42, 21,232,215,253,171,122,155, 44,195, 18, 92,158,
+ 16,158,173,252, 65, 81,213, 96,152, 55,158, 80,169,183, 89, 55, 2,125, 46, 16,192,181,184, 24,119,238,220, 49,143,114, 15, 31,
+110,170,141, 84, 26,149,124,210,119,107, 22,196,205,140,250,214,126, 64,207,206,248,106,195, 30, 80,212, 46,144, 28, 18, 98, 33,
+ 31, 93, 67,123,129, 3, 53,126,140,249,162, 92, 81, 89, 54, 9,175, 47,197,211,192, 38,107,204,195,194, 2, 52,195,224,210,245,
+187,102,159,187,190,183,167,105,112,185, 92, 60,123,246, 76,217,212,108, 67, 14,167,198,205, 89, 55, 82, 55,102,147,101, 24,130,
+199, 23,161,149,119, 71,104,212, 85,127, 73, 27,185,186,186,126,113,252,248,113,167,186, 84, 9,137,137,137, 32, 8, 34,245,149,
+226, 88,179, 95,169, 84, 34, 41, 41, 9,137,137,137, 64,205, 12, 55,179,239,163, 58, 37, 75, 38,147, 17, 82,169, 20, 86, 86, 86,
+100, 98, 98,162, 58, 56, 56,248,190,137,251, 91,111, 83,165, 82,101, 25,138,159, 84,169, 84, 45, 68, 34, 17,175, 81, 39,234,217,
+174, 93,187,180, 38, 92,136,175,149,179,162,162,226,206,194,133, 11,187, 14, 27, 54, 12, 95,124,241, 69,169,131,131,131,205,143,
+ 63,254,200,229,112, 56,196,204,153, 51,233,162,162,162,170,159,126,250,201,238,196,137, 19, 40, 47, 47,191,105,198,185,203, 85,
+ 42,213,199, 61,123,246,220,115,254,252,121, 43, 63, 63, 63, 84, 86, 86,130,101, 89,236,222,189, 27, 51,103,206,132, 72, 36, 66,
+ 90, 90, 26,222,121,231, 29,133, 66,161,248, 24,175,199, 78,214,217, 36, 8,130, 96, 25,134,193,178,101,203,244,201, 73,235,146,
+149,218,136, 9,236,156,215, 86, 50,231,167, 10,201,196,175,126,154, 2, 0,180, 78, 71, 63, 77,186,243,124,247, 15, 95, 93,229,
+243,249,215, 77,180,209,146, 57,115,230,252, 56,124,248,112,177,181,181, 53, 74, 75, 75,113,227,198, 13,220,186,117, 11,183,111,
+223,134, 70,163,129,147,147, 19, 28, 28, 28, 32,149, 74,241,228,201, 19, 37,128, 37,198,108, 10,172,120,240,105, 95, 55,243,183,
+ 70,193,226,213,155,109, 88, 95,221,226,243,120,102,221, 71,125,251,246, 69,143, 30, 61,234, 8, 16,157,157,157, 45, 85,171,213,
+ 68, 61,210,159, 87, 71,200,189,188,188,116,251,246,237, 99,141,217,188,189,115, 43,206,175, 90, 2, 1,159,143,249,169,185,122,
+210,181,103, 64, 23,240, 4,124, 4,140, 24, 83,255,183,219, 80,227, 46, 68, 35,146,101,172,239,248,211,247,166,197,230,127,173,
+205,255,203,144,226, 13,150,224,169,195,126,149, 74,117,238,163,143, 62,138, 9, 9, 9,249,104,211,166, 77, 4,159,207,199,138,
+ 21, 43,216,252,252,252, 95,107, 71, 33,101,111, 82, 42,150,101,127,189,118,236,230, 39, 83,163, 70, 18,243, 54, 79,235,125,255,
+114,210,147, 78, 61,253,208,169,167, 31,238, 95, 73,193, 15,139, 15,236,163,181,244,178,130,130,130, 28, 19,166,212,131,122,117,
+104, 28, 12,239, 20,127,245,178, 83,115,103, 29, 50, 12, 19,123,224,192,129,217,163, 71,143, 38,239,222,189,251, 90, 76, 86,221,
+178, 59, 12,195,224,226,197,139,160, 40, 10,191,254,250, 43,195, 48,140,225, 60, 90, 96, 79,126,183, 57,102,234,175,123, 79, 10,
+ 4,124, 2,183,174, 31, 69, 69,153,241, 89, 93,124, 62, 15,191,236, 62, 70,241,249,188,167, 77,237,167, 40, 42,247,242,229,203,
+110, 67,105,154, 71,146,100, 83, 4,170, 73,196,198,198,106, 25,134,201, 54,113,216,205,194,151, 57, 35, 86,127,241,193,129,225,
+239,125,228,214,179,103,111,158,179,171, 27, 8,130, 64, 81, 97, 17,210,146,238,106,207, 29,253,185,176, 90, 97,222, 18, 60, 31,
+172,191,166,143,201, 2,128,200,153, 91,244,241, 89, 0, 48, 98,218, 66,244, 15, 11, 4, 97,142,244,244,138,100, 49, 58,157, 14,
+ 18,137, 4, 58,157,174,201, 20, 15,118,118,118, 98,149, 74,165,172, 77,196,104, 84, 42, 98,129,191,188,141,104,154, 14, 40, 43,
+ 43, 67,117,117, 53,110,221,186,197,174, 89,179, 70, 38,147,201,244, 65,155, 90,173, 54,160,180,180, 20, 85, 85, 85,184,121,243,
+ 38, 27, 19, 19, 35, 43, 41, 41, 89,220,156,123, 72, 44, 22,119,227,114,185,247,203,202,202, 24, 43, 43, 43, 82,171,213,106,131,
+131,131,133, 98,177,216,236, 5,213,165, 82,233, 48, 67,251,124,124,124,210,211,211,211,219,209, 52, 93,127, 13, 68,190, 74,165,
+242,235,217,179,167, 57,207,143, 57,187,118,237,194,177, 99,199, 66, 43, 43, 43, 39,103,103,103,239, 1, 16,202,229,114,241,240,
+225,195, 84,149, 74, 53, 97,244,232,209,187,203,202,202,238,160,102, 9, 30,115,112, 62, 45, 45,109, 82, 64, 64,192,174,175,191,
+254,218, 58, 34, 34,130,235,233,233,137,238,221,187, 35, 45, 45, 13,103,206,156,209,110,219,182,173, 90,161, 80,124, 0,224,162,
+241,102, 7,161,211,233, 32, 16, 8,244, 47,161, 80, 8, 62,159, 15,185,146,197,244, 13, 25, 74, 29,196,202,141, 43, 62, 62,195,
+ 2, 68, 65,110, 70,113, 81, 65,238, 29,130, 32,174, 75,165,210, 10, 3,117, 38, 80,169, 84,157, 89,150,229, 16, 4,177,153,162,
+168,105,179,102,205,242, 88,187,118, 45, 58,116,232,128,226,226, 98, 72, 36, 18,248,249,249, 65, 38,147,225,238,221,187,180, 66,
+161,216, 14, 96, 37,106,227, 71, 12,161,188,184, 18, 45,221,189, 26, 40,159, 44,203,130,165, 1,173,154, 6, 77,177,208, 16, 90,
+240,120, 90,240,249,124,115,148, 39,150, 97, 24,148,121,120,128, 73, 74,194,237,219,183,193,178,172, 65, 85,205,223,223,223,140,
+ 7, 59, 3,129, 80,208,192, 93, 72, 16, 4,248, 2, 1,120, 2,126, 83, 51,103, 44, 42,150, 5,255,211, 48,215, 55, 94, 14, 96,
+198,163, 71,143,246,244,235,215, 47,142,101, 89, 30,106,252,145,191,255,153, 63, 47, 40, 40,120,112,243,204,131, 69,110, 45, 29,
+ 98,222,154,220, 27, 29, 58,123,131,214,209,184,113,246, 33,126, 93,123,226, 96, 94,110,222, 52,152,177,246, 25,195, 48, 87,123,
+117,235, 64,162, 94,174,110, 79, 79, 79,230, 77,102, 29, 86, 84, 84, 44,159, 63,127, 62,190,248,226,139, 55,153,117,216, 36, 30,
+ 63,145,205, 32,192,182, 28,241, 86,159,161, 32, 72, 86,163, 81, 27,121,240, 65,159,185,148,207,231, 61,189,151, 40, 13,110,234,
+ 56,153, 76, 54,244,253,247,223,191,200,229,114,219, 52,167,206, 25,134,201, 46, 44, 44, 28,104,250, 72,221, 13,181,178,210,239,
+244,193, 29,115,207, 31,219, 53,148, 97,104, 95, 2, 0,135,203,127,174,165,168, 11,106,101,229, 38,152,185,168,244,186, 25,225,
+152,243,221,111,216,250,197, 8,204,138, 57,140,159,151, 77,199,162, 13, 7,240,237, 23,115,176,102,203,191,240,213,156, 73, 24,
+ 59,241,125,134, 37,200, 63,204, 61, 15, 14,135,115,126,199,142, 29, 83,167, 79,159,174,159,180,192,178,108,131, 7,187, 86,171,
+ 85, 50, 12,131,237,219,183, 51, 0,206, 27,179,215,176,141, 8,214, 88,188,148,185,109, 84, 89, 89,249, 65,120,120,248,110, 0,
+ 66,150,101,159,149,149,149,253, 19,120,181, 52, 84, 85, 85,213, 7, 61,123,246,220,205,178,172,144, 32,136,215,246,155,131,218,
+ 84, 15,221, 28, 28, 28,238,215, 42, 89,194, 55, 9,136, 55, 86,213, 70,220,138,230,184, 16, 25, 0,179,234,101,124, 95, 27, 26,
+ 26, 90,127, 81,233,212,178,178,178,110,111, 80,174,139, 74,165, 50,112,217,178,101,115, 69, 34, 81,127,133, 66,209, 30, 0, 36,
+ 18, 73,154, 90,173,190,170, 84, 42, 55,193,116,110, 42, 13,195, 48,105, 58,157, 46,200,197,197,165,102, 70,109, 45,217, 2,128,
+ 83,247,233,251, 0,221,189, 70, 20,223,111,118,193,206,158, 61,219,218,193,193, 97, 8, 65, 16, 99, 89,150,245,151,203,229,234,
+101,203,150,221,140,141,141,173,104,211,166,205, 91,195,135, 15, 39, 28, 29, 29,113,239,222, 61,182,164,164,228, 40,128,197, 48,
+ 99,166, 53,195, 48,217,235,214,173, 67,115,239,119, 99,251, 41,138, 42, 56,123,246,172,243,176,162, 34, 46,195, 48, 24, 49, 98,
+ 68, 3, 2,215, 24, 79,159, 62,133, 90,173, 54,154,204, 81, 93, 81,134, 1,115, 23, 2,181,179, 63,235, 80,163,100,177, 96, 53,
+ 22, 94,101,193,223, 11,255,238, 5, 61,205,146, 22, 61, 60, 60,198,139, 36,194,207,188,219,123, 4,231,103, 20,165,200, 43, 20,
+251,164, 82,233, 14, 3, 15,114,179,108, 54, 51, 97,169, 69,254,253, 55,217,124,149, 71,139, 6,203,210, 96, 25, 22, 44,203,128,
+ 97,232,154, 5,175, 89, 6, 44, 77, 19, 4,129, 63, 52, 74,163,153,193, 27,151,211,193,217,217,121, 37,203,178,195, 56, 28, 14,
+ 89, 95, 12,171,255,185, 86,201, 58, 47,147,201,190,106, 66,121,253, 63, 87,159,177,177,177, 77,146,127,115,103, 29,142, 27, 55,
+142,110,230,189,121, 85, 34,145,120, 52,181,175,186,186, 58, 71, 42,149, 14,249, 47,169,207,250, 51, 6,155, 99,179,217,179, 14,
+ 77,217,244,246,246, 22, 82, 20,213, 5,128, 31, 65, 16,246, 0, 74, 41,138,186, 80, 92, 92, 92, 8,160, 27,128,101,181,191, 89,
+ 5,224,254,127,248,126, 23, 59, 59, 59,239, 34, 73,178,165, 57, 63,214,233,116,154,210,210,210,169,141, 6, 4,122,155, 78, 78,
+ 78,247,185, 92,110, 75, 51,236,188, 44, 41, 41,233,102,121,126, 90,108,254, 15,161,113, 16,188,193, 76,241,255, 14,162,101,177,
+105,177,105,177,105,177,105,177,105,177,105,177,105,177,249,191, 78,180,154,220,182, 76,171,181,192, 2, 11, 44,176,192, 2, 11,
+ 44,248,115, 56,211,136,108,157,169,251, 64, 24, 97,165,205,145, 4,223,132,217, 94,178,216,180,216,180,216,180,216,180,216,180,
+216,180,216,252,219,217,180,224, 47,132, 69, 86,181,216,180,216,180,216,180,216,180,216,180,216,180,216,252, 95,135, 65,215, 33,
+105,169, 27, 11, 44,176,192, 2, 11, 44,176,192,130,127, 15,204, 38, 90, 18, 55,255, 0,103,239,224,221, 14, 45, 59, 37, 58,180,
+236,148,232,236, 29,188, 91,226,230, 31,240, 55,173, 55, 49,128,137, 92, 46,247,162,187,187,123, 37, 12, 44,189,243, 63, 0, 91,
+ 0, 99, 81,147,223,103, 20, 0,171,191,210,120, 4,192, 29, 15,124, 54, 5,200,153, 2,228,140, 7, 62,139,248, 31,140, 27, 92,
+ 49,219, 35,252,250,185,137,231, 86,204,246, 8,111,114,255,124, 15,167,219,191,141,251,110,237,103,158,142,127,209, 95,218,184,
+186,186,238,116,115,115,203,114,117,117,205,118,117,117,221, 5,192,206,242,184,179,192, 2, 11, 44,248,183,161, 46, 70,171,238,
+165,143,209,226, 2, 64, 92, 92, 92, 4,128,107, 0,250, 69, 70, 70,198, 55,254,181,131, 87,208,116,223,182,190, 95,172, 94,177,
+152,112,119,117,182,210,209, 12,149,153,149,219,113,249,234,152, 35,249, 2,238,198,178,156,164,159,223,160, 80, 4,135,195, 25,
+ 47, 20, 10, 35, 1,212, 17,182, 84,181, 90, 29, 71,211,244, 33,152, 55, 77, 27,110,110,110,215, 57, 28, 78,235,230,252, 49, 77,
+211, 57,133,133,133,189,223,176, 50,199,121,121,121,237,138,136,136,176, 10, 13, 13,133, 64, 32,192,178,101,203,230, 75,165,210,
+ 77,230, 26,112,112,240,177,161,132,162,207,185, 2,193, 96, 86,171, 9, 98,193, 2,164, 48,137,209,169, 47,243,213,234,141,101,
+101, 25,114, 51, 77, 45, 6, 48,173,182,174,126, 6,176,238,207, 92, 37, 83, 59, 67,171,165,107,174, 9, 62, 23,244,201, 23,118,
+215,150, 44, 89,194,141,140,140,196,207, 63,255,220,123,231,206,157, 31,203,229,242,203, 0, 78, 1,120,254,103,175, 74, 55, 96,
+ 70,207,222,189,191,155, 58,127, 62, 71,121,253, 58,190,219,181,107, 51,106,242, 45,109,109,238,181,196,231, 99,172,179, 51, 47,
+146,101,209,133, 0, 8, 2,120, 40, 43, 97,206, 82, 20,125, 8,102,228, 98, 51,130,137,104, 56, 29,127,127,115, 13, 84, 60,103,
+151, 10, 71, 4,244,169,120,126,117, 41,128,183, 26,239,215,169, 68, 83, 89, 78,171, 72, 37,155,144, 11, 96,195,159,172, 86, 43,
+ 23, 23,151,196,147, 39, 79,182, 12, 13, 13,229, 2,192,253,251,247,167, 68, 70, 70, 14,144,201,100, 65, 0, 42,255, 67, 15, 33,
+ 17,151, 36, 63, 19,240,120,131,105,154,238, 4, 0, 28, 14,231,177, 70,171,189,168, 99,152,173, 48, 51, 39,155, 5, 22, 88,240,
+191, 11, 83, 92,228,191, 28, 6, 51,195,215,157, 28, 91,255,189, 62, 36,174, 29, 58,134, 13, 28,243,180, 66,174, 80,101,101,229,
+149,205,251,108,205,197,143,231,172, 63,177,225,167,184,179,241,119, 82,111, 7,132, 14, 73,145,184,118,232,104,192,180, 33, 31,
+174,151, 88, 44,126,176,109,219, 54, 42, 45, 45,141, 45, 47, 47,103,159, 62,125,202, 30, 61,122,148,253,228,147, 79, 84, 98,177,
+248, 1, 0, 47,115,108,186,185,185, 21, 62,189,242, 27,251, 50, 49,129,205,190,127,135,213,106,181, 44, 69, 81, 44, 69, 81,108,
+202,249, 56, 54,241,212, 49,246,225,209, 67,172, 70,163, 97, 53, 26, 13,171, 86,171,217,182,109,219,230,155, 89,206,198,240, 12,
+ 12, 12,212,196,197,197,177, 71,142, 28, 97,231,207,159,207,134,132,132,208, 0,102,154,123,238, 18, 87,191,254, 54, 45,130,101,
+211,163,182, 82,103,110, 94, 96,147, 95, 60,100,147, 95,164,179,177,151, 82,217,105, 11,182, 80, 54, 45, 66,100, 18, 87,191,254,
+166,206,221,193,193, 33,140, 32, 8,182, 14, 0,216,214,173, 91, 87,213,127,121,121,121, 53,120,181,106,213,170,170, 77,155, 54,
+207,157,156,156,186, 52,101,115, 66, 39,176,108,202,126,150, 77,217,207, 46,233, 11, 54, 57, 57,249, 54,203,178,215,234, 94, 74,
+165,242,218,241,227,199,175,189,251,238,187,215, 0,188, 99,164,158,204,170,207, 41, 64,142,252,228, 73,150,221,180,137,101, 35,
+ 34,216, 84,128,157, 2,228, 52,211,102, 91,119,119,222,195,245,235, 62,214,156, 60,249, 43,123,238,220, 25,246,236,217, 56,246,
+196,241, 93,236,230, 77,159, 81,110,110,188, 36, 0,237,154, 97,147, 11, 96, 13,128,141,168, 81, 46,211,100, 50, 25, 91, 80, 80,
+192, 2, 72,171,253,110,163,139,139,203, 6, 52,173,190, 13,170,175,100,205, 29,230,126,238,189,183,122,179,242,138,124,246,189,
+183,122,179,115,135,185, 55, 80,182,134,249,248,216,204, 26,209, 73,150,124,127, 31, 61,107, 68, 39,217, 48, 31, 31,155, 55,172,
+ 79, 2, 53,235,132,110,187,114,229,138,142,173, 7,173, 86,203,238,217,179,135,118,112,112,248,181, 25, 54,219,187,184,184,100,
+ 59, 58, 58,166,213,255,210, 37,120, 84, 79,255, 62, 83,150, 59,117,124, 55,162, 25,229, 12, 21,241,249, 47, 47, 30,254,145, 46,
+201,121,204,106,148,133,108,197,179, 4,246,101,234,109,118,207,142,141, 90, 1,151,251, 18, 64,232,159,185,150,154, 9,139, 77,
+139, 77,139,205,255, 66,155,198,184,200,255,101,112, 27,159, 96, 99, 8,133,130,168,229, 75, 22, 18,229, 37,229, 74, 85,165, 92,
+163, 85,169, 84, 36,159, 85, 61, 78,121, 81, 68,114, 57,229,115,231,204,182,137, 90,180, 36,170, 26,152,100,230,127,122,133,132,
+132,220, 61,118,236,152,171,163,163, 35, 42, 42, 42, 80, 82, 82,130,187,119,239,130,101, 89,140, 30, 61, 90,216,163,123,247, 46,
+ 75,151, 45,187,245, 50, 47, 47, 28,134, 59,222, 87,228,197,209, 25,235,122,215,172, 69,251, 85, 86, 73, 77,175, 67, 16,216, 57,
+ 46, 82,127,204,202,151, 53,171,101,136, 68, 34,253,130,196,111,128,240,129, 3, 7,242, 1,224,195, 15, 63,172,148,203,229,209,
+181, 10,135, 89, 43,173, 74, 92,253,250, 59,123,120,198,253,184,125,157,184,147,175, 31, 40,173, 14,217, 5,249,224,242,236,209,
+178, 37, 31,239, 79, 26,204,235,219,211,209,121,205,170,157,103, 10, 24,140, 82, 20,167, 95, 48,100,203,222,222,126,207,161, 67,
+135,112,248,240, 97, 0, 64, 90, 90, 26,252,252,252, 36,166,202,144,148,148,228,243,206, 59,239, 28, 44, 41, 41,105,103,234,216,
+198,137,241,133, 66, 33,122,247,238,141,142, 29, 59,226,228,201,147,253,106,149,173, 63, 5,229,245,235,176,126,244, 8,136,127,
+163,193, 75,219,174, 93,189,111,159, 61,179,207,249,204,217, 84,108,216,176, 11,207,159,215, 8,109, 62, 62, 62,152, 56, 97, 28,
+239,241,227,155,129, 99,199, 78,188,249,251,239,207,123,215, 18, 37, 83,248,250,167,159,126, 90,220,166, 77, 27,140, 29, 59,118,
+ 92, 96, 96,160,187,173,173, 45,118,236,216, 1, 15, 15, 15, 31,141, 70,243,236,228,201,147,158, 5, 5, 5,152, 61,123, 54, 10,
+ 11, 11,231, 27, 50,212,111,104,191,165,194, 17, 1,125, 58,116,157, 10,107, 91, 15,252,116,224, 16,158, 62,216,211, 71, 77,165,
+ 46,229,211,241,147,149,172,112,154, 44,199, 58,170,117,183, 8,167,118,129,239,192,187,107,130,179,138,254,253,197,210,193,109,
+ 99,184, 34,213,158, 21, 27,164, 37,175, 25, 29, 27,203, 9,170,124,226,152,116, 17, 37,192, 10,166,142, 96,233,213, 90, 22,239,
+244,237,219, 87,223,112, 89, 89, 89, 80,171,213, 8, 8, 8, 32, 53, 26, 77,127, 51,235,181,253,144, 33, 67,254, 56,123,246,172,
+ 83,251,246,237,101,165,165,165,250, 29,238, 78,246, 67,227,143,109,158,189,230,187,127,249,239,101,137,114, 89,234,137,199, 38,
+108,133,246, 10,235,122,233,220,177,125,214, 68, 85, 46, 4,246,197, 0, 83,130,140,131,191,128,176,114,196,248, 79,230,113,251,
+ 15, 28,208, 98,240, 91, 99, 46, 61, 77,127, 62, 16,192, 61,203,184,222, 2, 11,254,214,170, 22,251,191,118, 78,122,162, 21, 25,
+ 25, 73, 52,117,130, 12,203, 4,187,185, 58,137, 55,175,223,125,143, 67,105, 52, 18,123, 59, 13,207,206,150, 33,108,236, 56,148,
+ 70, 91,229,237,227, 45, 96, 88, 38,216,128,253,198, 83, 60, 9,177, 88,124,236,212,169, 83,174, 60, 30, 15, 12,195,192,197,197,
+ 5,153,153,153, 40, 47, 47,135, 92, 46,199,243,212, 84,180,241,106,133, 21, 81, 11, 61,102, 47,140, 58,166, 80, 40,186,161,161,
+ 27,241,181,105,163,180,182,225,186,209,117, 75,176,188, 54,228,175,253,174,137,125,230, 78, 69,205,204,201,201,129,181,181, 53,
+130,130,130,172,111,220,184,241,187, 17,146,213,192,166,131,131,143, 13, 35, 20, 28,222,246,227, 50, 49,165, 77, 66, 74, 70, 41,
+ 58,180,233, 3, 55, 39, 47,228,151,106,112,251,238, 41, 36, 37,238,135,111, 11, 47,204,252,100,128, 40,102,221,145, 67,124, 93,
+ 27,175,242,242,204,202,166,108, 86, 86, 86, 90,183,109,219, 22, 94, 94, 53,235,158,209, 52,141,148,148, 20,208, 52,173,223,174,
+255,190,251,232, 21,232, 42,179, 49,117,202, 20,148,148,148, 88, 55,101,147,199,129,110,222,199, 19,185, 98, 30, 32,144, 56,106,
+170,170,170,244,203,112, 80, 20,133,135, 15, 31, 34, 60, 60, 60, 34, 54, 54,214, 20, 43, 50,171, 62, 41,224,219,239,126,253,117,
+203,164,138, 10, 18, 0,126, 38, 8,134, 98,217,111,205,189,150, 92, 93,121, 71,207,159,219,235,204, 33,159,192,209,238, 27,220,
+189,155, 13,138,170, 41,111, 73, 73, 17,102,125, 86, 9, 62,207, 6, 39, 79,254,203, 41, 32,160,247,209,130, 2, 42, 8, 13,221,
+136, 77,149, 83,116,238,220, 57,204,154, 53, 11, 41, 41, 41,158, 28, 14, 7,119,238,220,129, 88, 44,198,250,245,235, 57, 1, 1,
+ 1,158, 18,137, 4,231,207,159, 71, 97, 97, 33, 97,172,156,215, 46, 92, 91, 93,241,252,234,210, 2,226,252,176,159, 14, 28,194,
+ 71, 19,198,195,157,205,248,221,206,151, 88, 61,100, 68,175,175, 88, 78,171, 72,137, 77,176,131, 95,208, 8,240, 5,214,152,249,
+229, 74,164, 37,157,118, 80,200, 19, 63, 35,232,220, 86, 43, 54,196,206,121,173,156, 71,198,209, 31,238,191,209,245,162,215, 61,
+239, 71, 15, 63,190, 35, 77,216,153,248,138,104,249,112, 9,146,182, 3,106,150, 79,121,246,236, 25,158, 63,127, 14, 46,151, 11,
+165, 82, 9,157, 78,215,100, 57, 61, 61, 61,103,232,116,186,175,106,219,121,183, 72, 36,250, 96,223,190,125, 78,245,137,182, 75,
+240,168,158, 78, 54,146,129,133, 69, 37,101, 55,239, 37, 63,157, 55, 99,108,191,235,183,147,114, 41,222,187, 57, 21,137, 39, 43,
+ 12,212,167, 72, 44, 16, 28, 61,127,252, 95,214,218, 23, 87, 32, 9,232, 7,158,181, 31,104,109, 30, 20,101,213,144, 63,151, 66,
+253,227, 15,232,252,217, 92,156, 62,113,196, 58,176, 83,183, 88,181, 86,235, 7, 64,243, 6,247,102,115, 96,177,105,177,105,177,
+249,223,105,211, 32, 23, 97, 89,182, 43, 0,183,218,205,146, 90, 94,224, 12,160, 24, 53,171,200,184,213, 62, 59, 4,245,126,214,
+120,187,254,177,141,183,235,127, 46,169,253,236, 90,251,126,143, 32,136, 82, 19, 69,247, 64,205,210,132,103,106,223,129, 90, 87,
+162,201,192, 99,130, 32, 43,105,154, 17,242, 93, 92, 85, 31,190, 55,176,211,111,151,238, 63,180,114,182,229, 14,237,215, 37,226,
+238,227, 23,183, 8,146,208, 18, 4,105, 86,220, 7,135,195, 25,191,121,243,230, 78,182,182,182, 96, 24, 6,118,118,118,144,201,
+100,208,104, 52,168,168,168,128, 90, 94, 9, 74, 94,137, 71,185, 89,232, 21,209, 15, 99,134, 13, 9,248,215,137, 83,227,105,154,
+ 62,104,204,174,103,112, 23,189,146,181,178,181,211, 43,105, 34,183, 92, 79,186,190,233,226, 7,190,181, 53, 6,207,139,250, 51,
+215, 64,194,153, 51,103,206,141, 30, 61,250,173, 5, 11, 22,144, 82,169,244,124,102,102,102, 47, 0, 41, 38, 73,133, 80,244,249,
+167,159, 71, 58, 56, 88,179,136,189,120, 10,125,187, 76,128,149,128,131,146, 74, 10, 4, 1,164, 38, 31, 3, 65, 56, 34, 49, 77,
+138, 62,157,109, 49,100,104,128,245,137, 35,169, 11,240, 42, 62,232,181,166, 41, 43, 43, 67, 81, 81, 17,180, 90, 45,180, 90, 45,
+198,142, 27,135,189,123,246,160,186,186, 26, 74,165, 18, 26,141, 6, 52, 77,131, 36, 73, 92,140,139, 69,238,139, 84,244, 12, 15,
+ 7, 12, 44,189,180,231, 33,120, 0,110, 63,125,250, 20,169,169,169,120,249,242, 37, 68, 34, 17,220,221,221,177,114,229, 74,168,
+213, 53,107,148,141, 27, 55, 46, 2,192,227, 63,123, 67, 61, 7,118,102,210,244,210,183,142, 31,119,189,113,252, 56,115,251,244,
+233,151, 66,185,124,135, 57,191,229,243, 49,118,221,183,159,116,144, 72, 36,120,153,179, 25,254,254,124,204,159,235,132,232,111,
+138, 1, 0,179,103,181, 68,247,110,206,168, 44, 63, 2,103,215,197,216,178,101,142,239,180,105, 27,167, 40, 20,244,110, 19,166,
+151,158, 58,117,106,140,159,159, 95,139,132,132, 4, 66, 32, 16, 64, 44, 22, 67, 44, 22, 67, 36, 18,161,168,168, 8,153,153,153,
+236,186,117,235,242, 0, 44, 53,102,104,197, 22,233, 45, 0,111,205, 29,134,115, 79, 31,236,233,211,130,243,226,209,152,153,189,
+179, 18,111, 39,200,127,187,120, 99,149, 78, 37,202, 45,127,121,105, 97,219,238, 9,206,159,125,241, 53,126, 88,183, 28, 79,239,
+ 92, 47,117,243,170,220, 42, 38,212, 77,150, 51, 34, 98, 5,215,195,205, 81, 55, 99,218, 24,251,211,110, 55,103,156,229, 18,178,
+130,226, 7,235,145,153,160, 20,182,235, 50,185,189, 15,169,185,114,229,138,184,111,223,190, 80,169, 84,122,101,114,223,190,125,
+140, 78,167,187,218,228,181, 73, 81, 95,229,229,229,121, 40,149, 74, 12, 27, 54,108,246,250,245,235, 37,117,107,212,209, 52,221,
+ 64,201, 90,189,105,239,133,207,191,218,122,245,194,193,111, 60, 87, 71,125,208,111,210,204, 53, 87, 97, 96, 29, 73, 46, 73,126,
+118,250,248, 46,119,145,131, 22, 98,199, 33, 80, 21, 42,241,116,231, 71, 80, 84,170,208,125,245,215, 0, 4,208,104, 73,236, 24,
+ 49, 22, 60, 39, 79, 44,159,254,129,231,146, 29, 63,125,194, 48,204,102,203,184,222, 2, 11, 44,104, 4, 55,130, 32,226, 0, 32,
+ 42, 42,106,113,116,116,116, 50, 65, 16,113, 44,203, 70,214, 10, 40,113, 44,203, 70,214, 29, 83, 75,206, 94,219,174, 59,182,241,
+118,227,207,139, 22, 45, 10,140,137,137, 89, 27, 30, 30,126,240,230,205,155, 47, 0,152, 34, 90,195,107,137,213,107, 75,239,144,
+117, 12,178,254,123, 3, 69,139, 97,174, 63,123,145,165, 24, 50,168, 71,203,184,248,199,247,222,127,127,248,192,241, 35,250, 14,
+205,204, 41, 73,245,245,118,119, 78, 78,126,108,203, 48,204,117,115,106, 73, 40, 20, 70, 14, 24, 48,128, 91, 86, 86, 6, 43, 43,
+ 43,200,100, 50,228,229,229,129,162, 40,168, 42,202,161,174, 40,135,170,188, 12, 84, 69, 25,158,223,191,139, 96, 95, 31, 97,109,
+176,188, 81,212,169, 46,141,149,170,250,202,150,192,198, 6, 66, 27, 27, 16,205,119, 27,190,107,111,111,127,187,174, 83,165, 40,
+234,179,133, 11, 23, 22, 51, 12,131, 53,107,214,216, 90, 91, 91,199, 2, 16,154, 50, 98,227,194,137, 12,239, 28, 68, 62,201, 76,
+ 68,239,144,169,104,223,246,109,100, 22, 42, 81, 44,167, 80, 84, 78,161,123,223,239,209, 58,228,107,180,234, 28,141,212,236, 82,
+120,182,240, 35,193, 21, 26, 93,252, 57, 55, 55,183,193,246,193, 3, 7,160, 80, 40,224,235,235,139, 9, 19, 38, 96,225,194,133,
+152, 48, 97, 2, 60, 61, 61, 49,233,189,119,176,124,249,114, 20, 20, 20,152, 42,170,186,125,251,246,106,111,111,111,181,183,183,
+183,154,162, 40, 84, 85, 85,161,188,188,188,113,125,207,105,110, 69,186,186,186, 46,114,119,119, 79,116,117,117, 77, 22, 10,133,
+103, 31, 18,196, 19,149,183,183, 91,175,145, 35,137,142,239,189,199,201, 22,139,137,120,192,218, 28, 91,206,142,188,225,253, 7,
+188, 37, 40, 47,219,165, 23,169, 62,120,223, 5,127,196, 7,226,198,239,221, 48,235, 51, 95, 16,164, 8, 4, 41,128,162,250, 10,
+122,132,134,243,237,237, 9, 83,215,210, 68, 0, 15,123,245,234,229, 57,115,230, 76, 66, 40, 20, 98,246,236,217,212,244,233,211,
+211, 39, 76,152,144,126,249,242,101,218,219,219, 27,173, 90,181, 34, 90,181,106,229, 1,224, 97,237,111,140,194,214,151, 88,173,
+166, 82,127,183,247,147,188,160,225,220,179, 74, 43, 28,187, 98,131,180,100,245,182, 23, 27, 50,159, 42,124,158,222,185, 94,146,
+158,116,154,201,188,119,173, 56, 63, 93,238,179,122,219,139, 13,139,183,230, 55,121, 83,199,199,131, 57, 22, 23, 79, 41,170, 21,
+220,145, 35,250, 43,102,124, 56,190,189,163,117,224, 62,180, 24, 18,210,218,171,229,164,229,107,183, 80,211, 63,249,156,250,249,
+151, 93,172, 92, 46, 71,101,101, 37,182,108,217,162, 59,125,250,116, 30, 77,211,159, 27, 26, 3, 1,128, 86,171,197,140, 25, 51,
+ 36,182,182,182,200,205,205,213, 43,162, 0, 32,149,149, 60,190,113, 47,233,201,188,127,142,139,168, 86,171,213, 23,174,221, 79,
+237,232,231,221,146, 32, 88,131, 19, 81, 4, 60,222,224,110, 61,122,112, 88,182, 28, 4,215, 11,207,247,172, 67,101, 65, 41, 42,
+139, 74,193,225, 73,160,131, 16, 90, 70, 0,251,224, 80,164,221, 75, 64, 11, 23, 55,174,144,199, 27,106,233, 79, 44,176,224,239,
+ 9, 99, 92,164, 62, 89,138,137,137, 89,107,108,127,189,119, 77,163,109, 61,145,106, 76,194,234,127, 6,128,152,152,152,181, 44,
+203, 70,222,188,121,243, 0, 0,165,153,167,240,113,189,119,243,243,104,113, 84,154,232, 5, 11,151,194,193, 78,108, 23,218,197,
+207,253,228,249,248,251,215,111,222, 79,109,221,202,217,133,213,106, 28,190,221,248, 67, 75, 66,161,140, 49,179, 16, 1,206,206,
+206,160, 40, 10,207,158, 61,195,203,151, 47, 65, 81, 20,116,213,213, 80,151,151, 67, 85, 86, 6,186, 90, 14, 62, 77, 67, 41, 43,
+130,147,149, 8,120, 53, 35,209,132,242, 70, 52, 73,180,234,222, 69,182,182, 16,218,216,130,228,241,154,116, 43, 26, 64,215,208,
+208,208,195, 73, 73, 73, 61, 6, 13, 26,180, 10, 53, 83,228,179,243,242,242, 6, 46, 91,182, 76,237,230,230,134, 25, 51,102,116,
+ 0, 48,213, 36,201, 20,104, 2,188,221, 59,160,189,207, 84,180,110, 53, 0,229,213, 90,200, 42,181, 40, 42,167,176,227,251,112,
+ 28,253, 57, 20,127, 28,237,131,164, 11,131, 81,174,117,135,181,231,187, 96,105, 77,160, 49,155, 23, 47, 94,196,202,149, 43,177,
+106,213, 42,172, 89,179, 6,171, 86,173, 66, 94, 94, 30,130,130,130,144,147,147,131,115,231,206, 65, 42,149,194,217,217, 25,119,
+239,222,197,166, 77,155,240,199, 31,127,152, 60,233, 58,226,106,198, 49,205,242,165,235,116,186,105,210,145, 35, 59, 21, 58, 58,
+118,236,210,165,203, 91,179,103,207,246,233,213,171,151,126,191,143,143,143,151, 88, 44, 46, 64,205, 12,202,206,198,108, 49, 64,
+ 23, 23,151, 32,104,212, 79,106,219,152, 7,130, 16, 97,192,224, 84,244,234,115, 31,148,150, 15,146, 16,130, 36, 69,208,233, 74,
+224,224,224, 9,150, 37,130, 76, 20,113,153, 76, 38,243,187,116,233, 18,153,153,153, 9,145, 72, 4, 0, 89, 43, 86,172,248, 97,
+195,134, 13, 41, 78, 78, 78,116, 92, 92, 28, 78,156, 56,129,200,200, 72,206,244,233,211,253, 90,181,106,181,221,212,121,175,216,
+ 34,189,181,127,227,185,127,240,180, 14,157, 69,226,214,109, 80,109,253,238,167, 17,206, 18, 0, 56,159,145, 33,119,245,170,140,
+169,150, 39,230,216,183,172,250,230,124,134,169, 25,167, 43,152, 7,233, 79,110,239, 63,126,190,162,168,176,140,215,165, 83,160,
+ 50,122,229, 23,252,214,109,218,125,187,124,225, 63,221,243, 42, 69,229,131,103,159,123,114,236,252,221,170,201,239,127,164,251,
+240,227,153,170,115,231, 47, 30,103, 24,166, 19, 12,204, 56,100, 24, 6, 82,169, 20,201,201,201,200,200,200,128, 76, 38, 67,113,
+113, 49,228,114,185,222,221,104, 37,175, 60,243,195,175,167, 31, 73,196, 98,171, 30,157,252,188,238, 36,164, 20, 73,196, 98, 43,
+191, 54, 94,237,129, 21, 77, 62, 71,104,154,238, 36,178, 18, 3, 32, 80,158,116, 29, 85,101, 85,168, 42,175,130,188,180, 10,106,
+138, 3,149,154,132, 82, 67,194, 59, 98, 8,170,170, 85,168, 42,169, 0, 67,211, 33,150,238,198, 2, 11, 44, 48,210,215,199, 69,
+ 69, 69, 45, 54,243, 88,179,221,155,141,137, 87, 84, 84,212, 98,130, 32,226, 22, 45, 90, 20, 8,195, 19,170,234, 99,103, 19, 47,
+ 0,102,164,119, 40, 41, 73,175,178, 33, 2, 70,207,253,242,171,115, 7,126,249,222, 85,173, 86,228, 56, 57, 88,211,214, 86, 2,
+231, 15,103,172,129,188,170,108, 84,181,249,233, 8, 80, 86, 86,134, 23, 47, 94, 64, 44, 22,131,207,227,129, 86, 42, 65, 43,171,
+161, 44, 43, 1, 73,169,193,167,105, 56, 90,137,225,237,233,142,214,110,238,102,217,124,118,229, 55,125,224,123,125,119,225,186,
+208, 0, 8, 36,214, 16,216, 88,227,211,184,107, 0, 0, 62,159, 15, 44, 91,101,150,104,210,162, 69,139, 83,251,247,239,231,203,
+100, 50, 60,124,248,240, 17,128, 10, 0, 54, 0,152,212,212,212, 75, 73, 73, 73,145,126,126,126, 0,224,107,202, 88,101, 49, 73,
+107,117, 44,114, 11,178,144,249, 50, 1,142,118,109,193,179,106,143,162,114, 10, 66,113, 91,104,213,175,188,143,170,202,108, 40,
+ 41,142, 89,231,174,209,104,160,211,233,160,211,233,160,209,104,240,241,199, 31,227,198,205,155, 56,120,226, 50, 94, 60, 79, 67,
+135, 54,238,152, 50,101, 50, 66, 67, 67,113,243,230, 77,163,182,166,118,134,182,133, 53,184, 27,223, 34, 33,176,118, 82,135, 45,
+188,112,199, 20,217, 34, 8,130,133, 1, 87,100, 35,108, 8, 15, 15,111,151, 86, 93,141,228, 39, 79, 48,104,197, 10, 0,192,217,
+179,103, 27,156,203,188,121,243, 4, 41, 41, 41, 31,222,191,127,255,195,252,252,252,141, 0,154, 14, 54,103,129, 51,103,110,225,
+159,255, 76,129, 76, 38, 3, 0, 28, 58,240,138,151,102,190,160, 48,108,120,141, 71,203,222,222, 30, 27, 55, 6,153, 85,159, 52,
+ 77, 99,231,206,157,122,119, 33, 0,112,185,220, 94,243,230,205, 27,221,212,241,237,218,181,227,155,178, 57,119,108, 11,209, 31,
+143,216,207,236,218,181, 14,180,117, 14, 70,137, 54, 33, 40, 33, 79, 58,107,238,216, 22,155, 55, 29,201, 83,137, 9,245,110,130,
+206,109,197, 21,169,246,152, 83,198,140,243,223,107, 74,188,167,237, 41,144, 85, 46,153,249,209, 68, 39, 91,123,215,234,159,127,
+136,118, 32, 57, 36,123,234, 62, 85, 30,232,227,100,255,110,216,119, 85,255,156,187, 44, 65,163,203,157,137,220, 83,105, 48,146,
+226,130,166,105,228,231,231, 67, 38,147, 33, 39, 39, 7,197,197, 53,238,215,226,226, 98, 48, 12,243,103, 30,136, 80,230,228, 32,
+251,248,207,104, 61,121, 50,186,175, 90, 9,154,225, 66,169,160,177,177,231, 64,148, 85, 40,161,102, 8,120,118,237,137,143,206,
+254, 14,146,165,129, 29, 91, 45, 61,137, 5, 22,252, 77, 97, 78,122,135, 58, 66, 20, 29, 29, 29,249, 87,255,127,125,178, 21, 29,
+ 29,157, 28, 29, 29,221,156,255,106,236, 50,212,111,215,197,104, 93,171, 23,128,246, 90,167, 41, 47, 78,205, 72, 73,225,230, 87,
+ 43,171,173,220, 92, 93,212, 86, 34, 33, 83, 81, 41,231, 36, 60,126, 68, 85, 23, 60,127,218,140,243, 72, 77, 74, 74, 10,202,207,
+207, 71, 78,118, 54,116,202,106,144,106, 13, 88,149, 2,131,122,247,132, 8,128,136, 36,192,103, 40,112, 57, 2,200,171, 42, 1,
+ 32,213,100,231,168,213,190,166,108, 17, 4, 1,129,141, 13, 4, 18, 9, 4,214, 54, 13, 20, 46,115, 20, 27,161, 80,184, 63, 54,
+ 54,214,163, 69,139, 22, 88,185,114, 37, 90,182,108,233,239,233,233,169,176,179,179, 19,187,185,185,161, 99,199,142,232,217,179,
+ 39,206,157, 59, 7,152,145, 83, 74,171, 19, 37, 62,205, 66,175,226,210,155,248,253,218,143,208, 40,213,232, 18,241, 35, 40,219,
+ 62, 66,105, 0, 0, 32, 0, 73, 68, 65, 84,110,107,184, 4,126, 13,230,217, 62, 40, 10, 78,214,168, 7,238, 35,240, 50, 39, 11,
+ 4, 71,144,108,174,242, 84,247,249,209,163, 71, 56,112, 50, 30, 30,222, 1,200, 73,127,130, 39, 87, 47,225,134,139, 19,188, 3,
+ 58,234,221, 64, 6,203, 72,131,187,122,107, 77,154,168,165,159, 77, 20,150,150,150, 10, 29, 29, 29,213,117,117,231,225,225,241,
+103,200,214,196, 5, 11, 22,160,156,199, 3,134, 15, 7, 63, 35, 3, 20, 69, 33, 44, 44, 12,221,187,119, 7, 0,132,133,133,129,
+203,229, 34, 56, 56, 24,158,158,158,216,186,117,235, 68, 67, 68,139, 36,240, 80,167, 43,241,247,241,241,209, 19,173, 61,123,101,
+ 72,184, 63, 24, 4, 4,216,242,195, 51,253,177, 94, 94, 94, 40,144,102,128, 32,216, 36, 19,101, 92,229,238,238,190,204,195,195,
+195,103,195,134, 13, 28,145, 72,132, 79, 62,249,164,109, 85, 85, 85,235, 90, 41, 25,139, 22, 45, 2, 0, 44, 95,190, 28, 43, 86,
+172,128, 90,173, 86, 24, 50,182,103, 99, 39,207,162, 82,230, 67,182,202,106, 84,127,231,214,157, 6, 12, 29,132,182,126, 3, 48,
+ 96,104, 14, 0,172,117,228,102,189,247,237, 18,251,227,246, 54,196,174,223,206, 95, 92,222, 59, 98,192,146,133, 85, 87, 87,127,
+179,179,220,100,204, 99, 69,246,110,249, 83,193,248, 77,223,111,223,187,233,171, 69,115, 68, 57, 50, 77, 89, 94, 25, 91,101, 45,
+228, 90,251,186, 17,214,179,190, 92,245, 34, 63, 63, 99, 62,114,207,155,156,105,201, 48, 12, 50, 50, 50,244, 49,125, 42,149, 10,
+213,213,213,200,205,205,213, 95, 51, 74,137,237,176,153,239,143, 8,169, 86, 42, 21,119, 30,167,231, 44,157, 61, 41,188, 90,169,
+ 84,164,103,230,164, 1, 91,154,100, 99, 36, 73, 62, 86,200, 21,131, 20,229, 42,200, 30, 62, 69,203,129,222,208,234, 8,104,116,
+ 52,100, 37,114,168,117, 0, 77,242, 16,248,222, 20,208, 4, 23,197,249,121, 32, 57,156, 71,104, 24,180,111,129, 5, 22,252,125,
+ 96,148,139,212, 41, 90,225,225,225, 7,235,171, 78,117,159, 1,168, 97, 60,148, 71, 86,159, 76,213,185, 19, 13,253, 79, 35,187,
+230,226,181, 24, 45,147,233, 29,234,254,179,149, 93,165,231,186,229,147, 90, 50, 58, 93,135,162,226, 66, 29,151, 43,228,181,178,
+ 83, 74, 75,115,204,255,119,181, 90, 29,119,233,210,165,145,131, 7, 15, 22,166, 63,126, 4, 77, 69, 5, 52, 21,229,224, 49, 58,
+ 56,138,187,129,164,212, 32, 52, 26,180,240,103,160,146,139, 17,127, 35, 73,171, 86,171,227,204, 37, 90, 36,135,211, 48, 46,203,
+218, 26, 66, 27, 91, 8,173,173, 27,187, 22, 77,145, 2,171, 33, 67,134, 12, 12, 11, 11, 3,203,178,216,185,115, 39, 40,138, 18,
+ 80, 20, 5,141, 70, 3,138,162, 80, 89, 89,137,189,123,247, 98,219,182,109, 55, 0,252,106,178, 51,211,105, 46, 93,184,120, 37,
+244,131, 73,145,188,179,113, 27,161,211,208, 80, 18, 45, 81, 93,173, 69,149,198, 10,180,211,100,160,240, 12, 56, 92, 17,194,131,
+219,226,228,145, 99, 20,116,234,203,102,178,240, 6,170, 80,110, 78, 22, 94, 62, 79,131,117,101, 1, 92,108,173,160,200, 72, 67,
+151, 41, 83,223, 72,157,104,213,170, 21, 24,134, 65,255,254,253,245,193,213,111, 74,182, 74, 74, 74,112,250,244,105,132,133,133,
+ 33, 34, 34, 2,121,121,121,200,200,200,192,219,111,191,173, 63,230,209,163, 71, 72, 72, 72,128,175,175,113,145,176,184, 84,123,
+246,101,238,195,113,239,190,251, 46,255,246,237,219, 96, 89, 22,126,126,182,176,181,145,128, 32,133, 8, 8,112, 5, 80, 51, 6,
+232,215,175, 31, 42, 43, 51,116,101,101,236, 89, 19,167,187, 31,192, 9,141, 70,243,172,111,223,190,158,207,159, 63,199,220,185,
+115,185,135, 14, 29,170,147,146, 17, 21,213,112, 50,133, 82,105,216,117,223,161,147,255, 23,109,117, 14, 17, 34,113,235, 54,182,
+206,193,104,235, 55, 0, 0, 48, 56,242, 3,180,109,231,133,202,226,196, 54, 42,101,214, 40, 62,183,204, 33,113, 75, 94,138,120,
+120,208,251,170,162,107,233,168,113,157,154,108,118,101,250,161,194, 28,222,228,195, 39, 78,157,155,241,118,228, 59, 60, 45,173,
+211, 5,121,243,236, 99,143,159, 41,202,203,206,249, 14, 57,231,147, 94,233,127, 70, 85, 60,186,178,178, 18, 18,137, 4, 73, 73,
+ 73,234,225,195,135, 11, 73,146,196,179,103,207,244, 68,203,213,217,177, 99,175,238, 65,254,171, 55,237,189, 32, 17, 10,133, 67,
+251,117, 11, 72, 73,207,126,201,178, 68,150, 65,181, 85,171,189,248,248,225,163,254, 46,158,237, 56, 25,215,110,195,169,207,219,
+ 80,171, 73, 40, 53, 12,212, 58, 64,199,225,195,163,115, 15,216,251, 6,128, 5,112,239,246, 13,173, 90,171,189, 96,233,107, 44,
+176,224,111,173,106,177,198, 72, 82,237,231, 82, 0, 89,209,209,209,197,245,212, 38, 25,128, 71, 0, 66,106,143,147, 53,250,157,
+140, 32,136,123, 44,203,118,175,103, 71, 86,143,112,213,255,172,105,116,204,163,102,144,172,250,239, 13,137,150,161, 41,149, 0,
+224,236,236,236,218,165, 75, 55,223,159,126, 57, 12,150,101,241, 52, 97, 61,202,138,158, 96,217,218, 91,190, 45, 90,180,136,200,
+203,203,139, 55,167, 4, 52, 77, 31,218,181,107,215,252, 30, 93,187,116,105,211,178, 37, 30,101,101,130,207,210,224,211, 52, 72,
+ 74, 13, 46,173, 65,203, 32, 26, 36, 97,141,252,252, 10,196,236, 63,156, 84,155, 37,222, 40,252,223,126, 7, 43, 95, 86,128, 32,
+ 8,108, 8, 15,130,192,198, 26,124,137, 53, 62, 61,117, 69, 79,174,226, 86, 46,130,192,218, 26,190, 61,204, 74, 8,175,184,122,
+245,234,253,199,143, 31,119, 15, 10, 10,194,252,249,243,145,149,149, 5,134, 97, 80, 88, 88,168,146, 74,165,121, 50,153, 44, 11,
+192,113, 0, 63,193,140,204,227,124,181,106,115,220,209, 61, 51,195,123, 71, 56,191, 59,106, 27, 78, 28,153,135,242,138, 74, 40,
+116, 98, 84,171,116,168, 86,115,224,232,212, 9, 61,130,131,145,159, 87,132,228,219, 23,170,184,106,197,250,230, 92,160, 4, 65,
+ 32, 33, 33, 1, 62,158, 54, 72,251, 61, 30,206, 86, 60,132,120,186,195,179, 87,111,125,126, 41, 99,224,113,160,155, 56,113,162,
+ 62, 51,252,144, 33, 67, 50, 39, 79,158,236, 49,111,222, 60,252,242,203, 47,184,113,227,198,107, 1,218, 17, 17, 17,184,126,253,
+250,215, 0,150,155, 18,245, 52, 26, 13,252,253,253,113,239,222, 61, 92,186,116, 9, 3, 6, 12, 64, 68, 68, 4, 18, 19, 19,241,
+219,111,191, 33, 33, 33, 1, 4, 65,192,201,201, 9,218, 26,242,172, 53,100,140,162, 16,251,205,183,187, 22,111,218,180, 45,112,
+210,164, 73, 56,122,244, 32, 62,120,191, 3, 8, 82, 8,130, 16,226,157, 17, 29,176,114,213, 61,244,232,209, 15,206,206, 60,108,
+218,120,242,133, 82, 73,239, 53,163, 26, 87,255,246,219,111,158, 42,149, 10,229,229,229,172,181,181, 53, 81, 82, 82, 51,163,181,
+ 41, 69, 75,161, 80,136, 12, 25,122,252, 32,117,125,185,156, 45, 99,171, 18, 70,149,234, 18, 58, 13, 24,154,139,193,145,239,227,
+ 98,220,175,184,114,225, 18, 28,185, 89,153,144,200,207, 21,103, 22, 87, 74,171,253,182, 7,116,157,206,121, 89,125, 97,251,172,
+119,210, 56, 30, 30, 76,236,162, 31, 43,203,141, 17, 45, 0, 68,105,202,190, 83,199, 89,188,211, 51,188, 71,187, 32, 47, 15, 65,
+ 89,113, 17,123,228,228,185, 36, 42,243,232,233,122, 4,139, 53, 65,212, 87, 70, 69, 69,125, 85,251,121,247,210,165, 75,167,199,
+196,196,184, 20, 20, 20,232, 99,180,138,138, 75,175,244, 28, 62,139, 46, 41,175,208,236,218,244,229, 88,177, 72, 40, 88, 26,179,
+235,154,150,131,219,134,236,234, 24,102,235,123,115,151,205, 73,127,154,208,162,181, 88,128,147, 95, 46,199,163,223,174, 66, 75,
+242,241,207, 75,119,160,166,104,148, 23,151,224,242,135,159,193,218,205, 1,219,174, 29, 45,100, 24,230, 71, 75, 87, 99,129, 5,
+127, 95, 24,226, 34, 4, 65, 52,149, 99,175,176,137,239,238, 25,251,157, 1, 59,127, 5, 12,102,133, 55,107, 10, 94,113,113,113,
+209,245,235,119,112, 45,110, 53,226,227, 86, 35, 57,225, 17,242,243, 52,200, 43, 84,193,214,214,246,150,145,159, 54,206, 28,203,
+ 42, 20,138,209, 75,151,125, 85, 32, 18, 91,161,239,192,129,112,119,113,133, 21,159, 7,142,142, 1,135,224,161, 74,102,143,180,
+ 68, 5, 22,238,218, 87, 84,165, 80,140,110,162,147, 24,100,136,100, 16, 4, 1,161,173, 13, 4,214, 54, 16,218,216, 54,112, 35,
+138,108,109, 33,178,177, 5, 87, 32,104, 42, 24,254, 53,155, 85, 85, 85, 99,198,142, 29, 91, 86, 81, 81,129,233,211,167, 35, 62,
+ 62, 62,225,194,133, 11,182,137,137,137, 98,153, 76,214, 14,192, 16, 0, 59,140,144,172, 6, 54,203,202, 50,228,172, 78, 61, 62,
+250,171,207,149, 42,157, 19,198, 77, 61, 4, 9,153, 11, 29,205,128, 5,224,233, 40, 64,175, 65,171, 80,164,233,137, 67,219,215,
+ 40, 24, 74, 53,169, 81, 14,173, 6, 54, 89,150,101,221,220,220, 94,171,131, 75,151, 46, 97,220,216, 49, 24, 58,106, 36, 92,218,
+248,192,117,208,219, 24, 58,253,159,216,190,125, 59, 72,146,132,179,179,115,227,142, 87,111,115,207, 67,240, 14, 60, 6,113,224,
+ 49,136,221, 9,224, 2,152,178,111,223,190,111, 66, 66, 66,174,222,184,113, 99, 61,128,241,245,255,171, 30, 86, 52, 82,179,154,
+106,163, 37,115,230,204, 81,166,167,167, 67, 34,145, 64,167,211,225,198,141, 27,216,182,109, 27, 54,108,216,128,132,132, 4, 56,
+ 57, 57,193,215,215, 23,106,181, 26,247,238,221, 83, 2, 88, 98,196, 38, 35,147,233,198,108,217, 18, 83, 18, 25,217, 7,187,118,
+253, 0,119,247,158,224,113,221,193,229,185, 64, 98,237,143,159,127,250, 6,111,189,213, 5,167, 78, 30, 46, 45, 46,209,141, 1,
+160, 51,227, 90, 82,221,185,115, 7,219,183,111,199,216,177, 99,243,198,141, 27, 71, 87, 84, 84,232, 21, 45,150,101,193,178, 44,
+ 86,212,198,152,169,213,106,161, 33,155, 31, 45, 76,202,251,114, 77,242,202,194,130,188,176,248,171,183, 38, 94,185,112, 9, 47,
+210,175,224,202,133, 75,248,253,202,205,168,194,130,188,176, 46,161,237,249,163,167,207,252, 98,207,177,163, 28,107, 91, 15,236,
+ 57,118,148, 51, 97,214,231,107,186, 13, 29,176,196,212, 53, 95,219,142,108, 85, 81,225,162,181,235,191,175,210, 81, 42,114,221,
+119, 91,243,149, 50,233,146,122,215, 37,107,234,250, 84, 42,149, 59, 84, 42,149,167, 74,165,242, 84,171,213, 75,178,178,178,250,
+206,159, 63, 95, 70,211,180, 94, 45,149,165,156,186,245,228,143,221,107, 93,157, 29,196, 61,187, 7,118,216,184,227,200,181,156,
+220,194,127,213,203,161,213, 84, 57, 85, 85, 74,213,152,145,163, 39, 87,151,151,169, 17,254,121, 20, 24,145, 53,212, 52,160,101,
+ 57,208, 17, 92, 60, 94,189, 17, 98, 71, 27,236,207,124,160,168,208, 82, 99,208, 48,135,150,177,115,255, 51,176,216,180,216,180,
+216,252,239,180,249,127, 25, 30,104,184,214,161, 71, 3, 69,203,212,148,202, 22, 45, 90,244,125,247,157, 65,232, 23,185, 20, 44,
+203,226,201,131,111, 81, 38,123,138, 22,238, 66,100,228, 84,134, 3,136,111, 70, 97,114,178,114,115,195,230, 44, 89,122,108,220,
+144,129, 1, 65,109,218, 8, 91,183,246,134,196,213, 21,197,197, 50,252,113, 59, 69,187,230, 64,108, 82, 45,201, 50,203, 49,201,
+ 48, 76, 77,144, 59,128,129,115, 22,130,224,112,128,218, 52, 14,117, 29, 99,155,238, 61, 65,112,185,160, 89, 6,106,181,218,156,
+217,114, 47,159, 63,127, 62,102,210,164, 73,151,227,226,226,200,161, 67,135,118, 62,126,252,248,159, 89, 51, 15,213, 69,233, 87,
+ 1, 68,174, 89, 52,227, 80,216,128,145,182,126,129,221,248,221, 90,115, 64,105, 9,228,231,101, 35,238,216, 93, 42,229,206,133,
+ 74, 86,167, 26,175, 40, 78,191,106,204, 22, 69, 81, 57,237,218,181,115,219,190,125,187, 62, 24,158,166,105, 20, 23, 23,227,214,
+173, 91,232,212,189, 7, 2,222,255, 16, 50,153, 12, 91,182,108,129,151,151, 23, 70,140, 24,129,210,210, 82,232,116, 58,115, 29,
+190, 52,128, 11,181, 47, 52, 34, 89, 68,237, 18, 64, 70,221,134, 62, 62, 62, 2,149, 74,213,153,101, 89, 14, 65, 16,155, 53, 26,
+205,180, 69,139, 22,121,172, 93,187, 22, 29, 58,116, 64,113,113, 49, 36, 18, 9,252,252,252, 32,147,201,112,247,238, 93, 90,161,
+ 80,108, 71,205, 66,214, 50, 19,229,123,118,247,110,102,216,236,217,159, 30,251, 38,102,134,159, 74,221, 79,224,232,216, 27, 44,
+171,131, 76,150, 5,121,229, 13,106,213,202, 95,159, 23, 22,105, 71, 3, 72, 55,243,156,151,207,156, 57, 19, 0, 68, 0,150,102,
+100,100, 60, 12, 8, 8,240, 51,164,104,153,131, 77, 71,242, 84, 0, 14,140, 25,234, 57,183,178, 56,209,207,145,155,149, 25, 22,
+196,108,217,116, 36, 79,101,235, 89,189,186, 56, 43, 62, 77, 90,125, 97,251,158, 99, 71, 57, 83, 71,141,161, 91, 90,167, 71,137,
+ 92,217, 35,102,152,102, 67, 66, 66, 90, 17, 68,105,219,162,146,167,247, 63,152, 62,227, 61, 59,190,242,108, 72,203, 18, 95,210,
+171,139, 40, 33, 33, 33, 19,205,156, 25, 90,139,180,188,188,188,190,139, 22, 45,186,192,178,108,131,216,132,162,226,210, 43,225,
+145, 51,217,242,242,138,135,178,212, 83,230,228, 82,187,123,247, 65,194,192,160, 78, 93,142,126,179, 54,198,173,223,156,249,220,
+180,171,215, 0, 90,139,236,248,107,160,133, 26,102,227,205,139,133, 21, 20, 53, 10,150,172,240, 22, 88,240,183, 87,179,140,113,
+145,255,114, 12,135,129, 96,120,179, 79,198,167,109,139, 11, 29,252, 90, 15,241,106,233, 2, 0,200,200,204, 71, 70,102,222,111,
+ 25, 47,242,134,154, 96,188,134,166, 87,234, 23,149, 38,106, 83, 56,176,230, 45, 42,221,192,166,147,147,211,125, 46,151,219,178,
+ 57,181, 65,211,116,126,113,113,113, 23, 51,203, 57,161, 77,155, 54, 49,217,217,217,199, 24,134,153,219, 76,182,223,164,205,186,
+ 69,165, 73,174, 96, 16,171,211,116, 2, 0,130, 43, 48,103, 81,233,250, 54, 59, 89, 91, 91,239,224,241,120, 94,117,237, 88, 23,
+131, 69,211, 52,135,162, 40, 17, 77,211, 28, 0, 4, 73,146, 58, 30,143,167, 34, 8, 66,167,211,233,114,212,106,245, 12,188, 74,
+ 56,106,236,220, 77,118,244,181, 68, 11, 77, 40, 90,151, 0, 32, 61, 61,189,189,131,131,195,120,130, 32,198,178, 44,235, 47,151,
+203,213,203,150, 45, 75,136,141,141,173,108,211,166,205,176,225,195,135, 19,137,137,137, 72, 74, 74, 98, 75, 74, 74,142,212,170,
+ 88, 25,205,188,150, 72,161,144,243, 15, 71, 71,114, 56,203, 34, 4, 44, 8,130,196,227,138, 10,230,172, 66, 65,255,171,150, 48,
+ 54,247,250,172,195,196,214,173, 91,255,154,153,153,201, 51,164,164, 26, 58,247,198,248,118, 73,224,210,240, 62,125,198,220,250,
+253,247,227, 95,174, 73, 94, 89,127,223,172,145, 14, 31, 76,248,108,206,183, 7,182,126,247,229,247, 39,202,118,153, 83,206,206,
+157, 59,251, 16, 4, 49, 30, 64, 16,203,178,237, 88,150, 16, 17, 4, 91, 70, 16, 68, 50,128, 68,141, 70, 19,151,146,146,242,242,
+ 79,156,251,155,140,112, 13,217,212, 47, 42, 13,154, 14,166, 1,214,204, 69,165,255,127,151,211, 98,211, 98,211, 98,243, 63,103,
+243,255, 50, 62,110,226, 59,243, 50,195,215, 33,227, 69,222,208,140, 23,121,104,215,174, 29,251,236,217,179,102,145, 52, 67,157,
+ 52, 77,211, 7, 21, 10,197,193, 63, 99,164,164,164,164,219,191,185,242, 14,100,102,102, 30,248, 43, 13,214, 18,169,149,181,175,
+ 55,197,227,170,170,170, 30,230, 30, 76, 81,212,191,163,110,136, 90, 53,235,107, 67, 7, 12, 25, 50, 36,155,162,168, 75, 0,114,
+ 9,130,176, 7, 80, 74, 81,212, 5,157, 78, 87,248,236,217,179,110, 27, 55,110,172,203,124,191, 10,192,253, 55, 44, 7,163, 86,
+211,251,243,243,233,253,255,134,115,220,175,209,104,230, 57, 57, 57,249,170, 84, 42,129, 74,165,226,215,159,124, 32, 22,139,101,
+198, 2,226,235,195,222,134,216,205,231,150, 57,217,219, 16,141,137, 20, 28, 91,224,168,178, 58,169,131, 99, 11, 28, 53,183, 96,
+ 15, 31, 62,204, 8, 9, 9,217, 71,146,100, 27,150,101,221, 0,214,142,101, 33, 99, 89,182,152,251,255,216,187,238,184, 40,174,
+182,123,102,102,103,251, 46,176, 75, 93,138, 5, 20, 68, 64, 1, 11,246,136,154, 24,123,137, 88,162, 98, 47, 49,106, 98,212,168,
+ 81,163,177,198,215,196,158,216,123,111, 81,176,247, 94,177, 43, 86,164, 55,169, 11,203,246,157,249,254,128, 37,168,148, 5, 77,
+222,228,253,246,252,126,227, 58,195,238,217,123,103,231,222,123,238,115,159,251, 60, 28, 78,210,227,199,143,147,254, 65,157,144,
+198,200, 48,139,141, 58,221,159,126,135,214,221,133, 86, 88, 97,197,255, 14,202,244,209,226, 84,150,233,197,139, 23,132,245,126,
+ 90, 81, 82,108,149,247,199,184,184, 56, 45,128,171, 69,199,187,184, 13,160,203, 63,189,130, 41, 41, 41,193,101,253,205, 82,145,
+ 5, 20,250,108, 1, 15, 75,141,206, 62,107, 69,118, 30, 86, 28,152, 84,217,178,221,187,119, 47, 30, 22, 46,177, 91, 97,133, 21,
+ 86, 88,241,151,225,195, 45, 90, 86, 88, 97,133, 21, 86, 88, 97,133, 21, 86,148,138,181, 37, 4,215, 91,214, 45, 2,101,239, 28,
+168,204,218,107, 85,118, 31,156,182,114, 90, 57,173,156, 86, 78, 43,167,149,211,202,249,255,142,243,127, 21,239,137,172,191, 3,
+214,173,175, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,255, 63,136,172,119, 15, 0,214,165, 67, 43,172,176,226,255, 49,
+246,238,221,107, 81, 82,209,190,147,215,119,150, 72,100, 51,242,149,185, 11,119, 45, 30,114,208,124, 61, 44, 44,204,100,189,139,
+ 86, 88, 97, 5,170,226, 12,239,233,233,238, 71,154,152,230, 44, 75, 82, 44,201, 26, 8,165,122,247,171,236,236,183,194, 14,120,
+120,120,216,209, 36,186, 16, 44, 43, 38, 8,198,196, 80,228,149,152,152,196,199,149, 40, 24, 79, 38,147,125,205,229,114,219,233,
+116, 58,119,146, 36, 19,181, 90,237,233,130,130,130,149,120, 63,112,225,127, 13, 62, 62, 62,253,206,159, 63,111,215,162, 69, 11,
+173, 80, 40, 52,170,213,106,206,241,227,199,249, 29, 58,116,200,121,249,242,101,149,118, 36,186,186,186,182, 89,191,126,189,103,
+251,246,237, 81,187,118,109, 85,159, 62,125,184, 77,155, 54,229, 14, 27, 54, 44, 38, 57, 57,249,108, 37,233,252, 8,130,216, 74,
+ 16, 4,197, 48,204, 64,252, 25,186,225, 99,131, 36, 73,114, 36, 65, 16, 61, 88,150,245, 34, 8,226, 21,203,178, 7, 25,134, 41,
+ 47,112,107,121,248, 2, 64, 71,146, 36,131, 1,128, 97,152, 59, 0,142, 2,150,239,188,251, 59, 57, 69, 34, 81, 16, 0, 20, 20,
+ 20,220,253, 88,156, 4, 65, 4, 1, 0,203,178, 85,229, 28, 44, 20, 10,135, 3,128, 90,173, 94, 7, 11,210, 65,189, 11,118,181,
+ 47, 27, 60, 59, 26, 0,112,231, 71, 95, 0, 64,101,206,137, 81,209, 68,101,190,171, 52,190,202,112,148,130,142,253,251,247,159,
+191,125,251,246, 31, 1, 28,250, 43, 30,124, 23, 23,143,149,191, 44, 91,235,250,205,215, 67, 23,162, 48, 35, 68,249, 13, 18,248,
+148, 71, 81, 93,117, 38,211,165,199,192, 94, 0, 28,185, 92,222,143,199,227,181,210,233,116, 10, 14,135,147,162,211,233, 46,230,
+230,230,238, 68, 57, 25, 16, 44,190,175, 79, 32,211, 23,192,133, 96,254,204,243,198,146,208,114, 69, 72, 37,234, 34,251, 31,208,
+141,146, 0,198, 23,213,117, 3,202, 14,231, 81, 94,231,243,141,171,171,107, 15,165, 82, 89, 64, 81, 20,139,194, 93,207,133,255,
+ 20,254,157, 96, 24, 38, 61, 43, 43,107, 96, 69, 92,226,106,168,195, 19, 19, 91, 77, 6,168,141, 90,118,180, 42, 1,209, 18, 15,
+ 52, 99,129,129, 44, 80,147,164, 72, 71,134, 97, 82, 0,156, 37,141,136,200, 79,198,139,127,232,224, 94,189,232,190,214, 40, 58,
+167, 1, 56, 3,184, 15,224, 27, 0,249, 86,253,243,183,225, 93,103,248, 35, 0, 82,138,133, 86,137,112,247,173, 59,119,238,124,
+193,211,211,221,175, 87,247,158,243, 71,141, 28, 77, 80, 20,137,135,143, 30,113,190, 28, 56,248, 51,153, 76,230, 38,209,106,235,
+130, 32,152, 2,129,224,161, 82,153,155,180,119,231,118,169,111,157, 58, 38,147,137,193,234, 53,191,119,216,247,199,129,105, 22,
+138, 45, 31, 23, 23,151,173, 83,166, 76,113,233,218,181, 43,229,226,226,130,216,216, 88,187, 93,187,118,213, 89,177, 98, 69,239,
+236,236,236,129, 0,158, 85,161,178, 45, 93,228,228,103, 82, 33,209, 22,121, 38,228, 25,112, 38, 85,141,147, 0, 46, 85,245,238,
+ 21, 20, 20,140, 45, 40, 40, 8,105,212,168, 17,187, 97,195, 6, 98,208,160, 65, 44, 65, 16,132, 90,173,222, 12,160, 74, 66, 75,
+ 44, 22,175,106,223,190,189,183,183,183,247,171,151, 47, 95,118,220,179,103,207,209,240,240,112, 47,177, 88,252, 28,128, 79, 37,
+233, 54,101,102,102, 6,170,213,106,184,187,187,111, 0,208,224, 47,120,136, 8,138,162, 14,186,185,185,177,139, 22, 45, 58, 20,
+ 24, 24,232,156,149,149,101,156, 52,105, 82,187,235,215,175,119, 48,153, 76, 93, 43, 33,182,100, 4, 65,172,113,118,118,118, 88,
+184,112,225,139,134, 13, 27,222,231,243,249,188,231,207,159,139, 38, 76,152,240,237,179,103,207,122,179, 44, 59, 18,168,212, 0,
+ 33, 35, 8, 98,141,171,171,171,195,252,249,243, 99,131,131,131, 31,114,185, 92,238,243,231,207,197,223,127,255,253, 55,209,209,
+209, 85,226, 36, 73,114,117, 72, 72,136,236,199, 31,127,124, 82,167, 78,157,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,125,
+234,212,169, 48,134, 97, 70, 85,165,156, 78, 78, 78,178, 89,179,102, 61,105,218,180,233,117, 46,151,203,125,250,244, 41, 57,101,
+202,148,175, 95,188,120, 97,113, 57,229,114,121, 40, 65, 16,107, 83, 83, 83, 57, 0,160, 80, 40, 26,219,216,216,172, 40,153,211,
+210, 28,138,194, 96, 48,228,105, 52,154,254, 89, 89, 89,165, 6,194, 29, 52,117,121, 23, 0, 88,161, 55,159, 23,190, 86,116, 14,
+172,142,176,164,210, 65, 46,133,113,241,126, 81, 13,233, 14, 0,253,138, 82,133,255,162, 2, 56, 28, 14, 19,228,242, 13,123, 55,
+181, 82, 33, 99,186,181,105,211,102,214,217,179,103,127,111,221,186,245,247,219,182,109,115, 74, 72, 72,248,249,210,165, 75, 30,
+125,251,246, 29,116,230,204,153, 5, 25, 25, 25,251, 62,214,195,207,227,242,249, 4, 73, 64, 40, 16,217, 88,242,126,154, 36, 59,
+ 95,237,214,109,248,186,167, 79,131, 87, 68, 71,123,170, 20,138,144,113,227,198, 57,247,236,217,147,244,240,240,192,139, 23, 47,
+236,183,109,219, 86,119,221,186,117, 61,114,114,114,198, 3,136,251, 16,145,165,202, 65, 61,173, 14,193, 44, 11,187,226, 6, 75,
+ 32,135,175,199, 29,246, 9, 30,252, 3,196,214,204, 77,155, 54,253,248,226,197, 11, 44, 88,176, 0, 0, 86, 86,242,243, 19,186,
+117,235,214,233,192,129, 3,194,189,123,247, 10, 27, 53,106, 4, 23, 23, 23, 20, 77,166,138, 3, 83,123,122,122, 90,118,207, 24,
+252,178,244,232,144, 6, 15,179,142, 97, 85,207,212, 5, 66,119, 24,155,117,243,238,209,121, 80, 48,108, 29, 69, 16, 72, 56,200,
+201, 84, 6, 60,189,147,208,254,220,158, 23, 63,191,136,122,179, 80, 21,143,153, 40, 59, 38,223,127, 5,246,246,246, 27, 98, 98,
+ 98, 66,197, 98,241, 91,215, 95,189,122, 21,228,237,237,157, 11,224,187,202, 10, 55, 71, 71,199, 29, 12,195,104, 51, 51, 51,135,
+ 2,128, 84, 42,221, 46, 22,139,101, 41, 41, 41,211,254,170,137,140, 25,239,106,145,127,185, 69,171,216, 95,171,180, 92,135, 4,
+105, 98,154,143, 26, 57,154,232,211,175,111,234,139, 87, 49, 12,135,230,245, 59,126,226,132,200,207,207,143,212,174, 92, 9,227,
+155, 55, 48,124,251,109,179,211,167, 79, 27,194,250, 13, 80,211, 20,177,201,203,179,166,104,247,206, 93, 46, 7,246,239,107, 14,
+160, 34,161,197,115,113,113,217,122,254,252,121, 55, 79, 79, 79,228,228,228, 32, 54, 54, 22, 42,149, 10,189,123,247,166,155, 55,
+111,238,214,171, 87,175,173,185,185,185, 45, 42, 97,217,114,174,237,206,137, 28, 57,184,167, 79,135,207,154,139,221, 60,106,129,
+ 77,213, 32,225,101,116,163,200,243,215,199,109,218,127,244,217,139, 92,182, 51, 74,207,141, 84, 46, 50, 50, 50, 38,247,232,209,
+ 99,127,104,104,168, 35,159,207,135,171,171, 43,209,181,107,215,244,228,228,228,217, 85, 86, 45, 69, 41,108, 72,146, 52,149,124,
+ 45, 37, 61,144, 37,112,151,201,100,144,201,100, 0,224,246,161, 51, 79, 59, 59,187,149, 82,169,180,151, 82,169, 84,147, 36,201,
+ 18, 4,193,234,116, 58,161, 76, 38,187,247, 36,250,153,171, 86,171,173,189,120,233,186,101,109, 90, 6,218,156, 58,117, 10, 61,
+123,246,100, 79,158, 60, 57,210,210, 60,117, 4, 65,172,233,209,163, 71,193,140, 25, 51, 52, 47, 94,197,186, 61,121,246,138, 16,
+ 11,120,140,131,131, 3,125,243,230, 77,206,146, 37, 75, 4,179,102,205, 90,195,178,108,175, 74,220,207, 53,125,251,246,213, 79,
+156, 56, 49,229,233,139, 24,167, 7, 79, 94,176, 18, 1,109,116,112,176,167,174, 95,191,206, 84,133,147, 36,201,213,147, 39, 79,
+ 86,142, 28, 57, 50, 59, 51, 43,215, 37, 91,153,207,242,105,202,224,226,226,194, 57,116,232,144,118,199,142, 29,228,240,225,195,
+ 87, 51, 12, 19, 86,137,251,187,186,107,215,174,121, 83,166, 76,201,121,254,234,181,203,131,199,207, 32,226,211, 6,103,103, 39,
+234,214,173, 91,250,197,139, 23,147,115,231,206,181,168,156, 98,177,120,203,158, 61,123, 56,135, 14, 21,246,125,215,174, 93, 35,
+189,188,188, 68, 37,223,163,214,104, 65, 18, 64, 70, 70,134,168,105,211,166, 91, 0,188, 23,220, 55,120,118, 52, 6, 77, 5,198,
+142, 29,155, 82,217,135, 37, 88, 49,174,194,247,152,126,247,101,151, 20, 12,233,206,225,112,152,225,195,135,167,190,251,119,141,
+ 70, 67, 0,232,138,159, 45, 23, 91, 29, 59,118,252,225,200,145, 35,181,182,109,219,246,235,142, 29, 59,116, 0, 32, 16, 8, 28,
+118,237,218,181,160,119,239,222,232,221,187,247,140,125,251,246,125, 52,161,101, 98, 77,122, 0,224, 11,248,252,232,232,104,194,
+215,215,183,220,136,251,122,134,185,189,238,233,211,134, 95,249,250, 54,202, 98,152,218,220, 14, 29,242, 39, 76,152,144,161, 84,
+ 42, 17, 27, 27, 11,189, 94,143, 65,131, 6, 81,173, 91,183,118,237,221,187,247,242,188,188,188, 47, 0,232, 45,120, 38, 23,187,
+185,185,141,200,205,205,205, 55, 91,117, 90, 12, 52,113, 90, 5, 25,249,245,107, 27,120, 92,202,200,237,242, 45, 67,156, 92, 73,
+168,124, 61,113, 25, 0,184, 5,120, 83,201,201, 64,169,176,113,135,167,137,198, 92, 71,119, 97,155, 55,113,234,159, 84,241,229,
+138,165, 47,196, 98,113,119,149, 74,181,175,104,112,246,233,220,185, 51,174, 95,191, 14, 0,205,139,132, 86, 27,146, 36,191,100,
+ 24,102, 61,128,242, 82,185,141,235,214,173,219,167, 7, 14, 28,144, 2,192,190,125,251, 96, 48, 24,224,229,229, 5, 46,151, 11,
+ 30,143, 7,154,166,139,179,131, 88, 8,133,163,163, 3, 28,108,105,200,228,226, 14,223,255,214,141, 83,205,207, 6,233,166, 71,
+200, 98,115, 96,100,181,224,218,139, 81,167,189, 29,130, 63,107, 67, 70,172,126, 56, 45, 98,213,147,134, 5, 36,186, 32, 14,218,
+127,202,200, 78,146, 36,255,254,253,251,112,117,117,125,235, 58, 69, 81, 0,208,170, 10,148, 51, 94,189,122,213, 52, 42, 42, 10,
+161,161,161, 51,234,213,171,247,249,133, 11, 23, 92, 50, 51, 51, 17, 26, 26,186, 60, 49, 49,241,208, 95, 93,167,146, 90,228,127,
+197,212, 69,190,163, 36, 91, 23,206,130, 73,138,162, 72,196,188,138, 53,132,134,182, 13,143,143,143,151,132,132,132,144, 52, 77,
+ 67,117,246, 44, 52,183,110, 65, 34,145,160, 71,143, 30,244,197,139, 23,109,108, 36, 54,195, 94,199,188,206,163, 40, 18, 44, 75,
+ 86,232,243, 32,147,201,190,158, 54,109,154,139,183,183, 55,140, 70, 99,113, 68,115,163,209,136,132,132, 4, 72, 36, 18, 12, 28,
+ 56,208, 73, 36, 18,125,109, 97, 61,106,248,120, 57,221, 57,127,116, 77,131, 9,163, 58,138,125, 68,167, 32, 78, 24, 15,201,190,
+175, 80, 55,249, 56,166,116, 15, 17,159, 92, 53, 35,184,150,171,252, 78, 9, 19,171,197,208,106,181,151, 31, 62,124, 56,236,194,
+133, 11, 12, 0,156, 59,119,142,125,242,228,201,200, 15,153,133, 50, 12,131,156,156, 28, 48, 12, 67, 21,157,155, 95,255,171,207,
+131,141,141,205,234,207, 63,255,188,111, 92, 92,156,240,216,177, 99,246,241,241,241, 14,175, 95,191,118,244,241,241,225, 44, 88,
+176,224,136, 70,171,167, 12, 38, 86,103, 52, 25,242, 82, 30, 61,122,149,157,150,118,103,227,198,141,106,130, 32,122, 88,248, 29,
+ 95, 40, 20, 10,251,169, 83,167,130,160, 69,141,235,212,173,231, 77,209, 66, 91,146,230,217,170,213, 26, 83, 76, 76, 76,194,212,
+169, 83,107, 6, 6, 6,186,162,112,121,205, 34, 78, 87, 87, 87,135,137, 19, 39,130,195,151, 6,213, 15, 12,174,197,227,139,165,
+ 20, 45,148,134,132,132,180,126,245,234, 85,242,148, 41, 83, 20,141, 26, 53,170, 20,103,163, 70,141,100,195,135, 15, 55, 10,132,
+210,166,158,158, 94,117,235,251,215,237,228,227,227,211,157,195,225, 24,223,188,121, 19, 55,112,224, 64, 69,151, 46, 93,156, 43,
+195,233,228,228, 36,155, 50,101,138,209,163,186, 87,251,246,159,126,214,132, 43,148,218,114,120, 98,187,130, 2,141,233,233,211,
+167,113,211,167, 79, 87, 4, 5, 5, 57, 89,194, 89, 80, 80, 64, 59, 56, 56, 32, 32, 32, 0,126, 94, 94,200,205,205,197,129, 3,
+ 7,176,105,211, 38,172, 95,191, 30, 59,119,238, 68,195, 22,159, 65, 42,149, 34, 57, 57, 25, 74,165,146,254,187, 31, 40,211,239,
+190,236, 10,221,136,174,163, 71,143, 78, 30, 62,124,120,170, 80, 40,100,222, 61,228,114,185,169,127,255,254,105, 3,191, 95,218,
+213,188,180, 88,129, 37,235,254,209,163, 71, 95,110,219,182, 13,126,126,126,104,223,190, 61, 15, 0,190,254,250,107, 94,239,222,
+189,177,103,207, 30,236,219,183,239,177,183,183,247, 21, 0,221, 44, 41,231,192,129, 3, 91,132,133,133, 93, 10, 11, 11,187,219,
+167, 79,159,181, 35, 71,142,124,107,228, 74, 73, 78,188,173,211,233, 16, 24,220, 72, 52,103,195,141,254, 21,241, 61, 1,182,173,
+141,142,222,180,240,209,163,184, 25,126,126,118,213, 95,191,150,111, 94,188,216,193,156,164,219, 96, 48, 32, 33, 33, 1, 50,153,
+ 12,253,251,247,119,224,243,249, 3, 45, 40,230,146,110,221,186, 13,142,143,143,151,172, 91,183, 78,113,247,238, 93,215,148,148,
+ 20,197,153,211, 39, 28, 39,125,247,181,212, 86,194,227, 37,191, 97, 9, 0,120,157, 12,113,116, 12, 90,176, 44,236, 74, 46, 39,
+ 86, 9, 10, 8,133,238, 88, 81,171,133,221,179,137,123,130,250, 76,137, 12,118,144, 41,248, 83,203,249, 68,253, 69,139, 22,237,
+141,136,136,232,215,162, 69,139,253, 0,132,165,188, 71,208,176, 97,195, 3,123,246,236, 25,220,178,101,203,203, 0, 2,202,156,
+ 69,186,187,247,248,227,143, 63,236,205,231, 14, 14, 14, 16, 8, 4,239,137, 44, 46,151, 11,146, 36, 43, 93,189,121,187,250,113,
+228,117,181,120,152,125, 20,123, 22,221,199,162, 14, 79,153,249,205, 94,107, 87, 14,140,198,201, 61,247,145,142,251,232,248, 85,
+ 45,244,155, 30,216, 78,100,194,220,127,210, 0,254,230,205,155, 47, 91,181,106,181,183, 99,199,142,218,168,168, 40,188,121,243,
+ 6,110,110,197,115,237,212, 42, 80,202, 69, 34, 17, 60, 60, 60,224,237,237,221,239,226,197,139, 46, 6,131, 1,175, 95,191, 70,
+122,122,250,157,191,163, 78, 37,181,200,191, 12,239, 58,194, 31,121, 79,104, 21,229, 22, 58, 15, 0, 44, 65,168,238, 63,124, 72,
+ 83, 60,222,128,237, 59,118,240,185, 92, 46,226,226,226,240,248,241, 99, 20,156, 57, 3,245,213,171, 72, 75, 75, 67,126,126, 62,
+156,157,157,177,102,195, 6,177,206,196, 14,121,250,236, 25,197,146,108, 73,127,131, 82,183,120,242,249,252,118, 61,123,246, 44,
+ 83,144, 37, 39, 39,163, 99,199,142, 52, 69, 81,165,237,106,120,151,147,112,117, 36, 34,206,236,159,163, 80,240, 30, 3, 47, 38,
+ 0,121,119, 0, 86, 11, 24,117, 64,210, 3,224,200,108, 84,207,143, 38, 78,204, 9,119,113, 19,113, 34, 74, 81,202, 21,109, 69,
+245,242,245,245, 93, 63, 96,192, 0, 18, 0,218,180,105, 67,248,250,250,174, 5,224, 85,206,103, 78, 87, 48, 72, 94,207,206,206,
+ 70,239,222,189,237,107,213,170,117,186,119,239,222,246,230,235, 85,229, 52, 91,147,253,252,252, 50, 5, 2,193, 78,192,162, 14,
+182,152,211,206,206,110,101,199,142, 29,123,237,216,177,131, 11, 0,231,207,159, 71, 68, 68, 4, 30, 61,122,132,231,207,159, 51,
+193,193,193,142, 75,215,239, 93,189,242,247, 45, 75,186, 55, 15,116,109,221, 56,184,174, 36, 63, 59,223,217,217,185, 57,203,178,
+ 94, 22,150,179,227,236,217,179, 31, 63,121, 25,103, 75,114,104, 14,151,230,240,109,108,196,206, 50,169,216, 93, 46, 18,184,241,
+ 73, 66, 82, 80, 80,144,186,115,231, 78, 6, 64, 71, 75, 57,231,204,153, 19,243,228, 69,156, 29, 65,114, 56, 52,135,230, 74, 36,
+ 34,187, 14,237, 67, 27, 1, 0, 23, 44, 87,169, 84,166,109,218,180, 73, 95, 25,206, 31,127,252,241, 97, 86, 78,190,140, 67,211,
+ 52,135, 67, 21,223, 75,177, 80,232, 40,226,243,121, 90,173, 54,105,217,178,101,234,202,112,206,158, 61,251,241,211,151,241,114,
+146, 32, 40,130, 32, 57, 54, 82,177,189,189,173,200,209, 81, 34,116, 16,113, 40,158, 82,169, 76,218,186,117,171, 69,156,122,189,
+158,155,150,150,134, 39, 79,158,192,163, 81, 35,156, 58,117, 10,213,170, 85, 67,239,222,189,209,183,111, 95, 8,133, 66,180,105,
+ 90, 15, 83,167, 78,197,203,151, 47,161,215,235,249,165,113,154,253,164,222,133,171,171,107, 84, 69, 15,207, 59,159,125,171,156,
+ 65, 46, 96, 87,232, 70,116, 45, 41,176,202,226,151,203,229,166,210,172, 93,239,114,118,236,216,241,135, 51,103,206,212,218,186,
+117,107,215,129, 3, 7, 94,222,186,117, 43,154, 52,105,130, 39, 79,158,160,102,205,154,216,188,121, 51,250,246,237,123,121,249,
+242,229, 93,163,162,162, 2, 61, 61, 61,167, 85,196,217,167, 79,159, 49, 65, 65, 65,103, 83, 83, 83,155,102,101,101, 5, 28, 56,
+112, 96, 72,143, 30, 61, 98,250,245,235,215,182, 88, 48, 26, 12, 59,142, 28,222,143, 78, 93,123,162,142,127,192,234, 65,211,182,
+213,171,160,109,178,143,128,181,155, 82, 82,222,236,208,104, 10,122,211,180, 72,116,227,134,124,223,239,191, 59,148,204, 44,144,
+148,148,132, 46, 93,186,208, 92, 46,183,101, 5,229, 92,212,189,123,247,222, 7, 14, 28,144,153,173, 58, 87,175, 94,197,131, 7,
+ 15, 16, 27, 27,139,156,156, 28,180, 29,153,143,209, 11, 10,185, 71, 47, 96,241,217,215,172,184,138,125, 72, 49,132,213,224, 98,
+111,195,185, 50,100, 89,157,175, 71,172,246,227, 72,228, 52,182,127,255, 28, 25,175,181,251,202,224, 36,154, 54,109,186, 45, 44,
+ 44,140,208,233,116,208,233,116, 58, 0,165, 70,245,117,115,115, 19,212,175, 95, 31, 35, 71,142, 36,109,108,108,150,151, 85, 78,
+149, 74,165, 61,122,244, 40, 6, 14, 28,136,241,227,199,163,118,237,218,144,201,100,160,105, 26, 91,182,237,118,232, 59,100,148,
+ 79,131, 22,173, 2,253, 26, 52,169,159,167,165, 26,209, 66,217,240, 50,172, 33,165,214, 61,223, 41, 10, 15, 95, 95,195,138,174,
+137,204,205,205, 5,249,147,190,252, 79,244,211, 11,105,143,166,133,173,125,200, 94,107,150,177,237,155,120,164, 25,158,160,101,
+239,234,240, 12,146,125, 43,246,128,111, 85,239,167,133,168, 20,103,189,122,245, 90,220,188,121,147,223,170, 85, 43,196,197,197,
+129,166,139,231, 83,166, 15, 41,231,236,217,179,249, 26,141, 6,247,238,221, 67,120,120,120,146, 94,175,255,246, 67,202, 89, 25,
+139,150, 89,139,252,203,176,246,157, 35,165, 44,139,214,108, 0, 48, 48,136, 24, 16, 62,164, 32, 50, 50, 82,196,227,241, 16, 23,
+ 23,135,148,148, 20,108,217,180,201,212,198,201, 41,175,189,155,155,114,203,166, 77,172, 78,167, 3,203,178,240,245,245, 69,175,
+ 94,189,132, 95,244,238,151, 78, 40,213,187, 45, 88,230, 81,152,215,215,135, 12, 25,242,222,223, 39, 77,154, 4, 27, 27, 27, 16,
+ 4,225, 98, 65,229,194,198,205,238,238, 46,243,180, 75, 99, 83,183,100,129, 18, 0, 28, 41,192,177, 1, 4,182, 0, 95, 10,240,
+ 68,208, 70,157,205, 34,217,246,177, 61, 91, 14,117, 3, 80,153,165, 30,184,186,186,206, 56,123,246,172, 99, 84, 84, 20,171, 84,
+ 42,145,146,146,194,206,159, 63,223,209,213,213,117, 70, 85,127,145,228,228,228, 57,157, 58,117, 74, 11, 15, 15,183, 61,126,252,
+184, 71,120,120,184,109,167, 78,157,210,146, 7,149,255,129, 0, 0, 32, 0, 73, 68, 65, 84,147,147,231,124,200, 47,205,229,114,
+169, 71,143, 30,201,231,206,157,219, 23,192,109,127,127,255, 76, 55, 55,183,219, 40,116,154, 44, 23, 82,169,180, 88,100,153,173,
+107, 28, 14, 7, 52, 77,195,213,213, 85,151,149,149,101,106,217,192, 75,232,107, 75, 26, 92,249, 92,161, 92, 40,112,151,218,216,
+134,100,102,102,222, 39, 8,226,149,133, 75,124, 65,141, 27, 55,166, 77, 44,205,140, 30,208,198,245,235,193,161, 78,191,205, 29,
+ 94,109,217,156, 17,110,139,102, 13,243,157, 51,185,127, 40,201, 48,154,154, 53,107,186,152, 29,218, 45, 48,159, 7, 55,108,216,
+144,195,128,198,147,103,177,105,113,137, 73,121,159,182,110, 90,108,185,244, 11, 10,110,239,232,232,216,202,215,215,183, 33, 65,
+ 16, 22,109, 73, 22, 10,133, 65,117,234,212,225,144, 20, 77,216,203,164, 30, 82,137,208,185,120, 9,197,206,174,153,220,209, 49,
+140,100,217, 92,133, 66,225, 36, 20, 10,131, 42, 81,119, 14, 3, 46,156,157,228,182,142, 14,118,146,246,161,205,107, 55,109,214,
+212,167, 94, 72,147,166,254, 13, 26,126, 65, 24,141, 74, 47, 47, 47, 39,179,147,124, 5,150, 86,193,142, 29, 59, 48,119,238, 92,
+212,175, 94, 29,110,110,110,112,114,114,194,213,171, 87,113,243,230, 77,200,100, 50,164,167,167, 99,241,226,197, 56,120,240, 32,
+244,122,189,180,178,207,147, 37, 98,171, 60, 24,141, 70,242, 93,129, 85, 22,191, 80, 40,100,204, 78,242,101,225,232,209,163,219,
+204,150,172,111,190,249,166,197,210,165, 75, 47, 71, 71, 71, 67, 34,145,224,230,205,155, 24, 50,100,200,229,229,203,151,183, 24,
+ 53,106, 20, 54,109,218,132,152,152,152, 13,229,241,245,233,211,103,214,176, 97,195,150, 93,184,112,129,116,118,118,134, 76, 38,
+ 67,247,238,221,177, 97,195, 6,142,209,104,220, 24, 22, 22,118, 55, 44, 44,236,174, 41,225,228, 15,123,215,207,191,250,240,254,
+ 93,140, 25, 55,145,167, 51, 26,166, 88, 80,125, 86, 45,145,228, 25, 91,181,202,218, 99, 48, 20,244,225,114, 69,182,119,239,202,
+ 35, 54,110, 44, 22, 91, 83,167, 78,133,173,173, 45, 80,232,192,140,114,172, 58, 35, 14, 30, 60, 88,220, 31,218,219,219,131,199,
+227,129,203,229,130,166,105, 80, 20,133,211,171,197,248,125,106,161,190,248,125, 42,129,147, 43, 9,213,135,252,118, 34, 55, 4,
+200,156,121,119,191,218,236, 31, 24,208,214, 30, 87,119,165, 98,126,167,168,196,155,123,222, 76,208,164,227,151, 50, 62,214, 96,
+210,164, 73,126,233,233,233,184,117,235, 22,110,221,186, 85,150, 5, 72,115,248,240,225,159,243,243,243,225,233,233,137,110,221,
+186,181, 2,208,168,140,118,131,134, 13, 27,162, 75,151, 46, 8, 13, 13, 69,253,250,245,161,211, 27,233,176, 1, 35,234, 60,138,
+121,227, 54,127,241,124,209,217,115, 7,200,203,151, 47, 80,219,246,159,180,109, 26,250,217, 50,174, 84,113, 29, 66,123,133, 37,
+245, 44, 48,101, 34, 72,209, 1,107,207,140, 35, 87,156, 15,151,108,137, 88,225, 37,149, 74,137, 59,183,238, 26,182,172,218, 19,
+ 31, 32,238,150,126,125, 87, 38, 10,136, 84,180, 29,236, 73, 50, 64,175,127,202,200, 46, 16, 8,150, 94,184,112,193, 69,175,215,
+227,225,195,135, 24, 63,126,188,230, 3, 41,139, 13, 32, 30, 30, 30, 56,127,254, 60,250,247,239,175, 73, 75, 75,187,246,119,213,
+169,164, 22,249, 95, 1,167,132,130, 44, 70, 66, 66, 66,142, 76, 38,115,171, 83,167, 14,169,211,233, 10,151, 36,246,237, 51,173,
+223,184,241,136, 70,163, 25, 7,128,187,242,183,223, 86,187,185,187,135, 14, 24, 56,144, 48, 24, 12,232,212,169, 19, 47, 50, 50,
+210,254, 85,122,122,158, 5, 3,206, 91,223, 55,104,208, 32, 44, 93,186, 20, 0, 48,118,236,216, 98,211, 58, 97,129,195,146,196,
+ 22, 29,219,119,110,104,147, 32, 94, 97,163,111,102,200,175,241, 82,122, 93,156, 47,108, 8,146,199,129,128, 2,163, 55, 24,159,
+167,247,184,253,242,121, 93, 63, 97, 86,102,205,118,254,159, 96,253,169,173, 29, 11, 76,154, 61, 22,119, 56, 34, 81, 99,137, 68,
+130,219,183,111,103, 53,108,216, 48,135,101, 89,219, 57,115,230, 56,136, 68,162,198, 31,112,239, 95, 63,123,246,172, 85,243,230,
+205,191, 38, 73,178, 29,195, 48,167,211,210,210, 86, 2,120,109,225,231, 71, 3,248, 17, 64,241,204, 82,167,211,129, 36, 73,176,
+ 44,139, 62,125,250, 96,234,212,169,126, 15, 30, 60,192,217,179,103,229,237,218,181,187, 14, 32, 7,192, 80, 0,165, 90,205,148,
+ 74,165,250,230,205,155,194,179,103,207,130, 97, 24,200,229,114,216,216,216,128,207,231,163,123,247,238,146, 41, 83,166,180, 61,
+113,226, 68,186,178, 70, 53, 74,144,146,164,226, 75, 36, 82,184,184,181, 28,213,239,203,104,150,101, 15, 86,162,115,224, 9, 57,
+ 70, 13, 97,210,146,139,102, 46, 39, 69, 92, 46, 33,224,114,192,103, 10,240,195,207,243, 8, 46,107,226,160,146,235,243, 92, 46,
+151, 43,229, 67, 71,241, 40,131,136, 0,251, 49, 26, 7, 69, 81, 60, 1,183,108,127, 12,154, 36, 73,146, 36,185, 0, 44, 78,218,
+199,231,243,185, 82, 62, 91, 38,167,144, 34, 40,130, 32,120, 40, 99, 39, 90,144, 11, 88,179, 21,137, 55,238,149,182,164, 40,110,
+217,178, 37,142,156,189,141,125, 17,167,145, 17,119, 31,211,191,255, 6,141, 26, 53, 66,100,100,100,185,101, 50,251,104,149,101,
+ 93,118,117,117,141, 74, 78, 78,110, 80,214,103,203, 91, 50, 44,195, 74,245, 62,255, 76, 91, 4,207,142, 70, 5, 62, 90,221, 90,
+182,108, 57,102,199,142, 29,186,207, 63,255,156,215,167, 79, 31, 4, 4, 4,180, 24, 60,120, 48, 0,160, 93,187,118, 88,186,116,
+105,139,193,131, 7, 99,247,238,221, 56,112,224,128,182,117,235,214,223,159, 63,127, 62, 9,133, 59, 58,223, 3,195, 48, 93,214,
+172, 89,243,174,165, 16, 70,163, 17, 6,131, 65, 97, 52, 26, 21, 69,125, 17,150, 45, 91,158,113,242, 68, 36,190,159, 54, 27, 78,
+142, 46, 65, 22, 62, 67,196,160,137, 19, 51, 54, 47, 94,140,197,187,119, 99, 98,205,154,162,173,143, 31,227,164, 70,131, 61,103,
+207,102, 20,125, 79,133,190,153, 42,149, 74,125,244,232, 81,155, 61,123,246,192,206,206, 14,181,107,215,134, 92, 46, 7, 77,211,
+ 32, 41, 33, 40,174, 12,117,252, 27, 3,184, 9, 0,168,233, 10,149,175, 39, 46, 19, 4,114, 88,178,242, 62, 69,252,106,168,225,
+224, 46,184, 48,102, 83,128,157,141, 19, 23,199, 87,198,227,196,138,132,131,154, 12,252, 10, 35,158,162,108,159,175,134,158,158,
+158, 72, 79, 79,199,209,163, 71, 85, 64,153,130, 12, 12,195,252,252,219,111,191, 77,154, 54,109, 26,223,215,215, 23, 0,130, 0,
+220, 42,237,189, 98,177, 24,110,110,110,197,194,178, 79,248, 40,175,145, 19, 70, 9,123,124, 22, 10, 14,199, 1, 57, 42, 3, 50,
+243, 12,144, 57, 72,240,253,132, 48,193,233,134,110,141,214, 44,223,126, 88,173, 70, 35,224,253,254,128, 32,112,235,198,253,203,
+245, 4,190, 0, 65, 2, 9,228, 57, 16, 32,144, 79, 24, 64, 80, 20,107, 50,153, 16, 31, 31, 15,150,101,209,191,199,144,132, 17,
+243, 15, 56,181,232,175,132, 71, 29, 87, 16, 44, 62,249,167, 8, 1,123,123,251,160,204,204, 76,188,126,253, 26,225,225,225, 73,
+ 25, 25, 25,167, 84, 42,213,144,228,228,100, 0,200,170, 2,101,177,152, 15, 10, 10, 66,227,198,141,209,187,119,111, 65, 65, 65,
+ 65,152,151,151,151,219,155, 55,111,154,253,149,245,121, 87,139,252, 79, 9,173, 82, 27,154,193, 80, 71,187,122, 53, 84,167, 79,
+131,119,242, 36,246,184,186,230,107, 52,154,239, 0, 36, 20, 53,252,111, 54,109,222,124,165,235,181,107, 54,186,232,104,120, 61,
+120, 0,218,206, 46,168,178, 5,216,184,113, 35,148, 74, 37,114,115,115, 1, 0, 43, 86,172,128, 82,169,132,209,194,132,179, 28,
+ 46, 90,184, 56,213, 68, 42,158,131,225,144,146,216, 58, 5, 77, 36, 26,105,178, 91,188,179, 42,151,116, 67,116, 92,136, 88,157,
+169,107, 66, 80, 58,104, 50, 10,224,214,188, 54, 56,224,180,168, 76, 25,205,235,254, 28, 14, 39,235,217,179,103, 93,124,124,124,
+ 34, 0, 56, 84,197, 31,224, 29,188, 72, 75, 75, 27, 87,149, 15, 82, 20,245, 99, 76, 76,140,211,134, 13, 27,190,158, 51,103, 14,
+ 91, 82,104,153,255,207,225,112,192,178, 44,108,109,109, 65,211,180,243,213,171, 87,157, 67, 66, 66, 86, 49, 12, 19, 84, 70, 61,
+217,128,128, 0,196,196,196,128,195,225,192,214,214, 22,140, 81,143,217, 19, 70,193, 68,241, 57,147, 39, 79, 14,234,217,179,231,
+195, 13, 27, 54, 24,108,154, 54,111,150,153,153,249,104, 76,255, 1, 15, 15, 29, 58,164, 43, 10,241, 80,241, 20,159,101,239, 62,
+127,254,156,114,119,117,166, 88, 99, 1, 35,230, 2,130,251,203, 88,158,196, 5, 2, 14,197,114, 9, 18,124,129,208,246,117, 98,
+ 98, 38,195, 48, 79, 44,225,100, 24,230, 78, 76, 76,140,208,217,201,158, 83,160,214,229, 11,105,150, 23,123,231,246,171, 26,193,
+ 13,189, 0, 64,115,231,230,121,126,157,186,194,216,180, 55,226,154, 53,107, 90,196,169, 86,171,239, 38, 37, 37, 81,206,206,206,
+156,184,132,196,195,118, 18,177,163,141,157, 93, 19, 0,208,231,229,222, 36,181,218, 55, 20,205,113,126,147,153,153,165, 86,171,
+ 99, 44,173,251,203,151, 47, 57, 10,133, 19,117,252,228,153, 8,103, 17,223, 73,202,227,216,240, 9,130, 16, 81,132,146,107,100,
+ 50, 4, 34,145,211,235,196,196, 44,150,101,203,180, 16, 46,204, 25,208,163,240,247,154,189,187, 4, 55,238,223,191,143, 99,151,
+159, 64,204,234, 64,104,114,113,114,211, 58,244,159, 60,237,131,253,254, 42, 18, 91, 85,178,102,173,169, 27,245, 14, 63, 82, 42,
+112,132,239,223,191,255,236,109,219,182, 21, 59,160, 60,121,242, 4,109,218,180, 49, 47,115,160,125,251,246, 8, 9, 9,193,147,
+ 39, 79,224,237,237,141,179,103,207,242, 41,138,226, 15, 24, 48, 96,254,246,237,219,143, 86,104,247, 95,187, 22, 67,134, 12, 41,
+205,177,250, 37, 0, 13, 33,243,205,159,186,112,139, 67, 86,102, 6,210,223,164,222,181,244, 62, 16, 4,129, 65, 19, 39,102,172,
+209,233,176,227,198, 13, 12, 20,139, 69,155, 95,188, 64,167,144, 16,212,107,211, 38,195,146,190,206,108,213,209,104, 52,160,105,
+ 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187,130,195, 11, 4,201,229, 34,184,101, 32, 22,127, 39, 46, 8,239,128,229, 4,
+129, 28, 62, 15,119,184,162, 50,125,117, 8,113, 53,116,103, 89, 40, 11, 18,112,206, 44, 72,108,171,195,150,150,210, 39,135,173,
+242,181,179,113,226,226,216,242, 56,156, 92,149,184, 95,147,138,233, 69,247,130, 41,103, 34, 81,207,206,206, 14, 9, 9, 9,136,
+143,143,127,140,242, 29,252, 11,158, 60,121,242,138,207,231,251, 57, 58, 58, 2,128,103, 89, 19,115,134, 97,138,253,176,182,238,
+216,235, 16,212,202, 75,240,105, 11, 63,108,137,152,135,175,194,150,131,166, 8,152, 76,122,252,186,180, 51, 76,218,124,132,117,
+ 29, 65,124,210,206, 59,240,116,132,110,152, 65,157,189,238,189,137, 0, 7,115,255,211,247,170, 29, 95, 66,214, 3, 67,216, 57,
+ 56, 56,137,185, 92, 46,236,109, 20,186,105, 35,191, 77, 97, 89,182,184,221,208, 20,215, 64,230,201,213,153,169,249, 66, 59, 90,
+ 13,176,100,141,170, 69,179,249,248, 72, 76, 76, 28,215,170, 85,171,249,121,121,121,217, 42,149,170, 63, 0,120,122,122, 86, 39,
+ 73,146, 15,160,188,213,145,234, 40, 61, 44, 4,247,193,131, 7,144, 74,165, 72, 74, 74, 42,105,124, 1,195, 48,255,152, 77, 0,
+255, 80, 4, 3,184, 3, 64, 1,160, 19, 74,132,119, 32,139, 76,117,159, 68, 70, 70,178,145,145,145,159, 20, 15, 94, 44,203, 24,
+179,178,192,106, 11,239, 45, 77,211, 44,128,146, 59,154, 68,118,118,118, 4,237,238, 14,130, 95,232,250,193,126,196,173,175, 6,
+131,101,161,101, 24, 19, 40, 16,122,176, 37, 38, 45, 42, 1,129,121, 14,109, 49,142, 55, 3,169, 60,187,146, 35, 29, 96,100, 97,
+ 2, 67, 85,178, 56,172, 74,165,130,209,104,148,213,170, 85,235,136,209,104,148, 21, 13,110,236,127,235, 23, 53,153, 76,175, 40,
+138,194,215, 95,127, 13,179,245, 71,167,211, 33, 53, 53, 21, 90,173, 22, 58,157, 14, 49, 49, 49,200,205,205,133, 78,167,195,163,
+ 71,143,224,233,233, 9,138,162, 20,229,116,230, 44,203,178,240,240,240, 64,141, 26, 53, 64, 17, 44,214, 47,154,133, 31,198,143,
+ 66, 95, 79, 6, 27, 87,254,138,214,173, 91,215,173, 89,179,102, 83, 14,135, 99,114,113,113,225, 30, 56,112,224,176,201,100,234,
+ 14,203,123,158,163, 83,167, 78,173,225,239,239,239,100,103, 35, 53,240,121, 20,120, 6, 21,203,215,102,178,156,130, 12,120,120,
+ 84, 55, 66, 40,242, 30, 56,112,160,169, 44, 43, 68,105,156,223,125,247,157,194,215,215,215, 86,102, 39, 85,241,104, 42,157, 11,
+ 54, 35,247,254,173,235, 0,192,115,116,210, 64, 32,242, 11, 15, 15, 55, 86,134,115,198,140, 25,158,142,142,142,118, 36,216, 60,
+147, 94,255,231,122,187, 86,151, 73,208,180, 26, 92, 94,195,177, 99,199, 18,149,225,156, 52,105, 82, 77, 63, 63, 63, 59, 59, 27,
+113, 62,135,166, 82,184, 12,147, 34, 0,147, 74,235,244,217, 2, 71,135, 2,136, 36,193, 3, 7, 14, 44,147,211,108,205,154, 50,
+101, 74,194, 59,194, 27, 89, 89, 89,208,164, 62, 4, 55, 41, 26,129, 18, 26,141, 28,101,224,243,249,197, 91,223,203,122, 92,203,
+242,209, 42, 77,108, 89,250,217,134, 63,149,179, 4,184,166,110,212,187,113,179,146,147,147,161, 80, 40,202,109, 79,219,183,111,
+159, 22, 26, 26,154,222,190,125,123,221,145, 35, 71, 64, 16, 4,206,158, 61,139,164,164, 36,180,111,223, 30, 44,203,154,119,181,
+225,238,221,187,104,215,174,157,174, 85,171, 86, 73, 69,241,181, 42,196,144, 33, 67, 96, 48, 24,144,159,159,143,172,172, 44, 68,
+ 70, 70, 34, 48, 48,144, 21,137, 68, 61, 41,143,207,230,133, 13,155,214, 44,160,126, 16, 86, 45, 95,172,227,113,232,133,149,105,
+175, 4, 65, 32,252,187,239, 50,114,131,131,179,182,170, 84, 5,131,108,108, 68,181, 18, 18,228,183, 79,156,112,208,235,245, 22,
+113,152,173, 58,238,238,238,197, 34,139,203,229,130,195,115, 4, 37,174, 7,158,125,123,136, 92,122,226,220, 29,190,214, 86,140,
+131, 82, 9,142,139,237,202, 14,237, 32,242,192,188,102,125, 20, 7,154,247, 85,156, 17, 85,195,134,162,241,128,100, 57,196,129,
+193,191,250,212,114,172, 33,196,181,189,169, 56,185, 42,241, 15, 77, 42,102, 1,120, 81, 81, 59,215,235,245, 26,147,201, 4,146,
+ 36,193,225,112, 74,250, 4, 94,249,227,143, 63,112,251,246,109,160, 68,216,158,188,188, 60, 19, 69, 81, 16, 8, 4, 0, 32, 41,
+167,191, 3, 77,211,160,105, 26,231,175, 95,180,239,251, 69,103,226,234,189, 83,104, 30,216, 15,153,249,122,164,229,234,145, 83,
+ 0,248, 55,154,142,128,118, 7,113, 63, 38, 15, 65,245, 3, 40,138, 39, 14, 47,141, 79,243, 26, 9,170,120,244,202,124,204,212,
+214, 37, 10,143, 93, 59,244,228,241,197,125,247, 31,237,250, 45,226, 69,179, 70,173, 84, 69,198, 4,228,231,231,179, 4, 65,176,
+223, 14,159,246,106,235,144,108,211,242,254,247, 25,142, 86,240,242,111,236,234,171, 59, 58, 58, 94,181,183,183, 63, 91, 36,142,
+170, 75,165,210, 43, 10,133, 34, 26,133, 27, 61, 14,165,164,164,248,170, 84,170,230, 40,220,156, 21,151,153,153,217,166,200,242,
+ 20, 87,142, 37,108,131, 82,169,252,198,100, 50,117, 45, 58, 58,152, 76,166,160,231,207,159,251, 5, 5, 5, 61,246,242,242,186,
+235,229,229,117,204,203,203,235,176,151,151,215,225,208,208,208,165,230,112, 15,127,241,178,225,123, 90,228, 95, 38,180, 80, 36,
+178,214, 22,189,162, 88,104, 1, 56,255,174, 3,154,145,207,127,100, 28, 51, 6,118,135, 15,131,126,254, 28,131,195,195,109, 68,
+ 34,209,114, 20,198,104,106, 46,145, 72, 86,205,154, 53, 75,234,176, 96, 1, 92, 47, 94, 68,108,100, 36, 12, 52,125,171, 42,165,
+ 83,171,213,224,112, 56,197,150, 24,177, 88, 12,147,201,132,210, 76,190,239, 53, 64, 35,174, 37,165, 69,131,135, 26, 96,192,230,
+ 31, 87,182,186,209,239,213,116,167, 72,165,167,247, 11, 21,215,251, 39,199, 38, 78,203,171,183,184,161, 34, 56,249, 60, 59, 1,
+226,227, 19, 96, 2, 83,169,245,102,141, 70,147,171, 82,169, 16, 20, 20,100,127,251,246,237, 90,129,129,129,242,162,235, 55, 63,
+240,135,105,234,234,234,186,215,205,205,237,181,171,171,235, 94, 0, 77, 43,241,217, 13,151, 46, 93, 2, 69, 81,152, 53,107, 22,
+242,242,242,160,215,235,145,153,153,137,248,248,120,232,116, 58, 36, 38, 38,226,233,211,167,208,233,116,136,141,141,133, 86, 91,
+241,132,132, 97, 24,216,216,216, 64,163,206,199,239,243,126,192,140, 41, 19,144,251, 50, 10,137,201,105,176,179, 21, 99,220,184,
+113,148, 76, 38, 99, 24,134,169, 97, 50,153,218, 49, 12,179,218,146,223,169,196,243,118,217,195,195, 35, 96,209,162, 69,126, 63,
+204, 91,205,181,225,228,179,124,169,128,225, 73,249, 44,175,110, 19, 12,153,190,156,187,108,201, 47,207,174, 93,187,150, 4,203,
+130,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250,214,113,168, 94,147,207, 87,184,229,112, 21,213,148,172, 86,115,
+131,112,171,214,114,245,234,213, 15,175, 92,185,146, 92, 25, 78,177, 88, 92,119,203,150, 45, 1,206,206,206, 1,180, 80, 40, 40,
+200,205,221, 99, 44, 80,237,165,236,100, 2,210,198,174,195,193,131, 7,163,246,239,223,159, 90, 25, 78,111,111,111,223,121,243,
+230,249,215,171, 87,207,223,197,179, 22, 95,232,230,145, 41,112,175,158, 41,172, 23,200,135,123,141,207, 87,173, 90,117,247,218,
+181,107, 22,113, 82, 20,101, 36, 73, 18, 52, 77, 67, 36, 18,225,248,241,227, 24, 51,172, 31, 60,220,236, 81,199,215, 23,109,191,
+250, 6,251,247,239, 47,246,225,161, 40,170,204, 17,125,243,130,113, 17,193, 10, 34, 10,107,234, 70, 97, 77,221,168, 96, 5, 17,
+ 85,166,216, 42,250,123,105,239,177,168, 55, 42, 99,185,209, 2,177,117,244,252,249,243, 63, 15, 26, 52,136,215,177, 99, 71,220,
+184,113, 3, 67,134, 12,185,124,224,192, 1, 0,192,141, 27, 55,240,237,183,223, 94, 62,115,230, 12, 70,141, 26,133, 54,109,218,
+240, 46, 93,186,180, 10, 22,196,254, 49, 26,141,216,184,113, 35,140, 70, 35, 36, 18, 9,228,114, 57, 58,119,238,140,135, 15, 31,
+142,218,180,105, 83, 52, 69,211, 95,118,234,250, 5,142, 28, 62,128,167,143, 30,142,218, 60,127, 64,165,131, 2,147, 36,137,142,
+225,225, 25, 25,254,254, 89,155,149,202,130,161, 50,153,200, 55, 53, 85,126,110,239, 94, 7, 11,132, 26, 97, 50,153,138,197,149,
+ 89,116,152, 15, 14,207, 17, 28,113, 0, 56,210, 70,184,255,130,107,224,134,224, 14,175, 17,158,148, 23, 63,139,230,145, 67,122,
+254,224,137,158, 63,120,162,219,228,154,131, 69,213,176, 94, 92, 13,163, 59,142,175, 17,234,213,200, 22,202,116, 61, 34,127,141,
+141,211,100, 98, 1,128,167,150,180,115,134, 97, 30, 39, 37, 37,129,199,227,161, 90,181,106, 62, 0,204,126,129, 27,134, 15, 31,
+ 62,246,167,159,126,154, 0,224,167,162,107,146,208,208, 80,255,252,252,124, 60,127,254, 28, 0,110,151, 99, 13, 46,222,101,152,
+165,140,229,215,116,173,135,192,186, 35, 33,147,213, 71, 82,150, 14,201, 89, 58,172,255,189, 59,162, 46,205,197,237,147, 3, 17,
+151,154, 10,161, 75, 15,152,140,218, 0, 11, 38,245,174,247,238,221, 35, 46, 93,186, 68, 48, 12, 3,131,193,192,230, 41,149,236,
+157,203,151,161,190,112,129,176,177,177, 33, 90, 52,110,149,191,121,238,145,155, 7, 87, 94,190,173, 47,168,244, 68,253, 67, 48,
+227,213,171, 87, 77,247,238,221, 27, 10, 96, 70,189,122,245,174,197,199,199, 55,187,120,241, 98, 29,119,119,247,229, 85, 37, 53,
+135,133,136,141,141,125,235, 40, 10, 11,161, 43, 18, 13, 29,139,196, 92, 55, 0,223,226, 3,118,217, 87, 2,231,255,197,206,240,
+ 71,240,206,110,195,119,133, 86,201, 64, 97,240,146,201,164, 6,131, 62,241,212,169, 83,122,146, 36, 33, 18,137, 48,104,200, 16,
+242,247,223,126,107,217,175,105,211,179, 35, 62,253,244,216,217, 51,103,130, 67, 66, 66,192,178, 44, 72,146,196,238,221,187,213,
+ 26,141, 58,211,195,195,195,206,146, 78,163,100, 3, 82, 42,149,197, 66, 43, 55, 55, 23,206,206,206, 22, 47, 29,170,148, 56,125,
+230,120, 84, 54,107,250, 42,190,227,139, 37,250,133,169,221, 67,114, 24, 19, 39,215,100, 64,174,154, 69,158, 6,156, 27,164, 60,
+100,144,119, 15,125, 76,187,144,167, 23,162,175,102,106, 76,154, 74,237,150, 72, 79, 79,255, 33, 44, 44, 44, 83,161, 80, 16, 54,
+ 54, 54,112,115,115, 35,187,117,235,150,145,144,144,240, 83, 85,127, 17,123,123,251,190,161,161,161, 17, 73, 73, 73,189, 46, 92,
+184, 80,227,226,197,139,189, 66, 67, 67, 35,236,237,237,251, 90, 72,177,103,218,180,105, 42, 30,143,135, 38, 77,154, 32, 47, 47,
+ 15, 69,187,124,202, 61, 44, 89, 34,229,114,185, 88,179,232, 71,204,152, 50, 1, 89,209, 55,112,255,242, 41,156, 79, 37, 48,125,
+222, 47,224,114,185, 85,138,245, 85,219, 81, 84,175,158,171,244,201,183, 67,250, 36, 79,157, 50, 69,122,247,238, 93,122,236,248,
+111,217,216,148, 44,240, 58, 46,166,240,201, 15,228, 61,149, 35, 58,117,104,139, 89, 51, 38,214, 43, 10,218, 89, 46,234, 58,138,
+234, 5,184, 74, 31, 79, 28,209,239,213,248,241,227,133, 11, 23, 46,212, 52,109,218, 84,157,150,150, 38, 20,203,228,190, 28, 91,
+187,128,216,148, 84, 73,211,166, 77, 99,190,250,234,171,156,202,114, 78,159, 62, 93,116,226,196, 9, 78, 88, 88,152, 49, 59, 59,
+ 91, 66, 11,133, 65, 4, 95,208,248, 77,118,182,109,175,176,176, 23,189,122,245, 42, 40, 10, 88,106, 49,231,204,153, 51, 69, 79,
+159, 62,229, 52,109,218,212,144,154,154, 42, 21,219, 59, 4, 82,118,242, 70,175, 83,210,108, 26,135,132,188, 28, 59,118,172,170,
+188,114,150, 20, 41, 82,169, 52,169,121,243,230,248,245,215, 95,177,108,217, 50,124,254,249,231,120,248,232, 33, 58,141,157, 0,
+191,209,223,226,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24, 24, 8, 46,151,251,180,212,246, 56, 42,154,184,155, 10,226,110,
+ 42, 8, 98, 84, 52, 97, 62, 47,211,178,245, 83, 46, 74,190,191,180,247,221,158, 89,186,165, 43, 88, 65, 68,149,231,135, 85,145,
+216,234,213,171,215, 24,115, 8,135,161, 67,135, 94, 94,190,124,121,139,161, 67, 11, 39,218, 77,154, 52,193,220,185,115, 91, 76,
+159, 62,253,242,188,121,243,208,182,109, 91,120,121,121, 85,184,241,197,100, 50,193,104, 52,162, 95,191,126, 48, 26,141,120,243,
+230, 13,158, 61,123,134,181,107,215,130,101, 89, 1, 0, 40, 92,221, 27,242,120, 60,220,187,115,171, 96,198,208,144,237,149,176,
+100, 17, 37, 39, 49,249,249,249,232, 53,122,116, 70, 98,237,218, 89,171, 51, 50, 10,134,201,100,162,154,113,113,114,169, 78,231,
+134,114,252, 18, 9,130, 0,195, 48,197,194,202, 44,184,222, 61,138, 6, 74,139,160, 47, 96,142, 94,220,150, 12, 0,104, 53,192,
+ 21,221, 38,215, 28,172,240, 22,173,104,217,191,208,232,189,127,238, 43, 54, 47,217,180, 16, 6, 60,174,132,197,250,198,141, 27,
+ 55, 96,103,103,135,176,176, 48, 62, 73,146, 11,204,243, 85, 20,198,206, 90, 98,230,226,243,249,139, 7, 14, 28, 72,230,228,228,
+224,254,253,251, 0,112,166,172,126,137,101,217,226,186,231,103, 17, 48, 49, 60, 92,185,115, 28, 39, 47,238,195,235,164, 55,136,
+ 75,215, 0, 28, 91,104, 84,137,208,171,147,160,203,185, 3,165, 86,100, 81,129,185, 92,238,155,122,245,234,177,141, 26, 53, 98,
+ 89,150,197,203,151, 47,141,177,113,113,198, 91, 75,151,178, 15, 70,142, 36,164,207,158,113,133, 66, 33,225,233,233, 9,129, 64,
+192, 8, 4,130,204,191,113,240,254, 75,194, 45,252, 5, 97, 33, 62,166, 85,139,197,191, 19, 41,120,123,183, 97,113, 0,211,210,
+ 2,150,130,181, 17,246,217,183,234,119,219,176,126, 3, 84,129,129,129, 50, 55, 55, 55, 16, 4,129,238, 61,122, 16,161, 23, 46,
+ 72,105, 87, 87,216, 55,104, 80,188, 28,113,250,212, 41, 28, 63,126, 92,117,228,143,131,110, 67,134, 13,235, 2, 96, 75, 57,133,
+225,240,249,252,226,239, 77, 73, 73, 1,159,207, 47,246,137, 80, 42,149,112,116,116, 68, 74, 74, 10, 44, 92,153,219, 58,117,202,
+245, 41,233, 33, 63,120,134, 72,105,226,152, 42, 21, 38,150, 5, 77,152, 0, 53, 11,131, 9,208, 26, 88, 52,172, 73,201, 79,170,
+141,178,200, 27, 7, 98, 0,108,173,204,221,211,106,181,231,238,222,189, 59,146, 97,152,125, 0,200, 11, 23, 46, 48,143, 31, 63,
+ 30, 3,203, 29,215,223, 55,219,139, 68,147,207,158, 61, 43,159, 60,121,114,118,100,100,100,110,231,206,157,109,215,174, 93, 43,
+111,211,166,205,228,204,204,204, 93,150, 24, 2,227,227,227,183, 36, 36, 36,140,105,212,168, 17,178,178,178,160,215,235, 17, 21,
+ 21, 5,111,111,111,220,190,125, 27, 62, 62, 62,184,117,235, 22,234,212,169, 3,147,201, 4,141, 70, 3,134, 97, 76, 21,117,230,
+ 89, 25,111,128,204,120, 36,223, 56,134,103, 15,162,112, 54,153,192,202, 93, 17,168, 86,195,179, 74,113,106,124,156, 68,254, 10,
+ 71,251,147, 11,103,207,116,138, 61,183, 27, 7, 54,174,100,206, 31, 59,230,199,147, 98,228, 39,253,190,249, 66,103, 64,117, 0,
+188,102, 33,141,208, 81,246,212, 36,170,129,212,179,143,203, 15,176,232,227, 36,242,119,118,176, 63,241,159, 5, 63, 73, 95, 30,
+223,140, 61,107,126,101,247,111,219, 25,168, 1, 66,252,253,253, 59,146, 36,105, 7, 64, 83,228,231,101, 81,106,155,210, 56, 79,
+ 71, 68, 4,107,128,144, 67,135, 14,117, 20,137, 68, 46, 0, 12, 5, 5, 5,175, 62,132,243, 76,100,100,176,185,156, 4, 65, 56,
+ 1,208,179, 44,251, 18,149, 76,193,211,187,119,239,185,223,126,251,237, 20,147,201,228, 88, 98,118, 78, 45, 94,188,152,195, 48,
+ 12,197,178,172,158, 36, 73,253,137, 19, 39, 76, 70,163, 49, 89,163,209,140,254,144, 94,228,139, 47,190,192,245,235,215,103,163,
+112, 19,134,165,214,234,183,252,180,138, 82,246, 84,153,255,194,133, 11,115,190,252,242,203,169,187,118,237,122,182,124,249,242,
+174,163, 70,141,194,238,221,187, 81,187,118,109,220,187,119, 15, 63,252,240, 3, 0,180,152, 62,125,250,225, 13, 27, 54,120,197,
+198,198, 46,182,192,162, 1,163,209,136,157, 59,119,162,123,247,238,112,116,116,132,171,171, 43, 8,130, 56, 55,108,216,176,223,
+ 0,128, 34, 40, 46, 0,104, 53, 90,173,175,111, 35,139, 45,184, 92, 46,183,184,175, 75, 77, 77, 45,222, 41,248,217,151, 95,102,
+172, 95,184, 16,219,213,106, 12,147,201, 68,137,238,238,138,195, 47, 95,142,120, 84,216, 57,179,229, 89,117, 42, 18, 89,150,186,
+ 52,168, 83, 48,237,143,249,175, 93, 0,124,222,106,128, 43, 90, 13,112, 69,163,110, 78, 4, 73, 17,120,112, 50, 19, 15, 79,103,
+237, 55, 40,113, 14,149, 75,151,243,120,193,130, 5,135, 63,249,228,147,174,117,235,214,197,240,225,195,191,218,184,113, 35,215,
+ 96, 48,140,199,159, 97, 30,108, 73,146,252,105,205,154, 53, 35,228,114, 57, 46, 93,186,132,139, 23, 47,158, 3, 16, 95, 86,191,
+ 4,160, 56,102, 86, 53, 15, 31,205,211,216,124, 81,122,210, 21, 92,190,244, 7,106, 7,126, 3,161, 75, 23,200,125,231, 65, 31,
+189, 12,186,204,147,144,123,116, 70, 98,236, 75, 80, 28,254,195,138,156, 80, 88,150,125,148,152,152,232,229,229,229, 69,188,126,
+253,218, 8,128, 53,153, 76,172,190,101, 75,131,223,194,133,244,195,175,190, 34,154, 61,125, 74,177, 4,193, 68, 69, 69, 1,192,
+147,255,198, 40,110, 14,183,240,240,225,195,178,194, 45, 84, 10,245,234,213,107,113,241,226, 69,190, 70,163,193,249,243,231,209,
+184,113,241,222,174,255,106,244,251,146, 90,228, 95,134, 17,165, 92, 91,251,150, 69,235,173, 7,155, 33,232, 58, 62, 62, 38, 46,
+137, 77,221,187,116, 41,184,123,247,110,241,172, 79,115,243, 38, 84,199,143,195,100, 50,129,101, 89, 92,188,112, 1, 3, 7, 12,
+200,167, 41, 98,125,205,154, 53, 88,130,125, 43,118, 75,187, 82,102, 15, 97, 97, 97, 97,197,157, 79, 66, 66, 2,196, 98, 49,120,
+ 60, 30, 24,134,129,209,104, 4, 69, 81,176,181,181,133,209,104, 44,205, 4,243, 46,167,193,148,165,234,181,161, 83,255, 20,215,
+124, 61, 59,210,174, 38,170,115,133,197,141,211,197,134, 64,215, 64, 26, 14,156,116,246,204,226, 79,147, 25,109,102, 47,188,191,
+163,171,162, 45,255, 62,245,235,215,255,109,224,192,129, 36, 0,180,107,215,142,172, 95,191,254, 10,148,159, 42,167, 92, 78,129,
+ 64,192, 7,128,136,136,136,172,103,207,158,125, 30, 17, 17,145, 85,242,186,133,156,107, 23, 45, 90, 4,145, 72, 4,163,209, 8,
+157, 78, 87,236,159, 85,242, 85,175,215,195,193,193, 1, 71,142, 28,129,201,100, 58, 82, 81, 57, 61,170,215, 0,225, 88, 11, 91,
+ 34,206,226, 98, 6,183, 42, 34,171,152,179,150,139,184,142,139,131,253,169,255,204,159,227,152,253, 34, 10,137,137,137,236,137,
+227, 71,174,105,128,164,220, 60,204,200, 81,161,142, 90, 7, 65, 99, 47,196,159, 90,243, 61, 59,189, 21, 12, 40,125,215, 96, 49,
+167,159,139,184,142,155,163,253,137, 95,254, 51, 95,154,243, 34, 10, 41,169,169, 56,122, 36,226,174, 6, 48, 47, 55, 14,102, 24,
+ 38,128, 97,152, 0, 0,131,203, 17, 47,149,226, 44, 40, 40,168, 87, 80, 80, 80,239, 99,114,178, 44, 91,143,101, 89,139, 57, 75,
+250, 68, 45, 89,178, 36, 58, 37, 37,101, 96,122,122,122,123,243,145,157,157,221, 46, 63, 63,191,117, 65, 65, 65, 75,245,146, 26,
+182, 5, 5, 5, 78,249,249,249, 10,141, 70,211, 16, 64, 84, 37,158,249, 98,148,140, 58,157,146,146, 50, 43, 37, 37,133,168,168,
+156,212,232,104, 98,199, 47, 19,255, 88,179,102,141,226, 3,249,223, 42,103, 70, 70,198,190, 93,187,118, 5,121,122,122,122, 13,
+ 30, 60, 24,171, 87,175,198,242,229,203,181, 0,176, 97,195, 6,109, 9, 75,150, 71,108,108,108,163, 50,150, 13,219,149,176,150,
+108,253,236,179,207,216,139, 23, 47,162,123,247,238,197,129, 68,215,173, 91, 7,163,209,168,108,219,182, 45, 3, 0,106, 77,129,
+146,101, 88,232,244,101,174,191,191,119, 63,121, 60, 94,135,146,241, 2,205,193,152,121, 60, 30, 88,150, 69,157, 22, 45, 50,114,
+ 2, 3,179, 54,230,230, 22,204,170, 87,207,102,132,175,239,224,186,192,128,210, 56, 9,130,120,203,170,243,238, 81, 9, 75, 86,
+201,114,166,171,147, 49,252,143,249,175,143,155, 45, 91, 2, 9, 7,154, 60, 35, 14, 46,124,253, 70,243, 6,235,202, 18, 63,229,
+213, 61, 43, 43,107,236,194,133, 11,181, 50,153, 12, 95,124,241, 5,230,205,155, 55,172, 69,139, 22,185, 78, 78, 78,215,107,215,
+174,253,160, 79,159, 62, 41, 81, 81, 81, 99, 67, 67, 67,241,252,249,115,252,242,203, 47, 57,217,217,217,253,203,227, 36, 8,162,
+216,146,215,173, 83,187,172,223, 87,252,202,180,253,100, 12, 68, 66, 27, 24,104, 15,100,229, 27,144,173, 98,161,227,135,128,199,
+229,163,125, 83,127, 92, 63,177,185,192,164, 83,109,169,232,153,207,207,207,223, 63,104,208, 32, 37,151,203,133, 78,167, 99,105,
+154, 6,191,208,239,152,161, 63,255, 92,223,236,241, 99,163,137,101, 25,130, 32,240,221,119,223,169,178,179,179,119, 85,165, 29,
+ 85, 2, 37, 57, 63, 86,184,133,118,239,140, 63, 31, 35, 44,196, 95, 81,247,127, 51,214,150,114,252,105,209, 50,111,169, 52,191,
+ 18, 4, 99, 50,153, 24,212,244,172, 41,141,125, 29,191,178,119,239,176,161, 29, 59,118, 18,117,234,212, 73,224, 31, 93, 56, 27,
+141,136,136,192,129, 3, 7, 10, 78,158, 60,169,228,211,212, 6,143,106, 30,206, 38, 19, 3,130, 96,202, 85,195, 82,169,116,252,
+180,105,211,132,185,185,185, 88,190,124, 57, 19, 20, 20, 68,138,197, 98,232,245,122,108,216,176,193,224,239,239, 79,147, 36,137,
+220,220, 92,144, 36,249,212,194, 10,222,207,141, 79,106,255, 91,104,207, 3,141,190, 30, 98,239, 23,218, 76,214,218,195, 13,134,
+ 6, 44,146, 19, 94,227,217,153,147,217,143, 78, 44,205,132, 38,173, 39, 42, 78, 15, 84,218, 64,240,227,201,147, 39,157,198,142,
+ 29,203,106, 52, 26, 34, 62, 62,158,157, 63,127,190,211,240,225,195,127, 76, 78, 78,238, 91,197, 31,133,200,201,201, 1, 65, 16,
+ 76, 81, 71, 98,158,245, 87,102, 93,238,225,150, 45, 91, 14,245,232,209,163, 91,219,182,109, 17, 29, 29, 93,188, 68, 88, 82,104,
+153,119, 31, 46, 88,176, 32, 7,192,212,138, 72,105,154,198,242, 45,251,144,147,157, 1,103,103, 87, 8,132, 66, 84,117,135, 37,
+143, 36,103,253, 60,103,166, 83,198,147,235,196,195,107,103,153,189,247,211,210,141, 38,182,244,136,255,121,201,108,145,250, 47,
+127, 54, 67, 82,179,126,158,255,147,173,121, 89,115,215,157, 20, 37, 97, 98,199,126, 80, 19,249,183,112,254,205,112,117,117, 69,
+ 74, 74, 10,225,234,234,202, 22,249,104,177,229, 8,173,183, 31,240,194,229, 50,162,188,101,195,170,242,199,196,196,204,111,208,
+160,193,196,231,207,159,239,245,243,243, 27, 5,160,154, 86,171,205,153, 62,125,250,127, 54,108,216, 48,212, 18, 75, 22, 0,236,
+222,189,123,233,144, 33, 67,142,119,233,210,229,123,134, 97,234,151, 24,216, 99,156,156,156,138,151,112,223,164,165, 78, 25, 57,
+180,223,148,252,252,108,139,227,220, 73, 36,146, 17,211,167, 79, 23,168, 84, 42,172, 90,181,138,241,247,247, 39,205,147,162,109,
+219,182, 25,125,124,124, 56, 97, 99,198,100, 44, 73, 77,197,220, 75,151, 84, 83, 2, 2,130, 54, 62,123,214, 16, 12,179,181, 44,
+171, 78,105,150, 44,179,219, 69, 21,145, 92, 36,182,214, 1,248,188, 89,111, 23, 28, 90,244, 26,217,177,186,255,192,136,151,176,
+ 32, 45, 80, 41, 72,220,191,127,127,251,180,180,180, 67, 51,103,206,180,109,216,176, 33, 2, 2, 2,104,137, 68, 18, 98, 14, 23,
+147,155,155,139,211,167, 79, 99,245,234,213,186, 71,143, 30,245, 40,111,185,202,100, 50,165,251,248,248,152,239, 3, 75, 16, 68,
+166, 82, 75,216,238,169, 27, 34, 25, 60,114, 47,113,249,214, 85, 36,235, 25,104, 13, 12,106,122, 6,163,245,231, 75,112,248,216,
+ 3, 83,114,236,227,199, 6,117,246,122, 11,202,251,242,197,139, 23, 7,231,204,153,211,251,251,239,191, 23,102,100,100,152,180,
+ 90, 45,179,111,223, 62,106,240,224,193, 38,150,195, 97,184, 28, 14,198,143, 31,175,206,201,201,249, 3,248, 91, 19, 76,255, 37,
+225, 22,254,130,176, 16, 31,205,154, 85,242,245,127, 5,165,182, 80,134, 34,175,172, 94,243,123,135,221, 59,119,185, 80, 20,233,
+242,242,213,171, 91, 93,123,246, 74, 58,117,234,148,156,107,107,219, 24, 0,163, 27, 53,234,154, 94,171,206,138, 60,116,168,122,
+205,154, 53, 2,139,146, 74,179, 12, 69, 94, 41,239, 11,243,243,243, 85,151, 46, 93, 42,152, 58,117, 42,145,144,144,176,195,217,
+217,185,207,177, 99,199, 36, 61,123,246, 84, 71, 71, 71,239,119,113,113,233, 22, 26, 26, 42,157, 56,113,162, 54, 63, 63,191, 50,
+137, 71, 31,179,111,178,235,222,156,185,248,203,155,139,126,255, 20, 28,170, 57,180, 52,192, 24,174, 64,159,119, 10,192, 14, 84,
+ 34,222, 81, 73,136,197,226, 64,145, 72,132,187,119,239,102,135,132,132,232, 52, 26, 13,119,222,188,121,246, 98,177, 56,176,170,
+ 55,158,101, 89, 54, 59, 59, 27, 12,195,112, 0, 16, 69,175, 96, 42,191, 23,191,111,215,174, 93, 15,237,217,179,231,179, 78,157,
+ 58,193,203,203, 11, 6,131, 1, 62, 62, 62,208,233,116,240,246,246,134, 86,171,197,236,217,179,145,155,155, 59, 1,229,228, 60,
+ 35, 8, 2, 70,163,177,216,217,214,205,189,122, 97,156,158, 15, 8, 99, 33,166, 73,175,167,145, 27,145,158,153,193,236,185,151,
+150, 86,160, 55,181,127,241,166,224,209,187,239, 43, 48, 65, 21, 58,120, 92, 18, 0,104,153,242, 51,206,139,121,240,122,118,100,
+ 29,210,210, 51,176,251, 78, 74,142, 74,207,124,254,172, 20,206, 74,149,243, 95,194, 25, 60, 59, 26,189,198, 89,254,222, 15,129,
+165,130,170, 44,220, 77, 5,113, 91,180,145,197,154,141,165,198,200,250, 64,254, 67,207,159, 63, 63, 4, 0,143, 31, 63, 78,232,
+215,175,223,148,215,175, 95,207, 1,112, 52, 54, 54,118, 77,101,136, 54,110,220,248, 28,192,144,242,222,179,107,241,144,131, 0,
+ 14, 86,134, 55, 47, 47, 79, 19, 21, 21,165,153, 56,113, 34,145,144,144,112,204,197,197,229,179,227,199,143,139,122,246,236,169,
+125,248,240,225, 25, 87, 87,215, 86,237,218,181,147, 28,189,113, 35,169,224,229,203,200,200,196,133,151,166, 0, 0, 32, 0, 73,
+ 68, 65, 84,215,175,221, 13, 12, 19, 89, 94,251,252,200, 34,235, 45,177,117,112,238,235,159, 15,253,252,186, 29,163,197,126, 93,
+ 54,174, 1, 72,252, 0,206,139, 87,174, 92,241, 27, 48, 96,192,158,206,157, 59, 55,243,243,243, 67,181,106,213,240,236,217, 51,
+188,121,243, 6,247,239,223, 71, 68, 68, 68,132, 70,163,169, 48,161,118, 86, 86,214,251,233,137, 4,114,215,205,171,102, 69,220,
+186,220,216,167,101,167, 65,194, 0, 87, 6, 58, 61,139,132,184,151,152, 61, 99,125, 65, 74,220,243,199,122,163,190, 7, 44,220,
+168,163, 86,171,215, 46, 91,182,140,142,140,140,236,180,114,229, 74,105,245,234,213, 41, 46,151, 75, 2, 96,111,223,190,205,142,
+ 27, 55, 78,149,145,145,113, 68,169, 84,174,253,155,199,232,139,175, 94,189, 10,166, 40,234,163,134, 91,248,128,176, 16, 86,124,
+ 76,120,122,186,251,213,170,238, 58,202,171,154,251, 24,207,234, 30,225,165, 57,185,123,201,100, 82,207, 26,110, 35,188,170,185,
+143,169, 85,221,117,148,167,167,187,159, 5,166, 69, 47, 27, 27,155, 99, 10,133, 34, 8, 0,108,109,109,187,217,217,217, 61,178,
+181,181,237, 86, 52, 11,236, 38,145, 72,158,248,251,251, 15,255, 27,205,149,229,114,250,248,248,244,203,207,207,255,202,199,199,
+167,159,249,252,229,203,151,197,231, 85,225,244,240,240,104,123,251,246,237,190,139, 23, 47,254,162,118,237,218,221,230,207,159,
+255,197, 31,127,252,209,215,221,221,189, 97, 21, 56,249, 0,182,211, 52,157,198,227,241,210,105,154, 78, 51, 31, 28, 14, 39,141,
+162,168, 52, 0,107,202,176,150,181, 43, 49,203,185,236,236,236, 28,235,236,236, 28,235,226,226, 18,235,226,226, 18,171, 80, 40,
+222, 59, 28, 28, 28, 46, 91,122, 63,125, 93, 36, 45, 66,170, 73,175,212, 83, 72, 46,215,117, 22,251,126,140,223,200,215, 69,210,
+162,113, 53,219, 43,245, 20,210, 75,255,223, 56,131, 92,192,178,171,125, 89,118,181, 47, 27,228, 2,182,162,243,143,105,246, 87,
+ 40, 20,172, 66,161,152,245, 87, 45, 37,148,193,255,183,183,247,143,200,233, 37,149, 74,119, 85,171, 86,205,220,215,117,177,177,
+177, 57, 39,145, 72,186, 20,245,117, 93,196, 98,241, 5,127,127,255, 65, 21,113,202,229,242,219, 78, 78, 78,169, 69, 71,138,179,
+179,115,138,179,179,115,138,147,147, 83,178,147,147, 83,178,163,163, 99,146,249,176,179,179,187, 94,197,186, 59, 1,104, 2,160,
+ 33, 0,155,143,120, 63, 61, 1,140, 44,234,131, 22, 2, 24, 14,160,254, 71,248,141, 8, 90, 40, 31,205,183,243,184, 66, 75, 28,
+243,104,137, 99, 30,223,214,253, 74, 57, 41,120, 44,225,172, 35,151,203,231,217,216,216,252, 33,149, 74, 47, 73,165,210, 67, 14,
+ 14, 14,243, 1,212,249, 47, 61, 75, 18, 0, 27, 80, 24,159,233, 40, 10,151,194, 15,161,112, 83, 65,245,127,224, 51,255,255, 25,
+ 35,254, 91, 95,220,206,202,105,229,180,114, 90, 57,173,156, 86,206,127, 33, 39,105,189,159, 86,161, 85, 73,161,245,238, 1,160,
+156,200,240, 86, 88, 97,133, 21, 86, 88,241,255, 24,140,245, 22, 88, 81, 73,148,186,180, 76,148,163, 74, 43, 19,107,170, 42,202,
+246,180,149,211,202,105,229,180,114, 90, 57,173,156, 86,206,255,119,156, 86,124, 68, 88,205,170, 86, 78, 43,167,149,211,202,105,
+229,180,114, 90, 57,255,215, 97, 93, 58,180,194, 10, 43,172,176,194, 10, 43,172,248,139,176,182,132,224,122,107, 9,209, 42,180,
+ 42, 15, 18,192, 87, 0,122, 1,168,133,194,108,246,251, 0,252,134,170,173,233,219, 0,152, 2,160, 57, 10,119,231,196, 0,184,
+132,194,221, 57,249,214,219, 93, 58, 28, 28, 28,166,209, 52,109, 7, 20,166, 54, 49,191,150,252,191,201,100,202, 81, 42,149,243,
+255,162, 34, 80,176, 48,130,178,185,172, 37,203, 86,242,213, 96, 48,252,149,229,180,226,159, 9, 31,185, 92,190, 61, 43, 43,171,
+ 63, 74, 36, 89,182,194,138,255, 5, 56, 58, 58,142,210,235,245,211,185, 92,238,188, 55,111,222,252,254,255,168,234,239,137,172,
+183,132, 86,100,100,228, 5, 0,232,220,185,243, 39, 0, 96,103,103,119,149, 36, 73,207,202,124, 3,195, 48, 49, 57, 57, 57,101,
+ 6, 80,179,179,179,187, 74, 81,212,123,156, 6,131, 65,202,225,112,242, 74,251,140,209,104, 76, 84, 42,149, 13,255, 33, 55,145,
+ 0, 16, 41,147,201, 52,115,230,204,249,173,117,235,214, 30,201,201,201,198,201,147, 39,183,186,119,239, 94, 39, 0, 29, 42, 41,
+182,154, 18, 4,177, 57, 40, 40,232, 96,120,120,248,158,144,144, 16, 94,102,102,166,116,223,190,125,110, 91,182,108,137, 98, 24,
+166, 63,202, 73,180,250,255, 25, 52, 77,219, 37, 38, 38, 74,129,194,212, 36, 69,194, 10, 6,131, 1, 6,131, 1, 42,149, 10,129,
+129,129, 31,253,123, 93, 92, 92,130, 9,130, 88, 41,145, 72, 26,230,231,231,223, 2, 48, 38, 37, 37,229, 94,101,202,106, 52, 26,
+193,178,108,113, 57,253,252,252,172, 63,104,229, 48,140,199,227,125,238,237,237,221, 88,171,213,102,199,196,196,220, 52,153, 76,
+ 51,241,241,114,180,217, 2,152,201,231,243, 67,106,213,170,229,241,252,249,243, 4,189, 94,127, 3,133,201,144,115, 63,134,200,
+250,228,147, 79, 46,175, 90,181,202,126,244,232,209,151, 47, 93,186,212,194, 42,182,172,248,111,193,195,195,195, 78,165, 82,173,
+ 7, 16, 76,211,180,139, 64, 32,128, 80, 40, 76,229,243,249,119,133, 66,225,208, 43, 87,174,228, 84,150,211,100, 50,205,140,141,
+141,117,105,210,164,201, 34, 39, 39,167,217, 25, 25, 25, 26,189, 94,127, 38, 59, 59,123, 2, 0,101,121,159,125, 87,139,252,203,
+ 68, 86,201, 87,152, 69, 23,167,168, 98, 44,128,214,111, 41, 48, 14,199, 61, 46, 46,206, 73, 32, 16,128, 97,152,226,193,236,221,
+195,124, 93,167,211, 33, 32, 32, 64, 95,193,128,227,145,144,144,224,196,227,241,138,175,233,116, 58,184,185,185, 49,137,137,137,
+ 78, 69,105, 15,138,161,213,106,225,238,238,254, 79,202,121,244,149, 92, 46,207,141,143, 79, 8,212,104,245, 63, 13, 31, 59,117,
+ 90,255, 94,159,202,174, 94,189,202,116,232,208, 65,123,225,194,133,175, 80,152, 56,213,162,206,156, 32,136, 45,147, 39, 79,158,
+ 45, 16,217,216,159,189,250, 88,187,101,223,145,164, 32,159,154,196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76,
+ 3, 84,194,178, 37,147,201,142,243,249,252, 26, 69,247, 47, 62, 59, 59,251,179,127,224, 3,201,193,251,193, 99, 75,187, 86, 33,
+ 50, 51, 51,161, 86,171,223, 59,252,252,252, 44,205,149, 89,169,114,211, 52,125,104,193,130, 5,110,169, 41, 41,248,117,201,146,
+ 38, 40,180,100, 54,177,228,195,233,233,233,239,149,211,215,215, 23, 86, 84, 10, 83,102,207,158,189,224,203, 47,191,132,201,100,
+130, 90,173,118,125,241,226,133,255,244,233,211,123,188,124,249,178, 49,128, 87, 31, 58, 25,247,246,246,142,254,230,155,111,228,
+141, 27, 55, 70, 81,150, 10,215, 75,151, 46, 53,217,176, 97,195,192,248,248,120, 95, 0,111, 62,228, 11,228,114,249,246,117,235,
+214,217,139, 68, 34, 28, 62,124,216,190,109,219,182,151,238,220,185,211,242, 3,196, 22,105,111,111, 63, 14, 64, 27,134, 97,120,
+ 0,110,100,103,103,207, 69,229,163,186, 43, 36, 18,201,126,146, 36,107, 2,127, 70,163, 39, 73,210,129, 32,136, 12,243, 53,130,
+ 32,156, 24,134,185,150,149,149,213,204,250, 56,254,187, 97,111,111, 63, 44, 45, 45,109, 21,159,207,231,202,100, 50,136, 68, 34,
+112, 56, 28,112, 56,156,106,124, 62,191, 26,159,207,239, 24, 26, 26, 58,230,220,185,115,229, 70,216,111, 26,228, 60, 24, 36,241,
+ 19, 69,144, 20, 0,144,180,216,198,214,214, 22, 63,253,244,147,184, 91,183,110, 98, 0,184,124,249,114,248,160, 65,131,218, 38,
+ 38, 38, 6,148, 37,182, 74,211, 34,255, 34,172, 45,111,192, 67,145,122,188,240, 86,203, 37, 73,240,120, 60, 92,191,126, 29,150,
+ 4, 43, 55,167, 72, 40,183, 55, 40,138, 48,126,239,222,159, 6, 0,243, 64,195,227,241,112,229,202,219, 65,229,155, 54,109, 90,
+220,216,255, 46,244,242, 43, 12,242,184,247,235,194,114,133,173, 44,140,174,189,247,107, 95,180,250, 37, 14,189,198,205,234, 83,
+160,209, 55, 2,160,202,201,206,206,190,117,224, 64,114,144,143, 15,119,251,246,237,141,221,220,220,122, 85, 66,104, 77,105,208,
+160,193,126, 74,104,235, 16, 62,104,112,248, 80, 14,169, 31, 56,114,226,188,132,148, 12,213,136, 17, 35, 14, 28, 62,124, 56,252,
+231,159,127,126, 50,105,210,164, 41, 0,126,176,180,252, 2,129,160,198,211,167, 79,189, 77, 38, 19,252,252,252,254,137,105, 12,
+130, 80, 24,124,239, 75, 0, 59,139,174,245, 67, 97,228,254, 96, 0,119, 43, 67,102,182, 96,149,118,124,108,184,185,185,249, 14,
+ 24, 48,192, 33, 43, 35, 3,191, 46, 89, 98,190,220, 16, 21, 44, 35,154,219,143, 78,167,195, 23, 95,124, 49,192,100, 50,113,204,
+ 34, 80,171,213,234,114,115,115, 53,248,211,177,244, 13,128, 79, 45, 40,142,167, 88, 44,254, 15,128, 96,181, 90,237, 6, 0, 98,
+177, 56,137, 97,152,131, 42,149,234, 7,252,153,192,183,210, 19, 92, 0,254, 40, 59, 21, 20,187, 96,193,130,231, 83,167, 78,125,
+245, 95,224,172,225,236,236, 60, 63, 44, 44, 12, 71,142, 28,193,209,163, 71, 13, 66,161,144, 51,104,208, 32, 98,204,152, 49,178,
+111,190,249,166, 35,128,101, 31,248, 51,119,156, 61,123,182,188,110,221,186,216,183,111, 31,238,223,191,175,246,246,246, 22,182,
+110,221, 26, 28, 14, 71, 62,109,218,180, 14, 0, 54,127,200, 23,100,101,101,205,157, 56,113,226,150,157, 59,119, 74, 99, 98, 98,
+176,114,229, 74,135, 62,125,250, 92,136,143,143,255,164, 18, 98,139, 15, 96, 28,128, 80,138,162, 90, 14, 26, 52,200, 56,118,236,
+ 88,154, 36, 73,195,146, 37, 75, 28, 55,108,216,208,135,166,233,224,204,204, 76, 75, 38,105, 36,128,159,134, 14, 29, 58,228,220,
+185,115,178,155, 55,111,242,236,237,237, 97, 50,153,138, 45,197, 12,195, 56,153,159, 89,163,209, 8, 95, 95, 95,247, 18,159, 23,
+254, 91,133, 6, 73,146,122,134, 97,104, 0, 2, 0,218,138,206,255,151, 68,150, 92, 46, 31,157,149,149,245,155,139,139, 11,156,
+157,157,223, 27,107,181, 90, 45, 4, 2, 1,215,197,197,101, 93,183,110,221,232, 67,135, 14,149,185, 4, 72, 80,196,204,195,187,
+230,184,201,101, 82, 0,192,210,213, 39, 10, 0,224,143, 63,254, 64,114,114, 50,100, 50, 25, 2, 2, 2,168, 57,115,230, 40, 38,
+ 76,152,240,107,118,118,246,208,178,184,222,213, 34,255, 50,139,214,218,210,206,203,245,209, 98, 89,182, 56, 79,158,133, 15,237,
+187,151, 78,191,195, 71,232,116, 58,188,107,209, 50, 55, 94,154,166,223, 53, 63,130, 32, 8,182, 60,206, 82, 48, 72, 44, 22, 7,
+170, 84,170, 21,149,152,221, 22,115,238,253,218, 23, 91,248,147,251,153, 51,145,118,156, 88,248,186, 5,192,213,215, 67, 87,174,
+250,228, 19,183,113, 51,150,207, 82,103, 38,103, 76, 27,208,165,134,183,139,189, 80,156,147,158, 43,175, 83,167,253, 59, 22,153,
+138,202,217, 42, 60, 60,124,235,201,235,177,132, 64,192,229,114, 40,138,110, 81,207,199,222,195,150,178,149, 2,182, 9,175,158,
+ 95, 29, 60,120,112,189, 73,147, 38,181,172, 4, 39,138, 6, 92,108,219,182, 13, 4, 65,144,149,169,251, 71,196,233,242, 68, 22,
+203,178, 32, 8, 98, 71,137, 65,101, 71,209,181, 59, 37,196, 22,167,188,251,105,182,166,154, 69,213,160, 65,131, 6, 24,141, 70,
+ 78,137, 78,226, 93, 1, 83,154,136,177,168,238, 10,133,226, 36,128, 79, 9,130,128, 78,163,209,253,231,151, 95, 74,254,249,246,
+ 59, 34,235,116, 89,109,201, 96, 48,192,100, 50,113,238,220,185, 67,151,120,214,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 22,
+220, 79, 95,145, 72,116, 53, 34, 34,194,166, 97,195,134, 4,143,199,131,209,104,196,195,135, 15, 61,126,254,249,231,145,167, 79,
+159,238,160, 82,169,252,240,126,242,116, 75,126, 35,255, 75,151, 46,169,188,188,188, 74, 21,142, 74,165,146,227,227,227,243, 73,
+ 25,162,232,175,230, 76, 76, 75, 75,235,254,233,167,159,142, 74, 77, 77,141, 54, 26,141,223, 3, 8,112,112,112,184,211,179,103,
+ 79, 8,133,194, 80,181, 90,189,236, 67,158,121, 39, 39,167,110,205,154, 53,195,202,149, 43,241,243,207, 63,183, 3,112, 6, 64,
+ 91,165, 82,121,186,107,215,174,176,179,179,235,158,147,147,179,249, 3,218,145, 79,171, 86,173,214,253,244,211, 79,210, 35, 71,
+142,192,219,219, 27,121,121,121,248,238,187,239,156,126,252,241,199,243, 57, 57, 57,173, 75,180,139,178, 56,253,248,124,254,230,
+157, 59,119, 74,188,188,188,188,184, 92, 46,233,229,229,133,172,172, 44,104, 52, 26,254,188,121,243,234, 9,133,194,123,203,150,
+ 45,219, 12,160,103, 5,229, 36, 1,204, 93,179,102,205,168, 17, 35, 70,216, 13, 24, 48,192,164,211,233,176,103,207, 30, 80, 20,
+ 5,154,166, 33, 18,137,138,147, 87,115,185, 92,212,169,243, 94,144,244,195,229,212, 55, 23,133,126,168,118,168,220,178,235,233,
+114,248,138,151, 62,104,154,134, 64, 32,128, 64, 32, 0,159,207,199,211,167, 79,103, 8, 4,130, 37, 4, 65, 24, 45,225, 36,254,
+ 84, 23,129, 0,110, 86,116,142,247, 93, 67,254,206,254,211, 12,119,130, 32,150, 2, 8, 45, 28,118,201, 11, 14, 14, 14,227,211,
+210,210,226, 44,229, 84, 40, 20,246,153,153,153,203, 20, 10, 5,156,157,157,139,199,111, 55, 55, 55, 24, 12, 6,164,165,165,129,
+101, 89,228,228,228, 64, 36, 18,193,213,213,117,217,136, 17, 35,246,173, 93,187, 54,179, 84, 78, 6, 63,119,237, 51,125, 38, 69,
+ 81, 36, 0, 80, 28,137,228,155,169, 64,141, 26, 53,208,162, 69, 11,104, 52, 26,228,230,230,194,223,223,159, 67, 16, 68, 56, 65,
+ 16, 54, 44,203,254, 14,224,236,255,160,161,176, 76,103,248,217,239,174,139,154,179,197,115,185, 92,139,132, 86,209,251, 43,178,
+160,144, 6,131, 1, 92, 46,247, 45,139, 4, 65, 16, 48,153, 76,111, 93, 55, 11,173,170, 8,245, 49, 99,198, 48,235,214,173, 27,
+149,157,157,189, 26, 85, 92, 74, 8, 15, 15,127,207,223, 99,194,132, 9,137,233,233,233,236, 23,237, 3,197,209,199,146, 83,106,
+201, 36, 66, 71,169,180,166, 64, 38,183,203,204,204,188, 86,212,153, 88,138,218, 13, 26, 52, 16,110, 57,112, 41,113,248,183, 11,
+230, 52,244,178,183,169,239,238, 32,115,177, 21,242, 36, 36,161, 18, 24, 13,137,114,185,220,187,178,229, 54,247, 11, 34,145, 8,
+ 36, 73,254,147, 44, 90, 28,179,200,202,202,202,194,145, 35, 71,208,169, 83,167, 59,102, 17,162, 84, 42,145,146,146, 2,133, 66,
+113,167,200,242, 81,225, 50, 34,195, 48,208,235,245,208,235,245,197, 2,166,196, 51, 84, 44, 96,204,239,165, 40,234, 65, 21,203,
+ 62, 71, 38,147,181, 10, 13, 13,229,237,218,179,135,199,178,172, 10,133, 57,212,242, 89,182,140, 4,217,239,192,104, 52, 22, 91,
+217,104,154, 70,124,124,124,241,192,101,206, 45, 41, 16, 8, 44, 51,101,240,249, 19,119,239,222,109,211,184,113, 99, 34, 51, 51,
+ 19, 12,195, 20,119,146,191,253,246,155,160, 87,175, 94,110, 81, 81, 81,211,180, 90,237,236, 42,212,149, 40, 75, 16, 1,128,141,
+141,141, 17,150, 69,204,174,144,211,104, 52, 18,205,155, 55,159,148,145,145, 81, 79,173, 86,207,179,228, 54, 2, 56,156,152,152,
+ 88,114, 96,191, 23, 29, 29,173,238,221,187,183,176,102,205,154, 33,143, 31, 63,254,160,135,212,199,199,167, 41, 77,211,184,113,
+227,134, 22,128,121,102,125,225,254,253,251,218,158, 61,123,242, 61, 60, 60,154,230,228, 88,236,178,226,227,235,235,123,202,201,
+201, 73,104,238, 67, 29, 29, 29,233,181,107,215, 74,147,146,146,160,215,235, 49,101,202, 20,116,238,220, 25, 14, 14, 14,152, 48,
+ 97,130,243,162, 69,139,182,231,231,231, 55, 40,207,104,205,227,241,182,190,120,241,194, 91,161, 80, 8,175, 95,191,142,250,245,
+235, 35, 35, 35, 3,169,169,169,200,207,207, 71,106,106, 42,134, 14, 29,234,244,235,175,191,186, 90, 96,201, 42, 22, 89,107,215,
+174,205,217,191,127, 63,181,126,253,122, 41, 77,211,197, 66,139,195,225, 20, 11, 45,115,110,197, 42,172, 52,228, 20,137, 54,187,
+220,220,220, 15,241,115,227, 3,224,149, 20, 89,124, 62, 31,124, 62, 31, 2,129,224,131,242,178,254, 75,224, 70, 16,196, 99, 46,
+151,203, 23,137, 68, 92,146, 36,193,231,243,219,203,229,242, 71, 1, 1, 1, 1,167, 78,157,138,181,132, 68,163,209,108,229,243,
+249,180,147,147, 19, 0,192,219,219, 27,245,235,215,135, 74,165, 98,114,115,115, 97,103,103, 71,198,197,197, 65,173, 86, 35, 37,
+ 37, 5,213,171, 87,167, 73,146,220,138, 66, 63,228,247,112,245, 78,234,106, 0,171,205,231, 14, 14, 14,105, 37, 45,157, 2,129,
+ 0,110,110,110, 72, 74, 74,130, 84, 42,165,126,252,241,199,158,123,246,236,233,113,245,234,213,112, 0,219, 74, 80,205,254, 23,
+251,104,153, 69, 86,201,215, 63,133, 86,231,206,157,103, 69, 70, 70,126, 82,218, 44,156,166,233,143,230,235, 98, 22, 84, 54, 54,
+ 54,239, 90,173,192, 48, 76, 89, 22,173, 74,127,143, 64, 32, 16,142, 30, 61, 58,239,247,223,127,175,180,216, 10, 91, 25, 93,108,
+197,122,111, 26,233,231,119,117,218,180,105,221,206,157, 59,151,212,208,171, 38, 71,156, 28,151, 47,176,177,179,131,123,181, 78,
+131,186,247,188,143,194,221,135,150,226, 69, 94, 94,158,176,150,187, 72, 71,146, 26,162, 26,159, 35, 85,136,185,124, 23,153,204,
+141,171,211,166,219,200,100, 60,173, 86,155,131,114,146, 64, 3,128,179,179,243, 9,161, 80, 88,221,124, 46,147,201,108, 89,150,
+133, 72, 36,130, 66,161,144, 80, 20,245,172, 68,227,138, 75, 75, 75,107, 95, 81,193,236,236,236, 78,240,249,252,234, 36, 73,130,
+ 32, 8, 80, 20, 5,146, 36, 65,146,100,241,255, 41,138, 2, 65, 16, 40, 40, 40,136,139,141,141,109,111, 65,125,141, 0,130, 9,
+130,184,115,228,200, 17,132,132,132,224,216,177, 99,248,252,243,207,145,155,155,139,135, 15, 31,162, 85,171, 86, 64,225,146,162,
+ 69, 40,233,252,110,158, 20, 60,125,250,180, 88,184,148, 60,164, 82,233,135,152,216, 47,135,133,133, 97,221,186,117,108,209,100,
+ 66, 76, 16, 68,125, 91, 91,219,167, 79,158, 60,177,200, 15,134,101, 89,232,245,127,190,213, 60,120, 21,249, 67, 84, 42, 57, 48,
+ 69, 81,237, 27, 52,104, 64,228,230,230,154, 5, 36, 56, 28, 14, 40,138, 2, 69, 81, 88,181,106,149,176,113,227,198,211,249,124,
+254, 36, 46,151,171, 52, 24, 12,187, 52, 26,205, 60, 0, 57,255,164, 30,169,101,203,150,223, 38, 36, 36,116,174, 94,189,122,196,
+ 7,208,176, 6,131, 65, 7, 64, 72, 81, 20,253, 17,250, 40,170,232,217,210,148, 16,251,198,162,115, 62, 10,151,137, 45,130,131,
+131,195,246,163, 71,143,186, 87,175, 94, 29, 6,131, 1, 70,163, 17,249,249,249,184,112,225, 2,180, 90, 45,140, 70, 35,188,189,
+189, 49,115,230, 76,205,248,241,227, 5,107,214,172, 73,207,207,207,239, 95, 1,237,248,125,251,246,137, 21, 10,133, 80,173, 86,
+227,213,171, 87,104,208,160, 1,242,242,242,160, 82,169, 80, 80, 80, 0,189, 94, 15,165, 82,105,103, 50,153,116, 21,112,205, 40,
+ 41,178, 70,142, 28,249,128,199,227, 53, 24, 59,118, 44, 18, 19, 19,139,219,252,240,225,195,225,236,236, 92,220,150,138,250,228,
+ 74,117,204, 28, 14, 7,124, 62, 31, 92, 46, 55,167, 90,181,106, 32, 8, 66, 16, 23, 23, 87,149,165, 56, 27, 0, 74,154,166,121,
+ 37, 5, 22,159,207,199,141, 27, 55,166,241,120,188,178,172, 89,101,181, 75,182, 50,231,255,109, 16, 4,177,148,203,229,242,229,
+114, 57,183,196,132,147, 43,145, 72,224,228,228,180, 18, 64, 71, 11,235, 29, 36,151,203,139,251,247,192,192, 64, 36, 36, 36, 28,
+204,205,205, 29,152,158,158, 14,146, 36,183,146, 36,217,195, 60, 73,205,206,206,134,135,135, 71, 80, 89,124,205,130, 93, 70,129,
+ 96,223,178,104,189, 51, 65,131,141,141, 13, 94,191,126, 13,149, 74,197, 62,127,254,156, 24, 61,122, 52,161,211,233, 54, 69, 69,
+ 69, 93, 67,225,110,251, 50,181,200,191, 4,149,247,209, 50, 91,180, 44, 29, 0, 8,130,168,112, 54, 97, 48, 24, 36,254,254,254,
+165, 57,124, 17,165, 9,173,162,229,164, 42, 61,232, 52, 77, 75,171, 42,182,222, 69,196,254,157,206, 63,207,156, 50, 83,238, 90,
+179,214,164, 73, 51, 56, 93,186,116,185,190,101,203, 22,147,188,110,199,182,103, 79,108,115, 94,246,221,228, 99, 71,143, 30, 5,
+ 10, 29,163, 45,197,229,200,200, 72,151, 9,227,198, 96,230,196,241,199,109,188, 29,120, 18, 66, 46, 22,104, 85,111, 36, 96,213,
+252,218,190,157, 15, 68, 68,164, 0,136, 42,143, 68, 36, 18, 85,127,252,248,177,119,201,141, 4,186,255,107,239,187,227,163,168,
+214,247,159,153,217, 94,178,233,149, 64, 2, 72,147,208, 66,239, 85, 64, 64,177, 80,174, 82, 47, 24, 68,188, 94,208, 43,232, 15,
+189, 98,164, 8,194, 23, 20,164,228,130, 82, 68,175, 52,105, 2, 82, 76, 72,164, 39, 32, 33, 9,161,167,183,205,102, 55,187,155,
+205,150,153,157,223, 31,217, 89, 55, 33,101, 55,108, 4,188,251,124, 62,243,201,206,206,228,217, 51, 51,103,206,121,206,123,222,
+243,190, 38, 19,164, 82, 41,206,156, 57, 19, 40,145, 72, 2, 1,192, 96, 48,160, 83,167, 78,206, 90, 76, 34, 50, 51, 51,219,122,
+121,121,161,162,162, 2, 70,163, 17, 22,139, 5, 86,171, 21, 4, 65,128,207,231, 67, 40, 20, 66, 38,147,185,186,178,239, 42,128,
+215,199,142, 29,187,251,216,177, 99,136,138,138, 66, 89, 89, 25, 50, 50, 50, 56,145,229,146,143, 22,103, 37,114,244,199,226,241,
+120,248,174,117,107,188,145,159,111, 23, 48,235,188,189,241,111,107,227,178,105,116,234,212,137, 77, 74, 74,194,241,227,199,241,
+226,139, 47, 18, 7, 15, 30, 52, 51, 12, 35,200,207,207,191,158,159,159,239, 20,135,213,106,181,151,149,107,183, 29, 5,150,171,
+ 66,139,166,105, 47,161, 80,136,202,202, 74,112,150, 7,199,173, 85,171, 86, 80,169, 84,188,242,242,114, 94,126,126,190,116,233,
+210,165,255,136,143,143, 15,213,106,181,175, 61,206, 86,104,211,166, 77, 17,111,188,241, 70, 54,143,199, 99, 71,143, 30, 61, 53,
+ 43, 43,235,165,208,208,208,211,191,254,250,235, 26, 0,237, 92,229, 11, 8, 8,184,194,227,241,194,203,203,203, 5,123,246,236,
+177,104,181, 90, 65, 96, 96, 96, 17,215,118,112,247,218, 98,177, 56,181,114, 57, 32, 32,224,138, 82,169, 20,172, 95,191,222, 82,
+ 90, 90, 42, 8, 14, 14, 46,226,120,212,106,181, 96,207,158, 61,150,242,242,114,129,183,183,247, 21,141, 70,211, 32,159, 82,169,
+156, 50,125,250,244,196,211,167, 79, 7, 80, 20,133,172,172, 44,148,150,150,194,199,199, 7, 59,119,238, 68, 68, 68, 4,246,238,
+221,171, 82,169, 84,179,191,248,226,139,143,108, 34,171, 33, 31,173, 65,189,123,247,142, 80,171,213,240,241,241,129, 94,175,199,
+149, 43, 87,208,177, 99, 71,228,231,231,131, 36, 73,248,248,248, 96,227,198,141, 21, 4, 65,168,234, 35,146, 72, 36, 47,197,196,
+196,248, 0, 64, 76, 76,140, 79, 76, 76, 76,173, 29, 92,223,190,125,177, 97,195,134,154, 66,203,149,129,129,221,234,228, 32,142,
+ 42,251,244,233,131,248,248,248,133, 46,138, 35, 19, 39,218,106, 90,179, 68, 34,145,203,139,105,172, 86,171, 0, 85, 46, 13,132,
+ 51,251, 79, 0, 6, 75, 36, 18, 65,205, 47, 43, 42, 42, 4,161,161,161, 3, 93, 16,190,254, 18, 73,149,193, 41, 34, 34, 2, 26,
+141,134, 49,153, 76,147,119,237,218,101, 1,128,232,232,232,201, 12,195, 84,210, 52, 77, 9,133, 66,232,245,122, 4, 5, 5,249,
+215, 99, 27, 93,116,232,135,165, 33, 53,125,180, 66, 67, 67, 17, 29, 29, 13,163,209,136,130,130, 2, 36, 36, 36, 88, 24,134,217,
+189,105,211, 38,107, 96, 96,224,223, 95,125,245, 85, 42, 57, 57,249,109, 0, 11,234,210, 34, 79,153, 53, 43,174, 78,161,101, 83,
+144,241, 0,134,212,188,200,154,226,167, 62,161,213,208,212,161, 80, 40, 84,103,103,103,203, 28, 59, 21,154,166, 17, 22, 22,102,
+101, 89,150,168, 77,104, 61,138, 41,152,207,231,123,125,248,225,135,234, 77,155, 54, 77,185,127,255,254, 18,103,254,103,207,219,
+ 29,176,163,134,200,218,188, 50,118,195,250,149, 75,253,238, 28,255, 22, 91,191, 90,205, 48, 12,146, 59,119,238, 60, 80,167,211,
+241,188,101, 22, 40,213, 56,102, 19, 89,206,138, 66, 18,192, 55,151, 46, 93, 74, 30, 51,102,204,111,223,252,119,191, 95,254,221,
+187,231, 69,229,202, 2, 69,155,182, 60, 65,179,136,151,181,149,149,130,201,147, 39, 7, 2,120,181,161, 70, 76,173, 86,163,176,
+176,176,166, 0,195,205,155, 55, 31, 58,215,169,194,145, 36, 24,134,193,190,125,251, 32,149, 74, 33,147,201,170,109,156,200,106,
+228, 66,133, 76, 0, 24, 61,122, 52, 84, 42, 21,228,114,185,211,229,170, 41, 94, 88,150,133,201,100,130,201,100,130,217,108,102,
+ 0,240,121, 60, 30,102,229,230,218,173, 60,174, 8,152,154,232,220,185, 51,123,238,220, 57,252,246,219,111,208,235,245, 88,191,
+126, 61, 66, 67, 67,135, 1,248,216, 85, 46, 7, 39,125,166,188,188,156, 95, 94, 94,110,183, 14,242,249,124,187,245,192, 73, 75,
+158,128,199,227,217, 71,163,220,230,104,213,162, 40, 10,193,193,193, 8, 9, 9,193,230,205,155, 5, 45, 91,182, 28,247, 56, 91,
+160, 85,171, 86,181, 89,183,110,221,182, 29, 59,118, 28,155, 50,101,202,143,169,169,169, 51,189,189,189,175,159, 57,115,102,169,
+ 72, 36,178, 54,242,253, 14,207,207,207, 15,114,252,202,106,181, 74,105,154,182, 11,219,138,138, 10,167, 7, 24,124, 62, 63, 60,
+ 45, 45, 77, 10, 0, 75,151, 46,229, 3,144,114,206,224, 28,103, 69, 69, 5,191, 99,199,142,225,206,214,245,196,196,196,129, 35,
+ 70,140, 56,119,242,228, 73,223,136,136, 8,228,229,229, 33, 47, 47, 15,109,218,180,193,242,229,203,245,229,229,229,253, 1,100,
+234,116,186,131, 78,114,134,249,250,250,242,179,179,179, 65,211, 52,186,117,235,134,141, 27, 55, 98,242,228,201,232,212,169, 19,
+202,203,203,145,150,150,134,237,219,183,251, 10, 4,130,122,219, 14,131,193,112, 48, 46, 46,174,121, 77,139,214,212,169, 83,101,
+ 69, 69, 69,246, 58, 25, 27, 27, 91,109, 10,209,149, 54,217, 54,181, 85,231,214, 24,208, 52,173, 16,139,197,229, 34,145, 72,200,
+249,103, 37, 36, 36,184,108,205,170, 49, 0,116,101,255,177,129, 19,173,181,244,173, 8, 9, 9,113,154, 71, 36, 18, 17, 92,219,
+ 72,211, 52, 52, 26, 13, 19, 26, 26,106,159,222, 79, 73, 73, 97, 34, 35, 35, 25,138,162, 40,161, 80, 8,130, 32, 32,149, 74,235,
+108,240, 89,134,141,125, 97,242,199,213, 86, 29,206,255, 16, 48,155,205, 72, 73, 73,129,217,108, 70, 66, 66,130,229,139, 47,190,
+200, 87,171,213,243, 1,240, 78,156, 56, 49,125,225,194,133, 84, 80, 80,208,136,226,226, 98, 52,164, 69,158, 34,177,245,144,149,
+139,235,133,226,199,141, 27, 71,216,150, 86, 18,156,112,114, 69,104,217, 94,190, 6,123, 94,130, 32, 80, 80, 80, 96,223, 15, 10,
+ 10,114,249,183,156,133,191,191,191,190,111,223,190, 94, 74,165,242,224,170, 85,171, 26,101,201,218,188, 50,118,195,138,207, 62,
+241, 83,165, 95, 64,110,126, 1, 84,197,150,228,164,235,247, 15, 0, 56, 0, 0,216,242,108, 60,241,102,198,215,206,114,118, 8,
+144,116,229, 11,120, 7,158, 27, 51,174,249,164,152, 5,228, 91,111,189, 53, 96,250,244,233,154, 41, 83,166,188, 35,151,203,219,
+153,205,230,178,253, 71,143, 62,152, 52,105, 82, 75,134, 97,166,163,129,152, 35, 6,131, 33,107,200,144, 33,142,247, 83,113,234,
+212,169,224, 7, 15, 30, 96,222,188,121, 37,121,121,121,106,199,115,157, 41,163,217,108,206,234,218,181,107,157,211,133,220,148,
+ 34, 0,104,181,218, 44, 23,110,233,107,176, 57,190,151,150,150,226,230,205,155,224,241,120,232,211,167, 15,146,146,146, 48, 96,
+192,128, 20, 87,172, 90,149,149,149,136,136,136, 64,101,101, 37,244,122,125, 5, 0,209,206,150, 45, 1, 0,111,151,150,226,202,
+ 23, 95,224,194,138, 21,112,172,207,206,162, 75,151, 46,236,133, 11, 23,112,253,250,117, 24,141, 70,204,158, 61, 27, 0, 8, 91,
+221,117, 37,100, 70,107,138,162, 70,143, 25, 51, 38, 12, 0,244,122, 61,113,233,210, 37,136,197, 98,251,187,112,248,240, 97,228,
+229,229,129, 32, 8,248,250,250,134,151,149,149,181, 4,112,191, 30,179, 63,113,255,254,125,124,254,249,231,176, 90,173, 88,184,
+112, 33,218,182,109,107, 23, 88, 89, 89, 89, 88,186,116, 41, 24,134,193, 39,159,124,130, 54,109,218,192, 98,177,136,209,200, 16,
+ 26,238,192,187,239,190,123,231,192,129, 3,199,114,114,114,158, 95,185,114,229, 96,130, 32,172,239,191,255,254,231, 10,133,130,
+121, 20,222, 50,141, 22, 55,111,103,217,133, 80,205, 45, 48,192,207,101,190, 91,119,115,236,255,207, 48,142,124, 12,252,253,124,
+ 93, 45, 98,133,197, 98,209,191,252,242,203, 62,251,246,237, 35,218,180,105,131,123,247,238,113,150,161, 10,184, 30,210, 33, 79,
+165, 82,181,165, 40, 74,112,251,246,109, 68, 70, 70,162,119,239,222, 88,182,108, 25,148, 74, 37,104,154, 70, 80, 80,144,213, 98,
+177,164,152,205,230,179, 13,112,197,206,153, 51, 71, 0,224, 77,155,101,171,243,252,249,243,173,171, 87,175, 70, 74, 74,138,221,
+130,229,232, 12,239,234,212,161,163,213,201,113, 75, 72, 72, 88, 40, 20, 10, 89, 0, 23,225,122,160,103, 83, 77,139, 86, 99,172,
+ 89, 77,133,166, 92,201, 24, 26, 26,154,224,229,229, 53,174,172,172,172,154, 85,171,127,255,254,230,224,224,224, 68,103,121,228,
+114,121, 25, 69, 81,254, 0,144,151,151, 7,153, 76, 38,184,123,247,238, 10, 84, 5,207, 70,203,150, 45, 87,168, 84, 42, 65, 75,
+ 91,123, 26, 18, 18, 2,147,201, 84,167, 27,203,249,171, 69,223, 2,248,150,219,247,243,243, 43,208,104, 52,146,213,171, 87,235,
+ 86,172, 88, 97, 96, 24,198, 8,224,140, 90,173,182,199,209, 42, 44, 44,212,240,249,124, 63, 31, 31,159,102,156,208,170, 77,139,
+ 60,101,168,219,162,101, 83,146,108, 77, 65, 68, 16,196, 67, 14,234, 13, 8,173, 6, 69, 22,195, 48,213,172, 12,156,195,123,109,
+191,101,235,212, 27, 53,117,104, 19, 89,226,253,251,247,239, 92,181,106,213, 69,103,255,207,209, 71,107,203,154,207, 86,114, 34,
+235,247,223, 78,226, 96,134, 70,185,112,197,218,117,141,125, 2,207, 6, 72,187, 4, 7,251,199,127,177, 60, 86,113,231,248,118,
+252,184,229,255,216,223, 47, 95,238,117,249,242,229,105,243,230,205,107, 97,171, 88, 42, 0,215, 0, 76,130, 19,171,116,242,242,
+242, 70,213,232,132, 51, 5, 2, 65,176, 84, 42, 69, 94, 94,158,238,214,173, 91, 46, 79,201, 40,149,202, 81, 77, 80, 1,121,156,
+200, 82, 42,149, 72, 75, 75,195,208,161, 67, 1, 0, 73, 73, 73,232,223,191, 63,146,147,147,209,189,123,247, 20, 0, 61,209, 64,
+160, 86,139,197,162,126,246,217,103,237,214, 45,141, 70, 99, 5,128,152,130, 2,196,133,134,130,199,227,225,194,138, 21, 88,108,
+177, 96,153,139, 2,190,107,215,174,236,165, 75,151,240,224,193, 3,208, 52,141,241,227,199,163,145, 47,125,167, 14, 29, 58,156,
+ 58,115,230, 76,160, 92, 46,135, 94,175,135, 78,167,195,140, 25, 51, 48,121,242,100, 24,141, 70,236,217,179, 7,135, 14, 29,130,
+151,151, 23,244,122, 61,244,122,189,239,216,177, 99,207,101,102,102, 14, 2,112,187, 14,161,197,142, 26, 53, 10,137,137,137,160,
+ 40, 10,189,122,245, 66,105,233, 31,139,129,130,131,131,107, 59, 70, 61, 78,161,197,227,241,216,132,132,132,149,131, 7, 15, 70,
+ 78, 78,206,243,221,187,119, 95, 63,115,230,204,188, 71,229,245,245,246, 66,215,142,173, 97, 52, 26, 97, 52, 26, 17, 22, 22, 6,
+173, 86,139, 59,119,238,192,104, 52, 34, 56,200,199,101,190,232, 78,109,236,124, 65, 65, 65,208,235,245,184,127,255, 62, 76, 38,
+ 19, 2, 2, 92, 18, 90,205, 71,141, 26,245,235,238,221,187,253,183,111,223,110, 26, 50,100,136,112,253,250,245,132, 66,161,128,
+ 67,199,226, 42, 18,146,146,146, 34, 70,140, 24,209, 62, 61, 61, 29, 9, 9, 9, 48,153, 76,136,142,142,198,173, 91,183,208,183,
+111, 95,232,116,186,139,151, 47, 95, 62,228,140, 97, 24,192, 71,115,230,204, 1, 39,182, 18, 19, 19, 81, 80, 80, 0, 47, 47,175,
+135,132, 22,231,251,104, 91, 53, 30,230, 76, 97, 57, 65,228, 96,121, 90,236,227,227, 99, 6,176,174,145,214, 39, 0, 64, 78, 78,
+142,168,115,231,206, 70,177, 88, 44,180,137,182,181,143,194,231, 78,184, 97, 37, 99,157, 8, 9, 9,153, 31, 16, 16, 48,162, 85,
+171, 86, 40, 42, 42, 18, 8,133, 66,244,239,223,223,220,179,103, 79,115, 72, 72,200,219,206,242,136, 68,162,116,129, 64, 48,168,
+106, 48,193, 32, 59, 59, 27, 44,203, 46,236,212,169,211, 63,181, 90, 45, 74, 75, 75,133, 10,133,194, 62,168,110,223,190, 61,140,
+ 70, 99,186, 11,150,183,216,200,200,200,143, 4, 2,193, 50,165, 82, 89, 91, 88, 8,161,143,143,143, 66, 32, 16,192,108, 54, 87,
+ 19,155, 53,181,200,211, 46,178,170, 9, 45, 7, 21, 89, 77,232,184, 98,209,114,198,106,192, 57,216, 59,238,115,162,174,230,111,
+ 53, 54,134,150,183,183,183,145, 19, 89,203,150, 45,187,216, 24,142,189,187,119,133,122, 91, 43,154,231, 95,252, 25,153,215,147,
+113, 32, 77,173, 92,184, 98,237, 59, 47,188,250, 90, 81, 77, 97,230, 12,218, 6, 74, 59, 5, 7,249,199,175, 89,181, 66,161, 74,
+191,128,130,194, 66,252,124,241,114,178, 25, 72, 3,176,208,157,166,101,160,106,234,144,162,168, 39,169,194,218,157,225, 11, 10,
+ 10, 56,145, 21, 13, 0, 3, 6, 12, 72,177,137, 44, 56,107,209, 82,171,213, 53, 83,214,140, 0, 16,192, 93, 63,143,199, 67,255,
+143, 62,114, 89,100, 1, 96,147,147,147,161, 82,169,184,145, 98, 99, 69, 22, 66, 66, 66,254,117,230,204,153,192,111,190,249,166,
+124,199,142, 29,165, 86,171,149,223,181,107,215,240, 30, 61,122, 16, 59,119,238, 4, 0, 76,154, 52, 9, 11, 23, 46,196,141, 27,
+ 55, 32,147,201, 48, 96,192, 0,102,201,146, 37, 65,243,231,207,127,187,168,168,232,157, 90,123, 71,171, 85, 32, 22,139, 79, 3,
+ 24,150,158,158, 14, 0,231, 80,149,194,137,179, 34,212,121,204,153,206, 87,171,213,242,189,188,188,106, 13, 13, 33,168, 26, 13,
+185,106,129,176,115,254,246,219,111,159,175, 89,179,230,192,123,239,189,119,251, 17, 57,107,181,104,141, 27, 55, 14, 6,163, 25,
+185, 69, 26, 48, 12, 13,131,185,216,101, 62, 71,139,214,184,113,227, 80, 81,105, 66,118,129, 10, 52,205, 64,107,112,186, 47,151,
+ 62,247,220,115, 39,126,248,225,135,144,243,231,207,131, 97, 24,235,173, 91,183,238,191,252,242,203,138,247,223,127,223,255, 17,
+ 22, 25,125,245,218,107,175, 77,248,237,183,223, 84,237,219,183,247,187,120,241, 34,138,139,139, 65,211, 52,134, 13, 27, 6,161,
+ 80,152,189, 98,197, 10, 1,128,175,156,125, 54, 54,177,101,190,124,249,242, 27, 23, 46, 92,240,243,243,243, 19, 90, 59,116, 64,
+193,201,147,216,183,111,223, 67,255,176,101,203, 22,192,201, 40,252,156,197,233,210,165, 75,110, 17, 88,213,122,106,161,176,209,
+211,143, 79, 43, 46, 93,186,148,247,214, 91,111,117, 84, 40, 20,235, 6, 14, 28, 56,212,223,223,159,244,245,245, 77,104,214,172,
+217, 63,187,118,237,234,244,236, 2,159,207,159, 41,147,201,238,208, 52, 77,233,116, 58,232,245,250,170, 70,154,166,133, 36, 73,
+162,101,203,150,246,190,164, 87,175, 94, 8, 9, 9, 97, 50, 50, 50,102, 58,203, 95, 82, 82, 82,109, 21, 98, 45,152,211,191,127,
+127,158,209,104,196,131, 7, 15,146, 28, 15,212,166, 69,158, 18,196,212, 43,190,184,139,114,188,184,102,205,154,229, 88, 44, 22,
+ 54, 13, 96,175, 93,187,198,198,196,196,212,187, 85, 86, 86,178, 65, 65, 65, 5,181,116,126,112,228, 52, 26,141,213,254,207,104,
+ 52,178,193,193,193,140,193, 96,120,136,211, 96, 48,176,225,225,225,121,245,113,214,130, 25, 87,175, 94,221,180,120,241,226,222,
+ 46,220, 32, 59, 39,187,185, 3,187,125,251,246,191,177, 44, 59,120, 96,199,136,235, 19,187, 6,179,253,219, 6,229, 31,218,187,
+123, 50,203,178,131,107,110, 92,128,211,250, 56, 59, 4,203,158, 29, 30,213,162,236,247,227,223,179,103, 86,255,131, 93, 51,190,
+ 45,219, 61,220, 75,221, 33, 64,226,106,142,152, 6,179,165, 71, 69, 69,101, 90,173, 86,214,100, 50,177, 81, 81, 81,183,220,193,
+217, 8,212,199,217, 13, 85,190,108,175,213,242, 93,183, 71, 40,231,239, 44,203,178, 42,149,138,213,233,116,172,209,104,100, 25,
+134, 97, 29, 40, 13,213,230, 0, 0, 32, 0, 73, 68, 65, 84, 1,224,119, 39, 56, 89,179,217,204,150,149,149,177,112,222,231,174,
+ 86,206,208,208,208,251,119,239,222,101,159,121,230,153, 28,155, 57,126,190, 94,175,103,107, 66,175,215,179, 67,135, 14,101,111,
+221,186,197, 70, 70, 70, 86,222,186,117,139, 13, 13, 13,189,217, 64, 57, 91, 53,111,222,252,116, 64, 64, 64, 2,128,182, 46, 28,
+171,247,126,238,217,179,167, 53,203,178,179, 89,150,141,169, 99,155,205,178,108,135,199,205,105,187,191, 69, 44,203,178, 21, 21,
+ 21,172, 74,165, 98,243,243,243,217,138,138, 10, 86,167,211,177, 87,175, 94,101,207,159, 63,207, 94,191,126,157,245,243,243, 43,
+114,134,147,227, 51,153, 76,108,121,121, 57, 91, 92, 92,204, 26, 12, 6, 86,175,215,179,169,169,169,236,149, 43, 87,216,244,244,
+244,218,248, 30,226,244,247,247,223, 82, 88, 88,168, 59,119,238, 92,197,230,205,155, 43, 66, 66, 66,210, 1, 68, 0,104,231,235,
+235, 91,248,143,127,252,131,149,203,229, 89,141,124,143, 58,242,249,252,171, 43, 87,174,188,116,228,200,145,162, 67,135, 14,153,
+182,109,219,150, 59,111,222,188,179, 60, 30,239, 42,128,142,141,124,143,130,124,124,124,206, 93,188,120,145, 46, 43, 43, 99,213,
+106, 53, 91, 94, 94,206,234,245,122,214, 96, 48,176, 38,147,137,181, 88, 44,236,217,179,103,217,224,224, 96,199,105,201, 69,245,
+ 12,172, 23,176, 44,251, 47,150,101,121,238,110,235, 28,184, 7,186,139,211, 29,109, 29, 73,146,102, 91,219,209,167,106,183,254,
+253,199, 85,206,225,195,135,127, 50,121,242,100,118,244,232,209,108,116,116,244, 67, 91,247,238,221,217,185,115,231,178, 71,142,
+ 28, 97,191,248,226,139, 79,220, 80, 78, 30,170, 22,189, 44, 31, 62,124,184, 37, 49, 49,145,157, 52,105, 18, 11, 96, 84,125, 90,
+228,175, 32,184,184,240, 14,132,227, 95, 0, 48,155,205, 57,153,153,153,161,237,105,154, 2,128,175,191,254,250, 33,203,148, 35,
+ 18, 19, 19,105,130, 32,238,212,247,235,102,179, 57,231,204,153, 51,193, 27, 54,108,224, 59,152,128, 65,211,180, 53, 63, 63,159,
+ 92,191,126,125,181,243,227,227,227,105,154,166,179, 93,188,200,237,221,186,117,219,238,142,187,117,246,198,131,127,158,248,249,
+167,128, 62,189, 7,170, 21,126,126,181,142,194,246,188,221, 1,196,155,245, 91,181, 8, 30,185,108,229,242, 88, 31,110, 10,242,
+191, 41,133,234, 74, 35, 51, 52, 67,105,248,221,221, 79, 88,167,211, 61,224, 86, 2,234,245,250,236, 39,176, 18, 94, 69, 85,140,
+ 43,186,198,119, 61,241,136, 78,167, 86,171, 21,222,222,222,118,107,104, 35, 44,162, 44,103, 97,229, 30,221,163,148,135,101,217,
+223, 82, 83, 83, 35,103,204,152,225,181, 99,199,142,187, 12,195,240,103,205,154,101, 14, 9, 9, 17, 36, 37, 37, 89, 0, 16,131,
+ 7, 15,230, 21, 22, 22,178,121,121,121,170, 23, 95,124, 81,251,198, 27,111,248, 95,187,118, 77,104,181, 90, 27, 10, 90,120, 47,
+ 39, 39,103,120, 35,142,213,139,137, 19, 39,222,197,163,167,177,105,114, 78, 14, 42,117, 57,238, 62,200,179, 69, 48,183,130,201,
+ 42,178,251, 85, 89, 44, 52, 84,229,165, 46, 91,180,238,220,207,179,165, 24, 99,192, 48,249, 54,190, 42,135,120,182,172,162,225,
+222,132,199, 27,176,100,201,146, 49, 36, 73,146, 23, 46, 92, 48,174, 90,181, 42,167,164,164,100, 60,128,108, 0, 40, 43, 43, 27,
+178,125,251,246,239,156, 8,229, 80, 23,210, 44, 22, 75,223, 69,139, 22,189, 3, 96, 0,128, 22, 54,238, 36,155, 37,171,177, 17,
+204,139,213,106,245,200, 49, 99,198,156,164, 40,170,165,195,123, 20, 0, 64,201,189, 23, 44,203, 6, 21, 21, 21, 61,239, 12, 33,
+ 65, 16,107,155,170, 33,105, 74,238, 71,108,135,158,138,149,140,167, 79,159,254,116,252,248,241,188,136,136,136,255, 23, 17, 17,
+ 65,150,149,149, 65,167,211,129, 36, 73,132,132,132, 32, 42, 42, 10, 33, 33, 33,214,244,244,244,229, 31,124,240, 65,131, 49,249,
+158,125,246,217,214, 22,139,229, 25,146, 36, 91, 3,104,205,178,108,107,130, 32, 90, 3,240, 3, 0,133, 66,161,136,140,140,228,
+245,233,211, 7,189,123,247, 70,124,124, 60,246,238,221,251, 45,128, 19,142,214,172,154, 90,228, 73, 64, 90, 55,176, 29,175,130,
+184,209, 29,131, 9, 43,226, 89, 18, 67,162,146,237,113,246,106,138,172,186,147, 74,215, 98,250, 27, 53,108,216, 48,251, 11,231,
+ 68,167,242,160,161,151,175,164,164,100,212,204,153, 51,171,113, 50, 12, 99, 44, 45, 45,125,171, 95,191,126, 27, 41,138, 18,213,
+168,176, 89,197,197,197,127,106,174,190,154,113,180, 70,141,121, 73,249,168,156,114, 1,249, 76,230,209,255,160,168, 88,137,255,
+166, 20,150,105, 77,204,144, 91,202,138,212,166, 40,127, 86, 86,214,232,167, 64,241,215, 38, 90, 31, 53,121,118,137, 19, 1, 73,
+ 27,202, 81, 71,216,194,137,184,229, 37, 47, 44, 44, 92,253,209, 71, 31,141, 92,190,124,121,224,177, 99,199, 20,220, 0,229,149,
+ 87, 94, 41, 78, 77, 77, 29, 8, 64, 84, 89, 89,121,106,249,242,229,129,177,177,177,254, 0,252, 1, 96,236,216,177, 69, 69, 69,
+ 69, 27,224, 65,189,176, 88, 44,185, 81,207,182,183, 15,252, 28, 67, 58, 56,126,166,105, 58,215, 21,190,218,120, 28,247, 25,134,
+169,151,143,162,168,247,122,247,238, 77,189,247,222,123, 69,199,142, 29,227, 18,233, 58, 42,180,204, 6,130,146, 58, 3, 35,128,
+ 85,182,205,157,208,171, 84,170,190, 46,254, 15,227,169,141,181, 14, 40, 93,217,127, 44, 56,120,240,224,199,147, 38, 77,218,238,
+231,231,183,171,117,235,214,237,131,131,131, 21, 18,137, 4, 70,163, 81,107, 50,153,110,102,102,102, 78,249,248,227,143,239, 57,
+101,225,216,190,157, 2, 32,176, 90,173, 98,146, 36,101, 0, 20, 4, 65,248,114, 66,139, 32, 8,152,205,102, 60,120,240, 0,139,
+ 23, 47,102, 78,159, 62,253, 5,128, 79, 92, 24,184,246, 4, 16,232,208,142, 7, 2, 48,161, 42,128,109, 9, 65, 16,151,155,250,
+126, 17, 86,196,119,188, 10, 34,173, 27,106,235, 39,234, 79, 42, 93,215, 11, 87, 82, 82,210,215,221, 47,113, 93,156, 37, 37, 37,
+ 17, 79,202, 27, 50,221,184,234,123,108, 89, 85, 45,207, 33, 39,194,106,219,111, 8, 26, 3, 61,239,171, 19, 55, 86, 27,105,214,
+106,166,173,127,191, 85, 82,145,230,105,135,220,142,231,220,245, 46,185,177, 76,169, 25, 25, 25,253,230,205,155,247,177, 84, 42,
+237, 5, 0, 21, 21, 21, 23,242,243,243, 63,131,109, 85, 97, 67,199, 61,168, 27, 74,165,178,199,147,200,103, 50,153,254,217,175,
+ 95,191, 47, 25,134, 89, 67,211,116,210,255,192,163,168,244,212,198,167, 23, 63,254,248,227, 61, 0,125, 1, 96,194,132, 9, 20,
+ 0,236,221,187,215,101,241, 60, 99,198, 12,134,101, 89,179,173, 62,232, 81,181,186,176,140,107, 83,245,122,125, 89,126,126,126,
+ 58,195, 48,233, 0,190,131,235, 43,110, 3, 9,130, 56,194,178,236, 56,155,112, 59,194,178,236, 56,199,239,154,218,170,213,192,
+ 41, 13, 59,195,123, 80,133,189,105, 32,106, 78, 5, 54,180,223, 16, 50,139,244, 9, 0,186,123,238,238,255, 36,238,230,231,231,
+ 79,127,132,227, 30, 60,125,200, 54,153, 76,227,255,135,174, 87,227,121,228,127,145,254,175, 17, 2,139, 67,122,122,122,147,185,
+ 8, 60,110,116,188, 90,125, 0, 94,115,223, 1, 49,181, 9, 47,143,208,242,192, 3, 15, 60,240,224, 81,160,246,220, 2, 15,254,
+202,224,124,179,184,253, 58,124,180,106,250,103,217,247, 9,212,189,114,192,149,172,228,141, 89, 37,113,202,195,233,225,244,112,
+122, 56, 61,156,143,157,211, 7, 64, 36,128,149, 13,156, 87,115,117, 97, 17, 0, 37, 0,139,231,126,122, 56, 31, 65, 63, 56, 5,
+150,101,199,214, 55,117, 72, 16,196,209,166, 18, 90,118,103,248,110, 88, 18,117, 21, 75,184,125,103,133, 86, 83, 99,132,135,211,
+195,233,225,244,112,122, 56, 61,156, 30, 78, 15,231, 35, 10,173,161, 31,124,240,193,135,168, 10,141,193,126,240,193, 7, 31,178,
+ 44, 59,182,234, 16, 59,182, 41,127,251, 70,119, 12, 78,235, 6,150,219,110,116,199,224, 58, 78,141,113,216,236,240, 76, 29,122,
+224,129, 7, 30,120,224,129, 7, 79, 58,206,173, 88,177,162, 98,197,138, 21,156,227,123, 9, 0,194,102,225, 42,105,202, 31,182,
+ 77, 19, 58,179, 80,170,254, 20, 60,143, 1, 97, 36, 79, 48,149, 47, 16, 13, 5,107,141, 2, 0,144,212, 13,198, 84,249, 43, 77,
+155,119, 1,200,111, 44,113, 7,224,217, 54, 62,146, 67, 70,134, 17,228,104, 77, 19, 50,170,210, 28,184,140, 9, 64,127,145, 80,
+248,139,200,199, 71, 82,219,113,163, 90,109, 48,154, 76, 35,247, 2,191,121,222, 1, 15, 60,240,192, 3, 15,158, 18,200,124,125,
+125, 79,147, 36, 25,193,125,225, 24,119,176,102, 12, 66,134, 97, 10, 84, 42,213, 72, 84, 77, 21,255,153,156,142,255,111, 66, 35,
+251,114,119,195,213,169, 67, 30, 80, 45, 10,107,131, 25,179,219,135,200, 6,182,111, 29,177, 59,191,176, 40,165,188,210, 52, 43,
+ 51, 95,167,114,181,144, 20, 95,244,134,151,183,207,178,191,205,252,167,127,219,118,237,137,230,205,155, 1, 44,144,157,147, 27,
+124,231,246,173,225, 63,238,248,234,221,114,141,106,177,197,104,252,143,171,220,207, 2,178, 22,114, 81,210,127, 62,120,221,135,
+ 7, 26,175, 45,221,125,156,208,153,155,167, 87, 45, 55,117, 73,100,249,248,251,159, 88,113,234,148,196,183, 75,151,106,199, 88,
+150,173,202,175,247,251,239,146,255, 55,114,228,137, 9, 42,213, 40,143,216,250, 75, 34, 68,161, 80,204,231,243,249, 67,204,102,
+115,132, 80, 40,204, 97, 24, 38,161,172,172,108, 29,128, 60,207,237,241,192,131, 6, 81, 95,126,205,199,150,123, 19, 0,228,114,
+249, 21,146, 36,195, 29, 69, 0,151,179,151,219,175,249,215,106,181,222, 83,169, 84,253,234,161,109,237,231,231,183, 17, 64,207,
+134, 2, 38,219, 98,179, 93, 86,169, 84,111,161,238,213,122, 94,190,190,190,159, 18, 4, 49,145, 36, 73,170,161,107,178, 90,173,
+ 12,203,178,123,202,202,202, 62, 1,160,173,235, 60, 95, 95,223, 83, 25, 25, 25, 61,131,130,130, 26,180,210,208, 52,141,236,236,
+236,192, 94,189,122,157, 85,169, 84, 29,154,146,211, 21, 45,242, 56, 81,207,170,195, 58, 43, 58,128,106,249,133,136,250, 31, 36,
+166,126,179,236,173,102, 5, 89,183,155,205, 89,254,125, 59,194,159, 25,114,179,212, 80,232,236, 15, 10,196,242, 67,125, 7,141,
+ 26, 58,247,157,247,100, 87, 83,111,226,151,248,243, 40,215, 27, 65,145, 36,124,188,164,104,215,238, 25, 98,109,220,190,128,111,
+ 55,175, 93,115, 33,241,228,216, 74,189,230, 69,151,100,186,148,183,120,225,203,189,100,254,126, 12, 96,101,240,175, 49, 93,101,
+255,239, 72,202, 98, 84,208, 31,186, 44,178, 78,159,150, 22, 23, 21, 33, 54, 44, 12, 60,154,134,152, 36, 33, 38, 8,136, 73, 18,
+ 50,177, 24,163,183,109,195,103,199,142, 73, 63,126,254,121,143,216,250,139, 65, 46,151,207, 12, 11, 11, 91,181,117,235, 86,255,
+ 86,173, 90, 65, 38,147, 65,165, 82, 5,100,102,102,118, 91,176, 96,193,244,130,130,130,143,202,203,203,183,120,238,148, 7, 30,
+212,137,110, 0, 82, 80,123,254,210,250,142,213, 9,177, 88, 92, 84, 89, 89, 25, 84,223, 57, 66,161,176,216,100, 50, 5, 55,196,
+ 69,146,100,120, 94, 94, 94,144, 84, 42, 5,195, 48,182,108, 0, 86,251, 64,218, 49,251,137, 45, 80, 45, 58,116,232, 96,174,143,
+211,203,203,235,235,226,226,226, 17, 92,158, 64, 7, 65, 85, 43,242,242,242, 70,116,236,216,241,107,173, 86, 59,178, 14,241,242,
+233, 59,239,188, 51,191, 83,167, 78,156, 21,200,150, 5,161,234,175, 82,169,196,188,121,243,236,191, 97,181, 90,113,242,228,201,
+119,102,206,156,137,178,178,178, 5,245, 92,123, 68, 80, 80, 16, 97, 75, 40, 94, 39,150, 44, 89,130, 37, 75,150,224,171,175,190,
+ 34,248,124,190, 79, 3,247,211, 45,156,206,106,145,199, 97,193,106, 32, 50,252, 81, 84,247,205, 58,250,144,208,114, 22, 36,107,
+253,121,233,186,173,179, 98,103, 12, 32,190, 89, 48,162,237,155, 95,157, 58, 79, 10,216, 65,233, 5,149, 57, 78, 88,178,254,222,
+179,223,136, 33,243,230, 47,148,125,255,211, 25,100,166,255,142,140,164, 31,170,157,211, 99,228, 76, 20, 42,181,152, 57,247, 95,
+114,130,226, 13, 73, 60,117,240,239, 22,163,225, 27, 39,173, 89,193, 17, 34,225, 63,250,244,138,226,231, 73, 50, 17,226, 43,193,
+128,238,109,248,205, 79, 92,255,135, 30,244,151,233, 85,171,100, 92, 18, 89, 91, 95,127, 29, 3, 45, 22, 4, 81, 20, 40,130, 0,
+ 5,128, 36, 8, 84, 26,141,184, 60,117, 42,122,237,220,137, 79, 14, 31,150,126,250,194, 11, 46,137, 45,153, 76,118,149, 32, 8,
+ 95,157, 78, 55, 22, 85,137,165,159, 6,116,148,203,229, 71, 89,150, 45,211,235,245,221,158,160,114,133,162,106,142,190,230,232,
+ 88,128,170, 21, 85, 46,101, 22, 22,137, 68,111, 76,152, 48, 97,237,134, 13, 27,164, 69, 69, 69,200,207,207, 7,195, 48, 16,139,
+197,104,219,182, 45,113,234,212, 41,255,133, 11, 23,174, 62,122,244,168, 72,171,213,126,233,202,192,134,207,231,199,249,249,249,
+ 61, 31, 28, 28, 44, 43, 46, 46,174, 80,171,213, 39,141, 70,227, 27,104,124,218, 20,146,207,231, 79,137,140,140,124, 41, 44, 44,
+ 44, 56, 47, 47, 79,153,155,155,123,200,104, 52,126,139, 70, 38,106,118,184,167, 93, 96,139, 86, 15,160, 32, 50, 50,242,198,131,
+ 7, 15,138,221,200,153, 31, 25, 25,153,214, 8, 78, 25,128, 31, 1,132, 53,112, 94, 62,128, 73,112,209,154,237,129,251, 68,150,
+ 45,165, 85, 77, 65, 85,223,177,122, 97, 52, 26, 3,205,102, 51,248,117, 36,139,215,235,245,240,242,242, 10,116,182,144, 18,137,
+ 4, 63,252,240, 3,248,124, 62,248,124, 62,202,202,202, 16, 30, 30,110,223, 23, 8, 4,246,207, 45, 90,180,104,144,143, 97,152,
+ 94, 20, 69, 65,167,211,129, 97, 24,251,166, 86,171,193,178, 44, 68, 34, 17, 24,166, 42,157,147,195,241, 94,117,241, 17, 4, 49,
+ 49, 44, 44, 12,223,127,255, 61, 76, 38,211, 67,199, 21, 10, 5, 82, 83,255, 72, 50, 66, 81, 20,122,247,238, 77, 18, 4, 49, 17,
+192,130,122,120, 89, 0,136,137,137, 1, 69, 81,160, 40, 10, 36, 73,218, 63,115, 27,195, 48, 88,178,100, 9,106,164, 38,251,211,
+ 56,159, 52, 52, 16, 25,190, 0,117,248,104,145,245,145,182, 15,150,189,181,224,181, 17, 21,139,255, 62,134,253,112,218,115,236,
+194,215, 6,179,207, 15,234,252, 19,197,227, 17, 23,211,178, 17,238, 13,124, 59,175,103, 68,243, 0, 89,106,148,159,188, 93, 45,
+ 20,142, 75, 60,195,164, 50,197,231,111,253,243, 95,242,163,103,175, 35, 59, 39,251, 33,145, 5, 0, 87,126,249, 22, 5,249,121,
+ 72,201,200,197,148,191,191, 45, 87, 40,124, 62,175,209,160,214,185,108,212,219, 75,240,197, 7,147, 6,136,117,150,124,104,125,
+ 1,170,181, 16,124,169, 30, 11,199,117, 17, 41,188, 4,245,165,170,176,115,138,132,194, 95, 86,156, 58,101, 23, 89,253,141, 70,
+136, 24, 6, 52,195,216, 69,150,137,166, 97, 48,153, 16,170,211,225,206,204,153, 96, 45, 22,124,116,224,128, 84, 36, 20,254,226,
+ 76, 57, 1, 64, 32, 16,132, 30, 58,116,168, 69,231,206,157,227,225,124, 48,211, 83, 77, 80,119,156,229,236,222,181,107,215,132,
+157, 59,119,182, 16, 8, 4,161,238,224, 20,139,197,175,202,100,178, 18,177, 88,252,106, 35,203, 73, 2, 88, 58,107,214,172,228,
+103,158,121,230,140, 77, 88,217, 69,205, 51,207, 60,115,106,214,172, 89, 87, 1, 44,169,163,174,215,198,217, 44, 44, 44,108,217,
+134, 13, 27,164,183,110,221, 66, 94, 94, 30, 44, 22, 11, 94,123,237, 53, 48, 12, 3,131,193, 0,147,201,132,149, 43, 87,202,252,
+253,253, 23,163, 42, 81,176, 51,215, 46,240,246,246,190,181, 99,199,142, 9,247,239,223,151,159, 57,115,134, 72, 77, 77,149,173,
+ 94,189,122,188,191,191,127, 38, 0, 81, 35,238, 39, 25, 26, 26,250,205,193,131, 7,223, 74, 77, 77, 13,223,191,127, 63,255,194,
+133, 11,161,155, 55,111,158, 29, 26, 26,186, 19, 0,213,200,103,212, 77, 42,149, 14,127,255,253,247,173,231,206,157,203, 59,119,
+238, 92,222,218,181,107, 49,112,224,192,254,177,177,177,209,141,228,236,238,229,229, 53,236,253,247,223,183, 38, 38, 38,230, 95,
+188,120, 49,119,245,234,213,228,176, 97,195, 6, 44, 91,182,172,139,139,156, 63,158, 59,119,110,112, 78, 78, 78,171,220,220,220,
+150,185,185,185,145,185,185,185,145,121,121,121, 17, 5, 5, 5, 45, 10, 11, 11,155, 23, 23, 23, 55, 79, 72, 72, 24, 0, 96,247,
+ 19,246, 30,253, 47,112,242, 56, 33,165, 82,169,112,244,232, 81,216,172, 87,221, 28, 69, 86,121,121, 57, 10, 10, 10,184, 99, 60,
+103,202,169, 80, 40, 78,111,221,186,149,173,172,172,132, 70,163, 65,113,113, 49,114,114,114,112,231,206, 29,148,150,150,226,230,
+205,155,144, 74,165,167,157, 41, 39, 65, 16, 96, 24,198, 46,164, 78,158, 60,137, 89,179,102, 65,165, 82,217,191,227,241,120,246,
+207,220,255, 52,196,201, 89,158, 24,134,193,197,139, 23, 49,103,206, 28,172, 93,187, 22,187,119,239,198,145, 35, 71,160, 82,169,
+236, 98,139,166,233, 6, 57,149, 74, 37,172, 86,231,198, 76, 44,203, 66,163,209, 56,253,220, 29, 5, 16,143,199,123, 72, 20,113,
+155, 43,117,233, 17, 57,159, 88, 56, 17, 25,190,238, 17, 54,247,193,102,170, 27, 82, 77,104, 69,134, 44, 94, 53,127,162, 4,140,
+ 25,172,197, 0,152, 43, 0,179, 14, 86, 83, 5, 8,129, 4,176, 24, 16, 40, 82,225,199,185,237, 21,139,190,191,155,206,220, 36,
+198,102, 40,181,199,107,237, 17,120,130, 41, 19,103,188,227,159, 91, 92,142,188, 34, 13, 40,242,143,126, 47,122,196, 12,240, 40,
+ 18,151, 78, 84, 25,174, 72,138,130, 70,111,132, 90,103,198,132, 25,243,253,254,179,246,223, 83,104,115,101,189, 49, 94, 58, 1,
+109,163,228,242,151, 59,118,108, 65,166,139, 50, 16,253,124, 18, 24, 43,192, 38,190,128,110,101, 65, 84,135, 95,132, 47,235,181,
+230,101,169,192,173,122,173, 25, 62, 62, 18,223, 46, 93, 16, 27, 22,134, 65, 22, 11, 4, 44,139,231,138,138,240,251,252,249, 48,
+238,219, 7, 18,128,224,213, 87, 49,116,221, 58,156, 13, 11, 67,136,193, 0,245,187,239, 34,240,248,113, 8, 20, 10, 9, 74,156,
+ 91,252, 64, 16, 4,134, 12, 25,130, 83,167, 78,249,143, 30, 61,250,196,245,235,215, 95,161,105,250,108, 99, 30,162,183,183,247,
+ 21, 30,143, 23,222,208,121, 52, 77,231,106, 52, 26,151,211,140,240,120,188, 65,189,123,247, 62,176,127,255,126, 95,179,217,236,
+150, 81,136, 80, 40, 28, 61,126,252,248,173,155, 54,109, 82,204,158, 61,123,235,145, 35, 71, 42, 76, 38,211,113, 87, 44, 57, 0,
+150,110,217,178,229,205,152,152, 24,159,217,179,103,179,119,238,220,113,180, 94, 5, 14, 28, 56,240,153,173, 91,183,134,244,236,
+217,243,157, 57,115,230, 8, 0,124,212,144,149, 71, 46,151,207,221,186,117,107,128, 82,169,132, 78,167,179, 55,178,185,185,185,
+144, 72, 36, 32, 73, 18, 36, 73,130,207,231,227,243,207, 63,247,159, 59,119,238,124,149, 74, 53,223, 9, 43, 89,220,198,141, 27,
+ 3, 71,142, 28, 73,222,191,127, 31, 36, 73, 66, 44, 22,227,245,215, 95, 39, 13, 6,131,111,108,108,236,118,189, 94, 63,217,149,
+123,200,231,243,167,196,197,197,181,235,223,191, 63, 47, 35, 35, 3,125,251,246,197,165, 75,151,240,234,171,175,242,181, 90,109,
+203,133, 11, 23,206, 50, 26,141,174,198,113, 9,149, 74,165,157,126,253,245,215,156,230,205,155,219, 27,150,150, 45, 91, 50, 99,
+199,142, 85,101,100,100,180, 63,119,238, 92,105,191,126,253, 92, 73, 88,222, 76, 42,149,118,248,249,231,159, 11, 98, 99, 99,135,
+111,217,178,101, 60, 0,244,234,213,235,208,103,159,125,118, 70,165, 82, 69,157, 61,123, 86, 53,104,208,160, 92, 39,249,194, 66,
+ 67, 67,153,121,243,230,201,235, 59,105,219,182,109,106, 84, 37, 92,110, 5,224, 30, 60,248,179, 64, 3,136, 38, 8, 34,229,232,
+209,163,232,221,187, 55,142, 30, 61,138,177, 99,199,166, 56,138,129,212,212, 84, 12, 26, 52, 8, 54,139,150, 83,190, 90, 26,141,
+230,131, 37, 75,150, 36, 78,153, 50, 69, 90,173, 49, 32, 73,248,248,248, 96,204,152, 49,149,122,189,254, 3,103, 11,202, 48, 12,
+120, 60, 30,114,115,115,177,109,219, 54, 44, 95,190, 28,109,219,182,133,197, 98,121, 72,108,217,218, 61,167, 26, 63,154,166,113,
+249,242,101,236,218,185, 19, 31, 45, 94, 12, 47, 47, 47, 0,128,217,108,134,170,172, 12, 98,177,216, 46,198, 26, 16, 78,123,110,
+223,190, 61, 63, 60, 60,188,218,148, 33,247,215,214,102,193,106,181,130,166,105, 84, 86, 86, 98,237,218,181, 52,203,178,123, 26,
+234,127, 56, 81, 52,127,254,124, 24,141,127, 24,212,187,216,124,146, 35, 35, 35,209,181,107, 87,251, 62, 73,146,172,179,156,255,
+233,215, 9, 6,135,179,219, 47, 89, 13, 0, 8, 15, 15, 71,251,246,237, 17, 26, 26, 90, 39,103,109, 90,228,113,195,133,200,240,
+117, 11,173,186, 50,101,167,223, 47, 92, 57,123,225,234,213, 50, 49,197,255,231, 75,157,209,194, 71, 0, 72,252, 32, 24,180, 8,
+132, 79,213, 64,158, 85,221, 3,126, 89,132, 53, 47,171,200,152,239, 42,127, 50, 51,190,129,119,203,202, 30,114,194,227, 11,196,
+ 67, 91,183,105, 71,100, 23,168,192,227,241, 32,243, 14, 64,191,151, 22,128,162, 72,200,125, 2, 64, 48,134, 63, 20, 49, 73,129,
+ 71,241,160,210, 26, 16,217,170, 13, 41, 18, 75,134,234, 27, 16, 90, 10,111,254,198,247, 39,247, 19,151,210,185,144,180, 16,131,
+225,186,211, 48, 33, 72,127, 45,222, 27,221, 86, 18,115,232,250, 70,104, 44,195,156,185, 49, 20, 77, 35,136,162, 96,102, 89,252,
+ 62,127, 62,162,227,226,144,194, 9,195,184, 56,164,196,196,192,143,207,135,136, 36,193, 90, 44, 15,205,233, 59, 35,180, 0, 32,
+ 39, 39, 7,251,246,237,243,155, 56,113,226,129,212,212,212, 41, 46,138, 13,142, 43,224,226,197,139, 65,173, 90,181,170,243,156,
+123,247,238,161, 71,143, 30, 46, 79, 79, 9,133,194,209,195,134, 13,251,126,223,190,125,222,105,105,105, 8, 10, 10,122,100,161,
+ 37, 18,137, 6,141, 24, 49,226,251, 29, 59,118, 40, 74, 74, 74, 16, 23, 23,167,120,225,133, 23,118, 39, 39, 39,191,100, 52, 26,
+157, 17,155,213, 68, 86, 92, 92,156,122,219,182,109,255, 65,245, 41,194,130,109,219,182,125,211,179,103,207,183, 98, 98, 98,124,
+ 0,188,105,243, 29,168, 87,108,137, 68,162, 33,173, 91,183,174, 54,170, 21,137,170,140, 77, 50,153, 12,222,222,222, 16, 8, 4,
+ 48, 26,141,136,142,142, 38,132, 66,225, 0,103,174,217,203,203,107,196,203, 47,191, 76, 38, 37, 37,161,176,176, 16, 62, 62, 62,
+144,203,229, 96, 24, 6,179,103,207,166,214,174, 93, 59, 68,175,119,109,134,171,121,243,230,227,135, 15, 31,206,187,113,227, 6,
+238,223,191, 15,163,209,136,204,204, 76, 40, 20, 10, 76,155, 54, 77,176,106,213,170, 23,242,242,242, 92, 21, 90,157, 98, 98, 98,
+138, 28, 69, 22, 7,153, 76, 70,180,107,215, 78,229,239,239,223, 29,128, 43, 66,171,211,219,111,191, 93,188, 98,197,138, 65,167,
+ 78,157,178, 7,189, 60,117,234,212, 66, 0,248,242,203, 47, 19, 3, 3, 3,187, 3,112, 86,104,129,101, 89,235,223,254,246,183,
+ 44,161, 80, 8, 62,159, 15,161, 80, 88,109, 19, 8, 4, 32, 73,210,139,123,157,255,194,162,166, 39,128,255, 67, 85,114,221,197,
+ 0, 46, 62, 33,229,186, 10, 32,122,236,216,177,118,177,117,236,216, 49,140, 30, 61, 26,106,181, 26, 55,110,220,112, 20, 89,174,
+ 36, 88,190,106,177, 88,174,253,240,195, 15,253, 38, 78,156, 72, 56,188, 95, 72, 75, 75,195,205,155, 55, 83,156,229, 35, 73, 18,
+ 86,171, 21,124, 62, 31,171, 87,175,134,217,108,198,119,223,125,135,189,123,247,130, 36, 73, 16, 4, 1,130, 32,160, 80, 40,240,
+213, 87, 95,185,212,238, 49, 12,131,237,219,183, 99,209,194,133,118,145,101,155,201, 64, 72,112, 48,252, 3, 2,112,247,238,221,
+ 6,133, 86, 89, 89,217, 39,135, 15, 31, 70,125,206,240,135, 15, 31,182,127,174,225, 12,223,112, 63, 71, 81, 48, 26,141,120,238,
+185, 63, 82,197,190,253,246,219,246,207, 42,149, 10, 20, 69,113,247,130,112,150,211,192, 2, 47,137,255,248,110,204,123,239, 85,
+179,208,213,197, 89,151, 22,121, 18,173, 91,181,136,173,104,155,117, 54, 20,192, 88, 84,249,104, 21, 0, 13,248,104,221, 42,214,
+111,224, 17, 5, 93, 87,204, 27, 57,163, 69,144, 55, 88, 93, 17, 4,195, 62,193,181, 18, 9, 86,175,253, 25, 0,240,175,215,123,
+160,203,136,165, 48,125, 59, 18,243,251, 82,194,169,185,198,247, 1,124,252,112,195,104,237, 16,222, 44, 12,215,238,164,130, 71,
+ 81, 16,122, 7,192,219, 47, 24, 86,218, 4, 77,241,125,196,239,255, 26, 0,176,101,251, 30,144, 36, 9, 30,143,130,209,196,160,
+109,139, 48, 88,173,214, 14,245,149,243, 89,160,223,144,224,128,222,205, 35,124,136, 27,190,247,209, 46,200,191,198, 68,136, 8,
+109,243,229, 68, 95,185,164, 87,153,166,188, 95, 58,112,174, 65, 49, 64,146, 32, 9, 2, 82,129, 0,198,125,251,170,188, 54,227,
+170,250,172,148,152, 24,144, 63,253, 4, 47,145, 8, 20, 65,128,103, 51, 65, 55, 6,229,229,229, 32, 8, 2,187,118,237,242,157,
+ 54,109,218,238, 27, 55,110,196, 84, 86, 86,238,115,133, 67,173, 86,143,237,223,191,255,153,237,219,183, 7,134,132,132, 60,116,
+188,176,176, 16, 51,102,204, 40, 81,171,213, 46, 5,117, 19,139,197,175,142, 31, 63,126,235,183,223,126,171,184,125,251, 54,116,
+ 58, 29, 2, 3, 3, 31,181,142,118,239,211,167,207,129,125,251,246,121, 23, 22, 22, 66,163,209,192,104, 52, 98,215,174, 93, 62,
+ 99,198,140,217,151,145,145, 49, 26, 64,114, 3, 28, 31, 59,138,172, 57,115,230, 92, 7, 16, 4, 96, 99, 77, 13,106, 59,214,217,
+ 65,108,105, 0,172,170,103, 36, 26, 33,147,201, 80, 92, 92,140, 25, 51,102,224,214,173, 63, 12,160, 97, 97, 97,246,145,222,221,
+187,119, 17, 24, 24, 8,130, 32,130,156,185,232,192,192, 64,185,201,100,194,172, 89,179,144,147,147, 83,141, 51, 55, 55, 23, 4,
+ 65, 72, 93,189,145,193,193,193,193, 6,131, 1, 3, 7, 14, 68,101,101, 85, 94,223, 73,147, 38,129,207,231,163,184,184, 24,124,
+ 62, 63,160, 17,207, 39, 96,236,216,177,117,134, 86, 81, 40, 20,102, 95, 95,223,103, 93,228,244,127,225,133, 23,242,226,226,226,
+ 30, 90,216,114,233,210,165, 23,253,252,252, 78,249,249,249,181,115,145,211,234, 40,170, 4, 2, 65, 53,161,197,231,243, 65,146,
+164, 21,127,125,124, 1,128, 91, 5,183, 9, 64,215, 39,168,108,118,177,117,236,216, 49, 68, 69, 69,161,172,172, 12, 25, 25, 25,
+141, 21, 89, 92,123,183,232,211, 79, 63,253,229,149, 87, 94,145,113,131, 86,137, 68,130,119,223,125,215,160,211,233, 22,185, 84,
+137,172, 86,240,120, 60,251, 32, 89, 44, 22, 35, 58, 58,218, 46,178, 8,130, 64, 69, 69, 5,120, 60, 30,183, 34,145,112,178,140,
+ 8, 13, 9,129,151,151, 23,218,180,109,139,219,182,118,132,251, 44, 18,137, 64, 16, 4,104,186, 65, 67,158,214,230,212,190,192,
+205,207,134,229, 68, 81,189,166,227,176, 48, 88,173, 86, 78,100,178,238,224, 12, 8, 8,128, 78,167,115,150,243,137, 68, 29, 22,
+ 45, 78,104,141, 69,149,175,214, 67,225, 29, 6, 3,136, 71,245, 37,149,228,179,193,242,109, 43,230, 14,159, 49, 50, 42, 0,134,
+146,251, 16,123, 5,128,240,137,196,234,181, 63,227,198,189, 82, 0,192,234,221, 87,240,125,236, 24, 64,226,135,246,222, 74,132,
+120,241, 94,190, 89,252,176,208, 34,192, 18, 86,150, 5,143, 34,109,115,183, 20, 40,138,132,170,164, 0,235, 62,121,211, 38,178,
+246,226,104, 98, 6,194, 91, 71,253, 49,143, 75, 16, 0, 91,127,229, 14,244, 22,196,205,125,165,143,164,136, 40,128, 79,152, 20,
+ 98,113, 13,253,232, 43, 0, 17, 73, 98,222,144,112,233,229,195,149,113,233, 26,115,131, 29,133,152, 36,171,156,223, 9,162, 86,
+231, 30,210,118,140, 34, 8,176, 44, 11,214,234, 90,155,206, 9,121,137, 68, 2,179,217, 12,138,162,176,126,253,122,159, 17, 35,
+ 70,108,116, 85,104, 1, 72, 43, 42, 42, 26, 51,123,246,236, 99,123,246,236, 9, 8, 8, 8,168, 54,122,152, 61,123,182,178,168,
+168,104, 12, 92,116,186,231,243,249, 27, 55,109,218,164,120,240,224, 1, 42, 42, 42, 32,145, 72,236,141, 79, 99,235,103,175, 94,
+189, 78, 28, 63,126,220, 87,163,209,192,108, 54, 67, 34,145,128,101, 89, 80, 20,133,255,254,247,191,254,227,198,141,251, 57, 59,
+ 59,123, 88,125,101,149, 72, 36, 47,217,132, 19, 98, 98, 98,124, 98, 98, 98, 6, 3,117, 70,234,181, 35, 38, 38,198,103,193,130,
+ 5, 47, 24, 12,134, 85,245, 92,115,142, 74,165, 10,145, 72, 36,216,191,127, 63,228,114, 57,164, 82, 41,194,194,194,160, 82,169,
+ 32,149, 74,193,178, 44, 44, 22, 11,215, 88,148, 58,115,225, 37, 37, 37, 58,154,166,189,143, 29, 59,134,210,210, 63,254,165, 69,
+139, 22, 80,171,213,176, 90,173, 21,174,222,204,252,252,252, 34,130, 32,154, 95,187,118, 13, 15, 30, 60,192,232,209,163,241,211,
+ 79, 63,161, 71,143,170,217, 97,147,201,212,152, 32,126, 12, 69, 81,108, 61,245,150, 0,224,235, 78, 78, 91,231,229, 18,167,213,
+106,181,114, 34,203,241,175,163,248,106,224, 55,255, 42,240,118, 28, 39, 60,169,133, 28, 61,122, 52, 84, 42, 21,228,114,185, 59,
+252,115,206, 27, 12,134,204,131, 7, 15,118, 31, 59,118, 44,132, 66, 33, 50, 51, 51,145,156,156,156, 1,224,188,171, 66,139,207,
+231,227,211, 79, 63,197,155,111,190,137,224,224, 96, 44, 90,180, 8, 60, 30,207,190, 17, 4, 97,183,112,185,130,160,224,250, 23,
+ 62,114, 14,241, 13, 25,195,189,189,189, 63, 37, 73,114, 34,229,196,141, 99, 24,134,177, 90,173,123, 52, 26, 77,189,225, 29, 56,
+199,117,103,158,133,227, 61,104,160, 79,123,100,206, 58,180,200, 99, 71,205,213,134,117, 88,180,184, 85,135, 15,165, 2,226,174,
+ 50,222,102,178,139,119, 20, 89,159,191, 57,116,198,200, 40, 95, 28, 58,125, 17, 2,179, 26, 48,105,235,121,194, 22, 16, 2, 25,
+130,189,249,181,250, 10, 17, 36,117, 51, 55, 47, 31,254,190,114,155,200,178,109, 36,137, 46, 81, 85,131,217,163,137, 25, 8,111,
+ 21, 5, 30, 69,129, 71, 81,144, 75, 68, 40, 42, 44, 0,143, 71,222,172,235,103, 59, 81,120,229,149,118,205, 35,125,253,249, 80,
+ 6,154, 16, 26, 92,135, 97,160,187, 23,194, 67,133, 24,229, 47,142,232, 68,225,149,122,101, 57,203,218,133,150,153,166, 33,120,
+245, 85,251,116, 97, 74, 76, 12,162,227,226,192,140, 31, 15,189,217, 92,205, 84,220, 88,161, 37,145, 72,160,213,106, 49,101,202,
+ 20,149,197, 98,121,171,145,117, 33,185,180,180,116,194,212,169, 83, 75, 57, 1, 99, 54,155, 49,117,234,212,210,210,210,210, 9,
+ 78, 88,137, 30,130,197, 98,121,171, 71,143, 30, 42,165, 82,105, 47,103, 99, 26, 28, 14,126,126,126, 71,183,109,219,230,103, 52,
+ 26, 65,211,180,157, 83, 34,145,128,162, 40, 4, 6, 6,226,251,239,191, 15,244,243,243,171, 55,103,149,193, 96, 56, 24, 23, 23,
+167, 6,128,184,184, 56, 53, 65, 16, 9, 4, 65,108, 38, 8, 98, 83,141,109, 51, 65, 16, 9,142,231, 26, 12,134, 3,245,113,155,
+ 76,166,132,140,140, 12, 86, 42,149,130,162, 40,152,205,102,136,197, 98,187, 73,188,188,188, 28, 6, 67,213, 52,119,114,114, 50,
+ 44, 22, 75,146, 51,215,174,213,106, 79,111,223,190,221,218,162, 69, 11, 68, 69, 69, 33, 58, 58, 26,125,250,244, 65, 68, 68, 4,
+ 62,251,236, 51, 70,175,215,199, 55, 66,104, 29,253,241,199, 31, 45,205,155, 55, 71,247,238,221, 33, 18,137,208,165, 75, 23,132,
+133,133, 97,249,242,229, 38,141, 70,115,172, 17,143, 41, 59, 53, 53,149,170, 71,228, 42,224,196,234,221, 26,200,185,124,249, 50,
+213,167, 79,159, 67, 53, 15,244,234,213,235,144, 92, 46,247,230, 76,236,174,140,200, 29,197,149, 72, 36,178,111,220,247, 60, 30,
+239,127,193,162, 53, 31,192,117, 84,197, 97, 90,244,132,149,205,238,248, 94, 90, 90,138,140,140, 12, 36, 39, 39,163, 79,159, 62,
+ 72, 74, 74, 2,254,112,144,119, 25, 26,141,102, 81,108,108,172,158, 91,201,183,120,241, 98,131, 86,171, 93,228,106, 27,204,178,
+ 44,248,124, 62,218,183,111,143, 5, 11, 22,224,231,159,127, 70,102,102, 38, 44, 22,139, 93, 8,113, 62,153,174, 88,180, 4, 2,
+ 1,130,131,131, 97,177, 88,236,214, 44, 0,184,125,235, 22,120, 60, 30,172, 86, 43, 76, 38, 83,131, 22, 45,111,111,239, 79,183,
+110,221,250,142, 82,169, 12, 45, 41, 41, 9,114,220,138,138,138,130, 10, 10, 10,130,242,242,242,130,114,114,114,130,178,178,178,
+130,238,223,191, 31,186,114,229,202,119,188,189,189, 63,117,166,156, 20, 69,161, 75,151, 46,120,251,237,183,237,219,134, 13, 27,
+236, 91,124,124,188,203,206,235, 20, 69,161,253,146,213, 24, 83,194,218,183,159, 3, 9,251,118,227, 95,115,234,227,172,169, 69,
+158, 8,112,171, 13, 29, 19, 75,215, 2,110,213, 33,215,150,217,221, 54,106, 58,195, 3, 0, 58,132, 72,151,126,254,198,160, 25,
+207, 61,235,141,131,167,175, 32,246,192,189,155,109,103, 4,182,127,198,183, 4,214,146, 12,252,235,245, 30, 88,189,251, 10,128,
+170,169, 67,107,241, 13,176,101,119,193,122, 53,199,125,149,178,214,105, 7,218, 84,121,230,222,157, 91, 67,219,119,234, 73, 22,
+ 42,117,213,150,127, 70, 15,153, 0,130, 32,208,172, 85, 20, 40, 30, 15, 20, 69,130, 71, 81,240, 81,136,145,113,237,154,213,104,
+ 48,156,169,141,115, 48,192, 19, 74,132, 27, 94, 31,213, 69,156, 47, 44, 70, 96,168, 12, 2,126,149,118,100,239, 77,168,209, 67,
+240,128, 78, 94,152,153,231, 47, 57, 83, 84,185,193, 87,111, 62,148, 80,199, 8,208,106,181, 66, 46, 18,161,210,104,132,129,166,
+ 49,100,221, 58,251,116, 33, 73, 16,184, 10,160,243,186,117, 56,183,111, 31, 20, 66, 33, 32, 18, 57,189, 42,164, 54,161,165, 84,
+ 42, 49,125,250,244,210,130,130,130,105,141,241,209,226, 96, 52, 26,207, 22, 22, 22, 78,155, 48, 97,194,174,253,251,247,251, 77,
+152, 48, 65, 85, 88, 88, 56,205, 73,191,167,135, 80, 89, 89,185, 47, 39, 39,167, 98,250,244,233, 59,119,239,222,237, 31, 16, 16,
+ 96, 31,137, 52,170,178, 18,132,114,248,240,225, 34,103,206,107,224,148, 88,155,115,251,155, 54,203, 86,231, 57,115,230,156, 67,
+149,255,149, 35,150,108,217,178,101,146,195, 20,227,102, 0,235,234, 35, 46, 47, 47,223,180, 96,193,130,191,159, 61,123, 54, 64,
+ 44, 22,131, 32, 8, 8, 4, 2,180,105,211,198,190,138,134,207,231,131,101, 89,188,247,222,123,202,226,226,226, 47,157,124, 54,
+115, 98, 99, 99, 7, 85, 86, 86,250, 78,159, 62,157, 18,139,197, 40, 42, 42,194,218,181,107,153,111,191,253, 86,173,215,235,103,
+ 52, 66, 8,111,255,247,191,255, 61, 68,167,211,181,154, 61,123,182, 64,163,209,192, 96, 48,224,253,247,223, 55,125,243,205, 55,
+185, 6,131,193,229,128,191,125,251,246,189,147,149,149, 53,160,162,162,162, 76, 42,149,214,180,246, 17, 50,153,172, 39,128,157,
+174,112, 70, 71, 71,223,205,206,206,238,179,116,233,210, 4,139,197,194,191,116,233,146,221, 25,126,253,250,245,241, 98,177,120,
+ 56, 92, 76,190, 74, 16,132, 85, 36, 18, 85,179, 96,213,252,204,227,241,254, 23, 44, 90,241,168, 10,153,241,164,161,154,200,186,
+113,227, 6,134, 14, 29, 10, 0, 72, 74, 74, 66,255,254,253,145,148,148,132, 1, 3, 6,184, 28, 75,203,134, 95,203,203,203,179,
+226,227,227, 59, 54,111,222, 28,231,207,159,191, 15,224, 87, 87, 11,201, 9, 45, 30,143,135,215, 94,123, 13, 35, 70,140, 64,139,
+ 22, 45,170,173, 54,228, 62,187, 34, 54,104,154, 70,167, 78,157, 96, 52,153, 32, 16, 8,236, 83,147, 60, 30, 15,129, 65, 65,184,
+115,231,142, 83, 22, 45,146, 36, 39,190,244,210, 75,100, 90, 90, 26, 38, 79,158,140, 93,187,118,213,121,238,212,169, 83,241,195,
+ 15, 63,224,165,151, 94, 34, 63,252,240,195,122,195, 59,112, 78,232,206, 92, 19,215, 79, 55,212,238,187,139,211, 81,139, 60,105,
+112, 8,237, 80, 27, 98,106,249, 46,174,154,208,114, 8, 18,134, 86,129,210,153, 35,218,240,112,240,204, 21,196, 30,204,222,206,
+176,236,254,253, 41,101, 71, 22,245, 7,204,123, 94, 71,151, 9, 59,171,166, 11, 1, 88,139,111,192,188,103, 42, 8,105, 0, 18,
+243,248,208, 24,204, 71,107,175,120,230, 93, 63,125,247,245,130, 62, 27, 7, 4,134, 6,121, 67,165, 49,216,197, 86, 74,252, 94,
+ 0,192, 43,115,150,129, 71, 85, 77, 41, 42,228, 98, 72, 4, 4, 98, 0,180, 0, 0, 9,149, 73, 68, 65, 84, 20,246,237,248, 82,
+105, 54, 87,214, 90,187,180,124,242,205, 15,251,181,241, 22,202, 44, 40, 15, 97, 17, 21,248, 71,166, 28,162,213,222,135, 5, 87,
+ 55, 95, 4,220, 40,195,235,207,200, 21, 95,166,169,223,132,197,186,225,161, 14, 81,173, 54,168,175, 93,147,140,222,186, 21,151,
+166, 77, 67, 51,134, 65, 66, 88, 24,252,248,124,120,139, 68, 32, 9, 2,134, 35, 71,112,110,255,126, 4,139, 68,128,151, 23,232,
+207, 62,131, 49, 35, 3, 22,173,214,208,136,145, 25, 38, 77,154,164, 84, 42,149, 19, 76, 38,211,217, 71,173, 8, 6,131,225,120,
+ 78, 78,206,155,125,251,246,221,104,177, 88,222, 50, 24, 12,199, 31,133,207,100, 50, 29, 47, 44, 44,124,117,210,164, 73,123, 15,
+ 28, 56, 16,224,227,227,211,104,174,210,210,210, 30,110,170,239, 86, 0, 31,217,156,219,223,140,137,137,241,185,124,249,242,223,
+183,109,219,182,209, 97, 52, 17, 52,107,214,172, 55,106,136,172, 6, 87, 29, 2,200, 46, 46, 46,254,236,221,119,223, 93,182,102,
+205, 26, 57,231,248,254,251,239,191,131,166,105,240,249,124, 48, 12,131, 89,179,102,233, 74, 75, 75, 87,163,238,136,206, 15, 85,
+173,242,242,242, 54, 75,151, 46,221,182,110,221,186, 17, 20, 69,201, 24,134,209, 87, 84, 84, 36, 84, 86, 86,206, 64,227,226,104,
+ 89, 75, 74, 74,166,127,252,241,199,211,215,174, 93,251, 18, 73,146, 65, 52, 77, 43,181, 90,237, 97,131,193,240, 13, 26, 49,149,
+116,254,252,249,146,215, 95,127,253, 94, 73, 73, 73,135,240,240,112,141, 92, 46, 55,153, 76, 38, 74, 34,145, 40,100, 50, 89, 52,
+128,243, 4, 65,164,187,194,153,146,146, 82, 56,123,246,236, 7, 70,163,177,253,230,205,155, 19, 21, 10,197,105,130, 32, 8,129,
+ 64,224, 43,145, 72,134, 2, 72, 32, 8,226,182, 43,156, 36, 73, 90, 29,173, 87, 53,253,179,132, 66,225,255,138,143,214,147, 8,
+123,120, 7,165, 82,137,180,180, 52, 78,100, 69, 3,192,128, 1, 3, 82, 56,177,149,156,156,140,238,221,187,167, 0,224,187, 90,
+ 95,203,203,203,223,157, 50,101,202,113,219,224,248,221, 70, 12,252,236, 66,139, 19, 84, 45, 90,180,176,239, 59,110, 14, 62, 90,
+ 78,129, 97, 24, 8, 4, 2,240,120, 60,132,134,133,217,127,139,101, 89,220,185,115, 7, 42,149,202, 41,161, 69, 81, 20, 69, 16,
+ 4, 38, 79,118,110, 65,242,223,254,246, 55, 36, 36, 36,128,114, 82, 21, 82, 20,133,200,200,200, 6,207,225,116,169,179,156,225,
+225,225,141,230,116,212, 34, 79,146,192,170,237,115,109,162,170,174, 23,226, 33,220, 45, 54, 44,157,250,127,191,125,152, 94, 88,
+185, 63,163,168, 98, 1, 0,118,207, 13,233, 47, 93, 2,169,145, 35,219,229,194, 24, 55, 0,132,162, 42,120, 27,171, 43, 0, 33,
+ 11, 70,174,181, 25,150, 28,186, 89, 72,131,168,203,255, 37, 95,167,211,124,180, 99,235,250, 53,179,230,190, 39,191,113,183, 8,
+ 26,157, 17, 20, 69, 58, 54,158,224,241, 40, 40,100, 98, 52, 15,241,198,238,255,252,159, 86, 91,174,254, 24,117,228, 61,108,225,
+ 37,152, 51,188,231, 51, 34, 65,168, 30,237, 59, 79, 2, 37,254, 67, 4,176,133,117,204, 14,246,255, 5,207,103,235,197, 63,101,
+235,231, 92, 45, 51, 61, 44,180, 76,166,145,139, 71,141, 58, 17,251,243,207,210, 94,219,183,227,238,172, 89, 8, 51, 24, 32,178,
+ 77, 37,146, 4, 1,185, 64, 0,185, 64, 80, 37,178,214,174,133,129,166,177,110,218,180, 10,163,201, 52,202,149,151,188,180,180,
+ 20,227,199,143, 47,201,207,207, 31,131, 70, 76,237,213, 5,189, 94,191, 15,192, 62,119,241, 25,141,198,179,185,185,185,207,143,
+ 31, 63,254,231,227,199,143, 7, 62, 33, 65,230, 56,177,101,190,124,249,242, 27,137,137,137,119, 81, 61,177,168, 58, 49, 49,241,
+238,236,217,179,137,109,219,182,125, 3,224,223,112, 50,128,167, 94,175, 95,127,242,228, 73, 12, 26, 52,232,223, 43, 86,172,240,
+239,209,163, 7,130,130,130,160,213,106,145,156,156,140,249,243,231,171,202,203,203, 87,168,213,234, 53, 46,150,217,108, 52, 26,
+167, 58, 46,165,118,199,125, 48, 26,141,223, 22, 20, 20,124,235, 46,194,121,243,230,253,126,231,206,157,210,192,192,192,222, 2,
+129,160, 51,170,252,128, 10, 1,124,227,170, 32,226, 48,119,238,220,107,119,238,220, 81, 54,107,214,172,143,141,211, 7, 85,105,
+140,182, 54,130, 51,255,202,149, 43,225, 61,123,246, 36,249,124, 62, 75, 81, 20,248,124, 62,203,227,241, 88,155, 95, 13, 11, 0,
+135, 15, 31, 22, 1, 80,193,131, 63, 27,246,240, 14, 5, 5, 5,142, 34,139,179, 90, 69, 15, 24, 48, 32,197, 38,178,184, 99,141,
+241, 47, 59,101,181, 90, 31, 41, 95, 47,203,178,136,141,141,197,150, 45, 91,208, 80, 68,115,219,234, 62,162, 33, 62,206,162,197,
+ 48, 12,204,102, 51,110,220,184, 97,143,217,197, 77, 23,114,161, 29,104,154,174,119,181, 58,195, 48,140,201,100,194,127,255,251,
+ 95,167,196,214,247,223,127,143,202,202, 74, 48, 13, 40, 56,199, 80, 12, 93,187,118,133, 74,165,178, 47,246,137,142,254, 35, 84,
+158,217,108,118, 73,184,114,156,237,219,183,135, 82,169, 4,231, 47,220,124,218, 31,198, 30, 90,255,151,141, 31, 92,167, 69,203,
+233, 30,179,139,183,183,183, 81,104, 57,240, 98,148,104,200,196,104,111,180, 10,241, 2, 95, 32, 70,126, 57,141, 83,233,229,216,
+ 26, 95,152, 99,176, 48,227,110,149, 84,164,214,199, 35,146, 42,142,247,232, 55,162,255,180, 55,230,203,116, 70, 6, 15, 30,100,
+161,164,184, 0, 36, 65, 34,180, 89, 56, 34, 34, 34, 33, 17,146,216, 21,183, 70,159,114,238,244,111, 58,109,217,232,186,184,198,
+122, 11,206,173,125,181,127,159,214,173,189, 8,208, 22,128,177, 0,180, 5,176,218,254,114,223, 89,171,215,185,180, 52, 53,251,
+225, 85,213,133,163, 26,115,173, 57,171, 38, 0,253,125,252,252, 78, 44, 57,124, 88,106, 53,155, 81,250,238,187,144,210, 52,196,
+182, 81, 73,213,133,136, 64,127,246, 89,149,200,154, 58,181, 66,163, 86,187,148,130, 39, 32, 32,224, 10, 65, 16, 1, 37, 37, 37,
+ 79, 85,100,248,192,192,192,163, 44,203, 42,149, 74,101,143, 39,168, 92, 65, 0,212, 0,204,181, 12, 36, 2,225,186,255, 15,135,
+200,192,192,192, 15, 73,146,236,203,178,172, 63, 73,146,101, 86,171,245,124,113,113,241, 74, 0,119, 60,253,233, 99, 3, 23, 25,
+190,101, 3,231, 21, 3,248, 39,170,156,130, 31,120,110,219,159, 14,183,167,224,113, 39,252,252,252, 46,158, 56,113,162, 71,171,
+ 86,173, 72, 71,135,119, 46, 86, 30, 55,189,197,227, 85,105,185,179,103,207,210,147, 39, 79, 62, 95, 84, 84, 52,168, 46, 78, 47,
+ 47,175, 95,174, 95,191,254,156, 70,163,121, 72, 80, 57, 70,138,231,246,245,122, 61,230,206,157,123,178,174, 20, 60,222,222,222,
+107,215,172, 89,243,206, 43,175,188, 66,114,225, 40, 28, 55, 46, 93, 16,183,153,205,102,236,220,185,211,250,229,151, 95,126,165,
+209,104,234,156, 58, 12, 13, 13,205,201,207,207, 15,231, 66, 45, 56, 19, 84, 52, 50, 50,178, 32, 43, 43, 43,236,207,228,124,138,
+ 5, 87, 53,235,150,171,166, 9,162,125,144,108, 18, 11, 76, 36, 97,237, 68, 18,132,144,102,145, 9, 22,191, 72,121, 21, 27, 83,
+ 10,224,212,212, 25, 95, 34,153,231, 37,247,253,228,149, 41,111,251, 71,182,110, 75, 4,135, 54, 3, 1, 18, 69,133,121,200,186,
+119,139, 61,240,221,215,165,250,114,213,167, 6,131,254,235,250,120,158, 5, 90,183, 84, 8,246, 8, 25,180, 3, 39,128,106,228,
+167,122,104,196, 1,192,204, 39,111, 62,208, 90, 38,165,215, 51,237,195,137,173,143, 14, 28,144, 10,219,181,123, 40, 80,156,213,
+106,133, 49, 35, 3,235,166, 77,115, 89,100,121,224,129, 7,110, 65, 43, 52, 28, 35,203,130,170,248, 92,180,231,118, 61, 22, 60,
+177, 73,165, 1,200,252,252,252, 78, 83, 20, 21,193, 89,100, 28,173,245,181, 36,148,126, 80, 84, 84, 52, 28, 64,125, 43,132, 91,
+123,121,121,125,205, 48, 76, 47,103,146, 74, 83, 20,117, 73,171,213,206, 67, 61, 73,165,155, 98,213,161,191,191,255,157,172,172,
+172,214,220, 42,106,199,190,178,182,149,229,183,111,223,198,224,193,131,179, 10, 11, 11, 35,255, 76,206, 39, 21,117,172, 58,124,
+116,139, 86, 19, 32, 76, 32,146, 79, 23, 74,196,195,172, 22,186, 61, 8,128,199,231,223, 52, 85, 26,206, 24, 13,186, 29,168, 99,
+186,240,207,196, 4,160,191, 72, 40,252, 69,160, 80, 72,106, 19,109, 22,173,214, 96, 52,153, 70,122, 68,150, 7, 30,120,224,129,
+ 7, 79, 17,218,249,249,249,157,224,243,249, 34, 71, 49, 89,243, 51, 7,154,166, 43, 75, 74, 74, 70, 3,200,252,147, 57,255, 55,
+225,162,147,218, 8,103, 57,109,219,224, 39,157,179, 9,175,157,117, 35,231, 96, 27,231,146,167,164,156,131,159, 84, 78,238,122,
+ 93,224, 29,225, 74, 61,114,215,253,116, 40, 39,235,238,114, 54, 21,167,187,222,163, 90,202,201, 54,193,115, 95,242,148,148,115,
+240,147,198, 89,179,254, 56,201,235, 18,167,147,117,202,213,114,178,238, 46,103, 83,113, 62,234,123, 84, 79, 57,217, 71,173, 75,
+117, 60,251, 37,120, 10,145,214, 13,108, 90, 55,176, 55,186,215, 26,183, 49,166,174,255,115,201,145,176,169, 86, 2,112, 97,247,
+109,252,196,147,202,233,120, 31,220,153, 42,160, 9,210, 14,196,187,155,179,198,253,116, 23,150,216, 86,152, 36,192,137,128,163,
+174, 92,187, 59,158,123,141,107,117, 11,111, 35, 68,150, 75,156,238,170,247, 77,205,233,174,119,169, 38,167, 59,234,125,109,207,
+189, 9,159,145,187,202,233,150,119,169, 41,234,124, 45,245,231,145,121,107,114,186,227, 93,170,201,233,142,122,255,103,112,186,
+227, 93,170,141,211, 29,245,190,174,103,255,180, 26,154,184,233, 66, 91,136, 7,194, 9,177, 21, 7, 0,100, 99,110, 90, 19, 90,
+202,134,184,155,211,221,101,110, 10,177,233,130, 5,230,177,115,186,249, 25, 45,177,113,186,115,116, 51,196, 93,207,168, 41,234,
+187, 35,167,187,248,107,242,184,227, 57,213,198,249,168,229,173,163,156,110,191,246, 71,173,247,127, 22,167,155,159,145, 91,222,
+165, 26,156, 67,220, 60, 24, 24,226,176,191,196,157,156,238,122,151,106, 41,231, 35, 63,167,218, 56, 31,181,188,117,148,211,237,
+215,238,142, 62,164,169,120, 31,167, 69,139, 37,235,172, 19,113, 53,182, 63, 69,104, 60,182, 41, 57, 23,185,255, 82,156, 46, 78,
+207,140,104,130,103,255, 88,203,233, 78,206,154,101,116,231,116, 79, 83,150,211,157,156, 46,148,245, 47,199,249,180, 61,247, 39,
+241,126,214,197,247, 40,211, 82,117, 89, 71,155,162,156,238,228,116,146,251, 47,193,249, 8,207,254, 47, 7,222,147, 82, 16,238,
+198,187,121,100, 2, 55, 91, 96,154,236,186,221, 92,206, 33, 77, 97, 33,108, 2,184,189,156,182,145,242, 39, 77,112,237, 79,203,
+ 61,245,188, 75,158,119,233,137,123,151,106,212,201, 33,110,180, 20,185,213,242, 92,147,211, 29,191,225,200,225,174, 58,218,212,
+215,238,206,119,169, 41,158,253,211,134,255, 15, 96,195, 45,132, 53, 49,191, 76, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/datafiles/prvicons.c b/source/blender/editors/datafiles/prvicons.c
index 5d6b63c1d80..4254fe5a08e 100644
--- a/source/blender/editors/datafiles/prvicons.c
+++ b/source/blender/editors/datafiles/prvicons.c
@@ -1,477 +1,390 @@
/* DataToC output of file <prvicons> */
-int datatoc_prvicons_size= 15052;
+int datatoc_prvicons_size= 12311;
char datatoc_prvicons[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13,
- 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0, 4,115, 66, 73, 84, 8, 8, 8,
- 8,124, 8,100,136, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 25,116, 69,
- 88,116, 83,111,102,116,119, 97,114,101, 0,119,119,119, 46,105,110,107,115, 99, 97,112,101, 46,111,114,103,155,238, 60, 26, 0,
- 0, 32, 0, 73, 68, 65, 84,120,156,237,125,121,156, 20,197,221,254, 83,125,205,204,206,206, 30,236,194, 94,200,130,200,181, 34,
- 32, 40, 1,228, 88, 48, 70, 64,209,168, 81,140, 33, 26, 77, 66, 98,242,198, 55,106,162,198, 11,242,198, 68, 5,209,188,106,140,
- 49, 94, 16,125,127, 49, 30,241, 74,226,145, 40,162, 34,114, 9,114, 45,187,171, 92,123,176,176,247, 28, 59, 71,119,215,239,143,
-217,158,237,233,233,158,233,185,150,197,237,103, 63,179, 51,221, 93, 93,245, 84,245,243,173,250,214,209,221,132, 82, 10, 11, 22,
- 6, 43,152, 19, 77,192,130,133, 19, 9,203, 0, 44, 12,110, 80, 74, 35, 31, 0,203,149,143,178,109,240, 93,222, 27,110,154,230,
-252,114,245,249,234, 56,213,219,218,223,122,233,234,241,136,119,142,206,113, 35,142,186,113,197,137,191, 60, 1,199,242,120,101,
-160, 87, 38,154,253,137,226, 55,228, 19,111,127,162,242, 77,230,250,104, 63,218,178,141,163, 15,109,222,116,243, 26,175, 76, 12,
-174,109,204,183, 94,124,102, 62, 81, 45, 0,165,244, 9,245,119, 28, 92, 72, 41,125,130, 82,186,205, 96,255, 19, 0, 64, 8, 89,
-174,108, 19, 66,150, 43,129,212,191,141,210, 85,199, 99,246, 28,147, 28,117,161,141, 95, 21,247,133, 70,156,180,199, 53,233, 62,
- 97,176, 29, 21, 78, 57, 95,155, 31,163, 50,209, 73,207,112,191,230,120, 76, 89,153,189, 62, 58, 72, 84,182, 23,234,149,157,118,
- 59, 81,153,196, 3, 33,164, 28, 64,115,130,248, 18, 34,161, 11,100, 80, 24,111, 18, 66,150,247,146, 72, 26,218, 2, 55,147,174,
-153,115,210,225,152, 10,167,222,237, 55,147,224, 20, 55, 62,147,225, 99,210, 75,151,135, 22,122, 6,161,124,122,119,197,148,173,
- 65,217, 24,114, 52,202,123, 18,101,114, 33,165,244,141, 20,206,139, 66, 66, 3,208,179, 42, 74,105,147, 89, 75, 77, 38, 94, 19,
-233,154,182,240, 84, 56, 38,203, 41,219,101, 96, 16, 62,233, 22, 32, 21,232,181,198,170,150, 36,166,108, 13,202,198,144,163, 81,
-222,147, 40,147, 55, 9, 33, 75, 82, 56, 47, 10, 92, 42, 39,169,107, 2, 29, 82,203, 21, 66,234,154, 36, 89,130,169,158,151, 12,
- 71,157, 99,122,113,196,212, 90, 9, 56,189,169, 9,167,221,206, 56,122,227, 87,220, 17,211,249, 75,245,250,152,141,223, 76, 28,
-137,210, 53, 10, 71, 41,109, 34,132, 92,152, 40, 92, 66, 30,212,154, 7,176, 48,136, 97, 13,131, 90, 24,212,176, 12,192,194,160,
-134,101, 0, 22, 6, 53, 44, 3, 72, 3,132,144,242, 84,135,223, 44, 12, 16,232,204,242, 37,154, 89, 77,102,182, 54,238, 57,113,
-102, 0, 19,206,226,170,247,233,165, 29,143, 71,170,233, 26,229,217, 12, 95,163,176,122,113,170, 57,105,243,169,141, 83,111, 59,
-206,185,134, 51,172, 38,174,101,170, 51,227, 70,231, 37,154, 65,143, 59, 99,159,169, 79, 50, 6,160,187, 95,239, 98,152, 61,199,
- 40,141, 68,225, 18, 8, 44, 33,143,116,210,213, 11,147,204,121,102,202, 49,153,112,102,242,145,236,117,137, 87,134,102,211, 72,
-182,172,147,201, 95, 38, 63,105,185, 64,169,204,214,154,156, 1,204,202, 76,179, 94,124, 25, 74, 55,153,243, 18,206,162, 26,193,
- 76,184, 84,103,139, 51,113, 45,227,165, 77, 77,142,207,167,122,205, 83, 69, 90, 6,160,151,169, 68, 25, 53, 58, 78,163,103, 30,
-179, 53,211,108, 52,139,154, 86,186,201,156,167, 23,214,172, 56,204,132, 51,226,145,136, 95, 38,174,101,188,180,147, 89,226, 96,
- 50, 92, 70,160, 59, 19,108, 48,171, 22, 51,163,105, 98,246, 45,149,115,226,206, 52,166, 56,211,252,102, 18,181,167,110,186, 41,
-158, 23, 51, 43,171, 23,214,160,140, 50, 58,139,171,153, 45, 54, 74,211,204,117, 73,106,102, 60, 78,126,227,149,149,118, 59, 42,
-108,111, 43,113,161,217,138, 35, 30,172,153, 96, 11, 39, 29,146,113,169, 18,198,101, 25,128,133,193, 12,107, 30,192,194,160,134,
-101, 0, 22, 6, 60, 8, 33, 89,115, 83,190, 18, 6, 96,205,200,126,181, 65, 41, 37,218,125,132,144,106, 66, 8, 85,125,170, 83,
-141, 92,119,210, 2,250, 51,140,166,238,201, 84,109,155,189,183, 51,238,236,168,222,121, 6,124,210,186, 87, 89,143,115,162, 60,
-105,227, 78,162,108,226,206,160, 38,251, 1, 80, 13,128, 2,168,238,221,166,170, 99, 84,249,214,134, 49,216,214,134,167,154,180,
-180,219,134,105, 39,147,190,122,159,118, 91,179,175, 90, 47, 13,117, 60,166,203, 77, 79,252,102,127,107,191, 19, 29, 79,244,173,
-151,150, 25,110,201,156,103, 54, 47,233,114, 55, 83,142,241,226, 73,250, 66,170, 68,166, 21,146,217,111,163,184,140,210, 50,155,
-118, 42, 60,140,210,208,132,175, 86, 11,223,136,111,188, 79,202, 46, 80,178,247,128, 38, 64,202,179,163,137,226, 73, 6, 26,206,
-111, 26,140,123,235,230, 41, 25,238,217,114,215,180,190, 50,165,148, 36,242,159,123,143,207, 87,111, 83,149,203, 97,214,255, 54,
- 74,155,106,220, 23,189,244,212,219, 70,113,107,227,233,197,251,148, 82, 66, 41, 93,111,134,163, 30, 82, 54, 0,154,220, 61,160,
- 17, 49,233,137,136,166, 49, 59,154, 40,158, 36,207,127,130, 82,218,164,196,165,254, 86,113, 50,138,219, 52,247, 84,242,102, 6,
-122, 34, 49, 16,142,246,248,251,128,190,208,204, 26,131,217,180,213,233,233,109,107, 17, 71,252, 0, 48, 63, 45,255, 31, 58, 51,
-193, 52,205,251, 68,245,206,161,225,251, 55,163,190,245,206, 69,242,247,223,234,114, 64,156, 89, 70,154,230,189,202, 58, 48, 53,
-203,172,199,147,234,204,252,102,114,146,199, 32,237,184, 53,174, 34,114, 69,116,154,237,249,102,106,108, 19,233,255, 90,239,152,
-186,197,210, 51, 60,213,190,249, 42,195, 80,243, 76,154,151, 53, 17,102,225,164, 68,111,173,175,110, 57,230,167,226, 10, 89, 6,
- 96, 97, 80,227, 43, 49, 15, 96,193, 66,170,176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168, 97, 25,128,133, 1,
-129, 61,211, 8,221, 51,141,208,221,103, 71,143,233, 43,251,247, 76,139,158,131,216,125, 54,169,214,134,215,134, 49,131,148,158,
- 13,106,193, 66,166,113,250,182,240, 24,127,175,136,137,222, 49, 53,136,140,247, 79,223, 70,137, 18, 62, 21,241, 3, 86, 11, 96,
-161,159,160, 8, 52,158, 80,247, 76, 35,148, 50,177,147, 89,122, 45, 3, 0,236,158, 70, 86, 42,191,245,140,196, 12,172, 22,192,
-194,128,192,158,105,132,234,137, 56, 94,203, 48,113, 27, 93,185,103, 26, 89,145, 78,186, 86, 11, 96,161, 95, 64, 25,204, 87,215,
-240,122, 45,129,218,215, 87,127,235,157,167,141, 47, 85, 88, 51,193, 22, 6, 53,172, 22,192,194,160,134,101, 0, 22, 6, 53, 44,
- 3,176, 48,168, 97, 25,128,133, 65, 13,203, 0, 44, 12,106, 88, 6, 96, 97, 80,195, 50, 0, 11,131, 26,150, 1, 88, 24,212,176,
- 12,192,194,160,134,101, 0, 22, 6, 53, 6,213, 98,184,233,211,167,151,202,178,252, 46,128,137,217, 74, 67, 16,132,150,141, 27,
- 55,150,102, 35,238, 49, 99,198,216, 10, 11, 11,103, 72,146,228,202, 70,252, 0,192,243,124, 96,211,166, 77,239,102, 43,254,129,
-134,164, 12,224,100, 22, 80, 47,247,247,215,172, 89, 35,204,155, 55, 15, 91,183,110, 69, 69, 69, 5,236,118, 59, 88,150, 5, 33,
- 4, 12,211,215, 32, 18, 66, 98,126,171,247,233,237,247,249,124,248,250,215,191, 94,146,105,238, 64, 88,252, 5, 5, 5, 51,239,
-187,239, 62,102,193,130, 5,216,190,125, 59, 42, 42, 42, 32, 8, 2, 56, 46,124, 25, 89,150, 53, 60, 63,222, 49, 0,224, 56, 14,
- 62,159, 15,213,213,213,182,140, 18, 31,224, 48,109, 0,122, 2, 42, 47, 47,143, 8,136, 97, 24, 16, 66,116,133,163,254, 29,111,
- 95,182, 4,164,112,127,224,129, 7,108,243,230,205, 27, 5, 0, 91,182,108,129,223,239, 71, 94, 94, 30,120,158,143,201,131,250,
- 99,180, 95,123,236,203, 47,191,204, 52,117, 0,125,226,191,255,254,251,153, 5, 11, 22,228, 0,192,230,205,155, 49,121,242,100,
-184, 92, 46,112, 28, 7,150,101,163, 68,174, 24, 5,208, 39,126,245, 62,245,126,229,251,192,129, 3, 89,225, 63,144, 97,202, 0,
-244, 4,180,105,211, 38, 76,154, 52, 9,121,121,121,224, 56, 14, 28,199, 69,137,193,232,119,188, 99,217, 16,144,194,125,245,234,
-213,182,234,234,234, 81,202,126,134, 97, 32,203,114,148, 17, 38, 35,124,163,227,153,134,158,248,129,176,104, 37, 73,130,122, 91,
- 65, 42,226, 31,172, 72,104, 0, 70, 2,226, 56, 14,178, 44, 3,136, 21, 79, 42,226,207,134,128, 20,238,171, 86,173,178,207,159,
- 63,127,100, 84,198, 57, 46,101,241, 27, 29,203, 52,140,196,175,240, 87,144, 9,241,107,195, 12, 22,196,205,117, 60, 1, 41,133,
-151, 41,241, 43,219,153,130,154,251,130, 5, 11, 70,106,143, 43,126, 63,165, 52, 35,226,207,180, 17,196, 19,191,194, 95, 11, 75,
-252,201,195,112, 24,212,140,128, 24,134,137, 18, 80,186,226,207,148,128, 18,113, 87,248,171,211, 76, 87,252, 12,195, 68,117,162,
-211, 65, 34,241, 43,252,141,220,151, 84,197, 63, 24,221, 33, 93,211, 55, 35, 32,197,133, 80, 4,148, 9,241,103, 66, 64,106,151,
- 77,219,106,169, 97,179,245, 13,118,100, 66,252,153, 50, 96, 51,226, 7,140,107,109, 75,252,201, 33,166, 20,205, 10, 72, 16, 4,
- 0,136, 18,110,186,226, 79, 87, 64,234,206,186,186,191, 2, 0,129, 64, 0, 7, 15, 30,196,225,195,135,209,214,214, 6,135,195,
-145,208,157, 49,227,242,104,143,167,131,120,226, 15, 4, 2, 56,112,224, 0, 14, 31, 62,140,142,142, 14,228,228,228,196,136,217,
- 18,127,242,136, 42, 41, 51, 2, 58,116,232, 80, 68, 64,106, 55, 98, 32,248,255,178, 44,191,251,224,131, 15, 10,115,231,206, 29,
- 37,203, 50, 26, 27, 27,177,119,239, 94,212,214,214,162,181,181, 21, 46,151, 11,133,133,133, 40, 44, 44,140, 12, 31, 42,174,203,
-137, 22, 63, 0, 20, 22, 22,206,120,224,129, 7,152,185,115,231,230, 72,146,132,198,198, 70,212,212,212,160,174,174, 46,138,127,
- 65, 65, 65,132,191, 90,248, 64,122,226, 31,140,134, 16, 85, 90, 70, 2,218,191,127, 63,142, 31, 63,174, 43,160, 76,250,255, 25,
-112,129, 38, 86, 85, 85,225,177,199, 30, 67,109,109, 45, 56,142, 67, 73, 73, 9,138,138,138, 80, 94, 94, 14,158,231,193,243, 60,
- 4, 65,128,221,110, 7,207,243, 81,121, 72,197,229,209,126,210,129, 36, 73,174,170,170, 42,252,225, 15,127, 64, 93, 93, 29, 88,
-150, 69,105,105, 41,138,139,139, 49,105,210,164,136,216,109, 54, 27,108, 54, 91, 84, 63,128,101, 89, 75,252, 41, 64,235, 2, 77,
-156, 48, 97, 2, 30,125,244,209,168, 11, 48,100,200, 16, 76,158, 60, 25, 28,199,129,231,121,216,108, 54,216,237,246,132,227,255,
-253,237, 2, 1,128,219,237,134,211,233, 68,117,117, 53, 10, 10, 10, 0,244, 77,180, 41,105, 8,130, 16,201, 7,195, 48, 49,147,
- 96,233,244, 5,210, 69,119,119, 55, 92, 46, 23,230,205,155,135,194,194, 66, 0,177,162,213, 26,129, 94,127,192, 18,191, 57,196,
-148,156, 34,160,121,243,230, 33, 63, 63, 63,170,102, 83,220, 5,165, 22, 85,215, 66,122,174, 68, 42,134,145, 46,156, 78, 39,166,
- 76,153, 2, 73,146,148, 55, 10, 70,226, 85,210, 82, 12, 89,201,139,194, 61,149,137,175, 76, 27,176,211,233,196,228,201,147,163,
- 38,185, 20,168, 69,173, 22,191,214, 8, 82, 17,191, 82,153, 13, 54,196,228, 88,239, 2,104,107, 80, 69, 64, 44,203, 70, 4,148,
-169,254, 64,218, 25,226, 56, 8,130, 16, 51,203, 11,244, 93,108, 69,236,138,225,198, 91, 6,145,108, 95, 32, 93, 40, 21,139, 40,
-138, 9, 93,154, 76,138,127,176, 34, 38,231,106, 1,169, 71,119,212, 23,122,229,159,254,131,173,123, 26, 33,245,206, 4, 39,139,
- 93,175,222,105, 40,172,116,161, 94, 23,163,204, 81,196, 91,162,145,168,230,239,239,142,176,222,186, 30, 61, 49,235,137,215, 18,
-127,242,208, 53, 0,165, 86, 49, 18,208,189, 55, 44, 70,107,167, 15,247, 61,253, 30,182,239,107,140,156,251,238, 19,215, 35, 47,
-215, 17, 21,182,189,203,135,250,195,199,241,228,203,159, 96,219,222,195, 0,226, 15,151,166, 11,181, 47,158,138,128,211, 57,150,
- 41,104,125,114,189,213,158,153,232,240, 14,118,241, 3, 58, 51,193,132,144,136, 75,160,184, 58,138,127,168, 30,118, 43, 45,206,
-195,143, 46,159, 21,117, 46,167,114,131, 20,129, 20, 23,230, 98,230,148, 83,241,212, 61,203, 48,103,218,105,225, 68,179, 56, 19,
-156,140,128, 51, 41,254, 76, 27,129,130,254, 18,127,188,153,229,175, 50,116, 13,192,172,239, 62,178,124, 72,116,100, 44, 99,120,
- 30,203, 48,184,254,202,185, 9,211,200, 4,210,173,217, 79,228, 40, 80, 60,119, 71,189, 79,217,159, 41,241, 15, 86,232,182,129,
-137, 46,188,242,219,229,180, 71,157,199, 38, 24, 9,154, 50,254, 20,124,109,210,168,126, 17,191,153,124,100,234, 88,166,196,175,
- 32,153,149,158,201,134,177,196, 31,141, 24, 3,208, 19,144,217, 81, 27, 51, 35, 65,107,239,253, 94,214,196,175,206,131,154,191,
- 89, 1, 15, 4,241,171, 97,137, 63,251, 48,108, 1,128,248,190,186,222,133,103,152,248,226,207,102,205,175,199, 63,219,226,207,
- 84,199, 93, 11,163, 78,176,246,152, 37,254,244, 97,216, 7, 72,228,255,235, 93,124,197, 5, 82,135,189,121,213,203,253, 46,254,
-100, 4, 60,208,196,175,133, 37,254,236, 66,183, 5, 72,217, 5,226,162, 93,160, 64, 72,194,134,173,117,134, 98,202, 22,140, 90,
-176, 76,186, 60,150,248,191, 26,208,237, 3,168, 93,136, 68,174,140, 26,108,239,113, 81,146,113,172,205,141, 63,189,248, 17,122,
- 2,161,126, 23,127,188, 78,240,201, 32,254,120,162,181,196,159, 89,152,238, 3,152,153,184,154,116,201,111,117, 19,233, 47,241,
-107,249,103, 82,252,153,156,171,136, 7,173, 72, 45,241,103, 23,134, 45, 64, 60, 97, 24,137, 97,247,107,119,129, 97, 24,136,146,
-140,150,214,110, 60,254,183, 15,241,242, 59,219, 7,132,248, 51,213, 17,238, 79, 88,226,207, 62,116,199,239,146, 89,200,166,119,
-158,192,115,168,172, 40,198,138,159, 46,129,195,198,247,187,120,146, 21,183, 37,254,193, 11,221, 22, 64,249, 78, 36,126,173, 40,
-180,199,114,236, 2,230,127,109,124,191,139, 39,211, 46,143, 37,254,175, 46, 12,251, 0,102,196,175,103, 0,218,243, 30,189,235,
-170,126,201,136,154, 67, 38, 93,158,254, 22,191, 26,102,132,109,137, 63, 61, 36,116,129,226,137, 95, 43,142,254, 28,237,137, 7,
- 75,252,150,248,205, 34, 97, 39, 56,153, 97,208,129, 32,254, 84,133,111,137,127,112, 34,238, 98,184,100,135, 65, 7,130,120,180,
- 60, 82,237, 11,156,104, 88,226,239, 31,152, 90, 10, 97, 36,126,143, 47, 16,117,174,199, 23, 24, 16,226, 57,153,197,175,119,111,
-174,122,201,179, 37,254,204, 34,169, 97, 80,237,144,225,129,198,182,168,243,234, 15, 31,239, 23,210,241,112, 50,139, 95, 15,137,
-214,251,107,143, 89, 72, 14,166,111,136,209,138,165,177,165, 19, 15, 62, 27,253, 34,145,251,159,252, 23,234, 15, 31,235, 55,242,
- 70,208, 51, 86, 75,252, 22,244, 96,106, 24, 84, 43,150,111,255,226, 73,124,182,239, 72,204,121, 91,118, 29,196, 55,190,255, 16,
-198,159, 90,138,191,220,255,125, 20, 21,228,102, 61, 3,122, 72,101,236,127,160,193, 18,127,255,192,112, 53,104, 60,255,255,111,
- 15,253, 40,242,123,160, 33,149, 81,160,129,134,100,110,115,180,144, 30,210,186, 39,120,160,226,100, 22,191, 2, 75,252,253, 3,
- 93, 21, 91,226, 63,177,176,196,223,127, 48,188, 39,248,100, 20,191, 2, 51, 35, 64, 39, 3, 44,241,103, 31, 9,159, 10,113,178,
-137, 63, 24, 12,162,190,190, 62,102,189, 82,127,136,159,231,249,180,227, 16, 69, 17,117,117,117, 0,250,223, 0, 6,163,145,197,
- 24, 64, 40, 20, 66,125,125,125,148,224,251, 75,252,233, 10,200,102,179,181,204,153, 51, 39, 43,239,233, 77,134, 67,170,231, 58,
- 28,142,192,172, 89,179, 78,232,123,122, 29, 14, 71, 32,113,168,175, 14,136,242, 4,101, 0, 56,231,156,115,142, 6, 2,129, 19,
- 46,160,143, 63,254, 56, 43,111, 90,183, 96, 65,139, 40, 3,176, 96, 97,176, 97,224, 59,245, 22, 44,100, 17,150, 1, 88, 24,212,
-176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168,145,212, 43, 66,122,223, 35,252, 46,128,137, 89,226, 3, 65, 16,
- 90, 54,110,220,152,149, 97, 80,139,127, 98, 12, 54,254,166, 13, 64,121,137,246,154, 53,107,132,121,243,230, 97,219,182,109,168,
-168,168,128,205,102,139,122,215, 46,128,152,111, 51,191, 9, 33,232,233,233,193,130, 5, 11,178, 50, 15,161,240,239,125, 15,242,
- 73,203, 95, 41,255,173, 91,183,162,188,188, 60,242,182, 72,189, 39,117,104,103,189, 19,229,203,237,118, 99,209,162, 69,131,170,
-252, 77, 25,128,250, 13,242,243,230,205, 27, 5, 0, 91,182,108, 65, 32, 16, 64, 94, 94, 94,212,139,221,146, 93,138,172, 62,246,
-197, 23, 95, 36,195,221, 52,212,252,231,206,157,123, 82,243, 87,202,255,147, 79, 62,193,196,137, 19, 77,243, 55,147,143, 3, 7,
- 14,100,157,255, 64, 43,255,132, 6,160, 38, 95, 93, 93, 61, 74,217,207,178, 44,100,213, 91, 34, 83,185, 9,165, 63,238,202, 74,
-196, 95,153, 8, 28,232,252, 87,175, 94,109, 88,254,137, 4, 98, 70, 68, 39,170,252, 21,156,168,242,143,107, 0,170,194,183, 87,
- 87, 87,143, 84, 31, 83, 22, 78, 81, 74, 51, 70, 62,211, 23,192, 12,127, 32,115,133,159, 45,254,171, 86,173,178,207,159, 63, 63,
-134,191,146, 94, 38,132,159,141,167, 94,159, 12,250, 49, 28, 5, 82,147,215, 22,190,146,129, 84, 11,190, 63,150, 41,127, 85,248,
-175, 90,181,202,190, 96,193,130, 24,254,106,193,102, 74,252,131,177,252,117, 91,128, 68,228,149, 12, 24, 93,132,116,158,199,153,
- 9,124, 85,248, 27,137, 31, 8, 47,149, 78,100, 4,169,184, 69,153,228, 31,175,252, 95,127,253,117, 20, 22, 22, 70, 58,193,122,
-121, 81,126,107,191,149,223, 12,195,224,214, 91,111, 77,171,252, 99, 12, 64,227,179,233,146, 7, 0, 65, 16, 98,246,165, 42,158,
- 76, 54,191, 95, 21,254,171, 87,175,182, 25,137, 7, 0,108,182,190, 85,211,201, 26,113,188,227,153,226,159,168,252,151, 46, 93,
-138, 83, 78, 57, 5,121,121,121, 16, 4, 1, 60,207,199,140,102,245, 71,249, 71, 25,128, 81,135, 5, 0, 2,129, 0, 14, 30, 60,
-136,195,135, 15,163,189,189, 29, 57, 57, 57,113,239, 28, 75,150,124, 38, 46, 64, 42,252, 91, 90, 90, 34, 15,163,170,172,172, 76,
-200,191,190,190, 30, 64,216,119,157, 48, 97, 66,191,241,247,251,253, 56,120,240, 32, 14, 30, 60,136,214,214, 86, 56, 28,142,148,
- 90,169, 68,199,179,197,223,227,241, 96,199,142, 29,216,190,125, 59,246,236,217, 3,183,219, 13,167,211, 9, 65, 16, 34,163, 64,
-102,107,126,117, 11,240,171, 95,253, 42, 45,254, 81, 6, 32,203,242,187,189,227,180,163,100, 89, 70, 99, 99, 35,246,237,219,135,
-253,251,247,163,173,173, 13, 46,151, 11, 67,134, 12, 65, 97, 97, 33, 92, 46, 87,100,252, 54,149,103,240, 24,237, 79, 7,169,240,
-223,182,109, 27, 46,187,236, 50,188,241,198, 27, 16, 4, 33,174,112, 8, 33,216,184,113, 35,174,189,246, 90, 60,243,204, 51, 56,
-253,244,211, 51,206,191,119,156,127,148, 44,203,104,104,104,192,222,189,123,177,127,255,126, 28, 59,118,204,176,252, 7,130,248,
-147, 41,255, 69,139, 22,161,160,160, 0, 46,151, 11, 57, 57, 57,176,217,108,145, 22,160,191,245,163,117,129, 38, 86, 85, 85,225,
-177,199, 30, 67, 93, 93, 29, 88,150, 69, 73, 73, 9,138,139,139, 81, 81, 81, 1, 65, 16,192,178, 44,108, 54, 27,236,118,123,164,
-230, 76,165,179,146,165, 38, 56,105,254,219,183,111,199,103,159,125, 6, 66, 8, 74, 74, 74,162,120,168,239,136, 83,190, 63,249,
-228, 19,108,220,184, 17, 0,240,195, 31,254, 48, 43,252, 31,125,244, 81,212,214,214,130,101, 89, 12, 27, 54, 12, 69, 69, 69,152,
- 52,105, 18,120,158, 7,199,113, 17,254,202,118, 38,196,159,237,242,255,248,227,143, 35, 2,231, 56, 14, 60,207, 71, 68,175,180,
- 0, 64,252, 26, 95,123,140, 16,130,219,111,191, 61,163, 6, 0,143,199, 3,151,203,133,234,234,106, 20, 20, 20,196, 36,200, 48,
- 76,132,188, 50, 11,169,231,187,165,218, 34,164,139,100,249,111,221,186, 53, 50, 23,176,105,211, 38, 0, 97,247, 70,249,104,183,
-213,251,178,193,223,237,118,195,225,112, 96,206,156, 57,200,207,207,143, 49, 72,165,188, 5, 65,136, 24,180,153, 73, 48, 51,198,
-145,205,242,255,233, 79,127, 26, 83,254,118,187,221,208,255,239, 47,253,196, 24, 64, 78, 78, 14, 38, 79,158, 12, 73,146, 34, 23,
- 89,129,146,176, 98,193, 44,203,130,231,249, 24, 23,232, 68,118, 36,147,229, 95, 95, 95,143,134,134, 6, 12, 31, 62,220,116, 26,
- 30,143, 7,185,185,185, 89,227, 63,105,210,164,168, 73, 58,109,139,148,168,252, 83, 17,127,134, 90, 0,195,242,127,226,137, 39,
-162,106,112,181, 49,107,107,251, 68, 53,191,250,247, 29,119,220,145, 86,249,199, 24,128, 98,157,138,107,163, 71, 64,177, 86,245,
-183,182, 48, 37, 89, 66,243,177, 6, 52, 30, 61,130,150,214,163,104,235,108, 69, 87,119, 7,124, 61, 94,252,230, 23,107,178, 34,
-158, 84,248, 3,136,136,127,229,202,149, 96, 24, 6,179,102,205, 66, 85, 85, 21,138,138,138,208,214,214,134,189,123,247, 98,227,
-198,141,144,101, 25, 43, 87,174, 68,110,110,110, 84,124,153,228,207,113, 28, 4, 65,128, 44,203, 81,252,245,202, 75,237,126,206,
-152, 49, 3, 71,143, 30, 5, 0,148,150,150, 98,203,150, 45, 9, 13, 67,207, 56,210,133, 81,249,255,252,231, 63, 79, 74, 63,253,
- 85,121,198, 24,128,226,147, 17, 66,116,155,121, 45, 89,183,183, 27,141, 71, 15,163,165,181, 25,173,157,199,209,217,213, 1,143,
-183, 27, 61, 1, 31,186, 61,221,232,118,119,161,203,221,137,110, 79, 23,186,221, 93,232,118,119,226,158, 95, 62,152,181, 11,144,
- 44,127, 53, 24,134,193,213, 87, 95,141,202,202,202,200,190,178,178, 50,148,149,149,225,180,211, 78,195,186,117,235,162,194,103,
-131,191,250,241,232, 70,110,150,242,173,124, 58, 59, 59, 81, 89, 89,137,125,251,246, 1, 0, 22, 45, 90,132,238,238,110, 20, 21,
- 21,245,171,248, 1,227,242,127,228,145, 71,162,202,220,168,118,191,229,150, 91,146,106,193,210,205, 67,140, 1,168,107, 70, 51,
- 68, 30,122,234,183, 81, 2,239,114,119,162,219,221, 5,143,207, 13, 89,150,225,114,230,225,212,202, 49,152, 50, 97, 26, 70,143,
- 28,139, 85,127,252,117,220,248,210, 69,178,252, 1,160,165,165, 5, 37, 37, 37,152, 53,107, 86,148,248,149,139, 8, 0,149,149,
-149,152, 53,107, 22, 0,160,167,167, 7, 14,135, 35, 43,252,181, 34, 81,127,100, 89,198, 77, 55,221,132,166,166, 38,252,230, 55,
-191,193,196,137, 19, 65, 8, 65,103,103, 39,102,206,156,137, 35, 71,142, 68, 90,131,206,206, 78, 20, 23, 23,131, 16,130,221,187,
-119,227,150, 91,110,193,136, 17, 35,240,248,227,143, 71,220, 38, 61, 65,165, 11,163,242,191,233,166,155, 50, 54, 82,152, 73,253,
-196,125, 81,182, 25, 34,127,123,243, 57, 48, 12,131,138,146, 83,112,106,229, 24, 76,159,114, 14, 70,143, 24,131,209, 35,199, 98,
-204,200,113, 24, 86, 92, 26, 21, 94, 49,128,108, 93,128,100,249, 3, 64, 73, 73,120, 5,109, 85, 85, 85, 76, 28,106, 40,199, 29,
- 14, 71, 76,252,153, 52, 0, 61,254,132, 16,220,124,243,205,152, 54,109, 26,254,231,127,254, 7,191,250,213,175, 80, 90, 90,138,
-101,203,150,225,175,127,253, 43,102,204,152, 1,143,199, 3,134, 97, 80, 85, 85,133,103,159,125, 22,203,150, 45,195,115,207, 61,
- 7, 73,146,176,110,221, 58,188,242,202, 43,184,254,250,235,241,244,211, 79, 27,138, 42, 19, 32, 36,188, 50, 51, 47, 47, 15,165,
-165,225,165,249,253, 33,254,140, 24,128,222, 5, 72,212,235,222,245, 78, 3,108,130,205, 52,193,108,139, 63, 89,254, 10,138,138,
-138, 34,191,181, 29,104,237,113,117,252,153,228,175,196,171, 23,127,115,115, 51, 46,190,248, 98,200,178,140, 39,159,124, 18,235,
-215,175,199,221,119,223,141,229,203,151,227,130, 11, 46,136, 12,231, 94,124,241,197,200,203,203,195,186,117,235,112,253,245,215,
-163,184,184, 24, 94,175, 23, 23, 93,116, 17, 94,127,253,117, 67, 81,101,210,128,135, 14, 29,138,138,138, 10, 4,131, 65,200,178,
-156, 49,129,103,186,242, 76,216, 2,152,233,120,152, 21,191, 81,211,158, 73,241,164,194,191,173,173, 45,210,225, 45, 43, 43, 51,
-140,183,173, 45,252, 70,156, 80, 40, 4,158,231,179,194, 95,207,128, 21,190,247,220,115, 15,110,187,237, 54, 60,245,212, 83,248,
-248,227,143, 49,121,242,100,188,246,218,107,104,106,106,194,230,205,155,225,247,251, 97,183,219,177,111,223, 62,156,126,250,233,
-152, 62,125, 58, 90, 90, 90, 80, 83, 83,131,113,227,198,225,206, 59,239,196,154, 53,107,116,203, 67,175, 66, 72, 39, 15,133,133,
-133, 81,226,255,253,239,127, 31, 85,169,104,243,169,253, 54,179,143, 97, 24,220,125,247,221,105,149,127, 92, 3, 48,211, 52,169,
-201,153, 21, 92, 54,197,159, 10,127,165,102,223,187,119,111,196, 0,212, 92,149,126,192,222,189,123, 1,244, 61,194, 49,219,252,
-181,124,171,170,170, 48,124,248,112,188,247,222,123, 56,243,204, 51,177,107,215, 46,236,221,187, 23, 53, 53, 53,120,251,237,183,
- 81, 95, 95, 15,150,101, 49,109,218, 52,124,247,187,223,197,184,113,227,224,245,122, 49,100,200, 16, 28, 57,114, 4, 46,151, 11,
- 83,166, 76, 73,120,125, 50,197, 95, 93,243,223,116,211, 77,105,213,238,217,154,193, 54,124, 58,180,242, 59, 17, 17,117,184, 84,
- 12, 38,211, 72,133,191,130,141, 27, 55,226,180,211, 78, 67,101,101, 37,180, 79,204, 59,116,232, 80,100, 6, 88,157, 86, 54, 16,
-207,128,175,188,242, 74,172, 92,185, 18,175,190,250, 42,246,238,221,139, 87, 95,125, 21, 27, 54,108,192, 93,119,221,133, 25, 51,
-102, 0, 0, 54,111,222,140, 95,252,226, 23,184,241,198, 27,113,209, 69, 23,129,231,121,220,113,199, 29,184,225,134, 27,250, 69,
-252,122,229,255,208, 67, 15, 69,141, 10,169,243,153,108,205,175,109, 1,210,129,169, 62, 64, 60,129, 43, 68,204, 90,180, 54,141,
- 76, 35, 21,254,202,133,145,101, 25,235,214,173,139, 59, 15,160, 14,159, 77,254,234, 15,165, 20, 93, 93, 93,232,232,232,192,243,
-207, 63,143,229,203,151,163,185,185, 25, 53, 53, 53,216,176, 97, 3, 54,108,216, 16, 53,107, 92, 89, 89,137,133, 11, 23, 98,246,
-236,217,152, 59,119, 46, 74, 74, 74,112,222,121,231, 97,221,186,117, 88,190,124, 57,138,139,139, 81, 88, 88,168, 59, 79,144, 41,
-254,218,188,220,124,243,205, 25,237,236,102,170,252,211, 30, 5,210,134, 51, 35,184,108,137, 39, 29,254, 64,120, 34, 44,153,248,
-179, 5,109, 13, 58,115,230, 76,140, 28, 57, 18, 51,102,204,192,236,217,179,177,120,241, 98,108,217,178, 5,239,190,251, 46,238,
-186,235,174, 40,241, 43,159,130,130, 2,172, 88,177, 2,207, 63,255, 60,238,188,243, 78, 44, 88,176, 0,205,205,205,120,232,161,
-135,240,217,103,159,161,173,173, 13, 7, 14, 28,200,138,168,244,202,255,193, 7, 31, 52, 60,174,221,103,230,152,242,157,241, 22,
- 64,143, 68, 42,157,218,108,142,244, 36, 66,178,252, 7, 18,244, 42,150,163, 71,143,162,166,166, 6, 13, 13, 13,240,120, 60,216,
-185,115,103,228, 61, 2, 51,102,204, 48, 44,251, 89,179,102,225,209, 71, 31,197,170, 85,171,208,216,216,136,203, 46,187, 12,130,
- 32,192,233,116, 98,216,176, 97, 89,187, 62,122,229,255,203, 95,254,114, 64,213,252, 10,226,186, 64,102, 8,170,207,233,111,242,
-122, 72,133,191, 50,177,101,118, 41, 68, 54, 93, 32, 37, 15,218,188, 40,219,138,219, 98,183,219,117, 39,156,180,253, 45,189, 69,
-114,218,178,202,180,248,245,202,255,129, 7, 30,208, 13,147, 74,205,175,142, 39, 43, 45,128,150,124, 60,129,171, 73, 39, 90,119,
-210,159, 72,134,191, 50,177,101,118, 41, 68,182,197,175, 45,215,210,210, 82, 44, 92,184, 16, 51,103,206, 68, 85, 85, 21, 46,190,
-248, 98,212,215,215, 99,250,244,233,216,188,121,115,228, 70, 30,109,158, 55,109,218,132, 37, 75,150,160,167,167, 7,185,185,185,
-120,246,217,103, 81, 91, 91,139, 93,187,118,161,162,162, 34,171,215, 70,203, 69,189,196, 33,149,190, 64,182,202, 60,225,107, 82,
- 19,145, 4,140,199,219,119,239,223,129,215,223,121, 9, 71, 91,143,162,161,233, 16, 10,242, 11,179,146,137,116,249, 43, 80, 47,
-133, 80,142,233, 45,133,200, 54,180, 6,176,117,235, 86,116,119,119,163,163,163, 3,107,215,174,133,205,102,195,172, 89,179,112,
-245,213, 87,227,191,255,251,191,177,112,225, 66, 20, 20, 20, 68,229,203,237,118, 99,229,202,149,248,244,211, 79, 17, 12, 6,241,
-218,107,175,161,179,179, 19, 43, 86,172, 64, 81, 81, 17,134, 12, 25,146, 85,241,239,222,189, 27, 46,151, 11,163, 71,143, 6, 0,
-172, 94,189, 58, 38,111,122,121,141, 23, 70,175,156,178, 54, 10,100,214, 66,149, 12,171,247, 73,178,132,255,251,251, 51,232,246,
-116,193,233,116,193,223,112, 0, 71,154, 14, 97,243,206, 79,178,222, 18,164,194, 95,153, 64, 82, 47,133, 80, 47, 69, 86,126, 43,
-199,179,237, 2,169,243,161,112, 30, 50,100, 8,138,138,138,240,157,239,124, 7,183,221,118, 27, 46,188,240, 66,140, 27, 55, 14,
-183,220,114, 11,102,207,158,141, 21, 43, 86, 68, 12,116,211,166, 77, 88,185,114, 37,254,252,231, 63, 35, 55, 55, 23, 62,159, 15,
-207, 62,251, 44,214,174, 93,139,177, 99,199,102,181, 86, 85,226, 45, 46, 46, 70,121,121, 57, 24,134, 1,165, 20,183,222,122,235,
-128,170,249, 21, 36,124, 73,158,154,224,222,186,207,241,214,250,215,209,210,214,130,134,166, 67,200,207,139,189,225,132, 16,130,
-255,125,234,126, 52, 30, 61,130,242,146, 10,116,117,119,162,179,187, 3,129, 96, 0, 84,150, 49,180, 40,251,111, 96, 74,166,128,
- 1,192,110,183, 3,208, 95,234,160,158, 15, 80,142,103,243,162, 36,226,189,110,221, 58,252,236,103, 63, 67, 71, 71, 7,218,219,
-219,177,100,201, 18,204,153, 51, 7,207, 63,255, 60,254,240,135, 63,128,101, 89, 44, 89,178, 4,159,126,250, 41,114,115,115,209,
-208,208, 0,167,211,137,101,203,150,225,201, 39,159,196,195, 15, 63,156,117, 97, 17, 66, 48,124,248,240,136,248, 25,134,193,170,
- 85,171, 98,102,130,213,249,213,238, 83,127,199, 75, 39,235, 45, 0,195, 48,144,100, 9, 47,255,243,255,224,243,123,145,151, 87,
-128, 35,205,135,209,120,244, 8,182,238,250, 84, 87, 84,127,127,235, 5,216, 4, 27, 14, 28,174,135,215,231,193,241,246, 99,232,
-114,119, 66,148, 68, 44, 93,242,221,180, 8, 39, 66, 50,226,215,142, 2,169,151, 66,104,197,175, 28,239, 15, 24,241,222,189,123,
- 55, 26, 26, 26,112,238,185,231, 98,255,254,253, 24, 62,124, 56,242,242,242,224,112, 56,112,251,237,183,227,222,123,239, 5, 33,
-225,103,100, 6, 2, 1,244,244,244,192,233,116,162,167,167, 7, 87, 92,113, 5, 46,189,244, 82,236,216,177, 3, 83,167, 78,205,
- 42,119, 69,184,234,135, 94,221,118,219,109,166,175, 77,127,142,206,197,109, 1, 20,130,143, 63,247,123,180,180, 54, 27,214,232,
- 90,242, 46,103, 30,246,214,237, 2,207,241, 16, 37, 17,161, 80, 16, 0,240,203, 31,223,141,155,127,116, 71,214, 51,101, 86,252,
-202,133, 82,214,246,168,151, 66, 40,241, 0,136, 89, 10,145,237,137, 48, 35,222,183,222,122, 43,158,126,250,105,184,221,110,140,
- 25, 51, 6,111,189,245, 22, 30,123,236, 49, 92,119,221,117, 88,188,120, 49, 26, 27, 27,193, 48, 12, 28, 14, 7, 94,127,253,117,
- 60,243,204, 51, 88,182,108, 25,174,184,226, 10,240, 60,143, 21, 43, 86,224,134, 27,110,192, 71, 31,125,148, 21,238,234, 60,104,
-243,113,255,253,247,155, 90, 11,148, 76,185,102,165, 5, 80, 34, 86,147,127,253,221,151, 96,183,217,117,107,244,203, 47,248, 78,
-140,229,254,233,254,231,176, 98,205, 47,209,208,116, 24, 78,103, 46, 10,243,135,224,198, 31,252, 10,103, 78, 60, 59, 45,178,102,
- 97, 86,252, 74, 97, 43,107,123,204, 46,133,200,182, 95,106,196,123,196,136, 17,120,245,213, 87,177,120,241, 98,252,232, 71, 63,
-194,232,209,163,241,200, 35,143, 96,221,186,117,104,107,107,195,210,165, 75, 65, 8,193, 51,207, 60,131,174,174, 46,172, 93,187,
- 22, 79, 62,249, 36, 46,185,228, 18,172, 92,185, 18,239,188,243, 78,212, 8, 87, 54,249,107,203, 95,253,248,146,129, 80,243, 43,
- 48,245,166,248,220, 28, 23,106,190,216, 19, 83,163,223,188,252, 78,220,180,252,246, 24,242,163, 78, 25,141,117,191,127,165,255,
-114,145,128,127,188,130, 87,195,236, 82,136,108,243, 55,250, 60,254,248,227,184,254,250,235,241,198, 27,111, 96,205,154, 53,145,
-133,109,203,151, 47,199,154, 53,107, 34,143,117,169,171,171,195,138, 21, 43, 48,118,236, 88, 60,252,240,195,216,177, 99, 7,110,
-184,225, 6, 84, 86, 86, 98,237,218,181, 89,231,175, 87,206,247,221,119, 95, 84, 24,237,119, 42,149, 74, 86, 91, 0,245,231,225,
-255,121, 10,191,125,228, 14, 52, 29,109,128,211,153,139,130,188, 66,252,252,251,183,225,204,137,103,159, 48,203,141, 7,179,226,
- 87,187, 56,132, 16,211, 75, 33,250, 99, 34, 76,143, 63,203,178,120,234,169,167, 98,142, 21, 23, 23, 99,199,142, 29,200,201,201,
- 1, 0,236,218,181, 43,234,118,200,169, 83,167,102,221,237, 73,196, 95,185,121,125,160,212,252, 10, 76, 13,131,158, 58,226, 52,
- 60,253,192,223, 6, 28,121, 61, 36, 35,126,109, 77,148, 76, 26,217, 68, 50,252, 9, 9, 15,145,182,183,183, 99,232,208,161, 0,
-128,138,138,138,172,142,243, 39,195, 93,225,255,187,223,253, 46, 42,140, 58,108, 50, 88,177, 98, 69, 70,249, 38,108, 1,146, 25,
- 69, 25, 40, 72,149,191,217,165, 16, 3,129,187, 54,140,222,194,182,254, 22,127,188, 60,220,121,231,157, 3, 82, 63,166, 70,129,
-140, 10,125,160, 34, 89,254,138, 75, 99,118, 41, 68,127,184, 64,201,136, 63, 94,235,118, 34,112, 50,233, 39,198, 4, 79, 38,242,
-122, 72,133,191,178,173, 93, 10,161, 14,167, 94, 10,145,237,252, 91,226, 55,135, 95,255,250,215, 16, 69, 49,173, 56,146, 90, 11,
- 52,208,197,175, 32, 85,254,102,151, 66,100, 19,233, 10,127, 32, 92,159,254,210, 79, 38,250, 3,134, 45,192,201, 42,254, 84,248,
- 43, 2, 55,187, 20, 66, 59, 71,144,105,156,204,226, 63,217,244, 19,211, 2,132, 66, 33,212,215,215, 71, 21,104,127,145, 87, 38,
-164,210, 65, 42,252,149, 99,218,167, 66, 40,190,190, 34,120,101, 41,132, 18,190,182,182, 54,227,252,125, 62, 31,190,248,226,139,
- 24, 81,199,187,187, 46, 83,226, 63, 81,229,159, 41,164,194,159,168,107,179,115,206, 57,231,104, 32, 16,200,254,106,181, 56,176,
-217,108, 45, 31,127,252,113, 74, 47,106, 62,217,249,207,154, 53,235,104, 48, 24, 60,105,249,159,140,229, 79,178,221,156, 91,176,
- 48,144,113,226, 7, 98, 45, 88, 56,129,176, 12,192,194,160,134,101, 0, 22, 6, 53, 44, 3,176, 48,168, 97, 25,128,133, 65, 13,
-195,199,162, 88,176,144,105,244,190, 71,248, 93, 0, 19,179,149,134, 32, 8, 45, 27, 55,110, 52, 61, 12,106, 25,128,133,126,129,
-242, 18,237,222,247, 32, 99,235,214,173,168,168,168,136, 60,224, 75,153, 45, 86,160,158, 56, 83, 79,250,169,161,221,239,243,249,
-240,245,175,127, 61,169,121, 8,203, 0, 44,100, 29,234, 55,200,207,155, 55,111, 20, 0,108,217,178, 5,126,191, 31,121,121,121,
-186,175, 73, 53,187, 4, 68,125,236,203, 47,191, 76,154, 27,231,116, 58, 86, 6, 2,193, 59, 36, 73, 54,101, 12,132,144, 32,165,
-116, 37,165,244,222,164, 83,203, 2, 28, 14, 71,117, 48, 24,156, 35,203,178,217,254,140, 4, 96, 61,165,180,255,110,145,138,131,
-147,157,127, 34, 40,226, 95,189,122,181,173,186,186,122,148,178,159, 97,152,200,251, 3,128,228,111,100, 50, 58,158, 44,152, 64,
- 32,120, 71,205,190, 93, 92, 40,232,131,153, 79,125,109, 77, 8, 64,102,111,203, 73, 3,193, 96,112,206,254,253,187,152, 80,168,
- 7,102, 62,117,117,251,101, 0,213, 39,154,183,130,147,157,127, 60, 40,226, 95,181,106,149,125,254,252,249,163,212,199,148, 55,
- 73, 2,201,139, 95,121, 62,106, 38, 22, 2,114,146, 36,115,149, 35, 71,161,199,219, 14, 89,138, 94, 91,173,183, 72,162,172,116,
-200, 81, 0,163, 83, 74, 45, 11,144,101,153, 25, 57,242, 84,248, 61,237,144,229,104,254,122,183,176, 87,148, 22,122, 0,244,207,
- 51, 26, 77,224,100,231,111, 4,181,248, 23, 44, 88, 48, 82,123, 92,241,251,227,189, 10, 54,149, 86, 33, 89,244,190,144, 22,144,
- 36, 49,230, 2, 64,103,157,144, 36, 83, 41,233, 84,178, 13, 25, 16,101, 29,254, 58, 79,113,144, 56, 71,246, 31,237,144, 44, 78,
-118,254, 26, 36, 18, 63, 0, 30, 79, 27,159, 0, 0, 26, 61, 73, 68, 65, 84,195, 55,196,167, 42,126,165, 85, 72, 22,170, 51,104,
- 88,240,189, 31, 74, 41,104,120,111,248, 67,195,203,131, 41,149, 56, 0,126, 66, 72, 69,210,169,101, 21,114, 88, 48,234,143,126,
- 56, 6,128, 72, 8,113,245, 39,187,196, 56,217,249,135,161,246,249,141,196, 15, 0, 54,155, 45,242, 59, 19,226, 79,171, 5,232,
-238,108,193,246, 77, 47,161,199,219, 5, 0,160,138,243, 67, 85,110, 80,239,111,150, 99,135,254,242,151, 55,250, 31,124,240,225,
- 67, 28,199, 70,142,169,130, 17,237, 78, 74, 17,195,140, 82, 26,181,143,101, 24,209,102,231,126,235,245, 6, 86, 38,155,137,238,
-206,163,216,190,233, 37,248,124, 93,189,123,228,200,151, 86, 70, 12,225,156,183,220,114,147,248,192, 3,191,191, 81,121,190,190,
- 62,250,206,148,229, 88,254, 90, 48, 12, 35, 11, 2,243, 97, 79, 79,104,125, 82,228,113,242,243, 87,160, 30,237, 81,119,120, 1,
- 32, 16, 8,224,224,193,131, 56,124,248, 48,218,218,218, 12, 95, 52,158,110, 71, 56, 89,112, 0,192,178, 4,185, 78, 59, 56, 18,
-236,149, 45, 85,137,159,106, 12,129,186,150,127,111, 9,126,113,227, 79, 33, 83, 25, 20, 20,164,183,124, 9,244,198,110, 17,181,
-143, 70,142,133, 35, 85,194, 29, 58,116,136, 59,123,198,185,119, 0, 88,153,108, 38, 24,142, 65,110,174, 29, 28, 19,236,187,236,
-154, 31,170, 77,225,135,215, 44,193,205, 55,254,180,247, 65, 87, 50,148,134, 48,170, 1,101,244,246,169,127,200,189,191,194, 59,
- 15, 30, 62,200,156,253,181,115,231, 0, 88, 63,216,248, 71,168,201,242,187, 15, 62,248,160, 48,119,238,220, 81,178, 44,163,177,
-177, 17,123,247,238, 69,109,109, 45, 90, 91, 91,225,114,185, 80, 88, 88,136,194,194, 66,184, 92, 46,112, 28,103,216,161,237, 15,
-241, 3,189, 6, 32,138, 50,186,186,124,240,122, 61,145, 3,234,251, 4,162,238, 25,160, 64,199,230,183, 96,119,228,130, 48, 28,
- 34,102,162,106, 42,212, 61,135,152,251, 13,148,198,133,246,109, 80, 0,237,237, 29,144,101,115, 67,177, 90,136,162,140,206, 78,
- 31,124, 62,119,100, 95,180, 7, 33, 71,253,220,177,249, 95,176,231,184, 0,134,131,186,182,213, 9, 29,179,165, 19, 28, 0,208,
-222,222,134, 36,134, 50,191, 82,252, 85,152, 88, 85, 85,133,199, 30,123, 12,181,181,181,224, 56, 14, 37, 37, 37, 40, 42, 42, 66,
-121,121, 57,120,158, 7,207,243, 16, 4, 1,118,187, 29, 60,207, 71, 70,131, 50,213, 17, 78, 22,189, 45, 0,131, 28,167, 13, 12,
- 9, 63, 38, 60, 92, 57,107,221, 32, 26,221, 39,166, 34, 40,148, 78,155, 90,244,209,225,162, 13,169, 55, 66,213, 87,164, 37,160,
-169,223,221,207, 49, 12,114,114,237, 96,152,240,155, 94,244,175,185,164,217, 31,130,140, 16,116, 79,136, 58, 89,229, 74,168,118,
- 51,170, 42, 89, 6, 0,109, 7, 54, 9,156,236,252,213,112,187,221,112, 58,157,168,174,174, 70, 65, 65,223,227,243,129,190, 91,
- 35, 5, 65, 0,207,243,176,217,108,225,167,143,119, 31, 71,221,163,223,131,167,177, 30,142,226, 50,148,159,127, 61,202,191,241,
-253,148, 12, 35, 89,244,182, 0, 18,186,187,125,240,245,182, 0, 17,205,210,228,133, 29,251, 91, 57,187,239, 95,244,254,176, 1,
-120,188, 61, 73,147, 87, 32,138, 98,152,191,199, 29,125, 32,202,135,214,212,139, 49,154,145, 13,246,171,142,246,253,139,217,239,
-241,249,147, 35,173,194,201,206, 95, 13,167,211,137, 41, 83,166, 64,146,164,168, 39,107, 40,223, 12,195,128,227, 56,240, 60, 15,
-134, 97,192,243, 60, 26, 63,120, 14,249,104,197,156,165,231,195,231, 13,226,179,183, 31,129,231,192,103, 24,251,195,255, 5,195,
- 11, 73,181, 10,201,130, 3, 0,134,101,224,204,177,129,129,195,208,245,209,186, 44,138,138, 99, 92, 31,170,218,210, 49,152,168,
-115, 85,255, 66,161, 16, 82, 5,195, 49,200,205, 17,192, 32,199,176,198, 83, 95,124,125,239, 66,142,173, 71,163,220,138, 88, 31,
- 67,157,146, 40, 6, 83, 96, 30,198,201,206, 95, 13,142,227, 32, 8, 66,204, 44, 47,128,200, 75,253, 20,191, 95, 89,254, 48,108,
-230, 37,216,253,159,167, 49,188,169, 1,195, 38,156,141,217, 23,148, 96,231, 71,159, 98,231,175, 23,225,140, 91, 95,132,189, 96,
-168,233,190, 64,210,124, 1, 64, 18, 37,116,187,125,240,122, 60, 26,161, 70,254,105,106,255,222,111, 3,145,171, 3, 81,221,237,
-232, 52, 40, 40,220,105,181, 0, 50,186,187,125,240,120, 60,136, 18,137, 81,109, 24,219,211,212,236,215, 57, 57, 74, 52,177,181,
-168,199,151,186,128, 78,118,254,106,112, 28, 7,150,101,193,178,108,212, 19,247,244,196,170, 24, 66,238, 41, 19, 48,241,182,151,
-177,125,245, 82, 76, 12, 2,195,167,205,195,212,111,124, 3, 95,110,219,140,109,183,205,193,153,119,190,134,220, 17, 19,178, 55,
- 10,196,176, 12,114, 28, 54, 64,238,237, 3, 68,185, 41,250, 46, 11,160,105, 33,194, 59, 84,191, 35,161,117,126,107,226, 1, 69,
- 48,152, 70, 11,192, 48,200,201,177,171,248,135,235,187, 79,183,212, 98,195,166,122,120, 60, 62,248,253, 65,248,131,193,240,183,
- 63,136, 96,239,239, 76,162,247, 98,232, 46, 19,225, 56, 78,158, 50,101,194,182, 45, 91, 62,255,231, 87,141,191, 26,106, 95, 92,
- 45, 80, 26, 10,224,240, 95,110, 69,247,190,143, 32, 5, 2,160, 84, 14,187,216,178,220,231, 42, 49, 12, 62,223,186, 31,108,193,
-112,148,143,159,136, 83,207,154, 1, 87, 81, 33,182,221,125, 62, 78,255,217,159, 49,236,236, 69,113,221,161, 84, 16,105, 1,186,
-220, 62,120,221, 94, 0,177, 53,187,161,176,161,250,173,221, 79,181, 34,143,236, 84,197,213, 23,222,227, 73,221, 7,149, 69, 17,
-157,221, 62,248, 60,225, 62,140, 82,123,110,216, 88,131, 23, 94,252, 59,138,139,139, 83,142, 59, 83, 56,120,240, 48,115,198,228,
-179,167, 1,136, 17, 80,182,249,203,178, 72, 24,134,163,122,251, 1, 64,239, 88, 50,252,213, 80,139, 81, 45,210,230,183,254,136,
- 92,127, 19,166, 93,122, 1, 88, 65, 0, 97,121, 16,150, 3, 97,194, 31, 48, 12, 64, 24, 0, 4,224,108,128,232, 7, 66, 62, 12,
- 29, 53, 22,179,243,139,240,233,159,254, 11,222, 35,215, 99,244,183,110,201,252, 40, 16,195, 50,112, 58, 4, 16,217, 22, 37,230,
-237,159,127,137, 15, 55,214,192,219, 19, 64, 48, 40, 34, 16, 8, 34, 16, 20, 17, 12,134, 16, 8,132,194,223, 65, 17,146,148,153,
-213, 17, 12,195,200,132, 16,221,139, 65, 8,233,161,148,222, 65, 41,125, 40,230, 60,197,135,150,237, 81,126, 45, 39,112, 40, 46,
- 46, 70,231,177,154,164,125,220, 96, 48,196,132,164, 16, 3, 0, 60,203,203,130,192,199, 25,106, 73, 12, 95,103, 43, 68, 81,212,
- 29,166, 72,200,191,181, 22,162,104,190,130,144,101,145,136, 34, 37, 84, 18, 73, 80, 18, 25, 42,202,132,112, 12, 21, 88, 78, 38,
- 44,215, 91,247,136,164,167, 39,200, 50, 0,108, 54, 65,226,109,188, 28,207, 16,124,221,198,252,181,208, 19,166, 28,236,129,195,
-233, 0, 79,253, 32,162, 8, 80, 30,144,121,128, 97, 65,249, 28, 32, 20, 8, 15,235, 18, 6, 8,249, 0, 42, 3,172, 0,136,126,
- 56,243,243, 49,231,242, 75,176,245,173,191,192,115,112, 23,206,188,229, 57, 16, 18,107, 4, 41,143, 2, 73,162, 4,183,167, 7,
- 30,183, 55,202, 0, 62,217, 82,135,255,247,194,203,253, 89,131, 26,230,160,161,161,193, 81,117,250, 89,247, 3,136, 49, 0, 81,
-148,209,237,241,194,211,237,137, 62, 32, 43,199,253, 16,131, 62, 83, 4,100, 89, 36, 62, 95,128,235,234,236,180,185,189, 94,129,
- 16, 66,115,115, 93,193,130,252,188,128,195, 33, 72,102,106, 75, 61, 4,227,164,159,144,127,208,103,202, 0,100, 89, 38,162, 36,
- 17,159,183,135,243,122,220,130,183,199,207, 5,131, 1, 78, 18, 69,134,229, 56, 89, 16,108,162,195, 97, 23, 57,150,165, 61, 61,
- 62,174,219,237,177, 49,132,208,252,188,188, 64, 81,241,144,158,156, 28,135,104,148,191,120,252,213,208,186, 64,202,167,100,254,
-213, 56,248,204,141,216,191,237, 95, 80,207, 75, 51, 44,143,170, 69, 87, 98,196,240, 92, 48,160, 0,219, 59, 21, 36,137,136, 44,
- 32,144, 2,224, 65, 49, 99,201,133,248,236,189,247,176,247,137,155,113,198,245,255,155,182,248, 1,165, 5, 96, 24, 56, 28, 2,
-100,201, 22,229,162, 8,130,128,226,162, 98,180,183,236,131,164,115, 1, 82, 82, 66,178,177,244, 30, 14,184, 61, 8,137,162,238,
-179,239, 24,134, 65,142,221, 6, 89,180, 71,237,183,219, 5, 0, 50,100, 89,214, 27, 35,137,129, 40,138,196,231,243,241, 45, 71,
-143, 59,119,236,220, 87,242,215,151,255, 51,213,225,176, 5, 47, 94, 50,123,247,148,137, 19, 90, 74, 74,135,122,115,114,114, 66,
- 28,151,138, 17, 24,167, 31,159,127,239,185,178, 94,247, 85, 21,187, 28,174,209, 59, 59, 58,236,199,219,218,114,106,235, 14, 20,
-109,218,188,103,196,161,134, 99, 69,221,157, 62,103, 65, 65,174,103,100,101, 73,235,244,179,170,142,148,149, 12,241, 29, 58,210,
-146,247,194,203, 27,102,129, 80,233,187, 87,156,251,241,215,102, 76,105, 44, 97, 75,125, 54, 27,163,223,156, 39,209,254,169, 71,
-127,148, 79, 78,233, 40,156,126,251,107,145,237, 96, 91, 35,246,174,249, 54,198,205,154,135,138,145,195, 64, 3,221, 0,103, 7,
- 41, 28, 5,118,228, 57,128,171, 28, 32, 12,104,231, 65,200,117,239, 64,110,222, 1,244, 28,199,228,121,115,241,241,107,111,226,
-200, 59,103,162,114,225,117,105,137, 31, 80, 90, 0, 73,134,219,221, 3,183,219, 23, 61,246, 79, 41, 40, 40,196,144, 15, 98, 40,
-245, 81,154,116,160,116,144,186,187, 58, 12,195,200,162,140,110, 79, 15, 60,221, 62, 68, 15,248,201,125,223, 9,222,239, 37,138,
- 34,241,121,125,124,211,209,163,185, 91,182,238,174,248,199,127,246, 44,254,247,251,155, 29,255,248,199, 63,112,247, 93,119,156,
-122,237, 85,254,127,157,125,214,196,198,242,210, 82, 79,142, 51, 5, 35,136,147,126,124,254,137, 13, 88,105,181,142, 29, 63,158,
-211,112,164, 41,127,237,243,111, 77,157, 56,101,246,164, 95,255,246,143, 76, 89, 89, 25,236,118, 59,142, 28, 57,130,109,219,182,
-141,123,250,169,167,100, 57,212,190,167,181,189, 51,111,243,214,125,229,219,182,109,195, 47,110, 90, 62,121,194,248, 83, 91,135,
- 20,230,251,109, 54,206,192,159, 53,111, 1, 90, 3,208,250,236,238,250,109,168,251,227,143, 49,245,130,111,162,176,192, 14,234,
- 61, 6,112,118, 48,149,231,128, 25,179, 16, 68,125,107,100,201, 25, 96,134, 77,132, 84,243, 38,196, 29,127, 1,219,115, 28,211,
-207,159,143, 13,107,111, 71,229, 55,174, 6,195,219,140,104,152, 66,111, 11, 64,194, 45,128,104,131,186, 35,235,176,135, 35, 15,
-175, 2, 77,203, 5, 54,134,105, 25, 25, 7,100, 24,244,214,160, 66,212,126,229, 5,216,137, 4,164,212,252, 77, 71,143,230,110,
-222,178,123,248,219,239,213, 44, 90,191,254, 67,135, 40,138, 56,239,188,243,112,202, 41,167,228, 92,119,237, 53,139, 36, 42,191,
- 53,253,108,185, 33, 21, 35,136,151,126, 34,254,189,153, 48, 60, 63, 20, 8, 50,237,109,237,246,109, 91,119,151, 61,247,226,134,
-243,215,174,251,191,194, 41, 83,166,192,231,243,245,142, 22,249, 49,108,216, 48, 44, 94,188, 24, 11, 23, 46,100,158,120,226,137,
- 51, 86,175, 94, 21,202,205,205,197,216,177, 99,209,218,218,149, 31,244,251,185, 80, 64,100,100,123, 80,183,195,156,168, 2, 81,
-160,238,140,234,137,255,216, 71, 47,162,233,141, 7, 49,227,210,203,225,100,125,128,207, 13,176, 54, 16, 87, 57, 48,250, 60, 72,
-148, 98,255,129, 86,236, 62,208, 6,175, 63,132,211, 42,242,113,246,248, 18, 8, 99, 23,131,110,250, 3,164,186,183, 33, 12, 29,
-135,161,167,140,192,177,237,255, 70,217,215, 46, 48,197,203, 8,125, 45,128,199, 7,119,183, 55,106, 20, 39,188,216, 42, 44,254,
- 19,109, 0,241,210, 23,101,197,135,246,169,231,133,194,252,229,200,134,238,185,178, 44, 18,191,175,135,107,106,106,201,221,188,
-101,215,240,119,214,215, 46,122,127,253, 6,135, 40,138,240,122,195,163, 98,227,199,143,199,179,107,255,146,115,237,247,174, 94,
- 8, 74,223,154,126, 54, 26,134,151,151,184,227,249,204,201, 32, 46,127,196, 55, 96, 89,150, 73, 79,192,207,118,116,117,216,159,
-123,241, 63,231,124,178,105,103, 33,207,243,104,110,110,198,227,143, 63,142, 15, 62,248,128, 30,109,110,236, 41, 45,171,112,204,
-155, 55,143, 44, 95,190, 28,223,255,254,247, 49,122,244,104,149, 59, 73, 33, 81,137,136, 52, 68,228,222, 86, 39, 38,157, 20, 90,
-128, 40,241, 3, 56,248,255, 86,162,167,110, 35,102, 95,122, 41,248,192, 49,208,144, 8, 66, 88, 0, 12,104,229, 92, 72, 50, 69,
-125, 99, 59,254,245,233, 33, 4, 69, 9, 59,235,143,227,143, 77, 93,248,225,133,167,227,154,243, 39, 0,179,110, 6,234,222, 6,
-245, 28, 67, 89,249, 20, 28,126,231,233,204, 24, 0,195, 16, 56,236, 2,164,144,210,156,132,199,254,237,142,112,159, 32,101, 3,
-200, 76, 39, 33, 28, 85,156,135,248,134,125,104, 33,170, 6,149,229,190, 62, 0, 12, 46, 42, 0,132, 66, 34,211,222,209,105,223,
-178,117, 87,197,219,235,247, 47,126,255,253, 13,118, 81, 20,177,115,231, 78,204,156, 57, 19,199,143, 31, 71,125,125, 61,198,142,
- 29,139,103,215,254, 37,231,154,107,150, 45, 34, 4,255,116,204,226, 14,241,101,165, 94, 67,159, 89,139, 56, 53,104, 92,254, 9,
- 12, 24,178, 8, 41, 36,145, 80, 32,200,130, 8,197,161, 80, 8,159,127,254, 57,174,191,254,199, 98,249, 80,254,179,111, 46,158,
- 86,207,210, 9,228,192,145,163,133,207, 60,253,248,153, 47,189,244,210,208, 85,171, 86,145, 9, 19, 38, 68,162, 8,143,121,244,
-166, 33, 27,148, 85, 18, 45,128,182, 19, 44, 7,123,176,255,225,107,225,178,201,248,218,249, 11,192,202, 94,244,240,165, 16,137,
- 13,185,190, 58, 16, 80, 72,206, 82, 80, 81,196,198,221,205,104,110,243, 98, 91,109, 11,188, 61,225,185,161,191,189, 95,135,111,
-205, 25, 5, 97,232, 25, 96, 8, 3,218,211,129,252,138, 60,236,219,177,197, 20,167,120,136,180, 0, 30,143, 31,221,238,222,158,
-126,239, 24,190, 44,135,151, 59, 83, 12, 4, 3,136,239, 67,123, 60,126,116,119,247,141, 84,200, 80,106,206,222,111,157, 11, 40,
-203, 50,233,241,251,217,246,142, 14,199, 63,223,221, 49,243,131, 15,183, 68,196,191,116,233, 21, 82, 83, 83, 51, 11, 0, 75,151,
- 94, 33,189,240,194,223,216, 49, 99,198, 96,221,186,231, 29,215, 94,243,237,121, 85, 19, 78,125, 49,191, 48,207,207,178,140,204,
- 48, 76,194,156,198,245,225,227,242,239,251,211, 5,195, 80,150,103,100,135,211, 17, 28, 55,186,104,203,130, 5,243,206,234,238,
-234, 12,126,235,226, 25,235,207,156, 60,246,168, 32,216,196,206,246, 14,231,191,215,239,158,191,119,223, 23,195,114,115,115,213,
-249, 7, 0,136,162,204, 82, 74, 40, 40,161,178,129, 1,164,210, 2, 16, 66, 16,236,104,198,222,251, 47,199,200, 9, 99,113,234,
-184, 74, 64,242,162,179, 59,136,141,175, 60,135,115,174,188, 26, 32, 4, 84, 12, 64, 18, 69, 80, 73, 66, 83,171, 27, 31,126,222,
- 16, 53,249,106, 23, 88,128,202, 8,133, 66,176,133, 35, 6,203,219, 16,234,241,232,166,159, 12, 34, 45,128,221, 46, 64, 12, 9,
- 81,171, 63,115,148, 81, 8, 42,135, 63, 90,152, 27,192,201, 8,226, 25, 0,195,132,107, 75, 81, 12,215,152, 74,200, 8,255, 56,
-144, 68,137,136,162,196,128,216, 10,125, 62, 31,246,237,219,135,107,174, 94,214, 67, 16,240, 0, 24, 10, 0, 4,129,246,107,174,
- 94,150,187,118,221,115,142,202,202, 74,240,130, 93,160,146, 76,168, 72,205,207,188,196,109, 1, 18,240,143,123,135, 24, 96,227,
- 57,169, 40, 63,175,231,202,111, 45,216,221,217,217,253, 5, 75, 8,117,185, 92,254,252,188, 60, 63, 24,192,235,245,216, 64, 56,
-254,200,145, 35, 81, 67,218,148, 82,108,223,190, 29,229, 37,133,109,246, 28, 94,228,121,197,152,211,107, 1,148,111,255,177, 67,
-216,253,219,139, 48,105,238, 28,148,150,228, 2,178,136,150,163, 93,216,185,126, 61,114,135,143, 67,200,219, 13,146,199,130, 6,
- 61,144,218,234, 16, 32, 78,140,173,112,198,220,137,187, 96,114, 25, 68, 49, 4,182,113, 91, 88,135,124, 14,130, 33, 25,142, 33,
-233,191,138,160,175, 5,240,246,160,219,237,139, 74, 92,148,194,125,128,176, 27,164, 35,231,254,124,183, 64,130, 62,128,199,231,
- 67,183,218,135,238,221, 15, 0, 48,104, 1, 0, 80,142,231,164, 92,167, 35, 48,122, 68,238,167,115,102,207,152, 26, 8,248, 67,
- 23,157, 63,101,203,171,255,220, 60, 69, 9,196,115,156,116,209,249,103,124,240,131,235,174,154, 68, 88, 91,193,148,211, 43,182,
-229,186,156, 1,142,231, 36, 0,212,204, 27,228,227,118,194, 77,240, 55,238,195,200, 36, 24, 10, 50, 65,127,128,149, 66, 18, 97,
- 9,161,148,202,196,231,243, 9,161, 80,144, 37,132, 80, 89,146,200,194,249, 85, 31, 95,250,205,133, 83, 65,216, 72,207, 90, 12,
- 73,236,208,226,220,198,101,151,207,223, 94,224,116,249,109, 60, 39,197,185, 21, 51, 97, 30, 21, 40,174, 79,221,159,126,138, 73,
-115,206, 65, 73, 33, 1,101,120, 28, 58,112, 20, 95,236,216,133,179,239,125, 31,199, 54,191,137,182,218,183, 80, 60,116, 2,224,
-110, 6,249,240, 62,248,207,127, 10, 51,199, 13,193,210,185,149,120,111,103, 11,130,162,132,153, 19,134,226,226,153, 21, 8,133,
- 66,176,111,121, 24, 0,192, 20, 84,162,179,195,141,194,241, 51, 77,115, 50,130,170, 5,224, 17, 10,132, 71,129, 20, 56, 28,189,
- 45,130, 44,131,154,172, 1,162,145, 57, 3,137,223, 2, 48,176,219, 5, 4,237,118,168, 47, 84,142,122, 28,221,224, 2,218, 4,
- 94, 26, 90, 92,232, 91,182,244, 27, 59,151,120,186,247,139, 65,137,117,123,189,118, 96,115,212, 98,144, 49, 99, 78, 57,126,230,
-148,113,255,228, 5, 78,204,115,185, 2, 67,139,243,125,188,192,107, 23,233, 27, 35, 65, 31, 32, 62,127, 99, 3,146,164, 16,233,
-236,236,182,213, 29, 56, 52,228,197, 87, 54, 76,170, 63,208, 84,198,178,125,171,253, 29, 14, 91,224,155,139,167,127, 94, 85, 53,
-234,216,148, 73, 99,254, 33,201, 18, 35, 74, 34, 19, 10, 73, 44, 75, 64,157, 46,167,127,104,113,145,215, 85,232,242, 19,150,208,
- 56,157,109,115,249, 68,159, 1,136,221,199, 49,100,248, 57,160, 8,162,118,103, 45,142,183,116, 96,250,253, 27,192,231, 22, 96,
-248,130,101,248,228,205, 63, 96,212, 25, 19,193, 52,110, 7,231,239,132,125,227, 61,240, 76,191, 13,151,206, 42,199,101,231, 84,
- 68,226, 2,149,192,111,126, 20,220,161,247, 1,134,131, 92, 54, 13,181,255,248, 0,179,239,123,196, 52, 39, 35,168,250, 0, 61,
-125,125,128,222, 90, 95, 18, 41,178, 62, 10,100,210, 72,226,117,130,195, 62,180, 79,197, 63,236, 71,132,223,160,217, 91,251, 27,
- 92, 64,142, 1,117, 58,156, 65,174,140,147,134, 6, 10,124,221, 94,159,208,212,216,172, 37, 70,115,115,236,129,242,210,146,174,
-156, 28,123,200,158, 99, 19, 5,158,147, 57, 6,212,172,107, 16, 15,233,240, 15,244, 4,216,174,142, 78,251,186,231,223, 62,235,
-201,181,175, 78, 26, 59,118,108,212,113,175,215,139, 25,103, 79,201,187,245,231,195, 95, 43, 46, 42,240,130, 2,221, 30,175,205,
-237,118,219, 41,165,132, 99, 56,217, 97, 19, 68,129,101,100, 6,233,231, 71, 61,246,159, 63,225, 28,124,250,175,127, 35,228,243,
-192,117,218, 89,152,250,155,191,130,229,109,225,155, 98,114, 11, 48, 98,241,143,240,197,158, 13, 24, 63,252,108, 72, 95,252, 27,
-185,187,159,134,112,116, 43, 60,147,150, 35, 88, 60, 9,148,176, 16,218,118, 33,119,207, 90,216,154, 63, 1, 0, 48,195,167,163,
-161,177, 3, 67,167,156,139,220,138, 49,105,113, 5, 52,125,128,144, 35, 92,227, 40,139,216,114,114, 4, 80,164, 49, 10,148, 17,
- 40,203,177, 19,251,208, 57, 14,117,141, 31,230,175,108,199, 29,135,231, 64, 29,156, 77,148,237,172, 36, 82,137, 48, 28,137, 9,
- 44,138, 18, 35,209, 16,161,176, 33,216, 19, 96, 37, 81, 34, 34, 47, 17,158,231,204,117,130, 77,244, 1,146,229, 47,203, 50, 9,
-132,130,140,183,167,135, 63,220,208, 54,108,252,248,241,104,105,105,137, 10,211,210,210, 2,134, 99, 72, 32, 20,100,125,254, 30,
- 46, 20, 18,217,154,186, 67, 67,223,124,251,243,185,146, 4, 97,226,132,161,219,190,117,113,245, 30,135,195, 22, 98,121,214,144,
-100, 50, 45,128, 50,252, 57,254,199,143,194,123,100, 31, 4,215, 16,216,139,202, 99, 38,198, 70, 94,248, 19,124,240,147, 63, 34,
-127,200, 44,148, 77,188, 28,210,254,127, 66,104,253, 28, 67,222,251,175,216, 72, 89, 1,236,105, 95, 71,135,152,143,253,155,223,
-195,185,127,220, 97,154, 79, 60,168,250, 0,126,184, 61,225,217, 94,165,182, 13,137, 18, 34,143, 72, 57,209, 6,144,200,135,246,
-248,225,233,173, 65,149,144,162, 40,246,141, 32,154,185,128, 50,192, 16, 74, 99, 23,228, 81,210,213,237,113,144, 35,148,242, 54,
- 78, 98, 8, 67,121, 27, 47,230,187,242,252,133, 5,121,254,156, 28,187,152,216, 8,210,225,111,208, 2,200, 50, 36, 73, 34, 84,
-150, 8, 97,123, 7, 76,101, 25,199,142, 29, 67, 77, 77, 13,238,190,251, 46,217,239,235,106, 95,124,222,228, 29,238,110,159, 35,
- 24, 8,242,235, 63,218, 61,210, 19,112,125,237,131, 13,155, 5,159,207,135,217,231,124,109,230,194,249,238,250, 96, 97,190,207,
- 38,240,146,113, 62,146,155, 8, 83, 62,174,202,211, 13,103,132, 57,155, 3,179, 87,127,136,173,247, 92,130,206, 97, 69, 24, 55,
-229,106,144,163,159,129,186,155, 65,221,205,128, 44,129,228,150,128,184,202, 64, 74, 39,225,224,151,205, 56,184,251, 19,204, 89,
-245, 30,236, 67, 82,122,143, 95, 12, 56, 0, 32, 12,129,221,198, 33,100,231,163, 22,195, 69,106, 36,163, 81,160, 12,192,108, 47,
- 33,209, 60,128,221,206, 33,232, 80,143,250,200,166, 91, 0, 68,133,146, 65,136, 38, 49, 98, 31,242,240,159,222,168, 86,211,117,
- 56,132,192,165, 75,102,109, 59,103,230,196,195, 37,252, 80,175,205, 38,196,157, 15,136, 63, 19,156,152,191,190, 0,251,230, 56,
-212, 79,228, 56,124,248, 48,102,207,158,141,215, 95,127,131,121,228,145, 71,138, 63,219,190,173,250,189, 15,255,227,158, 56,105,
-170,235, 7, 63,186,139, 95,184,112, 33,188, 94, 47,234,234,234, 32, 75,129, 46,150, 37, 50, 97,137,254,232, 79, 84, 90,230, 96,
-230,198, 21,229,227, 40,174,192,220,135, 54, 97,207,159,111,198, 71,175,191,141,242, 49, 99, 80, 56,116, 52, 92,227, 74, 65, 24,
- 6,158,214,227,232, 58,222,138,166,255,108,134,125,232, 72,156,251,248, 46,112,142,220,196, 36, 76,130, 3, 0, 89,146,225,245,
- 6,208,237,233,137,186, 73, 37, 20,146,122,127,157, 72, 23,168, 23, 9,231, 1,130,232,114, 71,175, 88, 12, 6,195,226,144, 77,
-172, 5, 2, 0, 6,160, 28,207, 74, 54,155, 61, 84, 94, 86,216,186,125,251,246,242,178,178, 50,212,127,113,192,198,113, 92,153,
- 58,172,223,239,199,180, 51, 79,119,157, 62,126,196,139, 5,121,121,126, 62,209,124, 64,130,181, 64,241,248, 71,250, 1, 49, 81,
-202, 32, 12,237,109, 28,251,146,190,238,186,107,165,123,238,249, 45,123,209, 69, 23,225,206, 59,239,132, 32, 8, 60,207,243, 67,
-120,158, 7,165, 20,173,173,173,120,229,149, 87,112,239,189,191,241, 92,121,201,244, 77, 46,151,211,207,115,108,220, 17,173, 84,
- 58,193,137,196,223,119,140,197,164,159, 60, 2,247,145, 26,180,237,254, 8, 13,159,189,131,182,247,158, 7,149, 68, 20,142, 61,
- 11,197, 83,207,199,148,111,206, 70,225,152,105,166, 57,152, 69,164, 5,176,217,120, 56,236, 66,212, 98,184,156,222,135, 20,156,
-216, 62, 0, 20, 18,198,199, 24,192,110,231,224,236, 29, 53,137,140,163,231,244,254, 48,154,221,212,129,192, 50,114,158,203, 22,
-184,228,130,233,187,190,243,237,203, 71,174, 94,243,191,121,211,166,197, 22,252,193,131, 7, 65,194,211,167,136, 55,202,212,135,
- 56,199, 19,240, 55,154,156, 2,100, 16, 66,168, 32,176, 98,190,203,225, 13, 6,131, 56,118,236, 24, 10,242,184,166, 63, 62,242,
- 59,255,203, 47,191, 60,102,233,210,165, 56,227,140, 51,112,202, 41,167,160,161,161, 1,187,118,237,194, 11, 47,188,128, 99,205,
-181,251,111,254,241,249,159,158, 50, 98, 88, 71, 65,129,203,207,243,140,156, 76, 45,111,132,228,197,223,183,157, 95, 89,133,252,
-202, 42,156,122,193,242,180,121,152, 5, 71, 8,145, 3,254, 0,211,227, 15,134,251, 0,125, 55,252, 66,150,195,247,117, 82, 89,
- 60, 97, 6,160,208, 9,134, 66, 32, 36,182,115, 10,128, 6,253, 65,226,243, 7,209,229,241, 35,114, 17,101, 64,150, 57,200, 0,
- 68, 49, 24,246,167, 77,128, 16, 34,231, 58, 29,129,211, 70, 86,180,126,111,233,244, 55,127,247,235,155, 38, 54,181,116, 20,107,
-125,181,130, 60,135,231,226, 69,103,237,204,117, 58,123, 88,134, 72,178, 44,199,157, 15,232,189,125, 81,207,138, 19,242,135, 44,
- 26,206, 99,240, 28, 43,229, 56,115, 2, 23,124, 99,234,206,169,103,158, 94, 8,128,187,240,188,169, 59,198,140, 41,111,171,173,
-111,218,247,236,159, 87,143,104, 62,214, 57,164,167, 39,228,116, 56,120,111,217,176,130,246,179,167,141, 62,180,236,210,139,154,
-139,139, 10,188,249,121, 46,127,142,205, 38, 34,193,124, 70,239, 13, 69,166, 60,214, 68,194, 55, 58,126, 34,192, 57,115,108,199,
-107,106,246,151, 12, 43, 41, 67,143,167, 61,178, 22, 84, 18,101, 12, 47, 25, 1, 73, 12,161,187,171, 93,247,228, 68, 47,217, 54,
- 51, 79, 70, 19,148, 41,237,237,132,215,127,217, 0,187, 93, 56,162, 61,238,116,218,124, 53, 53, 53,206, 97,195, 42,224,119,183,
-247, 45,128, 22,101, 20,149,141,128, 40, 6,209,221,169,207,223, 8,178, 44,139,206,252, 28,207,216,211, 42, 67, 63,190,110, 88,
- 91, 32, 24,224,169, 36, 19, 74, 41, 33,132, 80, 48, 4, 2,207,139,185,185, 57,126,123,142,224, 15,133, 68, 89,146,226,184, 56,
-178,140, 47, 15, 54,194,225,176,117, 39,203, 95, 22, 69,120, 60,157,198, 75,129,100, 81,206,205,177,247, 76,157, 50,254,200,105,
-163, 43, 94,130, 12, 56, 93,142,128,221,102, 15,149, 13, 45,110,159, 62,109,252,193, 96, 48,196,201,162,204, 48, 28, 35, 11, 2,
- 47,230, 56, 28, 33,167,211, 22,180,219,236, 34,195, 48,114, 80, 20,251, 30,241,164,151, 6,100,124,249,101,179, 46,127, 61,164,
-242, 80,171, 19, 5,206,110,227,183,191,244,242,203,139,254,235, 39, 63,192,190, 61, 59,194, 79,137,150, 40,130, 33, 25,231, 46,
- 94,128,142,246, 38,184, 61, 6,119, 3, 37, 50, 0, 19, 4, 18, 27, 81,120, 77,210, 39,155,107,252,146, 36,127,162, 61,238, 16,
-184,230, 23, 95,126,249,180,159,253,244,135,216,183,231, 51,136, 98,184,182, 12, 6,101, 44,184,224, 92,116,182, 55,193,231,247,
- 39,219,186, 83, 6, 76,200,238,176, 75,188, 32,248, 37, 81,100, 36,205,179, 76,121,142,145, 57,142,151, 32,129,250,253,193,184,
-153,144,101, 25,155,182,214,138,146, 36,198, 24,112, 60,254, 95,191,224, 92,116,118, 54,193, 23,255,153, 61, 20, 4, 98,158,203,
-225,181,219,120, 63, 0, 8, 2, 39,133, 39,195,108,112, 74, 14, 38, 16,148, 24,197,120,121,142,149,121,150,145, 9, 67,168, 36,
-201, 84,146, 18,223, 42, 42,203, 50, 54,110,174,209,229,175, 69,178,181,254,137, 20, 63, 0,112, 57, 60,243, 95, 47,189,252, 70,
-237,183, 46,187,148,253,246,119,111, 66,237,254,237, 16, 69, 9,227,198,159,137,161,195,134, 97,231,150,215, 16,240,167,104, 0,
-137,214, 10,153,104, 34, 40,165, 56,210,216,138,151, 94,251, 56, 20, 12,138, 49, 79, 44,200,145,185,127,190,244,210,235, 63,187,
-252,178,203,200,183,191,123, 51,106,107,183, 67, 20, 69,140, 31, 63, 21,195,134, 13,195,231, 91, 95,135,223,159,242,205, 60, 50,
- 0,153, 50,132, 48,154,231,203, 82, 2, 26,146, 66, 8, 73, 72,104, 92,135, 27,142,225,197,191,127, 36, 7,131,210,122, 67,254,
-151, 95, 70,190,125,205,205,168,173,217, 14, 89, 20, 49,118,252, 84, 12, 43, 45,197,222,237,111, 34,152,152, 63, 5, 32, 50, 76,
-120,101,170,198, 29,147, 89,134,144,190,251, 16,101, 26,146,228,240,123,102, 96,238, 73, 28, 7, 15, 31,195, 11,127,223,160,203,
- 95, 15, 39,139,248, 1,128, 80, 74, 49, 98, 68,241,245,109,173,158, 71,174,186,242, 34,246,194, 11, 47,192,216, 49,167,194,235,
-110,197,151,117, 91, 16, 12,196,185, 23, 52, 93, 3,136,211, 70, 72,146,140,163,199, 58,177, 99,215,129,158, 87,223,220, 44, 73,
-178,248,115, 81,164, 79,233,133, 29, 49, 98,232, 89,109,199,187, 23, 95,117,229, 69,100,201,197, 75, 48,246,180, 83,225,243,181,
-226, 96,253, 22, 4,253,153,121,226, 89,178,144, 69, 25, 77,199,218,177,125,199,151,226,203,175,109,146,131,162,248, 22,165,244,
- 51,189,176, 17,254, 87,125,147, 92,188,100, 9,198,142, 61, 21,126, 95, 59, 14,127,185, 29,193,160, 87, 21,105, 22,249,106,183,
-101, 25, 77, 71,219,177,117,199,151, 98,216,120,141,249, 43, 56,235,172,179,232,167,159,126,138, 64, 32,112, 66,196, 95, 91, 91,
-139,171,174,186, 10, 91,183,110, 53, 29, 57, 81,106,225,252,252,252,211,120, 78,126,212, 31, 16,167,248,124,129,161,148,210, 19,
-250, 14, 97, 66, 32, 11, 2,127, 68,150,229, 79, 66, 33,105, 5,165,180, 54, 94,248,252,252,252, 33, 60, 43, 45,246, 7,197, 82,
-175, 55,144, 3, 36,126, 36,120,150, 65,109, 54,190,155,138,242,145,160, 36,173,167,148,182,197, 11, 60, 96,249, 83,249, 72, 48,
-152,152, 63,208,103, 0,193, 96, 48, 97, 71, 56, 27, 72,197, 0, 34, 79, 99,238,234,234,170, 7,176, 48, 43,204,250, 1, 93, 93,
- 93,237, 0,158, 59,209, 60, 82,197,201,206, 95, 65, 48, 24, 68,125,125,125,204,227, 10,251,195,237,225,121,221,103, 38,196,133,
-245,154, 84, 11, 25,131,205,102,107,153, 51,103, 78,250,139,244,211,228,144, 76,120, 98,166, 35,106,193,194, 87, 21, 39,212,207,
-183, 96,225, 68,195, 50, 0, 11,131, 26,255, 31,244, 45,114, 84,193,188, 23, 3, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
- 0};
-
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,
+192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, 0,
+255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0,
+ 0, 7,116, 73, 77, 69, 7,218, 12, 7, 13, 58, 45, 79,248, 81, 14, 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,120, 20,
+ 85,214,254, 91, 85,221, 85,189,164,179, 67, 2, 1, 18, 6, 8, 24, 48,136, 40, 66, 8, 97, 85, 1, 5,183, 25,151, 31,200, 51,
+ 58,126,124,226,140,142, 27,155, 32, 70,103, 20, 89, 29, 69,113, 25, 20, 68,249, 92,113, 16,253,252, 84, 28, 29, 81, 2, 36, 49,
+128, 96, 8,132, 64, 18, 18, 32,152,173,151,116,122,171,170,223, 31, 73, 53,213,157,222,183, 4,185,111,158,122, 82,221,213, 93,
+125,234,214,123,206, 61,231,220, 83,247, 82,162, 40,130,128,224, 82, 5, 77,154,128,128, 40, 0, 1, 1, 81, 0, 2, 2,162, 0,
+ 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2, 2,162,
+ 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2, 2,
+162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0, 2,
+ 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81, 0,
+ 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1, 1, 81,
+ 0, 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128, 64, 14,197,165,116,
+177, 99,198,140, 73, 23, 4, 97, 23,128, 17,209,250, 13,150,101, 27,138,138,138,210,163,113,238, 33, 67,134,112, 73, 73, 73, 99,
+121,158,215, 69, 75,126,165, 82,105,221,183,111,223, 46,162, 0,191, 49, 2,117,202,254,221,186,117,235,216,137, 19, 39,162,180,
+180, 20, 25, 25, 25, 80,169, 84, 96, 24, 6, 20, 69,129,166, 47,116,136, 20, 69,249,220,151,191, 39,189, 54,155,205,152, 54,109,
+ 90, 90,180,200,159,152,152, 56,238,249,231,159,167,167, 76,153,130,178,178, 50,100,100,100,128,101, 89, 40, 20, 29,183,145, 97,
+ 24,175,223,247,117, 76,130,205,102,195,164, 73,147, 56,210, 3, 4, 65, 32,142,227,192, 48, 12,104,154,238, 66, 14,127,196,113,
+223,143, 22,129, 36,217,215,174, 93,203, 77,156, 56,113, 32, 0,148,150,150,194, 98,177, 32, 62, 62, 30, 10,133,194,121, 13,210,
+117,120,219,124, 29, 63,117,234, 20,162, 73,254, 85,171, 86,209, 83,166, 76,209, 0, 64,113,113, 49, 70,140, 24,129,196,196, 68,
+167,252,114,146, 75, 74,225, 78,126,111,239, 51, 12, 19, 53,249, 47,122, 5,240, 68,160,253,251,247, 99,196,136, 17, 72, 72, 72,
+240, 74, 32,119,178,248, 59,118,242,228,201,104,185, 61,223,173, 89,179,134,155, 52,105,210, 64,103,240, 67,211, 16, 4,193, 69,
+ 1,125,145, 59, 80,197,136, 5,249,253, 89,244, 80,200, 79, 98,128, 32, 9,196, 48, 12, 68, 81,244, 74,160, 96,201, 47,237, 71,
+131,252,171, 87,175, 86, 77,158, 60, 57,203,155, 75, 16, 14,249,163, 37,187, 47,242,187,147, 89,126, 61,161,146,223,253,124, 68,
+ 1,194, 32, 80,168,228,143, 36,137,228,178, 79,153, 50, 37,203,147, 79, 28, 44,193, 3, 57, 22, 11,242, 7, 66, 98, 66,254, 48,
+ 21, 32, 80, 2, 73,238, 68,176,228,247,246,185, 88,144, 95,186,233, 82,208, 27, 41,242, 71, 74,126,127,228,151,218,223,155,235,
+ 18, 42,249, 47, 69, 87, 72, 17, 42,129,148, 74,101,200,150, 62,154, 46,144,220,101,115,239,181,228,224, 56,206, 99, 38, 39, 24,
+127, 63, 26, 10, 16, 8,249, 37,249, 35, 73,126,210, 3, 4, 73, 32,150,101,187,100,113,194, 37,191, 60, 13, 25,110,182, 71, 30,
+175, 0,128,213,106, 69,117,117, 53,106,107,107,209,220,220, 12,149, 74,229,145,200,225, 6,194,209, 34,191,213,106,197,169, 83,
+167, 80, 91, 91,139,150,150, 22,104, 52,154, 46,100, 15,135,252,151,106, 32,172, 8,150, 64, 53, 53, 53,104,110,110,134, 90,173,
+118, 18, 34, 18,150, 63, 92,242, 0,128, 32, 8,187,214,175, 95,207, 22, 20, 20, 12, 20, 4, 1,245,245,245, 56,122,244, 40,142,
+ 29, 59,134,198,198, 70,196,199,199, 35, 57, 57, 25, 9, 9, 9,208,233,116, 46,113, 64, 36, 98,129,112,145,148,148, 52,118,237,
+218,181,116, 65, 65,129,134,231,121,212,215,215,163,162,162, 2,149,149,149,104,108,108,132, 78,167, 67, 82, 82, 18, 18, 19, 19,
+161,211,233,160, 80, 40,186, 16, 63, 28,242, 95,242, 46,144, 32, 8,187, 58,243,252, 78, 2,149,151,151, 59, 9,164,211,233,144,
+156,156,140,196,196, 68,104,181, 90,151,252,127,184,228,143,144, 11, 49, 34, 39, 39, 7, 27, 55,110, 68,101,101, 37, 24,134, 65,
+ 90, 90, 26, 82, 82, 82,208,183,111, 95,231,160, 17,203,178, 80,169, 84, 78, 2,249,203,255, 7,115, 44, 28,240, 60,175,203,201,
+201,193, 43,175,188,130,147, 39, 79,130, 97, 24,244,234,213, 11,169,169,169,200,205,205,133, 66,161, 0,199,113, 96, 89,214, 57,
+254,226,205,234, 19,242,135,230, 2,141, 24, 62,124, 56, 94,126,249,101, 84, 86, 86, 66,161, 80, 32, 45, 45, 13,201,201,201,184,
+252,242,203,157, 4,226, 56, 14, 42,149, 10, 74,165, 18, 10,133, 34, 98,228,143,132, 21, 53, 26,141,136,139,139, 67, 65, 65, 1,
+ 18, 19, 19,157, 65,186, 60, 88, 87, 42,149, 93, 72,228,141,228,177,206, 2, 25, 12, 6,232,116, 58,228,231,231, 35, 41, 41,169,
+ 11,185, 37,121, 57,142,115,202,239,169, 23, 32,228, 15, 49, 6, 48, 24, 12,208,106,181, 78, 2,185,103,122,104,154,118, 42, 1,
+199,113,206,215,193,102,123,188, 29, 11, 23, 90,173, 22,185,185,185,224,121,222, 25,155,200,255,211, 52, 13,134, 97,160, 84, 42,
+157,255, 61,245, 0,161, 6,194,225, 34, 62, 62, 30, 35, 71,142,116,202,239, 45,243,227, 78,126,226,246, 68, 72, 1, 36, 2,185,
+143,146,202, 9,164, 80, 40,156,196, 97, 89,214,133, 64,225,186, 68, 97, 95, 80,167,139, 35,138,162, 71,242, 75,191, 39,183,252,
+145,138, 5, 34, 33,191,100,221, 29, 14,135, 95,210, 70,146,252,146, 59,120,201, 43,128,100,221, 5, 65,232,114, 99, 37,162, 23,
+190,254,111,148,254, 82, 15, 94,166, 36,193,224,240,142,229, 81, 75,131,202,111,164,164, 4,242,205,125, 0, 44, 24,203, 31,139,
+ 64,216, 83, 93,143,175,236,142, 39,242, 7, 18, 23,248,250,204, 37,175, 0,242, 27,224,126,147,105,154,198,115, 15,206, 64,147,
+190, 29,207,191,245, 45,202,142,214, 59,191,187,235,141, 5,208,105, 93,211,139, 45,134,118,156,168,253, 21,155,182,239,197, 79,
+229,181, 62, 83,166,145,128,220,149,138,116,138,211, 95,250, 51, 82,215, 16, 72, 86, 39, 20, 98, 19,242,119, 5,237,141, 64,146,
+117,145, 54, 41,224,149,222, 79, 79,141,199,252,223,143,115,109, 96, 15, 22, 53, 53, 41, 14,227,174,248, 29, 54,253,109, 14, 38,
+140, 30,236,115,192, 41, 18, 49, 64, 36, 71,117,131, 33,127,180,138,225, 98, 69,254, 75, 53, 22,240,170, 0,129,248,238, 3, 51,
+ 82, 92, 27, 89,225,221,151, 86, 48, 12, 22,220, 89,224,243, 55, 34,133, 72,145, 63,208,244,104,180, 10,226, 8,249,187,193, 5,
+242, 22, 52,122, 82, 4,157, 86,213,165, 7,240,165, 64, 35,135,246,195, 53,185, 3,163, 74,126, 95,242, 71, 82, 49,162, 85, 7,
+228,238,215,135, 67,254, 64,227, 8,146, 5, 10,210,133,240,102,241,252, 5,149, 52, 77,227,237,149,127,140, 58,249,253,109,209,
+ 80,140,104,129,144,191, 27,122, 0,247, 32, 50,208,129, 43,134, 9, 60,237, 25, 13,242,123,147, 63,218,177, 0, 33,255,111, 44,
+ 6, 8,117,224,138,241,240,217,199, 86,111,143, 41,249,163,225,242,196,154,252,242, 44, 28, 33,127, 15,137, 1, 2, 25,184,162,
+ 25,215, 24,192, 98,115, 96,119,105,101,204,200,239, 46,127, 52,253,253,104, 90,254, 72, 4,179,132,252, 17,140, 1, 2,173,223,
+151,210,160, 14, 94, 64, 67,163, 1,111,124,188, 7,237, 86,123,204,201, 47, 87,128,104, 5,194,177, 36, 62, 33,127, 55,198, 0,
+193,148, 48,143,188,245, 57,159,164,140, 54,249,131,201, 2,117,231, 67, 47,129,248,253,132,252,221,220, 3, 4,146, 6,117, 39,
+195,145, 79,159, 4, 69, 81,224, 5, 17, 13,141, 6,188,246,225, 15,216,254,117, 89, 76,201, 31, 72, 38,168, 59,107,125, 66, 85,
+ 8, 66,254, 24, 5,193,129, 90,126, 79,132,144,142,177, 74, 5, 6,244, 77,193,138, 7,110,132,154, 83, 18,242, 19,242, 95,124,
+ 10, 16, 74,253,190,251, 49,173,154,195,228,107,134,197,252,162, 8,249, 9,249, 35, 22, 4, 7,147, 6,245,244,189, 13,203,239,
+234,118,242,135,227,239, 19,242, 95,162,105,208, 80,234,247,163, 61, 75, 90, 40, 74, 16,142,213,239,206,107, 32, 15,184,119, 99,
+ 15, 16,234, 35,140, 61,129,252,222, 20,152,144,159, 32,164, 24, 32, 24, 23,136,144, 63,194,214,137,144, 63,246, 10, 16, 12,249,
+ 77,102,171,203,119,221, 95,119,219, 69, 93,196,228,151, 72, 77,200,223,205, 61, 64, 32,254,255,201,186, 70,151,239, 85,214,156,
+239,246, 11, 10,181,182,159, 88,126,162, 0, 30, 45,168, 55,242,215,157,107,193, 11,111,127,227,242,189,213,111,126,137, 19,181,
+ 61, 79, 9, 2, 33,126, 79, 33,191, 55, 98, 19,242,199, 48, 8,246, 71,254,187, 30,223,132, 3, 71, 79,119, 57, 89,201,225,106,
+ 92,127,223, 63, 48,236,119,233,216,250,252,189, 72, 73,140,235,209, 89, 32, 66,126, 2, 69, 32, 46,144,251,235, 15,214,207,239,
+ 17, 1, 47, 33, 63, 65, 84,122, 0,127, 83,133,244, 84,242, 7, 18, 4,199,186, 48, 47, 18,138, 64,200,223, 13, 65,240,197, 74,
+254, 64, 31,137, 36,228, 39,240,168, 0, 23, 51,249, 3, 81, 2, 66,126,130,176, 98,128,158, 14,155,205,134, 19, 39, 78,120,244,
+243,163, 77,126,165, 82, 25,246, 57, 28, 14, 7, 42, 43, 43, 61, 42, 64,180,193,178, 44, 81, 0,187,221,142,170,170,170,110, 9,
+ 22,195, 37, 16,199,113, 13, 19, 38, 76, 72,235,206, 6,229, 56,174, 33,212,239,170,213,106,107, 94, 94, 94,183,174,211,171, 86,
+171,173,151,146, 2, 80,242,149, 30,199,143, 31,127,206,106,181,118, 59,129,246,236,217,147, 14, 2,130, 88, 43, 0, 1,193, 37,
+ 31, 4, 19, 16, 16, 5, 32, 32, 32, 10, 64, 64, 64, 20,128,128,128, 40, 0, 1,193,111, 21, 65,141,180,116,174, 35,188, 11,192,
+136,104, 9,196,178,108, 67, 81, 81, 81, 84,210,160, 68,126, 34,127,200, 10, 32, 45,162,221,185,142, 48, 74, 75, 75,209,175, 95,
+ 63,112, 28,231, 92, 42,213,125,192, 44,216,253,246,246,118, 76,157, 58, 53, 45,138,141,255, 93,231, 66,218, 23,173,252, 82,251,
+151,148,148, 32, 35, 35,163,139,252,222,228,243,244,252,182,251,251, 70,163, 17, 51,102,204,184,164,218, 95, 17,140,240,107,215,
+174,229, 38, 78,156, 56, 16, 0, 74, 75, 75, 97,181, 90,145,144,144,224, 92, 58,201,223,116,232,254,142,157, 60,121, 18,209,108,
+252,181,107,215,114, 5, 5, 5, 23,173,252,107,214,172,113,182,255,254,253,251, 49,124,248,112,196,199,199,123,148, 63,148,233,
+ 96, 78,157, 58,117,201,181,191, 34, 24,225, 39, 77,154, 52,208,249, 69,133, 2,242, 65,180, 64, 4,140,197, 42,139,191, 85,249,
+ 87,173, 90,197, 77,158, 60,217, 41, 63,195, 48,206,165,108, 35, 53, 23, 82,180,201,223, 19,219, 95, 17,160,229, 81, 77,154, 52,
+ 41,203, 37,122,238, 44, 44,115, 95,138, 52,220, 21,215,163,100, 57, 47,106,249, 87,173, 90,165,154, 58,117,106, 23,249,221, 93,
+129, 64, 31, 2,138,213,196,191, 23, 67,251,211,129, 8, 63,121,242,228,172, 46,154,211,233,183, 5,210,248,193,116,103,209,104,
+252,139, 89,126, 79,228,151,122,128, 64,229,239,142, 89,240, 46,150,246, 87,132, 34,188,252, 2, 34, 41,124,164,110,192,111, 69,
+126,111,228,247, 68,160, 72,144, 63, 82,229,226,129,180,255,206,157, 59,145,144,144, 0,149, 74, 5,133, 66,225,210,163,185, 43,
+134,167,160, 93,146,119,241,226,197,145, 85, 0, 55,159, 45,203,219, 23,149, 74,165,199,168, 61, 92, 82, 69,216,231,188,104,229,
+ 95,181,106, 21,231,141,252,114,249, 61, 17, 38,148, 89, 49, 34, 21,195, 4,218,254,119,220,113, 7,250,245,235,135,248,248,120,
+176, 44, 11,165, 82,233,236,213, 98,217,254,138, 64, 2, 22, 0,176, 90,173,168,169,169, 65, 77, 77, 13, 90, 90, 90,160, 82,169,
+186, 8, 28,174,240,225,222, 0,127,242, 87, 87, 87,163,182,182,214, 69,254,243,231,207, 59, 23, 3,239,223,191,191, 95, 57,171,
+170,170,156,190,235,101,151, 93, 22, 21,249,215,172, 89,227, 18,240, 74,242,159, 58,117, 10, 53, 53, 53,104,108,108,132, 90,173,
+ 14,104,174,163, 96,123,134,104,181,191,201,100,194,193,131, 7, 81, 86, 86,134, 35, 71,142,160,173,173, 13, 90,173,214,101, 1,
+246, 64, 45,191,252, 1,167, 37, 75,150, 68, 78, 1, 4, 65,216,213,153,167, 29, 40, 8, 2,234,235,235, 81, 81, 81,129, 99,199,
+142,161,169,169, 9,113,113,113, 72, 73, 73, 65, 66, 66, 2,226,227,227,157, 66, 7,154,126,139,118, 22, 37, 20,249, 75, 75, 75,
+113,219,109,183,225,179,207, 62,115, 90, 85, 79,126,165,244,126, 81, 81, 17,238,185,231, 30,108,222,188, 25, 57, 57, 57, 17,151,
+191, 51,207, 63, 80, 16, 4,212,213,213,225,232,209,163,168,168,168, 64, 99, 99, 35,226,226,226,144,148,148,132,164,164, 36,104,
+181, 90,159, 6, 40,214,228, 15,166,253,103,204,152,129,164,164, 36,232,116, 58,104, 52, 26,231, 88,128, 55, 62,197, 50, 11, 52,
+ 34, 39, 39, 7, 27, 55,110,196,137, 19, 39,192, 48, 12,122,247,238,141,212,212, 84,244,237,219, 23, 44,203, 66,161, 80,128,227,
+ 56,167,239, 38,247,165, 35,177, 16, 93,152, 8, 90,254,178,178, 50, 28, 56,112, 0, 20, 69, 33, 61, 61,221,171,245,145,182,189,
+123,247,162,168,168, 8,162, 40,226,190,251,238,139,138,252, 47,191,252, 50, 42, 43, 43, 65,211,180, 83,254, 17, 35, 70, 56,173,
+ 37,199,113, 80,171,213,206,215, 61,104,213, 75,175,237,191,103,207, 30, 80, 20,229, 92, 8, 92,161, 80, 56,221, 30,121, 12, 16,
+136,229,151,247, 0, 75,151, 46, 13,171,253,187,196, 0, 38,147, 9, 58,157, 14, 19, 39, 78, 68, 98, 98,162,139,127, 44,117,185,
+ 74,165, 18, 74,165, 18, 28,199,129,166,105,231,178,158,145,112,135,194, 69,176,242,151,148,148, 56, 63,179,111,223, 62,167,123,
+ 35,109,210,107,249,251,210,126, 52,228, 55, 26,141,208,104, 52,200,207,207, 71, 66, 66, 66, 23, 2, 72,132, 97, 89, 22, 44,203,
+ 58,219, 62,208, 65,164,104,199, 48,222,218,127,193,130, 5, 93,218, 95,165, 82, 57,247,221,149, 32, 86,252,233,162, 0, 90,173,
+ 22, 35, 71,142, 4,207,243,206, 28,173, 60,119, 43, 17, 94,169, 84, 58, 47,198,211, 40,100,168,238, 80,184, 8, 86,254,170,170,
+ 42,212,213,213,161, 95,191,126, 65,145, 84,167,211, 69, 69,126,141, 70,131,203, 47,191, 28,130, 32,116, 25, 40,146,218, 76,146,
+ 95,110, 61,165, 99,221,189, 24,136,183,246,127,227,141, 55,186,184,147, 18,111,188,101,128,124,197, 3,210,182,108,217,178,200,
+ 42,128,212, 53,201,211,108,158, 86,142,151, 91,126, 79,214,159,231,121,212,215,215,227,244,233,211, 56,119,238, 28, 26, 27, 27,
+209,210,210,130,182,182, 54,172, 91,183, 46,106, 55, 32, 88,249, 1, 56,201, 95, 88, 88, 8,154,166,145,151,151,135,156,156, 28,
+164,164,164,160,169,169, 9,229,229,229, 40, 42, 42,130, 32, 8, 40, 44, 44,132, 78,167,243,154,117,137,132,252, 44,203, 66, 16,
+ 4,175,105, 78,185, 34, 72,251, 99,199,142, 69, 67, 67,199,243,248,233,233,233, 40, 41, 41, 9,169, 52, 34, 90,237,255,240,195,
+ 15, 7,197,159,110,201, 2, 73, 3, 44,210,116, 28,158,186,121,249,107,134, 97, 96, 48, 24, 80, 91, 91,139,179,103,207,226,215,
+ 95,127, 69, 75, 75, 11, 12, 6, 3,204,102, 51, 12, 6, 3,244,122, 61, 90, 91, 91,161,215,235,157,251,235,215,175,143,218, 32,
+ 76,176,242,187,143, 78,206,155, 55, 15,153,153,153,206,247,250,244,233,131, 62,125,250, 96,240,224,193,216,186,117,171,203,231,
+163, 33,191,228, 31, 75,238,150,175,153,186, 37, 34,181,182,182, 34, 43, 43, 11, 21, 21, 21, 0,128, 25, 51,102,192, 96, 48, 32,
+ 57, 57, 57,230, 99, 0,222,218,127,195,134, 13, 30, 19, 11,238,214,125,209,162, 69, 49, 93,187,185,139, 2, 72,141, 42, 31,110,
+247, 37,200,179,207, 62,219,133,224,122,189, 30, 70,163, 17,130, 32, 32, 62, 62, 30, 67,134, 12,193,232,209,163,145,157,157,141,
+167,159,126, 58,170, 55, 33, 88,249, 1,160,161,161, 1,105,105,105,200,203,203,115, 33, 63, 69, 81, 78, 55, 36, 51, 51, 19,121,
+121,121, 0, 58,170, 14,213,106,117, 84,228,151,206,227,137,252,130, 32,224,209, 71, 31,197,153, 51,103,240,204, 51,207, 96,196,
+136, 17,160,105, 26,122,189, 30,227,198,141,195,233,211,167,157,189, 65,107,107, 43, 82, 82, 82, 64, 81, 20,126,249,229, 23, 44,
+ 90,180, 8, 3, 6, 12,192,107,175,189,230, 50, 6, 18,233, 76,144,183,246,127,244,209, 71,163, 50,240, 24,110,251,251, 92, 35,
+ 44, 16, 65,222,125,247, 93,208, 52,141,254,253,251, 99,200,144, 33, 24, 63,126, 60,134, 12, 25,130,236,236,108,100,103,103, 59,
+ 51, 43,210,119,188, 41, 64, 36, 39,173, 10, 54,245,151,150,214, 81, 65,155,147,147,227,114, 14,119, 72,199,213,106,181,199, 2,
+174, 72,201,238,109,116,247,177,199, 30,195,232,209,163,241,204, 51,207, 96,233,210,165, 72, 79, 79,199,220,185,115,241,254,251,
+239, 99,236,216,177, 48,153, 76,160,105, 26, 57, 57, 57,216,188,121, 51,230,206,157,139,109,219,182,129,231,121,108,221,186, 21,
+159,124,242, 9, 22, 44, 88,128, 55,223,124, 51,170,165, 28, 20, 69,225,240,225,195, 80, 40, 20,184,252,242,203, 35, 90,236, 22,
+105,227,233,119,165,248, 64,162,238,211,167, 79, 67,165, 82, 5, 76,184,104, 79, 87, 24,172,252, 18, 82, 82, 82,156,251,238, 1,
+180,251,113,247,152, 34,146,240,214,142,146,229, 23, 4, 1,155, 54,109,194,127,254,243, 31,172, 88,177, 2,243,231,207,199,204,
+153, 51,113,224,192, 1,208, 52,141,155,110,186, 9,241,241,241,120,231,157,119,176, 96,193, 2,164,166,166,162,173,173, 13,179,
+103,207,198,206,157, 59,163, 94,202, 65,211, 52, 56,142,195,176, 97,195,160, 80, 40,192,243,124,196,210,228,145, 54,158, 62, 87,
+138, 15, 52,107,227,141,252,222, 26, 56,154,228, 15, 69,254,166,166, 38,103,192,219,167, 79, 31,175,231,110,106,106, 2,208, 49,
+253, 34,203,178, 81,155,107,212,155, 2,255,253,239,127,199,146, 37, 75,240,230,155,111, 98,207,158, 61,200,205,205,197,167,159,
+126,138, 51,103,206,160,164,164, 4, 22,139, 5, 42,149, 10,229,229,229, 24, 62,124, 56,198,140, 25,131,134,134, 6, 28, 61,122,
+ 20, 67,135, 14,197,147, 79, 62,233, 76, 64, 68, 43, 11, 39,157, 39, 39, 39,199,133,252, 47,190,248,162,139, 81, 9,118,212,215,
+219,177,167,158,122, 42,188,152, 43, 16, 2,249, 11, 60,130, 77,115, 70,179,126, 62, 20,249, 37,203, 94, 94, 94,238, 84, 0,249,
+ 57,164, 56,160,188,188, 28,192,133, 57, 52,163, 65,126, 95,237,154,147,147,131,126,253,250,225,219,111,191,197,168, 81,163,112,
+248,240, 97,148,151,151,163,162,162, 2, 95,127,253,181,115,240,105,244,232,209,152, 59,119, 46,134, 14, 29,138,182,182, 54,164,
+164,164,224,244,233,211,136,139,139,195,200,145, 35,163, 58, 14, 32, 63,143,220,242,187,199, 0,225,150,204, 68,138, 63,138, 96,
+253, 80, 79,214, 59,216, 72, 61,218, 19,237, 6, 43,191,132,162,162, 34, 12, 30, 60, 24,153,153,153,112,159, 49,175,166,166, 6,
+ 69, 69, 69,136, 54,252,185,138,119,222,121, 39, 10, 11, 11,177, 99,199, 14,148,151,151, 99,199,142, 29,216,189,123, 55,150, 47,
+ 95,142,113,227,198, 1, 0,138,139,139,177,112,225, 66, 60,242,200, 35,152, 53,107, 22, 88,150,197,178,101,203,240,224,131, 15,
+198,164, 28,218, 83,251,191,240,194, 11, 93,122,128,112, 44,191,180,191, 98,197,138,232, 41, 64, 32,218, 25,168,171,225,237,153,
+213,104, 42, 64,160,242, 75, 55, 70, 16, 4,108,221,186,213,231, 56,128,183,248, 32, 90, 10, 44,245, 64, 6,131, 1, 45, 45, 45,
+216,182,109, 27,230,207,159,143,179,103,207,162,162,162, 2,187,119,239,198,247,223,127,143,196,196, 68,231,231, 51, 51, 51, 49,
+125,250,116,228,231,231,163,160,160, 0,105,105,105,152, 54,109, 26,222,121,231, 29,204,159, 63, 31,169,169,169, 72, 74, 74,138,
+218,179, 12,158,218,255,177,199, 30,139,152,191, 31, 73, 89, 21,225,100, 80,130,125, 32, 35, 22,115,243,135, 42,191, 52, 16, 22,
+204, 13,142,149, 2,228,229,229, 33, 43, 43, 11, 99,199,142, 69,126,126, 62,102,206,156,137,146,146, 18,236,218,181, 11,203,151,
+ 47,119, 33,191,180, 37, 36, 36, 96,197,138, 21,216,182,109, 27,150, 45, 91,134,169, 83,167,226,220,185,115,120,225,133, 23,112,
+224,192, 1, 52, 54, 54,226,212,169, 83, 81,115,129,220,183,245,235,215,187, 60,253, 21,142,229,151,255, 86, 84,122,128, 96,179,
+ 40,221,161,185,209,200, 2,245, 4,120,114, 21,207,157, 59,135,138,138, 10,212,213,213,193,100, 50,225,208,161, 67,176,219,237,
+168,172,172,196,184,113,227,188,182,121, 94, 94, 30, 94,121,229, 21,172, 94,189, 26,245,245,245,184,245,214, 91,193,113, 28,180,
+ 90, 45,122,247,238, 29, 53, 23,200, 83,251, 63,254,248,227, 61,202,242, 71, 52, 11,212,147,200, 31,138,252,102,179, 25, 26,141,
+ 38,224, 82, 8, 65, 16,162,218,155,121, 35,165,124,244, 87,173, 86, 59, 71,178,125,181,189,188,196,216, 93,230,104,142,193,184,
+203,181,110,221, 58,143, 61, 92, 40,150, 63,234, 61, 64, 48, 3, 23,254,110, 64,119,173, 44, 19,140,252, 26,141, 38,168, 82,136,
+104,147,223,189, 93,211,211,211, 49,125,250,116,140, 27, 55, 14, 57, 57, 57,184,233,166,155,112,226,196, 9,140, 25, 51, 6,197,
+197,197,200,204,204,244,120,109,251,246,237,195,172, 89,179,208,222,222, 14,173, 86,139, 45, 91,182,160,178,178, 18,135, 15, 31,
+ 70, 70, 70, 70, 84,221, 82,119, 89, 22, 45, 90,212,173, 79,170,133, 60, 18,236, 47,144,244,149, 6, 61,120,240, 32,182,111,223,
+142, 51,103,206,160,166,166, 6,201,201,201, 61,138,252,238, 13, 43, 47,133,144, 7,200,238,165, 16,177,144, 95,126, 29, 37, 37,
+ 37, 48, 24, 12,104,109,109,197,219,111,191, 13,150,101, 49,126,252,120,204,155, 55, 15,127,253,235, 95, 49,125,250,116,103,233,
+180,116,109, 70,163, 17,133,133,133,216,191,127, 63,172, 86, 43,118,238,220,137,214,214, 86,172, 88,177, 2, 41, 41, 41, 72, 78,
+ 78,142, 42,249,139,139,139,193, 48, 12,198,142, 29, 11, 0, 88,179,102,141,215, 94, 34, 88,203, 31,213, 30, 32,216, 28,173, 39,
+ 5, 16, 4, 1,111,189,245, 22,244,122, 61,180, 90, 45,218,219,219, 81, 91, 91,235,172,183,239, 41,228,151,228,151,106,123,228,
+165, 16, 18,241,229,227, 0,210,241,104,186, 64,222,220,183,228,228,100,164,166,166, 98,206,156, 57, 88,178,100, 9,102,205,154,
+133,236,236,108, 44, 90,180, 8,249,249,249, 88,177, 98, 5,242,242,242, 64, 81, 20,246,237,219,135,194,194, 66,252,243,159,255,
+ 68, 92, 92, 28,204,102, 51,182,108,217,130, 45, 91,182, 32, 59, 59, 59, 38,150,159,101, 89, 12, 29, 58,212, 89,215, 36,127,120,
+ 61,152,146,237,104,195,107, 16,236, 73,176,195,135, 15,227,179,207, 62,195,217,179,103, 81, 83, 83,131,164,164, 36,143, 55,107,
+229,202,149,168,174,174,198,128, 1, 3,160,215,235,209,212,212,132,246,246,118,240, 60,143,244,244,232,175,126, 20,236, 52, 26,
+ 82,109,143,167, 82, 7,249,120,128,116, 60,218,217, 44, 95,114,111,221,186, 21, 15, 62,248, 32,154,155,155,209,220,220,140, 89,
+179,102, 97,194,132, 9,216,182,109, 27, 54,110,220, 8,134, 97, 48,107,214, 44,236,223,191, 31,113,113,113,206, 1,176,185,115,
+231, 98,211,166, 77,120,233,165,151,162, 46, 63, 77,211,184,250,234,171, 93,138,250, 86,175, 94,237,215,226, 7,106,249, 99,214,
+ 3,200,107,251,223,123,239, 61,152,205,102,196,199,199,163,186,186, 26,117,117,117, 40, 46, 46,118, 33,132,116,147, 62,248,224,
+ 3, 40,149, 74, 84, 85, 85,193,108, 54,163,161,161, 1,173,173,173,224,121, 30,119,223,125,119,183,165, 65,253,101,129,228,165,
+ 16,238,228,151,142,199,218,133,147,203,125,228,200, 17,212,213,213, 97,234,212,169, 56,118,236, 24,250,247,239, 15,157, 78, 7,
+149, 74,133, 39,158,120, 2, 43, 87,174, 4, 69, 81, 48,155,205,176,217,108,104,111,111,119,246, 0,183,223,126, 59,110,185,229,
+ 22, 28, 58,116, 8,163, 70,141,138, 73, 18, 66,158,246, 92,178,100,137,223, 88, 44,150,150, 63,224, 24,128,162, 40,252,227, 31,
+255, 64,125,125,189, 79,139, 46, 23, 94,167,211, 57,171, 1,121,158,135,221,110,135, 40,138,120,242,201, 39,177,108,217,178,110,
+ 25, 11,240,149, 5,146,106,123,228,165, 16,158,226, 0,169, 20, 34,218, 46,144, 55,185, 23, 47, 94,140, 55,223,124, 19, 6,131,
+ 1,131, 7, 15,198,151, 95,126,137, 87, 95,125, 21,247,222,123, 47,102,204,152,129,250,250,122,103,134,104,231,206,157,206,138,
+208,219,111,191, 29, 10,133, 2,133,133,133,120,232,161,135,240,195, 15, 63,196,188,253, 87,175, 94,237,181, 22, 40, 88,203, 31,
+245, 44,144,187,240,219,183,111, 7,203,178, 30, 45,250,156, 57,115,186,104,238,187,239,190,139,133, 11, 23,162,182,182, 22,113,
+113,113, 72, 78, 78,198,210,165, 75,113,245,213, 87,119,171, 5,245,102,121,164,218,158, 64, 75, 33, 98,229, 2,185,203,221,191,
+127,127,124,250,233,167,152, 57,115, 38,238,191,255,126, 12, 26, 52, 8, 27, 54,108,192,214,173, 91,209,212,212,132, 59,238,184,
+ 3, 20, 69, 97,243,230,205,104,109,109,197,150, 45, 91,176,105,211, 38,220,114,203, 45, 40, 44, 44,196,215, 95,127,237,146,225,
+138,101,251, 47, 93,186,180, 71, 89,254,160,130,224,184,184, 56,252,242,203, 47, 93, 44,250,178,101,203, 92,158,201,148, 48,104,
+208, 32,124,242,201, 39,221, 58,144, 20,108, 29,144,100,217, 3, 41,133,136,197, 53,120,146,253,181,215, 94,195, 3, 15, 60,128,
+207, 62,251, 12,235,214,173,195, 21, 87, 92, 1,138,162, 48,127,254,124,172, 91,183,206,169,200,149,149,149, 88,177, 98, 5,178,
+179,179,177, 97,195, 6, 28, 60,120, 16, 15, 61,244, 16, 50, 51, 51,177,101,203,150,110,105,255,231,159,127,222,111, 53,104, 40,
+191, 21,181, 30, 64, 46,252, 91,111,189,133, 39,158,120,194, 25, 80,201, 45,122, 79, 28, 81, 13,118, 26, 22,201,165, 9,180, 20,
+ 34,218, 46,144, 55,217,149, 74, 37, 54,109,218,212,229,120,106,106, 42, 14, 30, 60,232, 28,207,248,249,231,159,145,146,146,226,
+252,220,168, 81,163,162,238,246,248,187,134, 39,158,120,162, 71,142,200, 7,148, 5, 26, 52,104, 16, 62,252,240,195,139,166,156,
+ 32,216, 44, 80,176,100,238,142, 44,144, 47,242, 36, 37, 37,161,169,169, 9,189,122,245, 2, 0,100,100,100, 56, 31,135,236, 41,
+237,255,220,115,207,121, 29, 3,136,165,197, 15, 41, 11,116, 49,214,210,132, 34,127,160,165, 16, 61, 73,126,233,125,121, 97, 91,
+119,141,190,251,146,127,249,242,229, 61,146, 63, 1, 5,193,209,122,122,168,187,131, 96,119,151, 38,208, 82,136, 88,215, 2, 5,
+ 90, 54,208,221,228,191, 24,249, 67, 95,234,228,151,187, 52,238,165, 16,242,207,201, 75, 33, 98,233, 2, 5, 50, 1,238,165, 74,
+254,167,159,126, 26, 14,135, 35,122, 61,192,197, 70,254,112,229, 15,180, 20,162, 39,100,177,122, 34,249, 99,205,159,112,159, 7,
+246,216, 3,248,203, 68, 92, 12, 8, 86,126, 41,189, 25,104, 41, 68,180,211,161, 23, 51,249, 47, 54,254,116,233, 1,236,118, 59,
+170,170,170,188,206,224, 21, 77, 40,149,202,176,207, 17,138,252,146, 75,227, 62, 43,132,148,183,150,148, 64, 42,133,144, 62,127,
+252,248,241,136,203,223,214,214,134,147, 39, 79, 6, 52,147, 70,164,137,213, 93,237,223,157,252,161,228, 22,110,252,248,241,231,
+172, 86,107, 90,119,106, 36,199,113, 13,123,246,236, 9,169, 98,238, 98,151, 63, 47, 47,239,156,205,102, 35,237, 31, 67,249, 41,
+247, 33,127, 2,130, 75, 9, 52,105, 2, 2,162, 0, 4, 4, 68, 1, 8, 8,136, 2, 16, 16, 16, 5, 32, 32,184, 84,160, 32, 77,
+ 64, 16, 43,116,174, 35,188, 11,192,136,104,253, 6,203,178, 13, 69, 69, 69,233, 68, 1, 8,122, 34,249,191,235, 92, 7, 25,165,
+165,165,200,200,200,112, 89,112, 93, 94, 99,229, 62, 33,152,251,190,167,105, 18,205,102, 51,166, 77,155, 22,212, 56, 4, 81, 0,
+130,152,145,127,237,218,181,220,196,137, 19, 7, 2, 64,105,105, 41, 44, 22, 11,226,227,227,157,139,100, 7, 82,248,231,235,248,
+169, 83,167,130,119,129,180, 90,117,161,213,106, 91,198,243, 66, 64,202, 64, 81,148, 77, 20,197, 66, 81, 20, 87,246,132,198,213,
+106,181,163,173, 86,235, 40,158,231, 3,141,103, 4, 0,165,162, 40, 30, 36,242,199,142,252,107,214,172,225, 38, 77,154, 52,208,
+ 25,124,210,180, 75, 77, 85,119,205, 26, 77, 91,173,182,101, 21, 71, 15, 43,236, 54, 51, 2,217, 78, 28, 63,102, 7,240, 84, 79,
+105, 96,171,213, 58,234,216,209,159,105,155,173, 13,129,108,149,149,149, 2,128,209, 68,254,216,145,127,245,234,213,170,201,147,
+ 39, 15,148, 31,147,175,208, 25,238,242, 73,225, 20, 3, 42,120, 94, 80,100,102, 13, 68,123, 91, 51, 4,158,239,124,251, 66,121,
+132,123,161, 68,159,244,228,115, 0, 6,245,148, 70,230,121,158, 30,144,149, 5,171,185, 5,188,157,247,251,249,140,244, 20, 51,
+128,120, 34,127,236,200, 63,101,202,148, 44,247,227,242,181,129, 35,185,118, 88,200, 89, 32,158,119, 64, 16,188, 60, 92, 32,211,
+ 2, 65, 20,248,158,216,224,188,157,135, 0,187,119,167,225,194,117,138, 68,254,238, 37, 63, 0,231, 10,247, 82, 15, 16,169,133,
+243,130,118,129, 92, 8, 46,202, 55,209,185, 88,179,203,159, 40, 40, 0, 88, 40,138,202,232,113, 45, 47,184,110,188,180,225,194,
+ 6, 70,160, 0,240, 20, 69,105,137,252,209,245,249,189,145, 31, 0, 56,142,243,152,201, 9,228, 41,184,136,175, 20,111,104,109,
+ 64,217,222,143,209,110,110,237,208, 5, 81,102,244,157,251, 29, 59, 12,163,232,181,112,225, 35,150,245,235, 95,170, 81, 40,152,
+ 46, 61,132, 8, 80, 93,220, 40, 17, 93, 36, 19, 69,209,229, 61,134,166, 29,156, 74,241,108, 91,155,181, 48,216,139,208,183,156,
+ 71, 89,209,246, 14, 55,194, 15,193, 40,134, 81, 47, 92,248, 48,191,126,253,134,255, 39,173,104,238,197, 38,203,172, 46,252,182,
+ 44,195, 48, 2,199,209, 7,218,218,108, 63, 93,106,242,123,202,246,200, 3,222,206, 88, 7,213,213,213,168,173,173, 69,115,115,
+ 51, 84, 42,149, 71, 34,119,203, 66,217, 12, 67, 65,171, 85,129,161, 53, 78,162,139,157,204,117,233, 32, 58, 94,235,230,255,113,
+ 22, 30,127,228, 1,240, 98, 71,223, 76,137,148,143,124,173,139,138,119,252,115,211,122, 0,168,169,169, 81, 92, 61,118,234, 50,
+ 0, 65, 43,128,146,166,161,211,169,160,100, 52,174, 94, 3,207,123,162,132,242,191,255, 56, 27,143, 63,242, 23,240,146,111, 33,
+ 56,149,208, 75, 23, 41,177,196, 35,117, 0, 0,181,181,167,232, 49, 99,175, 29, 5,224,167, 75, 77,126,167,204,130,176,107,253,
+250,245,108, 65, 65,193, 64, 65, 16, 80, 95, 95,143,163, 71,143,226,216,177, 99,104,108,108, 68,124,124, 60,146,147,147,145,144,
+144, 0,157, 78,231, 18, 7, 68, 34, 22, 8, 41, 8, 6, 0,135, 67,128,222, 96,134,185,205,212,225,250,200, 76,183,232, 18, 7,
+116,188, 58, 80,252, 37, 56,117, 28,104,154,113,237, 33,220,194,103,151, 71, 13, 68, 23,235, 47,239, 29, 0,136,104,105,213, 67,
+ 16,132,144,198, 37,236,130, 0,189,222, 12,179,217, 8,240,240, 97, 69, 59,152, 82, 86,242, 37, 84,170, 78,249, 93, 93,108, 23,
+186,241,130, 95,227,234, 68,139, 94,143, 32, 82,153,191, 41,249,101, 24,145,147,147,131,141, 27, 55,162,178,178, 18, 12,195, 32,
+ 45, 45, 13, 41, 41, 41,232,219,183, 47, 88,150,133, 66,161, 0,203,178, 80,169, 84, 80, 40, 20,206, 88, 32, 82,129,112, 72, 10,
+ 64, 51, 20,180, 90, 14, 12,165,242, 72, 78,207,251, 14,160, 51,104,147,247, 16,148,236,187,148,139, 27, 36,202,222,239, 84, 16,
+ 0, 84,231,121, 41,209, 22,114,171, 51, 52,160,137,227, 64,211, 26, 64,150, 91, 22,186,220,116, 94,118,255,237, 78,249,105, 15,
+ 95, 16, 0, 48, 46,209,103, 23,199,194,141,155,214, 75, 86,126, 57,140, 70, 35,226,226,226, 80, 80, 80,128,196,196, 68,103,206,
+ 95,250, 47,205,112,199,178, 44, 56,142, 3,195, 48,224, 13,191,162,242,229, 63,194, 84,127, 2,234,212, 62,232,115,221,253,232,
+123,221,159, 98,151, 5,226, 29, 2, 12,134, 54,152, 77, 38,167, 29,119,181,222,162, 71,203, 46, 87, 10,207,150,221,165,227,112,
+ 59,175,235,111, 24, 77,237, 97,101, 80,140,122, 19,204, 38, 83,231, 45,231,187, 88, 60,127, 86,181,163, 11,247, 98, 44,121, 31,
+166,211,121,227, 45,151,172,252,114,104,181, 90,228,230,230,130,239,116,223,220, 75, 23,104,154, 6,195, 48, 80, 42,149,206,255,
+245,223,191,139,120,241, 87, 76,248,195, 52,152,205, 54, 28,248,250,101,180, 85, 31, 68,246,127,189, 8,202,205, 77,138,116, 22,
+168,179, 7,160,161, 85,115,160, 68,149, 71,114,250,238, 21,124, 17,219,237, 60,178,232,218, 61,198,176,217,194,152,223, 69,201,
+ 64,163,225, 0,112, 30, 83,135,130, 7, 75,232,219, 26,194,179, 21,134,224,193,146, 74, 65,158,253,210,149,223, 45,189,201,178,
+172,199,137,112,229,164,101, 24,198, 89,254,208,123,220, 45, 56,242,239,183,208,124,166, 30,189, 47, 27,141,252,153,105, 56,244,
+ 99, 41, 14, 61, 61, 3,151, 47,254, 8, 92, 66,106, 80,235, 80,135,208, 3,240,208, 27,219,209,102, 50,249, 32,185,220,154,123,
+ 39, 54,220,131,103,209, 67,108, 32, 63, 79,231,126,155, 57,244, 30, 64,176,243,157, 62,180,201,171, 37,116,181,134,188,255,116,
+164,243,159, 16,208,121, 44, 22,235, 37, 43,191,187, 2, 72,217, 41,249, 2, 25,238,171, 86,202,211,157,218,126,195, 48,124,241,
+199, 40, 91,123, 39, 70,216,129,126, 87, 78,192,149,215, 77, 69,213, 79, 37,248,105,201, 4, 92,177,108, 7,226, 6, 92, 22,149,
+ 64, 88, 33,105,166, 70,211,209, 3,136,110,126,203, 5, 87,198,179,245,118,241,239,221, 93, 38,209, 45, 56, 22,157,148,151,157,
+171,227,188,118,123,232, 61, 0,205, 48,208,104, 84,174, 22, 20,192,254,210, 74,236, 46, 58, 14,163,217, 10,187,213, 2,179,197,
+ 14,171,213, 14,139,197, 10,171,213, 2,139, 37, 50, 86, 79,150, 74, 4, 69, 81,243, 61, 26,121,165, 82,200,205,205,174, 40, 45,
+ 61,242,227,111, 77,126,247, 92,190,167, 1, 46,209,110,197,233,119,151,192,112,244, 71,240, 86, 43, 68, 81,232,224,137, 32,116,
+236, 3,160,104, 26, 63,255,116, 28, 84, 66, 6,250, 93, 54, 28,131, 70, 95,131,248,228, 36,148, 61, 53, 29,195, 31,252, 39,122,
+ 95, 61,195,239,106,165,161,245, 0, 60, 15,131,193,140, 54, 83,155,171,239, 47, 39,189,232, 94, 30,209, 53, 67, 36,122, 32,182,
+ 63,215, 71,218, 55,182,133,238,131, 10, 60, 15,189,201, 12,179,209,236,242,254,238,162, 10,124,248,225,199, 72, 77,237,214,153,
+ 58, 0, 0,167,170, 79,209,185, 87,140, 29, 6,224,199,223,154,252,158, 6,179,220, 21,224,220, 87,175, 65,107,169,195,149, 55,
+ 95, 15, 5,203,130,162, 21,160, 24, 69,231,127, 6,160, 24,128,162, 59, 54, 5, 7,209, 97, 5,236,102,244,250,221, 80,228, 39,
+245,194,254,215,255,130,182,211, 11, 48,232,247,139,124, 46,178, 17,114, 15,160,213,176,128,168,114, 33,231,129, 67, 39,241,195,
+222, 10,152,219,109,176, 90,237,176,217,236,176,118,110, 29,251, 14, 88,173,118,103,192, 19, 46,104,154, 22, 40,138, 18,189, 52,
+108,187, 40,138,203, 68, 81,124,193, 83,174, 91,167,225, 0, 94,229,102,181,104,164,166,166,162,249,252, 47,176,243,246,110, 37,
+144, 89,223, 8,187,221,238, 49,205,232, 95,254, 10, 8,188,165,199,202,239, 73, 9,228, 10, 64,211, 52, 4, 91, 59, 52, 26, 53,
+ 88, 88, 65,241, 60, 32, 42, 0, 81, 9,208, 10,136, 80, 1,124, 27, 64, 43, 58, 20,193,110,238,224,161, 82, 5, 56,172,208, 38,
+ 38, 96,194, 31,110, 65,233,151,239,192, 84,125, 24, 87, 44,124, 7, 20, 69, 71, 48, 11,196,243, 48,152,204, 48, 25,218, 92, 44,
+251,190,210, 74,188,247,193,118,164,166,164,198,170,157,189, 54,112, 93,125,157, 58,103,248, 85,171, 0,188,224, 49,143,110, 52,
+195,168, 55,187,249,199, 12,120, 0,118,187, 21,118,187,185, 91, 9,228,235,247,125,201, 47,125, 87,250,109,244,155, 0, 0, 15,
+139, 73, 68, 65, 84,176, 91,122,172,252,222, 20, 64, 78,208,180,201,243, 80,189,249, 17, 28, 43,251,218,101, 36,148,102,148,184,
+108,250, 31, 48,160,175, 14, 52, 4, 80,140,162,147, 6, 2, 68,222, 1,128, 2,120, 27,148, 20, 48,118,246,141, 56,240,239,239,
+112,244,159,143,227,242, 5, 47, 70,100,218, 69,103, 15,160, 86,115, 16, 29,156,139,203,194,178, 92,199, 28,249, 13,229,224, 29,
+221,123, 3,172, 70, 19,236, 14,135,210,115, 30,157,134, 70,163, 4,236, 92,103,144,215,225, 83,114, 42,165,223,244,159, 39,180,
+181, 89,152,219,231, 46,186,231,195,119, 87,111,214,106, 85, 62,190, 28,196,121,121, 95,227, 0,222,229,151, 50,255, 60,130,155,
+143,244,127,191,252,177,239,187,239,125, 49,254, 68, 85, 77,142,213, 98,211, 90,109, 14,117, 74,114,252,153,204,254,125,170,102,
+207,158, 92,124,215, 31,174,175, 14, 46, 87, 27, 56,249, 61,109,234,180, 44,228, 44,221,225,236, 17,108, 77,245, 40, 95,119, 23,
+134,142,157,128,140,172, 94, 16,173, 6, 80, 12, 11, 42,121, 16,232,129, 5,160,226, 51, 0,138,134,216, 90, 3,225,196, 55, 16,
+206, 30, 4,218,155, 49,114,210, 68,236,217,177, 19,167,191, 30,133,204,233,247,134, 61,237, 98,103, 15, 32,192,104, 48,195,100,
+108,115,241,203,133,206,224,196, 97,111,135,195,238,158,165,137,109, 81,162,193,208,234,253,222, 8, 2,140,122, 51, 76, 38,147,
+107,114,131,151,229,252,130,112,211,238,156,183,120,222,241,202,154,209,119,206, 91,204,127,246,225,250,205,145,144, 95,240, 65,
+224, 72,202, 95, 87,127, 94,245,167, 7,254,246,199,170, 83,117, 93,214, 66, 61,255,107, 75,214,249, 95, 91,178, 74,202,202,167,
+252,207,251, 95,236, 95,249,212,130,237, 35,134, 15, 49,132, 43,191, 7, 87,214,171, 50,208, 52, 13,227,137,159, 80,249,234,253,
+184,114,230, 77, 72, 74,100, 33,182,253, 10, 40, 84,160, 6, 78, 4,147, 61, 19,148,252,209,200,180, 17,160,123, 15, 7,127,236,
+ 11, 56, 14,109, 3, 99,105,196,152,233, 83,177,251,237, 39, 48,224,218,187, 65, 43,185,240, 93, 14,154,166,160, 81,179,208,104,
+ 56,104, 53, 28,180, 26, 21, 52, 26, 14,106, 21,235, 12,128, 69, 81,232,214, 13,162,224,199,130,118,200,172,235,220, 52, 26, 14,
+ 42,141, 74,118,243, 2,219, 22,175,216, 48,225, 68,213,233,145,162, 40,210, 39,170, 78,143, 92,188, 98,195, 4, 4,241,125,239,
+ 27, 31, 19,249,239, 89,240,244,189,158,200,239,110,168,143, 86,156, 26, 59,111,254,211, 11,143,252, 82, 25, 31,174,252,129,244,
+ 0, 18,249,207,255,248, 17,170,254,249, 23,140,189,229, 54, 36,105,108,128,185,177,227,222,198,247, 3, 53,248,122,240,130,128,
+242,234, 70,124,252,159,227,216,250,101, 57,126,248,185, 14,102,171, 29, 24, 50, 29,162,185, 25,142,159,223, 7,123,182, 8,189,
+250, 15,192,249,178,111,194, 79,219, 58,123, 0, 83, 59, 12, 6,115,215,154, 29, 81,236, 16, 80, 12,174, 11, 22, 35,220, 67,136,
+190, 44,168, 93,128,222,100,134, 73,111,118, 79,175, 72, 85,101, 16, 2,184,129, 95,127,187, 63,253,171, 93,123,103,216,237, 14,
+117,135,223,235, 80,127,181,107,239,140,201,147, 70, 85, 94, 55,229,154,115,209,234,221,252,203, 47, 89, 97,255,215,240,208,159,
+111,223,241,248,146,151,114,120, 94, 80, 14, 30,212,255,167, 27,103,230,255,144, 55,110,196, 25,157, 70,237,216,245, 93,201,128,
+157,159,255,152,127,162,234,244, 85, 0, 96, 48,182,245,190,231,129,191, 61,188,235,243,151,158,139,215,105, 29,145,186, 30,143,
+ 51, 90, 83, 20,170,223, 43, 68,123,101, 17,198,223,114, 51, 88,235,175, 16,237, 14, 80, 52, 3, 80, 60,196,172, 2,240,130,136,
+170, 51,173,248,170,184, 22, 14, 94, 64,217,241,243, 56, 81,223,138,255,186,113, 56,230, 93, 55, 12,226,184, 71,129,202,175, 32,
+154,206,163, 79,223, 43,112,122,215,102,244,185,230,134,240, 21,128,166, 41,168,212, 44,120, 7,235, 82, 10,173, 86,113, 78,242,
+137, 98,164,231,196, 15, 82, 65,124,253, 62, 3,104, 56, 14,130,198, 53, 68,224, 56,213, 5,218,248, 17,191,185,197,168,124,234,
+153, 77,127, 50,181,181,187, 44, 18, 96,106,107, 79,121,234,153, 77,127,186,106,100,206,234,228, 36, 93,200,169, 36, 94, 8, 85,
+254, 78, 5, 14,240, 57,164, 27,174,205, 59,115,160,236,248,219, 0,176,124,241, 31, 75,228,199, 6,221,211,239,232,253,247,220,
+114,116,229,250,119,126,218,242,206,231,255, 37,138, 34,221,210, 98,204, 40,252,251,155, 19,214,175,124,232, 59,223, 62,144, 16,
+ 84, 15, 32, 31, 19, 16,108,237, 40,127,233, 30,232, 88, 1,215, 92, 63, 25,140, 96, 70, 59,155, 14, 7,197, 33,206, 92, 9, 10,
+ 20, 4,109, 31,136, 14, 7,246,254,114, 14,103,154,218, 80, 90,113, 14,166,246,142,230,254,240,187, 74,220,150,159, 5,174,119,
+ 46,104,138,134,216,222,130,132,140,120, 28, 61, 88, 18,153,172, 11,207, 11, 48,153, 44, 48, 24,218,161, 55,154, 97,232,220,120,
+ 94,144, 30,130,137,194, 38, 6,176,185,126,222,215, 56,128,201,108,134,209,104,133,222,104,118,110, 78,210, 8,254,187,248, 57,
+247,174,248, 83,123,187, 37, 94,171, 85, 55,201,207,173,213,170,155,218,219, 45,241,115,238, 93,241,167,142,126, 36,180,205,103,
+ 53,143, 79,249,133, 78,229,241,190, 89,173, 22,250,131,143,119,101, 73,175,151, 47,158, 87,178,124,241,188, 18,111,159, 95,250,
+232,156,178,105,147,175,218, 33,253,254, 55,223, 22,207,180, 90, 45,244,209, 99, 85,186,255,253,170,168,175,167,239,240, 65,246,
+ 0,206, 96,183,229, 44,126, 94,113, 45,210, 83, 53,200, 29,147, 3,198,209,134, 86,189, 5,223,109,126, 13,130,185, 5,160, 24,
+136,188, 13,188,195, 1,158,231, 81,255,171, 17,223, 31, 60,237, 36, 63, 0,168, 88, 6, 16, 5,216,237,118,233, 7,192, 40, 89,
+216,219, 77,145,113,129,104,154,130, 90,165,132,195,198,202, 71,178,160, 86,179, 78,235, 27,249, 30, 32,200, 14,192,135, 2,208,
+ 12, 3, 78,165,132,221,170, 4,112,193,138,106, 52, 23, 44,168,191,177,138,207, 63, 94,253,154,180,127,217,232, 57,175, 75,251,
+165,187, 55, 61,113,193,140,135, 49,222,225,227,171,225,202,191,112,217,203, 83,190,219,125, 96,198,231, 95, 21,237,121,107,227,
+146,127,209, 52,237,183,123,125,250,137,251,190,253,110,119,217, 13, 14, 7,207, 89,172,182,248, 9,215, 63,176,162,221,108,213,
+221,125,215,244,119,166, 79,187,250, 76, 87,249,249,160, 21,192,114,190, 6, 71,158,157,141,220,130,124,164,247,142, 3, 4, 7,
+ 26,206,233,113,232, 63,223, 35,174,223, 80,216,219,244,160, 18, 24,136,150, 54, 8, 77, 39,208, 14, 13,134,244,213,192,253, 86,
+ 79, 25,217, 7, 60,239, 0,234,127,234,240, 4,148, 26,216,236, 34,212,201,105,145, 81,128,142, 30,160, 29, 6,231, 72,100, 71,
+173, 15, 47, 8,178, 71, 35,187, 91, 1, 4,159, 22,212,108,180,194, 40, 27, 73, 21, 58,199, 55, 46,144, 47, 84,249, 35,117,221,
+225,202,239, 37, 63,239,112, 80, 37,101,199,198, 90,109,246,184,146,159,142, 78,189,118,246, 35, 89,175,190,248,248, 27,217,131,
+250,123, 52,143, 13, 13,205,220,252,191,174,158,219,220,108, 72, 19, 69,209,153,110,105,109, 53,245,233,221, 43,241,228, 99, 15,
+221,121, 48,156,118,144,251,253,149,175,255, 25,185, 19,198, 35, 45,145,130,200, 40, 81,115,242, 28,170, 14, 29,193,213, 43,191,
+195,249,226,207,209, 92,249, 21, 82,123, 95, 6, 24,207, 1, 63,172,132,245,250, 55, 49, 54, 59, 9,119, 20,100,226,219, 67, 13,
+176, 57,120,140,187,172, 23,102,143,237, 11,187,221, 14,174,248,197, 14,131,145,152,137,214, 22, 35,146,134,141,139, 92, 15,192,
+169,148,208,216,164,172, 79,135, 18,104,212,172,147,124, 61, 89, 1,104, 0, 74,149, 18,154,206, 60,122,135,187, 42,116,228,214,
+209,225, 70, 32,212,103,249, 35, 52, 7,128, 47, 31,222,183,252,144,185, 34, 93,241,204,115,111,229,181,180, 26,251,116,124, 79,
+ 80,156, 57,219, 56,244,238,251,254,182,112,238, 29,215,126,252,224,253,183, 29,118,255,124, 90, 90,162,117,218,164,209,197,239,
+126,176,235,247, 60, 47, 40,101,169, 75, 71, 65,222,200, 31,189,253, 78, 48, 78,144,164, 0, 14,195,175, 72,238, 55, 30,162,104,
+195,177, 67,199,208,120,190, 21, 99, 86,237,134, 50, 46, 17,253,166,204,197,222,207, 95, 65,214,136, 17,160,235,127,130,162,189,
+ 5,170,162,191,195,120,245, 98,220,154,215, 23,183,230,245,189, 16, 75, 64,128,178,248, 69, 40,107,255, 3,208, 10, 8,125, 70,
+227,248,255,126,143,241, 43, 95,138,140, 2, 56,164, 24, 64,178, 64,157, 10,224,176, 11, 29, 47, 66,200, 2, 69, 56, 4,246,169,
+ 0,118, 1, 48, 27, 45,208,187,100, 81, 4, 72, 46,163, 32,240,221,110,255,125,157,201,183,252,157,143,195,123, 81,160,221, 69,
+135,242,229, 79,210, 49, 12,109,103,149, 10,235, 55,255,249,105,204,237, 55, 77, 60,158,150,150,212,165,204,243,193,249, 55, 31,
+190,126,234, 85,167, 22, 60,242,194,252,115, 13, 45,131, 4, 65, 80, 36, 38,198,157, 93,190,248,238, 34,175,138, 42, 32,232, 30,
+ 32,126, 88, 30,246,255,223, 55,176,155, 77,208, 13,190, 10, 87,254,237, 3, 48,202,142,135,225,149,218, 4,244,159, 49, 31, 85,
+191,252,128, 97, 25, 87,129,175,250, 6,113, 71,222, 2,123,174, 20,166,220,249,176,165,230, 66,160, 24,176, 77,135, 17,247,203,
+219,224,206,238,237, 80,212,126, 99, 80, 87,223,130, 94, 87, 76, 69, 92,198,144, 72,198, 0, 44,236, 54,214,133,153,106, 53,219,
+ 57, 65, 68,247,247, 0,240, 17, 3, 48, 52,160,210, 40, 97,183,187,102, 81, 52, 42,165,108, 80, 41, 68,249,249,200, 92, 55,239,
+115, 36,216,135,252,157, 61,130,167,129,168,245, 47,127,116,133, 94,223,214, 59, 49, 94,123,182,213,208,214,167,147,128,194,191,
+222,123,102,141,148,177,242, 54,128, 53,120, 80, 95,211,151, 59, 86,189,112,223, 3,107,111, 57,116,184,106,252,213, 87, 14,221,
+167, 84,210,162,119,166, 11, 65,247, 0,195,238,127, 25,230,186, 10,176,186,100,168, 82,250,118, 25, 23, 24, 56,235,207,248,254,
+129,215,144,144,156,135, 62, 35,254, 0,254,216, 23, 96, 27,127, 70,242,183,127,241,208, 72, 44,152,193,211,208,226, 72,192,177,
+226,111, 49,101,227,129,136,220, 23, 69, 71, 47, 47,192,100,182,192,104,108,119,177,208, 60, 47,197, 0,242, 32, 84,236, 38,254,
+251, 25, 73, 53, 91,161, 55,185,230,209,237, 18,121,249,192, 7,114, 0,128,101, 21,109, 54,155, 67, 11, 0,159,127, 85,212,239,
+198,235,175,169, 11, 48,158, 13, 41, 10,246, 41,191, 20,191,120,208,160,156,236,204,243,255,179,105,105,225,192,172,244,182,188,
+107, 31, 94,101,177,218,226, 29, 14,158,123,250,217, 45, 83, 94, 92,245,192, 87,254, 36, 98, 0,113,243, 43,143,125,242,209,142,
+221,101,179,103,142,171,245,165,165,124, 8, 65, 48, 77,211,208,101, 14,247, 94,191,207,169,145,191,230, 7,148,254,253, 22,180,
+246, 78,198,208, 43,230,129, 58, 87, 6,209,120, 14,162,241, 44, 32,240,160,226,210, 64,233,250,128, 74,207, 69,245,201,179,168,
+ 62,178, 23,249,171,254, 13, 85,114,122, 68,120, 69, 3, 0, 69, 83, 80,113, 10,168, 85, 44,212, 42, 37, 84, 42, 37,212,156, 18,
+234, 78, 11, 20, 94,250, 50,130,163,193, 94,175,130,134, 70, 73, 67,195,169,160,225,148, 23,182, 78,249,121,240, 46,115,235,248,
+219, 18,226,181,231,165, 83,111,220,180,243,166,157, 95,237,239,231, 50, 55, 79,164,225, 79,126,222,179,156,215, 78, 29,125,102,
+ 72,118,127,163,130, 85, 10,147, 39,142,252, 66, 58,221,191,119, 31,188,121,213,134,143,174,244,118,125,207,174,127,255,234,191,
+173,249,159,107,164,215,183,222, 92, 80,173, 96,149,130,175, 54, 9,133,252,129, 60,203,171, 78,205,192,132,245,123, 33,166, 12,
+195,143, 59,191, 66, 85, 75, 34, 90,146,242,193, 95,245, 32,132,177,143, 66,159,126, 29,106,204,125, 80,244,239, 98, 52,155, 24,
+ 76,121,245,103,196,103, 70,110,193,242, 11, 61, 64,155,197,249, 92,174, 84, 12,103,115, 8,157,175, 34,237, 2,137, 17,237, 1,
+ 96, 23, 96, 50, 91, 97,234,180,160,188,211,130,242, 65, 15,228, 0,192,229, 57,191, 59,240,237,238, 3, 3, 1,160,230,244,249,
+220,165, 79,109,202, 93,250,212, 38,143,159,253,185,232,245,255, 14, 59,154,240, 43, 63,239,215, 5, 89,190,104,206, 15,251,138,
+143, 78,104,105, 53,101,136,162, 72,111,221,246,245,127,239,217,123,164,244,198,235,199,252, 56,185, 32,183,214,108,182, 41,246,
+ 22,151,247,253, 98, 87,201,132,170,147,103, 71, 3, 16, 25, 37,197, 47,126,248,142,210, 72, 71, 67, 65,207,240,160, 80, 34,247,
+129, 13, 48,158,174, 64,211,145, 31, 81,119,112, 23,154,190,221, 6,145,119, 32, 41,251, 42,164,140,186, 14, 35,111,202, 71,210,
+144,200, 79,137,170,112,246, 0,172, 18, 54,149,210,165, 24, 78,163,166,156,227, 0, 82, 16, 28, 27, 7, 72, 12,238, 6, 48, 0,
+167, 84,130,227,220,125,104,249, 99,129,129,219,177,103,159,156,247,205,141,119, 84,141,110,106, 54,100,134,149,224, 15, 52,155,
+ 20,136,252,126,178, 81, 58, 13,235,216,184,254,193,127,204,127,232,197,133, 70,147,185, 55, 0, 84,157, 60,115,213,139,175,238,
+184,234,197, 87,119,120, 52,214, 63,252,120,100,236,226,135,126, 31,160, 2,132, 87, 11,228,239, 89, 94,138,162,144,144,153,131,
+132,204, 28,252,238,134,249, 49,115,173,105,138,162, 4,139,197,138,118,139, 13, 70, 83, 59, 76,166,118,152, 76, 29,189,129, 40,
+116,186, 52,130,195,181, 40, 45,234,155,216,101,115, 56, 28,160, 40,202,147, 22,136, 86,139, 5,102,171, 29, 38,179,165, 99, 51,
+ 89, 96, 50,153, 59, 57,211, 49,130, 24,204,198,178, 52,255,175,119,151,175,154,156,159,251, 73,175,212,132, 83,172, 82,209,230,
+213,120, 7,120, 78,115,199, 51,183, 98, 40,242, 7,154,138, 29, 62,172,191,225,141,151, 30, 92, 51,108, 72,191,125,254,108,213,
+192,204,244, 3,175,191,244,208,166, 64,137,210, 57, 10, 43,134,162, 4,129,144, 63, 22, 43,201,123,236, 1,180, 26,238,215, 99,
+ 21,199,210,122,167,245,133,185,173,217, 89, 11,196,243, 60, 82,210,250,131,119,216, 97,208, 55,203, 92, 17, 49,212,100,141,204,
+190,251, 59,135,216,229,117,101, 85, 61, 84, 42,246,180,251,103,181, 90,149,165,162,162, 82,157,214,187, 15,204,230,102,167,161,
+ 18, 4, 59, 50,122,103,128,183,219,161,215, 55, 6,221, 48, 20, 3,254,153, 39,231,126, 5,192,103, 48,105, 14,228, 97,114,129,
+ 71,117,237, 89,168,213,108, 91,208,242, 11, 60,244,198,150,128,229, 30,152,149,110,216,242,250, 99,155,119,124,190,247,187,255,
+219, 85, 58,166,174,190,113, 80,171,222,148,161, 80, 48,237, 28,167, 52, 13,202, 74, 47,255,253,236,252, 61, 83, 39,229,158, 1,
+ 0,179, 57,176, 7, 93,170,170,206, 66,235, 65,126,127, 10,208,147,201, 15, 0, 10, 21,167, 44,251,120,251,246, 25,127,126,224,
+ 62, 28, 45, 63,216, 81,147, 33,136,176,219,121, 76,155, 49, 5, 45,205,103, 96,148,103, 39,252, 41, 64, 64,254,124,240, 10, 80,
+180,255,168,133,231,133,189,238,159,213,176,108,227,246, 79,182,247, 95,176,224, 62, 84, 84, 28, 4,111,183,195, 46, 0,118,187,
+128,169,211,167,161,165,165, 14,102,115,247, 62,204, 3, 65, 64,209,254, 99,188, 40, 10, 13, 65,201,127,195, 52,232,155,235, 3,
+148,223,181,115,188,110,202,200,234,235,166,140,172, 14, 75,113,101,167,222, 91,122,156,231, 61,200,127, 49,147, 31, 0, 20, 26,
+ 37,253,151,143,183,127,118,252,247,183,221,202,220,117,247,163, 56, 94, 81, 6,158,231,145, 61,108, 20,122,245,234,141, 67, 37,
+159,194,106, 49, 7, 76,111,127, 61,128, 40,138, 65, 43,200,233,250, 70,124,252,233, 30,187,205,230,232,178, 48, 71, 2,165,216,
+243,209,246,207,238,184,237,214,155,169, 59,238,126, 12,149, 21,101,224,121, 59,178,135, 93,137,222,169,105, 56, 84,186, 51,200,
+ 41, 63, 34,159,231,169,175,111,196, 71, 59,246, 8,118,187,163, 52, 40,249,211,250,160,226,224,103,176,154,205, 81,146, 44, 48,
+212,214, 54,226,253,237,187, 61,202, 31,108, 16, 28,206, 68,182,209, 0, 37,138, 34, 6, 12, 72, 93,208,212,104,218,112,215,157,
+179,153, 89, 55,222,128,236, 33,191, 67,155,177, 17, 39, 43, 75, 96,179,154,131, 34, 47, 34,161, 0, 16,193,243, 2,206,157,111,
+197,161, 35,213,237, 59, 62, 47,230,121,193,241,176,195, 33,190,233,233,243,153,153, 41, 57,141,141,230,241,255,239,206, 89,212,
+236, 89, 55, 96,200,160, 65, 48,155, 27, 81, 93, 89, 10,139,165,123,158, 5, 22, 4, 30,103, 27,244, 40, 59,116,202,177,125,231,
+ 94,209,110,183,239, 21, 69,177,194,183,252, 55, 83, 55,207,186, 1,217,217, 89, 48,155, 91, 80, 91, 85, 6,123,132,228,231, 67,
+145,255,108, 11, 14, 28, 58,225,120,239, 95,190,229,151,112,213, 85, 87,137,251,247,239,135,213,106,237, 22,242, 31, 63,126, 28,
+115,230,204, 65,105,105, 41, 21,148, 2, 0, 64, 66, 66,194, 96, 37, 35,188,108,177, 57,174, 48,155,173,189,228,133, 82,221,162,
+153, 20, 4,150, 85,158, 22, 4, 97,175,221,206, 63, 37,138,226,113, 95,159, 79, 73, 73,137,103, 68, 71,190,217,102, 75,105,107,
+179,168, 0, 80,221,108, 92, 68, 53,203,182,137,130,208, 96,113, 56, 74, 69, 81,212,255,150,229,151, 43,128,205,102,235, 22,203,
+ 31,138, 2, 56,107, 72,244,122,253, 9, 0,211,113,145,162,169,169,201, 0,224, 11, 34,127,247,194,102,179,225,196,137, 19, 30,
+253,252,104,187, 61, 74,165, 50,248, 24, 0, 4, 4, 17, 2,199,113, 13, 19, 38, 76, 72,235,110, 25,130,142, 1, 8, 8, 46, 85,
+208,164, 9, 8,136, 2, 16, 16, 92,162,248,255,109, 43,244, 49,100,124,238,122, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
diff --git a/source/blender/editors/datafiles/splash.png.c b/source/blender/editors/datafiles/splash.png.c
index e374742c8da..f01e1499bca 100644
--- a/source/blender/editors/datafiles/splash.png.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,5790 +1,5468 @@
/* DataToC output of file <splash_png> */
-int datatoc_splash_png_size= 185087;
+int datatoc_splash_png_size= 174800;
char datatoc_splash_png[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,
-206, 70, 0, 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,
-147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,218,
- 7, 20, 16, 36, 40,202, 81, 99, 29, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,188, 37,215, 85,223,251,221, 67,213,153,
-238,189,221,247,222, 30, 53, 88, 82,107,178,141,144,176,101,155,196,198,208, 96, 57,196, 16, 8, 96, 36,158, 9,216,143, 73,202,
- 64, 18, 8,207, 45,243,224, 5,243, 1,131,213, 64,204, 20,130, 5,132,151, 56,196,196,178, 33, 60,242, 1,140,228,208,198, 54,
- 96, 27, 25,121,192,131,108,181,102,245,124,111,223,225,140, 85,123,175,247,199,222, 85,167,206,233,219,163,186, 91,131,107,233,
-115,212,247,156, 83,167,106,215,174, 93,235,183,214,111, 13, 5,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,
-212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82,
- 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212, 82, 75, 45,181,212,114, 81,196, 92,228,227,169,248,106, 2,187,180,102,
-171, 8, 61, 32,139,159,215, 82, 75, 45,181,212, 82, 75, 45,207, 1, 81,128,214, 90, 93,243, 19,183,222,244,251, 15,252,226,183,
- 29,254,204, 47,127,251,177,159,251,158,151,254, 81,106,245,205,149,109,106,169,165,150, 90,106,169,165,150,103,185,167,174,128,
-244, 95,190,238,250,183,253,226,119,190,240,141,219,179,126,103,235, 92,167,245,234,175,190,246,250,175,121,225,214, 91, 62,252,
-185,131, 7,151,215, 71, 15, 2, 82,131,123, 45,181,212, 82, 75, 45,181, 60,187, 65, 93, 3,237,175,187,178,245,250,127,180, 45,
-191,161,127,100,137,108,249, 24,121,127,200,117,215, 93, 49,255,157, 95,115,245,183,124,225,201,101,243,197,167, 86, 63, 9,244,
-107, 96,175,165,150, 90,106,169,165,150,103,183,167,222,248,232, 35,171, 7, 23, 55,165, 55,190,234,234,185, 29,146, 11,110,109,
-149,124,109,141,249,109,219,236, 27, 94,243,226,175,115, 62,191,246,195,159, 61,248,119,192,177, 26,216,107,169,165,150, 90,106,
-169,229,217, 9,234, 0, 74,132,181, 63,249,236,202, 3,135,250,110,241,181, 47,218,124, 93,211, 88,178,126, 31,119,124, 9, 26,
-109, 94,251,170, 23,191,232,198, 43, 54,237,254,224,103,158,122,100,125,144,239,175, 47, 81, 45,181,212, 82, 75, 45,181,156,185,
-247,124,177,143,215, 4, 54, 1,151,125,205, 53,179,111,250,111,111,216,245,131, 87,180,108,179,215,203,192, 24,244, 37, 87,210,
-188,252,114, 30,122,234,216,234, 29,191,190,239,231, 63,240,192,147,191, 1,172,197,223,203,179,121, 50, 69,228,102, 96, 62,190,
-221,175,148,122, 94, 27, 37, 95,110,231, 91, 75, 45,181,212, 82,131,250,198,162,129, 57, 96,251,142, 57,251,173,255,227, 77, 87,
-255,187,175,217,209,217, 49,232, 59,192,163,182, 95, 70,235, 5, 87, 49, 18,207,255,245,187, 31,249,175,191,246, 71,159,254, 73,
-224,241, 56,222,167, 13,236, 34,178, 11,216,117,134,155, 47, 43,165,238, 63,195,253,222, 11,220, 18,223,190, 69, 41,117,215,243,
- 28,212,159, 23,231, 27,141,147, 91,162,129,114,115,229,171,251,129,253,192, 61, 74,169,229,243,112,156,233,253,115,190,215, 96,
- 45,181,212,242,229, 45,246,105,128,178, 7,102, 23,103,146,175, 92,236,216, 69, 47, 74, 77, 88, 10, 10,148, 82, 74,138, 79, 84,
-241,121,249,173, 5,218,153,147,254,143,254,201,225, 63,251,229,111,187,252,219, 94,185,173,179,121,148, 9, 44, 31, 99,208,158,
- 33, 89,220,206,175,222,177,251,141, 55, 95,179,253,250, 31,121,231, 95,190,249,248,250,232,195,231, 9,216,111, 5,222,126, 22,
-202, 24,224, 30,224, 62,165,212,221,245,178,121,222,176, 12,183,198,215,201, 12,188,194, 96,121,167,136,220, 29, 13,151,167, 3,
-238, 55, 3,247,158,195,239,238, 3, 94,123, 78,231,185,119,247,153,220, 43, 14, 88, 5, 14, 1,159, 2,222, 15,188, 87,237,217,
-183, 90,175,148, 90,106,121,254,131,186, 2, 84,167, 97,110,254,217,215, 93,241,115,111,184,105,219,238, 77,173, 36,245, 74, 7,
-192,214, 58,188,148, 66, 89, 51,241, 30,173, 81,198,140,223,171,240,157, 71, 73, 38,202,231,214,162, 43,251,201, 93,134,239, 43,
-222,244,218, 27,190,250, 37,215,108,125,223, 15,188,227,190,159,250,219, 7,143,252, 46, 48,228,226, 83,241,183, 2,183,138,200,
-173,192,109,231,195,115,171,229, 25,149,191, 61,203,237,111, 7,110, 17,145,219,158,135, 94,179,137, 44,197, 60,240, 66,224, 54,
-224,151,100,239,238, 31, 87,123,246,253,230, 69, 51,180,166, 12, 16,181,103, 95,157, 40, 91, 75, 45, 23,201, 83,223,186,247, 91,
-174,122,199,191,124,229,165,175, 30,245, 60,226, 21, 70,171,224,192,139, 10, 47, 52,202,171, 0,189, 2,104, 21,124,123, 47, 96,
- 64, 41, 21,252,125, 1,163,148,178, 90,153,232, 17, 7, 80, 23, 64, 4,175, 20,195,222,136, 27,175,216,182,245,222,159,251,142,
- 95,255,151,191,241, 23,215,190,251,127, 63,248,243,192,145,243,228,181, 23,158, 16,167,241,214,170,239,239, 21,145,215,214,192,
-254,188,145,251, 35, 19,115,191, 82,234,190,232,201,207,199,107,125,123,101, 13,236, 2,222, 35, 34, 47, 59, 79,215,254,110, 2,
-189,127, 58,121, 38,214,217,102,224, 63,201,222,221,151,171, 61,251,126,162, 94, 34,181,212,242, 60,246,212, 27,137,222,245, 79,
- 94, 52,255,114,233,102,100,131, 33,120, 31, 64,186,100,214, 11,127, 94,141,113,215,104,244,226,182, 8,238, 30,165, 1, 31, 89,
-124, 5, 37,194,107, 31,128, 95,235, 64, 10,154,176,139,209, 48, 99, 83,154,234,255,190,231,155,126,244,229,215,239,248,202, 31,
-255,237,143,236, 25,102,238,129,243, 1,236, 74,169, 83, 82,155,209, 59,127, 59, 99,154,246,230,168,236,239,170,151,208,115, 90,
-238, 6,238,222,200,243,142,160,125, 15,112,143,136,188, 51, 94,239, 2,216,207,215,181,191,167, 48, 34, 46,150,108,228,253,202,
-222,221, 41,176, 3,120, 53,240,102,224,166,202,215, 63, 46,123,119,255,153,218,179,239, 67,245,114,169,165,150,103,191,232,115,
-248,141, 25,101,254,216,239,127,234,200, 71,149, 30,210, 73, 29,157, 22,180,155, 18, 95,126,252,119,195,211,212, 35,112, 25,170,
-209, 14, 32,239, 61,120, 79,233,149, 3, 48, 2, 63, 0,223, 7, 25, 0,195,240, 94, 70,113,123, 65,196,147, 57, 79, 62,116,252,
-232,235, 95,126,203,189,123, 95,255, 63,175,220, 62,247, 29, 17,246,245,133,156, 36,165,212, 61,132,152,102,213, 99,186,181, 94,
- 62,207,105,121,173, 82,234,142, 51,161,210,149, 82,119, 76,121,212,119, 62,159, 38, 66,237,217, 55, 82,123,246, 61,166,246,236,
-251, 61,224,171,129, 15, 87,191, 6,254, 85,189, 92,106,169,229,249,235,169, 35,112,236,206, 63,122,228,167,254,228, 51, 71,191,
-227, 69, 59, 90, 87, 40,208, 94,196, 23, 58,192, 75,128,236,222,200,235,151,188, 96,246,197, 63,244,181,215,236,106,218,166,246,
-222,131, 49, 65, 77,120,143,140,214, 81, 70,161, 47,191, 9,189,245, 26,212,220, 14, 84,115, 14,242, 33,190,123, 4, 89, 59,128,
- 63,242, 32,228,125, 80, 45, 4,135, 19,240,235, 35, 94,125,195, 11, 94,240,254,189,175,255,157,127,252,150, 63, 48, 15, 31, 88,
-121, 31,227,228,189, 11, 5,236,251, 69,228,158,138,199,118,243,249,216,239, 6, 25,209,247,159,167, 76,235,106,134,255, 57,149,
-155,157,143,125, 92,140,243,157, 26,231, 25,237,239, 28, 60,228,187, 25, 39, 87,206,139,200,205,207,199,140,116,181,103,223, 80,
-246,238,254, 9,224,131,149,143, 95, 85,171,202, 90,106,121,254,130,186, 3,186,192,231, 62,248,208,250, 59, 62,248,208,122,139,
-141,155,216, 44,190,238,198,109, 63,240, 29, 47,187,106,103, 91,167, 58,247, 18,168,247,193, 0, 25,118,193,117, 49,215,189, 26,
-251,178,239,198, 92,245, 15, 78, 74, 33,200,210, 35,228, 15,125, 0,247,232, 71, 80, 38, 5, 17, 68,193,168, 55,226,186, 75, 22,
- 55,253,207,159,254,167,255,241, 53,111,126,207,210,209,149,193,255,230,252,197,216, 79, 38,231,165, 14, 59, 2,219,237,209,219,
-191,121,131,239,247, 51,166,134,151, 79,178,143,183, 87,126,123,143, 82,234,238,202,126,111,103, 42,163, 59,238,243,174, 51,201,
-222, 23,145,219,163, 55,186,235,108,199,117, 33,206,247, 20,231,122,103,220,239,124,101,243,115,206, 20, 63,141, 76, 3,248,252,
-243, 88, 47, 76, 39, 17,110,171, 85,101, 45,181, 60,127, 65,221, 3, 3, 32, 39, 52,133,137, 81,239,178,230, 93,148,226,197,119,
-125,231,117,111,125,243,238, 43,119,187, 17,140,156, 67,178, 33, 50,232, 65, 62, 4, 43, 52,190,233,199,177, 47,123,195,233, 61,
-135,133, 43, 73, 22,126, 0,189,227, 70,242,143,255, 54,104, 23, 32, 95, 41, 70,189,140, 27,175,221,185,229, 29,255, 98,247,222,
-239,125,251,159,125, 7,240,216, 5, 6,245,170, 34, 63, 39,239, 82, 68,110, 1,222,115, 26, 80,216, 21,189,194,219, 79,145,109,
- 93,212, 86, 3,220, 23, 75,180,222,121, 10, 6, 97, 23,161, 52,235,230, 72, 39,159, 12,124,223,201,201, 67, 11,197,184,110, 21,
-145,215, 94,196,243,221,232, 92,239,125,158, 3,235,179, 73,122,103,116,173,247,238,190, 6,248,103,192,215, 3,215, 3,139, 81,
- 47, 28, 5, 62, 75, 40,149,251,127,213,158,125,135,167,126, 39, 39,217,159,156,130, 81, 80, 83,219, 94, 5,188, 62, 30,251, 43,
-129,237, 81, 55,173, 2,143, 68, 67,229, 15,129, 63, 83,123,246, 73,125, 73,107,169, 65,125,234,126, 35, 60, 3, 61, 43,238,177,
-248,175,185, 98, 75,243, 91,222,249,134, 23,222,245,141,215,109,185,118,216,247, 56,151,193,176, 15,121, 6, 74, 80, 9, 52,190,
-253,231, 49, 55,124,115,185,179,213,254,144,247, 63,240, 8,239,255,228, 35, 44,173,247, 73,140,226, 69,151, 44,240,173, 47,187,
-134,151, 94,189, 51,236,248,242,151,163,210, 89,178, 15,255, 18,164, 54, 12, 65, 43,242,245, 33,223,243,154, 27, 94,242,223, 62,
-240,249, 31,120,255,199, 31,121, 27, 23,168,220, 45, 2,222,173, 83, 30,225,217,238,227,214, 8,112,211, 30,224,125, 21, 35,161,
-234,205,238, 98,156,105,127,255,105,140,141,247, 84, 60,235,123, 42,158,229,205, 83,227,190, 93, 68,246,159,164, 81,204,219, 55,
- 0,244,234,190,138,177,221,188,193,121, 92,172,243,157,159, 2,244,229,202,248,118, 93,192,123,229,150,211,120,238, 79,103, 93,
-157,247,240,203,211,148,105,195,240, 83,167, 1,243,205,192, 59,128, 55,177,113, 67,171, 29,241,245, 13,192,191,151,189,187,127,
- 10,248, 15,231, 3, 92,101,239,238,221,192, 91,128,127,116,146, 99, 23,165,122, 47, 1,126, 8,120, 64,246,238,126,163,218,179,
-239,211,181,250,175,165, 6,245,147, 24,205, 17, 68, 55,189,238,134,133, 31,189,251,182,235,247, 92, 54,211,106,245,187, 14,113,
- 67,200,134,241, 72, 6,149,119, 73, 94,245,131, 19,128,254, 55, 95, 60,192,155,127,239, 67,236, 63,186, 70,179,145,144, 88,141,
- 22,248,228,227, 75,188,247,175, 63,207,183,188,236,106,254,159, 91, 95, 77,187,145,160,183,191, 16,123,195,109,228,127,247,187,
- 48,187, 29,144, 16, 68, 23,197, 79,191,241,149, 63,248,231,127,251,200,123, 69,248, 12, 33, 68,112,190, 1,253,157, 83,160,113,
-247, 89,238, 99, 87,220, 71, 33,251,129, 59, 54,136,237,222, 53,229,221, 22,199,126,217, 41,118,127,103, 5,128,239,152, 6,133,
-120,236,247, 84,148,245,157, 34, 50, 65,117, 71,202,253,246, 41,208,186,109, 42,142, 94, 29,219, 45,207,208,249,222, 89,217,223,
- 91, 98, 18,227,244,181,186, 16,114,235, 5, 0,222, 13, 25,140, 24,142,184,135, 16,142,184,168,173,119, 99, 38,252,207, 76,125,
-252, 95, 79,177,253,174,104,100,157,169, 65,213, 1,126,145, 80, 15,255, 67,231, 97,200,127,113,150,219,127, 21,240, 17,217,187,
-123,183,218,179,239, 19, 53, 4,212, 82,131,250,198,128,126,213,143,124,195,165, 63,243,246,215, 93,249,207,172,183,244,134, 25,
-184, 17,184, 60,196,209, 21, 32, 14,181,229,114,236, 43,222, 88,254,248,139, 7,151,121,227,127,124, 63,135,251, 57,237, 78,139,
-204, 24,146,196,144, 26,133,145, 20,229,114,222,247,209, 47, 97,180,230,103,191,123,119,240,216,175,249,122,220, 23,254, 12,220,
- 58,216, 22, 40,200, 71, 25, 47,185,122,219,142, 87,188,104,199, 55,126,244,179, 7, 63, 71, 8, 17,156,177, 23, 32, 34,119,158,
-198, 67,155, 6,176, 59,206, 33,209,234,157, 83,222,229, 73,107,157,149, 82,247, 69,122,187,240, 72,111, 22,145,219, 79, 19, 15,
-191, 79, 41,117,219, 73,246,183, 95, 68,222,194,184,155, 89, 81,131,125,207, 6, 96, 89, 0,230,134,117,248,149,177,253,237, 51,
-120,190,251, 79,182,191, 11,225,229,198,245,113,206, 6,221,105, 24,150,141,100, 87,188, 30,119,138,200, 5,111,191, 43,123,119,
- 39,209,147,254, 26, 66, 73,219, 75, 42, 95,255, 57,240,187,167,240,208,255,124,106,110, 30,140, 94,251, 7, 8,173,157, 13,240,
- 98,224,251,163,209, 88,164,203,252,160,236,221,253, 25,181,103,223,175, 20, 84,250,211,104, 62,227,129, 63, 3,254, 0,248, 27,
- 2,221, 62, 0,102,129,235,128,111, 6,126, 24, 88,136,219,207, 2,239,150,189,187,111, 80,123,246,101, 53, 12,212, 82,131,250,
- 24,208,213, 66,199,190,230, 55,110,189,250, 23,191,235,198, 45, 55, 13, 7, 48, 84, 25,248, 64,181,147,232,114, 75,201, 70,216,
-235,190, 22, 53,179,165,220,193, 91,126,239, 35,124,241,137, 21,216, 52,195,202,122, 14,202, 97, 20,180,141, 98, 75,199, 50,223,
-178,108,218, 52,195,255,252,216, 23,217,253, 21, 87,112,203, 77, 87,129,177,152, 93, 95, 75,254,192,127, 65,109,189, 18,196,227,
-149, 34,109,165,124,215,238,235,111,249,232,103, 15,254,103, 96,137,179,163,224,207,180,101,236,221,156, 67,109,113,165,183,120,
-121,234,167, 3, 31,165,212,253,177, 53,233,157, 21,227,226, 84, 96,114,199,105,246,119,159,136,220,207, 36,213, 93,140,111,186,
- 85,234, 93,167, 26, 95,101,108,183, 63, 67,231,123,215,197,162,168,227,185,188,125,202, 75, 63, 31,160, 94,244,149,175,210,248,
-213, 30,244,229,218, 20,145, 93, 39,203,131, 56, 7, 0, 63,211,251, 98, 5,248, 13,224,167,213,158,125, 39,171, 42,249, 69,224,
-234,202,251,247, 1,223,163,246,236, 27, 76,109,247,113,224,227,178,119,247, 7, 34, 59, 81,128,245,207,200,222,221,239, 82,123,
-246, 45, 61,141, 83,250, 35, 96,143,218,179,239,193, 13,190, 59, 14,124, 12,248,152,236,221,253,155,209,171,191, 62,126,119, 29,
-240,157,192,187,107, 24,168,229,249, 36,231, 82,223, 93, 36,197,205,188,250,234,217,127,247,145,127,245, 21,239,253,174, 23, 45,
-220,212,235, 57, 28, 46, 0,186, 6,140, 66, 25,133,178, 10,101, 52,202, 42,244, 37, 55,148, 59,121,248,208,113,254,244,129,199,
-160,221, 10,101,110, 90,131, 49, 56, 52,107, 67,199,195, 71,122,236, 63,220, 35, 19,133, 55,134, 15,124,250,209,241, 0,182, 92,
-131,244, 87,129, 60,142, 70, 32,247,188,240,178,133,171,129,157, 92,184, 7,213,220, 26,189,200,179,165,120,171, 0,183,124, 22,
-160,112,223,212,177, 79, 10, 16,103, 72,211,222,127,146, 49,221, 50, 5,176,103, 50,190,123,158,161,243,221,127,177,250,239,199,
- 16, 66,181, 87,251,242,233,140,167,211,200, 50, 33,254,123,181, 82,234,101, 74,169,219,148, 82,119, 85, 94,183, 41,165, 22,226,
- 54, 85,163,229,246,104,120, 93, 44,249, 12,240,125,192, 79,168, 61,251,134, 39, 49, 14,174,140,219, 20,242,208, 73, 0,189,234,
-121,191, 23,248,173,202, 71,179,192,247, 62, 45,170,112,207,190,111, 59, 9,160, 79,111,119, 0,248,215, 83, 31,127, 91, 13, 1,
-181,124,185,131,122, 65,183,239,252,254,127,176,245,151,238,253,254,235,127,225,186,217,230,166,222,200,135, 78,112,146,163, 68,
-208, 30, 20, 42, 80,239, 90,135,100,117,155,162,231, 95, 80,238,232,145, 35,171,244,227,227, 86, 75, 59,161,240, 33, 98,191,248,
-227,235, 25, 95, 58,216,197,139,102,109, 48,102,201,212,108, 76,108, 29,246, 80, 58,182,155,205,115,174,218, 62,187,173,145,154,
- 29,231, 0,234,111, 57,197,171,218,202,115, 62,122,109,247,158, 37,176,223,114, 18, 96,229,116,222,245, 6, 94,227,233,192,240,
- 84,114, 50,224,223,117,182,251, 58, 13, 91,113, 33,207,247,162,212,134,199,235, 59, 29,243,126,203,211,169, 77, 87, 74,221, 31,
-193,123,255,105,182,187,139, 19,203,242,222,126, 17,245,194, 13, 4, 42,251, 83,178,119,247,201,214,220, 63,155,210, 31,191,122,
- 42, 64,175,200,127,158,122,255,143, 47,226,121,125,120,234,253, 75,107, 8,168,229,249, 38,103, 67,191, 43,128,217,166,121,229,
- 47,124,243,101,123,239,184,121,235,171, 70, 35, 24, 36,161,229,171, 56, 65,101,158, 52,213,172, 56,231, 91,104,141, 53,101, 5,
-123, 8,154,229,229,206,182,109,106, 99,210, 4,231,137,253,226, 37,130,122,252, 87, 20, 24, 77,183,151,241,232, 96, 64,227,166,
-202, 80,197,129,100,144, 15, 64,207,161,196, 35,222,179,208, 73,218,155,218,233,252,225, 81,255,172,140,149, 51,137, 89,198,184,
-234,157,140, 31,207,121, 47,167, 78, 94,171, 74, 85, 49,238,138,143, 44, 61, 23,153, 63,133, 7,248,116,228,156, 64, 56,110,123,
-243, 69, 62,223, 11, 14,234, 17,208,239,157, 58,143, 59, 46,230, 19,250, 98, 56,226, 45, 21, 48,223, 37, 34,183, 78, 39, 6,158,
-131,103,187, 81,155, 88, 13,108, 34, 36,175,125, 7, 33,254,220,140,224,254,151,178,119,247, 55,169, 61,251, 62, 56,245,179,111,
-152,122,191,239, 12,135,240,247, 27, 24, 16, 79,255,154,133,248,254,109,113, 45,127, 5,112, 41, 48,195,198, 61, 52, 10,185,180,
-134,128, 90,190, 28, 65,189, 80, 2,201, 11,183, 55,191,251,247,190,235,170,187, 94,186,173,189,173, 63,242,208,176, 1,208, 51,
-143,205, 60,105,203,240, 19, 31,120,242,147, 87,108, 78, 55,255,208,205, 91,175, 24, 8,193,147, 86, 10,178, 12,127,244, 75,232,
-203, 95, 14,192,139, 46, 93,228,171,175,221,198, 95,125,238, 8, 88, 27, 64, 92, 71, 64, 47, 34,120, 62,252,118,176,212,229,218,
- 29, 99,253, 46,171, 79,193,112, 21, 25,110, 70,197, 39,198,136, 47,140, 2, 52, 23,128,126, 87, 74,221, 21, 91,219, 22, 74,246,
- 76,146,215, 54, 2,167,179,121,150,251, 51, 33,203,231, 97,219,231,210,249,158, 9,160,191,229, 25,122,228,238,221, 83, 30,250,
- 5,153,199, 24, 51, 95, 6,254, 26,248,107,217,187,251,247,128,191, 36,208,227,109,224,247,101,239,238, 23,169, 61,251,142, 87,
-126,246,162,169,221,124, 66,246,238,158,214, 25,167,250,187,180,239,159, 38,152, 43,224,199,128,159,138, 32,126, 54,210,170, 33,
-160,150, 47, 55, 80, 47,232,246,109,183,125,213,194,155,127,229,155, 46,251, 55, 59,154, 73,218,243, 10,213, 14, 6,176,140, 60,
- 77, 47, 12, 82,248,215,127,252,232, 31,223,253,145,195,127,248, 59,183, 93,185, 71, 73,124,158,139,137,217,239, 86, 35,135, 62,
- 83,238, 88,107,197, 79,126,251,203,248,166,207,254, 47, 24,100,208, 72,227,211,221, 34,168,123, 64, 60,172,247,120,201,139, 47,
-229,123,191,238, 43,202,223,250,195,159, 67, 36, 67,185, 81,216, 80, 4,173,132,165,245, 65,127,181, 55, 90,187,128,222,211, 93,
-177,187, 89, 33,183,114,246,153,208,251, 57,247,206,116,207,197,167,194, 61,215,206,119, 26,208,239,190,208,217,231,167, 88,111,
-203, 83,201,141,183,112, 17, 30, 34,164,246,236,123, 64,246,238,190, 11,248,217,248,209, 14,224,159, 79, 25, 24, 91,166,126,102,
-206,241,112,233,211, 28,238,175, 81,247,166,175,165,150, 51, 2,117, 5, 40,107,212,117,111,251,199,151,252,202,155,255,225,142,
-111,204,115,232, 89,141,106,104,196, 11,210,119,116,172,226,145, 97, 62,248,190,255,246,240,111,239,123,112,245,247, 0,255,216,
- 74,118, 8, 37, 47,148,210, 83, 7,154,109,220, 35, 31,198, 46, 63,130,154,191, 18,128,215,189,228, 74,238,254, 23, 95,207,143,
-252,206,135,232, 29, 31, 66,179, 1, 70, 7, 42,126,148, 65,175,207, 75, 95,184,157,247,190,249,155,233, 52,147, 48,170,172,143,
-251,236,251, 80,105, 3,148, 3,241,136,119,160, 53, 15, 29, 60,126,100, 48,114, 71,184,112,137,114, 16, 98,206,183, 84,148,236,
- 89,123, 95,207, 20, 72, 60, 67,242,156, 57,223,248, 52,182,105, 64,191,227, 25, 30,214, 51,101,200,253, 97, 5,212, 1,190,117,
- 10,212,245, 51,126,189,246,238,126,237, 6,128,254, 65,224,119, 8, 97,154, 39,129,117,181,103,159,171,120,245,158, 90,106,249,
- 50, 6,245,109,111,255,166, 75,255,227,143,253,195,237,175,233,143, 64,218, 22,149, 40, 36, 23,232, 57, 58, 45,195, 95, 60,182,
-118,232,251,222,189,255, 63, 60,122,108,248,191, 8,165,100,230, 11, 71, 7, 95, 64,171,175,195,197,204, 55,163,131, 14, 24,174,
-147,125,248, 29,164,223,242, 43,229, 65,126,232, 53, 95,193, 87, 95,179,157,223,253,192,103,249,163, 79, 60,202,129,227, 61,172,
- 86,220,120,237, 22,190,251, 85,215,242,127,190,230,197,116, 26, 73,185,125,254,241,223, 70,142, 63, 2,141, 54,162, 34,145,144,
- 59,104, 24,190,240,196,242,163,132,231,172, 63,219,110,220,139,238,109, 93,164,241,221,242, 28, 61,223,147, 1,250,237,207, 50,
- 64,127, 38,229,225,169,247,211,116,251, 10,227,186,111,128,197,167, 89,154,118, 46,242, 47,166,222,191, 11,120,211, 41, 58,213,
-205,213, 42,191,150, 47,103, 80,231,242,249,116,247,247,125,229,194,107, 70, 3, 15, 51, 9, 42, 85,200, 72, 48,131,156, 70,199,
-240,174, 79, 30,251,252, 15,191,247,145, 95, 88,237,187, 15, 1,199, 8, 15,122,105,254,229, 67,107, 31, 59,176,150,125,255,150,
-118, 98,157,200,184, 8,174,213,198, 63,246,151,228, 31,249,101,236,171,126,164, 60,206,141, 87,108,225, 29,223,255,181,252,252,
-247,230, 28, 92,234,146, 38,150, 75, 22, 58, 39,140,199,125,246,143,200, 63,245, 46,104,182,131,213,161, 13,226, 60,202,121,178,
-193,144,247,125,232,161,143, 16,250,209, 95, 72, 80, 63,151,184,230, 4,200,137,200,252,179,160, 21,104, 85,246, 87,198,119, 70,
- 79,159, 59, 69, 38,254,115,225,124,159, 75,128,126,174, 73,140, 79, 87,166,217,174,246,212,251, 7,129,234,147,152,110,228,204,
-147,229,206,151,252,195,169,247,111, 59, 77,235,217,107,106,149, 95,203,243, 93, 78, 69,161,217, 43, 23, 26,215,206, 55, 12,185,
- 15,217,237,210,115,164, 35,135,106, 40,222,252,254,199,239,123,227,187, 30,250,177,213,190,251, 0,112, 40, 90,238, 35, 32,123,
-234,248,232, 99,239,251,220,242, 3,137, 5, 25, 56, 64, 80,154, 80,175,222,158,197,125,234,191,146,221,247,147, 72,239,232,196,
- 1,155,137,229,202,237,155, 78, 4,244,172,143,251,232,111,144,127,232,109,168, 70,138, 50, 38,196,235,147, 6,100, 57,137,134,
-191,249,194,129,131,127,245,217, 67,247, 17,122,191, 95, 16, 80,159,122,196,231,217, 40,217,233,242,175,219,159,101,235,160, 58,
-190,249,216,182,245, 92,189,244,231,194,249, 62, 39, 0, 61,182,238,157, 54,190, 46,150, 92, 53,245,254,216,212,251,233,108,248,
-219,206,195, 49, 39,238,219, 72,151,159, 74,182,158,229,252,124, 99,173,242,107,249,114, 6,117,243,217, 67,253, 7,159, 24,185,
-188,221, 54,180, 51, 71,219,192,186,241,242, 61,239,217,255,238, 95,188,247,192, 91,129, 79, 18,158,192,212, 37,244, 91, 47, 30,
-244,114,232, 87, 62,120,232,158,149,204, 97, 51, 7,153, 15, 89,115,177, 41, 13,157, 89,252, 67,127,202,232,125,111,196,253,253,
-251,144,213, 39, 55, 86,106,221, 35,248,135,238, 99,244,135,223, 79,254,119,191, 5,205, 38, 24, 27,154,205, 40,133,210, 9,106,
-144,129, 17,126,246,247,255,238, 15,129, 47,197,227,159,119, 80,175,212, 45, 87,229,140,202,139, 98, 25, 82, 85,225,220,121, 26,
- 79,247, 98,203, 61, 76,198,110,239, 60,131,185,184,243, 57,124,190, 39, 3,244,251, 9,189, 9,206,217,232, 19,145, 59, 43,175,
- 91,166,230,236,108,215, 91, 53,134,189,124,166,235,237, 60,201,235,167,222, 79, 63,212,229, 93, 83,239,127, 80,246,238,126,186,
-229,105,171, 83,239, 55,157,102,251,238,212,251,157, 39,157,207,189,187,103, 57,145,174,175,165,150, 47, 43, 80,231,216,122,254,
-241,239,122,247,195,119,189,231,193,227, 15,126,224, 96,239,208,175,223,127,228,254,175,249,181,207,255,244, 61,247, 47,253, 2,
-161,131,212, 49,160,207,228, 3, 84, 28,208,255,210,145,193,159,190,237,127, 31,188, 55,105, 24,100, 61, 71, 50, 15,196,242, 54,
-165,160, 61, 7,249, 10,217,135,127,142,209,251,190,155,209,255,119, 7,249,135,247,146,255,205,175,146,255,213, 47, 49,250,147,
-127,203,232,189,111, 32,187,239, 45,200,250, 35,208,217, 20,154,210, 20,182,187,215,200, 80,145, 52, 53,255,229,190, 47,124,246,
-207, 63,241,228,187, 9,212,251,121,237,229, 28, 21,245,237,132, 94,231, 55, 79, 41,217,179,201,124,175,122,127,243,132, 6, 54,
-183,156,225,241,239, 60, 77,127,250,167, 37,145, 26,175,198,189,111,137,128,119, 50,176, 57,147,199,158, 62,107,207,247, 20,128,
-254,218,167, 25, 38, 40, 30, 33, 91,188,170,235,229,102, 17,185,247, 76, 58,195,157,228,209,178, 23,175, 53,110,104, 56,243,230,
-169,143,255, 96, 98,205,236,217,247,247, 76,182, 88, 77,128, 63,149,189,187, 95,122,134,199,120,165,236,221,253,231, 83, 31, 63,
- 58,245,254,116,251,250,252,212,251,127,115,146, 99, 89, 66,255,250,203,106,149, 95,203,243, 93, 78, 21, 83,207,128,165,191,222,
-191,246,159,255,122,255,218,189,132,154,213, 99,192, 65, 2,213,190, 30,183,153,142, 97, 21,207, 91, 63,248, 75, 31, 56,240,142,
-151, 92,222,190,234, 13, 55, 45, 94,211, 95, 29,161,230, 82,104,232,208,105, 14,129, 36, 65, 37, 73,200, 96, 63,246, 73,242,195,
-247,151,187, 83,218,130, 77,161, 51, 85,122, 42,192,200, 33,190, 69,179,145,114,255, 23, 15, 45,255,219,223,250,232,222,232,165,
- 79, 27, 24,103,170,224,207,229, 17,144,119,156,141,146,141,189,215,239, 96,252,228,178, 2,232,238, 35,208,213,247, 79,129,195,
- 46, 2,197, 93, 0,195, 91, 46,240, 90,184,155,201,199,160,222, 30, 65,248,238,202,216,110,137, 64, 56, 31, 61,241,101, 78, 18,
-131,127, 54,159,111, 60,175,141, 66, 2,239, 57,139,165,112,207, 57,212,174,223, 18, 13,166,253,113, 14, 54,234,253, 62,253,168,
- 92, 8,109,128, 47, 88,178, 97,164,185,231, 8,201,112,175,103,220,124,166,144, 47,176,241, 67, 93,126,152, 16, 87, 47,168,250,
-203,128,143,202,222,221,191, 31, 89,173, 79, 68, 38,207, 17, 74,224, 94, 8,188,154,208,115,253,198, 13,246,247, 97,224,166,202,
-251,119,200,222,221,255, 54,238,103,109,131,120,249,123,129, 87, 84,222,255,152,236,221,221, 4,126, 61, 58, 29,179,241,120, 63,
- 73,104, 20,245,191,128,127, 82,171,253, 90,190, 92, 65,221, 69,224,206, 35,136,235,248,217, 48,190, 28, 39,127,104, 74, 14,172,
-123,145, 79,255,243,223,127,248,103, 23, 59,246,109,255,232,154, 77,151, 14, 86, 70, 48,155,160,154,102, 92,191, 30, 16, 28,210,
-230,169,235,208, 4,240, 2, 67,135, 95, 29,209,218,185,157,207, 29, 88, 94,191,237,174, 15,222,181,210,205, 62, 84, 49, 50, 46,
-180,220, 31, 1,253,172,147,150,148, 82,119, 87, 26,216,204, 87, 21,253, 51,189, 16, 98, 77,244,109, 76, 62, 70,179,240, 60,167,
-101,153, 16, 67,125,251,115,245,124, 55,144,179, 13, 15,220,247, 52,142,181,139, 51,207, 51,184,251,124, 26, 56,103,241, 64,151,
- 66, 14, 1,255,116,163,167,153,169, 61,251,150,100,239,238,215, 0,127,202,248, 65, 41, 22,248,158,248, 58, 91,249,205,200,240,
- 20,122,233, 70, 42,143, 86,173, 52,183, 41, 58,227,253, 70,156,199,106, 2,220,191, 98,227,186,245, 3,113,219,167,106,181, 95,
-203,243, 89,244,105, 96, 52, 39,196,173,150, 9,229,106,199,129, 94,252, 92, 78,243,219, 33,176,178,218,119,251,190,253,238, 7,
-255,239,119,253,221,177,207, 55, 83, 77,178,154,225, 87, 50, 24,248,114, 47, 10,133, 82, 27,188,226,127, 56, 96,228,145,213, 28,
-181, 60,164, 53,191,153,125,251, 87, 14,126,227, 79,221,247, 83,251, 15,173,255, 65, 28, 91,143, 11,151,245,126, 95, 84,174,183,
-197, 7,113, 60,157,254,223,119, 71,175,225,110,206,172, 6,249,158,168,232, 46,120, 71,179,216,147,252,101,167, 57,214,125,132,
-199,158,222,255, 92, 63,223,139, 44, 69,188,254, 76,215,206, 61,132,112,192, 29,207, 96,229,192, 31, 3, 47, 83,123,246,125,225,
-164,215,119,207,190,135,129,151, 3,191, 74, 72,148, 61, 35,219,130,240,168,212,175,157,218,215,103, 8, 77,110,134,103,180,182,
-246,236,235, 2,175,139, 76,194,169,228, 65,224,235,227, 67, 93,106,169,229,121, 45,234, 2,239,223, 16, 74, 97,230,129,175,248,
-190, 87,110,251,193,159,121,221,165,223,122,233,166,212,230, 67, 33,183, 10,154, 6,101,117,240,220,117,101, 56, 34,224, 64,114,
- 15, 3,135,201, 60, 73,162, 88,117,240,115, 31, 90,250,139,255,240,199, 15,189, 51,115,254,227,140, 75,233,242,231,226, 5,136,
- 84,240,180,151,184,159,240,116,179,251,158,193,113, 21,116,120,245,153,232,247,157,225,211,224,158,115,231,251, 12, 93,247, 93,
-156,152,155,112, 63,129,110, 63, 47, 64,126, 22,158,121, 55, 26,237,159, 35, 60,147,252,191,171, 61,251, 62,119,150,199,218, 14,
-252, 31,192,107, 8, 61,221,119, 16,104,252,126,244,144,255, 62,122,222,239, 85,123,246, 61,121,138,253,236, 2,222, 72,160,206,
-175, 7, 54, 71, 61,162,166, 60,245, 98,251,118,244,194,191,147,240,236,246, 57, 2,187,248, 41,194,227, 96,127, 71,237,217,215,
-223,104, 62,206,226,153,237,181,212, 82,131,122, 5,216,155,132, 76,214, 29, 47, 88,104,124,195,237,175,222,246,109,111,186,121,
-203, 43, 46,155, 77, 18, 68, 33, 34,120,165,240,149,209,104, 1, 45, 18, 74,215, 20, 28, 27, 56,255, 63, 62,185,244,233,119,126,
-228,240, 31,127,234,241,238,159, 0, 79, 68, 37,212,127,174, 2,122, 45,181,212, 82, 75, 45,181, 60,215, 64,189, 56, 78, 10,116,
-162, 21,189, 99, 97,198,126,213, 43,174,156,121,197,119,222,180,240,242,155, 46,109,239,156,111,152, 78,199,170,212,106,165,115,
-143,244,156, 31,173,140,124,239,139,135,251, 71,238,121, 96,233, 19,127,181,127,253, 99, 79, 29, 31, 21,173, 31, 87, 9, 49,244,
- 11, 86,147, 94, 75, 45,181,212, 82, 75, 45, 53,168,159,250, 88, 26,104, 16,168,180, 54, 33, 59,117, 1,216,222,110,232,197,166,
-213,115,137, 81,105,238, 37, 31,228,178,214, 27,186, 99, 34, 28, 38, 80,236,171,132,184,121,151,211, 39,234,213, 82, 75, 45,181,
-212, 82, 75, 13,234, 23, 17,220,147,232,189, 23, 47,203,228,147,158, 60, 33,155, 61, 35, 36,224, 12, 9, 52,123, 13,230,181,212,
- 82, 75, 45,181,212,242, 44, 1,245,233,227, 23, 32, 95,252, 91, 5,117,169,252, 91, 3,121, 45,181,212, 82, 75, 45,181, 60,139,
- 65,253, 84,227,169, 65,188,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,
-150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,
-106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,165,150, 90,106,169,229, 2,137,122,229,
- 75, 95, 5,128, 86, 26,173, 99,131, 55, 37, 40,165, 66,251, 23, 5,160, 40,222, 78,180,132, 81, 10,205,137, 93, 98,194,207, 20,
- 74, 73,252, 50,244,148, 81,241, 95,137,191, 16, 64, 73,124, 34,139, 10, 91,137,108,180, 55, 38,126, 31,183,140,191,137, 99, 43,
-158,203, 78,248, 27, 37,148,187, 82,196,109,226,239,100,188,111, 81,234,196, 14, 60, 19,231, 24,126,139,140,199,174,202,227,171,
-184, 59,169,140, 77, 42,219,233,242, 51, 85,221, 97,156,129, 98,183,138,240,135, 16,199,172,198, 91, 78,244,227, 41,191,147,202,
-223,147, 3, 87,168,120,157,226, 53,140,115, 35, 27,158, 88,121,121,203, 99, 73,252,191, 66,197, 57, 21,170,141,254, 84, 60,109,
- 85,206,111,252,165,146,202, 21, 26,143, 65, 16,180, 42,102, 76,161, 84,120, 42,159, 0, 94,194,211,118, 85, 28, 64,185,157,148,
-203,107,124, 92, 29,174,174,146,226, 82, 8,226,193, 35,248,248, 52,191,234,149, 52, 26, 44, 58,204, 1, 69,235, 66, 21,247, 25,
-198,132, 2, 39,227,118,134, 94,192, 40, 65, 35, 97, 93,139,224,227,162,119, 30,180, 86,152, 56, 87, 90,133,115,209,241,156,140,
- 30,175, 63, 85,221, 70,166,231, 24, 42,179, 49, 94, 3,113, 94,203,251, 45, 94,171,241, 61,195,196, 10,211,113, 21,137, 82,232,
-184,104,164,114, 29,199, 55, 69,252,125, 92, 15, 82,189,175, 69,226,202, 12,215,163,152,119, 41,151,152,196,123,134,202,247, 97,
-108,229,182,113,224,225,251,184,173,138, 47, 1,231, 5, 29,175,173, 76,220, 33, 97, 91, 31,215,130, 82,241,111,169, 92,247, 56,
- 33, 34, 30, 47,224,226,247, 46, 30,220, 87, 38, 68,198, 90, 1, 69,188,110,106,188,228,213,212,173, 93, 92,167,112, 77, 85,185,
- 86,137, 99, 70,141,215, 69,248, 92, 42,107,189,178,223,120, 1,149,170,238,119,172, 23, 40, 85,170,170,220,245, 76, 14,108,234,
-186,149, 58, 73,169,241,254, 84, 85, 35,200,244,109, 92,234,210,170, 78,208,197,111,100,124,191,198, 83, 43,239, 65, 53,165, 97,
-171, 26,162,216,166,186, 40,124,188,175,125,188, 6, 34, 18,183,147,241, 34,217,160,109, 88,161,127,131,238,168,220, 9, 83, 42,
-157,241, 45, 16,214,166,200,228,148,169, 98,108, 69,155,209,226,188, 66,227,209, 66,199, 23,231, 10, 82,249, 87, 38,214,120,245,
-186,150,250,177,132, 22, 85, 30, 78,169,160,127,180, 10, 47,226, 61,175,170,227,174, 46,138,120,252,241, 24,199,227, 20, 0, 31,
-239, 27, 31,230,110,242, 34, 68,101, 32,197, 60, 73, 92, 7,106, 3,149, 63,190, 62,213,107,165,174,154,127,129, 20, 64,170,162,
-162, 26,223,172,241,164, 38, 46,146,102,252, 96,180,226,119,186,114,129,217, 8,109, 80, 24,148,174,116,125, 85, 30, 68,143, 87,
- 53,106, 98,145,140,197,151,239, 69, 71, 69,235,125,220,206,161,226,123,165,138,166,240, 26,239,253,196,239,116, 52, 82,130, 18,
- 14,106, 44,108, 19,206, 89,107, 93, 57,255, 0, 8, 74, 41,188, 31,131,133,209, 38, 40, 97, 29, 94,168,202, 2,213, 42, 24, 68,
-170, 0,105,141,114,213,113, 10,206,121,188, 8,206, 59,178, 60, 39,207, 61, 46,243, 40, 37,104, 29,192, 71,233,114, 37, 6,197,
- 25,231, 85,203,216, 0, 64,105, 20, 58, 40, 28, 1,165,165, 4,202,233,249, 11,215, 82, 87, 20,208,137,215, 69, 16,156,246,227,
- 5,161, 20, 17,170,198,227, 2,116,188, 57,124,169, 48, 44,198, 24,172,214, 24,109, 17,227, 17,113,120, 47,229, 43,203,114,148,
-214, 24, 99, 74,101,173,227, 2,157, 88,107, 18,144,218, 75, 80,224, 32,229,130, 46,230, 88,107,141, 54, 10,196, 76, 40,157,234,
-191,197, 62, 39,207, 63, 0,127,169,124, 68, 80,226,203,155,169, 80, 78,225, 26,235,248, 2,173, 65,105,202, 27,207, 59,133,199,
-131, 81,108,219,190,133,205,139, 29, 90,109,139, 18, 88, 62,118,148, 81,191,207,142,109,219,121,217,141, 47,225,239, 63,241, 73,
- 86,142,175,210,243, 57,107,131, 17,237,217,205,116,215,186, 72,158, 97, 21,120, 60, 35,239, 16, 9,215,190,211,110, 51,236, 15,
-200,178, 12,163,198,107,220,139,224,138, 37,161, 12, 8, 97, 94,115,207, 80, 52, 63,254,239,127,134,227,171, 75, 60,248,224,253,
-124,244,175,254,134,245,227,107, 40,209,184, 44, 35,151, 28,173, 53, 54, 49,228, 46,199, 59, 79, 98, 45,136,208,176, 9, 90,107,
- 36,119,164, 54,204,103, 38, 66, 98, 13,206,133,113, 89,107, 81, 90,145,231, 25,214, 90,156,178,188,233,135,126,152,143,127,226,
- 1, 62,245,153,191,231,169,167, 30, 71,242, 1,155, 58, 13,102,211,132,166,181,228,249, 40,204,164, 49,228,206,145,101, 57,141,
-180,129,247, 30,231, 28, 73,195,146,185, 33,185,203,209,202, 98,173,101, 48, 24, 97,109, 18,174,163, 87, 40, 13,163,209, 16,239,
- 61,214, 90, 70,163,209,120, 60, 74,145,101, 57,162, 44, 90,107,242, 60,143,250, 52, 92,231,145,203,163,134,210,120,231,195, 28,
-250,156, 36,177, 8,190, 92, 27,218, 24, 92,188,255,173, 49, 32,130,209, 6,239, 29, 2, 56,239, 81,218,160,181, 65,124,248, 93,
-208,179, 14,188, 96,140, 33, 77, 83, 18,171,113,121,206,112, 56,196, 24, 19, 63, 79,200,243,156, 60,207,163, 94, 81,165, 30,200,
-243, 28, 99, 76,112,134,140, 33,203, 50, 68, 64,107,131, 82, 26,173,195, 88,138,245,153,187, 17, 73,146,144,196,109,189,247,225,
-186, 21,235, 88, 41,146, 36,193,101, 25, 56, 9,231,130,138,224, 37, 78,149,197,197, 0, 0, 32, 0, 73, 68, 65, 84, 40, 13,202,
- 22,136, 17,143,171, 64,225, 73,173, 6,239, 40,208, 71, 43,161,209, 76,241,185,195, 90, 27,206, 83,107,196, 59,140, 9, 58,181,
- 97, 20, 90,124,137,116, 65, 63, 72,212, 15,138, 52, 77, 48, 74,130, 83,232,133, 36, 73,176,198,160,163, 97,166,148, 34, 53,150,
- 86, 35,197,104,143,181, 96,141, 99,126,166,193,230,166,101,107,167,201,230, 52, 97,113,190, 73, 39, 81,108,154,237, 48,183, 99,
- 17,219, 73,144, 52, 65, 6, 57,135, 31,122, 20, 59,204,152, 89,156,165,185,185,141, 51, 48, 58,186, 66,162, 83,186, 3,120,228,
-208, 10,159,248,228, 23,177, 70,115,249,246, 5,174,185,242,106, 62,254,137, 7, 72,218, 45, 46,217,182,131, 3,143, 61,204,252,
-226, 12, 91,119, 46, 98,243,156,133, 43, 47,227,200,242, 17,174,124,197, 75, 25,230, 67, 30,252,235,251,121,241,214,203, 89, 59,
-114,152,133, 43, 47, 33, 51, 9,203,143, 62, 65,203, 90,154,155,154,168,133, 54, 73,167,205,195, 95,120,148,165,161,227,248,241,
- 30,215, 94,119, 3,159,121,112, 63, 95,248,210,227,136,164, 36,202,162,101,196,101,151, 44,208,106, 91,150, 86,214, 56,112, 96,
-153,149,117, 71,214,207,153,155,153,225,216,161,195, 52,141, 37,207,114,146,180,129,203, 50,172, 8, 9,208,177,134,217, 86, 74,
-214,239, 49,219,110,146,141,134,204,164,205,232,108, 56,172, 14,243,105,140,101,152,229,184,136,159,162, 96,224, 61,102,115,115,
-238,173, 27, 89, 85,165,235, 32, 85,111,251, 68,179,170,170,156, 39,183,153, 6,245,177,151, 52,105, 59,171,147,252, 78, 78, 60,
- 70, 48, 61,131,130,215, 26,163, 76, 4, 32,141,210, 1,174,125,245, 36, 74, 79, 94,151, 22,143, 86, 26, 19,111,216,240,185, 2,
-165,131, 7, 83, 1, 65, 95,190,130,223,234, 37,236,219,123, 34, 56,123,156,243,184, 8, 96,225,185,240, 32, 30,196, 11, 18,191,
- 47, 20,154, 23,143,247, 66,238,165,252,141,243, 30, 81,133,135, 94, 88,148,190, 98,213, 73,233, 29, 23, 6,149, 80, 57,175,210,
- 2,148,177, 69, 56, 5,116,211,128, 62,222, 86,112,226,163,167, 52, 6, 60,188, 76, 58, 17, 2,136,143, 96,171, 80, 17,232,195,
-252, 23,127, 71, 59,210,251, 96,133, 74, 97, 21,251,210, 40,210,128, 81, 96,149,194, 40,131,209,186,180,124,139,151,138,107, 46,
-120, 80, 96,180, 38, 49, 26,107, 52,198,104,140, 42,128, 87, 97,180, 42, 61, 64,163, 9,239,181,194, 22,223,233,194,232, 42,140,
- 6, 79,225,151, 22,222,143, 72,197, 5, 21,153,240,192,213,132, 67,165,240, 62, 62,136,192,123,214,214,215, 88, 95, 95,167,223,
- 27,144, 38, 77,230,102,231, 72,147,132,209, 96, 8,185,167,221,104, 50,219,110,227,149,166, 59, 28,162,141,101,148,103, 40, 13,
-237,118,139,245, 94, 23,148, 34,203,115, 26,141, 6,121,150,129, 82,184,168,248, 4,193, 75,177, 14, 52, 40,133, 49,224,157, 3,
-209, 8,134, 93,187,174,225,149,175,254, 7,140,242, 30,159,254,228, 39, 56,240,212,147,140, 70, 35,172, 49,228, 89, 78,230, 50,
- 68, 4,147,216,232,202,142,215,133,213, 38, 0,142,151,242,124, 61,130,177,225,190, 82, 58,120,176, 90,135,121, 87, 10,156, 40,
-174,127,209, 13,244,123, 25,107,107,125,150,150,143,147,103, 25,222,101,193, 51,246, 57,185,243,160,116, 24,187, 72,184,102,102,
-188, 15,165, 53,104,197, 40,143,224, 41,144, 59,135,243, 66,150,231,225,214,243, 14,231, 92, 52, 4, 11,112,210,104,155,144, 59,
-137,160, 43,241,158, 18,114,239,200,189, 39,207, 29,162,192,137,143,215,114, 12,124, 58, 30,223, 24, 19, 28, 0,173, 49,209,152,
- 41, 65, 59, 94, 91,145, 48, 39,214,104,108, 92,163,217,112,132, 82, 66,195,166,116, 90, 45, 26, 73,138,120,143,143,128, 87,232,
-163, 98,188, 90,235, 96, 32, 20,198,124, 4,227,194, 16,209, 90,151, 6,150, 82,133, 19, 34, 88, 27, 12, 11,132,112,126,222,211,
-108, 54,194,117,143,227,171, 30,103,108,132,143, 57, 42,109, 76,249,185, 87, 18,239,219,112,206,225,120, 65, 75,138,119,165,145,
-109,181, 33, 77, 27, 72, 28,243,132, 91, 38,126,194,243,247, 82,208,107,145, 93, 51,134, 70,179, 65,179,221, 66, 41,141, 73, 19,
- 76,146, 96,146, 20, 81, 42, 48, 3,198, 96, 27, 13,180,177,160,117,212,123, 14,231,250,204,205,182,153,105, 54,152,177,134,237,
-155,219, 92,117,217, 22, 58, 51, 29, 70,162, 57,124,120,149,135, 62,247, 16, 42, 27, 50,211,178,120, 55,162,211,158,227,240,129,
- 99,184,225,128,206,226, 22,104, 52, 48,141, 38,249,241,117, 58,164, 44,182,102, 16,114,196, 38, 28, 61,186, 74, 43,105,112,201,
-182,237,100,163,140,163,107,199, 73,103,154,204, 54,155, 44, 52,218, 36,179, 13,102,118, 46,178,124,236, 8,131,149,101, 22,118,
- 94,138, 22,195,160,187, 78,154, 26,116,106, 16,237,105, 52, 83,100, 56,228,200,218, 18, 42,181, 88,157,208,238,108,102,211,246,
- 75, 56,120,224, 16,249, 48, 35,203,133,149,149, 46,199,151,215,216, 60,183, 9,173, 60,205,134, 97,243,230, 77,120, 7, 71,143,
- 29,199,218, 6,206,133,107,155,143, 70,193,117,146,128, 73, 74, 5,237,222,176,134, 84, 43,172, 2,237,114,154,105, 74,154, 24,
- 26, 70,163,196, 97,117,100, 33,141,137,108,134, 68,140, 10, 14,151, 87, 10, 51,223,216,244, 86, 20, 21, 69, 38,193, 75,175,210,
-173, 27,130,238, 52,176,107,228,148,221,218,229, 4, 74,117, 18,212,171,207,108,241, 83, 70, 70,244,192,212,248,111,165,116,197,
-235,211,104,101, 2, 48,235,138, 39, 72,161,164, 2, 24,105,109, 80,162,209,232,120, 52, 21,189,225, 56, 6, 81, 40,101, 40, 9,
- 88,101, 34,136, 26,208, 38, 78,156, 66, 68,225,124, 4,124, 41,126, 27,141, 1, 39, 1, 0,156,224,221, 24,252,115, 39,100, 46,
- 40, 32,231, 3,192,139, 84,168, 75, 21, 21,185,168, 73,170, 83, 84, 9, 60,126,130,224, 1, 37,227, 57,155,100, 48,228, 68,211,
- 72, 85,104,160,146,110, 21, 92,188,222,229,239, 10,118,163, 2,234,226,203, 95,148, 52,182, 45, 12, 43, 29,120, 3, 21,141, 63,
- 41, 65,210,163, 34,205, 29, 0,189, 48,191,198,212,180,142,199,209,209,210, 87, 58, 0,123, 1,210, 37, 80,155, 8,182,154, 96,
- 72,148,227,144,242,111,173, 2,141,170, 10,111, 68, 23,122,167, 28, 84, 0,117, 5, 42,142, 77, 85,200, 49,188, 43,153, 1, 74,
-154, 57,222, 19,162,195,245, 34,120,217,226,133,108,148, 49,232, 14, 24,141, 50, 94,252,226, 27, 64,105,134,163, 17,131, 94,143,
-185, 86,155,134, 77,104,119, 58, 60,117,224, 48, 54,109, 96,172,165,209,108, 48,202, 51,114, 23,188,161, 44, 27, 49, 59, 59,203,
-218,250, 58,198, 24,242, 60,199, 38, 9, 78,130,209,167,208,193, 72, 68,128, 44,208,238, 42, 65,196,112,227, 75,111,228,138, 93,
- 59,233,245,150,249,219,143,125,148, 99, 71,142,150, 74, 34,207, 70,160, 21,214, 6,111,184,122, 93, 1,172,181,193, 11,139,231,
-107,141, 65,153, 2,196, 13,185,203,112,226, 34, 37,238, 25,101, 25, 40,205,214,237, 59,152,155, 91,160, 63,200,232,246,134,228,
-121,206,104, 52, 32, 73, 19, 70,217,136, 52, 77,209,198, 96,172,141,225, 21,137,225, 31, 33,115, 35, 70, 89, 22,238,131, 60,199,
-229,130,119, 97, 46, 11,214, 44, 73, 18,114,231,130, 7, 46, 48,202, 3,224,231, 46,222, 67,121,142,247,158,204,229,225, 58,168,
- 96, 60,122,113,129, 30, 53,193,131,209,170, 80,148, 10, 99, 76, 4, 84, 53, 97, 40, 36,105, 26,142, 43,193, 64, 48,214,150,140,
- 93,113,245,109,152, 0, 26,209, 91,214, 42, 24, 42, 54, 9,128, 60, 28, 14,200, 37, 0,102,146, 36, 32, 50,246,168, 81,209,168,
- 8, 58,203,218,224,201,151,172,194,104, 20, 13,130,192, 26, 20,158,124, 1,246, 34,145,119,212, 10,151,231, 19,172, 98,113, 14,
-197,254, 68,130, 46, 16,145, 16,154, 80, 65,131, 42, 93, 97,173, 16,172, 81,168, 8,236,141, 36,176, 76,133,170, 47,214,136,137,
- 70, 1, 34,136,143,247,150, 30,199, 22,116,164,177,108,154,146,182, 90, 36,105, 90, 26,168, 30,133, 24, 3,202,144,123,193, 35,
- 96, 44,218, 90,156, 4, 35,142,212,226, 83, 69, 98, 19, 22, 58,155,184,100,243,102,118,204,182,216,182,185,193,150,249, 38,226,
- 6,244,135,125,102,231, 22, 73, 90,155,233,142,132,199, 31,127,146,181, 67, 71,153, 79,155, 52, 18, 75,179,221,226,224,129, 3,
-116, 90,109,146,180,129,110,182,144,204,225,187,125,172,135, 86,154,144, 13,133, 36,237,240,248,161, 3,164,173, 6,205, 70, 66,
- 35,177, 12, 6, 61,218, 73,194,150,205,155,241, 58,135,109, 51, 36,157, 54,107,199, 86,152,109,164, 44, 31,124,146, 29,215, 94,
- 29,140, 62,113,232,196,144,204,182,241, 13,131,120,199,108,123, 6, 53,219, 97,181, 63, 96,125,173, 75,130, 38, 27, 14, 89, 93,
-235,113,124,101,157,213,213, 46, 90, 41,102,103,218, 28, 95, 62, 70,187,209, 96,126,126,158,213,149, 53,180,177, 12, 71, 35, 26,
-105,112, 0, 36,247,164, 38, 5,239,176, 70,145,234, 0,232, 77,173, 80,121, 70, 43, 49, 88,229,153,105, 54, 72,141, 96,181, 39,
-181,193,113,177, 70, 71, 3,210, 4, 96, 71,192, 24, 60, 96,230,155,115,111,141,238, 88,136,131,113,162,215,135, 20, 49, 2, 41,
-169,244, 98, 53,140,169,247, 51, 12,226,171, 73, 47, 93,162,194,245,213,227,151, 1,175, 34,198, 84,196, 81,199, 94,125, 24,114,
- 0,244, 2,228,161,120, 95,120,135,186,194, 18, 68,111, 16, 19, 53,190,142, 94,161, 62,225,165, 37, 66,141,210, 99, 10,187, 36,
- 45,198,112, 82,122,250, 5, 84, 9,227, 88,138, 39,210,208,225, 55,190, 98, 4,248,194,170,138, 84, 86, 9,188, 50,142, 77, 22,
-231, 27,217,232,248,251,104,136,196, 3, 73, 4,250,192, 40, 72,140, 47, 23,116,173, 46, 13,134, 24,140, 40,183, 41,254, 43,226,
-153,129, 77,136,140, 67, 53,119, 65, 10, 39,175, 98, 8, 20, 51,160,116,200,195, 40,169,201, 24,199,242,129,134, 23, 31,128,179,
- 0,230, 0,254, 99, 47, 88,151,215, 77, 77, 24,148, 74, 75,185,125,225,105, 23, 30,163,209, 69,236, 43, 82,128, 49,196,162,148,
-140, 99,154, 49,222, 95,120,106,197,197,144, 64,161, 4, 3, 34, 26, 49,170,140,166,141,191, 87,149, 32,173, 82, 82,198,173, 37,
-210,168,197,164,248, 60, 7,129,225,112,196, 90,183,203,220,166, 57,142, 31, 95, 97,109,101,149,212, 36,108, 93, 88,196,229, 57,
- 74, 91,250,189, 62, 42, 4,221, 25,101, 35, 90,141, 38, 70,105,196, 7, 69,158, 38, 41,198,132,181,106,140,193, 42, 29,129,215,
- 68,227, 52,120,116, 74, 91,180, 14,212,249, 75,110,254, 74,182,239,156,231,169, 3,143,241,201, 79, 60,192,160,223, 39,177, 41,
-222,249,184,159, 0,232,101, 4,191,240, 90,181,174, 24,189, 4,207, 48,184, 9, 37,184,122, 95,228, 41,132,107, 44, 18, 60, 50,
-231, 28,215, 93,119, 61,198, 24,178,124,196, 48,235,147,231, 25,163,225, 8,101, 12, 89,238, 24,101, 57,105,163, 65,230, 66,152,
- 73,128,193,104, 88,126,231, 28,120, 23, 61,235, 50,254, 25,128, 53,208,214, 14,165,116, 12, 87,141,169,222,220,185, 8,210, 22,
- 47, 46,132, 22, 34, 16, 91, 51,102,126,172, 9, 70, 76, 49,119, 90,171,112, 93,167, 66, 84,196,247, 70,235, 24,102,171,132,155,
-138, 48, 28, 4,224, 53,154,102, 35,141,244,127, 22,194, 36,129, 74, 42,199, 94,134,169,138, 80, 30, 96, 19, 59, 54,148,242,188,
- 52,188,141, 49,100, 89, 48, 80,180, 9,243,107, 76,160,250,197, 71,229,161, 10,175, 63,176, 83,229, 49, 42,192, 94,120,239, 69,
-104,206, 68,250,189,170,107,131, 81, 83, 24,183,158,196, 26,194,148, 8,214,216,200, 42,248,177, 70, 86, 97,157,235, 34, 23, 69,
- 7,150,179, 8, 47,216, 52, 33, 73,210,200, 48, 72, 25,254, 80,198,196,188, 7, 79,238,131,145, 37,232, 24, 70, 8,172, 67, 96,
- 88, 50,148,184,232, 86, 41,122,131, 17,199,187, 67, 68,167,172, 13, 51,188,177,204, 37,179,248,245, 30, 77, 28, 91,231,102,217,
- 58,191,131,238,154,227,192,129,163,140,134, 61, 54,109,106,209,108, 54, 56,124,248, 16,155, 23, 22, 64,114,172,214,248, 97,198,
-160, 63,160,209,104, 97,156,102,118,102,134, 53, 25,240,232,193, 39, 72,141,101,198,166, 92,178,184, 5,165, 29,205,249, 14,155,
-183, 45,208,207,135,116, 87,151,104,108,110,177,120,205, 53,244,142, 44, 49,211,108,144,116, 26,136,207,209,202,163, 53, 72,106,
-176,179, 51,140, 6, 3,104, 53,152,187,116, 27, 90,132, 97,183,135,198,112,108,121,141,149,213, 62,131, 81,142, 19,207,246,109,
- 91, 88, 93, 89, 33, 27,142,152,155,157,161,219,235,209,104,182, 24,101, 67, 58,157, 54,195,193, 48,132, 76, 48,104,132,153, 86,
-131,124, 56,160,105, 45, 86, 60,237,196, 50,215,110,146, 42,161,149,106,172,246, 36, 26,154,169, 69, 17,174,151,209, 54,228, 1,
-217,112,239,249,136, 19,214,137, 59,129, 97, 47,147, 0,138,132,158,146,186, 61,209,203, 22,217, 40,187,108, 35, 48, 31,223,192,
- 19, 17, 93, 25,115,189, 19,223,109,192,226,135,120,232,164, 81,160, 42, 79,108, 13, 94,156,143, 73, 5,193,146, 87, 74,199, 36,
- 24, 98,114, 84,240,198,139,100, 15,165,166, 24, 4,153,228, 14, 42, 72, 81,142, 87, 42, 73, 93, 5,144, 7,175,164, 50,126, 95,
-196,136,139, 44, 2, 61,246, 28,139, 81,107, 27, 89,145, 49,165,174, 41,206, 81,208,152, 48, 62, 15, 74,249, 50,217,163, 56,174,
-174, 24, 97,136, 76,196, 23, 11, 67, 65, 23, 33,148, 74, 6,138,143, 96,231,165, 66,221, 23,249, 25,158,232,189, 71,246, 64,133,
- 88,162, 39, 80,127, 74, 20,162, 5,165, 12, 94,185,113,234, 99, 53, 22,236,125, 84,188,106,124,237,131, 59, 61,190,172,186, 56,
- 1, 53, 78,178, 97,154, 2, 87, 99,197,204,216,232, 8,235,196,151,158,208,100,178, 94, 52,168, 34, 5, 60, 30,143, 84, 18, 31,
- 21,198,168,248,253, 56,220, 32,222,135,107, 37,130,104,143,148, 70,157, 39,247, 69, 56,202,225,188,139,199,135, 60,247, 60,242,
-200,195, 60,254,212, 19,164, 70,163,115,199,210,193, 99,204,207,204, 35,249,144,166, 49,104,231,200, 92, 14,214,224,242, 28,131,
-198,103, 14,131, 38,207,114, 68, 57, 68,235, 0, 72,121,136, 37,103, 49,150,109,140,162, 63,112,136,232, 48,231,222,145,229, 35,
-230,230,154,228,249,128,165, 99,199,130,130, 0,156,119,225,118,215,227,181, 90, 36,168,249, 72, 51, 3,100,121, 54, 94,227,226,
-145, 60, 67,242, 49,216,133,185, 16, 50, 21,192,211, 57,143,103,200,254,135,191,200,117,215, 95,203, 11,174,184, 10,236, 16, 39,
-107, 24,147,113,124,105, 21,151, 11,163, 97, 23,196, 99,146, 17, 89,150,225,242,140,196,106,114,151,151,215,175, 0, 62, 65,225,
-188,155, 88,175, 46, 82,227, 33,230,157, 99, 98, 28,189,136, 59, 23,113,220, 68, 2,120, 25,165,113,113, 93,230,121,142,120,143,
- 73,146,104,132,121,226,173, 31, 12, 88,231, 75,192,181,214,226, 93, 56, 55,173, 20, 73, 98,199,244,182, 10,121, 21, 74,133, 80,
- 64, 72,244, 12, 97, 2, 0,101, 20,163,209, 8,231, 29, 73,163, 65,146, 36,120, 31, 88, 4, 19, 1, 92, 69,166, 32,207, 93, 84,
- 77, 66,158,187,146,130,183, 54,161,217, 84,140, 70,209, 64,176, 73,105, 80, 21,222, 57, 42,122,225,206, 67,244,158,139,107, 81,
-132, 70, 74,134, 46,234, 4,231, 61, 58,254,206, 57,135,119, 18, 65,221,160, 36, 24,202,121,188,246, 86,155,210, 56, 81,168, 96,
- 76,104,194,152, 41,114, 10, 2,187,145,164, 22,163, 85,121,111,185,194,216,162, 96, 97, 92, 76, 44, 84,160, 37,230, 66, 12,199,
- 76,154, 86, 49,247, 70, 99,197,160, 1, 39,142,158, 12, 65, 53, 16,109, 56,190,222,167,157,164,108,238,108, 66, 91, 69,218, 78,
- 57,112,232, 41,140, 19, 22,230, 54,177,109,199, 38,186,163, 54,143, 28, 62,204,145,222, 65, 94,120,229, 78, 48, 93,122,221, 46,
- 13, 13,190,215, 39,181, 13, 84,154,224, 50, 97,203,124,155,181, 97,151, 27,174,188, 4, 55, 26,112,252,248,113,146, 89,216,177,
-117,129,157,151, 93,198,210,224, 24, 50,187,133, 57,157,146,245,186,184, 65, 78,182,182,204,252,117,151, 98,103,230,144, 35,199,
-195,181, 68,163, 26, 13,178, 97, 23, 99, 18,230,174,191,138,225,250, 58,190, 33, 52, 54, 25,230,119,204,243,119, 31,255, 28,163,
- 44,163,223,235,211,106, 54, 89,235,117,201, 69,216,121,201,101,116, 87, 87,200,134, 33, 87,102,203,226, 38, 6,131, 30,131, 81,
- 70,103,166,197, 82,119,128, 50, 22,227,160,149, 88,134,206, 97, 16,172, 86, 36, 70,209, 76, 52,169, 77, 72,149, 68,224,246, 72,
-238, 48,132,100, 81,231, 93,224, 62, 69,176, 86,227, 92,208, 97,102,166, 49,243, 86, 87, 64, 67,145,232, 21, 21,165, 30,147,144,
- 39, 80,225,167,147,113, 98, 82,177,167,137,188,211,138,103, 85,236, 79, 77,253, 71, 73,173, 22,244,179,248,170,247, 56, 78,244,
- 26,179,139,227,228,190, 34, 78,107,162, 55, 25,226,177, 6,141,193, 40, 59, 62,110,204,128, 45, 65,164, 56,239,152,237, 56,142,
-253,234, 9, 90,175,156,172, 98,172, 83, 79,124, 23,165, 75,114, 88,170, 41,174,101, 70,107, 8, 11,160,245, 56, 52, 80, 30,203,
-160, 98,190,128,142,241,103,165, 53, 42,110, 51,193, 78, 76,176, 12,106, 34, 60,161,162, 55, 40, 85, 6,161,204,138, 15,172,129,
-210, 58,130,151,174, 24, 47, 58,198,239, 35, 11,128,144,139,139,192,168, 74,118,166,152, 47, 34,235,224,188,139, 30,150,155, 72,
-112,171,102,214, 86, 67, 0, 94,124,153,209, 60,142,255,141,231,168, 52, 86, 74,112,158,252,119, 28,106, 8,191,245, 69,158,131,
-115,227, 87, 1,234, 81,105, 86,169,104, 95, 9, 89,120,239,241, 49, 78, 91,102,210, 42,193, 19,194, 37,130,196, 56,105,100, 34,
- 36,199,251, 60,102,102, 7,138, 56, 27, 5, 90, 57, 27, 57, 14, 31, 58,204, 11,175,185,138,217,217, 25,250,189, 30, 89,158, 97,
- 18,131,243, 14,163, 21, 62,247,209,171, 22,116,140,171,182,154, 45, 0,210, 52,101, 48, 24,150,172,199,112,148,161,117,131,225,
- 48, 35,119, 35,156,140,120,193,149,151,208,153,157, 97,255, 67, 15,243,200, 35,143,227,242,160,136,131, 82, 14,212,186, 14, 46,
- 90, 0,246,202,185, 6, 58,216,162, 80,248, 8,172,222, 23,185, 3, 33,183, 62,228,127,196,176, 81, 30, 60,173, 44, 27,178,186,
-186,204,182,237,243, 92,123,221,149,108,218,212,166,223,239,163,176,184, 76,161, 77,184, 7, 7,131, 97, 8, 33,136,148,158,119,
-145,207, 82, 56, 9, 82,100,245,198, 53, 87,128, 79,145, 89,172, 35,115,161,181, 46,211,158,189,132, 28, 20, 29, 25, 13,239,198,
-137,107, 18, 25,138, 2,164, 93, 4, 97, 93,201, 1, 41,230, 32, 73,146,242,251, 42, 69,159,231,121,153, 52, 87, 48, 68, 62, 82,
-229,206, 59,140, 53, 24, 27,232, 78,109,116, 60,159,176,143,196,218, 72,189, 11, 70, 91,156,247,113, 30,130,145,230, 92, 96, 68,
-108,146,160, 32,134, 18, 92,105,168, 56,151, 7, 29, 21,153,129, 66,195,186, 60,159,184,143,170, 33,132,170,254, 44,140, 54,173,
- 52,205,102,147, 34, 87,189,200,240, 87,145,173, 42, 28, 54, 69,181, 90,168, 82,143,164, 10, 32, 79, 72,210,148, 36, 73, 74,199,
-193,104, 67,158,101,100,217, 40,176, 42, 62,199, 21,204,144,214,224, 61, 70, 41,196,133,251, 68, 23,119,189,143,127, 7, 42, 15,
- 37,130, 53, 9, 86, 39, 40,132,102,162,104, 89, 97,115,167, 73, 43,177,248,209,136,153, 86,202,246,197,121, 22, 23,102,177, 86,
-232,117,215, 88, 89,239, 67, 99, 19,235, 67, 56,252,212, 33, 22,119,236,228,232,225,163,108,158,153,133, 97,198,104,189, 71,163,
-209, 98,180,214, 69,233,140,153,133, 54,107, 71,150,184,234,138, 93, 28, 89, 58,206,202,122,151, 60, 31,178,117,251, 60,118,198,
-210,185,242, 5,244,142, 30,195,107, 97,219,150, 69,214,151,150, 72, 22,102, 80, 73, 76, 16,109, 55,233,118,123,140,196, 49,179,
- 99, 11, 89,158,193,166, 54,233,214, 77,168, 68,232,245,187, 88,219,194,153, 6, 15,125,254, 97, 70,195,192,148,118,102, 58,172,
-174, 46,211,110,183, 25, 14, 6, 12, 7,125,180,130,217, 78,139,197,197,121,122,189, 30,214, 36,172, 44, 31,199,106,139, 17,161,
-101, 45, 6, 65,123, 71,203, 26, 26, 6,102, 82,139,241, 25,169, 81,101, 40, 19,241, 24,109, 48,218,196, 48,112, 8,185,136,214,
-225,158,115,130,105, 37,173,183,122,124, 40, 15, 81,147, 57,238,213,210,143,113, 9,130, 66,169, 51,165,218, 35,184,108,232,121,
- 79,238, 71, 77,167,204,149, 37, 36,170,180, 36, 21,102,162,188,106,227, 58,180,194,219,211,101,166,186,142, 65,214, 34,206,206,
-132,209, 32,147,231, 83, 4,154, 10,192, 47, 41,246,130, 25, 8, 49,121,173, 66, 54,124, 81, 10, 56, 77,225, 23,161,131,106, 98,
- 89, 17,219, 83, 49, 22, 29, 12,135,152,184, 23,203,175,140, 50,229,182, 74,153, 10, 77,173,203,172,251,241,190, 76,101,255,147,
-201,127,229, 56,164,242, 93, 52, 8,138,237, 74, 10,189,242, 91,165, 13,198, 38,104, 99,131, 97,162, 52,162,199,249, 12,227, 50,
-163,113, 66, 77, 65,187,149,137,119,213,236,243,138,241, 52,142,253,143, 75,147,138, 68, 61, 95, 45,141, 41, 67, 15,225,115,151,
-251,144, 80, 21,105,188, 42,160, 23,251,243,149, 4,196,130, 62, 30, 31,199,151, 49,222,170,183, 63,206, 48,143,192, 95, 30,123,
-204,200,140, 67, 27,227,146, 26, 81, 82,134, 71,148,178,225, 58,105, 19,255,181, 69,173, 0,219,182,204,241, 85, 55,221, 72,167,
-221,193,249,156,110,175, 27,178, 5,117, 80,204,205, 86,139, 44,203,131,119, 73,176,198,157, 11,244,101,230,242, 72,245,134, 4,
-180, 60,210,209, 74, 43,108,106, 72,155, 45,154,205, 38, 79, 29, 56,196,193, 3,135,201,115, 65, 43, 75,158,187,232, 45, 70,234,
- 88, 38,147,228, 10, 79,210,149,115, 24,231, 19, 41,141,165,178,180,138,113,117, 0,128,115, 57,221,238, 58,203,199,143, 50, 59,
-215,225,218,107,119,177,109,235, 22,210,196,134,220,135,212,210,108, 54,208, 70,135,236,240, 52, 41, 1, 66, 68, 48, 49,150, 95,
- 80,185,101,194,107,229,239, 34, 25,172, 0,170,177, 49, 22,140, 53,137,148,248,120,140,227,184, 98, 32,165,130,210, 43,140, 2,
- 23,243, 23,202, 88,113,145, 87, 96, 18, 84,164,181,165, 98,172, 74, 76,244, 76, 98, 34, 82,233, 93, 27,131, 54,166,156, 19,107,
- 18,156,203, 99,172,218,150, 52,115,238, 28,198, 38,184,152,184, 23, 18,120, 65, 27, 27,214,168, 11,108,132,119, 82,178,159, 74,
- 23, 97,145,201,170, 28, 19, 61,238,146,169,136,161, 17,165, 40,199, 93,204,159,137,227,172,230, 30,232,104,228,132, 4,203, 49,
- 83, 82,130,251,148, 34, 87, 58,228, 53, 36, 73, 18,230, 56,230, 84,168, 88, 10, 34, 34,164,137, 45,117,145,177, 6,101,194,220,
- 20,224,174,163,241,110,140,174,148, 73, 51,174, 44, 81,154,212, 36, 88,107,176, 9,164, 73,200,176,183, 74,104,104, 69,170, 96,
-115,187,141,207, 2,245,221, 93, 91,101,216, 31,226, 50,197,220,220, 60,205, 24, 87, 71, 89,246, 31, 56,196,209,213, 30, 56,197,
-252,204,102,172,178,100,131, 12, 99, 52,253,124, 72,163,211,225,248,177, 21,180,109, 32, 90,179,176,101, 11, 40,225,200,209, 67,
- 44,238,220, 70,123, 97,129, 67, 79, 61,197,226,165, 91, 25,228, 67,210, 52,165,181,105, 14, 51,215,134, 20,104,167,216,217, 54,
- 75,199, 14,211,220,186, 72,186, 56,135,222,178, 25,167, 60, 40,135, 36, 22,139,193, 57,205,231, 63,253, 32, 13,219,162,211,106,
-145, 54, 52,237, 78, 8,177,205,180, 59, 44, 45, 45,209,105,165,164, 38,228, 11,205,204,205,177,222,235,147,229, 57,195,126,143,
-205,237, 54, 13, 66,101,128,207,115,148,207,153,109, 53,104, 90,133, 21, 71, 51,177,101,158, 81, 8,155,132, 80,135, 82, 58,230,
-175, 8, 46, 38,158,122, 15,166,213,104,191,181,160, 95,125,181,214, 50,210, 78,227, 26, 91, 85,177,156,213, 25, 0,186,174, 0,
-162,154,174,139, 59, 33,206, 94, 40,234,105,152, 23,169,102, 42,171,147,208,243, 85, 31, 80, 77,214,166, 79, 89, 11, 74, 84,133,
-182,173,208,190,170,186,203,233,138,192,162, 70,218, 84,178, 77,199,177,253,162, 62, 87,197,216, 43, 17, 28, 41, 50,187, 75,144,
-174, 36,114,169, 8,204, 49,125,172,176,190, 76,153,128,166, 49,198, 6,192, 45,226,125,145, 18, 11,180,161,142,134, 75,164,136,
- 84,244,248,149, 25,123,221, 4, 64, 47,246, 93,128,183,209,182,252, 59,128,125, 80, 88, 69,146, 83,149, 21, 8,166,126, 48,116,
- 2,251, 48, 89, 55, 46, 82,201,212, 46, 43, 39,170,101,107, 99, 22, 97, 42,189,178,172, 79,159, 40,135, 84, 99,143,190,168, 43,
-245,149, 26,207,106, 86,128,103, 50, 71,160,172,243,143,235,166, 96, 72,124, 53, 84, 84,169, 39,245,101,246,255,184,132,147, 74,
- 29,106,193, 92, 20,201,146,101, 55,130, 2,208,181,197,104, 27,128, 29,131,181,105,184,246, 70, 99,172,162,221, 12, 30,216,241,
-229,227,244, 7, 61, 76,106,233,141, 6,100, 46,148,177,172,175,119,233, 15,134, 8, 66,183,223,167,219,237,210, 31, 13,232, 15,
- 7, 12,179, 81, 92,133,161, 68, 42,147, 33, 74, 5, 38, 66, 68,227, 60, 52, 91, 45, 86, 86, 87, 88, 93,233,210,235, 13, 65,235,
- 96,189,187, 28,231,242,104,213, 87,234,106,181,166,209,104, 76,220, 67,133, 1, 32, 18, 74,144,148, 82, 56,113, 49,116, 53, 86,
-234,101,226,169,210,244,122,125, 14, 31, 58,200, 96,208,101,113, 97, 51, 91,183,206, 51,191, 48,135,181, 9, 94,132, 86,171, 73,
-171,157,210,108, 54, 66,242,156, 82,100,163, 81, 76,118, 84, 49, 86,174,198,198, 69,133, 65,113, 46, 47,141,236, 2,164,138,114,
-182,162,218, 35, 73,146, 50,222,238, 99,200, 64, 69, 54,171,236, 27, 81,241,110, 11, 67,193, 87, 88,155, 34,193, 54,207, 93,164,
-214,199, 10, 51, 41, 75,186,194,253,155, 38,105,200,135, 24,141, 66, 9,146,181, 12, 7, 67,172,209,140,134,225,188,242,232,137,
-187,184,198,116,168,139,101,148,101,193, 24,144,177,193,164,212,216, 16, 23,241, 19,158,121, 89,118,167, 99, 25,173, 14,204, 73,
- 94, 73,150, 27,135, 36,244,132, 63, 19,116,232,184,194, 33,150,226, 20,133,209, 49,153, 89,198,157, 68,244, 88,191, 18,115, 0,
-148, 14,215,196,249,144, 15, 97,141, 9,165, 40,132, 36, 57,173, 53,205, 86,139,102,167,141, 73, 76, 72,148,147,112,255, 24, 29,
-170,136, 76, 52,112, 37,222,255,198, 90,108,146, 96,108,130,181,161,204, 45,236, 54,148, 23,118, 58, 51,160, 13,189,193, 8, 49,
-134,110,238, 88,233,245,104,164, 9,243,157, 14,155,231, 54, 49,204,114, 70,222,161, 36, 67, 73,206, 74, 54,128,164,193, 80, 44,
- 7, 87,123, 60,126,120,137, 97, 46,172,118,187, 12,189, 3,219,224,208,161,101,134, 30,182,238,220,193,112, 56, 2, 45,108,185,
-100, 7,189,193, 0,237, 21, 98,160,189, 56, 79,107,231, 54,146,173,155, 49,137,194, 24, 33, 87, 96,231,103, 97,182,129, 52, 13,
-155,182, 46,112,240,177,199,153,123,241,117, 48,211, 66,205,116,144,213, 53,146, 60, 71, 53, 90, 28, 91,234,178,244,248, 97,154,
-166, 73,171,145,210,106,165, 92,127,221, 53, 28, 95, 90,138,216, 98, 88,220, 60,203,250,202, 18, 51, 51, 45, 58, 51, 51,172,172,
-172,161,180, 37,203,114, 82, 1,147, 57,210, 36, 9,238, 64, 54,162,221,176,204,181, 26, 88, 28,141, 36,228,176, 36,198, 4, 99,
- 40,150,100,230, 46, 39, 19,135, 87,190,100,132,179,204, 99,218,173,246, 91, 39, 60,235,104,109,233,138,254, 43, 63,173, 80,207,
-101, 66,210,134,110,123,180,154, 11, 47,120, 3, 64,223,248,119,106, 34,233,237,196,154,117, 78, 29,115,159, 68,239, 49, 27, 48,
- 17, 47,175, 50, 4,114, 34,160,151, 33,136,113,178,154,175, 82,253, 83,219,251, 74, 78,186, 84,104, 13,197,100,105,136, 84,234,
-161,203,204,253, 8,120,101, 89, 76,140,231,233, 2,220,163,165, 91,122,230,166, 48, 14,244, 24,140, 43,177, 70,173,170,172,128,
- 25, 3,115,133,226,215, 21, 42,127, 26,208,149, 30, 51, 3,166,100, 32,198,117,235, 10,131, 86,225, 5,129,141,144, 50,145, 80,
-143,203, 7, 35, 83,161,116,213,192, 24,155, 94,190,240,178,202, 6, 29,170, 76, 90,140,181, 79, 49, 14, 44, 37,160,151, 77, 74,
-244,100,162,227,248,111, 61,174,102, 40, 26,157, 40,133,232,106, 66, 99,153,121, 23, 89,136,168,176,116, 81,241, 48,222, 95,225,
-121, 67,156, 23,138,249, 44,188,114,139,142, 47, 19, 13,165, 42,149,107,180, 98,182,221, 98,219,214,237,116,187,235,116,123, 61,
- 30,126,228, 81, 6, 89,206,122,183,199,210,242,113,146, 52,197,121,207, 90,183, 27,198, 27, 89,156, 97,150,197, 74,203, 48,215,
- 74, 75,164,250, 37, 36, 41,161, 25, 12, 7, 40, 29,234,216,187,131, 17,253,225,136, 81, 62, 10,141, 83,136,241, 96,241, 88, 99,
- 99, 51,148,144,105,169,181, 66, 98, 34, 84, 40,201, 50,145,154, 14,224,169, 77,240,194,108,225, 77, 23,148,176,130,102,154,150,
- 43,161,223,235,243,212, 83, 7, 56,114,248, 8,189, 94,151,225,160,143,115, 66,158,141, 24, 13, 7,140,134, 67, 68, 28,217,112,
- 20,194, 15, 89, 86, 54,241, 24,131,186, 46,195, 32, 33, 20,165, 74,150, 46,148,159,201, 68, 72,233,100, 25,185, 66,165, 44, 81,
-169,178,108,204,196,228,190,170,247, 63, 93, 98, 91, 86,199, 20, 84,125,164,251,157,207, 43,172, 80,200, 49,112, 62,120,205,214,
-218, 50,115,190,168,121,119, 34, 49,252,145,227,197,151,201,113,168,113,146,110, 56, 39, 87,122,231, 85, 38,164, 48,120,148, 10,
- 57, 47,206, 5,195,202,249,216, 32,171, 18,250,171, 54,187, 10, 9,104,110, 50,188, 68, 76,222, 43, 28,177,200,216, 21,243, 93,
-156,103,121,173,147, 36,150,248,197,172,122,107, 72, 27, 13,180, 13,217,212,170,146, 19,149, 36, 9, 42,134, 8,138,202,138, 80,
- 34, 24, 18, 51,195,247, 6, 29, 19, 53,181,181,161,204, 46,150,216,121, 66,120, 46, 92,219,112,223,101,185,167, 59, 26,209,119,
-194,209, 94, 70,207,195,112,148,177,116,232, 40,195, 94,159, 65,230,112,198,210,237,103, 28, 91, 90,101,181,219, 71,119, 58,104,
-147, 34, 24, 6,162, 88,201, 28, 71,214,123, 28, 89,237, 49, 68, 51,112,134,158,211,172,244, 71,164,237, 54,199, 87, 87, 88, 27,
-172, 51,191,117,129,220,141,152,237,204,112,172,183,130,207, 51,154,173,148,100,182, 13,179, 45,148,209, 12,122, 93, 84,167,137,
- 78, 53,210, 0,179,169, 19, 12,183,108,128,157,155,193,116,218,184,229, 21,186,199,150,104, 54,218,144,107,150,158, 56, 74,170,
- 18,242, 44,167,209, 72, 65,121,210, 52, 65,156, 48,236, 15,176, 26, 52,161, 12,114,113,113, 30,165, 13, 7, 15, 31, 38, 73,155,
- 12,214,122,116,140,101,115,167,137, 85,130,207, 51,102, 91, 77, 82, 45,164, 6,172, 53,232,152, 28,231, 92, 94,160, 16,142,112,
-255, 11, 58,150,135, 10,121,238,177,136, 15,101, 83, 19,133,107, 50, 6, 86,136, 73, 58, 85,151,215,151, 11,164,236,225, 52,213,
- 5,172,100,106, 9,165, 17, 27, 83,243,170,140,245, 86,111, 56,145, 19,227,247, 74,141,169,211,147, 33,188, 42,227,220,149,158,
- 91, 78, 98,242,137, 62,193, 11,175, 36,247,199, 44,251,162, 46,188,218,203, 77,198, 37, 29,227,220,235,152,131, 46,149,158, 62,
- 76,132, 38, 84,121, 59,176,177,215,143, 47,147, 19,199,201, 66,178,113,165,128, 98,170,171,222, 84,155,172,146, 49, 56,209,200,
- 18, 29,142, 84, 36,159,133,155,187,202, 44,200,137, 29, 2, 42,201,143,177,202, 21,239, 2,147, 35, 33,251,110,220, 53,140, 16,
- 15,215, 82, 25, 89, 44, 63,147, 10,184,250, 74,147,179,144,229,103,202,218,240,105, 35,175,244,182,161,226,205, 23,185, 0,122,
-106,126,170,205,103,166, 58,229, 21, 37,121,241, 56, 33,121, 14,124,225,161,232, 10, 67,160,199, 73,147,197,202, 87, 69, 82,101,
-204, 2, 14, 89,198, 97,231, 70,201, 68, 92, 82, 77,182, 20, 11,128,150, 67,218,108,115,124,245, 17, 46,185,236, 18,156, 73,120,
-228,137, 39, 80, 24,140,241,172,173,173, 97,147,148, 70,179,193,112, 56, 68,161,201,114, 87, 26, 93,162, 96,152,119,209, 90,147,
- 38, 13, 92,150,211, 76, 67,104, 36,115, 35,142, 28, 62,204,214, 29, 59,105,183, 91,228,222,177,188,180,140,203, 67,178,151, 50,
- 9, 74, 2, 45,167, 53,216,200,236, 56, 23, 50,143, 37,122,241,170, 40,113,171,148, 91, 85,197, 36,182, 4,197, 52,209, 12, 6,
- 57, 54, 73, 17,160,223,237,243,240, 67, 79,240,196,227, 7,153,153,105, 99,147, 70,240,106,189,224,178, 17,189,110,151,108,148,
-225,242,208, 36, 74,137,196,220, 72, 85,246, 61,208, 90,227, 99,102, 55, 42,128,100,200, 53, 80,227, 46,120,149,117, 93,140,179,
- 0,236,106,199, 60, 19, 65, 70, 71, 90,189,122, 95, 22, 64, 95,236,203,139, 27, 87,113,136,170,244,123,240,228,177,153, 85,238,
-131,238, 48, 86, 69,195,195,134,100,202, 88, 93,226,240,228,121,134, 49, 22,165, 13,190, 50, 6, 31,235,192,173, 14,181,241,196,
- 26,121, 84, 48,106,198,140,161, 10,212,181, 49,101,197, 69,168, 52, 8, 37,125,218,132,100, 41, 99,108,200,179,200,163, 49, 17,
- 13,177, 34,115, 61, 96,110,104,166,160,117,104,110,163,138,138, 28,175,202,168,165, 49, 54,148,141, 90, 67,146,132, 4, 56, 99,
-131,241,230,179, 17, 73,146, 6,166,167,146,120, 91,220,113,137, 77,201, 92,142, 19,135, 21, 83,174,155, 34,206,175, 34,213,175,
- 98, 70,157, 23,202,108,251,162, 52,206, 0, 73,164,145,197, 90,116,163,129, 50, 64, 30, 40,123, 99, 21, 43,235, 61,214,189,163,
-173,133, 3,235, 75,204, 30, 94, 37,213,154,197,249, 69, 26,141, 25, 6,249,136,238,129,227,120,132, 86,187, 69,167,209, 8, 73,
-167,206, 65, 83, 88, 18, 97,132, 97,109,125,141,254,122,159,163,195,199,216,178,169,195,104,152,211,105,166, 72, 39,101,113,113,
-134,133, 77,219,120,234,169, 39,240,131, 17,170, 59,192,225, 81,157,132,206,214,121,134,171,235,144, 41,236,226, 12, 94, 67,107,
-215,229,140,158,120, 28,215, 95,195,180,103,177, 91, 23, 49, 71,143, 33,253, 33, 12,135, 88,163, 88, 29,245,217,185,243, 18, 30,
-127,242,113,230, 23, 54,161, 27,138,229,195,199,104,219, 16, 22,152,153,233, 48, 26,245,200, 6, 61,182, 46,204, 48,219,105,176,
-214,243,216,118, 19, 11,168,188,207, 66,187, 69,222,237,198,121,247,140, 70, 67, 26,141, 70,137, 25, 38,198,206,157,115, 36, 54,
-101, 48,200, 66,101,142,243,161,244,209, 11,182,208,124, 5, 43, 83, 40,209,178,213, 40,122, 3,197, 73,121,243, 84,111,184,113,
-108,106,178,249,160,174,212, 75,158,208,224,110,156, 88,126,154,178, 56, 93, 42,221, 83,149,194,203, 68,198,218,216, 19, 63,225,
-248,213, 30,178, 76,255, 61,149, 24, 88,246, 98, 28,151,147,249, 13,178,253, 39,230, 98, 42,246, 95, 85,152,122,220, 51,110,210,
-123, 56,211,100,133,147, 36, 38,158,116,230, 42, 9, 73,101,147,138, 34,110, 41, 30, 85,161, 67,169,100,210, 79,118,250,211,101,
-105,144,210, 6,209,161, 61,105, 40, 79, 19, 84,161, 95, 43, 73,135,186, 12, 53,108, 84,206, 56, 57, 55, 27,141,127,186, 59, 92,
- 53, 33,232,228, 29,242, 38,129,191,104,117, 43, 18,186, 92,169, 88,162, 86,109,247, 89,141,207, 23,237, 54,117, 1,234, 49, 4,
- 81,237, 58, 88,182, 1, 82,149,106, 9, 53,213,159, 83,160,215,239,179,178,182,138,177,150, 7, 31,252, 18,151, 92,254, 2,146,
- 67,135, 17,237,162,129,234,177,218,144,231, 25,137, 9,149, 14, 65,177,217, 96,128,120, 65, 91, 75,171,209, 12, 64,149, 57, 52,
-138, 70,154,194, 72,192,121,150,142, 28, 97,203,182, 29, 52,210,132, 68, 27,134,131, 65,152,183,220,209,239,247, 66, 25, 95,145,
-143, 49,213,166,181,136,205,134,210,183,144,148, 21,192, 96, 28,235,133, 80,130,166,180,142,140, 85, 65, 27,135,146, 26,163, 53,
- 62,247,172, 46,175, 49,202,150, 98,167,180, 28,148, 38,207,179, 50, 87, 67, 36, 36,225, 25, 47,101,239, 3,143, 43,217, 0,197,
-184, 20, 85, 25, 53,206, 82,175,228, 80, 76, 3,116,181,131, 96,113, 30,197,191, 69, 92,185, 0,156,130,190, 46, 26,208,248, 88,
- 62,166,140, 42,245,195,104,148,209,104, 36,129,214, 47, 58,170, 65, 73,173, 43, 69,204,228, 31,135,137,138,210,186,144,160, 56,
-190,183, 68,170,213, 25,227, 82,177, 49,144,187,113,153,109,245,125, 44,229,180, 54,193,123,135, 19, 79,150, 57,178,204,145,231,
-190,172, 0,242,185, 43,157, 21, 85,101, 7, 85,212,217, 50,214,225, 62, 86,212,148,249, 11,166,208,201, 30, 33,100,193, 83, 86,
- 22,229, 24,163, 66,254,131, 53,193,171,206,114, 92,238, 24, 56,143,177, 33,215,167,200,221, 40,238,163,162, 43,160, 73,211,144,
- 0, 88, 86, 27,248,192, 12,233,192, 12,129,132, 94, 33, 90,145,121,135, 31,244, 73,173, 33,141,172,128,228,158,102,136, 89, 52,
- 46, 0, 0, 32, 0, 73, 68, 65, 84,187,133, 86,138,227,221,117, 18, 44, 43,125,135,145,156, 39,250,135, 73,108, 8, 89,180,211,
- 4,131,208,234,204,210,180, 9,198, 11,166,149, 50,114, 67,122,131, 53,218,115, 11,164,237, 5,150, 14,193, 76,179, 69,187,213,
- 98, 54, 81, 12,215,214, 89, 95, 94,102,199,194,102, 70,235, 93, 46,219,182, 29,219,108,224, 92,142,206, 50,196,141, 96,243, 22,
-140, 79, 25, 29, 63,142,233,180,200,140, 39,153, 79,177,109,139,214, 33, 84,163, 91, 29,146, 70,138, 91,207, 89, 61,182,204,104,
- 52, 68, 3,157, 78,139,181,181, 85,150,151, 90, 92,113,197, 85, 60, 54,122, 28, 81,134, 45,139,139, 28, 60,116,128, 70, 83,179,
-222,237,177,185,209, 98,235,150, 45,172, 63,126, 8,155, 38,104,113,248, 60,195, 42,133, 53, 10,231, 50,208, 9, 74, 27, 70,131,
- 33, 77, 27, 67, 39,202,160, 98,203,106,231, 66, 95, 4,147, 54,131,202,113,193,174,179, 99,229,233, 35, 16,197, 62,200, 69,119,
- 47, 57,209,139, 83,138,169,150,164,234,148,160, 82,180,120, 61,121,131,117, 74,171,242,212,113,250,211,110, 48,209, 63,126,242,
-223,226,183,102,195,242,187,113, 47,228,208,192, 99,124,163,168,233, 60,188,178,100,232,140,227, 2, 19, 96, 48,238, 43,172,207,
- 16,196,171,115,171, 42,253,176, 75, 47,230, 20,185, 10, 82, 1, 68,181, 65,187,216,201, 74, 3, 53, 81,250, 86,206,223,244, 28,
- 23,229, 46, 42,100,180, 42, 93,105, 30,164,170,221,220, 42,221,230,166,128,122, 26,152, 67, 94,130, 63,101,152,166,240,208, 54,
-154,155, 82,193,151,157,219, 55,232, 31,175,252,134,151,107,162, 89, 79,185, 63,153, 72, 12,173,142,183,168, 29, 47,234,218, 79,
- 48, 50,162, 39, 50,200, 50,150,143,175,224,128, 81,158,243,240,163,143,210, 31, 12,104,180,218, 12, 6,195,144,193,234, 92,136,
- 91,198,184,106,154, 38, 12,134, 3, 58,205, 86,153,193,110, 98,151, 56,107, 76,232,110,214, 16, 52,138,225, 96,128,119,158,135,
- 30,124,144,118,187, 19,122,217,143, 70, 88,107, 24, 13, 7, 24, 29, 12,209,160, 76, 99,226, 88,225,221,169,241,253, 22,188,247,
-184,238, 99, 2,142,115,121, 72,250, 19, 41,251, 11,100,153,139,201,101, 62, 94,215,240, 95,106,146,216, 76, 97,220,157,206,121,
- 65,124,236, 84,103,198,160, 93,109,162, 82,140,163,104, 35,140, 31,119, 72,172, 26,158, 27, 25,113, 89,150,149,177,246, 2,172,
- 11,239,220, 87,107,184, 43,241,246,220,141,195, 13,129,150, 15, 44, 70, 81, 53, 97, 98,205,120,136, 3, 83,122,158,185,119,101,
- 13,184, 54, 38,128, 36, 99,246,104, 52, 10,173,110, 11,227, 34, 73, 44, 58,198, 75, 75,138,188,194, 28, 84,141,200, 34, 1,109,
-114, 78,138,241,197,100,206,104,100, 20, 61, 6,202, 30, 11,106,220, 35, 99,162, 91,103,108,115,173, 43,250, 65,219, 80,207,140,
-137, 6, 78, 30,235,216,167,140,240, 44, 23, 68, 12,248, 17, 9,150, 36, 77,104, 88,131,246, 69,206,203,184, 77,120, 48,148,132,
- 36, 77,202,117, 42, 46,143,201,145,141,192, 70,138, 39,207,114,180, 10, 52,178,169,244,181, 80,132, 10, 11,229,130,177,146,197,
-184,124,226, 52,189,225, 0, 47,150,129,119, 88,147, 4, 3, 88,192, 15,115, 90,105,194,166,206,102, 18, 45, 28, 91,239,178,186,
-190,198, 76,179, 65,195, 41, 90, 45,203,182,133,237,236,220,177,133, 99, 71,142,161, 26,194, 85,151,109, 70,178, 1, 91,230,183,
- 99,181,208, 79, 91,248, 92,211,237,174, 50,127,245, 78,124,106,192, 40,196, 1, 46, 71,245,250,152,180, 65,179, 51, 67, 62,200,
- 73,182,205,134, 78,120, 6, 52,121,104, 84,229, 5,175, 53,195,110,151, 39,247, 63,134, 21,197, 32,207, 1, 71,179,153,210, 93,
-239,242,248, 99, 79,210,108,182, 56,118,228, 40,173,206, 12, 30, 69,127,144,177,180,180, 66,163,213,161,221,110,178,125,235, 22,
- 14,254,255,156,189,217,146, 36, 71,154,165,119,116,183,197,221, 35, 34, 19,168, 2,170,186,171,167,187,103, 19, 82,134, 34,188,
-227, 35,240,177,240, 98,124, 5,138,144,188, 24,161,112, 70,122,175, 2,144,153,136, 8, 95,108,209,149, 23,191,170,154,154, 71,
- 36,170,100, 26, 18, 82,232, 64, 70,164, 47,230,166,255,114,206,119,254,248, 35, 98, 98,208, 66,195,185, 5,189, 34,240, 77,100,
- 18, 90, 74,196,213, 34, 50,210, 35, 68,134, 44,160, 13,128, 80,232, 76, 7, 27,200,138,232,124, 64, 72, 60,119,234,181,203,140,
-155, 38, 60,165,198, 50,246,182, 27,175, 10,225,180, 63,108,191,218,173,167,191, 64, 92,199,247,227,215,191,244,192,124,255, 0,
- 76, 59, 31, 60, 99,251, 84,128,173, 11,100, 59,207,124, 66,130,128,120, 51,202,110,105, 83,169,165,238,221,249,195, 89,129,195,
- 48,145, 15,209, 88, 87,252,172, 17,146,129,189, 45, 98,254, 92,167, 94,111, 82, 72, 32,102,213,230, 83,103,239,112,223,171,225,
- 44,177,119, 34, 45,182, 98,103,123,255,226, 93, 0, 67,220,176,181, 77,168, 13, 18, 49, 1,164, 20,153, 80,133, 6, 94,146,154,
-131,176, 97, 30,180,129, 3,123,187, 65,115, 83, 98,239, 31,216,205, 60,125, 11,132,105, 67, 15,218,194, 44,189, 89, 99,188, 89,
-229,236, 70, 78,216,214, 46,109, 16,199, 87,223,147, 50,116, 15, 59,209,221,155, 63,199, 0, 23, 34,250,113, 4,231,155, 7, 59,
-196,136,117,181, 96, 76,160, 51, 26,118,153,179, 69, 75, 98,181, 11,148,234, 17,163,196,195,233,128,215,215, 23, 12,125,143,215,
-215, 11,237,237,203, 78, 53, 70, 68,231, 33, 33,224,150, 21,201,123, 44, 87, 18,222,176, 16, 16, 83,128, 96,200,138,100, 90, 91,
-109,187,115, 58,120, 90, 17, 25,242,129,209,210, 24,185, 84,213, 90, 22,124,160, 3,162, 20,106, 89, 89,207, 52, 29,230, 92, 8,
- 8, 65, 54, 61,161,232,160, 93,236, 10,166, 68,222,241,147, 62, 55, 6,208, 90,160,132,249, 52, 92,116, 6, 81,239, 37,109, 55,
-219,118,185,155,136,108,179,167,181, 64,150,246,207,128, 19,151,221, 59,151,109, 89, 89,151,145, 15,118, 41, 52,229, 48, 56,215,
- 92,131,244,119, 42,174,242,206, 55,238, 62,255, 45,166,181,248,211,233,113,216,252, 25, 34,191,112,101,173, 99, 43, 70,156,115,
-187,105, 79,185,182, 67, 44, 7,158,130,214,166,146, 38, 99,140, 88,150, 5, 34, 59, 9,202,206,220, 90, 11,169, 5,198,126, 4,
-103,192,106,137, 9, 16,171, 98,158,220, 0,146,211, 10,204, 40, 3,173, 21,221, 91, 89,230, 22, 20,234, 94, 66,126,254, 41, 99,
-118, 89, 37,251,129,231,247, 56,255, 25,157,247,228,206,249, 60,217,201, 54, 71, 79, 66, 89,203, 44,140, 49, 48, 66, 33,120, 15,
-235, 61, 9,239,138,224,209, 59,104,158, 7,195,130,180, 67,116, 46,208,193,239, 98, 4, 7, 17, 56, 95,158, 95,203,146, 23, 82,
- 41,120,112, 40,169,161, 59,133,232, 45, 98,240,248,252,229,130,190,151,144,130, 86, 97,110, 89, 49, 40, 78, 5,164, 7,254,248,
-207,127,196,249,114,129,157,110,120,249,252, 9, 18, 30,143, 29,137, 93,163,245,248,252,211, 23,232, 7, 9,121,232,192, 58,133,
- 32, 18, 68, 55,192, 77, 19,150,231, 51,186,223,126, 3,244, 3, 77,177,179,150, 73,244, 61,184,209, 72,243, 4,188, 92,160,250,
- 3, 46,151, 47, 16, 14,248,112,120,128,240, 51,188,117, 56, 62, 28, 97,109, 0,151, 2,171,243,248,246, 55,191,197,207,159, 62,
-231,181, 8,195,243,235, 5,227,241, 2, 46, 21,134, 94, 67, 26, 1,107, 29,116, 55,162,115, 1, 2, 17, 54, 88, 40,169,144,172,
-133, 0, 33,164,201, 49,193, 17,243,245,183,216, 0, 31, 81,245, 60, 76, 42,184,192, 32,223,132,129,240,125,218,213,215,187, 78,
-246, 21,236, 43,154,195,126,155,171,179, 95, 25, 71,167, 50, 25,104, 25,228,117,228,206,118,221,125,123,184,190,231,139,111, 15,
-243,242,225,120,239,103, 42,151,188, 40,235,219,156,181, 24,238, 14,156,125,119,201, 91,245,221,123, 35,224,146,134,197, 0, 68,
- 78, 33, 8,205,206,125, 27,241,178,183,211,138, 95,233,210,121,229, 68,147, 32,253, 30,236,243,238,248,122, 47, 82,104, 14,183,
- 84, 71,204, 91, 17,246,254,235, 74,157, 79,161,234,229, 0, 27, 38,239,128,193,169,241, 20,163, 6, 61, 32,171,227, 75, 24, 78,
-123, 35,222, 30,119,218,144,184, 45,179,155,241,187,215, 21, 85,241, 94,212,184,169, 9,132, 73,213,201, 16,191, 34,194, 44,128,
- 17,177,155, 64,149,107,149, 97, 19,113,149,240,160, 90,144,213,199,154,133, 83,108, 91,163,188, 9,146, 73,168, 34,187,159, 63,
-253,130,177, 83, 88, 87,139,199,195, 1, 74,221, 72,113,237, 29,188, 40, 62,113,142,195,241, 4,185,208,200, 90, 41,133,235,249,
- 5,136, 33,119,232,212, 65,134, 12,249, 40, 65, 36,235,186, 2,145,246,182, 68,126,203, 97, 15,121,116,109,145,114,199, 77, 35,
-107, 33, 37, 98, 6, 87,164, 24,193, 19, 65, 89, 2,227, 89, 24,185, 63,116,202,168,154, 10,130,109, 47, 75, 8, 83,150,141, 52,
-249,117, 10,156,138,137,196,161,164, 0,227, 6,214,123,240, 16, 32,132,132,103,196,174, 23,249,243,230, 51,103, 92,114,153,139,
-157,172,153,201,188,130,214,126, 87, 14,212, 50,165, 41,193, 40,173,253,139,132,222,164,220,102,130,193, 7,255,238, 78,190,144,
-221, 56, 74,158, 73,170,187, 97, 42,118,232, 0, 44,229, 95, 17,218,181, 30,241, 86,105, 94, 14,193, 80,137,119, 84,156,172,235,
-186,179,230,149,221,185,148, 98, 55,129,144,146,214, 47, 46,120,196, 53, 65, 43, 5,165, 36,164, 52,248,248,241, 9, 96,192,178,
- 76, 36,156, 11, 17,189,145, 16, 66,210,193,204, 57, 62, 28, 30, 0,198, 48, 47, 75,134, 67,145,154, 94, 9, 78, 97, 54,121,130,
-192, 56,105, 74,188,247,224,140,195, 89, 71, 7,187, 32, 75, 89,215, 27,112, 46, 41,135, 32, 3,188,220,106,113,181, 43,148,224,
-152, 67, 64,223,245,232,250, 1, 49, 70, 88,107,161, 20, 9,122, 75,160,205,186,174,232,164,198, 48, 24,116, 93,135,224, 3, 98,
-182,222, 41, 69, 54, 54,231, 61, 61,151,204, 4, 40, 2, 66,145, 69,188, 28, 9,156,251,236,201,166,251,138,115, 30, 8,145, 44,
-111, 82,100, 55, 8, 0,151,224,167, 5,227, 96,208,247, 3,184,228,120,189,205, 88, 22,139,225,248,128, 37,246,152, 87,139, 63,
- 12,223,225,227,168,112,250, 48,194,135, 5,236,242,130,197, 95, 96,216, 9,235,229,138,238,216, 65,118, 6, 24, 53, 4, 79,152,
-127,249, 5,189, 18, 72,125, 7, 88,135,148, 60, 24,215,128,236, 9,135,251,252, 35,248,101,130,232, 62,192, 79, 14, 15,102,196,
-186, 0,231,151, 23,124,126,126,134,231, 9,195,233, 1, 63,125,254,132,117, 94,241,135,223,255, 30,183,219,140,105, 89,145, 66,
- 0, 67,196,151, 47,207,248,171,191,254, 43,132,232,224,163,199,225,112,192,109,182,120, 26, 6,136, 96,225,111, 30,146,209,202,
- 75, 74, 1, 33, 57,253,221, 49,100,190, 72, 33, 34, 74, 88, 79,171, 25,135,132, 41, 49,136,177, 27,126,216,143,119,183, 94, 4,
-239,141,163,255,135,118,192,236, 13,183,124, 67,154,147, 79,184,132, 9,220,239,208,222,219,231,191, 17,131,181, 59,209, 20,119,
- 69, 74,123,128,108, 31,238,175,117, 87,109,184,200,190,232,120,111, 20,248,181,175, 45, 32,166, 8, 77, 26,143,122,225,211,223,
-165,149,177,255,129, 81, 60,218,248,192,180,247,184,178,118,143,206,246, 99,100, 94, 9,188, 44,251, 74,211, 87,223,207, 24, 99,
- 78, 10,203,146, 58, 46, 32,133,202,157,163,216,184,237,108,255,123, 42,244,162, 96,168, 88,172, 99,120,158,217, 5, 12,236, 77,
-156,207,215,118,235,239, 64, 19, 50,111,255,235, 41,127,239, 61,159,242,126,252,218,238, 62,181,100,197, 50,209,204, 98,123, 81,
-113,195,251,196,185,118, 92, 92,186, 17,128, 97,186, 93,240,248,112,194, 48,244,164,116,207,156,119, 58, 12, 36,132,228, 56,158,
-142, 56, 28, 14,136, 49,212, 93,112,111,122,196, 76,175, 27,134,177,138,194, 74,221, 90,212,213,197, 46,165,132,132, 96, 84,197,
- 11, 78, 30,107,169,120,245,241, 23,251,216,110,151,155,147,233,116, 78,109, 43, 65, 42,229,128,187,215, 58,112,145,119,191, 5,
-107,154, 34, 65, 83,132, 32, 1, 85, 14, 47, 41,201,124, 68, 21,163, 34, 89, 10, 1, 41, 36,148, 80,116, 67,138, 33,139,169, 98,
-245, 79, 87, 69,118, 62,200,203,174,191,221, 57,151,251, 67,129, 11,165, 12,220, 72,237,245,159,139,118,158,167, 26,200, 69, 76,
-185, 74,138,109,148,246,207,132,158, 45, 5, 68,140,161, 2,121,218, 53, 64,123, 47,217,114, 18,248,206,195, 95,224, 68,156, 23,
- 64, 12,117,197,125,223,215,199, 30, 2,193,111, 74,247,189,174, 22, 49,146, 82,218,104, 13,103, 29,166,121, 6, 99, 9,175,175,
- 47, 88,150, 5,199,177, 3, 67,132, 82, 2, 93,103,224,188, 67, 76, 30, 92, 48,248,224, 0, 22,209, 15, 29, 66,112,132, 52, 77,
-100,187,227,130, 99,153,167,124, 79, 68, 38, 32,122, 12,195,128,135,135,135,236,195, 7, 68,126,157,157,119, 72, 41,194, 46, 43,
-188,179,144, 74,162,235, 58, 8, 46,209,153, 14, 66, 42, 88, 75, 62,112, 99, 52,148,146,249,253,163,247, 67, 10,137, 24, 28, 49,
-241,157,219, 68,152, 69, 15,194, 5, 77, 77, 98, 32, 69,124,162, 61, 48,229, 15, 16, 69,145, 44,142, 17,178,215,240, 41,194,122,
-151,167, 65,128, 54, 18, 49,122, 76,203, 2,159,157, 45, 99,215, 67, 11, 1,248, 0,149,195,101, 2, 18, 14,167, 39,220,110, 51,
-122, 35,241,159,255,254, 15,120, 24, 36,188,159,161, 68, 66,176, 43,158,158, 62,226,233,227, 7, 48,163,225,167, 9, 76, 75, 48,
- 9,112, 41, 33, 4,135,237, 56,244,183, 31,137, 47,176, 92, 33,250, 17, 44, 36,240,152, 32, 83,130,212, 10,184, 5,252,244,255,
-254, 19,194,205, 34, 6, 6,101, 6,252,233,231,159,241,248,241, 3, 68,182, 61,122,235,177, 46, 43,184, 16,120,126,189,162, 27,
- 6,132,224,208, 15, 29,180,214,184, 77, 19,124, 76,184, 92, 38, 44,215, 27,190,233, 59,140,130,193,205, 11,180, 82, 8,222,225,
- 48,246, 88,115,114, 97,200, 83,181,152,104, 18,152, 24,137,107, 87, 31,177, 50,129, 63, 94, 23,136, 83, 55,254, 16,239,110,164,
-156, 53, 62,236,108,104,122,239, 64,255,181,131,168, 61, 88, 99,138, 25, 52, 74,255,148, 94, 43, 34, 3, 75, 50,142,113, 75, 3,
-195,157, 58,125,207,153,223, 58,248,141, 59, 79, 95,241,171, 54,184,251,239, 85,214, 56,123,155, 81,195,192,222, 60,199,251, 67,
-125,207,137,190, 63,212, 9, 54,193,179,205,139,151,220,109,108, 81,173, 91,180,201,215,191,190,246, 60,246, 40,216, 45, 93,237,
-189, 3,173, 30, 58,119, 59,110,114, 26,198,221,222,253,107, 83,148,194,148, 47, 86, 58, 33,228,118, 99, 76,121,225,192, 54,177,
-161,224,105, 83,144,215, 47,182,115, 69,180, 46, 51,252, 10,177,112, 87, 76, 50, 52,163,119,126,183,143,103, 59,182, 1,208, 90,
- 35,177,193,120,176,207, 19,104, 85,252,169, 69,218, 98,235,208, 25,163,231, 83, 38, 17, 53,150,160,137,167, 21, 69, 29, 95,199,
-248,140, 48,192, 33, 96,158,174,232,123,131,241,112,192,249,114, 1, 18,195,241,112, 68,223,119,228, 59,205, 52,178,105,154,104,
-244,137, 4,109, 52, 69,215, 34, 65,155, 14,203,178,108, 17,233,130, 99,117,150,118,187,156,103,101,118, 14,104,137,148,204, 70,
-234,118, 58,184,124,230, 66,167,166,160, 46, 65, 77,165, 67,111,197,102,117,207,126, 55,230,142, 49,194, 89,151, 15, 64,178,156,
-209, 77, 94, 86,206,119,138,168,135,122,240, 1,198, 24,168, 92, 52, 32,131, 83, 10,165,145,113,212, 2,164, 88, 50, 83, 62,144,
-247, 22, 45, 84, 54,124,204, 40,223,216,192,131, 82,158, 62, 20,101,121,140, 4,135, 41,239,183, 16, 18, 74,234,234, 87, 37,155,
- 96,193,213,102,156,110,198, 6,135, 72,120, 99,173,245,190,160,201,239,115, 59, 1, 76, 57,156,188, 76,128,138,247,220, 24, 93,
-175,197, 16,124,157, 14,148,169, 0,137,242, 40, 82,214, 24,131,190,239,235,216,189, 51, 26,135,195, 0, 37, 5, 30,142, 7,244,
-157,129,150, 2, 82, 16, 14,116, 93, 22,140, 67,143,195, 56, 82,199,188, 44,116, 87,141,200, 42,246,132,105,154,177,204, 14,206,
- 90, 34,224,229,112, 32, 6, 96, 24, 6,204,243,132,101, 89,112, 58, 29, 96, 58, 3, 31, 61,152, 32, 21,188,200,151,191, 82, 10,
- 46, 23, 78, 70,107, 4, 31,225, 86, 7,239, 92,166,202,209, 97,219, 25, 3,163, 13, 21,108, 74, 81,130, 88,190,134,188,243,240,
-214,213, 27,185,181,150,120, 5,117,252,158, 50, 51,131, 33,248,144,135,186, 17,224,140, 96, 75, 57,190,213,123,139,224,125, 78,
-150, 76, 96, 66, 34,228,207,165,179, 43,180,228, 24,187, 14,167, 67, 7, 36,135,224,102, 40, 35, 96, 12,199,114,253,140,239, 63,
-244, 56, 14, 9,122, 16,136,243,132, 65, 31,208,141, 39, 48, 70, 40, 97,230, 3, 68,167, 73, 35,179,102,216,142, 20,224,198, 32,
- 5,155,109,191, 26,225,229, 21,105,153, 50,118,216, 35, 37,141,244,124, 5,151, 6, 63,255,252,140,227,195, 7,252,233,167, 79,
- 25,203,155,192, 66,192,195,120, 0, 24,217,205,150,213,195,135,128,161, 55,112,206,162, 31, 7, 72, 73,209,172, 92, 40,104, 46,
-193,237,140, 35,103,120,236, 7,172,243,138,126, 28,225,252, 68,164, 63, 41, 41, 13,210, 57,250, 60, 39, 86,211, 11,215,144,112,
-245, 12, 63, 94, 23,136, 67, 55,254,208, 70,111,238,186,186, 44, 94, 43,157,230,123,221,207,215,148,203,233,142, 45, 94, 82,149,
- 80,111,162, 45, 48, 36,127,197,180, 75, 21, 67,179, 91,175,140,242,250, 59,247,157, 89,217,231,214,113,113, 99,107, 77, 59,128,
- 78,164, 12,242,119, 70,251,117,195,158,216, 27,248, 77,107,233,251, 53,245,117, 41, 14, 98,179,179,221,145,234,107, 80,247, 95,
- 66,228, 75, 95,221, 51,167,134,192, 86, 35, 83,223,217, 33,115,190,249, 95, 25,107, 39, 49,177, 30, 88, 96,111, 39, 6,187, 27,
- 88, 42,222,114, 14,206,201,151, 93, 38, 26, 40,234,242, 24, 42,193,106, 43,152, 18, 1,212, 50,170,148,231, 49,113,249, 57, 81,
-146,218, 10,174,156,237,119,231,239, 78, 14, 18,219,237, 42, 83, 98,119,187,238,253, 4,160, 36,222,148,117, 7,103, 28,239,201,
- 59, 88, 35,209,103,205, 26,129,231,238,124, 11,162,217,126, 79,187,163, 23,124,243,227,111,224, 19,138,139, 13,222, 66,107,137,
- 63,252,205, 31,160,148,198,243,243, 47, 56, 12, 61, 18, 34, 86, 79, 59,209, 97, 24,113,187, 94,225,125,168,228, 52,151, 71,239,
-171, 93,225,125,128, 84,186, 38,152,133, 24,178, 63,121,191, 91, 46,210, 7,231,108,165,202,197,196,106,152, 15,242, 24,188,248,
-180, 89, 83,248,181, 19,169,251, 78,189, 32, 92,169,104,219, 8,133, 60, 79, 36,164,212,180, 46, 97, 27,159,128,115,158,209,206,
- 44,231, 50,160,250,154,193,182,117, 2,249,178,233,171, 8, 64, 91,154, 28,238,216,245,177, 65, 29,151,201, 79, 97, 51, 72,169,
- 43,219,225,126,114,213,254,255, 74,137,186,250,104, 71,253,117,117,116,183,150,242, 25,215, 90,254,108, 41, 96, 40,144, 37,230,
- 41, 7,207, 19, 24, 13, 6, 98,187,151, 48,172,237,245, 44,142, 3,149, 39, 48, 30,211, 52, 33,198, 80, 51, 14, 24, 75,144,138,
-103, 39, 3,141,194,199, 97, 68,204, 93,190,115, 14, 33, 4,140,195, 8,173, 53,132, 36, 44, 45, 7, 48, 12, 35,198, 97,160,245,
- 10, 24, 98, 72, 89, 61, 95,232,132, 20,247, 43,165,200, 43, 2, 6,211,153,202, 47,144, 66,192, 40, 67,147, 18, 46,192,165,204,
- 43, 32,149, 89,232,168, 0,148,132,136,101,153,225,203, 72, 61, 37, 24, 77, 83, 60,173,116, 62,220,105,197, 67, 69, 0,242,251,
- 26,234,189,197, 57, 7, 95,116, 1, 62,228,148, 75, 58, 11, 56, 24,122, 99, 32, 25,131, 86,146, 10, 7,173, 9,128,163, 53,148,
- 20, 0,143,112,193,194,217, 25,138, 39, 60, 29, 58,124,115, 60,224,177, 31,112,253,229, 5,235,229,138,135,195, 8,228, 41, 70,
-127, 26,160, 30, 6,120,120,204,231, 11,204, 55,143, 8,215, 27,120, 2,146,117,192,109, 65,180,142,212,251,193, 99,241, 11,116,
- 63, 32,121, 14,255,203, 47,224,154,195, 49, 6, 8,137,248,122, 67,178, 17,209, 3, 63,254,248, 5,156, 27,188,188, 92,240,205,
-199, 15, 24,123,147,247,225, 0,151, 10,231,243, 21,224, 18,151,235, 21, 74, 41,112,193,170,234,252,124,157,225, 60,192, 66,128,
-242, 22,143, 82,224,168, 13,110,183, 25, 93,111,192, 68,194, 60,205, 20,211, 28, 60, 66,140, 13,167, 67, 16,113, 50, 50,220, 60,
-199, 47, 54,179,223, 83,220, 70,215, 37, 65, 43, 33,147,202, 18,175, 42,109,206,183,240,142,138,203,188,251,135,224, 2,185,146,
-206,190,207,128,210,169, 55,209,156,205, 1, 21, 83, 36, 48, 1,167,145, 74, 81, 94,165, 98,183,203,221,125, 77, 27,163, 74, 35,
-255, 93,205, 87,153, 3, 48,212, 36,180,218,137,101, 50, 25,120,193,184,242,221,228, 54, 53,227,106,158, 43,143, 84, 90, 26,196,
-253,238,151,181,211,130,252, 88,211,118,200, 20,212,100, 10,233, 46,180,246,110,199,253,103, 45,105, 44,231,103,167,157,119,188,
- 93, 53,144,100,184,164, 59,221, 9,188,120, 3,173, 64, 34,206, 74, 3,147,160,233, 33,171, 34, 31,178,181,196, 55, 30,133, 80,
-102,190,137, 83,101,205,196,166,106, 47,217,213,249, 90, 40,137, 80,172,250,202,219,192,214,230,181, 76,239, 72, 18, 24,165,180,
-177,106,104,103, 77, 93,151, 42,161, 10, 57, 57,172, 74, 5, 10, 14,177,124, 47,231,129, 39,132,230,103,202, 9, 22,107, 55,125,
-239, 42,104,199,231,228,187,103,100,215, 99,205,116,163,181,235,113,158,115, 2,248, 86, 12,166, 13, 48,196,184,168, 69,100,240,
- 14,255,254,239,254, 22,243,237,130,101,186,225,219,143, 31,224,220,138, 24,232,102,183,206, 43, 98, 32,254,123,201,172,174, 26,
-140,124, 33,115, 38,114,135, 64,196,176,224, 3, 4, 35,230, 54,203,227,113, 41, 57,152, 32,159,188,146, 10, 37,224, 54,100,255,
-112,140, 17, 41, 68,168,172, 28,231, 82,228,180,174,205,181, 32,164,216, 20,255, 57,110,147, 11, 78,212, 48, 73, 8, 86, 33,120,
-245, 99, 11,145, 69,147,172, 32,121,233,218,244,209, 87,133,116, 68,170, 9,103, 33, 6,162, 97, 57,159,209,194,219, 8, 39,230,
-235,186,136,228,182,130, 29,164,227, 72,121, 52, 47,228, 54,105,200, 69, 21,203, 24,211,152, 39, 14,111,249, 1, 60, 79, 54, 66,
- 78, 62,139,187,221,188,200,202,246, 80, 10,165, 70, 88, 26, 34,229,130,103,105, 57,100,142, 90, 45, 9,130,198,232, 10,119, 90,
- 22, 11,187, 58,196, 72,217,239,101, 74,226,115, 51,194,243,228, 96,154,103, 4,231, 32,121, 66,215, 41,116, 90,224,116, 28,113,
- 60, 82,167,222,247, 29,148, 82,152,110, 11,230,121,193, 48,244, 88,237,146, 71,240, 1,211,188, 64,104,218, 85,171,252,188,125,
- 62, 24,237,106,177, 46, 83,222,161,211,227, 85,154, 32, 51, 82, 9,218,221,107, 5, 41, 41, 54,182, 51, 26,189,238,154,162,135,
-196,133,222, 59, 40,173,161,141, 34, 0, 81,103, 42,112,135, 53, 40,112, 89, 38, 45,177,172, 67,136,239, 33,149,130,233, 58, 8,
- 33,161,149,206,159, 19, 15, 33, 56,188,115, 85,159, 33,179,144, 83,230,192,155,226,100,138,206,226,113,232,112,234, 58, 40, 78,
- 77, 89,223,107, 32, 56, 60, 29,143,128,163,180, 68,173, 12, 82,138,152,166, 43, 98,112,248,254,233, 17,255,233,239,255, 30,255,
-240,175,255,130,241,241, 1, 99,215, 65,135,128, 56,205, 8,158,129,153, 1,235,243, 11, 12, 4,210,101, 66,124,189,129, 45, 14,
-108,177,184,124,121,134,246, 12,188, 31,144,192,193,149, 65, 92,110, 72, 97, 69, 24,122,232,161,167,235,207,115,132,217, 34, 76,
- 22,243,117,133, 95, 35,190,124,254,130,111, 62,126,196, 50, 47, 72, 9, 20,241,203, 56,166,121, 6,192, 48,223,230,154,182, 89,
-120, 12,231,219,130, 16, 18,100,138, 16, 49,224,113, 28,193, 66, 68,112, 43, 20,223, 10, 75, 41, 84, 21, 92, 11, 73,247, 64, 23,
- 73,218,189, 88,224,186, 4,138, 1, 59,152,195, 15,228,101,140, 57, 0,128, 85,198, 58, 71,238,172, 74,203, 82, 41,107,251,253,
-120,172, 29,227, 54, 14,163,160,178, 50,102, 79,136, 44,238, 70,173, 49, 6,148, 98,162,138,224,242,190,147, 53, 34,180,162, 52,
-143, 44,100, 14,249, 94, 56, 94,252,188, 49,165, 55,143,109,167,153,103,187,224,214,186, 83, 78,119, 66, 44,198, 80, 97, 60,247,
-132,188,189,230,236, 94,101, 31,247,135,109, 62,236,144,246, 49, 38,205,171,182,251,247,237,144,190,243,213,167, 86,139,157,246,
-118,152,156, 50,151,238,152,230,117,151,206, 25,209,159, 56,175,126,113,214,250,198, 27, 91, 53, 82, 34, 26,108, 33,155,101,146,
- 94, 40,176,141,140, 74,229, 76, 2,188, 20,122,145, 94,135,230,181, 47, 16,140, 86, 8, 87,108,144,229, 53,223,240,177,119, 2,
- 63,214,218, 18, 75, 81,179,253, 79,204,111,124, 76,119,239,197,110, 71,206,106,113, 81,118,166, 27,177, 14, 13, 56,233,253,233,
-196,118, 45,150, 68,210, 22,237,123,175, 79,192, 22, 84,204, 54, 97, 29,178,194, 56,178, 4,134,152,147,247, 18,254,240,251,223,
-225,122, 57,211,104, 14,192,233,116,192,178,206,208, 90, 83,237,200, 57,172,115,164, 14, 22, 57,178,182,218,182, 4,141,221, 66,
-132, 80,162, 22, 61, 5,243, 42, 21, 37,254,113,193, 41, 81, 47, 39, 76, 21,176, 18,141,245,177,227,173,151,175, 66,156,107,189,
-222,101,188, 93, 60,223, 33,209,138,140,246,185,177,134,144,132, 16,176, 44, 11,233, 1, 66,192,178,174,181,203,246,222, 55, 19,
-133,184,165, 3,102, 52,108, 33,155,165,252, 60,200, 6, 23,191,226, 88, 96,217,243,206, 16,163,191,243,195, 16,210, 85,137, 34,
-180,162, 67, 98, 19,194,198, 76,109,204,214,221,244,150, 48,183,125,166,238,175, 45,177,225,144, 99,128,148,148, 56,214,117, 10,
- 90, 82,198,182,148,116,160, 25,173,161,132,196, 97, 28, 97,140,201, 97, 44, 60,107, 31,120,101,228, 35,209, 14,190, 51, 26, 70,
- 75,244,125,135, 97,232, 96,122,141,152, 40,178, 54,166, 4, 99, 58,138,111,133, 64, 76, 17, 74, 11, 28, 14, 3, 86,187,162, 31,
-122,204,203,140,105,186,210, 65,157,155, 21,202,184,183,248,240,244,152, 9,112, 2,195, 48, 82, 6, 60, 35,129,101, 65, 22,120,
-151,211,244,154, 66,177, 51, 93, 93,117, 48,206,208,117, 29, 21,104,193,195,121, 7,187,174,213, 50,168,141,105, 86, 82, 28, 41,
- 36,132,136, 92, 48,162,250,236,121, 46,250,104, 37,146, 54,140,113,158, 0,109,201,118,165, 80,102, 4,164, 97, 9, 41,121, 24,
- 33,240,215,191,251, 29,144, 2,166,117,129,139,100,193,156,174,183, 92, 64, 11, 88, 31,225,124,128,233, 12, 62,124,252,128,231,
- 47,159,112,155, 39,124,190, 78,208,166, 7,124,196,111, 30,159, 96,184, 4,227, 10,126, 90,193,124, 64,184, 46,224,137, 35, 44,
- 14, 10, 2,112, 17,183,231, 51,226,109, 5,143,192, 50,175, 20,194,195, 3,212,177,135,139,180, 94, 72,214,194, 45, 1,176, 1,
-243,207,207,208,188,199,229,229,134,105, 90,208, 13, 61,126,121,254,130,241,112, 64, 74,156,220, 46, 92,224,245,245,156,115, 31,
-202,109,159,225, 48,142,152, 87, 7,239, 35,122, 37,192,189,199,168, 52,252, 50,131,167, 8,165, 41,131,157,138,213,152,175,245,
- 60,233, 74, 64, 4,135,243, 9,171, 75, 88, 60, 53,190,212,169, 55,135,122, 9, 45,217,236, 72,172, 65,176,110, 68,176,221, 81,
-213, 28,170,169, 5,170,182, 9, 90, 41,108,227,241, 60, 90,217,163,101, 0, 81, 63, 66,108,103,215, 34,188, 96,115,184,221, 67,
- 67, 50,187,155,186, 79,254,118, 79,219,144,106,121,217,113, 51,142,247,220, 74,239, 81,109,217,206,183,221, 10,237,246,194,172,
-214, 15,191,183,214,225,174,187, 78,119,226,190,253,247,139, 58,127,255,179,241,206, 29,176, 23, 6,182,121,247,101,158, 93, 87,
- 38,117,172,135, 38,107,190, 21,234,109,175, 77,219, 93,111,175,109, 89,130, 11, 48, 33, 51, 99, 62,143,240,203, 99,102, 13,174,
- 38,165, 93, 22, 58,231, 69,152,149, 26, 37, 58,175, 57, 2,245, 49, 52, 73,121,219, 53,215,196,129,178,141,225, 94,127, 54,189,
- 53, 58, 50,126,119,237,166, 18,187,139, 59,109,198,251,182, 55,158,215, 18,140,109, 44,129, 54,117,142,109,115,235, 77,195,192,
- 83, 19, 6,180,173,123,106,244,109,136,248,155, 63,252, 53,142,135, 3,110,183, 11, 24, 79,248,253,239,190,199,183,191,249, 45,
-172,181,152,215, 21,171,119, 20,230,226, 86,244,125, 7,239, 45,237, 58,149,198,188,172,136, 89, 53, 94,120,236,164,244,166,137,
-147, 50,134,172, 83,193,109,233,122, 89,208, 19, 66,160,157,101, 86, 59, 23,149, 54, 69,144, 18, 28,132,160, 46,161, 30,184,180,
- 95,166,131,222, 90, 11,231, 72, 73,205,193,105,156,234,233,239,177,206, 17,243, 60,211,210,202,110,254,126,250,180,121,177,243,
-168,159,109,136,225,132,180, 99,155,223,255,108,241,110,111,197, 62,169,200,137,246, 70, 72, 94,169,100, 62,172,182, 42, 48,198,
- 64, 74,172, 6,237,204,114,197, 88,126,103,137,232,221,236,115, 84, 8, 73,158,167, 2,249, 49,107, 45, 41,124, 36, 69,112, 70,
- 19,205,227,113,128, 49, 10,198, 24,116, 93, 15,100, 33,154,247, 30, 90, 75, 60, 62,158, 48,244, 29, 66,240,248,230,219, 71, 72,
-201, 48,244, 26,167,211,128, 97,208, 56, 12,116,152, 31, 14, 35,249,223,179,170,124,154, 23,204,243,138,235,245,138,195,241, 1,
- 66, 48,132,232,160,141, 68, 63,208,168,220,174, 22,227, 48,208,212,195, 19,130,215,152, 14,227,120, 64, 76, 1,151,243, 11, 14,
-199, 17, 12, 60, 11,217,168, 59,150, 74,214,233, 68, 8, 1, 34,139,215,202, 61, 56,165,132,195,225, 0,153,177,175, 92,108,227,
-249, 18, 12,195,242,207,148,223,105,140,174,193, 58,148,171, 78,100, 59, 10,240, 33, 6,252, 50, 47,176,203,138,148, 72, 20, 40,
- 53,137, 5,133,216, 50, 50,170,197,146, 6,170,181, 33,244,206,227,229,229, 5,145,113,248,148,224, 35,224, 92,130,117,129, 4,
-107,130,147,136,207, 7,216,117,197,124,155, 17,144, 48,199,132, 47,207, 11,146, 87, 64,224, 88, 47, 55,196,213,194, 36, 14, 1,
-160, 63, 28, 33,181, 6,180,134, 84, 26,203,188,226,246,114,129,228, 10, 82, 27,168,135, 7,136, 78,129,249, 8,255,242, 74,220,
-135, 0,168,174, 67,178, 43,228,225, 8,251,233, 25,183,127,251, 2, 4,137, 63,253,248, 5,243,234,112, 60,157,240,242,250, 74,
- 41,125,222, 35,250, 8,231, 61,172, 11,240,137, 17,245, 17, 12, 90, 41,184,101, 69, 55,140,248,244,229, 11, 30,134, 30,194, 59,
-244,156, 67, 38, 10,127,225, 82,192, 6, 58,212,157,181, 57,187, 33, 79,197, 25,173, 35, 87, 27,224, 66,132, 13,148, 22, 41, 14,
-102,108, 14,117,250, 64,240, 26,194,177,193, 58, 91,182,121,218, 9,168,210, 78,208, 86, 59,235,114, 32,148,195,152,189, 99, 55,
-111,104,167,180,187,228,187,191, 43,229,155,100, 44,129, 27,173,112, 46,135, 77,180, 86,173,132,237,240,143,109, 55, 91,200,164,
-216, 43,219,217, 29,130,245,237,161, 94,186,209,182, 83, 46,234,232, 61,133,108, 75, 26,139,123, 93, 0,246, 66,172, 90,244,220,
-125, 47,101,143,102,220, 37,149,165,170, 63,168,127, 31,218, 84,179, 80, 11,139,216,174,223,155,195,135, 11,190,141, 85,249, 59,
- 7,214, 93, 7, 90, 15,191, 18, 18,145, 82,115,168, 19, 14,147, 18,151, 0,164,112, 23,203,155,106,102, 64,155,251,179,197, 61,
-166, 93,151,190,105, 56, 74,215,203,114, 1,194,118,186,137,141, 19,191,219,150,103, 4,192,157,189,178, 81,174, 55, 77, 95, 67,
- 84, 75, 77,176, 5,118, 62,231,150,204,197,119, 99,246,253,129, 94,159, 79, 11, 83,105, 74, 17,222, 88,250, 56, 24, 88,164,221,
-246,245,124,129,146, 2,171, 93, 49,205, 87,252,252,233,103,124,250,249, 51,110,243, 12,166, 36, 86,239,129,108,115, 75, 89, 35,
-226, 92,192, 52, 45, 80, 90,195,102,225,147,115,142, 98, 98,243,126,178,236, 51, 67, 22, 23,145,176, 44,102, 11, 76,170,126,240,
-152,232,123, 59,103, 8, 47,211,143, 28,149, 26, 66, 77, 18, 36, 65, 78,202,211, 2, 26,173, 22,149,124, 8,212, 81,242,172,228,
- 47,153,222,101, 47, 95, 10,202, 86, 96, 86,110,222,177,137,190, 5, 40,244,132, 68,100,226, 77,129,181,177,244, 75,138, 32, 50,
-219,220, 83, 88, 12,103, 91, 20,111,126,254,228,139, 14, 53,180,164, 8,217,106,151,147,245, 59,219,250,140,174,137,224, 55,116,
- 44,217,172, 24, 14,135, 49, 99, 85, 25, 78,135, 17,199,227,136,135,227, 1,130, 3, 74,114,216,117, 1, 18,195,151,207,191, 96,
-186,205, 85,236,229,236,130,121,154, 16, 67,192,233, 56, 98, 89,103,112, 66,233, 65, 73, 6,173, 21, 56,163,199, 81, 92, 7, 69,
-203,160, 85, 71,221,181, 84,120,126,126, 65, 63, 24, 76,211,132,148, 8, 64,212,247, 67, 38,184, 37,244, 29,169,168, 99, 32,150,
- 64,223,245,232,187, 46,175, 45, 19,198,161, 39, 14, 63, 18,148, 34,203, 26,237,239,121,181,227, 21, 85,188,119,182,190,191, 82,
- 81,209,100,173,197,178,204,208, 70, 99, 28,135,188,215,167,204, 2,109, 52, 21, 28, 89, 84, 41,165,162, 34, 75,138, 74, 49, 12,
- 72, 57,132,136,194,114,188,115,176,214,214,144,160, 66, 79, 44,126,118, 42,164,242,244,143,151,220,240,132,197, 58,172,214, 35,
- 50,202, 93, 16, 82,215,105,145,143, 33,175, 54,128,161, 31, 97,116,135,190,239, 96, 67,128,247, 28,214, 70, 12, 67,143,195,208,
-225,122,123,197,249,250, 74,122,138,224,113,190,156,241,249,243,103, 92,206, 87,192, 83,240, 77, 55,142,232,143, 39,204,211, 13,
-221,227, 35,248,233,144, 53, 7, 1,246,182, 66,105, 1, 4,138, 76, 78, 63,190,192,189, 44,248,252,233, 21,159, 62,189,226, 50,
- 45, 96, 82,225,120, 58, 82,145,189, 56, 76,215, 43,110,211, 10,101, 70,204,214,194,121, 90, 89,117, 74, 3,193, 67,247, 29,214,
-117,193,177,239,192,157,135, 97, 12,134, 17,220, 75,114,134,152, 40,226, 89, 9, 89, 63, 35,229,254,182,186, 8, 23, 0,231, 35,
-124, 17,191,214, 67,157,197, 55,204,245,214,214,134,156, 44,150,129,115, 53, 15, 59,229, 88,202, 18, 85,153,216, 94, 69,156,106,
-184, 74,122,183, 45, 46, 55,150, 18,232,144, 88,177,191, 53,211, 0,150,238, 24,239, 27, 32, 36,177,150,195, 94,163,215,235,252,
-140,181, 65, 42,216,110,200,104, 71,239,205,191,179, 76, 73,219,175,184, 55,216, 73, 42, 38,243,124, 63,136,119,144,158, 54, 47,
-188,174,197,155,215,170, 21,242,181,197, 64,108,254, 91,186, 83,182,239,159, 91,188,243,228,163,118,102, 40, 19,139,156,242,182,
- 9,229,242, 78,189, 30,172,123, 78, 61, 26,218, 93, 35,158,104, 44,135,133,129, 94,130, 32, 8,114,145, 16,155, 36, 63,182, 83,
-187,139,230, 49,180,133, 91,233,208,217, 78, 84,214,190, 15,236,173,189,173,104, 21, 90,162, 94, 76,149,245,207,246,188,214, 55,
-157,248, 27,119,194, 87,172,132,237,122,162, 22, 32,119, 93,122,187,171,225,121,222,196,242,206,187, 20,132,244,213, 4,111, 36,
- 42,148,151,117, 65,136, 30,143, 79, 15, 56,156, 70,252,242,229, 25,183,105,193,151,231,103,112, 37, 33,181,130,143, 1, 15, 15,
- 15,152,174, 55, 72, 73,163, 55,206, 5,156,117, 96,160, 61, 36,203,216,211, 54,244, 4, 41,213,236,109, 6,150,133,114, 12,214,
-121,164, 72,113,164, 33,199,183, 22,203, 90,202, 63, 3,208, 4,160,122,194, 27, 37,124,193,178,106,165,106, 23,234,131,207, 1,
- 65,212, 5,202,188,127, 13, 25,223,122,223,157,151,101, 83,113, 9, 20, 49, 98,153, 6, 72,165,118, 69, 64, 89, 15,180, 19, 46,
-138, 17, 70, 94, 11,133,170, 52,151, 66, 34,100,161, 86, 27,177, 74,113,167, 91, 84,106,235,121,175,154,141,148,170, 54, 32,165,
- 88, 11,136,195,225,128,161,239,160, 36,240,240,112,192,241, 52,146,159,220, 89, 58, 60, 57,199,227,233, 17,211,116,197,178,204,
- 88, 23,135, 16,136,141,158,114,134,124,200,138,247,206, 24,164, 72,182,182,174,163,131, 49,132,128,215,151, 51, 46,151, 9,235,
-106,243,148,130,213,231,180,174, 14,231,243, 5,175, 47, 23,226, 8,164,136,167, 15, 15, 72,113, 11,186,209,170, 35, 7, 69, 71,
-123,119,107, 87,104,101,112,189, 94, 49, 12, 29,180, 86,232,123, 3,198,128,167,199, 39,104, 67,157, 53,141,247, 29,150,101,161,
- 9,107,134,220,108, 32, 42, 58,104,215,117,134,115, 14,125,223,213,247,211, 59,135,174,235,201,206, 42, 68, 93,105, 80,216,148,
-168,156, 1,206, 24,148, 84, 89, 55,225,234, 20, 38,134, 64, 43,135, 78,215,247,155,138,149,141,105,193, 57,135, 96, 91,147,195,
-165,132, 11,100,135, 19,146,146,222, 74,161,169, 36, 69,149,250, 68, 49,183, 82, 8,172,203, 76,194,214, 72,194, 82,199, 24,110,
-118,194,199,143, 15, 80, 50,226,155,111, 30,113,124, 60,226,199, 95, 62,227,227,227, 9,227,227, 9, 31,190,251, 13, 62,252,238,
- 59, 72, 45,208,141, 61,120, 39, 33,250,236, 89,121, 0, 0, 32, 0, 73, 68, 65, 84,159, 14,176,203,132,100, 45,160, 36,248,113,
- 0, 55, 6,230,233,137,214, 73,211, 4,246, 58,195,254,116,193, 79,255,244, 39, 68,175,112,190,173,176,129,225,227,183, 31,209,
-245, 29,120, 2,122,109,112, 60, 30, 17,144,240,203,249,130,217, 18, 40, 72,107,133,193,104,116, 70, 33, 34, 66,106,137, 81,105,
-196,121,129,140, 9, 60, 70, 26,191, 11, 18,219, 82,230, 3,175, 43,138, 16, 3, 66, 2,156,245, 0, 4, 86, 23,234,154, 84, 28,
-187,195, 15, 85,177,157, 15,140,234,167,110,226, 49,219,208,149, 88, 58,251, 20,247, 35,241,102,247, 92, 58,163, 54,213,109, 71,
-120,107, 83,179,138,229, 88, 20,229,248, 62, 98, 51,167,114,224,190,183,109,211,224,182, 67,146,189,139,142, 45,187,213,162,188,
-141, 95,163,210,230, 15,123, 59, 6, 79,105,163,174,109, 0,153,124,179,105,145,145,119, 67,255,123, 11,220, 27, 97, 92,162,209,
-103, 42,157, 89, 22, 25, 33,197, 55, 73,114, 89,125, 87, 31, 35,107,118,236,213, 67,222, 20, 84,188, 57,212, 75,167, 89, 71,226,
-104,211,234, 54, 6, 61, 43,130,188,102, 10, 18,179,223, 22, 77,226, 19, 23,172,250,182, 73, 13,158,247,184,205,142, 94,148,238,
-117, 71,150, 75,216,194,130,240, 6,218, 82,158, 85,235,157,223,210, 89,138,255, 63,219,222, 83,249,147,216, 95,131,172,112,173,
-179,229,163,198,222,226,206, 17,143, 55,154, 9,214, 10,233, 83,172, 55,255,247,108,139,162,142,254,155,206, 29,172, 10,236,202,
-152,184, 20,147, 41,239,243,173,179, 24,134, 30,195, 56,192,122,143,213,122,220,150, 25,214, 57,244,227, 64, 29, 4, 72,137,108,
-237, 10,239, 2,140,238, 16,125, 66,244, 1, 70, 43, 82, 41,231, 27, 43,165,176,113, 24,109,160,148,204,156,237,124, 40,166,108,
-181,203,187, 86,153,105,111,165,155, 46,215,161,202,153,204, 45, 57,173,125,174, 69, 52, 86, 70,243, 59, 7, 72,181,175,249,154,
-236,214,142,208, 75,158,248, 86, 32,209, 11,237,202,168,255,174, 88, 98,237, 24,182, 17,202, 85,181,121,113, 38, 36, 18,199, 5,
- 79,182, 63,198, 57, 69,166,230,105, 67,209,237,208, 88,158,231, 93, 46,125,191, 20,156,200,157,236,241,120, 36,223,181,148,208,
- 90,195, 57, 7,187,206,208, 26, 89,239, 18,144, 66,192,178, 46,176,214,193,173, 30,222, 5,116, 67,151,167, 23, 2, 74,105,148,
-193, 33,231, 28,227, 56, 96, 28, 7, 40, 69, 81,183,243, 60,227,122,187,225,122,189,129,115,137,227,225, 8,100,176,200,106, 45,
-230,121,169,135,124,202,202,186,211,233,136,126,232, 97, 58, 67,214, 49,163,241,250,122,193,245, 50,225,122,189,225,114,185, 32,
-198,132,174, 51, 56, 29,143,152,151,149, 64, 48, 82, 64,202,220,197,122, 82,189, 75,197, 49,140,244, 92,149,146, 52, 2,207,209,
-206,125,223,215,200, 89,235, 44,214,117,197, 48,142,132, 47, 46, 68,184,224,115,225, 72,215,116,140,113,135,128,166,194, 79, 67,
- 74, 65,247,178, 70, 47, 37, 4,175,223, 67, 12, 16,156, 85,146,159, 86,186,210,229, 82,136,112,222, 98,181,164,209,224,121,213,
-103,186,142,174,225, 92, 80,153,174,163,226,148, 37,208,244, 62, 11, 58, 25, 96,164, 64, 47, 57,140,208,176,158,225, 22, 2,174,
-217, 55,175, 33,112,254,114,198,116,243, 16,170,199, 52,189, 96, 56,244,232, 79, 71,128, 69,240, 78, 64,140, 10,120,232,129, 78,
-128, 73, 14,149, 40, 94, 55,165, 0,161, 21,216,227, 17, 97,165,131, 55,158, 23,196,151, 5, 95,254,248, 5,183, 57,226,243,243,
- 13, 95, 94, 94,241,241, 55, 31, 33,133,192,229,229, 5,118, 89,176,216, 5, 17, 12,183,101,133,212, 6,222, 90, 24, 37,241,112,
- 28, 96, 20,195,241, 52,194,219, 21,167,174,135,189,220, 0,235,160, 57,135, 98, 32,198,125, 74, 80, 90,110,121, 5,121, 42, 29,
- 98,130,115, 17, 62,146,144, 19,137,156, 39,226,216,209, 78,189,116,147,187,155,215,174,211,105,101, 41,219,142, 23,173,237,138,
-229,195,175,222,196,121, 77, 60, 3,139,251, 3,141, 97, 7,238,168,138,250,178,131,207,195,116,236,144,157,252,206,190,116,151,
-217, 13,246,134,202,182, 11,100,169,194,187,134,120,122, 23,200, 81,179,198,106, 46,119,172,143,125, 27,245,230,195,188,245,133,
-183,157, 93, 94,236,126, 13, 44,147,170,136, 46,110,163,214,114,104, 55, 7,118,205, 67,206,177,153,155, 33, 31,155,164, 63,191,
- 74,184,179,100,109, 54, 31,182,165, 36,177,237,139,229,111, 38,182,141, 72, 69, 51, 6,223, 91, 8, 55, 55, 2, 9, 91,178,119,
-155,109,104,213,186,199, 78,155,143,187,190, 78, 91,235,221,148, 64,237,132, 36,213,241,108,125,149, 89,187,174,168, 17, 42,185,
-192,219,124,214,117,232,205,210,246, 24,170,213,141,109,182,189,186, 70,122, 11, 15, 66, 51,189,216,174,174,180, 61,183,247, 44,
-127,249,253,103,251,192,223,237, 49, 49,142, 54,183, 26,141, 47,250,182, 76, 88,157,197,229,122,131,143, 41, 19,230, 60,186,174,
- 71,138, 17,135,126,192,249,245,181,170,188,133,144, 88,230,181,241,147,251, 58,146, 38,171, 89,190,241, 58,159,115,203,105,132,
-234, 67,200,112,154, 92,172,139,125,190,248,142,101,192,249, 91,113, 90, 83, 28, 10, 41,119,197, 83, 29,177,223,113, 17, 90, 27,
-154,111, 4,119,101,180, 92,186, 9, 31,222,186, 16,238,201,111,251,128,148,118, 93, 70, 0, 28,165, 37,237,117, 25,133, 13,113,
- 48,132,124,104, 72,193,193, 16,161,165,192, 56,244,121,236, 45, 32, 56,240,248,240, 8,165,201, 87,221,117, 6,235,178,224,112,
- 56,128, 51,134,101, 89,168,235,213, 10,166, 83, 52, 38, 53, 6, 93,223, 81,216, 14, 35,181,184, 82, 26,183,233,134, 97, 24, 43,
-169, 77,155, 60,113,200, 14,162,121, 89, 72,225, 31, 60,156, 15,217,206, 22,225,125,192,106, 29,132,208,121,132, 45,234,253,171,
-188, 22, 93,215, 85, 63,119,136, 30,211,116, 35,223,185, 16,240, 46,228, 0, 25, 6,235, 44,137, 28,125,128, 54,166, 50, 15,180,
- 86,208, 90,214,140, 9,114, 20,184, 26,143, 90, 98, 96, 9, 24, 19, 42,170, 86, 8, 81, 11, 27,165,116,165, 9, 74, 41,177, 44,
- 11, 56, 56,156,243,217,107, 79,112,161, 50,225, 64, 76,228,230, 72, 84,128, 50,144,104, 78,100,194, 93,175, 21,116,198, 15,167,
- 12, 4,138,165, 88, 8,161, 10,140,171,243, 35, 11,118,189,243,121,218,184, 23,169, 10,206,137,203, 32,200,118, 39, 0, 48,111,
-233, 43, 6, 40,163,193,148,160,113,119, 98, 48, 92, 65, 66, 98,190,173, 48,166,199, 56, 40,172,211,132, 94, 73, 72,197,193, 53,
- 7, 27, 20, 88, 39,193, 58, 77, 29,255,180,130, 37, 6,111, 23,232,135, 3, 96, 20,156, 15,224,215, 27,226,121, 2,174, 30,151,
-231, 9,231,179,197,101,114,112, 96,144, 70,161, 55, 6,201, 57,178,180,102, 1, 57,152,128,209,134,238,193, 41,224,219, 15, 39,
- 28, 6,133,195,208, 1,206,131, 45, 14,105,182,208,224,136,222,129,165, 64,255, 45,133,204, 81,192, 46,241,212,135,136, 16, 25,
-172,219, 26, 47,206, 0,113,234,143, 63,160, 10,107,194, 27,175, 58,223,145,178,178, 32,139,181, 7,122,170,170,241,150, 35, 94,
- 15,244,148,119, 88, 44,222,141,211,154,241,111,106, 44,202,121,150,188,211,165,215, 34, 67,160,193,184,236,110,163, 72,251, 3,
-124,207, 64,111,124,206, 13, 58,181, 29, 97,151,137, 58,223,128,224,155, 56,142,165, 55,133, 77,189,245,199, 38,122, 54, 53,177,
-161,108,223,249,191, 79,177, 79,191, 26,132,211, 10,233, 98,131, 66,221,137,226,216,214,229,166,187, 29,177,200,185,222, 34, 31,
-182,133,244, 89, 87, 29,205,142,185,218,182, 26,205, 68, 74,219,161, 94, 71, 59, 89, 36, 87,236,113, 60,241, 60, 10,223,122,109,
-158, 45,101,101,156, 87,112,175, 41,103,132,151,228,179,237, 45, 44,111, 62,223, 45, 89,202,228,104,191, 42,105, 86, 41,217,174,
-181,201,248, 27,187, 94,190,246,154, 56,119,108,239,240,254, 32,106,135, 40,247,246,181,175, 29,234,188, 81,189,227, 45,202,126,
-119,221,130,165,157, 69, 12, 96, 88, 87,135,144, 34,186,174,195,233,116, 2, 18,129, 65,190,255,237,111, 17,188,199,249,124,174,
- 55,112, 58, 24, 98,189, 14, 66,238, 64,153, 16, 20, 82, 34, 5,249, 87,243,205,185,140,157,183,247,120, 91,164,113,193,119,152,
-213, 16, 66, 25,239, 84,200,203, 22, 20,148, 31,127,201, 53, 23, 60,239,175,195, 27, 70,196, 70, 76,219, 91,209,218,174,191,126,
- 54, 50,144,170, 29,183,239, 96, 85, 49,238, 72,110, 85,160,154, 10, 41,142,110,114,130,211,151,204, 98, 57,206, 25,140, 81, 56,
- 30, 14,212,177, 25, 13,163, 54,253,135, 81,146,208,187,118,133,233, 12, 18, 18,214,133,172, 70,183,219, 13,183,219,156,195, 88,
-178,104, 48,145,240, 72, 10,158,133,133, 34,219,195,232,223, 11,129,163,235, 58,172,118,174,116,181, 24, 73,128,150,192, 96,221,
- 10, 38, 4,180,209, 96,156, 67,107, 3,109, 12,180, 54,144, 66,213, 93,127,103,250, 45, 65, 46, 4, 56,103,225, 61,145,199,128,
-173, 43,118,206, 81, 66, 94,158,174,132,224,234,199,231,252,122, 70,223, 15, 80, 90, 97, 93, 23,114, 79,112, 14,231,104, 53, 65,
- 83, 24, 2,224, 24, 99,178,239, 60,145, 37,146, 49, 24,211, 17,110, 53, 79,129,236,106, 43,154,155,162,119,137,147, 16,156,175,
-211,142, 16, 28, 98, 36,139, 36,103,156,138,169,140,127, 13, 33,192, 89, 11,164, 68, 99,228,130,224,174, 33, 60, 60,103, 19,208,
-115,230,249,179,166, 58,178,222, 49,148,137,211,182, 42, 41,169,126, 62,147, 12, 25, 56,148,210,244,251, 24, 32, 82,192, 95,125,
-247, 13,254,203,127,254, 27,252,199,191,253, 30,235,124,197,116, 62, 67, 9,137,167, 15, 79,240, 97, 69,215,113,112, 30,240,211,
-207,159,112, 58,156,208, 73,129,206, 8,240, 65, 3,189, 6,250,142, 4,193, 66, 32, 46, 19,221,105, 66, 64,136, 30,105,232,193,
- 36, 67,252,233, 19,196,151, 27,190,252,203, 39, 92,206, 11,158,207, 11,102, 7, 68, 78,154, 2, 45, 57, 68,140,144,156, 97, 94,
- 38,112, 38, 97,164,130, 18, 18,154, 51, 68,183,226,183,223, 62,162,239, 4, 12,103,192,188, 98,125,185,130,187, 8,158,128, 24,
- 61, 56, 75,208,138,230,150, 33,250, 93, 19, 28, 19,145, 62,125,100,240,158, 98,130, 19, 34, 88, 2,228, 94,212,245, 14, 67,188,
- 42,199,202, 12, 62,237,168,111, 91, 7,148,234,161, 95, 15,247, 42, 26,219, 98, 8,223,114,216,211, 22,180, 93,245, 97,105,199,
- 81,111, 71,227, 37, 31,187,113, 59,109,130,215,152, 26,140, 76, 3,193,201,225, 5, 49, 67,112,216,166,241,207,172,247, 84,147,
-151,182, 45, 53,175, 22,156,125,150, 76,218, 30, 87, 34, 5,226, 86, 24, 52, 25,219,129, 85,181, 54,227, 77,218, 93,218,254,158,
-214,138, 70,130,165,244, 14, 77, 47,251,235,219, 9, 66,177, 90, 97,191,251,103,181, 35, 47,188,186,152,237,137,251,243,147, 62,
- 72,141,141,239,254,125, 96,251,215,177, 45,196,138, 88,240,189, 92,118,220,105, 9,218,139, 16,185,168,192,238,117,222, 94, 82,
-126,207,104,111, 10,191,212,234, 40,210, 86,197,211, 24, 62,110, 33, 57,173, 55,177,229,207,191,113,222,163,190,239,237,164,105,
-123,142,155,194,177,133,179,212, 14, 61,195,247, 55,247,195, 94,117,189,255,104,108,213, 98,181,130,165, 4,163, 52,156, 13, 88,
-173, 69, 76,180, 11,214, 74, 67, 73, 13, 37, 21,158,158,158, 16, 99,196, 45, 78, 88,214,149,144,160, 57,107, 61,242,132,196, 19,
-124,116,224,156,110,214,215,219,149, 14,243, 16, 32,178, 18,217,135, 64,123, 73,198,128, 16,193, 56, 3, 79, 34, 39,137,169, 13,
- 26, 34, 40, 0,164,112,206,185, 16,121,175,238,160, 21,237, 48,131, 39,234, 88, 76, 33,171,155,211, 62,237,173,133, 77,101,113,
- 37,227,228,187,217,178,207,105, 92, 95,144,173, 5,196,194,235,247, 54,125, 0,109, 43, 66,102,152,199,236,131,231,208, 90,162,
-211,100, 15,243,142,172, 98, 12,172,122,219, 59, 99, 32, 25,135,207,129, 59,133, 84,198,177, 17,209,180,214,148,155,238, 45, 89,
-131,162,167,223,207, 25, 92,142,139,237,187, 30, 66, 73,112,150,234,148,228, 48, 14,224,140,225,249,249,153, 88, 13, 66, 82, 16,
-135, 34,214, 57, 3,131,148, 10,206, 5,172,171,133,226, 2, 76,208,127, 3, 79,208, 76, 1,160,209,243,243,203, 5, 82, 72, 60,
- 61,156, 32, 56, 69,153,114, 36, 60,158,142, 8, 49, 63,102,193,209,117, 26, 62, 58,196,224, 97,114, 26,154,247, 49, 31,238,137,
- 34,145,179,160,112, 60, 28,176, 44, 11, 14,199,177,242,232,165,214, 56, 28, 71,164,152,224,156, 5, 0,220,110, 55,218,185,119,
- 61, 20,231, 88,115,209, 45,132,168,193, 51, 74, 18,182, 54, 6, 71,105,128, 41,161,211,134, 10,120,206,176,174, 11,137, 21, 21,
-225, 85,231,105, 38,232,140,228,121,138,197, 96,164, 2,148,106, 38,119,244, 81, 8,153, 85,192, 56, 77, 52, 68,158, 0,150,181,
-175,200,130,176,232, 40,152, 40,177,108,173,245, 0,178, 96, 50, 70,218,215, 43, 67,175,251, 96, 6, 72,120,132,217, 34,121,139,
- 14, 30,127,245, 96,240,219,255,245,191,224,255,184, 89,252,219,151, 87,188, 92,111,120,236, 13, 34,179,208,131,134,157, 7,252,
-248,211, 23, 60,116, 26, 66, 68,244, 60, 65, 49,138, 26, 22, 93, 79, 66,191, 65, 67,235, 30,233,124,129, 8, 9,108,114, 96,186,
-135,139, 2,235,203,132,215, 47,175,232,204, 35, 86,119,133,245, 30, 62, 37,124,250,252, 25,211,237,138,158, 11, 60, 29,142, 24,
-198, 35,220,234,225,108, 32,250,157, 25, 33,146,197,116,126,197,191,251, 79,255, 1,201, 58,252,183,127,248,127,112,236, 14,185,
-105,102,228,111, 15,235,230, 18,137,212,241, 23,253,113,200,205, 86,209,196,148, 40,104, 33, 57,196,177,127,252, 33, 86,207,116,
-220,241,142,203,156, 99, 15,155,217,186,244, 34, 96, 97,111,218,148,205, 95,158, 50,188,229,215,209,230,169,221, 30,211,223,199,
- 43, 85,124,167,112,142,101, 50,144, 15,130, 66, 49,219,241,218, 75,119,213,162, 93,171,119,187,236,123,169,183,229, 41,213,174,
-171,252,179, 29,137, 49, 11,255, 26, 9, 88,126, 29, 8,118,147,119,243,237, 86,160,216,188, 16, 27, 91, 90,218,201,225,139,109,
- 35, 84, 64, 14,171,129, 38, 85,110,198,232, 72, 46,196,244,152,117, 0, 5, 4,195,154,160,114,150,154,217, 69, 74,144, 44, 87,
-173, 60,131, 81,184,216, 40, 89,173,176,141,241,237,144, 44,107,147,234,185, 70,221, 75,199, 72,251, 27,145,147,154,138,151, 84,
-228, 17,115, 44,124,131,212,236,211,219, 2,174,236,246, 43,169,112,147,254,241, 92, 97,111,226,180, 70, 52, 87, 44, 79,229, 57,
-163,137,154, 44,169, 83,156,109,196,186,252, 26,166,152,182,199,144, 11,160,182, 56,100, 89, 17,206, 26, 22, 2,231,108,159, 1,
- 0, 65, 55,238, 76, 80, 75, 25,140,195,179,118,128,241,205, 13,194,218,189, 70,177, 19,178, 6, 66,179,155, 46,176,220,117,136,
-205, 74,200, 68, 62, 80, 3,110,211, 13, 9, 30,140, 71, 60, 62, 28, 96,164, 6,151, 9, 93,111,208,229,195,227,233,195, 1,131,
- 76,224,206, 65, 49, 78, 52,172, 20, 33,141, 65,168, 69,122, 66,140, 46,199,158,110, 69,146,224, 89,108,151,195,113,136, 99, 32,
-234,206, 92, 74, 9,169,117, 22,195,145,112, 43,102,145, 19,103,155, 18, 86,112,133, 88, 14,236, 24,179,111,150, 62,155, 82,171,
-250,122, 10, 33,107,254,118, 9,131, 81, 66, 80,144, 75,126,125, 4, 3,180, 96, 80, 28,208,146, 68, 65, 70, 73,244, 70,225, 56,
- 24, 60, 30,122, 60,157, 6,156, 70,133, 99,175,240,116, 28, 96,180,132, 96, 17,189, 20,144, 44, 65, 32,192, 8, 6,197, 18,180,
-228,136, 33,192, 40,149,149,223, 52,194,245, 33,212,247,108, 90, 87,128,243, 28, 27,154,111,162,121, 76,106,140,198, 97, 60, 32,
-186,128,243,235, 43,214,117,133, 18, 2,206, 90, 60, 60, 62, 0,137,225,229,245, 12, 31,128,219,117, 69,215,245, 88, 87,135,105,
-162,131, 78, 42,242,177, 15,163,193,233,116,204,191, 95,192,104, 66,158, 74,193,208, 25,133,199,211, 9, 66, 50, 48, 22, 33, 4,
-195,225, 48,160,235, 13,164,150, 80, 70,130, 11,186,207, 10,150, 96, 58,133,190,239,192, 24, 42, 3,158, 64, 48,153,233,238,168,
-216, 34,188,176,133,214, 10,183,235, 21,214,174,164,168, 23, 58, 23,141, 18,118, 93, 48,223,110, 52,217,208, 58,227,119, 3,180,
- 18, 80, 66,224,122, 57, 35,120, 79, 93,165, 18, 48, 90,131,165,132, 24, 2,250,174,203,142, 11, 79,190,105,162, 83,229, 17, 53,
-133,196, 20,213,174,119, 84,140,120,183, 66,102,145,151,181, 43, 1,157,144,104,171,233, 82, 93,173,196,204,201, 63, 14, 35,156,
- 91,145, 98, 64, 8,142,178,197,179, 48, 86, 73,131, 16, 34, 58, 99, 16,220,138,190,147,232,164,132, 74, 9, 7, 41,240, 96, 36,
-140,240,248,254, 97,192,167,127,250, 39, 28,198, 17, 65, 9,124, 57,223,224,151,128,239, 78, 31, 17,230, 27, 14,163,193, 65, 25,
- 64, 0,159,207,207, 88,157, 7,247, 9, 50,144,213, 44, 36, 11,174,104,175, 78,195,230, 72,159,167, 99, 15, 8, 1,188,204,248,
-252, 47, 63,225, 79,255,246, 5,147, 77, 96,227,128,159,159,127,129, 80, 18,145, 9, 68,174,241,122,181,184, 45, 1,211, 58,195,
-152, 14, 74, 48,176, 20, 96, 12, 67,111, 20,224, 3,190,123,250, 22, 95,254,248, 5,127,252,215,159, 96,250, 1,183,101,134, 84,
- 18, 82, 50, 32,120,116, 90, 17,149, 83,208,217, 34,121,217, 29, 19, 41,210, 89, 90,223, 22,109, 76, 39, 36,196,177, 63,253,176,
-121,160,227, 14,165,248,110,254,239,155, 84,180,247,113,169, 59, 15,246, 59,190,236, 63, 23, 96,194, 27,235,211, 61, 40,162, 90,
-136,202, 65,125, 55,166,199, 29,195,123, 63,121, 72, 59,149,242,123,176,154, 92, 66,238, 3, 62,208, 54, 98,205, 72,188, 29,223,
-231, 98,129,191,179, 67, 47,191,164,142, 44,145, 16,238,246,198,233,190,176,105,236,112,177,153,166,108,217,225,219,127,111, 94,
- 4,250, 0, 9,202,126,230,133,179,205,178,239,177,226, 65,121,117, 52,108,123,229,109, 37,210,174,240, 67, 76, 68, 42, 18,146,
-188,167,140, 70, 96, 34, 39, 5,145, 72, 46,179,199, 43,219, 27,245,198,206,218, 53, 72, 67,239, 43,133, 99, 89,155,240, 6, 20,
-147,154,101, 8, 26,129, 21,208,226, 63,223, 50, 5,246, 29,119, 97, 23,176,183, 37,100,251,190,222, 69, 5, 19,129,143,239,160,
- 51,229,162,217,137, 12, 55, 74, 78,245,163,179, 29,212,135, 53, 78,131,253,248,158,146,171, 36, 66,244,123,107, 93,214, 43,176,
-236,193,142, 41, 97,181, 43,144, 34, 58, 46,208,167,136,255,237,239,255, 22,255,251,255,252, 63,225,239,186, 30,127,253,244,128,
-199,211,128,135,193,192,112, 42,232, 88, 74,121,127, 76, 35, 81,145, 3,120, 10,193,138,115,129,174,239, 73,136,196, 40,218,179,
- 76, 81,132, 16,208,157,222, 82,196,212, 22, 67, 76, 33, 36, 41,123,139, 1,149,163, 87, 43,241, 74,211,174,185,252, 89,202,114,
-111, 18,206, 98,200, 55, 38,218, 77,147,199, 89, 98, 28,122,116,157,196,216, 27,244,249, 64, 31, 59,141,222, 40, 40, 14, 24, 45,
-192, 83,128,150, 12,200, 81,165,130, 51, 4,103,145, 2, 5,195,164,156, 0,199,115,145, 70, 29,179,203, 16, 28,151, 61,247,116,
-232, 17, 93,141,196,103, 42,147,231,250,190,195,113, 60,160, 51, 38,235, 36,169, 40, 95, 45, 49,247,157,117, 96,156,213, 17,185,
- 54,196, 67,215,218, 96, 89, 38, 60, 60, 60,224,245,245, 21, 33,164, 92, 64,167,140, 67,205, 62,127,187,224,244,120,196,227,195,
- 9,227,208, 35,197, 0, 31, 28, 24, 34, 58,163, 41,230,148, 51,244, 67,135,206,104, 12,125, 7,173, 36,148,204, 54,176,213, 18,
-165, 44,135,254,148,132,179,206,116,185,211,143,152,167, 25,203, 60,211,206,156,137,140,148,245,176,171,195,186,172, 68, 32, 20,
-164, 63,234,250, 1,171,115,152,150, 5,253, 48,128, 51,137,101,186, 34,196,128,135,135, 39, 8, 33, 48, 47, 51, 4,231, 21,214,
-211, 25, 67, 5,130,214,232,186, 14, 82,208, 53, 21,235, 99,209,249,189, 33,125, 71,129, 2, 73, 46,234, 40, 94,107,133,213, 90,
- 4, 79,105, 99, 34,103, 31, 8, 41, 49,142, 3,192, 25,174,215, 43, 16, 35,156,179,244,251, 99,162,212, 61, 48,200,140,224, 29,
- 58,131, 20, 3, 4,128,209, 40,136, 20,193,131,197,135,135, 17,235,124,197, 95,125,255, 29, 78,135, 3,254,191,255,254, 15,120,
-190, 76,184,204, 14,209,115, 12, 66, 67, 6, 15, 17, 28, 14, 74,225,233,225, 4,112, 1, 23,128, 95,158, 47, 72,137, 65, 51, 1,
-205, 24,152, 96,224,199, 17,105, 93,193, 23, 11,172, 14, 97,157,193, 98,130,123,189,226,246,122,198,235,121,197,231,243, 21,230,
-112,132, 96, 18,163, 25,136,211,159, 53, 76, 82, 8, 4,159,224,173,135,204,233,144,227, 56,160,235, 12,192, 34,110,183, 87,252,
-219, 63,255, 17,118, 37,120, 78,202,116,189,224, 28, 56, 18, 58,173,106, 40, 18, 7, 39,126, 66,206,187, 72,137,101,129, 92,246,
-217,112,142, 20, 34,196,113, 56,252,176,131,196,220, 41, 95,255,220,225,251,231,254,204,215,254,251,159, 61,212, 57,111, 14,156,
-183, 40,213, 86,236,246, 94,223,255,213,248,246,252, 98,164, 18,213,201,182, 46, 28,140,111, 7,100,123, 88,238,164,209,219, 33,
- 85,249,223,169, 61,184,190, 86,176,236,161, 26,145, 81, 87, 19,217, 38, 18,100, 59,193,224,238,156, 70,220,188, 82,141,240,235,
- 13, 42, 47,251,114,233, 80,103,121,159,206,139, 42,156,101, 47,121, 86,131,167,157, 74,191,116,204,153, 19,158,163, 48, 67,214,
-233, 33,135,185,240,188, 59,227,249,247,150, 67,189, 60, 12,234,188, 55,228,232,150,102,150,197,131, 37, 26,138,111, 34,199,114,
-152,111,208,161,214, 28,183,137, 64, 88,101,191,239,227,106,217, 59, 65, 56,251,226,238,254,253,136,141, 83, 99,243,206, 23, 40,
- 78, 89,204,112,150,178,218, 31, 53,183,128, 55, 98,202,244, 78,232,204,230,247,231,123,139,220,174, 40,229, 77,198,249,230, 62,
- 72, 41, 66, 72, 14, 32,230,155, 60,125, 14,214,117,134,214,146,222, 31,191,224, 63,126,115,194,255,242,219, 15, 48,225, 10,206,
- 29,152,183,208, 44, 65, 32, 65, 10, 14,187,172,184, 94,174, 8, 62,193, 5, 26,241, 23, 59, 90, 25,177, 47, 51, 41,130,157,245,
- 88, 87, 18,134, 13, 67, 71,217,218,206, 2, 49,162,211, 10, 74,112, 28,143, 35,250,142, 48,156, 36,232, 51, 24,134, 30, 41, 37,
-104,173,161, 53,221,144,133, 84, 80,138, 96, 44,214, 90, 36,164,236, 37, 47, 7, 3, 81,223, 4,223,108,100, 49, 56, 8, 1, 24,
-201,105,255,157, 18, 20,231, 72,209,195,104, 14, 36, 7, 37, 25,137,222,180,204, 2, 77,134,232, 61,250,206,100,161, 41, 69,206,
-202,108,221, 20,138, 4,116,198, 24, 18,139,165, 60,233, 48,134,226,139, 51,173,109,153,103,104,165,200,174,231,168, 91, 13, 57,
-169, 44,101,244,244,241, 72, 35,109,165, 53,180, 54,212,113, 25, 34,166,157, 47,103, 56,239,209,245, 26, 31, 62, 60,193, 24,157,
-237,100, 84,252, 80,114, 25,199,120, 24,112, 60, 29,192,115,151,205,115, 12, 43,231, 44, 23, 52,212,209,167,148, 48,221, 38,220,
-174, 87, 92,175, 23,204,243, 12, 41, 4,198,225,128, 24, 34,164,146,117,127,204, 24, 48, 77, 55,132,224,242,245, 46,242,107, 45,
- 48,221, 38,218,187, 11,250,243,198,116, 72, 33,135,200,128,129, 21, 97, 30,163, 66,253,229,153, 68,153,199,195, 1, 49,166, 44,
-146, 83, 24,114,193,192, 5, 21,103, 52,225, 97, 53,160,166,235,123, 28,142, 7, 24,163,192, 37,135,181, 43,162,119,112,171,173,
-140,140, 34,130, 43,108,128,152,167, 58, 92,146,178,189, 27, 6, 74,173,235, 12, 34, 75,152,231, 25, 28,192,146,173,110,109,228,
-110,153,241, 73, 45, 17,146, 35, 46, 60, 56,140,228, 56, 13, 10, 15, 71, 3, 45, 57,137,249,206, 87,252,187,223,126,135, 81, 15,
-120,121,189,226,249, 54,227,236, 29, 46,126,133, 24, 21, 46,235, 5, 71, 5,116, 74,226,155,199, 39, 48,159,192, 66,196,124,187,
- 34, 69, 7,183,222, 16, 18, 32,100, 15, 54, 7,224,234,176,188, 94, 17,185,132,236, 71,192, 39, 28,187, 19, 62,127,126,193,101,
-246, 0, 55, 48,114,128, 95, 28, 82,136,120,120, 60, 96, 28, 52, 4, 34, 36, 72,184,108, 87,130, 74,105,163,241,241,227, 19,130,
- 11,248,231,127,248,103, 76, 55,135,152, 40,171,222,232,158,166,131,121,102, 43, 5,135,144, 12,146,209, 84, 57,133, 8, 41, 53,
- 66, 72,240, 49, 18,247, 61,100, 39, 80, 78,197,148,251, 3,175, 65,104, 52, 89,228,191,118, 40,255, 90, 20,107,219,149,124, 45,
- 7,253, 47, 57,236,171,136,134,237,180, 97, 95, 63,192,223,248,204,223, 63,248,105,247,243, 14, 19,167, 1,105,236,146,183,202,
- 81,154,119,251,224,165, 51,216, 30, 87,250, 26,199,189, 81,147,239,205,106,251, 34,128, 37,188,131,226,205, 34,136, 70, 57,158,
-114, 71,198,218,212,182,148, 26,245, 62,111, 58,202,109, 28,189, 75,158,202,163,224,148, 53, 7, 53, 58,245,157, 87,138, 51,209,
- 76, 69,226,155,100,181,132,176,243,139,183,196,190,150, 11,144,242,248,187,173,151, 82,243,103,118,131,234, 28, 38,148,216, 38,
-150, 18,172,224,144,242,148,224,110,141,205,238, 86, 58,241,157,129, 77,106, 58,124,198,246,118,203, 77, 93, 91, 68,127,121,108,
- 93,245, 7,133,126,245, 94,177,240,245,253, 61,242,136,191,136, 15,105, 55,234,161, 52, 7,139, 44,223,188,202,254,152,246,138,
- 52, 18, 37,251, 32, 23, 64, 96, 12,188,147,184, 76,175,224, 34,192, 49,139, 0,139,228, 22,248,121,197,116,190,194, 70, 14,191,
-174,136,222,131, 27,141, 20, 2,188,179, 20,243,202,139,109,117, 35,171, 17, 33,140,225,225,225,152,111,250, 1,206,211, 33,175,
- 13,117,123,235,186, 64, 42, 13,105, 36,142,250, 64,106,252,101,193,234, 87, 12,195, 0,128,195, 71, 2,221,220,110, 83,213,137,
-144,181,142,166, 17, 33,250,109,238,146, 80,189,229,135, 67, 15,111, 45, 38, 59, 35,229, 46, 93, 42, 77,150,189,108,217, 72, 33,
-100,101, 57,229,212,115,136, 28,152,148,114,231, 73, 7,183, 40, 94,118,206,145, 68, 14,124, 78, 20, 89, 90,232,120,206,145,242,
- 92, 73, 3,183, 90,188,174,150,216,229,146,124,215,195, 97,192,203,203, 13, 58,171,227, 67,240,248,238,187,239,240,227,143, 63,
- 99, 93, 46,144, 82,224,241,195, 3,230,121,198,239,255,250,247,132,245, 77, 9, 47, 47,191, 64,107, 77, 96, 24,165, 17, 83,194,
- 50, 79, 64, 12, 88,151, 5, 41, 25, 48, 70, 76,118, 82,169,115, 8,174,177,174, 43,150,117,197,249,114,193,235,235, 5,203, 66,
-217,228, 74, 10, 72, 37, 97,221, 11, 36,191, 85, 56, 15,227, 46, 23,131, 4,142,161,105,128,135, 16,228,145, 31,122,234,244,175,
- 57, 56, 36,184,136,121,154, 8, 76,211, 83,132,171,183, 43, 66, 70, 7,199, 24, 49,246, 61,162,247, 88,166, 25,156, 49,204,211,
- 4,183,208,216,155,172,116, 38,191,206,200, 5, 14,101,190,207, 51,177, 20,180,166,240,150,190,235, 97,231,105, 27,187, 7, 18,
-212,133, 20,235, 8,159, 11, 78,147,146,156,228, 22, 35, 21, 92,235,188,192,249, 53,231, 32, 44,116,111,138,196,187, 72, 89, 15,
- 34,149,202,249, 0, 1, 49, 49, 36, 46,128, 72,215,180, 80, 12, 74, 83,227, 97,186, 1, 95, 62,255,140,207, 95, 94,112,234,123,
-252,221,247,223, 67, 12, 39,252, 95,255,248,207, 20,150,195, 57,226, 18,208,127, 24,144,150,128,217,158, 41,128, 69, 57, 44, 46,
-194,174,180, 34, 58,255,195, 79,144,191,204, 56, 30, 6, 28,198, 14,195,239,190, 67,232, 37,152, 86,224,107, 0,139, 51,142,166,
- 3, 79, 47,184, 93,206,208,250,132,203,117,194,235,116, 1, 59,255,130,111,127,251, 13, 6,163, 16, 65,174,148,195,135, 7,184,
-176,130, 43, 74,156,187,190,174,176,147, 68,130,134,141, 43,188,143, 56,112, 14,231, 29, 24, 35, 27,219,226, 28,184,144,232,140,
-202, 60,120, 15, 30, 40,160, 39,230, 38,148,114, 29,200,125, 96,180,132, 44, 29,203,198, 14,103,117,175,122,159, 51,253, 94, 55,
-253, 94,238,249,175, 29,212,247, 33, 26,191,174,252,142,111,121, 53,247, 58, 62,206,222,166,197, 49,246, 70,113,254,238,243, 40,
- 63,147,176, 27,153,239,189,211, 57, 47, 57,149,125, 59, 32,182,200,176,157, 40,175,116,114, 95,179,191,239,236,121,101,184,156,
- 90,223, 57,170, 5,176, 4,178,108, 97, 22,172,177,125,181,175,199,150,169, 89, 30, 27,125, 32, 34, 82, 0, 82,222, 89,162,161,
-234,149, 85, 1,234,251,199,246, 9,105,213,118,200,182, 0,159, 18,220,146, 34, 5,149,176,180, 27,131, 87,207,126,115,224,177,
-157,192, 47,221,209,231, 26,245,121,253,251,223,138,205, 24, 3,120, 73, 24, 75,109,218,222, 30,225,187, 21, 69,137, 4, 93,141,
- 10, 3,111, 70,249,156,180, 33,247,145,195,252,206,245, 81, 52, 6, 57,152,168,197,228,221,231, 6,252,218,117,191, 23,224,221,
- 33,133, 19,203,140,246, 0,198,200,227, 91,186, 37,109, 8,234, 34, 36,237,181,185, 16, 8, 43, 48,221, 44,236,146, 48, 93, 61,
- 94,167, 21,159,175, 43,206,214,226,101,177,184,250, 4,155, 18,134,211, 9, 66,107,168, 24, 49,164, 30, 74, 10, 88,235,192, 56,
-161, 66,139,101,172,122,183, 37,131,136, 12, 42, 73, 88,187, 64, 41,133,211,233,152,233,117, 2,231,203, 5, 44,123,154,129, 8,
- 99, 36, 98,210, 36,166,211, 26,171,119,112,139, 67,167, 53,150,217, 82,151,218, 41,248,213, 86, 11,158, 86, 18,146, 75, 68, 31,
-225,173, 67,159, 57,227,130, 49, 24,213,129,165, 72,161, 53,185,192, 9,193,147, 10,154,111, 92,136, 24,129,196,104,223, 31, 17,
-242,103, 36,213,177, 56,141,115, 69,214, 16,208, 91, 38, 51, 96, 6, 49,119,249, 33, 98,186, 94, 17, 44, 25,103, 25,167, 38, 96,
- 28, 15,112,214,193, 24, 5,107,109,133,239,132, 16,240,205,199,111,240,203, 47, 95,240,242,114,198,225, 56,162,235, 58,162,173,
-205, 11,161, 79, 37,197,236, 46,243, 4,123,126, 69,204, 1, 48, 18, 64,223, 31, 72, 11,148, 34,236,186,226,245,245,138,113, 24,
- 96, 87,139,121, 93,192,149, 68, 12,192,188,122,196,196,193,146,128,247,168,193, 51,107,152, 16, 19,113,220,141, 49,164,249,200,
- 86, 49, 45, 76,214,183, 80,225, 18, 67, 4,231,192, 55, 31,159,114, 96, 10,135, 60,142, 88,230, 9,126, 93,224, 45, 42, 2,182,
- 88, 30,189,119,240,206, 99, 13, 1, 90,146, 50,127,154,103,120,107, 49,223, 38,168,108,131, 59,158, 14,120,120,164,130,102,181,
-150, 94,251,140,248, 85, 82,130, 43,142,163,121, 0, 18, 48,207, 55,154,122,196, 4, 35,168, 83, 85, 74, 1, 12,112,214, 98,177,
- 30,130,145,176,240,124, 62, 35,248,128, 24, 9,148,164,238,109,162,130, 87, 97,114, 8, 1, 42, 73,210, 73, 4,178,245,121,112,
-156,167, 27,130, 3,126,243,244, 1, 33, 69,136,135, 3,254,251,203,207,248,247,253,247, 96, 2,232, 13,195,227,193,224, 60,175,
-232,164,130, 25, 31,112,185, 94,241,237,239,127, 3,182, 78, 48, 44,160, 59, 38, 4,217,225,248,241, 3,212,216, 35, 32, 66,157,
- 70, 26,195, 27, 6, 12, 18, 98, 80,132, 45,159, 86, 72,172,248,230,116,128,255,253,239,240,223,254,244, 5,211, 50,129,117, 6,
-118, 58, 67,114, 9,187, 58, 40, 67,171,200,167,167, 3, 56, 15,248,246,195, 1, 79, 15, 71,176,164,240, 95, 95, 94, 49,173, 12,
- 62, 11,202, 61,128,155,115,144, 41, 66,247, 26, 30,196, 25,232,153,202,164, 68, 1, 46, 0,231, 50,121, 52,135,231, 72, 65, 60,
-121,145, 18, 36, 0,249,150, 93,158, 15,246,244,246,144,126,155, 73,254,235, 17,164, 95,203, 54,255,181,206,188,165, 80,189,179,
- 14,255,213, 17,255,253,243,104,255, 79, 52,183,248, 55, 96,119,214,218,126,168,187,107, 19, 92,202,111,227,105,195,157,242,230,
-140,190, 31,149,255,218,108,224,141,240,127,199,191,103, 85,205, 95, 8,118, 44, 71,235, 84,206,123,203, 66, 47,249,195,213,210,
- 87, 14,122, 86, 11,140, 34, 36, 68,163,226,222,173, 68,242, 15,209,249,252,118,117,176,235,221,211,198, 17, 40,147,142,194, 20,
- 96,105, 11, 64,225,205,196,129,189, 25,147,239, 5, 4,181, 83, 78,216, 57, 9,144,129, 34, 69,200,199,155,196,129, 74, 24, 76,
-123,222,112, 25,181,167,132, 6,116,243, 14,224, 63,165,173,176,105,128, 57, 44,187, 54,120, 89, 5,176,141,189, 80,120,229, 44,
-181,128,163,244,171, 81,196,111,175,195,180,187, 86,139,114,158,115, 1,150,111, 80,219, 65,203,238,212,205, 18,130, 41, 88, 88,
-252,124,158,241,143,159,206,248,167, 31, 95,241,243,106,241,243,108,113,177, 22,215,200,113,245, 14,221, 56, 18, 77, 43,120, 12,
- 67, 71,112,163,108, 43, 85, 82,129,101,225, 86, 12, 17,222,163,242,164, 57,207,169, 92,138, 18,185,140, 50,152,174, 19, 98, 72,
-116,104,129, 97,158,174,208, 90, 67, 41, 73, 22,177, 44,162, 67,222, 65,123, 23, 97,140, 2, 99, 29,140,201,227,241, 68, 32,157,
- 20, 35,184, 18, 80, 82,209,244,136,115,172,118, 33, 5,123, 66, 77, 64, 43,104,100, 33, 37,132,104, 65, 68, 4,145,161, 84, 56,
-153, 5, 94, 30, 42, 67,117,130, 79,224, 50,239,251,165,216,180, 44,156,244, 43, 82,208, 40,217,171,128,213,134,188,106, 42, 25,
-227, 11, 94,207, 23,124,248,248,136, 48, 79, 48,166,199, 52, 47,120,122,124,194, 52,173, 56,157, 78,100, 33,243, 14,159, 62,125,
-198,120,232,193,133, 34,192, 81,177,144,230,177, 54,192, 48, 47, 22,151,215, 43,130,117, 8,241, 23,124,255,253,119, 20,122,227,
- 1, 33, 12,214,149,186,171, 16, 19,230,219, 2,193, 21, 4, 87,249,186,205, 94,112,235,179,237, 43,146,126, 37, 0,222,122, 26,
-111,103,251, 94,215,245,245, 57, 19,228,165, 16, 4, 21,250,227,136,219,109,130,212, 2, 90,112,188, 60, 63, 19,241,206,249, 45,
- 72,133, 19,221, 76, 40,133, 57, 68, 92,110, 87, 28, 48,146,165, 45, 37, 88, 75,222,246,219, 60, 17,142, 53, 70,152, 78, 35, 88,
- 42,192,144, 87, 50, 33, 4, 96,221, 82,235,164,214,232, 6,162,231,205,211, 76,227,251,117, 65, 8,101,122,162,225, 66,160, 66,
- 51, 71, 55, 35,210,152,190, 56,145,136, 90, 72,235, 62,235, 60, 84,207,145, 66,128, 93, 86,140,199, 3,124, 12, 80, 90, 33, 9,
- 14,151,128,196, 21,172, 11, 36,126,206, 34,188, 94, 41, 8, 31, 48,177,132,199, 78,227, 54,207,112,206, 98, 52, 29,126,250,229,
- 19,126,243,109,196, 55,218,224, 36, 73,155, 33, 14, 3,208, 9,136, 15, 39,120, 22,193, 21, 9, 25, 3, 15, 96,130,129,229,117,
- 82, 48, 2, 16, 12, 34, 58, 60, 14, 6,223,126,120,192,213,115, 76, 54,226, 98,123, 60, 60, 61, 0,150, 2,152,166,213, 66, 74,
-129,239, 62,140,232,146,197,247,143, 71, 44, 81,225,114,123,197, 53, 0, 96, 18, 8, 17,137,113,204, 62,128, 5, 7,169, 56, 18,
- 79, 24,180,193,234, 2, 12, 99, 72,136,144,140, 19,254, 25, 12,206, 5,242,231,203,236,169, 15, 17, 41,120,136, 67, 63,252, 80,
- 70,130, 49, 54, 99,107,246, 62, 98,243,235,201, 86,191,190, 79,255,181,223,129,175,110,160,255,220,120, 19,239,134, 64,220,223,
- 76,249,206,169,251,254,225,219,250,217, 83,235,115,207, 89,220,237,145,196,154,240,147,123, 31,252, 87,159,210, 61, 0,159,237,
-217,164,123,112, 77, 25,243,223, 61,204,157,255,176, 61, 88, 82, 85, 88,163, 9,205, 16, 98,243,239,190,143, 75,221, 94,231,157,
-147, 43,179,195, 35,216,142, 40,199, 50,157,174,238,203, 75, 96, 57,163,200, 86,145,199,238, 34,167,105,177,202,134, 45,141, 56,
-223,237,190,235, 14,187, 10,227, 54,139, 89, 98,233, 77,245, 83,166, 50,169, 14,224,223,190,153,187,220,120,246, 94,224, 64, 75,
-137, 19, 85,212,135, 12,147,217,242,211,139,110,160, 97,164,179,141, 34, 87, 40,125,247,215,249,126,205,180,135,221,236,223,131,
-237, 90, 41, 63, 19,147,175, 62,233, 16,136,208,166,184,172, 72,215,117,161,132,172,243,116,197, 28, 44,254,245,249,140, 63, 94,
-102,252, 98, 29,102, 48,204, 9,224, 70, 67,247, 29,164, 22,240,145,130, 69,100, 78,120, 34, 43, 76,204,153,204,164,182,143, 49,
-230, 76,110, 65,144, 20,231, 72, 4, 37, 37,198,225,128, 79,159,190, 32,134,136,195,241, 8,211, 25,138,236,204, 35,121,163,117,
-245, 59, 27,211, 65, 10, 9,173, 13, 56, 39,250,213,186,174,152,166, 25,214, 90,218, 87,199,132,105,158,177, 46,115, 78,117,243,
- 59,193,163,224, 28, 74, 73,128,145, 2,189, 68,201, 34,171,242,139, 31, 90, 8, 90, 37,145,240, 47, 23,222,145,174,143, 88, 35,
-136,233,117,182,118,173,251,109, 48,142,224, 99,126,225, 5,124,126, 76,156, 11, 98,103,251, 64,190,116,165,114,188, 47,131,115,
- 30,195,208,227,114,121,197,199,143,143,212, 61, 75, 1,107,125,198,181, 42,232, 76,178,227,140, 84,246,118,117,208,218, 32,248,
-136,121,166,241,254, 52, 77, 0,231,120,121,121,197, 50,211,110,117, 28, 15,232,135, 2, 11,163,109, 0, 0, 32, 0, 73, 68, 65,
- 84,158, 14,199, 8, 44,179, 37,206,148,139,245,106, 21, 57,214, 84,144, 93, 1, 33, 99,127,163,143,112,214,193, 46, 22,193,123,
-116,166, 3,139, 52,146,103, 12,184,221, 38,172,203,130,190,239,179,239,221,161,235, 7, 88, 71,193, 34,214,249,138,167, 38,124,
- 48, 0, 33, 32,164,192,229, 54,147,134, 32, 3,112,116,103, 8,203,106, 12,164, 82,132,246,205,226, 54,210, 13,144, 4, 95, 10,
- 9,112, 96,181, 22,215,219, 45,139,220, 34,116, 22, 45,122,151, 51,233, 99, 73,178, 36,158,122,181,180,102,135,133,104,128, 88,
- 37, 96,135, 50, 3, 8,160,163,132,130,146, 10, 41, 38, 40, 45,144, 16, 48,244, 35,120, 4, 70,165, 49, 26, 5,153, 40,182,181,
-147, 28,154,147,114,255, 60,205,184,174, 22, 62, 70, 28,250, 17,243,141, 98, 90, 15,163, 38, 39, 69,167,137,175, 63,246, 72, 42,
-129,143, 6, 44, 39, 34, 50, 45,193, 36, 7,239,122,164,200, 0,155,192, 46,228, 45,159,150, 21, 75, 12, 56,156, 78, 8,209,225,
-114,121, 69,223,107,252,230,155,143,248,240,244,136,243,245,140,243,243, 51, 88,138, 56,245, 29,158, 62,124,192,203,249,130,255,
-243,255,254,175,176, 76,131, 49, 2, 0, 37, 38, 16,114, 51, 19,243, 1,110,148, 70,116, 1, 60, 5, 40,153,197,174, 53,167, 33,
- 39, 78,166, 28,123,155, 60, 24, 2,196,216, 15, 63,164, 26,137,216, 18,210,176, 59, 12,118, 97, 22,205,215,159, 83,178,191,215,
-221,255, 37, 2,188,183, 99, 88,214, 34,215,223, 20, 29,191, 54,214,191,239,202,216,123,135, 58,246,135,122,233,208,217,187,202,
-124,236, 58,245,247,146,222,254,236,161, 94,208,184,247,199, 82, 35,208, 99,237, 55, 26, 10,223,254, 37, 10,197,116, 93, 89, 0,
-162, 97, 4,111,135, 48,171,170,238,134,169,139,130,131, 35,114,222,254, 80, 79, 96,217, 15,153, 75,163,204,232, 23,156,213,136,
-213,178,241, 23, 89,233, 74, 7, 30,175,138,246, 10,127, 97,155, 85, 47,181,201, 43,153,247,143, 6,210, 2,236, 51, 98,203,183,
-202, 46, 59,221, 17,224,208,164,188,213, 81, 63,195,251,222,243,122,200,102,218, 94, 21, 61,102, 59, 94,141,170,101, 16, 72, 53,
- 64,164, 22, 95,104, 34, 34,249,175, 95,203, 27, 60, 37,131, 95,248,219,201, 66, 97,103, 35,135,142, 8,201,169,144,224, 9,222,
- 59, 92,207, 23, 88,239,176,174, 43,145,226,144, 96,225,113,177, 51, 46, 54,130, 15, 7,200,174, 67, 82, 18,178,211,232,199,161,
-138,237, 40,147,219,208, 36, 38, 16,185,174,208,225,188, 15,180,255, 78,116,168,115,193,112, 62,159,243, 94,184, 7, 7,135,247,
-212,101, 1, 28, 31, 63,126,132, 54,116,115, 94,215,149,176,179, 82, 98,158,103,120,239, 49,207,148, 9,125,187,205, 68, 30,203,
- 54,182,146,248, 69,121,227,128, 54,164,152,239, 58,131, 24, 29,184, 96,232,250, 46, 31, 76,122, 19,206,105,153,185,236, 4,212,
- 81, 82, 18, 65,172, 20, 95,137, 10, 72,196,226, 60,200,241, 75, 57,145,174,100,129, 83, 65, 4, 8, 38, 17, 66,206, 74,207,177,
-194,224,130,154, 67, 48, 8, 65,135, 85,241,246, 91, 23, 48,244, 3, 46,215, 27,156, 91, 48,142, 3, 81,230,140,134,247, 17, 90,
- 25, 2,181, 48, 78,251, 99,107, 51,175,159,116, 8, 82, 81,193,211,247, 35, 57, 3,148,198, 48,142,100,171, 3,189,183,231,243,
- 25,222, 57,172,203,140,105, 38, 22,123, 10, 91,118, 2, 71, 34,113,100,140, 72,129,214, 7,217, 33,156,131,177, 5,162, 39,154,
-156,181,107, 21,148, 89, 71,239, 77, 74, 9,231,215, 51, 0, 96, 24, 71, 92,175, 19,198,195, 17,166,235,234, 84,100,181, 14,203,
-186,194,133, 0,161, 20,134,195,136,110, 24, 32,148,130, 50, 6,170,211, 80,198,128, 75,142,213,174,224, 92, 96, 89, 22, 44,203,
- 10, 48, 6, 93, 99, 86,169, 99,119,150, 88,239,209, 19, 80,102,153, 22,204,243, 4,163,116,189,254, 24, 24,253, 57,231, 43, 81,
-142, 37,130,224,240,130, 41,231, 13,104, 43,139,183,121,158,224,112,198, 33,153, 66,215,169, 58, 89, 74, 46, 66, 51,178,182, 61,
-244, 10,209,174, 64,140, 56, 29, 59, 60,140, 61, 6,211,129,171, 14,159, 95,206,184, 77, 11, 14,221, 8,173, 20,172, 95, 48,244,
- 6,189, 82, 48, 66, 17, 60, 71,113, 36,149,192, 58, 1, 38, 56,224, 45,193,211, 36, 3,151, 25,158,181, 56,240,171, 67, 92, 45,
-212, 48,192, 51, 2,143, 46,183, 9,199,177,199,249,252, 12, 41, 24, 30,198, 14,223, 60,246, 24, 15, 3,152,144,184,204, 19, 18,
- 23,120,126,190,226, 31,254,241, 71,164,212, 35, 6,186,183,248,152, 96, 67, 4, 24, 71,116, 1,189,210,144,137, 65, 50, 14,201,
- 19,148, 16, 16,140, 82, 18,131,143, 52,142,103, 2,130, 73, 48, 14, 72,197, 96,148,132, 56,116,135, 31,202,168,183, 48,150,139,
-237, 11,187,138,233,237, 94,252,207,217,211,222,198,139,254,101,251,244,251, 40, 21,214,140,201, 55,142,120,222, 33,179, 28, 28,
- 82,246,173,245,241, 54,194,240, 93, 55, 77,194,176,246, 48, 21,105,159, 36,198,203, 77,191, 46,117, 43, 63,181, 77,123, 39,245,
- 58, 54,130, 92,100,169,177,153, 21,143, 63,223,136,104,108, 15,175,217, 65,213,210, 86,124,176,187,185, 64,125, 46,188,141,139,
-141,149,189, 93,252,219, 69,208, 39, 5,145,157, 56, 47,238,188,114,120, 52,147, 5, 94,226,106,201,222,150, 26, 29, 69,140, 9,
- 62,134, 93,136, 13, 75, 13,169,142, 21, 90, 96,106, 38, 5,169,170,220, 5,207, 7, 52,127, 59,119, 97, 28,251, 64, 25,198,118,
- 7, 45,238, 95, 23,214,188, 39,197,110,214,142,205,115,129,193, 91,182,120,139, 18,110, 11,136, 6, 27,204,243, 84,129, 55, 5,
- 2,221, 76,242,225,206,177, 43,136,176,139,101,109,112,194,191,178, 78,226,119,236,248, 66,217, 35, 93, 66, 2, 23, 9, 82, 9,
-112,158,192,121,132, 82,100,241, 18,146, 50,195,149,148, 24,251, 30,253,216,193,100,143,177, 80, 2,253,208, 3,156,163, 27, 15,
-240, 0,162, 96,100, 39,211, 26,203, 66,234,225, 15, 31,158,208,117, 29,156,181,184, 92,175, 21,255, 89,186,227,243,249, 76,234,
-238, 60, 86,238,250, 17,183, 43,117,208, 74, 42, 44,235,140,195, 56, 64, 41,129,143, 31,159, 16, 17,177, 44, 43,172,165,176, 17,
- 74,246, 10, 0, 56,172,181, 88, 87,178, 43,157, 30, 78, 84, 20, 8,134,105,158, 48, 77, 19,172, 93,115,110, 55,141, 93, 15,227,
- 1,211,109,130, 16, 2,135,227,136,121,162,189,237, 50, 45, 96, 44,225, 48,246, 80,138,104,103, 50,163,114, 99,238, 8,131, 39,
-161, 88,171, 2, 39,194,154,170, 24,233, 4,150, 17,173,148,253, 46,184,168, 68,198,146, 21, 30, 60,224, 28,117,239,222, 7, 72,
-109,160,181, 66,215,119,212, 9, 39,218, 77, 63, 61, 61, 32,196, 0,235, 22,104,163, 48,140, 7,244,253,136,235,117,193,243,203,
- 23, 44,203, 2,198,129,126,232,241,240,248, 8, 46, 36,164, 82,249,240,142, 56, 30, 6, 28, 15, 35,134, 65, 3, 41,224, 56,246,
-240,118,133,181, 43,198,129,138,130,101,154,193, 18, 67,167, 52, 9,228, 56, 21,118,156, 87, 78,100,182,126,115,196,200, 16,178,
-205,148, 48,161, 9,171, 11,112, 46, 98, 89, 45,184,160,235,227,114,190, 0,156,225,225,244,136,196, 56,166,121,197,241,116,130,
-202,206, 4,211,119, 96,156,227,112, 24, 49, 30, 70, 12,135, 17,199,227, 9, 41,165,156,244,214,195,230,199,201, 56,200,241,208,
-117,144, 92, 64, 10,145, 45,109,188,242,200, 99, 44,122, 32,142, 16, 34,164,144,176,150, 30,143,224, 60, 39, 4, 18,252, 39,250,
-128,152, 25,242,116,219,225, 53, 65,111, 23,185,219, 64,189, 56,103,196,124,143,137,222,235,204,126,239,255,127,206,222,173, 71,
-178, 44, 61,207,123,214,105,239, 29,135,204, 58,116,247,116,207,104, 6, 34, 41,202, 4, 45,139,146, 32, 64, 23, 6,104, 73,134,
-161,159,224, 27,255, 25,254, 48,223, 9, 16, 12, 19, 48,108,194, 38, 65,145, 28,145,156,153,102,119, 87, 87,101,101,102,196, 62,
-172,163, 47,190,181, 15, 17,153, 89,221,195, 2,102,170,187,186, 50, 35, 50, 98,199, 94,223,225,125,159,183, 6,230,228, 34, 58,
- 20,163, 20,141,179,148, 24,241,211,153, 95,252,252, 75,202,216, 19,251,158,182,107, 25, 82,226,190, 31, 9, 17,110,118, 29,133,
-192, 23,183, 7, 62,191, 57,208, 29,118, 20, 3, 73, 37,212,190, 67,117, 22,140, 38,141, 35, 86,137,126,160, 52, 6, 93,192,191,
-187, 67, 61, 12, 20,101,248,187, 95,127,139,109, 15, 28,110, 14, 40,157,209,170,208, 53,134,215,183, 59,126,242,246,200,135,111,
-126,195,171,155,142,253,209,241, 79,126,250, 83,246,183,183,252,249,159,255,146,239, 63, 12, 76,147,144, 95, 98, 17, 80, 80,138,
-137,198, 53,228, 40, 16,169,227,174,147, 48, 33, 63, 72,162, 93, 92,215,116,146,131, 33,206,143,214, 25, 26, 99,176,177,204, 41,
-109,155, 67,120,177,251, 60, 63,102,191,222,193,255, 24,207,249, 75,163,248, 31,254,162,122, 83,159, 5, 74,234, 18, 52,179, 61,
-176,175,133,109,243,207,162,174,246,229, 11, 45,173,126,157, 46,155, 67,117,246,177,151, 75, 82, 93, 94,246,211,213,106,176,192,
-120,184,130,243,168,170,206,188,180,193,149, 37, 88,166,118,153,243, 65, 91,212, 42, 92,187,242,115,171,133,234,126, 41, 98, 91,
-158,216, 12,147, 41, 18,220, 33, 0, 17,249,126,118, 51,118, 87, 90, 85,192,136,190,240,138,111, 75, 38,125, 37, 58, 76, 21,239,
-185,104,185, 42,248, 65, 43,241,156,138,255,121,141,187,157, 15,116,189, 96, 63,215, 98,104, 30, 6,104,117,121,160, 95, 77,225,
-151,215,135, 77,170,223,106,108,219,176,160,149,222,208,169,212, 22, 20,188, 40,214,175, 57,230,139,248, 77,175, 34, 56,179,164,
-198,169, 11, 30,254,252,239,230, 25,143,249,214, 9,162,245,234, 46,120,122, 61,151, 85, 65,191, 5, 34,213, 67, 93,107, 17, 61,
- 25,163, 48, 6,118, 59,135, 82, 9, 99, 10,144,104, 27, 91, 59,217,140,143, 99, 77,193, 18, 18, 93,211, 56, 81,158,251, 80,171,
- 15,185, 62,165,195, 23, 15,108,219,182,213, 99,237,241, 83,192, 56, 75,183,219, 73,220,103,205,197,126,243,246,141,132,122, 84,
- 86,184,115, 45,227, 48, 10,161,170,192,205,241,192,227,233, 81, 96, 74, 90,132,104,143,167, 51, 31, 63,222, 51, 77,158,224, 35,
- 77,211,114, 60, 28, 22,226,155,124, 47,137,166, 12, 53,184, 38,215,241,106,219,182,104, 99,232,118,123,206,167, 51,141,109,232,
-186,150, 48, 91,237,130, 20, 27,251,202,191, 79, 57,214,168,206, 88,227, 62, 93,117, 1, 40,156,107,107,158,187,228,202,207, 2,
-198,148, 11,227, 20,121,120,236, 25, 39, 47,112,150,153,172,151,132,151,174,170, 79, 63, 70, 65, 76, 26,235,208,198, 44,133,199,
- 48, 14,180,141, 3,228, 57,148,146, 57, 28,119, 40,165, 56,157,207, 40,165,121,184, 63,113, 60, 28, 49, 6, 14,213,194,118, 30,
-122,134, 97,168,250, 20,121, 61,134, 97,228,238,238,123,161,124, 25,177,243,165, 20,184,189,189,161,113, 13, 62, 4,134, 97,160,
-109, 90, 41, 92,234, 8, 63,231, 76, 66,166, 6, 33,100, 18,154,144, 51, 62, 38, 34, 2,173,114,237,142, 41, 4,198, 16, 81,218,
- 16,130,100,106, 15,163,136, 20, 95,191,121, 67, 65,209, 79,158,201, 7, 82, 77,211,212, 90,179, 63, 30,132, 84, 89,228,103,236,
-135,158,199,199, 71,241,195,143, 19,143, 15, 15,156,207,162,158,127,253,250, 21,141,115,130,133, 85, 26, 87,217, 6, 57, 39, 81,
-201,135,192,221,135,143,228, 40, 0, 26,101, 12,206, 54,140,227,184,188,238,242, 56,105,161,102,138, 37, 86, 62, 63,102,198, 70,
- 51, 35,128,213, 69, 46,196,252, 89,180, 53, 40,168,212,162,222,105,177, 57,182,214,200, 4,164,100, 66,201,104,163,241, 83, 96,
-156,122,222,190, 62,114,236, 28, 77, 73, 28, 90,135,235, 26,206, 33,242,241, 60,113, 26, 2,157, 51, 28, 59,195,231,135,134, 87,
-157,161, 57, 88,216, 91,162,202,216,227, 30,156, 28,234, 37, 36, 84, 82,104,215,144,157, 69,187, 22,245, 56, 82, 38, 79,177,240,
-217,207,190,162,219, 31,233,253,196,135,251,143, 60,158, 7, 94,189,254,140,211,249,129,113,234,185,221, 29,177, 10,218,214,210,
- 89,195, 87,255,236, 15,248,179, 63,251,175,252,221,215,239, 72,198,145, 88,215, 17, 10,133, 85, 2, 42, 26,199,158,198, 10, 55,
- 95,145,234, 20, 71,147, 83,189, 31,107, 1,229, 8,195, 65, 50,216,143,214, 97,110,107,167,158,151, 52,164,188,116,108,215, 35,
-247, 31,178,174,125,234, 48,255,109,188,239,151,231,250,186, 17, 55,213,122,197, 51, 98,174,109,100,233,162, 54, 87,101,147, 54,
-183, 61,212,213,101,247,120,141, 32,223,196,182,240, 92,102,182,186, 18,127, 61, 43, 62,187, 66,130,151,237,190, 87, 93, 88, 7,
- 95,238,246,214,221,224,162, 82,223, 36,199,173,198,188,217,158,150, 43, 20, 70, 87,175,184,220, 76,150, 3,190, 92,113,246,235,
- 9, 39, 93,248,250,218,228, 90,121,203,248, 75,215,244, 41, 85,227, 22,205, 66, 67,147, 73,192, 54, 90,117,134,206,136,255, 26,
-181,141, 92,229, 9,115,253,114, 28,190,141, 61, 93, 27,120, 93,253,180,243,239,203,107, 59, 79, 46, 54,251,253,237,225,175, 55,
-248, 91,181,133,189,109, 8,116,198,168,245,223,205, 58, 10,183,250, 42, 93,110, 86,255,215,189,222,130,186,157,133,139, 11, 34,
-249, 50, 65, 80,166, 94, 91,248,188, 20,116,206, 25, 26,231,234,136, 25, 38, 63,200,136,214, 90,180,134,105,154,106,113,149, 22,
-213,119, 74,226, 13,150,206, 55,208, 54,142,182, 17,149, 54, 5,252, 36,225, 26, 55,199, 3, 37, 39,134, 97,141,206, 52,198,212,
- 3, 71, 32, 42,243,190,187,105, 26, 73,124,179,178, 19,159,198, 1,103, 13,183,183,175,216,237, 59, 98,140, 28,111,110,200, 57,
- 19, 66,170,110, 7, 85,213,208,134, 93, 21,225,181,173,227,112,220,139, 10,188, 17,155,150,208,207, 20,187,221,142,227,241,134,
-221,110, 15, 74, 66, 94,102, 17,238, 56,122,206,125, 47,159,241, 2,141,109, 80, 23,233,140,162,248,111,155, 86,186, 54, 37,150,
-168, 53, 11,157,133,172,229,125,228,225,254, 76,223,143, 40,101,216,239,247,245,121, 7,166,209, 99,180,171, 72, 93, 75, 41,178,
-123, 14,117,108,109,157,172, 7, 82,140,149, 19, 47,239,177,181,146,136, 55,231,215, 3, 12,189,231,112, 56,144, 83, 18, 22,187,
-247, 60, 86,245,182,159, 98, 77, 51,131, 20,147,116, 88, 73, 44,109,135,253, 94,242,181, 67, 64,107, 69, 63,140,244,125, 95,197,
-128, 78,214, 23,181,235, 78, 5,124,144,125,191,177, 13, 25, 69,183, 63,200, 78,187,113,248, 20,153,102, 66,158,150, 34,124, 38,
- 47, 42,173, 25, 38,207,253,195,137, 16, 2,135,195, 13,251,253,158, 24, 37, 67,224,225,225,145,190, 31,152, 38,207,126,191, 23,
-132,173,146,132,187, 92,196, 61,176,219,117, 28, 15, 55, 88,227, 8, 62,112, 62,157,121,188, 63,241,225,253,123,238,238, 62, 94,
-120,137,103, 77, 76,240,114,232, 60,158, 30,150,213,204, 12, 53, 18,139,150, 90,114, 6,172, 49,107, 24, 86,181,168,105,205,146,
- 78, 89,102, 96, 81,101, 88,232,197,125, 35,182, 54,165, 21,206, 24,156,179,236, 58, 1,226,236, 14, 71,166,113,196, 86,171,156,
- 86,133,183, 55, 7,194,249, 68, 83,215,147, 33, 23, 18,134,211, 20,249,120, 58,113,188, 61,112,219, 56, 94, 41,248,236,246,128,
-109, 44, 52, 26,117,219, 81, 28, 20, 83, 27,162,202,144, 80, 90,161,246, 13,170,113, 48, 78,232, 2,166,179,216,155,134,230,102,
-199, 77,219,113,243,246, 11, 62,244, 61,127,245,223,254,158, 80, 44,223,220,157,184,191, 63, 81,148, 65, 55,150,125,119, 68,187,
-142, 63,255,139,191,225,251,187, 51, 62,105,114,166,174, 75,100, 13,148, 75, 70,149, 66,231, 12,134, 66,137,190,210,232, 68, 44,
- 57, 59,175,140,177,216,122, 46, 89, 52,182,100,246,157,198,188,218,221,252, 9,115,112,199, 6,169, 49,143, 26,159,163,185,205,
-225, 13,191,205, 56,253, 31,123,160,207,199,159,222,236,212,215,120, 53,117,129, 19, 65, 93, 11,214,158, 63,212, 85, 89,177,161,
-234, 9, 23,125, 21,215, 45,118,174,107,188,201,213,161,190,141,148, 84,219,159,245, 74,181,127,121, 88,191,176,147,191,120,205,
-202, 5, 80,101, 62,208,215,152,215,122,248,232, 89,137, 94, 42, 65, 76,215,174,186,118,236, 70,173, 91,132, 43,112,158, 90,236,
-114,235, 19,157,181, 21,165, 40, 74,174,106,114, 53,135, 90,216, 69,225,186, 38,160,205,163,236,170,126,223,166, 44, 93, 28,212,
-106, 1,223,204,239,203, 74,146, 85, 11,188, 71,171,203, 1,197,122, 29,232,139, 29,250, 76, 19,222,166,179,173, 20, 56, 22, 50,
-219,130,145,213,235,122, 96, 46,116,180, 97, 1,233,232,205,120, 93,235,235,218,177,108, 70,252,108, 62, 43,107,224,239,242, 94,
-204,207, 69,235, 37,231, 94,215,149,132, 28,232, 85,213, 93, 34, 49,250,154,250, 53,167,223, 41,218,182,145, 81,112,215,161,173,
- 89,212,197, 90, 27, 17,162, 41, 69,215, 9, 24,132, 82,100,114, 82, 5,128,119,119,119,244,231,126, 9,237,240, 33,224,189, 39,
-198,180,236,203,231, 3,125,191,219, 17, 99, 88,210,199,130, 15, 28,143, 71,154, 70,252,207, 50,174, 79,220, 63, 60, 18,188, 64,
- 69, 26,103,177,198,210,117, 13,206, 25,110,142, 7,186,174,165,148, 36, 7, 55,138,113, 24,121,120, 60,209, 52, 50, 61,138, 49,
- 50,142, 3,195, 40,221,112,227, 28,231,211, 64,204,137,156,193,104, 91,119, 89, 50, 37,107, 90,241, 79,107,168,163,219, 34,118,
-190, 20, 73,121,206,110,144,252,110, 17,126, 69,166, 49, 46,176,149,249, 87,138, 73, 56,222,218, 72, 96, 85,174, 90,145, 34, 34,
-210, 16,227,130,115,238,186,150,227,113, 95, 35, 90,195, 18, 89,219, 84, 39, 64, 41,153,182,105, 9, 33,240,248,248,200,208, 15,
-248, 81, 0, 62, 90,233,139,105,133,115, 78,132, 79,133,138,115,221,161, 80,180, 53, 69, 77,107, 77,211, 10,204,198, 90,135,247,
- 81,148,224, 81,108,141,177, 64,209,166, 42, 85, 52, 83,202, 76, 33, 98,156,227,254,241, 68,136,162,189,152,175,175, 25,242, 51,
- 7, 47,165, 10,139,138, 41,115,255,240, 72, 63, 72, 81,145,179,226,241,116, 98, 28, 38,134, 97,228,225,225,196,227,227,169, 94,
- 95,117, 42,166,101,226,113, 58,157,185,187,251,200,195,131, 68,189, 78,163, 95,210,217,250,190,151, 41,130,143, 2,183,105, 58,
-140,117,149,248,102,128,194, 52,141,196, 24, 64,137,186, 62,165,188, 52, 33, 51,221,112,254, 12, 45,246, 67,181,213,184,232,170,
-209,145,102,110,166, 5,106,107,176, 86,116, 25,214,104,156,214, 56, 43, 12, 13,231,154,138, 39, 87,164, 24,216,187, 6,134, 1,
- 83, 50,251,227, 1,215,118,148,162, 24,167,192, 67,223, 83,180,230,160, 20, 95, 28,118, 28, 91,139,107, 44,133,128,121,115, 64,
-237,156,184,119,140,145, 69, 64, 18, 86,189,234, 44, 41, 6, 24, 39,166,115,207,112, 26,235, 53, 25, 41, 5,236,237, 13, 95,254,
-206,207,121,123,188,225,227,247, 31,185,125,245, 25, 62,203, 4,225, 31,190,253, 7, 62,255,236,115,222,254,252, 23,252,249,159,
-253, 5,223,189, 63,145,104,100,185, 88,215,158,170, 78, 67, 32, 99,107,154,219,174,107, 41, 41,139,210,189,226,149, 41,178,154,
- 82, 37,227,148,162, 81,138,189,211,116, 45, 88,181,193,116, 62, 57,188,231, 44,232,151, 96, 48,155,223, 95,130,212,252,216, 95,
- 23,169,106,139,240,165,242,197,175,188,216, 23,132,182,205, 65, 89,126, 76,161, 80, 20, 27, 68,203, 26,200,169,158,238, 72, 5,
-128, 82, 86,252,108, 41, 79,245,214,243, 88,117, 51, 54, 98,155, 73,126,157, 22,183,242, 89,158, 16,201, 46,133, 93,149,118, 94,
- 54,250, 47,182, 99,234,117,102,175, 54,252,114,165, 46,103, 16,179, 29, 76, 47, 60,124,245,140,118,111,142,204, 85,172, 3, 1,
-181,116,137,203, 65,170,159, 25,155,207,153,229,136,160,103,193,240,206,251,120,181,114,239,175, 49,169, 79, 70,215, 75, 80, 79,
-126,130,111,153, 15, 76, 93, 54,186, 65,117, 57,149, 41, 90,173, 65, 56, 51, 61,112, 51,238,223, 58, 32,180, 42,151, 42,249, 37,
-234,145,139,194,236,122,197,180,101, 51,108, 61,242,115,129, 85, 42, 7,127,203,188,223,174, 85,172, 86, 56,171,137,209,147,210,
- 36,164, 56,171,151,245,128, 54,178,163,206, 69, 14,164,148,179,168,244,141,140,141,189, 15, 53,200, 1, 66, 10,210,165,207, 59,
-235,152,200,213,245,224, 67,192, 7, 17, 45, 57,103,233,186,142,251,251,123,246,251, 61,227, 56,114, 83, 59,112, 17,173,137,165,
- 75, 27, 69,136, 83, 13, 59,145, 27,246,227,233, 68, 72, 17,141,162,107, 91,198,113,164,235, 58,118,123,217,245,229,156,240,163,
- 40,220,219, 22, 26,231,216,237,218,154, 5, 31,176, 70,124,180,129,194,110, 39, 36,172, 97,232,229, 80, 77, 17,109, 29,198, 58,
-198,126, 16,160, 76, 81,152, 49, 8,148, 38,142,144,133, 39, 30,125,164,105,180,216,157,172,227,254,116,194, 24, 43,135, 71,202,
-180,237, 14,165,202, 18,214,226,125,172, 7,186,173, 41, 96, 25,215, 56, 57,244,146,168,225,149, 22,235,155,177,142,195,174,197,
- 90,195,110,231, 8,113,183, 81, 23,139, 2, 30,160, 31,250,138,193,157,243, 27, 50,206,137,231,123,118, 12, 88,107,185,191,191,
-167,105,154,154, 53,239,152,166,137,143,119,247,149,239,126,100,119,216,163,141,229,120,211,144,179, 34,164, 15,100, 5,182,131,
-148, 64, 39, 42, 45,172, 16, 98,194,181,142,152, 19, 15,143,143,203,154,108, 9,234,217, 88, 17,149, 50,213, 34,105,107, 23, 45,
-248,219, 97, 60,243,205,183,239,104, 92,195,103,159,125,193, 52,142, 76,147,248,235,173,109, 46, 44,173,195,105,168, 43,143, 84,
-117, 51, 34,202, 3, 73, 31, 67,101,180, 81,248, 32,215,132,247, 31,177, 90,112,212, 82,208, 8, 92,198, 58, 71, 8, 19, 57, 21,
-166,232,101, 61, 84,215,118,169, 54,132,186,226,131, 19,153, 68,169, 96,169,202,213,152,133,202,133, 26, 65,108,200, 20,114, 20,
-252,108,219,182,132,224, 9, 26, 89,109, 20, 97,174, 43,235, 56, 13,103,154,146,153,146,176,220,199, 80,184, 63, 13,236, 19, 88,
-211,136, 2,253,230,192,189,247, 60,146,241,250, 13,131, 79,236,250, 9, 93, 20,140, 19,234,112, 35,122, 27,173, 32, 74, 86, 4,
- 70, 83,180,194,164, 2,214,145, 12,156,206, 3,175,143, 71,178,109, 57,223, 61,240,250,245,231, 88, 11,191,248,234,192, 91,245,
-187,124,253,238,129, 59,123,131,206,145,183, 55, 95,161, 75, 18,212,172, 85, 4, 85, 8, 90,111,196,145, 70, 92, 9, 57,209, 89,
- 69,200, 89, 86, 54, 69, 87,177,167,102,244,129,157,179, 53,154, 44, 11, 76,199,168,186, 87,215,236,247, 26,243,170,187,249,147,
- 57, 6, 49,151, 66,170,253,189,236, 12,121,150, 4,119,221,161,111,199,244, 47,169,228, 63, 53,126, 95, 32, 38, 92,178,184,149,
-210, 23,221,249,245,212,118, 78, 81, 43,106, 37,185, 61,221,109,110, 51,186,107,144,203,149, 80,238,170,151,191,128,195, 92,140,
- 80, 23, 49,219,165,101, 73,215, 80,155,101,168,127,245, 60, 84, 93, 27, 44,187,251,133,185,174,127, 64,123, 80,150, 83,109, 57,
- 84,212, 58, 90, 86,250, 82, 91, 48, 87,186,198,152,165, 19,181,230,234, 96,185,178,179,233,165,152,201,107, 22, 90,237,106,164,
-187, 41,228, 74,233,210,198, 96,172, 69, 27,189,100,115, 11,196, 69,100,122,186, 84, 5,252,252, 24,122, 29, 85,232,250, 51, 63,
- 63,145, 88,119,250, 90,171,139, 53,138,210,106,225,149, 95,184, 49,182,162,181,141,114,222,108, 52, 9,107,247,205, 70,104, 39,
-221,185,217, 40,207,151,176,153,141, 3,253, 58, 45,240, 34,127,252,201,245, 92, 3, 23,106, 80,139,160, 53,245, 42,226, 82, 34,
-124, 35, 39, 92, 99,104,172, 34, 39, 79,183,107, 49, 70,178,170,115,201, 18,141, 83, 69, 63,169,142, 75,181,118,164, 44,126,225,
-243, 73, 58, 38,239, 87, 22,248, 52,200,222, 60,231,130,143,226,251,213, 53,103, 61, 23, 48,218,144,114,225,253,251,247, 85,188,
- 5,135,195, 1,133, 34,229, 40, 66, 47, 5, 31, 63,222,209,117,173,252, 55,165, 43,158,118,146,195,163,222,176,253, 52,209,117,
- 45,166, 42,188,231,195, 77, 16,176,194, 31,159,233, 98,109,235,150,152,207, 92,181, 0, 41, 71, 66, 12, 75, 53, 61,239,179,251,
- 65, 24,227,251, 93,135,169, 89,240, 57, 9,142, 54,120, 9,243,152,225, 88, 33, 68,206,125, 68,105,199,185, 31, 42,107, 93,213,
-209,191, 35,165,192,228, 39, 10,194,214,119,213,130, 69,197, 31, 59,215,224, 99,148,171,189,102,210, 7, 95, 1, 57, 70, 40,110,
-143,167, 19, 74,107, 66, 8,140,227,176, 52, 45,214, 89,130, 23, 58,159,228,149, 55,116,109, 43,175, 83, 77,155, 27,134, 1,165,
- 52,227, 56,242,120, 58,241,248, 40,123,246, 67,221, 99,159, 78, 61, 15, 15, 39,137,101,173,239,149,107, 27, 92, 99, 69, 3, 17,
- 60,227,228, 47,156,171, 57,215,105, 67,146, 49,117,235, 28, 41,198,139,201,145,170,150,178,146,197, 63, 46, 59,218, 76, 8,178,
-202, 49,218,138,197,174,239, 9, 49,210,184,202,230, 79, 25,239, 3, 67, 63, 48,140,131,216,219, 98,174,147,185,186,112, 44,146,
-218,166, 20, 52,173,165,109,218, 69, 88, 61,223, 87, 98, 76,114, 13,250,137, 16,197, 50,105,106,174,128, 91, 48,188,185,134, 56,
-173, 57, 9,165, 22,220,206,217,186, 10, 18, 22,127, 74,113, 65, 72,155,154,226,167,181, 2, 45, 93,175,136,229,138,236,213,155,
- 6,109,100, 55,239, 92,195,224, 61,138, 66,163, 53, 13, 10, 91, 93, 17,227, 56,160,208, 68, 10, 89, 43,122, 31, 72, 33,112,115,
-179,231,208, 26, 14, 10,116,244,160, 51,180, 22, 58, 39,251,126,159, 33, 70, 74,103, 41,173, 67,133, 12,253, 64,251,234, 21,199,
-175,126, 78,110, 29,231,251, 15, 28,154, 14,101, 32,235,128, 13, 35, 77, 10,168,146,217,237, 26,110,119,142,195,161, 99, 26, 78,
-124,254,179,159,242,248,208,243,215,191,252, 13,185,180,245,231, 88,245, 20,101,158, 10, 22,225, 19,104, 37,141, 64,206, 51, 54,
- 87, 85, 37,124,161,181, 26, 91, 18,157, 51, 52, 22,142,175, 59, 57,212,231,209,187,248, 22,211,133, 16, 72, 95, 5,163, 92,119,
-233,191, 45, 39,254, 69,202, 92, 29, 29,207, 98,168, 37, 61,108,163, 14,159,161, 20,207,133,160, 60,253,190,234,226,240, 85,215,
-155,244, 13,158,244,165, 67, 93,177,181,146,233, 11,180,233, 83,133,245,229,115,152, 21,249,203,115, 47,229, 66, 68, 53,171,184,
-159, 35,221, 61,245, 58,115,217, 29,206, 66, 50,165,159,245,219,219, 90,189, 74, 14,180, 90,246,235,219, 67,105, 43, 54,220, 70,
-135,150, 82,106, 37, 61, 23, 74,106,201,111,118,206,173,150, 47,189,238,247,213,146,215, 94, 69, 48,122,173, 94,148,210,152,202,
- 62,254, 49,215,195, 53, 25, 80,113, 53,198, 87,215, 59,248,245,128,191,220,155,175,138,255, 85,249,191,238,212,175,119,248,122,
- 91,148, 94, 23, 87,240, 36,164,103, 59, 42,216,254,189, 45,215,156, 58,169, 81, 37,211, 56, 35, 35,245, 70,186, 25,215,200, 1,
-162,141, 33,166, 64,136, 94,118,192,149,171, 61,122,177,142,133, 24, 25,199, 73, 82,198, 98, 90,146,212,230,231, 26, 83, 66,105,
-217,199, 9,172, 67, 70,145,195, 48, 10,119,101,222,167, 87, 44,232, 56, 78,242, 89,175,187,226,253,126, 39,252,242,174, 91,236,
-103,214,186,101, 34,161,181, 0, 70, 20,138,253,254, 80, 51,211,103,203,148,116, 92,177,134,115,196, 24,241,222,211,117,157,208,
-195,144, 96,151,243,249,188, 68,181, 90, 39,194, 60,141,161,237, 58,252, 36, 59,230,182,254,121,172, 33, 44, 69,149,101, 42, 16,
- 98,169,234,230,136,228,228,153,250, 90,136,130, 61,215,241,146,143,190, 10,232, 74,245,203, 75, 65, 36,215,181, 98, 10,145,172,
- 20,177,250,178, 75,129, 20,243,130, 50, 45, 20, 78,231, 51,160,153, 38,143, 49,110,241,199,135, 16, 56,236, 15,116,221,142,182,
-109,150,207,164,247,161,186, 0, 84, 21,131,213, 61,250, 84, 85,250,141, 40,182, 83, 29,173,167, 92,152,188,160, 63, 39, 31,249,
-238,251,239, 9, 33,209,117, 29,135,195,129, 16, 60, 74,201,154, 96,153,238, 88,205,174,109,201, 41, 46,129, 81,135,253, 78, 98,
-101, 85, 97, 43, 5, 94, 20,252, 37, 97,181,174,235, 25, 9, 21,153, 87,166, 49,134,154,179, 30,150,208,155, 92,197,176,198, 26,
-246,187,142,253,161, 99, 95, 25,255,135,195, 78,130,102,118, 2, 29,210, 74,213,128,145,203,251,198,226,236,168, 19,191, 89,127,
-146,147,100,206,207,159,237,153,130,166,107,128, 81,170, 4, 65, 93,212, 98,111,211,245, 90, 22,203,160, 56, 31,140,209, 88,103,
-234,218, 65,209,118, 13, 49, 78,236,246,187, 26,204, 83, 73,146, 70,244, 69,199,166,197, 2,113,154,208,149,231,223,116, 45, 41,
-103, 78,195,128,105, 58, 41, 0, 99,224, 39,175,110,184,177,134, 28, 6,178,202,168,125,135,126,115, 11, 70,147,207, 35, 37, 36,
-104, 27,138, 1, 19, 10,241,254,145,164,193,190, 62, 98,142,123,204, 52, 50,188,127, 79,163, 51,198, 89,194,253, 9,211, 29, 68,
-167, 98, 50, 55,135, 29, 74, 23,126,250,213, 87,164, 18, 81, 89,241, 55,191,252, 53, 37,202, 57, 97, 22,204, 87,169,175, 91, 94,
-214,145, 70,203, 1, 47,241,196, 10,149, 51,173,179,180, 86, 97, 74,164, 53, 10, 75,225,246,102, 71,123,219, 98,222,180, 55,127,
-146,159, 57,212, 37,140,254,249,180,179,114,213,193,252, 54,123,245, 39,228,184,178, 94,148,210,105,234, 11,164,167, 46,171, 50,
-125,126,142, 79, 8, 47, 47, 21, 20,170, 92, 30,234, 75, 55, 86,227, 76,231, 84,174,107,218, 89,125,220,139,113,184, 18,162, 28,
-151,176,185,167,197,192, 85, 55,247, 36,217,174, 42,242,117, 37, 79,149,141,229,233, 73,183,174,120,146, 91,190,116,199,155,160,
-148,203,125,191,194,104,196, 10,100,165, 99, 55,198, 60, 1,164, 92, 68,210, 46,151,211,154, 15,158,106,220,234, 60,169,208,117,
-159,110,230, 20,177,249, 3, 90,132, 2,165, 41,213, 87,187, 5,217, 92,189,174,207,253,140,219,235,162,182,215,121,187,242,216,
-140,201,231,202,110, 45, 34, 55, 34, 56,189, 25,175, 95, 0,104,182,250,138,167,133,128,122,166,184,120, 17,180,116,193, 19, 80,
-151,137,108,218, 96,140,173,227,208,202, 9,200, 66, 98, 91,133,121, 5,165, 51,214,130,181,178,222,144,157,247, 72,136,113, 19,
-188,146,165,123,179, 77,141,208, 21,129,208, 44, 98,114, 78, 2, 84,246,135,189,236,102,219,134,182,109,176,214,212,215,111, 14,
-255,144,204,244,162,192,181, 13,135,227,129, 24, 98, 45,206, 12,135,195, 65,162, 81,181,194, 56, 91,211,179, 4, 16,114, 62,159,
-235, 94, 52, 74,151, 70, 61, 32,140,174,193, 40,138,105,156,232,207, 3, 49, 36, 26,215, 46,121,220,125,223,163,148,226,230, 70,
- 48,179, 77,211,224, 39,191, 22,104, 5,188, 15,149, 35,110,121,253,250, 86, 10,148,224, 49,214,210, 29, 36, 52, 69, 88,237,162,
-178,119, 77, 75,204,101,153, 38,230, 34,254,108, 41, 62,164,131,159,133, 91, 37,139, 66,126, 28,125,157,178, 25,124, 72, 76, 62,
-138, 55, 29, 33,148,133,154,181, 30,171, 66, 31, 37,132, 55,109,106,177, 21, 35,211, 20, 36, 16, 37, 43,206,253,192, 56,120, 57,
- 84,114, 33,166, 34,163,238,170, 62, 79, 25, 38, 47, 99,240,219,219, 87,116,221, 94,136,115,122,125, 60,215,182, 52,237,142,113,
-154, 64, 25, 14,135, 35, 57, 37,250,126, 64,107,195,205,205, 17,103, 43, 22, 20, 85,105,128,105,177,248,205,169,126, 50, 2,247,
-181, 88,149, 14,117, 22, 34,230, 34,235,134, 84,164,120,137, 81,108,103, 50,197, 19,187,107, 8,126,129, 26, 45,247, 32, 10,214,
-106,246,251,150,227,113,199,126,223,210,117, 14, 99, 1,189,138,216,134,254, 44, 41, 98, 27,171,166, 28,230,186,194, 98,242,133,
-192, 84, 38, 44,242,120,166,146,236, 74, 46, 75,162, 91,166, 84, 22,124,193, 32, 90,129, 82, 39,160,141, 21,202,158,171,226,220,
-162,114,157,194,236,234, 89,149,232, 90, 87, 93, 22,165, 22,117,243,100,174,208, 90, 3,222, 67,141,163, 53,187, 6,229, 12,193,
- 7,116,179,227, 60,156, 49, 37,243,229,235, 91,110, 15, 13,205,206, 18, 74,196, 30,111, 80,199, 61, 89, 41,138, 15, 98,227, 53,
- 26,237, 44,106,138,224, 19, 33,121,148,203,232, 24,136,239, 78,164, 62,114,255,221, 7,226, 24,249,240,238, 61,195,253, 29,199,
-157,163,140, 19,141,113,194,251, 87,144,187,134,221,241, 21,223,125,247,129,119,239, 62,138, 11, 67,203,170,121, 78, 53,157, 9,
-129,148, 66,227, 26, 74,150,201, 5, 73,174,139, 93,211,208,104,133, 45,137,189, 49,116,141,230,230,213, 30,123,179, 19,161, 92,
-126,177, 83,231, 98, 7,251,220,193, 61, 31, 16, 63, 20,216,178,237, 72,175,199,247,139,184,105, 73, 57,231,217, 27,233,156, 41,
-190,165,137, 94,239,137, 47, 29,238,101, 85,208,215,199, 52,219, 3,108, 75,135,187, 62,212,151,128,150, 45,120,164, 92,116,249,
-148,167,126,252,173, 71,121,249,179, 77, 1, 83,170,194,115,217, 95,111, 10,163,235,206, 61,215,178, 99,209, 24,168,213,231, 60,
- 31, 30,235, 96,121,221,175,201,216, 93, 87, 1, 84,157, 26, 92, 31,162,155, 98,170, 92, 29,186,243,152, 71, 70,240, 53,239, 88,
-155, 69, 28,183,116,233, 84, 69,116,145,204,103, 85, 15, 32,205, 38,107,124, 89,127,232, 85,222, 55, 79, 24,174,117, 20,243, 71,
-113,179,131, 95, 21,243,179, 24,109,142, 69, 45, 27, 49,231,165, 48, 82, 61,243,243,110, 11, 26,253, 66, 17,165,231, 53,137,250,
- 68,161,120, 85, 64,113, 69, 25,180,198, 8,192, 98,246,208, 87,102,187,117, 85,192,104, 68,253, 14, 18, 45,185,172,141,244, 58,
-170,220, 31, 14,104, 37,156,239,174,181, 52,173,227,246,230,166,166,127, 73,124,102,223,159, 5,191, 26, 60,125, 63,112,238,207,
- 76,126,146,110,177,190, 71,243,232,184,105, 90,154,122,200, 53,173,140, 78, 99,148, 14,173,235, 90,154,182,173,108,242, 82, 69,
-100,210,221,107,173,107, 87, 42,104,209, 89, 55,144, 82,102, 28, 5,253, 57,142,158,161,159,136, 49, 45, 49,154,165,228,202,243,
-150,164, 52, 10, 11,155, 93, 56,227, 73,152,224,109,199, 48, 78, 76,211,136, 51,134, 55,111,110, 65, 67,168,121,221, 77,215, 50,
-133, 64,136, 34,130,219, 29,246,196,156, 80,100,114,142,213,253,160, 73,169, 84, 15,119, 17,118,124, 81,156,251,145,156, 11,147,
-143,140, 99,144, 93,122, 17,216,138, 79,169,238,214,133,106, 55, 39, 18,230,146,197,250, 85,215, 31, 41,102, 33,213, 41,195, 56,
- 6,140,182,178,250,240, 82,120,229, 12, 62, 70, 98,146,226,108, 78,122, 68, 25, 30, 78,103, 17,165, 77, 94, 60,243, 49, 50,249,
- 68,223,143, 82, 28,140,137, 41, 68,250,243, 64,138, 98, 95, 27,199,137,243,233, 76,140, 17,163, 69, 80, 41,207, 45,161, 20,248,
- 16,228, 51,175, 21, 33,198,197, 34, 82, 80,132,121,250, 64, 17, 46,251, 44,120, 69,214, 48,170,142,203,115,145,112,156, 21, 32,
-181, 5, 88,231, 37,201,177,105, 13,198, 66,209, 25,138,188,230,193, 7,226, 20,136,163, 71,171, 82,109,102,117, 51,153, 87,107,
-141,222,102, 74,104, 85, 71,231, 50,225, 43, 57,227, 22, 2,157,240, 49,172,179,148, 20, 5, 42,163,205, 82, 20, 24, 45, 96,159,
- 57,184,170,212, 52, 72, 81,210,154, 90, 32, 11,187,160,164,121,237, 80, 73,124,245,177, 72,153, 86,195,109,219,162,141,194, 52,
- 86, 18,251, 92, 75, 49,150,135,243,137,226, 3, 71,103,249,217,207,126,130,109, 53, 73, 23,236,241,128,186,217,161,172, 70,197,
-132, 74,194, 46, 80,214,194, 48,202,218,164,235,200, 62, 49,254,250, 14, 23, 12,251,195,158, 99,103,216,189,126,195,190, 61,208,
- 24, 75,158, 38, 60, 82,196, 78,185,240,112,122,228,230,243,207, 48, 62, 50, 60, 78,220,127,255,145,156,164,137,154,207,178, 42,
- 87, 94,180, 73,206, 90, 97,169, 20,133, 42, 26,163,140,236,208,141,166,211, 26,167, 11,199, 93,203,237,235, 35,246,237, 45,230,
-166, 30,234, 89,201,226,189, 84, 1,134,136,159,234, 78, 69, 61,127, 72, 95,119,128,159,234,214, 95,252,243,138, 8, 44,232,101,
-191,114,193,209, 86,155, 36, 54,189,241,125,235,167,120, 85,197,202, 27,159, 5,113,101,203, 61, 47,101, 1,197,204,182,128, 25,
- 81,120, 17, 68,162,228,176, 76, 64, 94,118,223,171,209, 90,179,121,109, 94,250,249,180, 92,132,133,117, 6, 63,139,168,180,214,
- 23,136, 84,165, 85, 21,121,137,114, 83, 40,107, 84,236,234,218,157,207, 7,215, 60,150, 42, 40,138, 22, 22,250, 44,158,171,214,
-229, 26,219,201,242, 97, 82,245,131,118,145, 54, 55, 31,228, 70, 93, 76, 78,114,205,158,206, 40,178, 82, 53, 76, 68,196, 42,182,
-170,215,101,247,147, 81, 89, 32, 9,115, 55,170,180, 17, 70,242,147,235, 98,253, 95, 81,101,131,143,189, 20,167, 73, 72, 78,157,
- 68,232,109,232,139,140,240,205, 60,109, 41,219,221,156,216, 61,182, 96, 26,181, 73,126, 83, 79,200,188,207,117,230,242, 26, 23,
- 85,138,204,234,114, 0, 0, 32, 0, 73, 68, 65, 84,126,128,247,187, 41, 26, 75, 90,181, 31,243,104,191,138, 87,114, 73,242,238,
-107, 9,164, 72, 37,147,138,216,156, 36,160, 37,215,226, 67, 87,245,187, 19,255,173,181,149,174, 37, 97, 30,243,170,101, 24, 7,
-252, 36, 42,246,126,156,228, 70, 30, 18, 49, 72,247,227, 42,124,197, 24,179, 80,212,110,110,110,232, 58,129,169,164, 40,140,237,
-155,227, 1, 85,217,232,159,189,126, 69,219, 24,156,209,146,211, 29, 34, 86, 91,250,115,191, 40,180, 37, 29,203,212,253,190,197,
- 88,199,228, 3,198,184,218, 8,100,172,213, 52,141,149, 48,148,166,145,164, 40, 99, 24,135,158,225,124,166, 84, 15,115,138,185,
-118,180, 18, 21,154,146, 80,199, 74,150,235,200,106, 69,211,218,197,106,216, 52,173,228,103, 27,131,177,154,148, 19,141,115,144,
- 11,141,109, 72, 94, 32, 38,171, 88,181,160,172,194, 54, 45, 57,105,124, 44,132, 8, 33, 21,178, 82, 76, 41,136,248, 65,205,140,
-125,153,104,148,106,163, 8, 57, 19,115, 65, 91, 71,240,145,146,196, 54, 52,147,232, 6, 31, 64, 25, 98, 86,196, 34, 33, 79,169,
-234, 9,132, 1, 47,107,129,126,152,240, 21,251,169,138,163,100,141, 15,121, 17,233, 57, 39, 83, 21,173,132,241, 30,115,193, 53,
-109,181,125,201,254,223,123, 25,255,135, 16, 32,231,106, 59,213,132,152,201, 74, 30, 55,103, 49,173,151, 84,214,228,200, 44,175,
-181,224, 70,244, 34, 56, 46, 74, 58, 98,173, 65,151, 76,215,200, 4, 73, 96, 38, 85,227,160,213, 66,169,116, 21, 47, 44,186, 38,
- 75,201,154, 48, 38,226, 20,200, 81,118,252,186,118,217,185,172, 20,199, 25,224,100,230,241,186,210, 23,214,208,162,144,196, 62,
- 61,143,231, 37,124, 74, 33, 12,140, 57,154, 85, 24,246, 9, 55, 83, 4,141, 90, 44,142, 50, 21, 83, 34, 40,115, 29,170, 24, 82,
- 82,160,106,144,143,134,144, 35,218, 88,200,137,125,235,184,185,217, 97, 45,148, 52,209, 26, 3, 41,211,180,142, 97,154, 24, 42,
- 54,247,167, 63,249,140,253,222, 98, 27, 67, 49, 26,181,235,192,106,212, 56, 18,199,158, 96, 18,166, 20,244,144, 40, 41,147,209,
- 24,221,226,239,123,250,247, 31, 8,231, 7, 78,195,137, 98,246,196,104,240, 65,244, 29,239,223,125,224,179,159,254, 19,138,210,
-188,127,255,145,215, 55,111,216,237,110, 80, 5,190,253,254, 93, 69,246,218, 74,242,148,243, 96,193,239, 34, 46, 38, 87, 68, 48,
-139,113,149,168, 87,216, 91,205,206,193,126,215,210,118, 13,221,109,135,121,211, 98,203, 51,123,233,139, 17,249, 11,135,250,167,
- 40,114,191,205, 47,181,177,111, 21,202, 51, 7,207, 70,112, 85,244,197, 78,255,186, 83, 42, 27, 50, 27,155, 61,252, 26,242,241,
-242,227,151,109,112,203,140, 74, 93,106,166, 21, 83,251,132, 19,255, 2,111,126, 22,255,189, 24,128, 83,174,204,123,101,149,170,
-173,216,115,189,146,201,212,170,215,151,238, 65, 45, 41, 95,243,115,212,117,132, 80,204,182,224,185, 28, 19,171,151, 8,182, 87,
-170,255,101,204,175, 36, 4, 67,207, 5, 28, 79, 35,106,103,118,247,162,122, 71, 61,203,228, 95, 35, 88,103, 27,203,117,200,203,
-106, 15, 43, 85,176,247,132,173, 95, 46,167, 10, 79,186,241,103, 98,120, 23,197,218, 15,224,140,215,199, 82, 79,156, 9,207, 93,
-215,107,113,182, 78, 21,114,201, 21,214, 83, 81,159,117,135, 63,231, 29,139, 13,141, 42, 8,139, 50,134, 52,114, 3, 16,229,182,
-164, 94,229, 82,240,126, 68,149, 76, 44,165,238,134,165,104,105,156,100, 47,151,250,193,223,215, 61,161, 50,102,141, 98,172,251,
-202,125,215,209,117,187, 69,193, 29, 98,160,219, 53, 18,197,217,117, 76,211,200,135,239,223,211,238,246, 28,142, 71, 82,200, 75,
-216,135,107, 26,166, 48, 49,249,169, 22,124,137,199,199, 51, 41, 38, 92,237, 34,231, 81, 60, 20,148, 83,228, 16, 32, 67,235, 12,
-122,223, 85,224, 75,237, 18,171, 79, 89,198,203, 48, 77,254, 34, 21,240,124,238, 49, 83,157,232,104,133, 31, 83, 61,232, 2,201,
-104,172, 81, 76, 41,211, 53,173,136, 47,231,238,111,214,147,106, 43,138,122, 83, 8, 41, 46,190,250,153,104,102,141,161,237, 90,
-166, 81,188,253, 86, 87, 17, 86, 20, 15, 50, 89,138, 87,103, 12, 89, 73, 17, 49, 77,126, 21,229, 42,141, 79,113, 89, 89,204, 2,
-199, 83,223, 11, 96,199, 53, 40,180,248,219,139,100, 93, 83,132,187,174,150, 60, 6,153,102, 72,225,149,105,186,134, 92,167,144,
- 51,135, 62, 23,121, 30,227, 40,145,171,183, 55, 29,206, 54,156, 7, 79,202, 2, 89, 41, 27, 47,199,214, 74, 89, 18,149, 3,190,
-138,132,103,205,140, 76,142,228, 30,123,216,237, 32, 39, 70, 99,170, 95, 63,161,138, 94, 92, 1, 33,100, 98,144,209,102,137,153,
-161,159, 72,147,167, 68, 25,115,147,133, 25,143, 46,139, 96,174,222,132,182, 70,150,229,121,204, 34, 57, 99,182,246, 45,181,224,
-173,141,117,171,117, 86, 67,174, 65, 57, 41,229,170, 13,168,187,114,161, 97,213,206,124, 14, 63,210, 24,109, 37,145,210, 32,218,
-131,106,235,157,123,222,164, 20, 93,211, 50,158, 39,206,131, 7, 20,111,111, 95,241,230,230, 13,167, 62,208,135,192,187,199, 7,
-190,252,217,207,200, 12,164, 70, 67,137,232, 32,105,104,212,213,137,138, 25, 6,113,149,168, 61,128,135,161,103,154, 60,185,235,
-120,243,243,223,225,227,253, 68, 76,154,251,247, 35,253,249,145, 98, 44, 95,191,127,228,225,161,199,154,134,239,190,253,134,159,
-124,145, 72,105,228, 39, 95,188,229,241,148, 57,245, 3, 90, 25, 73, 12, 84, 10,165, 45, 62, 38, 58,215, 48,250, 68,215,216,138,
-216, 46,180,173, 35, 17,137,206, 16,116, 70, 91,139,107, 59,112, 14,186,221, 85,158,250, 70,205,254,169, 60,149, 31, 19,230,242,
-143,181,181, 61, 21,142,109, 66,102,174,111,172,121, 69,155,206,187,241,114, 97,111, 43, 75, 98, 25, 87,105,172,101, 91, 9,160,
-158, 36,169,101,158,210,242, 74, 77, 33,123, 78, 52,248, 68, 47,176,148, 6,219, 31,112, 30,121,233, 11,210,157,218,164,180,205,
-232,215,235,252,117,181, 25,215,207,175, 73,121, 98,195,155,131, 80, 54,238,129, 79,228,211,207,175,233,181,109,177,108,128,235,
-114,208,233, 75,252,234,102,116,174, 55,190,240, 11,139,221, 51, 12,131,114, 21,186,162,175, 61,251,155, 46,187,108, 66,216, 46,
- 53, 6,249, 9,180, 70,158,103,185, 44,238, 54,158,195, 89, 57,189,142,242,205,197,245,165,102,138,224,246, 11, 85,185,120,189,
-159,123, 29,103,164,238,172,218,159,199,250, 70, 43,154,198,162,102,255, 93, 29,237,151,154,239, 93,114, 1,181,238, 29,199, 25,
-154, 81, 59,191, 89,113, 14,144,131,216,175,180, 49,130,115,109, 59,172,117,156, 31, 79,168,182,161,115,142,156, 34,197, 90,178,
- 86,132,202, 54, 87,200,141, 55,120,129,175,204,147, 22, 9,212,144,197,206,227,233,145,146,197,195,155, 42,192, 69,172,113,242,
-248,143,143,143, 53, 39, 93,196,121, 41, 72, 38,186,146,187, 41, 26,240,125, 79,211, 56,246, 21, 13, 91,178, 40,159, 75,142,117,
- 71,107,101,167,171,138,132, 84, 88, 73, 50, 27, 39,241,222,155, 58,138, 85,181, 75,179, 56, 82,150,209,119, 12,145,166, 17,229,
- 52, 26,176,122,225,255, 43,165,112, 78,166,101, 57, 23,148, 49,130, 73, 85, 18, 37, 90, 74,228,112, 56,146,146, 4,181,248,152,
- 49,198,226,199, 17,146, 20, 92, 74,107, 74, 20, 65, 89, 1, 26,107, 73, 57, 51, 85, 50,156, 36,164, 21,180,113,164, 34, 34, 70,
- 99,215,195, 52, 4, 33,181,105, 45, 76,238, 16, 2,214, 56, 98,202,132, 44, 2, 62,133,248,253, 67, 12, 56, 55, 39,203,137,104,
-203, 24,205,148, 3, 25,216,117, 59,166, 97,146,199,204,129, 93,231, 32, 43,110,111,143,188,126,125, 36,132,196,240,235,239, 40,
- 37,214,117, 88,237,170, 85, 94, 2,134,180, 22,132,236, 28,227, 59, 95,159,203,212,171,164, 58, 19, 21,241, 89,152,198,101,170,
- 35,117,175, 90,114, 33,114,132, 20, 10,105, 10,194, 40,240, 25, 93, 68, 84, 56,115, 44,174,155,156,249,250,151,149,157,172,107,
- 36,251,189, 46,167,212,122,111, 44,172, 92, 8,106,241,181,181,233,137, 31,187,136,221,115,190, 7, 86, 76,183, 81,194, 67, 87,
-117,186,137,150, 53, 72,161,224, 18, 80, 34,187,227, 1, 85,175,183,182,235,234,193,174,121, 24, 35,247,227,137, 93,187, 39,188,
-127,160, 15, 9,148, 65, 89,197,175,191,251,142, 63,252,163,223,197, 24, 40,173, 76,215, 84,170,132,140, 12, 4,233,150, 75, 31,
-106, 1, 31,120,255,112,226,221,183,247, 40,101,232,240,220,134, 1, 91, 6,110, 14,183,236,204, 45, 15, 39,197, 57, 69, 30, 79,
- 35,223,223,157,232, 90,205, 52,158,104,218, 14,159, 11, 62,131,178, 66,144, 60,245, 94,158,103, 81, 36,234,193,142,194, 26,199,
-164, 44,100,207,177,115,248,226,113, 78, 19, 90, 71,210,133, 98, 12,218, 25, 76,211, 66,215, 61, 61,212,159,116,108,234,135, 69,
-111,207,117, 60,255,216, 95,159, 26,223,171,162, 22,113,219,117,167,121,209,225, 22, 54, 29,223,147,115,245,242, 64,191,232,246,
-213,122,152, 60, 23,171,122, 81, 8,124,170, 16,185,172, 65,174,197,112,107,200,199,181,135,125, 19,148,179,233, 96,150, 34,227,
- 42,231,102, 91,143,172,221,253, 11,239,203,246, 48, 87,234,147,173,250, 10, 32, 90, 90,210, 85, 84,166, 69,225,158,235,226,124,
-166,200,109,224,245, 11,176,167,168, 75,240,206,172, 47,152,211,206,244, 92,129,111,244,122,121,169,242,203,179,215,227,133, 8,
- 7,174, 10,191,106,199,163, 60, 51,250,191, 44,138,182,233, 96, 92, 67,141,158, 74,252, 94,156,110,204, 69,112, 97,118, 13, 36,
-154, 74,113, 75,217,175,128,158,170,226,141, 49,160,116, 17, 48, 75,245,148,207, 56,211,105,154, 8, 57, 45, 58,149,148,228,176,
- 51, 5,180,177,132, 28,107,184,203, 40,138,244, 12,157,181,132,156,152, 98, 98, 8,158,172,101, 52, 44, 72, 79,195,212,143, 11,
-195,160, 84, 26,151, 86, 66, 84, 59,247,167, 10, 8, 81,164, 82,197, 95, 62, 96,140, 37,214, 52, 48, 73,117,147,104,213,195,110,
-135,171, 34,166, 82, 50, 57, 38,156,181,180,198,144,125, 64,217,122,184, 40,141,216,125, 71, 92,211, 17,234,247,180, 70, 4,107,
-198, 40, 98,244,117, 95,232,240,147,151, 53,133, 54,164,162,200,152, 10, 58, 81,248, 41,208, 58,135, 86, 73, 52, 11, 74, 99, 40,
- 56,163,105, 93, 43,153,225,192,232, 61, 37, 69, 92, 35,232, 89,171, 21,170, 36, 82, 12, 88, 99,137, 81,236, 79,164, 44,123,219,
- 90,148,148,186,187, 45, 85,100,214, 26, 65,131,234,106,173, 11, 73,198,192, 93,219,202,158, 61,103,138, 74,139,222, 70, 33, 29,
-182,107, 12, 41, 38, 38,239, 49,214,213,145,180, 8,218,114,138,180,109, 83, 29, 1,171,174, 38,198, 32,160,157, 25,110, 82, 50,
-141,145, 52,180, 67,103,120,125,123,203,225,216, 98, 26,205,195,131,120,254,141,150, 17,109,174,247,102, 99,100, 60,171,116,169,
-215, 97, 38, 71, 93,237,176, 91,183, 11, 27, 43,161,100,169, 79,117,122,147,102,130,164, 42,139,237, 52,165, 68,127,234,235,251,
- 92, 19,216,230, 38,170,126,163, 25, 90,165,180, 38,215,176,150, 82, 74, 93, 27, 93,179, 36,202,178,107, 55,198,205, 91, 63,225,
-144,168, 88, 17,185,235,223, 55,218, 80,114, 45,250,178, 36, 64,170,185,145,211, 69, 58,117, 45,113,192, 41, 84,247, 65,200,116,
-173,140,167,117,181,126, 53, 78,222, 11,237, 90,134, 20,152,208,156,250, 17,134,140, 61, 9,128, 70, 41, 69, 99, 29,143,195,196,
-187,111,222,243,213, 79,111,101,221, 87,199,223,115,208, 14, 65, 86, 69,105, 26,201,218,240,240,120,230, 55,223,220,241,225, 28,
-240, 89,241,197,151,111,217,159, 60,254,225,129,199,143, 15,148,164,105, 15, 71, 92,183,103,215, 21,134,126,168, 44,132,142,239,
-222, 15,124,247,225,204, 41,105,238,167,192,144, 11, 35, 48,197,140, 79,137, 84, 10, 55,183, 55,188,253,234,103,132,201,115,127,
-247,158,157,150, 20, 55,114, 32,169,150,168, 13,106,231, 72,182,144,173, 22, 27, 94,235,176,107,136,203, 11, 7,115,225,199, 38,
-160,254,246,221,123,185,132,178,106,173, 62,141, 77, 85,151,226, 52,181, 25,243,204,255,175,235,133,155, 54,103,118,121,225,185,
- 21,181,238,217, 63,249, 51,105,125,161,122, 22,234, 96,121, 49, 47,254, 83, 24,221, 45,152,100,157, 6,108, 44, 83,245,207,103,
- 4,250,214,159, 46,251, 43, 25, 5, 74, 39, 87,158, 30,200, 23,190,246,234,225, 87,107,144, 13,234,249, 41,244,165, 19, 97, 43,
-241,159, 51,217, 97,235, 74,211, 90, 65,154,133,103, 8,223, 96,230,228,111, 92, 19, 37,151, 11, 68, 42, 85,221, 57,219, 98, 46,
-187,238,149, 42,183, 94, 27, 27,178,239,143, 27,247, 44,169, 93,235, 96, 65, 45, 5,234,246,103, 92,128, 49,207,189,135, 79,150,
- 82,101,227, 86,216,102,170, 87, 27, 74, 78,203,120, 81, 27,195, 52, 13,164, 28, 22,221,201, 58, 33,145,189,166,132,146,136,106,
-247,124,238, 37, 84,196, 90,218, 86, 72,113, 49, 70, 50,114,192, 27, 20,218, 89,252, 24,233,251,158,125,215, 49, 14, 35,166,192,
- 99,146, 88,201,199,243,153, 62, 4,176,166,194,106, 12, 67, 74,210,137, 26,197,126,191,227,230,230,149,140, 13, 21,140,253,128,
- 41,138,186,194, 37,147,165,235,175,108,120, 52, 76, 33, 72,241, 85, 50, 93,219, 98, 54,130,211,105, 18,149, 60, 9,162,151, 44,
-234, 24,164, 35, 52,213,155,222,185, 29, 33, 73,134,123, 74, 89,172,114,198,241,248,120,174,130, 66, 71,169,113,161,109,219, 10,
- 2, 55, 68,108,211,162,170,149,142,156, 36,151, 61, 77, 24, 13, 93,227, 56,238, 26, 90,103, 80,100,162, 18, 2,154,194,208, 58,
-135, 15,146,217, 46, 13, 96,192,213,196,186,214, 25, 82,206,180,117,114, 48, 11, 79, 37, 83, 92,112,182,143,167,199,101,205,150,
- 82, 68, 1, 77, 29,233, 15,253, 25,171, 13,164,218,205,166,140,178, 6, 31,163, 28, 40, 41,139,181, 48,122, 81,229, 43, 93,163,
- 66, 83,245, 93, 75, 65,167,245, 60, 18,207, 34, 30, 12,114, 24,246,253,137,214, 89,116, 78, 28,154,134, 87,135,134, 67,167,104,
-109,146, 9,135, 65,246,240,117, 50,161,141, 20, 29, 95,124,245, 21, 63,251,234, 75,254,246,111,127, 73,223, 15, 53, 83, 93,180,
- 81,219, 48,161,178, 42,139,137,185, 48,134, 4, 90, 38, 7, 33, 85, 93, 0,226, 45, 87, 40,114,136,203,253, 83, 52, 43, 85, 43,
-146,146,136,111,173,188,110,169, 78,206,174, 45,169,107,225, 93, 46,120, 33,179,245,209,106, 93, 3,176, 36,152,165, 66, 21,228,
- 83, 89,106, 84,110,181,215,170,146, 43,243,125,221, 66,198,152,100,114,170,221,242,217, 17, 61, 24, 28,218,150,221,126,199,228,
- 7,193,178,170,217,234,102,193, 53, 4, 21,192, 88,162,150,130,232,246,176,199,168,136, 53,154,111,127,243, 61, 95,190,121, 37,
- 41, 95,173,220,247, 67, 85,191,107,165, 41, 49,242,120, 58, 49,228, 76,177, 13,183, 55, 55,156,194,153,239,239,123,250,119,143,
- 60, 76, 19,244,247,188, 61, 28,249,240,254, 76, 81, 31,216, 31, 44,237,174,195, 79, 35,141,187,229,176,127,195,185,143, 60,246,
-247,188,187, 59,113, 55, 4, 62, 62,142,248, 4, 33, 65, 66, 4, 81,231, 83,207,248,238, 61,255,234, 95,254,107,126,247, 15,255,
-123,254,250,255,254, 83, 66, 58, 99,138,166, 36, 69,202,138,162, 45,205, 77, 67,123,211, 80, 26, 13,173, 89, 59,245,173,130,123,
-185,193,171, 79,143,200,159,179, 39,253, 86,219,244,170,156, 80, 92, 90,196,158,222,100,213,179,187,223, 92,245, 86,219,195,123,
-233, 12,235, 23,148,114,121, 64, 92,119, 90,229,170, 88,184,248,186,235,253,241,230,160,251,177, 7,250, 75,175, 83,174, 41, 39,
-235,254, 90, 45, 98,147,178, 57, 44, 46,200,178,149,237,190, 80,224,102,133,127, 97, 1,112, 44,251,219,205, 96,255,162,137,175,
-234,240, 39, 47,228,188,199, 86, 91,187, 86,217,172, 51,202, 37,140,165,238, 61,217, 56, 2,102,211,247,140,127, 84, 23,172,129,
-178, 0, 39,230,145,255,162, 86,159,127,196, 92,214, 84,190,103,166, 8, 79, 34,116,159, 73, 14,124, 50,171, 40, 44,197,226,118,
- 98,242,252,251,116,249,216,215,182,203, 37, 97,111, 67,249,155,119,154,185,194, 49,164,211, 41,181, 35,209, 21, 11, 42,228,181,
- 88, 15,128,217,223,173, 40,140,195, 80, 57,217, 98, 9,139, 57, 51, 12,163,236, 41,181, 38, 68,177, 40, 77,125, 15, 74,209, 54,
- 45,195,121,128,162, 24,106,176,202,161,219,227,189, 68,133, 42,235, 68,236, 24, 35,206,118,216, 70, 67,201,164, 41,114,255,254,
- 78,108,111, 64, 63,246,180,109, 71,107, 91, 81, 91, 43,200, 51, 73, 12, 48,170,112,232,186, 37,255,192, 79,129,243, 48, 10,173,
-110,156, 68,193, 94,192,216, 88, 89,236,178, 82,152, 5,118, 70, 91,250,177,231,112, 60, 48, 77, 53,166,117, 28,105,218,157,240,
-225,135, 73,210,232,144, 93,119,172,227,211,118,215,226,189,116,176, 41, 38, 84,150, 29,169, 81,176,239, 90, 90,167,233,172,162,
-113,166,194, 86, 12, 40, 77, 72,153,148,225,220, 79,140, 85,252, 53, 76, 1,163,231,171,184, 10,242,148, 8,184, 82,165,178,229,
- 36,227,232,211,249, 84,163, 87,253,162,158, 78, 41, 75,183,150,178, 92,239, 57, 11, 72,168, 30, 58,122, 94,191, 24, 37, 86,178,
- 36,135,144,217,136,120,115,146, 12,248, 82,191, 70, 41,203,110,215, 85,143,187,216,252,146,143,236, 92,139, 38, 19,167, 9,239,
- 50,131, 21, 47,127, 78, 22,218, 6, 48, 11,159,192,106, 85, 99, 76,225,205,171, 55,252,241, 31,255,123, 62,124,120,207,195,195,
-137,198,153,205,103, 99,155, 25,161, 80,198, 98,170,229,241, 60,140,216,106, 45,155,239, 36, 70, 23, 26, 39,169,151, 37,213, 34,
-117,190, 57,150, 88, 39, 15, 90,242,227, 17,129,110,206, 25,178, 76, 59,200,165,218,178,114,117, 37,196, 42,136,148, 21,132, 20,
-118, 2,209,201,117, 34, 5,245, 58,170,211, 64,106, 58,158,174,205,212,204,129,207, 64, 76,226, 70,208,170, 34,172,163,128,157,
- 26,227,132, 30,104,180, 92,247,135, 22,107,160, 57,236, 33, 37,108,235,234,125,181, 96, 93, 67, 46,103,156,113,188,121,117, 32,
-246, 39, 94,239, 90,142,135, 35,254,241,158, 15,119, 15,244,167,137,221,126, 79, 14, 2,248, 17,224, 86,130,148,137,163, 39,148,
- 66, 50,150,127,120,247,158,199, 94,241,161,143,124,236, 7,154,156,185, 61, 54,252,228,171, 47,105,156,101,120,244,120,175, 25,
- 30, 61,249, 49, 50, 14,145,199,199,123, 52, 45, 69, 25,166,193,115,186, 31,248,254,254,204, 41, 2,202, 18,107,104, 77, 65,118,
-249,211,253, 3,255,251,127,249, 47,252,193, 63,255,125,254,248,127,254, 95,248,203,255,227, 63, 19,238,190, 39,103, 35,186,134,
-146,217,191,186,197,236, 20,102,223,146,157,194,188, 62,188,250,147, 82,213,239,215,163,226, 5, 24,162,158, 30,232,207, 89,212,
-126, 59,174,187, 89, 34, 48, 55, 84,149, 11,225,145, 82, 79,163, 51, 47,162,192,183,177,153,219,199, 94,201,164,203,121,174,213,
- 85, 94,250,214,138,164,212,179,250,170,235,177,249, 74,142, 43,155, 14,244, 25, 45,194, 11, 58,133,139,215,103, 59,125,168, 19,
- 6,189,224,122, 89,172, 85,170,238, 97, 69, 32,151, 22,168, 73, 89, 16,180,101, 13, 77,169,130, 67,107,196,163,110,141, 84,212,
- 70,109,168,105,106,139,236, 41,155, 3,182,114,152, 23,162, 92,174,161, 46,106,205, 30, 87,122, 85,211, 47, 35,184, 89, 11, 80,
- 54, 17,168,215,201,115,235,161,190, 88, 37,203,108, 3, 91, 5, 45,179, 40, 30,117, 9,253,173, 6,150, 53,157,237, 25, 31,249,
-115,215,224,115,239,201,245,251, 80, 54,175,161,186, 40,167,184,148, 23, 46,149,163, 90,197, 73, 91,108, 81,189, 78,119, 93, 83,
-133, 97,165, 90, 0,229,112, 16,254,122,168, 97, 23, 6,107,101, 20,105,173,165,237, 90,177, 95, 77,158, 97,154, 40,185, 16,162,
- 88,182, 38, 31,164,147, 15, 98,249, 41, 41, 51,244, 35,231, 97, 68,215,100, 47,133,198, 56,199, 52,121,226,224,201, 62, 80, 98,
- 34,199, 72,244,129, 16, 60, 90,233, 74, 48,155, 3, 81,228,121,165, 10,143, 9, 33,210,247, 35,211, 56,213,113,172,128, 85, 78,
-253, 80,115,215, 53, 41, 75,132,231, 48, 70, 98, 17,103,200, 48, 69,124, 76,100,101,152, 82,198, 39, 24,125, 36,100, 40,202,242,
-240,112,166,104, 41, 86, 10, 90,252,216, 74, 11, 49,207, 7, 40,133,152,196, 14,103,172, 96, 95,115,142,116, 77,131,166, 96,181,
-240,175, 59,103, 56,180,142, 55, 55,123,217,165,171, 82,179, 13,172, 64,104,124,148, 92,240,232,235,148, 67,132,108,186, 38,138,
-205,188,134,110,183,103,242,113,113,153,160,103, 70,127, 21,111,206, 90,134,178, 70,231,206, 10,111,165,205, 2, 48,174, 66,115,
-217, 47,215,117,217, 44, 6, 91, 2,166, 42,191, 97,169,123,149,192,120,102,174,193, 56, 78,210, 85, 83,120,251,246, 53,166,254,
- 92,243,202, 35,164, 76, 42,154,126, 74,196,168,240, 99, 97, 24,124,141, 93,149,207,237,249,124,230,215,191,250, 21, 31, 62,220,
- 85,146, 91,185,210, 9,173, 66,228, 57, 24,165, 84,152, 80,140, 17,173,141,100,192, 91, 67,227, 76,117, 34,148,197,154, 58,123,
-215,181,130,182,113,116, 77, 43,244,183, 82, 45, 94, 10, 92,227, 40,185,186,161,138, 90, 92, 27,133,173,152, 81,180, 7,214, 88,
-108,117,180, 58, 99, 48, 21,213,171,171, 29,214, 85, 75,168,174, 62,237, 82, 42, 62, 54, 11,196,102, 22,167,234,250,190, 25,109,
-216,119, 59, 72, 69, 56,240, 90,177,219, 57,154, 78, 86, 29,166, 72,161,162, 75,225,230,230, 72,202,153,135,135, 71,148, 86, 28,
- 77,225, 95,253,254,239,241,179,159,188,102, 24, 30, 56, 28,118, 52, 74,227,246,142,215,191,248, 9, 49,123,116,169,214,178,209,
- 67,150, 64,159,187,251,145,119,143, 35,125, 48,124,253,190,231,253,105,224, 28, 34,253, 24,121,247,238, 3,253, 56,224, 67, 34,
- 38,131,182, 59,188,118,124,253,237, 3, 15,143,137, 16, 19,167,243, 35,239, 63,222,113,247, 48,240,155,239,238,185,247,153,104,
- 91, 66,150,207, 84, 90, 2,141,132,155,144, 74,225,219,239,223, 49,244, 3,255,225, 63,252, 71,254,254,239,126,133, 33, 97, 75,
-226,216, 25, 14, 59,203,237,235, 3,230,182, 69,127,126,139, 45, 27, 88,246,143, 13,104,121,169, 75,253, 71,237,211,127, 11,177,
-124,217,192,211,203,194, 9, 95,149,235,203,152,105,190,225,110,187,179, 43,222,122, 81,159,126,236,107,202,156,122, 66, 79,122,
- 57, 97,237,250,128,121,254, 80,223, 48,204,103,220,237,124,192, 84, 33,140,209, 44,248, 67, 17,216, 80, 41, 82,171, 63,127,187,
-127, 86, 27, 49,201,114,232,214, 27,139, 74,229,197,151,187,104,179, 42,242,175,115,239,183, 7,219, 51, 29,238,156,180,164,171,
-130,127,166, 66, 21,214,231,161,230,247,103,254,110,229,234,245,221,168,232,231,226, 66,177,170,214,231,180,120,245,236,166,157,
- 39, 99,191,151, 10,206,231, 59,251, 53,154,229,130,138,159,213,147, 52,185,121,132,175,212, 42, 22,152, 39, 44,186,218,254,140,
-210,140,211, 64,215,181,160, 5, 79, 25,147, 40,161, 75, 41,116,187,142,166,181,213,114,168,232,218,142,211,249, 76, 74,165, 18,
-190,162,236, 17, 21, 50,230,243,129,146, 51, 59,215, 81, 50,196, 26,147,170,180,163,233, 90,250,254,204,187,251,143,148, 24, 49,
- 40, 26,237, 42,221,111, 62,172, 50,166,162, 82,115,202,244,253,136,247,147, 8,149,173, 33, 41,241,177,203,224,200,129,179,204,
-239, 94,204, 25, 99, 27,118,199, 29,211, 24,233,135, 65, 70,215,245,112, 83,104,154,195, 13,251,189, 4,195,220,159, 31,107,160,
-144, 1,173,105, 93, 67,242,129, 97, 12, 24, 43, 5, 9,165, 16,166,243,130,160,158, 39, 76, 33, 6, 66, 72, 24, 45, 55,231, 28,
- 38,156,145,253,121, 99, 45,175, 14, 59,118, 86, 19,189, 39,170, 36, 41,107, 89,222,159,249, 0, 84,115, 68,173,151,207,138,214,
-107,113,158, 82, 18,219,108, 8,100, 10,182,113,104, 43, 58,134, 84, 10,218,154, 5,223,156, 66,168,136, 84,217,181,231, 88,239,
- 33,198, 80, 66,216, 20,191,114, 80,249,148, 46, 86,149,243,138,134,106,181,220, 94,111,115,152,142,247, 94, 72, 15, 37,139,133,
-202, 41,218,221,129,105,212,236,186,142, 24, 3,221,241, 64, 63, 14,228, 52,113,122,248, 64,201,178, 90,113,214,160,116, 2,165,
- 8, 83,224,215,191,250, 77,189, 46, 77,157, 6,176,168,203,103,205,139,169,161, 79, 90,131, 51, 14,107,229, 0, 23, 60,171, 88,
- 40,181,146, 2,101, 94, 97,234, 77,217,106,173, 28,206,185, 90, 31,203,102,172, 46,107, 5, 17, 25,146,100,207, 79,109, 18, 99,
- 12,116, 93, 71, 74,117,221, 80, 50,170,134,245,176,124,166, 51,141, 53, 56, 35,158,243, 28,203,178,178, 16, 91,243, 44,148,149,
-187, 64,202, 5,227,236,114,159,207, 33, 9,220, 69,131, 53,185,130,104,228, 90,211,198, 44,244,147, 20,228,144,110, 27,121,175,
-127,239,159,126,201,190,201,220,127,255, 27,254,240, 15,255, 57,163,143,124,243, 87,127, 67,127, 58,201, 90,160,181,228,211, 25,
-139,162,164, 76,242,153,243,195,196,175,190,254,192,135, 80,240,201, 96,237,158,198,102,166,152, 40,202,210,238, 94,129,109,249,
-216,103,238,222,223,115, 58,189,163, 61,236,241,169,208,143, 35,218,237, 73, 35,244, 99,224,251,147,231,195,148,137,170,126, 62,
-231, 6, 51,203, 61,158, 20,235,109, 70, 83,140,225,207,255,250,151,188,186,125,197,239,255,209,191,225,175,254,244, 63,115,219,
- 89, 82,242,168,156,177, 77,131,106,219, 75,245,251,179,184, 87,197,146, 1,190, 29,207,111,179,203,203,188,195,252,209,230,181,
- 75, 75, 87, 94,110,238,207,135,165, 92, 40,141, 75,185,176, 75, 92,231,100,109,178, 72, 46,215,205,245,224, 41,155, 35,227, 58,
- 40,237, 66,212,117, 69,149, 83,171,226,109,249,218,124,129,125, 93,179,203,231, 73,195, 86,172, 53,147,180,214,133,118, 97, 77,
- 87,223,244,164,165,238, 80,171,119,217, 40, 93, 83,164, 10,182,105,112,198, 48,140, 99,237,122,202, 19,205, 91,153,199,245,155,
-220,149,249,176, 93, 11,128,167,111, 75,220, 38,144, 21,208,179, 71, 72,109,115,201,103, 14,116,125,164, 44,149,186,209,171, 96,
-104,123, 98,235,250,125,228,252, 83, 23,175,241, 34, 69,219, 62,217,173, 48,176,108,253,249,151, 9,120,252, 0, 7, 97,254,187,
- 51,153,105,251,245,235,182,161, 92,141,219,159, 78,106,148,186,108,118,174,115,232,175, 76, 7,203,180, 36,165, 72,211, 24, 92,
- 99,132, 56,102, 36, 66,113,183,107,100,186,162, 11,218, 66, 76,129,166,233, 24,199,145,148,178, 8,195,148,236,218, 75,129,243,
-169,134,164,236,118,114,128, 77,158,113,154,104,109, 35,226, 46, 52, 31, 63, 62, 72,172,101,206,232, 2,199,182, 67,165, 92, 89,
-218,174,238,115, 69,229, 61,122, 95,129, 41,178, 68, 23, 59,150,252,183,199,243,132,181, 50,238,246,190,178,194,235, 4,193,199,
-196,253,135,123, 1,175,228, 76,211,117, 98,223, 41, 21, 62, 98, 45,166,109,249,240,112, 79, 81,194,118, 80,181,179,114, 74,147,
- 80,184,198,209, 15,189,248,109,181, 38, 86, 36, 41, 57, 67,204,139,138, 91, 43,161,106, 89, 45, 93,156,213, 50,106,182, 20, 74,
- 10,164,162,233,118, 29,166, 21,142,185, 50, 18, 38,159,115,194,217,134,126, 26,241,161,160,148,197, 24, 41,132,141,179,232, 34,
-187, 92,153, 62,248, 5,117, 60, 13,211, 18,146,228, 39, 73, 20,235,186,134, 24, 37,254, 84, 25, 57, 88,218,182,193,251, 80,217,
-235,134, 88,146, 8,213,138, 90,174,215,237, 61,108,185,118,106,231, 95,114, 89,226, 98,231,148,182,105,154, 36,124,165, 2,157,
-222,127,248, 64,201,153,166,105,133,116,135,162,219,107,206, 99, 18, 81,224,238, 72,240, 9, 75,170,135,162,166,113,141,224, 87,
- 81, 53,208, 69,154,135,113, 28,217,237,118, 21,246, 19, 41, 41, 99, 85, 38,165,128, 82,208, 54, 13, 37,167, 26,144,226,171,250,
- 92, 46, 96, 85,159,179,190,104,108,106, 51, 83,169,109,210,225,215,157,120, 17,209, 94, 65,120, 9, 69,175, 52,200, 5, 12, 85,
-139,134, 28,171, 88, 46, 11, 47,160,212,233,141,208,251, 82, 45, 46, 4,171,172,107, 97, 34, 83,129,117,162,106,141, 37,165, 72,
-172,107, 13, 85, 25, 7, 70, 23,118,109,131,210, 53,105, 46, 38,110, 14,123,116,145,191,183,107, 45,209, 79, 52,198, 96,145,194,
-243,241,244,128, 74,133,127,241,111,255, 5,175,127,241, 79,248,205, 95,254, 13,109,107,121,184,127, 32,140, 30,123,212, 82,200,
-249, 64, 25, 39,252, 57, 50,244,145, 24, 44, 31, 63, 60,144, 77, 87,217, 22,138,157,177,152,198, 50,134, 19, 49, 42,166,146, 57,
-188,126, 77, 86, 35,239,223,125, 96,244, 66, 75,188, 63, 15,180, 77,199,121,128,199,177, 16,180,173,107, 5, 1,134,229, 20, 49,
-181,177,203,245,206,154,171,184, 50, 99,248,211,255,231,255,227,143,254,183,255,149,221,103,159, 17,252,189, 52,121,117, 12,175,
- 15, 29,229,208,173, 68, 57, 85, 71, 76, 79, 18,215,212,203,254,243,217, 2,177,181,243,188,220,102,111, 47, 19,245, 12,100,125,
-179, 55,189,226,164,173, 35,242, 57,158,177,108,132, 76, 91,202,208,229,141,182,108,210,221,230, 49,236, 2, 23, 41, 60,189, 99,
-207, 55,231,178,238,153,133,103,174,214, 81,183,218,122,168, 87,216,130,252,179,220, 36, 43, 90,173,142,246, 54, 4,186,217, 51,
- 63, 31,104, 42, 47,199,138,214, 5,103, 53,214, 66,219, 88, 26, 39,162,152, 56, 77,248,105, 92,200, 66,128,112,170,151,168,220,
-188,138,193,106,222,180,169,153,224,115,186,145,218,238,209,175,184,178, 69, 65, 86,171,103,148,122, 3,170,159, 47,138,214, 24,
- 99, 37,222,179,138,226,102, 34,157, 4,121,232,229,123, 45, 41,113,170, 92,240,210,183,206,193, 39,215,136,122,106,145,188,238,
-230,103, 24,210,133,125,113,126, 63,175,174,203,173,187, 97, 38, 37, 42,173, 54,251,254, 21,251, 59,223,125,117,125, 3, 75, 37,
-214, 93, 25,239,175,126,182,237, 9,191, 38, 25,202, 75,146,104,156,165,237,172, 36,157,133, 32,129, 58, 42,163, 85, 89, 68,124,
- 41,199,170,126, 22,244, 99,202,146, 82,149,178,236,112, 39, 31,208,104, 14,251, 35,214,138, 32,202, 88, 83, 15, 89, 25,199, 63,
-158, 78, 34, 8, 13, 9,135,230,205,254,136,203, 5, 91, 63, 19, 51, 56, 36,134, 68, 44,153,172, 4,228, 43, 94,110,105, 99,167,
-144, 8, 81, 70,186, 83,136, 88,215,144,178,136,231,124,136,244,163,103,119, 56,146,149, 18,203,144, 0, 18,150,233,145, 8, 3,
- 13,211, 56,214, 66, 76,124,235,165,166, 1,197,224,241, 33, 16, 98,146, 12,242,146,103,139, 51,198, 57, 41, 78, 92, 83,189,217,
-107,201,157, 98,194,104,203, 97,183, 39, 5,143, 82,121,177,108,233, 89,240, 24, 11, 37,202, 62,215,123, 9, 65,153, 66, 34, 38,
- 68, 64, 84, 88,210,192,230,189,178, 53, 14,148,194, 40, 91,213,220,176,239,118, 4, 31, 22, 71,202,172, 97,208, 53,192, 72, 86,
- 5,121,217,151,215,143,136, 76, 0,178, 90, 58, 90,125, 49,211,146, 14,125, 46,130,203, 38, 43, 66,192, 51,150, 87,183,175, 8,
- 33, 45,215,186,173,145,154, 93,211,146,115,196, 79, 94,152,249, 20,162,156,254, 20,192, 88, 41,236,231, 27, 91, 12,129, 82, 41,
-123,228,132, 74,169,118,221,162, 46, 39, 69, 74, 8,116,141,101,215,136,253, 81, 33, 46, 13,163,168, 43, 14,181,196, 17, 59, 55,
-195,127, 10,214, 25,140, 93,239,237, 37,165,133,228,136,210,228, 13, 1,114,241,224,187, 70,112,168, 26,156, 86,216,106,238,181,
- 90,215, 85,162, 8,237, 74,201,184,154,230, 54, 67,119, 82,146, 34,129,234, 10, 17,241, 27,148, 36, 86, 58,205, 10,101,202,185,
-200,216,158, 34, 76, 4,149,105, 26,201, 84,208, 26,137, 55,214,133, 93, 99,105,172,162,181,134, 56, 5,118,221, 78, 18, 9,173,
-229,103,191,248,156,127,251,239,255, 29, 55, 63,185,225,244,205,215, 60,222,221,179,239,246,244,247, 15,180,251,134,195,241, 70,
- 8,114,193, 19, 63, 60,114, 62,123,254,238,155, 59,126,245, 15, 31,249,254,190,231, 52,140,156,199,137,209, 39, 82, 42,248, 48,
-241,246,237,107,190,250,242, 75,162, 79,124,255,205,183,248, 97,162, 20,203,233, 60, 10,144, 40,107, 9, 99, 26, 61,253,232, 25,
-235, 4,137, 26,194, 99, 20, 52,149, 4, 90,106, 68,120, 44,185,186, 40,132,155,239,195,196,127,247,123,191, 67,255,221,215,188,
-114,154, 87,135,150, 87,111,142,152,207,143,164, 47,223,172,209,171,165,168,103, 69, 66, 63, 4,151,121, 2, 24,249, 17, 93,251,
-162, 32,190, 82, 40,175, 85,239, 37, 92,100,153, 16, 92, 61,230,178, 7, 35, 95,126,172,182,171,208,234, 35, 46,172,214,176,203,
- 40, 23, 54,204,215, 53,214, 52, 47,222, 72,253, 4,167,170,138,146,110,118,182,161,205, 54,173,250, 28,242,147,201, 67, 89, 40,
-119,170, 86, 95,242,113,176,213,195, 44, 97, 40, 78,103,172,134,206, 88, 25,247, 80,104,246, 45, 49,201,152, 80,145,112, 78, 51,
- 4, 81,138, 42, 10,122,121,126,229, 50, 62,118,166,213, 41,158,188,142, 79,212,249,229,130,109,179,157, 74, 47, 1, 59,106,203,
-116,175,137, 98,242, 94,230, 75,171,158, 90, 85,229,203, 52,228,106, 23,254,156, 96,237, 57,199,192, 75,127,119,134,251, 60,167,
- 97,184,184,118, 46, 38, 2,155,130,160,158,250,229, 98, 2,115,221,145,255,136,235,120,153, 17,173,184, 60, 31, 2, 33,123,218,
-182,161,212,188,111, 87, 71,187, 40, 77, 63,140,164, 18, 73, 57,160, 21,124,246,230, 51, 98,156,240, 21, 25,171,148, 40,177,115,
-156,247,179,154,221,110,199, 56, 76,220,125,188, 99, 24, 39, 82,202,236,118, 59, 17, 13,105,205,206, 56,180, 81,180,174,195,247,
-103,218,166, 19,161, 82,206, 88,215, 80,148,196,136, 22, 20,198, 88, 26,165,241,201, 75, 65,151,178,236,153,131,103, 24,167, 69,
-247, 96,173, 35, 35,157,109,201, 5,171, 13,161, 6,155,236,118,114, 16,238,247, 59, 38,239, 41, 9, 82,172,169,106, 83, 88, 16,
-159,211,228, 49, 53,107,124, 28, 6,114,202,236,218,150,148,194, 18, 78,147, 82,145,212,169,154, 91, 30, 67,165,229,197,196, 48,
-121,201,139,174,123,217, 5,215,172, 52,198,105,146,207,164,156, 68,173, 79,166, 84,127,123, 41,170,114,207,133,196,102,172, 93,
-162,120,163,143,164, 28,177,149,145, 62, 12,177, 30,138,162, 69, 65,171, 26,188,146, 9, 94, 86, 33, 33,229,186,158, 84,203,186,
- 73,149, 31,179, 57, 20,155,167, 42,122,249, 12,120,239,151,107, 90, 46,223,170, 81,169,218,148,105,154,208,102, 94, 25,212, 66,
- 74,107,250, 52, 45,249,226,115,225,158, 82, 38,230, 36,104, 96,192, 42, 57, 0,149,214,164, 81, 4,152, 84,124,235, 48, 77, 50,
- 22,223,212,170,212,195,210, 89, 43,247, 35, 59,223, 15,179,172, 35,152, 65, 54,114,157, 80,137,145, 37,207,105,130,171, 85, 77,
- 83,131,139,180,198, 26,161,220,201,142,220,226,189, 71, 27, 83,139,128,153, 29, 34, 59,253,156, 10,141,115,116, 93, 71,156,124,
-157,114, 38,124, 74, 56,230, 12, 11, 7, 41, 74, 48, 85, 1,149, 34,141, 81,228,105,192,238,247, 36,241,199, 18, 74, 33,199, 68,
-131, 97,191,219, 67,154,104,172,229,245,205, 14,157, 19,118,223,178,191,217,163,190,203, 52,187,150,183, 95,188,102,247,229, 23,
-124,252,251,255,202,199, 95,127,205,207,255,224,127,224,187,191,248,111,180,214,114,250,230, 29,159,127,249, 5, 28, 52,202, 54,
- 36,101,121,127,122,224,239,239,238,249,230,225,132,167, 33, 57,131,143, 9,157, 50, 59,107, 81,177,112,254,120,162, 63,220, 18,
-124,194,180, 29,119, 15,119,248, 73,147,139, 38, 23,120, 56, 13,236,218,150, 88, 20, 83,134, 88,100,154, 5, 66,230,108,173,166,
-209, 90,240,182,206,224, 75,169,235, 36,133, 86,162, 31,249,251, 95,253, 3,255,211,191,249,151,124,237, 51,147, 19,145,102, 44,
- 5,167, 45,198,117,178, 83, 95, 19,118,202, 39, 15,240, 31,162,197,125,242, 96, 87,249,169,111,250, 98, 6,174,159,168,181,183,
- 99,253,237,129, 94,100,200,119, 65,148,145, 3,165,200,248,103,190,241,171, 76, 49,165, 90,173,242,213,115,124,106,143, 91,207,
-247,114,169, 24, 47,250,162,131,156,187,248,153,136, 86,230,221,217,179,130,234, 92, 39, 11, 74, 24,202,213, 26, 97,173,195,152,
-134,198, 58, 65, 33,150, 72, 99, 50,135,174,193, 41,217,225,132, 10,242,112,246, 64,201, 82,177, 79, 49, 18,188,103, 76,177,234,
- 2,158,238,154,159,140,142,159, 75, 64,123,238,189,219,172, 55,158, 22,111, 27, 63,249,102,106,177,170,225, 75, 45,106,202,143,
-178, 58, 62,187,155,255, 45, 24, 8,159, 4, 32,229,114,121,184,151, 21, 65,187,144,242,102,221,219, 6,162,179,216, 0,159,115,
- 45, 60,103,222,184, 80, 93,214,252,120, 20, 37, 21,114,170, 59,206, 44,220,113,107, 44,227, 56,226,131,136,101,238, 62,222,241,
-230,245,205,178,107,140, 67,172, 66,174, 70,180, 19,133,152, 90, 0, 0, 0, 32, 0, 73, 68, 65, 84, 69, 70,147,135,227,145,143,
- 31, 63,242,241,227,157,140,128, 43, 8,166,105, 26,166,209,115,115,115,172, 17,147,144,134,177, 50,200, 5, 49,130,145,195,169,
-104, 69,204, 25,107, 26,134,113,228,120,115,164,127,232,133, 55,223,118,194, 13,167, 44,246, 43, 61,115,218, 43, 64,165, 20, 89,
-183,180, 77,203, 20, 60,209, 7, 20, 48,244,131, 8,197,106,103,222,247,103,140, 22,171,147,196,141,139, 35,192,152, 26,226,161,
- 69,124,215,182,109, 13,155,145, 36,186,237,138, 76, 25,203,238,208, 65,202, 60,156, 78,220, 30, 90,140,181, 88,107,104,172,160,
- 75,165, 42, 83,196, 28,209,104,156,213,117, 92,105,170,152, 77, 18,211, 82,146, 16,149, 20,163, 80,199,140,174, 48,148, 82, 15,
-252, 58,106,158,113,166, 86, 98, 96,219,174,149, 34, 38,132, 10, 33, 42,117, 65, 47, 58, 2,201, 26, 23, 76,113,190, 26,251,173,
-159,177, 75, 75,164, 18,218,138,184, 26,148, 98,154, 70,108,141, 51,157,166, 9,231,108, 77,104,211,196, 60,227, 85,101, 29, 23,
-179, 8,235, 98, 74, 85, 93, 78,205,123, 79, 75, 92, 39, 91,230, 57,194,192, 31,199, 81, 8,134, 41, 83,116, 33, 35,130,180,146,
-165,139,158,239,117,185, 78,140,108, 85,181,231, 34,190,236, 89, 64, 40,162,184, 66, 46,138, 56,249, 77,161,173, 23, 14,131, 64,
- 97, 52, 86, 73,138,152, 53, 66, 78,204, 73, 26,174,173,240, 56, 86, 79,187,172, 49, 19, 62,103,178, 15,114,184,183, 29, 33, 77,
- 21, 64,163, 41, 33,146, 99,164, 49, 6, 93,242, 82, 60,152,170,113,136, 37,129,106, 72, 40,134, 83,207,113,223,112,251,234,150,
-190,239,121,117,104,105,140,166, 49,154,227,177,227,254,227, 61, 93,103, 49, 38,211, 54, 10,237, 61,119,127,251, 55,124,253,237,
-175,248,253,127,247,175,249,248,155,111,249,252,247,126,206,195,247,223,203,117, 83, 2,166, 52, 48,101,250,251,129,239, 63,156,
-232,167, 76,198,145,146,166,143,137, 80, 29, 73, 83, 24,176, 70,209, 30, 26, 62, 60,244,156,206,103,238, 31, 30,171,192,148,117,
-170,161, 50,167,193, 19, 81,248, 12,197,136,200, 80,229,128, 81,138, 22, 69, 83,215,143,101, 94,233,105,232, 99,144,130, 10,197,
-119,239, 63,242,208, 71,134, 41, 51, 58,105, 18, 69,184,106,208,182, 89, 59,117, 25,163,235, 90,245, 62,127, 88,191, 40,142,123,
-134,178,246,169,142,125,190,176, 47,190,159,122,202,234,206, 87, 22,175,203,253,122,190, 18,238,213,248,147,242, 52, 1,236,185,
-238,116,254, 26,189, 29, 33,213, 71, 74, 85, 8,163,102,127,227,117,113, 67,190,116, 51, 43,225,123,151,101,132, 91,255,111,206,
- 27, 70,201,158,164,118, 48, 77,211,208,180, 59,186,238,200,174,221,201, 46, 81, 23, 12, 9, 83,146,132,206,228, 66,241, 3,217,
- 75,236,223, 97,191,195, 57, 67, 86, 64,140,188,251,120, 71, 20,155,240,246,152,218, 64,104,214, 53, 1,234, 19, 5,217, 11,244,
- 84,165,149,236, 34, 89,199,206, 82,145,231,181, 88, 81,207,196,219, 22,117, 1, 55,120, 41, 94,245, 83,197,224, 75,211,160,231,
-172,129, 79,126,174,178, 33,243,109,126,159,187,233, 39,215,194,115,164,184,231, 48,180,207,126, 38, 46, 69, 10,243,254,212, 88,
- 75, 74,243,154, 66,213, 24, 79, 75, 41,154,224, 51,143,167, 19, 90, 25,186,110,191, 92,123,146,128,103,104,155, 70,194, 84,172,
- 28,140,239,223,191,103,168,225, 36,146,216,228,100, 76,158, 34,111,222,190, 6, 20, 31,222,125,199,193, 57,210, 56,145, 99,166,
-148,136,155,197, 88,202, 96,156, 67,167,140,115, 13, 41, 23,206,125,143,117,194, 21,239,135,190,102,135,167,186, 75, 45, 52,245,
- 57, 88,109,232,218,142,105,154, 48,141,147,223,235,225, 86, 42,162,211, 24,201,191,118,173, 99, 28, 71, 73,165,211, 26,239,189,
- 8,159, 82,174, 9, 99, 18,165, 23, 84,193, 90, 67, 8, 98, 29,155,145,169, 98,247, 3,215,216, 69,109,174,155, 6, 31, 19, 33,
- 66,115,216, 9,159, 62, 71,108,237,244, 94,191,190,197,143, 19,185, 24, 90,165,208,211,132,154, 2,177, 8,120,164, 88, 71,219,
- 52, 85,168, 88,234, 88, 23,156, 19,225,214, 28,115,219, 30,246,156,251,179,116, 87, 90, 4,125, 82,224,200,132, 67, 38,124, 66,
-197, 83,185, 44,171,148,116,133, 30, 94,108,181,234,170, 65, 82, 25,133, 89, 28, 20,222,251,165,168,153,179, 22,164, 96, 19,235,
-157, 82,138,118,215,146, 18, 4,159,136, 5, 9,198, 33,131, 86,188, 58,190, 38,165, 72, 74, 18,203, 75, 17,101,248, 76,105, 76,
- 49,131, 42, 50,218, 46,165, 98, 84, 69,159, 99,180,133, 34,227,226, 57,233,165, 40, 69, 86,133, 56,174, 63,235,124, 88,207,244,
-187, 92, 87, 67,203,250, 93, 43,172,149,207,191,155,215,181, 37, 85,150,127, 66, 18,235,231,155,143, 38,164,128,177, 6, 40,162,
- 11,169, 84, 69, 83,113,198,170, 64,240,147,172, 14,180, 20, 39,251,174, 37,138,173,128, 28,227,178,106,117, 86,160, 48, 89,105,
- 6, 31, 73,254, 84,225, 64,158,227,161, 35,133, 72,219, 25, 92, 99,101, 29,102, 13,251,198,113,214,133, 87, 55,123,110,246, 29,
-135,125,199,253,135,119,184,183,154, 63,248, 79,255,145,254,235, 95, 99, 95,223, 96,142,175, 81, 71,199,112,119,150, 68, 52, 99,
- 9, 15, 35,167,135,137,119, 31, 78,124,253,237, 29, 33, 57, 66,204, 4, 45,244,183, 98, 45, 56,199, 99, 28, 57,189,255,192,237,
-232, 25,207, 61,196,140,228,163,137,138, 63,133, 26, 58, 99,101,140,158, 41, 4,185, 81, 44, 45,173, 46, 96,114, 66,151, 34,171,
- 79, 50, 86,120, 59,171, 21,214, 88,148,107, 56,188,122,139,230, 81,206, 46,171, 41, 86,161, 92, 83,213,239,179,146,252, 25,236,
-233,143, 97,185,231, 92,150,228,174,151, 60,192,215,138,249,167,170,228,109,101,171,158, 32, 75,179, 2,157,245,114,169,148, 79,
-168,205,185, 98, 14, 95,103,149, 47,148,182, 45,159,189, 54,253,139,178,117,211,237,102,181,138,230, 22, 64,204,156,179, 62,239,
-205,245, 38, 40,166, 42,190,173,169,153,234,179, 18, 19, 85, 5, 35,129,108, 45, 49, 78,140,179, 10,184, 86,161,206, 24, 90,215,
- 74, 55,102, 91,178, 58, 51,157,206,228,243, 64,215, 56,218,125,203,171,227, 1,239, 71,198, 20, 25,235, 8,142, 92, 3, 70,140,
- 89,172, 40, 51, 90,244,147, 7,228,124,248,149,205, 72,121,246,170,111,124,230, 90, 75,149, 89, 10,151, 1, 13,139, 77,237,210,
-195,126,205,198,127,113, 7,254, 35,188,254,101,129,237, 60, 93, 35, 60, 41,218,102,235,206, 21,141,224, 7,128,123,207,236,250,
-213,211,108,129,139,107,184, 92, 60, 55,165, 86, 15, 66,170,161, 27,186,226, 71,231,105,207,236, 66,180,214,113,188,121, 45, 62,
-232,250,181,130, 83, 21, 76,171,115,178,251,253,240,225,142, 97, 12,245, 48, 21,109,132,173,100, 54,235, 28, 15,167, 71,130,247,
- 40,173, 8,100,218,174, 99,240,158,144,100,183,170,148, 33, 27,205, 88,119,120,147,207,180,187, 29,170, 36, 17,131,101, 65,168,
-206, 33, 25, 74,107,186,166, 89, 14,239, 82, 18,211, 52, 96,172, 33, 6,191,248,173,115, 41,236,187, 29,195, 48,224,140, 69,187,
- 26, 64, 81, 15,232, 69,181, 92, 68,232,180,219,237,152,166,137,113,156,112, 78,138,141,152, 60, 90,107,186,174,163,177, 59, 98,
-140,130,167, 53,178,162,200, 5,246,109, 75,163, 11,186, 36,206,143,143, 52,214,176, 55,210, 69, 91, 45, 49,150,165, 36,188, 31,
- 73, 49,145, 17,223,178,115, 86,254,217, 8,113,108,244,146,164, 54,142,190,142,248, 71,172,107, 37,168,165,192, 56, 12,180,109,
-203,193, 53,226, 68,168, 66,212,133,219, 95, 69,151,185, 58, 24,230,194, 89, 27,187, 16,216,230, 59,199,156,237,190,220, 63, 55,
-247,152,249,207,140, 17, 21,185,248,213, 51,214,238, 41,133,165,176,153,215, 18, 33, 70,114,202,180,251,189,188, 62,245,241,135,
- 97, 88,236, 59,199,227,129,113, 28,153,242, 4, 90, 38, 51,169,200,202,209,199, 36,227,106,192,230, 25,230,146, 36,137,179,210,
-232,178, 18,158,206,108,169, 53, 21,215,187,124,206, 42, 81,178,168, 25, 94, 85,150,140,249, 84, 71,253,177,136,102, 68,107,197,
- 84,243,217,141,145,241,123,140,178,170,211,198,202,247,137, 81,130,131, 54,241,200, 57, 38,156,169, 14,161, 2,157,182,114,136,
-251, 72, 9, 18,244,147,149,150,195, 95, 67, 68,145,178, 38,166, 44,118, 74, 50, 93,215,240,246,245, 13,175,143,123,108,201, 88,
-109, 5,158,164, 90, 94,189, 58,114,187,111,137,121,226,205,155, 27, 94, 29,246,236,187, 29,159,255,222, 27,254,217,127,250, 31,
-185,251,187, 95,162,140,229,245, 63,253,138,111,254,223,191,228,203,223,255, 93,126,245,127,254, 95,232, 8,106, 10,220,191,191,
-231, 55,239, 31,248,219,111,223,243,224, 19, 33, 1, 88,112, 45,177, 82,206,252,224, 73, 64, 28, 60,231,241, 1, 93, 32,142,158,
- 70, 59,140,201, 53,132,107,109, 90, 83, 73, 20,165,176, 74,236,158,121,131, 5, 87,202, 84,253,129, 76,120, 76, 93,207,196,148,
-153,107,195, 16, 51,187,253, 13,227,199, 59,124,136, 24,103,208,173, 21,193,221, 34,184, 42, 63,188, 7,127,121,223,190,118,102,
-215,118,162,231,124,237,159,178,129, 61,247,152, 89,205,148,184, 79,175, 10, 94,210, 1,204, 23,233,124,209, 92,112,194,244, 60,
- 26, 95,133, 84,165,212, 15,181,210,181, 68,186, 12, 29,201,245, 13, 81,117,212, 5,114,200,207, 17,129,170,230, 4,139,189,172,
- 44,144,138, 82,102,250, 84, 98, 26, 7, 66, 72,104,213,215, 61,158, 90,222,192,174,233,100, 47,234, 20, 24, 75,112,150,201,143,
- 12,211,128, 77,147,120,116,155,134, 93, 49,152,156, 9, 33,203, 46, 55, 9,199,122,157,124,148, 39, 2,198,151,118,234,229,210,
-189, 37,171, 15,163, 37, 75, 93,203, 49,173,183,240, 25,173, 95,164,177, 61,247, 56,243, 14,252, 31,147, 27,240,210,200,253,217,
-159,133,151,189,138,159,154, 4, 60, 41, 50,127,196,243,219,254,221,242,194, 68,202, 88, 81,180, 6,239,235,123,235,232,186, 6,
-148,136,217,230,104,209, 20, 34,187, 58,150,206, 57,243,253,251, 59,198,209, 75, 7, 87,196,154, 40,152, 81,185,126,134,105, 98,
-127, 56,224,167,137,174,107, 48,104, 30,238, 31,104,173,133,144,228,235,180, 8,115,114, 85,251,230, 92,152,198, 81,198,202, 90,
-232, 96,206, 89,116, 13,143,208, 37,147, 83,148,157,170,209,128,112,212,167,193,211,184, 70,214, 4, 53, 68, 38,214,220,117,225,
-214,155,133,227, 30,230,120, 80, 86, 43,217,252,103, 34, 54, 20,250,158,181, 70,242,173,141,162,239,207,164, 24, 37,168,168, 70,
-139, 30,111,110,240,227,192,255,207,218,155,245, 88,150,157,233,121,207,183,166,189,207, 16, 57,212,192,170, 34,217,236,185, 37,
- 53,108,217, 87,210,157, 33,223,248,255, 10, 16, 4, 24,144,124, 97, 67,144,100,192,118, 11,205,238, 38,187, 73, 22,201,154,178,
- 42, 43, 43, 51, 99, 56,103,239, 53,250,226, 91,123,159,115, 34, 35,179,170, 27, 34, 81,168,202, 41, 50,226,196, 62,107,125,195,
-251, 62,111,174, 77,207, 79, 99,217,141, 35,227,224,105, 45, 83,115,226,238,168,133, 65,176,142,216, 20, 33,155,146,126,205, 34,
- 16,167,194,113,154,104,162,254,250, 82,155,162,119,173,229, 56,117,200,140, 83,161, 94, 78,133, 90,163,126,174, 86,249,244,231,
-192, 37, 67,215,230,116, 85,246,105, 80, 88, 47,163, 35,206,118,233,244,169,253,178, 90, 92,109,182, 75, 22,106,143,223, 77, 73,
-217, 5, 49,230, 30, 6,163,207,214,118,187, 99, 58, 30,153, 15, 71,172,181,108, 6, 77,114, 59, 30,142,171,112,116,154, 38, 74,
-171, 88,103, 41,173, 49, 4, 79,237,232, 95,245,208, 55, 76,133,178,144, 54, 91, 82,215, 64,107,148,220,150,116, 84,125,142,115,
-198, 59,189,216, 91, 23, 6,158,107,105,114, 81, 92,174,102, 88,180,181,144, 45,181,246,149, 75,211,179,122, 65,171,138,158,217,
-206,133,110,135, 83,125,137,233,235, 78,239, 92, 95, 79,218, 83,118,131,208, 1, 62,134,105,154, 21,183,220, 20, 96,145,155, 90,
-115, 75,171, 61,158,183, 50, 12,142,253,118,199,213,224,216, 59, 67,160,178,223, 12, 61,207, 65, 51, 8,106,203,236,158,190, 15,
-190, 98,130,101, 55, 14,108, 71,207,163, 39, 79,248,246,215,191, 6,147,121,255, 47,254,146,111,255,230,111,121,255, 95,252, 41,
- 55, 63,255, 20,139,134,184,212,155,153, 87,207, 95,243,226,118,226, 88, 44,206, 5, 36,120, 68, 28, 38,120,142,181,119,212,147,
- 96, 91,165,196,130, 51,129, 41, 38,112, 3, 55,113,102,172,130, 51,173,199, 18, 55,189,208,151,169,242,178,192, 17, 33,181, 70,
- 2, 77,130,235, 80,160, 98, 44,121,217,174,116,176,143, 17,131,183,134,151,223,125,199,163, 16, 24, 55, 35,206,219,222,149,134,
-179,157,186,180,183, 10, 63, 30,186,156,127, 72, 1,176,140,150,190,143,184,246,174,238,173,222,163,213,138,105,103, 56,212,246,
-224,231,248,182,241,238,234,169,238,137,104, 39,197,244,201, 71,189,254,248, 98,180, 86, 79,221,214, 50,153, 53,172,162,183, 19,
- 76,165, 41,172,160, 87,235,214,117, 21,186, 52, 90,143,211, 91, 62,143,156,213, 95,168, 85,217, 2,119,209, 52,174, 60, 31,153,
-172,215, 44, 95,163,213,126, 73, 51,180,138, 77,125,220, 94, 22, 69, 48, 56, 67,143,137, 61, 75, 74,235,187,206, 38,237,123, 95,
-127,185,231, 6,120,219,183, 88, 68, 35, 58, 87, 96, 14,178,126,127,238,173,241, 31,204, 50,127,107,119,253,131, 9,176,141,115,
-109,220,101,199,222,222,218,136,159,251,215, 31,186,180,229,109, 23,245, 59, 69,161,167,181, 85,123,151,137,179,106,199,158,179,
-142,224,141,133, 16, 60,198,193, 28, 39, 74, 49, 12, 33,232, 52, 7, 77,217,170, 61,195, 59,165, 76,206, 89, 49,152,131, 61,237,
-187, 91, 91, 59,251, 48, 14,236,247, 59,190,253,230, 57, 62,120, 36,235,115,235,189, 35,181, 74,108,149, 57, 39, 90, 21, 66,216,
-146,139,162,107, 83,141, 29,142,163, 74,228,165, 24,148,190, 63,175, 61,113, 14,192,123,183,250,145,107,107,228, 24,149,211, 94,
- 10, 85, 26, 53,170,198,165, 94,168,205, 79,147, 48, 89,163, 78,117,207, 45, 6,124,119, 83,140,131,103, 51, 14,196, 41,145, 83,
- 82, 54,124,255,181,101,175, 31,198,145,205,224, 25,188,211,213, 20, 22, 35, 22,164, 80,114, 35, 38,157, 58,148, 82,152,230, 68,
- 46,112, 55,233,136, 91,140,101, 78, 73,149,213, 29,177,218, 74,165, 26,253,113,154, 38,196,154,213,233, 97,172, 91, 61,222,149,
- 83,202,155,142,227,101,213, 2, 53,121,211, 73,163, 83,174,179,175, 89,122, 44,106, 47, 14, 26, 93,220,217,227, 65,143,211, 97,
-237,224,230, 57,174,221,250, 50, 97, 84, 54, 69, 89, 95, 11, 13, 95,209,232,214,156,149,240, 86, 74,195, 6, 79,174, 89, 69,105,
- 41,227,188,235, 83, 58,200, 49,246,207, 87,131,124, 74, 65, 47,140,110, 33, 52,162, 60, 2,233, 78,134, 41, 38,172, 61,185,160,
-172, 57,179,224, 74,235,107, 21,157, 22,149,156,245,210,238, 34,198, 86, 27, 46,168,229, 76,147,254,212, 71,221, 90,237, 96, 41,
- 57,203, 95,175,250,251,154,206,156, 23, 92,176, 49,134,148, 34,213,232, 69,151,107,111, 76,218,146,128,168, 5,196, 56, 4,182,
-227, 64,176,194,198,130, 47,137, 80, 65,178, 96, 90,192, 25,248,217, 39, 31, 49,221,188, 64,164,224, 6,193, 22,131,219, 58,118,
- 87, 35,193, 90, 14, 95, 62, 35,108, 62,228, 71,255,250, 95,114,248,226, 51,118, 31,188,135, 9, 6,191, 55, 76,166, 81,110,143,
- 28,142,145,103,223, 92,243,213,235, 3,183, 51,196, 2, 81, 50, 98, 42,182, 85,170, 53,164,168, 19,149,221,110,207,110,187,229,
-230,230,182, 23,110, 6,235,131,186, 23,154,144, 99,193, 58,213, 72, 44,162,203,214, 22, 52,184, 33,182,194,177, 23, 70,222,168,
-181, 53,150,202, 92, 84, 80, 87,251,235, 87, 75,130,154,121,245,221, 11,254,232,147,189,146, 6,141,129,230,168,243, 25, 38,246,
-135, 66, 96,238,131, 73,218, 61,250,218, 27,168,217, 31, 0,178,185, 56, 48,207, 14,196, 42,239,234,146, 56, 67, 32,242, 86,202,
-221, 15,230,223,200, 9,137,122, 34,211, 40, 89,203,156,109,219,181,140, 86, 43, 77,235,254,244,101, 55,101,209,111,134,119, 90,
-209,121,175, 15,120,138,179,118, 34,157, 41, 93, 75, 65,140,122,153,131,119,120,231,181, 41,110, 25, 67,195,178,164,184, 85,173,
-126,107, 5, 84,233,155, 74, 81,124, 38,234,105,174, 20,173, 90,171,118, 94,173, 84, 16,223, 9,110, 6, 19,204, 69,206,248,219,
- 96,254,114, 15,167,183,238,226, 47,110,250, 19, 11,192,180, 69,177,219,163, 2,215, 11,241, 28, 91,219,222, 16,183,253, 83, 59,
-117,145, 55, 59,240, 5,255,122,201,136,145,119,142,214,219, 3, 95,239, 67,107,161,239, 19,135, 74,231, 88,191, 91, 36,175,207,
-143,117, 11, 26,182, 48,134,128, 15,142, 84, 98,183, 16,121,157,254, 84, 29, 37,111, 54, 86, 15,102,231, 58,201,207, 50,142,158,
-224,195,154, 80, 54, 71,141,105,173, 52,188,245,188,186,190,166, 9,164, 90, 52, 87,189,154,149,127, 47,214,226,197,146, 83,101,
-158, 38,156,119,170,100, 94,132,165,165,232,231,104,124,255, 53, 85, 25,235,136, 24,194,232,217,237,118,188,126,125,163,222,234,
-222, 49,148,154,251,170,167,173,148, 58,122,103,119,126,153,159, 63, 7, 58,182, 85,197, 74, 74, 17, 99,233, 76,115,215, 67,110,
- 2, 99, 48, 12,219, 29,223,188,122,221,109,172, 10, 79,178, 34, 12, 33, 16,211, 4, 69, 83,185, 82,170,164, 92,180, 91,173,149,
-134, 37,197,130, 56,143,193,145, 19, 88,103,176,226, 41, 77,216,108,183,228, 90,153,227, 76, 42, 17, 63,248,174, 32,175, 61,214,
- 91, 47, 14,237, 80,245, 89,177, 86, 45,109,173, 46,233, 99,122,249,183, 94,201, 63, 68,162, 60,105, 85,116, 92,220,218,242,252,
- 26,134, 97,160,212, 76,173,185,143,234,181,176,223,237,118,220,222, 30,214,226, 25, 78, 5,210,102, 19, 58, 95, 95,139,196,152,
- 35,214, 90, 21, 75,206, 26,139,235, 67,231, 90,244,177,116,142, 71, 21, 24, 90, 75, 79,251,165,164, 74,179, 70, 47, 13, 55,156,
-248,240,232,153,101,172, 70,148, 26, 49,228, 14, 65,178, 34,212,154,213,174, 25,156, 38,193,233,252,185, 19,221, 52, 12,165,164,
-168, 54,193,166,171, 36,231,140, 66,105, 68,144,142, 17,182, 86,109,115, 53,165, 85, 9, 84,123, 67,228,122, 94, 64, 45,133, 68,
-237,192, 28,167,103, 93,167,231,121,103, 25, 54, 65, 39, 90, 22, 6, 35,132,150,217,136, 96, 91,193,101, 52,229,175, 68, 66,181,
-236,131,229,233,135,239,211,218, 12,174, 48, 62,222, 96,131,225,201,135,143, 56, 94, 31,216,252,236, 35,126,244,175,255, 37,183,
-223,189, 32,123,207,163,199,143,185,125,254,156,221,143, 63, 70,156,225,155,231, 47,184,187,153,249,250,250,142, 47,110, 15,220,
- 52,141,164,101, 55, 16,134, 64, 44, 9, 83, 18,146, 19,173, 85, 94,223,190, 82,184, 1, 58,228,204, 49,169,101,213, 40, 89, 82,
-125,194,170, 83,210,132,205,178,222, 97,138, 99, 54,204,165, 82, 69, 72,221,185,149, 27,164,210,104, 29, 53,141,129, 31,253,232,
-131,142, 76,214,194,222,249,110, 28, 44,134,103,191,255, 22,167, 21,195,217,200,100, 57,132,151,159, 59, 31,117, 55, 89,149,224,
- 75, 42,151, 60,184,111,228,141, 93,246, 63,234, 98, 63, 79, 34,107,231, 36,180,122,233,131, 91, 47, 63,222,248,187,223,246,247,
- 20,234, 41,197,237,141,207,105,249,122,212,211,187,136,231, 26, 26,105, 40,103,145,167,205, 44,185,235,221,135,137, 48, 88,203,
-198,123,198,193,147, 91,101,158,143, 28,167, 89, 35, 26,139, 42, 66,173, 49,108,134, 13,155,237,142,113,220, 49,132,160, 86,154,
-146,145,146, 48,181, 96, 23,209, 94, 7,187,148, 90,152,147,138, 66,230, 90, 41, 82, 41, 13, 74, 19,172,243, 24,235,200, 41,246,
-194,161, 34, 81,244,224, 49, 5, 91, 5, 59,168,144,175,180,170, 19,134,174,192, 95,161,183,114, 1, 36, 56, 19,238, 55,205,102,
-175, 13,204, 18, 18, 81,250, 67,105,168,125,188,111,164, 93, 82,237,228,161,239,249,233, 98, 94,202, 55,189,148,101,221, 67, 66,
-187,215, 85,179,250,222,233,129,162,242,208,133,125, 95,157,222,228, 1,146, 76,189,216,149,223, 95, 30,189,113,177,191, 33,142,
-188,252,175, 38,111,186, 12,206,182,239,171,114,117, 21,161, 90, 81, 43,146, 87, 90,220, 24, 6, 74,243,196,216, 83,215,150, 30,
-176,169, 61,171,228,196, 56, 14,216,172,207,140,247,161,251,222, 61,211, 60,147,211, 12,198,112,156,103,142,243,196,214,121,172,
- 46, 70,241,214,145,110, 39,164,130, 56,171,113,174, 52,252,232,245,251, 83,192, 25,141, 19,213,253,167, 34,133, 77,183, 60,145,
- 42, 67,131, 97, 12,188,247,163,167,216,209, 50,205, 55, 28,103,104, 29,214, 37, 98,206, 22, 29, 13,235, 13, 53, 42, 8,102,161,
-128,213, 90,123,200,166,118,169,206,106, 7,153,122,102,123,138,133,217, 22, 68, 60,214, 5, 85,106, 87,184,190,185,165,166, 72,
- 8,150,150, 35,185, 53,170, 8,243,156,116,146, 17, 51,113, 78,204,169, 49,199,168,217,219,198, 81,138,250,201,155,148,245,251,
- 35, 86,104, 89,185,224,199,195,129,113,179,193, 25, 75, 69,125,234,214, 40, 98,119,138,113,141,245,213,132,189,210,149,225,101,
-213,207,128,190,239,107, 43,235,247,181,118,246, 64, 93,159, 91,115, 66, 26,117, 11,171, 22, 55, 61,100, 70, 42,185,230, 53, 67,
-188,244, 34,125,154,110, 88,114, 1, 22,135, 67, 74,145,214,191, 54, 63, 56,114, 74,171,152, 81, 3,112,238, 58,138,214, 96,155,
- 65,172, 80,115,239,230, 93,192, 45,161, 65, 69,161, 66,130, 48,110,134, 53,255, 92,133,187, 14, 35, 66, 78,185, 23,119,134, 86,
-122,247, 93, 27,133,130,179,157, 6, 88, 33,149, 46, 38, 68,213,239, 58, 13, 49, 56,134,142,174,214, 53, 74,156,115, 71,193,106,
-131, 17,172,165,148,172, 90,191,166,158,236, 34, 96,189, 35, 21, 21, 3,182,170,250,142, 82, 53,189,173, 74,211,247,141, 17, 70,
- 31, 8,222, 51,120,131, 19,195, 96,244, 34, 55, 77,181, 86,206, 26,156,113, 4,231, 9,214,192, 60,177, 29, 71,220, 80, 24,124,
-164, 57,176,143,246,132,221, 35,222, 43, 71, 94,186,198,211,127,246, 71, 76,243,196,225,213,107, 62,248,243, 63,227,249,239, 63,
-229,189,167, 79,184,251,197,231,140,126,207, 47,126,245,140,111,190,187,227,235,151, 7,142, 71, 13, 80, 33, 88, 82,205,164, 73,
- 19, 10,155,104,164, 43,198,173,176,161,249,112,196, 25,183,130,164, 84,225,159,113, 98,250,253,217, 29, 23, 61, 27, 94,204, 50,
-233,213, 51, 85, 35, 89,187,165,181, 83, 82,109,169, 20, 17,146,129, 79,254,224, 39,252,246,215,191,194, 53, 29,213,235,250,207,
-129,108,249,244,231,255,128, 83, 63,115,125, 99,188,190,142,163,219,219,135,139,242, 61,163,247,119, 9,231,126, 40,122,246, 33,
-160,204, 67,106,232,119,141,223,239,143, 96,223,102,229, 90,238, 52,211,204, 89,231,121, 70, 98,235, 59,118, 49, 74,192,162,123,
-228,173,177, 4,107,216, 14, 58,246,153,231, 35,135, 52,113, 60,196,158,141,237, 24,194,192,126,187, 99, 55,140, 92,109,183,140,
-227, 6,235,134, 62,230, 40,212, 20,169,181,173,157, 60,173,208,233, 16, 26,149,105, 12,197, 10, 41, 47,140,117,165, 29,209,211,
-172,140,117, 24,167, 7, 68,201, 69,189,208,162,192,130, 92, 11, 46, 56, 21,245,181, 14,135, 49, 58,198,212, 58,109, 25, 21,158,
-232,112,235,172, 98,137,152,236,224,144, 85,128,216,116, 50,113, 10,151,233,105,110, 92, 70,217,222, 79, 87, 89,186,175,245,207,
- 93,252,150,251,118, 32,121,243,110,126, 0, 11,251,230,115,210, 30,152,197,156,121,210,219, 9,121,251,131,158,187,183,205, 52,
-228,173,115,159,206, 46,232,194,185, 5,158,225,180,152,210, 75,218, 17,239, 14,196, 57,146, 98,194,121,181, 92,169, 98, 93, 95,
-207,171,171, 43,238, 14, 7,253,179,125,108, 27, 99, 84,242,212, 2,171, 17,195,163,171,199,140, 70, 11,195,148, 34,187,253, 21,
- 83, 21,110,174,111, 41, 89, 21,182,202, 86, 55,196,213, 7,141, 94,118, 70, 89,219,214,233,161, 91,115, 97, 48,194,198, 7,130,
-179,152,154,241,214,242,248,241,142,155,219, 9,234,146,192,169, 5,128,181,167,228, 63,231, 23,164, 39,125,140,110, 78, 23,200,
- 66, 9, 52, 66,206, 42, 98, 27,134,129,199,143, 31, 99,140,225,238,238,150,155,219, 91, 82,204,218, 57, 6,191,146,206,106, 47,
-233, 14,135, 25, 83, 27,241, 48,235,184, 90, 58,181,207,185, 94,104, 42, 62, 52, 47,162, 53, 52,152,198, 57,219,137, 94, 74, 91,
-203,165,224, 71, 79, 42,234,149, 15,189,163, 29,135, 13,133,198,225,120,236, 97, 49,181, 3,115,219,218,165, 91,107,145, 37, 5,
-237,172,176, 89, 92, 64, 70,236,122,118, 46,161, 28,230,140,133, 94, 74, 23,195,181,174,140,174,234, 36, 89,108,127, 75,104,203,
- 52, 77, 93, 67,161,123,115,205, 12,112, 43, 95, 94,187,230, 29, 55, 55,183, 43, 96,170,244, 11,221, 24,189,224,148, 7,160,221,
-162,174,165,117,162,162, 25, 22,141, 84,244,235,243,214,209,164,145, 82,102,191,221, 18,227,172,251, 95,192,121,191, 58, 93,156,
- 83,182,187,235, 40, 96, 37,236, 25,156, 49,148,190,163, 87,130,155,218,180, 92,215, 88,184,190, 15,175,247, 28, 77,181, 86,108,
- 81,159, 61, 73,117, 28,182, 53,188, 31,212,175, 29, 44,222,153, 14, 3,171, 12,214,226,164,170,253,203, 6,181, 21,118,112, 81,
-109,130,119, 14,111, 13,155,224,105, 37,113,123, 56,176, 51,142,159,253,241, 39,180,141,101,248,201,143,176,227, 35,134,249,192,
-123, 41,227,114,229,229,103,159,243,254,159,253, 49,204,145,157,243,152, 87,183,140,135,204,179,111,174,249,221, 55, 55,220,205,
-194,161,168, 29,181, 89,143, 25,148, 47,143, 64, 73, 25, 51, 14, 24,227, 53,123, 96,154, 86,191, 77,234,232, 92, 99, 44, 82,187,
-252,186,235, 73, 26,166,167,206, 73,135, 81,169,224,240,212, 96,235, 61,163, 54,237,218,125,109, 58, 25,217,140, 3,127,249,103,
-127,206, 95,255,199,255,200,199, 64, 8, 14, 27, 60,205, 91,104,133,195, 87, 95,222, 75,105, 59, 83,244,174, 81,149,111,153,205,
-203, 89, 12,227,249, 33,250,125,118,164,127,202,255, 30, 2,145, 60,228,109,190, 63, 29,248, 62,241,214, 59,126,227,217, 13, 34,
-171,117,105,189, 0,170, 42,172,157, 8, 78, 26,206, 20,130, 55,164, 60,113, 59, 31, 59, 69,171, 34, 98,216,110,118, 42,228,216,
-238,217,141, 27,130,115,140, 62, 80,209,234, 88,153,212,141, 56,207, 76,199, 59,226,116,160,214,220, 5,119,170,190, 53, 70,247,
-119,185, 22, 90,110, 43,173, 74, 90,211,253, 74, 23, 82, 57, 52, 87,121,177, 37,150,238, 65, 77,210, 24, 69,247,151,118,129,240,
- 45,236,120, 49,125, 15,184, 44,228,213,250, 82, 22,126,251, 26,221, 40,103,195,247,123,112, 23,228,108,202, 33,107,175,122,234,
-100,219, 3, 89,238,237,158, 21,168,173, 2,156,115, 95,252,229,253,217,222,196, 13, 63,248,188,180,119,236,147,100, 45, 78,254,
-113,151,249,247, 60, 79,103, 9,114,210, 78,217,214,231,202,121,105,167,215,231,120, 60,118, 47,117,233,204,130, 19, 95,187,181,
- 74,232, 40, 79,239,221,170, 72,182,214,210,234,164,209,166, 57, 51,134, 1,235,189,190,255, 98,194,134,192,147,247,158, 32,185,
-112,245,222, 35, 74,205, 76, 57, 43,125, 77,132,146, 83, 79,206, 90,114,175,165,147,199,212,126,105, 74,195,117, 8,213,124,156,
-240,118,195,241, 56, 19,182, 35, 87,219, 61, 33,188,102,238, 59,241,218,237, 53, 86, 84,200,100, 68,112, 65, 24, 54,158, 15,127,
-244, 17, 47, 94,124,199,235, 87,175,117, 42,212,167,128,203,138, 97, 24, 6,198,113,195,213,213, 21,222,123,174,111,110,136, 41,
-129,209,252,235,148, 75, 87,195, 71,182,206,232,232,187, 8,121,202,204,135,163,186, 43,108, 80,145, 23, 39, 34, 31,168, 8, 78,
-196, 32, 85, 95,233,121,142,248, 16, 24, 55, 27, 90,131,227,113, 34, 4,175,115, 31, 35,152,102,201, 41, 51,132,192, 52,207,132,
-113,196,117,189,192,210, 57, 25,163,153,222,244,172,120, 99,141,162, 98,123,116,176, 65,131, 74,106, 83, 59, 99,206, 89,215, 35,
- 85,241,191,138,123,214,142,223,244,247, 84, 24, 71, 98,236, 28,249,123,231,210, 18,252, 98, 59, 47,192,117,146,228,221,221, 93,
-167, 56, 10, 47, 95,190, 84,161,161, 83, 37,125, 41,218,225,135, 16, 16, 3,165,196, 53, 40, 39,151,132,239,214,195, 82,203,250,
- 44, 45,239, 40, 99, 13, 20, 97, 24,135,174,158,215,184,211, 37, 6,122, 41,194,115,202,122,137, 24,213,214, 44,137,127, 98, 12,
- 37,118, 40,209,116, 84, 71,133, 49,125, 39, 94,169,198, 80,227,172, 84,180, 14,250, 89,195,165, 68, 8,131, 39, 56,207,102, 28,
-117,173, 96, 45, 70,105, 3,218, 52,137,129,106,176,173, 66, 74,104,253, 58, 43, 9,207, 26, 6,107,241, 29,122, 99,164, 50, 6,
- 11,110,224,238,112,205,143,255,228,159, 97,158, 62,194,254,248, 9,238,199,159,128,217,225,226, 68,121,241, 29, 55,127,247, 43,
-158,252,229,207,144, 82,152, 62,251,138,253,184, 39,127,241, 53,183, 95,189,230,110,106, 60,187,155, 41,197,112, 59, 39,138,177,
-164, 86,144, 12,214,219, 14,100, 50,228,152, 9,195,134,216, 42,136, 37,166,121,229,151, 72, 7, 43,169,254,164,246, 53,238,137,
-145,177,130, 80,251,138, 85,141,207,221,237,181, 20,133,125,170,152, 59, 33,240, 95,253,143,255, 19,207,126,245, 27,236, 60, 49,
-238, 44,195,110, 64,130, 3,235,120,254,229, 51,230,111, 95,156, 93,234, 15, 53, 36,157, 30,246, 80,215,116,121, 65,190,153, 45,
-254,238,136,203,127,250,229,126,255,239,184, 63, 17,248,190,139,251,251,246,252,230,109, 29,126, 23,147,152,238, 5,245,198, 50,
-120,139,247,234,116,159,230, 35,199,227,113, 69,192,110,198, 13,143,175, 30,243,120,127,197, 54,108,240,189, 61,202,113,230,102,
- 58, 82, 16, 82,209,192,131, 41,206, 28, 14,183,212,154,201, 57, 98, 68,171,220,209, 7,156,104, 55, 45, 70, 83,140, 68, 26,174,
- 53,189,140,187,247,183,168, 25,146,234,108, 79,112,202, 93,140,151,213,199, 94,161,206,137, 92,213,242,230,156, 30, 82, 77,212,
-166,118, 46,223,149, 51,202,158,172,137,121,230,108,132, 94, 47,174,217, 21,229,122, 1,150, 63, 93,170,114,206, 33, 48,231,169,
- 58,247, 25, 5,178, 42, 66,223,128,222,252,163,158,145,118, 26,181,191, 57,172,231,191,239,255,206, 87, 14,103,163,214,158, 40,
-103, 67,232, 29,146,156, 44, 79,221,219, 61, 77,115, 23,161,133,254, 76,170, 64, 44,132,129,227,241,176, 10,225,134, 16,122,151,
- 14,119,183,119,136, 24, 82, 74, 58,233, 49,174,163,131, 43, 12, 70,211,222, 40, 92, 61,222, 99, 83,101, 48,134, 47,191,252,146,
-218, 45,161, 21,112,219, 45,211, 52, 35, 6, 92,167,131,233,161,146, 9,126, 64, 28,180,162, 23,234,221,225, 72,160, 82,234, 43,
-174, 62,120,202,251,239, 63,229,235,103,223, 17, 99,233,248, 93,179,118,176,181, 65,174,133,199,143,118,252,155,255,245,127,225,
-231,127,253, 55,252,213, 95,253, 55, 37,204, 33, 56,175, 0,153,134,176,219,237,200,165,112,125,125,173, 92,250,121,166,161,216,
-208,148, 35,222, 47,153,231,234, 74, 73,177,112,157,110,105, 41, 19,220,128,115,150, 57, 70,221,185,146,181,120, 21, 13,101,201,
-165,116, 81,152, 16,134, 64, 41,147,122,129,123,158,123, 19,200,237,244,204, 27, 49,228,146,137,243,140, 21, 97,186, 59,104,145,
- 99,100, 5,214, 24, 99,244,239,243,189, 83, 94, 10, 34,236,218, 76,180, 90, 58,155,220,144,179,186, 12, 88,114, 15, 90, 61,197,
- 62,208,214,191, 55,116, 62,127, 74,186, 54,139, 81, 59,235, 97, 24, 86, 47,123, 8,129, 97, 8,220,220,220,244, 75, 84, 59,188,
-113, 28,152,230,137,199, 87, 87,157,217,159,152,227,188, 90,206, 82,140,125, 47,109,240,214,118, 31,187,130,128,166, 60, 17,188,
-190, 22,206, 24,156,117,204,117, 34,230,204,102, 28,117, 77,178,216, 49, 57,101,109, 24, 99,212, 66, 25, 84,168, 39, 69, 5,146,
- 19, 16,134,113, 37, 18,182, 6,228, 66,236,118, 91,215,180,152, 48, 11,168,198,128, 15,129, 77,255,199, 91, 37,218,169, 20,180,
- 98,234, 98, 75,213,164,193, 97, 24, 59, 78,169,233, 4,167, 21,117, 82,244,241, 53,232,133,110,141,198,243,110, 70,207,221,124,
-199,135, 31, 60,225,233,143,222, 35, 63, 30,241,159,124, 4,126, 4, 25, 96,191, 35,150,200, 78, 60, 55,191,249,156,250,187,207,
-145, 40,124,245,155,159,179,243, 91,254,246,239,126,203,139,219,196,203, 67,164,137, 71,124,128, 18, 89,182, 83, 70,132, 97, 28,
-105,192,205,221,145,231,215,223,130,168, 6,198,186,208,249, 3,244,198,170,116,228,176,215,103,204, 40,147,100,201,126, 55, 52,
-172, 81,193, 35,166,158,173, 3,151, 41, 41,189, 88, 52,252,225, 39,159, 96, 14, 7,190,248,135, 95,242,196, 22,246,251,145, 97,
- 59, 16,182, 91,252,246, 9,191,254,207,255, 15,207,159, 61,215, 75,125,141, 28,111,114,209,172,182,251,233, 85,194, 15, 18,162,
-253,247,190,208,239,251,230,207,125,203,239,178,180,189, 77,244,244, 46, 32,138,116, 49,202,197,159,109,116,158,178,224,140, 97,
-244,202, 81,246,193, 81,146,250,136,227, 49, 34,205,225, 92, 96,191,219,243,222,227,199, 92,237,118,120,107,105,185, 50, 31,143,
-196,168,251,245,220, 10,169, 86,166, 92,152, 99, 36,119, 30,179,181, 6, 27, 28, 33,184,174,244, 53,189, 74,173,218, 77, 55,131,
-147,182,218,243,140,233, 44,248, 98,200, 93,124, 39, 70,171,231, 82,213,230, 70, 87,154,154, 86,186, 77, 35,105,160, 66,243, 72,
-247,252,170,218, 95,139,149, 42,231, 89,231,103, 23,214, 18,159,186, 8,176,214, 61,245, 61,245,119, 23, 96,157,103,143, 63, 60,
- 18,127,211, 75, 46,152, 55,132,110,247,229,147,231, 88,218,135,139, 51, 89, 35, 82, 47,252, 28,237,237, 66,186,135, 68,152, 15,
-138,159, 46,168,134,245,226,243, 58,161,128,245,245,171,181, 82, 98,214,157,104, 63,172, 68,132,176,221,104,134,119, 79,222,243,
- 65, 65, 50, 52, 85, 11,231, 53,165,173, 17,194,134, 6, 28, 14, 71,230,105, 38, 37,101,198,123,231,212,142,102, 28,173,100, 54,
- 99,192, 7, 79,173,133,113,115,165,129, 40, 24,118,143,119,236,228,199,124,250,249,151,196, 6,177,123,204,141,243,228,146,201,
- 85,243,178,107,201,235,238,210, 89,139,120, 75,173,142,121, 62,146,143, 19, 83, 74, 36,129,221,227, 39, 60,122,148,121,249,234,
-102,197,206,234, 80,203,210,170,144,114,229,229,119, 55,252,219,127,251,239,214,110,108,179, 25, 9,206, 99,196, 18,227,140, 49,
-158,121,154, 87,120, 77,237, 73, 90, 57, 87,114, 58,170,141,195, 41,255,221, 25,163, 89,217, 57,145, 81,124,242,224, 7,110,143,
- 7,140, 81,141,136,156,217, 65,157,243,186, 74,106,130,119,190, 23, 80,154, 40, 23,179,218,234,172,215,174,201,121,223,105,118,
-170, 72,223,110,119, 28,142, 7, 54,195,176, 94,226,186,231,173,136, 53, 58, 45, 43, 26,127, 91,187,112,111,177,181,154,174,142,
-119,206,247, 80, 22,229,153,167,152,112, 98, 21,186, 34,144, 75,198, 7,207, 28,147, 2,134,250, 25,102,173,233,163,246,182, 42,
-220,151,172,129,187,187, 91, 98,156, 72, 57,179,221,110,245,178, 15,150, 82,115, 79,199,203, 28, 15,199,213,134, 26,156,195,162,
-137,111,135,227, 1,138,234,111, 90,207, 52,111,165,226,141,226, 99,135,190,111,175, 89,167, 9, 62, 56,189,228,251,148, 33,166,
-164,171,189,222,220, 45,158,236, 84,106,143, 22,214,157,125,234,136, 97, 99,132, 92,162,114,222,251,247,196,216,158, 93, 96, 68,
- 69,162,206, 48, 4,215,173,136,202,136,175, 57,169, 5,216,138,158, 71,165,210,150, 21,227, 34,188,236,148,186, 92, 50,222,118,
-139,109,127,198, 74,202,212,158,144,168, 69,140, 99,187,223,243,241, 79, 63, 34,132, 74,221,239,177,219,247,105,198, 33,173, 82,
-167, 3, 30,197, 32,231,175, 95,147, 48, 28,239,224,179,223, 93,243,205,243,223,242,249,171, 27,158,191,142,220, 30, 10,195,118,
-160,166,138, 56,135, 51,130,247, 22,191, 9, 76,211,204,225, 56, 67,135, 72,165,164, 34,230, 5, 19,190,196,210,150, 82,176, 85,
-187,116,235, 60,173, 40, 35, 98, 9, 85, 98, 65,180,155, 78, 9,172,218,176,201,197, 26,187,177, 49, 66,185,185,230,139, 23,207,
-217,147,216, 14,150,237,222,241,232,233, 35, 54,219, 71,124,253,197, 11,254,223,191,250,123, 14, 73,250,165, 78,123, 99, 67,190,
- 94,146,103,167,220,170,212, 59,247,138, 47, 65, 32, 15,208,190, 30,182, 30,189,157, 42,246, 46, 84,232,187, 46,236,119,121,212,
-223, 86,124,156, 3, 22,228, 94, 22,251, 42, 37, 88,187,244,162,185,188,214, 48, 6,199,118,240,108, 67, 96, 74, 73,125,164,115,
-194,138,103, 51,108,216,239,174,184,218, 63,226,209,118,164,149,194,221,221, 13,105,142,196, 56, 19, 80,118, 68,226, 0, 0, 32,
- 0, 73, 68, 65, 84, 75, 38, 23,237, 44, 20,193,169,246,183, 77,112,120, 55,168,186,211,187,158,141,222, 86,200,205,185,144,237,
- 20, 41,171,228, 48,103,116, 87,222,138,142,201, 92, 15, 47, 17,175,248,217, 86, 11,148,204,224, 3,193, 91,229,140,231, 72,170,
-145,154, 10, 78, 6,130, 9, 93, 88,212,163, 44,215,212, 53,115,162,203,153,149,183,170,234,233,174,204,215,120,195, 94,252,173,
-236,247,243,189,124,187, 84,212,115,122, 92, 46, 85,233, 29, 55,202,217,154,101, 29,234,247,162,195, 60,164,221,184,188,244,197,
-156,196,156, 23,185,127,114, 38,192,123,147, 81,248,160,125,239,254, 37,127, 49, 21, 66, 71,170,231, 90,185,229, 32, 59, 1,138,
-234, 25, 86,151,213,214, 37,152, 30, 34,195, 26,223,169, 54, 69,237, 98,156, 15, 4,163, 57, 5,223,189,120,181, 50,225, 67, 8,
-253, 98, 87, 48,144,237, 43,149,237,102,208, 24,213,210,253,112,125,191, 88,142, 71,254,232,147,143,105,243,204, 87,223,189,228,
- 38,102,166, 76, 31,133,235,101, 74,171, 12,195,128,152,158,181,213, 45,111,214, 59,108,211,142,172, 53,184,125,125, 75, 76, 21,
- 31, 54,108,198, 13,183,135, 99, 23, 58,118,107, 99,210,117, 83, 77,141,219, 87,183, 56,111,248,224,189,247,113,198,242,234,213,
- 43,230,249,168, 86,185,126,200, 47,182, 60, 69,184,234,193,108,172,238, 81,115,204,248,126, 57,197,105, 34, 56,139, 67, 86,241,
-214, 16, 6,140, 53,196,121, 98, 51, 14, 76, 81, 57,246, 41,198,149,249, 48, 14, 10,146,177,198,144,147,170,176,231, 56, 97,189,
- 87,191,181,219,146, 75, 37,197,212,199,201,149,193,171,154, 60,117, 24,136,218,194, 4,219, 32, 88, 5,235,120,171,239,183, 20,
- 35, 88,139,233, 35,232,187,195,157, 34, 88,151,181,149, 17,154, 85,251,236, 24, 2, 83,156,180, 16, 40,122, 65,217,254,121,250,
-165,235,237,239,191, 97, 24,214,160, 36,211,233,147,126,112,248,234, 24,198, 64, 74,115,183,186,169, 37, 45, 37,253,126, 57, 99,
- 85,184, 85, 27,243, 60,209,156,142,173, 93,103, 11, 96,109,223,132, 41, 75,163,230, 76,233, 83,179, 57,206, 24,171, 52,209, 92,
-219,154,170,232,157, 70, 4, 59,107, 80,196,134, 96,131, 10,235, 90,183,194,149, 24,123, 56, 75,208,103, 39,232,247,212, 32,248,
-174,215, 8,110, 96,236, 65, 49, 99,112,138,123, 53,154, 29, 47, 43,184, 76, 71,208,185,159, 3,210,187,245,101, 98,208, 80, 63,
- 56, 61,228,132, 69,223,208,161, 55, 53,103,106, 11,180,190, 90,216,239,175, 40, 30,252, 7,123,204,135, 31,211,100,160,181,140,
- 76,215,212,151, 47,113,227,150,235,215, 55, 56,183,225,248,122,226,197,243, 35, 95, 62,159,248,230, 85,226,213, 12,207, 15, 19,
- 25, 65, 43, 59,253,199, 57, 65,134,142,210, 21, 52,149,237,152,176, 38,224,188,234, 10,114,201, 29,236,163, 4,201,101,106, 88,
-186, 31,223,152, 37,236, 71,117, 2,182, 55, 76,182,234,200,221,219,158, 34,105, 78,235,109, 35,194,216, 42,110, 58,176,177,176,
-113,194,110,239,217, 61,218,226,198, 17,241, 59,254,175,255,227, 63,243,217,183, 25, 92,192,233, 94, 94,119, 94,156, 71,170,222,
-155,195,171, 42,179,157,237,152, 23,255,229,101, 26,181, 57, 47, 0,206,196,105,230,236, 2,125,168,203,126,232,242,126,219,238,
-252,161, 95, 59, 31,191,127,223,184,254,161,143,119, 94, 24,156,191,240,250,101, 86,130,181,108,188,229,106, 24,216, 14, 30, 99,
-132,155,155, 73, 1, 50,214,179, 25,183, 92,109,175, 84,113, 41, 48, 29, 38,230,249,192,156,102, 82,214,177, 90,105,101,221,159,
-121,107, 48,152,206,241, 30,212, 11, 12, 72, 45,180,162,182,159,218,131,104, 22, 10, 84, 93, 45, 40,178, 18,238,140, 41,235, 3,
- 34, 93,189,186, 48,165,155, 21,245,223,118,133,190,105,141,193, 57, 6, 39,204,197,144, 74, 70, 98,196, 54,168, 98,176,185, 81,
- 49, 61,131,125,193, 69, 46,194, 58,211,109, 24,181, 95,174,167,228,186, 78, 13,185, 4,234,223, 7,178, 44,133, 73, 51,103,211,
- 22,185, 71,243, 59,187, 0, 91,123,131,234,118,238, 15,111,247,162,111,215,144,160,122,138, 91,149, 53, 58,150, 83,228,237, 25,
- 3,254,126, 91,126,177, 42, 88,215, 18,178,126,153,151,182,192,118,150,208, 38, 23,194,251, 53,194,215,200,197,248, 18,148, 10,
-181,204, 16,140,177, 23,110, 19,245, 36, 59,188,247,108, 54, 3, 95,126,249,165, 78,135, 22,193,212,172,124,108, 45, 41, 12,193,
- 5, 92,183, 24, 57, 31,244,245,170,149, 74, 37, 74, 98, 28, 3,135,195, 13,127,250,227,143,145, 20,121,118,125, 75, 48,142, 50,
- 37, 92,240,202, 58,232, 25,219,173,139, 62,189, 15,164,156,104, 98, 17,107, 24,253,134, 52,205, 24, 26,121,154,200,115,193,137,
-101,235, 29, 49,197,117,149,226,197, 98,157,103,179,221,168,158,212,194,213,110,199,179,103, 95,173, 12,114,141,250,204, 26,176,
-210, 69, 86, 10, 58, 41,140, 97, 80, 44,107,206, 61,156, 68,168, 49,225, 4, 28, 13, 39, 2, 37,227,125,192,136,213, 51, 36, 25,
-106, 74, 12,214,174, 57, 8, 85, 52,115, 30,151, 84,180,229, 7,140, 21, 98, 42,157,169,174, 15,219, 60,205, 10, 76,105, 13,111,
-245, 57, 9, 33,172, 23,156, 89,158,161, 14,131,176, 13,230,146,113, 75,212,112, 83, 11,159, 23,207, 20,103,182,195, 64, 41,133,
- 16,188,210,250, 98,210,247,177, 88,230,121, 34, 39,197,164,230, 78, 0,116,198,145,139, 98, 85,165, 95,206, 11,237,114,121, 38,
-150, 21,204, 28, 35,219,237,150,121,154, 86, 27,155, 49,134, 56,167,149,230,104,141, 78, 59,172,181,132, 97, 32,199,164,236, 11,
-163, 25,242,166,139,233,188,247, 74, 4,220,140,212, 90,152,167, 25, 55,216, 78, 10,236,128,174,218,167, 40, 85, 21,239,154, 79,
- 94, 48, 24,114,156,207,222,230,109,229,251,151,210, 86, 1,168,244,108,116,103,148, 5, 63, 56, 7, 45,247,181,165, 80,115, 63,
-171,122,208,209,226,197, 87,181,120, 91,167, 23,218, 56,104, 88,137, 69,186,134,161, 82,171,244,105, 64,235, 36, 59, 85,191, 67,
-165,180, 66,204,145,143, 54, 79, 9,251, 1,243,225, 19,216,238,145,102, 33,223,144,126,255, 91,234,171,215,184, 15,159, 18, 30,
- 61,225,230, 55,191,103, 24,183,220, 92, 63, 39,150,162,201,133, 83,161, 96,152,172, 64, 82,139,167, 18,239,192,123, 67, 76,113,
-165,254,105,194, 92, 98,142, 89,145,204,198,116,145,220,105,101,177,188, 94,170,101,144,211, 68,175,159,113,174, 45, 78, 25,181,
- 27, 42, 39, 65,135,179,170,193,104, 12,210,240,173, 48, 24,199,110,227,184,218,109,240,195, 64,216, 61,230,151,191,249,138,255,
-239,231,191,231, 54, 15,100, 41,184,122,143,191, 78,123, 64, 55,188, 36, 20,157, 95,249,139, 95,123,133,178,220,103,106,179, 90,
-228, 22, 49,197, 82,125, 62,212,101, 47, 23,236,249,175,203,247,120,142,223, 54, 74,255, 33, 30,251,119, 77, 9,212, 74, 97, 87,
-239,237,162,168,220,245,127,156, 17,142,199,169,191,169, 28, 97,220,176,221,108,241, 14, 90, 58, 82,128,212, 20,122,145,107, 33,
-150, 68,105,170, 94, 13,198,234, 88,170, 63,136,214,185,222,169, 65, 42,153,146,210,250,250,106, 17, 80,116, 79,184,196,189,222,
-159, 9, 75,198,114, 98, 7,215, 86, 25, 59, 13, 47,151,204,113,154,201, 49, 17,172, 16,156, 97,112,162,192, 15, 99,113, 93,200,
-211,114,197, 15,163,130, 77, 82,187,200,143, 95,123,237,123,202,243,197,114,199, 58,209,184,223,205,158,189,222,114,242,255,183,
-181, 30, 84, 1, 84, 79,226, 88, 77,241,235,199,190,199, 63, 56,191,118, 31,178, 44,190, 41,196, 59, 27,251,159, 41,237,245,196,
-144, 7,199,235,237,188, 43,151,115,107,231,249, 34,234,100,253,147, 7, 22, 9,114,110,201, 92,138,143,158,192,213, 58,166, 19,
-192, 56,131,149, 19,153, 13,212,102,102,173,163,230,194,205,205, 77,191,104, 52,188, 37,151,138,239, 93,148, 51, 74,135,163, 54,
- 44,170, 66,110,237,196,184,111, 34, 28, 74, 66,172, 65,230,153,143,119, 3,127,242,209,123,212,150,120,118,136,236, 7, 71,182,
-142,233, 56, 97,164, 97,169,136,213,206,223,208, 72, 85,145,171,173,195, 83,156,241, 8,149, 82, 51,141, 12,166, 49, 90,195,198,
-141,221,188,161,211, 6, 63, 12,136, 85,168, 74,179,134,155,215,175,186,147, 67, 11,160, 33,140,228,154,215,105, 79,205, 10, 29,
- 25, 66,160,100, 93, 59, 52,116,140, 77,107,120, 99, 9, 2,222,160, 23,180,177,212, 56, 97,124,160,230,196,102, 8,164, 24,251,
-193, 15, 27, 31,152, 83,210,238, 55,205, 24, 42,121,158,168, 98,240,222, 82, 98,195, 59,229,118, 91,171, 41,114,130,102,199,199,
- 28, 73, 37, 81,106,233, 62,107, 71,156, 99,215, 29, 20,134, 48,208, 74,237,209,168, 21, 47,150,105,158,144, 82,240, 13,156, 88,
- 18, 85, 59,174,218,112,214,145, 58, 21,172,246,160,156, 69, 77, 79,109, 84,209, 49,123,238,162,214,229,220, 91, 46,182, 82,202,
-234, 65,111,173,169, 45,182,234,100,111, 24, 6,117, 9,136, 96,140,250,213,167,121,166,181, 70,156, 83,127, 29,181, 80,136,157,
-111,111, 23, 0, 80, 74,218,221, 59,125,243,214, 86,251, 42, 69,207,156,148, 42,166,118, 73,172, 53, 56,175, 49,194,173,104,243,
- 88, 82, 82,104, 17,130,179, 75, 88,143,254,123,240, 94,155, 10,107,123,246,122, 89, 69,162,166,235,130, 82, 73,171,181,183,182,
- 74,109, 5,219, 41,137,181,235,150,164, 53, 77,186,148,178,138, 57,151, 73,178,179,210,195, 99, 58,236,171, 71,198,142,155,192,
-102, 59,176,217, 4,182,251,145,156, 39, 30, 61,121, 66, 27,182, 96, 3, 34,141,244,226,107,166,103, 95, 17,252, 64,125,180, 97,
-247,222,143,185,125,246, 45,243,139,175, 41,249,142,199,123,207,198,127,192,223,253,246,115, 74,174,148,230, 72, 2,206,169,215,
-127, 28, 3,219,113,196,198, 72,201,145,220,189,247,165, 67,214,106, 45,189, 96,211,247,103, 46, 73,225, 66,198,244,215, 95,139,
- 36,211, 39, 78, 70, 12,210,164, 83,226, 84, 11,100, 27,167,175,141,138, 69, 93, 70,174,233,215, 25,188,103, 8,142,237,102,203,
-110,243,136,216, 2,255,254,255,252, 47,124, 55, 21,178,169, 20, 49, 39,161,156,172, 59,245,101,204,219, 78,142,226, 5, 36,191,
- 28, 82,173,174, 7,224,114,238, 45,135, 74, 59, 15, 79,235, 75, 89,211,195, 98,238,119,206, 15, 41,144, 31, 2,129,188, 75,252,
-166, 73, 65,151,115,133,250,144,199,248,162, 19, 55,111, 87,234,247, 74,105, 17,108, 88, 35,108,156,103, 19,188, 90,214, 68, 72,
-115,226,238, 56,171,144,197, 15,157, 66,165,220,238,133,251, 62, 19, 40,210,200,173, 32,206, 48, 90,221, 45, 74, 93,104,112, 22,
-172,250,223, 99, 78,148, 86,201, 41, 51,167, 89,149,200,214, 96,219, 73,161, 94,155, 90,152,122,144,243,122, 1, 22,150,216,197,
-110,121,202,153,220,170, 70,127, 2,115,202,148, 6,227, 48, 98,173, 42,178, 91, 87, 6, 15,198, 97,105,196,156,176, 54, 43, 13,
-202, 52,102,116,255,218,250,156, 92,150, 84,182,190, 18, 88,211,243,106,237,152,195,118,239, 98,235,242, 57, 89,190, 23,173, 63,
-188, 39, 10,155,118,209,237, 44,104,189,174, 31,160, 33, 23, 44,129,115,238,251,247,173, 91, 46, 7, 76,125,120,223, 22,152,200,
- 73, 93,127,218,185,159, 42,165,251, 22, 60,125, 75,212, 53, 42,242,162,150, 90, 43,154,203,101,252,249,207, 44,226, 32, 61,176,
- 59,110,163,251,138,141,152,238, 19,215,103,204, 57,219, 15, 67,221,223,165, 57, 50,142,154,216,230,189, 35, 38, 85,109, 75,211,
-131,128,146,251, 33,216, 39, 15, 58,146,161,212, 70,179,173, 3, 44, 26,222, 91,142,211,129,167,187, 13, 79,183, 59,174,115,227,
-250,246,208,133, 73,181,115,212,181, 11, 42,173, 17,198,141,218,158, 58, 85,204, 26,203,213,227, 71,220, 92,191,194,160,228, 53,
- 93, 91,203, 58, 33, 52,222, 19,167,153,146, 42,233, 24,123,218,154,231,238,230,154, 86, 42,166, 9,193,122, 54,187, 61,215,183,
-215,228,190,195,205,165,244, 0, 18,117,123,228,121,238,113,161, 5,169, 48, 24,139,167, 96,170, 70, 18, 15,206,246, 20,179,220,
-167, 78,134, 26,245,185, 52, 93, 41,101,204,192,225,112,192, 58, 7, 22,182,251, 61,215, 61,123,222, 25,163, 99,254,254,252, 45,
-234,114,181,139,233,250, 98, 28, 71, 82, 74,171, 59, 4,105,228,164, 23,163,179,138,252,181,214,146,230,132, 55,150, 60, 71,213,
- 33,148, 74,203,149,148,116, 2,176, 4, 49,231,101,185,105,165, 23,112,170,214, 23,235,250, 37,101, 73,157,249,207, 34,186,235,
-140,136,148,103, 21,199, 25,213, 85,212, 90,217,142, 35, 37,183,190,250, 82, 42,219,178,218, 91,223, 15, 57,234, 37,210,244,125,
-167,239, 31, 13,100,209, 24, 84, 97, 58, 30,214,203,182,118,216,142, 24,233,106,237, 14,214,178,166, 79,211,164,139,209, 12,222,
- 12, 4,175,120, 87,103,245,236,181,198,116, 44,118, 67,122, 12,172, 17,206,110, 16, 86,149,127, 46,122,174,228,114, 18,221,182,
- 53,136, 74, 11,111, 47,203, 0,176,172,182, 65,181,225,105, 32,138,233,222,110,189,208, 13,227,224, 24,130, 39, 12,150,253,163,
- 13,187,237,128,223, 25,220,224,251,218,192, 66,139, 28,191,251, 22,239, 2,245,131,247,185,169, 19,239,111, 60,175, 95,190,228,
-230,243,223,241,201,123,123, 98,118, 60,251,250,134,193,171,157,209,244,177,121,237, 42,116,231,117,186, 53,248,128,136,167,222,
- 30,184, 61, 76, 90,188,157, 79, 96,141,130,155,242,178,162,172,149,210,237,149,139, 10,222,172,226,235,211,153, 84,155, 22,231,
- 86,172, 6,187,116,113,160,105,116,235,169, 37, 4,203, 56,142,108, 54,143,168, 50,242,239,255,195,127,226,211,111, 94,146,100,
- 67,173,122, 31, 56,221, 25,155,179,101,242,217,129,186, 30, 81,186, 67, 53,253,226, 64,186, 48,255,220,175,218, 63,209, 5, 74,
-129, 92, 10,149,222,150,148,246, 67,216,220, 43, 34,180,117, 79,245,153, 86, 93,250, 3, 33,167, 71, 71, 5, 10, 93, 20,212,238,
-117,113, 15,209,205, 46, 4,120,168,175,208, 84, 13,146, 24,156, 97,235, 13,163, 95,160,250,133,169, 20, 74,159, 58, 88,105, 88,
- 83,168, 37,146,197,208,140,195, 72,135, 18,148,140,115, 70,185,217,162, 99, 39,221, 96, 56, 74,237,145,176,173,146,114,234,200,
-208,210, 61,168, 65, 15,147,170, 30,198,154, 51,181, 38,141, 20, 93,146,224,144, 62,190,237, 56,222,190, 14,113, 70,133,121,216,
-165,123,218,224, 0, 63,238, 9, 33,116, 96, 65,193,180,132, 33, 97,131, 65,230, 10, 49, 98,208,110,231,104,234, 34,243, 84,145,
- 87,223,135,139,152,254,152, 44,118,181,254,140, 44,118,200, 21, 88, 36,212,118, 30,106,223,247,113,114, 62, 94,172,151,173,242,
-114,225,175,122,130,119,139, 26,223,154, 41,176,236,227,219, 89,205,128, 57, 11,116, 49,171,144,111, 29,207,183, 83, 22,253,165,
- 16,111,209, 22,180,147,154,116,125, 54,213,149,127, 73, 53,236,207,144, 61, 61,157,102, 81,136,247,255, 47, 14, 6, 13,248,105,
- 4,111,112,198,234, 37,159,146, 90,219, 68, 83,172,156,115,140,163,134,187, 56,111, 52, 60, 99,174,148, 92, 59,251,201,208,138,
-193, 24,223,189,176,141, 66, 70,170, 16,140, 83, 78,182,179,124,125,188, 69, 70,131,115,129,134, 97,240, 3, 37,169, 10, 31,167,
-184, 79,223,153,227,211, 28,241,222, 18,188,233,192, 28, 75,216, 8, 67, 25, 40,185,118, 47,110, 85,234, 97,211,139,106,202, 71,
- 48, 22,135,233,157,136, 96, 22,201,125,179,132,160, 30,253,227,225,142,154,116, 44,109,173, 87, 53,243, 16,186, 14,162, 96,139,
-138,209, 44, 66, 16,141,147, 53,165,170,109,180,199,133, 90,111, 25,173,163,161, 95, 79,109, 26, 34, 34,222, 80,170,174,141,156,
-245,164, 57, 43, 49,110,142,122,249,214,162,171,137,214,216, 12, 35, 49, 39,156, 83,108,148,146, 30, 23,171,151,193, 58, 81, 98,
-158,115,228,220, 95, 39,180,216,159,142,135, 30,223,106, 9, 11,249,173,115,206,105,122,240,151,166, 49,201,213,104,161,209,250,
-168, 94,223,247, 74,144, 43, 89, 83,241, 20,189,171, 98,188, 90,171, 2,165,140,213,247, 94, 47,228,151, 66, 74,140, 85,186, 88,
-158,187,120,173,172,161, 82,193,235,217,108,122,148,172,235,180, 55, 75,207, 12, 40, 69, 47,112,235, 86, 93, 73,107, 11, 2, 88,
- 11, 95,165,161, 73,159, 40,244,243,196, 10, 70, 60,224,122, 66,223, 9, 38,228,157, 50, 24,232,239,247,193, 5, 74,158,200, 53,
-245,241,185, 22,155, 57,118, 68,114, 23, 25, 54,178, 58, 8,172, 69,204,165,240, 89,181, 59,210,105,138, 94,177,190,206,174, 17,
-185,234,186,176, 74, 99,116,150,237, 16, 24,189,193, 7,203,110, 27,120,250,228,138,199,251, 45,110,231,160, 36,218,124,139,173,
- 51,229,120,131,153, 18, 50, 60, 97,248,240, 15, 57, 60,255, 27,210,231,159, 81,175, 95,242, 23,255,252,207,200, 47,239,248,221,
-111,159, 83, 83,198, 88,199,118, 24,136, 83, 38,231, 70,118, 22,219, 12, 83,201,232, 96,158,142,219,173,132,102,244,194, 30, 61,
- 37,102,108,169, 24,229, 60, 19,156,161,101, 93,225,232,215, 89, 46,148,237, 86, 26,210,146,246,226,226,122,100,180,244,224,167,
-190,206,148,222,144,228,202, 48, 90,118, 91,195,238,201,158, 54, 62,230, 63,252,151, 95,240,187,103,175,153,197, 82, 68,225, 65,
- 77, 87, 87,250, 7, 91,189,167, 20, 22, 89, 23,132,122,248, 45,217, 91, 61,169,203,176,118, 99,173,213,183,120,188,121,103, 23,
-126,255,242,190,191,107,127, 67,220,118,207,222,180, 0, 79,222, 64,160,182,126,176,116, 97, 82,251,158, 49,189, 94, 50,102, 45,
-104,164, 63,244, 94,132,193, 7, 6,231,215,220,226,152,146,118,191, 37,227,236,160, 63,159, 51,198, 44, 80, 7, 93, 85,232,190,
- 77, 48, 70,119,108,115, 41, 10,226,247, 67, 23, 81, 40,236,161, 81,149,160,100, 61,174,199, 86, 66, 31,183,229,220,131, 46, 10,
-214,178,218,107, 84,132,197,250,166, 81,165,232, 34,170, 80,123,210, 60,171, 80,198, 88,135,160, 99,222,230, 3, 98, 53,192,163,
- 21,237,213,116,100,106,136,199, 3, 37,101, 48,170,128, 53, 61,154,113,225, 23, 40, 17,235,140, 33,214, 78,254, 85, 89, 65, 10,
-230,222,107, 44,111,136, 16, 31, 18, 82, 46, 63,174,235,130,167,173,170,251,239, 3, 24,125, 95, 78,251,131,207,160,112,145,174,
-133,188,219, 70,121,185,207,231,193,164, 54,145,246,134, 74,222,244,175,255, 34,204,166,246, 75,128,165,139,119, 39,181,124, 41,
- 12,195,118,221,167, 46,171, 6,231, 29,210,160,196,194,102,179,225,230,213, 45,166, 42,232, 68,213,192,125, 4, 47, 11,175,161,
-123,143,105, 52, 3, 71,132,187,220, 85,220,181, 64,138, 72, 85, 43,164, 65,173,111, 78, 23,128,120,163,157,205, 48, 40,124, 68,
-188,103,187,191, 98,138, 25, 36,177, 49, 35, 6, 81, 5,123,133, 57, 39, 42, 16, 92, 87,133, 59,135,115,190,103,125, 27, 82, 85,
-225,208,116, 56,170,158,196, 41,253,108, 28, 6,196, 89,142,243, 68,156,102,188,211, 2,185, 81, 85, 49, 94,128,166,251, 76, 35,
- 66, 48, 66, 43,133, 98, 13,185,101, 90, 51,108,195, 70,231, 84, 70,245, 41,135,227, 65,223,195,198,224,199,160, 69, 78, 23, 47,
-197,162,243, 99,103, 60,199,227,145,138, 48,184, 13, 41, 30,241,131,210,236, 98,140, 64, 99, 24,130, 6,188, 76,202,199,207, 69,
-145,174, 11,154,185,228, 76,179,141, 27,160, 90, 97,179,217,112,119, 60,178,123,250, 72,167,110,181, 50,205,147,198,240,246, 93,
-170, 17, 84,181,237,122, 60,239,168, 10,243,142,189, 83, 69,126,183, 64,130,244,120,218,172, 94,243,222, 57,174, 51, 48,171, 97,
- 56,206, 40, 5,176,212,178, 10, 65, 77,239,154,107, 46,212,162,224, 23, 39,203,120,101, 25,239,215, 51, 39, 83, 91, 47,203,229,
-221,103,236,169,248,174, 57, 97,250,179,232,140,103,154,142, 56,103,250, 46,188, 94, 76,205,106,159,134,213, 82,187,163, 67, 71,
-235,234, 14, 72,157, 62, 9, 86, 78,133,179, 93,166, 91,253, 61,178,100,197,203, 66, 58,236,103,162,181,166,239,182,141, 78, 42,
-141,178, 88, 93, 8,140, 59,207,118,235,120,252,222, 21,251, 71, 59,118,143,118,236, 63,120, 76,138, 17,111,129,122,100,250,236,
-119,216,249,136,140, 91,204, 38, 16,194,200,231,255,233,255,230,189, 15, 31,179,223, 61,226,187,151,183,188,190,189,229, 48, 11,
-115,204,186, 94, 16, 75, 66, 85,237,227,232, 85, 28, 74, 83,218, 93,109,164,152,201,177,210,156,165,166,137, 32,130, 41,170, 79,
-243, 65,147,214,194, 96, 16,122,114,161, 49, 20, 17,114, 45,148, 10,217, 88, 74, 85,118,136,171,167,172,248,133,255, 0,165,219,
-128, 27,206, 13,248, 33, 16,182, 87,188,158, 50,127,243,235,255,198,215,223,222, 81,237,160,104,227,245,123, 42,157,149,248, 32,
-186,109, 81, 42,203,137, 30,215,150, 31, 43,106,178,153, 11,246,216, 91,169,109,247, 47,242,183,197,109, 62, 4,151,185,223,149,
-157,255,154, 57,199,146, 46, 36,158,229,243,232, 69,138,109,246,141,204,247,115, 65,242,125, 5, 54,107,232, 75,195, 91,199,198,
-233,155,167,181,166,232,215,172,123, 55,239, 45,173, 21,114,214, 29,145,250,133, 59,213,169,182,117, 82,145,208,195,196,248, 81,
- 9,112,214,105,248, 74,174,136, 81, 37,232,118,227, 16,169,148, 18, 73, 73,149,242,181,100, 85,221,122,229, 6,235,234,185,116,
-193,226,217,215,221,195,103,150,162,172, 46,170,241, 12, 25, 48, 53, 48,140, 91,160,113,156,142, 36, 81,222,188,180, 12, 37, 51,
-122, 67,112,158, 97,187, 95,201, 85, 34,118, 29,185, 55, 89, 43,184, 55,112,186,102,141,103,237,241,178,247,216, 50,139,103,251,
-124, 60,125,159, 10,119,234,112,251,122,125,117, 92,188,221,249,240,206, 60,245,127,164,167,253,226,130, 62,139,240,123,120, 53,
-211,116,117, 33,114,118,129,183,245,243, 71, 22, 71,197,201,210, 89,115, 89, 51,200,215,137,199,218,236, 11, 74, 35,173, 61,168,
-161,189,225,204, 48,198, 80,114,233,221,161,244,106,190,187, 1,122,132,103,169, 25,135, 87,244,102,213, 46, 56,231,218,167, 40,
-130, 53,129,215,243,204, 31,127,242, 17,223,188,122, 65, 76,134,187, 89, 85,246,214,131,163, 32,166, 82,106, 35, 56,207, 28,103,
-106, 2, 27, 44,143,159, 62,162,138,168,202,188, 22, 76,112,189,163,159, 57,246, 48,148,113, 28,181, 72, 45,203,118, 72, 9, 89,
-105, 78, 43, 54,118,179,217,170, 66,189, 36,230, 28,149, 83,223, 76, 47,100, 6, 30, 95,237, 57,222, 92, 51,140,129, 54, 37,164,
- 85,156, 24,140,212, 21,216,226,208,212,192,210,132,205,184,227,120,123, 84,239,189,243, 28,166, 59,140,115,154,120,230, 45,169,
- 19, 16, 75, 85,229,183, 51,150, 57, 69,156, 23,156, 11,122,209,199,136,113,150,121, 78, 56,167,227,105,122,162,155,179,142, 38,
- 16, 59, 1, 14, 99,116,172,238, 44,227,110,195,225,120, 36,209,192,121,174,211,204,230,106,203,235,195,173, 18,195, 90, 67,172,
- 16,188,195,148,130, 31, 22, 43,215,160,116, 64,209, 9, 72,235, 33, 37,210,255, 59,198,116, 54,121, 50,212,110,253,202, 85,207,
- 20, 17, 77, 46, 51,152, 62,230,214, 21, 2,125,210, 32,221,206, 69,105,180,146,217, 14, 3,173,100, 77,110, 67, 40, 57,107, 76,
-243,250, 12,246, 92, 9, 99, 52, 70, 85,206,198,200, 62,172, 12,248,147, 46,234,116,230, 0,164, 84,116,165,215,139,218,148, 52,
- 42, 85, 47,231,172, 14,145,190,111,214,128,156, 62,185, 66, 48,173,195,194,138,197,186, 19,150,220,116,113,176,237, 33, 66,117,
-117,244,176, 82,249,130,115, 12,222, 18,156,193,142,142,171,167, 87, 60,121, 52,242,222,251, 87,108, 55,129,253,126, 68, 2,248,
-237, 72,187,157, 72,229, 25, 55, 95,124,201,163,237,192,248,241,123, 32, 19,245,230,128, 73, 19, 31,252,225, 31, 83,158,189,228,
-219,175,191,229,245,113,230,217,203,137,235,227, 76,174,186, 30,170, 52, 98, 86, 1,157,237,235,188,185,100,226, 20,187, 47,221,
- 81, 91,101,227, 2,174, 9,219,161,243, 37, 6,207,213,110, 68,122, 40, 79,112,129,253,230,138,215, 55,175, 48, 94, 56,204, 19,
- 47, 94, 29,168, 38, 96,113, 26,145, 43,149, 86,123,160, 79,171,171,155,201,121,203,118,187,161, 96,248,251,223,125,197,221, 20,
-153, 19, 36,172,218, 14,173,167, 54,101,244, 27, 99,112,235,156,146,246, 22,212,171, 92, 80,179,206,127,254, 33, 15,239,187,172,
-101,239, 58,128, 31,218,147,126,111,215, 69, 91,119, 46,114,134, 2, 49, 29,180,177, 62,140,103,170,124, 46, 40,105, 15, 11,173,
- 90,203, 24,129, 96,173,170,110,155,102, 27,151, 90, 73, 77,213,223,173,234,184,195, 59,175,111, 94, 17, 98, 44,212,178,104, 10,
- 58,211,220,122,154, 88,106,161,191,153,181,243,240,206,244,238,191, 40,233, 43,103,114,154,187,103,180,225,157, 94,172,166, 23,
- 41,186,127,213,224,150,229,123, 82,123,158,244,217, 82, 24, 74,189,176,163,149, 28,177,197,107,165, 94,133, 88, 33, 87,139, 55,
-170,180, 79, 41, 51,120,203,214,171,122, 57,231,140,109,130, 23, 52, 84, 96,201,150,191,231,134,144, 53,185, 73,206,118,223,239,
-238,166, 31,250,222,182,243,209,247, 25,145,238,109, 68,184,243,105,206,195,207,147,172, 59,253,135,133,116,237, 12, 80,211, 63,
-255, 7, 62,206,249,223,115, 81,168, 46, 41, 92,152, 11, 31,233,233,166, 94,130,128,148, 95, 45,125,103, 94, 22, 69,107, 91,184,
-247, 42,111, 44, 93, 48,179,140,222, 74,202, 12,195, 22, 87, 51,165,229,158,142,150,161,251,221,115, 46,125, 85,161, 66, 35,206,
- 58, 38, 99, 5,162, 30,206,235,238,187, 9,205, 5, 98,201,248,193,240,211, 15,158,114,119,251, 5, 12, 1,194, 72,169, 19,166,
-214, 85,225, 95,114, 83,200, 70, 41,108,198,173,170,235,123, 18,160,183,234, 99,143, 41,235,222, 91, 56,203, 80, 87,255,123,234,
-123, 65,211, 15, 38, 31, 2,161, 91,197, 20,128,163, 19,131,105,154, 78,226, 88,224,120,125, 67,141,145,106, 12, 38, 87,194,234,
-213,237, 88,100, 84,128, 52,248,129, 54, 39, 72, 9,219,247,241,165,137,138,235,172, 97, 46, 42, 78, 45, 69, 71,211,198, 58, 98,
-201,196, 82, 73,125,171,212, 68,136,109,225,110, 91,154, 21, 98, 79, 99, 51, 78,119,220, 83,154,123, 46,249, 34,102, 85,104,141,
-245,134,155,233, 14, 99, 13,105,206,234, 65, 54,144,110, 11, 65, 26,174, 11,153, 76, 79, 52,116, 86,201,112,187,205,176, 42,251,
- 23, 65,152,177, 26,190,226,172, 94, 96, 94, 92,183, 60,210,125,204, 3,113,158,113, 34,116,169, 44,251, 81, 61,210,210,244,156,
- 75, 81, 39, 34, 45,233,234,101, 78,221, 14,103, 13, 57, 23,213, 42,228,140,113,158, 48, 12,184, 14, 19,171,165,244,236,121,117,
-202,196, 24,123, 66, 90,162, 36, 21,236, 22, 78, 43, 44, 99, 85,155,161,222,107,117, 76,136,156, 20,233,165,171,248,109, 53, 29,
-208,107,250,170,169, 94,228, 66,172,197,125,183,216, 45,126,124,133, 19,185,158, 48,121, 54, 25, 89,100,228,221, 77,162, 63, 39,
-120, 99,216,239,119, 60,122,186,101,255,120,203,147, 39, 59,246, 87, 35, 79,222,219,171,183,124, 99, 16, 47,180,155,137,223,255,
-237,175, 56,196,153, 71,255,234,127,166,120, 65,174,191,229,246,215,191,225, 39,127,241, 71,180,187,196,237,151, 47,120,241,236,
- 37,135, 88,185,142,153,155,105, 38,225,213,223,223,250,132,216,185,190,195,183, 76,135, 3,226, 2, 34, 66,172, 17, 17, 75,142,
- 32,165,193,182,242,254,211, 13,143, 31,239,153,111,143, 24,175,161, 91, 87,131,229,106,172,252,197, 79,127,194,159,254,241, 71,
- 20, 18,215,119,145, 95,252,195,103,124,246,197, 53,165,121,134,160,244, 63,154,174, 53,196, 26,182,187,145,253,126,203, 92, 18,
-207,190,126,201,221,220,152,178, 35, 73, 35, 35,212,158, 89,111,140,165,137,161,104, 82,241, 69,166, 84,135,156,220, 27,157, 46,
-130,134, 11, 44,236,137, 18,126,238, 69,126, 23,194,245,221,104,207,119,100,100, 63,176, 67, 61, 83,192,173, 66, 11, 89,243,208,
-219,170, 78, 62,143,217,148,123,221,163,188, 1, 20,161, 43, 17,245,133, 9,206,170,226,179, 7, 34, 52, 81, 48, 64, 41, 42,236,
-113,253, 66,111,173,105,228, 99,174,136,120, 61,124, 69,187,230, 82,117, 12,229,195,168,222, 91, 81,203, 88,201,153, 84,148, 36,
- 85, 83,164,150,164, 84,170, 86, 49, 86,214,177,119, 42,121, 69, 64, 46,250,128, 69, 43,160,223, 49, 61,120, 52, 57, 77, 78,246,
-168,206,157,110, 34,204, 57,234, 21,214, 59,235, 50,207, 20, 67,199, 49,194,113, 78,148,148, 24,131, 2, 80, 92, 5, 47,130, 23,
-161, 72,123, 11,174,245,116,161,157, 43,223,239,143,204,229, 7,172, 98, 46, 60,222,114,182, 23,191,255,231,133, 11,148,241,178,
-218,150,139,103,240, 68,188, 61, 41,214,219,133,127,124, 41, 66,196,112,225,253, 63,127,230,207,159,185,101,124,126,185,187,239,
- 31,191,158, 24,239,247,247,242,166, 7,126,180,218,167, 15,237,100,239,180,198,146,146,142,225,164,163,170, 90,133, 24, 19, 33,
-231, 46, 62,242, 43, 45,144,166, 23,245,154,105,180, 48,249,251,123, 49,231, 68,112, 65, 47,241,218,200, 89,237, 85,181,170,178,
- 29,111, 56, 28,111,249,248,241,158,235,171, 45,175,178, 33, 90,199,148, 12,181, 9,177, 20,196,120,170,104, 20,104, 24, 84,117,
- 63, 29,238,176, 67, 32,120, 71,188,131, 41,206, 93,240,164,248, 82,245, 74, 23,172,243,218,205, 56,203,102,179, 85, 27,155, 83,
- 97, 81, 18, 21,130, 25,111, 25,198, 65,189,246, 13, 54,227, 6,151,102,200,153, 50,207,120, 84,199,226,187,101, 83,140, 90,247,
-164,213,213, 6, 20,231,185,107, 76, 42, 77, 44, 33, 56,110, 15,119,152,193, 17,163, 78,205, 74, 41,180,172,194,191, 44,153,140,
- 16,107, 37, 55,214, 98, 34, 67,223, 21,131, 25,130,250,181,115,162, 54,131, 12, 1,111, 45,116, 46,249, 92, 10, 91, 63, 98, 4,
-101,231,247,181,220,198, 26,198, 94,212,120,163, 83, 19,223,189,255,166, 53,194, 16,104, 6,194, 16,200,113,214, 81,118,191,152,
- 90,109, 76, 83, 2,107, 59,107,189, 59, 26, 88, 44, 90,142,146, 35,227,232, 41, 8,211, 52,119,172,116,237,236,126, 77,168, 19,
-209,206, 87,196,172, 54,171,148, 83, 23,146,169,199, 60,149, 66, 67,173,122,131, 15, 88,107, 58,209,176,225,230,136,115,110,141,
-225, 85,186,155,118,245,151, 78,165,118,193, 84, 88,166, 75,102, 21, 82, 47,111, 70,179,190, 95, 90, 61,173,182,140,145,206, 55,
- 63, 59, 35,140,166, 98, 89,107,186,231, 92,223, 67,206, 14, 90, 8,247, 41, 73, 41, 21,223,215, 22, 98, 13,173,170, 6,100,179,
- 9, 60,190,218,178,223, 13,108, 54,150,237,104, 25, 55, 30, 51,170,184,144, 57, 49, 95, 79,220,125,253,130,237,207,126,194,240,
-209, 71, 28,190,249,146,252,219, 79,121,186,127,130, 15, 35,119,191,249,156,223,254,254, 25, 95,126,119,195,215,119,133,231,215,
- 7,230,102,250, 68,163,173, 54,212,215, 55, 7,198, 33, 96,165,244, 24, 95,181, 58, 55, 43, 72,169,120, 44,219,237,192,199, 31,
- 63,162,230,107, 62,120,188,229,117,173,188,124,121,131, 56,157, 98,140, 87,142, 54,221,224,242,158, 71, 59,199,199, 79,158,242,
- 56, 56, 70,243, 27, 24, 6,126,246,211,159, 34, 2,135,227,204,235,215,119, 28,166,136, 56,167, 92,253, 67,194, 5,135,177,142,
-146,202,137, 95, 34,130,105,102, 53,217, 34,224, 90,123,168, 59,111,103, 59,244, 51,208,204, 27, 49,169,103, 56,208,251,209,169,
-255,132,172,236,239,219,153,222, 31,207, 47, 85,228,162,178, 94, 41,120,237, 50, 27, 94,206, 60,196,230, 30,220,108, 21,114,119,
- 16,140, 38,219,170,210,213,116,198,117,233,182, 25,233,234,215,101, 52, 63,132, 65, 51,111, 99, 36,149,130, 49,154,152, 86,154,
- 16,155, 90,128,140,181,120,235,113,182, 81,243,196,156, 53, 73,138,166,145,156,139, 32,209,200,226,107, 54,148,154,200, 69,187,
-141, 82,117, 44,186, 42,248, 47, 22,212,253,162, 40,253, 98,239, 10,173,101, 29, 33, 61, 66,179,149, 68,110,218, 17, 26, 17,172,
-202, 30,105,102,209,174, 11,169, 65,157, 35, 99,208, 55,189,171, 21,215, 17,151,114,241,250,159, 94,231,229,118, 49,139, 63,251,
- 7,176,246, 31, 90,173, 92, 38,241,201,137, 96, 39,111,238,228, 21,107,219, 46,236,103,151,182,115,233,252,250,203,189,247,253,
- 96, 25,228, 94, 60, 44,231, 1, 47, 39, 1,104,163,190,117, 74,212,206, 4,130,167, 98,192,188,193,130,175, 93,197,187, 28,110,
-203,132,171,228,178,218, 25,181,211,209, 2, 34,197,196,184,241, 42,174,169, 32,173,244, 2,161,219,249, 22, 27,161, 57, 47, 60,
-186,216,176, 95, 24,244, 24,203, 38, 90,244,122, 35, 92,223,222,240,135, 31,254,136,240, 7, 63,229,139,235, 59,190,190, 59,114,
-157, 26, 45, 4,124,211,172,232, 34, 2,198, 18, 75,161,220,220,226,189,231,238, 48,245,174, 81,243,179, 99,202, 29,244,163, 36,
- 57,101,125,123,156,245,248, 16,184,187, 61,168,181,199, 58,154, 81,125,136,247, 30,179,140, 84, 75, 97, 51,140,208, 42,190, 99,
-111, 3,122, 24, 57, 4,191,240,226, 87,188,129,238,105, 19, 73,253,200, 94, 52, 94, 52, 21,172,120,114,173,180,163,166,214,229,
- 84, 25,119, 91,154, 73, 76,243, 76, 42,173,143,201,213, 87, 47, 93,151, 34, 98,216,236,246,196,156,153,230, 25,239, 44,133,202,
-224, 29,211,241, 14, 47,158,150,149, 94,182, 27, 7,166,227,129, 49, 4,246,206,245,136,209,134,113, 6,103, 53,119,193, 72,101,
-179, 9, 29,255,169, 74,241, 70, 5, 99,169, 89,147,248,244,153,182,250,122, 89, 11,162,133,157,113,142, 41,166, 53, 55, 29, 41,
-184,133, 76, 72,197, 88,143,247,125, 20, 95, 50,182,234,107,170, 35,252, 5, 6,165,205, 75,169,181,159, 57,118,125, 70, 21, 18,
- 84,168, 21, 98,202,216,190,247, 93, 88,240,203,122, 7,129,154,245, 50,243,182,131,171,186,148,189,246,177,253,210,156,153,190,
- 94,172,114,110, 71, 94, 60, 33,230, 2,255,188,188,159, 23, 39,136, 8,171, 34, 95,241,194,141,150,122, 49,227, 44,197, 10, 86,
- 84,155, 81, 75, 94,187,121,219, 11, 34,239, 12,227, 38,224,131,176,191, 26,217,239, 3, 67, 16,174,174, 54,136, 87,249,188,136,
- 1,191,227,250,245, 55, 28,143,119,236,140,234, 33,238, 62,251, 10,249,246,134,167, 63,254, 41,233,155, 27,126,255, 15, 95,240,
-119,207, 94,240,245, 92,249,238, 46, 19,171,161, 25,131,109,150, 96, 32,149,184,162,153,141,177,250,253,198, 32,182,145, 83, 92,
- 83,243,196, 22,172,207, 60,125,178,101,104,129,173,113,188,152, 39,140,135,155,219, 59, 54,143, 45, 97,180,108,182,142,207,191,
-250,130, 97, 52,124,244,201, 79, 57,198,137,253,149, 5,155, 25,252, 17,193, 48,213, 3, 86, 34, 49,222,225,237,142,195,113, 98,
-138, 89,115,239,173, 54,154, 53, 21,114, 43, 52, 89,232,252, 66,109, 58,197,115,111, 35,179,137,180,123,169, 83,188, 49,174, 62,
- 79, 40,226,204, 38,118, 30,109,249, 67,144,177,239,218,197,191,139, 44,119,209,185,182,118, 15, 58,186,130,196, 46, 80,183,111,
-196,119,158, 3, 84,186, 29,109,185,212, 27,144,114,234, 24, 77,221,224,219,158,253,235,157,102, 49,207, 81,147,216, 16,139,113,
-142,106, 44,115,210,140,102,231,189,134, 11,212, 66, 58, 78,107,168,133,181,129, 48,104,222,122,138,145,214,199,177,165,119, 88,
- 41, 87, 77,144,106, 77,115,210,219,105, 42, 98,132, 51,240,137,118, 47,214, 42,196, 99, 57,228, 23, 8,141, 53,202,166,103,193,
- 15,246,100,169, 38, 22, 49, 14,235, 7, 4,186,223, 94, 31, 24, 5,206,152,238, 1, 78, 93, 47,217,222, 74, 88, 93, 81,178,239,
-248,158,254,144, 2, 79, 39, 17,242, 22, 76,107,123,139, 59,226,242,247, 95,168,214,223,250, 60, 45, 23,245, 41,216, 69,238,117,
-232,154,111,222, 46,104,116,239,244,198,191,241,223,172,174, 1,150, 75,214, 44,187,115, 13,108, 41,165,234,248,188,158, 46,250,
- 90, 27,206, 43,221,108, 33,134, 25, 81, 15,175,179, 1, 17, 72, 57, 95,188, 17,155,156, 61,236, 61,137,107,233,148,244,130,208,
- 21, 85,172,141, 36, 96, 82,229, 47,126,244, 17,143, 54,215,228, 79, 63,229,106,191,129, 97,228, 54, 70,110, 99,230, 54, 87, 14,
-169, 48, 39,125,174,157,113,120, 31,184,203,119, 90,252,149, 68,174,141,212, 26,121,142, 93, 83, 97,152, 83, 36,140,174,103, 72,
-119, 75, 87, 31,231, 46,130,167, 82, 11,113,158,184,218,237, 48,136,142, 49,107,101, 52, 22, 82, 98,227,188,122,117, 57,179,150,
-218,229,124,145,117, 21,177,125,178,231, 48, 69,166, 56, 19,231,166,246, 48,107,152, 99, 34, 55,225,246,230,150,108, 96,206,153,
- 34,134,212, 85,237,181, 51, 16,114, 78,108,119,123, 82,212, 28,118, 47,104,212,171, 1,219, 50,219,142,127,254, 96,191, 93,227,
- 87,199, 81,247,211,155, 97,232, 93,172,168, 56, 9, 97,179, 25, 58,162,119,232,221,116,102,206,250, 58,180,146,215,130, 45,198,
-220,233,139, 74,169,160,136, 44,238, 0, 0, 32, 0, 73, 68, 65, 84,196, 24,176,110, 29,159,150, 90, 87,172,112,140,185,175,231,
- 52,153,204, 59, 79,169,202,131,167,175, 55, 90, 67,215,122,193, 17, 99, 86, 31,127,209,104,228,213, 43, 14, 90,176,180,220,117,
- 4,105,157,175,218,238,102, 18,209,238, 87,137, 83, 58,213,202,173,104,158, 67, 15,187, 88,194,104, 22,126,188,172,154,232, 19,
- 53,205,208, 16, 83,251, 51,168,151,180,244,162,194, 57,115,154,192, 25, 61,115,189,119,167,224,167,117,234,167,102,192,210, 35,
- 94,117,106,161,225, 85, 86, 44,222,233,202,192, 15,142,113, 27, 24, 54,158,253,126,228,209,214, 97,130,208, 28, 36,219,240,227,
-134,118,156, 72,199, 59,222,251,201,199,120,132,195, 47,127,205,203, 95,254,138, 63,255,203,255,129,118,125,224,187, 95,126,201,
- 95,255,252, 55,252,246,213,196,235,104,185,141,149,195, 92,104, 94, 11,177, 16, 70,178, 13,196, 62, 25, 82,132,175,218, 43, 55,
- 97,100, 12,158,224, 2,211,221, 29,121,190,227,241,147,199,152, 22,121, 20, 6,126,246,241, 39,252,253,175, 62,229,182,100,172,
-245, 28,167, 72,108,149,187, 89, 83, 1,167,187, 66,121,126,131, 88,199,235,155, 59,246,187, 45, 37, 53, 90,203,204, 83,228,112,
-136,228, 98,120,245,221, 13, 83, 42,100,132, 38,150, 38,157, 37,111, 26,148,126, 55, 72,237,107, 99, 61, 19, 28, 77,222,178, 23,
-231, 77,155,219, 57,147,132,149,110,175,234,121, 57,139,221,108,237, 66,113,254,174,131,253, 33,159,250, 67,221,249,253,194, 66,
- 51,155,251,102,244, 28,103, 43, 15, 40,157,219, 67,145, 52, 39,168, 72,107,229,162, 24, 89, 42,202,218, 10,173, 36, 45,112, 22,
-209,211, 34,138, 19,136,115, 84,113,139, 24, 92,208, 55,232, 28,117, 44, 54, 12, 67, 71, 94, 30,160, 68,141, 87, 5,140, 13,138,
- 90,244,158,212,119,122,226,132, 20,103,106,105,204, 73, 81,141,165,202, 74,121,170, 11,248,167,223, 19,166, 87,189, 86,192,185,
-126, 41,168, 42,104,237,212,108, 31,159,111,140, 48,132, 0,226,152, 82, 37,150, 74,107, 22, 76,192,249, 43,196,192, 52,125,199,
- 28, 35,102,116,138, 45,108, 10, 85,216,120,207, 68, 35,215, 19, 19,190,221, 83,124,223,127,101,219, 3, 43,152,243, 9,203,219,
- 46,194, 31,116, 89,106, 61,122,166,147, 63, 91,163,244,206, 65, 46,168,118,156,141,213,207,201, 50, 92, 90,218,144,139, 75,251,
- 4,157, 57,241,230,255, 49, 19,167,182,102, 28,215, 55,138,155,165,144,136, 41,246, 31,107, 49,105, 59, 62, 85, 47,174,194,198,
-140, 88, 99, 56, 78,119,218,253,117,203, 86, 45,245,164, 25, 88, 72, 85,189, 8,185,255,122,159,146,226, 12, 77, 60, 49, 21,158,
-127,241, 28,113,223,178,189, 26,248, 56, 8, 7, 49,200,118, 96,116, 66,137,145,187,156,168, 69, 47,151,148,133, 42, 66,205,141,
-216, 42,118,240,220, 77,170,238,198, 10,214,235,100, 42,199,220, 95, 90, 85,237,123,163, 17,178,211, 52, 49,142, 35, 49, 70, 74,
- 41,108,118, 27,134,234, 25,125, 32, 78, 74, 97,163, 86,242,225,142,189, 15,120, 58,247,186,178, 34,116, 79,233,129,189, 11, 53,
-134,249,245, 45, 41, 22,198,176,225, 38, 70,162, 17,205,149, 47,149,102, 44, 83, 81,161, 94, 13,154,213, 45,214, 66,223,139, 27,
- 96,240,129,233,238,192,118,187,101,191,219, 50,207, 51, 67,216, 32, 84,230,233,160, 93,174, 19, 90, 60,232, 46, 95, 84,172, 36,
-193, 99,108, 99, 24, 60,212, 70,202,106, 57, 43, 49, 82, 91, 37,138,233,187,105,187,122,205,151,195,182,100, 45, 90,115,174,228,
-170,113,177, 49, 70,140,216,126, 62,149,158, 15, 0,109,137,218,237,191,223,249,165,176,243,204,243, 17,239,125, 7,123,105,103,
-173,234,247,190,135,237,103, 88,140,115,239,198, 43, 53,235, 89,169,161,159,230,132,111,180,189,128,236,207,183,113, 93,223,177,
-172,238,214,127,175,163,191,181,208, 92, 64, 57, 90, 60,230, 53,172,101, 57, 19,150, 70, 99,193,160,122,175,248,216,197,245,161,
-158,120,123, 70, 38, 93, 56, 11, 25,131, 95,143, 20,235,156, 78, 79,173, 78, 27,156, 9, 12,131, 39,140,158,237,126,195,176,241,
- 60,121,250,136,253,104,177,131,193,236, 7,218,104, 17,231, 56,124,251, 21, 95, 63,251,156,127,254,111,254, 55,190,252,221, 51,
-254,235,191,251,223,249, 23,127,242, 7,184,146,152,190,249,134,223,253,250,115,190,122,113,195,225,104,121,121,200,220,228,138,
- 53, 14, 91,123,206,123, 59,227, 64,116, 64, 78,140,153,171,221, 6,208, 68,188,124, 60,242,254,163,199, 28,239, 12,135,195, 17,
-247,193,142, 79, 62,216,115, 53,234, 26,235,246, 46,225,176,188,255,201, 99, 82, 74,236,159, 62,101,227,213,161,176,127,180,167,
-182,204,118,220, 80,170,112,156,116,125,132, 88,141, 26,158, 35,119,115,230, 16, 51,205,120,237,214,115, 38,102, 93,149,153,102,
- 86, 31,189,156,180,134,184,203,222,182,173,214, 8,125,210,250,110,189,157, 93,228,111,156, 98,178,142, 98,219, 26,246,113,106,
-114, 52,162, 81,176,198,245,189,233, 25, 98,246,194, 65,247,118,149,251, 18, 53,218,250, 39,242, 70, 33, 32,167,125,107,187,151,
-254,117,142,197,211, 44,172,210,177, 16,166,191,225,138,118,167, 52, 5,123,116, 33,134,145,110,233, 90,246,161, 61,199,216, 57,
- 13, 64, 57, 78, 71,166, 57, 33,198,227,188, 71,156, 35,166, 76, 46,234, 51,183,206,146,230,153,146, 34,166,123, 13,193, 98,253,
-128, 49, 78, 21,236, 98, 40, 52,114, 74, 58,106,239,158, 85, 61, 84, 53, 71,215,118, 33, 81, 89,222, 84, 93,227,239,186, 13,201,
-180, 74,237, 60,112,219,133, 28, 75,110,119,240,158,205, 16,216,142, 3,227,168,221,205,225,216, 87, 0, 34,224, 44,214, 41, 17,
-239,238,110,230,238, 24, 97, 27,240,166, 65, 46, 4, 55,146,139,116, 79,125, 81,246,242,210, 9,183,186, 78,115, 78,144,162,246,
-131, 69,142, 15,112, 11, 87,135,133,156,179,219,234,153,144,110,249,239,118, 95,112,215, 78, 84,187,118,190, 24,106,151,122,137,
-101, 82, 35,156,101, 24,240,198,186,166,157,125,172,118, 79,176,119, 6,199,123,167, 13,238, 98,130,116,198,108, 88, 58,145, 5,
-141,169, 62,104,237,204,197,232, 97, 55, 12,129,156, 11, 49, 70, 21, 59,137,209, 78,174,229,179, 98,249, 68,125, 50, 98, 41,185,
-106,178, 25,178,218, 34,151,179,187,137,218,158, 98,202, 84, 12,119,223,188,228,213,231,106,229,114, 98,105,109, 32, 77, 19,243,
-245,145,148, 74, 31,229, 53,108, 51,164,156, 57,150, 8,206,146,226,140, 11, 94,187,222,190,243,182,198,106,140,232,113, 86,125,
- 72, 41,164,227, 81, 3,134,186,173, 78, 80,254,121,153, 21,138, 50,205,183, 4,235, 8, 86, 69, 71, 91, 49, 4, 17,124, 47, 94,
- 75,215,138, 44,175, 89, 70, 56,244,125,181, 21,193,250,129, 87,119,215,164,124,224, 80, 43,197, 89,178,181, 72, 24,193, 58,124,
- 77,196,120,196,136, 97, 52, 78, 71,199, 37, 19,172, 96,187, 32,206, 13,142,150, 38,178,194, 58,104,179,170,148,183,222, 42,101,
-207,219, 85,168,101,157, 91,227, 96,173, 13,196,148,184,186,186,194, 69,181,245,149,162,147,185,156,117,196,157,115,234, 2, 52,
- 45, 68, 90,101, 13,243, 88, 28, 32,181,170, 69,108,220,108,153,142, 71,226,172, 7,186, 24, 67, 78,165,231, 10, 72, 79,233,154,
-148,106,102,232, 98,214,210,189,233,129, 40,122,118,228, 92,116, 20,159,213, 2,217, 74, 89,119,244,165,244,217, 94, 87,150, 47,
-218,162,149, 45,110, 78, 32,165, 90, 11, 84,197,244,106,230,247, 25, 93,177,135,216,208, 95,151,229,162, 53, 86,180,139,246,182,
-139, 55,181,144,113, 61,100, 69,211, 39, 51,198, 64,112, 1, 76, 91,153,238,230,140,134, 98, 12, 26, 21, 77,195, 6, 79,142, 73,
-209,192,163, 62,115,206, 64, 24, 29,187,171, 13,195, 38,176,127,180,225,233,211, 43,134, 77,192, 14, 30,241, 6,188, 71,106, 97,
-250,246, 21,191,252,219, 79,249,238,117,225, 23,255,245,111,144,146,120,127,191,231,163,247,222,231,240,233,151,124,246,139,207,
-248,245,151, 47, 57,148,129,105, 78,234, 59,119,174,175, 26, 26,243, 28,149, 69,226, 2,214,123,106, 42,148,146,241,110,160,196,
-138, 27, 13,142,198,118, 19, 48,109,230,147, 15,159, 48,184,204,126,227, 24, 7, 67,202, 51,185,162,174, 39, 26,183,199, 35,143,
-118,134,218, 50,165, 52,156, 88,166,219, 87, 93, 72,234,185, 57, 70,166, 84,113,205,112, 59, 69,230, 92, 20,121, 92, 42,185,194,
-221,221,145,105, 74,204,177,174,144,153,218,140,134, 41, 53,205,103,104, 70,217, 37,238, 52, 71,105, 43, 20, 67, 43, 52, 53,192,
- 27, 78,128,255, 7, 15,176, 37,180,226,172, 59,106,247, 21,234,203,116, 91,218,233, 98, 95,241,163,102, 69, 9,126, 95, 87,207,
-131, 29,252, 66,227,185,188,236, 87,245,242,186,247,236, 15,184, 26, 42, 16, 92, 15,229, 88,138, 1, 29,133,218,254, 49, 59, 76,
-106,197,248,229,154,241, 67, 0,163,118,132,227, 52,129,104,172,161, 6, 60,232, 88,210, 90, 7, 45,145,230,184, 38,187,137,113,
-228, 86,113, 46,232,112,164, 91,210, 74, 43, 43,226,179,245,194,194,138,198,236, 73,223, 11, 47, 67,146,218,119,199,198, 8, 78,
-186, 15, 53,107,117,191,196, 43,186,142, 30,101, 37,102, 57,154, 24, 82,110,132,210,216, 13, 35,131, 13, 28,227,204,221, 28,105,
- 57,226,130, 35, 12,129, 57,142,204,243,129,187,195,196,126,180,154,114, 85, 19,131, 25,201, 29,130,209, 22, 42,219,186,137,239,
- 23,162,145, 75,122,212, 59, 47,119,185,231,182, 56, 91,140, 52,222,100, 37,244,203,119, 73,203, 44,185, 94, 88,204,184,200,108,
-103,189,176, 79,204,247,135,166, 0,102, 37, 37,158,196,160,188, 25,205, 38,188, 33,169, 92,212,235,111,142,126,228,225, 15,177,
- 2,117,160,160,251,240,165, 52,202, 93,140,164, 29, 22, 43,212, 36,247,168, 80,197,111,106, 1,152,123, 66,219, 9, 4,180,208,
- 29, 79, 83,128, 20,115,143, 27,141, 23, 78,132,126, 77,211,164,145, 74,101,231,247,144, 45,215, 83,230,245,116,228,229,203, 35,
- 55,198,225,236,192,198, 55,114, 76, 56,103,137, 37, 99,157, 96,194, 70,159,225,164, 59,245,220, 42,185, 53, 90, 81, 17,216,116,
-156,240,198,169, 61,236, 56, 33,173,177, 27, 7, 13, 78,241,106, 11, 93, 80,176, 74,111, 11,216, 10,249,246,192,216,100,117,153,
- 72,171,228, 86, 41,210,150, 76, 30,196, 24, 98,107, 28, 91,163,149,194,126,183,227,208, 42,119,163, 71, 66, 0,171, 52,177,199,
-155, 45,214, 90,110, 94,191,198,253,255,140,189, 89,175,101, 89,122,174,245,140,110, 54,107, 55,209,100, 87,149,174,114,217, 62,
-166, 57,198, 96,176, 64, 66,112,135,184, 6,241, 11,248, 43,254, 79, 72, 71,112, 4, 66,135, 78, 72, 32, 56,198,174, 99,151,211,
-118,101, 85,182, 17,153, 17, 59,118,179,214,108, 70,243,113,241,141,217,172, 29, 59,179,108, 41,157, 85, 81,153,177, 99,239, 53,
-231, 24, 95,243,190,207,107, 45,179,171, 46, 1, 49, 40, 26,171,172,246,170,122,107, 97,113,148,146,233,187,190, 18,249, 28,109,
- 27, 48,166,208, 52, 58,202,118, 62,168, 77,174,122,181,231, 57,105, 92,108,229,225,151, 28,177, 54,208, 53, 61,167, 97, 36, 52,
- 27,230, 85,138,134,229, 8,194, 48, 78,202, 7,219, 25, 37, 82,202,220,190,187,213,172, 6, 44,165,234, 19, 48, 82,119,165,122,
-110,102, 41,244,214, 97,156, 35,229,162,182, 89, 17,156,215,183, 80,127,173,232,174, 23,200, 49,175, 99,244, 98,182,201,147,228,
-154, 99,190,188, 95,245,144, 43, 85,248,230,100,103, 85, 93, 67,139,116, 99,235,188,118,151, 14,139,219,204,195,216,160, 60,131,
-166,237, 41, 73,147,227, 74,205,108,183,117, 13, 96,241,196, 56,227,106,158,186,247,149,211, 81, 3,114, 48,138, 66,165, 6,189,
- 16, 11,243, 48,211,118,126,211,115, 1,221,161,165,187,104, 8,173,227,242,242, 64,215,120,250, 78,195, 84,104,170,255,126,136,
-156,238, 31,248,236,111,127,205,175,127,115, 3,190,227,219,191,252, 21,159,190,236,249, 79,255,252, 79, 24,191,124,205,171, 47,
-222,240,255,253,242, 75,254,225,251,129,219,177,112, 59,103,230,157,163, 37, 45,209,214, 98,136,113,214,147, 89, 44, 34,174, 22,
- 71, 86, 49,189, 57,226, 59,199, 79, 63,254,144, 95,252,244, 35,226,241, 45, 23,141, 94,180,221,225,154,148,132,211, 48,168, 16,
-113, 16,134,185,231, 52, 39, 14,215, 45,111,110,222,208, 31, 46, 49, 99,230,246,126,208,149,215,119,239,104,187, 3,111,223, 29,
-153, 98,226, 56,102, 78, 99,228,110,136,204, 17,166, 57,215,233,144,163,236,238, 45,135,186, 35, 64, 27, 48,111,222, 59,199,204,
- 78,253, 94,145,148,252,136, 21,141,109,103, 46,143,118,237,143,219,101,173, 38,118,193, 49,187, 17,191,236, 51,217,139, 84,130,
-144,173, 80,146,242,163, 9,109,231,199,170, 60, 34,139,153, 29,253,214,236, 40, 54,155,114,123,153, 66, 44,196, 60, 91, 73,106,
-165,198, 32,138,104,245,235,156,230, 56,207, 83, 4, 28,182,230, 14,235,190,101, 9, 0,169,249,200, 24,133,214, 84, 49,138,243,
- 1,223,180, 43,165, 93,147,170,114, 37, 96,185, 53,155, 89,163,147,116, 47,181,236,237,178,232,139, 87, 25,184, 53, 28,131,218,
-145, 43,248,195, 91,139,165,172,118,167,101,215, 21, 99,245,188, 91,207, 69,119,160,175, 66, 56, 99, 20, 81,235,138,208,212,224,
-133,136,102, 87, 15, 82, 48,189, 2, 61, 66, 40,116, 70,247,145, 82,109,116,166,142,240,206, 83,251,246, 1, 38, 59,111,106,217,
-125,118, 98,215, 75,110,227,186,179, 51,177,237,131, 81, 76,173,226, 13,251,167,100, 15,192, 95,158, 53,179,199,189,150, 13, 81,
- 91,105, 44, 59, 65,103, 13,137,177, 60,225,166,216,138, 2,131, 57,239,228,247, 33, 45,123, 27,220, 99,214,193,239,176,204,175,
-252,239, 69, 99, 82, 65, 65,206, 57, 66,211,172, 1, 25,160,214,199, 37,216,193, 57,207, 60, 69,130,111,106, 23, 84,214, 36,175,
-115,254, 3,235,126,179, 84,120,199, 42,170, 19,133,210,204, 41, 43,234,210, 90,122, 28,151,190,225, 33, 78,200,162,196,175, 7,
-247, 56, 71,141,234, 44, 25,147,133,241,120,132, 44, 90, 32,120,203,229,197,129, 97,154,144, 57,210,212, 24, 89,193,226, 27,143,
-169, 54,167, 67,219, 64, 61,184, 91, 99,200, 86,159,237,198, 90, 36, 38,130,136, 38,176, 57, 91,199,235,106,221, 20,163, 5,131,
- 49,134,108, 96,202,194, 40,144,157,129,182,161,185,232,200, 55, 55, 92, 92, 28, 8,214, 49, 14, 39,166,211,132, 55,208,218,140,
- 69,104, 27,171,188, 0, 49, 85, 15,179,140,191,115,213, 6,100,156,215, 66,101,193,214, 46,200,214,103,215,151,228,162, 5,204,
-233, 56,208,117, 29,215,151,151,188,189,185,225,242,112,224,116, 26,116, 47,223, 6,108,232,117,164,158, 18,125,223, 51, 85, 6,
-251,242,215,195,241,168, 42,248,138,123, 16, 81, 11,155,247,129,135,120,143, 51,144,179, 78,248, 66,208,149,223,146,234, 85,234,
-251,149,146,144,142, 5,239, 93, 29,107, 27,210, 28,153,103,189,224, 87,148,119,245, 81,151,204, 74,199, 91,139,191, 82,118,219,
-168, 74,173, 91,166,109,101, 91,225, 57,239,234, 25, 83, 5,109,206, 42,176,202,105, 86,188, 61, 43,184, 45,226, 44, 62, 4,108,
- 8,248,166,193, 57, 8, 54,104,250, 94,213,241,216,224, 85,120, 88, 18,166,174,153,150, 4,186,133,139,111,234,154, 71,137,126,
-202,117,152, 83,228,226,208,174, 5,175,247, 94, 59,219, 38,208,245, 45,125,219, 43,141,209, 26,172,205,196,105,100, 26,225,175,
-255,234,215,124,251,250, 13, 83,129,124,127,162,156, 34, 31,252,222,167,220,127,125,195, 55, 95,125,197, 63,252,250, 53,191,121,
-123,228,205, 49,243,246, 52, 51,227, 40, 86,145,193,206,234, 44,212, 25,191,194, 96, 98, 86, 71, 84, 66,170,147,192, 18,135,194,
-213, 69, 79, 99, 12,199,225,129,214,127,200,199, 31,191,196,150,200,231, 95,126, 75,119,145,120,119, 28,152,115,102, 78, 66,223,
- 6,110,110, 79,124,219, 88,114, 62, 48, 15,145, 25,117, 41,220, 28, 39,181, 91, 78, 35,229,110, 36,166,194, 56, 37,198,164, 59,
-254, 49, 10,243,148,136,185, 16,211,162,114, 55, 20,163,150, 72,231,237, 6,119, 23,193, 27,145, 93,179, 35, 43, 93,109,185,124,
-126,200,199,251, 4,104,123, 61,126,173,181,245,195,218,237,130,205, 6,128,145, 71, 74,228, 21,163, 89,105, 58,152,250,240, 96,
-183, 80,184, 39,132, 79,143, 59, 66,179,156,105, 85, 25,108,216, 49,249,246, 87,255, 78,188, 39,198,214, 11, 85,176,162,253,123,
- 83,129, 10,185, 42,208,157, 85,252,227,156, 18,199, 97,168,177,145,154, 22, 85,138,172, 2, 10, 5,133,232,126, 73,199,148,154,
-160,133,113,132,208, 41,109, 91, 4,201, 51, 82, 65, 31,193,171,101,167, 24,229, 38, 91,231, 84,237, 92,113,169, 69, 42, 4,193,
-128,243,250,239, 27, 17,124,219,212, 23, 47,235,213,151, 51,162,156,141, 85,153,106, 88,252,160, 22, 73,117,148,213, 52, 32, 70,
- 43, 83, 41,216,148,233,156, 99,112,158,217, 58,140, 11, 10, 8,153, 34, 29, 6,103,103,154, 16,152, 81, 28,162,160,118, 17, 35,
-182, 42,227,205,147, 64,182,115, 11,216,166,152,223,216, 21, 59,192,209,114,203,155, 45, 4,197,238, 58,240, 85, 24, 81, 47,123,
- 99, 56, 83,183,139,236,245, 27,143,225, 66,176,207,124, 55,134,117, 7,245,190, 13, 79,206,248,245,143,213,241, 11,245,206,190,
-215,254, 63,138,116,217, 21, 1,194,182,201,178,187,226,117, 81, 4,139, 17,218,174,169, 63, 51, 61, 88,114, 76,120,177, 26, 76,
-146,183,196,167,156,117,242, 83, 12,103, 73,119,234, 72, 88, 46,173,180, 83,211,155, 90, 56,170,181,173, 96,212,175, 28,132, 48,
- 71, 90,129, 75,231, 57,228,196,109, 22,202, 20, 41,181, 35,181, 5,229,185,163, 66, 49, 35, 21,136, 97, 13, 54,120,166, 56,235,
-207,194, 91,198,147,102,131, 7,107,208,100,209,130,171,171, 33,181, 72, 21,134,251, 59,165,137,149, 68, 17,245,161,187,198,212,
- 29,162,170,168, 37,203, 70,212, 55, 14,240,204, 89, 72,232, 78,191, 88,199,253, 60,209,123,129,156, 72,167, 35,193, 57,174,172,
-208, 56,131, 53,202, 35, 23, 89, 38, 74, 22, 83,189,223, 26, 92,146,177, 98,136,121, 91,245, 52, 77,195, 60,207,248,160, 99,122,
-231, 44, 83, 13, 79,105,218,142, 97,138,245,189, 63,225,131,103,158, 39, 14,135,142,121,154, 42, 90, 86,159,175, 82,114, 61, 71,
- 84, 72, 91,170,216,177, 84,168,140,138,203, 68, 89, 19,185, 32,149, 4,152, 75,161, 96,193,234, 59,175, 97, 44,133,148,119,141,
- 79, 49,170,179,169, 33, 46,193,123, 40, 22,169,227,126,169,129, 60,165, 22,111,212,130,112,177,134,200,217, 52,117, 27,163, 75,
-117,196,152,202,121, 55,245, 0,245,193,214, 96, 29,167,103, 89,219, 16,188, 87,146, 28,130,181,129, 12,100,172,234, 21, 12,124,
-242,147, 79,184,121,253,154, 34,179,134,149,212,124,244, 20, 35, 49,205,170,166,175,163, 51,231,220,250,156,106,252,111,213, 52,
- 89,167, 38,145,218,116, 57,107, 72, 41,210, 54, 30, 23, 52,151,222, 85,248,143,119, 26,110,130,192,241,238,158, 62, 55,220, 61,
- 28,249,237, 23, 55,124,246,217, 55, 92, 60,127,193,225,210,242,253,187,111,121,209, 29,232,109,199, 87,191,253,158,223,124,245,
-134, 87,119,137, 87,167,194,109, 20, 38,227,153, 69,227, 83, 84, 20,169, 69,181,179,149,209,111,212,241,100,188,165,105, 60, 49,
-235,243, 96, 49, 48, 70,196, 89,130,205,124,251,221,119,188,248,131,223, 67,162,240,236,195,143,185,125,200,152,182,163,228,145,
-214,119, 28, 79,145,214, 26,134, 4, 99,118, 12,217,112,123,115, 71, 17,199,113, 22,125,206,243,132,111, 58, 78, 67, 98, 28,103,
-230, 2, 99, 18,230, 4, 83, 82,125,149, 24, 75, 46,139,120, 84, 15,187, 92, 1, 66,165, 54,195,126,245, 4,213, 81,179,206,189,
-204, 89,134,250,239,218,142,238,233, 87, 43,195,215,185,243, 36, 43,179,159,158,239, 49,255,155,109,232,108,199, 41,130,216,242,
- 94,215,244,212,215,221, 32, 51,203,158,113,225,193,239, 57,198,156,141,100,237, 14,158,179,120,164, 87, 24,194, 66, 95,170, 9,
- 83,214, 7, 98,206,140,227,164, 31,180, 85,212,234,210, 17,149,170, 50, 93, 70,123,190,107,233,218,134, 28, 75, 85, 52, 7, 74,
- 81,123,152,238,247, 50,173,247, 52,206, 40, 45, 41,163,252, 96,107,241,198, 41,211, 91,114, 77, 58, 82,123,137,113, 58,185,112,
- 21,116, 19, 66, 61, 56,242, 92, 37,176,106, 3,177,213, 74,100,141,219,253, 44,161,111, 60,135,198,211, 88, 72, 37, 34,105,162,
- 20, 75,170, 97, 48, 77,227,176, 35,136,243, 26, 50,147, 51, 46, 70, 26, 11,193, 27, 58,235,153,107,151, 91,214,169,204, 10,122,
- 66,140, 80, 10,239,169,209,101,183,106, 49,166,236,210,196, 88,197,100,155, 8,206,114,166,189, 59,235,230,183,207,206,156,205,
-213,203, 35, 10,162,121, 82,244,185,138,203,164, 84, 23,192, 62,246,245,113,216,176,172,162,187,101, 80,181,239,214,181,243,221,
-127,141,115, 94,252,153,223,238,135,146,220,234,197,222, 52,205, 42, 38,155,231,121,237,176,114, 22, 58,107, 41,149,136,104,173,
- 93,137, 99,219,218,169,212,145,110, 85, 48, 87, 28,165,243,110,221,159, 82,233, 93, 57, 21,146, 24,230, 44, 92, 92, 94,226,166,
- 25,226,204, 44,153, 75,223,208,166, 72,107, 33, 25, 75, 52, 6,227, 61,222,192, 92,178,170,200,165, 96, 26,199, 92, 18, 18, 39,
- 76,112,120, 23, 16, 17,186,174, 37,207,145, 60,142,106,247, 68,187, 94,231, 44, 57,197,213, 14,235, 43, 20,101,129,150, 36,132,
- 33,199,250, 61,235, 38, 80, 19,218, 52, 8, 37,139, 97, 42,137, 36, 25,231, 12, 86, 10,126,158,104,108,226,195,235, 3,151,109,
-171,240, 23, 81, 18,151,243,174,242,239,181,187, 47, 89, 42,255, 65,227,104,131, 15,164, 52, 87,203,223, 57, 96,104, 78,177,174,
- 66, 50,211, 41,234, 59,228,155, 74,231, 75, 88,171,216, 85, 99, 12, 37, 38,188, 51, 72, 86, 91,226,242, 46, 76, 21, 13,155,115,
-169, 90, 8,253,124, 87,128, 74, 46, 24,239, 40, 69,167,119,198,154,154,211, 46, 42,142, 74,185,158,134,101,189,228,150, 2,103,
- 33,243, 33, 64, 90,144,170, 74,166, 83, 36,171, 62, 18,174, 90, 36, 93,219,213, 47, 89,240,182, 81, 86,123,211,208,132,182, 54,
- 33,250, 28, 24, 3,211, 56,114, 56, 28,106,120, 97, 97, 26, 31,116, 79,107, 52, 24,200,250,128,245, 13,197, 25,125, 70,147, 54,
- 42,221,101,167, 68,181, 28,121,241,252, 25,247, 55,111, 24, 78, 81,245, 19,185, 40,234,181,250,203,139,148, 10, 0,147,117, 4,
-191,252, 57,154,224, 48,245,156, 94,184, 14,206,110,171, 43,106, 26,155,190, 43, 13,161, 9, 53,130, 53,241,240,240,192,243,235,
- 11, 94,191,126,224,235, 87,223,243, 15,191,254,154, 40,134,113,142,196,251, 65,237,161,215,207,248,250,155,239,120,247,238,134,
-175,223, 14,124,117, 51,113, 55, 27,142, 73, 24,179, 80,140, 69,114,157,154, 45,199,194,186,242,211,149,149, 49,234,141, 87, 59,
-163, 78,166,134, 49,145, 37,115,209, 92,242,230,110,230,183, 95,189,225, 15, 62,122,193,252,112,228,170,185,166, 76, 17,137, 66,
-113, 58, 61,157,179,240, 48,100,250, 33, 49,156,116, 98,148, 74,161,184,134, 20, 35, 15,227,132,140, 39,230, 57,145, 10, 12, 83,
- 98,206, 48, 69, 33, 21,213,177,136, 49,164, 42,174, 93, 70,139, 57, 87, 36,184, 85,186,157, 90,218, 76, 57, 83,253,150, 42,140,
- 50, 59, 60,236,143, 43,126,117,255,179,140, 90, 23,133,228,190, 48,120,188,130, 52,216, 42,162, 91, 66, 74,228,125,122,215,234,
- 31,183, 63,104,111,123,236,145,183,117, 15,180,128,226, 69,116,172,190, 5,109,213, 3,217,236, 51,177,171,118,160,114,144, 65,
-173, 67,105,217,255,212,125,101,204,234, 55, 94, 8, 80, 75, 39,191,140,236,145, 66,215,182, 28,250, 14,176,250,195,175,227,123,
- 91, 19,185, 36, 69,218,160, 7,102,235,212,218, 82,114,194,161,163, 72, 35, 66, 78,170,100,183, 70,240,193, 85,149,168,169,149,
-170,175, 2,133,130,145,229,195,172, 81,174, 53,181, 72,213,220, 91, 60,168,119,150,198, 25, 72, 35,227,124,210,238,160,204,122,
-184,164, 68, 49,138,192,244,126,217,233, 25,114, 54,196,148, 40, 1,154,226,232,188, 91, 11, 4,169,186,193,101, 60, 44,219,243,
-181, 2, 93,100,247,139, 75,122, 95,161,108, 85,252,227, 45,244,162, 4, 63,191,189,183,207,236, 17, 20,102,243,128,155,179, 61,
-122, 5, 73,159,221,169,239,185, 59,120,228,248, 48,101,229,215, 27,243,136,156,104,158, 38,226,157,169, 1,126,199, 20,105, 29,
-254,155, 85,137, 80,197, 74, 42,194,122, 56, 30, 53, 87, 92,150,124,230,101,180,110,171,186, 93,237,145,243,156,222,243,247, 75,
-229, 39, 44,248, 96, 74,193,225,107,226,151,236, 96, 62,142, 40,137,177, 20,230,156,184, 52, 66, 35,133, 11,231, 57, 1,151,141,
- 80,176,164, 82,136,198,104,252,170, 8, 23,135, 3, 50,142,106, 5, 43,153,139,190,175, 93, 65,169, 28,244,172, 41, 82,198,172,
-231, 69,240,158,182,211,208,148,185, 40,169, 44, 75,193,138,238, 41,103, 41, 68, 17,166,172,190,113, 35,224, 98,141, 21,205,250,
- 44,207, 34, 76, 37, 18, 75,193, 6, 8, 82,184,104, 3, 47, 46, 90, 62,184,238,105,125,192, 91, 32, 27, 74, 49,196, 34, 36, 50,
- 99, 76,106,183,203,162,130,162, 12,177,234, 65,176,144,196, 16,115,161,233, 58, 82,206,170, 96, 78,137, 41,206,116, 11, 24,167,
-198,100,158, 30, 78,245, 60, 48, 72,170, 43, 49, 32,197, 25,145, 82,167,111,149,235, 93,149,228,169,142,150, 1,250,190, 87,225,
-216,226,182,112,250, 94,166,250, 94,148,229,157, 89, 18,228,164, 18, 34,139,190,199, 49,103,172,111,149,111,239,180, 19,115,174,
-118,199, 8,215, 87,151,120,239, 25,167, 17,235, 29, 93,223, 51,156, 6, 94,190,124, 65,219,182,220,223,222,241,242,229, 11, 68,
-132,219,251,123, 62,254,228, 19,134, 97,100, 56, 13,180, 93,199,225,208, 51, 79, 51,119,247,183,188,124,249, 18,201,145,105, 26,
- 56,205, 35,199,211, 73,133,183,110,209, 73,204,224,148,133,225,156,234,112,140, 13,204,243,140,164,145, 47,126,243, 57, 18,103,
-218,182,213,239,109, 86,166,128,130, 99,156, 90,230, 22, 69, 78, 93, 49, 57,167,231, 77, 74, 66,168,217, 8, 6, 48,182, 78, 90,
-237,182, 6,208, 9, 1, 52,109,187, 78,184,166, 56, 50,142,153, 57,194,215,223,188,225,239,255,241, 11,230, 92,248,224,195,151,
- 76,227,196,221,219,119,188,188,190,230,112,125,197, 55, 95,124,201,171,239,222,241,230,126,226,221,152, 25, 18,196, 92,137,164,
- 53, 6, 22,103,214, 85,111,170,110, 37,138,213,207, 43,101,166, 52, 19,124, 75,215,118,117,205, 7,113,154, 57, 30, 51, 95,167,
-129,119,223,221,114,243,234, 53,127,242,139,159,241,233,167,159, 80,172,231, 56,207, 36, 25,233,131,231,254, 97,192, 42,120,130,
-156,171, 8,214, 5, 4,203,241, 52, 49,198,204,156, 34, 49,234,132,103,138,153, 88, 44,211,148, 17,235,171, 21,178,118,236, 44,
- 33, 65,218, 96,165, 92, 86, 13,138,103, 53,175, 75, 69, 17,150,243,243,113,133,208,252,176,118,173,156, 5, 85,109,201,104,251,
- 49,183,221, 29,124,182,216, 13,212,177,116,111,143, 14, 79,131, 86,194,107, 8,236,143, 48,229,159,156,132, 62,134,213,152,141,
- 46,167,132,170,178, 94,233,206,106,165,104, 37,107, 39, 90, 71,103,212, 76,225, 44,133, 84,197, 31,170,108,215,200,193,178, 8,
- 86, 42,207,185, 13,129,139,195, 1,239, 2,195, 52, 99, 69, 71,101, 26,179,151,145,156,232,130,167,117,170, 92, 55, 57,146,102,
-205,116,238,186,182, 30, 24,117, 44, 21, 2,222,148, 26,228,162,236,106,237,112,212, 7, 43, 69, 71,212,190, 22, 25,110, 9,117,
-145, 66,138,139, 45, 73,189,163,197,170,191,184, 44,158, 30, 99,112, 38, 49,215,162,106,158, 20, 89,233,157,193, 36,157,142, 88,
- 87,201,100, 49,210,120, 71,227,131,238,157,170,141, 48, 9,155, 80,203,108, 16, 29,138,121,130, 64,183, 83,153,153,157,135,189,
- 58, 10,150, 61,157, 61,187, 52,215, 45,250,106,165, 91,158, 9,121,148,223,126, 22,169,186, 48,170,207, 36,120, 79, 57, 54,246,
-127, 70,183, 70,176,136,236,170, 0,171, 96,143,205,142,183, 55,231,203, 57, 89,239, 41, 15,191,216,117,213, 84,100,155, 60, 44,
-243,171,146, 51,190,104,167,166,204,112, 5,120,104, 70,179,134, 52,248,224, 25,199, 89,195, 33,154,134, 24, 79,235,200,116,209,
- 52, 44,197,244,226,129, 95, 14,205,141,236,165,169,133,198,232,218,229, 56, 78, 60,247, 30,151, 19,185, 8,173,192,243,198, 51,
- 77, 51,157,181, 68,171, 19, 28, 9,142, 97, 28,176,214,209,121,203, 56, 36,152,102,186,182,195, 90,207, 52, 69, 29, 33,231,140,
-119, 85, 12, 90,167,117,183,119,247,186, 27,183, 48,204, 74, 97, 27,166, 76, 22,171,148,194,224,136, 46,172,225, 33,206, 24, 76,
-214,131, 86, 74, 66,156,101, 50, 5, 19,132, 6,225, 50,120, 62,185, 62,240,241,245, 21,141, 99,141, 39, 30,147,142, 64,139, 49,
- 76, 73, 56, 85,208, 79, 1,154,174,195, 68, 33,207, 17, 49, 26, 67, 44, 2,198, 7,165,155,165, 68, 8,129, 97, 28,105,219,150,
-211,105,208, 36,195, 16, 56,244, 61,199,219,251,138, 72,213, 34,231,242,242, 66,177,203,206,147,146,218,244, 98, 76,107,178,224,
-146,244, 86, 74,209,105, 73, 61, 28, 75,210, 72,230, 38,120,181,121, 57,200,197, 48,167,132,115,158, 24, 39,172, 11, 56,235,153,
- 78,199,170,181,128,171,235,231, 92, 94, 63, 35,180, 61,195, 48,112, 56, 28,184,184,184, 84, 91, 83,156,249,248,227,143,152,167,
-145,219,119,183, 60,127,241,146, 82, 10,239,110,223,241,225, 39,159,112,119,119, 79,119,117,137,235, 90,238,239,238,193, 59,166,
-146, 73, 6,142,105,166,109, 46,136, 8,147, 36, 34, 74, 70,203, 2,197, 26,196,123,230, 2,109, 13,127, 50,206,227,172, 39,149,
-204, 56,205,120,171,192, 26,138,238,188, 93,176, 12, 15,119,180, 94, 93, 24,125,219, 65, 8,148,250,243,200,185,208,120, 71,156,
-231,181, 25, 18,145, 53,172, 69,106,161,105, 69, 61,245,203, 57,183, 88,223,188,181, 26, 59, 92,197,116,170,232,215,201,147, 15,
- 61,255,240,197,107,254,234,175, 63, 35, 38,248,244,211,143, 85,139,144,149,177, 80,114,225,235, 87,175,249,250,251, 27,110, 79,
-145,155,177,112,140,133, 33,150, 53, 52,186, 84,214,199,246, 46,171,154,159, 34,164,152,215, 51,203,123,141, 66, 30,135,137,139,
-195,129, 34,133, 81, 18,199, 2,173, 9,124,252,209, 75, 62,252,232, 0,206,242,230,251,215,164, 89,223,233,148, 11,209,137,250,
-213,231,194,253,113, 38,101,165,124,166,148,212, 53, 33,134,152, 21, 0, 53, 71,117, 64,229, 34, 36,109, 81, 86,192,214,222,218,
-188, 89, 62,245,172,206, 69,239, 14, 47,198,213,145,228,158,231,190, 23, 22,169, 21,235,199,247,233, 63,160,122, 22,221, 63, 26,
-171,135,155,221, 5,194,172,128, 14, 28,197,148,149,142,182,239,228,255, 41, 35,255, 31,251, 19, 45, 99, 75,163, 56,163,247, 96,
- 41, 70,234,134,116,141,140,205, 27,101, 73, 74, 21,216, 80, 45, 35,105,197, 55, 46, 88, 78, 29,137,233,207,166,105, 90,174,175,
-174, 42, 90,115,196, 20,237,255,125,112,234, 17,205,154,180,214, 58, 71,103, 29,150,204, 52, 30,235, 40, 61, 64, 81,127, 58, 53,
-183,215, 26, 67, 48, 89,153,219,193,173, 16,146, 18, 35,146,150,221,154, 35,216,170, 70,207,153,152, 39, 36,151,149,174, 7, 6,
-177,218,129,121, 11,222,171,221,105,156, 39,172,100, 92, 86, 79,189, 56, 79, 17, 37, 85, 89, 73, 85, 45,172,151,105,206,106, 7,
- 10,162, 2,175,136, 94, 12, 75,154,164, 44,158,113,243, 20, 8, 70,214,144,147,237, 34,173, 83,156, 82, 25,208,187, 66,172,172,
-110, 71, 89,215, 53,122,161,111, 19,160,205, 59,126, 62,134, 63, 11, 88, 41,156,237,208, 31, 95,236,249,145, 39,253, 44,242,117,
- 63,130,175, 22, 58, 5,105,236, 81,195,188,151, 70,247,212,255, 45, 4,172, 69, 66,185, 44,130,182,125,187,101,152,226, 25, 55,
-191, 36, 13, 11,194, 64,140, 26, 15,106,173,238,202,251,174,103, 28,166,213,143,188,247,232,111, 56,102,197,182,182,109,139, 72,
- 90,247,240,186,175,207,204,100,108, 19,112,115,193, 6, 71,202,130,143,145, 75,231, 24,124,224,148, 51,167,146,213, 22, 52, 70,
- 50, 66,219,117, 76,243, 76,227, 60,109, 8,107,119,222, 58,125,150, 92, 27, 24,243, 76, 82,123, 2, 38, 27,162, 42,221,152,103,
- 85,142, 91,231, 72,101,198,122, 67,235, 28,138,122, 8,106, 17, 21,203, 92,253,241, 49,102, 82, 73, 42,170, 44,133, 62,120, 14,
- 22, 94, 30, 90, 62,184,236,232, 61,228,168, 7,162, 88,213,119, 20, 68, 39, 11,176,198,177,230,156,152, 99, 34, 39,221,155,199,
-156,152, 79, 35,198,121,114,222, 88,229,167,211, 73, 71,225,162,239, 97,169,254,235,156, 51,221,161,199, 90,203,241,248,160,185,
-235, 82, 56,158, 78,244,125,143,243, 13,136,197,123,157,164, 44,107, 56, 91,169,144,165, 20,198, 97,192, 89,205,113,104,219, 6,
- 73, 73,149,212, 89, 42,196, 69,199,165,161,239,244,103, 29,103,157,154, 57,203,135, 31,126,192,207,126,254, 11,230,148,185,123,
-120,224,226,250,138, 23,207, 95, 48, 12, 35,183, 15,247,188,124,249,146,119,247,183, 8,194,152,102, 82, 78, 12,211,192, 24, 71,
-166, 60,145, 72,100, 43,248,190,161, 43, 29,233, 33,242,193, 7,207, 56,158, 78,136, 73,248, 0, 31,127,242,146,211,241, 30, 99,
- 34, 63,255,197, 79,184,186,186,226,179,207,254, 30,231, 29,183,247,247, 20,171,244, 59, 93, 39, 60,224,172,225,242,112,193,179,
-139, 3, 87,135, 3, 72, 38,151,168,186, 32,167,156,122,165,175,165,117,130,217,120,175, 12, 14,187, 89, 45,237, 78, 80,235,156,
- 83,150,192,226,242,201,218,201,122,107, 86,109,144,175,200, 94, 83,207, 81, 45,140, 29,195, 36,188,187,123,199, 63,254,250, 75,
-164,105,185,184, 82,167,206, 87, 95,191,230,225,230,134,143, 95,126, 72, 42,112,115,115,203,205,237,200,219,251,153,251,185,112,
- 74,234,222,136, 8, 88, 95, 99,189, 13,150,178,105,121, 28,120,235, 40, 53,102, 92, 41,120,126, 69,118,223, 31,239,232,251,142,
- 11,223,208, 97,185,118, 14, 51, 79, 60,127,241, 41, 31, 60,191,226,246,118,170,147, 0,163,132,209, 92, 39,107,198, 96, 71,189,
- 59, 82, 41,250,133,196,114, 26,103, 50,174, 22,158,166, 58, 33,150, 64, 45, 5, 55,109, 42, 34,187,158,165,171,187,108, 39, 25,
-246, 79,130, 64,140,188,215,121, 63, 25,174, 81,119,142, 26,222, 32,171, 55,119,197, 1, 86, 47,162,148,178, 27,145,234,174,107,
- 25,201,170,168, 72, 47,159,229, 2,126, 47,146,181,168, 10, 95,156,252, 14,185,158, 89,149,148,102,191,135,223, 31,174, 34,235,
- 72, 92, 71,152,154, 74,230,216,170,159, 61,167, 62,215, 10,124,185,208, 13,154,169,158, 37, 35,162, 48,154, 54, 52, 92, 93, 94,
-210,182, 93,141, 60, 84,136,129,113,134, 16,156,102, 51,139,238,244,122, 31,104,172, 35,142, 51, 86,132,182, 9,154, 48, 28,103,
-140,115,120,175, 59, 35, 3, 52, 36, 28, 5, 73, 69,247,154,113, 70, 74,161, 9,161,138, 86, 64,210, 76, 41, 73, 35, 61, 37,175,
- 56, 69, 89,114,207,173,169, 91,186,172,213, 94, 22,130, 51, 24, 27,112, 86, 56, 14,137,185,238,247,140,100, 26, 99,152,150,112,
- 6, 83,185,219,185,224,235,206,203,162,190,219,117,255, 37, 90,241,238, 17,194,143, 9,130, 43, 24,161,142,221,197, 44, 41,123,
-143, 99, 89, 55, 96,204,234,184, 49, 91,207,110,173,232,248,138, 93, 65,240, 40, 65,110,253,231,215,209,230, 6,143, 49,107,103,
-109, 30,185, 36, 55,146,190, 49,178,121,217,119, 83,133, 21,143,185, 8,232,204, 35,127,199, 35, 61,169, 26, 21,204, 6,153, 53,
-239,255, 51, 27,243, 94,200, 89,125,188,198,194, 48, 77, 74,244,139, 51,165,120,218,182,229, 56, 28, 65,116,162,243,240,112,218,
-198,239,156, 23,227,203,133, 52, 77, 83, 29, 45,171,135,217,213,200,222, 41, 69,220,213, 53,109, 99, 49,131,240,112,127,162,241,
-158,124, 58,209,249,134,166, 0,115,196, 89,135,175,239, 76,142,154, 18,118, 56, 28, 84,107, 34,133, 52, 69,196, 26,162,133,113,
- 26, 16,175,227,227,214,183,144, 11,105, 69, 20,171,152,206,121,199, 85,219,241,236,186,231,170,235,112,149,207, 94,114,210,192,
- 21,241,136,117, 28,231,196,195, 48, 65,202,244,237,129, 11,239, 56,120,195,101, 48,184,148,240,109,192,134, 70, 85,252, 21,140,
-146,115,214,182, 35,102, 92, 21,215, 46,239,114,170, 34,185, 41,170,210, 56,198,200,245,197, 21,167,113,212,103,222,168,223,219,
- 58,171,107, 16,231, 56, 13, 35,215, 87, 87, 20, 18, 41,205,248,202,208, 63, 13, 3,198, 7, 45, 32, 74,198,155,176, 19, 44,218,
-173, 29, 49, 26,157,234,125,160,241, 53,134,217, 26, 8,129,152,245,201, 19, 84, 20, 0, 0, 32, 0, 73, 68, 65, 84,125, 57,157,
- 70,196,120,166,156,112,141, 37, 27, 40, 86,255,242,222,241,236,197,115, 78,243, 72, 17,195, 48,158,120,241,226, 37,115,156,201,
-162,170,125,172, 38,223,165,148, 48,254,132,177,208,118,129, 41,122, 46, 46,123, 10,153,135,227,204, 71, 63,249,144,225,216,227,
-191,135,255,224, 79,255, 57,199,211,137,223,252,246,183, 12,227,145, 63,255,143,254, 61,190,250,234, 75, 90, 95, 40,105,228,211,
- 79,255, 25,211,116,226,175,254,242,175,177,214, 48,143, 19,141,183,244,125,203,135, 31,124, 76, 31, 60,125,112,196,225, 68, 99,
-162,142,145, 41,117,121,169, 19,197, 88,213,248, 37, 23,205,186,112,134,132,106, 15,124,213,122,152, 58,245, 92,196,200,214,185,
-202, 48,171,239,158,213,112, 34,231,106,120, 75, 45,108, 77,229, 45,148, 34,140,177,240,245,171,175,249,250,155,239,112,109,224,
-197,135, 47,112,214,112,104, 58,242,156,185,191,121,224,251,155, 91,174,250, 3,119,239,142,220, 31,103,198, 40, 36,156, 70,165,
-162,231,180, 6, 43, 45,247,120,205,208, 48, 26, 75, 61,231,172, 98,226, 5,195, 92,170, 70, 75,244,188, 76,146,112, 53,203,124,
-154, 31, 72, 93,195,191,254, 55,127,197,103,109,199,245,245, 39,140,146, 73, 37, 43,241,176,212, 38, 72, 10, 89,102,156, 61,111,
-102,198, 40,204, 37,214,180,181, 10,226, 17, 77,124,204, 11, 1,115,167, 65, 19,217, 1, 90,106, 2, 94, 29,119, 47,227,119,229,
- 13, 83,169, 70,103, 23,185, 49,171, 39,238,220,171, 86,200, 75, 87,229,214,223,111, 85,192, 87,173, 45,105,185, 92,106,254,182,
-117,110, 49, 57,238, 44,109,117,191,106,158,238,194,203, 34,152,147, 31,232,210, 69,214,208, 7, 43,118,119,185,215,255, 92,168,
- 66, 13, 22, 74,174, 10, 35, 86,193,193, 92,125,210,186, 71, 76, 18, 41,166,172,180,164, 66,161,241,129,198, 7,165, 55, 89, 75,
-142, 58,193, 8,190,229,162,191,160,111, 14, 56, 49, 76,211,128, 69,187,235,208,182, 24,107, 24, 6,101,119, 55, 53,219, 56,231,
-153,156, 35,173,215,199, 40, 38,245,170,135,208,208,132,158,166,233,235,169, 52, 48, 77, 3,243,168, 2, 42, 43,134,182,233,116,
- 68,149, 19,165,204,136,196,213, 29, 96,173, 10,229, 52,236, 66,118, 31,190, 80, 72, 43,156,199, 57,175,251,220, 70,247,180, 57,
-203,163,148, 60,181,162, 24,103, 86, 30,185,149, 66,103,132, 99, 21,229,136,206,173, 40, 69,214, 78,116,173, 23,237,227,207,181,
-170,199,243,238, 51, 53,203,252,199,108,255,222,238, 18,167, 62,141,103,133,130, 20,150, 79,119,165,199,153,178,235,173,205, 89,
-135,111,118,210,115,169, 8,224,149,173,176, 72,244,204, 14, 70, 83,159, 49, 67,169, 26,137,165,248,144,117, 61,148, 41,213,230,
-105,223, 47,118, 31,135, 24, 33, 63, 72,217, 59,219, 13, 44,191,148,151,212, 42,199,156,244,112, 31,231, 25,140,195, 4,199,195,
-112,228,217,179,103,100,150, 40,206, 26, 94,178, 85, 62,235, 79, 77, 35,116,149, 85,144,242,132, 96,112, 57, 19,109,102,122,214,
-208,245,207, 49,111,222, 17, 68, 85,239,210,118,204, 41,227, 16, 46, 27,175,193, 63,177,168,136, 8, 7, 38,115,154, 6,230,152,
-116, 71,237, 2,217, 24,108, 19,200, 49,106,136,136,209, 28,113, 7,186,102, 10,142,143,174, 15, 52,222,208,183, 13,141, 55, 92,
- 31, 90,156,129,113,200, 76, 69, 24, 99,197,127,198,140, 49,145, 67,223,242,209, 69,135, 41, 66,231, 91, 36, 69,210, 52, 32, 89,
- 51,212, 53, 35,193, 98,178, 22,151,169, 22,209,161,109, 73,197, 50,166,172,194,174, 92, 35, 60,189,224,155,134, 76,169,124, 7,
- 21,243, 81, 84, 57, 94,114,225,112, 56,168, 39,223, 90,154,208, 16, 99, 98, 60, 13,120,103,117,138, 6, 76,243,132, 53,190,230,
- 53,104, 23,151,227,188, 65, 84,140,165, 13, 45,193, 7, 88,180, 52, 37, 65, 54, 56,171,255,251,226, 45, 31,198,204,148, 11,201,
- 8,184, 90,160,212,204,115, 99, 45,182,113,116,151, 61,130,101,142,122,222, 52, 93,171,148,202, 24, 41, 57,114,125,217,171,222,
-166, 10,213,158,189,188,198, 88, 33,116,150,159,253,236, 35, 78,199,158,223,124,126,228,143,126,246, 9,239,110,110,120,247,250,
- 43, 74, 30,249,248,163, 23, 60,220,223,240,255,252,235,207,120,251,230,123,198,225,196,221,195, 3,191,250,236,239,121,243,230,
-134,121,140, 12,247,119, 92,245, 13, 57, 24,158, 95, 95,113,232, 90,188, 85, 7, 77,153,103,164, 68,198, 73,199,231, 62,120,189,
-228,168, 62,248,106,111,116,206, 97,157, 35,230, 72,104, 27, 82,156,107, 58, 93,253,249, 85,175,186,212,206,215,186, 80,109,156,
-245,243,243,218, 57, 55,214, 84,108, 55, 88,167, 5,226,237, 48,241,234,187, 91,238,222,221,114,104, 3, 63,249,240, 37,215,215,
- 87,228,148,248,246,155,215,124,243,197,183, 26,175,139,231,179,223,126,207, 52,213,221,180, 8, 83,169,185, 23,168, 13,174,102,
- 90,107,190,198, 50, 93,174,119, 85, 65,240,141,215, 96,171,152,241, 14,218,198, 83,138, 22,172,207,159, 95,209, 53,150, 79, 94,
-126,192,112,115, 75,156, 79,124,240,236,154,121, 46,220,142,134, 99, 22,146,181,117, 45,170,124, 3,113,142,211, 20,215,113,191,
-110,104, 44, 99,170,201,158,232,170, 76,170,146, 29,244,103,148,113, 53,107, 97, 59, 87, 77,213, 36, 44,106, 50,169,106, 94,127,
- 46,229,121, 60,146, 52, 27, 49,110,119, 24, 47,221,146,152, 82, 15, 74,139, 60, 26,123,111, 60,239,154, 36,195,178, 79, 45,154,
-215,109,159,202, 74,251, 17, 92,232,163,224,140,115,194,215,182,112, 88, 58,169,125,183,109,246,195,135,245,255,217,181,165, 91,
-133,126, 82,176, 89, 86, 42,215,146,119,172, 65, 3,126, 29, 15,149,202,218, 13, 62,112,232, 15, 28,250,131,230,236, 78, 51, 37,
-234,238,243,112,113,137,111, 60,227, 60,145, 83,194, 27,165, 52, 25, 10,113, 30,245, 69,119,154,226,150,165,224,124, 67, 8, 13,
-161,105,240, 94,179,177,199,147, 48, 12,170, 54,109,131,163, 13,158,198,219,106,137, 83,244,236, 34, 72,172, 65,134, 42,156, 90,
-108, 46,118,211, 42, 72,169,194,191,154,158,100, 44,180,125, 75,223, 54,204, 67,229,215, 47, 1, 45,102, 71, 89, 91,198,210,162,
-254, 95, 91, 47,124, 41,250,251, 72,165, 27, 89,217,113,215,139, 89,161, 17, 11,174,116, 31,164,178, 60,109, 89,100, 83,155,214,
-221,229, 50,166,151, 61,107,125, 55, 34,183,178,137, 48,247,126,115,150,201,207,218, 77,115,174,165, 88,145,199, 85, 40, 41, 79,
-217, 43,119, 33, 44,121,155, 86,101,246, 25,239, 11,164,233,199,159, 93, 83,179,159,237, 99,170,225,153,104,244,125,103,201,194,
- 61, 8,162,187,180,156, 11, 15,195,192,197,161,199, 88,237, 34,219,174,227,120, 28,200, 49,157, 7,216,239, 95, 5, 49,228, 41,
-210,245, 61,216,192, 24, 35,141, 24,198, 12,183,211, 68,247,233, 79,137,227,132,153, 51, 99,126, 32, 99, 41, 38,130, 41, 74, 49,
- 44, 26,110, 34,198,114,204,145, 83,156,170,150, 66,195, 81,196, 26, 82,201,184,172, 1, 27, 37,101,130,129, 67,215,113,209,119,
- 92,116, 45,109,125, 86, 77,201,180,174,208,133,128,149, 77, 59, 48,140, 35,121, 39,130, 77,211,140, 80,232,250, 14,135,165, 49,
-154, 93, 29,188, 2, 79,140, 44,211, 8, 75,219,182,148, 41, 18, 92,141,127,173,132,187,182,107,137, 69,177,164,243, 60,115, 56,
- 28, 20,130,211, 31, 24, 78, 19, 93,119, 96, 24, 7,154,106, 15, 77, 20,142,199, 7,124, 19,184,232,123,198,105, 90, 73,114,234,
- 57, 47, 92, 94, 94,106,163,146,102,226, 56,211,180,170,136,247,206, 86, 33,151,254, 94,173,213,117, 2, 56, 93,145,121, 91,115,
- 34, 84,245, 31, 83, 98,156, 19, 15,195, 72,198, 18,218, 14,172,197, 22, 85,222, 59,107,153,230,153, 16, 26, 14,253, 5, 93,127,
-224,238,225,158, 92,102, 94,188,184,224,159,253,225, 31,242,112,127,207,171,111, 3,125,223,242,179,159,255,140,148, 51,215, 87,
- 29,222, 59, 62,248,232, 3,254,230,111,255,134, 82, 18, 63,253,244,167, 60, 60,220,243,219, 47,190,224,217,213, 53,223,189,121,
-195,255,242,191,255,111,252,252,103,191,207,195,253, 3,167,135,129,255,233, 95,254,143,244, 93,199, 56, 12,152, 92,248,230,183,
- 95,112,209,247, 92,116, 45, 31, 60,187, 98, 60, 30, 85, 44, 39,133, 52,205, 56, 67, 93, 49, 56,166, 73,113,184, 57, 37,125,111,
-139,212,201,237,130, 60, 78, 20,167, 22, 95, 31,194,138,249, 53,133,202, 79,216,208,205,202, 4, 73, 88,231, 85,159, 36, 82,247,
-235,158,182, 11, 56,223,224,187, 3,197,182,124,251,246,129,175, 95,189,102,142,194,139,171, 75, 62,254,248, 39, 4,223,240,237,
- 55,223, 50,156, 38, 94,191,126,203,187,219, 7,154,230, 64,119,184,226,213,205,145, 57, 9,221,225,160,122, 1, 35,149,200,231,
- 54, 54, 73, 29,183,151, 82, 40, 6, 98, 78, 43, 63,160,241, 94,173,125,142,245, 92,116,235, 52,210,210,134,192,195,253, 61,151,
- 93,199,193,121,158, 95, 63,227,251, 55,119,220,221,223, 51,141,137, 8, 24,111, 87,252,182, 58,128, 52,166, 91,245, 4,218,245,
- 47, 54,181, 82,215,131, 2,216, 82,214,102, 99,117,225,236, 5,233, 98, 43,181,117, 1,129, 41,133,212,111,167,218, 6,156, 57,
- 15,217,220,237, 61,165,108,244,183,157, 80,200, 60,146,182,239,109,104,171,207,221, 84,214,182,252,211, 16,162,143, 59,155,167,
- 66, 97, 86,186,215, 89,184,136,249, 17,182,248,102,243, 17,179, 93, 48,219, 28, 68,103,190,154,126,180, 9,142,124, 8, 58, 90,
-154,230,245,162, 55, 34,180,109, 67,219, 52,136,136, 6, 96,196,132,111, 2,125,127,160,109, 59,178, 36,230,113,164,164,168,123,
-242, 82, 84, 92,151, 34,182,209,220,225,152, 18, 66,245, 96, 86,192,141, 49, 26, 17, 57,140, 19, 57, 21, 14, 77,195,161,241,120,
-167, 99,178,146,166,170, 54,174,108, 69,217,138,155,178,208,201,234,197,152,151,139,185,212,236,237,172, 23,186,119,250, 18,118,
-109,224, 52, 39,245, 34, 87,209,218,130,165,149, 34,152,160,225, 1,190,142,195,189, 57,247,254, 75,141, 4, 93,198, 65,203,196,
-197,236,193, 49, 5,246, 94, 53, 49,219,192,123, 25,163, 27, 35, 72, 54,171,104,115,209, 94, 60,250,176,215,180,167, 53,195,124,
-153, 2,152,173,130,205, 43, 19,161, 10,241,204, 35, 28,146,236, 60,242,230,177, 45,109, 55, 57,216, 49,227,247,226, 60,179, 92,
-236,143,116,125,242,136,113, 36,108,110,138,213,103,127,182,217, 50,187,126,127, 81,212,233, 88, 50,141, 51, 49,105,146,223,112,
- 84, 26,153, 53,142,227,105,226,249,243, 23,164,124,170,138, 87,179, 65,120,170,176,104,111, 11, 45,195, 72,211,181,136,133,113,
-142,132,226,248,254, 56,112,114,134,111, 31,238,249,236,205, 91,190, 24, 50,247, 49,115,140, 51,209, 26,162,181, 76, 2, 15,121,
-224, 84, 10,147, 1,241,141, 38,106,213, 81,119,138, 19,222, 41, 48,195, 55,158,195, 33,112,125,209,115,209,245, 75, 6, 8, 70,
- 82,237,226, 10,141, 85, 49,167,160,124,244, 41, 70,166,121, 86, 40,147,245,136,213,200,211, 34, 89,105, 93,214,147, 76,170,246,
- 76,139,201,145,198, 7,188, 49,180,141,103,152, 18, 22, 45, 64,164,166,136, 57,163,122,152, 20,179, 54,203, 37, 51, 79,147, 70,
-148, 86,239,248,225,112,201, 28,147, 62,203,213,110, 69,181,203, 29,186, 70,247,196,185,128, 20,218,182, 33,198, 72,140,177,170,
-183,161, 9, 30,138,208,134,160,226,212, 90,176,174,212,185,162,127, 15,189,230,109, 59,239,215,220,116,113,134, 49,206,204,165,
-224,219, 22,235,213,107,220,250, 78,249,242, 78,147,193,154,182,225, 23,191,247, 9,151,207,159,113,123,127,199, 87, 95,101, 94,
- 62,235,249,253,159,125,204,195,177,231,208, 25,110,222,189,229,207,254,236,223,229,219, 87,223,114,113, 25,248,155,191,249, 91,
- 62,250,248, 37, 34,153, 95,254,242,223,240, 39,127,242,167, 28, 79, 51,191,250,187,191,228,195, 15, 62,164,136,229,243,207,191,
-228,221,205, 29,222, 58,130,177,164, 97,100, 78,170, 91,184,188,184,210, 2,180,134,115, 5,106, 98, 95,209,169,102, 26, 71, 92,
-219,110, 46, 17, 50,113,158,201,214, 16, 26,229,179, 47,243, 43, 91,135,174,211,112,210, 98,205, 24, 82, 84,156,172, 53,106,227,
-125, 12, 43,179, 21,150, 21,156,195, 81, 8, 24,218,182,163,233,123, 76,215, 50,137,231,213,171, 27,222,188,187, 81,142,137, 49,
-204,177,240,229,215,223,112,209,181, 4,239,185, 31, 34, 55,199,200,105,182,140, 69, 56,149,153,104, 60,217, 22,138,211,145,123,
-206, 89, 17,171, 41, 86, 61, 85,169,153, 71,149,158, 87, 87,132,172,226,216,138,237,206,153,165,206, 79, 57,114,117,125,201, 52,
- 76,156, 76,164,247,158, 49, 39,186,222,114,125,125,201,241, 97,100,206,142, 60,103,196, 57,210,186,151,175,220,127, 84,148,104,
-178, 84, 55, 80, 94,207,197, 37,216, 74,113,201,230, 44,195, 98,157,188, 46, 13,243, 26,168,179, 3,164, 27,131, 63,159, 3,154,
-247,243,202,215,147,170,108,151,249,126, 15,105, 30, 9,135,100, 39, 98,218, 93,196,203, 37,233,140,253, 39, 39,119,253,144,149,
-104,191,246, 95, 52,125,118, 31, 7, 43, 63,204, 31,223,243,238,182, 80, 16,187, 27, 1,171,133, 34,149,234, 49,183,170, 60,223,
-126,144, 58,198, 13,193,211, 54, 30,131,104,120, 66, 86, 6,119,211,116,132,182,165,148,194, 52, 77, 21,161,105, 9, 22,172,100,
-114,154,241, 70, 95,128,152, 51, 83,138,244,125, 75,219,245,184, 58,146,154,166,145,113, 28,200, 57,209,181,129,206, 27, 60,137,
- 50, 13, 80,180, 59, 89,210,149, 20, 48, 82,214,139,214,219,109, 77,146,170,168, 68,119, 86,218, 29,121,235,170,138,188,144,162,
- 42,121,131,119,164, 28,215, 11,185,236, 49,106, 75,176, 66, 61,168,247, 30,237,101,111,169, 58, 4,251,168, 12,220, 37,176,237,
- 0, 71, 98,247,209, 98,122, 32, 47,117,159, 90, 53, 42, 55,125,177,146, 47, 97, 53, 75,182,107,217, 32, 49,171,221,109, 23,228,
- 34,123,100,171, 89,233,217,143,180, 32,118,157, 8,108, 42,122,195,227,169,213, 82, 98,240, 40, 5,206, 84, 27,220, 15,234, 58,
-204,242,115,172,223,196,163,100, 65,115, 70,195, 51, 91,113,106, 52, 4,196, 90,253, 76, 99,142, 52,226,201, 25, 78,131,230, 94,
-207,115,174, 57,203, 13,243,120,220,172,127,236,181, 3,117, 32, 87,247,162,185,122,148,135,148,113, 24,126,123,115,195,169,237,
-248,187,251,123,254,223,239,111,248, 34, 27,230,166, 37, 89,203, 28,163,134,180,228,162, 54, 49, 99, 41,222, 32,113,166,113,142,
- 38, 88,154,160,207,121, 31,172, 38,136, 57, 75,223, 6,181,174,197, 84,199,207,172,202,101, 95,243,178,157,247, 76,115,226, 52,
-233,133, 46, 21,242,209, 4,207, 92, 53, 0,177, 68,245,126,155,154, 90,150, 19,125, 27,112, 56,154, 16,232,154,166,102, 31, 64,
- 27, 60, 9,131, 15,158,135, 97, 32,131, 6,160, 88,171,138,251,221,207,164,212, 29,252,195,195,195, 10,188, 50, 69, 3,104, 28,
- 6,239, 3,195,105, 80, 23, 66, 41,132, 38, 48,167,136, 15,142,121, 26,144,162,249,244, 87,135, 11,221, 5,167, 84,245, 23, 42,
-222,242,214,208,132,138,150,173, 89,230,206,170,235, 37,139,174, 49,176,142, 88,127,239,139,235, 3,253,225,130, 57, 77, 56, 11,
- 23,109,167, 98,217, 38,112,121,117,193,191,243,199,159,242,242, 39, 31,115,115,127,199,243,235,134, 47,191,252,146,203,203,150,
- 55,111,191,229,226,170,231,175,255,230, 11,238,238,223, 17,243,204,183,175,190,230,171,175,191, 34,229,194,205,219, 91, 94,125,
-251, 61,243,248,151,140,195,196,241,254,129, 18, 19, 93,104,184,108, 59,134,187,123, 14, 93, 71,223,182,196,148,112, 37, 19, 79,
- 17,215,181, 96,181,144,247,206, 50,220,159,116,239, 91, 84,245,157,221, 46,209, 45, 87, 97,117, 93,245,197,121, 82,170, 91,237,
- 70,173,181, 20,163,174,160, 82,138, 22, 69,138, 19, 5,187,100, 73,236,210, 24, 22,208, 86,206,100,132, 16, 28, 62,120,218,190,
- 71,156,231,148, 10,239,222,126,207,195,241, 68, 22,181,222, 6, 39,116, 93,143,183,194,195,195,192, 52, 71,198, 4,183,247, 19,
- 15, 67, 2, 91,232, 15,150,236, 2,169, 36,142,243, 76,104, 28, 89, 4,235,124, 13,241,218, 80,196,139,253, 57, 39,221, 96, 75,
- 73, 56, 87,153, 38, 94, 9,158,174, 78,250,186,198, 33, 41, 34,100,226,100,104,140, 69,172, 35,149,194,231,159,127, 78,211, 92,
- 82, 68,215, 86,130,230,161, 99, 32, 97,177,171, 16,184, 90, 64,173, 22,124,212, 11, 61,203,249,181,187, 95,215,137,148, 93,179,
-179, 88, 86, 75, 45, 24,150,110, 94,182,232,213,178, 4, 80,236, 58,109, 35,231,244, 46,121, 36, 44,122, 60,126, 52,236, 58, 29,
- 99,214,250, 97, 17,174,237, 99, 54, 87, 85,250, 63,241, 98,127,250,240,220, 46,246,229,178,149, 71,107,132,125,167, 95,118,217,
-240,123, 65,151, 49, 27, 86,214, 86, 13,193,234,241,174,151,186,170,221, 75, 13, 78,113,180, 62,224, 48,196,121,214,139, 6, 75,
-232, 90,154,118, 17,190, 69,134,211, 17,201, 51, 33,120, 28,130,228, 72,137, 99, 37, 45, 25,230,148,177,198,209,247,151,116,237,
- 5, 24,221, 71,157,142,247,148,156,232, 91, 71,107, 51,196,137,148, 71, 76,137,234, 69,151, 58, 66, 55, 32, 57, 98, 81,250,210,
- 62, 9, 45,197, 74,185, 51,154,150, 36, 11,160,162,134,117,140,211, 64, 11,132,238, 64,112, 16,237,246,217, 52,214,129,147,186,
-199, 44,187, 56,211,243,139, 92,100, 71, 75, 53,251,233,206, 15, 67, 87,182,132,180, 45,244,100,241,150, 23,100, 71,142,171,159,
-100,217, 61,226,251,148,190,221,106,218,236, 11,203,189, 26,189,108, 33, 69,123,140,112, 70,158, 48, 65, 62, 70, 15, 47,134,206,
-237,197, 87,114,155,252, 14,119,134,172,123,250, 37, 38, 87,118,156,252,247, 18,221, 96, 71,217, 91,222,177,250,179, 46,234, 61,
-215,226,160,230,129, 99,120,120, 24,104,187,158, 92, 78,155, 31,125,157,152,153,181,192, 73, 73,127, 61,143, 35,161, 8, 56, 77,
-122,250,126,158,120, 53, 28,249,228,223,254, 99,120,123,143, 19,203,148,148, 30, 39,206,144,114, 34, 4, 79,239, 26, 92,240,136,
- 83, 21,115,235, 28, 33,248, 53,214,211, 27,221, 27, 31,186, 22, 68, 35,131,173,213,209,162, 10,167,188,166,108, 89,149, 83, 72,
- 42, 28,199, 73,133, 65,227,140, 55,150,190,146, 23, 83,212,209,174, 32,186,199, 94,147,192,124,229,197, 27,156, 55,181,123,158,
-105,131,199, 58,136, 34,186, 18, 52, 90,196, 72, 73, 80,244,211, 41,136,102, 5, 84,142,185,171,180, 57, 99, 84,181, 46, 5,154,
- 38,212,248,228,188,179, 45,214,252,240,122, 78, 93, 28,122,230,121,162, 9,158, 56,141, 52,109,131, 90,199,149,239,160,205,186,
-163,107, 3,185,184,250,231, 88,244, 73, 5,196, 98,189, 93,167, 61, 23, 23, 61, 31,127,244, 33, 87,207,174,201,146,200,105, 34,
- 77, 19, 30,143,180,142,182,247,220,223,191,229,167,191,248, 9,151,210, 50,199,200,183,223,190,230, 87,127,247,247,220, 63,220,
- 51, 76, 19,239,238,142,252,119,255,226,191,167,105, 26, 94,189,254,142,155,155, 59,222,190,185,163,107,122, 90, 27,120,251,205,
-107,174,174, 46,184,106, 2,121,158,232,155, 6, 95,163,163,211,195, 81,221, 60, 70,148,130,103, 13, 37, 69, 10,133,182, 13,148,
-146,104, 26,175,214,216,146, 25,134, 83,181,237, 90,230,105,174,216, 86,187, 2, 80, 82, 76,170, 80,183, 16,156,186, 44,172,217,
-130,186,116,154,225,234, 78,221,214,105,161,172, 81,215,165, 44, 64, 26, 21, 87,251,166,161, 56,199,152, 10, 49,142,188,126,251,
- 6,193, 16,124,131, 1, 78,199,129, 23,207, 46, 56,158, 6,190,191,125,135, 17, 97,142,153, 49,193,113, 76,196, 98,201, 37, 19,
-143, 15,170,131, 8, 10,223,137,177,168, 77,218, 24, 40, 14,183,238,254,148,124, 39,139,170,172, 34,122, 83, 54, 72,112,164, 18,
- 41, 41,211, 56,109,206, 16,225,250,226, 64,219, 56,198,168,161, 62,193, 55, 60, 28,111, 49, 18,152, 37,241,229,119,183, 76,198,
-144,140, 37,147,235,106,120,129, 69,149, 21, 24,229,168, 80,153, 37, 13,111,119, 46,218, 37, 30,186, 40,136,237,156,145,181,185,
-126,164, 10,153,150,223,215,239,189,182,178,219, 77,111,121,221, 21,226,178,200,147, 68,216, 64, 76,230,253, 0, 11,161, 6,166,
-152, 21,253,186,170, 66,235,158,122, 11,220,248,113,239,249, 15,102, 98,139, 89,131, 44,206,196,197,214, 60, 25, 62, 35,103, 23,
-182,108, 8,213, 61,220,100,217,243, 22, 77,227,177, 24,154,208,210,134,160,223, 73,206, 4,175, 15,102,168,190,113, 41,133,146,
-171, 55,208, 55, 42, 30,204,137,148, 35,227, 56,168, 42,184, 36, 29,223, 24, 71,137, 83, 13,110, 81, 40,131, 20,225,112,113,224,
-208,245,184,154, 38, 21,199, 1,147, 35,173, 51,144, 7,210, 60,225,115,194, 25,205,241,213,244,184,138,160, 51, 9,231,212, 99,
-238,156, 89,227, 93, 75,141, 77,196,232, 22,124, 73,138, 66, 10,198,234, 75, 88, 68,119, 55,174, 34,105,189,213,127,175,181, 48,
- 45, 7,182,173, 36, 66,163,184, 89, 49, 22, 49,121,167,133, 56,183,128,253, 56,160,232,124, 60,173, 15,241, 57, 98,181,156,177,
-248,229,233,152,220,197,255,189,143,134,145, 93, 57, 33,238,189,100,181,125,210,219, 30,116,180,159,221, 24,115,206,129, 95,190,
-254, 42,214,171,241,150,219,226, 90,158,164,215,109, 36,206,223,101,202,220,167,195,153, 51,144,205,202,222, 17,136, 73, 87, 8,
- 99,137, 42,252,178,138,126,245,141,134,253, 40,110,115,191, 50, 43,231,161, 57,178, 8,110,212,189, 17,139, 99, 76,134, 95,253,
-250, 55,252,183,255,205,127,197, 7, 63,249,136,223,220,188, 99, 74,137,185, 20,134, 42,204, 27,199,153,152, 50, 83,154,152,115,
-210,255,125,142,122,225,229,172,209,171,222,225,109,163, 86,185,164,233,135, 74, 92,180,132,208,144, 82, 36, 77,202,144, 55, 86,
-200,243, 72,206,162,214,205,162, 69,210,213,161,175,201, 92, 48,215, 24, 80, 31,220, 74, 70,116, 86, 32, 43, 81,206, 24, 33,167,
-136, 51,202,224,246, 33,112,124, 56,130,115,180, 77,224,225,221, 29,222,122, 93,105, 73,193,121, 79, 78,153,224,131,122,237,173,
-229,254,254,161,142,197, 67,221, 13, 79,122,217,131, 58, 86,234, 46,157, 82,180,227,174, 58,146, 54,120,245,228,163,132, 71,215,
-120, 21, 41,213,175,211,182,202, 59,215, 4, 59, 37,199, 77,211, 72, 27, 26,178,104, 71,219,135, 22,111, 44, 93,119, 32,132,192,
- 52, 78,100, 41, 76, 83,196,137,165,237, 90,222,188,125, 77,185, 61,241,175,254,213,255,193, 41, 42,205,236,151,191,252, 21,119,
-247, 35,255,195,191,252,159,185,122,118,205,233,116, 98, 24,103, 94,189,250,140,231,207,159, 83,138, 16,124,207,253,187, 59, 90,
-219, 98, 82,228, 16, 28,243,221,173, 70, 48, 91, 67, 62, 30,105,157,215, 29,250, 60,144,227,192,229,229, 37,211, 52,233,247, 60,
-171,251, 34,229, 88,121, 8,154, 52,151,170,125, 54,229, 76,206, 35, 82,137,135,214,250,154, 12,167,186,158,105,158, 9, 21,249,
- 90,202,146, 79, 80,209,199,117, 98,136,161, 22,154, 5,156, 95, 69,168,118, 21,189, 58, 93,187, 56,229, 8,220,222,222, 51,197,
- 17, 1,250,190,227,227,143, 62,230, 55,191,254, 28,131,112,127,119,207,241, 93,225, 16, 26,218,166,227,244,112,207,152, 5,219,
-116,204, 15, 3, 24,209,239,197, 83, 3,115, 20,252, 83,196, 82, 82,181,252,150, 92, 99, 97,195,186,154,181,182, 78,241,234, 94,
- 59, 22,200,166, 84,213,123,169, 77, 91,198,218, 66,219, 52, 52,221, 37,146, 45,119,119, 71, 26,103,152, 50,124,245,205, 27, 30,
-102,167,233,129, 86, 61,228,190,138,222,138,168,237, 81, 86,205,153,146, 3, 75,150,205,125, 37,165, 18, 34,151, 9,230,214, 57,
-109,129, 84, 53,106,103, 97, 80, 47, 19,169,146,241, 91,174,170,108,144,106,179,100,148,155, 51,171,146,156,117, 50,230,108,124,
-178, 16,196, 12,254,220,191, 99,228, 7, 10, 0, 57, 15,251,224,169,144, 22,243,164, 3,125,185,184,109, 29,149, 47,177,168,246,
-177,149,237, 7, 58, 41, 29, 43,149, 45, 99,123,229,129,171,125,129, 82,176,222,209,120,181,186,229,146,215, 92,224,178, 38, 15,
- 85, 26,220, 34, 90,176,122, 45,205,113, 34,166, 68,140, 19, 57, 71,108,209,232,204, 82,162,254,247, 42,214, 40, 57,209,216,134,
-203,190,199, 27, 75,142,138,160, 37, 71, 28,153, 18, 39,200, 3, 14,197, 43,218,149,164,175, 35, 50, 29,238, 24, 29,237, 7, 85,
-113,164, 82,149,146,165, 40, 75,184, 40,161,202, 89,187,190,160,101,138, 85, 20,104, 72, 89,112, 73,129, 59,142, 92,187,203, 26,
-228, 32,138,233,116,245,215,196,250, 90, 8, 40,139, 91,235,170, 58,242, 41,194,239, 74, 52,217, 20,230,231,234,111,179,203, 5,
-223,227,220,246,228,180,243,130,110,215,205,179,219,205, 21,214,125,252,227, 73,210,166,132,215,191, 23,217,143,212,151,169,204,
-249,247, 96,140, 60,174, 11,206, 20,253,203,215,121,111,146, 84, 47,244, 34, 79, 92,250,200, 15,146,146,100,227,226,174,239,162,
-221,173, 51,114,169, 81,135,222,146,114,164,200, 81,133, 84,119,119,187,241,190,217, 49,239,119, 69, 87,113, 72,118,140,115,228,
-178,235,153,109,195,175,254,241, 43, 98,140,252,231,255,254,191,197, 31,127,247, 45,111,222, 62,240,221,237, 29,239, 70,195,235,
-155, 59,200,145, 56,142, 4,103,177, 65,241, 60,190, 24,172,113, 68, 11,214,121,157, 44, 85,207,183,243,129, 28,149, 65,237,157,
- 99,174,100, 54,235,116,164, 15,162,151, 37,144,107,224, 72,127,232,184,236, 90,230,169,144,187, 6,155, 11, 65,194,134,106,206,
- 17, 91,179,199,188, 53, 92,116, 29, 93, 8,154,119, 39, 26, 5,220,132,134, 40,165, 94,176,172,116,199,195,225,192,156, 18, 34,
-105,229,112,228, 44, 4,175,158,255, 56, 37, 66,211,114,113,232, 56, 30,143, 53,229, 46, 86,139,170,171,107, 23,189,144,230, 73,
-163, 79, 67,215,224,125, 77,109, 76,165, 2,181,160,241, 14,139, 16,154,128, 0,167, 97, 0,177, 21, 40,178,217, 37,211, 52, 17,
-156,227,205,235,239,121,247,112,228,112,121,137, 24,207,195,253,131,174, 20,140,101, 26, 7,134,113, 32,127,249, 61, 95,189,186,
-227,217,203, 23,204,115,100, 24, 53,159,254, 56,204,244,125, 15, 18,104, 92,207,215, 95,188,226,162, 63, 16,227,196, 69,219,113,
-188,187,197,145,105,157,231,250,112, 96, 28, 70,250,166,103,158, 70,138, 81,238, 1, 20, 66,208,228,180, 34,162, 43,147, 42, 2,
-246, 65,173,125,135,174, 91, 47,244,113, 28,149, 74, 25, 26,124,211,146, 98, 92,131,107, 64,207, 3, 91,199,200,169, 20,188,215,
-226,136, 82,214,233,210, 18,198,228,188, 95,125,252,166,146,162, 74,213,106,101, 81,246,192,195,148,184, 63, 30,137,113,162,105,
- 60,109,104, 56, 61, 12,124,113,250,146,148,178,198, 74,119, 29,101, 78,220, 15,153,155,135, 35, 49, 27,230, 92, 16,147,176,222,
- 83, 82, 36,184, 6,193, 48,214,231,206,212,236,136, 82, 39,171, 66,205, 52,152, 39, 76, 61,215,115,165, 61,218,117, 53, 88,187,
-229, 10, 52,154,178,174, 51,147,192, 24, 19,253, 69,207, 56, 71,174, 47, 46,113, 20,190,251,254, 27, 94,124,244, 41, 55,223,222,
-169, 29,186,100,156,236,135,120, 59,210, 35,103, 67, 72,245,162,239,146, 41,235,141,190, 78, 56,228, 81,230,243, 94,155,180, 52,
- 20,214,216,165, 83,151,179, 49,251,123,113,147,203,224,114, 39,110, 56,195,206,217, 31,184,184,159,226,180, 23,249,129,196, 53,
-121,226, 82, 48,143,240,160,143,254,157, 29,188, 68,187, 30,187,237,214,159,136, 97, 45, 21,209,119,198,237,174,214, 38,187, 83,
- 42,219, 42, 90,113,214, 32, 57, 35,185,208,120, 79,202, 81,213,160, 53, 46, 54, 39,189,212, 67, 8, 74,162,147, 72, 74,145, 56,
- 39, 29,255,164,153, 96, 74, 13,114, 41,107,173,147,171, 40,171,107, 61,141,179,228, 52,147, 74,221, 41,165, 19,146, 38,144, 72,
- 35, 66,227,108, 29,195,104,252,169,179, 6,239, 12, 1, 8,206,210, 54, 45,214, 25, 82, 73,204, 57,107,186, 79, 44, 76,201, 80,
-112,184,170,118, 39, 41, 97, 73, 42,196,160,160,151,127,202,121,221, 59,107,140,174,199,161,197, 76,145, 82, 27, 63, 85, 65,231,
-122,169, 23,161,242,135, 31,119,189,230,189, 75,252,177, 64,227,204,203, 93, 45,105,155,219,122,201, 30,168,194, 57,121, 63,229,
-207,200, 70,138, 95,215, 61, 70, 7, 91,139,155, 97,251,218,230,252,171,175, 95,220,238,245, 39, 59,242,252,254, 18, 63, 87, 6,
-236, 9,110,250,183,242,131, 81,193,171,206,192,154, 39, 28,111,242, 62, 89,225,189, 95,175, 62, 85, 83,214,100,187, 5, 87, 58,
-199, 76, 19, 60,167,211, 80, 1, 51,114,246,178,201, 46, 85,113,251, 99, 21,181,109, 26,203, 49,142, 92,116, 61,175,134,119,252,
- 95,191,252, 91,254,235,255,242, 63,227,249,157,101,106,132, 83,103,184,155,102,108,168,133, 99,171, 48,140,156,181, 3, 15,149,
-196,134,117,235,238,175, 32,180,135, 11,238, 31,238,201,149,167,158, 83, 94,211,195,124, 48,149, 42,150,215,174, 25,107, 16, 87,
-150,120, 32, 60, 5, 83, 18,193, 41,132,201, 32,180, 77, 91,147,197,148,147, 16,140,165,177, 78,149,209,206,113,113,232, 24,139,
- 96, 93,194,137,242,201,251, 92, 56, 77,170, 36,159, 82, 84,155,210, 10,133,209,157,112,215, 6,138,215,139, 36,165,153,241, 56,
-213, 52, 46,139,167,168, 87,217, 65,206,234,249, 47,200,150,142,230, 44,227, 56, 19,188,215,177,251,146,148, 88,241,204,211, 60,
-173,138,234, 84,167, 44,174, 82,214,230,121,194,184,128,179,234,229,190,127,247,192,253,148, 21, 39, 61, 79,235, 40,107,225, 27,
- 8,134,155,155, 59,134, 41, 41,151,189,170,227,111,111,222,241,253,235,183,154, 83,158, 51,146,133,251,233,158,190,245,152, 38,
-227,200,216,154,197, 62,205,181, 11,143, 42,242,114, 86, 86,143,117,169, 43,215, 84,181, 64, 82,197, 98,227, 48,129,129,113,156,
- 8,190,170,219,107,134,198, 52,143,148, 82,189,249,213,157,146, 82,162,109, 91,181,128, 26, 67,202,147, 18,244, 68,211, 39,149,
-245,190, 4,237,136, 2,149,156, 87, 39,116, 13,131, 41, 69,253,231,164,194,113,152, 25, 82,133,127, 25, 45,152,126,254,179, 63,
-224,139,223,124,206,195,253, 72, 8, 1,177,112,123,119, 84,135, 74,113,250,174,250,150, 73,198,106, 37,212, 70,202, 88,175,121,
-227,104,250, 93,204, 81, 59, 96,103,171,152,211,177,127, 69, 64, 53, 71, 98,132,148, 19, 41, 23,124,157, 26, 12,243,132,113,158,
-113,206,204, 73, 5,111, 31,126,240,140,241,238,150,171,254,146, 55,239,222,209, 58,120,246,236, 37,159,124,244, 9,159,253,230,
-123, 21, 72, 55, 1,178, 2,135,114,205,152, 55,187,196, 41,133, 22,233, 4,204,216, 69, 79,180,107,104,138,172,209,211,139,136,
- 93, 19, 54,229,140,186,201,206, 49,228, 46,186,254, 47,148, 96,163, 30,237,117,159,183, 95,147, 26, 89,213,226,231, 65, 21,118,
- 55, 60,180,187,157,250,102,233, 89, 58,151,179,240,149,250, 0,189,175,114,151, 93,138,154,221, 34, 52,247,165,201, 46,119,123,
-181,171,153,205,147,254,216,150,103,206,196,122,162,227,235,221,142,120, 47,149,179, 70,127,232,222, 64, 27, 84,105,187, 88,104,
-124,208,100,161, 69, 76,103, 81, 15,187, 49, 66,104, 54,127,120, 74,137, 88,242,138,133, 13,198,210,250, 26, 71, 41, 75,170,142,
- 10,240,174, 46,175,240,193, 19, 99,212, 34, 96,210,177,152,177, 58,254, 14, 21, 0,179,140, 87, 12, 26,207,216, 54,134, 46,168,
-157,194, 59,221, 31,205,177,112,127,154, 25,230,204,152, 68,245,163, 54, 40, 95,191,170, 38,131,215,204,107,106,129, 52,231, 84,
- 63,115,179,142,151,150, 46,105, 17, 12, 46, 69, 81,104, 59, 70, 44,119, 49,115,202, 66,174,188,216,125, 34,214,142,213,183,165,
-149,237, 70,245,170,175,176,143,220, 12,203,101,189,140,149, 30,113,221,164, 2,229,101,185, 76, 89,121,253,106,136,223,211,149,
-170, 82,221,156,167,192, 61,201, 28,220,233, 60,182,226, 97,107,223,229,189,239,199, 34,178,255,181,167, 59,245, 51, 46,187, 89,
-138,198,221, 63,107, 87,159,225,198, 81, 88, 68, 51,198,156,133, 30,153,250,253,173, 47,248, 66, 33, 43,218, 37,234,152, 52,213,
-154,192,156,175,162,234,123,107,107, 54, 0,100,140, 45,106,139, 48,106,177,137,199,123,254,147, 63,255, 83,122, 47,156, 30,110,
- 57, 78, 35,167, 42, 96,203,185,212, 67, 90, 13,125,214,120, 82, 41,216,154,133, 80,150, 11, 83, 68, 51, 2,106,183,181,117,197,
-250,204,165,162,255,125, 73,229, 42,213, 41,210, 52,129,174,109,121,118,121,160, 9,122,169,148,221, 84,197, 59, 71,215,170, 63,
-218,228, 72, 31, 44,151,109, 67,227, 52, 86,184,136, 48,206, 51, 11, 18, 73, 5,161, 65, 1, 49, 86, 9,118,193,249,106,127,132,
-254,208, 81, 74,230,208,119,228, 26,119,187,120,199,109,157, 46, 4,239, 85,232,102, 44, 33,248,245,127,115, 78,137,124, 44,161,
- 85, 78, 15, 96, 87, 19,199,108,253, 76, 67,211,232,148, 44,198,234,160,161, 10, 2,183,200, 83,193, 96,189,142,228,135,113,214,
-245, 93,181,147, 26, 3, 93,215,105, 64,135,179,148, 92, 56, 29, 7,134,211,145,187,219, 59,142,199, 19,113,142, 88,131,126, 62,
- 69, 73,104,173, 87,157, 67, 41,106,255,203, 49,106, 83,226,155, 45,249,175,100, 92, 21,160,109,170,105,125,158,210,130,207, 69,
- 89, 25,165, 44, 59, 96,214, 28, 15, 83, 69,111,101, 89,231,212, 61,153, 34,130,221, 58,173,157,162,118,197,243, 52, 43, 29,174,
- 70, 65, 75,109, 6,150, 48, 29,140,134, 22,197,172,136,212,211, 56, 49, 76, 51,227, 52,147,114,230,208, 29,184,186,184,226,225,
-238, 8, 88,198,152, 24,135, 17, 22, 49, 91,213,155,228,234, 59, 31,102,157,144,106, 80,142,122,230,157,113,245, 71,187,172,246,
-204,154, 8,170,157,185, 37,120, 93, 35,236, 5,174,154,168, 87,237,165, 73, 49,183,203, 59, 81,144,250,117, 11,115, 46, 92, 94,
-246,180,141, 90, 48,167,225,200,241, 52,226,155,150,207,191,252,142,185,100,138, 49,234, 3, 95, 34,144,235, 10,122,217,149,171,
-115, 72,207,182, 92,214, 28,203,237, 92, 92,144,210, 70,125,233,203,100,249,188, 21, 94, 90, 28,253, 30,220, 69,123,249, 23, 82,
- 67, 35, 22, 11,144,250,182,133, 98, 54,136, 73, 94,149,181,219,101,107,151, 36, 40,177,143,198,232,187, 17,162,181,239,227, 56,
-119, 9, 98, 43, 27,126, 57,196,150,195,206,186,154,109,107,214,106,111, 99,254,176,118, 47,166, 62,112, 44, 17,130,143,162, 85,
- 31, 31,186,182,114,187, 69, 84,200, 98,173,134, 52,104, 40,133,122,201,131,245, 52, 33, 32,185, 96, 29, 53, 21, 72, 89,221,182,
-122,194, 23,156,172,113,166,162, 46, 75, 13,129,209, 42, 14, 81, 79,230,161,105,233,154,182,238,149,146,142,160,196,208,248,134,
-254,208, 35, 2,113,142, 72,206,164, 56, 97, 40, 56, 35,120,103,112,171,162, 84,199,224,193, 67,240,218,189, 7,163, 9, 78,115,
-154, 57, 77,145,251, 49, 51, 68, 72,120, 18, 86,145,157,182,106, 8,170,162,218, 58,187,243,223, 11,185,142,216,197,184,122,225,
-170, 98, 23, 49,168, 51, 88, 59, 26,235, 28,190, 59,112, 95,132,187, 84,136, 69,255, 25, 10,187,135,240,241,148, 70,167, 34, 43,
-180,104,177, 27, 62,226,164, 47,135,203, 98,135, 59,103,186,111, 69,195, 42, 34, 89, 71,213, 86,105,114,102, 11,126, 89, 5,115,
- 98,207,166, 60,231,153,227,155,116,255, 28,184,179, 57, 54,222, 43, 78,118, 17,194,108, 16,167, 31, 10, 98,123,148, 26, 40,107,
- 98,224,246, 13, 45,171,170,243,194,195, 60,230, 68,188, 55,233, 64,247,196, 69, 15, 23, 77,232, 42,171, 47,127,115, 2,232, 95,
-174,234, 88,140,243, 74, 43,116,224,173, 46,200, 90, 31,152,142,119,252,252,195,103,252,209,239,255,148,124, 58,169, 53, 76, 12,
-195,105,196,138,165, 24, 24,115, 2, 99,215,209,180,134,253, 36, 74, 74,202,246, 78,154, 71,174,123,236,188,176,255,200,197, 40,
-126,216, 88,124,232, 42, 3, 91, 15,215,254,186,199,119, 45, 41, 11,125,223,105, 74, 23,133,146, 74,165, 42,186,186,231, 46, 88,
- 17,156,100, 46,187,150,139, 86,213,239,222, 55, 58, 25,171,107,160, 57,166, 53,211, 60,175,159,175,170,224, 23,127,240,225,226,
-176,238, 76,157,115,116, 77,127,230,210, 1,221,173, 42, 63,159, 10,149, 41,235,229,174, 81, 81,208,117, 77, 77,159,155, 53,203,
-219, 40, 6,218,183, 45, 25, 37,216,177,196,163,214,168, 90, 21,151,153,234,213, 86,237,202,161,235,160, 36,130,211, 75,217,136,
-193, 27,101,172,107, 7, 94, 19,247, 80,181,121,237,132,214,115,110,211, 9,233,247,240,236,217, 51,109, 14,114,161,105,186, 26,
-205,105,234,168,124,196,215,255, 92,138,208,132, 86,139,172, 74, 50,244,222,146, 75,205,147,168,177,217, 77,211, 48, 96,117,191,
- 36, 0, 0, 32, 0, 73, 68, 65, 84, 78,115, 77,123,172, 23,185,232,232,122, 41,248,150, 32, 26,107,182, 63,158, 22,152,118, 93,
-135,232,168, 91,215, 71,122,238, 87, 97, 24,150, 57, 23,166, 88,184, 63, 13, 76,169, 80,112, 10,218,113,142, 23, 87,215, 60,191,
-184, 98, 28,103,222,222,223, 43,175,160, 9, 4,224,162,105, 8,190,209,124,132,162,177,213, 33, 56,197, 96,171,194, 84,155, 51,
-167, 19,210, 92,249,243,185,200,122,252, 88, 99,112,181, 72, 22, 17, 92,208,248,237,133, 58,168,214, 98,157, 78,142,243, 76, 22,
- 72, 37,215, 32, 27, 91,127, 63, 56,222, 13, 56, 81,226,233,213,117,207,213,179, 75,102,113,124,254,213, 91,198, 82, 72, 11,220,
-101, 29,227, 87,170, 92,169,127,246, 82,139,210,165, 73,145,205, 67,164, 14, 3, 5,229,136,229,204,171,126,182, 26,204,101,157,
- 52,136, 8,238,162,189,248, 11, 61,228,115, 21, 55,148,245,176, 93,173, 57,178,199,210,237, 65,242,203, 33,186,247,183,111,251,
-247,253, 1,189, 31,161,155,234, 51, 60,195, 43,154, 39,188,232,178, 9,135,140,177,107, 4,152,212,185, 0,123, 72,206,226, 11,
-254,157, 65,177,139,103, 94,214, 78,114,217,249,248,106,193, 9, 86,133, 58, 57, 38, 92, 5, 72,164,122,120,217,213,134,144,107,
-174,186,170, 71,115, 46,234, 69,173,123,141,224, 44,135,174,231,197,245,115,156, 83,210, 92,169, 73, 69,206, 58,218,166,197,123,
-229,104,151,164,170,197,146,162,242,135, 37,215,151,197,156,173, 33,172, 85, 82, 95, 41, 26,124, 49, 76,145, 83, 13, 39, 24,179,
- 80,156, 39, 27, 67, 44,137, 84, 18, 38,168,154,116,249,125,204, 46, 68,193, 88,135,193, 49,199,172,233,115, 86, 65, 48,206, 88,
- 13, 51, 96,163, 27, 25,231, 41,190,227, 33, 21, 78, 69,115,148,151,239, 19,163,254,157,197,205,176, 47,222,224, 60, 69,207, 88,
- 45, 52,214,201,138,217,243,212,205,153, 80,108,233, 94,109, 21,140,236, 59,123, 83,227,224,222, 91,199,236, 96, 46,123,175,233,
-121,247,251, 88,152,198, 19,194, 77,217, 37,189,201,147,127, 89,126, 92,224,249,131,174, 13,243, 88,224, 41,155,117,110,217,141,
-237,254,251,249,180, 74,214,203,102, 9,181, 88, 45,122,235,215,221, 10,101, 29,217,154, 85, 72,233, 23,143,176,173, 59, 96, 83,
-136, 15,239,248,143,255,236, 79,232,211,145, 84,133,108, 5, 71, 50,150, 41,229,154, 80, 24,215,233,154, 49,134, 24,163,142,175,
-107,120,138,216, 26,240,211, 28, 72, 38, 64,232,233,174,159,227,251, 75,126,246, 71,127, 76,211,247,140,179,174,135, 76,219,144,
-172,112,154, 38,164, 24, 58,239, 56,180,142, 52, 43, 55,188,235, 90, 48, 74,211, 11,222, 97,164,224,141,112,209, 54,180,193,115,
-121,232, 81, 98,167,169,233,107,134, 97,154, 9, 77, 75, 42,153,152, 50,214,187,181,251, 86,138,165, 97, 24,116, 47,110, 87, 56,
-145, 90,236,226,218, 85,107,215,185,233, 26, 20, 62,162, 23,189,161,111,187, 42, 16,211, 88,100,107,181,248,119,174,102, 59, 84,
-209,147,114, 39,244,137,154,231,185,190,111,142,148, 11,243, 28, 41,160,127,175,171,192,182,109,170, 90, 94, 63, 63, 95,187,224,
- 92, 5,184, 82, 22,136,145,221,105, 72, 42,255,160,104, 94,125,211,132,245, 34, 86, 17,172, 62, 31,193,123,134,211,160,184, 86,
-175, 2,194,121,154, 43, 48,199,236,138, 3,170,245,172,138,126,157, 39,173,145,185, 42,118, 91,158,197, 82, 53, 59,198,154,117,
-149,185, 20, 16, 90, 97,184, 26,157,234,170,125,185,206, 82,156, 37,229, 84,133,188, 48,165,204, 20, 19,195,156,234,133,175,111,
- 84,219,182, 53, 74, 86, 56,157, 6,230,121,210, 48, 42, 81,171, 96,223,180,152,162,153, 21,169,230,157, 99,171,104,211, 55,213,
- 53, 34,235,157, 52,205, 81,187,235, 21, 48,182, 9,114,157,221, 38, 53,214,235,247,152,139, 98,107,227, 28,137, 41,175, 77,246,
-226, 48, 41, 53,159, 35,198, 76,215,118, 72, 17, 98, 44, 60,220,159, 40, 24, 66,219, 96,252,129,175, 94,191,101, 42,203,118,122,
- 3,112, 45, 18,223,197,182, 91, 51, 37,183,213,246,162,214,169,118, 94,121, 47,149, 74,182, 96,168, 29, 43,132,186, 30, 55,123,
-246,251,227,126,225,189, 14, 70,228,189,241,226,249,198,178, 60,218, 9, 10, 79, 81,227, 13,246,189, 14,234,241, 65, 39,251,160,
-138,189, 90,126,103,145, 48,203,110,126,159,251,254,187, 34, 98,183,158,111, 69, 2, 46,251,204, 45,237, 75,163,255, 68, 17, 63,
- 56,171, 47,117,170, 47,171,181, 22, 49, 66, 38, 87,174, 58,117,212,168,187, 16,205, 7,246, 28,250,158, 23,151,207,104,189,231,
-120,255, 78,209,127,203, 40,165,126,111, 57,234,104, 51, 4, 45, 26,200, 25, 33,211, 52, 26,163, 42,213,139,104,106,101,151, 36,
-107, 44, 33,154, 66, 36, 98,136, 2, 5,175, 73,108,213,138, 17,171, 10,222,155,242, 94,103,158,164,208,248, 6,111, 20, 42, 51,
-165,204, 41,206,106, 37, 49,150, 82,244,193,147,218, 73, 90,107, 40,198, 49, 38,152,138, 37, 27, 91, 31,158,218, 9, 26,237,232,
-164,108,251,114,181,184,219, 77,149,109,182,135,115, 79, 29,116,139, 32,196, 60,242,182,155,109, 2, 80,106,216,194,118, 0,217,
-149,161,188,207,139,223, 95,102,118,181,204,149, 93,176,140,217,180,155,230, 41, 17, 31,251, 87,234, 61,177,220,251, 26,129,167,
-131, 92,206,158,227, 39,240,176,103,239, 21,242,158,124,110,129,199, 88,217,137,235,118,157,187,126, 79,231,251,181,101,194,102,
-118,250, 17, 83,119, 74,102,253,172,118, 74, 2,171,221,210, 92, 28,127,247,213, 43,254,207,191,250, 91,254,139,127,254,251,116,
- 99, 70,238, 34,161, 63, 96,146,165,105, 10,110,206, 52,161,197,216, 68, 18,225, 56, 77,132, 78,199,141, 38,137,146,209, 66,203,
-203,235,103, 60, 68,193,133,142,166,109,249,238,205, 27, 62,252,232, 35,238, 79, 71,110,238,143,220, 28, 79, 90, 4,215,160,154,
-224, 44, 69, 44,243,194,166,175,218, 17,189, 4,245,157, 42, 57, 87,160,167, 90,168,148,167,238,193, 25,142,167, 35,214,123, 76,
-206,180, 93,199, 56,199, 21,171,233,156, 67, 82, 86,241,153,119, 56,169, 35,232, 24, 9, 93,139,119,202, 96, 79,185, 16,130,210,
-224,108,197,193,230,156,177,222,174,228,192,156, 34,214,168,165,181,109, 91, 82,138, 28,186, 86, 9,141, 41,169,159,218, 55,138,
-243,149,133, 8,168, 7,118, 8,106, 71, 27,199, 17,223, 52, 72, 84, 11, 93, 49,134,177, 90,195,230,121, 84,219, 29, 78, 87, 28,
- 57, 17,231,169, 54, 28,186, 2,115, 70,170, 59,179,206,196,151, 85,140,213,160, 24,131,212, 16,149,132, 84,226, 91,206, 69, 67,
-120, 58,205, 79,119,198,208,118, 61,243, 56,114, 26, 71,156,179, 92, 94, 28, 16, 41,171,128,209,214, 66, 48,198, 88,181, 66,142,
-148, 51,105, 86,125, 68,223,118,136, 73, 85,143, 80, 21,221,213,122,105,164,104, 71, 90,182, 21,233, 18, 44, 21, 75,194,138,134,
- 96, 25, 23, 72, 89,163, 66, 99,202,187,233,172,171, 97, 83,122,161,223, 13, 3, 77,157, 68, 4,103,240, 93,195, 69,223, 65,204,
- 76, 81, 35,123,173,213,233,143,181,158, 24, 19, 41, 77,155,130, 60,107,104, 75, 70,214, 41,209,166,203, 90, 10,243,180, 53, 76,
- 57,211,180, 1,103, 13,243, 20,193, 24,154,160, 36,198,109,143,168,239,205, 52, 69, 90,223, 48,140, 17,145,168,122, 5, 41,204,
-111,110,185, 59, 29,193,222, 51, 69,213, 39, 25,187, 49,238,183,100, 74,181, 74, 99, 84, 39,101,214,140,116, 30,101,102,236,214,
-198,108,169,152, 91,162,169, 89,223,234, 69,223, 98, 20, 62,179, 63,145,236,218,157,236, 71,147,214,218,141, 14,182, 63,180,138,
-169,126,195,167,174,207,141,243,171, 99, 34,253, 82,214,153,247, 60,187, 91,166,250, 19,221,206, 18,215,186,116,134, 75, 49,241,
- 20, 97,142,189,218,254,220, 19,127,150, 60,183,231,105, 86,235, 80, 41, 5,217, 49, 61, 75, 29, 69, 53, 65, 3, 28, 98, 76,234,
- 5,175, 35,109,157,150,108, 72, 90, 77,239, 17,156,209,236,242,103, 23, 7, 46,250,150, 56,197,154,143,173,126,199,165,186, 44,
- 53,108, 34,132, 6,231,156, 2,108,200, 58, 66,218, 49,215, 23,176,140, 82,236,116, 20,175, 80, 14,237,170,115,133,249,175,123,
-228,101,239,154, 83, 29,115,109,209,168, 81, 4,151, 11,206,105, 22,182,142, 58, 61,228,196,156, 18,193, 54,250,176,217,197,183,
- 95,125,168, 34,204, 5,141,151,169, 43, 17, 91, 21,242, 88, 83, 59, 13,115, 14, 74,120, 44,145, 91,199,226, 91,149,105,119, 10,
- 50, 91, 20, 59, 44,108,120, 87,193,104,178,223, 35,101,119, 41,133,146, 99,213, 1,200, 74,211,179,103, 60, 4,115,166,209,216,
-111,161,246, 49,191,123, 82,220, 89, 29,137, 60, 49, 94,151,243, 20, 65,121,130,167,176, 43, 80,203, 89, 71,190, 20, 37,219,126,
-125,121, 49,247, 62,245, 39,102,241, 85, 68,195,186, 26,115,181,179,172, 89, 69, 90, 0,212,175,191, 4, 95,172, 2,209,138, 38,
- 54, 34,107, 81,179, 56, 54, 38, 60,247, 52,252,139,255,245,255,230, 63,252,227, 63,228,240,252, 19,158,143,133, 50,141,220,158,
- 78,116,206,112,217,180, 76, 57,147,172, 37,138, 96,250,158,230,226, 25,174,185,224,112,249,130,187,251, 17,219, 29,184,125, 56,
-113, 59,223,241,201,139,107,222,188,125,139,132,150,104, 13,217, 26,166,146, 25,210,204,161, 11, 24,155,171,192,204,209,218,134,
-139,203, 11,140,209,139,200,187,160,112,144, 37,109, 42,120,226, 48, 43,111, 59,103,186,174, 69, 12,140,211,196, 20,103,112,138,
-135,117,222, 97, 82, 66,114,166,109, 27,112,142,113, 60, 97,156, 70,168,206, 41, 34,120,124,141, 3, 53,162,128,149,148,106,113,
- 81,139, 71,239,125,181,184,185, 85, 88,155,235, 24,220,218, 26,110, 84,181, 4, 75,116,168,113,150, 41,170, 18, 60, 37,253, 62,
- 48, 48,103,205,147, 8,161, 97,170,240, 21, 91,195,118, 20,110,227,176, 69,104,172,231, 52, 78,196, 57,215,145,172,172,162, 88,
- 61,231,237,142, 70, 88,211,196,170, 62, 70,119,223,117,207,189,100, 52, 88,213,254,244,125, 79,206, 9,231, 29, 86, 12,211,172,
-174,151, 80,127, 6,167,113,168,150, 65,131, 65, 67,167,108, 22,226, 56,105, 97,101,108,125, 95,243,250,243,200, 69, 35, 95,125,
- 8,196,170,199,241,117, 92, 79,209, 9,230,194,100,178,214,146,139, 94,184,182, 56,166, 24,137,185, 32, 41,105,188,110,157,150,
- 44,231,115, 19,130,234, 60,230,137, 38, 52, 4, 11, 14,161, 11,142, 16, 52,229, 83, 98, 34,206, 81,127,206,162,188,248, 34,137,
- 28, 35,214,123,218,170, 49,241,222,115, 26, 6,181, 18, 98,215,226, 97,111,170,146,122, 6, 59,235,200,213,223,125, 26, 70, 93,
- 69,228, 76,206, 16,140,163, 20,209,108,142,218,103,231,172,141,197,156, 84,229,239,219,160, 19,205, 52,115,125,232,193, 90,142,
-167,153,152,133,108, 52,163,193, 27,179,118,209, 98, 44, 70,117,203,245,108,114,107,134,251,227,169,182, 78,142,216,176,231,242,
-232,182,147,229,174, 98,213,239, 56,231,182,241,187,200,114,129,108,151,213,126,140,184, 23,243,172,221,198, 46, 76,227,169,132,
-183,243,131,107,219,129,255,144,144,205,214,139,125,237, 54,150, 61,120,141,108, 93,112,130, 11,217,172, 26, 15, 55,200,253, 18,
-216,178, 23,229,189,183,231, 92, 33,241, 85, 20,118,190, 99, 9,117, 76, 41,146,245,225,106,254,127,214,222,109, 73,146, 44, 59,
-207,251,215,218, 7,119,143,200,204,170,234,234,158, 19,160, 25,112, 64,144, 16, 32, 80, 38, 65,124, 7, 93,232, 5,244, 54,120,
- 32,221,138,102,186,146,104,162,233, 70, 23, 50, 18, 6,145,162, 17,135, 1, 6,141,158,238,233,238,170,202,140,240,195, 62,233,
- 98,173,189,125,123,100, 86, 79, 15,193,134,149, 97,166, 38, 59, 51, 35,194,221,247, 58,252,255,247,123,108,219,134,109, 91,101,
- 76, 67,187,114, 84, 82,204,164, 90, 74,122,131, 57, 38,220, 79, 35,222,220,223, 99, 48, 6,219,188, 96,219, 22,228, 20, 17,162,
- 28, 68,134, 25,214, 57, 21,112,136,136,101, 89,133,102,101,140,144,169, 74, 78,162,238,212,247,218,121,219,232, 67,169, 0, 37,
- 11,248,194, 57,163, 55,102,214, 67, 77, 7, 16, 89,115,194,169, 75,247,233,188,142,226,221,149, 11, 59, 33, 35,134, 40, 65, 52,
- 42,122,217, 17,249,140, 8,139,141, 29, 54,102,100, 99,100,164, 95,113,144, 68,173,192, 49, 85, 68,164,161, 27,220,253, 49,196,
- 32, 35, 65, 8, 68, 80,100,164, 90, 39, 9, 34, 70, 82,198,178, 81, 2, 25, 27, 89,109,176,217,199,133,109,252, 89,181, 31, 37,
- 35,231,186,207,221, 71,215,245,143,124,198, 69,172, 81,196,106,217,203,251,215,208, 11, 27,116,237,146, 88,179, 15, 72,243,149,
-141,238, 80, 9, 44, 19, 19,110,107,206, 3,182,182,173,120, 24,135,255,206, 26, 63,217,222, 19,102,253,158,199,191,175,218,144,
-138,183,149, 64, 16,232,122, 68, 51,215,213, 7,207, 29,124,167, 22, 43,242,125,250,144,165,210, 58,222,250,151, 18, 94, 35,133,
-236, 50, 95, 49,198, 5,127,242,207,126, 31,101,187, 34,167, 13, 33,110, 8, 33, 99, 43, 6,209,122,164,225, 30,167, 55, 63,134,
- 57,189,129,127,248, 20, 75, 49,184, 70,224,146, 8,217, 13,120,127,185,226,205,219, 55,176,222, 96, 89,102, 76,211,136,105, 26,
- 49, 14, 22,203,245, 17, 97,189, 96,242,140,201, 3,222, 51,206,211, 9,247,211, 29, 30,198, 17, 8,171,232,247,178,252,238,214,
- 49,194,182,194,233, 78,220, 16,112, 30, 61,206,227, 8,102,194,227, 50, 3,108,192,222,225,186,108,141, 43, 46,131,183, 2,235,
-172,114,185,133,219,237,189, 83, 47,249,160, 48, 41,141,235, 32,180, 68,172,122,232, 86,165,190,179, 18, 84, 99,116, 81, 60,141,
- 3, 66, 78, 48, 78, 14,242, 82, 10,172,151,123,216,123,223, 30,188, 49, 37,120, 63,180,231, 79,204,154,169,173, 92, 6, 50,130,
-142,221, 66,144,195, 16, 5,131, 31,177,109, 1,108,156, 52, 7, 90,196, 23, 18,100,117,189,103,123,152, 75,233, 10,147,251,251,
-123, 44,203, 34,137, 99, 4,156,166,147,168,215,189,131,243, 3, 74,201,194,202,207, 25,219,186,193, 15, 94,130,164, 66, 0,235,
-245, 71, 10, 27,139, 26, 46, 53, 40, 96, 7,196, 96, 54, 77,160, 9,181,119, 49,139, 16,112, 89, 54,148,172,118, 52,141, 65,169,
-250, 43, 57,116,129, 37, 38,172, 33,107,135, 14, 68,226, 93, 0,171, 83, 62,199,132,211, 56,201,225,206,132,201,123,156,198, 1,
- 49,108, 64,138, 40, 49, 35,108, 27,114,214,228, 61, 84,207,187,232, 20, 98, 44, 88,194, 6, 54, 22,110, 24,229, 57,153,101, 26,
- 67, 44,133, 91, 1, 53, 71, 79, 13,186, 50,214,180,198, 39,105, 17,199,198,200,180, 35, 23,108, 73, 92, 20,170, 75, 84,161,155,
- 70,192,106,225,183,109, 58,205,217, 86,252,228,119,126, 7,239,222, 95, 48, 47, 81,154, 17,206,123, 39, 93,121,218,141,160,185,
- 91, 89, 43, 90, 87,118, 75, 26, 89, 94,246,102, 5, 69,181, 12, 96,157,110,136,254, 0, 0, 72,181, 46, 53, 21,213,182,131, 89,
-231,117, 68,249,128,134, 61,116, 61,186, 63,151, 14, 32,119,149, 79,254,104,198,250,199, 7,149,189,151,182,118,120, 6,124,232,
-181, 36, 97,173, 98, 96, 89,108,176, 13,234,218,119,248,242, 94,149, 54, 57, 32, 42, 47,116,103,188,115,194,245, 27,147, 10, 62,
-228,223,237,247,193, 80, 24, 67,194, 22,130,136,178,152,117, 39,148,218,183, 32, 38, 85, 79,202, 65,229, 13,112,246, 22,158, 19,
-210, 58,195, 32,193, 25, 70, 56,216,177,169,237,118,162,218,127, 82,220, 96, 84,144, 98,152, 17,147, 8,243,140, 38,190, 25,203,
- 82,225,106,129, 99,141,248,232,157,213,253,159,106, 37,182, 16, 81, 88, 68, 74, 32,219,233, 31,228,117,167, 82, 64, 57, 97,139,
- 27, 70, 63, 72, 94, 59, 11,249, 40,166,130,144,107, 21, 45, 35,190,150,122,215,132,219, 34, 78,162, 6,166, 1, 50,239,239, 97,
-233, 70,237,229, 16,219, 43,251, 92,232,131,141,178,144,192,192, 93,198,189,158, 80,172,194,199, 82,100, 31, 85, 64, 72,148,219,
- 3,216, 50, 35,105,204,108,105,124,241,186,246,225, 27,177, 91,214, 7, 72,190,233,198, 75,235,108,143, 32,153,210, 14,135,114,
- 99,189,235,195, 83,234,254,122,175,172,251, 17,188,126, 79,125, 64,247,179, 3,238,214, 72,212, 7,214,244,182,180,238,134, 49,
- 58, 6, 62, 80, 16,113, 92, 61, 29,245, 44,183,147, 0, 52,194,193,190,146,147,255, 61, 17, 99,205, 0,101,131,255,253,255,254,
-183,248,147, 63,254, 35,252,224,205, 43, 17, 1,141, 5,143,215, 43,112,255, 6,239,191,126,135,225,238, 45,190,250,250, 29, 94,
-255,224, 51,124,243,248, 14,247,175, 94,227,241,233, 17,167,215, 19,134,209, 35,219, 51,222, 60,156, 49, 58,143,201,201,195,229,
-213,235,123, 60, 60,156, 49,240,134,120,253, 22, 38, 39, 56, 91,112,221,102, 92,158,158,176,166, 25, 27, 17,126,112, 63,202,102,
-145, 25, 22, 5,121, 11,176,100, 96,137,196,156, 85,160,233,103,104,196, 49, 2,176,169, 45,138,141,131,141, 9,110,178,216,162,
-164,200,157, 78, 3, 74,204, 50,242,213, 34,122, 58, 77,130,205,141, 81,104, 75, 20, 52, 54, 90, 58,217,172,133,109,206, 9, 97,
- 93, 26,219,129, 45, 55,124,105, 67, 94,107, 35,228,189, 7, 51, 99, 24, 68, 69, 29,181,179,111,147,154,178,199, 82, 87,231, 11,
-179,142, 95,229,148,192,178,172, 48,172,214, 44,176,178, 21,117, 42,216,133, 0,213,195,156,154, 43, 71, 4,133, 98, 43,243,186,
- 19, 39,108, 33,194, 88, 43,241,174,181,139, 95, 55,229, 9, 88,172,235,214, 18, 14, 98, 22,126,126, 85, 97,145,230,155, 99, 13,
-112,222,180,137,196, 60,207, 2,218, 49,220,198,234, 41, 22, 16, 91, 17, 44,170,122, 27,128,218,246, 10,242,182, 10,108, 40,233,
-115,161, 24,137, 34,213,202, 57,107, 36, 45, 27, 57,196, 41, 71,140, 94,116, 70, 98,109,100,197, 69,171, 62,130,141, 62,191,118,
-129,116,202,123, 51,201,100, 48, 47,194,250,183,214, 98,242, 39, 60, 61, 61, 33,103,153,124, 48,237,209,220,165, 8, 88,106, 94,
- 55, 88, 43,211,210,146, 99,155,150, 24,114, 48,198,234, 22, 60, 54,164,117, 86, 81, 57,215,137, 97, 44,130, 8, 47, 9,198, 27,
-172, 49,226,105,158,117, 71, 94,116, 79,175, 83, 68,222, 93, 35, 92,199,230,122, 28,149,214,137, 31,157, 98,165, 16,146,178, 14,
-146, 62,139,229, 61,201, 93,224, 22,181,201,121,203, 83,175,123,201,221,166, 86, 94,192,103, 82, 39, 50,163,238,235,203,119,166,
- 85,125, 12, 73, 66, 7,208,200,190,251, 67,215,181, 83, 57, 76,201,219,135,114,224,153,213,191,163, 91, 63,116,105, 99,160,125,
-149,208,219,244,112,192,215,210, 77,145,193,194,157, 84, 81,208, 94, 60,228,110,223,108,138, 28,122, 49, 39,101,246, 8,121,106,
-242, 6,182, 4,108, 90,154, 82,138,109,228,151, 58, 78,121,101,201,231,162, 1, 19,138,164,205,106, 3,226, 2,245,192, 2,140,
- 4, 36, 9, 31,176,196, 24,188,199,105,112,112, 44,217,206,169, 16,182, 24, 1,199, 64,146,223, 51,170,237,163,168, 0,142,148,
- 19,156, 11, 97, 11, 1,222,138,226,179,170,254,115, 6,182,148, 52, 48,161, 52,175, 1,149, 44,169,112,148, 65,228,212,223, 89,
- 14, 42,133,134, 22,238,233,250, 29,198,119, 87,166,235, 67,134,180, 0,211,189,119,211,124, 18, 55,226,210,158,211, 66, 59,228,
- 40,115, 19, 28,202,205,166, 56, 78,170,215, 8, 20, 87,210, 69,176,242,126, 51, 43,173,168,161,228,247,235, 96,135,204,220, 10,
- 80, 24,188, 95,159, 45,239, 64, 95, 63,189,188,124,218,179,206,115, 3,236,176,174, 42,154, 24,240, 35, 73,109,253,208, 43,149,
-143,237,247,209,133,107,116, 57,242,180, 91, 74,161,197, 64,170,132,200, 44, 88,215,126,213, 21, 75, 65, 38,135,207, 99,193,191,
-250,243,191,198,255,240,223,254, 17,158, 46, 22,127,251, 1,248,213, 54,128, 7,143,111,105,192,143,206,247,240, 33,193, 76, 35,
- 78,230, 30, 15,111,238,113,126, 24, 96, 13,240,123,191,247, 51, 92,174, 79,120,247,205,183,120,251,201, 91,156, 79,119,248,197,
- 47,126,129, 31,253,232, 7,120,251,246, 13, 60, 7,124,253,171,191,195,229,221, 7,204,243,130, 53, 22,124,120,188,128, 54,128,
- 39,143, 56, 26,140,222,232,117, 38, 55,253,224,156,238,106, 11,172,101, 21, 53,137,109,110, 24, 60,222, 95,174, 8, 69, 44, 96,
- 50, 94, 37, 56, 99, 53,175, 90, 40,111,185, 22,123,134, 97,189, 64,109,252,232,145, 34, 33, 45, 11, 6, 47, 15,238, 45, 36, 36,
- 83,164,120, 87,235, 41, 91, 41, 4,196, 61,146,116, 82, 39,227,127,195,131, 8, 93,157, 76,157, 66,221,187,226,104,223,221, 66,
-128,179,131,216, 2, 73,167,141,134, 91,194, 25,177, 65, 41,178, 90, 73, 33,202,254, 90, 5,184,133,208, 10,135,250,161, 87,113,
- 49,105, 49, 90, 84, 93, 63, 47, 51,188,115,226,225, 46, 2,249,113,206, 41, 83, 66, 32, 89,150,101,244,110,173,197,211,211,147,
- 78,255, 60, 66,140, 32,235,116,133,166,247,133, 97, 73,151, 76, 22,126,112,216,182,173,137,230, 66, 16, 62,187, 31,134,134,202,
- 45, 40,141,229, 31,131,176, 5,114, 17, 33, 39, 43,243,190, 62, 59,193,251,189, 68,144,135,147, 33, 6,229,132,211, 52, 73,106,
-163,119,184, 92, 46,178,190, 41, 82, 56, 36,229, 81, 20,136,120, 77,172,122,128,245, 30,166, 64, 53, 21, 5,211, 52, 97, 11, 43,
-230,101,110,150, 69,201,174,224, 86,144, 53,246, 58,139,235, 39, 4, 17, 88,102,109, 20, 88, 5,129, 81, 15,121,249,220,228,235,
- 69, 8,153,145, 26,180, 74,246,236, 33, 23, 12,198,225,243, 95,253, 26, 75,200, 72,133, 53,195,161,131, 85,117,198,159,172,236,
-249, 94, 80,190,167, 87, 84,250, 41,119,116, 26,238,162,169, 75,123,198,236,107, 63,157,219,149,178, 31,234,245,128,145,206,229,
- 22,250,121, 11,151,121,222,157,124,231,193, 94, 58, 4,223, 11, 42,224,250,247, 77, 13,223, 44, 64,164, 15, 69,125, 99,168, 42,
-223,123, 30,247,158,247, 78,120, 65, 17, 88,142, 10,236,190, 6,105, 85,155,206, 99,234, 97,148, 75,129, 53,146,117, 35,251,184,
-170, 45,160, 54, 37,224, 34, 24,203,234,231,132,218,193, 70,239,132, 15, 28, 55,148, 45, 72, 38,117,140, 2,217, 80, 18,157, 99,
- 43, 94,222, 28,213,242, 84,224,157, 19,182,182, 97,101, 7, 73, 81,225,140,140, 93, 5,230, 31, 97,217,193, 58,143,243,105,194,
-121,240,224, 44,202,208, 45,110,226,155, 55, 98,143,217,230, 85, 59, 10, 69,234,114, 69,235,138,224, 14, 89,118,147,163,119,123,
- 94, 56, 51,162, 10,243,108, 17,251, 19,195,128,114, 22,226, 92,169, 24,222,220, 68,194,234,108,147,117,192,174,246, 58, 48,216,
- 27, 45,189,200, 43, 43, 90, 94, 87, 48, 8,116,252, 37,221,191,170, 66,107, 4,106,229,194, 55, 33, 98,214,107, 53,117,197,231,
-205, 68,169,187, 94,235,190,125,199,219,212,124,119, 28,172,109, 56,104, 56,142, 41,132, 77, 39,211, 9,220,110,161,133,229,249,
- 95,236,158,250, 78,133, 95, 57, 16,181,211,111, 22, 55,186, 77, 79,168, 37,118,222,247,244,189, 75,160,174, 23, 8, 93, 40, 6,
-218, 68,166,223,209,237,244, 90,106,164,175, 61,210,150, 81,156,195,167,191,255,199,248,112,126,139,255,237,207,255, 18,159,188,
-122,131,175, 30, 19,166, 79, 63, 5, 13, 30, 63, 26, 45, 94,221, 89,220,191,254, 12, 48,132,207,166,123,164, 20,240,201,195, 91,
-252,253,223,254, 45, 78,222,226,225,244, 22,127,247,139,191,194,235,215,119, 0,143,120,255,248, 53,166,179,131,117,192,178,204,
- 88,183, 5,151,121,193,229, 26,112, 89,102,132, 45,131, 67,193,130, 77,198,226,136, 48,186, 19, 36, 18, 62,120, 82,219,149, 88,
-199,100, 85, 65, 53,190, 56, 4, 20, 54, 48,131, 81, 37,242, 0,235, 28, 82,145, 8,216,182,175,208, 9,219,116,154, 84, 92,198,
-216, 86,106,215,147,115,140,156, 87, 68, 83, 64, 49,180,148,196,138, 70, 53,214,162,196, 12,239, 69,244, 38,107, 54, 77, 95,171,
-172,121, 8,173, 46, 43, 77, 45,103, 17,169,213,107,199, 24, 3,235, 29,158,174,139,128,116,156, 23, 64, 85, 44,216,194,134,204,
-132,117,139, 66,121,204, 73,236, 75,165, 52, 69, 52, 90, 50, 33,183, 9, 90,214,152, 77, 54,178,134, 11, 33,224,245,235,215,120,
-255,254, 67,115, 40, 48, 51,158,158,158,196,161,227,173,116,162, 41,201,129,175, 9,127,235, 42,152, 97,103,237, 78, 59,211,103,
-114, 76, 9, 88,143,107,163, 45, 70,213,138,200, 10, 42, 69, 89, 57,132,152,176,173,162, 93,144, 52,206, 44,129, 38, 84, 17, 85,
-194, 58, 97, 34,137, 51, 53, 70,226, 86, 75,150,228,199,148,176,205,215,166, 91,114,222, 98, 89, 23,100, 16,230,121,214,213, 30,
-235,193, 75,160,148, 16, 99,193, 26,100, 92,110,172, 19,220,112, 12,162,100,143, 9,169,253,174, 59,225,180, 61,203, 27,251,129,
-117,106, 16, 59,151,141,232,141,136, 8,166,136,253, 57,101, 32,229,112,160,160,102,125, 64, 21, 18, 53, 63,233, 51, 55, 65,200,
-120, 65, 61,243, 92,118, 23, 75,190,213,132,181,162, 77,159,163, 10,104, 75,237,220, 68,203, 97,193,161, 89, 82,247,153, 2,107,
-184,123,102, 88,168,159,184,226, 99,218, 3,144,190,187, 3,167,254,219, 16,190, 83, 5, 44,248, 81,115, 80, 30, 87, 37, 51,158,
- 5,176,224, 32, 50,162, 67, 58,214, 81, 60,215,143,119, 27, 2,176, 99,115,115, 83, 11,247,138, 38,211, 69,149,106,167, 84,118,
-197, 49,105,190,158,115, 86,144,171, 41, 52,159,183,169,221, 78, 45, 62, 12, 33, 71,165,188,129, 48, 16, 97,100,134, 35,160,196,
-128, 20, 69,217, 74, 58,122,166, 44, 52, 35, 99, 69, 52, 87,171, 70,171,222, 76,203, 69, 15, 82, 37,163,177,116,247, 4, 66,138,
- 5,156, 25,222, 58, 5, 51,220,193, 91,131,176, 38, 77, 99,147, 11,104,240, 14, 84, 0,179, 5, 24, 85,225,182, 93,186, 90,213,
- 10, 68, 5, 63,175,162,178,205, 26, 95,201,138,111,140, 65, 20,192, 18,215, 91,246, 89,134,238,147,178, 34,118, 83,173, 54,117,
-132, 75, 53,155, 24,249, 70,197, 94, 63, 67,214, 76,250,164,104, 87,177,144,136, 70,147,193, 9,160, 98,218,100, 4,117,252,168,
- 25,195, 57,229, 22,169, 89,199,238,160, 10, 21,226,246, 57,102,202,234,237, 39,200,237,193,106,153, 41, 59,126,241, 38, 5,176,
-116,132,167,114, 76, 78,144,130,138,122,141,101, 63, 97, 58,254,255,182,255, 44,187,142,158, 75,238,108,116,164,217, 8,185,179,
- 88,222,130,100,169,243,250,211, 33,202,181,177,221,137, 0,200,132,166,238,224, 43, 66,185,238,224, 72,133, 85, 81, 91,121, 63,
- 56, 25,215,174,107,243,241, 26,107, 97, 6,143,159,253,225, 63, 5,149,132,100,129,233,135,159,226,247,254,171, 31, 35,108, 17,
-231,211, 8, 71,192, 23, 95,125,129, 55,159,126,130, 47,191,252, 7,252,248,244, 35,252,221, 23,191, 4,197, 79,241,203,191,255,
- 37,214,101,197,171,135, 55,248,155,191,249, 59, 60, 93, 87,140,227,132,191,254,155,191,195, 23, 95,254, 26,247,119,103, 60,190,
-251, 22,191,252,252,215,152, 47, 27,114,150,123,200,129,193, 70,162, 76,207,198,226,206, 88,193,178, 34, 99,176, 22,201, 36,153,
- 60, 1, 56,121,135,147,183, 24,198, 65, 86, 64, 49, 99, 28, 6,100,170,176,152,162,254,109, 29,207,107, 18, 88,213,193,156,198,
- 81, 82,185,114,193,224,207,200, 57, 99, 36, 96, 93, 55,196,148, 33, 43,201, 44,171, 71, 18,200, 16,147,160,149,151,117,131, 31,
- 38, 9, 48, 33, 32, 39,130, 49, 64, 78, 65,227, 68,141,128, 84,114,106, 74,230, 2,161,153,165, 20,145, 67,210, 92, 8,153,226,
- 45, 91,128,177, 30, 9, 25, 75,140,216,130,236,221, 99,202,200,170,124,168,235, 31,106,209,213,162,116, 39, 29, 1,135,176,105,
- 24, 9,201, 1, 29, 19,182, 20, 36,245,206,122,241,163, 35,194, 89, 43, 8,106, 37, 77,142,131, 19,120,141,177, 58,198,149,124,
-139,235,101,193,224, 19, 70,167, 58, 18,213, 92,164, 28,219,243, 35,231,172,144, 45,233, 6, 99,148, 84, 71, 9, 63, 73,152,198,
- 17,180,172, 50, 34, 38,129, 70, 73,188,173, 69, 44, 81, 10,114,181, 12,147,142,224,207,131,151, 32,153,176, 85, 15,151,188,254,
- 84,212,109, 84, 35, 75,101,171, 22,115, 2,140,124, 54,214,141, 40, 70, 86,151,107,136, 96,197, 21, 91,107, 17,214, 40, 57, 4,
-117,146, 86, 58,177, 76,129, 2,100,146,230,174, 37,216,250,126, 20, 93, 99,166,164,207, 93, 52,177, 34,161,128,187,243,166,205,
- 41, 43, 53, 9, 5, 91,204, 96, 99, 17,144, 53, 55, 29, 66,147, 3,129,171,253,111,255,166,205,166,221,196,186, 93,131,177, 3,
-175,212, 5,193,125,226, 37,239, 1, 87, 73, 27, 31,214, 64,179,146,171,250,189,236, 1, 44,184,149,226,210, 71,161, 92,183,157,
-251,119,167,173, 85,107, 85,122,145,194,245,236,225, 10, 17, 5, 85,139, 79, 37, 77,209, 13,242,147,122,155, 29, 58,254,119, 5,
-124, 80, 1,155,125,244,154,149,237, 75, 29,115,119,207,127,175,176, 35,131,146, 9, 33,110,205,130,192,170,196,102,221,239, 59,
- 43,203,253, 98,132,252,198, 25, 56, 57,198,228, 25,148, 3,194,182, 42,163,187,136, 93,165,112,163, 91,213,221,113, 86,111,170,
- 33, 2,114,132, 97, 35, 23,125, 73,218, 89,235, 7,150, 37,195,197, 26,131,193, 89, 29,187, 19,226,182, 96,139, 27, 98, 10, 26,
-175,233,192,206, 2,133,224,109,132, 0,157,170,200, 67, 84,247, 41,203, 56,157,107, 66,218, 22, 96,188, 3,172, 69,214, 4,163,
-172, 93,135, 28,254,202, 35,214,142, 7, 89,160, 8,169, 36, 36,136, 80,173,173,155,169, 60, 75, 43,107,197, 25,147, 80,232, 20,
-170, 32,162, 76, 77,195, 2, 80, 88, 58, 19,168,163,162,212, 28,243,154, 58,151, 21, 61,154,179, 6,233, 40,255,187,163, 20,150,
-238, 38,102,170,182, 55,210, 7,246,115,204,240, 51,174,188,238,249,110,209,175,251, 65,255,252,159,156,159,203,214,219,247,239,
-131,134, 14, 73,113,185, 89, 2, 62,230, 29, 57, 80, 22,251,149, 64, 37, 71,213,174,189, 84,188,100,135,115, 86,133, 52,154, 64,
- 50,227,247,255,224, 15,240,147,223,253, 9,190,248,135,207,241,205,175,127,141,146, 34,136, 0, 63, 56,176, 55,240, 35,225,205,
- 39,111, 65,229, 53,194,186,224,238,238,132,191,248,247,255, 30,206, 91,120,231,241,151,127,245,215,120,245,171,175,241,238,221,
-215,248,229, 47,127,133,247, 31,222,225, 63,252,167,191,198, 50,111,248,213, 87, 31, 64,185,224,233,241, 29,190,253,250, 29,140,
-117,202, 83, 7, 78,163,199, 58, 47, 8,171, 88,158,188,181, 24, 89, 34, 40,211, 22,240,230,225, 14,119,163,195,153, 53, 55,130,
- 1,111, 25, 33, 18, 76, 32,112, 49, 56,123,135,243, 48,192,141, 14, 41,203, 67,107, 28, 70,108, 73, 68, 54,134, 5, 19, 28, 82,
-130,243, 14,131, 17, 33, 90,138, 81, 59, 86, 66, 82,206, 68, 78, 9,195, 56,129, 13, 48,157, 38, 92,231, 5, 88, 54,120,199, 32,
-246,216, 98, 70, 6, 33,198,140,113,114, 8, 23,129,242,220, 13, 19,156,157,176, 45,151,246, 16,222,182,128,113,114, 13,183, 44,
-202,245,164,247, 17,171, 37, 83,212,221,194, 81, 23,129, 88,140, 25,203, 22, 49,175, 2,205,201, 57, 55,125, 73,125,166,182,253,
-111,125, 22,178, 80,237,130, 50,245, 73, 69,159,243,188, 52, 40,209,187,119,143,234,137, 79,250,181, 65, 82,202,140, 67, 73, 1,
-203, 42,147,136,160, 33, 59, 18, 90, 35,145,182, 57, 39, 44,155,164,173, 13,222, 3, 70, 10,233, 24, 99,155,112,228,117,131,243,
- 2,213, 41,101, 47, 56,157,115,152,198, 9, 12,146,226,164,138, 22,115, 6,114,128,233,179, 30,244, 94,141, 97,195, 28, 3, 70,
-239,133, 92,152, 11,176, 69,120,239, 97,116, 98, 80, 89,232, 69,217, 30, 33, 69,164, 45,170,240, 77, 94, 3, 27, 3,235, 8,219,
-186, 42, 56,167,128,139,172, 15,170,168, 13, 93, 10, 39,186,232,111, 33,221,137, 0,175, 80,222, 39,191, 89, 44,203, 37,239, 90,
-136,166, 81,209,154,122,239,216,119,144, 84,206,132, 88,148, 34, 87, 15,238,194, 40, 44,112, 31,129,157,209, 30,185,212, 89,113,
-119,107, 46,237,141,146,158,228, 57, 23, 40,175,173,149, 19,185,241,136, 88,138, 63, 45,166, 12,153,163,165,237,152, 73,253,155,
-254,249,126, 95,245, 82, 93, 80,109, 12,253,129,222,143,230,203,205,249,208,212,153, 47,248,247, 14,158,247, 92, 14,194,129,227,
-215,118, 93, 17,161,115, 8,239,234,195,140, 93,113,154, 33,226,138,254, 37, 24,125,127, 68,164,198, 26, 49, 40, 69,131, 97, 96,
- 26, 44,188,147, 20,171,186,143,201,170, 8,181, 70,178,115,136, 73,134, 5,137,224, 13, 3,185,192, 25,130,103, 35, 99, 41,150,
-174, 92, 42, 71, 70,200, 82,142, 17,146,100,159,187, 12,162, 13,203,178, 97,221, 36, 43, 59,235, 41,230,188,131, 29, 61, 56,201,
- 88,113, 75, 59,194, 36, 70, 73,214,202,200,251,248,135, 13, 66,145,215,206, 70,242,171,201, 74,181, 92,191,175, 20, 75, 2,227,
- 33, 5,199, 64,132,254, 13,153,200,245, 32,214, 67,182,137, 23,187,137, 75,221, 39,151, 86,168,238,169, 68,213, 66, 72,213, 57,
-202, 59, 61,174, 41, 71,139,218, 6, 83,208, 88, 76,181, 77,182,148,213, 78,104,194,149, 64,215, 31,224,121, 47,220, 74,126,153,
- 0,119,224, 37,244,194,185,242,140, 76,247, 12, 97,124, 19,217,122,252,199,116,254,124,209, 69, 20, 28,105,102,253,216,190, 60,
- 75,133, 45,109,100,222,252,234, 93,230,108,205,130, 39,133,148,212,239, 91,239,102,102,194, 79,127,250, 59,226,129, 14, 27,182,
-109,193,122,189,138,165,203, 59,144,181,248,171,191,252,255,240,246,241, 83,228, 24,240,229,231, 95, 96,156, 78,248,252,215, 95,
- 1,148,193, 57, 99,125, 90, 48,159, 63, 32,196, 13,171,198,159,162, 72, 36,235,246,248, 1,227, 48,224, 68, 64,156,103, 88,159,
- 49,164,140, 82, 4, 91, 58,121, 15,119,119,135,101, 94,225,172, 48,214,195, 22,144, 12, 99,153, 47, 56,157,126,130,123,206, 56,
- 15, 3, 82, 22,223,249,101, 93, 96, 17,145,214, 13,159,220,159,113,119,158, 16, 29, 16, 11,195, 17, 99,100,131,240,180, 32, 23,
- 1,150, 20, 20,196,121,129, 37,134,243, 30,203, 50, 99, 24, 61,156,183,210,113,170,157, 43,165,164, 93,183,193,178, 68,177,117,
- 89, 35, 4,197, 40, 41,132,203, 58, 35,165,132,203,229, 9,195,224, 81, 72, 66, 65, 38,239, 68,249,158, 9, 65,189,245,178,139,
- 85,210, 95, 74, 45,219, 34,132, 0,235,100,175,191,109, 43, 80, 24,107, 8, 88,150,128,144, 54,204, 91,108,255,110,233,237,185,
-234,205, 46,101,119, 11,229, 44,233, 96, 45, 78, 89, 15,171, 24,147, 80, 45,181,216,155,198, 65, 21,240,132,109, 91, 68, 60,102,
- 68,169, 62, 76, 3, 82,148, 32, 22,102, 35, 40, 91,189, 50,173,177, 96,182, 88,182, 89,224, 53,196,234, 65,103,144,181,210, 49,
- 87,204,105,148,157,255, 96,141,222,219, 34,246,173,191,167, 20,233, 85, 43,179,107, 75,168, 53, 92,178,131,206, 90,144, 93,150,
- 5,150, 8,198, 16, 66, 46,200,235,186, 99,142,149,220, 6,133,243, 24, 88,121,206, 40,245, 13, 69, 18,216,172, 49,216,180,113,
-204, 73, 44,159,131, 31, 16,147, 60,131,209, 16,189,187, 85,187, 78, 94, 74, 21, 72,107,146, 94, 59, 32,116, 68, 81,106, 71, 92,
-244,121,216, 1,193,154,128,145,164,224, 74, 69,243, 64,148,142,202, 34,140, 64, 33,153, 6, 87,209, 99,133,255,160, 28, 1,155,
-237,222,110,204,143, 26,228,210, 69,173,148, 35,207, 35,183,181,177, 20, 62,165,238,212,191, 79, 12,234,119, 31,238,244,253,206,
-118,218,201,115,183,153,230, 71,117, 47,218,195,191, 77, 79,158,165,197,149, 22,101, 87,167, 12,172,163,228, 74, 80, 99,236, 29,
- 82, 81,202,210,254, 46,150, 93, 93,212,133,120,168, 82, 66, 71, 79,249, 8,222,209,138,217,177,228, 18, 35, 39,129,184,168,213,
-200, 73,126,169,140,230, 98,148,221, 53,108,219,157,212,124,118,160,192,148,172,147, 8, 96,176, 86,236, 59, 64, 27,241,100,181,
-106,212,168, 91, 99, 8,214, 1,108, 18,182, 32, 15,157,152, 11,162, 30,150,214, 48,220, 96,229, 33,157, 36, 23,121, 75, 34,234,
-200, 40,200, 53, 18, 82,233,119,165, 10,173,148,221, 45, 63, 93,197, 23, 44, 93,100, 76, 73,169,113,212, 84,249,162,120,207,141,
-191, 78,189,110,162, 11, 60,233, 16, 46,187,151,178, 23,100, 22, 58,164,147,245,213,115,179,156,244, 37,102, 17,220, 98,214,212,
-162,146,178, 10,247,168, 1, 63,160, 99,119,148,110,212,222, 21,146,251,205,152,111,166, 69,207,243,213,235,215,244,144,155,151,
-226,100,233, 70,160,185,187, 68,118, 21, 12,181,137,193,158,121,222,227,106, 63, 86, 3,247,128,158,220,125,125,125, 32,212,195,
-187,116, 68,197, 92,175,119,222,137,144, 72, 1,255,230, 95,255, 31, 48,222,201, 1,147,178, 98, 72,165, 80, 50, 46,225, 47,255,
-195, 95,226,155, 47,191,193, 22, 87, 17, 90, 89,139,147, 55,248,227,159,255, 12,247,134,240,248,205,183,184, 92,102,224,126, 66,
- 97, 66, 76, 64, 90, 3, 82,216,176, 33, 23,165, 82, 0, 0, 32, 0, 73, 68, 65, 84,209,138,180,205, 72,153,144, 9,216,174, 23,
-148,117,133,177,140,247,143,239,241,230,213,107,220,121,139,178,206, 64, 8, 66,184,171,180, 66, 21, 37,221,157, 6,188, 57, 15,
- 98,109,179, 6, 15,247, 30, 95,165, 5,228, 12, 62, 57,121,220,221,159,241,148, 55,108, 84,112, 9, 66, 26, 99, 35, 15,117,217,
-143, 39,140,222, 99, 13, 2, 96, 25, 71,197,121,230,140,109,219,192, 68,152,166, 73, 87, 53, 34, 8,117,214, 98, 94, 54,237,244,
-229, 29,172, 22,184, 98,101,167,107,136, 48,158, 78,200, 41,136,130,218, 88, 16, 41, 60,101,139, 40,133, 53, 44,165,174,166, 10,
-150,117, 17,219,151,178,228, 69,209,110,176, 44, 43,214, 32, 93,122, 42, 69, 58, 58, 62, 72,117, 91,115, 82, 87,147,222,123,220,
- 79, 35, 0, 40, 36, 70, 40,116,235,186,201, 72,220,122,164,156,144,227, 14,157, 97, 77,101,156,151, 43, 82, 92,224,221,128, 16,
- 86,140,131,199,120,154,176,174, 43,166,113,130, 99, 3, 42,192, 60,207, 58, 53,148, 2, 40,101, 32,132, 13, 86,195,106,160, 17,
-159, 57, 10, 38,155,141,132,210,180,235, 91,247,222, 65,167, 33, 86,137,126, 41,103, 25,238,229, 61,223, 33, 35, 99, 24, 39,196,
- 40,147, 20,195, 44, 43,133, 44,133,107, 98,218, 19, 32,244,123, 88,118,200, 41, 55, 41, 72, 41,164,106,117,224,122,185, 2, 0,
-134, 97,148,192, 32, 45,220,122,145,116,239,247, 38, 52,181, 25, 98, 22,102,130, 49, 98,107,203, 58,109,233,155,132,186, 82,172,
- 92,145,218,205,139,227,168,104,234, 38,181,160,171,220, 5,152,138,236,129,218,231, 41, 88, 24,109, 46,242,126, 64, 23,220,164,
-182, 85,237, 4,122,222,132,184, 50, 74,161,103, 20,205,138,111,174,108,126,115, 30,167, 63,171, 36,180,186,203,185, 37, 97,244,
- 54,138,231, 9,107,249, 5, 78,245,243,177,250,158,129, 85,158,121,213,111,191,246,152, 98,213,123,218,203,206,166, 63,236,213,
-203,222, 73, 42, 47,157,111, 34, 93, 75,169,190,116,110, 49,128,205,248, 84,164, 30,226, 2, 88,203,176, 86,128, 10, 57,237,171,
- 2,203,210, 33, 56,102, 56, 35,152,205,146,178,112,216,153,224, 24, 56,121, 11,203,140, 24, 54,132, 58,142,211, 93,175, 97, 65,
-199, 26, 38, 85,249,102, 56, 61,208, 71,103,155,174,199,114,229,200,103,185,241,145,192, 92,224, 29,193, 90,169,116,162, 62,144,
- 11, 17,178, 37,176, 37,248,193,226, 52,141,114, 67,105, 62,244, 62,254,215, 7,126, 81,150,112, 75,163,147,139,133, 75,145, 27,
-156, 88, 68,113,149, 41,173, 85,124, 33, 70,246, 3,162, 49, 72, 32,212,108,154, 12,217,233,136, 0,238,134, 59,208, 29, 54,117,
-143,156, 91,135, 91, 29,214, 93,160,137, 98, 48,209, 51, 6,104, 87,129,215, 93,186, 92,216,249, 8,118,121, 9,188, 66,212,186,
-214, 91,208,204, 75, 76,248,151, 83, 3,159, 11, 45,203,205,207,237,209,178, 77, 4,167,255,153, 21,135,204,116,107,121,123,254,
-187,191, 84, 56, 60, 43, 36,154,107,131,143,146,217, 23,180, 45, 68,221,154,170, 20,228, 36, 29, 85, 73, 98,193, 33, 40, 14,152,
-164,243, 76, 33, 99,125,154,225,220,128,203, 60, 35,133, 21,110,158,241,179,113,194,159,252,228,135,112,235, 5,233,250, 1, 3,
-103,216, 28,129,176,194,198,136, 18, 86, 32, 6,108,235,130,184,109,237,105, 22,195, 6,107, 8, 84, 18, 6,231, 52, 50, 56, 75,
-247, 84, 10,114, 45,238, 99,128,203, 5, 63,251,225,167,184,183,132,183,231, 17,167,209,193,178, 80,186, 94,141, 30,247,227,136,
- 79,222, 60, 0, 92, 36,137,112, 11,136,169, 96,152, 70,248,113,196,186,174,216,182, 13,227, 52, 54,223,160, 81,124,243, 48,140,
- 42,124,149, 48, 19, 0,216,182, 85,148,223, 65, 34, 91,217, 24,156, 78, 39, 13,166, 41, 42,130,147,221,113,170,160, 36, 35,124,
-132,211,233,164, 15,119, 97,244, 69, 37,211, 13,211,136,109,219,212,191, 92,176, 5,249,154, 58,150,127,186,172,146,160,184, 37,
- 17, 65, 49,183, 29, 96, 70, 57, 8, 75,169,177,232, 45,222,190,125,139,233, 52, 33,165,140, 16, 54, 68, 61,184,234,158,187,138,
-243, 4, 45, 43, 7,198, 60, 95,101,229,144,162,166, 73,138, 8,108,209,236,244,246,123,150,130,109,221, 58,252,169,140,163,235,
-247,103,210,244, 52, 37,229, 89, 54,242, 61,137,116,202,208, 11,172,185, 81, 55, 99,202,123, 81, 95, 11,245,150, 19, 42, 83,166,
-233,116,198,214,242, 4,208, 1,155,106, 7,138,198, 75,167, 94,167,162, 54,198,156, 74, 99,180,199,152,176,109, 65,201,158,114,
- 24,199, 36,182, 62,195,220,233,101,106,128, 10,246, 96,151,238, 30,206,116,100, 60,150,162,128, 60,230,253, 94, 34,163,188,120,
-153,144, 85,162,104,245,161,214,247,177,197, 0, 55,231, 78,103, 63, 85,134,126,181,172,181,179, 44,203,127,175,160, 28,210,239,
- 83,186, 46,130, 94,192, 99,247,235,103,244,152,216, 82,142,170,221, 99,227,178,127, 32,223,119, 4,127, 60,208,143, 76,248,219,
- 95,230,197,232,202,190, 12,168,221,107,237,182, 95,136,177,172,180, 46,166,174, 35, 2,186,100,175,218,241, 43, 93, 75,119,235,
-245,233,183,219,161,234,135,115, 51,122,103, 21, 75,212,223,171, 64, 59,107,121, 19,189, 49, 90,249, 10,162, 48, 39,141,203, 51,
- 55, 59,126,245,193, 90, 46,194,109,182, 6, 76, 89,240,142, 18, 47,164, 63,187, 0,136, 0,229, 22,251,152,115,130, 20,200, 18,
-102, 66,204, 48,150,225, 44,195,123, 43,225, 51, 86, 68,123,121,178,216,130,211,247, 41, 41, 65, 73,196, 60,142,149, 98, 36,136,
- 21,112,142,242,218, 52,125,168, 30, 78,166, 89,193,248, 72, 93, 99, 85, 81,167,170,193,224,254,153,180, 79, 82,218,174,187,171,
-146, 11,117, 29, 46,221, 48,217,161,137,114,249,160, 1,215,153,140,236,208,187,177,253, 94,205,238,236,232,223,224,195,248,200,
-168, 29,207,174,199, 92, 11,199,151,168,113,183, 41,127, 84,186,157, 88,222, 19,147,128, 23,139,136,239,251,123,201,131, 70,255,
-174,243, 98,222,206,198, 42, 40, 50,119,233,133,185, 83,213,115,222,189,234,165, 80,187,198,251, 8, 99,134,236, 57, 63,188,123,
- 7,107, 13, 16, 35,158,230, 43,254,221,159,255, 5,134,176,225, 15,126,254, 83, 92,174, 23,204, 49,160,164, 8, 19, 18,214, 53,
- 98,139, 25,133,164,123, 45,180,169, 77,113,143,115, 78, 41, 74, 42, 26, 11,133, 44,228, 4,144,132,210, 76,195,136,112,137,248,
-197, 23, 95,227, 95,252,252,103,248,157,215,175,112, 30, 45,140, 1,238,201, 99, 76, 17,148, 10,188,117,248,228,254,132,252, 24,
- 49,175, 11,166,193, 33, 22,192,140, 3, 96, 12,182,205,162, 20, 25,135,155, 76,130, 78, 53, 6, 31, 30,159,244, 94, 20, 65,167,
-243, 85,213, 30,192,217,106,188,102, 58, 76,255,172,101,196, 53,138, 77, 52,197,118,232,203, 65,146, 48, 47, 11, 82, 46, 56,159,
-239,241,248,248, 8, 63, 12,120,247,254, 3,202,147,116,183,117, 70,104, 28,171,112,151,177,108, 1,243, 26,176,134,172,193, 29,
-165, 37, 39,150,155,117, 97,189, 57, 74, 41, 56,223,157, 37,168, 37, 69,108,155,236,144,151,121,195,182, 73, 64,204, 48, 12,130,
-108, 77, 17,107,140, 96, 50, 56,159, 78,112,206,234, 20,171,198,113,202,180,209, 24,139,117, 89, 69,220,166, 5, 65,203, 14, 87,
-170,163,181, 78, 29,162,117,175,173,171,175, 16,117,100, 45,215, 78,236, 86,157,165,100,192,200, 20,163,100, 2, 74,148,181,163,
-174,204,196,166,187, 23,244, 91,136,224,117,197,195,171,215,120,255,238, 27,113, 12, 89,215,174, 23,102,106,212, 68, 3, 22, 97,
-108, 86,207,119, 74,210, 97, 27, 9,246, 73, 41, 73,182, 61,147,134,183,200,231,105,140, 65, 12,186,127, 87, 15,125,213,158,212,
- 41,109,145, 39,163, 10,212,234, 65, 79, 45, 36,169,182,125,169, 86, 26, 36,211,129, 88, 74, 59, 31, 10,237,137,145,213, 45, 87,
- 61,231,164,118,194,106, 55, 51,120,158, 51,209,175, 7, 73,133,204, 13, 32, 93,202,206,152,208, 52,183, 35, 29, 19, 59,218,184,
-155, 32,216, 23, 78,227,227, 97,169,248, 88, 84,107,194,141, 5,167, 20,188,120, 40,127, 4,174,189, 63,136,152, 95, 12,189,200,
-157,221,166,190,168,221, 95,184, 31,234,109,228,122,224, 95, 83,167,102,239,236,114,148, 59, 91,207,238, 95,110, 21, 84,253, 96,
-116, 95, 5, 37, 11, 53,229,189, 34, 99,185, 31,175,230, 90,137, 9, 6,112,176, 66,170, 74, 73,196, 56, 53, 80,160, 10, 4,171,
-140,175,114,146, 37,230,181,192, 89, 9,142,145,191, 35, 61,188,138,170, 74,163,142,222, 5,130,144,179,240,140,193, 4, 50, 6,
-108, 13,140, 37,120,111,225, 44,193, 17, 96, 89,189,160,236, 16,162, 19,175, 58,138,112,186,115, 61, 48,179,112,219,181, 11,102,
-157, 95, 48, 19, 40,203,205,104,184,203,250,214, 17,147,174,136,118,250,224, 65,127,177,239,154, 75,243, 76,239,108,104,168, 38,
-161, 38, 47,202, 95,229, 27, 29,199,115,238,250,158,119, 94, 14, 2,178, 26,167,104,218,245,154, 59,179,227,127,198, 18,169,191,
-193,212,126, 83,178, 92, 75,135, 46,189, 94,115,124, 68,204,114,239, 29,239,188, 33,245, 58,191,157, 8,188, 52, 37,120, 73, 39,
- 82,219,124, 42,132, 91, 66,125, 29,219,230,151, 10,220,125, 9,167,235, 8, 29,247, 53, 43,226,254,159,101,221, 20, 80, 56, 35,
-199, 4,155,173,168,106,221,132,119, 92,240,111,254,227,223,224,130,130,127,242, 59,159,129,223,125,139,114,185, 96, 77, 25, 41,
-233, 94,152,140,240, 3,212,166, 40,221,105, 66, 41,182,229, 38,192,176,166,118, 73, 28, 98, 1, 36,162,216, 56, 60, 46, 9,255,
-238, 63,253, 45,126,254,227,255, 30,100, 12, 78,158, 48, 56, 7,159, 51, 6,239, 80,216,226,225,237, 43,172,105,197, 28, 86,108,
-108, 36,253,202, 18, 18, 1,211,201,195, 24,185, 70, 29, 57,217,101,147,148, 46,215,235, 21, 49,170,232, 83,213,244, 0,176, 44,
-139,236,168,115, 70,204, 89,125,236, 98,227, 50, 70,177,199,144,131,125, 93, 23, 24, 67, 24,188,197,182,109, 8, 49, 99,152,146,
-118,165, 17,126, 28, 48, 95,175,152,134, 17,151,167, 39, 93,225, 89,108, 91,196,178, 6, 60, 62, 93, 17,117, 53,209, 62,198, 66,
-207,100,198,189, 8,152,152,225,199, 17, 69,125,240,143,143,143, 40, 89,116, 1,198, 24,253,157, 24,167,243, 9, 79,215, 11, 40,
- 67,201,148, 43,238,238, 78, 88,230, 11,206,231, 19,182,109, 19,239,120,139,153, 53,200, 17, 10,182,145,194,189,118,175, 76, 4,
-235, 6,132,176,232,192, 69, 14,229,122, 57,110, 41,130, 24,176, 89,119,227,117, 82, 96, 52,121, 45,103, 16, 59, 12,227, 73, 66,
-128,132,138,129,117,139,226, 19, 87,193,151, 33,225,127, 96, 20, 23, 67, 12,155, 92,119,150, 49, 12, 67, 83,129,215,223,217, 15,
- 3,182,117, 69, 81, 1, 47, 25,131, 45,108,160, 40, 89, 1,206, 89,141, 8,238, 68,165,196, 34,162, 51, 70,108,120,186, 18,203,
- 45, 71, 66,207,233, 92,154,157, 77, 30,119, 74,159, 43, 59,225, 77,206,164, 74,123, 68,155,136, 52,196, 53,139, 85, 57,150,216,
-165, 74,238,160,169, 94, 84, 91,167,137,194, 92,168, 66,112,170,112,212,102,245, 45, 29,229, 16,154,180,217, 63,111,142, 28,251,
-238,236, 36,192,156,134,241,207,170,218,110,159,239, 31,153,213, 68,166,117,107,245,160, 34,254,120, 26,213, 45,148, 94,186, 96,
-115,168, 50,110, 15,245, 54, 2,145,229, 78,103,203,233,114,211,241, 66, 84,230, 97, 60,127,204,146,166,162, 57,240,221,207,224,
-195,152,118, 87,204, 87, 28,159,181, 12,211,128, 18, 85,157,206,112,218, 81, 83,243,219,139,159,219, 25,192, 25, 17,142,120, 67,
-200, 41, 34,133,136, 12, 77, 66, 83, 94,189, 33, 13,105, 81, 97,139, 49,132,193, 9,162, 49,134, 85, 81,169, 66, 80,138,165,130,
- 99, 68,141,234,141, 83, 30,180,238, 74,173, 5, 28,195, 56,131,193, 25,140,206,194, 59,249,249,206, 74, 22,180,245,246,128,207,
-132,238,118, 82,218,171,115, 46,250,126,144,236, 18,141,250, 75,137, 68, 72, 66, 70, 70,226,217, 88, 36,231,176, 17, 33,232, 36,
-162,158,111, 89,149,151,141,247, 79,125,150,250,109, 4,106,217, 11, 42,218, 67, 71,250,243,103, 79,111,235,199, 86,212, 37,150,
-150,131,208,141,251, 84,183, 14,151,250,210,248,253, 99,215,232,179, 78, 93,119,136, 69,175,159, 74,127,106,215, 98,243,130,151,
-238, 53,161,161, 93, 91,145,100,204,139, 63,231,176, 58,186, 57,216,111,241,201,141, 14,223,117,242,199,255,187, 73,182, 59,172,
- 4, 42,102,185, 67,114, 98,103,229, 31, 32, 65,221,238,143, 89,124,191,137, 9, 27, 1, 79,219,134, 95,125,249, 5, 74, 74,248,
-236,205, 39, 40,219,134, 82, 18,230,184, 98, 43, 66,213,202, 33, 73,224, 16, 65, 70,253, 33, 54,166,125, 86,142, 57, 21, 66,137,
- 98,195, 51, 70, 70,185, 49,137,205,244,233,241, 3, 94,157, 6,252,244,135,175,112,127,242, 56, 91,135,209, 90,248,105,132, 63,
-143, 48,119, 19,182,235, 5,215,121,198, 37, 8, 38, 52, 1, 18,234,162,187, 43,239, 61,182, 16,176,133, 0, 50, 6,243,117, 22,
- 92,168, 66, 80,166,233, 4,102,113,181, 16, 49, 66, 16, 93,138,168,199, 43,165, 80, 31,176, 57, 99,219, 86,152,150, 63, 78, 42,
- 86,147, 40,218,117, 19,103,140, 80,228,234,207, 16,168, 83, 76,162, 33,153,151,128,199,167,165, 81, 26, 97,234,253, 88,142,251,
-221, 22, 61,188, 79, 51,115, 41,136,185,224,186,206,248,240,238, 3,150,121, 69,206, 89,199,205,162,149, 25, 70, 65, 88,223, 63,
- 60, 8,232, 10,114,176, 23,100,141,154, 21,152,143,243, 78,147,246,138,166,206, 97, 23,144,245,130, 47, 35,215,121, 76, 81,207,
- 1,238,114,224,117,170,192,162,222,207, 74,122,148,120,210,130,243,221, 29, 46,215, 11, 10, 1,119, 15,247,136, 37, 34,198,128,
-113, 26, 17, 53,113,142,106,115,198,122,176,111, 27,206,147,236,248,185, 3,114,229,148, 52, 53, 46,180, 32,148, 10,202,201, 58,
-201,168,135, 96,108, 92,247,234,154, 82,129, 51,147,210, 64, 35,198,211, 40, 59,111, 80,211, 89,196,172,235,177,138,201,165,170,
- 99,146, 25, 49,105, 33,156, 75,110, 51, 99,249,220,140,250,194,185, 9,218, 36,127, 93, 86, 49,165,151,105,117, 41,160,220,199,
-130,215, 88,213,206, 66,158,177,115, 40, 74, 71,164,169, 76,247,227,212,144, 15,175,185, 54,193, 90,214,192,156,134, 73,216,239,
- 31, 57,212,113,139,195,160, 58, 18,200,207,193, 46,253,225, 89, 25,214,220, 30,113,135,228,172,190,131,169, 96,151,125,172,186,
- 87, 83,212,201,173,114, 3,142,124,100,204,175,222,238,126,252, 94,167,150, 7,194, 92, 15,169,193, 78,105, 34, 2,172,209, 46,
- 75, 71, 83,222,136,186,210, 25, 6,178, 48,199,141, 97,189, 16, 68,185,238, 12,193, 91, 3,107, 8, 49,110, 8, 49, 2, 21, 49,
-168,213, 97,141,193,148, 20, 37, 96,112, 6,131, 23, 47,235, 86, 19,158,140,149, 36,181, 84, 16,146, 20, 16,206, 57, 48, 91,164,
- 40,163, 59,227,157, 88,208,140,236,254, 39,239, 48, 56,217,203, 59, 35, 44,120,231,165,122,173, 72,199,164, 22,155,152,178, 42,
-104,247, 53,130,209,245,158,179, 6,214,236, 83, 5, 82, 11, 77, 33,131,204, 14,197, 41,251,189,237,105, 43,157, 14,251,197,202,
-244,209, 98, 13, 53,153,145,246,160,209, 22,220, 82,122,161,156, 57,144,216,235, 97, 94,121,251, 69, 31, 90,232,128, 57,125, 36,
-107, 99,196, 19, 55,245,240,111,123,168, 31, 46, 32,213, 92, 84, 96,197, 30,229,186, 67, 57,106, 68,172,196, 77,154,189, 40,225,
-227,193, 45,215, 66,205, 84, 67, 75,245,195, 11,160,164, 61,244,102,183,114, 82, 55, 89,169,120,227,106, 55,108,116, 57,122, 78,
-165,235,116,137,221,255,144,245, 81,162, 61, 69,102, 88,114, 50, 45,114, 22, 75,218, 64,134,154,203, 35,230,140,175,191,121, 7,
- 3,194,253,249, 30, 49, 37, 44,113, 67,208,225, 74,218, 4,154, 34, 69, 35, 35,133, 8,228, 2, 75, 86,148,203, 44,156,191,176,
-109,146,200,165,137, 85,169, 16, 82, 97,228, 24,241,245, 87, 95,224,167, 63,122,131,159,124,242, 10,167,105, 2, 91, 43, 33, 43,
-105,131,123, 56, 99,187, 94,133, 72, 87, 72, 70,218, 33,128, 12,195, 88, 7,239, 61,230, 69,212,240,203,186,194, 58,135,109, 13,
-109, 28,235,156,111,238,152, 24, 36,255, 61, 68, 97, 31, 12,227, 8,167, 33, 37, 41,139, 87, 61, 5,177, 80,202, 52,204, 33,164,
- 4,239,164,128,168, 41,111, 53, 48,101,217, 54, 24,150,221,110, 46, 18, 0, 50,175, 1,151,121, 69,200,149,157,166,154,150,166,
-117,168,130, 56, 52, 18, 88,191,162,100, 35,135,207, 60, 95,145, 99,214, 41, 71,110,108,122, 38,241,171,131,128, 16, 35,238,238,
-239,113,189,206, 50,134, 78,169, 37,176, 21,133, 59,213,169, 76,206, 89,116, 1, 49, 98, 24, 7, 61,164,163,138,255, 98,243,135,
- 19, 51,146, 78,228, 10,246, 46,146,170,104, 65, 97, 52,117, 98,231,189, 19, 88, 87,216,224,188,195,253,171, 7,204,203, 21,172,
- 22,185, 24, 36,134, 54,107,135,154,115, 22, 91, 99, 74,135,103, 60,119,205, 93,205, 28, 15, 81, 18, 49,173,115,106,181,221, 27,
- 10, 62,172,204,116, 45,106,141, 22,167,242, 60, 11, 41, 97, 24, 70, 24,107,165,240,139, 81,227,100,115,243,129,231, 44, 35,122,
-225,192,115,167, 82,231,221, 63, 94,167, 19,169, 52,151, 74, 77, 70,204,186, 26,104,161, 11,125,180,217, 13, 56,234,184,102, 46,
-109,101,211,132,188, 85,135, 64,250,254,116,143, 35,174,191,211,173,238,135,118,160,141, 57,249,187, 63, 3,212,119,220,184,188,
-183,103,250, 77, 88, 69,151,147,125,171, 92,239, 31,234,164, 73, 63, 90,163,180,152,205,221,206, 38,170,213,218,101, 8, 45, 44,
-105, 39,189,107,163,107,120,135, 72,175, 59,175,238, 77,199,127, 72,164,237,159,130,232,248,226,165, 66,118,118,112, 24,179,170,
-211, 53,199,153, 74, 65, 14,226,229,246, 76,152, 28,195,147,154,197, 89,160, 44, 34,228, 1,152, 11,140, 33,140,214,194, 22, 17,
-200, 68, 0,100, 37, 84, 35,197, 40,239,143,145,200, 86, 46, 25,174, 20,140,134,192, 86,136, 72,194,233,183, 0, 91, 36, 64, 42,
-253, 66,128,229, 14,214,111, 96,156,129, 29, 28, 42,253,223,123,139,201, 90,140,214, 98,176, 22,131, 55, 24, 29,195, 26, 96,244,
- 14,131,181, 10,138,216, 90,117,186,133,140, 20,179, 6,101, 8,179,216,177,193,201, 26, 56, 22, 78,113,234, 18,207, 50, 24,197,
- 14,200,214, 35,234,197, 95, 49,114,185, 16, 40, 21, 56,216,238,189,174,198, 21, 69, 73,148,220,182, 83, 89, 72,230,181,149,222,
- 71,141, 7,145,208, 81, 73, 78, 85,245,153, 51, 80,162,142, 68, 83, 39,122,131,218,120,228, 98,175,197, 74,173,194, 95, 10, 16,
-250,216,248,251,120,211,241,190, 39,103,193,230,202,189,148,119, 79, 62,239, 33, 71,166, 42, 84, 53,160, 39,117, 30,250, 99,126,
-250,158,184, 83,218,177,186, 43,218,111, 5,164, 5,123, 86,117,193, 65,111,180,199,217, 18, 62, 90,236, 42, 97, 82,245, 34, 59,
-214,102,143,106,228,198,236,175,132, 59, 42,178, 7,117, 78,188,206, 33, 38, 24, 55, 34, 91,143,175, 31, 31,113, 89, 22, 60,156,
-239,224, 51,129,131,176, 3,230,176, 34, 27,131, 88, 42,223,154, 96,141,111, 35,255,164,204,131,168,252, 3,174, 86, 60, 85, 69,
-111, 57,226,154, 10,190,252,252, 75,252,225, 15,127,132, 31,188, 57, 35,143, 44,220, 5,202,160, 31,190, 70, 92, 55,164,235, 21,
- 33, 17,150, 45,106,158,186,109,123,204,140,130, 57,110, 32, 43, 46,144, 22,159,154,229,240,141, 41, 98,221, 68,108, 70,106,147,
-154, 78, 39, 64, 59,108,231,189,128, 75,212, 75,158,138,164,140,149, 34,116, 59,235, 7,172, 49,194,141,131, 22, 0,178,203, 92,
-183,128,176, 73,248,130,243, 35,214, 80,240,225,178, 32,232,206, 54,215,195, 67,175,211, 26,175, 67,198,168, 32, 76,224, 53, 70,
-195,138,136,234, 7, 93,224,156,132,175, 72, 2, 28,183, 61,110,208,224,145,164,217,229,219, 53,224, 60,157, 16,214, 13, 6,132,
-117,217,240,201,235, 87, 58,145, 88, 49,157,166, 93,212, 5,134,119, 22, 57, 11,144,198, 57, 39, 36, 54, 5, 54, 9,255, 33,119,
- 2,172,210,174,183,162,207, 6, 38,200, 33, 91,178,164,233, 5, 57, 56,195, 26,129, 2,188,125,251, 22,235,178,128, 80,148,173,
-238,176, 46, 65,187,124,125,118,144,129,101,219,154, 40,153,102, 90, 68,146, 41,140, 64, 91, 44,136,133,169,158,136, 96,134, 1,
-110, 26, 49,157,207, 98, 23, 12,177,137,162,115,145, 96, 25,176, 1, 49, 48, 14, 67,139,216,149, 48,151,128, 97, 28,240,233,167,
-159,224,233,233, 34,122,144, 34, 52,192,162,187,145,214, 12,114, 39, 50, 85,212,114, 19, 52,178, 76,242, 64,132,162, 7,122,204,
-165,193,207,218,215,213,144, 21, 50,250,117,114, 58, 23, 42, 90,144,236, 34,242, 82,117, 12, 69, 2,191,138, 22, 47, 92,160,185,
-244,164, 98,111,179, 23, 49,154,202, 87, 5,117, 85,122,108, 78,227,248,103, 85, 10,255,125,136,175,223,109, 87,187,245,135,247,
- 9,109,154,108,117,171,110,167,231, 42,120,121,208,176,210,122,202, 33, 80,134,200,236,193, 24,116, 68,112, 10,133,237,246,247,
-224,170,177,110, 99,144,195,238,178,183,192, 49,193, 26,146, 32,142, 44, 97, 42,147,179, 56,121, 39, 43,193,156,181, 27,149,139,
-191,118,185,198, 48, 60, 19, 12,196, 30,150, 32,162, 17, 20, 32, 70,181, 51,177, 80,196, 12, 21,140,198,192,123, 70,166,140,101,
- 11,210,237,176,145,157,155, 90,125,178,142, 4,157,179, 48,206,128, 44,193, 13, 30,211,105,130,113,226, 27,247,158,225, 7,134,
-247, 6,126,180, 24, 6, 3,127,178,240,163,129, 27, 44,140,229, 86,137,135,152, 16, 82,145,155, 74,171, 99,210,169,131, 33,130,
-183,128, 99, 70, 82,171, 6, 74, 18,223,163,177,136,108,145,172, 65, 32, 32, 21,106,251,157,220,186, 13,179, 39,178,180,216, 84,
- 28,162, 88,123, 54,157,124, 46, 25,187, 20,130, 14,135,248,237, 5,184, 99,140,243,193, 98,198,140,150,112,214,175,122,234,154,
-232, 88, 96,210,111, 20,207,181,136, 94,106,203,158,206, 26,217, 43, 80,209, 37,209,221, 8, 65, 95, 80,203,223,142,195,219,235,
- 57,168, 18,232, 0,153,249,174, 98,228,165, 21,215,111,226, 68, 52,106, 98,231, 78, 56,132,205, 40,110,210,232,225, 46, 15,140,
- 26,229,171,220,134,154, 74, 21, 54, 92, 46, 23, 76,211, 36,200,211,156,113, 93,102, 25,101,103,104, 36,168,140,195, 11, 21, 24,
-125,248, 23, 21, 50,213,189, 99, 85,242,198,156, 17,115,130,245, 30,243,188,225,171, 47,190,198, 63,251,189,159, 97, 60, 1,238,
-100, 16,201,192,156,239,225,137, 16,222, 61, 33,100, 96,205, 25,151, 32, 7,109, 80, 64, 74, 42, 25, 31,158,158, 48,157,207,112,
-222,239,228, 71, 5, 39,173,155,248,180,137,118, 17,155,245, 35,214, 16,112,186, 63,131,140,116,221, 79,151,185,117,211,167,211,
- 25,243,188,128,141,213, 28,114, 39, 29,121, 46,202,137, 39, 44,243, 38,100,182,235,130, 24, 51,222, 63, 62, 33, 22, 32,182, 73,
- 83,133,158, 80, 19,116, 86,187, 44, 17, 97, 28, 71, 12,227,128,211,121,194,178,174,187,112,139,128,148,164, 99, 60,159, 79, 48,
-198,194,251,177,137,227,100,244, 12,132, 45, 96,240,131,144, 39,147, 56, 68,188,151,152,215,243,249,132,156, 51,174,215, 25,222,
- 15,112,118,196, 60,207,184,191,191,195,229,114,129,115, 86, 39,133,117,236, 91,158,137,160,251,156,143,186, 22,101,102,140,211,
-136,235, 44,194, 65,107, 44, 78,227,168, 46,129,140,105, 26,154, 19,231,116,158, 84,207, 32, 46, 12,210,169, 86, 78, 25, 41,198,
-157, 97,161,247,158,117,130,218, 53,234, 59,175, 89, 24,165, 20, 44,203, 34,104, 93, 72, 26,157,215, 9, 75, 84,127,124,209, 0,
- 21,209, 77, 4,248,113,130,177, 14, 91,216,244,243,223, 48,142, 39, 76,227, 73, 34, 86, 99, 84,187,157, 84, 5, 82,160,239, 72,
-214, 26,203,251, 76,216, 93,233,165, 47,104,200,159,137,112,203,254,140,146,103, 47, 29, 34,163, 27,228,166,123, 15, 82, 93,243,
-214,168,239,156, 95,182,207,190,208,100,183,241,251, 63,246, 80,127,249,128,223,247,162, 53, 25,235,121,164,235, 30, 53, 73, 10,
-192,101,226, 67, 62, 11,181,139,141,219, 40,212, 28,186,176, 46, 48,228, 54,246,181, 10,155,180, 10, 43, 57, 31,228, 93,172,163,
-255,234, 50, 17, 47,118, 6,178,216,213, 6, 67, 56, 15, 22,172, 83,132,154, 34,198,144, 96, 21, 33, 61, 1, 86,173, 97, 49, 69,
-148, 74,185,202,208, 52, 54,106, 81,163,166,136, 56,206,121,139,136,140, 53, 37,100, 13,143,129, 70, 66,130, 36,111,218, 89,134,
-243, 22,214, 59,192, 50,134, 73,110,124, 34, 1, 74,142,206, 98,114, 6,167,193,227,228, 61,166,209,201,127, 30, 60, 38, 47,161,
- 19,134,185, 85,171,185,136, 21, 69,172, 31, 69,215, 10, 6, 12,134,211,110, 46, 54, 15,187,146,245,216, 32,177, 69,114, 22,129,
-180,218,204,208,209,156,138, 63,176,239, 1,155,142,178, 93,129, 59, 54,114,143,125,201,173,234, 63,206, 93,122,239, 87, 63,130,
-207, 71,100,107,167,174,166,255, 66,135,250,237,212,169, 95,217, 84, 49,158,140,218,107, 88,202, 14, 69, 66,185,245,194,227,163,
- 63,183,239,220,137,247, 84,153,222, 37,210, 71,176,126,172, 96,126,233,240,127,233,181,236,239, 75,217,187, 16, 58,170,107,235,
-244,175,114, 20,234, 96, 62,163,118, 4, 73,246,162,134,224,199, 17, 91,140, 45,104,195,120, 81,190, 95,175, 87,241,189,235,142,
-179,142,111,141,181, 50,102, 15,241, 96, 69,108,192, 28, 99,177,197, 32, 1, 42,222, 99, 43,192,117, 43,248,213,231,255,128,127,
-241, 95,255, 12,211,235, 19,200, 79,224,243,189, 76,236, 30,103, 92,174, 11,222, 95,174,224, 97,196,154,147,220, 67, 84,148, 63,
-190,105, 16, 11, 16, 66,148,110, 79,243,192, 55, 85, 67,167, 44,215,110, 72, 25,126, 60, 33,149, 44, 48, 22,195, 88,214,165,221,
-227,203,178,106,112,136, 6, 47,105, 87, 92,106, 92,107,202,152,231, 5, 68, 6,243, 18, 16, 83,198,135,199, 11, 50, 17,100, 98,
-190,227, 62,169, 91, 55, 2,123, 44,175,113,146,101, 62,120,135,187,187, 59,177,147,169,247, 39,233,125, 20,226,134, 45, 6, 17,
-225, 2,184,187, 59, 99, 26, 6,196, 45,226,124, 58,225,254,124,198,186,174,200, 57, 97,154,166,134,113,246,222, 97,154, 70,228,
-146,176,204, 1,219, 26, 64,196,184,187,187, 19, 59,219,182,234,253, 99, 16, 67,198, 56,142,240,126,208,233, 88,105, 93, 96, 91,
- 5,169, 23,191, 6, 28, 89, 63, 32, 70, 89, 89, 16, 10,150,121, 65,138, 17,119,167, 9, 33, 6, 76,211,136,111,223,189,131, 49,
-140,207, 62,251, 20,160,234,137, 47, 48,206,163,164, 44,218, 21, 69,116, 85,107, 94,140, 9,167,113,146, 3, 47,229,102, 87, 46,
-250,186,114, 18,207,248, 26, 36, 55,224,116, 62,107,132,170, 64,180,140,151,152, 93,227, 60, 46,215, 69, 82,206,200, 40,201, 18,
-152, 47, 51, 6, 63,226,114,125, 58, 70,157,162,111, 16,187, 32,231, 93,120,210,156, 63,187,113,196,180,226,180, 41,252,193, 96,
- 50, 7,135, 73,157, 42,239, 16, 15,157,244,245, 19, 57,162,102,181,171, 80,155,166,140,175,239, 65,165,102, 86,187, 22,117,217,
- 20,234,166,120,126,168, 83,249,237,104,113,120,169,211, 62, 62,152,233,102,207,126,216,125, 86,146, 92,214,240,144, 94,148,208,
-139,128,244, 66,175, 57,212,242,239,162,177,221,153,123,236, 43,218,206,177, 29,232,117,188,219, 91,124, 25, 77,209, 88,147,143,
-140, 33, 97, 19, 43, 32,230,236, 45, 78,206,128,114, 66, 78, 89, 31, 88, 4, 74, 25, 86,167, 15,204,128, 51,226,117, 79, 73,148,
-190,242, 48,212,176, 25,173, 56, 12,137, 40,205, 25,134,243, 6, 33, 71, 36, 48,200,122, 8,203, 86,107, 77,150,157,214,224, 61,
-134,105,132, 25, 44,216, 18,238, 30,206,184, 59, 13, 32, 74,112,134,112, 30, 29,238, 38, 57,200,207,211,160,127, 60,198,209, 99,
-112, 78,132,121,196,216, 66,194,178,109, 8,185, 96,222,130,132, 77,232, 77,106, 20,246, 96, 72, 58,130,102,255,208,106, 41,179,
- 65,241, 30,217, 58, 68, 34,185,253, 52, 62,176,237,181,154,169, 10, 7, 34, 91, 41, 56,232, 35,118,219, 64,183,213, 81, 83,106,
-169, 75,247,103, 90,142,253, 32, 47,109,167, 94, 26, 5,240,191,196,161,222,135, 9,213,132,172, 67,224,144, 94,131,220,237,172,
-169,167, 28, 22,124,175,157,253,179, 81,127, 39,170,185,181,126,190,212,137,223, 42,227,191,171, 91,127, 46, 86,165,103, 78,213,
- 42,134, 98, 34,100, 42,141, 79,144, 75,233,192, 90, 89,119,174, 4, 63, 12, 58, 94, 4,236, 48, 98,217, 54,204,243,130, 97,244,
- 96, 98,196,173,242,207, 5, 40,146, 74,110,150,178,156,114,235,108,114,150,235, 59,107,183,147,178,132, 12,165, 82, 0,246,152,
-238,223, 96,205, 9, 95,126,254, 75,252,225,207,127,142,225,124, 2, 89,128, 70,143,248,238, 17, 31,222,125, 64, 72,210,169,155,
-105, 4, 57,139, 53, 8, 28, 38,132,168, 2, 52, 70, 8, 26, 96, 50, 12, 66, 84, 68,129,247,131,210,222, 60,150,117, 67,108, 93,
-111,128,113, 6,185,100,132, 24, 36, 48, 6, 56, 76,134, 8,132,117, 93, 81, 98,145,188,245, 24, 17, 66, 68, 72, 5,203,150,112,
-157, 87, 68, 21,100,101,146, 63,189,194,157, 25,237,185,117, 58,143,210, 69,151,140,101,221,192, 36,112,153,211,233,132,235,245,
-138, 92,168,229,187,215,113,109,221,171,111,203,130, 87,175, 94,225,124,154,224,189, 69, 8, 1, 94, 15,216, 92, 34,198,105, 80,
- 59, 89,196,221,221, 89, 26,136,148, 16, 99, 66, 8,162,225,121,120,184, 71, 41, 73,125,239, 3, 66,136, 66, 28,236, 28, 2,125,
- 70, 71, 21,136,161, 59, 43,114, 41, 56,157,197,223, 95,114,238,183,157, 34,114,203, 9,195,224, 37,182, 21,192,233,116,194, 56,
- 78,184, 94,101, 18, 50, 12, 35,114,138, 26,122,195,141,150,151,146, 20,145,131, 31,112,154,100,255, 95,138, 28,216,245,240, 43,
- 76,205, 97, 19, 82, 68, 33,192,143, 3,252, 48,192, 57,135, 45, 68,204,235,138,187,251, 7, 88, 39, 4,196,148, 69,239,129, 82,
- 16, 66,132,119, 78, 99,179,105, 95,245,154, 10,123,202,173, 40, 59,232, 98, 42,225,173, 67, 60,191,196,186,232,255,142,123, 12,
-122, 55, 21,167,142,108, 90, 71,246,226,124,160,142,170, 89,208,199,139, 86,161, 96, 81,103, 76,233, 34, 48,179,114,234,219,161,
-158,170,111,145,202, 63,170, 67,191, 69,187,114,247,112,189, 61,204, 15, 15,220,130, 23,199,242,187,162,184,238,164,118,255,250,
- 94, 59,148,166,198, 63,168,246,129, 99,216,133, 76,185,219, 7,213, 14, 3,173,128,170,207,157, 33,251,244,129, 9,103,239,112,
-114,140,146, 98, 35, 6,201, 4, 32, 43, 74, 81,236, 95,222, 48, 76, 19,195,136, 5, 41,101, 96,203,234, 77,213,149,129,213,194,
-193, 24,131,121, 13,200, 36,123, 72,182, 14,198,186,134,250,100, 54,152,166, 81, 14,117,199, 24, 38,135, 79, 62,121,192,195,221,
- 4,207,192,253, 56,224, 52,122, 16,139, 90, 62,233,222, 39, 22, 9, 36,189, 44, 27, 46, 75,192,101, 13,248,112, 93,112, 93, 3,
-182, 84, 16, 99,145,142, 5, 34,142, 19, 27, 27, 96, 32, 54,187, 84, 84,112, 66,106,141,179, 30,217, 14, 8,108, 16,137,144,116,
-228,158, 43, 96,162, 0,166,176,238,152,240, 29,135,204,203, 56, 85,234,119,233,116, 28, 21,213, 93,241,126,147, 72,255, 88, 21,
- 49,183,157,122, 93,161, 84,129, 75,157, 2,125, 12, 24,115,184, 17, 1,192,240,139, 62,114,166,126, 85,115,163,227, 40,191,217,
- 42,247, 49,251,218,126,168,151,166,112,191,157,102,189,164,104,127,233, 63,223,190,198,103, 30,252, 91,201, 43, 85,143,237,254,
-190,113, 29,211, 19, 61,227, 13,140,227,208, 60,188, 49, 73, 7, 46, 16,164, 8, 6, 97,112,190, 43,220,116,106,195, 59, 76,168,
-130, 73,138, 38,154, 73,254,156, 60,144,147, 10,179, 10, 50,238,238, 30,176,109, 43,150, 28,241,238,155, 39,124,251,229, 59,252,
-241,127,243, 79,225,207, 6,197, 18, 56,100,204, 31,158, 16, 0, 44, 41,227, 26, 3, 54,245, 2, 59,235,192, 16,133,185, 29,188,
-112,215,201,128,141, 81, 85,122,108,234,113, 54,166,145,232,234,252,117,158, 47,173,249,145,177,108, 18,235,148, 66, 88,228,186,
- 79, 24,134, 1,206, 90, 44,235,138, 66,140,121,141,184,180, 3, 93,197,164, 58,242, 23,108,106,214, 85,154,195,233, 60,226,238,
-254,132,233, 52,224,124,158, 0,146, 40, 89,107, 68,132,229,189,151,117, 89, 8, 8, 49,168,173,137, 26, 86,185, 54, 31,219,186,
- 98, 89,103, 92, 47,151, 22,217,234,188,149,207,169,100,140,227, 32,180, 49,203,152,166, 17, 4,194,245,186,136, 35, 3,128,117,
- 12,107, 45,174,215, 43,166,113,194,229,114,213, 78, 83, 15,141, 10,198, 41, 89,216, 6,181, 59,173,194,103,102,132, 40, 66, 61,
- 99,141, 76,104,180, 37,147,244, 59,135,203,117, 6,105, 94,252,117, 94,154,174, 32, 6,241,221, 27,231, 48,157, 70, 41,232,114,
-108,104, 99,107,101, 58,185,172,139,240,235, 13, 55,161, 97, 5,218,164,140,182, 6, 33,125,158,174,155,136,148,207,231, 51,252,
-224, 1, 2, 46, 79, 87, 16, 73, 74, 95, 41, 25, 49, 4,137,229, 77, 82,204,149, 2,148,148, 58, 87, 87, 31,200, 68,186, 7,231,
-131, 83, 97, 79,117,228,110,226,181,219,176,203, 11,162,113,116, 2,227, 46,180,100, 95,233, 85, 71,149,130,110,110, 11,251, 93,
-123, 81,147,229, 88, 5,125,245, 62,150,135,137, 49, 6,102,242,227,159, 85,148,158,102,226,128,126,203,241,123, 61, 32,123, 75,
-208, 78,145,123, 89, 17,221,146,102, 58,149,243, 81, 33, 72, 7, 79, 57, 83,205,237, 62,194, 63, 62, 54,118,111,197, 3, 58, 64,
- 72,205, 89,168, 49, 46,109,172,122,204, 81, 55, 5,176, 36, 34,185,179, 53, 24,184,198,132,106,148,169,170, 17,173,126, 16,198,
- 8, 81,206,212,209, 9,145, 40,128, 11, 16,138,136, 62, 90, 82, 27, 21, 88,245,212,206, 33, 98, 14, 25, 79,203,134,216,217,255,
- 13, 11,181,200, 88, 85,178,123,131,251,251, 19,126,240,233,107,188,190,155,112, 63, 58,188, 57, 79,152, 6,135,172,157,213, 26,
- 19,174, 91,196,251,203, 5,239,158,102, 60, 94, 87, 60,205, 1,151, 37, 97, 73,132, 37, 1, 33, 1,107, 16,222,244, 56,142,152,
-166, 65,208,136, 49,195, 40,140, 38,233, 5,212, 42, 98,235,145,157,208,228,130,238,219, 75,202,141,135, 92,189,220, 7, 65, 34,
- 29, 15,242, 62,207, 30, 55,126,244,190, 75, 61,136,198, 64, 55, 85,111,106, 55, 69,237, 24,136,159,119,234,220,169,212,129,239,
-215,201, 54,187,206, 11, 48, 36,211,171,222,219,181,114,115, 88,190,212,149,211, 17, 1,251, 82,177, 80,139,201,190,155,238,239,
-165,219, 63, 31, 27,179,255,166,105, 68,253,222,124, 67,117, 46, 29,148,206,152,202, 45,168, 19, 45, 77,169, 82, 97,148, 97,171,
-121,218,177, 37,152,165,154, 35,160,118, 28,195, 86, 80,161,186, 63, 39,210,201, 71, 46, 42,144,211, 2,162, 18,185, 64,176,206,
-203,126, 26,178,191,150, 29, 89, 64,138, 5, 79, 51,240,247, 95,252, 10,156,174,248,131, 63,248, 25,220,155, 7, 20, 34,108,239,
- 31,241, 52, 47,216, 10,240,180, 44,226, 52, 97,134,115, 30, 40,114,168,179, 53, 13,124,148,181,105, 97,102,196,144, 26,245, 45,
-132, 77, 34, 71,153, 16,131, 4, 35,129,128,117, 89, 52,163, 93, 94, 91,202,177,221,155, 81, 59,173,117, 93, 69,167, 18, 11,222,
- 63,206, 72, 69, 30,178,185,106,127, 12,239,108, 10, 61, 4,152, 9,198,114,235, 74,235,184,156, 0, 12,227, 0,107, 24,215,203,
- 19, 94,189,122, 85, 75, 35, 76,231, 9,227,224, 97,140, 16,221,106,227, 49, 77,131,174,200,118, 91, 84, 8, 17,235,186, 97,154,
- 38,164, 20, 48,140, 14,147,118,237,211, 40,158,245,101, 89,112, 58,143, 13,238,178, 44, 11,134, 97, 84,218, 28,169, 40, 84,138,
- 24, 98,130,183, 78, 1, 39, 53,175,131, 20,146,165,162,125,181,144,237,150,227, 58,206,151,130, 36,108, 81, 17,172, 5,235, 26,
- 96,140,197,124,157,145,147, 76, 68,188,151,226, 38,167,208,232,113,137, 4,186,228, 7, 47,130, 83, 8,196,139,173, 20,104,213,
- 42, 90, 84, 67, 16, 66,212,160, 27,209, 45, 60, 61, 93,241,240,112,143,109, 91, 97,173,195,245, 58, 35,132, 13,167,211, 73,172,
-186, 68,106,241, 83, 77, 80,221,119,215, 40,214,166,174, 63, 78,225,122,119,214,115, 21, 59,186, 64, 52, 58, 62, 8,107, 17,208,
-221, 79,253, 68, 25, 55, 58,151,151, 32, 90,153, 68, 52, 93, 35,121,187, 81,243, 94, 4,232,191,104,143, 7, 32,253,103,139,228,
-142,150,156,231, 72,248, 99, 64,203,199, 70,150,183,107,125,218, 83,212, 72,210,203, 8, 71,222,118,191,255,168,130,160,174,129,
-111,158,226, 3, 55,251, 5, 28,232,193, 75, 93,196, 87,207,200, 48, 92,127, 95, 21,182,168,141,195, 40, 19, 94,148,173,117,212,
-190,119,143,181,139, 5,147, 90, 32,128,162,227, 52,176,193,154, 10,214, 76,184,134, 94, 29,114, 55, 0, 0, 32, 0, 73, 68, 65,
- 84,132, 53, 17, 98,200,136, 37, 98,100,160, 88,192, 21, 2,167, 36, 0, 14, 54,120, 56,143,120,251,112,198,253,224, 96,203,128,
-145, 45, 98,220, 48, 94, 9,151, 37,226,113,222,240,120, 89,176,172, 17,243,178,180,164,159, 76, 35, 66, 54,152,215, 21,243,186,
-233,232,211,224,254,254, 30,222, 25, 44,243,162,133,129,238,255,181,242, 33, 48, 50,239,228,186,157, 42,215,237,132,154, 14, 46,
-239,233,126,157,159,188, 21,107,135, 81,222,203,172,117,165,212,116, 25,166, 29, 18,176,113,251,243,179,137,206,179,177, 52,253,
-118,215,106, 79,253,120,214,209, 87,239,249, 13,104,166, 95, 44,145, 42,224, 43, 52,232, 31,243,207,111,196,196,126,207, 41,217,
-173,168,135,202,158,142,213,143,222,119,107, 76, 55,217,170,130,189, 12,201,148,206, 66, 52, 4, 72,131, 73,178, 64, 77, 82,144,
-162,207, 59,192, 57,204, 49, 34,164, 8,182, 22,105,222, 96,172,228,156,199,146, 5,169,170, 83,182,156,116, 60,206,140,193, 13,
- 88,182,160, 86, 51,130,179, 30, 79, 79, 31,224, 45,161,132,130,187,183,111,113,157, 25,255,234,255,252,127,240,230,179,183,248,
- 31,255,231,255, 9,230, 53,193,156, 60,172, 51, 72,215, 89, 83,251,132, 50, 70,196,152,175, 87,185, 26,131,166,178, 17, 99,213,
- 49,188,181,174,249,159, 73, 31,238,243,188, 52, 11, 84, 74, 5, 41, 5,132, 77, 69,162, 36,197, 14, 17, 35,198,154,153, 46,135,
-182,232, 84, 10, 62, 60,205,162, 59, 73,242,126,181,162,143, 5,189,219, 51, 57,196, 94, 42,162,181,233, 52,226,233,233, 61, 62,
-249,196, 10, 97,210, 48,198,193, 43,248,106,195,143,126,248, 41,230,101,197, 22, 34,166,211,132,111,191,249, 22,254, 60,160, 6,
- 22, 49, 19,156, 21, 42,222,229,233,210,196, 86,131,134,237,156,207, 39,188,255,240, 45,156, 51, 56,157, 38,248,193,226,205, 39,
- 15,184,206, 23, 45, 46,228, 51, 22, 43, 90,129, 97,146,252,111,236,136,218,162,188,115,102, 22, 86, 6, 32, 25,235,216,233,110,
-168,187,238, 78,171, 17, 98,128, 51,166,221, 83, 37,100,113, 1,100,224,253,187,247,152,198, 17, 49,206,136, 49,227,241,233, 9,
-126,120,141,243,221, 61, 46, 31, 62, 32, 69, 89,211, 76,131,135,117, 22,227, 52,226,233,233, 73, 44,110, 81, 24, 1,214, 90,209,
- 10, 92,103, 48, 59, 24,231, 16, 66,192, 50, 7, 57,199,140,129, 97,113, 69, 92,231, 43,172,149,233,204,135, 15,143,152,166, 81,
- 66, 96, 92,110,209,185,185,164,125,229,132, 42, 88,227, 93,191,115,195, 70, 57,100, 74,148, 35, 20, 43,223, 30,250,186,107, 55,
-149, 89, 81,181, 58,180,135, 47,245,150, 94,113,127,153,125,255, 94,241,177,117, 84,223,101,163, 84, 40, 77, 29,199,203,179, 93,
-137,114, 71,149,242,111, 31,216,242, 18,240,162,239, 98,184, 27,133,191,208,168,189, 60,138,108, 49,146,232, 70, 12,249,176, 55,
-173, 6,190,230,131, 46,180,211,228, 90,100, 30, 14, 65, 27,123,103,212, 31,232,251, 72,184, 31, 10,139,247,152,155, 23,178, 9,
- 94, 84,237,201,165, 75, 26,171, 40,218, 92, 3, 61,118,113, 71,209, 27,177, 42,138, 11, 17, 98, 1,230, 84,176, 21, 66, 98, 35,
- 30,116, 50, 8, 37,129, 83, 22, 68, 35,103,176, 99,156,239, 60,238,166, 17,175, 78, 35,238, 71, 7,147, 3, 56, 69,124,216, 34,
-174,115,194, 63,124,249, 14, 95,124,245, 30, 95,127,184, 98, 73, 66, 92, 26,199, 19,134, 97,130, 27,206,200, 84,144,153, 16,178,
-216, 63,136, 19, 10, 65, 30,122, 57, 54,240, 72,243, 71,214,113,122,179,159,113, 43,174,246, 61,114,217, 11,167,210, 28,255, 55,
- 31,235, 81,205,126, 24, 19,119, 6,234,102, 65, 44,157,229,170,221, 28, 61,119,160,252,198,131,238,187,148,226, 47,217,217,234,
-165,120,219,165,183,238,191, 19,186,244, 1, 46,212,173,151,116,222, 35,170,241, 94, 8,247, 29, 10,248,103,135,246, 71,232,114,
-191,105, 79,255,162,207,254,102,236, 95,241, 89,212,117, 21,212,197,226,102, 20,184, 98, 52, 12,103,175,202,119, 64, 6,169,103,
-184,224, 52,141, 40, 41,193, 25, 3,114, 12, 54,132, 85, 39, 12,103, 67,130, 33,133,230,210,149,253, 94, 78,144,209, 53,103, 77,
- 53, 52, 14,219, 22, 16,182, 32, 63,223, 59,172,203,138,148, 51, 46,215,132,113,152,176,241,134,149, 11,182,243,167,248, 95,254,
-215,255, 11,191,247,207,255, 57,254,232, 95,254, 62,238, 63,253, 4,159,127,241,107,196, 16,112, 26, 6, 60, 70,177,170, 17, 25,
-181,110, 38,177,163,142, 35, 46,243, 2,103, 77,123, 63,230,121, 70, 12, 1, 84,196, 42, 85, 16,229,208,215,251,212,217, 1,155,
- 17,127,176, 32,110,245, 97, 73, 50,194,207, 5,216, 86,233, 42,183,144,196,234, 84, 0,235, 61, 10, 0,107, 61, 98, 12,178, 31,
- 38,128,217,182,157,112, 78,165,121,231,199,113,130,181, 35,190,249,230, 91, 32, 23,220,223,159, 53,152,196, 75, 60,106, 88,241,
-238,253,215,136, 81,168,122, 40,192, 55, 95,127,141,251,251,123,228, 82,176, 69, 97,182,223,223,223,225,213,235, 87,120,124,255,
-136, 16, 36, 72,234,124,150,137,135,115, 22, 49, 6,108,155,140,246, 31, 30, 30,192,252,187,248,234,171, 95,131,200,192,143, 30,
-243,188,182,195,166,141,137, 33,133,207, 52, 77, 34, 48, 92, 55,201,235, 54, 6,167,243, 25,243,229, 34,207,178,218,164,232,181,
- 66,204,109, 23,188,165, 0,199, 22,198, 24,201, 84, 87, 97, 91, 81,177,156,104, 94,228, 82,187,206, 87,188,126,117, 47,130,198,
- 44, 79,225,101, 89, 91, 52,236,253,221, 93,179, 86,178,106,143,214, 69, 2,106,182,152,177,174,155, 36,209, 13, 30,204,210,168,
-124,243,245,183,248,244,179,183,136,225, 43, 89, 59,176,193,182, 45,141,211,254,112,255,128,199,248, 36, 97, 86,134,165,177,201,
- 25, 80,117, 58,202, 13, 37,243,197, 64, 39,153, 40,212, 61,248,158,151,246,124,239,149,251,231,200,174,251,110, 16,168,250, 96,
- 49,178, 31, 86,170, 92,105,207,133, 98,185,129,120,170, 40,151,250,103, 71, 93, 15,178,233,132,114,109,183,132,151,187,168,239,
-248,135, 85, 1, 88, 15,129, 10,224,104, 15, 61,221, 49,247,138,248,219,239,169,233,195,135,255,149,186,180, 43, 34, 1,248, 21,
- 58,118,195,253,239, 72, 68, 48,253,136,254, 38,224,162, 89,123,106,240,252, 45,172,163,166,173,145,193,192,132,129, 11,238,189,
- 64,101,146, 34, 90,147,254,166,214, 8, 64, 35,231, 0, 71,192,104, 13, 44,201,200, 29, 96,245,158, 27,172,186,123, 22,101,167,
-168,190,201, 90, 68, 54,184,196,132,144, 11,130, 38, 18,181,130,197, 84,165,166, 96, 98,239,207, 19, 62,123,115,143,207, 30, 38,
-220, 15, 4, 46, 25,215,203,130, 47,191,157,241,247,223,110,248,171,191,255, 6,159,127,125,197,251,149, 16,202, 0,114,119, 32,
-123, 70,230, 9, 69,189,239,243,188, 96, 94, 22,196,180,193,218,130,209, 25,132,101,197,122, 89,132, 56,134,172, 15,185,218, 49,
- 23, 36, 50,200,205,163, 78, 50, 86, 77,185, 93,112, 57,151, 99,200, 24,209,115,252, 46,237,220,190,151,188, 86,185,195, 42, 10,
-216, 8, 13,236, 80,244, 64, 47,205,206, 86, 90,218,222, 46, 92,163, 54,206,226, 67,152, 15,181,201, 74,191,154,217, 57,203,221,
-225, 95, 74, 99, 28, 16,237,215,198,161,232, 67, 7, 66, 82,184, 77,221, 69,247,175,191,174, 45,110,125,231, 47, 22, 35,189,148,
-164, 28, 17,202,253,239,219,107, 6, 94, 26,191,127, 31,197,125,211, 39, 52, 12,238, 62,149,227,238, 97, 66,135,162, 87,169,128,
-138, 11,101, 35, 1, 63,206, 89,176, 97,204,203, 34,145,163, 57,195, 15, 35, 88, 15, 69, 98, 86,200, 12, 55,107, 86, 29,193, 54,
- 80,143, 49,216,182, 13,198, 24, 56, 47, 94,105,231, 61, 46,139,236, 64, 79,231, 19,166,179,135, 51, 30, 33, 49,214,101,195, 23,
-191,248, 37,254,244, 95,254, 41,206, 22,136,203,138,203,227, 19, 2, 10,214, 20,129,194,240,254,132, 68,192, 22, 2,140,119, 32,
- 54,141, 56,199,198, 98,158, 23, 77, 40, 44,202, 53,207, 13,211, 73, 68, 88,215, 32,221,122, 72,154,217, 77, 72,169,128,201, 98,
-219,130, 82, 29, 5, 14,181,198,132,235,178,194, 79, 35,216, 57,141,229, 20, 27,106, 77,122,107,249,222,108, 96, 21,239, 90,173,
-140,206,123,249,153,203, 10,102,177,181,165, 28,165, 59, 29,134,182, 18,100,150, 36,178, 31,252,224, 51, 12,163,199,195,171, 7,
- 92,174,210,125, 58,231,164,251, 28, 79,178,187, 94, 37, 97,207, 90,177,169,189,122,245, 10, 49, 5,196, 44,220,120, 2,112, 58,
- 77, 32,146,213,131, 53, 22,231,187, 51,174,215,185, 9, 9,147,218,186, 10,213,216, 83,134,179, 2,201,202, 58,181,217,214, 21,
-214,116,156,242,220, 89, 37, 11,186,189,178, 90, 95,213,207, 63, 77, 39,161, 90,150,125,178,231,189, 19,222,190,170,229,183,117,
-211,161,157,234,118, 82,106, 83, 82,235, 36, 79, 62, 70, 89, 25, 18,177,118,233, 17, 49,236, 34, 64,239, 7, 13,245, 97,121,221,
-186,215,151,123, 73, 84,242, 49, 36, 88,107,155,189,112, 31,100,117,247, 16,181,248,175,174, 43, 63,176,198,247,251,155,246,200,
-232,231, 77, 6,119, 19, 72,180, 53, 70,123,102, 40, 56,167,234,177, 82, 11,158,209,159, 87, 93, 8, 57, 31, 92, 20,181,251,223,
-169,173,210,132,182,157,122,229,121,223,250,200, 95, 58,208,111, 59, 17,195, 86, 9, 94, 53,117,107,207,116,110,228,176,178,123,
-214, 43,103,184, 79, 73,163,146, 97,114,253,239,162, 49,100,157, 3,178,152, 8, 85,225,222,143,220, 75,227,182,183,152,138,155,
-177, 42, 53, 70,125,110,105,171,245, 97, 85,197, 17,253, 26,132,137,224,137, 49, 26,134, 47, 1,119,222,194, 41,153, 77,246,227,
- 4, 99,228,245,150,146, 96, 74,198, 64,132, 81, 69,103, 41, 73,254,120, 68, 70, 84,159, 35, 49,161,144, 20, 36, 49, 39, 36, 16,
- 34, 49,182,146,187, 93,122, 31,158, 34,135,131,161, 2, 99, 9, 15,119,119,120,251,250,140, 55,103,139,129, 18,194,178,225,221,
-227,130,175, 62, 44,248,252,221,140, 47,190,121,143,199,101, 67, 4, 16, 75, 86, 90, 86, 0, 49,193,120,169, 96,115,142, 40,105,
-197, 56, 16,222,190,185,195,221, 52, 98,189, 44,136,215,208,244, 10, 89, 61,202,172, 11,179,200, 6,217, 15, 72,214,137,231, 54,
-103, 85,111,238, 15,198,234, 75,168, 3, 18,234, 68, 86,165,244,249,245,165, 29,132,186,173,214, 27,105,159, 2, 48,145,160,125,
- 75,217, 73, 41,245, 32, 87,107,162,188,123, 50, 30, 48,109,135, 94, 69, 38,187,176,178,125,248,173, 11,161, 54, 70,219,131, 96,
-168,203, 45, 46,173,179,228, 61,226,172,237,150,247,201,195, 94,168,238,246,176,125, 4, 87,225, 20,232,236,148, 31, 27,173,151,
-155,131,157,110,114, 17, 62, 38,146,251,152, 66,254,163,193, 49, 42,244,171, 89,223,224,227, 62,189,218,121, 42,243,190,199, 91,
- 86,207, 52, 24,112, 78, 19, 0,153,112,185, 94,193, 4,156,166, 73,252,189,205,127, 47, 10,115, 67, 6,172,225, 29, 49, 38,189,
- 94,242,174, 19, 34, 18,155, 28, 19, 98,206, 96,235,224, 6,143,101, 91,129,146, 48,120,131,117,222,224,252,132,152,129,167,167,
- 43,190,252,234,107,132,199, 43,254,244,191,251, 35,240, 22, 16,182, 13, 95,125,251, 13,230, 88,176, 38, 5, 6,145,140,145,253,
- 48, 32,149,220,246,204, 85, 76,150, 84,140,182,110, 27, 66,136,176,214,106,198,188, 8,226,150,121, 17,149,251,182,105,144,139,
-195,186,108, 96,146, 17,110, 42, 69, 45,116,144,177,123, 41,240,163,135,181, 70, 40,110, 58,110, 90,215, 25,195,224, 17, 21,153,
-107,172,136, 95,157,115, 24,167, 17,198,114, 83,216,135, 20, 80, 80, 48,142, 99, 11, 19, 98,195,136, 65,242,222,147, 42,210,115,
- 78,184,187,191,195, 22, 54,148,146,177,109, 81, 38, 26, 91,208,239, 41, 93,241,186, 6,204,203,138,233,116, 2, 91, 9,125, 34,
- 20,133,196,108,120,243,250, 21,190,253,246, 91,237,198, 79,237, 48, 44,250,115, 67, 42, 32, 99,229,208, 52, 70,169,150,132, 82,
- 36, 33, 78,200,118,165,241, 68,184, 93,163,212,178, 15,118,178,163, 92,101,213,238,232,189,135,113, 22, 91, 16,108,109,136, 1,
-164,113,178, 91, 12,130,235, 77, 9, 92, 20,153, 29,196,199, 94,109,149,117,106, 82, 10, 75,252,172,170,232, 91,230, 64,202,186,
- 99, 15, 24,207, 39,188,123,247, 14,167,105,194, 48,122,133, 86,201,132,106, 11, 81, 25, 12, 90,188, 60,155, 49,238, 91,192,250,
- 44, 75,154,214,135, 67, 18,229,203, 61,111, 15,213,170,105,110,149, 78, 71,157,200,174, 38,210,165,220,169,216, 85, 80, 40,207,
- 18,211, 14,173, 61,102, 58, 31,154,133,198,215, 40,141,253, 62, 41,124, 38,189, 40, 2,248, 62,123, 60,102,115,232, 74,158, 61,
-104, 74,111,225, 57,202,252,119, 6,172, 62, 88,233,165, 7,150, 40,232,249, 70, 16,135,158,141, 13, 1,194,244, 81,173,172,123,
-224, 10, 55,160, 78,188,112, 91, 85,213,239,207, 0, 60, 52, 78,181, 36,156,188,131,211,253, 76, 74, 64, 46,172,156,116,128,114,
-212,216,213, 2,239, 68, 85,154,114, 22,128, 11, 51,182, 44, 74,116,241,160, 43, 25, 77,229,136, 89,143,146,182,203, 45, 2,246,
-168,160, 19, 46, 66,173,243,206,226,213,253,132, 79, 94, 77,184, 27, 12,184, 68, 60, 93,174,248,245, 55,239,241,213,183, 79,248,
-250,253, 5, 79,215, 25, 41, 3,131,247,184, 59,157,112,127,119,194,235, 87,247,248,193,103,159,226,213,195, 25,167,209,194, 34,
- 98,114,132, 55, 15, 19,206,147, 71,137, 1, 31,190,121,143, 18,119, 49, 98,175,237,200, 96, 36, 99, 1, 55, 32, 25, 39,177,132,
- 85,129,174,130,193,150,147, 76,251, 14,189,127,143,143, 90,137,189,176,171,127,184,235,162,251, 83,141, 84,153, 93, 1, 48,149,
-106,149,245,231,239, 33, 42,116,176,135,181,216, 93,236,200,196, 58,141,225,103, 12,250, 62,169,172, 28,244, 32,212, 49,227,251,
- 13, 86,189, 33,249, 70,156,246,108, 63, 79,187,100,245,187, 82,225,202, 17, 61,115, 19, 51, 76,207, 98, 99,191, 11, 74,115,251,
-117,189,103,190,253, 4,253,187,182, 7, 44,181,160,214, 7,148,114, 90, 10,237,211,147,210,145, 25,139, 30, 12,235, 38,185,222,
-175, 94,189, 82, 96,147,209,110, 46, 9, 72,197,187,102, 99, 43, 40,237, 64, 37,237, 80, 72, 31,140,133,196,166,180, 41,178,148,
-141, 17, 91,215, 52, 33,134, 21,126,240, 8,185, 96,217,130, 28,208, 57,224, 87, 95,252, 3,126,120, 26,241,211, 31,255, 24, 79,
-239,223, 99, 94, 3, 2, 15,184, 70, 18,108,108,145,132, 53,176, 1,169, 34, 58,165,210,198,242, 79, 79, 87, 20,144, 32, 98, 65,
- 88,183,128,235,178, 52,210, 90, 74, 5, 81,189,209,168,150,188, 34,225, 51,243,182, 97,217, 54,181,225, 73, 22, 3,192,112,222,
-227,195,135, 71,204,203,138, 82,128,243,233,132,101, 94, 69,180,118, 18,248,203, 22,130,122,153, 69,144,204,204, 88,215, 5,231,
-251,179,120,208,163,216,207, 88,213,249,243,188,192,235, 56,121, 24,189, 68, 66,123, 39,116, 60, 99,112,189,138,223, 59,132,136,
-105,244, 56,157, 6, 17,131, 77, 3,230,101,129,115, 34,112, 27,252, 32,107,148,172,217, 22, 70, 40,129, 15, 15, 15, 66,215, 75,
- 25,211,233,140, 53, 6,153,180,120, 39,225, 40,170, 77,178, 70, 82,229, 30,238,238, 0, 0,222,251,110,252,171,204,244,156, 27,
-121,177,145, 30,121, 23,128,177,234, 23, 82, 78, 2, 35,178, 6,134, 89, 15,108, 86, 22, 64, 66, 74, 1,206, 59,105, 16,141,107,
- 94,239,148,146,250,217, 69, 8, 23, 99,105,177,175,155,234, 37,140,181,250, 51,164,224, 40, 84, 48,207, 11,156,247, 88, 23, 41,
-234, 6, 63,202, 24, 63, 37,133,199, 8, 44, 76,154,174, 23, 26,215,210, 65, 97,106,135,221, 5,140, 20,148,239, 12,134,186, 29,
-120, 87,246, 61,221, 76,228,234,193,124, 59,145, 43, 31, 9,121,234,197,180,135,245,183,190,215,221,248,253,165, 78,253,123, 30,
-234,100, 62, 10,195,216, 3, 48,246, 39, 23, 83,147,161,247,250, 62, 97,183,223,206, 34, 91,231, 15,101,187,211, 77, 80, 76, 7,
- 13, 40,251, 46,100, 15,221, 56,238, 65,111,137,119,245,125,108, 0,154, 66,240, 16,139,154,103, 96,100,134, 55, 6, 40,172, 33,
- 6, 18,204, 98, 20,122,234, 88,211,214,212, 11, 19,115, 70, 2, 35, 50, 99, 75, 25, 91,214,189, 75, 29,238,232, 1, 79, 70,217,
-196,245,213,150,157,120, 87, 95,151, 53,192, 52, 58,220,223, 13,120,125, 30,113,114,132,146, 54, 60, 62, 94,240,237,251, 39,188,
-127,188,226,178, 4,160,200,248,238,213,195, 3, 62,121,253, 10,159,188,190,195,253,221, 25, 15,119, 39, 56,206,112,136,120,125,
-242, 56,217,130,187,129,225,168,224,242,254, 17,151, 15,115,211, 32, 84, 16, 74,229, 16,103, 50, 72,198,162,184, 1,137, 77, 27,
- 7,229,230, 2,232, 96, 11, 29, 15,189,183,169, 29,162, 85,113, 11, 35,210, 34, 65,255,189, 61,247, 93, 29,163, 53, 75,184, 75,
- 34,170,224, 32,194,243, 67,189,178,231,219, 88, 94, 43, 64, 38,122, 94, 55, 80,133,159,116, 9,128,109,236,108,244, 79,239, 29,
- 47, 7,110, 2,127,164,139,110, 7,117, 21,215,252, 38,187, 91, 31,250,208, 93,199,125,167,222,239,198, 63,230,125,127,233, 96,
-127, 17,129, 91, 58,219, 77,169,152,140,174, 16, 99,128,120,199,130,214,224,157,210, 74,209, 93,231,112, 58,159,225,156, 1, 74,
-193,224, 61, 12, 27,120,231,132,240,181,109, 88,215, 21,222,249, 54,110, 14, 49,202,123,174,247,153,117,182, 81,224, 10, 8,126,
-240, 45, 32,229,254,238, 14,219,186,224,116,154,176,134,132,167,121, 70, 2, 48,156, 78, 72,165,224,255,253,139,255,136,223,253,
-244, 7,248,193,171, 7, 60, 93,159,240,180, 5,193, 51,111, 98,143,219,114,134,115, 3, 54,245,174,175, 33, 54,216, 81,214, 63,
- 75,144,131, 43,196,132, 24,146,242,200,119, 13, 15,147,172, 29, 50, 8, 91,202,120,156, 23, 57,252, 91,162, 48,171,199, 95,216,
- 14, 18, 98,147, 14,153,216,117, 44,107,221,222,237, 18, 23, 65,194,106,186,162, 31, 7, 25, 23, 67,146,227,128,130, 97, 24, 26,
- 33,142, 85,124,119, 58, 79, 96,102,124,248,240, 1, 70, 5,127,117, 77, 20,182, 5,222, 51,222,188,190, 71,138, 81,118,222, 73,
-156, 41, 41, 38, 76,227, 4,102, 96,158,175,184,187,187,199,178, 44,210, 49, 27,139,235,188,200,148,196,201,148,132,212, 18, 88,
-227, 67,139,166,176,161,100,153, 18,108, 91, 99,174,115, 29,209,163,210, 21,185,101,130, 52,200,142, 62,231,152, 89,128, 90,222,
- 1,144,131, 87,114,197, 51,206,231, 59, 13,217, 1,144,162,238,230,141,106, 15, 70,164,146,181, 48,204, 8, 73, 32, 67,213, 82,
- 89,157, 91, 49, 70,253,249,212,148, 89,149,195,191,133,128,117, 13, 88, 55, 1, 4, 53, 32,150, 90,200, 26,223,164, 30,212,229,
- 56, 73,107,207, 24,238, 18,195, 10,186, 21,100, 57,228,189,239, 58,180, 93,153,202, 68, 74, 57,127,158,171,114,123,223,126,108,
- 10,183, 91,233,142, 54,222, 29, 7, 45, 83,211,221,167, 94,242,111,223,169, 55,254,186,249, 78, 15, 58,223,120,239,234, 27, 73,
- 93, 54, 58,183, 32,169,190,123, 54,237,123,203, 11,202, 47,190,216,134,128,173, 94,219, 3, 36,228,166,202,225,170, 88,222,211,
-218,168,223,193,162,192,162,192, 27,192, 19,193, 81,129,183,182, 29, 48,138,225,134, 33,241,156, 51, 21,185,232, 85,196, 23,115,
- 65, 34,194, 70,132, 37,102, 36, 13,220, 0, 75, 72, 3,171,156,126, 7,243,239,227,153, 82,217,192, 42,168,179, 6,152, 6,135,
-187,147,199,171,179,195,228, 24, 57,108,120,122,154,241,116, 93,176, 6,185, 64,173,117, 2,170,241, 14,167,193, 98, 48,128,161,
- 8, 46, 17,166, 4,140, 20,113,231, 9,119, 3, 99,114, 70,195, 51,190, 65,152, 53,195,157,143,123, 25,144, 30,234,108,145,173,
- 71,130,224, 99,143,193, 36,186,147,212,206, 22,207,122,206, 42, 38,229,131,197,108,215, 85, 40,242,181, 19, 50,182,234,244,153,
-200,171,194, 46,242,238, 9,237,144,167,181,227,127,222,225,222, 80,226, 42, 87,155,202,255, 79,217,155,245, 72,150,101, 87,122,
-235,204,119, 50, 51,247,136,200,204,202,202,172,145, 53,144, 34, 27,205,174,150,186,159, 4,189, 72,128,160, 7,253, 38,254,176,
- 6, 4,234, 69, 16, 32,136, 84,163,155, 68,149, 56, 38,139, 85, 57,196,224,238,102,118,167, 51,233, 97,239,123,238, 53,115,243,
-204, 18,129,200,172, 42, 70,120,152,155, 95, 59,103, 15,107,125,235, 6,107, 30, 5,178, 33,138, 55,125,131,174,229,130, 87,137,
-151, 71,227, 41, 93,170,243,197,183, 40,212,151, 67, 34,151,124,131, 63, 28,148,243,146,136,238,165,241,187,228, 48,149, 11, 21,
- 47, 54,147,174,165,107,150, 27, 72, 85,198, 69,112,196, 50,141,161,253,175, 99,141, 8,117,114,130, 59, 64,165, 20,144, 19,198,
-113,160,255,204, 73, 89, 2,130,172,100, 44,166,218,239,247,152, 35,121,197, 73,144, 22,161,149,198, 56,141,144, 90,241, 69,176,
-248,219, 61,230, 16, 96,157,131,212, 26, 62, 9, 60,156, 61,254,241,239,254, 17,159,125,250, 49,218, 93,133,121,238,137,248, 24,
- 51, 2, 4,116, 85,145, 8,207,123, 18, 95,177,255,152, 2,138, 40, 87,124, 24,231,245,226,230,152,229, 16,232, 66,241, 62,112,
- 18,161,128,143, 25,199,126,194, 83, 63, 17,250, 53, 45, 1, 44,178,164,152, 77,211,140,188, 4,130,112, 72,201,130,196,157,253,
-140,186,166,140,243,148, 34,154,166,130, 49, 10,117,229, 80, 85,142,237,132,180, 11, 29,134,177,252,236, 98,138,148, 4,199, 97,
- 41, 25, 9, 33,120,140,195,200,147, 16, 98,132, 11, 8, 88,107, 32, 4, 37,184, 53, 77, 13,109, 12, 92,229,214,164,179,228,113,
-216,239, 49,244, 61, 92,181,218,217,230,217,163,110, 26,188,123,255, 30,117, 83, 51,194, 55, 23,114,230,114,113, 73, 41, 8,214,
-226, 12, 7,229, 76,188,187, 54,156, 44,185,156, 5,226,170, 87,203, 5,135,171,141, 97,193,156,135, 49,154, 1, 51, 17, 2, 10,
- 50, 3, 93, 75,200, 87,185, 36,217, 33,163,109, 91, 60, 29,143,168,234,138, 70,229, 90, 65,105,210, 55,164,148,104, 26,193,221,
-249,114, 62, 40,165,203,133,156,248, 25,142,137,198,217,137,139, 90,181,140,176,197, 85, 33,140, 75,210,227,114, 87,137, 13,111,
-129,206, 17,185, 49,229, 92,222, 65,212,165,200,178,216,186, 44,170,151,144,152, 21, 73,189,109,134,151,233,218, 50, 98, 95,138,
-161, 11, 50,228, 85, 55, 95,254,220,194,153, 71,222,140,223, 11,169,235, 15,163,111,137,140, 77,199, 34,159,141, 4,190, 77,184,
-179,253, 26,200,219, 17, 98,222,140,130,197,133,114,157, 69,216,151,190,222,114,160, 46,121,224,178,136,253,150, 24, 65, 33,174,
- 70,151,114,129,136, 60,207,115,151, 82,150,177,183,145, 2, 90, 0, 74, 36, 24,173, 75, 0,135, 96, 49,157,214,170,176,144,151,
-203, 73, 74,133, 8,129, 8,137, 33, 3, 99,202,136,160, 48, 22,185, 36,187, 45, 23, 58,143,114,114, 94, 51,198,151,127,210,135,
- 53,163,178, 10, 77,165,113,104, 45,246,141, 65,109, 21,210, 28, 48,142, 51, 38, 31,145,147, 40, 59, 45,165, 24,245, 26, 39, 68,
- 63, 64,166, 9, 50,121, 84, 42,225,174, 53,232,156, 68,235, 52,172,148,120,255,238, 61,222,190,125, 0,178, 42,105, 31, 82,174,
- 34,195, 44, 36,162, 82,240, 82, 83,152,139, 84,148,167,158,211,218,173,103, 20,157,194,234, 45,191,230,254, 95, 91, 29,150,159,
-215,166, 56,219, 20, 86,249, 89, 39,188,170,228, 87,178,215, 58,190, 82, 91,146, 28,127, 16, 87,216,209,101,236,235, 54,201, 45,
- 97,209, 87,200, 77,133,156,202,179, 76, 16,150,181, 42,222, 10,228,144,241,108, 44,126, 19, 42,147,243,133, 77,238,165,223, 87,
- 58, 1, 92, 18,229,110,250,233,255,192,162,251,122, 44, 47,165,188, 88, 77,229,226, 25,103, 15, 58,139, 62, 37, 71,248,208,113,
-164,202,143, 78, 73,234,212, 82,166,131, 52,179, 42, 57,204, 51,180, 86,200, 49, 65,107, 13, 41, 4,198,121,132, 86, 26,138, 15,
-220,113,154,161,181,193, 52,205, 16, 82,161,170,107, 72,109,202,207,117,177, 0,105, 77, 9,133, 89, 8,204,243,140,110,215,145,
-205,202, 19,218,180,169, 26, 72,161, 73, 68,164, 12,166, 12,124,241,251,223,195, 88,139, 79, 62,122, 13,129, 4, 31, 3, 32, 21,
-164, 50,172,134,151, 28,154, 66, 29,149,103,177, 87, 96,156,108, 78,177,228, 32, 40, 73, 34,172,152, 8,148, 19, 98, 70, 76, 2,
- 31,158,122, 28, 7,143,193, 83,162, 28, 61,148, 10, 2, 52,222, 39, 5,120,222,136,173,114,233, 24,181, 49,112,206, 48,139,221,
- 48,103,125, 66, 85, 59,180, 77, 13, 32, 65, 27,197,208, 16, 9,107, 12,140,117,120,124, 60, 98,183,219, 51, 1,206, 67, 74,160,
-107, 91,162,173, 5, 10, 78,169,170,138, 46,102,239, 49,244, 35,156,115,204,125, 95,167,105,119,247, 7, 72,153,203, 46, 92, 73,
-133,190,239,185, 8, 16,197,178,150, 51, 9,231,170,218, 65,105, 18, 37,230, 12,104,165,153, 77, 78, 8,217, 97, 26,209,180, 13,
- 34,191,174,152, 40,225, 78, 72,193,235,133,188, 10, 99,151, 53,150, 92,247,200,214, 89, 28,246, 59,204,211,132,182,109,169, 16,
-138, 1, 57, 69, 76,211,184,122,184, 69, 70,215,181,112,174,194,233,116, 36, 17, 93, 83,193, 58,139,166,169,153, 96, 71,223,251,
- 50, 22,215,252,188,165, 68,100,194, 84,160, 36,107, 74, 94, 6,161,177,149,166,117,209,210,101,175,185,230,184,185,186, 42,145,
-224, 0, 5,191, 92,140,218,193, 97, 43, 98, 51,253,187, 20,131, 11,185,134, 92,101,228,111,213,195,220,162, 96, 94,135,166,221,
-130, 79, 45,218, 24,228,188, 10,229, 18,210, 31,220, 37, 20,158,250,166, 83,202,249,101,241,206, 69, 23,191, 80,145,178, 90, 21,
-232, 5,161,168, 54,227,103,238, 46, 22,219, 26, 95,234,207,246,137, 41,111,224, 26, 98,213, 41,149, 68, 45,113, 17,216,113,169,
-107, 72,197, 83, 47,121,153,184, 0,253,149,148, 48,188, 99,175,140, 89,109, 73, 88, 18,215,104,244, 20, 89,143, 64,240,125, 26,
-202,251, 36,112,142, 25, 83, 76,236,245, 22, 69,160, 37, 23, 53,228,102, 68,180, 48,226,203,254,151,117, 0, 86, 75,236, 26,139,
- 67, 99,176,175, 53,106,171, 32, 50,224,185,235, 89,242,120,165,148, 48,138,242,212,173,204,112, 50,161, 50, 2,187,202,224,117,
- 87,225,174, 54, 56, 52, 14,181, 53, 56, 30,123,252,243, 23, 95, 98, 26, 19,219,176,168,203,213, 66, 97,233,183, 3, 4,130,148,
- 8,202, 34, 73,131, 40, 8,233, 25, 83, 68,202,116, 96, 96,147,199, 76,239, 75, 42,138,234,140,203,117,203,234,106,203,183,193,
- 70,155,226,236, 2,172,201,112,155, 5,174,177, 20, 4,151,122,141,124, 53,126,191, 13,159,145, 34, 95,252,251, 50,171,125,237,
-212, 23, 17,167,146,185,224,149,203,229,126, 37, 4,188,222,163,149,149, 2,195, 84,114,202,223, 53,234, 42,129, 66,229, 25,222,
- 22, 42, 87,227,247,239,178,184, 93, 84,244,219, 75,125,165,240,147,118, 99,243,215, 75,158, 62, 44,252, 8,181,208, 27,179, 4,
-199, 16,144, 80,137,121,229, 57,163, 92, 10,222,207,112,188,187, 85, 16,176, 70,193,106, 3,169, 21,193,102,248, 48, 84,218, 96,
-158, 3, 89,218, 88, 25,175, 22,144,200, 18,223, 89,146,182, 34, 94,189,190, 47,233, 89,211, 56,193,106,131,202, 85,212,237,230,
-136, 8,202, 97, 31,147,194, 95,253,250, 31, 48,132,136,239,125,242, 9,106,231, 40,108,166, 31,144, 57,106,120,185,124,230,105,
-166, 73, 15,199,153,250,217,211,184,127,242, 36,200, 10, 20,241,153, 32, 48,135,140,144,128,167,126, 66, 63, 69,196,172, 48, 5,
-226, 75, 8, 8,164,200,248,220, 20,144,114,196,174,219,209,196, 33, 69,134,125,113,214,131, 82,229,189, 34,129, 89, 96,213, 50,
-169,178,115,166,238, 58,134, 64,113,176, 51,225, 86,235,134, 70,237, 77, 83,149, 75, 38,132,136,166,105,137,219,158,104, 10,144,
- 82,194,110,215, 18, 89, 45,210,255, 70, 42,242, 26, 15, 15, 31,144, 18, 5,186,104,173, 73,253,157, 41,154,121, 24,122, 56,103,
-137, 55, 48,205,216,117, 29, 98,138,208, 90,161, 63,157,177,219,237,145,216,250, 69,205, 26,141,194,169, 81,162,245,128, 96, 20,
-108,206, 20,229,154,115,130,143,137, 38, 78,139, 40,122, 35,250, 93, 84,230, 90, 75,220,223,221, 97,154,102,236,246, 29,137, 37,
- 5,120,103, 14,102,201, 7, 12,227,132,174,219,163,235,118,220, 52, 37,190,188, 53,199,171,106,134, 79,145,120, 77,107, 67, 98,
-111,108,195,114,104,106,162,148,226, 73,129, 33,119,147,214,208, 90,150,181, 81, 96,189,195,114,198, 8, 62,179,159, 89, 67,147,
-216,120,199, 83, 57,179,190,219,242,189, 74,105, 69, 94, 57,240,215, 35,244, 91,235,188,103,255,219,149,150,166,124,141, 13, 33,
-117,189,212,243,255,143, 75,189,100,160,203, 77,167,126,251, 82, 95,254, 34,153,232,135,189,134, 99,174, 3, 10,201,139,246,226,
-151, 92, 54,176,114,221,121,243,221,243,124, 87,191,100, 78,111,139, 7, 41,202, 14, 30,101, 23, 72,163,213,148, 54,120, 81,254,
-149, 18, 61,140,146,173,120, 82,105, 88,109,225,172,131, 22,146,236, 27,124,137,198, 76,221,119,228,202, 63,196,192, 21,160, 6,
-132, 70,130,196, 28,129, 33, 37,248,188,170, 23,165, 16,208, 60,122,161,127,200,210,165,199, 13, 24, 4,200, 75, 64, 41,156, 85,
-104,173,194,161, 54,232,156,130, 83, 18, 90, 82, 49,177,208,142,100, 94,178,188, 41,215,189, 50, 18,141, 1, 14,117,133, 87,187,
- 14, 31,237, 26,124,114,183, 67, 91, 87,152,231, 25,255,244,197,239,241,229, 87, 15,240, 81, 1,153, 44, 54, 66,241,212,133, 15,
-252, 0,129,168, 20,162, 52,200,124,169,231, 34,136,225,157,122,140, 69, 36, 39,165, 66, 66, 34, 49,157,192, 70, 23,177,201,183,
-221, 4,220,139,237,186, 73, 92,174,115,150, 93,148,100,177, 32,242, 18,250,144, 47, 24,240,203, 72,249, 98,252, 46,183, 2, 73,
-121, 81,249, 74,177, 6, 3,229,141, 0, 51,231, 75, 63,189, 96, 22,186,100,154, 28,164,216,248,231,175,212,253,219, 14,122,179,
- 74,219,238,199,183,175,225, 54, 38,150, 15,146, 44, 94,180,168,221,154,122,109, 87, 33, 23, 56,201, 77,250,215,229,122,106,205,
-170,222, 10,244,150, 75, 61,139,205, 74,160,208, 44,215,175,145, 56,226, 5, 0, 66,240,171, 95, 54, 6,236,219,174, 76,201,180,
-214, 24,198, 17,144, 2,211, 60, 65, 73,133,211,233, 12,163, 13,114, 76, 72, 62,150, 49,237,146,129,110, 43,199,192, 19,194, 36,
- 87,206, 34, 38,224,120, 58, 35,114,226,151,144,132, 35, 61,245, 39, 12,211, 0, 3,133,156, 13, 30, 67,196,239,222, 63,225,139,
- 47,190,132,146, 26,245,126,135,144, 83, 25,191,135, 20,185,243,142,165, 83,143, 33, 2, 66, 81, 49,157,232,179, 28, 82,198,232,
- 19, 70, 31,241,112,234, 17, 32,209,251,128, 40, 36, 66,196, 70,103,177, 21,115, 38,152,138,162,144,181, 49,252,203,150,226,215,
- 88, 77,250, 1,182,178, 57,103,105,109,193,249, 95,222,207, 48, 70,211,200,124,211,245,147, 62,193, 34, 49,147, 62, 38,192,104,
-141, 97, 24, 48, 14, 61,170,170, 34, 49, 30,119,183,198, 24, 8, 41, 17,194,204, 9,105,245, 26, 25, 27,233,191, 63, 60, 29, 17,
- 83, 66,215,181, 16, 12,142, 89, 38, 36,109,219,210,115,176,232, 28, 98, 66,140, 25,206, 85,124,190, 17,203,160,170, 42,204,211,
-132,110,215,150,116,194, 16, 2,180, 86,112,117,131,113,156, 86,174, 67,230, 73,217,226,247, 6,177,232,199,137,172,101, 77, 93,
- 65,107,137,221,190,197, 56,244,212,177,103,148,236,128,148, 50,166, 97, 6, 98,198,221,221, 1,206, 82, 17,210,117, 29,249,214,
- 57, 56,200,213, 22,149,171, 8,224, 99, 45, 92, 85, 81, 55,206,185, 22, 25,180,143, 95,200,134,139,188, 43,250, 25, 70, 25, 42,
- 66,133,100,110,254,138,162, 93,124,224,165, 65, 72,151, 11, 53,154,146,138,103, 9,109, 43, 2,123, 61,251,178, 88,163,125,178,
- 88, 34, 86,215,140,215,197,189, 67,150, 65,117, 49, 57, 94,198,235,223,117, 46,108, 27, 87, 85, 25,247, 23,165, 11,248, 3,238,
-115, 81,246, 44,106,163, 20,150, 55, 23,252,101,148,112,113,166,175,152,213,213, 19, 44, 75, 59,183, 12, 76,228,154,248,193,226,
-157,151,217, 56,226, 42, 97,103,201, 99,191,232,208,203, 56,246,226, 15,150,241,139,209,244,112, 28,238,238,241,234,245, 71,184,
-219, 29,176,171, 27,242, 41,198, 88,194, 20, 22,191,186, 79,153, 19,205,200, 47, 40,149,162,189, 77, 2,121, 88, 83, 66, 20,128,
-144,186, 40,235,151,213,194, 22,179,179,248, 19, 87,254, 79,134, 18, 20,176, 82, 59,141,214,105,116,149, 68,231,168, 83, 55,218,
-172,191, 63, 3, 74, 40, 6,228, 72, 84, 70,163,177, 10,251,166,198,171, 67,135,251,125,139,215,187, 6,187,198, 65, 72,141, 47,
-126,251, 37,126,243,247, 95,160,159, 51, 50, 52, 40, 44,150,188,186, 52, 98,165, 3, 61, 74,133,164, 12,146,178,200, 82,151,203,
-154,198,123,169,188,103, 75, 33, 87, 50,191, 11, 44,114,107, 1, 91, 61,210, 37,156,135,127,222, 11, 13,169, 48, 14,182, 29,100,
-209,163, 44, 23, 80,122, 38, 26,187,181, 83,151,155,157,247, 5,177, 17, 40, 43,148, 82, 92,148,240,160, 37,210,117, 83,132, 46,
-132,167,171,238, 55,165,116,161,152, 95,104, 90,242, 5, 62,194,119, 17,226, 50, 86,113, 77, 78,249, 91, 59,242, 91,193, 73,223,
-138,134, 45, 66,214,213,162,150, 83, 42,174, 2,177,245,220,243,216, 83, 44,136,204, 50, 73, 88,121,216,105,233, 68, 5, 39,160,
-165,136,186,170, 54, 63, 7,134,182, 44, 17,197,138,172, 75,211, 98,175, 90, 28, 1,156,200,101,173,225,189, 49, 97,139,141,177,
- 80,146,138, 6,138,203,164,241,170,171, 29,164,162,209,254,200,144, 25,163, 12,127,127,228, 50, 25, 67,194,111,191,252, 6, 95,
-191,127, 79,246,180,156,201,123,157, 51, 60, 63,183,212,205,210, 69, 55,135,132, 24,129, 57, 68,140, 83,192,105,152,240,240,116,
-198,105, 10, 72, 82,195,214, 13,166, 20, 49,251, 84,214,103,244, 51,143, 37,165, 79,112,138,162, 18,180, 3, 29,199, 17, 85,237,
-160, 13,121,227, 23, 69,246, 18,210, 82, 85,174, 48,221,105,172, 46, 49,141, 3,234,170, 70, 12, 9,193,135,178,243, 30,134,158,
- 33, 54, 36, 50, 28,134,145,227,150, 13,166,105,162, 12,116,182,221,213,117,197,182, 85, 26,179,211, 94, 63,227,241,241, 4, 1,
-129,186,233, 32,164,198,249,212, 35,197,128,195,221,190,116,218, 66,208,251, 93,213, 53,198, 97,128, 81,154,193,142,146,129, 45,
-243,186,178,148, 18, 57,145, 46,165,174,171,178,254,162,221,124, 75, 81,211,140,107,189, 40,114,229,229,121, 61,142, 51,164, 2,
-218,174,161,117, 68, 85, 33, 69,176, 87,158,121, 9, 73, 32,249, 4, 63,123,156, 78, 39,156, 78, 39, 28,143, 39,122, 54,148, 70,
-202, 18, 31, 62,188,163, 84,183, 72,127,167,177, 6,231,190, 71,202,137,158, 75, 94,113, 6, 62,191, 51,114, 9,225,145, 57,211,
-180, 38,131, 34, 98, 57,141, 47,229, 84,246,214,235,246, 79, 92, 76, 37, 23, 96,204, 66,146, 92, 57, 28, 9,215,145,168, 91, 49,
- 44,174,224, 93, 37, 5, 15,249, 98,226,184,109, 92,174,207,141,107, 69,252,246, 60, 88,192, 87, 26,101,232, 42,110,192,103,150,
-151,161,174,188,223,137, 68, 34, 5, 32,178, 17,229,108, 72,112, 34,174, 24, 77,185,233, 68, 69,206, 27, 94,123, 44,111, 26,141,
- 10,175,201,111,185,236, 90, 22,149,125,225,223,230,117,255, 46,151,216, 22,129, 50,117, 88, 20,170,197,131,156,105,231, 68, 94,
-195,197, 82,172,209,181, 7,220,239,239,113,191,191, 67,211,118,244,117, 67,128,159,122, 66, 93,198, 4, 21, 19,114,204,136,136,
-164,104, 7, 71,253, 9, 89,118,129, 89, 0, 30, 9, 62, 39,100,169, 11, 20,101,233, 72, 83, 94,216, 99,114,181,182,101,148,196,
- 31,178,180,173,177,123, 42, 75, 24, 33,161, 51,237,247, 37, 50,148,204,176,198, 32, 70,210, 36,100,153, 25, 81,155, 80, 89,137,
-198, 57,180,174,197,126, 95, 99,223, 25,220, 53, 2, 74, 25,252,195, 87, 61,126,253, 15, 95,225,233,228, 1,101,139,157, 14, 9,
- 80,138,118,200, 73, 72,138,129,213, 22, 66, 57, 14,208, 73,208,165,168, 90,184,254,138,137,115, 96, 76, 46,231, 44,151,240,149,
-133,229, 79, 69,195, 66,118,200, 34,110, 84,161, 91,245,255,178, 66, 73,235,120,107,147, 88,135,173, 0,237, 10,209, 40,213,198,
-231,158,101,169, 60, 87,236, 98,134,144,137,158,185,188,142,124,158,107,226,151, 15, 84, 90, 6, 41,165,170,190, 84,183,174,148,
-181,188,176,207,151,108,229,165, 86, 92,198,239,226,182, 63,253,242, 66,222,216,229,228,183,119,225, 47,209,227,110,142,223,183,
- 89,233,229,243,199,186,151, 76,137,135, 5,170,129,117,210, 32, 32, 33,216, 90, 89, 58,173,226,114,208, 12, 69,162,207,168,171,
- 42,120, 31, 33,242,140,182, 85, 8,145,190, 90,101, 12,132,146, 24,189,199, 20, 60,116,237,160,173, 70,109, 15, 56,227, 1, 49,
-120, 68,254, 18, 92, 0, 0, 32, 0, 73, 68, 65, 84, 66, 48, 51,134, 53,139, 12,104, 81,208,179,198,210, 84, 73,128, 18, 13, 53,
- 11,187,194, 28, 33, 50, 80,155, 10, 41, 37,188,249,232, 13,222,190,123, 7,127,156, 16,165,193,172, 45,254,229,193,227,183,111,
-127,135,157, 85,104,154, 10, 90,128,226,139, 53,141,250,125,140,240, 33,225,228, 51,250,113,130, 20, 10, 77,211,225, 20,103,228,
-170,166, 14,207, 26,156,134, 17,211,236,161,141, 70, 76, 64,229, 28,121,185, 19, 93,110, 33, 4, 42,244, 35,125,118,149,162,174,
-209,213,182,120,248, 21,243,216,133, 32, 18,223, 60,122, 82,182, 59,135,190, 63, 67, 9, 13, 31, 3,250,126,196, 60,123,104,109,
- 48, 78, 3, 42, 87,161,237,106,244,125, 79, 90,153,170, 33, 97,170, 15, 80, 82, 99,232,143, 72, 29,117,224,203,132,201,251, 64,
- 33, 82, 49, 66, 10,178, 27,126,249,245, 59, 64, 74, 28, 79, 39,104, 99,208,237, 90,156,207, 71,244,195, 72, 19,145,202,225,124,
- 58,113,183,222, 1, 73,176, 47,190,167,244, 70,165, 80, 85, 6, 62, 16,124,168, 63,159,113,183,223, 99, 24, 38,212, 85,133,166,
-105,248, 9,154, 48,246, 3,118,109,135, 56, 79,240,222, 83,138,200, 50,161, 74,121, 21,211,242,243,252,248,212,195,186, 26,126,
-158,104,186,208,214,168,155, 6, 31, 62, 60, 32,248,196, 77, 20,173, 62, 41, 63, 30,200, 62, 34, 99,194,211,233, 27,188,122,245,
- 10,109,119,192,211,211, 83, 25,177,183, 66, 65, 65, 66, 27, 5,169,232, 94,170, 42, 71, 69,156,143, 8, 37, 26,149,206,186, 24,
- 51,226,228, 9,199,237, 88, 92, 56,164,162,247,202, 12,198,194,133,170,157, 66,175,214,169,223,102,114,119,115,124,206,217, 3,
- 25,208, 82,179,195,139, 68,223, 5,164,181, 85,192,167, 77,193,112, 35, 59, 98,105,102, 22,152,205, 34,168,219,158, 9,122, 81,
-236, 45,249,198,207, 15, 18,113, 33,102, 91,143, 64,249,140,216, 86,252,194,155,142,120,213, 5,230, 2, 34,200, 92,241, 62, 75,
-102,147, 43,133,108, 57,252, 47,196, 2, 41, 95,238, 20,202,168, 99,147, 43,203,163, 94,177, 1, 8, 16,215,217, 67, 73,194, 83,
-230,156,105,244,211,237,240,234,238, 21,238, 15,175,209,214, 29,140, 34, 58,214,196,140,244, 8,129,164, 13,162,210, 16, 82, 35,
- 75, 79,224, 24, 30, 19,105,165,129,196, 44,228, 44,200,187, 13,129,196, 9, 58, 98,243, 61,164,146, 21,176, 38, 46,229,205, 29,
- 37, 56,180, 64,228, 85, 81,175,148,128, 89,114,213,181,128,179, 10, 86, 47,126,122,135,160, 3, 82, 92,166, 29, 64,237, 20,106,
-103,113,104, 26,220,117, 21,186, 90,160,173, 37,190,122,154,240,215,191,249, 7,252,211,215, 15, 0, 28, 20, 12, 63,148,236, 25,
-102,232, 72, 6,144,132, 66, 18, 26, 89, 82, 72, 70, 81,130,230, 76,162, 27,102,220, 47,237,116, 73, 89,203, 52, 46, 79, 27,144,
-201,114,185, 62,183, 68, 45, 74,207,197, 20,191,226, 96,243,162,131,120, 14, 92,228, 46, 50,223, 12, 11, 16,183, 12,239, 92, 20,
- 94, 60, 39, 23,228,227,124,165,200, 95, 45, 91,105, 83,223, 62,191,100,243,205, 48,151,242, 33,204,249,217,222,253, 37,133,186,
-184,170,192,183,106,215, 63,180,219,191, 41, 72,205,219, 85, 25,158, 57, 1,138, 95, 65, 94,254,153,109, 32,211, 51,239,221, 38,
- 91, 90, 73, 34,176, 73,100,116, 77, 67, 83, 28,145,177,107, 26, 40, 33, 49, 7,143,148, 51,180, 54, 16, 16,232,118, 59,136,144,
- 16,166, 10,201, 75, 74, 63, 75, 25, 70, 41,140,209, 67, 43, 26, 57,143,243, 12, 87,213,152, 38, 18,225, 85, 85,117, 1, 51,105,
-234, 26,231,211, 80,128, 56,174,114,136,137, 82,191,162,212, 24,115,134,171,118,152, 92,141,119, 79, 79, 16, 41, 98,158,158, 80,
- 87,150, 97, 52,158,186, 65, 73,185,221, 57, 3, 31,169, 26, 15,167, 1,187,195, 1,167,254, 4,203, 86,167,143,222,124,132,199,
-199, 71, 8, 65,161, 77,149,179, 24,199,177, 76,107,172, 49,144, 25,136,222, 67, 8,130, 60, 77,211, 72,138,240, 24,160,164,129,
-207, 17, 90, 74,184,174,197,251,247, 31,144, 17,209,117, 29,218,166, 69,223,159, 49, 14, 51,159, 79, 9,211, 72,177,169,222, 7,
-218,201, 75, 26,185,183, 59, 11, 35, 21,225,164, 51,193,125,168, 8,144, 56, 30, 79,184,187,187,131, 86, 10,206,209, 36,192, 24,
-139, 24, 3,222,188,190,195,249,220, 99,156, 6,196,254,140,221,110,135,195,221, 1,179,247,168,172, 65, 76, 17, 77,219,224,241,
-225, 17,167,211, 9,187,221, 30,199,167, 39,236,186, 22, 79,167, 19, 98,152, 81, 85, 22, 38,145,142,103, 26, 38,138, 58,157, 41,
-219, 61, 42,129,182,171,161,148,196,135,135, 71, 52,181,195,235, 55,247,120,122,124, 66, 96,235, 25,216, 37,163, 89,152, 38, 57,
-105, 76,164,132,111,190,122, 7, 87, 17, 16,231,124,238,225, 92,133,187,187,123,244,253,128,105, 28, 33, 18,107,189, 4, 21, 8,
- 41,102, 42, 72,132,192,239,166, 47,241,217,103,159,225,241,241, 9, 66,104, 10,110, 25, 70,238,206, 37, 19,236, 42, 8, 72,204,
- 35,145, 2, 67,138,101, 90,155, 98, 4, 88,120, 25,125, 64, 72,129,131,118,214,194, 93,109,181, 62,130, 18,208, 66, 76,197,135,
-127,113,134, 45,154, 29, 78,193,139,156,234,185, 6,198,208,189, 33,243,186, 2, 72,200,197, 77,179,101,101, 72, 33,159,157, 31,
-219,253,123,105,162, 10,243, 61, 93,172,187,245, 82,171, 3,107,146,204, 31,242,127,139, 71, 56,149, 46,235,114,151,120,121,248,
-164,165, 31,227, 23,159,110,140, 24,183,140,240,203,113,237,242,123, 35, 82, 17,208, 45,164,221,141,255,134, 42,254,156,150, 92,
- 17, 62,160, 36,139, 83, 44, 32, 36,148,116,232,186, 22,159,126,242, 6,111,238,239,208,214, 13,180, 52, 44, 62, 35, 79, 99,200,
-177, 16,138,178, 16,196, 5,230,181,138,135, 32, 90, 92,230,157, 43, 36, 87,114, 18, 57, 83,156,100,222,192, 0,176, 73,221, 33,
-242, 90,102,176, 71, 42,128,135,188, 89,218, 82, 37,151,120, 7,159,161, 53, 96,173,132,213, 18, 86, 43,180,149, 35,254,244, 28,
- 48, 7,129,152, 4,180,208, 48,202,160,173, 12,106, 39,112,215, 25,188,234, 52,106,165,240, 56, 78,248,155,127,250, 29,254,250,
-239,254, 9, 71, 40, 84,210, 66,102, 5,176,219, 97,249, 22, 18, 36,162, 32,104, 78,148, 2, 65, 10, 68, 41,217,251,184,170,197,
-133,204, 64,204, 60,198,221,178,203,169, 3, 84, 5,170,194, 36, 56,206, 64, 7,103,119, 39,134, 12, 9,200,194, 36, 95,187,213,
-244, 7,171,187,159, 67, 92,182,224, 33,108, 52, 30, 40, 58,138,114,113,149, 76,119,121,177,255, 23, 69,101, 47, 46,120,240, 91,
-245,235,181,146,126,153, 54,164, 18, 58,115,107,199,118, 27, 32,113,253,253,172,163,125, 60, 91, 99,125, 87,167, 46,110, 8,123,
-150,162, 33, 67,220,102, 53,240, 39,243, 15, 81,216, 11, 78,202, 91,166, 9,137, 97, 38,164,194, 38, 12,113,187,111, 72, 64, 23,
-124,201,169,182,138, 60,208, 41,101, 36,239,161,148,130, 83, 21, 82,140,152,199, 9,109, 83, 35, 14, 25,253,241,132,174,221, 33,
- 71,178,196, 85, 85,133,105,154,138,170,251,226,125,202, 11,226,147, 4, 84,117, 83,177,199,158,148,173,170,170, 49, 75,139, 73,
-104, 40,109,144,133, 66, 98, 17, 93, 72,134,168,114, 18, 8, 41,194, 85, 21,166, 24, 81, 53, 13,193, 59,164,194,253,225, 30, 49,
- 68,244,231,115, 57,160,207,231, 19,239,170, 41, 52, 70,179, 35,166,114, 14, 97,158,145, 66,128,177, 26, 66,211,161,110,117,131,
- 20, 19,186,182,129,200, 25,253,233,132, 20, 2, 38,239, 81, 89, 74, 88,203, 49, 97,191,235, 96, 93,197,176,154, 9, 49,100,124,
-120,122, 64,211, 82,170, 90,211, 52,116,241,131,242,200, 67,240, 23, 63,167,148, 18, 30, 30, 31,208,181, 59,140, 19, 21, 28,174,
-114,120,122,124,192,253,221, 29,154,218, 33,196,136,119,239, 31, 49,142, 35, 50, 18,246,187, 22, 33, 4, 56,199, 90, 6,235,240,
-254,195, 3, 62,251,172,227, 44,246,204, 59,251, 25,167,115, 15, 8,202,146, 80,175,239,145, 56,173,109,158, 61,219, 62, 21,234,
-214, 66,233, 61,198,113,128,214, 13,108,229,144,167, 25,218,104,132, 16, 81,213, 21,162, 15,152,166,137,253,228,170, 80, 62,251,
-126,228,103, 51, 33,132, 30, 49, 36,236,186, 29,105, 55, 60,105, 33,132, 16,176,150,244, 8,167,211,169, 60,147,239,223,191,199,
-126,191,199,185, 31,161,180,129, 4, 21, 61,195, 56,226,120,242,168,157,195,253,221, 29,172,213, 24,231, 25,134,167,122, 57, 69,
- 32,210,228,176,144, 47, 3,115, 55,202, 52, 79,172, 49,219,124,209, 10, 41, 81,105,162, 17, 26,109, 24, 32, 52, 33,166,120, 1,
-147,108,154, 6,211, 56,144,232, 47, 46, 94,120, 73,121, 84, 49,173,147,104, 6,120, 81,115,180,218,255,178,196,119, 10, 98, 95,
-226, 83, 0,128, 46, 18,215,151,228,185, 89,124,235,161, 42,144, 87,214,118, 94,199,229,164, 0, 38,197, 55,141,251, 82,185, 96,
-111,119, 34,171,173,232,178,250, 17,151, 9, 92, 75,215,184,177, 24,209,232, 99,237, 12,137, 87,189, 76, 19, 52,132,178,184,127,
-245, 17,222,124,252, 41, 42,215,160,171, 44,246,141, 67,173, 8, 79, 59,207, 30, 72,180,111, 73, 41, 81,215, 17, 61, 66, 32,161,
- 77, 76,203,248, 88, 34, 36, 65, 17,164,130,176,129, 74,202,181, 96, 17, 2, 73, 10,100,149,203,228, 67,172, 11,221,226,157,132,
-164,223, 47, 5, 85, 11, 66, 0, 72, 1, 82,228,178, 75,150, 82,192, 24, 1,163, 5,172, 86,208,138, 46,117,163, 5,180, 50, 20,
-140,145, 51,146, 82,176, 90,163,182, 14,251,186,194,161,145,104,235,140,166,210, 24, 39,129,255,250,197,123,252,229, 95,255, 61,
-190, 60, 37,104, 83,193, 41,205,106,123,137,196,200, 85, 37, 20, 19,227, 36, 29,128,146,254,123, 92, 46,185,141,208,109, 29,211,
-230,117,123,190,161,201,109, 25,105,203, 52,103,177, 83,197,226,243,220,248, 51,243,170, 50,200,215,241,125,207,198,222, 47, 92,
- 60,203,123, 44,197,102, 58,179, 22,136,249,134,208, 19, 76,157,218,238,185,182,188,118,154, 38,228, 13,111,254,165,130, 98, 3,
-156,217,210,211,175,254,220,183, 41,215,111,117,218,207,252,239,215, 58,149, 27, 23,251,229,133,254, 18, 3,254, 59,148,186,155,
-116,168,103, 83,134,133,128,184,140, 33, 3,117, 99,185, 31,161,148, 64, 93, 57, 82, 77, 67,192,185, 10,195, 56,163,169, 43, 86,
- 82, 75, 40,109, 48,132, 35,164, 86,176,214,162, 31, 6,232, 24, 97,164,194, 28,105,199,108,180,193, 48,142,232,218, 22,187,221,
-110,221, 61, 79, 83,241,239, 58,107, 88, 84, 22,113, 60, 29,137,163,174, 4,156,115, 80, 86, 33,198, 0,228,132,186, 98, 71, 71,
- 50,152, 39, 10,114, 81,202,176, 96, 16, 48,174, 42,197, 91,215,117, 56,157,123,238,188, 3,158, 30, 31,225, 39, 34,156,249,201,
-195, 58,131,202, 90,228, 24,161,165, 96, 0, 21, 16,230,169,144, 40, 21, 67,118,180, 49,200,137, 16,168,218, 24,248,121, 34, 17,
-161,100,236, 42,115,219,165, 32,225, 45,249,174, 35, 77, 62,164,129, 20, 6, 67, 63, 51, 67,159, 10,169,190,239, 49, 14, 19,238,
- 14,123,186, 0,189,199,227,227, 7,188,126,243,138,186,216,144,120,212, 28,153, 19, 0, 24, 45,209,182, 7,244,231, 1, 90, 91,
- 60, 29, 79,232,186, 22,143,143,143,184,219,239,225,125, 64,211, 52,216,239, 53,132, 56,226,155,111,190,194,231,159,125, 31,125,
- 63,192, 24,137,105,206,216,239, 90, 12,211,140,156, 87, 61, 77,219,182, 56,247, 71, 0, 21,140,105, 48,244,103,184,202, 65,204,
-228,144,144, 10, 69,229, 47, 68, 44,248,217,251,251, 59, 60, 60, 60,174, 69,225,178, 10, 90,166,176, 73, 96, 26,166, 50,201,115,
-206, 1,115, 96, 40, 15, 61,251,119,119,119, 56,157,206,228, 60, 72, 9,167,211, 9,227, 28, 24,255,107,160,148, 70, 37, 37,246,
- 31,127, 12, 37, 5,134, 19,129,120,154,166,194,185, 31, 72,139, 48,209,248, 27,155,213, 95, 74,180, 94, 45,235,100,198, 74,107,
-126,230, 98, 14, 16, 81,192, 89, 9,103, 29,198,113,160,216,222, 2, 87,203,108,103, 4,156,213,232,154,123, 12,253, 25,199,211,
-185, 52,121,129,207,201,229,242, 78, 66,148, 80,176, 91,141,192, 75,197,246,197, 25,112, 99,146,167,106,183,170,223,243,133,229,
- 72, 20,202,153,192,115,223,156, 84,162,140,246,228, 70, 88,176, 0, 38,197,166,139, 66, 78, 23,251,210,231, 35,210,203, 17,126,
- 81,174, 95, 77, 0,115, 17, 67,109,132, 73, 27,143,114,102, 86,110, 74, 18, 82, 54,112,213, 1, 31,127,242, 99,252,233,191,249,
- 15,248,243, 95,253,247,248,252,135,127,140,195,225, 21,180, 50, 80, 66, 66,166,132,232, 35, 89, 74,152,151, 30, 34, 71, 54,206,
-148,175,236,163, 71, 12,158,211,123,136,173, 62,230,128,196,197,140,102,155,156, 84, 2, 89, 74, 68, 41, 49, 49, 35, 62, 95,160,
- 70,175,178,226,133, 96, 69,237,134,130, 39,105,111,110,132, 64,101, 52,246,149,197,161,117,104,172, 64, 99, 20, 26,103,161, 57,
-227,152,186, 98, 9,103, 12,154,198,226,208, 85,120,211,213,184,115, 18, 77,109,112,138, 10,255,245, 95, 30,241,151,127,251,123,
-252,237,151, 39,204,217,194, 10, 13,195,197,131,103, 53, 3, 36,125, 15, 16,146, 32, 51, 66, 33, 40,131, 36,117,153,175, 72,185,
-128, 85,200,126,151,211,218,185,138,141,102, 32, 95,128, 93, 4,115,221, 21,225,124, 88, 13, 75, 34,156, 27,164,185,188,250,210,
-183,246,176,109,234,217,210, 49,223,178, 74, 46,190,255, 45,148,166, 92,122, 57,179, 88, 76,172, 57, 0, 55, 56,142,151, 89,233,
-114, 93,141,108, 58,243,111,227,173,131,247,212,133, 44,117, 33,178,123, 62,134, 47,164, 45, 41,111,119,199,226,187, 9,115,226,
-102,128,196,154,173,188,242,183,111, 81, 30, 55, 89,206,216, 36, 42,190,116,241,243, 23, 85, 90,195, 48, 76, 68, 74,130,127,236,
-247, 29,156,213, 68, 75,227, 92,115,173, 12,170,170,134, 20, 18,206, 57, 28, 79, 39,132, 28, 48,251,153,249,232, 19, 92, 93,195,
-231, 8, 99, 45,192,144,146,115,191,236,121, 27, 86,112, 7,140,227, 64, 40, 89, 41,209,214, 45,238,238,238, 49, 14, 35,124,140,
- 80, 74,147,240,206, 57,140,195,136, 24, 3,140, 86,232,154, 26, 49, 70, 74, 5, 99,174,129,226, 29,125,240,129, 14,101, 80, 50,
-154,117, 6,200, 9,175, 95,221, 67,230,140,121, 36, 6,252,110,191,195, 60,141, 48,138,131, 86,216,231,127,216,237,160, 36, 69,
-201, 26, 77, 16, 29,145, 65,214, 48, 73, 20, 56,103, 12,221, 13,145,180, 23,137,115,220,231,121,198, 52,207, 20,140,162, 53,137,
-207, 64,130, 58,239, 41,101, 45,103, 96,215,237, 48,207, 30,243, 52,243,101, 68, 54, 60,103, 41,240,133,236,181,116, 33,146,229,
-207, 32,198,136,190,239,241,225,195, 3,172, 37,242, 92, 93,215,168,170, 10, 31, 62, 60, 64, 8, 80,186,217, 68, 98, 61,173, 53,
- 79,179, 72, 4, 9,182, 44, 46,151, 71,136,212, 97,187,202, 17,225,111,158,160,148,194, 52, 17,175, 30,137,232,130, 31, 62, 60,
-162,174, 27,212, 77, 77,221,184, 82,120,124,122, 34,155, 31, 4,234,170, 66,140,153,197,121,171,126, 5, 28,244, 35, 75, 17, 46,
-138,163,104,158, 3, 14,135, 61, 71,223, 18,207,221, 90,131,195, 97,143,211,249,180,102,199, 51, 91,160,170,200,203, 14, 1,124,
-253,245, 87,168, 44, 65,185,132, 16,232,207, 3,164,214, 48, 90,226,238,238, 30,135,195, 30,198,145,101,208,251, 64,133, 7,127,
- 22, 67, 76,229,179,159,175,206,155,133,186, 42,121, 34, 37,132,128,230,247,217,114,236,237, 52,141,184,187, 59,160,170, 28, 77,
-164,102,198, 32, 11, 73, 5,231, 38,162,123,171, 31, 75, 91, 29,204, 11,110,151,103,104,232,171,232,214, 98,105, 35,148, 99,186,
-216, 97,111, 3, 88,174,129, 27,148,205,190,249, 6,153,108,180, 8,224,196,118,159,183,246, 61, 23,168,208, 69,105,188,205,147,
-151,203, 78,125,195,128,223,142,251, 5,199,160,138,188, 46,204, 23, 92,225, 34, 90,203, 80,248,244,211,159,226,143,255,228, 87,
-248,147, 63,253,239,240,179, 95,254, 91,124,250,217, 31, 65,219, 3,134, 9, 56,159, 78,152,230, 17,126, 26,145,252,140,196,136,
- 65, 31, 72,149, 58,251,153,246, 33, 33,148, 16,129, 24, 60, 4,167,173,249,148, 16, 56, 45, 78, 73, 58, 32,150,254, 52, 9,129,
- 40, 5, 60,239,214,179, 88, 45, 82, 75, 82, 79,209, 13,108,139,146,204,244, 60, 65,248, 89, 45,128, 90,107,236,107, 71,234,119,
-107,208, 57,131,218, 25, 88,165,139, 32,209, 25,139, 93,211,160,107, 12,186, 70,163,179, 18,181,209,232, 61,240,159,191,248,128,
-255,253, 55, 95,226, 95, 39, 11,209,188, 65,156, 5,108, 10,176, 34, 32, 32, 97, 2, 16, 50,129,113,140, 32, 4,110,148,100, 99,
-139,210, 20,224,204,178,118, 93,104,105, 57,130,146,174,174, 30, 50, 18, 2,198, 18, 92,160, 4,233, 16,132,176, 48,166,129,115,
- 77, 65, 83, 46,112,140,103, 59,102,185, 66,102, 74, 71,143,181,128, 88, 94,131,220,122,210,175,124,221,242,150, 45, 83,228, 34,
-242,195,173, 93,189, 96, 26, 97,217,103, 47, 98,191,231, 43,162, 91, 19,130,148, 50,112,253,191, 99, 11, 81,146, 47, 42,217,111,
-117,218, 47, 23, 13,183, 71,237, 55,161, 51,121,197,220,110,119,210,184,242,200,230,235, 16,153,111,217,229, 47, 88, 77, 41, 36,
-124,240,197,226,216, 52, 53,148,209,133,230,104, 12,229,126, 59,235, 16, 67,196,221,221, 61,142,231, 19,230,228, 89,216,153,160,
-165, 34,187, 90, 83, 35,114, 74,225, 56,207,128,162, 12,131, 69,252, 84, 85, 14, 33,120,236,246, 59,212, 77,141,121,158, 16, 66,
-194,187,119,239,105,132, 92, 85,152, 61,117,196, 74,107,138,210,228, 48,153,113,246,132, 60,102,218, 91, 18,148,188, 54, 79, 51,
-140, 82,208,114,137,255,204,120,243,234, 30,231,227, 17,109, 93,227,248,116,132, 20, 2,109,215, 97, 28, 7,248,121,230,103, 87,
-209,186,206, 16,148,197, 57, 7,173, 36,206,231, 51, 20,239,154,157,181,100, 89, 10, 1, 90, 40, 68, 63, 35,248, 8,164,204,208,
- 27,138, 94,157,167, 25,109,219, 98,154,105, 2,209,247, 3,219,240,200,163,221,247, 67,177,157,157,207, 61, 34,239,114,105,122,
-148,202, 37, 94, 87, 13, 20,231,111, 47,159,169,186,166, 61,119, 8,164, 10,159,231, 25, 16,244,243,168,156,133,209, 6, 15, 15,
-143,168,170, 10,138, 49,174,228,101, 31, 16, 67, 36,219,155, 64, 81,210, 39, 6,212,144,135,156, 62,139, 85, 85, 97, 28, 72, 56,
- 88, 87, 13, 82, 4,180,162,130,172,235, 58,248,224, 1, 1,140, 35,217, 26, 83,202,168,107, 98,175,151, 8,209, 98,141, 94,218,
- 64,254, 12,107, 85, 8,117,125, 63,160,105, 26, 24, 77,207,196, 60, 79, 80,154,114,214,199,113,196, 52,205,104,154, 22,211, 28,
- 48,140, 35,101, 7,180, 13, 94,191,122, 69, 77,152,159,145,114,132,171, 44, 5,215,176,251, 96,222,116,247,117, 93,193, 90, 90,
- 17,209,251, 76, 22, 79,107,233,189,202,200, 43,181, 46,165,226, 6, 16, 82, 20, 52,235,221,253, 61,132, 16,152,103,114, 20, 76,
-195,136,174,109,168,136,145, 2,243, 28, 56,169, 79, 82,215,191, 61, 75,132, 88, 45,157, 27,152,204,246,140, 88,126,182, 37,151,
- 29, 47,103,173,172,150, 54,220, 78,104,147, 16, 20,205,121,113, 40, 60, 7,203,139,141,178,253,150,249, 94, 93,154,149, 54,161,
- 25,107,190,118, 73,168,219,236, 43,159, 35, 97,177,250,134, 47,178,173,105,116,248,250,254, 83,252,183,255,254,127,192, 47,255,
-248, 87,112,245, 43, 68,105, 49,204, 1,143,143, 39, 28, 79, 61, 98,244,152,231, 1,211,120, 70,140, 51, 98,152, 8,238, 16, 3,
-119,230, 20, 16,144,249, 66,247,209, 35, 49,245, 40,231,140, 57, 39, 68,222,225, 75,161, 86,187,220, 50, 37,144, 10,203,214, 24,
- 28, 5,187, 22, 47,220, 41,110,183, 9,188, 46, 88, 26, 77, 9, 34,218,213,206,161,171, 12,246, 13,253,251,110, 87,227,126,223,
- 65, 49, 53,201,104,141,166,118,216, 53, 14,187,206,162,118, 10,214, 40, 76, 73,225,111,254,229, 61,254,242,191,252, 51,126,253,
-246,132,115, 54, 48,166,129, 85, 26, 26,145,226,107,165,132, 23, 10, 1,160,195, 13,130,176,176, 66,194, 67,193, 11,137, 36, 53,
-143,160, 56, 21, 45, 3, 57,201,210,165,167,148, 47, 40,120,139, 64,196, 89,135,202, 90,220, 29, 14,104,155, 14, 77,219, 97,215,
- 29,112, 56, 28,176,235, 90,180,109, 13,235, 40,115,154,130, 26, 54,227,115,145, 55,200,214,181,203, 78, 27, 1,154,200,151,184,
-225, 91,157,170,188, 64,210, 46, 81, 75,121, 51, 21,184,125, 25,138, 11, 97,140,188,250,109,226,217,165,190,166, 44,173,194,199,
-242, 51,190, 82,234, 63,203, 98, 23,223,238, 75,127,105,151,190,173,200,175,199,233, 23,164,169, 77, 97, 36,197,183, 20, 4,242,
-234, 53,228, 23, 88, 21,235, 64,137,244, 20,203,212,140,230,219,196, 39,175,107, 8,173, 89, 49, 76, 11,251,218,145,245,233,253,
-135, 15,152,194,140, 44, 51,118, 93, 75,222,237, 24, 97,156, 69, 22, 11,162, 85,241,225, 70, 57,220, 33,132,146, 18,118, 58,159,
-161,141,230,215,205,217,210,124, 25,229, 76, 66, 44,197, 69, 63,144,145, 66, 44, 69,247,241,248,196, 28,244, 0,107, 52, 21,196,
-214, 80,177, 46,232,178,121,243,250, 53,188,247, 56, 30,143, 56,159,123,116,109,135,227,211, 19,198, 97, 36,203, 42, 23,221, 49,
- 6, 4,239,113, 62,157, 33,244,234,102, 81, 76,224, 75, 41, 83,124, 40,107, 14,132, 92, 38, 91,228, 13, 87,108,123, 93,114,193,
- 1,224,124, 30, 40,100,102, 14,152,103,154, 60, 80, 54,186, 47, 10,243,192,140,250,170,170, 49,142, 19,206,231, 30,231,243, 25,
- 33, 4,212, 85, 93,118,235,198, 24, 52, 77, 67, 49,179, 44,228, 34,199,143, 40, 23,106,211, 52,133, 43, 96,173, 69,127, 62, 67,
-105,133,182,107, 33, 0, 60, 60, 60, 96,183,219, 1, 16, 60,141, 97,159, 61,235, 28,170,170,198, 48, 76,232,218, 14,179,167, 73,
-194,126,191,199,219,183,239,176,235,106, 46,240,201,219, 63, 77,212, 97, 23,106,158,179,155, 80,166, 75,244,234,242,134,164,196,
- 12, 12,169, 10,139,127,154, 39, 74,215,155,102,132, 24, 80,215, 13,142,199, 19,217, 43, 3,217,236, 34,107, 45,230,217,227,116,
-234, 17, 98, 64,215, 53, 80, 74, 32,165,128,170,169, 96, 93, 69,140, 17, 31,145, 64,133,138, 54,244, 44, 34,131, 87, 32,148, 73,
-176,236, 75, 9,144,196,230, 53, 14, 77,137,153, 98,180,181, 50,240,222, 99,154, 70, 72, 37,177,235, 90, 14, 2,138,144, 66, 96,
-191,223, 97,156, 38,196, 16, 41,106,152,167, 55, 82,210,251, 33,164, 42,119,230,194,146, 47,194,223,188, 54,128,219, 38,119,235,
- 91, 23, 55, 86,111,124,169,199, 27,137, 51,107,167, 46,178, 40,172,104,136, 21,189,122,209, 25,240,254,252, 26, 1,190,118, 11,
-185,160,102, 22,158,123,145,143, 45, 23,218, 21,231,246,154,144, 69,204,222, 92,172, 98,153,233,111, 82,208,174,229, 71,159,255,
- 24, 63,248,236,103, 56, 28,190, 15,101, 14, 56, 15, 17, 15,199, 39,140, 83, 79,221,249, 60, 34,248, 25, 49,121,204,211, 25,243,
-220,211,174, 40, 71,196,180,142,222, 99, 78, 72, 41, 32,164,132, 57,123,142, 28,205, 28,191,154,216,154,166, 86, 86,120,217,233,
- 42,238, 6,228,230,189, 18, 23, 66,194, 5, 11, 92,104,101,121,237,146, 20,135,199, 88, 41, 81, 59,135,125, 99,113,191,175,241,
-241,171, 3, 94,223,237,224,140, 68, 74, 20,227,216, 52, 21,218,174, 66,215, 89,116,149,131, 85,228,215,253,155,127,253, 10,255,
-219,127,254,123,252,191,111,207, 56, 71, 96,158, 38,132,121, 42,227, 16,231, 28,148,169, 33,149, 99,240, 1,193,123, 18, 4,130,
- 16,240,172,178, 77, 74,241,222,137,135,240, 73, 80, 98, 85,202, 72,129,199, 83, 87, 69,160, 18, 18, 77,229,240,241,155, 55,104,
-170, 10, 90, 81,247,166, 88,201, 47,144, 96,140, 70,219,214,152,253,136, 97, 60,175, 52,177,197,203,126,117, 65,229,205,165,190,
-160, 87,203, 74, 67, 94,142,166, 87,177,202,117,119,188, 93,174,139,103,129, 65, 91,164,237,114,169,175,200,199,252, 98,167, 94,
-148,253,207, 18, 10,229,230,159,215,163,116,113, 49,114, 23, 87, 1, 13,183,168,112,223,166,118,127, 9,197, 44, 55,252,125, 1,
-241, 98, 33,145,175, 69,123,249,133,221,123,198,133,102,128,188,235,228,235,117,214, 96,127,216, 65, 49, 30, 53,196, 4,173, 12,
-250, 83,143,125,183,195,219,119,111, 49,135, 9, 80,128,182,228,175, 78,222,243,229,234, 48,135,128,105,158,161,150,220,113,173,
-139,146,187,174,107, 12,195, 0, 41, 5, 38,102,142, 67, 8,124,255,251,223,227, 81, 46, 57, 69, 22,192,139,159, 39,132,105, 38,
- 11,218, 68, 93, 98,142, 9,200,196, 74,175, 42, 11,196,136, 48,123, 52,109,131,251,215,247,164, 90,247, 30,179, 15,240,115,132,
-177, 14,199,227,137,149,203,244,126, 89, 99, 56, 89,204, 35,204,180,231,119, 77, 69,118,169,113, 42, 68, 74, 2,219, 8,182,151,
-133, 18,237, 41,165, 46, 0, 20,242, 66, 83, 87,215, 52, 59, 76, 19,185, 88,164, 36,247, 77, 85,213, 8,145, 46, 40, 26, 47,211,
-212, 34,248, 0, 99, 12,134,158,217,250,108,233,213, 82, 81,148, 43,119,250,117, 77, 43,143,105,158,139,229,201,104,137,166,118,
- 92,132, 16, 85, 45,240, 74,209, 57,135,121, 30,161,151, 61,127,164, 21,128,247, 51, 9,243, 50, 61,159,227, 52,161, 31, 38, 52,
-236,118,200,153, 86, 23,231,211, 17,135, 67,139,105, 30, 32,181, 68, 85, 87, 28,142,147, 97,140,197, 48, 80,170,223, 60,123,222,
-179,131,137,132,161,216,138, 47,116, 41, 98,117, 89,128, 1, 58,200, 96, 81, 38,239,246, 65,107,133,113, 28, 1,161, 96,152, 13,
-144, 82,130, 84, 10,221,174,133,179,102, 5,144, 9,224, 60, 12,152, 67,160, 34,128, 65, 98, 57,101, 12, 67, 15,100,160,109,107,
- 34,102,230, 68,212, 80,166, 89, 46,161, 68,130,173,208, 89,100,216,202, 65, 42, 18, 12, 46, 69,155, 15, 1,198, 16,173,110, 41,
- 90,157, 99,244,238, 28,160,132,100, 81, 29,193,137,150,179, 76,105, 13,163, 77, 9,199, 81, 66,109, 56, 32,242, 98,101,120, 73,
-113,205,151,147,193,109,167,190,152,238, 47,185,221, 98,123,173,111,198,197,249, 57, 96, 38, 95, 38, 90,149, 68,181,109, 45, 33,
-214, 14,125,129,195,108, 3, 85, 10,244,131, 97, 23, 23,126,188,197,243,184,162,192, 8, 54,160, 13,238,238,238,241,147, 31,254,
- 4, 63,255,233,207,240,163,207,126,140,251,187,143, 49, 79,192, 48, 5, 68, 0,195,120,198, 60,245, 8, 97, 68,240, 35,124,152,
-224,249,130, 31,167, 1, 41,122,210,240,115,244, 95,140, 52, 30, 75, 49, 34,228,136,152, 99,241, 90,103,246, 35, 47,170,200, 37,
- 67, 30, 66, 34,243,129,150,174,178,188, 69, 17, 16,202, 11,146,157,224, 64,155,237,250, 66, 73,218,165,215, 70, 98,215, 56,124,
-116, 87,227,147, 55,148,186,230,180, 64,206, 30, 74, 10,116,109,141,174,171,177,107, 45,186, 70,192,217, 26, 33, 74,252,230,119,
- 95,225, 63,253,223,127,139, 95,127,125,194, 57, 25,242,101, 70,170,148,179, 0,148, 81,208, 82,195, 89,135,186,106,208, 54, 13,
-140, 18,252,128, 19,116, 38, 72,141,164, 53, 37,214, 72,122,128,229,162, 45,227,192,138, 5, 33,121,225, 62,200, 25,149,177,120,
-115,255, 10,181,179,200, 41,192, 90, 10,152,216,237, 26,180,141, 67,229, 12,140,150,176, 86, 97,154, 7, 60, 29,159, 54,112, 25,
-129, 91,195,223,173, 72, 46, 3, 23, 10,247,229,146, 20,151,209,233,235,235,202,249, 50, 63,224, 38,210,113,139,179, 68, 97, 68,
-151, 78,159,109,136, 89, 60, 23,220, 45,191, 51,231, 53,150, 49,109, 46, 64, 81, 72,134,184, 0,225,220,180,166,229, 77,138,223,
-141,162,246,187, 4,118,207, 70,241, 88,127, 62,219, 29,251,133,215, 95,108, 83,167,242,139, 23,255,242,249, 93, 56, 11, 88,132,
-169,228,245, 64,195, 89,222,209, 71,120, 31, 33,161,225,135,128,251,221, 1,211, 52, 32,102,202,209,150, 74, 98, 24, 79, 56,116,
- 59,120, 86,118, 47, 22,165, 20,137, 76, 22, 35,253, 94,193,197, 32,241,230, 53, 59, 47,248, 34, 64,198, 52, 79, 48, 70,179,154,
-154, 29, 15, 41, 82, 42, 89,221, 32, 39, 64, 41, 77,246,174, 68,176, 27,109, 52,134,129, 60,225,198, 26,236,247,123, 98,133,167,
- 4,101, 52,142,167, 19,148, 50, 56, 62,157,169,235, 7,137,189, 36,125,113,130,188, 44, 81,166, 57,195, 88, 75,133, 69,166, 61,
-251, 50, 62, 93,222,211,162,102,206,224,221,181, 44,187,211,229, 49, 49,166,194, 60, 71,194,156, 50,169,101,154,102, 26,179,130,
-206, 24,234,244,136,119,190,192,142,144, 19,172,177,164,255,225, 46, 61,241,197,167,148,102, 22, 7,217,199,102,239, 73, 36, 40,
- 73,228,101,172,197, 56,141,168, 42,242,222, 43, 45, 75,218,217,174,219,225,124,238, 33,165, 66,221,212,240,115, 96, 24,206, 64,
- 58, 34,169, 48,142, 51, 4,232,103, 85, 55, 14,117,109, 33, 36, 8,107,203,246,188,182,233,240,238,253, 7, 56,231, 80,213, 53,
- 17,223,148,198, 56,142,240,193, 83,152, 13,143,177,169,224, 95,132,231,236, 86, 50,154, 67,130,116,105, 34,115, 78,208, 11,176,
- 40,103, 66,230,178, 56, 49,196, 64,182, 72,231, 48, 77, 51,206,167, 51,114, 78, 28, 95,187,120,215, 21,133,187,112,193,174,148,
- 66, 93,215,212,172,112, 58, 92, 74, 1, 49,103,212, 77, 67, 88, 89,165,233,110,148,121, 45, 28,248,189, 18,155,224, 21,122, 70,
-129,121, 34,113,232,174,109,169,144,241, 51, 77,187, 21,133, 26, 81,126,150, 88,215,209,156, 25,144, 22,209,245,146,228,150,113,
-161, 61, 16, 82,188, 44,174,189,250,172,242, 78, 61,150,253,248,179,157, 95, 89,162, 47,144, 25,193,224,138,213,244,190, 36,196,
-136,107, 58, 40, 54,144, 25, 78, 53,226,192, 50, 6, 97,172,216,206,173, 8, 78, 20, 63,159, 92, 77,253, 82, 34, 39,234, 6,181,
-208,184,223,223,225,167, 63,248, 17,126,249,211,159,227, 39, 63,248, 9,222,220,191, 65,101, 42, 72, 0, 62,206, 24,167, 30, 89,
- 68,196, 24, 48,244,103,218,143,251, 9, 49, 12, 8,243, 80, 66, 9,188, 15, 96, 67, 33,114,242, 72,193,115,194, 18, 41, 30, 99,
-140,200, 16,136, 72, 69,180, 69,227,163,188, 70,124, 10, 65,221,185,148, 69,133, 15,169,152,101, 47,203,135,115,157, 52,139,178,
- 67,144, 82, 48,226, 85,194, 42,129,198, 72,180, 78, 96,223, 40,220,181,100, 83,163, 72,227,128,218, 25, 28,246, 20,169,186,107,
- 29,118,181,134,179, 9, 30, 26,127,255,251, 71,252,167,255,235, 55,248,127,254,233, 27,140,170,129,135, 70,140,203,126,159,254,
-188,145,128, 83,196,148,175,140, 70,101, 29,172,164, 14, 68,104,139, 36, 53, 2,128,188,236,211,249,146, 90,196, 65,197,114,181,
- 68,139,178,182, 32, 75,130,226,116,109,141,174,169, 8, 64, 82, 59,236,118, 13,132, 0,180, 18,156, 34,149, 33, 68,194,174,163,
-241,223,215,223,188, 69, 90, 92, 10,137,198,117,151,173, 97, 90,129, 54,219, 16,160, 11,193,123, 46,228,186,117,212,206,127,110,
-153, 52,108, 98, 68,215,137,209,178, 10, 89, 43,130,180,241,235, 47,112, 29, 48,211,127,185,207, 50, 19,242, 22, 97, 96,222,114,
- 34, 51,158,177,235,175, 95,219,182, 72, 89, 14,253,197,166, 89, 58,131, 2, 88,186, 97,118, 7,190, 83,176, 39, 54,110,128, 98,
- 83, 21,155,181,213,178, 10, 16,107,149, 47,243,202,165,190,117,169, 39, 65,207,132,202, 27,244,165, 0, 20, 18,238,246,123,156,
- 79, 71,254, 51, 26,141,221, 97,111,106,252,248,243,239,227,155,135,175, 16, 36, 89, 81,179,247,164,202, 86, 26,167,126, 96, 42,
- 35, 29,206,243, 52, 22,192,148, 20, 2, 66,177, 24, 23, 25,198, 26, 42, 26, 34, 65, 80,134,115,143,148,129,186,174, 17, 2,133,
-165,104,173, 49,251,128,211,121, 64, 91,119,232,218, 22,167,243, 25,231,243, 25,198,104,156,207,103,130,162, 4,186,152,238,238,
-247,152,166, 17,243, 56,194, 79, 51,172,177,120,122, 58, 65,102,137, 48,121, 56, 99,105,130, 21, 2,156,179, 80, 82,144, 3,197,
- 88,204, 19, 77, 21,140,210,136, 33, 34,250,128,182,105, 80,215,180,223,151, 90,195, 53,212,109, 43,166,134,209, 57, 66,151,187,
- 15,177,236,144,165,210,152,226, 12, 31, 3,172, 35, 52,108,140, 17, 41, 4,136,156,225,167,137,206,159,152, 10,133, 19,130,176,
-182, 33,121, 36,100,190,164, 3,140,182,232,251, 17,187,253, 30,199,211, 35,132, 18, 48,206, 80,250, 29, 76,185,160, 93,229,240,
-225,195, 7,230,161, 43,140,126,130,171, 44, 82,160,200,218,199,167, 35,124,136, 56, 28,238, 32, 69, 70,140, 30,117, 93,177,162,
- 93,227,155,175, 63,160,235,118,208,154,248, 31,218, 16, 59,227,155,111, 62,224,254,254, 14, 18, 18,117,229, 48,246, 61, 37,191,
-241,115,223, 46, 97, 48,145,126, 85,141,163,176, 27, 77,194,101,197, 65, 64, 49,120,228, 20, 97, 52, 77, 32,180,209, 80,154, 10,
- 60,169, 21,113,230, 39,138,217, 53,214,160,237, 26, 8,201,241,190, 41, 97,223,117,152,167,137,109,202,137,200,134, 33,208,234,
-100, 14,100, 1, 54, 14, 49, 4,196, 16, 97,173, 70, 22, 68, 76, 84,134,236,205,193,211, 29,160,180,130,173, 12, 65,146, 50,191,
- 38, 37,214,207, 74,206,200, 49,195,104,138, 30, 86,156,232,104,157, 33,189,149, 72,220,253,103, 84,117,133,204,147, 45,145, 1,
-167, 45,196, 98,107, 99, 33,165, 42,193, 86, 75,177, 30, 33,182,209,176,215,193, 46, 87,232,118, 1,177,189,212, 47,125,111,219,
-221,218, 18, 52, 81, 84,186, 34,221, 76,150, 17, 87,123, 68,185,157,251,111,186, 43,145, 55,162, 60,145, 55,136, 79,177, 65,103,
-230,149, 5,207,223,149,202, 2,119,221, 30, 63,250,236,135,248,229,207,126,129,159,124,254, 67,188,185,127, 77, 42,211, 76, 34,
-169, 37, 62,113,156,103, 76, 51,135, 57,248, 17,126,158,225,195,132, 24,102,120, 63, 35, 38,250,240, 68,239,145,210, 12, 41, 18,
-114,244, 60,138, 79,108, 99, 88,162, 8, 3,143,206,150, 28,224, 92, 4, 80,101,210,176,101,206,131, 70,130,114, 73,252, 18, 75,
-244, 44,113,157,149,226,139, 30,138,118,238,130,162, 23,141, 20,168,141, 68,227, 20,156, 76,208, 50, 66, 33,162,118, 10,251,174,
-194,221,190,198,253,161,193,174,171,209, 52, 14,150,133, 44,255,250,213, 3,254,143,191,250, 53,254,203, 63,252, 14,167, 32,144,
-140, 99,122,146,100,230, 89,134,226, 8, 89,103, 52,165,104, 73, 69, 2, 27, 86,108,219,186, 65, 85, 55,208,198,113,164,100, 94,
-139, 50,254, 41,134, 68,135, 81,233, 22, 54, 30, 55, 45, 5, 14,135, 61, 37, 77, 41,137,221,174, 67, 78,192, 56,244, 56,159, 79,
-232,135, 30,227,120, 70,152, 39, 84,149,197, 28, 2,190,126,251,150,138,201, 69,140, 41,215, 7,122,173, 12, 5,103, 88,231, 21,
-207, 88, 58,116,222,105,202,149, 91, 32,128,219, 57, 4, 23,115, 35,241,204,132, 81,242,147, 55,114,186,197,199,158, 64,214,147,
-117, 62,141,146,201,190, 77,122,187,230, 45,136, 43, 43,220, 75, 80,153,173,253, 46,110, 39,102, 23,144,165,111, 79, 61,124,105,
-183,126,105, 67, 20, 23,157,228, 82,226,228,205,170,224,165, 78, 93,101, 82, 73, 70,174,135, 84,230, 95, 90, 66,114,174,122, 87,
-181,168,235, 22, 90, 43, 88, 9,212,181,196,135,227, 55,136, 34, 33,228, 4, 31, 35, 62,249,248, 99, 2,155, 48, 95, 92,106,194,
- 77, 43, 41, 8, 1,106,200, 71, 30,137,170, 84,118,235,206, 57,164, 68,156,243,211,233, 8,163, 53, 94,189,126, 77, 74,119, 14,
- 92,202, 16, 56,157,122,138, 32,173, 27,188,123,247, 14, 82, 73,132,156, 48,205, 19,237,240,173,193,235,215,175,113, 58,158, 48,
-143, 35, 89, 89, 61, 29,238, 70,107,200, 44,248,146,110, 49,249, 0,109, 45,171,175, 35,164,210, 72, 16, 24,231, 0,173, 13,172,
- 51,180, 66, 66,226,120, 84, 82,244, 75, 37,169, 9,136, 28,126,196, 48,163, 37, 10, 53,196, 64,249, 13,137,166, 18, 11,126, 57,
-120, 95, 46, 26, 37, 37, 32,152, 24,198,207,164,146, 52,229,164,203,131,170,202,182,110, 41, 83, 79,107, 40, 69, 14, 0,235, 28,
-142,167, 39,156,142, 39,120,159,208,182, 7,140,227,196,175, 39, 22,212,234,216,143,112,117, 5, 8, 74, 47, 75, 33, 65,107, 10,
- 62, 57,157,142,196,231,103, 29,131, 53,142,203,108, 42, 48, 62,124,248,192, 35,240, 10, 33,122, 88, 77, 58,128,243,208, 99,191,
- 35,161,221,225,176, 71, 63,246, 68,242, 11, 1, 82, 72,210, 93, 64,160, 31, 39, 18, 93, 66,146, 11, 64, 17, 83,192, 88, 3, 63,
-123,154, 30, 70,234,108,181, 38,176,142, 49,134, 72,131, 66,194, 57,110, 70, 36, 96,172,129,181,150,138, 47, 69, 10,243,166,169,
-139,184,111,156, 38, 88, 75, 78, 13, 74,215, 4, 35,131, 3, 54,149, 18,250,126,224, 96, 24, 96,230, 32,160, 24, 72,107, 37, 0,
- 88,103,121,237,176, 96,142, 29,233, 18,120, 66, 51,142, 35,140,214, 4, 13, 51, 26, 57, 83,160, 14, 5,243, 8,132,121, 70,211,
-212, 48, 70, 97,154,102, 42, 98,165, 90, 87, 89, 41,153,102,238, 37, 0, 0, 32, 0, 73, 68, 65, 84, 95, 76,236,148,184, 94,255,
-221,248,252,111,180, 71,171,165,237,198,165,142, 77,224,133,192,122,112,109,213,239, 55,243,211,115,162,212, 52, 92,138,115,150,
-195, 80, 94, 76,252,150,236,221, 92,130, 85,202,152,117,147, 53,189, 4, 78, 52,182,198, 15, 62,254, 12,191,252,163, 95,224, 23,
- 63,253, 35,124,242,250, 13, 42,235, 8,127,153, 88,160,199, 23,111, 6,169, 93,251,113,192, 52, 79, 8, 97,198, 56, 13, 8,193,
- 35, 69,242,132,166, 20,145, 98, 64,138, 51, 82,156, 65,174,108, 26,181, 39,222,179,231,148,232, 34,203,137,232, 70, 41,174,177,
-161, 87,107, 3, 33, 81,170,121, 99, 20,172,225,177, 82,217,255,175,194, 34, 81, 14,110, 66,216,202, 76,198, 47, 37, 18,172, 74,
-216, 55, 22,149,150, 48, 34,225,110,215,224,123,111,238,240,230,174,195,221,190,194,126, 87,161,118, 26,198, 41,132,156,241,175,
- 95, 61,226,255,252,235, 95,227, 55,255,252, 53, 30, 39,160,207, 10,210, 85,132,177,205, 43,242, 71,243,104,223,106, 77,170,223,
-141,139, 32, 11, 1, 99, 40,192,166,170, 27,212,214, 81,122, 84,138,180,143,228,253, 14, 93,234,116, 48,164, 28, 23,198, 45,114,
- 38,155,204,235, 87,247, 52,117,224,253,163, 98,129, 9,169, 84, 71,140,243,136, 20, 2,172,113, 56,245, 39,124,243,246,109, 17,
-203, 20,154,211,102,188,187,144,235,150, 74, 54,231,101, 37, 64, 10, 84, 41,214,220,109, 89, 68, 82,184, 45,160,219, 92,231,171,
- 80,103,163,184,220,254, 44,151,130,116, 41,110, 46,244, 35,203, 90,233, 50,218,245,242, 67,119, 91, 52,250,236,178, 92, 62, 12,
- 92,180, 92,115,230,165,146, 37,133,240, 90, 59,240, 93,151,250,197, 90,107,195,170,190, 24,217,111,224, 51,223,117,169, 83,199,
- 17,232, 57,206, 2, 58,211,126, 49, 34,225,174,235,112,111, 43,252,251, 95,254, 27, 84, 74,115,215,157, 48, 12, 71,204,243,128,
-170,169,224, 99,194,253,171,123,204,179,199,241,216, 99, 24, 73, 92, 21, 66,192, 56,244,168, 27, 26,209,122, 86,108, 15,227,132,
-166,109,203,243,208,117, 59,166,193,101,214,105,104,236, 15,123,204,243, 76,194,166, 24,203,133, 68, 86,181, 53,147, 33,229,132,
-126, 24, 0, 33,240,217, 15, 62,199, 55,111,223, 34,250,176, 34, 58,178, 64,240, 1, 74, 40, 72,144,197,115,154, 70,100, 65,145,
-163,222,207, 80,138,184,235,243, 60,195,105, 13,163,137,132, 38, 4, 17, 40,101, 42,122, 76,130, 86, 17,143,132, 70,223,124, 17,
- 44, 59,210, 20, 41, 45, 78,114, 22,250, 60,205,100,135,243, 36,214,162, 11,129, 1, 84, 75, 44,174, 0,170,138, 70,255, 93,219,
-162,107, 59,248,121, 70, 78, 9,218,104, 76,158, 18,224,250,115,207,214, 47,130, 2, 5, 31, 33,165, 65,240,158, 98, 94,121, 48,
-213, 53, 45, 32, 36,123,219,201,210, 21,124,132,181, 14,206, 58,164,156, 48, 77, 3, 95,148,170,104, 77,104,159,111,152,188, 57,
-193,123, 74,121,107,155, 26,117,221,224, 60,156, 97,180, 36,251,159,146,232,135,190, 88,163,167,113, 66,206,153,196,127, 2, 24,
- 39, 15,163, 12,230,113, 70, 76, 25,138, 53, 67,100,197,139, 80,154,216,243,206, 57, 12,195,128,170,114, 48,218, 16,183,126, 34,
- 28,109,215, 53, 24,198,158, 69,133,117,177, 84, 75, 1,216,202,194, 24, 74,248, 35, 93,130, 40,164,206,170,174,144,114,100,158,
-124,128,214, 22,214, 88, 42,112,149, 42,214, 51, 41, 36,172,113,208,154,210,220,192,145,211,198, 40, 72, 65,194, 96,231, 44, 82,
-142,104,234, 10, 34,211, 4, 24, 34,241,235,149, 80, 34,227,227,143, 62,194,227,195, 3, 23,116, 52, 25,167,116, 62, 79, 83,168,
- 16,200, 90, 12,172,161, 46, 12,202, 90, 86,123,215,169,148,184,113,185,231,252, 66,167, 94, 50,202,153,162,115, 41, 58,202,207,
- 98,223,196,114, 97,179, 24, 73,222,234, 36,216, 7, 44, 25, 31, 42,229,149, 63,118, 73,123, 19, 91, 21,179,132, 85, 22,175, 15,
-175,240,179,159,252, 17,254,236,231,127,140,239,125,252, 9,154,186, 38,127,120, 92,138, 8, 86,228, 34,113, 36, 30,199, 16,122,
- 95, 20,162, 62,204, 60,218, 10,165, 90, 77, 57,176,178,157, 46,123, 41, 87,104,200, 98,187,202, 49,240,202, 56, 94,250,153,197,
- 86,180, 64,151,166,211, 18,181,211,104,106,139,218, 82,181,182,128, 46,144,214,160, 25,177,120,247, 83, 4,162,135, 72, 51, 68,
-158, 97,100, 66,165, 4, 58,167,208, 85, 6,173,213,184,223,183, 56,180, 21, 26, 43, 97, 21, 96, 52, 96, 45,145,154,126,251,187,
-175,241, 87,127,251,143,248,199,223,190,195,209, 11,156,163,192,144, 0, 97, 28,192,163,255,197,162, 69,175, 79,195,240, 4,129,
-170,126,242,211, 10, 73,187, 43, 41, 20,156, 54,168,108,133,218, 57, 56,107, 75,144, 77,185,208,185,216,201, 11,229, 11, 11,190,
-179,194,221,126,199,171, 12,222,177,115,230,243, 52, 78, 28,211, 8, 62,180, 12, 98, 18,120, 60,158, 16, 83, 42, 32,158,156,183,
-225, 8,171, 96,102,221,169,231, 11,191,184,146, 43, 9, 78, 92,196,166,109, 84, 33, 98, 99,239, 90,190,150, 88,119,236, 98, 27,
-129,138, 69,133,187,238,226,159, 67, 92,196,165,106,247, 5,229,250,181, 80,238, 26,162,179,122, 84, 95, 70,192,230,148,191,179,
- 43,127,137, 78,119, 97, 45,223,190, 31,120,174,224, 23, 27, 97,221, 75, 95, 39,136,132, 44, 51, 77,196,104,159,131,136,136,218,
- 8,252,244,254, 30,255,227,159,253, 57,190,223, 29,112,124,120,192,169,239,225, 99,132,113, 21,154,170, 65, 8, 36, 34,218,237,
- 15,120,247,254, 29, 66,164, 24, 81,178,114,241, 37,100,116, 97,170, 91,206,232,150, 74, 21, 75,163, 82,138, 82,203,188,199,126,
-191, 71,211, 52,120,122,120, 98,194, 93, 46, 89,222, 82,146,186, 61, 70, 18,223,197,148, 10, 54,212, 58,135,243,249, 76, 96,156,
-243, 68,132,175, 68,187,204, 5,102,147, 98, 98,209, 93,128,214,130,161, 80,137, 70,239, 74, 33,199, 64, 80,114,126,254,149,208,
- 52,210,135,162, 11, 20, 18,209,199,197, 55,132,201,123,132,156, 49,251, 72,191, 38,207,132, 60, 81, 46,248, 20,252,102,165, 5,
-104,197,197,190,146,112,206,114,220,169,197,221,221, 61, 2,199,215,182,109,199,254,106,186, 4,230, 48,163,174,106,204,126,198,
- 48, 12, 24,250, 1,221,142, 56,237, 86, 87,200, 2,152,231,177,156, 73,203,222,190,170, 42,230, 51,144, 18, 30, 28,244,210,118,
- 29,142,199, 35, 97,120, 99,164,196, 74,109, 32,132,196,233,116,162,196,182,121, 46,103,105,219,237,160, 36,169,212, 37, 4,170,
-202, 81,236, 44, 4,190,249,230, 1,221,174, 35, 44,111, 2, 98, 10,232,118, 59,244, 3, 17,240,172, 49,208,134,172, 94,218, 18,
-156,135,186,106, 13, 41,129, 16,102, 10,195, 9, 84,192, 33,229,226, 63,143, 41,163,114, 53, 30,159,142, 52,166,103,250, 28, 88,
- 21, 63, 14, 19,164,210,168, 42,218,157, 43, 6,249,196, 24,240,250,205,171, 18,155, 61,242,107, 81, 82,160,237, 26,210,106,144,
-172,155,220, 24, 82,160,109, 42, 42,162,180, 68,244, 1,134,159, 73,107, 52,194, 60, 51,236,135, 18,236,252, 76, 34, 67,107, 8,
-221, 61,244,103,236,239, 14,155, 88,112,202, 78, 48,198, 34,199, 4,163,245,115,134,139, 72, 37, 7,228,230, 25,176,101,121,136,
- 21,231,174, 42,227,254, 98,187,239, 43, 6,246,197,123,190,116, 9,114,181,189,221,244,218,178,135, 88,224,217,222,158, 15,141,
- 92,132, 97, 23,157, 4, 46,199,238, 69, 44,151, 5,218,170,198,231,159,126, 31,127,242,243, 95,224,167, 63,248, 49,246,109,199,
-246, 18, 9,177, 80,222,144,139, 98,145, 82,174,232,131,185, 28,160,211, 52, 97,152,122,206, 45,143,108,151,136, 40, 55, 45,177,
-251,128, 28,168,139, 6,101,133,167,232,153, 44, 23, 47, 48,162,203, 43, 85,155,232, 86, 35, 65,177,167, 78, 98,215, 90, 52,149,
- 66, 91,105, 34,192, 41, 85,108,104, 57, 38, 40, 86,158, 86,214,160,170, 20, 42, 3, 88,153, 96,101,228, 44,244,140, 74,101, 84,
-154,242,208,187,218,162,177, 10, 93,173,208,213, 6,206, 26,248, 24,241,197,111,127,143, 95,255,221, 23,248,237,219, 51,198,168,
- 48, 37,131,115,200, 24, 83,130,174, 26, 72, 30,177, 19,252, 1, 48, 82,192, 25, 77, 25,241,130,222, 99, 37, 22,157,131,228, 41,
-131, 34,205, 2,231,179, 59,107, 97, 57,191, 56,196, 8, 31, 72,233, 25, 83,216,164,227,145, 16,172,170, 44,249, 50,231,153, 63,
-140,100, 55, 10, 62,176,138, 54, 18,167, 94, 72, 40,101, 32,164,198,241,120,194,236,195,198,234,184,241,144,231, 85,123, 64, 72,
-221,116, 9,109,184, 88,239,136,139,240, 18,228, 75,171,227,245,127,134,192, 5,185, 80, 44,251,236,139, 16,133,124, 85, 0,200,
-239, 28,129, 95, 99,100,113, 69,194,123,214, 5,111,226, 78,183, 23,238, 75, 64,153, 91,150,180,151,104,116, 36,237,200,101,234,
- 32, 55,159,231,139, 67, 97,241,173,191,240,119, 44,107,137, 40,104,244,170, 22, 2, 34, 34, 42, 5,252,226,205,107,252, 47,255,
-238, 87,248, 65,211,161,127,124,143,132,140,119,231, 30,193, 86, 72,182,198, 52,147, 2,186,109, 91,134, 59, 69,234, 68,145, 56,
-116,131, 14, 85,173, 40,162,216,199,128,170,174, 96,172, 37, 75,169,247,228, 17,151,178,116,183, 77, 91,227,124,238, 73, 15, 3,
-178,107, 45,233,127,103, 30,191,123, 63, 67, 51, 75, 62,248,136,113,156, 81, 85, 36,252, 18, 66,178, 34,123,101, 33,208,103,157,
-108, 74, 11, 21, 47, 33, 35, 36, 74,118, 91, 96, 68, 49, 82, 58, 35, 32,225, 35,101,136,103, 8,234,148,133,128,143, 25,211, 28,
-248,151,135, 79, 9,222,167,146, 60, 70,133,180,162,169,128,148, 64, 78, 48,122,229,129, 40, 41,160, 52, 37,175,165, 20,209,214,
- 21, 2,139,183, 40,188,136,248,231, 77,221, 64,105, 77,161, 47, 70,109,194, 83, 80, 10, 33,193, 9,106,222, 71,180, 93,139,105,
- 28,232,236, 82, 36,240,154,103,234,138,173, 35, 97,162, 99,232, 76, 74, 96, 13,131, 47, 35,237,229,189, 42,206, 39, 0,146,153,
- 25, 66,208,251,125,216,239,232,156, 96, 88, 78,140, 9, 93,183,131,210, 10,111,223, 61, 82,148,171,159,161,141,130,210,138,173,
-119, 61,139,197, 18,180, 81, 48, 86, 65, 25, 18,188, 9,145, 97,157,197, 60,211,206, 95, 41,192, 57,202, 77, 31,134, 17,135, 3,
-113,236,233, 89, 38, 32,142,171,106, 60, 60, 30,225,170,138,237,133, 30,195, 48,195,251, 0,205,208, 36,201, 13,141,117, 22, 90,
- 41,104,165,105, 13,146,200,187, 30, 35,121,203, 23,242,179, 53, 26, 82, 72,244,253,153,166, 12, 28, 7,188,116,213,203, 88,127,
-158,105,204, 79, 60,124,129, 48,123, 46,238, 73,171,112,238,123,156, 78,103,244,195,128,113,156,224,125,128, 53, 22, 85, 69,174,
-132, 24,226,198,198,154,110,126,182, 47,197,194,130, 19, 17,101, 65,212, 2, 2,250, 91,128,145, 23,130,165, 91, 4,171,109, 56,
-196,198, 15,179, 42,231,243,213, 82,239,154, 76,119,145,188, 37, 10, 46, 80, 73,129,125,183,199, 79,127,244, 19,252,232,179, 31,
-224,213,254, 64,172, 93,193,204,224,180, 96, 88, 57,229, 89,172,137, 88,145,185,228, 18,128, 85, 64, 99, 5, 78,125,192, 20, 82,
- 73,220, 41, 66, 42,126,152,114,138, 64, 74,136, 50, 67, 40, 64,164, 72, 40,218,204, 40,209,156, 11, 63, 59, 47,227,222, 13,173,
- 75,137,140,202, 72,116,149,198,174, 54,168,173,130,210, 25, 49, 0,201, 10, 52, 86,163,210, 2,143,199, 1, 33, 36, 32, 73,216,
- 74,161,118, 10,141,171, 80,201, 12,153, 35, 12, 50, 42, 37,208, 90,137,187,182,194,199,119, 29, 94,223,181,184,223, 85,184,223,
- 89,212,149,134,143, 30, 95,125,245, 30,255,242,187,175,113, 26, 2,178,208,200, 34, 33, 35,174, 97, 55,108,138,166, 14,156, 18,
-213, 12,143,221,151,159,167,224,184, 81,177,233,209, 68, 78,229,151, 4, 95,238, 85, 3, 35, 21, 43, 51, 19, 30, 78, 39,200,172,
- 72, 24,152,137,189, 45,153,212, 21,145, 17, 83,132, 49, 10,198, 88,246,197,178, 42,213,104,132,232,161,132, 70,244, 9,202, 1,
- 90, 91, 8, 49, 21,165,248,122, 81,173, 19,134,133, 75,183,144,230, 98, 94,215, 53,183,147, 78, 55,217,230, 91,115,248, 69, 75,
- 44, 46, 82,151,202, 88,158,253,177, 82,138, 77, 78,208, 18, 78,147, 54, 94,218,141,255,253,194,222, 22, 81, 68, 1, 57,111,146,
- 9,111, 23, 1,215,175,225,219, 66, 91,174,119,229,215,151,250, 5, 70, 50, 95,126,203,151, 41,137,151,159, 93, 37,100,201, 39,
-184,197,143,223,154,236,151,194, 71,138, 4,131,136, 63,253,228, 83,252,175,255,225, 63,162,139, 1, 15, 95,253, 43,101, 6, 76,
- 61,238,118, 13, 30,143, 3,166, 12,178,148,165,136, 70, 41,192, 39,228,192, 23, 49, 40, 36, 5, 0,195, 70,248,245,104, 67, 78,
- 13,165, 16,153, 21,190,213,235, 88,107, 32,165, 46,186, 10,163, 13,175,104,168, 96, 23, 32, 14,253,233,116, 66, 85,215, 56,157,
- 6,228,148,217, 14, 23,208,184, 10,231,225, 76, 90,146,197,123, 28, 98, 33,123,137,148, 32,211, 42, 16, 94,172, 71,144, 9, 66,
-248,205, 27,235,145, 69,102,253, 13,219,174, 22,158,195, 38,119, 64, 75, 10, 97, 90, 70,144,153,125,207, 82,242,122,128, 32,240,
- 28,224, 34, 56, 40, 74, 97,191,223,195,191,251, 6, 66,146,162,125, 24,103, 72,173,161,165,130,201,192, 20,136,159, 33, 20, 89,
-253,132,148, 56,159, 7,212,117, 3,248, 92,166, 32, 66,144,181,234,233,241,145,114,219, 53,237,156,253,236,105,109,160, 37, 62,
-114,175, 49,142, 19,178, 33,113,111,219,182,248,240,248, 1,119,119, 7,218,135,123, 15,169, 20, 71,149,102, 88,171, 49,140, 39,
-254,220,107, 30,223, 83, 1,100,180,195,152, 6,132, 57, 32,134,128,174,235,240,250,213, 43,252,254,203,183, 37,223,125,158, 39,
- 10,255,217,237,209,182, 13,158, 30,159,160, 37,224, 67,130,240,130, 93, 4,160,203,127,177, 33,242,211,172, 25,177,235,231,128,
-119, 31,222,227,205, 71, 31,227,233,120,198, 48, 78,168,234,154,198,207,218,224,241,233,136,182,109, 81, 53, 53,194,113,192, 56,
-142,152,231,145, 51,237, 37,180, 84, 56, 31,123, 56,103,225,156,130,148, 30, 66,212, 92, 36, 80, 32,145,176, 18, 41, 8,206, 32,
-176,216,237,118, 23,250, 23, 41, 5,180,100, 78,130,146,200, 12, 96,138,222,163,114,142, 68,112, 49, 98,158, 35,134,225, 17, 93,
-183,199,253,171, 26,253,208, 83, 81, 58, 5,140,195,128,200,223,111,211,212, 56,247,253,115,122,228,245, 25,144,210, 5,125,110,
-253,236,211, 51,164, 47, 69, 66,223, 29,158,113,203, 39, 43,176, 13,135, 95, 85,180,219,242, 66,176,183,245,166,159,118, 57,172,
-181,130, 86, 2,175,186, 3,254,228,231,191,196,231,159,126,142, 93,219,193,176,175, 93,240, 1,180,101,114, 47,202, 66, 26, 67,
- 8, 68, 14,130, 22, 57, 66, 33, 81, 71,108, 52, 70, 63, 16, 20, 38,173,129, 50, 37,112,132,199,225, 49, 9, 86, 47,242, 5,195,
-225, 48, 5,227, 90, 18,232, 36,123,204,233,114,119, 74,160,182, 10,109,165,176,171, 36, 42, 39,161,116, 70,142, 64, 8, 9,201,
- 10,180, 85, 5,171, 50,222, 63, 14,240, 49,192, 79, 9, 86, 42, 72, 35, 81, 87, 6,181,117,232,156,193,161,177, 56,212, 6,251,
-218,225,213,190,194,174, 49,216, 53, 10,149, 17,240,126,192,215,111,223,225,237,135, 19,124, 18,200,210, 64,200, 0, 32, 32,243,
- 88, 92, 20, 40,208,178,115,150,144,138,108,108, 86, 74,192,251, 50,134,206,172,204,102, 51, 30, 95,161,145, 62, 24, 89, 0, 49,
-195, 74, 9,229,170,114,153,133,144,241,212,247,240, 8, 16, 82, 32,100, 2,206, 10,238,150,230, 48, 99,246, 51,237, 10,185, 67,
-239,186, 22,109,219, 2,239, 31,168,107,225, 73,129, 49,134, 27,128,180,177,129, 45, 34,194,205,184,157,127,101, 42, 37, 46,172,
-111, 23, 10, 80,126,214,100,222,122,171,243,198,109, 32, 94,224,159,111, 34,119,196,102, 95,158,243,179, 17,249,154,230,134,203,
-206, 94,172,147,163,101,164,159,211, 37,115, 65,220, 28, 97,137,139,164,190,111, 75,103,187, 21, 10,243,109,137,110,183,138,158,
-188,121,109, 34,103,222,151, 46,141,216, 37,162,119,123,177,203,144,161, 4, 32,178, 71, 37, 19,254,252, 71, 63,194,255,252,239,
-126, 5,219,247,144, 90,224, 52,246, 8,198, 33,142, 19,238,170, 26, 95,197, 17, 73, 4, 76,115, 68, 72, 1,206,237, 17,252, 4,
- 85, 50,251, 18,130,159, 73, 68,150, 18,180,181,152,198,137, 2,131, 64,227, 97,231, 28,140,214,176,218,176, 7,157,126,191,203,
-153,198,236, 50, 21, 15,175, 82, 10,167,211, 19,250,126,134,144, 10, 83,240, 16,179,225,145,164,130,204, 1,136,192,216,143, 8,
- 49,210,254, 52,147,218, 24,156, 89,176, 56, 44, 40,161, 79, 81,131,176, 76, 3, 35, 25, 33, 22,241,108,193,156,242, 5,174,181,
- 44,217, 21, 34,139,213,201, 83, 50, 18,152,124, 73,240, 60,100,100, 24, 43, 0, 78, 89, 76,153,158, 55,178, 72,129, 82, 36,119,
- 59, 76,222,147, 64,143,215,129,139,246, 99,246, 51, 4, 95, 38, 49, 70,178,151, 57, 10,138,209, 90, 35,129,198,226, 85,101,209,
-117, 7,124,120,120,143, 73, 1, 2,134,246,232,129,190,143, 97, 24,113, 30, 6, 30,255, 46, 93, 60,217, 4, 79,167, 19,246,251,
- 29,148, 82,232,251,158,130,121, 98,128, 53, 10,206, 25,248, 8, 60, 61,145,187, 32,166,136,167,227, 19,246,251,123, 60,126,248,
- 64,144, 27, 87,211,202, 36, 38,188,126,117,192,195,195, 17,206, 89,204, 60, 61,161, 72, 85, 98, 17,244,253, 25, 18, 10,105,138,
-168, 42, 98,118,132, 16, 33, 53, 96,180,165, 29,116, 76,232, 79, 3,190,247,233,247, 32,133,194,239,191,252, 26,143,199, 39,212,
- 77,135,119, 15,143,240, 49, 99,156, 61, 62,250,232, 53,222,191,251,134,246,242, 74,162,221, 19,235, 32,166,136, 97, 26,161,189,
-132, 49,182, 8,232, 14,135, 61,140, 85,200, 32, 49,164, 16, 26, 22,132,210,141, 42, 33,106, 69, 69,129, 39, 0, 14, 17,247, 72,
-199, 49, 13, 35, 50, 50,234,154,118,235,129, 73,164,117, 93,175, 86, 80,161, 16, 82,198,215,111,223,195,186,138,255,206, 3,114,
-204, 72, 49, 97, 24,134,130,193, 93,232,123,101,253,200,122, 44, 5,113, 1,124,219,250,100,179,192, 38,152, 10, 80, 78,219,191,
- 88,119,153, 43, 0, 70, 10,249, 12, 47,121,185, 71, 23,171, 95,184,116,191,171,101,235, 86,247, 36,228, 21,214,179, 88,189, 8,
-177, 35,132,192,155,195, 61,254,236,151,255, 13,126,248,253,207,113,215,238,160, 32, 87,248, 13, 50,139, 76,152,106,198,130,131,
-229,146, 79,105,217, 2, 80, 50, 88, 94,108,104, 66, 96,152, 38,248, 64, 42, 83,170,174, 35,217,216,114,164,196,178, 68,185,199,
-106, 81,231,167,124,161,168, 22,200,252,250, 41,200, 65,243, 88,211,106,137,202, 42,212, 78,163,171, 21,218, 90,163,113, 18,214,
- 8, 24, 3, 40,145, 96,148, 64,237, 44,186,182, 3, 24, 95, 25,124,128, 72, 25, 34, 5,168,156,224,100,134, 85, 25,157, 83,216,
-213, 6,109,173,113,232,232,223,206, 0,209,247,120,120,120,135,135,227, 17, 99,200, 24,163,192,148,128,113, 14, 24,167,128, 97,
-246,232,125,192, 20, 34,164,182,208,218, 66, 73,139,140, 4,107,137,131,109,149,100,232,199,130,165, 85,188, 75,150, 43,159,124,
-227,247,150, 0, 52,255,124,148, 50,128, 80, 72, 89, 98, 14,137, 70,241,229,103, 78,226,151,186,114, 24,250,158, 98, 96,171, 26,
-167,211, 9, 74, 81,120, 71, 85, 85,136, 57, 97,158,103, 24,107,161,180, 70, 72, 1,167,254, 92, 18,206, 22,178, 84,161,185,229,
-109,160, 74,226, 17,147,220,216,178,158,143,167,228, 85,167, 42,110,178,204,197, 11,157, 51,127, 96,214,228,160,242,193, 18,133,
- 82, 39,111,118,234,107, 81,176, 78, 6,174,247,212,215, 59,117,177,161,233, 93, 59,232,111,121,212,191, 13, 62,179, 29,187, 63,
- 31,217, 95, 22, 66,139,110, 69,222,232, 6,110,193,159,150,113,160, 18, 17, 78, 36,252,199,159,253, 12,255,211,159,253, 91, 52,
-243,140,225,233, 9, 67, 10, 56, 78, 35,178,116,232,170, 6,253,135,247,216,181, 14, 82,120,104, 36,136, 20,208,180, 21,166,105,
- 64, 10, 36, 12, 2, 50, 38,239, 11,115, 66, 27,135,224,125,121,143,140,177, 69, 48,164,249,247, 75, 1, 22, 25,129, 18,221, 50,
- 48,207, 19,229, 46,112, 48, 74, 63, 76,176,174,194, 48,142,144, 66, 99,154, 60,140,182, 8,115,228,181, 30,160,132,132, 51,154,
-138, 26,182,148,146, 47, 92, 66, 75,205,174,144, 12,149, 19,172, 18,176,138, 86,105, 36, 48,205, 48,138, 45,168, 66,194, 41, 5,
- 39, 37,233, 85,216, 37,160, 1, 24, 1,104, 78, 31, 67,206, 48, 70, 17, 93, 46, 39,238,202,233,255,231,156,225,196,183,181,252,
-146, 74,161, 97,238,125, 63,210,164,193,115,150, 58,161, 82,103, 26, 27, 75,137, 48, 17, 88,138,210,204,168, 11,175,154, 10, 85,
-101,225,163, 71, 78,212, 1,142,227,136, 28,105,180, 28, 66, 64,219,118,196,169,183, 26, 16, 20,254, 2, 36, 22,149,101, 4, 22,
-138,145, 82,158,137,114,214, 81,227, 32, 73,188, 26, 67,198, 48,206, 28,175, 75,107,185,221,254,128,211,241, 9, 82,100,178,110,
- 41, 1, 99, 53, 98,206, 56, 30,143,168,170, 6,125, 63,208,232, 91,107, 76, 19, 9,237,250,126, 68, 74, 64, 8, 20,121,186,248,
-251,115, 2, 1,108,250,129, 98, 84,103,143,121,246,248,222,167, 31,227,233,244,132, 24, 19,246,135, 3, 38,239, 49,249,153,201,
-160, 1,119,135, 29,134,177, 71,213, 16,188,167, 90,192, 59,146,124,244,203,202,141,146,212, 60,172, 83, 56, 28,118, 20,136, 51,
-145, 62, 33,179,254, 71,107, 77, 28,247, 68,225, 95,195, 48,194, 90, 83, 20,246, 11, 46,153, 72,136,178,252, 29,146, 9,137,153,
-237,220, 0, 21, 7,231,115, 79, 17,190, 49,113, 2,157,227,175, 1,104, 99,138,142,105,205,222,144,151,107,196,101,213,178,209,
- 26, 73,182,210, 1, 88,136,114,105,173, 50, 55, 7,134, 90, 14, 56, 33, 55, 81,147,156,188,182,228,192,114,133, 73,191,214, 42,
-245,154,243, 94,208,155,114, 81,237,109, 59, 95, 58, 63, 95, 29,238,241,167,191,252, 19,252,224,211,207,209, 86,148,203,124, 1,
-250, 40,136, 82,218,117,151,157,247, 34,106, 75,139,199, 55,208,142,125, 19,170,225,189,135,159, 71,218,109,179,119,146,130,102,
- 56, 70, 52, 5, 72,228,226,169, 22,136,107, 22,119,185,232,200, 26,166, 4,249,178,173, 18,112, 70,160,118, 26,109,165,202, 46,
-189,182, 10,206,106,152, 37, 62, 85,102, 88, 35,209, 53, 14,119,135, 14, 90,100,204,195, 25,113,246,168,180,130, 85, 2, 90, 2,
- 86, 75,212, 86,160,113, 10,109,101,176,171, 13,156,165,108,230,243,233,140,211,121,196,232,129, 49, 8,140, 62, 97,242, 9,227,
- 20, 49, 76, 1,253, 28, 49,250, 4,159, 37,180,117, 48,214,177,208, 40,194,106,141,125, 83, 67,231,140, 48, 17,253,106, 75,233,
- 19, 25, 5,121,187,116,248, 74, 8,202,159,151,228, 5,151,203,222, 55,211, 72,114,152, 71,132, 24, 72,245, 47, 4,186,166,129,
-179, 6,231,227,145,195, 21,106,250, 64, 24, 69,138,120,107,136,186,228, 3,180,209,208, 70, 34,137,140,199,167, 35,179,211, 11,
-148,152, 45,141,145,125,230,155,139, 16,204, 44,207,155,188,128,109,130, 31, 4, 54,203,117,138,105, 23,155,238,116,137,241,221,
-120,211, 23,208, 76,206,236, 80, 40, 59,173,124,179,219,189,178,119,111, 46,194, 53,135,156,222, 95,254, 32, 47, 95,115, 83, 28,
-172, 34,190,245,245,138, 43,228,227,173,208,154, 91, 23,249, 22, 37, 43,113,201,190,191, 16,157, 94,152,249, 86, 53,124,230, 68,
-170, 92, 80, 18,139, 22, 96, 93, 61,252,127,148,189,105,143,109,219,117,158,247,204,110,181,123,239,170, 58,205,109, 72,145,186,
-164, 72,137, 38, 37, 33,254, 18,219,177, 12, 73, 22, 12,197, 65,128, 32, 65,146, 79, 49, 16, 32,200,255,240,175,115, 62, 57, 8,
- 98, 39,176,101, 73,142, 76,138,188,247,116, 85,181,187,213,204, 46, 31,198, 92,107,239, 58,205,189, 50,137,131,115,238,105,170,
-219,181,230,152, 99,140,247,125,222,172, 51, 48, 83,165,153,255,242,119,127,194,159,252,252,247,105,199, 17,237, 61,129,204,155,
-253,129, 33,102,218,190,231,225,221,189,116,145, 70,241,248,248, 64,211, 72,110,247,233,124, 46, 59, 67, 35,126, 98,165,201, 74,
-139,213,171,252, 48,218, 72, 28,106, 93, 83,215,245, 37,142, 82, 35, 30,240,217, 99,157, 93,115, 39,150,248,213,227,225, 32, 20,
- 59, 43,204,249,251,135, 71,198, 81, 24,241, 49,102,180, 50,226, 44, 40,157,155,117, 26, 83,116, 48, 26, 73,226, 90,190,243,108,
-129,206,168,156,138, 13, 84, 83, 59,141, 53, 98,233,211, 69, 79, 35, 86, 84,112, 70, 99,138, 95,223, 26, 65,106, 47,138,245,133,
-125,224, 42,209, 20,132, 24, 10,155, 66,179,217,110,200, 57,115,115,119, 87, 24, 28,107, 71, 34,222,124,231,240,193, 83, 57,193,
-144, 90,103,153,166, 9, 99,197,242, 21,188,103,211,245,140,227,185,228,111, 11, 45,210,207,158,219,219,173, 60, 55, 49, 22,175,
-125, 36, 45,217,230, 37,172,164, 45, 84, 56,165, 33,196, 80,152,245,208,212, 13,195, 48,174,121,241, 49,202,107,176,219,108,201,
- 36,198,113,164,105, 59,225,216,151,245, 90,140,242,186,182,109,195,110,187, 99, 60,159,136,193,211,246, 45,214, 89,124,144,241,
-253,227,227, 30, 87,213,196,132,196,202,246, 61,243, 56,173,207,204,188,104, 36,148,188,222, 90,233, 53,165,239,116, 58,163,140,
- 5,165, 56,156,142, 24,171,121,254,252, 5, 15,143, 7,172,115,116,125,203,227,254, 88,120,243, 30, 31, 2,125,223,113, 60,158,
-176,136,102,168,107,154, 75,189, 41, 26, 34, 93,244, 5, 49,200,228,177,237, 90,114,138,156,143,103, 89,227,106,153,194,104,163,
-112, 86,132,139,199,211, 64,140,137,182,233, 8, 81,166, 26,231, 97, 44,196,191, 74,198,245,174, 90, 45,141,179, 23, 97,100, 12,
- 34, 56, 52,250, 2,251, 25, 70, 89, 49, 69, 31, 8, 33, 17,188, 48,226,175, 9,154, 57, 21, 0, 88,121,222, 83,129, 90, 93, 84,
-242, 18,238,181,172, 95,237, 19,130,220,251, 99,117,165,100, 44,180,250,204, 63,164, 97,228,140,168, 97,211,123, 17,141, 31,116,
- 23, 23,106, 87,206, 98,234, 39, 94, 14,237,103,187,103,252,236,199, 63,225, 7, 95,126,159,174,106, 46, 7, 78, 33, 48,165,156,
-209,107, 81, 15, 23,117,122, 25, 53,171,226,119, 22,128,224, 18,115, 90,212,164, 42,211, 85,142,193,138, 16,103,217, 37,167,197,
-223,167, 46, 89,218,185, 20, 6, 93,210,143, 84, 25,209, 43,173, 74, 50,154, 8, 86,172,145,157,125,101, 21,181,147,194,237,140,
-198, 26,133,211,154, 74, 57,176,137,168, 0, 2, 74, 37,172,245,220,117, 13,207, 55, 47,121,177,177,124,253,205, 61, 42,103, 25,
-191,215,166,140,225, 43,218,170,162, 41, 74,212,121,158,137,209, 51,249, 76,200,142,152, 33, 17, 73, 73,210,133,134, 57, 50,197,
-196,156, 50,190,140, 14,215, 80, 84,157,139,175,213, 96, 53,132, 40,163,114,209, 53,202,229, 37,165,128,213,245, 21, 5,112,217,
- 99,199, 34,168, 91, 94,211, 76,107, 52,222, 89,206,117,205,182,235, 4,173,155,164, 35,105, 10,172, 35, 20,159,237,233,116,226,
- 71, 95,253, 54,183, 55, 91,130,159, 57,143, 35,231, 65, 58, 19, 87, 87, 84,181, 33,107, 9,246,240, 37,222,117, 77, 9,204,203,
- 14,251,210, 13,231, 84,246,238,165,123,126, 42,142,227,106,132,124,201, 14, 16,203,213,101, 4,175, 11, 49,110,161, 57, 93,190,
- 31,185,166,177, 92,105, 64,158, 2,147,101, 52,187,236,120,205,147, 81,245,117,135,158,159, 4, 19, 47,221,125, 94,173,116,151,
- 75, 0, 79, 58,180, 79,229,174,127, 27, 14,118,253,243,204,186,122, 89,158,215,247,179,221,223,223, 54,228,171,232,220, 44, 15,
- 26, 73,103,178,214,168,152,177,121,121,162, 2, 77,246,252,211, 63,248, 67,254,241,207,126,142,122,120,196, 40,197,155,253, 61,
-131,214, 76, 40,180,169,121,220, 63, 50, 17, 25,114,226,124, 56,241,252,249, 11,222, 28, 30,168,156, 19,104, 75,136, 76, 49,130,
-177,156,167, 9,227,156, 76,150,140,140, 28,131,247, 84,174,146,144,150,105,162,109,107,114, 2,239,103, 82,170,113,181, 16,208,
-172,202,108, 54, 66, 14,203, 57, 18, 99,194, 40,139,247, 17, 91,213,178, 99, 70,175,221,100, 52,162, 46,142, 42, 99,172,162,107,
- 42, 81, 49, 43,133, 31,207, 56, 35, 0, 16,101,220, 42,142,140, 36, 92,101,113, 78,184, 18, 49, 37,114, 10, 24,173,203,138, 79,
- 60,210,198, 80,252,196,226,192,145, 24, 88,199, 28, 35,196,136, 9,134,190,223,176,187,217,202,164,202,251,130,102,149,226,105,
-172, 92,118,141,157,201, 33,136,127,124,154,153, 39,177,225,110,182, 29, 62,122,234,186, 89, 59,103,177, 87, 5, 65,230, 22, 54,
- 7, 74,166, 25, 77, 91, 49,141, 35,211, 60,200,186, 68, 65,156,101, 58, 39, 1, 38,162, 12, 31, 75,225, 62, 30, 78,244,155, 30,
-109, 45, 41, 4, 81,232,151,221,185, 66, 52, 11, 98,229,149,230,167,235, 58,129,164, 24,131,181,154,186,113,156, 79, 35,227, 40,
-140,252, 20, 34,181,171,136, 69, 92,103,173, 37, 76,113, 37, 4,158,207,103,154,182,101,255, 56, 23, 77,147,136,249,250,190,231,
-120, 62,163, 53, 56,167,159,184,132, 98, 12,114, 9, 42,207,142,143,129, 87,175,222,240,139, 95,124,129,179,142,183,111,222,241,
-219, 95,253,144,174,173, 57,157, 7, 97,231,135,204,253,253,129,155,237,150,241,116, 66, 13,153,237,110, 67,215, 54, 84,181,229,
-120, 58, 49,143, 94, 38, 66, 90,190,119,200,154,253,227,190, 92, 42,243,234,198, 64, 65,215, 52,160,228,115,237,251, 6,239, 3,
- 15, 15, 15,236,110,101,226,161,141, 97, 24, 38,234,186,161,170, 26, 89, 41, 25, 35, 31,143,173, 75, 72, 16, 12, 49, 82,149,162,
- 45,105,135, 53,211, 48,174, 57,245,185, 88,128,157, 19,235,158,179,118, 77,200,188, 94,115,103,205,154, 47,177, 78,212,175,208,
- 90,223,178,205,187, 20,113, 93,186,244, 15,186,151, 18, 6,243, 93, 59,248, 39, 64,145,114,128, 44,251,211,109,191,229,199, 63,
-250, 17, 63,248,173,223,146,253, 89,190,236, 63,151, 49,251,226, 25,143,233, 35, 9, 97,235, 78, 61,149, 61,247,149, 80, 47,201,
- 39,221, 84, 21, 77, 85,203,104,237,186, 91, 90, 80,158,198,160, 48, 69, 12, 37,247,118,249,255,229,109, 25, 40,202,112,168,157,
-116,227,181, 51, 43,101,232, 66, 12, 75,232, 69, 36,163, 53,181,182,212, 90,211, 89, 69,163, 60,207,122,195,207,127,250, 5,255,
-224,239,255, 14,127,239,167, 95,240,253,207,123, 94,222,181,220,109,106,250,214, 21, 66,147, 34,134,192, 52,205,204,147,151, 56,
-192,133,112,166, 52, 33,101,102,159, 8, 49, 10,156,101, 97,144, 23,127,179, 50, 26,227,100,180,102,157, 89, 97, 8, 75,161, 94,
- 17,189,168, 69,110, 8, 73, 68,114, 38,231, 85, 5,111,173,112,163, 43, 39, 83,137,166, 22,235, 94, 95, 11,252, 70, 23, 18, 84,
- 85, 85,100, 50, 33, 74, 16,206,225,176,103, 26, 71,218,166,165,109, 26,230,113, 40,176, 13, 71, 83, 59, 54,125, 79,215,212, 88,
-205, 26,139,170,184,160, 93,213, 90,161,243,202,109,207,101,205,162,222, 27, 35,175,122,179,180,136, 31, 47,194, 47,115, 53,170,
- 90,210,222,242,199,138,226,199,188,159,239,141,205,175,115,205, 63,165, 66,121,106, 93,203, 79,152,238,215,121, 7, 79,178,215,
-191,229,109,253,157,246,229,233,162,180,191,126, 30,212, 39,214, 15, 31,227,186,235,114, 57, 47,155, 39,162, 2,159, 3, 58, 69,
- 54, 9,254,236,103,191,207,159,255,236, 15,232,207, 19,225, 60,112,156, 70,238,253, 76,172, 28,231, 24,240, 57,128, 81, 28,134,
- 19,119, 47,158, 97,172,140,108,141,210,236,186, 94, 52, 26, 5,215,234, 42, 87,166, 95,153,105, 30, 11,140, 41,175,130, 55,233,
-100, 22,104, 75,186,140, 25, 75, 81,106,219,174,136, 48, 19, 49, 65, 85, 75,192,200,188, 22, 58,181,230, 86, 27,163,203,249,177,
- 76,228,100, 34,208, 54, 13,206, 10,198, 88,169, 76, 93, 59,250,174,193, 26, 13, 57,210,212,142,182,177, 52,149,197, 25, 69,142,
-129,202,105,156, 85, 52,141,163,174,229,217,111,172,165,118,142,202, 89,140, 53,104,163,176,149,124,142, 77,219,138,189,201, 79,
-146,127,176,184, 12,202, 26,175,170,196, 63,190,219,116,216,242,123,214, 24, 98, 22,193,105, 86,138,172, 13,174,170, 10, 20, 37,
- 99,173, 91,207,227, 5,113,171,141, 66, 91,205,105, 56, 1, 89,240,215, 41, 16, 83, 40, 45, 78, 44, 31,155,120,246,181,214,156,
-202, 56, 59, 39,228,140,153, 61,167,243, 32, 22,177,166,149, 93,112,193, 66, 87,117, 77, 76,153,211,233,188,194, 91,154, 69,239,
-224,100, 71,111,173, 41,188, 9,153,162,244,125, 79,211,212, 12,227, 72,215,245,228, 4, 55, 55,183,162,164,207, 25,235,204,106,
- 45, 91,206,162,229,109, 56,231, 72, 41,172,141,198,233,116, 64,145,216,244, 29, 49, 6,182,155,158,105,138,188,121,243,150,155,
-221, 13,155,190,229,237,155, 55,124,241,217, 75,156, 17, 90,219, 34, 38,155,189,167,219,108, 72,100,206,195, 64,136,126, 21,238,
-118, 93, 43, 74,119,165, 10,216,198,211,182, 29,195,121,162,239, 55, 88,235,104,154, 70, 10,107,142, 76,211, 72,215, 53,220,220,
-244, 82,216,131,164,124,198, 57,112,179,149,208,170, 80,108,134,199,211, 68,202,224, 92, 45, 28,255,162, 93,145,201, 75,192,123,
-177,103,250,217,211, 52,109,105,160,243,170,153, 88, 62,166,235,179,103, 57,127,100,141,148, 63,212,217,148,103,223, 52,182,164,
-180,173,105, 57,165, 43, 71,175,194, 14,197,135, 30,246,133,105, 78, 33,143,125,204, 70,116, 25, 17,170,213,223,190,130,107, 80,
-144,160,182, 53, 95,253,240, 43,190,250,193,111,179,109, 55,235,206, 52,151, 84,163,229,199,154, 76,163, 46,170,162, 69,244,246,
-228,172,188, 58, 7,151, 27,206,242, 57,101, 40,226, 45,177, 81, 41,125, 21,115, 87, 58, 56,173,148, 60,128,106,185,129,167,117,
-127,110,181,236,158,156, 81,212,149,252, 92, 25,133, 53,106, 29, 83, 59, 3,206, 26,172, 21,209,157,252, 59,249, 97, 72, 50,138,
- 55, 80, 91,104,107,205,166,171,232,155, 10,171,197, 19,111, 84,146,191,107, 52, 42,199,149, 62,229,125,100, 10,137,209, 39, 78,
-163,231,116,246, 12,115, 96,142, 16, 51,248, 8, 83,204,132,172,112,117,131,169,108,217, 93, 42,186,182,166,177,154,241,120, 32,
-133,112, 97,140,103,228, 50, 83, 46,108, 86, 43,156,210, 56,163,169,173,166, 42, 5,221, 57,133,179,242,119,146, 82,140,179,103,
-152, 69,163,176,176,186, 55, 59, 9,128, 56, 28, 14,107, 66, 81,206,226,193, 61, 30, 14,178,211,203,148,236,107,195,102,219,145,
- 82,226, 55,191,249,102,205, 51,190, 98, 30, 94,141,221, 75, 87,187, 80, 91,243,147,217,251, 90,216,197, 50,116,177,188, 93, 23,
-232, 5, 32,115,217, 41,235,167, 22, 17,117,101,215, 33, 63, 9, 79,200,239, 61, 60,107,152,194, 85,161,126, 95, 92,246,254,152,
-124, 45,242,234,170,149,127, 47, 28,230,227,243, 45,190,179, 32, 63,177,237, 93,107, 94,158,216, 73, 65,125,171, 12,111, 25, 24,
- 20,178, 95,166,112,190, 19, 45,145, 63,253,217, 47,248,111,254,240,191, 32,221,191,195,251,153,153,196,246,197, 11,142,227, 72,
- 70, 49,140, 35, 63,250,209,143,185,191,127,195,205,237, 13, 83,144,220, 5, 25, 81, 54,236, 79,103,230, 16,232,182, 91,162,130,
-195,241, 72, 86,114, 1, 92,198,192,193,207, 98,171,180, 86,232, 95,139,101, 84, 43,130,247, 52, 69,132,196,138,216,149, 81,242,
-233,116, 38,134,132, 47,248,209,105,242, 34,194, 42,170,116,173,236,122, 78,144, 83,217,215,138, 23,220, 89, 67, 87, 87,196,224,
-233,154, 86, 10, 65,177,220, 85, 70,211, 86,110, 45,182, 75,251, 99,173,147, 68,194,130,118, 54,229,237, 40,205,250,253,104,156,
-195, 22,194,217, 56, 12,164, 40, 33, 43,222,123,250,174, 99, 26, 71,172,177, 37, 24, 6,166,225, 76,244,179, 92,226,103, 79, 68,
-161, 93,181, 38, 0, 58, 91, 49,207, 50,158,149,100, 58,233,158,231, 73, 70,215, 33, 10,187,126, 9, 78,114,206, 92, 89, 50, 11,
- 35, 10, 69, 85,215,107, 56, 73, 42, 86, 40, 87, 9, 68,167,174,157, 56, 9,202,197,220, 90, 87, 2, 82, 68, 76,217,247, 61,111,
-223,189, 17, 86,122,185,116, 8,237, 78,216, 34, 41, 73, 39,126,179,219, 48, 7,121, 45, 33,179,223,239,217,108, 37, 23, 62, 4,
-153,204,161,138, 98, 95,201,235, 45, 8,213,150,169,184, 29,118,219, 94,152,244, 90, 46,229,195, 56,150,143, 89,180, 22, 25, 9,
-146,121,245,234, 45,191,247,123,191,199,219,183,111,153,231,192,110,183,145,240,148, 81,178, 46, 66,188,160,204,251,141, 76, 24,
- 42,231, 4, 97, 59,141,162,222,215,162,166, 95, 38,105,195, 48, 18, 66, 96, 24,166,149,250, 39,174, 12, 83,104,165,170,136,224,
- 18,125,223, 49,156,135,146, 4,120, 68,107, 83, 86, 36, 18, 25, 60,205,190,100, 16, 8, 39,127,179,118,199,246, 3, 0, 0, 32,
- 0, 73, 68, 65, 84,233, 75,140,111,189, 2,147, 82, 65, 31, 47,228, 68, 85, 50, 3,188,151,104, 99, 73, 33,188,136, 86,245, 18,
-189,154, 63,174,191,201, 57, 99,106,219,252,203,204,197,138,182, 14, 27,181,190,242,206,242, 94, 44,229, 5,228,161,174,186,121,
-165,213, 7, 69,125,165,168,105,181,172, 24,139, 64,197,226,180,229,139,207,190,228, 39, 95,253,132,187,237,205,138, 62, 76,177,
-228,215,190, 39,226, 81, 92,143, 99,151, 79,180,116,102, 41,173,137,114,226, 93,191,194,138,114,217,165,134,146,159,158,214,110,
-142,146,244, 86, 48,174,229,191,109,177,234,217,133, 96,165,165,120, 59, 35, 5,174,178, 10,187, 8,235, 22, 4,108,217,181,155,
- 2, 14, 16, 62,188, 46,127, 39, 99,149, 70, 23, 34,219,162,234,139, 33, 50,142, 19,227, 56, 74,104, 66, 74,194, 59, 46,140,227,
-224, 35,115,136,140,179,103,244,137,227, 48,113, 60,143, 82,208, 67, 36,103, 65,193,134,172,240, 33,225, 83,162,170,106,170, 66,
-133,179,214,210,119, 13,206,128, 63,159, 74,103,124,137,139, 21, 40, 92, 44,126,123,189,238, 16,107,103,169,156,150,238,196,136,
-214, 64, 23, 11,210, 28, 34,135,243,200, 84,246,106,117, 83,179,221,246,156,207, 39,206,231,243, 26,159, 89, 57, 43,151,157,242,
-218, 25, 99,176,218,209,118, 13,183,119, 59,198,105,228,111,126,249, 27,124, 72,235,101,237,137,150,125,193,172,230,188, 96,224,
- 47,176,152,171, 44,227,101,146,162,242,123, 50,142,235,215,254,189, 96,244,203, 0, 64,173, 17,192,215,148,185, 39, 20,167, 53,
- 51, 94, 61,221, 74,231,111,207, 65, 79, 87, 83,165,139, 66, 62, 61, 21,235, 41,158,216, 59,243,119, 32, 97, 63, 84,208,171, 15,
- 45,126,234, 90,215,242, 52,249,238,195, 73, 64, 94,119,191, 20,125,133,201,178, 35,174,178,231,143,126,254,115,254,236,103,191,
-207,173,213,188,122,251, 27,166,228, 9, 40,148,171,184,127,124,196,218,138,195,195, 3, 63,252,254,111,225,199,129,103,207, 95,
-112, 26, 70,234,182,103,127, 60,224,170,138,215,239,222,209,223,220, 96,154,154,195, 48,112,158, 70, 41,138,117,181,174, 75,130,
-159, 75,166,117, 42,121,234, 18, 64, 66, 74, 5, 85,154, 46,175, 75,193, 86, 15,227, 12,104,137,203,180,174, 20,125, 41, 24,178,
-143,212,229,224,190,208, 6, 41,250, 33,107, 53,219,190, 43,171,152, 76, 83, 11, 92, 37,198, 64, 83, 88,239,206, 25, 92, 93,173,
- 17,166, 25, 4,101, 90,104,105, 18, 90,100,217,238, 54, 84,117, 37,226, 81,224,230,246,150,156,132, 70, 55, 20,254, 57, 57,161,
-148,124,110,227,112, 38, 69,137,123, 78, 49,200,199, 20,101,239, 29,114,190, 68, 55, 27,195, 56, 77,164,152, 25,167,105,189,158,
- 57,231,152,166,113,125, 29,171,166, 34, 36, 41, 8, 77, 43, 94,240,156, 19,117, 93,139, 75, 58,171,245,123,222,251, 80,160, 54,
-117, 17,187,102,234,186,193, 88,203,205,110,203,241,120, 90, 11,161, 40,222, 37,136, 38,149,209,187, 46, 13,135, 56, 14,116, 41,
-100, 51,135,195,145,174,235,176, 70, 9, 28,203, 79, 69, 13,238,139,117,207,112, 60,158,200, 89, 70,217, 62,132,130,222, 53,132,
- 32,137,116, 41,165, 21, 9,172, 77, 81,191,107,225,235,135,144, 10,231, 95, 94,167,148,147, 96, 93,141,161,105,218,149, 0,151,
-163,236,253,231, 16,160, 20, 78,128,105,156,104,154,122,137, 67, 96,211,111,152,198, 9,173, 5,192,211, 52,205, 90,216, 37,238,
- 87,224, 54,211, 52,202,219, 80, 2,231, 89, 48,180,117,237,152,231,137,166,170,202, 19,166,169, 42,199, 56,142,132,224,201,200,
-196, 67, 27,187,242,252,115, 89, 91, 44, 14, 5,113, 19, 45,250,174, 75,241, 95,143,188,178,211, 79, 41,173,172,137,143,113, 43,
- 46, 43,244, 66,164,171, 77,253, 47,223,183, 8, 73,156,159, 45,153,182,242, 2, 94, 19,224,180,214,130, 15, 45,221,243,117, 39,
-191,136,143,150,183,185,102,137, 95,131,103, 10,247,229,238,230,142,159,124,245, 59,188,120,246, 2, 87,242,184, 99, 76, 43, 60,
-102, 9,163, 88, 74,123,138, 97, 29, 65, 92,139,149,214,159,139,255, 56, 47,227,228, 44,133,246,130,207,150,157,108, 8, 98,179,
- 72, 11, 82, 84, 23, 5, 63, 98,243, 48, 90, 50,205, 85,142,232,156, 10,119, 89, 58,117,163, 51,214, 8, 80,192, 60,153,214, 94,
-194, 68,228, 27, 39,173, 7,182, 94,237, 8,170,120,164, 53, 41,194,236, 51,167,243,196,233, 60,113, 60, 14,204, 62,144, 81, 24,
- 39,183,215, 16, 2,147, 15, 12,163,103,152, 60,195, 52,115, 56,141,156, 7,207, 28, 18, 10,129, 78,200, 67,171,153, 99,194,135,
-132,171,235,114, 27,148, 48,132, 77, 87, 99,178, 71, 71, 79, 91, 89, 9,192, 40, 17,151,210,132,164, 18, 95,169,101,164, 88, 89,
-154, 74, 83, 87,134,218,137, 64, 68, 62,111,185,149,205, 33,177, 63,157, 57,207,158,144, 34,219,221,134,182,171,121,120,120, 96,
-154, 38,156,147, 7,101,187,217, 8, 42,209,136,223,212, 88,139,181,142,205,182,103,123,179,225,221,253, 3,191,250,213,215,132,
- 88, 10,233, 74,100,121,223, 39,253,148,121, 32, 20, 49,181, 10,208,158, 40,199, 11, 20,238,178, 99,190, 42,240,107,145, 54, 79,
- 69,104, 87, 64,135,156,179,124, 77, 47,184,164, 39,233,124,121, 41,238,239,141,186, 63,237, 69,127,154, 99,176, 88,222,244, 21,
-202, 86,125, 42,148,229, 59,212,238, 79,144,182,239,179,160, 87,231,194, 53, 71,255,170,131,215, 87,107,132, 50,245, 16,166, 76,
-196,168, 68, 71,228,143,126,250,187,252,207,255,228,143,201,251, 71,190,126,243, 27, 84,107,139, 23,186,231,120, 58,115,251,252,
- 57,167,113,100, 60,143,188,184,123,206,233,112, 96,119,123,199, 28,225,111,191,249,134,126,187,163,106,106, 78,211, 68,182,134,
-195, 48, 50,204, 19,177,136,220,198,121,194,186,170, 8,146,116, 1, 22, 57,114, 25,155, 43,181,168,210, 37,172, 67,151, 92,243,
-133,205,157,179,140,142,143,231, 97, 5,203, 24, 99, 25,199,153,174,235,105,138,130, 57,198, 88,158, 75, 85,162,142,129,152, 4,
-198,164, 21,164,200,102,219, 67,166,228,151,203,168,179,223,244, 84,117, 93, 46,174, 45, 33,102,182, 55,183,160, 20,214, 85, 43,
-243,161,109,155,117, 7,234,189,132,195,248, 81, 58,239,113, 30, 47, 96,151,156, 72, 49, 23, 32,147,151, 46,184, 52, 79,169, 76,
- 35, 19, 10,159, 51, 33,178, 70, 11,167,144,137,197,223, 62,205, 94,208,169, 69,137,190,136,165,146,202, 56,235,164,139,188,210,
-162,248,152, 49,214, 17,202, 84, 77,105,197,118,187, 43,248,218,176,142,125,251, 77,143, 45,162,177,119,239,222,177,217,108, 56,
-157, 78,236,247, 7,172, 21, 53,254,233,116, 20,129, 89, 1,211, 52,149, 0, 94,206,167, 51,227,228,177,149,163,107,106, 92,101,
- 57, 30,143,244, 93, 87,138,117, 46, 5,218,112, 60, 30,185,189,189,193,207,146,134,105,172, 91, 31, 80, 99,132,105, 96,221, 18,
- 67,170, 49,218,174,170,119, 31, 34, 41,102,110,159,221, 18,163, 20,249,199,199, 71, 94,190,124, 9, 36,198, 97, 88,117, 95, 41,
-179,174,191, 20, 18,184, 50, 79,243,149, 2, 62,178,219,109, 72, 41,113,127,255,184,198,252, 26,163, 75,162,222, 21, 22, 90,171,
-213,139, 47,107, 76, 4,150, 84,214,189,146,201,238,136, 49, 10,202, 55,103,134, 97, 94, 73,136,203, 52, 56,145, 80, 89,116, 17,
-242,182,106, 81,186,151, 38,212,185,234,234, 28, 74, 43,239, 32,167,247,178, 86,174,234,226,117, 81, 95, 48,196,250,169,207, 69,
-125,152, 49,157, 47,105, 89, 31, 30, 92,139,191,249,189,201,247,226,157, 83,234, 73,188,229, 37, 4, 94,216,192,223,251,226, 11,
-158,221,222,137, 15, 29,201,235,142,197,118,182,224, 65, 99, 94,136,113,241,195,189,230, 34,146, 43, 4,188, 69, 80,124, 73, 62,
- 45, 86, 40,196,186,226,172,166,169, 28,109,137, 0, 93, 71,107,171,221,206,148,131, 55, 21,148, 45,133, 23,188,228,182,231,226,
- 99, 47,232,212,210,245,199, 24,241, 62, 49,135,204,236, 51,211, 28,153,198,192, 56, 6,166, 41, 72,134,111,148, 64,139, 41, 38,
- 6,159, 56,207,145,227,217,115, 56,206,236,143, 51,231, 41, 49, 71, 69, 72,138, 97, 10,236, 79, 19,247,135, 51, 15,135,129,135,
-227,192,227,113,226,241, 56,114, 56, 79,140, 62,144,115, 9, 3, 16, 55,224,250,205, 40,187, 59,179,118, 40, 86, 65,165, 97, 83,
- 59,158,221,116, 60,187,233,184,217, 84,244,181,128,121,186, 90, 44,121, 77,109,112, 14,180,201, 24,155,169,107, 41,232,173, 83,
-180, 86,130,102, 26, 11,173, 83, 52, 86, 97,149,172, 27,140, 81, 66, 87,202,137,224, 39,185,236, 24, 67,215,182,212,101,239,238,
-156, 91,147,182,172, 53, 37, 90, 51,175,233,121,139,218, 90,152,255, 11, 71, 32, 94,232,113,215,185,244, 87,186, 14,149, 64,167,
-101, 52,175,214,239,187, 15,108,102, 31, 89, 77,235,124,249,241,145,127,242,193,239,229,171, 48,153,107, 29,202,199,160, 76, 31,
- 3,184,100,226,101, 15,127,229, 9,191, 78,118,187, 30,245, 47, 41,109,239, 95, 28,190,149, 98,247,254,199,176, 8,252,138, 19,
- 32, 82,126, 86,200,222,182,168, 97,178,202, 2, 9,202,242,189, 82,229,192, 63,252,233, 79,248, 23,127,250,103,124,158, 20, 15,
-239,222,146,157,229, 60,122,154,237,142,183,251, 61,253,102,203,195,187,123, 26, 87,241,163,159,254,148, 73,131,174, 26,148,109,
-248,213, 55,175, 24, 67,102,119,247,156,183,239, 30, 49,214,210,111, 68,232,100,157,163,223,108,164,227,180, 18,210,177,216, 30,
-115,241,205, 11,178,186,132, 94, 88, 75, 68,137, 90, 62, 95,194,145,150,174,254,241,241,192, 52, 78,114,153,172, 29,174,182,220,
-222,221,136,167,121, 24,100,247, 94,220, 46, 49, 73, 78, 54, 40,124, 8, 28,143, 71, 98,233,158,114,230, 73,162,152,177,154,166,
-107,203,229,215,113,123,123, 43, 49,160,203, 89,153, 97,187,217,148,221,118, 42,120, 87,131,202,112,218, 31, 32, 70,210,236, 37,
- 67, 59, 8, 82,148,156, 9,179, 68,113, 42, 9,168, 32,139, 32,166,164,130, 73,250, 90, 70, 10,109,215,246, 76,211, 76,140,153,
- 24, 18,227, 44, 35, 89,231, 36,126, 52,149, 81,163,177, 18,210, 20, 67,228,116, 56, 73,247,151, 97, 28,167,114, 86,229,117,218,
-160,148,102, 28, 71, 98, 76, 18, 75, 27, 19,195, 89, 46,102,203,100,111, 28,231, 18,105,171,137, 49, 51,142, 51, 57,101,218,182,
-229,112,216, 99,173,185, 80, 70,115, 17,205, 57,195,233, 52, 10,193, 82,201,120, 60, 37, 73,158, 91, 46,177,214,138, 7, 62, 71,
- 73, 70, 67,201, 40,123, 24,134, 21,156,178,219,237, 10,138,118, 96,154,102, 66, 76,212,109, 75,221,246, 36, 12,227, 60, 51,142,
- 51,179,247,108,119, 27, 66,200,188,122,253,170, 92, 10, 89,119,254,187,109, 79,223,117, 52,117,117,101, 45,213,156, 78, 35,231,
-243,196, 60,123,166,105,228,230,118,203,243,231,119, 76,211,200,126,191,199, 90,129,233, 44, 22, 70,185,172,137, 48,118,158,101,
-181,115, 60, 30, 49, 74,227,140, 45,194, 95,203,121, 56,130, 74,156,206, 7, 66,244,116, 93, 45, 92,131,224, 87, 55,136,224,202,
-195, 90,199, 66, 8, 40, 35,130,109,165, 53, 33, 69, 66,138, 5,234, 99,214,218,164,175,116, 65, 10, 85, 86, 79,113,157, 66,166,
-116, 65,101, 75, 67,158, 21,105, 25,125, 22, 63,248,197, 66, 36,135, 94,250,216, 33,146, 47, 66, 57,190, 51,100, 66,173,235, 68,
-173, 13, 58,195,179,219, 59, 62,123,241,114,181, 82,164,235, 14,189, 20,232, 68,126,111, 76, 40, 93,239, 37,138,179,192, 97,202,
-126,232,186, 27,201, 2,161,135, 88,152,208,133, 79, 47, 56,215,138, 97,246, 4,194,218,153,169,210,210,201, 56,182, 88, 25,148,
-198, 44,184, 77,181, 4, 5, 44,208, 27, 10, 66,163, 40,181,201,196, 36, 66, 59,149, 51, 36, 91, 68,103,145, 89, 37,178, 53, 36,
-173,209,217,144,179, 96, 86,103, 31, 57, 15, 35,211, 36, 24, 72,103, 12, 33, 41,142,167, 81,236,100, 11,205, 46,101, 98,150,155,
-233, 56,207, 34, 76,179,166,220,202, 68,165,171,117,197,209, 39,140, 55, 34,146,179, 22,109,140,236,248, 85,166,171, 52,109,211,
- 98,179,224, 33,207,154,226, 55,135, 16,202, 3,225, 52,198, 10, 61,203,152, 68,227, 12,213,178, 82, 49,197,126,164,192,153, 44,
-249,111, 9,233,202,219,154,241,124, 36,148,116,165,202, 58,218,182,145, 46,221, 85,197,215, 42,220,107,103, 37, 78, 48,172,135,
-106, 66,105,241, 12,103,226,123,163,226,107,171, 88,217,119, 47, 58,136,252,116,205,147, 21,151,152, 81,242,199, 25,232, 34,227,
-192,228,111, 1,180,228, 15,125,221,215, 59, 32,157,191, 29, 16,243, 49,148,235, 21,231,142,107,255,136,122, 47, 39, 94,103, 72,
-239,231, 36,103,190, 19, 75,251, 1, 51,126,189,140, 95, 50,228,151,168,212,245,153,186, 98, 58,231,229, 82,156, 19, 85, 8,252,
-253, 31,253, 54,255,235, 63,255,231, 60,211,154,255,243, 95,253, 31,220,126,254,146,199, 97,162,169, 28,199,121, 36, 87,150,100,
- 20,109,211,240,189,239,255,144,127,243, 23,255,158, 47,191,250, 10,234,134,255,248,155,175,177,155, 29,214,142,188,219, 31, 9,
- 9, 94,126,246, 5,239,206, 7,178, 82,104,227, 56, 15, 3, 89,137, 80, 44, 71, 17,191, 29, 14, 7,188,247,156,207, 35,119,119,
-119,146, 87, 96,237,170,169, 89,180, 12,137, 76, 76, 30,231, 58,230,121, 90, 15,197,165,211,159,125,224,213,235,215,104,229,138,
- 87, 88,254,205, 34, 6,140, 49, 98,156, 69,147,241,243,204, 60, 59,113,135, 88, 75,111, 36,105,173,174, 28,231,211,145,170,114,
- 76,227, 88,226,152, 51,214,106,230,113,146, 24,234,148,200, 24,156,210,204,195,200,120, 30, 74,161, 21, 70,134,178,134,121,217,
-139,106, 25,227, 86,198,226,227,194, 20, 95,114,185, 19, 23,173, 99,105,108,178, 88,127, 31, 30, 30,200, 49, 17,178,160,109,115,
-148, 75,199,233,116,150,175, 93, 46,234,254, 20, 37, 41,175,188,248, 41, 72,224, 82, 74,226,120, 73, 73,146, 43,171,186, 18,114,
- 92,134,148, 19,181,173,215,175,235,233,116, 98,179,105,214, 81,180, 28,195,154,174,171,201, 57, 50,140, 3, 77, 83,173,108, 3,
-173,138, 5,208,106,170,218,209,199,150,199,131,216,235, 98,200, 84,174, 42,106,238, 72,211, 86, 60,220,239,105,154,142, 23,207,
-159, 23, 6,189, 20, 75,107, 29,179, 95,112,192,150,166,105,120,216, 31,208, 78, 51,249, 25,165, 21, 77, 91, 99, 12, 50, 33,213,
- 2,186, 57,158, 7, 42,235,120,249,249, 11,246, 15,247, 52, 77,141, 49,154,121, 30,233,187,150,199,227, 9,165, 68,196,168,107,
-135, 46, 81,185,135,195, 94,242, 5, 42, 65,236,206,243,204,179,103, 47,105,219,150,105, 26, 73, 57, 80, 87, 86,194,108,154, 22,
- 77, 69, 74,153,113,156, 48, 70,201, 5, 39, 36,246,251, 3,183,183,183, 12,197,161, 0,186, 52,163, 77,113, 95,164, 2,235,145,
-231, 46,198,248, 68, 52, 27,130, 68,123,175,240, 39, 22,205,134, 93, 5,193,215, 52, 71,165, 13,196, 82,192,139,251,102, 65,116,
-167,229,250, 94,234,133,229, 63,227,127,203, 72, 92, 95,197,163, 62,153,233, 93, 31,200, 87, 81,148,178, 23, 16, 56,130,216, 62,
-106, 94,190,120, 41,252, 98,173,139,101,226,106, 20,184,140,204,214, 0,143,139, 39,249,125, 5,113,140,113,141, 92,213,250, 98,
- 29, 18,252,107,186, 98,188, 95,138,178,179, 26, 99,132,146,149,150, 61, 93,202, 43,248, 68,233,136, 50,200,216, 56,137, 62,220,
- 44,159, 82,129,221,168, 98,132, 78, 41,175,217,219, 41, 5,177, 94, 69,131, 10, 25,157,196,106,151, 18,228, 74,110,179, 90,233,
-226,159, 77, 76,147,140,213,231,144, 68, 75,224, 64, 77, 51, 86, 37, 72,113,221,243, 46, 22, 37,161, 21, 81,118, 59, 86,172,117,
-218,208,186,154, 41,107,236,105, 16, 42,159,147, 63, 83,101,101, 80,105,176, 68, 44, 17,167, 18,214, 42,116, 99,152,188, 34, 24,
-240, 86,186, 35,227, 12, 77, 93, 81, 21, 38,183,181, 53,149, 22,181, 48, 70, 75,119,167,196,190,167, 72,144, 3, 77,219, 98,140,
- 97, 24,134, 21,222,178, 48,150,171,202,225,156, 41,147, 12, 47,157, 67, 35,135,240, 52,207, 28, 78,167, 75, 32,193, 90,128, 82,
- 33,110, 45,249,226,165, 24,235,242, 50,114,217,131,155,197,102,118, 61,125, 94, 8,109,249,218,191,145, 63, 22,186,250,180,224,
- 95, 67,134, 62, 18,162,144,151,142, 57,165,167, 59,159,247,186,242,235, 7,247,186,204, 46,105,114, 79,222,105,190,138,237, 45,
- 31,162, 1,146, 86, 79,181, 36,139, 56,239, 35, 84,185, 39, 99,254,229,102,191, 50,205,121, 50,185,200, 87,142,149,203, 5, 88,
-151,130,151,209, 41,240,139, 31,252,128,255,237,191,254,111,217,248,192, 95,254,242,175,120, 51,237,209,167,150, 47, 62,255, 1,
-255,234, 95,255,107, 62,255,242, 51,134,227,129, 99, 45,201,106,255,241,151,127,195,237,246,134, 78, 59, 94,165,196,193,123, 84,
- 85, 51,237, 15,108,183, 27,110,158, 61,227,205,219,123,188, 17, 12,232,148,102,108,229, 74,226,154, 32, 80,207,231,243,218,129,
-100,165, 56,157,207,220,221,238,240,243,149, 21,118, 73,177, 11,145,190,223,176,127, 60, 50,207, 1,173, 13,119,119,119, 12,195,
-128,171,106, 94,191,126, 45,153, 7,177,156, 1, 87, 95,128, 84, 58, 11, 17,159, 89,252, 60,178, 63, 30,185,187,217, 48,142, 19,
-187,221,142,227,241, 68, 93, 89,200, 25, 63, 14, 28, 15, 7,113,183,168,140, 85, 48,205, 35,214, 85, 56,173, 25,142, 71,108, 9,
-161,154,130,140,159,125, 8,132,156,241,243, 68, 76, 98,191, 50,229,156,138, 74,210,224, 4, 45,191,104,127, 32,133,180, 78,255,
-114,217,125,199,194,185,183,214,226,231, 88,148,209,165, 49, 42, 20, 57, 41,176,229,169, 73,137,166,110, 25,142, 71,180,146, 0,
-170, 24,210,202, 2,128,200,249,124, 46,227,240, 72,221, 52,235,153,105,140, 33,248,180, 10,180, 94,190,124,190, 94,164,154, 70,
-162, 89, 99, 12,120,175,232,251, 94,148,220,235,199, 32,108,139,186,174, 80,135,147, 76, 4,230, 25, 16, 66,103,142,162, 37,216,
-237,118,188,126,243,142,190,219, 96,235,154,227,249,140, 43,156, 1, 87, 89,206,231, 19,183,183, 95,202,238, 89,101, 54,155,158,
-183,111,223,137, 63,127,158,216,238, 54,196, 20, 36,200,231,176, 95, 21,251, 33, 4,250,237,150,195,241,200,221,237, 22,239, 35,
-227, 56,210,214,149,156,175,167, 51,125,223, 83, 85,134,211,233,196,118,179, 33,167,196, 52,207,136,179, 76,243, 87,127,245, 87,
-220,222,222,138, 19, 34,149, 60,244,202, 50,156,143,244,219, 29,219,237, 6,231,100,133,113, 58,157,105,107,199,249, 60,114,115,
- 35,240,163,195,241, 92, 38, 71,145,166,169,168,107, 87, 64, 64, 9,156, 66, 71,195,249,116, 18, 0, 87, 17, 42,107, 37,226,231,
- 16, 66, 25,233, 11, 60, 73, 28, 59,151,139,125, 74,233, 74, 71,162, 46,246,182,101, 66, 84,254,238,210,185, 3,216,168, 89, 23,
-241, 11,232, 97,249, 53, 37,140, 84, 27,123,213,144,151,145,145, 74, 69,245, 30,177,201,200, 24,207,232, 82,224,196,223,173,244,
-146,132,149,200, 74, 70,172, 86, 89,158,239,158,241,108,251, 12,171,172,116,232, 69,166,191, 50,156, 11, 41,142,171, 64, 10, 99,
-204,218,197,152,245,144, 74, 5, 80, 34, 12,235,101, 12,161,115, 46,145,161, 73,222,119, 10,114,104,169, 76,206, 30,151, 61, 85,
- 78,204, 57,163,140, 37, 46,226, 8,171, 32,136,216,205,149,155, 97,237, 20, 58,229, 98,187, 50,164, 36, 46,238, 20, 3, 41,148,
-220,228,148, 72, 44,169,110,160,147, 33,153,153, 68,196,103, 75,159, 13,106,201, 70,214, 22,239,229, 5, 28,166,153,105,142,140,
-179, 60, 64,117, 18,225,132, 5,156,214, 96, 82, 81,220, 75, 40, 76, 93, 89,148,214, 52,109,141, 86,178,194, 48,214,160, 76,197,
-126,240,104, 2, 77,109,169,107,139,117,166,112,144, 53, 85, 83, 97,152,137, 83, 40,250,188,146,229,172, 29,181, 51,208,152,149,
-234,230,172,160, 34, 43,173,228,237, 53,181,232, 18, 12,132, 36,179, 9,107, 18, 49, 15, 96, 2, 55,155,158, 20, 60,167,243, 9,
-138,122,185,174, 37,220,165,107, 91, 72,145, 56,207,228, 50,133,137, 89, 20,190,251,227,153,253,126, 44,241,179,146,134, 84, 84,
- 14,228,101,187,174, 47,118,187,245,254, 24,245,186, 28,138, 87,115,242, 85,104,150, 46,158,242, 15, 16,178, 75,162,159,142, 31,
-133,196,234,178,203, 72, 92, 21,239,235,130,112,245, 92, 88,165, 63, 80,197,191,143, 87,205,165,155,129, 84,112,160, 23,207,250,
-245,197, 33,189,103,207,188,140,251,213, 19,184,204, 19,187,218, 19, 61,192,133, 53,159,175,208,185,145,242, 49, 40,233,172, 18,
-186, 64,242,162,176, 14,180, 34, 5,133, 67, 99,243,196,239,191,184,227,127,255,103,127, 66,123,124,203,215,251, 71,230,156,209,
- 85,203,243,207, 62,231, 47,254,250, 47,249,234,119,127, 76,136,145,231,141, 64, 78,106,215,225,110,122,126,243,234, 21,223,251,
-106,203,223,254,251,255, 64, 74,153,231,187,150, 47,187, 29,219,110,203,191,251, 79,111, 24,180, 98, 63,142, 68,163,152, 19,212,
- 24,170,198,202,193,159, 19, 49, 75, 56,136, 49,226, 29,143,222,163,114,166,182, 74, 58,205,178,122,211, 73,190,231,227, 44, 23,
-162,148, 21,109,219,113, 56, 30, 57,157, 71,212,121, 38,121,133, 78, 26, 85,246,144, 57, 39,148, 81, 43,136, 74,105,139,143,137,
-164, 34, 85,227, 24,194,132, 26, 78,160, 51,214, 42,198,195, 17,221,117,152, 4,135,251,135, 18,232, 4,199,135,123,136,129, 28,
- 3, 62,203,234, 77,165, 76, 86, 90,242, 34,180,248,236, 83, 92, 50, 2,100,231,106, 11,170, 25,165, 57, 79,158,144,210,154, 61,
-144,148, 41,182,177,114, 48, 39, 85,214, 33,172,206,163, 57,148,131,187, 88, 58,149,149,201, 88, 12,145, 48,123,177,179,206, 17,
-219,200, 72, 62, 22, 33,171,209, 66,142, 90,189,214, 73,244, 74, 40,201,136,152,102, 81,119,107, 37, 30,124,109, 53,227, 28,217,
-110,183, 28,246,143,107,161,142, 11, 74, 59, 69, 12, 14,171, 37, 89, 46,132, 36,147, 66,109, 11, 61, 17,158,223,238, 72, 97,190,
-116,250, 69,151,162,148,248,211,187,182, 33,196, 9,165,165,139,183,149, 52, 61, 93, 93, 23, 78,189, 98, 14, 30, 98,192, 85,150,
-231, 55, 91,188,159,201, 58, 51,207,194,231,232, 55, 29,143,135, 3,218,192, 60, 75,129,172,235,134,148, 20,223,188,122,199,110,
-183, 99,219, 24,198,113, 96,179,169, 57, 30, 2,126, 30,164, 1,169, 45, 16, 10, 16, 7,218,118,139, 15,129,221,205, 29,147,159,
- 24,222, 13,124,249,197, 23,168,130, 48,222,110, 5,139,171, 20,244,109,205, 48,207, 76,147,198,199, 72, 66,115, 60, 79,180, 77,
- 71, 78, 39,252, 56,163,140,244,134,243,228, 87,107, 94,223,247, 50, 29,105, 42, 66,136, 56, 91,173, 13,144, 49,165,193,243,146,
- 84,151, 72, 37,138,119, 42, 77, 64,177,117,166,136, 74,225, 42, 4,106,209,230,232,203,179,175, 47,103,157,253,168, 71, 86, 61,
- 29,195, 95, 44, 59,229,212,204, 23,149,242, 34,175,127, 63, 55, 99,217,117, 47, 40, 76,165,100, 74,109,180,225,249,221, 51,154,
-186, 89,111,152, 11,223,115,121,159,113, 77, 83, 19,191,180,210,250,189,176,143,244,244, 19, 76, 2, 5,185, 56,235, 18, 90,103,
- 65,191,146,208, 38,175,202,121,185,180,134,210,109, 74,177, 78, 8, 53,168, 50, 6,229,228,240, 55, 42, 99, 93,146,252,241,204,
- 37,175, 29, 35,152, 89,109, 72, 58,161,163, 18, 81, 75,202,228,164, 87, 10, 86, 52,153, 57, 6,116, 80,248, 8, 54,202, 33, 60,
-205, 51, 49, 82,196,111,194,198,246,169,188, 40,211, 68, 50,210, 21,107, 35,180,170,202, 25,218,202, 81, 87, 22,109, 53,174, 50,
- 37,175, 92, 82,212,148, 49, 36,229, 56,207,137, 24, 18,117,213, 22,162,156, 35, 6,201, 90,134, 84,190, 62,145, 28,242, 58,146,
- 51, 74, 18,136,172, 17, 12,172, 0,119, 82,209, 27, 72,232,132,179,154,202,200, 46, 59, 36, 89, 15,148,228, 89,172, 21,171,203,
-195,254, 65,184,197,198,208,214, 53,125,223,173,220,235,180,162, 24, 99, 25, 23, 6,198,113,228,221,253,129,113,144, 32, 10, 93,
- 20,252,170, 76, 64,210,149, 11, 92,189, 55, 63, 87,234, 59, 40,233,249,226, 33,127, 98, 41, 83,223, 62,194,126, 31, 21, 43,235,
-150,242, 93,158, 21, 20,164,163, 70,173, 10,147, 39,153,229,235,126,235, 34,106, 73, 31, 68, 35,229,167,252,135, 79, 88, 83, 62,
- 37,138,251,164,165, 45,243,225,215,235,201,133, 68, 72,103, 85, 42,159,138,214,228,171, 76,116, 75,226, 71,183,119,252,143,255,
-236,207,121,124,253,138, 57, 39,246,195,192,235,227,153, 57,193, 95,255,242, 87,204, 41, 96,140,163,113, 45, 95,127,253, 13,182,
-105, 56,198,196,155,135, 71,220,166,231, 47,127,245, 43,230,156,216,244, 27,246,199, 35,174,170,240, 72, 20,240,209, 7,166, 4,
- 62,122,121, 29,181, 46,254,100, 56, 31, 79,248, 16,112, 85, 93, 38, 88, 97,205,100,168,170,154,249, 28,228,252,200,170,140,178,
- 13,115, 8,226,179,214,134, 99,137, 86,142, 49, 98,148,248,174, 99,188,176,217,181,186, 26,207, 35,122,147, 16, 19, 49, 43,124,
- 0,167,107,230, 16,217,159, 70,172,182,226,139, 62, 31,214,195,114,201,190, 70,153,245,123,104,242,190,116, 70,154,168, 46,225,
- 78,185, 56, 60,252, 24,113,181,193,123,209,211,136,240, 74, 18,221, 22,162, 91, 6,113,249,228,139,107, 40,149, 11,158, 41,228,
- 52, 97,116,128,169, 45,201, 11, 4,197, 88, 17, 11,186,198,114, 10,146, 1, 31,128, 24, 34,174,173, 24,131, 88, 71,179, 86,184,
- 2,176, 82, 41,149,181,131, 89,163, 60, 23,107, 91,200, 23,162,226,249, 60,162, 94, 72,106,217, 48,158,105,218, 94,116, 57, 70,
-178, 46,102,239,105,219,237,170, 80,151,177,244, 76,229, 28,243, 60, 20, 37,125,205, 28, 60,117, 93,139,134, 65,129, 53,150,205,
-166,146,194,173,149,136,202, 80,184, 24, 56,159,207, 60,123,246,140, 99, 65,167,118,125,187,218, 24,111,110,132, 59,127, 56, 28,
-214,250,179, 63, 28,184,187,189,229,225,112,160,109, 97,158, 2,211, 40,162,180, 24, 19,175, 95,191,161,109,235, 34,210,173, 80,
- 40, 66,240,235,212,215, 57,187,162,135, 79,167, 35,125,223,151,179, 73,177,217,108,153,166,145,186, 18,127,250,227,227, 35,149,
-179,101,124, 30,128,196,102,211, 51, 77, 19, 90, 71,198,113, 96,219,223, 65, 11, 3,131,136,175,163, 68, 78,123, 47, 83,132,113,
- 28,233,186,142,121,246, 24, 83, 68,117,214,136, 85, 57,164, 43,209,106,166,239,219, 21,226,179,138,191, 75,119,190,140,239, 87,
- 55,206,251, 43,191, 43,104,214,135,227,247, 92,102,243,239, 83,181,174,186, 20,197,181,157,237, 3,101,206,147,236,102,174, 18,
-217, 36,103,183, 97,179,217,136, 8, 99, 37,194,233,245,109, 47,254,210,235, 11, 69, 44, 89,233,198,184,130,139,101, 61,116,229,
-224, 77, 37,123,186,216,200, 72, 18, 50, 98, 19,214, 44, 93,156,236,236,231, 32,118, 50,149,164,232,107,172, 68, 31, 42, 81, 57,
- 58,109,129, 74,212,226,197,123,190, 8,206, 22,239,103, 44, 10,246, 28,115, 1, 96,152,181,104,105, 16,127,186,137,197,227, 45,
- 99,240, 92,236, 99, 11,186,210,135, 36, 59,237,184, 40, 53, 19,104,129,216,212,181,165,113, 2,191,232,155,138, 77,215,178,221,
- 54,104, 3, 89, 95, 60,212,206, 90,180,173,152,163,198, 7,143,143,137,122,211, 97,171, 26,140, 65,165, 68, 93,203, 65, 37,135,
- 80, 46,214, 37,181,106, 2, 28, 98,167, 49,214,209,214, 77,233,254,228, 33,182, 78,227,156,161,178,242, 85, 54, 89, 49, 37,189,
-190,174, 77,211,160,149, 28,204, 11,253,168,174, 43, 25, 95,150, 56,203, 92,252,172, 33, 9,249, 43,229,192,225,112,226,213,171,
-215, 18, 97,169,101, 37,177, 76,139,214,113,105,202,171,176, 71, 61, 81,117,124, 58,150,116,233,122,175, 47,167, 23, 76,251,183,
-171,212, 63, 40,132, 49, 61, 13, 42, 84,121,157, 17,169, 75, 20,215, 7,244,183,235,143,115,189,124,126,132, 57,127,189, 86,121,
-127, 31,255, 93,177,174, 79, 63, 15,245, 1, 8,231,125,196, 13,101, 68,107,138, 93, 42,100,133,210, 21, 42, 5,108, 10,124,239,
-102,199,255,244, 95,253, 19, 54, 9, 14,195,196,201,123,222, 60, 60, 80,111,118,204,231, 51,159,223,222,242,248,235,175,241, 62,
-242,238,176,167,187,185, 5,107, 57,143,129,237,237, 51,190,126,251,150,144, 6,186,182,199, 26, 71,181,169, 57, 14, 3,141,173,
-249,230,237, 3,147, 6,229, 12, 62, 69,154,206,174, 41,130, 97,158,215,169,145,216,136,140, 68, 39, 7,138,194, 91, 64, 84, 90,
- 25,217, 63,150,203,147, 15,158,170,114,188,253,230, 13, 85, 45,244,174,190,235,184,127,183,151,238,197,200,186,111, 89, 89,152,
- 34,236,234,154,150,211,225, 36,164,193, 40, 33, 45,202,106, 66,132,224, 61,112,230,166,111,132,152, 86,236,181, 49,137, 90, 61,
-164, 1, 99, 45, 62,137,189, 42, 21, 33,175, 86, 74, 52, 26,106,177, 47,202,235, 39,214,166,136,210,178,182,202, 5, 30, 37,193,
- 36,185, 76,163,202,107,183, 76, 94,180,198, 46,194,208,162,208,206,203,129,110,173, 92,250,163,160,110,115,138, 34, 70, 11,144,
-202, 37,163,170,107, 76,129,155,132,144, 48, 54,209,180, 13, 67,241,100, 91,107, 11,180, 39,174,150, 94, 17,220,202, 84, 32,248,
-192,219, 55,239,120,118,119,195,187,251, 7,148,169,169,234, 74,200,112,198,144,162,127, 15,112,148, 86, 53,185,179,142, 16, 70,
- 98,146,232,217,186,145, 16,168, 24, 19, 49, 78, 52, 77, 67, 93,215,188,122,253,154, 23,159,117,164, 73, 44,140, 15,247, 39,110,
-111, 45,155,109,199,121, 56, 97,172,124,222,135,195,161,248,180,165,113, 16,168,150,101,127, 56, 64, 35,143,205, 56,206,244,157,
-112,227, 67, 12,130, 12,211,150, 24,225,113,127,100,154, 29,125,225, 32, 44, 5, 61, 4, 97, 6,200,184, 27,201,140,175,107,154,
- 70, 58,232, 20, 43,234, 74,148,236,155,190,231,237,219,183,180, 93, 71,211,182,168, 20,137,133,102,186,164,215,221,223, 63,208,
-247, 29,214, 85, 40, 45,107, 69,193,100, 55,242, 62,252,196, 60, 79,108,183, 91, 30, 31, 15,107,170,101, 87,183, 37, 81, 84, 49,
- 13, 3, 74, 11,109, 51, 4, 97,219, 63,101,188,200, 5,115, 97,240, 47,171,151, 85,208,158,159,174, 3,237,199,163, 31,129,143,
- 28,164,234,170, 37, 80, 43,141,150,167, 55,133,172, 86,161, 82,190,194,107, 46, 69,126,187,217, 80, 55,245,250,129,230,171,110,
- 93,175, 36,169,116,249,198, 41, 35,255,148,203,141,243, 74,205,172, 68, 66, 42, 15, 69, 46,248, 79,149, 10, 49,109,241,141,151,
-140,244,162,246, 21,111,185, 64, 96,156, 82, 76,126,198, 86,173,252, 59,163, 4,173,170,140, 20,241,228,201, 74,248,230, 90,151,
-104, 82, 37, 49,150, 57,107,178,201,152,168,100,108,150, 46,123, 94,103, 20,218, 68, 33, 77, 89, 93,108, 97,101,252,155, 53,211,
- 24, 86,176,134,144,231, 4, 96,209, 54,134, 93, 87,211,183, 21,155,166,102,211, 57,182, 93,203,110,187,161,235,106, 66,242,156,
-167,179,116, 4,202, 8,153, 75,107,246,239,206,188,189,127,192,216, 6, 83, 53, 24, 87, 19,115, 64,107,217, 3,170, 20, 80, 41,
-226,172, 41,168, 69, 77,133,145,110,223, 54,232, 60,211,212,134,214,137, 7, 54, 68,249, 26,214, 86, 83, 55,150,214, 42, 72, 30,
-159, 20, 54,102,146, 18, 55, 66,215,239,240,126,100, 26, 79, 88,173,168, 43, 71, 91, 87,212,149,252,168, 42,135,159,211,133,161,
- 15, 40,101, 57,159, 71,246,135, 99,217,155,151,105,229, 85,124,224,194, 26, 88, 70, 47,215, 80,164, 92, 46,115, 60, 65,190,191,
- 23,161,154,151, 93,242,199, 11,185,202,124, 68, 37,255,180,104,170, 43, 22,194,106, 19, 83, 75,194,220,199,213,241, 31, 43,202,
- 79,117,164,151,105,131, 34,127,235,229,228, 83, 23,144, 15, 69,113,249, 91,121,144,170, 8, 96, 33, 19,244,242, 60,149,139, 91,
-130,207,186,134,255,238, 31,254, 3,190,208, 6,117, 30, 72, 57,243,230,112,164,221,222, 48,199,196,151, 95,126,143,166,237,121,
-249,197,151, 76, 49,177,123,249,130,186,235, 56, 30,206,236, 31,222,113,251,252, 37, 97, 78,220,188,120,198, 97,154,152, 66,224,
-225,176,231,225,120,226,255,254,245,223,242,183, 15,143,236,158,221,225, 39,207, 56, 30,113,213, 86, 46,108,234, 34,132,147, 81,
-243, 5, 37, 26, 53, 69, 64, 89, 10,219, 85,144, 69,202, 18, 38,212,118, 66,225,242, 62, 20,175,180,167,170,106,198,211, 84,178,
-217,165, 49,113,206, 97, 43,153,108,121,239, 69,180, 25,101,103,109,180, 38,162, 81,202,144,147,226, 52, 6, 96,194,154, 44,142,
-156, 84, 60,252,202,200,212, 75,165,213,230,232, 67,148, 95,103, 89,145, 45,214,178, 24, 34, 33, 9, 1, 91, 8,139,233, 42, 1,
- 78,222,239, 42, 18, 90, 6,212, 75, 72, 71,121, 6,170,178, 15,142, 37, 86,186,107, 36, 18,116, 17, 3,230, 28,133, 72,215,181,
- 28,246, 39, 92, 93,225,207,231, 98, 39,173,240, 62,144, 0, 31, 34, 55, 77,131, 62,158, 8,133,191,174,138,234,122,153, 22, 44,
- 54,203,140,194,251,196,249, 60,242,252,217, 29,231, 97, 34,100,205,247,119, 91,252, 60, 50, 78,129,166,118,235, 36,202, 24,181,
- 94, 20,166,147, 68,154, 46, 17,176,251,211,137,186,107, 48, 74,232,114, 77,211, 16, 83,100, 44, 65, 40, 33,134,117, 68,223,182,
- 39,222,221,191,229,238,238,150,135,135, 71,230,121,194, 20,174,121, 8,161,132,207,244,156, 79, 3,109,219,210,214,181,164,187,
- 5, 25,139,239,247,143,180,109, 79, 85, 85,197, 38, 39, 23,154, 37,138,215, 90, 71, 46,151,146,105,154,104,219,150,253,254,129,
-187,103,207, 48,122, 94,139,179, 82, 34,160,134,204, 48, 12,212,149,184, 50,250, 77,207, 60,123, 65,183,214, 85, 57, 31,148,176,
-235,219,134,113,154, 9,135, 19,169,208, 18, 37, 4,198,150, 73,156, 76, 42,166,121,162,174, 52, 85,101,153, 38,185, 8,121, 63,
-161,148,193,185,154,202,245, 12,231, 65,254, 94, 35,208,161,224,227,202, 90,112,214, 97,136, 79, 38,143,105, 37,111,230,117, 18,
-190, 92, 52,109,126, 15,134, 33,197,248, 2,126, 89, 65, 83, 57, 94,118,148, 87, 16, 26, 74, 38,177,190,246,210,114, 73,158,186,
-196, 74, 10,142,117,211, 11, 53,142, 28, 65, 61,165,229, 72,113,207, 31,137,149, 76,101, 60, 27,151, 88,143,162, 12,103, 13,102,
- 17,160, 83,129,199, 24,176,203,104,180,168,214,115,177,118, 44,176, 25, 91, 44,110,231,113,194, 81,137,218,220, 92, 91,168,244,
-147,139,203, 50,170,151,102, 65,246,247,165,185, 94,131,106,180,134,170,228, 39, 59, 39, 40,194,198, 89,218, 90, 70,220, 57, 69,
-252, 28, 57,171,113,125,144, 43, 29,112,198,210, 54,150,109, 95,115,179,173,217, 52, 53,125, 91,179,233, 44,219,190,163,239, 90,
-148,209,156,198,136,196,143,139,127,211, 40,205,121,158,121, 60, 28,120, 60, 28,113,221,115, 92, 85,163,172,129, 16,113,149,163,
-115,150, 86, 69,116, 82,212, 90,163, 11, 13, 38,203,113, 70,101, 20, 93,221,178,233,219, 66,194,179,204,211, 76,202,137,202, 26,
-234,198,208,152,140,198, 48, 39,195, 33,120,102, 63,160,141,162,221,116,188,122,251,134,148, 38,106, 87,211,214, 21,109, 83, 83,
- 45,204,108, 13, 83,140,101,228, 40, 94,122,109, 13,195, 73, 60,249, 23, 42, 96, 92,245, 26, 31,100,156, 63,157, 79,175,221,141,
-226,219, 59,218, 53,225,237, 83,163,235,156, 63, 16,188,165,116,185, 76, 94,255, 67,117,165,198,127,223, 63,254,233,236,243,229,
-130,123,193,156,170, 18, 33,252,105, 40,251,119, 43,219,245,213, 42,106,233, 20,249, 86,184,140,148,240,136,112,142, 51, 25, 34,
-232, 24,185,113,142, 63,249,131, 63,228,119, 54, 27,190,172, 27,254,250, 87,191,228,241,124, 34, 25, 69,210, 26,167, 68,136,121,
-115,115,203,219,195,137,118,187,197, 40,195,253,235,119,204, 33,162,157,227,254,176,231,116, 60,242,249,231, 95, 50,218,204,111,
-222,220, 19,148, 97, 63, 5,126,249,205, 27,250,237, 29, 49, 8, 89,236,238,110, 35,152,204,224, 5, 74,164,229,172, 89, 20,191,
-151,203,141,140,201,167,201, 99,140, 20, 1, 83,236, 69,139,194,220, 7,137,183,124,251,246, 1,208, 88, 99,209, 90, 83, 53, 53,
-126,158, 36,157,208,213,212,109, 11, 10, 81,186, 79, 51,117, 85,113,154, 79,104, 43, 52, 56,227, 12, 36, 77,152, 60,100, 56, 12,
- 1,107, 50,181,147, 52, 70, 99,116,201, 85, 23,165,185, 82,194,133, 8, 37, 21,114,157, 14, 5,233,158,174, 65, 53,233,202, 38,
-164,203,120, 93,197, 18,144, 85,132, 84,170,128,160,124,241, 65,107, 99,208,214, 50,159,134, 2,124,233, 87,100,104, 76, 9,231,
-164,216, 25,171,145,141,163,140,123, 39, 47,132, 71, 84, 68, 41, 3,200,184,223,135,200,237,237, 13,175, 94,191, 38,101, 41, 60,
- 97,161, 74, 46,141, 87, 33, 36, 74, 23,111,177,182,194, 89,199,225,112,224,124,190, 65,171, 68, 91, 87,156, 78, 39,186,182,121,
- 34,224,210,229, 50, 97, 64, 75, 38, 0, 0, 32, 0, 73, 68, 65, 84,127, 56,157,233,251,142, 80, 40,104, 33, 68,162, 18, 71,143,
-247,194,118,223,239, 15,216, 98, 11, 52,133, 57,208,245, 45,191,252,229,111,184,189,189,161,109,107,177,183,105, 75, 83, 82, 30,
-119,187, 45,160, 56, 30, 79,178,222,107, 91,134,225,204,166,107, 75, 54,187,103, 24, 78, 56, 87, 11, 70,182,184,108, 4, 19, 27,
-138,125, 47,112,119,123,131, 82, 21, 49, 5,218,174,229,240,248,192,166,223,173,160,172, 16,130, 92, 40, 10,211, 62,147, 87, 79,
-189,171, 60,231, 97,196,150, 26,229, 42, 43, 26, 3,173,169,170,106,221,237, 47, 83,144, 5,208,179,124,141,189,159, 5,182,230,
- 92,193, 24,231, 98,165, 84, 76,243,200,110,179, 41,112, 34,169, 43,186,208,248,174,167,214,174,150, 41,203, 7, 41,138,133, 19,
-179,216, 61,149, 2,187, 46,228,212,251,227,244, 43,122, 91, 17,118, 72, 66, 86,254,176,131,127, 47, 56,114, 65,192,138, 56, 78,
-110,229, 70, 41, 42, 91,209,182,173,140, 89,139,184,236, 34,148, 87,107,182,249, 37,244, 98,233,210,179, 36,177, 17,113, 74,198,
-201,194,113, 81, 79, 2, 71,132,224,150,177, 74,226,251,196,164, 47, 15,217, 34,170,178, 86, 81, 59,195,228,147,216,178,114, 34,
-250,169,192, 90, 40, 0, 6, 3, 89,148,161, 42,153,226, 49,102,117,228,231, 98, 37, 96,177, 62,233, 92,186,103,181, 90, 47,156,
- 81, 52, 86,211, 88, 77, 87, 57,234, 74,196,114,222, 71,156,214, 56, 39,183,183,156, 42, 42, 91,209, 53,142, 77, 87,177,219, 84,
-116,109, 69, 87,215,180,173,161,107, 28,174, 50, 76,179,112,130,151,203, 70, 40,252,224,115, 12,236, 79, 35, 83,140,212,206,130,
- 41, 66,178, 28,105,140,163,181,154, 94, 27,180,178, 84,165, 55, 48, 78,176,135, 42,131, 85,134,190,115,220,236, 90,154, 74, 98,
- 39,135, 81,198,249,198,104,172, 73, 88,167, 36,176, 37,106,194, 97,228, 60,141, 84,109, 35,233, 68,167, 35,149, 85,180, 77,197,
-182,111,217,109, 58, 33,216,149, 8,193, 24,202,216, 61,229, 53, 56,225,112, 56,174,217,208,215,164,192,252, 94, 81,204, 87, 44,
-248,203,104,253, 90, 28,246,241, 45,242,117,238,208,229,118,123,161,187,105,174, 11,235,133, 19,127, 81,205,151,223,191,178,164,
-171, 53,230,141, 39, 94,243,139, 58,245,227, 93,191, 86, 2,106,146,189,233, 50, 61,184,110,225,243, 71, 45,112, 31, 43,238, 31,
-187, 68, 92, 39, 17,190,175,196, 95, 24,216,217,232,117,106,145, 10,179,161, 79,153, 63,250,217,207,249,197,231,159,179, 45,224,
-165,253,241, 64,179,217, 48, 14, 35, 95,253,248,199,252,197,191,251, 11,108, 85,243,246,221, 35,111,223,188,229,247, 94,124,198,
-255,243,111,254, 45,159,125,254, 37,227, 52,113,156, 70, 92,223, 83,239,182,252,250,221, 91,222, 29,143, 60, 14, 3,251, 57,240,
-102,127,192,117, 59, 76, 85,243,205, 55,191,166,235,133, 15, 62,156, 7,182,219,110,205,186,134,140, 46,154, 13, 83, 46,209,125,
-215,149,241,232, 44, 29,240, 2,227, 32, 51,249, 25,180,230, 52, 12,226, 42, 73,229,172, 50, 50, 66,215, 90, 68,162,218, 90,186,
-190,199,185,154,119,247,247,204,243,204,118,187,229, 88, 96, 42,153, 32,228,197, 90, 84,205, 62,148,253,183,214, 50,117, 75, 69,
-228, 24, 67, 33,168, 41, 82,152, 37,103, 61, 95,246,226, 57, 39,113, 97, 80,176,210, 70,175,138,125,141, 70, 59, 41, 16,190,168,
-147, 77,165,241, 62,136, 46,167, 8, 50,141, 46, 99,254,148,104,156, 35,148, 63, 91, 92, 34, 97, 8,236,118, 59,137, 48,141,129,
-166,173,153,166,179, 92,102, 74, 64,139, 82,138,152,163,196,217,162,133,243, 30,197, 35, 45,121,225, 50,150,223,237,182,178, 59,
-191, 70, 30,103,161,165, 77, 41, 48,122,207, 52,207,244,253,150,211, 48,113,127,191,231,251, 95,190, 36,103,225,234,135, 40, 99,
-255,211,241,192,102,179,145,110,209, 40,156,147, 75, 85, 14, 34,174,157,231,153,190,107, 37,187, 61, 6,142,199, 3,159,125,246,
-146, 55,111,222,202,186, 45, 68, 66,246,108,251, 30, 99, 52,227,112,102,211,247, 12,231, 83, 57,167,133,100,231,125, 20, 62,128,
- 18,219,221,221,221, 45,206, 89, 78,143, 66,176,163, 56, 25,134, 97,228,225,225,158,205,166,163,105,156,236,189, 17, 50,156, 53,
-134, 16,102,170,186, 34,132, 25,163, 52,205,102,203,249,124,162,105, 58,198, 34, 76,235,251, 94,166, 24,229, 16,169,170,138,199,
-199, 71,218,182, 43,107,147,184, 78,151, 42,103, 87,203,228, 18, 41, 62, 14,146, 99,224,189, 47,107, 4, 79, 85, 85, 34,142,158,
- 3, 96,232,186,158,148,202,159, 7,209, 79,104,173,202,228, 65, 23,187, 91, 40,126,127,105,192, 82,138,120, 47, 17,173,195, 48,
- 60,201, 96,121,186, 22, 47,238,163, 11,105,227, 99,221, 67,126,210,212, 92,135,105, 92,139,228,158,230, 80, 46,214,179, 75, 98,
-214,114, 32, 59, 87,173,164, 51, 57, 96,227, 85, 39,191,248,207, 47,114,125, 74, 81, 94, 66, 93,180, 46,106, 59, 45, 42,112,137,
-140,204, 43,104,198,148, 12, 99, 81,251, 74,116,226,147,128,141,114,142, 90, 91,210,212,172,194, 57, 69,240, 51,138, 10,141,100,
-224,230, 84,118, 65,106,193,129,234,117, 34,176,140, 56,174,169,118,166,252, 61,173,192,154,140,213, 50, 41,176,106, 73,110,211,
- 84,133,203, 92, 25,233,128,234,202,210,123, 15, 89,124,221, 77,229,104, 27, 67,215, 90,218,202,209,212,150,202,128,213, 2, 86,
-246,243, 2,132, 48,164,132, 60,236, 57, 51, 97, 9,217,128,173,208,214,149,238, 55, 64,140,212,166,166,214,224, 52,130,124, 85,
-170,176,151, 19,182, 82, 52,214,209, 86, 45,117,173,169, 43, 69,109,193,232, 68,119,211,173, 7, 75, 78, 1, 87, 25,154,182,197,
-143,153, 97, 10,204, 49, 81, 53, 45,251,211, 81,110,145,214,210,182, 21, 55, 55, 27,110,110, 54, 5, 79,169,214,180, 39, 9, 47,
-136,104,171, 56,157,199,226, 83,190,158,133,151, 21, 9,122, 13,250,200, 87,236,234,245,210,169, 46, 34,206,111, 13, 56,249,192,
-200,118,197, 74, 80,215,187,238,197, 86,198, 26, 53,122,133, 1,188,242,174,191, 7,156, 89, 22, 80,234,211,185,236,215,112,154,
-245, 93,101,117, 85,212, 63,238,167,255, 88, 97,255,246,177,252,135, 65, 46,235,174,183, 8,107, 98,113, 15,216, 44,121, 2, 46,
- 78,252,241, 31,252, 33,127,252,179,223,227, 38, 39,172,201,124,253,248,128,106, 90, 30, 14,103,190,248,173, 31,240,245,235,215,
-220,188,120,193, 55, 15,143,156, 39,143,113, 29,175,190,126, 69,187,187,225,205,241,200, 48,207, 96, 43,178,182,124,179,127,195,
-152, 4,101, 60,132,196,227,228, 57,121, 65,122,190,125,243,150,218, 25,140, 74,228,232,177,181, 93,191,118, 70,107, 25,205, 22,
-255,181,181, 34, 2,157,134, 81,138, 90,200,107,182,182,177,174,124, 13, 19,202, 84,196, 56, 51, 12,211,122, 16, 46,144,153, 24,
- 35,117,219,208,182, 21,198, 58, 78,167, 3,177,136,213, 98, 20, 44,105,140, 1,107,228,227, 48,214,144,114,196,212,138,182,239,
- 57,159,206,132,152,113,181, 46, 7,244,180,102,156, 95,248, 20,194,109, 16, 60,239, 37, 96, 5, 37, 69,218,186, 74, 60,234,229,
-220, 19, 44,181,124, 71, 90,103, 8, 25,198, 73,232,119, 49, 37,178, 54,216,166, 97, 62,159, 37,101,110, 22,226,165, 66,139, 90,
-190,136,212,154,166,102,127, 24,216,108,110, 24, 39,177,167,205, 62, 20,114, 94,162,105, 91,102, 31, 68,179, 83, 86, 13,211, 52,
- 51, 12, 3,207,110,239,248,230,213,107,234,170,194, 89, 67, 76, 23,220,246,114,225,173,235,154, 20,133, 31,209,117, 61,153, 55,
- 88, 43,156,251, 20,229,153,220, 31, 14,188,172, 95, 20, 64,142, 52, 92,117, 93,227,125, 44,196,204, 76,101, 29,179,159, 48,229,
- 34,235,253, 92, 88, 23,138,113, 26, 69,139,163,165,159, 52, 70,113,187,235, 72, 49,136,158,168,170, 57, 28, 79,220,220,220,209,
-182,173, 92, 36, 66,164,239,123,134,225, 36,196,190,170, 98,183,237, 25,134,129,182,235,152,166,137,155,221, 6, 31, 2,167,147,
- 20,189,126, 35,180,184,227,225,200,205, 77,143,171, 28,206,218,130,250,150,206,124,211,111, 10,151,160, 98,156, 38,230,121,150,
-200, 91, 63,227,181,162,109,218, 53,234,181,105,219,146,255, 46,204,250,186,170,152,230, 89, 10,175,207,101,189, 81, 86,170, 90,
-151,122,181,216,254,132,170, 55, 77,179,136,228,194, 36,235, 39,103,139,173,219,150,144,151,101,197, 34, 1, 92,214, 56, 98,193,
-233,138,221, 48,148,144,151,244,100,170,184, 64,155, 40, 53,212,242, 45, 41, 81,223, 73,176,186,238,140,212,211, 99, 47, 95,135,
- 86,148, 49,100, 93,213,162, 80,205,151, 67,123, 85, 38,231,139,114, 57,175, 93,153, 20,210, 92, 18,106, 76,241, 91,162, 18,202,
- 22,210, 79, 41,244,186, 20,215, 5,218,162, 85, 42,194, 57,177, 98, 45,248,240, 84, 80,177,170, 80,216, 76,177,119,248,105,164,
-178, 53, 58, 27, 73,169, 42,246, 45,101, 45, 57,249,210,164,169, 21, 62, 34,170,227, 11,109, 79, 43, 25,197, 11,185, 52, 23,218,
-155, 36,152,153,178, 11, 51, 86,161, 83,193,249,105,168,156, 34, 39, 41,180,181, 19,238,186, 81, 11, 68, 32,162,112,228, 36,129,
- 25,199,227, 25,159, 34,166,170, 65,101, 82,142,132, 0,231, 16, 57, 13,158,172, 12,182,170,100, 15,233, 39, 42, 5, 78,129, 70,
-190, 22,149,213, 52,218,208, 84, 53, 77,235,168,106, 69, 95,215, 56,227, 68,249,239, 68,164, 35,147,196, 72, 85, 11, 1,238,116,
- 62,225,172, 67,105,203,228, 39, 30,246, 39, 18, 22,101, 43, 14,111,223,145, 19, 52, 93, 75,219,212,116,157,140,222,181,134, 16,
- 22,218,158,168, 82, 67,140,196,224,121,220,239,203, 78,175, 64,127,212, 69,112,179, 20,226,172,174,129, 67, 79, 77,231,234,239,
- 48,182,126, 26,197, 42,251,252,244, 9,127,247,229, 66,121, 37,234,252,224,239, 61,221,128,103,117, 21, 87,250,169, 93,119, 78,
-176, 6, 34, 93, 44, 85,121,205, 76, 16,103,199,119, 21,244,191,203,239,169, 43, 11,221,106,117, 75,249,226, 2,184, 2,231,180,
- 1,254,241,223,251, 3,254,251,127,244,143,208,199, 61,141, 49,188,122,247,150,250,230,150,183,127,243,107,190,255,195, 31,115,
- 60, 14,244, 55, 91,206,222, 51,105,205, 92, 53, 28, 30, 30,241, 86, 51, 5,207,225, 52,112,247,252, 37,131, 15, 60,156, 71,246,
-231, 1, 83,215,196,164, 10,119, 33,163,176,248, 41,224,135,137,221, 93, 7,106, 38, 5, 79, 48,151, 93,127,244,129,166,111,120,
-120,124,192, 58,183, 14, 47,172,115, 68,239, 25,134,145, 86,119,104, 35,107,163, 20, 99, 65,116, 58,252,124, 32,196, 88,138,137,
- 76,233,150,110,177,239, 27,198,105, 36,207,179,216,137, 82,166,237, 26, 78,167,211,170, 30, 94,226, 49,155,166,102, 14, 19,155,
-109,207, 48,156, 65, 71,234,170, 17,110,120, 17,150,250, 84,166,122,139, 55,219,232, 53, 16,105, 73,131, 75,139,112, 76, 21,138,
- 88,240, 88,231, 8, 94, 66,102,116,129, 55,101, 5, 49, 10, 68,197, 47,112,156, 34,230, 83, 90,177,217,110,121,247,238, 30, 99,
-109,161,144,230,114,198, 81,178,187, 37,221,236,197,139,231,156,134,145,227,249, 72,204, 2,240, 73,100,249, 58,114,241,181,199,
- 20,100,135,237,106,250,174,227,176, 63,240,242,197, 11, 94,189,126, 3,234,138,141, 62, 77,236,118, 27,180,170,216,239, 15, 60,
-123,246,188,240,235,107,198,113,192, 25,137, 10, 29,167,169, 36, 63,186, 53,129,109,137, 13,141, 81, 50,216, 83,140,168,146, 48,
- 22, 99, 16,209,162, 49,196, 28,217,238,182,101,210,232,139, 51, 71,138,170, 82,154,121, 28,185,189,189, 97,152,102,142,167,147,
- 20,221,178, 50, 16, 28,172,128,107,150, 9, 79, 83, 87, 24,149,169,107, 91, 46,231,134,246,197, 45,227, 56, 49,205, 19,125,223,
-113,107,183,236,247,143, 40,181,161,109,106,201,129, 47, 2, 77,149, 65, 91,137,214,109,219,150,113,154,228, 82, 88, 87,132, 24,
-228, 2, 82,213, 43,108,104,113, 89,180, 77,187,174,194,198, 89, 46, 91, 41, 37,230,201, 23,220,175,172, 64, 86,135,152,177,244,
-253,134,227, 81, 8,154,206, 57, 80, 2, 1, 27,199,145,218, 53,180,133,192, 41,239,191, 94,131,116, 84, 22,125,201,253,195, 97,
- 13,124,201,139,197,243,138, 5,191,136, 29, 83,138,133, 60, 81, 74,105, 86,241, 73,140,234,199, 37,181, 34,100, 90, 14,190,164,
-196, 50,115,153, 76,230, 21,179,186, 36,178,105,173, 36, 13,167,114,171, 85, 99, 9, 93, 89,126,142, 69,213, 23, 74, 36, 93, 8,
-242,195, 7,177, 6,164, 24,203,152, 44, 50, 39,207, 28,133, 93, 28, 83, 40,194,186,132, 82, 81, 4,114,186, 8,228, 84, 94, 85,
-169,210,237, 39, 82, 12,228, 20, 5,173,186,168,218, 83,100, 30, 39,130,151,183,191,124, 60, 33, 37, 98, 22,159,190,214, 6, 99,
- 92,129,190, 44,255,189,124,110, 11,146,213,148,184, 86,158,112,239,245, 50, 15,206,203, 78, 95,198,243,149, 53, 52,206,148, 4,
- 52, 41, 4,105, 77,166,147,155,217,121,154, 57, 14, 19,227, 28, 36, 66,214, 26,106,103,176,194,116,101,156,102, 78,103,241,126,
- 46,197, 68, 84,163,154,174, 50,244,149,102,215, 86,108,219,150,190,171,105,187,138,231,207,110,248,193,247, 62,227,203, 47,238,
-120,118, 83,177,235, 12,155,109, 75,221, 56, 66,244, 28, 79, 39,134,113, 36,248,128,209, 6,227, 28,167, 57,240,234,241,192,215,
-247, 7,134,144, 57, 30, 79,156,143, 7,156, 49, 52,117, 43, 56, 88,107,174,172,108,129,113, 28,240,126,150,207, 39, 37,142,231,
-129,113,156, 73, 42,163,172,190,162, 17,231,171,206,249,146, 53,174,174, 40,135,107,148,174,186,124,191, 62, 73,114, 81,233,201,
-143, 37,208,111, 65, 39,234,171,144,147, 39, 23,131,245,151,105, 77,242, 34,167,171,113,251,149, 17, 94,229,171, 81, 60, 79, 28,
- 27, 31, 67,185,234,114,113,201, 11,203,247, 58, 31,225, 35, 29,250, 71,187,116,190,203,214,246, 84, 39,160,150,224,224,114, 97,
-200, 90, 17, 75, 30,129,203,145, 95,124,241, 5,255,203,159,252, 83,238, 80,196,224, 73, 85,197,187,211,192,235,251, 61,187,187,
-151,140, 83, 96,119,251,140,211,232,121,179, 63,240,246,112,100,127, 60,178,185,189,161,221,238, 56,157, 69, 88,234,209,252,237,
-219, 55,188, 57, 60,178,185, 17,150,247,224, 3, 65, 41,142,195,153,110,211,146,137, 52, 93, 77,221, 84,235,254, 53, 35, 92,119,
- 95,186,215,241, 44,137,101, 41,196,149,176,103,202, 94, 57,150,152,208, 16,101,210,179, 8,145, 98,217,167,215,117,181,158, 87,
- 41, 75, 55,125,115,123,195,233,116,102,179,217, 49, 14, 19, 41, 10, 86, 53, 20, 49,148, 60,151, 98,237,114,149, 35,102, 25,103,
-143,243,136,209,150,221,238,150,217,207,235,248,155, 18,203, 28, 35,160, 12,174,170, 49,214,149,238, 56, 51,206, 19,211, 28,240,
- 33, 49,204,129,243, 28, 56, 79,158,105,138, 12, 99,224, 60, 70,230, 8,131,151,132,197,113, 10,196,164,152, 87,177,154,252, 90,
-124,250,150, 97, 56,243,236,217,141,172, 5,114, 36,144, 37, 27, 1,197, 48,140,108,250,158,121, 22,123,225, 60,138,181,108, 56,
-157,113,149, 67, 41,216,109, 55, 8,150, 60, 96, 16,231, 78,240,129,211,120,230,246,217,173, 56, 7,234,186, 20,142,244, 36, 48,
- 97, 24, 38, 54,155, 13,199,211, 17, 99,117,177, 86,137,238, 40, 2, 85, 85,147, 11,199,189, 42,171,128,156,162,116,243,165, 56,
-203, 88, 58, 10,203,164, 4, 86,237,118, 91,172,214, 4, 31,169, 92,181,118,177, 41, 70,252, 60,113,123,123, 67,136, 94, 38,102,
- 49,177,219,108,208, 42, 19,227, 76,191,145,120,212,221,110,195,195,195, 61,219,157,140,252, 99,105, 24, 82, 18,235, 99,221, 84,
-184, 74,236,187, 77,227,216,109, 27,252,124,102,211,183,108,183,194,177,127, 60, 28,112,182, 18,210, 91,185,244,143,227,136,247,
- 51, 90, 43,218,166,190,154,195, 21,155,223, 48, 22, 55, 65, 36, 37, 89, 9,249, 73, 2,184,154,166,198,106, 45, 92, 5, 96,211,
-183,226,216, 40, 34, 76,103, 29, 57, 73, 94,188,247,129,170,114,107,190, 65, 93,183,116,173, 4,209,132, 56,175,239,183,114, 21,
- 49,200,215,237,176, 63,112, 60, 30,153,231,137,231,207,239,168, 42,183,190, 94, 43, 83,126, 45,232,105,157, 64,106,181,132,174,
- 83, 0, 42, 57, 93,117,221,234,130,227,188,106,156, 84,190, 48,183,151,244,170,180, 22,244,184, 64,185,229,231, 28,158,132,185,
- 80, 2, 4, 98,217,239,197, 53, 11, 61,175,196,174,156, 36,134, 52,133, 64, 10, 81, 94,192,178,155,141, 89,236, 81, 62,151,188,
-224, 24, 32, 5, 20, 30,173,147,116,232, 58,163,244,146,207,156,196,134, 16,203,219,137,130, 80,148,152, 84, 69,237,108,121, 97,
-228,193,244, 81,108, 11,145, 68, 82,153,116,181,123, 50, 37,208, 69, 68, 62,194,134,119, 90,227, 74, 65,151,162, 46, 32, 28, 83,
- 68, 11,228, 40, 93,119,206,232, 84, 14,250, 34,236,179, 74,172, 99, 40,129,178,196, 28,241, 49,224,189, 16,216,230,121,150, 91,
-235, 48, 49,249,136,202,224,200,232, 36,194, 51, 31, 51,195, 48,113, 30,102,148,169, 10, 83, 90,188,233,149,211,108, 91,195,203,
-222,242,249,174,227,217,174,227,197,221,150,187, 93,205,174,183,180, 93,133, 49,137,156, 71, 82, 24, 57, 31, 30,121,245,230, 13,
-223,188,125,199,105,242, 76,115, 96, 28,103, 72,112, 30, 38, 14,227,196, 49, 40, 38,237,200,198, 73, 70, 52,129,202, 10,238,211,
- 24, 35, 64,158, 24, 72, 41,160, 85, 38,132,249,194,222,206,153,113,246,132,245, 50, 71, 81,178,231,213,107,189,228, 12, 25, 52,
- 90,153, 75,196,239,117,113, 95,217,254,185,224,124, 47, 63,148, 14,160,228,146,247, 62,240,125, 45,242,232,167,187,248, 92, 38,
- 50,139,152, 51,101, 72,145,148,194, 10, 61, 89,133,158,197,121,161, 22,139,249, 26, 3,250,137,139,112,185, 96,101, 20, 49, 75,
- 68,238,133, 0, 95,194,126, 83,250, 36, 94,118, 21,157,230,143, 43,236,151,139, 71, 78, 69,143,146,196,158,184, 62, 79, 11,164,
- 66, 43, 28,137,223,222,118,252,139, 63,255,167,108,226,196,233,221, 59, 30, 15, 39,116,183, 97,192,240,249,247,126,200, 20, 18,
-155,155, 27,190,121,251,142,175,223, 61, 96,155,158,113, 42,105,105, 49,114,222, 31,233,250, 27, 30, 79, 19, 95,191,187, 39,148,
-130,180, 63,236,185,127,184, 39, 34, 64,141, 20,188,104, 82, 84,228,230,118,203, 28,230, 85, 20,230, 42, 75,204, 17,101, 12, 89,
- 41, 30,246, 71,156,169, 10, 3, 61,173, 23, 54,235, 44, 93,223, 74, 6,131, 82,248, 89,198,237,214, 86,156, 79,103, 82, 9,207,
- 80,122,161, 91, 66,191,217, 20,156,105,203,105, 63,160, 17, 49,214,133, 60,169, 86,175,186,113,154,170,117,248, 50, 10, 37, 65,
-223,237,120,124, 56,161,144,113,130, 36,159,105, 20,150,156, 52,243,228,169, 43, 1,239,100, 52,198, 57, 66,202,132,164, 72, 88,
-162, 50,132, 44,249, 13, 40,135,213, 13, 73, 91, 18,150, 16, 53, 25, 75,202,197, 78,154, 10,107, 94, 84, 99,132,148,168,234,154,
-211,233, 64,221, 8,127, 34, 38, 1,243,164,172, 36, 47,126, 22,205,192, 60, 69,156,169, 57, 31, 7,156,118, 12,195, 88,190,175,
- 51,109, 83,177,219,116,152,210, 36, 84,174, 34,120, 9,114, 57,141, 39,238, 94, 60,231,254,113,207,221,179, 91,121, 38, 52,229,
-236, 21,152,203, 48,142,180,125,135,182,138,155,219, 27, 41,108,167,145,170,233,196,174,151, 20,113, 14,168, 4,125,211,150,213,
-101,166,235, 26,140, 17,120,214, 56, 78,171,213, 42, 23,187,161,236,219, 35,211, 56,173, 54,184, 37,114, 57,248,145,187,187,173,
- 8, 13, 99,160,109, 43, 32, 16,227, 92,236,198,145,166,117,180, 93,197, 52,141,107,208,142, 54,182,116,245, 66,249, 91,130,102,
-156, 83,232, 28,217,116, 45,190,104, 41,154,182, 99, 24, 38, 14,231, 1,109, 37, 26,119,246,178,243,118,206,173,129, 86,109, 93,
-161,114,166,111,133,163,162,141,140,193,181, 50, 43,240, 75, 40,112,142,121, 18, 5,188,179, 6, 98, 64,229,196,221,237, 13, 93,
- 83, 19, 11, 67,192, 25,187, 78,146, 98, 20, 93,194, 56, 78,204,147, 88,215, 50,137,113, 28, 48, 70, 62,247, 97, 24, 25,206, 35,
- 49, 36,180, 18, 81,228,117,242,229, 69, 84,188,136, 13,175,187,117, 57, 31, 53,159,116, 0, 95, 41,127, 11, 55,217,228, 75,173,
-150,230,168, 28,130,159,136,158, 92,118,162,226,142,189, 14,117, 73, 79, 14,179,165,152, 47, 94,239,101,156,149, 96, 45,250, 75,
-200,135,196, 82, 68,114,156, 73,113,186, 36,169,229, 92,118,226, 25,173,115, 73, 90, 10,132, 40,221,254,228,103,102, 63,227,131,
- 47,251,122,217,173, 87,149,163, 46,225, 16,193, 11,112,127, 81,162,174, 65, 8,165,168, 91, 45,100, 55,163, 86,242,238, 26,137,
-167,175, 33, 60,234, 82, 68, 46, 77,104,225, 79,163, 49,202,172,161, 43,139, 26, 58, 39,137, 89, 93, 16,178, 62, 70, 25, 47,206,
-158,217,123, 34, 34,182, 74, 57,147, 98, 98,154, 61,135,195,192,227,195,137,217, 39, 52,134, 24, 34, 42, 69,172, 78,108, 58,199,
-203,103, 29,159, 63,111,120,118, 99,233, 58,205,205,109,205,203,231, 45,109,157,200, 97,228,254,225,200, 95,255,237, 61,255,246,
- 63,189,225,255,250, 15,191,226,255,253,255,126,205,175,223, 61, 74, 1, 31, 70, 78,195,192,105, 24,184, 63,156, 56,205,153,179,
- 79,156, 39,143,182, 22,235, 28, 77,219,210,245,221,130,234, 39,248, 64, 10,137, 28, 50, 26,141,202,162,252, 92, 70, 72,222,135,
- 15,196,231,151,238,245, 19,195, 33,117,125, 33, 92,138,185, 92,168, 62,174, 79, 83,159,236,112, 63, 9,112,201, 79,135,236, 23,
- 45,200,127,254, 90,234, 99,221,247,178, 2,200, 43,184,233, 19, 16,153, 79, 69,163,126,228,227, 80, 75, 38,193, 50, 21, 91,130,
- 57,149, 92, 32,178,181,164,178, 46,170, 83,226,101,229,248, 31,254,244,207,216, 88,203, 56, 13,156,253,196, 15,126,240, 67, 84,
- 86,124,254,197,151, 4, 5, 94,101,134, 20, 24, 83,194,182, 45,135,211,192,233, 60, 80,183, 45,191,250,230, 27,206,100, 94, 31,
- 31,121, 28,207, 12,193, 19,114,226,116, 58,201, 8,177,170,215,164, 49,173, 20, 77,211,174,250, 19,239, 61, 77, 91, 23, 90,165,
- 38,167,139, 10,123,201, 21,208,214, 74,161, 47,221,199, 2, 51,186,142,228,156,231, 89, 18,210,172,227,241,241,145,205,102, 83,
- 68, 84, 10, 87,153, 85,113, 60, 77, 51, 99,201,224, 22,216,137, 93,227,101,181,213,100, 36,150, 84,101,240,147, 80,224,118,187,
- 27,246,251, 67, 25, 21,107, 33,173, 69,153,212,229,162,177,168,107, 17, 42,133, 20, 49,214, 72,162, 98, 73,145,147,149,146, 90,
-125,233, 74,169, 50,230, 13, 69, 47, 96, 47,209,213, 43,105,205,202,200,186,170, 57,159,103,154,182, 67, 41,195, 56,206,171,126,
- 36,167, 37,238, 88,196,117, 18, 34,149, 56, 28,142,124,254,249,231, 76,255, 63,107,111,214,100, 87,150,158,231, 61,107,218,211,
- 25, 50, 19, 9,160,166,174,234, 46,118, 53, 73,113, 38,109, 7,109, 93, 73,214,133,111,245,147,244,183,124,225,144,239, 44,135,
- 34, 44, 89, 38, 21,146,217,236,177,170, 26, 83, 78,103,216,227, 26,124,241,173,189,207,201, 4,208, 44, 69,184, 43, 50, 80, 3,
- 26, 64,102,238,189,214, 55,188,239,243,246, 29,198,104,246,199, 30,109,172,136,237,154,154,122,213, 8, 92, 38, 36,172, 43,240,
- 97, 90,206,196,148, 60,218, 40,182, 23,235,101,117, 40,207,144,206,224, 30, 41,127,174,159, 93,209,181,109, 38,101, 38,166,113,
-194,230,196,183,132, 34, 7,117,230, 32, 41,179,116,125, 74, 33, 10,113,192,216, 76,147,107, 26,134,126, 16,224, 88,134,250,184,
-162,192, 90,151,153,255, 45,117, 45,220,139,162,112,121,127,221, 51,140,195, 18, 4, 5,208,117, 29,239,222,221,176,217,110,176,
- 86,225,172, 89,194, 88,140, 49,148,101, 73,223,143, 24,155,185,239, 11,200,102,139, 82,208,181,199,133, 99, 63, 71,157,206,163,
-236,162, 40, 40,179,173,205,123,159, 35, 99, 85,158,242,200,121, 83, 21,229,226,115, 47,138, 34,131,120,138,197,157, 48,140, 61,
-155,237, 70, 34,112,243,154, 49,165,176,100,163,207, 9,112,195, 48,101,159, 58,217,205,225,241,115, 52,107, 94,201,204,246,198,
- 25,190,214,247,253, 71, 29, 55,243,125,170,148,250, 16,251,253, 76,245,126,150,104,165,158, 68, 85,235,147,214,231,163,110,217,
-101,238,159, 78, 23, 93, 8,129,160,195, 35,145,145, 28,122,143,237, 76, 41, 65, 72, 2, 95,152, 75, 91,163,158, 56,227, 83, 86,
-227, 39, 45,127,198, 28, 59, 39,242,186, 64, 76,158, 41,140, 57,187, 87,212,165,129, 68, 76,106,129, 68, 24,163, 49,214,192, 36,
-192, 11, 12,121,140, 44, 76,250,209, 79,120,151, 61,165, 89, 31, 48,171,237,245,185,104, 75,205, 36, 59,181, 68,227, 45, 7,237,
-147, 9,243,204,241, 93, 8,100,103,187,185,164, 51, 81, 45,201,225, 60,197, 68,136,185, 18,155,225, 3, 73,124,176,109, 63,114,
-232, 60,163, 7, 27, 34,227, 56,162,147,166,136,208, 20, 21, 23, 43,199,170,138,172, 43,233, 20,154,218,225,156,102,234, 70,190,
-253,246, 53,255,254,239,127,201,175,127,119,207,164, 36, 59,122,211,148, 92,109,215,244,193,176, 26, 35, 77, 93,202, 3,109, 11,
-118,195,192,175,223,236,121, 56,180,148,235,107,108, 81,136, 32,169, 17,168, 68, 97, 13, 70,153, 60, 82,155, 80,218, 48,141,158,
- 48, 9,108,163,109,251, 28, 94,145,137, 72,243, 14,248,145,212, 93, 45, 79,146,226, 20,153,123, 26, 77,207,147, 32,181, 88, 42,
- 83, 58,223, 49,235, 39, 86, 76,181, 48,206,159,190, 7,122,201, 23,124, 74,174,251, 39,175,234, 31,108, 71,211,217, 42,244, 84,
-193,174,206,242, 17, 62, 70,141, 91,222,141, 89, 40,255, 1,220,237,233,113, 18, 98,156, 81,138,100, 12,104,133, 79, 96, 81,216,
- 24,185,114,154,127,249,231,127,206, 31, 62,127, 65, 49, 13, 68,149,184,184,126,134, 54, 6,107, 29,117, 89,243,234,237, 91,190,
-248,250,107, 94,223,220,242,208,247,220,238,118,172, 54, 91,162, 54,124,255,230, 45, 94, 43,190,191,187, 97,152, 18,186, 46, 73,
-214,210,247, 45, 67,182,217,148, 69,205,224,167,172,230, 21,255,173,214,150,190, 23,223,184,181,162,228,213,202, 96,109, 65,223,
- 75,247,177, 90, 55, 76,126, 90,234,187,217,119,174,242,190,119,238, 70,180, 49,180,125, 71,189, 94, 51,236, 14,114,105,207,244,
- 63, 29,104,154,102,177, 20,137,224,200,136,159,125, 85, 51,140,189, 88, 56,157, 88,216, 98,144,175,222,126,119,192, 88,184,184,
-184, 32, 38,197,161, 61, 8,233, 50,167,216,197, 20,137, 83,194,213, 25,192, 82, 56, 66,128, 66,201, 65, 43,233,100, 2, 12, 9,
- 62,162,139, 76,157, 59, 35, 14, 90, 99, 69,228, 86, 23,180,199,142,209, 79, 50,250, 21, 47, 44,198,104,134,110,144,157,120,136,
-146, 23,158, 5,116, 50,198,117, 75, 38,134, 66,136,148,115,178,217,229,229, 37,206, 57,209, 13,168, 72,140,150,195, 97,207,213,
-213, 5, 87, 87,219,165,168, 0,208, 86, 49,142,131,164,193, 5,225,163, 75, 68,114, 65,215,143,226,152,143,105, 17,151,125,242,
-220,211,212, 21,101,225, 80, 72,196,233,186,174,185,187,185,229,234,234,146,190, 31, 9, 94,138,181,121, 15, 28,188, 71,107, 69,
-213,148,132, 20,114, 22,187,162,109, 91, 94, 60,127,193,209,118,236,247, 71,202,170,166,235,123,201,113, 55, 10, 91, 20,164, 97,
- 56, 1,117, 98,162,105,154,133, 69,191,223,239,185,184,184,200,233,142, 98,111,123,253,250, 21,159,125,246, 41,183, 55,247,108,
- 86, 53,211, 52,177,123,216, 97,172, 97,181, 90,211,181, 71,234,178, 98,229, 28,109,223, 19,166,145,151,215,207,121,216,223,211,
-247, 45,113, 26,185,186,186, 98, 24,134, 5,128,164,148,228,106,104,163,179,211, 40,187,190,148,216,201,134,110, 92,132,157, 50,
- 1, 22, 86,255, 20, 2, 49,235, 12, 4, 31, 28, 40, 42,241,205,247,253,152, 57,250, 35,214, 22, 89,103,112,178,208,196,140,239,
-157,178,163, 66, 92, 18,249,217,207,169,155, 33, 37,246,251,125, 78,223, 19, 65,233,178,254,206,238,155,115,124,180,229, 3,146,
- 32, 69,122,143, 82,181, 36, 84,229, 51, 45, 60, 69,120,158,129,105,210, 98, 67,122,212,170,230, 79,104, 34,230,135,246, 81, 71,
-127,242,136,136, 34,147,147,207,120,249, 51,133,176, 32,242,100, 12,126,202,102, 87, 24, 25,219,230,160,149, 20,101,127, 78, 12,
-185, 96,200,187, 86,201,121,203, 74, 86,121,253,140, 22, 56,193,228, 61, 54, 56,148,201,194,148, 24,137,227,192,218, 25,162,229,
- 44, 47, 93, 47,160,153, 83,238,149, 90,252,168, 42,171,223, 77,222, 35,170,243,245,111,134,205,204,171, 1,173,165,218, 77,137,
-188,195, 82,203,133,174, 80,248, 40,126, 83, 99,178, 63, 54,138,128, 39, 68, 24, 99,162,157, 2, 99, 12, 52, 54,211,182,198, 73,
- 34, 29,189,199,146,176, 74, 83,104, 67,153, 63,199,113, 76,252,215, 95,189,229,223,254, 31,127,199,223,253,234, 45,237,100, 72,
- 86, 81, 87,150,109, 83,113,181,243,108,154,150, 85, 45,251, 34,239, 39,140, 43,241,170, 96,194,177,189,184, 98,253,236, 57, 1,
-197,221,195, 61, 93,223, 73,164,162,145, 75,114, 10, 18,150,224,167, 72,215, 15,248,148,232,253, 68, 55,244,115,235, 45,223, 10,
-157,139,178, 57,100, 67,197, 71, 45,252, 92, 16,129, 90, 2, 91,210, 12,119,103, 94,227,228,108,245,200, 50, 5, 58, 69,157,158,
-136,116, 75, 62, 59,115,241,120,190,175, 78,239, 67,224,207, 89,242,249, 57,148, 41,110, 90, 2, 81,126, 72, 15, 31,127,143, 69,
- 77,125, 96,114,240, 52,172,229, 67,225, 45, 42, 61, 14, 72, 94,236, 23, 97, 22,225, 65,152,159,107,160, 81,154,127,245,215,127,
-197,255,248,135,127, 8,199, 61, 87,215,207,232,195,132, 93,173,248,197,175,127,203,197,197, 53, 97,152, 80, 73,243, 95,255,223,
-159,243,110,183,167,155, 38,108, 89, 17,208,132,236,163, 78, 10,238, 31,246,188,252,244,115,238,118, 7, 30, 30,222,162, 52,184,
-178, 36,250,147, 61,107,202,251, 69, 65,113,202, 46,187,110,106,146,150,145,165, 51,178,103,236,186, 65, 88, 14, 85,157, 51,189,
-167,124,145,157,112,152, 90, 75, 76,168,202,251, 87, 63,201,251,219,182,189,128, 84,148,164, 4, 66,202,240,147,145,174,235,243,
-136, 60,176, 90, 53,140,126,202,108,115,187,112,208,139,162, 96,191,219, 49, 77, 35, 87,235, 43,137, 55,157,197,171,117, 73,223,
-245,216,252, 62,218,194, 9, 73,206,251,101,194, 88,175, 26,180,177, 12, 97, 98,202, 9,145,218,230,142,187,107,115, 65, 18, 41,
- 11,161, 64,134,156, 68, 7,176, 63,118, 25,211,154, 50,210, 54, 98, 50,195, 66,172, 93,178, 14,216,110,214,244,237, 64, 76,137,
- 49, 39,185, 37, 37,214,184,117,211, 64,138,188,126,253,154,151, 47, 95,114, 56,182,196, 8,125,223, 49, 78,138,151, 47,159, 17,
-163,103,187, 93,113,127,191,231,242,162, 33, 50, 49,180,178, 63,190,126,246, 44, 79, 73, 36,167,189,170,106, 64,146,228,116,126,
-238, 14,199, 3, 69,105,115, 74,155, 4,163, 92, 95, 92, 73,209,225,196,239,125, 60, 30, 72, 57, 79, 62,165,124, 30,171,236,155,
- 31,134,156, 27, 46,168,235,113,236,169, 43,199,241, 40, 58,143,110, 28,113,174, 88,236,204,226, 99, 63,112,113,113,137,143,137,
-205,102,179, 20,198, 51,245,109,142,231,125,246,236,138,227,241, 64,215,181,252,248, 39, 95,242,171, 95,254, 82,232,152,182,204,
- 74,248,130,242,210,113,119,115,195,139, 23, 47,168, 11, 97,203,147, 2,207,175,174,104,219, 22,239, 61,183,183,183, 98,139, 35,
- 49, 12, 82, 88, 37, 4, 85,172,180,202,148,188,120, 70,129, 84,203,179, 57,249, 41,195, 98,170,101,146, 52,255,156, 37, 40,199,
- 26,138,210, 50,249, 97,233,180,199,209,103, 69,188,201, 1, 47,146,216,198,252, 76,164,176,232,120,130, 79,132,100,196,138, 55,
-250,220, 8,126, 36,218,249,108, 53,103, 67,182, 51, 24,117,150, 83,117,238,123, 61,139,171, 92, 82,212,180, 38,233, 60,242,139,
- 31, 83,207,171, 71,243,126,137,136, 19,193, 84,204,187,198,112,118,160,205, 23, 94,204, 23,186,236, 34,197, 71,174,114, 48,139,
- 85,224,116,162, 48, 9,171, 2,133,145,127,214, 42,123,250,146, 33, 37, 3, 73,118, 59,130, 37, 21,132,163,210,114,200, 73,132,
- 33, 11,215,217,135,184,236,237,114, 38, 33, 49, 38, 98, 16,193, 94, 28, 6, 54, 85,193,182,114, 34,252, 35,200,195,155, 1,181,
-106,217, 96, 36,180,210,146, 0,167, 78, 60,231,185,151,215,203,232,248,236,235,178, 80,203, 78,200, 81, 53,199, 75,166, 68,152,
- 34,131, 15, 18, 64,145,192,135,136, 53,150,148,180,216,217,124,160, 29, 71,146, 49,172, 54,107,234,186,100,154, 38, 44, 30,131,
- 70,133, 72,138,178,223,215, 86,252,210,191,252,246,134,255,245,255,252,207,252,199, 95,188,163, 79, 21, 30,141,138,138,190,131,
- 93,215,243,246, 97,164, 46, 45, 77, 41,162,151,162, 44,216,108, 43, 46,182, 13,206, 22,216,216,227, 71,121, 97,199,105,192, 25,
- 77,215,247,242, 96, 59, 1, 20, 77,163,167,235, 69, 15, 48,133,200,113, 24,241,103,143,136, 49, 38, 79, 35,210,147, 78,155,179,
-148,189, 39,194,177,133,119,172, 30,101, 17, 44, 62,241, 39,232, 84,158,178, 19, 84, 6,135,132,244, 65, 78,252,153,172,253, 20,
-150,154,167, 76,105,241,125,103, 21,125,142, 7,126, 44, 84, 73, 31, 28,169,127, 80,181,126, 70,173, 91, 8,118, 79, 2, 93, 30,
-133,196,168, 83,108,241,194,115,152, 65, 76, 90,101, 69, 64,182,130,166,132, 78, 18, 10,212, 36,248,235,111,190,225, 47,191,252,
-138, 75,107, 57, 30,142,132, 8,211, 20,249,213, 47,127,141,110, 86,252,238,221,141,132, 24,217,146,227, 94,132,140,159,254,232,
- 71,188,122,251,142, 99,219,209, 15, 35,201,104,234,186,228,147,231, 47, 37, 42,115, 28,169,138,130,245,197,134,221,110,151, 41,
-111,158,203,203, 75,222,222, 63, 16, 83,228,112, 60, 48,140,131,228, 82, 23,197,242,253,242, 49, 18,198,145,105,156,184,188,220,
-230,177,176,128,104,180, 53, 20,115,247, 97,204, 2, 23,177,206,190,151,185, 94, 55,117,126,143, 34, 69, 37, 99,214, 16, 38,234,
-186,100,236, 61, 69, 89, 18, 73,140,126,164,168,202,147,213,111, 57,148,125,134,214, 20,185,112, 16,109,200,106, 85, 51, 14, 3,
-227, 52,161, 84,100,189, 89,179,219, 29, 50,234, 56,130, 86, 98,201,204, 84, 49,148,216,206,156,117,121,100, 42, 10,121,239, 3,
-101,153, 69,125, 85,201,241,120,160,174,155, 92,196,207,128,150,184,156, 59,218, 36,124, 28, 49,133, 37, 41, 89, 53, 22,165, 97,
-154, 2, 42,164,229,153,153, 11, 11,178,143, 95, 34, 75, 29,227, 36,176,149,232, 3, 55, 55,247, 92, 95, 95,226,125,100,181,138,
-180, 93,203,229,213, 22, 63,121, 52,145,187, 91, 81,146,107, 99,184,127, 56, 72,238,121, 81,178,217,172,232,250,142,171, 43, 25,
- 85, 63, 60,220,114,121,121,137, 82,210, 41,222,221,223,242,252,249,245,162, 97,152,133,132, 49, 68,146,159, 71,199,130,139,246,
-126,202, 22,174, 18,107,101,239,111,148,161,112, 14,109, 69,111,180, 59, 30, 88,215, 13,174,176,140,121, 79,189, 63, 28,242,254,
-187,163,201,136,215,178, 44,217,239,247,146, 16,151,139,179,148,207,111, 66,224,199, 95,126,197,183,223,126, 71,219, 30,105, 86,
-107,246,251, 61,207,175,159,113,121,121, 73,219,182,108, 54, 27, 25,189,119, 93, 22,197,105, 46, 47,179, 74,126, 24, 78,133,164,
-158,177,172,115,106,218, 64, 89,214,103,156, 11,205,126,191,227,242,242, 10,159,117, 66,211, 36,147, 19,107,141,104, 27,242, 59,
-127, 2,209,136, 96,110,118,105, 8,226, 87,236,173,109, 43, 17,180,195,228,115,208,147,172, 50,130, 23,166,193,204,143, 7, 40,
-140, 93,180, 59,231,103,205, 57,140,106,233,220,159,166,165,235,244,129,225,226,251, 14,159, 69,237,158, 22, 75, 82, 92,236, 93,
-143,227, 81,103, 35,153,140,125, 38, 47, 73, 69,115, 78,242,188, 11,152,213,166, 11,205, 75,202, 88,201, 36, 87,145,210, 42, 74,
- 27, 41,180,167, 80, 19,181,243,148, 54, 80, 23,145,186, 76, 20, 38, 0, 19, 41,139,205,124, 8, 12, 83, 96,152,252,242, 5,213,
- 89,129,124, 14, 36, 9, 62, 64, 2,103, 11, 52, 50,118,153,134,137,161,159,152, 38,177, 37,133, 40, 99,112,159, 32, 42, 9, 31,
- 89,246,230,249,195, 24, 35,140,105,165,196,155,110,197,151,110,140,206, 74,124, 50,164,128, 69,160, 50, 23, 47, 79, 69, 15,126,
- 10,140,163,103,202, 23,186,207,187,180,144, 25,234, 62, 37, 17,201, 13, 3, 65, 37,154,205,138,102,211,176, 90,213,108,214, 13,
-171,170,102,211,212,108, 86,226,215, 77, 42,128, 78,188,189,123,224,223,254,251,255,155,255,248,203, 87, 28,116, 77,139, 34, 89,
-141,199,224,113, 76,148,244,177,160,245,142, 99, 40,104, 83,197, 64,195,161, 75,220,239, 91,218,174, 99,179, 90,209, 84, 37, 85,
- 85, 82, 22, 57,109,201, 24, 92,233, 40,235, 42,219,212, 20,211, 40,156, 47,195, 13, 0, 0, 32, 0, 73, 68, 65, 84, 47,117,136,
-114,224,207, 89,232, 42, 79, 50, 84,246, 28,207,207,135,202, 35,151, 57,203, 92,127, 96, 43, 62, 7,106, 60, 46, 22,207,224, 11,
-203,247,246,164,234,148,119, 37, 46, 10,247,247, 4,116, 89, 47,162,211,123,255,233,212,173,159,143,244, 19, 63, 72,181,254,209,
- 29,123, 60,165, 15,170, 15, 90,225, 30, 19, 22, 23,136,140,210,153, 23,158, 63,148, 89,138, 13, 61,227, 76,115,125, 89, 38, 40,
-135,137, 63,253,209,231,252,171,191,249, 43,190,184,184,160, 41, 43,202,139, 13,177, 44, 24,162,226,221,221,129, 55, 55,247,152,
-178,166, 29, 35,119,119, 59, 54,151, 87, 84,171, 53,111,239,238,105,187,158,139,139,173,136,143,162,236,190,159, 93, 93,113,247,
-238, 29,171,170,160, 42, 28, 70, 65, 89, 58,172, 49,124,241,249, 23,140,227, 72,138,137,170, 42,105,143,123,188, 31,169,155,154,
-178,172,240, 65,188,217,109, 55,240,176,219, 83, 84, 98, 27,115,206, 73, 90, 91,240, 89,131,225,151, 92,131,243,226, 45,132, 64,
- 85, 85,188,123,247,142,237,118, 75,204,251,203,178, 46,101,108, 31, 4,216,161,243, 88,187,170,107,142,237,145, 85,211, 44, 74,
-225,105, 18,213,248,126,127, 36, 69,121,231, 83,132,105,244, 12,195,192,170,169,232,142, 71,166, 81,132,125,214, 74,178,214, 52,
- 78,139,231, 88, 8,101,217, 22, 69,162, 89,173,228,157,205, 7,120, 34,219,211, 20,139, 5,106,204, 41,133,117, 93, 81, 88, 33,
- 77, 46,156,251,232,137, 41,102, 12,172,146,216, 78, 29, 25,199, 78, 44,102, 90, 99, 51,175,194, 25,139, 31, 60, 67, 39, 22, 87,
-173, 13, 55, 55,119,108, 86,107,225, 82, 88,139, 85,134,238,112,164,114, 21,165,117, 92,110, 86, 84,133,193, 89, 75, 85, 53,172,
- 86, 27,180,182, 60, 60,236,177,198,240,226,197, 11,180, 22,133,123,159,125,218,135,195,145,126, 28,104,154, 21,119,119, 55, 84,
- 85,193,231,159,127,142, 82, 98, 75,155,166, 9, 87, 88, 92, 81,228,104,214,220,161,142,163, 76, 70,227, 76,124,148,172,240,113,
- 58,165,150, 53,171, 6,231, 44,171,213, 74, 26, 16,107, 57, 30,164,115, 46,235, 44,198, 51,102, 1, 15, 25, 99,114, 55,205,114,
- 95,180,173,196,169,238,247,123,190,253,246, 91, 72,145, 47,127,244,185,100,162,143,114, 73,223,223,223, 83, 85,245, 18,119, 90,
- 22,197,130,158,157, 98,224,216,119, 2, 10,178,134,213,122, 35,112, 31, 91, 80,215,141, 52, 90, 49,178,106, 42,130, 31, 37, 76,
- 43,211, 70,103,162,157,206,191, 86, 8, 97,233,252,157,179, 56,103, 41,138, 98,217,157,119, 93, 39, 43,216,148,112,198, 82, 24,
- 71,229, 74, 9,136,138, 18,187,107,116, 33,226,204,164,113,182, 60, 27,165,235, 60,197,157,131,192, 30,223,153, 39, 10,235,227,
- 38, 64,127, 80, 48,148, 62,178, 53, 76, 31,243, 4,167,143,118, 39,143,144,154, 49,226,195,136,247,227,123,127,184,115,239,122,
-204,222,116, 9,225, 12,194,105,215,137,202, 6,106,231,169,138, 64, 93, 66, 83, 65, 93, 26, 10, 43,180, 54, 31, 35,173, 15,236,
-251,145,187, 99,199,253,177, 99,223, 14,180,227,196,224, 35, 99,144, 32, 7,137, 16, 61,237,182,141,177, 25, 51,105,240, 62,102,
-111, 43,184,178, 98,181,185, 32,105, 67, 63,121,198,204, 84, 94,168, 51,234,148, 23, 47,214,182,211,143, 38,123,107, 77,166,101,
-205, 63, 71,101, 2,209, 41,103,155,211, 14, 94, 25, 64, 19, 82,100,156, 70, 70,239,241,121,167, 62,133, 72,200, 49,141, 73, 18,
- 31,152,124, 66, 69, 40,172,101,234, 91,218,118,143, 78,145,186, 80,212, 78,177, 93, 59,154,181,195, 84,142,195, 16,248,119,255,
-233, 31,248,127,126,254, 61, 93, 44, 24,163, 38, 97, 22, 11,159,143, 17,143, 34,106, 71,208, 78, 20,188, 72,206,188,115, 5,117,
-179, 98,187,221, 74, 62,252, 52,176,170, 43,154, 74,128, 12, 85, 85,177, 94,173,104,154, 74,224, 22, 69,177,116,224,147,247,146,
- 33,172,222,139, 25,201, 23,183,122,124, 33,159, 63,123, 31,124, 14,213,146, 42,245,248,209, 60, 83,112,158,117,233,231,100,194,
-167, 44, 25,217, 26,157,172,107, 39, 78, 58,232,116,234,160,197, 22, 25, 31, 65,135, 62, 28,174,242,131, 21,116,121, 2, 32,223,
-199,148, 11,197,164, 78,255,156,148, 38,207,252, 79, 85,116, 22, 88,165,217,113, 50,107, 11,114,192,235,188,100,176, 33,242,213,
-213, 21,255,203,223,254, 15,188,168, 10, 76,140,180, 93,143,118, 5,175, 30,118,180, 40, 76, 81, 51, 13,145,155,187, 61,177, 44,
-137,165,227,174,109,185,239, 59,246, 93, 75, 81,150,220,222,220, 82, 89,203,139,171, 43, 46, 47, 54,124,255,250,123,202,170, 16,
-213,118,140, 12, 93,203,231,159,188,164, 42, 28,199,221, 3,199,195, 1,235, 44, 33, 76, 76,190,199,149,134,110,232, 8, 41,209,
-182, 3,253, 48, 17, 35, 98, 11, 51, 70, 98,134,179,120,168, 40,138,197,254, 56,219, 50,141,145, 9,147, 50, 58,231, 89,123,233,
-190, 71,217,135,206,194,161,166,169, 25,199,129,170,170, 25,199,137,245,118,205,126,255, 64,211, 52,184, 92,120,198, 24, 41,140,
-163,111,123, 8, 9,165, 13, 38,147,200,108, 81,230,177,125,129,159, 70, 10,235, 8,147,160, 69,199,113,200, 65, 67, 50,161,113,
- 86,194, 62,186,126,200, 64,154,140, 89, 77,208, 30, 91, 9,129, 9, 81, 70,203,200, 69, 60,141, 35,206, 25,156, 53, 20,133,149,
- 51, 65, 33,162,172,164,176,153,161, 30, 66,228,112, 56, 96,140,197, 21,142,237,246, 2, 98, 98,221, 52,212,165,131, 24,168,171,
-138,113,244,164,152, 24, 7,207, 56, 76,248, 16, 49, 86, 45, 0,153,170,106,248,249,207,127,201,197,197, 5,214, 9, 11,226,205,
-155, 55,172,215, 13,117, 83,242,252,249, 21,253, 48,240,238,230, 29,205,170, 98,123,181, 69,233,136,177,134,209, 7,124,128,105,
- 74, 57,144,198,208,118, 61,195, 48,177,189,216,208,182, 50,150, 79,217, 19,239,115, 90,221, 60, 65,216,172, 86,226, 40, 9, 17,
-107,140,104, 44,148, 69, 41,203,110,119,160, 61, 30, 41,157,101, 26,122,154,170,162,159, 70,108, 89,112,104,123,124, 76,172,183,
- 27,142,199,227,130, 84, 85, 74,229,207,169,226,120,108,151,226, 74, 68,113, 21,187,221,158,227,241,200,106,181,162, 44, 10, 66,
- 16,132,174,113,150, 87,175,223, 8,206, 91, 9,100,168,105, 42,154, 92,228,141,147,167, 61,118, 76, 99,224, 97,183,163,237, 58,
-142,199, 35, 36,104,234, 26,231, 10, 66, 72,203,202,166,174,196,242,235,156, 35, 32,176,153,170, 42,113, 70, 50, 2,116,130,210,
-186,211,234, 83, 41,116, 74, 52,101, 69,140, 57,200,203,203,228,169, 44,203, 60,133,144,166,178, 42,203,229,252, 59, 30,143, 57,
- 30,251,100, 93, 83,153,142,122,178, 73, 63, 62,119,100, 50,116, 74,194, 52,206,152,127, 51, 19,145,150,191,212,227,196, 10, 53,
- 43,223,231,161,179, 62,177,221,245, 76,251,210,106,145, 16,205,254,236,243, 99, 88, 43,189,236, 69,140, 22, 28,233, 83, 65, 16,
-249, 11, 33, 15,136,140,138,204, 98, 61,131,210,142,148, 69,162, 42,228, 50, 47,173, 4,161, 56, 43,123,191,193, 39,238,246, 29,
- 55,247,123,110,238, 15,236,143, 61,253, 20,241,249, 82,244, 25,130, 50,249,144, 47,119,137, 93,149,210, 65,225, 67,146,138, 27,
-197,106,221,176,222,174, 89,175,106, 12, 9, 21, 39,170, 66, 94, 74,149, 47, 99,147, 47,116,163, 69,121,107,140,116,233,206,168,
- 76,199,178, 88, 35, 35,121,107, 52, 54,131, 14, 78,170,247, 51,200,238,108,247,203, 95, 11, 31, 68, 97, 26,209,248,236, 48,168,
-115, 87, 52, 69, 56, 12, 19,111,110,118,236,143, 3,245,122,131,210,112,220,223, 67,240, 52,133,230,243,103, 21, 95,189,104, 40,
-108,196, 71,197,127,254,199, 87,252,111,255,238,191,240,253,109,192,211,144,148, 67, 37,233,178, 83,182,152, 24, 43, 15,109, 97,
-173,116, 20, 6, 44, 1,149, 2,195, 48,112,220,239, 56, 28,118, 88,235, 88,111, 47, 24, 70, 15, 49,113,121,177,101,181,146, 11,
- 62,133,196, 52, 76,210, 13, 41, 37,153,241,211,116,118,207, 42,206,128,107, 11,104,102,185,104,151,121,247, 28, 86,240, 88,153,
-161,158,116,199,239,217,192,102,167,246, 57, 17,137,147, 24, 36,157,161,102,207,152, 54,239,219,223,150,191, 17,181,180, 58, 75,
- 31, 84,185,154, 75,191,103,247,253,209,203, 92,157,222, 49,149,139,188,223, 87, 16,159,160,184, 58,143,232,212, 73, 31,160, 82,
-118,165,204, 57,220, 10,157, 34, 23,198,241,175,255,229,191,224,235,103,151,216,177,199,143, 35,171,139, 11,238,118, 7,188, 45,
-248,254,221, 45,171,102,203,212,203, 36,104, 48,138, 95,126,251, 61,155, 23,215,188,221,221, 99,139, 66, 32, 72, 49,241,236,242,
- 2,165, 21,251,246,200, 20, 60,125, 86, 35,239,246, 15,160, 18,187,251, 7,246,187, 29,133, 43,216,183, 61,117,211, 72,192, 72,
-244, 76,126, 68, 27,205,241,112, 16, 60,114, 81, 96,172,202,158, 98,185,164,186,174,149,247, 34,175, 58, 66,144, 93,111, 93, 55,
-103,130, 55,217, 81,142,121, 28, 57,228,108,130,178, 44,115,114,149, 40,236,155,186, 17, 63,187,115,132, 24, 40,202, 2,109,140,
-232, 62, 50,213,107, 26,252, 50,182, 95,109, 54, 36,230,245, 81,192,185,172,158,238,164, 99,189,122,118,201,187,183,239, 68,120,
- 27,163,160,167,141,202,208, 22,143,118,194, 40, 31,250,129, 24,230, 51, 48,101, 70,187,120,146,171,162,160,235,123,156, 53,172,
- 55,141,216,112, 99, 90,128, 44, 85, 41,222,111, 57, 63, 12,222,139, 26,127,191, 63, 74,241,161, 68, 3, 52, 83,241, 98,136,143,
- 46, 1,242,126,119,166,115,134, 32, 74,251,178, 44,232,186,150,205,102, 69, 74,129,195,225,184,116,154, 85, 41, 5,212,177,149,
-113,244,122,179,102,189,222, 48, 77, 81,132, 91, 83,192, 79, 19, 69, 85,176, 94, 53,220,221, 61,176, 89, 11,155,189,239,142, 50,
-165,171, 10,110,111,111, 36,113,172,105,168,171, 98,137,203,174,202,154,224, 35,222, 7,234,186,146,232,211, 36, 28,120, 97, 22,
-200, 25,208,181, 3,202,104,218,182, 91, 24,247,199,182, 99,181,106,150, 17,246,220,137,214,117,205,225,112,148, 64,152, 76,214,
-148, 40,103,185, 92,171,170,226,246,238, 86,116, 54, 74,177,106,214,248, 16,216,239,143,108,183,235, 69,227, 98,173,149, 21,149,
- 49, 11,253,180,170,100,173, 19, 67, 32,134,144, 93, 21,230,209,185, 49, 39,253, 25, 99, 51,106, 89,196,212,214, 88,166,105, 92,
- 28, 0,243, 62,125,142, 95,205,176,136,252,245,200,133, 18, 51,154,183,100,202,194,206,201,135, 37,236, 73,127, 32,220, 41,197,
-240,104, 77,119,190,174, 59,223,249, 43,165, 48,206,184,127,115, 26,119,170,133,169,206, 83,181,251,252,139,104,136,231,151,122,
-206,131,125,250,243,230,206,104, 62, 12,173, 54, 20,174,164,176, 37,214,184,133,143,172,208, 39, 21,116,182,252, 68,239, 69,144,
-102,192,153, 68, 97, 19,133,133,210, 69,170, 18,234,210, 82, 59, 67,229, 52, 70, 71,146, 74,244,163,226,219,183,123,254,225,183,
-111,248,238,221,142,219,195, 68, 59,105,250, 73, 17,130, 40, 20,167,224, 25,130, 92,242, 62,137, 37, 35, 36,185,216, 67,138,130,
-153,140, 19,218, 70, 46, 47,214, 92,108, 86, 40, 13,227,208, 67,244,172,202,130, 50, 39,191,153,156,176,102,102, 5,189,209, 88,
- 45, 1, 41,165,179, 20,198, 96,181,150,203, 49, 91, 50,140,145,189, 13, 90,157, 93, 28,144,244,201, 83, 28,179,254,123,166, 79,
-161, 5,242, 31, 1,235,196, 63, 27,147,226,208,245,188,187,187,231, 56,193,243,207, 62,229,226,242, 18,167, 13, 86,121,182,101,
-226,143,191,124,206, 39, 87, 53, 58, 77,220, 61,244,252,239,255,215, 47,248, 15, 63,127,203,168, 75, 66,222,207,206,249,224, 38,
-251,235,109,214, 9,104,228, 33, 82,209,163, 8,148, 70,243,108,187,225,139,175, 62,229,235,175,191,228,250,242,138,117,189, 33,
- 38,232,186, 35, 47,158, 93, 80,150, 37,206, 20,248,193,211,119, 61, 93, 63, 50,250,192,254,216,137,162, 83,155, 71,221,245,121,
- 44,105, 74,167,110, 19,222, 79, 57,123,146,187,114,218, 39,161, 30, 37,166,205,246,115, 53, 59, 16, 30,217, 14,212,105,188,175,
-206,126,189,108,223, 81, 79,158,249, 83,230,121,134,225,204,239,133,154, 59,102,254,201,168,212,144,102,145,231, 9,177,172,243,
-175, 49,119,229,234,108, 23,246,244,243, 83,249,247, 58, 37, 31,166,156,234,149, 5,155,233,177,245, 79,167,196, 10,248, 23,127,
-243, 55,252,201,151, 63,130, 97,144,213,151, 41, 24,163,226,102,127,224, 63,252,221,223, 83,111, 47,121,115,123,207,148, 18,175,
-111,110,217, 62,123,198,195,177,101,119, 60,112,108, 15,108, 55,107, 41, 14,182, 27, 54,151, 27, 30, 14, 59,146,145, 41,193,177,
-237, 24,166,145,132, 98,189,222,202,197,224, 61, 49, 37,234, 74, 84,200,227, 48, 44, 40,214,186,174, 50,122, 57,162, 85,162, 89,
- 23,184,210,224, 39, 17,109,197, 24, 68, 20,149, 20,193,135,197, 87, 63, 39,172,197,152, 24,250, 33, 75,101,229,107,114, 60, 28,
-113,214, 98,172,140,149,125, 30,227, 26,101, 56,236,247,108, 47,182, 18, 20, 83,184, 60,142, 77, 40,101, 24,250,158,148,228,125,
- 45, 42,139,113,142,194, 57, 14,251,157,140, 90,131, 23, 76,233,254,200,245,245, 11,246,251, 3, 99, 14,122, 1, 48,121,183,175,
-180,162,112, 22,173,116,238,226,227, 82,156,133, 16, 73, 33, 46, 98,184,102, 45,164, 58, 25, 87, 91,214,171, 85,246,113,107,250,
- 97,164,174,106,194, 52, 82, 86,114,185,207, 92,130,105,148,220,237,170, 42, 24,179,202, 60, 38,225,116,172,215, 43,124,240,226,
- 26, 72,121, 82,168,172,196,163,198,200, 56,140,172, 86, 21, 90,195,232,199, 37,119,160,235, 36,227, 98, 24, 58, 94, 62,191,100,
-183, 59, 16,124,100,232, 71, 46,182,235, 12, 7, 74, 76,121,146, 58,121,207,122,213, 80, 56,203,216,119, 92,110, 86,168,108,247,
- 42,138, 18, 63, 5,186,182,229,217,213, 21,211, 56, 96, 92,198, 18,251, 0, 74, 51, 78, 35, 40, 40, 11,183,172,216,148,150,238,
-115, 28, 39, 41,220, 6,201,180, 40,203,154,162,112, 12, 67, 79, 93,150,164, 40,254,237, 38,199,174,250,105, 98,189,110,114, 66,
-102,202, 8,224,158,162, 44, 25,167,137,245,102,195,246,242, 66,104,155, 49,230, 16, 32,131,177,138,113,154, 40,235, 42,139,163,
- 69,247, 99,114,206, 71, 85, 56, 74,231,100, 52,238, 36, 93, 50,229,247,201, 58,113,109,196, 36,250,172,185, 91, 54,243,243,140,
-146, 96, 32,107, 25,166,145, 16, 3, 85, 93, 19, 98,160,237,122, 76,118, 62, 20,149,160,209,167, 48,201,228, 72, 41,161, 3,230,
- 53,147,143,225, 17,109, 93,171, 39,197,254,188,110,204,171,165,249, 93, 56,111,108,230, 70,241,164,126, 79, 79,248,210,234,108,
-119,120, 18,165,147,102,119,154, 18, 59,210,210,233, 36,149,187,153,211, 62,243,164,128, 63, 29,185,146, 5, 43,233, 70, 33, 6,
-116,152,187, 84, 75,202,145,150,230, 12, 47,171, 85, 18,106,155,202,152,198,156,154,100,141,201,138,117,149,137,116,138, 93,215,
-241,219,223,189,227,245, 93,203,148, 20,104, 75,145, 96,140, 17, 31, 71,220, 36,169,108,202,198,156,145,158, 48,198, 45, 54,170,
- 16, 78, 89,241,179,234,181,237, 59,118, 15, 15,196,113,224,114,149, 41, 68,232,252,255, 7,157, 98,238,216,101,228,238,140,206,
- 49,140,250, 81,135, 62, 83,231,102, 49, 70, 58,247, 32,235, 25,242, 35, 25,222,243,222,216, 24, 67, 76, 62, 35, 45, 69, 72, 50,
- 78,147, 28,116,103,241,123,155,139, 45,207, 94, 92,227,180, 97,229, 12,133,105,248,242,178,228,229,229, 86,162, 15,167,196,119,
-175,110,249,251,159,127,199,160, 10,166, 56,143,109, 37,152, 38,229,139,199,204,211,133,194, 80, 22,142,170, 44, 88, 21,150,235,
-237,138,207,159, 95,243,197,103,207,217, 92,173, 32, 6,218,125,143, 87,138,207, 62,123,193,221,195, 91,156,147,172,234, 16,225,
-198,203, 30,125,189, 89,115, 24,238,152,188, 71,105,155,125,185,167,207, 91,163,136, 42, 61,138, 38, 61,165,250,165,243,120,192,
-217,175,176, 40, 52,244,217,168,254, 49,237,240,177,211, 98,190,162,165, 51,155, 69,121,241, 52, 1, 56, 71, 29,115,162, 50,157,
- 34, 96,231, 44,130,244, 8, 23,155,126,160,173,109, 1,235,156, 21,172,167,252,244, 83, 18,250,211,228,183, 71,255,124,158,151,
-158,226, 82, 0,159, 2,111, 36,206,211, 42, 40, 82,226,155, 31,125,201, 95,253,236,143,152,142,173,248,143,157, 97, 28, 6,186,
-187, 3,175,111,222,177,222, 94, 18,129, 33, 76,236,187,142,168, 18,251,221,142, 55,175, 95,241,197, 87, 95,210,172, 42,142,135,
- 29, 77, 93,211,212, 21, 55,183,183,130, 13,110, 26, 30,178, 96, 76,105,195,122,189, 34, 69, 89, 25,205, 98,162,105,232,100, 44,
-107,128, 62,208, 13, 61,211, 56, 96,157,163, 61,236, 89,173, 43,148, 46, 73, 73, 14,108,173,117,246, 5,171,197,253,145,136,184,
-236, 83, 22,146, 87,206, 59,200,249,246, 38, 91,246, 66,138,194, 52,127,246, 76,246,175,218,114,115,115,131, 54,210,121, 13, 83,
-159, 15, 99,233,112,251,126, 88,146,217,172, 53, 96,210, 98,183,138, 33, 81,184, 18, 31, 70,238, 31,118,146,107,238, 28, 55,183,
-239,228,247, 77, 73, 38, 90,185,208,118,214,161, 85,196,251,136,213,134, 62, 3,111,124,110, 70,202,178, 88, 2,176,130,140, 67,
-179,190, 49, 46,177,156,210,145,105,186,174,197, 24, 77, 89, 72,158,119, 93, 85,146, 84,150, 18,214, 58,142,199, 22, 87, 73,119,
- 90,213, 37, 62, 4, 14,199, 3,155,245, 70,212,234, 70,229,188,115, 73, 70,147,128, 21, 56, 30, 91, 94,188,188,166, 31,123,124,
-136,140,222,163,180, 97,232, 7, 92,161,136, 42,114,113,177,102,191,239,137, 62,242,112,127,207,246, 98,139,209,138, 20, 2, 93,
-219, 17, 67,228,254,254,129,207, 62,125,142, 74, 50, 65, 25,199,145,122,213, 44,246,175,253,254, 64,123,108,105, 42,151,145,179,
-242,190,213,141,156,159,105,214,133,104,149,223,129, 89,136, 28, 81, 58,100,198,135, 40,220,235,230, 57,219,237,134,190,109,185,
-216, 94,112,127,127,159, 85,245,154,118,232,217,172,215,196,132, 76, 42,180,101,247,176,227,199, 63,254,138, 55,111,222,242,238,
-246,142,151, 47,159,139, 77,114, 85,115, 56,180,164,152,208, 89,200,219,254, 78, 4,115, 77, 83, 83, 20,154,182, 61, 46,228,203,
- 20,163,112,248,131,103,154, 70, 86,235, 21,126,156, 64, 37, 54,235, 53, 54,137, 62,194,229,103, 82, 25, 13,206,201,196,200, 7,
-177,247, 82, 48,142, 19,195, 48,200,247, 98,106,241,105,202,129, 68, 9, 91, 24,234, 88, 73,129,153,196,213, 65,158, 96, 27,163,
- 23,225,157, 60, 99,234,125,150,197,217,100,112, 70,148,159,219, 99,103,109,145, 4, 86,253,240, 69,224,201,175,158,206, 24,232,
-168, 15,116, 23, 31, 23, 10,205, 33,239, 62,155,237,125, 14, 97, 8, 25,227, 26,242,177,169,243,168,203,206, 23,163, 74, 88,171,
- 79,248,203,172, 6, 15, 82, 3,114,236,122,118,199, 30, 31, 53, 81, 89, 60, 48, 4,207,224, 61,131,143, 12, 83,162, 27, 35,195,
- 8, 62,104, 66, 48,120, 47,187,163,224, 65, 37,141, 74,154, 20, 53, 49, 57,246, 15, 61,119,183,123,186,182, 71, 41, 77, 85,175,
-112,101, 5,198,229,130,131,133, 66,100,173, 94,246,232,214,154,236,203, 21,154,144, 20, 32,153,253,158,227, 6,103,193, 94,124,
-132, 24,125,108,203,210, 90,227, 76,177,236,225, 10,171,229,161,139, 33, 79, 25, 52, 90, 23,124,242,201, 39, 92, 63,187,162,174,
- 28, 23,235,154, 23,215,151,188,184,190,100, 85, 57, 72,129, 99,239,249, 47,191,126,197,187,125,135, 79,134,168, 28, 9, 33, 95,
-197, 60,153,137,134,133, 44,100, 76,182, 11, 18,176, 68,240, 3,253,241,129,187,155,215,220,125,247, 91,250,119,175,209,195, 30,
-167, 71,154, 90, 70,169,199, 99, 75, 85, 87, 52, 77, 45, 7,178, 19,228,229,177,149, 17,188, 84,154,234,241,216, 60, 95,150, 74,
-101,128, 10, 49, 63,168,137,199,162,119,245,113,197,166, 58,173,109, 78,151,161,154,207,142,101, 88, 46,191,183,122,100,148,123,
- 42,116, 59, 7, 34,189,167,123,155, 41, 96,103,106,253, 68,226,108, 29,255, 97,139, 91, 74, 79,130,145,226, 34, 20,152,167, 8,
-143,104,141,203,190, 61,101, 54, 3,143,220, 35, 11,251, 49,157,168,124, 32, 22, 73, 19, 18,151, 85,205,255,252, 63,253,115, 76,
-136, 84,182, 4,101,153,162,166,157, 18, 15,237, 72,179,189,100,244,137,239,190,251,158,205,102,131,207,157,114,223,117,124,243,
- 7, 63,225,249,245, 21, 54, 37,214,117,195,151, 95,124,193,237,237, 29, 26, 77, 83,175,184,191,125,160,169, 87, 92, 63,123,206,
-245,245,115,172,117,188,121,243, 86, 10, 96,147,249, 4,211,136, 31, 71, 82,240, 40, 34,235,166, 34, 76, 35, 67,119,164,112,134,
-166, 46,177,130, 58,195, 89, 17, 89,109, 54, 91, 98,228, 36,126,204,249,214, 67,230,112,135, 16, 22,118,255,172,120,158,131, 62,
-108, 22,164, 25, 99,164, 73, 48,154,231,207,159,139,240,235,120, 36,120,159,147,185, 38, 25,175, 23,133,196,106,230, 3,209, 57,
- 71,219,117,146,218,150, 16,230,123,102,136,207, 30,233, 5, 67, 27,188, 96, 81,103,234, 93,190,108, 72, 49,199,145,138,127,216,
- 58,121, 79, 77, 86,211, 79,163,100,120, 23,133, 69, 27,177,136,206,161, 82,242,255,113,203, 51,238,156,193, 57,131,210,179,248,
- 88,209,182,157, 88, 1,157,164, 83, 22,133,101,242, 35,101, 89, 44, 4,177, 89,156,108,172,202, 83, 9, 69, 89,214, 12,253, 36,
-171, 4, 91, 80, 20, 18,162,114, 56, 28,209, 90,156, 5, 9,242,206, 89, 2,162,118,247,247,148,133,216, 16, 69, 0, 39,233,113,
- 51, 32,200,135,192,243, 23,207,151, 78, 91,224, 43,129,182,237, 51, 58,182,100,200,190,236, 24, 66, 86,157,159, 86, 97,214, 22,
- 57,154, 54, 91,213, 14,123,154,166, 17, 64, 76, 16, 0,141,192,104, 36, 6,117,179, 94,101,151,146,151,134, 39,196,229,235,170,
-141,226,242,106, 75,219,182,172, 87,141, 56,149, 66,128,220, 65, 87,133, 8,121,195,228,177, 90,214,130, 15,119,247,220,221,222,
-179,187, 63,176,174, 55, 34,220,107, 26,202,170,148,233, 77,233, 40,243, 26,193, 57,139,159, 60,251,221,145,174,237,101,138, 50,
-167, 5,138,125,138,170,146, 4, 56,173, 88, 72,162, 68, 89,149,212, 85,181,232,200,134, 65,120,245, 23, 23, 91,177,255,197, 64,
- 89, 58, 98, 12, 57,141,141,197, 39,111,172,121, 36,146, 93, 88, 38, 79,198,238, 11, 15,229,172, 9,248,160, 80,238,247,121,106,
- 23, 65,220,172,220, 77, 79, 77, 67, 31,191,208, 83,222,247,205, 22, 36,225,186,135,133,246, 54,121,225,184,203, 5,239, 51,170,
- 54, 98,180, 36,158, 21, 86, 83, 58,123, 26, 95, 47,112, 26, 25,159,246, 62,208, 15, 19, 33, 41,124,202,162,163,217,142,167,192,
- 39, 25,183, 15, 94, 49,122, 24,189,168,199, 99,210,104,109, 69,144,148, 71,192,218, 56,188, 23, 64,128, 53,142,117,179, 98,187,
-221,240,236,250,138,170,169,115, 32,140, 90, 70,191, 86,131,155,187,116,163, 40,156,193, 25,179, 92,246,250, 92, 36,167, 78, 83,
-136,185,178, 18,193,224,201, 2, 56, 31,224, 70,159, 40,118,133, 21,206,252, 56, 77,116,163,199, 39,205,190,155,112, 85, 35,135,
-152, 74,148, 78, 98, 90, 55, 77,201,213,102,133,115,226,237,125,117,123,224, 31,191,187,161, 15,146,228,134, 50, 40,107, 37,183,
-217,200, 33,226, 10, 75, 93, 21, 52,149, 21,129, 93,105,120,190, 46,120,185, 45,249,100, 91,241,197,117,195, 79, 62,185,224,143,
-190,124,193, 31,254,232, 57, 63,251,209, 53, 21, 45,253,221, 43,174, 54, 13,183,119,247,220,220,220,144, 72,172,154, 21, 85, 93,
-179,111,143, 34, 38,202,156,237, 15, 61,116,179,141, 81, 58, 97, 41,207, 72,115,102, 0,203,216,112, 62, 20,116,250,192, 51,166,
-206,158,189,229, 33,215, 39, 65, 93,190,228,103,161,217,233, 98, 63, 89, 17,231,164, 63,173, 79, 23,232,163,232, 85,212,114,215,
-158, 32, 57,138, 71,188, 55,245, 49,114,221, 73,100, 39, 23,242,153,232,238,236, 50,127,132,117, 72, 79,139,130,211,148, 64,160,
- 40, 39, 81,156,209, 74, 4, 84,198,242,183,127,241,151,188,220, 92, 80,104, 77,215, 15,236,219, 17, 83,109,120,187, 59, 96,234,
- 6, 83, 86, 84,117, 67, 81,148,188,123,247,142,203,203, 75,174,159, 93,243,233, 39, 47, 49, 70,243,221,183,191,229,120,216, 99,
-180,230,112,108,217, 31,143,148, 77, 67, 63, 76,248, 32,123,238,245,122,195, 97,127,228,254,238,129,186,170,105,170, 70, 20,228,
-147,167, 44, 69, 48, 89,151,181,164,150,132,200,186,169,105,170,138,194,185,220,201,140, 11,175,187,170,234, 60, 98,143,185,203,
-148, 67, 83,246,153, 39, 33,162,206,137,104,227, 56,114, 56, 28,208,198,176, 94,175,151, 47, 86,140,242,236,136, 48, 78, 72,100,
- 48,239, 33, 69, 89, 63,191,127,222, 79, 11,121,108, 24,250, 60,114,134,139,171,103,140, 83,160, 27,228, 66,187,185,185,201, 99,
- 80, 89, 12,105,163, 50,201, 80,103,110,121,204, 23,137,151,194,219, 57, 17,192, 33, 68,203,178, 20, 37,116, 8, 35, 90,167,236,
-217,142,121,252, 44,207, 94, 81, 56,182,155,117,134,138, 68,138,210,138,230,160,116,121,122, 40, 80,157,217, 37,226, 10, 39,225,
- 33, 33,100,198,121,153, 45, 79, 9, 31, 38,202,114,166,164,201,207,223,239,247, 20,101, 77,219, 74,132,170, 49, 22,180,102,242,
-129, 20,161,109,123, 54,219, 45,147, 23, 86,185, 92,198,113, 17, 22,162,160, 31, 7,118,135, 3, 49, 41,222,222,188,195, 7, 9,
- 36, 17,177,223, 28, 79,186,199,185, 18,133, 89,112, 35,174, 40,168,202,146,113, 28,114, 81, 36, 49,163, 83, 38, 3, 78,126, 90,
-152,229,235,245,122,121, 39,140,209, 84, 85,153,255,253, 42, 79,106, 5, 8, 6,113, 89, 99, 66,162,174, 43,166,113, 96,187, 89,
- 17,166,137,190,237,184,220, 94, 48,116, 61, 85, 89,209,212, 21, 77, 93, 19, 67,192, 26, 75, 89,148,132,201, 51,244, 61,195, 48,
-162,141, 4, 86,105,163,169,234,114,217,163,123, 47,104,228,186,170, 49,198, 48, 12,227,146, 56, 41,171,178, 64,211, 84,185, 8,
-179, 98, 25, 86, 96,141,121, 4,167,169,170, 12,230,114,142,238,120, 92,144,186,106, 17, 76, 75,161,132, 82, 57,185, 78, 63,194,
-192, 46,246,197,167, 96,170, 15, 8,212,207,155, 65,251,223,162,220, 85,103,135,106, 58, 27, 11,136,149, 35, 62,198,116, 46,135,
-227,105,119, 60,143, 95, 5,222, 47,236,238,148, 4,237,154,146,176,160, 83, 78, 21, 51, 90, 68, 34,210,225, 74, 21,107,180,146,
-139, 62, 7, 8,144,196,103, 62, 77,129,126, 10, 57,248, 32,231, 25,107,185, 20,230,144,148,168, 12,218, 26, 98, 86, 13,167,217,
-255,155,245, 0,218,106,148,151,130, 37,248,137,186,190, 96,187, 42,129,137, 85, 83,178, 89,215, 52, 78,113, 8, 45,105,154,150,
-132, 49,157,215, 4,214, 74, 64,139,179, 6,103, 20,206, 40, 25,105,107,157,171,242,179,205,238, 34,120,200,106,230, 36,171,135,
-217,218,150,116,142,147, 77,154,152, 34, 42, 73,117,106,139,146, 99, 63, 49, 30,119, 60, 28,123,158,191,248,132,213,170,194,135,
-137,194, 36, 10,163, 88,213, 37,235,117,131, 66, 88,246,111,119, 45,191,187, 63, 18,181,203,197, 67, 58,185, 28, 84, 64, 39,176,
- 24, 74,109,184, 94, 87, 60,219,148, 92,173,107,158,173, 43,158,173, 75, 94,108, 27,158, 95,173,185,184,168, 41, 10,131,115,194,
-201, 31, 70,184,187,109,169,147,163,174, 27,126,253,155,223, 50, 76,145,186, 94, 17,147,230,246,238, 1,148, 89,180, 1, 49, 43,
-202, 85,174,106,163,146,184, 85, 57,232, 4, 57,124,222,126,159,210, 78,243, 62, 57,239,149,181,122, 28,109,250,254, 3,175,151,
- 46,253, 67, 40, 57,153,134,196, 39,161,172,143,145,174,139,149, 42,103, 98,203,165,175, 79,129, 70, 74,157, 73,104,206, 52,112,
- 31, 44,104,115, 17,172, 37, 52,227,247,145,233,206, 43,238,211,190,236, 9, 82, 55,205,164, 70,149,109,129, 2, 24,250,228,234,
- 25,255,253,159,255, 37,161, 31,208, 49,209,249,192,230,226, 25,191,125,245, 22,229, 42, 14,253,192,223,253,221,127,226,249,179,
- 43,126,246,205, 55, 24,171, 41, 43, 73,166, 58,142, 35,223,189,250, 29,198, 73,177, 23, 83,226, 23,191,254, 53, 47, 62,255,140,
-135, 99,203,205,221, 61,171,205, 6,165, 12,175, 94,189,161,159, 70,174, 46,175,152,188, 23,167, 72,182,132,150,101,201,225,120,
- 96, 10, 19,165, 45, 8, 41,230,164, 66,141, 73,145, 49,140,144,164, 67, 86, 73, 70,222, 18,118, 49, 73, 86,130, 62,185, 33,140,
- 49, 76,147,167,105, 26,186,126, 0,242, 46,212,216,236,253,181,140,163,168,160,157,147,209,179,104,159, 18, 33,202,161,218, 52,
- 13,247,247, 15,185, 51,118,121, 23,107, 88,175, 27,250, 73, 60,202, 33, 6, 25,157,135,192,177,237, 72, 9,246,199, 35, 41, 6,
-154,170, 18, 74,163,213,144, 2,198,234, 37,209,172,176, 70,240,183,198,100, 56, 77, 88,246,251, 90,105, 89, 47,152, 9,101,212,
- 89, 72, 83,200, 41,114, 13, 15, 15,123,140,209,217,186, 37,244,202,210, 22, 89,197, 95, 98,244,129, 97,144, 20,180,113,236, 41,
- 74,139,202,133, 64, 81, 88,198,113,228,197,139,231, 28, 14,191,206, 30,125, 17, 92,213,181,164,209, 73,161, 64, 38,197, 73,134,
- 71,215,117, 56, 39, 35,243,103, 87, 23, 57, 50, 85, 48,167, 74, 65,229, 12,125,215,113,117,121, 73,219,118,116,131,156,195,211,
- 52,137,130,220, 57,250, 97,144,175,119,240,108,214, 23,108,214, 91,190,251,237,247,178,138,200,205, 66, 72, 2, 99,169,235,122,
- 89,113, 92, 94, 94,210,118,109,166,200,105,218, 99, 71, 85, 85, 75, 94,249,179, 12,196, 57, 28, 14, 24, 45,152,224,102,181,162,
-237, 90,225, 19, 84,130,242,118,206,113,119,119, 79,189, 90,211,212, 53,237,254, 64,219, 30,151, 88,212,194, 57,174,174,174, 56,
- 30,219,188,174,209, 92, 93, 93,226,189,207,140,117,141,247,129,174,235,105, 86,149,144, 10,143,146,205,190, 94,175,217,239,119,
- 40, 69,142, 88,213, 24, 83,100,209,230, 40,171,135,186,162,235,123, 80,121, 63, 63, 11, 87, 99, 36,120, 73, 93, 91,231,216, 87,
- 65, 29,107,156,171, 8,147, 95,194,162,202,186,164,187,223,161,141,100, 42, 72, 30, 73,202,246, 78,114,206, 73,202, 36, 58,181,
-112, 56, 78,115,198,244,222,133,126,158,173,174,127,176,114,151,167, 66,162,247,173,108, 79,193, 25,143,157,112,167,238,212,103,
-191,250,228,229,133,158,166, 81,188,161,211, 68,240, 94, 66, 41, 98,128, 40, 63,198,124, 8, 27,235, 80, 90,216,184, 70,155, 44,
-190,146, 79, 53,166, 19,193, 75,205, 99,222,108, 53,144,241,157,252, 90, 41,206, 97, 23, 73,208,138,130,122, 17, 46,156,150,124,
- 95,107, 20, 85,161,185,188,104,120,118,181, 97,181, 42, 73,113, 34, 38, 47, 73, 64, 38,239,165,103, 38,188,149,206,220,100, 69,
-188,157,195, 95,230,245, 65, 78,113, 59, 87, 53, 10,100,103,230,225,179,192, 28,206, 69, 15, 73,197,156,150, 36,170, 75, 87, 53,
-140, 65,241,234,230,142,178, 89,241,197, 87, 95,178,202,225, 13, 86, 43,170,178,144,220,223,178,198, 43,199, 97,132,239,222,237,
-217, 15,129,164, 29,164, 12,224, 73, 34,184, 50,100, 80, 73, 72, 84, 40, 54,206,114, 85, 58, 94,172, 44, 47,214,134, 79,215,154,
- 79,183,154,231,171, 68,227, 70, 92, 49,129, 27,177,149,231,249, 69,193,231,235,130, 50,140, 92, 95, 94,128, 54,188,121,243,150,
-253,177,229, 97,127,224,208,118,114,113, 47,147,135,179,113,243,211, 61, 50,103, 76,119, 53,203, 5, 63,188, 47, 87,233, 35, 76,
-244,165, 75,231, 9,116,230, 67,127,175,150,174,251,156,169,160,158,162,139,159, 20, 3,167, 81,226,188,134, 74,203,184,252,247,
- 37,188,171,179, 80,160,211, 52, 70, 63,250,253,230,241,243,121, 81,177, 96,112, 79,124,188,229,175,232, 69,141,173, 66,196, 42,
-197,159,255,241, 63,163,113, 37,126,242,116, 33, 18, 10,199,205,241,128,171, 87,244,227,196,161,237,216,108,182,124,246,217,231,
- 60,127,126,141,181, 98,205,217,181, 45,175,222,189,131,194, 17,180,226,242,250,154,183,119,119,108,158, 93, 49,132,200,187,251,
-123,182, 87, 87, 40,109,184,189,191,163, 31, 71, 46, 47, 46,217,237, 15,220,222,222,101,160,135,128, 54,238,238,239,233,199, 9,
-146,216,144,156,117,148, 69, 41,145,203,182, 0,116,206, 54,144, 46, 81, 68,112, 99,238,144, 98,134,127,156,198,227,114, 97, 75,
-250,216,152,197,112,101, 89, 16,147,116,170,206, 73,222,180,188, 91,178,222,176,121,124,185, 94,175, 25, 51, 88, 68,118,244, 6,
-173, 21,235,237,134,174, 23, 95,113,204,151,255,102,179,230,176, 23,133,190,224, 63,131, 32, 97,103,191,181,214, 20,101,185,252,
-185, 66,214, 6,205, 29,107,221, 8,124,100,134,152, 44,191, 95,102,120, 24,163, 40, 74,183,112,236,171,178, 92,108,150,214,138,
- 93, 79,105, 73, 97,155, 61,206,117,211, 96,172, 94,196,132,162,218,150,177,175,117,150,253, 65, 40,107,171, 85, 13, 89, 19, 20,
- 99, 88, 32, 61, 51, 33,205,135,176, 0, 91,102,231, 64,225,100,127, 47, 90,131, 46,119,151,158, 42, 7,145,116,109,139, 54, 54,
-123,187,237,162, 55,218,110, 47, 50,180, 71,190, 79,227, 56,178,221,172,120,241,242,138, 99,123,200, 22, 68,147,173,104,162, 94,
- 55, 26,154, 70,244, 6,214,136, 3, 97,182,153,121,239,243,168,125,196,100,199,212, 60,110,182, 86, 38, 29, 41, 39,158,173, 50,
-249, 13,160,172, 74, 72,145,105, 28, 50, 75, 65, 2,165, 30, 30, 30, 56,182, 45, 33, 38, 92, 33, 95,175,113,234,137,209,163, 20,
- 98,123, 43, 75,214,235, 85,102,224,203,247,203, 58, 81,176, 79,211,200,118,187,205, 92, 3, 57,163,103, 77, 71, 93,215,139, 38,
-170,105,170,229,251,202, 89,132,120, 85,149, 34,224,204, 76,249,249,189,152, 87, 61,178,179, 31, 24,199,129,166,169,168,234,234,
- 44,219, 64, 24, 8,195, 48,200,164,195,137,213,243, 60, 3, 66,101, 61,144,250, 39, 4,186,250,135,109,211,255,255,251, 95,156,
- 5,115,222,203, 24, 62,248, 37,102, 53,120, 79,244, 19,193, 79,132, 12,147,152, 71, 66, 49, 36,249,200,102,124,109, 44,214,138,
-197,235,220,199,135,138, 11,237,110, 49,231,199, 83,134, 92, 82,103,251,253,148,233,118,139, 76, 95,102,176,214,137, 79,180,172,
- 74, 82, 10, 28,143, 7,110,238,238,217, 31, 90,116, 81, 97,138,154,128, 70, 91, 39,136,200, 44,222,115, 86,231, 46, 29,108,134,
- 76,204,251,246, 57, 52,129,165,200, 56,223,223,102,241, 72, 82,156,255, 81,208,121,252,103, 52, 74, 25,166, 0,247,251, 22, 76,
-193,231, 95,125,201,213,245, 21,133,211, 56,171, 40, 11, 67, 89,149, 40,227, 80, 69, 67,112, 13, 55, 93,228,237,126, 32, 32,204,
-106,155,243,121,151, 68,180,236,169,111, 10,203,166,114,172, 10,195,186, 52,108, 10,195,182,212,108,107,195,182,210,148, 46,161,
-109, 66,217,132, 42, 21,212,154,122,107,249,236,197,134,149,139,164,225,200,102,189, 33, 41,195,183,191,123,205,247,175, 94, 51,
- 78, 97, 17,193,233,115, 39,197,233, 30, 60, 27,131,171, 71, 17, 44, 74,241, 36, 13,231, 44,177, 76,125,128,212,182,172,120, 88,
-132,109, 90, 63,185,156,213, 19,114,220,227,122,224,227, 20, 56, 37,207,219,163, 24,214,101,136,175,150, 15,245, 17, 54,195,226,
- 33, 87,167,137, 69,122,164, 3, 76, 31,236,214, 79,250,131,184,160,136, 83,154,125,252, 10,147,144, 11, 29,197,245,122,195,215,
- 95,124,201,238,110,199,221,195,158,253, 48,241,250,225,129,251,227,145,195,241, 64,138, 17,103, 52,127,252,205,207,248,250,171,
-175, 68,149,190,106,232,134,145,100, 44,183,135, 3, 83,130,155,187, 7, 30, 14, 71,154,205,150,119,183,119,124,247,234, 53,101,
-211,208,172,215, 28,142, 71,218, 78,144,173,251,195, 81, 46,186,162,200, 33, 24, 37, 93,223,102, 23, 73,194,229, 92,232,152, 47,
-217,152,164,144, 87,218,146,146,201,188,235,108, 21,202, 86, 46, 25, 75,171,133,196,184, 92,160,185,187, 85,103, 30,221,162,144,
-174,187, 46, 43,250,238,152,133,171,162,111,153,166,145,245,122, 37, 10,242, 73, 84,218, 46, 31,142,101, 89, 50,142,194,127, 16,
-203,212,192,122, 45, 23,242,177,109,179,125, 81,180, 60,101, 85, 16, 65,118,201, 94,236,103, 51, 64,219, 24,139,182,162, 27, 73,
-217, 22,149,178, 77, 74,212,254,114,137,235,101, 28,175,115,241,111,151, 80, 26,165,101,140,107, 44, 84,149,203,163,106, 15, 24,
-186,110, 96,187,221,144, 82,160, 44, 69,159, 51,123,249, 67, 8, 18,167,234, 5,152,179,217,108,242,250,129, 71, 32,171,148,210,
-130,106, 45, 10,183,232, 90,166, 65,210, 31,157,115, 18,191,154, 27, 40, 17,116, 9,223, 62, 1,251,253,195, 89, 96, 73,201,208,
- 15, 57, 75, 93, 49,228,145,186, 82,224,195, 68,211, 8,116, 74, 66,178, 76,246,220, 75,202,218,213,213, 37, 83,246, 7,236, 28,
- 24, 0, 0, 32, 0, 73, 68, 65, 84,155, 91,107, 25,135, 17,173, 68, 61, 62,179, 8,228,249,233,100,138,187,100,134, 39, 65, 12,
-215, 37,126, 18, 23,135,179,150, 24, 3,133,115,160,146,104, 52,178,117,216,100,150,193, 48,142,236, 15, 7, 89, 85,205, 57,247,
- 74, 62, 38,239, 49,214, 18, 83, 20,173, 69,110,240, 92, 33, 44,255, 97, 24, 56, 30,143,121,207,175,115,188,182, 17,123,117, 46,
- 54,187,174, 91,130,134,206,209,176,114,105, 11,187,126, 28,199,108, 73,150,223,179,235,132,115, 47,159,159,192,136, 68,251, 35,
-107, 40,249,112,143,104,116, 98, 51, 62,219,163,159, 37, 66, 62, 10, 66,251, 80,228,243, 63,121,161,191, 79,220,124,255,191,255,
-128, 30, 95, 47,187,206,211,165, 42, 35, 41,185,192,163,159, 8, 97,202, 73, 86, 39, 81,140,207, 31,131,159,178, 26, 54,230,170,
- 52, 46,232, 76,147,119,207, 74, 37, 81, 84,231,161,167, 36, 28, 25,162, 50,143,214, 5,234, 28,137,123,246, 99, 72,154,164, 12,
-205,122,133,173, 74,238,119, 59,246,135,150,182, 27,232,199, 64, 55, 65, 80, 5,174, 90,163,141,147,236,185,101,247,173,150, 61,
-186,181,162,124,215,249, 50, 95,240,131,231, 37,210,217,229,150,146, 58, 83, 69,207, 32,158,184, 20, 33, 17, 69,215,143,220,220,
- 62, 48,248,200,151, 95,255,132,151,159,125,130, 54,114,232,203, 46, 95,198,243,182,172,136,166,192,109,174, 73,197, 26,183,186,
-228,242,197,103, 96, 12,167,248,100, 5,218,160,180, 69,103,159,127, 85, 58,170,194, 80,149,150,170,116,212,101, 65, 85, 22,114,
- 32, 26, 3,198,145,116, 65,114, 37,169, 48,168, 70,179,125,222,112,181,118, 60,188,249,142, 20, 2,235,237, 37,247, 15,123, 30,
-118, 7, 89, 80,167, 51, 53,251,163,192,158,133,104, 32,172,254,217,135,157,212,227, 77,181, 58, 71,196, 62,206, 65,255,125,250,
- 13, 84, 58, 41,217, 31,161,226,226, 25,132, 70,189,215,229,127,248, 98, 85, 31,129, 32,191,255,241,126,242,234, 44,190, 83, 75,
-229,127, 18,241,229,127, 62,231,213,127,224, 37, 77,138, 71,207, 6, 57, 43,221,100, 93, 71, 83, 20,252,245, 63,251, 83, 54,101,
-141, 31, 60, 9, 67,208,134, 67, 63,210, 15, 35,187,251, 7,234,194,113,177,217,240,226,249, 53,135,221,142, 87,175,126,199,205,
-205, 45,191,250,205,111,120,125,123, 71, 31, 19, 73, 27,124,130,135,251, 29,199, 99,203, 56, 5,214,155, 13, 85, 85,113,216, 31,
- 48,198,176, 90,175, 41,138,130,113, 26,152,252,136,143, 30,180,236,186, 83, 30, 43,110, 47, 55,140,211,144,191, 7, 30,148,144,
-223,180,145, 11, 96,154, 60, 68,141,179,197, 35,241,172, 49, 74, 58,167,179, 73,213, 44,168,149, 78,246, 36,164, 19, 1, 82,202,
- 99,252,115,109,134, 98,204, 29,170,160, 54,133,223, 45,225, 50, 50,237, 26,134, 33, 95,238,242,227,197,197,150,253,126,151,187,
-170,152, 33, 37,141,164,173,229,169, 98, 89, 85, 28,187, 78,242,180,115,210, 96, 89, 86, 98,115, 50, 46, 79, 16, 21,174,112,104,
- 43,103,205, 12, 2, 57, 79, 1, 59,145,237, 36,194,213, 24, 81, 97, 23,165, 69,105,201, 35, 87,104,186, 86,132, 85, 69, 97, 41,
- 43,217,163,207,200,208, 34,147,209,166,113,134,119,201, 25, 40,187,102, 73, 44,235,251,126,233,164,143,199,227,137, 3, 16,229,
-162,136, 33, 46,201,151,117, 93,139, 39, 61,219,255,154,166,206,136, 92,185, 88, 11,231, 24,135, 65,118,238, 62, 82, 20,242,121,
-247,125,135,177, 10,165,162, 96, 94,167,129, 41,140, 89, 63,148,117, 50, 49,224,172, 68, 50,203,222,223, 83,213, 85,190,224, 93,
-118, 63,148,203,243,174,181, 94,220, 1,211, 36, 83,150,170, 42, 49, 54,175, 39,242,154, 32,132,128, 81, 48,141, 35, 69,233,132,
- 53, 63, 14,242,181,207,205, 80,219, 15,244,131, 23,205,213, 48, 49,102,213,250, 48,141, 40, 99,151,226, 90, 44,113, 82,184, 72,
-122,218,192,195,195,142,178,172,242,197, 46,221,248, 56,246, 39,196,117,126,175,103, 77,200, 60, 9,217, 29, 14, 68,230, 9,142,
- 89, 28, 75,125,223, 11,216, 6,177,105,166,236,151, 63,182,173, 92,224, 89, 71, 34, 83, 41, 41,116,103,251,221, 76,210, 83, 31,
- 40,248, 63,184, 50,252,160,250,253, 3,184,204,199,147,206,243, 67, 46,125, 16,251,245,126,220,197,185, 98,239,244, 2, 46,140,
-247, 28,226,178,112,215, 57,101,172, 79, 49,228,140,243,132, 79, 66,131,155,124,202, 0, 25,201, 24,151,172, 91,117, 22,157,153,
- 63,249,185,229,205,149,137,202, 99,112,163, 77,174,188, 13, 49,106, 98, 50, 68,164, 27,118, 69,201,106,179, 37,248,200,237,221,
- 3,109, 55,226, 3,248,168, 24,167,196, 56, 65, 50, 5,182,106, 64, 91, 17,158, 41, 17, 61,232,249,215, 55, 57, 90,245,236,243,
- 94, 48,176,143,140,213,105,137, 88,140,103, 95, 55,129, 72,136,197,109, 24, 38,238, 30, 14,124,255,246,150,135, 67,199, 23, 95,
-126,205,143,127,242, 7,148,249, 65, 86, 68,234,178, 92,196, 72,226,101, 52,152,106,205,103, 63,253, 35,254,230,111,255, 57,159,
-124,246,153,216,130,146,164,192,165, 51, 46,189,209, 6,109,245,162,188,117, 78, 2, 24,202,194, 81, 88,135,182,150,100, 29,201,
- 58, 84, 81,162,138, 18,170,130, 84, 23,216, 77,193, 39,159, 92, 16, 71, 73, 77,186,185,189,231,120,108, 23, 95,250,172,106, 84,
-191,119,220,163, 79, 10,245, 71,183,227,227, 78, 61, 61, 42, 8,210,239,153, 39,157, 43,218,210, 89, 23, 30,255,137,202,243,241,
-165,190,252, 10,191, 47,148, 37,157, 62,206,203,132,152, 5,154, 74,157,208,191,179, 16,243, 60, 11, 93, 41,253,145, 81,191,250,
- 96,178,219, 66,148, 74,162,229,168,141,229,191,251,179, 63,227,143,127,250, 53, 26,185, 44,180,113,188,125,251,142,103, 87,215,
- 20,206,242,197,231,159, 82,151, 5,171,170,224,251,239,127,203,221,253, 29,227, 56,241,221,171, 87, 68,165, 88,109,215, 66, 0,
- 68,241,252,250, 57, 62, 38,108, 81, 9,198, 85, 41,238,238,238,184,187,187, 37,166,196,126,191, 19,127,109,126,150,173,181,116,
-125,199, 20,132,127, 61,211,230, 70, 63,160, 76, 66,105, 57,200,125,158,186,137, 45,168, 16,108,112, 98, 25,143,235,243,201, 74,
-254,156, 79,216,228,132,205, 46,146, 20,211,233,114, 82,138, 20,252, 34,196,180,198, 44,171,170, 25,116,165,206, 14, 81, 17,127,
- 9,106,118,222, 99,111, 54, 27,166,105,162,239,250, 76,176,148,139, 85, 68,116,131, 20, 14,214, 49,100, 56,136,143, 49,135,219,
-200,251,174,140,166, 40, 5, 92,226,172,205,211, 2, 75,225, 28, 85, 85,231, 14,172,144, 98, 65,219,101,141,115, 78, 74,155, 67,
-174,172, 49, 2, 35,241, 1,157,199,212,206, 57, 18,113, 73, 39, 75, 73, 84,234, 85, 93,163, 52, 11,178,214, 57,137, 12,157,199,
-235, 51,113,141,108, 1, 30, 51, 28,101, 86,238,143,163,240,207, 31, 30,238, 69, 32,102,205, 82, 48, 79,211,196,106, 45,223, 75,
-149,157, 21,115,100,178,202, 86,212,170,170, 25,251,129,105, 24,151, 36, 54,242,212,105, 24, 6,170,170,194,231,207, 49,197,112,
- 10,109,138,178, 70,245, 62, 44,162,191,148,247,239,115, 17,183, 90,205,233,108,210, 29, 79,227, 68,233, 10,170,162, 92, 84,245,
- 42, 87,113,137, 72,244, 98, 19,108,154,102,105, 6,231,203,121,213,172, 49, 90,214, 62, 49,230, 21, 69, 72,244, 93,207, 56,100,
-116,173, 41, 40, 93, 33, 86, 63, 39, 22,231,105,242,180, 25,204,147, 50,228,104,190,124,103,174,255,140,243,158,215,106,198, 26,
- 73,125,235,123, 98,138, 11,120,104,118,180, 72, 33, 0,198,216,133, 18, 87, 87,242,156,197,224,153, 6,137,165, 53,153, 93,225,
- 39,177,218,169, 60,133,122,234, 71,255,152,187, 76,126, 78, 86, 21,167,108, 25, 80, 79, 66,171, 84, 74,168, 40,153,229,179, 26,
- 84,250,195, 32, 88,206, 89,181, 60, 39, 80,171, 51,184, 72, 2,163,236,242, 47,181,150,112, 17,171, 53,202,136,124,223,204,150,
- 47, 99, 23,115, 61, 74, 19,146, 34,228,205,111, 68,147,180, 33, 68,205,228, 21, 83, 80,120,159, 59, 49, 36,200, 37,198,180, 92,
- 10, 82, 92,201,159, 45, 18, 73, 90, 14, 88,163, 11, 10, 91,160,141, 67,153, 18,116, 73,210, 13, 73,215, 36, 10,140, 21, 69,174,
-138,138,195,174, 99,232, 35,253, 24, 25,199, 64,244, 66,155,235, 71,207,113,242,164,178,130,178, 38, 26, 71, 68, 84,244, 38, 43,
-202,103, 30,186, 49,106,217,247,201,206, 48,157,216,239, 51,132, 4, 73, 95,155,115,231, 39, 47,130,191, 24, 12,227, 0,247,247,
- 3,191,249,221, 3,239,246,158,235, 47,126,194, 87,127,240, 13, 46, 31, 58, 67,223,163, 82,164,180,150,202, 90,234,194, 97,173,
- 34,229,108,231,205,167,159,243,197, 79,127,140,138, 19, 58,142,104,147,136, 38,130, 78,216,148, 48, 49, 98,146,194, 26,151, 65,
- 57,154,210, 41,106,151,168, 85,160, 52,137,100, 21,201, 42, 40, 52, 84, 10,138, 0,133, 34,214, 37,106, 85,112,113, 85, 81,149,
-134,215,175,126,199, 63,254,227, 47,216, 29, 15, 96,100,202, 96,180, 91, 96, 54, 26, 37,122,136, 71,112,162,120, 6, 41,146,239,
-181,143, 42,247,237,130,120,209, 42, 46,126,111,209,202,169,179, 34, 81, 47,163,250,167, 9,109, 42,119, 11,143, 98, 89,159,168,
-222, 31,187, 51, 36, 61,106,233,140,207,104,111,239, 93,236, 42, 61, 81,211,255,158, 91,255, 9,151,249,188, 72,153, 1, 60, 31,
-179,131, 62, 77,111, 59, 23,156, 58,165,249,211,159,126,195, 95,252,244, 27,202, 4,109,123, 32,106,197,232, 61,127,244,245,207,
-184, 40, 43, 94, 94, 61,227,208,237,177, 86,113, 56, 60,208,142, 3,161,112,252,195,111,127, 67,212,154,102,189, 18,177,105,127,
- 68, 5, 79, 34,210,251,145, 87, 55,111, 9, 73, 44,166, 41, 38, 46,175,174,168,155,154, 16,229,130,118, 69, 65,210,134,110, 20,
- 1, 85, 89,150,148,149,112,211,135,238, 72, 74,146,114,165,108, 65, 55, 76,178, 75, 31, 61,165,171,136, 62, 17, 39, 57,152, 67,
- 24,113, 78,137,192, 45,197,101,114,193, 25,195, 95, 10,226,217, 62,106, 33,202,193,183,221,110, 57,180, 29,202, 88, 70, 31,233,
- 71,143, 82, 18, 37, 59,243,245,157,115,178,171, 77, 1,103, 20, 42, 5,140, 81,196,232, 89,111, 86,148,182,224,184,235,208,201,
-160, 34,148, 86,179, 94,173, 24,186,145,228,229,249, 51,198, 50, 76,129,148,223,115,208, 66,216,212,185,189,137, 30,103, 64,235,
-148, 51,186,101, 93, 38,221,187, 93,116, 4,202, 56, 38, 47,148,187,152,228,253,112,206,209,212,181,140,164,243,185, 17, 82,206,
-106, 79, 98,133,138, 33, 80,216, 2,103, 75,140,118, 28,246, 7, 89,125, 84, 5,129,136,143, 94,152, 1,128, 79, 57,255, 61, 23,
- 30,174, 40,112,198, 18, 70,161,237,105,163, 37, 44, 70, 43,166,168,232, 70,207, 48,141,140,211, 72, 76, 98,131,243,222,179,110,
- 42, 74, 39, 74,236,126, 28,169,154,154, 46,135, 56,169, 24, 41,180,101, 85,173,196, 98,150,245, 16, 72, 80, 32, 90, 41, 10,107,
-169,235, 58, 79, 96, 12,117, 85,229,130,204, 44, 60, 14,163,181,140,181, 13, 76,209, 11,170, 59,163,114,235, 85,141, 45,132,220,
-118, 60,182,196,164,228,115,201, 19,208,178, 48, 4, 21, 40,234,134, 99,219,209,182, 29,117, 85, 80, 87, 37, 4,143, 31, 6, 10,
-227,136,126,194, 25, 69,229, 74,156,182, 16,160,176,142, 85,221,160, 81,132, 97,160,107, 15,217,185, 96,233,186,145,186, 94, 1,
-154,113,156,242,206, 95,244, 1, 77,211,200, 26, 70, 89,134, 94, 82, 40,103,151, 64,140, 30,173,160, 46,157,216,240, 98,192,144,
- 40,109, 65,229, 74, 86,171,149, 36, 14,118, 3, 49, 40, 42, 87, 97, 16,199,212,102, 85, 82, 21, 22,167,228,207, 99, 85,166, 86,
-133, 8, 62,162, 83, 66,167,199, 56,245,217, 53,117,142,141, 61,255,159,253, 96, 20,228,147, 94, 72,125,228,223, 63, 78,187, 58,
-237, 76, 23,105,220,114, 88,105,156, 19, 1,136, 83, 54,119,172,210,225,107, 76,190,232,237,114, 1,206,202,248, 57, 58, 83,144,
-124,230,212,225,103,172,168,248,189, 5,249,184, 4,173, 44, 27, 72,185,104,149, 41, 80,166, 64,219, 10,227,106,180,115, 24,227,
- 36,108, 32, 95, 52,204,219, 50, 37, 40,217,221,254, 72, 24, 71,140,133, 36, 12, 2,156, 53,248, 28, 43,234,138,154, 41, 25,172,
- 45, 1, 67, 80, 19, 33,223,214,115,128, 11, 90,161,149,193,156,209,203,164, 27,136,121, 30, 31,137,103,173,158, 28,104,179, 61,
- 89,209,247, 3, 55,199,142,119,247, 59,162, 46,248,209, 31,252,148,175,191,249, 6,165, 21, 15,119,239, 8,126, 20, 32,143,147,
- 17,185,120, 55,201,144,140,148,149,153,146,131,252,246,205,155,247, 84,146,179, 14, 65, 33,107,131, 98,166,224, 25, 65,239, 22,
-214,138,216,199,106, 40, 12,170,116, 80, 89, 40,228, 80, 32, 42,168, 52,205,197,154,205,118, 69,138,119, 76,113, 34,101,106, 20,
-225, 44,156,132,152,175,117,253,232,217, 72,105, 6,187,164,101,106,241, 62, 34,254, 49, 97, 70,205,113,187,255, 68,167,125,206,
-162, 21,241,232,185,255,252,195, 33, 44,106, 78, 64,123,178, 38,120,175, 50, 78,234, 17,193,238,233,159, 84,167,143,115, 26,222,
- 83,172,126,160, 40,120, 36, 64,157,119,204, 49, 45, 0, 19, 69,226,179,231, 47,249,147,159,126,195,186,172, 80,147,196,237, 22,
-174,164, 40, 43,140,179, 28,218,150,113,236,233,251, 3,101, 97,121,115,115,195,143,126,242, 19,126,247,230, 45, 30,201,126,238,
-135,158,187,183, 15,148,101,193,171, 55,175,217,108, 46,153,124,224,197,203,151, 12,195,200,205,205, 13, 87, 87, 87, 56,231,120,
-119,115,195, 56, 77,108,235,102, 9,232,216,110,215,104,165,216, 63,220,179,222,172, 24,253, 68, 89,174, 24, 38, 67, 64,172,104,
- 83, 55,202,104, 63,239,109,167,105, 98, 28, 61, 85,178,212,171,117,246,141,203,138, 66,246,146,137,201, 79, 75, 17, 51,227, 86,
- 85, 38, 19, 21, 69,185,192,128,230,105, 65, 68, 98, 45,231, 52,183, 25,137, 90,228, 46,125,177,250, 88, 67, 24, 6, 54,219, 85,
-238, 96,167,101, 5,102,157,165,105,106, 72, 73,212,205,200,136,116,244,147, 8,151,230, 78,119, 9,134,177, 25, 70, 50,177,217,
-172,177,214, 48, 12, 19, 70, 91, 18,211,130, 14,141,209, 46,235, 9,239, 35,219,237,134,195,113,143, 43,156,160,101,179, 70,160,
-109,143,148,101,195,205,253, 61, 77, 83, 47, 35, 93,107,100, 28, 93, 88, 75, 23,134, 44, 44,158,100,231, 30,131,128,164,141, 76,
- 13,172,113, 76, 81,138,168,174, 27,184,188,220,160,213,105,215, 94, 87, 21,109,215,162,173,101,200,221,122,200, 88, 83, 97, 3,
- 8,143,126,242, 35, 77,179, 34,198, 68,219,118,236,246, 71, 62,255,252, 5, 4,207,177,109, 89,173, 87,184,178, 64,145,112,218,
-112, 8,129, 85,221, 8,103, 36, 91,214,230,119,102,254,123, 17,236, 57,148, 53,144, 60, 73, 37,241,241, 79,129, 24,167,156,138,
- 54, 82,215, 37,164,176,228,169,199,188,199, 22, 86,126, 73,140,129,209,143, 18, 38,133,163,200,208, 30,103,215, 2,196, 41, 11,
-140,113,164, 40, 83, 3,173,221, 41, 99, 35, 7,238,104, 13,235, 77, 67,244,114,113,119, 93,183, 76,114,198,113,226,242,242, 50,
-115, 18,124, 46,174, 38,234,186, 22,242,165,210,121, 5,144, 56, 28, 14,249,207, 36,130,199,213,106,181,172,217,166, 32,176,154,
-152, 34,109,219, 99,243,189,115,123,123,143,115, 69,102,199, 87, 56, 87, 82, 58, 69, 10,173,172,163,125, 88, 68,213,231, 13,192,
-121,102,250,204, 52,153,119,236, 79,155,134,255, 6,248,204,249,233, 23,159,140, 85,159,140, 74,211, 41,243, 36,165,136, 65,229,
-189,143,197, 90,249,162, 91, 83, 8, 84,193, 90, 73, 72,179, 89,124,146,109, 17,198, 22,121, 95, 46,150,145,217,222, 38,240, 22,
- 9, 95, 81, 90,236, 55, 49,219,196,150,191,230,104, 76,109, 49,174,166,168,182,216,114,139,182, 13,145, 18, 31, 53,163, 79,244,
-163,151,209, 90, 10, 76,105,162, 31, 91, 14,135,221,146, 3, 62,250,204,139,143,146, 59,156, 25,164,248,144,232,199,200,144, 52,
-163,113, 4, 91, 49,105,203,148, 83,235,180, 57, 19, 56,204,251,165,121,154,145, 87,203, 81,130,104, 9, 41,102, 81,135,162,159,
- 34,251,206,243,246,225,200,111,222,222,243,237,125,199, 84,110,248,241, 31,255, 9, 95,255,244,103, 40,173,216, 61,220,113,216,
-221, 19,167, 17,151,253,187, 58, 91, 55,156,179,178,203,119, 26,109, 21, 49,120,238,111,239, 56,118, 61, 9,157,163, 59,207, 90,
- 83,228, 1,181,138,172, 9, 0,155,167, 11,198,106,148,213, 40,103, 80,133, 5,103,193, 26,112, 6, 85, 90,116, 97,160,208,216,
-166,164,110,202, 92,132,165,101,125, 46, 15,221,217,165, 13, 79, 68,110, 89, 0,166, 30,203, 40, 5, 70,115, 46,150, 59, 75, 95,
-225,195, 54,142,243,212,179, 71, 53,128, 74,103,233,111,231,158,241,143,232, 62,222, 27,125,115,102,143,211,143,132,125,231,208,
-153,244, 3,197,164,231, 10,119,165, 62, 62,126,127,111,175, 30, 79, 90, 1,157, 18,165,210,252,205,159,253, 41, 54, 6, 24, 39,
-136,137,178, 40,120,249,201, 75, 17, 2, 17,233,134, 30, 79,100,125,121,197,183,175, 95,211,135,192,253,241,200, 67,123,228,229,
-103,159,114,191,223, 81, 86, 21,174,112,248, 40, 73,134,104,197,197,229,197, 2,126,249,228,147, 79, 24,199,145,251,124,209,108,
- 55,155, 44, 8, 21, 21,250,118,187,149,177,124,123, 92, 92, 45,194, 62, 40, 8, 94, 70,157, 9,217, 77,219,162,160,168, 74, 48,
- 90, 0, 83,106,126,206,220,242,117,152,199,146,230, 44, 74, 23, 18,211, 56, 97,141, 93, 46, 64, 87, 88,180,134,170, 46, 64, 69,
-166,124, 65, 9, 84, 69,124,198, 40,150, 48,151,186,172,150,221,228, 52, 73,160,134,247,158, 99,215,201,133,168,193, 22,142,106,
-213,112,191,127,200,175,185,206,162,176, 17,235,236,162,200,158,245, 60, 49,158,132, 75,195, 56,101, 93,140,196,123, 54,117,147,
-149,203, 2,204,138, 25,173, 26, 99,164,110,234, 5, 5, 58, 14,125, 70,193,214, 34, 20, 14, 98, 47,243,211, 72,223,119,108,183,
-219,101,244, 11,145,170,176, 20,214,226,199,145,117,211, 16,131,164,210,237, 15, 7,202,162,202,251, 88, 39, 84, 74,163, 24,199,
- 9,109, 13, 62, 73,113,223, 52, 13,101, 89, 81,184,130,169, 31,240, 99, 88,120, 9,235,213, 26,239, 39, 14,135,163,196,221,230,
- 51,119,181,106, 40,139,130,190,159,176,182,164, 27,196, 10,104,157, 99,244,226,177,158, 11,144, 89,204,120, 30,214, 53,199, 73,
- 75, 88,143, 7,212,226, 82, 50, 90, 83, 20,178, 19, 95,158,247,152, 50, 54, 86, 86, 19,101, 85, 18,147,140,206, 39, 31, 48,198,
-178, 94,109, 25,251, 1,165, 18,151, 23, 23, 66,156,235, 90,121,150, 67, 96,204,133,207,156, 11,178,106,202, 12, 62, 18,171,177,
- 66,210, 63,203,186, 18,151, 67,146,244,203, 72, 98, 10, 35, 15,251,123,148, 81,148,101,181,236,185,103, 21,251,252, 12,205,239,
-179,247, 62, 23, 36,158,155,155,219, 12, 10,146, 9,229, 48,244,226,117,183,194, 14,152, 5,118,242,220,192,126,215, 74, 26,168,
-151,239,131,117,197, 2,185,250, 80, 19,112,114,132,216, 69, 68,247,116, 44,175,181,254, 33,151,250,249,152,113, 38,127,125, 64,
- 40,148,206,108, 71,231,135,109,134,137,232,188,203, 22,171,130,168,214,173, 41,176,249,139, 32,182, 4,139,177, 14, 84, 38,175,
- 41,185,192,141, 54,185,147,211,203, 69,175,179, 7, 58, 68, 73, 47,243, 57,115, 92,165,179,131, 55, 9, 99,119,138,158,193, 79,
- 28,135,142, 99,223,114,232, 90,218,161, 99,152, 6,250,161,163,239, 90,250,174, 99, 26,199, 60, 26, 19, 21, 44,218, 16,114,154,
-123, 0, 66, 76,167,145, 75,138,140, 62,210, 77,145, 46,105,186,100,232,177,116,104,198,148, 73,250,234,188, 19,147,219, 78,198,
-140,226, 67,140, 73,198, 96,253, 24,217,183, 19,119,251,129,215,247, 71,126,245,230,142,183,237, 68,115,253,146,111,254,228, 47,
-120,254,233,103,116, 67,207,237,205,141, 96,107, 39,159, 95, 8, 1, 27, 56,103,176,206,136,176,205, 24,193, 82,150, 34,112, 27,
-134,145,161, 31,243, 78,215,160, 49, 39,224,201, 98,179,146, 37,135,205,190,122, 99, 20,198, 25,140,179, 96, 52,209,104,146,157,
- 19,108,242,135,213,130,218, 44, 21,117,105,177,250, 68,111, 63,239,186,213,226,237,214,185,103,143,143,186,245, 83, 48,197,217,
-173,156,211,214,212, 19,101,250,227, 86,254,247,167, 3,159, 4, 34,241,204, 2,247,254,114,255, 28,230,240,168,211,215,122,169,
-202,207,105,120,115,165, 44,203,157,180,124,196, 31,112,173, 63, 21,197,241, 3, 98, 91,117, 6,122,204, 95, 34,147, 18, 95,125,
-254, 57,219,170,162,113, 5,165,115,212,205,138,178,174,121,119,251,142,164, 19,175, 94,191,166,237,123,124,140,188,187,189,195,
- 86, 53,151, 47, 94,240,155,239,191, 39, 26,197, 47,126,243, 43,186,105, 96, 12,130, 33,222,239,143, 84,205, 10,107, 29,125, 55,
-176,123, 16,225,216,219,155,119,130, 99,237,123,186, 94,200,104,251,195, 30,109, 36,196,163,235, 58,218,246,192,229,229, 5, 81,
-193,118,189, 65, 39, 77, 12, 48,244, 99,198, 65, 71,172, 43,100,165,150,197, 82,206, 89,172, 43,240, 17,198,113, 90,222,171, 16,
- 2,201, 7,194, 56, 17, 38, 79, 97,100,138, 55, 3,138,170,178, 32, 70, 47,226,218,232,177, 86, 58,204,224,195,162,108,159,233,
-148,214,101, 11, 88, 38,189,137, 94,103, 6,157,136,254, 64, 41, 41,174,147, 98, 17,204,157, 3, 63, 66, 12,152,194,102,225, 82,
- 34,248,144,197,186,242,163,182, 5,221, 32,106,246,182,237,168,202,154,152,146,176,198,203,114,201, 87, 72, 9,134, 97,204, 92,
-244, 60, 46, 79,129, 58,171,183,101, 95,171, 8, 81,254,221, 60,138,154,213,238,126,156,240,163, 4,189, 92, 94,110, 23, 65,113,
- 89, 8,179, 60,228, 75,172,170,170,211,133,105, 36, 38,117,158,238,132,140,124,189,216,110,169,202, 82, 10, 33, 5,227, 48, 81,
-231,162,162, 44, 27,172, 53,236,118,187, 37, 68,229,120,236,152,166,128,159,100,215,111, 93, 33, 57, 26, 94,200,126,253,208,179,
-170,106,166, 97,196, 40, 77, 83,175,169,170,250,145,125,211, 89, 39, 93, 44,167,247,122,222, 77, 23,133,156, 89,201,123,156, 22,
- 17, 90, 89, 22, 75, 44,235,255, 71,219,155,246, 88,118,165, 87,122,107,143,103,186, 67, 68,206, 36,171, 52,203,144,208,176,253,
-179, 13, 27,253, 73,112,255,130, 6, 12, 72,238, 6, 4,184, 33,187, 27, 82,151,170, 74, 85, 69,102, 70, 70,220,233,140,123,242,
-135,247,221,251,158, 27,140, 44,146, 82, 53,129, 68, 50,201,204,140,136, 27,231,238,253, 14,107, 61,139,254, 46,197, 76,129,136,
- 97,162, 66,108,187,217, 98,236, 7, 72, 9,188,122,117,207,211,134,133, 58,103,208,180, 39,198,196,224,152, 5,214, 90,180,109,
- 77, 69,161,209,180,138,140,145,191, 79,215,162, 18, 0,119,239, 3, 66,244,104,219,166, 4,188,228,149, 80, 78, 12,204,224,164,
-245,165,250,249,243, 35, 82, 74,104,219,174,216, 28,201,175,159,144, 16,176,221,110, 86,170,118,186,171, 22,231, 48, 47,203,141,
-215, 60,198,116, 83, 24,173,199,236, 47, 49,223,215,211, 79,141, 31,219, 97,176,183,240,234,199,185,149,205,221,166, 98,137,188,
-144, 47,113,163, 69, 60, 38,115,199,173, 33, 84, 14, 20,209,188, 11,207,214,180, 76,248, 98, 17, 85,186, 6,166,232,178,235,100,
- 86, 46,200, 55, 26,179,218, 61,177,138, 58, 81,151,140, 20,225,221,136, 0,199,159, 7, 5, 49,228, 93,130,228,170, 54,165, 8,
-173, 64,185,182,200,116, 50,185,130, 11,128,131, 86,136,226,101,181, 64, 12, 14, 83,140, 36,150,147, 26, 34, 42,192,211,248, 89,
-203,116, 77,188,131, 64, 44, 73,113, 36,244,155,151,132, 97,138,152,166,136, 83, 63,227, 60, 76, 56, 79, 19, 46,139, 67,181,219,
-227,253, 87, 63,195,155,183,239,176,219,110, 48,244, 3,220, 60, 64,196, 8,196, 4,109, 13,180,182,168,235, 6, 77, 99,208, 86,
- 6,214, 40,212, 21, 33, 90,117, 93, 65, 84, 21,146,214,232,251, 17, 62,144,192, 39,196,120,163,254, 95, 37,200,210,222, 58, 81,
-199,174,152, 85,159, 47,111,161, 69,185,208,147, 22,100, 25, 12, 9,208,128, 48, 18, 93, 93, 65,130, 53, 23, 49, 71, 81,230,195,
- 49,178, 21, 77,114,178,152, 40,143, 81,222,147,139,213, 51,147,255, 95, 90,105,222,174,191,255,246,150,207,135,175, 44, 94,255,
-116,195, 75,160, 49,187,224,221,250,181, 67, 79,207, 59,254,248,236,178,149,215,157,110,124,102,239,184,174, 20,158, 37, 25, 10,
-241,131,237,122, 62, 0,158,239,185,214, 40,200,117, 71,127,219,213, 83,110,186, 17, 2,127,245,167,127, 14,145,157, 32, 49, 96,
-113,180, 22,114, 62,224,241,233, 4,109, 13,148,214, 72, 62, 33,184,128, 79,231, 51,118,119,123, 12,222,161, 69,133, 36, 21,162,
-144, 24,198, 9,167, 75,143,144, 4,218,174, 5, 36, 93,188, 77,211, 64,105,139,243,101,128,119, 20, 82,225, 22,186, 72,172, 33,
-245,245,249,124,198,211,211, 19, 54,155, 22,109,215,112, 68,169,194,227,225, 51, 92, 12, 48,166, 34, 8,185,160,120,223,102,211,
-240,133,110,208,180, 21,172,145,124, 1,201, 27, 33,224, 85, 72,152, 99,111,169, 32,179,134,220, 38,139, 91,200,194,102, 77, 1,
-186,212,141,101,145,214, 84, 84,213,154, 71,227,130,195, 51,132, 4,172,162, 6,194,197, 64, 30,127, 69,239,203,122,211, 96,152,
- 6, 76,203, 72,246, 59, 31,209,116, 29,173, 1, 98,196,180, 44,168,140, 33,141, 1, 18,146,143, 32, 36, 60,117,119, 77,215,226,
-112, 58,114, 58,155,166, 64, 42,198, 73,143,211,132,182,109, 48, 12, 35,172,189,199, 52,205,228,247, 94, 28, 60,171,174,201, 10,
-101,224,220, 2, 83,213, 80, 74, 23,252,109,127, 89,138, 95,218, 88,226,139,231,130,170,107, 59,164,152,240,116, 56,162,239,123,
-220,221,223, 67, 42, 98,185,211,115, 67, 56,215,170,105,208, 95, 38, 56,231,240,240,240,128, 15, 95,125,192, 52,141,116,121, 77,
- 51, 22, 94,119, 52, 77,205,144, 31,224,124, 57,227,221,219, 15,168,235, 6,151,203, 25, 66, 36, 84,181, 69,109, 45, 82, 12,100,
-237,234,218, 82, 88, 89, 67, 90, 6, 93,145,248, 77,152, 28, 34, 51,114, 17,181,160,170,106, 8, 33, 49,197, 8, 91, 91,204,203,
-196,150, 57,131,203,153, 68,140,209,123,152,186, 45,182,185,174,219, 80,160, 79, 4, 18,175, 40,199,113,160,201, 13,128,190,239,
- 81,215, 53,154,182, 70,223, 95,208,118, 53,102,231, 10,110,150,168,123, 20,167,221, 52, 21, 23,234,100, 45, 75,194, 67, 41, 18,
-236,245,253,192,201,105,182, 92,238,206,205,152, 89,236,105,173,165,144, 32, 67, 66, 76,169,192,128,157,154,232,116,124,175,213,
-181,198,211,211, 83,225, 51, 64, 74, 44,227,200,221,117,132, 86,153,160, 72,197, 97,140,190, 88,224,192, 77,107, 74,223,143,169,
-142, 43,188,238, 45,199,226, 5,170,220,143,195,196, 62, 7,207, 68, 50,194,167, 76,201, 34, 31,224,247,253, 62,164,234,166,144,
- 20, 13,165, 12,141,225,133, 46, 57,202,138,205,250, 42,143,145,121,191, 46,215,254,101, 65, 10,247,220,253,226,153,148, 63, 38,
-142, 42, 77,130, 77, 82,153, 66, 70, 48, 19,186,112, 60,148,240,144,112,128,240, 0, 60, 32, 2,139,172,200, 92, 37,161,137,255,
-206, 10,122, 41, 20, 91,136, 52,100, 86, 45, 2,132,132, 21, 36,164,137,222, 99, 90, 60, 46,139,199,105,137, 56, 57,129,227,162,
-112, 92,128,227, 18,113, 92, 2,206, 75,196,105, 14, 56, 76, 1, 15,253,130,239, 14, 3,126,247,249,130,127,249,238,140,127,254,
-237, 35,126,249,237, 35,126,251,212,227,236, 5,182,111,222,227,235, 63,249,115,220,189,121, 3,129,136,254,124,192,112, 57,193,
- 45, 51, 41,102,173, 37,127,190, 49, 48,214,160,107, 26,116, 13, 85,160, 85, 69,202, 93,211, 84, 16, 21, 29,130,167,243, 5, 62,
- 68,164,103,249, 99, 55,214, 50, 46,160,100,193,223, 94, 81,169, 81, 68, 64, 70, 8, 25,145, 84, 66, 82,162,248,231,161, 37,160,
-129,166,178,208, 28,216, 32, 86, 57,230,105, 53,152, 22,105, 5,126,225,130, 41, 62,235,145,111,213,239, 55, 25,129,183,132,182,
-159,146, 93,190, 94,201,220,168,237, 81,198,125, 47, 67,147,210, 45, 93, 65,252,128,125,243, 71,204,223,159,243,155, 95, 4, 53,
- 61, 3, 58,229,194, 57,133, 0,149, 18,222,238,239, 80, 75,137,133,121,212,211,188, 96, 92, 28,164, 49,120, 58,159, 16,101, 68,
-183,221, 96,187,221,192,133,136,211,249,130,105,118, 56, 13, 3, 46,227,136,167,227, 1, 31,190,249, 6,218, 24,156,250, 30, 62,
- 1,155,221, 14,218, 84, 56,247, 67,129, 34, 81,183,209,162,235, 54,104,219,142,179, 8, 12,172,169, 48,141, 19,162,247,188, 19,
- 52, 24,199,145,132,155,222,193,212, 21,218,174,131, 54,116,168, 10, 78,235, 74, 44,158,149, 74, 16, 84, 4,185,243,117, 55, 56,
- 62, 31, 3, 61, 31, 74, 33, 34, 21,247, 72,211,146,240, 74, 48,115, 93,172, 58, 82,165, 20, 98, 32,154,154, 16, 2,218, 40, 42,
-232, 5, 1, 65, 4, 68, 57,111,178,213, 75, 73, 98,214, 91,163, 89, 73, 62,148,105,154, 53, 26,117, 93,149,157,112,197,126,109,
- 91, 87, 52,118,151, 18,167,126,192,226, 29,199, 21, 91,142,134, 93, 56,135, 59,178,170, 31, 24, 71, 34,140, 81, 68,167, 43,151,
- 82,182,103,121,239, 48, 78,212, 73, 42,173,184, 59,172,153, 8,119, 61,188,167,105,130,177,134, 41,101, 26,227, 56, 23, 20, 41,
-125,218,129, 72,152, 12,182,137, 49, 66, 74, 82,114, 79,227,140,166,235, 0, 65, 23,209,233,120,130, 49, 22,239,222,189,131, 82,
- 10,211, 52, 97, 28, 71,124,254,252, 25, 91,182, 49, 14,195,128,113,236,241,238,221, 27,104, 77,145,162,195, 48, 92, 1, 95, 82,
-150, 60,123,161,136, 6, 26,216,129, 97,217,174,151,197, 92,121, 68, 63, 12, 3, 49, 61, 52,173, 87,172, 49,244,223, 56,170, 52,
-134,171,133, 75, 10, 89,156, 14,132, 21,182,236,138,208,112, 46, 64,107,133,237,110,139,148, 18,134, 97, 64,101, 45, 23,163,146,
-187,105,130,215,208,235, 32, 25,238,178,176,251,192, 35, 49,221,145, 60,227,169, 76, 77, 50,192, 39,187, 47,180,209,252,125,162,
- 84,181,113, 28, 32, 36,174, 86,236, 24,112,127,191,103,221, 78,100, 55,130,193,249,114,193,233,116, 46,216,221,124,241,135,232,
- 33,100,194,102,211,161,170, 40, 34, 88,107, 13, 1,137,224,195,138,249, 30, 11,172, 44,242, 58,227,247,157, 41,235, 6, 64,227,
- 39,253,147,158, 9,230,196, 23,176,151,215,223,145, 16, 1,137,242,134,146, 82,173,138, 4,113, 83, 48,144, 74,250,153,144, 75,
- 48,121, 77,146, 39, 82, 66,114,132,223,117,196, 79,113,131, 51, 11,232,242, 37,125, 37,114, 69,128,139, 6,121, 69,135, 62, 39,
-132, 49,124, 1,171, 20, 46,165, 52,188, 99,159,233,250,247,114,194,151,144, 84,237, 39,208,222,125,246,233,154,151, 46, 53, 68,
-112,240,203,140,101, 30, 49, 79, 51,230,217, 97,152, 22,140,227,140, 97,116, 88, 60, 16,160, 0,213,160,217,119,184,123,125,135,
-186,107, 16, 83, 68,127, 57, 67, 35,113, 82, 29,211,232,180,228,136, 73,192, 26, 82,171,215, 21, 37,170, 37, 17, 8,228, 80, 87,
-136,117, 5, 88,139,120,161, 81,106, 96, 63, 43,141,123,174,185,189,133,113,158,114,252,233, 77,236,121,217,171, 36, 73, 77, 23,
- 20, 32,180, 88, 89, 5, 19,132, 6, 1, 55, 50,175, 62, 73,132, 20,215,132,215,149,215, 92,174,194,101,197, 53,227,124, 93,112,
-136,107, 42, 89,137, 30, 93, 9,197,158, 91,211,196,247,188,227,162, 92, 32, 47, 14,233,211, 42, 45,110,245, 35,189,232,125, 79,
-215,144,152,231,151, 61,179,177,197,218,130,247, 3,197,198,243,202,250, 37,161,220,243, 17,155, 82,128,247, 1, 90, 8,232, 4,
-252,252,253, 87,168,181,129, 8, 2,210, 88, 4, 33,160,180,198,249,124,193,165, 63,227,235,111,126,134,167,227, 1, 49, 8,124,
-122,252,140,105,154,209,237, 55,240, 41,160,221,116,104, 55, 27,124,251,241, 59,156, 14, 71,132,152, 80, 55, 45,180, 5,134,158,
-128, 29,145,115,176, 83, 34,107,210,226, 29,142,159, 62, 66, 10,160,107, 91,204, 57,108, 37, 70,236,239,239, 32, 68,194,124,158,
- 48, 12, 3,234,138, 4,103,211, 60, 99, 94, 28, 98,162, 29,100, 93,213,101,223,106, 45,237, 3,231,105, 70, 93,105, 40,105,224,
-157,135, 81, 38,231, 78,242,235, 77,150, 86,197, 5, 96,240,142,138,233,166, 65, 76, 1,222,121,248, 68,151,218, 52, 77, 12,176,
- 33, 95,177, 54, 6,199,243,133,194, 51,124,160, 39, 34, 69, 40,101,138,157,139,138, 2,114,168,156,135,254, 42, 66,148, 2,109,
-219,194,205, 20, 78, 83, 25,139,105,156, 24, 53,171,233, 44,208,138, 34, 53,153,254,150, 57,237, 82, 74, 72,158,250,197, 24,139,
-162,221,179,191,251,116, 60, 99,183,219, 32,133,200,241,170, 20, 63, 74,209,164, 40,175,119,126, 3,122, 79,175,221, 60, 59, 76,
-243, 25, 41, 9, 52, 77,203,132,183,132,126, 24, 80,215, 13, 94,189,190,195,229, 50, 34,177,101,111,228,179, 48,239,253,231,121,
-129,181, 21,170,186,193, 60,142, 8, 33,225,120, 60,226,195,135,247,168,234, 26, 19,219,169, 98, 76,212,217, 87, 53,180, 38, 27,
-162, 21, 9, 31, 62,188,199,241,120,192, 60, 77,152,172, 65,101, 73,208,104, 42,131,167,167, 39,188,121,243, 6, 46, 46,152,134,
- 17,122, 67, 33, 43, 74,211,247, 94,107, 77, 19, 66, 45, 16,199, 1, 11, 91,222,134,137,208,174, 82, 72,120,231,208,181, 45,250,
-126,128,224, 95,103,196,236,178, 44,216,111,119, 24,134,190,176, 62, 50, 40, 39,173, 70,225,211, 56,150,192,175,202, 90,136, 36,
- 16, 35,223, 33,146,166,121, 33, 6, 40, 40,104, 99,152,194, 71, 23,117, 6,130,109, 55, 29,169,237,131, 71,246,224,184,197,163,
-174,218,162,228, 71,154,113, 58,246,133,193,175, 21, 77,147,104,172, 79,249, 6, 66, 4,102, 34, 44,144,114, 66, 20, 9,243,236,
- 48,207, 14,109,219, 80, 2, 94, 20, 69, 81, 63,141,243, 53, 11, 93,105, 72,153,184, 32,138,120, 73, 0, 36, 87, 22,183,117,115,
-155,255,251,191, 66, 40,151,110, 15,209,244,188, 39,186, 78,223,243,225, 44,149, 98,161,139,188,249,132,174, 9,111, 88,117,214,
- 40,217,238,215,139, 52,149, 14, 61,135,200, 43,246,132, 19,110,144, 12,254,241, 89,114, 86, 54,197,167, 36,232,128,137, 18, 49,
- 74,226,204,231,221,187, 80, 20,232, 34, 37,237,205,197, 21, 55, 75,224,136, 60,246, 16, 72, 44,146, 89, 66,132, 11, 52,242, 47,
-150, 60,222,185, 59, 31, 49, 44, 17,167,168, 49,200, 13,122,217,224,130, 26,231, 84,225,148, 42, 28, 67,133, 81,109, 33, 54,175,
-177,121,247, 21, 94,253,236,231,184,255,230, 27,108,222,190,133,100,117,234,229,124,192,116, 57,193,185,153,198,211, 82, 65, 26,
- 67, 65, 44, 90,193,104, 1, 37, 35,140, 2,172,165,177,187,181,134,148,231, 90, 19,233,206, 90, 44,206,227,120, 60,149,157,240,
-250, 1, 17, 55,183, 46, 71,155,166, 43,202, 85, 0,197,214, 37, 40, 64, 30, 66,145,120, 78, 26, 5,104,222,179, 27,133,186,109,
-216, 70,152,158,137,209,211, 85,236,150,110, 53, 26, 73,200, 18,253,154, 94,240, 90, 18,195,253,150, 52,119,155, 90, 38,174,193,
- 66,107, 84, 66,206,199, 92, 23,150, 69,249,190,170,104,159, 93,168, 55,201, 72, 55, 31, 44,125,185, 21,191,154,217,127,112, 55,
-254, 82, 39,254, 67,191, 39,191, 89,137, 4,152,208, 84, 21,190,126,247, 1,141,174, 81, 87, 53, 66, 2,206,151, 1, 41, 68,252,
-226,191,255, 19,241,208,221,130,126,236,177, 68, 15,143, 8,221,212,104,186, 22, 79,143,143,132,248, 20,192,101,232, 97,235, 10,
-221,102,131,170,110,224, 67,194,238,238, 30, 66, 72, 56, 46, 98, 73,201, 75, 74,111,178, 94,181,144, 74,193,241,110,119,187, 33,
- 97,213,211,225,137, 70,165,242, 74,237,202, 33, 21, 49,210,228,134,246,209,190, 4,230,120, 79,113,168,109,211,150,221,182,214,
-154,147,222, 28,141,131,149, 42,151, 18,216,254, 87,215, 85, 17, 91,105, 77, 19,171,188,123,206, 14,150,170,182, 36,110,211,122,
- 21,117,203, 74,246,101,230,139,132,248, 12,214,104, 76,227, 8,201,126,110, 41, 37,118,187, 45,154,182, 97, 69, 53, 21, 28, 4,
-105,161,160,142,146,174,200,171, 56, 41, 37,156,247,168,234,171, 24, 47,119,121, 25,178,130, 4, 2,160, 44,174,164,193,101, 10,
- 25, 41,250, 77,225,183, 3, 64, 93,209,228,173,239,123, 10, 97, 97,110,194,195,195,103, 24, 99,153,138, 70,211,207, 97, 24,209,
-182, 29, 20,195,174,134,113,196,166,107,137,188,102, 43,214, 0, 37, 12,227,132,166,161, 20,197,121,153,136,210, 25,249, 44,213,
-138, 39,157, 52, 46,175,171, 26,167, 19,165,220,133,224, 97,140, 66,211, 86, 20, 91,106, 44,250, 75, 15,239, 60,117,208,188,195,
- 38,193,224,140,105, 36,239,124,215,110,158, 21,172,244, 76, 17,163, 32, 22,126, 64, 83,215, 69, 19, 97,173, 33, 31, 58, 4,230,
-105, 34, 1, 29, 99,117,115,203,161, 88,215,176,254, 0, 0, 32, 0, 73, 68, 65, 84, 74,161,116,253,123,242,247,110, 94,102,110,
-222, 88, 80,105,100,153,218, 72, 69, 41,118,203, 50,195, 86,164,229,178,198, 64,128,166,159, 41,102, 65,166,226, 92,129,153,195,
- 93, 18,188, 7, 82,146, 24,134, 5, 85,213,194,152, 10, 90, 87,180,222,112, 11, 82, 74,148, 72,201,214, 51, 89,104,139, 21,113,
- 3,124,130,119, 17,211, 56, 35, 69, 74,124, 28,199, 9, 79, 79, 71, 44,139, 47,193, 56,198,216, 21,176, 40,174, 52, 56,233,230,
-140,122,169, 75, 95, 55, 36, 82, 94,147,217, 11, 24, 37, 61, 67,131,228,195, 45,137, 91,172, 76, 66,226,140,117,174, 20, 86, 80,
-149, 24, 67, 57,211,181, 80,208, 66, 93,199,226, 44, 66,202, 7,237,117, 50, 42,202, 40,127,205,233, 22,156,238, 6,182, 75, 73,
- 5,246,174, 38, 32, 5, 4, 79, 17,171, 20,212, 34,203,155, 32,174, 34, 27, 75,178, 22,163, 32,215,167,114,209, 3, 8,201, 29,
-171,224, 74,217, 23, 65,131, 18,100,121, 72,156,123, 27, 67,198, 3, 90,174,108,137, 34, 20, 1,204,206,225, 50,206,184,204, 11,
- 28, 52,116,123,135,106,255, 26,221,253, 91,108, 95,191,193,254,237, 59,236,222,190,129,217,180, 16,214, 64,104, 1,231, 22,244,
- 61,101, 19, 7, 23,201, 14, 39,105,220,153, 81,151, 90, 82, 18, 28,137, 54, 20,185, 5, 88, 61,218, 88, 11,105, 13,146, 82, 16,
-214, 0,149, 65,112, 30,253,113, 96,101,110, 68, 76,190, 60, 36, 41, 43,193,113,133,246, 64, 16, 15, 94, 51, 1, 15, 74, 66, 88,
- 5,161, 21,146, 17, 72, 6,180, 91, 87, 18, 48, 52, 57,128, 53,176,149,134, 22, 57,185, 44, 3,103,120,255,152,196, 77,176,137,
- 44,185, 36, 89,142,152,174,222, 48, 22,142,164,231,184,220,140,126, 21, 47, 88,195, 50, 40, 38,231, 13,139,239,247,238, 72,234,
- 42,244, 20, 28,241,202, 76,117, 72,218, 32,173,159,227,226,107, 23,217,134, 39,110, 62, 30,110, 70, 94,184,121,142,111, 21,243,
- 47,195, 33,214,149, 79,252,158,253, 83, 20, 2,163, 22,146, 41,116, 9, 42, 38,124,120,253, 14,247,247,175,112,158, 38,244,222,
-225,227,211, 19, 92,138,248,197,175,126,133,118,179, 65,221,180, 5,115,249,219,223,253, 6,178,178, 8, 10,248,246,227, 39, 8,
-161, 81,219, 6,253,105,128,155, 60,154,186,131,213, 21,172, 50,112,211, 12, 37, 19,198,177, 39, 46,117,215,160,110, 8,110, 68,
-177,165, 17, 33, 69, 76,243, 4,165, 37, 62,124,245, 30,117, 75, 56,212,190,239, 97,171, 10,218, 84,104,154, 22,219,253, 14,139,
-119,100, 45,226,149, 76, 70,198,210,100, 45,194, 47, 11,186,118,131,133, 49,174,243,226,177,120, 10,181,200, 20,177, 24,232,192,
-118, 46, 64, 43, 3,107, 91, 44,236,139,207,120, 81, 41, 36,243, 53, 18,106, 91,163,107, 41, 29,142,178, 27, 72,129, 76,212, 55,
- 85,168,133, 49, 68, 32, 82, 42,214,226,102, 72, 77, 36, 56,163, 12,148,164, 66,195, 47,180, 18,144, 66, 81,124,171,181,212,189,
- 59, 26,147,167,152, 74,122, 23, 0, 12,253,128, 29,219,218, 74, 50,100,244,156,147,174, 17,162,131,173, 13,180, 53,172,175,137,
- 56,158,206, 72, 66, 96,156, 23,220,191,186,227,209, 61, 13, 78,149, 86, 92,168,128,105,124,116,152, 79,243, 12, 91, 53, 72, 32,
-113,157,177, 22,167,243, 5,227, 52,225,213,253,107,184,197,193,112, 68,243,166,107, 41,166,213,185, 82, 12,157, 78,103, 52,109,
- 87,112,169,227, 48,160,174, 42, 72, 0,141,181,240,193,227,120, 62, 67, 72, 74, 27, 59, 28,143,132, 92, 21, 2,214,214, 28,172,
- 35,208,182, 29, 66,200,200, 84, 70,240, 90, 82,213, 63, 30,143, 8,137,180, 30,182,178,236, 26,160,175,155, 98, 87,175,235,176,
- 24, 34,137,123,141, 68,138,158,249,252,146, 39,139,137,186,111,163, 33, 36,141,199, 37,159, 89,149,181, 72, 33, 80, 74, 94,116,
-101,159, 77,130,106,186,111, 66,233,182,169, 1,164, 14,159,180, 38,243, 60,179,149,151,210,245,202,235, 32, 4,217, 26,145,208,
-180,117, 73, 84, 92,150,153,199,255,177,208,221, 82, 76,196,240, 79, 2, 79,159,159, 96,117, 5, 64,162,170, 26,108, 54, 91,104,
- 94,215, 54, 77, 5, 41,128,237,118, 11,165, 52,150,197, 67, 43, 91, 66, 90,230,105,134,115,158,189,231,190, 68,176,174, 83, 39,
- 37,175, 3,214, 83,188,236, 85,207,196,194,219, 88,214,107,118, 37, 93,134, 66,124, 81, 69,252, 61, 52,152, 72,108,202, 21, 37,
- 28, 99,141,249,204,217,235, 70,106, 24,169, 41, 23, 93, 82, 54, 47,214, 68,173, 28,252, 33, 37, 2,167,168, 65,102, 17,221, 85,
-180, 68,211,115, 10, 57,209,146, 47,142,232, 48,187, 5,179, 75, 4,169, 89,229,104, 95, 83,229,210,205, 15,178, 77,173, 79, 96,
-198,111,178,144, 79, 9, 93,126, 45,132,162, 80,131,213,139,136, 72,127, 70, 41, 13, 99,236,234, 98,215, 84,176, 24, 9, 5, 32,
- 58, 10, 44, 24,198, 17,227, 56,225, 50,244,152,150, 9, 46,204, 36, 18,137,228,209,156,167, 17,203, 60, 34,250, 0,163, 43,212,
-117, 7,169, 45, 89,247, 4, 49,173,141, 82, 52,126,148,138,161, 61,154, 97, 46, 10,218,104, 84, 77, 3,101, 13,132, 53, 32, 58,
-174, 66,127, 62,227,116,186,176,101, 59,191,126,204,223, 79,177,144,251,232,235, 15,180,222, 16,128, 22,130,252,233, 70,130,125,
-110,128, 81,128,145, 72, 82,210,100, 67,145,144, 78, 40, 5, 91,105,216,124, 91, 11,201, 82, 67,246, 85,151, 24, 84,178, 99, 61,
- 11, 44,189,221,112, 39,121, 21, 42, 22, 26, 92, 40,176,142,194,206,127,166,134, 79,215,201,250,106,250,144,138,192,241, 22, 58,
- 19, 75, 57, 23, 17,233,181,226,130, 54,221,184,231,196, 21,239,138,171, 2,254,185, 56,174,164,237,229, 80,158, 76, 69,140,233,
-135,119, 96, 32,224, 13,196,237,234, 33,166, 68, 83, 33, 31,232, 61,226, 35, 42,105,240,103, 63,255, 99,132, 24, 49,199,136, 67,
-223, 3, 90,145, 31, 61, 80, 81, 75, 24,215, 10,191,254,245,191, 64, 40,122, 46,102,239, 17, 18, 80, 87, 45,230,209,225,243,227,
- 1,117,221, 97, 28, 23,124,247,241, 19, 98,136,120,255,246, 29,220, 60, 67, 43,137,186, 38, 1,218,195,195, 39,246, 99, 43,116,
- 93,135,221,110,199,144, 18, 58,176, 31, 62, 63,224,233,233, 9,219,221, 14, 2, 18,219,237, 30,227, 56,226,225,225, 51,117, 73,
-154,240,153, 90, 41, 74, 46, 83,154,190, 46,182,134, 17,255,156, 0, 54, 82, 42, 58,200,133, 64,211, 52, 64, 4,130, 11,228,227,
-230, 34, 47, 37,178,149,230,195, 85,107,206, 49,224, 67, 91, 43,133, 20, 18,140,162, 40,204,192, 86, 35,239, 29, 18, 4, 22,231,
- 97,140,197, 50,123,220,237,246,232,199,161, 64,138, 2, 71, 62,223,223,221,195, 45, 30,211, 48,162,169, 42,120, 71,140,116,242,
- 40,211,247,215,123,135,166,174,232, 92, 74, 52, 77,236, 47,103, 66,177,106, 69,244,203, 20, 33,165,130,177, 6, 77, 91,179,248,
- 55,150, 9, 32,117,115, 10,117,219, 65, 25,133,105,158, 0,166,144,245, 61,117,193,164,124,247,144, 90,160,109, 43,108, 54, 13,
-234,166,197,199, 79,159,161,149, 65,221,116,184,244, 3,180, 85,152,151, 25,195, 48, 96,191,223, 99,153, 40,192,164,235, 90,182,
-197,109, 74,198, 67, 74,145, 85,229, 22, 62, 68, 28,143, 39,108, 54, 27,154, 50, 6, 18,237, 41,169,209, 15, 35,170,186,134,210,
- 6, 82, 41, 28,158, 14,172,230,182,248,248,240,176,138, 10,213, 24,121,175,190,204, 11,220, 52,227,238,254, 30,199,211, 25,227,
- 52,160,105,106, 52, 13, 17,252, 34,127,205,218, 80,188, 44, 18, 96, 52,117,217, 90, 1,222, 83, 58,157,173,106, 36, 33, 33, 53,
-197,180, 82, 81,232,168,137,211,170, 0,137, 36,128,166,174,224,252,130,121, 25, 32,181,130, 53, 21,175, 58, 44, 78,199, 19, 3,
-199, 36, 41,243, 89,124,232, 25,145, 59, 14, 99,241,234,103,214,123,224, 28,146,221,126,139,170,174,202,247, 52, 68,143,113, 26,
- 96,173, 97,166,125,128, 91,102,254,217, 83, 10,158,144, 56,157, 46, 24,199, 9,142,189,238, 41, 69,156, 47,103,132,232, 32,100,
- 66, 85,181,228,122, 98,213,125,182, 13,102,218, 30, 77, 10, 35, 7, 13,133, 50, 53,204,107,226, 92,188,172,161, 51,107,151,193,
- 79, 18,202,253,216,161,252,245, 71, 42,157,139,144, 18,218,152,226, 7, 21,171,124,113, 89, 20,239, 44,207,207,221,124, 90,197,
-181, 38, 38, 59, 9, 64,164,200,255, 78,104,201,252,145,198,105, 46,233, 65,207, 18,224,139,202,250, 58,206,140, 72, 43, 40,254,
-173,112,233,122,177,231, 84, 46,197, 80,255, 16, 72, 77, 10,200,178,163, 86,138,118,104,148,210,166,138,170,158,176,129,186,248,
-100,137, 76,228,110,162,244,140, 49,208,130,232, 84,185, 98,172,170, 10,166,178, 69, 60, 40, 57,102, 86,114,124, 43,137, 63, 8,
-225,106,140, 46,107, 8,161, 13, 68,101,168, 88,178, 10,194, 40, 36, 23,240,248,240, 25,167,203,133, 63,239,188,138, 64, 9, 5,
- 17,171,139,235, 42, 74,188,166,207, 9,201, 33,227,188,175, 20, 89, 32,199, 69, 87,190,216,173, 53,132,154, 92, 21, 72,224,172,
-123,177,194, 4,255, 40,203,215,139, 75, 30,220,196,158,254, 62,254,123,186, 98,144, 86,221,115,252, 30,114, 54, 23, 0, 95, 26,
-135,199,130,118, 92, 79,123,240,130,253, 13,171, 2, 36,221,238,216, 95,216,133,173,223,124,235,212,185,148, 18, 49, 11,178, 86,
-131, 3, 50, 16, 41,141,237,245,253, 61, 54,155,142, 4, 53, 49, 97,179,217, 97, 89,104,237, 4, 8,236,118,119,232,251, 1, 15,
-159, 31,209,118, 91,188,123,247, 30,206,121,116, 93, 7, 83, 85, 72, 74,226,216, 95,240,246,253,123,248, 24,176,120,135,237,126,
- 7,161, 21, 78,253, 5,191,251,246, 59,236,118,123, 74,111, 11,129, 57,232, 26,219,221, 14, 82, 74,156,207,103,116,221, 6,219,
-237, 14, 33,208,222,125,183,223,195, 24,139,237,150,125,195, 16,104,170, 10,187,205,142,236, 62,129,230, 51, 74,106, 76,195, 8,
-191,120,184,197,209,184,215, 59, 62,188, 8, 59,155,223,167,130,167, 19, 42,171,215, 37, 32, 36,113,228,105,149,154, 74,160, 75,
-206, 72,207,136,217, 60,112,179,214, 96, 89,230,114, 81, 1,100,147, 90,220,130,253,126,135,190,239, 25, 44,146, 74,140,107,215,
-117,172,242, 22, 55,171,163,182,105, 56, 51,252,192,186, 32,194, 66, 47,243, 66, 41,110, 82,149, 21, 23,157, 65, 52,114,207,207,
- 76,101, 43, 44,203,132,101, 89, 80,215, 85,249, 92, 51,216,164,109, 91,154, 72,240, 84, 48, 70,130,246, 12,195,128,186,166, 49,
-125,221, 52,216,237,118, 72, 41,225,116, 60,151,125,254,211,211,129,119,176, 10,195,208,163,235, 90,128,189,212,199,227, 19,246,
-251, 29,249,245,141,198,118,187,129, 82,146,195, 69,200,254,167,181,198,233,120,194,253,253,171, 82,180,214,117,195,236,120,226,
-200,207,243,140, 77,215, 98,153, 38,188,123,251, 6, 41, 70, 60, 61, 61, 22, 75,151, 53, 22,167,211,153,252,211,108,193,171,234,
- 10,211, 52,227,114,185,176,194, 59, 66, 10, 82,201,167, 72,202,243,121, 89,120,218, 49, 83,129, 83,215,133,235,190,182,105,101,
- 95,119, 78,138,203,172,128,108,131,110, 26,162,224,101,145,157, 49, 26,125,127,193,253,253, 61, 46,151, 51, 82,140,252, 60, 76,
- 68,250, 99,123,162, 49, 26, 66, 10,248, 24, 11,235, 94,107,133,101,158,113, 56, 28, 8, 23, 92, 91,104,163,209,180, 13, 18, 0,
-231, 29, 66, 12,112,193, 33,138, 4,161, 4, 54,155, 14,214, 86, 56,159, 47,136, 49,226,233,233, 9,195, 56,224,116, 58,225,237,
-219,183,216,237,182,156,192, 55,150,179, 33,211,234, 72,187, 18,191,200,171, 88, 55, 6, 47, 37, 72,190, 68,160,252,131, 93,234,
-233, 25,110, 51,166, 84, 58, 40, 33, 73,152, 32,164, 92,141, 71, 83, 73,239,146, 0,193,105,196, 58, 88, 50,127,146,169, 4, 60,
- 72, 14, 76, 49, 74, 80,100, 40,247, 79, 49, 1,227,188,240, 55, 93,124,241,179, 75,153,179,254, 12,185,119, 67, 43, 19, 87,200,
- 72,126,161,165, 82,101, 15,114, 29,209, 99, 5, 52,225,189,148,144, 12, 59,160, 49,188,210,178, 16,174,242, 30, 72,101,143,190,
-214,168, 12, 41,215,219,166,129, 49,186,136,110,136,182,199,197,143,202, 9, 77, 68,195,178,214, 80,128, 65, 85,161,170, 12,180,
-150,176, 90, 67, 24,141,100, 52, 96, 12, 96,233,231, 56, 46,248,237,111,191,197,101,156, 41,141, 8, 2, 33, 93,167, 34,229,162,
- 73, 2, 49,208,142, 48,173,118,214,185,235, 46,137, 52, 98, 37,144, 83,178,136,210,147, 4,116,101, 74, 12, 33, 86,252,250,235,
-119, 51,253, 43,202,195,231,164,183,151,163,125, 95,170, 21,200,166,151,187,126,249,236, 57, 16, 37,109,107,237, 63,127, 89,140,
- 34, 56, 30, 87, 60, 39,191, 22,168, 13,189, 41,113,243, 67,202,235, 69,243,146, 79,189,124,188, 18,222,179, 26, 73, 50, 69, 43,
-242,231,167, 33, 97,165,198,207,191,254, 6, 86,155,146,215,252,233,225,129, 82,194,248, 43,107,218, 6, 79,199, 51,148,177,168,
-235, 22,135,195, 9, 31, 31, 30,136,200, 53, 79,120, 60, 60, 33, 9,224,233,233, 9,227, 52,209, 46, 52, 37,252,250, 55,255,130,
-199,195, 1,175, 95,191,193,102,187, 67,219,118, 16, 66,161,109, 59,116, 93,199,190, 93, 18,254,188,123,247, 30,117,221,160,109,
- 91,220,221,221,195,154, 10, 90,105, 92, 46, 61, 98, 4,255,153, 13,148, 84,148, 91,176, 56,206, 92, 80,176,166,166, 1, 56,179,
-196,179, 8,170,170,106, 72,173,139,109,241,234,237, 94,143, 20,105, 39,106, 43, 3, 99,105, 71, 74,130,183,235,247, 38, 71, 85,
- 70,238,186,109,101,177,221,110, 96,173, 46,177,151,214, 82,186, 87,136, 30,214, 16,220, 10,145, 14,248, 44,182,115,110,166,180,
- 56,145,208, 52, 22,109, 87, 97, 28,122,116, 93,199,127,135,197,194, 57,236,244,190, 32,210,100,136,192,225,120,161, 17,181,148,
- 88,120,109,145,231, 60,235,189,121, 74, 17,247,175,238,160, 53,165,186, 57,231,176,217,108,112, 56, 92, 10,195, 61,147,244,242,
-142, 85,107,131,154,147,190, 30, 30, 30,176,221,110, 17, 66,228, 31, 1,154, 51,206, 77,165, 81, 85, 84,244,159, 79, 71, 24, 67,
-157,102, 74, 1,117,109,209, 52,150, 5, 88,116,185, 12,195, 4, 1,137,253,110, 15,169, 40, 54,213,251, 0, 37, 21, 54,221, 6,
-243, 56,225,116,120,194, 56, 92, 48,141, 3,222,189,127, 11, 33, 40,239,156, 50,203,101, 57, 19,133, 32,149,119, 2,104, 90,161,
-232,204, 90,167, 25,130, 53, 34, 82,136,194, 80, 15, 33,114,200,141,133,100, 31,123,246,221,103, 17, 98,142,224, 37,245,191,226,
- 41, 92, 66, 91, 55,104,155, 22,137,109, 98, 74, 73,118, 11,140,120,245,234,142,154, 13,214, 80,196, 16, 8,216, 37,105,221, 25,
-248,189,225,131,135, 91,133,229,164, 16,209, 95, 46, 68,243, 75, 9,193, 59,196, 64, 92, 4, 74, 83, 35, 1,248, 60, 79, 20,110,
-179, 44,104,218, 14,139,163, 12,249, 97, 24,224,188, 67, 63,246,148,156,201,103,216,249,124, 38, 24, 82,125,229,139, 72,214,132,
-121,239, 11,222, 56, 91, 50,115, 16,207,115, 20,236,139,205,204, 90, 48,247, 7,235,211,159,227, 50, 69, 30, 27, 40, 34,198, 61,
- 51,207,139,152, 86, 62,247,184,202,165, 78, 55, 70, 38, 41,105,199,171, 21, 80, 25, 5,171, 5,172, 18, 80,124,186,186,144, 48,
-206, 11, 92, 76, 55, 42,234,151,173, 77,177, 4, 70, 60, 23, 35,221, 84, 72,129,177,173,252,181,248, 64, 21,102, 90, 81,175,214,
-234,104, 98, 61, 83,199,218, 84, 22, 86, 17,182, 53, 39, 39,229,136, 74,107, 76,249, 57, 91, 46,140, 81,168,140, 38,102,180, 36,
-239,107, 74,145, 66, 86,172,230, 67,137, 46,253,156, 72, 84,213, 22, 77, 93,243,229, 94, 17,237,205, 90, 8,109,144,180,132, 48,
- 26,227,227, 9,255,240, 15,255, 13,147, 11, 76,220, 3,239,180, 86,187,223,130,166, 77,136, 81, 60,211, 75,228,113,118,190,192,
-229,234, 7,239,214, 5, 0, 45,160, 43, 2,116, 96,197, 51,191,237,178, 25,188,243,251,124, 96,207,109, 94,235,190, 88,188, 92,
-149,102,119,195,151,186,245,244,162, 7, 77, 60, 79, 94,189, 10,236,110,126,185, 10,153,121, 86, 49,188,196,114,255,146, 69,237,
-165, 55,222,139,140,119, 94, 63,209,132, 68, 94, 47,179,152,240,106,183,199, 31,125,243, 51, 52, 85,141,221,118,139,167,167, 39,
-116,219, 13,193,119,141,193,238,110,143,203, 48, 98,241, 30,151,126,192,231,167, 39,204,110,225,206, 41, 98,113, 11, 94,189,126,
- 13, 0,184,191,191, 47,251,218,188, 54,218,108,182, 8, 49,226,215,191,254, 53, 90, 30,225,231, 3, 85, 8,137,221,110,143, 63,
-253,211, 63,195, 60,207,152,166, 9,191,249,151,223, 20, 27,155,146,138,208,150,138, 46,242,101,156,145, 66,194,216, 83, 78,183,
-228,124,243,124,153,143,243, 84, 32, 49,229,107,228,201, 4, 9,197,200,105, 18, 87, 76, 5,185,122, 61,180,210,229,215,116,105,
-134,242, 30,145, 82,194, 26,139, 24, 34, 91, 63, 21, 23, 11,161, 4, 22, 81,218,214,213, 78, 71, 0,145, 0,169, 4,154,182,134,
-119, 11,218,166, 70,219,214,216,109, 59,156, 78, 7,104, 77, 7,111,142, 78,245,206, 83,241,174, 53, 66, 34,184,142,247,129,222,
- 99, 33,209, 72,150,217,243, 90, 43, 36, 36,180, 29,169,246, 19,104,125,145, 5,130, 57,188,134, 10, 28,189,122, 93, 4,123,219,
- 45, 43,170,169,147,172,106, 18,147, 37,134,113,101,210, 26, 37,148,229, 41, 70,228,179, 71, 64,177,253,202, 88,242, 71, 91,107,
- 81,215, 21, 9,200, 56, 27,254,227,199, 79, 80, 70, 99,154, 39,154, 64, 74,250, 58,165,144,216,239,182,204, 46, 39,145, 89, 94,
- 71,228,156,139,156, 72, 23, 19,104, 92, 47,201,254, 22, 60,173,205,148,214,164, 54, 79,188,131, 38,100, 26,234, 28,207, 27, 81,
- 72,105, 82, 10,180, 77, 3, 1,186,248, 73, 59,161,203, 37,151,131,109, 28,127,110,118,197,249, 23, 72,197, 70,183,221,110, 96,
- 43, 67, 72, 92, 41,208,118,204,198,247,129,119,217,180,203,151,146, 69,114,172,217,210,122, 5,147, 17,178,104, 43,144,128,224,
- 61,148, 84,232,218, 22, 93,211,192, 40, 13,239, 28,250, 97, 40,182,206,186,174, 73,175,160,200, 74, 71, 30,125,106, 48,172, 49,
-120,117,119, 15,196,136,121,162,212,187,202, 90,158,188,210,157, 64,227,248, 21, 12, 43, 95,212, 49,222, 64,145,114,209,155,201,
-125,121,175, 94, 62,247, 31,171,218,253, 65, 64, 77, 25,101, 70,218,223,176, 5, 41,143,101,214,244, 27, 33,196, 53, 79,252, 5,
- 14,119, 70,171,230, 8, 63, 33, 35,148, 76,208, 90,208,154, 87, 94, 59,180,197, 71,244,147, 67, 18, 57, 21,236,165,139,253, 26,
-197,185, 86, 80,223,136, 14,120,103,151,177,179,185, 74,150, 82,192,199, 0, 81, 4,106,162,140,161,229,179,100, 54,202,150,182,
-133, 82, 68,170, 94,170,238, 26,238,202,155,170, 66, 93, 85,229,162,207,163,248, 28,215,151, 56,129, 75, 51, 14,208, 90,186,192,
- 43,107, 56,142,145,247, 80, 90,209,254, 80, 73, 70,226, 42, 36,169, 0,109,128, 40,240,171,127,252, 5,254,241, 31,127, 73, 33,
- 20, 66, 20,208, 71, 74, 98, 53, 98,164, 61,219,149,228, 38,138, 18, 30, 18,136,249,130, 38, 36, 96, 65,103,102, 6, 65, 82, 2,
- 66, 11, 8, 35, 57,243,253,217, 85, 30,227,109, 55,205, 59,233,252, 44, 32,221,134,149,172,145,178, 98, 5, 96, 33, 22,130,248,
-222, 24,191,252,187,184, 85,217, 10,188, 36, 88,139, 87, 75, 27,110,199, 88,249,243, 76,156,176, 22,112,181,184,125,121,109, 32,
- 94, 36, 58,253, 84,159,250, 77,113,153, 13,127, 49, 21,177,156, 18, 18,127,252,179,159,163,174, 42, 12,125, 79, 29,186,214,152,
-150, 5, 62,134,162,245, 88,156,135,177, 21, 92,136, 24,198, 17, 1, 2,111,222,188, 37, 13, 69,136,232,251, 30, 41, 37,124,251,
-237,183,184,191,191,199,253,253, 43,180,109,135, 87,175, 95,227,213,171, 87, 16, 66, 97,127,247,138, 64, 38,227,136,115, 79,184,
- 80,107, 13,182,219, 14,199,227, 1,159, 62,125,194, 48, 12,216,237,119,216,110,183, 28, 65, 90, 97,191,219,225,110,183,167,116,
-172,105,194, 50, 78,216,111,119,204,218,150,208,182, 34,101,177,160,200,208,190,239,203,133, 10, 16,206, 52,198, 4,231, 2,241,
- 34, 86, 44,138,236, 87, 15, 49, 32,122, 18,197, 26, 77,239,159, 24, 61,180, 81,220,189,115,172,104, 76, 55,168, 89, 89,242, 34,
- 88,176,199,157,124,140, 17, 93,219, 66, 41,197,130, 88,122, 2,170,138,138,103,218, 73, 19,177,172,109, 27,216,202,112,135,234,
-161,185,128,168,172,197, 60, 47, 52,178,158, 23, 52, 77,139,166,109,203,179,147, 85,208,249, 44,104,154, 26,227, 48, 32,248,128,
-134,197,107, 57, 82,149, 8,110, 53,191, 30, 75,185,128,215, 66, 40,231, 73,244,150,187,215,251,251, 61,134, 97,162, 75,135,157,
- 57,217, 89,144,199,216, 25, 22,228,157, 67, 93, 25, 44,243,136,186, 34, 18, 97, 68,128, 84, 64, 18,244,218, 88, 91,193,185,229,
-166,177, 89,102, 7,231,169, 3,237, 54, 29, 42, 78,165, 27,199,145, 20,227,206,113, 10, 26,169,233,181,210, 8, 62,176, 80,174,
-194, 48,142,148,135,161, 20,154,170, 46, 17,220,148, 68,201,170,247,202,150, 41, 11,100,130, 46,130, 65, 89,114, 26,188,119, 5,
-115, 77,171, 10, 94,147, 38,194,205,230, 66,206,123, 15,201, 25,237,198,144, 40,206, 57,143,205,102,139,101, 89, 48,241,154,104,
- 94, 22, 14,145, 2, 7,232,208,107,218, 52, 13, 93,176,146,186,104,153,128,202, 24,212,182,194, 52,142,156, 18, 39,208,212, 84,
- 96,135, 16,112, 62,159, 41, 75,129,133,132,158,223,143,243,180,192, 45, 30,175, 94,191,134, 49,182, 92,242, 49, 6, 92, 46,180,
- 2,202,119,200,151, 80,209,241,217,133,190,134,209,228, 98,121,125, 6,133, 16,254, 0,157,122,194,179,228, 45, 20,172, 35, 98,
- 66,101, 44,148,212, 4,114,137,162,192, 62, 4,110,111,128,178,199,226,174, 78, 32, 66,138, 4,173, 18, 89,184, 20,239,224,101,
-130, 18,164,156,142, 41, 97,152, 23, 92,198,153,112,174,233,251,187,135,132,240,204, 42,148, 85,244,215,233, 66, 66,174,134,242,
-248,147,246, 38, 36,162,241, 5,100, 33, 57,161, 14, 9,101,231,153, 99, 85,181,214, 37,182,209, 90, 93,170,174,156, 17,108,173,
- 41, 35,118,205, 59,243,188,159,206,196,189,140,208,181,133,137, 79,191, 55, 87,113,154,255, 27,141,244,137,207, 30, 37,200, 94,
-150, 0, 88, 13, 81, 85, 24, 30, 14,248,219,255,235, 63,225,243,231, 51,184,144,189,122,242, 89,121, 14,166,117,229, 34,230,102,
- 71, 44,104,108, 40,175,196, 93,118, 14,100, 81,153,188,170,224, 37, 8,165,201,111, 64,113, 67, 27, 20, 63, 26,204,242,147,162,
- 7,158, 93,136,184, 73,246,186,245,164, 63, 47,240, 18, 91,208, 72,171,129, 2,120,184,126,237,180,102,200,241,169, 47,108,219,
- 11,199,255, 15,253,143,128,128,224, 11, 61,250, 0, 17,129,215,251, 59,252,241, 55, 63, 35, 84, 40,143, 8, 61,139,202,146,144,
-216,238,118, 8, 49, 96,154, 7,120,239,240,120,120,194,219,247, 31,224,189,199,249,114,193, 48,244,104,218, 22, 77,219,224,237,
-219,183,120,243,230, 13,154,166,197,249,124,193, 52,207, 24,167, 9,255,252,235, 95, 98,152,136,166,182,217,108, 96, 12, 61, 95,
- 31, 62,188,199,219,183,111, 17, 35, 21, 5,116,176,202,114,217,196, 16,248,191,123,156, 78, 39,204, 51,217,128,148, 16,168, 88,
- 27, 34,181, 42, 99,242, 80,252,217,190,236,206,151,101,161,144,146,197,115, 60,112, 34,197,183, 20,204, 4,143,101, 68,155, 47,
-173,121,154, 48, 14, 3,140,214,168, 45,117,127,209,211,231,131,148,232, 64,102, 45, 75,224, 68,176,252,188,208,193, 93, 51,100,
-133,246,177, 34, 81,228, 42, 82,132,209,170,100,153,167,148,208,118,100,187,171,109,133,190,239,241,246,205, 43,108,183,155,194,
-139,191, 12, 3,139, 97,137, 72, 70,251,104, 42,202,231,121, 44,171, 55, 18, 98, 69,158, 48,144,127, 59,119,142,199,227, 17, 21,
- 71,139,210,197,158,185, 30,130,129, 53,148, 16,153, 11, 8,107,171,114,121, 75, 33, 48,207, 11,195, 93, 38, 0, 18,166,100,158,
-207,240,222,163,173,169,251,205, 77, 82,140, 1,202,208,106, 47,231,151, 15, 67,143, 77,219,150,157,111, 63,140,232,251, 17, 33,
- 81,184,212,239,126,247, 29,101, 86,132,136,215,175, 95, 23,216,206,178, 44,232,199, 17,144, 10,138, 59,103, 37, 37,154,154, 96,
- 65,195, 56, 98, 24, 71, 76, 19,209,227,242, 5, 70,248,106,135,121,113,152,231,165,228,137,123,231,233,252,179, 6, 51,255, 25,
-130,194,120,246,131,219, 50,201,201,217,230,119,187, 61,106,107,225,157,131, 86, 2,193, 47,180,174, 52, 21,220, 18, 48,143, 51,
- 41,237,235,166,172, 43,168, 40,140, 5, 64,181, 38,181, 69,166, 74,206,243,140,161,239,225, 23, 71,223, 83,173,121, 55, 78,255,
- 47, 1,184,191,191,131, 16, 2,231,211,165, 76,114,242,156, 89, 8,133,105,154, 57,203,196, 80, 99,164, 36,148, 49,144, 90, 98,
-241, 30,211, 60, 99,113,142,116, 90,223, 19,255,178,165,152,239,135,245, 61,246,252, 50, 95, 23, 5,127,152,241, 59,207, 51,139,
- 24,158, 15, 38, 36,192,154,138, 46,244,180,254,144, 87, 53,114,182, 21,199,213,222, 91,148,203, 18,229,135,214, 76,156,227,241,
- 73, 66, 66,136, 17,227,226, 48, 45,129,232,100, 66,188, 40, 34, 88, 99, 67,145, 40,206, 46,183,114,107,111,114,102, 36,167, 20,
-105, 15, 21, 35,188, 95,174,251, 83, 65,189, 20,173,219, 73, 65,174, 20,121, 33,141, 38,209,136,201, 57,208,207,147,115,248, 27,
-179,222,149, 37,238, 72,213,234,194,110,170, 10, 77, 85,195,106, 82, 16, 91,107,217,210, 32, 57, 87,154, 88,248,165,227,227, 78,
- 29, 41, 65, 86, 21,194,236,240, 95,254,239,191,199,223,254,221,127,198,236,249,154, 37,198,226,205,208, 59,219,253, 2, 66,177,
- 44,145,197, 45, 94, 87, 36,217,230,120, 35,154,227, 61,123, 1,210, 72, 8,173,202,107,114, 27, 95, 38,126, 18,113,237,167, 92,
-234,235,239,115,202, 23,226,247,236,108, 18,207, 36,237, 55, 26,139, 23,151, 1, 2,191, 7, 34, 19,241, 63,226,159,117,118,123,
-182, 86, 27,161,160,133,192,159,253,201,159, 66, 73,133,101,154, 75,126,121,221, 54,152,157,195,183, 31, 63,178, 10,253, 17, 93,
-215,225,116,185,160,110, 26,124,250,252,128,158, 1, 32,247,247,119,104,183, 45,126,247,241, 35, 54,187, 45,102,183,224,243,211,
- 35, 22,239,224,130, 67,146, 18, 66, 41,116,155, 13,154,166,193, 56,246,101,122, 20, 99,196,195,195, 3,126,243,155,127,129,181,
- 26,155, 77,135,182, 37,208,208,120, 57, 99,211, 54, 20, 52, 82,219,114, 97,108,186, 14, 77, 91, 99,113,174, 28,142,224, 75, 53,
-240,136,186,105, 90, 56,231,145, 4, 93,214, 82, 42,184, 16,209,117, 91, 30, 51, 19,105,146,200, 98, 10,151,115,207, 23,179,224,
-110,208,176, 10, 94, 20, 53,240,181,120, 85,180,167,103,138,152,181,213,149,180,197,145,160,217, 43, 31, 60,217,158,148,186,190,
-127,173,181,140,254, 36, 32, 75,165,201,221, 50,207,115,209,195, 0, 17,243, 50, 18, 85,140, 87, 15, 70, 81,172,179, 95, 34, 54,
- 45,197,146, 78,172, 93,104,154, 6,227, 48,209,234,128,147,234, 46,253,128,105,162,142,124,191,223, 83, 44,106,226,224,151, 16,
- 49, 12, 67,233,242,105,223, 79, 34,175,105, 26, 81,215, 21, 46,151, 30, 41,145,213, 44,231, 72, 44, 46, 64, 72,141,113,156,176,
-223,223, 33,132,136,113,156,217,127,191,131,214, 26,155,205, 22,211, 52,194, 24,137,221,126, 3,169,128,170, 54, 16,130,186,238,
- 92,180, 85, 21,101,187, 95,250, 1, 85,211, 1, 74,225, 50,244,184,244, 23,108,186, 14,117, 93,243,250,129,186,246,105,154, 88,
- 23, 5, 10, 29, 50, 6, 67, 63,148,231,219,167,136, 37,120,104, 99, 80, 91, 91,248,240, 84,216,232,146,148,214,214,213, 53,125,
- 47,198, 82, 72,102, 95,251, 60,207, 44,180,244, 37, 76, 37, 49, 53,206,114, 3,148, 93, 74,134,201,128,203,226, 40,139, 32,128,
- 59,120,130, 16,181,220,149,135, 24,202, 30, 63,165, 84, 66,116, 98, 74,152,189,195,101, 28, 32,164, 68,219,117,128, 16,232,167,
- 17,144, 18, 62, 82,195,120,255,106,143,186,161,105,116, 93,215,168, 42,242,167,159, 47, 3,134, 97,196,111,127,251, 59,124,251,
-237, 39,134,228,204, 88,230, 5,222,199,226,176,137, 49,221,160,161,159,115,221,215,231,221,243,117,241,173, 8, 60,253,148, 75,
- 61,221, 30,122,207, 89,114,207, 46,210, 4, 18,188,208,232,221,112,142, 46,131, 88, 5,253, 16,185, 27, 90,155,156,210, 85,120,
-164,181,228, 24, 83,138, 50,205,254,108,178,210, 19, 96,212,199,132,211,101, 96,143, 43, 94,228,224, 94, 71, 24,225,122,175, 39,
- 42, 8,202,133, 30, 83,177, 42, 36, 14,107, 73, 41,194,249, 5, 46, 44, 8,209,149, 49,117,174,182,115,247,107,120, 63,110, 43,
-205, 85,175,184,218,159, 20, 93,134, 89, 44,183, 22,195,105, 30,183, 87,121,223, 94,118,237,164,130,175, 56,170,182, 48,218,179,
-244, 75,169,171, 58, 94, 73,206, 24, 79, 80,166,130,144, 10,255,244, 15,255, 21,255,225,111,254, 3, 62, 63,158,224, 67, 30, 93,
-223,234, 10,114,183,126,251,160,196,103, 78, 49,238,196, 21, 11, 26, 86,147,133, 27,130,218, 51, 5,121,222, 5,137,127,243,101,
- 46, 94,228,197,125,233,153, 19, 55,123,119,241,162,240,174,144,243,152, 56, 40,211, 85,248, 86, 46,213, 31,194,193,254,193,187,
-243, 23,226,147, 18, 21, 98, 31,222,190,199,215,239, 63, 96,102,219,208, 60,207,168,155, 26,135,195, 1,159, 30, 62, 65, 72,137,
-227,249,140,118,179,193, 48,140,197, 82,153,132,192,235,183,111,176,217,108, 48, 78, 19,158,142, 71,188,253,240, 14,199,203, 25,
-223,126,250, 4, 83,215,216,221,223,193, 50,193,108,127,127,135,186,109, 32, 52, 93, 44,155,205, 6, 95,127,253, 53, 41,200, 35,
-141,155,115,146,214,249,124,198,175,126,245, 43,178,158, 1, 16, 49,225,240,249, 17,143, 15,159, 75,180,170, 82, 10,110, 33,223,
-245,200,140,113, 82, 24,211, 25,160, 88, 92, 55, 12, 35,237,131, 37, 93,196,243,188,148, 93,116,166,145,205,243, 76, 0,143, 0,
- 26,207, 75,205, 99, 97, 95, 28, 42,249, 89, 8, 62, 18, 84, 70, 91,200, 36, 41, 83,155,187,177,124,137,208, 8,158,248,246, 11,
- 7, 56,101, 68,178,229,244,171,140, 23,181,188,151,167,189,246,130,166, 38, 0, 11,141,168, 51,197, 11,215,207,217,147, 32, 77,
-242, 68,140, 98, 96, 47,120,245,234, 85,249, 60,180,162,215, 82,107,141, 77,215,224,116, 58,161,170, 42,156, 78,103,246,125,171,
-155, 51, 99, 89, 28,124, 72,120,120,120, 68, 93,213,104,219,134, 41,122,115,153,188,117,155, 13, 62,127,126, 98,161,161,196, 60,
-123, 44, 46,176,173, 42,225,116,186, 96, 89, 72,120,230,253,130,166,161, 63, 31, 66, 64,215,117, 68,249, 83, 2,221,166, 45, 34,
-184,148,136,112, 87,215, 53, 46,151, 30,117,211,224,112, 56, 34,248,128,199,167, 39,188,125,247,142,178, 51,164,198,166,221,226,
-116,188,160,239, 39, 84,198, 66,128,206,197,105,154, 8, 28,195,160,157,121,158,203, 52, 44, 99,173,179,226, 61,143,148,149,162,
-112, 42, 41, 36, 23,110, 28,141,203,194,177, 28,198,227, 98, 96,110,124,197,177,174, 26,167,211,105,149, 7, 33,216,137,160,177,
-219,109,153,254,166, 40,152, 70,106,198,210, 70,248,197,145, 14,131,239, 3,210, 25, 4,216,186,162,228,190,166,129,144, 18,143,
-199, 3,206,253, 5,117, 71, 74,248,203, 56,208,186,150,201,129,148,128,103,209, 52, 45,172,169,176,219,238, 80,217, 10,211,188,
-224,124,190,176, 38,193, 97, 28,167,178,130, 12,252,241,110,117, 90,120,177, 11,207,107,152,231, 22,182, 92,220,196,149,163, 75,
- 70,241, 12,156,181, 82,249,170,148,169,141, 9, 81, 8, 68,153, 16, 50,171, 38, 1, 34, 31,130,217,200, 36,174,248, 87, 4, 10,
-106, 49,138, 70, 68, 34,195, 34, 82, 40,227, 75,210, 39, 11,136, 40, 24,129, 34,120,124, 7,168, 20, 97,101, 68,165, 19,197,120,
-203, 4, 37, 19, 68,242,144,140,142, 93,124, 66, 63, 56,120,159, 10,161, 46, 36,226, 71,251,228, 17, 57,161,139, 72,115, 4, 70,
-185, 25,171,174,246,109, 41,120,202,249, 77, 30,136, 14, 18, 1, 33, 82,151, 78, 2, 23,162,107,105,109, 33,160,175, 30,117, 91,
- 81, 52,172, 18,136, 8,215, 44,119, 33,138, 95,155, 46, 28, 82,209, 39, 8, 68, 65, 95, 99,165, 13,239,107, 44,154,170,134,209,
-228, 19,213, 90, 67, 25, 66,208, 74, 45,145,164,128, 80,154,169,110,140, 72,148, 18,145,127,208,165, 11,124,251, 79,191,194,223,
-252,239,127,131,255,239,191,254, 10,206,107, 72, 65,212,163, 43,197, 69, 20,194, 87, 76, 52,121,136, 32,117,103,128, 71,132, 71,
- 72,129, 69,189,226,170, 86, 84, 9, 73,103,238,123, 30,207, 7,234,254, 35,217,159,124, 10, 72,130, 2,101, 75,215,158, 86, 29,
-174,224,152,213, 68, 23, 65, 74, 9, 73, 10,242,105,231, 66,128, 89,253,215,184, 84,172,118,219,248, 94,184, 65, 17, 90, 9, 81,
- 2, 93,168,219,141, 16, 34, 64, 72,207, 15,182, 4, 18, 23, 72, 34, 33,202,132, 40,185,239,142, 20, 1,160, 34, 89, 11,233,113,
- 95,237,246, 25, 85,172,144,160, 94, 76, 63,255, 55,232, 80,178,125, 99, 21, 68,163, 32,160, 98, 66,171, 43,252, 47,127,253,239,
-208, 24, 11,132,132, 97, 28,240,120, 58, 96,156, 71,124,122,248, 22, 70, 43,244,227, 8, 99, 27,116,205,150,242,200,173,101,244,
-107,131,186,109, 16, 19,112,120, 60, 96,215,237,240,246,205, 59,156,207, 61,190,254,234, 27,116, 13,165,106,105,169,208,213, 53,
- 54,117,139,233, 50, 33, 44, 1,117,213, 96,211,118, 24,134, 11, 30, 15,143,232,167, 30,170, 82, 56,143, 23,244,211,128,207, 79,
-143,184,123,253, 26,119,175,223,192, 54, 45,160, 52,102,231,209,108, 54, 88, 98, 64, 20, 64,223,143,144, 9,120,179,191, 71,171,
- 45,144, 0, 31,232,253, 87, 91,141,176,204, 80, 66, 98,236, 71, 30,145,123, 32, 6, 44,115,102,207, 43,120,198,213,198, 24,209,
-182, 29,231,110, 3,243,226, 17, 24,100, 83, 25,131,200,236,120, 31, 2,117,142,206,195, 59, 79,193, 71,138,188,236,214, 90, 24,
-173,232,217, 74,192,253,126, 95, 20,204, 70, 19, 89,206,154,204,209, 72, 72,240, 48, 86,243, 65, 9, 84, 70, 66,201,136,202,200,
- 98,165,205, 2, 46, 82, 63,123,204,139,227, 12, 11,192,242, 78, 88,155, 10,139, 15,148,187,109, 20, 42,173,208, 54, 53,180,182,
-152,134, 25,136, 64,215, 52,136,136,112, 33, 0, 66,163,178, 21, 18,127,221,206, 69,120,167,177,120,141, 99, 63,193,115,234,220,
-241,120,162, 34,104, 9,128, 82, 24,166, 11, 82, 92, 16,252,130,170,182, 80, 58,225,241,233, 1, 77,215, 66, 41, 1,239, 23,140,
-243, 0, 31, 29,217,179, 18,104,220,239, 34,206,167, 11,140,174,225, 93,194,120, 25,177,219,110, 97,173,134,210, 9,202, 10,232,
-138,128, 58,116,246,105, 40, 69,156,252,121, 30,177,223,111,161, 68, 66, 83, 25, 52,117, 13, 31, 60, 38,239,208,110, 55,152, 70,
-135,228,129,105,152,161, 57,220, 38, 38,202, 25, 23,146, 76, 58,214, 8, 84, 21,233, 33,206, 67, 79,157,110, 85,177, 6,151, 89,
- 4,172,105,242, 49,209,101,108, 12, 11,168, 85,233,254,125,138,144, 70, 67, 87,150,210, 4,235,150,158,163,228, 33, 84,194,226,
- 39,212,109, 5,201,178,171,203,212,163, 95, 38, 44,110, 97,187, 50,145, 2, 29, 91,237, 4,103,171,251,224, 89,252,167, 97,148,
-133, 95, 2,230, 97,129,134, 65,152, 34,220,228,233,162,238, 73, 95,224,157,131,155, 39,156, 79, 7, 72, 68,108,218, 10, 93, 91,
-115,134, 72,164,181,172,145,204,227,144, 76, 76,197,247, 92, 61,235,253,121,161,200,241, 68, 52,111, 20,215,116,185, 53,193, 16,
-140,203,250,193, 78, 34,119,232, 81,136,223,219,120, 93,119,156,116,200,210,110,216,148, 3, 57,138, 21,215, 93,174, 88,227,226,
- 42,130,186,170, 92,217, 34,166, 36,180, 22,156,243,125,221,123,146, 85,199,225,233,120,102,232,140, 40, 80, 58,113,211,169,135,
-162,108,206, 47,194,245,255,209,254, 60,139,246,168,138,207, 99,247, 0, 36,129,224, 19,144, 36,121,110,121, 61,160, 20, 80, 85,
- 36,126,203, 42,219, 44, 82,112,206,193, 5, 18,222,249, 72, 56,217,197, 69, 44,206, 23, 97,147,128, 40, 23, 90, 82,146,216,234,
- 90, 33, 73, 1,105, 12,176,170,212, 37, 87,114, 16,128,145, 10,136,177,236,173, 52, 43, 75, 19, 36,190,253,197,239,240,239,255,
-183,191,193,223,253,237,127,193,228, 21,146,182,116,121, 33,222, 8,198, 74, 32, 3,114,122, 92, 42,107,135,152,109,127,121,148,
-157,147,218,212,213,191,126,149,206, 11,144, 23, 46, 2, 33, 82,130, 85,202, 80,151,151,144,197,233,167, 58,217,190,220,206,222,
-136, 69,190, 36,244, 72,207,246,223,226, 75, 91,163,239,205, 3,190,112,253,254, 15, 25,187, 23,154, 97, 18, 20, 27, 28,233,231,
- 63,250,230,143,240,230,254, 53,230,113, 98,111, 44, 65, 77,126,249,235, 95,193, 86, 67, 42, 5,208, 0, 0, 32, 0, 73, 68, 65,
- 84, 21,132, 36,154, 33,164,196,231,195, 1,237,102, 3,239, 35,218,174,131, 53,196,228, 62,159,122,236,247,247, 0, 4,198, 97,
-196,119,223,125,135,221,126,135,205,102, 75,254, 93, 99,208, 53, 45,144, 18,166,121,160, 72, 76, 79,123,242,105,154, 96,181, 41,
-120,231, 97, 24, 9, 25,107, 45,118, 59, 82,224,207, 51, 99, 87,121, 61, 52,142, 3, 46,151, 11, 37,122, 85,134,121,235,196,122,
-160, 98,148, 56,232,198, 84, 36, 26, 2,237,212, 19, 18,166,105,224, 20, 71,218, 53,135, 64, 52, 56,205,121,235,203,226, 49,114,
- 32, 71, 74,137, 24,235,220, 93, 57,142,202, 76, 41, 64,241,132,143,192, 55,215,224,168,124, 88,110,183, 29,180, 98,150, 60, 79,
-203,242, 58,204, 23,235, 20,237,227, 41, 46,149,222,215,214, 24, 22,237,138,226,109, 15,156,103,158, 65, 33,222,123,108,183,155,
-219,245, 95, 78,168,100,117,119,126,110,115,172,232, 48, 12, 8, 46,192,106, 3,183, 44,164,140,182, 6,202, 24, 26,169,123,143,
-143,159, 62,211, 68, 67, 73,194,215, 26,130,247, 76, 51, 37,175, 73,173,201,110, 42, 5,166,113,134,146, 20,117, 26,188,199,110,
-183,131,228,175,125,230, 8,210,121,158,208,117, 45,141,166,103,178,176, 85,117,141, 97, 24,233,251, 39, 81,148,243, 74, 0,155,
-174, 35, 22,194,102,135,254, 66,161, 44,100,233, 3,180,164,238, 89,107, 89, 38,173, 49, 37, 24,166,231,121,231,139, 16, 85, 43,
-197,140, 3, 22, 42,118,180,235, 55,214, 34,197,136,243,229, 2, 33, 37, 44,235, 26,138,170,155, 99, 90, 83,162, 9, 75,182,149,
- 45,203, 82,166, 58,121,189, 73,185, 4,137,241,190, 96, 76,110, 96,194,105, 36,123,176, 33,189,196, 50, 47, 24,199, 17,222,135,
-226, 29,167,176, 24,154, 50, 16,204,198,151,239, 89, 8,161,136, 24,145, 18,166, 97,130,247, 36,122,187, 92, 46, 8,254,250,121,
-140,211, 8,169, 72, 91, 98,141, 45, 22,233, 12,152,202, 69,124, 6,206,188,116,177,175, 99, 93,149,224,188, 2, 38, 76,222, 58,
-128,114,147,150,161,109,207, 7,156,226,167, 31, 77,235,106, 99,253,243,250, 13,243,195,170,224, 91, 37, 61, 61, 84, 60,130, 23,
-138,109, 6,215, 55,139,143,192,121, 24,209, 79, 11, 34, 36, 4, 43, 35,139,150, 11,130, 38, 9, 41, 19,228,192, 85,118, 44, 63,
- 82, 10, 5,128, 65,217,203,148,142,157,147,125,178, 17, 91, 66, 35, 70,208, 42, 65, 11,216, 90,163,169, 13, 42,171, 75,176, 76,
- 76,100, 45,153, 22, 79, 2,139,105, 65, 63,204,232,199, 9,227, 60, 99, 90,150,146, 67,236, 67,132, 7, 48, 35, 96, 73, 30, 14,
- 17, 75,244,152,131, 47,163, 55,138,225,163,139, 84,177,178, 60,239,221,172,177,216,116, 91,116,109,139,224, 35,254,233,255,249,
-111,248,247,255,199,255,137,255,248, 31,255, 30,203,108,145,208,192, 65,192,203, 76,141,123,193, 35,189,254, 94,241, 78, 50,239,
- 37,203,131,144,247,161,236, 87, 23,101,125, 65,127, 32,133,196,244, 47,143, 16, 86,208, 23, 6,207,224, 70, 40, 39,126,218,180,
-253,247, 5, 10,137, 31,130,217,136, 31, 40, 38,196, 23,234,137,223,239,255,252, 67, 57, 69,110, 68,123, 66,150,234,130,245,152,
-216, 52, 45,254,226,207,255,188, 0,124,165, 86,232,199, 1,253, 48, 82,135,194,170,233,105, 30,241,240,244, 25,194, 90, 36,169,
- 80, 53, 13,217,107,166, 25, 90, 91, 40,166, 11,126,126,122,196, 47,126,241, 11,188,127,255,158,210,184, 30, 63,151,221, 97, 8,
-129, 20,237,187, 29, 94,221,223,161,109, 41, 32,101, 26,102,116, 93, 7,173, 52,218,186,229,221,177,198,155, 55,111, 75, 7,125,
- 62,159,113, 60, 62, 97,187,237,224,150, 5, 90, 74,218,185, 43, 58, 86, 62,125,250,200, 5,118,164,137,157, 50,112, 81,192, 39,
-208,197,165, 53,230,121,226,117, 13,197,180,134, 16, 17,124, 38,242, 17,197, 98, 89,232,235,149, 66, 51,114, 52, 93,199,182, 44,
- 62,106,186, 22, 82, 43, 40,163, 89, 23,114, 27, 79,153, 47, 0, 33, 5, 66,164, 78,188,156, 79,172,168,166, 88,211, 13, 21,187,
- 60, 18,166, 75,225, 42,202,210,138, 64, 41,214, 26, 46,140, 40,106, 85, 74, 58,192,137,101,238, 89, 24, 24, 80, 49,183, 34,143,
-152,179,152,110,154, 38, 12,227,136,126, 24,224, 29,217,165,148, 20,104,155,182,116,181,195, 56, 82, 62, 55, 8,160,146,133,102,
- 89, 27, 20,188, 99, 24,143, 69,211,109,176,184,192,176, 41,138,161, 30,135, 17, 74, 72,178,164, 9, 32,134,128,121,158,112,183,
-223, 34,120, 71, 64, 22, 73, 19, 11,231, 23, 52, 93,131,197, 17,208, 40, 37,242,118,247,125, 79,226, 92, 65,233,118,109,219, 17,
-235,129, 77, 51,185, 72,200,194,190,101,153,233,220, 74,169, 20, 87, 62,120, 30,171,107,246,144,207, 37,225,205, 90,139,224, 61,
-182,219, 45, 57, 3, 88,196,102,180,226, 51,156, 67,154,184,153,161,124,242, 26, 70,170, 66, 12,205, 14,130,138, 93, 69,125,223,
-195, 48,160, 40,132,192,193, 41,180, 94, 93,143,188, 37,195,126,168, 96, 0,206,231, 30, 33, 68, 28, 15, 39,104, 93,241, 90,150,
-190,111, 57,201,142,210,175, 73,143, 36,100,134, 5, 41,244,253,128,203,101,128,115, 17,134, 89, 17,211,188,240,189, 65,168,239,
-235,121,152, 74, 97,243,252, 28,123,110,183,198,202, 73,148,158, 69, 68,223,238,211,179, 0, 26,208, 41,165,231, 18,244, 31, 39,
-140, 43, 60,239,116,147, 99,157, 85,214, 66,210, 56, 80,200,219, 36,153, 40,210, 45, 26,180,140,134, 19,123, 84, 51,219, 36,225,
-170,211, 34, 15,183, 34,131, 22, 66, 76, 88, 66,196,225, 52, 98,114, 17, 81,152,107,231,243,236,142, 16, 0, 82,160,174, 91, 40,
-138, 26, 75, 69, 65, 40, 86,127, 42, 34, 70, 89, 38, 1,130,248,161, 48, 74, 33,196,128, 74,106,182,167, 41, 52,141, 65,221,214,
- 48,214, 20, 10,212, 60, 59, 76,227,194,187,170, 72,235, 10,182,207,208, 5, 77,133,200, 60,207,136,209, 67, 25, 5,176,198, 77,
- 43, 69, 35,170, 36, 75, 96,132,139, 1, 22,134,112,174, 41,193, 26, 13, 83, 87,208, 66,160,110,106, 36, 0, 31, 63,126,198, 47,
-126,245,107,252,167,191,255, 7,252,221,127,254,127, 49, 78, 9, 16, 21, 2, 18, 60,104,244, 44,217,105,112,179,131, 78,226,198,
-143, 77, 13, 55, 67, 79,210, 51,193,216,106,116,143,117, 78, 74, 14, 56, 23, 18,222, 5, 4,255, 18, 39, 64,148, 78, 55,221,110,
-245,191,215, 85, 63, 7, 1,253, 88, 5,252,143,101, 39,124,249, 47, 74,215,156,247,155,143, 47,190, 52,179,250,131,119,234,153,
- 62, 43, 25, 54,243, 87,127,249, 87,120,247,230, 29,146,243,240,129, 2, 82, 2,103, 31, 72, 41, 41,241,111,153,201, 78, 36,129,
- 57, 6,232,224, 81, 53, 45,164,247,120, 58,158, 48, 44, 51, 90, 78,190,170, 42,242,157,191,122,245, 10,199, 35,101,111,127,243,
-213,215, 56, 28, 14,165,147,253,240,254, 29,206,167, 19, 31, 92, 17, 85, 67, 65, 27,222, 5, 76,105,194,118,179, 69,221, 52,136,
- 49,225,241,241,145,194, 65,140, 65,215,209,110,122, 94,102,188,123,247, 22,138,187,179,211,249,132, 97, 28, 97,154, 14,154, 11,
- 67, 31, 34, 32, 13,134,121,193,253,253, 22,227,116, 66,219, 53, 68, 23, 19,146, 25,237,156,236,184, 58,208,134, 97, 96,125, 14,
- 81,206, 22, 63, 65, 1, 72, 90,195, 50,171, 33,242, 97, 41, 1,222,183, 11,196, 20, 72,127,147, 18,106, 91,209,112, 41,239, 30,
-133, 64,215,181,184, 92, 46, 64, 4, 57, 10,184,195,116,195, 66,170,241,182,225,169, 33,217,177,188,247,240,110, 1, 18,101, 64,
-248,144, 80, 85, 53,172,214,184,156, 78,184,219,239,160, 13,117,139, 21,235,103, 32, 18,166,121,164,169,163,161,110,221, 90,131,
-105, 14, 48,150, 58,248,121, 89, 10,243,190,170, 44, 46,135, 1,109,211,226,112,248, 12, 33, 64,133,146, 20, 28,162, 66, 23, 27,
-249,204, 19,148, 36,180,238,227, 52, 97,154,103,138,129,213, 26,195,229, 2, 41, 18,166,105,196,219,215,175,240,240,244,136, 97,
- 28,161,165, 68,183,223, 35,248, 19,148, 4,234,198, 34, 38, 15,200, 4, 23, 28,108,109, 17, 99,192, 48,142,184,219,111, 41,116,
-103,158, 97,180, 66,138, 1,203,180,144, 5,172,161,181,164,181, 26, 93,215, 22, 98,158,227,188, 0,176,189, 44,167,218, 53, 90,
- 67, 70, 73,160, 21,231,209, 54, 13,230,121, 65,101,107,248, 56,150,174,124,158, 38, 88,187,129,209, 26,209, 82, 1, 20,125, 40,
-196, 78,169, 8,251,154,197,139, 90, 73, 90,119,240, 74,198, 90,131,197,121, 44,243, 82,224, 95,212, 40,145, 40, 79,115,120,141,
- 16, 10, 81, 0, 73, 36, 44,110,225,156,115,176, 53,212, 96, 28, 39,214, 46, 25, 40, 41,177,217,236,112,185,156,139,237, 45,132,
- 64,217, 8,145, 18,248,186, 13, 77,115, 47,253,192,103, 44,221, 49,222, 5, 44,252, 58,144, 8,251,138, 84,255, 33,186,230,186,
- 33, 94,223,151, 47,137,193,179, 96, 56,165, 4,157, 63,129,223, 59, 82, 23,171,234, 32, 51,219, 83,188, 54,101,207,192, 27, 49,
- 70, 24,197,163,119,200, 27, 99,124, 90,141,199,111, 4, 79, 92, 32,136,148,253,185, 2, 90,230,125, 65,198,115,243,200, 92, 72,
-140,139,199,105,152, 49, 57,202, 55,142, 47,116,101,197,194,197, 42,246, 24, 37,164,178,132, 86, 21,130, 5,225, 98,117,192,114,
-215, 45, 19, 82, 80,144,194, 0,130, 60,225,109, 91,163,174, 13,186,109,141,186,109,174, 96,143,101,193, 50, 77,184,244, 61,250,
-203, 64, 7,153,169, 96,235, 26, 82,209,133, 15, 17,225,221,130,203,185,199,227,227, 35,148, 0,238,246, 27, 52, 77, 5, 32, 64,
- 41, 1,107, 27,212,117,131,228, 3,144, 2,108,101,200,198,226, 28,133,159,168, 10,151, 97,132, 76, 17,143,135, 39,156,143, 39,
- 60, 62, 29,240,187,135, 3,126,249,235,239, 48,204, 14, 1, 9, 72,196,186,150,130, 87, 7, 47,161, 4,139, 98, 80,176,231, 53,
-242, 24, 62, 19, 1, 25,173,154,194, 85, 57, 95, 46,121, 94,175, 72,197,119,189, 44, 15,236,181, 96,138, 69,160, 39,120,159, 84,
- 2,124, 50, 69, 54, 82,183, 69, 59,212,103, 36, 58, 33,111,208,174,185,240,204, 19,145,151,124,234,233,197,135,152,125,241,248,
- 2, 14,118,253, 53,241,106,226,185,126,244, 90, 17,139,103,140,154,244, 19, 10,140, 47, 21, 38, 40, 49,180, 34,210,133,244,205,
- 87, 31,240, 23,127,242,103,208,202,224,241,241,128, 16, 61,206,253,137,246,149, 51, 93,230, 74,107, 40,173, 40, 43, 92, 27,244,
-243, 8,239, 28, 94,223,191,193,211,225,128,152, 18,246,251, 59,204,206,193,197,136,251,205, 14,155, 77, 87, 60,217, 95,125,245,
- 21, 14,167, 35,230,113,194,215, 95,127, 13,107, 12,166,113,196,127,255,231, 95, 96,191, 35,196,235,221,221, 29,217,144, 78, 1,
- 41, 38,108,119, 59, 28,142, 71,108,183,219, 34, 34, 3, 18,190,251,248, 29, 0,178,126,229,212,171,105, 89,224, 98,128,177, 26,
- 66, 36,108,187, 22,167,126,130, 47, 88, 32, 89,118,224, 74, 83,193, 55,140, 19,150,217, 99,183,107,177, 44, 35,251,148,175,194,
- 40,218,173, 55, 24,134, 30,202, 82, 2,219, 52, 45, 80,218, 96,114, 30, 49, 17, 79,219, 71, 79,226, 62,101,216, 74,167, 74,225,
-125,253, 59,232,146,205,108, 5,109,136, 41, 30, 4,241,197, 51,234, 52, 7,109,180,117, 75, 96,157,101,193, 6,192,221,118,135,
-143, 15,159,224, 22, 2,141, 40, 9,204,211,136,205, 55, 95, 33,196,128,121,158,177, 44, 11,236, 42, 51, 93, 8, 20, 43,234,250,
-215,117,221, 20,214,187, 97, 37,246, 50, 59,104,229, 32,165,134,214, 9, 77,109,153,234,167,120, 21, 50, 65, 91, 42,168, 98,240,
- 84, 84,205,142, 2,104,184, 8, 52,172,228,159,166,137,212,234,214, 98, 24, 7, 38,164,121, 84,149,129, 15, 14,186, 34, 68,173,
-159, 2,198,105,194,110,183, 3, 0,140,125,143,121, 94, 72,127,177, 44,204,142,151,220,164, 92, 47,157,188,130,201, 72,219,106,
-211,178, 48,177, 94,165,169,145,192,114,179,221,160,170,106,156,143, 39, 68,203,205, 32,239,247,199,105, 68,219,182,152,230, 25,
- 93, 36,126, 64, 85, 9,122,221,103,130,181, 4,239,161,249, 92, 52, 70, 48,221,111, 66,219,212, 8,140,162,205, 81,175,203,226,
- 48,141,148, 65, 95,215,121,162, 74,231,142, 20, 2,218, 88, 4, 65,147, 15,183,120, 68, 73,235, 23,130,231, 4, 78,140,139,236,
- 61,167,152,220,152, 0,231, 3, 52, 39,212,229,243,108, 28,168, 0, 72,145,224, 67,203, 66, 86,194,156, 52, 26, 10,158,252,122,
- 78,228,201,207,247, 59,238,244, 61,215, 84, 78,216, 20,207,214,223,235,223,155,196,245,156,212, 63,220, 77, 92, 79, 98,241,133,
-166, 93,172, 84,229,249,178,200, 76,226,239,143, 49,129, 64, 3,243,103, 99,224, 4, 41,215,209,170,121, 2,204,168, 88,228, 49,
- 55,224,163,192,121, 90,240,120, 26, 16,160, 24,113,154,243,198,174, 61, 97,140,171, 41,112, 81,188, 39,164, 66,165,122, 54,210,
-205,246,152, 20,233,122, 18, 2, 74, 89,212,149, 70, 93,147,202,221,121,143,195,241,140,167,199, 39, 12,125,143,203,153, 84,171,
-211, 56, 97,154, 23, 72,169,177,191,187, 67,203, 20, 38, 33, 37, 34,143,118, 62,125,247, 17,167,227, 17,247,119,123, 88,165, 33,
- 3,121,193,147,150, 16, 30,240, 51,137,126,108,109,161,140,196,209, 26, 24,173, 72, 52,162, 20,132,136, 37,216, 69, 64,194, 71,
-133,195,197,227,183, 31, 31, 49, 46, 4,224, 17,201, 19,120, 55, 82,202, 87, 38,185,149,139,135, 95,158,192,253,115, 2,117, 41,
- 49, 37,122,248,214,223,220,144,138, 24, 46,197, 8, 81,210,206, 88, 76,198,247,174,243, 1, 33, 94,115,216,138, 24, 82,144,250,
-159, 30,230,156,192,247,108, 64, 35,226, 74,125, 47,190,172,233,248,177,172,226, 23,198, 88,171, 80,247,162, 39, 40, 95,169,100,
-118, 66, 38, 56, 9,249,189,207, 35, 71,136,190, 12, 70,198,247,222,136, 63,229,159, 24, 3, 52, 20, 84, 74,232,234, 22,255,235,
-191,251,159,113,183,223, 99, 25, 38, 76,227,136,113,185, 16,146,114,153,139,157, 39,132,128,205,102,131, 20, 19, 78,151, 51,148,
- 49,216,236, 91,156, 78, 39, 92, 46, 23,216,182, 70, 63,244, 8, 49,162,169,107,216,202,226,112,120, 66,215,181,104,219,134,157,
- 30, 30,218,106,132, 20,112, 60, 13,240,203, 76, 73, 82, 90, 99,179,219,225,120, 62,225,225,211, 3,172, 49,216,110,183,228,143,
-247, 14,143,143,143,204, 29,127,130, 15, 30,253, 64,169,112,247,247,247,136,142,152,242, 79,199, 3,132, 0,222,191,123,139,223,
-126,251,145,130, 53,120, 2, 55, 79,148, 55, 29,131, 69,136, 17, 94, 0,182,169, 33, 68,196,226, 3,134,113,130, 82,228,149,142,
-105, 34,165,246,236, 80,215, 36,100, 50, 21, 29,224,199,211, 9,187,205, 6, 9, 18,159, 63, 31,176,221,111, 81, 65, 34, 4,183,
-154,252,241,235,171, 52,130,136, 48, 82,115,115, 1,196,152, 47, 63,205, 7, 52,117,189,222, 57,182, 69,145,170, 88, 49, 95, 62,
-197, 8,173, 52,134,190,199,118,187,197,221,126,143,223,124,251, 17,206, 59, 64, 73,180,109,195,187,102, 95,242,212,243, 51, 65,
-205, 13,138,250,222,121,143,170,178,101, 71, 91, 91,138, 68,165,137,135,131,214, 6,227,200,222,104, 75, 89, 15, 20, 13, 74,123,
-245, 24, 35,134,161,199,235,215,175,113, 58,158, 32, 5,185,132,178, 94,166,109, 91, 76, 61,185, 11,218,166,194,226, 28, 18,211,
-231,172,173,112,185,156,177,221,110,177,221,108, 48,177,215,188,109,106,204,211,204, 73,136,130,115,202, 29, 22,199, 34, 66, 41,
-225,184,152, 91,150, 9,231,243, 25,219,109, 87,214, 19,132, 19,246,104, 27,178,240, 65, 8,230,238,147,109,119,156,105,124, 93,
-177,162,126, 89, 28,218,166,161,181,138, 97,148,175, 15,112,126,161,139,189,109, 48,142, 51, 77, 49, 91,154, 4, 44,129,166, 27,
- 77,219, 32, 56, 15,173, 36,147, 62,105,149, 52, 12, 35,229,117, 40,242,118, 71,166, 6, 54, 77,205, 23, 98, 68,240,129,232,133,
-222, 67, 10, 58,226, 20, 67,122, 0, 96,153,201,181,225,150,165, 12, 35,115,210,223,167,239, 62, 65, 41,137,237,102,135,166,173,
- 17, 34,112, 57,159, 1,154, 27,149,160, 30,234,129,228,141,134,233, 57, 60, 43,143,245, 95,212,164, 61,179,237,230,139,253, 86,
- 32, 44,174, 41,164,160,179, 88,112, 88,215, 15, 94,234,226,102, 37, 42, 94, 94,126,166,239,119, 44, 25,119,153,138,149, 40,219,
-203,168,179, 22,223, 27,165,230, 47, 64,144,152, 59,243, 77, 68, 86,224,115, 39,149,136, 34,119,238,103, 28, 47, 3, 2,232,210,
-132, 72, 16,130, 50,206,229, 74, 20,166,147,188, 2,103,104, 57, 65, 59,244,120,187,203, 23, 2, 8, 17, 69, 8, 19, 34, 89, 73,
-220, 2, 92,206, 14,126,233,241,244, 8, 56,191, 32,120, 7,239,151, 18, 31,152, 85,211, 49, 1,214,106,124,126, 58,226,225,233,
- 68,133,138,162, 0,142,105,114,152,135, 9, 82, 86,240, 1,120,248,252,132,222,144, 26,184,237,106, 84, 76,221,139, 49, 98, 26,
- 21, 18,184,242,228,177,227,221,126, 75, 89,207,117, 5,163, 13,130,143, 56, 31,123,124,252,120,192,185,119,164,205, 22,170,140,
-214,197, 13, 95,141,225, 49,105, 5,135,201,177,227,140,141,141,121, 13,147,167,236,249, 27,231, 3, 82,136,164, 88,143,145, 96,
- 8,145, 46,252,228, 3,132, 19,112,227,140,232,175,224,161,196, 68,193,117, 70,123,190,208,175,124,249,231, 69, 99,250,130,141,
-237,217,115,242,111,158,128,191,208,213,179, 0, 48,177,113, 48,189,192, 56,184, 29,121,137, 50,213,249, 82,184,194,143, 29,192,
- 43, 65,149,181,145, 10,127,253, 23,127,137,159,125,248,138, 38, 63,231, 51,139,183,124, 97, 67,103,116,171,155, 38,182,140, 25,
-124,120,251, 22, 82, 91, 24,165, 49,187,153,198,191,188, 23,221,237,118,232,218, 14, 33, 44, 72,137, 0, 50, 66, 8, 28, 14, 79,
-208, 90,227,221,187,119,116,121, 69,178,156,109,119, 59,196,148,240,116, 60, 64, 41,133,182,235,240,225,253,123,244,151, 11, 30,
- 62,125, 42, 84,175,166,233, 48, 12, 3, 32, 5,246,251, 59,238,110, 35, 62, 61, 60,160,105, 27,212, 77,131,174,107,208,247,103,
- 32, 56,204,227,128, 8,137,170,170, 17,162,134, 54, 21,134,126, 68, 76, 14,213,221, 22,211,228, 32,164,130, 18, 10,144, 36, 14,
-243,145,220, 55,227,236,208, 15, 19, 32, 36,238, 95,147,176,235,116,190,176, 24, 87,225,112,188,192,214, 45,170,170,197, 52,205,
-136,129, 46,150,105, 36, 37,119, 85, 17,102,213, 26,195,176,170,137, 73,102, 52,105, 75, 70, 97, 26,103, 52, 13, 89,175,130,247,
-136,193,163,107, 91, 58,179, 2,176,112,228,234,208, 79,176, 70, 96, 26, 71, 84,117,197, 93,183, 7, 18, 80,217, 22,145,237,162,
- 90, 43, 56, 79,112, 29,164, 84,172,170,217,235, 78, 29,233, 4,109, 12, 42, 83,151, 14,126, 24, 71, 84,182, 65,223,143,104,155,
- 14,243,178,224,245,155, 59,140,227, 64,227,226, 8, 44,203,204, 72, 93, 90, 5,236,182,244,250, 73,238,252,171,186,194,229,124,
-134,150,180, 3, 79, 41, 97,179,221, 64, 27,139,105,114,164, 14,175,168, 64,147, 66,194, 72,133,218, 90, 56, 31,176,233, 90,164,
- 72, 46,131,170,170,208,247, 23,180,117, 67, 62,240,156, 61, 97, 44,148, 18, 88,220, 66,177,187,150, 26,164,236, 91,207, 22,189,
-190,191, 92,189,229,110, 41, 19, 11, 29, 52,154,174,197,120,238,203,229,150,152,141,191,196,132,168, 53, 46,125,143,221,110, 91,
-108,179,153, 37,176,184, 25, 49, 37, 74,116,144,215, 75,114,156, 39, 52,204,153, 15,188,243,214,154, 10, 72,136, 88,194,107,134,
-254, 2,109, 42,206, 30, 80, 69, 40, 72,162, 60,135,187,253,190, 8, 17,221,226,176,184, 5, 66, 42, 4, 31,209,181, 27,108, 55,
- 59,156,207, 61,158,158, 78, 16, 74,195,249, 0,107,235,210,205,123, 23,160, 20,217, 42,165,210, 76,219,123,174, 1,190, 69,140,
-175, 3,158,214,133,224, 13,135, 35,165, 50,193, 44, 92, 45, 92, 69,201,249, 60, 74, 12,176,209, 63,106, 70,248,130,162,105,157,
-195,157, 86, 42,246,117, 40, 72, 25,123,138,116, 19,248,158,253,192,226, 38,215,156,179, 66, 4,195,255,139, 48, 14,183, 24,205,
- 4, 44,222,227,112,186, 96,246,137,243,209,193,217,220,162,200,224,178, 74, 54,164, 88,178,179,165,188, 34, 99,197,106,236, 42,
- 56,150, 16,137,197, 98,158, 84, 75, 62, 69,244,126,198, 60, 73,104, 38, 10, 9, 8, 64, 94,191,150, 24, 19,124,204, 93, 65,194,
-236,103, 86, 71, 82, 8,133,144,156,225, 30,129, 36, 52, 53,134, 81, 96, 90, 60, 82,162, 29,145, 13, 17,202, 57,104, 41, 41,131,
-218, 57,202,109, 23, 26, 65, 70,104, 8, 36, 23,145, 92,132,131,199,176,140, 88, 22,135,199, 99,143,195,231, 39,132, 57, 2,202,
- 0,146, 2, 62, 68, 2,146, 8, 44, 16, 20,101,124,115, 51,182, 89,125,227, 18,152, 77,195,204, 99,153, 31,158, 72, 93,186, 8,
- 17, 8, 1, 34, 23,151, 4,146, 7, 66, 64, 92,128, 48,249,155,209,122,174,138, 19,219,218, 18,178, 58, 83,254,168, 75,247,182,
-178,205, 75,254,244,163,246,237,162,164,243,229,103, 42,173, 42, 24,241,114,239, 47,202, 44,124, 21, 26,252,220,199,143,155,160,
- 17, 82,172,226, 95,221,161,103,241,139,224,159,223,190,253,128, 63,250,250,107, 12,231, 11,150,105,134, 53, 85, 25, 61,167, 20,
- 9,136,178, 44, 24,199, 9,155,110, 3,173, 37,234,170,194,249,124,198, 52, 46,192,187,247, 20, 4, 82, 91,156,143, 39,212, 29,
-165,127, 33, 6, 60,126,126, 36,145,167, 82, 24,134, 1,175, 94,189, 66, 8,228,243, 61, 28, 14,168,235, 26,253, 48,161,217,108,
- 49,140, 35,188,119, 4,154,233, 90, 28, 14, 7, 24,173,113, 56, 62, 97,179,219, 66, 73,133,113,236,169, 8,140, 9,222,147, 66,
-221,123,143,101, 38, 37,246,228, 39,156,250, 19, 68, 32,129,153, 72, 36,230,154, 83, 32,149,116,140, 84,148,158,123,236,183,148,
- 36, 54, 46, 35,137,205,234, 14, 33, 56, 76,147, 71, 74, 10, 49, 58,104, 67,133,240, 60,147,208,116,158, 22,236,119,119,152,102,
- 7,109, 45, 98,138, 60,190,159, 72,117,207,221,154,181,150,163, 70,105,207, 29, 19, 10, 96, 69, 73, 74,100, 28,199,249, 26, 15,
- 26,105,213,164, 36,141,200,173, 49,112,137, 70,173,121,159, 93,158,239, 24,209,117, 27,244,227,200,214,208, 88, 18,194,148,209,
-208, 33,192,185, 5,155,174, 33, 68,174,214,240,222,227,114,185,160,110, 27,138,115,101,129, 30,248,140, 84,156,230,149,189,199,
- 53, 83,217, 98, 76,104,219, 26,199,241, 66,172,130,186,194,188, 56, 98, 2, 72,195, 88, 92, 98,195,199, 64,182,172,168, 52,180,
- 37,174,189,115, 30,155,221, 14,198, 26,156, 47,103, 84,246,158, 40,121, 85,133,138,215,136,193, 5,116, 13,141,191,199,121,132,
- 49,166,124,252,217, 19, 27,127,215,109,112, 60, 28,177,217,110, 86,103, 58,157,123,231,203, 5,247,175, 94, 65, 36,102,234, 43,
-162,171, 93,211,214,136, 93, 32,149, 66,101,175, 0,152,188, 10,245,142,138, 86,114, 51, 80,183, 94,213, 21,166,113,130,150,154,
-206, 73, 73,123,244,166,105, 41, 82,117,113, 80, 70,195,104,195,235,142,170,248,192,149, 84,156, 70, 71,104, 87,205,148,187,217,
-185,114,239, 12,195,192,226,190, 80,132,126,251,253,158,119,231, 36, 94,156,231, 25,227,228, 33,132,198,253,253, 43, 76,147,199,
-188,204, 56,158, 46,232,186, 22, 62, 57,108,186, 13,124,240,152, 49, 23, 17, 92, 62, 27, 40,111, 67,222,136, 99,115, 26,161,148,
-226, 69,152,204,243, 64,163,245,250,145, 6,168,177, 52,203, 57,200, 77,176, 37, 24, 0,180, 76,183, 99,244,239,229, 99, 37,222,
- 49,198, 72,227,228,155,197,168,224, 96,150, 84, 22,248, 41,239,196,165, 42, 34,185,152,200,151,157, 45, 97,105,213, 21,230,143,
-147,119,230,178, 8,228, 68,129, 66,208, 72,136, 14,192,144,128, 97,241,120, 60, 93, 48,135,136,112, 19, 1,195, 99, 97,145,120,
-252, 65,133,128, 92,101,178, 95, 63,236,181,184,144, 43,225, 88, 30,190, 42,102,186,107, 73,133, 6,196, 85, 25, 78,150, 2,193,
- 17,172,196,250,165,106, 91, 23,102,187, 20,146,242,186, 99,162, 9,128, 22,136, 50, 64,196,192,190, 88, 10, 92, 0, 63,212, 70,
-107,104, 41,160, 4,141, 12, 3, 18, 68,164,143, 45, 66,196,120,238, 17,150, 5, 49,177,121, 92, 40,124,122,120, 34,176,129,146,
-112,145,253,218, 55,187,226,196,223,191,231,221,251, 42, 81,143,215, 13,217,138, 18, 18, 21, 51, 49, 70, 8, 31, 32, 92, 34, 75,
-186, 79, 16,129,255, 36,197,186,209, 19,229,242,216, 94,177, 45,139, 8, 4, 73,144,150, 32,242, 8, 35, 9, 89,160, 52,105,181,
-155,206,223, 39, 33, 82,177,196,137,213,234, 39,173,171,213, 31, 49,123, 79,107,218, 48, 23,122, 55,192, 28, 60,203,100, 47,246,
-146,181,214,227, 86,156, 66,206, 11,241,226,152,172, 92,254,171, 34,181,216, 43,229,122, 71,149, 86,226,210,108,191, 84,144, 49,
-160,171, 27,252,245, 95,254, 79,184,219,239,225,103, 15, 31, 22,156, 46, 7,156,206,103, 64, 36,140, 19, 17,187, 8,228, 68,175,
-227,110,187,195,225,240,132,227,211, 1,119,247,175,105,132,218,117, 56,156, 79, 80, 90, 66,178, 21,232,243,225, 0, 99, 52,170,
-186,198, 50,207,104,234, 6, 34, 1,187,237,142, 49,178, 35,148,210,248,230,231,223,208,126,112, 28, 49,207, 11,238,238,238,224,
-131,199,241,120, 68,140,100,101, 67, 4, 22, 79, 22,168,124,192,236,247,123, 24,182,208, 9, 45,113, 25, 46,104,187, 6,195,255,
- 95,219,123,245, 72,150,101, 89,122,235,200,171,204,204, 85,100, 70, 86, 85,139,170,174,233,230,176,197,160, 89, 51, 32, 7, 4,
-136,121,224, 31,171,255, 70,240,129, 36, 8, 18,131, 1,134, 28, 73,150, 72, 25,225,238, 38,174, 58,146, 15,123,159, 99,215, 60,
-162, 68, 79,131, 72, 56,144, 25,233,225,194,236,222,187,207,222,123,173,111, 57, 71, 15,111,101,224, 98,194,176, 31,112,254,238,
- 59,100,165,145, 5,152, 90,214,194,249,132, 24, 9,114,211,118,150,238,151, 40, 32,165,193,229, 76,241,163,198, 52, 88,215,133,
-149,226,132,225,164,248, 77,139,203,101,132,210, 10, 58,179, 99, 68, 72,196, 64,226,165,242, 96,156,151,153,198,174,172,202, 39,
-130,156,198,234, 29,233, 89,140, 70,138, 1,166,109,185,155,214, 88, 47, 23,180,253, 0,100, 73,171, 0, 0,166,209, 12, 96, 34,
-145,173, 53, 26,139,147, 72,209,211,154, 43,209, 33,191,109,104,151, 45,100,177, 66,177,192,141, 73,152, 25,148, 37, 62, 77,180,
-227,166,152, 89, 18,212, 46, 43, 65,132, 74, 40,203,178,144,178, 92, 21,239, 52,191,246, 90,155,250,251, 27, 99, 33, 20, 37,195,
- 41, 69, 84,181,224, 3,250,190, 65, 78,132, 42,109, 58, 7,219, 24,164, 64,226,214,152, 50,219,228,136,119, 79,214, 94, 58, 88,
- 12,125,203,182,183, 1,110, 89, 48,244, 29,188, 91,113, 74, 39,220, 63,220,241,129,160,133,243, 43, 91,250, 18,164,210,152,167,
- 9,187,190, 71, 74,180,214, 88,152, 52, 55,236,119,112,222, 97, 89, 9, 7,236, 87,135, 97, 24, 48,142, 35, 86,190,174,181,209,
-149, 5,159, 82, 64,224,131,129,214,196,146,151,138,228,213, 49,208,228, 74, 25, 11,169, 8,196,162, 5,224,188,135,140,148, 46,
- 87,240,187,133, 35, 16, 19,139,115,165, 36,187, 90,112, 80, 41,213,240, 25,128,192, 70, 33,174, 48, 38,160, 31,122,198, 17,175,
- 72, 73, 98, 89, 60,188, 59, 33,236,129,251,251,123,188, 30,143, 20,110, 36, 22, 36,166, 30,106, 77,169,118,151,203, 5, 74,209,
- 84,136,108,127,226,118,121,189,157, 92,102,124, 70,187,115,187, 58, 44, 63,159, 20,106,195,225,192,173,182, 72,242,131,156,191,
-135, 22,249, 42,134, 78, 27,240,140,168,163, 81, 9,153, 36, 32, 18, 37,163,229, 34,117, 81, 87, 47,148,188, 29,110, 10,228,234,
-201,204,226, 74, 88,163, 4, 50,121,197,168, 22,235,155,144, 27, 72, 11,179,221, 69,190,102,179, 11,208,104, 61, 5,248,152,113,
- 26,103,188,142, 11,124, 77,220, 42,187,220, 92,225, 16, 98, 99,181,203,155,177,173, 40,106,231, 58,182,184, 42, 12,165,144, 4,
- 54, 96, 1, 71,230, 56,215, 36,202,215, 74, 85,241, 95, 60,210,214, 18,171,217, 52,133,215,174,160,149, 4, 68,134, 91, 51,141,
- 18, 61,249,225,115, 34, 5,128, 81, 9, 70,117,176,182,229,155,149, 59,217,124,109, 28,181,208, 16, 28, 35,152, 98,196,186, 68,
-204,243, 10,161, 53, 76,211, 35,228,128,231,227, 5,179,247, 68,183, 23, 2, 89, 68, 26,125,151,195, 77,206, 92, 96,100,229,246,
-109, 15, 86,145,127,223,148, 50,124,202, 88, 99,196,226,201,150,231,157,135, 88, 21,212, 28,144,155,136,108, 50, 96,248,112,148,
- 37, 67,100, 36, 68,144,144,194, 32, 11, 67,224, 20, 0, 49, 43,134,253, 4,250,158,124,209,137,156,144, 33,107,130, 31,237,170,
- 21,131,136, 74,144, 74, 70,190, 25,204, 51,181,174, 28,170,242,239,219, 17,149,115,155,172, 35,117, 42,216,183,199,213, 44,182,
-192,151,171,167, 79, 8, 74,212,146, 72,181, 48,127, 78, 73,178, 21,206,213, 33, 88, 61, 43, 72,206,168,231, 4, 63, 72, 62, 81,
- 71,100, 73,163, 14, 37, 20, 16,121, 34,149, 51,254,242,167,255, 4,127,254,227, 63,197,114, 33,172,230,101,186, 32,164,128,211,
-244, 66,157,140,164, 93,173,159,124,189, 94,231,121,193,186, 56,220, 63, 60,160,105, 27, 76,227,132,251,199, 7,232, 89, 35,172,
- 1,141, 53, 88,215, 25,182, 33, 43,217,241,116, 65,138, 17,187,182,131,150, 26,211,121,194,241,120, 68,215,245,248,242,203,247,
- 72,193,227,187,239,190,133,210, 22, 63,249,209, 79,208,116, 13,190,253,246,107,140,203, 8,169, 36, 58,165, 48,141, 51, 89,178,
-152,108, 23, 98,128, 91, 86, 60,127,248,136,195,221, 30,115, 48,128,207,184,156, 79, 56, 12,123,104,105,176,172, 4,101,249,248,
-195,119, 16, 57, 64,100,129, 12,133, 36, 37,238,238,239, 33,181,198,188, 78,208, 10,136,222,195,173, 26,171,163,128,149,144, 2,
-164, 38, 52,170, 84, 18,151,113, 68, 10, 52,197, 58,198, 35, 30,159,190, 64, 18, 10,110, 13, 80,193, 67,138,132,156, 2, 36,128,
-195,195, 3,143,170,105, 28, 43, 53, 41,240,141,166,123, 42,178,221,169,181, 13,148,148,232,153,242, 22,130,163,113,114,211, 82,
-195, 34, 0, 23, 35,132, 86,104,100, 11, 81,216, 15,156,197, 29,131,199,110,104, 97, 52, 61, 15,101,190,138,242,246,251, 1, 57,
- 71,196,224, 73, 79,176,174,196,161,224, 78, 13, 9,184,187,219,115,199,168,160,149, 69, 76, 68,149, 75, 57, 65,101,129, 20, 34,
-164,213,240,193, 49,127,156,114,201,239,239, 31,136, 51, 46, 36, 98,162,164,184,148, 29,164, 84,136,222,147, 39,220,147,149,172,
-181, 6, 2, 9, 79, 15,247,248,238,155,239, 17,124, 36, 63,179, 1, 16, 3,238,246, 59,164,236,225,214,128,190,181,112,145,196,
-126,228,229,167,125,186, 84,134,199,223, 17, 77, 75,122, 0, 3, 74,141,244,222,211, 36,132,133,113, 69,171,148, 82, 68, 22,164,
- 40, 23,210,192, 90, 18,246,249,213, 97,134,224,221, 58, 29,232, 16, 50, 12,239,224,181, 82, 8,206, 67, 55,116,128,141,153,188,
-227,101,202, 34, 33,224, 99, 64,195,161, 56,165,139, 37, 41, 15, 55, 33, 41, 0, 72,244, 57, 41, 67, 72, 18,101,166,236,107,162,
- 36, 33,113, 91,228,164,224, 99, 64, 88, 87,226,217,123,135,221,110,143,182,215,240, 1,200,233,130,144, 34,206,231, 11, 0, 42,
-236, 31,157,163,120,225,213, 3, 57, 84,141,214, 48, 12, 56,158,206,117,181,153, 54,104, 77,145,105,157,252, 54,148,229,115,129,
- 80,114,147, 87,144, 56, 93, 51,150,198,186,172,175, 55,141,116,226,116,195, 79,169, 26,226,247, 88,136,243,231, 60,191, 91, 85,
-112,174, 29,120, 17,110,148,121, 67,133,192,108, 69, 76, 55,191, 80,174,118, 20, 37,175,157,155,100,227,110,230,200,194,144, 3,
- 92, 8, 56,141, 11, 46,243, 74, 29, 97, 22,155, 84,174, 79, 13, 83,111,247,161,159, 4,205,191,113, 64,145, 42, 85,144,136,172,
-162,100,169,240,133, 72,158, 70,239, 35,156,139,240, 62, 97,156,103,204,206, 97,154, 87,246, 50, 46, 12,113, 24, 49, 49, 34,179,
-156,180,180, 54, 12,234, 32,229,109,204,128,103,108,101,226, 55, 41,150, 14, 83, 73, 40, 35, 33, 20,144,101, 70, 4,241,217, 93,
-140, 24,215, 5,231,121,194,184, 44,220, 37, 83,225,139,197,174,147,242,141, 48,241,106,239,186,254,146,133,181,159, 50, 16,133,
-198,228,128,243,148,112, 28, 3, 94, 79, 43,206,175, 11,252,197, 35, 79, 30, 98,244,144, 83,130, 88, 2,178, 11, 52,170, 79, 2,
-240, 25,112, 25, 93,214,144, 50, 33, 33, 32,139, 68, 97, 57, 55,193, 42,138,222,171,183, 81,166,242,170,230,188,158, 90,197,239,
-214,110,252,209,254,239,252, 95, 0,144, 17,248, 47,199,197, 9,220, 68,218,110,198,146,249, 38, 93, 86,222,184, 72,100, 18,120,
-119,247,132, 95,252,221,127,131,232, 72,196,227,220, 10,173, 21,156,119,244, 96,141, 17,243, 60, 51,247,157, 64, 52,101,116, 88,
- 80,195,207,207,207, 72, 41,225,251,239,191,199,120,190, 64, 74,137,211,233, 68,221, 41, 31,214,181,209,184,191,187,195,253,211,
- 35, 81,200,220,130,144, 18,132, 82,120, 61,159,112, 60, 29, 33,164,196,176, 31, 96,172,198,243,199,143, 16, 66,224,225,238, 30,
-247,251, 3,114,206, 56, 94,206,128,146,184,123,184,195,195,227, 3,134, 93,143,132, 8,101, 37,180, 53,112,171, 35, 78, 57,167,
-164,245, 61,229, 92,207,211, 8,183, 46,104,173,165,131, 93, 8,144, 25, 53, 62,179,239,118,104,108,143,105,114,152,166, 21,227,
- 56, 98,158, 23, 8,161,177,174, 1, 41, 9,120,151,176, 78, 30,206, 37, 44, 43,221,123, 68,152,115,112, 97,197, 52, 79, 88,150,
-153, 14,206, 74,194, 88,131, 16, 3, 98,138, 28,103, 74, 99,127,163,245,245,192, 37, 73,212, 73, 9,106, 29,230,121,162,103, 23,
-167, 33, 74, 41, 17,124,224,188,114,197,168,233,235,254,115, 93,102, 14, 69, 49,252,222,230, 10,165, 41,251,228,243,249,140,221,
-110, 7,239, 61,137,228,120,204,223, 48, 62,181, 96,117,141,214, 12, 37, 41, 89,241,242, 77,174,122,162,136,103,165, 43,254,116,
- 94,104, 76,158,145, 43,126, 90,176, 39, 95,177,128,173,216,139, 99, 34, 69,255,221,221, 1,231,243,185,186,152,230,121,169, 41,
-108,206, 17, 97,109,232,123, 2,194,228,140,198,104,182,208, 81, 54,133,115, 14,151, 11, 93, 99,196, 56, 95, 43, 2,123, 97, 91,
- 29,253,190,196,221,167, 36, 62, 90, 49, 21,244,175,170,177,170,170, 34,115,233,185,149,106, 2, 90,201,158, 47,159, 23, 99,228,
-233,169,170,255, 77, 69, 94, 85,174, 72, 96,160, 16, 5,192,208,123, 77,254,255,114,216,160, 6,201, 26,203,239, 97,196,229,114,
-134,177,154, 50,217, 51, 96,152, 89,191, 46, 43,230,105, 70,215,118, 24,134, 93,133, 11,173, 43, 9, 11,133,162,198,165,136,193,
-139, 94,140, 2, 92,228,141,168,237, 45, 29,238,115,245,232, 45, 30,118,139,134,205, 57, 83,195, 35,192,205,210, 85,105, 44, 74,
-243,178, 89,123,255,255,132,202,218, 68, 82,138, 63,210,107, 92, 35, 57,197,213,222, 86,201,240, 4,138,137, 57, 97,241, 30, 47,
-167, 17,139,163,174, 31, 60, 49,160, 29,110,250, 52,198,245,205, 11,151, 19,117,154,169,230,136,223, 70,192, 22,241,136, 42, 22,
- 58, 6, 16,196, 72, 40, 71, 23,136, 16, 71, 35,102, 73,194, 12,254, 28, 23, 18, 66,140,240,145, 96,253,106,147, 3, 92, 62, 10,
-159,219,121,143,211,120, 34,142, 52, 63,132,148, 86, 76,147,147,180,143, 39, 94, 46, 32,169,248,175, 49, 96, 90, 87,156,167, 25,
-199,113,194,236, 92, 21, 15,214,105, 75,101,215,111,121,250,121, 35,176,200, 20, 76, 83, 70,239, 66,192, 67, 99,116, 2,207,151,
-136,111, 62,174,248,245,119, 51,126,245,205, 5,223,124,125,194,135,223,156, 48,125,253,138,248,221, 11,242,135, 11,240, 50, 66,
-156, 29,176, 36, 50,222, 39,143,108, 18,132, 1,146, 8, 72,155,126, 91,108,130,123, 40,155, 92, 92, 73,110,226, 77,220,232, 70,
-212,247, 15, 46,232,249,247,231,151,255,177,123,252,252,143,197,213,127, 2, 83,202,155,216,196,107, 94, 0,135,217,195, 40,141,
-191,255,235,127,134,199,187, 7, 40, 8,228, 64, 64,151,121,154,225,189, 71,223,247, 21,150,177,174, 43, 21, 26, 69,254,107,239,
- 87, 28, 14, 7, 56,239,209,216, 22, 63,250,209,143, 24, 40, 67,227,234,148, 50, 82, 8, 72, 49,227,120, 58, 33,129, 58,161,148,
- 51,190,251,225,123,116,125, 79, 66,186,253, 14, 25, 25, 31,158,159,113,184,191,131, 98,129, 79, 8, 1,231,227, 9,110,117,164,
- 6,231,177,111,136, 1, 66, 74,156,206, 71, 28, 79, 71,188,156, 94, 97, 26,139,175,191,253, 26,203, 50,163,239,122,104, 99,145,
- 1,188,188, 60,195,185,133, 52, 44,124,172,211, 18, 72, 97,133,202,145, 58,174,213, 67, 43, 11,165, 26, 40,221, 66, 8,141,198,
-246,200, 73, 64, 73,139, 20,129, 24,128, 24, 50, 4, 52,114, 82, 80,170,133, 84, 22,227, 60, 99,154, 71,164,228,161, 20,112,119,
-127,144,119, 90,210, 0, 0, 32, 0, 73, 68, 65, 84,192, 48, 12, 36,128,242,142,197,179,130, 25,226, 87,110,118, 14, 17,193,211,
-190, 87,105,234,130, 51, 34,156,119,213, 62, 87,120,220, 20,231, 26,217,195,174, 33, 65, 95, 47,197, 8,193,255, 94,190,135,100,
-183,135,224,110,211, 24, 83,185,241,198, 24,236,119, 59, 28, 14, 7,180,109,139,121,158, 25,120, 67, 63,199,194, 92,116,242,178,
- 83, 6,186,181,186, 78, 23,181, 54, 0, 23, 29, 33, 0, 31,168,227,244,193,193,218,134,146,215, 56,233, 81, 41, 5,207, 7, 2,
-130, 20,209, 65,113, 93, 22,236, 15, 59,104, 37, 17,188,167,249, 93,206, 88, 23, 7, 41, 52,250,158, 70,226, 16, 2, 15,247, 7,
-210,163,240,132,108,154,103,116,125,207, 26, 5,141,151,151,151, 10, 24,243,222,227,225,225,129,192, 71,211,196,154, 0,207,137,
-117,180, 59, 86,156,214,151, 57,105,143, 44,145,168,212,183, 90,184, 11, 46,121, 43, 52,227,251,184, 28, 92,242,155,113,245, 53,
-245, 18, 53, 4,166,229,174, 95, 41,130, 59,103,230,188, 55,182,169,247,104,202, 17, 82, 10,166,232, 9, 60, 61, 61, 66, 10,178,
- 25,206,243, 66, 25, 5,227,136,199,199, 7, 40,171, 17, 50,173,112, 46,243,116,155,242,182,121,222,172, 43, 37,194,137,223, 67,
- 95,253, 28,204,170,116,230,111,179,210,171,134,135,169,106, 89, 20,141, 82,174,193, 53,111, 71,247, 85, 40,151, 54,245, 55,139,
- 63,158,221,241,201,130, 63,149, 61,168,172,200, 81,148, 40,214, 55, 2,188, 43,209,108, 99,155, 43,235,118,121,165,213, 21,101,
- 95, 72, 9,227,178,226,245, 60,193, 39,137,156, 37, 79, 94,153, 37, 47,197,239,180, 7, 92, 59,164, 92,199,238, 34, 23, 72, 0,
-217, 92,132,102,169, 29,191, 89,133, 42, 37,148,164, 93, 54,143,114, 83,206,236,113,207,196, 90,102,210, 27,157, 70,175,137, 59,
-101,159,155,145,169, 67,225, 67,132,181, 22,125,219,194,187, 5, 90,137, 58,178,111,140,130, 64,134,174, 66, 10, 82, 98, 79,211,
- 12,231, 23, 36,161, 16,147,192, 18, 2,166,197, 81, 42,147,210,228, 17, 47, 23,216,141,224, 11,245,112, 68, 57,234, 87, 97, 28,
- 21, 89,137, 40, 36, 2, 36,230, 0,124,127, 92,225,215,136,215,227,130,223,124, 47,209, 91,137,174,215,120,184, 27,240,238,113,
-192,195,151, 7, 28, 30, 15, 24,238,118,208,131,130, 52, 2,240, 18, 16, 26,218, 54,128,140, 55,222,255,106, 31,123, 35,212, 67,
- 77,130,139,219, 19, 29,240,123, 11,240, 31,103,110,219,238,172, 63, 95,252,243,239, 59, 7,224, 31,134,192,121, 59, 29, 16,245,
-215, 16,228,155,170,158, 94,210,159, 16, 41, 81, 32, 35,249,128,159,255,229, 95,225,231,127,246, 83,132,197, 17,144, 73, 10,216,
-166,193,225,254,128,127,255,159,254, 61, 46,151, 11,118,187, 61, 94, 95,143, 84,152,144,161,141,193,229, 50,226, 47,126,246, 83,
-156,207,103, 52,141,197,253,221, 19, 46,151, 11,145,195,164,198,180, 46,216,113,224, 74, 8, 52,142,110, 53, 21,162, 15, 47, 47,
- 20,134,228, 61,250,161,199,180, 44, 24, 47, 23, 44, 75,137,199, 76,184, 92, 46,240,222, 99,232, 90, 32, 38,188,124,120,198,135,
-231,103,252,217,159,255, 20,222, 59, 52, 70,227,227, 15,223, 67, 25, 69,226,169,151,143, 36,124,146,148,118,214,237, 6,180,166,
-193,235,235, 9,113,156, 32,149,128, 54,138, 56,223, 62, 99, 69,132, 18, 9, 41,172,124, 40, 54,116,232,208, 13,188, 95, 25,108,
- 99,161,148,198, 60,205, 64, 34,250, 87,140, 25, 93,191,199,226, 87,154,216,253,240,129, 82, 28, 53, 77,193,188, 91,209, 49,195,
-125, 27,185,220, 52, 77,165,202,229,156,209,180,180,183, 85,165, 64, 8,242,214,199,156, 97,148,166, 53,146, 84,176, 67,139, 35,
- 79, 62,114,206,208,138,108, 99, 82, 72, 90, 25, 24, 69,118, 57,239,209, 12, 29, 89,166,248, 0, 64,208, 43,234,200,151,121,102,
- 97, 98, 68,204, 30,119, 93, 7,151, 60, 2,139, 32,201, 79,159, 97,109, 3, 53,205,140, 92,229,206, 77,129, 15,116,116,109,164,
-152, 72,139,131,140,253,126,135,215,215, 35,101,191,175,158, 8,111, 77, 91, 19,207,230,121, 65,223,119, 88,150, 5,235,106,241,
-238,241, 9,223,126,253, 13,158,158, 30,112, 60,157, 49,205, 35,118,195,142, 2,115,186,140,253,126, 79,175,211, 60,195, 52,212,
-213,143,231, 11, 55, 39, 10,211, 52, 98, 24, 6, 42,222,188, 47,223,239,247, 8,193,225,124, 62,226,203, 47,191,192,215,191,253,
- 53,148, 82, 53,112, 38,103,186,214,140,229, 46,148, 11,216,150, 0, 23, 34,219,234,250,190, 62, 59,181, 82, 8,245, 80, 69,207,
-205,101, 89, 48,116, 61, 9,223, 88,120,184, 45,134, 69,192, 74, 9,115, 1, 41, 69, 90,169,106,178, 34,151, 34,223, 88, 11,183,
-174,144, 90, 84, 77,205, 52,141,144,146, 38, 7,199,227,145,118,239,171, 67, 22,192,101, 30,241,254,253,123,124,248,240,145, 39,
- 19, 18, 41, 39,210,104, 36, 84,221,152,172,209,214,252,228,147,183, 28,119, 41, 37,100,198, 39,135,129,162,217, 73,165, 43,127,
- 67, 51, 20,146,190,214,117,141,125, 61, 16, 40,165, 72,112, 43,174, 8, 98,213, 74,253,203, 13,132,253,147,193,186,172, 98,185,
- 18, 57, 90,254, 84,214, 5,188,144,229, 68,161,104,219, 46, 52,134, 97, 95, 35, 16,101, 77,205,201,181, 88,145, 24,142,199, 74,
- 60,242, 86, 34,193,106,192,168,140,198, 72, 24, 69,208,127, 37, 34, 82, 12, 88, 92,196, 15,167, 25,255,225,215, 31,112,113, 2,
-144,150,119,243, 36,196,163,127, 87,252,179,137,155, 9,192,141, 48,170, 20,145, 98,223,146,160,145,157, 38,193,131, 20,215, 4,
- 55, 72, 42,228,185,236,225, 82, 38,171, 30,243,167,173,213,204,229,165,155,173, 4,128,212,253, 6,199,197,106,173, 72,112,151,
-136, 79,109,140,132,165,140, 22, 24, 5,244,157,133,173,251,248, 2,107,163, 78,119,245, 17, 19,103, 15, 47, 62, 97, 94, 3, 78,
-231, 17,243,178, 34,161,252, 60,229,226,144, 27,134, 62, 71, 33, 10,201,157,121,233,210,175,225, 46,130, 5, 24, 9, 25, 33, 75,
- 44, 1, 56,175, 25, 47,115,198,215, 47, 11,126,243, 97,198,175,126,152,240,171,239,103,124,251,205, 5, 31,191, 91,112,121, 77,
-240,103, 1,229, 13,116,234,176, 56,141,127,251,255,124,143,111, 63,156,144,133, 69,228,224,154,194, 93, 46,123,124, 8, 18,208,
- 85, 17, 8, 59, 19,182,157,114,126, 43, 28, 41,152,200,223,105, 49,147, 55, 34, 58, 33, 4, 29,214, 54, 32,155,235,120,255,202,
-227,174,208,151,141,210,148,126, 72,201,221,244, 63,108,244, 94,243,234,235,100, 76,178, 96, 83,212, 12,119, 37, 37, 82, 12,208,
- 89,226,253,227, 23,248, 31,255,135,127,133,199,253, 61,220,186, 96,188,156,177,186, 5,199,243, 17, 31, 62,126, 64, 63,244, 56,
-157,206, 68, 39,107, 26, 64,146, 32,211, 90, 11,193,145,149,151,243, 5,251,253, 30,167, 51,113,167,127,248,240,140,110, 55,144,
-133,199, 90,104,163, 57,170,179,197,126, 63, 96, 93,102,234,214,246, 3, 98,138,120,121,126,198,229,124,134, 82, 2, 95,125,245,
- 21,246,135, 61, 78,199, 35,150,101,198,227,227, 3, 4,227, 49,115,206,248,234,253,151,184, 59,236, 97,181,198,119,223,124,131,
- 16, 61, 30, 31, 31,177,223, 15,152,198, 17,227,249,130,174,223,225,225,241, 1,200,192,175,126,245,107, 26,133, 26,141,182,107,
- 33, 68,134,115, 51,188, 91,121, 60,174, 48,141, 23,196, 20, 17,130,195, 50,207,149, 17, 30,153,210, 5,208,120, 58,113,150,184,
-148, 18,199,215, 19, 46,211,136, 24, 3, 39, 39, 82, 80, 70,203, 48, 28,163, 53,134,161,131, 15, 30,227, 56, 66, 10, 74,230,242,
- 46,208,179, 73,211, 53,233,156,195,110,183,171,184,210, 16, 2, 89,147, 50,141,226,155,166,193,233,124,198, 60,175,132, 2,213,
-170, 82,203,180, 34,116,109,219,180, 72, 57,193, 26,133,221,110, 7, 33, 36, 11,219, 56,167,156, 39, 5,203,188,192, 24, 67,113,
-168, 41, 97, 89, 23,196,152, 24,220, 66, 86, 44,183, 58, 52,109, 11,169, 21,188,119, 92,188, 37,134,190, 39,148, 46, 31, 52,200,
-135, 45, 48, 94,206,120,184,191,167,245, 64,138, 48,250,154,130,214,182, 13, 89,116, 67,160, 4, 73,107, 16, 35,101,141,239,247,
-123,156,207,164,147,200,165, 8, 8, 98,139, 43,173,224,156, 99,127, 62,145,219,186,182,165, 14,154, 89,245,231,241, 2, 8,160,
-239,187,106,209, 75, 41,214,215,112,183,219, 83, 58,223, 76, 44,127,165,105,106, 96,109, 83, 69,139, 74,211, 14, 27,188,110,157,
-151,137, 86, 53,236,246, 40,196, 54,112,199, 62,207, 51,139, 9, 57, 26,214, 88, 44, 51, 69,227, 26, 22, 17, 74,113, 61, 48, 44,
-203,194,211,153, 4,231,214,122,159, 26, 99,224,248,126, 10,129,128, 69, 49,101, 24,211, 0,137,210,249,104,252, 79, 81,185, 33,
- 16,203, 32,231,204,211, 21, 82,203,247,195, 14,151,113,170,100,194,188, 33,108,166,162, 90,199, 45,152,141,166,196, 87, 45,207,
- 54,133,109, 43,141, 47,190,118,169, 20,178, 32,252,121, 6,213,158,244,153,134,101, 27,217, 90,190,223, 63,174,168,139, 43,230,
-179,122,232, 50, 96,148,193, 48,236, 96,109, 83,133, 13, 85,205, 46, 21,125,212,140,245, 84, 21,238, 90, 1, 86, 11, 24,149, 96,
- 13,160,117,134,150,212,105,134, 16,176, 4,224,255,253,246, 5,191,254,254,140, 53, 41,100,169,168,203,206,165, 39,189,142,118,
- 83,174, 4,232,155,143,235,100,151,148,252,148, 48, 74, 55,170,214, 4,189, 41, 78,126,194, 86, 82,183,156,217, 5, 80, 0,252,
- 90, 9,104, 41, 48,116, 29,246, 67,135,190,111, 48, 12,228,207,221, 13, 61, 26, 78,126,106,172, 65,215, 90,236,134, 30,125,223,
- 66,107,137,213,173,216,245, 13,246,125,135,198, 42, 12, 93,139,182,161,236,228,196,251,147,144, 50,124,204,240, 33,193,249,136,
-121,117, 88, 92,196,101,114, 24,231, 5,227,180, 34,196,196,158,128,207,139,185,202,238,246,138, 95,103, 43,162,144, 84,204,121,
- 34, 32,232, 42, 66, 76,128,203, 2, 46, 75, 44, 73, 97,142, 26, 43, 44, 22, 52, 88, 34, 48,173, 17,175,147,195,135,243,130,143,
-227,130,211, 56,193,103,160, 59, 60,226, 39,127,241, 87,200,210,224,183,191,253, 30, 46, 36,102,241,243,148,160, 92,140, 55, 52,
-182, 50, 93, 16,159, 20,117,113,187,100, 71,222,152, 39, 63,183, 94,185, 85,198,139,218,145,231,188,157,210,108,190,100, 81,164,
-110, 28, 31,185,226,115,197, 39,183,206,118,188,245, 15,131,192,110,130,115, 5, 93,111, 50,103,236,219, 30,255,221, 47,254, 5,
-190,122,250, 2,211,229,132, 20, 3,142,167, 87,184,224, 16,145,112, 58,159,112,190, 92, 24, 43,153,153,174,213,146,203, 66, 74,
-216,198,194,173, 14, 67,223,195,114,188,227,188,204,213,103, 94,199,128,172,190,181,198,224,244,250,138,101,154,113,199,185,218,
-211, 60, 81,145, 60, 30,145, 98, 66,219,181,248,205,111,126, 67,185,209, 93,143,182,109,241,252,242,130,203,120, 65,215,247,212,
-145, 38,143, 31,126,248, 30, 82, 74, 60, 62, 61, 98,117, 14,211, 52,211, 3,211, 90,236,246, 7,204,243,140,121, 89, 16,120, 28,
- 12, 8,156,207, 39,178, 43,229,136,182,239,200,119,239, 40,190,212,187,181, 98, 80, 95, 79, 47,152,152,139, 78,133, 40,192, 45,
- 11,214,117,134,115, 11,137,170, 98, 64,211,104, 88,173,161,140, 36,120, 76,240, 4,142, 9, 1, 95,190,123,130, 84,154, 10,127,
- 18,208,166,161,215,206,123, 46, 60, 84, 24,186,166,165,123, 95,107, 44,171,195,234, 61,220,234,168,160,132,136,174,109,113,153,
- 70, 4,190,150,125, 8, 24, 24, 27,155, 56,195,161,109, 26,228,148,208,182, 77,141,107, 13,158, 70,188, 41,209,104,119, 94,215,
- 26,245,219,182, 61,125, 78, 36,203, 83, 12, 84,184,154,198, 82,166,183,224,135, 57,119,239, 57, 39, 30, 5,143,172,126, 22,117,
- 26,169, 88,140, 59,244, 61,142,175,175, 80, 90, 85, 80, 74, 25,101, 75, 37,161,153,191,158,249,192,131, 68,147, 10,165, 85, 21,
- 43, 75,214, 65, 17,191,222, 32, 36, 74, 82,107,172, 69,136,129, 99, 84,215, 26, 74, 35, 4,208,112, 20,111, 99,105,196,111,173,
- 5, 68,194,186,208, 78, 61,243,206, 59,115,129,210, 90,211,202,128, 3,112, 74, 94,186,228,108,139,210, 68,149, 98,103,217, 38,
- 25, 99,168, 43, 40,128, 14, 42,109,211,213, 32,157, 45,197,148, 70,214,164,159,144, 74, 85,221, 80,253,135, 65, 51,100, 77, 20,
-208, 70,227,249,249, 21,222, 71,180, 13, 9,254,202, 52,167,235,218,202,223, 39, 93, 64, 70,223,119,120,121, 57,242,225,138, 51,
- 72, 66,228,168, 11, 82,218, 23, 45,217,103, 39,129, 5, 7, 93, 32,103,111,137,114,117,160, 40,106,150, 73,185,159,139,253, 85,
-124,166,152, 23,171,101,230,106,160,183,223, 60,255,142, 24,214,223, 15,175,222, 62, 92,217,164, 36,137, 38,119,237, 22,197,205,
- 23,173,158,223, 42,106,203,245,217,158,216,131,151, 82, 66,138, 2, 33, 82,193,143, 73, 96,154, 19, 94,142, 19,214,144, 16,178,
-132,100,132, 41,125, 29,141, 66,149,223,118,101,197, 19, 72,197, 32,109, 60,245,220, 61, 50,175, 94, 41, 81,199, 96, 9, 68,188,
-201, 73, 32, 51,180, 38,179, 55,181, 76, 25, 4, 18,186,182,195,195,221, 30,187,161, 67,129,231, 53,141, 37,223,174,247,240,171,
-171,184,203,190,239, 97,140,198, 52, 77,248,246, 91,242,154, 30,238, 40, 45, 75, 2,136, 89, 32,184,194,138,167,145,147,224,184,
-216,105,113,120, 29,103, 76,139, 71, 76, 18, 62, 2,158,249,242,185,160,132, 68,177,147,241,107,154,229, 6, 60,179,169,167,204,
-107,207,140,113,205, 82, 85,177,157,224,232,207,200,165,200,104, 13,169, 13,172, 54,104, 76, 70,219, 72,216,174, 1,154, 14, 94,
- 24,140,139,199,243,203, 9,187,251, 71,252,237, 47,254, 6, 95,254,236,103,184,204, 14,255,243,255,242,127, 32,179, 40,229,186,
- 14, 16,159, 92, 51,127,116, 35,204, 43,157,219,122, 46,254, 96,247,252,118, 52,254,199, 92,206,111,132,242,255,136, 16, 23,222,
-163, 51, 86,183,192,124,140, 84,248,217,159,252, 57,246, 77,135, 31,190,253,134, 70,186, 49,225,120,166,221,116, 55,116,216,199,
- 61,190,254,250, 91, 52,214, 34, 69, 26,221, 47,139,131,146,148, 67,254,248,244, 72, 69, 33, 38,188,190,190, 34, 68, 74,186, 58,
-157, 47,240, 49, 84, 17, 83,136, 30,251,253, 30,145, 19,174, 86,239,160,173,193,215,223,126, 3, 33, 37,198,113,196,225,254,174,
- 10,185,200,206,182,226,253,251,247,248,238,135,239, 17, 83, 68,191,223, 97,119, 56, 96,153, 39,124,120,253, 64, 33, 47, 90, 99,
- 94, 87,104,109,112, 58, 95,208,180, 13, 30,238,238,145,165,192,233,124,194,178,210, 8,189,239, 7,156, 79,103,132, 72, 2, 34,
-109, 45,156,139,128, 80,200, 41,192, 42,133,172, 4,199,218, 38,104,214, 87,196,156,240,225,195,119,232, 88, 68,165,141,132,177,
- 45,114, 78, 80, 90,163,107, 91,248, 64,216, 92, 9, 9, 72, 3,239, 19,238, 14, 3, 76,211, 96,113, 14,206, 69, 40,105,240,250,
-114, 66,215, 53,176, 90,145,141,106, 58, 19,194,148, 81,181,231,243,165,114,223,133,148,104,154,142,227, 91,201, 30,101,173,133,
- 80, 26,238,124,162, 98,233, 29,167,199,105, 94, 9, 68, 52,205,174,142, 77,135, 97, 64,240,129, 59, 74,131,211,121,132,200, 25,
-139, 15,216,239, 35,188, 99,106,164,177, 88, 72, 9, 92, 87,114,108, 86, 66,215,117,104,219,140,203,101,164,226,218, 52, 88, 23,
- 66,187,122, 31, 88, 1, 77,107,195,166,181,148, 63, 46, 11,174, 57,212,231, 46,137,240, 4,194,186,224,176,223, 97, 89, 86,100,
- 75,119,226,254,112,192,183,223,127, 15,219, 80,212,171,247, 30, 41, 71, 60, 60,220, 65, 47, 26, 82,100,138, 9, 21, 6, 41,102,
-216,182, 1,132,128,209, 4,174, 89,215, 21,182,105,120, 31, 46, 49,205,180,254, 73, 57,225,116, 58, 97,104, 59,140,227,136,214,
-104, 4, 38,231, 41,165, 16,146,227,194, 78, 34, 77,194,186, 82, 49,143, 12,186,242, 41,192,116,150, 18,251,188,135,224, 40, 94,
- 74,199, 83, 53, 95,189,248,249, 53, 11,248,154,166, 33,150, 63, 64,113,222, 92,184,147,247,144, 9,252,218, 73,116,109,139,249,
-124,134,182, 6,143,143, 79,248,240,195, 51, 86,231,208, 54, 22, 96,222,128, 16,244,254, 53,214, 98,158,151,170,157,120,122,186,
- 71, 8, 5,228, 36, 97,140,197,226, 28, 29,216, 21, 3,135,196,231,181, 99, 66,138,107,236,244,134, 22, 39, 54, 90, 35,228, 77,
-163,177,125,146, 8,241, 25, 96,219,109,126, 74,249, 12,213, 40,253,203, 27, 0,199, 39,250,227,178,231, 78,236,187,101,159,116,
- 22, 85,165, 94,198, 76,229,129,218,152, 6,187,221,174, 42, 55,149, 20,236, 21, 87, 87,227, 61, 68, 29,189, 75,201,221,178, 22,
- 52,114,231, 14, 93, 43, 9, 37,168, 79, 11, 33,224,135,215, 9,255,241, 55,223,227,236, 18,178,182,117,188, 93,205, 71, 82,177,
- 26,254, 26,111,119, 59, 22, 21,204, 49,207,215, 16, 13, 30,167, 25,163,104,161,144,169,168, 39, 62, 24,164,148,170, 48,129, 26,
- 90, 42,234, 70, 73, 60, 62,222, 99,232, 91, 12,157, 37,159,185, 18,104,223,220,100, 90, 43, 30,235,203, 58, 10,243,222, 35,120,
- 87, 99, 11, 67,138, 88, 61,217,245,200, 80, 37,169,200,167,140,217, 5, 92,150, 21,151,121,197,234, 3,132,182,240,145, 34, 93,
-107, 33,202,105,227,185,190,218,248,110, 46,132, 26,206, 34,175,162,180,204, 7, 30,144,162, 86,129,118,190, 90, 9, 72,126,200,
-138, 72, 9,118, 49, 71, 72, 36,216,198,162, 31, 6,220, 13,123, 60,237,118, 56,180, 29,164,144,104, 15, 45, 30,126,242, 35, 32,
- 68,252,239,255,231,191,230, 68,214,196,227,169,173, 96,142, 68, 98, 87,159, 37,143,203,111, 66,130,176,129, 2,136, 55, 26,140,
-219, 2, 93,225, 12, 69,139,177,253, 90,249,246,186,196, 77,167,158,111,227,100,203, 21, 95, 87, 19, 87, 65,203,246, 84,252, 15,
-233,212, 19,175, 56,144,137,183, 32,114,198, 79,222,191,199, 63,251,175,255, 26, 22, 10, 47, 31, 62, 64, 42,129,211,233,136,140,
-140,217, 81,135,251,195,135, 15,124, 40, 86, 56, 28,238,177,174,164,132, 55,214, 50,122, 83, 84, 80,199,101, 28,161,173,197,226,
- 86, 76,243,140, 97, 24,208, 51, 86,147,186, 55,129,151,151,103, 52, 45,141,138, 35, 72, 56, 71,164,177, 61,118,251, 61, 78,231,
- 51, 62,124,160,130, 45,132,192,241,120,132,115, 14,211, 52,113,218, 88,194,241,244,138,197,209,110,120,245, 14, 47,175,175,220,
-145, 39,216,134,120,234,211, 60,225,124, 57, 87, 53,248, 52, 47, 88, 87,242,149, 91,107,209, 48,252, 35,134, 72, 93,113,107, 57,
- 46,115,169,105, 93,166,163,142,169,168,216,231,121,130, 15, 43, 39,108,121,196, 24,208,183, 29, 41,176, 5,217,187,186,182, 67,
- 78,180,154,184,191, 59,224,116, 58,225,124, 26, 33, 4,221,135, 41, 82,178,151,247,132, 0, 53, 70, 35,248,200,202,121, 62, 68,
-199,140, 97, 24,160, 36, 41,209,189,243,240,161,128,111, 18,127,159, 6, 57, 17, 31,188,236,183, 83,138,216,237, 6, 8,145, 49,
- 47, 19, 19,252,168, 75, 54, 90, 97,245, 1,109,211,112, 71, 74,202,248,107,200, 21, 16,248,103,210, 60,166,214,154, 16,165,146,
- 87,106, 69,104, 87,166,107, 84,188, 44,197,136, 26,205,182, 44,139,105,154, 96,140, 37,104, 74,197, 96,211, 51, 58,132,128,174,
-107, 33,153,135, 49, 79, 19,164, 82, 24,134, 30,207,207, 47,216,239,118, 12,238, 74,156, 62, 71, 62,111,205, 17,162, 74,105,242,
-176, 27, 93,121, 38, 41,197, 58,250, 46,190,250,148, 18,186,150,200,126,187,161,167,189,120, 12, 12,183,162,221,176,226,103, 94,
- 81,109,103,230,241, 95,199,237,244, 12, 47,136,217,146,172,150,185,201, 16, 60, 70,151, 82,178,168,177,196,229, 94, 59,118, 33,
-105, 12, 46, 57, 44,167, 80, 66,137,204, 24, 33, 57, 3, 65,155, 6, 41, 18,218,117, 93, 72,136, 58,207, 35, 5,136, 9,226, 19,
- 0,140,148,149, 2,211, 60, 19, 74, 89, 17, 87, 32,248, 72,177,183,165,147,254, 3, 32,170, 50, 21,217, 22,243,237, 46, 60,111,
-176,178,165,151, 40, 82,113,185,197,153,227,202,212,184, 89, 31,242, 36, 83,181, 90,254, 18, 34,111, 16, 46, 36,234, 18, 27,127,
- 56, 68,102,152,136,184, 42,218,249,207, 11,116, 67,224,186,215,237,154, 22, 67, 63, 16, 82, 80,104, 30,237,148, 15,190,224,144,
- 42,100, 70, 41, 1,173, 1,171,128, 70, 75, 40, 69,163,119,171, 51, 52,251,202,167, 16,241,219, 31, 78,248,230,195, 17,107,146,
-200,210, 16, 58,145,125,201,229,240, 33,184,139, 46, 5, 59,191, 97,115,211,239, 39, 25,182,127, 21, 41,148, 7,124,213,220,215,
-148, 28,238,239,121,239,174,148,128, 17, 2,173, 53,184,219, 15,104,141, 70, 99, 45, 71,197, 10, 74,103,146,101,132,182,225,203,
-243,215, 83, 74,163,107, 90, 52, 77, 3,169, 21,180,177, 48,198,194,216, 6,109, 63,192,182, 29,160, 52, 0, 5, 31, 19, 22,231,
- 49,205,174, 90,123, 32,232,130,242, 62,112, 29, 75,184,113, 84,111,118,195,159, 96, 86, 63, 9,223,185, 10,250, 4,239,192,181,
- 50, 80,252, 48, 84,124,128, 65, 38,100, 45, 88, 8, 41,114,198, 48, 52,184,127,216,227,171,175,222, 97,223, 55, 8,110, 65,163,
- 0,155, 51,254,221,255,245, 31,241,253,135, 19,144, 21,141,143, 68,201,229, 35,191,254,239,178,154,101,108, 80,173,184,254, 14,
- 73,224,166,160, 23,141,198, 91,122,220,237, 88,226, 26, 20,147,197,245,144,246,230,156,112, 21,159, 36,108, 94, 11, 84,127,105,
-126,243,186,225, 6,191,123,179,237,223,172, 59,168,144, 11,246,147,145,213, 8,184, 27,118,248,251,191,254, 91, 28,218, 30, 8,
-161, 74, 60,231,121,193,101, 26,241,122, 58, 97,117, 43,241,248, 3,101,120, 7,208,161, 79, 42,197,163, 61,193,176, 12,135,151,
-151, 23,236,239,238, 32,148, 38,240,145, 38, 78,123, 66,134,181,212,229, 36,239,137, 44,198, 19, 35,183, 58,196, 24,241,248,240,
-128,253,110,135,227,241,200,156,235,140,126,183,195,196,221,186, 98,107, 86,223,117, 56,241,207, 37,164, 68, 66,198,233, 76,255,
- 29, 51,249,183,143,231, 35, 66,240, 56,189,158, 32, 65,105, 85,235, 76, 66, 41, 74,187, 34, 69,241,234, 29, 94, 95,159,235, 40,
-148, 70,179, 26,145, 11,130, 20,244,192, 6,195,144, 72,109, 31,145,133, 98, 88, 74, 38,178,220, 50,115,131, 64, 1, 66,109,219,
-210,158,119,232, 32,164,160,195,132,243,208,198, 48,220, 69, 85, 98,155,101,165,116,102, 17,225,186, 44,149,106,182,235,123, 42,
- 78,200, 24,231, 25, 41,147,117,108, 89, 22,228, 20,208,183, 45, 11, 78,233,153,177,250, 21,109, 71, 94,233,142, 61,215,187,221,
- 0,207,145,168,137, 51,235, 51,255, 12, 82,210, 78,223, 90, 11,193,150, 42,129, 12, 99, 20,131,153, 4,140,210, 4,171, 9, 17,
- 86, 91,122,178,213, 41,161, 66,102,171,175,210,178,250,188,133, 80, 28,230,146,234, 61, 97,141, 33,188, 51, 63,227,154,134,112,
-180, 49, 69,216,198, 98,158, 39,236,119, 3, 69, 40, 35,163,237, 58, 8, 13,216,214, 86, 60,170, 82, 26, 62,198,186, 74,209, 74,
- 33,103, 2,196,140, 23, 82,185,239,119,123, 88,163,225,189, 35, 75,178,178,172, 98,151,176, 13, 5, 15,101,118,228,164,148,249,
- 25, 74,133,221,104, 77,194,194,148, 97, 56,227, 60,229, 4,211,152,138,242, 93, 22,186, 31, 34,143,236,233,115, 9,238,226, 67,
- 64, 22, 25, 74,203,171, 77, 56,209,189, 28, 57, 90,248,124, 58,195,104, 11,173, 12,214,101,173,235, 71,239, 61,230,105, 65,215,
-210,129,194,232,235, 56,127, 93, 61,186,190,163,140,117,118, 66, 56,231,200,177,116, 58, 35,198, 76,169,133,109,207,147,131,140,
- 20, 3,215, 32, 81, 54,210,155,124,147,124,141,145, 45, 46,140, 77,214, 72,206,249,186, 30,102,120,213,205,242,145,153,242, 66,
- 8,126, 92,230, 26, 72,150, 19,115, 56, 18, 55, 39, 25, 80,189, 86,191, 44, 17,167, 90, 16,209, 76,178,138,183, 60, 60, 41, 57,
-145,126, 8, 89,197, 87,162, 10,179,228,102,204,174, 36,137, 59,250,174,131,209,134, 61,235,138,233, 63,186, 6,190,215,239,169,
- 37,172, 86,176, 90,192,106,129, 70, 73,104,157, 97, 52, 96,100,130, 22,212, 37,159,150, 21,255,233,183, 31,240, 50, 46,200,202,
- 64, 8,141,204,224,150, 92, 85,221,215, 49, 68,253,119, 41, 63, 73,145, 19,178,196,223,201,122,106,162,113,154, 98,175,120, 38,
-116, 29,119,252, 74,147,224,195, 26, 34,198,181,172, 94,239,218,150,232,112,214,112,118,176,226, 61, 98,174, 57,232,219,228, 29,
-242, 76,210,205, 98,140,102,161,157,133,109, 26, 66, 91,106,141,148,233,162,242, 33,193,185,128,105, 92, 48, 78, 51,188, 35,153,
- 68, 74, 25, 62, 6,184, 64,227, 50, 81,124,250,226,141,234, 92,108,137,128,121,115, 24,147, 69, 41,113,243,186, 72, 37,161,165,
-169,171,147,242,218,101, 41, 32,181, 70,219,117,176,198,242,137,215, 65,138,128,198, 72,252,228,253, 59,188,255,234, 11, 24,161,
-225,231, 11, 58, 99,176, 44, 17,255,230,223,253,103,114,188,137,132,164,174,105,127, 25,121,163,228,188,145,227,111, 70, 78,114,
-211,157,127,126,151,126,229,251,227,138,171,225,139, 90,148,118, 66, 94,111,169,156, 55,154,145, 27,241,228,166,211,175,234,117,
-113,195, 87, 22,159,141, 74, 20, 5, 53,115, 45,236,114,163, 55,201,215, 41,128,200,128, 17, 18,127,243, 87,255, 20, 63,254,226,
- 75, 68,231,224,230,133,121,252, 2,243,178,192, 39,194,138, 26,206,223, 78,137, 44, 60,171,247,128, 20, 28,107,233, 48,244, 67,
-141, 71,237,251, 30,198, 54,228, 98, 8,212, 57,181,109,139,121, 93, 48,141, 23,242, 82,207,212,109, 55,109,195,142,142,132,187,
-195, 29,158, 30,159,112, 62,157,112,100,226, 28,152, 21,238,156, 67, 99, 45, 30,238,239,241,238,233, 9,200, 64,207,163,116,109,
- 57, 28, 36,101, 8,165, 32, 88, 0,186,174, 43,197, 89,110,237, 58, 2,152,151, 5,198,106,228,148,224,157,195,233,124, 70,200,
-100,195,209,138,224, 74, 62, 6,196, 76,150, 45,205, 5,205,104, 77,118,190, 24, 41,178,149, 81,155, 84,188, 36,239, 88,175,197,
-193, 7, 7,205, 59,101, 32, 99, 93, 29,117,151, 41,145,166,165,107, 25, 43,186, 98,232, 7, 26,191, 46,107,141,116,213, 90, 3,
- 57,163,103,129,150,247,164, 21,216,237, 14, 20,175, 25, 60, 26, 75,169,111, 53, 87, 93,107,228, 76, 9,139, 57, 69,242,236,243,
- 24, 61, 4, 7,107, 44,230,121,198, 48,244,100, 91, 45,246, 42,246,203,151, 41,101,228,130, 89, 58,197, 2,165,201,153, 14, 4,
-235,186,160,109, 91, 4, 79,162, 45,169,104, 69,216,117,109, 21,216, 5, 23,234,142,187, 20,140,226,147, 7,119,251,222,123, 38,
-199,145, 6, 64, 74, 26, 77,151,195, 4, 69,101,107, 52,182,129,115,158, 70,220,138,176,179,158, 67,110,148,146, 60, 81, 37,202,
- 91,185, 73,250,129, 20,233, 33,120, 36,182,242,118,172,186,111, 26, 74, 0,148, 82,242,129, 13,245,245, 43,185,230,193,121,116,
- 61, 77,146,180,214,172, 97, 74, 87,254, 8,223,135, 82, 82, 20,182,228,233, 17, 0, 44,203,204,175, 27,119,180, 66, 18,219,157,
-245, 73,229,177,145,153,220, 55,142, 51,135,191, 76, 88,150, 21,195, 48,212,134,129,210,243,100,213,223, 72,165, 41, 7,157,191,
- 54, 89, 29,105,236,127, 62, 95, 16, 83,224,104,220, 30, 67, 63,144,243, 43, 38,164, 16, 57, 3, 62,215, 70, 75,150,169,252,150,
- 78,185,137, 43,167, 3,219,198, 9,244,217, 6, 44, 87, 91,114,237, 78,120,103, 88,219, 81, 1,168, 59,107,126, 89,213,143, 12,
-141, 80, 82,194, 40,122, 1, 21,143,207,149,228,255,207,197,138, 16,170,252,231,138,189,136, 82,194, 40,141,221,176, 67,215, 13,
-208, 60, 6,162, 46,131,138,133, 82,234,166,168, 91, 30, 79, 91, 35,208,104, 1,171, 72,253,174, 53, 96, 24,155, 26, 82,194,135,
-227, 9,255,249,187, 87,204, 62, 65,152,134,242,202, 51,141,191,136, 58, 71,232,212,250, 2, 8,177, 17,243,189,177, 43,109, 98,
-237, 20, 7, 1, 20, 96, 64,241,164,163,210,111, 69,221,163,151,159,189, 49, 6, 77, 67, 30, 84, 58,121,107,226, 13, 43,186,112,
- 19,174,152,219, 2,128, 40,223,171,188, 97,137,163, 69,149,210,200, 89,212, 4, 57, 31, 2,229, 1, 59,135,101, 94, 49,142, 51,
-150,197,209,174,134, 73, 74,129,197, 35,249, 77,175,184,213, 55,136, 77, 70,125,141,248,172,194,184, 66,224, 99,235, 33, 63,216,
-196,246, 53,205,101,143, 45,144,149,130, 52,188, 91,111, 27, 52, 93,131,135,195, 14, 77, 78,208, 57, 96, 55, 12, 24,158, 30,160,
-122, 11,169, 20,172,233,240,111,254,239,255,128,215,203, 25, 96,104, 78,174, 7,140,173,248, 76, 94,199,112, 57,223, 76,200,111,
- 71,230,249, 54,224,224, 77,130, 96,218,132, 14, 93,245, 20,226, 26, 66,180,249,243, 58,118,191, 21,157,110, 8,131, 87,184,131,
- 16,226, 6,234,240,251, 44,118, 37, 92, 33,111,186,253,204,233,122, 6, 2,127,254,227, 63,193, 63,253,139,191,132, 76, 64,116,
- 30,235,178,214, 46,112, 94, 38, 74,251, 2,141, 12,205,102,228,234,188, 39,225, 78,219,193, 40,141,187,187,187,170,240, 37,126,
-246, 90, 11,109,223,247, 56,159,207,120, 57,190,226,231, 63,255, 57, 46,103, 2,208, 20, 85,236,233,120,194,126, 24,208,117,148,
- 35,126, 58,157, 0, 0,195,126, 7,173, 20,142,199, 35,223,207,116,223, 75, 8, 56,231, 8, 5,107, 13,132,164,132,172,182,109,
- 49,244, 59, 12,125,143, 20, 41,200,194, 40, 3,219,183,220, 9, 72,204,203,140,142, 51,217, 75, 92,103, 76, 9,146, 71,243,141,
-181, 88,157, 7,196, 53,229,143, 0, 79,158,152,222,146,180, 6,195,208,115, 92,102, 70,142, 1, 74, 0, 66, 93, 51, 38,148, 82,
- 8,209,179, 82,188, 69,211, 24,140,151, 11,237,141,119, 59, 40, 41, 96,148,194, 52,142, 80, 74,226,233,233, 9,227, 52,113,225,
- 87, 55, 32,154,190,239,107, 58, 23,120,199, 78, 34,179, 84, 11,135,115,174,198,206,230,156,106,110,196,126, 55, 96,225,221,171,
- 98,145,104,226,244,195,194, 57,151, 82,113,113, 37,102,127,199,182, 67,101, 52, 86,183,162, 31, 6, 38,196,209,100,166,105,169,
-248, 52, 77, 91, 89, 5,138, 29, 58,186,116,192,252,172, 50,214,144, 34, 33,165, 26, 89, 75,227,121,142, 43,206,168,211, 2,183,
-174, 20,199,202,226,176,242,140, 66, 6,235,103, 44,220,178,192, 26,178,126, 81,114,157, 37,239,183, 40,207, 44,226,225,211,250,
-148, 96, 61, 36,206, 20,232,186, 22, 77,219, 96,158, 73, 68,169,140,161,164,179,194,121,231, 56, 86,195, 56, 91,193,147,167,174,
-235,234,186,147,166,185,130, 86, 10, 41,209, 65, 14,130, 14,131,140,133, 37, 65, 96,168,216, 92, 74,218, 83,204,143, 15, 85,216,
- 71,196,206, 92,213,245,197,189,244,250,122,172,235, 11, 18,239,113,142,186,162,189,253, 52, 78,220,217,211, 33,201,242,228,167,
-109, 44,180, 38, 48,209,178, 44, 24,167, 17,235,178,226,241,241,137,166, 39,171,171, 66, 73,193,206,163,183, 25,143,185,118,232,
- 87, 8, 87, 25,193,191,229,171,200, 55,150,236, 26,129,142,109,214, 10, 45,110,133, 0,212,189, 53,191, 84,146,138,117, 81,161,
-151, 29,184, 4,167,164,201,107, 90, 90,121, 19,181,226,191,195,133, 87, 49, 52, 69,107, 75,136,189,182,133, 54,134,132, 46, 74,
- 87, 18, 80,161, 2,105, 45,107,192,189, 53, 10,141,145,104,141,130,149, 2, 70, 75,104, 67,197, 94, 9, 10, 63,249,238,249, 5,
-191,121, 30, 17,133, 38,213,187, 0,219, 90, 50,191,112, 36,110,168, 97, 36, 37,247,125, 83,232,202,133, 34, 4,161, 55,133,100,
- 53, 39, 68, 29,253,208,233, 74,113, 33,167, 78, 68, 42, 81, 79, 88, 82, 72, 52, 70,195, 88, 98,183, 75, 37, 56,234,175, 64, 16,
-216,203, 42,213, 77,238,112,129, 38, 4,246, 32,198, 68,160,154,178,223,117,222, 35,196,196, 5,221, 99, 26, 39, 76, 19,161, 64,
- 19, 39, 15,197, 76,153,191,180,167,202, 85, 16,119,131,197,251, 68,224,117, 5,175, 82, 17,149,181, 88,146, 23, 86,177,202,159,
-126,255,196,177,169,213,107,203, 83,139,228, 35,114, 12, 48, 70,226,126,215,225,253,227, 29,238, 15, 29,132, 34, 91, 81,119, 24,
-208,252,244,199,144,109, 3,119, 26,241,171, 95,127,141, 95,253,246, 27, 42,138, 9, 53,106,239,106, 29, 19,117,180,253, 22,142,
-115, 45,152,226,150,175,190, 9, 24,202,111,167,237, 55, 10, 83,113,163,132,207,216,230,180,231, 55,148,167, 55,161,172,219, 80,
-162,237, 87, 18,226,179,121,111, 55, 34,211,122,224,184, 38, 5,138,148,241,180, 63,224,159,255,221,223,163, 21, 10, 8, 17,129,
-195, 56, 98, 8, 88, 87,178,235,208,184,153,174, 17, 23,104,116, 76,133,219, 82,128, 6,231, 96, 23, 91,143,247, 30, 79, 79,143,
- 88, 87,135,182,109, 41,147,250, 50, 34, 1,248,233, 79,127,138,105,158, 48, 77,211,109,148,100,164,145,254,249,124,130, 15,158,
-108, 71,156,203,126, 62,159,233,160,174, 40, 40,198,106,234, 18,187,174, 5,144,113, 25, 71,188,188,188, 16, 79,193, 90,244, 93,
-143, 47,158,222,225,245,229, 21,239,191,124, 15,163, 45, 98, 78,240,129,246,222, 20, 32,163, 25,190, 19,153,153, 46,144,138,106,
- 56, 70,250, 72,169,218,117, 50,163,153,115, 78,149, 22, 70,172,123,154, 34,106, 41, 73,204, 36,101,125,240, 38,100,134,171,200,
-186, 47, 95,215, 21, 70, 73,154, 48, 2, 48, 70,227,112,216, 51, 75,125,133,181, 77,157, 74,208,131, 95,214, 14,220, 90,203, 60,
-242, 6,227, 52, 49, 16, 70,163,237,232,239,100,100,104, 46,106,130,131, 74, 4, 8, 15,186, 46, 11,233, 75,154,134,178,191,149,
-162,130,196, 76,115,173,205, 13, 85,173,132,144,152,198,194, 7, 34,215,245, 67, 15,231,121,242, 32, 69,229,172, 23,134,124,230,
-223,167, 76, 1, 5,235,124, 32,233, 89, 28, 83,160,255,135,180, 65,141, 94, 11,165,214, 10, 57, 68,182, 54,238, 43,185,109, 93,
- 87,180, 13,189,215, 52,214,119, 88, 87,135,253,129, 48,182, 70,107, 6,103,137, 27, 58,154,109, 72, 11, 97,139,123,135,211, 25,
-193,225, 57, 11, 7,176,104,182,164, 85, 30,255, 60, 67, 8,210,134, 32,101,206, 59,167,206, 29,146,106,207,202,130,203,121, 89,
-217,147, 78,122,159,138, 42,151,146,240,203, 12,166, 73,188,162, 0,255, 93,202,179, 23,181, 9, 42, 77, 75,211,118,228,166,154,
-215,106,159, 43,226, 71, 2, 47, 69, 62,124,181,240, 62, 96,158, 38,164,250, 30,170,106, 93,238,187,134, 26, 22, 22,173,158,207,
-103,238,218,123, 90,163,229,223, 29, 91, 94,237,112,165, 33,133,248,108,128, 90,190,125, 64,109,158,245,242, 83,176, 6,163,213,
-181,146,183,227,218,107,119, 87, 68,102,249,211,232,203, 26,135, 42,110, 71,189, 28, 21,170,181,174, 56, 84,205,185,234,154,247,
-180,146,223, 12,195, 7, 5,163, 5,172,150,176, 54,195, 42, 64,230, 4,101, 5,164, 74, 16, 42, 34, 5, 15, 31, 5,198, 37, 32,
- 68, 64, 40, 77, 93,102, 10, 16, 41, 67,129,224, 39,129,189,228,185,142, 47,242,213,186,198, 84,163,235,200, 84, 94, 33, 36, 28,
- 18, 35,114, 98, 0,136,134, 16, 10, 90, 10, 10,152,209,146,118,135,108,147, 83,197, 54,199,136, 87,157,104, 28,168, 64, 29,111,
-100,165,119, 65,182, 86,189, 87,181, 38,208,247,117,222,179,199, 95, 34, 68, 48, 96,129, 48,180,203,188, 98, 89, 28,188, 11,136,
-145, 58,209,152,249, 32,144, 98,205, 63,191,102,164,139, 26, 45,187,141,237,123,203, 42,223,230,150,147, 74,147,201,235, 28, 32,
- 35, 11, 9,141,125,218,215,113,118,130,204, 9, 73, 39,136, 20, 48, 8, 96, 48, 18,247,143, 59,188,127,127,143,187,161,135,247,
- 43,194,178, 64, 53, 29, 18, 18,250,222,242, 1,193,114, 82,221,149,179,158,182,156,153,124,165, 86,165,155, 36,212, 91, 13,104,
-185,198,210, 70, 30,122, 83,208, 63, 35,162,171, 83,245, 58, 86,207,127, 16, 55, 83,239,161, 92,206, 30,226, 77,120, 11, 54, 88,
-159,107,152, 17, 54,167,230, 34,184, 20, 57,163, 55, 13,254,219, 95,252,115,188,187,187, 67, 90, 61,141,147,151,133,237, 58,148,
-153,237,130, 7, 32, 48, 47, 43,141,218,187, 14, 46,120, 8,102,128,159,207,103, 72,144,160,179, 76,147,136, 54,151, 49,236,118,
-156,201,109,145, 66,196,238,254, 14,235,178,226,114,161, 36,181,210,157,121,183,226,254,241,158,166, 68,107,132, 85,154, 10,182,
- 20,184,156, 79, 88,230, 9, 90,209, 42, 9, 57, 97, 89,103,210,164,228,136,243,121, 4,164,132,148, 9,214,104, 4,239,144, 83,
-192, 60,157, 97, 52,179,197,115,134,209, 10, 13, 19,198,148,214,184,140, 23,218, 95,134, 8,169, 13, 18, 72,244, 36,121,159,173,
-181,174, 7, 91, 18,144,129,167,125, 4,254, 16,144, 8,129, 14,218, 33, 20, 27, 84,134,150, 10,107,240, 85,123, 65,221, 95,100,
-136,200, 12,203,214,173, 28, 34,118,135, 3,246,251, 29,166,105,164,238, 92, 27, 72,229,171,248, 85,137, 43, 12,165,216, 7,219,
-182,197,137, 99,106, 73, 27, 67,227,113,163,245, 53,195,164, 23,236, 0, 0, 17,119, 73, 68, 65, 84,172,100, 89,120,244, 94,198,
-192, 11,218,166,229,238, 57,242, 24, 62, 32, 7, 18,174,209, 56,127,207, 49,159,129,167,116,212,105, 74,126,143,168,184, 4, 88,
-107,170,117,182, 8,141, 27,107, 73, 75,195,192,149,200, 48, 21,173, 53,214,213,179, 29,205, 34, 70, 26, 33,211,235,139,218,101,
-134, 16,232,138,101, 44,181, 82, 18,227, 56, 17, 37,143,139,128, 15, 68, 49,235,122,192, 54, 13,156,191, 32, 35,163,235,123, 64,
- 0, 33, 6,138,145,101,177,111,209, 13, 68,239,145, 82,199,197,137, 14, 15, 33, 70, 24,107, 49, 29, 39, 60, 63,191,224,225,225,
-190,174, 84, 78,167, 19,186,174,140,231,155, 10,217,241,222, 87,251, 88, 89,231, 22,113,227,178,174, 88,221,138,174, 49,108,147,
-138,245,126, 36, 52,111,170, 7,179,156,105,178,226,220,202, 56, 94, 2, 93,197,136,122,128,110, 26,139, 97,216,177, 62,197, 87,
- 12,236,253,253, 61,190,249,230, 91, 0, 18, 33, 78,216,237,246, 85,101, 95,112,205,153,211, 6,189,247,184,191, 59, 96,156, 22,
- 92, 46, 19,124, 10,120,125,125,193, 97,191,199,187,119,143,120,126,126,102,183,195,166, 25,169, 90,173,107,125, 42, 40,114, 8,
-241, 89, 10,102,126,243,172,207,137, 87,153,169, 8,190, 5,242,198,250,171,149,150, 55, 34,170,124,157, 85,210, 73,119, 27,134,
-130, 98,165,184,182,252,219,206, 75,128, 60,177,214, 88, 24,109, 96,120, 79, 38,133,132,150, 12, 9,216,236,212,149, 96,239,187,
- 32, 32,132,231, 37,105, 0, 32,100, 66,144, 25, 58, 11,248, 40,177,122,226,167, 71,238,188, 82,200, 76,148, 99, 81, 18,179,164,
-111,206, 68,101, 60, 38,128,196,189,147,200,180,211,149, 66, 86,254, 47,193, 98, 88,184,192, 54,136,146, 24,167,180, 64,228, 40,
- 86, 33, 4,211,229,184,115,142, 9,177, 8,233, 32,233,225,195,228,184,124,131,249,147, 53,166, 85,112,222,109,241, 74,122, 31,
-249,130,242, 8, 62, 50, 4,195,115,160, 2,248,123,209, 71, 8,145, 88,241, 27,174,187,216, 56, 15, 18, 47,131,228, 27,198,253,
-214, 1, 16, 83,102,193, 26, 21, 9, 72,193,193, 53,212,244, 67, 74,228, 36,106, 36,168, 84,138,196,146, 50,163, 49, 10,187, 78,
- 97,223, 43,220,183, 10,247, 70,226,177, 49,216,189,187, 67, 82, 18,113, 93,160,108,131, 57, 56,204,211,136, 4,129,144, 37,178,
-148,136,252, 14,188,221,115,221,174,168,243, 31,166, 22,230,202,121,216,122,222, 88, 84,159,175,224,153, 82,160,171,126, 66, 84,
-151,192, 86, 53,154,243, 22,253, 46,234,154, 99,219,153, 95,255,238,213, 5,241,214, 84,151, 55,130,195,114,157, 89,161,240,139,
-191,251, 59,252,197,159,254, 41,226,188, 66, 52,192,154, 2, 66, 88,208,247, 22, 49,145, 86, 99,252,225, 7,184, 16,233,250,147,
- 18,243,186, 34,112,244, 35, 37, 73, 81,196,164, 20,146,168, 95,220,137,156,206,167, 58,182, 27, 47, 35,250, 97, 7,183,174,248,
-248,250,130, 53,120,124,249,238, 29, 94, 95,158,177,172, 11, 21, 87,102,143, 55,109, 87,167, 92,116,205,121,246, 90,211, 62,127,
- 28, 71,164,148,176,219,237,176,186,149, 70,231,193,163,111, 91, 60, 61, 61,224,227,135,143, 64,206, 56,190,190,226,112, 56,224,
-248,250, 2, 64,224,244,122,134,177, 6,251,253, 14, 66,210,110,211, 5,143, 97,183,103,177, 83, 34,125, 45,175,249,180,210,240,
-236,217,214, 90, 83,120,137,228,131, 49,191,254,116,248,165,240, 20,201,239, 41,197, 98,106,172, 43, 89,244, 40, 82, 53, 32, 4,
- 10,157,114,193, 99,104, 91, 88,219,194,218, 6,227, 56, 50, 64,197, 16, 33,108,154, 32, 4, 17,193, 40,148,133, 58,179,253,126,
- 95,223,239, 24, 2,148,214, 0,174, 44,117,197,234,235, 34,226, 19,124,232, 49,198,220,168,145, 11, 98, 54,114,106,152, 16,146,
-118,179, 72,245, 80, 45, 57,250,213,249, 80,247,218,101,116,108, 13,117,152,151,203,185, 62,131,181,102,155, 98,240,212,204,112,
- 66, 89,138, 36, 0, 4, 18, 82, 36,165,253, 82, 14, 32, 49, 85,174,186,110, 26,214, 93,152, 26, 35, 75,197, 63,214,145,183,243,
-142, 41,123, 20,149,171,141,129,243,142,214, 0,243, 4, 25, 1,221,182,200,145,214, 74,129, 39, 59, 57, 10,162,189, 13, 3,243,
- 0,174, 58, 37,165, 40,239,226,116, 58,227,225,225, 1, 41, 70,178, 89,114,178,229, 52,142,104,109, 67,186, 34, 48, 77,109,131,
-150, 45, 7,173,235,243,139,189,216, 70, 49,152, 40, 35, 73,186, 38, 96, 24,253,170, 36, 21,221,121, 69,100, 76,108,138,137,234,
- 76, 76,144,146, 56, 0,125,223, 85,140,243, 56,142, 24,134, 29,124, 8,216, 31,238,240,241,227, 75, 69,200, 22,190,202, 60, 47,
-144,146,214, 11, 5,227,186,174, 43,134, 97, 7, 41, 21, 94,158,143, 53, 94,183,239,123, 60, 60, 60,112, 18,157, 35, 39, 80,190,
- 54,119, 69, 23, 82, 38,200, 33, 38, 62, 68,223, 78, 18,197,134, 47,178,125,210,164,156, 55, 77,205, 53,107,130, 82,218, 68,190,
-229, 85,151, 24,201,250,223,168, 10,204,183, 17,235,117,238, 47,175, 15, 53,107, 27, 88, 67,106, 67,173, 12, 76,233,212,249, 34,
- 46, 44, 94,228,107, 10,155,139,137,132, 97, 5, 72, 34, 51, 32, 3,140,136,176, 2,136, 89,163,105, 15, 80, 98, 68, 72,145,226,
- 65,147, 64, 98, 47,162,132,224,131,130,124,115,194,145, 87, 68,103, 1,128, 8,108,138, 92,162, 3, 1,147,141, 8,140, 67,187,
-113,193, 66, 22, 33, 50,140,166,131,129, 81, 4,189,160,145, 27,105, 9,104,164, 75, 47,114, 8,137,199,136, 36,152, 40, 97, 46,
-165,153,203,213,178,145, 57, 96,128, 4, 78,196, 43, 38, 47,167,247, 1,222, 69, 6,143, 92,209,187, 33, 70,248, 68,187,199, 43,
-130, 23, 55, 54,176, 44, 54, 29,106,161,184,161,120,210,115,189, 56,232,193,194, 0,132, 34,182, 19, 10, 66,106, 72, 69,163, 65,
- 35, 37, 68,142,208, 82, 32,193, 65, 26, 96,232, 12,118,157,134,177, 25, 8, 35, 90,111, 32,166, 51,176, 52, 80, 95, 60, 64, 12,
- 22, 98,215,194, 30,122,188, 30, 95,161,165, 70,136, 10, 42, 73, 68,145, 89,212,118, 59, 77,200,159,233,154, 63, 91,244,111, 22,
- 82,249, 70, 76,146,147,164, 3, 92,150,159, 57, 22,136, 63,232, 53, 47, 59,170,207, 89,230,174,159,147,110,161, 18,249, 54,194,
-149,183, 93,100, 14,204, 2, 6, 18, 63,251,201,159,226,239,255,230,111, 17,151, 21,110,158, 32,145, 16,194, 2, 30, 54,193,187,
-132,243,249, 66, 34,185,232,145, 89,160,184, 46, 43,169,145,185, 64, 20, 23, 5, 69,109, 94,176, 58, 71, 2, 51, 86, 87, 91,107,
-113,184,191,195,249,114, 70, 98,161,231, 87, 95,125,133,233, 66,187, 62,199, 29,208, 56,205,252,146, 16, 66, 51,198, 12,239,137,
-195, 61, 12, 29, 21,176,149,174,193,135,135, 7, 30,159, 46,120,122,124,130,247, 52,230, 63, 29, 95, 49,142, 23,104,173,208,182,
-228,250, 56, 79, 19,114, 34,178,219, 48, 12, 80, 90,227,229,245,149, 68, 89, 77,131,166,109,113,124,125,133,110, 59,100,145,224,
-150, 21,186, 33,219, 93,219,112,226,151,214, 88,124,184,233,102, 18,135, 88,164,156, 32,181, 98,237,161, 64,112, 68, 91,203, 66,
- 64, 42, 90,187, 41, 41,113, 62,143,120,122,184,131, 18, 18, 9, 2,218, 88,124,248,248,140,199,199,187,186,190,114,108,177,235,
-186,166,146,229,202,189,154, 82, 98,208,202, 66,251, 83,169, 72, 19, 18, 2,175, 35,214,235,154,142, 71,167,229,253, 9, 33,208,
- 46,154,237,104,214, 26,204,203, 68, 15,111,206,147,167,212,220,124,115,168,140, 33, 64, 52, 45, 23,227,133, 85,211, 60, 98,103,
-161,234, 21,202,130, 58, 2, 47,133, 51,114, 80,137,148, 2,193,123, 90, 3,204,107,221,227, 35,229, 58,225, 81,155,176,144,226,
-236,161,223,119,166,164, 52, 41, 97, 53, 17,220,238, 14, 7,152,117, 33, 44,176, 53,176, 86,211,225,159, 11, 82,219, 52,112,235,
-138,196, 83,163, 98,187,148, 18,104, 27,139,105, 94,152, 85,208, 99,158,103, 24,173, 49,141, 35,134,190,175, 44,133,242,255,138,
-246,136,166, 24, 52, 21, 21, 9, 60, 97,160,204, 15, 41, 73,187, 17,124, 32,183,145,144,112, 21,180,147,170,134, 97,113, 43,118,
-251, 29,173, 74,249,231, 83, 44,238, 38, 97,155,168,200, 89, 36, 85, 17,194,165,123, 22,130, 38, 24,214, 26,126,118, 36, 10,105,
- 17, 10, 90,211,170,129,206, 29, 4, 92,154, 23,143,188,172,104,154, 22,247,247, 2,231,211, 25,222,123, 28,143, 71, 52, 77, 75,
- 19,129, 93,207,182, 53, 96, 93, 86, 98,218, 11, 65,165,174,120,219,111, 88, 49, 98,147,152,129,171, 34, 62, 95, 39,154,185,130,
-105,210, 13,234, 10,220, 52,126,158,151, 14,241, 71, 69,107, 20,176, 71, 98, 54,114,217,165, 25,109, 96,148,169, 98, 59,193, 88,
-216,171, 29, 40, 95,139, 77, 78,200, 89, 34,112,250, 87, 66, 0, 68,198,154, 2, 12,200,178,208,245,119, 24,250, 87, 44,167, 17,
- 62, 0, 33, 43, 8,150,249,231,140, 79, 10,250,118,236,172,132,102,209, 66, 81,233,167,107, 82,150, 84,164, 33,224,255, 95,148,
-176, 20,202, 64, 55,143,209, 6, 16,180, 75,179,197,123, 95,196,101, 16,136, 33, 33, 32, 80,158,242, 38,177, 39,134,192,220,247,
-130,141,189, 38, 60,133, 16, 40,119, 55,209,200, 45, 4,218, 35,122, 23,121,175, 40,234,216, 62, 68, 26,187, 69, 30,183, 92, 45,
-122, 28, 35,250, 38,255,251,118,148, 44,174, 59,245, 55,211,228, 34,136,147,176,208,170,129,182, 29,180,105,232,176,146, 34,114,
- 88,144, 69,130,130,128,230, 88, 91,129, 8, 35, 50,172, 4,180,204, 80, 26, 72,126,130, 8,134,176,189, 6,216,189,127,130, 79,
-132,229, 20, 74, 3, 41, 65,214,208,218, 63,156, 33,144, 55,177,168, 91,129,220,246, 20, 80,186,236,171,114, 93, 66,178, 83, 34,
-191, 21,193,101, 81,201, 82, 55, 20,186,173, 8, 79,252, 97, 64, 77,186,225, 61,228, 55, 66, 21, 81,109, 44, 50, 39, 60, 28,238,
-241,175,254,229,127, 15, 3,137,209,173,120,125,249,128,174,179,112,235, 2, 41, 51, 86,183, 16, 33,206,104,216,174,225, 20, 38,
-133,101,117,220, 33,210, 3,124,158,103, 70, 84,142,232,251, 30,199,243, 9,195, 48,160, 83, 18, 11, 99, 58,219,190, 33,202,128,
-164,180, 52,165, 20,190,254,250,107,156,143, 39, 52,198,162, 29, 58, 40,173, 16, 67,192, 52, 78, 53, 46, 51,112, 68,167,146,138,
-174, 97, 78,161,186,191,123, 64, 78,192,101,156,234,116, 71, 8,133,156, 50,150,197,177,106,184,199,110,183,195, 60,207,156,162,
- 8,180,187, 30, 75,116, 16, 46, 96, 90, 70,244,195,128,161,239,240,252,241, 35,117,118,129,118,237,237,126, 7,164, 12,163, 20,
- 34, 40,186,217,175, 43, 90, 75, 12,248,182,107,112, 25, 71, 86,188,231,202,104,175, 36, 48, 69,135,207,180, 58, 86, 69,147,126,
-101,157, 87,200, 39,133,215,227,153,118,236,156,205, 61, 47,107,189,151,214,149, 30,208,125,223,214, 46, 77, 73, 81,199,176, 0,
-224, 89,164, 40,149,130,247, 17,141,177, 55,196, 51,163, 27, 56, 63,177, 51, 70,215, 93,172,212, 10,113, 38,129, 84, 6,169,204,
-231,117,172, 74,116,173,205, 39,227,212,174,235,106,122, 92,212,154,184,252,193, 99,183,235,177, 27,122,222, 61,243,131, 94, 16,
-202, 52,101, 34,167, 53,182,193, 18, 22, 66,176, 42,130, 61,153,205,243, 41,132, 8,163, 45,167,148,249, 42,112, 43,207, 69,250,
- 26, 61, 70, 81, 31, 8, 16, 25, 8,171,199, 58,207,232,172,133, 95,103, 74, 63,227, 67, 84, 78,169, 10, 91, 75, 7, 77,163,120,
- 9, 37, 84,213,125, 12,253, 0,239, 2,118,195,129,166, 40,206, 65,101,212,107,160, 8,244,202,207, 91,238,201,174, 35,235,227,
- 53, 38,250,106,183,133, 16, 52,130,111,201,158,167,148,130, 95, 28,180, 33, 4,109, 98, 1,178,247, 30,141,177,104,140,197, 56,
-141,232,122, 6, 38,157,207,104,251,190, 34,172,231,121,173,171,172,113,154, 48, 78, 19, 98,202, 56, 28, 14,248,237,111,190,161,
-157,188, 18,100, 51, 6, 77, 6,178, 84, 72,160,194,223,117, 77, 85,195,143,227, 68, 48,178,135, 7,172, 51, 57, 43,214,197,193,
-173, 43,251,228, 9, 29,220,182, 45,172,181, 24,231, 5,142,147,251, 74, 32, 80,105, 12, 69,153,234,110,104,153, 41, 3, 49,225,
-134,158,153,111,160, 94,185,174,202,213, 99,107,126, 41, 54,162,160,237,135, 20,146,189,117, 37,156,228,119, 61,136,233,115,181,
- 50, 24,134, 61,186,118,128, 49, 77, 29,189,151,177, 61,237, 3, 82,197,181,222, 32, 62,217,115,142,140,122, 34, 47,138,122, 72,
-130,242, 11, 9, 28,199, 9,107,200,200, 82, 67, 72,195, 86,128,171,117,173,124,148, 11,133, 78,210,234, 42, 10, 19,183,161, 27,
-114,227, 73, 47,150, 21,129, 4, 37,169,168, 55,214, 64, 40,130, 54, 88, 62,164,208,196,129,227,101,243,213, 46, 22, 67, 68, 98,
- 88, 2, 54, 39, 43,200,114, 51,144,133, 41, 4,234,196, 83,202,112, 43,141,221, 99, 76,240, 28,243,152, 34,174, 60,246, 24,217,
- 43,154,106,193, 18,159,141, 11,205,213,147,122, 77, 71,147, 87,101, 56, 54,250,135,124,181,149,145, 99,192, 66,155, 22, 74,119,
-144,138, 79,199, 33, 32,121, 15, 32,226,208, 26,188,127, 56,224, 71, 95,189,195,251,119,247,248,179, 47,223,225,221,195, 30,135,
-135, 29,204,190,133,106, 13,132, 17, 16, 74, 67,180, 45, 36, 52,254,183,255,233,127,197,175,126,251, 1, 43, 52,162,224, 72,220,
- 98, 23, 17, 21,113,240,230,148,121,251, 81,166, 13, 69,189,143, 92,148,160,226, 54,209, 45,179, 48,173, 96, 94, 75, 98, 93,254,
-252, 36,224, 58,117,202,117, 55, 47,110,246, 87,216,184, 7,176,113, 43,108,195,135, 80,157, 4,153,175, 55,228, 12,145, 50,118,
- 77,135,127,249,139,127,129, 31, 63,190,195,124, 57,227,229,249, 35,140, 81, 24,167, 17,211, 60, 50,222,212,192,167,136, 44, 4,
- 66, 76,128, 32, 80,201,234, 28,180,214,245, 97, 95,214, 98, 77, 67,150,165,195,221,158,186,206,148, 96,155, 6, 33, 6,122, 24,
-197,132,213, 81, 23, 42, 20,225, 95,165,148,248,226,139, 47,144,145,177,122,122,184, 4, 31,216, 34,229,107,242, 90,121, 29,215,
-149, 45, 61, 16,112, 62, 18, 46,181,235,209,182, 61,130,247, 56,159, 78,117,183,173,141,134,143,212,201,167,156,176,219,239,224,
- 82,196,188, 46,152,215,133,186, 37, 37,177,172, 11,142,199, 87,104, 41,235, 61, 31,188,231,180, 47,133,213,205,176,134,136, 96,
- 5, 2, 37,144, 9,120,196,197, 78,148, 45, 74,142,124,201, 83, 54,250,178,146,208, 44, 35, 35,167, 88, 11,226,178,174,144, 82,
-225,238,110,127, 85,130,107,141,121,166,232, 90, 89,129, 41, 60, 43, 76,153, 0, 53,125, 71,157, 46, 71,222,114,107, 13,195, 16,
- 31, 33, 9, 29,157, 65,241,168,164, 66,215,213, 73, 83,120,226, 69, 60,214,245, 61,214, 98, 15,211,154, 50,210,185, 51,163,130,
- 70,191,119,215,209,174, 57,179,174,165,140,247, 1, 48,201,236,218,205, 85,165, 58, 50,145,245,120,103,107,180,102,145, 30, 29,
-216,148,148,112,139,171,201,144,137, 85,241, 21, 89,204, 13, 76,215,181, 8, 33,144,227, 64, 40,158,218,209,149,110, 25,150, 19,
- 24,160,163,164,130, 91, 87, 42,202,193, 19, 74,149, 19, 42,131,167,209,190,210, 10,203, 60,195, 88, 11,173,136,160,105,173,198,
-229,114,225,230, 73,162,105, 73,116, 88, 18,198, 80, 66,118,184,192,229,146, 17,194, 19,201,204, 16, 26,193,252,116,195, 2,236,
-101, 93,107,129,166,189,188,132,243,174, 30,214,140,210,200,153,226,121,155,166, 67,224,213,165,226,137, 88,240,177,238,245,207,
-231, 11, 82,206,152,231, 5, 67,191, 71,223, 15, 85, 96, 55,142,172,199, 16, 18,109,219, 1, 60,105,157,166,137,213,248,244,122,
-142, 35, 9,234,138, 37,211, 90,131,204,135,197,192, 66, 72,210, 13, 88, 52,109,139,149,215, 58,197, 82, 28, 82, 98,141,134,216,
-216,196,137,151, 86, 86,190, 37, 46,187, 88,121,183, 83,115, 5,176, 22,172,140,208, 83, 9,113,231,157,247,198,130,180,141,202,
-124,171, 2, 22,130, 71,223, 41, 67,102, 64, 11, 69,254, 71,149, 17,101, 66, 20, 17, 73,144,192,203, 39,207,227,233, 72,208,131,
- 68, 35, 83,145, 20,141,208,217, 59,105,180, 70, 99, 12,172,105, 96,218, 6,182,213, 24, 58,131,119, 79, 15,120,188,219, 67,203,
- 4, 45, 2, 4, 60,241,215,114,134, 72,180,115, 47, 80,138, 50, 94,174,187, 47, 73, 16,147,200,177,163,108,194, 7, 74,232,188,
- 40, 49,125, 44,118,210, 18,210, 40, 72,163, 33,165,134,210, 22, 82,107, 64,169,234,217,143, 57, 19,242, 82, 40,164,204,249,232,
- 41, 87, 65, 91,228, 66, 32,179, 0,146, 68,138,132,158,141, 81, 32, 37, 9,183, 4,172, 46,194, 39,129,144, 4, 34, 20, 34,138,
- 6,128,196,107, 73,210,206, 62,229,171, 34,253,102, 74,146,232,107, 3,148, 36,151,178, 64, 68, 70, 20,244,218,103,145, 64, 47,
- 7, 3,132, 50, 29, 88, 84,193,231, 18, 85, 7, 89, 88, 36, 24,190,193,103,196,117,134, 76, 1,143,125,139,175,190,120,192,211,
-227, 29, 84,142, 88,214, 25, 31,221,140,179, 86,152, 97,144, 85, 11,217,239, 33,146, 70,158, 86,164,121,132,105, 12,254,236, 79,
-254, 4, 26, 30, 90, 80,122,148,204,134,126,247,242, 61, 33,160, 75,176,174, 84,200,194, 80,140, 46,120,157,145, 18,151,208,128,
- 4,135, 44, 19,146, 76, 52,198, 71, 68, 74,225,170,172,231,196,185,196,193, 7,101, 52, 46,106,104, 93,186, 73,237,170, 54, 38,
-102, 44, 40,113,245,121, 42,153, 33, 69, 2,178, 71, 78, 1, 25, 1, 33,251, 13,124, 73,114, 49,167,157, 83,226,175, 77, 19, 15,
- 5, 35, 52,254,250,159,252, 37,254,171,159,253, 20,110,190, 32,186, 21, 50, 1,211, 56, 99,154,102,248,156,176, 6,250, 72, 41,
-227,114,185,208, 94, 48,210,184,145, 30, 6,182, 30, 74,250,190,131, 0,101, 13,164,224, 17,125,192,235,203, 11,166,121,198,101,
- 36, 96,141,177, 13, 46,211,136,253,221, 1,243, 74,177,144,198, 24, 60, 62, 61, 2,146,246,195, 41, 68,204,211,140,182, 37, 94,
-121, 10,129, 40,138, 26,184,123, 60,224,114,161,238,182,235, 26,184,117, 1, 88, 28, 42, 36, 16,130,131,243, 43, 66, 10, 8, 57,
- 2, 90, 98,114, 51,198,101, 70, 18, 2,237, 48, 96, 13, 1,211,116, 70, 12, 30,214, 42, 40,171,240,114, 58,226, 52,158,161, 27,
- 13,105, 21,148, 81,152,166,153, 14, 65, 90, 19,165, 80,102,172,110, 66,206,180,130,176, 70, 99, 93,103, 88,171,209, 53, 6,119,
- 93,135, 94, 73,116,146, 24, 22, 86, 11,208, 51, 57,161,233, 44,144, 35,180, 68,157,134, 93,198, 5,128,134,115,180,207,151,138,
- 58,118, 31, 51,230,197,195,135, 8,109, 13,197,195,102, 9,153, 37,214,133, 2,112,164, 49,152,220, 2,159, 60,164, 85,240,209,
- 65, 42,114,202, 16,226,148,214, 0,228,139,151,168,167, 13, 65,197, 55, 33, 35, 75, 81, 15,224,193,123,244,173, 5, 16, 97, 12,
-233, 39,200,117, 67,207,157,152, 57, 40, 70,210, 53, 45, 9, 18, 2,205,157,108,103, 27, 68,231,209, 54,154, 52, 0,252,220, 81,
-202,208, 20, 35, 11, 88,169,208,106,139, 28,129,198, 16,254,182,181, 13, 36, 8,115, 90,108,127,133, 20,103,141, 65,103, 27, 40,
-242, 24, 2, 41, 65, 11, 3, 45, 45,173, 15, 83, 70, 74, 2,211,228,224,214,128,174,221, 33, 39,129,224, 51,148, 52,136, 1, 80,
-176, 8, 46, 67, 9, 42,226,182,209,208,141,130, 79, 1,182,109, 17, 65,236, 5, 72, 64,106,129,197,173,184,123,188,131,207, 1,
- 33, 5,100,102,113,148, 28,244,105, 93,176,186,192, 1, 62, 1,128,134, 98, 60,109, 78,168, 90, 44, 8, 1,101,168, 51,118,158,
-106, 73,146, 9, 73,102,248,228,153,234, 70,214,230,243, 56, 97,241, 17, 80, 26, 66,107,172,193, 67,107, 11, 64, 65,106, 3, 41,
- 8, 79, 11, 33, 49,205, 43,229,107,204,116, 24, 36,162,163, 36, 26,157, 0, 30,239, 30,112, 55,236,145, 99,194,249,120, 68,219,
-118, 48,218, 2, 17,152,206, 23,248,121, 5,144, 41, 27, 0, 25,243,124,193, 52,157, 0,153, 48, 28,122,220, 31, 14,232,154,166,
-106,201,166,113,132, 72, 17,119,187, 1,217,123, 8, 14, 53, 66, 12, 92,131, 55,154,168,196,200,240, 44,160,202, 63, 82, 65, 75,
- 69, 58, 53, 81, 62, 72, 80, 41,132,192,255, 7, 3,238,150, 17, 62,123,156,230, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
- 0};
-
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
+ 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,
+111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,
+128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,
+200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,
+247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,
+198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,
+211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,
+142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,
+157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0,
+ 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41,
+ 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36,
+ 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52,
+ 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98,
+ 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,
+160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196,
+ 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,
+194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81,
+ 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,
+123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,
+255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176,
+ 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,
+172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97,
+ 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,
+139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200,
+ 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,
+160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195,
+ 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9,
+ 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,
+168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67,
+ 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7,
+ 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106,
+ 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,
+168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,
+208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152,
+ 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,
+149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,
+171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,
+164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,
+152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,
+167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,
+189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167,
+ 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,
+189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29,
+ 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227,
+ 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,
+162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,
+166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,
+171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,
+238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238,
+ 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,
+243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,
+237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149,
+ 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,
+114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,
+122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,
+140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,
+214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223,
+ 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,
+213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,
+112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119,
+ 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,
+197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,
+113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172,
+ 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,
+202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219,
+ 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,
+130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,
+174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,
+222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,
+182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,
+238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,
+137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,
+214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30,
+ 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204,
+ 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,
+157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206,
+ 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185,
+ 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,
+247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213,
+ 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,
+134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,
+248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51,
+ 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,
+147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0,
+ 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 12, 29, 18,
+ 47, 19,145,242,249, 7, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,184, 93,215, 85, 39,248, 91,251,156,123,239, 27, 52,
+203,146, 28,199,142,109,217,113, 70, 98,140,156, 64,101, 66, 16,185,168, 64, 65, 51,201,124,161, 33, 52,147,220,208, 83,168,238,
+216,174, 46,250,131,250,138, 4, 75, 69,117,160, 26, 82,109, 21, 20, 31, 5, 52, 84, 68, 24, 58,253, 1,193, 10, 56, 36, 6, 2,
+113, 37,129,224,140, 86, 28, 39,158, 36,107,126,195,189,247,156,179, 86,255,177,215,222,123,237,115,239,147,158,100, 13, 86,114,
+ 86,190, 23,201, 79,239,157,123,134,125,246, 90,235,183,126,235,183,128,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,
+179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206,
+ 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,187, 36, 86, 92,226,207, 35,253,154, 1,176,
+221, 57,108, 17,193, 18,128, 74,191,223, 89,103,157,117,214, 89,103,157, 93, 1, 70, 0,156,115,116,243,191,218,125,235,239,126,
+252, 23,190,243,240, 39,127,241,187,142,190,243, 7,190,238,143,250,165,219, 97,126,166,179,206, 58,235,172,179,206, 58,123,158,
+103,234, 4,160,255,147,111,126,201, 59,126,225,123, 95,250,214,109,213,242,252,150,117,243,179,111,248,250, 23,191,228,245, 47,
+221,178,235,195,159,122,250,233,227, 11,227,207, 2,144,206,185,119,214, 89,103,157,117,214,217,243,219,169, 59, 0,115,223,120,
+195,236,247,252,211,173,245, 43,151,143, 28, 67,117,252, 40,234,229, 17,110,185,229,250,141,223,251,250,155,190,253, 51, 79, 28,
+ 47, 62,247,228,169, 79, 0, 88,238, 28,123,103,157,117,214, 89,103,157, 61,191, 51,245,193, 71, 30, 59,245,244,230,245,253, 87,
+189,238,166,117, 87, 75, 45,104, 78,159, 66,125,250, 52, 54,110,221, 90,190,229, 77, 47,255,198,134,235, 23,127,248,145,167, 63,
+ 6,224,104,231,216, 59,235,172,179,206, 58,235,236,249,233,212, 1,128, 68,112,250,143, 31, 57,249,241,103,150,155,205,119,188,
+108,195, 45, 51, 69,137,106,121, 25,205,137, 99,192, 96, 14,119,188,238,229, 47,123,213,245,235,119,126,240,147, 79, 62,182, 48,
+172, 15,117,143,168,179,206, 58,235,172,179,206, 86,159, 61, 95,234,207,155, 1,176, 30,192,181,175,191,121,237, 15,253,214, 91,
+182,255,216,245,179,229,204,210, 82, 5, 20, 5,220, 53, 55, 96,230,186,235,240,232,147, 71, 79,221,245,203, 15,254,252, 7, 62,
+254,196,187, 1,156,214,223,151,231,243,205, 20,145, 29, 0, 54,234,127, 30, 34,162,175,232,160,228,171,237,122, 59,235,172,179,
+206, 58,167, 62,221, 28,128,117, 0,182, 93,189,174,252,142,255,242, 67, 55,253,139,215, 95, 61,127,245,112,185, 1,192,160,109,
+215, 98,246, 69, 55, 98, 44,140,255,237,215, 31,250,207,255,215, 31,253,195, 79, 3,248,146,158,239,115,118,236, 34,178, 29,192,
+246, 85,254,248,113, 34,122,120,149,199,125, 0,192, 46,253,207,123,137,104,239, 87,184, 83,255,138,184, 94, 13, 78,118,105,128,
+178,195,252,211,195, 0, 14, 1, 56, 64, 68,199, 47,192,231,180,143,143, 11,189, 6, 39, 62,115,223,206,115, 91,235,119, 63,248,
+ 48, 58,235,172,179, 43,214,202,231,224,148, 25,192,218,205,107,122, 95,179,121,190,220,204, 66,148, 69, 10, 4, 16, 17, 73,248,
+ 14,133,239,199,127, 45, 1,204, 85,141, 44,255,212, 31, 31,254,211, 95,252,206,235,190,243,181, 91,231, 55,140, 43, 1,142, 31,
+197,112,110, 13,122,155,183,225,223,223,181,243,173, 59,110,222,246,146,183,221,255,151,111, 63,177, 48,254,240, 5,114,236,187,
+ 1,220,119, 14,155, 49, 0, 28, 0,112,144,136,246,119,203,230, 43, 6,101,216,173, 95, 43, 57,189, 16,176,220, 47, 34,251, 53,
+112,121, 46,206,125, 7,128, 7,206,227,247, 14, 2,184,227,146,172,245,125, 59,211, 90,191,251,193, 75,182,214,101,223,206, 28,
+245,185,251,193, 14,245,233,172,179, 75,228,212, 9, 0,205, 15,138, 29, 63,247,230,235,223,249,150, 91,183,238, 92, 63,219,235,
+ 51, 57,239,176,157,243, 95, 68,160,178,200,254, 27,206,129,138, 34,253, 55,249,127, 99,144, 84, 66, 92,151, 37,156, 57, 78,221,
+ 84,224,101,194, 15,221,241,202,175,191,237,230, 45,239,253,209,119, 29,252,153,143,126,246,200,175, 3, 24,225,210, 67,241,187,
+ 1,236, 22,145,221, 0,238,188, 16,153, 91,103,151,213, 62,122,142, 63,191, 7,192, 46, 17,185,243,124,179,230, 43,200,252, 90,
+223,183,211,175,245,187, 31,188, 20,107,253, 62, 19, 68,221, 11, 96,111,183, 68, 59,235,236,210,101,234, 91,246,125,251,141,239,
+250,201,215,190,240, 13,227, 37,134, 48,161,112,228, 19,120, 33,255, 5, 7, 98,242,174, 87, 0, 56,242,185, 61, 11, 80, 0, 68,
+228,243,125, 1, 10, 34, 42, 29, 21,154, 17,123,167, 46, 0, 68,192, 68, 24, 45,141,241,170,235,183,110,121,224,157,223,253,203,
+ 63,249,238,191,120,241,239,252,249,103,127, 30,192,145, 11,148,181,135, 76, 8,103,201,214,236,127, 63, 32, 34,119,116,142,253,
+ 43,198, 30,214,236,244, 97, 34, 58,168,153,252, 70,125,214,123,204, 26,216, 14,224, 61, 34,114,251, 5,122,246,251,225,225,253,
+179,217,133, 92,103,231,190,214,247,237,188,227, 18, 57,246,206, 58,235,236,114,100,234,131,158,219,254,207, 95,182,241,213,178,
+ 88,161, 26,142, 0,102,239,164, 35,178, 30,242,121, 74,126,183,112,112,155,183,170,115,103,144, 3,192,138,226, 19, 16, 61,188,
+ 99,239,248,157, 3, 26,120,126, 62, 1,227, 81,133,245,253,190,251,127,238,254,214,159,122,245, 75,174,254,154,127,249,171, 15,
+221, 61,170,154,143, 95, 8,199, 78, 68,103,132, 54, 53, 59,191, 15, 9,166,221,161,155,125,151, 77, 92,217,182, 31,192,254,105,
+153,183, 58,237, 3, 0, 14,136,200,253,250,188,131, 99,191, 80,207,254, 64, 8, 34, 46,149,209,221, 15,158,121,173,251,236,188,
+ 91,235,157,117,118,133,154, 59,143,223, 41,198, 21, 31,253,221,191, 63,242, 17,114, 35,204,247, 27,204,207, 2,115, 51,162, 95,
+156,254, 62, 96,204,184, 49,208, 84,160,193,156,119,242,204, 0, 51, 98, 86, 14, 0, 24, 3, 60, 4,120, 25,144, 33,128,145,255,
+111, 25,235,207, 11, 68, 24, 85,195,168, 71, 13,126,234,123, 94,189,235,129,125,223,243,135, 55,108, 91,247,221,234,246,221,197,
+188, 73, 68,116, 0,190,166,105,179,149,221,221,242,185,162,237, 14, 34,186,107, 53, 80, 58, 17,221,213,202,168,239,249, 74,189,
+ 41,116,247,131,221, 90,239,172,179,175,178, 76, 29, 2, 28,189,231,143, 30,251,153, 63,254,228,179,223,253,178,171,103,175, 39,
+192,177, 8,235,182, 0, 22,239,178,151,198,236,110,123,209,218,151,255,248, 27,111,222, 62, 83,206, 56,102, 6,138,194,231,214,
+204,144,241, 2,168, 32,184,235,110,133,219,114, 51,104,221,213,160,153,117, 64, 61, 2, 47, 30,129,156,126, 10,124,228,179, 64,
+189, 12,208, 44, 4, 13, 26, 1,120, 97,140, 55,188,242, 69, 47,122,255,190,239,249,181,127,118,239,239, 23, 95,120,234,228,123,
+145,200,123, 23,203,177, 31, 18,145, 3, 38, 99,219,113, 33,142, 59,133, 17,253,240, 5, 98, 90, 91,214,243,121,181,155, 93,136,
+ 99, 92,138,235,109,157,231,170,142,119, 30, 25,242,126, 36,194,217, 70, 17,217,241,149, 90, 91,167,187, 31, 60, 36,251,118,158,
+215, 90,151,125, 59, 39,159,239, 37,128,238, 91, 68,187, 75,246,185,157,117,246,149,224,212, 27, 0,139, 0, 62,245,193, 71, 23,
+222,245,193, 71, 23,102, 49, 93,196,102,243,155, 95,181,245, 71,191,251,246, 27, 95, 48,231,250,174,102,241,208,251,112, 8, 25,
+ 45, 2,205, 34,138, 91,222,128,242,246,239, 71,113,227, 55,172, 8, 33,200,177,199, 80, 63,250, 1, 52, 95,124, 8, 84,244, 1,
+ 17, 8, 1,227,165, 49,110,185,102,243,250, 63,252,215,255,205,175,188,233,237,239, 57,246,236,201,225,159,227,194,213,216, 87,
+178, 11,194,200, 85,199,182, 71, 51,160, 29, 83,254,253, 16, 18, 52,124,124,133, 99,220,103,126,247, 0, 17,237, 55,199,221,131,
+ 22,163, 91,143,185,119, 53,236,125, 17,217,163,217,232,246,115, 61,175,139,113,189,103,184,214,123,244,184,118, 51,127, 46, 76,
+241, 51, 89,219,129,111,252, 10,223, 27, 86,189,214,213,145,175,252,124,247,237, 76,207,183,229,104,101,223,206, 7,166, 4, 14,
+123,100,223,206, 93, 43,124,220,189,122,110,187,244,107,199, 74, 65,199,153, 62,183,179,206, 58,167,158,140, 1, 12, 1,212,240,
+162, 48, 90,245,142, 61,239, 66,132,151,239,253,222, 91,126,246,237, 59,111,216,217,140,129,113,211, 64,170, 17,100,184, 4,212,
+ 35,160, 20, 12,190,245, 95,162,188,253, 45,103,207, 26, 54,221,128,222,166, 31,133,187,250, 85,168,255,238, 87, 1,215,120,151,
+ 79,132,241, 82,133, 87,189,248, 5, 87,189,235, 39,118,238,251,193,251,254,244,187, 1, 60,126,145,157,186,221,200,207,107,147,
+ 16,145, 93, 0,222,115, 22,167,176, 93,179,194, 61,103, 96, 91,135,222,106, 0, 56,168, 45, 90,247,159, 33,171,218, 14,223,154,
+181, 67,225,228,149,156,239,253, 88, 25,110, 13,231,181, 91, 68,238,184,132,215, 59,237, 90, 31,248, 42,112,172,151,211, 86,181,
+214,213,249,174,254,249,238,219,121,103,171, 23,126,215, 10, 63,191,253, 12,231,181, 7,171,107,211, 11,159,123,143,146,253,186,
+ 30,252,206, 58,167,190,210,187, 12, 63, 3,189, 10,190, 87,255, 44,174,191,106,230,219,239,127,203, 75,247,126,203, 45, 87,189,
+120,180,204,104,154, 10, 24, 45, 3,117, 5,144,128,122,192,224,187,126, 30,197, 43,191, 45, 30,236,212,242, 8,239,255,248, 99,
+120,255, 39, 30,195,177,133,101,244, 10,194,203,174,217,132,239,184,253,102,124,221, 77, 47,240, 7,190,238,213,160,254, 90, 84,
+ 31,254,119, 64,191,244,167,224, 8,245,194, 8, 63,240,166, 87,222,246, 91, 31,248,244,143,190,255,239, 30,123, 7, 46, 82,187,
+155, 58,188,221,173,140,240, 92,143,177, 91, 55,192,118, 6,120,208,108,156, 54,219,217,142,196,180,127,248, 44, 27,240,123,204,
+ 70,120,192,100,150, 59, 90,231,189, 71, 68, 14,173, 32, 20,115,223, 20,135,110,143,181,219,100, 70,239,185, 76,215,187,177,229,
+208,143,155,243,219,126, 17,223,149, 93,103,201,220,159,203,186,186,224,229,151,231,116, 78, 62,243, 62,235, 90, 87, 82,221,185,
+ 63,223,220,193, 30, 52,235,116,163, 65, 9, 86, 66, 10,142, 79, 65, 20, 14,181,206,113,187, 62,175,237,118,205,200,190,157,183,
+119,253,239,157,117, 78,253,236, 22, 32,239,245,111,126,229,166,159,218,127,231, 75,238,190,118,205,236,236,242, 98, 3,105, 70,
+ 64, 53,210, 79, 42, 64,245, 34,122,175,251,177,204,161,255,205,231,158,194,219,127,251, 67, 56,244,236,105,204, 12,122,232,149,
+ 14, 78,128, 79,124,233, 24,126,239,175, 63,141,111,191,253, 38,252, 31,187,223,128,185, 65, 15,110,219, 75, 81,190,242, 78,212,
+ 31,251,117, 96,237, 54, 0,226,139,232, 66,248,215,111,125,237,143,253,217, 71, 31,251, 61, 17,124, 18,190, 68,112,161, 29,250,
+253, 45,167,177,255, 28,143,177, 93,143, 97, 55,163,187,166,212,118,247,182,178,219,240,217,183,159,225,240,247, 24, 7,124, 87,
+219, 41,232,103,191,199,108,174,247,136, 72, 6,117, 43,228,190,167,181, 57,223,217,170,163,219,115,219,117,153,174,247, 30,115,
+188,123,149,196,216,126, 86, 23,195,118, 95, 4,199, 59, 53,195,213,114,196, 1,248,114,196, 37,117, 66,234,208,207,186,214, 85,
+169,110,242,249,222,253,224,228,243,205,179,249,236,249, 6, 54,190,194,240, 97, 77,237,167,187, 31,220,123, 22,116, 96, 47,128,
+ 3,103,202,190,101,223,206,144,209,219,207,189, 3,157,117,214, 57,245,179, 58,244, 27,223,246,205, 47,252, 55,247,189,249,134,
+255,182,228, 18, 75,163, 10,104,198, 64, 83,251, 58, 58, 1,144, 6,116,213,117, 40, 95,243,214,248,203,159,123,250, 56,222,250,
+ 43,239,199,225,229, 26,115,243,179,168,138, 2,189, 94,129,126, 65, 40,164, 15,106,106,188,247, 35,159, 71,225, 28,126,238,251,
+119,250,140,253,230,111, 66,243,153, 63, 5,154, 5,160,156, 5, 8,168,199, 21,110,187,105,235,213,175,121,217,213,223,242,145,
+ 71,158,254, 20,124,137, 96,213,217,186,136,220,115,150, 12,173,237,192,238, 58, 15,162,213,253,173,236,114,197, 94,103, 34, 58,
+168,240,118,200, 72,119,136,200,158,179,212,195, 15, 18,209,157, 43, 28,239,144,136,220,139,164,102, 22,122,176, 15, 76,113,150,
+ 97,131,158,218,135,111,206,237,163,151,241,122, 15,173,116,188,139,145,229,234,250, 56,239,128,238, 44, 8,203, 52,219,174,207,
+227, 30, 17,185,160,242,187,178,111,231,185,175,245, 73, 71, 61,253,249,174, 80,183,166,187, 31, 60, 40,251,118,230,207,119,223,
+206, 61,231,171, 88,119, 38,135,223,250,185,253, 90, 87, 15,235,126,151,236,219,185,189,203,214, 59,235,156,250,202, 14,157, 54,
+205,151,111,122,247,238,155,126,225,251, 94,117,213,173,163, 33, 48,162, 10, 96, 15,181,163,231,226, 79, 74, 53, 70,121,203, 27,
+ 65,107,174,138, 7,184,247,183, 31,194,231,190,124, 18, 88,191, 6, 39, 23,106,128, 26, 20, 4,204, 21,132,171,230, 75,108,156,
+ 45,177,126,253, 26,252,225,223,126, 14, 59, 95,113, 61,118,221,122, 35, 80,148, 40,182,191, 17,245,199,127, 3,180,229, 6, 64,
+ 24, 76,132,254,108, 31,223,183,243, 37,187, 62,242,200,211,255, 9,192, 49,156, 27, 4,191, 90, 25,205,253, 56,143,222, 98,163,
+ 45, 30, 47,253,108,206,135,136, 30, 86,105,210,123,204,134,123,166, 77,240,174,179, 28,239,160,136, 60,140, 28, 10, 13,231,215,
+150, 74,221,123,166,243, 51,231,182,231, 50, 93,239,222, 75, 5, 81,235,181,220,215,202,210, 47,132, 83, 15,186,242, 54,211,180,
+ 26,244,113,109,138,200,246,149,120, 16,231, 97,231,182,214,167, 56,116,101,154,231,207,247, 44, 68, 52,186,251,193,135,101,223,
+206,115, 89,207, 23,196, 52,160,176,235,126, 55,186,158,251,206,190,130,237,124,250,187, 3, 41,110,205, 27,110, 90,251, 47, 30,
+250, 31, 94,241,123,223,247,178, 77,183, 46, 45, 53,104,208,120,135,238, 0, 20, 4, 42, 8, 84, 18,168,112,160,146,224,174,121,
+101, 60,200, 23,158, 57,129, 63,249,248,227,192,220,172,111,115,115, 14, 40, 10, 52,112, 56, 61,106,240,133, 35, 75, 56,116,120,
+ 9,149, 16,184, 40,240,129,127,248, 98, 58,129,171,110,134, 44,159, 2, 80,235,217, 8, 80, 51, 94,122,237,166,155, 0,188, 0,
+ 23,111, 80,205,110,205, 34,207, 21,226,181, 27,224,241,115,112, 10, 7, 91,159,189,162,131, 88, 37, 76,187, 18, 65,105, 87,203,
+193,174,230,252, 14, 92,166,235, 61,116,169,244,247,181,132, 96,181,218,143,159, 45,120, 58,139, 29,135,103,111,223, 68, 68,183,
+ 19,209,157, 68,180,215,124,221, 73, 68,155,244,103,172,147,220,163,129,215,165,180,221,154, 81,111, 60,235,243, 93,125,198,189,
+218,245,124,161,237,192, 42,208,145,206, 58,251,170,204,212, 3,220,126,205,143,124,195,150,159,125,247,183, 95,255,227, 61, 46,
+176, 52,102,160, 16, 64, 24, 36, 0, 49, 65, 10, 82,232,221,255, 10,149,125,184,141, 47,138, 7,122,236,200, 41, 44, 47, 85,192,
+186, 65,138, 19, 66,110,237, 28, 32,130, 19, 11, 21,170,113,141,107,215,151, 56, 61,172,210, 73,172,221, 6,160, 0, 70, 75,160,
+217,181, 16, 8, 80,215,184,113,219,218,173,131,126,113,245,104,220,124,234, 28,175,235,222, 51,252,155, 37,221,108,132, 97,127,
+159, 67,182,184,107, 5,199,138, 85,100,215, 89,214,184, 2,129,108,181,200,193,161, 51, 92,227, 57, 29,171,125,110,151,240,122,
+ 47, 9,131, 89, 3,183,118,205,251,222,231,210,155,174,191,187, 26,177,155,189, 34,114, 16,121,137,227,190,179, 4, 82, 23,111,
+173, 79,202,196,158,223,243,245, 89,115,150,241, 95, 8, 70,186, 34, 7,103, 98,204,239,106,161, 33,157,117,214, 57,245,144,253,
+174,157, 41, 94,251,111,191,237,218,125,119,237,216,242,186,241, 24, 24,246,188,228,171, 52, 2,170, 24,253,190,195,201,166,225,
+ 89, 56,135,178,136, 29,236, 4, 0, 82,199,131,109, 93, 63,135,162,223, 67,195, 80,189,120, 81,167,174,127, 10, 1,133,195,226,
+ 82,133, 47, 14,135, 24,220,106, 78, 85, 26, 64, 42,160, 30, 2,110, 29, 72, 24,194,140, 77,243,189,185,245,115,253,141,135,199,
+203,231,132, 64,172,166,102,169,117,213,123,144,198,115, 62,128, 51,147,215,176,194, 70,178, 93, 71,150,158,143,109, 60, 67, 6,
+248, 92,236,188, 54,105,253,217, 29,151,248,122, 47,186, 83, 87,135,254, 64,235, 58,238,186,148, 19,250,180, 28,113, 47, 18, 92,
+190, 93, 68,118,183,137,129,231,124,220, 85,212,163,181,238,126,166,181,158, 63,223,212,107,126,161,214,243,106, 28,121,104,109,
+187,167,203,190, 59,235,236,220,156,122,128,178,123, 47,221, 54,243,253,191,253,125, 55,238,253,186,173,115, 91,151,199, 12, 12,
+ 74,239,208, 43, 70, 89, 49,250,179, 5,254,213, 7,158,248,196,245, 27,250, 27,126,124,199,150,235,135, 2, 80,200,214,171, 10,
+252,236,231,225,174,123, 53, 0,224,101, 47,220,140,175,127,241, 86,252,213,167,142, 0,101,233,157,184, 83,135, 30,116,225,216,
+255,238,240,216, 34, 94,124,117,122,111,229,212,147,192,232, 20,100,180, 1,164, 19, 99,132, 67, 80, 0,135,139, 0,191,107,246,
+ 4,179,201,174,134,188, 54,109,243, 58,151,249,214,151,195,142, 95,128,159,189,146,174,119, 53, 14,253,222,203, 52,114,215,170,
+216,225, 82,221, 71,186,251,193,189,154, 81,167,181,158, 19,219, 46,235,243,213,204,188,211, 41,232,172,179,243,112,234, 1,110,
+223,122,231,215,110,122,251, 47,125,235,181,255,243,213, 51,189,254, 18, 19,104,206,167,224, 50,102,204,176, 96,216, 7,254,167,
+247,125,241,125,251, 31, 58,252, 7,191,118,231, 13,119,147, 40,242, 94, 40,251,189,116,144,103, 62, 25, 15,236, 28,225,167,191,
+235,118,124,235, 35,255, 31, 48,172,128, 65, 95,167,187,169, 83,103, 0,194,192,194, 18,110,123,249, 11,241,131,223,248,138,248,
+187,124,248, 83, 16,169, 64,205,216,255,160, 8, 28, 9,142, 45, 12,151, 79, 45,141, 79, 95,196,236,105,175,170,155, 5,219,141,
+115, 39,251,156,169, 7,247, 66, 58,220,231,139, 93,105,215,219,118,232,251, 47, 36,251,252, 28,215,219,241, 22,185, 49,180,114,
+ 93, 42,199,190,154,181,126, 73,159,175,102,232,109,157,130,253,138,224, 28,154, 6,231, 43,242,112, 31, 58,235,236,171,220,169,
+ 19, 0, 42, 11,186,229, 29,255,236,154, 95,122,251, 63,185,250, 91,234, 26, 88, 42, 29,104,224, 32, 44,144,229, 6,243, 37,225,
+177, 81, 61,252,225,223,250,194,175, 62,248,217, 83,191, 13,128, 31, 63, 89, 61, 3,146,151, 74,204,212, 1,204,204,161,121,236,
+195, 40,143, 63, 6,218,120, 3, 0,224,205,183,221,128,253, 63,241, 77,120,219,175,125, 8, 75, 39, 70,192,204, 0, 40,124, 61,
+ 29,227, 10, 88, 90,198,215,189,116, 27,126,239,237,223,134,249,153,158, 63,171,106, 25,205, 35,239, 5,245, 7, 0, 53,128, 48,
+132, 27,192, 57, 60,250,244,137, 35,195,113,115, 4, 23,143, 40, 7,248,154,243, 46,179,201,158,115,246,117,185,156,196,101,178,
+ 43,230,122,117, 26, 91,219,161,223,117,153, 79,235,114, 6,114,171, 89,235,251, 87,219, 98,118,129,108, 79,203,161,119, 74,113,
+157,117,102,204,157,197,169,111,189,239, 91, 95,248, 43,119,191,238,234,111, 25,214, 64, 53, 87,130,102, 11, 8, 3, 88,106, 48,
+ 63, 83,224, 47,158, 92,124,102,231,187, 63,253, 51, 15,126,246,212,127, 0,240, 24,128, 39, 62,243,236,240, 51,112, 4, 52, 74,
+122, 42,156,135,216,235, 5, 84, 31,126, 87,246, 33, 63,254,166, 87,224,175,127,254,123,241,182,127,254, 53,184,113,211, 0, 51,
+ 82, 97,141,107,240,218, 23, 95,133, 95,254,201,111,198, 95,190, 99, 55,110,220,182, 62,254,124,253,119,191, 10, 57,241, 24,208,
+ 27, 64,148,132,135,186, 1, 28,225, 51, 95, 62,254, 69,248, 57,235,252, 60,187,207,103,147,197,188, 82,207,111,215, 21,122,189,
+ 43, 57,244, 61,207, 51,135,254,124,181,203,249,124, 45,107,126,239, 42, 29,250,246,238,145,117,214,101,234, 0,174,219,216,223,
+249,195, 95,179,233, 77,227, 33, 3,107,122,160, 62, 65,198,130, 98, 88, 99, 48, 95,224, 55, 63,113,244,211,255,227,239, 61,246,
+111, 79, 45, 55, 31, 2,112, 20,126,208,203,204, 95, 62,122,250,111,159, 58, 93,253,200, 85,115,189,178, 17, 73, 77,112,179,115,
+224,199,255, 18,245, 67,191,136,242,117,111,139,159,243,170,235,175,194,187,126,228,141,248,249, 31,172,241,244,177, 69,244,123,
+ 37,174,217, 52, 63,113, 62,205, 35,127,132,250,239,127, 19,152,153,243, 81,135, 43, 32, 13,131, 26, 70, 53, 28,225,189, 31,122,
+244, 33,120, 61,250,139,233,212,207,103,131,200, 32, 84, 17,217,120,185,165, 64, 91,118,200,156,223,170,216,193,218,191,125,165,
+ 94,239,149,228,208,207,151,196,120, 49,215,122,254,124,247,237,220,120, 9, 7,166,236, 56,143,251,113, 69, 4,150,157,117,118,
+177, 51,245,242,134, 77,131, 23,111, 28, 20,168,217,179,219,101,169, 65,127,220,128, 6,132,183,191,255, 75, 7,223,250,155,143,
+254,175,167,150,155, 15, 0,120, 6,192, 73, 0, 99, 0,213,147, 39,198,127,251,222, 79, 29,255,120,175, 4,100,216, 0, 16,144,
+131,239, 87,159, 91,139,230,239,255, 51,170,131, 63, 13, 89,122, 54,251,192,153, 94,137, 27,182,173,159,116,232,213, 50,154,143,
+188, 27,245,135,222, 1, 26,244, 65, 69,225,235,245,189, 1, 80,213,232, 57,224,111, 62,243,212,211,127,245,200, 51, 7,225,181,
+223, 47,138, 83,111,141,248, 60,151, 77,165,221, 38,182,231,121,182, 14,236,249,109, 84,217,214,231,178, 81, 62,223,175,247,138,
+112,232, 42,221,219, 14,190, 46,205,103,123, 25,216,149,214,250,149,243,124,189,164,108,151,169,119,214, 57,117, 0,197, 35,207,
+ 44,127,246,203,227,166,158,155, 43, 48, 87, 53,152, 43,128,133,130,229, 7,222,115,232,119,126,225,129,167,126, 22,192, 39, 0,
+ 60,171, 25,186,247,222,126,200,203, 51,191,244,193,103, 14,156,172, 26,148, 85, 3, 84,236, 89,115, 42, 74,131,249,181,224, 71,
+255, 4,227,247,190, 21,205, 63,190, 23,114,234,137,233, 47,228,226, 17,240,163, 7, 49,254,131, 31, 65,253,177,255, 8,204,204,
+ 0, 69,233,197,102,136, 64,174, 7, 26, 86, 64, 33,248,185,223,253,216, 31, 0,248,188,126,254, 5,119,234,166,111,217,218,170,
+218,139,180, 13,201,110,200,247,156, 37,211,189,212,118, 0,121,237,246,158, 85,220,139,123,174,224,235, 93,201,161, 63,140, 51,
+247,113,159, 53,232, 19,145,123,204,215,174,214, 61, 59,215,245,102,201, 93,199,113, 97,250,212, 87,227, 8,207,184,214,233,238,
+ 7, 39,159,175,103,164, 63, 87,180, 8,171, 64,139,142,175, 54, 3,215,235,232, 8,114,157,125, 85,217, 25,225,247,163, 11,245,
+223,125,223,239,124, 97,239,219,222,184,109,247,230,185,114,253,167,158, 29,126,249,255,254,240,225,247,253,227,147, 75,255, 47,
+128,167, 0,156,208,236,220, 58,209, 6,192,242,231,143, 12,255,228, 29,127,254,244,174,125,223,118,221, 29,245, 66, 13,148, 14,
+ 52, 40, 18,133,109,110, 29, 80,159, 68,245,225,119,130,250,107, 64,155, 95, 10,183,233, 38,160,156, 1,184, 2,159,120, 28,114,
+228, 31,129,225, 9,160,215, 3,230,215,155,183, 21, 0, 59,200,136,208, 95,227,240, 27, 7, 63,243,200,159,253,215, 39,126, 7,
+ 30,122,175, 46, 66,118,190, 11,147,243,197, 3,235,118,181,118, 23,114,237,245, 7,116,204,232,193, 85,124,254,110,117,150, 23,
+133,144,164, 44,235,189,102, 3,220, 37, 34,247, 79,203, 88, 77,203,215,198, 43,245,122,207,224,208,239,120,142,101,130,237, 45,
+ 39,114,175,201,106,119,168,214,193,254,179,245,154,155, 49,186,246, 30, 95,116,105, 92,205,206, 87,187,214, 39,159,175, 31,171,
+122,112, 21,159,177, 91,131,131,189, 43, 56,245,221,103, 16,166, 57, 96,158,219, 30,217,183,243,192, 10,140,247,105,173,137,157,
+117,246, 85,237,212, 43, 0,199,254,250,208,233,255,244,215,135, 78, 63, 0, 96, 45,124,221,252,105,120,168,125, 65,127,166, 45,
+ 43, 22,230,173, 63,253,239, 62,240,212,187,110,187,110,238,198,183,220,186,249,230,229, 83, 99,208,186, 62, 48,112, 94,105, 14,
+ 2,244,122,160, 94,207, 51,216,143,126, 2,245,225,135,227,225,200,149, 64,217, 7,230,215,180,222, 86, 0,227, 6,194,179,152,
+ 25,244,241,240,231,158, 57,254,191,252,199,143,236,211, 44,125, 25,231, 49,161, 77,206, 32,141,118, 38,167,117, 46,155,172,170,
+165,221,133, 52,217, 42, 56,186,131,186,241, 63,220,114, 14, 97,131,221, 97, 28,196,197,180,253,200,199,100,238,209, 76,115,191,
+ 57,183, 93, 72,236,227, 67,186,217,239,184,210,174, 87,175,107, 26,100,252,158,115, 88, 10, 7,206,163,119,125,151, 6, 76, 97,
+ 84,232, 52,237,247,246,168, 92,192,203, 0, 95,144, 0, 71,246,237, 60,191,181,222,170,153,171, 58,220,228,243,221,183,243,124,
+159,111,208,133, 15,129,204, 71,117, 24, 75,187,228,144,149,138,244,231,246, 35,141,123, 13,130, 57,150, 37,127, 0,151, 86,150,
+182,179,206,158,151, 78,189, 81,199, 93,171, 19,119,250,189,145,126, 53, 88,121,104, 74, 13, 96,129, 69,254,225,191,255,221, 47,
+252,220,230,249,242, 29,255,244,230,245, 47, 28,158, 28, 3,107,123,160,153, 34,245,175,123, 15, 14,244,103,206,220,135, 38, 0,
+ 88,128, 81, 3, 62, 53,198,236, 11,182,225, 83, 79, 29, 95,184,115,239, 7,247,158, 92,172, 62,100,130,140,139,109, 15,171, 67,
+ 63,103,210, 18, 17,237, 55, 2, 54, 27,237, 70,127,185, 23,130,102,235,119,106,118,179,125,133,204,211,102,110,119,226, 44,208,
+230,243,249,122,167,216,185,102,116, 7,159,195,103,109,199,234,235,208,251, 47, 65, 64,119,230,181,190, 2,195, 92,167,160, 93,
+144,231, 75,119, 63,120, 92,246,237,188, 23,249, 56,215,105,194, 54,123, 21, 37,176, 63,183,231, 12,247,243, 46, 61,183,206,169,
+119,246, 85, 97,238, 44,110,180,134,175,151, 31,135,159,124,118, 2,192,146,126, 95,206,242,187, 35, 0, 39, 79, 45, 55, 15,126,
+215,254,207,254,239,191,249,177,163,159,158,233, 59,244, 78, 85,224,147, 21, 48,228,120, 20, 2,129,104,202,151,254, 15, 13,128,
+ 49, 67, 78,213,160,227, 35,204,110,220,128, 7, 15,157,124,250, 91,126,230,224,207, 28,122,102,225,247,245,220,150,112,241, 88,
+239, 7,117,115,189, 83, 7,113, 60, 23,253,239,253,240,146,155,251,177,186, 30,228, 3,186, 49, 93,252,137, 86,126, 40,204,237,
+103,249,172,131,240, 99, 79, 31,190,210,175,247, 50, 56,200,123,177,122,114,229, 1,248,114,192, 93,151,184,115, 32,173,245,187,
+ 31,188,253,108, 45, 99,170, 50,119, 65,158,175, 30,235,166, 22, 58,180,210,103,222,137, 51, 19, 7,253, 58, 61,207,241,174,157,
+117,118,165, 26, 93,228,227, 23, 0,230, 52, 82,126,197, 15,191,118,235,143,253,155, 55,191,240, 59, 94,184,190, 95,214, 35, 65,
+ 93, 18, 48, 83,128, 74,231, 51,119,103, 78, 71, 4,104, 0,169, 25, 24, 54, 40, 42, 70,175, 71, 56,213, 0,239,252,208,177,191,
+248, 63,223,247,232,253, 85,195,127,135,212, 74, 87, 95,137, 15, 64,161,224,118,150,120, 8,126,186,217,193,203,120, 94, 1, 46,
+181, 66, 31, 7, 87, 57, 13,238,138,187,222,203,244,220,183, 99,146,155,240, 48, 60,220,126,252,138,188, 46,207, 54,159,254,124,
+207, 82,111,191, 64,159,119, 8,192,195,221,204,244,206, 58,167,126,113, 29,251, 12,128,245, 0,174,126,209,166,193, 55,239,121,
+195,214,239,252,161, 29, 87,189,230,218,181,189, 30,132, 32, 34, 96, 34,176, 57, 27, 39,128, 19,241,173,107, 4, 28, 29, 54,252,
+ 95, 62,113,236, 31,238,127,232,240,251,254,254, 75,139,127, 12,224,203,138, 28, 44, 95,169, 14,189,179,206, 58,235,172,179,206,
+174, 52,167, 30, 62,167, 15, 96, 30,192, 58, 0, 87,111, 90, 83,126,237,107,110, 88,243,154,239,189,117,211,171,111,125,225,220,
+ 11, 54, 14,138,249,249,146,250,165, 35, 87, 51,100,169,225,241,201, 49, 47,125,238,240,242,145, 3, 31, 63,246, 95,255,234,208,
+194,223, 62,121, 98,252, 48,128, 39, 0,156,130,175,161, 95,180,158,244,206, 58,235,172,179,206, 58,235,156,250,153, 63,203, 1,
+ 24,192, 67,242,115,240,140,250, 77, 0,182,205, 13,220,230,153,210,173,235, 21,212,175, 89,234, 97, 45,167,151, 70,205, 81, 17,
+ 28,134,135,216, 79,193,215,205, 23,113,118,162, 94,103,157,117,214, 89,103,157,117, 78,253, 18, 58,247,158,102,239,225,171, 68,
+156,190, 14,104, 6, 94,233,215, 88, 29,121,221, 57,243,206, 58,235,172,179,206, 58,123,254, 56,245,246,231, 7, 39, 31,254,180,
+ 78, 93,204,159,157, 35,239,172,179,206, 58,235,172,179,231,177, 83, 63,211,249,116, 78,188,179,206, 58,235,172,179,206, 58,235,
+172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,
+206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,
+235,236,249,103,244, 11,255,254,254, 41,253,224,228, 27,198, 5,128, 19,136, 56, 16, 1, 2,153,104, 36, 23,209,225,106, 2,128,
+226, 31,254, 79,246,202, 49,100,254,125,194,244, 51,130,238, 76,251, 71, 68, 4, 68, 4, 8, 65,136, 0, 97, 64, 4, 76,254,248,
+241, 68, 5, 16, 61,239, 48, 4, 6, 2,255,187,228, 79, 84,116,164,171,136,254, 12,128,147,199, 79,225,243,159,252, 36,164, 26,
+ 97, 60, 30, 97, 60, 30,163,116, 4,112,131, 97,221, 96, 80, 20, 32, 2,170,170,194, 53, 55,223,142, 47,127,225, 31,112,242,228,
+ 81, 44, 46, 47, 98,121,220, 0, 4,148,228,208,239,247,225, 92,137,235,111,188, 17,183,237,248,122,252,205,135, 14,226, 59,238,
+124, 43,126,235,254, 95, 2, 0, 12,199, 21,102, 7,125,140,235, 6, 11,163, 17, 54,174, 89,131, 99, 11,139,232,247,251,168, 26,
+198, 85,235,214, 98,177,170,176,102,102, 22, 71,151, 71,184,106,237, 58, 52,189, 62,182, 93,115, 3,238,120,227, 14,212,117,141,
+162, 40, 32, 16, 52, 13,235,120, 90,125, 46, 2,228,119, 94,255,206,128,232,115, 11,247, 54,253,108,254, 16, 68, 0, 97,255,253,
+162, 40,210, 13,202,127, 49,222,235,186,105, 80,150,101,122,102,162,127,115,254,153, 53,117,131,162,112,128,142,208,133, 0,226,
+116,101,137,254, 28, 51, 8, 2, 17,242,107,139,210, 51,231,134, 81,184, 2,172,139,136, 38,206,133, 32, 4, 52,117,141,178, 40,
+ 1, 71,186, 86,194,234, 37, 16, 73,190, 24,178,251, 3, 64, 8,228,156, 89,107,128, 35, 2,131,179, 75,110,154, 26, 16,160,236,
+149,241, 40, 77,195, 96,105, 80,186, 82, 23, 26,226, 49,195,177, 8,233, 35,133, 4,117,221,160,212,123, 75,250, 84,184, 97,127,
+ 92,241, 63,200,204, 40,138, 2,228, 0, 18,154,120, 33,152,211,125, 32, 2,200,172,107,210,197, 16,214, 74, 81,148, 0, 73, 28,
+ 99, 44,228, 47,200,193,233,187,161,191,235,244,126,137,128, 28, 65, 24,104,152, 81, 56,231,255, 27, 2, 71, 78,239,143,121,209,
+ 29, 0,214,123, 76,173,157, 65,160,191, 75, 19,239,181,152, 71, 9,248,119, 52,220, 87,146,180, 90, 9,126,208, 19,216,175,119,
+127,233, 28,215,147,115,206, 15,103,118,225,227,195,117,232,211, 38,232,181,167,115,142,251, 81, 60, 15,137,207, 11, 96,127,190,
+122,223, 29,153, 61,197,158,187, 72,220, 79,152, 25, 18,206,153, 68, 63,155,210,235, 18, 94, 11,241,255, 46,254,170, 16,207,138,
+243,123, 1, 2, 26,110,224, 92,161,207,197,236,140, 4,115,103, 4, 68, 46,109,161, 83,246, 85,161,120,194, 16, 61, 33,134,232,
+190, 25,254, 91,255,170,215, 42, 77, 3, 16,161, 32,151,164,193,244,254,137,238,167, 68, 64, 93, 55, 40,156,131,211,159,147,169,
+123,183, 95, 99, 0,193,133,125, 56,172,124,241,251, 12, 17,129,196,175, 77, 2,161,214,119,173, 40, 10,148,101, 9,231, 72,215,
+114, 1,231,156,126,207,193, 81, 1, 1, 67,216,191, 51,117,211,160,105,154,248, 60, 24,156, 28, 20, 72,159,145,223, 16, 5,140,
+170,170, 65, 68,254, 93, 41, 11,239, 83, 26, 70, 35, 2,102,127,156,134, 25, 77,237,143,219,176,255, 83,194,179, 55, 15,152,245,
+122,184,105, 80,148,165,127,191,117, 63,101, 22,136,232,121, 10, 64,196, 96, 33,248,213, 76,113,221,133,187, 39, 8,163,200,245,
+247,133,211,125,247, 59,132,174, 79,255,190,138,243, 43,196,238,112, 37,166,250, 89, 73, 47, 30, 3,112,254, 64,102,141,100,110,
+129, 37,238,231,126,169, 10,169,227,165,236, 84, 97, 54,164,108, 5,176, 46,116,231,166,123,127, 65,107,211,208, 69,236,140,175,
+ 33,179,176,201, 94, 9, 38,182, 21, 50,171,238,169, 39, 14,163,239, 8,203, 0, 6,101, 1, 97, 7, 97,160,152, 93,143,254,240,
+ 52, 32,140,153,126, 15,253,153,121,112,189,140, 53,235, 54,161, 39, 35,188,242,214,215,227,200,211,143, 97,225,228, 17, 44, 13,
+135, 56,185,184, 4,160,194,145,103,158,196, 23, 31,255, 2, 78, 29, 59,134,247,189,231, 55, 1, 17,244,251,126,227,175,234, 26,
+131, 94, 15,189,178,192, 51, 39, 78, 98,203,186,181, 24, 51,163,160, 18,133, 35, 12,202,158,127, 1, 0, 44,142,199,152,235,207,
+160,223,235,129, 69,204,213,200, 10,247,136,208,246, 1,105,211, 74, 47,101, 88, 32,103,215,246,145,184,241,132,141,151,153,163,
+143, 36,202,125, 44,181,159, 41, 77, 62,179,176,120,252,239,232, 65, 36,223, 56,226,117, 18, 32, 78,224,196, 65,156,100,139, 78,
+200,165,243,167,116,156,228,208,225,157,188, 58,118, 97, 19,228,153,205, 81,244,228,201,120,223, 44, 62,162,214,245,101,151, 40,
+186, 25,217, 32,152,144, 60,138,185,104, 71,198,147,133,247,200,249, 0, 85, 15,236,156,196,207,201, 30,143,228, 49, 9,145,185,
+110,245, 60,206,158,183,121, 94, 33,168, 9,215,236,224,252,102, 68, 26, 96, 73,242,110,132, 16, 60,135,235, 22,115,205,148,159,
+ 79,188, 93,102, 92,178, 58,173,176,225,132, 95, 38,164,141,213,250, 38,202,246, 26, 74, 14,157,252,250, 23,117,244, 78,210,223,
+ 73,247, 1,127, 89,193,233,132, 99,187, 21,182, 11,153,120,158,200,110, 47,153, 77,117,122, 98, 65,246,121,170, 3, 23, 50, 65,
+ 27,252, 51,208, 80, 16, 52,241, 30, 74,246, 46,248,251,238, 55,118, 10,123,152, 6,100, 89,192,163, 9,141,216,223, 35,228,107,
+ 52,188, 79,230,221, 33, 32, 91,176, 18, 28,188,122,112, 33,154,140,172, 68,131, 40, 17,239,128, 77,224, 27,110, 92, 8,146, 98,
+240, 76,103,214, 46,163,236,157, 78,187,137,176,248,128,140,210,251, 65,240,251, 11,224,131, 65, 87, 56,179,206, 39,118,110, 13,
+160, 82,160,170, 33, 73, 10, 96,194, 5,147, 79, 30, 76, 90, 3,110, 88, 31, 37,195, 57, 31,224,178, 8, 24,234,128,197,223, 7,
+ 97, 6,139,126,177, 63,174, 79,124,196, 4,114,234,235, 88,131,103,129,254,155, 38, 74,254,168,209,163,138, 0, 16,239,216,195,
+222,108,111, 55,169,211,101,166, 24, 56,144,190,247, 44,230, 93,204, 18, 91,134,168, 99, 7, 1,101,246,194,197, 13, 65,204, 99,
+161, 44,178, 75,145,171, 76, 70,134,225,223, 37,253,153,254, 77, 98,140,153,189,117,186, 17,248,147,229, 20,217,211,180, 69,162,
+143,142,252,141,137, 17, 13, 76,118,180,130,191, 18,187, 8, 41,237,147,117, 53,198,184,170, 80, 64,176, 60, 30, 99, 92, 53, 40,
+ 9,232,213,139, 24,143,199, 88, 51,211, 71,191, 44,113,114,113, 1,167,191,124, 8, 60, 94,192,236, 96,128,197, 83,207, 98,184,
+120,194,143,159,235,149,216,186,113, 19, 70,163, 33, 78,159, 60,133,191,254,208, 95, 96,110,118, 22,195,103,158, 66,233, 10, 12,
+ 23,198, 0, 17,122,101, 9, 22,198,210,168,194,160, 44,176,118,110, 22, 79, 30, 63,133,185,193, 0,163,170, 65, 45,130,138,147,
+235,118,174,192,186,181,115,153,123,166, 41,219, 82,184,104, 27, 64,197,101, 20, 82, 70,177,206, 73, 90,142, 54,223, 98,211,254,
+156,175,141,144, 69,218,167,145,118, 74,154,120, 86, 89, 48, 69,249,179, 72,171, 56, 4,129,186, 97,137, 68,132, 37,126,188,232,
+ 86,165,209,124,216,220, 69, 55, 32, 74, 41, 31, 68, 52,115,179,225,156, 58,123,161,224, 64, 18, 90, 67, 54,205,160,228,116, 17,
+ 55, 8,127, 78, 69, 81,168, 67, 36,115, 47, 83, 22, 39, 38, 82, 16,139, 12,133,127, 11,136, 83,116,118,186,129, 58, 93,195, 18,
+ 28,130, 94, 79,184,126,189,110,187,177,198, 13, 74,130,238, 2,159,201, 0, 0, 32, 0, 73, 68, 65, 84, 35,116,209,183,134,205,
+197,103,177,206,103, 64,138,132,216, 64, 43,249, 95, 74,247, 46,124,148, 57, 87,210,119, 55,162, 44,118,149, 81, 30,119,132,189,
+195,111, 48,233, 57, 66,131,245,248,110, 91, 24, 67, 12, 42,168, 14, 61,100, 33,241, 90,201, 32,112, 41, 58, 11,121,121,204,196,
+ 98, 86,110,145, 3,105, 35,144, 33,203, 54,193, 88, 88, 45, 45,112,202,162, 25, 9,122, 73,193,161,207, 46, 91, 1,163, 6,172,
+100,130,128, 44, 7, 51, 31,228, 17,170,228,120, 65,228,209,171,128,186,132,165, 25, 31, 76,218, 87, 77,138, 21, 3, 42,187,231,
+ 74,132,154,194,251, 28,130, 14,196, 48, 38,247, 36,126,237, 4,167, 42, 98,144,162,112,175,188,199, 2,179,119,134,228, 40,189,
+155, 19, 1,159,143,145, 18,218,228,175,159,217,175,121, 71, 41,243, 15,153,175, 40, 2, 89, 56,151, 16, 86,164, 53,106,159, 79,
+112,120,193,129,134,228, 82,162, 31, 10,240, 3,167, 37, 32,226,179,111,230,152,160, 56,231,188, 3,111,127,177,164,239,115,114,
+246, 49, 40, 54, 1, 30,216,255, 12, 21,206,223, 87,201,157,162,255,189,112,206,122, 60, 18, 19, 39,230,153,191,253, 29,210,247,
+142, 69,162, 31,149,108,207, 9,235,202, 39, 8, 2,160,148, 24, 33,183, 50, 14, 19, 9,138,121,242, 36, 98,147,174,184,225,144,
+249,102,150,205,199,183, 3, 16, 19,141,147,125, 73, 72,146,239,177, 16,159,121,225, 66,178, 67, 49, 25,114,105,155,144,201,128,
+ 78, 32,112,146, 67, 86,109,215, 83, 20, 5,184,105, 48,174,198,232, 81, 8, 26, 9,174, 32, 84,117,131, 70, 4, 85,211, 96, 88,
+ 85, 88,191,245,122,148,253, 25, 28,254,210,167, 49,211, 43,177,102,253, 22,156, 58,250, 4,106,241, 11,100,195,250,181,104,154,
+ 10, 87,109, 88,135,225,120,140,211, 75, 75, 96, 1, 28,249, 81,239,133,115, 24, 85, 21,230, 6, 3, 20, 68,232,151, 37,142,157,
+ 94, 64, 89, 56,244,123, 5,198, 77, 3, 1, 97,105, 60, 70,175,215,247,215, 92, 20,216,188,113, 93, 68, 35,200,166,196, 2,144,
+227,184, 81,176, 36,167, 39,146, 94, 66,145,228,132,130,147, 74,112,113, 56,142,152, 23, 61, 5, 91, 33,211,245, 25,140, 36,168,
+212,194, 35,113,191, 49, 25,145, 61, 79,146,137,224, 65,212,153,165, 61, 69,226,231,161,245, 60, 69,131, 78,103,119,139, 86, 73,
+ 37,157,167,191, 22,136, 3,133,204, 23, 33, 88, 48,193,168,102,177,126, 13,165,108,158, 76,176,103, 95,200,152,249,218,108, 40,
+ 56, 68,114,233,126,132,204,137,210,117,133,181,203, 48, 65, 64,112, 58, 44, 30,157,210, 99,123, 39,239, 64,122,204, 0,171,155,
+ 16, 62,194,228,118,151,139, 73,179, 58, 55,167,155,162,144, 34, 29, 36, 38, 72,202,157, 98, 58, 52,133, 16, 94,175,143, 98,137,
+ 35,123,198,230,126,147,125,255, 3,180, 76,249, 51, 20,139,172,165,216,203,196, 81,169,148, 66, 72,193, 26,217, 76, 95,207, 71,
+204,117,251,159,117,241,173,246,159, 31,160, 72, 73,232, 0,181, 49, 72,239,112, 93,200, 96, 37, 21, 8,194,166, 11, 69, 10, 72,
+236, 70,151,103,160,193,217, 50, 9,192,121, 52, 64, 89,150,219, 10,164, 92, 2,207,200, 64,233,193,233, 48, 75, 44,179, 69,152,
+213, 58, 74,139, 18,200, 36, 10, 22,127, 77,225,169, 24,160, 75, 10,138,108, 54,111,177, 76,214,204, 53, 36,101, 9,151, 79,193,
+ 48,139,119,188,142,156, 6,139,122, 92, 70,150, 82,248,243,117,166,172,224, 51,113, 31,132, 23,201,225, 3, 49, 43, 22, 2, 74,
+231,124,233, 97, 21, 72,128, 5, 46, 83, 89, 81,252,181,139, 41, 45,232,147, 15, 48,189, 52,141, 71, 3,156, 3,139, 15,102,188,
+227,214,210, 95,128,189, 21,218,103,227,208, 67, 6, 30,159, 5, 43, 60,238, 92, 12,158, 41,236, 91, 54, 99, 87, 24, 61,193,247,
+105,159,161,214, 50,147,184,111,164,160, 58,250, 83,227,127,205,227, 73,136,144, 0,101, 40, 61,164,104,175, 85,103,178, 17,175,
+197, 33,163, 99,144, 22,208, 45,147,105,153,121, 56, 28, 55,104,139, 12,231,248, 88,138,116,125,168,226, 98,106,148,240,118,239,
+220,237, 77, 52, 79, 16, 4, 18, 55, 1, 7,199,210, 64,200,132, 28,161,169, 70,126,195,224,198,215,137, 11,231, 55,205,114, 22,
+197,184,246,245,225,166,198,210,201,103, 1, 87, 96,221,134,109,168, 22,142,224,248,225,199,209, 52, 90,251, 66,131, 13, 91, 94,
+132, 83, 39,143,163, 95,150, 56,181,176,136,173, 27,214, 99, 97, 56, 66, 85,215, 24, 85, 53, 22,150,135, 40,156,127, 9,230, 7,
+ 51,152,155,157,193,210,104,140,126, 81,120,135,202, 90,207,132,143, 30,157, 43,208,239,207, 96,203, 85, 27,178,136, 92,108,116,
+199, 90, 83, 35, 91, 51, 23,221,168, 40,131,128, 99,230, 26, 2, 40, 78,165, 81,230, 54,222, 27, 16, 19, 74,217,138, 36,120,150,
+140,179,177,209,118,136, 20,197,236, 54, 18,179, 26, 11,191,147, 47,217,180,130, 3,187,168, 73, 11,165,126,195,144,220,177,233,
+ 70,199, 32,205,116, 53,184,136,155,123,168,227, 33, 58,153,176,209,248,123, 22,119, 62, 5,173, 40,135,224, 37,193,215,220, 4,
+ 52, 32,161, 66,194,201,169, 59,146, 86,146,146, 54, 58,177, 85, 8,130, 57,142,158,175,110, 44, 46,148, 11, 26, 68, 39,239,178,
+ 87,199, 77, 64,235, 9,180, 54, 79, 56,220, 38,123, 12, 39,254, 93,208,235,119,234,248,132,140, 99, 23,103, 56, 17,254, 60,156,
+ 75,200, 65, 59,141, 37,180, 29,122,242, 52,206,192,146,146, 83, 94,210, 86, 66,148,161,126, 54, 48,161,248, 28, 9,182,186, 14,
+179,230, 40,192,210, 38, 64, 9, 25, 63,153, 77, 46,162, 30, 34, 38,150,145, 88, 63,246,207,223,105,157, 18, 89,160, 32, 6, 1,
+203, 61,151, 89,203,122, 63,217,137,217, 14, 41, 15,120,219,232, 83, 12, 26, 96,156,131, 63, 79,230, 20,144,101, 91, 36, 89,104,
+ 68,223, 31, 19, 20, 73,142, 45,233,251,165,225, 2,153, 96,198,122, 35, 83, 82,241,107,135, 65,226,159,123, 22,208,144, 45,179,
+250,111, 20,206,212,219,217, 32,174, 33,208,139, 8, 89, 8,162,204, 59,163,176, 59, 73,130,148,153, 27,127,220,194,121, 56, 92,
+ 75, 91,177, 36, 52, 45,118,161,148,185,250,140,218, 58, 94, 24,248, 91,209, 5, 97, 52, 85, 3,230, 70,223, 15,159,161,135,154,
+119,128,216,131, 67, 79,127,230, 95,214, 7, 38,135, 30, 74, 23,138,192,217,108,155, 89, 3, 6,127,236, 88,190,177,153,121,112,
+ 96,198,129,147,115,177, 86, 31,185, 26,250,239, 36, 45, 4, 43,172, 7, 93, 99,101,132, 4, 98, 6,220,130, 75,197, 68,239, 90,
+ 15,136, 16, 56, 44, 12, 68,104, 35, 15, 80,136,129,180,198, 17,106,185, 54,147,132, 93,176, 50, 89, 19,166,108, 25,122,199,199,
+122,215, 36, 56,118, 39,126,179, 18,179,177,145,137,132,244,173, 16, 3,213, 18,128,133,211, 75, 0,215,112, 32, 84,236, 73, 18,
+125, 0,101, 89, 98,204,140,170, 26, 99, 80,206,160,106, 24,163,165,163,152, 91,179, 1,167, 23,142,162, 97, 65,179,124, 24, 47,
+121,197, 63,193, 35,127,255, 16,170,166,193,209,103, 30, 7, 57, 66, 85,141, 49, 63, 55,131,245,235, 55, 99,113,248, 36,214,206,
+206, 98,166,223,192,185, 33, 78, 44, 46, 97, 92,251,104,120,220, 52, 0, 57,172,159,157,197,233,225, 24,253, 94, 15,181,214, 15,
+ 89, 4,189,162, 64,217, 31, 96,110,118,128,170,170,167, 16,123, 36, 67,182,125, 36,154, 46, 94, 20,230,201,235,136,186, 96, 36,
+109,152,162, 89,114,138,200, 53,214,102,130, 35,246,153,168, 6, 29, 22,234,202,156, 9,179,129, 32, 37,174,153,137,218,140, 5,
+ 2, 40, 71,117,242, 90,112,202,140,201, 56,129,172,164,230, 8, 78, 56, 57, 91, 67,246,113,209, 7, 58, 83, 38,114, 62, 12, 8,
+228, 39, 55, 89,175,158,228, 5,234,186,119,166, 10, 44,134, 84,231,200, 67,205,148,103,249, 36, 57,106, 30,126,209, 57, 31, 72,
+134, 32,200, 19,126,210, 3,114,164, 65, 74,150,195,145,169,112, 36,120, 53,119,135, 97,131, 20, 13, 20,148,152,100,160, 91,167,
+142, 92,148, 92,231, 8,137,124, 74,240,129,179,115,250, 60,194,231,135, 19,243, 55, 52, 98, 99,134,148, 24,207,198, 32, 39,193,
+249, 56,161, 84, 12,114, 46,110,136, 46, 43,139, 37,104,155,148, 36, 99,239, 15,166,160,232, 20,235,234, 6, 38, 54, 11,204, 57,
+ 83,131, 15, 59, 7,181,216,104,162,231,167, 72, 20,153,210, 67,172,149,154,117,235, 47,207,133, 45,219,144,156,108, 38, 29,214,
+ 21, 39,162,154,201,212, 99, 1, 82,159, 65,128,175,195,134, 13, 81,228, 70, 4,226, 40, 86,249, 99, 62, 99,136,202,212,218, 27,
+ 39, 74,149,225,182,154,172, 91, 16,156,176,180,238,167,175, 51, 59,253, 76,145,188, 42, 71, 72,245,246, 68,126,157,246, 30,155,
+192,138, 0, 18,231,131, 23,102,125, 46, 69, 66, 92, 53, 86,143,129,130, 58,116, 9, 65, 43,145, 6, 0, 57,218, 17, 75, 39,193,
+ 9,102,208,184,255,118, 72, 24, 34, 68,207,140,186,110, 80, 55,117,250,156,152, 57, 7, 7,158,190, 68,131,132, 72,130, 52, 95,
+ 30,182,119, 38,248, 55,207, 62,242,201, 82, 86, 30,206, 41,108,215,161,118, 79, 34,134, 76, 25, 40,112, 98,170,169,146, 80,134,
+112, 28,189,105, 98, 17, 17, 33,127, 60, 74, 40,104, 41, 1,119, 12, 25, 59, 88,111, 26,101, 14, 35,175, 81,113,142,170,106,172,
+ 32,173,138,141, 39, 50, 48,210,118,144,232, 18, 57, 37,165, 77,102, 17, 91, 45, 51, 78,154,178,168, 59, 6,196, 98,178, 8,151,
+ 7, 1,214,171,133,151, 56, 68,207,167, 79, 45,105,192,193,122,131, 24,163, 90, 80, 56,135,133,133, 83,145, 28, 6, 0, 27,182,
+ 92,135,133,163, 95,198,252,186, 45, 88, 58,117, 4, 27,183, 94,143, 35, 79,127, 17,227,241, 8,253,194,197, 69, 80, 53, 13,138,
+130, 48, 30, 15, 49,211,235,129,133, 49,174, 42,204, 13,122, 24,142,123, 0, 1,199, 23,151,193, 2,244,202, 18,149, 8,202,162,
+244,108, 75, 1, 6, 74, 16,233,247, 6,152,157,157, 67,211,112, 11,102,163,172,214, 11, 75, 52,138, 28, 10,206,160,204, 54,215,
+128, 67,109, 26,169,110, 30,157, 39,139,169,202, 83,172, 9,138,137, 48, 29,185,108, 67, 16, 75,166,162,196,100, 79, 48,170,100,
+203,199,229,151,210, 34,181,135,236,143, 90,165,122,253,190,163,140,242, 72,206,229,196,171,136,244, 36, 70,109,128, 61, 69, 28,
+ 34, 31, 91, 98,186, 16,179,148, 8,196,170, 47, 9, 76,115,223,101,144, 54,120,231, 8,204,137, 57,111, 9, 83,217, 57,183,131,
+ 16,231, 20,166, 51,207,192,249, 99,179,214,228, 18, 19,156, 20,109,208, 13,211,229, 84, 79,154,218,195, 0, 56, 74,140,228, 24,
+ 76,192, 1, 78, 52,153,162, 4,187, 58, 19,180, 59,138, 25,176,103,204,187,228, 36,145, 2, 38,100,132,181,132,206,216,141,215,
+197,178,136,190,131,206,220,119,195, 68,151,144,149, 59, 19, 80, 90,248,221, 44, 92, 39, 38,251,215,243,183,196,216,176,209,134,
+110, 10,187,161,144, 18, 8,132, 0,155,255, 7, 20, 35,150, 31, 99,237,152,226,125, 97,136,249, 92,195,153,176,149, 12, 73,129,
+137,232, 29,167,176,113, 19,153,140,122,210, 17, 64,107,243,204,158, 40,236,239, 5,193,137,180,136,112,138,232, 76,208, 95,167,
+172,131,192,168, 14,205, 66, 54,192,116,146, 81, 72, 96, 28,171, 93,207, 98, 23,178, 32,214,209,157,118,220,132,208, 76, 76,171,
+ 1,153,154, 75,188,207,234, 95,156,162, 71, 33,136, 99, 32,146,206, 60, 50,233,203, 78,148, 0,163,172, 59,130, 76, 9, 76,192,
+ 62, 56,177, 14, 23, 22,126, 23, 52,193,169,139,160,110,188, 67,247,239, 95,145,213,208, 89, 82, 22,237, 29,189,102,229, 83,234,
+236,204,141,105,235,242, 1, 92,224, 6,196,189, 79,226, 42,156, 32, 55,199, 64,137, 13,138,160, 40,137, 47,155,165, 64, 85, 2,
+ 42, 20,192,248,144,140, 25,248, 93, 4, 6,249,161,184,231,151,108, 32,153,184, 93, 50,212, 25,211, 68,218, 28,115, 48,243, 66,
+ 83,116,217,192,212,116, 59, 64, 94,166,197,129, 51,212,221, 7, 2, 34, 46,239,114, 11, 27,134,155,194, 72,142, 59, 56, 39,184,
+136,166,180,230, 73, 98,250, 38,226,151, 63,247,163,135,159, 5, 55, 53,136,128,113, 85,163,223,235, 1, 10,193,207,244, 75, 84,
+ 85,133,185,249, 57,156, 60,113, 2,199, 15, 63,238, 95,188,211, 71, 81,174,217,130,199, 31,123, 4,115,243,235, 80, 55, 13,230,
+215,109,195,169,147, 71, 0, 0,117,195,232,245, 6, 88, 88, 92,192,114, 85,249, 90,122, 93, 99,221, 96,222,215,207,203, 30,202,
+162,193,184,105,208, 8, 97,105, 52,198,220,140,195,104, 56,130,144,195,218,185, 89, 52,228, 80,148, 37,182, 94,181, 33,102,199,
+ 57,208,218, 10,132, 76, 13, 39,188, 84,108, 83, 74,125,183,242, 4, 68, 18,148,221,174,152,136,193,230, 67,203,153,169, 45,163,
+213,222, 67,166, 45, 46,176, 63, 41,237,120, 41,101, 17,202, 9,239, 97, 45, 5, 34,184, 51, 48, 37, 37, 50, 72,246,119, 11, 79,
+ 88, 72, 22,105,211, 70,107,211, 10, 75,208,153,226,174,143, 31, 92,236,201, 36, 11, 69,170,199,145, 80, 63,116,164,108,125, 75,
+ 25,160, 44,123, 22, 75,228,106,247, 51,133, 98,134, 75,215, 11,246,229, 1,103,202, 89,142, 76, 22,164, 4,183,200,246,182,180,
+ 4,106, 55,151,234, 6,169,181,115,184,252,190,180,176,237, 68, 75, 16, 3, 97, 75,186, 56,203, 31,200,136,173, 68, 10,175,107,
+234,152,213,223, 13,243,194,146,195,156,139,132,198, 12,202, 14, 40, 94, 86,195,150, 20,153, 43, 18,231,226,207,155,172, 81,204,
+ 93, 53, 72,176, 24, 66, 32,161,213, 33, 97,106,231,100, 57, 37,148, 53,137,105, 80,144,194, 38,138, 28, 22,221,103,178, 78, 0,
+ 13, 45,204, 26, 79,153,170,114, 38, 90, 84, 66,219,254,203,148,218,227,178,245, 65, 57,185, 50,161, 32,121,113,157, 12,171, 92,
+ 38, 88,231, 48, 92,147,128,180,218, 14,153,244, 51,204, 77, 68, 69, 36,242,166, 40, 33,156,146, 8,108, 49,204, 51, 92,139,248,
+236,132,178,165, 20,118, 33, 71, 46,173,167,224,208, 37, 57,244, 66,225,112,138, 8, 5, 33,246, 41, 82, 43, 66,142,101, 87, 24,
+135,107,225, 5,152,164,212, 7, 75,141,162, 16, 69,225, 82, 59,162,169,111,115,116,230, 98, 88,238,121,150,206, 77, 19, 97,241,
+128, 76,134,224,217,217,210,151,237, 56,136,168, 67,218,139,165,213, 61, 34,194,202,173, 9, 1, 11,181,250,207, 36,102,248,129,
+ 43, 38,246, 90, 45, 74, 20,156,122,134,237,183,234, 45, 49,139, 55,100, 34,177, 45, 21, 72,181,219,108,155, 17,219, 99, 30, 98,
+ 14,210, 7,234,124, 29,210, 48,152, 41, 16,108, 72, 33, 49, 39,166,115,143,160,123, 61, 92,140, 94, 18,123,217, 16, 67,167, 58,
+116, 80, 43, 96, 49,247,180, 26,141, 48,170, 42, 20, 34,232,151,190,182,221, 8, 99, 92,141, 49, 59, 24,160,174,107, 44,156, 62,
+141,170,105,208, 43,123,177,174, 52, 24, 0,189, 94, 15,203,139,167, 80, 22,132,178,236, 69, 88,105,208, 43, 48, 55,232,227,244,
+226, 18, 74,114,232, 21, 14,235,102,102, 80, 42, 36, 58,232,245, 48, 55, 51,131, 97, 85, 97,185,170, 65,174,192,176,170, 65,206,
+161, 44, 29,134, 85,141,193, 76, 15,253,126, 31,215, 94,179, 37, 11,160, 44,119, 65, 76, 73, 36,254, 41,182,231,214, 68,137,220,
+ 38,218,144,121,129, 90,162, 3, 89,245,132,227,155, 59, 45, 35, 72,181, 29, 49,109, 57,137,117, 27, 34,215,180, 1, 7,200,211,
+100, 80,176, 80,110,170, 16,134, 90,114,200,178, 12, 55, 46, 18,207, 28,181,218,243,178,136, 33, 5,132, 36,201, 65,201, 4,249,
+134, 2, 9, 27,224,176,198, 44,199, 41,175,113,134, 87,206,185,212, 27,170,137,112,138,150,115, 90,159, 46,245,148,137,248, 76,
+ 83, 55, 82, 24, 62,128,115,246,166, 78, 4,177,100,153,103, 54, 66,179, 93, 41, 49,147, 82,182,191,194,204,177,253, 83, 82, 11,
+152, 71, 50,108,160,219, 38,253, 89,126, 75,114,186,129,200,135,204,249, 79,182,139, 6,103,234,218, 16,170, 13, 14, 45, 89, 45,
+ 23,152,136,142, 44,107,209, 74, 43, 36,214,108,179,174,157, 72,242, 21,211,241,144, 2, 46,154,210,180, 38, 22, 62, 37,151,101,
+243,129, 32,232,203, 7,156, 65,232,150, 32, 44, 52,217,250,230, 29,128,225, 42, 91,248,223,212,159, 89,127,214,129, 48,173,245,
+103,218,198,221, 70, 35,179, 18, 91, 27, 53,210,114,139,216,223,136, 21, 55, 45, 84,133,154, 85,171,172, 26,218,195,138,178,240,
+136,139,237,138, 16, 49,229, 26,171, 91, 16,229, 68, 18,105,211, 41,242,161,253,218,161, 28, 21, 90,219, 68,252, 61,118,134,108,
+155, 5,206, 19,117, 89,219, 42,150,123,212,208, 57,193, 44,104, 26,127,237, 78,187,118, 36, 43,193, 80,116,144, 9, 46,151, 84,
+ 91,103,109,107,107, 26,189,135,206, 35,183, 1,121,104, 83,195,204,166, 24,223, 65,246, 78,159,201,247,159, 57, 39,218,174,166,
+ 65, 79,188, 71,173,174, 80,180, 24,246, 33,163, 55,140,255, 88, 70, 53,101,160, 84, 83,151,182, 75, 79, 48,152,101,177,134, 15,
+205,107,135,210, 98, 86,231, 53, 36,155, 1,112, 38, 46,145,156,126, 56, 65,168, 67, 87,218,120,106,253,137,235,197, 63,244,208,
+102, 34, 42,164,192,180,178,174, 77,214,127,108, 30,124,225, 28,154,102, 12, 7, 96, 84, 85,168,235, 26, 78, 23,127, 89, 20, 24,
+141,199, 40, 93, 1, 34,191,129,215,117, 13, 71, 2,162, 18, 39,142, 62,139,219,190,225,141,248,200,135, 62,128,158, 43,113,250,
+244, 9,192,149,224,166,194,242,112, 4,114, 5, 70,117, 13, 17,198,218,249, 13, 96, 89,194,104, 92, 97,208,235, 97,208, 47,192,
+ 12,108,152,159, 71,111, 60,198,114, 85,107,173,211,197,252,210,185, 2,253,193, 44,214,175,157,207,200, 47,210, 22, 80, 17,201,
+ 30,124,124,192,129,117,169, 11, 92,164, 21,214,217, 23, 90, 38,117, 67, 34,203,155, 82,230,205,182,197,200, 66, 73, 54, 35,136,
+ 74, 68,148, 50,156,140, 61,237, 29,137,139,153,189, 75,125,189, 68, 74,216,227,172,134, 29,196, 69, 36, 8,142, 80,106, 25,131,
+ 17, 19,130, 35, 16,115,238, 0,132,114, 21, 24, 50, 68, 54,164,168, 48,157,187, 68,241,145, 32,140,147,148, 77,200, 56,141, 38,
+182,106,197,227, 32,177,199,209,226,110,132,214, 53,103,179,195, 40,250,146,132, 90,242,146, 67,130,245,226,102, 65,121, 78,105,
+ 9,136,225, 60, 2,113, 80,196,212,209,205, 70,103,235,242,169,103,222, 20, 69, 66,155, 96, 64,226,168,229,132, 66,103,201, 20,
+102,178, 32, 23, 44, 32, 35, 52, 98,154, 45,180,164,144, 58, 96, 92,187, 65,182,221,194,148,137,211,164, 86, 47, 17,155,117,231,
+ 29, 55,212,234,166, 12,168,132, 76,169, 66, 7, 66,153, 24, 34, 29,216, 16,227, 98, 64,147,103,201,237,243,181,251, 76, 44, 31,
+ 56,164,250,105,222,129, 22,239,189, 39, 92,230, 39,237, 20,177, 16, 66, 78, 76, 14, 37,160,200,214, 55,215, 20,136,144, 98,131,
+201,188,209, 53,235,138, 1, 32,210, 68,104, 60,113, 10, 40, 75,204,162, 72,140,158,167, 4,237, 5,166, 12,170, 39, 9, 98, 65,
+154,221,187,164, 37, 64,162,109, 89, 90,211,138,144,123, 8,248,195,117, 58,202,136,184, 68,212,110, 96,240,213,103,227,132, 5,
+150,112,168,190, 65,133, 99,156, 3, 92,209,203, 90,171, 69, 25,242,142,104,130, 33, 36,166,166, 46,202,150,103, 86,135, 30, 2,
+ 32,227,129,133, 45, 33, 50, 95, 14, 28,215,162,131, 19, 1,107, 73,203,223,127, 86, 46, 1, 77, 32,218,233,164, 84,164, 40, 36,
+199, 76, 9,114,213,146, 72, 44,190, 6, 4,220,215,212,101, 66,111, 43,131, 86,131,102, 12,167, 95, 22,147, 9,137, 97, 85,228,
+209,176,129,121, 34,133,159, 76,155, 28,165,202, 96,128, 83,156,175,135, 16, 28,192, 30,238, 18, 2,136, 29,216,105,101,158, 18,
+ 68,225,197,198, 90,117,204,184,241,176,214,126,173,218, 83,171,199,166,241,108,200,180,129, 11, 26, 22,140, 69, 80,184, 34, 66,
+ 48,117,211,248, 53,220, 8, 42,140,177,249,234,107,241,153,143,125, 20,194,140, 74,106,128, 5, 92,143, 65, 68, 88, 59, 55,171,
+181, 23,198,252,204, 12, 74, 7,212,117,157,181,236, 49, 75, 84,236, 90, 63, 55,139,165,113,141, 6, 64,197,128, 43, 28,250,131,
+ 89,204,207,175, 69,163, 81,161,176,104,164,107, 80,146, 88, 11, 75, 10, 64, 28, 11, 27, 65,165,141, 99,210,148,152,200, 28,137,
+ 7, 17,102, 38,202, 3,187,140,232, 21, 20,189,242, 77,144,208,142,232, 93,204,188,131, 56, 72, 90,232,228,219,230, 66,173,149,
+130,162, 25,103, 81, 51, 41, 12,239,156,135,223,162, 98,154,217,157, 61, 36, 75,104,132,163, 0, 73, 32, 99,178,169,217,145,178,
+139, 44, 99, 90, 12,115, 62,135,243, 16,219,177,156,238,190,181, 18,228,168, 45,160,100,234,174, 25,232,236, 16,157, 40,217, 62,
+101, 18,160,241,228,189,212,130,149, 58, 8,136, 8,172,253,185, 54,227,182,237,160, 19,164, 37,103, 90,235, 36, 5,123, 20, 91,
+215,148,204,150,114,218, 68, 72, 51,237, 99, 4,100,237, 99, 81,219, 42,219,236,114,116,131,162, 82, 28, 90,142,142,140,120, 84,
+ 98,125, 59,228,109,177,142,104,162,252, 34, 19,220, 9, 35,136,226,108,139, 99,128,253,253,198, 72, 83,217, 97, 45, 18,153,237,
+168,176,173, 90, 98,154,234,200,246, 45, 68,175,233,137, 94,194,185, 8, 79,171,165,169,221,188, 17,168,116, 89,195, 0, 77, 19,
+181, 9, 80,191,192, 21,110, 10,142,216,106, 91, 35,180,196,100, 36,181, 50, 74,114, 1,150,255,228, 4, 89, 74,160, 57,163, 65,
+215,196, 40,243, 73, 12, 2, 8,169,111, 61, 40,185, 89, 86,126,162,176,114,150,110,136,238, 21,177,254,174,239,155, 40, 12, 22,
+248, 73,142, 92,114,248,137,206, 30,223,119, 24,135, 62,161,133, 18, 2, 91,225,172,165, 45,181,219, 58, 0,141, 87,221,116, 20,
+ 85, 47, 19,252,237,247, 69, 9, 73, 43,229,119, 92,140, 99,111,154, 6,208,142, 4,239,132,149,188, 25, 74, 4, 28,217,149, 70,
+ 71, 35,173,118, 7, 1,187, 68,122,115,162, 92, 28,176,118,151, 56, 67,122, 14,129, 15,195, 66,128,162,136,134,247,211, 2,166,
+212, 67, 15, 88,180, 36,161,157,165,200, 36,248, 30, 96,187, 80,135, 22,150,152, 33,249,236, 56,151,219, 12,117, 3,201,153, 26,
+121,133, 71,114,193,148,172, 17, 46, 44, 82,237,223, 96, 39, 17,246,242,189,230,236, 29, 59,169,211,146, 40,152,167,205,252, 38,
+139, 50,170, 86,162, 13,116, 73,223,196,188,204,166,255, 48, 58, 62, 17,244, 10,231,137, 21,149,111,113,107,234, 26, 36,130, 65,
+175, 7,144,195,117,183,188, 28,167,143, 31,195,154, 77,155,240,236,137, 99, 40,136, 81,141,135, 88,187,118, 61,150,151,151,176,
+176, 60,196,154,185, 89, 16, 57,148, 69,129,133,229, 33, 64, 14, 71,142,159,192,214,141, 27, 80, 22, 5, 10, 39, 24,244,123, 24,
+ 47, 15, 65,202,214,173, 26,193,186,217, 25,140,169,192,236,220, 60, 94,241,146,235,181, 70,237, 73, 27,209, 41, 69, 8, 38, 64,
+ 20, 6, 66, 50,121,189,135,118, 44, 60,102, 24,148,129, 72,167,145, 50,152, 97, 40,227, 70, 91,192,197,160,142,200, 74,185,154,
+154,135,110,126, 62,219,113,177, 13, 37, 17, 94, 40,170,192, 37,226,154, 36,158, 3,200, 28,103, 74,207,180, 35,191, 57, 88, 49,
+ 28,197,223, 83, 13, 50, 64,130, 28,107,124,118, 23, 32, 50,100,173,184, 33, 58, 11, 34,249,210, 0, 75, 11,218,116, 10,139,230,
+ 29,202,209,217,183, 68, 18,194,182, 41, 46,106,226,234,207, 53, 49,200,129,173,149,154,112, 33,182, 9, 9,101,104, 89, 91,236,
+ 36,235,221, 15, 18,157, 28, 54, 9,189,223, 65, 32, 39,211, 10, 32, 27, 70, 79,122, 36,180,197, 82, 82,157, 58,246,128, 7, 78,
+ 13, 51,224, 82, 91, 85, 12,148, 66,192,152,149,188,172,142, 69,210,168,136,157, 40,210, 18,149,153,162,148,152,183,166,250,245,
+237, 98, 54, 73, 45, 81,152,188,191, 91, 12,131,210,255, 93,139,129,228, 18,178, 69, 17, 66,208,189,141,209, 98,140,153, 18, 65,
+112,140, 52,169,254, 22,203,133,146,117, 8, 73,187,182, 31, 90, 50,117,189, 57,155,168,100,144,110, 46,150, 21,224, 98,178, 52,
+ 9,131,148, 69,245, 61,105,145, 55, 39,216,155,161,195,133,141,252,104,250,100, 34,151,139, 24, 81,206, 12,176, 65,159,223,183,
+253,123,197,234,230, 3,233, 45, 65, 6,236,131,112,223,175,171, 65, 12,165,122, 60,100, 66,187, 38, 10, 29, 25,228,199,175,127,
+110,245,115,231, 32,188, 8,251, 86, 99, 34, 20,101,191,197, 21, 10,244,248,196,147,161,118, 97, 86, 81,206,192,124,247,221, 86,
+234, 15, 67,237, 31, 41, 49,140,201, 42, 75,174,168, 24,249, 54,182, 13, 82,223,139,162,136, 93, 13, 48,196, 78, 95, 42, 51,165,
+173, 86, 66,147,237, 15, 6,117,200,253, 45, 80, 90, 5,177, 88,206,138,208, 91, 18, 75, 14, 14, 34,246,207, 66, 50, 38,168, 8,
+ 90,236,211, 41,145,119,187, 78, 96, 53,227,197,194,195, 28, 55, 69,105, 87, 46, 56, 57,148, 80,126, 20,146,137,190,249, 0,211,
+ 49, 88,123, 30, 77,170, 7, 96,113,113, 25, 77,237,251,208, 11,173,151,129,253,131, 31, 14, 71, 40,139,196,180,119,206, 67,173,
+ 77, 85,227,208,167, 63,137,122,180,140, 23,191,242, 54,204,244, 10,124,231, 91,127, 2, 15,253,197,251,193,227, 33, 22, 30, 95,
+ 64,233, 60, 4,210, 40,131,114,113,121, 25,101,225,107,235,225,107,113, 52, 70, 51, 28,161,110, 24,107,102, 75,212, 34, 24,214,
+ 21,250,189, 30,202,254, 28,214,173,223,132,141, 27,215, 37, 7,174,168, 5, 50,230,163,100, 89, 86,210,118, 78,172,184, 8,206,
+217,150, 49, 14,122,193,126,115,102,109, 29,113, 45, 96,145,130,151,205, 54,150,208,182, 97,220,156,152,168,218,108,142,225,231,
+ 45,209,107, 10,211, 49,219,124, 96,101, 77, 93,139,103, 23,106,236,102,123,138,210, 35,129, 0, 20, 25,208,134, 80, 67,121, 75,
+132, 36, 42,183, 97,225, 43,111,195, 52, 58, 7,231,232,218,250,183,204, 19,109, 54,164, 65,139, 11,252,134, 80,100, 7, 25, 22,
+187, 11,152, 42,164,209,141,221,182,134,181,217,254, 66,104,235, 4,145, 21,251, 33, 43, 6, 19,136,118,148,109,146,148,157,163,
+ 76,203, 3, 77, 63,130,180, 90, 11, 13,207,154,173,142,190,121,223, 91, 2,247, 81, 21, 47, 18,187,173,148,110,144, 64,240, 8,
+ 75,200,242, 89,219,237,218, 27, 83,146, 34,150, 24,160,184,176,192, 93,171,213, 47,239, 84, 75, 37, 15,161,169,202,148, 70,245,
+220,223,151,176,199,177, 76, 84,168,189, 52, 70, 59,176,112, 32,150,172,229, 80, 44,109,205,181,121, 62,148,171,249,217,162,135,
+169, 83, 35, 35,234,101,196,134, 84,115, 13,207, 91,196,160,102,134,120,156,244,252, 76,143,179,161, 1,146,105,107, 11, 74,137,
+ 89,139,154, 18,193, 66,157, 61, 91, 15,146,161, 21,100,102, 24,136,146, 53, 93,152, 73, 17, 85,222, 36, 30, 15,142, 82,155,226,
+ 10,179, 64,114,117,194,182,212, 8,197,253, 38,180,164,229, 28, 46,246, 18,176, 58,167,129, 50, 4, 82,203, 87, 12, 95, 34,176,
+ 62,202,138, 60,181,250,207,195,241, 40, 4, 42, 45,213, 31,106,151, 70,200,200,249, 72, 82, 87, 13, 62, 47,150, 90, 76,112,158,
+136,185,146,169,203,133,236, 92,100,242, 89,138,233,188,176, 4, 97,129,160, 36,153,148, 12, 13,112, 44, 69, 41, 55, 83,157, 38,
+ 67,237, 11,241,170,180, 64,247, 51, 77,111, 16, 73, 89,189, 32,171, 21,167,122, 71,104,155,115, 96, 79,173,243, 17,160,164, 26,
+ 98, 10, 44,208,138,244, 44,249, 43, 72,110, 74, 98, 53, 43,196,115,248,169, 35, 16,110, 98,173,145,156,195,210,120,140, 53,179,
+ 3,148, 5, 97, 92, 85,232, 21, 5,198,149,215,107, 31,143, 70, 0, 8,213,120,140, 65,191,143,199, 63,255, 57, 16, 57,252,254,
+111,252, 7, 20,101,137, 2,192,160,223,195,160,215,195,114,229,135,194, 48, 51,250,189, 18,227,170,130,192, 15,201, 88, 30,141,
+193, 44,232,247, 11, 20, 13,163,110,252, 2,170, 26, 6,185, 2,131,153,121,124,211,235,111,139, 11,171, 45, 35, 24,162, 56,219,
+218, 16, 54, 49, 75,174,200,154, 95,196,212,208, 92,128,152,225,137, 41, 43, 72, 4,231,252, 10, 36,201,207,232, 88,204, 70, 69,
+ 98, 53, 64, 84, 60,196,236,108, 45,169,233,148, 64,166, 38,199,208,178,152,201,190,186,124,216,131,157, 37,146, 45,181,140, 95,
+150,152,190,137,234,175,155,145, 75,114,180, 20, 24,237,177,198,107,106,224, 17,242, 50,173,113,129,212, 20,197, 99,146, 99, 10,
+218,244, 98, 55,225, 76, 56, 36,180,248, 5,228, 67, 97, 60, 73,153, 91,108,141, 49, 25,105, 96,168,115,155,132,102,226,162,144,
+109, 69,216,149,141, 28,172, 65,199,132,166, 75, 47,135, 64,197,147,228, 82,139,132,216, 32,199,180, 44, 10, 56,107, 45,139, 74,
+104,237, 77, 56,110, 17, 28,159,171,180, 2, 80,114, 41,227, 32,194,132,180, 43,183,135, 69, 41,159,134,152, 38,231, 71, 32,175,
+191, 7, 36,207, 77,153,118,146,161, 21, 36,109,212, 91,251,136,141,234, 31, 73,166,188, 6, 35, 96, 67, 70,165, 46,163,173, 77,
+219, 6, 37, 21, 29,131,122,160,115, 46, 83,178,203, 75,244, 18, 73,124, 86, 53,209,119,171,229, 94,145, 88,178, 46,144,201,218,
+ 0,101,199,111, 76,201, 39, 75,226,148, 63,227,138, 34, 31,118,212,234,165, 78, 8, 71, 98,200, 35,244,150, 27,241, 50, 22,142,
+104, 65,100,193, 7, 46,149,213, 26, 32, 76,246,129,154,128, 51, 28,203,133,210,161,149,192, 85, 82, 28, 55,254,252,203,178,244,
+ 3,136, 96,157,108,232, 96, 56,131, 58, 93,144,112, 85, 14,140, 71,223, 85,251,193,206,155,136,100, 95,158, 16,217,154, 92,143,
+ 46,238, 65, 78,239, 79, 36,128,154,225, 79,161, 28, 34,153,180,108,242,135,194,222, 19,122,212, 79,249, 11,241, 81,164,110, 37,
+129,160,228, 73, 80, 38,170, 9,217,250,164,232, 77, 34,141,180,153,166, 79, 73,160,246,180, 23,194,228, 12,146,120,242,148, 35,
+230,129, 68,192, 33, 50, 15,110,158,141, 92,127,254,232, 57,244, 44, 34,181, 68, 65, 55,206, 88, 95, 52,113,111,112,138,207, 30,
+121, 22, 77, 93,129,185, 65, 93, 87,177, 58, 58, 28,141,209, 43, 74,159,109, 43,140,211,159,219,128,122,120, 18,194,130,254,154,
+121, 12, 6, 3, 84, 53,227,244,233,177, 95,108,250,206,204, 13, 6, 94,133, 72, 7, 6, 56, 17,148,206, 97,153, 25,131,178, 64,
+ 85,215,232,245,122, 32, 34, 44, 12,135,152,155, 25,160, 44, 29,158, 61,126, 18,189,178, 7,110,106,140,199,203, 56,122,236, 4,
+ 54,110, 88,155,193, 50, 98,153,183,166,221, 34,146,202, 44, 89, 46, 35, 31,155,118,160, 86,219, 71,116,194, 38,138,148,168,214,
+229, 35,126,223,189, 65, 17, 74, 54,218, 36, 9,208, 13, 18,181, 20,218, 82, 67, 58,153,136,100,148, 45, 6,215,154,166,103, 8,
+ 72,218,203, 45,146,234,108, 48, 16,189,100,221, 0, 70, 6,115, 5, 72, 57,108, 34,162,187,187,173,241, 6,134,106,104,235,116,
+182, 74,164,196, 54,162, 52,128, 67, 76,185, 41,240, 59, 38, 68, 64, 90,189,204,214, 1, 56,106,201,135, 76,244,242,183, 5,110,
+ 66,214, 39, 83, 85,181, 72, 3, 71, 24,165,191, 48, 55,201,137,217,128, 12, 33, 79,166,100,183,150, 36, 20, 56, 20,118,128, 74,
+ 6,189,155,126,157, 24,254,185,244,125,137,140,117, 74, 76,233,216,114,151, 79, 77,228,152, 56,132,172,131,125, 9,135, 90, 98,
+ 86, 20,196, 58, 82, 91, 30,133,247,222, 1,211, 20,106,194, 51,137,142,157,114,150, 58,209, 20, 49,129, 86, 31,125,206, 6, 48,
+192,132,164,250,105, 30, 36, 72,156, 49, 35,237, 12,147,210,115, 16, 73, 19, 1, 67,199,130,216,119, 52, 59, 19, 73, 76,254, 8,
+143,231, 78, 58, 57,115, 3,197, 74, 62, 91,195,102,246, 44, 57, 1,206,180,203, 40, 33, 86,215,190,136,121,126,156,101,238,105,
+ 38, 67,208,140,167, 72,124,211,234,166,135,240, 67,125, 89,167,206, 81,106, 73,137, 98, 67,206, 94,187, 51,106,116, 66,102, 45,
+104,171,174,214,156, 45,244,220, 52,170,231,174,164,191, 32, 98,147, 54, 58, 78,168,174,209,219,144,108,126,134,182,177,197,242,
+ 67, 13,110,252,223, 29, 5, 37, 78, 45, 89, 56,179,159, 5, 52,219, 37, 14, 91,251,221,138,136, 89,224,156,176, 37, 16, 43,111,
+ 4, 70,219, 93, 82,112, 33, 98, 20, 67,163,240, 77, 99,238,145,174, 67, 78,123, 79,222,210,102,225, 93,141, 48, 28, 43,163, 81,
+255,142, 80, 81, 18, 51, 54, 36,111,221,204,175,200,238,186, 50,169,234,100,135, 17,132,151,197,171,130,137, 78,178, 81,125,101,
+109, 43, 9,155, 3, 36,181,137, 8,113,146,187,132, 25,142, 0,196,217,134, 22,210,241,250,198,190, 55,177, 17, 79,142, 27,148,
+ 5,150,133, 49, 28,213,152,233,123,182,100, 81,248,204,170, 30,157, 6, 64,152, 25,148,168, 26,198,226,169, 83,216,176,121, 11,
+150,122, 37, 70,117,227, 55, 65,231,176, 60, 26,250,145,129, 86, 70, 49, 8,182,232,248, 64,102,193,184,174, 48, 59, 24,128, 89,
+ 48, 26,215, 94, 65,174, 44, 80, 53, 13, 92,221,224,216,241, 83, 88,191,118, 62,131,218,131, 90,156,173,205,196,105, 68, 1,253,
+ 16,153,224, 49,144,149,124, 53, 68,198, 80,219,166,224, 72, 39,166,224,185, 56,174,208,143,227,244,120,117, 32,170,177,165,150,
+144,109,183, 10, 89,181,107,101,122,208, 64,193,101,237, 31, 78,235,230,182,236,147,106,136, 97, 35, 55,235,199,229,179, 53,210,
+212, 44, 59, 36, 51,109,177,206,170, 93, 81,202, 62, 41, 40, 28, 42, 27,159,117,163, 17,155,193,144, 83,197, 56,137, 47, 47, 25,
+102,115,123,120,144,149,156, 32,201,191, 99,184,172,153,236, 98,208,106,199,132,206, 87, 56, 14, 77,153,185, 68,177, 55, 61,145,
+209,210,251, 68, 0, 56, 12, 96, 33, 81, 7, 79, 83,138, 97,134,165,107, 72,115,156, 5, 69, 98,160, 68, 78,132, 40, 74,159,107,
+ 7, 93, 56,152, 81,187, 72, 37,162, 0, 27,139, 76, 81, 28, 20,214,126,111,138,217,146,133,171,197, 74,239,134,250,109,144,193,
+ 21,180,102,129,217,174, 56,191,151,196, 32, 71, 50,205,211, 92,156,222,118, 7,147,164, 65, 56, 18, 56, 0,169,163, 36, 79, 38,
+147, 60,110,132, 30,166, 12,134, 1,165, 65, 54, 54, 75,183, 76, 86, 50, 29, 39, 25,215,128,140,138, 12,166,115,147,162, 36,107,
+ 36, 4,114, 36,169, 98, 74, 95,186, 69, 89,178,182,172, 40, 20,227,140,124,190,145,152,109,197, 12,158,100, 76, 81,176, 41, 56,
+244,240,125,192,197,206,143,148, 28,248, 18,158, 35, 81,117,194,124, 56, 82,152, 47,224,242, 9, 46, 58,223,192,197, 17,209,129,
+ 1,206,204,137, 31,224, 40,203,120,227,207, 25,103, 25,127, 39, 53, 11,129, 21, 49,117,228,209, 97, 59,145, 50, 34, 5,250, 61,
+202,160, 50,138, 82,188, 78, 91,250,166, 54,137,155,118, 91,143,150,166,146,128, 51,129,169, 40, 57, 83,208, 18,190, 49,196,218,
+248, 62,137,207,220,197, 36,178,254,189,244, 33,149,175,123, 4, 45,221,116,199, 12,219,154, 99, 86,138, 32,203,135, 36,213, 23,
+245,249,166, 40,241,248, 11, 53, 69,125,219,118, 37,236,251, 22,153, 33, 96,213,199, 77,218,187, 86,211, 55,144, 23, 96,213,128,
+ 56,158,106,186, 25,225, 85, 86, 82,132, 48, 32,236,153,135,162, 89, 61, 87, 99,101,165,123,247, 52,174,198,217, 60,106,168,180,
+160, 48,131,164, 1,161,209,127,171,112,237, 77, 47,195,145,167,158,192,141, 47,255, 90, 16,128,161, 66,242, 75,195,161, 50, 60,
+ 69,219,226, 42,136, 0,101, 81,162, 84,145, 5,209, 72,179,170,107,157, 22,212,160, 87,248,104,112,121, 92,129,133, 81, 87, 85,
+166,104, 4,115,205,217,232,191,144, 49, 81, 94, 55,247,218,238,156, 36, 19, 57,100,233, 14, 73, 46, 55, 17, 81,200, 78,203,108,
+ 73, 90,218,210, 10, 25,184,109,106, 68,106, 90,145, 60, 91, 63,169,195,133,214,142,192,218, 13, 89, 92, 40,163, 56,202,213,163,
+ 34,251, 29,173,172, 79, 12,107, 85,210, 6,220, 18, 80,200,115, 24, 74,157,253,193,225, 18,181, 27,125, 16,219, 71, 60, 36, 10,
+149, 52, 77,187,173, 0,145,181, 43,206,212,182, 96,201, 70,148,205, 80, 16,177, 51,149,146,243,139, 14, 10,100,155,225,162, 79,
+200,199,103, 74,222, 16,171,151,203,146, 90, 94, 60, 25, 87, 51, 39,146,108,150, 52,155,169,125,118,220,170, 95, 86,166, 59,192,
+ 20, 41, 73, 18,209,146,219, 36,166,192,117,224, 0,199,230,211,206,196, 8,122,132, 88, 35,182, 51,217,193, 62, 48,226, 33, 72,
+ 34, 34, 17, 1, 9, 1, 0,251, 47, 49, 74, 92, 4, 85,253, 10,231, 10, 43,201,153,158, 54, 66, 93, 82,153,195,177,211,134,124,
+184,203,196, 96,237,121,134, 89, 31, 96,117, 4,196,233, 86, 50,130,182,169,231, 6, 24, 73,207,164, 51,155, 36,118, 41, 76,159,
+ 12,239,155, 75,181,220, 4,231, 90, 4,131, 98,141, 84,136, 38,152, 16, 20, 59,143, 12, 72, 74,212,154, 1, 96, 42,237,148,214,
+ 84,210,247,144,216, 27,221, 46, 13, 4,105, 94,114, 97, 94, 61,153,245, 69,137,231, 65,148,173, 59, 43,109, 28, 70,139, 6,212,
+213, 75, 35,187, 52,146,137, 2, 1,149, 50,132,201, 41,113, 55,188, 75,206,200, 69,219, 36, 37,188,115, 58, 10,188, 36, 0, 0,
+ 32, 0, 73, 68, 65, 84,161,134,207, 38, 0, 12, 74,151, 81,111, 29,201,199, 72,208,111, 23, 63, 27,157,245,123,193,175, 4,132,
+ 66, 68,208,112,147,246, 34,241,254,195, 78,117,131,109, 73,164,196, 92,247,113,163, 51,252, 62,149,108,142,242,208,136,153,191,
+ 29, 10, 37, 58,180,220, 7, 84, 72, 63,239,204,190, 23,190, 96,255, 68, 82,126,148,212,233,226,242, 9,209, 65, 61, 44,181,170,
+113,246,247, 41, 35,234,210,122,200,123, 7,219,142,189,165,228, 99,213,128,226,203,202,118,244, 29, 71, 93,223,168,193,203, 86,
+218,207,244, 42,178,209,225,209,122, 19,115,146,158, 36,146, 76,252, 97,113,113,217, 7, 14,141,143,114,234,198,183,156, 21,206,
+161, 95, 22, 40,136, 80,150, 69,132,194,250,101,137,178,232,163,152,157,135, 48,112,232,211, 31,199,184,169,241,249, 79,126, 12,
+227,170,194,203, 95,181, 3,227,186,194,134,181,107,245, 77,115,168,234,198, 75,198, 58,160, 44, 11, 12,250, 61,144,136, 23,187,
+209, 40,221, 57,194,241,197, 37,204,246,122,145, 88,151, 74, 19,146, 79, 6,138, 44, 71,142,242,165,105,148, 31,162, 4,104, 24,
+132, 32, 46,159, 96, 21, 54, 1,103,156,142, 29,202, 50, 89, 99, 74, 10, 70, 54,243,112, 83, 69,104,166, 8,186, 8,229, 26, 1,
+ 1, 89, 9, 66, 40,166,219, 33,114, 57, 38,184,149,147, 35, 97,197, 56,202,168,195, 45,148,195,210,102,186, 86,206,140,165,169,
+248, 88,104, 65, 19, 35, 85, 26, 53,229, 51,114,147,133,227, 97, 20,183,140,164,177, 21,179,176,172,233, 48,120,130, 37, 35,228,
+196, 8, 91, 82,237,212,190,131, 18,186, 61, 36, 10,132,167,241,161, 44, 57,201, 52,176,163,197, 8,183, 4,210,164,101,180, 90,
+129, 32,145, 28,249,137, 63, 67,177,191,154, 68, 38,180, 30, 98,214, 26, 39, 80,229,239,123,220,140, 89, 50, 93,124,137,242,169,
+152, 8, 30, 17,218,121, 76, 32, 33,176, 68, 73, 49,245, 85, 35,252, 98,158,141,207,168, 57,237, 5, 52, 89,167,181,161, 74, 10,
+170, 36, 15, 54, 40,149, 33,185, 13,141, 74, 18, 77, 2, 75,150,240, 39, 62, 71,198,203,205, 62, 61, 49,202,105,226, 93, 65,220,
+226, 91, 68,172, 9,173, 13, 67, 80, 36,100,196, 1,123,111,195,181,132,239,179,233,148, 32,228, 60,135, 48,242, 52,116,228,132,
+163,166,161, 73,146,205, 46, 0, 1,133, 43,226,160,162,232, 48,212,171, 57, 87, 68, 97, 21,114,102,158, 67, 0, 50,201,229,142,
+202, 12,244,137,229, 39,201,131,218,144, 64, 74,227, 29,116,200,128,227, 57, 74, 80,144, 53, 3, 89,180,131,136,117,104, 87,211,
+ 48,184,209, 49,172, 77,157,178,114, 32,118, 68, 89, 2, 50,195,195,222, 81, 44, 42, 32, 18, 57,180,153,141,169,181, 51, 8, 97,
+184, 72, 97, 55,178,247,204,197,224, 76,217,245,225,190, 24, 71, 14,195,213,128,209, 52,136,226,109,118,202, 69, 91,116, 62,102,
+185,108,245,197, 57,204, 40, 48, 67, 63, 16,107,189,118,147, 72, 91, 40,219,109,120, 5, 39,159, 34,130,232,192, 17,156,120,138,
+174,194, 20,157,160,205,139,200,168,108, 57,119, 49, 14, 61,147, 73, 53, 21, 54, 2, 78, 28, 59,225, 33, 40,120,249, 63, 2,161,
+225, 6,117, 93,107, 61,165,193,104, 52, 6,115,131,126, 89, 2, 68,168,235, 10, 11, 39,142,162,225, 6, 27,182,222,128,134, 5,
+ 47,189,237, 27, 12,190, 35, 24,142,198, 24, 85, 99,140,171, 58,182, 69, 48,252,139, 52,211,239,163, 17, 86, 38,188,175,217,215,
+117,131,133,209, 40,190,126,161,143,211,207,219,181, 44,247,124, 59, 34,219,218,100, 7,107, 24,173,104,103,128,203,164,146, 45,
+134, 69, 45, 6,178,150, 73, 73, 13, 66, 38,114,146,213, 67,219,210, 29,212,230, 42,133, 12,151,242,108, 27,121,139, 86,166, 23,
+109,163, 11,203, 4, 55,127,177,226, 58, 73, 93, 56,135, 80,217,246,173, 74,171,218, 51, 85, 75, 88,226,191, 37, 93,123,125,233,
+172, 88,106, 32,188,105, 28, 76, 98, 39,138, 33, 23,167,205, 88,226, 73,166,151, 34,113,200, 8,250, 68,213, 50, 78, 65, 26,101,
+218, 95, 25, 76, 30,223,190, 22,196, 40, 33, 40,161,164, 4, 25, 70,242,146,221,180, 76,123, 90, 32, 40,146, 61, 79,194,196,108,
+121,201,158,181,237, 85, 70,134,186, 80,198,189,227, 68,226,212,233, 86, 86,212, 40,238, 27, 20,200,119, 81,245,121, 42, 7, 46,
+194,254,161,198, 14,110, 73,133, 74, 84, 49, 51,110,193,168,119,229,124,177, 40, 50,100,180, 54,108, 41, 50,246, 12, 35,100,237,
+ 12, 59, 37, 38,244, 9,199,251, 41,161,149, 44,105, 21,248,252, 52,100,165,105,221, 83, 32,113,197, 72, 59,188,236,110,146, 44,
+103, 27,180,173,139,151,244,222,230, 51, 1,140, 78,122, 8,244, 97,203, 89,146,222, 99,147,210, 57,231,224,108, 79,186,146,195,
+130,222,187,207, 56, 11,159, 25,234,181,123,135,238, 34,170, 22, 58, 57,156, 74,202, 22,133,255,221, 66, 29,149, 11, 35, 91,173,
+ 35,183, 42,117, 10,213,219, 57, 66,174,165,230,232,249,110,118,176, 10, 18,236, 30,158,101,244, 13, 65, 17,206, 59,239,166,110,
+208, 52,141,255, 59,135,191,115,212,211,136,109,108,234, 44, 89, 19, 75, 7,167, 1,143, 18, 53, 77,247,149,237,112,119, 33, 8,
+ 50,219, 64,108,136,117, 9,225,240,221, 49,138,166, 4, 84, 80,133, 5, 82,128, 99,191,144, 79,162, 20, 35, 8,133, 92, 1,218,
+143, 94,109, 49,207,132,109, 61, 90,157, 2, 27,117,247, 72, 40,230, 76, 73, 40,239,191, 73,176, 23,104, 50,235,130, 89,148,147,
+ 28, 21,214,246, 12, 59,136, 65,219, 54, 72, 7, 83,232, 57, 18,115, 75,228,134,236,123, 97, 90, 30, 82,231,163,136, 96,225,244,
+162,214,147,201,179,212, 65, 24,143,125,125,189,212,197,219, 43,129,186,241,196, 57,144,111,145,224, 10,168,171, 17,158,125,250,
+ 49, 12,102,102,240,248,231, 30, 1, 1,248,252, 35,159, 0, 1,232,247,123,168, 71, 77, 28, 70, 32,194, 56,185,176, 16, 33, 38,
+ 17,160,170,106,172,157,155,135, 84,181, 31,104,239, 28,150,171, 10, 27,230,215,224,116,229,137, 30,253,126, 79, 51, 28,202,231,
+239,138,117,193,212, 98,213, 6,232,135, 12,196, 76,217, 52,159,216,113,102,183,106,163, 75, 60, 65,143, 54, 3, 53,200,144,220,
+178,246,193, 54,241,200,202,123,107,187, 80,222,114,225,107,242,118,236, 99,204,146, 69,114,162,178, 76,225,115,153, 56,173, 61,
+168,102,210, 25,168, 82,129,149, 14, 13, 45,110, 25,231, 35,109,226,169,205, 44,245,213,195,204, 18,143,165, 49,237,237,204, 58,
+ 92,166,192, 24,241, 92, 41,193,241,161, 15, 56, 69,252,172,253,209,173,241,243, 18,102, 48,152,153,105,140, 56, 0, 36,100, 22,
+ 4, 2,113, 11,128, 96, 1, 59, 10, 50,243,217, 72,212, 28,166, 53,109,164,166,181, 85,178,225,174,148,156, 94, 62,201, 41,118,
+ 8,180,159, 81, 18,182, 73, 90,123,249, 12,119, 51, 44, 40, 8,231, 68,213, 62, 76,165,234, 83, 91, 47, 64,245,216,147, 2, 27,
+199,231,149,230,215, 75,116,238,217,244, 0,178,104, 78, 54,217, 52,107,129,202, 90, 0, 67, 16, 73,166,149, 80, 34, 56,103, 54,
+ 90,151,171,203,181,230,149, 59,180,180,173,197,138, 31, 18,236,188, 0, 1,161, 61, 79, 35,146, 11, 57,239, 48,177,179,110, 61,
+175, 34,172, 11, 21, 91, 49,163, 93,237,177,157,115,153,106, 92,204,150, 93, 75,103, 32, 4, 51, 68,190,215, 60, 78,201, 19, 52,
+ 65, 52, 74,133,167,156,107, 41, 43, 82, 62,226,216,103,252,105, 52,107,210,180,160,212, 70, 28, 7, 5, 39,129, 32,230, 38, 14,
+191,137, 18,183,133, 75,101, 73, 50,194, 92,234,152, 27, 69,101, 61,161,206,255, 25,153,229, 68,102,142,186, 29,147,202,113, 63,
+ 72,202,143,169,123, 37,182,232,177,164,246, 27, 55,169, 55, 24,144, 27, 50, 12, 85,201, 36,131, 77,144, 21,249, 59,129, 59,192,
+ 42, 69,226, 64,196,121, 48, 38, 0, 49,197, 86,207,128,162,147, 16,202,188,161, 82, 90,157, 48,126, 55,242, 7,102,211,159,138,
+ 9, 40, 46,141,158,155,218, 20, 58,165, 49, 81,114,134,240,180, 22, 56,246, 83,222, 66,157,201,129,253, 66,182,222,195, 33,155,
+203,237, 29,131, 74,144,186,164,162, 22,115, 78, 2, 78,159, 60,141,113,237,235,215, 2, 65,175, 40,177,204, 67, 52, 77,131,254,
+ 96,128,186,174, 32,240, 80,249, 76,191,143,209,104,140,185,217, 1, 54,109,187, 9, 71,190,244, 8,120, 48,131,151,221,246, 26,
+ 60,253,248, 33,156, 60,113, 12,142, 8,195,209,216,143, 38,212, 23,164,105, 26, 12,202, 18,245,104,236,181,221,105,140,126,191,
+135,162, 40, 48, 28,143, 49,110, 24, 85,195, 88, 55, 59,139, 90,251,218,157,115, 40,203, 30, 54,110, 92, 23,235,137,177,255,156,
+217,108,162, 86, 5, 44,180, 85,153, 94,243,168,180,102,180,187, 44,164, 68,105, 44,166,100, 67, 74,108,168,224,235,255,206, 76,
+168, 10, 42, 82, 97,174,125,222, 56, 39,173,201,126,121,223, 53,199,217,229,158,228, 68, 26,192,145,132,201,112, 45, 18,211, 20,
+190,101,158,151, 80,182,137,197,122,174, 81, 81,131, 76,226, 16,150, 71,156,103,255,105, 2, 93,128,140,109,227,115,248, 94,224,
+ 4,196,106,136,157, 75,206, 98,117, 39,178, 94,110,225,212,182, 66,198, 25, 11,155,156,188,213, 58,101, 59,157,216, 16, 62, 67,
+141,207, 41,113,148,156,146, 73,131,206,187,248, 25,223, 78, 18, 19,158, 29, 69,114,171,125, 95,218,155,181,125, 7, 73,157,184,
+152,110, 5,145,156, 0, 75, 10,115,199,158,121,211,233, 64, 25,137,141, 99,166,159,235,148,103, 19,118,114, 69, 61, 76, 8, 69,
+182, 58, 28, 36, 99,185,219,254,125,138,165,193,228, 40,136,172, 64,147,245,226,148,149, 49,210, 90,111,165,248,148,143, 41,182,
+208,126,186, 75,138,244,132,153,245,122,151,153, 57,102,169, 57,243,145,211, 92,108, 10,124, 0,100,186,237, 54,224,152, 54, 5,
+176,173, 25, 21,118,125, 7,211,150,200,137,241, 30,186, 76,194,181,123,213, 56,202, 97, 95,171,141, 96,113, 35, 93,119,100,160,
+255, 70, 91,192,188, 2, 96,174,139, 62, 57,113,209, 62, 11, 23,201,150, 68,200, 4,154,172,200, 85, 88, 19, 33,147, 46, 92, 17,
+209, 95,231, 92,154,188, 9, 74, 67,138,204, 40,213,144,145, 55, 77, 29,255, 30,123,244,141, 80, 87,252,121,110,180,231, 62,105,
+ 75,216, 32, 83,135, 56, 71,228, 55,170, 37,162, 77, 0,213,142,132, 48, 98, 23,173,115, 13,156, 37, 50, 8,160,238,183,206,121,
+242, 46, 69, 1, 53,153,168,171, 71,158,131,225, 87,121,137,140,118,125,187, 85, 15, 20, 29, 73, 10,133,183,152,181,206,110,136,
+ 45, 97, 81,115,224,146,172,248,229,235, 19,225,207,188,248,152, 71,201,109,146, 92, 32,207,217,241,120, 98, 4, 99,236, 53,112,
+ 24, 61,104, 4,228, 34, 99,217, 17, 10, 48,164,105,188, 4,108,221,168,100,107,129, 94, 89,128,149, 17, 63,211,239,193,145,195,
+250,205, 91, 81,169,254,239,242,242, 49,204,111,220,140,211, 39,142,161, 26, 46,225,213,111,216,229,213,102,185,129, 43, 28,230,
+103,103,209, 48,163, 87,122, 24,107, 92,215, 40,138, 2,133,214,123, 78, 46, 46, 97,118,208,143, 47,224,160, 87, 2,240, 67, 7,
+ 22, 70, 99,175, 66, 87,246, 48, 63, 55,171,114,170,109, 26,109,170,135,199,214, 51,251,242,155,121,213, 46,209,182,180,166,149,
+ 48, 45, 50,138,167,121,123,143,100,217, 64, 96,165,102, 37, 12,161,137,193, 47,177,254,101, 75, 30, 90,190, 97, 93, 63,196,169,
+133, 26, 74, 64, 10,179,128,197, 12,150,144,150, 86, 84,156,108, 36,156, 70, 92,154,246,162,118,247,228,132,212,138,149,234, 52,
+ 67, 12, 68, 18,135, 36, 70,246,150, 36,152, 21, 74, 41,211,207, 15,181, 62,150,198, 16,120,130, 99,160, 68,214,202, 6,236,104,
+ 13, 60,124, 46, 11,218,255, 99,109,243,226, 64, 52, 3,155,169, 76,173,254, 85, 54,255, 29,122,241, 37, 5, 54, 96,210,251,173,
+193,179,133, 36, 3, 4, 30,202, 14,148,106,255,210,170,101,135, 76,172,197,106,136,108, 98,182,147, 22, 37,181, 77,198, 0,165,
+213, 18, 55, 65,101,148,156, 4,152, 56, 19, 50,225,208,167,195,242,100,134,104, 27,213, 48,131,246, 81, 70,152, 82,189,110,201,
+133,142,243,121,164, 48,219,116,104,219,203, 87, 88, 22,236,138,145,155, 13, 29, 30, 46,175,215, 75,187,141, 78,196, 16, 6,242,
+ 0,208,101, 89, 94,154, 56,103, 62, 61,149, 49, 12,172, 67,100,106,187,217,180, 64, 51, 77,143, 18, 73, 47,100,238,147, 95,100,
+198,172,166, 26,175,135,213,139, 52, 34,150,124, 59,168,139,208,121,129,162, 40,227,248,223,144,177, 7,146, 96,132,241,245, 68,
+ 67,223,246,196,231, 26, 52,193,249, 2, 70,230,208, 3,195, 62,252,142, 85,215,203,196, 36, 3, 57,142, 5, 77, 93,163,174, 27,
+ 84, 85,237,137,208,152,206, 35, 98,110, 98,176,224,200,151, 79,146, 14,135, 24,181,196, 0,173,135,243,180,237, 78, 65,207, 90,
+ 75,145, 86,239,194, 64,240,158,187,160,196,193,120,222, 78,255,219,150, 63,146,178, 95,212,197, 55,130, 57,193, 23,184,194,151,
+ 67, 74,180,198,132,144,233,201,204, 96, 40,153, 16,157, 50,208, 12,173,208, 44,211,122, 43,173,112,185,157, 18, 51,201, 87,206,
+179,179,168, 84,197, 16,118, 81, 40,193,139, 83, 72, 28, 66,224, 34,220, 75, 81, 82,214,129,252,239, 56, 54, 12, 73, 15,195, 4,
+120,123, 92,215, 62,219,169,189, 64, 76,207, 17,234,154, 1, 97, 28,121,230, 73,112, 53,194,104,236,176,112,228, 41, 12, 6, 51,
+ 40,202, 30,190,252,249,207,224,137,199, 31,195,168,170,176,118,205, 90, 84,227,177,207,206,123, 37,198, 85,141, 97, 85, 65, 64,
+168,155, 38,146,237,106,102, 44, 44, 15, 65, 68,232,245, 6,168,234, 6, 84, 20,126,254,122,120,193,138, 82,231,117, 91, 49,127,
+ 51, 92, 7,118,214,181, 68,169,195, 12,246, 19, 35,131, 73,169, 79, 55,204,204,134,115,153, 34,244,228, 20, 44,155, 53,234, 94,
+227,236,224, 22,179,155, 68,180,148,147,243, 34,211,111,203,105, 10,154,103, 44,167,169,123, 18,250, 67,109,123,173, 33,107,181,
+ 59,118,227, 16, 26,178, 67, 56, 90,157,226,148, 21, 9,162,212,162, 19,203,206, 78, 45,163, 97,164,102,232, 63,149,168,222, 37,
+ 26,116, 80,236, 7,141,130, 22,198, 65,184,150,246, 66, 28,251, 72,156,177,201,145, 57,121,239,192, 11,177,100,191, 21,212, 81,
+168,213,156,110, 80,155, 80,243, 13,176, 60, 59, 91,190,240,170,140, 76,126,233,199,214,161, 48,140,195,190,139, 54, 72, 20,153,
+144,205, 76, 34,142,100,230,232,217, 88, 79,166,242, 44,237, 32, 22,137,189,221, 70,183,222,204,125,151,172,165, 73, 50,233,145,
+ 51,193,240,217, 24, 85, 73,112,106,212,172,104,135, 1,217,230,150, 15,222,153,210, 56, 17,215, 77,148, 97,166,214, 84,251, 48,
+ 69, 80, 44,145, 9, 57,220,218,216, 50,132, 76,209,185,207,203,148, 97, 70,121,128,217, 61, 69,194, 64,237,220,234, 56,105,151,
+ 17,172, 82,154,178, 15, 98,150, 78, 65, 61, 15, 58,142, 52,192,238, 6, 50, 55, 53,121, 24, 30, 68, 12,214,194,126,194, 9,201,
+115, 10,201,103, 72, 79,166, 84,103,136,166,217,176, 22, 50,138,138,166,110, 76, 73,167,159, 57,101,229,126, 86,130, 68,134,184,
+216,121,246, 45,191, 21,148, 61,155,198, 19,228,170,186,246, 28,170, 68,244,241,218, 17, 66, 25, 79, 34, 76,172, 75, 36,107,219,
+136, 18,208, 38,198, 36, 5,210, 8, 71,233,154,119,128,202, 70,103, 58,133,177,220,148, 20, 32,205,200,229,176,133,168,108,113,
+ 80,252, 76, 3,113,104, 82,217,207,204, 97,119, 44,148,181,123, 69,198, 97, 22, 62, 79, 97,173,179,105, 77,139, 10, 44, 33,171,
+ 15,132, 54,253, 59,244,239, 33,123, 54, 53, 58, 33, 78, 45, 64,132,148,157,104, 54, 79,166,221,133, 77,165, 52,157, 15,199,122,
+ 37, 43, 16, 71,129,212,162,217,138, 85, 4,139, 49,184,246,126, 18,128, 82, 91,202,250,101,225,219,203,156, 67,195, 13,230,103,
+ 6,216,114,205, 45, 24,204,204, 97,203,213,215, 2,101, 31,107, 54,109, 65,175,244, 83,220,142, 61,123, 24, 47,191,237, 53, 88,
+ 92, 90,192,220,204, 0, 77,211, 96, 84,213,202,180,244,109,109,142,128,217,193,192,215,128, 32,168, 89,191,154, 26, 53, 51,150,
+ 70,227,232, 84, 3, 89,197, 75, 19,230,186,190,100,178, 53,203,254, 15, 25, 88,128,122,196,180,240,196, 44, 34,132,240,118, 19,
+110,181, 33, 89,214, 54, 66, 95,188,164,146, 70, 32,240, 49,114,221,255, 64,223, 98,180,178, 89,210,101, 31,251,131, 36, 66,164,
+ 60, 49, 34,217, 8,187,132, 54, 42, 34, 67,185,204, 59, 47,114,246,148,196,129, 9,145, 68, 23,200,147,100, 21, 28, 13,177, 44,
+ 38, 74,170,142, 38,134, 32,195,166,156, 64, 28, 29,122, 26,128, 3, 21,188,104, 98, 61, 92,226,255, 35,102,171,196,100,250,105,
+ 83,125, 79, 32, 42, 78,228,215,107, 28,243, 40,156,190, 56,253,221, 18, 75, 83,135, 8,167, 64, 79,251,158, 67, 86,151, 58, 40,
+212,137,178,168, 42,168,126,166, 81,174, 11,186,213,130, 28, 41,105,223,239,201,247, 62,139,194,210,103,154, 54, 73, 43, 92, 69,
+ 81, 48, 37, 61,191, 88,213, 21, 35, 14,131, 73, 7, 43, 88, 89, 60,110,162,102,151, 77,198, 59, 67,154, 17, 54,114, 90, 33, 98,
+160,182,124, 31,197,169,122,202, 11,211, 44,204,244,173, 83,171,141,156,114, 53, 72,106,117, 81, 96, 66, 74,139, 90,221, 30,198,
+147,184, 86,187,154,107, 49,227,205, 88, 86,202,113,174, 40, 72, 67, 38,211, 11,191,227, 29, 58, 50, 88,215, 33,104, 13,248, 36,
+ 32, 62,203, 56,121,209,153,181, 71,113, 47, 45,202, 66,229, 97, 93,100,118,123, 2,155,194,234, 14,169, 62, 29, 51,207,148,201,
+187,200,138,183,146,185,164,173,202,105,176, 76, 96,170, 23, 81, 28, 42,181,232,218, 54, 82,219, 6,157, 72,113, 77, 84,147,108,
+ 19,130,195, 20,202,162, 40,163,148,173,247, 17, 46,106,110, 8,145,233,232,165,201, 24,144,146, 34,166, 21,220,203,180,236,145,
+ 51,252, 67, 64,235, 5,156, 92, 22,236, 64,149, 78,227, 61, 34,151,142, 31,136,225,132, 72, 96, 12, 51,217, 75,112,254, 66,112,
+107, 60,173,172,192, 90,138,145, 2,135,112, 86, 38,226,104, 17, 51,255, 91,108, 41, 44,133,161, 1,182,117,150,221,141, 41,155,
+ 61,165,193, 47,241,150,138, 85, 78, 50, 58,187, 70,137,201,104,142,102,173, 98,126,212,167,160, 87,150,104,154, 26,243,131, 1,
+ 70,227, 49,170,122,236,135,174,136,160,156,219,128,227, 79,126, 26, 69,217,195,194,210, 50, 94,243,134, 93,216,126,243, 45,248,
+224,159,189, 15, 36,192, 51, 95, 58,132,195, 95,250, 2,250,189, 62,150,199,190,166, 94,150, 61,204, 14,250,168,235, 26,131, 94,
+137,134, 25,101, 81,196, 81,123,131,210,143,101, 45,156,195,145,133, 69,108,219,176, 14, 39,135, 21,138, 94, 15, 69, 81, 98,118,
+118,198,103, 98, 46,205, 44, 14,197, 62,150,233,140,104, 10,178,139,236, 23, 0,135,137,116,176,253,216,200,148,203,108,224, 22,
+ 56, 11,140, 92,217, 40,219,148,178,150,173,148,169, 5,137, 9, 10, 45,121, 81,166, 53,137,150,136,233,105, 98, 74,117,223, 24,
+ 93,147,180, 16,137,244,220,216,170,139,232,132, 59,255,236, 56,109,182,176,227, 34,131, 10, 21, 71,201, 76, 49,122,216,164,208,
+180, 85,147,226,214,231,133,209,138,108,200,149,137, 59,146, 90,184, 66, 95,139,100,163, 63, 13, 98,160,199,229, 88, 71, 87,149,
+190,224,148, 57,241, 69,242,250, 51,226,125,137, 44, 0,201, 21,195, 72,167, 6,186,194,194,143,108,228,118,124, 20,204, 58, 84,
+ 66,140, 70,180,100,105,182, 81,217, 50,138,102, 98,186,223,192, 6,125,137, 66, 40, 73,150,215,151, 83,147, 42,144,114,134, 18,
+ 75,191,157,221,218, 50, 9,193,140,172,157, 14, 86,156, 13, 0,204, 37,116, 8,171,177,188,145,195,134, 14,156,195, 35, 97,202,
+ 24,153,214, 59, 3,106, 83, 28,147,166, 3,131, 56,189,127,209, 39,187,150,242,102,139,219,145,184, 32,110,146,247,145,205, 23,
+183,172, 58,202,185,158, 73,141, 52, 58, 5, 59, 54,171,112, 69,108, 75, 99, 70, 44, 9, 6,168,215,182,208,132,121, 9,206,160,
+118,182, 68,193,204, 41, 73,114, 80, 72,156, 50,193, 28,178,228,195, 88,254, 12,106,129,206,148,170,195,250,119, 25, 71,130,136,
+ 98, 80,235, 91,227,200, 59,101, 29,155, 29, 71,126,235,180,199,208, 53, 97,133,148, 66,128,236,235,233, 77, 36,163, 89, 50, 91,
+ 82,190,243, 14,157,168,137,158,200, 19,209,196, 50,132,162, 44,117,202, 76, 12, 91, 39,102, 17, 46,130, 97,105,248,139,100,157,
+ 63,225,222,164, 89, 42,100,106,234,118, 48,140,164,128,146,243, 82, 41,105, 96, 6,145,172, 75,170, 4,113, 6,173, 39, 69, 31,
+ 51,164, 37,235,103,150,140,167, 22, 82,175, 0,133,100, 68, 76, 59,156,200,234,104, 68, 70, 11,155,177,144,211,129,252,124,240,
+165, 73,241,162, 94,117, 11, 70,206, 98, 88,154, 96, 67,199,222,123, 34,148, 17, 46, 42,252, 20, 33,125,249, 26,205,134,150, 22,
+142,227,170,235,191, 22, 60, 94,192,177, 35, 95,196,167, 63,246, 55,248,228,223,124, 16,235, 55, 95, 5, 1,225,196,201,147,216,
+214,239,163, 87, 56, 85,193, 35,148,206,197,186, 76,165,208, 59, 0, 63,190,213, 17,102,250,125,212, 44, 88, 30, 87, 40, 11,135,
+186, 97, 12,122, 5, 26, 16,138,178, 84,121, 88, 49,154,202, 18, 85,138,194,128,157, 48, 53,203,110,154, 17, 2,247, 51,106,125,
+238,172,218,249, 17,226,146,164,241,237, 95, 26,191, 33,179,102,186, 97,238, 73,156, 2, 7, 50,125,242,134,237,108,170,171, 78,
+ 18,250, 18,235,178,156, 72, 81, 65,226, 19, 58, 14,212, 73,194, 84,108,251, 90,116,128, 97, 58, 17,115,166,227, 13, 51,200,193,
+ 51,211, 3,228,201, 89,192,152, 90,188,210, 12,108, 47, 96, 37, 73, 97, 43, 34, 55, 64, 24, 9, 89, 40,155,214,127,110,153,129,
+153, 81,225, 76,161, 6,110, 56,173, 85,105,203,184, 38, 90,158, 93,155, 2, 21,120, 42, 10,253,188, 34, 5, 9,246,250, 76,201,
+139, 84, 97, 42,228,211, 4, 23,181,180, 35,177, 49,100, 53,113,104, 31,231,141,202,177,158,140, 9,101,177, 72, 40,139,178, 90,
+220,226, 34, 80,171,213, 43,144,138, 16, 21,247, 40, 4, 63, 42,247, 25,131,125,215, 30, 18, 99, 2, 35, 59,121,197,220,171,152,
+113,146, 13,206, 87,204,203,243,242, 92,212,126,225,216, 98,149,139, 17, 37,169,209,192,160, 13, 90,242,137, 8, 53,173, 16, 73,
+ 9,134,119, 48,210,190,237, 18,164,164, 64,144,108,201, 48,239, 81,166, 76, 7, 46, 47, 97, 50,114, 7,146, 53,168,144,157,146,
+150, 35,169,100,122,150,153,217, 19,192,180, 86, 27, 90,191, 66,171, 24, 55, 18,117, 50, 98,155, 20, 81, 38,193,148,207,141, 87,
+209, 42,167, 8, 90,211,100,196,217,162,176, 61,247, 57, 1,218, 73, 88,181,177,196, 28,157, 65, 40,231, 37,161, 75,255, 57,129,
+136,234,153,232,161,110,158, 72,114, 94,110, 22,170, 54,154,200,133, 68,173,210, 93,107, 46, 58,194, 88,101,211,198,203,202,107,
+113, 74, 28, 12,170,116, 65,143,159, 73, 91, 65, 57,181,157,197,202, 39,153,207,182,129, 89,144,221, 38,192, 69,178,182, 41, 67,
+181,231, 8,180, 53,227, 69,172,248,167, 41,253,132, 32, 68, 52,177, 9,247,197,206,201, 86,241, 25,145, 0,185,251, 47,110,101,
+135,137,248, 99,107,104,169,190,153,106,103,134,244,134, 51, 4,205, 52, 33,142,213,170,213,139,165,192,228,108, 80, 3,101,194,
+181,136,176,164,250,222, 36,166, 47,218,136,230,135,105, 70,202,222, 44,200,161, 17,193,112, 60,246,255,173, 26,224,145,128, 87,
+244, 81, 22, 5, 6,179,115, 16, 42,192, 53, 99,241,228,113, 44, 46, 46,224,153, 47, 61,134,222, 96, 6,223,243,223,253, 4,234,
+162,244,181,113,125, 57, 6,253, 1,234,170, 78,217,164, 58,152,165,209, 24,131, 94, 15,195,170,194,184,174,209,176, 96,195,220,
+ 44, 78, 15,199,168,106, 61,167,162,196, 11,182,108,138,189,150,137,188, 20, 72,129,156,228, 14, 37, 13, 95,136,176, 40,155,249,
+246, 22,170, 14,144, 61,146,140,161, 71, 99, 57, 85,134, 2,195,219, 44,120, 59, 37,203,142, 68,146, 76, 95, 32, 65,157,108,234,
+ 90,220, 22, 54,209, 46, 4, 22,195, 3, 8,115, 5,140,144, 17, 49,167, 32, 66,213, 5, 41,178,153, 13,124, 27,127,143, 50,105,
+214, 56, 6, 83,130,214, 66, 18, 72,162, 92, 26, 33,169, 25, 6,229, 53,105,201,111,138,129,230,194,116, 36,150, 76,125, 74, 40,
+ 7,224,115, 18, 25,199,243,138,194, 74,113, 77,152,222,232, 86,105, 43,150,106, 57,215,235, 79,207,133, 18, 82,144,137,210, 24,
+116, 44,148,182,192, 38,112,208, 94,238,160,206,198,162,153, 10,183, 4, 95,194, 62,192,185, 32, 13,172,120, 14,101, 68,218,168,
+ 55, 96,166,136,137,161,109,103, 34,128,182, 93, 78,194,212,202, 40, 87, 25,167,168,145, 33,246, 77,213, 70, 18,163,192,199, 45,
+238,129,180,178, 98, 91,231,117, 98,250,122,157,105,119,181, 12,193,212,226, 16, 55, 99, 73, 45,124, 81,232, 73,200,204, 6, 32,
+ 51, 73,139,205,242, 79, 67,149,162,138, 95, 40,115,218,182,219, 22,105, 88, 72, 75, 58, 38, 88,229,156, 85,232, 51, 92,211, 50,
+ 23, 25,236, 70,183, 59,206,107, 15, 12,106,231, 38, 71,146, 78,169,123, 72, 8,204,213, 43,251,178, 81,202,240,139,162, 0,156,
+ 33,109,121, 41,184,188,175,218, 64,203, 20, 9,114,234,244,200, 32,136, 81,243, 31,255, 63, 97,111,246, 99, 91,114,157,249,125,
+ 43, 98, 15,231,100,230, 29,107, 30, 72,170, 36,138, 20,233,150,186, 5,171,101,116, 75,110,184,219, 48, 32, 24, 48, 26,232,191,
+200,127,134, 31,253,228,126,148, 31,236,110, 64,178,101,169, 53,176, 73,113,144, 72,113, 38,139, 44,214,112,235,142,121, 51,243,
+ 12,123,138,181,252, 16, 17, 43, 86,236,147, 37, 65, 40,136, 53,220,123, 51, 79,238, 29,177,134,239,251,125,102,135, 78,122,113,
+113, 96, 13,132, 17,161, 74,114,185,114, 89,150,181, 29, 71, 46,124,254, 51,172, 80,147,211,174, 29, 82, 83, 37,157, 21,168, 57,
+ 87,196,150, 84, 32,102,214, 17,161,250, 3,171, 76, 87, 47, 58,106,105,163,229,189,171,104,196,184, 42,210, 42, 33,186,190, 44,
+182,195,178, 17,196,184, 21,204,231,174, 68, 63, 65, 99,219,107,170,140,198,183,248,128,233,246,193, 23, 85,152, 68,185, 69,151,
+ 34, 56, 17,114,219,148, 49,183,166,136,153,172,100,103, 3,102,114,221, 71,144, 21,196,135, 20,209,103,224, 29,154, 10,100, 98,
+158,211,142, 39,121,140,208,121, 31, 83,216,230, 9,125,211, 36, 63,227,130,174, 59, 3,201,140,143,127,254,247,120,253,221, 47,
+225,112,220,195,123,135, 87,223,122, 15, 47, 30,255, 10,159,126,248, 11, 44,204,184,115,247, 62,158, 63,121,140,251,237, 5, 60,
+ 17, 30,191,120,142,182,105,177,132, 8,174, 97, 22,220,233, 59, 28,199, 17,222,197,172,246,139,237, 22, 83, 8,152,242, 94, 86,
+ 0,231, 61,218,174,199,221,187, 23, 6, 76,146, 58, 78, 54,151,175,209,169,101,101,122,254,124, 57,237, 47,157,172,108,127,171,
+ 90,171,140,173,236,165, 75, 38,133,207, 68,185,178, 49, 37,173,230,195,134, 60, 91,160, 64,154, 5, 92, 74,169,220, 25, 75, 5,
+196,169, 1, 26,186, 51,206,185,232,160,245,183,160,251,246,245,228, 37,219,174,234, 69,153, 77,181,147, 52,181,168, 59,159, 34,
+134, 49, 83, 17, 50, 83, 38, 49, 8,205, 84,113, 7,230, 58, 83,218,196, 6, 10,173,169,108,150,212, 40,149,199, 53,115, 8,180,
+131,171,200, 45, 37,123,161,138, 19,101,169,246,166, 89,104, 86,167,195, 25, 10,133,165,218, 25, 52, 37, 86,161, 63, 90,192,105,
+128,135, 41,232,237,207, 76,210,152, 57,119,196, 41, 31, 32,238, 32,139,166, 34, 31, 54,206, 48,244,117, 10,153,125,229,142,234,
+ 52, 59,219,153,231,115,135,179,168,179, 30, 67,219,159,177, 24,209,100, 1, 14,165,238,215,173,206,173, 85, 71,170, 32,167,252,
+ 53,221,166,173,163,122,102,239,108,174,196,103, 44, 5, 24,118,172, 26,211,181,170,206, 26,107, 95, 26, 25,177,137, 61,108,165,
+118,221,173,243, 4,168, 76, 82, 99, 51, 66,104, 26, 3,131,225,114,201, 23, 60,172, 79,151,151, 91, 5, 53, 89,231, 71, 45,140,
+132, 32, 9,139,161, 14, 15,215,184, 82, 20,185,245,231, 70, 39, 97, 55, 46,189,116, 46, 7, 61,229,103,137,234,252, 84, 73,106,
+117,239, 75,142, 71, 70,193,146,163, 82, 44,218, 89,141,169,200, 44,145, 52,164, 73,105, 14,146,209, 24, 93,182, 54,193, 66, 32,
+ 84,251, 28,137,138,229,216,221,146,210,178,226, 82,200,106, 38, 44,102,172,238,178,214, 41, 63, 63, 76, 96,199,102,109, 35,230,
+218,151,234,108,205,235, 15,230, 56, 33, 65,154, 84,136,132,146, 87, 79, 82,123, 95, 73,125,234,171,167,120, 69, 40, 3,185,219,
+103, 95,217, 26,161,163,127,151, 20,234, 84,118, 15,246, 27, 94, 21, 5,214, 26,123,178,161,176, 47, 26, 81,149,140,164,158, 80,
+ 19,119,168, 47, 92, 22,193, 81,177,127, 57,114, 70, 53, 13,181, 85,108,218, 6, 33, 32, 2,104, 28,225, 48, 68,175,250,118,123,
+129, 7,239,126, 9,215,143,126, 10,225, 3,120, 62,130,136,208,181, 61,158,126,252, 62,154,182,197,243,203, 23,248, 55,255,243,
+127,192,159,254,241,127,196,187,159,127, 15, 31,127,248, 1,134,113, 68,215,117, 88,198, 17, 23,219, 45,118,199, 1, 77,211,224,
+ 56,198,105,192, 56,205,113,196,156, 60,171, 89,207, 64, 9,120,227,155, 54, 9,212,210, 40,218, 26,188, 88, 84, 41,201,112,202,
+133,224,196,198,206,159,117, 85,121, 27,165,172,152,110, 64, 92,237, 68,144,244, 57,179,139,103,181,208,233,239, 21, 39, 88,108,
+ 16,142,235,137, 78,233, 58,117, 61, 32, 41,153,204,240,202, 93,178, 54, 90,191,173,237,190,215, 42, 94, 41, 61, 80,165,204,102,
+161, 83, 21,244,186, 24, 53,190,110,113,201, 21,203, 37,250, 55, 39,222,229, 84, 39,189,252,184,192,117, 68,145,188,156, 58,216,
+144,226, 31,203, 5, 90,188,174, 5, 32,195, 86, 29, 43,118,236, 12, 5,124,124,214, 24, 75, 47, 27,165,148,145,170,141, 41, 49,
+231,227,193,151,173, 61,235,196, 68, 62, 85,158, 73,113, 26, 84,239, 96,234,220,201,211,106, 92,191,190, 84,202,250, 67,147,180,
+ 32,106, 43, 58, 28,142,120,246,236, 18, 87,215, 55,120,241,226, 18, 87, 87,215,216,221,236, 32,150,163,237,202,179,211,180, 13,
+182,155, 13,206,207,207,113,113,113,142, 55,222,120, 13,175,191,254, 26,238,220,185,208,159, 7, 37, 43,158, 30, 96, 54,113, 81,
+ 80, 81,236, 86,184,143,162,210, 6,140, 47,186, 78,179,179, 77,137,152, 49,180, 78, 52,141,149,172, 20, 17, 41, 8,137,220,103,
+110,253,197, 90,237, 42,160,206,103, 85, 12,178,138,201,229,219,127, 95,178,110,163,245,228, 34, 94,132, 57,218, 51,167, 15,230,
+203, 9,138,167,133, 34, 96,115, 65,155,215,171,122,153,218,226, 80,202,196, 49, 63,191,222, 59,181,122, 21, 84, 3,157, 22, 68,
+233, 35,114, 68, 58, 34,207,211,124, 90, 95, 38, 18, 11,102, 27,112, 4, 32,117,218,146, 68,114, 82,222, 11, 88, 27,118,202, 10,
+ 97,214, 14, 60,187,142, 74, 94, 69,230,213,179, 2,160,136,128, 32, 28, 53, 62,213,142,152, 52,232,202,101, 52,109,158,172,173,
+172, 96,197, 95, 94, 1, 49,211,231,226, 42,175, 63, 37, 77, 81, 57, 55,172, 83,132, 83,136, 22, 23, 56, 80, 58,223, 75,113,226,
+ 98, 14, 9,193, 56, 20, 72,163,146,115, 38, 75,195, 76, 22, 77,187,198,123,192,246,113,197,186, 43, 74,146,163, 10,221,136, 82,
+ 33, 87,241, 73,107,204, 22, 41, 6, 80, 86, 91,115,141, 99, 37,220, 42, 26,145, 10, 34, 65, 85,250, 90, 29, 66, 82,132, 28,182,
+114,202,223,215,176, 44,240, 41,244,100, 55, 12, 8,203, 2,114, 14,188, 44,120,254,242, 18, 51,189,143, 47,254, 55,255, 26, 55,
+ 95,255,191,225, 92,163,163,123, 34,141, 33,194,159,255,241,255,129, 16, 2,174, 94, 60,195, 52, 79,240,141, 71,227, 8,195,204,
+218,225,181, 77,131,253,241,136,182,109,209, 54, 13, 14,227,140,190,107,112,185, 63,224,124,179, 5, 49, 41,176,102,211,117,154,
+160, 36, 43,117,119,252,136,185,216, 60, 80,244,137,146, 4,139,101,124,149, 15, 66, 86,136, 76,124,217, 19,161, 72, 92,202,192,
+142, 59,113,209, 44,101,151,118,191,217,231, 9,133,155,192,236,114,141,169,169,236,169,243, 11,150, 91,250, 52, 62, 97, 46,148,
+164, 76,250,138,191, 29, 85,207,151,142, 22, 45,214,210, 12,198, 84, 63,135,219,233,101,235,230,167,218, 24,144,164,157, 51, 87,
+184, 78, 61, 20,242,136, 60,123,110,201,250,211,217,248,211, 89, 1, 27, 76,166, 99, 22, 49,226,160,248, 25, 75,176,169,222, 72,
+158, 96,210,125,152,200, 45,202,173,170,119, 19,219,176, 37,103,138,232,190,143,140,232,141, 57,166, 26,130, 78,169, 36, 82, 81,
+254,232,100,206, 86, 34, 40, 73,117, 20, 88,129,131,108,241,149, 85,184, 47, 95, 94,227, 23,191,252, 16,159,124,242, 41,246,251,
+ 61,150,101, 65, 88,102, 44,203,140,176,204, 21, 35, 93,149,193,222,163,223,108,224,201, 99, 88,142, 56,238,143,120,250,244, 25,
+136, 8, 63,254,241, 79,209,118, 29,186,126,131, 87, 30, 62,192,111,125,249, 55,240,214, 91,111,160,109, 26,156,226, 80, 87, 22,
+ 89, 59,122, 49,167,107,142,187,181,233,132, 86, 33, 87,237,130,205,207,195, 57,201,206,161,234, 60, 82,192, 86,142,161, 94,229,
+ 74,103,123, 21, 25,160, 23, 83,204, 58, 95,139,236, 44,120,139, 21,108,115,203,142, 21,235, 38,202,102,120,155, 66, 43,105,122,
+ 40, 63,159,166, 75,207, 43,155,252,247,229,145,115,154,103,175,147, 35,251, 60, 74,217, 59,123, 23,181, 32,113,148, 79, 41,202,
+216, 60, 71,150, 44,169,174,153,114,107,145,171,156,169, 38,178,217,250,195, 99,193,160,197, 68, 8, 16,137,250,147,122,251,106,
+ 50, 49,242, 69,158, 46,243, 16, 2,230,121, 86,187, 39, 87, 0,175,220,161,187,212,181,199,127, 23, 82, 35,152,213,247,185, 0,
+137, 73,161,206,226,141,110,105,126, 69,253,229,206,192,169, 36,117, 74,100, 39, 25, 2, 21,202, 34,145, 46, 57,251,137,164, 8,
+228, 36, 53, 8, 89, 35,161, 79, 25,215,250, 33, 13,132,145,212, 84, 36,212,120,131, 74, 57,124,186,247,190,173, 89,135, 25,213,
+202,202,239, 89,149, 6,107,170, 67, 46,235, 42,165,166,110, 51,180,235,119,183,169,238,201,190,199,100, 70,110, 98, 72,107,183,
+244, 61,246,125, 79, 93,250, 56, 77,104, 83, 98,154,176, 36, 15, 99,202, 85,119, 17, 22, 51,236, 95,224,222, 43,111, 33, 8,176,
+187,252, 4,109,215, 98,158, 70,244,155, 11, 44,211, 1,155,174,195, 97, 28,209,180, 45, 60, 1,125,215, 1,130,120, 49,231,106,
+ 51, 85,205,219,205,166,132, 10,136, 96, 14,140,198,121,173, 38, 1, 66,211,180,120,248,240, 94,122, 88,107,101,236,122, 45,130,
+124,209,162, 48,191, 73, 49,164,174,218, 11, 59, 74, 52, 61, 46, 19, 21,209,113,114,124, 20, 92,218,161, 58,225,152, 62,198,146,
+132, 44,201, 62,149, 45, 29,233,115, 47,157, 56,110,237, 86,116, 28,101,124,173, 98,148,177,108, 46, 36, 74,187,252,140, 93,163,
+245, 41,177,234,127, 42,161,146,216, 66,141, 78,173,200, 98, 61,248,198, 76, 68,201, 31,110, 49,166,106, 5, 91, 77, 49,146, 29,
+136,181, 88, 34,141,255,180, 83, 37, 93, 41,172,150,160,154, 47,159, 1,189,218, 41, 21, 75,138, 48,157, 72,223,181,128,201,227,
+ 94, 41,224,138, 76,163, 43,239,101, 22, 72, 74,229,143,206,226, 62, 89,157, 63, 85,162,165, 45, 32, 10, 3, 58, 69,161,150,202,
+200, 57,135,113,156,240,195, 31,189,143, 95,126,240, 33,246,187,151, 24,135, 1,203, 50,167,195, 55, 30,204, 0,193,103, 43, 78,
+218,231,103, 52, 47, 47,130,195,113,151,212,188, 62,249,166,227, 69, 19, 38, 96, 26, 27, 12,135, 3, 14,187, 27, 60,121,252, 4,
+155,179, 51,124,238,221,183,241,149,223,250, 34,238, 92, 92,212,227,247,147, 28, 2,193, 63,101,130,211, 21,131,184,202, 85, 99,
+ 30,145,164,162,118,112,206, 96, 68, 43, 97,240,169, 44,183, 74,249,172, 64,135, 82,177, 62,196, 76,148,196,218, 59, 73, 78,154,
+ 40, 83, 73,105,115,162, 34, 63, 59,125, 72, 23,111, 86,136,103,145,173, 38,177,165,233,150,211, 61,186,232,110,219,106,105, 64,
+208, 11,187, 68,168, 74, 21, 64,147,243,210,201,158,249,146,249, 23,198,205, 64,182,177, 42, 98, 85,152,119, 5, 26,193, 28,247,
+229,172, 10,253,116, 70, 8, 39, 40, 88,154,184, 50,170, 64, 39,145, 24,202,178,182,172,205, 38,225,210, 90, 66,243, 37,239, 12,
+167,158,165,172,150, 56, 89,215, 20,102, 83, 2, 18, 82, 45,229, 78, 49,208, 84,179, 18, 52, 5,145,204,103, 83,141,230,243, 10,
+194, 85, 95,143,234,108,132, 77,212, 54,235,206, 93, 82, 60,120, 1,219, 81, 65,222,144, 81, 89, 36,113, 83, 19,187, 19,209,116,
+ 40, 59,109,163, 91, 46,199,162,134,172, 48,239, 6,221,150, 79, 90, 62,121,240,233, 86, 67,106, 93, 8, 88, 58, 80,101, 30,161,
+213,127, 78,183,188,199,216,104,194, 39, 0, 0, 32, 0, 73, 68, 65, 84, 39,251,170,211, 63, 47,143,216, 54, 93,139,195, 97,194,
+ 28,150, 24,218, 34, 2,145,128,214, 3,221, 43,111, 99,120,241, 24,127,253,127,253,111,120,243, 11,191,141,143,126,254,119,104,
+188,195, 91, 95,252, 93,252,252, 71,223, 68,215,180, 24,151,128,179, 77, 7, 17,193, 56, 69, 27,156, 48, 99, 73,227,198,121, 94,
+176,105, 91,156,111,183,120,122,117,133,179,205, 6, 44, 64,227,125, 10,117,113,152,242, 94, 41,225, 97, 95,127,245,161,238,225,
+ 44,175, 30, 21,238,213,250,108, 75,188,105, 13,180, 46,133, 82, 28,207, 90,235,155,122,203,162,210, 60,109,148, 28, 33,113,210,
+ 51,194,212,169, 16,175, 96, 63,147, 47, 90,121,255,229,116,210,152,251,138, 57, 95,246,181,148, 10, 14, 50,233, 87,178,134,193,
+224,182, 20, 53, 99,225,226, 58,224,225, 51,221, 75, 82, 53, 27,197,217, 72, 37, 2, 53,143,251,156, 9,130, 88,147,245,114, 87,
+224,140,181, 79, 71,131,116,203,243,197,101, 84,206,169, 51, 47,235, 5, 90,253, 25, 84,246,219, 84,191, 47,228, 68,139,154,248,
+147,224, 82, 0, 40, 12, 40, 25,193,242,122,133, 18, 63,222,217,133, 69,178, 70,114, 45, 83,169, 15,218, 88, 25,100, 26, 93,145,
+ 41, 51, 28,199,224,137,199, 79,158,227, 91,223,249, 1,118, 87,151,216,221, 92, 97, 94,102,112,136,100, 46, 2,208,182, 77,220,
+255,133, 5,109,219, 34, 76, 3, 2, 7,140,156,163, 95, 81, 81,177,188, 58, 68,160, 64, 40, 13, 19,241, 13,154,174,199, 60,141,
+152,166, 1,239, 79, 51, 62,249,228, 49, 94,123,237, 33,126,227,215,191,128, 55, 94,127, 85, 67, 69, 40,197, 8,219,195,161,186,
+112,233,150, 59,127,237, 23,167,211, 95, 67,100,138, 51,163,206,214,244,187,213, 42, 81,232,212,234, 86,186,241, 34,178, 92, 81,
+120, 87,179,198,202,147, 80,166, 64, 43, 96,201,250, 79, 41, 74,232,130,242,229, 36, 50, 75,116, 88,245,132,131, 68,227, 73,243,
+ 88, 56, 95, 40,121, 52, 47, 84,172, 89,132, 12, 62,161, 2,222,161,146, 74, 88, 58, 48,229,147,166, 81,246,103,217, 22, 72,215,
+ 38, 89, 0,150,131,127, 98, 56, 12,116,210,152, 71,206,185, 80, 46, 14,142,180, 47, 79, 29,250,178, 68,244,235,178, 44,152, 83,
+148,118, 22,194,229,156,244, 24,165,154,181, 31, 37,190, 58, 23,192,130, 85, 67,104,195,119,242,171,168, 18,151,138,167,173,108,
+247,172,246,202, 46,129,186,129, 16,227,191, 47, 43, 9, 38, 43,222, 21, 19, 39, 91,146,226,136, 69,227,188, 73,168,114, 78, 84,
+198,220, 28, 97,235, 28,154,184, 99,112,122, 42, 9, 92,177,212,125,198,187,113,219,223,211,250,182, 61, 89, 26,114, 90,166,212,
+ 97, 36,100,254,220,245, 93,109,255,135, 13,141, 32,219,201, 25, 65, 7, 73, 78, 31, 51,165,172,177, 54,101,170, 87,211, 52,152,
+ 70, 96, 78, 9,109,115, 8,105,124, 19, 71,207,225,242, 25, 46,206,239, 64, 54, 15,211, 46, 39,160, 63,191,131, 39, 31,254, 16,
+190,109,225,188, 67,195,132,205,230, 28,227,112, 64, 72, 23,251,249,102,131,253, 56, 41,154,146,211, 33,194, 44, 24,231,120,224,
+229, 11,175,241, 13,142,211, 12,223,196, 3,173,105, 59,220,187,123, 81, 58, 45, 35, 70,170, 50,204,171, 28,102, 50,216, 86,170,
+ 40,115, 34, 81,229,235,170, 14,187, 88,199, 74,208,242,170,160,202,138,103,177,219,109,232,133, 14,196,113, 98,221,238,173, 66,
+ 39,196,146,193, 86,107, 27, 69,170, 82,237,156,146,149,171,104,189,174,201,187, 98, 5,233,136,138, 71,229,150,255,252,228,227,
+170, 86, 60, 98, 2, 29,156, 17,178,153, 47, 96,245,155,230, 46,157,140, 32, 12,235,227,152, 74, 82,160,169,225,141,223, 57, 23,
+ 5,171, 37,151, 6, 35,157,228,116, 22,222,122,182,242, 89, 6,180, 72,125,241,192, 50,252,165,162,129,213, 22, 47, 19,174, 33,
+ 37,178,212,118, 95, 32,194,113, 28,240,181,111,124, 15, 79, 62,253, 8,215, 47, 47,209,182, 29,142,199, 61,194, 50,195,123,143,
+174,241,184,217,221, 96, 30, 56, 78,163,230, 17,187,225, 8,248, 6, 8, 75, 44, 34, 37,192, 59, 66, 16,193,110, 92, 82,208,138,
+ 67,227, 72, 71,161,206,121,184,166, 65,211, 52,104, 26,134, 91, 22, 56, 34, 28,247, 30, 55, 87, 47,209,247, 27, 92,189,124,129,
+143, 62,252, 4,119,239,222,193,123,191,254,121,124,241, 55,222, 67,211,120,227, 2,176, 43,184,218,186,231, 84,163,147,198,161,
+176, 13,198, 74,216,155, 30, 24,114,137, 65, 96, 69, 41,196,233,215, 75,117,193, 18, 91, 47, 62,195, 6,178,212, 83, 27, 41,193,
+ 47,235,104, 38, 41, 30,101,178,235, 67,192, 16,215, 78,197,174, 64,108, 20,244,188,203,138,253,100, 93,245, 73,196,104, 45,152,
+ 46, 7, 24,165,145,109,132,208, 56,172, 77,122, 21, 36, 37,157, 39, 53,155, 95, 84,195,148,167, 87, 66,198,194,101, 44,164,102,
+249,174, 83,217,124,241, 70, 91, 92,249,158, 74,206,133,201,116, 48,168,101,123,161,231,203,124,158, 39, 29,175,179,138,118,145,
+138, 3,129,243, 62, 77,228,160,239,104,190, 39, 92,106,199, 53,201,206, 18, 11,104, 53, 56,164, 85,104,139,212,196, 60, 75,134,
+203, 54, 58,169,210, 38,202,100,199, 25, 23, 11,145, 64, 66, 76, 13, 21,150, 8,254,201, 16, 48,157,108, 24,157, 8, 98, 83,150,
+ 51,225, 29,197,252, 15,102, 70, 67, 42, 88, 43,167,170, 21, 33, 41,202,174,162,127, 65,171,127,125, 52,245,144,249,140,235, 63,
+ 9,191,114, 58,154,156, 84,209, 38,189,141, 78, 71, 28, 57, 61,142, 12, 86,178,136, 61, 68,173, 38,178,226, 30, 87,233,157, 57,
+189, 9,132,101,137,130, 39, 70,192,113,156, 32, 18,148, 46,214,117, 61,166,241,128,195,245, 21,134, 38,122,201,119,187, 43,144,
+115,232,125,131,105,158,208,180, 29, 94,127,231,115,248,193,247,190,141,198, 55,152,150, 5,247,219, 22,114, 60, 2, 68, 24,150,
+ 5, 93,219,225, 48,140,177, 8,240, 30,129, 67,132,221,136, 96, 63, 77, 9,164,224,209,117, 61,218,110,147, 2, 58, 66,242,107,
+218,238,184,150, 1, 57,212,223, 84, 25,251,164, 67, 44, 97, 74, 73, 40,118,199, 46,199,139, 58,163, 79,144, 42,159,247,228,136,
+ 35, 84, 59, 81,245,206, 27, 95,185,220,210, 95, 56, 87,215, 24,213, 90,198, 90,130,215, 7,233,109,130,142,236,113, 88,139, 80,
+196, 42,105,111,239,239, 79,159, 33, 67, 17,163, 2,177,201, 21, 48, 75, 73,153,210,148, 50,107, 93, 75,135, 79,125,249,215,242,
+182, 44,104,229,149, 87, 62, 91,182, 42,162,151, 81,244,231,125,173,216,145,222, 26, 63,171, 18,120,209, 8,200,147,239, 58,139,
+193, 56, 95, 90,171,221,159,241,189, 22, 88, 73,233,222,242, 90,197, 57,135,191,249,250,119,241,233,163,143,241,252,201,167, 96,
+102,204,211,136,121, 26, 32,160,136, 68, 6, 35, 68,132, 29, 24,132, 37, 48,166,121,193, 52,141,240,142,176,105, 28,198,121,193,
+245, 48,199,209, 33,226,159,211,248, 6,155,109,143,205,102,139,187, 15, 31,162,109, 58, 44,243,136,105, 28,177, 76, 35,120,153,
+193, 68,112, 77, 11,223,180,240, 77,147, 4, 83, 11,134,227, 30,243, 52, 96,127, 56,226,231,239,255, 10, 95,253,173, 47,226, 11,
+ 95,120, 55, 77,111, 50, 47, 3,229,221, 41,114,237,147,135, 66,108, 70,245,173,149, 36, 76,211, 0,229, 21,144,139,205,137,220,
+ 22, 64,249,153,216, 28,211,127, 75,173,125,112, 89, 56,150,133,125,110,173, 11,202,226,188, 26,180, 20,187,220, 16, 35, 65, 83,
+ 7, 74, 34,122,190,105,247,237,200, 88,175,156,185, 32, 10, 75,221,173,203, 15,170, 69,129, 85, 65, 97,238, 10,139, 97, 46,107,
+137,149, 80,142, 87,107,219,196,169,200, 41,133, 81,229, 94,246,239,156,194, 84,114,162,221,218, 78, 89,128, 50, 5,253, 58,142,
+ 35, 66,242,207, 87, 52,185, 36, 58,115,228, 10, 31, 69, 36,190, 27, 73,235,163,220,117, 50, 5,221,106,175, 66,197,120,111,176,
+212,246,231,111,155,203,213,236, 57,137,216, 92, 18,201,105,201,164,225, 90, 37,172,134,211,148,129,210, 10, 52, 36,246, 67, 14,
+208,170,242, 80,210,196, 66,117, 54,185,241,128,160, 33, 37, 94, 25, 51, 63,173,163, 61,211, 5,225,204,248,210, 94,251,105, 57,
+ 20, 67, 12,160, 96,144,172,244, 91,143,210,179,223,174,136, 66,201,236,236,163,122,190, 80,228,168,140,177,136, 12,123, 9,218,
+ 9, 23,141, 93,188,120,156, 57,120, 35,238,208,192, 74,210,131, 49,165, 10, 15, 16,156,111,123,112, 88,224, 4,113,223,222,109,
+ 48, 28,102,188,254,246,187, 24, 14, 59,188,121,239, 33,158,126,242, 33, 14,135, 35,238,156,109,225,155, 6,194, 1, 63,251,209,
+ 63,224,222,197, 93, 92,222, 92,163,109, 60, 14,195,128, 97,158,241,202,189,251,184, 57, 28,128, 70,176, 44,115, 12,111,233, 58,
+220, 28,143,112, 14,184,220, 31,176,237, 55, 24, 67, 20,110,121,215, 96,179,217, 36,145, 28,170, 96, 22, 80,125, 32,185,218,166,
+ 90,104,220,178,218, 13, 86,142, 1, 42,208, 24, 19,223,172,214,179,147,151,182,198,168, 20, 32, 66, 98,154,151,140,193,149,240,
+162,240,183,109,199, 43,230,199, 84,167,171,213,130, 71, 90,183, 34,116,251, 1,185, 10,246, 58,249, 79,171,177,101,101,167, 66,
+ 37, 64,116, 10, 76,146,202,246,164,190, 86,203, 67, 55,251,172,127,116, 90,101,132, 90, 46,255,161, 11,235,174,177,216,190, 68,
+227, 45,173, 13,205,242, 24,114, 13,194, 65, 20,140,196,194,201,205,129,211,164,190, 53,128, 73, 76, 97,100,187,199,234, 30, 43,
+ 9, 89, 44,140,176, 4,252, 63,127,245, 13,124,242,193,207,177, 44, 51,166,113, 80, 95,243, 60, 28,225,132,209,147, 96, 92, 56,
+165, 11, 6,204,227,132,101,160, 20,100, 68, 56, 28, 7, 60,155, 22,184,132,176, 60,191,184,139,139,187,247,208, 54, 45,100, 30,
+ 48, 29,246,152,110, 46,241,244,230, 69,236,212,155, 78, 17,151,228,163, 11,100, 89, 22, 44,129,225,198, 49,142,128,247, 30,222,
+ 59, 52,109,139,113, 28, 48, 14,103,248,214,183,143,248,197, 7, 31,227,247,127,239,119,112,126,118,102,131,100,203,116,105,181,
+214, 17,147, 93, 64,171,226,184, 38,236,165,247, 37, 1,142,148, 70,166,233,116,164,153, 8,197,115, 72, 37, 37, 17, 53,116,135,
+178,197, 68,156,158,123,206, 21,245,111,214, 48,208,170, 99,210, 36, 51,181,109, 82,149,242,231,114,234, 90,158,130, 50, 27,146,
+157, 43,162,238,236, 12, 74, 38, 59, 17, 20,202,156, 25,119,173,253, 4, 5,223,108, 71,206,100, 46, 73, 87, 57,111,236, 84,158,
+ 51,231, 71, 74,254,131,138,239, 4, 5,254,149,109,121, 33,238,201, 5, 57, 69, 46, 1,161,192,234, 93,183, 10,247,176, 44,154,
+185,145, 71,214, 25,161,205, 57,102,214,217, 80, 29,170,107,188, 4,165,202, 30,122, 5, 57,165,200, 99,202, 66,217,245,164,196,
+164, 81,150,160, 22, 99,183, 21,210,166, 35, 58,128,184,228, 39,172, 0,110,217,165,144, 53, 52,222,187,248, 57, 72, 40, 15, 73,
+133,138, 78,226,190, 16,215, 87, 46, 17,229,114, 86, 8,145, 67, 83,208,147, 84,123, 68,193,160, 36,190,145, 50,125,210,255, 45,
+100, 51,207,139, 88,135,156, 97,197,165,104,211,220,133, 16,213,208, 9,192, 36,188,230,221,101,174, 70,245,197, 19, 5, 7, 84,
+163,138,147,226,186, 0, 46,224,138, 96, 67,119,201,101,113,139, 41, 4,132, 36,144, 3, 4,157,143, 47,235, 34,130,113, 89,208,
+ 30,175, 49, 46, 1, 47,158, 60,194,221,251,111, 98,127,243, 44, 30, 52,124,128, 8, 48, 77, 19,186,182, 69,215,118,184, 62,236,
+177,233, 58, 12,211,132,133, 25,155,174,199, 28, 22,180, 77,131,198, 59,140,243, 28,119,240,243, 4, 17,194, 48,205,104,188,199,
+110,156,112,231,108,139, 5, 14,190,105,240,218, 43,247,235,171, 43,166,213, 20,104, 10, 21,155,147,253,231,150,116,166,160, 15,
+123,180, 81, 29,229,105, 93, 1,118, 39,148,139, 34, 97,209,113,157,100, 65,150,105,120, 42, 81,164,113, 25,137, 40, 40,179, 12,
+157,179,157, 37,253, 60,157,161, 72,229,206,202,213, 86,111, 83,229,186,213,207,246,212,206, 83,241,177,205,222,146, 86,152, 74,
+ 82, 91,164, 84, 40,201,252, 18,171,141,196, 78, 68, 12, 78, 56, 59, 0,170, 3, 29,183,217,169, 12,176, 36,199,144, 74,121,230,
+105, 53,162, 32, 90, 21, 57,102,103, 70, 48,202,228, 36,168, 57, 65,231, 73, 41,160,181, 83, 18, 51,205,160,162,150,163, 21, 91,
+ 28,214, 34,152,214, 49, 31,127,242, 20,223,254,246,247,240,244,211,143,147, 16,105, 1,132, 17,134, 1,227, 60,163, 33,198, 2,
+ 7, 33,143,195,120, 64, 71, 64,235, 8,155,206,225,229,113,194,113, 28, 83,204,176,195, 91,111,189,131, 87,223,120, 27,187,203,
+167,216, 95, 62,199,225,233, 39,241,231,215, 52,113,111,190, 57,131,243,145,170,215,180,125, 28,149,114,208, 41,199, 18, 66,156,
+196, 4, 78,193, 35, 12, 80, 7, 89, 2,248,120,140,239,224,241,136,121,158,240, 39,127,122,133, 47,125,233, 61,124,229,203, 95,
+ 68,227,188, 9, 55, 66,133, 51, 45,127, 47, 6,160,101,167, 66,214,168,110,156, 29,118,139, 77,197,170,132,202,219,111, 93,133,
+ 5, 84, 83,124,180, 84,118,183, 34,134, 63,158,158, 86, 39, 69,176,105,215, 83,218,176, 56,203, 37,131,132, 52, 82, 54,202,126,
+206,127,166, 3,124,226,176,231, 99, 65,156,168, 69, 83, 56, 1,105,140,181, 77,147,219, 36,175,236,214, 78, 19, 49,113,187,245,
+106, 32,255,183, 90, 48,153,137, 34,155, 88, 91,202, 2, 48,237,208,141,120, 54,119,170,185,155, 38, 15,128, 19,127,234,150, 46,
+125,137,162,184,108,131,203,249, 9, 57,193, 83, 89,247, 39, 86,194,186,176,181, 63,133, 28, 3,203,134, 8,168,205,160,141,134,
+149,154,182, 74,134,166,105,177, 3,121,178, 44,236, 76,148,182,153, 90,167,226, 44,243,236, 41,209, 38, 51,137,146, 60, 25,104,
+148,168,149, 53, 36, 97,106,158,176, 49,138, 56,207,129,208,208,138, 8, 71,137, 21, 42,100,164,179, 48, 73, 91, 82, 34, 3,234,
+148, 48,164,100, 42,135,219,211, 24, 86, 68, 50, 35, 36,128, 1,173,192,116, 50, 58,142, 55, 72, 88,231, 76, 26,146,172, 39,187,
+164, 21, 52,204, 1, 71,201, 63, 39,204,112, 77,131,101,142,182,155, 12,111, 9, 33,104, 22,250,118,179, 1,252, 6,141,204,144,
+101,192,225,120,141,144, 58,250,174,105,176,217,244, 88,120, 1, 51, 99, 63, 12, 96,102,180,222, 99,211,247,177,226, 98, 65,215,
+120, 28,151, 0, 67, 32, 7,115,244, 68,118, 77, 83, 44,100,105, 12,211,180, 45,222,124,227,161,201, 16, 70,241,134, 59, 35, 90,
+ 65, 9, 20,112,182,147,174,140, 97,164, 2,143, 34,172,146,122,125,178, 74,214, 42,157, 13, 37,209, 28,213, 24, 96, 3, 87,185,
+237, 34,163, 60, 41,112,117,215,232,212,122,232,204, 62,206, 24, 85, 63, 99,124,126,226, 59,182,135, 9,213,190, 32, 77, 60, 50,
+ 47,238,122,153, 80,245,177, 14, 64,144,202, 43,158, 49,242,178,170, 20,201,172,120,124,134,120,224,150,168, 90,123,248, 87,233,
+ 89,181,168,170,234,212,113,203,104,132,106,255,181,168,191,152, 78, 39, 6, 70,123, 65, 38,104,130,232,118,133,187,220,182,154,
+ 72, 13,161, 35,194,119,127,240, 62,126,240,189,239, 98,191,223, 65,132,177, 76, 35,150,105,192, 52, 47, 32, 4,116,109,135, 97,
+ 94, 16,198, 3, 90, 2,182, 36,104, 60,225, 48,206, 56, 76, 51,188, 44,120,227,243, 95,196,171,175,191,133,171,231,143,241,236,
+163, 95,226, 87,207, 62, 69,187, 61, 71,187, 57, 67,127,247, 1,124,211,160,237,122, 64,128,227,113, 15,223,180, 90, 92,180,222,
+129,231, 25, 28,102, 44,211,152,124,194, 94,117, 35,204, 49,100,201,247, 61,218,174, 69,183,217,160,235,122, 0,130,121,158,240,
+179,247,127,133,199, 79, 46,241, 7,255,234,119,113,182,221, 88, 15,198,186,204,197,237,144,121, 90,189, 69,137,133, 64, 98,252,
+251,145,135, 94,139,242,156,249,179,196,164,120, 73,245,172,146,241,185, 59, 29,111, 59,163,117,129, 42,173,133,169, 94, 95, 81,
+ 61, 9,226,192,202, 7,176,194, 71, 73, 62,238,152, 3, 94,224, 60,218,105, 67, 16,192,229, 66, 55, 49,120,130, 66,226,204,239,
+ 44,170, 11,200,213,202,125,187,124, 35,210, 78,149, 42,145, 53,233, 58,138,170, 29,186, 47, 50,175,212,144,132, 32,230,121, 55,
+192, 33,225, 21,199, 61,169,220, 23,115,161, 75,236,108,115, 78,122, 85,160,211,106,226,168,133, 19, 27,230,124, 14, 23,139,141,
+135,203,252, 15, 58, 13,212,115, 46,175,234, 88, 87,190, 86,243,101,234, 69,227,112,145,202,130,200,233,251, 14, 70, 16,167,141,
+ 68, 22, 46,166, 70,147,164,216,242,178,150, 32,218, 23,157, 10,149,245, 60, 72, 42,253, 70, 43, 63, 22,144,119, 70,178, 38,167,
+ 17,144,121, 36,168,163,220,250,165, 81,213,123, 18, 29, 72,246,220,225,196, 10, 90,211,232, 76,232,131,165,154,229,113,113,254,
+ 40,106,127,175, 24,241, 71,230, 78,219,196, 34, 81,132, 97,166,178,229,183, 39,112,162,185, 9,163, 73, 29,125,231, 27,204, 97,
+134, 39,192, 99,193, 56, 31,227, 3, 48, 29,192, 97, 70,223,245,104,156,139,150, 9, 22,156,111,122,140,243,140,187,119,238,224,
+229,110,135,251,231, 23, 56,142, 3, 26,239,112,121,189,195,118,179,193,113,138,251,196, 56, 21,224,244,208, 56, 52, 4,236,166,
+ 17,178, 44,232, 55,109, 12,129,217,110,234, 66, 40,103,194,179, 91,157, 65, 82,242, 28,146, 53,167,252,125, 81,233, 22,225, 83,
+ 61, 2,175,109, 65,182,194, 54,158,210,226,119, 75, 64, 4,170,186,146, 83,238,192,233,223, 58,227, 88,200,207, 66,137,221, 94,
+145,207,254, 49, 9,123,254, 25,167, 2,167,124, 9, 25, 55, 89, 4, 58, 39, 23,186, 80,125,225,154,116,166, 56,122, 55, 98, 49,
+183, 18,156,113,233,216,179,106, 91,176,178,162,153,247,132,112,170,229,208,231, 84,140, 53, 74, 47,123, 42,130,195,149,163,205,
+ 56,224,226,180,140, 74, 2, 91,149,111, 47, 0, 28, 39, 87,129,117,137,172,169,142, 4, 51,253,173,245, 25, 68,248,206,247,126,
+130,239,127,247,187,152,198, 1,224,128,233,176,195, 56, 47, 8, 97, 65,211,120,128,129,229,184, 7, 66,192, 52, 77,232, 55, 49,
+ 70,248,217,205, 4,226, 5,191,246,155, 95, 69,215,245,248,248,167,223,199,245,147, 79,240,224,245,183,241,234, 23,126, 19,251,
+151,151,104,186, 22,155,237, 57,198,113,192, 60, 79, 24,142, 7, 16, 51,136, 23,176, 4, 44,211,148, 14,108, 96,226,152, 34,151,
+109,110,154,228,229,115, 86,183,199, 48, 79,112,137,251,208, 52, 45,186,174, 67,211,118,232,251, 13,194, 50,227,207,255,203, 55,
+240, 47,255,219,223,198,107,175, 62,172,118,217,194, 2, 78,201, 94,149,160, 71,110,177,192, 86, 97, 80,197,135,172,162, 69,229,
+ 94,184, 52, 83,162,147, 21, 25,175,124,184,162,194, 51, 67, 49, 20,131,158,203,171, 42,146, 42,149, 90, 93, 35, 14,101, 28, 45,
+ 2,223,120, 21,255, 90,148,180,230,157,219,226,147, 10,200, 37,103,157,159,214, 54,117,235, 90,242, 7, 44, 29,242, 84, 16,198,
+ 54,200,196,112,239,101, 85,100,103,226, 93,222,161,231, 66, 60,138,217, 74, 26,162,203, 43, 1, 69, 98,103, 69,120,108,190, 22,
+ 78, 29,186,218, 40,163,192,121, 9, 12, 9, 65, 87, 14,250,250,115,137,225,181, 19, 51,201,171, 88, 23, 93, 35,153,255,144,139,
+ 52,170,210, 12,197, 88,175,211,217,193, 70, 72, 72,117, 64, 81,177,195,186, 74, 56,169,231,122, 66, 51,115,130, 73,145,177,177,
+101,215,140,172, 26,224, 92,212,136, 61, 67,243, 61,153, 3,202, 16,115,150, 27,232,222,218,152,244, 13,201, 45,119, 48, 36, 86,
+204, 83,118,226,213,204, 52,195,234, 89,204, 97,103,100,141, 98,101,254,167,206,102, 39, 28,109, 86,233,254,101,147, 21, 76,228,
+ 18,183,189, 14, 94,176, 98,132, 74,224,162, 39,179, 51,163,119,193,203,203,216,121,139,112, 2,252, 59, 28,167, 57, 93,240,132,
+102,179,193,126,119,131,175,252,222, 31,192, 59,194, 71,239,255, 4,207, 63,253, 4, 77,170, 48,189,119,152,151,128,113, 9,232,
+218, 22,199,113,196,121,223, 39,210, 24,161,105, 26,244,125,252,227,207, 55, 27,236,142, 3,206,182, 27,140,243,130, 97, 94,240,
+242, 48, 20, 62, 51, 69,222,187,247,141, 81,142,214, 94,220, 10, 99,106,216,194,118, 20, 70, 38, 12,196, 73,142,102,180,105, 62,
+174, 88, 82,114, 42, 94,158,200, 56, 73, 86, 40, 67,137,187,205,236, 47,164, 62,232,218, 59, 47,117, 52, 55,173, 2, 12, 80, 86,
+ 40,122,200, 82,109,201,160,207,188,212, 63,203,190,150,191, 94, 66,201,111,175,227, 13,181,235,209,132, 45, 75,162,130,238,211,
+165,218, 99, 80,213,120,103,224,144,247,126,149, 83, 45,102,186,145, 25,217, 88,217,143, 40, 15, 5,210,238,203,149, 11,134, 12,
+ 8,165,154,175,224, 84,121,111, 87,150, 44,186,223, 38,169, 47,236,106,133,150,132, 80,180,118,112, 83,250, 89, 23, 36, 21,254,
+246,219, 63,196, 79,126,244,125, 44,243,132,105, 56, 96, 24, 7, 72, 8,224,176,160,107, 91,204,199,189, 10,146, 58, 79, 56,235,
+ 26,188,220,143, 96, 14,120,240,234,155,216,180, 45,158,254,242,167,184,251,198, 59,184,251,250, 59, 56, 92, 95, 98, 58, 30,224,
+ 57,160,237, 59,236,111,174,112,249,228, 83,180, 93,135,243,179,115, 44,187,107, 76,243,108,112, 30,113, 69,198,153, 89,148, 82,
+223,180,128,115, 37,144, 38,100, 79,118, 98,122, 55, 77,180, 50,249,102,198, 52,141,170, 95,249,219,111,127, 15,191,243,207,126,
+ 11,239,188,245,122, 9, 21,194,201,224,209, 92,170,183,178,177, 76,160,142, 13,126, 73, 58,100, 21, 95,153,159, 61,173, 38,132,
+169, 8, 16, 11,150,169,224, 47,171,169,163,153,192, 40,169,220, 18,184, 73, 18, 1,209,151,139,217,144,215,114, 33, 84, 77,112,
+114,208, 76,162, 88, 22, 90,155,168,109, 53, 70, 29, 71,162, 89, 29,203,156,233,118,118, 10,145, 9,124,164, 95, 99, 17,239,145,
+209, 99,149, 98,192,142,220,157, 51, 43, 63,148,253,186,165, 19,138, 57, 83,214, 93,122,212, 90, 4, 37,173,133, 16,192,203, 82,
+180, 38,118,189,203,156,210, 3,107,241,169,230, 82,144, 17,252, 42,131,130,203,125, 66,162,104,106,177,249, 0, 73, 55, 81, 34,
+179, 45,233, 48,195,132, 88, 75,202, 42,146, 58, 9,218, 52, 14, 23,208, 14,156, 45,221, 50,103,116,152,203, 30,171,117,158, 84,
+164, 68,209,159, 81, 83, 2, 26, 10,245,170, 64, 20,226, 5,157,127,124,146,125,209, 92, 30,230, 18, 77,135,202, 94,150, 65, 14,
+146, 22,241, 69, 60,101,144,167,154,158, 90, 50,192,179,162,146,243, 8, 57,131, 16, 50, 59,155,163,122,145,172,239, 55, 18, 62,
+140, 34,152,170,145,147, 80,217, 15, 63,123,252, 12,211, 52, 96, 94, 2, 58,141, 17,140, 5,205,184,204, 88,194, 2, 97,198,203,
+231,143,241,226,227, 15,176, 59, 78,248, 87,255,238,143,240,103,255,233,255,196,166,239,163,199, 86, 24,103,253, 70,247,206,151,
+187, 29, 60, 59, 76,211,140, 22, 64,215,120, 72, 82, 4,103,192, 64, 96, 81,117,125, 16, 70,215,117,145,211,235, 91,156,157,111,
+ 35,104,129,252, 73, 58,129, 10,114,204,168,150, 20,102,111,139, 24,169, 92, 1, 69,152, 67, 85,236, 31,131,203,203, 78, 57, 58,
+ 52,122,146,243, 3,109,119,202,150,243, 81, 14, 40, 42, 52, 43,219,117,211, 74,161,175,227,246, 91, 64, 68,255, 84,176,102,165,
+ 1,147,244,108,186,106,204,133,196,185,143, 62, 82, 57,157,134,107, 7, 43, 21,104,163,188,180, 89, 77, 94,239,211, 93, 26,141,
+102,245,172, 90, 83, 18,177, 75, 76, 34, 82,106,161, 81,247,199,165,136,145, 44, 92, 90,137, 0,101, 37, 78,188,117,175, 33,181,
+ 56,207, 70, 30,231,125, 71, 25,223,210, 42, 95,193,198,111,202,138, 18, 23,127, 38,223,252,206, 15,241,254,207,126,130, 48,141,
+ 24,135, 35,198,113, 64,152,103,244,219, 51, 44,211, 21,166,227,132, 97, 90, 0, 4, 16, 9, 14,227,140, 97, 94,112,255,222, 3,
+220,189,184, 0,115,128,235, 58, 52,219, 11, 76,135,125,244,160, 55, 13,246,215,151,152, 83, 20,241,171,111,188, 5, 23, 2,142,
+135, 61, 94, 28, 15, 8, 22, 54, 73, 17, 84,227, 82, 1,228,168, 36,218, 45, 92,194, 81,154, 84, 56,121, 20,120, 17, 0, 44, 75,
+236, 96,124, 2,144, 68, 5,254,140,123,247, 31,226,155,223,158,177,252,206, 87,240,107,159,127, 39,117,129,174,112,200, 13,200,
+ 64,216,234, 36, 96,146,226,170, 61, 87, 90, 33,149, 34,206, 24, 51,112, 42,249,150, 42,183,156,224,170,149,136, 10,205,108,224,
+135, 17,146,138,152,200, 68, 64,121,233, 89, 39,225, 82, 42, 36, 76, 70,125,182,234,230,244, 51,103, 46,147, 24, 83, 92,240,184,
+121,103,203, 38,253, 15, 44,113,151, 76,171,181, 65,242,150,179, 75, 19, 9, 17, 67,233, 33,165,230, 57,228, 81,121,162, 27,234,
+133,158, 85,238,105,228,174, 84, 62,210,177,114, 46,152,156, 39,237,202,245,254,144,188, 75, 14,106, 97,203, 23,250, 18, 2,150,
+ 16,195,177, 74,206, 56, 71,194, 34, 21, 11,111,254, 82, 75, 49,145, 11, 92,115,247,144,171, 50,202, 81, 73, 75, 11,190, 58,159,
+ 71, 14,121,122,146,162,100, 29, 41, 59,196, 73, 36,105,102, 21,175, 6,204, 24, 77, 65,198,249, 50,115,244,210,167, 41, 67,222,
+157, 35, 77, 40, 2,135,114,217,155,207,171,214, 60,152,243,221, 33,118,234,162,182, 30, 54,153,221, 48,177,145, 98,252,201, 70,
+255, 46,108,246, 69, 22,198, 80,188,128, 36,133,155,157,237, 57,234, 7, 20, 59,190,103,211,221,217, 40,198,219,146,157,204, 55,
+103,198,210, 10, 58,161,178, 75,113,112, 70,253, 41,184,124,113, 9, 44, 51,132, 3,130, 35, 44, 44,240,105,132,182,164,157,204,
+249,249, 5,238,223,123,128,235,231,207,208,206, 1,191,248,209,143,225, 93, 84,247, 14,195,144,188,235,209, 39, 57, 76,179, 94,
+220, 11, 11,206,124, 28,127, 29,134, 49,141,248,227, 15,179,107, 60,230,137,177,105, 91, 28, 67,192,194,140,174,105,209,118, 45,
+222,124,253,149, 26, 77, 69,229,135, 69, 85, 91, 70,102, 85, 33,153, 51, 82,246, 87, 70,209, 46,206,146, 52,106,165,111, 25,128,
+ 20, 1, 21, 11, 27, 96,202, 74,247, 80, 5,159,100,251,124, 29, 49,170,163,234,138,107,156, 15,143, 60,125, 41, 84,187,127, 42,
+246, 58, 31,124, 26,211,109, 19,137,196,176,209,157,156,220,134,174, 88, 39,160, 24,100, 35,128,115, 84,232, 90, 58, 28,203,226,
+ 20, 72,165, 56,245,206,153, 11, 93,212, 79,190, 30,151,151,144, 26,169, 46,226, 66,130, 51, 40, 72, 99,109,178,123, 95, 73,105,
+232, 5, 0, 83,127,221, 42,190,211, 67,149,193,226, 76, 2,212, 58, 58, 52,171,240,169, 66, 18, 1,132,239,253,224,103,248,224,
+253,247, 49, 15, 7,140,195, 17,211,112, 68, 88, 22,108, 54, 27,236,174, 95, 98, 9, 1, 36, 1,144,120,112, 58,223,224,149,215,
+222,194,205,213, 11, 76,199, 29,252, 43,175,226,250,209,135,232,250, 13, 8,130,241,176,199, 60,141,160,182,195, 60,207, 56, 63,
+187, 64,152, 71, 60,125,252, 40, 49,243,163,181,175,113,132,222, 59, 4, 0,115, 16, 12,204,198,157,224,208, 55, 30,189,247,145,
+221,208, 52,240, 77,171,207,151,107, 26, 77,207,202,222,118, 24, 25,160, 48, 99, 26, 71, 92,189,124,129,101, 89,240,183,223, 28,
+112,125,117,141, 47,127,249, 55,208,119,157,122,177, 19,141,163,176, 7, 80, 67,234,164,114, 9, 38,127,182, 18,211, 82, 98,151,
+208, 45, 98,221,245,254,100,205, 56, 55, 14, 4, 3, 38,114, 54,108,135,236, 36, 46, 99, 40,162,253,138,243,120,157,106,106, 39,
+115,178,166,101,102,190,121, 29, 56, 20,184,140,173,120,173,207,157,115,179, 38,197, 41, 83, 9,254, 40,138,166,153, 56, 22,209,
+ 41,144, 36,251,184,137, 83, 66,166,148, 56,208, 12,193,129, 0,190,241,133,193,110, 2, 92,132, 11,112,201, 37,230,124,200, 93,
+ 44, 10,223,157, 67,134,204,164, 29,122, 10,221, 90,194, 2,201,206,144,164,142,215,120, 92, 5,170, 69,106,168,230,142,195,233,
+215, 16, 47,246,172,181, 49,232, 89, 33, 35,134, 45, 97, 70,122,105,235, 68,194,229, 13,111,130, 40,145,209,232, 24, 10,158, 81,
+237,231,159,133,168,192, 47,130,116,178, 88,208,158,165,250,223, 39,193,119,158, 16,148, 2,159, 75,129,105, 86,122,141,118,180,
+ 82, 7,120,232,135,154,187,131, 12, 4, 0,213, 25,150, 40,157, 75, 57,175,202,152, 81,244, 67, 65, 5, 97,176,236, 24, 89,137,
+142,132,172, 18, 20, 56,217, 18,138, 20, 60, 30, 23,117,124,174,248,236,145,198, 18, 31,196,236, 67, 12,203,144, 60,179,169, 82,
+228, 8,199, 0, 16, 65, 13, 0, 94, 92, 62, 7,253,224,239,113,255,205,119,113,239,213,215, 16,210, 14,135, 57,118,216,158, 8,
+ 75, 86, 88, 58,143,214,121, 92,108,183,241,242,110, 35, 62,214, 57,143,101,154, 19, 54, 54, 22, 75,125,219,226, 48, 45,209,206,
+145, 40, 90, 93,191,137, 99, 66,177,138,126,174,108, 72,197,227,105, 21,153, 6,120,177, 82,109,231,155,208, 33,134,183, 72, 22,
+252,172,186,220,242,247, 82,129,102, 50,193,169,236,132, 11,102, 75,196,197,112, 20,161,138, 75, 15,171,189,226,149,183,213, 74,
+149, 20,109,250,143,229, 92, 73, 90, 35,212, 86,155,124, 49,186,170, 27, 39, 77,128,210, 24,113,163, 80,119, 84, 95,220,209, 18,
+ 71,133,217,158, 86, 51,100, 96, 44, 90, 17,195,140, 48,205, 88,214,173,197,238, 21, 8, 82, 42, 59, 89,241,145,138,201, 44,136,
+ 7, 2,155,223, 75,199,171,167, 90,122,163, 27, 41, 5, 26,107, 39,200,137, 58, 71, 38, 87,186,236, 67, 8, 43, 68, 46, 4, 31,
+125,252, 4, 63,249,241, 79,112,253,242, 57,198,225,136,101,153, 49, 7,198,102,179,193, 97,119, 29, 19,161, 56, 96, 90, 22,244,
+125,143,109,123,129,155,151,151,120,242,232, 67,188,245,185,247,112,245,244, 17, 14,207,226, 72,125,216,221, 32, 72,252, 26, 66,
+ 8,216, 54,130,109,215, 98,183,187,214, 40,215,141,119,240,206, 35, 48,227, 24, 56,118,255,233,235,108,189,195,182,105,209,184,
+180, 67,119, 81, 16, 55, 47, 11,134, 16, 32,227, 8, 2,161, 73,163, 89,151, 46,175,184, 99,143,239, 95,164,209,121, 52,109,116,
+134,132,101,193,254,230, 10,211, 56,224,251,243,130,159,252,236, 23,120,239,215, 62,135,127,241, 59, 95, 69,219, 54,169, 72,229,
+106,181, 98, 26, 95,115,161,145,217, 91,151,236,237,245,127, 79,107, 92,109,189,139,169, 82,221,116,205, 98,243,192,237,207, 41,
+ 55, 51,153,116,150, 46, 42, 73,221,104,158,164,230,175, 49,243, 22,188,203,239,188,121, 15, 76, 96, 84,213,111,170,107,197, 30,
+192,101,242,102, 87, 99,122,162, 74, 14, 66, 98, 93,195, 58,163, 15,136,159, 67,116, 64, 9, 73,180, 97, 38, 75, 35, 25,145,109,
+254,246, 66, 66, 10, 3,156,192, 48,208,166, 42, 98, 84, 11, 14,118, 89, 34, 28, 76, 16, 47,253, 37, 4,204,115,156,168,194, 85,
+ 47, 73, 58, 31, 68, 27,149,220,165,115, 90,179,185, 85, 99,201, 21, 32,174, 64,183,156, 35, 80,138, 64, 45, 18,157,248,193,229,
+252, 44, 42,177,159, 39, 50, 76, 93, 69, 48,148, 79,191,126,175,115,102,124,214, 19,100,219,158,141,162,118,100, 83,175, 87,182,
+ 84, 70, 37,237,204, 98,247, 70, 76, 72, 72,161, 30,145,170, 1,201,132, 81,139, 33, 5, 81,218,127,159,136, 77, 50,140,160,196,
+186, 87,123,218, 60,100, 39, 89,147,185,168,136, 51, 36,255,249,166, 18,204, 86, 55,138,157, 83,109,235,177, 95, 3,167,126,167,
+ 28,244,249,207,185,186,138,251,116, 79,241,144, 24,166, 17, 14,192, 24, 2,186,156, 57, 76,130,179,126,139,166,237,241,252,209,
+199, 24,166, 17,219,205, 6, 23,103,231,104,251, 22,199,195, 17,228, 61,198, 57, 94,216, 93,219, 68,251, 77,250,138,142,227,168,
+149,215,107,247,238, 97, 14, 1,227, 28, 71, 43, 49,152, 32,232,194,173,241, 13,154,166,143,159,119,144, 34,208, 48,215, 96,180,
+ 18,186,146, 11,153,194, 85, 40, 77, 32,156,121, 81, 43, 21,117,201, 54, 51,236,145,244,123,235,100, 72,106, 49, 79,250,156,217,
+ 94,240, 82,160, 42,185, 58,140,121,191,197,182, 6,235,101,117,198, 54,164,193,147,174, 22,197,177, 29, 61,202, 73,103,185,182,
+140, 89,119, 4,161, 88,238, 74, 20,171, 33, 21,138,177,122,229,245, 59,139, 78,127,212,155,190, 18, 54, 89, 31,107,182,154, 56,
+202,128,204, 98, 39, 90,153,202, 74, 49,201,197,135,107,195, 82, 78, 85,162, 54, 44, 61, 33, 84, 43, 79, 48, 21, 27, 94, 69, 35,
+ 77, 19, 4, 69,242,214,218,134, 18, 79, 91,235, 22,204,137, 0,128, 48,140, 19,190,243,247,223,195,203, 23,207,176, 76, 35,166,
+101, 6, 68,224, 73,112,184,185, 6,135, 37,173, 97, 28,206,206, 47,112,184,185,193,205,245, 21,222,120,235,115, 56,220,188,196,
+241,249,167,145,134,120,216, 99, 97,142,128,140,116,194,220,187,123, 15,215, 55,215, 74,203,186,104, 91,176,196,240,164,221, 60,
+235,133,209, 57,135,179,166, 85,148,169, 35,135,153, 25,199,121, 49,145,194,241,103,216,100,229, 63, 11, 22, 65, 76,169,226, 56,
+165,240,236, 65, 46,192,135,120,169, 79, 97,137, 26,149,166,137,151, 53,185, 56,101, 8, 14, 31,124,240, 49, 62,126,244, 4,255,
+230, 15,254, 37,238,223,191,155, 88, 25,245,138, 75, 42, 48,146,171,197,193,100,125,235,174, 46,102, 5, 56,101,192,166,174,222,
+ 57,243, 62,148,130, 91,179, 26,108, 12,236, 42,250,215,145,141, 66,166, 42,236,164, 4,127, 68,113, 25, 12, 31,132,212, 34,102,
+ 69,158, 38, 4, 64,145,183,180,138,174,205,131,123,152, 68,178,162, 93,137,235,187, 50,141, 99,137,239, 54,167,113,116, 94,183,
+ 74, 48,185,237,121,198,202,101,202, 17,210, 89,199,156,104,114, 32,132,176,104,206, 66,190,204, 67,186,188,243,191, 11,204, 8,
+105, 4,175,239,195, 42,118, 52,167, 88, 66,193, 44, 81, 92, 35,169, 9, 83,144,147, 38, 32,202, 41, 13, 21,206, 20,215,229, 51,
+ 32, 42, 14,129,188,150, 35, 71,137, 36, 32, 22,198,161, 77,175,238,195,243,217,146,190, 55, 97, 54,233,111,164,118,188, 16, 88,
+ 5,177, 46,209, 72,117,200, 79, 48, 26,166,178,122, 22, 13,155,202, 43, 73, 78,163, 81,169,253,185,146, 59, 46, 97, 48,101,217,
+ 77, 26, 87,216,124,111, 61, 78, 68,199,153,105, 11, 18, 63, 60,142, 43, 71, 29, 45,164,191,178, 47, 49,163, 10,171, 10,197, 84,
+105,156, 84,144, 72, 99,148, 92,245,136, 90, 29,160,255,173,253,117,202, 11,102,209, 17,204,179,103, 47, 32, 97,142,190,215, 84,
+189,206, 97, 65,147,136,111, 89, 18,226,154, 6,211, 60,162, 61,191,192, 89,215,197, 12,109, 34, 60,184,255, 70, 84,219, 54, 13,
+186,166, 69,227, 61,142,195, 17,141,163, 20,179,234,209, 54, 49,209,237,238,197, 25, 22,102, 28,198, 81,171, 48, 0,184,179,237,
+ 83,215, 17, 69,114,219, 77, 15, 9, 5,139,200, 66, 9, 98, 33, 21, 85,170, 56,107,216, 84,141, 82,232,101, 40,248, 85,210,125,
+184,152,201, 71, 26,163,173, 60,225, 2,169,146,140,128, 98, 35,129,225, 5,104,149,186, 2,240,211,138,122, 67, 44,229,217,224,
+162,220,172,190, 80,181, 42, 22, 91, 90, 62,184, 52,109,221, 36,166, 72,122,162,157,134,113, 20,176,140,133, 37,101,106, 22, 57,
+ 42, 89,241, 34,149,123, 67,253,168, 98,144,185,142, 44, 85,216, 68,200,102, 11, 27,175, 77,104,171,201, 17,110, 9,251,226,146,
+ 3, 77,101,167, 70,245,183,166, 5,119, 84,227,150,142,144,141,125, 40,167, 58,149,149,103, 26,149,234,178, 46,117,240,156,159,
+247,180, 23,102,210, 76,244,124, 89,254,191,255,223,215,240,236,241, 35, 0,130,113, 28,227,179, 18, 34,196, 99, 9, 81,204,185,
+ 57,187, 64, 96,198,225,250, 37, 88, 2, 62,255,235, 95,194,225,242, 41,156, 48,166,105,194,241,176,199,148,224, 23,173, 35,116,
+ 93, 11,231, 28, 94, 94, 95,195, 59,143, 77,219, 97,211,118,184,158, 3,174,199, 9, 1,192,198,123,220,239, 58, 60,232,123,156,
+183, 45,188,143, 95,215, 20, 4,135, 37, 96, 10,113,154,197,202,216,167,204, 61,139, 59, 84,112, 17, 76,165, 17,237,180,204,105,
+ 36, 11,180, 93, 3, 79, 64, 67,130, 6,140, 6,130,105, 28,112,115,245, 18,187,155,235, 4,172, 25,240, 23,127,249, 13,124,244,
+209,227, 40, 44,115, 69, 56, 25,193, 84, 86, 26,194,229, 0,183,244,185,106, 86, 79, 53, 34, 81, 12,195,195,213,123,245,252,107,
+178, 37, 46,171,195, 93,186, 24,200,229, 83,219,196,105,106, 23,204,105, 74,145, 47, 20, 73,227,120,203,114, 79,104,106, 42,116,
+ 50,231, 10,177,161, 36,186,213, 64, 8, 21, 59,167,231, 72, 68,192,224, 52, 58,151, 34, 99, 20,251,238,230,160,167,210, 80,112,
+ 58,249,203,136,217,174, 86,115, 98,121,137,244, 45, 43,121, 50, 32,149,116,118,101,165,251, 74, 20, 23,145,176, 33,141,217, 85,
+217,107, 34,160,243,241,197,224, 16,140, 69, 47,255,112,210, 29,162,239, 79,189,102,164, 21,220,153,140,143, 62, 83, 75,165,130,
+164, 82,181, 30,181,104,182, 8,136,225,164,203, 65,177, 49,138,164, 32, 43, 11, 65,238, 0, 0, 32, 0, 73, 68, 65, 84,154, 66,
+248,206, 95, 83, 8,172, 26, 47,164, 64, 27,214, 2,128,205, 29,154, 11,183,236, 14,200,112,158, 36,182,203, 55, 58,107,252, 94,
+241,203,177, 42,230,226,101, 46,137, 18,167, 29, 64, 76,176, 79, 85, 2,167, 31,116, 26,107,114,124,232,152, 74,197,146, 15, 28,
+145,242, 82,208,106,127, 32,146, 65, 3,171, 11,158,139,106,177,144,131, 68,255,251, 58,149, 7,234, 25,143, 95, 98,252,119,203,
+ 56,193, 19, 48, 47,179, 73, 72, 3,230,101, 73, 31, 70,252, 90,135,253, 13,154,126,131, 39,143, 31,225, 95,255,209,191,199,112,
+220, 99, 9, 11,118, 55,151, 58,234, 90, 66, 12, 18,216,244, 61,188,247,233, 66,111, 49,135,128,243, 77,143,203,235, 29,246,195,
+128,190,237,146,208, 1, 24,151, 5, 11, 71,191, 59,136,208,182, 45, 94,127,237,161,241,252,231, 14, 78,170,233, 93,190,120, 41,
+ 15,146, 51, 36, 70, 44, 55, 67,140, 13, 66, 20,188, 64,149,210, 58,223,180, 57, 39,220,172, 60,140, 26, 84,247,228,234,177,148,
+178, 15, 54, 93, 58,192,170, 32, 39,148,157,185,133,159,104,231, 0,171, 52,207, 62,209,228,228,207,227,255,244,156,229,157, 98,
+ 17,113,202, 9, 61,150,196, 8,192,202,196,178, 78, 28,163, 98,105,212,131, 56,129,137,156, 6,197,216,253,162,232,193, 70, 68,
+198, 45, 0,107, 82,186,157, 12,154,167, 84, 82, 2, 85, 88,194,201,129,193, 22, 94,193, 69, 79, 2, 75,254,226, 36, 70, 69, 41,
+ 94, 65,162,239, 94,190,232,171,255,203, 41,128, 40,226, 40, 6, 39, 98, 84, 60,252,255,228,207,254, 43,158, 63,125, 4,114, 62,
+249,209, 69, 59,159, 41,165, 91,121,231,112,125,117,137,105, 28,112,255,213, 55,112,126,113, 23,215, 79, 31, 65,194,130,225,120,
+196, 28, 2, 56,173,170,130, 48,218,174,199,126, 24, 83, 87, 24,223,129, 67, 0,218,139,187,184,127,126,142, 59, 93,139, 51,231,
+208,186,242, 51, 8, 16, 12, 75,192,176, 4,204, 34,152,153,181, 25,200, 7, 99,144,252,164,150, 34,206,185, 56,150,109,154, 6,
+103, 23, 23,184,123,113, 7,189,143,137,106,211,188, 96, 10, 1,199,105,198,113, 90, 48, 6, 70,219,120, 48, 7,140,195, 17,251,
+253, 13,134,195, 1,195,241,128,111,125,231,123,248,232,195, 79, 43,123,172,152,143,190, 16,177,120, 5,235, 65,157,101, 43, 43,
+243,165, 83, 23,237,233,226, 35, 51,198, 83,145,160,180, 65,117, 8,185, 4,243,178,230, 4, 87,197,170,218,100,181, 28, 10, 66,
+228, 42,215, 68, 14, 4,137,151,125,114, 53, 85,213,116,214, 78,229,166, 42,142,213,203,115, 36,149, 86, 55, 95, 82, 76,108,172,
+203, 40,182, 53, 41,131,167, 16,226,229,239,114,177,196,169, 68, 79,205, 33, 88, 42,204, 41, 17, 21,144,138,115,218, 61,179,100,
+ 63,122,217, 59, 71,190,251, 82,229,141,147,201,248,144, 52,245,202, 13, 36, 57, 82, 31,191,162, 54,210, 61, 64,169,112, 17,219,
+140,164,238, 59,135,216, 84,180,193,138,180, 76, 26,121,234, 12, 68, 32, 94,178,241, 11,200, 2,183, 2,136, 33,157, 82,229,221,
+122,154, 39, 40,254,149, 67,252,124,179,181,150,243,221,202, 5,150, 85, 38,127,165,105,203, 23,125,201,148, 79,108,194,108, 89,
+179, 29, 69,238,248,216, 40,135,237,193,149, 95, 0, 49, 62, 76,205,186, 77, 47, 41,153, 14, 45,143,221, 89, 88, 35, 61,197,236,
+ 55,212,183,201,185,234,227,242,178,217, 14, 60,193,250, 97, 46,118,189,204, 13, 85,168, 68,145,139,126, 24,251,235,107, 72,218,
+215,177, 48,150,144,149,148,241, 80,117, 46,138,229,238, 62,120,136,174,105,240,251,127,248,111,241,183,127,246,159, 0, 56,156,
+157,157,227,234,230, 10,141,247,216, 31,227,101, 45, 64, 60, 96, 54, 27,204, 75,226,186, 51, 99,152,163, 29,104, 89, 66,154, 10,
+196, 29,224,113,154, 49, 45,241,240,241,222,163,235,183,248,220,187,111,172, 8, 77, 84, 35, 62,211,136, 70,125,136,249, 66, 62,
+225,159, 72, 97,166,234,216, 92,180,179,103,243, 50, 86,240,126, 27,244, 98, 87, 36, 34,230, 51,204,248,215,194, 41,135, 77, 77,
+202, 42,219, 28,234,192,214, 82,184,202,205,227, 2,192,203, 51,207,220, 45,169, 67,146,211,215,158,198, 19, 42, 30, 73,128,163,
+ 50,181, 16,131, 95,189,237,150, 53,140,123,148,106, 25,230, 48,208,252,244,172, 86, 79,130, 36,114, 84,225, 63,203,141, 91, 47,
+ 71,226, 58,162, 60,223,101, 85, 37, 74,212, 83, 72,132,157,192, 19,233,170,137,114, 30,114,122,223,242, 40,148,149,135, 45, 58,
+ 5, 81,205,139, 80, 61, 50, 48, 5, 92, 81,208,150, 78,228,107,223,248, 46,158,124,242, 1,230,121,198,241,176,131,132,128,182,
+109, 49,207,115,180,133, 57,135,160,153,232, 11,222,124,231,115, 56,222, 92,129,199, 35,230, 33, 94,230, 89,164, 39, 28,192,169,
+184, 61, 12, 3,188,139,171, 36, 52, 29,250,123,247,113,209,183, 24, 94,190,136, 97, 71,204, 96,223,192,109,206, 32,109,135, 57,
+196,103,162,115, 30,157,247,216, 52, 13, 90,231,224,157,131, 87,194, 95, 28, 39, 54,142,208, 38,212,167,243, 13,182,103,103, 56,
+219,110, 32, 97,193,238,230, 10, 87,215,215,184, 25, 70, 48, 3,203, 56,162,129,195, 89,223,227,124,179,193,249,102,139,190,235,
+113,126,118, 17, 5,116,195, 17,199,227, 30,199,227, 30,227,120,196,119,191,255, 35, 60,123,246, 98, 69, 21, 43,123, 95,150,168,
+ 91,200,150, 46,125,166, 13,250, 64,110, 1,253,104, 33,187, 26,231, 56, 41, 28,247,180,144,133,165,165,171,136,212,228, 49,100,
+245,120,134, 15,145, 41, 21,114,186, 29, 81, 89,217,197, 11, 45,196,103,215,213,111, 67,121,246,216,164, 46, 82,217, 4,169, 11,
+ 89, 84,178, 76,246,204,200,255, 36, 63,235,149, 5, 90,212,229, 17,199,231,133,141, 33, 44,197,111, 46,208,220,115,152,145,123,
+ 14, 59,202,133, 70,214, 47,229,115,108, 73,214, 53,187,158,172,168, 20, 5, 28, 31, 59,244, 84,236,136, 80, 5,105,202, 81,171,
+169, 94, 54,199,128, 17,225,210,109,252,130,136,241,181, 14,133,248,243,112, 37, 14, 57, 29,110,249,235,207,182, 89,123,135,129,
+217,216, 54,169,106, 74, 45,192, 70, 12,179,192, 90,250,226,123,205, 90,184,229, 21, 75, 30,229, 43, 11, 30,159, 65,209, 42, 52,
+ 44, 89, 69,172,154,238, 15, 82,141, 64, 44,228, 50,119, 95, 86, 68,103, 81,159, 86,248, 84,252,209,198,219,158, 5, 42, 54, 49,
+ 76,125,139, 69, 84, 0, 29,221,151, 70,148,101,253,239,226,215, 18,150, 17,135, 97, 68, 8,140,253, 48, 34,112, 76, 87,155, 67,
+192, 52, 47, 8, 34,232,218, 6,199,253, 1,151, 47,158,227,187,223,252, 26,190,252,187,255, 29,218,198,225,221,247,126, 19,195,
+ 56,193, 59,135,182,241, 32, 31,227, 82,135,113,194,126, 28,225,189,195,243,171, 43, 44, 33,224,172,239,113,115, 60,162,239,218,
+232,245,101,198,113,156,112,214,181, 24,230, 5,219,174,141, 60,107,223,192, 27,160,142,172,195, 36, 12, 76, 71,147,211,196,226,
+ 96,165,176,225,171,157,109, 25,185,137, 88,223, 62,173, 58, 13,169,254, 34, 35,248,144,106, 23,155, 70,107,153,230, 32,208, 78,
+ 95, 42, 97, 25, 85,129,187, 57,183,220,162, 56,173,255,180,172,105,160, 63,103,253, 89,243,138, 63,175, 5,129, 73,109, 74, 80,
+ 33,155,166, 4,170, 87, 22,122,121,230,209,252, 74, 37, 79,171, 13,146,176,161,247, 85,197,129, 9,150,176, 9, 51,171,240, 7,
+251, 82,150, 44,116,147, 1,107,119, 31,149,106,134, 84,192, 94,185,218, 88,140,166, 32, 21,182, 40,164,176,147,177, 40,103, 49,
+ 83,249,210,255,230, 27,223,197,207,127,250, 35, 28,142, 71, 44,243,132,113, 56,162,237, 55,184, 73, 49,170,228,188, 30,164,227,
+ 60,227,205,183, 63,135,253,203, 23,144,121,194, 60,141,113,228,157, 56, 18, 99, 88,208,111,182,224,101, 81, 71,138,184, 22, 3,
+ 8, 15, 31,220,199,254,249, 19, 44,211, 17, 65, 4,205,246, 2,226, 28,194, 60, 99, 57, 30,176,140,137, 20, 39,121, 69, 35, 32,
+230, 56,194,247, 30,173,247,232,124, 74,112, 19,192,119, 27,156,221,189,135,182,233, 16,150, 5,187,155, 27,140,195,136, 37,193,
+156, 28,128,251,119, 46,176,233,123,244,141, 7,230, 17,251,221, 14, 87, 87, 47,241,226,197,115, 60,123,250, 4,151,151,207,245,
+193,152,167, 9,211, 56,226,176,223,227,112,216,227,107,223,248, 14,110,118,187,250, 98, 86, 47, 54,116, 37,132, 42,222,248, 51,
+ 28,152,166, 98,147, 28, 14, 66, 6,231,236, 74, 83, 68,134,173, 76,118,173,162, 13, 12,233,132, 49, 95, 80,118,251,123,242,231,
+229,142,143,163,118,231, 4, 46,195,208,125,120,149, 16, 71,229,140, 86,136,149,148,228,199, 50, 85,173, 61,252,146,108,156, 36,
+ 84,133, 13, 81,102, 2, 88, 10, 31, 21,119, 84,190,240, 0, 74,157,108, 33, 47,178, 97,154,151,176,165,216,253,115, 88, 37, 36,
+ 90, 61,132,190, 99,162,182,225,146, 56, 39,122,153, 26,178,217,103, 5, 49,214, 59,180,117,161, 70,162,220,150, 66,247, 19,117,
+171,144,130,112, 66, 37, 30,204,177,228, 34,130, 32, 92, 29, 39,121,100,174,167, 81, 62,223,133,203,207, 34,189,203,246,114,207,
+197,143,242,224, 77, 19,150, 45,185,192,106, 67,174,192, 25,172,124,223,107,216,162,148, 75,164,206,220,206,163,220,184,215,131,
+144,217, 85,202,237,118,100, 49, 23, 68,222,165,165,110,133,243,120,118, 53,130,207, 15,131, 29,201,219,127, 47,105,204, 1, 8,
+174, 47,175, 49, 78, 35, 68, 24,195, 28,213,190,251,113,196, 56, 47,152,142, 71,221,123,180, 77, 3,159,118,227,158, 25, 31,252,
+236,199,184,184,123, 15,111,188,243, 57,156,111,183, 24,166, 49, 2, 69, 24, 88,194, 2,239, 29,166,105,196, 60,207, 49, 58,210,
+ 69, 1,219,221,179, 45,250,182,197,238, 56,164,116, 42,159,186, 20, 96,152,131, 2,104, 56,119,212,246,251, 2, 42,168,122,158,
+ 80,208, 58,104, 7,167, 64,139,181,191,155, 84,189, 27,199,221, 66,230, 98, 68,193, 64, 74, 21,221,122, 90, 48,137, 86,241,208,
+ 5,164,100,173, 4,151,145,175, 85,205,230, 76,106, 34, 46,230,100,152, 28,118, 38, 84,205, 0,213,198, 43, 93, 54,223, 74, 32,
+ 76,149,113,114,102,104,231, 46,102,183, 69, 69, 60, 67,169,171,129, 35,152,184,131,117,136,212, 42,196,133,203, 81, 74,182, 61,
+147, 50,169, 16,138,163, 73,182,188,117,169,145,174, 10, 91, 40, 0,167,147,193, 2,173, 52,109, 98,197,140,229, 67, 34, 99, 97,
+129,161, 77,157,232, 81,210,215,247,221,239,255, 12, 31,188,255, 51,236,118, 59,132,101,193,241,120,192,230,236, 28,135,221, 13,
+ 66, 8,104,115,118,249, 60, 97, 90, 22,188,249,230,219, 56, 94,189,192,124, 60, 32,240,146,222, 63, 6, 9, 99, 22, 65,223,182,
+152,166, 17, 1,192,152,106,135,166,235,176,113, 14,215, 79,159, 64, 64,104,206,238, 64,136, 48,238,111,208,128,112,214,117,216,
+110,207,177,233, 55,232,189, 67,227, 26, 56, 23, 89, 14, 33,143,219,211, 14, 20, 0,154,190, 71,223,181, 88,166, 17,187,171, 75,
+112,152,226, 14,158, 98, 62, 3,165,174,222, 65, 48, 29,143,104,136,208,247,155,168,160, 71,185, 28,200,123,156,157,109,209,182,
+ 29,154,182, 41,105,115,227,128,225,176,199,112, 56,226, 47,255,250, 91, 24,231,229,244, 76, 34,203,146, 41,190,233,178, 97,151,
+210, 80,243,202,169, 78,174,176, 12, 76, 71, 95,235, 46,164,164, 78, 82, 1,125, 41,190,152,138,182,128,200, 14,194, 45,179,162,
+116, 91, 10,151,201, 73, 99, 57, 59, 67,138,146,222, 72,114,138,184, 54, 15,237,180,129, 74,151,138,153, 58,101,173, 65, 12,145,
+177,122,215, 50,137,117,229, 27, 73,143, 42,233, 26, 47,239,233, 3,135, 18,173,154,206,173,188, 54, 18,102,240,194,186,170, 84,
+245,186,148, 73,197,237, 78,159,172,179, 10,177,159, 38,186, 21,195, 44,107,122, 94, 14,178, 89,141, 50,244,231, 69, 98,250,163,
+122, 82,162,209,199,249,116,160, 50, 86,207, 14, 4,170, 80,234, 41,112, 69,162,126,130,171,177, 57,233, 72,255,228, 78,203,250,
+164, 60, 94,207, 83,105,102, 93,111, 75,186, 35,197, 52, 95, 78,231,244, 42,140, 40,129,238, 98,199, 97,102,240, 88,143,106,205,
+ 95,182, 99, 72,157, 69, 76,245,130,178,219, 9,184,229,128,151,117, 54,139,238,230,245, 80,229,248, 96, 16,151,106,141,147, 93,
+224,116,183,158,146,125,236,131, 76, 64, 8,130,253, 16,115,119,243, 38,229, 85, 7, 60,236, 60, 46,175,119, 56,142, 17,152,113,
+ 28, 6,204, 33,224,247,254,240,223,226,249,147, 71,248,194,151,127, 27,255,240,245,191, 68,219, 54, 24,198, 25,227,112, 68,183,
+233,177, 44, 1,111, 60,184, 15, 2,225,226,236, 60,141,217,163,128,227, 56, 78,232,187, 46,121,157, 9,195, 50,163,111, 27, 85,
+163, 70, 58,157, 55,194, 21, 75,222,147, 19, 57, 86,113,247,137, 33, 57,161,130,138, 16,234,108,123,210, 81,112, 57, 72, 68, 87,
+ 27, 48, 15, 80,217,157,155,180, 2, 3, 9,145, 42, 43, 60,238,110,114, 71,207,102,212, 91,214, 36,106,129,225,210,149, 41, 58,
+133,172, 79, 36,137, 47,197, 6, 24,149, 16, 33,155,169, 12, 42, 66, 76,189,208, 83,198,122,222, 61,234, 40,172,194,126,186, 26,
+152,170, 47, 52, 85, 54,150,252,189,228,100,167, 92, 68,158, 52,229,108, 18,226,136, 53,230,189,120,221,227,115,105,115,172, 75,
+ 10, 27,107, 17, 39,171,247, 71,199,246, 96, 48, 37,129,106, 74,137, 98, 42,251,243,172,158,205, 5, 85, 62, 66,242,158, 61,127,
+141, 63,127,255, 67,252,240,251,223,199,213,213, 75,128, 8, 75,152,209, 52,109,244,165, 79, 3,186,205, 89, 28,111, 46, 51,230,
+101,193,195,251, 15,113,188,190,196, 52, 28, 32, 18, 16,183, 82,113,231,237,155, 22, 78, 68,147, 13,145, 46,228,123, 15, 94, 5,
+141, 49, 88,165,191,123, 55, 78,116, 14, 59,108,157,195,214, 57, 56, 48,102, 14, 88,230, 17, 28, 22, 48, 57, 80,219, 70, 43,154,
+243, 49,147, 65, 98,146, 34, 59, 66,211,122, 56, 94,146,200, 40, 62,169,115, 16,204, 75,236,204,183,109,139,109,215,163,107,218,
+ 84, 56, 50,230,241, 24,129, 44, 93,143,195,188, 96, 14, 1,129, 3,134, 97,192,213,203, 43, 12,199, 61,134,195, 1,243, 52, 96,
+154, 38, 76,211,136,105, 28,176,223, 95, 99,191,223,227,219,127,247, 15,177,115,188,141,122,156,215, 47,170, 69, 17,179,124, 97,
+179, 43,173, 79, 68,130, 96, 61,209,173,218, 34, 49,115,126,179, 58,203, 10,235, 12, 2,163,204, 96, 55,190,120, 89,173,201,178,
+144,151,188, 91, 37, 29, 20,153, 90, 70, 13,171, 67,136,139,160,139,145,119,234,146,118,231,102, 13,154,254,191,110,162,148, 10,
+ 96,220,123, 84,254, 60,251,103, 84, 49,168,129, 13, 25, 45,218,236,178,229,140,153,177,240,130,133, 23, 29,155,215, 20, 58, 87,
+ 93,164, 54, 67, 33,239,145,163,177,160,168,225,237,250,144,185,228, 33,219,156,139, 83,229,107,153, 56,147,100, 28, 58, 85,142,
+ 8,170,224,246,233, 66, 79, 98,190,180,127,176, 67,189,244,245,177, 2,134,200,124, 38,150,194, 42, 82,235, 54, 56, 79,220,114,
+144, 77,234,146, 88,127, 30, 89,148, 83,158, 55, 78,162,185, 70, 76,176, 64, 29,228,158, 43, 77,135, 42, 63, 37, 67,240,197, 98,
+ 31,202,161,196, 82, 98, 9, 21,148,146, 98,236,140,213,206,192,100,204,152,223, 0,103, 42,240,140,225,108, 71,156, 97, 13,119,
+200,251,123, 74,182, 10,114, 25,115, 36, 74, 74,186,115,231, 2,104, 26,204,204, 81,185, 11,224, 66, 24,109,223, 34, 4,198,217,
+ 50, 97, 63, 12,184,216,196,196,168,121, 89,240, 15,223,252,155,184, 35,223,239,128,126, 11, 55, 12, 8, 28,240,246,123,191,137,
+182,235,113,125,253, 35, 60,125,121,165,255,125, 16,134, 35,194,211,171,107,108,186, 14,135,113,192,166,111,209,181, 61,134,155,
+ 29,188,243,104,189,128, 41,142,238, 95,127,237,129,126, 10,134,143, 83,162, 83, 13,199,194, 38,220, 73,206, 97, 38,195, 46, 95,
+119,240,148,247,220, 43, 46,201, 42, 99, 85,227, 5,141, 86,148,205,115, 91, 71, 74,167, 36,190,138,111, 92,246,233, 48, 97, 58,
+153, 44, 37, 32, 56, 70,228,110,155,128,137,188,185,203,208, 59,202,187,127, 74,121,240, 72,136, 71, 94, 73,203, 45,141, 45,195,
+144,210,231, 46, 78,177,121,233,243,114,154,138, 37, 84, 91,145,180,235, 49,104, 79, 29,119, 26,181, 56,153, 67, 2,171,144, 8,
+ 73,214, 32,210,194,169,236,239,213,159,110,194,116,212,118, 35,171,235,163,202,156, 55,211, 6, 18, 5, 40,145,208,137,151, 63,
+ 23, 77, 21,229, 46, 85, 67,159, 62,125,134,239,124,231,239,113,121,249, 2, 77,211, 98,158, 71,117,130, 28,246, 55,104, 55, 91,
+ 44,243,132,227, 97,135, 16, 22,220,191,184,131, 48,236,177,204, 83, 58,128,227, 15,127,102, 70,215,246,152,231, 49,122,209, 5,
+224, 16,119,183, 15,239,220,195,112,184,129,107, 59,200, 50, 99,188,190,194,182,237, 33, 68,152,194, 18, 47,238,110, 19,247,237,
+ 68,144, 16,253,233,203, 60, 33,132, 25,194,130,182,245, 24,153,209,251, 6,115, 16, 28, 23, 78, 59,250, 8,115,106, 40, 22, 15,
+ 89,180,187, 44, 11, 28, 17,186,182,129, 75,158,244,101,158,225,198, 17,139, 0,247,239,222,211, 56,202,105,153,177,204, 35, 70,
+ 8,218,174,199, 52,207,104, 27, 96, 89, 22,213, 14,121,127,131,143, 63,121,140,151,151,215,120,248,240,190,126,142,186, 66,215,
+236,136,204,101,119,102,221, 71,154,109, 47,176,172,112, 3,124,164,245, 88,173,198,208,105,114,155,185,134,243,197,226, 50, 97,
+178,132, 31, 40, 1, 79,183,141,102,151,141,213,182,217,194,143, 96,172, 81,180,226, 58, 87,241,197,122, 89,179,218, 64, 53,105,
+147, 36,230, 77, 16, 43,122, 90,181, 29, 46, 59, 85, 5,118, 7,151,237,117, 75,154,196,184,100, 1, 19,182, 14,158, 56,182,206,
+ 99,243, 92, 92,151,247, 39,107, 95,204,121,151, 10,249,194, 67,119, 74,180, 67,230,160,152,152, 47,169, 33, 4,213,148,179,184,
+ 77, 82, 38,125,162, 87,194, 17,136,163, 16,147,217,213,170,120,100,184, 85,178, 14,170,174, 33,138,195,243,212, 89, 9,114, 84,
+138, 40, 72, 89, 93, 32,195,217,108, 1,196,198,125,148, 97, 56,186,206, 54,201,146, 38,125, 82,139, 46, 73, 68,185,234, 56,170,
+ 86,126,178, 2,122,166,165,190, 55,163,119, 75,116,179,207,174,161,141, 17, 78, 3, 20,100,253,123,139, 17, 59,201,169, 3, 87,
+107, 65, 46,161, 20,100,252,197,209,107,201,241,161,171, 70,216,230,235,112, 62, 93,172, 13,102,153,209,119, 45,218,198,193, 59,
+ 70, 35,140,205, 50,227,147,103, 47,176,233, 91,108,208,225, 56, 28, 49, 78, 51,174,175,175,240,232,195, 15,240,250,155,111,129,
+ 14, 7,188,120,242, 8, 55, 55, 55,154,204, 22, 64,232, 8, 24,199, 25,119, 47,206,177, 73,106,205,182,109,227,129,156,190,207,
+155,113, 0,200,195, 55, 14, 93,219,225,221,183,223, 48, 87, 49,157, 70,112,100,223,119,190, 36,115,196, 41, 21, 55,101, 85,127,
+138,156, 64, 47,106, 22, 62, 86,123,185, 34, 82, 33, 34,235,107, 44, 42,123,123,239, 16,213,197, 31,145, 82,185,212,210,200, 46,
+141,207, 56,166, 77,185,168,243,116,204,241, 98,183, 17,186,249,185,179,153,238,217,130,151,138,198, 18, 98,114,139,160, 72, 25,
+220, 98,118,148,168,242,166,244,215,201,105,114, 89,241, 40,151,106, 57, 42,172,147, 31,223, 38,110, 73,253,147, 34, 65, 29,117,
+ 43,197, 76,170,142, 0, 43,194,179, 86,124,161, 91,129, 59,100,113,182,146, 95,220, 60, 58,228,234,215,137,161,110,177,217,161,
+139, 8,118,251, 3,190,246, 95,191,137,203,203,231,104,219, 22,211, 56,160,105,123,112, 8,216,223,220,192, 55, 29,198,253, 62,
+ 10,149,152,113,247,236, 2, 60, 79, 8,201, 34,150,167, 98,222, 55,232, 29, 97,152, 39, 4,137,113,168, 11, 51,238,108,183,232,
+154, 13,130, 48, 66,218,147,195, 55, 32, 71, 24, 57,141, 0,251, 62,102, 93,239,175, 99,167,149, 62,134, 44,134,243, 4, 76, 4,
+ 12, 75,220,177, 78,129,163,104,174,141,130, 82, 9,140,206,185,184, 18, 35,194, 34, 64,238,165,195,178,192, 57,151,236,163, 80,
+117, 52,152,113,156, 70,128, 28,218,182, 69,219,245, 96, 14,152,231, 73, 21,112,145,142,231,128,100,117, 62, 30, 15,232,250, 13,
+254,230,111,255, 14,127,244, 63,254, 33,124,138, 51, 85, 7,134,152, 81,172, 20, 1, 42,173,164, 22,170,171,116,102,236,125,171,
+ 77,162,136, 67,149, 31,110,235, 69, 33,221,141, 87,231, 0,172, 72, 50,254,163,104,219,162, 18,155,106,255, 8,200, 9, 15, 71,
+236,251, 65, 21, 92,164, 74,182,132, 57, 83, 89, 80,135,118,193, 20, 25,153, 67, 65, 46,106, 66,156, 84, 80,168,236,210, 89, 66,
+136,239,102, 74,135, 99, 37,141,218, 85,149,171,214,125,249,146, 86,235, 88, 53,242,134,218,132, 11,250, 54,129, 92,112,155, 64,
+ 41, 51, 0,156,213,205, 37, 91, 96,254,217,165,117,173, 73,111,204,224,159,124,177, 91,238,132,136, 36,182, 72,129,150,101, 85,
+187,181,109,235,133,206,102,255,141, 98,183,206, 36, 79, 54,212, 57, 49,110, 32,107,247, 62,165,107,139, 54,207, 58,117,141,171,
+ 16, 27, 57, 40,213,253, 96, 97,244,213,125, 43, 5,105, 40, 22,194, 97,113,164,100, 69,118,162, 35, 95,219,185, 20,140,222,106,
+252, 72,118, 20, 91,123,109, 21,153,101,118, 2, 42,188, 17,168, 63, 62,219,224, 68,199,168,140,183,223,125, 7, 77,191, 65,215,
+198,195,170,109, 61,218,198,163,111, 60,182,109,131, 77,215,224,129, 44, 56, 28, 7,176, 48,166,100,247,121,244,203,159,197,184,
+ 66,223, 0,105,143,215,119, 93, 36, 35, 5, 70,235, 41,141,219, 91, 44,203,130,190,137,190,221,179,190, 71,219, 54, 56, 78, 19,
+250,182,197,156,186, 16,231, 28,154,182,195,197,217, 54, 41, 40, 81, 41,107,227,223,187, 50,189, 48,170,248,188,111, 34,151,125,
+218, 38, 26,215,236, 0, 53,183,153,196,112,162, 44, 51,106,101,129,195,105,214,183,172, 4,148, 21,151, 88,253,149,150, 94, 37,
+134,247, 92, 84,166, 72,241, 34,196,121,146, 99,132,147, 34,122,224, 84,135,146, 72,253,252, 73,182, 61, 81, 21,162, 69,149, 15,
+ 29,234, 16,168, 45, 72,171,102,127,173, 82,203,153,233,121,127, 38,213, 19, 91,251,230,141,211,128,115,199,198,246,162, 69, 17,
+191,208, 45,127,150, 17, 55, 10,137, 90,142,138,224,208, 8,242,184, 20, 89,101,181,206,234, 32,201, 59, 71, 18,235,147, 22,252,
+249,127,249, 58, 94,188,120, 6,239, 61,230,105,132,247, 13,142,135, 29,246,187,107,144,111, 48,143,199, 56,110,230, 5,103, 93,
+143,160, 23,122,136, 0, 12, 18,244, 93,135,113,158,177,159,102, 52,109,139,192,130,109,223,227,222,102,131,166,237, 48,143, 35,
+198,195, 62,170,176,125,135,237,197, 67, 56,231,112,241,202,107, 88,200, 97,154,166, 56, 10, 36,160, 73, 74,121, 79, 62,118,110,
+ 4, 28, 67,236, 4, 27,231,113,222,123,108,218, 6,227, 18,176, 59, 76, 0, 39,101,183, 58,161, 4,141, 3, 90,239,193,228, 98,
+176, 75, 88,208,122,135,205,102, 3,118, 14, 97,153,113,152,103, 32,137,149,198,113,196, 97,191,195, 52,142,241,251, 10,177, 16,
+200,156,237,248,249, 6,132,101,198,241,176,199, 97,127,192,251,191,248,176, 62, 48, 45,140, 70,202,238,146,236,121,148,247,205,
+185,163,225, 18, 85,115,234,127,172,167, 90,100,206, 86,213,120,104,222,192, 74,116,169, 6,141,244,107, 44,254, 53,235,151, 84,
+157,142, 74, 48,162,251,113, 41, 38, 59,169,208, 69, 84, 92, 45, 66, 6, 58,179,118, 30,213,250,165,162,183, 53,255,220,164, 35,
+ 10, 75,100,181, 39,118,185, 6,198,176,237, 78, 81,206,247,204,243, 80, 61,151, 84,231,143,242,221, 97,166,106,142,170,117, 6,
+103, 77,128,218, 70, 69,207, 14,139,168, 85, 33,109,190,135,132, 79,168,110,121,156,238, 93,122, 30, 93,218,137,167,164,207,252,
+249, 59, 87, 4,184,164,168,216, 84,220,166, 11, 63, 47, 62, 69,106, 8,155, 88,253,151,249, 12,215,221, 59, 86,255, 63, 51,242,
+213,194,109,254,108,151, 83,212,148,144, 99,196, 26,214, 63, 92, 42,166, 90,189, 92,115,124,205,222,221,160, 5,217, 66,245, 69,
+ 84, 64, 37, 85, 70,182,156, 30,126,145,177, 87, 30, 48,174, 49,133,156, 69, 8,186, 3, 90,169,186, 33,166,234, 1,222,126,251,
+117, 52,253, 22,206, 55,184,115,118,134,179,174, 73,254,242,168,186,245, 77,131,179,109,135,123, 33,224,242,102,135, 97,156,227,
+ 1, 34,140,179,205, 6,207,158,124, 10, 2,112,115, 60,226, 48, 12,137, 38,183,164, 11,193, 97,219,247, 0, 57, 76, 75,136,120,
+216,148, 31,124,115, 28, 32, 18,241,153, 65,128,166,105,209,180,157, 78,150, 41, 33,222,234,248,195, 20,216, 97,198,240,122,209,
+186, 21, 71,186,190,126, 87,147, 17, 90,253, 92, 76,193, 39,116, 26, 61,105,197, 36, 73,216,161,120, 87,195,116,135, 72, 77,137,
+ 75, 36,225,124,161, 49, 83,164, 14,102, 24,114,229,163,143,251,226,138,181,105, 29, 12,100, 56,247,122, 17, 22,223, 48,137,172,
+227,203, 77,213,169, 78,109,211,153,203,234,243,170, 52, 70, 38,184,198, 25,204,236, 74,145, 47,165,155, 22, 51, 20, 41,122,146,
+ 58, 24,137,168, 38,226,173, 98, 4, 19,144, 39,175,197,164, 40,201,177,130,208,153, 28,131,248,238, 80, 5, 68,201, 35,122, 72,
+220, 63,254,231, 63,249, 43, 92,190,120,138,174,235,176,204, 51,124,211, 98,127,243, 18,243, 52,198, 78,117, 60, 34, 44, 51, 56,
+ 44,216, 52, 45, 68, 34, 18, 54,132,136,226,108,218, 22, 65, 4,215,199, 1,190,105,240,234, 43, 15,240,214, 59,159,195,253,205,
+ 6, 30, 20,163,132,143, 7, 56, 2,218,166,197,230,252, 1,182,247, 95, 65, 8, 35, 38, 1,174, 46,159, 65,150, 25, 20, 22,244,
+ 77,135,243,243,123,216,158,223, 67,231, 60,218,134,112,224, 0, 22, 66,215,120,156,117, 30,142,128,121, 98,200, 28, 98, 74, 98,
+ 42, 84, 85,159, 66,208,226,201, 3,104,211,106,106, 10,140,113, 26,225, 16, 53, 43,141,115,104,210,103,190,113, 20,125,241,233,
+144,142,104,209, 88, 80,119,109, 27, 61,193,249,176, 15, 65,217,247, 63,252,201,251, 74, 43,139,122, 29, 41,127, 9, 25, 10, 92,
+221,181, 49, 75,201,204,214,206,177,214, 32,213, 97, 63,114,114,176, 23,247, 66,236,246, 51, 95, 60,190, 43, 92, 46, 4, 65,241,
+ 64, 59, 67,106,172,186, 72,134,149, 74, 21,241, 26, 27,162,167, 9,131, 49, 34,228, 24,192,101, 58,206,234,130,225, 19, 65, 51,
+ 86,150,226,114, 55, 36, 94, 59,115, 36,225, 57, 50, 94,119, 49, 22, 91,125, 9,244,215,177,220, 2,196, 90,229, 32,184,212, 28,
+ 57,251, 22, 26,238, 73, 57, 83,216, 72,148,196,196, 76,139,102, 18, 8,193,176, 81,146,109,218,140,227,243, 46,189, 48, 85,130,
+201,163, 72,119, 18, 25, 37,191, 94,232,190,182, 75,174,191, 87, 41,246,180,250, 2,207, 90,134,178, 7,146,180, 66, 97, 29,207,
+179, 41, 6,202,239, 25, 5,147,235, 8, 41,195, 92,149,202,148,111,252,194, 26, 48, 47,167,145,151, 70, 12,194,154,202, 83,132,
+ 5, 82, 29,200,164,223, 36, 89,160,131,148,224, 18,210,221, 72,250,106,152, 34,132,131, 11, 81,139, 88, 13,238,122, 0, 72, 46,
+ 52,148,202, 19, 63,144, 63,252,131,223,135,219,156,193, 35,165, 26,145, 67,239, 61, 26,239,208,182, 13,124,219, 98,187,237,241,
+128, 3,110, 14, 7, 76,243, 2, 1, 97,119, 56,194, 57,194,111,124,229,183, 99,188,106,219,226,122,127, 72, 42, 94,209, 14,124,
+ 14, 11,156, 35, 12,211,140,155, 97,196,179,235, 27, 28,231, 5,125,215,198,128,151, 20,207,122,239,222, 29,189,192,197,137, 58,
+ 4, 50,109, 45,138, 67,228, 20,144, 96, 46, 48,151,213,216, 14,149, 32,171,198, 57,175, 4, 34, 85,215,110,196, 93, 68, 39,150,
+ 14,231,164,138,218,189, 5,155, 86,180, 99, 6, 6, 3, 77, 18,202, 23,123,210, 67,228, 42, 61,147, 9,237, 97,151, 71,217,118,
+ 4,149, 75, 80, 99,185,203, 2, 52,253, 57, 19,157,242,229,181,115,226, 50,170,207,158,206,202,206, 95,166, 1, 98, 61,145, 10,
+ 48,130,225, 34,148, 26, 51,171,133, 43, 1,242, 58,195, 92, 57,237, 53,113,207,242,244, 75, 12,104,205,124,215,175,137,185,116,
+127,149,143, 56, 57, 14,178, 85, 41,137,233,254,243,159,254, 85,228,224,139, 96,216,239,176, 61, 63,199, 97,119, 29,199,230,243,
+168,227,189, 37, 4, 92,244, 61, 66,178,251, 44, 75, 28, 73,187,198,225,102, 24,112,118,182,197, 91,111,188,130,251, 15, 94,197,
+120,152,240,232,163,143,176,159, 38, 72,152,209, 80,212, 47, 52,155, 59,184,247,214,123,184,255,230,155,184,186,126,142,227, 97,
+ 7,199, 1, 88,102,108,218, 22,103,222, 3,203,132,105, 58, 96, 28,174, 48,201,130, 33, 8, 90,223,160,107, 29, 90,239, 48, 46,
+ 64,219,157,161,233,182, 16,231, 13, 5,145,147, 16, 50,126,110,222, 57, 93,193,229,206, 95, 0,132,133, 17,166, 41,158, 67,190,
+129, 39,194, 44,145, 80, 23,210,193, 26, 36,126,191, 97, 89,176, 76, 19,132,227, 40,120, 89, 22, 61, 80, 67,190,216,199, 17,159,
+ 62,126,150, 14,108, 41,171, 30, 5,104,149, 81,120, 1,152, 72, 53, 60,140, 48,165,250,189,163, 91,115, 95, 88, 51,189, 53, 92,
+ 40,239,199, 87, 98, 79, 50, 65, 86,172,248, 83, 87,179, 10,168, 48, 14, 42,113,166, 5,173,176, 29,154,146,253,165, 57, 26, 68,
+ 29, 26, 81,144, 12,176,233, 48,117, 77,165,177,160,108,212,244, 92, 28, 72,249, 51, 15, 1,141,143, 49,177,164,207,170,168, 0,
+ 47,149, 17,122,167,216,130, 32,158,215,168, 4,100,249,247,119, 41, 98,182,236,217, 93,129,240, 72,177,156,102,197,120, 97,162,
+144,117,158,150, 56, 39, 49, 36, 58,150,242, 87,197,225, 79, 23,127,178,228, 89,251, 97,113,241,148,115,196,121,127,114,246,194,
+174,116,164, 88,149,173, 71,191, 16,250, 80,222, 1,172,248, 35,171, 81, 61,219,127, 38, 12,255, 7,255,253,255,240,191, 86, 7,
+ 17,149, 46, 32,143, 77,148,154, 99, 46,230,148, 13,149, 22,245,140,146, 87,203,133,174, 99,246,230, 57, 83,187, 36, 35,145, 86,
+ 56, 88, 65, 2,106,143, 17,105, 85, 84, 46,152,156,221,107,236, 38,102,167, 76,213, 69, 81, 34, 21,243, 7,210,245, 27, 12, 87,
+ 47,209,128,225, 8,216,186,184,191,236, 26,143, 69, 4, 77,194,200, 98,156,112,195,130,105,142,208,152, 16, 24,199,155,235, 20,
+255, 23,127,251,174,241,232,210,168,114,156,102,244, 93,135, 97,154,113,113,118,134,253, 48, 33,136,224,124,179,137,123, 66, 16,
+124,211,226,252,252, 14,190,250, 91, 95,196,102,211,199,164, 31, 67, 63,203,136, 69, 29, 57, 57,167, 23, 90,180,190,230, 17,124,
+ 18,126,145, 1, 40,100,104,154,118,165, 53, 11,190,208,143, 92,241,206,234, 5,238, 42,253, 65,137, 57,205,129, 46, 40,127,191,
+ 26,201,231,110, 62,139,134,138, 13, 36,177,250, 83,113,226,114,150,120,190,140,205, 14, 95, 86,184, 54,235,129,181,130, 25,107,
+231,201,149, 49,197,228,136,149, 29,169,142,172,165,180,123,183,211,138,156, 38,149,179,168,173,118, 64,173,109, 89, 0,229,240,
+ 25,226, 54,152,192, 34, 84, 65, 68,250,190,172,196,142, 48, 97, 60,148, 24,216,164, 57,109, 98, 38, 20,201, 30,117, 75, 88, 12,
+165,125, 38,129,240,209, 71,159,226, 47,254,242, 27,120,246,228, 19,188,120,250, 68,245, 35,211, 56,168, 16, 46, 11,213,230,101,
+193,189,237, 6,227, 18,224, 17, 15,169,166,139, 43, 34, 1,225,225,221, 11,244,103,119,177,219, 29,113,220,221, 96,152, 70,128,
+ 99, 23, 29,213,200, 45,250,187,247, 49, 47, 19, 14, 47, 62,197,245,229, 51,116,109, 11, 10, 75, 4,202,164,104,226,217, 55, 96,
+ 48,182,125,131,227,184, 96, 1,161,111, 26,116, 13,225, 56,205,232,218, 45, 54,109, 11, 98, 70,211,118,170,134,143,103, 75,122,
+ 30,157,143, 7, 55, 74,247,235, 41, 22, 4,217,119,221,166,159,251,229,113,196,200, 1,158, 28, 46,206,206,209,247,125,180,190,
+ 37, 10,157, 13,218, 40, 0, 34, 87, 2, 79,136,208,180, 45,174,119, 71,252,250,175,189,107,154, 26, 3, 48,114,182,184,165, 82,
+ 88,167,159,177,179,106,212,181,242,157,232,116, 24,233,116, 30, 87,240,184,222, 85,252,127,123, 25,228,131,223, 59,111,132, 29,
+165,130, 39,177, 98, 59,172,132,115,229, 12,132,161, 68,102,192, 24,169, 16,217, 50, 50,196, 32,141,141, 10,202,196,102,219,212,
+ 71,123,111,112, 96,248,198,195,147, 47,188, 18, 41,150,183,188,207, 86, 43,168, 90,151,169,154,178,170, 55,155, 67, 34,214, 37,
+158,126,101,113, 19, 59,168, 48, 5, 77,185,207,200,149,136, 91,164,179, 20,213,132,148, 74,240,149,161,198,169,162, 32, 93,248,
+228,140,151,102,165, 89,202,172, 7,205, 68, 23, 3,232, 90,217,133, 51, 96, 41, 95,196,178,182,105,175,120,244,113,109,101, 86,
+ 54,186,234, 43,227,251,204,226,111, 84,240, 36,197,227,103,197, 9,229, 48, 53, 95, 32, 11,196,231,195,155,205,195,207, 5,143,
+111,144,163, 85, 7, 95, 61, 88,117,100,107,125,177, 83, 17,240,145,217, 0,165,189, 57, 73,206,179, 37, 99,224, 79, 13,123, 14,
+ 58, 73,222,205, 74, 20, 69,130,135, 15,238,227,121,202,198,118, 18,133, 27, 77,227,163, 15,183,241, 8,233, 75,190, 56, 19,244,
+195,128, 71, 75, 20,165,197,248, 70,160,239, 58,132,176,160,239, 58,108, 54, 27, 92, 94, 93,193,251, 6,211, 60,225,250,229, 53,
+ 30,222,189,131,109,215, 1,216,227, 48,205,184,179,221, 96, 78,179,246,198, 55,232, 55, 91, 60,124,112,207,120, 50,171,192,180,
+250,129,169, 4, 47,241, 27, 19, 41, 12,232,248,107, 92, 10,143, 40,241,134, 49,240, 37,167, 74,145, 81,200, 83,165,204,177,249,
+234, 21,231,154,204,108,192,225, 22,216, 74,197, 91, 65, 9, 21,141, 5,157,115, 57, 61,172,196,131,114, 94,233, 80, 81,115,154,
+135,162,138,240,101,243, 51,101,115, 9, 59,179, 67,211, 17,100,222, 99,155,231, 71,117, 5,249,171, 99, 54,187, 67,214, 23, 39,
+239,165,156,249,236,236,203, 72, 84, 68, 70,122, 72,172,172, 10,146, 39, 8,102,170, 65,249,185, 43,153, 13, 39,134,101,213,130,
+ 16, 78,160, 63, 5,217,204, 37, 59,153,234,181,215,167,143,159,227,235, 95,255, 22,246, 55, 87,152,199, 1,112, 14,119,238,221,
+199,225,176,199, 60, 69,214,185,181,172, 30,199, 17,247,207,207, 49,204, 51,136, 3,154,174,197,110, 26,177, 28,102,204, 33,224,
+238,249, 22,135, 49,128,111,158, 96,225, 0,225,116, 81,145,195,152,167, 39,203, 0, 63, 79, 58,238,111,200,129,231, 9,103,119,
+ 30, 98, 26,118,216, 79, 19, 54,173,195,157,158,112,121,240,216, 45, 13,200, 51, 46, 26,194, 24, 24,187,113,198,118,179,141,151,
+ 23,199,145,184, 44, 19,154,182,131,235,163, 34, 63, 36,251, 27,133, 37, 70,222,146, 75, 81,159,177,231,244,136,176,154,145, 25,
+ 65, 24, 35, 3,158,128, 59,109, 27, 15,203,241,136,208, 52,104,219, 14,219, 59,119, 1,231,112,216,199,104,216,101,137,170,124,
+181,125, 54, 13, 56, 4, 76,211,132,113, 24,112, 60, 30,177,219,237,113,247,206, 69, 69, 50, 20,145, 24, 12,148,198,250,249,113,
+209,243, 78,202,197, 38,148, 19,245,168, 36,239, 73,241, 60, 11,234,221, 13,131, 77, 3, 85,112,197,249,221,208, 8, 82, 51,114,
+175, 28, 21, 86, 24,167, 78, 15, 27,196, 98,112,177, 86, 44,171, 29,122,217,161,151, 9, 91,205, 77,180, 35,107, 74,177, 46, 26,
+255,201,209, 34,202,136, 97, 46,129, 3,154,166,137,105,107,201,249,148,221, 3, 57,212,132, 53, 87, 61, 93,100, 40, 43, 46,187,
+238,146, 10, 35, 46,122, 97,102, 46,175, 3, 3,206,171, 22, 37,152,119,209,144,239,181, 49,201,162,198,181,174,160, 46,176, 57,
+158, 85,137,186,151, 3,174,242,254, 62,168, 74,190, 64,113,178,133, 47,218,234,120,197,164,119,128,178, 89,105,109,137, 56,225,
+ 75,192, 0,198,178, 80,146,243,255, 54, 12,121,251,107, 45,186,176,209,168, 70,243, 47,117,116,152, 47,117,103,189,186,214, 40,
+111,216,186,213,227, 81,234,220, 42, 66,215,238, 54,243,201,200,180, 74, 89,171,111,141,106,103,108, 96, 55, 98,195, 74,242, 1,
+ 77,164,105, 98, 82, 81,184,168, 98,162,239,111,118,250,117, 58,135,168,132,117, 14,222,124,127, 46, 1, 91, 22,191,193, 23,198,
+ 25,143,164,193, 60, 47, 56, 30, 99,178,213,166,235, 48, 45, 1, 56, 30,113, 24, 39,108,123,194,118,179,209,238,224,233,213, 53,
+ 56,237,209,135, 57, 96, 14,140,182,237,208,118, 29, 54,219,109,133, 65, 36,114, 85,230, 86, 29, 36, 64, 0,130,138, 66,228,132,
+144,145,178,213,205, 68, 34,255, 80,156, 73,213, 3, 25,245,182, 62, 48, 46,185,108,168, 86,135,147,185,166, 75,150,103,113, 52,
+ 0,183, 57,111, 83,193,151,179,137, 83,209,144, 47,114,103, 20,249, 84, 10,128,162,182, 53, 86,188, 4,123,208,184, 66,125,200,
+115,129, 80,252,230,241, 48, 36, 19, 61,103,205, 0,183, 12,199,205, 56,143,178,130,184, 82,177, 75, 69,125,202, 84, 49,192, 68,
+ 43,117, 0, 0, 32, 0, 73, 68, 65, 84, 82, 68, 45,153, 52,180, 58, 92,214,161, 80,164,136, 76, 52,196,109, 48, 50, 85,249,150,
+113,155, 93,124,229, 8, 93,178,234,100, 67,100,252,214,119,126,128, 95,253,234, 3,236,174, 95, 98, 30,199,216, 29, 15, 19,142,
+251,155,106,223, 63,142, 35,186,190,199,126,119,133,187,219, 11,204,209, 88, 11, 34,193,203,155, 29,166,176,224,206,217, 57,206,
+156, 67, 24,135,200,219, 38, 96, 14, 28, 9, 93, 16,108,186,216, 29,231, 60, 5, 74, 43, 36, 1,192,222, 3, 68,184,217,189,192,
+121,223,224, 98,219, 96, 63, 17,194,228,225, 27, 66,135, 25,210,182,184, 62, 30, 65, 0, 90, 34,240, 60,226, 48, 14,112,190,193,
+102,123,134,134, 36,194,100, 28, 1,222,195, 81, 15, 94, 60,166,121, 4, 88,224, 93,201,149,166,212,213, 70, 37,125, 12,132,105,
+ 28,225,254,182,195, 18, 4, 1,130,144,152,246,243,178, 96, 24, 7, 52,253, 6,112, 49,234,152, 37, 82,236, 60, 0,113,177, 40,
+ 32,102, 56, 14,152,166, 1,243, 52,226,167, 63,255, 21,126,247,159,127, 69, 35,110,137, 13,158,148,147,195,193, 4,191,104, 31,
+155, 99,137,129,168,125,160,148,193,183, 42,234,170, 20,191,148,135,174, 69,183,137,179,214,211, 50,243,220, 51, 46,214, 54, 63,
+ 85,111, 36,122,129,174,137,104, 5, 78,105,150, 61,230,108, 46,227,247,100,213,162, 26,178,147,237,108,229,191,141, 93, 60,231,
+201, 96,214, 47, 4,134,111, 92,137, 27, 78, 89, 17,217,209,146, 51, 36,200,138,177,141,248,148,236, 74, 46, 21,238,193,228,144,
+103, 38,186,102,210, 75,116,214, 72,154,230, 57, 17,112,202, 43, 95,107,133, 74, 31, 41,167, 75, 17, 41, 98, 88, 85,214,235, 69,
+ 77,112,228, 43,231, 79,158, 34,144, 17, 36, 58,231,226, 58, 71,114,168, 78,178, 26,178, 65,151,175,148,235, 82,209, 86,197,220,
+231,172, 20,193,138, 60,192, 92,236,140,234, 0,176,110, 51,160,177,163,134,210,249,136,102, 82, 51,135, 2, 71,209, 51, 47, 95,
+246,117, 8,131,109, 77,116,160, 99,207, 89, 46, 5,129,216, 29,178, 13, 62, 88,177,157,236,239, 95, 58,118, 54, 42, 77,210,221,
+135,147,188,155,113, 37, 46,148,163,223, 89,210, 15, 64, 68,176,191,222,193,167, 14,213,147, 3,131,177, 8,161,115, 4,242, 0,
+147,131, 16, 33,136, 71,239, 28,150,174,193,239,189,251,155,248,252,191,248,125,252,241,127,252,223, 33,194,216,244, 93, 2,113,
+ 52,216,164, 36,183,121, 24, 98, 87, 51,207,104,156,195,113,158,241,234,221, 59,152, 57,238,144,157,115,232,250, 13,190,248,222,
+187,182, 57,211,177,172,203,104, 65,147, 11, 85, 63, 6, 89,209,238, 42,133,152, 22, 97,137, 57,112,170,238, 46, 23, 94,177,159,
+185, 21,227,178, 72,181,116, 61,146, 59,125, 87, 14, 38, 50, 35,109, 54,117,133,157, 24,217,175,157, 56, 39, 28,185, 98,193, 99,
+ 90,185, 35,140, 8, 73,202, 56, 91,173,118,217,143,235, 92,196,194,166,125, 90,238,238, 57,249,210,245,106, 22,170,199,143,121,
+114, 81, 9,252,160, 30, 83, 79, 84, 58,135, 84,152, 88,102, 0, 37, 32, 7,165, 44,101,162,181,184, 51,249,128,189,171,114,216,
+ 79, 28, 77,153,115,189, 50,213,229, 73,147,172, 10,108,151,139, 36,162,106,116,247,254, 47, 63,198,135,191,250, 0, 55, 87,151,
+152,166, 17,146, 66, 49,178, 27,195, 37,111,247,113, 56,194, 55, 13,134,227, 1,119,182, 23,152, 69,224,195,132,113, 26,177,112,
+ 28,227, 62,232,207, 99, 87,159, 4, 88,206, 55,154,112, 5, 34,252,243,175,126, 25,125,219, 32, 44, 11,126,249,241,167, 56, 30,
+142, 88, 56,164,116, 67,143, 70, 98,142, 1, 46,238, 99,129, 67,215,159,227,108,220,131,120,192, 60, 7,236,198, 9, 30, 51,238,
+111,123,156,111,207,192, 16, 76,105,234, 21,194,130,221, 97,192,196,192, 22,128,155,167, 56,114,247, 30,174,235,193,132,184, 7,
+ 23,192, 59, 82,245, 57,167,207,200, 17, 97,145, 56,154, 27,230, 72,155,227,180, 0,140, 25,221, 81,224,180, 76, 19,154,182,197,
+102,179,213,221,169,115, 62, 30,144, 33, 9,209, 88,176,204, 11,166,105,194,199,143, 30,227,119,254,217,151,225, 77,176,135, 13,
+ 73, 21,147, 52, 72,150, 86,166, 69, 95,140, 74,214,179,206, 20,155, 98,245,231, 73, 82,196,233,103,145,247,193,165, 81, 33, 21,
+ 70,185,180, 55, 70, 53, 70,135, 33,125,196,119,173,236,128,217,168,226,139,208, 74,170, 6,201,126, 77, 82,172,110, 22, 70, 37,
+ 38,116,134, 68, 51,203,137, 24, 34, 46,249,211, 69,217,227,200, 43, 67,142, 90,161,204,114, 40,174, 17, 19,227, 78, 92,209,151,
+108,162,154,194,148, 2, 39,127,187,139,151,123, 28, 3,166,115, 40, 19, 50, 83,248,169, 13, 25, 75, 23, 44,173, 96,238, 98,108,
+132,229, 5,175, 3,149, 11,220, 44,234, 42,188,243,201, 46, 77, 70,227, 83, 2, 98,226, 90,202,155, 93,119, 60,115,157,147, 85,
+186, 26, 27, 75,222,122,228, 89, 52, 68, 76, 53, 55,148,140,107, 66, 93, 72,134, 25,159, 87,132, 57, 77,178,193,138, 4,151,105,
+107, 98,208,175,217,134, 68, 43,168, 65, 21,203,153, 68,111, 2,210,234, 12,130, 83,240, 6, 12, 55, 60,125,160,164,237,252,202,
+ 87,109,163, 61,197,118, 49,100,196,118,133, 56, 39,148,247, 61,241, 98,231,116, 41,101,236, 97,222,229, 12,199, 67, 74,208, 17,
+120, 8,230,244,133,118,141, 67, 88, 24,147, 56,144, 99,108,186, 54,210,130, 2,240,202,107,175,225,243,239,188,139, 78, 24,187,
+ 16,240,241,179,231,120,253,193,125, 12,227,136,190,239,193, 44,120,124,243, 18,239,190,250, 42, 0,193,163,151, 55, 8, 34, 17,
+ 13,155, 94, 72,239, 27,244,253, 6,175, 60,188, 95,162, 25,242,133,236,110, 91,215,202, 41, 35, 92,119,124, 37,190, 49, 63,220,
+ 36, 5, 82, 97, 91,250, 74, 66,102, 0, 12,170,218, 92, 13,209,201,116,250,121, 97, 38,168, 35, 27, 37,119, 48, 85, 26, 85, 29,
+ 65, 9,170,220,188,105,236,110, 14, 9, 6,114, 84,252, 90,205,110,193, 25,113, 87, 84, 68,114,148, 94,218, 19,167,183,156,194,
+ 62,212,170, 67, 92, 44,111, 25, 78,195,150, 33,205, 41, 90,145, 78,220, 24, 44,133,245, 25,145,183,164, 49,177,234,243,173, 58,
+108, 42, 21,247,202, 15, 92,234, 10,210, 40, 93, 49,140,110,202, 47,175,138, 15, 21,154,167, 44,236, 31,255,248,103,184,185,185,
+198, 52, 77, 88,150, 0,146, 0, 78,194, 36,145, 8, 55,202,201,137,228, 90,116, 68, 24,231, 9, 14,140,221, 56, 97, 10, 11, 94,
+185,123, 15,135,221, 13,134, 49,122,207,137, 8,173,111, 18,187, 26,216,158,109,240,191,252, 79,255, 14,243, 50,227, 79,254,226,
+175,177, 76,179,230,172,119,222, 65,252, 6, 23,247, 94,193,249,221,251,216,108,123, 92,191,188,196,116,184, 6, 79, 87,104, 28,
+112,113,126,129,205,166, 71,215,117, 56, 63,219,226,252,236, 12,119,206,207,209,118, 29,188,111, 48, 14, 71,140,243,140,221,225,
+136, 71,143,159,224,249,229, 75,192, 53,112, 28,192,243, 2,161,152,248,230, 0,132,101,142,248,216, 68, 98, 4,128, 37, 29,246,
+ 44, 64,200,185,216, 4, 44,169,115, 89,230, 25, 2,192,251, 6, 93,215, 65, 66,192, 50, 28,225,219,174,132,249, 52,190, 20,119,
+204, 16, 9, 88,230, 9,243, 52, 99,158,103,184,190,139,227, 90,179,255,214,227,201, 25, 58,150, 29,173, 39, 70,131, 19,210, 11,
+213,166, 36,210,202,109, 18,210,197, 83, 74,202,248,107,243,152, 94, 71,188,142,170,137,150,158, 23, 5,245,102,136,132,230,141,
+ 52,255, 14, 70, 60, 87,197,197,210,122, 5,202, 41,254,217,128,152,170,108,137, 50,159,136,226,100,214,115,163,201,251,100,152,
+196,194,188, 26, 83,199,147, 84,250,157, 92,220, 87, 23,157,148,247,179, 10,108,202, 2,237,156,206, 38, 4,231, 56, 1,185, 98,
+231,174,209,225,170,159, 32,213, 95, 59, 49,159,143,142, 39,235, 36,198, 28, 18, 83, 24,238, 73,224, 75,165,217, 21, 69,189,198,
+200, 88, 65,164,230, 5, 46,121, 19,242,255, 51,246,102, 49,147, 37,217,125,223,255, 68,196,189, 55, 51,191,173,170,186,186,122,
+159,153,158,141, 51,228,112, 56, 36, 77, 82,180,185,136, 20, 53, 92,134,148,105,136,162, 68, 83,134, 8, 25, 22,228, 23,235,197,
+ 50,252,174, 87, 3,178, 97, 64, 15,134, 1, 91, 54, 8,217,178,108, 3, 38, 96,195,162, 65,147,162, 52, 20,101, 15,105,115,155,
+133,156,233,233,158, 94,171,107,249,214,204,188,247, 70,156,227,135,216, 78,220,252, 26,240, 67,205, 84,119, 87,229,151,153,247,
+222,136, 56,231,252,255,191,127,224,198, 10, 88,195,202,180,213, 16,141,243,161,236,234,213,234, 31,187, 43,121,205, 47,226, 56,
+ 86, 2,234,220,205,139,127,206,213, 86, 76, 22,177, 45,120,239,233,100, 96,108,125, 97, 82, 92,222, 40,208,136, 24,194,120, 63,
+100,160, 8,169, 55, 77,109,112, 22,213,249,141,226, 20, 52, 45,200, 6,120,112,155,233, 30,104,124,158, 77,138, 28,234, 33,129,
+ 23,148, 47, 0,240,201,146, 99, 96, 96,133, 17,136, 64,150, 96, 28,197,137,157, 0,134, 5,166,179,120,254,219, 62,139,175,127,
+229,247,113,118,239, 62,166,253, 22,207,110, 58,224,114,198,233,157, 59,120,246,249,151,241,229,175,126, 25,230,102,139, 59,199,
+ 71,248,240,131, 7,120,120,113,137,144,110,170, 77,223,163,239, 58, 60,221,238,225,156,131,117, 14,174, 27,234, 97,132, 76, 83,
+209,229,121,221,129,186,101, 81,241,137,174,206,117,148, 39, 81,107,249, 58, 72,114, 51, 53,108, 65,106, 11,156, 68, 1, 41, 84,
+116,168,126,254,117,235, 74,100,225,157, 93,192, 44,164,137,154, 32, 44,185, 9,121, 86, 92,178,223,179,112, 47, 19, 57, 75,181,
+ 94, 41,105, 69, 39,161,231,235,165, 74,146, 66,158,203,249,234,229,154,243, 50, 33, 37, 61, 0, 12,176,132, 74, 8, 75, 21,121,
+185,111,115,251, 62, 45, 66, 69,148,169, 32, 10, 84,232, 99,212,160, 38,245, 93, 44, 45,162,187, 30, 52,106,135,173,220,251,154,
+189,191, 20, 5,230,143,241,165,255,231, 79,112,115,125, 9, 63, 79, 41,254,215, 67, 56, 64, 56, 83,185, 98, 85, 59,207, 62,126,
+167,243, 24, 17,177,211, 8, 31, 2, 86,235, 53,250,253, 30, 55,215, 87,240, 92,127,150, 35,130,103, 70, 16,193, 39, 94,125, 5,
+ 63,254,195,255, 6,126,237,159,254, 6,158, 60,121, 18, 71, 11, 68, 24, 67,236, 70, 16, 17, 48,143,120,250,240, 91,120,244,238,
+235, 56, 59, 57,194,199, 63,252, 10, 78, 94,124, 5, 67,223, 99,189, 90, 97,179,217,224,232,248, 4,235,245, 10,125, 63,192, 57,
+ 91,220, 11,100, 29,198,113,196,148, 18,226,166,105,198,245,205, 46, 86, 59, 44,112,253, 58, 6,201,248, 0,107, 93,180, 30,205,
+ 35,140,173,156,127, 6, 67,199,243, 76, 41, 58, 57, 32, 66,154,108,170,248, 69, 4,211, 52,167, 24, 78, 66, 24,247, 48,214,162,
+183,209,249, 18, 18,229,142,147,173,111,158, 38,248,121,194, 27,223,122, 7,159,248,248,135,171, 3, 69,170, 78,165,182,166,234,
+120, 49,143, 78, 41, 85,105, 76, 90,252, 72, 85, 17,175,179,149,210,198,145, 29, 52,197, 62,153, 54,231, 58,179, 53,165, 67,154,
+ 31, 68,105,194,175,164,128, 96,170, 88,127, 73,120, 92,136, 82,245, 56, 53,219, 64, 69, 5, 23, 47,136,148, 82,149,118,213, 36,
+ 66, 85, 9, 15,170, 16, 22, 73,142,151,156, 62,168, 11,190, 18,146,147,158, 91,163,109,178,104, 5,100, 57, 57, 51,166,100,107,
+164,148,168, 76, 7,170, 93, 78, 50, 49,199, 94, 12, 40,132,194,101,175,197, 70,205,168, 47,159,180,224,156, 81,112, 94,180,176,
+207, 9, 75,113, 24,229,249,118,182,163, 69,141, 19, 33,248,248,243, 10, 55,128,121,193,151,168,135,116, 13,148, 44,162, 57, 53,
+251,207,164,189,194,155, 74, 95,240, 50, 79, 93, 33,191,212,201,203,192,233, 31, 90, 78, 37,138,238, 85,198,245,140, 82,129, 84,
+ 37,116,158, 9, 82,115,179, 66, 14,150,182, 67, 90, 26,164,153, 75,166, 9, 47, 88,181,167, 22,196, 88,117,162,164, 6,128, 67,
+210, 38, 95,197,174, 80,190, 24, 84, 91, 39,169,138,117,185, 66,229, 88,169,147, 33, 56, 2, 56,196,155,191,235, 29,104,142, 11,
+220,211, 71,239,161,179, 29,238,220,127, 22,219,203, 75,116, 93,135,123,199,107, 92,239,110,240,229, 63,250, 3,152,190,135, 49,
+ 6,151,187, 61,222,122,114,129,211,163, 53,134,174,199,126, 63,161, 3,225, 98,187,139, 65, 11,198,162,239, 7, 60,115,247,172,
+197, 53,146,214, 48, 84,157, 0, 26, 43,160,134,210, 36, 37, 44, 71, 21,124, 21, 73,152, 3,144, 92,117,108,228,160, 11, 46,162,
+ 25, 67, 21,224, 16,231,103, 9,242,152,198, 42,149,235,172,165, 12,149, 54, 79, 9,135,136,102, 84, 0,149,202, 84, 91,223, 70,
+106,134, 0, 14,238,151, 36,188, 81, 21,188, 44,134,133,149,173, 82,134, 47, 37, 34, 50,207,249,164,248, 64,219,214, 57, 20, 44,
+ 36, 47, 56, 7, 36,176, 76,184,106,219, 33,170,205, 73,205,162,216,132,116,136,226,130, 47,139, 32,145, 3,252, 47,160,211,175,
+168, 22, 89, 80, 49,150, 34,109,206,187,234,151, 62,122,244, 4, 31,123,238, 14, 94, 15,123,188,183,223,149,205,136,184, 34, 51,
+ 67,202, 68,176, 68,128, 4,236,166, 17,179, 15, 56,219,172, 49,237,182,240,233,189, 5, 97,220, 57, 61,193,180,221, 97,102,198,
+ 28, 24, 63,254, 67,223,135,147,147, 83,252,215,255,232,127,140, 29, 18, 67,240, 33,138,180, 28,226, 28,219, 88,139,209,207,240,
+129,241,137, 15,191,132,111,255,228,199,112,124,124,130,213,208, 99, 53,244, 24,134, 21, 86,235, 13,134,245, 26,206,185, 88,157,
+ 39,154, 87, 72,139,173, 64,240,171,255,232,127,192,135, 94,121, 25, 63,252,131,223,143,207, 60,125,138,247, 31, 63,197,147,243,
+115, 60,121,122,129,235,212, 98, 29,183, 55, 32, 14,169, 51, 83, 55,212,108,103,138,159, 55,222,179,157, 53, 41, 61, 12, 49, 98,
+ 57, 48,200, 68, 46,132,181, 54,218,249, 68,208, 65, 48,141,187,168,186, 79,238,157, 98,247,243, 51,230,121,194,159,126,227,117,
+188,250,234,203,112, 73,105,221, 32,173,203,161, 58,217,176,114,155, 62,117,144, 72, 98, 8,138,100,130,162, 22,177,169,195,114,
+161, 49,102,113, 26,116,244, 43, 43, 77,141, 44,237, 22,139,110,222, 34, 4, 9,139,206, 23,181,112, 34, 61, 82, 16,105, 7,239,
+148, 7,229, 32,245,220, 29,210,110,129, 74, 84,203,194,208,204, 20, 48,121,142,126,240, 55,165,169, 42,169, 1, 69, 81,177, 4,
+ 70, 45, 13,165, 13, 61, 44,160, 81, 73,185,158, 94,219,164, 53,132,179, 59, 72, 20,107,197, 72, 75, 21, 85,221,202,178,117, 27,
+237,152,145, 3, 18, 96,229, 64,212,194, 69,202,188, 60,109,182, 33,142, 6, 75, 58,158,138, 39,215, 39,250,246,240,114,144,252,
+ 80,191,107,110, 98,123, 22,126,123,141, 71,151,210, 45,201,174, 34, 36,219,103,107,229, 97,110,102, 55,133, 71, 93,132,111,162,
+216, 32,234, 0, 64, 13, 48, 89, 1, 74,104, 33,146,107,137,117, 68,162,120,216, 10, 70,210, 84,232,212,204,162,176,248,223,170,
+118,166,226, 91,103,147,179,159, 1, 50, 21,119,152, 91,173, 62,189,215,206, 18, 70, 99, 64, 44,232, 12, 97, 15,130,181,132, 57,
+ 88, 48, 3,211,245, 19, 56,103,112,247,222,125,188,254,103, 95,131,235, 12,122,244, 88,129,240,178,235,112,206, 4,235, 44,110,
+118, 35,238, 30,109, 48, 50, 99,187,221,161,239, 58, 88, 99, 98,170, 20,197, 25, 95,215, 15,248,200,135, 94, 44,135,167,242,157,
+202, 97,200, 64,182,135, 1,122, 67,225,242,240, 68, 15,166, 41,236,241, 18, 8,145,172, 25,208, 27,114,222, 52,149,213, 38, 91,
+ 73, 12, 81, 17,255,100,125, 49,193,214, 36,180,116,152,171,190,235,252, 48,196,242,145, 18,115,189, 9, 74, 40,254,122,147, 90,
+235,181,138, 86,126,184,122, 3, 27, 29,137,181,236, 2, 52,238,238, 34,138,169,234, 50,110,238, 13,134,142,138,151,170, 30,102,
+253,125,162,164,130,213,243,160,170,108,148,255,157,132,154,247, 82,233,120, 69, 40,162, 16,142, 82, 21,176, 10,121, 27, 23,200,
+ 10, 77, 42,215, 12, 28,171,252,226, 77,149, 69,228,109,230, 45,196, 31,254,222,251,143,225,120,194, 27,239, 94,224,122,187,133,
+ 51, 20,239, 47, 22,120, 14,105,150, 71,176,138,228,184,155, 98,212,240, 73,231, 48,237,247,152,211,131,191,247, 30,159,252,240,
+203,120,248,240, 49,230, 16, 48,134,128,159,251,137, 31,193, 31,126,249, 79,241,238,195,247,225, 57, 10,206,186,116,157, 58, 99,
+208,173,214,128, 8,198,113, 15, 14, 1, 63,242,253,223,133, 79,188,250, 17,108,142,142,177,217,108, 48,116, 29, 58,103,225, 92,
+135,110,232,225,250, 1,214,245, 17, 62, 66, 73, 68, 20, 60,254,193,127,249, 15,241, 61,159,251, 78,252, 59,191,244,139,112,206,
+130,189,199,209,230, 8,247,238, 62,131,235,235, 75, 60,124,255, 49,222,120,251, 93, 92,141,113, 49,243,151, 35,108,186,142,158,
+185,116,224,242, 66,105,147, 35, 36,143,186,120,145,182,231,231, 57,182, 37,187, 30, 86, 42,116, 38,152, 0,235,108, 73, 14, 11,
+222,195,219, 25,251,253, 14,253,118,139,243,243, 11,220,191,119, 47, 29,119,235, 72,137,210,117, 53, 37, 67,179, 42,206,145, 52,
+ 31, 4, 73,153, 7, 2, 35,166, 58, 86,242,146,154,146,202,140,169, 22, 47, 81, 21, 89,244, 58,155, 67, 27,233, 1, 14,154,138,
+170,252,150,150,222,129, 66,147,154, 30, 40,213, 66, 66,239, 91,164, 55, 96, 53,194, 83,234,248,220,122, 46,164, 75,170,135,118,
+ 81,227, 58, 90, 90, 63, 41,138, 8, 13,169, 88,110,181, 41,232,113, 3, 43,177,155, 14, 28, 99,149, 76, 41, 7,208, 45,133,148,
+ 21,106,241,182, 77,121,153, 4,102, 73,193, 91,201,170,241, 66,154, 70, 19, 38, 48, 70, 82,107,159,203,161, 18,217,186, 93,108,
+151,181,131,172,181, 73,205,251,100, 89, 4, 96, 45, 59,152,117, 76,199,105,148,156,225,109,198, 80,202,195, 96, 21,130,166, 85,
+242,241, 31,221,146, 76,204,139, 96,138, 66, 50,187,109,163, 21,110, 16,149,203, 54,121, 54, 84, 45,181,211, 5, 34, 98,106,160,
+192, 97,227,178, 77, 35, 82, 62,162,131,217,107, 45, 76, 19,135,184,144, 26, 19,203, 55, 41, 15, 88,226, 76,133, 69,209,146,136,
+ 64, 33,142, 23, 88, 16,219,132,204,112,214,148,147,156,120,198,233,157,123,184,190,120, 2,103, 45, 68, 12,172,143,190,246,158,
+ 25,179, 15, 48,206,224, 38,169, 88,215,125,143,163,213, 10, 83, 96, 28, 13, 3,246, 44,232,186, 30,171,213, 6,155,205,208, 8,
+192,106, 59,189, 25, 63, 43,107,219, 18,180,151,103,244,181, 13, 85,196, 48, 11,169, 73, 1,164,228, 25, 15, 42,177, 74,255, 16,
+202,226, 66,141,164, 84, 74, 88,168,177, 92,172,226,219, 57,189, 17, 58, 96, 11,144, 66,160, 18, 85,139, 12, 9,221,202, 58,170,
+151,151, 75,162, 95,124,186, 22,239, 41,163,235,146,248,175, 10, 49,147,205, 70,171,221,203, 8, 40,246, 42, 88,205, 1,132,165,
+166, 90,101, 22, 6,113,201, 52, 32, 5,121, 47,175, 37,106,250, 73, 69, 86, 88,208,199,210, 36,122,168,147,125, 99, 81, 82,162,
+ 23,245, 64,230,201,170,182,103,114,153,165, 71, 97,215,151,126,239, 15,113,249,244, 9,246,187, 45,166, 57,206,125,125,240,113,
+131, 74,177,183,206,246,133, 8,191,155, 70, 88, 50, 56,114,132,125,136,157, 39,145,104, 43,251,197,159,254, 49,252,254, 31,126,
+ 57, 50, 24,152,241,179,127,241,207,227,183,190,248,175,176,221,143, 81,248, 67, 4, 75, 84, 54,246,110,181, 70,152, 70,120, 14,
+232,186, 14, 95,248, 11, 63,140, 15,189,244, 34,214,155, 13, 86,253,128,213,106, 64,215, 15,112, 54,134, 21, 89,231,208,117, 3,
+224, 28, 36, 68,178,216,118,183,197,127,245,171,255, 29,254,246,175,252,114,204, 69,176, 54,162, 90,157,139, 35, 0, 67, 88,175,
+ 87,216, 28, 29,227,248,228, 4,223,120,253, 13, 60, 49, 64,223,247,184,122,242, 24,243, 60, 33,176,160, 75, 21,146, 71,134, 4,
+ 9, 6,107,192, 0,124,234, 86, 68,165,120, 28,141,176, 8,224, 3, 68, 70,184,174,139,233,112, 57,127, 60,135, 83,169,106,125,
+158, 39,120, 63,227,203, 95,125, 13,255,250, 15,156,193, 16,197, 34,129, 76,169, 12,151,147,197,102,239, 76, 98, 46,134,202, 28,
+ 87,150, 50, 74,135, 8,147,252,246,186, 51,153,187, 45, 54, 69,174,234,140, 1,210,197,141,104, 17, 40, 45,170,226,229,252,188,
+ 98,111,219,137, 38,171,244,183, 42,206,171,149, 51,107, 28, 90,108, 61,231,141, 23, 53,220, 38,219,204,178,114,157,113,139,216,
+181,104,238,164,118,223,178, 54,133, 52, 43,157, 64,198,168, 89,244,130,214,216, 96,179, 15,117, 71, 58,201,141, 10,149,178,230,
+ 86,148,212,187,252, 76, 82,118,230,228,231,186,221,115,138,173, 55, 59,168, 82,137,158, 15, 51,206,162,201,142, 16, 44, 59, 31,
+109, 40,100, 80,244, 58, 86,137,127,229, 14, 72,135,135,156, 94,201,210, 6, 79,149, 70, 74,190,130, 44,109, 30, 20,242,166, 46,
+ 11, 33,155,232,152, 76,213, 74, 84, 32, 8, 42,179, 65, 41,254, 95, 82, 40,195,146, 9,124,139,174,157, 72, 18,109,174, 86, 50,
+180,240,200,235,147,221, 18,104,214, 10,239,168,240,226,227, 7,230, 70,226, 79, 28,237, 25,229,148,199, 82, 80,162,164,223, 55,
+153,168, 27, 8, 1,206, 70,229,226,148, 63,135, 35,156,222,125, 6,251,155,203, 56,175, 76, 41, 81,100, 9, 52,199, 56,201,141,
+235,224,230,128,145, 5,251,192,184,218,143,113,209,242, 1,253,176,194,233,217, 93,124,238,179,159, 42, 94,107,105, 30,210,154,
+174,165,195, 61,244,120, 93, 68,146,255, 78,138,250,159, 84, 53,202,233, 53, 50,166,178,196,165,232, 8,211, 20, 10,131,230,193,
+136, 51,109, 40,125, 66,180,242, 72,114, 19,164,198,126,253, 15,200,214,245,144, 43,110, 67, 13,174, 53,127, 54,147, 79,175,109,
+202,233, 45,170,112,237,227,171,200, 75,125,127, 29, 90,232,110,209, 91,152, 58,227,166,172,255,208, 9, 44,138,241, 92,215, 69,
+174,214, 55,137,180, 66, 42, 57, 5,117,246, 64,197,179, 46,213,121, 33, 85,112, 71,214, 52, 85,118,115,231,179, 82, 36, 51,213,
+153,127, 22,231, 41,219, 90,211,122, 79,149,188, 33,194,175,255,198, 23,113,113,254, 4,187,253, 14,243, 60, 99,154, 39,124,228,
+193, 61, 60,189,184,196,251,201,205, 33,130,196, 68,183,216,122,143,149,181,160,224,177, 77, 80, 12, 22, 96,102,198,223,249, 27,
+191,136,175,191,254, 45, 60,122,252, 20, 99, 8,248,228, 71, 63,130,223,252,237,223,193,222,251, 40,152, 75,247,147, 79, 54, 42,
+ 99, 44,230,113,143,192,140,251,247,238,226, 39,126,232, 7,240,226,115,207, 98,189,222,160, 31, 6, 12,125,143,190,143, 1, 42,
+174,235, 65,194, 48,206,193,186, 14, 4,130,135,197,126,154,240,235,255,231,111,225,223,255,155,127, 3, 93,223,131,200, 98,156,
+246, 56,127,122, 1,231, 12,120, 26, 33, 32,244,174, 3,109,214,216,221,244,248,182,143,126, 4,231,151, 87,120,235,157,119,177,
+191,122, 10, 4, 3, 17, 95, 58,138, 83,136,173,198,117,103, 49, 37, 37,112, 87, 84,242, 53,190, 20,198,166,152, 90, 6,121, 15,
+114, 93,244,199, 39, 29,130,179, 46, 9,179,226, 63,135,224, 49, 77, 35, 30, 63,126, 10,239,227, 33,134, 68,177, 58, 10,128,132,
+ 14,133,172, 70,101, 33,152,172, 57,227,120,120, 72, 55,117,224, 80,158,209,216, 5, 72,221,135,164,113,176,201, 38,120,152, 91,
+144,215,202,218, 59, 16, 85,131, 54,182,227, 3,130, 68, 43,132, 21,197,124,167,197,128, 52,247,163, 66, 10,150, 41,121, 66,105,
+206,159,131,139,114,240, 12,101,141, 10,213, 81,224,225, 70, 28, 63, 79, 1, 81, 49,169,117, 78,199,147, 82,237, 88,201, 33,169,
+ 81,154,198, 52,169,161,243, 7, 36, 31, 38,102,124,158, 75,214,113, 34,181,176, 53, 65, 89,199, 72, 47,122,186, 32,146,252,122,
+166, 2,112, 82, 44,170, 70,228,234,108,246, 8,186, 49,233, 64,193,241,126, 80, 56,218, 42, 6, 84,107,155, 72, 19,187,156,219,
+250,121,239, 2,161, 53, 64, 55,169,115,146, 54,117, 13, 62, 41,214,182,101,254, 53, 90, 31,221, 2, 88, 80,126,132,105,133, 0,
+203, 80, 11,109, 79, 43,190, 91, 98, 21, 55,169,210,182,136, 22,234,204, 67, 85,120, 41,108, 52, 85,169,156, 4,165,216, 67,178,
+215,114,220,207, 9, 74, 19, 63,199, 4,128,156,137,221,100,207,240,194,113,142, 38,234, 41, 37,131, 97, 88, 97,119,115, 5, 15,
+ 66, 72,138,101,147, 46,152, 33,130, 21, 65, 7,138, 1, 47, 49,109, 5,206,117, 88, 31,157,226,195,175,190,138,207,124,250,227,
+133,210, 86,129, 86,117,220,193,185,157,167, 80,225,186, 93,140,229, 44, 40, 79,202,245,172, 54, 93, 23, 35, 13,191, 71,245,243,
+ 99,123,218,136, 89, 60, 44,170,193,152, 91,196,156,219,234,164,148,239,218, 53,153, 53, 10, 10, 18,148, 55,178,102,147, 87, 75,
+ 8,181, 93,153, 91,159, 86,137,215, 34,228,185,169,180, 11, 84, 99, 56, 69, 89, 95,170,112,146,204, 65, 24, 77, 78,247,211, 17,
+171, 54,145,250, 88,205,244,137,114, 43,149, 26, 81, 93,190,119,144, 68,125,249,117,114,122, 94, 21,214,201, 1, 57, 76, 20, 12,
+164,160, 97, 27,144,135,134,221,168, 77,157,171,192,232,143,190,252, 13,156, 63,125,132,253, 46, 38,171,117, 4,252,220,143,253,
+ 32, 94,123,235, 29,236,247,123, 88,235, 96, 82,198,186, 49, 6,147,247, 88, 27,131, 48, 79, 24, 83, 21,207, 2,244,157,197,223,
+254,171,191,128,253,184,199,111,255,238,239, 99, 10, 1, 71, 71, 71,120,243,205,183, 48,134, 16,171,243, 84,249, 6, 65, 10, 85,
+137,159,110, 10,140,143,125,232, 69,252,216, 15,126, 63,158,189,255, 12,214,171,180,153, 15,171, 56, 55,239, 98,158,129, 37, 2,
+140,131, 75, 66, 52, 78,115,231,175,124,245,107,248,249,159,254,201,216, 1, 19,198,126,158,209, 89,139,251,247,159, 1, 56, 96,
+158,102,236,246,123,236,198, 17, 36,130,231,158,185,135,113,246, 56, 61, 61, 65,223, 57, 56, 8,222,124,243, 93,248,155,109, 57,
+ 28,186,180, 72,239, 2, 99,227, 44,118, 41, 69, 46,150,232,105,166,154, 68,190,185, 21,159,103,180,228, 28,200, 24, 4, 31,146,
+ 93, 44, 5,117, 36, 23, 65,172,214, 61,174,174,174,241,204,189,187, 21,218, 98,180, 70, 35,197, 61,211, 45,206,148,188,113, 41,
+239,179,144,148,128,145,216, 45,200,163,132,124,192,139,162,185, 22,211, 93,219,251, 37, 26, 36, 71, 21,107,104,147,198,169, 8,
+212,251, 83, 37,156, 74, 2, 36,125,152, 92, 8,147, 5,104, 68,122,121, 6, 28,114,235,185,180,198,169,140, 7, 91,139, 22,183,
+ 29, 70,181, 16,113,154,185, 49, 39, 22, 5, 36, 17, 29, 19, 61,145, 80, 44, 91,124, 75,168, 9,229,140,134,236, 43, 47, 12, 7,
+ 44, 51,201,210,123,207,213,191,168,141,143,138,152,184, 20,161,233,143,150, 81,162,180,217,116,249,243, 90,107, 35, 82,185,216,
+124,147, 15,189, 10,237, 85,232,143, 84,181, 19, 37, 64, 24, 81, 19, 98, 86, 42,252, 76, 4, 85,225,100,121, 51, 23,104,235,243,
+ 18, 65,176, 96,115,100, 75, 91, 99, 87, 78, 45,192,154,166, 86, 43,105, 78, 51,160,218,210,105, 51,191,219, 88,202,165,240, 8,
+ 11,118,184,180,226,175,131,230, 59, 62,224,132,134,246, 22,164,197, 33,141, 90,146,118,252,114,211, 28, 86, 8,215, 87,215, 37,
+ 9,201,144, 0,214,130, 38, 15, 79,113, 94,187,234, 45,172, 0,222,196, 22, 36, 57, 2,193,162, 27,122,204,227,174,182,132, 67,
+154,187, 88, 7, 33,130, 19,224, 58,204, 48, 38, 42, 42, 45, 69,216, 69, 63, 12,120,245, 67, 47,197, 27, 54,183,221,200, 64,210,
+134,110,210,194, 23,255,191, 42, 87, 35, 53,175, 58, 14,160,218, 86, 84, 34, 62,147,208,134, 9,208, 48, 42,100, 66,154, 18, 90,
+160,162,125,153,242,152, 66,106,254,188,154,241,171, 4,198,220,254, 72, 39,108,211,210,207,154, 3,109,251,157,171, 78,124,250,
+169,105,113, 48,121,163,230, 54,159, 92,210,236,209, 96,129, 72, 36,149,150, 69, 75, 60,125,180,168, 24, 44, 12,151, 75, 83,160,
+148, 60, 24, 78, 66,185, 74,250, 98, 37, 10,226,131,150, 66, 83,213,235,170,128,210,146,217,132, 71, 84, 53,174,198,104,230,238,
+ 67,150,232,233, 69,151,149,142, 68, 88, 20,119, 33,206,139,246,227,132,215, 94,123, 29,219,155,235, 24,144, 17, 2,158, 57, 94,
+161,115, 14,157,235,176,222, 28,227, 67, 71,103,120,244,240, 33,246,251, 29, 56,197, 0,123, 31, 98,203, 61, 37,233,173,134, 30,
+191,242, 11, 63, 7,103, 13,254,183,223,252, 29,248,224,113,188,217, 32,204, 19, 38,102,244,105, 1, 9, 58,181, 79, 24,176, 14,
+227,236,241, 61,159,249, 36,126,240,123, 62,135,123,119,238, 96, 88,175,209, 91, 27,171,243, 46,254,178, 93, 95,114,134,156,237,
+224,220, 0, 99, 45,188,247,248,147,175,253, 9, 62,245,241,143, 97,216, 28, 1,193,199,107,192,115,140,226, 76,121, 8,214, 18,
+ 86,195,128,190,115,165, 53,233, 66, 64, 55, 77,144, 7, 15,192,204,216,207, 30,227, 91,239,128,103,143, 57, 80, 73,202, 51, 68,
+216,133, 0,103, 44, 30,220, 57,195,245,126,135,203,237,174,156, 85,131,231, 56,114,202,153,215,204, 8, 28,213,243,198, 38, 2,
+154,117,241,238, 73, 45,248,224,163,179,224,155,111,188,131,187,119,239,148, 12, 10,202,112,165, 84, 85,106, 49,100, 93, 63,107,
+151, 17,233,128,156,201,106,156, 53, 75, 66,201,206,153, 70, 8, 28, 17,177,133, 15,161,215, 80,157, 15,112, 27,168, 75,217,173,
+203,154, 75,162,114, 4, 90,112, 84,173,211,129, 67,117,109,181, 77, 69,239,124, 6,192,132,130,176,102,134,106,187, 75, 35,224,
+170,143, 31,181,179,255, 58,197,175,124,115,225,136,126, 69, 28,123, 86,191,187,180,148, 53,169, 85,178,168,194, 2, 77,177, 83,
+ 17,208,249,187,136,115,121, 69,223,215, 7,152, 60,166,205,135,246,188, 14,114,197,143,231,152,104, 14,201,127,159, 52, 14, 57,
+200,133,146,112, 41,254, 57, 3, 15, 95, 84,251,149, 42, 67,117,195, 38, 82, 98, 89, 46, 10,249,186, 95, 86,253, 84,196,131,151,
+ 21,162,238,175,180, 72, 78,189,197, 25,230,154,158,232, 66, 97,157,173, 63,185,141,176, 4,209,100,234,151,136,169,243, 31,105,
+211,192, 14,155,239,210,136,146, 76, 51, 59,150, 38,136,128,110,173,205,177, 80, 83,234,128,220,246,204, 73,202, 10,148,125,200,
+126, 28,163,109, 38,189,204, 20, 4,189, 73,201,106,214, 36,207,174,193, 20, 4, 94,128,142, 25,226, 6, 76,227, 30,227, 52,194,
+ 90, 11, 27,226, 60,140, 12,129, 83, 68,228,110,156, 96,156, 1,205,113,131,203,161, 3,206, 57, 12,171,190, 10,249, 18, 84,193,
+176, 73,118, 8, 78, 27,116, 77,227, 41,240,131,228,139,102, 81,179,232,140,226,205,224,149,124,214,207,175,151,169, 76,138, 29,
+145,191,212,168,102, 54,173, 10, 22, 18,149,244, 74,164, 17, 11, 94, 86,186,246,220,222,151,218, 73,161, 67, 91, 91,163,158,208,
+ 22,198,202,182, 83,215,215, 20,169,110, 20,142,169,196, 41,237,177, 61,224, 20,162,204,181, 69,131, 63,110, 9, 20,210, 99,197,
+114,120,224,140,112,165, 2,210, 80,176, 79, 37,226, 84,179,241, 70, 69,164,176,159, 37, 14, 54, 5,174,137,168,121,150, 70, 27,
+211, 7,110,232, 57,240,134, 20, 92, 34, 11, 64,200, 16,126,251,139, 95,194,213,213, 5,166,105,194,217,224,240,232,122,194, 56,
+205,184,186,185, 41,233,110, 60,141,152,198,177, 44,219, 14,192, 54,112,170,208, 5,103, 71,107,252,219, 63,255, 51,120,253,205,
+183,240,207,127,247,247, 32, 44,145,106, 24,102,204, 44,112,162,102,136, 84,223, 11,136, 16,130,199,231,127,228, 7,240,185,239,
+248,118, 28,173,227, 97,162, 79, 8, 86,235,108,252,127,107, 74, 44,166,201,122,111, 17, 4, 31,240,207,190,248, 59,248,220,103,
+ 63,131,245,102, 5,230, 0,182, 6, 60,206, 69,235, 96,156, 3,207, 19,136, 44,172, 77,174, 21, 50,169,245, 27,223,207, 41, 0,
+121,240,108,225,107,191,253,230, 59, 73, 63, 96, 96, 65,120,233,254, 51,184,115,122,134,247,207, 47,112,179,223, 97, 63, 77, 81,
+164, 26,162, 70,194, 80,194, 74, 83, 92, 96,243, 92, 24, 89, 36, 10,138,160,148,204,234, 8, 41, 97,204,123,188,255,248,105,129,
+195,100,238, 5,197,234,166,118,102,160, 18,253,178,194,131,212, 40,186, 68, 18,231, 0, 24,171,196, 80,241,154,197,128,146,116,
+136,228, 60, 6, 66,193,132, 86,166,199, 66, 25,157,186,158,172, 35,173, 69, 52,193,164, 32, 99,137,234,103,150,130, 54, 93,236,
+143,136, 4,183,200,222,143,207, 75, 37,186,197, 13,189,172, 35,165, 45,143,133,229,169,134,113,201, 66, 44, 87, 14,184, 34,240,
+ 62,164,234,183,198, 58,103, 28,110,224,208,230,139,103,120,203, 2,188,211, 28,190, 69, 61,119,170, 8,101,209,235,194, 34, 75,
+ 62,139, 28,137,138,152, 86,146,128,142, 81,231,252, 25, 68, 84,177,172, 42, 15, 37, 65,177,106, 87,132, 53, 41,191, 20,189, 58,
+ 23, 94,179, 56, 98,128, 13,218, 13, 61,161,178, 13, 87,232, 82, 17, 88,231, 98,143, 4, 11, 93, 45,144,137,114, 7, 10,201,162,
+ 24,174,243, 6, 82,201, 52, 48, 56,240,242, 53,246, 28,186, 77,200,198,202, 41, 68, 74,228, 68,234, 96,169,163, 71,107,180, 36,
+ 14,106,120, 58,100,162,147, 52, 24,198,124,130,172, 66,149, 88, 41,250,253, 14,112, 93,244,167,123, 65, 39, 2,233, 12,100,244,
+240, 36, 56,238, 13, 16, 0, 31,106,181,123,124,247, 30,118, 55, 55,224, 20,203,104,141,193, 92,136,190,241,251,234, 58,135, 57,
+196, 47, 58, 6,178,164, 8, 73,231, 82,168, 4,151, 74, 89,131, 7, 42,114, 84,154,217,152,104,182,248,114,190, 36,146,236, 50,
+202,247,104, 20,106, 50, 43,203, 23, 76, 31,209,225, 20, 77,200,132,180,219, 26,213, 10, 62,222,232, 92,196,111, 69,197,174,125,
+ 90,165,122,169,135,131,246, 65, 78,244, 41,106, 79,236,164,213,248, 25,113, 89, 90,107,104,126,142,102,226,151,197, 66,244,129,
+162,106, 91,235, 97,167,113, 64,150, 10,192, 36, 59, 35, 23, 56,205,225,145,179,144, 96,154,142, 16,169, 3,149,148, 67,130,158,
+153,228,177, 9, 55,147,191,124,208, 34,181,161, 39,181,175,228,246,191, 18,168,166,147,232, 91,111, 63,196,110,123,141,105,220,
+227,185,163, 1, 36,140,158,128,105,158,113,113,121, 5, 14, 30,231, 23,231, 56,191,188, 41, 45,118,103, 18, 19,157, 67,100, 84,
+ 19,208, 91,139,127,252, 63,253,175,145,230,230, 3,108,223,131,194,140, 49,100, 66, 87,253, 92,162, 14, 23, 62, 4,252,245,159,
+255,105,188,250,202, 43, 24, 86, 3,156,117,113, 3, 71, 13, 17, 42, 17,178,226,211, 63,123, 4,182,184,124,242, 20,255,252,119,
+255, 47,124,225,243,159,143,152,233,224,147, 96, 48, 36,109, 72,138,116,242, 51, 96, 44,136, 67,220,208,173, 45,102,165,144, 15,
+ 84,195,128,179,179, 51,144, 49,216,238,118,120,250,244, 2, 39, 67,135,227,227, 99,156,158,156, 96,246, 30, 87,187, 29,220,218,
+225,238,230, 20,182,183,216,237, 39, 92,109,119,240, 9,123, 11, 35, 48,233, 25, 20,163,232,137,200,148,186,180, 97, 35, 69,107,
+ 50,195,135,232,161, 15, 33,110, 98,217, 85, 99,178,125, 77, 7,108,168, 3, 17, 52,152, 37, 7, 28,113, 58, 84,147,173, 7,128,
+124,184, 53,162,196,111, 82,199,153,156, 9,115,169, 19,150,239, 23,147,251,110, 82,181,179,229,182,145, 66, 4, 45,241,202,122,
+157, 20, 52,166,225, 50,110, 78,155, 51, 39, 34, 97, 28, 13, 10, 56,100, 12,169,169,209,158,134,170, 61, 52,139, 96,243,123,103,
+129,205,216,110, 99,128,140,230, 37,106,214,179,224, 3, 24,136,227, 24,170,129, 54,165,237,174,168,105, 57,166,180, 8,223,168,
+182,185,165,153,191,183,254,123, 83, 4,168,138,172,169, 10, 65,214,108, 11,212, 3,165, 41, 65, 50, 89,227,144, 70,122,204,165,
+ 11, 42, 98,235, 56,177, 8, 99,147,131, 40,139, 33, 77, 29, 13,234, 57,126, 85,231, 47,192,118,105, 12, 84, 1, 84, 81,148, 81,
+217, 34, 80,161, 51,181, 61, 83, 14, 78,183,169,223,235, 60, 36,230, 38, 91,211, 2, 59,138, 95, 87,241,123, 11, 31,158, 53, 64,
+131,154, 74,176,145,230,233,246, 76, 78,225,210, 4, 46, 44, 47, 14, 62, 64, 93,213, 46,218, 31,248,135, 73,123, 19, 1,241, 51,
+224,167, 56, 99, 73, 49,142,206, 25, 12,189,133,176,135, 99,137,173,248, 76,166,179,132, 7,207,127, 8, 87,231, 79, 48,172, 86,
+152,246, 91,120, 33,116,198,198,214, 38,153,120,115,100, 1, 4,170,205,131, 40, 86,234,229,166, 51, 82,103, 35, 98, 80, 67,234,
+116, 11,152, 74,164, 97,252,110,121,209,130,170,109, 64, 46,150,140, 84,129,194, 64, 12,199, 22, 97, 22,177,209,162, 10,197, 45,
+113,161, 68,202,158, 82,187,208, 44, 53, 66, 55,107,228, 76, 73, 24, 59, 36,165,149,195, 84, 86,185,107,174, 44,113,177,219, 25,
+253,190, 10,224,133, 26,114, 84,153,231, 45,141,163,202, 42,163, 59,123,229, 52,108,168, 33,176,233, 35, 96, 30,187,232, 32, 14,
+232, 32,152,230,240,184,184, 95, 21,249, 40,120,174,127, 0, 0, 32, 0, 73, 68, 65, 84, 10, 84, 81, 24,121,177,169,172,105, 46,
+ 48,154,226,202, 32,101,239,201,113,138, 82, 83, 13, 57, 43,141, 21, 27, 0, 16,124,237,207,190,137,105, 28,177,182, 17,146,244,
+209, 23,159,197,195,243, 75, 8, 11,254,224,107,175,225,201,213, 77, 2,117,164, 57,113,130,152,140,115, 84,155,119, 68, 56, 29,
+122, 76,187, 61, 66, 78,127,114, 29, 16,102, 76, 62, 64, 66, 2,182,112, 69,153,102,148,242,243, 15,158,193, 47,253,155, 95,192,
+233,241, 6,214,186,216,161,178, 22, 96,198,159,190,254, 6,222,125, 20,211,217, 78, 78,142,113,247,236, 12, 71,235, 13,200, 24,
+188,241,246,219,120,250,244, 2, 63,245, 19, 63,134,159,252,241, 31,137,194,182,146,239, 32, 17,105,235, 3, 32, 28,219,226,206,
+ 1,222, 87,125,100, 18, 2, 85, 91,151,133, 75,106,245,179,227, 35,124,232,229,151, 49,205, 51,238,221,185,131,103,238,221, 69,
+215,117,184,190,190,193,126, 28,113,117,117,141,119, 31,190,143,103,238,221,193,106,181,198,107,111,188,137, 55,223,123, 31,222,
+215,132, 45, 73, 86, 51, 73,155, 86,102,146,199,140,108,155, 4, 96, 57,174, 57, 64,132, 49, 77, 19,156,139,218, 26,147, 49,197,
+141,102,130, 84, 54,120,126,238, 90, 1,108, 38,128, 17,161, 85,161,231,106, 75,229, 33,232,233,166, 64,231,127,167,142, 23, 27,
+192,196, 32, 21,201,130,100,142, 36,184, 40, 18,173,179,124,253, 98,101,164, 42,245, 88, 93,128, 40, 84, 59, 9,214,216,194,155,
+207, 9,142,185,131, 17,249,251,166,218, 69,243, 65,150, 57, 10, 36, 51, 75, 63,169,176,167,174,143,177,186,166, 82, 18,115,218,
+154,117,182,182,239, 11,242,244,182,214,187,178,128,229,124,143,220, 17,166,150,161,174, 69,170, 66,164,233, 29,181,123,144,218,
+252,121,148, 92, 70,108, 89,164, 86,240,232, 21,168, 83,152, 2, 92, 50,203, 35, 44,140, 72, 21,158,212,140, 29, 72,151, 75,233,
+ 0, 72, 90,104,151, 50, 55,248,150,161,179, 73,206, 13,157,136, 23, 95,150, 75,213,206,130, 91, 55, 68,119,200,105,107, 51,108,
+139,135,175,196, 61, 74,170, 16,169, 33, 96,137,105, 48, 11, 13,253,168,156, 50, 22,102,124,160, 37,236, 52,251, 56, 29, 56,232,
+110,165,195, 31,150,133,213,198,212,206,223, 41,157,196,227, 5,169, 68, 50, 1,102,198,198, 1,243, 28, 57,241,227,204, 32,178,
+133,161,251,226, 71, 62,129,135,239,190,141, 87, 62,245, 93,248,202,151,190,136,253,236,177,233, 92, 12,144, 49,241, 38, 15,233,
+117,243,169, 54, 11, 58, 92,215, 23,188,169,158,133,152, 2,154,161, 34, 70,202,236,118,164, 42,210,168,132,176,156, 87, 94,185,
+201,185, 57,193, 42, 86,149, 11,162, 55,187,206,155, 33,147, 82,188,215, 8, 68, 5, 17, 34, 45,226, 93,176,253, 40,139,231,164,
+108,154,101, 94, 95,238, 99, 69,114, 67,245,110,231,128,150,122, 42,174, 25,212, 68,141,196, 78,197,158,162,182,249, 85, 43, 75,
+ 67, 49, 14,206,115,229,200, 77,138,152,167,230,110,130,170,230,213,152,131, 91, 15,139,149, 86, 71,210,222,110, 80,159,155, 37,
+ 2, 89,184, 1,205,228, 57,153,168, 54,129, 36, 79,122, 61,152,213, 96, 55, 46,176,145, 90,173, 17,118,187, 61,152, 3,238, 31,
+175,176, 73, 65, 33,100, 44,166,105,196,110, 63, 70, 59, 88,106, 83, 90,235,162,205, 43, 4, 4, 97,172,157,195,138,128,221, 60,
+167, 12,107, 1,217, 14, 78, 60,118,179,143,204,251,244, 36, 75,105, 1, 19,118,227,140,127,239,151,255, 50, 94,126,225,133, 72,
+102,179, 14, 95,251,198,107,120,247,225, 35,124,228,229,151,240,241,143,124, 24,159,254,196,199,240,153, 79,127,170, 58, 71,210,
+104,167,119, 29, 94,122,225,133, 20,133,155,238,131,224, 17,160, 42,185,226,189,103,136,115,145, 64, 41,177, 10,106, 36,160, 93,
+ 23, 43, 37,102, 24, 8, 92, 23,133,109, 15,238, 59,220,187,123,183,172, 7, 87, 87, 87,112,206, 98,109,214,232,250, 1,167,167,
+167,184,184,186,196,123, 15, 31,225,197, 7,207,226,104,189,198, 87,191,249,173, 20,151, 44, 69,125, 77,186,202, 67,237,132,149,
+ 72,233, 20, 36, 18,188,199,205,205, 22,155,205, 58,165,119, 81,201, 31,168, 52,178,186,171,112, 14,103, 74,144, 7, 73, 68,206,
+120,141, 34,225, 46,115, 10,164,104,232, 43, 89, 81, 22,158,234, 44,198,172,135,103, 66, 52,192, 43, 20,119, 46,181,147,141,151,
+ 85, 48,140,174,146,242, 1, 66,179,200, 42, 77, 52,109,218,201,197, 17, 56, 20,209,107,246,241, 83,178,155, 53, 35,212,116,255,
+146, 68, 0, 18, 49,195, 6, 15,155,186, 89,118,154,176,221, 28,129,225, 98, 59, 59, 9, 21,173,117,202,105, 85, 83, 25, 15, 54,
+116, 72,187, 31, 73,186, 6,217,137,194, 45,252, 73,227,171,244, 65,137,148, 17, 60,207,219, 51, 23,160,174,129,201, 42,153,162,
+152,141,165, 70,140, 86, 62, 53,115,188,206, 90,168,167,100, 64,121,109, 51,141,206,167, 2,188, 40, 23,141, 38,219,173,227,106,
+ 77, 82,231,253,132,136,191,229, 20,208, 83,109,180,250,224, 39, 69,156,206, 42,248,212,233, 45,189,196,245,229,100, 45, 13,210,
+160, 26, 92,177,208,201, 29,170,240,228, 80, 23,167, 55,105,136,106,253, 72,142, 12,149, 91, 29, 9,104,129, 90,139,253,252, 22,
+195,156, 2,164,180, 36, 47, 6, 82,235, 75, 36,122, 93,167, 84,105,135, 32,232, 59,130,243,132, 89, 0, 15, 0, 28, 32, 54,194,
+ 99,158,255,208,171,248,227,223,251, 93,252,232, 79,253, 60,190,242,165,127, 17,147,172,122,130,177, 0, 79, 1,157, 49,152, 80,
+ 1, 55, 69,151, 96, 12,250,174, 43, 98, 30,205,208,215,243,103,110,176, 8, 25, 78, 16,111,156,114, 66, 85, 39, 89,144,170, 4,
+ 73, 42,104, 65,161, 19,161, 0, 28,249,135,144,161, 34,202, 91, 36,176, 22,166, 62, 21,108,105, 58,244,160,206,241,242, 67, 84,
+ 83,250,164, 84, 96,164,230,126,133, 73, 95,240,179, 26,149, 68,202,222,163, 97, 15,210,114,236,137, 14,108, 61,116,251,193, 52,
+ 29,112, 42,227,153,212,232, 65,167, 32,105,160, 15, 85, 89,205, 7, 72, 51,213,127, 49,138,199,172,190,247,100,120, 7, 96, 11,
+ 23,189,161,200, 29,224, 49,164,153,217,171, 40, 14,117, 54,173,119,134,136,160,183, 22, 96,143,103,239,158, 98, 14, 1,103, 43,
+135,119,199,189,138,118,172,239,201, 16, 33, 48, 99,112, 14, 27,241,216, 6,134, 79,255,221, 13, 3, 16, 2,110,198, 25,148, 2,
+ 82,202, 48, 32, 48, 78,142, 54,248,107, 63,255, 51,120,249,197, 23, 96,140,193,195, 71,143,241,245,111,188,134,239,251,220,103,
+241,201,143,190,138,207,126,219, 39,163, 32,206, 57, 56,219,197,254, 77, 94, 31,200,128,200,194, 88,151, 84,217, 86, 29,198, 19,
+ 87, 32,147,210, 82,219,115,183,221,166,120,211,148, 60, 69, 58,216, 38,145,225, 20, 82,215, 80, 74,112,179, 22,142,227,135,242,
+193, 99, 88,173,208,175, 6,204,147,135, 15, 33, 42,230, 79,142,241,252,253,103,240,149, 63,251, 6,206, 47, 47,209, 59, 7,151,
+240,157,227, 56, 71, 59,155, 40,129,151,122,198,108,111, 83, 37,137, 50, 91,191,190,217,226,193,179,119,227, 38,156,170,252,156,
+ 63, 96, 74,151,172, 58,119, 36,163, 10,211, 51, 80, 35,131,171, 23, 90,202, 51, 92,159,131, 86,221,172,132,167,164,233,138,245,
+ 80,173, 53,248, 90, 53, 77,201,157,211, 28,203,149, 22,138, 53,205,147,170,165, 44,103,142,151, 13, 61, 85,137,129,171, 50, 63,
+195,103, 50,229,172,128, 80,210,134,110,252, 12,195, 33, 86,236,233,187,216, 92, 5, 92,158,158, 69,150, 66,226,247,103,136, 76,
+ 51,186,106,102,214,154,186, 6, 37,131,171,154,158,184,230,113, 99,183, 42,169,156, 36, 77, 71,225, 54,230, 61,212,250, 41,101,
+ 68, 23,157, 81,198,152,178,174,112,238, 14,162,102,152,115, 98,180,100,176,144,104,229,253,210, 17,100,242,136, 89,109,130,202,
+ 3,175,199,214,209, 85,149, 63,131,169,215, 82, 42,163, 94,212, 33, 45,127,135, 69,161, 36,128,203, 45,201,106,223, 74, 23,220,
+152,136,191, 83, 54, 29, 42,173,242, 42, 84,208,185,235,208,202,105,125,194, 90,114,117,168,110,188, 26, 26,212,244, 44,151,131,
+206, 3,177,133,162,239,104,165, 7, 85,123,146,118, 24, 73,105, 53,197,197, 98,154, 25,163,247, 32, 17, 12, 54,181,108,173,193,
+236, 35,109,202, 51, 48,216, 14,129,129,103, 30,188,128, 39, 15,223,129, 51,190,156,182,129,168, 80, 37,142,209,180, 76, 9, 87,
+ 73,245,103, 27, 99,176, 26,250, 6, 29, 72,198, 36, 15,235, 66,250, 87,112, 66, 92, 32, 6, 38,137, 52,234, 6,154, 62, 91, 97,
+253,166,224, 7, 82, 80, 31,210,168, 68,211, 88,170,146, 28,162,196, 44,214,176,148,148,141, 44,237, 17,137,139, 88,209,148, 42,
+161,128, 94,170,215, 35, 38,195,105,214,181, 10,250, 17,146, 40, 10,204,222,218,204, 18, 40, 50,119, 69,114, 50, 82,213,244,154,
+190,245, 1, 25,126, 5,136, 83,230,131,185,106,106,179,165,179,162, 60, 82,160,204,162, 47, 47, 31,176,161,223,190,197,235,249,
+132, 52,100,175,250,210, 44, 25, 28, 66,139,191,209, 78,179, 68,221, 23, 53,142,184,230, 20, 88,103,112, 52,116,192,236,225,140,
+193,126,156,112,186,234,241,206,211,184,217,239,167, 9,207,221, 57,198,236, 3, 46,118, 35, 32,136,252,132,113, 15, 15,194,156,
+172, 54,198, 58, 76,211,132,103,238,156,226,187, 94,254, 56, 86,195,128,221,126,143,111,189,253, 46,254,220,231,190, 19, 47, 60,
+255, 92,217, 88,191,249,250, 27, 32,107,241,233, 79,124, 28, 31,121,241, 5,116,174,195, 28, 66,172,164,140, 65,215, 13,241,250,
+ 7,109, 27,138, 31,202,207,115,140, 30, 38,130,181, 3,216,207,176,221, 0, 34, 3,239,103,188,255,248, 49, 68, 24,199, 71,107,
+156, 30, 29,213, 47,194,218,154,124,165, 20,215, 92, 80,172,146, 50,208, 85,150, 57, 7, 56,234,112,116, 20, 23,213,169,139, 29,
+ 9,187,219, 99,183,189,193,213,205, 22,179,247, 56, 90,175,113,247,236, 12, 15, 31, 63, 1,179, 96,232, 28,174,111,246, 69,217,
+156, 15,173,121, 29, 11, 97,134, 49, 93, 17, 6, 51, 7,108,119,251,194, 62,136,113,217, 74,180, 42,153,211,160,138, 18, 67, 21,
+ 64,147,114,192,243, 40, 73,219, 37, 9, 45, 9, 78,234,100,247,150, 14,164, 52,200,227,166,130, 71,182,136,113, 13, 31,202,236,
+169, 50, 70, 95,160,151,163,103, 42, 42,242,115,202, 31,153, 68, 90,172, 34,176, 44, 86,179, 57,189, 51,223,247, 28,215, 73, 9,
+ 33, 30,238,132, 65,193,195,112,172,218,193,161, 0, 84, 72, 60, 78, 46, 24,231,167,103,105, 67,207, 35, 61, 41,110, 4, 93,165,
+ 87,171, 51,165,207, 83,245, 82,185,235,153, 61,220,180, 72,100, 36, 21,154, 30,175,171, 81, 46, 2, 86, 17,180, 42, 33, 82, 69,
+199, 82, 82,185,107, 87, 11,169, 89, 95, 57,184,177, 36, 95,126, 77,255,172,168, 85,180,132, 58,249,128, 5,133,212,156, 93, 20,
+ 43, 68, 89,200,137, 40,206,248,169, 2,123, 34,167, 32, 37, 95,230, 16, 31,170,189, 29, 87,160, 39, 89,215,111, 76,181, 4, 44,
+185,195,105,195,226, 44, 34, 91,116,193,141,105, 83,193,165, 1,111, 44,145, 8, 56,244,230, 30, 24,215,106,112,193, 65,125,166,
+226, 12, 15, 84,253,170,197, 11,174,252,100, 14,140,121,246,152, 38,143,113, 26, 49, 78, 19,198, 45,112,186,114, 16, 27,191,196,
+ 73,128,221,236,177,187, 25,113,239,254, 25, 0,194,159,252,193,151, 34,209,235, 95,254, 75,204, 28, 55,107,171,231,191,170,231,
+ 18,149,213,213,211,120,122,114, 84,231,110,168, 65, 36, 92,236,108,121,182,147, 90, 45, 7,179,186, 42, 20,169, 39, 89,157,185,
+107,148, 45, 43, 71, 65,230, 16,137, 80,125,166, 20,125,179,172,232, 84,156,108, 41,165,122, 87,194,146,114, 24,202,218,130, 18,
+167, 38,229, 65, 19,169, 93, 6, 18, 81,161, 9, 89,224, 24, 57,208,108,162,159,183, 4,205,192, 68, 54,129,242,173, 55, 84,165,
+194, 85,214,247, 96,237,204, 44, 91,234,101,159,230,204,253,175, 15,134, 73, 93,135,188,176,234,180,185, 66,181,210,179,244,131,
+188,229,138,145, 33, 77, 55,100,224,208,225,155, 14,135, 70,101, 62,169,112, 22,249, 32, 55,135, 14,209, 81,202,218,245,106, 5,
+ 43, 19,172, 51,105,230,203, 88,119, 14,175,222, 59, 1,145,224,244,238,203,120,116,126,137, 55, 30, 62, 6,132,240,217, 79,189,
+138,175,254,217, 55, 1, 34,108,231, 25,100, 93,244,128, 7,143,231,238,157,225,123,191,243, 59,112,247,244, 4,255,236,119,255,
+111,252,194,207,124, 30,125,215, 97,221,103,250,155,131,177, 14, 38, 97, 94, 77,226,188,147,177,112, 67, 28, 33, 5,207,152,198,
+ 61,250,190,143,234,111, 6,158,158, 95,193, 58,131,227,163, 13, 32,132,253,110, 15,235, 28, 86,201, 50,196,251, 29,152,128,221,
+126,196,233,209,186,140, 87, 50,213, 81, 74,138, 87,250,189,159,227,197, 55, 38,229,190,155, 98, 1,202,191, 39, 9,181, 50, 54,
+ 22,243, 52,198, 77, 63,193, 99,186,174,195,157,179, 51,188, 48, 77,184,190,121, 29,243, 60,227,187, 63,243,105,188,243,238,123,
+248,198,183,222,198, 48,116,152,102, 95,141, 13,169,154, 42, 64, 22, 83,227,126,153, 25,126,158, 43,232,133, 9,100,106, 78, 58,
+180, 8, 50, 11,218,178, 58, 62,207, 95, 51,238, 85, 14,141, 26, 57,252,170,186, 82, 85,142,182,168,146, 40, 35,100,115, 37,199,
+ 74, 28,154,113,197, 76,101,140,150,109,149,109, 45, 84, 71,114,198,198,231,145, 57, 10, 3,137,226,230, 14,202,103,120,106,115,
+220, 77,230, 61, 48, 16, 82, 42,224, 60,131,189,135,225,144, 60, 46,249, 59, 10,201,174,197, 73,243, 17,159,221,179,235, 27,220,
+220, 57,171, 7, 11,105,243,201, 69, 85,236, 69,159, 36,173, 6,161, 96, 96,203,252,251,208,223, 87,219,233, 21,111, 45,234, 24,
+ 33,168, 5, 79,137, 67, 79,153, 23,198,152,146,139, 94, 54,216,244,251,188, 20,113, 70,118, 75, 20,204, 37, 88,123, 75, 64, 85,
+209,118,149, 72, 89,187,107,104, 62,175, 52, 29, 5, 29,232,164, 71, 4, 49, 74, 56,212,112, 31,109, 13,207, 46, 35, 2,220, 50,
+227, 55, 35, 56, 41,183,131, 4, 42,111,157,203,208, 64,163, 78,179,181,237,160,113,217, 58, 43, 22,237,119, 69, 52, 19,173,170,
+110,115,170, 9,183, 65, 12,104,193,131,199, 1,119,180,182,255,170, 72,201,123,143,253,236, 49, 79, 30, 38,196, 69,234,102,154,
+192,222,161,163, 56,191,155, 16,163,244, 38, 97, 60,122,248, 20,110,232,240, 79,254,139,191, 15,103, 13,188, 68,138,149, 8, 99,
+156,162,224,193, 19,193,165,155, 56,146,197,146,128, 33,241,222,143, 54,171, 98,103, 41, 89,245,101, 46,146,145,168,113, 55, 34,
+163, 9,103,137,124,167,245, 8,188,184,117,114,126,124,153,201, 40, 49, 72,193, 37,114, 57,105,114, 9, 45,168,105, 83, 37,230,
+ 51,189,191,146, 85, 79,154, 73, 78, 48, 57,142,145,178,184, 71,143, 75, 22, 41, 79, 41,217, 44,139,249,226, 26,200,137,118, 87,
+129, 38,217,199, 94,226, 81,155,135, 97, 1,223,148, 54, 25, 89,148,110,163, 40,245,115,194,170,246,220, 18, 32, 65, 34, 27, 64,
+113,119,179, 70,160, 62,134, 92,221, 19,139, 48,134, 18,251,188,196,192,178, 38,113, 82, 59, 10, 80,170,218,219,230,255, 57, 95,
+168,177,233,213,246, 7, 0,194,122, 53, 96, 77, 43, 92,157, 63, 5,164,135, 77,194,206,211,117,220,100,239, 28,111, 48,206, 51,
+230, 0, 60,115,118, 2, 2, 33, 36,116, 44,250, 21,194,126,139, 32,192,122,213,227,135,190,239,123, 65,194,152,198, 17,127,245,
+103,127, 10,155,163, 99, 12,206, 68, 1,156, 49,176,157, 75, 52,184,184,193,229,185, 31,140, 75, 27, 0, 96, 49, 1,100, 49,207,
+ 51,122,215,193,117, 22,247,238,156, 86, 33,149, 8,134, 97,192,126,220, 99,191,149,136,100, 77, 97, 27, 34,128,117, 29,188,159,
+ 83,171,215, 68,108,109,224,106, 0,228, 44, 58, 12, 81, 45, 79, 20,157,243,197,230, 23,138,160,170,246,243, 57,146, 27, 67,192,
+126,154, 74,171,126, 12, 1,155,205, 6,207, 62,115, 15,125,223,225,242,242, 10,247,238,222,193,187,143,158,224,122,187,175,153,
+ 0, 10, 46, 66,134,203,162, 94, 14,210, 82,195, 91, 50,107,208,164,141,189,132,166,106, 4,106,130, 23, 81,178, 19,130,170,189,
+138, 52, 67,114, 49,166, 33,214,248,207, 69,195,146, 22,181,140, 18,194, 73,122,206,114,164,169,136,182,108, 73,237,228,229,172,
+249, 16, 74,122, 93, 16, 65,152,125, 51,138, 35, 74,157, 68, 68,198,129,238,198, 48, 51, 36, 4,240, 60, 35,204, 51,194, 52, 33,
+ 76, 19,192, 30, 14,177,227, 98, 10,176,138,227,181, 74,164, 62, 97, 6,118, 91,244,125,143,121,179,174,150,212, 98, 89,171,129,
+ 37,220, 16,184, 84,161, 46, 75,253, 23, 85,251,110,137, 31, 81, 81,208, 41, 92,135, 77,236, 22,138,214,116, 72, 61,132,103, 17,
+111,241,161,103, 6, 65,238, 34,144,169,243,116, 82, 35, 52,150, 36,114,190, 37,139, 36,109,250, 92, 52, 83,173,186, 95,219,245,
+116,224, 84,177, 71, 82,142,119,102, 69,179, 19, 53,214,100, 53,134, 37, 37,163, 20,168,129, 64, 43, 98,147, 4,250,206,233, 57,
+241, 13,153, 70, 12,220,182, 13,209,154,226, 69,202,243,215,164, 82, 74,211,217,168, 16,123,180,194,185, 18, 25,152, 79,158,203,
+ 95,170,122,211,179, 81,149,178,215,192, 27, 0,193,126,187,131,120,143,144, 54,116, 99, 8, 39,235, 30,119, 55, 3, 54,157,131,
+233, 28, 38, 31,176,219,238,241,177,239,253, 2, 46,175,119,184,124,124,137,207,253,249, 47,224,226,226, 6, 87, 23, 55,120,248,
+228, 2, 79,159, 94,227,201,249, 13,110,118, 99, 2,193,152,106,219,160,106, 9,178, 38, 2, 58,202, 30,144,184,206,209,147,153,
+ 54,111,225,242, 32,182,100, 49, 36, 85,180,138,231,203,104,193,164,142,103,229,251,172,246,142, 28, 0, 16,197, 87,249, 6, 90,
+ 2, 29,242,159, 1,243, 45,144, 7,212,135, 44, 47,185,172,210,211, 88,135, 17,164, 86, 20,215,138, 56,155, 87,139,125,171,104,
+197,234, 98,134,102,150,175,225, 26,162, 68,117, 75, 92,164, 38, 75,137,178,118,168,185, 28,233, 27, 76,119, 54,232,192,207, 89,
+248,244, 36,202,102,201,139, 60,104,129, 52,169,108,234,115,139, 98,187,171, 36,235, 15,128, 43, 52, 39,146, 74,197, 85,153,209,
+186,221, 42,192,170,115,184,127,178,129, 51,113,145,177,214, 70,132, 49,168, 88,216,190,242,250, 59, 32, 97,220, 61, 61,198, 55,
+223,124, 39, 94,127, 55, 96,220,111, 99,216, 11, 4,127,237,103,127, 18, 95,251,198,107,120,229,165, 23,240,109, 31,255, 40,206,
+238,156, 97,179,234,209,247, 61,250,213, 10,253, 16,201,112,113,131,143,158, 92, 71, 38,110,246,153,156,229,103, 88,107,209,117,
+ 14,155,205, 17,108,231, 34, 52,166,235, 98,149,108, 29,140,181,176,214, 96,157, 40,115,211, 56,226,122,187,197,245,205, 14,119,
+ 78,239, 68, 59, 87,178,179,133,212,186,149,196, 96,103,239,147,215, 31,105,156, 67, 57, 43, 37, 89,171, 66, 75,224,202, 57,211,
+121,166,111, 12, 58,107,112,180,138, 0,155,213,208, 23,103,192,253,103,238, 97,179, 30,240,244,226, 18,207,221,191,135, 15,191,
+248, 92,220,184,185, 85,233,198, 52, 69,163, 92, 39, 40,243,102,214,185,215,136,213,167,142, 48, 46, 51, 97,117, 44, 43,129, 73,
+101, 65,227,218,175,164,234,118, 41, 25, 20, 69, 50,186, 8,128, 80,104,149,220, 1,163, 52, 14,173, 27, 6, 41,141, 0,218,123,
+ 83,170, 93, 45, 31,106, 57, 48,252, 52, 71,168, 76,211,233,231, 82,132, 64,146,202, 91, 66,193,236,250,121,198, 60, 77,152,119,
+ 59,236,111,174,177,223,222, 96,191,221, 98,119,115,131,113,183,197, 56,142,152,253,140, 16, 98,248, 78, 8, 81,204, 25,188, 71,
+152,246,232,174, 46, 82,135, 47, 23,137,234,122,230,234,149,185, 25,161, 29,240, 74, 74, 96, 76,222, 27,234,239, 77, 22,105,154,
+132,196, 54, 41,203,141, 84,144, 9, 81, 35,196,203, 30,124,163,208,177,249, 87,142, 82, 37,165,109,160,130,151, 78,107, 95,186,
+ 81, 73, 89,104, 68, 41,102, 26, 69, 63, 51, 56,112, 33, 45,102,210,160,166,124,200,162,235,208,252,106, 0, 92,245, 96, 67, 18,
+169,164,145,193, 82,112,133,104,227, 33, 57, 69,217, 53,190, 99,237,241, 83,105,110, 74,181,220,250,242, 90,159, 63, 26,112,192,
+225,169, 75, 74, 91, 84,233, 51, 75, 74, 86, 78, 70,167,214,163,167, 2, 97, 84, 3,173,158,172,148, 0,121,127,117,137,222, 0,
+182,119,160,142, 64,236,113,103,211,227,120,232, 96, 72,240,242,119,127, 1,127,240,219,255, 4,215,219, 61, 62,252,234, 39,241,
+254,215, 94,193,131,143,126, 22,255,239, 23,127, 3, 63,254, 87,126, 9,255,244, 31,255, 42, 40, 8,182,222, 99,158, 3,246,163,
+199,241,153,133,192, 37, 56,127,222,140, 83, 32,134,115,105,142,155, 34, 9, 81,177,176,146,170, 87, 18, 83,116, 0,139,193, 5,
+218, 90, 66, 74,117, 71,141, 1,189, 85,239,138,250,134,140,180,135, 27,226,116,211, 19, 43,181, 56, 41,135,131,220, 34, 68,147,
+ 3,172,175, 40,225, 89,238, 38,200,130, 1, 84,242,158,243,231, 84,200,198, 42,164,163, 38,144, 34,139, 65,154, 10, 87,106, 24,
+131, 22,210, 9,168,145, 97, 72,251,196,171,189, 62,177,146, 69, 5,177,136, 74,116,210,237, 50,212,107,213,228, 97,180,110,186,
+148, 4,168,186, 77,229, 15, 45,186, 71,244,129,210,250, 70, 89, 67,234, 30, 70,153,155, 17,238, 88,193, 73,223,161,179, 14,150,
+ 8,189,179,152,156,131, 15, 30,228,129,135,143,159, 96,156, 38, 4, 16,118,227,132,155,155, 45,102, 16,246,227, 22,115, 96,156,
+172, 6, 60,119,255, 46, 78, 78,142,241,151, 62,255, 23, 48, 56, 7,103, 13, 58,107, 99, 21,109, 13, 40,189,182,201,153, 1, 9,
+ 78, 68,157,171, 66,157, 84, 13,231,207,231,250, 1,126, 26,203, 92, 53,222, 74, 22, 68, 38, 65, 90,226, 12, 62,134,188,108,208,
+ 13, 67, 92,252,192,176,112,152,167, 9, 28,124, 28, 15,100, 37,188, 8, 40,132,196,130,161,218, 81,201, 11, 47, 25,117,105,171,
+134, 71, 66,106,241,134,184,225, 88,103,203,236,117,154, 3,134,213, 26, 6,192,189,179, 51,172, 86, 43, 92, 92, 94,225,201,197,
+ 21,122,103,177,103, 95, 67, 86, 82, 23,201, 90,151,218,208,106,211, 1,154,131,167, 20,169,177, 52,182,169, 74,110, 85,157,185,
+218,138, 42, 0,152, 24,155,156,186,115,101, 13,227,210,145,184,197,203,179, 64, 16,183,145,162, 80, 66, 81, 44,194, 61,242,189,
+198, 69,236, 22,181, 82, 33, 57, 39,234,166,149,198, 34, 16, 32,117, 35, 77,234, 56, 80,242,103, 11, 11,194, 60, 99,220,237,224,
+119, 91,204,187, 29,252, 60, 1,204,209, 1, 50, 25,240,208,131,251, 30, 93, 17, 17,114,185,190,128,129,236,247, 24,158, 60,193,
+254,238,157, 5,143, 3, 21, 35,155, 70,143,237,140, 93, 74, 84,114,113,164, 44,218,242,173, 93,186,218,116, 13, 73,234, 24, 82,
+ 57,108, 21,193, 31, 98, 23,175, 81,148,235,182,125, 22,237,178, 52, 95,121,238,146,198,179, 26, 45, 2,168,171,187,137,165, 13,
+183,201, 21,122,254, 85,253,120,138,241, 97,110,113,120, 45,192,222, 5, 61,150, 81,181,249,135, 9, 43,245,251,114, 65,167,150,
+168,165,131, 65, 42, 62,182,102,225,150,155, 34, 9,185,116,164,104,253, 17,124,160, 51,206, 95, 88,243,239,100, 97, 75,206,173,
+ 93, 35, 7, 0,208,250,222, 20, 48,231,128, 97, 19,255,236,118, 63, 98,156, 61,216, 7,172,108,252,217,215,251, 25,193,207,112,
+150,240,199,191,243, 63,163, 31,122,156,117, 29, 94,255, 87,255, 61, 30, 60,184,139,163, 1, 56,233, 8,191,255,235,255, 11,238,
+159, 30, 97,211, 59,140,227,140,237, 20, 49,156,110,183,199,126,118, 17,121,105, 34,234, 16,185,205, 76, 53,216,128, 80,231,102,
+140, 36, 78, 75,237,149,242,112,103,239,114, 82,110, 50,171, 54,187,154,235,228,239, 81,164, 37,253,212, 89,187,170, 26, 84, 54,
+123,157,122, 41,129, 93,194, 87, 74, 30,153, 35, 5,199,168,195, 16,149, 76, 97,180, 4, 39, 21,158, 34, 13,237, 38, 55,131,162,
+ 1, 50,174, 95,138,138,103, 20,212, 85, 39, 73,165,185, 22, 41, 84,107,182,204, 52, 60,118,133,119, 44,126,122,109, 77, 82,147,
+129, 40,144, 51,197,195,171,103, 64, 37, 38, 81,116, 68, 45, 26,218, 19, 41, 20, 40,212,225,177, 10, 27,227,207,176,116, 64,112,
+106,192,156, 31, 36,185, 43,207,128,112, 51,199, 15, 33,192, 72, 64, 8,140,222, 70,234, 22,216,192, 25, 74, 63, 75,240,135,175,
+189, 3,102, 65,215, 37, 48,164, 53, 24,247, 51,156,181,248,177,239,255,110,188,243,238, 67,252,149,159,251,105,184,161,135, 51,
+177,202,183, 38,181,220,157, 75, 42, 95, 91, 14,158, 81,201,174,242, 30, 50, 96, 37,137,155, 0, 96, 88,109, 16,230, 57,186, 67,
+114,104, 74,110,231, 6, 15,200, 12, 50, 4, 67, 54, 70,116,122,143, 49,120,184, 97,149,196,116, 83,105,141,138,228, 92,234,196,
+225, 79,213, 56, 41, 84, 41,140, 41, 85,108,134, 85, 21,118, 3,135, 82,221,251, 16, 9,116,113,147,143,118, 52, 63, 79, 56, 59,
+222, 96, 53, 12, 8,214, 70,103, 64,223,163,115, 22,199, 71, 27, 56, 55, 97,187,159,202,194,109, 77, 20,138,137, 2, 69, 17,197,
+239,171,204, 62, 83,252,138,161, 68,210,204,224, 26, 99,212,158,203, 11,136, 87,212,115, 24, 83,147,247,162,142, 46, 65,153, 80,
+ 57,238,162, 3,178,114, 71,146,177, 0, 62, 73,235, 38,106,132, 95, 58, 3,163, 30, 82, 67,182,171,113,188,183, 24,145,146, 71,
+ 41,167, 65, 50,237, 46,117, 69,140,137,216,108,226,248, 61, 91, 14,209, 29,192, 1,126, 26,177,189,185, 1,239,247,152,167, 17,
+ 33,132,232,242,233, 92,217,184,188,115,112, 69, 84,198,165, 26, 15,204,176, 87,151,176,199,199,152,157, 83,207, 44, 39, 24, 76,
+234, 98,240, 98, 12, 43, 58,173, 83,217,134,160, 82,191,165,110,182, 17, 11,108, 84,122,165, 74,108, 52,117,198,157, 43,116,101,
+ 6,168, 21,145,161, 34,168,132, 81,107, 29, 80, 66,193,234,232, 88,121,225,211,124, 59, 19, 0,185,217,208,165,116, 61,218,180,
+ 80,131, 54,194,118, 97, 5,147,195, 1,180,192, 36,139,113, 61,252, 48, 73,252,222,111,245,161,233,243, 64,106,189, 83,179,121,
+212,185,122,179,225, 67,110, 29,160, 23,186,209, 7, 72,141,155,108,118, 28,174,143,153,189, 45, 10,208, 65,137,186, 35,202, 71,
+ 47, 7,114, 59, 46, 85,157,239, 44,156,181,240,126,134, 15,140,113, 63,129, 16, 48, 19,224, 76, 36, 32, 13,171, 14,195,170, 7,
+194,140,121,126,138,243,224, 97, 87, 27,216,224,193,134,113,186,234, 33,129,113,126,185,197,246,106,135,155,113, 70,152, 25,247,
+ 78, 54,224, 4,237,201,202,114,107, 77, 18,202,216,226,111, 20, 99, 10, 11,218,228, 48,136, 36,114, 49,148,211,154,148, 46,160,
+225,252, 82,225,131,231,238, 69, 99, 42, 16,101, 78,204,243,114,169,244,190,104,129, 72, 36, 58, 42, 17,236,113,195,229,116, 20,
+203, 89,207, 74, 69,207,249,160, 84,110,222,108,211,201,254,226,132,170,204,249,234, 36,101, 35, 38, 48,162,248,221, 32, 59,233,
+ 72,114,200, 65, 43,148, 43,235,225, 98, 22,157, 21,255, 77,123, 74,205,220,178,139, 66,207,187, 72, 85,220, 82,240,154,162,112,
+158, 84,200,115, 21, 26, 3, 5, 17, 33, 37,120, 81,109, 86,212, 25,165, 20,101,174, 30, 91, 45,176,179,116,152,106,144,219,129,
+164, 5, 38,121,142,155,254,212, 87,254,244, 53,220,241,113,195, 49,226,225,236, 0, 70,136, 73,130,194,120,114,179, 67, 96, 15,
+ 33,224,222,233, 49, 30,157, 95, 97,156, 38,136, 48,126,238,199,127, 20,255,251,111,254, 11,252,157,127,247,151,209, 15, 3,140,
+115,232, 19,134,212, 90,155, 20,234, 49,149,208, 36,113, 13,153, 72, 90,203,209,182,148,161, 58,101,148, 38,176,198, 69, 81, 90,
+185, 23, 57,241,181, 99,251, 92,146,176,142,147,234,222,218, 14,182,239, 49, 12, 27,132,224, 49,222, 92,131, 83,101, 45, 62, 20,
+171,171,132,172,183, 56,140,203,228, 50,126, 9,106,254, 29, 98,251,182, 36,135,133, 72,166,203,255, 45,112, 9,237, 89, 13, 67,
+238,173,195, 57,135,213,106,192,253,123,119, 49,116, 61, 94,123,235, 29, 24,227,211,134,155, 54,164,212,121, 16, 91,221, 61,171,
+161, 87, 58, 32, 46, 99,201,220,121,106,196,166, 73,124,102,148, 90,220,100,200, 16,199,141, 61,111, 38,249, 53,162, 38, 41,179,
+ 34, 76,169,234, 53,140,168, 50,214,181,207,188,222,105, 85,129,111,212, 51, 19,231,211, 33,132,164, 85,144, 4,212,137, 46, 19,
+ 99, 80,198,111, 4,137, 42,107,102, 88, 0, 86,226, 1,137,216,195,132,232, 65, 55,193,131,102,143, 35, 18, 92,142,123,236,182,
+219, 72,217, 76,154, 42,239, 67, 92, 91,189, 71,239, 44,186,212,169, 20,174,250, 32,239, 3,108, 8, 88, 93, 92,128,238,221, 43,
+ 27,158,118, 44,197, 67, 80, 29,241, 74,201, 62, 95,234, 12,164,153, 55,139,202,178,104,187, 95,148, 18,206, 4,100, 35,197, 47,
+ 11, 0,141, 53,170,141, 93,233,156, 36,212, 16, 44, 83,116, 79,210,226,212,238, 77,252, 46,185,240, 9,168,116,154,165, 92, 3,
+ 82,163, 5, 46,226, 65, 81,107,138,110, 78, 73,189,143,136,234,168,111, 9,202,214,107, 78,118, 77, 81, 92,199, 93,205,176,160,
+ 69, 16,192,161,171,162,100, 98,103,155, 80,230,190, 55, 4,174,202, 93,167, 37, 12,134,128,219, 0,178,185,101,101,104,217,179,
+ 87,191,167,234,149,206,255,138, 85,128, 12, 45,248, 35, 7, 36, 59, 16,206, 54, 71,224,213, 57,176,114,232, 12,224,167, 17, 52,
+143, 48, 18,176,221,123,140,222, 99, 29, 28, 16, 4,179, 48,126,240, 47,253,117,252,206,111,254, 31,184,124,247,155, 8,126,132,
+ 79, 74,234,161,239, 48,108, 86,184, 11,194,205,110,130, 23,193,110,156,209, 13,125,105, 31,147, 49, 88,173,215,141,239, 50, 29,
+247,178, 60,187, 68, 50, 54,214, 59,149,143, 43,106, 92, 17,131, 72, 76, 11, 50,205,202,126,245, 29,229, 36, 48, 74,150, 26, 73,
+ 27, 45,140, 84, 97, 30,167,147,104,170,220, 13,155,194,181, 46, 75,133,212,188,114,189,132,136,106,107, 51,155, 2,129,160, 69,
+ 27, 76,251,176, 99,123,138,219,156, 99, 50, 81,152, 4,197,134, 78,240, 29, 81,224,250, 70, 67,183,104,253,148,214,214,129,147,
+ 34, 30, 94,106, 11, 52,205,189, 20,188,161, 17, 28, 50, 55, 3, 59, 86,228, 45, 81,135, 43,157,103, 32,170, 37, 88,147,175,148,
+ 10, 94,169, 87,231,121,198,229,213, 22, 79,207, 47,113,113,121,141,237,118,143,221,110,135,113,220,194,207, 19, 66,240,144, 60,
+239, 52,177, 21,184,221, 94,227, 39,191,253, 21,240, 76,176, 26, 53,155, 78,249,175, 61,190,138, 85,101,106,157,251, 4,161,249,
+215,190,227,147,248,181, 95,255, 45,252,173, 95,250,183,176, 90,173, 99,182,121, 66,149,154,188,113,154,252, 43, 86,224,100, 13,
+196,184, 4,193,145, 50,163,206,148,187,162,176, 78,222, 93, 9,177, 29, 27, 55,244,180, 81,100, 53,114,240,177,114, 48, 0,147,
+193, 60,238, 19,236,195,196,116,195, 84,209,115,250, 59,162,176,177,162, 43,187, 76,233, 19,129, 88,151, 14, 61,136, 66, 45, 1,
+152,125,137,251, 12,115, 72, 1, 45,113,131, 15,193,199, 77, 94, 4,150, 0,132,144, 26, 80,132,206,117,216,237,246,176,214,224,
+244,120,131,113, 14, 96, 68,158, 39,167, 25,181, 73,215,128, 76, 12,101, 58, 62,222,160,105, 93,161,174,131,154,235, 13, 21, 33,
+ 74, 10, 0,195, 9,118, 66,101, 99,151, 98, 65,163,180,225, 20, 24,141,242,139, 87,166,121, 94, 11,120,225, 96,175, 80,146, 34,
+ 74,205, 7,253,116, 96,141,135, 20, 41, 54, 44, 66,172,182, 13, 81,202,152,175, 7, 94, 8,195,230, 13, 63,228, 3, 48,131, 56,
+ 0,193,131, 66, 0,241, 12,225, 25,247, 54, 3,190,254,248, 73,189,255,133, 97,157,197, 52, 25,204,157,195,208,119,232,156,139,
+221, 0,105, 19,210,140,103,240,205, 53, 86, 39, 39,128,181,106, 19,172, 97, 52,203,182,188,134, 36, 85,129, 91,213,233,228, 32,
+152, 24,170,105, 10,152, 39,239, 83, 4, 13,165, 18, 88, 75,202, 66,170, 84,171,208, 77,179, 28,174,147, 90,227, 37, 84, 75, 17,
+ 52,243, 51, 95,174, 27, 53, 73,164,162, 26,156,101,166,206,172,242,226,165,166, 90, 74, 37,207, 69,200,145,118, 20,201, 65,167,
+176,232,167,178,186,138,227,174,232,114, 43, 88, 7, 80,177, 82,225,105,203, 1,145,105,224, 30,162, 82,172, 32, 10, 38,163,213,
+199,185, 82, 38,220,138,248, 40, 96,147, 92,249,208, 34, 53, 72,104,209,162,165,154,193, 46, 82, 35,245, 14,166,244,130, 54, 30,
+ 22, 56,127,255, 49,142, 57,192,116, 22,182,115, 48, 70,112,247,184,199,204,140,241,209, 37,142,187, 14,199,199, 43,236, 67,180,
+ 13,124,235,181, 63,197,147,119,223,130,247, 19,198,201, 67,152, 49,207, 1, 97, 37,176,235, 1,155,227, 13,186,190,195, 59,231,
+ 91,236,124, 0,108,128,113,174, 88, 16,134,174, 83,177,128, 20, 17,174,168,128,146, 40,184, 86, 85,225,173, 35, 11, 41, 59, 24,
+ 25,105,132,107,249,164, 74,172,133, 92,181, 82, 71, 66, 99,178, 80, 82,160, 75,189, 30, 82,103, 20,185, 26,226,236,173,206, 97,
+ 15,121,214, 70, 7, 56,192,114,210, 21, 53,154,209,149,124,113, 51, 64, 97, 96,147,111, 52,182,198,210,193,193,232,141,126, 41,
+ 9, 79,183, 43, 47, 15,106, 74,101,138, 54,182, 84,138,150, 79,147,168,180, 24, 15,106,126,143,162, 94,133,106,169, 17,161, 16,
+222,106,136, 67,189,191, 69,205,220,243, 40,107,158, 38,236,119, 35,110,174,111,112,113,121,133,235,171,107, 92, 95, 93, 65,252,
+ 8,146,104,161,180, 68,152, 60, 99,246,113,227,217,143, 35,230, 16, 48,205, 30, 34, 2,159, 54, 31, 16,129,131,135,165,151,211,
+108, 51, 91,192,226, 38,119,126,179,195,236,231, 34,236,185,184,217, 3, 0,214, 67,143, 63,254,234, 55,240,249, 31,250,126, 60,
+120,240, 0,142, 24,126,119, 9,244, 43,160,235, 65, 68, 41, 18, 85,141,189,172, 1, 92, 95, 92, 47,113, 14,234,227,102, 27,124,
+ 25, 35, 69,113,149, 7, 89,115, 72,248, 67, 37, 13, 2,177, 93,207, 0,194,184, 7,165,214,188, 0,240,126,142,173, 95, 31, 91,
+220,217,146, 22,237,106,146,170,198,204,105, 72, 8,222,188, 54,132, 0,241,190,180,214, 69,193, 74,188,143,207,102, 72,200,219,
+ 56, 47,142,222,234, 26, 16, 18,255, 30,135, 0,151, 4,125,155,245, 26,195,205,136,209,179,130, 6, 37,193, 85,138,215, 52,100,
+113,180, 94, 23,229,179,136,130,131, 44,245,143,233,222,176, 9,215, 91,121,226, 41, 35,128,146,149, 83, 85,249, 92,170,210,236,
+193, 87,243,219, 50, 41,147, 10, 63,186, 45, 55,156, 43,171,162,232,146,146,133, 55, 35,132, 33,137, 87, 23, 34, 99,159, 56,106,
+ 24,202, 24, 37, 61, 35, 54, 71, 74,167,120, 87,147,132,140,148, 60,251,134, 25, 61, 4, 27, 2,158,187,115,138,215,223,123, 20,
+159,155,212, 1,232, 58,135,185,235, 48,205,115, 76, 18,180,174,140, 38,106, 54,133, 7,247, 3,236,118, 11,115,114,162,198, 95,
+ 74, 25, 37, 10,182,165, 52, 13,101,244, 32,173, 94, 32,127,143, 6,212, 36, 77,230, 52,189, 60, 10, 73, 81, 7, 49,226, 86,109,
+ 55,194,166, 58, 96,138,126, 43,179, 91,148,107,161,100,162, 84,179,107, 9,174,206,224, 54, 13, 82,210,150,189,116,223, 50, 43,
+107, 27,234,158, 70,170,192,105,228,114,234, 11,170, 49, 63, 92,125,244,170,216,102, 80,116, 34,136,198,234, 73,203, 84, 47, 74,
+205,172, 44, 94,144,219, 52,213, 45,103, 18, 55,158,115, 94,134,123,220,142, 5,171,115, 84, 58,216,158,151,132, 46, 58, 96,126,
+181,200, 90, 13,183,105, 66,106,252, 84, 30,120,176,224,164, 39,140,204,120,114,113,131,253, 60, 3, 32,220,236, 13,246,251,152,
+198,246,173, 47,127, 9, 71,142, 32, 39,107, 76, 62,194, 52,246,147,199,229,232,193, 55,123, 28, 29,111,224,250, 14,199,155, 30,
+187,209,195,123, 6, 17,195, 25, 11, 67, 6, 71,199,235,210, 22, 74, 99, 93,176,137, 9,109,217,187,173, 65, 20,114, 11,247,190,
+204,108,160,194, 67,116, 38,123,201,244, 38, 5, 85, 16,160, 48,225,147,253, 70, 76,153,153,115, 43, 37,140, 55, 69,206, 19, 78,
+ 27,123,246,144,235, 13,157,154,188,101, 41,241,169, 34,203,141,252,182,223, 83, 33,186,197,215, 79,173, 72, 36, 22, 50, 41,100,
+236,129,119,173,190,190,166, 76,105,160,145, 72, 75,180, 47, 66,170, 5, 6,180,102, 14, 44,102,231,250, 1,228, 22, 5, 27,231,
+170,132,155,155, 29,118,187, 29, 46,207,207,177,189,190,193,180,191,193,184,219, 97,187,219, 22,213,178,164, 13,100,242, 51,230,
+ 57, 10,145,230,121, 46, 66, 37, 24,139,113,154, 49,207, 51,166, 57,110,114,158,115,120, 4,151,247,203, 92, 95,143,210, 2,157,
+171,169, 55, 30, 61,109, 4,167,227, 60, 39,123,216,140,143,190,242, 2,190,231,187,190, 51,169,228, 3,152,128,153, 3,174,159,
+ 62,130,247, 30, 6,130,245,241, 41,142,207,238,162,239,122,116, 38,161, 90, 65,144,224,251,226,105, 64, 0, 0, 32, 0, 73, 68,
+ 65, 84,163, 32,142, 34,222, 53,182,165,227,166,203,222,195,118,189, 82, 88,115,177,105,129, 40,182,211,133, 65,198,162,239, 87,
+ 48,100, 48,209, 8, 63, 79,152,120,159, 54, 93,174,247, 74,206, 13,151,236,178,145, 58, 10, 33,163,132,178, 57, 12,166,250,219,
+ 37,248,164,209,142,173,127, 9,190,216,162, 56,196, 95,146, 66,109,152, 25,158, 76, 68,190,206, 62, 89,234, 66,218,156, 9,125,
+215, 97, 10, 83, 92,112,173,105, 36, 70,214, 70, 52,237, 48,116, 5,253, 90,168,129,101,241, 70, 25, 43, 21,192,145,169, 41,138,
+ 13,173, 85, 42,180, 40,219,230,160, 54,131, 66,184, 32, 29,230,132,130,128,174, 46, 38,213,144, 45,163, 49, 73,247,173,148, 14,
+ 95, 60, 36,166,214,122,234, 88, 88, 97, 88,174,213,119, 17,178, 17, 42, 7,128, 72, 81, 25, 37,254,217, 84,177,231,103,168,115,
+ 22,119,214, 61,158,172,123, 60,124,242,180,164,185,217,201, 96,236, 28,134,174, 67,223,197,106,221, 89, 91,149,219,233,208,135,
+121, 70, 55,142, 88,109,142,210,216, 71,150,244,112, 53,222,146,134, 89, 82,108,179,217, 17,148,212,235, 84,194,111,170,160,208,
+228,207,149,243,234, 75,124,170,202,232,144,184, 46, 35, 41,200, 27, 45, 76,233,240,181,185,241,213,141, 3,165, 72,143,219,123,
+169,206, 25,141,221,171, 69,223,162,145,117, 83, 10,188,146, 68, 44, 92,174,123,164, 70,123,205,235, 64,197,113, 38,107,158,163,
+228, 87, 54,217,255,216, 16,179, 22, 98, 93, 45,108,203,120,189,124,244, 41, 61, 34, 86, 23,225,131, 97, 58,237,190, 78, 8, 89,
+109,185, 80,249, 29,120, 0,245,182,174,124,237,180, 0,212,232, 19,109,110,103,173,251, 30,188, 31,225, 82,123,122,183,245,184,
+190,188,198,118, 28, 97,141,193,209,209,128,121,102,120, 17, 76,227,132,112, 37,248,143,254,254,127,139,255,228,239,254, 77, 56,
+ 71, 8,214,224,120,189,194,229,195, 11,248, 57, 96,183, 27, 49,172,250, 68, 16, 51,240, 16,176, 15, 56, 89,119, 96, 19, 85,198,
+ 69,144,150,192, 40,104, 54, 74,169,164,177,198, 14, 8,149,161, 44,133,237,156,127, 78,211,162, 95,122,165, 18, 96, 38,231,155,
+ 75,185, 97, 82,187,220,160,156, 45,139,218, 32, 89, 50, 36,101,179,231,248, 86, 13,177,104, 24,233,133,190,148,218,115,106,187,
+215,172,118,110, 78,158, 84,224, 69, 57,143, 56,102,168,167, 22,151,170,216, 69,249,199,151, 41, 63,117,110,222, 38,179, 85, 16,
+ 85,154, 37,114, 76, 87,170,109,115, 89,136, 65, 85, 80,134,206, 66,151,200, 26,152, 71,143,247, 31, 62,194,163,247,222, 3,252,
+132,155,155, 43,176,159, 18,132,197, 99,242, 17,212,209,185,120, 8, 36, 34,140,211, 12, 99,162, 32,139, 0, 88,107,162,160, 40,
+179, 0, 4,152, 67, 92,252,166,105,130, 15, 17,109,202, 57,222, 82,181,248, 61, 51,156, 49,152, 75, 4,101,108, 87,111,167, 25,
+239, 95,239,224,172,197, 28, 98,101,113,119,211, 97, 63, 78,112,206,226, 47,254,232, 15,195, 56, 23, 91,227, 94, 32,102,192,213,
+197, 99, 92, 60,125,138,237,110,143,187,119,238,224,102,191,199, 91,111,191,133,211,211, 51,220,189,255, 0,155,147, 51,244, 93,
+ 7, 67,177, 69, 30, 35, 81,251, 58, 7, 12, 1,174, 95,149,193, 31,243,156, 4,114, 14,214,118,240, 97,134, 88, 65,231,214,232,
+251, 85,108,207, 11, 99,181, 58,194,100, 44,246,187,235, 18, 77, 43,136, 9,131,165, 37, 74, 10, 68, 34, 28, 23,124, 21, 20, 34,
+217, 31,206,161,116, 5, 96,108,220,144,210,123,139,172,238,108,125,243, 8,105,227, 70, 18,208, 89, 17,248,192,152,231, 25,193,
+199, 67, 84, 72,163, 40,231, 28, 32, 99,150,116, 66,115, 64,172,139, 89,241,198,216, 10, 32,162,148,140,144,211,215,164, 85,105,
+103, 81,161,104, 97, 72,230, 40, 72, 22,131,154,131, 81,146, 65,108,185, 26,209,247,183,168,184,229, 42,122,109,245, 67,202,243,
+ 34, 21,164, 18, 66,188,111, 76, 94, 38, 67, 72,248,214,204,104, 15,160,224, 11, 96, 38,139,141,137, 90,148,105,142, 60,205,214,
+ 45,230,172, 14,143,162,205,231,207,142,241,248,233, 57, 46,118,219, 50,122,232,156, 67,215,247, 88,245, 93, 68,244,166, 54,124,
+222, 96, 77, 55,192, 6,198,228, 61, 58,239, 35,231,191, 86, 41,135,145,206, 5, 50,147,186,125,146,181, 20, 42, 64, 75,119,154,
+ 83, 23,209, 38,123, 98, 30,129,100, 6, 1,104, 1,216,146,196,172, 16,237,245, 95, 22,157,218, 51,159, 3,188, 42,174,183,229,
+ 16, 72,233,114, 75,171, 47, 94,172, 63,181, 27,216, 8,140,147,190,130,155,224, 19,197, 16, 1, 55,124, 23, 29,125, 43, 16,184,
+ 34,168, 72, 80,144,165, 62,183,206,214, 51, 31,216,150,155,153, 82,123, 84, 68, 51,138, 91, 60,103,109,197,127, 16,185, 91,117,
+ 4, 4, 13, 42, 19,141,210, 79,207,145, 88, 1,104, 4, 68, 56,192,202, 53,168,146,180, 80, 71,117,174, 20,203,129, 53,132,205,
+102, 5, 22,193,241,241, 10,211, 52, 99,232, 45,142, 79, 78,225, 5,240,129,241, 15,255,179,191, 7,102,198, 56,199, 42,102,154,
+ 2,214,155, 21,230,155, 61,194,236,177, 7,208,187, 24, 73,121, 51,122,244,214,180,136,216,204,244, 33, 46, 98,177, 34,228, 42,
+167,127,190,197,174, 38,153,221,144,218,208, 84,236, 28,249,228, 88, 22,140,132, 96,101,125, 24,144, 42,155, 97,164,205,211,196,
+247, 16,171,242,154,204,149,119,156, 34, 64,228, 52,211, 41,121,223,139,100, 29,169,162,148, 66,156,163, 37,194,181,158, 46,169,
+180,144,114,224, 77,138,143, 44,109,237, 44,196,108,243,134, 15, 0,195,139,217,146, 22, 4,161, 38,150,215,145,128,104,214,186,
+ 52,135, 2,157, 52,104,136,176,219,207,120,244,238,187,120,231,173,183, 17,194,132,203,139,115,136, 4, 4, 31,162,250,215,217,
+130,211,132, 4,204, 1, 88, 15, 29, 66, 0,246,251, 17,206, 86, 47, 39,135, 25,134, 12,118,163, 47,213,227, 52,207,176,174,139,
+109,224, 16,210, 44, 61,192,123, 15,159, 18, 17,125,138,185,100,209,254, 84, 52,128,148,119,159,156, 23,142,128,103,198,247,124,
+219,199,240,245, 55,223, 67, 96,198, 23,126,226,135,176, 62,218,196,247,154,186, 64,126,218, 98, 61, 12,112, 15, 30,224,120,220,
+227,225,251,143,240,222,251,143,113,122,188,129,159,246,216,222, 92,225,238,179, 47,224,206,157,123, 88,173,215, 48, 20, 21,191,
+156, 81,160, 17, 63, 6,144,133, 72, 72,243,243,180, 49, 69, 52, 76,154, 81,118,232,251, 85,228,194, 59,131,121, 26, 49,251, 41,
+225,101, 45, 56,248, 52,230, 73,213, 69, 74,194,201,152, 85,136, 41,172,240,172,216, 46,209,155, 10,185, 26, 21,212, 62,250,218,
+153,193,169,147, 0,201,237,102,174, 88,104, 0,211, 52,163,239, 28,188,143, 29,186,248, 75,181, 64,245, 8, 81,101, 12, 88,235,
+ 18,153,238,100, 57,193, 78, 53, 12,169,245, 45,137,227,236,109,153, 10,121,163,145,170,239, 72,182, 86, 61,170,202,250,144,188,
+177,215, 72, 97, 81,194,208, 84, 53,146, 82,172, 20, 14, 44,151,103, 57,166,210,133,226,106, 16,142,163, 11,147,175, 95,170,188,
+193, 28, 71, 26, 69,178,100,106, 16, 15,171, 1,166,186, 46,145, 1, 20,210, 33, 75,208, 27,194,203,247,239,224,241,197, 5,118,
+251, 41,197,169, 90,244, 62, 96, 14, 1,189,117,232,187,152,242,103,140,129,177, 14, 67,191, 2, 91, 3,207,177,155,208,119,110,
+161, 45, 64,219,169,105, 92, 81, 82,236,117,148,236,132, 21, 5,157, 14,164, 38,253, 44, 83, 61,233,241,223, 81,113, 90,228,206,
+ 1,167, 32, 21,206, 7,198,178,158,153,202,252,201, 22,187, 69, 61, 80, 56,240, 16, 16,155,228,234,145, 74, 26, 72,135, 33,205,
+162,168, 29,139,122,175, 69,254, 77, 20, 30,183,235,123, 93,253, 98, 23,220, 64, 16, 14, 4,228,180,200,176,112, 81,245, 27, 51,
+100,151,229,159, 52,117,111, 58, 33, 10,167, 20,153,122, 74, 42,254,244,180, 43,112,163, 45,110, 69,248,135,116,184,197,230, 79,
+248,255,145,189, 74, 7, 9, 68, 80, 73, 59,173,254,189,114,203, 39, 63, 3,179,135, 97,194,202, 16,134,213,144,102,103,192,197,
+205, 22,251,253, 12, 97, 70,215, 57,172,215, 3,134,147, 83,244,171, 53,152, 5,211, 52,195, 90,134, 79,207,215,170,239, 98,117,
+230, 25,187, 48, 99,232, 58,108,134, 14,222, 11, 70, 22,108,200, 96,232,251,218, 10,202, 10,106,174,246,112, 74,202,243, 40, 24,
+ 74, 40,198,132,139, 53, 70,107,249, 77, 73,245, 42,115,106,169,177, 60,185,162,201, 27,102, 77,156,170,251,112,214,198,113,193,
+ 27,234,110, 10, 87,229,103,230, 83,231, 88, 74, 34, 29, 85,223,182,127, 22,224,141,133,244,161,116, 14,218,168,201,116, 99, 7,
+181,153,155, 28,193,155, 58, 9, 58,209,173,209, 73,202,237,193, 62,121,251, 47,236,252,195, 89,103,158,101,102,229,177, 15, 1,
+231,143,159,226,205, 55,223, 2,249, 61, 30, 63,126,140,222, 1,219,253, 4, 75,128,133,193,197,213, 21,250,126,192,110,191,197,
+201,122,136,155, 92,194,126, 30,245, 14,115,240,152,166, 17,100,128,217,123, 12,125, 95,158, 52,239, 61, 66,152, 17,130,199,236,
+227,133,155,230,136, 64,245,222,167, 57,121,106,107,138,196, 13, 29,132,144, 18,162,124, 8, 81,165,238, 28,156,139,182,179,155,
+121,194,235,239, 63,133, 1, 48, 7,198,179,167, 39,248,250,235,111,131,137,240,137, 15,191,136,151,158,127, 14,214,185, 84,249,
+207,240,115, 0, 66,156,239,205,129,177, 31, 61,214,235, 13, 94,121,177,199, 52,142,120,231,225, 35,248, 16,240,220,197, 57,246,
+ 47,190,130,251, 15,158,199, 48,172,224,172, 45,115, 71, 6,129, 56, 96,246, 99, 28,223,164,185,165, 24, 37,166, 67,164, 39, 90,
+215,163,235,215, 8,243, 12, 65,156,109,207,126, 46, 45,111,206,176,163, 12, 0,225, 56,191, 7, 87, 38,133, 44, 70, 45,133,192,
+ 21, 66,218,135,162, 80, 78,210,123,144, 84,145,150, 88, 79,174, 57,216, 44,130,121,142,218, 3, 31, 66, 12,124,241, 30,211,236,
+ 49,251,144,146,201, 66,179, 94, 80,142,197,164,248,221,191,242,210,115, 77, 14,182,246, 46,231, 57,104, 80,155,132,190, 69, 73,
+ 9, 70, 65,117,126, 94, 34, 60, 36, 81,206,168, 82,203, 74,133, 87,196,151,109,240,143,166, 25,234, 58, 45, 87,178,236, 57,218,
+251,178,114,154, 3,144, 66, 86,114,170, 31, 56, 68,119, 67, 86,113,231,209, 16, 49, 36,227,160, 51,191, 66,171,172, 19, 76,198,
+123, 15, 63, 71,149, 59, 51, 99,176, 22, 47, 61,115, 7,127,248,141,111,197,138,216, 58, 76, 65,224, 25,232,123, 65, 31, 24,150,
+ 8,221,106,133,222, 18, 86, 93,151,226, 88,171,230, 33,111, 78,204,213,202, 35, 44, 77,186, 95,246,176,115, 26,157,196,131,101,
+170, 80, 51, 99,223, 80,105,197,231, 46, 10, 17, 69,203,177, 10, 88,145,138, 58,201,204,182, 34,232,102,133,107,166,133,103,190,
+182,224, 57,101, 79,164,202,190, 36,231,153,186, 6, 73, 13,138,201, 81,210,185, 91, 64,198, 64, 66, 75, 26,173, 14,158,236, 89,
+175,158,121, 73, 34, 78, 42,123, 43, 85, 49, 94,131,169, 20,184,188, 24,178,201,145,128,241,212,140, 66,185,169,155,101,161, 36,
+165,102, 85,108,221,167,236, 97, 21, 10, 18,173, 46, 42,122, 19, 7,198,241,102,163,111,243, 97,111, 83,191, 47,219, 33,139, 41,
+187,246, 23,222,114, 16, 16, 1,206,211, 73, 82,246, 35, 70, 18,248,217, 65,172,195,126, 59,226,250,250, 6,219,253, 88, 64, 22,
+144,152, 27,126,117,125,131,199,239,189, 7,215, 57,116, 46, 42,112, 77,246, 54,154,184,161,175, 7,135,237,205, 8, 54,140,174,
+119,216,250, 0,155, 22, 57,151, 64, 24, 80, 74,106, 83,196,123, 84,178,157, 75,138, 73,237,197,199,141,189,216, 6, 85, 30,183,
+198, 7,228,107,163,162, 4, 69,251, 48,179,231, 61,101, 45,139,212, 74, 66,183,255, 72,205,120, 26,218,154,180,169, 56, 85,204,
+ 39, 85, 81, 94,205,161, 85, 72,170,102,218, 53,122, 85, 74, 75, 50,243, 6,168, 88,105, 12,216,160,201, 85, 39,232,160, 12,106,
+ 19,247, 68,117,133, 22,211,117, 81, 26,142,122,202,143, 7,163,253,110,143,135,239,190,135,247, 31, 62,196,241, 42, 10,198,166,
+235,115, 92, 92, 94,160,119, 61,174,111,182, 32, 16, 38, 63,198, 86,163,159, 48,178, 71,239, 98, 32, 73, 22,105,173, 87, 27,140,
+227, 12, 31, 2,134,190,199,126,191,135,112,192,245, 52,161,239, 99,100,104,144, 56, 99,246,222,195,251, 0, 24, 11,107, 93,108,
+251, 34,182,130,103,239,147,232, 43, 47,243, 92,211,252, 36,110,170,228, 28,142,142,142,176, 94,173,112, 49, 62,194,197,126, 42,
+ 42,246,253,110, 15,227, 6,192, 16, 62,244,226,243,112,233,121,243,179,199,110,191,199,184, 31, 49,123,159, 24,248, 1,236,167,
+ 20,102,228,177, 31,103, 88,235,208,247, 61,200, 58, 92,157, 63,194,246,230, 2,119,159,121, 14,167,167,119,176, 90,111,208, 91,
+ 11,146,100, 37, 11, 33,229,136, 39, 46,123,170, 68,172,237,225,134, 78,109,194,209,194,201, 28, 48, 77,123,248,121, 6, 75,101,
+129, 51,106,204,170, 32, 41,234, 75, 53, 24, 55,202,108,219,204, 62,246, 42,206, 78,121, 3,193, 39,145, 89,136,109,230, 36,232,
+147,228,115,103,213,177,153,189, 71,103,163,205,110,154,230,194,241,102, 70,169,220, 9, 82, 4,129,241,254, 51,232,186, 14,206,
+245,120,238,217,123,229,153,164,156, 91,176,172, 36,179,109,181, 1,149,139, 90,116, 15,117, 66,153, 71,110,140, 41, 44, 6, 20,
+148,113,235, 56,225,166, 69,155, 81,200, 92,240,162,245,251, 9, 37,144,133, 82, 69, 45,243, 28,149,235,194,209,101,145, 54,119,
+ 42,227,206,248,247,114,180,106,233,176,230,136, 85,225,242,153, 56,196,215, 8,126, 78,135, 53,143, 57, 29,216, 54,157,195,253,
+179, 99,124,235,253,243, 88, 60,144,129, 24, 15, 47,192,108, 3,142,214,107,116,214,161,223, 28,193,173, 86,112, 67, 31, 69,197,
+166, 6,153,176,218, 17,152,149, 16,179,140,201,116, 90, 28, 85, 58, 39,183,238,142,210, 81, 72,182,204,130, 35,207,216, 92,221,
+193, 83, 64, 24,225,234,149,207,163, 60, 22,211,206,195,179,246,133, 53, 15, 36,174,227, 68,209,209,164,137,166,113,175,143, 7,
+140,120,224,176,176,150,147,115,133, 27,232,151, 33,179,200, 82, 49, 77,150, 99,137,110,205,137,127,156, 11,109, 82,194, 59,129,
+ 43, 89,217, 74,160,198,186,228, 98,213,230, 76, 49,112, 76,148, 16, 12, 25, 82,161, 96, 30,137, 49, 94, 4, 11,122,162,144, 75,
+212,220,174, 85,167, 37, 81,254, 84,146, 5, 36,254,192,129, 47,139,136, 86,170,158, 96,189, 59, 41,193, 9, 68,176,238, 7,128,
+167, 24,234,226, 61,206, 47,111, 32, 28,112,116,247, 62,246,239,190, 3, 88,160,235,122, 32, 48,238,125,236,219,241, 43,255,193,
+127,140,235,235, 75,252,167,255,225,223,138,167, 74, 23, 49,178,235,245,128,174,235,112,185,189,198, 48,244,216, 12, 61,246, 62,
+ 96,109, 98,123,196, 36, 79,108, 77,239, 41, 38, 87,245,249,100, 1, 78,169, 86,168,226,167, 38, 29,151,152, 67,118, 14, 69,116,
+208, 22,139,114, 71,177,162,244, 49,178,211,187,170,238,165, 52, 56, 68,164,182,182, 53,158, 85,235,156,243, 44, 73, 43,242, 83,
+133,159,191,251,202, 93,206,234,242, 66,195, 81, 41,101,210, 86,243,156, 70, 19, 9,192, 96,154,192, 6, 42,153,247, 36,183, 29,
+ 12, 53,145,170,109, 51, 81, 10,203,121,248,222, 99, 92, 62,125, 2,139,128,243,243,115, 24, 8,252,184,199,205,108, 34, 3, 28,
+130, 59, 39,199,120,252,228, 9,246,211,140,245,208, 99,158, 99,199,230,244,244, 24,215,215, 55, 37,229,122,246, 30, 16,198,110,
+183, 67,191, 58,130, 21,198,126,183,131,129, 96, 78,115,201,113, 26,147,109, 48, 45,162, 18,253,210, 66,136,145,189,160,136,204,
+ 76,243, 78, 1, 48,107,197,191, 73,170,239, 84, 93, 12,195, 10,189, 53,216,237, 71,188,119,113, 25,171,120, 17,172,173,197,204,
+140,239,251,244, 71,241,149,111,190,133, 23, 31,220,135,117, 93,234, 8,120, 92, 95, 95,227,252,252, 2, 79,159, 60,193,118,187,
+ 5, 0,172,134, 30, 71,235, 21,134,213,128,213, 58,226, 97,137,128,139,171, 27, 60,121, 58,131, 67,192,213,229, 53,158,127,225,
+ 37, 28,159,158,225,120,189,130,235, 7, 88,219, 85, 80,143,250,206,251,126, 40,155,200,209,241, 29,128, 5,243, 60, 97,183,191,
+193, 52,141,165, 77,155,197, 76,156, 90,164,146, 24,239,100, 76, 93, 68, 85,186, 33,140, 77,226, 45, 83,109, 59, 65, 83,184, 80,
+ 90,176,101,161, 77, 62,246,104,177, 75,196, 75,137,223,249,110,156,138,152,140, 83,231,159,243,129, 43, 68,173,130, 77, 27, 5,
+153,248,251,174, 95, 97, 24,134, 40,242, 82,155,139, 49,185, 50,203, 85,122, 80,104, 89, 81, 13, 68, 42,145,167,185,178,203,173,
+223,194,227,160,106,187,204, 84,185,124,223, 51,161,193,113,138,182, 92,233, 96,145,252,108, 39,159,120,116, 69, 82, 9,162, 9,
+243, 4,147, 54,115,195, 81, 40, 71, 28,162,109,173, 60,171,185,165,206,149, 92, 87,230,209, 40,185, 22,144,252,154, 89,232, 57,
+ 97,154,226,175, 16, 2,142,134, 30,125,223, 97, 76,118, 56, 10, 28, 55, 46,215,161, 59, 62,198,250,248, 8,195,209, 17, 86, 71,
+ 27,216,174,135,117,182,117, 81,165, 53, 38, 22,221,188,176,239,182, 27,122, 73,108, 99,181,113,155, 90,220,229,251, 36,114, 29,
+164,133,102, 45,214,208,252,217, 89,185, 42,242,193,136, 62, 40,231,189,158, 58,226, 33,132,114, 34, 15, 53, 97,100,100,234,198,
+110,200, 64,136, 75, 81,200, 92,115, 83,140, 49, 77, 91,189,228,170,104,188,122,113, 37,104,116,172,148,110, 64,222,143, 29, 41,
+239, 37, 55,150,103, 83,197, 11, 42,180, 64, 24,117,142,145,127,136,161,114, 51, 20, 4,167,100, 74, 14, 14, 19, 93, 22,115,243,
+204,131, 35,189,176, 21,102,160,106,229, 42,112, 41, 84,130, 92,139, 72,164,106, 3, 80,135,129,190,235,176,234, 9,132, 62,249,
+ 86,165,204,219,174,207, 31, 99,179,234,112,118,122, 92, 60,195,188,189,192, 63,248,123,127, 23,126,142,213,215,245,126, 6, 25,
+193,213,110, 68,240, 1,103,103, 39, 24,214, 61,196,199,118,206, 44,192, 20, 56, 37,184,153, 2,156, 17,106,231, 39,135,204, 81,
+186,229, 43,170, 27,249,173, 50,132, 37,156, 69,101,242, 26,212, 27, 32,135, 21,148, 86,103, 82, 71,178,202, 4, 23, 85,181,211,
+146,106,133,172,165, 88,124,255,185, 13,196,113, 14, 87,247, 91, 86, 20, 75, 81,199, 45,170, 7,137,210,121, 20,128, 13, 36,121,
+213,133, 13,140,225,226,189, 39,196,182,124, 40,247, 94,211, 6, 88, 84,234,181,189,117,179, 29,241,240,237,119,241,232,201, 57,
+194,254, 58,138,210,198, 29, 12, 1,125,239,208, 25,131,253,110,135, 93,250,182, 28, 9, 46, 46,247,232,173,193, 54,120,132,137,
+177, 29, 39,116,150,112,126,126,145, 62, 76,102,174, 39,123,212, 60, 99, 27,174, 32, 32, 76,227,190,108,248,134,128, 32,136,132,
+ 55,196,135,118,246, 30,206,186, 50,115, 13, 44,232,156,131,112,192,148,230,191,157, 53,152, 83,176, 73, 1,133, 36,170,156,136,
+192,179, 32, 8,240,123, 95,253, 38,152, 25, 43,235, 48,135,128,239,254,206, 79, 97,154,103,188,248,236, 93,156,157,156,192, 57,
+155, 22,137,216,106,190,190,217,226,225,163, 39,120,231,225, 35,140,179, 71, 16,193, 81,239,176, 90,173,112,239,236, 4,247,239,
+158,225,248,120,131,174,235, 48,165, 48, 20, 63, 77,248,214, 27,223,196, 48, 12,184,255,236,125,220,125,230, 1, 78,142, 79,163,
+242, 29, 20,171,245, 84, 17,133,100,193,203, 36,186,235,155,167,152,167, 41,217,215,166, 66, 87,100,174,185, 7,140,232,143, 15,
+ 28,202, 12,189,120,188,165,110,116,217, 98, 7,205,126,207, 60,248,212,205, 8, 25,203,156, 3, 89,210,166,158, 84, 32,241,251,
+ 14, 1,215, 55, 55,232,250, 30,157,181, 8, 2, 4,142,225, 78,211, 28,197,138, 70, 5, 83, 1, 17,239,220, 15, 43,124,236, 35,
+ 47, 41, 39, 13, 45, 73,218,101,179, 40,121,217, 74,240, 74, 13,176,186,230, 97, 64,141,171, 76, 17, 30, 74,113,130,228, 82,156,
+160, 2, 7, 84, 17,212,152, 9, 83,107, 56,110,232,169, 35, 99,226,189, 21,188,199, 60, 77,137,197, 49,195, 8,195,130,225,114,
+ 94,120,122, 93, 35, 92,103,195, 33, 65,132, 18,201, 47, 95, 87,201, 65, 46, 28, 53, 38, 33,181,223,167,121,194,126, 76,191,166,
+ 9, 28, 24,103,155, 21, 30, 94,239, 83,183, 42,173, 19,206,161, 95,175,113,124,231, 12,253,176, 66,183, 90, 97, 88,175, 83,110,
+128,169, 48, 22,237,205,134,206,236,137,237,108, 99,109, 97,117,132, 20,237,154, 91,215,180,172,208, 37,129,101,116, 50, 90, 51,
+220, 65,209,110,112, 8, 85,143,145,235, 36,170,164, 57, 81,215,186,208,228,184,218,166, 69, 65,173,178, 87, 29, 84, 91,233, 48,
+ 4,147,233,126,105,180, 99,138, 85, 52, 84,107,176,193,130,245,110,202,225, 38,161, 70,146,248, 88,103,177,235, 54,124,124, 24,
+156, 78,174,170, 21, 95,220,221,205, 2,173, 75, 57, 53,134, 20,179, 58,181,171,152, 3,140,106,179,151,133,255, 86, 63, 27, 45,
+ 90,233,217, 91,205,138,145,172,200, 14, 75, 0,247, 98, 78,159,103, 77, 89,100, 70, 77,178, 75, 52,247,191,255,198, 27,120,114,
+181,197, 6, 30,155, 85, 23, 5, 18,166, 75, 52, 42,139,142, 4, 87, 55,219, 40, 52, 32,224,249,231, 95,194,143,252,204, 95,198,
+245,249, 99,252,218,127,243,159, 99,146, 45,246,115,192,236, 25,163, 4,220,108,247, 56,123,230, 12, 79,159, 94, 69, 59, 17,128,
+217,115,228,106, 91,135,174,235, 21, 82, 55,239, 71,166,108,186, 37, 75,183, 17, 60,232,209,129,105,231,115,205,130,161,174, 87,
+115, 56,168,216,213, 70, 89,156, 78,250, 21,181,153,219, 62,164,102,241, 10, 48,195, 84,160, 50,133, 96,151,171,139, 18,156, 66,
+165,197,105,242,226,141,232,135, 47, 1, 41,162,168, 79,148, 88,239, 89, 85,207, 41, 63, 61,165,186,102, 38, 54, 21,123, 91,136,
+194, 66, 20,181, 95, 62, 69,168, 60, 2,194,236, 25, 15,223,127,138, 39,143, 30, 99,218,221, 96,158,246,113,129, 75,190,238, 92,
+ 93,207,243,132,105, 4, 64, 22,206, 0,211,236, 17,242, 98,234,103,236,167, 9, 97, 26,177,101,151, 54,156,168,226,157,189,143,
+150,177,144,146,198, 72, 64, 93,135,235,155, 27,108,142,142,224,172, 73, 51, 65,198,232, 25,171,161,135,159,125, 17,203,116, 93,
+ 31, 55,242,174, 3,200,194, 88,193,126, 55,197,153,174,106, 3,134,192, 25, 26, 93,132,168,227, 52,195,186, 9,126,246,120,239,
+241, 99,236, 83,174,122,224,128,239,250,246, 79, 96,112, 29,254,232, 27,111,226, 11, 63,250,231,226,236,189, 31, 34, 92, 36,253,
+190,239,123, 28, 31,173,113,247,236, 4,219,221, 14,215,251, 9,204,140,171,235, 45,182,151, 55,120,231,157,247,113,255,153, 51,
+188,248,194,115,184,123,122, 12,207, 1, 83,170, 90,124, 8,144,247, 31,197, 69,124,220,225,248,238,125,244,235,147,184,176,178,
+ 32,120, 15, 16, 99, 24, 54, 88,173, 79,112,254,244, 33,118,219, 43, 56,219, 71,208, 12, 39,213,186, 72, 12, 93,201,135,193, 76,
+ 26,236,186, 68,174, 75, 11,119,190,191,184, 18, 32, 37,169,254, 57,205,225, 57, 39,141,101,175, 47,115,209,245,100,112, 76, 36,
+202,133, 82,145,173,134, 1,227, 52,225,226,242, 26,253,208, 71,145, 22, 71,252,110, 8,105,134, 75,166,116, 14, 12, 25,116, 93,
+ 15,231, 58,124,232,229,231, 43,221,234, 22,129, 47, 11,151, 42,253, 54, 49, 48,137,166, 38,202,193, 18,152,129, 82, 57, 69, 89,
+ 12,167,103, 36,109, 38, 36,139,110,164,148,249, 82,177, 55,165,107, 5, 8,172,117, 73,152, 25,224,167, 41, 86,212,227, 20,121,
+ 1, 28,224, 72,224, 8,209,114,139,100, 85, 99,142,233,119,169,131,198,222, 71,223,127, 34,229, 9, 85,126, 59, 7,159, 44,131,
+161, 88, 50,199,105,198,110,154,176,223, 79, 24,125, 20, 67,174, 87, 3,246,115, 40, 99, 16, 16,129,172,195,122,115,132,213,122,
+133, 97, 88,161,235,187,232, 60,200,173,246, 92, 20, 72, 77,154,203, 72, 85, 32,145, 16, 11, 97, 48,190,114,169,110,213,214,144,
+131, 82,200, 82,219, 54,151,170, 72,103,170, 62,115,225, 26, 63, 91,102,248,121,252,167,162, 80, 69, 17,174, 26,202,167,202,222,
+ 8,196,165,211,168,173,138,148, 90,233, 77, 36,108,227,246, 17, 21,173, 90,123, 40,208, 2,100, 37, 70,151,165,204,172,152,206,
+226, 90,235,154,141, 36,219,132,204,130,199,174, 62, 40, 53,177,171, 85,177,222,108,222,134, 98,220,229, 1, 59,238,131, 60,109,
+202,220,207,213,130, 86,246,133, 76, 25, 19, 52,156, 93,237, 82, 47,143,213,114,192,110, 0,107, 12,198,125,164,120,109,131,199,
+115, 71, 43,220,191,119,252,255,241,245, 38,191,150,101,215,153,223,183,155,211,221,230, 53,209,103, 48,251,100, 39, 82, 37, 22,
+ 37,168, 74,150, 74, 70, 9, 80, 73, 85,240,192,246,180, 70,254, 15,236,145,167,158,248,111,240,208,240,196,128, 1,195, 3, 27,
+ 5, 91, 54, 92, 85,164, 85, 5,149, 26,170, 72, 49,217, 38,201,100, 54,204,140,200,140, 23,175,187,247,158,102, 55,203,131,181,
+246, 62,251,220, 8,138, 64, 34, 82,161,140, 23,239,221,123,238,222,171,249,190,223,135,207,174,247, 8, 46, 96, 24, 29,162,115,
+168,180, 66, 93,105, 84, 77,133,203,207, 62, 65,219,117,248, 63,254,167,255, 5,227,232,208,181, 53, 76, 77,184, 30, 38,248, 24,
+225, 38,143,175,127,243,247,240, 31,254,252, 91,216,247, 83, 46,170,173,164,105,173, 86,237,242,131, 78,203, 78,251,120,188,162,
+212, 82, 85, 89,134, 54,148, 65,180,116,244,231,168,228,189, 38,113,200, 2,205, 75,185,224,153,145,139,170,232,206,177,196, 44,
+102,200,202, 76,198,202, 62,216, 4, 58,200,107,246,152, 71,133, 58, 9, 93, 18, 22, 17, 71,148, 36, 96,161,218, 87, 50,137, 33,
+157, 92, 23, 90,214, 64,197,218, 32,101,174, 71,100, 46,114, 8, 17, 55, 55, 7, 92, 93,239,176,223,221, 98, 26, 14,152,220, 4,
+ 80, 68,240, 14, 20,217,226, 68, 20,209, 84, 21, 42, 99, 68, 50, 24,113,232, 7,128, 28, 66, 82,204, 19, 80,105, 62, 32,186,166,
+134, 51, 6,222,141,232,170, 10, 74, 43, 12,147, 71,144,220,109, 79, 26,135,190,135, 2,176, 89,181,188, 47,119, 83,193,143,214,
+232, 26,238,160,147,250,214,128,149,241,105,111, 74,196, 54,187, 40,135, 20, 73,135,239,124,170,214,185,123, 11,114,184, 28,134,
+158,119,244, 20,241,227, 15,126,149,119,160,186,174,241,189,159,254, 18, 77,221,224,119,127,243, 43,184,119,231, 28,149,224, 96,
+181,214,104,180,197, 58, 68,156,157,109, 49, 13,123, 28,246, 7,124,126,117,141, 87,207,206, 80,213, 13, 2, 20,156, 28,200,183,
+ 55, 3,126,122,243, 62,238,222, 59,197,195,135, 15, 80, 55, 21,124,140,240, 97,146,112, 34,194, 56, 12, 56,155, 38,220,185,247,
+ 0, 88,159,115, 23,163, 53,154,110,139,166,233, 48, 76, 3, 92,240,176, 85,187, 20,173, 5, 63,167,169, 41,205, 80, 27,154, 89,
+241, 52, 63, 49,128, 8,224,178,248, 41,141, 92, 5, 89, 76,208, 25,112,146,127, 77, 65, 37,224,241,188, 11, 62,115,204,211, 33,
+ 13, 0,171,174,131, 82, 6,251,113, 66, 24, 70, 64,241, 62,221,201,229,149, 44, 90, 90,105, 24,107,208,180, 29, 54,235, 53,140,
+209, 11, 41, 15, 33, 53, 54,148,191,246, 66, 8,251,178,222,133, 94, 60, 0,179,205, 84,146,129,242, 52, 79,168,112,137, 58,161,
+168,116,120,136,191, 67, 97, 46, 2, 18,193,142, 8, 90, 25,254, 60, 5,143,224,153,168,231,189,131, 27, 7,140, 67,207, 30,117,
+ 68,182,152,105,166, 20,230, 11, 61,206,137,121, 36, 46, 2,159, 58,246, 50, 50, 84, 58,245, 40,108, 5,231, 28,166,201,161,119,
+ 30,253,228, 56, 6,216, 71,104, 93,193, 86, 42, 59,112,108,205,235, 30, 91, 85, 92, 8, 91, 86,195,163, 72,232, 76,207, 67, 90,
+214,101,171, 93,242,181,167, 84,183,212, 17,103, 16, 90, 9,152,154, 67,107,210,133,174, 18,104, 39,242, 84, 34,221, 24, 94,235,
+226,231,154,139,196,108,217, 45,181,231,165,250,255,104, 92,179,176,110,211,220,144,106, 53, 67,183,102,231, 70,201, 0,152, 59,
+117,165, 69,167,145,146,226,244,139, 46,159,101,218,202,203,127, 51,105,150, 44,189,100, 79,169, 36,212, 35,230,124,207, 57, 86,
+114, 14,184, 40,242,163, 19, 59,122,241, 77,207, 0, 6,168, 95,159, 68,121,188, 40,162,133,209, 30,203,224,146, 18, 80,128,165,
+ 5,101,174, 15,104,166,132,139,136, 0, 80,112, 19,227, 43, 27,173,241,249,245, 30,181,213, 56, 28, 70,182,127,120, 30, 5,218,
+186, 70, 87,107,172,214, 29, 12, 52,254,135,255,238,191, 65,140, 10,135,195, 1,186,174,176, 62, 61,193,221, 19,143,139,203, 61,
+ 78, 31, 60,194, 15,254,242,207,121,220,170, 21, 66,138,170, 20,184,193,122,181, 90,254,204,234,216, 34, 61,239,214,168, 4,228,
+ 20, 3,182,164,228, 95,200,108,104,134,214,164,128, 18, 77, 47,176,124,103, 95,235,226,117, 43,152,212,180, 0,183,205,229,145,
+ 66,225,159, 76,202,245,185, 35, 74,120, 66,254, 51, 50,250,202, 25,230,115, 76, 46,202,143, 69,193,242, 86,229,123,172,211,123,
+157,178,168,129,168,213,236,196, 32, 64, 41,139, 97, 2,110,174,174,224,220,136,195,126, 7, 55,246,240, 33,112, 98,148,115,176,
+ 98, 95,177,149, 69,240,132, 16, 8,198, 24,140,206,131,130,227, 3, 49,120, 14, 63,177, 6,149,226, 67,109,136, 4,163, 12, 40,
+242,104, 58, 70, 15,165, 45, 38,231,114, 48,200,232, 3,186,218,194, 57,143,147,205, 26,227, 56, 97,116, 14,109,211, 96, 63,244,
+ 92,153, 11,239, 92, 73,220, 99,140, 17, 70, 25, 24,107,160, 13, 79, 4,106, 99, 64,164,217,238, 38,175, 37, 43,181,231,127, 87,
+ 74,195, 7,225,130, 3,184,185,221, 99,187, 90, 97,242, 1, 63,254,240, 83, 84, 90,227,149,251,119,176, 90,117,232,186, 14,103,
+ 39, 39,120,251,141,215,242, 33,105,148,146,110,141, 80, 91,139,182,174,217, 75, 94, 89,124,243,157, 55,112,186,217, 98, 36, 3,
+210, 6, 30,192,228, 2,118,251, 29, 62,248,213,175,240,241, 47, 63,197,163,235, 29,222,121,237, 49, 54,155,149,168,247, 7, 12,
+227,136,219,219, 29, 46,111,119,216,247, 3, 94,121, 28,209,181, 29,108,221, 33,128,125,217, 93,211,193,187, 9,251,221, 21,170,
+170,193,126,127, 11,159, 60,180, 82,172,196,100, 19,178, 54, 63, 67, 64,200,225, 71, 68,122,246, 99, 75, 22,121, 12,142, 47,126,
+165,179,149,142,114,194, 85,224, 14, 47, 93,174, 90,129, 60,131,120, 98,140,112,211,148, 49,175, 58, 70,216,202,162,142,132,195,
+ 48,102, 5,119,136, 73, 67,194,148, 67,101, 52,172,229, 24,218,223,252,141,183,231,184,224,100,101,211,243, 78,150, 34, 73, 34,
+156,250,181, 39,219,108,215, 60,154,194,229,144,164, 50,112,115, 46,176,103,176, 38, 45,162, 60,203, 28, 13,146, 88,229, 36,168,
+210, 34,148, 99,251,154, 67,244, 30, 97,154, 56, 38,117,156,224,198, 1,214, 26, 56,231, 97,181, 98, 86, 7,241, 88, 29,210,129,
+ 83, 8,249,239, 74,227,251, 20, 60, 82, 10,202,130, 15,217, 77, 48,249,128,209, 7,244,206, 99,116, 1, 83,100, 71, 75,187, 90,
+ 99,156, 38,180,109,139,205,122, 37,194, 67,182, 9, 26, 99,242,164, 3,165,184, 85, 58,226, 28, 11, 45, 29, 62,251,192,227, 75,
+ 22,146, 69,215, 42,159, 87, 45, 63,151, 34, 53,107, 6, 98, 20,136, 78,204, 1, 60, 78,213,139,253,120, 41,146, 59,190, 99,136,
+232, 69, 19, 86, 44, 89, 34, 88,172, 92,160, 68,228,171,102,246,123, 90, 81,151,226, 93,150, 46,148,148, 86,205,103,123, 44,180,
+ 25, 37, 68, 43, 21,148,116, 36,108, 46,189,241, 60,141, 81,197,201,174,102,183, 84,250,173,217, 8,152, 81,137,177,224, 17,179,
+ 88,106,198,240,149, 9,105,116,148, 82,245,247,119,235,152, 5, 48,197,158,156, 74,158,123, 82,129,235, 66, 42, 89,250,243, 85,
+ 74, 52,210, 71,129, 50, 4,116, 45,234,190, 70,229, 6,236, 66,192, 39, 55, 61,198, 97,128,139, 10, 15,183, 13,206,206,206,208,
+104, 3,173, 34, 2, 17,182,167, 39, 88, 93,183,124, 88,245,138, 25,209,215,183,216,108, 87,232,247, 35,139,151,110, 7,120,101,
+ 96,181, 70, 21,211,158, 76,195, 26,139,237,186, 43,246, 42,101, 48,236,113,213, 94,188, 58,105,167, 88, 92,240, 12,174, 88,218,
+253,162, 42, 56, 13,106,217, 12, 80,230,239, 83,190,236, 19,234, 85, 21, 30,238,121, 51, 33,154,124,162,204,151, 86,208,185, 19,
+167, 56,163, 15, 51,219, 95,138, 46, 93,140, 2,151,132, 58,121,136,244,172,220, 85,165,146,190,192, 12,102, 98, 86,154,248,164,
+ 29,169, 55,140,228,245,183,216,239,118,216,237,110, 49,185, 41,179,198,149, 98, 37,122,101,184, 42,119,142, 69, 79,171,174,133,
+137,188,215,173, 13, 64, 30, 24, 38,135,170,170,177,173,106,120, 55, 34,164, 0, 21, 55,194,118, 29,198,145,197, 78, 85,213, 32,
+ 4, 7, 21, 12,250, 97,132, 81, 60, 74,140,129,109,142,131,139,185, 91, 11,129,215, 77,214, 24, 76, 62,176, 5, 69, 70,199,198,
+ 24,104,163, 36, 84,132,197, 64, 33, 18,180, 34,140,163,131, 11,236, 49,119, 62,202,126, 48,194, 26,141,144, 19,188,248, 3,244,
+244,249, 21,238,223, 57,199,211,231,151,121,255,119,247,252, 20,253,228,112,178, 94,225,209,189,187,104,235, 26,182,178, 66, 13,
+227,162,194,104, 3,219,174,160,234, 3, 86,219, 83,220,153, 70, 60,123,118,137, 87, 30,220,197, 73,189,198,100,106, 40, 83,195,
+ 3,176,207,159,225,231, 31,125, 12,173, 20, 46,174,118,232,251,247,241,250,227, 7,184,127,231, 76,198,186,130, 17, 62,236,241,
+171, 79, 62, 65, 8, 1, 15, 31, 60,194,230,204, 64,245, 59, 84,166, 2, 72,161,105,215,240,206, 97,191,191,206, 69,117, 44, 32,
+ 33, 49, 82,190,100,211,161, 21,131,232,122, 5,201,198, 89,218, 97,166,156, 37, 78, 95,217, 65,137,104,107,214, 22, 82,161, 30,
+ 6, 42,107, 16,130, 66,180, 54,107, 18, 72, 18,232, 82, 65, 59, 78, 14, 62,120,161,218, 69,233,172,184, 83,111,218, 22,198, 84,
+184,123,231, 84, 62,187,201, 82,165,115, 88, 72, 44,197, 89, 11,157,204,203,182,140,234,104,132,175, 22,154,152, 99,234,220, 98,
+ 27, 90,186, 58,138,195, 34, 74,209,147,254, 91, 14, 77,145,181,131,243,136,206,129,164,232,141, 98, 43, 12, 0,220, 48, 66, 3,
+ 48,197,165,142, 24,152, 6, 88,116,234, 41, 24, 39,120,143,113,114, 82, 16,207, 66, 69,239, 3, 2, 69,248,192, 62,243, 41, 68,
+140, 33,178,141,141, 20,200, 70,212, 74,177,142,161,174,176, 90,175, 80, 55, 53,140,181,185,163, 6,138,244,195, 2,123, 29,105,
+142,245,230,184, 95,185,111, 82,204, 40, 10, 55,239, 12, 1, 96, 7, 66,122, 25, 3,229,105,146, 6, 96, 64,208,130,186, 85, 52,
+223, 95,123, 91,101, 75, 93,204,151,250, 81,177,128,121,167,175,142,223, 35,122, 73,226,104,222,185,163, 88, 37, 74,196,118,162,
+130, 22,246, 94,157, 98, 83,161,139, 24,231, 98, 82,155,214, 44, 74, 1, 20,114,225, 67, 11, 74, 93, 34,145,243,239,217,249, 15,
+ 28,245,244,170, 16, 78, 9, 32, 37,143,202, 85,145,127, 93,102,192,198,242,110,154,247,105,115,247,249, 34,224,117, 89,189, 22,
+106,108,141,163, 78,189,240, 47, 34,153,174,145, 19,152, 64,106,145, 31,172,202,233,131, 82,232,162, 7, 25, 66, 99, 42,180,171,
+ 14,113, 26,112, 99, 13,222,188,127,138,237,186,195,211,207, 46,177, 7, 67, 64,140,213, 56,252,242,103,120,253,157,175,192,251,
+ 17,195,207,222,195,211,139, 91, 86,216,172, 91,212,171, 6, 87,159,127,134,117, 91,115,151,238,121,151, 18,133,241,104,140, 65,
+ 93,215, 98, 81, 89,226,115, 94, 32,193,149,173,114, 17,129,163, 74, 86,106, 10,207, 66, 17,234,146, 34,250,104,233,203,159,161,
+ 54,200,121,193,139, 61,123, 30,217,207, 31, 38, 42,136,124, 73,228, 24,197,188,147, 31,141,228, 91, 47, 88,142,121,102, 64, 49,
+ 11, 56,210,129, 77,121, 36, 63,219,114, 80,164, 14,207,196,173, 57, 66,149, 15,104, 78, 19,251,224,231, 63, 65, 99, 13,218,182,
+130,159, 60, 90, 75, 24,199,136, 72,220,101,213, 85,133,166,174,178,101,203,202,142,127, 24, 70,177, 41,113,231,213,118,107, 64,
+ 29,242,129,164,108,131,181,149, 61,120,242, 75, 67,161, 54, 10,164, 45,195, 97, 40, 64,107, 11,144,131,143, 74,162, 74, 53,200,
+ 71,104,163,176, 31, 38,168,192,108,241,195, 56,194,202,136,223,249,128,186,174,133, 71,206,187, 78,147, 71,239,252, 62, 79,206,
+201, 37, 31, 81, 87, 21, 70,199,202,108,166,162,233, 68, 73, 5,160,240,254, 39, 79,241,230, 23, 30,225,233,229, 21,140, 82,216,
+172,120, 31,220,214, 53,238,156,158,160,107,107, 38,158,201,101,174,100,118, 98,219, 21, 44,245,232,214, 91,156,140, 3, 84,152,
+208,212, 29, 62,191, 62,224,213,251, 45,123,236,109,131, 74,235, 60,101, 88,215, 22,181, 86,184,117, 17,239,254,242, 19,188,126,
+187,195,100, 56,134, 71, 0, 0, 32, 0, 73, 68, 65, 84,235,143, 31,162,105,106, 12,211,128, 72, 64, 3,133,155,155, 27, 84,214,
+ 32, 6,135,166,237, 48,142,131,216,240,248,217, 10,130, 96,205, 17,168,105, 12,143, 20, 25, 43,153, 5,162, 8, 78,163,229,153,
+ 93, 93,200, 63,213, 60,165,155, 51,185,231, 3,113,142,176, 76,170,121, 45,157, 94, 88,240, 11, 22,232, 78,241,189,251, 72,208,
+166,130,138, 46, 95, 0, 85, 85,161,237, 86,248,218,151,223,204,137,131, 42,177, 26, 20,167,176,165, 49,170, 49,229,196,235,239,
+ 73,159, 60, 18,182,170,163, 4,203,172,180,166, 37, 37,115, 46,148,151,199, 67, 42,106,116,169,156, 79, 23,174,103,101, 58, 5,
+207,191,230,125,180,133, 23,199, 79, 25,116,163, 33, 69,148,143,179,232, 47,117,251,226, 58,240, 17,232,251,145, 29, 27,129, 93,
+ 27, 33,196,108, 7,244,196,110, 12, 31, 1, 71,128,151,201, 71, 8, 1,155,147, 19, 52, 77,131,182,109,208, 52, 13,195, 96,114,
+162, 98,204,119, 75,137,158,166, 72, 12, 56, 75, 35,116,196,226,242, 79, 67,196, 57,164,132, 4, 27,108,228,123, 79,103,191,150,
+ 17,184,213, 90, 46,117,206,133, 71,140, 48, 49,192, 34, 96,167, 77, 30,187, 39, 93, 76, 78,179, 43,210, 9,203,209,121,121,121,
+207,193, 45,179, 14,173, 76,119, 76,129, 61, 80, 18, 99, 91,172, 64,179,132, 56,167,245,189,152,137, 18,213,114,194, 51,199, 14,
+167,215, 46,206, 95,143,102,162,140,205,106,191,163,222,154, 95, 80, 45,138, 62, 42,130, 84,230, 17,124,146,193, 43, 85,238,103,
+245,156,244, 86,166,204,188,112,159,151, 80, 22,181,176,109,100,124,104,169, 1,167,151,120,220,211,223, 75, 73,216,199,180,180,
+133,162, 27, 96,219,133,115, 24,125,192, 20, 60, 30,158, 87,152,170, 22,231,247,206, 64,209,227,226, 57,199, 86, 70,239,177,178,
+ 6, 94, 18,155,126,241,131,191,195,253,215, 94,195, 59,191,241, 13,252,236, 91,223,134, 85, 10, 67, 63,194, 24,205,170, 89,171,
+ 97, 8,112,177, 36,190,241, 95,106,196, 10,147, 83,211, 8, 47,174, 33,202,187, 60,217,193, 98,178,190, 29,149,239, 49,185, 2,
+232,136,193, 66, 47,192, 98, 11,106, 69,110,229,249,192,156,173, 97,165,216,110, 14, 53,160, 25,252,146,112, 12, 81, 30, 60, 53,
+239, 19, 75,232, 79, 82,202,166, 79, 43,233,249,231, 32, 93,252,183, 58, 85,150, 2, 46,146,244, 35, 20, 86,142, 57, 42, 87,227,
+203, 95,255, 50,254,223,127,243, 23,120,124,106,209, 53, 13,186,213, 6,141, 5,116,181,194, 52,244,232, 71, 57,180, 18, 81, 44,
+175, 7, 88,157,157,232, 81,253, 52,193, 26,131,160, 52,234, 90,193, 59, 47,158,219,128,186,174, 48, 57, 66,101, 43,120, 16, 40,
+ 50,168,100,213, 54,216,199, 30,214,116,136,193, 99,242, 14,209,113,197,122, 24, 6,230,185, 7, 22, 69, 26,205,163,196, 16, 3,
+180,210, 24,167,137,131, 81, 36, 33,175,159, 28,148, 49,168,170,134, 61,211,149,193,213,205, 14, 74, 43, 17,107,197,188,178, 74,
+171,150, 4, 34,250,248,242, 6, 63,126,255, 67,252,248,163, 39, 92,184, 24,141,253, 48,225,241,195, 83,116,109,139,186,170,161,
+ 5, 2,166,137, 59, 21, 83, 55,208,182, 66, 67, 60, 29,136,110, 18, 95,247, 53,118,187, 27,252,252, 87, 79,240,218, 67,143,237,
+221, 26,147,169,228, 57, 37, 24, 16, 26,107, 49,132,136,222, 69,252,242,217, 13,246,131,199,171, 15,207,177,221,172,160,148,198,
+228, 3,118,187, 61, 42,171,177,223,239,177, 94,173,113,178,221,161,109, 59,168,186,131,210,172,250,167,224, 65,178, 82,240,129,
+ 59, 62,165, 52, 7,157, 68, 30,169, 7,154,167, 56,105,132, 76, 98, 65,138, 8, 25, 40,162,140,145, 48,148,152, 39, 68,101,222,
+ 64, 6,131, 40,133, 40,140,140, 88, 66, 66,242,232,152,181, 22,233, 53,231, 29,125,204,246, 71, 45, 54, 54,107,107,188,246,234,
+195,217,122, 89,136,158,146,141, 78,155,130,155,112,212,170,224, 5, 87, 10, 45, 20,243,179, 0, 57, 85,190, 5,104,131,146,208,
+119,137,216, 86,114,164,206,182, 46,157,187,217,212, 73, 70,207,250,143,242,215, 68, 75, 76, 87,130,115, 14,211, 56,242,152, 61,
+145, 54, 19,132, 70, 94, 43,190,248,124,126,125, 3, 20, 38,101,113, 24,123, 4, 9,228,201,151, 58,177, 43, 35, 66, 33,128,241,
+212,164, 52, 52, 49, 74, 89,137,120,175,105, 91, 84, 21, 35,119, 75,189, 14, 10, 7, 78,210, 70,164,253, 50,164,168, 72, 34, 67,
+ 18, 7, 15, 31, 44,179,120,143, 66,132, 38, 17,252, 5,159,127, 54,210,134, 69,167,134, 11, 87, 22, 6,122, 46, 90, 2,119,222,
+ 15,122,194,175, 68, 7,146,180, 9, 20,139,236, 8, 41, 0, 67, 40,246,225,197,202, 84,169, 89,231, 52,219,112,231, 20,191,212,
+224,168, 4,107, 82,234, 72,228,166,160, 72,231,233, 55,137,101, 60, 19,239, 10, 94, 72,206,147, 47,156, 23, 73,244,188,224,201,
+147,130,229, 11,180,240,144,167,184, 15,185,172,149, 46,119, 10,115, 14,116,140,180,232,228, 74, 30,113,170,220,115,151, 39, 97,
+ 38,127,255, 12,158, 22,151, 93,132,240,232, 95, 82, 5,171,130,197,152,247, 86,210, 21, 39, 42, 80,190,254, 53,240,236, 87,159,
+195,141, 35,172,102,229,103,208, 6,171,166,134,155, 38,220,222,236, 48,184,192, 35,155, 64, 8, 42,160, 61,127,140, 71,111,190,
+141,159,252,135,111,163,122,250, 9,126,255,159,255,231,248,223,255,245,191,197,132, 32,213,186,140, 20,229, 67,239, 67,196, 4,
+133,149, 49, 8, 82, 37,205,209,126,197,212,224,104, 53,145, 63,192,169, 48,162, 35,250,158, 90,150,110, 42,206,213,129, 18, 33,
+ 89, 60, 66, 25,206,151,109, 10, 86,157, 3, 96,230, 39, 66, 47,162, 84, 19,142,116, 57, 57, 80,133,109,158,138,226,227,152,177,
+ 95,136,219,146, 53, 73,198,149, 37,237, 79,101,102,180, 28,229, 81,177,234, 93,198,254,154,176,176, 44,126,247,251, 63,131,115,
+ 35,126,240,254,103,240,222,227,149, 59, 91,108,183,107,156,111, 79, 16, 67,196,166,171, 48, 78, 30,189,139,168,173,193,237,126,
+ 15,107,216,122, 70, 20,242,168,207, 90, 11,239, 29,154,186,134,115, 99, 86,161, 54,214, 98,242, 30, 77,165, 16, 13, 63,185,206,
+ 1,125,112, 8, 20, 80,213,236, 87,175,173,201,185,222, 33, 4, 84, 13, 19,211, 2, 17,200, 7, 24, 99, 16,130, 23, 91,158, 64,
+ 72,160, 48,142, 19,160,192,137,108,206, 3, 48, 0, 69, 12,227, 4, 99, 52,134,201,205,220,234,244, 26,145, 90, 4, 20, 2, 10,
+127,243,179, 15, 81, 9, 13,107, 28, 39, 40,165,112,186, 89,195, 86, 22,198, 86,204,212, 78, 73, 84, 0, 16, 61, 12,106,212,117,
+205, 93,200,246, 4,193,141,136, 99,143, 87, 30, 62,132, 11,132,157,155, 48, 61,249, 20,119,238,221,195,166,169,208,117, 29,252,
+225, 22, 10,132,214, 40, 28,180,130,167,136,103,183,123,144,119,120,120,239, 12,103,103, 39,104, 26,158,140, 60,123,126,131,105,
+ 26,113,255,222, 93, 64, 41,220,220,222,226,228,228, 28,117,183, 2, 76,149,133,106, 65,192, 59, 62, 70, 84,117,195,170, 99,205,
+184,221,152,114,179,245, 60,102,133,209, 32,239, 69, 24,133,124,121,229, 21,143, 49,208, 49,240,250, 68,161, 88,225,240,225, 78,
+137, 54, 71,133,213, 77,118,180, 62,178,144,146,113,177,148,173,115,105,204,107,173, 69,215,173,241,149, 47,190, 49, 39,126,229,
+221,127,114,248,204, 0,154, 18,228,153, 21, 40, 47, 21,204,169, 69,114,100,210,173,164,213,102,137,230, 94, 50,182,168,116,112,
+206,182,174,244,154,128,197,113, 9,236,227,157,151, 78,125, 18, 80,146, 36,222, 73,242, 93, 98,193, 79,206, 97, 26,165,208, 43,
+ 8,101,144, 36,188, 20,241,171, 73, 8,128,182,134, 55, 53,156,174, 48,248, 41,227,118, 99,224,105, 71, 76,133, 85,242,182,139,
+240,149,117, 11,220, 57, 55, 77,141,166,105,102,235, 51,205,220,116, 42, 96, 48,252,103,229, 8,138, 66,135,204,103, 76,142, 95,
+156, 47,244, 24,184, 32,241, 76,110, 84,222,137, 93, 57, 2,198, 64, 27,131, 96,152, 12, 40, 41, 69,108,205,147,192, 31, 77,132,
+ 74, 87,232,139, 75, 61, 79,135,114,151, 46, 10,121,201,155, 79,216,235,185,207, 84,197,249,169,138, 48,153,148, 91, 80,100, 74,
+104, 93,176, 68,104, 17, 43, 61, 55,168,148,249,253,106,177,142,153,233,126,116, 20, 40, 3,154, 45,117, 68,128, 77,214,164, 37,
+ 47, 93, 46,153,244, 0,103,102,119,250, 38, 84, 62,236, 33, 82,252, 36,252, 74,187, 48, 86,243, 38,206,174, 46,124,227,244, 82,
+ 76,108,249,123, 60, 35, 72,120, 62,129, 94,168,217, 34, 64, 71, 46,237, 23,132, 10,197, 15,173, 0,184,177,135,169,106, 32, 76,
+176, 74,225,242,106,135, 87,238,157,225,118,183,199, 52,186,140, 29, 92,173, 26,156,223,189,139,103,159, 63,197,119,191,253, 30,
+ 30,126,225, 13, 28,110, 47,176, 62, 57,135, 81, 10,167,175, 60,134, 26, 15, 64,116,156,196, 53,121,168,198, 10,189,137, 96,172,
+194, 40,193, 40, 41,221,170,244,151, 30,225, 81,230,203,242, 5, 56, 79, 41, 36, 64, 65, 56,154,125,252,138,232, 69, 46, 62, 29,
+165,151, 22, 10,120, 69,169,147,197,162,112, 99,152, 6,228,223,145, 45,133, 9,174,177,176,231,208, 75,160,214, 5, 52, 80,209,
+172, 95, 37, 73,177, 80, 71,181, 73,186,204,185,114,230,200,206,121, 42, 51, 79, 23,234,138, 15, 90, 91,241,222,235,201,229, 13,
+ 62,185,184, 2,197,143,241,224,252, 4,167,167, 39, 88,183, 29,148, 98,236,100,119,247, 28,251,253,129, 59,232,186,129,115, 14,
+109, 83, 99,114, 14,214, 86,240,145, 0,109, 1,104,140,227,129,149,206, 98,189,154,124,128, 77,155, 3,173,177,105,106,244,195,
+192,251, 89, 31, 96, 20, 1,158, 59,110, 69, 10, 30, 60, 62,103,196, 50,167,178, 69,240, 72,211, 59, 14,168,224, 67,202,192,104,
+133,186,226, 12,128,131,172, 6, 38,231,143, 12,207,242, 10,201,123,161, 18,176, 68,139,144, 79,180, 38, 55,163,199, 23,187, 22,
+ 77, 93,139, 56,142,167, 67, 58, 91, 24, 8,202, 59,152,202, 3,166, 66, 93, 91,128, 86, 8,238, 4,222, 57,168,190,135,113, 14,
+163, 34, 12,163,199, 79,127,254,115, 60,190,123,134,223,122,237, 1,254,246,167, 7, 12, 62, 96, 93, 89, 52,134, 5,123, 86, 43,
+172,107,139,195,126,143, 97,116, 56, 63,219,162,109,107,180, 2,173,233,251, 30,215, 55,183, 88,117, 29,158, 95, 95, 97,229, 38,
+ 1,138, 88, 40, 99, 17,156,195, 52, 77,136, 74,195, 52, 45,148,182, 32, 9,141,241, 18,141,170, 52,119,118,100,140,156, 72, 53,
+ 98,112,243,250, 78,126, 46,173,140,164,143,114,215,206,128, 26, 63, 11,137, 84,193,219, 70, 26,237,243,123,234, 3, 67, 83, 92,
+129, 54,141, 66,179,211,154, 39, 8, 77,183, 66,221,118,120,227,181, 87,138, 84,137, 34, 33,145, 88,212,104,140, 46,236, 83,130,
+ 74, 79,236, 5,245,107,198,239,153,158,167,150, 44, 46,164,189,101, 49, 35,141,200,152, 40, 18,159, 62,219, 7, 85, 78,118,155,
+ 21,222, 92, 24, 37,108,107,112, 60,118,103, 45,129, 88,219,130,228,203,167,113,185,231,200, 95,182, 93,138,106, 94, 28, 5, 9,
+180,162, 69, 72,186,218,108, 96,155, 6,109,183, 69,255,217,231,240,227,132,201,123,246,250,203,106,133,114, 76, 29,223, 9, 38,
+111, 64, 3, 63,115,210, 0, 38, 1,241,220,161, 98,177, 95, 95,224,193,169, 72,161,203,103,191, 52,151, 9,146, 19,188,176,235,
+153,152, 71,110, 2,188,103,110,190,164,206,193, 90,192, 24, 40,209, 79,168,148, 17,144,116, 25,228,241, 72,143,120, 15, 70, 96,
+ 50, 36, 99,255,153,219, 62,127,143,233,178, 85,249,109, 68,158,196, 38,103, 88, 41,240,158, 45,102, 90, 82,224, 84,196,114,253,
+152,175,231,152, 87,165, 57, 13, 51,119,252,122, 73, 81,165,108,125,152,211, 37,213, 28,161, 5, 82,176, 51,183, 91,191,120, 88,
+167,215,155, 37,189, 11,128,138,202, 34,182,121,185,159,147,189,228,197,209,154,237, 57, 74,158,231, 56,227,234,126,173,176,100,
+105,155, 91, 18,148,242,214,160, 12, 23, 41, 34,242,162,194,139,217,101, 81, 1,206, 97,101, 8, 55, 33,194, 35,162,174, 43,248,
+224, 49, 13, 35, 98,224, 93,217,163,135,119, 80, 27, 13,219, 54, 88,173, 59, 92, 31, 70,108,206,239,224,243,171,103,248,171, 63,
+255,183,232,106,139,139,207,158,224,241,118,141,182,174,112, 59, 56,172, 5,251,106,148,226,128, 24,197,107,247,153,148,164,231,
+ 42, 76,205,254,239,153,158,171,178,253, 43,145,213, 52, 20,254, 94,242,125,222,203,188, 88, 30,169,133,135,242,197,125, 92, 73,
+ 75,226,148, 61, 30,135,231,177,119,212,115,229,249, 50, 3, 69, 65, 46,202, 30,116,210,153,244,200, 9, 92,162,198, 79, 66, 28,
+210,108,121,203,234,118,204,151,184, 76, 42, 98, 17,247, 72, 96,245,251, 59,111,189,138, 87, 31, 63,192, 95,125,231,251, 24,250,
+ 61,134,225,192, 33, 40, 8,120,242,252, 10, 79, 46,158, 67,105,131,123,103, 39,152, 86,107,172,187, 14,155,174,195,224, 35, 52,
+ 8,117,213, 98,156, 60,180,102, 95, 58,127,101,139,209, 57,116,155,187,232,119, 28, 23,169,181,133, 86, 1, 46,120,137, 23,231,
+ 61,121, 93, 85, 50, 46, 87,240,206, 65,215,141,224, 49, 19, 36, 69,195,251, 8,163, 5,248, 65, 17,163,128,139,200, 59, 24, 91,
+243, 62,221, 32, 79,174,120,215,206,254,244, 88,182,117, 89,226, 80,208,252,138, 44,131,244, 33,104,106,139,173, 40,137, 53, 84,
+ 86,243,130, 2, 20, 25, 40,217,207,171,224, 96,109,205,235, 26,163,209, 52, 13,186,110,141, 32,128, 13, 99, 44,234,138, 96,155,
+ 6, 23,187, 9,219,147,115,252,193, 63,104,240,193,167, 79,240,228,226, 10, 86, 43, 52,150,117, 4,251, 64,120,222,143,176,106,
+196,174, 31,112,247,108,139,245,122,133,166,174, 64,116,192, 48,140,172,182,175, 27,108,183,107, 52, 85, 5, 83,213,168, 87, 39,
+146,153, 48,161,233, 86,128, 50, 8,226, 66,240,130,121,173,140,129,173,235, 76,181, 34,137, 81,205,196, 15, 17,234, 41,101,144,
+ 60, 45,164,197,222,228, 61, 72, 25,144,138, 32,242, 11,101, 49, 37, 2,157, 96,125,125,240,217, 58,232,132, 32,167,101,146,163,
+181,134,149, 93,250,215,191,242, 86, 78,248, 34,104, 32, 70,104,104, 68, 86, 65, 22, 29, 89,204, 83,203, 89, 18, 67,153,141,255,
+107,199,239, 89, 0, 43, 82,160,156,212, 53, 23,205, 90,178, 0, 52, 69,144, 54, 24,180,149, 29,190,153, 47, 72,173,179, 51,133,
+ 4, 11,236,189,135, 27, 71, 4,177, 89, 38, 32,141,247, 30,193, 7, 56,239,249,191,115, 65, 94, 11,121,253,162,203,221,124,114,
+ 45, 41, 16,182, 39,167,104, 78,207,176,222,110,209,110, 79,240,228,217, 37, 76,187, 66,116,220,208, 68,197,255,164,112, 25,173,
+151, 19, 63,254,190,184,144,186,124,126,137, 71,143, 30, 8,248,106,118, 48,132,120, 68,181, 92, 16,213,150,145,205, 16,129,108,
+ 12,129,173,171,158, 5,129,138, 34,224,157, 92,238,204,185, 79, 13, 76,172, 2,162, 49,160, 96, 65,214,194,104,197,227,121, 17,
+178, 69, 21,161,131,199,185, 82,184, 16,248, 83, 38,165, 70,201, 28,144, 95,151,194,247, 35, 76,121,193, 5, 41,173,221,185,101,
+227,108, 87, 62, 47,197, 33, 3,154, 93, 5, 60, 94, 79, 54, 58,169, 14, 73,201, 35, 70,197,184,189, 8, 91, 45,243,230, 23,244,
+ 79,192,102,235,153,162,101, 80,202,113,136,134, 82, 69, 12, 40,114,170, 14, 45,146,180, 40,179,171,115, 56, 66, 1,110,208,152,
+115,187,203, 19,107, 73,140,155,187, 63, 85, 16,153,102,213,168,202, 81,134,203, 17, 53,207,179, 82,226, 89,249,115,140,195, 8,
+ 13,194, 89, 87,227,208, 15, 80, 90, 99, 58,140,184,255,214,151,241,228,167, 63,194,253,123, 91,172, 54, 29, 40, 68,236,251, 93,
+142,148,253,194,219, 95,198,147,159,253, 8, 77,219,225,124,213, 96,220,143,248,253,127,241, 95,224,175,255,221,159, 97,127, 17,
+176,158, 28,234,186, 98,223,171,188, 76,218,104,216,166, 41,172,100, 36, 44,121,158, 86,228,215,240, 37, 65, 55, 42,135,162,226,
+ 40,137, 44, 5,169,205, 54, 49, 42,162,233,242,120,234, 72,133, 27,169, 40,196, 50, 64,134,138,130, 88, 65,235, 88,192,126,104,
+150,218,209, 17,123, 64,189,172,247,152,149,188,165,144,133, 52,150, 31,129,200, 7,163, 78, 9,112,201,182, 86, 66, 71, 40, 50,
+164, 36,146,116,242, 64,211, 84,248,195,223,255, 29,104,165,240,157,239,254, 16, 23, 23,207, 48,244,123,184,105,228,172,236, 16,
+240,244,217, 37, 62,195, 5,180,177,184,127,126,138, 59,219, 19, 52,171, 53,182,155, 53, 86, 93,196, 56, 77,152,166, 17, 90, 25,
+132, 8,212, 13,239,201,235,166, 5, 65, 99,232,119,153,185, 77,114, 89, 87, 21,143,246, 83, 80, 78,148,209, 58,137, 8,210,104,
+141,209, 57,104, 99, 49, 8, 81,206,170,249, 53, 54, 18,120,196, 86, 35,126, 79,125, 8, 2,178,241, 37,123,168,176, 42,241,135,
+ 88, 11,129,170,204,149, 78,156,240,117,215, 96,189, 94,113, 17,169, 69,221, 43, 99,123, 21, 35,116, 85, 67,219,138,187,184,232,
+ 97,180,134,142, 30, 22, 17,117,101,208,212, 21,188,115,128,226,110,171,169,107,120, 31,240,193,167,159,162,169, 42,188,245,234,
+ 23,112,186,221,224, 71, 31,124,130,157,243,160, 17,232,125,192, 73,219, 96,187,106,113,232,123, 60,121,118,133,237, 97,228, 11,
+188,174,160,192,192, 29, 59, 76,184,189,189,197,122,181,194,250,244, 28,245, 20,120, 30,100, 43,172,235, 70, 40,114, 49,143,126,
+155,166,129,182, 53,160, 44, 16, 38, 46, 76,160,196,150, 37,234,110, 37, 34,183, 66, 57, 66, 2,175, 33,217,181, 39,133,124, 2,
+149,164,238, 60,138,168, 45,200,197,230, 67,128, 19,224, 16, 41, 61,207, 38,149,146,104, 80,139,135,247,239,200,251,108,114, 55,
+ 4, 45,223, 19, 1,214,178, 2,158,101,214,105,218,165,101,146, 32, 43,173, 20,204,244, 18, 88, 13, 21, 12,108,149,146,198,168,
+248, 7, 4,237, 61, 95,236, 18,143,186, 82, 22,211,106, 13, 8,116,136,147,199,116,161, 6,103,186,218, 56,142,178, 47,247, 34,
+ 8,151, 48, 29,129,196, 36, 88, 76, 42, 94, 3,233,236,229,247,222,101, 45,141, 6, 23,123,213,106,133,122,179,197,250,228, 20,
+ 85,215,161,106, 59, 76,193, 67, 89, 38,114,146, 78,170,238,121,215,156,227,147,229,125, 10,129,189,242,135, 67,207,190,119, 69,
+136, 62,194,249, 32, 62,120,225,211,103,255,248,124, 45, 24,205, 62,118,163, 53, 42,107,217,126, 71, 17,209, 57,248,105,130,155,
+198,188, 71, 87,129, 83,232, 40,122, 32, 68, 24,195, 25, 29, 49, 6, 4,107,249,215, 24, 50,116,103,102,119,104,132,224,112, 90,
+ 25,124, 46,197, 85, 12,106, 46, 12, 23, 93,125,178, 33,234, 25, 18,148,184,252,170,100, 24,148, 93, 27,119,179,145, 56,149, 82,
+ 17,165,220,151,217,115, 47,235,142,164,255, 35,137,217,230, 97,169,102,150, 60, 21,123,244, 88,112, 3, 22, 22, 57,185, 43, 21,
+193,106,165, 16,138,241,231, 75,154, 93,169, 46, 37,207, 21, 71, 65,105, 52, 7,161, 45,188, 82,242,162,169,114,204,252, 82,235,
+199,145,144, 68,198, 24, 49, 18, 72,199,101,123, 72,197, 95, 70,229, 15,162,178,160,111, 65, 25,204,149,120,141,232,118, 8, 20,
+ 48, 58,143,211,179, 13,238, 63,124, 21, 95,251,189, 63,194,255,250,131,239,161, 93,181,217,254,208, 84, 6, 83, 47,249,214,162,
+246,188,255,240, 21,169,144,129,223,254,131, 63,194, 95,255,249,159,229, 23, 24, 57, 24, 33, 98,138,220,185, 85, 85, 93,188, 68,
+154,147,216, 98, 9, 97, 65,230, 66,191,120, 79,150,156,116,181, 88,113, 35,211,224,244,114,119,147,216,234,185,162,156, 19,244,
+ 84,233,111, 20, 75, 98,218, 27, 41,201, 88, 79,254,219,185,139, 40,202,180,151,196,160,190,232,187,159,137,113,124, 88, 97, 65,
+217, 42,247,247, 51,220, 65,229, 44,226,236,222, 16, 52,168,138,144,128, 33,157, 97, 20,223,252,198,111,192,104, 5,135, 21,254,
+253,191,251, 54, 46,158, 61, 1,105, 30,197,165,241,226,211,103,207,241,244,217,115, 84,117,141, 7,119,206,177, 89,175,177, 89,
+175,229,242,138,104, 42,133, 41, 68, 24, 91,207,121,211,166,230, 40, 79,226,110,218,128,177,172,156, 11,109, 16, 2,219, 20,125,
+218, 17, 66,193,104,142,151,116,228, 97, 37,119, 60, 68,207,162, 53,163,243,165, 20, 66,132, 54, 22, 33, 38,214,120, 40,198,174,
+101, 14,178,112,171, 23,185,241, 75,238,127, 36,224,108,187, 70, 43,104, 77, 37, 43, 46,164,188,107, 74,112,142,132, 88, 13,208,
+240,176, 20, 80, 81, 68,173,129,216, 54,249, 48,240,129,227,132, 35, 69,156,157,157, 33,134,128,171,195,132,166,233,240,213, 55,
+190,128,207,174,118, 24,160,240,246,102,139, 70, 43, 92, 95, 95,227, 48, 78, 80,136,184,222, 29,112,232, 7,116,109,131,182,173,
+112,189, 59,192,104,133,243, 45, 11,234,160,175,225,218, 21,148,109,112,231,228, 14,108,211, 65,105,131,105,154, 48,140, 3, 42,
+163,115, 10, 33,162,207,129,227,108, 25, 51, 34,182, 2,188,104, 70,120, 15, 42,170,122,109, 5,233, 73,115,160,139,140,150, 99,
+ 18,224,201, 97, 28,130,135, 23,129, 92,186,216,121, 11, 99,243,243,174,181, 65, 93,183,104,187, 86,166, 24,102, 17,210,146,132,
+104, 90,203,152, 90,146,204, 84, 90, 33, 73,250, 95,148,207, 37,228,255, 46,197, 17,153, 62,145, 68, 80, 34, 78, 83,242,126, 41,
+130,100,157, 75,167, 30, 3, 84, 8, 2, 76, 25,161,252,132,105,115, 10, 85, 85, 50, 69,224,208, 45, 34, 6,151, 68, 2,250, 97,
+196,212,247,121, 85, 25, 83, 17, 57,205,124,118, 39,222,124,126,214,249, 53, 49,182,130,182, 54,115,227,161, 13, 54,167,167,104,
+215, 27, 52, 93, 7,219,180,232,214, 43, 60,122,252, 8,239,191, 63, 64, 91, 3,114,172,129,208, 57,110,116, 38,166,233, 84,188,
+203,133,221,239,247, 88,111,182,216,239, 15,104, 26, 22,139, 78, 19, 7,193,140, 3,171,234,125, 8,115,202,154,226, 28,116,173,
+ 53,154,186, 66, 93,215,168,173, 65,101, 53, 32, 93,186,159, 28,166,113, 64,244,204,124, 32,207, 2, 87,190,228, 3,124,144, 40,
+ 83, 5, 88, 91, 33, 84,172,227, 8,218,192, 26, 46,216,180,156,133, 14, 64,173,109, 26, 10,205, 10,245,210,195,158,243, 42, 84,
+134,217, 36,132,122, 2, 45,189, 16,249,157,137,191,130,123,149,152,204,196, 97, 40,237,131,201, 85, 84,102, 96, 65, 66,214,178,
+141,184, 80,232,167,239, 41,143,255, 23,250, 40,205,152,216, 12, 72,120, 9,147, 61, 7,198, 43,254, 6, 41,169,241,138, 21,145,
+ 42, 70,186,121, 29, 44, 15,151,210,162, 90, 76,123,224,194,130,165,104,110,218,105, 89,206,202, 1,165, 23,115, 95,254,218, 12,
+246, 88,173,214,217,115,104,140, 65, 63,244, 92, 17, 81, 40,210,195,248,143,186,113, 15, 63, 12,152,250, 1,163,243, 88, 87, 6,
+207,222,127, 15,255,231, 47,222,207,157,230, 56, 76,208, 96, 91,200,254, 48,128, 98,196,197,231, 79, 97,172,197,147,143, 63,192,
+ 97,114,184,119,122,142,191,253,139,111, 99, 12,236,119,124,243,107,191,133, 95,253,242, 39, 60,234,138, 17, 83,136,176,182,128,
+ 82,168, 57, 96,101, 30,219,205,194, 53,165, 94,202, 8,122, 49,164, 86, 45, 21,253,179, 58,190,188, 8,230, 63, 89,164, 23, 46,
+148,150, 72,113,128, 57,239,254,248, 98,199, 34, 6,146, 72,101,109, 3, 22, 0, 32,181,200, 90,198, 11, 52,188,163, 65,132,176,
+ 12,142, 12,242,133,117,167, 96, 51, 73, 39,198, 31,130, 40,204, 2,254, 47,246, 97,133,167, 79, 63,199,217,157,251, 88,173, 86,
+120,231,205, 87,241,221,239,255, 16,253, 97,135,105, 24,224,220,148, 69, 65, 79, 47, 46,241,228,217, 5,106,107,113,255,116,139,
+237,102,141,122,123,134, 70, 25, 16,121, 76, 8,194,100, 15, 0, 12,130,182, 44,130,164, 32, 19,142,164,208,230,170, 90, 39, 16,
+144, 98,229, 59,148,102,145, 92,140,176,182, 65,244, 6, 49,112, 23,170,181,129, 74,208, 14,239,225, 35,112,232, 7,217,195,207,
+124, 0, 22,131,206, 98, 21, 74,127, 71,145,200,151,188,179, 4,224,206,201,150,191,182,214,208,194,121,167, 24, 0, 35, 86,171,
+192,227,107,138,150, 47, 6,165, 80, 85, 21, 98, 8,104,196,250, 21,173, 1, 53, 21,251,152,189,199,193, 7,132, 20, 72,161,128,
+253,228, 64, 81,225,181,199,175,160,218,156, 98, 24, 70,244, 55,151,208,220, 1,192, 84, 13,188,245, 24,199, 9, 55,187, 3,134,
+193,160,235, 26,172, 87, 45, 28, 89,116,218, 34,146,134,139,192,249,233, 25,186,237, 41,140,109,224, 34, 97, 24, 71, 68,239,161,
+109,195,223,171,102,180, 48, 36,206, 57,101,174, 83, 82, 85, 43, 45,221,184, 70, 52, 85, 86, 93,199,140, 44,245,121,196,158,225,
+ 40, 33,100, 26, 89, 76,246, 43, 41,200, 66,140, 18,171,202,182, 37, 72,180,173,177, 21,222,121,243, 11,185, 16, 77, 62,116,164,
+ 40,220, 20, 84, 69,188,102, 75,171,170,168, 82, 4,121,161, 30, 87, 69, 46, 83, 41,143,147,245,164,166, 8, 29, 3, 16, 34,239,
+122,197, 59,173,229, 60, 85,224,181, 67, 66,184, 18, 17, 84, 8,168,174, 2,204,230, 4,113,187,153, 87, 93,196, 29,173, 54,188,
+218, 56,244, 35, 20, 5, 88,201, 22,112,110,194, 56, 78, 24,198, 17,147,115,178,250, 65,158, 96, 68,137,247,109,186, 21,226,225,
+ 0, 34,133,211,243, 51,108, 78, 54, 88,109,214,140, 26,238, 90, 24, 99,209,182, 44,118, 59,236,109,110, 40,148, 68, 37,115,108,
+185,206, 52,180, 57, 99, 62,192, 77, 35,246,187, 29, 46, 47,175,177, 90,175,208,247, 35,198,113, 64, 63, 12,152, 70, 39,144, 35,
+166,224, 65, 38,189, 9,202, 82, 87, 21,186,166,194,102,189,198,201,170,229,236,133, 16,224,198,129,227,115,199,129, 57, 16, 20,
+179,192,143,164, 24, 74, 88, 88, 99, 28,154,202,194, 87, 22, 77, 85, 33, 24, 30,195, 43, 2,140, 73,238,157, 9,167,186,198,149,
+143,249, 62,202,106,248, 69, 22,121, 10,180, 70,102,136,144,162, 69, 84, 56,149, 43,181,140,155,157,111,235,236, 47, 47,136,113,
+249,223,149, 90,236,201, 25,198, 52,219, 57, 75, 16, 16, 98,129, 98,207,151, 48,191, 31,118, 78, 11, 34,241, 17,210,139,198, 12,
+ 17, 3,100,159,114, 1,208,103, 37,166,202,177,118, 42,169,253,142, 71,243, 5,180, 36,143, 46,138, 20,184,185, 40, 40,131, 67,
+196, 9, 45,100,180,202, 90,188,253,198, 91,184,186,248, 12, 31,127,244, 33,140, 40,105, 73, 3,103,231,119,121,124,171, 42, 68,
+ 25, 73, 37,207,236,212,247,216,239,123,192, 59, 84,181, 97, 21,115,219, 96,124,242, 12,154, 8,215, 23,151,156, 56, 69,132,113,
+ 26,113, 56, 12,120,227,203, 95,195,251,255,241,175,209,110, 58,252,228,123,127,137,224, 3, 84,244,248,206,191,249, 87,232, 71,
+135, 70, 1, 79,127,254, 19, 76,217,126, 67,217,130, 97,180, 46,188,242,133,119, 31,133, 66, 63,111, 54,116, 57, 92, 92, 84,124,
+217,223, 95,100, 42,167,175,165,147,200,102,161,160, 59, 18, 35, 82,118, 55, 30,221,178, 42,139,114,248, 53,227, 88, 86,149,226,
+ 89, 41,230,103,129, 10,175,255, 66, 43, 71,106,129,187, 93, 86, 35,106,193, 80,200, 29,187, 42,120, 28,145, 80,184, 31,231,241,
+123,177, 81,201,147, 12,197,233, 76,143, 31,189,137, 31,190,251, 46,126,251, 55,223, 2, 41, 3,133,128,127,250, 79,254, 49,172,
+ 53,120,118,113,133,191,253,238,187, 24,243,120,158,217,222,253, 48,226,163,113,128,254,252, 25,186,238,115,156,109,183,120,252,
+240, 62,206,183, 27,244,211,132,113,162, 89, 20,154, 3, 29,180, 40,159, 83,184, 10,255,211,212, 53,250, 97, 90,196,213, 54, 85,
+197, 88, 90,136,126, 68, 78,245, 72, 0,121, 22,172, 57, 31, 5, 93, 59, 79,152,102,145, 85,145,228,135, 66,141, 42, 83,166,210,
+181,176, 89,175,160,141,206,185,204, 57,145,175,240, 43, 51,191,155, 99, 85, 33,202,120,171, 20,243, 20,172, 6,213,149, 96,151,
+ 21,140,173, 96,109,133,195, 48,224, 48, 12,112,126, 20,187, 25,240,236,249,115, 84,187, 61,170,182,131,246, 1,154, 20,218,154,
+187,186, 78, 85,104,235, 10,206,249, 98, 23, 42,175, 89,100, 59,209,230,244, 12,171,205, 41, 11,230, 34, 97,114, 19,198,113, 64,
+165,249,117, 13,110,196, 68, 97, 86,242,104, 43, 9,110, 60, 30,143,133, 85, 43, 66,101,127,116, 12, 78,172, 85,188,147, 13,206,
+193,231,139, 62,100, 34, 89,250,135,228,247,185,131,231,213, 70, 20,125,144,150,209,187, 54, 6, 15,238,157, 23,231, 89,178,216,
+ 69,113, 80, 24,105, 82,230, 2, 56,231,161,231,245,122,217,141,151,241, 14,185, 58, 19,170, 89,128, 14, 30,202,123, 25,149, 71,
+232,151,168,104, 18,203, 62,143,128, 67,128,186, 37, 40,239,129,243,179,124, 94,135,192,108, 4,219, 52,232,157,231, 51,206,176,
+178,221,123,158,140, 76,211, 4, 55,121,132,192,211,162, 20,151,202, 96, 32,254, 25, 55,167,167,208, 74, 97,123,122,130,237,201,
+ 9, 86,171, 21, 54,155, 13, 86,171, 21,250,126, 96,145, 97, 8,176,182,202,180,201,132, 65,213, 74, 38, 47, 2, 91, 73, 46, 85,
+138, 81,198,239, 59, 60,127,126,137, 97, 28,209,247, 61,134, 97,196, 48,140, 12, 1,146,213, 64,140,133, 26, 95,176,203, 77,101,
+177,110, 42,196, 97,128,118, 39,104, 42, 37, 95,211,195, 77, 78,236,146, 12,162, 82,130, 39, 14,110, 2,165,137,152,124,134,156,
+183,104, 67, 5, 10,132,170,226, 49,188, 82,128, 9,252, 57, 10, 4,172,187, 10, 23,113,153,200, 86,242, 2,230,148,203, 34,177,
+146,202, 51,182,216,175,171, 57, 18,155,138,108,122,202, 96, 17,202, 89, 42,139, 40,222,244,153,143,133,166,166,152, 24,196, 66,
+188,151, 98,101, 73, 46,254, 84, 84, 81, 36,216, 57, 84,132,150,105, 93,115, 96,112,129,195,211,197, 37, 81, 8, 3, 10,190,119,
+177, 49, 18,182,183,140, 23, 82,120,188, 8,221, 40,123,178,165,123,207, 49,112,243,100, 32,117,142, 68,192,221, 59,119, 16, 39,
+143,159,254,221,119, 48,122,143,155,203,231, 8, 49,160,170, 44,130, 15,120,254,217,167,208,202, 96,117,114,202, 32,144,105, 68,
+213,112, 26, 16, 85, 22,253, 52,130,166, 9,111, 63,120,128,195,161,135, 85, 10,191,243,207,255, 43,252,205,255,245, 63, 98,191,
+239,197,195, 74, 64,240,248,167,255,229,191,196,207,222,253, 30,154,174,193,201,249, 25,126,249,233, 83,108,181, 2,188,131, 61,
+233,112,241,236, 10,107,165, 96, 12, 97,119,112,104,172,129,138, 1, 46, 40,212,162,234,117,206, 9,128, 38,197,166,242, 56, 72,
+139,173, 97, 12,243, 8,133, 57, 58, 58,155, 99,150,138, 17,202,157,245,140,155, 76, 25,220,180, 80,141, 19,212, 18,111,152,186,
+234,133, 55,130, 22, 59, 19,138,243, 5, 14, 9,236,209, 58, 37,185,169, 69,215, 72, 71,204,219,210,162, 94, 42,248, 23, 25,232,
+121,208,194,187,117, 30,215, 29,173, 29, 82, 8, 79, 14, 76, 80, 89, 16,169,229,226,242,246, 12,255,254,255,251,215,120,231,237,
+183,240,193,147, 29,238,108, 43,108, 55, 77, 78, 72, 59, 61,221,226,143,254,211,223, 3, 0,252,236, 23, 31,224,131, 15,127,133,
+113,216, 99, 28,216, 95, 27,137,176,219,239,112, 56,236,241,236,249, 5, 30,223,191,139,245,246, 12,171,166, 69, 32,177,232,128,
+ 16,157, 67,211,174, 48, 14,123,137,128, 4, 72, 25, 70,200, 2,168, 43,195,169,105,222,229, 66, 39,196, 0,239,216,159, 30, 69,
+116,148,236, 48, 65,194, 67, 48, 75, 92,178,194,184,100, 51,168,100, 23,149, 29, 45, 45, 21, 19,176, 90,163, 22,182,123, 89, 80,
+ 71,163,231, 41,142, 98,246, 55, 11, 22, 53,119,130,162,243,168,234, 70, 82, 19, 21,148,118,236,155,143, 10,119,238, 24,220, 30,
+246,120,246,252, 41,246,251, 3, 14,135, 61, 7,218,104,141,253,110, 7,123,115,139,149,173, 64,154,208, 52, 13,234,186,130, 53,
+ 58,199, 91, 50, 90,213,114, 10, 98,219,162, 91,175,177, 61, 59,199,230,228, 14,172,172,161,134,105,192,112,216, 35,120, 15, 83,
+ 91, 76, 46,194, 71, 7,160,103,165,181,214,208,198,178,149, 77, 27, 4, 63,101,189, 78, 74,120, 99,216, 73, 16, 8,138, 8,166,
+ 10, 24, 74,140, 1, 44,145, 12,121,197,176,240, 82,139, 67, 33, 89, 61, 33,222,116, 91,213,232,218,118,134,217,164,221,185,216,
+178,120, 28, 95, 82,222,162, 8, 94, 85,206, 52,207, 23,125,201,238, 76, 53,119, 68, 22, 51,105,226, 75,153,252, 4,229,125,134,
+165,144,116,186,148,131,176,228,236,148,206, 51, 33,113, 83, 7, 79,109, 3,212,141,184,107, 52,214,155, 53,170,231, 21,162,210,
+ 24,199, 9, 94,115,183, 20,188,199, 52, 58,140, 19,139, 4, 39,231, 49, 77, 35,175,171, 10, 81, 97,240, 30,221,122,131,166,105,
+112,114,122,130,245,102,131,205,102,131,110,181, 66, 85,213,184,186,186,193,225,112,128,159, 38,166, 23,106,157,181, 63, 57,156,
+ 36,113,203,213, 50, 72, 42, 70,130, 27, 29,158, 61,253, 12, 39,231,103,184,185,185,193, 56,242,212,192, 57,135, 16,253,226, 18,
+ 77,103, 36, 8,152, 6, 2,185, 26, 58,122,232, 24,176, 89,183, 72, 88,191, 52,145, 11,222,203,138, 81, 38, 85, 82, 8, 82, 97,
+ 81,179,198,194, 55, 53,124, 19,208,120,139,202, 88, 88, 99,196,161,165, 96,106,192,218, 9,154, 52,227,141,105,110,208, 72,209,
+ 60, 42,213,148, 81,198,243,142, 29, 57,222, 58, 19, 89,211,214, 56, 79,167,139, 11,189,184,240, 75,213,113,246, 13,197, 25,194,
+180,220,112, 82, 49,161,161, 34,179, 67,101,251, 48, 73, 49,104, 75, 74, 78,201, 6, 95, 72,157,148, 90, 80, 14,103, 27, 14,229,
+131, 71, 23,182,173,153,212, 69, 69, 30,123, 38,160, 20,121,225,133,102,142,150,138,171, 25,127,162,112,231,206, 61,140,135, 3,
+158,125,242, 33,194,184,135,170, 90,104, 77, 60,210,235,123, 24,163,224, 2,161,173, 53,110, 46, 62, 23, 31,240,132,187,247, 31,
+ 97,127,117,129,182,171,241,246,215,190,142, 16, 2,206,238, 63,196,212, 31,128,195, 45, 92,127, 9, 43,162,172, 90, 17, 6,205,
+ 35,182,191,250,191,255, 21,226,180,195,189, 7, 15,177, 31, 14,232, 15, 3,182,198,160, 50, 10,207,119,123, 12,227,132,187, 93,
+ 3,163, 57,187,122, 63,121,180, 90, 99,239, 28, 98,220,225, 39, 63,250, 1,126,248,131,119,209,117, 43,124,245, 75,111,227,206,
+186,195,186,173,113,178, 89,161, 91,117,176,166, 66,244, 30,251,126,196,165,167, 12, 47, 64, 44, 37,135, 5, 36, 38,249, 57, 75,
+ 42,157, 8, 42, 23, 87,120, 60, 82,254,151, 22,137, 66,135,203, 95, 39, 37, 68,241,193,169,245, 28,246, 18,101, 50,144, 8,134,
+ 41, 53, 73, 45,214, 6,101, 26,145, 96, 14, 75,160,196, 98, 7, 63,139, 56, 18,106,115, 65,112,200,140,121, 14,243,201,207, 90,
+ 76,176,145,136,254,234, 9,246,183, 87,120,239,246, 26,143, 31,221,195,102,181, 94,168, 66,243,244,136,128,119,222,122, 3, 95,
+122,231, 45,236,118, 59,124,247,251, 63,194,238,246, 26, 99,127,128,247, 14, 33, 6, 12,211,132, 95,124,252, 9, 86,221,115,188,
+246,224, 46,200,116, 48,166,202, 14,129,224, 6, 17,155,113,140,167,214, 90,196, 68,200,185,215,198, 48,134, 52, 18,239, 94,107,
+213, 96,156, 70, 56,231, 57, 90,149,192, 41, 96,154,196, 86, 20, 22, 44,223,184,196, 1,204, 23, 66,138, 92, 4, 45,216,207,149,
+ 53,236,183,149, 73, 66,218, 27, 35, 6, 68, 5,196,168,178,119, 55, 36,107,146,173,160,172, 21,251, 30,161,174,171,156,214,103,
+155, 53,234,230, 4,187,253, 14,187,225, 6,167, 39,103,176,198,160,174, 44,250,234,128,195,225, 0, 34, 66,191,223,227,209,201,
+ 6,126, 23,128,166, 69,109, 45,154,218,114,194,150, 92,200,182,146,221,103,219,161,237, 86,104, 79,206, 80, 53, 29,180, 49,240,
+ 62, 96,232,123, 12,125,207, 7,162,119, 80,193, 1, 97,196,228, 88, 36,213,212, 53,136, 2,218,182,227,253,187,169,100,244, 62,
+ 7,195, 68,225,181, 71, 41,192,162, 92, 70, 41,149, 45,209, 55, 35, 65, 46,250, 48,115,202,165, 16,200,133,143, 36,144, 25, 99,
+ 80, 85, 53,190,252,206,235,185, 35,182,150,247,232, 94,198,193, 74,165, 36, 49,149,115,174, 19,155,127,214,138,146, 76, 94, 72,
+ 46,120,190,242,210, 24, 63,166, 48,145,200,235, 24,229, 29,162,155,102, 79,156, 54,162,122, 22,235,105,138, 67,205,197, 11,123,
+171,161, 20, 84, 8,192,211, 39,160, 71,143, 65,198,192, 90,254,220,221,187,127, 15, 31,127,252, 41,174, 47,175, 48,129,129, 44,
+105,175,238, 3,219, 54,157,155, 68,127, 66,179,123, 84,244, 32,206, 57, 52,109,139,147,211, 83,180, 93,135,213,122,133,213,170,
+131,214, 12, 84,234, 15, 28,136, 85, 53, 53,235, 11, 82,158,189,154,101, 90,153, 23, 41, 19, 17, 72,206,187,155, 70, 28,246, 10,
+117, 83,225,226,226, 2, 10,188,246, 8,126,202,107,132,152,240,192, 90,243, 84, 66, 65,252,229,252, 66,187,224, 49,140, 19,172,
+102,214,133,151,231,193, 77,147, 92,236,113, 46,130,100,213, 64,210,189, 27, 99, 48,140, 53,186,182,193,186,109,209, 86, 21, 42,
+153,190,104, 91,193, 40, 3, 61,177, 99,100,138,179,250,112,167, 29,235, 0, 0, 32, 0, 73, 68, 65, 84, 61,255,100, 20,217,193,
+ 19,197,190, 38,151,117, 44,180, 94,145,138, 0, 43, 61, 35,185, 35,100,215, 95,104,105,230, 27,185,152,220,203, 58, 50,129,190,
+146,160,110,182,198, 45,139,198,116,142,230,245, 56,197, 92, 16,218,236, 5,132,202, 1, 1,234, 24, 27, 43, 31, 6,149, 78,227,
+108, 89,154, 49,177, 40,236, 12, 74,128, 43, 9, 46,129, 72, 34,240, 50, 57,159, 91,145, 98, 91, 79, 18, 2, 40, 20, 21,202, 28,
+154, 0,165,113,239,236, 28,239,190,255, 30,130,119,184,217,247,136,113,199, 95, 23,196, 57,215, 20,208,173, 59,220,238,123, 33,
+ 41, 25, 68,239,240,236,233, 39, 88,173, 90,108,182, 27,238, 18,172,194,238,217,167,168,186, 22,102,213,225,163,143,254, 14,223,
+187,184,193, 63,122,229, 46, 70, 31, 56,252, 65, 27,172, 90,128, 78, 31,192,108,182,184,125,126,129, 78,107, 88,173,224,180,194,
+ 71,159, 93,226,142,181,168,107,139,131, 4, 26,120, 34,222,113, 70, 96,160,136,199,103, 91,156,174, 87, 80, 32,248,221, 37,168,
+209,168,170, 22,117,211,160,105, 90,216,202, 34,122, 3,101, 13,212,190,199,213,224, 65,198,130,180, 46,248,195,200,124,100, 42,
+130, 1, 80,188, 70,170, 36,245, 21,225, 17, 47,104,111,139, 8,192, 57, 66,119,238,165, 21,104,182,232,164, 98, 77,171,229,181,
+ 92,204,206, 85, 1,179,161, 98,233, 63, 83,231,212,146, 99, 67, 69,181, 43,249,218, 90, 99, 81,104,100, 71, 64, 73,162, 43,108,
+137, 93, 99,240,219,191,245,101, 24,163,185,243,165, 37,247,155,150, 94, 59,132, 16,177,234, 90,252, 39,191,251, 77, 64, 1,127,
+247,238,143,241,217,103,159,193,141, 61,119, 43,222,227, 48, 76,248,201,135,159,226,108,205,225, 40,166,238,160,155, 22,211, 36,
+212, 45, 21,178, 79, 56,229, 62, 39, 72, 70, 16,240,204,228,184,122, 79,121,232, 74, 27, 78, 57,243, 5,168, 40, 19,159,104,145,
+114,140, 36,100, 4, 10, 16, 13, 31,112, 25, 31, 41, 5,117, 87, 87, 34,138, 42, 5, 60, 17,177, 72,128,138,242, 44, 90,107,249,
+121, 18,225, 80,202,238, 38,104, 84,182,130, 82,150, 93, 0,228,161, 13,176,106, 91, 0, 3,160, 54,168,141, 70,107, 13,218,186,
+194,161,169, 81, 89,131,247, 47,174,113,182,221,162,109, 27,180,117,133,182,107, 81, 25,158, 26, 88,163, 81, 53, 77,246,121, 87,
+221, 6,166,106, 0, 83,113, 18,154, 27, 48,244, 7, 12,195, 97,246, 20, 7,190,100,167,105, 68,116, 19, 83,240,100,138,177, 90,
+175, 97,171,138,131,105,148,129, 54, 21,251,162,165,128, 74,177,170, 49,178,104, 40,196, 56, 23,119, 50,166,119, 73,237, 61, 57,
+ 76,222,195, 5, 22,203, 69,105,182, 32,123, 95, 91,113,224,205,253,123,231,139,174, 60,237,225, 43, 97, 36, 36, 69,114,202,131,
+228,207,136,150, 76, 6, 90,224,172,243,249,166,226,162,251,103,165,183, 7,220, 52,219,175, 34,207,238, 51,128, 38,145, 61, 41,
+ 10, 68,133,178,239,124,230,143, 43, 96,242, 48,207, 47, 96, 31, 60,204, 9,150, 77, 83,227,213,215, 30,227,201,147,167, 8,147,
+227,189, 61,133, 60,114,247,206, 45, 47,244,226,136,167, 24,225,198, 30,113,189,198,237,237, 1, 15, 30, 62,224,115,202, 90,132,
+192,226, 65,182,119, 90,184, 97,156,167,171, 49, 34,106,128,162,112, 72,180,140,143,149, 20,196, 5, 12,104, 28, 14,184,248,220,
+115, 94, 98, 12,252,172, 58, 55, 23,185, 57,196, 71,132,118, 98,131,157, 38,194,104,148,232, 14, 8,168,108, 94, 27,184,105,196,
+152, 60,247,162,228,143,178,159,247,206,203, 94,156, 59,255,202, 78, 24, 38, 14,157, 89, 55, 44,190,179,182,130,129,129,181, 17,
+202, 7, 68, 29,230,221,119,230,110,164, 44, 18,238,188,117,230,183,199,133,248, 87,189, 16, 43,158, 26,219,152,227,204, 83,120,
+ 90, 86,185,235,227, 22,110,153,242,171,142, 46,116, 42,125, 82,170,240, 24, 23,150, 59, 66,202, 83,199,188, 31, 93,140,224, 23,
+ 41, 33,122,222, 49,164,111, 22,115, 71, 78, 11, 8,154,202, 12,114, 85,164, 26,233, 28,175, 71,243, 24,159,230,108,224, 88,244,
+145,105,243,251,230,235,111,226,227,143, 62,196, 52,236, 81,215, 22,171,174,134,243, 30, 90,105,236,251, 30, 86,107,206, 49,119,
+ 19,172, 6,250, 72,240, 3,255,187,177, 26, 85,197, 0,130,224, 39,104, 16,124,244, 56,220,176,197,237,238,157,187,248,239,255,
+219,255, 26,218, 88,236,111,111,240,217,211,207,112,245,252, 57,198,221, 13, 98,187,193, 7,239,253, 4, 83, 63, 96,211, 84, 56,
+ 57,223,226,175,126,249, 4, 39, 80,104,106, 5, 99, 52, 62,185,222,225,224, 61, 86, 90, 99, 55, 49, 98,118,242, 17, 99,191,199,
+197, 56,160,169, 42,172,238,157,163,171,173, 84,136, 22, 26, 17,228, 38, 80, 96,117,125, 93, 91,172,125,192,181,115,208,214,160,
+192, 8,228,226, 38,141,162, 73,209, 2, 17,180, 64,198,190, 36, 25, 80, 45,131,157,139, 93,223,210, 65,155,133,141, 80, 71,137,
+125,148,139, 53, 90, 68, 65, 34,115,156,179, 56, 68, 29, 57, 25,142,240,254,249,123,202,154,145,121, 42, 49, 91,244,102, 13, 71,
+254, 78, 75,122,141, 28,238,180,192,212, 98,185, 7, 83, 51,188, 33, 11, 84, 34,225, 31,124,237, 43,208,191,249, 85,188,255,193,
+199,248,197,251,191,196, 56, 28, 48,141, 3, 66,136,184, 62, 12,184,222, 31,240,232,124, 11, 84, 29,116,213,202,216,159, 0, 21,
+242,170, 40,241, 23,162, 15,130, 65, 77,163, 50, 13, 99, 8, 33,200,216, 54,242,238,113,114, 14,129,244,204, 45, 79,226,184,130,
+ 90, 5,149,124,171,200,225, 41,243, 48,140,242, 39,189,173,171,124, 88,240,193,165, 16, 37,198,149, 36,223, 92, 19, 65, 43,203,
+130,176, 4, 44, 73,122, 8,109,128,200, 44,122,173, 52,172,214, 76, 23,235,175, 81, 27, 13,212, 21,172, 86,152, 68, 16, 87, 85,
+ 22,117, 93,163,109, 26,156,108,214, 0, 20,234,202,162,105,152, 86, 87, 89, 3,107, 13,170,170, 66,221,180,168,218, 14,117,179,
+130, 93,109,160, 76,197, 60,240,129,119,177,227,192,227,247,169,239,225,166, 17,126,154,248,146, 13, 78,138,152, 91,129,192, 40,
+ 92,223,238,225, 99,196,232, 2,186,182,131,130,240,242,101, 18, 99,173,129, 49, 22,218,104, 6,253, 24, 3,173,173, 8,238, 88,
+240,231,156, 23,149,181,195, 48, 77,152, 38, 15, 31,168, 96, 48, 8,235,189,174,113,178, 93, 35,132,144,157, 31, 73, 96,167,115,
+ 6, 60,191, 39,186, 60,153, 82, 80,211,145, 90, 57, 9, 96, 51,183,161,136, 2, 37, 17,167, 5,231,178,109, 13, 20, 1,121,159,
+ 72,242,220,115, 74,162,116,231,209, 75,148,106, 72, 33, 46,252,233,173,234, 61,116,223, 67,111,214,121,143,219,118, 45, 54,219,
+ 45,158, 95, 76,152,188, 99, 91,151,116,235, 73, 95, 4, 53,119,120, 51, 51,131,215, 73,251,219, 27,220,116, 29,148,210, 60,213,
+145,213,146,209,204,100, 32,168, 60,245, 72,220,125, 21, 0,173,196,106, 39,156,125,228,240, 23,126,246,156,155,178, 21,180,109,
+ 90,236,246, 59, 80,224, 61, 56,167, 19, 38,211,134, 92,148, 90,195, 40,142,161,245,142, 48, 72, 0,205, 52, 14, 44, 2, 21,248,
+147,115, 44,216,156,166,137,189,235, 33, 46,108,140, 49,136, 19, 65, 3,214, 84, 28, 17,235, 3,122, 31,177,110, 27,116,202, 8,
+ 78, 25, 60, 1,201,136, 88,153, 54,166,169,187, 88,211,146,210,157,146, 32,146,104,233, 66,202,217, 61,105, 12, 95,178, 93,100,
+ 31, 19,231, 84,212,180,114, 64, 1,229, 73, 43,199,168,142,226,179,139,198, 37, 63,171, 52,115, 14,202,230,218, 30, 47,248, 89,
+128,161,151,144,145, 52, 98, 80, 98,142, 87, 10, 42, 38,225,192, 76, 55,211,249,146, 47, 96,174,105,254, 47,190,105,157,201, 2,
+ 42,103,233,166,238,127,129, 74, 21,191,251,205,213, 21,227, 13,125,128, 49, 28, 9,216, 90,238,134, 78, 54,107,244,253, 1,221,
+170,101, 1, 81,136, 88,175, 26,140,195,136,126, 56,160, 49, 22, 55, 55, 55,176,214, 48, 30, 86,108, 28,235,213, 10,239,127,248,
+ 43,252,201,159,254, 41, 78, 54, 27, 24,107,113,239,206, 57,222,124,235,173, 66,156, 16, 65,241, 79,224,166, 9,187,253, 1, 87,
+ 87,151, 88,191,251, 67,252,252, 71,239,161,213,132,104, 13, 14,163,135, 33,134,215,168, 24, 49, 6, 25,255,249, 0,109, 57, 54,
+244,238,217, 41,182,235, 21,106, 94, 18, 33, 58,222,156, 7, 33,145, 77,129, 16,253,132,241,106,135,238,254,189,163, 0,102, 85,
+ 80,251, 18, 52,241, 56, 7, 70, 21,180,190, 37, 29,159,202, 8,200,194, 98, 67,133,185, 92, 45, 24,244, 51, 91, 48, 9,212, 23,
+ 93,112, 25,171,187,236, 81,150, 56, 91,168,133,127,114, 97,182, 47, 41,116,122,105,233, 44, 84,115,179,167,151,212,177,123, 46,
+199, 95,150,207,230, 66, 31,152,173, 38, 75, 12,103,140,132,215, 95,123,140, 55,223,120, 21,239,253,236,125,124,244,209, 71, 24,
+135, 1,211, 52,194,121,135,143,158, 93,161,173,118,216,110,182,168,186, 13,180,177, 92,136,106,202,132, 41, 40, 6,151,104,231,
+160,140, 69, 20,161,157, 11, 1, 33,178, 69,200,143, 60,226,103, 26,227, 28,145, 73,229,150, 92, 97, 17,194, 83,134,238,148,226,
+210,244,222, 84,149,157,127,254, 20, 66,129,136,168, 44, 66,240,176,186,202,123, 96,101, 45, 72,115,200, 76, 66, 78, 34, 89,194,
+188,131, 50, 21,140, 82, 8, 83,143,198, 86,104,107, 3, 87, 71,236,251, 61, 99,117,171, 10,245, 52,161,182, 61,186,218, 98,154,
+ 26, 86,251,107, 3,173, 1, 91, 89, 84,214,242,197, 95, 85,168,154, 14,245,106,133,170,219,194, 54, 45,160, 43,168,105,194, 64,
+ 96, 33,212, 52,160,223,237,112,123,203,137,123,125, 47,161, 59, 50,190, 87,154,113,186,117,101,243,180, 78,107, 11,231, 82,196,
+ 42,227, 75,131, 76, 61, 42,201,226,102,219, 33, 95,232, 81,146,243, 20, 56, 46, 55,101,121,135, 16, 49,137,170, 89, 51, 33, 37,
+103, 51, 88, 91,225, 75,111,191,158,173,108,136,132,128,229, 42,135, 10,242, 97, 46, 50,203,152, 68, 36, 42,163,122,225,179, 16,
+197, 22,151, 46,161,232, 3,200, 57, 40, 63,193, 64,177,219, 38,248, 57, 75, 92,235, 89,121, 17,217,147,205,251, 97,122, 97,197,
+ 16,199, 17,166, 63,160,105, 91, 22,152, 2,104,154, 26,119,239,158,227,246,118, 7, 47,177,196,209, 77,136,137,188,167,144, 49,
+174,243,244, 12, 57,187, 96, 26, 7, 92, 93, 94,226,147, 79,158,224, 43, 95,249, 34, 98, 12, 60,237,112,147,232, 12,248,245,240,
+ 18,111, 75, 49, 34,128, 24,234, 66,233, 49,243,226, 92, 98, 36,112,154, 16,240,154,165, 66,191,187, 6,121,158, 68, 25,165, 48,
+121, 87, 76, 20, 35, 95,176,134,157, 5,158,120,109,225, 53,224,173,198, 52, 42, 68, 97,187, 71,129,238, 76,211,132, 65,138,199,
+144, 94, 43,226,181, 75, 66,121,147, 82, 48,218,163,138,132,137, 20, 28, 12, 84,187, 2,193, 34, 70,133, 70, 22,145,201,115, 79,
+ 89,157,172,243,186, 70, 41,157,149,231,138, 94, 18,137, 93,164,108, 82,142,175, 70,129, 96, 79, 66, 56,245, 66,119,175,142, 0,
+162,148,153, 37, 75,160, 82, 14,122, 73, 52, 57, 97,103, 28, 11,219, 45, 94,104,233,139,152,185, 76,136,155,199,235,121, 76,170,
+102, 22,109,218,195,146, 94, 66,100, 18,234, 81, 65, 67, 39, 1, 75,222,161,170,252, 96,209, 66,248, 59,143, 35,141,225, 81,203,
+231,159,124, 8,182, 41, 6,152,170, 66,211, 53,104,149,198,205,205, 13,154,182,197,208, 31,224,124, 64,211, 52, 44,230, 83, 26,
+219,147, 83, 40, 40,132, 0, 4, 23, 96, 26, 3, 47, 35,181,219,219,107,252,103,255,226, 79,112,114,114,194,161, 28,194, 9,214,
+ 64,222,103,242,142, 59,128,218, 22,219,245, 26, 15,239,222,193, 23,223,124, 11,211, 63, 27,112,187,219,225,221,159,190,135, 95,
+252, 63,223,130,118, 17,125, 8,176, 74, 97, 12,129, 15,153, 16, 16,181,194,171, 15,238, 97, 91, 87,168, 41,192, 6, 7,141,128,
+ 72, 42,131, 72, 28, 41,140, 49,226, 48, 49, 56, 97,247,252, 10,171,211,211, 23, 18,158,242, 27, 95, 86,117,233,223,213,139,129,
+ 18,234,133, 70,121,225, 94,151,226,235,216,170,246,178,175,160,230,221,185, 92,176,233, 92,196, 34, 8,104, 41,234,202,135,221,
+ 81,196,100, 57, 49, 72,113,150, 37, 34,115,129,165, 85,115,149, 26, 23,137,128,180,160, 79, 45, 52, 5,105,170, 17, 83, 2, 6,
+229,189, 84, 90, 10, 40, 82,160, 16,241,206, 91,111,224,237,183, 94,199,119,254,246,251,184,189,189,193, 97,191, 3,136, 48, 58,
+ 15,119,249, 28,219,105, 68,221,109, 81, 53, 13,180,151,215,187, 82,153,208,165, 52, 11,134,160, 13,162,159,248, 89,141,132,209,
+ 77,208,218,240, 37, 19,227,130,254,164, 68,252,149, 70,115,105, 50, 22, 41,135,123, 46,114,231,103, 48, 19,171,180, 75,143, 68,
+242,193, 39,246,118, 52, 44,244, 3, 44,180, 92, 2, 80, 90,168, 72,233,121,102,127,183, 53,149, 48, 25, 26,206, 46,112, 14, 93,
+211, 34,146,135, 13, 1,193,104, 56, 5,212, 90,193,133, 36, 76, 19, 81,165, 21,124,175,209,220,169,215,141,140,223, 55,168,186,
+ 14,186,106,120,196, 43,107, 1,231, 38,140,135, 61,110,111,111,241,252,226, 18,215,187, 61, 38, 23,178, 16, 72,139,192, 74, 43,
+133, 94, 79, 34,188,210,128,246, 80,189, 92, 16,145, 15,114,163, 89, 93, 61, 74, 87,104,180,198,160,131,116,233, 12,248,201, 99,
+ 92,185,252,242, 51,108, 44,180,177, 34,198,226,220,116,173, 45, 54,235, 85, 46, 82,131,216, 0, 83,151,158, 82, 17, 83,216,145,
+ 22, 79,184, 86, 84,112, 27, 88, 40,151,248,220, 57,255, 32,210, 34,158, 53, 4,198,185, 70,239, 1, 31,184, 25,144, 78,139, 39,
+ 47,108,241, 75, 3, 95, 18,190,122,246,232, 71,228,103, 37, 40, 5,114, 14,149,115, 48,110,130,105, 26,222,223, 67,161,105, 89,
+ 60,106,170, 26, 67,127, 96,171, 24, 5, 89,169,105,152,108,169, 42,132,180,146,101,225,189, 67,127,216,225,131, 95,126,128,166,
+105,240,232,209,125,140,195,128,195,158,167, 90, 90,216,237, 33,107, 68,248,245,137, 17,240,193, 35, 82, 16, 91, 27,219, 45, 99,
+240, 50,242, 7, 98,100,145,158, 10,142, 47, 44,207,211, 44, 77, 97, 17, 35,107,192, 52, 64,210, 10,129, 2, 60, 44,188, 1,220,
+164,129, 24, 68, 40,138,156,197, 48,142, 35, 95,234,211,140, 0, 38,217,229,231, 34, 40, 65,134,104,130, 83, 6, 78,245, 24, 3,
+225,244,252, 20,103,117,195,147, 9,109, 88,189, 95,218,129,213, 28,137,154,220, 2,165,243,171, 52,247, 18,230,233,101, 42,112,
+180, 34, 68,197,252,147, 40, 72,238, 24, 5, 68,147, 63,231, 69,192,110,161, 91,227,233,126, 44,206, 67, 22, 82,231,139, 62, 77,
+ 86,169,196, 19,211,124,169, 43, 85,140, 68,101, 71,163,210,156,230,200, 11,125,156,145, 62, 75,248,233, 40, 76,117,110,151, 72,
+ 81, 33, 24, 41, 21, 66,106, 25,116,112, 20,127,112,186, 61,193,216,239, 49, 12, 61,180, 6,154,174, 67,116, 14,159, 95, 92,226,
+238,221, 59,128, 82,216, 31, 14, 88,181, 29,148,102, 74,150, 2,161,170, 42, 32,114,110,181,209, 10, 85,101, 16, 35,243,189,181,
+ 6,110,250, 9,175,190,250, 26,108, 85,195, 8,153,203, 8,214, 86, 19,242,168, 82, 25,195, 31, 42, 17, 23,197,232, 65,211,136,
+ 85, 83,227, 31,126,245,171,248,210, 27,111,224,135, 63,253, 41,254,231, 63,251, 22, 90,203,251,184,211,117,203, 64,143,205, 10,
+171,202,162, 82, 64, 77,132, 74,108, 26,253,110,135,201, 9, 20, 35, 18,250, 16,177, 31, 38,236, 70,143,195,112,141, 55,207, 78,
+103, 27, 97, 57,108, 47, 82,231, 40,171,167,227,114,208,174,168,136,241,155, 35, 77,179, 42, 11, 75,135,194,162, 85,135, 62,118,
+199,103,160, 79, 2, 47, 44, 44,108,101, 52,228, 75,160,115, 10, 47,102,210, 44, 26,250, 34, 79,249,216,135,175, 22,223,130, 32,
+128, 41,206, 19, 0, 90,162, 84, 81, 80,250, 18,203, 32,230, 81, 69, 92,228,182,147, 90, 70, 92,255,238,239,124, 3,207, 46, 46,
+241,238, 15,127, 12,189, 55, 24,250, 61,188,119,184,222,239,177,246, 14,181,219,162, 93,173,248,194, 21, 38, 2,137,178,186, 28,
+201,123,231,114,142, 56,101,132,178, 80,187,138,142, 59,185, 31, 74, 85,107,194,108,102,154,160,136, 23,185, 81,224,175,149,132,
+ 61,233, 80,141, 70,129,140, 42, 64, 43,129,181, 36, 6, 51,144, 71,196,134,138, 34,148,169,242,251, 21, 61,211,219,234,186,133,
+115, 35,206,239, 62,194, 56, 13,240, 97,100, 30,190, 86,168, 52, 16,234, 42, 35, 72,115,116,173, 2,180,225, 75,221, 84, 21,108,
+ 93,163,110, 91,212, 77,141,170,102, 74,156, 11,132,216, 15,240,126,194,212,239,177,187,189,197,245,213, 53,174,111,247, 24, 28,
+127, 78,115, 65, 73, 49, 31, 88,105, 10,196, 59, 80, 22,156,113,150,183, 47,193,199,220,225, 27,158, 28, 40, 99,230,241,118,228,
+176, 22, 42, 45,152,152,139, 6, 10,129, 19,187,140, 65, 93, 55,120,244,224,142, 28,210,101,164,170,153, 11, 49, 73, 5,139,242,
+158, 69,138,208, 81, 35,106,198,199,166,221, 23,199, 82,207, 25, 25, 73, 23,163,148,158,113,221, 10,152,124,132,159, 88, 40,200,
+ 81,160, 62,115,215,253,228,216,246,168,103,123,108, 26,235, 83,152,247,183,129, 0, 84, 53, 42, 40,184, 16, 81, 75, 48, 9, 17,
+ 49,250, 85, 28, 65,211, 52, 10,107, 33,102, 32,141,146,168,207,100,203,138, 41,171, 60, 21,192,145,224,198, 1, 55, 87,151,248,
+232,195,143,176,221,174,176,219,237,176,219,237, 48,140, 99,222, 35,207,246, 44,110,200,156,115,136, 1, 34, 60,172, 96,196,106,
+231,189, 3, 72,137,107,193, 33,134, 9, 39,155, 13, 84,116,128,209,176,134,209,199,201, 26,169,149, 66,208,115, 81, 31, 2, 23,
+127,209,107,140,122, 2, 69,147, 73,153, 36,152, 89, 39,249, 2,147, 92,234, 65,116, 88,201, 57, 65,146, 28, 7, 5,184,201, 33,
+104,131,168, 52,130,210,152,158, 95, 99,244, 17,231,119,207,113, 94,215,168,203,168, 92, 53, 59,127, 50, 70, 55,217, 85, 21,165,
+214,136, 5,114,106, 30,137, 39,245,122,226, 26,100, 17,101,186,208, 21,101,221, 16, 95,131,122,225, 38, 75, 49,215,101, 64, 86,
+118,163, 21, 66,232,228,190,152, 33,108,115,184,183,157,183,216, 84,224, 95,185, 82,202, 72,144,252, 13,204, 49,167,185,179,143,
+179,159, 14, 69,199,159,148,212,153,246, 86, 88,120,114, 76,157,136,166, 20, 81,177,203, 85, 9,190,135,186,110,112,243,252, 25,
+136, 8,187,195, 8,231, 38, 52, 77, 13,107, 13,174,174,111,176,106, 27, 52, 33, 64, 33,162,174, 13,156, 15, 18,218,193, 49,172,
+150, 8,251,219, 29,154,174,133,166,136,174,235,240,252,234, 6,127,250,199,127,140,186,174, 97,148,112,219, 5,183,169, 37,131,
+ 91,103,229,126,204, 7, 65,156,122,249,112, 33,211,188,140, 86,120,253,149, 71,248,151,127,252, 79,240,191,125,235, 47,228,193,
+228, 55,123, 85, 87, 48, 32, 24,138,168,180, 66, 91, 55, 24,135, 1,171,174, 67,189, 82,216,141, 19,110, 47,175, 48,141, 35,246,
+251, 1,183,253,132,137,184,251,163,128, 34,251,137, 22, 64, 3, 0, 56, 18,189, 23, 19,142,146,193,187,176,141,191,228,234,165,
+133, 0, 78,149,158,120, 69, 5,103,126, 30, 21,107, 85,148, 95,121,106,115, 60, 15, 56,226,206, 28,193,112,143, 47,249, 99,100,
+170, 42,199,239, 25,210, 80, 48, 17,212,146, 48, 88, 90, 42,169, 68, 29, 23, 42,214,244, 36, 83,226,209,163,200,154, 39,194,157,
+ 59,167,248,195,223,255, 71,248,222,247,127,132,139,139,207,177,223,221,192,185, 9,251,193,193,249, 43,132, 24,208,180, 29, 67,
+ 95, 68, 77,171,141,101,232, 80,152, 47, 60,128,237, 51,147,236,122,147,226,122, 78,107, 42,214, 92, 84, 68, 85, 45,180, 1,152,
+131,232,163, 18,178, 30,242, 40, 49,202,228,130, 47,109,131,160, 21,167,196, 25,126,142,163,247,112, 32, 89,163,133, 76, 31, 84,
+228,229,146, 33, 16, 2,110,175,159, 97,181, 57,199,201,233,125,216,166, 65,244, 14,171,118,141,253,176,131, 86, 22, 86, 1, 65,
+107, 17, 75,201, 40,211, 75, 8,136, 36,171, 25,107, 97,235, 22,117,187, 70, 85,183,168,170, 6,202, 90, 76,126, 64, 12, 1,211,
+ 48,160,223,239,112,123,115,131,219,219, 61, 38, 31,152,255, 94, 78,122, 36, 12, 68,107,141,198, 86,168,171,154, 71,196,218, 72,
+169, 89, 35, 70,159,173,130,147,140, 85, 17, 34, 92, 96, 69, 50,200,207,177,205, 80, 57,143, 62,163,145,147,242, 74,166, 0,214,
+214,168,234, 26, 95,122,231,245,124,222, 49,247,127,110, 84, 98, 78, 14, 76, 1,224, 9, 97, 92, 92,236,177,140, 78,149,174, 53,
+144,100,152,235,204, 81, 39, 89,201, 13,110,130, 27, 71,246,170,199, 8, 4, 39,120, 83,238,198,167,196, 85,207, 4,206,188,156,
+207,140,112,104,131,166,181,136,198,178, 72,178,216,179, 5, 31, 16,124,204,158,111,109,140, 56, 37, 34, 76, 42,152, 84, 65,224,
+ 36,148, 52, 12, 6, 18, 33,224,176,223,225,234,249,115,252,252,189, 95,160,174, 13,110,174,175,113,216,237,120,157, 19, 41,231,
+115,132,192, 44, 16,133,200,142, 15,112,193, 7, 47, 33, 50,162,106,247,110,148, 75, 93,195, 7,254, 94,180, 16,249,234,202,230,
+ 41,131,181,134,245, 19,169, 24,150,247,198, 5, 15,140,201,190, 73,121,167,159, 98, 81, 39,201,138,247, 46, 89,245, 56,209, 47,
+138,130, 92,169, 20, 19, 30, 1,231, 56, 12, 72, 27,144, 50,184,188,217,193, 19,224, 3,225,222,189, 59,140,253, 78,247,149, 82,
+ 5,247,189, 56,221, 82,120, 79, 33, 82,158,133,221, 52,127,172,179, 17, 60, 1,216, 40, 79,189,245, 18, 96, 50,247,103,180,212,
+167, 81, 97, 5, 79, 7,165,154,149,118,243,255,175,248,159,205, 0,139,148,204,166, 41,219,203,230, 48,120, 53, 7,182,148,125,
+ 32, 41, 40, 29, 23, 54, 27,238,236,116,222, 19,106,121, 97,210,225, 82,122,169, 51,172, 95,166, 3, 75,213,183, 66, 63,140, 0,
+ 52, 86, 93, 7, 66,196, 56, 12,188, 95, 51, 6,209,123,244, 0,239,215, 82, 2,146,120,105,251,254, 32,150,136, 10,155,205,138,
+109, 25,206, 97,114, 30,159, 95, 94,226,254,221,251,104,170, 78, 82,174, 68,213,175,117, 14,109,200, 57,203, 90,243,223, 53,141,
+128,177,240, 61, 91,157,198,113, 20,133, 39,171,113,219,182,197,215, 31,158,227, 63,126,114, 1, 66,196,166,173,185,146,148,228,
+ 36, 10, 17, 6,132, 74,222,195,186,235, 64,198,192,133,128,207,158,121,196,201, 99,232, 7,196,122,133,163,129,245,146, 47, 71,
+115, 48,203, 12, 47, 80,121, 79, 72, 71,249,168, 5,187,101,177,123, 81,185, 51, 95, 50,127,231, 24,214, 34, 52, 71,169,163, 14,
+127,182,241,228, 57,252,209, 13, 94,134,204,189, 76, 52,135,151,176,237,211,197,246,194, 54,128, 80, 84,201, 84, 4,225,208, 17,
+ 97,151,178,139, 99,161,136, 47,240, 7, 58, 65, 30, 22,105,132,115, 56,199, 63,252,173,223,192,167, 79,238,226, 71, 63,254, 41,
+ 14,251, 27,140,227,128,201, 71,132,219,107,120, 55, 97,189,222,200, 37, 68, 34,124,114,104,219, 53,134,225, 0,163, 52, 38, 63,
+ 29,189, 23, 51,227,185, 4, 0,137, 59,169,136,182, 61, 10,129,160, 36,112,155, 63,236, 49, 43,132, 69,157, 45,225, 24,209, 24,
+ 22,204, 69, 78, 34, 35,163, 97,149,130, 82, 33,103, 58,104,109,216, 35, 35,227, 82, 35,107,131, 16, 28, 90,187, 69,148,189,183,
+155, 14, 48, 10,188,147, 55, 6, 38,176,149,199, 77, 19, 95,170,146, 62,151,108,175,218, 24, 84,117, 45,130,185,154, 93, 29,138,
+247,168,227,176, 71,191,191,197,205,213, 21,174,175,111, 49, 76, 62,147, 14,141, 82, 80, 70, 21,197, 49, 95, 22, 62, 56,180, 86,
+163,210, 53, 72, 17,118,211, 36, 68, 62,134,137, 24,173, 80, 91, 30,147, 50, 36, 71,240,189,194,231, 86, 90,208,212,242,250, 37,
+186,153,150,113, 48, 71, 34, 27, 52, 77,131,205,122, 45, 73,138,179,205,114, 65, 88,160,101,144, 20,164, 27, 87, 9, 95, 29, 53,
+103, 20,164, 56,228,168, 36, 92,134,132, 91,174,114, 65,157,194, 85,134,126,196,225,208,195, 16,193,128,131, 72,162,155, 56,255,
+ 60,134, 44,254, 10,145, 16,228,130, 76,107, 19,200, 88,187,238, 26,232,166,129,170,106, 40, 91, 1, 90,207, 99,244, 20,121,234,
+ 60,166,105,200,211,130,164, 47,224,207,129,158, 87, 81, 69,147, 86,178,206, 99, 28,112,115,125, 9,107, 13, 86, 93,141,195,238,
+ 22,214, 24, 76,142, 69,123, 9,122,226, 61, 63, 23, 28,104, 21, 97,172,102,165, 61,121,113,111, 0,110, 26,178, 37, 49,198,136,
+221,126,135,237,170,133, 38,105,166, 4,102, 19, 5,235,218, 72,144,146, 22, 20,114, 8, 60, 41, 34,173,224,195, 12,159, 9, 9,
+ 52, 20, 11,123, 91,226,180,167, 21, 74, 42,158, 85, 58, 27, 52,188,247,208, 38, 64, 25,199, 57, 15, 74, 97,183,223,231, 21,192,
+221,187,231,104,219,118,249,217, 45, 14,190,197, 25, 72,201,139, 94,196, 83,211,236, 76, 74,147,198,168,136,179, 63,178, 78,105,
+182, 72,242,136,254,197, 53,169, 78, 25,236,105,143,175,230,117, 78, 18,150,243,217, 32,156,251,226, 36,183, 10, 52, 79, 94, 73,
+ 45,246,153,186, 20, 97,149, 11,222,153, 85, 95,116,145, 84,196,134, 46,139, 24,100,223,189,140, 92,165,178, 69,212, 89,156,135,
+ 18, 64, 35,255,107,234, 26, 79,251, 3,180, 6, 58,107, 48,129,208,247, 3, 78,183,107,198, 93,198,136,195, 52,202,200,140, 64,
+202, 32,236,111, 17, 66,192,174,239,209, 8, 55,152,192, 15,201,228, 38,124,241,139, 95,134,115, 35,118,251,107, 84,214,178, 21,
+ 39, 83,238, 12,127,192, 5,205, 23,101,103, 25,228, 20, 78,161, 30, 36, 62, 86, 63, 77, 25,194,177, 94,175, 81,171,231, 32, 73,
+ 81, 26,199, 17,187, 67,143, 90, 27,212,134, 57,198,155,182,193, 56, 57,168, 16,209, 53, 45,250,113, 68,165, 19,138, 20,115,236,
+223,203, 82,232, 22, 23,187,154,211,127,202, 29,208, 11,227,115,181, 16,184, 81, 22, 47,204, 74, 94, 42,160, 65, 89, 81, 46, 29,
+252,156,186, 68,139,162, 65, 21,251,235,244,190,229, 0,146, 44,148,155,181, 38, 73,112,148,127, 45,133, 98,139,116, 38, 58, 18,
+195,169, 34,156,134,230,224,151, 50,230,135,168,184, 65,243,248,128, 71,225,130,156, 85,148,126, 71, 23,177,154,179, 72, 79, 73,
+240, 13, 69,194,195,135,247,112,126,118,138,191,248,203,191,129, 54, 22,253, 97,135, 16, 3,250,126, 15,138, 1,221,230, 84,118,
+171, 17,198,218,172,236, 13, 2,122,201,135,186, 8,217,230,240,133,114, 34, 85, 12,218, 99, 25,200,163,139,226, 69,205, 23, 63,
+ 20,119, 97, 98,181,138, 90, 33,134,200,163, 68,112,183,162,211, 69, 73, 51,172,133,146,136, 43,122,232, 40, 2, 63,197,254,117,
+238,156, 28,118,215,159,195,185, 17, 33,114,142,121, 37, 36, 58,168, 36,238,114,208,109,155,233,108,229, 56,210,212, 13, 42,107,
+ 80, 55, 29,108, 85, 65,155,138,245, 45,211,128,177, 63, 96,119,117,137,235,203, 75,244,253,144, 9, 88,181,104, 88,210,227,230,
+ 67,192, 73, 83,227,206,118, 3, 85,213, 48,117, 13, 40,131,139,155, 91,196, 67, 15,138, 81,132,111,252, 60,156,214, 6,103,173,
+197,147, 62, 48, 15, 28,132, 16, 21,162, 48,215,117,178, 92, 38,231,180,116,233, 68,220, 61, 87, 85,141,186,110,241,205,111,124,
+ 85, 70,229, 49, 39,193, 49,153,152,145,181,208, 71,218,142, 4,202, 74,157, 57,210,197, 62,243, 30,210,222, 61,179, 74,210,186,
+ 67,246,252, 62, 4,220,236, 14,208, 20,152,127, 31, 2,130, 27,224,199, 73, 86, 28, 4, 31, 3,156,231,226, 77, 85, 53,170,170,
+134,138, 1,182,174,208,182, 29,170,205, 6,118,181,134,169,107,152,202, 10,168, 37,105,152,248,219, 54, 2, 40, 10,222, 99,206,
+242, 42, 88, 18,105, 18,185, 16,154, 74, 42, 25, 69, 80, 32, 12,253, 30,183, 55, 53,134,131,193,238,246, 26, 48, 21, 39,236, 57,
+ 70, 33, 83,240,153, 73, 78,198, 0,218,130,160, 48, 77, 19,175, 51,161, 57,213,208, 77,124,161,203, 69,231,166, 9, 83, 93,115,
+142, 79, 8,168,234, 26,186,105,224,157, 80, 16, 65, 8,251, 61,108, 85,243,159,141, 74, 58,115,169,157, 34, 79, 35,242,132, 44,
+219, 27, 69, 99, 34, 55,103,244,178, 62, 77, 52, 63,205,182,187, 64, 17, 62, 56,104,207, 46,144,116, 81,246,253,128,231,151,215,
+ 80,218,224,206,185, 66, 93, 87,115,188,117, 17,124,206, 29,188,206,107,182, 52, 89,206,207, 68,185,221, 46,220, 96,156,192, 41,
+141,175,172,219,160, 34, 34, 56,231, 32, 43,220,101, 66,199,193,103, 52, 83, 40,115,195,149,180, 56,170,104,188, 0, 45, 21,115,
+ 36, 73,105,163,148, 5,139,162, 3, 12, 49, 43, 62,203,165,186,122, 33,204, 99,198, 5,166,192,151,212, 25, 82,150,242,171, 66,
+ 93, 31,231,240, 10,169,126,147, 0,131,226,194,243,196, 41, 80, 33, 48, 33,142, 8,149,181, 88,119, 13,220,228,228,197,212,216,
+239, 15,232,218, 26,164, 52, 14,253,158,119,109, 74,193, 77,204, 65, 30,135,136,186,110, 81, 91,141,235,219, 61,222,126,231, 43,
+232,251, 30, 90, 1,161,170,152,186, 84,215,204,181,214, 10, 70, 25, 25,193, 27, 24, 93,193, 42,141,145,246,136,129,171, 96, 82,
+ 10, 1,242,112, 58, 38, 90,177, 26,148,240,198,186,198,165,116,239, 14,192,245,237, 30, 20,152,115,101,181,134,193, 9,218,166,
+193, 56, 28, 48, 70,133,174, 93,193, 90,139,105, 28,208,214, 53,130,173,242,238,248, 69, 25, 88, 41, 90,123, 73, 2,148, 18, 12,
+ 45,209, 81,183, 79, 47, 10, 52, 11, 97, 91,105, 65,164,210, 82,166,139,209,183, 56, 19,248,128,140,115, 92,107,169,237, 32, 42,
+144,167,177,176,202,169, 35,139, 36, 95, 88,188,159, 45, 46,227,151, 16,240, 21, 21,163, 44, 73, 75, 75,110,139,133, 88,112,129,
+103, 46, 71,244, 10,170,240,253, 83,218,125,190, 56, 44, 40,138, 41, 66, 85, 89,252,225, 31,252, 99,252,245,119,190,139, 16, 60,
+198,225,128, 16, 3, 14,195, 1, 49,122, 52,221, 86,178,184, 45,172, 37, 68, 55,177,136, 76,105,193, 66, 70,225, 40, 8, 99,188,
+228, 51, 39,210,216,188,241,205,255, 79,202,194, 24,153,116, 73,135, 70, 10,172,100,150,221,185, 87,204,103, 8, 1, 8, 80,208,
+ 42,192, 68,133, 32, 29, 74, 12, 17,128, 3,172,112,235, 53, 79,162,148,248,138,199,126,207,170,236,168,161,224,217, 57, 98,106,
+ 88,219,160,106, 86,240,126,224,131,207,104, 68,211,206, 59,102,165, 16,157, 19, 39, 64,224, 75,178, 93,193, 88, 35,163,255, 9,
+126, 26, 49, 30,246, 56,220,222,224,250,234, 10,187,253, 1, 62, 68,241,180,243,206, 53,215,114, 33,226, 27,111,124, 1, 94, 3,
+104, 90,232,186,133,173,107, 80, 36,236,199,137, 85,234, 10, 88, 89,141,222, 19,238,117, 21,222, 58, 95, 67, 41,141,107, 63, 98,
+240,162,140, 87, 92, 72,199,114,151,147,197,136,210, 33, 25, 22, 27,118,221, 26,143, 31, 63, 96,106,162,120,191,181,209, 25, 0,
+ 68, 73,171,146,169,113,146, 52,153,124,199, 18,156,195,161, 58, 60,138,231,195,185, 68, 4,179,167, 58,102,176, 10,101,202,160,
+243, 1, 49,120, 12, 49, 64, 83, 96,204,237, 56,228,238, 51, 68, 86,249, 7, 2,180, 15,248,255,233,122,147,159, 75,211,244,204,
+235,122,134,119, 58,211,247,125, 17,145, 89, 89,153,206,161,178, 50, 43,171,168,178,221,133,113,155,150,105,172,182,144, 89, 55,
+ 98,193,158, 37, 18, 82,175, 88, 52, 11, 47, 80,139, 5, 43,224, 47, 64, 72,172, 88,128,196, 6, 36,212,136, 70,173,166, 69,117,
+ 75, 46, 87,217, 93,131,115,136,200,200, 24,190,225, 12,239,121,135,103, 98,113,223,207,240,158, 72, 91, 46, 85,102,101, 68,228,
+249,206, 57,239,243,220,195,117,253,174, 78,215, 64,144,184, 89,111,176,190,190, 70,183, 89,163,106, 91, 52,171, 14, 85, 93, 23,
+138,121,206,156, 16,228, 89, 31,199, 10,103,215, 39,173, 64, 72,176, 24,193,112, 27,113,193,180,224,139,221, 57,142,171,117,192,
+225, 1,215, 55, 55, 28,134, 70, 98, 52,239, 44,167, 30,114,126,186, 82,208,154, 94,135,225,252,244,224, 3,172,153, 16,188, 77,
+197, 74, 92,201, 26,235, 48, 12, 3,208, 16,109, 83, 25, 3, 93,213,233,123,161,164, 66,219, 54, 25,171, 28,237, 91,206,231,200,
+214,200,242,119, 46,193,107, 2,103,188,123,214, 66,208, 4, 46,127,110,146,181, 19,224, 98,199, 73,250,206, 10, 41, 33,172,132,
+ 82, 26,243,108,112,119,255,128,224, 29, 30, 61,186, 78, 9,156,184, 60, 37, 5,138,125,123, 40,240,233, 72, 1,102,196,117, 89,
+178, 66,188,240,144, 65, 48, 3,164,100,139, 20,103,100,188,139,189, 95, 16, 57,227,159,155,196,151, 66,164, 14,189,140, 91, 23,
+ 66, 48, 38, 54, 44,237, 53, 0, 87, 10, 33,119,227,162,128,213,135,194,118, 37, 22, 81,171,124,168, 75, 81, 36,182,138,148,180,
+ 37,211, 38,161, 52,221, 39, 29, 44,141, 34, 24,206, 31,173, 27,215,215,143,240,242,235,207,161, 84,133,110,215,192,219, 9,227,
+249, 12,227, 61,141,173, 32, 97,188,192, 56,156, 96,172,131,146,138, 61,194, 22, 90, 73,244,167, 30,186,154, 80, 55, 13, 86,109,
+141,227,233,136,251,251, 10,211,184, 66,211,212,104,234, 6,154,173, 57, 58, 10,230,180,166,189, 41,169, 53, 16, 60, 48,143, 19,
+219,150, 40,206,115,154, 13,198,121,194, 56, 77, 56, 15, 3,121, 65,165, 68, 45, 72, 56, 18,227, 20,125, 32,177, 94, 83, 49, 94,
+ 83, 86,148, 30,228, 13, 94,189, 60,208, 3, 1,129,102,213,225,250,189,119,243,243, 37,197, 98,122, 18, 43,113,136,112, 17,145,
+ 23,191, 52,252,129,197,112,158,146, 96,228, 51, 70, 54,143,121,228, 27,156,255,188, 7,162,223, 35,132, 76,157,165, 7,217, 24,
+165,200,251,195, 82,121, 31, 68,142,175,136, 58, 11,218, 35,135, 36, 40,185, 20, 2,148, 92,243, 98, 17, 85,164,250, 33,117,179,
+209,228,225, 23,149,137,184, 76, 54, 78,138,208,212, 94,197,176,148,168,181, 15,133, 77,110,177, 83, 8,233,159, 1, 1,191,254,
+237,231,152,198,129,187, 83,201,120, 80,135, 97,156, 16,188, 71,187,222, 81,166,116, 0,180,210, 64, 5,204,198,164,174, 64, 1,
+ 48, 98, 78, 94,229,148,208,197,202,214,148,186, 39,114, 68,132, 72,182, 2,158, 42, 20,196, 62, 99, 29,145,233,188,135,117, 1,
+150, 12, 57,176, 0,148,170, 41, 89, 78, 48,108, 70, 8,232, 64, 22, 45, 85,224, 75,131,167,142, 73,105,197,194, 49,218, 47, 34,
+ 4,234,226,149, 4,220,132, 0, 75,100, 53, 89,196, 80, 70,209,146,166,105, 22, 42, 77,151,176,214,168,116, 13, 40, 13,199,158,
+225,105, 28,112,220,239,113,120,120,128, 49,244,103, 73, 41, 81, 55, 53,180,214,240, 33,224,186,235,240,221,221,142, 98,105,219,
+ 6,162,105, 89,196, 86, 65, 0, 88,111, 54,144,175, 94, 33,120,139, 86, 73,108,107, 2, 64, 61,221, 15,152,130,196,209,120, 40,
+ 17, 80, 43, 42,102,173,231, 3,174,232,102,232,208,102, 97,157, 84,104,218, 14,117,211,224,179, 79, 62,202,239,114,182, 89,164,
+169,213, 98, 24, 90, 94,232,204,106,144,124,232, 66, 8, 78,210,242, 60,218,207,205,137, 23, 62,233,138, 2, 2, 89,172, 28, 1,
+174,140, 49, 24,206, 3,132,119,169,251,117,198,192,217,152, 54,199, 79,168, 15,192, 56,224,250,241, 91,144,109,139,213,213, 14,
+237,106,133,110,181, 66,211,182, 76, 92, 43, 34, 56,131,224,231,212, 83,167, 41, 37,117,201,206, 39, 56,140, 16, 28, 19,203,175,
+ 47,226, 84,147, 85, 50, 68,155,157,192, 28, 6, 28,246,200, 1, 57,204,170, 15,222,195, 11, 1, 45,169, 67,167,127, 15, 69,190,
+ 10,165, 24,238, 52, 39,245, 54,233, 13, 25, 10, 37, 8, 15, 75,141, 28,137, 35, 87, 74,163,173,107, 24,235,160,149,194,122,181,
+194,237,253,253, 66, 20,235,203,144,158,152,202, 23, 66,148,206,164, 33,177, 47,178, 48, 68,153, 34, 25, 66,202,124,247,176,112,
+ 86, 38,170, 32,138, 84,191,161,167,160, 32, 0,184,185,190, 70,211, 16, 34, 89, 22, 17,201, 72,107,100,159, 86,213, 65, 98,145,
+147, 33, 22,147, 79, 70, 64,251, 98, 13, 90,176, 15,168,213, 46, 20,101,209,175, 31, 87,226, 16,139,236, 12, 41, 68, 10, 96, 18,
+ 8,133, 11,154,243,212,113, 97, 67,138,250, 12,225,121,132, 42, 50,250, 53, 9,174,131, 88, 8, 5,104,172,224, 33,164,128,119,
+108,202,144, 17,253, 26, 43, 15, 44, 1, 55, 92,237,208, 30,190,176,201, 9,242, 81,122, 79,151,225, 52,158,208, 52, 13,156,165,
+ 80, 2,178,213,212,168, 17,224,165, 66, 5, 10,237, 48,179,193,100, 45,177,138, 79, 3, 78,231, 51, 20, 2, 54,109, 13,105,200,
+ 63,124, 60,245,248,205,111,126,131,243,241,128,237,102,131, 85,215,161,237, 58, 52, 85,133,186,109,233,226,213,228,193, 85, 90,
+ 83,150,175, 82,216,172,111,240,112,251,154, 42,109, 14, 54, 24,198, 17,231, 97,196,158,253,183,211, 60, 83, 70,245, 52, 97,144,
+ 18,168, 3, 66, 69, 15,220,253,177, 71, 87, 87, 20, 12, 1,129,182, 33,133,124, 37,129,227,221, 1,208, 26, 74,215,216,221, 92,
+177,216,226,111,223, 65,199,177,108,202,239, 21,161,208, 59, 4,188,121,205, 97, 89, 49,150, 98,248,111,206,133,171, 34, 0, 0,
+ 32, 0, 73, 68, 65, 84,115,179, 5,176, 78,130,198, 74, 4,137,145,124,153,231,206, 57,238,121, 82, 88, 65,172, 94,131,120, 99,
+196,190, 4,233, 32, 39,245, 21,227,114,148, 29,120,137, 81, 44,214, 54, 8, 40,186,251, 76, 91,202,135,241,197,110, 95, 20, 69,
+140,184,132,228,228,162, 52, 86,205, 49,177,208, 26, 7,173,107,124,239,123, 31,163,109, 53,174,190,251, 99,252, 31,255,235,255,
+128,225,116,128,247, 30,231,145,246,132,235,237, 53,164,212,112,142, 84,211,202,147,175,154, 53,150,124,152,100, 68,164,144, 34,
+ 43,163, 11,207,135,247, 92,195,197,140,110,246, 48,231,196, 27,193,124,115,142,115,133,128, 13, 30, 22, 10, 74,144,202,152,254,
+ 61,154, 5, 76, 30,128,133, 66, 40,195,237, 1,165,232, 32, 9, 30,158,243,203, 69,240, 80, 85, 77,220,117,111, 17,180,134,150,
+ 85,202, 19,143, 35,204, 72,174,115, 34,131, 52,164,174,160,171, 6, 90, 41, 26, 27,155, 9,102, 28, 48, 12, 3,250,254,132,121,
+158,233, 25,170, 42,232, 74,163,235, 58,232,138,172,127,195, 52,227, 87,175,239, 80,105,133,182,170,209, 53, 26, 87,155, 14,187,
+237, 22,168, 90, 96,187,194,203,117,135,219,251, 41,199,100,122,192,137, 0,195, 98,189,171,117, 11, 59, 79, 0, 92, 26, 39, 11,
+ 25,191,171, 76,124, 11, 2, 82, 41, 52, 77,139,110,189,197, 31,255,209, 79, 19, 27, 62, 79,189,200,122, 36, 66, 88,136, 61, 23,
+161, 66,197, 84,203,179,208, 41, 94,138, 75,213, 60, 27,225,162,115,136, 31,214,216,137, 75, 69,221,226,108, 45,230,113,228, 75,
+ 55,243,236, 61, 23, 39,160,142, 11,114,158,112,238,143, 88,237,118,232,152,201,174,249,156, 2,251,223, 19,247,155, 99,102, 71,
+ 99,161, 56,229,108,232,123, 90,197, 20,207,170,146,153,152,224, 3,185, 6,136,254,150,191, 99,129,243,200,113, 14,168,155, 22,
+253,249, 12,201, 32,153,168,109,169,155, 54, 1,105,162, 72,216,154, 9,214,204,176,108, 93, 83, 82, 20,107, 63,240,159,239, 48,
+207, 51,130,167,159,161,170, 27, 90, 25,240,187, 92,107,114, 54,152,216,141,179, 56, 52,218, 20,163,141, 51,112,113, 34, 22,145,
+ 88, 57,225, 51, 78, 88,242,196, 80, 36,159,184,115, 22,202, 41,136,208, 16, 71,192,210, 20, 66,105,141, 48, 2,183,119, 15, 16,
+ 66,224,250,122,135,166,174, 89, 56, 41,242,145,197,226,215, 28, 68,201,209,187, 23, 90,166, 56, 33,204,164,205, 80,248,225,243,
+251, 34, 66,132,181,149, 80,173,144, 1, 99,133,157, 60,196, 9,148,112,153,199, 81, 56,129,116, 57, 94, 23, 69, 66, 84, 73,151,
+ 43,197, 35, 16, 23, 68, 51, 68,101,116, 86, 74,135, 34,246, 51,217,167, 82,172,156, 72,251,181,244, 81,248,101,102,123, 0,240,
+225,239,124,128,215, 47,158,227,116, 60,192, 76, 35,156,157, 81,215, 21,166,153, 19,154,172,133,172, 21, 20,128,154, 51,166,107,
+235,112, 60,143,132,174,212, 84,129,125,125,183,135, 20, 2,179, 7,238, 30,246,208, 8,120,245,242, 21,174,182, 27,108, 55, 27,
+108,214, 43,172, 58, 98,178,119, 45,161, 92,235,186, 70, 83,215, 52, 90,146, 18,175,194,139,196, 38,134, 32, 18, 87,127, 62,227,
+112, 60,226, 97,255,128,135,195, 9,195, 72,121,197,214,122, 92,153, 9,179,148, 84, 81,106, 13,239, 3,110,143, 61,180,174,232,
+ 82,119,244,243,207,179,229,104, 83,197, 35,186,178,137, 14,223, 58,146, 94, 36,178,137,204, 92, 14, 23,163,246, 50,202, 54,148,
+128,161,242,243, 14,249,162, 91, 64,107,120, 55, 73,123, 65,145,130, 11, 68,204,236,246, 98, 25,211, 27, 10,223,166,160,192,139,
+ 60,201,201, 35,246, 80, 68, 24,102, 64, 77,193,161,142, 34,192,194, 73, 17, 15,130, 24, 56, 20,202, 17,215, 34,150,151, 10,194,
+144, 68,104,133, 56,141,167, 81,226,141, 84,131, 76,205, 35,238, 66, 96, 79,177,131, 82, 26,175,238, 30, 48,140, 3,118,183, 35,
+174, 30,191,131,243,241, 33,129, 68,134,105,134,115,119,216,108,175, 32,117, 13,231,124, 58,104,103, 99,217,203, 44, 22,170,246,
+176,152, 28, 96,161,224, 15, 40,131,218,232, 0,147, 5, 99,127, 50, 22,150, 15,127, 37, 36, 44,136,119,160,164,128,116, 62, 77,
+ 50, 0,203,194, 88,153, 34, 40,193,150,175,168,128,246, 60, 73,137, 81,153,206, 76,144, 65, 67, 86, 21, 2, 60,105, 2,216,222,
+ 10, 14,140,137,153,217,152, 29,125,215,116, 5, 85,213,201, 63, 79,107,168, 25,147, 49, 24,134, 51, 6, 22, 31,181, 93,139,170,
+170,208,182, 53,186,182, 75,239,209,141,144,208, 85, 3,231, 61,147,194, 60,246,103,131,135,243, 45, 42, 93,161,171, 53,254,224,
+227,247, 48,205, 79,240,226,118,143,231,247,123,156, 70, 7, 72, 96,221,213,120,114,181, 65, 48, 19,142,115,192,110,189,194,195,
+233,140, 70, 87, 8,130,148,204,105, 93,197,108,250,245,118,135,159,254,238,103, 4, 54, 9, 62, 71,135, 46,138, 84, 62, 48,211,
+ 24, 30, 20,194, 82, 22,135,137, 5, 46,210,243, 32,101, 57, 97, 18, 9,116, 68, 90, 90,159,132,142,214, 24,100,185, 58,125,166,
+102,158,147, 69, 43,174, 3, 80,216,170,180,115,152,231, 17,253,254, 30,207,158, 86,164,249,120,252,152,184, 8,124,177,128,247,
+245,214,146, 24,109,178, 22, 58,120, 10, 45, 17, 72,222,102, 15, 15, 56,201, 94,125,145,232,135,145, 45,239, 56, 60, 38,199,207,
+ 2,214, 9,248,161, 71, 8, 68,249, 35,250,158,132,224,180,192, 72, 87, 19, 66,210, 88,219, 26,132,224, 10,118, 58,219,191, 20,
+ 39,138, 5, 73,194, 70,155,173,127,199,227, 17,206, 89,116, 77, 3, 55,121,200,186,198,102,221, 97, 28,199, 4,185,137,233,100,
+139,115, 80,208,212,201, 39,129, 28,137, 35, 29,123,188,203,145, 53,251, 3,146,150, 37,234,171,105,149, 68,113,195,209,113, 1,
+ 0,211, 52,226,246,238, 62, 93,236,117, 93,167, 70,196,123, 87,190,132, 66,151,196,236,126,228,238, 29, 11,118,103, 78,105, 76,
+223,175,216, 44,135,156, 33,144, 81, 99, 64, 33,155, 74,223, 27,201,180, 61, 18,140,250,136,141, 79,171, 8,189, 8, 14, 73, 62,
+ 37,153,186,162, 28,242,130,197,133, 34,176,180,224, 8, 31,255,155, 47,111, 41,222,200, 4,143, 64,134,224, 75, 43,213,114, 47,
+ 31, 15,194,182,174,240,252,233,231, 88, 85, 21,100,165,161, 59,194,110, 70,225,135, 84, 18,222, 80,120, 69,211, 84,144, 51,160,
+ 37,129, 16,134,217,162,107, 60, 32, 60, 14,189,196,195,169,199,105,152,224,188,195,110,189,198,179, 87,247,184,127, 56, 66, 10,
+218,219,175,186, 22,187,245, 26,235,245,138,198, 91, 93,135,174,237,208,212, 21,234,138,254, 83,213, 85,186, 54,231,137, 50,130,
+247,251, 61, 94,191,190,199,126,127,192,121,140, 1, 21, 1,253,236,176,171, 45,198,160, 97,166,153,190,196,135, 19, 49,148,157,
+ 67, 59, 78,228,109,118, 30,231,201,208,235,173,243, 62, 88,248,204, 5, 94,188,209, 98,137,124, 69, 9,119, 97,187,217, 27, 96,
+ 22, 22, 37,134, 5, 56,150, 99,116,249,162,149,165, 58, 62, 78,153,100,254,231, 75,157, 94, 44, 12, 18, 79,176,248,114,115,130,
+ 85, 49, 2,240,101,108,172,231,106,180, 4, 28,151,202,239, 16,114, 4,176, 16, 69,174,181,207,193, 5, 62,171, 69,195,197, 98,
+ 63, 11,248,196, 5,241, 41, 31,210,223,170, 86, 40, 68,128, 79,191,121,141, 87,175,239, 48,141, 3, 62,253,201, 31, 98, 60,159,
+177, 89,183,248,103,255,244, 87,184,122,235, 61, 60,188,124, 74,223,101,231, 49,206, 19,220,195, 29, 86,219, 43,232,154,166, 47,
+100, 1, 11, 32,243, 86, 60,212, 98, 50, 97, 9,222,225,148,175, 68, 61, 95, 60,133, 69, 38, 2,117, 59, 46, 4, 82, 22, 91, 3,
+ 37, 9, 30, 99,133,132,178,110,153,213, 32, 52, 2, 28, 96, 12, 7,126,144,110, 36,196, 40, 81, 0, 66,208,154, 74,105,133, 96,
+153, 32,233,226, 26, 68, 33, 76, 46,165,166, 9, 7, 8,165, 19, 25,178,226,241,185,168, 52, 84,160, 24, 81,231, 44,156, 11,152,
+231, 9,243, 52, 97, 56, 29, 49, 79, 19,234, 74, 67, 87, 84, 32,183,109,131,182,235, 80, 85, 21, 77, 5,120,210, 98,189,135, 84,
+ 2,227, 52,195, 24, 67, 47,193, 57,244,199, 49,229,101,175,186, 21,126,255,241, 35,212,149,134, 19, 18,134,213,221, 93,179,197,
+105, 48,248,171,175,190, 70, 83, 83,145, 49, 25,139, 0,151, 70,240, 74,107,172, 86, 27,188,245,228, 49,118,219, 77, 18, 31, 73,
+166,210,229, 56,232,194, 24, 20, 21,198, 66, 20, 84,110,222,129,202,204,226, 78,221, 62,127,223,168,230,207,107,198, 20,220,197,
+112, 46,227,124, 18, 84, 66,208, 14,152,224, 62,158, 47,188,165, 15, 89,184,140, 60,157,198, 51,142,247,119, 48,243,132,215, 47,
+ 94,226,157,247,222,195,245,163, 27,238,174, 29,172, 33, 27, 89,165, 21,161, 83,233,141,228,221,127,182,197, 57, 88, 46,186,179,
+101, 52, 2,149, 66,145, 22,226, 41, 77,135,126, 62, 94, 5, 82,151, 78,239,105, 85,213, 52,121,144,130, 35,176, 13,224, 45, 41,
+157,120,245,225, 24, 21,171, 84,200,151,188,240,112, 46, 19,214,194,204,254,127, 94,125,198, 28,244,154, 49,196,179, 49, 5, 93,
+ 50, 39,131, 42,173, 0, 23, 25, 3,188,230,243,101,145, 95, 72,110, 24,250,239,131, 76,201,114,209, 17, 97,237, 12, 9, 7, 93,
+213,116,222,121, 7,231,232, 12, 25,199, 9,183,119,247,144, 82,226,250,250,138, 38,173,222,165,190,235,114, 42,154,117, 75, 33,
+ 79, 7, 18, 51, 62, 44, 2,207,232,242, 95, 34, 53,169,254,139,193, 87, 98,145, 96, 42,147,182, 54,139,217,133, 20, 16, 78,240,
+217,146,153,254, 58,177,106,147,118, 47, 7,179, 80, 94,111, 40, 98, 57, 47,253,206,116,224,203, 32,105, 82,200,123, 61,234, 58,
+ 69,225,120,138,221,144, 79, 85,175, 72,249,235,165,208,137,126,221,135,191,243, 59,120,241,205, 51, 84, 74,224,120, 58, 98,213,
+ 86,128,231,232,201,237,154, 14,183,121,130,117,132, 49, 12,158, 94,187,174, 43,104,235,177, 81, 26,234,250, 10,199,211, 9,143,
+175, 28,246,167, 1,214, 57,212,138,196, 60, 77, 93, 65, 84, 29,134,243, 17,131, 25,113,232, 71,188,124,125,143,221,245, 13,194,
+ 52, 96,181,234,208,117, 29,214,235, 53,186,174,193,118,187,197,106,181,130, 86, 84, 21, 78,227,132,211,233,132,195,126,143,251,
+251, 7,156,250, 1,179,243,233, 24,159,189,199,241, 60, 97,123,221,226, 48, 76, 48,206, 39, 69,235,121,228,127,191, 32, 97,143,
+241,128, 80, 45,174,223,126,178, 36,250, 71,171,140,184,200, 74, 23, 5, 82, 53, 77, 56,194,183,201,226,104,189, 1,207,201, 79,
+ 33,127,225, 2,197, 60, 70,217, 88,120, 51,142, 32,175, 72, 68, 86,209,211,248, 56, 69,247, 1, 5,151,125,105, 89, 15, 75, 40,
+140, 88, 24,234,249,207, 88, 10, 2,211,238,150,171,121,113, 17, 57,136,130,129, 85, 6, 24,228,157,126,206,112,247, 34,188, 25,
+178, 16,190,101,213, 80,252,159,132,192,111,190,252, 26,175,239,238,112, 62,247,216,236,174,241,236,203, 95,195, 78, 35,254,229,
+231,191, 66,183,222,192, 59,143,237,227,119,113,120,253,140,186, 47,231, 49,249, 25,238,225, 22,219,221, 13,100,221, 50, 55,187,
+198, 56, 77,105, 26, 21,149,191, 41,134, 62, 20,197, 85,132,255,134, 69,165,146, 63,118,100,124,115, 34,166,121, 79, 0, 13,239,
+ 97,226,136, 87,133,156,168,192, 23, 87, 21, 11, 37, 6,180, 68, 40,136,148, 10, 94, 51,106, 51,198,130, 70,170,162, 20, 9, 86,
+162,117, 5, 85,209, 26, 74, 85, 53, 93,254,146, 68,164,177, 3, 38,240,206, 4, 59,140, 48,227,128,241,244,128,105, 28,128, 16,
+208,198,201, 87,211, 80, 44,107,211, 16,156, 36,198,197, 10,192, 59,186,216,219,149,199, 48, 78, 24,134,145,166,113,132,148,132,
+ 15, 1,119,199, 19, 94,239,143,228,129, 6,229,177, 91,107,113,158, 38,250, 57,165, 68, 93,105, 46, 14,124, 18, 87, 73, 41,209,
+182, 29,154,182,195,143,127,244, 73,186,136,227,104, 60, 68,234, 91,236,214, 11,171,228, 18,246, 80, 48,185,121, 85, 18,117, 68,
+ 82,150, 26,142,192,249,234,113,108,202, 20, 49, 38,189,197,139,221,115,122, 88,132, 12,185, 34, 35, 59,150,118,212,141,113,194,
+156,165,220,241,121, 26, 1, 33,112,120,152,177,191,191,195,251, 31,127,130,171,155, 43,120,231,210,254,220, 89,139, 74, 9, 12,
+227, 12, 59, 77,252,239,240,208, 82,164,194,193,186, 12,145, 73, 66,186, 4,238, 9, 28, 88,194, 13,152,115,240, 32,167,145, 82,
+154,186, 96, 33,153, 69,239, 33, 36, 97,138,157, 53, 8,158,198,193,154,209,184,224,206, 51, 22,231, 49, 43, 60, 78, 24, 84,136,
+ 1, 86, 1,199,158, 34,127,107,165, 97,157,199,170,166, 53,168, 20,180, 92, 65, 40,194,170, 10, 33,108, 96,235, 49, 92,200,231,
+ 83,202,126,160, 53,178,231, 85,112, 44,235,149,170,120,178, 96,224, 45,160, 80,113, 20,171, 76,233,122, 14,196,228, 31,199, 9,
+119,247,123, 72,169,176,101,123, 52,245, 91, 50,135, 48, 69, 78,134,207,114, 40,148,201,166, 1,188,178, 9,217,141, 19,179,209,
+188,191,212, 60,167, 70,200,243,152,159,126, 63,171,228, 99,105,192, 43,242,236, 40, 75,172, 36,168,127,239,223,255,211, 63, 79,
+237,129,100,225,136,200,157, 95, 26, 57,201, 56,138,141, 85, 66, 22,193, 21,243,131,111, 77,172, 17,225,130,123,186,128, 79, 20,
+249,233,252,151,199,227,128,159,253,236,103,120,247,131,239,225,254,225, 30,179,177,100, 29,226,137,193, 56, 78,240, 34, 71, 44,
+ 66, 80, 55, 97,172,163,138, 93, 41,136,224, 16,156,193, 91,239,188,143,119,223,121, 27,247,251, 61,132,119,104,180, 34,120,199,
+ 60,113, 26, 16,125, 49, 86,219,107,124,244,217,143,241,244,233, 51, 88,235,240,233,223,249, 67,252,229,207,255, 18,170,219,224,
+245, 55,207, 48,156, 7,140,227,132,211,241,132,251,135, 7,220,221,223,225,225,126,143,211,121,192,236, 28,108, 2, 1,137, 36,
+140,128,247, 88,173,215,216,247, 3,172, 15, 24,141,197, 56, 27,156,199, 25,167,113, 66, 63, 91, 88,169, 81,119,107,188,251,209,
+251, 5,241, 44,103,239, 38,190,123, 89,193, 7,177,136, 62,141,227,236, 52,184,241, 33, 89,209,114, 9,149, 19,221, 66, 54,252,
+ 20,157,120,120,179,163, 21, 50,125,140,209, 42, 68, 85,239,155,144,249, 80,114,226,133, 76, 25,191,254, 34,102, 58,158,230,105,
+175,142,176, 72, 91, 43,247,252,113,143, 30,173, 97, 73,179,159,190, 71, 57, 53, 75, 20,123,252,197,106, 32,105,157,194, 2,107,
+187,220, 83, 72, 60,127,121,135, 23, 47, 95,226,116, 58,192, 26,131,243,233,136,135,187,215,232,251, 3, 89,214,108,236, 72, 13,
+170,166,131,153,198,244,158, 89, 23,224,236,140, 77, 91, 1,170,130,210, 26,214, 89, 88,107, 96,166,129,194, 41,202,213,135, 88,
+ 70,226,138, 98,255, 33, 82, 83, 18,210,251,175,148,132,210, 21,174, 55,107,254,126,211,190, 80,240, 24, 85,132, 98,108,155, 18,
+225,150, 72,221,192,176,142, 44,122,114, 9, 87, 60,243,127,198,105,196,241,120,192,241,212, 99,224,206, 89,134, 60,227, 33,232,
+ 14,129,103,116,221, 65,215, 45,156, 35,225,211, 52, 27,156,207, 39, 28, 30, 30,240,240,112, 15,107, 45,234,182, 69,187, 90,161,
+169, 27,202, 98,111, 26, 84,138,130, 84,234,186,130,210,244, 94,169,186,134, 82,116,176,234,138,244, 44, 4, 99,177,152,102,147,
+216,232, 62,120,204,102,198, 56, 17,204,132, 99, 40, 80,119, 45,170,186, 78,185,225, 30, 72,123,244,245,102,135,191,255,247,254,
+ 32, 45,246, 68,220,135,103,129,124, 33,156,204,121,224,169,158, 78,191,168, 64, 31,243,231, 19,189,208,161, 76, 76, 20,185,139,
+ 47, 25,240,117, 85,227,112,236,113, 60,208,168,217,152,153, 58,106,195,113,178,133, 40, 44, 17,224, 4, 21, 13,164, 48,103,251,
+ 26, 71, 1,247,167, 19,250,253, 61, 32, 8,125, 59,142,103,120,231,112,127,119,143,121, 26, 96,172,193, 56,141,112,102,134, 53,
+ 36,112,163, 2,196, 39,232, 82,188, 80, 67, 18,158,249, 20, 66, 82,166, 42,198,247, 65, 10,250, 30, 70, 79,188,140, 74,114, 75,
+ 54, 55, 33,136, 37, 32, 68,164,248,201, 5, 2,246,242, 59,153,182,198, 76,104,140,223, 81,203, 74,247, 74,211,100,211,199, 4,
+182, 52, 29, 41,244, 52, 97,249, 44,199, 95,147,244, 52, 34,159,155, 82,209,132, 65, 74, 69,116, 80, 79,107, 50, 37, 40,109, 80,
+ 73,133, 74,179,205, 58,126,222, 74,193, 57,143,105,154,200, 2,221,212,105, 31,158,250,157,130,175, 33,210, 68,174, 32,122, 22,
+ 13,108,178, 89, 70, 13,145, 40, 18,215, 68,158, 94,251,200,143, 23,249,190,204, 14,101, 81, 36,183,133,197,251, 24, 66,128, 46,
+233, 32,162, 80, 16, 7,254, 2,251,180, 11,151, 69,186, 76,174,148,144,126,117,225,203,227,206, 34, 17,149,226, 89, 22, 71,239,
+ 49,187, 61, 18,174,138, 11,104,183,189, 70,176, 22,181,174,240,179,255,239,103,168, 20,237, 56,165,160,224,128,237,134,198,226,
+222, 7, 76,209,223, 57, 58,218,241, 4, 64, 86, 21,170,186, 1,160,208,180, 45,166,243, 30,206, 88,252,232,195,247,113,245,232,
+ 9,116,211,224,183,191,253, 45, 94,126,253, 44,189,241, 77,221, 64, 4,129, 47,126,253,107, 40, 17,240,103,255,240, 63,193,255,
+246, 63,255, 79, 8, 66,225,237,247, 62,194,207,254,249,223,224,233,139, 59,108,155, 26,117,173,249, 32,163,156, 98,231,163,112,
+ 99,185, 67,117, 1, 48, 62,160,118, 14,117, 93,193,204, 22,115, 16,112,193,162, 10, 2, 77, 83,161,150, 53,174,175,111,240,193,
+247, 62,202,106,237, 80, 40, 29, 11,186, 80, 22, 44, 20, 21, 81, 40, 35,250, 8,233,138,240,109, 36,183,176, 88,111, 36,208,139,
+136, 34, 12, 42, 29,147, 95, 82,138,252,224, 70,190,181, 4, 91, 40, 2, 84, 16,139,184,192, 50, 83,133,196,145,158, 67, 38,178,
+243,129,254, 63,231, 11,196,105,132,143, 25, 2, 5,244, 39,132,162, 27, 47, 38, 12,209, 40,145,166, 8,233, 23, 47, 3,104,162,
+ 60, 47,105, 86, 5, 22,186,127, 92,152, 8, 78,231, 1,207,191,121,137,190, 63,230, 0, 10,142, 87,116,204, 75, 15,240,124, 30,
+210, 95,235,102,133,233,124, 76,132,152,105,158,113,251,240,128,171,237, 21,100,187, 33,145, 18, 87,255,214,249,236,247, 15,101,
+ 49, 38,222,224,251, 39, 33,163,200, 85, 63, 81, 10,105, 68,109,173, 69,168, 43,234, 40, 66,160,174, 43,249,180,233, 64, 83, 62,
+ 64,123,162,206, 57,173, 97,173,165, 66, 55,106, 48,162,208,134, 85,217,228,141,182,232,207,103,188,186,189,199,235,135, 3,222,
+186,190,194,239,254,224,251,104,155, 26,117,224,238,223,121, 72, 45,160,116,141,170,110,137,248, 5,192,250, 64, 49,152,156,155,
+ 62,143, 35,234,186,129,174, 73,159, 82, 87, 21, 5,192, 40,137, 74, 83, 22,187,212,228,135,183,206, 65,121, 64, 74,226,122, 43,
+ 22,170,106, 65,104,220, 97, 28, 49, 78, 6,179, 49,176,134, 50,181,103, 99,211,142,255,234,122,135,170,110,208, 15, 35, 78,227,
+ 76,231,142, 82,208,138,236,107,127,231,119,127, 72,118, 59, 44, 29, 58, 2,223,234, 12, 93,102, 15, 4,177, 96, 26,196, 36,201,
+224,105,253,151,226,165, 19,129, 50,206,101, 56,234, 86,209,164, 51, 10,233, 62,254,248, 67,124,253,236, 27,166,198, 21,117,105,
+ 49,238, 18, 23,196,196,168,204,166,236,112, 66,181,106,237,160,181,198,233,116,194,139,167, 95, 98,189,187,130,119, 6,206,209,
+212, 82, 11,138,234,157,149,128, 9,100, 29,181,222,241,132, 34,164,231, 70,192, 39,225,154, 76,200,216,184, 16,226,124,142,152,
+ 60,167, 36,132,172,232,181,243,168,222, 5,192,219,153,118,204,222, 67,104,149,126,118, 41, 99,174, 60,232, 98,142,109,108, 92,
+ 61, 48,243, 35, 90, 48,117, 16, 24,166,153,237,143, 22,222, 85,204,124,144,217, 97,197, 66,190,146,101,225,217,151, 15, 14,201,
+122, 3,192, 21, 68, 42,140,170,170, 6, 64,118,103,192,211,186, 54, 18, 5,157,131,172, 8,169, 91,105, 1, 25, 40, 84, 38, 71,
+253, 58,188,186,189,131, 82, 18,219,237,122,113,246,138,148,193, 33,151,126,243,146, 29, 18, 39, 65, 9,195,206,107,196, 98,253,
+115, 41, 34, 14,220, 24,166,153, 4, 3,107,226, 68,167, 76,111,163,144, 39,250,159,245,155, 33, 30,209, 63,151, 53, 68, 36,221,
+ 71,142, 28,196, 69, 39, 84,236, 99,147, 80, 9,161, 64,115,139,162,194,112,124,160,184, 52, 54, 77, 99,250, 0, 74, 5, 26,123,
+172, 26,129,177,174,112,236,123,120, 71,157, 64, 83, 41,244,195,128,205,170, 67,219,212,232,135, 25,243, 68,106,203,117, 87, 99,
+187,219,209,248,167,210,168,149,194, 56,156, 1,231,208, 40, 9, 81, 43,216,241,136,105, 56,225,147,239,125,132,235,221, 6, 63,
+255,197, 47,177,170, 52,249, 77,101,128, 51, 61,254,243,127,252, 95,225,191,251, 39,255, 24,206, 11, 52,149,194, 47,126,246, 47,
+ 48,187,128,113, 38,101,228, 97,127, 74, 35,187,212,157, 10,153, 74,127, 1,145,246,167,212, 93, 0, 58,120, 76,117, 75,151,145,
+ 82,184,186,186,193,238,230, 49, 62,253,254,135, 20,192,144,152,191,133,133,193, 23, 19, 89, 81,174,212,233,178,186,148,197, 19,
+ 83, 88,166,200, 64,132,197,148,234,194,151,125,113,237,251,204,120,143,136,213, 32,233,146,247,146,126, 18, 25, 51,147, 67,182,
+204, 93,218,203, 19, 40, 65, 32,249,195,125, 18,194,101,254,121, 8, 75, 0, 76, 82,164,135, 98,156, 31, 66,129, 59, 14,139,208,
+131,242,175, 3,190,165,241, 78,253,111,121, 28,243,248,171,176, 47, 65, 8,152,201,226,183,159, 63,195,241,184,231, 8, 71,155,
+246,148,161,240, 23,151,246,154,224, 29,204, 60, 97, 24, 39,172,186, 22, 50, 4,184, 64, 17,161,199,254,136,173,212, 16, 74,163,
+169, 27,244,170, 2,236,132, 16,149,192,139,215, 20,138,149, 90, 88,124, 62, 33, 82,209, 82,156, 39, 69, 13, 95,239, 86,172,176,
+ 87, 8,146, 19,255, 60, 57, 79,172,247,240,198,195, 9,139, 41,128, 92, 35,156,135, 45,132, 45, 36,175,220,157, 57,143, 97,154,
+208,159, 7,244,227, 8,165, 20, 54, 93,139,235,117,135,143, 62,252, 16, 79, 30, 63, 70,219,180, 16, 74,166, 47,148,170, 42,202,
+ 33,215, 21, 76, 8, 8,170,130,199, 8,203,225, 26,243, 60, 83, 81, 45, 37,170,186, 74, 78, 18,169,152,211, 30,255, 35,104,127,
+ 89,129, 66,158,132, 18, 16, 66, 67, 34, 64, 5, 5,209,214, 80, 74,160,109, 42,204,134, 82,239,134, 97,132,210, 10, 45,103,159,
+ 11, 77, 0, 22,154, 18,156,105, 55, 13, 65,201, 94, 60, 89,249,197, 95,255, 6,159,126,252, 17,158, 60,185, 38, 1, 96,202, 29,
+ 40,204,181,172,136, 22, 33, 92,160, 63, 67,161, 88,142,110,144, 2,121,237,243,163,228,185,112, 77, 26, 36, 33,146,154, 93,200,
+ 44,170,251,236, 71,159,226, 47,255,226, 23,112,145,163, 32, 36,132, 96, 13,128, 44,124,208, 40, 80,165,158,244, 10, 49,238, 69,
+112,218, 90, 8, 1,135,253, 29, 32, 36,166,105,132,157,206,212,252,212, 29,180, 8,232,234, 10,118,162,189,235,236, 57, 61, 82,
+ 21, 25,220,188,238,146,188,167,214, 12,218,138, 73,110,158,153,248, 66, 40, 8,169, 19, 75, 65, 74, 65, 62,113, 30,185, 67,248,
+ 36,188,163, 49,123, 44,230, 37,154, 90, 2,134, 18,102,125,145,129,128,216, 13,243, 62,207, 2, 16, 9, 4, 36,184,152,246,168,
+107,205, 83, 34,230, 75,112,132,172,224,181,135,140,252, 4, 70, 35,251, 40,154,229, 39,140,108,107, 21, 93,232, 66,192, 90, 3,
+239,109, 18,155,121, 47, 18,116,199,123, 7, 21, 28, 42, 89,161, 82, 10,198, 1,198, 59, 10, 20,210, 26,195,121,192,235,219,123,
+212,117,133,150,207,109,186,107,201,127, 30, 16, 33,101, 33,225,129, 33, 98, 78, 7, 23,243,145, 17, 80, 76,190, 67, 2,232,196,
+200, 90,151,210,230,150,194,225,229,122, 60, 20,224,157,156,155,193, 62,245, 75, 24, 89, 68, 14,199,197,188, 8,114, 25, 2, 82,
+200,174, 66, 58, 95, 89,205, 39, 99,117, 20,210, 7, 43, 99, 40, 72,145,163,157, 16,180, 49,180, 66, 0, 33, 72,188,124,245, 10,
+127,245,203, 95, 96,215, 86, 8, 1, 88, 85, 10,119,227,128,182,169, 96, 45, 85,243,149, 82, 56,158, 71,140,195, 64, 57,201, 80,
+176,178,193,233, 76, 81,145, 56,247,144,109,155, 32, 51,231,113,196,186,107, 8,108, 97, 29,220,124,198,223,124,254, 5,164, 82,
+152,230, 25,168, 52,124,240,216,236,174,241,223,254,147,255, 18, 87, 55,143,113,184,189, 67, 37,105,127, 55, 91,143,154,243,155,
+109, 20,115,161, 24,213, 21, 98, 50, 89,118,146, 74, 49,191, 56, 32, 40, 44,160,253, 85,221,160,226,140,236, 40, 72, 75, 22,137,
+ 4,160,201, 93, 69, 10, 80, 16,209,249, 24, 22, 32, 21,196, 14, 25, 69,130,207,133,175, 45, 1, 98,144,129, 40,165, 50, 94, 22,
+ 72, 26,233, 3,188, 20, 68, 23,149, 5, 17, 46,209,217,196, 27,177,168, 84,151,248,148,190, 86, 18,100,163, 72, 38,189,178, 32,
+ 22,200,227,232,183, 85, 82, 36, 63,119,132,199, 4, 92,138, 2, 11,174, 68, 34, 59,133,165,181, 45, 46, 25, 34, 55, 33,254,212,
+ 50, 43,225,157,243,248,205,231,207,240,112,255, 26,243, 52, 21,169, 82, 46, 33, 51,243,101,158, 39, 7,214,242,126, 19, 1,231,
+ 97,196,122,213,194, 27,178,240, 56, 15,156, 78, 71,172, 86, 43, 40, 37, 81, 55,100,187,138,155,139,203,242,106,225,109, 45,109,
+ 35,241,242, 69,206, 78, 62,143, 52, 74,165, 36, 42,254,252, 35, 66,150, 97, 46,129,203,101, 41, 5, 38,222,235,139, 34,217,205,
+123,143,217, 24,178,129, 58,135,182,105,176,217,172,113,117,181, 35, 85,183, 49,184,222,172,241,248,209, 35,108,182, 59, 38,150,
+121, 38,209, 41, 72,201,220,251, 16,224,133,130,115, 51,191, 31, 51,230,113,164, 61,110,160, 68,186,184,151,149, 81,240, 88,164,
+214,197,241,173, 16, 20,162, 36, 60,127, 27, 36, 77,219,148, 20,208, 74,194, 40,137,170, 34,223,117, 83,215,232,186, 22, 54,208,
+ 30,154, 10,137,153, 45,165, 54,243,210,189,135,214, 32, 26,160,243,248,249, 47, 70, 60,122,252, 54, 62,124,255, 59,120,124,115,
+197,176, 16,145,223,155,203, 49,232, 66,128, 41,146,112, 52,230, 17, 8,173, 82,223, 46, 32, 23,128,151,248, 13,116,222, 49, 4,
+ 8,208, 66,147, 87, 28, 1, 79, 30,223,224,157,119,223,197,231,191, 29, 1,113,102, 31,189, 44, 38,252, 52,185,146, 82,112,108,
+171,132,115, 22, 2,142, 62, 3, 73, 5, 94, 85,105, 84, 90,225,116, 26,112,247,250, 27,172, 54,215,112, 30, 48,102, 66,203,126,
+250, 90, 75,172,219, 6,194, 59, 32, 16,145, 48,234, 45,226,231, 17, 53, 1,193,123,104,173,114, 35,192,238, 9, 1, 73, 23,122,
+ 18,164, 9,246,116,211, 68, 11,130,197,209,130,115,198,161,147, 80, 90, 41,250,179,107, 77,206,105, 7, 15, 23, 56,212, 43,230,
+ 25,240,179,233,227,232,194, 58, 46, 26, 60,163,104, 93, 10,161,137,119,155,103, 7, 78, 4, 59, 5,159,233,114, 57,186,153,156,
+ 15, 74,215,168, 52,101,195,219,121, 74,176, 34, 31, 36,113, 38,100,200, 49,178,206,161,210,158,117, 1,146, 39, 3, 30,179, 7,
+ 85, 37, 90,224,120,234,241,226,213, 29,222,127,239, 59,252,249,208,207,239, 69,153,173,158, 11,116, 25,136,193, 18,100,110, 78,
+ 60, 60,130, 37,186, 29,253,187, 93,202, 54,136,151, 57,202,224,170, 16, 46, 89,161, 75, 66,231,197, 5,174,203, 52,175,210, 46,
+ 36, 69,190,172,163,191, 86,198,132, 31,246,127, 94,170,219, 75,194, 87, 26, 51,200, 44, 12, 10, 2,204, 91,166,189, 80,224,224,
+149,217, 81,100,164,112, 22, 47, 94,124,131, 77, 87, 83,114,145, 53,112,222,163,107,106,188,125,181,198, 56,141,168,234, 6, 46,
+ 0,211, 52,193,122,160,173, 4, 28, 52, 94,191,122,137,102,181,195,174, 3,234,138,174,138,166,174,224,204,156,118,250,167, 83,
+143,237,122,141,215,175, 94,225,223,253,183,127, 15,109, 93, 99,154, 72,225,248,229,211,103,216,223,221,162,106, 90,252,167,255,
+217, 63,194,127,253, 95,252, 35,212,237, 99,204,134,210,221, 42, 33, 80,213, 26,222, 4, 88,227,225, 24,166,179,220,127, 21, 41,
+ 82, 90, 65, 85, 42,133, 52,132, 88,228, 4, 79, 42,225,164, 90, 14, 57,237, 9,172,122,228, 74, 46,192, 67, 48,151,124, 17,138,
+ 34,120,148,141,165,125, 16,184,136, 13,140,190, 74,136,165,127, 18, 98,193,181, 73,254,199,216,168,196,124,104, 31, 56, 53,138,
+ 19,129,184, 32, 72, 8,216,111,117,135, 81,113,225,249,160, 18,113,100, 86,236,185, 99,104, 76,230, 42, 23,116,171, 32,150,227,
+ 80, 17,190,117,152,148, 71, 92, 81,120,242, 6, 41,159, 15,238,242,114,151,169, 16,179, 54,224,171,167,207,113,127,247, 10,195,
+112, 78, 35, 56,239, 56, 20,194,187, 69,135,142,130,141,109,205, 12, 51, 79,176,206, 66, 74,133,205,122,135,190, 63,192, 49,176,
+199,121,143,253,254, 1,109,183, 70,215,117,232,143,251, 55,127,150,130,161,159, 39, 22, 60, 95, 8,197,235,142, 81,164, 66, 96,
+156,105, 12,237,156, 47,118,194,108, 23,138, 91,154,120,240, 6,208,212,129,247,165,198, 90, 76,204, 21,175,235, 10,187,171, 45,
+ 86,221, 26,117, 83, 69,120, 40,156,161,209,182,148,180,247,214,117, 77, 42,113,103, 33,188,135, 20,116,169,243, 50,130,200, 94,
+206,194, 90,199, 59,226, 9,134,167, 29, 80, 26, 42,228,206, 50, 85,132,206, 37,213,120,224, 11, 77,202,204, 58,136,239,189, 86,
+ 10,161, 98,246,121,226,141,179, 71,192, 5,120, 67,226,177,211,241,136,113, 24, 83,242, 27,189, 85, 21,197,127, 74,162, 53, 10,
+ 1,188,124,241, 12,231,243, 25,111,191,245, 24, 31,127,248, 93,182,214,133,108,209,205,108,215, 12,253, 72, 43, 42,145, 58, 34,
+ 37, 99,176, 75,126,158, 67, 88,234, 57, 98,224, 8, 0, 82,105,243, 52, 69, 73, 26, 35,255,224,211,143, 48,140, 35,190,252,124,
+134,152, 45,132,244, 60,201,146,156, 69, 17, 67,166, 36,124,112, 8,142,243, 0, 4, 21, 58, 78, 25,210, 85, 0,168, 42,141,115,
+223, 19,120, 75, 85, 16, 1, 56,159,137,237, 33,225, 81,105,137,174,173, 41,103,126,206,249, 1,177, 67, 39,188, 54, 23, 88, 44,
+114,163,239, 23,237,160,165, 18,116, 1,178,234, 59, 4, 79, 1, 45,156, 3, 47, 11, 97, 88,158,184, 33, 57,168, 40, 97, 80,194,
+179,248, 85,120, 70, 62, 7,192, 7, 87,184, 8, 36, 36, 60,172, 7, 20,200,130, 9, 3,158, 52,201,100,133, 14,156,125,144,194,
+204,128, 34,111, 33, 67,120,164,164, 53,145,214, 21,173,169,236, 76,225, 92, 34,135, 57,121, 30, 91, 91, 71,123,252,138, 51, 76,
+130,247, 80,193, 1,138,147, 22, 13, 61, 67,244, 61, 4,246,251, 61,214,171, 22, 79, 30,223,112,148, 56,159,177,126, 97, 78, 79,
+218,132, 0, 66,239,250,224, 19, 3,159,126, 22,159,166,129,233, 18, 47, 96, 57,233,127, 95, 64,116, 80,230, 94, 23, 43,200,156,
+147,170,203,147, 82,198, 11,230, 98,187, 14, 78,138, 41,125,234, 73, 72, 39,138,142, 47,142, 10,185,107,114, 33,164,131, 21,145,
+ 64, 38, 0, 23, 36,164, 4,140,245, 24,141, 32, 14,114,176,176,193,161, 82, 26,187, 71,143,240,205,243,175, 49,155, 57,141, 99,
+ 70, 99,225,132,196,237,253,129,148,156,222,162,174, 27, 12, 99,143,227,249,132,205,246, 26,222, 76,112,168,113, 26, 12,246,253,
+132,235,109, 7, 55, 77,104,155,138,243,217, 9,214,113,253,248, 9, 62,253,228, 19, 74, 22,242, 20,128,240,211,223,251, 9,250,
+190,199,195,233,140,255,241,191,255,111,240,147, 63,252, 35,252,252,151,191,128,132, 64, 45, 4,110, 30, 63,193,185,223, 35, 76,
+ 1,109,173, 48,204, 14, 22,129,130, 9,216,198, 17, 7, 32,148, 51, 77, 22,184, 97,154,168,171,143,149, 21,143,210,250,211, 1,
+207,190,185,199,187,223,185,225,129,200,146,196,150,157, 1,133,152, 10, 23,161, 2,151, 98,140,210,174,118,193,115, 79,251,120,
+ 17, 46,246,224,220,243,133,192,107, 4, 14,184, 72, 22, 57,145,122,198,180,199, 42, 66,245,130, 8,184,248,158,165, 81, 55,124,
+254, 94,128, 85,248,225, 2, 87, 27,109, 94,161,240,222, 47, 73, 56,165, 13,236,226, 66,140,197,136, 36, 69,127, 20,160, 68,191,
+112, 12, 11,114,214,227, 52,206,152, 39, 67, 22, 33, 51, 99, 24,206,248,250,155,231,232,207, 61,137, 45,121, 42,226, 57, 49, 43,
+ 93,232, 40, 47,117,130, 86, 88, 67,197,166,128,192,122,181,134,117, 22,149,174, 0,231, 82,246,178,117, 22,231,126,143,110,189,
+ 35,160,133,115,139, 7, 62,177,247,223,240, 30, 44,209,189, 66,100, 70,181,245, 30,227, 52, 81,196,166,243, 16,113,172,237, 51,
+ 18, 83,200,156,209,238, 3,237, 61,173, 15, 8, 74, 99,187,222,160,107, 91,180, 13, 97, 57,171,170,166, 93, 41,143,137,173, 0,
+204, 52, 99,127,234,113, 58,158,208,174, 55,168,153,170,168,170, 26,186,109,201,222, 38, 20, 21, 13,134,176,176,243, 52, 98, 26,
+ 39, 12,231, 51,250,243,128,113,154, 81, 53, 13, 42,165,224,107,205,158,123,206, 83,176, 22, 80,148,194, 38, 32,224,224,161,130,
+ 98, 33, 22, 49, 39,156,162,160, 22,197,228, 44, 37,178,195,152, 18,207, 12,166, 97,192,233,112,196,249,124,102,154,156, 72,123,
+118,201,148, 48,103,103, 40, 93,193, 90,194,151, 78,227, 25,175,111, 5,102,227,240,163, 31,124, 0,165, 37,196,223,178,190, 73,
+222, 12,254,220, 61, 19,201,178,131, 36,176,141, 45, 36,241, 83, 96, 54,185, 15,217, 81, 64,211,155, 56,158, 22, 73, 26,250,251,
+191,251, 67, 28, 15, 39, 58,224, 79, 7,192,228,203, 85,198,164,200, 20,219, 27,120,205,226, 88, 31, 33,161,148,164,160, 30,126,
+205, 67,127,130,110, 58,194,161, 6, 98,106, 72,149, 27,168, 74, 43, 56,175, 96, 12, 51, 31,124, 88,172,185,226,101,162,164, 76,
+185,238,144,154, 40,117,206, 37, 37,182,139,160,163, 88,176, 73, 89,240, 50,232,125,210, 17,193,203, 69, 8, 2, 21, 11, 33,228,
+162,151, 46,101,153,210, 13, 3,235, 21, 16,120,157, 20, 64,162, 71, 41,104,207, 46,242, 42,202,133,176, 16,206,130,187,114, 26,
+163,211,104, 62, 93,232,220, 28, 70, 74,155, 44,236,211, 81,131,226,147,198, 65,194, 57, 15,131, 25, 90, 9, 84, 85,197,218, 9,
+129,195,192,161, 59,150,158,205, 23, 47, 95,227,122,183,133,210,138,133,174, 49, 84, 37, 25, 26, 17,124,128, 9, 84, 76,164, 78,
+188,108, 20, 82, 54, 68,153, 72,137,194,129,224,243,206,156,215, 19,101,200, 16, 7, 7, 46, 92,206, 52, 25, 42, 5, 85, 81, 89,
+189, 64,216,196, 52,153,188, 51,201,200,196, 11, 32, 77, 42, 10,144,246, 69, 40,186, 40, 74,158, 17,144,193,193,134, 6,214,142,
+ 80,193, 64, 6,250,226,159,199, 51,156,179,120,249,106, 79,177,124, 10, 80, 74, 99, 98, 21,236,105,166,157, 71,211,172,209,247,
+ 22,118,154,176, 89,239,112, 60,191, 36, 15,248, 76,150,145,225,220,227,250,209, 91,216, 31, 79,112,206,226, 48, 58,116,181,130,
+ 12, 1,183,183,175,241, 15,255,163,255, 24,187,237,142,173, 53,244,122,173, 49,116, 64,205, 51, 62,249,240,125,244,125,143,247,
+222,190,198,231, 95, 60,197, 55,207,190, 6,236, 4, 99,201, 26,162,149, 66,183,107,112, 26,103,234,126, 66,156,110, 72, 40, 45,
+161, 43, 13, 33, 36,198,113,132,115, 30,171,171, 43,140,195,148,166, 32,206, 58,152,105,194,221,221, 61,158, 60,218,209,222, 9,
+ 89, 4, 38,138,185,117,194,175,198,207,160,200, 87, 11, 37,214, 55, 45,249,253, 69,202, 91, 88, 32, 84, 47,199, 56,249,129, 18,
+ 81, 31,156, 10,135, 16,242,133,227, 19,183, 61,175, 1,104, 47, 39, 22, 17,147, 9,190, 81, 10, 33, 11,214,116, 88,208, 20, 74,
+192, 81, 72,123, 54,113, 9, 45, 22,101,161,195, 63,167,140, 32,144, 34, 25,137, 15,208,105, 52, 41, 95,217,199,189, 31, 31, 72,
+227, 60,195, 59,143,135,227,137,166, 61,102, 78,135, 77,224,128,138, 88, 69,167, 86,128, 59,132,192,149,182,179,134,200, 77, 90,
+ 99,181, 90,195, 57, 3, 0,168,171,154, 64, 44,236, 69, 54,214, 66, 12, 61, 54,155, 43,156, 14,247,139,105, 67, 94,101, 45, 97,
+ 39, 33,100,111,115,114, 59, 72,153, 10,170,211,121,196,245,149, 77, 36, 49, 41, 40,168, 37,101, 47,120, 14, 94,145,180,246,146,
+ 2,104, 35,107, 65,107, 84,149,134, 82, 26, 90, 41, 40, 30,115, 7, 73,207, 70, 64,128,174,107,220,190,126,141, 47,191,254, 26,
+155,171, 43,168,245,138,186,246,110, 5, 85,183, 41, 81,209, 57, 11,103, 38,216,121,130,153, 39,140,227,128,190,239,113, 56, 28,
+233,208, 5, 96,218, 6,181,243, 8,186, 66,144,146,215, 4,158,198,149,222, 48, 63, 95,193, 5,151,186, 12,239,124, 98,240, 71,
+ 7, 73, 96,209, 31,141,249, 7, 12,231, 17,167, 83,143,227,169,135,241,153,127,157,194, 46, 60, 81, 2,154,166,131, 20, 36,146,
+146,156,156, 54,207, 19, 14,135, 61, 94,188,188,195,123,223,125, 43, 27,114, 46, 82,182,178, 91, 36,227, 76,105,212,158,117, 70,
+ 8,129,125,224, 5, 72,201,243,122,140, 21,224,137,181,144,210,212,232, 3,182,222,225,239,254,225,239,227,255,253,151,255, 26,
+ 66, 72,156,142, 15,240, 12,198,223,152, 0, 0, 32, 0, 73, 68, 65, 84,214,242,168, 89, 20,157, 90, 46, 55, 18,247,220, 57, 40,
+ 99, 33, 85, 38, 22, 26, 99, 48,206, 6, 90, 87,168,148,128,153, 29,154,154, 66, 86, 92, 76,121, 91,232,151, 88,113, 30, 66,177,
+202,138,130, 83, 65,115,200, 66,189, 78,163,112,131,192,177,174,113, 26, 68,216, 82,153, 46, 93, 81,100,222, 75, 33, 40,223,156,
+117, 6,170, 16, 44, 6, 0,149, 2, 12,159, 51, 46,248,130, 30,137, 98,236, 44,179,142,128, 53, 91,190,176,220,162,136, 50,245,
+158,138, 58,173,235, 20, 25,108,236,156,109, 99, 81,180, 93,224,151, 51, 95, 94,240, 68,203, 0, 65, 98,158,185, 57,211, 20, 63,
+108, 93,192,105,178,105, 50, 96,173,192, 87,207,190,198, 71, 31,190,191, 76,101,244, 14, 54, 77,245, 92,254, 94, 68,220,117, 8,
+140,232,205,129, 45,101,167,158, 45,222,197,239, 73,194,185, 28,242, 20,202, 30, 40, 42,252, 89, 88,173, 47, 13,104, 41,205, 51,
+191,157,116, 33, 72, 86,189, 23,200,184, 68,194, 90, 52,132,162, 64,115,135,196, 47,207,174, 55,129,113, 14,240,230,136,166,214,
+ 4,216,247, 62,121, 44,155,182,193,225,222, 64, 6, 79, 7,115, 48,236,181,149, 88, 85, 18,231,179,199,233,120, 68,219,214, 16,
+170,198, 60,157,241,228,209, 99, 60, 60,220,161, 91,109, 49, 79, 35,116, 85,163,239, 79,168,116, 69,227,178,224,112, 56,246,168,
+ 21,176,186,122,140,235,235, 27,116, 93,155, 30, 60, 33, 36,188,227,192, 12,107,225, 12,141, 57,191,243,157,239,224, 7,223,255,
+ 62,198,243, 25,125,223,227,203,167, 79,241,244,155,111,240,242,245, 61,130, 15,216,116, 13,186,182,193,225,116,230, 93, 17, 29,
+120,198, 24, 76, 19, 93, 22,154,201, 91,225, 60,166,107,216,199, 93,205, 60,225,243,175,190,193, 15, 63,121, 63, 85,104,226, 50,
+194,116, 25, 39,198,117, 96,120, 67,238,246,166,124, 49,179,247,243,184, 58,188, 25,112, 94,254, 59,139,204,241, 80, 88,230, 66,
+ 81,112, 32,237,236,249,129, 19,165,169,162,208, 91, 68, 24, 77, 26,247,251,172, 63,192, 27,184,226,236, 25,190,248, 25, 68, 17,
+ 50, 19,167, 5, 66,132,100,177,155,140,197,254, 52,225,124,158, 32,165, 64,173,107,200,224, 32,131,129,150,196, 71, 63,207, 20,
+152, 97,173,133, 49, 6,231,105,194,195,195, 30,243, 60,144,186,149, 83,186,200,222,227, 88,140, 19,237, 62, 25,141,232,157, 39,
+149,177,247,104,154, 14,171,245,150, 58,128,144, 85,248, 93,219,146, 66,157, 95,253, 52, 77,104, 59,149,131,146,194, 18, 52, 35,
+163,125, 69, 92, 14, 41, 66, 26,187,163,184, 52,134,105,198, 60,219,148, 28, 24, 1, 43, 34, 2, 84, 56, 88, 38, 10,116,164, 82,
+ 41,185, 75, 85, 21,164,174,168, 8,136,135,176, 80, 16,149, 34,145,144,215,208,117,131,245,122,131, 23, 95, 63,199,205,245, 53,
+ 62,248,224, 3, 82,171, 43, 77,251, 37, 85,193, 51,255,192,177,199,218, 76, 19,134,211, 9,135,253, 1, 46, 4, 84, 85,141,105,
+158, 81, 13, 35, 42,165, 40,106, 53, 0, 66, 73, 56, 47,144, 2,181,217,186, 20,147,175, 2,219,191, 92, 32, 93,128, 51, 52,241,
+152,199, 9,211, 52,162, 31, 71,244,253,136, 99,127,198,177, 31,200,243,157,103, 77,104,218, 21,132,160,103,174,174, 91,206,244,
+166, 73,134,247, 30,243, 52, 64,235, 10, 82, 8, 60,125,254, 18,235,117,139,235,171, 77,186, 68, 83, 19, 2,118,146, 64,164,125,
+185,228,194, 10, 34, 36, 5,118,132,114,249,144, 5, 94, 30, 62, 57, 72,210, 8, 94, 41,142,134,141,147, 41, 15,120, 26, 43,255,
+225,191,243,251,248, 87,255,250,231,144, 82,226,120,120,224, 61, 46,237,192,203, 40,193, 8, 50,241, 12,164,153, 1, 72, 71, 62,
+126,231, 60,103, 82, 24, 24,235, 96,148, 64,163, 21, 12,211, 53, 99, 70, 59, 65,110,144,196,159,180,154, 89,102, 32, 43, 69,238,
+ 4, 33, 21,139,182,232,210,113,206, 32, 56,114, 29, 40,185,124, 74, 35,153, 48,117,211, 28,163, 26, 47,103,201,162,190,152,254,
+ 29,255,158, 50,207,169,160, 13, 62,147,239,202, 98, 95,150, 65, 81, 33, 34,142, 11, 55, 12, 36,133,183,240,231,161,171, 26, 74,
+105,126,222,185,160,143,207,155, 64,161, 97, 98,177,157,164,169,145,103,145, 54,180,132, 12, 26,179, 48,104, 44,219, 44, 21,176,
+235,106,156, 89,207, 34,156,133, 21, 18,167,254,204, 28,123,153,112,193,129,221, 49,139, 93,120,153,105, 17, 50, 90, 88, 36,140,
+ 52,175, 95,211, 62,212, 47,156,100, 57,122,181,152,227,137,229,164, 37,198,159, 11, 4,134,207,188,177,179,148,121,217, 47, 22,
+250,252,220,173, 95,116,125, 11,245,110,162,197, 73, 62,204,233, 8,179, 94, 96, 26, 45,132,159,209,214,154, 14, 18, 33,208,143,
+ 19, 86,155, 14, 24, 5,250,211, 9, 15,135, 19,182,235, 22, 64,192,245,102,141, 97,162,142,119, 50, 6, 99,204, 30,118, 22, 79,
+ 30, 85,120,245, 48,160,110, 28,106,173, 97,167, 1, 85, 93,193,121,143, 90, 81,183, 60, 79,103,116,155, 45,165, 33,185, 25,127,
+246,167,255, 0,109,219, 82,254,179,162,234,145, 34, 79, 91,218,163, 58, 11,111,105,175, 26,189,188,214, 24, 4,231,240,209, 7,
+239, 99, 28, 6,140,243,140,227,233,132,127,243,219,207,241,151,191,250, 13,218,186,194,200, 76,120,239, 3,148,180, 41,254,241,
+100, 61,110,216,182, 65, 93, 23, 56,101,200, 16, 84, 98,158,113,123,127,196,205,213,186, 96,169, 23, 23,153, 40, 59,106,177,184,
+224,196,197,218,185, 20,143,229,236,117,252,237,225, 37, 89,186,251, 6, 72, 70,148,177, 61, 33, 7,165,100, 28, 33,237,255, 66,
+ 40,180, 23,133, 87, 44, 1, 85, 72, 22,146,217, 51, 16,139, 2, 33,239,217, 3, 39, 78, 33,217,236,202, 80,160,120,233, 77,179,
+197,225, 52, 97,156,136, 62, 86, 85, 26, 34,144,195, 33, 56, 11, 97,251,228,125, 31, 38, 11, 1, 15, 59,143,148,124,101, 45,102,
+ 51,227,112, 56, 36,111, 45,188, 79,217,219, 62, 74,154,131, 39,145, 16, 31,210,129,133, 68, 49,204, 66, 74,133,110,189,165, 81,
+177,157,179,184,144, 15,171,237,102,139,233,118, 76,252,134,113, 28,208,180, 43, 76,211, 88,192,101, 10,167, 64, 40, 55, 40,133,
+229,141, 33, 36, 34,159,144, 24,103,131,105,142, 81,157, 9, 23, 69,221,146,146, 41,123, 62, 93,236, 74,241,222,154,146,218, 28,
+ 4,130,117, 8,186, 2,132,166, 17,190, 53, 4, 74,169, 27, 40,231, 81,117, 43, 84,211,132,167, 95,126,133,171,171, 29,154,134,
+ 52, 46, 66,106, 4, 85,241, 72,214,192, 49,247,123,158,103,244,167, 19,198,105,198,106,181, 70, 0,112,232,207,144,106,100, 63,
+ 58,231,139,123,130,215, 32,120, 64, 42,222,169,139,148,207, 29,189,232,206,121,216, 64, 58,128,121,166,233,202,121,152,208,159,
+122, 28,206, 3,142,231, 1,147,229,139, 9, 2, 74,105, 70,208, 42,238,156, 9, 97,170,171, 26,206,186,116,241,106,161,248, 96,
+165,105,203,151,207, 94,224,106,187, 65,214,117,134,204, 85,242,121, 12, 42,101,198, 92,135,197,133,206, 23, 60,219, 14,125, 73,
+ 68, 12, 76, 74, 99,208, 78, 81,205,101,178,166, 32, 85,247, 79,127,250, 19,252,226,151,191,194,211,175,128,227,254,158,167, 48,
+158,115,185,179,184, 54, 78, 58,232,114,182,132, 4, 6,136, 51, 96, 28,140,117, 8,214,161,210,138, 44, 90, 2,176,134, 38, 25,
+214,186,148, 32,231,125,160, 2,213,131, 61,225,129, 19,210, 36,103, 32, 81, 70,183,227,177,187,181, 6,222,218,180, 70, 80, 74,
+ 34, 39,148,208,101,163,162,134, 70, 0, 80, 98, 65,117,244, 33,115, 55, 74,116,180,224, 63,203,133, 0, 29, 4,179, 62,138,240,
+169, 8, 11, 10,217, 81, 21, 82,212,105,193, 85,231,207, 91,233, 10, 82, 42, 88,107, 96, 45, 33,121, 11,105,110, 42,218, 2,135,
+218,144, 50, 94, 3,160,132,185,224, 5, 36,116, 98,181, 76,179,161, 17,124, 8,232,154, 10,187,182,198,125, 63, 82,190,137, 48,
+112, 86,226,111,190,120,138, 15,222,123, 59, 19,242,130, 91,224,213, 17,150, 33, 27,241, 50,143, 98,190, 32, 46,230,170, 9,202,
+229, 83, 3,157,146,217,252, 34,116, 58, 23,146, 33,134, 71,208,119, 76,127,107,234,101, 9,146,137,158, 78,145, 65, 34, 11, 63,
+112, 17,163,158, 41,115, 5,163,155,223,200,217,122, 88, 99, 33,188, 69,215,104, 34, 30, 89,139,217, 88, 32, 56,104,181, 70,215,
+ 54,232, 86, 29, 32, 4,142,253,128, 90, 2, 47,111,111,209,181, 45, 36, 2,214, 93, 7,169,107, 76, 67,143,217, 24,188,120,249,
+ 26,117,183, 70, 63,156,161,132, 64,219,173,104,183, 84,213, 48,194, 98,154, 71, 82,191, 31, 14,144, 90,225,238, 97,192,147, 39,
+111, 99,183,189,161,241, 95, 32,198,183,144,146,208,149,206, 33,132,138,118, 89,188,211,240,206,209, 30, 48, 16, 78,209,172, 87,
+152,167, 25, 55, 87, 87,120,114,115,131, 31,126,255,123,248,167,255,252, 95,224, 87, 95, 61, 79,160, 20,120, 1,131, 60, 5, 80,
+188,219, 34,131, 38,237, 7, 17, 2,197, 24, 78, 35, 94,221, 62,224,241,205,150, 49,177,229,222,117,249, 70,139,111,179,212,138,
+156, 76, 36,226, 5, 20,138,205,123,250, 13, 62, 37,182,133, 98,164, 29,125,165,192, 5,180, 46,218, 16, 99,215, 81, 2, 35,130,
+128, 16, 30,222, 75, 8,153,133, 80,254, 50, 45, 13,146, 73, 78,254, 50,243,245, 13,106, 90, 26, 31,165,128, 22,122,237,214, 58,
+236,143, 35, 78,253, 72,107,143,118, 69,232,208, 70, 16, 64,200, 77, 8,158, 20,179,129, 9, 77,150,211,164,198,113, 32,171,142,
+146,152,231, 30,198, 90,156,207, 3,166,105,128, 53, 6,194,145,125, 45, 64, 66, 10, 10, 56,145,224,221, 23, 88,196,226,243,107,
+139,175,115,179,187,198,122,179,131,157,198,197,195, 21,138,103,165,109, 59,156,135, 62,119,218,222,101,152, 73,177, 10, 17, 11,
+ 64,214,146, 64, 19, 71,239, 82, 72, 56,111, 9,233,233, 2,134,113, 36,223,182,181, 8, 85,149, 14, 71, 18, 41,210,119, 89,198,
+ 76,119, 22,105,122,235, 16,132, 3,132,133,148, 21, 52, 12,117,250, 90, 3,186,134,240, 22,194,121,218, 69, 54, 13,234,213, 26,
+167,251, 91, 60,127,246, 53, 86,155, 45,170,245, 22, 74, 86, 8,144,240, 66,193, 11,199,197,169,197, 52,142, 56, 30,123,248, 0,
+168,186, 38, 84,236, 52, 67,106,133,102,172, 83,151, 91,235, 10, 96,212,166,151, 68,182,147,162, 24,115, 35,234, 17, 28,140,115,
+ 28,211, 57,226,212,247,212,157,159, 7, 28,251, 9, 99, 76,140,243, 1,117, 93,163, 91,109,104, 69,200, 60,116, 33, 5,140,157,
+211,229,155,156, 29,130, 70,170, 74, 74, 24, 51, 99,191, 63,194, 88, 78,145, 19, 50,225, 74, 3, 11, 59,211,223, 3,185,187, 18,
+153,226, 21,173,134, 66, 82,119,234, 93,198,211, 38, 0, 84, 72, 25,135,144,108,159,138,203,200, 8, 36,144, 82,226,199, 63,250,
+ 1,234,170,194, 95,255,114, 68,127, 52,140, 85, 45,151, 97, 52,237,176,206, 35,192, 38,165,117, 76,141,156, 45, 53, 59,150,215,
+ 47, 94, 73, 84, 58,119,144, 54, 18,224, 68, 94, 57,198, 11,222, 58,151,108,120,113,175,236, 5, 9,210, 34, 45, 46,166,164, 65,
+210,133,175, 8, 98,146, 5,176,233,168,145,201, 1, 20,223,211, 37,112, 38, 36,161, 26, 56,146, 58, 56, 7, 40, 9,199,226,225,
+176, 28, 30,164,208,170,136, 78,205,252, 11, 82,239, 72,169,248, 66,151,169, 89, 10,137,127, 34, 22, 74,164,192,126,114, 33, 21,
+105, 93, 64,168,216, 56, 13, 81, 69,186,223, 48, 17,253, 83,243,180,235,122,213, 96,127,158,184, 91,247,176,194,192,204, 26,102,
+ 54,144,204,249, 15,222, 23, 13, 48,159,133, 60, 13, 72,118,180,144,167,162,178, 56,195, 75,226,165, 44,114, 33,210,164,174,136,
+221, 46,183,152, 82,200, 44,183, 21,128,250,251,127,242, 31,252,185, 64, 78,226, 42,243, 90, 99, 16, 75,206, 92, 71,130,199, 44,
+236, 31, 2, 5,207,236, 82,242,195, 7,209, 48, 2,206,162,213,146,246,112,198,114, 8,193,140,171,171, 43, 8,120, 28,143, 7,
+204,214, 97,127,127, 7,103, 13,102,107,240,104,183,161, 47,156,119,120, 56,244,168,181, 66,211,212,240,206, 97,154,231,228, 79,
+ 21, 2, 56,115,146,144,170,169, 66,119, 60, 6,157,166, 17, 85,221,226,167, 63,254, 12, 79,158, 60,130, 51, 19, 42, 85, 97,181,
+222,177,168,198,167, 4, 31,153, 56,196, 34,141, 45, 35, 76, 65,241,136, 83, 87, 68,173,147, 0,180,214,120,180,219, 33,152, 9,
+207,111,239,201,110, 19, 69, 75,252,158,109, 54,107, 28,251,115, 97, 77, 3,103, 8,215, 9, 4,210,143, 22,215,187, 85, 18,200,
+ 37,213,122, 92,115,132, 12, 33, 89,100, 70, 23,108, 56, 47, 46, 56, 3, 73,200, 24, 10,238,184, 72, 99,156, 80, 8,240,194,226,
+239, 4,222,192,187, 33, 7,242,200, 69, 40,140, 44, 34, 75,151,124,249,165,189,236,130, 24, 23, 68,234, 86,210, 61,198, 26,135,
+195,105,196,171,135, 1,183,247, 39,244,253, 68,201,100, 82, 66, 33,192,142,103, 56,107, 32,188, 69,112, 6,214,140,233,161, 68,
+ 32, 69,180, 49, 51,172,153, 81, 73,240, 24,211, 97,156, 12,198,113,164, 61, 44, 23,146, 8,142, 11,142,216,133,147, 72, 46,122,
+120, 69, 84,167,179, 72, 72, 50,218,119,181,217, 65, 73, 73,209,172, 92,248, 17,108,131,148,220, 73, 97,207,227,229, 88, 52, 41,
+142, 57, 93,236,203,211,131,202, 66,191, 66,141, 45, 5, 65, 84,164,228,139,144,215, 2, 74, 73,108, 86, 29,186,186, 70, 93,211,
+254, 80,113,151, 42,121,199, 43, 10,246,190,153, 38, 24,239,136,124, 23,242,250, 68, 50,254, 85,213, 13,100,213, 16, 60,132, 85,
+243,129,211,230,134,254, 68, 36,184,166, 5,148,130,144, 21,102, 86,186, 79,195,128,211,241,128,151,223, 60,199,151, 95, 62, 77,
+187,196,135,253, 1,195, 76,192,155, 8, 6,137,107, 12,159,144,168,180,115, 44, 99, 52,173,243, 48,198,194, 88,131,201, 88,140,
+227,132,243,249,140, 19,143,219,143,195,136,209, 90,248, 0,180,221, 10,109,219, 49, 33, 76, 50, 38,213,103, 93,138,160,252,244,
+248,223, 74,107, 52,140,169, 61, 28,143,152,102, 2,228,188,251,206,219,156,158, 88, 70,223,138,164, 3,145,201,147,238,211,212,
+ 40,141,149, 89,196, 24, 16,146,248, 75, 42,181, 40, 0, 66,129, 27,139, 49,167, 17, 86,146,113,166,244,108, 94, 95,239,240,240,
+112,196, 56, 14,176,142, 18, 41, 61, 22,190, 83, 22,227,121,120,231, 97,189,195, 56, 77,152,102,131,217, 80,216, 79,236, 24, 69,
+161,129,178,188,126,136,147, 68, 95,236,209,125, 18,149,146,159, 91, 74, 74,220, 35,242, 32,185, 26,146,176, 45,189, 7,249, 88,
+200,163,119,110, 98, 80, 76,150,178,249, 42,163,170, 56,153,179,204, 74, 47,189,255,226,146,119,145, 70,231, 5,185,175, 8, 9,
+ 83, 82, 17,183,157,177,175,142, 11,245, 40,222,147, 23,248,108,178,218,105,104, 69, 69, 64,116,136,160,136, 15, 47,117, 13,154,
+ 25,244, 74, 73,172,218, 6,227,108, 49,218, 60,238,151, 82, 98, 54, 14,171, 70,167,179, 35,151,237,158,149,100, 34,179, 91, 66,
+ 40,240,110, 49, 85,238, 98, 55, 94,216, 92, 47, 83, 43,211, 87,167, 48,153,199, 30, 60,158, 39,186, 60, 96,114, 37,181,196, 99,
+132, 34,120,133,118,168, 28, 65, 83, 18, 20, 67,161,164, 20,249, 69, 82,245,163, 32,189, 37,118,187,240, 56, 77,212,101, 76,204,
+ 38,150,138, 94, 76,219, 52,120, 56,156,240,199,127,252,199,248,127,254,217,255,141,113,180, 24,102,218, 79, 59,239, 81, 85, 21,
+102,235, 16,230, 25,231,113,162,241,145,165, 29,134, 99,166,178,215,192,232,122,212,186, 34,229, 39, 2,174,118, 59, 60, 28,246,
+120,239,221,191,139,105, 28,161,133,128,115, 22,227,216,163,237, 86, 88,111,174, 16,130, 43,198,198, 30, 81, 17,147,188,207, 92,
+133, 7,103, 89,152,196,111,176, 82,104,234, 10,191,243,221,119, 48,143, 35,190,184, 63,226,238,216, 67,241,110,197, 7,137,227,
+233, 68, 7, 50,143,168,100,200,194, 19, 41, 37,230,105,196, 97,239,209, 63,218, 97,221,213,184, 8, 27, 47, 93,224,111,180,187,
+ 73,193, 30,150, 10,138, 56, 81,241,229, 14,157, 15, 18,207,151,254,114,119, 45, 46, 24,116, 69,167, 46,222, 12, 46,200,104, 86,
+191,248,210,189, 49,118, 66, 46, 48, 68,153,227,206, 59, 75, 9,160, 31, 45, 78,103,155, 94, 87,240,150, 20,215,108, 27, 12,188,
+207,115, 60, 18, 15,110,198,232, 61,218,138,108, 73, 21, 2,230,121,128,224,145,173,103,187, 14,237,124,249, 33,243,150, 58,220,
+105,194,108,102,212, 74, 20,184, 73,166, 49, 33,164, 84, 43,197, 83,143,244, 48,113,197, 45, 21, 61,132,214,146, 63, 91, 43,201,
+ 15, 56, 93,170,193, 57,238,252, 5,195, 95,108, 94, 89,149, 4, 64, 33, 22, 94,104, 33, 69,105, 60,161,183, 72,138,116, 73,163,
+ 56,200,198,137, 16,163,198, 90, 56,239, 82,210, 97,144,153,162, 23, 73,100,198, 57,204,150, 80,174, 1, 52,162,175,234, 26, 74,
+173, 16,116, 3, 72,149, 19,216, 20,241,201,181,153, 9,118, 82,215, 24, 78, 35,190,248,226, 11, 56, 8,220, 12, 19,218,237, 21,
+160, 42,114,112, 28, 15,120,253,242, 5,158,126,245, 12,183,247,123,200,186,130, 59,246,232,135, 17, 77,215, 98,182, 22,167, 97,
+132,245, 30,205,108, 48,114,231, 83,197,120, 99, 41,146,208, 44,118,137,214,154, 52,118, 31,198, 17, 39, 30,183, 31,135, 9,227,
+108,225, 5,160,235, 6,186,170,147, 8,151,196,119, 25, 15, 92,158,105, 85, 85, 67, 72, 26,175, 30, 14, 15, 64, 8,168,234, 6,
+235,205, 46,165,140,149,151, 69, 2,156, 0, 80, 42,219,168,226,247,216, 95,140,223,227,136, 62,218,221, 2,119,107, 17, 14, 3,
+142, 71, 22,151,187,249, 82,242,202,196, 66, 33, 4,222,249,238, 59, 56, 29, 15,240,206,192, 26,208, 58,144, 61,238,190, 32, 55,
+ 83,179, 68,144,157,201, 24,190,208, 9,121, 26, 56,193, 79, 8,197,150, 51,201, 88, 83,177, 80,155, 43, 30, 65,107, 65, 9,101,
+ 82, 72,138, 58, 69,192,108, 45, 16,253,223,252,220, 9, 22,190, 57,246,231, 71, 75,156,226,171, 51,138,215,162, 62, 38, 33,139,
+147,131, 4,105, 66,128, 66,132, 27, 79, 23,153,130,116,100, 58,235, 50, 31,163, 20,212, 34, 95,232,186,162, 52, 57, 59,243,107,
+247, 41, 57, 45,175, 43,153, 79,193,171, 26,165, 43,250, 89, 25, 80,196,213, 9, 69,228, 58, 15,105, 35,125, 79, 96, 28,103,180,
+117,205, 14,153,128,155, 77,139,195,121, 78,235, 24,107, 13,230, 89,165,181, 87,250,238, 21, 34, 63,222,157, 20, 16, 86,145,245,
+ 68,101, 38, 69,160,245,236,162,211, 89,206,192, 19,193,114, 41,156,202,246, 87, 4,124,203,165, 94,164,113,165,110,189,216, 76,
+ 8, 22,128,200, 11, 74, 89, 98,110,251,184, 51, 16, 28, 47, 26, 48,156,238,161,149,132,150, 36,126,163,204,234, 9, 82, 73,212,
+117,155,178,134,199,105,198,213,110,139,215,175,111,209,214, 36,120,154,166, 9, 93, 83,195, 6, 82,149,107,173,112, 30, 38,184,
+ 48,144,247, 83, 73,138,123,180, 22,155,182, 73,233, 64,136, 64, 14, 99,112, 30,206,240,214,225,124, 58,161,214, 26,222, 26,116,
+109, 7,107, 29,102,231, 48,142, 35, 89,124,234, 26,149, 82,104, 87, 27,136,224, 49,143,103,216,105,226, 73, 1,167, 33, 89, 75,
+ 95, 26, 22, 8, 57, 75,144, 9,165, 43,192,123,188,115,181,193,167, 31,127,136,191,250,245,231, 56,158, 7, 72, 8, 28, 79, 39,
+ 56, 31, 32,165,231,202,158,193, 11,206,194, 57, 10, 68,240, 83,192, 23, 95, 61,199,143, 63,251,240, 34,100, 85, 20, 89,234, 75,
+245,180,143, 20,172,226,179, 14, 11, 16,204,101, 46,187,200,169,100,223, 26,236, 26,107,203, 98,132, 94,248, 48,211, 67,139,191,
+157,175,153,247,241,178, 16,135,197,111, 47,253,201,214, 1,253,224,177,231,228, 58,165,168,235,173,170,138, 41, 85,220, 57, 59,
+139,217, 59,212, 82,160,214, 2, 62, 56,204,198,208,143,106, 70,140, 86, 98,189,234,210, 14,173,107,106, 56, 79, 2, 44,231, 44,
+ 93, 44,231, 1, 74, 73,156,250,158,232,131,118, 70, 37, 5,249,129, 61,229, 91, 59,235, 96, 66,238,162,232,249,230,253,180,148,
+ 80,220, 73, 72, 93,195, 9, 38,202,121,151, 47,124,238,208,165,100,175,173,181,144, 74,163,214, 53,108,109, 49,205,115,122,112,
+ 21,251,128,133, 88,114, 7,162,205, 77,198,195, 72, 4,134,146,228, 93,101,252,103,198, 57,244,195,132,217, 24, 58,240, 67,145,
+ 19, 16, 28,130,210,180, 3,229,192,163,104,131,115,206, 83,158,121, 32,229,126,109,102, 56,173,224, 0, 26,191,243, 84, 64,234,
+ 6,170,110,128,218,192, 87, 13,190,124,254, 2,251, 83,143,183,223,189,199,230,234, 26, 74, 85, 52,190,190,191,199,211,175,190,
+194, 23, 95, 61,167, 28,131, 97,130, 0, 80, 55, 53,137,216, 2,224,252,132,113,158,105,231, 42, 21,130, 84,201,102,183,105,106,
+220,172, 27,172,219,134, 99,137,163,238, 33,238,209, 71,156,206, 35, 78,227,132,201, 58,184, 16,160,116,133,182,237, 10, 81, 39,
+119,138,188,166, 16,146,214, 93, 49, 62,179, 63, 29,168, 64, 98,126,122,221,116,168,185,195,167,208,153,166, 32,195,229, 11, 90,
+ 74,153,166, 10,177,224,202,103,157, 76,235, 38,193, 83,134, 40, 16,206, 76,134, 34,178, 58, 42,244,227,216, 62,145,197,179, 85,
+ 52, 78, 3,222,255,157,119,112,255,176,135, 49, 51,134,211, 1, 22,128,115,185, 91,134, 15,133, 18,158,186,111, 99,168,112, 84,
+130,118,178, 49, 52,201,123, 1, 40, 13,173,114, 5,111,249, 53,198, 29,125,165, 43, 80,235, 35, 83,164,168, 51,236,240,136, 29,
+111,156, 50, 48, 79,192,249, 28,102, 67,211,221,104, 99,203, 90,157,200,161,136,153, 36,209, 91, 83,202,182,147, 6, 72,128, 25,
+ 15,220, 73,243,225,229, 66, 72,204, 6,138,156,144, 92,120,171,244,121,134, 64,202,255,132,170, 45,176,208, 41,139, 92,114,215,
+ 94, 92,232,164, 73,177,169, 96,137,206, 29,231, 60,172,200,107,148, 97, 54,104,103,186,216,173,117, 88,183, 13,154, 74, 99,118,
+ 81,208,232, 97,140,132,177, 30, 77, 93, 21, 24,107,145,168,154,113, 71, 45,196, 50, 2, 59, 44, 24,223,165,235, 44,135, 61, 69,
+ 45, 19,164,132,140,147,155, 76, 26, 33, 93, 10, 51, 12,226, 12, 64,151,234,232,178, 91, 7,219,219,124, 33,146, 18,241,127, 47,
+198, 84,178,240,200,133, 11,226,205, 60, 91,244,199, 19, 42, 37,208,213, 84, 12, 40,165, 17, 88, 25,222,182, 53,116,173, 19,151,
+122,189,162,188,229, 97, 80,248,193, 39, 31,227,229,139,231,120,216,239, 49,112,178,217,112,238,177,221,108,160,130,197,205,102,
+133, 97, 28, 97,157,165, 93,150, 38,155,206, 48,205,168,180,134,225,131,115,182, 30, 16, 51,186,174,197,126,191, 71,240, 30,211,
+106,133,177, 27, 41, 94,117,154, 82,126,122, 85,105,104, 77, 93, 72,219,174,208, 53, 91,204,144, 60,198, 15,152,199,137,243,145,
+ 41, 88, 34,170, 77,189,247,112, 28, 11, 59,246,103,232,166,193, 79,126,240, 49,180,174,240, 23,255,230,215,120, 56,244, 52, 10,
+132,162,253,102, 8,148, 61, 45, 36,164,210,176,134,190,217,131, 16,248,205, 23, 47,241,253, 15,190,131, 66,228, 94,120,103, 73,
+ 56,140,203,152,200,128,101,194, 91, 88,170,168,151,224, 19,153,196, 45,197, 86, 55,239,103, 80, 98, 22, 69,234, 68,132, 92, 86,
+143,111,162, 94,240, 45, 96, 21,130,129, 88, 7, 28,123,131,113,206,132,168,121,162, 29,249, 52,156,120, 52,235, 49, 13, 39,104,
+165, 96,205, 76,133, 99,112,208, 44,250,241, 94, 99,178, 14,179,153,209,112,252,231,170, 33,240,198,163,235, 45,228, 64,128,137,
+196, 11,224,136,206,113,154,160,217,247,108,230, 17,149,146,140,252, 45,190,239, 82, 64, 5,137, 32,217, 19,204, 15, 22, 93, 14,
+116, 24, 41,169, 97,188,131,212,100, 91,179,102, 78,161, 30,222,199, 44,247, 44, 88,145,140,132,109,154,150,198,253, 96,155, 89,
+ 16, 11,145,224,165,243, 32,235,106,100, 26,239,225, 98,191, 38,165,196,121, 28,169, 91,143, 30,226,228,249, 97, 63, 56, 3, 79,
+ 28, 35,108,199,105,198, 48,144,198,160,174, 42, 12,231, 51,206,167, 35, 54, 93,135,213,106,133,182,107, 81,183, 43,136,170,134,
+106, 26,172,171,183,224,160,209, 15, 35,102,161,240,171, 47,158,225,171,231, 47,209,118, 29, 32, 5,230,201,224,112, 60,225, 56,
+ 76,132, 20,214, 10, 85, 18,116,145,174, 4,186,134,149, 21,117, 80,222, 82,193, 81,124, 39, 79,195,128,111,238,129,109,219,224,
+201,213, 6, 77, 69, 5,174,153,103, 12,227,132,126,156,112,158, 12,102,254, 25,235,182, 67,221,182,169,217,144,197, 28, 56,120,
+ 15, 23, 92,218,225, 74,102,134, 87, 21, 37,114, 73,165,104,228,170,232,210,127,252,232, 6,191,247,147, 31, 20,133, 42, 39,172,
+ 49,114, 55,118,180,146,149,217,203,236, 4,207,131, 60, 22, 41, 65, 16,164,133, 83,202, 34,192, 36,126,182, 62, 68, 94, 60,169,
+224, 61, 95, 94, 73, 67, 83,118,162, 33,224,223,250,209,247,113, 58, 30, 17, 66,192,249, 68,129, 66, 54,102,157,167,213,133,231,
+ 44,116,250,140,227,125, 32, 35,193, 18,180,254,169, 52,171,194, 37, 31, 30, 2, 68,107, 3,125,103,181,214,240,160,231, 3, 66,
+ 32, 88, 75, 78,160,100,227, 19,233,122, 73, 86, 54, 6,182,200,144,215, 19, 50,173,123,202,201,134, 88,232,175, 36, 51,220,165,
+144,233,130, 79,171, 93,126, 61, 10, 62,197,118, 7,231,115,226, 98,188,236,164,132,210,138, 61,232,244,204,123,110, 2,242,249,
+148,213,246, 81,159,147, 84,253,160, 16, 26,235, 44,202, 96,221,184,187,247,209, 39,239, 92,138,130,157, 38, 3,219, 57,122, 63,
+107,137,109, 87,225,245,225,156, 8,149,214, 90, 28, 78, 3,222,122, 84, 21, 32, 35,207, 23,110, 72,124, 2,148, 54, 60,153, 4,
+ 23,185,115,191, 80,179,199, 6,144,252,232,161,160,252, 21,186, 35,228,130, 50, 54,227,234, 79,254,244,207,254,156,118, 34,114,
+177,215,136,123, 93, 25, 82, 76, 87, 6,162, 68, 36, 42, 99, 42,197, 34, 13, 43,127,160,118,114,176,102, 70, 83, 43, 82, 98, 90,
+ 7,107, 38,156, 78, 61,186,174, 69,211, 52,164, 82, 30, 6,130, 67,204,180,171,123,252,232, 17,246,247,247,216,238,182,216,109,
+ 58, 56, 75,164,171, 90, 19,116, 97,211,181,216,178,157,172, 82, 10, 74, 9, 56,235,152,210, 6, 76,206,161,214, 21,169, 64,131,
+ 39, 15,174, 39,165,179, 49,148, 62,101,102, 26,243, 89, 78,222,178,142,132, 63,209,135, 60, 79, 3,134,254, 64, 29,181,181,232,
+218, 45, 14,251, 59,204,150, 70, 93,253,233, 72,225, 18,214,225,212,247,184,127,120,192,253,221, 61,134,113, 66,144,196,200,110,
+154, 26, 31,188,247, 93,124,246,189, 15, 48,142, 35, 14,231, 33,117,104, 66, 18, 66, 52,118,195,113,204,229,188,199,102,187, 65,
+ 93,233, 69,167, 28,177, 6,209,134, 17,237,129,201,146,246,230, 74,155, 6,177,145,107,141,188, 74,200,114,136,203,161,123,217,
+129,231,125, 77,178,127,240, 40, 15,178,220,189,139, 69, 48, 69,156, 32, 12,147,199,253,254,140, 87,183, 7,188,186,219,195, 11,
+133,190, 63,177, 26,188, 39,145,224, 56,192, 89, 3, 51,159,161, 56, 22,215, 26,210, 94,104, 9,104, 25,224,152,155,174,149,128,
+115,134,236, 26, 8,232,106, 13, 19,128,201, 82, 50,151,243, 30,198, 56,172,154, 10,195, 56, 66,202,128,102,213,225,116, 56, 64,
+ 74,137,211,254,128,121,158,201, 61,225, 44,218, 74,167, 93, 95, 74,199, 2, 0,161, 8,197, 89,236,179,148, 84,168,170, 6, 66,
+210, 1, 72, 94, 97, 3,137,156,203,172,152,103, 78,128,146,232,209,245, 88,177,136,107,158,103, 38, 50,138,197, 24, 46, 71,222,
+137,148, 2, 22,127,191, 82, 44,230, 73,158, 87,207,255, 14,122, 94,187,166,198,170,107,211, 94, 93, 10,153,153,209, 25,114,128,
+ 16, 2, 94,221,222,225,249,179,231,100, 73, 19, 18,175,111,111,241,242,171,175, 48,158,142,152,207, 61,236,112,134, 55,172, 77,
+144, 26,147,153,113, 30,135, 68,137, 51,206,225,208,159,113,127, 60, 97,127,236,209, 79, 51, 76, 16, 52,190,103, 45,128,172, 59,
+168,118, 3,168,138, 1, 53, 52,141,138,201, 95,145, 30, 39,165,226,117, 5, 5,222, 56, 72,156,102,139,251,126, 64,127, 30,112,
+ 26,232, 66, 31, 38, 3,227, 61,164,210,104,186, 21,237,205, 11,172,166,139, 4, 64,111,211,206, 27, 34, 91,205,242, 56, 94,162,
+105, 90,116,235, 45,126,242,227, 31,225,247,127,247,135,120,235,201,205, 27,101,105,220,201,167, 75,182,152, 98, 74, 89,172,189,
+226, 5,224, 67,225,173, 14, 75,189, 4, 3,108, 34,160, 70,138,172,101, 41,195,148, 11,253, 24, 19,245,168, 59,219,237,182,184,
+187,219,243,136,151, 58,117,103, 29, 92,240,176,124, 78,184, 66,152, 37,132,128,226, 17,187,146,185, 72,128, 0, 52,159,155,165,
+135, 28,124,209, 73,214, 29, 36,246,128, 53,169, 48, 42,114, 28,211,229, 27,149,225,222,231,109, 95,130,163, 68,145,157,207, 54,
+ 87, 95,228, 61,196,159, 89,177,103,127,153, 54, 89, 88,206, 74,119,149, 40,216, 13, 60,110, 87,170, 74,239, 75, 68,241,198,203,
+188, 8,111,100,130, 36,143,220, 85,197,137,107,140,129, 46,210, 30, 47,215, 0, 73,167, 20,137,141, 82,162,109, 27, 52,117,157,
+ 86, 24, 15,253,152, 68,112, 84,172, 8, 92,239, 86, 75,139, 89,249,105,151, 63,155,100, 64, 13, 79, 46,211, 81, 16, 53,108, 69,
+ 66, 96,116,201,100,141,196, 50, 72,230, 82, 5, 37,132,128,150, 82, 94,176, 99,227,155, 25,138,125,170, 79,149, 82,224,213,191,
+243, 30,144,161,200,189, 46,163,192, 3,230,201,162,239, 79,208, 34, 16, 12,129, 71, 68,195,100,160, 42,141,186,105,240,226,235,
+ 47,177,123,235,187,168,155, 6,227, 56, 96,187, 94, 99, 54,116,217,234,186,193,139,103, 95,192,135,128,171,221,150,172, 5,124,
+169,244,211,132,186,170,209, 74,137, 90, 81,240, 74, 93,213,184, 59, 28, 49, 27,131, 70, 75, 24,142,100,149, 66, 98,127,238,209,
+194,227,139,241, 25,214,171, 22,219,245, 26,187,237, 6,187,237, 22,219,221, 22,235,245, 26,235,142, 50,212,219,174, 67, 83,215,
+168,181,166, 29,254, 60, 3,222,163,239, 79, 24,199,145, 70,230, 16, 56,245, 61,134,121,134,113, 1,167,227,145,254, 57,143, 57,
+ 49,142,152,134, 17,117, 69,228, 46, 89,215,248,233, 79,126,132, 79, 15, 71,252, 95, 63,251, 11, 8,102, 34,211, 56, 63, 79, 62,
+ 66, 32,218,220,151, 79, 95,224, 39, 63,252,104, 65, 77, 18,165,152,141, 23,230, 33, 62, 89, 34,147,106,100, 12,151, 64, 86,127,
+ 74,137,148,185,187, 80,185, 92,236,112, 23, 95,236, 11, 31,123, 73, 63, 75,194,187,100,169, 0, 78,131,197, 48, 57,198, 85,106,
+156,251, 19, 29, 98,206, 65, 43,141,161, 39,122, 86,176, 4, 45, 17, 28, 3, 25,225, 41,176,164, 98,111,180,130,181, 51, 52,191,
+206, 85,219,194, 91, 7,203, 86, 29, 4,178, 1,173, 87, 29,206,195,136,174,238, 18,201,171,174, 42,120,118, 94, 12,147,193, 52,
+223, 99, 50, 22,128,192, 48,207, 16,193,163,130,135,170,170, 66,145, 27,125,163,252, 30,169, 40,113,241,172,110,102,213,116, 85,
+ 67, 4, 73,211, 26,222,115, 74, 14, 58, 81, 41,160,196,243,106, 74,100, 6,191, 16, 88,175,183,152, 38, 66,107,198,241, 34,233,
+208,194, 27,154,196,144,166, 95,113,244,158,101, 62,178, 56, 1,214,235, 14, 62,144,237,198, 90,203, 22, 38,177,136,236, 85, 82,
+ 64,233, 6, 74, 74,236,186, 21,134, 85,135,213,170,195,187,239,127,192,191,214,227,235,175,190,196,223,124,254, 21,174, 86, 13,
+118,219, 45,118,215, 55,216,220, 60, 66,181,189, 38,219, 19,168, 64,109,187, 22, 1,164, 8, 54,214,194, 5, 64, 86, 13,148,170,
+ 25,119,233, 32, 21, 69, 90,210,100, 43,163,110,105,143,236, 51,173,143,189,195, 21, 11,243, 32, 21, 60, 4, 81,248, 56,209, 43,
+149,159,145, 99,193, 78, 6,164,195, 54, 35,102,227, 95,139,216, 49,202, 0, 41, 21,154,182, 67,183,222,226,211, 79, 62,198, 7,
+239,189,147,252,228,201, 87,206,251,238,232, 71,247,161, 20,102, 81,231, 46,101, 60, 80,139,241, 41, 19,217,188, 15, 11,128,149,
+144,226,130,233,127,153, 1,158,173,162,165,213, 41, 62,134,222,211, 57,235,248, 82,253,238,187,239,224,235,231,160,245, 97,152,
+224,226,218, 46,198,231, 70,129, 87,212,162,164,187,140,248, 17, 46,193,106, 72,176,168, 20, 95,122, 78,176,142, 73,165,247,204,
+145, 9,254, 34,215, 35, 64, 92, 56, 90, 22,235, 61,207, 63,143, 8,128,141,121,243, 33, 9,234,104, 29,149,243, 38, 18,192,135,
+185,255, 94, 98,249,250,163,187, 0,130, 2,166, 80,100, 2,128,120, 12, 74, 87,212,120, 57,206, 64, 96,140,239,114, 96, 40,146,
+232,151,118,232,154, 69,113,156,192, 88,252, 44,244,251,121, 62,153,162,184,233,189, 51,142,206, 78,195,129, 94,107,103, 33,172,
+128,150, 84, 56,185, 34, 69,207, 89, 91,232, 6, 66, 1,195,228, 40,234,162,114, 40, 89, 46,151,126,114,177, 88,178,163,204,180,
+206,215,183, 20, 23,144, 50,177,112, 19,169, 63,249,211,255,240,207,203, 92,243,112, 33,173, 15, 69,238,107, 40, 82,218, 66, 81,
+211,248,111, 97, 45,238, 15, 61,188,153,208, 84, 18,109, 93, 99,156,102,246,165, 7,108, 55,107,252,252,151,191,192,191,250,197,
+ 95,227,179, 79, 62,133,117, 22,198, 88,116,109,131,201, 24, 84,186,194,122,213,161, 63,220,163, 82,212,229, 59,231,240,157, 39,
+215,105,100,236, 13,217, 22, 72, 29, 44, 17,156,199, 91,111,191,141,205,246, 26,253,233, 8,165, 20,102, 67,106,207,105,158,160,
+154, 22,163,113, 48,227,132,227,177,199,195,225,128,211,233,132,161,239, 49,141, 35,241,216,217, 38, 68,234,223,156, 59, 29, 51,
+163,199,225, 12,235, 60,134, 97,192,241,120,196,121, 24,112,234,123,188,126,253, 26,119,119,247, 56,157, 78, 9,136, 33,148, 34,
+254,187, 34, 65, 80,165, 53,116,165,112,213,214,120,126,247,192, 17,148,117,178, 44, 9,144, 31, 52, 89,158,100,141,237,186,205,
+ 76,125,228, 14, 46, 94,178, 62,117,151, 34, 91,163, 68, 72,157,121, 73,122, 75, 21,177,200, 16,154, 28, 72, 83, 8,233,138, 86,
+ 94, 20,246,186,228,123,150, 18, 62, 8, 28,207, 51, 30, 78, 6,199,126,198,237,221, 30,135,227, 9,243, 52, 97, 28,206, 24,135,
+ 51,135, 50, 88,162,120, 77, 35,164, 32,235,136,153, 39,194, 93,206, 35,164,164,125,159,119, 51,197, 32,122,218,238,181,117, 5,
+ 17, 2, 92, 16, 8,198,192,121,139,117,219,192, 5,154,202,204,179, 65, 93,213, 24,199, 9,235,174, 3,164, 68,215, 52, 16, 18,
+152,167, 25,211, 60,165,100,191,186,110,112, 56,245,152,250, 35, 11,179,104, 87, 39,101, 12,132, 40,196,144, 41, 51,158,172, 63,
+138,185,160, 82, 74,104, 85,167,236,113,207,157, 34,225, 60,201, 31,171,100, 20,203,132,229, 45, 45, 4,231, 29, 4,204,102, 78,
+ 93,100, 42,208,184, 27,128, 40, 59, 4, 14,163,224, 29,119,180,202,196,109,154,148, 18,111, 63,190,161,142, 23, 30,109,211,162,
+169, 43,254,140,178,130, 94, 41, 77,184,214,170, 66, 35,128, 48,205,184,187,187, 67,183,219,162,110,168,195,223, 93, 95, 97,243,
+232, 17,246,231, 1,199,251, 7,184,105,196, 60,156, 49,205,180,218,154, 83,230,186,199,217, 10,204, 66,195, 75, 69, 29, 58, 31,
+ 86, 74,201,148,170, 21,175, 3, 34,206,145,214,193,154, 9,158, 15, 84,203,126,103, 17, 99, 99, 67,150,253, 68, 53,124,198,105,
+ 94,174, 5,113, 17, 31, 43, 82,241, 35, 37,137,189,170,170,198,122,187,195,213,205, 91,248,123,127,244, 7,248,225,103,223,199,
+110,179, 65, 97,178, 37, 54,184,200,170,235, 50,228, 36, 79, 26,145, 38, 34,212,161,134, 5,219, 60,250,215, 75,251,154, 44,162,
+ 11, 83,159,196,191, 46, 8,113, 17,146, 16,138, 62,120, 17,102,128,217, 24,188,122,253,128, 87,183,183,152,102, 3,169, 20,250,
+254, 72,103, 17, 79, 98, 34, 18, 53,157,210, 50, 98,114,217,177, 35, 99,188,110,158, 52,168, 84, 20, 41, 72,169, 23, 19,134,232,
+175, 46,223,167, 36,224, 92,164,140, 21,192, 43,145,197,208,137, 91, 30,153,234,177, 96, 73,130,185, 34,183, 62, 93,239,133, 42,
+157,215,136,101,202, 91,186,252,132, 34,199,145, 38,187,177,115, 38, 57, 82, 82, 6,121, 26, 76,101, 8, 78, 82,185, 43,149, 47,
+244, 80,138,119, 25,230, 85,186,183,248,217,145,172, 1,209, 85,149, 16,198,109, 83,147, 16, 81, 80,211, 96,109, 88, 20,150,155,
+245,138, 61,252,101,115,196, 98,215,248,108,150,118, 49, 20, 46,160, 18, 37, 18,178,131, 38, 97,137,197, 82, 0,186, 84,199, 47,
+229, 77,122,193,159, 15, 89, 20, 81,130, 71,124,196,113, 94,144,145,131,231, 69,189, 15, 9,237, 24,187,188,105, 24,208,104,129,
+182,166, 24, 84,165, 20, 42,169,160,116,139,255,229,127,255, 63, 49,155, 25,155,245, 26,175, 94,191,194,122,179, 65, 83, 55, 56,
+246, 61,118,219,109,206,183,149, 18,206, 59, 40, 37,113,115,189,131,170,106,172, 58,170,240, 15, 71,207,123, 50,129,113, 2,180,
+ 86,176,231, 35,180,214,248,236, 7,159,225,254,112,196,253,221, 29,110, 5, 30,173,250, 0, 0, 32, 0, 73, 68, 65, 84,247,123,
+ 42, 2,198,145,194, 69,248, 13,180,179,197, 56, 31,240,176, 63,162,123,249, 10,187,205, 26,215,215, 87,184,190,190,198,110,183,
+195,213,110,135, 77,215, 81,167, 45,233,210,117, 51,141,193,134,105,194,254,176,199,121, 32,139,212,203,151, 47,113, 56,156, 48,
+ 91,218,253,121,235, 48,141, 35,198,186, 66,165, 43,178, 69, 84, 26, 74, 72,172,214, 43,172,226, 33,136, 0,233, 61,140,159, 24,
+128, 67,192,135,113, 28,240,205,139, 23,120,251,201, 21,137, 92, 22,126,115,145,190, 44, 34,249, 67,115, 32,134, 8, 36,214, 74,
+141, 78,170,226,243,131, 21, 21,222,203, 54, 49,243,155,115, 94, 57, 61,172,198,121,236,207, 22, 82,181,100, 23, 99, 90,211, 60,
+ 79,112,214,160,169, 91, 16,110,155,190,124,206, 26, 12,134,224, 46, 82,107,130,166, 12,228, 0,112,102, 38,229,178, 55,232,167,
+ 51,228,106, 5,231, 3, 84,240, 88,213, 26,149,148,148,138, 20, 2, 42, 17, 96,121,136,105, 45, 77, 69,102, 99,208,116,148,138,
+182, 94,173, 1, 1, 84, 85,131,190,239,161,224, 49, 50,197,236, 60,140, 88, 55, 13,132,148,120, 61,244,232,218, 6, 54, 8, 40,
+ 4, 24, 55, 39,181,181, 72, 41,100, 5,244, 37, 18,175,248,161,162,100, 50, 5,193,162, 52,199,193, 16,177, 59,147, 82, 37, 54,
+120, 28,181, 34, 81, 78, 29, 52,128,245,122,131,113, 60, 83, 33, 38, 37, 84, 82,246, 22,153,200,177,235, 96,145,156, 20,114, 81,
+ 32, 68,161, 80,165, 21,154,166,133,247, 30,227, 52, 98,158,105,165, 68,246, 75, 69, 93,102,252,189,206, 66, 9, 34,221, 93,173,
+ 59, 28, 15,123,188,126,254, 28,186,170, 32,229, 26,109,211, 65, 74,133, 71,239,188,131,251,170,198,171,151,255, 63, 93,111,246,
+ 99,201,117,165,251,125,107, 15, 17,113,134, 28,170,138, 67,145, 18, 53,180,122,144,219,246,237, 6,218, 54,112, 1, 3, 54, 12,
+ 24,126, 50,252,167,250,193, 79,247,197,126,243,128,107,224, 14,125,123,146, 68, 81,108, 82, 36,107,204,204, 51, 69,196, 30,253,
+176,214, 30, 78,177, 45, 64, 80,145,170,170,204, 60,231,196,222,107,248,190,223,247, 6,199, 72,240,151,136, 57, 19,124,100,193,
+ 98,206,169,250,178, 89, 76,103,235,207, 23,188,151, 53,138,171,105, 89,189, 55,185,140,178, 21, 81,205,199,174,118, 40,106, 67,
+222,194,199,174, 29, 52,125,232,206,104, 93,185,210,170,174,163,148,140,101,183,251, 61,118,251, 59,252,205, 95,255,231,184,185,
+217, 9,107,162, 51, 86, 21, 43, 37,174,187,195,242,126, 50,213, 88,113, 8, 21,116, 85,183,151,157,178, 18, 49, 21,199,141,246,
+217,214, 36,221, 62,201,159, 45,214,173,244,163, 3,183,156,172,148,203, 51,219,167,242, 9,103, 33, 68, 28, 14, 7,156,207, 23,
+158,128, 16, 91, 96,139, 91,168,208,199, 74,167,166,229,236,229, 96, 31,170, 66, 72, 22, 86,241,247, 25, 99, 89,221, 48,148, 43,
+ 37, 22,188,113,136, 84,224,175, 97, 56,145, 45,132,200,177,190,233, 74,156, 35, 89,245,101,103, 95,162,102,219, 37,207,224, 45,
+117, 21,197,172, 74, 76,172, 36, 11,150, 2, 90,149,117, 94,151,131,192,212,180, 54,245, 80,153, 96,138,192, 82,196,109,172, 66,
+151, 59,136,218, 52,132,131,199,218,152,177, 92,232,168, 29,122,172, 69, 80, 15,191,105,141,172,170,194, 58, 8,183, 68,107, 83,
+215,178, 23,202, 88,221, 22,214,112, 4,173, 81, 10, 25, 65, 16,175,220,144,156,231, 5,131,221, 95,143,243,169, 41,251,219,120,
+191, 57,107,168, 59, 43,174,218,237, 62,202,182, 20, 71, 53, 70, 35,255,136, 37, 86,197,117, 68, 12,159, 33, 78, 44,104,203,246,
+ 98, 72,207, 84, 89,189,200, 73,108, 2,168, 7, 79,139,164,164,122, 97,146,216, 25,172, 97,209,131, 86, 10,171,119, 80,148, 96,
+135, 1,255,235,191,249,223,101,143,157,240,201, 71,207,240,226,163,143, 25, 48,113, 57, 3, 25,216,110, 88, 44, 23,252, 10,163,
+ 9,219,105,135,148, 57,122,209,104,133, 32, 2, 10, 99, 24,127,184,186,136,156, 34,134,193, 2, 52,240,161, 50, 31,177,179,132,
+151,127,241, 23,120,122,122,194,251,199, 7,204,199, 3,150,121,150,248, 71, 9,231, 72, 25,107, 72, 88,194,138,167,203,138,247,
+ 79, 39, 76,223,254, 17,119,247,119,120,118,127,143,251,187, 59,108, 55, 27,140,227, 40, 59,110,254, 51,167,227,145, 31,186,203,
+ 5, 15, 15,143,120,122, 58,212, 4,172, 40,209,164,110,117,152, 47,140,165, 52,214,192,104, 22, 4, 58,231,240,108, 63,225,245,
+197, 35,122, 15, 61,136, 29,164, 88,159,132, 80,118, 58, 30,240,183,127,255, 91,252,250,207,126,133,105, 50,173,194, 45, 85,101,
+110,190,116,174, 82,169, 62,232,137,154,130,146,115,210, 91, 64, 12,169,206, 7,170,168,134,236,148,245,138, 15, 25,139, 75, 88,
+ 86,143,224, 60, 95,166,222, 49,173, 74,246,110, 0,193, 12, 27, 56,233,136,151,249, 2,163, 53,188, 99, 68,111, 74, 25,222,243,
+207,145,214,153,225, 18, 57,241, 5, 31, 29,214,224,160, 8,216, 14, 22, 57, 71,108,164,248,241,222, 35,100,135,144, 56,216,103,
+ 28, 12, 98, 96,148,165,210, 6, 27,197,184, 96,141,140,152, 3, 38,210, 56, 62,157,241,252,217, 45,226,122,193,227,249,130, 20,
+ 35,166,205,196,222,228, 97,192,249,124,230,116, 63,137, 95,228,245,128,230,241,244, 48,176,213, 75, 70,110,101, 21,149, 98,100,
+171,148,148,175,144, 41, 74,136,145, 45,100,114,144,147, 92, 82, 90,107,132,130,139, 44, 15,172, 28, 92, 41,177,117,113,179,217,
+ 97,187,217,225,116, 62, 66, 27, 11, 50,109,172, 86, 96, 25,232,186, 71, 18,133, 47, 1, 28,176,145,139, 54, 66,225,254,246,182,
+190,135, 46,102,204,203,138,113, 28,185,163,209, 60, 51,206, 41,212,201, 10,139,197,248,215, 27,107,241,234,225, 1,203,199, 31,
+ 97,183,219,227,237,195, 35,190,127,245, 26,135,211,204,147,149,113,135, 39,159, 0, 63, 87, 93, 70,193,213,150, 67, 52, 70,143,
+176, 6,185,196, 99,205,117, 78, 31,248,163,169,235, 38,140, 82,176,198, 32,136,138, 59, 86,139,151,134, 46,215,110, 37,102, 81,
+149,241,124,216,241,168, 26, 85, 90, 40, 98, 6,155,205, 14, 55,119,207,240,223,252,205,191,194,205,205,174,162, 93,203, 40, 53,
+ 95,169, 71,178,192, 62,168,249,196,235,255,223,186,174, 62,215,190,236, 21, 83, 70,181, 19, 41,177,195,181,177,123,187,221,146,
+ 92,206,117,231, 42,174,146,156,186,113, 54,117, 76,112,180,245, 91, 74, 9,214,104, 28,143, 39, 78,187,203, 17,148, 88, 24,124,
+ 57,159, 42,170, 22,148,161,229,181,110,184,107,153,174, 81, 11, 51,178,138, 4,205, 74, 0,233, 26,164,147, 41, 65, 81, 2, 83,
+242, 25, 38,163, 53, 71,196,106,177,174, 21,209, 91,249,158, 99,138,252,122,232, 12, 31,217, 54,151, 11, 21,183,144,227,114,251,
+252,103, 17,210,165,220,166, 18, 33,242,157, 0, 9,175,169,235,189,220,210,222, 42,196, 70,181, 80, 25, 23, 28, 82, 10,117, 60,
+ 93,113,238,164, 58, 56, 15,143,186,181, 86,124,161,107,133, 36,207, 45, 85, 76,117, 79, 61,165, 22, 97, 44, 46, 7,102,199, 91,
+104,109,228,231,229,215,195, 5, 14, 21,219,200, 52,138,117, 36, 93,222, 20, 50,188, 15, 53, 80,169,153,236,203,123,219,166, 10,
+ 72,226, 41,163,124,141,247,166, 62,150, 92,137,116,170,239,206, 69,128, 74, 29,105, 51,117, 89, 9,130,208, 54,185,132,114,128,
+170,176, 1,181, 83, 43,213,173, 84,124, 37,153,168, 41, 36, 4,235, 87,184,200,169,250,188, 83,230, 15,142,214,154,119,209, 57,
+227,255,254,119,127, 43, 59, 8,254, 33, 95,126,246, 25,206,231, 51, 0,130, 53,140,119, 93,215, 21,195, 48, 86,124, 95, 20, 66,
+152,115, 14,227, 56, 96,178, 10,167,115,100,225, 82, 8,128, 38,100,107,160, 60,143,246, 72, 17,130,143, 0, 41,204,135,247,176,
+ 68,152, 20, 48,222,220, 64,191,120,129,219,103,207, 57,204,194, 88,156, 47, 39,252,230,239,254, 78, 64, 27, 25, 30,132,213, 5,
+188,255,225, 45, 94,189,121,143,251,253, 22,207,238,239,176,223,239, 57,202,144,120,164, 60, 11, 11,254,116, 62,227,114,186,192,
+ 5,134,248,199,106, 35,227,106,123, 93, 87,152,121,230, 11, 70,232, 89,199,211,153, 43, 97, 82, 76, 53, 3, 96,172,229, 88, 64,
+197,202, 76,182,204, 56,156, 78, 79,248,242,235,111,241,249,203, 79,241,252,126,123, 29, 4,210,143,121,149,146, 41, 75,110,208,
+ 26,137,189,189,202,175,167, 70,183, 42, 12,235,101,141, 32, 61,225,112, 60, 54,155,162,240,235,249, 96, 48,240,209,129, 72, 99,
+ 89, 47,149,167, 28, 79, 71,220,220,222, 99, 93, 3,144, 34,134,253, 29, 82,206, 88,215, 25,110, 93, 1, 0,155,205,158, 47,122,
+ 99,129,232, 17, 29,139,222,180, 2, 6, 81, 33,243,104, 35,194, 45, 92, 77,147,214,152, 44, 59, 25,144, 18,118,155, 9,218, 24,
+ 81,205,203,207,166,216,158,114, 88, 22, 40, 67,248,246,245,107,172, 51,143,139,111,182, 91, 92, 46, 11,175,124,230, 11,230,121,
+198,164, 9, 48,150,227, 23,137, 47, 20, 35,221,245, 48,109,170,218, 62, 11,218,179, 8,178, 32,151,182, 17, 5,117,202,108, 33,
+ 43, 83, 21, 37,159,123,170,151, 89, 20,203, 90,172,197, 83,150,130, 56,229,132,205,102,139,144,248,153, 48,195,192, 93,107,125,
+248, 91, 72, 6,132,205,205, 99,123, 84,222, 60, 36,150,116,156,182, 88, 61, 95,166, 33, 19, 14,243,130,172, 20,235, 85,140,174,
+ 74,102,239, 89, 60, 26, 98,194,188, 58, 44,171,195, 18, 13, 48,221,224,159,190,250, 22,233,203,127, 6,122, 37,190, 42,177, 75,
+221, 76,174,168,173, 99,188,206,153,151, 75, 42,229,235,209, 96, 47, 22, 43, 63,154,149,157,102,146,162, 48,229,107, 52, 17,170,
+205, 42,137,165,178,223,223, 82, 27,201, 82, 91, 77, 40,165, 48, 14, 19,110,238,158,225, 87,191,250, 37,126,253,103,191,148,194,
+162,133, 18, 55,170, 24, 90, 58, 18,181, 53,100,150,116, 46,234,216,229,232, 46,154, 98,238,164, 78,217,221, 51,223, 41,247,250,
+ 20,121,190,114,139, 99,213,130,232, 77, 29,150, 57,151, 51,242,202,165,146,107,192, 71, 97,249,179, 86,130,133,161,186,142,213,
+ 9, 65,138, 31,254,236,100,144,204,124,116,101,175,243, 63,199,148, 97,197, 85,164,192, 98, 79, 34, 45, 20,179,162,141,225,117,
+ 23,233, 6, 78, 74,242,191, 33, 38,228,172, 42,173, 18,200,208,137,106,183,171, 84,170,162,177,156,218,247, 95, 47,233, 30,152,
+ 82,113,177, 37,229, 49,129, 34, 42, 38, 88, 93, 53,147,141,192,166,181, 97,120,146,231, 51,167,104,121,138,109,185, 35, 11, 84,
+ 53,184,146,145, 57,137, 15, 61, 20,239, 58,202,215,161,238,227, 80,210, 29,175,201,116,236, 16,240,149,203, 78, 90, 35,196,132,
+197,121,248,216, 96, 82,197,174, 91,238,212,162, 21,225, 34, 79,181,128,172,156,229,220, 85,245, 51,147,145, 68, 47, 32,223,191,
+ 82, 93, 65, 75,221,231,144,186, 56,237,242,223,246,123,107,196,117,197,186, 39,152,194, 17, 71,134,216, 7,168,237,250,115,225,
+143, 83,231,142, 34,224,106,228,148,160,116,190,178,102,248, 16,129,228, 48,140, 86,242,169, 19, 52, 41,188,121,120,172,163,185,
+ 24, 35,246,187,189, 28, 16, 28, 54,112,153,103,140,214,226,235,175,191,194, 79, 62,123,137,113,179,193, 55,223,125,143, 95,253,
+242,231,184, 60,189,199,160, 21,188,243, 24,140, 70, 34,130, 37, 13,231, 51,220,202,135, 50, 25, 11, 74, 9, 17, 1,211, 96,164,
+ 99, 73,248,248,217, 13, 78,231, 25,218,104,204, 79,111, 49, 78, 27,104,165,240,238,205, 59,152, 97,192,254,230, 22,231,195, 35,
+ 11,142, 50, 16, 98,198,147,247,184,132, 19, 94, 61,157,240,108, 55, 97, 55, 13,156, 38, 23, 3,251,154,189,135, 11, 81, 96, 12,
+221, 94,137,138,184,135,253,163,110, 93,177, 88, 83, 8,173, 56, 30,143, 88,214, 21, 80,147,116,102,162, 96, 37,226, 17,106,150,
+113,149,188,198,199,167, 7,124, 19, 35,150,245, 35,252,228,229,179,186,251,174, 19, 19,100,137, 77,149,195, 42,169, 86, 21,118,
+ 98, 37, 31, 18,230,149, 97, 56,222, 59, 1, 77, 56, 40,100, 44,243, 3,214,117, 17,184, 11,143,234, 66,136, 98,215, 72,216,108,
+118, 88,215,153, 11,173,156, 1,173, 49, 88,194,233,240, 0, 31, 2,166,205, 14,143,143,111, 97,148,194, 44, 93,123,244, 43, 78,
+193,139, 69,109,173,186,140,232, 29,180, 53, 18, 24,196,135,252,146, 88,232,181,153, 6, 12, 86, 99, 51,141, 24,140, 97,145, 34,
+145, 16,224, 50,204, 96,225,115,192,168, 13,140, 53,120, 56, 60, 33, 58,135,219, 91,182, 57,206,115,230,159, 35, 38, 92,102,246,
+ 59, 95, 46, 23,182,247,248,200,221, 89,134, 4, 9,161,230, 67, 27,195,190,107, 62,136, 45, 31,222, 82,172,242,237, 92,158,145,
+212, 4, 63, 29,189,167, 4,241, 24, 98,142,117,161,199,149, 8, 73,238,198, 3,148,144,169,202,235, 16, 59, 10, 20, 9,158,148,
+ 58,250, 92, 19, 61,118,104,102, 99,112,154, 93, 23,209,155, 49,123,135,183,199,165,142,188,219,165,155,174,240,156,212, 41,146,
+123, 27, 43,201, 33,145,197,231, 94,198,224, 33,166, 54,186,206,168, 52,179, 70,147,164,106, 33,204,245, 50,197,149,111,158,187,
+ 38, 45,233,117,241, 10,108,213, 2,131,114,253,188, 83,110,223,211,191,204, 66, 96, 87,192,118,123,131,219,251,231,248, 31,254,
+187,127,205,233, 95, 41, 95, 9, 63, 27,165,172, 83,240, 82,141, 33,170, 25, 6, 36, 98,218,246,245,114,195, 36,215,248,225,214,
+133,151, 14,173,183, 36,230,222,149, 46, 41,127,156, 59, 79,245,162,227,207, 91, 39, 25,239,100,221,249,122, 11,134,148, 18,134,
+ 97,192,114, 57,193,167,136,113,212,128, 34,124,246,252, 14, 95,125,255,154,215,135, 49, 97, 99,181, 40,221,249,243,161,169,134,
+155,215,247,133,228,245, 82, 69,123,132,146,165, 30, 1, 5, 40,101,186, 46, 31, 53, 56,164, 8,225,116, 21, 18,102, 40,205,197,
+110, 2, 65,103,134,213,248, 24,185,136, 16,157, 65,136, 77,141,223,219, 48,137, 8,186, 36,195,161, 89,188, 84,135,153, 69, 42,
+204, 7, 22,196, 1, 64, 10,174, 2, 98, 10, 47,160, 16,236,114, 23, 97,193,166, 32,195,103,203, 21, 88,166, 88,178,169,173, 58,
+164,131, 86,181, 97,215,194,203,176, 50,137,138, 87,174,130, 98, 33,244,129,133,192, 45, 70, 54,247, 6, 32,153,110,160, 78,252,
+ 42,171,163, 7, 77,169,220,246,232,170, 11,151, 41, 57,166,189,115,184, 91,191, 85,228,109,129, 84,149, 63, 65,185, 22,147,164,
+ 24,165,107,202, 3,152,170,112, 35,225, 3,194,200,213, 18,191, 48,170,235,231, 82,212,195,189,224,106, 89, 28,159,253, 18,228,
+ 48,141, 35,126,247,213,215,181,210,103, 95,167,174, 60,113, 78,110, 91, 96,140,198,227,211, 19, 62,126,241, 28, 95,253,225, 15,
+120,253,230, 45, 98,240,248,135,223,124,137,237,104,241,124, 63,113, 21,166,100,236, 0,206, 30, 30, 70, 43, 66,164, 8,109, 13,
+110,140,150,145,173, 66, 36,192, 42, 96, 51,106,144, 2,140, 29, 57, 69, 45, 6,220,236,183,248,236,229,199,184,156,207,184,187,
+217, 0,164,241,199,111,191,225,253, 75, 17,190, 32,227,225,178,226,245,105, 65,202, 9, 35, 17, 38,211,248,198, 17, 60,202,139,
+200, 72, 84, 14,204, 22, 3,234, 3,227, 46, 67, 76,240,206, 99,190, 92,216, 9, 48,136,215,213,112,225,147,101, 12,155, 50,143,
+154, 97, 24, 59,184, 44, 23, 24, 59,224,187,239,190,131,243, 1,127,246,139,151,117, 4,151,209,217, 32,228,221,243, 57, 97,117,
+ 25,206, 69, 40,109,225,165,179, 30,172, 69,240,161, 93, 22,158,133,106,222, 47, 32,197,135,228,233,124, 96,132,111,228, 73,135,
+ 95, 28,140,182, 56, 30, 30, 48,109,118,184,156,143,210,225, 68,144,182,204,137,246, 14,171, 82, 8,206,225, 18, 28,166,113,132,
+115, 43,198, 97,224, 74, 25, 9,154, 52, 66,244,114,145, 75, 10, 92,202,200,137,224,157,231,142,189,136,215, 36, 71,155, 58, 37,
+234, 96,249,224,113, 33, 84, 75,215,114,185, 96,171, 21, 22, 5, 44,231, 51, 82,206,216,109, 71,204,235, 10,138,185, 6,196,120,
+239,224, 49, 98,178,132,203,234,175, 16,159, 70, 70,242, 0,152, 60, 86, 68, 91,137,119,210, 37,229,172,144,199, 82, 74, 87, 32,
+100, 18,117, 20,131, 49, 10,122, 55,243,148,161,118, 16, 16,241,211,138, 73,111, 57,106,180, 83,128,247, 49,144,189,165, 39, 41,
+ 35, 2,159, 98,217,202, 87,166,195,156,175,127,221,239,175,211,149, 15,190,227,100,203,216,153,114,139, 95,226, 9, 94,232,188,
+243,130, 14, 77, 93, 66, 88,119,201, 93,225, 60,235,212, 14,117, 63, 93,200, 92, 90, 56,235, 74,166,109,174,168,131,129,171, 93,
+104,233,120,116, 23,144, 82,156, 3,229,115,174,138,239, 88, 1,198, 88,220,222, 62,195,167, 47, 63,195,127,251,175,255,166, 78,
+ 88,122,241, 97,238, 66, 60,174,175, 92, 92, 89,128,218,132, 65,254, 84,231,253,189,146, 38, 75,247, 77,164,218,217, 72, 29, 6,
+ 22,173, 64,172, 2, 74,148, 51, 10, 87,182,165,156,175,180,215, 87, 59,105,116,214,186,105, 26,241, 4,198, 28,171, 76,140, 1,
+206, 6,155,193,226, 60, 47,162, 93, 80, 48,164, 96, 12,137,175,185,124,118,155, 5,175,228,203, 23,235,101, 22, 36,178, 66,230,
+243,185,172, 31,228,125, 83, 96,245,125, 25,229, 23, 7,134, 86,252,124,166,146,140, 87,136,135,129,139, 30,157, 18, 39,156,133,
+ 32, 23,251, 53, 78,188,237,151, 85,247,217,165,182,111, 38,130,214,128,210,182,130,136,130, 64,101,170, 13, 56,179, 40, 91,137,
+ 77, 49, 21, 97, 42, 21,176,140,105,164,184, 20,240, 35,242, 59,201,228, 50, 55,170,163, 34, 30,213,107,163,197, 38, 25,164,184,
+238, 0, 96, 89,112,203,213, 54,221, 69,210,254, 11,154, 36,170,106,247,252, 65,136,244, 7,129, 41,212,220,226,160,174,192,255,
+192,161,148,127, 76, 30,235,180, 79,234, 10,113, 76, 4,190,212,137,186,113,215,143,150,246,197,162,158,155,220, 94, 58, 67, 18,
+ 81, 80, 75,110,227,111,150,129, 44, 12,154,152,166, 9, 74, 41,252,230,235,111, 25, 18, 35,149,227,102, 51, 74,229,206, 54, 46,
+ 99, 12,156,243,248,225,135,239,216,178,180,191,133,126,247,128,197,179,192,109, 89, 86, 24, 69,216, 13, 30, 94, 20,193,209, 7,
+104, 99, 97,245, 0,163,128,172,152, 16, 22, 66,132,210, 60, 81,176,214,212, 46,222,106,194,152, 51,212, 56, 96,118, 1, 63,255,
+229,159, 96,180,204,178, 94,150, 21,243, 60,227,227,251, 27,204,235,130,121, 94,176,174, 43, 14, 79, 7, 44,206, 33, 58,143, 16,
+128, 99, 76,120,183,178, 40,105, 99, 53, 76, 61, 84, 27,253,173, 52,121, 49,201,212, 98, 89,129,101,197,234, 28, 98, 72,240,162,
+138, 13,129, 59,216, 97,156, 56,128, 34, 37,196,228,161,212,202,145,160, 54, 35,103, 11,239, 86, 40,173,241,234,213,119,152,231,
+ 25,127,241,171, 47, 36, 97, 9,136, 73, 97,153, 47,216,223,222, 66, 17,241,158, 51, 6, 22, 76, 37,135,236, 87, 88, 99,240,244,
+240, 14,214, 90,248,156,106,232, 3, 43,238, 57,185,172,200, 31,125,136,176,227,132,243,229, 2, 2,231, 79,231,156, 49, 95, 78,
+136,193, 67, 27,195,213,118,152,161,205,192,169,120,193, 99, 94,102,220,222,222,195,175, 23,164, 24, 48, 47, 81, 98, 46,117,183,
+ 43, 22,177,142, 28,222,171,227,238,216, 42,141,105,156,176,177, 26,183, 55,183,152,215, 21,119,119,207,241,250,205, 27, 28, 47,
+ 11,238,111,118,120,255,248,136,195,249,132, 95,252,244,167, 56,207, 23, 24,165,240,116, 60, 0, 49,194, 14, 35,239,181, 67,196,
+225,112,130,182,236, 85,215, 34,196, 25,117, 81,131, 91, 88, 3,164, 44, 12,108,177,219, 41,173, 1,101,177,204,172, 48, 46,190,
+107,136,159, 58, 19,147,166,234, 30, 75, 14,180,146,134, 86, 46,184,152,178,104, 61, 82,189, 52,148,232, 78,202,234,166,122,183,
+ 5,144, 18, 59,107, 82,111,213, 2, 82,243, 14,199,112,149,183, 92, 44, 85,229, 32, 70,199,225, 14,194,201, 47,185,216,220,213,
+ 69,217,239, 11,113,174, 99,137,167,170, 50,111,223, 79,211,109,168,166, 16,175, 73,100,169,170,117,127, 84,236,131,167, 21, 37,
+ 92, 38,167,140, 53,186,238,146, 45, 25,209, 16,184,143,130, 53, 28, 72, 19, 11, 39,162,254,156,170,122,219,155,144, 74, 97,156,
+ 54,248,228,211,151,248,244,227, 23,248,253, 31,190,193, 96, 7,172,114,126, 40,217,219, 91,107, 56, 29, 78, 55, 34,159,234,192,
+215,232, 56,224,253, 72,254,199, 62, 79,105, 32, 11, 37,173, 67,249, 82, 45,227,168, 37,116, 9, 30,182,168,206,175, 59,241, 92,
+209,202, 92, 60,182,215, 36,167,235,240, 17,231, 89,169,205,169, 98,220,249, 91,226, 21,222,103,207,239,240,219,111,217, 35, 61,
+175, 14,163,157,174, 28, 49, 80,169,158,227, 74, 43, 22, 76,146,174, 59, 89,230,117,112, 5,160,101,207,206,227, 97,158, 10,149,
+228,191,178,118,209,146,131, 81,215, 32,166,209,215,116,230,253, 56,167,198,165,166,244,246,190, 78,157,250, 2,139,241,205,114,
+153,130,174, 82, 33,181, 98, 16, 23, 41,233,150,187,216,212,214,245, 87,186,180, 76, 88,120, 31,174,100,157,170, 32,147,212, 20,
+ 27, 81,187, 47,192,106,119,222,113,227,141,145, 66,155,249, 21,233, 42, 77,174, 21, 4,101,210,228, 67,132, 53,166,138, 8,233,
+106,130,196,175,183,234,196,160, 53, 71,133,154, 8,185,184, 89,250, 30,253, 71, 23, 58, 21,157, 90, 49, 37, 53, 92,123,157,167,
+231, 70,205,235, 9,125,166, 88, 18, 84,247, 5, 82,157, 48,229, 15,106,141,114,124, 41,168,156,144,148, 98,229,123,142, 29,207,
+ 26, 88,151,149, 45, 0,195,128,121, 89, 48, 89, 43, 85,132, 2,233, 12,149, 21,126,254,179,159, 99, 93, 22,108,119, 91,156, 78,
+ 30, 70, 27,108, 54, 19, 62,123,249, 57,230,213, 97, 5,224,220, 10,173, 53,230,117, 69,202, 9,175, 31, 18,238,118, 27,108, 55,
+ 27, 44,206, 75,133, 24,144,117, 68,212, 10,214, 14,146, 85, 46, 85,101,206, 88,125,194, 52,104,140,211,200,130, 7,239, 48,104,
+ 13, 51,106,252,244,139,159,129, 50,123, 57,163, 40,186,189, 99,208,205,186, 58,172,235,140,101, 93,177, 44, 11,220,178, 98,241,
+ 14,222,121, 92,150, 21, 79,167, 51,158, 46, 51, 92, 74,152,221,130, 81, 20,242, 60, 30,146,117, 70, 74, 18, 92,147,170,175, 84,
+105, 38,163, 13,145,133, 76,164, 20,211,232, 68,241,159,137,125,193, 41, 70, 25,137, 71,228, 19, 56, 84, 99, 24,241,254,221, 43,
+252,219,167, 71,252,171, 63,255, 19, 28, 47,174, 86,181,201,205, 88,150, 11,119,189, 68, 56, 94, 14,216,232, 8,239, 35, 46, 33,
+ 96,180,134, 47,252,172,145,194, 10, 23,121,183, 22, 83, 68,202, 10, 33,122,193,214, 70,132,153, 57,234,243, 60,195, 88, 46, 42,
+ 82, 78,176, 90, 33,196,150,244,118, 62,241, 58, 37,132, 0, 59, 76,240,110,198,229,124, 98, 97,150, 80,215, 84,240,128,214, 53,
+ 73, 13,178, 91, 50, 10,176, 90,215, 8,209,209,106, 28, 47, 51, 39,176,109,183, 56, 60, 61, 49, 13,142, 50,110,246,123, 60, 61,
+188,199,221,118, 39,150,195,136,115, 88,112,184, 44, 60, 91,154, 23,236,183, 91,209, 42, 16, 82,140,162,201, 0,236,200, 69,157,
+ 79,132,209, 14, 8,110,129,177,166, 93,130, 57, 66,197, 92,227,118,181,101, 2,154,214,108, 41, 43,197,170, 66, 63,185,107, 15,
+105, 21, 2,101,192,104, 37,234,119,201, 39, 87,132, 32, 42, 99, 45,123, 58, 18,120,200,102,195,130,174,224, 22, 81, 95,183,110,
+139, 68, 8, 69, 36, 89,217,194,254,134,168,116,139, 23, 62,197,212,173, 2, 8,171, 76, 50,234,255, 47, 33, 30, 5,155,154, 36,
+169, 43,119,157, 62, 73,220,169,146, 17,107, 47, 38,202,104,180,181, 10,191,202,215, 23, 96, 57,144,181, 54,242, 53, 25,229,155,
+113,157,230, 88,116,228,170,116,240, 18, 52,226,131, 7,228, 48, 78, 50,242, 84, 74, 33, 33, 86,135, 77,137, 53,245,137, 83,228,
+ 94,189,122,133, 87,175, 95,203,174,157,153,251, 90, 21, 16,144,146, 16, 23,141,113, 28, 25,208,179,221,224,230,102,135,221,118,
+131,113,180,205,134,148,233,218,210, 89,219,160,238, 44, 44, 65, 45,170,199, 53,231,102, 72,169, 19,146, 84, 65, 37, 53,143, 65,
+118,156,101,159, 95, 11,127,116, 65, 65,212,225, 34,101,218, 55, 47, 11,150,101,133, 82, 84,179,208, 67,240, 32, 16,172, 53,248,
+248,126,135, 87, 2,166,185, 44, 14,187,137, 99,164, 51,184,160,139, 49, 66,203,234,168,128, 90,114, 17,120,166,116,117,137,104,
+173, 56,240, 37,112,161, 91,178,217,189,104, 54, 82,206, 80,150, 29, 76, 49,103, 14, 37,146,113,175, 74,157, 5, 51, 43, 36,233,
+232, 81, 29, 5,173,225,227,103, 68, 93,193,108,218, 4, 73, 65,105, 11,107,173,240,236, 93,183, 58,234, 56,241,101,204,156, 59,
+ 49,153, 86,173, 67,143,158,163,118,203,123,210, 45,162,235,222, 89, 92, 36, 90, 10, 1,146,231, 50, 9,215,132,186, 73, 76,134,
+170,147, 28,166,253,178, 19,168, 4, 16,149, 41, 67, 41,170, 10, 1, 82, 27,211,220,242,221, 5, 15, 42, 2,202,171,132,237,171,
+203,191,238, 20,114, 99,194, 36,180,181, 15,149, 63, 95, 45,199,244, 65, 52, 58, 96, 72,246,226,185,236, 9,122,127,122,191, 47,
+ 74,185, 51,245, 39, 94,236,151, 15,119,237,232, 75,112, 0,170, 80, 36,167,136,255,235,223,255, 45, 64,138,233, 69, 18, 7,121,
+127,123, 7, 59, 12,120,120,120,143,219,155, 27,120,183,192,175, 17,251,155, 61, 30, 31, 31, 49,140, 35,158,125,244, 9,222,124,
+255, 93, 7,170, 80, 8, 49,193, 45,172,168,214,118,196,186,206,200,195,136,249,112, 96,116, 96, 78,200,164,160,149,198, 52,142,
+ 80, 57,130,200,194,104,128,180, 97, 91,146, 2,126,250,147, 95,224,230,246, 14,154,248, 64,135, 28, 72, 41, 38,246, 82, 75,230,
+121, 8, 17,193, 57, 4, 65,125,134, 16, 69, 81,237,176,172, 43, 94,189,125,135,255,244,187,223, 99, 17,184,142, 34,130, 17,104,
+ 69, 78,172,210,174, 35, 63, 99, 17,205, 0,138,171,164,173, 36,153,104, 20, 97,150, 88, 90,150,153,163,250, 36, 69,200,131,249,
+243,227, 56, 49, 61, 45, 94,240, 31,127,243, 59,252,197,207,127,134, 20, 46,176,102,128, 74, 14,214, 90,100, 1,163,104,176, 45,
+198, 88,203,163,241, 11,143,149, 24, 11,169,129, 28, 17,200,224,114,153,161,144, 16, 69, 4, 20, 98, 70,138, 11,231, 93,231, 8,
+183, 6,113, 10, 4, 16, 89,104,120,184,149,185,253,202, 12,128, 95, 97, 69,212,118, 56, 29,112,123,255, 12, 97,157,187, 36, 48,
+ 45, 7,104,179,109,113,171, 38,187,125,165, 96, 40, 99, 48,132,155, 79, 94,224,124, 58,227,253,241,137,109,144, 68,120,253,248,
+ 8,163, 53, 30, 78, 23, 40,173,241,195,251, 7,196, 24,113, 60,115, 58, 95, 72, 92, 61, 43,245, 84,167, 70, 57,103,140,150,167,
+ 55,251,201, 66,155, 1, 20, 28, 92,140, 32, 33,107,241,131,167, 59, 26,111,102,241, 37,120,114,162, 72, 55, 27, 96,202, 24,182,
+183, 56, 47,223,179, 72,175, 2, 50, 84, 61,164,203, 65, 74, 74,186, 89,213, 82,240,250,157,241,110,119,139,253,237, 0,165, 53,
+ 46,151, 19,150,101,150,231,152,119,210,177,184, 17, 20,175,103,120, 84,159,234, 37, 25, 83,148,213, 78,172,210, 91,163,217,238,
+ 3, 48, 16,131,100,132, 90,196, 98, 33,116, 30,228,124,237,251, 46,188,249, 30,114,209, 60,201,162,213,232, 68,129,229,231,213,
+226, 3, 46,255,241,222,183,248, 72, 38,202,212, 85, 20,251,252,181, 76, 11, 50, 92,240, 53, 4, 71,139, 45,142, 47, 69,212,215,
+178, 37,248,101,201,191, 38,124,250,249, 47, 96,135,145,211,241,228,213, 45, 99,102,173, 13, 35, 50,181,173,118,167,101, 89,112,
+ 20, 85,119, 33,127, 89, 99,177,221, 50, 29,108,179,153, 48,109, 38,104,165, 48, 12,124,169, 24,201, 34,168,249,221,210,173,246,
+145,165,125,128, 81,150,247,162,240, 3, 10,236,252,195,223,251, 33,231, 41, 21,134, 68,207,138, 23, 17,241,229, 60,179,158,164,
+116,182,162, 83,178,134, 11,167,219,221, 22,143,167, 51,150,213, 99, 94, 61,172, 82, 72, 70,193,104,110,154,216, 43,205,175,127,
+ 22,193, 87, 34, 22,218, 53,158,133,136, 26,115,141, 0,226,172,128, 16, 16, 66,170,159, 25,136, 90,221,106, 17,230,137,168, 80,
+151,162, 82, 16,203,168, 99,106,254, 89, 67,160,142, 91, 80,112,169, 92,168,182,108,151, 12, 69, 70, 16,174,140,125,141,114,161,
+ 55,122,129,172,125,160,234, 10,170, 8, 80,149,230, 21, 26,129, 47,244, 20, 99, 11,152, 98,245,217, 7,250, 13,118,149, 24, 99,
+ 36, 14,155, 21,235, 73,222, 63,212,181, 66,157, 79,203,132,170,189,111, 33,114,218, 97,133,121,149,100,190, 92,166, 13, 90, 66,
+138,114, 21, 41,215, 66,176, 76,197, 20, 65,101,125,245,239,139,174,166,165,222,112,243,144, 68,151, 83,211,250,114,139,225,206,
+153, 58, 39, 5,106,112, 77,141, 27,107,220,234, 46,140,179, 23, 58,168,134,174, 77,189,118, 85,144,119,169, 27,227,167,196, 54,
+128,193, 90,120, 15, 60,205, 1,195,184, 97,200,140,115,136,126,197,110,183,131, 95,103,236,182, 91, 56,183,226,102,191,199,155,
+183,239, 16, 18, 63,208,239,222,190,197,110,191, 71,136, 17,227, 56,178, 82,156,120, 92,124, 10,252,224,196,101,133, 34,197, 93,
+181,243, 24,134, 12, 69,153,133, 79,137,171,202, 97,208,152,151, 5,119,183, 55, 60,234,181, 22, 46,120,252,228,179,151, 24, 44,
+243,128,149, 84,139, 53, 63, 29, 55,200, 49, 34,250, 21, 17,132, 36, 35,237,156,185, 0,112,206,113,226,151,243,184,191,185,193,
+237,102,194,223,253,238,247,120,245,116, 98,219, 20,128, 1,188,103,215, 50,114, 11,118,100,206,251,186,240,235,152, 98, 75, 75,
+206,133,233,156,228, 0, 39,134,117,100,142,118, 45, 89,220,164, 8,214,142,220,209,231,140,175,254,248, 61,126,254,249, 75,104,
+197, 24,210, 28, 29,160, 12,220,186,176,152,112,216,224,178,176,205, 43,197, 0, 23,185, 51, 50,102, 0, 0,204,203,133,125,151,
+ 74,236,100,222, 65, 41,230,170,187,101, 22,126, 53,213, 11,207,173, 11,130, 36, 85,197,156,145,227,202,217,221, 68, 56,157,158,
+176,191,123,134,199,247,239,176, 25, 7, 30,177, 3,136,224,176,135,242, 73, 85, 41, 99,118, 43,211,226,172, 70, 86,132, 81,141,
+120,247,116,196,112, 89,112,186, 92,224, 3,107, 0,222, 61, 60,226,178, 58,188,121,255, 8, 34, 96,176,156,240, 53, 14, 3,246,
+219,109, 29,241,150,163,195,197,128, 16,184, 67, 94, 86, 7,191, 46, 32, 34,248,156,184, 19,200, 30,160, 1, 8, 14,154, 52,204,
+184,133,247, 43, 98, 74,178,123, 52,213, 9,145,145, 43, 86, 82, 41,194,254,230, 5, 94,191,123, 5, 13,238, 2,137,248,162, 34,
+ 1,203,100,185,224,139, 46,149,169, 89,130, 7, 5, 19,215, 62,253,217,159,226, 87,191,254, 43,124,253,251,127, 68,142, 17,135,
+195, 3, 63, 43, 70, 66,125, 74,180, 45,181,207, 69,207,248,103, 1, 95, 27, 33,151,221, 95,185, 36,123,156,100, 25,209,131,174,
+115,253, 42,229,170, 67,158, 50, 36, 68, 60,177, 98, 99,165,254, 12,233, 32, 41,236,228, 80,146,104,197, 32,153,186, 30,164,182,
+ 35, 86,132,122,145,243,133,145,224, 66,148,213,133,170,249,221,101,239, 90, 84,209,229,139, 38,234,108,113, 74, 97,123,115, 15,
+ 45,133, 80, 29,197, 42,141, 24,115, 5,158, 80, 7,177,209, 68,236,191, 86,154,139,118,197, 23,117, 10, 60,129, 3,169, 86,112,
+ 10,146,215,104,141, 97,176, 24,172,197, 56,141,221,255, 26, 12,195, 0,107,116, 75,205, 43,232,110,249,158, 73, 20,241,169, 19,
+ 98, 85,241,112,239, 86, 41,239, 95,234,160, 93, 41, 85,255,118, 8, 65,252,233, 76, 41, 51, 36,226,196,148, 16, 37,195,222,104,
+133,143,238,110,241,237,171,183,200, 57,227,180,172,216,142, 22, 49, 41,232,168, 48, 14,131,136,244,216, 78, 9, 81,184,147,116,
+168, 5, 87,220, 59, 1, 82, 98, 77,146, 11,178, 6, 73,237, 53, 13, 41,179,107, 3, 84, 11, 60, 30,203, 43, 80, 23,247, 90,138,
+ 28, 77, 4,167, 88,224, 90, 20,235, 37, 19,128,100,202, 87, 71,248, 70,226, 94, 99, 96,238,188, 32, 92,123,221,199,191, 20, 34,
+ 94, 38, 52, 4,133, 40, 66,219, 92,248, 28,229,106,170,141,108, 75, 82, 44,227,246,148,120, 58,219,231,152, 87,130,100,241,178,
+103,213,222,191, 18,193,144, 50,162,128,127, 74,248,149,214,188, 14, 86,134, 95,219,171,140, 57,209,167, 20,251, 99, 3,250,116,
+ 51,240,122,153,231,106, 83, 79,226, 78, 66,167,245,160, 78,253,142, 30, 18, 87,158,213, 18,174, 83, 21,156,169, 64, 31, 80,255,
+ 34,244, 98,128,174, 42,104, 26, 0, 25, 95,201,155, 75,242,197,198,209, 34,172, 30, 33, 69,188,125,255, 30,151, 35,167, 14, 21,
+ 18, 87,148, 74,108, 24, 6, 16, 1,203,204,251,219,209,104, 44,222,215,124,227,113, 28,241,211, 47,126,138, 63,252,225,107, 40,
+ 69,204,134,183, 28,163,248,209,253, 61, 82, 88, 16, 51, 71, 15,238,119, 27, 56, 31,177,174, 14,187, 45, 48,142, 76,167,123,247,
+120,128, 85, 92,145,221,223,221,113,245,171, 52,127,240, 99, 4, 52,131, 52,202, 72,144,233,249, 50,122, 10, 19, 82, 78,114, 17,
+103,228,152, 16,188,195, 96, 12,140, 34, 56,249, 59,206,251, 29, 62,187,191, 69,112, 14,143,142,253,234, 62,183, 28,244,164, 8,
+ 8, 30, 90,172, 74, 40,158, 78, 81, 40, 27, 99,176,134,165, 22, 80,193,175,108, 3, 75,177,210,170,188,247, 80,202, 97, 48, 22,
+198, 24,248,224,145,130,195, 63,126,249, 21,254,234,207,127,129,135,199, 71,108, 54, 19,172, 85, 88, 66,146, 92,236, 21,155,113,
+226, 21,136, 86,192,234,132, 43, 0,134,192, 24,141,152, 19, 46,167,115, 77, 72, 35, 75, 8, 98, 33, 9,222,179,239, 60,103,132,
+101, 70,140, 30,118, 24,225,221, 2,109, 44, 98,138,172,248, 6, 48, 78, 27, 60,189,127,131,205,118,207, 58, 9,241, 94, 91,201,
+168,103, 50, 31,175, 25,140,102, 97,212,193,241,133,252, 72,151,202,166, 54,154, 39, 44, 70, 41, 60,191,191,197,167,118,148,140,
+231,124,133,193, 76,162, 50, 46,249,246,107, 8, 48, 94,193, 26, 96,245, 30,195, 48,193,166,128,211, 18,112,187, 27,144,192, 64,
+137,228, 22, 64,113, 34,149,146,241, 36, 17, 91, 95, 20, 1, 89,105,164, 28, 57, 97, 45,133, 42,102, 58, 29,223,193, 24, 3,104,
+194, 40,150, 25,206,235,230,157,162,209,138,181, 12,154,233,134,154, 84, 21,195,105,109,241, 95,253,247,255, 11,220,122,193,111,
+254,254,223,227,179,207,191,192,215,127,248, 13,214,117,198,167,159,255, 28,199,167,247, 64, 78,184, 92,206,149,134,213, 35, 81,
+203, 84, 44, 83,147,227, 37,168,122,104,148,125, 27,186,145,110,198,181, 18, 28, 29,139,160,221,214,125,174,119, 63,201,235, 72,
+ 95,185,112, 39,132, 64,150,128,213,187,254,143,180,179, 86,208,180, 74, 72,124, 25, 25,171, 15,181,184,208, 74, 87, 65, 47,211,
+ 32,181,248,248,155, 93,174, 48,208,249,123, 84, 69, 14,142,205,118,143,243,249, 88, 47, 36,146,152, 80, 72,214, 60, 50,187, 41,
+216,159,223,198,158, 25,145,109,100, 34,198, 99, 97,107,172,118,197,242, 90,123, 57,108,231,165,144,252,248,253, 29,236, 0,165,
+185,195,183,214,182, 75,127,100,167,134, 54,186, 50, 16,202,152, 56,161,243, 47,231,134,120,174, 46,252, 12,225, 25, 52, 59, 84,
+225, 27,172,235,138,167,227, 73,208,163, 30, 86,163,178,238,147,207,117, 13, 51, 13, 6,207,111,183,120,243,112,132,143, 9,171,
+ 7,108,182,200, 70,193,100,137, 33,202,177,134,204,196, 74, 89,227,119, 77, 43, 18,193, 25,234,164, 40,202, 20, 53, 22,184,137,
+ 76, 17,188,247,140, 70, 53, 70, 38, 74,186, 22,102, 74,166, 67,157,167,161,173,172,100, 21, 86, 88,241, 41,147,136,137, 69,116,
+ 36, 54,187, 16, 56, 90, 57,117, 19,142,148, 62, 20, 34,230,214,181,139, 61, 24,160,235, 11, 93, 22,101, 53,179, 66,181, 60, 18,
+173, 76,141,105,141,177, 64,108, 82, 39, 84,149,220,134,186,177, 38,177,186,209, 7, 57, 25,185,174, 68,202, 32, 70, 19, 33,203,
+231,165,172, 93,115,111, 15,207, 29,177, 80, 92, 46,185,195, 63,151,125,255,149,199,191,236,236, 43, 42,186,155,156,119,187,173,
+220, 58,109, 94,245,100,192,212, 25,190, 84,132,197,246, 64,169, 64,101, 62, 84,103, 18, 58, 11,167, 28, 54,101,244,196,223,248,
+104, 6,248,229, 12,163, 13, 12,162,140, 24,211,149, 85, 70, 43,133,101, 94,240,240,244,136, 47,126,250, 5,190,252,221,111, 48,
+142,155, 58,194,218,237,246,248,246,155,111, 48,142, 3, 62,121,249, 18,143,111, 95, 35,102,141,243,188, 98, 26, 44, 94, 63, 60,
+225,229,243, 91, 28,207,103,196, 4, 44, 11,123,116, 9, 96,181,121,136, 24,198, 17,119,251, 13,166,113, 64,240, 14,167,211, 17,
+251,237, 6,251,253, 45,130, 91,225,172,174,226, 14,196, 12,178, 3,195, 25,202, 74,193, 90,164,232,101, 68,152, 68,128,198, 10,
+109, 99, 45, 82, 6,172,181,149,171, 60, 17,112, 99, 53,244, 52,225,233,120,225,106,142,154, 42,153,243,126, 91, 78,118, 28,221,
+121, 20, 0, 0, 32, 0, 73, 68, 65, 84, 97, 2,135, 16, 96,180,230, 40,205,148, 48, 12, 35, 31,114, 49, 32,228, 12, 34,230,107,
+ 47, 0,110,119,219,154, 67,157, 64, 88,151, 25,255,225,159,190,196,175,127,249, 83,120,239,176,204, 71, 56, 31, 17,136, 48,109,
+182, 88,150, 51,180, 34,172,235, 42,163,207, 0,172,171,236, 75,139, 42, 29,152, 47, 39,104,109, 48,207,103, 57,104, 88,100,200,
+214, 60, 14,250, 80,218, 96,157, 47, 0, 8,126,229,247, 52,146, 71,244,236, 75, 31,134, 13,214,117, 65,118, 75,173,242,189, 92,
+200,178,212,101,101,170, 34, 24,163,176, 29, 71, 76,211,196, 22, 25, 73, 81, 82,154,131, 86,204, 96, 96, 4, 82,226, 3,175, 20,
+140, 33,108,199, 9, 65, 70,207, 49, 43, 88,107,176,174, 14, 91,163,112, 9,156, 70, 54,104,133, 85, 70,137,211, 48, 32,102, 96,
+ 48,252, 51, 45,164,225,115,128, 78,132,203,124,168,147, 39,228, 12,239,146,140,215, 53, 66,116, 60, 49, 17,225,220, 50, 31,249,
+ 82,130,146,110,213,192, 14, 60,250, 11,209,195,135, 82,236, 74,215, 47, 74,243, 97,220,226, 23,127,249, 95, 3,209,227,171,223,
+254, 61, 62,255,252, 11,124,247,199, 63,192, 59,143, 63,253,245, 95,227,240,248, 14, 63,255,249,175,240,207,255,252, 37,239, 43,
+235,248,176,219, 39, 94, 41,166, 5,133, 89,216,254, 68,141,197,223, 25,204,175,163, 66, 59,139,150,236,237, 83,205,119,104, 23,
+ 60,195, 81,174, 71,122,197,147,235,188,111, 33, 83,212, 1,168,228,107,112,231,198,170,127, 31,162,128, 72, 88,217,100, 69,231,
+193, 16, 16,192,104,158, 6, 5,121, 30, 26,133,174,233, 22,122,150,194,179,231, 31,195,185,133,207, 38,105,143,130, 36, 39, 34,
+122, 57,240, 68, 79, 81,116, 14,133, 8, 39,187, 94, 2, 31,188, 68,169, 30,148,141, 5,159,121,149, 16, 81,221, 9,188,146, 24,
+106,183, 31,148,135,211, 26, 23, 69, 32,101,170,175,123, 18, 12,239, 52, 14, 24, 71, 11,107,117,131,228,116, 68,177,154, 65, 90,
+ 70,239,185,165,189,101, 89,111,198,148,113, 62, 95, 48, 95,230, 26,174,146,229,251,140,221,110,191,236,249,183,155, 9,227,233,
+130,217, 7,172,158, 19,223, 72, 19,230,213, 99,208,168, 5, 98,206,226, 91, 55, 66, 86, 85, 45, 20,136,136,217,121, 70,107, 24,
+165, 16, 17, 49,144, 98,161,177,176,249,139, 6, 35,102,158, 60,162,123,207,203, 74,245, 58,187, 49,131, 96, 96,117,155, 34,165,
+220,222,231,148, 89,173, 30, 51,113,218, 97, 10,200, 41, 86,184, 89, 11,114,233,186,122,233,152, 11, 76, 41, 20,254,187, 92,232,
+ 21,161, 44, 99,111,116,177,188,101,188,159, 69,255, 83, 10,141,246, 76,168,122,161, 87,132,112,105,100, 85,211,207,160, 23,186,
+149, 75, 93,166, 99,163, 53,176, 98, 89,165, 46,144,173,191, 59,171,141, 79, 53, 75, 95,238,156, 47,213, 62, 41,138, 55, 77,189,
+230,163, 83,182, 41,234,138, 1, 41, 26, 40,115,212,110,206, 48, 21, 57,154,249,165,201,221, 30,228,106,148, 33,197, 64,238,162,
+222,250,240, 15, 82,141,129, 28, 51,119,159,236,239,107,160,135, 78,159,143,101, 93, 17,115,194,243,251,123, 28, 15, 7,124,254,
+249, 79,112, 58,159,241,248,250, 45, 70,137, 87,188,127,246, 12,209, 59,124,243,205, 55,184,127,118, 15,157, 19,242, 49, 85,166,
+248,219,167, 19, 70,163, 56, 86,114,117,216,140, 6,171, 11,208, 74, 97,204, 28,187, 58,142, 35,156,115, 32, 0, 55,155, 1, 79,
+199, 19,126,242,217, 79,177,174, 75, 3, 80,132,128, 56, 88, 88,201, 69,231,240, 24,146,253,144,146, 49, 15,160,192,136, 64,181,
+240,235,165,228,131,146, 42,186, 16,208, 57, 35, 44, 43,158,221,108,241,238,120,169,149, 99,181,104,149,167, 92, 48,177, 73,138,
+138,154,177, 77,140,161, 76,242,247, 71, 25,161,217, 97, 4,114,194,225,116,196, 48,140,184,191,185,129,209, 26, 11, 41, 44,203,
+140,239, 94,191,197,198, 50, 39, 95, 17, 23, 57, 57, 7, 30,147,122, 22, 91, 45,203, 42, 62, 74,131,203,124, 70,130, 70, 78,129,
+199, 71, 49, 32, 56,199, 43, 0, 17,102, 37,137,118, 44,213,107, 92, 56,101,174, 28,206,165,111, 44, 93,150,243, 71,246,178,102,
+ 96,183,217, 2, 41, 66, 41,205, 41, 98,214, 98,148,162,139, 81,139,185,218, 82, 70,197, 85, 40,231,156,139, 99, 33, 71,132,144,
+ 68,112,166,152,131,175, 20, 86,199, 66, 71,154,184,152, 58, 28,142, 48,214,226,116,186, 64, 33,227,102, 51, 97,245, 12,178, 25,
+134, 1,137, 44,182,211,196,185,218,210, 85,251, 8, 28, 87,143,152, 86,254,204,103, 84,181,184,214, 10,251,237, 22, 91,165, 65,
+ 72,188,206,209, 3, 92, 98,155, 38,233,194,131, 39, 65,178, 18, 84, 22, 11, 19, 17,146, 68, 59,150,157,233,199, 95,252, 41, 62,
+249,248, 37,254,223,255,231,255,128, 85,192, 31,190,252, 7,196,156,241,236,197, 75, 32, 5,188,252,244, 51,188,122,245,157, 84,
+232, 81,188,170,213,240,212, 17,165,122, 64, 71,139,175, 42, 33, 61, 84, 32, 82,170,137,108,128,198,142,238, 21,223, 87, 97, 16,
+117,103,153, 59, 97, 81,167,205,238,198,160,170,252, 89, 25,209, 91,165, 49, 88,177, 31, 5, 22,200,213,168,102, 2,180,230, 73,
+149,151,207, 11, 17,115,247,163,119, 18,179,137, 42, 50,227, 85, 66,110,140,116, 97, 56,220,222, 61,135,182, 3, 79, 39, 82, 98,
+241, 97,104,194,169,242, 99,232,210,140, 72,231, 25,130,231,148,198, 68, 80, 70, 35, 69, 94,167, 52, 27, 21,143, 77,179,172, 11,
+229,182, 99,167, 66, 82,200, 68, 88, 83,134,210, 36, 54, 74, 57,176,165, 24, 47,132,200, 40,142,158, 39, 98,214,254, 56,114, 39,
+191,221, 78,108,197, 84,212,241,192,203, 33, 44,184,234, 4,204,243, 82, 87, 47, 41, 38, 28, 79, 39,129,159,176,235, 33,146, 66,
+ 68,170, 23,137,214, 74,190, 38,255,204,207,110,118, 88,222, 61,129,180,170,121,224, 49, 49,148,107, 48, 74, 20,236,162, 54,175,
+ 26,135,102,119, 99,147,135,194,150, 20, 82, 72, 24, 20, 97,208, 26,131, 97,228,112,206,153,249,255, 66, 14, 85, 31, 36,139,149,
+ 80,163, 84,149,229, 60,150, 15, 84,183,210,205,235, 45,133, 94,130, 22,113,175, 7, 74, 92,173, 82,160,174,200,170, 81,223,185,
+ 7,222,176, 8, 77, 43, 37, 52,203, 40, 80,151, 78,200,157, 75, 88, 27, 73, 46, 3,239,236,179, 64,204,120,122,214,207,173, 21,
+148,106,172,244, 10, 96,162, 30,199,219,249,206,202,231, 53, 95, 27,230, 6,195,110,139, 97, 48,149,231,208,243, 94, 74,180,111,
+161,127,170, 92,138,187, 22, 38, 85, 92, 84, 84,214,118,157,181,173, 88,229,170,117,174,144, 21, 37,194, 55, 75,190,123, 76, 9,
+166,224, 96, 81, 87, 64,185,138, 84, 62,140,229,164,235,184,236,102,241,233,114,182,145,129,243,229,130, 65,177, 64,230,213,187,
+247, 87, 21, 87,169,200,207,231, 19,180,182, 8, 41,224,249,199,159,224,116, 60,226,229,167,159,226,124, 62,195,199, 92,199, 70,
+203,186,226,238,102,143,249,116,130, 15, 14,199,243,140,237,200, 17,120, 75,140,208,138,115,208, 99,140, 88, 29, 43,205,125,136,
+240,145, 11, 11, 64, 65,143, 22,163, 81, 32,109,224,206,103,164, 20,113, 57,159,171, 69, 97, 24, 7,120, 63,194, 14, 28, 38,227,
+ 36,242, 82, 73,220, 95,161, 5,229,200, 86,132, 24, 69,213,158,129,117, 89,112,185, 92,164,115,160,234, 79,245,171,195,222, 26,
+ 92,132, 23,206,227, 71, 85, 88,147, 8, 98, 73, 42,158,199, 50, 70, 85,138, 69, 78, 10,128,119,107, 21,204,173,203, 5,118,152,
+176, 96,193,205,118,131,199,227, 9,251,205,132,176,206, 80, 74,225,241,233, 8,251,236, 22,131,213,140,110, 93,206, 80,224,206,
+217,133, 12,173, 9,231,203,140,148, 18,156, 23,165,113,249,218,242, 36,104,226, 61,169,210, 13, 75, 91, 20,224,133, 39,205,196,
+ 37,230,139, 71, 17,103, 89,107,171, 82, 56,202,254,104, 59, 14, 34, 50,226, 3,113,144, 4,175, 65, 19,156, 95, 97,181, 18, 81,
+ 23,139,101, 40, 39,140,195, 84, 89,236,132,140,253,198,226,178,240,195,120, 58,173,184,187,187,129, 53,252,193,118,235, 10, 23,
+ 2,150,203,140,140, 25,187,221,150, 99,111, 9, 80, 70,195,173, 11,180, 68, 88, 62, 61, 62, 96, 24, 55,120, 58,159, 17, 51, 7,
+ 10,109, 4, 98,193,106,222, 92,199, 93, 73, 20,190,196, 32,119,100,240,186, 71,155, 17,201,157,197,162, 86, 32, 25, 53,246, 2,
+ 74,177, 51,160,165,100, 1, 80, 19,126,242,197,159,224,251, 63,126,133,249,244,136, 89, 28, 16, 47,127,254,103,216, 76, 91,156,
+ 78, 7,252,238,219,127,192,180,217,193, 26,141, 21,116, 21,167, 88,187,238,122, 17, 83, 29, 14,182,234,190, 37, 65, 21,243, 87,
+ 46,222,221, 58, 66, 85,173,125,239,141, 91,181,210,199, 21,156,165,159, 9, 52,124,173,208,215, 20,107,101,202,119, 18, 98, 16,
+181,123, 81,239, 83, 85,109,199, 34,240,147,239, 35,228,216,165,172,253, 11, 30,251,202, 76,226,127,247,226,227,207,248, 34, 78,
+ 76,228, 82,213, 62,213,210,209,202, 33,216, 3,127,178,136, 7,203,197,227,157, 32,124, 99,179,228,130,148,116,121, 16, 30, 64,
+100,113, 98,100, 54,129, 86, 37,182,153,199,251,218,104,168,208,212,246, 81, 49,243, 97, 93, 23,217, 83, 43, 33, 31,122, 92,136,
+216, 90,105,184,160,157, 70,203, 93,188, 49, 85,132, 87,184,249,239, 31,158,112,190,156, 89,237,157, 18, 30, 30,222, 35, 70, 86,
+171,167, 24, 16,164, 16, 40, 64,164,152, 74, 0, 77,130, 82,156, 23,191,223,110,176, 6,110, 18,156,103,235,111,204,204,121,135,
+ 92,198, 90,243,179,110,149,170, 54, 53, 34,130,209,138, 59,204, 65, 97,171, 53, 12, 1, 86,115,215,105,140,174, 34,189,217, 57,
+ 92, 92,192, 90,180, 87, 5,126, 82, 2,138,228,235,151, 73,149, 49, 6,148, 51, 38,177, 36,198,106,245,213,194,236, 96,116,184,
+234,206, 64, 74,212,184, 3, 31, 4, 73, 18,105,144, 50,156,242, 86, 98,119,235,158,186,227, 61, 80,123, 30,141,182,252, 94,201,
+184,189, 23, 99,214,191,185, 20,193,164,174,247,220,249,195,130,184,129, 97, 82, 85,166,183,175, 91,116, 54,197,105,194, 52,190,
+150, 90,199,221,109,170,211,168,212,255, 93, 41,212,206,190, 20,244, 81,206, 64,234, 92, 23, 68,169,165,253,137,115,170,159, 32,
+100, 1, 67,153,171, 0,238, 2,144, 64,170,108,220,171,196,161,126,158, 80,195, 39,218, 53, 95,237, 61, 82,181,198, 16,240,205,
+ 15,175,234,136,161, 7, 92,188,122,253, 6,159,125,250, 41,136, 8,175, 95,253, 0,183,174,120,247,246, 13,163, 17,237,132,121,
+225,240,148, 97, 28, 49,141, 35,110, 83,196,251,119,239,176,223,237, 49,207, 11,139,136, 60,103,105,175,206,215,186, 98, 94, 61,
+175, 18,214, 0,173, 61, 92, 72,176,154,224, 92,144, 14, 68,225,241,241, 17,110,101, 94,246, 48, 77,216,108, 54, 24,134,145,253,
+173,118,132, 86, 4, 51,142,188,131, 81, 26,144, 44,246,178,219,114, 33, 96, 94, 22,172, 62,224,233,112,192,225,120,196,229,178,
+180,221, 18, 1,161,172, 47,186, 68,157,218, 96, 21, 31,169,188, 94,170,179,213,164,204, 88,200, 40, 74,245, 16,121,123,106, 44,
+ 23, 50, 33, 68,188, 63, 28, 49,142, 35, 22, 71,216,111, 38,156, 93,192,236, 60,230,213,129, 48, 0,164,176,217, 63,227,157,246,
+198, 2, 98, 87, 25, 54, 26,195, 48,177,178, 86,105,172,203, 12,109,121, 71, 94, 86, 1, 89,246,223,195,184,193, 50,159,229,123,
+ 68,245,142,242, 97,200, 59,104,107, 52, 64,236, 72, 80, 57,177,223, 93, 25, 88, 99,112,120,122,192, 48,140, 80,138,176, 29, 6,
+132,196,159, 15, 31, 2,198,193,242,110, 93,254,110, 77, 92,105,206,203, 2, 82, 44,244,113,193,243,148, 65,194, 24,166,113,128,
+ 19, 76, 99,138, 17,122, 24,120,100,153, 51,182,219, 13, 66, 8,172,147, 32,194,233,114,134, 66,198,110,127,135,243, 60,195, 90,
+139,217,173,172,216, 86,132,232, 87, 62,156,193,123, 65, 51,108,176, 92,142, 48,118,228, 20, 38, 81, 60, 23, 71,192, 48,110,113,
+190, 28,248,123, 85,170,121,130,175,128, 18, 28,201, 24,147,170, 99,213,187,103, 47, 96,172,198,195,195, 59,158,132, 37,198, 27,
+243,154,137,240,195,119, 95,227,197,199, 47,241,209, 71,159,224,183,255,248,183, 53,101, 77, 21, 5,125,119,249, 85,123, 80, 79,
+151,234,242, 31,114,238, 16,167,104,110,131, 22,255,136, 46,202,247,199,160,182,162, 90,207,215,254,174,122,120, 89,107, 97, 37,
+224, 34,165, 40, 28,252,116,229, 33, 46, 73, 97,213,211, 47,207,125,200, 45,145, 14,185, 71, 96, 72,151,129,166, 0,206, 57,225,
+230,238, 57, 54,219,157,164,161,165,230,117, 22,111,175,214, 34,106, 45, 88,213, 10, 91,105, 34, 61,173, 10,179, 63,212,144,170,
+ 88, 68,109, 68,200,138,174,108,186, 9, 2,141, 81, 90,236,103,132, 20, 51,146, 6, 40, 71, 32,136, 16,201,106,201, 50, 96,124,
+111, 18,203,157,182, 26,218,235,122,233,151, 75,222,173, 43, 46,103, 22, 85, 26,107, 49, 12, 28,233, 60, 14, 6, 57, 71, 28, 79,
+ 71, 60, 61, 29, 5,122,146,176, 92,206,197,104, 8, 72,146, 93,209, 34,149, 25,138,146,100, 56, 37, 78,140,219,221, 22, 15,167,
+ 75,245,183, 67,115,151,157,114,134, 41,100, 67,186,198,241,148,169,131,181, 3, 70, 77,184,217,108, 96,192,129, 71,131, 49,146,
+ 34,201, 36,204,152,120,173,117, 90, 22, 60,205, 51, 46, 62, 34,200, 58,181, 36,194,149,220,248, 34, 8, 83,146,108,166, 44,167,
+ 58,106,217,119,103,112, 51, 64, 72, 44,160,181, 90,138, 20,158, 0, 70,121, 55,106,224,116, 89,201,200, 36, 38,137,168, 56,119,
+145,173,117,215, 68,252, 94, 40,161,195, 17,192, 64,175,206,198, 87, 61, 31,153, 47,113,202,101, 15,223, 68,106, 80,249,131,179,
+ 27,215, 16,157,148,171,120,174, 36,191, 23,216, 18,174, 70,237,168, 86,230,194,162,232,161, 81,232, 10, 54, 66,249, 25,115,135,
+215, 37,201,139, 23,207,122, 65, 25, 67,216,247, 49,116,155,254,118, 71, 27,116, 23, 77,181,177,200, 69,147,241, 97,214,115,171,
+ 24,114, 23, 89,135, 14, 72, 95,188,180, 49,113, 82,217,241, 50, 95,157, 31,229,114,127,245,250, 13, 62,255,244, 19, 88, 59,192,
+175, 51,182,219, 13, 14,135, 35, 94,188,120,129,199,195, 17, 55,187, 45,158,142, 39, 14, 10, 89, 87,188,127,255, 14,206, 57,108,
+242, 0, 13, 32, 0, 24, 7,139,105,154, 96, 53, 33, 64,193,175, 11,166,193,224,178,122,164, 12,140, 32,196, 16,113,184, 44,216,
+141, 6,239,143, 23, 12, 57,227,187, 63,126,135,237,134,179,165, 55,219, 45,166,105,194, 36,121,234,195, 48, 98, 24, 71, 24,239,
+ 96,237, 8, 45, 30,123,196, 8,196,136, 24, 28, 46,243,140,203,188,224,116, 58,225,237,187,119,120,122, 58, 96,150,209,118, 44,
+203,138,114,208,117,112,143, 50,173, 80,212, 52, 9, 74, 18,193, 74,110,116, 77, 28, 34,212,140,236, 32, 0, 18,173, 53,236, 56,
+ 33,197, 8,231,248,103,220, 77, 35,214,195, 17,218, 24,156,231,165, 59,212, 84, 69, 50, 34, 51,183, 88, 41,141,227,233,192,226,
+ 20,127,226,209, 99,206, 88,151, 11,239,177, 13,199, 12, 82,138,112, 11,139,182,188, 91,171,247,149, 36,144,198,104, 5, 37,118,
+ 55, 99,172,164,154, 69, 9,106, 0,206,167, 39,236,183, 91,168, 28,101, 68,141,234, 65,214, 4,204,203,204, 30,117,207, 40,218,
+193, 76,204, 5,247, 1,218, 26,104,193,212,134,192,187, 68, 99, 12, 92,136,152,180,173,151,137,150, 72,221,155,155, 29,158,142,
+ 39,108,167, 9,218,104,172,206,215, 41, 82,140, 30,131, 81,152, 93,198,118, 26,240,120, 60,192,106,219,137,202,196,242,229, 29,
+ 79, 32, 50, 91,198,148,176, 55,141, 50,152,131,135, 59, 63,225,197,199, 63,193, 31, 95,125, 47, 32, 25,211, 75,119, 68,147,209,
+ 30,250,226, 82,218,237,247,248,230,235,175,113, 58, 62,177,133, 46,103,124,252,147, 95, 96,191,191,197,111,254,241, 63, 98,154,
+ 38,252,250, 47,255, 26,127,248,242,159,228,117,166, 38,140,169, 23,181,170,153, 11, 77, 44, 67, 53,148,168,145,227,114,167,121,
+201, 87,249,236, 87, 23,124,238,163, 53,187,125,122, 73,249,171, 78, 22, 86,132,219, 34,246, 76, 9,115, 88, 58,123,157, 18, 47,
+116,190,178,245,229,171, 62,168,169,225, 83, 23,109,122,117,189, 84,113, 89,194,238,230, 30,219,221,109,237, 58, 74, 19,160, 72,
+ 85, 91,145, 22, 31,120,193,241, 42,106, 59, 95, 37, 47, 26, 73,172,110,204, 65,104,151,234, 90, 21,196,234,195, 58,226,143,129,
+ 19, 31,145,203,234, 43, 1, 58, 23, 25, 72,221, 99, 43,109, 42,225, 44,248, 22,179, 27, 17, 17, 83,224,168, 91,173,144, 36,246,
+ 54,139,147, 71, 41,133,168, 13, 86,231,112, 62,203, 24, 89,243,127, 31,222,191, 7, 41, 35,254,106,246,146, 47,203,204, 93,189,
+162, 90, 64, 87, 40, 76, 74,213, 26,104,180, 70, 22, 27, 21, 55, 46, 2,148,138, 9,131,209,112, 33,194, 78, 76,245, 75, 57, 99,
+180,230,234, 51,171,133,249,190, 25, 7,220,108, 38, 76,198,192,128,247,195,163,181, 98,253,226,224,172,197, 57,220, 58,135,237,
+233,130,135,243, 5,135,117,197,188,186, 42,106,131,172,225, 10,147,131,121,255,156,178,166,141, 17,235, 95, 18, 55, 73,233,240,
+ 51, 0,141, 36, 2,175, 18, 64,132, 16,234,219, 21, 37,196, 8, 2,111, 42, 43, 74,245, 47,164,200,241,133,206,225, 89,172,221,
+ 42,221,124,115,121, 48,150,181,123, 94,174,226,100, 85,109,222,187,152,203, 46,157, 61,183, 78, 25,169, 66,125, 84,157,188,100,
+153, 36, 65, 68,135,108,145,206,117, 18,139,150, 71,144, 27, 85, 81, 9,236,170,177, 35, 74,238, 75,170,241,217, 16, 18,222, 85,
+210, 92, 17, 88,150,114, 79,160,102,166,167, 34,166,130,168,140, 9, 89,229,142,170,131,138,108,164,234,117,101,224,255, 85, 60,
+ 34,181, 63,159, 84, 70, 10,190,143, 2,175,176, 21,133,140,227,229, 12, 59, 12,112,222, 99,216,236,112,120,122,194,139,231,207,
+ 16, 99,130, 38, 96,218,108,161,181,193,187,135, 71,108,119, 59, 12,199, 39, 16,177, 2, 62,198,136, 16,131,116, 77, 51, 54,214,
+192,110,118,120,251,150, 97, 53,155,145,201,104, 89, 51, 40,225,112, 89,240,252,217,103,248,250,219,111, 97, 1,156, 14, 71, 88,
+171, 49, 90,131,237,110,135,221,126,135,221,126,143,237,110,135,237,118,139, 73, 58,248,146, 57,173, 69,125,156,114,130, 95, 86,
+156, 79, 71,156, 79, 39,188,123,255, 14,111,222,190,195,249, 50, 51, 57, 78, 78,153,162, 26,101,241,146, 0, 53, 4, 76, 66,170,
+216,149, 80, 31,210,222, 75, 73, 29,201, 72,107, 93,131, 61,172, 16,247,120,194, 48,241,190, 58,105,188, 61,156,160,140,169,214,
+150,197,121,188,184,221, 74, 48, 12, 79, 46, 50, 17,252, 42,138,245,152,224,252, 69,188,218, 22,126,185,200,174,145,199,204, 57,
+ 6, 12,155, 29,130, 91,196,166, 97,106,199, 51,136, 0,140,199,209, 22, 57,204, 8,129, 59, 25,173, 13, 8, 9,151, 53, 96, 59,
+ 88,156,206, 23,220, 77,172, 54,205,193,177,184, 72, 84, 89, 86,236, 67,155,113,144, 49, 19, 97,191,219,241,229,237,189,232, 51,
+ 52,140, 36, 37, 89,163,235,235, 81,246,200,243,194, 5,204,101, 89,112,179,219, 33,132,136,211,133,255,157,115,158,107,166, 20,
+225, 97,161, 40,224,120, 62,194,142, 27,228,228,133,210, 88, 94,223, 4, 91,188,195,200, 76,139, 66,230,128, 29,217,159,127,250,
+217,175,112,185, 60, 9, 98, 83,215, 98,172,116,137, 73,242,215,107,138,161,224,101, 31,222,191, 3,153, 19,134,113,130,217,108,
+241,209,103, 95, 0, 41,227,219,111,126, 15, 99, 44,166, 97,139,127,254,250, 43,188,121,243,125, 99,159, 11,158, 54,137, 85, 38,
+198, 80, 87, 98,218,244,235,155,212,226, 48,187, 43,139,174,151, 99, 29, 4,165, 76,138,114, 45, 18,218, 30,178,169,112,141,140,
+103, 99, 98, 97,167,207,249,106,229,166,181,145, 92,106,217, 65,119, 74,224, 30, 85, 75, 93, 83,208, 2, 84,164, 32, 80, 13,183,
+154, 82,194,246,230, 22,155,237, 94,194,158, 98,221,197, 42, 34,118, 17,228, 12,163,153,193,175, 20, 97,245,190, 59,208,181, 20,
+ 96,186,203, 98, 87,136,146, 15, 94,178,236, 11, 96,167, 98,198,229,123, 97, 59, 82,150,231, 48,136,248, 75, 35, 71,209, 7, 40,
+ 43, 29,169,145,241,114, 99, 33,212, 53, 75,183, 54,163,108,170,128,216,201,179,173,181, 66,134,111,207,181, 60, 83, 72, 25,222,
+121,144,226,243, 12, 49,176, 10,220,175, 8, 41,192, 40, 98,110,132,140,155, 51,184,208,175,148, 50,165,249, 96, 15,252,123, 89,
+232,198,221,125, 33, 11,198, 18, 5, 44,239,175,238,156, 1, 74, 68,193,163, 29, 48,216, 1,251,205,132, 81, 2,149, 6, 99,120,
+205, 34, 35, 94, 31,121, 4, 63,141, 35, 51, 67, 14,192, 42, 81,187, 69,167,224,124,128,143,169,193,198,141,129, 29,140, 20, 67,
+ 25, 33,121,153,180,104,121,253, 89,206,168,160,219,199, 85,183,215,151, 74,238,130,192,113,114,138, 44,204,147,103, 55,198, 80,
+ 39,198, 60, 25,177,178,130,137,149, 14, 71, 53, 78,166,233, 48, 42, 24,152,114,109,160,174,241,192,141, 22,152,175, 50,203,133,
+ 30,168, 4,186,132, 70,150, 36, 36, 68, 31, 43,175,129,167, 15, 93,232,153,168,225,169,155,168, 85, 69,124,241,139, 95, 53,191,
+232,130, 90,169,107,160, 43, 1,137,243, 70,202, 84,167,252,153,156, 97,218, 54,191,140,128,115, 29, 3,244,190, 83, 84, 44, 93,
+ 25,171,169,250,114, 21,147, 62,196, 22, 80, 10,157,105, 26,126,220, 29, 16,167,226, 24, 24, 60, 29, 14,216, 10, 70,214, 45, 51,
+ 72,189, 64, 88, 87, 12, 70,227,225,253, 91,124,244,209,199,184,187,189,193, 56,109,240,252,207,255, 2, 95,253,254,183, 24,110,
+119,248,238,213, 27,217,153, 40, 22,192,236, 54,112,206,225,211,151,159,227,225,253,107, 56,199,106,242,152, 9, 55,183,119, 56,
+ 60, 61,226,155,239,190,151, 14, 63, 67,223, 61,195,195,227,123,252, 79,255,227,255,140,255,243,223,252,111,120,247,238, 1,131,
+209,216,108, 55,124,193,239,118,216,238,119,216,108,119,152, 54, 27, 12,210,101,113,110,116,192,178, 44, 56, 28,143,120,243,250,
+ 13, 14,135, 19,214, 16, 17, 65,245, 34,175, 43, 76,202,200, 33, 55, 86, 62,218,165, 93,137, 78, 84, 70, 46,205,248, 18, 18,143,
+115,188,140, 14,145, 18,214,224,235,206, 38,165, 8, 74,188, 43, 42, 19,146, 82, 9,186,148,112,190, 92,160, 69,200,147, 73,195,
+201,222,157,181,138, 12, 73, 9, 76, 54,225,138,118,113, 80,154, 3, 84,236, 48,192, 45, 23,126,199,229, 0,113, 41,137,232, 41,
+215,206, 61,184,165,138, 70,172, 28, 82, 90, 25,220,237, 13,142,151, 21,251,137,109, 63, 69, 5,110,140,130, 38,130,213,141, 42,
+118,154, 23,140,198, 96,201, 17, 86, 8,123,171,247, 48, 74,195, 14, 3,172,225,143,231,227,211, 1,251,221, 22, 49, 6,216,129,
+115,165,207,243,130,232, 3,134,205, 6, 16,126, 60,145, 8,143, 66,192,198, 90,184, 4, 12, 22,200,106,195,254,124,173,176, 4,
+ 73,165,146, 16,143, 28,131,116, 45, 35, 78,243,185,165, 64,229,132, 28,249,112,126,124,248, 30, 49, 9,118, 85,108, 55, 41,101,
+232,148, 5, 22, 67, 53, 24, 36, 22,223,111, 76,240,235, 5, 42,120,232,205, 30,183,207, 62,194,251, 55,175,176, 44,236, 65,214,
+ 90,131,236,132,199,135,119,112,243,153, 63, 23,154, 42, 98, 84, 41,141, 16, 28,119,195,170, 33, 95, 33,194, 24, 45,182, 62,213,
+ 65,163,122,181,123, 33,131,149, 46, 62,117,144,234, 22, 55,201,240, 16, 43,106,244, 44,118, 83,159, 98, 29,109, 22, 94,182, 17,
+152, 78,148,215, 43, 21,112, 82,206, 87,251,247,126,103,153,107, 64, 75,195,241,169, 14,126,179,221,223, 96,152, 54,226, 44,137,
+242, 26,242,215, 53, 74,215, 14,121,178, 67,253, 94,188, 15, 66,198, 3,172,100, 48, 12, 66, 8,140, 49,241, 5, 42,222,249, 82,
+ 4, 2,153,243,175,229, 34,190, 10,229,145,162, 72, 33, 3, 57,242,238, 63,200,235, 27,121, 23,106,141, 22,214, 0,167, 79, 22,
+226, 96, 95,188,151,233,138,207, 94,124,252, 9, 33, 7,238,182,147,174,207, 52, 8, 80, 65,198,218, 33,192, 7, 87, 5,116,148,
+ 2, 20, 18,144, 2, 66, 10, 80,214, 86, 67, 87, 33,101,150,159,177,106,113,196,219,173, 20,199, 93, 39,207,157,188,147,224,145,
+197, 49, 77,178,172, 35,248, 57,105, 44,116, 35,255,108,148,194, 52,142,216, 12, 3, 70,163, 97,149,230,137,156,228, 24,152,200,
+ 59,246, 65, 58,240, 16, 35, 11,148,125, 96, 98, 36, 18, 79,214, 68,240, 7,120, 88,101, 36,234, 21,194,226, 72,141, 83,160, 13,
+178, 15,165,218,227, 12, 15,109, 17, 3,251,240,165, 3, 68, 10,252, 30,164, 28,235,221,170, 84,217, 93,179,243, 65,105,110, 0,
+136, 20,211,225,228,115, 73, 61, 31,160,112,223,175, 2,120,202,104,191,165,166, 16,229,171, 12,129, 86, 38, 55,126, 75,213,161,
+105,177,112, 18, 65, 83,135, 11,239, 98,107,209, 11,224,196, 41,150, 83,172, 29,122,155, 98,118, 60,247, 26, 37, 91, 38,186, 45,
+104, 77, 56,135,204,138,145,115, 1, 89,203, 62, 61, 87, 57,183,220,215,229, 98, 33, 57,136, 59, 5, 98,141, 86,197, 85,130,209,
+213,124,190, 88, 1, 50,163, 12,159,221,108,113, 56,159, 27,118,175, 74,239, 91, 37,246, 31,254,211,223,227,175,254,139,255, 12,
+199,239,191,195,237,243, 23,248,234,171,223,227,254,217,115, 76,227,136,103,207, 70,204,203,130,253,110, 11,231, 28, 14,139,199,
+175,255,242,191,196,229,240,128,243,233,132,243,188, 96,245, 17, 90, 1,135,195, 1, 32, 30,255, 25, 51,112,146,155,101, 66,209,
+124, 62,193, 24,139, 23, 47, 94, 84, 48, 69,112,172,190, 85,198, 98, 73, 18, 80,224, 60,176, 6,216,199, 3, 54, 90, 99, 55, 24,
+ 12,155, 9,211, 52, 97,156,166, 58, 26, 69,206, 88,150, 21,167,211, 9,135,227, 9,139,247,213, 70, 19,168,236,150,168,249,125,
+ 73, 73, 86, 48, 71, 48,146,248,117,139, 32,164, 64, 66, 82,110,185,196, 70,196, 39,170,203,117, 46,249,200,138, 8, 26,169, 38,
+ 23, 25,109, 26,202, 82,170,215,139, 3,172, 78, 98,205, 81,226, 66,200, 80,138, 69,114,229,205, 12,158,119,235,118,152,176,172,
+ 51,148,160,118,215,249, 12,101, 71,238,138,141, 69,188,156, 0,109,144,114,104,251,127, 36,144, 98, 97, 80,150,228, 49, 78, 50,
+226, 3,122, 9, 10,163,229,195,245,102,187, 5, 64, 24, 6, 78, 67, 83, 90, 33,134,136, 73,198,129, 38, 51,168, 34, 4,177, 10,
+198, 8,171, 20, 92, 8,149,220,118, 60,157,249, 32,200, 9, 15, 79, 7,172, 94, 14,178, 49, 35, 81,170,238,129, 40, 31,110, 82,
+ 26, 58, 19,230,101,198, 96, 71,246, 34, 59,119,149,149,205, 54, 39,170, 15,204, 96, 71,246,189, 6, 15,173, 13,124,112, 72, 57,
+227,211,143,127,134,239,191,255,170, 10,141,216,174,212,117,127,162, 76, 85, 42,201,197,206,223, 67,240, 14,201,123,108,136,240,
+195, 55, 95, 34,172, 51,251,190,149, 2, 13, 27,156,206, 71,172,151, 35, 6,173, 36,134, 82,213,177,122, 81, 68,215, 66,162, 4,
+167, 84,129, 18, 33, 38, 92,177, 36, 26,251, 32, 95, 69,160, 10,172,176,250,191, 89,189,142,154,116, 85,194, 86,202, 63, 43, 41,
+188, 99,106,118, 87, 34, 85, 17,151, 94, 4,146,245, 34, 47, 14, 26,186, 90,180,161, 90, 95,186, 67, 42, 3,184,189,125,134,105,
+183,151, 17,123, 18,198, 55,119,219,253, 56,211, 16,129,140,134, 49, 34,142, 10, 28,175, 28, 51, 79,243, 42,119, 95,224, 40,101,
+ 26, 80,242,196, 11,147, 92,107, 45, 43,175, 98,101,147,230, 35, 21,165,244,117, 92,108, 9,114,210,162, 40, 47,207,125,121,111,
+178, 40,241,139,207,153,227, 85, 11, 34, 85, 46, 3,173,153, 51,145,149,136,104, 1,146, 11,212,203, 78,254,124, 57,241, 51, 88,
+109,136, 17, 38,115,215,237, 67,225,131,215,152, 16,153,142, 20,146, 24,137, 80,149,191, 23, 83,244, 33,162,180,247,129, 5,195,
+140, 42,102, 54, 71,148, 11,149,247,224,186, 46,139,147, 8, 86,171,200, 83,105, 64, 43,228, 10, 8,210, 80, 8,208,153,195,149,
+238,182, 91,184, 91,143,211,188, 96, 9, 44, 8, 84,158, 45,105,193, 11,129, 50, 19,131,187, 98,108,175,177, 32,137, 11,168, 39,
+ 75,170, 29, 4, 54,163, 52, 71,191, 90, 99, 17,235, 93, 28, 91,110,125,209,110, 9,227,127, 17,161,171, 22, 23, 82, 12, 45, 66,
+ 25, 18,125,172,184, 66,230, 95, 35,127,176, 42,190,214,149,212, 69, 82,238, 44,219, 31, 76,161,203,243,196,223, 51,175, 19,203,
+197,174,192,231, 14,149,208,210,226,187, 47,211, 52,234,156, 37, 10, 18,198,130,235,128,165,146,244, 41,247,109,121,132,170, 13,
+ 78, 46, 97, 85, 56,251,133, 9,145, 19,114,140,200,117,167, 94,227, 5, 83,219, 35,100,170, 6,254,171,150,191,131,201, 55, 53,
+110,169,107, 84, 83,235,166,140,127,248,237,151, 87,240,128, 92,101,249,185, 34, 45,181, 54,176,195,128, 28, 2,238,239,239,241,
+199,111,190, 1,140,197,159,252,242,231,172,104, 95, 87,236,111,110, 96,150, 21,255,252,245,215,208, 72,194, 57,102, 60,163, 22,
+ 2, 90, 1,148, 12,118,128, 25, 25, 37, 91, 96, 0, 33, 38,188,121,243,154,141,249,214, 96, 26, 71, 60,255,232, 83,252,237,191,
+251,183,248,228, 39, 63,131,214, 26,222, 59,188,123,253, 26,206,175,112, 62,224,193, 69,228,211,130, 73, 1, 91,173,152, 23, 47,
+ 73, 62,206, 71,248, 24,133,102,197, 85,154,151,125, 71, 4, 71,234, 33,101,248, 84,236, 35,185, 90, 17,174,240,145,221,232, 46,
+165,212,197, 96, 2, 65,126,159,209, 13, 39, 88,201,125,245, 13,103,175,166, 18, 68, 38, 41, 13,149, 18,103,254,138, 47, 30, 86,
+213, 52, 57,146, 14, 35,138, 26,211, 90,246,191, 59,191, 86, 11,197,122, 57, 65,141, 27,248,117,134,177, 19,206,167, 35,110,110,
+159, 97,157, 79, 8, 41, 99,210,134,215, 16, 17, 48, 36,160,160,204,194,176, 97,224,109,206,118,183, 3, 69, 15, 31, 34,246,155,
+ 17,243,178, 98,187,153, 48, 89,131, 20,184,224, 90,211, 10,100,224, 36,220,129,105,179,197,121,158, 37,183,216,113, 78, 48, 50,
+ 46,107,192,110, 26,112, 88, 29,148,136, 77,172, 53,112, 62, 98,179,153,176, 58, 7, 61,141,240, 33,192,249,128,197,121,220,109,
+ 70, 12, 90,193, 69,224,238,246, 6,203,194, 46, 2,206, 18, 16,180,171, 36,172,141,102, 15,231, 23,152,114,236,144, 70, 66,132,
+ 15, 14, 25,128, 53, 3,140, 29,224,188,131, 81,165,112,109, 7, 69, 46, 59, 62,105, 37, 89, 5,207, 23,134, 34,238,246,151,249,
+ 36,236,110,222, 9, 7, 31,145, 37,215, 96, 59, 90, 17, 24,201,158,184,236,127,101, 21, 19, 99,106,121,235,130,103,101,223,120,
+108,123,245, 78, 9,143,206,231, 90, 96, 22,138,218,211,217,232,102,185, 97,112,113,149, 4, 42, 99,240,150, 39,159,114,198, 42,
+194,197, 43,145, 15, 82, 23,228,148,127,156,146,170,122,187,125,194,237,253, 11, 76,219,125,169, 64,248, 60,137, 44,124,178, 70,
+215,140,112,107,141,116,123,188, 39, 37,185,248, 93, 8,240,194,183, 55,186,192, 68, 24, 22,131, 20,234,202, 41,198, 70,185, 43,
+ 7,110,202,220, 41,199,196,133,152,210, 12, 94, 42,156,252, 38, 54,226, 21, 75,190, 10,217, 96,173,133, 21, 78, 58,201,206,148,
+192, 19, 40, 66, 66,140,165, 24, 40,100,202,166,112,143, 50,153,225,125,188,170, 93,247,124, 62, 49,238,183,122,172, 19, 12, 37,
+ 9, 12,241, 2, 87,146,206,150,168,218,253,248,124,141, 53, 6, 55,165,140, 80, 35,122,149,144, 12,121, 69, 19,100,162,148,115,
+ 3,186,104, 81,247,247,194,175, 16, 56, 42, 58, 12,137, 47, 66,169,201, 98,230,198,137, 99, 85, 11,209, 78, 99,191,221,226,217,
+110,139,195,204,148, 73,165, 8,227, 56, 9, 66,149,213,234, 92,132, 17, 11,238,100,154, 81, 26, 16,200, 10, 44,134, 36,118, 74,
+ 89,103, 25, 13,157,129,236, 75,146, 97,187,136,179,156,153,204,246,183, 18,198,100, 90,186,154,124,222, 9, 5,247,160,164, 89,
+189, 6,216, 20,107, 49, 41, 89, 69,101,234,226,132,243,255,111,176, 79,139, 25, 46,113,167,242,122,138,239,159,196,218,217, 79,
+ 3,122,114, 31,114,234, 62, 87,168,171,236,230,205,191,246,164,231,110,236,207,176, 26,197,105,208,164,106, 97, 84,139,105,185,
+143, 19, 1,166, 8,100,138,206,254, 71, 65,113, 29,121, 62,119, 75,123, 92,141,230,219,222, 34, 83,198, 48, 12,200, 4,252,240,
+238,125,135,175, 42, 56,196,212, 88,183, 32,252,246,203,223,227,243, 79, 63,198,188, 44, 8,222,227,139, 47,126,130,183, 15, 39,
+252,240,234, 13, 62,122,254, 12,222,123, 28,143, 39, 56,183,226,249,139,143,240,254,205,247,216,110,119, 32,165,177, 11, 91, 9,
+144, 89, 16,101,188,179, 46, 51,140, 86,136,226, 33, 45, 9, 60,101, 28,147, 98,192,233,228,161,213, 5, 79,143,252, 54,155, 98,
+ 79,210, 6,217,185, 43, 40,192, 37, 18, 78, 62, 34,102, 95,247, 40,150,128,231,187, 9, 58,120,132,152,225, 18, 33,228,140, 84,
+130, 14, 4, 21, 91, 5,136,124,140,212, 78,157, 72, 65, 33,117,161, 6,237, 13, 45,226, 38,173,168, 38,120,149,176,143, 98, 25,
+ 73,208,136,209,193, 88, 91,161, 54, 74, 41,184,249,130, 97,154,170, 40, 13, 34,180, 41, 7, 80, 76, 17,118,220, 32,198,192,251,
+183, 24, 5,237,155,171,250, 61, 2, 64,240, 32, 40, 56,183,192,218, 17,235,229, 4,109, 13,146, 91, 17,201,178, 24,133, 12,180,
+116,200,138, 20,144, 3,230,213, 99, 51,104,168, 28,112,246, 17,207,119, 35,114,226, 29,154, 15,124,192,164,156,177, 44, 14,171,
+247,184,217,239, 48, 70, 38,215, 93,230,153,169,112,146,154, 54,207, 11, 62,250,232, 5, 98, 60, 98, 89,153,126,231,156, 67, 72,
+ 73,236, 71,124,225, 77,195,128,195,233, 12,163, 21,230,197, 85,198, 55,217, 45, 84, 94,176, 58, 62,180, 41,103,152, 2,135,144,
+ 7, 33, 5,143, 8, 5,107, 39, 94,101, 40, 45, 27,170, 86,100,101, 9,124, 40, 40,217, 34,206,162,106,165, 34,153,190, 16,114,
+226,247, 77, 19, 33,138,211,130,192,227,226, 50,225, 40,128,167,148,100, 98, 85,118,111, 50,114, 46,130,160,162,250,174,214, 82,
+121,132,130,164,118,149, 81, 33,100, 55,138,210,209,151, 63, 39, 56,207,162, 10,207,200, 53, 24, 38, 95,237,245, 10, 21,171,101,
+ 63,243, 37,168, 68,187,146,170,109,142,208, 67, 47,210, 7, 14, 0, 18, 79, 90,249, 37,255, 34, 33, 97,127,115,199, 2, 56,112,
+ 66,157, 82,141,227,205,150, 70, 96,180,188,171, 31, 44,187,102,148,150,142, 82,188,227,101,188,206,171, 27,131,113, 28,161,181,
+149,194,214,201, 78, 92,210,235,132, 55,223,200, 41,169,250,133, 21, 41, 94, 37,116,185,243,195, 96,225, 99,172, 35,250,166, 16,
+167,234,192, 80,117,165,145,171, 24,210,202,168,191,124,173,156, 24,110, 3, 72,161,219,251,143, 35,147, 1, 67, 10,181, 25,242,
+206,241, 46, 93, 94,219,173, 16, 99,180,192,153,138,117, 74,107, 5,157,116,157,118, 52, 69,117,148,117, 66, 66, 74, 60,209, 42,
+ 69, 59, 7, 90,145,116,235, 10, 86,183,144, 43,165,196,231,140, 70, 37,115, 62, 96, 94, 87,104, 99,144,136, 96, 97,196, 47, 13,
+ 40, 89, 67, 4,207,152,111,102,191, 3,251,221, 22,187,195, 17,143, 2,250, 74,164,235, 62,159,114, 20,111,184,146,188,137, 92,
+ 93, 8, 21,141, 74,138, 27, 16, 2, 84, 74,208, 57,203,228, 49, 3, 8, 40,241,240,138,168,114, 31, 32,153, 34,198, 88,104,189,
+136,136, 56, 94,161,118,155,134,171,203,175,151, 78, 87,245,200, 89,124,112,143, 81,135, 69, 46,147, 46,153,166,150,215,173,137,
+211,155,173,212,200,153,163,144, 17,156,135,182,186,174, 15,138,128,173, 38,253, 81,113,151,245,105,170, 34, 80, 87, 84,127,134,
+ 26, 5,156,113,165,202, 47, 35,132, 74,148,168,163,123, 98,104,125, 74, 48,140,203,149,202,131,250, 49, 95, 91,216, 23, 91, 12,
+165,198,151,189,142,130,235,200, 56,224, 29,151,145, 67,228,202,215, 78,109,132,152,101,124,121, 56, 95,176, 63,157,113,127,123,
+203, 22,182,205, 14,239,191,250,103,220,223,221,227,253,227, 19,126,246,211,207,241,253,247,223, 99,220,236,160,173,197,179, 23,
+ 31, 97,176, 3,222,189,254, 35, 82, 76,152,125,146, 17, 13,199,109,110, 55, 19,179,204,197,182,149, 50, 42,142,146, 10, 92, 83,
+ 94,216,148,178, 28,224,124,208,172, 62,226,102, 51, 98, 93,157, 0,101, 74,166,112,174,193,244, 94,242,163,222, 5,194, 60, 23,
+ 8, 11,255, 62,149, 51, 34, 20,166,205, 6, 58, 72,231,128, 92, 15, 92,234,114,184,155, 61, 74, 93,113,129, 21, 21,159,186,170,
+ 74,223, 44, 29,123,148,221, 76,202, 25,163,209, 72, 50, 66,215,162, 64,215,214, 50,152, 39, 39,172,242,245,140, 29, 68, 72,145,
+161,141,129, 95,103,142, 41,141, 65, 84,162,128, 53, 22, 33,242,207, 57,109,247,112,243, 25, 81,114,173, 65,192, 52,140, 56, 93,
+206,184,189,185,193,188, 44,184,204, 23, 86,249,202,222, 19, 57, 84, 30, 56,100,188,185, 27, 52, 66, 6,118,131,129, 2, 48,140,
+ 3, 23, 23,138, 15,194,209, 26, 60,157, 0,219,254, 44, 0, 0, 32, 0, 73, 68, 65, 84,206,156,208, 54, 88,220,222,220, 64,157,
+103,236,110,182, 88,102,182, 11,158, 78, 71, 4, 9,251,240,129, 49,191,175,223,190,227,181,139, 86, 56, 10, 35,123, 94,121, 98,
+ 16, 82,134, 22, 63,243,124, 62, 96,220,236,225,151, 11, 86,231, 49, 78, 27,204,231, 51,180, 70, 77, 96,227, 41, 79, 64,136,190,
+182,149, 41, 71, 14,232, 80,108, 31, 52, 0,158, 30, 95, 33,229, 4, 67,154, 47, 94,209, 75, 80, 93,149, 48, 68,136,148,226, 61,
+188,226, 20,195, 92, 98, 74, 69,168,149,147, 92,254,221,222, 44, 85, 44,102,170,151,106, 74,205,254,169, 74, 71, 44,255,203,123,
+234,114, 24,137, 31,215, 88, 94,167, 4, 39,187,243, 62,181, 41, 95, 7,184,228,230,213,102,113, 81, 99,179, 3,101,228,158,132,
+110,149,174,182,121, 85, 79,147,210,135, 1,209,210, 26,113,196, 99, 57, 47,166,205, 22,187,219,123,233, 38,163,140, 26,115,139,
+232, 36,192, 71,126,255, 9, 25,211,192, 41, 93,236,249,229,231,195, 24, 13,231, 19,156,243,146,230,165, 27, 94,122,185,112, 23,
+ 89,158, 11,185,204,180,136, 82,181, 92,210,181, 51, 18, 95,118,121,111, 33,227,100, 2, 95,208, 73, 68,101,197,142, 70,196, 35,
+110, 45,107,157,226,253, 7,177,245, 75,137,157,202,139,189, 51,196, 8,107,153,111,177,134, 88, 35,134, 99, 2,160,115,103,251,
+ 2,140, 2,188,155, 17, 98,172, 77,196,126,216,201, 36,202,178,197, 43, 37,113, 82, 16,116,226,244,199, 16,228,243,137,230,102,
+200, 37,130, 51, 37,104,165, 69, 47,146,234,100, 47,196, 84,255,174,162, 84, 87, 53,226, 87, 46,245,192,151, 58,105,133,144, 51,
+236, 96,101, 84, 47, 29, 98,206,136,129, 49,220, 41, 69,206,104, 39,194,237,118,131,211,225, 8, 50, 26, 67, 2, 54,155, 9,206,
+ 7,196,245, 34, 19, 1,213,162,121,139,115, 35,101,144, 92,124, 62,164,154,236, 86, 10,110,254, 30,121,133, 85, 24,243, 41,179,
+215, 93,139, 93,173,128,127, 98,232,128, 71,185, 93,236, 41, 43, 73,204,108,219,226,182, 68,111,221,124,203, 49, 47,171, 43,170,
+187, 42, 42, 69,181, 36,236, 21,243, 99,209,165, 68, 97, 11, 20,246,128,146, 21,176,150,137, 37,170, 79, 61,182,244, 63,185, 67,
+115,191,211,239, 98,214,171,188,170,122, 88,164, 24,168,159,133, 92, 97, 83,170, 49,151,249,110,149,194,206,148, 11,165, 66, 38,
+240, 65,248,251, 85,102,171,232, 26, 83,251, 29, 21,131,216, 25,176,135,193, 98, 71, 93,133,241, 35, 83,108,219,193,167, 24,241,
+240,116,196,199,207,159, 99, 62,159, 96,141,197,221,221, 61, 54,155, 13, 78,231, 19,150,101,197,139,231, 47,240,234,221, 59, 0,
+192, 71,207,238,241,135,175,190, 68,112, 43,238,110,111,240,201,142,224,226, 6,203, 60,227,238,102,135,211,249,130, 36,148, 52,
+ 3,224,178,250,166, 78,141, 12, 87, 41,170,198, 44, 31,148,114, 24, 12,198,224,102,191,195,179,219, 27,196, 20,113,185, 44, 56,
+ 93,102,184, 28, 43, 92,135, 18,119, 63,206, 57,244,105,121, 73, 58,241, 44, 86, 7,165, 50,200, 42, 57, 24, 60, 87,248,146, 54,
+148, 58, 46,124, 57,127,217,218,150,234,138,162, 38,221,137, 66, 53,203, 33, 82,132, 92, 40, 8, 83,146, 76,100, 98, 75, 77,206,
+ 76,197,163,228,121,126,150, 99,205, 69, 46, 65, 48, 33,114,165,184,172, 11,198,113,132,247, 14,218,110, 16,253,130,224,207,200,
+ 68,176,150,131,114,180, 34,204,235, 10, 99,216,215, 30,188,231,196, 38,197, 85,183,210, 22, 17, 4, 3, 94, 55,164, 53,214, 75,
+226,229,102, 18,124,162, 65,146, 32,148, 65, 19,134,113,196,225,112,196, 48, 16,116,206,152,166, 17, 86,139,157, 4, 36, 29,187,
+194,102,218,224,253,211, 19,140,102,251,212,195,211, 19,172,101,123,140, 15, 1,214,176, 40,111, 48,138, 89, 5, 68, 24,149, 66,
+ 8, 17,219,253,158,137,116, 49, 98,119,115,139,199,167, 71, 12,166,113,161,167,105,199, 59,201, 36,163, 84,133,170,190, 46,249,
+222,153,120, 15,106,204, 80,199,100, 41,103, 88,194, 85,245,207,233,119, 90, 62, 31, 90, 98,116,249,194,247, 34,190, 42,162,157,
+ 16, 89,116,216, 86, 94,252,144,150,162,173, 60, 67,124,184,245,105, 13,237, 51,211,128, 28,210,165, 43, 18,144, 74,174, 99,246,
+ 98, 25,138, 41,139, 48,167, 77,130,148,184, 80, 74,183, 26,139, 44, 55,149,130,183, 75,182,202,215,144,232, 90, 20,252,232, 63,
+109, 34, 96,140,197,205,221,243,166, 60,151,239,161, 48,199, 73, 78,212, 20, 66,101, 7, 24,177, 87,169, 24,144, 18, 97, 51,141,
+146,162,229,101,136,168,161,173, 68, 62,135, 85,188,239, 25, 41, 82,133, 55, 21, 37,114, 9,186, 1, 50,143, 43, 37,122,139, 45,
+ 92,237, 61,179, 70,215, 81,191,210,242,204,130,129, 46,137,171,132,106, 97, 83,242, 12, 26, 37, 5,131, 4,163, 68,153, 56,148,
+ 49,190, 22,182,120,146,181, 73, 12, 17, 33,129, 29,224, 49,114, 19, 17, 35,148,102,209, 33,167, 63,138,163, 33,120,140,219, 9,
+227, 56,114,145, 23, 73,128, 63,133, 22, 23,107,164,111,204, 36,121,247,185,122,151,235, 94, 88, 17, 40,181,130, 38, 36, 6,200,
+132, 16,129, 17,114, 22, 93,219, 11, 83,202, 88,156,231, 92, 4, 41, 40,180,228, 97,144,164,172,165,200,107, 71,183, 44,188,190,
+ 72, 9, 70,107, 88, 89,165, 42,226, 8,101, 46,214, 36,222, 84,107, 97, 4, 72,167,173, 24,179,173,165,177,137, 57, 35, 5,118,
+ 91,105,207,231,118,195, 4, 19,136,146,128,115, 80,145,175,144,212,195,152,120,228, 78, 87,147,114,193,196, 42,142,120,174, 11,
+118,228,234,117,167,162,123,168, 12,157, 84, 47,113, 94, 19, 36,212, 13,124,110, 66,228,178, 53, 74, 37, 81, 49,177,110,161, 80,
+ 60,181,208, 84,147,160,113,115, 74,157, 71, 94, 6, 7, 37, 1,224,195,196, 63, 69,232, 31, 45,254, 53, 71,203, 86,160, 84,254,
+144,243,150,175,117, 45,242,186,153,154,200, 68,248,241, 3,140, 54,242,224,106, 48,117,151,247,135,250,251, 92, 99,129,181, 82,
+ 28,137, 90,197, 2,169, 2, 6, 72, 1, 57,166, 43,170,213,188,174, 56,158,207,248,228,147, 79,240, 79,255,248, 15, 48,214,224,
+ 50, 3,203,188,224,135, 55,111,112,179,221,226,114, 58,227,238,246, 30,239, 30, 30,241,236,238, 22,199,227, 1, 57,115,144,193,
+ 15,111, 56,108,227,249,253, 45,140,230,100,183, 67, 10,252, 48,169, 80, 49,124, 33,202, 1,171, 50, 44,177,253,131,247,214,220,
+ 17,236,167, 17, 95,124,254,146,187,246,101,133,243, 30,171,115,112,222, 99,158, 23, 60,157,103, 92, 86,135, 97, 26, 48,159,151,
+ 42,108, 98, 36, 33,191, 35,251,205, 14, 65, 34, 71, 75,146, 84,240, 78, 62, 86,170, 94,222, 68,157,207,175,218,216, 84, 83, 47,
+139, 15,149, 36,119,154,186,220,222,162, 71,168,226,189,178,155,145,135, 56, 6, 95, 15,173,146,120,230, 67,224,160, 17, 73, 4,
+ 99,101,188,149, 76, 98, 3, 77, 25, 89,196,112, 90, 41,248, 16,184,251,245, 78,186,195,146, 73,200,135,112, 42,233,114,209, 67,
+105,139,213,123,220,109, 6, 92, 60,225,197,118,192,251,243,204, 10,242, 12,172,206,195, 90, 43, 2, 70,233,128,164,195,222, 76,
+ 3,199, 71, 26, 30,129,166, 12,134,200,164,140,119, 79, 7, 4, 31,144,146, 97,181,126,193, 92,150,241,121, 12, 32,133, 10,215,
+200, 57, 99, 51, 50,220,227,116, 58, 33,103,194,118,183,199,188, 58,102,192, 23,241, 89, 6, 39,117,169, 38,142,138, 41,202,238,
+ 54, 85, 33, 74, 25,103, 59,183,212,125,117,146,220,236, 50, 58, 55,196,214, 46, 2, 48, 24, 3,159, 25, 57, 26, 35,131,145,202,
+184, 54,150,139,134, 32, 74,104,238,218,147,112,219,181,230, 74, 59, 22,184, 8,250,241, 95,211,179,148,180,187, 44, 92,235,154,
+ 26, 86,214, 72,229,130,136,237,107,215, 96,152, 46, 76, 40,215,196,183, 46,212,163,246, 32,109,199,220,187,218,169,187,212,251,
+157, 97,155, 42, 40,220,220, 63,131, 30, 70, 97,112,167,234, 57, 71, 77,113,228,152, 94,173, 21, 2, 88,193,142,156,177,174, 43,
+110,246, 59, 40,176,141,106, 89, 86, 25,179, 14,204,254, 79, 9,209, 59,104, 81,187, 19,154, 85, 40, 75,215,162, 42,103,163, 77,
+ 60,180,156,184, 53, 85,140,152, 93, 65,226,242, 41, 73, 93,214, 10, 2, 90, 27, 17, 55, 69,172,222, 9, 73, 81,215, 3, 55,201,
+247,174, 74,247,206, 87, 71, 43,152, 20,193,175,190,114, 6, 74,232, 80,142,157,152,145, 0, 23, 50,148,182, 72,171, 19,151, 17,
+225,116,153,241,209,179,251, 26, 13, 42, 88, 66,100, 17, 84,229,148, 96,181,105, 1, 33, 50,237,236,233,128,101,242,163,138,248,
+ 67,154, 57, 31, 51,102, 23, 48,141, 17, 67, 8,136,105, 64, 17,153, 23, 86,134,143, 17, 36,116,192,152, 51,116, 52,242,249,146,
+203, 50,178, 88,209,133,136,236,189,172,166, 2, 70,165,112,242, 14, 74,107,108,236, 0, 90, 86,144,181,213, 7,159,138,206, 67,
+208,208, 44,161, 43,133, 48, 95,165, 62, 70,152,168,174, 1, 73, 96,241,156,206, 26,164, 44,131,167, 4,155,173,212,208,197,143,
+182, 72,225,130, 0,230, 13, 85, 17,121,150,140,131,214,101, 23,113, 12, 21, 91,118,161, 41,202, 56,190,178, 21,169,205,162, 83,
+ 73,214,236, 52,226,171,231,241,127,145,158,105, 98,215, 80,239, 57,191,106,201, 83, 29, 16, 92, 89,211, 84,226,200,240, 26,217,
+218,157,245, 64,211, 81, 81,199,178,104,217, 46, 4,146,181, 37, 17,193,244,152,200,126, 52, 87,243,132,235,162, 33, 73, 8,193,
+255,199,214,187,252,204,118,165,231,125,207,186,238, 75,213,119, 57, 36,155,108,170,213, 45, 89,105,201, 86, 4, 36,182, 0,195,
+179,252, 11,153,100,152, 12, 50,201, 63,145, 81,198, 25, 4,200, 72, 6, 18,195,115, 79, 50, 74, 0, 15, 50, 14,144, 32,114, 44,
+ 7,146, 98,165, 37,183,196,110,178,121,120, 46,223, 87, 85,123,239,117,205,224,125,223,181, 86, 29,167, 1,129, 34,121,120,206,
+ 87, 85,187,214,122, 47,207,243,123,234,125,103, 94,123,150,171,236,230, 75,173,248,225,251,183,237,255,151, 68, 45,129, 86,208,
+ 10,170,220, 65,238,127,253,155,183, 56,173, 43, 52, 10,126,246,179,223,197, 95,252,219,191,194,211,211, 19, 82, 8,240,207, 30,
+191,253, 91, 95,227,251,119, 63, 96, 93, 79, 56, 63, 61, 33, 70,130,160,196, 24,112, 62, 45, 48,198, 34,196,132,215, 27,117,147,
+203, 60, 3, 12,104,209,198,160, 50, 52, 37, 51,252, 95, 66, 70,180, 82,112,134,236, 86, 95,126,245, 21,126,246,179,223,161,232,
+192, 24, 16, 99, 68,140, 17,251,182, 99, 15, 7,182,235,134, 35, 4,202,240,142, 25,223,189,123,143,203,118,112,230, 52,171,142,
+173,135, 30, 8, 78,205, 62,194,145,124,221,127, 73, 15, 73, 26, 4, 70, 10, 34,232,161, 78, 56, 75, 4,232, 40,138,224,106, 81,
+243,254, 30,149, 18,193, 82, 10,240,122,110, 66, 28, 99, 52, 18, 51,182, 19,219,102,168, 42,142,152,252,140,192, 89,230, 33, 70,
+ 56,103, 73,209, 92, 11,239,149,137,121, 94, 43,233, 12, 52, 39, 95,213, 92,218,248, 88,246,200, 70, 43,236,225,192,201, 91,188,
+108, 1, 79,139,195,119, 47, 87,124,249,176,224,117, 11, 4,178,240, 30, 21,192,186,174,164,140,223, 15, 28, 57, 99,157, 60,140,
+ 34, 95,112,174, 25,183, 35,192, 92,175,205,122,131, 66,113,157, 97, 59,168,147,147, 24, 88,107, 17, 34, 90, 24,136,124,150,185,
+ 82, 39, 69,157,183,195,228,200, 54,103,148,106,251,248,105,242,204,161,206,208,213,182,231,179,121,151,107,129, 82,212, 97, 16,
+222,170,224,118,123,105, 5,133, 17, 58, 89,169, 80,186, 0,204,162, 38, 4, 48,237, 47,139,214,116,241, 72,242, 85,171,223,136,
+225, 96,248, 64, 41,140,220, 84, 50,246, 70, 31, 93,171, 38,122, 67,103,181,139,200,135,165,169,142,189,196, 45, 40, 35,151,166,
+152,183,198,192,232,202,192,143,114,151,216, 38,163, 70, 74,101,172, 3, 99,190,242,185, 87,113,111,164, 25,248, 29,186, 43,234,
+164,131, 80,156,210,183,156, 30,155,118,166,240,206, 81,228,187,109,207,205, 81,188, 52, 49, 99, 94, 38,207, 29, 83,138, 4,163,
+138, 9,218, 16,252, 36,231,132,215,235, 21, 41, 83, 82,152, 98, 30, 57,223,176,109, 10, 37, 24,212, 58, 52, 96, 85,245,194,199,
+ 90, 34, 8, 70, 78, 15,148, 78, 42,115, 90, 92,140, 52,249, 17, 61, 3, 29,238,244,221, 82, 3,100,222,218, 14,191, 33,109, 64,
+ 38, 53, 61,239,220,229,115,115,198, 52, 71,134, 81, 64, 76,145, 63, 23,162,203,125,184,109,180, 42, 67,207, 23,223, 66,194,236,
+ 73,249, 77, 5,189,230, 76,109,210, 60,100, 77, 69, 7,152, 5, 79, 13,153,106,147,191, 60,104, 7, 36,248,163,193,102, 20, 93,
+ 64, 71,200,240, 46, 33,198, 8,197,154, 28,197,130,200,148, 9,248,164, 84, 34, 21,181,120,241,229,242, 97,191,124, 46,210, 37,
+179,197, 16,228,149, 39,177, 91, 38,110,252,178, 16,215, 93,194,116,106,234,128, 51,182, 30, 88, 67, 81,168, 57, 69,164, 66,239,
+159,188,150,190, 10, 55,112,142, 52, 30, 33,202, 20,150,214,150,211,180, 64, 27, 10,190, 33,189, 72, 1,138, 38,198,202,192,168,
+175,101, 8, 62,210,125,204, 77,191,160,176, 0,145, 46,248,202,145,171,253, 66, 45, 45,175, 35,229,210, 45,167,124,223, 29, 44,
+206, 61,175,180, 50,208, 10,136,172,235,128,156,219,232, 9,138, 74,163,173,177,251,151,170,182, 76,128,170,208,194,153, 74,237,
+ 88,216,182, 38,168,186,175, 77,208, 57,240, 70,107,102, 54,176,250,189,112, 74,144,234, 57,124,119,226,129,222,140,243,206, 66,
+125,178,179,107,254,187,190, 91,255,213,219,119, 3, 52,170, 54,160, 70,101,161,143,226,136, 83, 73,165,223, 67,192,182,111,248,
+252,203,175,240,246,237, 15,248,234,205, 35, 94,247, 3,199,190,147,128,163, 86,108,215, 43, 78,167, 19, 62,188,188, 98,118, 30,
+175, 31, 63,240,174,178,162,234,202,168, 80,242,166,222, 54, 74, 10,115,198, 32,230,204,182, 22, 13, 88, 52, 66,147,116, 79, 90,
+107, 56,239,241,211,159,124,141, 47, 62,255,188,209,145, 10,231,115,199,112,180,128,133, 24, 34,182,219,134,152, 19,126,250,227,
+ 47,113,185, 94,241,237,219,119, 56, 82,194, 37,100, 78, 4,226,157, 72, 41,136,145, 50,223, 43,227, 23, 35,139,149,104, 44, 40,
+171, 13, 81, 78, 43,158,136,136, 31,179,171, 33, 75, 21,111, 65,183,186,169, 22,111,152, 90, 22,120,105,248,205,222, 61,228, 54,
+254,164, 48,151,131,177,176,181, 20, 24, 77,130, 29,221, 14, 0,193,127, 26, 78,144, 11,196, 80, 70, 65,226, 81, 23, 21,103, 36,
+ 58, 74,165, 98,245, 14,206,210,193,106,173,197,151,143, 22, 11, 99,118,173,247,184,238, 1,111, 30,207,172,226, 4,188,247,120,
+ 90, 23,236,220,129,121,235,105,127,109, 72,200,118,217, 14, 60,157, 60,180, 82, 88, 28, 93,188,222, 89, 98,234,167,140, 61, 68,
+108, 33,144,210, 86,174,158, 90,201,161,192, 25,231, 0, 77,102,140,170,136, 41, 97, 93, 22, 28, 44,130, 84, 13,166,128,198,248,
+ 46,185,171,109,105, 35, 70, 7, 78,140,177,131, 59,140,161,103,166, 20,238,236,152, 44, 5,178,151, 81,250, 83,109,218, 82, 99,
+ 12, 12,239,110,115,173, 77,232, 85, 6, 37,187, 98,166, 58,161, 41,107, 43,232,229, 0,108, 59,119, 40,168, 82, 81, 84,229, 12,
+103,221,254,189,112,173, 59,219,109, 20,164,171, 1,121, 91, 7,176, 5, 90, 28,106, 45, 5, 5,133,158,157, 42,185,117,146,208,
+216,225, 53,141, 8, 57,112,228,141,210, 56, 61, 62,194, 56,127,167,116, 47,165, 52,149,182,209, 36, 78,115,134, 46, 41, 81,102,
+ 79, 19,225,130, 61,127,198,211,180, 50,139,157,248, 1, 41, 6,196,120, 32,178,107, 65,181,241,189,106,163,205, 49,143,125,204,
+141, 23, 1,155,116,240, 66,102,108,111,140,136, 97,115, 70,101, 58, 89, 87, 91,179,203,161, 84, 16,245, 55,179,246,196, 54,107,
+160, 99, 70, 70,225,239,130,140,193, 69, 27,209, 9,138, 21,161,228,246, 93, 52,170,226,186, 31,216,110, 87,154, 22, 13,137,116,
+ 24,168,121,214, 90, 32,203,121,154, 97,140,130,171,150,200,147, 41,195,185,218, 88, 4,138, 5,128, 85, 66,185,196, 98,201,103,
+ 92, 65, 97,252, 49,173, 35,173, 85,228,189, 87, 26, 19,187, 87,172,155, 90,113,152,107,133,202, 5, 85,101, 24, 9,226, 98,157,
+ 71,201,185, 61,203,165,208,153, 27, 35,197, 74,167,156,185,232, 39,188,119,142, 7,120,148, 54,192,122,106, 67,200, 74,126,253,
+ 94, 50,116,233,172,116,173,229,254,161, 41, 34, 37,216,229, 54,249,180,206,195, 53,108,118,108, 12,127,200,232,188,144,189, 20,
+114, 73, 43,197, 2,109,221,136,167, 85, 38,143,237,251,198,109,116,101,204,115,213, 80,186, 48, 78,150, 39,189, 41,195, 24, 73,
+ 68,212, 13,219,189,237,129,152, 34, 90, 67,219,138, 49, 56,101, 44,210, 43,243, 34,148, 82,125,161,143, 49,128, 73, 82,226, 10,
+ 7,223, 0,122,200,102, 17,248, 80,235, 3,121,162, 8,165, 80,184,129, 83, 74,195,118, 47, 41,122,158,113, 27, 23,208, 28,163,
+193,237,121,142, 95,107,253,247, 54,106, 66,139, 82,108, 67,249,254,221,251, 33,162,174, 98,242, 14,233, 72,173, 66, 16,152, 64,
+151,228, 3,191,248,229, 55,248,163,191,255,115,188,188,252,128,159,254,228,107,216, 41,224, 55,251, 13, 47, 47,175, 56, 77, 22,
+147,211,248,245,175,127,141,211,233,132, 56,121,192, 88,220, 46, 23, 30, 93, 22,188,251,248,202,126,245,130,121,158,184, 99, 40,
+109,167,110,184,139,157,173,131,225,177,118, 41, 21,243, 52,195,121,135,223,253,233,207,112, 58,157,185,202,162, 92,237,154,137,
+ 85,156,211, 65,127, 13, 7,194,105,197, 30, 34,246,125,195,236, 29,106,206,248,187, 95,127, 7,143, 10, 93, 2,110,177, 96, 89,
+ 79, 80,214,226,114,121,105, 35, 78,180, 61,150,190, 83, 96,182, 80,132,210, 8,179,204,119, 30,146,177,238, 81, 63, 29, 73, 42,
+176, 19,206,106,215, 76,173,171,114, 97,241, 46, 83,136,128, 68,201, 50,180,143,103, 98,157,216, 98, 70, 92, 48,197, 61, 10, 33,
+ 55,226,147, 24,132,126, 88,106, 82, 9, 47,243,132,148, 18,113,194, 25,167, 73,170, 86, 10, 80, 73,185, 32,239, 59,217,245, 56,
+ 74, 21, 41,163, 24,131,194, 7,131,181, 6, 47,175, 87,154, 28,228,132, 15,215, 91,155, 76, 4, 93,153,137, 95,176,135, 68,164,
+173, 70,106,162,103,242,121,157, 90,184, 70, 81,132, 9,222, 88,232, 20, 99, 24,226, 14,105,132,103, 21, 49, 21, 84,166, 46,167,
+136,192,180,130, 58, 11,173,241,252,230, 43,188,190,126,192,117, 15,140,223,212, 60,181,200,188,202, 32, 20,174,105,221, 54,119,
+198,232, 57, 8, 90,137, 53,180, 7,168, 80, 33,157, 91, 81,129,130, 86,140,148, 1,213, 92, 80, 90,154, 96, 5, 79,113,164, 66,
+231,195, 41,115,145, 42, 19,148, 82, 43, 9, 12, 75, 29, 22,112,156,176, 37,235, 27,158,158, 33,151, 54,110, 84,131, 26,183, 54,
+170, 91,167, 93,181,231,144, 87, 63,222,121, 76,235,153,166, 67, 60,130,148, 81,171,226, 11, 83,196, 86, 90,107, 98,254,243,152,
+119,157, 39, 42, 12, 45,101, 21,156,214, 21, 74,105,236,251, 13,199,113,176,163, 3,120,185,110, 36,234, 99, 37,127,206,165,177,
+183,197,197, 32, 10,115, 98,194, 15,179, 68,165,238,160, 53,125, 84,193,197, 73, 46,173,112, 46, 37, 33,243,174, 60,149,194, 34,
+ 56, 22,162,242,158,217, 72,209,205, 19, 74, 2, 18, 81,145, 72,107, 46,211,105,115,138,137,242,185, 19, 35,107,169, 72, 10,120,
+121,125,193,237,122, 65,201, 52, 57, 74,172,141, 81, 74,227,178,237,120, 56,159, 73, 31,131,210, 46, 51,203,194,189, 82,106, 43,
+ 46,180, 42, 80, 50,234, 85, 10,186,240,103, 37,231, 46, 11,230,192,221,252,228, 28, 66, 74,184,110,224,152, 99,131,117,242,220,
+196, 21,120,239, 88,184,215,227,185,179, 42, 45, 54,185,150,202,197,148, 8, 0, 11, 98,166, 93,125,201, 5, 25, 9, 73, 13,126,
+ 40,121,243,135, 8, 88,165, 36, 97, 12, 48, 26,240,206, 81, 22,133,209,173, 99, 45, 69, 44,110,186,113,239,181, 34, 45, 78,230,
+ 34, 57,198, 3, 33,236,180,106,108,204,133,218,150,215, 52,194, 46,189, 72,173,138, 38,107, 77,212, 41, 38,112,125,103,235, 68,
+243,209, 23,168, 34,152, 88,201, 81,207,195,180, 1, 48,149,206,141,235,126, 96,219, 3, 5, 87, 89, 98, 2,140,214,209,166,201,
+ 43, 3,220,102, 72, 82, 84,195,193, 90, 89, 22,171,197,173,165,134, 92, 6,177,208, 50, 54, 87, 15, 86, 82, 89, 67,148,146, 96,
+171,194,112, 73,247,110, 97,132,241,148,161, 67,187,227, 81,202,238, 74,228,253, 85,181, 42, 86, 65,224,254,117, 80,215,162,219,
+ 25,248,144, 18, 33, 6, 9,204, 52,190,253,238, 55,112,186, 34,164, 12, 93, 51,190,252,242, 71,248,155,191,253, 6, 63,249, 7,
+127,128, 55,159,125,134, 63,253, 87,255, 26,203,186, 34,131, 82,136,222,190,251,128,211,186,192, 57,139,151,203, 21,147,179,216,
+ 66,194,251,151, 11,231, 36, 27, 78, 43,170,200,133,108, 18,203,228, 97,156,198,195, 50,195, 77, 30,251, 30,241,229,231,159, 81,
+228, 43, 42,148, 33, 2,147, 49,142, 31, 98,139, 18, 13, 82,140, 8,168, 48, 80,176,222, 3,149, 85,185,188, 13,207, 49,181, 78,
+238,229,195,206,251,163,202, 59, 61,203,138,242, 1,229, 57,196,235, 81,178,210, 32, 64,108,227, 51,213,190, 32,114,137,107, 53,
+142,135, 84,179,188,167, 24,225,188,130, 42,166,117,126,163,250,218, 25,199,190, 88, 86, 60,151,124,231, 76,248, 36, 80, 23, 26,
+ 5, 69,235, 38,206, 1, 84,187, 40,114,225, 0, 12, 69, 40,202, 16, 34, 38, 71,239,179,229, 4, 45,165, 21,246, 24,240, 52,121,
+124,254,249,103,120,185,220, 80,106,193,219,119, 31,240,163, 55, 15,216, 67, 64, 10, 1,207,167,103,188,253, 72,214, 53,227,200,
+210,162,141,133,225, 93,219,245, 8,152, 11,217,161,212,176,226,105, 33, 65, 44, 32,155, 39, 71,112,143,162, 97,144,232,176, 80,
+160, 48,152,148, 80, 83,230,253,181, 99,120,143,106, 59, 81, 25, 21, 43,214, 60,136,175, 25,149, 92, 3,138, 95,187,102,219, 8,
+ 44,117,184,198, 57, 56,235,233, 89,102, 81,206,164, 20, 66, 10,208,160, 72,219,156,106,235, 34, 4, 27,217,237, 49,181,137,130,
+232,224,207, 84,141,151,130, 52,160, 87, 85, 11,114, 40,220,241,208,123,159,154, 63,183, 54, 17,164,136,197,208, 44, 60, 84, 28,
+228,210,247,232, 90,128, 50, 3, 67,190, 42,213, 38, 15,141,171, 46,133,190,234,217, 16,214,104,248,121,129,243,115, 83, 29,107,
+238,158,141,166, 78, 82,170, 84, 93, 1,163, 12,172, 38, 11, 84,138, 9, 38,165, 46,244,179,142, 17,200, 7,127,159,142,150,210,
+ 23, 66,106, 34, 68,205,193, 65, 70, 49, 54,179, 10,212,139,196,130,164, 68,150,177,124,189, 19, 2, 10, 84, 37,164,220, 18,238,
+100, 77, 65, 56,220,136, 88, 42, 21,102,220,141,122,239,112,219, 14, 56,107, 17, 83,129,213, 64,136, 10, 33, 23, 76,214, 32, 23,
+133,253, 8, 88,151,153,186,225,146, 97,103,143, 16, 2, 9, 48,141,102, 56,150, 2,106, 70,136, 68,138,219, 98, 70, 56, 40,110,
+213, 90,139,135,211, 9,239, 95, 95, 25, 94,100,240,225,122,224,241,225, 1,198, 88, 20, 36,148, 42, 25,244, 12,218,209,160,115,
+ 76, 89, 32,101,122,246,121, 20,111,140,230, 66, 69,183, 73,129, 20,121,212, 32,104,212,148,113,196,140, 61, 36, 56,155, 91,226,
+ 96, 1,224,141, 25,236,181,250, 46, 75, 64,180, 17,133,207,237,130,202, 62,120,234,208,201,250,168,144, 65,162, 98,195, 29, 37,
+198,203,150, 47,117,173, 85,203,192,112, 66,187,171,154, 3, 89,185,243, 44, 64, 77,145,237,119,134,138,156, 92, 17,143,131,149,
+241,190, 61,227, 34,244, 83,236,167, 31,215, 14,131, 46,123,176,103,143,161, 70,212, 73,169, 65,165, 86,229,247,106,147, 45,197,
+220,143,218,128, 67, 77,129, 94, 53,246, 16,113,221, 14,242,216, 91, 15, 56,203,172,151,193,174,220, 26,238,122, 31, 19,123,175,
+ 51, 29, 69,242, 20, 69, 91,129,162, 58,224, 73, 51, 29, 73, 13,186, 55, 93, 53,170, 66,119,120,169,150, 91,219, 93,240,125,220,
+223,187,242, 50,208,148,234, 93, 80,131, 36,208,244,177, 91,142,113,176,112,177, 93, 65, 15,106, 66,185, 52,184, 74,146,145, 13,
+ 0,124,255,238, 3,230,245, 12,109, 12,166,211, 3, 62,126,248,128, 63,250,195,127,128,199,199, 71,252,249,159,255, 57,158,159,
+ 31, 17,182, 43,188,179,120,251,238, 29,148,162,140,237,183,239, 63,160, 2, 56, 98,230,135,140, 42,206,152, 74, 87,229, 26,131,
+211, 60, 13,251, 73,250, 48,231,217,225,203, 47,127,132,227,216,177, 31, 52,238,203,137, 46,104,233,152,180,236, 5,161,200, 66,
+ 86,104, 12,154, 83,194,113, 28,108,145, 1, 85,173,210,101,213,218, 66, 4,140,238,153,202, 93,121, 10, 22, 88, 25, 64, 27,178,
+ 71,213,126,105,139, 24, 66,176,189, 98, 47, 86, 90,181,224,151,230,246,101, 65, 79,145, 64, 10,222,195,202, 1,102,140, 37, 94,
+190,177, 44,170, 82,109, 34, 64, 64, 13, 58, 20, 69,188, 37,148,180,194, 94,127, 97, 94, 75, 49, 33,175,175, 14,236,113,205, 29,
+153,128, 25,196, 54,243,122,189,226, 87,191,249, 30, 0,240,254,229,138, 55,143,103,196,152,154, 21,232,253,199, 23,204,204,153,
+174, 85,225,195,229,138,143,151, 43,142, 20,113, 57, 2,230,121,106, 94,124, 84,178, 11,201,207,152, 10,117,200, 70,107,204,222,
+227,182,237,136,199,141,188,177,133, 4, 80,185,144, 7, 89, 0, 18, 84, 28, 8,227,156, 44,109, 50, 86, 78,114, 24, 73,103,170,
+ 13, 66, 12,112,150, 66, 46,192,207,130, 4,224, 56,235, 80, 75,130, 18, 92, 46,175,124, 38, 86,241, 58,195,130, 76, 33, 52,142,
+174, 16, 37,133, 9,125,111, 34,167, 14, 54, 97,236,224, 35,150,128, 19, 17, 18, 85,174,234,107,201,236, 39,207, 77,213, 12,142,
+188, 53,252,220,228, 82, 59, 17, 82,119, 5,122, 17,226,149,170, 40,255, 63,192, 13,122,140, 88,108, 36, 43, 3,163,177,156, 30,
+225,253,220,242,182,107, 91,217, 81,225,101, 53,101,121,123, 75, 1, 39, 98, 89,204,185,176,155,192, 1,218, 34,131,118,210,168,
+ 9,181, 36,130, 3,233,158, 82, 23, 75, 97,142,119, 38, 78,248,208,241,129,253,193, 21,170, 9, 96, 19, 79, 11, 68, 96, 42,246,
+ 59, 25,157, 82, 56, 10, 61,231, 33, 80,250,223,109,219,144, 74,134,202, 36, 88,139,199, 1,239, 12,110, 71,196,100,105, 69, 21,
+195,142,146, 51,110,251,129,146, 2, 82,140,248,120,185,193, 25,131,112, 4,188, 92,174, 48,156, 75,241,241,245,130, 90, 43,142,
+ 16,177, 31, 7,142,112,144,245,150, 83, 29,183,237, 74, 25, 11, 21,248,234,139, 47,176, 78, 19,145, 34,173,131,245, 19, 66,213,
+168,156,176, 86, 75,225,179, 64,181, 66,142, 80,173,174,209,227,104, 18, 98, 88, 87, 96,216,210,103,154, 67, 70,137,125, 13,132,
+ 96,246,142, 10,160,192, 72,215,170,168, 65,145, 44, 3,111, 45, 44,251,208, 59, 61,178, 83, 23,199, 24,237,204, 23,186,196,236,
+130, 63, 11,161,221,149,114, 63,117,170, 67,113, 10,225,216,131, 58, 91,163, 53,172,163,168,236,156,107,223,147, 11, 4, 45, 39,
+212, 18, 25,229, 91,218, 5, 40, 52,188,145,112,170, 10, 59, 30, 10,218, 93,165, 70, 64, 82, 11,219,234,107,229, 70, 98, 20, 28,
+156,252, 17, 77,140, 9,158, 94,150, 54,177,144, 53, 78, 76, 25,151,125,199,182, 29, 56,142, 3,114, 90,151, 81, 72,174,250,208,
+236,158, 82, 55,200,211,196, 6, 55,174,201,228, 71,226, 9,157,208,249,104,226,168,219,142, 31,114,134, 3,176,181, 73, 97, 74,
+251,225,239,243,227,250,159, 38, 21,189,106, 60,226,254, 11, 75, 79,132,199,175,126,120,215, 70,112,210,255,125,254,252,136,203,
+183,111,161,172, 65,225,177, 6, 1,249, 21, 18,192, 59, 97, 34, 47,253,205,175,190,197,207, 80,177,204, 11,172,159,240,171,111,
+254, 14,223, 64,225,195,203, 11,190,158,103,220,182, 13,219,245,130,175,191,250, 49,158,255,254, 51,254,230,175,254, 18,219,182,
+ 35,230,136,203,117,135, 51, 10,181,234, 86, 13,210,131, 6, 68, 22,231,144, 56,142, 34, 84, 95,174, 55,172,203,130,201, 26,188,
+124,252,128,201,123, 76,243, 2,239, 44,188,139,237, 50, 47, 41, 33,199,192, 99, 75, 18,245,164, 82,177,241,135, 41, 98, 45, 53,
+208,146,180,116,192,170, 7, 72,168, 97,119, 78,211, 80, 9,182,200, 29,236, 49,148,110,210,209,169, 97, 50, 34,140, 0,107, 45,
+119, 41, 25, 19,239, 77, 67, 46,208,186,246,189,186, 82,109, 63,111,180,109,213,251, 8, 47, 24,147,185,164,211,211,138, 68,116,
+ 34,148, 73,220,133, 9,227,188,109,161, 4,197,168,168,160,209, 90, 35, 38,226,101,103, 30, 13,159,215, 5,147,247,248,225,195,
+ 11, 82, 41,120,247,114,161, 74,182, 84, 28, 71, 36, 71,129,181,205, 25, 80,132,101, 80,129,217, 90,196,152,112,154, 28, 98,202,
+ 44, 66,161, 55, 35, 55, 15,114,133, 53,116, 89, 79,222, 67,105,141,237,118, 35,193, 17, 72, 52,150, 88,137,174, 77,199,153,210,
+232,154,133, 81,232, 7, 79, 44,153,105, 97, 6,235,249, 9,111,127,248,182,249,148, 81, 42, 66, 45,152, 45, 21, 94, 33, 28,176,
+126,110,187, 45,111, 13, 98, 74, 48,214, 66,167,132,204,187,126, 26,145,131,225, 32,108, 75, 42, 93, 8,153,219, 23,141,198,124,
+168,104, 96,160,177,211, 25,230, 51,180,207, 76,137,127, 63, 61, 76,188, 4, 92, 84,219,174,182,125, 23, 43,165,138,117, 63,110,
+143, 43,109,176, 47, 53, 68,185,242,159,105,140,193,178, 44,128,182,221,226, 83,105,114,162, 5, 85,170,137,255,175, 80, 27, 12,
+232,225,241,220, 70,163,198, 26, 56,231,113,185,110, 72,145,227,147,181,134,213, 84,180,169, 22, 55,201, 98,202, 84, 48, 57, 71,
+ 96, 26,177,101,138,202,152,211,201,210,113,112,129,101, 73, 36,201, 98,201, 24,201,105,145,249,121,206, 85, 70,198, 9,123, 72,
+ 88,188,197,118, 36,156,103,139,215, 91,192,227,105,198,245, 72, 88,103, 79,188,138,201, 33,196,128,253,136, 56,207, 30, 33, 87,
+226, 49, 88,131, 61, 38, 56, 69, 89, 16, 71,169, 88, 44,137,244, 46,151, 27,188,161,207,229,122, 4, 10,199,169,192, 37, 68,120,
+163,240,114,219,120, 23, 77, 52, 71,103, 12, 38,111, 97,140,133,159,102, 56, 71, 58,148, 61, 74,248,140,186, 67,148,106,254,238,
+217, 22,136, 66,235, 45, 69,227, 11, 24, 13,100, 46, 2,154, 18,190,246, 96,242,156, 51,252, 50, 33, 36,254,142,105, 3,205,127,
+182, 1,211,235, 88,231,129, 70,255,148,243, 93, 67,229,220,110,164,194, 23,106,230,248,227,202,130,194,102,227,226,253,119,225,
+221,187,106,162,179, 46, 30, 43,181,112,192,140,130,174,108,127,227, 8,214,194,218,162,152, 34,117,242,138,238,136, 59, 20,113,
+115, 0,220,143,247,235, 48,106, 86,227,115, 62, 56,188,106,233,209,169,252, 70,210,141, 89, 6,222,122, 37, 96, 16,117,241,165,
+ 53, 79,133,113,123,149, 57, 31,185, 84,220,246, 8,111, 15, 88,231, 48,159,106, 79, 82,227,203, 88, 86,133,247, 98,243, 33,177,
+176, 18,184, 13,172,218, 87,162,232,107,197, 89,109,217,220, 85,201, 12,142,213,210,195,152, 95, 85, 5,171, 84, 33,127,106,187,
+ 4, 10,127,225, 63, 77,141,169,189,122,151,176,146,134,216,171,119, 93,196,235,229,134, 33,191, 30,181, 86,204, 12,140, 40, 60,
+ 90,195,200,174,101,197,119,209,252, 1,161,226,155, 95,127,143,217, 19, 69,108,158, 60, 74, 78,164,142, 55, 22,179, 51,176,206,
+226, 79,255,245,191,194,215, 95,253, 24, 63,249,250,107,252,221, 47,255,154,236, 71, 57, 35, 6,234,204,102, 71,249,198, 25,180,
+ 19,115,154,118, 74,226, 27, 14, 41,227,171,207, 30, 81,114,193, 15,223,191,197,190,109, 88,215, 21,203,178, 99,158,103,120,142,
+ 31,212,108,109, 74, 33, 0,204, 16,223,246, 29,219,190,227,195,135, 23,220,246,157,252,167,106, 56, 16, 7, 63,177,101, 79,167,
+110,151, 9,239, 43,121,196, 37,157,180,224, 35, 49,120,213,101,202,160,161, 33,171,146,204,129, 30,149,253,237, 78,107,196,156,
+250,239, 63,232, 36, 10,143,148, 51,143,234,172,238,184, 70,153, 86,210,196,132,118,171,140,142,110,233,104, 2,175, 48, 90,119,
+245,190, 33, 15,182, 36, 65, 41, 5,196,148, 49, 47, 14, 49, 38, 44,203, 4,203,145,181, 91,136, 52, 61, 41, 7,142, 24,241,163,
+231, 39,236, 97,199, 22, 34,140,211,220,225, 68, 74,126, 74,192, 30, 35,150,201, 99,114, 6,219, 78,233, 80,214,104,220,142, 64,
+106,219,148, 91,199, 64, 9, 84,156, 65,175, 20,121,238,133, 15, 94, 42,140,120,129,121, 28,172, 26, 85,138,222,203,204, 93,174,
+224, 91,101, 47,173, 53, 97, 68,231,121,197,135,119,223,113, 72,132,236,180, 20, 78,203, 76,151,136,210, 28,205,203,169,106,149,
+ 58, 81,239, 44, 82, 56, 48,123,139, 92, 40, 86,179, 42,133, 34, 62,117, 14,180, 49,176, 45,156, 36,151,218,255,140,218, 71,119,
+ 85,152,227,165, 48, 38, 82, 49,141, 75,241, 10, 97,132,172,160, 77, 79,138, 56, 86,134,110,191,160,231, 59,116, 27,208, 56,251,
+171,172,102,239,133,168,209, 26,147,159,136,143,103, 29, 19, 19, 89,108, 84, 50, 52,104,175, 56,115,150,116, 46,153,186, 61,231,
+176,178,184, 48,165,130,231,211, 3,142, 72,218,137,112, 92,169,243, 82, 10, 78, 43,236,219,214, 20,207, 90, 91,164,170,160,236,
+ 4, 93, 35,128,138,144, 43, 20, 10,182,148,219,229,150,148,134,202, 1,161,144,154,254, 8, 1,149,225, 75, 65, 91,120,171, 16,
+ 34, 61, 59,175,219,129,217, 25,220,246,131,146, 25, 61, 61,215,139, 5,182, 88,241,124,154,177,199,136, 89,211, 81,169, 75,134,
+170,116,129, 60,159, 39, 98, 58,196,136,211,228, 1,165, 16,142, 13,126, 93,145, 75,129, 43, 17,214, 44, 56, 66,130,169, 25,235,
+180,226,229,118,224,121,241,120,185,109,136,176,200,199, 14,227, 44,139,186, 72,202,246,229,231,111, 48, 79, 14,206, 26,172,211,
+ 4, 59,209, 58, 67, 27,141,203,145,240,188,122,154, 32, 40, 78,154, 43,125, 82,103,172,129,149,142,185,212, 33,214,185, 54,101,
+184,240,233,179,234,240, 52,210, 90, 84, 56,246,235, 67,105, 76,156, 72,105,137,125,203,142,132,122,215,215,213, 82,161, 12, 11,
+165, 83,109, 54,204,194, 13,109, 46, 5,208,166,165,112, 86, 94, 67, 81, 39, 95, 26,211, 66, 13,164, 70,113,157, 0,164,205,200,
+ 42, 53, 5,127,206,149, 62,207, 22, 84, 67,147, 7,173,249,210, 86, 68,199, 44,220,141,183,100, 93,213,253, 26,205,108, 60,104,
+ 74,100, 63,174, 26, 66,121,104, 59, 11,229, 29,140,247, 59, 64,147, 26, 90, 23,243,157,167, 10,235,237,244,128, 89, 38, 49,238,
+117, 15,176,238,192, 57, 4,152,101,161,247,130,243, 8,218,189,171, 56,140,101,128,216,180,197,119, 81,253,226, 87,146,209,221,
+140,229, 45,159, 69, 53, 29, 86,189,183,158,202, 4, 75, 46,240, 90, 49, 92,210,140, 29, 28, 47,118,137,107,172,221, 8, 79, 23,
+119,225, 15, 25,205,250, 48,207, 83, 19,101,137,159,215,123,199,221, 12,141, 60,107,227, 33,211,135,158,249, 3,148, 57, 97,173,
+ 25, 71, 82,152,188,103, 62,188,131,137, 17, 87,142,108,253,171,191,250,127,145, 82,193, 47,191,249, 6,127,251,205,175,218,184,
+247,113,246,120,158,167,230,103, 6,123,248, 68, 1,110,161,145, 77,133, 50, 6, 70, 43,252,223,191,248, 59,252,211, 63,249,167,
+248,239,254,155,255, 26,167,243, 9,231,135, 7, 78,105, 59, 99,158, 23,204,147,231,221,106, 65, 14, 17,202,104,236,183, 13,215,
+109,195,251,247, 31,240,238,195, 7,236, 49,183, 7, 93,250, 72, 34,209, 17, 3,185, 12, 84, 47, 73,231,209, 74,118,180,106,232,
+124,234,176,111,186, 79, 9,234,251,150,145, 37,204,239, 47, 91,170,246, 16,238, 46,242, 42, 33, 23,124,249, 23,142,203, 76,146,
+254, 54, 40, 41, 32,251,255,198,254, 23, 49, 16, 93,156,198,232,118, 32,149, 82, 16, 7,155,199,236, 72,236,243,122,221,240,197,
+211, 3, 85,222,138, 58,147,199,117,225,232, 76,138, 90, 13, 41, 98, 63, 34, 78,203,132, 82, 50,231, 46,159,145, 82, 66, 58, 2,
+188, 49, 56, 34,229,197, 75,183,153, 21, 29, 14,130,221,140,108, 21,234,143, 60,112, 90,166,246,207, 66,140,176, 28, 71, 91,107,
+197, 17,201, 42,132,193,129,173, 21,241,175,139,132,109, 72,241,165, 74,227, 69,111,251,141, 25,240, 29, 59,170, 0,130,166, 56,
+ 11,173,137, 96, 87,106,133,117, 11, 97, 56,115,228,192, 6,133, 24, 73, 76, 69,192,156, 8, 47,116, 45,222, 3, 75, 64,135, 28,
+112,226,139,111,105,137,106,180,153,245, 73,141,102,231,130,192,132,170,136,222, 24,140, 34,227, 69,201,209,238, 25,206,232, 69,
+139, 22,102,127, 39,147,169, 65, 36,167,248, 51, 83,154, 44, 72,206,186,102,123,166,181, 69,110,207,168,211,180,139,181,236,157,
+ 50, 90,147, 69,204,121,104,237,224,108,193,135,143, 31,225,173,193,117,219, 88, 64,167,224, 29,217, 80,193,171, 49,173, 12, 66,
+ 34,161, 80, 42,133, 70,242, 85,195,148,128, 35,102, 82,201,103,114, 30,164,180,147,127,149, 31,210, 10, 0, 0, 32, 0, 73, 68,
+ 65, 84,187,100,236, 0, 38,107,176,237, 59, 38,103,145, 34,225,140,105,215,236,224, 84, 65, 74,192,121,246,136, 49,194,121,143,
+151,235, 13,211,121,197,137,191, 47,179,115,152, 39,135,215,203, 13,167,117, 70,229, 80, 33,109, 44, 82,140,120, 62, 45, 36,228,
+188,238,120, 58,175,136,185, 32,196,136,167,211,140, 92,129, 20, 54, 60, 63,156, 41,181, 16, 25, 86, 89,156,188,195, 15,175, 55,
+172,206,226,221,245,218,198,209,206, 90,204,206, 81,102,185, 49,248,241,103, 79,120, 23, 0,235, 92,155, 42,228, 10,122,125,181,
+ 12,163, 89, 22,186,114, 90,163, 76,147,169, 24, 76,173, 8,211, 28, 24, 69,186,139, 2,209,207, 17, 15, 32,224,180,204,208,198,
+146,248,204,123,248,105,130, 99, 40, 76, 23,218,149,230,130,170,181,182, 73, 98,169, 29,230, 83,185,137, 17,207,128, 54,150, 41,
+154,188,167, 79,137,214,119, 74,144,221,170, 65,125,122, 8, 17,159, 77, 60,254, 79, 49, 96, 59, 54,134,242,128, 38,126,165,175,
+ 23,219,137,197, 52,183, 34,221,184,174, 32,193,123, 97,109, 87,103,118, 87, 62, 51, 85,237,214,205,182, 82, 82, 60, 77,173,162,
+116,231, 98,160,244,219,189,138,130,121, 92,135, 53,138, 93,109, 13,198, 30, 19,220, 30,112,221,118, 60,174, 75, 71, 4, 15,235,
+ 2, 85, 63, 69,173,247,243, 94, 98,185,101,253, 47, 1, 75,212, 8, 83, 3,172,180,106, 97, 49,237,252,191,211, 69, 1,150, 82,
+194, 36,244, 93,212,196,138,163, 6,201, 10,160,238,193, 86,141,123,219,246,238,124, 8, 20, 30,245,124,254,217, 19,229,107,139,
+161,159,127,216,117,242,184,134, 76, 63, 28,143,131,132, 3, 45,121,227, 26, 68,229,209,138, 30,204, 35,105, 28, 49, 32,199, 13,
+251,113, 96,223,247,187,188,102,137,172,252,217,211,153, 15,137, 60,228,241,178, 56, 68, 84,178,170,194,104,234, 34,254,179,255,
+252,191,194,229,242,138,255,231, 47,254, 28,255,236,127,252,103,120,123,221,241,254,182,227,252,254, 3,150,121,194,249,241, 17,
+ 15,143, 79, 56,157, 78,112,222,209,232,137, 69, 82,151,235, 5, 47, 47, 87,188,253,225, 29,174, 91,160, 46, 75,198,230, 21, 61,
+120, 65,117, 50, 87, 29,246,169, 35, 77, 78, 84,188,134, 49,127,119, 27, 15, 40,124, 26,124,213,212,201, 2,243,104, 35,227,114,
+167, 4,110,252,128,150, 5, 79, 69, 78,228,206,116, 92, 21, 64, 49, 16, 72, 41,164, 34,182, 20,122,152,168, 75,160, 75,214, 26,
+141, 90,128,204,236, 98,241,221, 30, 49,193, 57,131,213,211, 36, 68, 70,175,235, 50,225,118, 28,152,189, 71,204,137,189,176, 21,
+231,117,193,182,111,152,167, 9,251, 65, 35, 78,137, 19, 77, 92,228, 29,252,165,158,188,197, 30, 83, 91, 13, 88,125, 31, 93, 43,
+187,245,135,117,198,118, 4,196, 16, 73, 24, 23,248,231, 8, 17,147, 51, 60,210, 67, 27, 83, 11,112,195, 90, 10,243,209,140,127,
+117,206,145, 23, 55, 23,196, 18,176,174, 79,216,143, 31,136,106,199,187,218, 82, 51,226,177,195,157,206,188, 99,231, 80,143, 68,
+ 23, 78,137, 17, 90, 89, 88, 21, 49, 79, 14,241, 40, 48,172, 44, 78,137, 50,234, 69, 61, 76,252,125,141,217,211,184,183, 98, 24,
+131,183,103,160,119,213, 77,179,144, 41,228, 36,151, 65,140,202,107, 3,136,141, 81,201, 78, 82,194, 74,200,173, 32,250, 23,169,
+241, 75,243,241,150,102,169, 90,150,149, 14,114, 77,177,150,149, 71,142,214, 57,134,160,144,112,212, 59,178, 33, 82, 32, 11,189,
+135,211,188,208,158,151,131,146,114,205,152,189, 7,180,198,156, 61,106,205, 28, 79,155, 57,222, 23, 40,138,118,239,215, 35, 81,
+151,150,104,213,229, 13,133,215,156,103,143, 84, 56,201,139,215, 44, 71, 56,160,181,197,108,136,176,118,158, 39, 92,247, 3,167,
+153,158,171,105,158,112,132,128,101,242, 72, 41, 34,102,131,211, 66, 59,236, 55,231, 21,218,104, 88,109, 48, 77, 52,129,216, 67,
+196, 52, 81,103,174,141,129, 6, 17, 40,189, 51,109,173,116,158, 61, 82, 78,212, 61, 42, 74, 9, 67,206,120, 88,102,172,243,132,
+247,215, 29, 95, 60, 63, 34,166,136,237,168,248,226,188,210,148,230,122,107,252,239,175, 62,251, 12,147, 39,210,226, 50,123, 40,
+173,240,195,118, 33,221, 13, 79,209, 46, 91,192,105,246,200, 37, 33,243,101,147,217, 62, 44,246,202,146, 51, 52, 79, 39, 50,147,
+ 46,149, 50,100,173, 42, 26, 58, 43, 82, 92,215,222, 83,118,165,189,106, 5,128,117,174, 89, 70, 43,135, 61,213, 90,128, 82,155,
+102,170,100, 98,181, 23, 89,123,105,158, 62, 85, 64, 25,139,196, 43,192,194, 57, 26,134,159, 15, 81,179,151,220, 5,152, 45,131,
+189,170, 6,220, 34,189, 67, 66, 56, 2, 82,228,149,210,224,238,168, 82,176, 14,187,239, 34, 29, 48,120,218,172,121, 47, 32,150,
+ 25,213, 5,121, 21,133, 70,218,172,128,215, 85, 13,212, 84,137, 9,238,246, 49,136, 95,157,125,234, 90, 20,245,247,169,230,141,
+168, 42,216,216, 35, 38, 92,182, 13, 15,249,113,252, 6,247, 96,211, 58,240, 95,152,224, 40, 64, 25, 45,150,201, 86,188,117, 38,
+ 4, 77, 42,116, 43,224,169, 63, 54,205,165,161,153,222,167,181,129, 21,164,162,236,253, 1,121, 8,208,240, 55, 69, 13,162,129,
+118, 64,244,101,126,109, 93,124,109,187, 20,109, 44, 83,213,232,141,248,246,251,183,248,234,203, 47,240,139,111,126,211, 42, 12,
+249,144, 69,224, 81, 89, 80, 86,147,228,236, 82,117,104,172,163, 23,236, 22,248,133, 70, 88,198, 90,250,231, 74,195,234,130, 21,
+ 7, 42, 20,156,169,109, 7, 44, 2,183,204,187, 45,217, 42,124,246,197,151,248,135,127,252,143, 81, 43,240,217,163,199,255,240,
+ 39,127, 66, 44,112, 5,132, 82,177, 95, 54,124,255,122,195,242,221,247,120, 60,173, 88, 78,167,246,166, 42,165,176,237, 59, 94,
+ 95,175,184,222, 54,196, 74,157, 69, 22, 85,130,238,156, 99,213,231, 66,173,115,175,181,171, 65, 85,237,226, 57, 25, 83,141,204,
+ 2,121,111, 69, 41,143, 90,239, 30, 42,241, 45,210, 1,164,137,221, 95,251, 94,214,114,113,145, 89,180, 24,115,102,241,148,226,
+ 72,214,220, 5,111, 32,113, 85,206, 93, 43, 81,106,133, 98, 33,140,145,128, 12,213, 69,114,154, 5,142, 34, 56,148,241,102,169,
+ 6, 33, 18,237,205, 26,162,218, 57,107,240,186,109,208,218,224,181,100,172,222,226,114,219,105,199,204,127,214, 17, 35, 61, 59,
+ 74,225, 26, 19,172,162, 17, 42,106,223,233, 11,226, 22,237,231, 6,243,169,121, 50,227,232,153, 48, 77, 1, 12,114, 21, 12,220,
+110,180, 52,188,138, 16, 99, 3, 61, 80,130, 27,216,207, 76, 7, 95, 8,148, 45, 63,207, 19, 65,141,166,137,136, 95,154,172,126,
+214,204, 80,218,162, 64, 83,247,174, 42, 98, 41,112,222,195,164, 0, 99,200,218, 69,147, 7,250,112, 73,123, 64,135,136, 4,211,
+212, 65,116,104, 56, 86, 85,190,176, 49,215, 65,143, 97, 90,250, 87, 25,220, 37,130, 99, 46, 50,238, 99,213,174, 80,178,212, 39,
+216,231, 58, 64,109,154,128,135,191, 47,218, 24,130,165, 24, 75, 59, 79, 69,226, 63,165,250, 68, 45,197, 64,240, 16, 99, 9, 39,
+106, 12,139, 48, 53,180, 50, 56,157, 86, 28,251,134,219,245, 21,235,186, 96,158, 61, 94,175, 27, 61, 19,202,114, 58, 32, 77, 99,
+156,181,152,252, 68, 43,168, 18, 96,107, 66, 42, 25,159,159, 23, 92,182, 3,231,217, 67,107,131, 55,143, 39,188,125,255, 1, 15,
+231, 21, 49, 70,156,150, 5, 53, 39, 34,153,105,141, 35, 85,124,241,120,194,245,136,248,252,249, 1, 31, 94,111, 56, 77, 30,123,
+ 8,248,236,249,169,225,160, 83,164,255,102,154,124,227,188, 91, 80,164,242,228,108, 91,179, 36,134,161, 56,107,113,196,222, 9,
+ 63,156, 86,132,148,225, 45,189,247,126,158,144,115,193, 30, 19,158, 79, 51,165,251, 57, 15,173,118, 84, 20,188,125,221, 26,207,
+ 67,105, 42,128, 28, 63, 67,214,104,156,102,143, 55,179,193, 1,210,167, 40,208, 57,116, 82, 26, 25, 6, 25, 25,170, 20,164, 66,
+151,139,124, 70,198,218, 86,239,147, 71,220, 52,168,137,102,237, 14,165,187, 73,206,108,109, 43,172,197,235, 54,189,212,138,196,
+191, 90,162,217,134, 14, 83, 46,245,156, 50,160, 57,102,186, 84,168,196, 72, 89,110, 28, 98,224,194,220, 80, 16, 76, 75,249, 51,
+150, 71,229, 12,134,105,142, 21,141, 10,141,156,169,136, 67,230,213,132,136,216,208,155, 71,250,145, 74,115,121,168, 97, 85, 38,
+ 23,164,110,145,162,159,108,171,185,241, 84,124,177,107,233,184, 71,140,106, 37,174,126,139, 21, 20,180,172, 64,154,134, 81,126,
+155,102,214,193,144, 54, 8, 69, 83, 38,142, 70,179,159,181,177,191,106,171,229,170, 70, 42, 28,189, 23,154, 53, 34, 18, 64,166,
+ 4, 83,141,123, 13, 80, 5, 37,141, 26, 94,113,105, 99,155,187,131,238, 92,206, 83,239,106,103, 81, 75,143,249,178, 67,165,223,
+ 8,115,244, 34,202,157,136,142,127, 77, 1,148,202,248,195,159,255, 61,252,233,159,253, 27,196, 72,148,161,183, 31, 62,226,241,
+241,177,139,193, 84,109,170,206, 82, 50,140,241,124,152,101, 82,113,231, 2,104,139, 90, 18,127, 86,180, 75, 51,206,163,216,218,
+222, 20,234,242,193,193, 23, 26,206,160,161, 50, 45, 23, 10, 95,124,253,219,248,240,155, 95, 35,101, 42, 88,190,250,241, 79,240,
+211,159,253, 46,126,253,171,191,195, 63,252, 71,127,140,117,158,144,114,129,211, 10, 86, 1,123, 37,161,198,199,152,241,238,221,
+ 11,212,187, 23,156,140,134,103, 11, 87,226,120,211, 80,137, 30, 84, 0,234,212, 89,165,216,212,254,181,131, 81,148,238,149,225,
+ 56,250, 38,232, 75, 31,207, 75,113,166, 6,240,140,102, 26,156, 30,186, 83, 35,122, 4,213,133, 84,210,165, 41,190, 32,146, 6,
+ 20,179,238, 69, 88, 83, 25,172,211,252,147, 3, 81, 48,243,133, 89,134, 47,134,120,173,115, 45,132, 33, 29, 28, 18, 50,250, 19,
+232,132,140,227,143,152, 48, 59,139,143,151, 27,188, 53,152,188,195, 17, 2,188,115,168, 74,195, 26,133,237,160,172,114, 36,234,
+ 12, 73, 81, 90,145, 10, 37,117, 25, 5,132,148,219,207,104,141,198, 30,115, 75, 24,202,181, 14,244, 46,219,160, 50,214,106,132,
+144, 88, 11, 64, 7,114,229,157,191,200, 75,156,181,208, 70, 97,191,221, 26,157, 79, 10, 46, 45,130, 31, 30, 57, 78,126, 65, 41,
+ 87,118, 1,208,151, 48,134, 29,126, 93,144, 99,198,142,128,101,177, 4,231,137, 9,211,178, 16, 23, 59, 70,102,131, 43, 44,147,
+167,209,227,141,216,223,109, 21,100, 8, 40, 67,193, 20,181,143, 82,209,179,205, 1,153, 94,141,249,232,156, 65, 62, 36,138,145,
+ 40, 72, 48,186,242,175, 74, 19, 76, 10,252, 73,252,210,141,237,206,234,104,153, 90, 76,158,186, 91, 41, 98, 41,225,203, 64, 91,
+234,228,228,125,151,168, 84,241,171, 91,231,145, 18,197,228,150,156, 8, 26, 19, 3, 78,235,130,243,105,109,216,227,219, 22, 97,
+103,135, 20, 50, 98,136, 80, 74, 97,101,173,204,118, 4, 76,134,132, 29, 79,235, 12, 40,133,199,211, 2,231, 39,242,184, 3,120,
+ 56,145,136,117,153,102,236,251, 6, 24, 15,203,235, 1, 99, 2,166,105,166, 49,173, 50,120, 88, 39,148, 82,241,252,248,128,201,
+123,196, 68,138,119,205, 23, 15, 61,243, 20,144, 82, 75,101,159, 57,237, 60,215,101,197,245,122, 33,199, 3, 23,207,206,218,198,
+ 89, 55, 80,168,204,172,207, 57, 99, 93,102, 14, 26, 50,176, 90, 97,223,119, 60,174, 51, 50,128,191,253,225, 35, 61,223, 74,225,
+249,180,144, 45, 47, 39,160, 26,254, 43,240, 48, 83,142,193, 50,205,188, 34, 49,136, 89,224, 49, 26,145,185, 17,161, 18,156,197,
+242,231, 67,233, 94, 52, 37,169,182, 55, 2,122,252,108, 21, 69, 47, 75,243, 21, 98,196, 92, 11, 19, 38,115,187,128,181, 54, 80,
+102,128,243,176, 35,134, 8,141,212,153,155, 10,158, 90,154,214, 9,151, 90, 80, 20, 5, 99,249,229,140,196,251,112,210, 75,229,
+158,113, 78,194,150,134,137,142,113, 39, 4,112,206, 13,220, 83,219,153,216,169,105,149, 3,174,132,165, 65,113,182, 24,114,214,
+ 11,255,122,225,189, 15,235,171, 65,176, 61,102,138,246,196, 52,158,134, 22,197, 59,245,218,211,213,138,106, 4,197,170,250, 20,
+ 64, 13,171, 49, 42, 39, 74,107,106, 69,131,148,115,134,182,102, 8, 57,173,237,181, 55,212,171,104,213, 36, 20, 74, 10,149, 90,
+251,101,222,209,240,212,192, 88, 2,108, 73, 81,231,156,135,226,105,106,201, 25,185, 36,194,196,202, 40,151, 68,112,188, 83,175,
+ 84,101, 20, 54,238,183,117,124, 29, 86,243,194, 37,144,241,135,146,124, 90,224,244,248,136,117, 93,113, 28, 59, 50,119,154,223,
+124,251, 29, 71, 70,162, 69, 42,118,240, 74, 65, 98, 79,176,196,235, 37, 17,131,112,101, 45, 44,121,140,208, 9, 5, 76,134,140,
+253,164,164, 52, 45,129,138, 68,130, 26,143,235,138,221, 89, 20,147,145, 50,240,147,159,253, 46,230,105,198,223,254,205, 47,240,
+215,191,248,183,172, 38, 37,177, 30,241, 43, 10,119, 98,157,179,254, 62, 22,212,144,219, 4,252,249,249, 25,251,235, 11,229,126,
+215,218,115,209,107,101, 6,111,151, 91, 54,130,209,184, 35,191, 11,188,225,157,212, 64, 18,211, 80, 72, 53,195,192, 32,183,148,
+174,238, 89, 46,165, 80,212, 95,209, 48,134, 95,247, 56,194, 23,177,149,136, 90,184,203, 32,113, 21, 95, 21,181, 54,229,244,221,
+222, 30,184, 3, 12,169, 97, 31, 43,171,170, 81, 49,159, 11,237,173, 79,243,132, 35, 70, 24,165,240,178,237,236, 3, 46,184,110,
+ 7, 82, 46, 56,175, 10,208, 6, 70,129, 59,247, 29,150, 21,192,215,237,160, 85, 1,128,203,182,243,136, 92,181,144, 19,161,255,
+149, 49, 65,144,255, 58, 25,221,196,133,228, 74, 40, 28,118,131, 6,225,137, 53,183,231,198, 26,138,130,212, 28,114, 67, 99, 61,
+ 98, 82,151,220,125,193,214,159,176,111,215,214,185, 89,165,219,100, 34,196,132,117, 61, 33,198,140, 28,105, 47,255,252,244, 6,
+183,235, 5,161, 84, 60,174, 43,226,126, 67, 44, 26,181, 36, 24,198,241,230, 82,161,106,193,118, 36, 88,230,158, 91,205, 1, 50,
+ 60, 50,180, 28,132, 2, 6,226, 24, 30,171, 10, 19, 60,198, 30, 38,116, 39,123,225,226, 87, 86, 99,170, 3, 78, 71,237, 83,163,
+ 25,130, 59, 1,203,170,116,163, 53,182,125,231,110,139,248,230,203, 76,164,177,154, 41,117, 80, 43,133,144, 51, 60, 91,172,150,
+229,132,201, 79,120,121,253,200,124, 10, 71,202,243,201,163,150,140,201, 79,184, 92,111,188, 59, 87,152,189,109,175,115,246, 30,
+206, 19,124,134,194, 80,136,136,232, 12,117, 45, 4,103,153,225, 24,173,250,241,229, 5,206, 26, 76,211,140,152, 18,230,105,110,
+103,200, 17,104, 87,156, 11, 5, 26,197, 40,182, 69,154, 4, 30, 33,192, 89,141,253,200, 72, 57, 97,241, 19, 66, 32,182,251, 60,
+ 79,208, 86, 53,230,118, 5,112,236, 27,102, 79, 90, 17, 40, 13, 63, 77,168, 57, 99, 89, 87,164, 24, 97,157, 69,136, 36,160,164,
+105, 84,194,105, 89,136, 89, 63,123,104, 40, 92,142, 3,151,253,224,223,147, 14,236,137, 83,225,196,121,146, 82,230, 80, 27,141,
+124, 92,145, 52, 37, 8, 22,165,112, 48,135,157,138, 10,158, 8, 50, 35,221, 14, 88, 97, 99, 20,211, 1,105,124, 47,110, 31,137,
+ 44,197, 40,208,229,152,213, 35, 4,156,214, 21, 49, 6,236,251, 78,201,119,222, 55, 75,161, 42, 36,207,173,154,247,215, 80,172,
+180,231,201, 32,175, 53, 75, 37, 43,166,214,180,226,154,153, 89, 95,161, 7,125, 20,113,238,101, 79,188,239, 59,114,206,136, 28,
+155,122,196,132,117,114,173, 32,117,198,176,171,172, 23,186, 48,181, 43,104,106,109,177,212, 66,170,147, 11,189,123,135,244,253,
+206, 82,186,230,238, 23,101, 93,221, 24,193,170, 58, 26, 22,221, 42, 6,173,201, 38,167,199,220, 3,180, 38, 10, 69,245,169, 42,
+223,167, 33,101, 44,214,245,188,148,150,221, 49,240, 73,196, 17,197,127,165, 63,132, 41,144, 76,252, 19, 2,171,102, 97,116,183,
+197,113,126,122,166, 96,164, 90,114,211, 80,233,202,251,147, 50,140,220, 43, 87,252, 5, 5,170,160,253,181, 14,194,183,210, 70,
+241,165, 51,224, 57,192,163,242,190,252, 15,127,255,247, 49,207, 75, 3,205,239,199,209, 46, 57,185, 45, 36,140,163,121, 43,249,
+ 3,147,236,242, 50,112,171,197,199, 92, 7, 33,135, 82, 10,154,225, 23, 90,107,172,222,176,103,153,124,197,203,100,112,121,251,
+ 43, 44,142,144,136,222, 24,124,249,213,143,241,250,242, 17,255,229,127,241,159,226,247,126,254, 31, 96, 50, 6, 15,243,132,197,
+ 25, 14, 43, 97,203, 12, 39, 72,201, 59,169,249,242,248,131,159,255, 62,172, 49,116, 24, 13, 23,161,225,195, 71, 53,206,175, 30,
+ 20, 78,117, 72, 82,234,227, 82, 61, 80,220,104, 36,213,127,141,248,140,123,114,151,238,224, 2,238, 86,129, 30,226,208, 50, 98,
+198,117, 8, 48, 60,248, 3, 74,147, 61,166, 24,118, 56,133,237, 54, 90,245, 64, 8,163, 21, 83,177, 84, 35,207,201,175,175,165,
+103, 82,107,165,112,217,246,198,111,214, 12, 71, 1, 20,230,201,225,205,211,185,173, 1,106,173,148,196,102, 45,127,201, 15, 44,
+179,103,174, 64,102,191, 43,253, 90,201,176,142,185,116,234, 93,237,206, 89, 98,160, 83,215, 18,142, 3, 49,101,134,223,116,228,
+102,173, 21,147,103, 97,144,179, 0,143,143,115,206,156,222,212,169,134, 80,236,241,182, 6, 95,255,228,231,152,215, 7, 82,167,
+199, 64, 35,105,109,176,172, 11,172,113,109, 85,146, 51,113,243, 67, 12,168, 90,225,179,199,167,246,126,205,211,140,156, 18, 82,
+ 5, 17,216,172,109, 2, 55,203, 84,168,156, 51, 79,149,216,101,145, 18, 93,246,204,149,151, 12,113,103,109, 27, 1,214,129, 32,
+ 39, 29,181, 26, 56,223,149,159,185, 86, 36,170, 10,163,113, 31, 62,162, 20, 38,239,240,252,244,140,121,154,120,228,110,218,175,
+ 95,167,137, 94, 27, 83,205,188,179,240, 70,227,228, 61, 30,206,103,172,203, 10,141,138,151,151,119, 48, 76,141, 52, 90, 99,154,
+ 28,182,219,149,216,244,222, 54,231,135,181, 22,222,251, 70, 9,115,158,198,135,222, 57, 34,254,241,247, 90,210,189,206,231, 19,
+ 81, 10,217,146,104,180,134,247, 83,215,131,112,113,123,221,246, 54,250, 21,152, 85, 8,129, 11,187,202, 19, 5, 77, 10,117, 13,
+ 44,126,226,125,188,198,227,249,132,146, 8,139,236,157,225,132, 66,215,158,241,105,154, 91,206,129,115, 14,183,219,198, 41,126,
+ 5,243,228,185,243,210,221, 30,202,240, 29,109,168, 0,123,127,221, 91,119, 56,123, 7,103,108, 67,252,170, 62,174,131, 82, 26,
+159,175, 14,251,177,163,166, 64,118, 63,118, 55, 80,116, 42,193, 94, 66,174, 56, 82,105, 90, 10,185, 96,132, 56,103,153,143, 32,
+ 23,136,136, 86, 81,187, 82, 58,215,194, 41,147, 10,151,235, 13,251,182, 97,219,136,228, 23, 35, 57, 66,178, 0,141,198,202,158,
+ 71, 90, 5, 4,202, 18,127,186, 60,175,185, 16, 37, 17,218,180,169, 29,253,183,182, 9,116, 99, 56, 56,236,136, 92, 42, 41,103,
+142,185, 70, 15,215,226,128, 45,107,204,144, 75,192,130, 82,190,103,114, 78,125, 53, 89, 74,187,176, 85, 55,123, 53, 33,156, 22,
+228,177,234, 43, 45,225, 46,180,202,191,157, 39, 61, 81, 81,171, 78,158, 27, 93, 77,205,251,175, 59,191, 68,125,226, 18,203,156,
+235,160,181, 97, 40,141,129, 50,166,103,167,243,132, 87,241,180, 75,248, 17,178, 14, 50,140,204,150,245,181,172,218,148,210,212,
+153, 87,130,141,133, 99, 67, 60,118,196, 16, 90,198,138, 45,172,192,165,204,216,210, 3, 31,164, 83,167, 91,189, 3,103,154,226,
+110,200,131, 22, 97, 79,169,119, 49,174,110,158,240,199,255,209, 31,225,127,251, 63,254,207, 86, 16,228,184, 67, 79,107, 59, 68,
+197, 94, 85,101,156,196, 74, 88,169,194,156, 53,119, 72, 72,104,133, 82,248,162,225, 11,221,106, 82, 43, 26,163,113,242, 6, 69,
+209, 62, 89, 88,209, 78, 3,201, 88,160, 38, 36, 85, 49, 47, 39,252,249,191,249,191, 48,185,140,127,254,223,255,183, 76,107,170,
+ 48,208, 72, 85, 65,171,196,151,185,168, 32,196, 51,174,241,251,191,247,115, 92,175, 87,124,120,121,105,187, 93,217,105,180,213,
+132,236,242,115, 25,198,156,154,119,229,195, 30,154,105,124,122, 16,166, 53,200,128, 88, 25,196, 98,196,190,206,134,237,228,110,
+ 94, 72,104, 85,151, 97,172, 63, 42, 60, 7, 61,132,214,208, 92,132,201,142,186, 14, 35, 95,197, 69,202,145, 50,131, 61,128,144,
+ 82,227,216,139,114, 95,254,151,185,130,180,138,226, 82,141,210, 80, 70, 97,103,145,218,188,204,188,251, 37,170, 91, 44, 21,179,
+ 35,112,198,245,122,133, 2,237,159,107, 46, 40, 49, 49,167, 62, 99,241, 14, 71, 72, 56,228,207,230, 7, 76, 43,210, 46,140,175,
+ 11, 10, 28,236,195, 29, 58,123, 55,173,161,216, 66, 12, 25,244, 98,219,172,185,192, 26, 11,216,190,151,163, 61, 93,146, 40, 2,
+ 98, 25,248,149, 18,197,180,134,243, 19,189, 7, 74, 99,223, 54, 22,147, 49,129,144, 53, 36, 45,126, 83, 3, 85, 43, 24,235,249,
+114,155, 32,179,128, 45, 39, 24,171,177, 40,219,213,204,124,241, 90, 46, 64,246, 44,211,147,202, 93,186, 6, 20, 29,114, 33,134,
+230, 3,183, 90, 53, 45, 64, 41,133, 64,119,150,201,107,122, 24,185, 55, 70,186,226,113, 16,125,134,167,211, 9, 79, 79,207,184,
+ 94,175,184, 94,175,252, 94,138, 42,218,161, 86,214,101,176, 54,196, 89,139,196,107, 24, 85, 9, 28, 18, 67, 97,112, 16, 89,143,
+ 46,215, 11,214,117,193,195,233,132,219,182,225, 56, 2, 82, 74,176,142, 70,232,251,190,179,142,134,166, 1,196,195,143,141, 22,
+152, 83,134, 49,142,119,132,156, 39,192,169,123,206, 57,164,152, 72,223,144, 82,179, 85,174,179,135, 53, 20,254, 50, 51,199, 98,
+158, 60, 35,120,235,157,187,196, 57, 15,148,138,201,121,234,176, 67,196, 60,207,216,142, 29,128,131,214, 10,215,219, 13,147,159,
+136, 52, 23, 3, 79, 24, 60,182,237, 70,174, 0, 75,100, 70,202,126, 39, 84,176,227,253,182,117, 14,241, 56, 26, 84,168,217,183,
+ 42,240,230,124,194, 60,121, 76,222, 67,115,152, 9, 77, 20,169,131, 63,207, 14, 31,183, 3,251,158,224,166,153,221, 20,129,206,
+ 59,161,185, 49,124,201, 28, 17,179, 55,112,134,144,202,242,249,202,228,243, 62,229, 11,247, 10,122,129,239,164,136, 35, 40,188,
+190, 94, 90, 1,237,167,137,153, 17,159,242, 28,136, 30, 71, 69, 54, 3,190, 18,193,146, 34,127, 79,157,157, 73,107,225, 87, 4,
+110,248,200,174,201, 89, 27, 41,176, 16, 48, 35,115,151, 30,115,103,198, 39, 46, 72,149, 53, 45, 50,182, 21,222, 74,119,192,153,
+132,103, 85,105,150,244,253,200,106, 88,101, 10,142, 91, 11,174,118,248,251,123,126,102,103, 51,168,187, 12,133,210,157, 65, 13,
+ 6, 87, 59,250, 22, 34,100, 31,109,221, 44, 2,231, 96, 46,185,196,235,167, 26, 24, 53,100,192, 43,116, 32,218,253, 79, 37,196,
+ 18,210, 27,233,158, 72, 35, 43,157,246,121,243,198,205,142,204,247, 49,240, 65,118,114,138, 27,241,130,126,185,143, 65, 45, 93,
+ 51,215,133, 24,117, 72, 75, 58,159,206,248,131,223,253, 41,254,226, 23,255,142, 45, 52,172, 28,158, 23, 6, 38, 24,174,250, 10,
+119, 14,190, 65, 79,100,215,172,148, 68,129,146,114,182,237,160, 91,185,158, 27, 52,161, 84,138,192,180,173,211, 5, 28,143, 46,
+156,161, 44,238,227,118,197,159,253,213, 95,224,127,254, 23,255, 28, 78,170, 45, 85, 97, 81,145, 83, 79,102,210,236, 45,150,221,
+209,195,249, 1,191,121,251, 61, 94, 47,151,174, 13,224, 93,174, 98, 47,169, 16,139, 26,221, 11, 93,164, 37,227, 36, 40,117, 7,
+111, 17, 81, 22, 6,165,178, 28, 6,178,143, 23,210, 92, 95,104,215, 6,105,145, 15, 88,141,200,221,246,153, 42,190, 44, 11, 52,
+ 87,135,226, 87, 47, 35,211,155,197,102,169,244,113,176,252,143,114,130, 89,107, 81,238, 89, 14,122,208,100,200,115, 97,141, 70,
+204,153, 71,160,132,181,124,247,241,149, 20,187,182, 96,219, 35,182,152, 16, 83,196,196, 41, 99, 3, 62, 1, 47,183,131, 73,119,
+ 21, 99,244,240,167,151,185,236,200, 87,223,211,166,214,153, 58,227,194, 95,148, 61, 70,246,211,243,197, 43,116, 42, 20, 26,161,
+ 30, 20,110,163,234, 24, 95, 9,168, 82,241,139,191,252,223, 89, 37,174, 16,142, 3,243, 68,145,162,235,233, 12,176, 40,198, 58,
+ 79, 68,183, 20, 48, 79, 19,188,241,216,119,202,169,175,197, 52,203,162,213,150, 59,122,186, 28, 99, 9, 76,167,226, 12,106, 65,
+247,230, 12,203,130,159, 42,193, 49, 74, 67, 49, 56, 8,181, 79, 83,148,214,176,202,208, 5,103, 12, 28,119, 54, 2, 2, 82,138,
+224, 59, 96, 43, 80,225, 93,221, 52, 57,124,245,213,215, 8, 49, 99,187, 93,113,185,188,146,203, 65,137,112,149, 46,134,217,147,
+ 5,140,130, 72, 56,227,188, 20,164,156,112, 58,173, 80, 90, 99,114, 14, 31, 63,126, 68,201, 9,165, 56, 44,203, 66,206, 21, 78,
+225,218,143,131, 58,102, 91,176,109, 7,230,217,183, 29,107, 46,192,236, 52, 46,151,215, 94,116,240,119,193, 90,219,244, 0,225,
+ 8,124,193,101,134,237, 36,138,234,141, 17,206,106, 78, 87,203,112,252,243, 58, 78,119,203, 76,247, 35, 63, 61, 77, 26, 28, 95,
+194,228,120,240, 56,118,178, 44, 62,156, 86,188,127, 33, 92,235, 58,211,103,250,244,248,132,109,223,201,194,153,232,207, 20,117,
+186, 92,160,198,116,235,164,155, 72, 76,185,158, 86,188,123,251, 14,111, 47, 27, 79,197,152,120,232, 44,102, 79, 23,166,227,162,
+ 76, 60,212, 70, 43, 56, 99,240,197,121,198, 95,127,251, 22, 75,206,168,126, 2, 42,173, 48,174, 77,201, 92, 17, 51,173,187,140,
+ 81, 48,186,163,112,229,188,145,203, 68, 15,107,181,142,251,149,117, 86,198,118, 28,120,115,158,241,238,221, 59, 34,231,165,132,
+121, 89,224,189,231,148, 63,209,240,208, 20, 34,230, 76,113,212, 7, 69, 82, 31, 49, 34, 38,250,103,170, 84, 84, 38, 63, 26, 99,
+161,116, 70,202, 27,114, 12, 76,105,100,226,159,166, 85,103,206, 84, 32, 36, 57, 35,152,195,111,132,195,128,174,237,105, 0, 48,
+246,150,167, 68,244, 65, 17,187, 85, 93, 7,234,154,172,119,235,221, 52, 68,201,101,221,226,178,199, 11,189, 12,123,199, 30, 16,
+ 84, 27, 43, 68,148,239,141,209, 55, 48, 71,198, 51, 29, 67, 28,112,159,154, 22,137,116, 22,193,174, 86, 45,127,160,111, 7, 76,
+107,248, 42,167, 23,138,219, 76,166,103,165,228, 54,185,178,178,230, 16,123,160,104,161,148,130, 45,157,137, 57,248,155,122, 84,
+ 20,221, 51,165,119,227,162,246, 31, 85,240,204,167,237, 81,172,130,146, 85,120,185,237,248, 15,127,254,123,248,238,251,183,248,
+225, 99, 70,201,116, 8,149,148,200, 63, 46,138, 70,165,218,158,202, 48, 59,156,196,113,138, 3, 97, 60,125,185,157, 67, 57,246,
+182,219,168, 6, 77,213,172,181, 70,174,138,113,146,132, 95, 37, 53, 96,133,206,192, 97,105,212,241,246,219,111,240,203,191,252,
+ 51, 92,175, 47, 88, 38,199, 59,113,186,244, 62,230,140,217, 91,246, 66,223,143, 87,174,183,219,221, 58, 96,156,121, 75,101, 62,
+ 22,139,181, 81,188, 36,249, 73,223, 95,162, 74, 19,167,183,118,235, 91,203,234,110,112, 4,116,230,248,176,199,238,127,148,124,
+ 14, 5, 80,230,254,103, 27,195, 45,100, 36,165, 85,103,100, 11,176,130,181, 37, 57, 23,194,154, 14, 23,169, 82, 12,128,209, 61,
+248, 64,196,115,117, 8,240, 32,193, 14,133,173,136, 64,103,143,100,233, 42,165, 66,231,130, 84,129,160, 18,142,152,240,230,188,
+226,215,239, 62,192, 58,139,235, 17, 16,184,168, 75, 57, 99,114, 22,123, 32,154, 95, 30,222,211, 49, 31, 92,236,128,147, 55, 93,
+228,199, 96,160, 61, 68,156,151, 25,183,125,167, 92,121,153,162,176, 72, 80,113,222, 61, 29, 64, 14, 41, 39,164, 74,251, 98,203,
+239,179,115, 51,114,222, 17, 34,141,181, 38,127,194,105, 93,136, 50,182,111, 45, 73, 43,112,130,148, 49, 22,251,177,225, 96, 88,
+ 75,136, 1, 70, 25, 44,235, 9,251,177, 81, 20,110,162,125,110, 74, 17,129,253,188, 34,150, 36,191,184,172,183, 50, 21, 37, 60,
+210,117,206, 2,156,253,109,180,130,230,189,116,230, 80, 25, 26,121,211, 65,188,239, 59,187, 67, 12,114,166,231,204,178, 93,212,
+ 88,139,135,243, 3,214,211, 25,175,175, 23,220,182, 43, 66, 32, 21,123,169, 5, 86, 49,102, 84,129, 11, 59, 78,224,210, 10,126,
+ 89,154, 80,231,136,148,140, 53,113,138,157,117, 14,206, 45, 56,142,128,197, 57,132, 99,135,177, 22,251,113, 80, 74, 27, 19,245,
+140,181,184,222, 54, 58,144,152, 60,119, 28, 59, 63,135, 36, 4, 51,154,132,148,130, 57,165,159, 61, 17,192, 7,149,118,191,138,
+210,223, 98,162, 46, 61,132, 72,150,216,156, 96,180, 65,202,169, 93, 18,165,210, 84,207, 50, 39, 67,162,143,173, 53,212,229,175,
+ 11,187, 69, 88,225,207,197,174,177,150,246,240,206, 33,132,136, 16, 54,120,231,144, 98,196, 52,121,132,152, 48,123, 79, 59,125,
+ 67, 89, 22,165,208, 57,245,242,122, 1,180,193,198,172, 5,160,226,179,243,137, 4,147,252,185, 78,142,227,125,121,226, 85, 42,
+177, 60, 78, 0, 62, 59, 47,248,238,253, 11, 78,167, 19, 44,175, 72,156,170, 8, 50,114,175, 21,123,204, 48,134, 80,188,159, 6,
+108,137,142,132,231, 90,159, 28, 8,164,205,201, 57,227,245,114,129,250,226, 25, 47, 47,175,168, 32,224,203,194,197,171,227,137,
+154, 22,182, 2, 95,202, 33, 70,220,246,141,136,127, 71, 64, 8,129, 86, 94,218,242, 30,154,138, 47, 74,180, 12, 72, 49,240,116,
+181,182,216,214,202,248,223,200,127,111, 52,250,218,143, 67,162,106, 81,237, 98,110, 25, 22, 60,137, 43, 37, 83,122, 98, 29,213,
+ 53,154,197,113,178,233, 28, 47, 97,133, 49, 8, 79,245,251,155,118,247,159,138,116,196, 79, 94, 89,128, 39,151,189, 30, 54, 17,
+218,240, 4, 76,114, 17,106,135,142,181, 6,161,140, 35, 0,154, 16, 12,197, 86,155,188,118, 70, 43,106,166,238,219, 24,221,236,
+178, 93,180, 40, 72,246, 78,211,236, 30,120,213,244, 7, 22, 67, 58,215,248,202,104,212,200,227,129,182, 99, 71, 35,241,212, 79,
+172,109, 52, 98, 24, 99, 97,168,122, 50, 86,227,186, 5,252, 39,255,228, 31,227,127,250,151,255, 43,239, 16, 52, 82,220,225,205,
+153, 14, 27,137,145,100, 4,171,102,161,156,236,114, 41,135, 58,147, 95, 28, 10,176,142, 62,220, 20,104,207,202, 1, 14,172, 23,
+161,131, 89, 3,202, 40, 76,214, 80,124,157, 86, 56, 98,133,174, 5,151,247,111, 17,183, 11, 12,123,151,169,203,167, 75,194, 91,
+202, 86, 14, 60, 10,202,131,120, 45,167,212, 70, 49, 29,163,169,239,166, 22,119, 99,159, 54,169,233,170, 56,233, 72, 20, 20, 63,
+208,170,117,235,194,203,167,177,177, 60,133,212,227,231, 82,134,193,122,223,161, 75,192, 71,174, 5,182,109,147,208, 20,155,146,
+184, 70,156,116,234,220, 36,183,189,193, 88,248,242, 55, 26, 67, 56, 8,191,254, 92,105,111,204,209,175,141,107, 95, 42,171,242,
+123,102,114,204,157,154,151, 88, 81,123,219, 15,172,243,132,237,136,152,188, 39,187,135, 82,248,254,133, 24,217, 37, 49,183,160,
+ 20,178,193,113, 70, 49,170, 28,118, 61, 62,118, 36,161, 9,114,205, 27, 74,200, 18,216,134,115,100, 25, 2, 43,119,181,209, 20,
+139, 90, 73,163, 81, 43,249, 95,115,142,220,101, 49, 38, 55, 23, 84,107, 17, 19,131,107,160,144, 50, 9,169,188,247, 88,214, 25,
+126,154, 27,123, 90,188,252,168, 21,167,101,109, 41,133,154, 59,113,242, 53, 83,130,148, 53, 14,183, 16,144, 57,114, 49,132,132,
+201, 83, 1, 91,107, 65,140,253, 11, 90, 43, 29,141, 70,107,242,188,243,222,114,178, 20, 35, 41, 68, 68,173, 21,156, 35,253,134,
+181, 6,206,208, 52, 43, 38,162,176,105,173, 97, 29, 93, 54,206, 57,104,235, 49,207, 11, 30, 30,158,112,187, 93,177,221, 46,228,
+247,118,132,125,245,108, 37, 44, 60,209,146,103,120,246,158,243,187,169, 24, 74,137, 66, 35,166,105,194,237,118,107,235,152, 90,
+ 43,230,201, 99, 93, 87, 56,235,240,114,121,165,215, 48, 77,120,189, 94, 49,123,199,118, 68, 2,242, 24,100, 90, 21, 20, 18,178,
+161, 22,222, 69,107, 94, 9, 21,148, 28,121,228, 78,151,246, 60, 45, 48, 90,227,182,239,216,142,116, 39, 8, 83,195,228, 76,138,
+167,201,249,142,137,205, 25,110,154, 96,148,194, 30, 2,188,167, 68, 63,197,241,172,137,245, 18,126,242,136, 33, 16, 84, 37,147,
+144,173,148, 66,194, 63, 41,244,141,134,142,149,167, 13,100,249,116,214, 34,134, 3, 17, 10, 31, 95, 95,248, 50,232,174,147,135,
+117,134,247,142,158,151,121,226, 11,147,223,228,196,223,121,246,234,127,254,244,136,239,223,191,224,122,189, 97,246, 22,102, 51,
+ 56,175, 51,106, 0, 66, 42, 13,141,122,196, 4,111,109,227, 11,224,206,181,132, 33, 52,232, 46,218,163,157, 85,219, 30,104,242,
+163, 20,222,189,251,128,112,144,104,110,154,167,214,173,107, 22,223,201,107,141, 41, 97,219,119, 92,111, 55,108,219,142, 35, 68,
+ 84, 69, 60,255,148, 19, 82, 4,178,186, 33, 14, 25, 28,170,168, 78,151,227, 21,139, 40,196,133,216, 38,246, 99,177,225, 25, 13,
+ 24,152, 65, 15,192,201,130,172,151,200, 37,243, 74, 81, 53,129,220, 72,170,215, 13, 33,221, 5,165, 50,141, 4, 83, 9, 75, 29,
+128, 94,172,134,175,195,200,190,214, 30,145,170, 27,196,171,131, 98, 42, 42, 39,175,117,144,171,188,203,198,176, 85,210,154,190,
+ 58, 17,187, 96,227,207,115, 54,186,234,211, 86,113, 33,212, 38,164,251,247, 87, 43,162,148,151,105,157, 88,173, 75,161,251,205,
+ 22,140,163,247,206, 9, 86,226,239,171,227,131, 80,217,186, 62,250,213, 75,167,244, 72,199, 94,208,168, 92,181, 2, 47, 71,196,
+100,129,175, 63,127,131, 95,126,251, 93, 19,114,164, 24,200,162, 86,228,141,112,204,147,230,145, 34, 11,169, 90,200, 61,139, 82,
+ 38, 59,145,208, 9, 22, 85, 27, 40, 21,251, 56,133, 11, 20,175, 72, 65,235, 53, 80, 42,237,125,117, 46, 72, 89,227,118,125,165,
+106,145, 69, 42,210, 21, 71, 62, 44,171, 49,247,114, 97,244,144,122,110,119,219,104, 69, 13,123,114, 12,177,170,106, 32, 2, 73,
+ 39, 50, 22,109, 21,133,189,226,157, 2, 35,251,151, 50,136, 90, 84,173,119, 16,154, 42,137,121,146, 97, 47,105,120,133,245, 15,
+ 93,115,207, 25,236,252,185, 48, 54,149,248, 10,165,239,147,106, 79, 34,106, 1, 9,170, 55,252, 70,141,186,123,122,216,197,214,
+ 84,100,239, 95,250, 62,191,176,208,209, 24,221,120,226,219, 30, 48, 57,139,235,126,176,154, 26, 61, 27,155,149,249,146,226,231,
+ 12, 89,121, 74, 23,169,182, 96, 29,133,218, 3,142,248,113,180, 90,241,254, 79, 44, 62,244,251,236, 49,145, 48, 47, 85, 36,168,
+ 22,113,170,106, 69,213,185,229,133, 31,199, 14,109, 12,137,163, 64,246,160,146, 51,172,177, 80,218, 34,229, 3,167,135, 71,212,
+156,113,236, 27, 41,159, 13,237,184,115, 41,240,222,226,118,187,192,184, 25, 78,233,102, 51,185,109, 23,120,235,112,221, 34,182,
+237,198, 64, 37,133, 80, 20, 30, 30,206,208,149, 14, 37,249,194,203,161, 39,133,237,108, 53,227, 49,233,192, 44,133,198,217,181,
+ 72, 70, 52,229,210, 27,142,107,205, 28,142,163,215, 21,151,235, 13,139,119,180, 16, 83,100, 83,115,126, 6, 20,240,241,253, 59,
+108,183, 87,178,125,241,154,101,178,174, 9,240,104, 36,156, 97,148, 97,113, 89,196,227,249,220,121,221, 57, 97,153, 87, 86,162,
+203, 94,156,246,135,167,211,137, 51, 22, 98,251,142,239,199,193, 35, 87,210, 85,152,117,229,125, 56,112, 28, 71,251,174,132, 68,
+130, 41,199,246,210, 99,223,155, 19, 6, 74, 97,114,228,255,190,110, 59, 91,238, 42, 22,101,184,216, 16,125, 14, 81,204,106, 45,
+ 52, 42, 71,229, 78, 59, 96,241, 51, 61,103,131,238,135,184, 22,150,210, 1,181, 6,144, 16, 99,160, 49,126,136,124, 38,209,238,
+123,219,119, 34, 9, 26,131,125,167,110,118,219, 3, 57, 24,184, 35,252,240,114, 1, 80,177,206, 51,254,250,187,119, 77, 99,244,
+ 48,121,172,243, 76, 35,118,235, 90, 33, 65, 78, 6, 42,114,197,221,115, 62, 81,166,252,215,159, 63,225,111,190,125, 75, 32,161,
+122,195,105,118,120,152, 29, 62,108, 17, 57,211,119, 50,102, 82,178, 43,118,235,160,210,101, 86, 89,176,247,105,151,174,134,229,
+122,195,155,198, 8,235, 61,126,248,225, 29, 66,140, 88,118, 90,145, 56,231,217,109,161,219,238, 88,242,211,247, 16, 41,127,227,
+136, 72, 12,198, 41, 37, 33,133,138,172,129,176,109,119, 35,118, 42,144,104,116, 76,250,230,204, 86,182,210, 98,156,165,225, 33,
+151,142,225,163,166,180, 38, 70, 38, 5,165,130,186,116, 22,162,169,134,233, 84,157,249,166, 6, 77,129,234,142, 33,193, 44,203,
+ 39,166, 89, 72,170,135, 53, 72,101,162, 92, 45,170,131, 99,196, 2,223, 88, 17,159, 68,252,222,161,229,105, 58, 84,235,152,162,
+169, 97,116, 69,102, 58,164, 6,139, 43,181,254,196,222,108,218,138,132,179, 79,219,106, 5,124, 86,246,128, 37,134,156,213,238,
+106, 40,136,161,214,207, 0, 0, 32, 0, 73, 68, 65, 84,124,223,218, 59, 72,123, 11,148,161,174,188,178, 32,161, 42,116, 92,101,
+ 3,243,143,222,253,122,215,177, 11,120,190,200,155,162, 53,140,113,248, 39,255,232, 63,198, 47,255,151,127,201,234, 67,160,164,
+ 0,205, 92,105,169,178, 53,147,131,156,243,180,191,227,174,200,242, 67,111,141,164, 9, 45, 92, 97, 7,232, 76,118, 21, 61, 92,
+ 70, 34,152, 74,150,194, 14,182, 88, 24,121,170,145,227, 65, 23, 65, 81, 20, 4,146, 42, 20, 7,109,180, 12, 12,133, 6, 40, 41,
+178,147,209,186,217,187, 70,244,171,196,241,181,201,197,224, 39, 22,227,185,196, 93,210, 69, 43, 99,118,180,238, 72, 30,104, 53,
+240, 1,186,162,178,220,109,128,234, 40,162,144,255, 30,132,246,149, 44, 95,114,183,162,137,196, 70,101,230,157, 30,226,206, 38,
+ 87,121, 20, 92,216,114,216,121,226, 82,225, 74,212,166, 20, 89, 89,162, 45,135,181,130,225,113,175,116,222,128,198,118,132,230,
+118,240,214, 65,213,130,172,104,253, 98, 45, 41, 61,247, 35,226,224,188,100,217,175,150, 78, 69,186, 43, 62,186, 90,214, 52,214,
+193,228,201,202,100,180,194,190, 71, 78,212, 51, 40,153,163, 56,115,134, 86, 21, 37,115,106, 93, 73,164, 82,182,204,203,206,137,
+211,220, 20,230,229,140, 15, 31,127, 24,248,246, 76, 50, 99, 27, 85,136,113, 16, 59, 25,196, 20,176,204, 79,152,167, 25, 37, 71,
+204,126,110,221,187,113, 30,251,237, 10,171, 21, 38,173,128,146,104,130, 80, 65, 30,254, 35, 16,100,103,176,158,121,231, 72, 92,
+ 24,115, 59,160, 82,138,116, 64, 56,241,211,163,177,223,157,181, 56, 2,165, 5, 46,211,196,130, 83,139,135,135, 39,132, 16, 8,
+242,147, 50, 82,220,121,231, 30,225,140,197,196,248, 92,239,136, 37, 96,180,129,179,134, 46, 92, 99,112, 94, 23, 78, 56,180,184,
+221, 56,253,142,237,129, 90,107,138,183,133,194,204, 44,116,193, 63, 87, 33,220,241,103, 53, 77, 30, 57, 37, 88, 75,163,115,101,
+116, 19, 9,202,119,105, 93, 23,228, 92, 41,196,131,247,134,133,167, 62, 94,107, 92,110, 55, 94, 13, 84, 76,126,193,126,236,112,
+214, 49,149,143,214, 5,198,104,232, 66, 35,120,239, 61, 43,171, 85, 3, 47,101, 70,161, 42, 67,107, 4,239, 61, 91, 11, 11, 59,
+ 0, 82, 39,171, 25, 13,231, 28,174,183,141,154, 16, 0, 37,101, 76,222, 98,219,143,193, 33,163,153,174,103,145, 14, 26, 75,151,
+ 34,193, 60, 21,159, 61,158, 40,184,133, 93, 62,178, 18,145,116, 57,205, 1, 52,148, 44, 72, 63,199,103, 79, 15,120,189,237,120,
+127,217, 80, 74,193,235,182,227,179,179,193,143,158,206,248,246,221, 75,123,254,183,152, 96, 21,224, 13,159, 47,188, 6, 48, 90,
+ 53, 92,240, 61,144,178,222,193, 41,223,189, 92,240,163,231, 71, 40,235,240,225,245,134,237, 8,152, 55,215,115, 47,152,205, 81,
+249,247,206,165, 32,166, 76, 66,214, 24,105,199,171, 65, 98,190,170,104,202, 89, 50, 66, 76,124, 17,167,230,134, 18, 38, 64,183,
+145,130,211, 4,199,100,192,130, 82, 58, 92, 70,206,219, 84, 50, 82, 76, 44,214,203, 44, 74, 30,112,220,124, 46,200, 29, 32, 77,
+213,232, 10, 82, 44,144,107,212,244, 74, 23, 44, 69,155,234,182,210,107,233,154,184, 79, 68, 68, 85,109, 69,218, 38,161,163,113,
+ 84,117,248,141, 82, 64, 56, 40,237,211, 24,211,222, 71, 88,246,148, 14,141,116, 23, 83,102, 40,158,156, 43, 38, 71, 10,222,187,
+178,179,160, 59,165, 36,133, 14,131, 30,133,207, 68, 25,173, 67,245,241,239,168,148, 20, 13,156, 44,245,203, 72, 12,175,232,244,
+185,161,225,175,170, 52, 11,129, 40,229,141,117, 88,157,185, 31,242,171, 94,161, 40,208,195,232,157,231, 81, 42,117,130,222, 10,
+227,152, 46,139,153, 99, 2,101,215,163, 17,161,138,102,143,186,110,252, 91, 81,202, 35, 21,148, 74,132,174, 84,129,201,106,148,
+ 28,219, 27,111,152, 41,128, 70, 81, 99,158,113,233,177,120, 2, 54,185, 87, 45,214,182,159, 83,170,183,143, 34, 78,175,195,229,
+174,196,247, 57, 68,178,202,133, 75, 54, 47,213,169, 71, 77, 44, 87, 63, 97,195,210,159, 85, 74,238,136,220,218,133, 25,253,129,
+234,157,118, 11, 3,169,146,164,213, 31,244, 59,249,132,234,137, 71, 40,181,233, 24,154,160,100, 20,100,148,190, 39,210,198,180,
+252,226, 6,177, 41, 84,145, 42,206,240, 70, 37,244,172, 20, 32,185, 84,216,133,226, 72, 13, 7, 33,228, 82, 8, 21,171, 0,111,
+ 41,135, 90,241,184,173,126, 2,235, 25,127,118,173,129,231,243,138,196, 93,170, 60, 55, 33,208,239,233, 39,135,235, 30, 49, 89,
+ 71,207,182, 70,163, 28, 86,254, 12,100, 60, 6, 85, 96,181, 65, 74,180, 35,158,231, 51, 82,162,136,204,156, 34,204,228,145, 99,
+230,196, 55, 34,198,169,170,216, 70, 23,177,172, 39,228,148,177,151, 27,220,178,242,174,254,192, 52,207, 56, 94, 62, 96, 89, 22,
+236,151,143, 8, 71,192, 52,123,236,123, 64, 72,145,186, 28,246,212,103,198,114, 90,231,241,217,155,103,234, 92, 93, 65, 74,140,
+147,229, 98, 58, 70,250, 89,173,209, 92,180, 36, 0, 6,167,101,109, 97, 47,211, 52, 3,160,137, 87, 74,137, 58,195,154,224,140,
+ 66, 76,180,115,181,150, 96, 43,203, 52, 97, 59, 2, 91,185, 10,114,138,128, 82,120, 88, 23,196,148,176,240, 20, 35,151, 12,175,
+ 29, 67,138, 42,246,227,192,228, 39, 60, 61,145,133, 79, 27,141, 35, 37, 28, 71,104,142,143,156, 51, 30,206, 39, 42,251,156, 67,
+140, 7,129,132,246, 64, 92,111,177,247, 25,131, 99, 63,160,140,134, 53, 22,243, 52,195, 77,212, 49,123, 71, 2, 52, 85,105,253,
+ 96, 56,206, 85,138,253,196,103,133,209, 26,219,193,128, 25, 0, 49, 4, 4, 40, 44,243, 66, 97, 79, 41,192,106,242,148, 23, 0,
+111,158,159, 89,212,165,216, 62,166, 16,183, 29,213, 82, 71,119, 28, 1,147,247,112,206,225,253,203, 43, 38,103,217,213, 37,129,
+ 32,228,162,200,137, 46,175,125, 63,224,141,198,219,215,107, 59, 47,181, 82,148, 59, 80, 43, 1,124, 4,135, 92, 43,142,253,128,
+ 51,166,173,215,102,182,252,237,251,129,211,186,224, 71,207, 15,184,108, 59, 66, 46,120,189,238, 88,172,193, 87, 79, 15,120, 88,
+ 39,188, 92,119, 46,146, 25,129, 10, 26, 89,107,214, 35,149,113, 50,120,239,137,193, 88, 23,191, 92, 54,124,254,120,194,249,124,
+194,109,219,113,221, 14, 28, 33, 18, 45,144, 81,184, 50,130, 23,203,109,202,133, 11, 72,114,185, 84,232,214,144,108, 71, 64, 44,
+138, 52, 35,188,194, 16,251,108,102,173, 3,233,146,232,243, 34,152, 10, 29,154, 66,148, 35,117,124,207,122,168,133, 66,172,100,
+167, 63,134, 99,169,162, 72, 74, 36,118, 53,168,102, 81,213, 74,221,165, 26,106,254,191,118,166,203,229, 95,209,115, 22,164,239,
+209,146,185,208,115, 49,250, 89,212,215,203, 85, 13,231,188, 82, 77, 7,181,172, 11,150,101,230,215, 83, 56,154,155,180, 60, 74,
+139,208,155, 5,172, 37,163,148,140, 1,178,218,104,152, 77, 76, 55,168,235,139, 20,255,186, 83, 50,107, 15,195,232,157,250,200,
+117, 31, 85,146,117, 0,206,244, 70,175,244,253,205,232,136, 71,183, 79, 21, 69,180,172,194, 95,130, 91,200,112, 22, 28, 68,208,
+ 69,121,205,176,175, 20,172, 6, 87,221, 96,251,137,107,120, 82,201, 11,246,222, 13,221, 89, 69,184, 70, 30,191, 2,179,213,136,
+220,149,201,238, 35,229,138, 35,101,164,170, 26, 35, 55,197, 72, 89,197, 80,176, 0, 98, 11, 38, 82,125,148, 62,198,160,138,138,
+114,132,176,104, 61,208,244,186, 44,187,223,229,186,227, 1, 69,232,198,202,198,102,141,108,251,156,218, 10,151, 49, 23,120,204,
+178,134, 26, 71,248,125,199,100,196,175, 94, 42, 10,114, 47, 48, 84,147, 68,210,120, 86, 48,170, 45, 33, 14, 60,185, 80,232,162,
+253,202,124,246,204,239,111,105,216,201, 90, 43,140, 60, 60,131,112,198, 48, 32,166, 61, 92, 2,189,224, 84, 38,169,182, 69,128,
+ 38,212,192,148, 11,246,156,225,216,163,233,157, 69,202, 25, 49,101, 22,200,213, 1,147,219,193, 55,117,208, 12,104,109,144, 74,
+225,142, 54, 82,218, 91,243, 52, 43,228, 64,246,184, 90, 85, 11,142,208,156, 39,175, 42,179,199, 21,225,117,181, 97, 11,162, 34,
+181,105, 25, 70, 90, 20,128, 99, 48, 47, 11,246,237, 70,191, 71, 58, 0,109,144, 98,128,182, 26, 37, 69, 36,109, 80, 97,160, 66,
+ 64,214, 25,202, 24,168,170,225,252,140,154,105,130, 16,114, 70,188, 94, 41,152,196, 18,176,227,224, 12,117,249, 28,190,120,243,
+204, 9, 85,134, 16,180,229, 32, 81, 20,136,119,110,153,156, 87,249, 32, 76,185, 98,157, 28,156,115,176,110,130,113, 14,215,235,
+ 43, 52, 20, 62,190,146,178, 93,163, 96, 15, 7, 21,206,198,194, 79, 30, 86, 43,196,148,200,179, 12, 58, 76,173, 54,216,227,129,
+167,135, 7, 94,121,144, 32,240,227,203, 43, 78,235,138,148, 8,119,235,189,195,237,186,193, 56, 79,228,181,137,118,212,215,203,
+ 5,235,233,220, 14,242,245,116, 38, 40, 80, 46,200, 57,114,151, 68,239,171, 68,210, 90, 67, 99, 71,203, 26, 2, 99, 45,220, 68,
+107,154,144, 42,172, 73,200, 49,182,247,240, 97, 89,219,158, 93, 56,216, 37,209,193, 25, 83,130,174, 21, 33, 23, 40,163, 48,251,
+ 9,251,190, 97,158,103,234,108, 67,192, 58,123,164, 92, 49,205, 11, 82,140,132,237, 5,176,237,219,240, 29,167,117, 1, 53, 19,
+164, 89, 88,230, 9, 57,229,187, 32, 33, 73, 0, 12, 41,115, 35,163,113, 57, 98,123,110, 63,123, 88, 73, 73,110, 12, 23, 4, 26,
+ 33,144,163, 32,196, 72,186,149,162,154,104, 46, 69,226,202,215,226,240,120, 62,225,171, 55, 1,127,251,246, 61,246, 24,241,241,
+186,225,225,182,225,139,231, 51, 98, 76,216, 66,106,197, 96, 42,104,147, 45, 65,171,226,142,162,134, 59,214,185,156,153,123,140,
+184,222,118,120,231,113, 58,173,184,109, 59,142, 24,233,245, 4,213, 34,155,181,181,168, 12,103,162, 98,151, 86,108, 74, 99, 40,
+216, 11,174,251, 1,165, 45,191, 70,201, 85,207, 45,231, 64, 46, 57,203, 83, 79, 35, 83,176,218, 18,194,144, 51,218,212,148,214,
+ 81,153,115,219,115,203,107,151, 52,179, 58,230, 72, 75, 60,173,196,175,136,237,172,212, 33,119,163,235,158,138, 68, 14,179,176,
+ 87, 4,207, 96, 8, 91,213,221,197, 85,170,248,210, 63,213, 80,213, 54,113,237,205,170,194,186,158,112, 58,211,170,233, 56, 14,
+148, 35,240, 61,161, 9,201, 59, 82,228, 50,175, 69,235,160,111, 27, 68,118, 99,152,143,208, 32, 33,222,123,109,208, 22,254, 85,
+ 58,245,118,105, 99,224,242,242, 27, 49, 94,206,195, 31, 52,254, 55,205,198, 38,100, 28,177,165,176,255, 14,252,207,142, 92,241,
+225,227, 11, 38,239,120,124,162, 89,120, 19,224,167,133,241,140,232,249,186,124,145, 86, 22,130, 57,103, 49, 77, 19,163, 26, 9,
+245, 89,106,197,107, 78, 80, 44,174,177,168, 8, 44,240,210, 74,195, 48,103, 87, 62, 65,175,169, 58, 74, 49,180, 67, 59,243,221,
+ 23, 57,141, 76,178,225, 91,222,117,189, 23,189,137,226, 91, 15,151,126, 29, 50,190,165,216,128,162, 87,216, 71,240, 69,150,233,
+252,183,149, 65, 14, 50,142,231, 85, 71,173, 61, 0, 64,141,113,246,221, 3, 57,250,209, 91, 53,203,126, 74,240,133, 44,197, 68,
+ 29,198,247,244,122, 89, 56, 36, 15,202, 39, 95,120, 81,235,138,231, 90,108, 36, 98,139, 27,247, 52, 36, 66, 43,109,250, 32, 94,
+206,116,159, 45, 71, 95,206, 90, 90,246,114,140,212, 89, 59,163,154, 40,206, 90, 67, 85,125, 83,133, 82, 82, 23,173, 3,238,189,
+182, 50, 22,147,231, 32,231,210, 2,103, 14,182, 32, 41, 69, 28,116, 83, 41, 20,230,118, 4, 40,101,187,224,177, 82,161,131, 82,
+ 6,172,171,124,225,108,243,148,230, 82, 48,207, 11,182,253,134,117, 89, 96,157,131,113,116,129, 29,183, 11,230,133,178,226,133,
+ 43, 30, 82,194,228, 93,139, 20, 62, 66,128, 49, 6,225,184,194, 58,143,117, 90, 80,114,132,158, 12, 66, 60,200,178,149,232,217,
+159,253,132,223,249,173, 31,195,106, 80,140,108, 36,221, 71, 41,100,203,202,137,156, 33, 98,169, 49,214,192, 24,143,170,105,196,
+185, 44,167,198,252, 87,165, 34, 85, 96,153, 23,172,147,195,245,118,131, 51, 14, 65, 81,116, 46,237,249, 20,170,233,107, 36,231,
+168,163,156,230,137, 82,255,246, 3,206, 89, 92,174, 87, 76,147, 67, 96,187,152, 49,116,249, 44,235, 66,157,167,161, 85,192, 17,
+ 2,188,247,128,162, 9,204, 52, 77,252,221,245, 80, 41, 1,149, 20,209,114,161, 4,182, 68, 25,173,113,217, 55, 44,243,204, 23,
+159, 97,255,186, 2, 74,192,182, 71,118, 24, 24, 44,214, 34, 4,162, 15, 26, 40, 4, 46, 84,140, 53,216,247,192, 52, 74, 26, 27,
+ 31,129,249,228, 41,225,114,189,226,179, 55, 79, 40,215, 13, 49,102,248,217,227,122,189, 17,244,167, 20, 28,137, 70,241,219,182,
+193, 79, 19,175, 44, 72,232,116,219,118,156,215,181, 29,186,114, 78, 89,203, 78,158, 66,233,103, 70, 1,183, 35, 48, 74,154,192,
+ 49,167,121,106, 28,129,170, 0,205,133, 75, 8,169,113, 9, 4, 52,162,249,217, 71,169, 72, 37, 99,153, 39,188,121, 58,227,229,
+186,225,135,235,134,203, 17,240,246,253, 7,252,236,116,194,103,143, 39,252,230,195,165, 69, 17, 39,254, 34,219,210, 33, 56,194,
+170,184, 35, 69,182,200, 93, 90,255,149,156,241,241,122,195,155, 71, 98,225, 75, 0, 87,138,137,187, 65, 71,176,166, 68,151, 57,
+184,136,162, 11, 93,183, 37,182, 82,192,198,138,120,165, 51,142, 16,105,130,151, 11,195, 98, 10, 7, 14,245, 9,168,213,252, 12,
+ 86, 98, 44, 72,188,172,160,167,133, 88,151,216,202,152, 82,110,218, 37, 1,112,181,203,186,221,235,157,218, 86, 91, 8, 82,231,
+156,244,208, 43,234,114,197,191, 46,151,114,225,233,248,221, 62, 93,118,222, 18,105,203, 4, 85,137,157,174, 18,246, 90,187,188,
+222, 88, 11,109, 44, 28, 23,230,214, 78,205,218, 70,110,142,122, 55, 66,175,220, 76,136, 64, 60,165,216,132,179,181,220,139,176,
+123,227,166,238,199, 47,160,103,204,202, 94, 75, 60,232,170,229, 46,143,227,219, 33,137,237, 46,204,133,225,244,178, 27, 19,193,
+ 23, 43,201,229, 66, 71, 41,120,217, 46, 56,213,140,243,186, 98,219,143,150,119, 91, 90,229, 69, 85, 16,101,143,103,174,126,116,
+ 59,224, 29, 19,181,156, 53,240,204, 99,174,181,210, 1,109, 28,113,195,179,100, 66,163,101,234,130,163,245, 10,168,211,212,214,
+ 32,199, 58,236, 34,200, 74, 4,173, 80, 50,143,100,181,193,145, 98, 79,203,105,234,117,213,124,137,205,166,102, 12,125,200,160,
+125,189,236,138, 68, 33,222, 85, 8, 76, 44, 26,216,238, 50, 2,110,217,234,106,128,211,180,137,129,110,151,114, 67,126, 14, 74,
+248, 94, 37, 48,101,140,237, 32,125, 91, 94,248,247,167,234,253,238, 57,168,149, 56,212,252, 90, 10, 11,220,228,210,206,237,115,
+ 46, 13, 52, 36,140,247,218,168,102,104, 57,239,170,177,226,213, 29,210,183, 86, 18,171,169,182,104,168, 72,169, 34,231,230, 16,
+ 69, 72,169, 81, 13,203,144, 82, 84, 24,176,208,213,165,253,149, 91,205,145,184,124, 0, 72, 96, 70, 77, 25,243,228, 26,251, 93,
+ 4,155, 80, 52,133, 80, 85, 60,220, 20, 3,108,170,226, 80, 28,213,132,127,178,203,215, 74,225,245,242,138,167,135, 71,194,179,
+214, 2, 99, 61,226,118,133,210, 6,235,178, 32,166,120,183,143, 85,198,181,181,148, 41,133, 15,120,141,203,237, 21,198, 59,196,
+237,192,237, 22,144,114,228, 41,128,198,143,222, 60,225,119,126,251,183, 97,173, 33,180,114,162,226,140,198,238,244,236, 89,107,
+225,180, 67, 17,197, 56, 63, 21, 79, 15, 15,252, 76, 22,156,230, 25,219,182,227,241,241, 1,219,182, 97,187, 5,252,230,237, 11,
+214,245, 4,235, 44, 22, 40, 18,251, 89, 18,177,201,202,194, 26,242, 69,248,101,198,113,236,184,222,232,146,245,206,225,182,109,
+ 64, 5,206,167, 83,123,214,172,181,184,220, 54,254,247, 59,172, 37,239,247,227,227, 35,194, 17,240,245,215,191,133, 15, 31, 63,
+192, 26,139,125,223,224,140,129,183,182,173,201, 98, 12, 20, 18,130,138, 61, 4, 44,243, 66,147,139, 2,226, 1, 24,131,253,118,
+193,245,182,193, 89,218,191,159, 61, 89,201,188,115, 40,153,188,249,211, 60,147, 61,235,122,107,128, 40,153, 58,158, 88, 52,248,
+120, 94, 17, 83,198,235,235, 13,214,106, 88,235, 96,141,167,117, 30,175,251, 80, 11, 98,136, 56,159, 78,136, 49,162,148,130,117,
+165, 85, 95, 74,137,154,136,156,219, 56,218, 58,139, 99, 39,200,204,182, 29,152,173,129,113, 22,255,238,251,247,116, 49, 87, 96,
+157,124,163,217,105,246, 95, 11, 52,197, 48,172, 7,181,239,185, 19,199,189,230, 66, 64,173, 92, 20, 30, 79, 39,124,241,188,227,
+101,219,145,114,198, 15, 47, 87, 60,189,188,224,124, 58,227,121,157,241,253,203, 85,238, 6,148, 10, 36,209, 50,141,156,140, 70,
+163, 44,119,241,140,165, 80, 88,210,235,117,199,228, 92, 19, 5, 46,218, 34,121, 22,110,230,212,192, 64,154,149,230,180,182,233,
+ 2, 91,107, 53,142, 35, 96,143, 9, 59, 23, 67,145, 45,155,178, 15, 46,108,219,115, 66, 72,108,234,127,230,113,176, 72, 84,134,
+197, 2,226, 74,124,153, 83,241, 84,218,238, 92,244,230,106, 72,196,236, 46, 8,161, 40,222, 95,244, 90,245, 83,164, 43,227,217,
+ 33, 62, 26,215,203,125,138,102,225, 59, 77,146, 29,155, 99,172,141,196, 27, 98,164, 89,149,193,171, 70,173, 45,148,225,245,107,
+ 76,228,219,103,113,103, 5,189,110,165, 21,252, 52, 99, 89, 79, 60,161,162, 38, 37,236, 27,194,177,163,196,120,151,248,134,113,
+ 93, 32, 99,250, 22, 88,213, 2, 93,208,108, 17, 69,140,239,204,113, 31,123, 46,249,178,180, 14,190, 54,242, 59,249,250, 68, 68,
+214,212,241,247, 29,251,116, 58,227,139,231, 71,252,240,225, 35,121,104, 5,198,207,100, 50, 73,234,242,214, 10,202, 6,222, 57,
+ 22,193, 41,222, 71,249,246, 37, 41,185,224,205,143,126,140,252,225, 45,145,141, 44, 37, 68, 41, 40, 24, 30,207,150, 92, 16, 33,
+227, 38,234,164,115,161, 4, 28,199, 31,140,231, 88, 69,137,198, 43,168,237,242, 30,131, 52,234, 32, 78, 19,197,127,201, 29,215,
+ 88,198,127, 47, 42,114,213,147,137,234,144,137,221, 0, 58,181,222, 49,159,234,157, 40,172, 67,125,198,224, 29, 12, 19,144, 86,
+104,240,191,147, 44,117,213,124,139,224,253,118,175,218, 75,219,247,145, 8, 73, 38, 34,106, 72, 54, 27,193, 66, 98,187,211,194,
+ 97,102,156, 35, 56, 67, 91,114,207,121,212,193,158,107, 6,230,160, 67,114,114, 41,200,133,192, 27,226,146,208,172,200,111,137,
+ 69, 3,148,167,212,202,249,195, 13,219,115,183,233, 81,138,163, 36, 1, 44,206, 98, 15, 7,142,156,145,120, 26, 48, 77, 19,125,
+217,120,146,162,249, 32, 19, 65,166, 6, 48, 59,223,138, 55,249,253,141,155,113,121,253, 1, 80,138,210,214,120, 82,180,111, 55,
+ 76,147,103,149,246,130, 24, 34,246,109,231, 47, 61,113, 22,172,167, 4,177, 82, 11, 22, 63,193, 77, 14, 97,167,241,238,236,103,
+154, 76,249, 25, 74, 39,220, 14,224,241,252,136,243, 60,193,123,202,237,126,189, 94, 8, 29, 91,233,192,164,176, 35, 13,239, 29,
+148,254,255,216,122,147, 93, 89,178, 43, 77,239, 95,187, 51, 51,119, 63,205,237, 35, 72, 38, 65,177, 88,100, 33, 85, 18, 4,168,
+ 25,213, 72,208,176, 94, 66,143, 32, 64, 83, 77,234, 1, 4, 77, 53, 21,160, 55,208, 43,104, 36, 65, 80,170, 50,179,152,100,102,
+101,178, 9, 70, 4, 35,110,115, 26,119, 51,219,221,210, 96,173,189,205,252, 70, 38, 64,220,200,136,123,207, 61,199,221,109,239,
+213,252,255,247,143,184,156,159,213,131, 12, 28, 14, 71,128, 43,238,238, 95, 34,198, 5, 37, 70,124,252,244, 81,198,202, 57,195,
+ 57,143,155,147,145, 75, 80,213,178,151,121, 6,106,134, 53,226,219,182, 62,224,238,238, 70, 34, 47, 75, 65,140, 17,222, 7,212,
+221, 84,106, 28, 7, 16,145, 40,195,149,166,182,198,132,224, 4, 80, 50, 77, 35,214, 24,251,196, 98, 8, 1,143, 15, 15, 56,140,
+242, 90, 12, 10,125,201, 37,139,154, 59,203,197,156,180, 86, 30,198, 17, 4,194,211,188,226,246,120,196, 48, 12,120,122,124,192,
+101,158, 49,141, 3, 8,140,224,196,169,114,119,119,139,135,135, 71, 4, 47,170,255,156, 43,150, 40,200,223, 90, 89, 0, 57, 12,
+161,196,233,110,186,234, 94,247, 48, 77,162,120, 15, 3,166,105,194, 56, 14, 10, 34,146, 78,219,107,129, 82,138,100,193,139,192,
+171,246,152,210,172, 23, 65, 5, 43, 55,190, 98, 93, 19,124,112, 18,236,162,224, 34, 86, 66,227,237, 20, 36,154, 86, 59,221, 22,
+ 14,211, 0, 68,117,103,105,181,155,184, 69, 87, 88, 6, 46, 88, 80, 34,188,186,191,197,101, 89,241,199,247,159, 16, 43,227,207,
+239, 63,193, 58,135, 41, 88, 12,206, 96, 73,109,170, 4,100,189,136,154, 62,170,117,155, 93,103, 68,123,135,141,124,175, 75,202,
+120,186,204, 56, 76,147,172, 60,201, 2, 49, 34,165,139,226, 88,171,128,187, 90,132,243,110,122,102,213, 74,185,198,132, 53,101,
+172, 49, 99,240, 2,136,233, 13, 77,173, 27,238, 90,215,162,182,157, 93,117,195,139,215, 93,243, 32,147, 47, 17,219,166,156,186,
+ 75,228, 58,154,101, 39,138,107,152,100,218,112,176,134, 76,239,194,183,142,158,118, 90,174,205,185,176,133,167,176,168,226,105,
+139,138,105,119, 91,139,134,222,159,141,237, 78,100,146, 17,189,211, 46,125, 58,156,224,148, 99,144, 22,209, 31, 48, 3,110, 24,
+ 16,140,221,196,113, 10, 78, 27,198, 9,195, 56, 41, 74, 22,112,195,132, 97, 60, 32,197, 5,113, 89, 16,151,139,104, 93,118,176,
+ 25,218,237, 19,218, 63, 27, 34,184,158,205,162, 97,243,218,179,105,245, 71,221, 96,223, 35,236, 52,145,172,241,112,183,246,169,
+246,232, 86, 96,131,229,115,213, 48, 3, 16,230, 92,240,246,213, 75,252,230,247, 95,129,106,237, 35,234,166,252, 6,128,209,123,
+ 17, 11,169,237,195, 16, 84, 97, 76, 24,135, 1,206,201, 97,236,173, 69, 86,113, 95, 73, 89, 70, 61, 94, 82,113,188, 37, 20,171,
+ 8, 74, 13, 67, 8,222,194,146,140,149, 88, 71,114,213,180,157,157,130, 5,170, 60,188, 40, 69, 84,247,100,228, 53, 52,251,142,
+ 24, 29,165,187,237,207,181,238,170,165,143,223,155, 2,188, 39,206,239,246,242, 77,105,189, 11,183,214, 67,148,251, 14,168, 33,
+ 38,121,103, 51,216,119,216, 68,155,160,174, 77, 18, 88,133,110, 76,181,243,245,249, 42,153, 27, 27, 88,104,231, 85,223,136,118,
+172, 23,165,120,211,249,202, 35,190,255, 89,183, 93, 98, 43,198,128, 61,163,152,118,234,122,218,118, 71,250,179,230,178, 89, 73,
+184,104,152,133, 90,185,246,150, 35,244, 28, 98,186,174,164,119, 2,191,230,220,156,151, 5, 75,206, 66,104, 83,214,114,227, 60,
+ 71,205, 44, 23,128, 67,233, 7, 43, 41, 17, 44,198, 85, 10, 15, 99,144, 75, 66,122,254,132,183, 95,254, 2,223,255,249, 15,152,
+151, 8, 75,132,239,191,255, 22, 47,238, 95, 74,167,110, 9,235,124,129,243,126, 83,247, 26,131, 26, 25,148, 51,194,120,196,224,
+109,207,140, 31,172, 69, 25, 39, 84, 29,143,113, 92,241,242,254, 14,191,124,245,115, 60, 60, 61,225,249,233, 25,167,211, 45, 30,
+ 30, 62,225,208,246,214,101,227,165, 27, 34,164, 84, 68,249,109, 37,124,165, 84, 25,135, 54,224,140, 49, 2, 39,185,189,189, 67,
+201, 81, 4, 84, 85, 24,219,198, 57, 9,181, 89, 87, 56, 48,194, 56, 34, 43,224,102, 26, 6, 24, 99,197,255,206,140, 81, 59, 95,
+175, 93, 91, 78,185, 63,231,167,227, 17,143,207,231, 62, 57,104, 89, 8, 15,143, 79, 8,222,195,120,139,121, 89,112, 58,157,186,
+186,123, 84, 58, 91, 76, 9, 41, 70, 56, 39, 93, 28, 88, 80,165, 33,120,157, 66, 4,156, 70,194, 16, 28,150,229, 44, 89,231, 94,
+ 92, 18, 49,171,179, 33,174, 98,229,243, 86,223,183, 4, 31,134,190, 10, 28, 66,128,119, 78,194, 99, 88,215, 33, 49,194, 57,139,
+105, 28, 17,115,193,241,120, 82, 79,184, 20,208, 41,101, 25, 53,151,130,218, 44,180, 93, 68,200,136,113,213,132, 56, 82,148,106,
+ 81, 12,175, 92, 76,162, 3, 40,168, 21,248,246,211, 83,159,108, 58, 35,197, 84, 11,139,106, 83, 39, 50,178,230,104,251,101,102,
+ 82,248, 79,139, 58,181, 8,206, 10, 77, 81, 63,242, 55,199, 35, 94,223,175,248,238,225, 9, 49, 87, 60,156,103,248,247,159,240,
+238,213, 61, 78,131, 67, 42, 69,119,234,202, 91,103,153, 58, 58,115,189, 67,222, 84, 67,109,116,200,162,157, 2,176,100,134,205,
+ 12, 80, 1, 33,163, 20, 25,181,183,157, 51,233,186,135,179, 18,235,172,252,185,118,161, 71, 85,196,151, 82,144,116,191,142, 93,
+124,234, 78,177,132, 77,246,195,106, 51,148,253, 57,118,147, 58,174,172,180,186,172, 2,210,109,202,217, 41,108,157,160,167, 93,
+121, 19,200,113, 19,203,237,130,179,176, 27,201,119, 75,155,124,159,198,110,103,115, 67,118,111,218, 29,213, 68,237,132,119,141,
+213,177, 21, 42,186, 87,183, 70,112,200,227, 1, 55,119,119, 72, 41, 34, 43, 36,104, 60, 28,196, 58,235, 36,170,184,205, 12,184,
+227, 91, 5,180, 85, 91,108,171, 2,132,134,233, 0,230,138,220,178, 17, 64, 59,210,234,245,255,218,121,236, 88,131,225, 9,226,
+115, 38,222,114,110, 90, 60, 97,221,107,225,152,119,138,131, 13,115,199,251, 11,164,123,232, 54, 70, 60,161,226,178,204,248,242,
+197,139, 78,152,234,222, 82,222, 46,161,152, 69, 40, 66, 42, 12, 75, 5, 24, 88,242,137, 27,228,196, 88,139, 82, 25,211, 48, 96,
+125,255,103, 12,206,202, 15,172,209,144,213, 72,224,192, 37, 17,130, 55,176, 69,166, 9, 48, 6,169,206, 32,174,178,119, 84,134,
+238,154,100,143, 85,170,140,116,171,102,138, 19,137,234,242,230,120,196,186,196,238,165, 38,218, 51,121,183,143,107, 19, 63,244,
+ 11,189,119,234,181,211,172,164,227,213, 61,110, 41, 87, 52,191,125,113,131,125, 48,203, 78,129,183,239,168,141,142,243, 12, 81,
+135,198, 92,129,131,246,239, 1,227,250,107, 93, 37, 13,113,127,168,122,116,123,221,208,199,109,226,149,149,169,222, 86, 18,172,
+ 59,231, 62, 73,232, 12,249,109,248,144,219, 24, 77, 69,125, 85,243,205,187,253, 70,213,159,133,247,251, 62,234, 15,215, 30, 95,
+188,231, 40, 64,215, 36,198, 26, 60,158, 47,184,153, 38,164,231,103,177,153,105,144, 2,145, 21, 74, 97,169,128,142,247, 26,164,
+194,104,177, 85, 88,108,147, 13, 57,155, 99,196,233,230, 37,214,117, 6,192,152,166,131,124, 94,115,194,186, 46, 56, 12, 35,230,
+121,134,117, 1,165,200,197,100,173, 65,101,215,249,216,211, 65, 66,106,130, 31, 48, 47,171, 10, 9, 9, 41, 39,196,148,101, 20,
+ 29,132, 95, 30,172,193,241, 48,226,195,167, 15,168,165,224,249,124, 70,112, 94, 20, 39,181,194, 56,175,225, 27,140,156, 86, 24,
+235,176,174, 11,194, 48, 72,220,168,147, 24, 81, 3, 35, 89,246, 37, 11,251, 33, 70, 85,225,158, 0,178, 56, 63, 61,138,205,205,
+ 89, 21, 88, 26,140,147, 68,194,198, 20,225,172,195, 52,201,133, 94,139,238,105, 75,145,221,108,173,152,166, 9,231,243, 5,131,
+ 23, 60,171, 49,178, 83, 46, 73,148,245, 41,103,156, 47, 11, 14,135, 17,113, 93,225,125,192, 52, 77,253, 61,245,206,137,149, 77,
+167,111, 41,101, 28, 14, 7, 21, 43,201,110,242,112, 16,160, 77, 74,130, 43,197, 26,145,171, 96,159, 75,206,162,206,215,239, 61,
+169,165,208,232, 57,113,156, 14,168, 37,227, 50, 11,236, 72, 58, 71,209, 0,120, 43,168,221,219,219, 83, 31,167,143,227,136,117,
+ 94,240,124,126, 22, 4,176,242,228, 27,231, 28,204,178, 67,134,136, 9, 83,202,112,206,202,248, 95,155, 12, 99, 12,144, 99,247,
+ 34, 47,185,200, 84,128, 24,247,199, 9,222,203,133, 94,185,226, 56, 14,253, 66, 21,244,174,134, 63, 17,245,100,190, 22,198,194,
+234,244, 41,170,244, 79,185, 96, 24, 60, 94,223,157,240,213,247, 15, 40,165,224,211,243, 51,166, 65,108,143, 71, 71,248,180,228,
+ 45,123, 98,151, 67,222, 30,226, 61,136,133,247, 34, 90,146, 14,121, 89, 22,228, 36,214,224,160,197, 77,247, 79,211,166, 23, 34,
+ 42,253,145,140, 57,107, 39, 93,176,166,132,162,197,122,179,234,109,201,147,188,195,183,210,182,218,101,160,160,162, 20,238, 69,
+ 0,235,249, 37,106,119,189,240,235, 46, 8,156,118, 13,210,110,180,190,183,176, 49,225,138,215, 65, 59,113,210,222, 77, 35, 17,
+175,212,125,242,188, 27,233,243,150,156, 46,180, 81, 99,251,204,116,143, 65,103, 85,177, 91,231,225, 92,232,247,212,243,211, 35,
+226, 50, 35,103,129, 92,249, 97, 20,223,191,247,125, 50, 90,138,208, 8,141,114, 40,202, 42, 25, 8,235, 60,119, 23,142,184,109,
+154, 45,110,148,103,179,110,218, 54, 98,200,120,191, 23, 94, 14,142, 89,187,161,158,200,166, 69, 77, 39,205, 93, 51,244,120, 23,
+177, 65,204,251,254, 17,180,191,234,118, 2,171, 61, 19,189, 42,152,190,143,160, 65,226, 31,118, 70, 95,112,211, 47,136, 65,199,
+ 90,164, 31,148,201, 12, 58, 58,149, 55,245,124, 62,227, 24,130, 84,105, 44, 74,119,231,164, 67,183, 58, 81, 88, 75, 70, 42, 12,
+148,162,232, 76,249,123,159,230, 5,206, 0, 41, 21, 68,197,143,178, 49, 96, 67, 56,167, 36, 65, 3, 85,146,153, 82,204,189,218,
+222,196,106,102,151,131,190,145,135,250, 8,188,141,221,219,174,189, 20, 24, 75, 48,140, 46,228,106, 29, 55,181, 93,205,190, 20,
+109,169, 67,212, 95,237,157,237,173, 93,222, 69,197,109,185,251,202, 27,126,144,120,131,224,112,197, 46,235,232, 42,125, 80, 67,
+142, 54,235,155,221,149,244,117,143, 11, 6,186, 88,174,219,213,246, 99,176,158, 66, 71,221, 27,223,119, 90,187, 66,144,118,224,
+143,150,140, 84,119,147,136, 86, 61,246, 24, 68,162,107, 74, 94, 31,159,201, 37,157, 98, 66,104, 1, 49, 90, 52,132,113,132,247,
+ 30,181,200,225, 22,188,195,154, 46,170, 55,168, 58,134,115, 48,181, 34,115,148,145,112, 18, 49,150,113, 22,119, 47,191,196,167,
+143,127, 86,113, 83, 65, 78, 5, 37,103,172,201, 97,116,226,111, 31,135, 1,214,184,109,101, 65, 44, 15, 33, 24,243,124, 17, 65,
+ 40, 87, 48,228,225,181,214,160, 84,194, 56, 4,124,122,122,196,171,215,175, 81, 65, 24,198,131, 84,233, 90,156,197,148, 0,235,
+ 97,213,161,144, 75, 86,118, 56,129, 96, 59, 28,197, 26, 11,174, 73,179, 10, 2,150, 44, 12,123,230, 36, 62, 85, 34, 28,142, 55,
+ 48,214,137,141,204, 27, 44,115,132,213, 34,161, 26, 66, 94, 86, 28,142, 7, 4,231,165, 64,210, 29,126, 86, 69,122,106, 25,226,
+ 0,158,159,159,251, 97, 89,149,169, 94,139,160, 62, 91,134,116, 24,188,188,247, 85,124,237,207,207,207,112, 26, 33,233,172,196,
+151,206,151,139,178,220, 45, 64,114,209, 87,237, 8,159,158, 46,186, 30,171,200, 49, 98, 26,100,124,185, 46,171,132,160, 24, 35,
+175,143,254,158, 48, 4, 60, 95,102,120,239, 49,175,177,167,241,173, 57,245, 17, 55, 17,193,122, 47,208, 23, 34, 4,239,113,115,
+ 58,194, 89,135,135,101, 70,173, 5,211, 56, 34,101,121,230,187,216, 85,133,191,203,178,118, 72,140, 37,234, 4, 62,163, 17,207,
+ 85,159,155,175, 63,126,218,152, 14,154, 65, 32, 26,155,218,241,176,165, 86,120,227,144,107,133,179, 26,160,212,120, 12, 92, 81,
+ 89,196,189,165, 20,128,208, 69,150,178,126,112,184, 59, 30,240,116, 94,240, 52, 11, 10,249,227,211, 25,119, 58,153, 10,196,152,
+115,217, 58,191, 90, 84,183,211, 84,222, 29, 20,173,121, 32, 77, 31, 5,165,202,137, 38, 41, 37, 66,114, 89,207,221, 45, 69,211,
+ 20,241,214,199, 40,147, 13, 99,128, 84,170,156,159, 89,173,106,157,114, 41,203, 72, 82,152,139,184,155, 54,137,107,115, 63, 20,
+ 29,101,231,230, 91,215,179, 70,214,116,181, 23, 7,251, 73, 67, 35, 93,210,174, 80,160,109,254,160, 5, 59,122,131,213,217, 37,
+ 45,237,172, 17,229,118,112,173, 22,119,138,207, 70,218,181,213, 61, 13, 65,222, 64, 48,237,207,144,133,179, 30,206, 75, 64, 15,
+ 84,216, 87,107,198,229,249,177, 79, 70,139,186, 5,106,221, 10,230,154, 37,174,217,251, 0,203,122, 46,237,109,204,204,200, 49,
+162,168, 38,195,122,175, 26, 8,101,200, 52,126, 71,203,104,215,207,164,177, 22,142,169,202,216,157, 72, 31, 90, 13,110,233, 41,
+ 54,155,178,187,121,192, 25, 27,180,190, 39,108, 84,116,147,126,219,197,179,142,241,183,238, 29,248, 56, 47,176,206, 3, 49,118,
+171, 65, 73,114,216, 52,164, 41, 67,188,163, 57, 23,120, 43, 93,222,168,123,117,171,213, 44, 17,225,230,230, 6,223,198,136,163,
+151,135,215,123,143,224, 36, 24,193, 66, 63,116,133,113,137,194,245,246, 57, 35,233,138,225, 50,175,112, 4, 92,114,221,246, 50,
+214, 98,102,137, 54,180, 0,150, 92, 17,166,208,223,108, 34,193,207,114, 81,145, 73,163, 14,211, 6,237,225,158,159, 46,213, 29,
+107, 28, 94,187, 60,183,212, 54,244,200,198, 22, 26,210,133,101,202, 1,239,150, 58,200,122,128, 43,127, 6,161, 65,247,202,243,
+206, 87,222,212,240, 45, 57,142,177, 49,163,205, 14, 27, 91,181, 99,181, 90,153,150,190,203,218, 4,127, 87, 86,178,157,207,126,
+123,152,208, 21,242, 78, 1, 62,180,201, 88, 58,142,145,186,214,226,218,251, 95,155, 85,142,119,196,190, 61,131,185,131, 29, 72,
+253,246,237,181,150, 34,240, 18,179,230, 17,203, 3,126,163, 59,212,154, 11,150,152, 58, 5,171,150, 2,107,209,179,160, 91,119,
+152,178, 92,216,204, 12,228, 44,159, 77, 48,230,203, 67,159,214,140,227,132,154, 34, 6, 69,191, 30,166,131,112,173,157, 76,120,
+ 14,199, 35,150,117,193,253,205, 17,203, 60, 43, 66, 18,168,121, 65, 76, 2,215,185, 44, 51,134, 48, 96, 94, 22, 4, 43,192,153,
+187,219, 91,217, 87,134,128, 17, 2,171,144,162, 85, 39, 88, 37,139, 64,135, 4,125,106,244,178,168,165,192, 26,214,231,195,163,
+114,193, 48,140,112,206, 98, 89,165,115,180,214,138, 35,192, 9,157, 45,167,164,162, 82,233, 28, 39, 47,123,242,117, 89, 84,212,
+ 89, 80,117, 79,223,232, 95,167,195, 1, 37,103, 60, 45, 11,188,181, 61,108,201, 89,177,226, 17,145,142, 95, 51,140, 49, 56, 78,
+ 83,143, 80,126,124,122, 64,240, 1, 57, 75, 81,235,221,208,195, 40,130,142,252,107, 21,161,230, 60,207,224, 16,144,114,134, 37,
+233,204,155,149,108, 93, 18,172,119,152,215, 21,150, 8,177, 48, 78,135, 17, 40,178,238,243,106,133, 52,109,162, 72, 4,103, 93,
+ 95, 77, 4, 47,194,194,113, 28,229,130,223, 9,156,140,115,240, 93,168,169,187,205, 48, 0, 4, 44,243,210, 69,113,146,221, 30,
+ 20,146,162,133,133, 62, 43,222, 7, 92, 46,179,100, 0,232, 36,239,197,113,234, 97, 40,109,108,157,139,140, 97,207,203, 42,185,
+243,206,116,253, 14, 17, 75,177,207,140,154,228, 53,130,106, 97, 26, 89,143, 0,140,193,227,197,205, 1,231, 53,138,243,231, 50,
+163,148,130,119, 47,110, 49, 57,194,243,146,251,227, 85,101,185,127,213,209, 98,183,115,190,130,140,233,234, 21,202, 34,104,248,
+234,102, 39,110, 66,180,108,118,176, 41, 34, 25,143,103, 25,143, 55,160, 73,229,109,148,221, 0, 88, 64,131,195,232, 62,191, 42,
+121, 84, 11,243,170, 17,206,202, 11, 83,125, 68,237,218, 4,236,186,102,218,163, 59, 62,223,145,239,119, 13,252,195, 17, 53,136,
+ 96, 84, 60, 47,185, 0, 91,232,215,166,115, 50, 59,245, 14,119,156,235, 62,112,202, 90, 3,231, 2,156,243,186, 3,215, 4,210,
+154, 97, 97, 49, 14, 1,147,142,205, 5,119,172, 34,224,146, 81, 85,225,110,131,239, 13, 97,206, 17, 37, 37, 9,169,105, 22, 96,
+239,182, 21, 36,179,134, 65, 65,201,153,186,195, 47,159, 97,253,117,133, 99,154,114,178, 95,198,237, 66,223,165,205, 64,187,169,
+206, 60,231,107, 62, 17, 51,247, 64,151,189,237, 11,187,228,210, 38,206, 90,117,140,102,246,254,196,166,176,175,117,215, 93,106,
+186, 77,231,174, 87, 21,100, 9, 35,188,214,138,101,153,241,241,188, 34, 43,103,120, 85, 54,187,245, 14,214, 59, 12, 67,192, 52,
+ 10, 2,115,244, 22,255,205,127,251,111,145, 75,237, 59,189, 38,254, 66,101, 88,146, 81,118, 44,162, 60,245,214,192, 56,131,117,
+137,240,154, 2, 86, 84,174,221,133, 25, 10,220,231,238,209,222, 87, 90,170,254, 54,248,140,170,191, 79, 77,218,128, 2,212, 84,
+246,106, 17,163,238, 57,221,216,228,216, 33, 19,175,208, 0,122,192, 96,231,237,174,154, 10,212, 69,126, 42, 22, 43,187,228,179,
+ 6,252, 73,250, 16, 65, 5,100,188, 11,229,217,218,251,186,161, 8,177,197,153,214, 30, 86,128,206,226,222,246, 87,188, 93,214,
+ 59,117, 27,245, 56, 79,245,175,235,235,105,212, 7,106,173, 48, 9,172,118,143,198, 88,117, 70, 8,189,173, 93, 28,133, 69, 63,
+193,144, 49,255,168,161, 38, 48, 6,107, 86, 80,139,234, 35, 24, 27,174,114, 15,206,108,213,175,248,211, 69, 25, 77,100,177,174,
+ 23, 17, 92,133, 65,138, 78,239, 80,136,112,115,119, 47,168,209, 42, 75, 0, 0, 32, 0, 73, 68, 65, 84, 17,175,100,241,240,240,
+136,203,124,193,249,124,134,177, 3,158, 46, 51,158, 47, 51, 46,107,132, 15, 99,159, 54,213, 90, 17,188,100,120, 51,137,242,155,
+ 0,140,211, 40,132, 58, 24,185, 76,245,247, 5,231, 36, 30,214, 88, 77, 22,179,253,243, 16,115,134,243,114,233, 57,231, 0, 46,
+125,108,156, 82,198,178, 44,136,107,196,101,158,177,172, 51,210,186,226,252,252, 44,209,141, 10,171, 25,199, 17,227, 24,224,188,
+197,116, 56, 0, 68, 56,158,110,112, 58,158,244, 89,103, 76,135, 35, 82, 46,162,108,183,130,171,141, 41,245,241,113,163,128,149,
+ 82,113,127,115,196,221,233,216,253,216,203,178,160, 86,198,178, 44,152,231, 89,125,215,194,208, 23, 42,151,224, 93,157, 37,172,
+113, 69,169,140,243, 60,235, 56,218, 96, 89, 87,164, 82,240,240,244, 4,231, 37,129, 77, 68,201,202,245, 39,241,140,203, 88,210,
+245,142,210, 40,140,102, 89, 23,140,227, 40, 35,127,178, 87,108,140,152, 68,208, 39,138,124, 73,149,203, 69,108,136,226,243,247,
+122,112, 10,124,134,213, 82,213,158,173,198,112, 72,169,160,178,236,236, 47, 41, 95,173,206, 14,218,153, 55,149,123, 43,198, 59,
+131,163, 79, 36,229, 89, 74, 81, 96, 63, 57,165,158,212, 23,147, 68,214,122,239,250,244, 36,120,135,195, 24,112, 24, 2, 80,229,
+123,185, 44, 43,158,230, 69,156, 61,205, 62,168, 2,176, 92,234, 6,133,218,173,219,218, 62,183,177, 85,122,206,132, 54,110,172,
+ 58,134, 37,102,172,185, 96,205,178,202, 88,163,172,143,214,152,177,164,164, 23,250,214, 48,108, 74,224,107,125,213,142,134,213,
+ 69,112,185, 72, 49,221,186,245,246,239, 83, 46,154,211,126,189,230,109,157, 52,204,118, 65,247,160,150,171,162,133,174,210, 49,
+ 9, 45, 21,205,244,166,225,115, 2, 27,239,156, 71,251,175,209,197,119,166,225, 89, 13, 92, 24, 16,194,164,137,143,220, 1,242,
+141, 99,111, 12,225,197,253,237, 46, 11, 93, 26,137, 97, 24,149,187,178,233,175, 4,198,147,192,165, 72,147,160, 69,189,181,130,
+231,109, 8,104,174, 69,166,217, 70,116, 38,198, 90,144,177, 59,204,108,211, 16, 72, 81,230,234, 46, 63,157,175, 8,182,219,184,
+147,119,153,196, 18, 82,176,203,193,172,251, 63,181,191,182,106,127,147,121,203,154, 7, 81, 85,187,205, 69,236,108,188, 17,154,
+218, 24,186,189, 89, 85, 5, 18,174,103,250,202, 62,178,249, 14,255,195,191,255,107,156,130, 71,174,140, 65,147,146,114, 76, 88,
+ 85,149, 25,188, 69, 45,132,224, 45,198, 48,226,253,119,223,194,112, 85,196,163,238, 94,137, 85,241,236,177,228,132,193,136,160,
+206, 25,131, 88, 24,181, 36, 56, 39,162, 33,222, 93,194,219, 90,250, 58, 57, 76, 62, 20, 22, 21,185, 95,198, 29,196,207,219,150,
+105,195,178,154, 94, 58,183,202,172,118,202, 28,182,204,244, 62,123,178,154, 30,196, 87, 1, 69,125, 76,213,139,164, 93,186,209,
+ 62,207,173,193, 12, 26, 97,206,108, 10, 89, 40,218,147,121,195, 34,182,138,246, 10, 35, 76,219,215, 51, 68,224, 31, 66,242, 59,
+ 48,168,125, 93,163,232, 80,179, 87,107,234, 11,230,157,217,148,173, 87,255,253,186,203,104,170,117,235, 28,156, 17,170,152,177,
+140,129, 12,242,154,100,164,135,166,191,200,136,172,228, 42,146, 67,162, 5,188,144,146,156, 74, 78, 61, 28, 70,148,178,178,199,
+108, 12,229, 82, 11, 62, 62, 62, 96,244, 1, 54,101, 4,239,240,252,244, 40, 15,153,113, 8,222, 97, 24,101, 47,156,210,138,224,
+ 3, 66,112, 72,149,240,225,195,123,132, 97,192,186, 68, 88, 67,154,203,109,176, 92,158, 96,157,199,121, 89, 80, 74,193, 50, 47,
+ 50,246,175,132,233,112,236, 79,223,116,112, 82,189,167,168,221,145,224, 87,125, 24, 97,173,168,139,165,163, 41, 32,178, 72, 36,
+ 98,191,224, 3, 10, 24, 53, 37,161,178,133,128, 3,110,228, 48, 89,132,183,238,125, 64,174, 85, 5, 91, 21, 7,213, 13, 16, 17,
+206,151, 51, 74,173,152, 23, 25,107,251, 33,136,133,205, 26,228, 12,217,155, 79, 3,200, 90, 81,177,135,160,225, 40, 14,133,185,
+ 71,149, 78,227,136,101, 93,225,212,167, 59,142, 3,214,117,237, 2, 62,103, 8, 41, 37, 45, 4,165, 32, 43,165,202, 69,204,226,
+ 97, 15,222,109, 78, 11, 54,136, 57,227,116,152, 64, 96, 60, 95, 86, 28, 15,163,118, 72,165,179, 33, 82,202, 8, 77,127, 99, 4,
+ 34,212,146,216,162, 90,214,230,121,150,130, 47,199,206, 97, 87, 63,144,242,238, 69, 77,239,188, 85,149,191, 83, 39, 6,119,238,
+ 68,102,198, 64,194, 87,184, 68,161,246,129, 8, 55,163,239,159, 83,210, 36,191, 22,183, 25,163, 92,242,205,183,222, 44, 91,214,
+ 24,164,164, 23, 36, 53, 36,182, 52, 53,107, 44, 59,252, 53, 35, 56,143,105, 24,240,188, 72,183, 94,152,241, 60, 71,140, 97, 64,
+176, 14, 75,138, 72, 41,202,103, 84,184,218, 59,191,214, 63, 19,218,166,194,232,186,235,130,197,181, 36, 35,243, 54, 93,108, 62,
+232,174, 57,171,212,243,221,175,108, 41,117, 63,213,219,190, 86,243,247,183,221,121,101, 6,171,138,190,173,245,234, 30, 56, 69,
+215, 26,247, 54,246,110, 28,118,179, 63,123,245,242,222, 38,160,212, 21,239, 77, 44,219,239,169,207,129, 98,109, 29,177,183,200,
+181,169,172, 32,235, 64,100, 97,201,194, 89,167,155, 13, 17, 57, 91,141,226, 45, 37,171,240, 87, 4,169, 47, 94,222,233,180, 75,
+167, 99, 68,114, 81,183, 8,228, 82,174,240,174,114,185, 11, 11,223,122,117, 1,104,161,101,149,236,215,214,180,155,192, 41,119,
+225,220,102, 33,150,149,172,107,153,180, 59,202,137,250, 4,183, 23,128,118,185,177,210,241, 53,216,252,134, 24,229, 29,167,188,
+ 15,236,123, 91,191,137, 54,152, 25,239,222,190,194,135, 15, 31, 59, 55, 26, 68, 40, 41,194,248,161,219,148,156, 33, 61, 56, 10,
+170,145, 10,221, 26, 69,129, 26, 17, 37, 29,157,193,201,123, 81,190, 90,131, 88,212, 91, 57,175, 32,107,145, 87,131, 88, 43, 28,
+128,156, 86,233,208, 65,120,243,163,191,192,167,239,255,172, 9, 87, 27,164,229,224, 29,150, 82,251, 62, 69,196, 60, 19, 46,231,
+229,202,198,209,186,217, 14, 57,145, 0,110,177,112, 25,131, 82,114, 87, 92,122,231,187,117,161,191, 62,170, 11,216, 91,199,106,
+ 23,215,215, 43, 79,118,247,168,183,206,183,150, 93,162, 9,126,144,203,219, 29, 9, 93, 56, 39,104,196,210, 18,221,104,103, 33,
+107, 73, 68,180,131, 8,241, 54,202,170,123,111,251,238, 33,107,126,245, 22, 72, 67,251,241, 85, 35,237, 25,211,227, 3, 91,161,
+182, 61, 48,180, 19,238, 24,181, 12,225,106,239,222,186, 37, 1,128, 56,188,124,113,143, 31,253,232, 75,188,125,243, 74, 30, 46,
+ 48,254,240,251, 63,226,195,183, 95, 99,185, 60,137,114,122, 12,202,120,151,247,194,238,114,236, 91, 17, 82, 42,195, 40, 35,188,
+106,161,216,236, 51, 68, 21,198, 6,188,255,243,239, 55,138,158,245, 8,227,132,117,185, 96, 48, 2, 69, 73, 41,129,144, 49,140,
+199,158, 78,152,185,130,203, 5, 75, 20,207, 58, 57,217, 47, 91,239,145,107, 85,101,176,216,204, 82, 41, 88,150, 5,239,223,191,
+215, 20, 55,181,172, 1, 66, 66, 3,131,184, 34,171, 53,142,245,160, 44, 76, 8,196,178,211,180, 50, 1, 40, 44, 17,195,153,133,
+105,239, 64, 88,215, 85,212,219,168, 40,105, 21, 97, 89, 92, 53,235,222,203,190,148, 89,149,225, 65, 10,103, 67, 72, 49,137,181,
+203, 58, 4,157, 78,249, 65, 34,143, 47,203,170,147, 3,171, 93,177, 69, 86,241,216,101, 94, 49, 29,100, 93, 22,188, 3, 87,163,
+252, 0,137, 39,205, 37, 99, 89, 91, 65, 87,101, 76,105, 61,214,117,149,181, 88, 24,145,138,216,220,114,206,168, 92, 69,113,174,
+ 41,125,139,230, 6, 92,249,185, 21, 49,235,157, 36, 55, 30,166,161,103,130,159, 78, 55, 2, 46, 34, 96, 26, 7, 44,243, 69,173,
+177, 14,214, 90,204,243,140,152, 50,140,147,169, 66, 67, 30, 7,239, 84,168, 39, 32,162, 90,170,162,115,185,175,139, 60, 20, 48,
+ 99, 61,136, 11,190,127, 94,148,115,175,238,157,224, 59, 27,193,247,137,147,233,103, 97, 97, 70,208, 68, 67, 18,254, 54, 18, 23,
+ 56, 69,135, 54, 63,118,243,198, 39, 85,219, 55,209,173,115, 14,131,247, 24,131,195,188, 38, 88,235, 81, 97,113, 89, 11,114, 94,
+197,215,220,196,171,220,166, 7,116, 21, 7,221,206,178,189, 34, 74,242,187, 55,235, 45,209, 54,248,102, 70,207,123,104,169, 89,
+155, 3,103, 7, 14,175,123,105,189, 6, 95,237,245,213,216, 83, 34,165, 27,145, 98, 73,166, 10, 27,118,123, 95, 39,232, 57,213,
+162, 75,185,145,212,112,165,102,167, 70,187,220,159, 53,251,125, 3,181, 2, 96, 31,235,141,190, 90,148, 70,178,246, 44,122,128,
+ 64,214,193,153, 0,134,236,211,155, 85,213,234,196, 16,204,200, 53,117,212,249,198,245,183,253,245,225,182,123,236, 35,242,186,
+101,121,144, 8,115, 99,140, 40, 89,242, 32,132,224,103,181,169,170, 61,168,138, 52,147, 35,231,188,173, 11,245,127, 37,215, 78,
+154,147, 64,151,150,168,214,106, 54, 49,162,139,200,129,175,247,228, 91, 54,215,118,216,243,126,124,222,189,234,181,163, 83,107,
+179, 78, 48,174,216,186, 50, 98,176, 58, 98, 86, 63,174,222, 85,165, 20, 88,114, 40, 57,129,130,236,204,138, 10, 43, 64,128,169,
+ 5, 48, 18,147, 26, 6, 47, 5, 0,196,159,103,117, 44,156, 43,203, 8, 73, 3, 15,156, 53,248,243, 31,126, 15, 59, 12,152, 31,
+222,139, 10, 86,115,194,141,105,130, 8, 35,251,114, 38, 60,171, 2,247,221,187,119,248,201,143,222,225,175,255,246,183,200, 89,
+170, 96,217,157, 81,223, 61, 55, 44,172,112,223, 69,172, 87,213,150,150,203,117,198,186,213,195,184,234, 56,133,119,121,242,189,
+ 64,218,147,227,118, 15, 65,119, 20,104, 39,223, 50,123, 27,205,172,173, 48,228,165, 54, 50, 14,106, 10,219,206, 38,222,222, 15,
+194,246,207,253,129,194,142, 79,111,204, 38,102,100, 6, 25, 25,163,218, 6,131, 97,116,128,132,161, 29,225, 9,162,194,108, 69,
+207, 62, 54,144,204,166,212,236, 19, 12,221,131, 26,221,219,190,124,241, 2, 95,126,241, 14, 47, 95,220,246,175,179,175,217,115,
+ 22,209,225,225,120,196,183, 69,163, 60,117,130,100, 33,101,124,169, 5,177,100, 21, 98,161,239,249, 13, 17, 92, 24, 96, 72,194,
+ 72,184,137, 36,107, 5,233,120,250,246,254, 45,158,159,190, 23,194,157, 41,240,167,123,152,241,136,229,249, 1,143,143, 15,184,
+189,185,209, 49, 32, 16, 83, 22, 87,128, 17,130,157,119,164,121,224, 50, 53, 25,188,131, 45,140,241,197, 11,196,148,241,252,244,
+ 0,148,132,148, 50,158,158,159,133,162,198, 6, 31,222,127,144,139, 84,159,247, 24, 87,181,224,105, 40, 6,244,242, 46,181,195,
+ 61,184, 50,134, 48,160, 84,233, 80,101,244,188, 74, 48, 74,149, 17,170,183, 14,185, 68, 12,170,218,119, 78, 98, 29,159,207, 23,
+156,142, 39, 41, 30, 52,174,181, 20,161,152, 73, 40,139,236,165, 47, 10, 61,105,221,179, 49, 6, 33, 4,148,148,112, 58,157,144,
+162, 8, 13, 83, 76,240, 26, 91,204,234, 40,184, 61,221,244,113, 97, 24, 6, 17, 12, 41,215,251,195,249, 1,183,167, 19,150,101,
+ 65,169,162, 40, 95, 83,130, 85, 64, 80,173, 21, 33,120,156,207,103, 77,239, 51,168, 68,155, 98,152, 12, 78,199, 35, 62, 61, 60,
+200,196, 33,139, 10, 59,232,110,222,107,116,232,249,114,198,241,112, 16, 24,138, 33, 92,150, 69, 4,117, 94, 38, 11,173,120,246,
+206,105, 17,197, 87,137,131,163,179, 40, 89,214,104, 82,228, 25, 84,178,240, 37,129,156,195, 57, 21,213, 59, 24,140,222,118, 28,
+114, 91, 27,201,136,182,246,162,222,146,193,162,186,132, 13,248,100,117,196, 47, 26,129,148, 50,140, 78, 99,154,248,115, 67, 82,
+179,102, 96, 12, 40,176, 48,214,129,107,197,195,243, 19, 12,218,186,110, 67, 87,151, 22,206,212,129, 44, 77, 16, 86,122, 18, 39,
+183,213, 42, 53, 42, 36, 93,133,115, 48,237,130, 96, 42, 64, 70,197,178,188, 15, 89,234,243,191,174,181,225,221,247, 76, 42,187,
+111,118, 45,230, 10, 46,232,154, 28, 13, 93,211, 8, 11,234, 63, 3,117,141, 18,131,216,116,214,122,239,178,251,153,131,206,218,
+239,251,245, 54,102,103,192,192,160,170,198,107, 47,210,238, 46, 46,162,158,226,102,173,133,117, 3,170, 9,200, 41, 41,231, 94,
+108,166,212, 99, 78,203,149,208,153, 84,239,181,229,208, 19, 0, 17,174, 89,181,216, 66,243, 16, 88,249, 38,181,233, 92, 0, 56,
+231,175, 92, 10,198, 24,212,220,154, 14, 93,117,229,172, 57,242,122, 87,235,200, 95, 28,108,220, 39, 12,142,105, 55, 45,215, 55,
+ 68, 46, 98,189,152,155, 96,106,119, 49, 75, 33, 88, 91, 67,216, 61,159,251, 55,145, 53, 57,172,171,150,121, 7, 88,169,140,151,
+ 47,239, 36,202, 82,193,255, 45,139, 58,169, 80, 75,186,106,133,136, 4,177,248, 24,211,136,115,162,212, 31,130,140, 38, 92,139,
+222, 84, 15,187, 81, 97,198,188, 38, 84, 67,240,204,184,121,251, 37,254,251,255,241,223,225,127,254,159,254, 7, 44,113, 69,204,
+ 69, 47,103,217,167, 23, 8, 86,243,156, 50,230, 84,177, 86,198, 77,112,120,120,120,194,143,223,189,197, 95,254,171,127,129,243,
+121,198,239,255,240,149, 88,147,226,170,100, 47,234,123, 48,230, 54, 78,225,141, 59,204,123,213, 60,245,157,110, 35,244,245, 96,
+211,157,205, 67, 46,207,114,157,198,208, 84, 36, 61,187,119,179,127,201, 4, 99,251,144,237,247,246,172,254,107, 83,141,164,107,
+237,162, 94, 43,201,120,127, 75, 18, 16,203, 83, 45,187,209,153, 94,244,141,146,100, 28,233,238, 19,255,236,200,220,104, 34, 17,
+ 51,195, 91,191,219,249, 24,205, 33,150,221,184,181, 22,199,195, 1,111,222,188,194,219, 55,175,113, 60, 76,157, 55,223,187,121,
+230,174, 18,109,235, 13,238,251, 59,131,249, 50, 75, 32, 14, 1,131,238, 67,107, 43, 64, 44,193,177,133,163,128,121, 94,174,242,
+236,157, 27,117, 39,255,116,229,125,183, 74, 38,116,110,216, 86, 13,110,192,253,235, 47,165,240,121, 83,112,186,125,209,199,228,
+ 95,255,238, 55,120,250,254,107, 84,102, 12,131,151, 46,154, 9,117, 93, 49,140, 22,140,140,186, 2,167,105,194,243,249,130,164,
+ 40,219,112,115, 47,211, 28,150, 93, 26, 52, 17, 75,210,159, 74,207, 40,224, 74, 18, 99,170, 15,136,128,104,156,236,179,189,239,
+232,132, 85, 47,137,117, 89,186,213,138,187, 11, 67, 44, 99,226, 37,206,114,105, 70, 25,255, 61, 95,206, 56,140, 35,130, 49,136,
+203,170,227,112, 93,143, 45, 51,136, 12, 46,139, 88,196, 10, 42, 50, 11,243,189,234,222, 51,158, 47, 32, 50, 56, 76, 18, 43, 90,
+149,239,237,188,199,203,219,131,124,158, 84,200, 86, 83,198,195,227, 39,193,154, 50,227,230, 40,216,213,166, 80,103, 34, 12,222,
+227,249, 50,139,189,110, 28,112,190, 92, 58,190,118, 93,163, 70,209,202, 97, 54, 28, 68,116, 40, 62,112,121,205,188,247, 40,149,
+113,152, 6, 88, 99,145,115,196, 56, 4,204,203,162,144,156, 91,153, 98, 88,135, 33, 4, 92, 86,225,232,111,124,127,113, 31, 8,
+190,212,194,248, 13, 74,210,158,177,148, 10, 74,140, 56, 29, 15,248,246,225,121,163, 15, 18,245, 93, 58,169,103,186,109,228,138,
+ 58, 4,192, 34,204, 28, 66,216,209, 21, 53, 78, 89,197,181,185,197,254,106,251, 84,114,222,214,146, 90,108, 59,107, 49, 13, 19,
+ 42, 37, 92,214, 5, 37, 39, 29,227,183, 24,211,221, 37, 91, 25,108, 42,152, 77, 79, 23,219, 86, 95,116,149,245,193,140, 31,128,
+ 93,118,155,230, 77, 69, 85, 91, 60,232, 15,129, 80,125,242, 71,215,251,186,214,252,148,186,105,107,184,110, 99,127,230,186,137,
+165,193, 87, 2, 56,110,106,100, 93, 71,126,102,200,234, 59,229, 70,245,108,143,116,211, 25, 52,125,151,169, 4, 54,187, 81,190,
+106,229,141, 66,201,100,181, 23, 96,173, 7,181, 92,132, 20,251,153,109, 52,183, 34,165, 45,247,188,239,205, 53,155,228,237,219,
+ 87,106,201,147,115,213,123,177,157, 74,247,173,133,135, 78, 74,100, 52, 47,110,157,180,174,200, 73, 38, 17, 89, 11, 80,214,206,
+188,209, 66,155,221,180,253,204,205,198,205,138,236, 54,206,194, 90, 15,215, 83,214,250,126,124,163,151,237, 19,216, 54,136,192,
+142,251,222, 68, 83, 59, 63,228, 86, 85,214,171, 81, 75,163,163,181,247,225,238,246,132,239,190,115,176, 73,131, 78,200,224, 16,
+ 28, 30,230,117,195,254,105, 6,182, 16,172, 34,166,105,232,239,230, 50,207, 61,250,112,240, 22, 73, 33, 38, 86,147,133,108, 97,
+100, 24, 76, 7, 77,215,226,132,255,237,127,249,119,176,117, 69, 24, 2,170,149, 23, 36,232, 12, 38,169,125,194, 21, 11,103, 1,
+231, 54, 90, 91, 67,205,157, 78, 7,252,235,191,252, 37,254,246,239,254, 99,143, 75, 44,185,200,110, 89, 15, 82,176, 92,244, 69,
+ 59,241,189,240,162,116,225,155, 30,188,117, 27,171, 93, 13,195,184,234,212,105,191, 7,170, 29,229,204,125, 4,182, 29, 6,189,
+179,111, 81,185, 10,161,233,128, 24,162,110, 49,105, 62,204,166, 4,134, 33, 88,178,221, 81,103,189, 3, 52,123,122, 79, 42,106,
+202,207,170, 93,189,177, 91,183,221,133,131,170,184,111, 78,133,134,158,188,189,185,197,187,183,175,241,250,213, 11, 33,189,253,
+ 96, 34,161,180,183,182,207,251, 76,199,209,241,195,251, 24,217,202, 56, 78, 35,158,227,172, 64, 17, 73,173, 74, 73, 46,204,154,
+101,119,203, 36,113,159,214, 56, 56,235,113,123,247, 26,195, 48,224,211,199,111,122,246, 59, 85, 29, 23, 15, 71, 28, 78,183, 56,
+ 28,239,113, 89,223, 35,120,139,247, 95,253, 35,254,171,127,243,223,225,235,175,191,194, 79,255,226,167,248,244,233, 35, 46,243,
+130,219, 55, 63,194,225,238, 37,190,254,237,255,139,180, 68,184,233,128,146, 11, 74,205,112,206, 73,152,137, 78, 59, 78,135, 9,
+139, 53,168, 85,113,163, 97, 64, 90, 23,144, 49,152,231, 25,198, 72,182, 65, 8, 78, 70,194, 36, 19, 9,231,253,110,252, 41,123,
+ 59, 99, 29,114, 76, 72,165,192, 89,143, 16, 28,226,178,224, 48,138,181,230,124, 57, 35,231,130,113, 58, 96, 89, 86,153, 34, 40,
+ 16,197,121,135,154, 88,210,214,114,217, 38, 38, 4, 80, 41, 82, 88,171,143,122, 89,150,222, 77, 95,230, 21, 47,238,110, 4,210,
+162,239, 79, 19,101,229,156, 65, 58,150,183,214,192, 91,163,159, 31, 33,212,157, 78, 55, 96, 84, 56,231,113, 58,158, 68,212,186,
+174, 72, 73,118,193,237, 82,205,204, 18,209, 90, 25,159, 30,159,251,115,212,192, 76, 50,173,112,136,169,116, 78,186, 8,223, 6,
+ 73,180,180,174, 59, 74, 82, 92,123,225, 89, 82,194,233, 78, 46,116, 98,225,234, 59,231, 17, 74, 5, 7,177,204, 85,150,201, 0,
+152, 49, 14, 65,224, 74, 36,212, 74,231, 76,191,244, 83, 46, 56, 29, 38,148, 82,240,188,234,212,142, 8,135,224, 58, 97,205, 59,
+135,224,156, 52, 32, 69, 38,155,206, 24,172,186,174,168, 44, 94,123,168,118,167, 48,195, 27, 66, 98,198, 96,157,170,208,185,239,
+230,179, 70,141, 26,165,154, 57, 23,224, 57,195,196, 21,156,147,166,252,201,196, 10,134,213,166,101,186,125,179,157,229, 29,172,
+194,155,103, 93, 18,183,174, 85,188,187, 32,202,171,156,200, 54, 88,223,208,214,216, 5, 78,109,244,181,157, 18,119, 43, 4,104,
+ 99,209, 87,205, 21,105,130,108,222, 11,104,181,203,102,222,156,226, 13,244,213, 21,239,172,176,176, 29, 37,110,155, 66,238,213,
+238,232, 0, 25, 34,177, 56,183, 92,143,118,199, 72,200,148,217, 44, 97, 32,212, 28, 5,101,205, 86, 39,178, 86, 45,182,251,245,
+ 4, 93, 9,127,133,133, 79,120,253,234, 69,119, 16, 65,221, 33,205,162,104,173, 83, 32, 27,250,106,205,251,160, 71,126, 27, 39,
+ 10, 58,182, 79, 33, 32,133, 68,209,224, 33, 77,126,233,107,206,230,152,146,162,196,169, 79,253,179,176,144, 10,254, 44, 78,245,
+179,212,176,157, 32,174,225,253,122, 55,138, 93, 32,201,158, 27,222,126, 79,147,226,233,152,196,104,240, 66,173,242, 3,204,235,
+170, 80,146,140, 90,133,158, 85, 13,193, 14, 1,227, 56,136,234, 54,136, 95,111, 89, 46, 24,181,248, 40, 44,184,209,166,154,150,
+182,191,194,122, 3, 11, 0, 14,248,249,191,254, 47,241,211, 95,254,167,248, 63,254,247,255, 21,156, 43, 12, 85,120, 29,145, 26,
+222,160, 41,201,106, 69, 73, 6,145, 1,231,109,135,234, 19, 73,102,249,175,254,229,207,240,233,225, 9, 95,125,253, 13,138, 17,
+ 69,168, 49,180, 11, 27,208, 52,186,202,221, 10,199,186,227, 99,152,171,224,156,246, 0,180, 55,167, 85,205,212,201, 69,102,211,
+ 41,208,206,111,174,106, 76,236,212,243, 76, 91,119,208,157, 7, 44, 66,143,150,104,213,161, 11,125,109, 64,240,222,169,202, 86,
+ 59, 22,133, 42, 88,221,241,144,142,248,140, 78, 68,108,251,192,153, 13,186, 35,255, 77, 82,244,110,111,110,241,229,187,183,120,
+249,242, 94, 66, 66,218,231, 66, 15, 92, 65,111,238,136,124,188,137,107,184,131,125,168, 11,246,174, 48, 16, 58,210,143, 41, 9,
+ 98, 17, 98, 97,236, 57,244,181,192,178, 76,121, 44, 24,235,154,180,130,111, 33, 57, 22,247, 47,191,192,253,139,123,252,246,239,
+254,159, 62,150, 7,100,151, 23,198, 35, 74, 74,184, 60,125, 64, 74, 17,203, 26,241,227, 55, 63,193,223,255,253,111,240,252,240,
+ 17,191,251,135, 95, 99,125,254,132,159,254,242,191,192,235,119, 63, 70, 14, 35,134,241,128,188,158, 17,215, 21,195, 48, 98, 26,
+ 92,103,107, 91, 99, 16,215, 40,157,131, 53, 96, 22, 0, 75,205, 98, 33,243,134,224,131, 7,193,104, 23, 32,135,142,116,103, 91,
+224, 71,201,172,204,114, 39, 81,175,227,132,192, 21,231,243, 12,176, 40,105,171, 53,240,214, 10, 35,125,149,244,184, 53, 51, 30,
+ 47, 51,156,147, 61,185,100,183,139, 64,109, 28,164, 72, 62,159,207,176,198, 72, 0,139,181, 88, 82,132, 97,201, 91, 88,150, 69,
+186,245,195, 40,175,175,181, 40, 49, 34, 21, 70, 65, 22,239,118,112,152,151,136,224,101,133,146, 74,134, 41, 18,235, 90, 42,227,
+ 89,161, 64,169, 77, 20, 98, 66, 92, 87,233,124, 74, 65, 85, 29,141,113, 30, 65,227, 71, 31,233, 65,195, 85, 2,214,152, 48, 56,
+139,113, 24,100, 68,175,227,234,105,146, 64,153,210, 96, 87, 85,178,228,215,117,133,119, 2, 30, 90,150, 5,211, 52,105,135, 40,
+222,246,102,159, 10, 65, 82,239,194, 16, 48, 12, 3,190,251,254, 59,140, 67, 80, 11, 30,117,132,103,214,184, 99, 73, 23,147,149,
+225, 31, 62, 60,246,226,134, 12, 97, 10, 78,200,148,160, 30,208,210,206, 76,107,141, 88,230,122,199,189,173, 46,101, 21,224, 53,
+ 67,222,116, 14, 68,211,202,212,134,170, 53, 70, 12, 98, 36,182,202,146, 19, 12,196,122,150, 10,235,103, 69,236, 97,198,146,146,
+241,168,251,191,171,130,163,182,149, 33,245,209,126, 35, 94, 54,113,108,195,110, 16,109,180,179,158, 39,222, 46,227,186,209, 30,
+ 55,216, 11,119,190,197, 94, 16,187,233,131, 20,146,133, 77,188,214,126,206,193,251,157,170,125,199, 85,223,127, 79,216, 11,232,
+126,120,121, 91, 67, 59,210, 28,117,177, 48,104, 83,184,147,130,214, 88, 17,178,109,135,223, 38, 39,165,230,173,136,128,219,206,
+ 57,150,166,135,106,197,158,214, 77,186, 82,148, 9,154,147, 92, 18,117,210,228,148,177, 92, 46,178,118,117,174,115, 32,226, 26,
+117,170,102,116,221,156,123,116, 45, 65,180,100,109,172,111,119, 83, 13,168,222,132, 88, 33,100,157,138,105, 65,186,190, 36,244,
+ 64, 23,110,129,170, 93, 69,189, 9,184,218,142,125, 23, 52,182,251,160,244, 34, 79,247,127,220,179,134,209,171,146, 94,103,243,
+ 94,144,197,120,113,127,139,168,225, 21, 68,178, 3,183, 86,242,142,247,137, 58,141, 26, 5, 54,136,235, 42,163,145, 53, 98,178,
+ 70, 19,192,132, 65,110, 27,156,223, 26,148,202, 24, 12,228,129,116, 22,255,244, 55,255, 55,126,251,215,255,151,252,217, 93,117,
+ 8, 2, 44, 8,163, 21, 88, 73, 2, 96, 43, 99, 41,242,193, 60,157, 78,253,195, 85, 89, 3, 96, 64,184,191, 59,225,213,139, 95,
+225,111,126,253, 15,112, 46,203,174,189,170,237, 13, 93,109,214,161, 3, 18,107,106, 59,180,165, 63, 42, 21,125,148, 83,247,150,
+151, 6, 80,216, 35, 97,121,167, 98,223, 17,231,104,127,139,239, 22,248,100,118, 99,113, 99, 97, 76,221,168,113,134,118,170,114,
+129,240, 48,116,140, 99,108,255,154,125, 55,213,119,243,212,197, 28,206, 75,231,213, 59,240, 16, 58,172,162,237,134, 74, 41, 61,
+231, 24,181,106,204,225,118, 85,203, 68,129,175, 14,178,150,198, 46, 15,223,102,116,103, 29, 57,145, 53,248,244,241, 9, 57,174,
+ 24, 28,225, 67,202,240, 54,192,176,160, 49,141, 53,120,190,136, 64,140,172, 1,167, 34,227,108,245, 38, 15,131, 71, 8, 65,139,
+ 10,113, 77, 72,225, 75,178, 71,190, 60,168,221,173,194,250, 1,247, 47,223, 98, 58, 28,241,205, 87,255,132,248,248, 61,156,117,
+120,122,255, 39,252,248,103,255, 18, 92, 43, 92, 24, 48,159, 31, 64,198,131, 74,133, 15, 6, 41, 85, 68,151,225,201,246,196,182,
+167, 57, 98,176,132, 88, 42,152, 53, 41,174,180, 48, 31,131,105,244,106,233, 1,106,138, 42,212,146, 81,109, 8, 3,188,218,174,
+104,145,139,166,251,213, 83,193,241,112, 80, 62,123, 2, 21, 65,119, 6, 0,135,227, 17, 94, 47,249, 24,147,164,167,169,109, 11,
+100, 36,148, 70,153,237, 34, 6,202, 93, 80, 86, 74, 65, 90, 22,220, 28, 15,112, 78,144,184,134, 68, 97,111, 76,197,241,112,144,
+209,111,201, 93,161,203, 61, 32,198, 98, 94,146,144, 4,189,112,230, 7,117,144, 16,100, 44, 89, 25,125,191, 60,142, 19, 64,192,
+ 48,140,210,181,151,130,113,144,247, 40, 56,177,240,192, 24, 12, 62, 96, 94,102, 76,211, 1,207,231, 51, 82,150,226,196,238, 14,
+181,195, 52,244, 98, 40,132, 32, 2,186,148,224, 26,195,192,112,135, 54,141,195,160, 46,132, 11, 44, 9, 77,141,185,246,148, 70,
+ 73,179,147, 98,108, 89, 35,198,193,227, 28,101,253, 80,245,178,189,155, 66,135, 46,181, 73, 33,243,182,254,232,217,221,106,225,
+108,163,104,215,114,202,119, 5,125, 99,171,183,176,155, 90,165,105,177, 26, 95,155, 75, 70,140, 75,183,143,122, 99,144,201, 32,
+117, 71,141,122,197,185, 57,107,164, 17, 97,146,247,215,135, 32,113,211, 57, 43, 11, 67,175,245,122,189,199,110,231, 9, 95,141,
+223, 27,171,132,123, 65,112, 61,174, 55, 59, 29,125, 99,177,213,173,123,223,125,181, 14,150,214,202,222,170,198, 0, 36,234,240,
+206, 52,191,162,200,209,149,203,232,138,219,222, 38,162, 93,175, 67,186,155,111, 32,145,189, 88,144,174,208,177,109,202, 8, 50,
+234, 30, 18, 13, 66, 67,134,183, 53,131, 49,232, 2,202, 46,234, 85, 65,176, 49,132,187,187,155, 46,254,149,203, 91,118,241, 33,
+ 12, 34,170, 75,226,146,136,203, 34, 8, 94,235,182,112,180, 90, 97,189,133,117,109, 77, 34, 29, 58, 87,222,156, 12,204,187,149,
+136, 72,251, 37, 53,210, 43,204, 73, 11, 79,238,135,106, 75, 94,231, 93,164, 42,111,126,102,222, 8,246,181, 37, 11,181,220,245,
+ 10, 84, 18, 25,126, 27, 19,247,241, 61,239, 59,123,116,186, 16, 19,225,229,139, 27,124,248,240, 81, 14, 34,221, 77,149, 34, 32,
+139,105,156, 68,112, 68,132,160,106, 82, 99,100,132,108,141,145, 93,228, 52,192,235,139,192, 32,100, 38,112,169,176, 90,137, 22,
+102,112, 97,248, 32,111, 88, 45, 81, 31,102,116, 42,149, 49, 50,150, 33, 34,233, 22,200,128, 81, 17,107,129, 13, 22,222,187,237,
+ 50, 85,118,115,243, 96,150, 90,241,171, 95,252, 12,159, 30,159,240,205, 55,127,198, 26, 99, 7,191,108,226, 55,131, 90,212,187,
+249, 25,212,128,181,163,111, 89,194,178, 71,173,159,173, 59,180,154, 68,189, 26,147,181, 70,189, 22,238, 74,246, 38,252,232, 54,
+ 15, 77, 13, 18,159,166,235, 12,246, 43,196, 98,219, 85,169, 10,125,179, 90,152,110, 29, 52, 70, 70,232,227, 56,226,213,203, 23,
+120,247,230,149,134, 99, 96,215,121, 80, 23, 84,217,141, 89,209,119,117, 76, 66,211, 99,162, 45,187,158, 55, 75, 73,243,145,247,
+125, 32,147,190,102, 87,146,254, 62, 65,202, 57,129,184,226, 48, 14,184, 61, 29, 65, 69,168, 86,177, 36,137,220,101,198, 82, 74,
+ 15,158, 65,173,176, 78, 42,234, 63,253,225,119,112,254, 0, 50, 14, 40, 9,213,168, 71,128,129, 24,103,164,143,223, 42,150,209,
+ 33, 12, 19, 82, 74,136,159, 62, 96, 61, 63, 32,151,130, 97, 58,192, 56,143,245,114, 65, 74, 43,214,229, 2, 99, 28,142, 83,192,
+156, 34,150,165,136,186, 59, 37, 20, 54, 90, 68,120,156, 12,227, 60, 47,112,198, 98, 94, 35,192, 5, 38,200, 88, 22,100,212,179,
+154,101, 74, 98, 12,160, 24, 92,231,188, 22, 28, 50,138, 46, 32,245,186,171,240, 70, 15,216,154,146,142,195, 11, 96, 12,150, 40,
+168,201,117, 93,113,185, 72,215, 75, 12, 60, 93, 22, 56,103,113, 51,141, 10,136, 73,240, 62, 96, 89, 37,106,181,137, 60,107, 45,
+ 56, 4, 15,104,135,233,140,133,113, 22, 41, 85, 56, 39, 43, 13, 99, 45,156,210,207, 42, 51, 98, 41, 56,141, 83,215,153,172,107,
+196,141, 22, 28,177, 84, 44,243,130,219,211, 13, 74, 45, 34,234,155, 38,245, 62, 39, 28, 14, 7, 20,174,136, 41,169,151, 92, 14,
+ 69,175, 93, 78, 8, 65, 20,251,214, 97, 93, 22,140, 97, 0, 81,194, 16, 6,249,124, 25,210,248,212, 11,130,115,130,225, 13, 1,
+151,203, 69,179,237, 1, 88,211, 93, 53,195, 48,224,227,135,143,176,214,104, 0,206,134,228,100,180, 0, 15, 57, 88,115, 46,152,
+ 6,185,188,191,127,120,236,209,201,110, 87, 28,123,239,228,125, 83, 27, 85,202, 25, 99,240, 87,233,135,185, 84,140, 97, 75,153,
+148, 80,165, 2, 3,131,168,159,215,102,109, 75, 89,172,122,107,170,178, 78,204, 25,231,101,193, 96, 13,230,168,123, 94,107,224,
+157,116,133,237,226,106, 46, 23,153, 62, 25,144,145,134,136,245,156,113,206,195,218,164,241,195, 27,249,141,182,124, 86, 73,220,
+220,117,210, 29,232,210, 57,172,124,229,142, 2, 95,239,225,251,121,223,129,155,123,207,185, 62,223, 58,191,119,164, 23,153,254,
+221,198,218,126, 62,246, 11,123, 3,164,232,217,198,215,110, 26,124,206, 65,111, 93,186,217, 69,177,210,174, 43, 87,141,150, 49,
+ 87,209,172,220,154, 85,227,118,171,136,205, 19,111,140,237, 9,120, 29, 46,100,165, 72,254,242,139, 55,176,222,131,139,144, 46,
+ 99, 92, 55,208, 77, 45,224, 90,144, 98, 18, 23, 76, 8, 50,142,111,122, 44, 0,206, 7, 56,221,231,151,162, 16, 56,109,150, 91,
+ 96,209,150, 66,167, 90, 41,107,251,235, 85,213, 57,225, 58,176,132,182, 42,160, 54,224, 73,207,220,174, 29, 42,211,198, 33, 85,
+ 61,139,181,126,102,121,235, 82,251,141, 32, 38, 23,127,147,126, 16, 80,169, 99, 69,173, 19,163,125, 45,219, 94,196, 90,131,148,
+ 86, 76,225,136,211,233,136,211,225, 0,160, 42, 27, 89,186, 95, 99,229,242,181,198,109, 56, 82, 0,197,144, 80,162, 44,161,194,
+194,146, 86,176, 45,146,177,145,211,180, 99, 48, 76,200, 96, 56, 45, 2, 26, 11, 60, 22,198, 4,224, 48, 14,253,146, 81, 33,171,
+ 86,142, 27, 2,245,254,246,132,151,119,183,248,187,127,248, 29, 82, 92, 17, 83,148,203,188,138,120,206, 24, 97, 43,181,234,185,
+ 2,178, 55,209,139,176, 91,198,120,123,136,154, 0,131,118, 26,185, 45,204,100,227,242, 27,179,181,246, 13, 58,113, 21, 45,216,
+149,184,166, 7, 40,116,200, 12,182,241, 81,251,144, 67, 99, 56,125, 8,184,189,189,193, 23,111,223,224,254,238,102,179,238, 53,
+ 24, 80,135,219,136,188,210,240,198,109,174,100,117,116, 71,219,216,205,112, 15, 35,104, 59, 24,218,239,204,121, 35, 21,210,110,
+220,199, 90, 4, 82,109,252, 43, 61,180,152,181,120, 96,188,184, 61,225,155,111,255, 12,103, 8,161,123, 54, 89,139,194,173,240,
+ 0, 8,203,122,193,143,127,246,159,169,111, 92, 10, 35,177, 81, 74,135,234,108, 59,132, 7,228,252, 4, 83, 42,172,115, 40,181,
+226, 39,255,201,191,194, 87,191,253, 43,252,139,191,252,175, 49, 28,111, 48, 29,142,248,167,191,255,247,152,231, 25, 83,112,168,
+ 12,220,157,238, 64,168, 24,188, 19,191,115, 76,184, 36,139,232, 12, 98,150,145,217, 37,103,220,221,156, 4, 60,146, 98,183, 89,
+101,146, 84,192,118,121, 88,125,184, 75,149, 66,215, 7,217,191, 89, 67,160,224,133, 18, 87,178,138,194, 36,162,210,123, 18, 69,
+126,150,137,201,211,227, 19, 46,203, 2, 31,130,104, 13,200, 96, 26,156, 92,240, 68,120, 58,159, 69,172,102,164,235, 44,181,194,
+ 91, 9,102,105,161, 46,222,139,162,188, 77, 54,172,209,188,251,146, 49,141, 35, 24, 78,194, 94,158,158,112,156, 38, 28,166, 17,
+207,207,103,217, 21,135, 32,112, 28, 72,230,249,253,120,131,203,188,192,184, 0,239, 29,214, 36,151,232,221,221, 9, 62, 4,217,
+123, 15,140,115, 22,190,188,247, 10, 28, 50, 6,235,186, 74, 65,207, 5,163, 31,177, 38,193,205, 94,214, 21, 94,149,199,232, 43,
+ 43, 22, 49,220,178,168, 7,223,232,116,128,187,165, 52,197, 36, 72,210,146, 49, 47, 43, 6,253,239,222, 10,214,153,153, 81, 21,
+153, 91, 85, 20,245,199,247, 15,219, 25,105, 12,142, 99,208, 61,183, 85, 72,143,193,160,129, 45,206,154,238, 42,217,138,248, 13,
+148, 3, 0, 57, 55, 84,106,130,209, 9, 99, 81,107,222,154,244,117,174, 21,231,121,193,224, 84, 60,165, 34,176,172,183,166, 53,
+ 22,134, 36,247,162, 57,112,138,238,117,201,144, 8,196,244,244,173,181, 32,132, 1,195, 48, 96,105,150,220, 70,254,220, 17, 66,
+141,174,224,168,111,207, 89, 70,214,168,187, 8,106,254, 1,107, 93, 10,137,218, 67,175, 54,220, 27, 58,216,140,118,225, 96,204,
+192, 48,134, 29,176,170,238, 68,114,187, 32,171, 29, 10,111, 15,145,185, 98, 99, 52, 97, 47,153, 77, 9,223,214,159,188, 83,255,
+211,214,205,139,237, 22,170,125,145,179,163, 48,119,196, 47,171, 37,176,171,242,245,172,108,231,160, 0,178, 8, 97, 8,184,189,
+187, 1, 23,249, 60,181, 11,221,134,112,229, 64, 98,174,112,222, 99, 28,167,174,113, 72,177,116, 22, 74,251,119, 85,225, 60, 85,
+139,185,170,107,209,253,132,160,117,230,164, 83,157, 82, 4, 82,227,176,235, 0,219, 37,220, 40,115,178, 63,169, 26,197, 90,183,
+192,120,218, 95,236,212, 71, 44, 12, 65,206, 86,186,234, 73, 55, 98, 81, 71, 8, 54,177, 93,197, 23,111, 95,227,119,191, 95, 81,
+ 76, 6,179,233,157,164,247, 30,135,105, 4,231, 12,239, 45, 8, 34, 60, 1, 1,231,115,132,215, 80,151, 92, 55,172,166, 81,209,
+155, 39,185, 92,150,148,224,130,140,215,168,202,168,179,125,146, 90, 44, 95,227,204, 23, 0,133,165,155, 40,117,243,108, 7,239,
+126, 16, 42,242,195,120, 84, 41, 8,126,241,243,159,226,225,225, 17,127,250,230, 59,233,164,244,141, 20,184, 72,149,105, 1, 23,
+ 88, 99, 53,212,132,174,146,140,218,152,214, 24,222,233, 20,176, 85,165,189,215,231,221,120, 74,199, 75,116, 29, 73,104,126,224,
+ 9,151, 46,149,168,108, 42,216,102,223,176, 14,211, 56,226,205,235, 87,120,243,250, 37,188,119,155, 63,180,249,241,247,106,212,
+202, 87, 10,212,134,187,220,242, 36,246, 24,162, 70,199,193,245,184,110,187,219, 55,138,252, 14,181,219,129, 60,187, 67,160,237,
+ 47,159, 47, 75, 87,143,135, 97, 0,101, 96, 77, 25,213, 18, 14,193,227,188,204, 98, 28,225,141,242,151, 75,133,165,138,211,225,
+ 8, 67, 6, 79,143,239,213,237,129,142, 3, 21, 53,105,193,241,230, 53,230,243, 35,106,173,120,124,248,128, 15,223,127,131,251,
+151,111,112,186,125,137,255,252,223,252, 91, 76,135, 35, 94,189,124,135, 15,223,127,141, 90, 11,188,149,130,231, 48, 29,228,146,
+245, 14, 15,151, 25, 99,144,132, 54,107,229,251,115, 4,172,122,192,166, 24,197,142,233, 2,226,186, 34,132, 32, 93,154, 10, 54,
+ 11,164,219, 54, 36,222,231, 48,140,138,212, 44,152,231,185,163, 92, 5, 0,100,193, 69,172, 75,243,188, 34,151,170,216, 88,181,
+ 15,198, 36, 43, 42,239, 20,113, 44,249,225,196, 34, 60,179, 26,224, 49,132,160, 43,147,138, 97, 24,118,164, 33,234, 98, 78, 67,
+ 4, 63, 4,132, 97, 64, 92, 69, 49,127, 58,221,232,216, 93, 68, 93, 89,133, 62,131,247, 34, 14,213,113,178,119, 30,203,178,226,
+230,120,194,154, 34, 82,145,221,117, 83,136,187, 90, 17,215, 85, 55, 53, 82,196, 59,235, 5,203,170,157, 47,156,116,217,205,243,
+159,153, 96, 81,177,198, 54,101,168,189, 69,124,120,122, 22, 96,139,186, 11, 82,138, 50,245, 40, 9,217, 0,243,178,246,209,230,
+233, 48,202,247,168, 65, 59,214,200, 40, 89,254,156,224,131, 31,180, 80,145,100, 47,131,131,119,170,176, 22,193,155,179,118,179,
+202,105,230,124,235, 50,107,143,100,150,238,186, 69, 54,103, 22,212,112, 42, 21, 30,132,152, 19, 86, 77, 64,204, 89,184,232,193,
+ 10,176,167,176,197, 33, 56, 44, 73,148,238,185,182, 80, 18, 17, 39, 86, 46, 87,104,233, 82, 43, 28, 9,248,240, 60, 58, 0, 0,
+ 32, 0, 73, 68, 65, 84,141,177, 74,234,134,168,174,139, 40,240, 99,140,160,156, 59,173,141, 13,131,170,209, 51,191, 17, 30,182,
+139,220,144,238,238,169, 21, 42,155,125, 13, 84,193,117,119,206, 55, 6, 70, 59, 59,169, 49,215, 55,220,184, 88, 9,109,247,179,
+ 95,181,161,170, 79,218,235,179,232, 51,191,249,231, 8,216,205,150, 78,253,123,236,151,181,218,142, 97,168, 39,131,238, 81,190,
+237, 76,108, 69, 85,163,248,113, 45, 42, 58,108, 78,160,173,160, 48,164,194,108, 99,241,197,187, 55,221,221,148, 82,234, 66,233,
+ 86,232, 53, 55,138, 49, 22, 97, 28, 16, 6,229, 42,232,116,183,237,219,183,239,169, 77,198,235,150,143,208,154, 51,157,204,153,
+230,142, 0, 96,116,154,197, 34, 33,219,200, 39,116, 21,199,169, 6, 55,150, 11,157,120, 27,157,108, 60,131,205,178, 85,193,122,
+161,215,206, 17,230,221, 9,126,189, 77,105, 99, 89,194, 52, 6, 56,239,144,146, 3,113, 2,152,112,154, 6, 21, 5, 89,220, 28,
+ 15, 24,148, 16, 5, 72, 28, 31,148, 75,108, 32,149, 38, 90,213, 2, 32,236,240,135, 6, 82,249,146,126, 32,123,101,172,247, 96,
+209,160, 12,195, 45,208, 94,240,162,237,235, 89,163,149,211,142,173,139, 43, 62, 48,174,196,107,204,162,234,127,249,226, 22,255,
+225,183,191, 67,140,179,134,138, 84,176,114,224, 13,153,171,252, 91,171,249,238,253,129, 39,163, 30,129,170, 76,238,218, 31, 84,
+222,249, 51,183,152,160,221, 5, 79,166,119,239,212,243,133,197, 30,101,141, 5,145, 64, 91,156,181,184,185, 57,225,203,183,111,
+112,123,123,218, 32, 9, 74,151,147, 15,151,189, 74,119, 35,252, 16, 80,164,204,138,171,239,129,119, 97, 44,155,196,134,213,157,
+105,208,184, 84, 68,220,120, 61,219,103,131,120,223, 44, 92, 23,145, 90, 60, 90, 54, 88,231, 21,156, 35, 78,135, 9,195, 16,192,
+151,138,227, 52,161, 22,177, 42, 50,203, 4,200, 48,227,146,228,181,117,202, 4,176,222, 99, 26,143,248,227,239,127,141, 33, 28,
+144,150, 71, 37,235,137,173,113, 89,207, 8,227,141, 28, 30,198,192, 84,224,219,223,255, 22, 6,192,221,139, 55,248,242,203, 31,
+ 35,165,136,223,255,227,223,226,253,251,239, 96,211, 5,193, 89, 28, 15,130, 27,205, 57, 33,229, 8,235, 6, 57,244,156, 7, 12,
+ 97, 50, 22,231,203, 5,135,224,192, 24, 52, 96,196,162,228, 5,227, 56, 97,208,177,177, 76,114, 8, 83,240, 0,137,120, 13,198,
+ 72,176,136,119,184,172, 17,105, 93,117,191, 59,180, 17,141,116,226, 57,195, 24,139,201,123, 28,198, 1,231,203,140,243,154, 48,
+232,184, 55,248, 0,242, 50, 42, 79,185,192,216,166,119, 0,124, 8, 8, 33, 72,135, 93,171, 96, 86, 85,148, 87,187, 72, 90,192,
+ 74, 57,138,205,202,168, 2,247,227,167, 79, 58, 85,144, 17,253,167,199, 39, 20,141,108, 45,149, 81, 17,213, 66, 40,221, 94, 46,
+ 18,169,233,189, 71, 76, 81,152,239,198,226,211,167, 71,184,224,144, 98, 20,180,243, 56, 34,197,132,105, 58,224,227,195, 35, 94,
+222,221,226,114,153, 59, 27, 33,132, 1, 69,109,177,119, 55, 55, 96,102,172,235, 34,144, 29, 39,211, 3,231, 44, 82, 20,107, 91,
+138, 81,198,227,128, 88,133,106, 21,199,140,181, 72, 57,117,250, 27, 85,185,168, 83,170,170,115, 33,128, 11, 62,156,151,174, 25,
+177,234,157,111,104, 90,239,172,162, 65,181, 8,239,145,171, 82, 80,122,103,123,132,103, 11, 48,169,202, 18, 16,177, 91,197, 69,
+ 51,234, 99, 18,252,237,232, 8, 79, 41,163, 24,131,227, 40,118, 61,103, 13, 38,242, 72,185, 34,101,238, 5,132,140,146, 91,200,
+181, 34,144,149, 74,103,141,197,134, 97,226,190,150,240, 10,251,225,172,205, 27, 27,185,216,217,232, 58,213,104, 3, 97,118, 16,
+172,246,124,215,173,253, 86, 46, 6, 76,221,173,202,244,247,182,121, 35,235, 5, 77, 27, 84,134, 1,140,195,120,149, 10, 74,109,
+ 93,198,251,248,230,218, 51, 31,176, 67,195,238,228,239,221,197,209,154, 53,130,144, 35,187, 46, 71, 51, 46,154,176,183,163,190,
+141,233,103, 77,209, 75, 61, 87, 6,115,146,207,174, 10,156, 65, 82,236,116, 48, 77,215, 41, 9, 16,232,205,155,215,189, 1,170,
+181,110,147, 1, 5,213,180, 2, 88, 28, 46, 67,191, 79,132, 89, 82,187,229,215,232,175,181, 54,146, 28, 80,138,235, 59,127,163,
+232, 88,168,229,187, 17,243,164,161,149, 36, 57,247, 57, 92, 0, 87,232,188,218,105, 59, 93, 0,161,130,138,214,141,233,111,211,
+ 17,201,214,118,213, 93,129,118, 77, 40,220,189,233,122,104,159,142, 71,164, 24, 69,109,106,196,203,249,147, 47,190, 64,169, 34,
+156,115,198,192,134,128, 20, 19,230,249, 9,191,249,199,223,227,103,175,239,100,180, 77, 74,142,113,170,128, 84,236,168, 33,131,
+ 69, 71, 85, 6, 6, 57, 74,162,213,156, 75, 95, 19,212, 90,193, 70,118,169,185,106,226,210,110,252,109, 20,235, 7,230, 29, 37,
+ 15, 93, 5, 79, 59,166,113, 87,158,107,254,238, 47,127,254, 23, 56,159,103,252,225, 79,223, 32, 39,221, 55,147,120,108,247, 59,
+157, 82, 90,240,139,142,206,154,208, 12,205,102,129,205,126,193, 59,144, 3,209, 21,219,125,219,251,108,164,182, 6,192, 8, 67,
+192,155, 87,175,240,246,245, 75,241, 25,171, 95,189, 21,113,109, 71,212,222,208, 43,235, 88,251,249,169,246,228,184,253,255,181,
+ 24, 86,250, 44, 88,128, 20,231, 72,123,248,144, 81, 97,160,233,185, 65,250, 0,214,173, 96,224, 45,239,239,250, 19, 89,251,235,
+159,115,146,132,189, 44,204,238, 97, 24,240,171, 95,252, 28,255,223,223,252,117, 63,104, 69, 96, 36,100, 54,106,212, 12,107, 81,
+ 75, 70,202, 17, 47, 95,255, 4,235,186, 98,189, 60,192, 90,205, 67,102,233,144, 37, 31, 91,222,151,233, 48, 98, 12, 30,143,223,
+253, 1, 15,223,253, 17,239,255,248, 27, 25,225,146, 65,205, 17,150, 10,136, 28, 82, 17,240,140, 33,131, 87, 47,238,193, 16,192,
+203,164,151,245, 57,202, 30,173,137, 16,141,181, 40, 41,225,230,238, 14, 57,174,120,122,126,214, 88, 91, 25, 57, 39, 13,160, 89,
+150, 21,228,100,199,155,214,136,184,174, 88,214,132, 41, 12, 8,193, 99,154, 14,168, 53,227,233, 60, 35,229,130,233, 48, 97, 84,
+203, 96, 24,138, 92, 46, 58,178, 31, 91,231,236,197, 19,239, 91, 39, 9, 32,198,136,101, 93, 59, 21,174,237,164,155,184,139,212,
+ 67,124,110, 99, 69,211,226, 79, 13, 12, 75, 52,235,178,174,189, 59,205, 74,126, 75,181, 40, 62, 83,138,197,183,111,222,224,233,
+124,193,209,137,175, 94, 40,108, 3, 46,235,138,241, 48,129,107, 70, 56, 76, 88,215, 21,181, 50,198,113, 64,140, 43,110, 79, 71,
+ 44, 49, 34, 4,175, 12,236, 1,151,121, 6,115, 69, 8, 3,226,186, 72,132, 46, 3,199,211, 9,227, 52, 97,157,103, 44,243,130,
+227,241,128,203,101,198,113,154,144, 98,236,232, 91,102,198, 56, 9,199, 59, 63, 63, 1,234,129, 39, 35,147, 55, 48, 35,229,138,
+195, 24,240, 15,223,124,236,227,120,144,193, 20,188, 4,123, 40, 49,206, 89, 11, 75, 34,130,107,158,125, 25,241, 23,132, 96,183,
+ 3, 28,140,152,101,188, 94,245,239,136,185, 98, 10, 78,179, 49,100,253,178,174, 17, 9,132,211, 20, 64,170,160, 63,140,178,106,
+ 44,185,224,137, 51,156, 37, 20, 54,160, 10,185,208,141,233,252,144, 86,140, 75,250, 95, 75,133,108,188, 3,233, 68,155,189, 80,
+ 88,236,215,121, 18,178,227,150, 41,109,109, 15,243,231, 29,187, 6, 97,180,147,130,218, 78,159, 90,128,203, 46, 92,197,236,205,
+236,242,161,155,134,241, 26, 25,173,147,184, 62,161,211,113,188,129,233, 83,181, 13,106,130, 13,252, 2,186,190,224, 21, 34, 35,
+ 1, 92,212,215, 70, 93, 43,100,183,233, 92,251, 89, 37,204,138,145,107, 69, 42,117,135,202,230,205, 75, 15,205,106,215, 63,107,
+ 53, 19,225,221, 59,177,200,182,117,152, 56, 16,172, 22,190, 36,147,153,181,162,164, 4,123, 60,138, 40, 87, 87,153,206, 7,137,
+ 28,143,146, 7, 97, 85,243,225,157, 5, 88,169,142,222,131,194,208,105,120,130,242,174, 59, 67, 0,109,251,118, 99,224,234,149,
+ 11,113,203,244,218,172, 70,154,217,202,205,110,213, 18,197,118,157,251,103,226,198,190, 23,249,220,252,184,255,231,157, 83,225,
+221,155, 23,120,126, 62, 43, 6, 47, 97, 73, 9,223,125,120,143, 55,175, 94,193, 88,135,195, 97, 66,101,198,255,249, 87,127,133,
+ 53,101,156, 70,121, 40,155,234,176,253,253,158, 8,222, 17, 2, 1,133, 90, 48, 13,129,173, 65,140, 73, 80,154,188,137,232, 26,
+ 21, 41,177,228,143,175,169, 96, 10, 30,207, 49, 43,164,196,245, 29,122,219,163,139,154,223,244,157, 54,179,236,229,127, 0, 85,
+ 6,112, 60, 78,248,203, 95,253, 28,127,250,230,123,124,248,248, 73, 82,170,218, 3,175,111, 80,243, 76,178,233,232,228,174,156,
+151,191,201,238,216, 48,215,226, 20,241, 79,242, 21,181,205, 24, 33,109,189,121,253, 10, 47,238, 78, 59,112,133,209, 84,180,150,
+202,167, 90,149, 90,187,157, 69, 38, 45,205, 26, 86,251,243,211, 38, 50,124, 45,245,235,193, 59,162, 95,216,138, 1,214,177,157,
+225, 62,244,147, 95,107, 69, 37,253,247,234, 53,237, 14, 0,208, 21,100, 6,251,201, 14,183, 81, 58, 97,137, 17, 84, 11,198,224,
+113,152, 6, 4,231,145,115, 66,133, 88,123, 14, 65,180, 11, 20,156,198,152, 90,148,101,149, 46,223, 5, 44,203, 69, 62, 99,243,
+ 25, 57,173,125,231,111,117,133, 81,184,224,227,251, 63, 74,178, 82, 45, 48,213,118, 44,107,208,216,205, 18,103,113, 87,120, 43,
+222,119,231,100,167, 14,194, 52, 57, 44,171,100,169, 79,211,160,246, 49, 22, 82, 27, 51, 78,199, 35,106,201, 40,181, 0, 97, 64,
+ 92, 22, 9,142, 25, 3, 74, 46, 56,142, 3,214, 53, 2, 70,212,206, 2,150,145, 0, 19,153, 28,200, 14,246,105,153, 97,149,102,
+150,114, 18,193,164, 49,240,206, 35,165, 34,162, 64,213, 2, 12, 74, 41,139, 41,105,103, 39, 1, 71, 86, 45, 78,162, 99,145,189,
+188,136,207, 36, 43,123,141, 17,222,121, 64,247,122,203,186, 10,127,125, 26, 97,176, 69, 90, 78,195,168,211, 29,131,117,141,154,
+215, 46, 95,115, 36, 96,112,190,219, 77,215,101, 1,106,193, 18, 35,140,178,185,151,101,134,119, 30,165,100, 28,198, 1,203, 50,
+203, 65, 85, 50,170,221, 10,215,227, 52,245,100,180, 54,226,228,146, 37,205, 14,194, 87,152,198, 17, 37,103, 60, 63, 61, 98, 89,
+ 68,136,119, 62,207, 24,134,128,152,229,125,124,255,241, 1,119,183,183,146,115, 29,196, 2, 71,214,130, 75,145, 68, 52, 22,138,
+ 31,140,197,224, 25, 95,189,127, 68,229,138, 84, 10,200, 24, 76,206,246, 20, 51, 67,146, 45,209,116, 38,214, 10,194,154, 73,118,
+165, 70,207, 21, 3, 97, 97,228,156, 81,170,188,190, 2,223,145,231, 51, 22,189,204, 83,134, 1,112, 28, 61,162,138,243,188,145,
+231,203, 54,223,179,126, 94,157, 49,136, 36,141, 16,179,145, 56,215,106, 58, 94,151,171, 38,124, 85,134,109, 54, 55,229,185, 39,
+205,154, 63, 30, 14, 29,142,211,200,141, 27,210,149,180, 1, 39,113, 12,212,237, 98, 39,170,170,212, 85,109, 85, 59,103,118,231,
+ 17,239,115,158,249, 26,101, 99, 44,117,170,222,214,253,154, 43, 72, 89, 3,172, 52,101,125, 55,198,183,254, 95,199,225,253,242,
+ 52, 91, 62,253,246,207, 22,196, 34,128, 54, 86,165,165,116, 61,198,110,226,239, 92, 25,107, 46,221, 89,208, 55, 7,166,121,195,
+140,106,164,204,214,165,123,143,151, 47, 95, 32,165, 40,180,183, 13,181,186,155, 30, 80, 23,222,118,236, 79, 43, 58, 44,245,142,
+ 60, 46, 17, 23,158,113, 60, 28,224,189,219,237,249,155,205,176,104, 17, 86, 58, 22, 22, 32,112, 17,177,151, 76, 13, 60,220, 6,
+ 31,226,207,130, 57,174,119,166,188,247, 72,215,214, 93, 81, 71,112,214, 30,224,114, 13, 43,192,110,156,218,191,228,190,125,215,
+175,253,163, 47,223,226,171, 63,125,171, 29, 98,193,247, 15,207,248,238,227, 99, 95, 7, 52, 70, 48, 17, 33, 88,221,231, 24,183,
+237, 23,172,129,183,132,209, 89, 24, 0,107, 46,152, 83, 69,176, 4,235, 3, 42,150, 93,244,167,154,250, 33,214, 20,163,163, 23,
+168, 8,175, 81,216,164,147,217,249, 52,245, 3,181,161, 97, 63,239, 41,175, 51,229, 27,252,226,139,183,175,240,227, 47, 94,227,
+171,175,191,199,199,135, 7,229, 59,151,107,140, 98, 23,187,109, 59,100, 96,143, 48,220,234, 34,179,179, 97, 12,195,128,187,155,
+ 27,188,122,117,175, 22,160,205,135, 82,153, 97,138,236, 52,219, 39,183,241,229, 59,228,165, 5,199, 84,238, 28,138,158, 96,103,
+169,239,200,171,161, 31,214,103,237,137, 16,118,100, 87,195,115, 37, 80,239,202,101,170, 97,140, 92,228,134,106,183,241,113, 15,
+ 46,160,238,149,109,142,137,207,121,244,173,152,159, 47, 51, 12, 23, 48, 44,158,158,207,120,251,250,149,208,253,152,241,197,155,
+ 55,120,252, 40, 8,224, 20,147,116, 42, 81,173, 59,165,160,164,136,195,237, 29,222,127,247, 39,156,207,143,152,207, 15, 42,150,
+161,110,187, 99,168, 13, 18,208,149, 5,163,112,193,104,157, 98, 96, 13,144, 45, 6, 47, 69,196,141,122,160,157, 31,100,244, 30,
+ 19, 14,199, 35, 82, 21, 70,179, 37, 40, 45,206,226,116, 28,225,188, 69, 6,227,120, 56,162, 84,198,188,138, 32,109, 89, 23,216,
+193, 98,142,171,138, 16,245,144,173, 12,235,165,184,124,124,126,194,211,249,172,135,130,199,228, 3,124, 24,177,150, 2,152,130,
+195, 56,117,108,171, 49, 65,213,243, 14,222,121, 48,147, 10, 56, 55,188,113, 74, 89,161, 55,178, 75,191,187,187,195,170,221,122,
+103, 92, 55,171, 81, 22, 12,172, 68,144, 10,224, 7,202, 50,104, 65, 23,151,101, 70, 97, 73,253,131, 10,215,150,121, 75, 24,243,
+206,225,241, 50,227,241,233, 9,183,135, 3, 98,201,120,158,103, 76,195, 8, 31, 60,114, 41, 56,159,207,138,189, 77, 24,130, 67,
+201, 50, 49,241, 97,192,162, 4,185, 24, 5,220, 81, 75,222,146, 30,201,194, 48, 96,181, 56, 72, 49,195,186,198,226,150,238, 7,
+ 44,137,104,211, 48,106,162,153,235, 66,168,113, 24,176, 46, 11,156,147, 84, 52, 11,249,245,113, 77, 56,175, 73,113,171, 4,111,
+ 36, 27, 94, 82,180,104, 75, 53, 84,111,118, 74,185,167, 84,198,164,187,121,174, 40, 85,198,245,243, 42, 5,221,224, 44, 18, 75,
+119, 59,141, 65, 63,231, 21,199,193,117, 75,217,105, 28, 52, 19, 65,220, 47, 45,181, 82,242,231,229,115, 75,105, 15,109,145, 17,
+177,133,237,151,225,214,173,183,157,190, 17,225,174, 78,163,198, 97, 20,166,121, 41, 72,188,131,198,240,110,205,103, 0,211,196,
+174,181,117,205,250, 61, 25,234, 90, 24, 2,116,242,185,133, 83, 81, 39, 96,162,239,195, 9,132,163, 58, 36,168,167, 92,110, 19,
+ 73,110,233, 95, 45,103, 99, 95, 28,236, 96, 88,109, 5,100,148, 0,216, 59,119, 29,195,183,132,114, 99,173,146,254,244, 61,163,
+237,125, 3, 72,104,162, 69, 4,210,185,148,206, 10, 96,253,123,184, 51, 65,208,133,220, 86,201,153,175, 95,189, 0, 1, 88,230,
+185,151, 44,198,154, 93,231, 42,191, 10, 46,214, 33,198, 4,239, 83,231,196, 27, 3, 9,139, 57, 30, 5, 52,148,178,104, 71,244,
+192,171,106,141,235, 34, 97, 77, 12,132, 58,155,186, 59, 74,217, 35, 57, 39,184,237,114,165, 62, 43,223,160, 3,255,204,197,220,
+137, 65,125,104, 42,191,214,107,255,225,126,212,190, 1,253,119,114,238,174,104,150,223, 63, 14, 3, 94,189,186,199,247,239, 63,
+138, 88, 6,221,213,212,211,129,106,169, 56, 77, 3,110,166, 97,135, 0,148,174,214, 25, 35,169,107, 0,140, 5,226,170, 59, 81,
+219, 64,255,232, 99,226, 13, 26,160, 99,218, 10,100,221,231, 86,141, 38, 53,134, 52, 84, 66,190, 9,106, 43, 9,194, 53, 71,125,
+ 47,161, 83,107,200,213, 26, 67,187,221, 90,129, 47,223,189,194,143,191,124,141,167,243,140,111,191,251,128,203,101,214,135,171,
+108, 66,177,157,182,164,129, 99, 26,204, 38,132,128,155,155, 35, 94,222,221, 98,154,134, 14,168,105,159,245, 82, 85,197,218,188,
+164, 77, 32,162,251,242,174,226, 7, 64,205,174, 66,144,212,183,157,168,172,195,113,216,110, 21, 33,155,107,203,138,218, 63,154,
+ 43, 96,251, 52,160, 91,200,184, 9,242, 64,221, 2,196,220,178,231,154,176, 6,215,235, 28,222,168, 81,124, 5,168,108,139,175,
+138, 49, 56, 16,106,223, 41,223,223,223,225,195,135,143,120,121,127,135,175,191,249, 6, 83, 16,175,113, 76, 25,134,172,118,221,
+ 98,181,123,122,252, 14,228, 2, 46,151, 7,177,106,169, 70,162,212, 10,103,148,216, 53,157,176,204,207,138,133,100, 12, 65,186,
+ 38, 7,224,252,244,136,105, 12, 40, 5,184,191, 57,118,178, 90, 79,254, 11, 35,142,199, 83, 79,116,203,133,213,170,168, 42,234,
+ 82,213,243, 45,130,183, 97, 24, 48, 78,147,162,129, 37, 28, 98,212,206,183,214,138, 37, 9, 23,189,148,138, 24, 19, 14,195,128,
+ 92, 43,134, 97,194,232, 29,214,117,198,105, 58, 32,151,132, 75, 20, 4,234,232, 61,198, 73,162, 30, 47,243,140,117, 89,177,198,
+164,123,117, 15,239,228, 98,108, 9,104,109, 92,252,233,211,167, 78,208, 18, 66,150, 48,209,163, 50,170,201,200,244,138,192, 72,
+ 10,214,201, 21,184,187, 59,225,249,233,185,143, 2,187, 56,168, 50,252, 48, 8, 16, 72, 73,132,222, 57,220, 28, 38,197,130, 58,
+ 28,167, 17, 12,234,128, 30, 89, 31, 49, 14,211,120,181, 70,146,213,156,216, 67, 11, 23, 17,164, 89, 11, 99,183,160,165,224,125,
+135,122, 16,184,227, 86,189,247,152,151, 5,135,113, 68,226,138, 28, 51,178,119,194,210,175, 21,195, 16,250,123,209,220, 59, 45,
+ 87,252,235,143, 79, 87, 13,142,183,102,151, 91,160, 98, 52, 22,251,160,181,114,240, 11,111, 67, 62, 83, 75,202,114,129,231,130,
+156, 27,106,148,144, 43, 99, 10,161,219, 47, 14,222,194, 90, 82, 26,220, 6,139, 17,223,121,149, 46, 93, 3,171,140, 22, 10,114,
+153, 17,114, 69,111,120,100,223,207,144, 76,157,182, 11,215, 85, 84,103,171,203,215,143, 41, 41,107,226, 70,222,227, 90, 81,202,
+142, 98, 73,245,179,134, 76,138,117,170,155, 31,189, 55,132,180,105,143,246, 42,109,190, 26,210,202,249,123,156, 14, 58, 93,160,
+190,211, 54,187,232,218,126,190, 42,254,183,197,216,238, 18,191,119,154, 33,211,167,144, 61,201,140,212, 14,186, 91, 15,218, 93,
+ 84,118, 23,211,113, 75,142,147, 41,164, 68,122,243,213,153,222, 19, 96,117, 53, 64,154,184,102, 72,186,226,195, 97, 68,156, 47,
+112,222,247,213, 39, 80, 85,223, 36,241,189, 38,139,139, 37,168,189, 49,174, 43,134,105,146, 51, 24, 6,214,202,207, 17,194, 0,
+231, 36,158, 56,165,140, 20, 87,204,231,179, 70,242,138, 78, 3, 85, 10, 50,106, 81, 93,138, 71,111,244,194,146, 18, 28,245,230,
+149,175, 81,165,123,152, 9,109, 54,181,238, 63,102,238,162, 9,234,202,231, 29,104,128,104, 7, 73,249,231,152,194,162,162, 52,
+187,161,238,253,237, 13,130,247,248,250,155,239,144, 98, 68,169,121, 19,212, 5,143, 87,247,119,248,230,253, 7, 56,231, 97,172,
+140,163,200, 42, 83,156, 72, 94, 36,102, 36, 24,164, 10, 56,253,208, 85,101,227, 82,169, 8,193, 73,214,118,145, 32,133, 57,173,
+155, 93,139,129,220, 50,123,141,193, 97, 26,122, 1,211,107, 17,189,160,100, 7, 78, 29, 65,136, 93,216,157,217,117,203,104,150,
+ 22,218,118,208,199,105,194,207,254,226, 75,205, 15,151,125,123,140, 18,242, 33,112,127, 57, 20,131,247,125,100, 84, 53,133,139,
+119,145,166, 87, 15, 76,109, 85,174,126,168,106, 27,233, 87, 9, 66,168, 12,152, 93,176,130,190,238,134,119,232, 67,208,149, 86,
+130,119, 49,137,246, 51,174, 60,120, 47,113,163,205,218,216,165, 45,162,206,108,202,183,246,255,139, 40,109,151,240,215,253,248,
+166, 35,112,233, 74, 92,201, 61, 99, 64, 42,232,130,121, 93,240,246,229,189,140, 24, 75,193,229, 89,212,227,185, 84,220,221,221,
+161,172, 23,128, 44,144, 5,184,161, 2, 99, 16, 3,214, 56,204,231,103,121, 48,177,209,235,218,222,153,172, 71, 76,162,172,174,
+ 44,214,196, 24, 87, 77, 55,115, 96, 2, 98,172,152,166, 1, 41,174, 24,199, 65,232,102, 99,128,245, 66,134,147,142,114, 18, 77,
+ 70, 73, 50, 74,131,193, 28, 87, 9, 80, 41,141, 65,239, 81, 75,198,229,124, 22,177,104, 6,106, 37, 92,150, 8,103,101,244,232,
+117,159, 62,199, 21, 62,120,140,206, 33,230, 44,179, 49, 45, 40, 74, 45,240,126,128,179,210, 93,134, 48,224,112, 56, 97, 94,102,
+196,148,122, 39,228,140,196,165,206,203,138, 97, 8, 24,199, 17,206, 7,201,252,214,176,150, 54,138,119, 78, 84,220,207,151, 25,
+ 79,231, 51,130,181,168,153, 49,142, 83,247,142, 51,128,227, 52,118,182,127,235, 46, 70,133, 16,205,107,196, 52, 14, 24,134, 9,
+222, 7,156, 21,237,204,204, 61,226,214, 90, 43,244, 59,107,113, 58, 76,200, 41,194,168, 48,182, 17,240,154,162, 66,200, 89,140,
+ 96, 68,252,118, 60, 76, 72,170, 34, 39, 85,239, 75,224, 69,209,112,141, 0,235,196, 10, 55,120,135, 24, 35,230,203, 69,198,160,
+ 68,221, 91, 95,114,218, 88, 11, 57,247, 36,172,191,255,211,251, 45,228,138, 25,163,119,253, 98, 16,135,130,156,129,115, 76, 48,
+ 68, 88, 98,210,113, 43,176,172,146, 36,103,152,165, 48,179, 86,105, 96, 80,250,156,133,117, 30,193, 25, 56,213,250,218, 29, 86,
+218,144, 60,239,100, 37,100, 42,213, 34,163,121,179, 21,186, 45,124,137,128,254,189, 52,219,150,148, 53, 5,165,154, 62,125,172,
+ 42,196,109, 93, 95, 74, 9, 57, 39, 12, 97,196,233,120,210,252, 10,238, 76,246,158, 50,193,123,125, 44,201, 57, 82,141, 86, 18,
+122, 57,239, 66,167,184,235,115,248,218,145, 99,140, 16,251,218,207, 96, 54,154, 91, 19,251, 53,190, 9, 25,211, 5,110,220, 87,
+181,123, 7, 16,250, 69,110, 84, 44,221, 0, 69, 70, 11, 37,222, 79, 53,205,214,221,183,149, 91,179, 55, 22, 22,240, 89,174, 91,
+178,229,174,199,237,182, 56,217,199, 91,201, 24, 49, 6,239,222,189,193,233,120, 16,236,179,181,155,211,161, 50,188,215,224, 35,
+189,196,185, 20,140,227,168,206,135,210, 95,151,148,146, 20,112,206,193, 24,135,202, 5,165,164, 93, 99,173,231,180, 58,163,196,
+161, 35,231,181,221,217,149, 91, 36, 44,215, 10,215, 59,195,186, 69, 27,118,206, 12,233,238,132,161, 65, 25, 91, 36, 31,239, 46,
+128,158,224,182,201,152, 81,183, 25,240, 62, 98,123, 87,175,109, 22, 15,161,227,200, 7,254,120, 28,241,139,159,255, 20, 31, 62,
+ 61,226,233,241, 9,172,251,158, 48,142,120,253,238, 45, 94,189,121,141,167,239,191, 7,106,234, 33, 35,206, 25, 12,131,195,200,
+ 21,254, 16,112,190, 36, 20,181,220,229, 10,112, 78,253,131, 18, 0, 20, 3, 20, 97,213,118,190,121, 19,189,241,238, 3, 40,190,
+120, 1,239,108,181, 10,245,238, 14, 26,124, 83,153,176,245,177,186,152, 32,249,112, 54, 29, 66,235,228,177, 27, 67, 53, 2,159,
+ 53, 22,227, 40, 62, 90,107,105, 39, 86,145,215,175,104,113,210, 94,195,254,154, 19, 54, 5, 57, 41, 93, 78, 49,136, 85, 59,112,
+249,103, 89, 49,128, 25, 85,125,251,104,184, 65,222, 89, 76,116,236, 14,141,103,229,182, 56,229,207, 50,221,219, 85,168,149,233,
+ 62, 74,176,125,240, 72,195, 89, 36,158,117,247,171,114,200,169, 99, 95, 91,135,177, 37,253,225,179,188,227,198, 68, 62, 63,207,
+120, 62,207,184,155, 12,150, 53,194,145, 76, 88,198, 16, 16, 83,198, 97,154,240, 23, 63,250, 18,127,251,235, 95,235,158,213, 32,
+198,130,202, 25,164,204,109, 34, 96,153, 63, 33,230, 12,103,124,215, 87,248,198,197, 46,187, 36, 65,211,130,104,244, 48,135,208,
+157, 98,173,160,228, 96, 81,144,216,192, 27,131,231, 25,112,113,133,181, 22, 67, 24, 16,147,199,139,251,123,172, 49,226,252,248,
+ 36,226, 23,235,177,172,179,136, 35,201,162,146,140,252,124,240, 88,215,212,139, 41,211,152,229, 10,124, 25, 66,192, 16, 68, 77,
+127, 89, 86,140,211,168,105, 99, 69,241,178,162,230,142,235,138,113,156, 96,173,195,229, 34, 99,250,203,101, 65, 5,112, 28, 71,
+216, 86, 40, 25,129,187,116,116, 51, 3,179,142,221, 13, 25,140,138,139, 37,253,239, 47,111,111, 54,142, 55, 1,222, 5, 25,235,
+170,144,238,249,249, 25,151,121, 22, 86,189,142,188, 5, 84,198, 40, 41, 99,213,136, 91,102,150,231,185, 86,172, 73,192, 44,151,
+121,233,145,202,107, 76, 29,163, 57, 13, 65, 51,213,125,223, 9,151,156, 97, 13,225, 60,175, 50, 46,143, 45, 10,211,194, 59,175,
+ 86, 52,194,211,243,130,160,162,196,134,218, 45,165, 96,141, 9,198,137, 88, 16, 85,240,180,182, 79, 79,228,215, 22,152,241, 31,
+191,126,175,231,158, 92,136,163,138,102,139,194, 42, 4, 51, 33, 32, 25,193, 68, 27,216,198,111,216, 89,146,108, 67,119, 90, 65,
+141, 6,167,201, 93,214, 97, 12,182, 35,162,247, 25, 10, 73,197,188,133, 25, 69, 57,247,251,180,199, 90,107,159, 98, 25,218, 40,
+117,181, 95,162,162,213, 17,251,153, 76,204, 26,114,150,118,122, 39,230,182,230, 24, 49,141, 34,116,228, 42,240,159,109, 13,102,
+118,241,218,188, 81,231, 20,166,213,172,204, 48, 0,177, 81,161, 45,111, 13,157,158,137,206,154,158,156,215,211, 39,119,207, 57,
+119,112, 86,221, 86,153,205,150,219,206,133,189,109,173,237,182,173, 21, 59, 23,217,237,226, 53, 70,157, 54,154, 40,105, 54,172,
+117, 75,172, 43,218,130, 23, 37, 41,198,148,251, 90,176,127,208,177, 39,189, 80, 87,186, 27,178, 56,157, 78,120,253,230,149,186,
+ 42,210,102,165, 52,128, 55, 22, 94,221, 5,166, 72,132,178, 42,158,133, 12, 88,179,196,142,147, 76,168,172,243, 24, 6,200, 94,
+126,141,114, 78, 54, 23, 64, 11,168,169, 13,201, 94,122,254, 59,183,188,140, 88,183,184,109, 34,209,140, 55,229,122, 63, 70,219,
+136, 86, 21,207,157, 32,215,197, 97,132,150,165,131,125,150,247, 94, 68, 85, 63, 19,202, 93,201,241,182,210,239, 10, 52, 64,155,
+143,253,229,253, 45, 94,222,223,110, 57,226,250, 65, 49,214, 72,102,115,204,189,138, 14, 0, 12, 49,130,221,166, 9,193, 89, 73,
+228,169, 64, 42, 85,121,196,216, 0, 42, 6,253, 16, 43,204, 91,250, 79,223,155,216,142, 20,108, 66, 45, 50,159, 37,160,181, 8,
+210,202, 74,165,171, 93,245,185, 29,208,116, 61,194, 34, 22,209,135,214, 59,123,232,207,158,244,182,179,197,247,145, 58,246, 73,
+119,188,179,144,181, 71,167, 9,224,182, 77,121, 71,248, 86, 99,228,129,222,137,210,136,235,213,123,214, 64, 48,196,215,244,182,
+110,153,220,137, 96,246, 69, 64,207,102, 87, 91, 96, 15, 32, 81, 59, 36, 54,249,229,246,117,118,130,193,253,215,217,128, 21,215,
+ 97, 66, 0,225,241,249,140,131,151,215, 60,248,128,154, 35,114, 74,120, 88, 87,220,222,220,162, 48,227,238,246, 22,227,225,132,
+243,211, 39,100,102, 81,224,179, 5, 20, 84,196,181,246,228,179,194, 9, 65,247,109,237,168, 51,134, 96,184,161, 60,197, 18, 9,
+ 75, 24, 45, 16, 75,214,148, 64,173,176,173,129, 73, 17,197, 56,156,134, 17,224,130,183,111,191, 68,205, 17,135,195, 65, 40,100,
+211, 65,108,148,165, 40,128, 69, 2, 88,134, 97, 68, 76,171,186, 62, 42, 64, 86, 2,101,198, 65, 5,136, 5,199,225, 8, 2,225,
+211,211, 51,130,181,152,151,136, 82,197,122,117,152, 14,242,125,151,130,160,132, 53, 31, 6, 81,110,103,153, 14, 92, 86,185,252,
+150,117, 65, 45, 25, 54, 4,112,201,138, 85, 53, 56,221,220, 32,197,132,101, 89,144,179,140,180,155,167,159,139, 76,202, 14,211,
+ 36,246, 47, 34, 85,228,138, 5, 71,114,224,173,136,119, 82, 18,181,125,240, 56, 95,102, 76,227, 0,231, 61,110,156, 67, 84,255,
+120,214, 73,192, 18, 35, 98,146,159,115,153,103, 48,128, 37,174, 56, 29, 14, 50, 86, 52,132, 64,182,123,220,115, 17,159, 57, 17,
+192,106, 47, 29,134,208,237, 99,193, 6,153, 80,168, 79,190,241,229, 67, 16,171,108,140, 17,135,233, 0, 38, 32, 51,131,178,164,
+ 62, 78,135,131,196,219,234,196,173,249,132,141, 49,248,230,187, 15,136,185,244, 17,179,183, 2,128,113, 70,144,194, 34,112,179,
+187,224, 17,105,136,140,102, 56,203,247,229,212, 90, 42, 35,245,152, 11, 6,101, 2, 56,231,224, 45,118,202,106,161, 5, 54,191,
+ 55, 65,208,176, 68, 34,130, 98,189,124,136,196, 25,212, 49,168, 61,140,103,203, 82,104, 69,121, 95, 51, 26,113,210,180,120, 78,
+102, 81, 39, 54,230, 90,140, 9,209,175,248,255, 11,123,179,157,201,146, 44, 59,111,109, 27,206,228,254, 15, 49,100,102, 85,245,
+ 76, 18,132, 64,117, 3, 20, 37,129, 36, 40,241,117,244, 8,122, 2, 93,233, 1,116, 47, 93,233, 94, 47, 32,240, 70,141, 38, 4,
+178,196, 98,163,217,236,234,174, 33,171, 58,199,136,127,112, 63,147,153,109, 93,236,109,195,241,200,146, 10,104,100,103,102, 68,
+254, 30,238,126,204,246,176,214,183,134,113,194,253,157, 6,246,168, 58, 30, 58,214, 54,121, 13,160,255,174, 76, 47,181,216, 38,
+ 86,235,179,222, 17,181,171, 86, 47,183,177,232, 58,215,160,191,107,227,148,207,112,171,172,135,172, 21,106,167,132,101, 37,172,
+151,172,209, 11, 58,103,213,103,209, 90,214,127, 24, 99, 11, 56, 39, 79,113, 77,211,209,231, 14, 61,169,136,112,203,151,114,115,
+ 8, 27, 66,147, 64,169,106,119, 77, 20,116,222,225, 39,191,255, 99,156,239,238, 16,246,173,232,160,242,161,157, 57,239, 65, 59,
+114,223,117, 66,153,219,119,248,174, 67,140, 17,151,203, 21,134,172, 98,153, 19, 98,216,203,165,222,166,109,102,139,156,201, 52,
+190, 84,167,233,212,166,159,230, 53, 44, 67,119,234, 92,227,191, 24,169,230,211,150,238, 60, 85, 64, 62,167,155, 75,230,152,212,
+147, 47,129,212, 66,254,115,246, 54, 29,185,181,109,190, 58,221, 92,255,101, 52,171,255, 50,103,124, 51,203,216,129,141,218, 21,
+ 64, 24, 7, 7, 39,179, 37, 60,173, 17,158, 8, 75,140,240,134, 16, 13,105,168,188,190,174,182,152,224, 84,198, 63, 25,148,159,
+199, 54,222,119,135,162,163,174, 22,204,173, 61,188,116,171,165, 19,135,120, 61,179,239,250,240,231,203,190,255, 92, 47, 39,150,
+209, 81, 30, 39,181,225, 5,135,244,194,116, 16, 23,230,217, 80, 9, 60,128,118,225,217, 51, 74, 77,172,162, 33, 13,173,209,223,
+ 97,168,181,154,235,164, 38, 29, 42,232, 28, 56,145, 51,213,243,120,186, 77, 73, 43, 54,186,204,149, 44, 23, 53,233,152, 61, 63,
+168,250,215,156, 24,213,250,239,179,247, 95, 95, 83, 1, 32,209,173,153,128, 97,137,113, 26, 58,120,103, 17,245, 66, 39, 2, 78,
+167, 51, 0,160,239, 58,172,219,134,127,242,143,255, 17,254,205,255,245,231,229,194,230, 50,226, 67, 9,187, 40,185, 5, 58,241,
+144,201,131,240,147,207,111, 62,199,208, 79,248,254,175,254, 93, 1, 22,205, 91, 94, 17,200,152,151, 83,196,208, 15, 50, 42,177,
+130,119, 76, 97,199,199, 15,223,224,253,251,247, 56,157,207,120,189, 92, 16, 99,194,253,221, 29,150,117,197,229,122,145, 46, 15,
+ 66,128,114,214,227,244, 48, 1,198,129,145,176, 92, 47, 34, 0, 99,130,117,157, 18,207, 4, 20, 50, 95, 23, 48,128,251,251, 7,
+204,203,170,236,122,205,107,208,116,196, 60, 93, 74, 41, 98, 11, 34, 20,138, 41,225,238,116, 46,154, 11,107,157,116, 16,214,224,
+122,189,106,156,105,133, 21,121,223, 73,158, 66, 12,184, 59,159, 17,226, 46,104, 86,231, 96,251, 14,251, 22,117, 44, 42,159,201,
+117, 89, 69,241,174,222,115, 99,228,130,186, 63,159,241,252,242, 34,251,117, 18, 81,154, 37, 25, 61, 90,125,141,206,202,120,122,
+240, 67,217,153,147, 58, 30, 99, 76,240,189,248,249, 13,201, 36,130, 20,244, 65,218, 97,175,235,170, 36, 55, 7,222,119,112, 98,
+201,167,159,148,119,191,109, 56,157, 78,232,251, 30,251, 30, 48,245, 64,180,161,136,233,178,216,200,232,216, 61,166,132,167,215,
+ 11,190,121,122, 45, 9,136,135, 60,112,197,194,166, 28, 72,101,228,220,112,214,160,243,186,195, 53, 89, 87, 32,151, 33,152, 17,
+162,228, 62,100, 64, 8, 33,130,200,234,202, 74, 69, 90, 10, 30,145,103,206, 54,103, 11, 41, 9, 78,104,151, 96,160,243,182,116,
+229,133, 26,169,151, 88, 57,223, 26,241, 28,140, 6,176,164, 84,220, 76,149,237,206, 88,183, 77,178, 5,156,132, 49,137,222, 37,
+ 42, 78,219,170,222, 67,156, 73, 33,236,101,207,127, 64,195, 54,248, 85, 40, 55, 61,139,211,188,119, 7,125, 81, 17,191,149,181,
+105,213, 82,228, 81, 60,233,175, 49, 37, 76,171,237,212,235, 40,221, 58,175,133,135,132,131,145, 2,102, 72,179, 54,164,112,168,
+151,123, 42,229, 76, 82,197,187, 66,102,154, 38, 13,186,239,207, 99,252, 98, 95, 83,128,215,143,126,244,185, 52, 17, 65,196,206,
+166,236,247,173, 58,184,100,186, 76, 74, 75, 44,145,209, 9,136,243,130,176, 71,132, 61,130,140,140,203, 83,220, 97,163,100, 45,
+228,137, 86,107, 83, 54, 6, 13, 84,169, 54,224,133, 21,161,150,195,188, 66,114, 69,248,197, 53,186, 14,169, 94,196,185,179, 76,
+154, 82,150,137, 66, 57,106,149, 8, 57,122,163,168, 20,107,242,149, 30,164,166,233,228,155,196,183,250, 57,201,207, 76,237,125,
+ 70, 55, 57,128,197,122, 32, 52, 44,163, 23,186, 33,130, 53,128, 19, 13, 85, 9, 85, 73, 36, 21,178,188,209,109,132,169,116, 96,
+ 9, 98, 11, 40, 26,209, 70, 43,192, 0,124,231,202,197, 93,168, 70, 45, 89, 78,119,213, 53, 79,184, 17,161, 49,192, 38,195, 27,
+ 90, 5, 28,231,220,194, 26,179,151,114, 65,132, 35, 75,185, 77, 83,160,219,194,167,221, 54,231, 90,161,118,238, 70,121, 1,108,
+168,137,196,173, 41,111, 38,229,139,172,180,224, 42, 70, 81,208,131,169, 29,117, 70, 6, 19,227,144,183, 92,249,202,181,250, 38,
+ 61, 8,139, 21,189, 69, 7,227,150, 40,151,163, 23, 83,211,221,243,205, 68, 39,215, 46,146,182,230,173,193,221,233, 36, 72,213,
+ 36, 23,199, 22, 3,174,243,172,151, 92, 18,212,103, 98,252,209, 31,254, 1,190,253,251,191,199,211,117,133, 49,226, 33,207,159,
+157,179, 70,186,120,164, 50,154, 99, 5, 78,113, 74,216,150,139, 48,152, 21, 14,212, 89, 17,135,229,233,205,117, 93,225,188,100,
+140,131,129,206, 24,132,176, 98,232, 6, 48, 25,177,143,109,171,136,165,246, 29,215,117, 6, 84,121, 27, 73,180, 18,215,235, 5,
+119,119,247, 2,140,177, 10,160, 32, 25,207,173,219,174, 1, 30,114, 48,249,174,211,110,167,199,188, 46,184,187, 59,203, 30, 79,
+255,221,182,174,176,123,192, 30, 34,156,211,176,146,176,161,119, 14, 59, 24,235,182, 22, 48, 81,223,121,221, 55, 59,164, 20,213,
+ 15, 46,182, 55,178,130,109,237,157,131,245, 22,203,124, 69, 74, 9,157,247, 24,134, 65,244, 41, 73,167, 59,214,233, 33, 12,181,
+ 98,137,162, 87, 46,210, 17, 79,207, 79,101,136,103,213, 10,150, 0,144,177,136, 97,151,228, 53,229,206,147,102,161,231, 40, 99,
+249, 51, 43,178, 51,201,104,119, 89, 23, 24,107,241, 48,142,184, 94,175,216,182,185,136,198, 12, 37, 88,103,225,157, 76, 8,194,
+ 46,105, 86,249,121,222,214, 77,118,224, 33,148, 14, 49, 70,205, 90,208, 12,243,125,219,176,133,136,191,253,237,183,101, 28,204,
+204,112,250,156, 56,147,187,114,131,193,171,243,196, 57, 93, 71,216,242,157, 53,144, 80,151,150, 54,105,173,173, 49, 39, 28, 17,
+163,194,177,140,116,142, 65,187,196, 16,245, 89,163, 76,231,147,239,231,190,133, 98, 69,180,186,190,178, 36, 73, 99, 41, 5,109,
+120,116,237,169,185, 19, 45,228,202, 40, 29,143,201, 22,150,184, 88,116,229,187,178,135, 29,219,190, 97,156,206, 24,199, 17, 22,
+ 1,148, 2, 66, 2,182, 68, 8,249,162,221,168,138,122,211,141,198, 6,220,160, 83,179,104,205,150,174, 58, 55,130,185, 57, 43,
+ 93,122, 74, 90,228,165, 98, 67, 43, 14,164, 76,159,107,130,169, 90,251,110, 78,157,171, 97, 62,164, 23,123,142,238, 62,178,224,
+243,235,136,122,198, 75,228,111,172,234,123,174,235, 70, 34,163,234,119, 83, 47,117,107,112,119,119,194, 56, 12, 2, 66,219,214,
+ 50, 53,225, 70,102, 20,246, 29,188,115,121,109, 49, 5, 93, 23, 88,101,186,179,176, 66,178, 31,158, 24, 49,212, 4, 59, 83,130,
+126,178, 88, 58, 23,108, 92,161, 57,121,191, 79, 66, 20, 52, 86,232,118,204,128,203,123,216,210,126,162,129,238,231,253,120,206,
+253, 86,174,111,109, 63, 43,198, 20,208,110, 80,171, 91,186, 81,194,211, 97, 6,207,160,155,222, 28,217,131,251,195,255,182, 92,
+ 99, 81,127,141,209,187,222, 18,131, 67, 66, 36,139,141, 25, 6, 9, 81,129, 24, 41, 37, 80,215,195, 66,246,210,220, 36,186,215,
+226, 34, 21,250, 82, 46, 77, 68,137,216, 29, 45,120,185,203, 52,104,118, 26,168,151,113,225, 13,235,248,171,228,227, 54,110,128,
+ 54,130,173,201, 73,103, 70,137,254, 60, 14, 44,232, 96, 81,131,238,195,115, 69, 73, 13, 63, 74,108,134, 82, 37, 37,170,201,110,
+ 37,235, 40,135,243, 16, 26, 86,243,144, 0, 0, 32, 0, 73, 68, 65, 84,131, 13,151,221, 87, 85,168,234,173,157, 29, 5,229,247,
+ 81,149,190,113,253, 28, 10, 21, 58, 87,108, 57, 69,141,185,112,163,181, 93,151, 81,154,145,204,242,252,247,164,163,204,204,170,
+ 62,100, 4, 83, 59, 86,146, 63,215,235,235, 12, 67, 6,151,101, 5,165, 4,223, 57,192, 24, 76,126,192,187, 55,111, 96,140, 85,
+ 24,138,133, 11, 17,127,242,251,191,135, 95,255,234,215, 56,119, 22,187,177,160, 36, 97, 7,176, 98,199, 25,134, 14,251, 38,194,
+ 45, 89,135,112,209,130,196,176, 97,190, 62,169, 93, 42, 98, 11, 36,161, 33,156, 64, 70,236,108, 70,117, 18,214, 88, 33,200,145,
+197,117, 22,178,217,117, 94, 48, 12, 19,182,109,209,108,110, 81,213,238, 97,199, 52,157, 36,147,251,238, 81, 4,132,138,126,237,
+135, 9,188,202, 33,118,127,238,176,108, 59,182, 93, 46,220,147, 33,220,221,221,107,193, 36,135,223,150,128,121, 93,164,112, 80,
+206,251,216, 43, 37, 44, 69, 72,223, 24,208, 89,135, 61, 10, 61,173, 43, 24, 88,241, 75,147,145,137, 20, 3, 50,205,130,193,221,
+105, 16,113,158,118,167,123, 8, 88,215, 77, 70,240,250,108,120, 47,234,249, 85,133,112, 68, 4,235, 12,174,215, 69,252,224,219,
+ 38,159,185,158, 5,137, 25,157,115,184, 94, 46,197,113, 98,173,193,182,111,229,115,222, 54,249, 25,214,137,114,127,154, 78,242,
+ 51, 89, 20,217,214, 26,244,157, 68,148,102, 95,115,126,157,206, 57,116,125, 15,239, 61,214, 77,108,105,207, 47,207, 2,194, 97,
+ 96, 56, 13,216,183, 13, 33, 64,196,140,214,162,115, 14, 73,149,240,251, 46,156,131,255,252,155,175,203, 90,172, 4, 31, 41, 86,
+ 52, 49, 48, 56,167, 41,134,132,193, 11, 80,199,229, 64, 38, 45, 22,147,102, 99,103, 46,184,228, 59,176, 88,107,161, 73,148,202,
+175, 55,156, 25,243, 80,157, 5,244,215, 39, 88,245,252,112,136,216,118,209, 42, 68,165,219,213,156,138,250,252, 26, 5,230,228,
+ 40,214,132, 38,174,153,197,129, 33, 57,230,170, 19,200,103,179, 54, 60,123, 8, 24, 56, 97,234,123, 12,246, 12,138, 66, 4,100,
+219,227,105,222,117,133, 19,165,248,218, 54,216, 2, 46, 58,222, 29, 53,134,217, 28,173,205,134, 10,157,206,100,204,172,218,205,
+100, 15, 94,207, 59,153,152,113,105, 56,200,210, 33, 95, 60,231,151, 91, 39,218, 4,155, 65, 47,208, 66,162,172,194,169,114, 64,
+138, 99, 41, 39, 80,212,125,122, 73,135,175,190,226, 50, 29,174,144, 25,131,190, 31,240,230,205, 35,134,206, 99, 95,230,166,185,
+145,207, 60, 67,189, 56,101,109,134,164, 91,102, 78,136,117,234,132, 65,210,117, 70,168, 81,216,154,152, 72, 77,106, 27, 43, 8,
+137,140,131,117, 94,192, 90, 57,188, 37, 71,192, 42, 60, 45,227,106, 99, 12,112,114,160, 37, 21, 34,220,204, 83, 26,111, 96,166,
+114, 81, 65,129,214, 56, 62, 98,221, 41, 51, 55,240,130, 99,199,133,155, 36,159, 79,198,210,208,249,124,201, 55,111,141,242, 84,
+182,178, 41,196,131,236,187,119, 6,157, 51,120,141,106, 81,219, 2,216,121,164, 40,137, 76,134, 76, 65,194,202, 87, 80,236, 84,
+114,167,136,146, 60,171,145,153,100,151, 37, 99, 54,219,214,159,229,191, 97,184, 85, 6,168, 0, 13,141,128, 48,135, 32, 80, 22,
+203,125,210,102, 31, 76, 5, 25, 14, 99,136,127,232, 29, 59,162,117,111, 16,177,133,252, 70,199,254,150, 82, 21,151,181,148, 55,
+180,234,210,230, 51,174,171, 4, 42, 23,109,222,117,101,125,138,100,248,178, 6,233,112, 43,238,175,227,242, 50, 30,202,171, 13,
+ 42,164,188,108,171,107,199,240,242,143, 73, 58,252, 44,160,107,114,226,219,119, 34,196, 8,143,132,101, 21, 37,113, 14,189,232,
+252,168, 35, 73,137,247,220, 67,128,119, 22, 31,183, 29, 63,249,189,223,199, 55, 95,127,133, 62, 37,108, 57,109, 42,213,159,109,
+157,211,209,165, 20, 15,214, 57,221,179, 69,124,254,217, 31,226,235,111,191, 2, 37, 9,245,145,112, 14, 97,184,119,157, 71,223,
+141,240,148, 16, 53,195,187, 31, 6,140, 67, 15,107, 8,111,222,190,131,247, 14,219, 54,227,227,199,167, 38,168,200,227,245,245,
+ 10, 16,224,157, 36,183,145,183,152,175, 51,236, 40, 7, 95, 10, 59,158, 46, 11, 88, 99, 64, 65, 70,248,231,235,138, 24, 35,238,
+238,206,248,248,244,132,109, 15, 34, 38,219, 2,174,243, 21,131, 6,180, 24, 18, 92,104, 12, 1,203, 46, 81,171, 12,135,222, 91,
+ 68, 78,224,100,176,135, 85,114,208,135, 94,197, 75, 98,153, 19, 33,163,140,186,141,118,221,121,223,200, 28,117,119, 29, 65,145,
+144, 66, 44,239,183, 49, 6,175,151,171, 88,221,102, 81,181,175,123,192,121, 26,208, 89, 47,126,113,136,117,204,228,239, 6, 58,
+204,203, 6, 67,140,109,223, 10,149,205,123, 17, 34,237, 33,200, 8, 56,138,239,219, 82, 14,191,216, 37,197,173,239, 48,207, 11,
+166,193,151,226,210, 90, 9,228,185, 94, 47, 34, 58,117, 14,222, 24,196, 32,224,157,126, 28,209,245,189, 20, 48,153, 51, 15,241,
+182,255,205, 47,191, 44, 57, 16,164, 63,143,180,145, 49,134,224,213,155,222, 57,219, 56, 89, 32,138,105,197,191,238, 58,229, 26,
+186, 78, 44,148,206, 34,196,132,206,202,217, 25, 84,172,150, 87, 93, 33,197,242,236, 36, 85, 77, 75, 30,187, 92,236,206, 90,108,
+ 49,162,239, 92,193,213, 38, 85,106,231,231, 5, 13, 23, 61, 79, 36,203, 64,209,220, 94,132,164,160, 39,113,141,152,156,238,152,
+ 3, 79, 82,146, 73,142, 39, 12,157, 71, 80, 93,201,188, 61, 99,205,137,146, 50,246,106, 38, 1, 40,133, 89, 94, 87, 84, 84,108,
+237,174, 83,202,232,220, 84,247,230, 77, 6,135, 88,119,107, 3, 67,121,247,127,208, 8,152, 38, 25,205,214, 14, 61,239,212,111,
+246,231, 21,106, 83, 63,175,172, 39,224,156,157,160,239,159,161,170,155, 98,141,151, 54,198,150,162,131,140,197,251,247,111,113,
+ 82,234, 97, 72, 84,149, 63,218, 81,167, 84, 36,228,162, 67, 51, 22,150, 81, 94,167,215,198, 96, 15,187,104, 28, 72, 65, 56, 58,
+ 5, 32, 34,196, 61, 32,170, 70, 69,126,182, 76,232,250,113, 16, 71, 74, 98,172,243, 44,231, 52, 82,209, 30,196, 16, 16, 33,193,
+ 47,174, 93,202,163, 5, 14,208,177,107,111,194,215, 42, 73,236,128, 92,105,116,237, 68,117,216,202,199,189,104,225,214, 85, 63,
+255,161,151, 39,220,164,126,148,116, 27, 46,148, 41,215, 16,236,188,146,136,246, 4, 12,134, 17,242, 76,223,104,193, 97, 10, 96,
+ 84,216,235,134, 74, 34, 28,140, 1,103,129,138, 10,222, 98, 98,144, 97,201,181, 69, 43, 55,168, 10,109, 52,152,214,106,125, 48,
+199, 75, 13, 55, 32,165,155, 63, 82, 6,204,152, 44,152, 99, 52, 19, 18, 42, 0,128,116,168,130,170,197,228,128,163,225,154, 94,
+124,160,237,167,250,186,209, 20, 93,249,205, 47,180,192,156,180,166,131,243,148, 32,157, 40, 87,202, 93, 43, 88, 68,171,108, 45,
+254,114,174, 59, 51,101,193,202, 23,155,203,214, 65, 92, 2, 66,151, 35, 13,250,200,179,250,148, 53, 23,138,125, 44,197, 81,121,
+232, 68, 80, 53,118, 3, 70, 69,133, 90, 99,208,245, 61,156,210,208,242, 65,126,157,103,177,155,117, 29, 34, 19, 56,198,114, 80,
+ 72,222,125,146,136, 83, 22,120, 70, 89, 53,196,160,194, 61, 96,190, 62, 11,108,196, 74,250,218, 56, 12,216, 67,192,249,228,177,
+ 44, 11, 44, 69, 68, 24, 97,207,147,184, 31,122,239,225,187, 14,227, 56,212, 67, 58, 7,145, 24, 3,203, 70,149,174, 30,203,182,
+138, 66,157,128,251,243, 89, 34, 62, 53,178,145,140, 23, 91,139, 21, 47,117, 78,163,235,188,195,211,199,103,137, 72,181, 6, 79,
+ 79, 79,216, 67,130,161,132,117, 89,208, 15, 35,140, 51,176, 48,120,121,189, 0, 36,124,244, 20,119, 57, 88,140, 20, 49,187,126,
+254,222, 90, 77,104,203, 68, 52, 96, 85,174,188,240,226, 73, 16,206,251,166, 74, 91, 57, 0,230,121, 81,145,169, 28,128,251,190,
+ 2, 41,137,172,194, 24,204,203,138,193, 59, 44,203,138,228, 35, 60,123, 61,132,109, 25, 51,167,148, 74, 87, 42,224, 15,198, 52,
+120,248,110,192, 56, 14,178, 34, 9, 59, 94, 46, 27,122,239, 96,141, 20, 25, 41, 70, 56, 45,224, 58,239,145, 32,182,190,174,235,
+177, 44,215,146,142,213,105,118,251, 30, 4,246, 50, 12, 83,241,216, 3, 84,136,106, 12,224,231,191,250, 45,246,144,138,136,182,
+ 4, 31,106, 67,144,247,195,214,200, 36,199,169,128,210, 90,225,221,103,167,132, 33,117,204, 24,171, 93,123, 2, 82,194, 22,163,
+216, 57,245,241,219, 19, 23,222,251,224,157, 16,231, 84,102,148,119,192, 98,119, 10,213,191,173, 1, 42, 41,171,224, 89,162, 89,
+163, 10,136,243, 89, 18, 82,166, 48, 87,112,138, 76, 51,212,114,101,173,142,124, 19, 82, 22,129,145, 20, 45,206, 10,235, 99,244,
+ 61,188, 53,240, 42, 34, 28, 61,225, 89,163, 67,115, 62, 69,182,223,149,100, 53,178, 58,129,203, 81,210, 74,188,212,123,192, 58,
+121,174,114, 98, 94, 17,244, 25,186,241,193, 87, 23, 77,210,139,173,228,109,232,235,181,150,224,180, 67,207,168, 86, 99,242,216,
+ 95,119,232,153,216,166, 99,246, 18, 58,197, 4, 24,139,196,123, 19,204,101,202,207,224,210,229,155, 82, 40, 24, 99,240,238,237,
+ 35,206,231,179, 76,194,182,181, 98, 90, 91,113,157, 49, 5,168,149,163,118, 25,220, 0,159,196,174,150, 98, 40, 97, 56, 2,141,
+137,162,151,200, 64, 46,146, 66,192,169,240,213, 56, 1,215,132, 16,245, 89, 76,213,103,175, 9,109,169,113, 41,184, 70,250, 92,
+133,113,170,112, 63,224,228, 62,233,173,185,146,225,233, 86,221, 77, 34,214,226,198,167, 78, 53, 8,134,192, 53,136,135,234, 37,
+ 88, 46,207,164, 98, 0,174,158,204,172, 78,182,168,187, 22,214,177, 71, 32, 11,102,181,204,144, 21,117,188, 30, 20, 40, 65, 4,
+164,182, 60,110, 20,142, 84,254, 42, 35, 17,245, 24, 58, 83,216,188, 5, 84, 3,153, 70,100,213, 39, 49,142,187,152,166, 4, 34,
+206,226,183, 31, 96,244,105,189,147,138, 86,144,154,148, 54,100,116, 95,177,169,225,118, 15,157,175,246, 38,218, 84, 70,223,169,
+254,252,131,192,143, 15,185,192,242, 53, 75, 5,253,155,223, 67,153, 52,152,114, 97,107,189, 9, 62,204, 10,234,100,128,138,255,
+188,238,227, 81, 23, 24, 69, 63, 80, 46,116, 34, 24,174,169, 79,172, 93,188, 33, 70, 98, 3,211, 60, 33,165,120,160,202,122,239,
+156,195,114, 13,184, 46, 11,122, 37,221,157,166, 73, 14, 60,103,225,173, 19,239, 51, 68,153,252,248,248,136,159,253,231,191,131,
+239, 59,124,243,250,138,187,209,131,172, 50, 6,184,190, 71,249,160,245,190, 87, 6,127, 68, 76, 59,246,109,145,117,128, 42,126,
+159, 47, 50,234, 54,144,236,241, 53, 4, 56,157,243,137,192, 41, 33,194,192, 68, 21,101, 38,193,154, 94, 52,213,107, 28, 39, 60,
+189, 92,112, 62,157, 10,170, 50,169, 32,236,251,143, 31,228, 33, 86,245,249,208,123, 24, 59,224,114,189,106, 52,167,122,205, 59,
+175, 15, 63,176,108,130, 27, 61,159, 70, 24, 0,215, 53, 8, 94, 85, 71,176,227, 56, 33,134, 77, 71,220, 12,198,142,177,151, 73,
+ 66, 50,169, 28,152, 97, 15,176,142,176,133,173,116, 8,111,223,188, 1, 49, 11,162,214, 73,151,184,135,128, 93,237,165,211, 56,
+138, 98, 62, 70,164, 36,212,180, 93, 47,144,144,132, 30,199, 44, 86, 67, 24,131,113, 24,203, 56,244,229,245, 34, 54,181, 16,112,
+217, 22,132, 32,127,182,193,137,128,175,243, 78,133,114, 17,175,151, 43, 66, 8, 2,141, 81, 79,121, 70, 43,135, 16, 37, 46,151,
+ 58,172,219, 42,246,183,206,151, 66,138,201,192, 58, 3,214,201, 74,140, 17,214,121, 24,215, 33,174,175, 74,127,219,241,237,199,
+103, 60,207,235,113,173, 87, 37, 95,101, 36,204,153,158,153, 24, 33,227, 93, 51,171, 27,130, 24,181,170,122, 47,203,169, 24,133,
+174,199,146, 2,153, 52, 1,204,105, 12,175, 33, 96,221,229, 61,229, 66, 87, 83, 77,132,106, 44,160, 36,186,160, 42,232,164,186,
+149,168, 98,172,114, 97,229, 80,174, 28, 58,194,220, 8,174,204,241, 8, 50, 6,136, 25,240, 34, 66, 44, 97,216,147, 22, 23,114,
+209, 16, 0,111, 61, 78,157, 69,216, 55, 5, 34, 5,153, 98, 18,196,150,201,169,224,170,141,230,208,231,110, 57,165,236, 42,162,
+ 70, 28, 93,197,114,173,149,237, 56, 32,150, 63,139,173,193,225, 7,215, 77,123,161,147,145,209,187, 85,146,156,213,179, 60,139,
+ 13, 99,170,251,115,144, 41, 14,138,164,255, 87, 24,239, 2,147,191,225,186,203,197,126,119,119,194,105, 26,113, 58,141,218, 24,
+ 26,201, 46, 47, 59,110, 39,251,108,144, 20, 93,172, 29,116,206, 95, 55,186,102,205, 34, 98,107,193, 65,221, 8, 26,230, 82,236,
+123,186, 74,112,125,175,145,202,187,172,142,182,189,134,234, 40,195,162,146, 77, 77,113, 58,112, 42, 49, 40, 71,148, 31, 43, 25,
+ 77,121,254, 85,200,213,112,114,107,167,154,199,189,140,219, 88,152,172,248,171, 66, 5,249,251,195, 56, 62,127,224, 13, 25,173,
+ 77,118, 67,126, 45,186,247, 79, 33,194,192, 0, 73,118,130,206, 27, 92,247,204, 31,118,176,148,138, 55,212, 2, 37, 45, 74, 68,
+ 18,210, 41,178,134, 23, 56, 67, 88,169, 38,205,101, 21,113, 62, 92, 51,114,141, 75,241,194,229, 86,230, 76,197, 83, 62,114,161,
+ 40,193,128, 56, 22,241, 93,211,100,127,226,237,227,198, 69,145,218, 75,150, 27, 47, 59,223, 14,224,169, 8, 10,203,235,105, 32,
+ 15, 92, 98,109, 81, 82,218,184, 33,182, 85,145, 90, 22,237,181, 72,199,212,136, 18,185, 68, 50,230,191, 55, 89,104,168, 81,170,
+ 92, 18,156,244,243,207, 76, 2,189,180,145, 47,116,229,191,215,189,149, 28,142, 98,245,111,131,114,168,177,222,212, 3,105, 89,
+ 69,200,195, 49,128,147,197,235,229,138, 31,125,254,153,232, 30, 82,196,190,203, 20,102, 26, 39,252,234, 55,191,197, 95,255,226,
+151,216,150, 25,189,179,120,255,120,143,199,113,196,151,223,126, 13,151,253,190,134, 48,248, 14,211,244,136,235,245, 35,156,113,
+ 66, 41,235, 70,132,125,198,186,173,216,183, 25,206, 57, 44,123,238, 42,119,116,110,144,117, 1, 12, 44,137,103,116, 15, 17,253,
+ 52, 96,139, 1,243,229, 5, 60, 78,176,134,112, 93,174,226,219,246, 30, 3,100,197, 50,141,163, 10,157,116, 58, 3,134,247, 22,
+123, 96, 17,174,177,236, 24,147,146, 66,196,186,231,225,188,133, 51, 50,162,243,206, 35,196, 14,235,182, 99,210,233,206,188, 44,
+120,188, 31,113,189, 48,186,190,199,216,119,120,121,121, 21, 16, 11, 8,227, 56,194, 59,131,215,151, 87,116,195,136,187,243,157,
+ 88,191,156,151,238,221, 16,210, 34,208,154, 45, 68,172,235, 2,231, 60, 46,215, 43,184,239,101, 39, 15, 96,236,122, 12,227,128,
+215,215, 87,172,235, 86, 46,234,101,223,208, 57,135, 85, 71,154,222, 90,197,168,154, 34,120,114, 78, 46,223, 94,169, 90,203,178,
+170, 13, 78, 16,169,214,121, 64, 85,214, 49,137, 18, 61,165, 40,233,107, 74,119,115, 86,198,161, 33, 72, 46,124,208,209,255,186,
+202,123, 27,118,137, 17,117, 86,172, 99,156, 36, 58, 85, 10, 24,135,233,116,194, 58,207,114,161,179,100,148,255,246,123,225,186,
+231,120, 97, 99,126, 72,167,171,217,231, 58,233, 51,196,154,152,166, 29, 37, 52, 21,208, 58, 48, 68,132, 23, 57, 98, 11, 65, 17,
+173, 66, 20,203, 57,234, 57,161, 45,162,174,189, 92, 9, 98,162,162,116, 78, 44,123,122,177,246, 37,189,196, 43,207, 29,133,126,
+119, 75,130, 68,141, 83,165, 54,226, 57,143,176, 37,232, 39, 91,123,243,217,226,140, 8,249, 8,242,222, 58, 43, 22,198,193, 59,
+196, 24, 20, 78,147, 47,101, 91,202, 31,180, 56,213,140,171, 45, 54, 44,170,249, 19,250,125, 48,149, 30, 83,214,180,109,203,216,
+134, 84, 21,175, 54,213,252,114,217,165,219,162,254,206, 73,123, 69,155,165,151, 85, 98,189,212,181,153,200,251,250,152, 98,205,
+ 94,207,211, 66,125, 33,249, 66,207,184,217,105, 28,241,112,119,198, 52, 13,136,123,133, 20,145,181, 32,125, 46,200, 88, 24,215,
+ 73,113,135, 93,186,103, 67,232,250, 65, 73,115,208,108,244, 80,244, 98, 70,139,248,164,142,148, 76,200,203,228, 70,107, 93,113,
+ 5, 37,245,186,179,162,155,115,179,155,223,223,234, 41,167,154,220,198, 63,208, 83,102,223,157,252, 7,168, 94,198,133, 34,196,
+141, 62,162, 97,159, 51,223,216,211,143,105, 47,135,162,145,106,156, 41,103, 53,120,137, 9,171,188,239,146,135,155,201, 28, 72,
+ 48,150,208,105, 94,116, 22,102,113, 69,156, 43,151, 89,118,115,217,250,241, 63,252,143,255,147,190,124,177,166, 72, 14,114, 85,
+111,103,181,118,215,121, 56,107,114,241,166,163,122,170,153,230, 76, 69,169,151, 47,244,234, 66, 75,205,133,154,133,116, 12,106,
+ 40, 80,141, 52,173,136,240, 50, 65, 40,255,249,137,235, 4, 69, 74, 13, 46, 57,193,101, 23,146,154, 15, 84, 71,161, 37, 34, 55,
+143,229, 52,185,138,110, 84,120, 66,142,106, 34, 78,243,129,145,242,223,231,239, 68, 42, 32,137,212,172, 41, 50,191, 63,123,218,
+115,231,206,121, 79,158, 80, 99, 86,161, 24,218,124,232, 40,242, 61, 37,212,190, 40,171, 94, 83, 42,227, 37,232, 30,127,213,116,
+ 50, 2, 16,247, 13, 93, 62,216,245,203,111,141, 84,238,219,190,193, 24,194,239,125,246, 30, 63,122,247, 6, 68,130, 31,126,251,
+120, 47, 72, 78, 45,188,156,117,240,253,136,223,251,163,127, 12,107,189,240, 12, 0,132,184,195,184,190, 68, 38,118, 93, 47, 34,
+182,190,131, 51, 86,209,166, 66, 42,187, 59,157, 68,188,226, 28,152, 13, 58,215,163,239,122,188,121,243,128,203,245, 90,196,150,
+146,210, 68, 8, 44,163, 77,107, 13, 78, 39,185,100,239,207,119,176,190, 71,231, 7, 13,145,144,239, 73, 8, 81, 64, 32, 28,101,
+ 21,100,141, 70, 82, 74,103,214, 15, 39,201, 45, 15, 27, 56, 69,188,123,251, 22,211, 56,226,237,187,247, 50,102,205,223, 39, 34,
+220,157, 38,116, 78, 2,141,198,241, 36, 17,160, 49, 98,232, 59,128, 19,214,245,138,109, 93,208,121,135,125, 91,192, 49,192, 59,
+135,101, 93,240,112,119,134,239, 68, 81,110,148,136,246,242,242, 34, 57,228, 96, 17, 75,105,240,209, 22, 35, 58,107, 49, 40, 96,
+196,232,126,223,123,185,236,132,154,184, 97,221, 54,108, 33, 32,164,168,123, 68,131, 97, 24, 49, 77, 19,238, 79, 18,100, 49, 14,
+ 3, 12, 25,188,127,251, 86,126,191,113,234, 71, 54,112, 94, 68,113, 68,170,163, 80, 75,218,182, 74,132,235,160,123,115,231,228,
+240,247, 93, 39,211,133,105,146,239, 16, 17,156,122,224,127,254,219,111, 69, 36,168, 99,102,129,146,212, 85, 33,221,168,167, 69,
+ 22, 66, 37, 78,148, 20, 71, 74,214,195,250, 81,248,255, 49, 33,196,128,151,121, 69,136,154,205,173,233, 95, 70, 61,235, 25, 20,
+ 19, 82,158, 38,114,121, 54, 98,146,203, 59,234,218,107, 15, 17, 91,136,216, 83,157, 36,150, 51,179, 92,232,220,158,176,197,131,
+157, 74,215,192,199,213, 89,179,235,206, 19,136, 44,238, 10,170,195, 8, 81,248,255,162, 81, 49,138,146,214, 46,148,155,165,169,
+118,209,114, 70, 27,157, 54,208, 17,217, 90,136,104,168, 16,152,204,106,207,201,105, 89, 37,159,217,237,249,175,165, 99,150, 49,
+123,190,208,243,229,107,141,173, 28,117, 91, 87, 23, 34, 62,140,242,127,185, 91,135, 41, 66,105,100, 78,188,122,241,115, 8, 76,
+ 78, 87,179,198, 98, 28, 6,188,125,247, 6,247, 15, 15, 10, 41, 10,101,109, 36,175,213,170, 22, 64,120, 17, 12,134,243, 30,174,
+235,209,143, 19,134,105, 66, 63,142, 18,172, 20,130, 80, 82, 85,175, 50,158,207, 24, 38, 57, 67,160,249, 16, 48, 84,210,252,194,
+190, 99, 91, 86,196, 61,138,107,131,160,132, 68,215,248,251, 19, 18,107,140, 47,167,194,243,119, 57, 78, 51,143,115,137, 33,234,
+233,148,169,100,199,189,110, 91, 81,101,213,114,162, 6, 21,139,106,235, 58,240,209, 51,172, 32, 43,165,185, 41, 8,184, 94,152,
+212, 82,134,184,229,161, 23,127,153, 88, 76,136,208, 27,131,141, 9, 61, 81,185,144, 83,202, 68, 51,192,186, 30,113,125,213,177,
+ 63,225,127,253, 95,254,231,162, 56,239,156,197, 28, 36, 23,154, 90,208, 1, 1,221, 48, 20,142,243,173,206,141, 52, 17, 41,175,
+ 16, 14,177,115,121, 44, 79,244, 59,228,128,191, 67,211, 95, 4,111,101,238, 94,179,202,243, 16,132,169, 98,106,115, 4,171,169,
+ 85,121,173,163,210,113, 32, 64, 84,194, 34, 76,227,245, 68, 25, 66,181, 53,214,109,148,158, 81, 33, 91,134, 98,152, 82,120,149,
+ 98,239,134, 28, 69,168,138, 92, 82, 52,173,252,206, 74, 40,226, 92,180,148, 61, 89,182, 42, 54,239,105,202,241,139, 40,164,176,
+109,223,241,238,124,143,247,159,125,134,206, 59, 85, 14,203,184,119, 94,100, 71,154, 98,196, 79,255,234,175,241,238,225, 30,159,
+191,121,128,179, 22,203,178, 96, 28, 70,108, 33, 40,180,132,176, 44, 11,206,247,247,242, 46,236,155,106, 14,162,160,120,137, 48,
+ 95,159,229, 1,113,210,181,216,210,217, 16,194,118, 69,180, 26,149,185,206, 0, 34, 18, 44,134,113, 16, 75,150, 53, 32,235,112,
+157,175, 72, 49,193, 88,135, 1, 9,100,123, 0, 81, 59, 74, 96, 89,103, 24,227, 0, 36,236,123, 44, 1,199,224, 0,103, 29,140,
+ 38,174, 25,147, 48,246, 82,213,175,203, 85, 58,232,196, 24,186, 17, 32, 89, 67,204,203,130,161,239, 17, 99,194,186, 46,146, 88,
+ 55, 12,232,251, 1,204, 17,235,182, 1,156,208,251, 94,186,225,152,176,174, 43, 0,153, 18, 88,223,129,149,129,255,225,227, 51,
+188,179, 8, 90, 20,231,221,226,243,245,162,162, 57,233,186,150,117,171, 16, 20, 34, 68, 78,176,218, 9,177,134, 79,156,250, 14,
+ 49,236, 48,198, 10, 5,110,223,133,125,221, 9,118,215, 24,139, 45, 36, 76,125,135, 24, 3,136,128,203,245, 90, 68,139, 68, 6,
+ 91, 88, 0, 35,250,133,101, 93,225,140,149, 66, 67,129, 49, 49, 38,144,183,101, 10,144, 5,176, 93, 55, 96,143, 1,143,143,111,
+ 20, 74, 35,151,195,203,203, 51,126,246,243, 95,203,152, 91,161, 53,204, 81,108, 71, 68,135,243,199,232,243, 19,184, 34,123,101,
+231,169, 33, 49, 36, 48,153,160, 33, 50, 98, 95,146,159,159, 7,250, 50, 74, 39, 21,199, 37, 89,169,100,213, 81, 98,236, 36,129,
+ 52, 28, 83, 41, 82, 50,185, 46,159,185, 73,139, 3,171,222,119, 98, 65,195,230,209,114,233,220,243,132, 83,132, 49,117,186,215,
+112, 33,178,221,139, 85, 8, 71, 16,216,204,186,111,170,192,207,246, 84,113,121, 88, 43,250,139, 93,227,163,133,119, 47,129, 90,
+104,211, 60,179,240,142,101, 52,207, 57,141, 44, 55,115, 13,159,254,102, 44,123,240,184,163, 36, 56, 82,211,181, 27, 97,227, 27,
+215, 92,232, 85, 28, 7,237,196, 51, 66,149, 19, 11,116, 44,197, 50, 33,200, 83,204, 10,180,169,214, 49, 99,107, 40,140, 49, 6,
+253,208,225,221,187, 55, 56,159, 38, 56,103,193, 28, 85,106,150, 21,252, 14, 48, 73, 4,106,251, 10, 56,135,174, 63,195,247, 61,
+ 98, 22,194,129, 17,118,105, 72, 98,144,169,153,245, 94, 35,152, 69,192, 25,131,124,231, 3,133,122,247, 17, 36,194, 53, 74,108,
+113,177,235,169, 46, 34,133, 84,239,150,212,104,218, 89,214,205, 46,169,196,191, 96,230,114,206,121,246, 58, 83, 77, 16,147,139,
+185,233, 12,111, 8,103, 68,124,136, 96, 61,100,167, 83, 93, 40, 19, 53,150,173,196,101,115, 91, 58, 97,237,252,248,224, 2,171,
+ 18, 70, 1,244, 11, 47,205, 24, 3,116, 14, 70,195, 48, 72,173, 84, 41, 49,252,208,131,232, 2, 6,240,249,143,127,130, 95,253,
+226,239,208,235,206,142, 57, 97,221, 2,172,119, 69,141,157,159,139,168,182,147,146,211,219,224,109,153,154,137, 68,222, 91,183,
+ 59,184, 50,210, 62,170,226, 9,255,223,255,203, 32, 26, 99, 26, 42, 92,177,206,149,100,155, 67,160, 14, 39, 86,190,123, 86,179,
+241, 15,153,218,203,123,223,166, 73, 37, 21,119,165,116,244,231,231, 66,172,236,230, 15,235,184, 84, 58,117, 89,190,105,190,242,
+225,251,145,127,157,209, 48, 25,201, 81, 47, 66, 56, 80, 3, 28, 74, 72, 17, 7,251, 36,103,255,174, 32,242,202,161,136,176,225,
+ 60,246,136,249,191,211,196, 26,166,148, 48,207, 51,254,221,223,254, 2,127,240,197,231,120, 60,159,240, 15,126,255,199, 0, 9,
+135,221, 24,194,233,122,197,199, 23,217,127,145,117, 0, 89,252,223,127,241,127,202,238, 60,119,141, 26,100,146,247,170, 40, 72,
+ 77,130,215,125, 97,220,165, 90, 95, 87,137, 7, 61, 79,103,196, 16,241,248,112,198,164,137,109,247, 15,119,184, 92,103, 76,195,
+136,231,215,139,140, 86,157, 4,118,128,228, 98,155, 78,103,236,235, 12,107, 45,246,224,208,247, 30,137, 13,150,117, 69,138,114,
+201,120,231, 48,175, 43, 34, 11,193, 78, 20,228, 61, 78,206,227,114,185, 32,165,128,126, 24,240,250,250,130,101,219, 75, 30,131,
+115, 14,119,231, 73, 47, 27,185, 88, 62,123,247, 94,212,190, 0,214,101,193, 58,207, 24,134,190,208,236,174,203, 6, 50,130,136,
+133,130, 96,182,176, 99, 89, 55, 12,125,143,190,239,241,238,237, 91, 92,175, 87,233, 58,246, 29, 49,202,120,123, 28, 58,108,123,
+196,190,239, 88,195,174,129, 46,178, 58,128, 58, 60, 50,113, 48,197,168, 42,247,161,228, 87,247,157, 67,208,194,106, 11, 65,124,
+241,125,175, 24,205, 21,222, 90,244,125,175,157,100, 64,127, 18,235, 94, 12,146,104,229,189,199, 56,142, 10,222,145,157,187,243,
+190, 8,182, 86, 85,185,147,247,136, 49,225,223,255,167,159, 23,151, 67, 78,102,204, 90,153,188, 54,202,156,139,188, 8,180, 25,
+111,106,140, 92,102,182,147, 78, 13, 9,215,235, 69,213,207, 9,206,100,180, 41, 10,134, 84, 2, 89, 12,214, 32,194,185,146,108,
+169,126,108,103,197,147,110, 21, 91,237,172,140,175,131, 94,242, 81,199,245,166,116,114,218,209, 35,143,152, 81,198,240, 49, 53,
+169,145, 41,119,233,162,184,205,234,115,106,154, 14, 86,202,230, 22, 3,230,149, 52, 91, 93, 82,228, 50, 87,222,154, 30,189,119,
+152,183,189, 32, 75,115, 16, 77, 14, 71, 49,101,173,103,170,191, 28,237, 90, 50,251,175,155, 53, 64, 89,108,226, 56,110, 55,117,
+172,159, 57, 33,148, 47,114,107,224,140, 41, 90,134, 98,201,229, 10,103, 73,234,228,200, 5,168,156, 87, 42, 5,110, 34,102,203,
+164,160,116,221,226,247,238,251, 30,111, 31, 31, 48, 14, 3, 58,239,148, 22,104, 85, 72,105,116,245, 0, 32,133,230, 62,203,107,
+ 78, 41, 36,194,182, 97,213, 53, 74,107, 7, 5,203, 51,176,238,187, 60,143, 41,202,180, 48, 79,106, 52, 70, 24, 32, 45, 92,109,
+ 89,201, 36,229, 22,148, 8,240, 60,141, 97, 58, 0, 71, 93,139,226,228,236, 91,204,152, 62,170,251, 6, 78,121, 71,174, 42,240,
+198,155,156,247,163,156, 47,247,214,190, 70, 92, 69,119, 13, 2,245,144,246,213,144,231,202,165,149,227,254,138,141, 46,147,223,
+ 42,132, 33,104,101,109, 75,162,145, 28,206, 25,122, 79,174, 87,240, 2,227,205,251, 31,225,183, 95,254, 90, 34, 23, 19, 99,213,
+139,223, 54,170,251,220, 25,164,152,244, 75, 67, 13,251,134,235,254,231,128, 7,110,190,148, 77,218, 30,231, 78,158,141, 38, 27,
+161, 1,190, 52,243,122,206, 89,182, 85,144,211,110,245,152,179, 71, 60,219, 79,212,107,154,181,104, 77, 92, 49,181,155, 64,190,
+ 37,249,112,233,244,179,192,177,133,201,180,251,246, 76,184,171,197, 73, 86,135, 86, 94, 51,184,118,235, 37, 54,209, 52,198, 9,
+164,170,176,215,239,208, 81,118, 87,247,242,100,184, 38,247,193, 52, 90, 4,221,113, 42, 59,158, 40, 97,210,139,104,200,202, 80,
+ 34, 88,103, 49, 2,120,243,240,160, 17,160, 27,150,117, 67,215,249,226,233, 44,170,100,223,233,126, 45,226,143,254,248, 79,241,
+155, 95,255, 28,151,215,239,149,252, 37,187,220, 2,245, 48, 14,214,238, 96,178, 88, 35, 99,244,114, 40,156,167, 17,119,100,176,
+ 71,198,186, 94, 97,199,123,172,203,142,181, 95, 65, 36,234,240,211, 56,225,245,245, 5, 72, 1, 93, 55, 97, 15,123, 65, 77, 14,
+125,135, 61, 72,183,123,157,231, 2,223, 97, 4,120, 75, 88, 35,195,119,131, 36,169,113,132,183, 29,250,190,195,135,167, 39,108,
+187, 84,239,172,224, 39, 81, 72, 27,220,223,221, 97, 86,220, 43,129,225,157, 23, 37,242,182,225,241,254, 36,124,106,157,200,197,
+ 20,209,249, 14,150, 32,129, 47, 20, 36, 81,173,243,130,189, 36, 41, 46,242,168,179,239, 58,128, 25,151,203,165, 68, 86,146,118,
+206, 99,215,193, 58,139, 24, 34, 34,145,124, 62,154, 75,190, 46, 43,186,206, 97, 94, 55,137, 49, 86,216,199, 48, 14,210,237, 88,
+192,145,193,190,111,232, 6, 47, 30,248, 78, 46,231, 18,203, 11, 8, 80, 38, 72, 7,220,121, 95,152, 1, 32,194,249,124, 46,171,
+192,125,223,181, 56,215,196,170, 20, 69, 55,160,107,128, 20, 19,254,252,167,255, 65, 85,227,169, 62,187,212,230, 13,228, 9,145,
+ 30,158, 5,197,106, 0, 35, 19,141,204,128,216,182, 5,123, 8,229, 82, 54, 4,108,145, 75, 24, 79, 46, 42, 72,189,234,217,246,
+196,205,254, 59,135,152, 48,128,125, 23, 84,239, 30, 83, 25, 27,155, 36,214, 55, 67,226, 71,222, 98, 44,226, 78,102,161,209,101,
+178, 96, 42,124, 44,170, 35,247,148, 87, 49, 53,245,177, 29,195,203, 47, 55, 8, 12, 92,183, 93, 21,214, 17,169,247,106,237, 53,
+240, 62, 98,234, 59,124,188, 92,229, 60,167,234, 70,146, 66,163,250,225,179,117,214,220, 64,170,202, 37,170,180, 54, 16, 53,169,
+153, 84, 26,166,220,173, 23, 29,150, 10,251,242,222,220,105, 56, 75,205,132,160, 66,183,203,218, 33, 33,196, 37, 29,137, 55, 0,
+ 49,147,155,217,212,188,126, 91, 33, 61, 86,188,232,217,186, 38,246,181, 88,198,244,217,204,155,239, 3, 99, 12,200,119,122,198,
+ 48,182,249,138,176, 45, 50, 85, 81,156,111,142, 75,205, 8,219,220,129, 67,221, 16, 89, 46, 40, 59,247, 88,138,183, 50, 93,224,
+140,242,210,105,102,224, 90,168,100, 59, 29,177,232,196,178, 62, 3, 74, 85,203,221, 57,183, 93,104, 74, 21, 34, 66, 77,124,102,
+ 66, 25,179,100,155, 84,226, 31,140, 98, 43,151, 71, 74, 98, 69,184,145,115,171,232, 74,146,180,132,210, 73,133,242, 86, 18,180,
+168,185,111, 56, 41, 42,128, 52, 12, 69, 68, 40,150, 9,145,229,103,108,187,216,109, 92,215, 21,223,249,182,109,165, 58,246,206,
+ 98, 94,163,232,197, 57,149,145, 85, 82,101,173,128, 32, 12, 14,177,116,168, 36, 61,210, 98,227,216, 14, 87,123, 91, 17,124,229,
+149,194, 45,250,149,240, 9,137, 9,220, 4,220,228, 91,187,196,248, 85,254,124,155,207, 90, 49,179,199, 88,216,255,223,255,181,
+ 43, 23,170, 67,119,110,249, 4,205, 24,178, 22, 29,199,156,120,161, 36,229,176,133,234, 18,104,167, 52, 68, 56,250,224,179,199,
+ 61, 11, 78, 81,244,117,197, 37,193,104,166, 62, 58, 58,244,106, 89,241,234, 45, 15,251,134,126, 24,224,172,195,245, 58, 99, 94,
+ 22,252,242,203,223,224,110,232,241, 39, 63,249, 76, 46, 34, 0, 41, 69,120,107,112, 62,159, 96,191,127,130,177, 14,251,190,203,
+ 72,122,185,226,243, 31,255, 33,126,254, 87,223,105,101, 47,214, 47,164, 4,178, 22,127,240, 39,255, 37,254,242, 63,254, 91,196,
+196,232, 44,138,119,248,186,238,232,172,218,154,188,216,175,174,251, 6,115, 93,244,123, 96, 48,175, 27, 58,111,209, 15,163, 88,
+138,172, 71, 76,162,142,206, 22, 49, 16,193, 58,177,123,205,235,162,170, 98,131,105,234,225,189, 28,190,243,188,128, 72, 46,255,
+243, 48, 10, 50,148,129,206,122, 37,142, 1,211, 52,136,104, 76,187,203,196, 9,203,178, 96,217, 54,220,223,221, 97, 91, 69,169,
+158,225, 22,167,113, 68,136, 1,151,235, 82, 88,244,114,184, 49,182,101, 17, 34, 91,140, 5,117,250,244,242, 34, 32, 21, 0,155,
+134,174, 12,195, 80,240,178,121, 61, 49, 24,161,233,145,177,152,151, 5, 96,198,117, 17, 66, 92,190, 70, 30, 31, 31,203, 42,131,
+ 1,172,235, 2,239,122,165,187, 65, 98,105,195, 14,195, 70, 19,231, 58, 92, 46,151,162, 17, 25, 70,205,255, 6, 99,232,122,108,
+219, 86,196,115, 89, 29, 47,151,232,142,174,235,117,221, 98,224,188,199, 95,252,244,103, 18,220,129,234,237,174,157, 96, 45,170,
+179,234,186, 40,161,157,215,184, 77,104,119, 21,176,169,128,216, 24,131,117,143, 50, 66, 85, 81,240, 22, 83, 77, 79,203,207,181,
+170,235,161, 68, 51,163, 69, 67, 72,245,249, 54,134,176,134, 40,206, 3,237,220, 73,221, 71,137, 24, 33,164,166,216,231, 82, 32,
+196, 44,188,108, 38,110, 45,190, 83,154, 29, 85,168, 83, 73, 70, 62, 60,203, 89, 9,158,146,164,149,101,237, 84,239, 61,250,232,
+ 48,168,197,145, 90, 44,118, 81,166,215,211,220,182, 65, 23, 45,205,173,201, 75,135, 90, 5,185,129,215,180,127,165,134,187,158,
+ 11, 7,103,108,209, 85,212, 85,109,123,161, 75, 39,155, 97, 78,104, 68,131,108,164,160,162,132, 27,109, 1,149,162,202, 88,139,
+ 97, 24,240,238,221, 91, 81,187,159,207, 50, 5, 84, 81,166,136, 23, 83,225,249, 51, 3,198,249,114, 22,165, 20,228, 28,212, 20,
+172, 76,182, 19, 2, 31,107,140,172,174,154,213,238,150, 5,131, 41, 99,106,153,133,233,160,205, 16,115,130,104,241,162, 54,214,
+210,172,214,112, 29,148,220, 1, 52,105, 31,174,126, 9,242, 46,134, 11,209,171,160,250, 32, 95, 74,210,191,242, 77,202, 14,171,
+120,130,154, 24,210, 35,199, 61,213, 49, 87,179, 39,201,166, 47, 50,226,247,204,197,185,209,139,157,180, 99,207,223,147, 2, 13,
+ 41, 76, 92, 66,103,101,172, 37,194, 19, 86, 57,191,252,255,214,123, 56,231,240, 95,252,217, 63,195,127,248,247,127,161, 34,164,
+132,206,139,157,168,235, 28, 76,115, 57,178, 34, 29,203,151,189,217,239,211,205,126,253, 22,103,123,168,103, 50, 17,141,203, 80,
+ 94, 11,130, 58,108, 42,102, 53, 13,129,169, 5, 3, 55,235, 18,174,225, 46,124,116, 6, 80, 9,193,107, 33,255,116,144,218, 19,
+ 90,148,227,177, 0, 33,224,200,112,207,151, 54,253,208,214,191,238,244,179, 31, 54,131,101,242,196,198, 52,221,255,167,172,223,
+ 58,233,224,134,130, 85,153,186, 50,162,167,140, 32, 46,217,238,245, 0, 51,106, 27,154,215, 13, 33,236,152,198, 1,215,235, 5,
+227, 48,226, 23, 95,126, 9,239, 28, 62,127,247, 14, 95, 60,222,163,235, 59,188,188,188,160,239,122, 61,224,163, 28,236,206, 35,
+197, 93, 30,192,148,224,125,143,126, 58,137,133,196, 88, 21, 70, 18,146,250,217,191,253,250,215, 34, 2, 91, 5,104,228, 12, 97,
+ 11, 12,107, 2, 0, 11,231, 60, 44,203,118,244,225, 52, 97,156, 38,124,246,254, 45,172,115,120,126,126,198, 60,139,232,168,115,
+ 22,195,120,130,247, 86, 2, 36, 20, 28,115,189, 94,209,117, 61,140,113,186,251,223,176,199,128,209, 91, 17,203, 45, 51, 18, 3,
+167,161,199, 64, 61,214, 77,160, 49,222, 0,219, 30,145, 0,140,195,132,125,219,113, 93,132,142,215, 57,135,121, 77, 88,214, 5,
+222,121,241,119,199,128,190,235,225,157, 4,159, 48, 39,172,151, 80,160, 48,219,182,227,117,121,193,121, 28,139, 16,168,239, 58,
+116,189, 36,157, 57,235,144,144,224,157,136,224,214,117, 5,136, 17,246,132,157, 3, 46,151,171,210,234, 8,243,186,105,186,161,
+116, 94, 70,199,220,227, 56,160,239,123, 88,235,196,234,100, 13,194,190,149,176, 24,163, 44,128,204, 27,112,206,149,159, 37,172,
+128, 84, 38, 47,210,129, 75,113, 70,186, 55,142, 57, 28,136, 80,246,234,121,170,231,156,195,191,253,233,207,176,228,105, 69,217,
+157, 27, 69, 90,152, 67,172,130, 41,162, 41, 87,163, 98,227,142, 61,213,152,215, 92,188, 7, 93, 7,154, 44, 41,213, 54, 58, 22,
+163,148, 80, 9,179,133,177,164, 83,230, 72, 87,212,241, 29, 51,149,149,132, 81,110, 64,190, 60, 83,168,172,247, 92, 32,100, 27,
+ 27, 55, 82,100, 99,140,126,198,249,153,205, 77,149,184,130,138, 24, 87,159,195,148, 82, 45,104, 20,195,157,152, 64,219, 94,158,
+241,206, 57,141,131, 38, 93,151, 53,231,134, 90,199, 68,213,126, 92,155,214,243,191,238,197,243,251, 43, 9,174,109, 87,142,131,
+173,149, 90,144,140, 10,230, 72,115,212, 91, 47, 16, 39, 46,161, 39, 41, 69,157,142,180, 10, 96,109,152, 56,171,224,179,125,171,
+254,207, 90,139,105,156,240,246,237, 3,206,119,103,156, 79, 83,105, 98,140,213, 48, 33,142,101,210, 42,234,118, 13,183, 77,177,
+230, 22,232,107,203,250, 47,110, 92, 60, 53, 67, 0,205,218,154,138,207,156, 72,196,176,100,244, 51,210,140,247,226, 40,144,222,
+ 87, 62, 47,174, 18,230,204,138, 48,156,202,245,238, 82,189,189, 85,249,220,194,102,248,144, 24, 83,147,182,210,193, 74,197, 45,
+170,156,110, 5, 91,138, 12, 84, 91,129, 57,146, 82, 11,189, 76, 88, 6, 92, 98, 94,107, 20,106,245,133, 37,229, 22, 59, 91,145,
+136, 65,197, 35,134,129, 0, 70, 12,242,218, 67, 2,124, 55,192,247, 3,254,233, 63,255, 23,248,233,159,255, 27,165, 85,201,168,
+108,217,163, 48,187,117, 20, 19,243,155,167,221, 9, 55, 81,169, 21,206, 1,207, 8, 66, 0, 0, 31, 18, 73, 68, 65, 84, 83,175,
+228, 12, 80,160,223,177, 33, 47,176, 22,131, 31,228,231,213,132,153,102, 44,223,242,220,233,144,116,138,102, 83, 86, 99, 87, 81,
+133, 60,213, 74,118,188, 74, 75, 44,108, 67,151,107,187,243,246, 87,211, 15, 94,198,181,248, 56, 70,204,102,228,133, 24,214,184,
+101, 29,128, 15, 56,161,124,102,230,104, 85,131,106,244,175,126,122, 42,197, 80, 30, 23,230,200, 87,161,137,201,151,127,143, 1,
+167, 97,146,184, 76, 43,162,153,135,187, 59, 73,226,138,223,224,235, 15, 31,241,197,219, 71, 9, 35, 9, 17,195, 56, 2,203, 6,
+ 80,196,232, 45,158, 47, 75,241,154,126,245,213,175,240,230,221,143,139, 54,209,105, 32, 13, 89, 3,195,140,249,242, 36,145,148,
+219, 43, 82, 76,216,148,204, 70, 96,244, 93,143,161,243, 18,184,226,140,226,145, 19,158,158, 94,208,247, 30, 67, 63, 96,221, 86,
+133,168, 4,172,235,130,152,188,116,143,138,242,188,191,127, 68, 74, 65, 46,240,109,195, 30,119,124,241,197,143, 4,162,178,110,
+ 56,223, 61, 96, 15, 81, 64, 42,104,193, 65, 14,140,136,206,146,132,178,120, 91,226, 75, 95, 46, 51, 58, 47,228, 41, 71,178, 23,
+ 31,250, 14, 33, 6,244,125, 15, 38,131,215,151,103, 81,198,159, 79,248,248,244,132, 61,136,160,205, 25,131,192, 22,235,182,192,
+ 91,139,167,231, 23,156,207,103,156, 79,167,242,158,229,227,244,114,157,165, 3, 79, 9,167,105, 44,197,215,216,123,172,219,142,
+ 85,115,162, 9,194, 70, 95,150, 69, 2, 87,166, 19, 98, 20,136,134,115, 22,227, 56,214,206,159,128,113, 28,203,202,109,221, 86,
+ 44,203,138, 24,165, 0,233,124,135,160,140,121,129,144,152,146, 40, 54,244, 3, 66,144,176,152,160, 69,140,243,146,148,246,211,
+191,250,107,172, 10,106, 49,138,110, 45, 97, 39, 55, 93,161, 83,244, 40, 52,217, 76,198,165,161,100, 21,100,115,166,205, 29,158,
+ 66, 78,146, 78,230,168,132,236,112,225,156,147,145, 98,174,245,101,179,254,243, 34, 60,212, 75, 95,238,105, 3, 86,144,137,160,
+ 63, 21,188, 85, 45, 72, 5,222,146, 26,234,103, 22, 41,138,162,187,133, 66,213,194,161, 77, 35,203,141,218,141,178, 22, 9,192,
+ 22, 18,136, 52,125,111, 19, 1, 93,231, 44,150,180, 23,181,119,228,132, 94, 47,179, 84, 38, 17,181,232, 41,244,182,102, 12,111,
+168, 17,196,181, 41,148,205,186, 45, 95, 78,217, 39,110, 26,230, 59,105, 94,134, 40,252,213,171,175,130, 56, 46,233,107,106, 79,
+164,230,250,207,197, 75,179,254,200,152,218,243,249,132,135,251,123,156,207, 19, 78,211, 36,223,135, 4, 36,142,170,170,183,136,
+ 1, 5,252,195,166, 82, 57,147, 6, 3, 25,103, 21, 48,147,138,144, 49,243,248, 73,163,111,141,211,220,243,176, 87, 58,186,134,
+ 72,177, 22, 30,153,118,136,227, 82, 90,254, 91,204,117, 37,106,106,204,183,105,222,123, 6,224,114, 85,147, 82, 53, 70,112,170,
+224,153, 18,197,209,168,213,137, 53,213, 44,239, 86,213,166,129, 28,248, 82,246,168,117,156, 92,118, 46,141, 5, 75, 53, 84,149,
+159,206, 77,196, 94,249,204, 77, 65,207,108,235, 94,170, 47,107, 85, 36, 21, 19, 58,239, 0, 11,120, 24,132, 32,202, 94,178, 14,
+253,120, 66, 63, 78,248, 63,254,247,255,173,238,201,152,177, 51, 43,208,129,203, 56, 51, 95,208, 18, 20,224, 10,250,241,182,219,
+ 68,147,251, 75,191,107,230,221, 96, 83,139,198,128,110, 46,244,230, 61, 74, 21,244,168,117, 13, 29,187,241, 92, 32,229,202, 92,
+211,244,242,195,146, 88, 47,214,131,230,190,197,217, 82,209, 2,148,135,200, 84, 58,221,173, 10,245,214,222,152,242,202, 33,179,
+219, 27,149, 45, 39, 70,178, 57,198, 85,138, 54,250, 36,122,166, 22, 66,109,132,239, 81,111,223,140, 68,111, 74,139, 61, 70,116,
+142,176, 94, 47, 56, 15, 29,190,249,240, 17,211,249, 12,171, 84,184,169,247,248,127,254,211,223, 32,110, 11,222,222,159,177,135,
+160,108,106, 86,154,149,240,207, 7,111,241,210,168,240,215,249, 21,215,203, 83,249,110,167, 40,130,168, 44, 96, 50,214, 96, 24,
+ 79,120,122,185,168,183, 62, 32, 68,194,253,121,144, 80,150,121, 17, 23,197,158,112,238, 12, 98, 4, 76, 39,223,165, 61,132,114,
+240,159,239,238,203,106, 37,196, 36,221,168, 35,108,187, 20,199,203,186,128,140,208,219, 94, 95, 94, 68,176, 54,140,184, 92, 47,
+162,104, 15,162, 94,191,187,187, 23,122, 27,106,156,166,119, 14,190,115, 88,215,103,217,193, 90,139,144, 18,186,126, 64, 63, 12,
+184,155, 70, 24, 67, 88,214, 21, 33,236, 88,183, 13,125,223, 97, 93, 87,124,243,221, 7,133,184, 68, 24, 18, 16,205,188,110, 2,
+211,177, 22,159,127,246,153,128,103,214, 21,175, 87,233,198, 67, 12,146,101,175,164,175,243,249, 36,227,113, 21,133,109,251,142,
+ 45,136, 8,168,115, 78, 99, 82,229, 18,158, 78, 39, 56,107,209,247, 30,251, 30, 48,207, 87, 25,201, 63, 60, 0, 32,108,219, 10,
+132, 32, 29,151,230,154,119,189,199,190, 19,166,105, 44, 88,101, 3,201,153,103,146,117,128,181, 14,235,182,105,106, 30, 97,236,
+188,248,202, 67,196,207,254,230,151,226, 23,215,209,126,182, 80, 81, 35,216,202,227, 82,103,189,140, 70,213, 26,148,195,134,136,
+220,161, 80, 55,250,220, 24, 83,119,241,217,102,196, 96, 5,100,213,148,195, 24,147, 80, 1,203,106,179,249,247, 58, 25,204, 23,
+130,165,154, 88,152, 95, 27,140, 90, 83, 97,138,157,148,218, 32,166,195,142,222, 22, 87,210, 97, 2,219,216,221,140, 54, 89,197,
+ 77,211, 90,104,115,103, 15,198, 22, 19, 8, 1,243, 38, 97, 74,222, 89, 44,123,128,105,210, 20,161,239,167,117, 85,125,222,138,
+225, 36,244,172, 33,142,154, 6,220, 65, 45, 65, 52,223,130,242,123,108, 38,186,153,106, 91,206, 36,211,220,220,101, 49,156, 8,
+227,162, 94,164,124,104,128,154, 68,237, 34, 46, 43, 8, 47, 34,220,223,159,113,119, 62,225,116,154,112, 58,157,165,232, 83,171,
+152, 76,160, 13,194, 46,133, 99, 73,152,211,134, 50, 79, 46, 10,179, 37, 85,155,119,106, 70,228,229,175,170,127, 0, 71, 45, 96,
+ 76, 21, 41,171,128,174, 93, 13, 84,132, 48,202,251, 88,162,186,155,137, 46,163, 21, 24, 2, 46,101,249,115,249,144,142, 97, 26,
+ 92,192, 32, 92,128, 41, 92, 70,173,169, 8,219,228,135,235, 5,147, 95,108,131, 49,229, 50,150, 54, 5,183, 74, 77,151,137,198,
+ 2,126, 68,159, 42, 79,150,228, 15,237, 77, 38, 22,169,158, 46, 11,119,138, 53, 12,136, 0,250,174,199,221,253, 3,190,253, 13,
+225,229,245, 73,196, 55,168, 65, 38,206, 16, 54, 37, 30,229,209, 19,114,145,208,185, 67,165,116, 16,149, 52,209,105, 84,116, 6,
+205,245,213,100,201,114,179,143,166, 6,150, 94, 60,254,249,131,203, 23, 93, 66,217,195,215,168, 88,110,134,233,220,180,238,212,
+212, 7, 85, 92,152, 63, 78,211,190, 98,250, 29,123,252, 3,184,160, 13,215,249, 52, 72,167, 88, 19,243,230,134,107, 0, 12,116,
+114, 96, 90,165,127,238,108,110,168,118,200,255,172,252, 25,171,152,168, 0,104,218, 43, 95,185,212,243,182, 99,236,122,252,246,
+219, 15,120,152, 6, 60, 61, 63,227, 60,141,120,157, 87,124,249,213,215,216,214, 5,255,224, 39,159,171,154, 88,148,170, 49,138,
+221,146, 99,192,208,117,152,198, 17,252,241,169,164, 55,197,148,240,221, 55, 95,138,215,152,160,196, 64, 5,127,232, 30,204,169,
+143, 20, 68, 24,198, 30, 32,139,176, 71,128,119, 33,160,245, 29, 24, 66,162,147,145,188,140,171, 55, 85,183, 62, 60, 62,162, 31,
+ 70, 77, 32, 11,194, 16,167, 14, 33, 70,201, 19, 79,178, 87, 63, 77, 19,150, 69,198,241, 32,194,243,235, 51,238,207,247, 72, 49,
+ 96, 89, 23,156,166, 9,251,190, 98,221, 2,222, 60, 60, 2, 96,188,190,190,168,175,120,135,243, 29, 58,146, 29,222,188, 44,240,
+206, 97,236, 28, 98,140,152,151, 13,214,245, 24,198, 17, 33, 70, 60,191,188,106,230,184,215,252, 10,131,203,124, 45, 69, 87,223,
+143,184,191,191,199,190, 73,196,235,188,109,101,143,234,172,197,148,173,101,206,226,229,229,165,196, 77, 70, 45,134, 88, 89,252,
+167,105, 40, 19,191, 97, 24,208, 26, 31,129, 4,239, 29,188,115, 24,186, 94, 83,214,228, 25, 93,230, 69, 68, 96,170,110, 63, 77,
+ 83, 57,111,146,162, 82,103,157, 6,120,235,132, 47, 96, 12,162, 79,106, 21, 18,145,210, 95,254,237,175, 68, 83, 99, 44, 78,227,
+ 25,159,189,127,123,240,131,103, 71, 72,198,195,198, 36,158,224,148, 12, 16, 67, 19, 48,226, 26, 38, 19,215,240,149, 6,158,117,
+ 76, 18,195,225,124, 51,182, 57, 63, 18,127, 50,150,181,153,169, 79,212,132,142, 80, 89, 45, 24,102, 36, 52, 99, 89,237,216,147,
+ 70,169,150,132, 72,109, 15,179,189, 44,198, 88,196,197,249, 0,202, 41,111, 89,137,157,211, 46,185, 48, 66,170, 11, 42, 38, 96,
+ 69,130, 91, 55,112,231,213, 66,166, 24, 86,189, 12,114,225, 2,189,112,217,164, 2,232,104,157, 75, 69, 8,119, 48, 20,213,248,
+215,156, 99, 97, 85,103, 85, 25,238, 71,221, 81,158,108,164,134,176,151, 50,223,226, 48, 39,204, 1, 83,212,252,243,220,229, 10,
+134,245,225,254, 14,167,105,196,249,124,214,239, 39,151,137, 32,235, 56, 63,134, 80, 3,203, 74,206,123, 22, 61, 82, 61,207,152,
+139,237,173,164, 95,150, 59,178,158,129,164,194,196,124,166, 39, 69,239,230,247,239, 72, 44,107,177,165, 26,212,149, 27, 69,110,
+238, 10, 82,203,176, 54,173, 14, 69, 97,151,133, 94, 55,240,152,102,234, 87,189,109, 64,202,187,224,146, 6, 36,187,221,164,163,
+ 14, 83,236, 14, 56,140, 98,179,127,207, 20,175, 20, 55,133, 1,129,217,192, 24,174,232, 68,237,230, 89,199, 69, 22,212,140,171,
+229,129,204,100,167,252,243, 35, 8,190, 31,113, 58,223,131,163,124, 40, 57, 29,170, 38,159, 81,121, 72, 80, 72,105,242, 26, 69,
+100,101, 10,210,182, 90,215,154, 38, 51,255, 14,194, 81, 71,160, 62,248,131, 31, 15,124,116, 24,228,177, 89,251,225,165,155,112,
+ 4,208,193,113, 94,190,170, 25,100,147, 10, 54,253,208, 82,231,202,142, 27, 75, 58,181,110, 55,166, 67, 5,121,164, 13,209, 39,
+227,247,106,171,227,114, 96, 1,233,112, 40,213, 46, 32,105, 14,114, 37, 16, 86,253, 36, 53, 8, 97,220, 4, 49, 51,142, 63,189,
+ 30, 82,121, 99,232,213,234,247,230, 44,224,149,109, 93,113, 37,194,235,229, 2,195, 9,111,238,196,171,253,238,205,219,114,104,
+ 25, 71,216,230, 43,186,190,195,124,157,209, 43, 41, 48,175, 25,172, 22, 16, 49, 69, 36,178, 7,154, 21,116, 7,183,239,171, 88,
+176,186,161,100,120,247, 67,143,206, 89,236, 81, 42,121,103, 25,123, 74, 24,144, 52,211,187,199,221,195, 27,132,176, 34, 37,224,
+187,239,191,215, 36, 57,136,176,203, 88,164,109,199,105, 58, 99, 89, 23,112,138,248,240,225, 59, 12,195, 40,151,242,188,160,115,
+ 14, 79, 79, 31,224,252, 8,239, 61,182,109,215,206, 64, 59, 92,142,240,206,227,155,143,223, 32, 36, 8, 73,110,144,156,247,222,
+119, 5,141, 26, 56, 98, 26, 78,184,191,191,195,243,243, 19, 94, 95, 47, 66, 90,235, 58,217,117, 15, 35,214,109, 5, 72, 32, 45,
+ 14, 6,251,186,225,227,199, 39, 12,157,199,124,189, 10,100,199,251, 34, 60,154,231, 89, 20,228, 26, 95,154, 18, 99, 24,122,204,
+171,224, 90, 67,148,144, 27,239,124,137,137,140, 12,108,235,138,238,124, 66, 84,192,141, 87,242, 27, 89, 81, 5, 67,187,153,196,
+170, 22, 14, 1,247,231,179, 80,225,116,215, 31,213,150,103,141,193, 52, 12,216,118, 97, 15, 12,253,160,221,178, 8,209,254,242,
+111,127, 13, 64,220, 6,167,233,140,127,253,175,255,165,176,223,213,119,106,116,244,189,173, 11,214,249,130,176,109, 48, 78,212,
+237, 32,194,182, 44,216,214, 89, 20,201, 89,112,197, 92,146,210,184,209,249,228,168,208, 50,215, 76,245,249,168,251, 94, 41, 70,
+ 24, 50, 46,142,186, 54,136,121,116,156,244, 34,141,114,145,228,253, 54,145, 45, 58, 22,209, 51,201, 26,140,179,247,253,112, 54,
+ 49, 96,185, 4,211,216,204, 77,103, 42, 98,189, 10,130,225, 34,158, 19,235,106,157,192,165,188,250, 76, 50,197, 92, 67, 44,183,
+113, 38,226, 25,146,132,185, 2,212, 34, 66,164,170, 24, 38,106,211, 64,142,235, 68,202,175,181,153,202,230, 75, 49, 49,212, 74,
+152, 10,179,131, 27,195, 76,158,160, 36,101, 45, 20, 91, 87,126,143,228,162,104, 48, 95, 92, 26,140,252, 66,198, 97,196,221,221,
+ 25,211, 56,225,124,119, 70,223,139,130, 61, 42,112, 71,238,133,154, 79,144,125,189, 92, 62, 39, 21,222,101,119, 79,203, 14,105,
+ 99,176,185,238,203,141,105, 26, 65,157, 52,212,245,182, 22,129,135,254, 58,239,203,179,195,137,245,123, 88, 93, 70, 6, 57,215,
+252, 56,163,117,169, 81,127, 19,227, 96, 63,251,100,170,156, 36, 8,128, 20, 47,150,178, 2,190,189,196,178,239,188, 0, 28,232,
+208, 19, 26, 21,197,193, 52, 2,173,194, 95,215,139, 79, 71,223,121,196,147,242, 8,167, 73, 51,203,168, 90,178,132,200,154,208,
+ 86,210,216,128,126,156,208,245, 3,182,249,162, 76,248, 92,141, 2, 73,131, 25, 72,119,181,156,211,147,244,245, 12,189, 23,132,
+169,242, 27,152,248, 38, 41,173, 73, 82,205,100, 54,237,198,211,205, 27,124, 96,175, 55,200, 87,106,110,226, 34, 56,212,142,189,
+ 28, 16,196,135,152, 87,202,255,141,118, 50, 64, 53, 49,175, 88, 13,193,213,123,107,142, 14,183, 6, 23,223,216, 9,235,191,224,
+ 6, 32,147,187,124, 58,112,153,169, 68,214,102,117,112,107,196, 43,123,114,115,187,181,168, 12,130, 67, 49,212, 44, 11,202,207,
+206, 2,159, 66, 33,180,184, 46, 11,222, 79, 30,215,109,199,155,251, 19, 66,136, 26,238,209,225,250,244, 2,196, 25, 95, 45,155,
+160, 85,251, 65, 15, 32,198,186,111,101,223, 57,140, 35,188,115,216,131, 90, 71,172,208,208,176,239,101, 98,144,149,250, 25,113,
+186,239,226,211,126,190, 92,225,116,175, 43,193, 25,226, 41,157,151, 25,222, 89,188,185,191,199,233,124,134,243, 22, 47,215, 25,
+221,190, 75,190,185,181,184, 63, 77,184,206, 87, 76,195, 0,168, 72,204, 90,139,121,153, 49, 12,163,176,208, 83, 68, 8, 17,207,
+207, 79,120,184,127, 68,140, 1,157,239, 48, 78, 61,150,121,150,177,122,140,248,236,221,123, 92,231, 43, 98,100, 60,191, 60, 33,
+ 36,224,225,124, 6, 25, 33,229, 69,205,109,207, 34, 50,231, 28, 98,220,241,252,252,132,203,229, 82, 44, 94,155,230,152,131, 19,
+238,166,147, 8, 77,247, 13,219,182, 98, 75,140, 24,118,204, 73, 86, 91, 33,238,216,230, 80,166, 82, 91,136,136, 41, 98,234, 58,
+ 24,245,144,239,251, 46,182, 43, 16,222,220,223,201,251,170,116,198,152,132,113, 29, 53,183, 28, 32,144, 23, 60,237,186,174,194,
+112,119, 30, 49,136,176,208,104, 39, 51,244, 61,144, 61,250,170,178,239,135, 81, 38, 28, 42,102,179, 78,210,208,146,194, 90,158,
+ 47, 87,124,249,237,147, 4,214,116, 61,166,243, 61,254,251,255,238,159, 23, 74, 89, 17,178,133, 29,235,114,197,190, 46, 72,251,
+ 94, 2, 65, 12, 73, 22,189,165,132,113, 24, 74, 58, 88,158,214,148, 14,154,204, 15,235,105,202,161,156, 84, 19,146, 10, 12,134,
+155, 60, 6,153, 8,136,245, 41,239,131,147,210,232,114, 17,192,133, 52,151, 10, 84, 43,177, 92,102, 73, 45,123, 81,109, 80, 81,
+127,111,216,133,211, 47, 88,215,116, 32,208, 65, 29, 14,173, 42,205, 57, 87,132,206,117, 76, 74, 53,139, 66, 69,199, 8, 17, 54,
+ 7,147, 52,207,115,140,226,124, 48,104, 98, 67, 53, 78, 58, 71,208,114, 70,199,222, 32,196,169,109, 24,145,100,215,156, 18,216,
+ 74,126, 67, 50, 0,113,147, 44,169,148, 56,110, 46, 93,106,162,169,185,100,123,100,190,123, 37, 83, 18,100,253,114, 58, 77,184,
+187, 59, 99, 28, 39, 76,211, 8,231, 68, 35, 35,159, 65,210,208, 26, 41, 90,172,174,107, 4,214, 20,170, 70,129,147, 78, 80, 69,
+127,147,199,222,165, 59, 79,169,100, 75, 80, 14,150,201,103,103, 99, 15, 47,241,215,124,140, 37,175, 65, 89, 84,245, 69,249,114,
+ 55, 71, 81, 97, 9,247, 42, 74,110,130, 75,137,111,222,232, 99,252,106, 70,195,150, 8,209,124,153,235, 14,132,155,170, 21, 13,
+107,156,155,145,123,241, 88, 55,194,179, 44, 12,104,129, 39, 69,253,173, 21,144,105,168, 75, 48, 4,167,255,204,144,168, 75, 83,
+ 2, 44, 51,130, 64,184,244, 75, 36,255,108, 28,207, 8, 33, 96,219,150, 34,216,201,130,184,172,248, 55, 5, 56, 83,227, 71,141,
+ 42,136,169,181, 95, 53,251, 95,106,175,228,146, 76,214,140,145,112, 16,180,214, 98, 6, 55, 64,233, 38, 54,177,221,105,151, 2,
+ 1,181, 88, 96,220,128,101, 18, 14, 73,245,100, 18,110,234,226, 34,166,177, 69,151,222,188,190,219,194,162,253, 35, 53,136,224,
+210, 89,163, 82,253,184, 73,123, 43, 92,249,198, 39,223,186,226, 12, 29, 61,249, 69, 60,168,144,157,131,206,128,154, 62,157, 36,
+210,182, 21,250, 36, 38, 60, 45, 59,222,158, 71,124,253,241, 21, 29,201,248, 22, 25,169,186,239,248,226,205, 35,186,206, 99,240,
+ 30,235,190, 97, 95,247,178,171,218, 66,194,182,173,184,159, 38,124,247,252,162,129, 14, 12, 52, 15,171, 51,245,195,203,202,233,
+190, 31, 48,140, 14,215,101, 69,231, 60,198,206, 97, 13, 17,222, 36,236, 33,194, 26,134,115, 3,158,175, 51, 96,128,119,239,222,
+227,205,253, 35,230,121,198, 52,201, 78,254,235,111,191,198,208,245,248,254,195, 71, 88, 3,244,189,116,223,243,124,197, 55,223,
+126,141,251,187, 7,220,157,207,216,211,134,183,111,223,130, 96, 5,178,227, 13,174,215, 11,150,101,193,195,253, 3,246,176,225,
+229,114, 5,167, 8, 99, 44,238,238,238, 48, 12,187,106, 29,212, 3,155, 34,182, 53,192,121, 81,170,115, 74,136,208, 28,110,223,
+ 9,114, 18,140,117, 94,117, 68, 27, 16, 82,194,249, 36, 29, 52,169,204,150, 89,139, 32,239, 49,175,146, 74, 21, 82,230,151, 27,
+ 60,222, 11, 58,115,213,236,244,172,142,238,123,177,227,101, 26,216,188,108,165,251, 25, 7,225, 70,120,239, 97, 20, 87,155, 11,
+202,190,239,241,178,111,205,232, 18,101,138, 34,130, 36, 46,138,248,174,235, 84,181,109,225,141,145,130,194, 27,124,253,225, 9,
+223,191,204, 0, 25, 12,227,132,183,239,223,227,191,250,167,127,170, 5,164,129,194, 47, 36,104,101, 93,176,175,179,118,254, 50,
+242, 77, 41, 34,174, 77,119, 85, 2, 69, 90, 31,117, 62, 72, 83,133, 61,115,235,171,110,226, 67, 73, 87,135, 41,137,125,182,209,
+135,101,212,169,179, 6, 72,174,185,240, 83, 25,177,139,168, 43, 53,107, 80,174,171, 66,189,232,243,232, 57, 54,221,127,142, 20,
+ 77, 77, 71, 24, 53,148, 71,206,196,189, 4,226,196, 24,193,197,187,142, 34,136,164,146, 42, 39, 63, 47,234, 89, 71,198, 20,199,
+144,120,176, 3,194,110, 96,108,106,194, 56,249,216,252,128,144,148, 27,157, 3,175,218,222,132, 33,175, 47,236, 59,156, 77,226,
+240, 96,125,223,178,240, 45,175, 10,178, 93, 77,139, 28, 38, 58,228, 98,180, 77, 72,177,211, 90,131,211, 56,226,116, 62,227, 52,
+ 77, 24,198, 65, 32,100, 86,115, 60, 82, 77,153, 36, 83,243,207,203, 57,172,200,224,156, 61, 95,167,213, 26, 19,174,250, 15,197,
+104,214, 27, 90,161, 75,197,218,215, 98,176,181, 64, 78,229, 44,229, 38, 28, 53, 39,213,165, 98,165, 38, 6,184, 9, 9, 99, 52,
+160, 47,213, 94,136,219, 68,133,114,252, 3, 22,166,118, 12, 92,194, 89,242,126,183, 8,203,234,238,247,208, 13, 38,169,214, 12,
+ 25,189,248,143, 43, 93,163,185,218, 98,179, 48,229,139, 83, 2, 69, 83,106,124,207, 53,100,166,211, 41,129, 81,101, 35, 57,139,
+ 45, 68, 24,141,165,203, 86,171, 4,160, 27, 39,124,252,254, 27,173,100,185,208,205,162,126, 33, 50,127, 25,168,225, 26, 80,113,
+134,181,166, 25, 47, 31, 36,232,229, 2, 71, 27, 65,202, 73, 55, 8,141, 47,189,245,234, 39, 32,153,132, 82,116, 53,136,213,186,
+ 87,175,146,135,164, 84,191,226,255, 71,203,157,111,246,222,233,232,245,172, 69, 72, 14, 87, 48, 85, 31, 65,109,210, 27,181, 73,
+177,109, 42,174,214, 12,121,239, 77,135,194, 68, 88,239, 45,251, 56,231,165,215,221, 4, 19, 29, 11, 4,194, 33, 36,134,155, 66,
+230, 80,248, 28, 88,242,116,128,225,136,207,216,193,242,174,201, 79, 9,123, 98, 60, 95,174,248,234,219,239,225,140, 81,102,129,
+193, 60, 47,216, 66, 64,239,156, 68,149,190, 94, 16,173, 81, 70,188, 45,211,149,236, 26,176,100, 64, 22, 37, 44,195, 20, 43,161,
+252,121,247,109,193, 23, 63,254, 99,124,245,245,215, 24, 58, 25, 25, 51, 51,130,113,146, 49,238, 28,188,101,188,125,184,131,113,
+ 30,142, 12,214,101,193,203,203, 11,186,206,225,195,199,103,225,177, 51,224,156,193,243,243, 11,158, 95, 47,248,252,139, 47, 0,
+ 0,119,167, 59, 12,157, 88,240, 78,231, 51,182, 93, 58,200,138,193, 37, 12,253,136,196, 44, 86, 47, 11, 44,123,192,101,222,225,
+ 44,193, 57,143,215,101, 70,239,133, 51, 63, 47,139, 92,172,234,135,151, 64, 23, 25,197,103,100,174,176,214, 71, 60, 63,191, 40,
+ 58,214, 23,157,129,164,197,117, 96, 85,184,131, 22,249,189,206,226,126,154,176,135, 36, 0,157,174, 71,140, 59, 78, 99, 47,132,
+ 71, 39, 94,241,190, 31,176,237, 91, 1,123, 24, 99, 17,195, 94, 64, 65, 98,255,233,225,140,197,235,117, 70,136, 17,119,227,136,
+101,153,229,188, 48,172,240, 25, 25, 63, 59,231, 16,246, 29,227, 56,104,158,186,144,239,246,109, 7, 16, 75,186,218, 47,190,252,
+ 90,190,175,198,226,116, 58,227, 31,254,163,127,136, 63,250,227, 63,168,106,108,147, 9,103, 6, 91, 92, 17,194,170, 58, 8,148,
+ 29, 46,154, 28,109, 20, 65,167,169,130,224,130, 51,174, 90,151, 2, 76, 57,172,215,184, 81, 44,231,174, 59,199, 15,215,115,180,
+228,110,232,101,142,200,135,121,160, 76,161,169, 73, 70,228,242, 60, 37, 54,176, 36,235,146, 4,192, 23, 34,232,193,202, 82,138,
+232,196, 50,234, 15, 33, 8, 40, 40, 6,237,226,133,239,254,122,157,113,189,206, 18, 2,164,127, 22, 91, 26,141, 84,120,242,100,
+ 12,168,189,212, 83, 66,140,123,181,222, 53, 34,189,234, 80, 51,135,169,108,193,217,114,205,254,200,107, 7,249,229, 17, 73,189,
+220, 54,199,153, 2, 72, 17, 5, 40,147, 9,160, 68, 77, 50,104,179,131, 78, 42,166, 28,199, 30,211,116,194, 52,141,232,251, 94,
+200,131,106,229,204, 60, 10,178,212, 36, 88, 82,249,188,192, 45,153, 46, 85, 36,119,139,231, 78, 21, 72,147, 11, 71,163, 57, 36,
+ 38, 39,251,105,246, 69, 74, 73, 21,233,173, 51,129, 15,179,202,118, 71, 65,173, 96,186, 48, 85,168,252,153, 15, 45, 90,115, 78,
+ 87, 75,219, 45, 1,156,240,201,222, 53,223, 99,133,161,123,155, 31,214, 36,173,101, 49, 3,233,152, 74, 70,119,117, 68,208,138,
+ 84,242,129,210,254,225,152,101, 76,158,187,209,160, 80, 6, 82, 65, 86,254, 2, 5, 16, 58, 69, 36, 18, 1,206, 17, 98, 4,250,
+105,194,215,191,249,149, 96, 16,141, 64, 4,152, 80,210,143,114,186, 18,183,157, 59, 9, 95,247,160,210,191,221, 61,255,208, 14,
+ 90, 31, 62,220, 54,159, 92,147,211,168, 85,153, 31,242,209,155,111,127,106,184,247, 13, 3,192, 28,160, 49, 5,240,118,204,243,
+229,163,255,156, 74,117,101, 74, 84,108, 45, 95,233, 72,241, 69,219,121,215, 12,117,131,163, 38, 34, 63,216, 38, 91,128,184,177,
+175, 81,237, 52, 76,166,202, 48, 29, 64, 52,169,104,235,168,166,192, 29,214, 1, 37, 15, 79, 39,240,242, 25,223,223,159,240,253,
+183, 11,146,113, 66, 89,131,196,154,130, 32, 65, 45, 41,226,195,101,199,203,245,138,199,251, 59, 32, 49,182, 16,241,253,211,139,
+136,197,152,225,201, 96,217, 54, 76,195, 0,198, 19, 72,253, 2, 2,150,136, 13,228,174,218, 23,101, 20, 27,165,179, 36,150, 11,
+205,202,161,242,102,236,113,133,184, 44, 4,245, 26,209, 91,241,132,191,123,124,131,174,239,241,241,227,135,178,199, 93,150, 25,
+ 97,223,132, 82, 5,224,229,227, 71,196, 40,172,132,151,215, 23,196, 16, 21,121,218, 99,232, 59,204,243, 21,206,121,140,195,136,
+125,223, 48,207, 87,244, 93, 7,211, 13,232, 7, 25,223,191, 92,102,204,243, 11,134, 65, 8,107,151, 57,160,243, 61, 12, 89, 92,
+174, 87,204,235,138,135,251, 59,116,125,143,235,117, 6,115, 66,231, 28,190,251,230, 43, 12,195,136,211,105, 66,116, 14, 86,139,
+141,160, 59,210,117, 93, 37,247,125,232,177,204, 11,134,161,211,231,214,160,239,125, 89, 91, 25, 34, 56,239, 48,142,163, 64, 87,
+182,173, 48, 1,122,141, 75,221,247, 13, 93,215,233,190,146,133,207,207,172,123,124, 96, 58, 77, 58,174,148,175, 66,231, 59, 24,
+107, 68,255, 18,165,179, 52,106, 11,204,158,243, 77,109,109,196,140,203,178,226,171,143,146, 29,239,188, 71, 55, 76,248, 87,255,
+234,191, 69,215, 75, 40,140,209, 81, 57,235,103, 29,195,142, 24, 54,181,118, 25,141, 42,181, 26, 28, 98, 75, 54, 68,217,229, 54,
+ 54,173,164, 5, 59, 35, 53, 87,114, 51, 51,107,189,201,121, 21,169, 96,173,140,201,109,215,113,249,204, 44,204,114, 62, 30,234,
+ 7,103, 72,163,137,169, 74,232, 58,186,206,123,227, 79,204,168,186,162, 76, 48,240, 22, 96,223, 21,218,156,136, 73, 69, 88,233,
+172,195,208,247,184, 92, 46,152, 53,138, 54,231,131, 71,212, 61,184,105, 32, 88,116, 72,227,140,106,235, 44, 72,205,106,183, 51,
+169, 62,211,220,118,243, 92, 58,245,140,118, 37,157, 6, 9,172, 69, 49,226,205,253, 20, 82, 27, 38,211, 30,118,185, 73, 18,145,
+102, 55,116,152,198, 9,125,223,193,251, 14, 67, 47, 84, 70,175,206,136,252, 89, 23,141, 1, 26, 10,160, 22, 50, 73, 87, 8,172,
+ 23,113,105,102, 96, 42,244,134,184,161,230,153,218, 44,149, 60,149,218,176, 74,243,151,157, 79,183, 7, 56,234, 90,178, 81,138,
+103,250, 94,227, 13, 44,119, 5, 27, 61,163, 19,192,166,126, 38,142, 63,185,212,219,188,108,194, 77,152,182,118,145, 71,144, 74,
+245, 78,183,163,218, 86, 96, 85, 35,215,228, 80, 79, 37,228, 37,179, 2,200,164,195,133, 36, 76,143, 74, 54,139, 49,192,102,214,
+121,254,198,167, 4,219, 59,236,161, 38,152,177,122, 58,189,235,240,244,221, 87,170, 18,149, 89,176, 88, 70,160,222,244, 28,180,
+118,196, 24,186, 12,104,200, 21, 86,202,128,156,166, 34,167, 74,101, 67,195,253,253,161, 45, 27, 55,190, 13,110, 48,169,124, 99,
+233,162,188, 40,105, 4,143,148,184, 92,156,121,111, 82, 30, 92,226,195, 28,165,157,116,151,169,129, 57, 86,116,212,250,237, 42,
+230, 77, 69, 25,230,104, 87,253, 29,118,245, 92,164,136,106,150, 63,249,181,159,160,255,111,237,238,135,127,220,116,229,204, 37,
+246,165,208,244,117, 76,119,119, 30,241,252,212, 1, 97,198,170, 15,245,103,111, 31,241,229,215,223,224,139, 55,247,248,143,191,
+252, 74,209,190,114, 56,239, 49,130, 82,196,219,251,179, 36,138,177, 8,212,166,113,196, 30, 68,196,181,110, 59, 34,234,184,194,
+ 84, 94,150,106, 57,184,216,172,126,251,229,223,225,241, 65, 70,234, 68, 22, 15,167, 9,175,243, 12,111, 29,140,115,232,188,197,
+249,116, 66, 2, 48, 77,247, 0, 25,124,247,253, 7, 12,189,199,186,172,240,190, 3, 57,194,229,122, 21,232,204,178,192,251, 14,
+ 93,103,113,185,188,200,232,223,245,112,214, 98,232, 59,172,235, 44,162, 53,103,177,109,139,196,156, 2,120,189, 94,241,221,135,
+ 39,188,125,124, 35, 10,115,103,113,217, 25,151,235,130,196,140,135,251, 71,112,218, 1, 36, 76,211,132,243,121,194,186,110,248,
+230,219,239, 50,185, 2, 32,131,211, 52,161, 27,122, 92,231, 89,158,233,141,241,242,242, 10,239, 4,199, 57, 78,131,112,196, 99,
+196,227,195,189, 10,134, 12,156,239,176,110, 27,214,117,145, 72, 88, 13,152,200, 10,232, 60,246,117,206, 73, 1, 14,104, 82, 93,
+237,212,134, 65,125,232,228, 96,173,195, 30, 54,144,245, 8, 49, 34, 6, 9, 12, 73, 33, 98, 24,196, 5,224,125,167, 98, 53, 25,
+ 37,239,121,180,156, 18,126,243,221, 71, 44,187,144,242,250,113,196,227,219,119,248,111,254,217,159, 41, 39,220,169, 64,201,222,
+ 28, 97, 92,198,171,100, 0, 67,174, 76, 20, 64,234,227,230,155, 51, 45,219, 74, 83,157,156,101, 13, 80,246,100, 31, 52,215,153,
+213,157,106,186, 98,166,115,230, 56, 4,232, 52, 50, 79, 53,243,227,159,184,105,144,138, 33,134,138,114,190,148,209, 68, 40,255,
+249, 60,254,252,129,211,231, 40,188,229,226,217,102,181,204, 89, 3,233, 98,187, 14,126, 89, 68, 28, 57,109,152,151, 21,219,182,
+105, 16,142, 45, 62,116,153,202, 80, 67,192,228,134, 2, 87, 27,130,146,184,153, 20, 42, 5, 46, 73,144,196,172, 1,147, 92,138,
+ 39,166,170, 93, 40,175, 52, 49, 18,213,184,238, 98, 33,108,106,135, 66,151, 51, 6,125,231,209,119, 29,166,105,194, 48, 78,186,
+ 10,114,240,153, 99,111,141, 94,224, 92, 32, 99,217,253, 69, 68,122,127, 9,131, 32, 54, 2, 54,206, 86,202, 28,242,197, 77, 81,
+ 71,166, 8, 52,115,211, 40,171, 11,106, 48,174,181, 81, 61,222,154, 40, 83, 24,174,177, 33, 7, 54,138,244, 96, 13, 79,224,102,
+ 13,155,202,197,158, 87, 17, 12,151,133, 35,212,180,151, 53,192,133, 63, 77, 27, 99, 46, 94,192,246, 50,105, 17,130,181,184, 76,
+250,125,206, 12,223, 6, 55, 90,222,180, 36,248, 18,110,131, 62, 26,210,152, 62, 48, 28,211,225,117, 36,107, 48,144,129, 5, 97,
+ 7,171, 15,180,190,102,102,198,250,250,172, 85, 86, 42, 34, 19,226, 58, 73,232,189,197,182,199,242,223,181, 68,152,166,169, 60,
+184,220,142,116,210,113, 28,223,142,153, 11,132,167,233, 62,139,176, 91,149,126,101, 47,206,166, 73, 35,106,119,115,181, 52,207,
+ 90,130,140,127,205, 59, 54, 82,142,124, 5,220,224,152, 87,223,200,244,164, 6,160,134,125,124, 8, 95,195,145,234, 75,159,224,
+241,126, 0, 46,167, 99, 37,170, 73,114,116,168,224,110,214, 21,133,153,123,112,202,113,139,141,188, 37,244,221, 40,240,243, 10,
+ 65, 3,136, 97,173, 69,220, 3, 28, 49,254,254,155,111,145,246,136,191,159,197, 82,245,217,195, 25,145, 25,215, 69, 2, 64,214,
+ 16,144,124, 77,108,234,189,199,117,158,225,157,195,221, 56, 97, 93, 63, 54, 56, 37,106, 48,191, 90,156,153,138, 69, 54,214,224,
+242,252, 44, 17,155,134,240,241,245,130,222, 81, 73,145,251,209, 23, 63,198,120,154, 68, 21,190,205,154, 28,103,149,203, 13,188,
+190,190, 96,143, 1,231,113,192,249,254, 1,206, 95, 96,173,195,211,243, 11,188,235,176,199, 0,230,136,105, 58, 99,158,103,172,
+187,196, 51,238, 33, 8,123,187,115, 88,150, 13,214,120,156, 39,143,231,151,139,166,215,109,136, 73, 34, 99,167,113, 68,138, 34,
+ 50, 27,166, 17,206,202,174,121,217, 3,156, 33, 77, 91, 19, 47,186,181,132,235,199, 43, 98,130,116,235,251,142, 97,236,133,207,
+192, 12,239, 59,244, 58, 46,119, 58,133, 16, 94,250, 2, 75, 6,157,247,120,184,191,135,243, 94,152,234, 73, 56,232, 34,202, 75,
+229, 18,239,251, 30, 41,185,198,175, 29, 36, 36, 71, 15,185,148, 34, 58,223,107, 51,103, 65,185,168, 24,123, 13,102,146,113,247,
+190,111, 34,250, 98, 70, 72, 17,151,235,140,223,126,255,172,107, 36,135, 97, 58,225, 79,255,236,159,224,179,247,239, 84,252, 37,
+197, 93,177,122,106,104,120, 12, 59,246,109, 69, 12, 50,153, 17, 36,167,205,115, 36, 21, 95,241,113,178, 5, 62,160, 87, 77, 83,
+245,102, 59, 45, 84,208, 85, 20,239, 58,149, 40, 76,243, 50,110, 77, 53,100,165, 60,255,220,136,158,202,147, 95,186,189,131,207,
+185,193, 67,203,235,212,238, 17,166, 22,251,217,209, 83,220, 53, 58, 54,215,125, 64, 94,249,137, 69, 57,202,148, 20, 22,182, 51,
+ 10, 74,138,240,126,197, 52, 72,225,187,172,171,252,117, 89,181,184,227, 28,118, 93,254,108,229,124, 81, 81,153,201,158,121,176,
+140,170,139,227,232, 32, 13,110,240,237, 36,121, 12,133,238,103,148, 21, 65, 69, 99, 67, 12, 21, 68,155, 82,148, 73,190,184,197,
+121, 26, 49,158, 70,140,227, 4,239,188, 76,108,244,130,207,169,118, 49,198,122,161,235,247, 51,103,153, 27,141, 85, 46,239, 17,
+231,240, 28,253,115, 26, 40,200, 72, 97, 71, 33,213,236,118, 97, 37,203,231, 82,214,188, 84,113,188,164, 43,203,122,115,225,184,
+ 40,109, 52, 87,183, 46,129,155,184,236,214, 38, 78, 68,141, 38,161,229,200, 16, 92,254,226,148,156,244,163, 3,235,176,108,205,
+176,149, 3, 32,134,169,248,172,185, 17, 62,148,125, 81, 6,202, 20,244, 44,201,197,212, 78, 3,202, 24,254,216, 20, 38, 22,196,
+172,129, 65, 10, 59,114,120, 87, 72, 9, 29, 73,134,110,100,137, 41, 98,107, 64, 26,112, 0,227,196,246, 67, 22,137,131, 62, 12,
+234, 71, 85,112, 13,113,194, 30, 18,182, 24, 11, 77,142,200, 8,200,134,242, 7,196, 13, 61,173, 17, 13,222, 92,119,121,175,198,
+224, 31, 96,209, 72,144, 0,146, 62,248,134, 75,230,121, 21, 68,144, 50,237, 91,171,184, 94,209, 42, 78,201, 86,138,178, 95, 41,
+ 21, 42,110, 12,230,233,134,189,124,243,146, 62,233,150,241,137,118,128, 75,234, 82,139,254, 43,196,253,170,154, 47, 22,185, 84,
+166, 9,141,235,177,153, 74, 16,114, 38, 83,161, 60,105,129, 83,187,127,210,245, 74,187,159,212,231,133,129,135,251, 19, 94,190,
+ 95, 65,206, 97,112, 29,188,149,135,127, 89, 87,188, 57,245,216, 99,196, 72,157,218, 97,228, 66,142, 49,161,235,123,108,235,138,
+151,235, 21,247,119,103, 16, 8, 99,191, 23,184, 12,171,221, 49, 31, 85,198,136,131,130,149,201, 77, 12, 92, 47,175,184,187,127,
+196,247, 31,190,199, 30,118,220,157,206,136, 97, 71, 50,192,224, 58,188, 92, 94,241,244,244, 1,151,121,197,195,155,183,112, 36,
+234,236,105, 58,225,155, 15,207,232,141, 8,255,172,235,240,244,244,132,151,151, 23,156,239, 78, 24, 71,143,176, 71, 56,219,193,
+ 90,135,109, 89,177,111, 43,206,211, 9,206,117,178,127,118, 6, 38, 68,113, 98, 88, 9, 78, 57, 77, 50,158,222,157,197,188,174,
+120,115,186, 71,136, 59,214,117,197,249, 52, 97, 91, 23, 44, 58,157, 72, 49,130, 92,135,126, 56, 97, 15, 9, 93,151,192,113, 71,
+ 76,192, 48, 76,112,214,233, 14, 91, 2, 91, 0, 96, 24, 6, 25,115,111, 59,182,125,195,178, 73,110,251,208,119,112,157,193,221,
+116,130,247, 14,167,243, 25, 41, 37, 92, 46, 87,172,155,144,176,186,190, 23, 14,124,223, 99,219, 86, 24,146,180,180,231,167,143,
+ 24,198, 81,253,225, 50,254,116,222, 23,204,167,248,212, 93, 65,143, 2, 34, 20,164, 20,209,211,128,249, 58,195,146,193,111,191,
+253, 30, 31, 47,179, 36,231,245, 3,166,243, 61,254,229,191,248,175, 75,231,149, 87,121,178,159, 23,126,124,216, 54, 65,210,238,
+ 27,226,190,169,157,203,149, 29,121,241,123,183,221, 45, 83, 81,158,147, 94, 52,141, 10,166, 62,187, 69,217,206, 7,255,116,182,
+141,229, 21, 90, 22, 11,230, 21, 90, 25,211, 82,195, 93, 65,106, 28, 42,141,224, 46,229, 48, 39, 42,226, 99,163, 59,231,210,137,
+167,212,224, 98, 51, 68,172, 88,154,234,101,206, 71,132,107,158, 16,144, 22,205,214, 37,120,133, 12,141,123,144,184, 85, 0,203,
+178, 98,153, 23,204,203,130,117, 89, 75, 3, 37,103, 41,234,197, 77, 0,145, 92,200, 92,206, 80, 17,121,149,220,120,161, 85,201,
+123,108, 80,247,244,196,141,237,171, 49,181, 67,198,203, 45,102,186, 31,122,156, 78, 98,213,236,122, 41, 72, 51,149,208,123, 95,
+138,198,164,151,185, 85,204,172, 81,125, 14, 25, 91,156, 16,114,174,138,107,132, 72, 16, 5,156, 71,200, 44,162, 70,151,169,142,
+169, 78,166,140, 49,101, 93,154,184, 78, 94, 40,107,139, 82, 5,138, 29,214, 40, 55,119,135,249,129,104, 14,195,183, 35, 82, 58,
+124, 39,184,209, 71,181,238, 96, 67,140,255, 23,177, 72,216, 51, 12, 46,249,141, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
diff --git a/source/blender/editors/datafiles/startup.blend.c b/source/blender/editors/datafiles/startup.blend.c
index 0a7f5b3ba7b..ef2fd052dea 100644
--- a/source/blender/editors/datafiles/startup.blend.c
+++ b/source/blender/editors/datafiles/startup.blend.c
@@ -1,214 +1,268 @@
/* DataToC output of file <startup_blend> */
-int datatoc_startup_blend_size= 366764;
+int datatoc_startup_blend_size= 409636;
char datatoc_startup_blend[]= {
- 66, 76, 69, 78, 68, 69, 82, 95,118, 50, 53, 51,
- 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,191, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 16, 1, 0, 0,160,107,137,191,
-202, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 49, 1, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 1, 24, 81, 88, 10, 16,228, 90, 10,
- 0, 16, 0, 0,128, 32, 4, 0, 47,114,111,111,116, 47, 46, 98,108,101,110,100,101,114, 47, 50, 46, 53, 51, 47, 99,111,110,102,
-105,103, 47,115,116, 97,114,116,117,112, 46, 98,108,101,110,100, 0,108,137,191,224,108,137,191, 0, 0, 0, 0, 1,128,173,251,
-220,117,137,191, 42,230,132, 8,176, 8, 93, 10,136,108,137,191, 32, 0, 0, 0,255,255,255,255,224,108,137,191,255,255,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236,127,188, 8,104,108,137,191,115,232,132, 8,176,100, 64, 10,136,108,137,191,
- 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 14, 45,190, 82, 69, 78, 68, 32, 0, 0, 0,136,108,137,191,
- 0, 0, 0, 0, 1, 0, 0, 0,224,104, 78, 9,220,117,137,191,184,108,137,191, 49,239,132, 8,176,100, 64, 10, 82, 69, 78, 68,
- 32, 0, 0, 0,136,108,137,191,128, 63,168, 8,236,127,188, 8, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 81, 88, 10, 0, 0, 0, 0, 87, 77, 0, 0,168, 0, 0, 0,
- 0,140, 81, 9,110, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,
-110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-160,180, 80, 10,160,180, 80, 10,160,180, 80, 10,160,180, 80, 10, 3, 0, 0, 0, 0, 0, 0, 0, 16,163, 79, 9,136,145, 79, 9,
- 0, 0, 0, 0, 0, 0, 0, 0,184,141, 88, 9,184, 35, 81, 10, 16, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,177, 64, 10,
- 8,177, 64, 10, 8,177, 64, 10,248, 54, 88, 9,248, 54, 88, 9,248, 54, 88, 9, 68, 65, 84, 65,148, 0, 0, 0,160,180, 80, 10,
-111, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 81, 82, 9, 1, 0, 0, 0, 0, 0, 0, 0, 24, 81, 88, 10,
- 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 5, 56, 0,246, 4,226, 3, 0, 0, 0, 0, 1, 0,238, 3, 0, 0, 1, 0, 0, 0, 0, 0,168, 48, 84, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,232,200, 87, 9,208,185, 87, 9,208,185, 87, 9,112, 55, 88, 9,
-232, 55, 88, 9, 96, 56, 88, 9, 96, 56, 88, 9,216, 56, 88, 9,184, 58, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,
-140, 0, 0, 0, 88,159, 78, 10,196, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82, 65,110,105,109, 97,116,105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,248, 15, 55, 10,192, 37, 85, 10,192,225, 87, 9,136,149, 60, 10,208,149, 60, 10, 0,205, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,248, 15, 55, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,180, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,180, 84, 10,197, 0, 0, 0, 1, 0, 0, 0, 40,197, 80, 9,248, 15, 55, 10,
- 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 40,197, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
- 16,160, 78, 10, 88,180, 84, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16,160, 78, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 16,228, 79, 9, 40,197, 80, 9, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 16,228, 79, 9,197, 0, 0, 0, 1, 0, 0, 0,184, 29, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,184, 29, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 48,141, 84, 10, 16,228, 79, 9,
- 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 48,141, 84, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240,152, 88, 9,184, 29, 79, 9, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240,152, 88, 9,
-197, 0, 0, 0, 1, 0, 0, 0,240,203, 80, 9, 48,141, 84, 10, 0, 0, 0, 0, 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,240,203, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,208,171, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 44, 6,220, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208,171, 79, 9,197, 0, 0, 0, 1, 0, 0, 0, 96,211, 87, 9,240,203, 80, 9,
- 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,211, 87, 9,197, 0, 0, 0, 1, 0, 0, 0,
- 88, 68, 81, 10,208,171, 79, 9, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88, 68, 81, 10,
-197, 0, 0, 0, 1, 0, 0, 0,160,154, 61, 10, 96,211, 87, 9, 0, 0, 0, 0, 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,160,154, 61, 10,197, 0, 0, 0, 1, 0, 0, 0,224, 27, 77, 10, 88, 68, 81, 10, 0, 0, 0, 0,160, 2,132, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,224, 27, 77, 10,197, 0, 0, 0, 1, 0, 0, 0,104,177, 80, 9,160,154, 61, 10,
- 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104,177, 80, 9,197, 0, 0, 0, 1, 0, 0, 0,
-104, 32, 59, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,104, 32, 59, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 8, 40, 82, 9,104,177, 80, 9, 0, 0, 0, 0,160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 8, 40, 82, 9,197, 0, 0, 0, 1, 0, 0, 0,192, 37, 85, 10,104, 32, 59, 10, 0, 0, 0, 0, 44, 6,100, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,192, 37, 85, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 40, 82, 9,
- 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,225, 87, 9,198, 0, 0, 0, 1, 0, 0, 0,
-248,115, 56, 10, 0, 0, 0, 0, 40,197, 80, 9, 88,180, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-248,115, 56, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 2, 84, 10,192,225, 87, 9, 16,228, 79, 9, 88,180, 84, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 2, 84, 10,198, 0, 0, 0, 1, 0, 0, 0,240,180, 81, 10,248,115, 56, 10,
-184, 29, 79, 9, 40,197, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,180, 81, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 96,181, 80, 10,112, 2, 84, 10,184, 29, 79, 9, 16,228, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 96,181, 80, 10,198, 0, 0, 0, 1, 0, 0, 0, 16,143, 60, 10,240,180, 81, 10,248, 15, 55, 10, 48,141, 84, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,143, 60, 10,
- 96,181, 80, 10, 16,160, 78, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,143, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,160,143, 60, 10, 16,143, 60, 10,184, 29, 79, 9,240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,160,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,232,143, 60, 10, 88,143, 60, 10,240,203, 80, 9,
- 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232,143, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 48,144, 60, 10,160,143, 60, 10,208,171, 79, 9, 16,160, 78, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 48,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,144, 60, 10,232,143, 60, 10,208,171, 79, 9,240,203, 80, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,144, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,192,144, 60, 10, 48,144, 60, 10,
- 96,211, 87, 9,248, 15, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192,144, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 8,145, 60, 10,120,144, 60, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 8,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 80,145, 60, 10,192,144, 60, 10, 88, 68, 81, 10, 48,141, 84, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,145, 60, 10,
- 8,145, 60, 10, 96,211, 87, 9, 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,145, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,224,145, 60, 10, 80,145, 60, 10, 96,211, 87, 9,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,224,145, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 40,146, 60, 10,152,145, 60, 10,160,154, 61, 10,
- 88, 68, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
-112,146, 60, 10,224,145, 60, 10, 16,228, 79, 9,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-112,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,146, 60, 10, 40,146, 60, 10,240,152, 88, 9,224, 27, 77, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,146, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0,147, 60, 10,112,146, 60, 10,
-160,154, 61, 10,224, 27, 77, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0,147, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 72,147, 60, 10,184,146, 60, 10,104,177, 80, 9, 96,211, 87, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 72,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,144,147, 60, 10, 0,147, 60, 10,104, 32, 59, 10,160,154, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144,147, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,216,147, 60, 10,
- 72,147, 60, 10,104,177, 80, 9,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,147, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 32,148, 60, 10,144,147, 60, 10,240,203, 80, 9, 8, 40, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 32,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,104,148, 60, 10,216,147, 60, 10, 8, 40, 82, 9,
-240,152, 88, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
-176,148, 60, 10, 32,148, 60, 10,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-176,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,248,148, 60, 10,104,148, 60, 10,208,171, 79, 9,192, 37, 85, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,148, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,149, 60, 10,176,148, 60, 10,
- 8, 40, 82, 9,192, 37, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,149, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,136,149, 60, 10,248,148, 60, 10, 16,228, 79, 9,104,177, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,136,149, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,149, 60, 10,104, 32, 59, 10,224, 27, 77, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,208,149, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,176,152, 60, 10,
- 0, 0, 0, 0, 16,228, 79, 9, 88,180, 84, 10, 40,197, 80, 9,184, 29, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,128,212, 60, 10,
-128,212, 60, 10, 96,150, 60, 10,136,151, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 96,150, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,151, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 66, 76, 69, 78,
+ 68, 69, 82, 45,118, 50, 53, 54, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 76, 79, 66, 32, 1, 0, 0, 32,107,245, 96,255,127, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 48, 0, 0, 0, 0,
+250, 0, 0, 0, 1, 0, 0, 1,104, 15,253, 2, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 47,114,111,111,116, 47,117,110,116,105,116,108,101,100, 46, 98,108,101,110,100, 0, 0, 0, 0,
+168,217,206, 0, 0, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 80,108,245, 96, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0,240,122,245, 96,255,127, 0, 0, 56,135,206, 4, 0, 0, 0, 0,240,107,245, 96,255,127, 0, 0,
+ 32,220,206, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 32, 0, 0, 0, 82, 69, 78, 68,
+104, 93,115, 4, 0, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 5, 0, 0, 0, 5, 0, 0, 0, 64,108,245, 96,255,127, 0, 0, 9,235,206, 0, 0, 0, 0, 0,248, 56,252, 2, 0, 0, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 93,115, 4, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,128,108,245, 96,255,127, 0, 0, 87, 77, 0, 0, 24, 1, 0, 0,
+ 24, 61,252, 2, 0, 0, 0, 0,102, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104, 23,198, 4, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,
+120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,131,240, 2, 0, 0, 0, 0,
+ 56,131,240, 2, 0, 0, 0, 0, 56,131,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0,
+ 40,132,240, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,103, 1, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,132,240, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 7, 28, 0,126, 7, 4, 4, 0, 0, 0, 0, 1, 0,238, 3,
+ 0, 0, 1, 0, 0, 0, 0, 0, 56,238, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 72, 19, 14, 3, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,
+136,239, 13, 3, 0, 0, 0, 0,136,219, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0,
+ 88,240, 13, 3, 0, 0, 0, 0,184, 43, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 78, 0, 0,208, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,
+105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0,
+ 88, 85,252, 2, 0, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 64,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 56, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+168, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,220, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+120, 70,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2,132, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+232, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 56, 72,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,100, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 72,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,
+ 56, 65,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0,
+168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,
+ 24, 66,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,
+ 24, 66,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,
+104, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,
+152, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,
+ 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,
+232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,
+248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,
+200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,
+120, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 88, 85,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,
+ 72, 86,252, 2, 0, 0, 0, 0,184, 87,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 86,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184, 87,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,151, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 96,150, 60, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192,
- 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,152, 60, 10,
-200, 0, 0, 0, 1, 0, 0, 0,216,173, 60, 10,208,149, 60, 10, 48,141, 84, 10,240,203, 80, 9,208,171, 79, 9, 16,160, 78, 10,
- 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,208,172, 60, 10,208,172, 60, 10, 64,153, 60, 10,104,154, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,153, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,104,154, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0,
- 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1, 31, 0, 74, 1,
- 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,154, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,153, 60, 10, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 87,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 86,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,184,113,252, 2, 0, 0, 0, 0, 88, 85,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+ 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,
+136, 91,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136, 91,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
+ 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 74, 1, 31, 0, 74, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 91,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
0, 0, 0, 0, 1,128,156, 67, 2,128,222,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,189, 1,
+ 18, 0, 0, 4, 6, 0, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 92,252, 2, 0, 0, 0, 0,
+216,110,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 92,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+152, 94,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,144,155, 60, 10, 96,171, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,144,155, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0,157, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,220,255, 57, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,220,255, 57, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+152, 94,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,248, 92,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,157, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,112,158, 60, 10,144,155, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 57, 1, 61, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 57, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,112,158, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,159, 60, 10,
- 0,157, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+216, 97,252, 2, 0, 0, 0, 0,152, 94,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,224,159, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 80,161, 60, 10,112,158, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,111,255, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+216, 97,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,140,254, 57, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 57, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,161, 60, 10,199, 0, 0, 0,
- 1, 0, 0, 0,192,162, 60, 10,224,159, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 57, 1, 58, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 99,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 24,101,252, 2, 0, 0, 0, 0,216, 97,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,162, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 48,164, 60, 10, 80,161, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 58,254, 57, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 24,101,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
+ 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
+ 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,
+111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,102,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 88,104,252, 2, 0, 0, 0, 0, 24,101,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 48,164, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,165, 60, 10,192,162, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,
- 57, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,164,253, 57, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,160,165, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 16,167, 60, 10, 48,164, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 88,104,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -218,302 +272,360 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 16,167, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,128,168, 60, 10,160,165, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,105,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+152,107,252, 2, 0, 0, 0, 0, 88,104,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,242,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,242,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,168, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,240,169, 60, 10, 16,167, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 57, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+152,107,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,240,169, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,171, 60, 10,
-128,168, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,109,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+216,110,252, 2, 0, 0, 0, 0,152,107,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 96,171, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,169, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,194,252, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+216,110,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,170,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,172, 60, 10,165, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,216,173, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,160,177, 60, 10,176,152, 60, 10,248, 15, 55, 10, 96,211, 87, 9,
- 88, 68, 81, 10, 48,141, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,
-132, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,176, 60, 10,184,176, 60, 10,104,174, 60, 10,144,175, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,174, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,144,175, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68,
- 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,144,175, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,174, 60, 10, 0, 0, 64,192, 0, 0,126, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+184,113,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
+200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,132, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
+168,114,252, 2, 0, 0, 0, 0, 24,116,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,114,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 24,116,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,116,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,114,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
18, 0, 0, 0,105, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0,184,176, 60, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
+170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-160,177, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,128,182, 60, 10,216,173, 60, 10,240,203, 80, 9, 8, 40, 82, 9,192, 37, 85, 10,
-208,171, 79, 9, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0, 3, 3, 74, 1,135, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,180, 60, 10,128,180, 60, 10, 48,178, 60, 10, 88,179, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,178, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 88,179, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65,
- 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1,
- 26, 0, 74, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0,
- 99, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 88,179, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,178, 60, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,
-108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,
-108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0,
- 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 74, 1,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,128,180, 60, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,
+184,113,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,
+184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0,
+ 3, 3, 74, 1,135, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,122,252, 2, 0, 0, 0, 0,
+120,122,252, 2, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0, 8,121,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152,119,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,121,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1, 26, 0, 74, 1, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0, 99, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,121,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0,
+ 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,
+120,122,252, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 41, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,152, 41, 82, 9,
-224, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,168,181, 60, 10, 68, 65, 84, 65,168, 0, 0, 0,168,181, 60, 10,
-223, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
- 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0,
- 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0,128,182, 60, 10,200, 0, 0, 0,
- 1, 0, 0, 0,120,193, 60, 10,160,177, 60, 10,160,154, 61, 10,224, 27, 77, 10,240,152, 88, 9, 88, 68, 81, 10, 0, 0, 0, 0,
-161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,192, 60, 10, 80,192, 60, 10, 16,183, 60, 10,176,187, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,183, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 56,184, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0,216,123,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,138, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,139, 3, 26, 0,139, 3, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,216,123,252, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
+ 14, 0, 0, 0, 14, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0,
+216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+200,138,252, 2, 0, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,137,252, 2, 0, 0, 0, 0, 56,137,252, 2, 0, 0, 0, 0, 88,126,252, 2, 0, 0, 0, 0, 24,132,252, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 56,184, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 96,185, 60, 10, 16,183, 60, 10, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0,
- 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,161, 2, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,126,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,127,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
+ 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,139, 3,
+ 26, 0,139, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,127,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,129,252, 2, 0, 0, 0, 0,
+ 88,126,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
+255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
+ 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,161, 2, 0, 0,
159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,167, 3, 0, 0, 5, 0,
3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 96,185, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,136,186, 60, 10, 56,184, 60, 10, 0, 0, 0, 0, 0, 0, 16, 67,
- 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,159, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,186, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,176,187, 60, 10,
- 96,185, 60, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196,
- 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,148, 3,163, 0,
-130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 43, 6, 0, 0,159, 0, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,176,187, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,186, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,129,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,130,252, 2, 0, 0, 0, 0,
+200,127,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
+ 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,168,130,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,132,252, 2, 0, 0, 0, 0,
+ 56,129,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
+148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,
- 43, 6, 0, 0,159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,188, 60, 10,
- 68, 65, 84, 65, 72, 3, 0, 0,216,188, 60, 10,159, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191,
- 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63,
- 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188,
- 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62,
- 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
-184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,138, 84,228,190,
- 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,211, 48,186, 62, 11, 16, 79, 63,144,199, 64,188,
- 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65, 40,156, 5,194,
-136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63,
- 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 89,180,236, 62,209,249,224,190, 48,180, 81,191,
-184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,138, 84,228,190,
- 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190,
- 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 43, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 24,132,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,130,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
+159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,133,252, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,104, 3, 0, 0,136,133,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,
+184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
+ 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,
+176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190,
+ 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
+ 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
+138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,211, 48,186, 62, 11, 16, 79, 63,
+144,199, 64,188, 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65,
+ 40,156, 5,194,136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,160, 64, 68,239,209, 62, 51,177,205,190,
+184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
+ 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
+ 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
+138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,181, 12, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,
+237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 43, 0, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 80,192, 60, 10,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0,
- 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,193, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,199, 60, 10,
-128,182, 60, 10, 96,211, 87, 9,104,177, 80, 9,104, 32, 59, 10,160,154, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
-133, 0, 0, 0,139, 1, 0, 0, 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,198, 60, 10,
-168,198, 60, 10, 8,194, 60, 10,128,197, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 8,194, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,195, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,195, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,196, 60, 10,
- 8,194, 60, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0, 91,195,
- 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,237, 0,200, 0,
-219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0,
+ 68, 65, 84, 65, 72, 1, 0, 0, 56,137,252, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
+ 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,200,138,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,
+104,125,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
+ 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,139, 1, 0, 0,
+ 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,145,252, 2, 0, 0, 0, 0,
+120,145,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0, 8,144,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+184,139,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 40,141,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40,141,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0, 91,195, 0, 0, 0, 0,
+200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,237, 0,200, 0,219, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,237, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,196, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128,197, 60, 10, 48,195, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152,142,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,144,252, 2, 0, 0, 0, 0, 40,141,252, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
-159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128,197, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,196, 60, 10, 0, 0, 16,193,
- 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0,
- 17, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,
-198, 1, 0, 0, 18, 0, 0, 0,236, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0,
- 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,144,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,
+ 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 18, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,236, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71,
+ 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,168,198, 60, 10,164, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+120,145,252, 2, 0, 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,199, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,199, 60, 10, 23, 1, 0, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,240,199, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0,205, 60, 10,120,193, 60, 10,104,177, 80, 9, 16,228, 79, 9,
-224, 27, 77, 10,104, 32, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0, 12, 12,160, 2,
-185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,203, 60, 10,248,203, 60, 10,128,200, 60, 10,208,202, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,200, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,168,201, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68,
- 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,
-141, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,168,201, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,208,202, 60, 10,128,200, 60, 10, 0, 0, 0, 0, 0, 0, 55, 67,
- 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 35,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,
- 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,200, 0,159, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208,202, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-168,201, 60, 10, 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 64, 35,196,
- 0, 0, 0, 0,199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72,
- 0, 64, 28, 70, 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,216, 1,159, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,146,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,146,252, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
+200,138,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
+ 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0,
+ 12, 12,160, 2,185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,152,252, 2, 0, 0, 0, 0,
+104,152,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,248,150,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24,148,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+136,149,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248,150,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 35,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+248,150,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0,
+ 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 64, 35,196, 0, 0, 0, 0,
+199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70,
+ 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,159, 2, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,248,203, 60, 10,
- 24, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0,
+104,152,252, 2, 0, 0, 0, 0, 17, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 96, 0, 0, 0, 0,205, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240,199, 60, 10, 8, 40, 82, 9,
-240,152, 88, 9,184, 29, 79, 9,192, 37, 85, 10, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0,
- 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,211, 60, 10, 88,211, 60, 10,144,205, 60, 10,
-184,206, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,205, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0,184,206, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,
+216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0,168,154,252, 2, 0, 0, 0, 0,
+ 24,156,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,154,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 24,156,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,
0,128,164, 67, 0, 0,200, 65, 0,128,164, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 0, 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,
-118, 7, 0, 0,101, 3, 0, 0,101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 12, 0, 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0,101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,184,206, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,144,205, 60, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,156,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,154,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74, 1,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,224,207, 60, 10, 68, 65, 84, 65, 72, 3, 0, 0,224,207, 60, 10,159, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136,157,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,136,157,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
24,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 66, 80, 64, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,
221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
@@ -539,169 +651,216 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,211, 60, 10,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,224,212, 60, 10,
-196, 0, 0, 0, 1, 0, 0, 0, 24, 81, 88, 10, 88,159, 78, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115,
-105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,213, 60, 10,
-216,216, 60, 10, 24,217, 60, 10, 0,223, 60, 10, 72,223, 60, 10,200, 43, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,213, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,213, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,213, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,214, 60, 10,152,213, 60, 10, 0, 0, 0, 0, 0, 0, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,214, 60, 10,216,213, 60, 10,
- 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,214, 60, 10, 24,214, 60, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,214, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,214, 60, 10, 88,214, 60, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,214, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,215, 60, 10,152,214, 60, 10, 0, 0, 0, 0,118, 7, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,215, 60, 10,216,214, 60, 10,
- 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,215, 60, 10, 24,215, 60, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,215, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,215, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,215, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 24,216, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 24,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 88,216, 60, 10,216,215, 60, 10,
- 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 88,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0,
-152,216, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,152,216, 60, 10,
-197, 0, 0, 0, 1, 0, 0, 0,216,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,216,216, 60, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,216, 60, 10, 0, 0, 0, 0, 24, 6, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,217, 60, 10, 0, 0, 0, 0,
-216,213, 60, 10, 24,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,217, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,168,217, 60, 10, 24,217, 60, 10,216,213, 60, 10,152,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,168,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,240,217, 60, 10, 96,217, 60, 10, 24,214, 60, 10,216,214, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240,217, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,218, 60, 10,
-168,217, 60, 10,152,214, 60, 10,216,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,218, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,128,218, 60, 10,240,217, 60, 10, 88,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,128,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,200,218, 60, 10, 56,218, 60, 10, 24,215, 60, 10,
- 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200,218, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 16,219, 60, 10,128,218, 60, 10,216,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 16,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 88,219, 60, 10,200,218, 60, 10,152,214, 60, 10,152,215, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 88,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,160,219, 60, 10, 16,219, 60, 10,
- 24,215, 60, 10,152,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,219, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0,232,219, 60, 10, 88,219, 60, 10,216,214, 60, 10, 88,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,232,219, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,220, 60, 10,160,219, 60, 10,152,214, 60, 10,216,215, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,120,220, 60, 10,
-232,219, 60, 10,152,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,220, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0,192,220, 60, 10, 48,220, 60, 10,216,215, 60, 10, 24,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,192,220, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,221, 60, 10,120,220, 60, 10,216,215, 60, 10,
- 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 80,221, 60, 10,192,220, 60, 10, 24,216, 60, 10, 88,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 80,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,152,221, 60, 10, 8,221, 60, 10,152,213, 60, 10,152,216, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,221, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,224,221, 60, 10, 80,221, 60, 10,
-152,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,221, 60, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 40,222, 60, 10,152,221, 60, 10, 88,214, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 40,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,112,222, 60, 10,224,221, 60, 10, 24,215, 60, 10,216,216, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,222, 60, 10,198, 0, 0, 0, 1, 0, 0, 0,184,222, 60, 10,
- 40,222, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,222, 60, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 0,223, 60, 10,112,222, 60, 10, 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 0,223, 60, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,222, 60, 10,152,213, 60, 10,
-216,215, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 72,223, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 40,226, 60, 10, 0, 0, 0, 0,152,214, 60, 10,216,213, 60, 10, 24,214, 60, 10,216,214, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-240, 8, 61, 10,240, 8, 61, 10,216,223, 60, 10, 0,225, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,216,223, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0,225, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 56,161,252, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,225, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,216,223, 60, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69,
- 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7,
- 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0,
- 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
- 40,226, 60, 10,200, 0, 0, 0, 1, 0, 0, 0,240,229, 60, 10, 72,223, 60, 10,216,216, 60, 10, 24,215, 60, 10, 88,215, 60, 10,
- 88,214, 60, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8,229, 60, 10, 8,229, 60, 10,184,226, 60, 10,224,227, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,226, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,
-224,227, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68, 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65,
- 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1,
- 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-224,227, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,226, 60, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0,
- 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 18, 0, 0, 0,
- 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0,
- 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,188, 0, 0, 0, 8,229, 60, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+104, 15,253, 2, 0, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,
+200,179,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 88,165,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
+232,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+200,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 24,167,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,
+168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+136,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
+104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 72,169,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,
+152,170,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,
+ 8,171,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,
+120,171,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,
+232,171,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,
+ 88,172,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,
+200,172,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,
+ 56,173,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,
+168,173,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,
+ 24,174,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,
+136,174,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,
+248,174,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,
+104,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,
+216,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,
+ 72,176,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,
+184,176,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,
+ 40,177,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,
+152,177,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,
+ 8,178,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,
+120,178,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,
+232,178,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,179,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,184,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
+168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 14,253, 2, 0, 0, 0, 0,
+216, 14,253, 2, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,152,182,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40,181,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,182,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152,182,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 8,184,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,
+ 40,170,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
+248,184,252, 2, 0, 0, 0, 0,104,186,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,184,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,104,186,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,186,252, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,184,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
+ 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 18, 0, 0, 0, 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
+ 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
+170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240,229, 60, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 24,251, 60, 10, 40,226, 60, 10, 24,215, 60, 10,152,215, 60, 10,216,214, 60, 10, 88,215, 60, 10,
- 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0, 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16,250, 60, 10, 16,250, 60, 10,128,230, 60, 10,168,231, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,230, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,168,231, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0,
- 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1,
- 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,
+ 8,184,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,
+136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0,
+ 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,212,252, 2, 0, 0, 0, 0,
+ 72,212,252, 2, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0, 88,191,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+232,189,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,191,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,231, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,230, 60, 10, 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0,
- 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0,
- 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0, 94, 1,194, 3, 77, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,
-118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,208,232, 60, 10,160,248, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,232, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,234, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 88,191,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0,
+ 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,194, 3, 77, 1,194, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0,168,210,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+200,192,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,194,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
+120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,234, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,235, 60, 10,208,232, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,194,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 8,196,252, 2, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,235, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,237, 60, 10,
- 64,234, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
+ 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 8,196,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,104,194,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,237, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,144,238, 60, 10,176,235, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,197,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 72,199,252, 2, 0, 0, 0, 0, 8,196,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -711,82 +870,89 @@ char datatoc_startup_blend[]= {
0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,238, 60, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,240, 60, 10, 32,237, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
-116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 72,199,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
+105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
+105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,240, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,112,241, 60, 10,144,238, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,200,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+136,202,252, 2, 0, 0, 0, 0, 72,199,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+136,202,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,241, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,224,242, 60, 10, 0,240, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,
- 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,204,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+200,205,252, 2, 0, 0, 0, 0,136,202,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,242, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,244, 60, 10,112,241, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+200,205,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
+109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
+109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,244, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,192,245, 60, 10,224,242, 60, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,207,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 8,209,252, 2, 0, 0, 0, 0,200,205,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,245, 60, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,247, 60, 10, 80,244, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,218,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,247, 60, 10,199, 0, 0, 0, 1, 0, 0, 0,160,248, 60, 10,
-192,245, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 8,209,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,210,252, 2, 0, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,248, 60, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,247, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,210,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,209,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -796,160 +962,187 @@ char datatoc_startup_blend[]= {
0, 0,170,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,250, 60, 10,165, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
+ 72,212,252, 2, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0, 24,251, 60, 10,200, 0, 0, 0, 1, 0, 0, 0, 16, 6, 61, 10,240,229, 60, 10,152,216, 60, 10, 88,216, 60, 10,
- 24,216, 60, 10,216,216, 60, 10, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,
-172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 4, 61, 10,232, 4, 61, 10,168,251, 60, 10, 72, 0, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,251, 60, 10,201, 0, 0, 0,
- 1, 0, 0, 0,208,252, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,192, 69, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68,
- 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 23, 3, 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+232,226,252, 2, 0, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,225,252, 2, 0, 0, 0, 0, 88,225,252, 2, 0, 0, 0, 0,120,214,252, 2, 0, 0, 0, 0, 56,220,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,120,214,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,232,215,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 69, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
+ 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 23, 3,
+ 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3, 26, 0, 0, 0, 1, 0,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,208,252, 60, 10,201, 0, 0, 0, 1, 0, 0, 0,248,253, 60, 10,168,251, 60, 10, 0, 0, 0, 0, 0, 0, 15, 67,
- 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 3, 0, 0, 1, 3, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,146, 1, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,248,253, 60, 10,201, 0, 0, 0, 1, 0, 0, 0, 32,255, 60, 10,
-208,252, 60, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194,
- 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,255, 60, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 72, 0, 61, 10,248,253, 60, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0,
- 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,
- 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0, 72, 0, 61, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,255, 60, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,232,215,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,217,252, 2, 0, 0, 0, 0,
+120,214,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
+255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
+ 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 1, 3, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,146, 1, 0, 0, 5, 0,
+ 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,217,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,218,252, 2, 0, 0, 0, 0,
+232,215,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
+ 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,112, 1, 61, 10, 68, 65, 84, 65, 72, 3, 0, 0,112, 1, 61, 10,159, 0, 0, 0, 1, 0, 0, 0,
- 36,101,230, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
-223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0,
- 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63,
- 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
- 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65,
- 25, 25,195, 62, 12,250,206, 62, 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,
-211,120, 21,194,144, 5, 2, 66, 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,101,210, 65,173, 40,160, 64,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
- 3, 6,158, 63, 92,224,143,191,244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63,
- 0,127,159,188,126,242, 74, 64, 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,218,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,220,252, 2, 0, 0, 0, 0,
+ 88,217,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
+130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,
-162, 30,184, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,220,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,218,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
+ 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,221,252, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,104, 3, 0, 0,168,221,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0, 36,101,230, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190,
+ 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
+ 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,
+192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191,
+ 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
+244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
+ 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 25, 25,195, 62, 12,250,206, 62,
+ 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,211,120, 21,194,144, 5, 2, 66,
+ 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,101,210, 65,173, 40,160, 64,221,149, 47, 63, 85,126,162,190,
+ 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
+ 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
+244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
+ 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190,
+ 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,162, 30,184, 58, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232, 4, 61, 10,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 16, 6, 61, 10,
-200, 0, 0, 0, 1, 0, 0, 0,200, 43, 88, 10, 24,251, 60, 10,216,215, 60, 10,152,214, 60, 10,152,215, 60, 10, 24,216, 60, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,168, 42, 88, 10,168, 42, 88, 10,160, 6, 61, 10,200, 7, 61, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 6, 61, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 7, 61, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,
+237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 72, 1, 0, 0, 88,225,252, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
+ 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
+136,213,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
+216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
+ 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,230,252, 2, 0, 0, 0, 0,
+184,230,252, 2, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0, 72,229,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+216,227,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,229,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 7, 61, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 6, 61, 10, 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,
-128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68, 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 4, 0, 0, 24, 6,127, 2, 7, 6,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 2,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 72,229,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0,
+ 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68,
+ 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,
+236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 24, 6,127, 2, 7, 6,109, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,244, 0, 0, 0,168, 42, 88, 10,177, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,
+184,230,252, 2, 0, 0, 0, 0,171, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,200, 43, 88, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 16, 6, 61, 10,152,213, 60, 10,216,215, 60, 10, 88,216, 60, 10,152,216, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0,
- 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 47, 88, 10,
-208, 47, 88, 10, 88, 44, 88, 10,168, 46, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 88, 44, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 45, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 45, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 46, 88, 10,
- 88, 44, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
+104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0, 24,233,252, 2, 0, 0, 0, 0,
+248,235,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,233,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,234,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+248,235,252, 2, 0, 0, 0, 0, 24,233,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 46, 88, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 45, 88, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,235,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
0, 0,128,191, 0, 0, 0, 64, 0, 0,146,190, 0,128,164, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,146, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255, 2, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1,
+ 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 33, 0, 0,208, 47, 88, 10,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,
-100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,104,237,252, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
+154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1077,8 +1270,8 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1207,1764 +1400,2360 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 24, 81, 88, 10,196, 0, 0, 0, 1, 0, 0, 0,
-168, 85, 89, 10,224,212, 60, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 81, 88, 10,144, 84, 88, 10,208, 84, 88, 10,
-152, 89, 88, 10,224, 89, 88, 10, 24, 35, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 1, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 74, 84, 8, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 81, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 82, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 82, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 82, 88, 10,208, 81, 88, 10, 0, 0, 0, 0, 0, 0,226, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 82, 88, 10, 16, 82, 88, 10, 0, 0, 0, 0,246, 4,226, 3,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 82, 88, 10, 80, 82, 88, 10,
- 0, 0, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 82, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 83, 88, 10,144, 82, 88, 10, 0, 0, 0, 0, 0, 0,199, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 83, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 83, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,246, 4,199, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 83, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 20, 4, 0, 0,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,208, 83, 88, 10, 80, 83, 88, 10,
- 0, 0, 0, 0, 20, 4,199, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208, 83, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,
- 16, 84, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 20, 4, 24, 3, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 16, 84, 88, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 80, 84, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,246, 4, 24, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 80, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0,144, 84, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 92, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,144, 84, 88, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 84, 88, 10,
- 0, 0, 0, 0, 20, 4, 92, 0, 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 84, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 24, 85, 88, 10, 0, 0, 0, 0, 16, 82, 88, 10, 80, 82, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 24, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 85, 88, 10,208, 84, 88, 10, 16, 82, 88, 10,208, 82, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 85, 88, 10, 24, 85, 88, 10,
- 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 85, 88, 10,198, 0, 0, 0,
- 1, 0, 0, 0,240, 85, 88, 10, 96, 85, 88, 10,208, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,240, 85, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 86, 88, 10,168, 85, 88, 10,208, 81, 88, 10, 80, 83, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 86, 88, 10,
-240, 85, 88, 10,144, 82, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 86, 88, 10,
-198, 0, 0, 0, 1, 0, 0, 0,200, 86, 88, 10, 56, 86, 88, 10,208, 82, 88, 10,144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,200, 86, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 87, 88, 10,128, 86, 88, 10, 16, 83, 88, 10,
-144, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 88, 87, 88, 10,200, 86, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 88, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 87, 88, 10, 16, 87, 88, 10,144, 83, 88, 10,208, 83, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 87, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,232, 87, 88, 10, 88, 87, 88, 10,
- 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,232, 87, 88, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 48, 88, 88, 10,160, 87, 88, 10,144, 82, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 48, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,120, 88, 88, 10,232, 87, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120, 88, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,192, 88, 88, 10,
- 48, 88, 88, 10,208, 81, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,192, 88, 88, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 8, 89, 88, 10,120, 88, 88, 10,208, 82, 88, 10, 80, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 8, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 80, 89, 88, 10,192, 88, 88, 10,144, 83, 88, 10,
-144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 80, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0,
-152, 89, 88, 10, 8, 89, 88, 10, 80, 83, 88, 10,144, 84, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-152, 89, 88, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 80, 89, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,224, 89, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,192, 92, 88, 10, 0, 0, 0, 0,
-208, 82, 88, 10, 16, 82, 88, 10, 80, 82, 88, 10, 16, 83, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,
-226, 3, 0, 0, 7, 7,247, 4, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,160,135, 60, 9, 72, 85, 89, 10, 72, 85, 89, 10,
-112, 90, 88, 10,152, 91, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 32, 57, 88, 9,208, 57, 88, 9, 68, 65, 84, 65,248, 0, 0, 0,
-112, 90, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,152, 91, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0,224,158, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 4, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,247, 4, 26, 0,247, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,246, 4, 0, 0,200, 3, 0, 0,225, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-247, 4, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-224,136, 60, 9, 16,134, 80, 10, 16,134, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0,112, 58, 88, 9,216, 59, 88, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152, 91, 88, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,112, 90, 88, 10,
- 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
-112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 3, 0, 0,226, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,136, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,192, 92, 88, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 32,149, 88, 10,224, 89, 88, 10, 80, 83, 88, 10,208, 83, 88, 10, 16, 84, 88, 10,144, 82, 88, 10, 0, 0, 0, 0,
- 21, 4, 0, 0,246, 4, 0, 0, 0, 0, 0, 0, 23, 3, 0, 0, 4, 4,226, 0, 24, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,
-184,132, 60, 9, 16,143, 88, 10,184,148, 88, 10, 80, 93, 88, 10,120, 94, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 97, 81, 10,
- 8,197, 65, 10, 68, 65, 84, 65,248, 0, 0, 0, 80, 93, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,120, 94, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 98, 67, 0, 0, 0, 0, 0, 0,248, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,226, 0, 31, 0,226, 0, 31, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,249, 2, 0, 0, 23, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,135, 60, 9, 8, 84, 78, 9, 8, 84, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0,
-200,244, 80, 10, 48,246, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 94, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 80, 93, 88, 10, 0, 0, 0, 0, 0, 0, 98, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 81, 67, 0, 64, 62,196, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0,
- 74, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,226, 0,249, 2,209, 0,249, 2, 0, 0,216, 14, 82, 9, 11, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,
- 0, 0, 0, 0,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,249, 2, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,133, 60, 9,224,115, 84, 10,
- 32, 15, 76, 10,160, 95, 88, 10, 8,150, 84, 10,240,246, 80, 10, 88,248, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160, 95, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16, 97, 88, 10, 0, 0, 0, 0,248,133, 60, 9, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+216,160,254, 2, 0, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
+ 56, 29,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 48,150, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104, 17,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+248, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 4, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,232, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,232, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,232, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 52, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 52, 3, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 96, 0, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
+104, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
+ 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+ 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
+152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0,
+192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
+248, 16,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 4, 4, 0, 0, 7, 7,127, 7, 28, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,
+120, 29,225, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0,
+ 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 96, 15, 3, 0, 0, 0, 0,
+120, 98,223, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 30,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+136, 31,225, 2, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 38,157, 4, 0, 0, 0, 0,152,247, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 32,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,192,237, 68, 0, 0, 0, 0, 0, 0, 0, 64,110, 7, 0, 0,127, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,109, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3,
+ 2, 0, 0, 4, 10, 0,127, 7, 2, 0,110, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0, 3, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+152, 30,225, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152,146,157, 4, 0, 0, 0, 0, 56,251, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+184,132,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
+120, 20,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 0, 0, 0, 0, 51, 3, 0, 0, 4, 4, 82, 1, 52, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 24, 25,225, 2, 0, 0, 0, 0,
+ 8,125,253, 2, 0, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,104, 34,253, 2, 0, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 83,223, 2, 0, 0, 0, 0,184, 64,159, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,104, 34,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67,
+ 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65,
+ 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1,
+ 31, 0, 82, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 21, 3, 0, 0, 51, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 31, 0, 4, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 28,225, 2, 0, 0, 0, 0,
+136,135,101, 4, 0, 0, 0, 0,136,135,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,143,159, 4, 0, 0, 0, 0,152, 0, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,216, 35,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 34,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67,
+ 0, 64, 69,196, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 82, 1,
+ 21, 3, 65, 1, 21, 3, 0, 0, 56, 77, 99, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
+ 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 21, 3, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 26,225, 2, 0, 0, 0, 0,
+ 24, 49,115, 4, 0, 0, 0, 0,232,145, 99, 4, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+152,150,154, 4, 0, 0, 0, 0,200, 5, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 40, 27,225, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 65, 1, 36, 0,
+ 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0, 24, 48,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,220,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 65, 1, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 43, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 97, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0,128, 98, 88, 10,160, 95, 88, 10,152,106,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,
-110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,
-110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,209, 0, 61, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 40,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
+232, 38,253, 2, 0, 0, 0, 0,120, 51,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 98, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240, 99, 88, 10, 16, 97, 88, 10,
-136,110,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 8, 70,110, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-240, 99, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,101, 88, 10,128, 98, 88, 10,168,147,165, 9, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,
-110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,
-209, 0,203, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 65, 1,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 45, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,101, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
-208,102, 88, 10,240, 99, 88, 10, 32,137,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,209, 0, 58, 0, 20, 0, 0, 0, 0, 0, 2, 0,
- 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 43,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
+ 40, 42,253, 2, 0, 0, 0, 0, 56, 68,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105,
+ 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 65, 1, 58, 0,
+ 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,102, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,104, 88, 10, 96,101, 88, 10,112,141,165, 9,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0, 24, 71,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 47, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 34,254,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,104, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,105, 88, 10,208,102, 88, 10,160,114,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
+104, 45,253, 2, 0, 0, 0, 0,216, 53,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,209, 0,102, 0,
- 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 65, 1,102, 0,
+ 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,105, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,107, 88, 10,
- 64,104, 88, 10,160,126,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,120, 62,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 65, 1,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 49, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,107, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,108, 88, 10,176,105, 88, 10,144,118,165, 9, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
+168, 48,253, 2, 0, 0, 0, 0,184, 56,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,
+110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,152, 59,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,242,252,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 51, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,108, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,110, 88, 10, 32,107, 88, 10,176,122,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,
-115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,
-115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,209, 0, 0, 0, 0, 0, 0, 0,
- 4, 0, 2, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 53,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
+232, 51,253, 2, 0, 0, 0, 0, 8, 82,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,110, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,111, 88, 10,144,108, 88, 10,
-192,151,165, 9, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 65, 1, 0, 0,
+ 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0,232, 84,145, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,209, 0, 0, 0, 20, 0, 0, 0, 4, 0, 2, 0, 0, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,111, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,112, 88, 10, 0,110, 88, 10, 40,158,165, 9, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 53, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,
-209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,112, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,114, 88, 10,112,111, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 56,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
+ 40, 55,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 7, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 65, 1,179, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,114, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,115, 88, 10,224,112, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,254, 65, 1,171, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,102,254, 7, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,115, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,117, 88, 10, 80,114, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
+104, 58,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108,117,101,110, 99,
101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,253, 7, 1, 36, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,253, 65, 1, 36, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,117, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,118, 88, 10,
-192,115, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
-111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,
-111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,253, 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,118, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 16,120, 88, 10, 48,117, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 87,254, 7, 1,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 63,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
+168, 61,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16,120, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0,128,121, 88, 10,160,118, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,
-109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,
-109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,254, 65, 1,186, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,253, 7, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128,121, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,240,122, 88, 10, 16,120, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 83, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,252, 7, 1,212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 65, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-240,122, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 96,124, 88, 10,128,121, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,
-101, 32, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251,
- 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 96,124, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
-208,125, 88, 10,240,122, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 66,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
+232, 64,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 83, 97,
+109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,253, 65, 1,212, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 69,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
+ 40, 68,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,254, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,254, 7, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,208,125, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 64,127, 88, 10, 96,124, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64,127, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0,176,128, 88, 10,208,125, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
+104, 71,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,111,111,100, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,176,128, 88, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,130, 88, 10,
- 64,127, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 32,130, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,144,131, 88, 10,176,128, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 76,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
+168, 74,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,111,114,111,110,111,105, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,253, 7, 1,196, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,123,253, 7, 1,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,144,131, 88, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0,133, 88, 10, 32,130, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
-111,105,110,116,100,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
-111,105,110,116,100,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,105,110,116, 32, 68,101,110,115,105,116,
-121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253, 7, 1,179, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,111,105,110,116, 32, 68,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0,133, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,112,134, 88, 10,144,131, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
-116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,
-116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253, 7, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,253, 7, 1,102, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-112,134, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,224,135, 88, 10, 0,133, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
- 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,
-114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253,
- 7, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 79,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
+232, 77,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,117,108,101,110,
+ 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,253, 7, 1,102, 0,
+ 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,135, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 80,137, 88, 10,112,134, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, 7, 1,183, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 82,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
+ 40, 81,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, 7, 1,183, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 80,137, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,192,138, 88, 10,224,135, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,192,138, 88, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 48,140, 88, 10, 80,137, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
+104, 84,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,116,111,114,116,101,
100, 32, 78,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 7, 1,108, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 48,140, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,160,141, 88, 10,
-192,138, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,254, 7, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,254, 7, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,160,141, 88, 10,199, 0, 0, 0, 1, 0, 0, 0,216,242, 87, 9, 48,140, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72, 89,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
+168, 87,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,117, 99, 99,105, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,183,253, 7, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,253, 7, 1,136, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,242, 87, 9,199, 0, 0, 0,
- 1, 0, 0, 0,128, 20, 85, 10,160,141, 88, 10,112,180,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
-102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,
-102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,111,100,105,102,105,101,114,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,128, 20, 85, 10,199, 0, 0, 0, 1, 0, 0, 0, 32,118, 88, 9,216,242, 87, 9,
- 80,127,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136, 92,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
+232, 90,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255,209, 0, 36, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 32,118, 88, 9,199, 0, 0, 0, 1, 0, 0, 0,216,168, 85, 10,128, 20, 85, 10, 64,131,163, 9, 0, 0, 0, 0, 68, 65, 84, 65,
- 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,
-111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,
-209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
+104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
+104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216,168, 85, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 56,155, 87, 9, 32,118, 88, 9, 48,135,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,255,209, 0, 58, 0, 0, 0, 0, 0, 0, 0, 4, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200, 95,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
+ 40, 94,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,255,209, 0, 58, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0, 56,155, 87, 9,199, 0, 0, 0, 1, 0, 0, 0,232, 33, 81, 10,216,168, 85, 10, 32,139,163, 9,
- 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 83,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,232, 33, 81, 10,
-199, 0, 0, 0, 1, 0, 0, 0,152,148, 84, 10, 56,155, 87, 9, 64,143,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,100,253, 2, 0, 0, 0, 0,
+104, 97,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 71,
114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174,254,209, 0, 76, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,100,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152,148, 84, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 43, 84, 10,
-232, 33, 81, 10, 48,147,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,232, 43, 84, 10,199, 0, 0, 0, 1, 0, 0, 0, 8,150, 84, 10,152,148, 84, 10, 32,151,163, 9, 0, 0, 0, 0,
- 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,102,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,103,253, 2, 0, 0, 0, 0,
+168,100,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 32, 84,101,120,116,117,
+114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,237,253,209, 0, 69, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,103,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 85, 86, 32, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,237,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8,150, 84, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,232, 43, 84, 10, 64,155,163, 9, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
-101,120, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,
-101,120, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 67,111,108,111,114,
-115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,253,209, 0, 69, 0, 0, 0, 0, 0,
- 0, 0, 4, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,143, 88, 10,165, 0, 0, 0, 1, 0, 0, 0,184,148, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,105,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
+232,103,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94,255, 65, 1,126, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
- 96,139, 79, 9,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24,144, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 64,145, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 32,209, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68,
- 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
-149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 0, 1, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 64,145, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,104,146, 88, 10, 24,144, 88, 10, 0, 0, 0, 0, 0, 0,112, 67,
- 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,146, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,144,147, 88, 10,
- 64,145, 88, 10, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0,
- 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68,
- 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5,
- 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,147, 88, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104,146, 88, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0,
- 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 2, 0, 3, 3,
- 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,
-136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 60, 0, 0, 0,184,148, 88, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16,143, 88, 10, 24,144, 88, 10,
-144,147, 88, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 32,149, 88, 10,200, 0, 0, 0,
- 1, 0, 0, 0,232,152, 88, 10,192, 92, 88, 10,208, 81, 88, 10, 80, 84, 88, 10,144, 84, 88, 10, 80, 83, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 15, 15, 20, 4, 92, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,104, 60, 9, 0,152, 88, 10, 0,152, 88, 10,176,149, 88, 10,216,150, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,208,248, 80, 10,
-128,249, 80, 10, 68, 65, 84, 65,248, 0, 0, 0,176,149, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,216,150, 88, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,105, 60, 9, 16, 28, 82, 9, 16, 28, 82, 9, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,250, 80, 10,136,251, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216,150, 88, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,176,149, 88, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,
-246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 4, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 18, 0, 0, 0, 65, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4,
- 8, 0, 20, 4, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0,
- 26, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 66, 0, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,104, 60, 9, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,252, 80, 10, 40,254, 80, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-188, 0, 0, 0, 0,152, 88, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,254, 65, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,232,152, 88, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 24, 35, 89, 10, 32,149, 88, 10,208, 83, 88, 10,144, 83, 88, 10, 16, 83, 88, 10, 16, 84, 88, 10, 0, 0, 0, 0, 21, 4, 0, 0,
-246, 4, 0, 0, 25, 3, 0, 0,198, 3, 0, 0, 3, 3,226, 0,174, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 88,102, 60, 9,
-200,155, 88, 10,200,155, 88, 10,120,153, 88, 10,160,154, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,160,254, 80, 10, 80,255, 80, 10,
- 68, 65, 84, 65,248, 0, 0, 0,120,153, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,160,154, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 98, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-225, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,226, 0, 26, 0,226, 0, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0,173, 3, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,226, 0, 26, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152,103, 60, 9,232,161, 84, 10,232,161, 84, 10, 0, 0, 0, 0, 0, 0, 0, 0,240,255, 80, 10,
- 88, 1, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160,154, 88, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,120,153, 88, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 67,
- 0, 0, 2,195, 0, 0, 0, 0,209, 0, 0, 0,226, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,208, 0, 0, 0, 18, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 2, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,226, 0,
-148, 0,209, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 4, 0, 0,246, 4, 0, 0, 25, 3, 0, 0,
-172, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 0,148, 0, 8, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,103, 60, 9, 96, 94, 84, 9, 96, 94, 84, 9,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 2, 81, 10, 8, 3, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,
-200,155, 88, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,108,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,110,253, 2, 0, 0, 0, 0,
+ 40,107,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,102,102,117,115,101, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,254, 65, 1, 63, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,110,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 11, 65, 10,128, 11, 65, 10, 0,142, 88, 9, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 0,142, 88, 9,224, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0,
- 42, 11, 0, 0,240,156, 88, 10, 68, 65, 84, 65,248,133, 0, 0,240,156, 88, 10,223, 0, 0, 0, 42, 11, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10,
- 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,
-152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0, 40, 4, 91, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,112,240, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10, 21, 0, 0, 0, 1, 0, 1, 0,
- 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 16,228, 90, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 16,228, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0, 16,228, 90, 10, 30, 0,255,255, 1, 0, 0, 0,232, 84, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,168, 90, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 48, 95, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-184, 99, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 64,104, 92, 10, 30, 0,255,255, 1, 0, 0, 0,200,108, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0, 80,113, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,117, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 96,122, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,232,126, 92, 10, 30, 0,255,255, 1, 0, 0, 0,112,131, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-248,135, 92, 10, 30, 0,255,255, 1, 0, 0, 0,128,140, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 8,145, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0,144,149, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 24,154, 92, 10, 30, 0,255,255, 1, 0, 0, 0,160,158, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0, 40,163, 92, 10, 30, 0,255,255, 1, 0, 0, 0,176,167, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
- 56,172, 92, 10, 30, 0,255,255, 1, 0, 0, 0,192,176, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 72,181, 92, 10, 30, 0,255,255,
- 1, 0, 0, 0,208,185, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 88,190, 92, 10, 30, 0,255,255, 1, 0, 0, 0,224,194, 92, 10,
- 30, 0,255,255, 1, 0, 0, 0,104,199, 92, 10, 30, 0,255,255, 1, 0, 0, 0,240,203, 92, 10, 30, 0,255,255, 1, 0, 0, 0,
-120,208, 92, 10, 30, 0,255,255, 1, 0, 0, 0, 0,213, 92, 10, 30, 0,255,255, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 3, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 8, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 11, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 16, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 19, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 24, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 27, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 32, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 35, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 40, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 43, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 48, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 51, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 56, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 59, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 64, 0,
- 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232, 84, 92, 10,
- 31, 0, 67, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,232, 84, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,
-232, 84, 92, 10, 30, 0,255,255, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 1, 0, 0, 0,112,240, 90, 10, 30, 0,255,255,
- 1, 0, 0, 0, 40, 4, 91, 10, 30, 0,255,255, 1, 0, 0, 0,240, 74, 92, 10, 30, 0,255,255, 3, 0, 0, 0,208,245, 90, 10,
- 30, 0,255,255, 1, 0, 0, 0,152,250, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 96,255, 90, 10, 30, 0,255,255, 1, 0, 0, 0,
- 88,159, 78, 10, 30, 0,255,255, 1, 0, 0, 0,224,212, 60, 10, 30, 0,255,255, 1, 0, 0, 0, 24, 81, 88, 10, 30, 0,255,255,
- 1, 0, 0, 0,168, 85, 89, 10, 30, 0,255,255, 1, 0, 0, 0,248, 63, 90, 10, 30, 0,255,255, 1, 0, 0, 0, 64,130, 90, 10,
- 30, 0,255,255, 1, 0, 0, 0,232,191, 90, 10, 30, 0,255,255, 1, 0, 0, 0,224,168, 91, 10, 30, 0,255,255, 1, 0, 0, 0,
- 0,140, 81, 9, 30, 0,255,255, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-168, 90, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,168, 90, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,168, 90, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
- 48, 95, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 48, 95, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 48, 95, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,184, 99, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-184, 99, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,184, 99, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 64,104, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 64,104, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 64,104, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-200,108, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,200,108, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,200,108, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,200,108, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
- 80,113, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 80,113, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 80,113, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,216,117, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-216,117, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,216,117, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,216,117, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,122, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 96,122, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 96,122, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-232,126, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,232,126, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,232,126, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,232,126, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-112,131, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,112,131, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,112,131, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,112,131, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,248,135, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-248,135, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,248,135, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,248,135, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,128,140, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,128,140, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-128,140, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,128,140, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 8,145, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 8,145, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 8,145, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-144,149, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,144,149, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,144,149, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,144,149, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 24,154, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 24,154, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,160,158, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,160,158, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-160,158, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,160,158, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 40,163, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40,163, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 40,163, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-176,167, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,176,167, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,176,167, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,176,167, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 56,172, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 56,172, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 56,172, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,192,176, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,192,176, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-192,176, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,192,176, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
- 72,181, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 72,181, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-208,185, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,208,185, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,185, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,208,185, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0, 88,190, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
- 88,190, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0,224,194, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,224,194, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
-224,194, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,224,194, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-104,199, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,104,199, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,104,199, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,104,199, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 27, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 30, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 35, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 38, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 43, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 46, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 51, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 54, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 59, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 62, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,
-240,203, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 67, 0,
- 1, 0, 0, 0,240,203, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,240,203, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,240,203, 92, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 13, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 16, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 21, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 24, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 29, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 32, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 37, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 40, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 45, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 48, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 53, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 56, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 61, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,120,208, 92, 10,
- 31, 0, 64, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,
-120,208, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,120,208, 92, 10, 31, 0, 69, 0,
- 1, 0, 0, 0,120,208, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 1, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 9, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 10, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 15, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 17, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 18, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 23, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 25, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 26, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 31, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 33, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 34, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 39, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 41, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 42, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 47, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 49, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 50, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 52, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 55, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 57, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 58, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 60, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 63, 0,
- 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 65, 0, 1, 0, 0, 0, 0,213, 92, 10,
- 31, 0, 66, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 68, 0, 1, 0, 0, 0,
- 0,213, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0, 0,213, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 53, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 55, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 56, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 58, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 59, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 61, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-136,217, 92, 10, 31, 0, 63, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 64, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,136,217, 92, 10, 31, 0, 66, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 67, 0, 1, 0, 0, 0,136,217, 92, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 69, 0, 1, 0, 0, 0,136,217, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,216,239, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,216,239, 90, 10,
- 31, 0, 22, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,
-216,239, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,216,239, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,112,240, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,112,240, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,112,240, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-112,240, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 1, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 2, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 4, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 5, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 9, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 10, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 12, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 13, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 17, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 18, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 19, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 20, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 21, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 22, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 23, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 24, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 25, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 26, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 27, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 28, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 29, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 30, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 31, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 32, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 33, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 34, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 35, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 36, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 37, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 38, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 39, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 40, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 41, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 42, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 43, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 44, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 45, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 46, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 47, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 48, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 49, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 50, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 51, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 52, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 53, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 54, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 55, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 56, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 57, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 58, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 59, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 60, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 61, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 62, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 63, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 64, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 65, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 66, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 67, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 68, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 69, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 70, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 71, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 72, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 73, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 74, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 75, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 76, 0, 1, 0, 0, 0, 40, 4, 91, 10,
- 31, 0, 77, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 78, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 79, 0, 1, 0, 0, 0,
- 40, 4, 91, 10, 31, 0, 80, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 81, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 82, 0,
- 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 83, 0, 1, 0, 0, 0, 40, 4, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 1, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 2, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 3, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 4, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 5, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 6, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 7, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 8, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 9, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 10, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 11, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 12, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 13, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 14, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 15, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 16, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 17, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 18, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 19, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 20, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 21, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 22, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 23, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 24, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 25, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 26, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 27, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 28, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 29, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 30, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 31, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 32, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 33, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 34, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 35, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 36, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 37, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 38, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 39, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 40, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 41, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 42, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 43, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 44, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 45, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 46, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 47, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 48, 0, 1, 0, 0, 0,240, 74, 92, 10,
- 31, 0, 49, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 50, 0, 1, 0, 0, 0,240, 74, 92, 10, 31, 0, 51, 0, 1, 0, 0, 0,
-240, 74, 92, 10, 31, 0, 0, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 2, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 5, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 10, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 13, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 18, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 21, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 26, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 29, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 34, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 37, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 42, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 45, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 50, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 53, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 58, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 61, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 66, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 69, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 74, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 77, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 82, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 85, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 90, 0,
- 1, 0, 0, 0,208,245, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0,208,245, 90, 10,
- 31, 0, 93, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,
-208,245, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,208,245, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 11, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 19, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 20, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 24, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 25, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 27, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 28, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 32, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 33, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 35, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 36, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 40, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 41, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 43, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 44, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 48, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 49, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 51, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 52, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 56, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 57, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 59, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 60, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 64, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 65, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 67, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 68, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 72, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 73, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 75, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 76, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 80, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 81, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 83, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 84, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 88, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 89, 0,
- 1, 0, 0, 0,152,250, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 91, 0, 1, 0, 0, 0,152,250, 90, 10,
- 31, 0, 92, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0,
-152,250, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 96, 0, 1, 0, 0, 0,152,250, 90, 10, 31, 0, 0, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 3, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 8, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 11, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 14, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 16, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 19, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 21, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 22, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 23, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 24, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 25, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 26, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 27, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 28, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 29, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 30, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 31, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 32, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 33, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 34, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 35, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 36, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 37, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 38, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 39, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 40, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 41, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 42, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 43, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 44, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 45, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 46, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 47, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 48, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 49, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 50, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 51, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 52, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 53, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 54, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 55, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 56, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 57, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 58, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 59, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 60, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 61, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 62, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 63, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 64, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 65, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 66, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 67, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 68, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 69, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 70, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 71, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 72, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 73, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 74, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 75, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 76, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 77, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 78, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 79, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 80, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 81, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 82, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 83, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 84, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 85, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 86, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 87, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 88, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 89, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 90, 0, 1, 0, 0, 0, 96,255, 90, 10,
- 31, 0, 91, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 92, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 93, 0, 1, 0, 0, 0,
- 96,255, 90, 10, 31, 0, 94, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 95, 0, 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 96, 0,
- 1, 0, 0, 0, 96,255, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 1, 0, 1, 0, 0, 0, 88,159, 78, 10,
- 31, 0, 2, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 3, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 4, 0, 1, 0, 0, 0,
- 88,159, 78, 10, 31, 0, 5, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 6, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 7, 0,
- 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 8, 0, 1, 0, 0, 0, 88,159, 78, 10, 31, 0, 9, 0, 1, 0, 0, 0, 88,159, 78, 10,
- 31, 0, 0, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 2, 0, 1, 0, 0, 0,
-224,212, 60, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 5, 0,
- 1, 0, 0, 0,224,212, 60, 10, 31, 0, 6, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,212, 60, 10,
- 31, 0, 8, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,212, 60, 10, 31, 0, 0, 0, 1, 0, 0, 0,
- 24, 81, 88, 10, 31, 0, 1, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 2, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 3, 0,
- 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 4, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 5, 0, 1, 0, 0, 0, 24, 81, 88, 10,
- 31, 0, 6, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 7, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 8, 0, 1, 0, 0, 0,
- 24, 81, 88, 10, 31, 0, 9, 0, 1, 0, 0, 0, 24, 81, 88, 10, 31, 0, 0, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 2, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 3, 0, 1, 0, 0, 0,168, 85, 89, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 5, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-168, 85, 89, 10, 31, 0, 7, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 8, 0, 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,168, 85, 89, 10, 31, 0, 0, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,248, 63, 90, 10,
- 31, 0, 2, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,
-248, 63, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 7, 0,
- 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,248, 63, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,248, 63, 90, 10,
- 31, 0, 0, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,
- 64,130, 90, 10, 31, 0, 3, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 5, 0,
- 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 6, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0, 64,130, 90, 10,
- 31, 0, 8, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0, 64,130, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,
-232,191, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,232,191, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,232,191, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-232,191, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,232,191, 90, 10, 31, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 1, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 3, 0, 1, 0, 0, 0,224,168, 91, 10,
- 31, 0, 4, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 6, 0, 1, 0, 0, 0,
-224,168, 91, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 8, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 9, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 11, 0, 1, 0, 0, 0,224,168, 91, 10,
- 31, 0, 12, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 14, 0, 1, 0, 0, 0,
-224,168, 91, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 16, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 17, 0,
- 1, 0, 0, 0,224,168, 91, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,168, 91, 10, 31, 0, 0, 0, 1, 0, 0, 0, 0,140, 81, 9,
- 31, 0, 1, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 2, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 3, 0, 1, 0, 0, 0,
- 0,140, 81, 9, 31, 0, 4, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 5, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 6, 0,
- 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 7, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 8, 0, 1, 0, 0, 0, 0,140, 81, 9,
- 31, 0, 9, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 10, 0, 1, 0, 0, 0, 0,140, 81, 9, 31, 0, 0, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 1, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 2, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 3, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 4, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 5, 0, 1, 0, 0, 0,224,243, 90, 10,
- 31, 0, 6, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 7, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 8, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 9, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 10, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 11, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 12, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 13, 0, 1, 0, 0, 0,224,243, 90, 10,
- 31, 0, 14, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 15, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 16, 0, 1, 0, 0, 0,
-224,243, 90, 10, 31, 0, 17, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 18, 0, 1, 0, 0, 0,224,243, 90, 10, 31, 0, 19, 0,
- 1, 0, 0, 0,224,243, 90, 10, 31, 0, 20, 0, 1, 0, 0, 0,224,243, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 24, 35, 89, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,232,152, 88, 10, 80, 84, 88, 10,208, 82, 88, 10,144, 83, 88, 10,144, 84, 88, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 93, 0, 0, 0,198, 3, 0, 0, 1, 1, 20, 4,106, 3, 1, 0, 0, 0, 0, 0,
- 0, 0, 8, 0,232,105, 60, 9,120, 66, 89, 10,224, 84, 89, 10,168, 35, 89, 10,216, 61, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 3, 81, 10, 56, 5, 81, 10, 68, 65, 84, 65,248, 0, 0, 0,168, 35, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,208, 36, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,130, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 20, 4, 26, 0, 20, 4,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 4, 0, 0, 93, 0, 0, 0,118, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,113, 60, 9,192,146, 84, 10,192,146, 84, 10, 0, 0, 0, 0,
- 0, 0, 0, 0,216, 5, 81, 10,184, 7, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,208, 36, 89, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 24, 58, 89, 10,168, 35, 89, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 30,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 15, 67, 0, 0, 30,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0,160, 0,120, 2,143, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-159, 0, 0, 0, 79, 1, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 2,
- 10, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,111, 60, 9,
- 8, 52, 82, 9, 8, 52, 82, 9,248, 37, 89, 10,168, 56, 89, 10,176, 54, 85, 10, 24, 56, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,248, 37, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,104, 39, 89, 10, 0, 0, 0, 0,144,184,170, 9,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,112,101, 99,117,108, 97,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,253, 65, 1, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 42,254,143, 0,190, 1, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,104, 39, 89, 10,
-199, 0, 0, 0, 1, 0, 0, 0,216, 40, 89, 10,248, 37, 89, 10,224,234,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115,104, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8,112,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,113,253, 2, 0, 0, 0, 0,
+104,110,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,254,143, 0, 21, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,253, 65, 1, 80, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,113,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 40, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 72, 42, 89, 10,
-104, 39, 89, 10,248,238,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,
-104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,
-104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,252,143, 0,213, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,112, 97,114,101,110, 99,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 72, 42, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 43, 89, 10,216, 40, 89, 10, 0,247,170, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,115,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,116,253, 2, 0, 0, 0, 0,
+168,113,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,114,114,111,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,253, 65, 1, 0, 0,
+ 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,116,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,117, 98,115,117,114,102, 97, 99,101, 32, 83, 99, 97,116,116,101,114,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,118,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
+232,116,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114, 97,110,100, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,252, 65, 1,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,121,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+ 40,120,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,252, 65, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,123,253, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,248, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 24, 31,101, 4, 0, 0, 0, 0,
+255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,127,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67,
+ 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
+ 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
+ 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,129,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,152,130,253, 2, 0, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68,
+ 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0,
+ 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,130,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,175, 68,
+ 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0,
+ 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0,
+ 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 2, 2, 0, 0, 2, 0, 3, 3, 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,
+162, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
+152,130,253, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,168,137,253, 2, 0, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
+232, 20,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 15, 15, 44, 6, 96, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,239,224, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0,
+ 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,240, 13, 3, 0, 0, 0, 0,
+104, 14,160, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,133,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184,241,224, 2, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,235,215, 4, 0, 0, 0, 0, 40, 11, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,135,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
+112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 18, 0, 0, 0, 69, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
+ 4, 0, 0, 4, 8, 0, 44, 6, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 6, 70, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,240,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104, 12, 14, 3, 0, 0, 0, 0,232, 17, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+168,137,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
+ 8, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,231, 3, 0, 0, 3, 3, 82, 1,179, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 8, 0,168,236,224, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,
+152,138,253, 2, 0, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,252, 13, 3, 0, 0, 0, 0, 8, 75,223, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,138,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1, 26, 0, 82, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,206, 3, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 26, 0, 8, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,238,224, 2, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,191,216, 4, 0, 0, 0, 0, 72, 23, 14, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,140,253, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,138,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67,
+ 0, 0,232,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67, 0, 0, 7,195, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0,
+ 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0,
+ 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 82, 1,153, 0, 65, 1,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,205, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 1,153, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,237,224, 2, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 4, 0, 0, 0, 0,232, 26, 14, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,120,141,253, 2, 0, 0, 0, 0,
+163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0,
+216,142,253, 2, 0, 0, 0, 0, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0,
+ 68, 65, 84, 65, 16, 0, 0, 0,216,142,253, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0, 42, 11, 0, 0,
+ 56,143,253, 2, 0, 0, 0, 0, 68, 65, 84, 65,160,178, 0, 0, 56,143,253, 2, 0, 0, 0, 0,216, 0, 0, 0, 42, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 30, 0,255,255, 3, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 30, 0,255,255, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 84, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 86, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 88, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 90, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 92, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 94, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 31, 0, 96, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 21, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 23, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 25, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 27, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 29, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 31, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 33, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 35, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 37, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 39, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 41, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 43, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 45, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 47, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 49, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 51, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 53, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 55, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 57, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 59, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 61, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 63, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 65, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 67, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 69, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 71, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 73, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 75, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 77, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 79, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 81, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 83, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 85, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 87, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 89, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 91, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 93, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 95, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 12, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 14, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 16, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 18, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 20, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 22, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 24, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 26, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 28, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 30, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 32, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 34, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 36, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 38, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 40, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 42, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 44, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 46, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 48, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 50, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 52, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 54, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 56, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 58, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 60, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 62, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 64, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 66, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 68, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 70, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 72, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 74, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 76, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 78, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 80, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 82, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 84, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 86, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 88, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 90, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 92, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 94, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
+ 31, 0, 96, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 2, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 4, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 6, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 8, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
+ 31, 0, 10, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 1, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 3, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 5, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 7, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 9, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 11, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 13, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 15, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 17, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 31, 0, 19, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,137,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
+ 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,231, 3, 0, 0,
+ 1, 1, 44, 6,135, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,168,242,224, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,
+216,126,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0, 56, 97,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 18, 14, 3, 0, 0, 0, 0,184, 95,216, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24, 67,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,122, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,253,224, 2, 0, 0, 0, 0, 72,102,101, 4, 0, 0, 0, 0,
+ 72,102,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,229,114, 4, 0, 0, 0, 0,
+136, 35, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+136, 68,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 37,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255, 63, 37,196, 0, 0, 0, 0,
+143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,149, 2,143, 0,149, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 83, 1, 0, 0,231, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,149, 2, 11, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,249,224, 2, 0, 0, 0, 0,200,132,101, 4, 0, 0, 0, 0,
+200,132,101, 4, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,136, 53,219, 4, 0, 0, 0, 0,
+ 56, 39, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+248, 69,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232, 29,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,254,143, 0,210, 1, 0, 0, 0, 0, 0, 0, 39, 0,
+ 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 71,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 56, 73,254, 2, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,211,254,143, 0, 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 56, 73,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,252,143, 0,213, 1, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 74,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+120, 76,254, 2, 0, 0, 0, 0, 56, 73,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
@@ -2974,82 +3763,89 @@ char datatoc_startup_blend[]= {
0, 0, 66,254,143, 0,121, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,184, 43, 89, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 40, 45, 89, 10, 72, 42, 89, 10, 24,251,170, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95, 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95, 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+120, 76,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,143, 0,231, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,143, 0,231, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40, 45, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,152, 46, 89, 10,184, 43, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,
-112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,
-112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+184, 79,254, 2, 0, 0, 0, 0,120, 76,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,253,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-152, 46, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 48, 89, 10, 40, 45, 89, 10,232,242,170, 9, 0, 0, 0, 0, 86, 73, 69, 87,
- 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
- 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108,
+ 0, 0, 96,253,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,254,
-143, 0, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+184, 79,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 8, 48, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,
-120, 49, 89, 10,152, 46, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,254,143, 0, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+248, 82,254, 2, 0, 0, 0, 0,184, 79,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,120, 49, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,232, 50, 89, 10, 8, 48, 89, 10, 8,255,170, 9,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
+ 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
+ 0, 0, 52,253,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,145,253,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+248, 82,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
+ 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
+ 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,145,253,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,232, 50, 89, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 88, 52, 89, 10,120, 49, 89, 10, 40, 3,171, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
- 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,101,105,103,104,116, 32, 84,
-111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39,254,143, 0,124, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 84,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 56, 86,254, 2, 0, 0, 0, 0,248, 82,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 88, 52, 89, 10,199, 0, 0, 0, 1, 0, 0, 0,200, 53, 89, 10,
-232, 50, 89, 10, 64, 7,171, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,
-104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,
-104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,253,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 87,101,105,103,104,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,200, 53, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 56, 55, 89, 10, 88, 52, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 39,254,143, 0,124, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 56, 86,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,253,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 87,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+120, 89,254, 2, 0, 0, 0, 0, 56, 86,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
@@ -3059,201 +3855,278 @@ char datatoc_startup_blend[]= {
0, 0,241,252,143, 0, 9, 1, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 56, 55, 89, 10,199, 0, 0, 0,
- 1, 0, 0, 0,168, 56, 89, 10,200, 53, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95,118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
-111,108,115, 95,118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+120, 89,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,253,143, 0,146, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,253,143, 0,146, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 56, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 55, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120, 89,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,146,253,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 24, 58, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,176, 60, 89, 10,208, 36, 89, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195,
- 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,
-215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
-215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,159, 0, 0, 0,119, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-160, 0,216, 0, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-152,111, 60, 9, 16, 42, 84, 10, 16, 42, 84, 10, 64, 59, 89, 10, 64, 59, 89, 10,216, 56, 85, 10, 64, 58, 85, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 64, 59, 89, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 32,112, 60, 9, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0,
+ 0, 0,146,253,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82,101,109,111,118,101, 32, 86,101,114,116,101,120, 32, 67,111,108,111,114, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+184, 92,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200, 95,254, 2, 0, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195, 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,
+143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,123, 0, 0, 0, 82, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216, 0, 12, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,250,224, 2, 0, 0, 0, 0,232,142,112, 4, 0, 0, 0, 0,
+232,142,112, 4, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 88, 54,219, 4, 0, 0, 0, 0,
+232, 42, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 40, 94,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168,251,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
+112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
+112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,114,116,101,120, 32, 67,111,
+108,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-176, 60, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,216, 61, 89, 10, 24, 58, 89, 10, 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,
-206, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,
-206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 4, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 95,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 56, 97,254, 2, 0, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 43, 6, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 40,107, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,216, 61, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,176, 60, 89, 10,
+184,244,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 97,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200, 95,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0, 19, 4, 0, 0,119, 0, 0, 0,198, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 3, 80, 3, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,106, 60, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 68, 85, 10,120, 68, 85, 10, 0, 0, 0, 0, 0, 63, 89, 10, 68, 65, 84, 65, 72, 3, 0, 0, 0, 63, 89, 10,159, 0, 0, 0,
- 1, 0, 0, 0,255,255,139, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,241,145, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190,
- 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,210,111,193,
- 0, 0,128, 63, 68,239,209, 62, 70,119,105, 63,192, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,144, 74, 70, 62,166, 33,101, 63,
- 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 42, 61,228, 62, 0, 0, 0, 0,164, 95, 68, 65,141,120,173,192,225,208,213, 64,
- 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
- 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
-158,210,111, 65,130,240,191, 62,105,116, 85, 63, 64,183, 70,188, 0, 0, 2,180, 25,103,180,190,101,233, 45, 62,215,245, 72, 63,
- 0, 0,128, 50,230,117,117,194, 59,213,216, 65,167,161, 5,194,236,254,159,192,240, 49,114, 66,196,242,213,193,140,218, 3, 66,
-145, 0,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,210,111,193,
- 0, 0,128, 63,177,157,229, 62,212,134,234,190,222,160, 81,191,184,158, 81,191,115, 90,127, 63,152, 22, 98, 62, 9, 46,185, 62,
- 35, 44,185, 62,143,180,109,188, 56,160,130, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,220,161,108, 65,
-158,210,111, 65,204,210, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 20, 64, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,210, 20, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,158,210,111, 65,215,134, 91, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 1,144, 7, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+160, 0, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+140, 5,109, 3, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,243,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 73, 14, 3, 0, 0, 0, 0, 24, 73, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168, 98,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168, 98,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,174,226, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190, 0, 0, 0, 0,
+ 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
+162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
+ 68,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,
+185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, 62, 95, 68, 65, 51,120,173,192,115,208,213, 64, 0, 0,128, 63,
+178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
+145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
+190,240,191, 62, 90,116, 85, 63, 32,179, 70,188, 0, 0,240, 50,103, 75,104,190,190,239,223, 61, 34, 98, 1, 63, 0, 0,180, 51,
+230,117,117,194, 58,213,216, 65,166,161, 5,194, 64,255,159,192,240, 49,114, 66,195,242,213,193,139,218, 3, 66,228, 0,160, 64,
+ 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
+162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
+178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
+145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
+ 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 33,210,111, 65,160,228,143, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+237,200,168, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66,
- 85,152,137, 66,113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 66, 89, 10,160, 0, 0, 0, 1, 0, 0, 0,
-240, 69, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-160, 67, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 68, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 84,152,137, 66,
+113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,102,254, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
+168,109,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,103,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 50, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,126, 7, 0, 0,207, 3, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+127, 7, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,105,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+200,106,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67, 0,128,115,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 95, 67,255,191,115,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,240, 0,207, 3,223, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0,207, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,106,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 56,108,254, 2, 0, 0, 0, 0, 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66,
+ 0, 0, 0, 0, 0,224,209, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,143, 6, 60, 0,143, 6, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0, 0, 0,126, 7, 0, 0,147, 3, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+143, 6, 60, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,108,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,106,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,104,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,224,209, 68, 0, 64, 96,196, 0, 0, 0, 0,126, 6, 0, 0,143, 6, 0, 0, 0, 0, 0, 0,146, 3, 0, 0,
+ 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 18, 0, 0, 0,146, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3,
+ 4, 0, 0, 4, 6, 0,143, 6,147, 3,143, 6,129, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+240, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+143, 6,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0,
+ 56,113,254, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 56,108,254, 2, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 0,255,255, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,110,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+200,111,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 68, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,160, 67, 89, 10,
- 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0,
- 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 30, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,252, 0, 0, 0,240, 69, 89, 10,169, 0, 0, 0,
- 1, 0, 0, 0, 96,241, 89, 10,120, 66, 89, 10,160, 67, 89, 10,200, 68, 89, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,140, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 1, 0, 0, 0,
- 68, 65, 84, 65, 12, 0, 0, 0, 8,140, 79, 9,224, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0, 24, 71, 89, 10,
- 68, 65, 84, 65, 92, 4, 0, 0, 24, 71, 89, 10,223, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10,
- 19, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 20, 0, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 21, 0, 0, 0, 1, 0, 0, 0,
- 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,243, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,152,250, 90, 10, 0, 0, 0, 0,
- 1, 0, 0, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0,224,168, 91, 10,
- 0, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,
-208,245, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,216,239, 90, 10, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 8, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 16, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 24, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
- 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255,
- 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 75, 89, 10,201, 0, 0, 0,
- 1, 0, 0, 0,200, 76, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,197, 68,
- 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0,
- 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,200, 76, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,240, 77, 89, 10,160, 75, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,111,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0, 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
+ 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, 56,113,254, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,
+216,126,254, 2, 0, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0,200,111,254, 2, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,114,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,
+152,114,254, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0,248,114,254, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65,208, 5, 0, 0,248,114,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,121,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+136,122,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,122,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+248,123,254, 2, 0, 0, 0, 0, 24,121,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,240, 77, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 24, 79, 89, 10,
-200, 76, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,123,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+104,125,254, 2, 0, 0, 0, 0,136,122,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0, 4, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 24, 79, 89, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 77, 89, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 7, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,125,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,248,123,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
0, 0, 38,192, 0, 0,102, 64, 0,192,179,191, 0,224, 25, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 0, 0, 0, 0, 0, 0,207, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6,207, 3,
+ 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 33, 0, 0, 96,241, 89, 10,170, 0, 0, 0, 1, 0, 0, 0,224, 84, 89, 10,240, 69, 89, 10,160, 75, 89, 10,
- 24, 79, 89, 10, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,
-100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,216,126,254, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,113,254, 2, 0, 0, 0, 0, 24,121,254, 2, 0, 0, 0, 0,104,125,254, 2, 0, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
+154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3382,7 +4255,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3512,189 +4385,193 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 80, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
-104, 81, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65,
- 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,137, 6,
- 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,
-174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
+120,240,254, 2, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,
+216,176,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+216,162,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
+104,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 72,163,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 8,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 88,166,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
+232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 5,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+200,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,
+ 24,168,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,
+136,168,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,
+248,168,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,
+104,169,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,
+216,169,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,
+ 72,170,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,
+184,170,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,
+ 40,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,
+152,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,
+ 8,172,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,
+120,172,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,
+232,172,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,
+ 88,173,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,
+200,173,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,
+ 56,174,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,
+168,174,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,
+ 24,175,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,
+136,175,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,
+248,175,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104,176,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,181,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,239,254, 2, 0, 0, 0, 0,
+232,239,254, 2, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,168,179,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 56,178,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,179,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-104, 81, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,144, 82, 89, 10, 64, 80, 89, 10, 0, 0, 0, 0, 0, 0,112, 67, 0, 64,101,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,
-148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,
-148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 82, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,184, 83, 89, 10,104, 81, 89, 10,
- 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,152, 5, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184, 83, 89, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,144, 82, 89, 10, 0, 0, 0, 0, 0,128,175, 68, 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
-135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 2, 0, 3, 3, 2, 0, 0, 4,
- 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0,
- 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 60, 0, 0, 0,224, 84, 89, 10,168, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96,241, 89, 10, 64, 80, 89, 10,184, 83, 89, 10,
- 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,168, 85, 89, 10,196, 0, 0, 0, 1, 0, 0, 0,
-248, 63, 90, 10, 24, 81, 88, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 86, 89, 10,160, 89, 89, 10,224, 89, 89, 10,
-128, 95, 89, 10,200, 95, 89, 10,184, 58, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 86, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 86, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 86, 89, 10, 96, 86, 89, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 86, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 87, 89, 10,160, 86, 89, 10, 0, 0, 0, 0,118, 7, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 87, 89, 10,224, 86, 89, 10,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 87, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 87, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 87, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 87, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 88, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 88, 89, 10,224, 87, 89, 10,
- 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 88, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 88, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0,224, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0,224, 88, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 32, 89, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 56, 5,172, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 32, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0, 96, 89, 89, 10,224, 88, 89, 10,
- 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96, 89, 89, 10,197, 0, 0, 0, 1, 0, 0, 0,
-160, 89, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160, 89, 89, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 96, 89, 89, 10, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,224, 89, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 40, 90, 89, 10, 0, 0, 0, 0,160, 86, 89, 10,224, 86, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 40, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,112, 90, 89, 10,
-224, 89, 89, 10,160, 86, 89, 10, 96, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 90, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0,184, 90, 89, 10, 40, 90, 89, 10,224, 86, 89, 10,160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,184, 90, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 91, 89, 10,112, 90, 89, 10, 96, 87, 89, 10,
-160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 0, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 72, 91, 89, 10,184, 90, 89, 10, 96, 87, 89, 10,224, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 72, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 91, 89, 10, 0, 91, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 91, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,216, 91, 89, 10, 72, 91, 89, 10,
- 32, 87, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216, 91, 89, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 32, 92, 89, 10,144, 91, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 32, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,104, 92, 89, 10,216, 91, 89, 10, 96, 86, 89, 10,224, 87, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,104, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 92, 89, 10,
- 32, 92, 89, 10, 96, 86, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 92, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0,248, 92, 89, 10,104, 92, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,248, 92, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 64, 93, 89, 10,176, 92, 89, 10, 32, 87, 89, 10,
-160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
-136, 93, 89, 10,248, 92, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-136, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 93, 89, 10, 64, 93, 89, 10,224, 88, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 93, 89, 10,198, 0, 0, 0, 1, 0, 0, 0, 24, 94, 89, 10,136, 93, 89, 10,
-160, 87, 89, 10, 32, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 24, 94, 89, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 96, 94, 89, 10,208, 93, 89, 10,160, 88, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 96, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,168, 94, 89, 10, 24, 94, 89, 10,224, 87, 89, 10, 96, 89, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168, 94, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 94, 89, 10,
- 96, 94, 89, 10,224, 88, 89, 10, 96, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 94, 89, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 56, 95, 89, 10,168, 94, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 56, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,128, 95, 89, 10,240, 94, 89, 10, 32, 89, 89, 10,
-160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128, 95, 89, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 56, 95, 89, 10, 96, 89, 89, 10,160, 89, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-200, 95, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,168, 98, 89, 10, 0, 0, 0, 0, 96, 87, 89, 10,160, 86, 89, 10,224, 86, 89, 10,
-160, 87, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,152, 63, 90, 10,152, 63, 90, 10, 88, 96, 89, 10,128, 97, 89, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 96, 89, 10,201, 0, 0, 0, 1, 0, 0, 0,
-128, 97, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7,
- 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0,
- 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+168,179,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-128, 97, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 96, 89, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,168, 98, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 36, 90, 10,200, 95, 89, 10,
- 96, 88, 89, 10, 32, 88, 89, 10,160, 88, 89, 10, 32, 87, 89, 10, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
-171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 35, 90, 10,232, 35, 90, 10,
- 56, 99, 89, 10, 96,100, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 56, 99, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 96,100, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0,
- 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 94, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,100, 89, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56, 99, 89, 10,
- 0, 0, 0, 0, 0,128,174, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0,
- 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,141, 1, 77, 1,141, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 18, 90, 10,120, 34, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 18, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 24, 20, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24, 20, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 21, 90, 10,168, 18, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 24,181,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,
+120,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
+ 8,182,254, 2, 0, 0, 0, 0,120,183,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,182,254, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,120,183,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
+ 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,183,254, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,182,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67,
+ 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0,
+ 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0,
+ 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,141, 1, 77, 1,141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,184,254, 2, 0, 0, 0, 0,200,202,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,184,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,186,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-136, 21, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 22, 90, 10, 24, 20, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
-114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,
- 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248, 22, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
-104, 24, 90, 10,136, 21, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,104, 24, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 25, 90, 10,248, 22, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,186,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
+232,184,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0,136,186,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,189,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,191,254, 2, 0, 0, 0, 0,
+ 40,188,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
+110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,191,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 25, 90, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 72, 27, 90, 10,104, 24, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 8,193,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,194,254, 2, 0, 0, 0, 0,
+104,191,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3704,206 +4581,238 @@ char datatoc_startup_blend[]= {
20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72, 27, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 28, 90, 10,
-216, 25, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,194,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,184, 28, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 30, 90, 10, 72, 27, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 72,196,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,197,254, 2, 0, 0, 0, 0,
+168,194,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 76, 1,130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40, 30, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0,152, 31, 90, 10,184, 28, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,197,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152, 31, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 33, 90, 10, 40, 30, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 8, 33, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 34, 90, 10,152, 31, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
-112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,
- 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,136,199,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
+232,197,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
+ 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,120, 34, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 8, 33, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,200,202,254, 2, 0, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,216, 0, 0, 0,232, 35, 90, 10,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,200,202,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 40,201,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 76, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240, 36, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-200, 42, 90, 10,168, 98, 89, 10, 96, 86, 89, 10,224, 87, 89, 10, 32, 88, 89, 10, 96, 88, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104, 42, 90, 10,104, 42, 90, 10,128, 37, 90, 10, 64, 41, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 37, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,151, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168, 38, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 64, 41, 90, 10,128, 37, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67,
- 0, 0,201,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,
-146, 1,203, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,
-171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 0, 0, 4, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-208, 39, 90, 10,208, 39, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-208, 39, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
- 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
- 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,
-101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,
-203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64, 41, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,168, 38, 90, 10, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67, 0, 80, 31,195, 0,234,179, 68,
- 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 60, 5,
-146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,
-171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 5,146, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 52, 0, 0, 0,
-104, 42, 90, 10,178, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 96, 0, 0, 0,200, 42, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,136,101, 89, 10,240, 36, 90, 10,224, 88, 89, 10,
- 32, 89, 89, 10,160, 87, 89, 10,160, 88, 89, 10, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
- 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 45, 90, 10,168, 45, 90, 10, 88, 43, 90, 10,
-128, 44, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 43, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128, 44, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,128, 15, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,128,181, 67, 0, 0,200, 65, 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 62, 2, 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,
-118, 7, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0,
- 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
+159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 44, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 43, 90, 10, 0, 0, 0, 0,
- 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68, 0, 0, 0, 0, 78,176, 16, 68, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60,
- 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2,127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,124, 2, 0, 0,168, 45, 90, 10,172, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,
+ 24,181,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
+120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0,
+ 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,
+136,212,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0, 24,211,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152,206,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,151, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 8,208,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,211,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,201,195, 0, 0, 0, 0,
+203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,146, 1,203, 0,146, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,209,254, 2, 0, 0, 0, 0,120,209,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+120,209,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
+105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
+105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,211,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67,
+ 0, 80, 31,195, 0,234,179, 68, 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
+ 0, 0, 0, 0, 42, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0,
+ 0, 0, 0, 4, 0, 0, 60, 5,146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 60, 5,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+200,219,254, 2, 0, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
+ 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+173, 1, 0, 0, 69, 4, 0, 0, 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,216,254, 2, 0, 0, 0, 0,232,216,254, 2, 0, 0, 0, 0, 8,214,254, 2, 0, 0, 0, 0,120,215,254, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 8,214,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,120,215,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 15, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,181, 67, 0, 0,200, 65,
+ 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 62, 2,
+ 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,136,101, 89, 10,200, 0, 0, 0, 1, 0, 0, 0,184, 58, 90, 10,200, 42, 90, 10, 96, 89, 89, 10,160, 89, 89, 10,
- 32, 89, 89, 10,224, 88, 89, 10, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,
-153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 57, 90, 10,144, 57, 90, 10, 80, 48, 90, 10,240, 52, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 80, 48, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,120, 49, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0,192,125, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68,
- 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,
-173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,247, 3, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,120, 49, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,160, 50, 90, 10, 80, 48, 90, 10, 0, 0, 0, 0, 0, 0, 15, 67,
- 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,127, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,160, 50, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200, 51, 90, 10,
-120, 49, 90, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194,
- 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200, 51, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,240, 52, 90, 10,160, 50, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,120,215,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,214,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68,
+ 0, 0, 0, 0, 78,176, 16, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2,
+127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
+199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,152, 2, 0, 0,232,216,254, 2, 0, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
+168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0,
+120,226,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,220,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,192,125, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+247, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,222,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+152,223,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0,127, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,223,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 8,225,254, 2, 0, 0, 0, 0, 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0,
+ 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
+ 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,225,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+120,226,254, 2, 0, 0, 0, 0,152,223,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 35, 67, 0,128, 23,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 5, 0, 0,
- 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 55, 5, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,226,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,225,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,240, 52, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,200, 51, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+247, 3,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,247, 3,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 54, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 24, 54, 90, 10,159, 0, 0, 0, 1, 0, 0, 0,
+232,227,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,232,227,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 49,123, 61, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3929,202 +4838,254 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144, 57, 90, 10,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184, 58, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,136,101, 89, 10,224, 87, 89, 10, 96, 87, 89, 10,160, 89, 89, 10, 96, 89, 89, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 61, 90, 10,152, 61, 90, 10, 72, 59, 90, 10,112, 60, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72, 59, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112, 60, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65, 0, 0, 83, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 64, 1, 26, 0, 64, 1,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112, 60, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 72, 59, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,151, 67, 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0, 64, 1,127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,152,231,254, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,252, 0, 0, 0,152, 61, 90, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0,
+ 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
+168,167,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,236,254, 2, 0, 0, 0, 0,248,236,254, 2, 0, 0, 0, 0, 24,234,254, 2, 0, 0, 0, 0,136,235,254, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173, 79, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 0,173, 79, 9,224, 0, 0, 0,
- 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,192, 62, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,192, 62, 90, 10,223, 0, 0, 0,
- 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
- 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
- 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
- 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 83, 78, 0, 0,140, 0, 0, 0,248, 63, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,
- 64,130, 90, 10,168, 85, 89, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 64, 90, 10, 48, 68, 90, 10,112, 68, 90, 10,
-160, 74, 90, 10,232, 74, 90, 10, 88,124, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 64, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 64, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 64, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 65, 90, 10,176, 64, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 65, 90, 10,240, 64, 90, 10, 0, 0, 0, 0,118, 7, 97, 4,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 65, 90, 10, 48, 65, 90, 10,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 65, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 65, 90, 10,112, 65, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 65, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 66, 90, 10,176, 65, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 66, 90, 10,240, 65, 90, 10, 0, 0, 0, 0,232, 5, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 66, 90, 10, 48, 66, 90, 10,
- 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 66, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 66, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 67, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,112, 67, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,244, 2, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,112, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,176, 67, 90, 10, 48, 67, 90, 10,
- 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,176, 67, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,
-240, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,240, 67, 90, 10,
-197, 0, 0, 0, 1, 0, 0, 0, 48, 68, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65,
- 20, 0, 0, 0, 48, 68, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,240, 67, 90, 10, 0, 0, 0, 0,244, 2, 70, 4,
- 1, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112, 68, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184, 68, 90, 10, 0, 0, 0, 0,
-240, 64, 90, 10, 48, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184, 68, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 0, 69, 90, 10,112, 68, 90, 10,240, 64, 90, 10,176, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 0, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72, 69, 90, 10,184, 68, 90, 10, 48, 65, 90, 10,240, 65, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,144, 69, 90, 10,
- 0, 69, 90, 10,176, 65, 90, 10,240, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,144, 69, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,216, 69, 90, 10, 72, 69, 90, 10,240, 65, 90, 10, 48, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,216, 69, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32, 70, 90, 10,144, 69, 90, 10,112, 65, 90, 10,
-112, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-104, 70, 90, 10,216, 69, 90, 10,176, 64, 90, 10,176, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-104, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,176, 70, 90, 10, 32, 70, 90, 10,176, 65, 90, 10,176, 66, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,176, 70, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,248, 70, 90, 10,104, 70, 90, 10,
- 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248, 70, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 64, 71, 90, 10,176, 70, 90, 10,112, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 64, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,136, 71, 90, 10,248, 70, 90, 10,176, 64, 90, 10, 48, 67, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,136, 71, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208, 71, 90, 10,
- 64, 71, 90, 10,112, 66, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208, 71, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 24, 72, 90, 10,136, 71, 90, 10,176, 66, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 24, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96, 72, 90, 10,208, 71, 90, 10,240, 66, 90, 10,
-112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-168, 72, 90, 10, 24, 72, 90, 10, 48, 67, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-168, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,240, 72, 90, 10, 96, 72, 90, 10,112, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,240, 72, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56, 73, 90, 10,168, 72, 90, 10,
- 48, 66, 90, 10,176, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56, 73, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,128, 73, 90, 10,240, 72, 90, 10,240, 65, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,128, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,200, 73, 90, 10, 56, 73, 90, 10,112, 65, 90, 10,240, 67, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,200, 73, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 16, 74, 90, 10,
-128, 73, 90, 10,176, 67, 90, 10,240, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 16, 74, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 88, 74, 90, 10,200, 73, 90, 10,176, 65, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 88, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,160, 74, 90, 10, 16, 74, 90, 10, 48, 66, 90, 10,
- 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160, 74, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 88, 74, 90, 10,112, 67, 90, 10, 48, 68, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-232, 74, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,200, 77, 90, 10, 0, 0, 0, 0,176, 65, 90, 10,240, 64, 90, 10, 48, 65, 90, 10,
-240, 65, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,224,129, 90, 10,224,129, 90, 10,120, 75, 90, 10,160, 76, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120, 75, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
-160, 76, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68,
+ 68, 65, 84, 65, 40, 1, 0, 0, 24,234,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,235,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,160, 67,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7,
- 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0,
- 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65,
+ 0, 0, 83, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 64, 1,
+ 26, 0, 64, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-160, 76, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120, 75, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,200, 77, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,240, 98, 90, 10,232, 74, 90, 10,
-112, 66, 90, 10,176, 67, 90, 10,240, 67, 90, 10,112, 65, 90, 10, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,
- 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 97, 90, 10,232, 97, 90, 10,
- 88, 78, 90, 10,128, 79, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 88, 78, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,128, 79, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0,
- 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-142, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128, 79, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88, 78, 90, 10,
- 0, 0, 0, 0, 0,128,198, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,
-125, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 80, 90, 10,120, 96, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,168, 80, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0, 24, 82, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
-111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 24, 82, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,136, 83, 90, 10,168, 80, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,136,235,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,234,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,151, 67,
+ 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 64, 1,
+127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
+199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 24, 1, 0, 0,248,236,254, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
-136, 83, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,248, 84, 90, 10, 24, 82, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
-114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,
-124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,248, 84, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
-104, 86, 90, 10,136, 83, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,238,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, 88,238,254, 2, 0, 0, 0, 0,
+217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,184,238,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,
+184,238,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
+ 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0,
+ 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,
+ 40,248,254, 2, 0, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152,241,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232,242,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
+120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88,243,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,
+ 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 24,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0,
+248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,
+ 40,248,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,
+152,248,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,
+ 8,249,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,
+120,249,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,
+232,249,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,
+ 88,250,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,
+200,250,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,
+ 56,251,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,
+168,251,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,
+ 24,252,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,
+136,252,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,
+248,252,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,
+104,253,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,
+216,253,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,
+ 72,254,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,
+184,254,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,
+ 40,255,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,
+152,255,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,
+ 8, 0,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,
+120, 0,255, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,
+232, 0,255, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 1,255, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8, 6,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,
+200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
+ 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 70,255, 2, 0, 0, 0, 0,
+ 40, 70,255, 2, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,152, 4,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 40, 3,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152, 4,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+152, 4,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
+112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 8, 6,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
+248, 6,255, 2, 0, 0, 0, 0,104, 8,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 6,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,104, 8,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0,
+ 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 31, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 8,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 6,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198, 67,
+ 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0,
+ 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216, 9,255, 2, 0, 0, 0, 0,184, 27,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 9,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,120, 11,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 64, 1, 0, 0,104, 86, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,216, 87, 90, 10,248, 84, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,216, 87, 90, 10,
-199, 0, 0, 0, 1, 0, 0, 0, 72, 89, 90, 10,104, 86, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 68, 65, 84, 65, 88, 1, 0, 0,120, 11,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
+216, 9,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0,120, 11,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,184, 14,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
+ 24, 13,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
+110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,248, 17,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
+ 88, 16,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4134,285 +5095,334 @@ char datatoc_startup_blend[]= {
20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 72, 89, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,184, 90, 90, 10,
-216, 87, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,124, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,124, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,184, 90, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 40, 92, 90, 10, 72, 89, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
+152, 19,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10,253,124, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253,124, 1,130, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 40, 92, 90, 10,199, 0, 0, 0,
- 1, 0, 0, 0,152, 93, 90, 10,184, 90, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
-114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252,124, 1, 0, 0, 0, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,152, 93, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 8, 95, 90, 10, 40, 92, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
- 8, 95, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,120, 96, 90, 10,152, 93, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
- 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
-112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,
-124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,120, 24,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
+216, 22,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
+ 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,124, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,120, 96, 90, 10,199, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 8, 95, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0,184, 27,255, 2, 0, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,216, 0, 0, 0,232, 97, 90, 10,165, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,184, 27,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24, 26,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,124, 1, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
+159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,240, 98, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-184,103, 90, 10,200, 77, 90, 10, 48, 67, 90, 10,112, 67, 90, 10,240, 66, 90, 10,112, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,
-231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24,102, 90, 10, 24,102, 90, 10,128, 99, 90, 10,168,100, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128, 99, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,168,100, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-242, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,
+ 8, 6,255, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
+168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0,
+ 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 35,255, 2, 0, 0, 0, 0,
+ 40, 35,255, 2, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,248, 32,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+136, 31,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248, 32,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,100, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,128, 99, 90, 10, 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68,
- 0, 0, 0, 0, 0, 0,207, 67,226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,243, 2,
-158, 1,226, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,
-183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,
-208,101, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,208,142, 85, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,208,142, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,112, 1, 0, 0, 24,102, 90, 10,181, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,101, 90, 10,208,101, 90, 10, 62, 62, 62, 32,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+248, 32,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,
+226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,243, 2,158, 1,226, 2,158, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,183, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 34,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 0, 0, 0, 0, 0, 0, 0,216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
+216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 1, 0, 0, 40, 35,255, 2,
+ 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 34,255, 2,
+ 0, 0, 0, 0,104, 34,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184,103, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,114, 90, 10,240, 98, 90, 10,
-112, 67, 90, 10, 48, 68, 90, 10, 48, 66, 90, 10,240, 66, 90, 10, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,
- 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,113, 90, 10,136,113, 90, 10,
- 72,104, 90, 10,232,108, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 72,104, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,112,105, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 36,255, 2,
+ 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,104,246,254, 2,
+ 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,232, 37,255, 2,
+ 0, 0, 0, 0,168, 43,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 37,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,112,105, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,152,106, 90, 10, 72,104, 90, 10,
- 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,
-143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,115, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,106, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,192,107, 90, 10,112,105, 90, 10, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,
-231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,
-211, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
- 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,192,107, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,232,108, 90, 10,152,106, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67,
- 0,128,142,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0,
- 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
- 18, 0, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 39,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0,232, 37,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
+ 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
+ 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0,115, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 40,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 56, 42,255, 2, 0, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194,
+ 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 42,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0,168, 43,255, 2, 0, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,
+121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,
+121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
+ 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,231, 5, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,108, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-192,107, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 43,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 42,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,110, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0, 16,110, 90, 10,
-159, 0, 0, 0, 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,148,168, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
-225,215,163,188, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,
-166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,
-248,209,213, 64, 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
- 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,132,111, 65,214,211,111, 65,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,
-123,250, 45, 63, 0, 0, 2, 54,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,
-205,209,166, 67,151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-214,211,111,193, 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62,
- 9, 46,185, 62, 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,132,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65,
- 0, 0, 0, 0, 0, 0, 0, 0,143,185, 30, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,243, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 24, 45,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 24, 45,255, 2, 0, 0, 0, 0,153, 0, 0, 0,
+ 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,148,168, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188,
+ 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
+ 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
+ 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63,
+ 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64,
+ 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
+ 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
+214,211,111, 65,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,123,250, 45, 63,
+ 0, 0, 2, 54,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67,
+151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
+ 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
+ 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
+ 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
+214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0,143,185, 30, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,136,113, 90, 10,160, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,
- 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 96, 0, 0, 0,176,114, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,120,119, 90, 10,184,103, 90, 10,176, 64, 90, 10,176, 66, 90, 10,
-112, 67, 90, 10, 48, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,
-184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,117, 90, 10,216,117, 90, 10, 64,115, 90, 10,104,116, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,115, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,104,116, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,200, 48,255, 2, 0, 0, 0, 0,154, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8,
+ 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,194, 0, 0, 0,
+ 1, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2,
+ 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,184, 52,255, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 52,255, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68,
0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,104,116, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64,115, 90, 10, 0, 0, 0, 0, 0,192, 60, 68,
- 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0, 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0,
- 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0,
- 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,244, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0,
+ 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 52,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0,
+ 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4,
+ 10, 0,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,158, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,144,117, 90, 10,180, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,112, 60, 44, 9, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
-112, 60, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,112, 1, 0, 0,216,117, 90, 10,181, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,117, 90, 10,144,117, 90, 10, 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,136, 1, 0, 0,232, 54,255, 2, 0, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,119, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 88,124, 90, 10,176,114, 90, 10,176, 67, 90, 10, 48, 66, 90, 10,240, 65, 90, 10,240, 67, 90, 10,
- 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0, 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,122, 90, 10, 88,122, 90, 10, 8,120, 90, 10, 48,121, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,120, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,121, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 26, 0,142, 1,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,160, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
+ 88, 50,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
+ 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0,
+ 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 60,255, 2, 0, 0, 0, 0,
+136, 60,255, 2, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0, 24, 59,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+168, 57,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24, 59,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67, 0, 0,200, 65,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 26, 0,142, 1, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,121, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,120, 90, 10, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0,
- 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0,142, 1,255, 0,125, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,
-118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,255, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+ 24, 59,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,
+125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,142, 1,255, 0,125, 1,237, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,252, 0, 0, 0, 88,122, 90, 10,169, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,
+136, 60,255, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 16, 55, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,184, 16, 55, 10,224, 0, 0, 0,
- 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,128,123, 90, 10, 68, 65, 84, 65,168, 0, 0, 0,128,123, 90, 10,223, 0, 0, 0,
- 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16,228, 90, 10, 19, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 20, 0, 0, 0,
- 1, 0, 1, 0, 16,228, 90, 10, 21, 0, 1, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,243, 90, 10,
- 0, 0, 0, 0, 1, 0, 1, 0,152,250, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 1, 0,
- 40, 4, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0,224,168, 91, 10, 0, 0, 0, 0, 1, 0, 1, 0, 96,255, 90, 10, 0, 0, 0, 0,
- 1, 0, 1, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,208,245, 90, 10, 0, 0, 0, 0, 1, 0, 1, 0,216,239, 90, 10,
- 21, 0, 0, 0, 1, 0, 1, 0, 16,228, 90, 10, 68, 65, 84, 65, 96, 0, 0, 0, 88,124, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,120,119, 90, 10,176, 66, 90, 10,176, 65, 90, 10, 48, 68, 90, 10,112, 67, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56,127, 90, 10, 56,127, 90, 10,232,124, 90, 10, 16,126, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,232,124, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,126, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 61,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,126, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,232,124, 90, 10, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
+ 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,232, 61,255, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
+ 14, 0, 0, 0, 14, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0,
+216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
+ 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
+232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
+184,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 67,255, 2, 0, 0, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,104, 64,255, 2, 0, 0, 0, 0,216, 65,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,104, 64,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 65,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65,
+ 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,244, 2,
+ 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,216, 65,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104, 64,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
120,125, 46, 67, 68, 65,214, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,244, 2,
-115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,211, 1, 0, 0,
- 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
+211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,124, 2, 0, 0,
- 56,127, 90, 10,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,152, 2, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,
231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0,124, 1, 0, 0,
@@ -4432,106 +5442,128 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0, 64,130, 90, 10,196, 0, 0, 0, 1, 0, 0, 0,232,191, 90, 10,
-248, 63, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,130, 90, 10,184,132, 90, 10,248,132, 90, 10,200,135, 90, 10,
- 16,136, 90, 10,176,177, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,130, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,131, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 56,131, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,120,131, 90, 10,248,130, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-120,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,131, 90, 10, 56,131, 90, 10, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0,184,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,248,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,248,131, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 56,132, 90, 10,
-184,131, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 56,132, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,120,132, 90, 10,248,131, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-120,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,184,132, 90, 10, 56,132, 90, 10, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0,184,132, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,132, 90, 10, 0, 0, 0, 0,
-196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,248,132, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 64,133, 90, 10,
- 0, 0, 0, 0, 56,131, 90, 10,120,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 64,133, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,136,133, 90, 10,248,132, 90, 10, 56,131, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,136,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,208,133, 90, 10, 64,133, 90, 10,120,131, 90, 10,
- 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,208,133, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 24,134, 90, 10,136,133, 90, 10,248,131, 90, 10, 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 24,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 96,134, 90, 10,208,133, 90, 10,248,131, 90, 10,120,132, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 96,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,168,134, 90, 10, 24,134, 90, 10,
-248,130, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,168,134, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,240,134, 90, 10, 96,134, 90, 10,248,130, 90, 10,248,131, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,240,134, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 56,135, 90, 10,168,134, 90, 10,120,132, 90, 10,184,132, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 56,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,128,135, 90, 10,
-240,134, 90, 10, 56,132, 90, 10,120,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,128,135, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,200,135, 90, 10, 56,135, 90, 10,184,131, 90, 10,184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,200,135, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,128,135, 90, 10,184,131, 90, 10,
- 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 16,136, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,
-240,138, 90, 10, 0, 0, 0, 0,248,131, 90, 10, 56,131, 90, 10,120,131, 90, 10, 56,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
-136,191, 90, 10,136,191, 90, 10,160,136, 90, 10,200,137, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,160,136, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,200,137, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,
+ 88, 75,255, 2, 0, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0,
+184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0, 88, 75,255, 2, 0, 0, 0, 0,
+ 72, 72,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0,
+184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,
+216, 71,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0,
+120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,
+ 8, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,
+ 40, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 40, 80,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,
+ 24, 81,255, 2, 0, 0, 0, 0,136, 82,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 81,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,136, 82,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,200,137, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,160,136, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69,
- 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7,
- 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0,
- 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-240,138, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,176,177, 90, 10, 16,136, 90, 10,248,130, 90, 10,248,131, 90, 10,120,132, 90, 10,
-184,132, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,144, 90, 10,104,144, 90, 10,128,139, 90, 10, 64,143, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,128,139, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
-168,140, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,113, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 41, 68, 0, 0,200, 65,
- 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,196, 3,
- 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
-168,140, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 64,143, 90, 10,128,139, 90, 10, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196,
- 0, 0, 0, 0, 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,
- 43, 4, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,
- 43, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 82,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 81,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0,
+152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0,
+104, 89,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 84,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 88, 86,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,196, 3, 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+196, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+104, 89,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196, 0, 0, 0, 0,
+ 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
+ 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
+ 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
220, 0, 44, 4, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,141, 90, 10,208,141, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208,141, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 87,255, 2, 0, 0, 0, 0,
+200, 87,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200, 87,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174,255,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,174,255,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 64,143, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,140, 90, 10, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2, 0, 0, 0, 0, 0, 0,
- 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232, 2, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
+104, 89,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 64,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 33, 0, 0,104,144, 90, 10,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62,
- 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,232, 2, 0, 0, 0, 0, 0, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,
+216, 90,255, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65,
+ 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4657,11 +5689,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4787,92 +5819,110 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,177, 90, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,240,138, 90, 10,184,132, 90, 10,120,132, 90, 10, 56,132, 90, 10,184,131, 90, 10, 0, 0, 0, 0,
-197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 96,190, 90, 10, 96,190, 90, 10, 64,178, 90, 10,192,185, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 64,178, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,179, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,177, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,178, 3, 26, 0,178, 3, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,179, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0, 0,182, 90, 10, 64,178, 90, 10, 0, 0, 0, 0, 0, 0, 32, 67, 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
-146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 0, 0, 5, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,144,180, 90, 10,144,180, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0,144,180, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+ 72,124,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
+232, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
+ 56,125,255, 2, 0, 0, 0, 0, 56,134,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,125,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 3, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,178, 3, 26, 0,178, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,178, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,126,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 56,125,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67,
+ 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
+ 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,128,255, 2, 0, 0, 0, 0, 24,128,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24,128,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
+100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
+100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,143, 0,190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,184,129,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,132,255, 2, 0, 0, 0, 0,
+168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
+ 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
+120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
+ 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0,
+ 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,131,255, 2, 0, 0, 0, 0, 40,131,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 42,254,143, 0,190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0, 40,131,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 0,182, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,152,184, 90, 10,104,179, 90, 10, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,
-231,102, 16, 67, 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
-142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,160, 0,120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
- 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0,
- 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 40,183, 90, 10, 40,183, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 40,183, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,132,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 56,134,255, 2, 0, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
+ 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0,
+ 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
+ 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,134,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,132,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,152,184, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,192,185, 90, 10, 0,182, 90, 10, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,
-162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0,
- 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0,
- 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,192,185, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,152,184, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 18, 3, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 18, 3, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,232,186, 90, 10, 68, 65, 84, 65, 72, 3, 0, 0,232,186, 90, 10,159, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62,
- 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,
-166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62,
- 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63,
- 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191,147,231,198, 63, 0, 0,128, 63,169,255, 27, 63,
-208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
-206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,
-204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,216,125, 81, 63, 0, 0,192,179,115, 77,100,193,
- 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192, 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62,
- 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,
-166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 95,192, 0, 0,128, 63,169,255, 27, 63,
-208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,
-206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,168,135,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168,135,255, 2, 0, 0, 0, 0,
+153, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+ 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
+ 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,
+166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191,
+147,231,198, 63, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
+ 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
+100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,
+216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192,
+ 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
+ 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 25, 95,192, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
+ 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
+100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63,
- 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 18,106,224, 58,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 18,106,224, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -4880,494 +5930,608 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 96,190, 90, 10,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
+154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,
-208,245, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,140, 0, 0, 0,232,191, 90, 10,196, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 64,130, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,
-105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,192, 90, 10, 96,195, 90, 10,
-160,195, 90, 10,104,200, 90, 10,176,200, 90, 10,120,221, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,192, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,192, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,192, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,193, 90, 10,160,192, 90, 10, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,193, 90, 10,224,192, 90, 10, 0, 0, 0, 0,
-118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,193, 90, 10,
- 32,193, 90, 10, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,193, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,193, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,193, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,194, 90, 10,160,193, 90, 10, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,194, 90, 10,224,193, 90, 10, 0, 0, 0, 0,
-118, 7, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0,160,194, 90, 10,
- 32,194, 90, 10, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,160,194, 90, 10,197, 0, 0, 0,
- 1, 0, 0, 0,224,194, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,
-224,194, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 32,195, 90, 10,160,194, 90, 10, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 20, 0, 0, 0, 32,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 96,195, 90, 10,224,194, 90, 10, 0, 0, 0, 0,
- 76, 3, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0, 96,195, 90, 10,197, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 32,195, 90, 10, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,160,195, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,232,195, 90, 10, 0, 0, 0, 0,224,192, 90, 10, 32,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,232,195, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 48,196, 90, 10,160,195, 90, 10,224,192, 90, 10,160,193, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 48,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,120,196, 90, 10,
-232,195, 90, 10, 32,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,120,196, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0,192,196, 90, 10, 48,196, 90, 10,160,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0,192,196, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 8,197, 90, 10,120,196, 90, 10,224,193, 90, 10,
- 32,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 8,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
- 80,197, 90, 10,192,196, 90, 10,160,192, 90, 10, 96,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 80,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,152,197, 90, 10, 8,197, 90, 10,160,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,152,197, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,224,197, 90, 10, 80,197, 90, 10,
- 96,194, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,224,197, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0, 40,198, 90, 10,152,197, 90, 10,224,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 40,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,112,198, 90, 10,224,197, 90, 10,160,194, 90, 10, 32,195, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,112,198, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,184,198, 90, 10,
- 40,198, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,184,198, 90, 10,
-198, 0, 0, 0, 1, 0, 0, 0, 0,199, 90, 10,112,198, 90, 10, 96,193, 90, 10, 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 0, 0, 0, 0,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 72,199, 90, 10,184,198, 90, 10, 96,194, 90, 10,
- 96,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 72,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,
-144,199, 90, 10, 0,199, 90, 10,160,192, 90, 10, 96,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
-144,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0,216,199, 90, 10, 72,199, 90, 10,224,193, 90, 10,160,194, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,199, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 32,200, 90, 10,144,199, 90, 10,
- 32,194, 90, 10, 32,195, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0, 32,200, 90, 10,198, 0, 0, 0,
- 1, 0, 0, 0,104,200, 90, 10,216,199, 90, 10,160,193, 90, 10,224,194, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0,104,200, 90, 10,198, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,200, 90, 10, 32,194, 90, 10,224,194, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,176,200, 90, 10,200, 0, 0, 0, 1, 0, 0, 0,144,203, 90, 10,
- 0, 0, 0, 0,160,193, 90, 10,224,192, 90, 10, 32,193, 90, 10,224,193, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,176,227, 90, 10,
-176,227, 90, 10, 64,201, 90, 10,104,202, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 64,201, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,104,202, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
+ 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0,
+ 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
+190, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
+216,147,255, 2, 0, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+232,143,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
+120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 16, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,
+191, 0, 0, 0, 1, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
+104,147,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 16, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216,147,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,216,147,255, 2, 0, 0, 0, 0,
+ 8,143,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+184,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0,
+120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 40,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+152,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 8,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+120,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+232,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 88,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0,
+136,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+200,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 56,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+168,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0,
+232,143,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 24,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0,
+152,142,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+248,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+104,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+216,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+ 72,155,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,
+ 56,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+184,155,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88,144,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0,
+168,156,255, 2, 0, 0, 0, 0, 24,158,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,156,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 24,158,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,202, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 64,201, 90, 10, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192,
- 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,129, 7, 2, 0,112, 7,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,144,203, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0, 88,207, 90, 10,176,200, 90, 10,160,192, 90, 10, 96,194, 90, 10, 96,195, 90, 10, 96,193, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,112,206, 90, 10,112,206, 90, 10, 32,204, 90, 10, 72,205, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 32,204, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 72,205, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 72,205, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32,204, 90, 10, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,158,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,156,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
+ 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
+ 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
+194, 0, 0, 0, 1, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0,
+232,161,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,160,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+232,161,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
+ 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,161,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 18, 0, 0, 0, 73, 0, 0, 0,
0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
4, 0, 0, 4, 8, 0,119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 74, 0,
+ 0, 0, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,188, 0, 0, 0,112,206, 90, 10,176, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 88,207, 90, 10,200, 0, 0, 0,
- 1, 0, 0, 0, 0,215, 90, 10,144,203, 90, 10, 96,194, 90, 10,224,194, 90, 10, 32,194, 90, 10, 96,195, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,248,213, 90, 10,248,213, 90, 10,232,207, 90, 10,208,212, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,232,207, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 16,209, 90, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 28, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 16,209, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,168,211, 90, 10,232,207, 90, 10, 0, 0, 0, 0, 0, 0, 92, 67, 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,
-202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4,
- 6, 0,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,
-127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 0, 0, 4, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 56,210, 90, 10, 56,210, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 56,210, 90, 10,199, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
+120,164,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
+168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,
+104,165,255, 2, 0, 0, 0, 0, 88,171,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,165,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,216,166,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,166,255, 2, 0, 0, 0, 0,
+195, 0, 0, 0, 1, 0, 0, 0,232,169,255, 2, 0, 0, 0, 0,104,165,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67,
+ 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0,
+ 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
+ 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72,168,255, 2, 0, 0, 0, 0, 72,168,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,168,255, 2, 0, 0, 0, 0,
+193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,168,211, 90, 10,201, 0, 0, 0,
- 1, 0, 0, 0,208,212, 90, 10, 16,209, 90, 10, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196,
- 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,232,169,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,171,255, 2, 0, 0, 0, 0,
+216,166,255, 2, 0, 0, 0, 0, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68,
+ 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,
15, 2, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 0,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0,208,212, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,168,211, 90, 10, 0, 0, 0, 0, 0, 0,122, 67,
- 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0,
- 18, 0, 0, 0,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
- 18, 0, 0, 0,144, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,
-105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,155, 6,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,155, 6,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,248,213, 90, 10,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,171,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,169,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
+ 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,155, 6,
+145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,
+127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6,145, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 0,215, 90, 10,
-200, 0, 0, 0, 1, 0, 0, 0,120,221, 90, 10, 88,207, 90, 10,224,194, 90, 10,160,193, 90, 10,160,194, 90, 10, 32,195, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 48,220, 90, 10, 48,220, 90, 10,144,215, 90, 10, 8,219, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,144,215, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,184,216, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68,
- 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 76, 3, 26, 0, 76, 3,
- 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,184,216, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,224,217, 90, 10,144,215, 90, 10, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0,217, 0, 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-216, 0, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 2,
- 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,224,217, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 8,219, 90, 10,184,216, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+104,182,255, 2, 0, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
+ 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
+ 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+184,180,255, 2, 0, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,248,174,255, 2, 0, 0, 0, 0, 72,179,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 75, 3, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,248,174,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,104,176,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65,
+ 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 76, 3,
+ 26, 0, 76, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
+ 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,104,176,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216,177,255, 2, 0, 0, 0, 0,
+248,174,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67,
+ 0, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,
+ 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 2, 0, 0, 2, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,216,177,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,179,255, 2, 0, 0, 0, 0,
+104,176,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 75, 3, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 8,219, 90, 10,201, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,224,217, 90, 10, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 72,179,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+216,177,255, 2, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67,
0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 18, 0, 0, 0,114, 2, 0, 0,
0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,114, 2, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,111, 18,131, 58,111, 18,131, 58,
0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,115, 2,
- 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0, 43, 2, 0, 0,
- 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,208, 0, 0, 0,
- 48,220, 90, 10,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48,221, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 24, 0, 0, 0, 48,221, 90, 10, 23, 1, 0, 0, 1, 0, 0, 0, 16,228, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,120,221, 90, 10,200, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0,215, 90, 10, 32,195, 90, 10,160,194, 90, 10,224,193, 90, 10, 32,194, 90, 10, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
- 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,226, 90, 10,
-168,226, 90, 10, 8,222, 90, 10,128,225, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
-248, 0, 0, 0, 8,222, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 48,223, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65, 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 42, 4, 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0, 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 42, 4, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 48,223, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 88,224, 90, 10,
- 8,222, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+248,181,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,181,255, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,
+232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
+200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 24,189,255, 2, 0, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0, 88,183,255, 2, 0, 0, 0, 0,168,187,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 88,183,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,184,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 68,
+ 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65,
+ 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 42, 4,
+ 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 26, 0, 0, 0, 1, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88,224, 90, 10,
-201, 0, 0, 0, 1, 0, 0, 0,128,225, 90, 10, 48,223, 90, 10, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67,
- 96,187,216,196, 96,187,216, 68,244, 43, 91,196,244, 43, 91, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0,
- 0, 0, 0, 4, 0, 0, 42, 4, 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,
-118, 7, 0, 0, 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2,
- 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,200,184,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,186,255, 2, 0, 0, 0, 0,
+ 88,183,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0,128,225, 90, 10,201, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 88,224, 90, 10, 0, 0, 0, 0,
- 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0,
- 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,
-201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64, 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60,
- 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,168,226, 90, 10,166, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
+ 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0, 56,186,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,187,255, 2, 0, 0, 0, 0,
+200,184,255, 2, 0, 0, 0, 0, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67, 96,187,216,196, 96,187,216, 68,
+244, 43, 91,196,244, 43, 91, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0, 42, 4,
+ 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
+ 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 1, 0, 0,168,187,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,186,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
+ 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
+ 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2,
+ 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0,120, 5, 0, 0,
- 16,228, 90, 10,157, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 83, 99,
-101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,184,233, 90, 10,
- 0, 0, 0, 0,208,245, 90, 10,224,243, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,152,235, 90, 10, 40,236, 90, 10,152,235, 90, 10,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,236, 90, 10,240, 64, 80, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0, 8, 6, 0, 0,232,190,255, 2, 0, 0, 0, 0,151, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 56,197,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,201,255, 2, 0, 0, 0, 0,
+ 56, 40,160, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 1, 0,
0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,239, 90, 10, 96,239, 90, 10, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 98, 97, 99,107, 98,117,
-102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 5, 0, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,
+173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+208,205,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+120,233,222, 2, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0,
+ 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 56,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,173, 2, 95, 0,154,153,217, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78,
- 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0,
- 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,176,203, 64, 10, 0, 0, 0, 0, 0, 0, 0, 0,144, 10, 85, 10, 1, 0, 0, 0, 1, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65,
- 0, 0, 0, 0, 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,
-180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0,184,233, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,234, 90, 10, 32,235, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0, 48,234, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 32,235, 90, 10, 0, 0, 0, 0,
- 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,234, 90, 10,168,234, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0,168,234, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+232,197,255, 2, 0, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 96, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,198,255, 2, 0, 0, 0, 0,
+152,198,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
+152,198,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0,115,101,114,118,101,114, 95, 97,100,100,114,101,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 39, 59, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0,152, 39, 59, 10, 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116,
- 93, 0, 0, 0, 68, 65, 84, 65, 76, 0, 0, 0, 32,235, 90, 10, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 48,234, 90, 10,
- 6, 0, 0, 0,112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 28, 0, 0, 0,152,235, 90, 10,133, 0, 0, 0, 1, 0, 0, 0,224,235, 90, 10, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,186, 1,168, 1,152,250, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0,224,235, 90, 10,
-133, 0, 0, 0, 1, 0, 0, 0, 40,236, 90, 10,152,235, 90, 10, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 59, 2,109, 2,
- 96,255, 90, 10, 68, 65, 84, 65, 28, 0, 0, 0, 40,236, 90, 10,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,224,235, 90, 10,
- 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 97, 0,228, 1,208,245, 90, 10, 68, 65, 84, 65,152, 1, 0, 0,112,236, 90, 10,
-153, 0, 0, 0, 1, 0, 0, 0, 56,238, 90, 10,136,238, 90, 10,216,238, 90, 10, 0, 0,128, 63, 1, 0, 1, 0,205,204, 76, 63,
- 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,120,208, 92, 10,
- 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0,128, 62,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,199,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 72,199,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,168,199,255, 2,
+ 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 6, 0, 0, 0,
+112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+198, 2,182, 1, 72,220,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,
+149, 3,243, 2,232,226,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
+157, 0, 23, 2, 72,214,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,192, 1, 0, 0,168,201,255, 2, 0, 0, 0, 0,147, 0, 0, 0,
+ 1, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0, 56,204,255, 2, 0, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0, 0, 0,128, 63,
+ 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0,
+ 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63,
0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63, 0, 0, 0, 63,
- 68, 65, 84, 65, 36, 0, 0, 0, 56,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,152, 75, 85, 10,255,255,255,128,
- 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 36, 0, 0, 0,
-136,238, 90, 10,152, 0, 0, 0, 1, 0, 0, 0, 96,122, 92, 10,248,175, 88, 9,200,200,255,128, 1, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0,216,238, 90, 10,151, 0, 0, 0,
- 1, 0, 0, 0, 72,181, 92, 10,216,191, 75, 10,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63,
+ 0, 0, 0, 63, 68, 65, 84, 65, 56, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0, 56,204,255, 2,
+ 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0,145, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0,124, 7,231, 65,255, 74, 20, 65, 54, 86,123, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 72, 0, 0, 0, 96,239, 90, 10,139, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,
-121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,104, 0, 0, 0,
-216,239, 90, 10, 29, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,
-109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61, 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,108, 1, 0, 0,112,240, 90, 10,
- 41, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 76, 97,109,112, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 8,242, 90, 10, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63,
- 0, 0, 64, 64,205,204, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,136, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 63,205,204,204, 61,
+ 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,216, 1, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 33, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 65, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 72,209,255, 2,
+ 0, 0, 0, 0, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,243, 90, 10, 68, 65, 84, 65, 16, 1, 0, 0, 8,242, 90, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,243, 4, 53, 63, 72,243, 90, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0, 72,209,255, 2, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,
+243, 4, 53, 63,216,210,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,
- 72,243, 90, 10, 80, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,144,243, 90, 10, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 0, 0,112, 1, 0, 0,
-224,243, 90, 10,132, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,210,255, 2,
+ 0, 0, 0, 0, 73, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 87, 79, 0, 0,224, 1, 0, 0,168,211,255, 2, 0, 0, 0, 0,126, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,
114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,199, 54, 36, 60,199, 54, 36, 60,
-199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65,
- 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59, 0, 0, 0, 0, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,245, 90, 10, 68, 65, 84, 65,
- 32, 0, 0, 0,128,245, 90, 10, 19, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,208,245, 90, 10,121, 0, 0, 0,
- 1, 0, 0, 0,152,250, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,
-114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,
+199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,
+128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59,
+ 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,239, 90, 10,
- 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192,
- 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,
-227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,
-150, 62,208,192, 78,255,170, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,125,103,133, 51,176,219,194,178, 0, 0, 0, 0,190, 32, 66, 51,
- 1, 0,128, 63,168,200,153, 51, 0, 0, 0, 0, 32,206, 18,179,126,126,149, 50, 1, 0,128, 63, 0, 0, 0, 0,241,251,133, 52,
-172,182, 27,180,174,236,252, 51, 0, 0,128, 63, 0, 0,128, 63,157,190,215, 49,167,170, 4, 52, 0, 0, 0,128,129,116,157,178,
- 1, 0,128, 63, 33, 69, 15, 51, 0, 0, 0,128, 73,254, 67, 51,243, 97,106, 49, 0, 0,128, 63, 0, 0, 0,128, 3, 0, 64, 52,
-183,164,157, 39, 0, 0,128, 53, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201,
- 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,249, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,144, 0, 0, 0,216,249, 90, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
+ 40, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+208, 4, 0, 0, 72,214,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,
+114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0,152,250, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 96,255, 90, 10,208,245, 90, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-112, 83, 78, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 74, 92, 10, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,
- 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,
- 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 32, 60, 9,
-192, 93, 44, 9, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0,
+ 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
-222,149, 47, 63, 52, 70, 58, 63,179, 56, 49,188, 0, 0, 0,128, 86,126,162,190,227,251,159, 62, 56, 53,101, 63, 0, 0, 0,128,
- 7,165, 39, 63,149, 84, 28,191, 50,247,227, 62, 0, 0, 0,128,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,
-205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,
+ 1, 0,128, 63, 1, 0,128, 51, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0,
+ 2, 0, 0,179, 2, 0, 0,167, 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63,
+221,149, 47, 63, 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
+192, 56, 49,188, 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63,
+ 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,
+205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0,
1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,160,254, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0,232,178, 61, 10, 40, 53, 85, 10, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0, 24, 32, 60, 9,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,192, 93, 44, 9, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,160,254, 90, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,220, 3, 0, 0, 96,255, 90, 10,121, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-152,250, 90, 10, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,219,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,104,219,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0, 72,220,255, 2,
+ 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,240, 90, 10, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 97,223, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,
250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62,
+ 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191, 57,174, 76,190, 34,194, 26, 63,
- 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,112,236,188, 64,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,124, 99, 4, 0, 0, 0, 0, 24,132, 99, 4,
+ 0, 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 4, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,
+ 8,226,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0,232,226,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,
+112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 35,233,134, 49,251,110, 17,179, 0, 0, 0, 0, 49,158,141, 50, 1, 0,128, 63,126,214,237, 50,
- 0, 0, 0, 0,155,248, 28,178,199,139, 96,177,254,255,127, 63, 0, 0, 0, 0, 80,136,159,178,192, 4,158,178,209,114,143,179,
- 0, 0,128, 63, 53,236,148,190,222,102, 69,191, 37,255, 16, 63, 0, 0, 0,128, 24,134,116, 63, 57,174, 76,190,240,161, 95, 62,
- 0, 0, 0,128,235, 13, 98,189, 34,194, 26, 63,166,111, 75, 63, 0, 0, 0,128,208, 19, 13, 63,234, 65,102,190, 10, 10,231,192,
- 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0, 79, 66, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60,
- 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 3, 91, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0,
-104, 3, 91, 10,124, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 77, 65, 0, 0,
-160, 2, 0, 0, 40, 4, 91, 10, 43, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191,
+ 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,
+183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, 0, 0, 0,179, 0, 0, 0, 0, 1, 0,128, 50,
+ 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 39,
+ 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 54,236,148,190,221,102, 69,191, 38,255, 16, 63, 0, 0, 0, 0, 24,134,116, 63,
+ 57,174, 76,190,239,161, 95, 62, 0, 0, 0, 0,237, 13, 98,189, 35,194, 26, 63,166,111, 75, 63, 0, 0, 0, 0,209, 19, 13, 63,
+241, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0,
+ 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201,
+ 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,232,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0, 8,232,255, 2, 0, 0, 0, 0,
+117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 77, 65, 0, 0, 32, 3, 0, 0,232,232,255, 2, 0, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105,
+ 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -5380,24 +6544,28 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,248, 6, 91, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 88,236,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 8, 91, 10, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,
205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,248, 6, 91, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,168, 91, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 88,236,255, 2, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 32, 0, 0, 0, 48, 8, 91, 10, 19, 0, 0, 0, 1, 0, 0, 0,
- 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 1, 0, 1, 0, 49, 0, 49, 0,128, 8, 91, 10,176, 24, 91, 10,
- 68, 65, 84, 65, 0, 16, 0, 0,128, 8, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
+ 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 51, 0, 51, 0, 40,238,255, 2, 0, 0, 0, 0,120,254,255, 2, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 16, 0, 0, 40,238,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5525,8 +6693,61 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0,176, 24, 91, 10,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0,
+120,254,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6625,6 +7846,64 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0,112, 1, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
+ 31, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0,
+ 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,144, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
+136,144, 0, 3, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 1, 0, 16, 0, 15, 0,248,144, 0, 3, 0, 0, 0, 0, 72,161, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,
+248,144, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6678,1313 +7957,41 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0, 48, 1, 0, 0,224,168, 91, 10, 39, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 84,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0,160, 64, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0, 3, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,170, 91, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 64,170, 91, 10, 19, 0, 0, 0, 1, 0, 0, 0,
- 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 14, 0, 13, 0,144,170, 91, 10,192,186, 91, 10,
- 68, 65, 84, 65, 0, 16, 0, 0,144,170, 91, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 68, 65, 84, 65, 0,144, 0, 0,192,186, 91, 10,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 77, 69, 0, 0, 40, 1, 0, 0,240, 74, 92, 10, 54, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0, 72,161, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,128,233, 80, 9,120, 82, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,200, 77, 92, 10, 56, 80, 92, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 76, 92, 10, 1, 0, 0, 0,
- 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 78, 92, 10, 1, 0, 0, 0, 5, 0, 0, 0,
- 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 80, 92, 10, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,128,233, 80, 9, 0, 0, 0, 0, 1, 0, 0, 0, 40, 4, 91, 10, 68, 65, 84, 65,
- 84, 1, 0, 0, 72, 76, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 77, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7993,16 +8000,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,200, 77, 92, 10, 60, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63,
- 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182,
- 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,
-250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63,
- 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,
-230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,
-255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65, 84, 1, 0, 0,
-184, 78, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 80, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8011,38 +8009,1220 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,144, 0, 0, 0, 56, 80, 92, 10, 57, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0,
- 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 35, 0, 68, 65, 84, 65, 84, 1, 0, 0,248, 80, 92, 10, 87, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 82, 92, 10, 6, 0, 0, 0,
- 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10,
- 6, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88, 84, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,120, 82, 92, 10, 56, 0, 0, 0, 6, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0,
- 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0,
- 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2, 66, 82, 0, 0,188, 2, 0, 0,
-232, 84, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,168, 90, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,
-100, 0,104, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 12, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8, 89, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0,176, 1, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 46, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
+232, 58, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
+ 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
+ 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+168, 54, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 0, 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
+ 80, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
+ 52, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191,
+ 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73,
+ 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0,
+245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191,
+ 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,
+230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,168, 54, 1, 3, 0, 0, 0, 0, 80, 1, 0, 0, 5, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, 88, 56, 1, 3, 0, 0, 0, 0, 49, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
+ 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,104, 1, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0,
+ 80, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0, 6, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0, 6, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0,
+ 48, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0,
+ 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0,
+ 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2,
+ 66, 82, 0, 0,240, 2, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72, 64, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8054,38 +9234,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 52, 85, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 60, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 8, 89, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61, 72, 90, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72, 64, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216, 65, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 72, 90, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,168, 90, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
- 48, 95, 92, 10,232, 84, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,144, 93, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216, 65, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,152, 69, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8093,42 +9276,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65,
- 8, 1, 0, 0,244, 90, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+192, 66, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-144, 93, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,208, 94, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0,152, 69, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 40, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0,208, 94, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 40, 71, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0, 48, 95, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,184, 99, 92, 10,168, 90, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2,
- 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 24, 98, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 88, 66, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46,
+ 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,232, 74, 1, 3, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8136,41 +9323,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,124, 95, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 72, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 24, 98, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
- 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 88, 99, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232, 74, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120, 76, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88, 99, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63,
- 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,184, 99, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0, 64,104, 92, 10, 48, 95, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 30, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,160,102, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120, 76, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 56, 80, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8178,11 +9370,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0,
- 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0, 4,100, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 96, 77, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8191,21 +9383,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0,160,102, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186,224,103, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 56, 80, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,200, 81, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,224,103, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 64,104, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,200,108, 92, 10,
-184, 99, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0, 40,107, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+200, 81, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+248, 76, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48,
+ 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136, 85, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8221,42 +9416,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
-140,104, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176, 82, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 40,107, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136, 85, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,104,108, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24, 87, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-104,108, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0,200,108, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 80,113, 92, 10, 64,104, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,176,111, 92, 10, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24, 87, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,216, 90, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8264,84 +9462,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 20,109, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 0, 88, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176,111, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191,
- 54,189,194, 61, 14,215,126,191, 46,189,194, 61,240,112, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,216, 90, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,104, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,240,112, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 80,113, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0,216,117, 92, 10,200,108, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 17, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 56,116, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+104, 92, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+152, 87, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101,
+ 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 40, 96, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 6, 4, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63,
- 68, 65, 84, 65, 8, 1, 0, 0,156,113, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 80, 93, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0, 56,116, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,
-120,117, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40, 96, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,184, 97, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,120,117, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,216,117, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 96,122, 92, 10, 80,113, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184, 97, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 18, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
-192,120, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,120,101, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8349,41 +9555,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 36,118, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+160, 98, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,192,120, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 0,122, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,120,101, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61, 8,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 0,122, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0,
- 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
- 96,122, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,232,126, 92, 10,216,117, 92, 10, 5, 0,109, 0, 0, 0, 0, 0, 66, 82, 68,114,
- 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 30, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72,125, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 8,103, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 56, 98, 1, 3, 0, 0, 0, 0, 5, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68,114, 97,119, 0, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,106, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8395,38 +9606,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 0, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,172,122, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,240,103, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 72,125, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,136,126, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,106, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,108, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,136,126, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,232,126, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-112,131, 92, 10, 96,122, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48,
- 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 19, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,208,129, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,108, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 24,112, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8434,42 +9648,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 8, 1, 0, 0, 52,127, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 64,109, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-208,129, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 16,131, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0, 24,112, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,168,113, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0, 16,131, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+168,113, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,112,131, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,248,135, 92, 10,232,126, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3,
- 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 88,134, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+216,108, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,
+110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,117, 1, 3, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8477,41 +9695,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,188,131, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,144,114, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 88,134, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
-224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,135, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,117, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,248,118, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,135, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
-143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,248,135, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0,128,140, 92, 10,112,131, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48,
- 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 21, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,224,138, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,118, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,184,122, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8519,11 +9741,12 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 68,136, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+224,119, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8532,21 +9755,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0,224,138, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186, 32,140, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,184,122, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 72,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 32,140, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,128,140, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 8,145, 92, 10,
-248,135, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,101, 0, 48, 48,
- 49, 0, 0, 0, 1, 0, 0, 3, 22, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,104,143, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 72,124, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+120,119, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,
+101, 47, 68,101,102,108, 97,116,101, 0, 48, 48, 49, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,128, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8562,42 +9788,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,
-204,140, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
+ 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 48,125, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,104,143, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,128, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,168,144, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,129, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-168,144, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0, 8,145, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,144,149, 92, 10,128,140, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 23, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,240,147, 92, 10, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,129, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 88,133, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8605,84 +9834,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 84,145, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+128,130, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,240,147, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186, 48,149, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 88,133, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,232,134, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 48,149, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,144,149, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0, 24,154, 92, 10, 8,145, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,120,152, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+232,134, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 24,130, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,
+110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,138, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 8, 1, 0, 0,220,149, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,208,135, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0,120,152, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,
-184,153, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,138, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,140, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,184,153, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 24,154, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,160,158, 92, 10,144,149, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,140, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 25, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
- 0,157, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,248,143, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8690,41 +9927,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,100,154, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 32,141, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 0,157, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 64,158, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,248,143, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,136,145, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 64,158, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0,
- 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
-160,158, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 40,163, 92, 10, 24,154, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,
-108,116,105,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 26, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136,161, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+136,145, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+184,140, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112,
+108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72,149, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8736,38 +9978,41 @@ char datatoc_startup_blend[]= {
35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,236,158, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,112,146, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,136,161, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61,200,162, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72,149, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216,150, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,200,162, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 40,163, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-176,167, 92, 10,160,158, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 27, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 16,166, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,150, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,152,154, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8775,42 +10020,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 8, 1, 0, 0,116,163, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+192,151, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 16,166, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 80,167, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0,152,154, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 40,156, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0, 80,167, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 40,156, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,176,167, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 56,172, 92, 10, 40,163, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47, 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3,
- 28, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,152,170, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 88,151, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47,
+ 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,232,159, 1, 3, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8818,41 +10067,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 6, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63,
- 0, 0, 64, 63, 0, 0,128, 62, 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 8, 1, 0, 0,252,167, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
+ 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 16,157, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,152,170, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
-224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,216,171, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,159, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,161, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,171, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,
-143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 56,172, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0,192,176, 92, 10,176,167, 92, 10, 65,119, 13, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104,
- 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 32,175, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120,161, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 65,119, 13, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 56,165, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8860,11 +10114,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0,
- 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,132,172, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 96,162, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -8873,21 +10127,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0, 32,175, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186, 96,176, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 56,165, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,200,166, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 96,176, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,192,176, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 72,181, 92, 10,
- 56,172, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 29, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,168,179, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+200,166, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+248,161, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101,
+ 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136,170, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -8903,42 +10160,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,
- 12,177, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176,167, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,168,179, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136,170, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,232,180, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24,172, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-232,180, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0, 72,181, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,208,185, 92, 10,192,176, 92, 10, 52,195, 13, 0, 0, 0, 0, 0,
- 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 30, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 48,184, 92, 10, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24,172, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 52,195, 13, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,216,175, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -8946,84 +10206,92 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,148,181, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63,
+ 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+ 0,173, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 48,184, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186,112,185, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,216,175, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,104,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,112,185, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,208,185, 92, 10, 86, 1, 0, 0,
- 1, 0, 0, 0, 88,190, 92, 10, 72,181, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,184,188, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+104,177, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+152,172, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 40,181, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 8, 1, 0, 0, 28,186, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 80,178, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65,
- 16, 1, 0, 0,184,188, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,
-248,189, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40,181, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,184,182, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 48, 0, 0, 0,248,189, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 88,190, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,224,194, 92, 10,208,185, 92, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184,182, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 32, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,
- 64,193, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,120,186, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9031,41 +10299,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 75, 0, 0, 0,
-102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63,
- 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,164,190, 92, 10,
- 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+160,183, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 64,193, 92, 10, 82, 1, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0,
- 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,128,194, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,120,186, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 8,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,128,194, 92, 10,
- 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0,
- 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,
-224,194, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,104,199, 92, 10, 88,190, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110,
- 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 33, 3, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,197, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 8,188, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 56,183, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110, 97,107,101, 32,
+ 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,191, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9077,38 +10350,41 @@ char datatoc_startup_blend[]= {
75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 44,195, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,240,188, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,200,197, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 8,199, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,191, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,193, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 8,199, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,104,199, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,
-240,203, 92, 10,224,194, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 80,202, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,193, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 24,197, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9116,42 +10392,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0,
- 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,
- 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 8, 1, 0, 0,180,199, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
-128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+ 64,194, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 80,202, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0,
- 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,144,203, 92, 10,
+ 68, 65, 84, 65, 64, 1, 0, 0, 24,197, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
+ 14,215,126,191, 46,189,194, 61,168,198, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 48, 0, 0, 0,144,203, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+168,198, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,188, 2, 0, 0,240,203, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,120,208, 92, 10,104,199, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2,
- 35, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,216,206, 92, 10,
+ 66, 82, 0, 0,240, 2, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+216,193, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97,
+ 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,202, 1, 3, 0, 0, 0, 0,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9159,41 +10439,46 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,
-205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 60,204, 92, 10, 32, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
+ 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,144,199, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,216,206, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,
- 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 24,208, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,202, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
+ 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,248,203, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24,208, 92, 10, 80, 1, 0, 0,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63,
- 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0,120,208, 92, 10,
- 86, 1, 0, 0, 1, 0, 0, 0, 0,213, 92, 10,240,203, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,
-119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 96,211, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,203, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0,184,207, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9201,11 +10486,11 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0,
- 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62,
- 0, 0,128, 63, 68, 65, 84, 65, 8, 1, 0, 0,196,208, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
+224,204, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
@@ -9214,21 +10499,24 @@ char datatoc_startup_blend[]= {
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 16, 1, 0, 0, 96,211, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,
-114, 97,255,186,160,212, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0,184,207, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186, 72,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,160,212, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,188, 2, 0, 0, 0,213, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0,136,217, 92, 10,
-120,208, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 3, 37, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 0,232,215, 92, 10, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+ 72,209, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 0, 0,240, 2, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,213, 1, 3, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
@@ -9244,42 +10532,45 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,
- 76,213, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
+ 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 48,210, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,232,215, 92, 10,
- 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,213, 1, 3, 0, 0, 0, 0,
+ 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 40,217, 92, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,214, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 40,217, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63,
- 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,
-188, 2, 0, 0,136,217, 92, 10, 86, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,213, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 38, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,112,220, 92, 10, 1, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,214, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
+ 79, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 0, 88,218, 1, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9287,47 +10578,50 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0,212,217, 92, 10, 32, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0,
+ 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
+ 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
+128,215, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,112,220, 92, 10, 82, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191,
- 46, 95,255,186,224,255,127,191,114, 97,255,186,176,221, 92, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 88,218, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
+224,255,127,191,114, 97,255,186,232,219, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,176,221, 92, 10, 80, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 85, 83, 69, 82,240, 12, 0, 0, 32, 31,246, 8,195, 0, 0, 0,
- 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0, 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
+232,219, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
+215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 85, 83, 69, 82,112, 13, 0, 0, 32,163,141, 1, 0, 0, 0, 0,189, 0, 0, 0, 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0,
+ 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,
-107,116,111,112, 47, 0, 45,112,111,119,101,114,112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,
-111,110,116,101,110,116,115, 47, 82,101,115,111,117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0, 45,112,111,119,101,114,
+112, 99, 47, 98,105,110, 47, 98,108,101,110,100,101,114, 46, 97,112,112, 47, 67,111,110,116,101,110,116,115, 47, 82,101,115,111,
+117,114, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9346,8 +10640,8 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9366,56 +10660,61 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0,
- 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0, 2, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0,
- 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0, 0, 0, 64, 0, 5, 0, 2, 0, 48,235, 92, 10, 48,235, 92, 10,104, 69, 85, 10,
-104, 69, 85, 10,168, 70, 85, 10,168, 70, 85, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
- 1, 0, 2, 0, 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,
-205,204, 76, 62,205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0,
- 3, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0,
- 0, 0, 0, 0, 2, 0, 1, 0, 10, 0, 50, 0,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
- 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 29, 0, 0, 48,235, 92, 10,
-192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0,
+ 6, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 64, 0, 5, 0, 2, 0, 40,234, 1, 3, 0, 0, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,184, 74, 14, 3, 0, 0, 0, 0,
+184, 74, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,232, 62, 1, 3, 0, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0,
+ 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,
+205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 5, 0,
+128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
+ 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 30, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,186, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255,
@@ -9441,18 +10740,19 @@ char datatoc_startup_blend[]= {
130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
-204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
255,255,255,255, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9463,18 +10763,19 @@ char datatoc_startup_blend[]= {
102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,130,130,130,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
+ 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
@@ -9486,18 +10787,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100,
- 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9508,18 +10810,19 @@ char datatoc_startup_blend[]= {
102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,
+124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
+ 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
@@ -9531,18 +10834,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,
-169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9553,18 +10857,19 @@ char datatoc_startup_blend[]= {
165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,195,195,195,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,
+255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9576,18 +10881,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100,
- 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9598,18 +10904,19 @@ char datatoc_startup_blend[]= {
165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,155,155,155,160,100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
+144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,155,155,155,160,
+100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
+ 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
+255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
+ 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9621,18 +10928,19 @@ char datatoc_startup_blend[]= {
165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
+255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
+200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
+240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
+240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
+255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
+ 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
+ 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
+255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255,
@@ -9648,9 +10956,35 @@ char datatoc_startup_blend[]= {
131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,192,226, 0, 0,
- 80,179, 85, 10, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,204, 11, 0, 0, 42,110,101,120,116, 0, 42,112,
-114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 0,120,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,
+232, 62, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+105,111, 95,115, 99,101,110,101, 95, 51,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 80, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,
+232, 62, 1, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,102, 98,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
+104, 9, 2, 3, 0, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95, 98,118,104, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
+187, 0, 0, 0, 1, 0, 0, 0, 8, 10, 2, 3, 0, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95,
+ 99, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,
+ 8, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
+105,111, 95,109,101,115,104, 95,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 80, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,
+ 8, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
+232, 52,219, 4, 0, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,120, 51,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0,
+187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,105,111, 95,109,101,115,104, 95,
+115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,120,227, 0, 0,
+168,160,120, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,228, 11, 0, 0, 42,110,101,120,
+116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,120,
109,105,110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,
112, 0,118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,
101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,
@@ -9675,1794 +11009,1799 @@ char datatoc_startup_blend[]= {
95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101,101,107, 0,112,
97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,
110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,
-104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0,102,114, 97,109,101,110,114,
- 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,109, 97, 0, 99,121, 99,108,
- 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,115, 0,109,101,110,117,110,
-114, 0, 42,115, 99,101,110,101, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109,
- 0, 42,114,114, 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,
-116, 95,114,101,110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,
-112, 97,103,101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97,
- 0,116,119,101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,
-102,105,108,101, 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,
-100, 0, 97,110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101,
- 0, 97,115,112,120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0,
- 98,108,101,110,100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50,
- 93, 0,112,114,111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91,
- 51, 93, 0,115,105,122,101, 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,
-108, 0,112,109, 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,
-104,105, 99,104, 95,111,117,116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55,
- 93, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,
-110,111,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97,
- 99, 0,109,105,114,114,102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102,
- 97, 99, 0,101,109,105,116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114,
- 97,110,115,108,102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,
-108,102, 97, 99, 0, 99,111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,
-102, 97, 99, 0,114,101,102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,
-117,109,112,102, 97, 99, 0,107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97,
- 99, 0,108,105,102,101,102, 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97,
- 99, 0,115,104, 97,100,111,119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0,
- 98,108,101,110,100,102, 97, 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,
-101, 0, 42,115,116,110, 97,109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,
-114,101,115,117,108,116, 0, 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0,
- 40, 42,105,110,115,116, 97,110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41,
- 0,118,101,114,115,105,111,110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93,
- 0,105,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,
-105,101,119,115, 99, 97,108,101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101,
- 99, 97,108, 99, 0,108, 97,115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,
-102,102, 95,115,111,102,116,110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,
-116,111,116,112,111,105,110,116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,
-115,112, 97, 99,101, 0,111, 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101,
- 0, 42,112,111,105,110,116, 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,
-112,116,104, 0,110,111,105,115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,
-112,100,112, 97,100, 51, 91, 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0,
- 42, 99,111, 98, 97, 0,114,101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,
-102,111,114,109, 97,116, 0,101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,
-108,116,105,112,108,105,101,114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104,
- 91, 50, 52, 48, 93, 0, 42,100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,
-115,105,122,101, 0,116,117,114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,
-114, 97,116,105,111,110, 0,114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101,
- 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,
-103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,
-111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52,
- 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,
-115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,
-115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,
-105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,
-102,109, 97,120, 0,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116,
- 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,
-101,110,118, 0, 42,112,100, 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116,
- 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101,
- 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100,
- 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,
-104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,
-115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,
-104, 0,112, 97,100, 53, 91, 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,
-105,108,116,101,114,116,121,112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,
-109,112, 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,
-116,121,112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,
-105,122,101,121, 0, 97,114,101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121,
- 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112,
- 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,
-114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,
-104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,
-103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0,
- 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,
-110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,
-114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,
-111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,
-101,120,116,117,114,101, 0,112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,
-115, 99, 97,116,116,101,114,105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,
-111,108, 91, 51, 93, 0,116,114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,
-116,105,111,110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95,
- 99,117,116,111,102,102, 0, 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,
-104, 97,100,101,102,108, 97,103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,
-111,108,117,116,105,111,110, 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,
-110,115,105,116,121, 0,109,115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,
-101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,
-109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,
-114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,
-102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,
-109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,
-101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102,
- 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104,
- 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,
-114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97,
- 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,
-114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,
-116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,
-115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,
-122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97,
- 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,
-117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,
-100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115,
- 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,
-101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,
-104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114,
- 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,
-111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,
-115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101,
- 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,
-112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,
-108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115,
- 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,
-115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115,
- 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,
-108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,
-100, 52, 0,103,112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,
-106, 49, 0,107, 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,113,
-117, 97,116, 91, 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115,
- 0, 42,109, 97,116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,
-115, 0, 42, 42,109, 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,
-110,100,101,114,115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93,
- 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,
-105,100,101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,
-115,111,108,117, 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,
-102,108, 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,
-112, 0,114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,104, 0,110,
-117,114, 98,115, 0, 42,107,101,121,105,110,100,101,120, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,114, 98, 0, 42, 98,
-101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,101, 0, 42,112, 97,
-116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,109,111,100,101, 0,
-112, 97,100, 91, 50, 93, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99,
- 97,108,101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,
-101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117,
- 0, 42,108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,
-100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115,
- 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114,
- 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0,
- 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,
-115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,
-115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111,
- 0,101,102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,
-118,101,114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,
-121, 0, 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104,
- 0,118,100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97,
- 99,101, 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,
-117, 98,101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,
-100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,
-117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114,
- 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,
-105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,
-110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, 0,115, 91, 50, 53,
- 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,109,105,100, 0,118,
- 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,
-116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,
-119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,
-101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0,
- 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, 99,101,115, 0, 42,
-111,108,100, 95,101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114, 0,109,111,100,105,
-102,105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109,
- 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,
-103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,
-116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116,
- 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,
-116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,
-115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,
-108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115,
- 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101,
- 91, 51, 50, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,109,101, 0, 42,116,
-101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,
-101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121,101,
-114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116,111,
-114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115,112,
-101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,112,101,114, 99,101,
-110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,
-101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,
-119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,
-102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115,
- 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,
-101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,114, 99,101, 0, 42,
- 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,108, 95,112, 97,114,
-109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120, 0, 42,120,110,101,
-119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95,120,
- 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117,109,
-102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,111,112,101,114, 97,
-116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,105,100,115,105,122,
-101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,101,116,115, 0, 42,
- 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,110,103,114,105,100,
- 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,112, 97,100, 50, 0,
-100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,121,110, 99,101,108,
-108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,101,105,103,104,116,
-115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,115,121,115, 0,116,
-111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,101, 0,112,111,115,
-105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,112, 97, 0,118,103,
-114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,116,111,116,108,118,
-108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84, 97,114,103,101,116,
- 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,104,114,105,110,107,
- 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117, 98,115,117,114,102,
- 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116, 91, 50, 93, 0,111,
-114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101, 95,105,110,110,101,
-114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,111, 98, 95, 97,120,
-105,115, 0,115,116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119,
- 95,111,102,115, 0, 97,110,103,108,101, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111,
-112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119,
- 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109,
- 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,
-117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,
-117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,
-114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105,
- 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115,116,114, 97,105,
-110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, 0,114,101,115,
-116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108, 0,100,108,111, 99, 91, 51,
- 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51, 93, 0,100,113,117, 97,116,
- 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51, 93, 0,114,111,116, 65,110,
-103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,111,110,115,116,105,
-110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, 97,103, 0,112,
-114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0,110,108, 97,102,
-108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,
-115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,
-115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,
-105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,
-120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,
-103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116, 0,100,116,120, 0,101,109,112,116,121, 95,
-100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 0,
-100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116,114,111,108,108,
-101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100,101,102, 0,103,
- 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102,116,102,108, 97,
-103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110,115,116,114, 97,
-105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108,101,115,121,115,
-116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105,109, 70,108, 97,
-103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,110,114, 0,115,104, 97,112,101,102,108, 97,103,
- 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,
-105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,
-108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,
-103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,105,110,100,
-101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,109, 97,116,
-101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116, 0,102,111,
-114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,
-107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,
-102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,
-105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102,
- 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,
-102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,101,115,115,
- 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,
-102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,
-119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,
-102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,
-119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,
-102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,105,110,100,101,120,
- 95, 97,114,114, 97,121, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,115,116,101,112, 0,115,105,109,
-102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114,
- 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,
-101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0,109,101,109, 95, 99, 97, 99,
-104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102,
- 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,
-101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115,
- 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95,
- 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,
-107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84,
- 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108,
- 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,105,110,103,
- 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,
-108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95,
- 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116,
- 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,
-105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,
-103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,122,122,121,
-110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,
-114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,
-111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121, 0,115,101,
- 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,
-115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,111,112,115,
- 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105,
- 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,
-105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114,
- 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,
-108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,118, 97,110,
- 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,105,101,119,
-114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,101, 0,114,
-101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,117,101, 0,
-118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,110,116, 0,
-103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109,
- 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,
-101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,
-114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,
-100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91,
- 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,
-109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,
-101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97,
- 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105,
- 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,
-105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,
-101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,
-114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,
-100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,
-105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,
-116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,
-110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101, 0,108,105,
-110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, 82,
- 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,121,115,105,
- 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112, 0,112,104,
-121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,115,116, 97,
- 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, 97,
-114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116, 0,115,116,
- 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,102,101,110,
-100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,102, 97, 99,
- 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, 97,
-111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, 95,
- 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,111,114, 0,
- 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,101, 99,116,
- 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50, 0, 97,111,
- 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115, 97,109,112,
- 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114,
-111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,112, 97,
-100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80,
- 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99,
- 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,
-116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,
-116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0,
- 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101,
- 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,
-105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0,
- 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,
-117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,
-109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101, 0, 97,117,
-100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,117,100,105,
-111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,105,111, 66,
-105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101,
- 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0, 97,117,100,
-105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114,
- 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97,
- 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0,
-115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114, 0,100,105,
-115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,
-116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,
-115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116,
- 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,111,100,101,
- 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,
-115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,
-102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110,
- 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,114,116, 50,
- 0,102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,
-115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,
-116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,
-117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,
-100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,
-115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,
-114,101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,
-116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0,
- 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,
-114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103,
- 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,
-114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114,
- 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108,
- 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,
-105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,
-117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,
-116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52,
- 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,
-114,101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,
-105,102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,
-102,121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,
-108,101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,
-105,110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,
-116, 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,
-100,101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102,
- 0, 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,
-101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,
-120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116,
- 0, 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,100,111,109,101,
- 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,109,101,114,
- 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,
-115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109,
- 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,
-105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,
-107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,
-115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,116,101,112,
- 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0,
-114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,108, 97,115,
-116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,100, 95,115,
-105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,111,114,101,
-100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,117,114,101,
- 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,105,111,110,
- 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,112, 97,105,
-110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,
-121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,
-114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,
-108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,
-101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,
-117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118,
- 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,
-108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118,
- 95,112, 97,100, 91, 50, 93, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116,
- 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101,
- 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,
-111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,
-111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,
-100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,
-105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,
-104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,
-100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,
-103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,
-105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110,
- 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,
-110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,
-104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101,
- 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,
-112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,
-117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108,
- 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0,
- 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,
-100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,
-112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110,
- 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103,
- 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,
-103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,
-109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,
-111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,115,
- 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,
-112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115,
- 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111,
- 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,
-116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,
-121,115,116,101,109, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,
-112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,
-105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,
-116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,
-115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0,
- 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101,
- 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,100, 97,
-103,102,108, 97,103,115, 0,106,117,109,112,102,114, 97,109,101, 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,
-105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,
-115, 95,115,101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91,
- 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,
-101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109,
- 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116,
- 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,
-109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,118,105,101,119, 98,117,116, 0,116,119,100,114,
- 97,119,102,108, 97,103, 0,114,102,108, 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112,
- 91, 54, 93, 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0,
- 42,108,111, 99, 97,108,118,100, 0, 42,114,105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,
-100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,
-117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,
-110,103,108,101, 91, 51, 93, 0,112, 97,100,102, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,
-101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121,
- 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105,
- 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,115, 99,
-101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,110,
-101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,
-117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101,
- 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 97,
-102,116,101,114,100,114, 97,119, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,
-102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,
-104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109,
- 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,
-107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121,
- 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98,
- 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0, 42,115, 99,114,101,101,110, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,
-111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,
-110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,
-118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,114,101,
-110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109, 0,116,
-105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,
-101,102,105,108,101, 91, 56, 48, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,111,
-111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,112,
- 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,115,
- 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,110,
-101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,121,
-111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,114,
- 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91, 51,
- 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,100,111, 95, 0,111,
-117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114,
- 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,114, 0,108,111, 99,107, 0,112,105,110, 0,100,116, 95,117,118,
- 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,
-101,110,116,120, 0, 99,101,110,116,121, 0,115, 99,111,112,101,115, 0,115, 97,109,112,108,101, 95,108,105,110,101, 95,104,105,
-115,116, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,108,104,101,105,103,104,116, 0, 99,
-119,105,100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,
-114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,111,118,101,114,119,114,105,116,
-101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,110,101, 0,116,120,116,115, 99,114,111,
-108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,108,117,103,105,110,115, 0,102,105,110,
-100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50, 53, 54, 93, 0, 42,112,121, 95,100,114,
- 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,
-115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,
-112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50,
- 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,
-104,101,115, 0, 99, 97, 99,104,101, 95,100,105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,
-112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,
-101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,
-109,116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,
-114,111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,
-114,101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41,
- 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,
-110,102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112,
- 0, 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,
-114,112,116, 95,109, 97,115,107, 0,115, 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,
-112,116, 91, 50, 53, 54, 93, 0,108, 97,110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,
-101,108, 95,101,110,100, 0,102,105,108,116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,
-110,100,110,114, 0,102,105,108,101,110, 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116,
- 95,105,100, 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99,
- 0, 98,111,108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,
-108,112,104, 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,
-112,108, 97, 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,
-111,111,109, 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115,
- 0, 99,111,108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112,
- 97, 99,101, 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,
-110,101,108,115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,
-110,101, 91, 52, 93, 0,105,110,110,101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109,
- 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,
-104, 97,100,101,116,111,112, 0,115,104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,
-110,101,114, 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,
-110,101,114, 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,
-114, 95,100,114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,
-119, 99,111,108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116,
- 0,119, 99,111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,
-103,108,101, 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108,
- 95,109,101,110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97,
- 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,
-115, 99,114,111,108,108, 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,
-116,101,109, 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107,
- 91, 52, 93, 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52,
- 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93,
- 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,
-116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,
-111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101,
- 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93,
- 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,
-101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52,
- 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,
-114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52,
- 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,
-102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91,
- 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,
-101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,
-108, 91, 52, 93, 0,101,100,103,101, 95, 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101,
- 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93,
- 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0,
- 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101,
- 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,
-114, 98, 95,118,108,105,110,101, 91, 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,
-101,108, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,
-115,116,115,101,108, 95,112,111,105,110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,
-110,100,108,101, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,
-108,101, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104,
- 97,110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,
-116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,
-110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,
-111,117,116,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,
-108,101, 95,105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,
-111,108,101, 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,
-116, 95,115,105,122,101, 0, 98,112, 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,
-110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,
-120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93,
- 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114,
- 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,
-105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,
-101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,
-122,101, 0,104,112, 97,100, 91, 55, 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100,
- 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,
-110,102,111, 0,116,115,110,100, 0,116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109,
- 97,115,101,108, 0,116,101,120,116, 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,
-105, 99, 0,116,117,115,101,114,112,114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97,
- 99,116,105,118,101, 95,116,104,101,109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99,
- 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48,
- 93, 0,102,111,110,116,100,105,114, 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,
-120,116,117,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,
-115,101,113,100,105,114, 91, 49, 54, 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,
-100,105,114, 91, 49, 54, 48, 93, 0,105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,
-112,108, 97,121,101,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118,
- 50,100, 95,109,105,110, 95,103,114,105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,
-101,114,115,105,111,110,115, 0,100, 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115,
- 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101,
- 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,
-100,105,111,100,101,118,105, 99,101, 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0,
- 97,117,100,105,111, 99,104, 97,110,110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,
-111,112,116,115, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,
-100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,
-112,115, 0, 97,100,100,111,110,115, 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,
-116,101,112,115, 0,117,110,100,111,109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116,
- 0,103,112, 95,101,117, 99,108,105,100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,
-101,116,116,105,110,103,115, 0,116, 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,
-115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,
-119, 95,104, 97,110,100,108,101,115,105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,
-116,101,120, 99,111,108,108,101, 99,116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,109,101,109, 99,
- 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,
-114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,
-100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,
-101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110,100,111,102,
- 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,111,108,111,114, 95,
-112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,108,101,115, 95,110,
-101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,114,111,112,119,105,
-100,116,104, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49,
- 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,
-112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0,118,101,114,116, 98, 97,115,101,
- 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,117,108,
-108, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,104, 0,100,111, 95,100,114,
- 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,117,114,115,111,114, 0,100,
-111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,115,117, 98,119,105,110, 97,
- 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116, 0,104, 97,110,100,108,101,
-114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,121,112,101, 0,112, 97,110,
-101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114, 97,119,110, 97,109,101, 91,
- 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,108, 97, 98,101,108,111,
-102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,115,111,114,
-116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100, 97,116, 97, 0,108,105,115,
-116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108, 97,115,116, 95,108,101,110,
- 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0,
- 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,
-114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0, 97, 99,116,105,111,110,122,
-111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,100, 0,114,101,103,105,111,
-110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111,118,101,114,108, 97,121, 0,
-117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,
-111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,
-115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115,
- 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,
-102, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,110, 97,109,101, 91, 56, 48, 93, 0, 42,105, 98,117,102, 0, 42,
-105, 98,117,102, 95, 99,111,109,112, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110,114, 0, 98,111,116,116,
-111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103, 97,109,109, 97,
- 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116, 97,114,116,115,
-116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0,111,114,120, 0,111,114,121,
- 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101,
- 0, 42,116,115,116,114,105,112,100, 97,116, 97, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,115,116, 97,114,116,115,116,
-105,108,108, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 95,101,110,100,115,116,105,108,108, 0, 42,105, 98,117,102, 95,115,
-116, 97,114,116,115,116,105,108,108, 0, 42,105, 98,117,102, 95,101,110,100,115,116,105,108,108, 0, 42,105,110,115,116, 97,110,
- 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,105,118, 97,116,
-101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,109, 97, 99,104,
-105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,108, 0,104, 97,
-110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,115, 99,101,110,
-101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,102, 97,100,101,
-114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0, 42,115, 99,101,
-110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,109,117,108,116,105,
- 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116, 97, 0, 97,110,
-105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,100, 95,109,111,
-100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,112, 97,114,115,
-101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0,
- 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,105,114, 91, 50,
- 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,102,108, 97,103,
- 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,114,100, 0,119,
-105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,100, 68,105,115,
-116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,
-108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120, 73,110,105, 0,
-120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110, 0,105,110,116,
-101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114, 97,109,101, 77,
- 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,101, 0, 98,117,
-116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,114,109,102, 97,
- 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,105,102,101, 0,
-102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,118,101, 99, 91,
- 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,109, 97,116, 91,
- 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112, 0,111,109, 97,
-116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,118,101,114,116,
-103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,112,110, 97,109,
-101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,117,115,101,100, 0,117,115,101,100,101,108,
-101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,
-101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,
-103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51,
- 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51,
- 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,
-101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0, 99,
-111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,
-116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0,
-116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,
-105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,
-112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115,
- 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109,
- 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,
-114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,
-105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,114,101,102,101,
-114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110, 99,101, 0,114,111,108,108,
-111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101,
- 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103, 97,105,110, 0,112, 97,100,
- 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108,
-105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99,
- 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93,
- 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,
-110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,110, 99,101, 0,109,105,110,
- 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93,
- 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93,
- 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,111,110, 0,105,110,116, 95,
- 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97,
-116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, 99,116,
- 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97,
-109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0, 42,115,117, 98,116, 97,114,
-103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,
-110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,
-108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93,
- 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,
-105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93,
- 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,120,119,105,100,116,
-104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,
-100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0,
- 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,108, 97,
-121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,
-103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,
-101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,
-112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,
-115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99,
- 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,
-103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,
-108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,
-102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108,
- 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42,
- 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108, 95,
-113,117, 97,116, 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 0,101,117,108, 91, 51, 93, 0, 99,
-104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,
-101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91,
- 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,
-114,101,116, 99,104, 0,105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 42, 99,
-117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0, 99,104, 97,110, 98, 97,115,101, 0, 42, 99,104, 97,110,104,
- 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93,
- 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101,
- 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109,
- 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,101,114, 0,110,117,109,115,
-116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98,
- 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,
-101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97,
- 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112,
- 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0, 42,103,114,112, 0,116,
-101,109,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,101,
-110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,114,
-114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116, 79,
-114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,
-111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,111,
-108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,116,
-119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0, 99,
-104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,101,
-115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91, 51,
- 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,108,
- 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,105,
-118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,105,
-109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,109,
- 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,109,
- 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,116, 65,
-120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, 50, 93,
- 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100, 0,
- 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,101,
-110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91, 51,
- 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,116,
-112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,111, 99,
-107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,115,116,
- 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,100,101,
-120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,110,111,
-100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105,
-100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,
-111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,
-111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, 0, 42,
-102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,101,115,
- 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,116, 0,
-115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,111,119,
-110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,115,116,
- 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104,
- 0, 42,112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,
-109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114, 99,101,
-110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,110, 95,
-119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,
-101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,
-103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104,
- 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,101,108,
- 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,
-114,111,116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120,
- 98,108,117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,
-102,115, 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99,
- 0,106,105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,
-108,105,102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110,
- 0,117,110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,
-103, 0,117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,
-108,101, 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,
-116, 97, 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,
-100, 95,116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97,
- 99,107, 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51,
- 93, 0,120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,
-103, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54,
- 93, 0,115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114,
- 97, 99,121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119,
- 97,118,101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,
-111,112,101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120,
- 91, 51, 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,
-109, 95, 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,
-114,109, 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,
-110, 95,105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,110,111,114,109, 97,
-108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,115,109,111,111,116,104, 95,115,
-116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,102, 97, 99,116,111,
-114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,110,101, 0,112,108, 97,110,101,
- 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,101,120,112, 97,105,110,116, 95,
-116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97,117,116,111,115,109,111,111,116,104, 95,
-102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97,110,101,
- 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116,117,114,
-101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,
-117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93, 0, 97, 99,116,105,118,101, 95,
-114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42,108, 97,
-121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101, 0, 42,
-112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,118,101,
- 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,110,117,109, 0,112, 97,114,101,110,116,
- 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, 50, 93,
- 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,
-110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,
-105,110,103, 95,107, 0,114,101,115,116, 95,108,101,110,103,116,104, 0,118,105,115, 99,111,115,105,116,121, 95,111,109,101,103,
- 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115, 95,107, 0,115,116,105,
-102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0, 98,117,111,121, 97,110,
- 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0,
- 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,
-100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98,102,114,
- 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101,
-112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0,
-105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0,
- 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0,
- 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,115,105,109,112,108,105,
-102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,105,109,112,108,105,102,
-121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,112,111,114,116, 0,116,
-105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,114,105,100, 95,114,101,
-115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102,
- 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,
-100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0,114,101,
- 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99,
- 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,
-110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,
-105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,
-108,117,109,112,112,111,119, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104,
- 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104,
- 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,
-110,103,116,104, 95,116,104,114,101,115, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,108,105,110,
-101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,108, 95, 99,
-111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115, 0, 42,101,
-102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0, 42,112, 97,
-114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,104,105,108,
-100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,104,101, 98,
-117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,117,116, 95,
-100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,114, 97,109,
-101, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,
-104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,
-101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93, 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103,
- 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0,
- 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117, 99,
-116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117, 99,
-116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,115,
- 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115, 99,
- 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,104,
- 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,101,
- 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,112,
-101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,112,
- 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,101,
-115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,102,
- 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111,112, 95,
- 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99,107,110,
-101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,103,
-115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,102,
-102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0, 42,116,121,112,101,115,116,114, 0, 42,109,101,115,
-115, 97,103,101, 0,108,105,115,116, 0,112,114,105,110,116,108,101,118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0,
- 42,114,101,112,111,114,116,116,105,109,101,114, 0,103,114,101,121,115, 99, 97,108,101, 0,119,105,100,116,104,102, 97, 99, 0,
- 42,119,105,110,100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,
-105,110,105,116,105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, 95,100,
-101,112,116,104, 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,
-115, 0,112, 97,105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103,115, 0,
- 42,100,101,102, 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,
-101,114, 0, 42,103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,110,101,119,115, 99,114,101,
-101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,119,105,110,100,
-111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,100,100,109,111,
-117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,
-101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116,
- 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,
-114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,116, 0, 99,116,
-114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,116,121,112,101,
- 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100, 0,107,109,105,
- 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97,115,101,110,
- 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,112,
-121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0, 42,
-101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, 97,114,
-114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112,104, 97,
-115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108,117,101,
- 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116,101,114,
- 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108,101,115,
- 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,112, 95,115,105,
-122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,116,114, 97,110,
-115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,116, 97,114,103,
-101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0, 42,101,
-120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,110,100,101,120,
- 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,
-111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,
-117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,
-100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,121,105,110,103,
-102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,112,
- 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105,112,
- 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100,101,
- 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114,117,
-108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100,
- 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119,
- 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101,
- 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,
-101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116,
- 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,
-103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, 95,109,
- 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97,118,101,
- 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95,115,112,
-101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, 99, 0,
-108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101,
- 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, 42,102,
-108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,
-119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91,
- 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0,
- 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,
-101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116,
- 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,
-101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97,
- 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115,
- 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,
-117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,
-108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,
-112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, 0, 0,
- 84, 89, 80, 69,211, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,
-105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100,
- 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101,
- 99, 50,102, 0,118,101, 99, 50,105, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51,
-100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99, 52,100, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68,
- 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,
-114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,
-101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,
-112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,
-120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,
-101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71,
- 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120,
- 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0,
- 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68,
- 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,
-114,118,101, 77, 97,112,112,105,110,103, 0, 86,111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105,
- 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,
-109, 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,
-111, 0, 84,101,120,116, 66,111,120, 0, 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80,
- 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77,
- 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,
-101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,
-104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,
-105, 98,105,108,105,116,121, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77,
- 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77,
- 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103,
- 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,
-116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,
-101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116,
- 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,
-105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,
-100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,
-114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68,
- 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,
-111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,
-111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,
-110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,
-101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,
-114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,
-105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,
-111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109,
- 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,
-116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,
-105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115,
- 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,
-108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102,
- 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,
-114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
- 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,
-109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101,
- 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,
-117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,
-110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,
-101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,
-114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,
-114,111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101,
- 0, 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,
-110, 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116,
- 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71,
- 0, 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, 80, 84, 67, 97,
- 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, 0, 66,111,100,121, 83,
-112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111,
-100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,
-116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116,
- 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 82,101,110,
-100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, 68,111,109,101, 0, 71,
- 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 80,
- 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 80, 97,
-114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,
-105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, 83, 99,117,108,112,116,
- 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 85,110,105,116,
- 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105,116,105,110,103,
- 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 82,101,103,105,
-111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,116,111,112,111, 86,105,101,119, 68, 97,
-116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,116,111,114,101, 0,119,109,
- 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,101,119, 50, 68, 0, 83,112,
- 97, 99,101, 73,110,102,111, 0, 98, 83, 99,114,101,101,110, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101, 83,104,
-101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,101, 99,
-116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,112,101,
-114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,101, 83,
-116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0, 83, 99,
-111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,120,
-116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101, 67, 97,
- 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103,
-105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101,
- 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,110,100,
- 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,
-108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,
-101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101,
- 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0, 83,111,
-108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 83, 99,114, 86,101,114,116, 0, 83, 99,114, 69,100,103,101,
- 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 84,
-121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,105,108,101, 71,108,111, 98,
- 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 84, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,
-112, 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110,
- 99,101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,
-113,117,101,110, 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,
-114,115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0,
- 83,112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102,
- 0, 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,
-114,116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,
-117, 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,
-114,116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121,
- 83,101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,
-110,115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,
-114,109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,
-110,115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114,
- 0, 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,
-116,117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,
-110, 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114,
- 0, 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,
-116,111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,
-117, 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,
-111,114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,
-117, 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,
-116,117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121,
- 65, 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,
-114,101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109,
- 97,116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98,
- 65,114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104,
- 97,110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,
-117,112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,
-111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,
-110,115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,
-111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,
-116, 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,
-110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,
-109,101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,
-115,116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,
-110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,
-104, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,
-112, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116,
- 0, 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,
-116,114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,
-105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,
-105,110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,
-119,114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98,
- 65, 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,
-101,116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,
-117,105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0,
- 78,111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,
-105,108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101,
- 73,109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0,
- 78,111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,
-101,114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,
-105, 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,
-110,115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,
-114,115,112,105,108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,
-110,116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116,
- 97, 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,
-121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68,
- 97,116, 97, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116,
- 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116,
- 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,
-110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,
-121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,
-100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,
-109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 0, 82,101,112,111,114,116, 76,105,115,116, 0, 82,
-101,112,111,114,116, 84,105,109,101,114, 73,110,102,111, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,
-109, 87,105,110,100,111,119, 0,119,109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117,
- 98, 87,105,110,100,111,119, 0,119,109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,
-111,105,110,116,101,114, 82, 78, 65, 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,
-101, 0, 70, 77,111,100,105,102,105,101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95,
- 70,117,110, 99,116,105,111,110, 71,101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,
-116, 97, 0, 70, 77,111,100, 95, 69,110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,
-100, 95, 80,121,116,104,111,110, 0, 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0,
- 70, 77,111,100, 95, 83,116,101,112,112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114,
- 86, 97,114, 0, 67,104, 97,110,110,101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0,
- 65,110,105,109, 77, 97,112, 80, 97,105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0,
- 78,108, 97, 84,114, 97, 99,107, 0, 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,
-118,101,114,114,105,100,101, 0, 73,100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,
-111,105,100, 82,117,108,101, 71,111, 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,
-108,108,105,115,105,111,110, 0, 66,111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,
-100, 82,117,108,101, 65,118,101,114, 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0,
- 66,111,105,100, 83,116, 97,116,101, 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0,
- 84, 76, 69, 78, 1, 0, 1, 0, 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 8, 0, 12, 0, 8, 0, 4, 0,
- 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52, 0, 40, 2, 0, 0,
- 32, 0,140, 0,220, 3, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 56, 0, 24, 0, 40, 0,120, 0, 12, 0,104, 0, 36, 0,
-120, 5,156, 1, 0, 0, 0, 0, 0, 0, 8, 1, 48, 1, 84, 1, 24, 0, 8, 3,168, 0, 0, 0, 72, 0, 32, 1,152, 0,132, 0,
-108, 1, 16, 1, 88, 0,160, 2, 76, 0, 60, 1, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0, 16, 0, 12, 0, 0, 0, 92, 1,
- 0, 0, 0, 0, 0, 0, 40, 1, 20, 0, 44, 0, 60, 0, 24, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0, 0, 28, 0, 84, 0,
- 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 12, 0, 16, 0, 64, 0, 24, 0, 12, 0, 40, 0, 64, 0,
- 80, 0,100, 0,108, 0, 80, 0,108, 0,128, 0, 76, 0, 72, 0,120, 0, 72, 0, 84, 0,204, 0, 48, 0,168, 0,160, 0,172, 0,
- 72, 0,104, 0,116, 0,196, 0,112, 0,224, 0, 64, 0, 92, 0, 0, 0,144, 0, 32, 0,240, 1,112, 0, 0, 0, 88, 0, 0, 0,
- 0, 0, 76, 0, 8, 0, 8, 0,244, 0, 88, 0,124, 1, 84, 0, 76, 0, 72, 0, 72, 0,176, 1,120, 0,116, 0, 64, 0,120, 0,
- 92, 0,220, 0, 40, 0, 0, 0, 92, 0,148, 0, 72, 0, 48, 0, 20, 0,120, 0,144, 0, 88, 1,208, 0,180, 0, 0, 0, 68, 0,
- 92, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,112, 1, 28, 0,176, 0,144, 0, 64, 0, 60, 0, 24, 0, 72, 0,232, 3, 56, 0,
- 20, 0, 16, 0,100, 0, 84, 0, 16, 0,188, 2, 36, 0, 16, 0,156, 0, 80, 0, 88, 0, 36, 0,152, 1, 32, 0, 8, 0, 24, 0,
- 56, 2, 0, 0, 0, 0, 72, 0, 72, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 0, 40, 0,140, 0, 48, 0,140, 0,208, 0,
- 24, 0,216, 0,216, 0,200, 1, 60, 0, 0, 0,120, 0, 0, 0,252, 0, 12, 0, 12, 0, 24, 33,112, 16, 24, 16,192, 0,124, 2,
- 80, 2, 40, 0, 36, 0,188, 0,244, 0, 52, 0,140, 2, 28, 0,112, 1, 88, 0,188, 0, 96, 0, 92, 1, 16, 1, 32, 0,224, 0,
- 32, 0, 32, 0,112, 2,104, 1, 16, 0, 48, 29, 72, 0, 56, 0,240, 12, 20, 0, 24, 0, 64, 1, 0, 0, 0, 0, 0, 0,248, 0,
- 0, 0, 16, 1, 80, 0, 28, 0, 16, 0, 8, 0, 44, 0,252, 0,240, 0,168, 1,216, 0, 16, 0, 12, 0, 24, 0, 52, 0, 16, 0,
- 20, 0, 16, 0, 24, 0, 56, 1, 0, 0, 56, 0, 52, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8, 0, 72, 0, 44, 0,
- 40, 0,108, 0, 72, 0, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0, 32, 0, 68, 0, 80, 0, 16, 0,
- 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 56, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 80, 0, 24, 0, 16, 1,
-144, 0, 16, 0,204, 1, 4, 0, 40, 0,104, 0,216, 0, 64, 0, 44, 0, 72, 0,116, 0, 60, 0,112, 0, 16, 0, 52, 0, 44, 0,
- 44, 0, 44, 0, 8, 0, 36, 0, 68, 0, 64, 0, 44, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92, 0, 52, 0, 28, 0,
- 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,120, 0, 32, 0,180, 0, 0, 0, 0, 0, 0, 0, 16, 0, 40, 0, 28, 0,
- 12, 0, 12, 0, 16, 1, 44, 0, 8, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 96, 0, 20, 0, 32, 0,
- 12, 0, 44, 0, 20, 0, 68, 0,240, 0, 24, 0, 56, 0, 52, 0, 20, 0, 64, 0, 28, 0, 20, 0,180, 0, 36, 0,200, 1, 96, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 24, 0, 28, 0, 20, 0,168, 0,148, 0,152, 0, 0, 0, 0, 0,
- 0, 0,104, 0, 0, 0, 96, 0, 0, 0, 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 20, 0, 48, 0,
-208, 1, 28, 1, 16, 0, 68, 0, 0, 1, 20, 0,160, 0, 88, 0, 96, 0,152, 0, 20, 0, 56, 0, 48, 0, 68, 0, 56, 0, 92, 0,
- 64, 0, 56, 0, 96, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,152, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1, 0,
- 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2, 0,
- 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 2, 0, 4, 0, 5, 0, 4, 0, 6, 0,
- 16, 0, 2, 0, 8, 0, 5, 0, 8, 0, 6, 0, 17, 0, 3, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 18, 0, 3, 0,
- 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 19, 0, 3, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 20, 0, 4, 0,
- 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7, 0, 4, 0, 8, 0, 21, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0,
- 7, 0, 8, 0, 22, 0, 4, 0, 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 8, 0, 8, 0, 23, 0, 4, 0, 4, 0, 9, 0,
- 4, 0, 10, 0, 4, 0, 11, 0, 4, 0, 12, 0, 24, 0, 4, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0,
- 25, 0, 4, 0, 9, 0, 13, 0, 12, 0, 14, 0, 4, 0, 15, 0, 4, 0, 16, 0, 26, 0, 10, 0, 26, 0, 0, 0, 26, 0, 1, 0,
- 0, 0, 17, 0, 0, 0, 18, 0, 2, 0, 19, 0, 0, 0, 20, 0, 4, 0, 21, 0, 25, 0, 22, 0, 4, 0, 23, 0, 4, 0, 24, 0,
- 27, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 27, 0, 25, 0, 28, 0, 26, 0, 0, 0, 27, 0, 2, 0, 28, 0, 2, 0, 19, 0,
- 4, 0, 29, 0, 26, 0, 30, 0, 28, 0, 8, 0, 27, 0, 31, 0, 27, 0, 32, 0, 29, 0, 33, 0, 0, 0, 34, 0, 0, 0, 35, 0,
- 4, 0, 36, 0, 4, 0, 37, 0, 28, 0, 38, 0, 30, 0, 5, 0, 4, 0, 39, 0, 4, 0, 40, 0, 2, 0, 41, 0, 2, 0, 42, 0,
- 4, 0, 43, 0, 31, 0, 6, 0, 32, 0, 44, 0, 2, 0, 45, 0, 2, 0, 46, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 47, 0,
- 33, 0, 21, 0, 33, 0, 0, 0, 33, 0, 1, 0, 34, 0, 48, 0, 35, 0, 49, 0, 24, 0, 50, 0, 24, 0, 51, 0, 2, 0, 45, 0,
- 2, 0, 46, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 54, 0, 2, 0, 55, 0, 2, 0, 19, 0, 2, 0, 56, 0, 7, 0, 11, 0,
- 7, 0, 12, 0, 4, 0, 57, 0, 7, 0, 58, 0, 7, 0, 59, 0, 7, 0, 60, 0, 31, 0, 61, 0, 36, 0, 7, 0, 27, 0, 31, 0,
- 12, 0, 62, 0, 24, 0, 63, 0, 2, 0, 45, 0, 2, 0, 64, 0, 2, 0, 65, 0, 2, 0, 37, 0, 37, 0, 16, 0, 37, 0, 0, 0,
- 37, 0, 1, 0, 7, 0, 66, 0, 7, 0, 60, 0, 2, 0, 17, 0, 2, 0, 46, 0, 2, 0, 67, 0, 2, 0, 19, 0, 4, 0, 68, 0,
- 4, 0, 69, 0, 9, 0, 2, 0, 7, 0, 70, 0, 0, 0, 20, 0, 0, 0, 71, 0, 7, 0, 72, 0, 7, 0, 73, 0, 38, 0, 13, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 37, 0, 75, 0, 0, 0, 76, 0, 4, 0, 77, 0, 7, 0, 60, 0, 12, 0, 78, 0, 36, 0, 79, 0,
- 27, 0, 80, 0, 2, 0, 17, 0, 2, 0, 81, 0, 2, 0, 82, 0, 2, 0, 19, 0, 40, 0, 6, 0, 40, 0, 0, 0, 40, 0, 1, 0,
- 0, 0, 83, 0, 0, 0, 84, 0, 4, 0, 23, 0, 4, 0, 85, 0, 41, 0, 10, 0, 41, 0, 0, 0, 41, 0, 1, 0, 4, 0, 86, 0,
- 4, 0, 87, 0, 4, 0, 88, 0, 4, 0, 89, 0, 4, 0, 14, 0, 4, 0, 90, 0, 0, 0, 91, 0, 0, 0, 92, 0, 42, 0, 15, 0,
- 27, 0, 31, 0, 0, 0, 93, 0, 4, 0, 90, 0, 4, 0, 94, 0, 12, 0, 95, 0, 40, 0, 96, 0, 40, 0, 97, 0, 4, 0, 98, 0,
- 4, 0, 99, 0, 12, 0,100, 0, 0, 0,101, 0, 4, 0,102, 0, 4, 0,103, 0, 9, 0,104, 0, 8, 0,105, 0, 43, 0, 3, 0,
- 4, 0,106, 0, 4, 0,107, 0, 9, 0, 2, 0, 44, 0, 15, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0, 17, 0, 2, 0, 19, 0,
- 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114, 0, 7, 0,115, 0,
- 7, 0,116, 0, 36, 0, 79, 0, 32, 0,117, 0, 45, 0, 13, 0, 4, 0,118, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0,
- 2, 0,122, 0, 2, 0,123, 0, 2, 0, 19, 0, 2, 0,124, 0, 2, 0,125, 0, 2, 0,126, 0, 2, 0,127, 0, 2, 0,128, 0,
- 46, 0,129, 0, 47, 0, 32, 0, 27, 0, 31, 0, 0, 0, 34, 0, 12, 0,130, 0, 48, 0,131, 0, 49, 0,132, 0, 50, 0,133, 0,
- 50, 0,134, 0, 2, 0,135, 0, 2, 0,136, 0, 2, 0,124, 0, 2, 0, 19, 0, 2, 0,137, 0, 2, 0, 17, 0, 4, 0,138, 0,
- 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, 2, 0,144, 0, 4, 0,145, 0, 4, 0,146, 0,
- 43, 0,147, 0, 30, 0,148, 0, 7, 0,149, 0, 4, 0,150, 0, 2, 0,151, 0, 2, 0,152, 0, 2, 0,153, 0, 2, 0,154, 0,
- 7, 0,155, 0, 7, 0,156, 0, 51, 0, 63, 0, 2, 0,157, 0, 2, 0,158, 0, 2, 0,159, 0, 2, 0,160, 0, 32, 0,161, 0,
- 52, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0, 0, 0,165, 0, 0, 0,166, 0, 0, 0,167, 0, 7, 0,168, 0, 7, 0,169, 0,
- 7, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0, 2, 0,173, 0, 2, 0,174, 0, 2, 0,175, 0, 2, 0,176, 0, 0, 0,177, 0,
- 0, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0, 56, 0, 7, 0,184, 0,
- 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0,
- 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0,
- 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0,
- 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0,
- 7, 0,217, 0, 7, 0,218, 0, 53, 0, 15, 0, 0, 0,219, 0, 9, 0,220, 0, 0, 0,221, 0, 0, 0,222, 0, 4, 0,223, 0,
- 4, 0,224, 0, 9, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 7, 0,228, 0, 4, 0,229, 0, 9, 0,230, 0, 9, 0,231, 0,
- 4, 0,232, 0, 4, 0, 37, 0, 54, 0, 6, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,233, 0, 7, 0, 66, 0,
- 4, 0, 63, 0, 55, 0, 5, 0, 2, 0, 19, 0, 2, 0, 36, 0, 2, 0, 63, 0, 2, 0,234, 0, 54, 0,228, 0, 56, 0, 17, 0,
- 32, 0,161, 0, 47, 0,235, 0, 57, 0,236, 0, 7, 0,237, 0, 7, 0,238, 0, 2, 0, 17, 0, 2, 0,239, 0, 7, 0,109, 0,
- 7, 0,110, 0, 7, 0,240, 0, 4, 0,241, 0, 2, 0,242, 0, 2, 0,243, 0, 4, 0,124, 0, 4, 0,138, 0, 2, 0,244, 0,
- 2, 0,245, 0, 58, 0, 22, 0, 2, 0, 19, 0, 2, 0,246, 0, 7, 0,247, 0, 7, 0,248, 0, 2, 0,137, 0, 2, 0,249, 0,
- 4, 0,250, 0, 4, 0,251, 0, 32, 0,161, 0, 4, 0,252, 0, 2, 0,253, 0, 2, 0,254, 0, 9, 0,255, 0, 7, 0, 0, 1,
- 7, 0, 1, 1, 2, 0, 2, 1, 2, 0, 3, 1, 2, 0, 4, 1, 2, 0, 5, 1, 7, 0, 6, 1, 7, 0, 7, 1, 55, 0, 8, 1,
- 59, 0, 13, 0, 4, 0, 9, 1, 4, 0, 10, 1, 2, 0, 11, 1, 2, 0, 19, 0, 2, 0, 12, 1, 2, 0, 13, 1, 32, 0,161, 0,
- 7, 0, 14, 1, 4, 0, 15, 1, 0, 0, 16, 1, 7, 0, 17, 1, 4, 0, 18, 1, 4, 0,124, 0, 52, 0, 63, 0, 27, 0, 31, 0,
- 39, 0, 74, 0, 7, 0, 19, 1, 7, 0, 20, 1, 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 25, 1,
- 7, 0, 26, 1, 7, 0, 27, 1, 7, 0, 69, 0, 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1,
- 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1, 7, 0, 36, 1, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 2, 0, 40, 1,
- 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1, 2, 0, 44, 1, 2, 0, 45, 1, 2, 0, 46, 1, 2, 0, 19, 0, 2, 0, 17, 0,
- 2, 0,239, 0, 7, 0, 47, 1, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 4, 0, 51, 1, 4, 0, 52, 1, 2, 0, 53, 1,
- 2, 0, 54, 1, 2, 0, 12, 1, 2, 0,122, 0, 4, 0, 23, 0, 4, 0,119, 0, 4, 0,120, 0, 4, 0,121, 0, 7, 0, 55, 1,
- 7, 0, 56, 1, 7, 0, 89, 0, 45, 0, 57, 1, 60, 0, 58, 1, 36, 0, 79, 0, 47, 0,235, 0, 53, 0, 59, 1, 55, 0, 8, 1,
- 56, 0, 60, 1, 30, 0,148, 0, 58, 0, 61, 1, 59, 0, 62, 1, 0, 0, 63, 1, 0, 0,178, 0, 61, 0, 8, 0, 7, 0, 64, 1,
- 7, 0, 65, 1, 7, 0,169, 0, 4, 0, 19, 0, 7, 0, 66, 1, 7, 0, 67, 1, 7, 0, 68, 1, 32, 0, 44, 0, 62, 0, 72, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 69, 1, 2, 0,172, 0, 2, 0, 70, 1, 7, 0,179, 0,
- 7, 0,180, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1,
- 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1, 63, 0, 82, 1, 2, 0,246, 0,
- 2, 0, 69, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 7, 0, 87, 1,
- 2, 0, 88, 1, 2, 0, 89, 1, 2, 0, 90, 1, 2, 0, 91, 1, 0, 0, 92, 1, 0, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1,
- 2, 0, 96, 1, 2, 0, 97, 1, 2, 0, 98, 1, 7, 0, 99, 1, 7, 0,100, 1, 7, 0,101, 1, 7, 0,102, 1, 2, 0,103, 1,
- 2, 0, 89, 0, 2, 0,104, 1, 2, 0,105, 1, 2, 0,106, 1, 2, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1,
- 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1, 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 7, 0,117, 1, 7, 0,118, 1,
- 7, 0,119, 1, 2, 0,120, 1, 0, 0,121, 1, 36, 0, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 0, 0,124, 1, 30, 0,148, 0,
- 64, 0, 18, 0, 7, 0,125, 1, 7, 0,126, 1, 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1,
- 7, 0,132, 1, 7, 0,133, 1, 7, 0,134, 1, 2, 0,135, 1, 2, 0,136, 1, 2, 0,137, 1, 2, 0,138, 1, 7, 0,139, 1,
- 7, 0,140, 1, 7, 0,141, 1, 7, 0,142, 1, 65, 0,124, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0,143, 1, 2, 0, 19, 0,
- 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0, 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1,
- 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1, 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 7, 0,156, 1,
- 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1, 7, 0,160, 1, 7, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 64, 0,164, 1,
- 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 7, 0,168, 1, 7, 0,169, 1, 7, 0,170, 1, 7, 0,171, 1, 2, 0,172, 1,
- 2, 0,173, 1, 2, 0,174, 1, 0, 0,175, 1, 0, 0,176, 1, 7, 0,177, 1, 7, 0,178, 1, 2, 0,179, 1, 2, 0,180, 1,
- 7, 0,181, 1, 7, 0,182, 1, 7, 0,183, 1, 7, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, 4, 0, 69, 1, 4, 0,187, 1,
- 2, 0,188, 1, 2, 0,189, 1, 2, 0,190, 1, 2, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1,
- 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1, 7, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 0, 0,202, 1, 7, 0,203, 1,
- 7, 0,204, 1, 7, 0,205, 1, 4, 0,206, 1, 0, 0,207, 1, 0, 0,104, 1, 0, 0,208, 1, 0, 0, 63, 1, 2, 0,209, 1,
- 2, 0,210, 1, 2, 0,123, 1, 2, 0,211, 1, 2, 0,212, 1, 2, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 7, 0,216, 1,
- 7, 0,217, 1, 7, 0,218, 1, 2, 0,157, 0, 2, 0,158, 0, 55, 0,219, 1, 55, 0,220, 1, 0, 0,221, 1, 0, 0,222, 1,
- 0, 0,223, 1, 0, 0,224, 1, 2, 0,225, 1, 2, 0,226, 1, 7, 0,227, 1, 7, 0,228, 1, 51, 0,122, 1, 60, 0, 58, 1,
- 36, 0, 79, 0, 66, 0,229, 1, 30, 0,148, 0, 7, 0,230, 1, 7, 0,231, 1, 7, 0,232, 1, 7, 0,233, 1, 7, 0,234, 1,
- 2, 0,235, 1, 2, 0, 69, 0, 7, 0,236, 1, 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1,
- 7, 0,242, 1, 7, 0,243, 1, 7, 0,244, 1, 2, 0,245, 1, 2, 0,246, 1, 4, 0,247, 1, 4, 0,248, 1, 12, 0,249, 1,
- 67, 0, 4, 0, 27, 0, 31, 0, 0, 0,250, 1, 68, 0, 2, 0, 43, 0,147, 0, 69, 0, 26, 0, 69, 0, 0, 0, 69, 0, 1, 0,
- 70, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1, 4, 0,254, 1, 4, 0,255, 1, 4, 0, 0, 2, 4, 0, 1, 2, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0, 2, 2, 2, 0, 3, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 4, 2, 7, 0, 5, 2,
- 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 9, 2, 7, 0, 10, 2, 7, 0, 23, 0, 7, 0, 11, 2, 7, 0, 12, 2,
- 71, 0, 20, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0, 13, 2, 12, 0, 14, 2, 12, 0, 15, 2, 36, 0, 79, 0,
- 65, 0, 16, 2, 0, 0, 19, 0, 0, 0, 17, 2, 2, 0, 18, 2, 2, 0,171, 0, 2, 0, 37, 0, 7, 0, 64, 1, 7, 0,169, 0,
- 7, 0, 65, 1, 7, 0, 19, 2, 7, 0, 20, 2, 7, 0, 21, 2, 69, 0, 22, 2, 35, 0, 11, 0, 7, 0, 23, 2, 7, 0, 24, 2,
- 7, 0, 25, 2, 7, 0,248, 0, 2, 0, 54, 0, 0, 0, 26, 2, 0, 0, 27, 2, 0, 0, 28, 2, 0, 0, 29, 2, 0, 0, 30, 2,
- 0, 0, 31, 2, 34, 0, 7, 0, 7, 0, 32, 2, 7, 0, 24, 2, 7, 0, 25, 2, 2, 0, 28, 2, 2, 0, 31, 2, 7, 0,248, 0,
- 7, 0, 37, 0, 72, 0, 21, 0, 72, 0, 0, 0, 72, 0, 1, 0, 2, 0, 17, 0, 2, 0, 33, 2, 2, 0, 31, 2, 2, 0, 19, 0,
- 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 38, 2, 2, 0, 39, 2, 2, 0, 40, 2, 2, 0, 41, 2,
- 7, 0, 42, 2, 7, 0, 43, 2, 34, 0, 48, 0, 35, 0, 49, 0, 2, 0, 44, 2, 2, 0, 45, 2, 4, 0, 46, 2, 73, 0, 5, 0,
- 2, 0, 47, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0, 37, 0, 2, 0, 69, 0, 74, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
- 7, 0, 8, 0, 7, 0, 48, 2, 75, 0, 2, 0, 12, 0, 49, 2, 76, 0, 50, 2, 77, 0, 68, 0, 27, 0, 31, 0, 39, 0, 74, 0,
- 70, 0,251, 1, 12, 0, 51, 2, 12, 0, 14, 2, 75, 0, 52, 2, 32, 0, 53, 2, 32, 0, 54, 2, 32, 0, 55, 2, 36, 0, 79, 0,
- 78, 0, 56, 2, 38, 0, 57, 2, 65, 0, 16, 2, 12, 0, 58, 2, 7, 0, 64, 1, 7, 0,169, 0, 7, 0, 65, 1, 2, 0,171, 0,
- 2, 0, 89, 0, 2, 0, 59, 2, 2, 0, 60, 2, 2, 0, 61, 2, 7, 0, 62, 2, 7, 0, 63, 2, 2, 0, 64, 2, 2, 0, 18, 2,
- 2, 0, 19, 0, 2, 0, 65, 2, 7, 0, 66, 2, 7, 0, 67, 2, 7, 0, 68, 2, 2, 0, 36, 2, 2, 0, 37, 2, 2, 0, 69, 2,
- 2, 0, 70, 2, 4, 0, 71, 2, 9, 0, 72, 2, 2, 0, 23, 0, 2, 0, 95, 0, 2, 0, 66, 0, 2, 0, 73, 2, 7, 0, 74, 2,
- 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2, 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2,
- 7, 0, 83, 2, 0, 0, 84, 2, 79, 0, 85, 2, 80, 0, 86, 2, 0, 0, 87, 2, 67, 0, 88, 2, 67, 0, 89, 2, 67, 0, 90, 2,
- 67, 0, 91, 2, 4, 0, 92, 2, 7, 0, 93, 2, 4, 0, 94, 2, 4, 0, 95, 2, 74, 0, 96, 2, 4, 0, 97, 2, 4, 0, 98, 2,
- 73, 0, 99, 2, 73, 0,100, 2, 81, 0, 41, 0, 27, 0, 31, 0, 39, 0, 74, 0, 70, 0,251, 1, 12, 0,101, 2, 36, 0, 79, 0,
- 38, 0, 57, 2, 65, 0, 16, 2, 82, 0,102, 2, 83, 0,103, 2, 84, 0,104, 2, 85, 0,105, 2, 86, 0,106, 2, 87, 0,107, 2,
- 88, 0,108, 2, 89, 0,109, 2, 81, 0,110, 2, 90, 0,111, 2, 91, 0,112, 2, 92, 0,113, 2, 92, 0,114, 2, 92, 0,115, 2,
- 4, 0, 53, 0, 4, 0,116, 2, 4, 0,117, 2, 4, 0,118, 2, 4, 0,119, 2, 2, 0,171, 0, 2, 0,120, 2, 7, 0, 64, 1,
- 7, 0,169, 0, 7, 0, 65, 1, 7, 0,121, 2, 4, 0, 59, 2, 2, 0,122, 2, 2, 0, 19, 0, 2, 0,123, 2, 2, 0,124, 2,
- 2, 0, 18, 2, 2, 0,125, 2, 93, 0,126, 2, 94, 0,127, 2, 84, 0, 8, 0, 9, 0,128, 2, 7, 0,129, 2, 4, 0,130, 2,
- 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 82, 0, 7, 0, 4, 0,134, 2, 4, 0,135, 2,
- 4, 0,136, 2, 4, 0,137, 2, 2, 0, 33, 2, 0, 0,138, 2, 0, 0, 19, 0, 86, 0, 5, 0, 4, 0,134, 2, 4, 0,135, 2,
- 0, 0,139, 2, 0, 0,140, 2, 2, 0, 19, 0, 95, 0, 2, 0, 4, 0,141, 2, 7, 0, 25, 2, 87, 0, 3, 0, 95, 0,142, 2,
- 4, 0,143, 2, 4, 0, 19, 0, 85, 0, 6, 0, 7, 0,144, 2, 2, 0,145, 2, 2, 0, 33, 2, 0, 0, 19, 0, 0, 0,140, 2,
- 0, 0, 61, 2, 88, 0, 4, 0, 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 96, 0, 6, 0, 47, 0,128, 2,
- 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1, 2, 0,132, 2, 2, 0,133, 2, 97, 0, 1, 0, 7, 0,146, 2, 98, 0, 5, 0,
- 0, 0,233, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0,181, 0, 4, 0, 37, 0, 89, 0, 1, 0, 7, 0,147, 2, 90, 0, 2, 0,
- 4, 0,148, 2, 4, 0, 17, 0, 83, 0, 7, 0, 7, 0,129, 2, 47, 0,128, 2, 0, 0, 19, 0, 0, 0,131, 2, 2, 0, 69, 1,
- 2, 0,132, 2, 2, 0,133, 2, 99, 0, 1, 0, 7, 0,149, 2,100, 0, 1, 0, 4, 0,150, 2,101, 0, 1, 0, 0, 0,151, 2,
-102, 0, 1, 0, 7, 0,129, 2,103, 0, 3, 0, 4, 0,152, 2, 0, 0, 92, 0, 7, 0,153, 2,104, 0, 4, 0, 7, 0,233, 0,
- 7, 0,179, 0, 7, 0,180, 0, 7, 0,181, 0,105, 0, 1, 0,104, 0,130, 2,106, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2,
- 0, 0, 19, 0, 0, 0, 33, 2, 0, 0, 61, 2,107, 0, 2, 0, 4, 0,156, 2, 4, 0,155, 2,108, 0, 10, 0,108, 0, 0, 0,
-108, 0, 1, 0,106, 0,157, 2,105, 0,158, 2,107, 0,159, 2, 4, 0, 53, 0, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 37, 0,
- 85, 0,160, 2, 93, 0, 14, 0, 12, 0,161, 2, 85, 0,160, 2, 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2,
- 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 19, 0, 92, 0,113, 2, 92, 0,115, 2, 2, 0,169, 2, 0, 0,170, 2,
- 94, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 82, 0,173, 2, 86, 0,174, 2, 4, 0,117, 2, 4, 0,116, 2, 4, 0, 53, 0,
- 4, 0, 37, 0,109, 0, 9, 0,109, 0, 0, 0,109, 0, 1, 0, 4, 0, 17, 0, 4, 0, 69, 1, 4, 0,175, 2, 4, 0, 37, 0,
- 0, 0, 20, 0, 46, 0,129, 0, 0, 0,176, 2,110, 0, 7, 0,109, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2,
- 2, 0, 90, 0, 9, 0,180, 2, 9, 0,181, 2,111, 0, 3, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0,112, 0, 5, 0,
-109, 0,177, 2, 32, 0,161, 0, 0, 0, 20, 0, 2, 0,182, 2, 0, 0,183, 2,113, 0, 5, 0,109, 0,177, 2, 7, 0, 87, 0,
- 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,114, 0, 5, 0,109, 0,177, 2, 32, 0,187, 2, 0, 0, 71, 0, 4, 0, 69, 1,
- 4, 0, 19, 0,115, 0, 13, 0,109, 0,177, 2, 32, 0,188, 2, 32, 0,189, 2, 32, 0,190, 2, 32, 0,191, 2, 7, 0,192, 2,
- 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2, 4, 0,196, 2, 4, 0, 90, 0, 4, 0,197, 2,116, 0, 5, 0,
-109, 0,177, 2, 2, 0,198, 2, 2, 0, 19, 0, 7, 0,199, 2, 32, 0,200, 2,117, 0, 3, 0,109, 0,177, 2, 7, 0,201, 2,
- 4, 0, 90, 0,118, 0, 10, 0,109, 0,177, 2, 7, 0,202, 2, 4, 0,203, 2, 4, 0, 37, 0, 2, 0, 90, 0, 2, 0,204, 2,
- 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,119, 0, 3, 0,109, 0,177, 2, 7, 0, 37, 0, 4, 0, 17, 0,
-120, 0, 6, 0,109, 0,177, 2,121, 0,209, 2,122, 0,210, 2,123, 0,211, 2, 7, 0,212, 2, 4, 0, 17, 0,124, 0, 11, 0,
-109, 0,177, 2, 52, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2, 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 32, 0,218, 2,
- 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,125, 0, 12, 0,109, 0,177, 2, 32, 0,221, 2, 47, 0,222, 2, 4, 0, 90, 0,
- 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2, 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 37, 0,
-126, 0, 3, 0,109, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,127, 0, 5, 0,109, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2,
- 2, 0, 19, 0, 2, 0,231, 2,128, 0, 8, 0,109, 0,177, 2, 32, 0,161, 0, 7, 0,230, 2, 7, 0,248, 0, 7, 0,106, 0,
- 0, 0,208, 2, 2, 0, 19, 0, 2, 0, 17, 0,129, 0, 21, 0,109, 0,177, 2, 32, 0,232, 2, 0, 0,208, 2, 52, 0,213, 2,
- 32, 0,218, 2, 2, 0, 19, 0, 2, 0, 37, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
- 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2, 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2,
- 7, 0, 89, 0,130, 0, 7, 0,109, 0,177, 2, 2, 0,242, 2, 2, 0,243, 2, 4, 0, 69, 0, 32, 0,161, 0, 7, 0,244, 2,
- 0, 0,208, 2,131, 0, 10, 0,109, 0,177, 2, 32, 0,161, 0, 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2,
- 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 20, 0,132, 0, 1, 0,109, 0,177, 2,133, 0, 7, 0,109, 0,177, 2,
- 46, 0,129, 0,134, 0,251, 2,135, 0,252, 2,136, 0,253, 2,137, 0,254, 2, 12, 0,255, 2,138, 0, 13, 0,109, 0,177, 2,
- 85, 0, 0, 3, 85, 0, 1, 3, 85, 0, 2, 3, 85, 0, 3, 3, 85, 0, 4, 3, 85, 0, 5, 3, 82, 0, 6, 3, 4, 0, 7, 3,
- 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 37, 0,139, 0, 9, 3,140, 0, 7, 0,109, 0,177, 2, 85, 0, 0, 3, 85, 0, 10, 3,
-141, 0, 11, 3,142, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,143, 0, 4, 0,109, 0,177, 2, 32, 0,161, 0, 4, 0, 13, 3,
- 4, 0, 37, 0,144, 0, 2, 0, 4, 0, 14, 3, 7, 0, 25, 2,145, 0, 2, 0, 4, 0,120, 0, 4, 0, 15, 3,146, 0, 24, 0,
-109, 0,177, 2, 32, 0,161, 0, 0, 0,208, 2, 2, 0, 16, 3, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0, 37, 0,144, 0, 17, 3,
- 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 53, 0, 4, 0, 20, 3,145, 0, 21, 3,144, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3,
- 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3, 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,
-147, 0, 8, 0,109, 0,177, 2,148, 0, 32, 3,141, 0, 11, 3, 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 19, 0,
- 2, 0, 56, 0,149, 0, 8, 0,109, 0,177, 2, 32, 0, 44, 0, 2, 0,252, 0, 2, 0, 19, 0, 2, 0,198, 2, 2, 0, 56, 0,
- 7, 0, 36, 3, 7, 0, 37, 3,150, 0, 5, 0,109, 0,177, 2, 4, 0, 38, 3, 2, 0, 19, 0, 2, 0, 39, 3, 7, 0, 40, 3,
-151, 0, 8, 0,109, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3, 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 90, 0,
- 0, 0, 61, 2,152, 0, 3, 0,109, 0,177, 2,153, 0, 45, 3,137, 0,254, 2,154, 0, 10, 0,109, 0,177, 2, 32, 0, 46, 3,
- 32, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3, 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,
-155, 0, 9, 0,109, 0,177, 2, 32, 0, 54, 3, 0, 0, 48, 3, 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 69, 1, 0, 0,198, 2,
- 0, 0, 57, 3, 0, 0, 37, 0,156, 0, 1, 0,109, 0,177, 2,157, 0, 8, 0,109, 0,177, 2, 0, 0,208, 2, 7, 0,120, 0,
- 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3, 4, 0, 19, 0,158, 0, 9, 0,109, 0,177, 2, 32, 0, 62, 3,
- 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3, 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 19, 0,159, 0, 28, 0,
- 27, 0, 31, 0, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 3, 2, 0, 19, 0, 2, 0, 69, 3, 2, 0, 70, 3, 2, 0, 71, 3,
- 2, 0, 69, 0, 0, 0, 72, 3, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 17, 0, 4, 0, 37, 0, 7, 0, 75, 3, 7, 0, 76, 3,
- 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 34, 0, 81, 3, 36, 0, 79, 0, 38, 0, 57, 2, 87, 0,107, 2,
- 0, 0, 71, 0, 7, 0, 82, 3, 7, 0, 83, 3,159, 0, 84, 3,160, 0, 3, 0,160, 0, 0, 0,160, 0, 1, 0, 0, 0, 20, 0,
- 70, 0, 3, 0, 7, 0, 85, 3, 4, 0, 19, 0, 4, 0, 37, 0, 32, 0,126, 0, 27, 0, 31, 0, 39, 0, 74, 0,161, 0, 86, 3,
- 2, 0, 17, 0, 2, 0, 87, 3, 4, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 0, 0, 91, 3, 32, 0, 38, 0, 32, 0, 92, 3,
- 32, 0, 93, 3, 32, 0, 94, 3, 32, 0, 95, 3, 36, 0, 79, 0, 78, 0, 56, 2, 70, 0,251, 1,162, 0, 96, 3,162, 0, 97, 3,
-163, 0, 98, 3, 9, 0, 2, 0,164, 0, 99, 3,165, 0,100, 3,166, 0,101, 3, 12, 0,102, 3, 12, 0,101, 2, 12, 0, 14, 2,
- 12, 0,103, 3, 12, 0,104, 3, 4, 0, 69, 1, 4, 0,105, 3, 65, 0, 16, 2, 0, 0,106, 3, 4, 0, 18, 2, 4, 0,107, 3,
- 7, 0, 64, 1, 7, 0,108, 3, 7, 0,109, 3, 7, 0,169, 0, 7, 0,110, 3, 7, 0, 65, 1, 7, 0,111, 3, 7, 0, 4, 2,
- 7, 0,112, 3, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,246, 2, 7, 0,118, 3,
- 7, 0,237, 0, 4, 0,119, 3, 2, 0, 19, 0, 2, 0,120, 3, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3,
- 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 4, 0,131, 3, 4, 0,132, 3,
- 4, 0,133, 3, 4, 0,134, 3, 7, 0,135, 3, 7, 0, 93, 2, 7, 0,136, 3, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
- 7, 0,140, 3, 7, 0,212, 0, 7, 0,141, 3, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 2, 0,145, 3, 0, 0,146, 3,
- 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 7, 0,150, 3, 7, 0,151, 3, 12, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
- 12, 0,155, 3, 7, 0,156, 3, 2, 0,148, 2, 2, 0,157, 3, 7, 0,130, 2, 4, 0,158, 3, 4, 0,159, 3,167, 0,160, 3,
- 2, 0,161, 3, 2, 0,244, 0, 7, 0,162, 3, 12, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3,168, 0, 61, 1,
-169, 0,167, 3, 66, 0,168, 3, 2, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0,172, 3, 7, 0,122, 2, 2, 0,173, 3,
- 2, 0,174, 3,153, 0,175, 3,141, 0,176, 3,141, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3, 4, 0, 69, 0,
- 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,170, 0, 14, 0,170, 0, 0, 0,170, 0, 1, 0, 32, 0, 38, 0, 7, 0,246, 2,
- 7, 0, 66, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 20, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3, 2, 0, 17, 0,
- 2, 0,185, 3, 7, 0,250, 2,171, 0, 12, 0,171, 0, 0, 0,171, 0, 1, 0, 32, 0, 44, 0, 4, 0,186, 3, 4, 0,148, 2,
- 4, 0,187, 3, 4, 0, 17, 0, 4, 0,188, 3, 7, 0, 66, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,168, 0, 40, 0,
- 4, 0, 19, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3, 2, 0,196, 3,
- 2, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3, 7, 0,204, 3,
- 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3, 7, 0,212, 3,
- 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3, 7, 0,220, 3,
- 7, 0,221, 3, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 52, 0,162, 0,172, 0,225, 3, 7, 0,226, 3, 4, 0,186, 2,
-173, 0, 5, 0, 66, 0,229, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 19, 0, 2, 0,229, 3,174, 0, 9, 0,174, 0, 0, 0,
-174, 0, 1, 0, 4, 0,230, 3, 4, 0,231, 3, 4, 0,232, 3, 4, 0, 19, 0, 4, 0,233, 3, 9, 0,234, 3, 9, 0,235, 3,
-137, 0, 19, 0,137, 0, 0, 0,137, 0, 1, 0, 4, 0, 19, 0, 4, 0,236, 3, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3,
- 4, 0,240, 3, 4, 0,241, 3, 4, 0,231, 3, 4, 0,148, 2, 4, 0, 56, 0, 0, 0,242, 3, 0, 0,243, 3, 0, 0,244, 3,
- 0, 0,245, 3, 12, 0,246, 3,175, 0,247, 3, 9, 0,248, 3,176, 0, 1, 0, 7, 0, 32, 2,167, 0, 30, 0, 4, 0, 19, 0,
- 7, 0,249, 3, 7, 0,250, 3, 7, 0,251, 3, 4, 0,252, 3, 4, 0,253, 3, 4, 0,254, 3, 4, 0,255, 3, 7, 0, 0, 4,
- 7, 0, 1, 4, 7, 0, 2, 4, 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4,
- 7, 0, 9, 4, 7, 0, 10, 4, 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4,
- 7, 0, 17, 4, 4, 0, 18, 4, 4, 0, 19, 4, 7, 0, 20, 4, 7, 0,141, 3,169, 0, 54, 0, 4, 0,231, 3, 4, 0, 21, 4,
-177, 0, 22, 4,178, 0, 23, 4, 0, 0, 37, 0, 0, 0, 24, 4, 2, 0, 25, 4, 7, 0, 26, 4, 0, 0, 27, 4, 7, 0, 28, 4,
- 7, 0, 29, 4, 7, 0, 30, 4, 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4,
- 2, 0, 37, 4, 0, 0, 38, 4, 2, 0, 39, 4, 7, 0, 40, 4, 7, 0, 41, 4, 0, 0, 42, 4, 4, 0,121, 0, 4, 0, 43, 4,
- 4, 0, 44, 4, 2, 0, 45, 4, 2, 0, 46, 4,176, 0, 47, 4, 4, 0, 48, 4, 4, 0, 81, 0, 7, 0, 49, 4, 7, 0, 50, 4,
- 7, 0, 51, 4, 7, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 2, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4,
- 2, 0, 59, 4, 2, 0, 60, 4,179, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4,137, 0, 64, 4, 12, 0,255, 2,173, 0, 65, 4,
- 7, 0, 66, 4, 7, 0, 67, 4, 7, 0, 68, 4, 0, 0, 69, 4,153, 0, 51, 0,152, 0, 70, 4, 2, 0, 17, 0, 2, 0, 71, 4,
- 2, 0, 72, 4, 2, 0, 73, 4, 7, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4, 2, 0, 79, 4,
- 7, 0, 80, 4, 7, 0, 81, 4, 7, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 4, 0, 85, 4, 4, 0, 86, 4, 7, 0, 87, 4,
- 4, 0, 88, 4, 7, 0, 89, 4, 7, 0, 90, 4, 7, 0, 91, 4, 81, 0, 92, 4, 81, 0, 93, 4, 81, 0, 94, 4, 0, 0, 95, 4,
- 7, 0, 96, 4, 7, 0, 97, 4, 36, 0, 79, 0, 2, 0, 98, 4, 0, 0, 99, 4, 0, 0,100, 4, 7, 0,101, 4, 4, 0,102, 4,
- 7, 0,103, 4, 7, 0,104, 4, 4, 0,105, 4, 4, 0, 19, 0, 7, 0,106, 4, 7, 0,107, 4, 7, 0,108, 4, 85, 0,109, 4,
- 7, 0,110, 4, 7, 0,111, 4, 7, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 4, 0,117, 4,
-180, 0, 76, 0, 27, 0, 31, 0, 39, 0, 74, 0, 2, 0,172, 0, 2, 0, 70, 1, 2, 0,104, 1, 2, 0,118, 4, 7, 0,119, 4,
- 7, 0,120, 4, 7, 0,121, 4, 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,150, 1, 7, 0,152, 1, 7, 0,151, 1,
- 7, 0, 69, 0, 4, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 7, 0,131, 4,
- 7, 0,132, 4, 2, 0,133, 4, 2, 0, 69, 1, 2, 0,134, 4, 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4,
- 2, 0,139, 4, 7, 0,140, 4, 7, 0,141, 4, 7, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4,
- 7, 0,147, 4, 7, 0,148, 4, 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 2, 0,152, 4, 2, 0,153, 4, 2, 0,154, 4,
- 2, 0,155, 4, 7, 0,156, 4, 7, 0,157, 4, 7, 0,158, 4, 7, 0,159, 4, 2, 0,160, 4, 2, 0,161, 4, 2, 0,162, 4,
- 2, 0,163, 4, 7, 0,164, 4, 7, 0,165, 4, 7, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 7, 0,170, 4,
- 2, 0,171, 4, 2, 0,172, 4, 2, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0, 19, 0, 7, 0,176, 4, 7, 0,177, 4,
- 36, 0, 79, 0, 51, 0,122, 1, 2, 0,123, 1, 2, 0,178, 4, 30, 0,148, 0,181, 0, 8, 0,181, 0, 0, 0,181, 0, 1, 0,
- 4, 0,119, 3, 4, 0,179, 4, 4, 0, 19, 0, 2, 0,180, 4, 2, 0,181, 4, 32, 0,161, 0,182, 0, 13, 0, 9, 0,182, 4,
- 9, 0,183, 4, 4, 0,184, 4, 4, 0,185, 4, 4, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, 4, 0,190, 4,
- 4, 0,191, 4, 4, 0,192, 4, 4, 0, 37, 0, 0, 0,193, 4,183, 0, 5, 0, 9, 0,194, 4, 9, 0,195, 4, 4, 0,196, 4,
- 4, 0, 69, 0, 0, 0,197, 4,184, 0, 17, 0, 4, 0,198, 4, 4, 0,199, 4, 4, 0,200, 4, 4, 0,201, 4, 4, 0,202, 4,
- 4, 0,203, 4, 4, 0,204, 4, 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, 2, 0,210, 4,
- 2, 0,211, 4, 4, 0,212, 4, 4, 0,213, 4, 4, 0, 89, 0,185, 0, 15, 0, 4, 0, 17, 0, 4, 0,200, 4, 4, 0,214, 4,
- 4, 0,215, 4, 4, 0,216, 4, 4, 0,217, 4, 7, 0,218, 4, 4, 0,219, 4, 4, 0, 90, 0, 4, 0,220, 4, 4, 0,221, 4,
- 4, 0,222, 4, 4, 0,223, 4, 4, 0,224, 4, 26, 0, 30, 0,186, 0, 7, 0, 4, 0,225, 4, 7, 0,226, 4, 7, 0,227, 4,
- 7, 0,228, 4, 4, 0,229, 4, 2, 0, 19, 0, 2, 0, 37, 0,187, 0, 11, 0,187, 0, 0, 0,187, 0, 1, 0, 0, 0, 20, 0,
- 65, 0,230, 4, 66, 0,231, 4, 4, 0,119, 3, 4, 0,232, 4, 4, 0,233, 4, 4, 0, 37, 0, 4, 0,234, 4, 4, 0,235, 4,
-188, 0,111, 0,182, 0,236, 4,183, 0,237, 4,184, 0,238, 4,185, 0,239, 4, 4, 0, 12, 3, 4, 0,121, 0, 4, 0, 43, 4,
- 7, 0,240, 4, 4, 0,241, 4, 4, 0,242, 4, 4, 0,243, 4, 4, 0,244, 4, 2, 0, 19, 0, 2, 0,245, 4, 7, 0,246, 4,
- 7, 0,247, 4, 7, 0,248, 4, 7, 0,249, 4, 7, 0,250, 4, 2, 0,251, 4, 2, 0,252, 4, 2, 0,253, 4, 2, 0,254, 4,
- 2, 0,243, 0, 2, 0,255, 4, 2, 0, 0, 5, 2, 0, 1, 5, 2, 0, 2, 5, 2, 0, 3, 5, 2, 0, 91, 1, 2, 0,106, 0,
- 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5,
- 2, 0, 12, 5, 2, 0, 92, 1, 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0, 16, 5, 4, 0, 17, 5, 4, 0, 69, 1,
- 4, 0, 18, 5, 2, 0, 19, 5, 2, 0, 20, 5, 2, 0, 21, 5, 2, 0,248, 1, 2, 0, 22, 5, 2, 0, 23, 5, 2, 0, 24, 5,
- 2, 0, 25, 5, 24, 0, 26, 5, 24, 0, 27, 5, 23, 0, 28, 5, 12, 0, 29, 5, 2, 0, 30, 5, 2, 0, 31, 5, 7, 0, 32, 5,
- 7, 0, 33, 5, 7, 0, 34, 5, 7, 0, 35, 5, 4, 0, 36, 5, 7, 0, 37, 5, 7, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5,
- 2, 0, 41, 5, 2, 0, 42, 5, 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 7, 0, 47, 5, 7, 0, 48, 5,
- 7, 0, 49, 5, 0, 0, 50, 5, 0, 0, 51, 5, 4, 0, 52, 5, 2, 0, 53, 5, 2, 0,226, 1, 0, 0, 54, 5, 7, 0, 55, 5,
- 7, 0, 56, 5, 0, 0, 57, 5, 0, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 4, 0, 61, 5, 2, 0, 62, 5, 2, 0, 63, 5,
- 7, 0, 64, 5, 7, 0, 65, 5, 2, 0, 66, 5, 2, 0, 67, 5, 7, 0, 68, 5, 2, 0, 69, 5, 2, 0, 70, 5, 4, 0, 71, 5,
- 2, 0, 72, 5, 2, 0, 73, 5, 2, 0, 74, 5, 2, 0, 75, 5, 7, 0, 76, 5, 7, 0, 69, 0, 42, 0, 77, 5, 0, 0, 78, 5,
-189, 0, 9, 0,189, 0, 0, 0,189, 0, 1, 0, 0, 0, 20, 0, 2, 0, 79, 5, 2, 0, 80, 5, 2, 0, 81, 5, 2, 0, 89, 0,
- 7, 0, 82, 5, 7, 0, 69, 0,190, 0, 7, 0, 2, 0,203, 2, 2, 0, 69, 1, 2, 0, 67, 3, 2, 0, 83, 5, 7, 0, 84, 5,
- 7, 0, 69, 0, 42, 0, 85, 5,191, 0, 5, 0, 7, 0, 86, 5, 0, 0, 17, 0, 0, 0, 89, 0, 0, 0, 69, 0, 0, 0,226, 1,
-192, 0, 28, 0, 7, 0,131, 4, 7, 0,132, 4, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0, 87, 5, 2, 0,178, 4, 2, 0,134, 4,
- 2, 0,135, 4, 2, 0,136, 4, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4,191, 0, 88, 5, 2, 0,251, 4, 2, 0,252, 4,
- 2, 0,253, 4, 2, 0,254, 4, 2, 0,243, 0, 2, 0,255, 4, 2, 0, 89, 5, 2, 0, 0, 5,190, 0, 90, 5, 2, 0, 91, 5,
- 2, 0, 2, 5, 2, 0, 5, 5, 2, 0, 6, 5, 7, 0, 92, 5, 7, 0, 89, 0,193, 0, 6, 0,193, 0, 0, 0,193, 0, 1, 0,
- 4, 0,230, 3, 0, 0,242, 3, 4, 0, 19, 0, 32, 0, 93, 5,194, 0, 4, 0,195, 0, 94, 5, 9, 0, 95, 5, 0, 0, 96, 5,
- 4, 0, 90, 0,196, 0, 8, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 98, 5, 2, 0, 99, 5, 2, 0,100, 5,
- 4, 0, 89, 0, 9, 0,101, 5,197, 0, 6, 0, 2, 0,106, 0, 2, 0,236, 3, 2, 0,102, 5, 2, 0,197, 2, 4, 0, 19, 0,
- 7, 0,214, 2,198, 0, 14, 0, 2, 0, 19, 0, 2, 0,103, 5, 2, 0,104, 5, 2, 0,105, 5,197, 0,106, 5, 9, 0,101, 5,
- 7, 0,107, 5, 7, 0, 56, 0, 4, 0,108, 5, 4, 0,109, 5, 4, 0,110, 5, 4, 0,111, 5, 46, 0,129, 0, 32, 0,161, 0,
-199, 0, 4, 0,199, 0, 0, 0,199, 0, 1, 0, 0, 0,112, 5, 7, 0,113, 5,200, 0, 14, 0,194, 0, 97, 5, 4, 0, 90, 0,
- 4, 0,114, 5, 7, 0,115, 5, 7, 0,116, 5, 7, 0,117, 5, 4, 0,118, 5, 4, 0,119, 5, 7, 0,120, 5, 7, 0,121, 5,
- 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5, 4, 0, 37, 0,201, 0, 7, 0,194, 0, 97, 5, 2, 0, 19, 0, 2, 0, 37, 0,
- 4, 0, 36, 0, 4, 0,125, 5, 87, 0,126, 5, 9, 0,101, 5,202, 0, 80, 0,201, 0,127, 5,201, 0,128, 5,200, 0, 86, 3,
- 7, 0,129, 5, 2, 0,130, 5, 2, 0,131, 5, 7, 0,132, 5, 7, 0,133, 5, 2, 0,236, 3, 2, 0,134, 5, 7, 0,135, 5,
- 7, 0,136, 5, 7, 0,137, 5, 2, 0,138, 5, 2, 0,108, 5, 2, 0,139, 5, 2, 0,140, 5, 2, 0,141, 5, 2, 0,142, 5,
- 7, 0,143, 5, 7, 0,144, 5, 7, 0,145, 5, 2, 0,146, 5, 2, 0,147, 5, 2, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5,
- 2, 0,151, 5, 2, 0,152, 5,196, 0,153, 5,198, 0,154, 5, 7, 0,155, 5, 7, 0,156, 5, 7, 0,157, 5, 2, 0,158, 5,
- 2, 0,159, 5, 0, 0,160, 5, 0, 0,161, 5, 0, 0,162, 5, 0, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 2, 0,166, 5,
- 7, 0,167, 5, 7, 0,168, 5, 7, 0,169, 5, 7, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5,
- 7, 0,175, 5, 7, 0,176, 5, 2, 0,177, 5, 0, 0,178, 5, 0, 0,179, 5, 0, 0,180, 5, 0, 0,181, 5, 32, 0,182, 5,
- 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5, 0, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5,
- 2, 0,191, 5, 2, 0,192, 5, 2, 0,193, 5, 2, 0,194, 5, 2, 0,195, 5, 0, 0,196, 5, 0, 0,178, 4, 4, 0,197, 5,
- 2, 0,198, 5, 2, 0, 89, 0, 4, 0,199, 5, 7, 0,200, 5, 7, 0,201, 5,203, 0, 8, 0, 4, 0,202, 5, 4, 0,203, 5,
- 4, 0,204, 5, 4, 0,205, 5, 4, 0,206, 5, 4, 0,207, 5, 4, 0, 53, 0, 4, 0,117, 2,204, 0, 3, 0, 7, 0,208, 5,
- 2, 0,209, 5, 2, 0, 19, 0,205, 0, 4, 0, 7, 0,210, 5, 4, 0, 19, 0, 4, 0,211, 5, 4, 0, 56, 0, 46, 0, 42, 0,
- 27, 0, 31, 0, 39, 0, 74, 0, 32, 0, 93, 5,180, 0,212, 5, 46, 0,213, 5, 47, 0,235, 0, 12, 0,214, 5,181, 0,215, 5,
- 32, 0,216, 5, 7, 0,217, 5, 7, 0,218, 5, 7, 0,219, 5, 7, 0,220, 5, 4, 0,119, 3, 4, 0,221, 5, 4, 0, 89, 0,
- 2, 0, 19, 0, 2, 0, 63, 1, 60, 0, 58, 1,206, 0,222, 5,202, 0,223, 5,207, 0,224, 5,188, 0,179, 0,186, 0,225, 5,
- 12, 0,100, 0, 12, 0,226, 5, 9, 0,227, 5, 9, 0,228, 5, 9, 0,229, 5,208, 0,230, 5, 2, 0,231, 5, 2, 0,232, 5,
- 2, 0,244, 0, 2, 0,233, 5, 4, 0,234, 5, 4, 0,235, 5, 12, 0,236, 5,191, 0, 88, 5,192, 0,237, 5,204, 0,238, 5,
-164, 0, 99, 3,205, 0,239, 5,209, 0, 11, 0,209, 0, 0, 0,209, 0, 1, 0, 47, 0,235, 0, 45, 0, 57, 1, 7, 0, 81, 2,
- 7, 0, 82, 2, 7, 0,106, 0, 7, 0,240, 5, 2, 0,241, 5, 2, 0, 19, 0, 7, 0, 69, 0,210, 0, 39, 0, 7, 0,242, 5,
- 7, 0,243, 5, 7, 0,244, 5, 7, 0,245, 5, 7, 0,246, 5, 7, 0,247, 5, 7, 0,248, 5, 7, 0,249, 5, 7, 0,250, 5,
- 7, 0, 76, 1, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,168, 0, 2, 0,255, 5, 2, 0, 0, 6,
- 2, 0, 1, 6, 2, 0, 37, 0, 2, 0, 2, 6, 2, 0, 3, 6, 2, 0, 4, 6, 2, 0,241, 5, 7, 0, 5, 6, 7, 0, 6, 6,
- 70, 0, 7, 6,164, 0, 99, 3,210, 0, 8, 6,211, 0, 9, 6,212, 0, 10, 6,213, 0, 11, 6,214, 0, 12, 6,215, 0, 13, 6,
- 7, 0, 14, 6, 2, 0, 15, 6, 2, 0, 16, 6, 7, 0, 17, 6, 7, 0, 18, 6, 7, 0, 19, 6,216, 0, 55, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 7, 0,250, 5, 7, 0, 76, 1, 7, 0, 89, 0,
- 4, 0, 24, 6, 2, 0, 4, 6, 2, 0,241, 5, 32, 0, 93, 5, 32, 0, 25, 6, 12, 0, 26, 6,209, 0, 27, 6,216, 0, 8, 6,
- 0, 0, 28, 6, 4, 0,119, 3, 4, 0,221, 5, 2, 0, 29, 6, 2, 0, 69, 0, 2, 0, 30, 6, 2, 0, 31, 6, 2, 0,226, 1,
- 2, 0, 19, 0, 2, 0, 17, 2, 2, 0, 32, 6, 7, 0,111, 0, 7, 0, 33, 6, 7, 0, 17, 6, 7, 0, 19, 6, 7, 0, 34, 6,
- 7, 0, 35, 6, 7, 0,168, 0, 7, 0,217, 5, 2, 0, 36, 6, 2, 0,248, 1, 2, 0, 37, 6, 2, 0, 38, 6, 2, 0, 39, 6,
- 2, 0, 40, 6, 2, 0, 41, 6, 2, 0, 42, 6, 2, 0, 43, 6, 2, 0, 1, 6, 4, 0, 44, 6, 12, 0, 45, 6, 2, 0, 46, 6,
- 2, 0,131, 2, 2, 0, 47, 6, 0, 0, 48, 6, 0, 0, 49, 6, 9, 0, 50, 6,164, 0, 99, 3,218, 0, 24, 0, 24, 0, 36, 0,
- 24, 0, 63, 0, 23, 0, 51, 6, 23, 0, 52, 6, 23, 0, 53, 6, 7, 0, 54, 6, 7, 0, 55, 6, 7, 0, 56, 6, 7, 0, 57, 6,
- 2, 0, 58, 6, 2, 0, 59, 6, 2, 0, 60, 6, 2, 0, 61, 6, 2, 0, 62, 6, 2, 0, 19, 0, 2, 0, 63, 6, 2, 0, 64, 6,
- 2, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 31, 6, 7, 0, 68, 6, 4, 0, 69, 6, 4, 0, 70, 6,217, 0, 6, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,219, 0, 8, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,220, 0, 71, 6, 46, 0,129, 0,221, 0, 14, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,222, 0, 73, 6,
- 12, 0, 74, 6, 2, 0, 69, 1, 2, 0, 75, 6, 4, 0, 19, 0, 7, 0, 76, 6, 4, 0, 31, 6,223, 0, 20, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,211, 0, 9, 6,218, 0, 72, 6, 2, 0, 77, 6,
- 2, 0, 78, 6, 2, 0, 79, 6, 2, 0, 80, 6, 2, 0, 63, 6, 2, 0, 81, 6, 0, 0, 19, 0, 0, 0,178, 4, 9, 0, 56, 2,
- 4, 0, 82, 6, 4, 0, 83, 6, 27, 0, 84, 6,224, 0, 18, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
- 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 7, 0, 81, 2, 7, 0, 82, 2, 2, 0, 77, 6, 2, 0, 85, 6, 2, 0, 86, 6,
- 2, 0, 87, 6, 4, 0, 19, 0, 7, 0, 88, 6, 4, 0,241, 5, 4, 0, 37, 0,164, 0, 99, 3,225, 0, 15, 0, 0, 0, 89, 6,
- 0, 0, 90, 6, 0, 0, 91, 6, 0, 0, 92, 6, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 93, 6, 2, 0, 94, 6, 2, 0,169, 1,
- 2, 0, 95, 6, 4, 0, 96, 6, 4, 0, 97, 6, 2, 0, 98, 6, 2, 0, 37, 0, 0, 0, 99, 6,226, 0, 16, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0,100, 6,225, 0,101, 6,227, 0,102, 6, 12, 0,103, 6, 12, 0,104, 6,
-228, 0,105, 6,215, 0,106, 6,229, 0,107, 6, 2, 0,108, 6, 2, 0,109, 6, 2, 0,110, 6, 2, 0, 69, 0,230, 0, 17, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 12, 0,111, 6,
-231, 0,112, 6, 0, 0,113, 6,232, 0,114, 6, 4, 0,115, 6, 4, 0,116, 6, 2, 0, 19, 0, 2, 0,117, 6, 2, 0,118, 6,
- 2, 0, 37, 0,233, 0, 32, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
- 47, 0,222, 2, 45, 0, 57, 1, 63, 0,119, 6, 2, 0,128, 0, 2, 0,120, 6, 2, 0, 69, 0, 2, 0,121, 6, 4, 0, 19, 0,
- 2, 0,122, 6, 2, 0,123, 6, 2, 0,124, 6, 2, 0,226, 1, 0, 0,125, 6, 0, 0,126, 6, 0, 0,127, 6, 0, 0, 31, 6,
- 7, 0,128, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0,248, 1, 7, 0,129, 6, 7, 0,130, 6,164, 0, 99, 3,
-234, 0,131, 6,235, 0,132, 6,236, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
- 2, 0, 23, 6, 2, 0, 75, 6, 2, 0, 19, 0, 4, 0, 37, 0,222, 0, 73, 6,218, 0, 72, 6,237, 0, 27, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 42, 0,133, 6, 4, 0,134, 6, 4, 0,135, 6,
- 2, 0, 90, 0, 2, 0,128, 0, 2, 0,136, 6, 0, 0,137, 6, 0, 0,138, 6, 4, 0,139, 6, 4, 0,140, 6, 4, 0,141, 6,
- 4, 0,142, 6, 2, 0,143, 6, 2, 0,144, 6, 7, 0,145, 6, 23, 0,146, 6, 23, 0,147, 6, 4, 0,148, 6, 4, 0,149, 6,
- 0, 0,150, 6, 0, 0,151, 6,238, 0, 10, 0, 27, 0, 31, 0, 9, 0,152, 6, 9, 0,153, 6, 9, 0,154, 6, 9, 0,155, 6,
- 9, 0,156, 6, 4, 0, 90, 0, 4, 0,157, 6, 0, 0,158, 6, 0, 0,159, 6,239, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0,
- 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,238, 0,160, 6, 2, 0, 90, 0, 2, 0,128, 0, 4, 0, 89, 0, 9, 0,161, 6,
-240, 0, 9, 0,240, 0, 0, 0,240, 0, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 7, 0,162, 6, 4, 0, 23, 0, 4, 0,238, 3,
- 4, 0,239, 3, 4, 0,124, 0,241, 0, 11, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,
-218, 0, 72, 6, 12, 0,163, 6, 4, 0,164, 6, 4, 0, 37, 0, 4, 0, 19, 0, 4, 0,165, 6,242, 0, 25, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6, 27, 0,166, 6, 27, 0, 80, 0,
- 2, 0, 19, 0, 2, 0,128, 0, 7, 0,167, 6, 9, 0,168, 6, 7, 0, 81, 2, 7, 0, 82, 2, 7, 0, 88, 6, 7, 0, 19, 6,
- 7, 0,169, 6, 7, 0,170, 6, 60, 0, 58, 1, 60, 0,171, 6, 4, 0,172, 6, 2, 0,173, 6, 2, 0, 37, 0,164, 0, 99, 3,
-243, 0, 10, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 2, 0, 19, 0,
- 2, 0,128, 3, 4, 0, 37, 0,164, 0, 99, 3,244, 0, 42, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6,
- 7, 0, 22, 6, 2, 0, 23, 6,218, 0, 72, 6,227, 0,102, 6, 0, 0, 89, 6, 0, 0, 90, 6, 0, 0, 91, 6, 2, 0, 17, 0,
- 2, 0,174, 6, 2, 0, 19, 0, 2, 0, 93, 6, 9, 0,168, 6, 4, 0, 96, 6, 4, 0,175, 6, 4, 0,176, 6, 4, 0, 97, 6,
- 23, 0,177, 6, 23, 0,178, 6, 7, 0,179, 6, 7, 0,180, 6, 7, 0,181, 6, 7, 0,167, 6, 2, 0,182, 6, 2, 0,234, 0,
- 2, 0,169, 1, 2, 0, 95, 6, 2, 0, 37, 0, 2, 0, 89, 0, 2, 0,183, 6, 2, 0,184, 6, 9, 0,185, 6, 9, 0,186, 6,
- 9, 0,187, 6, 9, 0,188, 6, 9, 0,189, 6, 2, 0,190, 6, 0, 0,191, 6, 57, 0,192, 6,245, 0, 7, 0,245, 0, 0, 0,
-245, 0, 1, 0, 4, 0,193, 6, 4, 0, 23, 0, 0, 0, 83, 0, 4, 0,194, 6, 4, 0, 17, 0,246, 0, 16, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6, 4, 0, 17, 0, 4, 0,195, 6, 4, 0, 19, 0,
- 4, 0,136, 6, 12, 0,196, 6, 12, 0,197, 6, 0, 0,198, 6, 0, 0,199, 6, 4, 0,200, 6, 4, 0,201, 6,247, 0, 6, 0,
-217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 4, 0, 37, 0, 0, 0,202, 6,248, 0, 15, 0,217, 0, 0, 0,
-217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6,249, 0,203, 6,218, 0, 72, 6,250, 0,204, 6, 2, 0, 69, 1,
- 2, 0,205, 6, 2, 0, 81, 2, 2, 0, 82, 2, 2, 0, 19, 0, 2, 0,123, 6, 4, 0, 69, 0,251, 0, 7, 0,251, 0, 0, 0,
-251, 0, 1, 0, 0, 0,206, 6, 2, 0,207, 6, 2, 0,208, 6, 2, 0,209, 6, 2, 0, 37, 0,252, 0, 12, 0, 2, 0,208, 6,
- 2, 0,210, 6, 2, 0,211, 6, 0, 0,183, 2, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 2, 0,215, 6, 2, 0,216, 6,
- 2, 0, 63, 6, 7, 0,217, 6, 7, 0,218, 6,253, 0, 18, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,242, 3,252, 0,219, 6,
-252, 0,220, 6,252, 0,221, 6,252, 0,222, 6, 7, 0,223, 6, 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6,
- 2, 0,228, 6, 2, 0,229, 6, 2, 0,230, 6, 2, 0,231, 6, 2, 0,232, 6, 2, 0,233, 6,254, 0, 10, 0, 0, 0,234, 6,
- 0, 0,235, 6, 0, 0,236, 6, 0, 0,237, 6, 0, 0,238, 6, 0, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
- 2, 0,243, 6,255, 0, 8, 0, 0, 0,244, 6, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
- 7, 0,240, 5, 7, 0, 37, 0, 0, 1, 18, 0,254, 0,250, 6,254, 0,251, 6,254, 0,252, 6,254, 0,253, 6,254, 0,254, 6,
-254, 0,255, 6,254, 0, 0, 7,254, 0, 1, 7,254, 0, 2, 7,254, 0, 3, 7,254, 0, 4, 7,254, 0, 5, 7,254, 0, 6, 7,
-254, 0, 7, 7,254, 0, 8, 7,254, 0, 9, 7,255, 0, 10, 7, 0, 0, 11, 7, 1, 1, 92, 0, 0, 0, 12, 7, 0, 0, 13, 7,
- 0, 0,238, 6, 0, 0, 14, 7, 0, 0, 15, 7, 0, 0, 16, 7, 0, 0, 17, 7, 0, 0, 18, 7, 0, 0, 19, 7, 0, 0, 20, 7,
- 0, 0, 21, 7, 0, 0, 22, 7, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7, 0, 0, 28, 7,
- 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7, 0, 0, 36, 7,
- 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7, 0, 0, 44, 7,
- 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7, 0, 0, 52, 7,
- 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7, 0, 0, 60, 7,
- 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7, 0, 0, 68, 7,
- 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7, 0, 0, 76, 7,
- 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, 0, 0, 83, 7, 0, 0, 84, 7,
- 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7, 0, 0, 90, 7, 0, 0, 91, 7, 0, 0, 92, 7,
- 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7, 0, 0,100, 7,
- 0, 0,101, 7, 0, 0,102, 7, 2, 1, 5, 0, 0, 0,103, 7, 0, 0, 36, 7, 0, 0, 38, 7, 2, 0, 19, 0, 2, 0, 37, 0,
- 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 0, 0, 20, 0, 0, 1,104, 7, 1, 1,105, 7, 1, 1,106, 7, 1, 1,107, 7,
- 1, 1,108, 7, 1, 1,109, 7, 1, 1,110, 7, 1, 1,111, 7, 1, 1,112, 7, 1, 1,113, 7, 1, 1,114, 7, 1, 1,115, 7,
- 1, 1,116, 7, 1, 1,117, 7, 1, 1,118, 7, 1, 1,119, 7, 1, 1,120, 7, 1, 1,121, 7, 1, 1,122, 7, 2, 1,123, 7,
- 4, 0,124, 7, 4, 0, 37, 0, 4, 1, 3, 0, 4, 1, 0, 0, 4, 1, 1, 0, 0, 0,125, 7, 5, 1, 5, 0, 4, 0, 19, 0,
- 4, 0, 37, 0, 7, 0,130, 2, 7, 0,126, 7, 7, 0, 32, 2, 6, 1, 86, 0, 4, 0, 19, 0, 4, 0,127, 7, 4, 0,128, 7,
- 0, 0,129, 7, 0, 0,130, 7, 0, 0,131, 7, 0, 0,132, 7, 0, 0,133, 7, 0, 0,134, 7, 0, 0,135, 7, 0, 0,136, 7,
- 0, 0,137, 7, 0, 0,138, 7, 4, 0,139, 7, 2, 0,140, 7, 2, 0,141, 7, 2, 0,142, 7, 2, 0,143, 7, 4, 0,144, 7,
- 4, 0,145, 7, 4, 0,146, 7, 4, 0,147, 7, 2, 0,148, 7, 2, 0,149, 7, 4, 0,150, 7, 4, 0,151, 7, 4, 0,152, 7,
- 4, 0,153, 7, 4, 0,154, 7, 4, 0,196, 6, 4, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 2, 0,159, 7,
- 12, 0,160, 7, 12, 0,161, 7, 12, 0,162, 7, 12, 0,163, 7, 12, 0,164, 7, 0, 0,165, 7, 2, 0,166, 7, 2, 0,167, 7,
- 2, 0,168, 7, 2, 0,169, 7, 2, 0,170, 7, 2, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, 5, 1,174, 7, 2, 0,175, 7,
- 2, 0,176, 7, 2, 0,177, 7, 2, 0,178, 7, 2, 0,179, 7, 2, 0,180, 7, 2, 0,181, 7, 2, 0, 69, 0, 4, 0,182, 7,
- 4, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7, 2, 0,189, 7, 2, 0,190, 7,
- 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 2, 0,198, 7,
- 2, 0,199, 7, 2, 0,200, 7, 2, 0,178, 4, 0, 0,201, 7, 0, 0,202, 7, 7, 0,203, 7, 2, 0,158, 5, 2, 0,159, 5,
- 55, 0,204, 7, 7, 0,205, 7, 4, 0,226, 1,220, 0, 21, 0, 27, 0, 31, 0, 12, 0,206, 7, 12, 0,207, 7, 12, 0,208, 7,
- 12, 0, 20, 6, 46, 0,129, 0, 46, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
- 2, 0,215, 7, 2, 0,216, 7, 2, 0,217, 7, 2, 0,218, 7, 2, 0,219, 7, 4, 0, 69, 0,215, 0,220, 7, 9, 0,221, 7,
- 2, 0,222, 7, 7, 1, 5, 0, 7, 1, 0, 0, 7, 1, 1, 0, 7, 1,223, 7, 13, 0,224, 7, 4, 0, 19, 0, 8, 1, 7, 0,
- 8, 1, 0, 0, 8, 1, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 2, 0, 27, 5, 2, 0, 19, 0, 4, 0, 37, 0, 9, 1, 25, 0,
- 9, 1, 0, 0, 9, 1, 1, 0, 10, 1,227, 7, 11, 1,107, 6, 0, 0,228, 7, 0, 0,229, 7, 0, 0,230, 7, 2, 0,231, 7,
- 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0, 37, 0, 2, 0, 19, 0, 2, 0,236, 7, 2, 0,237, 7,
- 2, 0,238, 7, 4, 0,239, 7, 9, 1,240, 7, 9, 0,241, 7, 4, 0,242, 7, 4, 0,243, 7, 4, 0,244, 7, 4, 0,245, 7,
- 0, 0,246, 7,249, 0, 22, 0,249, 0, 0, 0,249, 0, 1, 0, 7, 1,225, 7, 7, 1,226, 7, 7, 1,247, 7, 7, 1,248, 7,
-220, 0,249, 7, 23, 0, 51, 0, 0, 0, 21, 6, 0, 0,250, 7, 2, 0, 64, 6, 2, 0, 65, 6, 2, 0,251, 7, 2, 0, 37, 0,
- 2, 0,213, 7, 2, 0,194, 6, 2, 0, 19, 0, 12, 1,227, 7, 12, 0,252, 7, 12, 0, 20, 6, 12, 0,253, 7, 12, 0,254, 7,
- 13, 1, 24, 0, 13, 1, 0, 0, 13, 1, 1, 0,218, 0, 72, 6, 23, 0,255, 7, 23, 0, 0, 8, 2, 0, 64, 6, 2, 0, 65, 6,
- 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 2, 0, 19, 0, 7, 0, 77, 2, 2, 0,233, 7, 2, 0,234, 7, 2, 0,212, 7,
- 2, 0, 4, 8, 2, 0,217, 7, 2, 0,178, 4, 14, 1,227, 7, 12, 0, 5, 8, 12, 0, 6, 8, 12, 0,253, 7, 0, 0, 7, 8,
- 9, 0, 8, 8, 15, 1, 12, 0, 0, 0, 9, 8, 2, 0, 10, 8, 2, 0, 11, 8, 2, 0, 12, 8, 2, 0, 13, 8, 2, 0, 14, 5,
- 2, 0, 9, 5,220, 0, 14, 8, 46, 0, 15, 8, 4, 0, 16, 8, 4, 0, 17, 8, 0, 0, 18, 8, 16, 1, 1, 0, 0, 0, 19, 8,
- 17, 1, 8, 0, 57, 0, 20, 8, 57, 0, 21, 8, 17, 1, 22, 8, 17, 1, 23, 8, 17, 1, 24, 8, 2, 0,124, 0, 2, 0, 19, 0,
- 4, 0, 25, 8, 18, 1, 4, 0, 4, 0,134, 6, 4, 0, 26, 8, 4, 0,139, 6, 4, 0, 27, 8, 19, 1, 2, 0, 4, 0, 28, 8,
- 4, 0, 29, 8, 20, 1, 5, 0, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 4, 0, 19, 0, 4, 0, 37, 0, 21, 1, 6, 0,
- 0, 0, 33, 8, 0, 0, 91, 6, 49, 0,132, 0, 2, 0,106, 0, 2, 0, 13, 5, 4, 0, 37, 0, 22, 1, 21, 0, 22, 1, 0, 0,
- 22, 1, 1, 0, 4, 0, 56, 0, 4, 0, 23, 0, 4, 0, 28, 0, 4, 0, 34, 8, 4, 0, 35, 8, 4, 0, 36, 8, 16, 1, 37, 8,
- 0, 0, 33, 8, 4, 0, 38, 8, 4, 0, 39, 8, 21, 1, 93, 3, 18, 1, 40, 8, 19, 1, 41, 8, 20, 1, 42, 8, 17, 1, 43, 8,
- 17, 1, 44, 8, 17, 1, 45, 8, 57, 0, 46, 8, 57, 0, 47, 8, 23, 1, 12, 0, 0, 0,250, 1, 9, 0,220, 0, 0, 0,221, 0,
- 4, 0,224, 0, 4, 0,232, 0, 9, 0,225, 0, 7, 0,227, 0, 7, 0,228, 0, 9, 0, 48, 8, 9, 0, 49, 8, 9, 0,229, 0,
- 9, 0,231, 0, 24, 1, 48, 0, 24, 1, 0, 0, 24, 1, 1, 0, 9, 0, 50, 8, 9, 0, 26, 0, 0, 0, 27, 0, 4, 0, 19, 0,
- 4, 0, 17, 0, 4, 0, 23, 0, 4, 0, 87, 0, 4, 0, 51, 8, 4, 0, 52, 8, 4, 0, 35, 8, 4, 0, 36, 8, 4, 0, 53, 8,
- 4, 0,243, 0, 4, 0, 54, 8, 4, 0, 55, 8, 7, 0, 56, 8, 7, 0, 37, 0, 7, 0, 57, 8, 7, 0, 58, 8, 4, 0,121, 0,
- 4, 0, 59, 8, 22, 1, 60, 8, 36, 0, 79, 0, 46, 0,129, 0, 32, 0, 61, 8, 49, 0,132, 0, 7, 0, 62, 8, 7, 0, 63, 8,
- 23, 1, 59, 1, 24, 1, 64, 8, 24, 1, 65, 8, 24, 1, 66, 8, 12, 0, 67, 8,250, 0,204, 6, 9, 0, 68, 8, 7, 0,251, 3,
- 7, 0, 69, 8, 7, 0, 70, 8, 4, 0, 71, 8, 4, 0, 72, 8, 7, 0, 73, 8, 9, 0, 74, 8, 4, 0, 75, 8, 4, 0, 76, 8,
- 4, 0, 77, 8, 7, 0, 78, 8, 25, 1, 4, 0, 25, 1, 0, 0, 25, 1, 1, 0, 12, 0, 79, 8, 24, 1, 80, 8,206, 0, 11, 0,
- 12, 0, 81, 8, 12, 0, 67, 8, 12, 0, 82, 8, 24, 1, 83, 8, 0, 0, 84, 8, 0, 0, 85, 8, 4, 0, 86, 8, 4, 0, 87, 8,
- 4, 0, 88, 8, 4, 0, 37, 0, 24, 0, 89, 8, 26, 1, 4, 0, 7, 0, 90, 8, 7, 0, 67, 3, 2, 0, 91, 8, 2, 0, 92, 8,
- 27, 1, 6, 0, 7, 0, 93, 8, 7, 0, 94, 8, 7, 0, 95, 8, 7, 0, 96, 8, 4, 0, 97, 8, 4, 0, 98, 8, 28, 1, 13, 0,
- 7, 0, 99, 8, 7, 0,100, 8, 7, 0,101, 8, 7, 0,102, 8, 7, 0,103, 8, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8,
- 7, 0,107, 8, 7, 0,108, 8, 4, 0,228, 2, 4, 0,109, 8, 4, 0,110, 8, 29, 1, 2, 0, 7, 0, 86, 5, 7, 0, 37, 0,
- 30, 1, 5, 0, 7, 0,111, 8, 7, 0,112, 8, 4, 0, 90, 0, 4, 0,184, 2, 4, 0,113, 8, 31, 1, 6, 0, 31, 1, 0, 0,
- 31, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 32, 1, 8, 0, 32, 1, 0, 0, 32, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0, 56, 0, 7, 0, 23, 0, 7, 0,121, 0, 33, 1, 45, 0, 33, 1, 0, 0,
- 33, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 2, 0, 37, 4, 2, 0,115, 8, 7, 0,116, 8,
- 7, 0, 88, 0, 7, 0,241, 2, 4, 0,117, 8, 4, 0, 81, 0, 4, 0,186, 2, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8,
- 7, 0,121, 8, 7, 0,122, 8, 7, 0,123, 8, 7, 0,238, 2, 7, 0, 56, 1, 7, 0,124, 8, 7, 0,125, 8, 7, 0, 37, 0,
- 7, 0,126, 8, 7, 0,127, 8, 7, 0,128, 8, 2, 0,129, 8, 2, 0,130, 8, 2, 0,131, 8, 2, 0,132, 8, 2, 0,133, 8,
- 2, 0,134, 8, 2, 0,135, 8, 2, 0,136, 8, 2, 0, 17, 2, 2, 0,137, 8, 2, 0, 14, 2, 2, 0,138, 8, 0, 0,139, 8,
- 0, 0,140, 8, 7, 0,237, 0, 34, 1,141, 8, 66, 0,229, 1, 35, 1, 16, 0, 35, 1, 0, 0, 35, 1, 1, 0, 2, 0, 17, 0,
- 2, 0, 19, 0, 2, 0,114, 8, 2, 0,239, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 66, 2, 7, 0,236, 2,
- 7, 0,237, 2, 7, 0,142, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,232, 0, 5, 0, 2, 0, 17, 0, 2, 0, 25, 8,
- 2, 0, 19, 0, 2, 0,143, 8, 27, 0,166, 6,231, 0, 3, 0, 4, 0, 68, 0, 4, 0,144, 8,232, 0, 2, 0, 36, 1, 7, 0,
- 36, 1, 0, 0, 36, 1, 1, 0, 0, 0, 20, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 22, 0, 9, 0,145, 8, 37, 1, 5, 0,
- 0, 0, 20, 0, 7, 0, 76, 1, 7, 0,146, 8, 4, 0,147, 8, 4, 0, 37, 0, 38, 1, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0, 89, 0, 2, 0, 69, 0, 39, 1, 4, 0, 0, 0, 20, 0, 65, 0,148, 8, 7, 0, 76, 1, 7, 0, 37, 0, 40, 1, 6, 0,
- 2, 0,149, 8, 2, 0,150, 8, 2, 0, 17, 0, 2, 0,151, 8, 0, 0,152, 8, 0, 0,153, 8, 41, 1, 5, 0, 4, 0, 17, 0,
- 4, 0, 37, 0, 0, 0, 20, 0, 0, 0,154, 8, 0, 0,155, 8, 42, 1, 3, 0, 4, 0, 17, 0, 4, 0, 37, 0, 0, 0, 20, 0,
- 43, 1, 4, 0, 2, 0,156, 8, 2, 0,157, 8, 2, 0, 19, 0, 2, 0, 37, 0, 44, 1, 6, 0, 0, 0, 20, 0, 0, 0,158, 8,
- 2, 0,159, 8, 2, 0,238, 2, 2, 0, 69, 1, 2, 0, 69, 0, 45, 1, 5, 0, 0, 0, 20, 0, 7, 0, 67, 3, 7, 0,128, 4,
- 2, 0, 19, 0, 2, 0,198, 2, 46, 1, 3, 0, 0, 0, 20, 0, 4, 0,186, 2, 4, 0,156, 8, 47, 1, 7, 0, 0, 0, 20, 0,
- 7, 0,128, 4, 0, 0,160, 8, 0, 0,161, 8, 2, 0, 69, 1, 2, 0, 89, 0, 4, 0,162, 8, 48, 1, 4, 0, 0, 0,163, 8,
- 0, 0,164, 8, 4, 0, 17, 0, 7, 0,202, 2, 49, 1, 3, 0, 32, 0,165, 8, 0, 0,166, 8, 0, 0,167, 8, 50, 1, 18, 0,
- 50, 1, 0, 0, 50, 1, 1, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0, 19, 0, 2, 0,169, 8, 2, 0,170, 8, 2, 0,171, 8,
- 2, 0, 89, 0, 2, 0, 69, 0, 0, 0, 20, 0, 9, 0, 2, 0, 51, 1,172, 8, 32, 0, 44, 0, 2, 0,102, 5, 2, 0, 69, 8,
- 2, 0,173, 8, 2, 0, 37, 0, 52, 1, 11, 0, 0, 0, 20, 0, 0, 0, 17, 0, 0, 0,174, 8, 2, 0, 19, 0, 2, 0,198, 2,
- 2, 0,175, 8, 4, 0,176, 8, 4, 0,177, 8, 4, 0,178, 8, 4, 0,179, 8, 4, 0,180, 8, 53, 1, 1, 0, 0, 0,181, 8,
- 54, 1, 4, 0, 42, 0,133, 6, 0, 0,125, 7, 4, 0, 69, 1, 4, 0, 19, 0, 51, 1, 18, 0, 51, 1, 0, 0, 51, 1, 1, 0,
- 51, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,183, 8, 2, 0,171, 8, 2, 0,168, 8, 2, 0,184, 8, 2, 0, 69, 0,
- 2, 0,226, 1, 0, 0, 20, 0, 9, 0, 2, 0, 55, 1,172, 8, 50, 1,185, 8, 2, 0, 15, 0, 2, 0,186, 8, 4, 0,187, 8,
- 56, 1, 3, 0, 4, 0,212, 2, 4, 0, 37, 0, 32, 0, 44, 0, 57, 1, 12, 0,162, 0,188, 8, 2, 0, 17, 0, 2, 0, 19, 0,
- 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0,190, 8, 2, 0,191, 8, 2, 0,192, 8, 2, 0,193, 8,
- 7, 0,194, 8, 58, 1, 8, 0, 7, 0,195, 8, 7, 0,196, 8, 7, 0,197, 8, 7, 0,198, 8, 7, 0,199, 8, 7, 0,200, 8,
- 7, 0,201, 8, 7, 0,202, 8, 59, 1, 13, 0, 2, 0, 19, 0, 2, 0,205, 6, 4, 0, 89, 0, 4, 0, 69, 0, 2, 0,203, 8,
- 7, 0,251, 3, 7, 0,204, 8,250, 0,204, 6, 58, 1,205, 8, 2, 0, 17, 0, 2, 0,248, 1, 2, 0,234, 5, 2, 0,206, 8,
- 60, 1, 11, 0, 4, 0,212, 2, 2, 0, 17, 0, 2, 0, 19, 0, 32, 0, 44, 0, 81, 0,207, 8, 0, 0, 20, 0, 7, 0,208, 8,
- 7, 0,209, 8, 7, 0,136, 3, 2, 0,210, 8, 2, 0,211, 8, 61, 1, 5, 0, 2, 0, 17, 0, 2, 0, 89, 0, 4, 0, 37, 0,
- 46, 0,129, 0, 32, 0, 93, 5, 62, 1, 5, 0, 4, 0, 37, 0, 4, 0, 17, 0, 0, 0, 20, 0, 0, 0,154, 8, 32, 0, 44, 0,
- 63, 1, 13, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,168, 8, 2, 0,137, 3, 7, 0,212, 8, 7, 0,213, 8, 7, 0,178, 4,
- 7, 0,149, 3, 7, 0,108, 3, 7, 0,111, 3, 7, 0,214, 8, 7, 0,215, 8, 32, 0,216, 8, 64, 1, 10, 0, 2, 0, 19, 0,
- 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 0, 0,189, 8, 2, 0, 89, 0, 2, 0, 69, 0, 2, 0,226, 1,
- 2, 0,248, 1, 65, 1, 8, 0, 32, 0, 44, 0, 7, 0,235, 2, 7, 0,217, 8, 7, 0,218, 8, 7, 0, 37, 0, 2, 0, 89, 0,
- 2, 0,198, 2, 7, 0, 69, 0, 66, 1, 12, 0, 2, 0, 17, 0, 2, 0, 69, 1, 2, 0, 19, 0, 2, 0,238, 2, 2, 0,212, 2,
- 2, 0,219, 8, 4, 0, 37, 0, 7, 0,220, 8, 7, 0,221, 8, 7, 0,222, 8, 7, 0,223, 8, 0, 0,224, 8, 67, 1, 9, 0,
- 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0, 20, 0, 2, 0,178, 4, 2, 0, 63, 0, 2, 0,225, 8,
- 2, 0,226, 8, 68, 1, 7, 0, 4, 0,186, 2, 4, 0,227, 8, 4, 0,228, 8, 4, 0,229, 8, 7, 0,230, 8, 7, 0,231, 8,
- 0, 0,160, 8, 69, 1, 7, 0, 0, 0,232, 8, 32, 0,233, 8, 0, 0,166, 8, 2, 0,234, 8, 2, 0, 89, 0, 4, 0, 69, 0,
- 0, 0,167, 8, 70, 1, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0,116, 8, 4, 0, 88, 0, 0, 0,235, 8, 0, 0,236, 8,
- 71, 1, 1, 0, 4, 0, 19, 0, 72, 1, 6, 0, 0, 0, 92, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0,237, 8, 7, 0,238, 8,
- 42, 0,133, 6, 73, 1, 4, 0, 0, 0, 61, 2, 2, 0, 19, 0, 4, 0, 17, 0, 32, 0, 44, 0, 74, 1, 2, 0, 4, 0, 17, 0,
- 4, 0, 53, 6, 75, 1, 6, 0, 0, 0,163, 8, 0, 0,164, 8, 4, 0, 17, 0, 7, 0, 25, 2, 32, 0, 46, 3, 32, 0,239, 8,
- 55, 1, 10, 0, 55, 1, 0, 0, 55, 1, 1, 0, 55, 1,182, 8, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,168, 8, 2, 0,240, 8,
- 0, 0, 20, 0, 9, 0, 2, 0, 32, 0, 44, 0,250, 0, 16, 0, 27, 0, 31, 0, 0, 0, 34, 0, 43, 0,147, 0, 9, 0,220, 0,
- 43, 0,241, 8, 36, 0, 79, 0, 7, 0,251, 3, 7, 0,242, 8, 7, 0,204, 8, 7, 0,195, 8, 7, 0,196, 8, 7, 0,243, 8,
- 4, 0, 90, 0, 4, 0, 37, 0, 9, 0,244, 8, 9, 0,245, 8, 76, 1, 6, 0, 76, 1, 0, 0, 76, 1, 1, 0, 32, 0, 44, 0,
- 9, 0,246, 8, 4, 0,244, 0, 4, 0, 37, 0, 66, 0, 4, 0, 27, 0, 31, 0, 12, 0,247, 8, 4, 0,126, 0, 7, 0,248, 8,
- 77, 1, 27, 0, 77, 1, 0, 0, 77, 1, 1, 0, 26, 0,249, 8, 77, 1, 38, 0, 12, 0,250, 8, 0, 0, 20, 0, 7, 0,251, 8,
- 7, 0,252, 8, 7, 0,253, 8, 7, 0,254, 8, 4, 0, 19, 0, 7, 0,255, 8, 7, 0, 0, 9, 7, 0, 1, 9, 7, 0, 76, 1,
- 7, 0, 25, 2, 7, 0, 2, 9, 7, 0,184, 2, 7, 0, 3, 9, 7, 0, 4, 9, 7, 0, 5, 9, 7, 0, 6, 9, 7, 0, 7, 9,
- 7, 0,169, 0, 4, 0,126, 0, 2, 0,139, 5, 2, 0,178, 4, 78, 1, 25, 0, 27, 0, 31, 0, 39, 0, 74, 0, 12, 0, 8, 9,
- 12, 0, 9, 9, 12, 0, 10, 9, 77, 1, 11, 9, 9, 0, 12, 9, 9, 0, 13, 9, 4, 0, 19, 0, 4, 0, 29, 6, 2, 0,242, 2,
- 2, 0, 82, 6, 4, 0, 37, 0, 4, 0,126, 0, 4, 0, 14, 9, 2, 0, 15, 9, 2, 0, 16, 9, 2, 0, 17, 9, 2, 0, 18, 9,
- 4, 0, 19, 9, 4, 0, 20, 9, 4, 0, 21, 9, 4, 0, 22, 9, 4, 0, 23, 9, 4, 0, 24, 9, 79, 1, 2, 0, 7, 0,144, 2,
- 4, 0, 19, 0,166, 0, 5, 0, 79, 1, 25, 9, 4, 0,184, 2, 4, 0, 26, 9, 4, 0, 27, 9, 4, 0, 19, 0,165, 0, 16, 0,
- 4, 0, 28, 9, 4, 0, 29, 9, 4, 0, 30, 9, 4, 0, 31, 9, 2, 0, 32, 9, 2, 0, 33, 9, 2, 0, 34, 9, 2, 0,244, 0,
- 2, 0, 35, 9, 2, 0, 36, 9, 2, 0, 37, 9, 2, 0, 38, 9, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 41, 9, 4, 0, 42, 9,
- 80, 1, 44, 0, 80, 1, 0, 0, 80, 1, 1, 0, 26, 0,249, 8, 12, 0,163, 3, 0, 0, 20, 0, 2, 0, 19, 0, 2, 0, 43, 9,
- 2, 0, 44, 9, 2, 0, 45, 9, 2, 0,122, 3, 2, 0, 46, 9, 4, 0, 64, 2, 4, 0, 21, 9, 4, 0, 22, 9, 77, 1, 47, 9,
- 80, 1, 38, 0, 80, 1, 48, 9, 12, 0, 49, 9, 9, 0, 50, 9, 9, 0, 51, 9, 9, 0, 52, 9, 7, 0, 64, 1, 7, 0,169, 0,
- 7, 0, 53, 9, 7, 0, 4, 2, 7, 0,113, 3, 7, 0,115, 3, 2, 0,145, 3, 2, 0, 37, 0, 7, 0, 54, 9, 7, 0, 55, 9,
- 7, 0,118, 3, 7, 0, 56, 9, 7, 0, 57, 9, 7, 0, 58, 9, 7, 0, 59, 9, 7, 0, 60, 9, 7, 0, 61, 9, 7, 0, 62, 9,
- 7, 0, 63, 9, 7, 0, 56, 2,166, 0,101, 3, 32, 0, 64, 9, 80, 1, 65, 9,163, 0, 14, 0, 12, 0, 66, 9, 76, 0, 67, 9,
- 2, 0, 19, 0, 2, 0, 68, 9, 7, 0, 93, 2, 7, 0, 69, 9, 7, 0, 70, 9, 12, 0, 71, 9, 4, 0, 72, 9, 4, 0, 73, 9,
- 9, 0, 74, 9, 9, 0, 75, 9,165, 0,100, 3, 0, 0, 76, 9, 81, 1, 1, 0, 4, 0, 73, 9, 82, 1, 12, 0, 4, 0, 73, 9,
- 7, 0,180, 8, 2, 0, 77, 9, 2, 0, 78, 9, 7, 0, 79, 9, 7, 0, 80, 9, 2, 0, 81, 9, 2, 0, 19, 0, 7, 0, 82, 9,
- 7, 0, 83, 9, 7, 0, 84, 9, 7, 0, 85, 9, 83, 1, 7, 0, 83, 1, 0, 0, 83, 1, 1, 0, 12, 0, 86, 9, 4, 0, 19, 0,
- 4, 0, 87, 9, 0, 0,242, 3, 2, 1, 88, 9,162, 0, 7, 0, 27, 0, 31, 0, 12, 0, 89, 9, 12, 0, 66, 9, 12, 0, 90, 9,
- 12, 0,100, 0, 4, 0, 19, 0, 4, 0, 91, 9,222, 0, 5, 0, 27, 0, 92, 9, 12, 0, 66, 9, 66, 0, 93, 9, 4, 0, 94, 9,
- 4, 0, 19, 0, 84, 1, 13, 0,217, 0, 0, 0,217, 0, 1, 0, 12, 0, 20, 6, 4, 0, 21, 6, 7, 0, 22, 6, 2, 0, 23, 6,
-218, 0, 72, 6,162, 0, 96, 3,222, 0, 95, 9, 0, 0, 69, 1, 0, 0, 75, 6, 2, 0, 19, 0, 7, 0, 96, 9, 85, 1, 8, 0,
- 85, 1, 0, 0, 85, 1, 1, 0, 83, 1, 97, 9, 36, 0, 79, 0, 12, 0,102, 3, 4, 0, 19, 0, 0, 0, 20, 0, 4, 0, 98, 9,
- 86, 1, 5, 0, 86, 1, 0, 0, 86, 1, 1, 0, 36, 0, 79, 0, 2, 0, 19, 0, 0, 0, 99, 9, 87, 1, 14, 0, 87, 1, 0, 0,
- 87, 1, 1, 0, 9, 0, 2, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,100, 9, 0, 0,101, 9, 0, 0, 99, 9, 7, 0,102, 9,
- 7, 0,103, 9, 4, 0, 37, 0, 36, 0, 79, 0, 7, 0,104, 9, 7, 0,105, 9, 88, 1, 9, 0, 88, 1, 0, 0, 88, 1, 1, 0,
- 32, 0,106, 9, 0, 0,245, 2, 7, 0,107, 9, 2, 0,108, 9, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,109, 9, 89, 1, 7, 0,
- 42, 0,133, 6, 26, 0,249, 8, 4, 0, 19, 0, 4, 0,110, 9, 12, 0,111, 9, 32, 0,106, 9, 0, 0,245, 2, 90, 1, 15, 0,
- 32, 0,106, 9, 2, 0,112, 9, 2, 0, 19, 0, 2, 0,113, 9, 2, 0,114, 9, 0, 0,245, 2, 32, 0,115, 9, 0, 0,116, 9,
- 7, 0,117, 9, 7, 0, 25, 2, 7, 0,118, 9, 7, 0,119, 9, 2, 0, 17, 0, 2, 0, 69, 1, 7, 0, 76, 1, 91, 1, 6, 0,
- 32, 0,106, 9, 7, 0, 25, 9, 2, 0,120, 9, 2, 0,121, 9, 2, 0, 19, 0, 2, 0,122, 9, 92, 1, 6, 0, 32, 0,106, 9,
- 4, 0,123, 9, 4, 0,124, 9, 4, 0, 90, 0, 4, 0, 37, 0, 0, 0,245, 2, 93, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0,
- 4, 0,123, 9, 0, 0,245, 2, 94, 1, 4, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 95, 1, 4, 0,
- 32, 0,106, 9, 4, 0, 19, 0, 4, 0,123, 9, 0, 0,245, 2, 96, 1, 2, 0, 4, 0, 19, 0, 7, 0,251, 3, 97, 1, 2, 0,
- 32, 0,106, 9, 0, 0,245, 2, 98, 1, 10, 0, 32, 0,106, 9, 4, 0,125, 9, 7, 0,120, 0, 4, 0, 19, 0, 2, 0,126, 6,
- 2, 0,126, 9, 2, 0, 89, 0, 2, 0, 69, 0, 7, 0,127, 9, 0, 0,245, 2, 99, 1, 10, 0, 32, 0,106, 9, 2, 0, 17, 0,
- 2, 0, 45, 4, 4, 0, 87, 0, 4, 0, 88, 0, 7, 0,217, 8, 7, 0,218, 8, 4, 0, 37, 0,162, 0,188, 8, 0, 0,245, 2,
-100, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3, 4, 0,128, 9, 0, 0,245, 2,101, 1, 4, 0, 32, 0,106, 9, 4, 0,123, 3,
- 4, 0, 37, 0, 0, 0,245, 2,102, 1, 6, 0, 32, 0,106, 9, 7, 0,120, 0, 7, 0, 58, 3, 4, 0,129, 9, 2, 0,123, 3,
- 2, 0,124, 3,103, 1, 6, 0, 32, 0,106, 9, 4, 0,130, 9, 4, 0,131, 9, 7, 0,132, 9, 7, 0,133, 9, 0, 0,245, 2,
-104, 1, 16, 0, 32, 0,106, 9, 32, 0, 48, 9, 4, 0, 17, 0, 7, 0,134, 9, 7, 0,135, 9, 7, 0,136, 9, 7, 0,137, 9,
- 7, 0,138, 9, 7, 0,139, 9, 7, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 2, 0, 19, 0, 2, 0, 37, 0, 2, 0, 89, 0,
- 2, 0, 69, 0,105, 1, 3, 0, 32, 0,106, 9, 4, 0, 19, 0, 4, 0, 17, 2,106, 1, 5, 0, 32, 0,106, 9, 4, 0, 19, 0,
- 4, 0, 37, 0, 7, 0,143, 9, 0, 0,245, 2,107, 1, 10, 0, 32, 0,106, 9, 0, 0,245, 2, 2, 0,144, 9, 2, 0,145, 9,
- 0, 0,146, 9, 0, 0,147, 9, 7, 0,148, 9, 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9,108, 1, 5, 0, 32, 0,106, 9,
- 0, 0,245, 2, 7, 0,192, 2, 2, 0,152, 9, 2, 0, 19, 0,109, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0,
- 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,110, 1, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
- 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,111, 1, 8, 0, 7, 0, 9, 0,
- 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 12, 0, 7, 0,153, 9, 7, 0,154, 9, 2, 0, 19, 0, 2, 0, 17, 2,112, 1, 7, 0,
- 32, 0,106, 9, 0, 0,245, 2, 7, 0, 76, 1, 7, 0, 85, 1, 2, 0, 19, 0, 2, 0, 69, 1, 4, 0, 37, 0,113, 1, 5, 0,
- 32, 0, 46, 3, 7, 0, 76, 1, 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,155, 9,114, 1, 10, 0,114, 1, 0, 0,114, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,156, 9, 7, 0, 19, 1, 7, 0, 20, 1, 2, 0, 86, 9, 2, 0,157, 9, 32, 0, 44, 0,
-115, 1, 22, 0,115, 1, 0, 0,115, 1, 1, 0, 2, 0, 19, 0, 2, 0, 69, 1, 2, 0,158, 9, 2, 0,159, 9, 36, 0, 79, 0,
-162, 0,188, 8, 32, 0,161, 0, 7, 0, 87, 0, 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,162, 9, 7, 0,163, 9,
- 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 0, 0,166, 9, 0, 0,167, 9, 12, 0,104, 3,116, 1, 8, 0,
- 7, 0, 32, 2, 7, 0,217, 8, 7, 0,218, 8, 9, 0, 2, 0, 2, 0,168, 9, 2, 0,169, 9, 2, 0,170, 9, 2, 0,171, 9,
-117, 1, 18, 0,117, 1, 0, 0,117, 1, 1, 0,117, 1,172, 9, 0, 0, 20, 0,116, 1,173, 9, 2, 0, 17, 0, 2, 0, 19, 0,
- 2, 0,174, 9, 2, 0,175, 9, 2, 0,176, 9, 2, 0,177, 9, 4, 0, 89, 0, 7, 0,178, 9, 7, 0,179, 9, 4, 0,180, 9,
- 4, 0,181, 9,117, 1,182, 9,118, 1,183, 9,119, 1, 33, 0,119, 1, 0, 0,119, 1, 1, 0,119, 1,184, 9, 0, 0, 20, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 34, 8, 2, 0, 69, 8, 2, 0,185, 9, 2, 0,128, 0, 2, 0,175, 9, 2, 0, 25, 8,
- 12, 0,183, 8, 12, 0,186, 9, 27, 0,166, 6, 9, 0,187, 9, 7, 0,178, 9, 7, 0,179, 9, 7, 0, 66, 2, 7, 0,188, 9,
- 2, 0,189, 9, 2, 0,190, 9, 7, 0,191, 9, 7, 0,192, 9, 2, 0,193, 9, 2, 0,194, 9, 9, 0,195, 9, 24, 0,196, 9,
- 24, 0,197, 9, 24, 0,198, 9,120, 1,148, 0,121, 1,199, 9,122, 1,200, 9,118, 1, 8, 0,118, 1, 0, 0,118, 1, 1, 0,
-119, 1,201, 9,119, 1,202, 9,117, 1,203, 9,117, 1,182, 9, 4, 0, 19, 0, 4, 0, 37, 0, 60, 0, 22, 0, 27, 0, 31, 0,
- 39, 0, 74, 0,164, 0, 99, 3, 12, 0,204, 9, 12, 0,205, 9,116, 1,206, 9, 12, 0,207, 9, 4, 0, 17, 0, 4, 0,208, 9,
- 4, 0,209, 9, 4, 0,210, 9, 4, 0, 19, 0, 4, 0, 37, 0, 12, 0,211, 9,122, 1,212, 9, 4, 0,213, 9, 9, 0,214, 9,
- 9, 0,215, 9, 4, 0,216, 9, 9, 0,217, 9, 9, 0,218, 9, 9, 0,219, 9,123, 1, 6, 0, 4, 0,119, 0, 4, 0,121, 0,
- 4, 0, 25, 8, 0, 0,220, 9, 0, 0,221, 9, 2, 0, 37, 0,124, 1, 16, 0, 2, 0,233, 7, 2, 0,234, 7, 2, 0,222, 9,
- 2, 0,223, 9, 2, 0,224, 9, 2, 0, 67, 0, 7, 0,230, 2, 7, 0,225, 9, 7, 0,226, 9, 2, 0, 91, 1, 0, 0,227, 9,
- 0, 0,228, 9, 2, 0,229, 9, 2, 0, 37, 0, 4, 0,230, 9, 4, 0,231, 9,125, 1, 9, 0, 7, 0,232, 9, 7, 0,233, 9,
- 7, 0,243, 8, 7, 0, 67, 3, 7, 0,234, 9, 7, 0, 88, 6, 2, 0, 65, 3, 0, 0,235, 9, 0, 0, 37, 0,126, 1, 4, 0,
- 7, 0,236, 9, 7, 0,237, 9, 2, 0, 65, 3, 2, 0, 37, 0,127, 1, 3, 0, 7, 0,238, 9, 7, 0, 56, 8, 7, 0, 15, 0,
-128, 1, 7, 0, 0, 0,250, 1, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5, 2, 0,200, 4, 4, 0,121, 0, 4, 0, 43, 4,
-129, 1, 9, 0, 7, 0,239, 9, 7, 0,240, 9, 7, 0,241, 9, 7, 0, 77, 2, 7, 0,242, 9, 7, 0,243, 9, 7, 0,244, 9,
- 2, 0,245, 9, 2, 0,246, 9,130, 1, 4, 0, 2, 0,247, 9, 2, 0,248, 9, 2, 0,249, 9, 2, 0,250, 9,131, 1, 2, 0,
- 7, 0, 5, 0, 7, 0, 6, 0,132, 1, 2, 0, 0, 0,163, 0, 0, 0,251, 9,133, 1, 1, 0, 0, 0, 20, 0,134, 1, 10, 0,
- 0, 0,252, 9, 0, 0,253, 9, 0, 0, 81, 6, 0, 0,254, 9, 2, 0,222, 9, 2, 0,255, 9, 7, 0, 0, 10, 7, 0, 1, 10,
- 7, 0, 2, 10, 7, 0,164, 9,135, 1, 2, 0, 9, 0, 3, 10, 9, 0, 4, 10,136, 1, 11, 0, 0, 0, 13, 5, 0, 0, 17, 0,
- 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 5, 10, 0, 0,106, 0, 0, 0, 61, 2, 7, 0, 6, 10, 7, 0, 7, 10, 7, 0, 8, 10,
- 7, 0, 9, 10,137, 1, 8, 0, 7, 0,149, 8, 7, 0,120, 0, 7, 0,228, 9, 7, 0,149, 2, 7, 0, 10, 10, 7, 0,233, 0,
- 7, 0, 11, 10, 4, 0, 17, 0,138, 1, 4, 0, 2, 0, 12, 10, 2, 0, 13, 10, 2, 0, 14, 10, 2, 0, 37, 0,139, 1, 8, 0,
- 7, 0, 15, 10, 7, 0,192, 2, 7, 0, 16, 10, 7, 0, 30, 8, 7, 0, 31, 8, 7, 0, 32, 8, 7, 0, 17, 10, 7, 0, 18, 10,
-140, 1, 6, 0, 2, 0, 19, 10, 2, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10, 7, 0, 23, 10, 7, 0, 24, 10,141, 1, 1, 0,
- 0, 0, 20, 0,142, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 19, 0, 2, 0, 25, 10,143, 1, 10, 0, 2, 0,231, 3,
- 2, 0, 19, 0, 7, 0,128, 4, 7, 0, 26, 10, 7, 0, 27, 10, 7, 0, 28, 10, 7, 0, 29, 10,142, 1, 30, 10,142, 1, 31, 10,
-142, 1, 32, 10, 63, 0, 11, 0, 4, 0, 19, 0, 4, 0, 63, 0, 4, 0, 33, 10, 4, 0, 34, 10, 24, 0, 35, 10, 24, 0, 36, 10,
-143, 1, 37, 10, 7, 0, 38, 10, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10,235, 0, 10, 0, 4, 0, 86, 9, 4, 0, 42, 10,
- 7, 0, 43, 10, 7, 0, 44, 10, 7, 0, 45, 10, 7, 0, 46, 10, 7, 0, 10, 0, 7, 0, 12, 0, 4, 0, 69, 1, 4, 0,235, 2,
-234, 0, 18, 0, 4, 0,124, 0, 4, 0, 47, 10, 4, 0, 48, 10, 7, 0, 49, 10, 4, 0, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10,
- 4, 0, 53, 10, 7, 0, 54, 10, 4, 0, 55, 10, 7, 0, 56, 10,235, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 60, 10,
- 7, 0, 61, 10, 4, 0, 62, 10, 4, 0, 37, 0,144, 1, 4, 0, 47, 0,222, 2, 7, 0, 63, 10, 7, 0,158, 1, 7, 0, 37, 0,
-195, 0, 33, 0, 27, 0, 31, 0,144, 1, 64, 10, 63, 0, 30, 10, 51, 0, 65, 10, 57, 0, 66, 10, 30, 0,148, 0, 0, 0, 67, 10,
- 7, 0, 68, 10, 2, 0,240, 5, 2, 0, 69, 10, 4, 0,106, 0, 4, 0, 19, 0, 7, 0, 70, 10, 4, 0, 74, 2, 4, 0, 71, 10,
- 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 7, 0,158, 1, 4, 0, 75, 10, 7, 0, 76, 10, 0, 0, 77, 10, 0, 0, 78, 10,
- 0, 0, 79, 10, 0, 0,226, 1, 7, 0, 80, 10, 7, 0, 81, 10, 7, 0, 82, 10, 7, 0, 83, 10, 4, 0, 84, 10, 7, 0, 85, 10,
- 7, 0, 86, 10, 7, 0, 87, 10,145, 1, 10, 0, 4, 0, 17, 0, 4, 0,120, 0, 4, 0, 19, 0, 4, 0,185, 3, 4, 0, 88, 10,
- 4, 0, 89, 10, 4, 0, 90, 10, 0, 0, 92, 0, 0, 0, 20, 0, 9, 0, 2, 0,146, 1, 1, 0, 0, 0, 18, 8, 92, 0, 7, 0,
-145, 1, 91, 10, 4, 0, 92, 10, 4, 0, 93, 10, 4, 0, 94, 10, 4, 0, 37, 0, 9, 0, 95, 10,146, 1, 96, 10,147, 1, 5, 0,
- 7, 0,144, 2, 7, 0,212, 2, 7, 0, 25, 2, 2, 0,120, 2, 2, 0, 37, 0,148, 1, 5, 0, 7, 0,144, 2, 7, 0, 97, 10,
- 7, 0, 98, 10, 7, 0, 99, 10, 7, 0,212, 2,149, 1, 5, 0, 32, 0,100, 10,150, 1, 22, 0, 7, 0,210, 5, 7, 0,101, 10,
- 7, 0, 56, 0,151, 1, 7, 0, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 7, 0,105, 10, 7, 0,106, 10, 7, 0,107, 10,
- 7, 0, 56, 0,152, 1, 8, 0,152, 1, 0, 0,152, 1, 1, 0, 32, 0, 44, 0, 4, 0,252, 0, 2, 0, 19, 0, 2, 0, 69, 1,
- 7, 0,212, 2, 7, 0,157, 8,153, 1, 6, 0,153, 1, 0, 0,153, 1, 1, 0, 32, 0, 44, 0, 2, 0,197, 2, 2, 0, 19, 0,
- 2, 0,108, 10,154, 1, 17, 0,148, 1,179, 3,148, 1,109, 10,147, 1,110, 10,148, 1,141, 8,149, 1,111, 10, 4, 0, 81, 0,
- 7, 0,212, 2, 7, 0,241, 2, 7, 0,112, 10, 4, 0,102, 10, 4, 0,113, 10, 7, 0,106, 10, 7, 0,107, 10, 7, 0,106, 0,
- 4, 0,114, 10, 2, 0, 19, 0, 2, 0,115, 10,155, 1, 9, 0, 7, 0,116, 10, 7, 0,248, 0, 7, 0,117, 10, 7, 0,118, 10,
- 7, 0,119, 10, 7, 0,120, 10, 7, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10,156, 1,111, 0, 27, 0, 31, 0, 39, 0, 74, 0,
-157, 1,124, 10,155, 1,125, 10,173, 0, 65, 4, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0,144, 9, 2, 0,126, 10, 2, 0,127, 10,
- 2, 0,145, 3, 2, 0,128, 10, 2, 0,129, 10, 2, 0,130, 10, 2, 0,131, 10, 2, 0,132, 10, 2, 0,133, 10, 2, 0,134, 10,
- 2, 0,135, 10, 2, 0,110, 5, 2, 0,136, 10, 2, 0,137, 10, 2, 0,138, 10, 2, 0,139, 10, 2, 0,140, 10, 2, 0, 14, 2,
- 2, 0,134, 8, 2, 0,109, 8, 2, 0,141, 10, 2, 0,142, 10, 2, 0,195, 3, 2, 0,196, 3, 2, 0,143, 10, 2, 0,144, 10,
- 2, 0,145, 10, 2, 0,146, 10, 7, 0,147, 10, 7, 0,148, 10, 7, 0,149, 10, 2, 0, 61, 5, 2, 0,150, 10, 7, 0,151, 10,
- 7, 0,152, 10, 7, 0,153, 10, 7, 0,116, 8, 7, 0, 88, 0, 7, 0,241, 2, 7, 0,122, 8, 7, 0,154, 10, 7, 0,155, 10,
- 7, 0,156, 10, 4, 0,117, 8, 4, 0,115, 8, 4, 0,157, 10, 7, 0,118, 8, 7, 0,119, 8, 7, 0,120, 8, 7, 0,158, 10,
- 7, 0,159, 10, 7, 0,160, 10, 7, 0,161, 10, 7, 0,162, 10, 7, 0, 56, 0, 7, 0,163, 10, 7, 0,164, 10, 7, 0,165, 10,
- 7, 0,166, 10, 7, 0,136, 3, 7, 0,106, 0, 7, 0,167, 10, 7, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10,
- 7, 0,172, 10, 7, 0,173, 10, 4, 0,174, 10, 4, 0,175, 10, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10,
- 7, 0,180, 10, 7, 0,207, 0, 7, 0,181, 10, 7, 0,222, 3, 7, 0,220, 3, 7, 0,221, 3, 7, 0,182, 10, 7, 0,183, 10,
- 7, 0,184, 10, 7, 0,185, 10, 7, 0,186, 10, 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10,
- 7, 0,192, 10, 7, 0,193, 10, 7, 0,194, 10, 4, 0,195, 10, 4, 0,196, 10, 66, 0,168, 3, 12, 0,197, 10, 66, 0,198, 10,
- 32, 0,199, 10, 32, 0,200, 10, 36, 0, 79, 0,168, 0, 61, 1,168, 0,201, 10,148, 0, 44, 0,148, 0, 0, 0,148, 0, 1, 0,
-156, 1,202, 10,154, 1,203, 10,151, 1, 48, 9,175, 0,247, 3, 9, 0,248, 3,158, 1,204, 10,158, 1,205, 10, 12, 0,206, 10,
- 12, 0,207, 10,133, 0,208, 10,141, 0,209, 10,141, 0,210, 10, 32, 0,211, 10, 32, 0,212, 10, 32, 0, 38, 0, 12, 0,111, 9,
- 0, 0, 20, 0, 7, 0,237, 0, 7, 0, 12, 3, 7, 0,213, 10, 4, 0,186, 2, 4, 0, 56, 0, 4, 0, 19, 0, 4, 0,117, 8,
- 4, 0,214, 10, 4, 0,215, 10, 4, 0,216, 10, 2, 0,244, 0, 2, 0,217, 10, 2, 0,218, 10, 2, 0,219, 10, 0, 0,220, 10,
- 2, 0,221, 10, 2, 0,222, 10, 2, 0,223, 10, 9, 0,224, 10,137, 0, 64, 4, 12, 0,255, 2, 12, 0,225, 10,159, 1,226, 10,
-160, 1,227, 10, 7, 0,228, 10,135, 0, 37, 0,161, 1,244, 8, 7, 0, 34, 4, 7, 0,229, 10, 7, 0,230, 10, 7, 0,210, 5,
- 7, 0,146, 3, 7, 0,136, 3, 7, 0,231, 10, 7, 0, 76, 2, 7, 0,232, 10, 7, 0,233, 10, 7, 0,234, 10, 7, 0,235, 10,
- 7, 0,236, 10, 7, 0,237, 10, 7, 0, 35, 4, 7, 0,238, 10, 7, 0,239, 10, 7, 0,240, 10, 7, 0, 36, 4, 7, 0, 32, 4,
- 7, 0, 33, 4, 7, 0,241, 10, 7, 0,242, 10, 4, 0,243, 10, 4, 0, 90, 0, 4, 0,244, 10, 4, 0,245, 10, 2, 0,246, 10,
- 2, 0,247, 10, 2, 0,248, 10, 2, 0,249, 10, 2, 0,250, 10, 2, 0,251, 10, 2, 0,252, 10, 2, 0,178, 4,173, 0, 65, 4,
-136, 0, 9, 0,161, 1,253, 10, 7, 0,254, 10, 7, 0,255, 10, 7, 0,230, 1, 7, 0, 0, 11, 4, 0, 90, 0, 2, 0, 1, 11,
- 2, 0, 2, 11, 66, 0,229, 1,162, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 7, 0, 3, 11,163, 1, 6, 0,
-163, 1, 0, 0,163, 1, 1, 0,162, 1, 25, 9, 4, 0,250, 0, 2, 0, 4, 11, 2, 0, 19, 0,164, 1, 5, 0,164, 1, 0, 0,
-164, 1, 1, 0, 12, 0, 5, 11, 4, 0, 6, 11, 4, 0, 19, 0,165, 1, 9, 0,165, 1, 0, 0,165, 1, 1, 0, 12, 0,119, 0,
-164, 1, 7, 11, 4, 0, 19, 0, 2, 0, 4, 11, 2, 0, 8, 11, 7, 0, 91, 0, 0, 0, 9, 11,164, 0, 6, 0, 27, 0, 31, 0,
- 12, 0, 29, 5, 4, 0, 19, 0, 2, 0, 10, 11, 2, 0, 11, 11, 9, 0, 12, 11,166, 1, 7, 0,166, 1, 0, 0,166, 1, 1, 0,
- 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 23, 0, 0, 0, 13, 11, 0, 0, 14, 11,167, 1, 6, 0, 12, 0, 15, 11, 4, 0, 16, 11,
- 4, 0, 17, 11, 4, 0, 19, 0, 4, 0, 37, 0,215, 0, 18, 11,168, 1, 3, 0, 7, 0, 86, 5, 7, 0, 19, 11, 7, 0, 20, 11,
-169, 1, 17, 0, 27, 0, 31, 0,170, 1, 21, 11,170, 1, 22, 11, 12, 0, 23, 11, 4, 0, 24, 11, 2, 0, 25, 11, 2, 0, 26, 11,
- 12, 0, 27, 11, 12, 0, 28, 11,167, 1, 29, 11, 12, 0, 30, 11, 12, 0, 31, 11, 12, 0, 32, 11, 12, 0, 33, 11,171, 1, 34, 11,
- 12, 0, 35, 11,215, 0, 36, 11,170, 1, 31, 0,170, 1, 0, 0,170, 1, 1, 0, 9, 0, 37, 11, 4, 0,211, 7, 2, 0, 38, 11,
- 2, 0, 37, 0,220, 0, 71, 6,220, 0, 39, 11, 0, 0, 40, 11, 2, 0, 41, 11, 2, 0, 42, 11, 2, 0,233, 7, 2, 0,234, 7,
- 2, 0, 43, 11, 2, 0, 44, 11, 2, 0,185, 3, 2, 0,194, 6, 2, 0, 45, 11, 2, 0, 46, 11, 2, 0,213, 9,172, 1, 47, 11,
-173, 1, 48, 11,174, 1, 49, 11, 4, 0, 50, 11, 4, 0, 51, 11, 9, 0, 52, 11, 12, 0, 28, 11, 12, 0,253, 7, 12, 0, 53, 11,
- 12, 0, 54, 11, 12, 0, 55, 11,175, 1, 17, 0,175, 1, 0, 0,175, 1, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0, 2, 0, 57, 11,
- 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 58, 11, 2, 0, 59, 11, 2, 0, 60, 11, 2, 0, 61, 11, 2, 0, 62, 11, 2, 0, 19, 0,
- 2, 0, 63, 11, 2, 0, 31, 0, 2, 0, 37, 0,176, 1, 64, 11,177, 1, 10, 0,177, 1, 0, 0,177, 1, 1, 0, 12, 0, 65, 11,
- 0, 0, 56, 11, 2, 0, 66, 11, 2, 0, 67, 11, 2, 0, 19, 0, 2, 0, 68, 11, 4, 0, 69, 11, 9, 0, 70, 11,171, 1, 7, 0,
-171, 1, 0, 0,171, 1, 1, 0, 0, 0, 56, 11, 0, 0, 71, 11, 12, 0,163, 7, 4, 0, 72, 11, 4, 0, 19, 0,228, 0, 14, 0,
-228, 0, 0, 0,228, 0, 1, 0, 0, 0, 56, 11, 26, 0, 30, 0,178, 1,227, 7, 9, 0, 73, 11, 9, 0, 74, 11,176, 1, 64, 11,
-167, 1, 75, 11, 12, 0, 76, 11,228, 0, 77, 11, 11, 1,107, 6, 2, 0, 19, 0, 2, 0,178, 4,179, 1, 8, 0,179, 1, 0, 0,
-179, 1, 1, 0, 9, 0, 2, 0, 9, 0, 78, 11, 0, 0,242, 3, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 79, 11,180, 1, 5, 0,
- 7, 0, 80, 11, 4, 0, 81, 11, 4, 0, 82, 11, 4, 0, 69, 1, 4, 0, 19, 0,181, 1, 6, 0, 7, 0, 83, 11, 7, 0, 84, 11,
- 7, 0, 85, 11, 7, 0, 86, 11, 4, 0, 17, 0, 4, 0, 19, 0,182, 1, 5, 0, 7, 0,217, 8, 7, 0,218, 8, 7, 0,212, 2,
- 2, 0, 28, 2, 2, 0, 29, 2,183, 1, 5, 0,182, 1, 2, 0, 4, 0, 53, 0, 7, 0, 87, 11, 7, 0,217, 8, 7, 0,218, 8,
-184, 1, 4, 0, 2, 0, 88, 11, 2, 0, 89, 11, 2, 0, 90, 11, 2, 0, 91, 11,185, 1, 2, 0, 42, 0,160, 6, 26, 0,249, 8,
-186, 1, 3, 0, 24, 0, 92, 11, 4, 0, 19, 0, 4, 0, 37, 0,187, 1, 6, 0, 7, 0,106, 0, 7, 0,214, 2, 7, 0, 93, 11,
- 7, 0, 37, 0, 2, 0,243, 0, 2, 0, 94, 11,188, 1, 5, 0, 7, 0, 95, 11, 7, 0,120, 0, 7, 0, 26, 9, 7, 0, 27, 9,
- 4, 0, 19, 0,189, 1, 6, 0, 27, 0,166, 6, 0, 0, 96, 11, 0, 0, 97, 11, 2, 0, 98, 11, 2, 0, 19, 0, 4, 0, 99, 11,
-190, 1, 7, 0,190, 1, 0, 0,190, 1, 1, 0, 0, 0,242, 3,189, 1,100, 11, 2, 0,101, 11, 2, 0, 17, 0, 7, 0, 60, 0,
-191, 1, 7, 0, 12, 0,102, 11, 0, 0,103, 11, 9, 0,104, 11, 7, 0, 60, 0, 7, 0, 79, 11, 4, 0, 17, 0, 4, 0, 19, 0,
-192, 1, 3, 0, 7, 0,105, 11, 4, 0, 19, 0, 4, 0, 37, 0,193, 1, 15, 0,193, 1, 0, 0,193, 1, 1, 0, 83, 1, 97, 9,
-191, 1, 61, 0, 12, 0,104, 3, 35, 0, 49, 0,192, 1,106, 11, 4, 0, 53, 0, 7, 0, 60, 0, 2, 0, 19, 0, 2, 0, 12, 1,
- 4, 0,107, 11, 0, 0, 96, 11, 4, 0,108, 11, 7, 0,109, 11,194, 1, 2, 0, 0, 0,110, 11, 0, 0,111, 11,195, 1, 4, 0,
-195, 1, 0, 0,195, 1, 1, 0,162, 0, 46, 3, 12, 0,112, 11,196, 1, 24, 0,196, 1, 0, 0,196, 1, 1, 0, 12, 0,113, 11,
-162, 0,188, 8,195, 1,114, 11, 12, 0,115, 11, 12, 0,104, 3, 0, 0,242, 3, 7, 0, 79, 11, 7, 0,116, 11, 7, 0, 87, 0,
- 7, 0, 88, 0, 7, 0,160, 9, 7, 0,161, 9, 7, 0,231, 2, 7, 0,164, 9, 7, 0,190, 8, 7, 0,165, 9, 2, 0,117, 11,
- 2, 0,118, 11, 2, 0, 89, 0, 2, 0, 17, 0, 4, 0, 19, 0, 4, 0, 69, 0,197, 1, 6, 0,197, 1, 0, 0,197, 1, 1, 0,
- 12, 0,113, 11, 4, 0, 19, 0, 4, 0,148, 2, 0, 0,242, 3,198, 1, 11, 0,198, 1, 0, 0,198, 1, 1, 0, 27, 0,166, 6,
- 0, 0,119, 11, 4, 0, 99, 11, 2, 0,120, 11, 2, 0, 37, 0, 0, 0, 96, 11, 4, 0,107, 11, 2, 0, 19, 0, 2, 0,121, 11,
-199, 1, 8, 0,199, 1, 0, 0,199, 1, 1, 0, 12, 0,122, 11, 0, 0,242, 3, 0, 0,123, 11, 2, 0, 19, 0, 2, 0,121, 11,
- 4, 0,124, 11,200, 1, 5, 0,200, 1, 0, 0,200, 1, 1, 0, 0, 0, 96, 11, 4, 0,107, 11, 7, 0,202, 2, 39, 0, 12, 0,
-162, 0, 96, 3,162, 0,125, 11,195, 1,114, 11, 12, 0,126, 11,196, 1,127, 11, 12, 0,128, 11, 12, 0,129, 11, 4, 0, 19, 0,
- 4, 0,244, 0, 2, 0,130, 11, 2, 0,131, 11, 7, 0,132, 11,201, 1, 2, 0, 27, 0, 31, 0, 39, 0, 74, 0,202, 1, 5, 0,
-202, 1, 0, 0,202, 1, 1, 0, 4, 0, 17, 0, 4, 0, 19, 0, 0, 0, 20, 0,203, 1, 6, 0,202, 1,133, 11, 32, 0, 44, 0,
- 4, 0,134, 11, 7, 0,135, 11, 4, 0,136, 11, 4, 0, 86, 9,204, 1, 3, 0,202, 1,133, 11, 4, 0,134, 11, 7, 0,137, 11,
-205, 1, 8, 0,202, 1,133, 11, 32, 0, 44, 0, 7, 0, 64, 1, 7, 0,138, 11, 7, 0, 12, 3, 7, 0,243, 8, 4, 0,134, 11,
- 4, 0,139, 11,206, 1, 5, 0,202, 1,133, 11, 7, 0,140, 11, 7, 0, 69, 8, 7, 0,237, 2, 7, 0, 56, 0,207, 1, 3, 0,
-202, 1,133, 11, 7, 0,243, 8, 7, 0,141, 11,150, 1, 4, 0, 7, 0,142, 11, 7, 0,169, 10, 2, 0,143, 11, 2, 0, 69, 1,
-208, 1, 14, 0,208, 1, 0, 0,208, 1, 1, 0, 12, 0,144, 11, 12, 0,145, 11, 12, 0,146, 11, 0, 0, 20, 0, 4, 0, 31, 0,
- 4, 0, 19, 0, 4, 0,147, 11, 7, 0,148, 11, 4, 0,136, 11, 4, 0, 86, 9, 7, 0,251, 3, 7, 0,239, 2,157, 1, 23, 0,
- 4, 0,134, 11, 4, 0,149, 11, 7, 0,150, 11, 7, 0, 56, 0, 7, 0,151, 11, 7, 0,235, 2, 7, 0,142, 11, 7, 0,152, 11,
- 7, 0,214, 2, 7, 0, 49, 10, 7, 0,128, 4, 7, 0,153, 11, 7, 0,154, 11, 7, 0,155, 11, 7, 0,156, 11, 7, 0,157, 11,
- 7, 0,158, 11, 7, 0,159, 11, 7, 0,160, 11, 7, 0,161, 11, 7, 0,162, 11, 7, 0,163, 11, 12, 0,164, 11,121, 0, 40, 0,
-120, 0,165, 11,209, 1,125, 10, 66, 0,166, 11, 66, 0,198, 10, 66, 0,167, 11,210, 1,168, 11, 48, 0,162, 0, 48, 0,169, 11,
- 48, 0,170, 11, 7, 0,171, 11, 7, 0,172, 11, 7, 0,173, 11, 7, 0,174, 11, 7, 0,175, 11, 7, 0, 98, 9, 7, 0,176, 11,
- 7, 0,158, 1, 7, 0,177, 11, 4, 0,178, 11, 4, 0,179, 11, 4, 0,180, 11, 4, 0, 90, 0, 4, 0, 37, 0, 4, 0,181, 11,
- 2, 0,182, 11, 2, 0,183, 11, 4, 0,184, 11, 7, 0,214, 2, 4, 0,185, 11, 7, 0,186, 11, 4, 0,187, 11, 4, 0,188, 11,
- 4, 0,189, 11,137, 0,190, 11, 12, 0,191, 11,173, 0, 65, 4, 4, 0,192, 11, 7, 0,193, 11, 7, 0,194, 11, 4, 0, 69, 0,
-122, 0, 12, 0,120, 0,165, 11,148, 0, 32, 3, 7, 0,125, 1, 7, 0, 98, 9, 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11,
- 2, 0,198, 11, 2, 0,199, 11, 2, 0,200, 11, 2, 0, 17, 0, 4, 0, 90, 0,123, 0, 13, 0,120, 0,165, 11,139, 0, 9, 3,
-141, 0, 11, 3, 7, 0, 25, 9, 7, 0,201, 11, 7, 0,202, 11, 7, 0, 66, 1, 7, 0,203, 11, 4, 0,120, 9, 4, 0, 7, 3,
- 2, 0, 17, 0, 2, 0, 37, 0, 4, 0, 69, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0, 42,115, 99,101,110,101, 0,
+102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,
+109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,
+115, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0, 42,114,
+101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101,110,100,101,
+114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,
+103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0,
+ 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,
+114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,
+112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,112,120, 0, 97,
+115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,
+112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114,111,106,120,
+ 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101,
+ 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112,116,
+111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111,117,
+116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114, 0,103, 0, 98,
+ 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, 0,
+100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114,102,
+ 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105,116,
+102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, 99,
+ 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99,111,
+108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101,102,
+108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, 0,
+107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,108,105,102,101,102,
+ 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97, 99, 0,115,104, 97,100,111,
+119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110,100,102, 97,
+ 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, 97,
+109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, 0,
+ 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, 97,
+110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105,111,
+110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, 52,
+ 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97,108,
+101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, 97,
+115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102,116,
+110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105,110,
+116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0,111,
+ 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110,116,
+ 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111,105,
+115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, 91,
+ 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, 97, 0,114,
+101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, 0,
+101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112,108,105,101,
+114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42,
+100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,
+114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105,111,110, 0,
+114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109,
+103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101,
+116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108,
+101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120,
+112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104,
+ 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115,
+ 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112,
+120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, 0,120,114,
+101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0,
+105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, 42,112,100,
+ 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116,
+ 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,
+115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121,
+ 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,
+116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,
+101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0,112, 97,100, 53, 91,
+ 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101,114,116,121,
+112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, 95,
+115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97,114,
+101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97,114,
+101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95,109,
+101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,
+102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,
+114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,
+115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110,
+ 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115,
+ 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,
+102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,
+101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108,111,114,115,112, 97,
+ 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,
+112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97,116,116,101,114,
+105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,116,
+114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111,110, 95, 99,111,
+108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116,111,102,102, 0,
+ 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100,101,102,108, 97,
+103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117,116,105,111,110,
+ 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105,116,121, 0,109,
+115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101,
+ 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98,
+ 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,
+109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,
+116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,109,105,114, 0,102,114,101,
+115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101,108, 95,116,
+114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,
+114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100,
+ 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, 97,109,112,
+ 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,
+116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,
+111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,
+115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,
+105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115,117, 98,115,
+105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, 97,110,100,
+ 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110,111,114, 0,
+115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115,116,114, 97,
+110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,
+108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97,
+ 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101,114, 0,115,
+112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,
+109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,
+112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,
+109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,
+115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,
+101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, 0,102,104,
+100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100,105,117,115,
+ 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,
+108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99,
+ 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0,115,115,115,
+ 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,100, 52, 0,103,112,117,109,
+ 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, 49, 0,105,
+ 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,122, 0,113,117, 97,116, 91, 52,
+ 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116,
+ 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109,
+ 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,
+105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,
+108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,
+101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,
+114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118,
+ 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,
+105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,117,114, 98,
+115, 0, 42,107,101,121,105,110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,
+114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,
+101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,
+109,111,100,101, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99, 97,108,
+101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,
+116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,
+108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,
+115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,
+108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,
+115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,
+102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,
+112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,
+108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0,101,
+102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,
+114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0,
+ 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104, 0,118,
+100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101,
+ 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,117, 98,
+101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,
+118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,117,118,
+ 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112,
+ 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,
+104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111,
+ 91, 51, 93, 0,112, 97,100, 91, 50, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105,
+ 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,
+109,105,100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115,
+ 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,
+110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,
+118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101,
+ 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97,
+ 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114,
+ 0,109,111,100,105,102,105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,
+115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54,
+ 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0,
+ 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,
+102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,
+101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,
+116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,
+116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,
+102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112,
+ 95,110, 97,109,101, 91, 51, 50, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,
+109,101, 0, 42,116,101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,
+105,100,108,101,118,101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,
+118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,
+106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,
+115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,
+112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,
+106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,
+110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,
+102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,
+101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93,
+ 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,
+114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,
+108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120,
+ 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,
+101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,
+115, 0,110,117,109,102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,
+111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,
+105,100,115,105,122,101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,
+101,116,115, 0, 42, 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,
+110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,
+112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,
+121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,
+101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,
+115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,
+101, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,
+112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,
+116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84,
+ 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,
+104,114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117,
+ 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116,
+ 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101,
+ 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,
+111, 98, 95, 97,120,105,115, 0,115,116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,
+115, 99,114,101,119, 95,111,102,115, 0, 97,110,103,108,101, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,
+115,117, 0,111,112,110,116,115,118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,
+101,119, 0,102,117, 0,102,118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105,
+ 99,101,100, 97,116, 97, 0,108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101,
+ 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114,
+ 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,
+120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,
+105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,
+116,104, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,
+100,105,102,105,101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,
+116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,
+111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,
+105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52,
+ 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,
+116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,
+117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99,
+ 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110,
+ 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,
+109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,
+103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97,
+ 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116,
+ 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,
+121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,
+114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91,
+ 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,
+111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110,
+ 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,
+112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,
+102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,102,
+108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,
+101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,
+105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,
+116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,
+105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,
+109, 97,116,101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116,
+ 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,
+107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112,
+ 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,
+105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,
+100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,
+101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,
+101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,
+115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112,
+ 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,
+109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,
+115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91,
+ 51, 93, 0,116,111,116,100, 97,116, 97, 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,
+121,112,101,115, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,101,120,116,114, 97,100, 97,116, 97, 0,
+115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,
+101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0, 99,111,109,112,114,101,115,115,105,
+111,110, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54,
+ 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42, 99, 97, 99,104,101,100, 95,102,114, 97,109,101,115, 0,109,101,109, 95,
+ 99, 97, 99,104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,
+105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,
+112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,
+111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107,
+ 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95,
+ 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,
+107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,
+110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,
+105,110,103, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,
+115,103, 95,108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100,
+ 86, 71, 95, 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,
+109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,
+108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,
+101,114,116,103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,
+122,122,121,110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71,
+ 95, 83,112,114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,
+108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121,
+ 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98,
+ 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,
+111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,
+115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,
+114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,
+116,111,114, 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,
+115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,
+118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,
+105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,
+101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,
+117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,
+110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,
+110,105,109, 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109,
+ 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122,
+ 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,
+117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,
+122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,
+111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,
+114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,
+114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,
+114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102,
+ 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115,
+ 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0,
+ 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,
+101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,
+108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,
+109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103,
+ 0,122,101,110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101,
+ 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,
+111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,
+121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112,
+ 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,
+115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,
+115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116,
+ 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,
+102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,
+102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,
+112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,
+ 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,
+111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,
+101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50,
+ 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115,
+ 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,
+112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115,
+ 0,112, 97,100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,
+108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101,
+ 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117,
+ 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,
+119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50,
+ 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110,
+ 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,
+117, 97,108,105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,
+116,104, 0, 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105,
+ 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121,
+ 70,114, 97,109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101,
+ 0, 97,117,100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,
+117,100,105,111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,
+105,111, 66,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114,
+ 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0,
+ 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,
+101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120,
+ 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,
+105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114,
+ 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,
+105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,
+112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0,
+ 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,
+111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109,
+ 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,
+108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,
+101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,
+102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,
+112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,
+115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,117,
+ 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,100,
+ 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,115,
+ 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,
+101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116,
+ 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97,
+ 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,
+115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,
+112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114,
+ 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0,
+ 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,
+115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,
+115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,117,
+102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116,
+ 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93,
+ 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,
+101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,
+102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,
+121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,
+101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,
+110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116,
+ 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,
+101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0,
+ 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,101,
+114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120,
+ 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116, 0,
+ 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,114,116, 50, 0,100,
+111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,
+109,101,114, 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95,
+ 99,117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,
+111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0,
+ 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116,
+ 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,
+114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,
+116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91,
+ 51, 93, 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,
+108, 97,115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,
+100, 95,115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,
+111,114,101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,
+117,114,101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,
+105,111,110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,
+112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,
+101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,
+100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,
+114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,
+115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,
+117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110,
+ 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,
+118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101,
+ 0,117,118, 95,112, 97,100, 0,103,112,101,110, 99,105,108, 95,102,108, 97,103,115, 0, 97,117,116,111,105,107, 95, 99,104, 97,
+105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,
+111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,
+114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,
+101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,
+101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116,
+ 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,
+108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,
+115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,
+101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,
+107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,
+111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,
+103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,
+114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116,
+ 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,
+111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,
+112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,
+101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,
+111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,
+118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,
+103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,
+103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,
+103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112,
+ 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,
+111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,
+111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,
+105,110,116, 95,115,101,116,116,105,110,103,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,
+100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,
+111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,
+105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,
+101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,
+115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,115,121,115,116,101,109, 95,114,111,116, 97,116,
+105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,112, 0,
+ 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116,
+ 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,
+109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 42,101,
+100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,
+110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,
+100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111,117,110,100, 95,115, 99,114,117, 98, 95,104, 97,110,100,
+108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,
+100, 97,103,102,108, 97,103,115, 0,112, 97,100, 54, 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,
+115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,
+101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,
+118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,
+109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111,
+ 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93,
+ 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121,
+ 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97,
+103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112,
+ 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,
+105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115,
+ 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,
+115,112, 0,108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,
+102, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,
+101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,
+101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101,
+ 95, 98,111,110,101, 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,111, 98, 95, 99,101,110,116,114,101, 95, 99,117,114,
+115,111,114, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,
+103,114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103,
+ 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,
+116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 97,102,116,101,114,100,114, 97,119, 95,116,
+114, 97,110,115,112, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,
+114, 97,121,116,114, 97,110,115,112, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,
+102,102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116,
+ 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,
+109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116,
+ 0,107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,
+121, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97,
+ 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0,114,112,116, 95,109, 97,115,107, 0,118, 50,100, 0, 42, 97,100,115, 0,
+103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109,
+ 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,
+114,101,118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,
+114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109,
+ 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110,
+ 97,109,101,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101,101,100,105,116, 91, 56, 48, 93, 0,102,105,108,116,101,
+114, 95,103,108,111, 98, 91, 54, 52, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,
+111,111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,
+112, 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,
+115, 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,
+110,101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,
+121,111,117,116, 0,114,101, 99,101,110,116,110,114, 0, 98,111,111,107,109, 97,114,107,110,114, 0,115,121,115,116,101,109,110,
+114, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,105,110,103, 91,
+ 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,
+108, 97,103, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0, 42, 99,117,109, 97,112, 0,115, 99,111,112,101,115, 0,115,
+ 97,109,112,108,101, 95,108,105,110,101, 95,104,105,115,116, 0, 99,117,114,115,111,114, 91, 50, 93, 0, 99,101,110,116,120, 0,
+ 99,101,110,116,121, 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,114, 0,108,111, 99,107, 0,112,105,110, 0,
+100,116, 95,117,118, 0,115,116,105, 99,107,121, 0,100,116, 95,117,118,115,116,114,101,116, 99,104, 0, 42,116,101,120,116, 0,
+116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,109,101,110,117,110,114, 0,108,104,101,105,103,104,116, 0, 99,119,105,
+100,116,104, 0,108,105,110,101,110,114,115, 95,116,111,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115,
+ 0,116, 97, 98,110,117,109, 98,101,114, 0,115,104,111,119,115,121,110,116, 97,120, 0,108,105,110,101, 95,104,108,105,103,104,
+116, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,
+110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,
+108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50,
+ 53, 54, 93, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,
+116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107,
+ 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,
+110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116,
+ 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,
+105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,
+110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,
+114,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,
+116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,
+111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,114,
+101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40,
+ 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,
+102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0,
+ 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,115,
+ 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,
+110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,
+116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,110,100,110,114, 0,102,105,108,101,110,
+ 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95,108,
+ 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97,100,
+111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100,111,
+119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105,100,
+103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, 98,
+101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, 97,
+ 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111,110,
+115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0,112,
+ 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110,101,
+114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, 52,
+ 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115,104,
+ 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,110,101,114, 95, 97,110,105,109, 91, 52,
+ 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, 93,
+ 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, 52,
+ 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,119, 99,111,108, 95,114,101,103,117,108,
+ 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,
+111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,
+117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108,
+ 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,
+110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,
+108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,
+116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91,
+ 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,
+105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,
+120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91,
+ 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105,
+ 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,
+101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,
+112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,
+101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52,
+ 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101,
+ 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93,
+ 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,
+114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93,
+ 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,
+101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95,
+ 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93,
+ 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,101,120,116,114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,
+120,116,114, 97, 95,102, 97, 99,101, 95, 97,110,103,108,101, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,
+101, 97, 91, 52, 93, 0,112, 97,100, 51, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,
+111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101,
+ 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114,
+ 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91,
+ 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91,
+ 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,
+110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111,
+ 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91,
+ 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108,
+ 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,
+108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115,
+ 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,111,117,116,112,117,116, 91, 52, 93,
+ 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,102,111, 91, 52,
+ 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95, 99,117,114,115,111,
+114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112,
+ 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116,
+ 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,
+105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93,
+ 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91,
+ 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,
+110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,
+101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 55,
+ 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116,
+ 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,
+116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116,
+ 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116,117,115,101,114,112,
+114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,
+109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108,
+ 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114,
+ 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54,
+ 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54,
+ 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0,
+105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 50, 52,
+ 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,
+105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100,
+ 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,
+101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102,
+ 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101,
+ 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,
+110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,
+116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115,
+ 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115,
+ 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,
+109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,
+100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116,
+ 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91,
+ 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,
+105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,
+116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111,108,100,
+ 0,109,101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114,
+ 97,109,101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,
+110,116,101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,
+116, 95,102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116,
+ 0,110,100,111,102, 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,
+111,108,111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,
+108,101,115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,
+ 97,100, 56, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49,
+ 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0,116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57,
+ 0,112, 97,100, 49, 48, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,
+111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0,118,101,114,116, 98, 97,
+115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,
+117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,
+104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,
+117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,
+115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116,
+ 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,
+121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114,
+ 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121,
+ 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,
+110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100,
+ 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108,
+ 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114,
+ 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,
+101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0,
+ 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,
+100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111,
+118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,
+114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,
+105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,
+110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115,
+ 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105,111,110, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,
+110, 97,109,101, 91, 56, 48, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103, 95,104,101,105,103,104,116, 0,
+ 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103,
+ 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116,
+ 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0, 42, 99,114,
+111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,105,110,
+115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,
+105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,
+109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,
+108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,
+115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,
+102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0,
+ 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,109,
+117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116,
+ 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,
+100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,
+112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,
+115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,
+105,114, 91, 50, 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,
+102,108, 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,
+114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,
+100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105,
+ 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120,
+ 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110,
+ 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114,
+ 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,
+101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,
+114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,
+105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,
+118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,
+109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112,
+ 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,
+118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,
+112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,110,114, 0,117,115,101,100,
+ 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,
+108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91,
+ 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,
+118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,
+108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93,
+ 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,
+108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116,
+ 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,
+101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,
+110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,
+116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119,
+ 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,
+115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,
+101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,
+120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,
+105,110, 0,114,101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110,
+ 99,101, 0,114,111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,
+108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103,
+ 97,105,110, 0,112, 97,100, 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49,
+ 93, 0, 42,109,101, 0,108,105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121,
+ 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,
+101,108,111, 99, 91, 51, 93, 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,
+116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,
+110, 99,101, 0,109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,
+120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,
+114,111,112, 91, 51, 50, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,
+111,110, 0,105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103,
+ 95, 49, 0,102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,
+111, 79, 98,106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111,
+ 97,100, 97,110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,
+ 42,115,117, 98,116, 97,114,103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,
+101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97,
+ 99,107, 95,104, 97,110,100,108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105,
+ 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,
+100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,
+104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52,
+ 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,
+104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101,
+ 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,
+101,116, 99,104, 0,108, 97,121,101,114, 95,117,115,101,100, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,
+103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,
+115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,
+101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,
+114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102,
+ 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,
+111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,
+116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,
+108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104,
+ 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0,
+ 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42,
+ 99,117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,
+116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100,
+ 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,
+105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,
+105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 99,104, 97,110, 98, 97,115,101,
+ 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,
+102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115,
+ 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,
+105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,
+101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,
+114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,
+115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,
+114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,
+116,101,114, 95,103,114,112, 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101,
+ 0, 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101,
+ 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,
+101,114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,
+116, 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115,
+ 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,
+112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,
+110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115,
+ 0, 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,
+114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101,
+ 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,
+112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,
+112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120,
+ 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,
+111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,
+111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,
+116, 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51,
+ 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,
+100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,
+108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108,
+ 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,
+117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,
+111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,
+115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,
+100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,
+110,111,100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,
+119,105,100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,
+115,116,111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97,
+ 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111,
+ 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,
+101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,
+116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,
+111,119,110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,
+115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116,
+ 98,104, 0, 42,112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,
+115, 0,109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114,
+ 99,101,110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,
+110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120,
+ 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,
+115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,
+116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,
+101,108, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99,
+ 95,121, 49, 0,102, 97, 99, 95,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,
+116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,
+117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115,
+ 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,
+105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,
+102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110, 0,117,
+110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,103, 0,
+117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101,
+ 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97,
+ 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,100, 95,
+116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107,
+ 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,
+120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91,
+ 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,
+115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,
+121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,
+101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,
+101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51,
+ 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95,
+ 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109,
+ 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,110, 95,
+105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,105, 99,111,110, 95,109,111,
+100,101, 0,110,111,114,109, 97,108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,
+115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,
+107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,
+110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,
+101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97,117,116,
+111,115,109,111,111,116,104, 95,102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,
+111,114, 0,112,108, 97,110,101, 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,
+115, 0,116,101,120,116,117,114,101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,
+116,101,100, 95,114, 97,100,105,117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93,
+ 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,
+109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,
+111,116,115,105,122,101, 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,
+116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,114,101,
+115,116, 95,108,101,110,103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105,110,100,101,120, 91, 50, 93, 0,100,101,108,101,
+116,101, 95,102,108, 97,103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,
+118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104,
+ 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,
+105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, 97,115,116,105, 99,105,
+116,121, 95, 99,111,110,115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,118,105,115, 99,111,115,105,116,
+121, 95,111,109,101,103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115,
+ 95,107, 0,115,116,105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0,
+ 98,117,111,121, 97,110, 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,
+115,116,121,112,101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114,
+ 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115,
+ 0,115,117, 98,102,114, 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,
+121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,
+116,102,114,111,109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,
+115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98,
+ 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,
+115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,
+105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,
+112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,
+114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,
+114,101, 97, 99,116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102,
+ 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,
+105,122,101, 0,114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,
+111,119,110,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,
+110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,
+105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,
+102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0,107,105,110,107, 95, 97,109,112,
+ 95, 99,108,117,109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50,
+ 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,
+101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,
+103,116,104, 95,116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97,114,116,105,110,103, 95,109,105,
+110, 0,112, 97,114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,
+108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,
+108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115,
+ 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0,
+ 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,
+104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,
+104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,
+117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,
+114, 97,109,101, 0, 99,104,105,108,100, 95,115,101,101,100, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,
+101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,
+107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93,
+ 0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,
+116, 97, 0, 42,101,102,102,101, 99,116,111,114,115, 0, 42,102,108,117,105,100, 95,115,112,114,105,110,103,115, 0,116,111,116,
+ 95,102,108,117,105,100,115,112,114,105,110,103,115, 0, 97,108,108,111, 99, 95,102,108,117,105,100,115,112,114,105,110,103,115,
+ 0, 42,116,114,101,101, 0, 42,112,100,100, 0, 42,102,114, 97,110,100, 0, 67,100,105,115, 0, 67,118,105, 0,115,116,114,117,
+ 99,116,117,114, 97,108, 0, 98,101,110,100,105,110,103, 0,109, 97,120, 95, 98,101,110,100, 0,109, 97,120, 95,115,116,114,117,
+ 99,116, 0,109, 97,120, 95,115,104,101, 97,114, 0, 97,118,103, 95,115,112,114,105,110,103, 95,108,101,110, 0,116,105,109,101,
+115, 99, 97,108,101, 0,101,102,102, 95,102,111,114, 99,101, 95,115, 99, 97,108,101, 0,101,102,102, 95,119,105,110,100, 95,115,
+ 99, 97,108,101, 0,115,105,109, 95,116,105,109,101, 95,111,108,100, 0,118,101,108,111, 99,105,116,121, 95,115,109,111,111,116,
+104, 0, 99,111,108,108,105,100,101,114, 95,102,114,105, 99,116,105,111,110, 0,115,116,101,112,115, 80,101,114, 70,114, 97,109,
+101, 0,112,114,101,114,111,108,108, 0,109, 97,120,115,112,114,105,110,103,108,101,110, 0,115,111,108,118,101,114, 95,116,121,
+112,101, 0,118,103,114,111,117,112, 95, 98,101,110,100, 0,118,103,114,111,117,112, 95,109, 97,115,115, 0,118,103,114,111,117,
+112, 95,115,116,114,117, 99,116, 0,115,104, 97,112,101,107,101,121, 95,114,101,115,116, 0,112,114,101,115,101,116,115, 0,114,
+101,115,101,116, 0, 42, 99,111,108,108,105,115,105,111,110, 95,108,105,115,116, 0,101,112,115,105,108,111,110, 0,115,101,108,
+102, 95,102,114,105, 99,116,105,111,110, 0,115,101,108,102,101,112,115,105,108,111,110, 0,115,101,108,102, 95,108,111,111,112,
+ 95, 99,111,117,110,116, 0,108,111,111,112, 95, 99,111,117,110,116, 0,112,114,101,115,115,117,114,101, 0,116,104,105, 99,107,
+110,101,115,115, 0,115,116,114,111,107,101,115, 0,102,114, 97,109,101,110,117,109, 0, 42, 97, 99,116,102,114, 97,109,101, 0,
+103,115,116,101,112, 0,105,110,102,111, 91, 49, 50, 56, 93, 0,115, 98,117,102,102,101,114, 95,115,105,122,101, 0,115, 98,117,
+102,102,101,114, 95,115,102,108, 97,103, 0, 42,115, 98,117,102,102,101,114, 0,108,105,115,116, 0,112,114,105,110,116,108,101,
+118,101,108, 0,115,116,111,114,101,108,101,118,101,108, 0, 42,114,101,112,111,114,116,116,105,109,101,114, 0, 42,119,105,110,
+100,114, 97,119, 97, 98,108,101, 0, 42,119,105,110, 97, 99,116,105,118,101, 0,119,105,110,100,111,119,115, 0,105,110,105,116,
+105, 97,108,105,122,101,100, 0,102,105,108,101, 95,115, 97,118,101,100, 0,111,112, 95,117,110,100,111, 95,100,101,112,116,104,
+ 0,111,112,101,114, 97,116,111,114,115, 0,113,117,101,117,101, 0,114,101,112,111,114,116,115, 0,106,111, 98,115, 0,112, 97,
+105,110,116, 99,117,114,115,111,114,115, 0,100,114, 97,103,115, 0,107,101,121, 99,111,110,102,105,103,115, 0, 42,100,101,102,
+ 97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,101,114, 0, 42,
+103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,115, 99,114,101,101,110, 0, 42,110,101,119,
+115, 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,
+119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,
+100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110,
+ 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,
+119,100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,
+101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,
+116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,
+116,121,112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100,
+ 0,107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98,
+ 97,115,101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116,
+ 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,
+112,109, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,
+115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101,
+ 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118,
+ 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,
+102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121,
+ 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,
+112, 95,115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,
+116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,
+116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54,
+ 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,
+110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50,
+ 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,
+112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,
+120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,
+121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,
+118,101, 95,112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,
+116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,
+109,111,100,101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,
+101, 0,114,117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,
+108, 95,105,100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,
+122,101, 0,119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,
+116, 97,116,101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115,
+ 0,114,117,108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,
+116, 95,115,116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,
+110,107,105,110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,
+105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120,
+ 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,
+112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,
+ 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,
+112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,
+100, 0, 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,
+116,101,120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93,
+ 0,112, 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115,
+ 91, 51, 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,
+110,111,105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,
+115, 95,119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0,
+ 99, 97, 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,
+112,116, 99, 97, 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,
+109,101, 95,115, 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,
+101,108, 95,109,117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,
+117,112, 95,102,108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101,
+ 97,116, 0, 42,112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52,
+ 93, 0, 0, 0, 84, 89, 80, 69,203, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,
+111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,
+118,111,105,100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,
+115, 0,118,101, 99, 50,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, 97,116, 97,
+ 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97,116, 97, 0,
+ 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,
+111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75,101,121, 66,
+108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77,
+ 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,
+103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,
+105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,
+101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102,
+ 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68, 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,
+101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 86,
+111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,
+110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, 77,
+101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 69,100,
+105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,
+100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0,
+ 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,
+105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97,
+ 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,
+111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112,
+ 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0,
+ 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,
+105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101,
+ 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,
+114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,
+105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,
+114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116,
+ 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114,
+ 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,
+116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
+ 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,
+119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,
+108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,
+101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,
+116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
+ 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,
+114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,
+111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,
+111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,
+116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,
+105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0,
+ 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,
+101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116,
+ 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,
+116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,
+102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,
+116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,
+101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114,
+ 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,
+105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,
+105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,
+112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 98, 71,
+ 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,110, 80, 97,
+116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,
+102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71, 0, 69,102,
+102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 69,120,116,114, 97, 0, 80, 84, 67, 97, 99,
+104,101, 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,
+111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0,
+ 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99,
+ 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,
+101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,
+114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0,
+ 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,
+109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,
+101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,
+108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,
+105,111,110, 0, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98,
+ 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,
+103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0,
+ 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,
+116,111,112,111, 86,105,101,119, 68, 97,116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,
+101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107,
+ 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101,
+ 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,
+101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,
+112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,
+101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0,
+ 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,
+101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101,
+ 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,
+111,103,105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97,
+ 99,101, 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,
+110,100, 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,
+116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,
+100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97,
+ 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0,
+ 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101,110, 0, 83, 99,114, 86,101,
+114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,
+111,117,116, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,
+101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112,
+ 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,
+101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,
+117,101,110, 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,
+115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,
+112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0,
+ 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,
+116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117,
+ 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,
+116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,
+101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,
+115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,
+109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,
+115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0,
+ 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,
+117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110,
+ 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0,
+ 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,
+111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117,
+ 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,
+114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117,
+ 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,
+117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65,
+ 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,
+101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,
+116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,
+114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,
+110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,
+112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,
+110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,
+115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,
+110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116,
+ 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,
+115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,109,
+101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,115,
+116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112,
+ 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,116,
+114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,
+109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,
+110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,
+114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65,
+ 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,
+116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,117,
+105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,
+111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,
+108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,
+109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,
+111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,
+114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105,
+ 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,
+115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,114,
+115,112,105,108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,
+116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97,
+ 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121,
+ 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,
+116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,112,114,105,110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0,
+ 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,
+104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115,
+ 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80,
+ 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,
+114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,
+115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,
+116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,
+109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,
+109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65,
+ 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105,102,105,
+101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111,110, 71,
+101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, 95, 69,
+110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111,110, 0,
+ 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116,101,112,
+112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110,
+101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,
+105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0,
+ 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,
+100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111,
+ 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,
+111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114,
+ 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101,
+ 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0,
+ 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 16, 0, 16, 0, 32, 0,
+ 96, 0, 72, 0, 72, 2, 0, 0, 40, 0,144, 0,208, 4,112, 0, 36, 0, 56, 0,112, 0,128, 0,168, 0, 96, 0, 40, 0, 48, 0,
+176, 0, 16, 0,136, 0, 40, 0, 8, 6,240, 1, 0, 0, 0, 0, 0, 0, 16, 1,112, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0,
+ 88, 0, 40, 1,240, 0,136, 0,216, 1, 64, 1, 88, 0, 32, 3,104, 0, 88, 1, 0, 0,128, 0,104, 0,208, 0, 80, 0, 8, 0,
+ 16, 0, 32, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0,176, 1, 20, 0, 48, 0, 64, 0, 24, 0, 12, 0, 16, 0, 4, 0, 8, 0,
+ 8, 0, 0, 0, 40, 0,128, 0, 48, 0, 8, 0, 16, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 16, 0, 16, 0, 64, 0,
+ 24, 0, 12, 0, 64, 0, 80, 0,104, 0,120, 0,128, 0, 96, 0,128, 0,160, 0, 96, 0, 88, 0,136, 0, 88, 0,112, 0, 16, 1,
+ 56, 0,192, 0,184, 0,232, 0, 88, 0,120, 0,136, 0,224, 0,136, 0,248, 0, 80, 0,136, 0, 0, 0,152, 0, 40, 0, 16, 2,
+160, 0, 0, 0,120, 0, 0, 0, 0, 0, 96, 0, 8, 0, 8, 0, 48, 1,112, 0, 0, 2,104, 0, 96, 0, 88, 0, 96, 0,200, 1,
+144, 0,136, 0, 80, 0,136, 0,112, 0, 16, 0, 16, 1, 48, 0, 0, 0,144, 0,176, 0,104, 0, 48, 0, 24, 0,120, 0,152, 0,
+120, 1,224, 0,192, 0, 0, 0, 72, 0, 32, 0,176, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,224, 1, 40, 0,184, 0,152, 0,
+ 64, 0, 64, 0, 24, 0, 88, 0, 0, 4, 64, 0, 24, 0, 16, 0,104, 0, 96, 0, 24, 0,240, 2, 48, 0, 16, 0,168, 0, 88, 0,
+ 96, 0, 56, 0,192, 1, 32, 0, 8, 0, 24, 0, 80, 2, 0, 0, 0, 0, 88, 0,104, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 72, 1, 56, 0,144, 0, 64, 0,240, 0, 40, 0,248, 0,240, 0, 96, 2,104, 0, 0, 0,168, 0, 0, 0, 24, 1, 16, 0, 16, 0,
+ 40, 33,128, 16, 24, 16,216, 0,152, 2,120, 2, 64, 0, 24, 0,216, 0, 32, 1, 72, 0,200, 2, 40, 0,136, 1,104, 0,216, 0,
+160, 0,136, 1, 24, 1, 32, 0,232, 0, 32, 0, 32, 0,112, 2,120, 1, 16, 0, 88, 30, 80, 0, 56, 0,112, 13,208, 0, 32, 0,
+ 40, 0, 88, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 32, 1, 88, 0, 16, 0, 8, 0, 44, 0, 0, 1,240, 0,200, 1, 32, 1,
+ 32, 0, 12, 0, 24, 0, 52, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, 64, 0, 48, 0, 8, 0, 48, 0, 72, 0,
+104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 72, 0, 96, 0,104, 0, 60, 0,128, 0, 80, 0, 80, 0, 16, 0,
+ 96, 0, 32, 0, 72, 0, 88, 0, 24, 0, 80, 0,112, 0, 84, 0, 32, 0, 96, 0, 56, 0, 56, 0,112, 0,140, 0, 4, 0, 24, 0,
+ 16, 0, 8, 0, 88, 0, 40, 0, 40, 1,200, 0, 16, 0,248, 1, 4, 0, 40, 0,120, 0, 0, 1, 88, 0, 56, 0, 88, 0,128, 0,
+ 80, 0,120, 0, 24, 0, 56, 0, 48, 0, 48, 0, 48, 0, 8, 0, 40, 0, 72, 0, 72, 0, 48, 0, 48, 0, 24, 0, 56, 0,104, 0,
+ 16, 0,112, 0, 96, 0, 56, 0, 28, 0, 28, 0, 28, 0, 56, 0, 24, 0, 72, 0,168, 0, 40, 0,144, 0, 56, 0,232, 0, 0, 0,
+ 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 44, 0, 24, 0, 8, 0, 64, 0, 32, 0, 24, 0, 16, 0, 24, 0,
+ 32, 0, 8, 0, 96, 0, 20, 0, 32, 0, 12, 0, 56, 0, 24, 0, 72, 0,240, 0, 24, 0, 56, 0, 56, 0, 20, 0, 16, 0, 64, 0,
+ 40, 0, 32, 0,192, 0, 52, 0, 32, 2,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 24, 1,
+224, 0,168, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0,120, 0, 0, 0,104, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, 16, 0,
+ 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, 16, 0,104, 0, 0, 1, 40, 0,200, 0,104, 0,112, 0,168, 0, 32, 0, 80, 0,
+ 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,144, 1, 0, 0, 10, 0, 2, 0,
+ 10, 0, 0, 0, 10, 0, 1, 0, 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0,
+ 9, 0, 4, 0, 13, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 4, 0,
+ 4, 0, 7, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 16, 0, 4, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
+ 7, 0, 10, 0, 17, 0, 4, 0, 9, 0, 11, 0, 12, 0, 12, 0, 4, 0, 13, 0, 4, 0, 14, 0, 18, 0, 10, 0, 18, 0, 0, 0,
+ 18, 0, 1, 0, 0, 0, 15, 0, 0, 0, 16, 0, 2, 0, 17, 0, 0, 0, 18, 0, 4, 0, 19, 0, 17, 0, 20, 0, 4, 0, 21, 0,
+ 4, 0, 22, 0, 19, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 19, 0, 23, 0, 20, 0, 24, 0, 0, 0, 25, 0, 2, 0, 26, 0,
+ 2, 0, 17, 0, 4, 0, 27, 0, 18, 0, 28, 0, 20, 0, 8, 0, 19, 0, 29, 0, 19, 0, 30, 0, 21, 0, 31, 0, 0, 0, 32, 0,
+ 0, 0, 33, 0, 4, 0, 34, 0, 4, 0, 35, 0, 20, 0, 36, 0, 22, 0, 5, 0, 4, 0, 37, 0, 4, 0, 38, 0, 2, 0, 39, 0,
+ 2, 0, 40, 0, 4, 0, 41, 0, 23, 0, 6, 0, 24, 0, 42, 0, 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 0, 0, 45, 0, 25, 0, 21, 0, 25, 0, 0, 0, 25, 0, 1, 0, 26, 0, 46, 0, 27, 0, 47, 0, 16, 0, 48, 0, 16, 0, 49, 0,
+ 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 50, 0, 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 17, 0, 2, 0, 54, 0,
+ 7, 0, 9, 0, 7, 0, 10, 0, 4, 0, 55, 0, 7, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 23, 0, 59, 0, 28, 0, 7, 0,
+ 19, 0, 29, 0, 12, 0, 60, 0, 16, 0, 61, 0, 2, 0, 43, 0, 2, 0, 62, 0, 2, 0, 63, 0, 2, 0, 35, 0, 29, 0, 16, 0,
+ 29, 0, 0, 0, 29, 0, 1, 0, 7, 0, 64, 0, 7, 0, 58, 0, 2, 0, 15, 0, 2, 0, 44, 0, 2, 0, 65, 0, 2, 0, 17, 0,
+ 4, 0, 66, 0, 4, 0, 67, 0, 9, 0, 2, 0, 7, 0, 68, 0, 0, 0, 18, 0, 0, 0, 69, 0, 7, 0, 70, 0, 7, 0, 71, 0,
+ 30, 0, 13, 0, 19, 0, 29, 0, 31, 0, 72, 0, 29, 0, 73, 0, 0, 0, 74, 0, 4, 0, 75, 0, 7, 0, 58, 0, 12, 0, 76, 0,
+ 28, 0, 77, 0, 19, 0, 78, 0, 2, 0, 15, 0, 2, 0, 79, 0, 2, 0, 80, 0, 2, 0, 17, 0, 32, 0, 6, 0, 32, 0, 0, 0,
+ 32, 0, 1, 0, 0, 0, 81, 0, 0, 0, 82, 0, 4, 0, 21, 0, 4, 0, 83, 0, 33, 0, 10, 0, 33, 0, 0, 0, 33, 0, 1, 0,
+ 4, 0, 84, 0, 4, 0, 85, 0, 4, 0, 86, 0, 4, 0, 87, 0, 4, 0, 12, 0, 4, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0,
+ 34, 0, 15, 0, 19, 0, 29, 0, 0, 0, 91, 0, 4, 0, 88, 0, 4, 0, 92, 0, 12, 0, 93, 0, 32, 0, 94, 0, 32, 0, 95, 0,
+ 4, 0, 96, 0, 4, 0, 97, 0, 12, 0, 98, 0, 0, 0, 99, 0, 4, 0,100, 0, 4, 0,101, 0, 9, 0,102, 0, 8, 0,103, 0,
+ 35, 0, 3, 0, 4, 0,104, 0, 4, 0,105, 0, 9, 0, 2, 0, 36, 0, 15, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0,
+ 2, 0, 17, 0, 7, 0,106, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0,
+ 7, 0,113, 0, 7, 0,114, 0, 28, 0, 77, 0, 24, 0,115, 0, 37, 0, 14, 0, 38, 0,116, 0, 4, 0,117, 0, 4, 0,118, 0,
+ 4, 0,119, 0, 4, 0,120, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, 0, 0, 0, 35, 0, 2, 0,124, 0, 2, 0,125, 0,
+ 2, 0,126, 0, 2, 0, 17, 0, 4, 0, 67, 0, 39, 0, 32, 0, 19, 0, 29, 0, 0, 0, 32, 0, 12, 0,127, 0, 40, 0,128, 0,
+ 41, 0,129, 0, 42, 0,130, 0, 42, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,123, 0, 2, 0, 17, 0, 2, 0,134, 0,
+ 2, 0, 15, 0, 4, 0,135, 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0,
+ 4, 0,142, 0, 4, 0,143, 0, 35, 0,144, 0, 22, 0,145, 0, 7, 0,146, 0, 4, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0,
+ 2, 0,150, 0, 2, 0,151, 0, 7, 0,152, 0, 7, 0,153, 0, 43, 0, 63, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0,
+ 2, 0,157, 0, 24, 0,158, 0, 44, 0,159, 0, 0, 0,160, 0, 0, 0,161, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0,
+ 7, 0,165, 0, 7, 0,166, 0, 7, 0,167, 0, 2, 0,168, 0, 2, 0,169, 0, 2, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0,
+ 2, 0,173, 0, 0, 0,174, 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0,
+ 7, 0, 54, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0,
+ 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0,
+ 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0,
+ 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0,
+ 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 45, 0, 15, 0, 0, 0,216, 0, 9, 0,217, 0, 0, 0,218, 0,
+ 0, 0,219, 0, 4, 0,220, 0, 4, 0,221, 0, 9, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 4, 0,226, 0,
+ 9, 0,227, 0, 9, 0,228, 0, 4, 0,229, 0, 4, 0, 35, 0, 46, 0, 6, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0,
+ 7, 0,230, 0, 7, 0, 64, 0, 4, 0, 61, 0, 47, 0, 5, 0, 2, 0, 17, 0, 2, 0, 34, 0, 2, 0, 61, 0, 2, 0,231, 0,
+ 46, 0,225, 0, 48, 0, 17, 0, 24, 0,158, 0, 39, 0,232, 0, 49, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 2, 0, 15, 0,
+ 2, 0,236, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,237, 0, 4, 0,238, 0, 2, 0,239, 0, 2, 0,240, 0, 4, 0,123, 0,
+ 4, 0,135, 0, 2, 0,241, 0, 2, 0,242, 0, 50, 0, 22, 0, 2, 0, 17, 0, 2, 0,243, 0, 7, 0,244, 0, 7, 0,245, 0,
+ 2, 0,134, 0, 2, 0,246, 0, 4, 0,247, 0, 4, 0,248, 0, 24, 0,158, 0, 4, 0,249, 0, 2, 0,250, 0, 2, 0,251, 0,
+ 9, 0,252, 0, 7, 0,253, 0, 7, 0,254, 0, 2, 0,255, 0, 2, 0, 0, 1, 2, 0, 1, 1, 2, 0, 2, 1, 7, 0, 3, 1,
+ 7, 0, 4, 1, 47, 0, 5, 1, 51, 0, 13, 0, 4, 0, 6, 1, 4, 0, 7, 1, 2, 0, 8, 1, 2, 0, 17, 0, 2, 0, 9, 1,
+ 2, 0, 10, 1, 24, 0,158, 0, 7, 0, 11, 1, 4, 0, 12, 1, 0, 0, 13, 1, 7, 0, 14, 1, 4, 0, 15, 1, 4, 0,123, 0,
+ 44, 0, 63, 0, 19, 0, 29, 0, 31, 0, 72, 0, 7, 0, 16, 1, 7, 0, 17, 1, 7, 0, 18, 1, 7, 0, 19, 1, 7, 0, 20, 1,
+ 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 67, 0, 7, 0, 25, 1, 7, 0, 26, 1, 7, 0, 27, 1,
+ 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1,
+ 7, 0, 36, 1, 2, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1, 2, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1,
+ 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,236, 0, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 4, 0, 48, 1,
+ 4, 0, 49, 1, 2, 0, 50, 1, 2, 0, 51, 1, 2, 0, 9, 1, 2, 0,121, 0, 4, 0, 21, 0, 4, 0,118, 0, 4, 0,119, 0,
+ 4, 0,120, 0, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 87, 0, 37, 0, 54, 1, 52, 0, 55, 1, 28, 0, 77, 0, 39, 0,232, 0,
+ 45, 0, 56, 1, 47, 0, 5, 1, 48, 0, 57, 1, 22, 0,145, 0, 50, 0, 58, 1, 51, 0, 59, 1, 0, 0, 60, 1, 0, 0,175, 0,
+ 53, 0, 8, 0, 7, 0, 61, 1, 7, 0, 62, 1, 7, 0,166, 0, 4, 0, 17, 0, 7, 0, 63, 1, 7, 0, 64, 1, 7, 0, 65, 1,
+ 24, 0, 42, 0, 54, 0, 72, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 66, 1, 2, 0,169, 0,
+ 2, 0, 67, 1, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0, 68, 1, 7, 0, 69, 1, 7, 0, 70, 1,
+ 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1,
+ 55, 0, 79, 1, 2, 0,243, 0, 2, 0, 67, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1,
+ 7, 0, 83, 1, 7, 0, 84, 1, 2, 0, 85, 1, 2, 0, 86, 1, 2, 0, 87, 1, 2, 0, 88, 1, 0, 0, 89, 1, 0, 0, 90, 1,
+ 2, 0, 91, 1, 2, 0, 92, 1, 2, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1,
+ 7, 0, 99, 1, 2, 0,100, 1, 2, 0, 87, 0, 2, 0,101, 1, 2, 0,102, 1, 2, 0,103, 1, 2, 0,104, 1, 7, 0,105, 1,
+ 7, 0,106, 1, 7, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1, 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1,
+ 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 2, 0,117, 1, 0, 0,118, 1, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1,
+ 0, 0,121, 1, 22, 0,145, 0, 56, 0, 18, 0, 7, 0,122, 1, 7, 0,123, 1, 7, 0,124, 1, 7, 0,125, 1, 7, 0,126, 1,
+ 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 2, 0,132, 1, 2, 0,133, 1, 2, 0,134, 1,
+ 2, 0,135, 1, 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 57, 0,124, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+ 2, 0,140, 1, 2, 0, 17, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,141, 1, 7, 0,142, 1, 7, 0,143, 1,
+ 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1,
+ 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 7, 0,156, 1, 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1,
+ 7, 0,160, 1, 56, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1,
+ 7, 0,168, 1, 2, 0,169, 1, 2, 0,170, 1, 2, 0,171, 1, 0, 0,172, 1, 0, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1,
+ 2, 0,176, 1, 2, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, 2, 0,182, 1, 2, 0,183, 1,
+ 4, 0, 66, 1, 4, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, 2, 0,187, 1, 2, 0,188, 1, 7, 0,189, 1, 7, 0,190, 1,
+ 7, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1,
+ 0, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 4, 0,203, 1, 0, 0,204, 1, 0, 0,101, 1, 0, 0,205, 1,
+ 0, 0, 60, 1, 2, 0,206, 1, 2, 0,207, 1, 2, 0,120, 1, 2, 0,208, 1, 2, 0,209, 1, 2, 0,210, 1, 7, 0,211, 1,
+ 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 2, 0,154, 0, 2, 0,155, 0, 47, 0,216, 1, 47, 0,217, 1,
+ 0, 0,218, 1, 0, 0,219, 1, 0, 0,220, 1, 0, 0,221, 1, 2, 0,222, 1, 2, 0,223, 1, 7, 0,224, 1, 7, 0,225, 1,
+ 43, 0,119, 1, 52, 0, 55, 1, 28, 0, 77, 0, 58, 0,226, 1, 22, 0,145, 0, 7, 0,227, 1, 7, 0,228, 1, 7, 0,229, 1,
+ 7, 0,230, 1, 7, 0,231, 1, 2, 0,232, 1, 2, 0, 67, 0, 7, 0,233, 1, 7, 0,234, 1, 7, 0,235, 1, 7, 0,236, 1,
+ 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, 2, 0,242, 1, 2, 0,243, 1, 4, 0,244, 1,
+ 4, 0,245, 1, 12, 0,246, 1, 59, 0, 4, 0, 19, 0, 29, 0, 0, 0,247, 1, 60, 0, 2, 0, 35, 0,144, 0, 61, 0, 26, 0,
+ 61, 0, 0, 0, 61, 0, 1, 0, 62, 0,248, 1, 4, 0,249, 1, 4, 0,250, 1, 4, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1,
+ 4, 0,254, 1, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,255, 1, 2, 0, 0, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 1, 2,
+ 7, 0, 2, 2, 7, 0, 3, 2, 7, 0, 4, 2, 7, 0, 5, 2, 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 21, 0,
+ 7, 0, 9, 2, 7, 0, 10, 2, 63, 0, 20, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 11, 2, 12, 0, 12, 2,
+ 12, 0, 13, 2, 28, 0, 77, 0, 57, 0, 14, 2, 0, 0, 17, 0, 0, 0, 15, 2, 2, 0, 16, 2, 2, 0,168, 0, 2, 0, 35, 0,
+ 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0, 17, 2, 7, 0, 18, 2, 7, 0, 19, 2, 61, 0, 20, 2, 27, 0, 11, 0,
+ 7, 0, 21, 2, 7, 0, 22, 2, 7, 0, 23, 2, 7, 0,245, 0, 2, 0, 52, 0, 0, 0, 24, 2, 0, 0, 25, 2, 0, 0, 26, 2,
+ 0, 0, 27, 2, 0, 0, 28, 2, 0, 0, 29, 2, 26, 0, 7, 0, 7, 0, 30, 2, 7, 0, 22, 2, 7, 0, 23, 2, 2, 0, 26, 2,
+ 2, 0, 29, 2, 7, 0,245, 0, 7, 0, 35, 0, 64, 0, 21, 0, 64, 0, 0, 0, 64, 0, 1, 0, 2, 0, 15, 0, 2, 0, 31, 2,
+ 2, 0, 29, 2, 2, 0, 17, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2,
+ 2, 0, 38, 2, 2, 0, 39, 2, 7, 0, 40, 2, 7, 0, 41, 2, 26, 0, 46, 0, 27, 0, 47, 0, 2, 0, 42, 2, 2, 0, 43, 2,
+ 4, 0, 44, 2, 65, 0, 5, 0, 2, 0, 45, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0, 35, 0, 2, 0, 67, 0, 66, 0, 4, 0,
+ 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 46, 2, 7, 0, 47, 2, 67, 0, 4, 0, 12, 0, 48, 2, 68, 0, 49, 2, 4, 0, 50, 2,
+ 0, 0, 90, 0, 69, 0, 68, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 51, 2, 12, 0, 12, 2, 67, 0, 52, 2,
+ 24, 0, 53, 2, 24, 0, 54, 2, 24, 0, 55, 2, 28, 0, 77, 0, 70, 0, 56, 2, 30, 0, 57, 2, 57, 0, 14, 2, 12, 0, 58, 2,
+ 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 2, 0,168, 0, 2, 0, 87, 0, 2, 0, 59, 2, 2, 0, 60, 2, 7, 0, 61, 2,
+ 7, 0, 62, 2, 4, 0, 63, 2, 2, 0, 35, 0, 2, 0, 16, 2, 2, 0, 17, 0, 2, 0, 64, 2, 7, 0, 65, 2, 7, 0, 66, 2,
+ 7, 0, 67, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 2, 2, 0, 69, 2, 4, 0, 70, 2, 9, 0, 71, 2, 2, 0, 21, 0,
+ 2, 0, 93, 0, 2, 0, 64, 0, 2, 0, 72, 2, 7, 0, 73, 2, 7, 0, 74, 2, 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2,
+ 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2, 0, 0, 83, 2, 71, 0, 84, 2, 72, 0, 85, 2,
+ 0, 0, 86, 2, 59, 0, 87, 2, 59, 0, 88, 2, 59, 0, 89, 2, 59, 0, 90, 2, 4, 0, 91, 2, 7, 0, 92, 2, 4, 0, 93, 2,
+ 4, 0, 94, 2, 66, 0, 95, 2, 4, 0, 96, 2, 4, 0, 97, 2, 65, 0, 98, 2, 65, 0, 99, 2, 73, 0, 41, 0, 19, 0, 29, 0,
+ 31, 0, 72, 0, 62, 0,248, 1, 12, 0,100, 2, 28, 0, 77, 0, 30, 0, 57, 2, 57, 0, 14, 2, 74, 0,101, 2, 75, 0,102, 2,
+ 76, 0,103, 2, 77, 0,104, 2, 78, 0,105, 2, 79, 0,106, 2, 80, 0,107, 2, 81, 0,108, 2, 73, 0,109, 2, 82, 0,110, 2,
+ 83, 0,111, 2, 84, 0,112, 2, 84, 0,113, 2, 84, 0,114, 2, 4, 0, 51, 0, 4, 0,115, 2, 4, 0,116, 2, 4, 0,117, 2,
+ 4, 0,118, 2, 2, 0,168, 0, 2, 0,119, 2, 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0,120, 2, 4, 0, 59, 2,
+ 2, 0,121, 2, 2, 0, 17, 0, 2, 0,122, 2, 2, 0,123, 2, 2, 0, 16, 2, 2, 0,124, 2, 85, 0,125, 2, 86, 0,126, 2,
+ 76, 0, 8, 0, 9, 0,127, 2, 7, 0,128, 2, 4, 0,129, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
+ 2, 0,132, 2, 74, 0, 7, 0, 4, 0,133, 2, 4, 0,134, 2, 4, 0,135, 2, 4, 0,136, 2, 2, 0, 31, 2, 0, 0,137, 2,
+ 0, 0, 17, 0, 78, 0, 5, 0, 4, 0,133, 2, 4, 0,134, 2, 0, 0,138, 2, 0, 0,139, 2, 2, 0, 17, 0, 87, 0, 2, 0,
+ 4, 0,140, 2, 7, 0, 23, 2, 79, 0, 3, 0, 87, 0,141, 2, 4, 0,142, 2, 4, 0, 17, 0, 77, 0, 6, 0, 7, 0,143, 2,
+ 2, 0,144, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0,139, 2, 0, 0,145, 2, 80, 0, 4, 0, 0, 0,230, 0, 0, 0,176, 0,
+ 0, 0,177, 0, 0, 0,178, 0, 88, 0, 6, 0, 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
+ 2, 0,132, 2, 89, 0, 1, 0, 7, 0,146, 2, 90, 0, 5, 0, 0, 0,230, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0,
+ 4, 0, 35, 0, 81, 0, 1, 0, 7, 0,147, 2, 82, 0, 2, 0, 4, 0,148, 2, 4, 0, 15, 0, 75, 0, 7, 0, 7, 0,128, 2,
+ 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2, 2, 0,132, 2, 91, 0, 1, 0, 7, 0,149, 2,
+ 92, 0, 1, 0, 4, 0,150, 2, 93, 0, 1, 0, 0, 0,151, 2, 94, 0, 1, 0, 7, 0,128, 2, 95, 0, 3, 0, 4, 0,152, 2,
+ 0, 0, 90, 0, 7, 0,153, 2, 96, 0, 4, 0, 7, 0,230, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 97, 0, 1, 0,
+ 96, 0,129, 2, 98, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2, 0, 0, 17, 0, 0, 0, 31, 2, 0, 0,145, 2, 99, 0, 2, 0,
+ 4, 0,156, 2, 4, 0,155, 2,100, 0, 10, 0,100, 0, 0, 0,100, 0, 1, 0, 98, 0,157, 2, 97, 0,158, 2, 99, 0,159, 2,
+ 4, 0, 51, 0, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 35, 0, 77, 0,160, 2, 85, 0, 14, 0, 12, 0,161, 2, 77, 0,160, 2,
+ 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2, 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 17, 0,
+ 84, 0,112, 2, 84, 0,114, 2, 2, 0,169, 2, 0, 0,170, 2, 86, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 74, 0,173, 2,
+ 78, 0,174, 2, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 51, 0, 4, 0, 35, 0,101, 0, 9, 0,101, 0, 0, 0,101, 0, 1, 0,
+ 4, 0, 15, 0, 4, 0, 66, 1, 4, 0,175, 2, 4, 0, 35, 0, 0, 0, 18, 0, 38, 0,116, 0, 0, 0,176, 2,102, 0, 7, 0,
+101, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2, 2, 0, 88, 0, 9, 0,180, 2, 9, 0,181, 2,103, 0, 3, 0,
+101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0,104, 0, 5, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0, 2, 0,182, 2,
+ 0, 0,183, 2,105, 0, 5, 0,101, 0,177, 2, 7, 0, 85, 0, 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,106, 0, 5, 0,
+101, 0,177, 2, 24, 0,187, 2, 0, 0, 69, 0, 4, 0, 66, 1, 4, 0, 17, 0,107, 0, 13, 0,101, 0,177, 2, 24, 0,188, 2,
+ 24, 0,189, 2, 24, 0,190, 2, 24, 0,191, 2, 7, 0,192, 2, 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2,
+ 4, 0,196, 2, 4, 0, 88, 0, 4, 0,197, 2,108, 0, 5, 0,101, 0,177, 2, 2, 0,198, 2, 2, 0, 17, 0, 7, 0,199, 2,
+ 24, 0,200, 2,109, 0, 3, 0,101, 0,177, 2, 7, 0,201, 2, 4, 0, 88, 0,110, 0, 10, 0,101, 0,177, 2, 7, 0,202, 2,
+ 4, 0,203, 2, 4, 0, 35, 0, 2, 0, 88, 0, 2, 0,204, 2, 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,
+111, 0, 3, 0,101, 0,177, 2, 7, 0, 35, 0, 4, 0, 15, 0,112, 0, 6, 0,101, 0,177, 2,113, 0,209, 2,114, 0,210, 2,
+115, 0,211, 2, 7, 0,212, 2, 4, 0, 15, 0,116, 0, 11, 0,101, 0,177, 2, 44, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2,
+ 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 24, 0,218, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,117, 0, 12, 0,
+101, 0,177, 2, 24, 0,221, 2, 39, 0,222, 2, 4, 0, 88, 0, 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2,
+ 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,118, 0, 3, 0,101, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,
+119, 0, 5, 0,101, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2, 2, 0, 17, 0, 2, 0,231, 2,120, 0, 8, 0,101, 0,177, 2,
+ 24, 0,158, 0, 7, 0,230, 2, 7, 0,245, 0, 7, 0,104, 0, 0, 0,208, 2, 2, 0, 17, 0, 2, 0, 15, 0,121, 0, 21, 0,
+101, 0,177, 2, 24, 0,232, 2, 0, 0,208, 2, 44, 0,213, 2, 24, 0,218, 2, 2, 0, 17, 0, 2, 0, 35, 0, 7, 0,233, 2,
+ 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2, 7, 0,236, 2, 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2,
+ 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2, 7, 0, 87, 0,122, 0, 7, 0,101, 0,177, 2, 2, 0,242, 2,
+ 2, 0,243, 2, 4, 0, 67, 0, 24, 0,158, 0, 7, 0,244, 2, 0, 0,208, 2,123, 0, 10, 0,101, 0,177, 2, 24, 0,158, 0,
+ 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2, 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 18, 0,
+124, 0, 1, 0,101, 0,177, 2,125, 0, 7, 0,101, 0,177, 2, 38, 0,116, 0,126, 0,251, 2,127, 0,252, 2,128, 0,253, 2,
+129, 0,254, 2, 12, 0,255, 2,130, 0, 13, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 1, 3, 77, 0, 2, 3, 77, 0, 3, 3,
+ 77, 0, 4, 3, 77, 0, 5, 3, 74, 0, 6, 3, 4, 0, 7, 3, 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 35, 0,131, 0, 9, 3,
+132, 0, 7, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 10, 3,133, 0, 11, 3,134, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,
+135, 0, 4, 0,101, 0,177, 2, 24, 0,158, 0, 4, 0, 13, 3, 4, 0, 35, 0,136, 0, 2, 0, 4, 0, 14, 3, 7, 0, 23, 2,
+137, 0, 2, 0, 4, 0,119, 0, 4, 0, 15, 3,138, 0, 24, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0,208, 2, 2, 0, 16, 3,
+ 2, 0, 17, 0, 2, 0, 66, 1, 2, 0, 35, 0,136, 0, 17, 3, 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 51, 0, 4, 0, 20, 3,
+137, 0, 21, 3,136, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3, 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3,
+ 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,139, 0, 8, 0,101, 0,177, 2,140, 0, 32, 3,133, 0, 11, 3,
+ 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 17, 0, 2, 0, 54, 0,141, 0, 8, 0,101, 0,177, 2, 24, 0, 42, 0,
+ 2, 0,249, 0, 2, 0, 17, 0, 2, 0,198, 2, 2, 0, 54, 0, 7, 0, 36, 3, 7, 0, 37, 3,142, 0, 5, 0,101, 0,177, 2,
+ 4, 0, 38, 3, 2, 0, 17, 0, 2, 0, 39, 3, 7, 0, 40, 3,143, 0, 8, 0,101, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3,
+ 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 88, 0, 0, 0,145, 2,144, 0, 3, 0,101, 0,177, 2,145, 0, 45, 3,
+129, 0,254, 2,146, 0, 10, 0,101, 0,177, 2, 24, 0, 46, 3, 24, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3,
+ 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,147, 0, 9, 0,101, 0,177, 2, 24, 0, 54, 3, 0, 0, 48, 3,
+ 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 66, 1, 0, 0,198, 2, 0, 0, 57, 3, 0, 0, 35, 0,148, 0, 1, 0,101, 0,177, 2,
+149, 0, 8, 0,101, 0,177, 2, 0, 0,208, 2, 7, 0,119, 0, 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3,
+ 4, 0, 17, 0,150, 0, 9, 0,101, 0,177, 2, 24, 0, 62, 3, 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3,
+ 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 17, 0,151, 0, 3, 0,152, 0, 68, 3, 4, 0, 50, 2, 0, 0, 90, 0,152, 0, 29, 0,
+ 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 69, 3, 2, 0, 17, 0, 2, 0, 70, 3, 2, 0, 71, 3,
+ 2, 0, 72, 3, 2, 0, 67, 0, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 75, 3, 0, 0,223, 1, 4, 0, 35, 0, 7, 0, 76, 3,
+ 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 7, 0, 81, 3, 26, 0, 82, 3, 28, 0, 77, 0, 30, 0, 57, 2,
+ 79, 0,106, 2, 0, 0, 69, 0, 7, 0, 83, 3, 7, 0, 84, 3,151, 0, 85, 3,153, 0, 3, 0,153, 0, 0, 0,153, 0, 1, 0,
+ 0, 0, 18, 0, 62, 0, 3, 0, 7, 0, 86, 3, 4, 0, 17, 0, 4, 0, 35, 0, 24, 0,126, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+154, 0, 87, 3, 2, 0, 15, 0, 2, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 4, 0, 91, 3, 0, 0, 92, 3, 24, 0, 36, 0,
+ 24, 0, 93, 3, 24, 0, 94, 3, 24, 0, 95, 3, 24, 0, 96, 3, 28, 0, 77, 0, 70, 0, 56, 2, 62, 0,248, 1,155, 0, 97, 3,
+155, 0, 98, 3,156, 0, 99, 3, 9, 0, 2, 0,157, 0,100, 3,158, 0,101, 3,159, 0,102, 3, 12, 0,103, 3, 12, 0,100, 2,
+ 12, 0, 12, 2, 12, 0,104, 3, 12, 0,105, 3, 4, 0, 66, 1, 4, 0,106, 3, 57, 0, 14, 2, 0, 0,107, 3, 4, 0, 16, 2,
+ 4, 0,108, 3, 7, 0, 61, 1, 7, 0,109, 3, 7, 0,110, 3, 7, 0,166, 0, 7, 0,111, 3, 7, 0, 62, 1, 7, 0,112, 3,
+ 7, 0, 2, 2, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,118, 3, 7, 0,246, 2,
+ 7, 0,119, 3, 7, 0,234, 0, 4, 0,120, 3, 2, 0, 17, 0, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3,
+ 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 2, 0,131, 3, 4, 0,132, 3,
+ 4, 0,133, 3, 4, 0,134, 3, 4, 0,135, 3, 7, 0,136, 3, 7, 0, 92, 2, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
+ 7, 0,140, 3, 7, 0,141, 3, 7, 0,209, 0, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 2, 0,146, 3,
+ 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 0, 0,150, 3, 7, 0,151, 3, 7, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
+ 12, 0,155, 3, 12, 0,156, 3, 7, 0,157, 3, 2, 0,148, 2, 2, 0,158, 3, 7, 0,129, 2, 4, 0,159, 3, 4, 0,160, 3,
+160, 0,161, 3, 2, 0,162, 3, 2, 0,241, 0, 7, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3, 12, 0,167, 3,
+161, 0, 58, 1,162, 0,168, 3, 58, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0, 50, 2, 2, 0,172, 3, 7, 0,121, 2,
+ 2, 0,173, 3, 2, 0,174, 3,145, 0,175, 3,133, 0,176, 3,133, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3,
+ 4, 0, 67, 0, 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,163, 0, 14, 0,163, 0, 0, 0,163, 0, 1, 0, 24, 0, 36, 0,
+ 7, 0,246, 2, 7, 0, 63, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 18, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3,
+ 2, 0, 15, 0, 2, 0,185, 3, 7, 0,250, 2,164, 0, 12, 0,164, 0, 0, 0,164, 0, 1, 0, 24, 0, 42, 0, 4, 0,186, 3,
+ 4, 0,148, 2, 4, 0,187, 3, 4, 0, 15, 0, 4, 0,188, 3, 7, 0, 63, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,
+161, 0, 40, 0, 4, 0, 17, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3,
+ 2, 0,196, 3, 2, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3,
+ 7, 0,204, 3, 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3,
+ 7, 0,212, 3, 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3,
+ 7, 0,220, 3, 7, 0,221, 3, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 44, 0,159, 0,165, 0,225, 3, 7, 0,226, 3,
+ 4, 0,186, 2,166, 0, 5, 0, 58, 0,226, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 17, 0, 2, 0,229, 3,167, 0, 5, 0,
+167, 0, 0, 0,167, 0, 1, 0, 4, 0, 15, 0, 4, 0,230, 3, 9, 0, 2, 0,168, 0, 9, 0,168, 0, 0, 0,168, 0, 1, 0,
+ 4, 0,231, 3, 4, 0,232, 3, 4, 0,233, 3, 4, 0, 17, 0, 9, 0,234, 3, 9, 0,235, 3, 12, 0,236, 3,129, 0, 21, 0,
+129, 0, 0, 0,129, 0, 1, 0, 4, 0, 17, 0, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3, 4, 0,240, 3, 4, 0,241, 3,
+ 4, 0,242, 3, 4, 0,232, 3, 4, 0,148, 2, 2, 0,243, 3, 2, 0, 54, 0, 0, 0,244, 3, 0, 0,245, 3, 0, 0,246, 3,
+ 0, 0,247, 3, 0, 0,248, 3, 12, 0,249, 3,169, 0,250, 3, 9, 0,251, 3,170, 0, 1, 0, 7, 0, 30, 2,160, 0, 30, 0,
+ 4, 0, 17, 0, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, 4, 0,255, 3, 4, 0, 0, 4, 4, 0, 1, 4, 4, 0, 2, 4,
+ 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 7, 0, 10, 4,
+ 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4,
+ 7, 0, 19, 4, 7, 0, 20, 4, 4, 0, 21, 4, 4, 0, 22, 4, 7, 0, 23, 4, 7, 0,142, 3,162, 0, 54, 0, 4, 0,232, 3,
+ 4, 0, 24, 4,171, 0, 25, 4,172, 0, 26, 4, 0, 0, 35, 0, 0, 0, 27, 4, 2, 0, 28, 4, 7, 0, 29, 4, 0, 0, 30, 4,
+ 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4,
+ 7, 0, 39, 4, 2, 0, 40, 4, 0, 0, 41, 4, 2, 0, 42, 4, 7, 0, 43, 4, 7, 0, 44, 4, 0, 0, 45, 4, 4, 0,120, 0,
+ 4, 0, 46, 4, 4, 0, 47, 4, 2, 0, 48, 4, 2, 0, 49, 4,170, 0, 50, 4, 4, 0, 51, 4, 4, 0, 79, 0, 7, 0, 52, 4,
+ 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4, 2, 0, 59, 4, 2, 0, 60, 4,
+ 2, 0, 61, 4, 2, 0, 62, 4, 2, 0, 63, 4,173, 0, 64, 4, 7, 0, 65, 4, 7, 0, 66, 4,129, 0, 67, 4, 12, 0,255, 2,
+166, 0, 68, 4, 7, 0, 69, 4, 7, 0, 70, 4, 7, 0, 71, 4, 0, 0, 72, 4,145, 0, 51, 0,144, 0, 73, 4, 2, 0, 15, 0,
+ 2, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4, 2, 0, 79, 4, 7, 0, 80, 4, 2, 0, 81, 4,
+ 2, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 7, 0, 85, 4, 7, 0, 86, 4, 7, 0, 87, 4, 4, 0, 88, 4, 4, 0, 89, 4,
+ 7, 0, 90, 4, 4, 0, 91, 4, 7, 0, 92, 4, 7, 0, 93, 4, 7, 0, 94, 4, 73, 0, 95, 4, 73, 0, 96, 4, 73, 0, 97, 4,
+ 0, 0, 98, 4, 7, 0, 99, 4, 7, 0,100, 4, 28, 0, 77, 0, 2, 0,101, 4, 0, 0,102, 4, 0, 0,103, 4, 7, 0,104, 4,
+ 4, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 4, 0,108, 4, 4, 0, 17, 0, 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4,
+ 77, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 7, 0,117, 4, 7, 0,118, 4, 7, 0,119, 4,
+ 4, 0,120, 4,174, 0, 76, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0,169, 0, 2, 0, 67, 1, 2, 0,101, 1, 2, 0,121, 4,
+ 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,147, 1, 7, 0,149, 1,
+ 7, 0,148, 1, 7, 0, 67, 0, 4, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 7, 0,131, 4, 7, 0,132, 4, 7, 0,133, 4,
+ 7, 0,134, 4, 7, 0,135, 4, 2, 0,136, 4, 2, 0, 66, 1, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4,
+ 2, 0,141, 4, 2, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4, 7, 0,147, 4, 7, 0,148, 4,
+ 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4, 7, 0,154, 4, 2, 0,155, 4, 2, 0,156, 4,
+ 2, 0,157, 4, 2, 0,158, 4, 7, 0,159, 4, 7, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4,
+ 2, 0,165, 4, 2, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 7, 0,170, 4, 7, 0,171, 4, 7, 0,172, 4,
+ 7, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0,176, 4, 2, 0,177, 4, 2, 0,178, 4, 2, 0, 17, 0, 7, 0,179, 4,
+ 7, 0,180, 4, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1, 2, 0,181, 4, 22, 0,145, 0,175, 0, 8, 0,175, 0, 0, 0,
+175, 0, 1, 0, 4, 0,120, 3, 4, 0,182, 4, 4, 0, 17, 0, 2, 0,183, 4, 2, 0,184, 4, 24, 0,158, 0,176, 0, 13, 0,
+ 9, 0,185, 4, 9, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, 4, 0,190, 4, 4, 0,191, 4, 4, 0,192, 4,
+ 4, 0,193, 4, 4, 0,194, 4, 4, 0,195, 4, 4, 0, 35, 0, 0, 0,196, 4,177, 0, 5, 0, 9, 0,197, 4, 9, 0,198, 4,
+ 4, 0,199, 4, 4, 0, 67, 0, 0, 0,200, 4,178, 0, 17, 0, 4, 0,201, 4, 4, 0,202, 4, 4, 0,203, 4, 4, 0,204, 4,
+ 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, 4, 0,210, 4, 4, 0,211, 4, 4, 0,212, 4,
+ 2, 0,213, 4, 2, 0,214, 4, 4, 0,215, 4, 4, 0,216, 4, 4, 0, 87, 0,179, 0, 15, 0, 4, 0, 15, 0, 4, 0,203, 4,
+ 4, 0,217, 4, 4, 0,218, 4, 4, 0,219, 4, 4, 0,220, 4, 7, 0,221, 4, 4, 0,222, 4, 4, 0, 88, 0, 4, 0,223, 4,
+ 4, 0,224, 4, 4, 0,225, 4, 4, 0,226, 4, 4, 0,227, 4, 18, 0, 28, 0,180, 0, 7, 0, 4, 0,228, 4, 7, 0,229, 4,
+ 7, 0,230, 4, 7, 0,231, 4, 4, 0,232, 4, 2, 0, 17, 0, 2, 0, 35, 0,181, 0, 11, 0,181, 0, 0, 0,181, 0, 1, 0,
+ 0, 0, 18, 0, 57, 0,233, 4, 58, 0,234, 4, 4, 0,120, 3, 4, 0,235, 4, 4, 0,236, 4, 4, 0, 35, 0, 4, 0,237, 4,
+ 4, 0,238, 4,182, 0,110, 0,176, 0,239, 4,177, 0,240, 4,178, 0,241, 4,179, 0,242, 4, 4, 0, 12, 3, 4, 0,120, 0,
+ 4, 0, 46, 4, 7, 0,243, 4, 4, 0,244, 4, 4, 0,245, 4, 4, 0,246, 4, 4, 0,247, 4, 2, 0, 17, 0, 2, 0,248, 4,
+ 7, 0,249, 4, 7, 0,250, 4, 7, 0,251, 4, 7, 0,252, 4, 7, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5,
+ 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 4, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 88, 1, 2, 0,104, 0,
+ 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5,
+ 2, 0, 14, 5, 2, 0, 89, 1, 2, 0, 15, 5, 2, 0, 16, 5, 2, 0, 17, 5, 2, 0, 18, 5, 4, 0, 19, 5, 4, 0, 66, 1,
+ 4, 0, 20, 5, 2, 0, 21, 5, 2, 0, 22, 5, 2, 0, 23, 5, 2, 0,245, 1, 2, 0, 24, 5, 2, 0, 25, 5, 2, 0, 26, 5,
+ 2, 0, 27, 5, 16, 0, 28, 5, 16, 0, 29, 5, 15, 0, 30, 5, 12, 0, 31, 5, 2, 0, 32, 5, 2, 0, 33, 5, 7, 0, 34, 5,
+ 7, 0, 35, 5, 7, 0, 36, 5, 7, 0, 37, 5, 4, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5, 7, 0, 41, 5, 7, 0, 42, 5,
+ 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 2, 0, 47, 5, 2, 0, 48, 5, 7, 0, 49, 5, 7, 0, 50, 5,
+ 7, 0, 51, 5, 0, 0, 52, 5, 0, 0, 53, 5, 4, 0, 54, 5, 2, 0, 55, 5, 2, 0,223, 1, 0, 0, 56, 5, 7, 0, 57, 5,
+ 7, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 0, 0, 61, 5, 0, 0, 62, 5, 4, 0, 63, 5, 2, 0, 64, 5, 2, 0, 65, 5,
+ 7, 0, 66, 5, 7, 0, 67, 5, 2, 0, 68, 5, 2, 0, 69, 5, 7, 0, 70, 5, 2, 0, 71, 5, 2, 0, 72, 5, 4, 0, 73, 5,
+ 2, 0, 74, 5, 2, 0, 75, 5, 2, 0, 76, 5, 2, 0, 77, 5, 7, 0, 78, 5, 7, 0, 67, 0, 34, 0, 79, 5, 0, 0, 80, 5,
+183, 0, 9, 0,183, 0, 0, 0,183, 0, 1, 0, 0, 0, 18, 0, 2, 0, 81, 5, 2, 0, 82, 5, 2, 0, 83, 5, 2, 0, 87, 0,
+ 7, 0, 84, 5, 7, 0, 67, 0,184, 0, 7, 0, 2, 0,203, 2, 2, 0, 66, 1, 2, 0, 67, 3, 2, 0, 85, 5, 7, 0, 86, 5,
+ 7, 0, 67, 0, 34, 0, 87, 5,185, 0, 5, 0, 7, 0, 88, 5, 0, 0, 15, 0, 0, 0, 87, 0, 0, 0, 67, 0, 0, 0,223, 1,
+186, 0, 28, 0, 7, 0,134, 4, 7, 0,135, 4, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0, 89, 5, 2, 0,181, 4, 2, 0,137, 4,
+ 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4, 2, 0,141, 4, 2, 0,142, 4,185, 0, 90, 5, 2, 0,254, 4, 2, 0,255, 4,
+ 2, 0, 0, 5, 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 2, 0, 91, 5, 2, 0, 92, 5,184, 0, 93, 5, 2, 0, 94, 5,
+ 2, 0, 4, 5, 2, 0, 7, 5, 2, 0, 8, 5, 7, 0, 95, 5, 7, 0, 87, 0,187, 0, 6, 0,187, 0, 0, 0,187, 0, 1, 0,
+ 4, 0,231, 3, 0, 0,244, 3, 4, 0, 17, 0, 24, 0, 96, 5,188, 0, 4, 0,189, 0, 97, 5, 9, 0, 98, 5, 0, 0, 99, 5,
+ 4, 0, 88, 0,190, 0, 8, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0,101, 5, 2, 0,102, 5, 2, 0,103, 5,
+ 4, 0, 87, 0, 9, 0,104, 5,191, 0, 6, 0, 2, 0,104, 0, 2, 0,237, 3, 2, 0,105, 5, 2, 0,197, 2, 4, 0, 17, 0,
+ 7, 0,214, 2,192, 0, 14, 0, 2, 0, 17, 0, 2, 0,106, 5, 2, 0,107, 5, 2, 0,108, 5,191, 0,109, 5, 9, 0,104, 5,
+ 7, 0,110, 5, 7, 0, 54, 0, 4, 0,111, 5, 4, 0,112, 5, 4, 0,113, 5, 4, 0,114, 5, 38, 0,116, 0, 24, 0,158, 0,
+193, 0, 4, 0,193, 0, 0, 0,193, 0, 1, 0, 0, 0,115, 5, 7, 0,116, 5,194, 0, 14, 0,188, 0,100, 5, 4, 0, 88, 0,
+ 4, 0,117, 5, 7, 0,118, 5, 7, 0,119, 5, 7, 0,120, 5, 4, 0,121, 5, 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5,
+ 4, 0,125, 5, 7, 0,126, 5, 7, 0,127, 5, 4, 0, 35, 0,195, 0, 7, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0,
+ 4, 0, 34, 0, 4, 0,128, 5, 79, 0,129, 5, 9, 0,104, 5,196, 0, 81, 0,195, 0,130, 5,195, 0,131, 5,194, 0, 87, 3,
+ 7, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5, 7, 0,135, 5, 7, 0,136, 5, 2, 0,237, 3, 2, 0,137, 5, 7, 0,138, 5,
+ 7, 0,139, 5, 7, 0,140, 5, 2, 0,141, 5, 2, 0,111, 5, 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5,
+ 7, 0,146, 5, 7, 0,147, 5, 7, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5, 2, 0,151, 5, 2, 0,152, 5, 2, 0,153, 5,
+ 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5,190, 0,157, 5,192, 0,158, 5, 7, 0,159, 5, 7, 0,160, 5, 7, 0,161, 5,
+ 2, 0,162, 5, 2, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 0, 0,166, 5, 0, 0,167, 5, 0, 0,168, 5, 0, 0,169, 5,
+ 2, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5, 7, 0,175, 5, 7, 0,176, 5, 7, 0,177, 5,
+ 7, 0,178, 5, 7, 0,179, 5, 7, 0,180, 5, 2, 0,181, 5, 0, 0,182, 5, 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5,
+ 24, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5, 0, 0,191, 5, 0, 0,192, 5, 0, 0,193, 5,
+ 0, 0,194, 5, 2, 0,195, 5, 2, 0,196, 5, 2, 0,197, 5, 2, 0,198, 5, 2, 0,199, 5, 0, 0,200, 5, 0, 0,181, 4,
+ 4, 0,201, 5, 2, 0,202, 5, 2, 0, 87, 0, 4, 0,203, 5, 7, 0,204, 5, 7, 0,205, 5,197, 0, 8, 0, 4, 0,206, 5,
+ 4, 0,207, 5, 4, 0,208, 5, 4, 0,209, 5, 4, 0,210, 5, 4, 0,211, 5, 4, 0, 51, 0, 4, 0,116, 2,198, 0, 4, 0,
+ 7, 0,212, 5, 0, 0,213, 5, 0, 0,214, 5, 2, 0, 17, 0,199, 0, 4, 0, 7, 0,215, 5, 4, 0, 17, 0, 4, 0,216, 5,
+ 4, 0, 54, 0, 38, 0, 42, 0, 19, 0, 29, 0, 31, 0, 72, 0, 24, 0, 96, 5,174, 0,217, 5, 38, 0,218, 5, 12, 0,219, 5,
+175, 0,220, 5, 24, 0,221, 5, 7, 0,222, 5, 7, 0,223, 5, 7, 0,224, 5, 7, 0,225, 5, 4, 0,120, 3, 4, 0,226, 5,
+ 4, 0,227, 5, 2, 0, 17, 0, 2, 0, 60, 1, 52, 0, 55, 1,200, 0,228, 5,196, 0,229, 5,201, 0,230, 5,182, 0,176, 0,
+180, 0,231, 5, 12, 0, 98, 0, 12, 0,232, 5, 9, 0,233, 5, 9, 0,234, 5, 9, 0,235, 5, 9, 0,236, 5,202, 0,237, 5,
+ 2, 0,238, 5, 2, 0,239, 5, 2, 0,241, 0, 2, 0,240, 5, 4, 0,241, 5, 4, 0,242, 5, 12, 0,243, 5,185, 0, 90, 5,
+186, 0,244, 5,198, 0,245, 5,157, 0,100, 3,199, 0,246, 5,203, 0, 11, 0,203, 0, 0, 0,203, 0, 1, 0, 39, 0,232, 0,
+ 37, 0, 54, 1, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0,104, 0, 7, 0,247, 5, 2, 0,248, 5, 2, 0, 17, 0, 7, 0, 67, 0,
+204, 0, 38, 0, 7, 0,249, 5, 7, 0,250, 5, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,255, 5,
+ 7, 0, 0, 6, 7, 0, 1, 6, 7, 0, 73, 1, 7, 0, 2, 6, 7, 0, 3, 6, 7, 0, 4, 6, 7, 0, 5, 6, 7, 0,165, 0,
+ 2, 0, 6, 6, 2, 0, 7, 6, 4, 0, 35, 0, 2, 0, 8, 6, 2, 0, 9, 6, 2, 0, 10, 6, 2, 0,248, 5, 7, 0, 11, 6,
+ 7, 0, 12, 6, 62, 0, 13, 6,157, 0,100, 3,204, 0, 14, 6,205, 0, 15, 6,206, 0, 16, 6,207, 0, 17, 6,208, 0, 18, 6,
+209, 0, 19, 6, 7, 0, 20, 6, 2, 0, 21, 6, 2, 0, 22, 6, 7, 0, 23, 6, 7, 0, 24, 6, 7, 0, 25, 6,210, 0, 55, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 7, 0, 1, 6, 7, 0, 73, 1,
+ 7, 0, 87, 0, 4, 0, 30, 6, 2, 0, 10, 6, 2, 0,248, 5, 24, 0, 96, 5, 24, 0, 31, 6, 12, 0, 32, 6,203, 0, 33, 6,
+210, 0, 14, 6, 0, 0, 34, 6, 4, 0,120, 3, 4, 0,226, 5, 2, 0, 35, 6, 2, 0, 36, 6, 2, 0, 37, 6, 2, 0, 38, 6,
+ 2, 0,223, 1, 2, 0, 17, 0, 2, 0, 15, 2, 2, 0, 39, 6, 7, 0,109, 0, 7, 0, 40, 6, 7, 0, 23, 6, 7, 0, 41, 6,
+ 7, 0, 42, 6, 7, 0,165, 0, 7, 0,222, 5, 2, 0, 43, 6, 2, 0,245, 1, 2, 0, 44, 6, 2, 0, 45, 6, 2, 0, 46, 6,
+ 2, 0, 47, 6, 2, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 7, 6, 12, 0, 51, 6, 12, 0, 52, 6, 12, 0, 53, 6,
+ 2, 0, 54, 6, 2, 0,130, 2, 2, 0, 55, 6, 0, 0, 56, 6, 0, 0, 57, 6, 9, 0, 58, 6,157, 0,100, 3,212, 0, 24, 0,
+ 16, 0, 34, 0, 16, 0, 61, 0, 15, 0, 59, 6, 15, 0, 60, 6, 15, 0, 61, 6, 7, 0, 62, 6, 7, 0, 63, 6, 7, 0, 64, 6,
+ 7, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 70, 6, 2, 0, 17, 0, 2, 0, 71, 6,
+ 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 74, 6, 2, 0, 75, 6, 2, 0, 38, 6, 7, 0, 76, 6, 4, 0, 77, 6, 4, 0, 78, 6,
+211, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,213, 0, 8, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 0, 0, 79, 6, 0, 0,175, 0,
+214, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,
+215, 0, 81, 6, 12, 0, 82, 6, 2, 0, 66, 1, 2, 0, 83, 6, 4, 0, 17, 0, 7, 0, 84, 6, 4, 0, 38, 6,216, 0, 20, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,205, 0, 15, 6,212, 0, 80, 6,
+ 2, 0, 85, 6, 2, 0, 86, 6, 2, 0, 87, 6, 2, 0, 88, 6, 2, 0, 71, 6, 2, 0, 89, 6, 0, 0, 17, 0, 0, 0,181, 4,
+ 9, 0, 56, 2, 4, 0, 90, 6, 4, 0, 91, 6, 19, 0, 92, 6,217, 0, 18, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 7, 0, 80, 2, 7, 0, 81, 2, 2, 0, 85, 6, 2, 0, 93, 6,
+ 2, 0, 94, 6, 2, 0, 95, 6, 4, 0, 17, 0, 7, 0, 96, 6, 4, 0,248, 5, 4, 0, 35, 0,157, 0,100, 3,218, 0, 17, 0,
+ 0, 0, 97, 6, 0, 0, 98, 6, 0, 0, 99, 6, 0, 0,100, 6, 0, 0,101, 6, 0, 0,102, 6, 2, 0, 15, 0, 2, 0, 17, 0,
+ 2, 0,103, 6, 2, 0,104, 6, 2, 0,166, 1, 2, 0,105, 6, 4, 0,106, 6, 4, 0,107, 6, 2, 0,108, 6, 2, 0, 35, 0,
+ 0, 0,109, 6,219, 0, 16, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0,110, 6,218, 0,111, 6,
+220, 0,112, 6, 12, 0,113, 6, 12, 0,114, 6,221, 0,115, 6,209, 0,116, 6,222, 0,117, 6, 2, 0,118, 6, 2, 0,119, 6,
+ 2, 0,120, 6, 2, 0, 67, 0,223, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
+ 2, 0, 29, 6,212, 0, 80, 6, 12, 0,121, 6,224, 0,122, 6, 0, 0,123, 6,225, 0,124, 6, 2, 0, 17, 0, 2, 0,125, 6,
+ 2, 0,126, 6, 2, 0,127, 6,226, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0, 17, 0,
+ 39, 0,222, 2, 37, 0, 54, 1, 55, 0,128, 6,227, 0,129, 6,228, 0,130, 6,157, 0,100, 3, 7, 0,131, 6, 7, 0, 80, 2,
+ 7, 0, 81, 2, 7, 0, 96, 6, 7, 0,132, 6, 7, 0,133, 6, 2, 0,134, 6, 2, 0,135, 6, 2, 0,136, 6, 2, 0,137, 6,
+ 0, 0,138, 6, 0, 0,139, 6, 0, 0,140, 6, 0, 0, 38, 6,229, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 83, 6, 2, 0, 17, 0, 4, 0, 35, 0,215, 0, 81, 6,212, 0, 80, 6,
+230, 0, 29, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 34, 0,141, 6,
+ 4, 0,142, 6, 4, 0,143, 6, 2, 0, 88, 0, 2, 0,144, 6, 2, 0,145, 6, 0, 0,146, 6, 0, 0,147, 6, 4, 0,148, 6,
+ 4, 0,149, 6, 4, 0,150, 6, 2, 0,151, 6, 2, 0,152, 6, 2, 0,153, 6, 2, 0,154, 6, 7, 0,155, 6, 15, 0,156, 6,
+ 15, 0,157, 6, 4, 0,158, 6, 4, 0,159, 6, 0, 0,160, 6, 0, 0,161, 6, 9, 0,162, 6,231, 0, 10, 0, 19, 0, 29, 0,
+ 9, 0,163, 6, 9, 0,164, 6, 9, 0,165, 6, 9, 0,166, 6, 9, 0,167, 6, 4, 0, 88, 0, 4, 0,168, 6, 0, 0,169, 6,
+ 0, 0,170, 6,232, 0, 10, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,231, 0,171, 6,
+ 2, 0, 88, 0, 2, 0,144, 6, 4, 0, 87, 0, 9, 0,172, 6,233, 0, 3, 0,233, 0, 0, 0,233, 0, 1, 0, 7, 0,173, 6,
+234, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,212, 0, 80, 6, 12, 0,174, 6,
+ 4, 0,175, 6, 4, 0, 35, 0, 4, 0, 17, 0, 4, 0,176, 6,235, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 19, 0,177, 6, 19, 0, 78, 0, 2, 0, 17, 0, 2, 0,144, 6,
+ 7, 0,178, 6, 9, 0,179, 6, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 96, 6, 7, 0, 25, 6, 7, 0,180, 6, 7, 0,181, 6,
+ 52, 0, 55, 1, 52, 0,182, 6, 4, 0,183, 6, 2, 0,184, 6, 2, 0, 35, 0,157, 0,100, 3,236, 0, 10, 0,211, 0, 0, 0,
+211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 17, 0, 2, 0,129, 3, 4, 0, 35, 0,
+157, 0,100, 3,237, 0, 42, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,
+212, 0, 80, 6,220, 0,112, 6, 0, 0,185, 6, 0, 0, 98, 6, 0, 0, 99, 6, 2, 0, 15, 0, 2, 0,186, 6, 2, 0, 17, 0,
+ 2, 0,103, 6, 9, 0,179, 6, 4, 0,106, 6, 4, 0,187, 6, 4, 0,188, 6, 4, 0,107, 6, 15, 0,189, 6, 15, 0,190, 6,
+ 7, 0,191, 6, 7, 0,192, 6, 7, 0,193, 6, 7, 0,178, 6, 2, 0,194, 6, 2, 0,231, 0, 2, 0,166, 1, 2, 0,105, 6,
+ 2, 0, 35, 0, 2, 0, 87, 0, 2, 0,195, 6, 2, 0,196, 6, 9, 0,197, 6, 9, 0,198, 6, 9, 0,199, 6, 9, 0,200, 6,
+ 9, 0,201, 6, 2, 0,202, 6, 0, 0,203, 6, 49, 0,204, 6,238, 0, 7, 0,238, 0, 0, 0,238, 0, 1, 0, 4, 0,205, 6,
+ 4, 0, 21, 0, 0, 0, 81, 0, 4, 0,206, 6, 4, 0, 15, 0,239, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
+ 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 4, 0,145, 6, 4, 0, 35, 0, 12, 0,207, 6, 12, 0,208, 6, 0, 0,209, 6,
+ 0, 0,210, 6, 4, 0,211, 6, 4, 0,212, 6,240, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6,
+ 4, 0, 35, 0, 0, 0,213, 6,241, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
+242, 0,214, 6,212, 0, 80, 6,243, 0,215, 6, 2, 0, 66, 1, 2, 0,216, 6, 2, 0, 80, 2, 2, 0, 81, 2, 2, 0, 17, 0,
+ 2, 0,136, 6, 4, 0, 67, 0,244, 0, 7, 0,244, 0, 0, 0,244, 0, 1, 0, 0, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6,
+ 2, 0,220, 6, 2, 0, 35, 0,245, 0, 12, 0, 2, 0,219, 6, 2, 0,221, 6, 2, 0,222, 6, 0, 0,183, 2, 2, 0,223, 6,
+ 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6, 2, 0, 71, 6, 7, 0,228, 6, 7, 0,229, 6,246, 0, 18, 0,
+246, 0, 0, 0,246, 0, 1, 0, 0, 0,244, 3,245, 0,230, 6,245, 0,231, 6,245, 0,232, 6,245, 0,233, 6, 7, 0,234, 6,
+ 2, 0,235, 6, 2, 0,236, 6, 2, 0,237, 6, 2, 0,238, 6, 2, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
+ 2, 0,243, 6, 2, 0,244, 6,247, 0, 10, 0, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
+ 0, 0,250, 6, 2, 0,251, 6, 2, 0,252, 6, 2, 0,253, 6, 2, 0,254, 6,248, 0, 8, 0, 0, 0,255, 6, 0, 0, 0, 7,
+ 0, 0, 1, 7, 0, 0, 2, 7, 0, 0, 3, 7, 0, 0, 4, 7, 7, 0,247, 5, 7, 0, 35, 0,249, 0, 18, 0,247, 0, 5, 7,
+247, 0, 6, 7,247, 0, 7, 7,247, 0, 8, 7,247, 0, 9, 7,247, 0, 10, 7,247, 0, 11, 7,247, 0, 12, 7,247, 0, 13, 7,
+247, 0, 14, 7,247, 0, 15, 7,247, 0, 16, 7,247, 0, 17, 7,247, 0, 18, 7,247, 0, 19, 7,247, 0, 20, 7,248, 0, 21, 7,
+ 0, 0, 22, 7,250, 0, 96, 0, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0,249, 6, 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7,
+ 0, 0, 28, 7, 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7,
+ 0, 0, 36, 7, 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7,
+ 0, 0, 44, 7, 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7,
+ 0, 0, 52, 7, 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7,
+ 0, 0, 60, 7, 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7,
+ 0, 0, 68, 7, 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7,
+ 0, 0, 76, 7, 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, 0, 0, 83, 7,
+ 0, 0, 84, 7, 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7, 0, 0, 90, 7, 0, 0, 91, 7,
+ 0, 0, 92, 7, 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7,
+ 0, 0,100, 7, 0, 0,101, 7, 0, 0,102, 7, 0, 0,103, 7, 0, 0,104, 7, 0, 0,105, 7, 0, 0,106, 7, 0, 0,107, 7,
+ 0, 0,108, 7, 0, 0,109, 7, 0, 0,110, 7, 0, 0,111, 7, 0, 0,112, 7, 0, 0,113, 7, 0, 0,114, 7, 0, 0,115, 7,
+ 0, 0,116, 7, 0, 0,117, 7,251, 0, 5, 0, 0, 0,118, 7, 0, 0, 47, 7, 0, 0, 49, 7, 2, 0, 17, 0, 2, 0, 35, 0,
+252, 0, 25, 0,252, 0, 0, 0,252, 0, 1, 0, 0, 0, 18, 0,249, 0,119, 7,250, 0,120, 7,250, 0,121, 7,250, 0,122, 7,
+250, 0,123, 7,250, 0,124, 7,250, 0,125, 7,250, 0,126, 7,250, 0,127, 7,250, 0,128, 7,250, 0,129, 7,250, 0,130, 7,
+250, 0,131, 7,250, 0,132, 7,250, 0,133, 7,250, 0,134, 7,250, 0,135, 7,250, 0,136, 7,250, 0,137, 7,251, 0,138, 7,
+ 4, 0,139, 7, 4, 0, 35, 0,253, 0, 3, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,140, 7,254, 0, 5, 0, 4, 0, 17, 0,
+ 4, 0, 35, 0, 7, 0,129, 2, 7, 0,141, 7, 7, 0, 30, 2,255, 0, 90, 0, 4, 0, 17, 0, 4, 0,142, 7, 4, 0,143, 7,
+ 0, 0,144, 7, 0, 0,145, 7, 0, 0,146, 7, 0, 0,147, 7, 0, 0,148, 7, 0, 0,149, 7, 0, 0,150, 7, 0, 0,151, 7,
+ 0, 0,152, 7, 0, 0,153, 7, 4, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 4, 0,159, 7,
+ 4, 0,160, 7, 4, 0,161, 7, 4, 0,162, 7, 2, 0,163, 7, 2, 0,164, 7, 4, 0,165, 7, 4, 0,166, 7, 4, 0,167, 7,
+ 4, 0,168, 7, 4, 0,169, 7, 4, 0,207, 6, 4, 0,170, 7, 2, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, 2, 0,174, 7,
+ 12, 0,175, 7, 12, 0,176, 7, 12, 0,177, 7, 12, 0,178, 7, 12, 0,179, 7, 0, 0,180, 7, 2, 0,181, 7, 2, 0,182, 7,
+ 2, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7,254, 0,189, 7, 2, 0,190, 7,
+ 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 4, 0,198, 7,
+ 4, 0,199, 7, 2, 0,200, 7, 2, 0,201, 7, 2, 0,202, 7, 2, 0,203, 7, 2, 0,204, 7, 2, 0,205, 7, 2, 0,206, 7,
+ 2, 0,207, 7, 2, 0,208, 7, 2, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
+ 2, 0,215, 7, 2, 0,216, 7, 2, 0,181, 4, 0, 0,217, 7, 0, 0,218, 7, 7, 0,219, 7, 2, 0,162, 5, 2, 0,163, 5,
+ 2, 0,220, 7, 2, 0,221, 7, 7, 0,222, 7, 47, 0,223, 7, 7, 0,224, 7, 4, 0,223, 1, 0, 0,225, 7, 0, 1, 22, 0,
+ 19, 0, 29, 0, 12, 0,226, 7, 12, 0,227, 7, 12, 0,228, 7, 12, 0, 26, 6, 38, 0,116, 0, 38, 0,229, 7, 2, 0,230, 7,
+ 2, 0,231, 7, 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0,236, 7, 2, 0,237, 7, 2, 0,238, 7,
+ 2, 0,239, 7, 2, 0,240, 7, 2, 0, 35, 0,209, 0,241, 7, 9, 0,242, 7, 2, 0,243, 7, 1, 1, 5, 0, 1, 1, 0, 0,
+ 1, 1, 1, 0, 1, 1,244, 7, 13, 0,245, 7, 4, 0, 17, 0, 2, 1, 7, 0, 2, 1, 0, 0, 2, 1, 1, 0, 1, 1,246, 7,
+ 1, 1,247, 7, 2, 0, 29, 5, 2, 0, 17, 0, 4, 0, 35, 0, 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 4, 1,248, 7,
+ 5, 1,117, 6, 0, 0,249, 7, 0, 0,250, 7, 0, 0,251, 7, 2, 0,252, 7, 2, 0,253, 7, 2, 0,254, 7, 2, 0,255, 7,
+ 2, 0, 0, 8, 2, 0, 35, 0, 2, 0, 17, 0, 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 4, 0, 4, 8, 3, 1, 5, 8,
+ 9, 0, 6, 8, 4, 0, 7, 8, 4, 0, 8, 8, 4, 0, 9, 8, 4, 0, 10, 8, 0, 0, 11, 8,242, 0, 22, 0,242, 0, 0, 0,
+242, 0, 1, 0, 1, 1,246, 7, 1, 1,247, 7, 1, 1, 12, 8, 1, 1, 13, 8, 0, 1, 14, 8, 15, 0, 49, 0, 0, 0, 27, 6,
+ 0, 0, 15, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 16, 8, 2, 0, 35, 0, 2, 0,234, 7, 2, 0,206, 6, 2, 0, 17, 0,
+ 6, 1,248, 7, 12, 0, 17, 8, 12, 0, 26, 6, 12, 0, 18, 8, 12, 0, 19, 8, 7, 1, 24, 0, 7, 1, 0, 0, 7, 1, 1, 0,
+212, 0, 80, 6, 15, 0, 20, 8, 15, 0, 21, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 22, 8, 2, 0, 23, 8, 2, 0, 24, 8,
+ 2, 0, 17, 0, 7, 0, 76, 2, 2, 0,254, 7, 2, 0,255, 7, 2, 0,233, 7, 2, 0, 25, 8, 2, 0,238, 7, 2, 0,181, 4,
+ 8, 1,248, 7, 12, 0, 26, 8, 12, 0, 27, 8, 12, 0, 18, 8, 0, 0, 28, 8, 9, 0, 29, 8, 9, 1, 14, 0, 0, 0, 30, 8,
+ 2, 0, 31, 8, 2, 0, 32, 8, 2, 0, 33, 8, 2, 0, 34, 8, 2, 0, 16, 5, 2, 0, 11, 5, 0, 1, 35, 8, 38, 0, 36, 8,
+ 4, 0, 37, 8, 4, 0, 38, 8, 4, 0, 39, 8, 4, 0, 35, 0, 0, 0, 40, 8, 10, 1, 3, 0, 0, 0, 41, 8, 4, 0, 42, 8,
+ 4, 0, 43, 8, 11, 1, 4, 0, 4, 0,142, 6, 4, 0, 44, 8, 4, 0,148, 6, 4, 0, 45, 8, 12, 1, 2, 0, 4, 0, 46, 8,
+ 4, 0, 47, 8, 13, 1, 5, 0, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8, 4, 0, 17, 0, 4, 0, 35, 0, 14, 1, 6, 0,
+ 0, 0, 51, 8, 0, 0, 99, 6, 41, 0,129, 0, 2, 0,104, 0, 2, 0, 15, 5, 4, 0, 35, 0, 15, 1, 14, 0, 15, 1, 0, 0,
+ 15, 1, 1, 0, 4, 0, 54, 0, 4, 0, 21, 0, 4, 0, 26, 0, 4, 0, 52, 8, 4, 0, 53, 8, 4, 0, 54, 8, 10, 1, 55, 8,
+ 0, 0, 51, 8, 14, 1, 94, 3, 11, 1, 56, 8, 12, 1, 57, 8, 13, 1, 58, 8, 16, 1, 12, 0, 0, 0,247, 1, 9, 0,217, 0,
+ 0, 0,218, 0, 4, 0,221, 0, 4, 0,229, 0, 9, 0,222, 0, 7, 0,224, 0, 7, 0,225, 0, 9, 0, 59, 8, 9, 0, 60, 8,
+ 9, 0,226, 0, 9, 0,228, 0, 17, 1, 48, 0, 17, 1, 0, 0, 17, 1, 1, 0, 9, 0, 61, 8, 9, 0, 24, 0, 0, 0, 25, 0,
+ 4, 0, 17, 0, 4, 0, 15, 0, 4, 0, 21, 0, 4, 0, 85, 0, 4, 0, 62, 8, 4, 0, 63, 8, 4, 0, 53, 8, 4, 0, 54, 8,
+ 4, 0, 64, 8, 4, 0,240, 0, 4, 0, 65, 8, 4, 0, 66, 8, 7, 0, 67, 8, 7, 0, 35, 0, 7, 0, 68, 8, 7, 0, 69, 8,
+ 4, 0,120, 0, 4, 0, 70, 8, 15, 1, 71, 8, 28, 0, 77, 0, 38, 0,116, 0, 24, 0, 72, 8, 41, 0,129, 0, 7, 0, 73, 8,
+ 7, 0, 74, 8, 16, 1, 56, 1, 17, 1, 75, 8, 17, 1, 76, 8, 17, 1, 77, 8, 12, 0, 78, 8,243, 0,215, 6, 9, 0, 79, 8,
+ 7, 0,254, 3, 7, 0, 80, 8, 7, 0, 81, 8, 4, 0, 82, 8, 4, 0, 83, 8, 7, 0, 84, 8, 9, 0, 85, 8, 4, 0, 86, 8,
+ 4, 0, 87, 8, 4, 0, 88, 8, 7, 0, 89, 8, 18, 1, 4, 0, 18, 1, 0, 0, 18, 1, 1, 0, 12, 0, 90, 8, 17, 1, 91, 8,
+200, 0, 11, 0, 12, 0, 92, 8, 12, 0, 78, 8, 12, 0, 93, 8, 17, 1, 94, 8, 0, 0, 95, 8, 0, 0, 96, 8, 4, 0, 97, 8,
+ 4, 0, 98, 8, 4, 0, 99, 8, 4, 0, 35, 0, 16, 0,100, 8, 19, 1, 4, 0, 7, 0,101, 8, 7, 0, 67, 3, 2, 0,102, 8,
+ 2, 0,103, 8, 20, 1, 6, 0, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8, 7, 0,107, 8, 4, 0,108, 8, 4, 0,109, 8,
+ 21, 1, 13, 0, 7, 0,110, 8, 7, 0,111, 8, 7, 0,112, 8, 7, 0,113, 8, 7, 0,114, 8, 7, 0,115, 8, 7, 0,116, 8,
+ 7, 0,117, 8, 7, 0,118, 8, 7, 0,119, 8, 4, 0,228, 2, 4, 0,120, 8, 4, 0,121, 8, 22, 1, 2, 0, 7, 0, 88, 5,
+ 7, 0, 35, 0, 23, 1, 5, 0, 7, 0,122, 8, 7, 0,123, 8, 4, 0, 88, 0, 4, 0,184, 2, 4, 0,124, 8, 24, 1, 6, 0,
+ 24, 1, 0, 0, 24, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 25, 1, 8, 0, 25, 1, 0, 0,
+ 25, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 7, 0, 21, 0, 7, 0,120, 0, 26, 1, 45, 0,
+ 26, 1, 0, 0, 26, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 2, 0, 40, 4, 2, 0,126, 8,
+ 7, 0,127, 8, 7, 0, 86, 0, 7, 0,241, 2, 4, 0,128, 8, 4, 0, 79, 0, 4, 0,186, 2, 7, 0,129, 8, 7, 0,130, 8,
+ 7, 0,131, 8, 7, 0,132, 8, 7, 0,133, 8, 7, 0,134, 8, 7, 0,238, 2, 7, 0, 53, 1, 7, 0,135, 8, 7, 0,136, 8,
+ 7, 0, 35, 0, 7, 0,137, 8, 7, 0,138, 8, 7, 0,139, 8, 2, 0,140, 8, 2, 0,141, 8, 2, 0,142, 8, 2, 0,143, 8,
+ 2, 0,144, 8, 2, 0,145, 8, 2, 0,146, 8, 2, 0,147, 8, 2, 0, 15, 2, 2, 0,148, 8, 2, 0, 12, 2, 2, 0,149, 8,
+ 0, 0,150, 8, 0, 0,151, 8, 7, 0,234, 0, 27, 1,152, 8, 58, 0,226, 1, 28, 1, 16, 0, 28, 1, 0, 0, 28, 1, 1, 0,
+ 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2,
+ 7, 0,236, 2, 7, 0,237, 2, 7, 0,153, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,225, 0, 5, 0, 2, 0, 15, 0,
+ 2, 0,154, 8, 2, 0, 17, 0, 2, 0,155, 8, 19, 0,177, 6,224, 0, 3, 0, 4, 0, 66, 0, 4, 0,156, 8,225, 0, 2, 0,
+ 29, 1, 7, 0, 29, 1, 0, 0, 29, 1, 1, 0, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 20, 0, 9, 0,157, 8,
+ 30, 1, 5, 0, 0, 0, 18, 0, 7, 0, 73, 1, 7, 0,158, 8, 4, 0,159, 8, 4, 0, 35, 0, 31, 1, 4, 0, 2, 0, 15, 0,
+ 2, 0, 17, 0, 2, 0, 87, 0, 2, 0, 67, 0, 32, 1, 4, 0, 0, 0, 18, 0, 57, 0,160, 8, 7, 0, 73, 1, 7, 0, 35, 0,
+ 33, 1, 6, 0, 2, 0,161, 8, 2, 0,162, 8, 2, 0, 15, 0, 2, 0,163, 8, 0, 0,164, 8, 0, 0,165, 8, 34, 1, 5, 0,
+ 4, 0, 15, 0, 4, 0, 35, 0, 0, 0, 18, 0, 0, 0,166, 8, 0, 0,167, 8, 35, 1, 3, 0, 4, 0, 15, 0, 4, 0, 35, 0,
+ 0, 0, 18, 0, 36, 1, 4, 0, 2, 0,168, 8, 2, 0,169, 8, 2, 0, 17, 0, 2, 0, 35, 0, 37, 1, 6, 0, 0, 0, 18, 0,
+ 0, 0,170, 8, 2, 0,171, 8, 2, 0,238, 2, 2, 0, 66, 1, 2, 0, 67, 0, 38, 1, 5, 0, 0, 0, 18, 0, 7, 0, 67, 3,
+ 7, 0,131, 4, 2, 0, 17, 0, 2, 0,198, 2, 39, 1, 3, 0, 0, 0, 18, 0, 4, 0,186, 2, 4, 0,168, 8, 40, 1, 7, 0,
+ 0, 0, 18, 0, 7, 0,131, 4, 0, 0,172, 8, 0, 0,173, 8, 2, 0, 66, 1, 2, 0, 87, 0, 4, 0,174, 8, 41, 1, 4, 0,
+ 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0,202, 2, 42, 1, 3, 0, 24, 0,177, 8, 0, 0,178, 8, 0, 0,179, 8,
+ 43, 1, 18, 0, 43, 1, 0, 0, 43, 1, 1, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0, 17, 0, 2, 0,181, 8, 2, 0,182, 8,
+ 2, 0,183, 8, 2, 0, 87, 0, 2, 0, 67, 0, 0, 0, 18, 0, 9, 0, 2, 0, 44, 1,184, 8, 24, 0, 42, 0, 2, 0,105, 5,
+ 2, 0, 80, 8, 2, 0,185, 8, 2, 0, 35, 0, 45, 1, 11, 0, 0, 0, 18, 0, 0, 0, 15, 0, 0, 0,186, 8, 2, 0, 17, 0,
+ 2, 0,198, 2, 2, 0,187, 8, 4, 0,188, 8, 4, 0,189, 8, 4, 0,190, 8, 4, 0,191, 8, 4, 0,192, 8, 46, 1, 1, 0,
+ 0, 0,193, 8, 47, 1, 4, 0, 34, 0,141, 6, 0, 0,140, 7, 4, 0, 66, 1, 4, 0, 17, 0, 44, 1, 18, 0, 44, 1, 0, 0,
+ 44, 1, 1, 0, 44, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,195, 8, 2, 0,183, 8, 2, 0,180, 8, 2, 0,196, 8,
+ 2, 0, 67, 0, 2, 0,223, 1, 0, 0, 18, 0, 9, 0, 2, 0, 48, 1,184, 8, 43, 1,197, 8, 2, 0, 13, 0, 2, 0,198, 8,
+ 4, 0,199, 8, 49, 1, 3, 0, 4, 0,212, 2, 4, 0, 35, 0, 24, 0, 42, 0, 50, 1, 12, 0,155, 0,200, 8, 2, 0, 15, 0,
+ 2, 0, 17, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0,202, 8, 2, 0,203, 8, 2, 0,204, 8,
+ 2, 0,205, 8, 7, 0,206, 8, 51, 1, 8, 0, 7, 0,207, 8, 7, 0,208, 8, 7, 0,209, 8, 7, 0,210, 8, 7, 0,211, 8,
+ 7, 0,212, 8, 7, 0,213, 8, 7, 0,214, 8, 52, 1, 13, 0, 2, 0, 17, 0, 2, 0,216, 6, 4, 0, 87, 0, 4, 0, 67, 0,
+ 2, 0,215, 8, 7, 0,254, 3, 7, 0,216, 8,243, 0,215, 6, 51, 1,217, 8, 2, 0, 15, 0, 2, 0,245, 1, 2, 0,241, 5,
+ 2, 0,218, 8, 53, 1, 11, 0, 4, 0,212, 2, 2, 0, 15, 0, 2, 0, 17, 0, 24, 0, 42, 0, 73, 0,219, 8, 0, 0, 18, 0,
+ 7, 0,220, 8, 7, 0,221, 8, 7, 0,137, 3, 2, 0,222, 8, 2, 0,223, 8, 54, 1, 5, 0, 2, 0, 15, 0, 2, 0, 87, 0,
+ 4, 0, 35, 0, 38, 0,116, 0, 24, 0, 96, 5, 55, 1, 5, 0, 4, 0, 35, 0, 4, 0, 15, 0, 0, 0, 18, 0, 0, 0,166, 8,
+ 24, 0, 42, 0, 56, 1, 13, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0,138, 3, 7, 0,224, 8, 7, 0,225, 8,
+ 7, 0,181, 4, 7, 0,150, 3, 7, 0,109, 3, 7, 0,112, 3, 7, 0,226, 8, 7, 0,227, 8, 24, 0,228, 8, 57, 1, 10, 0,
+ 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0, 87, 0, 2, 0, 67, 0,
+ 2, 0,223, 1, 2, 0,245, 1, 58, 1, 8, 0, 24, 0, 42, 0, 7, 0,235, 2, 7, 0,229, 8, 7, 0,230, 8, 7, 0, 35, 0,
+ 2, 0, 87, 0, 2, 0,198, 2, 7, 0, 67, 0, 59, 1, 12, 0, 2, 0, 15, 0, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0,238, 2,
+ 2, 0,212, 2, 2, 0,231, 8, 4, 0, 35, 0, 7, 0,232, 8, 7, 0,233, 8, 7, 0,234, 8, 7, 0,235, 8, 0, 0,236, 8,
+ 60, 1, 9, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 2, 0,181, 4, 2, 0, 61, 0,
+ 2, 0,237, 8, 2, 0,238, 8, 61, 1, 7, 0, 4, 0,186, 2, 4, 0,239, 8, 4, 0,240, 8, 4, 0,241, 8, 7, 0,242, 8,
+ 7, 0,243, 8, 0, 0,172, 8, 62, 1, 7, 0, 0, 0,244, 8, 24, 0,245, 8, 0, 0,178, 8, 2, 0,246, 8, 2, 0, 87, 0,
+ 4, 0, 67, 0, 0, 0,179, 8, 63, 1, 6, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0,247, 8,
+ 0, 0,248, 8, 64, 1, 1, 0, 4, 0, 17, 0, 65, 1, 6, 0, 0, 0, 90, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0,249, 8,
+ 7, 0,250, 8, 34, 0,141, 6, 66, 1, 4, 0, 0, 0,145, 2, 2, 0, 17, 0, 4, 0, 15, 0, 24, 0, 42, 0, 67, 1, 2, 0,
+ 4, 0, 15, 0, 4, 0, 61, 6, 68, 1, 6, 0, 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0, 23, 2, 24, 0, 46, 3,
+ 24, 0,251, 8, 48, 1, 10, 0, 48, 1, 0, 0, 48, 1, 1, 0, 48, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,180, 8,
+ 2, 0,252, 8, 0, 0, 18, 0, 9, 0, 2, 0, 24, 0, 42, 0,243, 0, 16, 0, 19, 0, 29, 0, 0, 0, 32, 0, 35, 0,144, 0,
+ 9, 0,217, 0, 35, 0,253, 8, 28, 0, 77, 0, 7, 0,254, 3, 7, 0,254, 8, 7, 0,216, 8, 7, 0,207, 8, 7, 0,208, 8,
+ 7, 0,255, 8, 4, 0, 88, 0, 4, 0, 35, 0, 9, 0, 0, 9, 9, 0, 1, 9, 69, 1, 6, 0, 69, 1, 0, 0, 69, 1, 1, 0,
+ 24, 0, 42, 0, 9, 0, 2, 9, 2, 0,241, 0, 0, 0,183, 2, 58, 0, 4, 0, 19, 0, 29, 0, 12, 0, 3, 9, 4, 0,125, 0,
+ 7, 0, 4, 9, 70, 1, 27, 0, 70, 1, 0, 0, 70, 1, 1, 0, 18, 0, 5, 9, 70, 1, 36, 0, 12, 0, 6, 9, 0, 0, 18, 0,
+ 7, 0, 7, 9, 7, 0, 8, 9, 7, 0, 9, 9, 7, 0, 10, 9, 4, 0, 17, 0, 7, 0, 11, 9, 7, 0, 12, 9, 7, 0, 13, 9,
+ 7, 0, 73, 1, 7, 0, 23, 2, 7, 0, 14, 9, 7, 0,184, 2, 7, 0, 15, 9, 7, 0, 16, 9, 7, 0, 17, 9, 7, 0, 18, 9,
+ 7, 0, 19, 9, 7, 0,166, 0, 4, 0,125, 0, 2, 0,142, 5, 2, 0,181, 4, 71, 1, 25, 0, 19, 0, 29, 0, 31, 0, 72, 0,
+ 12, 0, 20, 9, 12, 0, 21, 9, 12, 0, 22, 9, 70, 1, 23, 9, 9, 0, 24, 9, 9, 0, 25, 9, 4, 0, 17, 0, 4, 0, 35, 6,
+ 2, 0,242, 2, 2, 0, 90, 6, 4, 0, 26, 9, 4, 0,125, 0, 4, 0, 27, 9, 2, 0, 28, 9, 2, 0, 29, 9, 2, 0, 30, 9,
+ 2, 0, 31, 9, 4, 0, 32, 9, 4, 0, 33, 9, 4, 0, 34, 9, 4, 0, 35, 9, 4, 0, 36, 9, 4, 0, 37, 9, 72, 1, 2, 0,
+ 7, 0,143, 2, 4, 0, 17, 0,159, 0, 5, 0, 72, 1, 38, 9, 4, 0,184, 2, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 17, 0,
+158, 0, 16, 0, 4, 0, 41, 9, 4, 0, 42, 9, 4, 0, 43, 9, 4, 0, 44, 9, 2, 0, 45, 9, 2, 0, 46, 9, 2, 0, 47, 9,
+ 2, 0,241, 0, 2, 0, 48, 9, 2, 0, 49, 9, 2, 0, 50, 9, 2, 0, 51, 9, 4, 0, 52, 9, 4, 0, 53, 9, 4, 0, 54, 9,
+ 4, 0, 55, 9, 73, 1, 41, 0, 73, 1, 0, 0, 73, 1, 1, 0, 18, 0, 5, 9, 12, 0,164, 3, 0, 0, 18, 0, 2, 0, 17, 0,
+ 2, 0, 56, 9, 2, 0, 57, 9, 2, 0, 58, 9, 2, 0,123, 3, 2, 0, 59, 9, 4, 0, 63, 2, 4, 0, 34, 9, 4, 0, 35, 9,
+ 70, 1, 60, 9, 73, 1, 36, 0, 73, 1, 61, 9, 12, 0, 62, 9,159, 0,102, 3, 24, 0, 63, 9, 73, 1, 64, 9, 7, 0, 61, 1,
+ 7, 0,166, 0, 7, 0, 65, 9, 7, 0, 2, 2, 7, 0,114, 3, 7, 0,116, 3, 2, 0,146, 3, 2, 0, 35, 0, 7, 0, 66, 9,
+ 7, 0, 67, 9, 7, 0,119, 3, 7, 0, 68, 9, 7, 0, 69, 9, 7, 0, 70, 9, 7, 0, 71, 9, 7, 0, 72, 9, 7, 0, 73, 9,
+ 7, 0, 74, 9, 7, 0, 75, 9, 7, 0, 56, 2,156, 0, 14, 0, 12, 0, 76, 9, 68, 0, 77, 9, 2, 0, 17, 0, 2, 0, 78, 9,
+ 7, 0, 92, 2, 7, 0, 79, 9, 7, 0, 80, 9, 12, 0, 81, 9, 4, 0, 82, 9, 4, 0, 83, 9, 9, 0, 84, 9, 9, 0, 85, 9,
+158, 0,101, 3, 0, 0, 86, 9, 74, 1, 1, 0, 4, 0, 83, 9, 75, 1, 12, 0, 4, 0, 83, 9, 7, 0,192, 8, 2, 0, 87, 9,
+ 2, 0, 88, 9, 7, 0, 89, 9, 7, 0, 90, 9, 2, 0, 91, 9, 2, 0, 17, 0, 7, 0, 92, 9, 7, 0, 93, 9, 7, 0, 94, 9,
+ 7, 0, 95, 9, 76, 1, 7, 0, 76, 1, 0, 0, 76, 1, 1, 0, 12, 0, 96, 9, 4, 0, 17, 0, 4, 0, 97, 9, 0, 0,244, 3,
+251, 0, 98, 9,155, 0, 7, 0, 19, 0, 29, 0, 12, 0, 99, 9, 12, 0, 76, 9, 12, 0,100, 9, 12, 0, 98, 0, 4, 0, 17, 0,
+ 4, 0,101, 9,215, 0, 5, 0, 19, 0,102, 9, 12, 0, 76, 9, 58, 0,103, 9, 4, 0,104, 9, 4, 0, 17, 0, 77, 1, 13, 0,
+211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,155, 0, 97, 3,
+215, 0,105, 9, 0, 0, 66, 1, 0, 0, 83, 6, 2, 0, 17, 0, 7, 0,106, 9, 78, 1, 8, 0, 78, 1, 0, 0, 78, 1, 1, 0,
+ 76, 1,107, 9, 28, 0, 77, 0, 12, 0,103, 3, 4, 0, 17, 0, 0, 0, 18, 0, 4, 0,231, 7, 79, 1, 5, 0, 79, 1, 0, 0,
+ 79, 1, 1, 0, 28, 0, 77, 0, 2, 0, 17, 0, 0, 0,108, 9, 80, 1, 14, 0, 80, 1, 0, 0, 80, 1, 1, 0, 9, 0, 2, 0,
+ 2, 0, 15, 0, 2, 0, 17, 0, 0, 0,109, 9, 0, 0,110, 9, 0, 0,108, 9, 7, 0,111, 9, 7, 0,112, 9, 4, 0, 35, 0,
+ 28, 0, 77, 0, 7, 0,113, 9, 7, 0,114, 9, 81, 1, 9, 0, 81, 1, 0, 0, 81, 1, 1, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 7, 0,116, 9, 2, 0,117, 9, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,118, 9, 82, 1, 7, 0, 34, 0,141, 6, 18, 0, 5, 9,
+ 4, 0, 17, 0, 4, 0,119, 9, 12, 0,120, 9, 24, 0,115, 9, 0, 0,245, 2, 83, 1, 15, 0, 24, 0,115, 9, 2, 0,121, 9,
+ 2, 0, 17, 0, 2, 0,122, 9, 2, 0,123, 9, 0, 0,245, 2, 24, 0,124, 9, 0, 0,125, 9, 7, 0,126, 9, 7, 0, 23, 2,
+ 7, 0,127, 9, 7, 0,128, 9, 2, 0, 15, 0, 2, 0, 66, 1, 7, 0, 73, 1, 84, 1, 6, 0, 24, 0,115, 9, 7, 0, 38, 9,
+ 2, 0,129, 9, 2, 0,130, 9, 2, 0, 17, 0, 2, 0,131, 9, 85, 1, 6, 0, 24, 0,115, 9, 4, 0,132, 9, 4, 0,133, 9,
+ 4, 0, 88, 0, 4, 0, 35, 0, 0, 0,245, 2, 86, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2,
+ 87, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2, 88, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0,
+ 4, 0,132, 9, 0, 0,245, 2, 89, 1, 2, 0, 4, 0, 17, 0, 7, 0,254, 3, 90, 1, 2, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 91, 1, 10, 0, 24, 0,115, 9, 4, 0,134, 9, 7, 0,119, 0, 4, 0, 17, 0, 2, 0,139, 6, 2, 0,135, 9, 2, 0, 87, 0,
+ 2, 0, 67, 0, 7, 0,136, 9, 0, 0,245, 2, 92, 1, 10, 0, 24, 0,115, 9, 2, 0, 15, 0, 2, 0, 48, 4, 4, 0, 85, 0,
+ 4, 0, 86, 0, 7, 0,229, 8, 7, 0,230, 8, 4, 0, 35, 0,155, 0,200, 8, 0, 0,245, 2, 93, 1, 4, 0, 24, 0,115, 9,
+ 4, 0,124, 3, 4, 0,137, 9, 0, 0,245, 2, 94, 1, 4, 0, 24, 0,115, 9, 4, 0,124, 3, 4, 0, 35, 0, 0, 0,245, 2,
+ 95, 1, 6, 0, 24, 0,115, 9, 7, 0,119, 0, 7, 0, 58, 3, 4, 0,138, 9, 2, 0,124, 3, 2, 0,125, 3, 96, 1, 6, 0,
+ 24, 0,115, 9, 4, 0,139, 9, 4, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 0, 0,245, 2, 97, 1, 16, 0, 24, 0,115, 9,
+ 24, 0, 61, 9, 4, 0, 15, 0, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, 7, 0,146, 9, 7, 0,147, 9, 7, 0,148, 9,
+ 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0, 87, 0, 2, 0, 67, 0, 98, 1, 3, 0,
+ 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 15, 2, 99, 1, 5, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 35, 0, 7, 0,152, 9,
+ 0, 0,245, 2,100, 1, 10, 0, 24, 0,115, 9, 0, 0,245, 2, 2, 0,153, 9, 2, 0,154, 9, 0, 0,155, 9, 0, 0,156, 9,
+ 7, 0,157, 9, 7, 0,158, 9, 7, 0,159, 9, 7, 0,160, 9,101, 1, 5, 0, 24, 0,115, 9, 0, 0,245, 2, 7, 0,192, 2,
+ 2, 0,161, 9, 2, 0, 17, 0,102, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0,162, 9,
+ 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,103, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
+ 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,104, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
+ 7, 0, 10, 0, 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,105, 1, 7, 0, 24, 0,115, 9, 0, 0,245, 2,
+ 7, 0, 73, 1, 7, 0, 82, 1, 2, 0, 17, 0, 2, 0, 66, 1, 4, 0, 35, 0,106, 1, 5, 0, 24, 0, 46, 3, 7, 0, 73, 1,
+ 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,164, 9,107, 1, 10, 0,107, 1, 0, 0,107, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 0, 0,165, 9, 7, 0, 16, 1, 7, 0, 17, 1, 2, 0, 96, 9, 2, 0,166, 9, 24, 0, 42, 0,108, 1, 22, 0,108, 1, 0, 0,
+108, 1, 1, 0, 2, 0, 17, 0, 2, 0, 66, 1, 2, 0,167, 9, 2, 0,168, 9, 28, 0, 77, 0,155, 0,200, 8, 24, 0,158, 0,
+ 7, 0, 85, 0, 7, 0, 86, 0, 7, 0,169, 9, 7, 0,170, 9, 7, 0,171, 9, 7, 0,172, 9, 7, 0,231, 2, 7, 0,173, 9,
+ 7, 0,202, 8, 7, 0,174, 9, 0, 0,175, 9, 0, 0,176, 9, 12, 0,105, 3,109, 1, 8, 0, 7, 0, 30, 2, 7, 0,229, 8,
+ 7, 0,230, 8, 9, 0, 2, 0, 2, 0,177, 9, 2, 0,178, 9, 2, 0,179, 9, 2, 0,180, 9,110, 1, 18, 0,110, 1, 0, 0,
+110, 1, 1, 0,110, 1,181, 9, 0, 0, 18, 0,109, 1,182, 9, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,183, 9, 2, 0,184, 9,
+ 2, 0,185, 9, 2, 0,186, 9, 4, 0, 87, 0, 7, 0,187, 9, 7, 0,188, 9, 4, 0,189, 9, 4, 0,190, 9,110, 1,191, 9,
+111, 1,192, 9,112, 1, 33, 0,112, 1, 0, 0,112, 1, 1, 0,112, 1,193, 9, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0,
+ 2, 0, 52, 8, 2, 0, 80, 8, 2, 0,194, 9, 2, 0,144, 6, 2, 0,184, 9, 2, 0,154, 8, 12, 0,195, 8, 12, 0,195, 9,
+ 19, 0,177, 6, 9, 0,196, 9, 7, 0,187, 9, 7, 0,188, 9, 7, 0, 65, 2, 7, 0,197, 9, 2, 0,198, 9, 2, 0,199, 9,
+ 7, 0,200, 9, 7, 0,201, 9, 2, 0,202, 9, 2, 0,203, 9, 9, 0,204, 9, 16, 0,205, 9, 16, 0,206, 9, 16, 0,207, 9,
+113, 1,145, 0,114, 1,208, 9,115, 1,209, 9,111, 1, 8, 0,111, 1, 0, 0,111, 1, 1, 0,112, 1,210, 9,112, 1,211, 9,
+110, 1,212, 9,110, 1,191, 9, 4, 0, 17, 0, 4, 0, 35, 0, 52, 0, 22, 0, 19, 0, 29, 0, 31, 0, 72, 0,157, 0,100, 3,
+ 12, 0,213, 9, 12, 0,214, 9,109, 1,215, 9, 12, 0,216, 9, 4, 0, 15, 0, 4, 0,217, 9, 4, 0,218, 9, 4, 0,219, 9,
+ 4, 0, 17, 0, 4, 0, 35, 0, 12, 0,220, 9,115, 1,221, 9, 4, 0,222, 9, 9, 0,223, 9, 9, 0,224, 9, 4, 0,225, 9,
+ 9, 0,226, 9, 9, 0,227, 9, 9, 0,228, 9,116, 1, 6, 0, 4, 0,118, 0, 4, 0,120, 0, 4, 0,154, 8, 0, 0,229, 9,
+ 0, 0,230, 9, 2, 0, 35, 0,117, 1, 16, 0, 2, 0,254, 7, 2, 0,255, 7, 2, 0,231, 9, 2, 0,232, 9, 2, 0,233, 9,
+ 2, 0, 65, 0, 7, 0,230, 2, 7, 0,234, 9, 7, 0,235, 9, 2, 0, 88, 1, 0, 0,236, 9, 0, 0,237, 9, 2, 0,238, 9,
+ 2, 0, 35, 0, 4, 0,239, 9, 4, 0,240, 9,118, 1, 9, 0, 7, 0,241, 9, 7, 0,242, 9, 7, 0,255, 8, 7, 0, 67, 3,
+ 7, 0,243, 9, 7, 0, 96, 6, 2, 0, 65, 3, 0, 0,244, 9, 0, 0, 35, 0,119, 1, 4, 0, 7, 0,245, 9, 7, 0,246, 9,
+ 2, 0, 65, 3, 2, 0, 35, 0,120, 1, 3, 0, 7, 0,247, 9, 7, 0, 67, 8, 7, 0, 13, 0,121, 1, 7, 0, 0, 0,247, 1,
+ 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0,203, 4, 4, 0,120, 0, 4, 0, 46, 4,122, 1, 9, 0, 7, 0,248, 9,
+ 7, 0,249, 9, 7, 0,250, 9, 7, 0, 76, 2, 7, 0,251, 9, 7, 0,252, 9, 7, 0,253, 9, 2, 0,254, 9, 2, 0,255, 9,
+123, 1, 8, 0, 2, 0, 0, 10, 2, 0, 1, 10, 2, 0, 2, 10, 2, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10,
+ 7, 0, 7, 10,124, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,125, 1, 2, 0, 0, 0,160, 0, 0, 0, 8, 10,126, 1, 1, 0,
+ 0, 0, 18, 0,127, 1, 10, 0, 0, 0, 9, 10, 0, 0, 10, 10, 0, 0, 89, 6, 0, 0, 11, 10, 2, 0,231, 9, 2, 0, 12, 10,
+ 7, 0, 13, 10, 7, 0, 14, 10, 7, 0, 15, 10, 7, 0,173, 9,128, 1, 2, 0, 9, 0, 16, 10, 9, 0, 17, 10,129, 1, 11, 0,
+ 0, 0, 15, 5, 0, 0, 15, 0, 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 18, 10, 0, 0,104, 0, 0, 0,145, 2, 7, 0, 19, 10,
+ 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10,130, 1, 8, 0, 7, 0,161, 8, 7, 0,119, 0, 7, 0,237, 9, 7, 0,149, 2,
+ 7, 0, 23, 10, 7, 0,230, 0, 7, 0, 24, 10, 4, 0, 15, 0,131, 1, 4, 0, 2, 0, 25, 10, 2, 0, 26, 10, 2, 0, 27, 10,
+ 2, 0, 35, 0,132, 1, 8, 0, 7, 0, 28, 10, 7, 0,192, 2, 7, 0, 29, 10, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8,
+ 7, 0, 30, 10, 7, 0, 31, 10,133, 1, 6, 0, 2, 0, 32, 10, 2, 0, 33, 10, 7, 0, 34, 10, 7, 0, 35, 10, 7, 0, 36, 10,
+ 7, 0, 37, 10,134, 1, 1, 0, 0, 0, 18, 0,135, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 17, 0, 2, 0, 38, 10,
+136, 1, 10, 0, 2, 0,232, 3, 2, 0, 17, 0, 7, 0,131, 4, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10, 7, 0, 42, 10,
+135, 1, 43, 10,135, 1, 44, 10,135, 1, 45, 10, 55, 0, 11, 0, 4, 0, 17, 0, 4, 0, 61, 0, 4, 0, 46, 10, 4, 0, 47, 10,
+ 16, 0, 48, 10, 16, 0, 49, 10,136, 1, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10, 7, 0, 53, 10, 7, 0, 54, 10,228, 0, 10, 0,
+ 4, 0, 96, 9, 4, 0, 55, 10, 7, 0, 56, 10, 7, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 8, 0, 7, 0, 10, 0,
+ 4, 0, 66, 1, 4, 0,235, 2,227, 0, 18, 0, 4, 0,123, 0, 4, 0, 60, 10, 4, 0, 61, 10, 7, 0, 62, 10, 4, 0, 63, 10,
+ 7, 0, 64, 10, 7, 0, 65, 10, 4, 0, 66, 10, 7, 0, 67, 10, 4, 0, 68, 10, 7, 0, 69, 10,228, 0, 70, 10, 7, 0, 71, 10,
+ 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 4, 0, 75, 10, 4, 0, 35, 0,137, 1, 4, 0, 39, 0,222, 2, 7, 0, 76, 10,
+ 7, 0,155, 1, 7, 0, 35, 0,189, 0, 35, 0, 19, 0, 29, 0,137, 1, 77, 10, 55, 0, 43, 10, 43, 0, 78, 10, 49, 0, 79, 10,
+ 22, 0,145, 0, 0, 0, 80, 10, 4, 0, 81, 10, 4, 0, 35, 0, 7, 0, 82, 10, 2, 0,247, 5, 2, 0, 83, 10, 4, 0,104, 0,
+ 4, 0, 17, 0, 7, 0, 84, 10, 4, 0, 73, 2, 4, 0, 85, 10, 7, 0, 86, 10, 7, 0, 87, 10, 7, 0, 88, 10, 7, 0,155, 1,
+ 4, 0, 89, 10, 7, 0, 90, 10, 0, 0, 91, 10, 0, 0, 92, 10, 0, 0, 93, 10, 0, 0,223, 1, 7, 0, 94, 10, 7, 0, 95, 10,
+ 7, 0, 96, 10, 7, 0, 97, 10, 4, 0, 98, 10, 7, 0, 99, 10, 7, 0,100, 10, 7, 0,101, 10,138, 1, 10, 0, 4, 0, 15, 0,
+ 4, 0,119, 0, 4, 0, 17, 0, 4, 0,185, 3, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 0, 0, 90, 0, 0, 0, 18, 0,
+ 9, 0, 2, 0,139, 1, 1, 0, 0, 0, 40, 8, 84, 0, 7, 0,138, 1,105, 10, 4, 0,106, 10, 4, 0,107, 10, 4, 0,108, 10,
+ 4, 0, 35, 0, 9, 0,109, 10,139, 1,110, 10,140, 1, 5, 0, 7, 0,143, 2, 7, 0,212, 2, 7, 0, 23, 2, 2, 0,119, 2,
+ 2, 0, 35, 0,141, 1, 5, 0, 7, 0,143, 2, 7, 0,111, 10, 7, 0,112, 10, 7, 0,113, 10, 7, 0,212, 2,142, 1, 5, 0,
+ 24, 0,114, 10,143, 1, 20, 0, 7, 0,215, 5, 7, 0,115, 10, 7, 0, 54, 0,144, 1, 3, 0, 7, 0,116, 10, 4, 0,117, 10,
+ 4, 0,118, 10,145, 1, 7, 0, 4, 0,119, 10, 4, 0,120, 10, 4, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10, 7, 0,124, 10,
+ 7, 0, 54, 0,146, 1, 8, 0,146, 1, 0, 0,146, 1, 1, 0, 24, 0, 42, 0, 4, 0,249, 0, 2, 0, 17, 0, 2, 0, 66, 1,
+ 7, 0,212, 2, 7, 0,169, 8,147, 1, 6, 0,147, 1, 0, 0,147, 1, 1, 0, 24, 0, 42, 0, 2, 0,197, 2, 2, 0, 17, 0,
+ 2, 0,125, 10,148, 1, 17, 0,141, 1,179, 3,141, 1,126, 10,140, 1,127, 10,141, 1,152, 8,142, 1,128, 10, 4, 0, 79, 0,
+ 7, 0,212, 2, 7, 0,241, 2, 7, 0,129, 10, 4, 0,119, 10, 4, 0,130, 10, 7, 0,123, 10, 7, 0,124, 10, 7, 0,104, 0,
+ 4, 0,131, 10, 2, 0, 17, 0, 2, 0,132, 10,149, 1, 13, 0, 7, 0,133, 10, 7, 0,245, 0, 7, 0,116, 10, 7, 0,134, 10,
+ 7, 0,135, 10, 7, 0,136, 10, 7, 0,137, 10, 7, 0,138, 10, 7, 0,139, 10, 7, 0,140, 10, 7, 0,141, 10, 4, 0, 17, 0,
+ 4, 0, 35, 0,150, 1,115, 0, 19, 0, 29, 0, 31, 0, 72, 0,151, 1,142, 10,149, 1,143, 10,166, 0, 68, 4, 4, 0, 17, 0,
+ 2, 0, 15, 0, 2, 0,153, 9, 2, 0,144, 10, 2, 0,145, 10, 2, 0,146, 3, 2, 0,146, 10, 2, 0,147, 10, 2, 0,148, 10,
+ 2, 0,149, 10, 2, 0,150, 10, 2, 0,151, 10, 2, 0,152, 10, 2, 0,153, 10, 2, 0,113, 5, 2, 0,154, 10, 2, 0,155, 10,
+ 2, 0,156, 10, 2, 0,157, 10, 2, 0,158, 10, 2, 0, 12, 2, 2, 0,145, 8, 2, 0,120, 8, 2, 0,159, 10, 2, 0,160, 10,
+ 2, 0,195, 3, 2, 0,196, 3, 2, 0,161, 10, 2, 0,162, 10, 2, 0,163, 10, 2, 0,164, 10, 7, 0,165, 10, 7, 0,166, 10,
+ 7, 0,167, 10, 2, 0, 63, 5, 2, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10, 7, 0,127, 8, 7, 0, 86, 0,
+ 7, 0,241, 2, 7, 0,133, 8, 7, 0,172, 10, 7, 0,173, 10, 7, 0,174, 10, 4, 0,128, 8, 4, 0,126, 8, 4, 0,175, 10,
+ 7, 0,129, 8, 7, 0,130, 8, 7, 0,131, 8, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10, 7, 0,180, 10,
+ 7, 0,181, 10, 7, 0,182, 10, 7, 0,183, 10, 7, 0,184, 10, 7, 0,137, 3, 7, 0,104, 0, 7, 0,185, 10, 7, 0,186, 10,
+ 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10, 4, 0,192, 10, 4, 0,193, 10, 7, 0,194, 10,
+ 7, 0,195, 10, 7, 0,196, 10, 7, 0,197, 10, 7, 0,198, 10, 7, 0,204, 0, 7, 0,199, 10, 7, 0,222, 3, 7, 0,220, 3,
+ 7, 0,221, 3, 7, 0,200, 10, 7, 0,201, 10, 7, 0,202, 10, 7, 0,203, 10, 7, 0,204, 10, 7, 0,205, 10, 7, 0,206, 10,
+ 7, 0,207, 10, 7, 0,208, 10, 7, 0,209, 10, 7, 0,210, 10, 7, 0,211, 10, 7, 0,212, 10, 7, 0,213, 10, 7, 0,214, 10,
+ 7, 0,215, 10, 7, 0,216, 10, 7, 0,217, 10, 4, 0,218, 10, 4, 0,219, 10, 58, 0,169, 3, 12, 0,220, 10, 58, 0,221, 10,
+ 24, 0,222, 10, 24, 0,223, 10, 28, 0, 77, 0,161, 0, 58, 1,161, 0,224, 10,140, 0, 47, 0,140, 0, 0, 0,140, 0, 1, 0,
+150, 1,225, 10,148, 1,226, 10,145, 1, 61, 9,169, 0,250, 3, 9, 0,251, 3,152, 1,227, 10,152, 1,228, 10, 12, 0,229, 10,
+ 12, 0,230, 10,125, 0,231, 10,133, 0,232, 10,133, 0,233, 10, 24, 0,234, 10, 24, 0,235, 10, 24, 0, 36, 0, 12, 0,120, 9,
+ 0, 0, 18, 0, 7, 0,234, 0, 7, 0, 12, 3, 7, 0,236, 10, 4, 0,186, 2, 4, 0,237, 10, 4, 0, 17, 0, 4, 0,128, 8,
+ 4, 0,238, 10, 4, 0,239, 10, 4, 0,240, 10, 2, 0,241, 0, 2, 0,241, 10, 2, 0,242, 10, 2, 0,243, 10, 0, 0,244, 10,
+ 2, 0,245, 10, 2, 0,246, 10, 2, 0,247, 10, 9, 0,248, 10,129, 0, 67, 4, 12, 0,255, 2, 12, 0,249, 10,144, 1,250, 10,
+ 4, 0,251, 10, 4, 0,252, 10,153, 1,253, 10,154, 1,254, 10, 7, 0,255, 10,127, 0, 37, 0,155, 1, 0, 9, 7, 0, 37, 4,
+ 7, 0, 0, 11, 7, 0, 1, 11, 7, 0,215, 5, 7, 0,147, 3, 7, 0,137, 3, 7, 0, 2, 11, 7, 0, 75, 2, 7, 0, 3, 11,
+ 7, 0, 4, 11, 7, 0, 5, 11, 7, 0, 6, 11, 7, 0, 7, 11, 7, 0, 8, 11, 7, 0, 38, 4, 7, 0, 9, 11, 7, 0, 10, 11,
+ 7, 0, 11, 11, 7, 0, 39, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 12, 11, 7, 0, 13, 11, 4, 0, 14, 11, 4, 0, 88, 0,
+ 4, 0, 15, 11, 4, 0, 16, 11, 2, 0, 17, 11, 2, 0, 18, 11, 2, 0, 19, 11, 2, 0, 20, 11, 2, 0, 21, 11, 2, 0, 22, 11,
+ 2, 0, 23, 11, 2, 0,181, 4,166, 0, 68, 4,128, 0, 9, 0,155, 1, 24, 11, 7, 0, 25, 11, 7, 0, 26, 11, 7, 0,227, 1,
+ 7, 0, 27, 11, 4, 0, 88, 0, 2, 0, 28, 11, 2, 0, 29, 11, 58, 0,226, 1,156, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
+ 7, 0, 1, 2, 7, 0, 30, 11,157, 1, 6, 0,157, 1, 0, 0,157, 1, 1, 0,156, 1, 38, 9, 4, 0,247, 0, 2, 0, 31, 11,
+ 2, 0, 17, 0,158, 1, 5, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 32, 11, 4, 0, 33, 11, 4, 0, 17, 0,159, 1, 9, 0,
+159, 1, 0, 0,159, 1, 1, 0, 12, 0,118, 0,158, 1, 34, 11, 4, 0, 17, 0, 2, 0, 31, 11, 2, 0, 35, 11, 7, 0, 89, 0,
+ 0, 0, 36, 11,157, 0, 6, 0, 19, 0, 29, 0, 12, 0, 31, 5, 4, 0, 17, 0, 2, 0, 37, 11, 2, 0, 38, 11, 9, 0, 39, 11,
+160, 1, 6, 0, 12, 0, 40, 11, 4, 0, 41, 11, 4, 0, 42, 11, 4, 0, 17, 0, 4, 0, 35, 0,209, 0, 43, 11,161, 1, 17, 0,
+ 19, 0, 29, 0,162, 1, 44, 11,162, 1, 45, 11, 12, 0, 46, 11, 4, 0, 47, 11, 2, 0, 48, 11, 2, 0, 49, 11, 12, 0, 50, 11,
+ 12, 0, 51, 11,160, 1, 52, 11, 12, 0, 53, 11, 12, 0, 54, 11, 12, 0, 55, 11, 12, 0, 56, 11,163, 1, 57, 11, 12, 0, 58, 11,
+209, 0, 59, 11,162, 1, 31, 0,162, 1, 0, 0,162, 1, 1, 0, 9, 0, 60, 11, 4, 0,232, 7, 2, 0, 61, 11, 2, 0, 35, 0,
+ 0, 1, 62, 11, 0, 1, 63, 11, 0, 0, 64, 11, 2, 0, 65, 11, 2, 0, 66, 11, 2, 0,254, 7, 2, 0,255, 7, 2, 0, 67, 11,
+ 2, 0, 68, 11, 2, 0,185, 3, 2, 0,206, 6, 2, 0, 69, 11, 2, 0, 70, 11, 2, 0,222, 9,164, 1, 71, 11,165, 1, 72, 11,
+166, 1, 73, 11, 4, 0, 74, 11, 4, 0, 75, 11, 9, 0, 76, 11, 12, 0, 51, 11, 12, 0, 18, 8, 12, 0, 77, 11, 12, 0, 78, 11,
+ 12, 0, 79, 11,167, 1, 17, 0,167, 1, 0, 0,167, 1, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0, 2, 0, 81, 11, 2, 0, 15, 0,
+ 2, 0, 13, 0, 2, 0, 82, 11, 2, 0, 83, 11, 2, 0, 84, 11, 2, 0, 85, 11, 2, 0, 86, 11, 2, 0, 17, 0, 2, 0, 87, 11,
+ 2, 0, 29, 0, 2, 0, 35, 0,168, 1, 88, 11,169, 1, 10, 0,169, 1, 0, 0,169, 1, 1, 0, 12, 0, 89, 11, 0, 0, 80, 11,
+ 2, 0, 90, 11, 2, 0, 91, 11, 2, 0, 17, 0, 2, 0, 92, 11, 4, 0, 93, 11, 9, 0, 94, 11,163, 1, 7, 0,163, 1, 0, 0,
+163, 1, 1, 0, 0, 0, 80, 11, 0, 0, 95, 11, 12, 0,178, 7, 4, 0, 96, 11, 4, 0, 17, 0,221, 0, 14, 0,221, 0, 0, 0,
+221, 0, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0,170, 1,248, 7, 9, 0, 97, 11, 9, 0, 98, 11,168, 1, 88, 11,160, 1, 99, 11,
+ 12, 0,100, 11,221, 0,101, 11, 5, 1,117, 6, 2, 0, 17, 0, 2, 0,181, 4,171, 1, 8, 0,171, 1, 0, 0,171, 1, 1, 0,
+ 9, 0, 2, 0, 9, 0,102, 11, 0, 0,244, 3, 2, 0, 15, 0, 2, 0, 17, 0, 7, 0,103, 11,172, 1, 5, 0, 7, 0,104, 11,
+ 4, 0,105, 11, 4, 0,106, 11, 4, 0, 66, 1, 4, 0, 17, 0,173, 1, 6, 0, 7, 0,107, 11, 7, 0,108, 11, 7, 0,109, 11,
+ 7, 0,110, 11, 4, 0, 15, 0, 4, 0, 17, 0,174, 1, 5, 0, 7, 0,229, 8, 7, 0,230, 8, 7, 0,212, 2, 2, 0, 26, 2,
+ 2, 0, 27, 2,175, 1, 5, 0,174, 1, 2, 0, 4, 0, 51, 0, 7, 0,111, 11, 7, 0,229, 8, 7, 0,230, 8,176, 1, 4, 0,
+ 2, 0,112, 11, 2, 0,113, 11, 2, 0,114, 11, 2, 0,115, 11,177, 1, 2, 0, 34, 0,171, 6, 18, 0, 5, 9,178, 1, 3, 0,
+ 16, 0,116, 11, 4, 0, 17, 0, 4, 0, 35, 0,179, 1, 6, 0, 7, 0,104, 0, 7, 0,214, 2, 7, 0,117, 11, 7, 0, 35, 0,
+ 2, 0,240, 0, 2, 0,118, 11,180, 1, 5, 0, 7, 0,119, 11, 7, 0,119, 0, 7, 0, 39, 9, 7, 0, 40, 9, 4, 0, 17, 0,
+181, 1, 6, 0, 19, 0,177, 6, 0, 0,120, 11, 0, 0,121, 11, 2, 0,122, 11, 2, 0, 17, 0, 4, 0,123, 11,182, 1, 7, 0,
+182, 1, 0, 0,182, 1, 1, 0, 0, 0,244, 3,181, 1,124, 11, 2, 0,125, 11, 2, 0, 15, 0, 7, 0, 58, 0,183, 1, 7, 0,
+ 12, 0,126, 11, 0, 0,127, 11, 9, 0,128, 11, 7, 0, 58, 0, 7, 0,103, 11, 4, 0, 15, 0, 4, 0, 17, 0,184, 1, 3, 0,
+ 7, 0,129, 11, 4, 0, 17, 0, 4, 0, 35, 0,185, 1, 15, 0,185, 1, 0, 0,185, 1, 1, 0, 76, 1,107, 9,183, 1, 59, 0,
+ 12, 0,105, 3, 27, 0, 47, 0,184, 1,130, 11, 4, 0, 51, 0, 7, 0, 58, 0, 2, 0, 17, 0, 2, 0, 9, 1, 4, 0,131, 11,
+ 0, 0,120, 11, 4, 0,132, 11, 7, 0,133, 11,186, 1, 2, 0, 0, 0,134, 11, 0, 0,135, 11,187, 1, 4, 0,187, 1, 0, 0,
+187, 1, 1, 0,155, 0, 46, 3, 12, 0,136, 11,188, 1, 24, 0,188, 1, 0, 0,188, 1, 1, 0, 12, 0,137, 11,155, 0,200, 8,
+187, 1,138, 11, 12, 0,139, 11, 12, 0,105, 3, 0, 0,244, 3, 7, 0,103, 11, 7, 0,140, 11, 7, 0, 85, 0, 7, 0, 86, 0,
+ 7, 0,169, 9, 7, 0,170, 9, 7, 0,231, 2, 7, 0,173, 9, 7, 0,202, 8, 7, 0,174, 9, 2, 0,141, 11, 2, 0,142, 11,
+ 2, 0, 87, 0, 2, 0, 15, 0, 4, 0, 17, 0, 4, 0, 67, 0,189, 1, 6, 0,189, 1, 0, 0,189, 1, 1, 0, 12, 0,137, 11,
+ 4, 0, 17, 0, 4, 0,148, 2, 0, 0,244, 3,190, 1, 11, 0,190, 1, 0, 0,190, 1, 1, 0, 19, 0,177, 6, 0, 0,143, 11,
+ 4, 0,123, 11, 2, 0,144, 11, 2, 0, 35, 0, 0, 0,120, 11, 4, 0,131, 11, 2, 0, 17, 0, 2, 0,145, 11,191, 1, 8, 0,
+191, 1, 0, 0,191, 1, 1, 0, 12, 0,146, 11, 0, 0,244, 3, 0, 0,147, 11, 2, 0, 17, 0, 2, 0,145, 11, 4, 0,148, 11,
+192, 1, 5, 0,192, 1, 0, 0,192, 1, 1, 0, 0, 0,120, 11, 4, 0,131, 11, 7, 0,202, 2, 31, 0, 12, 0,155, 0, 97, 3,
+155, 0,149, 11,187, 1,138, 11, 12, 0,150, 11,188, 1,151, 11, 12, 0,152, 11, 12, 0,153, 11, 4, 0, 17, 0, 4, 0,241, 0,
+ 2, 0,154, 11, 2, 0,155, 11, 7, 0,156, 11,193, 1, 2, 0, 19, 0, 29, 0, 31, 0, 72, 0,194, 1, 5, 0,194, 1, 0, 0,
+194, 1, 1, 0, 4, 0, 15, 0, 4, 0, 17, 0, 0, 0, 18, 0,195, 1, 6, 0,194, 1,157, 11, 24, 0, 42, 0, 4, 0,158, 11,
+ 7, 0,159, 11, 4, 0,160, 11, 4, 0, 96, 9,196, 1, 3, 0,194, 1,157, 11, 4, 0,158, 11, 7, 0,161, 11,197, 1, 8, 0,
+194, 1,157, 11, 24, 0, 42, 0, 7, 0, 61, 1, 7, 0,162, 11, 7, 0, 12, 3, 7, 0,255, 8, 4, 0,158, 11, 4, 0,163, 11,
+198, 1, 5, 0,194, 1,157, 11, 7, 0,164, 11, 7, 0, 80, 8, 7, 0,237, 2, 7, 0, 54, 0,199, 1, 3, 0,194, 1,157, 11,
+ 7, 0,255, 8, 7, 0,165, 11,143, 1, 4, 0, 7, 0,166, 11, 7, 0,187, 10, 2, 0,167, 11, 2, 0, 66, 1,200, 1, 14, 0,
+200, 1, 0, 0,200, 1, 1, 0, 12, 0,168, 11, 12, 0,169, 11, 12, 0,170, 11, 0, 0, 18, 0, 4, 0, 29, 0, 4, 0, 17, 0,
+ 4, 0,171, 11, 7, 0,172, 11, 4, 0,160, 11, 4, 0, 96, 9, 7, 0,254, 3, 7, 0,239, 2,151, 1, 23, 0, 4, 0,158, 11,
+ 4, 0,173, 11, 7, 0,174, 11, 7, 0,235, 2, 7, 0,175, 11, 7, 0,216, 8, 7, 0,166, 11, 7, 0,176, 11, 7, 0,214, 2,
+ 7, 0, 62, 10, 7, 0,131, 4, 7, 0,177, 11, 7, 0,178, 11, 7, 0,179, 11, 7, 0,180, 11, 7, 0,181, 11, 7, 0,182, 11,
+ 7, 0,183, 11, 7, 0,184, 11, 7, 0,185, 11, 7, 0,186, 11, 7, 0,187, 11, 12, 0,188, 11,113, 0, 40, 0,112, 0,189, 11,
+201, 1,143, 10, 58, 0,190, 11, 58, 0,221, 10, 58, 0,191, 11,202, 1,192, 11, 40, 0,159, 0, 40, 0,193, 11, 40, 0,194, 11,
+ 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11, 7, 0,198, 11, 7, 0,199, 11, 7, 0,231, 7, 7, 0,200, 11, 7, 0,155, 1,
+ 7, 0,201, 11, 4, 0,202, 11, 4, 0,203, 11, 4, 0,204, 11, 4, 0, 88, 0, 4, 0, 35, 0, 4, 0,205, 11, 2, 0,206, 11,
+ 2, 0,207, 11, 4, 0,208, 11, 7, 0,214, 2, 4, 0,209, 11, 7, 0,210, 11, 4, 0,211, 11, 4, 0,212, 11, 4, 0,213, 11,
+129, 0,214, 11, 12, 0,215, 11,166, 0, 68, 4, 4, 0,216, 11, 7, 0,217, 11, 7, 0,218, 11, 4, 0, 67, 0,114, 0, 12, 0,
+112, 0,189, 11,140, 0, 32, 3, 7, 0,122, 1, 7, 0,231, 7, 7, 0,219, 11, 7, 0,220, 11, 7, 0,221, 11, 2, 0,222, 11,
+ 2, 0,223, 11, 2, 0,224, 11, 2, 0, 15, 0, 4, 0, 88, 0,115, 0, 13, 0,112, 0,189, 11,131, 0, 9, 3,133, 0, 11, 3,
+ 7, 0, 38, 9, 7, 0,225, 11, 7, 0,226, 11, 7, 0, 63, 1, 7, 0,227, 11, 4, 0,129, 9, 4, 0, 7, 3, 2, 0, 15, 0,
+ 2, 0, 35, 0, 4, 0, 67, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0};
-
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index 394418b5688..4269c590a14 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
../../makesdna
@@ -32,4 +31,15 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_gpencil "${SRC}" "${INC}")
+set(SRC
+ drawgpencil.c
+ editaction_gpencil.c
+ gpencil_buttons.c
+ gpencil_edit.c
+ gpencil_ops.c
+ gpencil_paint.c
+
+ gpencil_intern.h
+)
+
+blender_add_lib(bf_editor_gpencil "${SRC}" "${INC}")
diff --git a/source/blender/editors/gpencil/Makefile b/source/blender/editors/gpencil/Makefile
deleted file mode 100644
index f3e781a0369..00000000000
--- a/source/blender/editors/gpencil/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_gpencil
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/gpencil/SConscript b/source/blender/editors/gpencil/SConscript
index baed179cbe9..e75e3f032c1 100644
--- a/source/blender/editors/gpencil/SConscript
+++ b/source/blender/editors/gpencil/SConscript
@@ -5,7 +5,11 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../gpu ../../bmesh'
+=======
+incs += ' ../../gpu ../../blenloader'
+>>>>>>> .merge-right.r35190
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
env.BlenderLib ( 'bf_editors_gpencil', sources, Split(incs), [], libtype=['core'], priority=[45] )
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 4b8c58a5308..7ef17542ea4 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_gpencil_types.h"
#include "DNA_scene_types.h"
@@ -48,7 +49,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -199,7 +200,7 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
}
/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
-static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag, short debug, int winx, int winy)
+static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thickness, short debug)
{
bGPDspoint *pt;
float oldpressure = 0.0f;
@@ -244,9 +245,12 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
/* ----- Fancy 2D-Stroke Drawing ------ */
/* draw a given stroke in 2d */
-static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness, short dflag, short sflag,
+static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
short debug, int offsx, int offsy, int winx, int winy)
{
+ /* otherwise thickness is twice that of the 3D view */
+ float thickness= (float)thickness_s * 0.5f;
+
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, 'smooth' opengl lines look better
* - 'smooth' opengl lines are also required if Image Editor 'image-based' stroke
*/
@@ -498,7 +502,7 @@ static void gp_draw_strokes (bGPDframe *gpf, int offsx, int offsy, int winx, int
if (gps->totpoints == 1)
gp_draw_stroke_point(gps->points, lthick, gps->flag, offsx, offsy, winx, winy);
else if (dflag & GP_DRAWDATA_ONLY3D)
- gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, winx, winy);
+ gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug);
else if (gps->totpoints > 1)
gp_draw_stroke(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, offsx, offsy, winx, winy);
}
@@ -751,7 +755,7 @@ void draw_gpencil_view3d_ext (Scene *scene, View3D *v3d, ARegion *ar, short only
* deal with the camera border, otherwise map the coords to the camera border. */
if(rv3d->persp == RV3D_CAMOB && !(G.f & G_RENDER_OGL)) {
rctf rectf;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &rectf);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &rectf, -1); /* negative shift */
BLI_copy_rcti_rctf(&rect, &rectf);
}
else {
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index d76e5fcf17c..6ea8b77cc71 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,20 +31,23 @@
#include <stddef.h>
#include <math.h>
-#include "BLI_math.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
-#include "gpencil_intern.h"
+#include "DNA_gpencil_types.h"
+#include "DNA_scene_types.h"
-#if 0 // XXX disabled until grease pencil code stabilises again
+#include "BKE_fcurve.h"
+#include "BKE_gpencil.h"
-/* XXX */
-static void actdata_filter() {} // is now ANIM_animdata_filter()
-static void BIF_undo_push() {}
-static void error() {}
-static void *get_action_context() {return NULL;} // is now ANIM_animdata_get_context()
-/* XXX */
+#include "ED_anim_api.h"
+#include "ED_gpencil.h"
+#include "ED_keyframes_edit.h"
+#include "gpencil_intern.h"
/* ***************************************** */
/* NOTE ABOUT THIS FILE:
@@ -126,6 +129,9 @@ short is_gplayer_frame_selected (bGPDlayer *gpl)
/* helper function - select gp-frame based on SELECT_* mode */
static void gpframe_select (bGPDframe *gpf, short select_mode)
{
+ if (gpf == NULL)
+ return;
+
switch (select_mode) {
case SELECT_ADD:
gpf->flag |= GP_FRAME_SELECT;
@@ -160,31 +166,19 @@ void set_gplayer_frame_selection (bGPDlayer *gpl, short mode)
/* error checking */
if (gpl == NULL)
return;
-
- /* convert mode to select_mode */
- switch (mode) {
- case 2:
- mode= SELECT_INVERT;
- break;
- case 1:
- mode= SELECT_ADD;
- break;
- case 0:
- mode= SELECT_SUBTRACT;
- break;
- default:
- return;
- }
/* now call the standard function */
- select_gpencil_frames (gpl, mode);
+ select_gpencil_frames(gpl, mode);
}
/* select the frame in this layer that occurs on this frame (there should only be one at most) */
void select_gpencil_frame (bGPDlayer *gpl, int selx, short select_mode)
{
bGPDframe *gpf;
-
+
+ if (gpl == NULL)
+ return;
+
/* search through frames for a match */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
/* there should only be one frame with this frame-number */
@@ -200,6 +194,9 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
{
bGPDframe *gpf;
+ if (gpl == NULL)
+ return;
+
/* only select those frames which are in bounds */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (IN_RANGE(gpf->framenum, min, max))
@@ -207,6 +204,7 @@ void borderselect_gplayer_frames (bGPDlayer *gpl, float min, float max, short se
}
}
+#if 0 // XXX disabled until grease pencil code stabilises again
/* De-selects or inverts the selection of Layers for a grease-pencil block
* mode: 0 = default behaviour (select all), 1 = test if (de)select all, 2 = invert all
@@ -252,9 +250,12 @@ void deselect_gpencil_layers (void *data, short mode)
BLI_freelistN(&act_data);
}
+#endif // XXX disabled until Grease Pencil code stabilises again...
+
/* ***************************************** */
/* Frame Editing Tools */
+#if 0 // XXX disabled until grease pencil code stabilises again
/* Delete selected grease-pencil layers */
void delete_gpencil_layers (void)
{
@@ -291,6 +292,7 @@ void delete_gpencil_layers (void)
BIF_undo_push("Delete GPencil Layers");
}
+#endif // XXX disabled until Grease Pencil code stabilises again...
/* Delete selected frames */
void delete_gplayer_frames (bGPDlayer *gpl)
@@ -336,6 +338,7 @@ void duplicate_gplayer_frames (bGPDlayer *gpl)
}
}
+#if 0 // XXX disabled until grease pencil code stabilises again
/* -------------------------------------- */
/* Copy and Paste Tools */
/* - The copy/paste buffer currently stores a set of GP_Layers, with temporary
@@ -668,15 +671,10 @@ static short mirror_gpf_marker (bGPDframe *gpf, Scene *scene)
}
else {
/* try to find a marker */
- for (marker= scene->markers.first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- initialised = 1;
- break;
- }
+ marker= ED_markers_get_first_selected(&scene->markers);
+ if(marker) {
+ initialised= 1;
}
-
- if (initialised == 0)
- marker = NULL;
}
}
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
index 87a9c3cd52f..e6d22e3049f 100644
--- a/source/blender/editors/gpencil/gpencil_buttons.c
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -66,7 +66,7 @@
/* These are just 'dummy wrappers' around gpencil api calls */
/* make layer active one after being clicked on */
-void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
+static void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
{
gpencil_layer_setactive(gpd, gpl);
@@ -74,7 +74,7 @@ void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
}
/* delete 'active' layer */
-void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl)
+static void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl)
{
/* make sure the layer we want to remove is the active one */
gpencil_layer_setactive(gpd, gpl);
@@ -138,10 +138,10 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
sprintf(name, "%s (Hidden)", gpl->info);
else
sprintf(name, "%s (Locked)", gpl->info);
- uiItemL(subrow, name, 0);
+ uiItemL(subrow, name, ICON_NULL);
/* delete button (only if hidden but not locked!) */
- if ((gpl->flag & GP_LAYER_HIDE) & !(gpl->flag & GP_LAYER_LOCKED)) {
+ if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED)) {
/* right-align ............................... */
subrow= uiLayoutRow(row, 1);
uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_RIGHT);
@@ -165,7 +165,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
uiBlockSetEmboss(block, UI_EMBOSS);
/* name */
- uiItemR(subrow, &ptr, "info", 0, "", 0);
+ uiItemR(subrow, &ptr, "info", 0, "", ICON_NULL);
/* delete 'button' */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -189,17 +189,17 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* color */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "color", 0, "", 0);
- uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "color", 0, "", ICON_NULL);
+ uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
/* stroke thickness */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
/* debugging options */
if (G.f & G_DEBUG) {
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "show_points", 0, NULL, 0);
+ uiItemR(subcol, &ptr, "show_points", 0, NULL, ICON_NULL);
}
/* right column ................... */
@@ -207,13 +207,9 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* onion-skinning */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", 0);
- uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", 0); // XXX shorter name here? i.e. GStep
+ uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", ICON_NULL);
+ uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", ICON_NULL); // XXX shorter name here? i.e. GStep
- /* additional options... */
- subcol= uiLayoutColumn(col, 1);
- uiItemO(subcol, "Delete Frame", 0, "GPENCIL_OT_active_frame_delete");
- uiItemO(subcol, "Convert...", 0, "GPENCIL_OT_convert");
}
}
@@ -242,8 +238,11 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink");
/* add new layer button - can be used even when no data, since it can add a new block too */
- uiItemO(col, NULL, 0, "GPENCIL_OT_layer_add");
-
+ uiItemO(col, "New Layer", ICON_NULL, "GPENCIL_OT_layer_add");
+ row= uiLayoutRow(col, 1);
+ uiItemO(row, "Delete Frame", ICON_NULL, "GPENCIL_OT_active_frame_delete");
+ uiItemO(row, "Convert", ICON_NULL, "GPENCIL_OT_convert");
+
/* sanity checks... */
if (gpd == NULL)
return;
@@ -257,7 +256,7 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* draw gpd drawing settings first ------------------------------------- */
col= uiLayoutColumn(layout, 1);
/* label */
- uiItemL(col, "Drawing Settings:", 0);
+ uiItemL(col, "Drawing Settings:", ICON_NULL);
/* check whether advanced 3D-View drawing space options can be used */
if (CTX_wm_view3d(C)) {
@@ -269,16 +268,16 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* drawing space options */
row= uiLayoutRow(col, 1);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, 0);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, 0);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, ICON_NULL);
row= uiLayoutRow(col, 1);
uiLayoutSetActive(row, v3d_stroke_opts);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, 0);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, 0);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
uiLayoutSetActive(row, v3d_stroke_opts==STROKE_OPTS_V3D_ON);
- uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, 0);
+ uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NULL);
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index e0d257ca3bf..b699d27dd89 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,6 +37,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
@@ -63,6 +64,7 @@
#include "UI_view2d.h"
+#include "ED_gpencil.h"
#include "ED_view3d.h"
#include "gpencil_intern.h"
@@ -542,9 +544,9 @@ static int gp_convert_poll (bContext *C)
{
bGPdata *gpd= gpencil_data_get_active(C);
ScrArea *sa= CTX_wm_area(C);
-
+
/* only if there's valid data, and the current view is 3D View */
- return ((sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
+ return ((sa && sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
}
static int gp_convert_layer_exec (bContext *C, wmOperator *op)
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 1bfe65eb36c..7ae68d194b3 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index b6b2675e6c8..55b2d2aa73d 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,8 @@
#include "RNA_access.h"
+#include "ED_gpencil.h"
+
#include "gpencil_intern.h"
/* ****************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index f218ccd89f1..06e67128496 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_gpencil.h"
#include "BKE_context.h"
@@ -44,6 +45,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_gpencil_types.h"
+#include "DNA_windowmanager_types.h"
#include "UI_view2d.h"
@@ -65,6 +67,8 @@
/* Temporary 'Stroke' Operation data */
typedef struct tGPsdata {
Scene *scene; /* current scene from context */
+
+ wmWindow *win; /* window where painting originated */
ScrArea *sa; /* area where painting originated */
ARegion *ar; /* region where painting originated */
View2D *v2d; /* needed for GP_STROKE_2DSPACE */
@@ -141,15 +145,31 @@ static void gp_session_validatebuffer(tGPsdata *p);
/* check if context is suitable for drawing */
static int gpencil_draw_poll (bContext *C)
{
- /* check if current context can support GPencil data */
- return (gpencil_data_get_pointers(C, NULL) != NULL);
+ if (ED_operator_regionactive(C)) {
+ /* check if current context can support GPencil data */
+ if (gpencil_data_get_pointers(C, NULL) != NULL) {
+ /* check if Grease Pencil isn't already running */
+ if ((G.f & G_GREASEPENCIL) == 0)
+ return 1;
+ else
+ CTX_wm_operator_poll_msg_set(C, "Grease Pencil operator is already active");
+ }
+ else {
+ CTX_wm_operator_poll_msg_set(C, "Failed to find Grease Pencil data to draw into");
+ }
+ }
+ else {
+ CTX_wm_operator_poll_msg_set(C, "Active region not set");
+ }
+
+ return 0;
}
/* check if projecting strokes into 3d-geometry in the 3D-View */
static int gpencil_project_check (tGPsdata *p)
{
bGPdata *gpd= p->gpd;
- return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & (GP_DATA_DEPTH_VIEW | GP_DATA_DEPTH_STROKE))) ? 1:0;
+ return ((gpd->sbuffer_sflag & GP_STROKE_3DSPACE) && (p->gpd->flag & (GP_DATA_DEPTH_VIEW | GP_DATA_DEPTH_STROKE)));
}
/* ******************************************* */
@@ -164,7 +184,7 @@ static void gp_get_3d_reference (tGPsdata *p, float *vec)
float *fp= give_cursor(p->scene, v3d);
/* the reference point used depends on the owner... */
-#if 0 // XXX: disabled for now, since we can't draw relative ot the owner yet
+#if 0 // XXX: disabled for now, since we can't draw relative to the owner yet
if (p->ownerPtr.type == &RNA_Object)
{
Object *ob= (Object *)p->ownerPtr.data;
@@ -194,13 +214,17 @@ static short gp_stroke_filtermval (tGPsdata *p, int mval[2], int pmval[2])
if (p->gpd->sbuffer_size == 0)
return 1;
- /* check if mouse moved at least certain distance on both axes (best case) */
+ /* check if mouse moved at least certain distance on both axes (best case)
+ * - aims to eliminate some jitter-noise from input when trying to draw straight lines freehand
+ */
else if ((dx > MIN_MANHATTEN_PX) && (dy > MIN_MANHATTEN_PX))
return 1;
- /* check if the distance since the last point is significant enough */
- // future optimisation: sqrt here may be too slow?
- else if (sqrt(dx*dx + dy*dy) > MIN_EUCLIDEAN_PX)
+ /* check if the distance since the last point is significant enough
+ * - prevents points being added too densely
+ * - distance here doesn't use sqrt to prevent slowness... we should still be safe from overflows though
+ */
+ else if ((dx*dx + dy*dy) > MIN_EUCLIDEAN_PX*MIN_EUCLIDEAN_PX)
return 1;
/* mouse 'didn't move' */
@@ -216,7 +240,7 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], flo
/* in 3d-space - pt->x/y/z are 3 side-by-side floats */
if (gpd->sbuffer_sflag & GP_STROKE_3DSPACE) {
- if(gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, 0, depth))) {
+ if (gpencil_project_check(p) && (view_autodist_simple(p->ar, mval, out, 0, depth))) {
/* projecting onto 3D-Geometry
* - nothing more needs to be done here, since view_autodist_simple() has already done it
*/
@@ -274,14 +298,14 @@ static void gp_stroke_convertcoords (tGPsdata *p, short mval[], float out[], flo
/* 2d - relative to screen (viewport area) */
else {
- if(p->subrect == NULL) { /* normal 3D view */
- out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
- out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
- }
+ if (p->subrect == NULL) { /* normal 3D view */
+ out[0] = (float)(mval[0]) / (float)(p->ar->winx) * 100;
+ out[1] = (float)(mval[1]) / (float)(p->ar->winy) * 100;
+ }
else { /* camera view, use subrect */
out[0]= ((mval[0] - p->subrect->xmin) / ((p->subrect->xmax - p->subrect->xmin))) * 100;
out[1]= ((mval[1] - p->subrect->ymin) / ((p->subrect->ymax - p->subrect->ymin))) * 100;
-}
+ }
}
}
@@ -394,12 +418,12 @@ static void gp_stroke_simplify (tGPsdata *p)
short flag= gpd->sbuffer_sflag;
short i, j;
- /* only simplify if simlification is enabled, and we're not doing a straight line */
+ /* only simplify if simplification is enabled, and we're not doing a straight line */
if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
return;
/* don't simplify if less than 4 points in buffer */
- if ((num_points <= 2) || (old_points == NULL))
+ if ((num_points <= 4) || (old_points == NULL))
return;
/* clear buffer (but don't free mem yet) so that we can write to it
@@ -520,60 +544,69 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
}
else {
float *depth_arr= NULL;
-
+
/* get an array of depths, far depths are blended */
- if(gpencil_project_check(p)) {
- short mval[2];
+ if (gpencil_project_check(p)) {
+ short mval[2], mval_prev[2]= {0};
int interp_depth = 0;
int found_depth = 0;
-
+
depth_arr= MEM_mallocN(sizeof(float) * gpd->sbuffer_size, "depth_points");
for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size; i++, ptc++, pt++) {
mval[0]= ptc->x; mval[1]= ptc->y;
- if(view_autodist_depth(p->ar, mval, depth_margin, depth_arr+i) == 0)
+
+ if ((view_autodist_depth(p->ar, mval, depth_margin, depth_arr+i) == 0) &&
+ (i && (view_autodist_depth_segment(p->ar, mval, mval_prev, depth_margin + 1, depth_arr+i) == 0))
+ ) {
interp_depth= TRUE;
- else
+ }
+ else {
found_depth= TRUE;
- }
+ }
- if(found_depth==FALSE) {
+ VECCOPY2D(mval_prev, mval);
+ }
+
+ if (found_depth == FALSE) {
/* eeh... not much we can do.. :/, ignore depth in this case, use the 3D cursor */
for (i=gpd->sbuffer_size-1; i >= 0; i--)
depth_arr[i] = 0.9999f;
}
else {
- if(p->gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS) {
+ if (p->gpd->flag & GP_DATA_DEPTH_STROKE_ENDPOINTS) {
/* remove all info between the valid endpoints */
int first_valid = 0;
int last_valid = 0;
-
- for (i=0; i < gpd->sbuffer_size; i++)
- if(depth_arr[i] != FLT_MAX)
+
+ for (i=0; i < gpd->sbuffer_size; i++) {
+ if (depth_arr[i] != FLT_MAX)
break;
+ }
first_valid= i;
-
- for (i=gpd->sbuffer_size-1; i >= 0; i--)
- if(depth_arr[i] != FLT_MAX)
+
+ for (i=gpd->sbuffer_size-1; i >= 0; i--) {
+ if (depth_arr[i] != FLT_MAX)
break;
+ }
last_valid= i;
-
+
/* invalidate non-endpoints, so only blend between first and last */
for (i=first_valid+1; i < last_valid; i++)
depth_arr[i]= FLT_MAX;
-
+
interp_depth= TRUE;
}
-
- if(interp_depth) {
+
+ if (interp_depth) {
interp_sparse_array(depth_arr, gpd->sbuffer_size, FLT_MAX);
}
}
}
-
-
+
+
pt= gps->points;
-
+
/* convert all points (normal behaviour) */
for (i=0, ptc=gpd->sbuffer; i < gpd->sbuffer_size && ptc; i++, ptc++, pt++) {
/* convert screen-coordinates to appropriate coordinates (and store them) */
@@ -582,8 +615,8 @@ static void gp_stroke_newfrombuffer (tGPsdata *p)
/* copy pressure */
pt->pressure= ptc->pressure;
}
-
- if(depth_arr)
+
+ if (depth_arr)
MEM_freeN(depth_arr);
}
@@ -662,7 +695,7 @@ static short gp_stroke_eraser_splitdel (bGPDframe *gpf, bGPDstroke *gps, int i)
}
/* eraser tool - check if part of stroke occurs within last segment drawn by eraser */
-static short gp_stroke_eraser_strokeinside (int mval[], int mvalo[], short rad, short x0, short y0, short x1, short y1)
+static short gp_stroke_eraser_strokeinside (int mval[], int UNUSED(mvalo[]), short rad, short x0, short y0, short x1, short y1)
{
/* simple within-radius check for now */
if (edge_inside_circle(mval[0], mval[1], rad, x0, y0, x1, y1))
@@ -713,10 +746,10 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], sho
}
#endif
else {
- if(p->subrect == NULL) { /* normal 3D view */
- x0= (int)(gps->points->x / 100 * p->ar->winx);
- y0= (int)(gps->points->y / 100 * p->ar->winy);
- }
+ if (p->subrect == NULL) { /* normal 3D view */
+ x0= (int)(gps->points->x / 100 * p->ar->winx);
+ y0= (int)(gps->points->y / 100 * p->ar->winy);
+ }
else { /* camera view, use subrect */
x0= (int)((gps->points->x / 100) * (p->subrect->xmax - p->subrect->xmin)) + p->subrect->xmin;
y0= (int)((gps->points->y / 100) * (p->subrect->ymax - p->subrect->ymin)) + p->subrect->ymin;
@@ -777,11 +810,11 @@ static void gp_stroke_eraser_dostroke (tGPsdata *p, int mval[], int mvalo[], sho
#endif
else {
if(p->subrect == NULL) { /* normal 3D view */
- x0= (int)(pt1->x / 100 * p->ar->winx);
- y0= (int)(pt1->y / 100 * p->ar->winy);
- x1= (int)(pt2->x / 100 * p->ar->winx);
- y1= (int)(pt2->y / 100 * p->ar->winy);
- }
+ x0= (int)(pt1->x / 100 * p->ar->winx);
+ y0= (int)(pt1->y / 100 * p->ar->winy);
+ x1= (int)(pt2->x / 100 * p->ar->winx);
+ y1= (int)(pt2->y / 100 * p->ar->winy);
+ }
else { /* camera view, use subrect */
x0= (int)((pt1->x / 100) * (p->subrect->xmax - p->subrect->xmin)) + p->subrect->xmin;
y0= (int)((pt1->y / 100) * (p->subrect->ymax - p->subrect->ymin)) + p->subrect->ymin;
@@ -865,8 +898,9 @@ static tGPsdata *gp_session_initpaint (bContext *C)
/* create new context data */
p= MEM_callocN(sizeof(tGPsdata), "GPencil Drawing Data");
- /* pass on current scene */
+ /* pass on current scene and window */
p->scene= CTX_data_scene(C);
+ p->win= CTX_wm_window(C);
switch (curarea->spacetype) {
/* supported views first */
@@ -887,10 +921,10 @@ static tGPsdata *gp_session_initpaint (bContext *C)
printf("Error: 3D-View active region doesn't have any region data, so cannot be drawable \n");
return p;
}
-
+
/* for camera view set the subrect */
if(rv3d->persp == RV3D_CAMOB) {
- view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data);
+ view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data, 1);
p->subrect= &p->subrect_data;
}
@@ -1003,9 +1037,6 @@ static tGPsdata *gp_session_initpaint (bContext *C)
/* set edit flags - so that buffer will get drawn */
G.f |= G_GREASEPENCIL;
- /* set initial run flag */
- p->flags |= GP_PAINTFLAG_FIRSTRUN;
-
/* clear out buffer (stored in gp-data), in case something contaminated it */
gp_session_validatebuffer(p);
@@ -1068,15 +1099,26 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
p->paintmode= paintmode;
if (p->paintmode == GP_PAINTMODE_ERASER)
p->gpd->sbuffer_sflag |= GP_STROKE_ERASER;
+
+ /* set 'initial run' flag, which is only used to denote when a new stroke is starting */
+ p->flags |= GP_PAINTFLAG_FIRSTRUN;
/* check if points will need to be made in view-aligned space */
if (p->gpd->flag & GP_DATA_VIEWALIGN) {
switch (p->sa->spacetype) {
case SPACE_VIEW3D:
{
+ View3D *v3d= p->sa->spacedata.first;
RegionView3D *rv3d= p->ar->regiondata;
float rvec[3];
+ /* for camera view set the subrect */
+ if (rv3d->persp == RV3D_CAMOB) {
+ view3d_calc_camera_border(p->scene, p->ar, NULL, v3d, &p->subrect_data, -1); /* negative shift */
+ p->subrect= &p->subrect_data;
+ }
+
+ /* get reference point for 3d space placement */
gp_get_3d_reference(p, rvec);
initgrabz(rv3d, rvec[0], rvec[1], rvec[2]);
@@ -1149,6 +1191,17 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode)
/* finish off a stroke (clears buffer, but doesn't finish the paint operation) */
static void gp_paint_strokeend (tGPsdata *p)
{
+ /* for surface sketching, need to set the right OpenGL context stuff so that
+ * the conversions will project the values correctly...
+ */
+ if (gpencil_project_check(p)) {
+ View3D *v3d= p->sa->spacedata.first;
+
+ /* need to restore the original projection settings before packing up */
+ view3d_region_operator_needs_opengl(p->win, p->ar);
+ view_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
+ }
+
/* check if doing eraser or not */
if ((p->gpd->sbuffer_sflag & GP_STROKE_ERASER) == 0) {
/* smooth stroke before transferring? */
@@ -1224,14 +1277,6 @@ static void gpencil_draw_exit (bContext *C, wmOperator *op)
}
/* cleanup */
- if(gpencil_project_check(p)) {
- View3D *v3d= p->sa->spacedata.first;
-
- /* need to restore the original projection settings before packing up */
- view3d_operator_needs_opengl(C);
- view_autodist_init(p->scene, p->ar, v3d, (p->gpd->flag & GP_DATA_DEPTH_STROKE) ? 1:0);
- }
-
gp_paint_cleanup(p);
gp_session_cleanup(p);
@@ -1249,8 +1294,48 @@ static int gpencil_draw_cancel (bContext *C, wmOperator *op)
/* ------------------------------- */
+/* update UI indicators of status, including cursor and header prints */
+static void gpencil_draw_status_indicators (tGPsdata *p)
+{
+ /* header prints */
+ switch (p->status) {
+ case GP_STATUS_PAINTING:
+ /* only print this for paint-sessions, otherwise it gets annoying */
+ if (GPENCIL_SKETCH_SESSIONS_ON(p->scene))
+ ED_area_headerprint(p->sa, "Grease Pencil: Drawing/erasing stroke... Release to end stroke");
+ break;
+
+ case GP_STATUS_IDLING:
+ /* print status info */
+ switch (p->paintmode) {
+ case GP_PAINTMODE_ERASER:
+ ED_area_headerprint(p->sa, "Grease Pencil Erase Session: Hold and drag LMB or RMB to erase | ESC/Enter to end");
+ break;
+ case GP_PAINTMODE_DRAW_STRAIGHT:
+ ED_area_headerprint(p->sa, "Grease Pencil Line Session: Hold and drag LMB to draw | ESC/Enter to end");
+ break;
+ case GP_PAINTMODE_DRAW:
+ ED_area_headerprint(p->sa, "Grease Pencil Freehand Session: Hold and drag LMB to draw | ESC/Enter to end");
+ break;
+
+ default: /* unhandled future cases */
+ ED_area_headerprint(p->sa, "Grease Pencil Session: ESC/Enter to end");
+ break;
+ }
+ break;
+
+ case GP_STATUS_ERROR:
+ case GP_STATUS_DONE:
+ /* clear status string */
+ ED_area_headerprint(p->sa, NULL);
+ break;
+ }
+}
+
+/* ------------------------------- */
+
/* create a new stroke point at the point indicated by the painting context */
-static void gpencil_draw_apply (bContext *C, wmOperator *op, tGPsdata *p)
+static void gpencil_draw_apply (wmOperator *op, tGPsdata *p)
{
/* handle drawing/erasing -> test for erasing first */
if (p->paintmode == GP_PAINTMODE_ERASER) {
@@ -1294,7 +1379,7 @@ static void gpencil_draw_apply (bContext *C, wmOperator *op, tGPsdata *p)
}
/* handle draw event */
-static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *event)
+static void gpencil_draw_apply_event (wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
ARegion *ar= p->ar;
@@ -1313,12 +1398,22 @@ static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *even
tablet= (wmtab->Active != EVT_TABLET_NONE);
p->pressure= wmtab->Pressure;
+
//if (wmtab->Active == EVT_TABLET_ERASER)
// TODO... this should get caught by the keymaps which call drawing in the first place
}
else
p->pressure= 1.0f;
+ /* fill in stroke data (not actually used directly by gpencil_draw_apply) */
+ RNA_collection_add(op->ptr, "stroke", &itemptr);
+
+ mousef[0]= p->mval[0];
+ mousef[1]= p->mval[1];
+ RNA_float_set_array(&itemptr, "mouse", mousef);
+ RNA_float_set(&itemptr, "pressure", p->pressure);
+ RNA_boolean_set(&itemptr, "is_start", (p->flags & GP_PAINTFLAG_FIRSTRUN));
+
/* special exception for start of strokes (i.e. maybe for just a dot) */
if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
@@ -1334,16 +1429,8 @@ static void gpencil_draw_apply_event (bContext *C, wmOperator *op, wmEvent *even
return;
}
- /* fill in stroke data (not actually used directly by gpencil_draw_apply) */
- RNA_collection_add(op->ptr, "stroke", &itemptr);
-
- mousef[0]= p->mval[0];
- mousef[1]= p->mval[1];
- RNA_float_set_array(&itemptr, "mouse", mousef);
- RNA_float_set(&itemptr, "pressure", p->pressure);
-
/* apply the current latest drawing point */
- gpencil_draw_apply(C, op, p);
+ gpencil_draw_apply(op, p);
/* force refresh */
ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
@@ -1384,6 +1471,17 @@ static int gpencil_draw_exec (bContext *C, wmOperator *op)
p->mval[1] = (short)mousef[1];
p->pressure= RNA_float_get(&itemptr, "pressure");
+ if (RNA_boolean_get(&itemptr, "is_start")) {
+ /* if first-run flag isn't set already (i.e. not true first stroke),
+ * then we must terminate the previous one first before continuing
+ */
+ if ((p->flags & GP_PAINTFLAG_FIRSTRUN) == 0) {
+ // TODO: both of these ops can set error-status, but we probably don't need to worry
+ gp_paint_strokeend(p);
+ gp_paint_initstroke(p, p->paintmode);
+ }
+ }
+
/* if first run, set previous data too */
if (p->flags & GP_PAINTFLAG_FIRSTRUN) {
p->flags &= ~GP_PAINTFLAG_FIRSTRUN;
@@ -1394,7 +1492,7 @@ static int gpencil_draw_exec (bContext *C, wmOperator *op)
}
/* apply this data as necessary now (as per usual) */
- gpencil_draw_apply(C, op, p);
+ gpencil_draw_apply(op, p);
}
RNA_END;
@@ -1435,6 +1533,8 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
// TODO: set any additional settings that we can take from the events?
// TODO? if tablet is erasing, force eraser to be on?
+ // TODO: move cursor setting stuff to stroke-start so that paintmode can be changed midway...
+
/* if eraser is on, draw radial aid */
if (p->paintmode == GP_PAINTMODE_ERASER) {
// TODO: this involves mucking around with radial control, so we leave this for now..
@@ -1456,7 +1556,7 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
p->status= GP_STATUS_PAINTING;
/* handle the initial drawing - i.e. for just doing a simple dot */
- gpencil_draw_apply_event(C, op, event);
+ gpencil_draw_apply_event(op, event);
}
else {
/* toolbar invoked - don't start drawing yet... */
@@ -1472,67 +1572,136 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
{
tGPsdata *p= op->customdata;
+ int estate = OPERATOR_PASS_THROUGH; /* default exit state - not handled, so let others have a share of the pie */
//printf("\tGP - handle modal event...\n");
- switch (event->type) {
- /* end of stroke -> ONLY when a mouse-button release occurs
- * otherwise, carry on to mouse-move...
- */
- case LEFTMOUSE:
- case RIGHTMOUSE:
- /* if painting, end stroke */
- if (p->status == GP_STATUS_PAINTING) {
- /* basically, this should be mouse-button up */
- //printf("\t\tGP - end of stroke \n");
- gpencil_draw_exit(C, op);
-
- /* one last flush before we're done */
- WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
+ /* exit painting mode (and/or end current stroke) */
+ if (ELEM4(event->type, RETKEY, PADENTER, ESCKEY, SPACEKEY)) {
+ /* exit() ends the current stroke before cleaning up */
+ //printf("\t\tGP - end of paint op + end of stroke\n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_DONE;
+ estate = OPERATOR_FINISHED;
+ }
+
+ /* toggle painting mode upon mouse-button movement */
+ if (ELEM(event->type, LEFTMOUSE, RIGHTMOUSE)) {
+ /* if painting, end stroke */
+ if (p->status == GP_STATUS_PAINTING) {
+ /* basically, this should be mouse-button up = end stroke
+ * BUT what happens next depends on whether we 'painting sessions' is enabled
+ */
+ if (GPENCIL_SKETCH_SESSIONS_ON(p->scene)) {
+ /* end stroke only, and then wait to resume painting soon */
+ //printf("\t\tGP - end stroke only\n");
+ gp_paint_cleanup(p);
+ p->status= GP_STATUS_IDLING;
- return OPERATOR_FINISHED;
+ /* we've just entered idling state, so this event was processed (but no others yet) */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ else {
+ //printf("\t\tGP - end of stroke + op\n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_DONE;
+ estate = OPERATOR_FINISHED;
+ }
+ }
+ else {
+ /* not painting, so start stroke (this should be mouse-button down) */
+
+ /* we must check that we're still within the area that we're set up to work from
+ * otherwise we could crash (see bug #20586)
+ */
+ if (CTX_wm_area(C) != p->sa) {
+ //printf("\t\t\tGP - wrong area execution abort! \n");
+ gpencil_draw_exit(C, op);
+ p->status= GP_STATUS_ERROR;
+ estate = OPERATOR_CANCELLED;
}
else {
- /* not painting, so start stroke (this should be mouse-button down) */
-
- /* we must check that we're still within the area that we're set up to work from
- * otherwise we could crash (see bug #20586)
- */
- if (CTX_wm_area(C) != p->sa) {
- //printf("\t\t\tGP - wrong area execution abort! \n");
- gpencil_draw_exit(C, op);
- return OPERATOR_CANCELLED;
- }
-
//printf("\t\tGP - start stroke \n");
p->status= GP_STATUS_PAINTING;
- /* no break now, since we should immediately start painting */
- }
-
- /* moving mouse - assumed that mouse button is down if in painting status */
- case MOUSEMOVE:
- case INBETWEEN_MOUSEMOVE:
- /* check if we're currently painting */
- if (p->status == GP_STATUS_PAINTING) {
- /* handle drawing event */
- //printf("\t\tGP - add point\n");
- gpencil_draw_apply_event(C, op, event);
- /* finish painting operation if anything went wrong just now */
+ /* we may need to set up paint env again if we're resuming */
+ // XXX: watch it with the paintmode! in future, it'd be nice to allow changing paint-mode when in sketching-sessions
+ // XXX: with tablet events, we may event want to check for eraser here, for nicer tablet support
+ gp_paint_initstroke(p, p->paintmode);
+
if (p->status == GP_STATUS_ERROR) {
- //printf("\t\t\tGP - error done! \n");
gpencil_draw_exit(C, op);
- return OPERATOR_CANCELLED;
+ estate = OPERATOR_CANCELLED;
}
}
+ }
+ }
+
+ /* handle mode-specific events */
+ if (p->status == GP_STATUS_PAINTING) {
+ /* handle painting mouse-movements? */
+ if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE) || (p->flags & GP_PAINTFLAG_FIRSTRUN))
+ {
+ /* handle drawing event */
+ //printf("\t\tGP - add point\n");
+ gpencil_draw_apply_event(op, event);
+
+ /* finish painting operation if anything went wrong just now */
+ if (p->status == GP_STATUS_ERROR) {
+ //printf("\t\t\t\tGP - add error done! \n");
+ gpencil_draw_exit(C, op);
+ estate = OPERATOR_CANCELLED;
+ }
+ else {
+ /* event handled, so just tag as running modal */
+ //printf("\t\t\t\tGP - add point handled!\n");
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ /* there shouldn't be any other events, but just in case there are, let's swallow them
+ * (i.e. to prevent problems with with undo)
+ */
+ else {
+ /* swallow event to save ourselves trouble */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ else if (p->status == GP_STATUS_IDLING) {
+ /* standard undo/redo shouldn't be allowed to execute or else it causes crashes, so catch it here */
+ // FIXME: this is a hardcoded hotkey that can't be changed
+ // TODO: catch redo as well, but how?
+ if (event->type == ZKEY) {
+ /* oskey = cmd key on macs as they seem to use cmd-z for undo as well? */
+ if ((event->ctrl) || (event->oskey)) {
+ /* just delete last stroke, which will look like undo to the end user */
+ //printf("caught attempted undo event... deleting last stroke \n");
+ gpencil_frame_delete_laststroke(p->gpl, p->gpf);
+
+ /* event handled, so force refresh */
+ ED_region_tag_redraw(p->ar); /* just active area for now, since doing whole screen is too slow */
+ estate = OPERATOR_RUNNING_MODAL;
+ }
+ }
+ }
+
+ /* update status indicators - cursor, header, etc. */
+ gpencil_draw_status_indicators(p);
+
+ /* process last operations before exiting */
+ switch (estate) {
+ case OPERATOR_FINISHED:
+ /* one last flush before we're done */
+ WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
break;
-
- default:
- //printf("\t\tGP unknown event - %d \n", event->type);
+
+ case OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH:
+ /* event doesn't need to be handled */
+ //printf("unhandled event -> %d (mmb? = %d | mmv? = %d)\n", event->type, event->type == MIDDLEMOUSE, event->type==MOUSEMOVE);
break;
}
- return OPERATOR_RUNNING_MODAL;
+ /* return status code */
+ return estate;
}
/* ------------------------------- */
@@ -1546,8 +1715,6 @@ static EnumPropertyItem prop_gpencil_drawmodes[] = {
void GPENCIL_OT_draw (wmOperatorType *ot)
{
- PropertyRNA *prop;
-
/* identifiers */
ot->name= "Grease Pencil Draw";
ot->idname= "GPENCIL_OT_draw";
@@ -1564,8 +1731,7 @@ void GPENCIL_OT_draw (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
/* settings for drawing */
- prop= RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements.");
- RNA_def_property_flag(prop, PROP_HIDDEN);
+ RNA_def_enum(ot->srna, "mode", prop_gpencil_drawmodes, 0, "Mode", "Way to intepret mouse movements.");
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
diff --git a/source/blender/editors/include/BIF_gl.h b/source/blender/editors/include/BIF_gl.h
index aca0e671067..85244a85613 100644
--- a/source/blender/editors/include/BIF_gl.h
+++ b/source/blender/editors/include/BIF_gl.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,10 @@
* os dependent include locations of gl.h
*/
+/** \file BIF_gl.h
+ * \ingroup editorui
+ */
+
#ifndef BIF_GL_H
#define BIF_GL_H
diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h
index 8f37baf9af1..c9615204607 100644
--- a/source/blender/editors/include/BIF_glutil.h
+++ b/source/blender/editors/include/BIF_glutil.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BIF_glutil.h
+ * \ingroup editorui
+ */
+
#ifndef BIF_GLUTIL_H
#define BIF_GLUTIL_H
@@ -197,7 +201,7 @@ void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect);
/* use this for platform hacks. glPointSize is solved here */
void bglBegin(int mode);
void bglEnd(void);
-int bglPointHack();
+int bglPointHack(void);
void bglVertex3fv(float *vec);
void bglVertex3f(float x, float y, float z);
void bglVertex2fv(float *vec);
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 5fb7fa41752..d19d3549fad 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_anim_api.h
+ * \ingroup editors
+ */
+
#ifndef ED_ANIM_API_H
#define ED_ANIM_API_H
@@ -35,6 +39,7 @@ struct AnimData;
struct bContext;
struct wmKeyConfig;
+struct ReportList;
struct ScrArea;
struct ARegion;
struct View2D;
@@ -73,7 +78,8 @@ typedef struct bAnimContext {
struct Scene *scene; /* active scene */
struct Object *obact; /* active object */
ListBase *markers; /* active set of markers */
- ListBase *reports; /* pointer to current reports list */ // XXX not yet used
+
+ struct ReportList *reports; /* pointer to current reports list */
} bAnimContext;
/* Main Data container types */
@@ -86,7 +92,7 @@ typedef enum eAnimCont_Types {
ANIMCONT_DOPESHEET, /* dopesheet (bDopesheet) */
ANIMCONT_FCURVES, /* animation F-Curves (bDopesheet) */
ANIMCONT_DRIVERS, /* drivers (bDopesheet) */
- ANIMCONT_NLA, /* nla (bDopesheet) */
+ ANIMCONT_NLA /* nla (bDopesheet) */
} eAnimCont_Types;
/* --------------- Channels -------------------- */
@@ -151,6 +157,7 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_DSARM,
ANIMTYPE_DSMESH,
ANIMTYPE_DSTEX,
+ ANIMTYPE_DSLAT,
ANIMTYPE_SHAPEKEY,
@@ -161,7 +168,7 @@ typedef enum eAnim_ChannelType {
ANIMTYPE_NLAACTION,
/* always as last item, the total number of channel types... */
- ANIMTYPE_NUM_TYPES,
+ ANIMTYPE_NUM_TYPES
} eAnim_ChannelType;
/* types of keyframe data in bAnimListElem */
@@ -175,7 +182,7 @@ typedef enum eAnim_KeyType {
ALE_SCE, /* Scene summary */
ALE_OB, /* Object summary */
ALE_ACT, /* Action summary */
- ALE_GROUP, /* Action Group summary */
+ ALE_GROUP /* Action Group summary */
} eAnim_KeyType;
/* ----------------- Filtering -------------------- */
@@ -228,6 +235,8 @@ typedef enum eAnimFilter_Flags {
#define FILTER_MBALL_OBJD(mb) ((mb->flag2 & MB_DS_EXPAND))
#define FILTER_ARM_OBJD(arm) ((arm->flag & ARM_DS_EXPAND))
#define FILTER_MESH_OBJD(me) ((me->flag & ME_DS_EXPAND))
+#define FILTER_LATTICE_OBJD(lt) ((lt->flag & LT_DS_EXPAND))
+
/* 'Sub-object/Action' channels (flags stored in Action) */
#define SEL_ACTC(actc) ((actc->flag & ACT_SELECTED))
#define EXPANDED_ACTC(actc) ((actc->flag & ACT_COLLAPSED)==0)
@@ -325,17 +334,17 @@ typedef enum eAnimChannels_SetFlag {
ACHANNEL_SETFLAG_CLEAR = 0, /* turn off */
ACHANNEL_SETFLAG_ADD, /* turn on */
ACHANNEL_SETFLAG_INVERT, /* on->off, off->on */
- ACHANNEL_SETFLAG_TOGGLE, /* some on -> all off // all on */
+ ACHANNEL_SETFLAG_TOGGLE /* some on -> all off // all on */
} eAnimChannels_SetFlag;
/* types of settings for AnimChannels */
typedef enum eAnimChannel_Settings {
- ACHANNEL_SETTING_SELECT = 0,
+ ACHANNEL_SETTING_SELECT = 0,
ACHANNEL_SETTING_PROTECT, // warning: for drawing UI's, need to check if this is off (maybe inverse this later)
ACHANNEL_SETTING_MUTE,
ACHANNEL_SETTING_EXPAND,
ACHANNEL_SETTING_VISIBLE, /* only for Graph Editor */
- ACHANNEL_SETTING_SOLO, /* only for NLA Tracks */
+ ACHANNEL_SETTING_SOLO /* only for NLA Tracks */
} eAnimChannel_Settings;
@@ -343,7 +352,7 @@ typedef enum eAnimChannel_Settings {
typedef struct bAnimChannelType {
/* type data */
/* name of the channel type, for debugging */
- char *channel_type_name;
+ const char *channel_type_name;
/* drawing */
/* get RGB color that is used to draw the majority of the backdrop */
@@ -442,7 +451,7 @@ enum {
/* time indication in seconds or frames */
DRAWCFRA_UNIT_SECONDS = (1<<1),
/* show time-offset line */
- DRAWCFRA_SHOW_TIMEOFS = (1<<2),
+ DRAWCFRA_SHOW_TIMEOFS = (1<<2)
} eAnimEditDraw_CurrentFrame;
/* main call to draw current-frame indicator in an Animation Editor */
@@ -517,7 +526,7 @@ typedef enum eAnimUnitConv_Flags {
/* only touch selected BezTriples */
ANIM_UNITCONV_ONLYSEL = (1<<2),
/* only touch selected vertices */
- ANIM_UNITCONV_SELVERTS = (1<<3),
+ ANIM_UNITCONV_SELVERTS = (1<<3)
} eAnimUnitConv_Flags;
/* Get unit conversion factor for given ID + F-Curve */
diff --git a/source/blender/editors/include/ED_armature.h b/source/blender/editors/include/ED_armature.h
index 52db36e188d..fcd56277b87 100644
--- a/source/blender/editors/include/ED_armature.h
+++ b/source/blender/editors/include/ED_armature.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,9 +24,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_armature.h
+ * \ingroup editors
+ */
+
#ifndef ED_ARMATURE_H
#define ED_ARMATURE_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bArmature;
struct Base;
struct bContext;
@@ -38,6 +47,7 @@ struct ListBase;
struct MeshDeformModifierData;
struct Object;
struct RegionView3D;
+struct ReportList;
struct Scene;
struct SK_Sketch;
struct View3D;
@@ -78,16 +88,16 @@ typedef struct EditBone
short segments;
} EditBone;
-#define BONESEL_ROOT 0x10000000
-#define BONESEL_TIP 0x20000000
-#define BONESEL_BONE 0x40000000
+#define BONESEL_ROOT (1<<28)
+#define BONESEL_TIP (1<<29)
+#define BONESEL_BONE (1<<30)
#define BONESEL_ANY (BONESEL_TIP|BONESEL_ROOT|BONESEL_BONE)
-#define BONESEL_NOSEL 0x80000000 /* Indicates a negative number */
+#define BONESEL_NOSEL (1<<31) /* Indicates a negative number */
/* useful macros */
-#define EBONE_VISIBLE(arm, ebone) ((arm->layer & ebone->layer) && !(ebone->flag & BONE_HIDDEN_A))
-#define EBONE_EDITABLE(ebone) ((ebone->flag & BONE_SELECTED) && !(ebone->flag & BONE_EDITMODE_LOCKED))
+#define EBONE_VISIBLE(arm, ebone) (((arm)->layer & (ebone)->layer) && !((ebone)->flag & BONE_HIDDEN_A))
+#define EBONE_EDITABLE(ebone) (((ebone)->flag & BONE_SELECTED) && !((ebone)->flag & BONE_EDITMODE_LOCKED))
/* used in bone_select_hierachy() */
#define BONE_SELECT_PARENT 0
@@ -102,20 +112,21 @@ void ED_keymap_armature(struct wmKeyConfig *keyconf);
void ED_armature_from_edit(struct Object *obedit);
void ED_armature_to_edit(struct Object *ob);
void ED_armature_edit_free(struct Object *ob);
-void ED_armature_deselectall(struct Object *obedit, int toggle, int doundo);
+void ED_armature_deselect_all(struct Object *obedit, int toggle);
+void ED_armature_deselect_all_visible(struct Object *obedit);
int ED_do_pose_selectbuffer(struct Scene *scene, struct Base *base, unsigned int *buffer,
short hits, short extend);
int mouse_armature(struct bContext *C, short mval[2], int extend);
int join_armature_exec(struct bContext *C, struct wmOperator *op);
struct Bone *get_indexed_bone (struct Object *ob, int index);
-float ED_rollBoneToVector(EditBone *bone, float new_up_axis[3]);
+float ED_rollBoneToVector(EditBone *bone, const float new_up_axis[3], const short axis_only);
EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, EditBone *ebo); // XXX this is needed for populating the context iterators
void ED_armature_sync_selection(struct ListBase *edbo);
void ED_armature_validate_active(struct bArmature *arm);
void add_primitive_bone(struct Scene *scene, struct View3D *v3d, struct RegionView3D *rv3d);
-struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, char *name);
+struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, const char *name);
void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone);
void transform_armature_mirror_update(struct Object *obedit);
@@ -128,20 +139,21 @@ void ED_armature_apply_transform(struct Object *ob, float mat[4][4]);
#define ARM_GROUPS_ENVELOPE 2
#define ARM_GROUPS_AUTO 3
-void create_vgroups_from_armature(struct Scene *scene, struct Object *ob, struct Object *par, int mode, int mirror);
+void create_vgroups_from_armature(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct Object *par, int mode, int mirror);
void auto_align_armature(struct Scene *scene, struct View3D *v3d, short mode);
void unique_editbone_name(struct ListBase *ebones, char *name, EditBone *bone); /* if bone is already in list, pass it as param to ignore it */
void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep);
-void undo_push_armature(struct bContext *C, char *name);
+void undo_push_armature(struct bContext *C, const char *name);
/* poseobject.c */
+struct Object *ED_object_pose_armature(struct Object *ob);
void ED_armature_exit_posemode(struct bContext *C, struct Base *base);
void ED_armature_enter_posemode(struct bContext *C, struct Base *base);
int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan);
-void ED_pose_deselectall(struct Object *ob, int test, int doundo);
-void ED_pose_recalculate_paths(struct bContext *C, struct Scene *scene, struct Object *ob);
+void ED_pose_deselectall(struct Object *ob, int test);
+void ED_pose_recalculate_paths(struct Scene *scene, struct Object *ob);
/* sketch */
@@ -159,7 +171,7 @@ int BIF_currentTemplate(const struct bContext *C);
void BIF_freeTemplates(struct bContext *C);
void BIF_setTemplate(struct bContext *C, int index);
int BIF_nbJointsTemplate(const struct bContext *C);
-char * BIF_nameBoneTemplate(const struct bContext *C);
+const char * BIF_nameBoneTemplate(const struct bContext *C);
void BDR_drawSketch(const struct bContext *vc);
int BDR_drawSketchNames(struct ViewContext *vc);
@@ -168,6 +180,10 @@ int BDR_drawSketchNames(struct ViewContext *vc);
void mesh_deform_bind(struct Scene *scene,
struct MeshDeformModifierData *mmd,
float *vertexcos, int totvert, float cagemat[][4]);
+
+#ifdef __cplusplus
+}
+#endif
#endif /* ED_ARMATURE_H */
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 0ff98b504d0..08a63a470c1 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_curve.h
+ * \ingroup editors
+ */
+
#ifndef ED_CURVE_H
#define ED_CURVE_H
@@ -52,7 +57,7 @@ void CU_select_all(struct Object *obedit);
void CU_select_swap(struct Object *obedit);
-void undo_push_curve (struct bContext *C, char *name);
+void undo_push_curve (struct bContext *C, const char *name);
ListBase *curve_get_editcurve(struct Object *ob);
void load_editNurb (struct Object *obedit);
@@ -63,14 +68,14 @@ void free_curve_editNurb (struct Curve *cu);
int mouse_nurb (struct bContext *C, short mval[2], int extend);
-struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newname);
+struct Nurb *add_nurbs_primitive(struct bContext *C, float mat[4][4], int type, int newob);
-int isNurbsel (struct Nurb *nu);;
+int isNurbsel (struct Nurb *nu);
int join_curve_exec (struct bContext *C, struct wmOperator *op);
/* editfont.h */
-void undo_push_font (struct bContext *C, char *name);
+void undo_push_font (struct bContext *C, const char *name);
void make_editText (struct Object *obedit);
void load_editText (struct Object *obedit);
void free_editText (struct Object *obedit);
@@ -83,5 +88,10 @@ ListBase *ED_curve_editnurbs(struct Curve *cu);
void ED_curve_beztcpy(struct EditNurb *editnurb, struct BezTriple *dst, struct BezTriple *src, int count);
void ED_curve_bpcpy(struct EditNurb *editnurb, struct BPoint *dst, struct BPoint *src, int count);
+int ED_curve_updateAnimPaths(struct Object *obedit);
+
+/* debug only */
+void printknots(struct Object *obedit);
+
#endif /* ED_CURVE_H */
diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h
index 2c352abcd00..ee29df3fffb 100644
--- a/source/blender/editors/include/ED_datafiles.h
+++ b/source/blender/editors/include/ED_datafiles.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_datafiles.h
+ * \ingroup editors
+ */
+
#ifndef ED_DATAFILES_H
#define ED_DATAFILES_H
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index 5001323cb61..6b91779b832 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_fileselect.h
+ * \ingroup editors
+ */
+
#ifndef ED_FILES_H
#define ED_FILES_H
@@ -93,5 +98,7 @@ void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile);
void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile);
+int ED_file_extension_icon(char *relname);
+
#endif /* ED_FILES_H */
diff --git a/source/blender/editors/include/ED_fluidsim.h b/source/blender/editors/include/ED_fluidsim.h
index a1ab3ba2fcc..3388280e5fa 100644
--- a/source/blender/editors/include/ED_fluidsim.h
+++ b/source/blender/editors/include/ED_fluidsim.h
@@ -1,4 +1,4 @@
-/**
+/*
* BKE_fluidsim.h
*
* $Id$
@@ -28,6 +28,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_fluidsim.h
+ * \ingroup editors
+ */
+
#ifndef ED_FLUIDSIM_H
#define ED_FLUIDSIM_H
diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h
index 6c5a0cc3bf3..d06b0d6c4ee 100644
--- a/source/blender/editors/include/ED_gpencil.h
+++ b/source/blender/editors/include/ED_gpencil.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,10 +25,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_gpencil.h
+ * \ingroup editors
+ */
+
#ifndef ED_GPENCIL_H
#define ED_GPENCIL_H
struct ListBase;
+struct bContext;
struct bScreen;
struct ScrArea;
struct ARegion;
@@ -55,6 +60,10 @@ typedef struct tGPspoint {
float pressure; /* pressure of tablet at this point */
} tGPspoint;
+
+/* Check if 'sketching sessions' are enabled */
+#define GPENCIL_SKETCH_SESSIONS_ON(scene) ((scene)->toolsettings->gpencil_flags & GP_TOOL_FLAG_PAINTSESSIONS_ON)
+
/* ----------- Grease Pencil Tools/Context ------------- */
struct bGPdata **gpencil_data_get_pointers(struct bContext *C, struct PointerRNA *ptr);
@@ -76,5 +85,27 @@ void draw_gpencil_view3d_ext(struct Scene *scene, struct View3D *v3d, struct ARe
void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
+/* ----------- Grease-Pencil AnimEdit API ------------------ */
+short gplayer_frames_looper(struct bGPDlayer *gpl, struct Scene *scene, short (*gpf_cb)(struct bGPDframe *, struct Scene *));
+void gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, short onlysel);
+
+void deselect_gpencil_layers(void *data, short select_mode);
+
+short is_gplayer_frame_selected(struct bGPDlayer *gpl);
+void set_gplayer_frame_selection(struct bGPDlayer *gpl, short mode);
+void select_gpencil_frames(struct bGPDlayer *gpl, short select_mode);
+void select_gpencil_frame(struct bGPDlayer *gpl, int selx, short select_mode);
+void borderselect_gplayer_frames(struct bGPDlayer *gpl, float min, float max, short select_mode);
+
+void delete_gpencil_layers(void);
+void delete_gplayer_frames(struct bGPDlayer *gpl);
+void duplicate_gplayer_frames(struct bGPDlayer *gpd);
+
+void free_gpcopybuf(void);
+void copy_gpdata(void);
+void paste_gpdata(void);
+
+void snap_gplayer_frames(struct bGPDlayer *gpl, short mode);
+void mirror_gplayer_frames(struct bGPDlayer *gpl, short mode);
#endif /* ED_GPENCIL_H */
diff --git a/source/blender/editors/include/ED_image.h b/source/blender/editors/include/ED_image.h
index 1d674112b8d..2c866495503 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,14 +25,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_image.h
+ * \ingroup editors
+ */
+
#ifndef ED_IMAGE_H
#define ED_IMAGE_H
struct SpaceImage;
+struct Main;
struct bContext;
struct Image;
struct ImageUser;
+struct ToolSettings;
struct uiBlock;
+struct wmWindowManager;
/* space_image.c, exported for transform */
struct Image *ED_space_image(struct SpaceImage *sima);
@@ -47,6 +54,8 @@ void ED_space_image_aspect(struct SpaceImage *sima, float *aspx, float *aspy);
void ED_space_image_zoom(struct SpaceImage *sima, struct ARegion *ar, float *zoomx, float *zoomy);
void ED_space_image_uv_aspect(struct SpaceImage *sima, float *aspx, float *aspy);
+void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings);
+
void ED_image_size(struct Image *ima, int *width, int *height);
void ED_image_aspect(struct Image *ima, float *aspx, float *aspy);
void ED_image_uv_aspect(struct Image *ima, float *aspx, float *aspy);
@@ -57,7 +66,7 @@ int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit);
int ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object *obedit);
/* UI level image (texture) updating... render calls own stuff (too) */
-void ED_image_update_frame(const struct bContext *C);
+void ED_image_update_frame(const struct Main *mainp, int cfra);
/* image_render.c, export for screen_ops.c, render operator */
void ED_space_image_output(struct bContext *C);
diff --git a/source/blender/editors/include/ED_info.h b/source/blender/editors/include/ED_info.h
index 33b890cea60..c76c478c6d6 100644
--- a/source/blender/editors/include/ED_info.h
+++ b/source/blender/editors/include/ED_info.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,11 +22,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_info.h
+ * \ingroup editors
+ */
+
#ifndef ED_INFO_H
#define ED_INFO_H
/* info_stats.c */
void ED_info_stats_clear(struct Scene *scene);
-char *ED_info_stats_string(struct Scene *scene);
+const char *ED_info_stats_string(struct Scene *scene);
#endif /* ED_INFO_H */
diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h
index 78a645d6b50..c697f8cc435 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_keyframes_draw.h
+ * \ingroup editors
+ */
+
#ifndef ED_KEYFRAMES_DRAW_H
#define ED_KEYFRAMES_DRAW_H
@@ -100,7 +104,7 @@ typedef enum eKeyframeShapeDrawOpts {
} eKeyframeShapeDrawOpts;
/* draw simple diamond-shape keyframe (with OpenGL) */
-void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel, short key_type, short mode);
+void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel, short key_type, short mode, float alpha);
/* ******************************* Methods ****************************** */
@@ -136,7 +140,7 @@ void scene_to_keylist(struct bDopeSheet *ads, struct Scene *sce, struct DLRBT_Tr
void summary_to_keylist(struct bAnimContext *ac, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
/* Grease Pencil Layer */
// XXX not restored
-void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys, struct DLRBT_Tree *blocks);
+void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_Tree *keys);
/* ActKeyColumn API ---------------- */
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
diff --git a/source/blender/editors/include/ED_keyframes_edit.h b/source/blender/editors/include/ED_keyframes_edit.h
index 60f2526191c..e6fe7efbaba 100644
--- a/source/blender/editors/include/ED_keyframes_edit.h
+++ b/source/blender/editors/include/ED_keyframes_edit.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_keyframes_edit.h
+ * \ingroup editors
+ */
+
#ifndef ED_KEYFRAMES_EDIT_H
#define ED_KEYFRAMES_EDIT_H
@@ -53,7 +57,7 @@ typedef enum eEditKeyframes_Validate {
BEZT_OK_SELECTED,
BEZT_OK_VALUE,
BEZT_OK_VALUERANGE,
- BEZT_OK_REGION,
+ BEZT_OK_REGION
} eEditKeyframes_Validate;
/* ------------ */
@@ -67,13 +71,13 @@ typedef enum eEditKeyframes_Select {
/* remove ok keyframes from selection */
SELECT_SUBTRACT = (1<<2),
/* flip ok status of keyframes based on key status */
- SELECT_INVERT = (1<<3),
+ SELECT_INVERT = (1<<3)
} eEditKeyframes_Select;
/* "selection map" building modes */
typedef enum eEditKeyframes_SelMap {
SELMAP_MORE = 0,
- SELMAP_LESS,
+ SELMAP_LESS
} eEditKeyframes_SelMap;
/* snapping tools */
@@ -83,7 +87,7 @@ typedef enum eEditKeyframes_Snap {
SNAP_KEYS_NEARSEC,
SNAP_KEYS_NEARMARKER,
SNAP_KEYS_HORIZONTAL,
- SNAP_KEYS_VALUE,
+ SNAP_KEYS_VALUE
} eEditKeyframes_Snap;
/* mirroring tools */
@@ -92,7 +96,7 @@ typedef enum eEditKeyframes_Mirror {
MIRROR_KEYS_YAXIS,
MIRROR_KEYS_XAXIS,
MIRROR_KEYS_MARKER,
- MIRROR_KEYS_VALUE,
+ MIRROR_KEYS_VALUE
} eEditKeyframes_Mirror;
/* ************************************************ */
@@ -152,6 +156,29 @@ typedef struct KeyframeEditCD_Remap {
float newMin, newMax; /* new range */
} KeyframeEditCD_Remap;
+/* Paste options */
+typedef enum eKeyPasteOffset {
+ /* paste keys starting at current frame */
+ KEYFRAME_PASTE_OFFSET_CFRA_START,
+ /* paste keys ending at current frame */
+ KEYFRAME_PASTE_OFFSET_CFRA_END,
+ /* paste keys relative to the current frame when copying */
+ KEYFRAME_PASTE_OFFSET_CFRA_RELATIVE,
+ /* paste keys from original time */
+ KEYFRAME_PASTE_OFFSET_NONE
+} eKeyPasteOffset;
+
+typedef enum eKeyMergeMode {
+ /* overlay existing with new keys */
+ KEYFRAME_PASTE_MERGE_MIX,
+ /* replace entire fcurve */
+ KEYFRAME_PASTE_MERGE_OVER,
+ /* overwrite keys in pasted range */
+ KEYFRAME_PASTE_MERGE_OVER_RANGE,
+ /* overwrite keys in pasted range (use all keyframe start & end for range) */
+ KEYFRAME_PASTE_MERGE_OVER_RANGE_ALL
+} eKeyMergeMode;
+
/* ---------------- Looping API --------------------- */
/* functions for looping over keyframes */
@@ -212,6 +239,7 @@ void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
void delete_fcurve_key(struct FCurve *fcu, int index, short do_recalc);
void delete_fcurve_keys(struct FCurve *fcu);
+void clear_fcurve_keys(struct FCurve *fcu);
void duplicate_fcurve_keys(struct FCurve *fcu);
void clean_fcurve(struct FCurve *fcu, float thresh);
@@ -222,7 +250,8 @@ void sample_fcurve(struct FCurve *fcu);
void free_anim_copybuf(void);
short copy_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
-short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data);
+short paste_animedit_keys(struct bAnimContext *ac, ListBase *anim_data,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode);
/* ************************************************ */
diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h
index fc5e3a43a62..7bab563641a 100644
--- a/source/blender/editors/include/ED_keyframing.h
+++ b/source/blender/editors/include/ED_keyframing.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_keyframing.h
+ * \ingroup editors
+ */
+
#ifndef ED_KEYFRAMING_H
#define ED_KEYFRAMING_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ListBase;
struct ID;
struct Scene;
@@ -43,9 +51,11 @@ struct bConstraint;
struct bContext;
struct wmOperatorType;
+struct ReportList;
struct PointerRNA;
struct PropertyRNA;
+struct EnumPropertyItem;
#include "RNA_types.h"
@@ -89,7 +99,7 @@ int insert_vert_fcurve(struct FCurve *fcu, float x, float y, short flag);
* Use this to insert a keyframe using the current value being keyframed, in the
* nominated F-Curve (no creation of animation data performed). Returns success.
*/
-short insert_keyframe_direct(struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, short flag);
+short insert_keyframe_direct(struct ReportList *reports, struct PointerRNA ptr, struct PropertyRNA *prop, struct FCurve *fcu, float cfra, short flag);
/* -------- */
@@ -97,12 +107,12 @@ short insert_keyframe_direct(struct PointerRNA ptr, struct PropertyRNA *prop, st
* Use this to create any necessary animation data, and then insert a keyframe
* using the current value being keyframed, in the relevant place. Returns success.
*/
-short insert_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
+short insert_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
/* Main Keyframing API call:
* Use this to delete keyframe on current frame for relevant channel. Will perform checks just in case.
*/
-short delete_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
+short delete_keyframe(struct ReportList *reports, struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag);
/* ************ Keying Sets ********************** */
@@ -179,7 +189,7 @@ struct KeyingSet *ANIM_builtin_keyingset_get_named(struct KeyingSet *prevKS, con
KeyingSetInfo *ANIM_keyingset_info_find_named(const char name[]);
/* for RNA type registrations... */
-void ANIM_keyingset_info_register(const struct bContext *C, KeyingSetInfo *ksi);
+void ANIM_keyingset_info_register(KeyingSetInfo *ksi);
void ANIM_keyingset_info_unregister(const struct bContext *C, KeyingSetInfo *ksi);
/* cleanup on exit */
@@ -193,37 +203,50 @@ struct KeyingSet *ANIM_scene_get_active_keyingset(struct Scene *scene);
/* Get the index of the Keying Set provided, for the given Scene */
int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks);
+/* Get Keying Set to use for Auto-Keyframing some transforms */
+struct KeyingSet *ANIM_get_keyingset_for_autokeying(struct Scene *scene, const char *tranformKSName);
+
/* Create (and show) a menu containing all the Keying Sets which can be used in the current context */
-void ANIM_keying_sets_menu_setup(struct bContext *C, char title[], char op_name[]);
+void ANIM_keying_sets_menu_setup(struct bContext *C, const char title[], const char op_name[]);
+
+/* Dynamically populate an enum of Keying Sets */
+struct EnumPropertyItem *ANIM_keying_sets_enum_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
/* Check if KeyingSet can be used in the current context */
short ANIM_keyingset_context_ok_poll(struct bContext *C, struct KeyingSet *ks);
/* ************ Drivers ********************** */
+/* Flags for use by driver creation calls */
+typedef enum eCreateDriverFlags {
+ CREATEDRIVER_WITH_DEFAULT_DVAR = (1<<0), /* create drivers with a default variable for nicer UI */
+} eCreateDriverFlags;
+
+/* -------- */
+
/* Returns whether there is a driver in the copy/paste buffer to paste */
short ANIM_driver_can_paste(void);
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block
*/
-short ANIM_add_driver(struct ID *id, const char rna_path[], int array_index, short flag, int type);
+short ANIM_add_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag, int type);
/* Main Driver Management API calls:
* Remove the driver for the specified property on the given ID block (if available)
*/
-short ANIM_remove_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_remove_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* Main Driver Management API calls:
* Make a copy of the driver for the specified property on the given ID block
*/
-short ANIM_copy_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_copy_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* Main Driver Management API calls:
* Add a new driver for the specified property on the given ID block or replace an existing one
* with the driver + driver-curve data from the buffer
*/
-short ANIM_paste_driver(struct ID *id, const char rna_path[], int array_index, short flag);
+short ANIM_paste_driver(struct ReportList *reports, struct ID *id, const char rna_path[], int array_index, short flag);
/* ************ Auto-Keyframing ********************** */
/* Notes:
@@ -240,8 +263,12 @@ short ANIM_paste_driver(struct ID *id, const char rna_path[], int array_index, s
#define IS_AUTOKEY_ON(scene) ((scene) ? (scene->toolsettings->autokey_mode & AUTOKEY_ON) : (U.autokey_mode & AUTOKEY_ON))
/* check the mode for auto-keyframing (per scene takes presidence) */
#define IS_AUTOKEY_MODE(scene, mode) ((scene) ? (scene->toolsettings->autokey_mode == AUTOKEY_MODE_##mode) : (U.autokey_mode == AUTOKEY_MODE_##mode))
- /* check if a flag is set for auto-keyframing (as userprefs only!) */
-#define IS_AUTOKEY_FLAG(flag) (U.autokey_flag & AUTOKEY_FLAG_##flag)
+ /* check if a flag is set for auto-keyframing (per scene takes presidence) */
+#define IS_AUTOKEY_FLAG(scene, flag) \
+ ((scene)? \
+ ((scene->toolsettings->autokey_flag & AUTOKEY_FLAG_##flag) || (U.autokey_flag & AUTOKEY_FLAG_##flag)) \
+ : \
+ (U.autokey_flag & AUTOKEY_FLAG_##flag))
/* auto-keyframing feature - checks for whether anything should be done for the current frame */
int autokeyframe_cfra_can_key(struct Scene *scene, struct ID *id);
@@ -277,4 +304,8 @@ typedef enum eAnimFilterFlags {
ANIMFILTER_KEYS_NOSKEY = (1<<10), /* don't include shape keys (for geometry) */
} eAnimFilterFlags;
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_KEYFRAMING_H */
diff --git a/source/blender/editors/include/ED_lattice.h b/source/blender/editors/include/ED_lattice.h
index bebd6c5f3ab..066dd23a629 100644
--- a/source/blender/editors/include/ED_lattice.h
+++ b/source/blender/editors/include/ED_lattice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_lattice.h
+ * \ingroup editors
+ */
+
struct Object;
void free_editLatt(struct Object *ob);
diff --git a/source/blender/editors/include/ED_logic.h b/source/blender/editors/include/ED_logic.h
index 96d10cf2c72..00fc6ccac26 100644
--- a/source/blender/editors/include/ED_logic.h
+++ b/source/blender/editors/include/ED_logic.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_logic.h
+ * \ingroup editors
+ */
+
#ifndef ED_LOGIC_H
#define ED_LOGIC_H
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index e5e1f3cef10..728d9253760 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,11 +25,17 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_markers.h
+ * \ingroup editors
+ */
+
#ifndef ED_MARKERS_H
#define ED_MARKERS_H
struct wmKeyConfig;
struct bContext;
+struct bAnimContext;
struct TimeMarker;
/* Drawing API ------------------------------ */
@@ -44,6 +50,9 @@ void draw_markers_time(const struct bContext *C, int flag);
/* Backend API ----------------------------- */
+ListBase *ED_context_get_markers(const struct bContext *C);
+ListBase *ED_animcontext_get_markers(const struct bAnimContext *ac);
+
struct TimeMarker *ED_markers_find_nearest_marker(ListBase *markers, float x);
int ED_markers_find_nearest_marker_time(ListBase *markers, float x);
@@ -51,6 +60,8 @@ void ED_markers_get_minmax(ListBase *markers, short sel, float *first, float *la
void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short sel);
+struct TimeMarker *ED_markers_get_first_selected(ListBase *markers);
+
/* Operators ------------------------------ */
/* called in screen_ops.c:ED_operatortypes_screen() */
@@ -58,6 +69,8 @@ void ED_operatortypes_marker(void);
/* called in screen_ops.c:ED_keymap_screen() */
void ED_marker_keymap(struct wmKeyConfig *keyconf);
+/* debugging only */
+void debug_markers_print_list(struct ListBase *markers);
#endif /* ED_MARKERS_H */
diff --git a/source/blender/editors/include/ED_mball.h b/source/blender/editors/include/ED_mball.h
index 3fd74a9cdaf..504cc4e2d52 100644
--- a/source/blender/editors/include/ED_mball.h
+++ b/source/blender/editors/include/ED_mball.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_mball.h
+ * \ingroup editors
+ */
+
+#ifndef _ED_MBALL_H_
+#define _ED_MBALL_H_
+
struct bContext;
struct Object;
struct wmKeyConfig;
@@ -41,5 +48,7 @@ void free_editMball(struct Object *obedit);
void make_editMball(struct Object *obedit);
void load_editMball(struct Object *obedit);
-void undo_push_mball(struct bContext *C, char *name);
+void undo_push_mball(struct bContext *C, const char *name);
+
+#endif
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index c63d212ba89..d486a8f2fef 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_mesh.h
+ * \ingroup editors
+ */
+
#ifndef ED_MESH_H
#define ED_MESH_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct ID;
struct View3D;
struct ARegion;
@@ -46,6 +55,9 @@ struct MDeformWeight;
struct MDeformVert;
struct Scene;
struct Mesh;
+struct MFace;
+struct MEdge;
+struct MVert;
struct MCol;
struct UvVertMap;
struct UvMapVert;
@@ -54,6 +66,7 @@ struct BMEditMesh;
struct BMEditSelection;
struct BMesh;
struct BMVert;
+struct MLoopCol;
struct BMEdge;
struct BMFace;
struct UvVertMap;
@@ -89,7 +102,12 @@ float *bm_get_cd_float(struct CustomData *cdata, void *data, int type);
/* bmeshutils.c */
-/*x-mirror editing api. usage:
+/*
+ [note: I've decided to use ideasman's code for non-editmode stuff, but since
+ it has a big "not for editmode!" disclaimer, I'm going to keep what I have here
+ - joeedh]
+
+ x-mirror editing api. usage:
EDBM_CacheMirrorVerts(em);
...
@@ -125,7 +143,7 @@ struct BMFace *EDBM_get_face_for_index(struct BMEditMesh *em, int index);
struct BMFace *EDBM_get_actFace(struct BMEditMesh *em, int sloppy);
int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op,
- char *selectslot, char *fmt, ...);
+ const char *selectslot, const char *fmt, ...);
/*flushes based on the current select mode. if in vertex select mode,
verts select/deselect edges and faces, if in edge select mode,
@@ -142,11 +160,13 @@ void EDBM_deselect_flush(struct BMEditMesh *em);
void EDBM_selectmode_set(struct BMEditMesh *em);
void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
+void undo_push_mesh(struct bContext *C, const char *name);
void EDBM_editselection_center(struct BMEditMesh *em, float *center, struct BMEditSelection *ese);
void EDBM_editselection_plane(struct BMEditMesh *em, float *plane, struct BMEditSelection *ese);
void EDBM_editselection_normal(float *normal, struct BMEditSelection *ese);
int EDBM_vertColorCheck(struct BMEditMesh *em);
+void EDBM_validate_selections(struct BMEditMesh *em);
void EDBM_pin_mesh(struct BMEditMesh *em, int swap);
void EDBM_unpin_mesh(struct BMEditMesh *em, int swap);
@@ -169,15 +189,25 @@ struct MTexPoly *EDBM_get_active_mtexpoly(struct BMEditMesh *em, struct BMFace *
void EDBM_free_uv_vert_map(struct UvVertMap *vmap);
struct UvMapVert *EDBM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v);
struct UvVertMap *EDBM_make_uv_vert_map(struct BMEditMesh *em, int selected, int do_face_idx_array, float *limit);
+void EM_add_data_layer(struct BMEditMesh *em, struct CustomData *data, int type, const char *name);
+void EM_free_data_layer(struct BMEditMesh *em, struct CustomData *data, int type);
void EDBM_toggle_select_all(struct BMEditMesh *em);
void EDBM_set_flag_all(struct BMEditMesh *em, int flag);
+void EDBM_clear_flag_all(struct BMEditMesh *em, int flag);
+void EDBM_automerge(struct Scene *scene, struct Object *ob, int update);
/* meshtools.c */
-/*these functinos are all deprecated, use stuff in editbmesh_bvh.h instead*/
+void EM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Object *obedit, struct BMEditMesh *em);
+
+/* editmesh_mods.c */
+extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
+
intptr_t mesh_octree_table(struct Object *ob, struct BMEditMesh *em, float *co, char mode);
-struct BMVert *editmesh_get_x_mirror_vert(struct Object *ob, struct BMEditMesh *em, float *co);
+long mesh_mirrtopo_table(struct Object *ob, char mode);
+
+struct BMVert *editbmesh_get_x_mirror_vert(struct Object *ob, struct BMEditMesh *em, struct BMVert *eve, float *co, int index);
int mesh_get_x_mirror_vert(struct Object *ob, int index);
int *mesh_get_x_mirror_faces(struct Object *ob, struct BMEditMesh *em);
@@ -194,9 +224,23 @@ void ED_keymap_mesh(struct wmKeyConfig *keyconf);
void ED_spacetypes_init(void);
void ED_keymap_mesh(struct wmKeyConfig *keyconf);
+
/* bmesh_mods.c */
extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
+int mouse_mesh(struct bContext *C, short mval[2], short extend);
+
+/* editface.c */
+void paintface_flush_flags(struct Object *ob);
+struct MTexPoly *EM_get_active_mtexpoly(struct BMEditMesh *em, struct BMFace **act_efa, struct MLoopCol **col, int sloppy);
+int paintface_mouse_select(struct bContext *C, struct Object *ob, short mval[2], int extend);
+int do_paintface_box_select(struct ViewContext *vc, struct rcti *rect, int select, int extend);
+void paintface_deselect_all_visible(struct Object *ob, int action, short flush_flags);
+void paintface_select_linked(struct bContext *C, struct Object *ob, short mval[2], int mode);
+int paintface_minmax(struct Object *ob, float *min, float *max);
+
+void paintface_hide(struct Object *ob, const int unselected);
+void paintface_reveal(struct Object *ob);
/* object_vgroup.c */
@@ -205,13 +249,16 @@ extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
#define WEIGHT_SUBTRACT 3
struct bDeformGroup *ED_vgroup_add(struct Object *ob);
-struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name);
-void ED_vgroup_select_by_name(struct Object *ob, char *name);
+struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, const char *name);
+void ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup);
+void ED_vgroup_select_by_name(struct Object *ob, const char *name);
void ED_vgroup_data_create(struct ID *id);
int ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
int ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
void ED_vgroup_mirror(struct Object *ob, int mirror_weights, int flip_vgroups);
+int ED_vgroup_object_is_edit_mode(struct Object *ob);
+
void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode);
void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum);
float ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum);
@@ -241,11 +288,17 @@ void ED_mesh_calc_normals(struct Mesh *me);
void ED_mesh_material_link(struct Mesh *me, struct Material *ma);
void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges);
-int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
+int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me, const char *name, int active_set);
int ED_mesh_uv_texture_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me, const char *name, int active_set);
int ED_mesh_color_remove(struct bContext *C, struct Object *ob, struct Mesh *me);
+void EDBM_selectmode_to_scene(struct Scene *scene, struct Object *obedit);
+
#include "../mesh/editbmesh_bvh.h"
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_MESH_H */
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 6e42b772bef..829ad3217a9 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_node.h
+ * \ingroup editors
+ */
+
#ifndef ED_NODE_H
#define ED_NODE_H
@@ -40,7 +45,7 @@ void ED_init_node_butfuncs(void);
/* node_draw.c */
void ED_node_changed_update(struct ID *id, struct bNode *node);
-void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node);
+void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
/* node_edit.c */
void ED_node_shader_default(struct Material *ma);
diff --git a/source/blender/editors/include/ED_numinput.h b/source/blender/editors/include/ED_numinput.h
index 7df1f1f28cb..d605a9b3377 100644
--- a/source/blender/editors/include/ED_numinput.h
+++ b/source/blender/editors/include/ED_numinput.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_numinput.h
+ * \ingroup editors
+ */
+
#ifndef ED_NUMINPUT_H
#define ED_NUMINPUT_H
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index f243b4cc497..ce6a9d609db 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_object.h
+ * \ingroup editors
+ */
+
#ifndef ED_OBJECT_H
#define ED_OBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct Base;
struct bConstraint;
struct bContext;
@@ -100,12 +109,9 @@ struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, floa
void ED_object_single_users(struct Main *bmain, struct Scene *scene, int full);
-/* cleanup */
-int object_is_libdata(struct Object *ob);
-int object_data_is_libdata(struct Object *ob);
/* object motion paths */
-void ED_objects_clear_paths(struct bContext *C, struct Scene *scene);
+void ED_objects_clear_paths(struct bContext *C);
void ED_objects_recalculate_paths(struct bContext *C, struct Scene *scene);
/* constraints */
@@ -121,7 +127,7 @@ void ED_object_constraint_dependency_update(struct Main *bmain, struct Scene *sc
/* object_lattice.c */
int mouse_lattice(struct bContext *C, short mval[2], int extend);
-void undo_push_lattice(struct bContext *C, char *name);
+void undo_push_lattice(struct bContext *C, const char *name);
/* object_lattice.c */
@@ -133,7 +139,7 @@ enum {
MODIFIER_APPLY_SHAPE,
} eModifier_Apply_Mode;
-struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, char *name, int type);
+struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type);
int ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
@@ -141,5 +147,9 @@ int ED_object_modifier_convert(struct ReportList *reports, struct Main *bmain, s
int ED_object_modifier_apply(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md, int mode);
int ED_object_modifier_copy(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
+#ifdef __cplusplus
+}
+#endif
+
#endif /* ED_OBJECT_H */
diff --git a/source/blender/editors/include/ED_particle.h b/source/blender/editors/include/ED_particle.h
index 87aa7ca9195..7b4a2e6fe16 100644
--- a/source/blender/editors/include/ED_particle.h
+++ b/source/blender/editors/include/ED_particle.h
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_particle.h
+ * \ingroup editors
+ */
+
#ifndef ED_PARTICLE_H
#define ED_PARTICLE_H
@@ -59,14 +63,16 @@ void PE_update_object(struct Scene *scene, struct Object *ob, int useflag);
int PE_mouse_particles(struct bContext *C, short *mval, int extend);
int PE_border_select(struct bContext *C, struct rcti *rect, int select, int extend);
int PE_circle_select(struct bContext *C, int selecting, short *mval, float rad);
-int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short select);
+int PE_lasso_select(struct bContext *C, short mcords[][2], short moves, short extend, short select);
+void PE_deselect_all_visible(struct PTCacheEdit *edit);
/* undo */
-void PE_undo_push(struct Scene *scene, char *str);
+void PE_undo_push(struct Scene *scene, const char *str);
void PE_undo_step(struct Scene *scene, int step);
void PE_undo(struct Scene *scene);
void PE_redo(struct Scene *scene);
void PE_undo_menu(struct Scene *scene, struct Object *ob);
+int PE_undo_valid(struct Scene *scene);
#endif /* ED_PARTICLE_H */
diff --git a/source/blender/editors/include/ED_physics.h b/source/blender/editors/include/ED_physics.h
index 51906bf41c1..c58e70a0768 100644
--- a/source/blender/editors/include/ED_physics.h
+++ b/source/blender/editors/include/ED_physics.h
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_physics.h
+ * \ingroup editors
+ */
+
#ifndef ED_PHYSICS_H
#define ED_PHYSICS_H
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index f34670da471..651c298ad5e 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -21,6 +21,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_render.h
+ * \ingroup editors
+ */
+
#ifndef ED_RENDER_H
#define ED_RENDER_H
@@ -43,8 +47,6 @@ void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
/* render_preview.c */
-#define _RENDERSIZE 140
-
/* stores rendered preview - is also used for icons */
typedef struct RenderInfo {
int pr_rectx;
diff --git a/source/blender/editors/include/ED_retopo.h b/source/blender/editors/include/ED_retopo.h
deleted file mode 100644
index e8d74411871..00000000000
--- a/source/blender/editors/include/ED_retopo.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2006 by Nicholas Bishop
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef ED_RETOPO_H
-#define ED_RETOPO_H
-
-#include "DNA_vec_types.h"
-
-/* For bglMats */
-#include "BIF_glutil.h"
-
-struct EditVert;
-struct Mesh;
-struct View3D;
-
-typedef struct RetopoViewData {
- bglMats mats;
-
- char queue_matrix_update;
-} RetopoViewData;
-
-typedef struct RetopoPaintPoint {
- struct RetopoPaintPoint *next, *prev;
- vec2s loc;
- short index;
- float co[3];
- struct EditVert *eve;
-} RetopoPaintPoint;
-
-typedef struct RetopoPaintLine {
- struct RetopoPaintLine *next, *prev;
- ListBase points;
- ListBase hitlist; /* RetopoPaintHit */
- RetopoPaintPoint *cyclic;
-} RetopoPaintLine;
-
-typedef struct RetopoPaintSel {
- struct RetopoPaintSel *next, *prev;
- RetopoPaintLine *line;
- char first;
-} RetopoPaintSel;
-
-typedef struct RetopoPaintData {
- char in_drag;
- short sloc[2];
-
- ListBase lines;
- ListBase intersections; /* RetopoPaintPoint */
-
- short seldist;
- RetopoPaintSel nearest;
-
- struct View3D *paint_v3d;
-} RetopoPaintData;
-
-RetopoPaintData *get_retopo_paint_data(void);
-
-char retopo_mesh_check(void);
-char retopo_curve_check(void);
-
-void retopo_end_okee(void);
-
-void retopo_free_paint_data(RetopoPaintData *rpd);
-void retopo_free_paint(void);
-
-char retopo_mesh_paint_check(void);
-void retopo_paint_view_update(struct View3D *v3d);
-void retopo_force_update(void);
-void retopo_paint_toggle(void*,void*);
-char retopo_paint(const unsigned short event);
-void retopo_draw_paint_lines(void);
-RetopoPaintData *retopo_paint_data_copy(RetopoPaintData *rpd);
-
-void retopo_toggle(void*,void*);
-void retopo_do_vert(struct View3D *v3d, float *v);
-void retopo_do_all(void);
-void retopo_do_all_cb(void *, void *);
-void retopo_queue_updates(struct View3D *v3d);
-
-void retopo_matrix_update(struct View3D *v3d);
-
-void retopo_free_view_data(struct View3D *v3d);
-
-#endif
-
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 3478447b058..f1665f2b165 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_screen.h
+ * \ingroup editors
+ */
+
#ifndef ED_SCREEN_H
#define ED_SCREEN_H
@@ -57,7 +62,7 @@ void ED_region_tag_redraw(struct ARegion *ar);
void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct);
void ED_region_tag_redraw_overlay(struct ARegion *ar);
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar);
-void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context, int contextnr);
+void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, const char *context, int contextnr);
void ED_region_header_init(struct ARegion *ar);
void ED_region_header(const struct bContext *C, struct ARegion *ar);
void ED_region_toggle_hidden(struct bContext *C, struct ARegion *ar);
@@ -69,7 +74,7 @@ void ED_spacetypes_keymap(struct wmKeyConfig *keyconf);
int ED_area_header_switchbutton(const struct bContext *C, struct uiBlock *block, int yco);
int ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock *block, int yco);
void ED_area_overdraw(struct bContext *C);
-void ED_area_overdraw_flush(struct bContext *C, struct ScrArea *sa, struct ARegion *ar);
+void ED_area_overdraw_flush(struct ScrArea *sa, struct ARegion *ar);
/* areas */
@@ -78,6 +83,7 @@ void ED_area_exit(struct bContext *C, struct ScrArea *sa);
int ED_screen_area_active(const struct bContext *C);
void ED_area_do_listen(ScrArea *sa, struct wmNotifier *note);
void ED_area_tag_redraw(ScrArea *sa);
+void ED_area_tag_redraw_regiontype(ScrArea *sa, int type);
void ED_area_tag_refresh(ScrArea *sa);
void ED_area_do_refresh(struct bContext *C, ScrArea *sa);
void ED_area_headerprint(ScrArea *sa, const char *str);
@@ -91,7 +97,7 @@ void ED_screen_draw(struct wmWindow *win);
void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc);
-bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, char *name);
+bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name);
void ED_screen_set(struct bContext *C, struct bScreen *sc);
void ED_screen_delete(struct bContext *C, struct bScreen *sc);
void ED_screen_set_scene(struct bContext *C, struct Scene *scene);
@@ -108,7 +114,8 @@ struct ScrArea *ED_screen_full_toggle(struct bContext *C, struct wmWindow *win,
void ED_screen_new_window(struct bContext *C, struct rcti *position, int type);
/* anim */
-void ED_update_for_newframe(const struct bContext *C, int mute);
+void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct bScreen *screen, int mute);
+
void ED_refresh_viewport_fps(struct bContext *C);
int ED_screen_animation_play(struct bContext *C, int sync, int mode);
@@ -123,28 +130,38 @@ int ED_operator_areaactive(struct bContext *C);
int ED_operator_regionactive(struct bContext *C);
int ED_operator_scene_editable(struct bContext *C);
+int ED_operator_objectmode(struct bContext *C);
int ED_operator_view3d_active(struct bContext *C);
+int ED_operator_region_view3d_active(struct bContext *C);
+int ED_operator_animview_active(struct bContext *C);
int ED_operator_timeline_active(struct bContext *C);
int ED_operator_outliner_active(struct bContext *C);
+int ED_operator_outliner_active_no_editobject(struct bContext *C);
int ED_operator_file_active(struct bContext *C);
int ED_operator_action_active(struct bContext *C);
int ED_operator_buttons_active(struct bContext *C);
int ED_operator_node_active(struct bContext *C);
-int ED_operator_ipo_active(struct bContext *C);
+int ED_operator_graphedit_active(struct bContext *C);
int ED_operator_sequencer_active(struct bContext *C);
int ED_operator_image_active(struct bContext *C);
int ED_operator_nla_active(struct bContext *C);
int ED_operator_logic_active(struct bContext *C);
+int ED_operator_info_active(struct bContext *C);
+int ED_operator_console_active(struct bContext *C);
+
int ED_operator_object_active(struct bContext *C);
int ED_operator_object_active_editable(struct bContext *C);
+int ED_operator_object_active_editable_mesh(struct bContext *C);
int ED_operator_editmesh(struct bContext *C);
int ED_operator_editmesh_view3d(struct bContext *C);
+int ED_operator_editmesh_region_view3d(struct bContext *C);
int ED_operator_editarmature(struct bContext *C);
int ED_operator_editcurve(struct bContext *C);
int ED_operator_editsurf(struct bContext *C);
int ED_operator_editsurfcurve(struct bContext *C);
+int ED_operator_editsurfcurve_region_view3d(struct bContext *C);
int ED_operator_editfont(struct bContext *C);
int ED_operator_editlattice(struct bContext *C);
int ED_operator_editmball(struct bContext *C);
diff --git a/source/blender/editors/include/ED_screen_types.h b/source/blender/editors/include/ED_screen_types.h
index c55dafa6f51..71e3780fe24 100644
--- a/source/blender/editors/include/ED_screen_types.h
+++ b/source/blender/editors/include/ED_screen_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_screen_types.h
+ * \ingroup editors
+ */
+
#ifndef ED_SCREEN_TYPES_H__
#define ED_SCREEN_TYPES_H__
@@ -38,6 +42,7 @@ typedef struct ScreenAnimData {
short refresh;
short flag; /* flags for playback */
int sfra; /* frame that playback was started from */
+ int nextfra; /* next frame to go to (when ANIMPLAY_FLAG_USE_NEXT_FRAME is set) */
} ScreenAnimData;
/* for animplayer */
@@ -50,6 +55,8 @@ enum {
ANIMPLAY_FLAG_SYNC = (1<<2),
/* don't drop frames (and ignore SCE_FRAME_DROP flag) */
ANIMPLAY_FLAG_NO_SYNC = (1<<3),
+ /* use nextfra at next timer update */
+ ANIMPLAY_FLAG_USE_NEXT_FRAME = (1<<4)
};
/* ----------------------------------------------------- */
@@ -68,13 +75,21 @@ typedef struct ScreenFrameRateInfo {
/* ----------------------------------------------------- */
+/* Enum for Action Zone Edges. Which edge of area is action zone. */
+typedef enum {
+ AE_RIGHT_TO_TOPLEFT, /* Region located on the left, _right_ edge is action zone. Region minimised to the top left */
+ AE_LEFT_TO_TOPRIGHT, /* Region located on the right, _left_ edge is action zone. Region minimised to the top right */
+ AE_TOP_TO_BOTTOMRIGHT, /* Region located at the bottom, _top_ edge is action zone. Region minimised to the bottom right */
+ AE_BOTTOM_TO_TOPLEFT /* Region located at the top, _bottom_edge is action zone. Region minimised to the top left */
+} AZEdge;
+
/* for editing areas/regions */
typedef struct AZone {
struct AZone *next, *prev;
ARegion *ar;
int type;
/* region-azone, which of the edges */
- short edge;
+ AZEdge edge;
/* internal */
short do_draw;
/* for draw */
diff --git a/source/blender/editors/include/ED_sculpt.h b/source/blender/editors/include/ED_sculpt.h
index 506813ce626..33d2dfcf4c5 100644
--- a/source/blender/editors/include/ED_sculpt.h
+++ b/source/blender/editors/include/ED_sculpt.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_sculpt.h
+ * \ingroup editors
+ */
+
#ifndef ED_SCULPT_H
#define ED_SCULPT_H
@@ -40,6 +44,7 @@ void ED_operatortypes_sculpt(void);
void sculpt_get_redraw_planes(float planes[4][4], struct ARegion *ar,
struct RegionView3D *rv3d, struct Object *ob);
void ED_sculpt_force_update(struct bContext *C);
+void ED_sculpt_modifiers_changed(struct Object *ob);
/* paint_ops.c */
void ED_operatortypes_paint(void);
@@ -51,5 +56,6 @@ void ED_keymap_paint(struct wmKeyConfig *keyconf);
int ED_undo_paint_step(struct bContext *C, int type, int step, const char *name);
void ED_undo_paint_free(void);
+int ED_undo_paint_valid(int type, const char *name);
#endif
diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h
index d99187afce9..39eb66e56e9 100644
--- a/source/blender/editors/include/ED_sequencer.h
+++ b/source/blender/editors/include/ED_sequencer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_sequencer.h
+ * \ingroup editors
+ */
+
#ifndef ED_SEQUENCER_H
#define ED_SEQUENCER_H
diff --git a/source/blender/editors/include/ED_sound.h b/source/blender/editors/include/ED_sound.h
index 8b157d86279..3c6b12da076 100644
--- a/source/blender/editors/include/ED_sound.h
+++ b/source/blender/editors/include/ED_sound.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_sound.h
+ * \ingroup editors
+ */
+
#ifndef ED_SOUND_H
#define ED_SOUND_H
diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h
index 69a3d1f758a..053b1d4fd9c 100644
--- a/source/blender/editors/include/ED_space_api.h
+++ b/source/blender/editors/include/ED_space_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_space_api.h
+ * \ingroup editors
+ */
+
#ifndef ED_SPACE_API_H
#define ED_SPACE_API_H
diff --git a/source/blender/editors/include/ED_text.h b/source/blender/editors/include/ED_text.h
index 081e83b1844..bc8c9958e18 100644
--- a/source/blender/editors/include/ED_text.h
+++ b/source/blender/editors/include/ED_text.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_text.h
+ * \ingroup editors
+ */
+
#ifndef ED_TEXT_H
#define ED_TEXT_H
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index d8954be08c9..3ab634afeff 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_transform.h
+ * \ingroup editors
+ */
+
#ifndef ED_TRANSFORM_H
#define ED_TRANSFORM_H
@@ -126,7 +130,7 @@ void BIF_selectTransformOrientationValue(struct bContext *C, int orientation);
void ED_getTransformOrientationMatrix(const struct bContext *C, float orientation_mat[][3], int activeOnly);
struct EnumPropertyItem *BIF_enumTransformOrientation(struct bContext *C);
-char * BIF_menustringTransformOrientation(const struct bContext *C, char *title); /* the returned value was allocated and needs to be freed after use */
+const char * BIF_menustringTransformOrientation(const struct bContext *C, const char *title); /* the returned value was allocated and needs to be freed after use */
int BIF_countTransformOrientation(const struct bContext *C);
void BIF_TransformSetUndo(char *str);
@@ -142,6 +146,7 @@ void BIF_selectOrientation(void);
#define P_GEO_SNAP (P_SNAP|(1 << 4))
#define P_ALIGN_SNAP (P_GEO_SNAP|(1 << 5))
#define P_CONSTRAINT (1 << 6)
+#define P_OPTIONS (1 << 7)
void Transform_Properties(struct wmOperatorType *ot, int flags);
diff --git a/source/blender/editors/include/ED_types.h b/source/blender/editors/include/ED_types.h
index 96a5d5857fa..0218b8d9c2d 100644
--- a/source/blender/editors/include/ED_types.h
+++ b/source/blender/editors/include/ED_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_types.h
+ * \ingroup editors
+ */
+
#ifndef ED_TYPES_H
#define ED_TYPES_H
@@ -35,18 +40,13 @@
#define SELECT 1
#define ACTIVE 2
-/* nonstandard define, sometimes in math.h */
-#ifndef MAXFLOAT
-#define MAXFLOAT ((float)3.40282347e+38)
-#endif
-
/* buttons */
#define XIC 20
#define YIC 20
/* proposal = put scene pointers on function calls? */
-#define BASACT (scene->basact)
-#define OBACT (BASACT? BASACT->object: 0)
+// #define BASACT (scene->basact)
+// #define OBACT (BASACT? BASACT->object: NULL)
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 96ad1989497..06c9c12444e 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,15 +25,23 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_util.h
+ * \ingroup editors
+ */
+
#ifndef ED_UTIL_H
#define ED_UTIL_H
+struct Scene;
struct Object;
struct bContext;
struct ARegion;
struct uiBlock;
struct wmOperator;
struct wmOperatorType;
+struct EditMesh;
+struct Mesh;
/* ed_util.c */
@@ -43,16 +51,24 @@ void ED_editors_exit (struct bContext *C);
/* ************** Undo ************************ */
/* undo.c */
-void ED_undo_push (struct bContext *C, char *str);
+void ED_undo_push (struct bContext *C, const char *str);
void ED_undo_push_op (struct bContext *C, struct wmOperator *op);
void ED_undo_pop_op (struct bContext *C, struct wmOperator *op);
void ED_undo_pop (struct bContext *C);
void ED_undo_redo (struct bContext *C);
void ED_OT_undo (struct wmOperatorType *ot);
+void ED_OT_undo_push (struct wmOperatorType *ot);
void ED_OT_redo (struct wmOperatorType *ot);
+int ED_undo_operator_repeat(struct bContext *C, struct wmOperator *op);
+ /* convenience since UI callbacks use this mostly*/
+void ED_undo_operator_repeat_cb(struct bContext *C, void *arg_op, void *arg_unused);
+void ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg_unused);
+
+int ED_undo_valid (const struct bContext *C, const char *undoname);
+
/* undo_editmode.c */
-void undo_editmode_push(struct bContext *C, char *name,
+void undo_editmode_push(struct bContext *C, const char *name,
void * (*getdata)(struct bContext *C),
void (*freedata)(void *),
void (*to_editmode)(void *, void *, void *),
@@ -66,11 +82,21 @@ void undo_editmode_menu (struct bContext *C);
void undo_editmode_clear (void);
void undo_editmode_step (struct bContext *C, int step);
+/* crazyspace.c */
+float *crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit);
+void crazyspace_set_quats_editmesh(struct BMEditMesh *em, float *origcos, float *mappedcos, float *quats);
+void crazyspace_set_quats_mesh(struct Mesh *me, float *origcos, float *mappedcos, float *quats);
+int sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);
+void crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]);
+
/* ************** XXX OLD CRUFT WARNING ************* */
void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, float fac3, int invert);
-int GetButStringLength(char *str);
+int GetButStringLength(const char *str);
+
+/* where else to go ? */
+void unpack_menu(struct bContext *C, const char *opname, const char *id_name, const char *abs_name, const char *folder, struct PackedFile *pf);
#endif /* ED_UTIL_H */
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 65ead416971..5d45415c3b3 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file ED_uvedit.h
+ * \ingroup editors
+ */
+
#ifndef ED_UVEDIT_H
#define ED_UVEDIT_H
@@ -41,17 +45,24 @@ void ED_operatortypes_uvedit(void);
void ED_keymap_uvedit(struct wmKeyConfig *keyconf);
void ED_uvedit_assign_image(struct Scene *scene, struct Object *obedit, struct Image *ima, struct Image *previma);
-void ED_uvedit_set_tile(struct bContext *C, struct Scene *scene, struct Object *obedit, struct Image *ima, int curtile, int dotile);
int ED_uvedit_minmax(struct Scene *scene, struct Image *ima, struct Object *obedit, float *min, float *max);
int ED_uvedit_test_silent(struct Object *obedit);
int ED_uvedit_test(struct Object *obedit);
+/* visibility and selection */
int uvedit_face_visible(struct Scene *scene, struct Image *ima, struct BMFace *efa, struct MTexPoly *tf);
int uvedit_face_selected(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
int uvedit_edge_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
int uvedit_uv_selected(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
+int uvedit_face_deselect(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
+void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_edge_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+void uvedit_uv_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima, float co[2], float uv[2]);
/* uvedit_unwrap.c */
@@ -59,5 +70,7 @@ void ED_uvedit_live_unwrap_begin(struct Scene *scene, struct Object *obedit);
void ED_uvedit_live_unwrap_re_solve(void);
void ED_uvedit_live_unwrap_end(short cancel);
+void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
+
#endif /* ED_UVEDIT_H */
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index bd4791055e2..37541722682 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file ED_view3d.h
+ * \ingroup editors
+ */
+
#ifndef ED_VIEW3D_H
#define ED_VIEW3D_H
@@ -50,6 +55,7 @@ struct RegionView3D;
struct Scene;
struct View3D;
struct ViewContext;
+struct wmWindow;
/* for derivedmesh drawing callbacks, for view3d_select, .... */
@@ -66,6 +72,7 @@ typedef struct ViewContext {
typedef struct ViewDepths {
unsigned short w, h;
+ short x, y; /* only for temp use for sub-rects, added to ar->winx/y */
float *depths;
double depth_range[2];
@@ -81,6 +88,7 @@ void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my);
void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z);
/* Depth buffer */
+void view3d_update_depths(struct ARegion *ar);
float read_cached_depth(struct ViewContext *vc, int x, int y);
void request_depth_update(struct RegionView3D *rv3d);
@@ -109,11 +117,10 @@ int get_view3d_ortho(struct View3D *v3d, struct RegionView3D *rv3d);
void view3d_get_object_project_mat(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
/* computes screen x/y in vec */
void view3d_project_float(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
-/* computes z, as well as x and y */
void view3d_project_float_v3(struct ARegion *a, float *vec, float *adr, float mat[4][4]);
-void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r);
+void view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct RegionView3D *rv3d, struct View3D *v3d, struct rctf *viewborder_r, short do_shift);
-/* drawobject.c itterators */
+/* drawobject.c iterators */
void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct BMVert *eve, int x, int y, int index), void *userData, int clipVerts);
void mesh_foreachScreenEdge(struct ViewContext *vc, void (*func)(void *userData, struct BMEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts);
void mesh_foreachScreenFace(struct ViewContext *vc, void (*func)(void *userData, struct BMFace *efa, int x, int y, int index), void *userData);
@@ -123,8 +130,9 @@ void lattice_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userDa
void ED_view3d_local_clipping(struct RegionView3D *rv3d, float mat[][4]);
int view3d_test_clipping(struct RegionView3D *rv3d, float *vec, int local);
void view3d_align_axis_to_vector(struct View3D *v3d, struct RegionView3D *rv3d, int axisidx, float vec[3]);
+float view3d_pixel_size(struct RegionView3D *rv3d, const float co[3]);
-void drawcircball(int mode, float *cent, float rad, float tmat[][4]);
+void drawcircball(int mode, const float cent[3], float rad, float tmat[][4]);
/* backbuffer select and draw support */
void view3d_validate_backbuf(struct ViewContext *vc);
@@ -138,8 +146,9 @@ int view_autodist(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, s
/* only draw so view_autodist_simple can be called many times after */
int view_autodist_init(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, int mode);
-int view_autodist_simple(struct ARegion *ar, short *mval, float mouse_worldloc[3], int margin, float *force_depth);
-int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth);
+int view_autodist_simple(struct ARegion *ar, short mval[2], float mouse_worldloc[3], int margin, float *force_depth);
+int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth);
+int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth);
/* select */
#define MAXPICKBUF 10000
@@ -147,6 +156,7 @@ short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigne
void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc);
void view3d_operator_needs_opengl(const struct bContext *C);
+void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *ar);
void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float *fp, short mval[2]);
void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats);
@@ -169,10 +179,11 @@ void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct AR
struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag);
struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype);
-void view3d_clipping_local(struct RegionView3D *rv3d, float mat[][4]);
Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval);
-void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar);
+void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
+
+unsigned int ED_viewedit_datamask(struct bScreen *screen);
#endif /* ED_VIEW3D_H */
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 3e8420df7eb..b2a353b0647 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,890 +26,984 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file UI_icons.h
+ * \ingroup editorui
+ */
+
/* Note: this is included twice with different #defines for DEF_ICON
once from UI_resources.h for the internal icon enum and
once for interface_api.c for the definition of the RNA enum for the icons */
-DEF_ICON(ICON_BLENDER)
-DEF_ICON(ICON_QUESTION)
-DEF_ICON(ICON_ERROR)
-DEF_ICON(ICON_CANCEL)
-DEF_ICON(ICON_TRIA_RIGHT)
-DEF_ICON(ICON_TRIA_DOWN)
-DEF_ICON(ICON_TRIA_LEFT)
-DEF_ICON(ICON_TRIA_UP)
-DEF_ICON(ICON_ARROW_LEFTRIGHT)
-DEF_ICON(ICON_PLUS)
-DEF_ICON(ICON_DISCLOSURE_TRI_DOWN)
-DEF_ICON(ICON_DISCLOSURE_TRI_RIGHT)
-DEF_ICON(ICON_RADIOBUT_OFF)
-DEF_ICON(ICON_RADIOBUT_ON)
-DEF_ICON(ICON_MENU_PANEL)
-DEF_ICON(ICON_PYTHON)
-DEF_ICON(ICON_BLANK003)
-DEF_ICON(ICON_DOT)
-DEF_ICON(ICON_BLANK004)
-DEF_ICON(ICON_X)
-DEF_ICON(ICON_BLANK005)
-DEF_ICON(ICON_GO_LEFT)
-DEF_ICON(ICON_PLUG)
-DEF_ICON(ICON_UI)
-DEF_ICON(ICON_NODE)
-DEF_ICON(ICON_NODE_SEL)
+/* ICON_ prefix added */
+DEF_ICON(BLENDER)
+DEF_ICON(QUESTION)
+DEF_ICON(ERROR)
+DEF_ICON(CANCEL)
+DEF_ICON(TRIA_RIGHT)
+DEF_ICON(TRIA_DOWN)
+DEF_ICON(TRIA_LEFT)
+DEF_ICON(TRIA_UP)
+DEF_ICON(ARROW_LEFTRIGHT)
+DEF_ICON(PLUS)
+DEF_ICON(DISCLOSURE_TRI_DOWN)
+DEF_ICON(DISCLOSURE_TRI_RIGHT)
+DEF_ICON(RADIOBUT_OFF)
+DEF_ICON(RADIOBUT_ON)
+DEF_ICON(MENU_PANEL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK002)
+ DEF_ICON(BLANK003)
+#endif
+DEF_ICON(DOT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK004)
+#endif
+DEF_ICON(X)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK005)
+#endif
+DEF_ICON(GO_LEFT)
+DEF_ICON(PLUG)
+DEF_ICON(UI)
+DEF_ICON(NODE)
+DEF_ICON(NODE_SEL)
/* ui */
-DEF_ICON(ICON_FULLSCREEN)
-DEF_ICON(ICON_SPLITSCREEN)
-DEF_ICON(ICON_RIGHTARROW_THIN)
-DEF_ICON(ICON_BORDERMOVE)
-DEF_ICON(ICON_VIEWZOOM)
-DEF_ICON(ICON_ZOOMIN)
-DEF_ICON(ICON_ZOOMOUT)
-DEF_ICON(ICON_PANEL_CLOSE)
-DEF_ICON(ICON_COPY_ID) //ICON_BLANK009
-DEF_ICON(ICON_EYEDROPPER)
-DEF_ICON(ICON_LINK_AREA) //ICON_BLANK010
-DEF_ICON(ICON_AUTO)
-DEF_ICON(ICON_CHECKBOX_DEHLT)
-DEF_ICON(ICON_CHECKBOX_HLT)
-DEF_ICON(ICON_UNLOCKED)
-DEF_ICON(ICON_LOCKED)
-DEF_ICON(ICON_UNPINNED)
-DEF_ICON(ICON_PINNED)
-DEF_ICON(ICON_SCREEN_BACK)
-DEF_ICON(ICON_RIGHTARROW)
-DEF_ICON(ICON_DOWNARROW_HLT)
-DEF_ICON(ICON_DOTSUP)
-DEF_ICON(ICON_DOTSDOWN)
-DEF_ICON(ICON_LINK)
-DEF_ICON(ICON_INLINK)
-DEF_ICON(ICON_PLUGIN)
+DEF_ICON(FULLSCREEN)
+DEF_ICON(SPLITSCREEN)
+DEF_ICON(RIGHTARROW_THIN)
+DEF_ICON(BORDERMOVE)
+DEF_ICON(VIEWZOOM)
+DEF_ICON(ZOOMIN)
+DEF_ICON(ZOOMOUT)
+DEF_ICON(PANEL_CLOSE)
+DEF_ICON(COPY_ID) //ICON_BLANK009
+DEF_ICON(EYEDROPPER)
+DEF_ICON(LINK_AREA) //ICON_BLANK010
+DEF_ICON(AUTO)
+DEF_ICON(CHECKBOX_DEHLT)
+DEF_ICON(CHECKBOX_HLT)
+DEF_ICON(UNLOCKED)
+DEF_ICON(LOCKED)
+DEF_ICON(UNPINNED)
+DEF_ICON(PINNED)
+DEF_ICON(SCREEN_BACK)
+DEF_ICON(RIGHTARROW)
+DEF_ICON(DOWNARROW_HLT)
+DEF_ICON(DOTSUP)
+DEF_ICON(DOTSDOWN)
+DEF_ICON(LINK)
+DEF_ICON(INLINK)
+DEF_ICON(PLUGIN)
/* various ui */
-DEF_ICON(ICON_HELP)
-DEF_ICON(ICON_GHOST_ENABLED)
-DEF_ICON(ICON_COLOR)
-DEF_ICON(ICON_LINKED)
-DEF_ICON(ICON_UNLINKED)
-DEF_ICON(ICON_HAND)
-DEF_ICON(ICON_ZOOM_ALL)
-DEF_ICON(ICON_ZOOM_SELECTED)
-DEF_ICON(ICON_ZOOM_PREVIOUS)
-DEF_ICON(ICON_ZOOM_IN)
-DEF_ICON(ICON_ZOOM_OUT)
-DEF_ICON(ICON_RENDER_REGION)
-DEF_ICON(ICON_BORDER_RECT)
-DEF_ICON(ICON_BORDER_LASSO)
-DEF_ICON(ICON_FREEZE)
-DEF_ICON(ICON_STYLUS_PRESSURE)
-DEF_ICON(ICON_GHOST_DISABLED)
-DEF_ICON(ICON_NEW)
-DEF_ICON(ICON_FILE_TICK)
-DEF_ICON(ICON_QUIT)
-DEF_ICON(ICON_URL)
-DEF_ICON(ICON_RECOVER_LAST)
-DEF_ICON(ICON_BLANK038)
-DEF_ICON(ICON_FULLSCREEN_ENTER)
-DEF_ICON(ICON_FULLSCREEN_EXIT)
-DEF_ICON(ICON_BLANK1) // Not actually blank - this is used all over the place
+DEF_ICON(HELP)
+DEF_ICON(GHOST_ENABLED)
+DEF_ICON(COLOR)
+DEF_ICON(LINKED)
+DEF_ICON(UNLINKED)
+DEF_ICON(HAND)
+DEF_ICON(ZOOM_ALL)
+DEF_ICON(ZOOM_SELECTED)
+DEF_ICON(ZOOM_PREVIOUS)
+DEF_ICON(ZOOM_IN)
+DEF_ICON(ZOOM_OUT)
+DEF_ICON(RENDER_REGION)
+DEF_ICON(BORDER_RECT)
+DEF_ICON(BORDER_LASSO)
+DEF_ICON(FREEZE)
+DEF_ICON(STYLUS_PRESSURE)
+DEF_ICON(GHOST_DISABLED)
+DEF_ICON(NEW)
+DEF_ICON(FILE_TICK)
+DEF_ICON(QUIT)
+DEF_ICON(URL)
+DEF_ICON(RECOVER_LAST)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK038)
+#endif
+DEF_ICON(FULLSCREEN_ENTER)
+DEF_ICON(FULLSCREEN_EXIT)
+DEF_ICON(BLANK1) // Not actually blank - this is used all over the place
/* BUTTONS */
-DEF_ICON(ICON_LAMP)
-DEF_ICON(ICON_MATERIAL)
-DEF_ICON(ICON_TEXTURE)
-DEF_ICON(ICON_ANIM)
-DEF_ICON(ICON_WORLD)
-DEF_ICON(ICON_SCENE)
-DEF_ICON(ICON_EDIT)
-DEF_ICON(ICON_GAME)
-DEF_ICON(ICON_RADIO)
-DEF_ICON(ICON_SCRIPT)
-DEF_ICON(ICON_PARTICLES)
-DEF_ICON(ICON_PHYSICS)
-DEF_ICON(ICON_SPEAKER)
-DEF_ICON(ICON_TEXTURE_SHADED) //ICON_BLANK041
-DEF_ICON(ICON_BLANK042)
-DEF_ICON(ICON_BLANK043)
-DEF_ICON(ICON_BLANK044)
-DEF_ICON(ICON_BLANK045)
-DEF_ICON(ICON_BLANK046)
-DEF_ICON(ICON_BLANK047)
-DEF_ICON(ICON_BLANK048)
-DEF_ICON(ICON_BLANK049)
-DEF_ICON(ICON_BLANK050)
-DEF_ICON(ICON_BLANK051)
-DEF_ICON(ICON_BLANK052)
-DEF_ICON(ICON_BLANK052b)
-
+DEF_ICON(LAMP)
+DEF_ICON(MATERIAL)
+DEF_ICON(TEXTURE)
+DEF_ICON(ANIM)
+DEF_ICON(WORLD)
+DEF_ICON(SCENE)
+DEF_ICON(EDIT)
+DEF_ICON(GAME)
+DEF_ICON(RADIO)
+DEF_ICON(SCRIPT)
+DEF_ICON(PARTICLES)
+DEF_ICON(PHYSICS)
+DEF_ICON(SPEAKER)
+DEF_ICON(TEXTURE_SHADED) //ICON_BLANK041
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK042)
+ DEF_ICON(BLANK043)
+ DEF_ICON(BLANK044)
+ DEF_ICON(BLANK045)
+ DEF_ICON(BLANK046)
+ DEF_ICON(BLANK047)
+ DEF_ICON(BLANK048)
+ DEF_ICON(BLANK049)
+ DEF_ICON(BLANK050)
+ DEF_ICON(BLANK051)
+ DEF_ICON(BLANK052)
+ DEF_ICON(BLANK052b)
+#endif
/* EDITORS */
-DEF_ICON(ICON_VIEW3D)
-DEF_ICON(ICON_IPO)
-DEF_ICON(ICON_OOPS)
-DEF_ICON(ICON_BUTS)
-DEF_ICON(ICON_FILESEL)
-DEF_ICON(ICON_IMAGE_COL)
-DEF_ICON(ICON_INFO)
-DEF_ICON(ICON_SEQUENCE)
-DEF_ICON(ICON_TEXT)
-DEF_ICON(ICON_IMASEL)
-DEF_ICON(ICON_SOUND)
-DEF_ICON(ICON_ACTION)
-DEF_ICON(ICON_NLA)
-DEF_ICON(ICON_SCRIPTWIN)
-DEF_ICON(ICON_TIME)
-DEF_ICON(ICON_NODETREE)
-DEF_ICON(ICON_LOGIC)
-DEF_ICON(ICON_CONSOLE)
-DEF_ICON(ICON_PREFERENCES)
-DEF_ICON(ICON_ASSET_MANAGER)
-DEF_ICON(ICON_BLANK057)
-DEF_ICON(ICON_BLANK058)
-DEF_ICON(ICON_BLANK059)
-DEF_ICON(ICON_BLANK060)
-DEF_ICON(ICON_BLANK061)
-DEF_ICON(ICON_BLANK061b)
-
+DEF_ICON(VIEW3D)
+DEF_ICON(IPO)
+DEF_ICON(OOPS)
+DEF_ICON(BUTS)
+DEF_ICON(FILESEL)
+DEF_ICON(IMAGE_COL)
+DEF_ICON(INFO)
+DEF_ICON(SEQUENCE)
+DEF_ICON(TEXT)
+DEF_ICON(IMASEL)
+DEF_ICON(SOUND)
+DEF_ICON(ACTION)
+DEF_ICON(NLA)
+DEF_ICON(SCRIPTWIN)
+DEF_ICON(TIME)
+DEF_ICON(NODETREE)
+DEF_ICON(LOGIC)
+DEF_ICON(CONSOLE)
+DEF_ICON(PREFERENCES)
+DEF_ICON(ASSET_MANAGER)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK057)
+ DEF_ICON(BLANK058)
+ DEF_ICON(BLANK059)
+ DEF_ICON(BLANK060)
+ DEF_ICON(BLANK061)
+ DEF_ICON(BLANK061b)
+#endif
+
/* MODES */
-DEF_ICON(ICON_OBJECT_DATAMODE) // XXX fix this up
-DEF_ICON(ICON_EDITMODE_HLT)
-DEF_ICON(ICON_FACESEL_HLT)
-DEF_ICON(ICON_VPAINT_HLT)
-DEF_ICON(ICON_TPAINT_HLT)
-DEF_ICON(ICON_WPAINT_HLT)
-DEF_ICON(ICON_SCULPTMODE_HLT)
-DEF_ICON(ICON_POSE_HLT)
-DEF_ICON(ICON_PARTICLEMODE)
-DEF_ICON(ICON_LIGHTPAINT)
-DEF_ICON(ICON_BLANK063)
-DEF_ICON(ICON_BLANK064)
-DEF_ICON(ICON_BLANK065)
-DEF_ICON(ICON_BLANK066)
-DEF_ICON(ICON_BLANK067)
-DEF_ICON(ICON_BLANK068)
-DEF_ICON(ICON_BLANK069)
-DEF_ICON(ICON_BLANK070)
-DEF_ICON(ICON_BLANK071)
-DEF_ICON(ICON_BLANK072)
-DEF_ICON(ICON_BLANK073)
-DEF_ICON(ICON_BLANK074)
-DEF_ICON(ICON_BLANK075)
-DEF_ICON(ICON_BLANK076)
-DEF_ICON(ICON_BLANK077)
-DEF_ICON(ICON_BLANK077b)
+DEF_ICON(OBJECT_DATAMODE) // XXX fix this up
+DEF_ICON(EDITMODE_HLT)
+DEF_ICON(FACESEL_HLT)
+DEF_ICON(VPAINT_HLT)
+DEF_ICON(TPAINT_HLT)
+DEF_ICON(WPAINT_HLT)
+DEF_ICON(SCULPTMODE_HLT)
+DEF_ICON(POSE_HLT)
+DEF_ICON(PARTICLEMODE)
+DEF_ICON(LIGHTPAINT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK063)
+ DEF_ICON(BLANK064)
+ DEF_ICON(BLANK065)
+ DEF_ICON(BLANK066)
+ DEF_ICON(BLANK067)
+ DEF_ICON(BLANK068)
+ DEF_ICON(BLANK069)
+ DEF_ICON(BLANK070)
+ DEF_ICON(BLANK071)
+ DEF_ICON(BLANK072)
+ DEF_ICON(BLANK073)
+ DEF_ICON(BLANK074)
+ DEF_ICON(BLANK075)
+ DEF_ICON(BLANK076)
+ DEF_ICON(BLANK077)
+ DEF_ICON(BLANK077b)
+#endif
/* DATA */
-DEF_ICON(ICON_SCENE_DATA)
-DEF_ICON(ICON_RENDERLAYERS)
-DEF_ICON(ICON_WORLD_DATA)
-DEF_ICON(ICON_OBJECT_DATA)
-DEF_ICON(ICON_MESH_DATA)
-DEF_ICON(ICON_CURVE_DATA)
-DEF_ICON(ICON_META_DATA)
-DEF_ICON(ICON_LATTICE_DATA)
-DEF_ICON(ICON_LAMP_DATA)
-DEF_ICON(ICON_MATERIAL_DATA)
-DEF_ICON(ICON_TEXTURE_DATA)
-DEF_ICON(ICON_ANIM_DATA)
-DEF_ICON(ICON_CAMERA_DATA)
-DEF_ICON(ICON_PARTICLE_DATA)
-DEF_ICON(ICON_LIBRARY_DATA_DIRECT)
-DEF_ICON(ICON_GROUP)
-DEF_ICON(ICON_ARMATURE_DATA)
-DEF_ICON(ICON_POSE_DATA)
-DEF_ICON(ICON_BONE_DATA)
-DEF_ICON(ICON_CONSTRAINT)
-DEF_ICON(ICON_SHAPEKEY_DATA)
-DEF_ICON(ICON_CONSTRAINT_BONE)
-DEF_ICON(ICON_BLANK079)
-DEF_ICON(ICON_PACKAGE)
-DEF_ICON(ICON_UGLYPACKAGE)
-DEF_ICON(ICON_BLANK079b)
+DEF_ICON(SCENE_DATA)
+DEF_ICON(RENDERLAYERS)
+DEF_ICON(WORLD_DATA)
+DEF_ICON(OBJECT_DATA)
+DEF_ICON(MESH_DATA)
+DEF_ICON(CURVE_DATA)
+DEF_ICON(META_DATA)
+DEF_ICON(LATTICE_DATA)
+DEF_ICON(LAMP_DATA)
+DEF_ICON(MATERIAL_DATA)
+DEF_ICON(TEXTURE_DATA)
+DEF_ICON(ANIM_DATA)
+DEF_ICON(CAMERA_DATA)
+DEF_ICON(PARTICLE_DATA)
+DEF_ICON(LIBRARY_DATA_DIRECT)
+DEF_ICON(GROUP)
+DEF_ICON(ARMATURE_DATA)
+DEF_ICON(POSE_DATA)
+DEF_ICON(BONE_DATA)
+DEF_ICON(CONSTRAINT)
+DEF_ICON(SHAPEKEY_DATA)
+DEF_ICON(CONSTRAINT_BONE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK079)
+#endif
+DEF_ICON(PACKAGE)
+DEF_ICON(UGLYPACKAGE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK079b)
+#endif
/* DATA */
-DEF_ICON(ICON_BRUSH_DATA)
-DEF_ICON(ICON_IMAGE_DATA)
-DEF_ICON(ICON_FILE)
-DEF_ICON(ICON_FCURVE)
-DEF_ICON(ICON_FONT_DATA)
-DEF_ICON(ICON_RENDER_RESULT)
-DEF_ICON(ICON_SURFACE_DATA)
-DEF_ICON(ICON_EMPTY_DATA)
-DEF_ICON(ICON_SETTINGS)
-DEF_ICON(ICON_RENDER_ANIMATION)
-DEF_ICON(ICON_RENDER_STILL)
-DEF_ICON(ICON_BLANK080F)
-DEF_ICON(ICON_BOIDS)
-DEF_ICON(ICON_STRANDS)
-DEF_ICON(ICON_LIBRARY_DATA_INDIRECT)
-DEF_ICON(ICON_GREASEPENCIL)
-DEF_ICON(ICON_BLANK083)
-DEF_ICON(ICON_BLANK084)
-DEF_ICON(ICON_GROUP_BONE)
-DEF_ICON(ICON_GROUP_VERTEX)
-DEF_ICON(ICON_GROUP_VCOL)
-DEF_ICON(ICON_GROUP_UVS)
-DEF_ICON(ICON_BLANK089)
-DEF_ICON(ICON_BLANK090)
-DEF_ICON(ICON_RNA)
-DEF_ICON(ICON_RNA_ADD)
+DEF_ICON(BRUSH_DATA)
+DEF_ICON(IMAGE_DATA)
+DEF_ICON(FILE)
+DEF_ICON(FCURVE)
+DEF_ICON(FONT_DATA)
+DEF_ICON(RENDER_RESULT)
+DEF_ICON(SURFACE_DATA)
+DEF_ICON(EMPTY_DATA)
+DEF_ICON(SETTINGS)
+DEF_ICON(RENDER_ANIMATION)
+DEF_ICON(RENDER_STILL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK080F)
+#endif
+DEF_ICON(BOIDS)
+DEF_ICON(STRANDS)
+DEF_ICON(LIBRARY_DATA_INDIRECT)
+DEF_ICON(GREASEPENCIL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK083)
+ DEF_ICON(BLANK084)
+#endif
+DEF_ICON(GROUP_BONE)
+DEF_ICON(GROUP_VERTEX)
+DEF_ICON(GROUP_VCOL)
+DEF_ICON(GROUP_UVS)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK089)
+ DEF_ICON(BLANK090)
+#endif
+DEF_ICON(RNA)
+DEF_ICON(RNA_ADD)
/* available */
-DEF_ICON(ICON_BLANK092)
-DEF_ICON(ICON_BLANK093)
-DEF_ICON(ICON_BLANK094)
-DEF_ICON(ICON_BLANK095)
-DEF_ICON(ICON_BLANK096)
-DEF_ICON(ICON_BLANK097)
-DEF_ICON(ICON_BLANK098)
-DEF_ICON(ICON_BLANK099)
-DEF_ICON(ICON_BLANK100)
-DEF_ICON(ICON_BLANK101)
-DEF_ICON(ICON_BLANK102)
-DEF_ICON(ICON_BLANK103)
-DEF_ICON(ICON_BLANK104)
-DEF_ICON(ICON_BLANK105)
-DEF_ICON(ICON_BLANK106)
-DEF_ICON(ICON_BLANK107)
-DEF_ICON(ICON_BLANK108)
-DEF_ICON(ICON_BLANK109)
-DEF_ICON(ICON_BLANK110)
-DEF_ICON(ICON_BLANK111)
-DEF_ICON(ICON_BLANK112)
-DEF_ICON(ICON_BLANK113)
-DEF_ICON(ICON_BLANK114)
-DEF_ICON(ICON_BLANK115)
-DEF_ICON(ICON_BLANK116)
-DEF_ICON(ICON_BLANK116b)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK092)
+ DEF_ICON(BLANK093)
+ DEF_ICON(BLANK094)
+ DEF_ICON(BLANK095)
+ DEF_ICON(BLANK096)
+ DEF_ICON(BLANK097)
+ DEF_ICON(BLANK098)
+ DEF_ICON(BLANK099)
+ DEF_ICON(BLANK100)
+ DEF_ICON(BLANK101)
+ DEF_ICON(BLANK102)
+ DEF_ICON(BLANK103)
+ DEF_ICON(BLANK104)
+ DEF_ICON(BLANK105)
+ DEF_ICON(BLANK106)
+ DEF_ICON(BLANK107)
+ DEF_ICON(BLANK108)
+ DEF_ICON(BLANK109)
+ DEF_ICON(BLANK110)
+ DEF_ICON(BLANK111)
+ DEF_ICON(BLANK112)
+ DEF_ICON(BLANK113)
+ DEF_ICON(BLANK114)
+ DEF_ICON(BLANK115)
+ DEF_ICON(BLANK116)
+ DEF_ICON(BLANK116b)
+#endif
/* OUTLINER */
-DEF_ICON(ICON_OUTLINER_OB_EMPTY)
-DEF_ICON(ICON_OUTLINER_OB_MESH)
-DEF_ICON(ICON_OUTLINER_OB_CURVE)
-DEF_ICON(ICON_OUTLINER_OB_LATTICE)
-DEF_ICON(ICON_OUTLINER_OB_META)
-DEF_ICON(ICON_OUTLINER_OB_LAMP)
-DEF_ICON(ICON_OUTLINER_OB_CAMERA)
-DEF_ICON(ICON_OUTLINER_OB_ARMATURE)
-DEF_ICON(ICON_OUTLINER_OB_FONT)
-DEF_ICON(ICON_OUTLINER_OB_SURFACE)
-DEF_ICON(ICON_BLANK119)
-DEF_ICON(ICON_BLANK120)
-DEF_ICON(ICON_BLANK121)
-DEF_ICON(ICON_BLANK122)
-DEF_ICON(ICON_BLANK123)
-DEF_ICON(ICON_BLANK124)
-DEF_ICON(ICON_BLANK125)
-DEF_ICON(ICON_BLANK126)
-DEF_ICON(ICON_BLANK127)
-DEF_ICON(ICON_RESTRICT_VIEW_OFF)
-DEF_ICON(ICON_RESTRICT_VIEW_ON)
-DEF_ICON(ICON_RESTRICT_SELECT_OFF)
-DEF_ICON(ICON_RESTRICT_SELECT_ON)
-DEF_ICON(ICON_RESTRICT_RENDER_OFF)
-DEF_ICON(ICON_RESTRICT_RENDER_ON)
-DEF_ICON(ICON_BLANK127b)
+DEF_ICON(OUTLINER_OB_EMPTY)
+DEF_ICON(OUTLINER_OB_MESH)
+DEF_ICON(OUTLINER_OB_CURVE)
+DEF_ICON(OUTLINER_OB_LATTICE)
+DEF_ICON(OUTLINER_OB_META)
+DEF_ICON(OUTLINER_OB_LAMP)
+DEF_ICON(OUTLINER_OB_CAMERA)
+DEF_ICON(OUTLINER_OB_ARMATURE)
+DEF_ICON(OUTLINER_OB_FONT)
+DEF_ICON(OUTLINER_OB_SURFACE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK119)
+ DEF_ICON(BLANK120)
+ DEF_ICON(BLANK121)
+ DEF_ICON(BLANK122)
+ DEF_ICON(BLANK123)
+ DEF_ICON(BLANK124)
+ DEF_ICON(BLANK125)
+ DEF_ICON(BLANK126)
+ DEF_ICON(BLANK127)
+#endif
+DEF_ICON(RESTRICT_VIEW_OFF)
+DEF_ICON(RESTRICT_VIEW_ON)
+DEF_ICON(RESTRICT_SELECT_OFF)
+DEF_ICON(RESTRICT_SELECT_ON)
+DEF_ICON(RESTRICT_RENDER_OFF)
+DEF_ICON(RESTRICT_RENDER_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK127b)
+#endif
/* OUTLINER */
-DEF_ICON(ICON_OUTLINER_DATA_EMPTY)
-DEF_ICON(ICON_OUTLINER_DATA_MESH)
-DEF_ICON(ICON_OUTLINER_DATA_CURVE)
-DEF_ICON(ICON_OUTLINER_DATA_LATTICE)
-DEF_ICON(ICON_OUTLINER_DATA_META)
-DEF_ICON(ICON_OUTLINER_DATA_LAMP)
-DEF_ICON(ICON_OUTLINER_DATA_CAMERA)
-DEF_ICON(ICON_OUTLINER_DATA_ARMATURE)
-DEF_ICON(ICON_OUTLINER_DATA_FONT)
-DEF_ICON(ICON_OUTLINER_DATA_SURFACE)
-DEF_ICON(ICON_OUTLINER_DATA_POSE)
-DEF_ICON(ICON_BLANK129)
-DEF_ICON(ICON_BLANK130)
-DEF_ICON(ICON_BLANK131)
-DEF_ICON(ICON_BLANK132)
-DEF_ICON(ICON_BLANK133)
-DEF_ICON(ICON_BLANK134)
-DEF_ICON(ICON_BLANK135)
-DEF_ICON(ICON_BLANK136)
-DEF_ICON(ICON_BLANK137)
-DEF_ICON(ICON_BLANK138)
-DEF_ICON(ICON_BLANK139)
-DEF_ICON(ICON_BLANK140)
-DEF_ICON(ICON_BLANK141)
-DEF_ICON(ICON_BLANK142)
-DEF_ICON(ICON_BLANK142b)
+DEF_ICON(OUTLINER_DATA_EMPTY)
+DEF_ICON(OUTLINER_DATA_MESH)
+DEF_ICON(OUTLINER_DATA_CURVE)
+DEF_ICON(OUTLINER_DATA_LATTICE)
+DEF_ICON(OUTLINER_DATA_META)
+DEF_ICON(OUTLINER_DATA_LAMP)
+DEF_ICON(OUTLINER_DATA_CAMERA)
+DEF_ICON(OUTLINER_DATA_ARMATURE)
+DEF_ICON(OUTLINER_DATA_FONT)
+DEF_ICON(OUTLINER_DATA_SURFACE)
+DEF_ICON(OUTLINER_DATA_POSE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK129)
+ DEF_ICON(BLANK130)
+ DEF_ICON(BLANK131)
+ DEF_ICON(BLANK132)
+ DEF_ICON(BLANK133)
+ DEF_ICON(BLANK134)
+ DEF_ICON(BLANK135)
+ DEF_ICON(BLANK136)
+ DEF_ICON(BLANK137)
+ DEF_ICON(BLANK138)
+ DEF_ICON(BLANK139)
+ DEF_ICON(BLANK140)
+ DEF_ICON(BLANK141)
+ DEF_ICON(BLANK142)
+ DEF_ICON(BLANK142b)
+#endif
/* PRIMITIVES */
-DEF_ICON(ICON_MESH_PLANE)
-DEF_ICON(ICON_MESH_CUBE)
-DEF_ICON(ICON_MESH_CIRCLE)
-DEF_ICON(ICON_MESH_UVSPHERE)
-DEF_ICON(ICON_MESH_ICOSPHERE)
-DEF_ICON(ICON_MESH_GRID)
-DEF_ICON(ICON_MESH_MONKEY)
-DEF_ICON(ICON_MESH_CYLINDER)
-DEF_ICON(ICON_MESH_TORUS)
-DEF_ICON(ICON_MESH_CONE)
-DEF_ICON(ICON_BLANK610)
-DEF_ICON(ICON_BLANK611)
-DEF_ICON(ICON_LAMP_POINT)
-DEF_ICON(ICON_LAMP_SUN)
-DEF_ICON(ICON_LAMP_SPOT)
-DEF_ICON(ICON_LAMP_HEMI)
-DEF_ICON(ICON_LAMP_AREA)
-DEF_ICON(ICON_BLANK617)
-DEF_ICON(ICON_BLANK618)
-DEF_ICON(ICON_BLANK619)
-DEF_ICON(ICON_META_PLANE)
-DEF_ICON(ICON_META_CUBE)
-DEF_ICON(ICON_META_BALL)
-DEF_ICON(ICON_META_ELLIPSOID)
-DEF_ICON(ICON_META_CAPSULE)
-DEF_ICON(ICON_BLANK625)
+DEF_ICON(MESH_PLANE)
+DEF_ICON(MESH_CUBE)
+DEF_ICON(MESH_CIRCLE)
+DEF_ICON(MESH_UVSPHERE)
+DEF_ICON(MESH_ICOSPHERE)
+DEF_ICON(MESH_GRID)
+DEF_ICON(MESH_MONKEY)
+DEF_ICON(MESH_CYLINDER)
+DEF_ICON(MESH_TORUS)
+DEF_ICON(MESH_CONE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK610)
+ DEF_ICON(BLANK611)
+#endif
+DEF_ICON(LAMP_POINT)
+DEF_ICON(LAMP_SUN)
+DEF_ICON(LAMP_SPOT)
+DEF_ICON(LAMP_HEMI)
+DEF_ICON(LAMP_AREA)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK617)
+ DEF_ICON(BLANK618)
+ DEF_ICON(BLANK619)
+#endif
+DEF_ICON(META_PLANE)
+DEF_ICON(META_CUBE)
+DEF_ICON(META_BALL)
+DEF_ICON(META_ELLIPSOID)
+DEF_ICON(META_CAPSULE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK625)
+#endif
/* PRIMITIVES */
-DEF_ICON(ICON_SURFACE_NCURVE)
-DEF_ICON(ICON_SURFACE_NCIRCLE)
-DEF_ICON(ICON_SURFACE_NSURFACE)
-DEF_ICON(ICON_SURFACE_NCYLINDER)
-DEF_ICON(ICON_SURFACE_NSPHERE)
-DEF_ICON(ICON_SURFACE_NTORUS)
-DEF_ICON(ICON_BLANK636)
-DEF_ICON(ICON_BLANK637)
-DEF_ICON(ICON_BLANK638)
-DEF_ICON(ICON_CURVE_BEZCURVE)
-DEF_ICON(ICON_CURVE_BEZCIRCLE)
-DEF_ICON(ICON_CURVE_NCURVE)
-DEF_ICON(ICON_CURVE_NCIRCLE)
-DEF_ICON(ICON_CURVE_PATH)
-DEF_ICON(ICON_BLANK644)
-DEF_ICON(ICON_BLANK645)
-DEF_ICON(ICON_BLANK646)
-DEF_ICON(ICON_BLANK647)
-DEF_ICON(ICON_BLANK648)
-DEF_ICON(ICON_BLANK649)
-DEF_ICON(ICON_BLANK650)
-DEF_ICON(ICON_BLANK651)
-DEF_ICON(ICON_BLANK652)
-DEF_ICON(ICON_BLANK653)
-DEF_ICON(ICON_BLANK654)
-DEF_ICON(ICON_BLANK655)
+DEF_ICON(SURFACE_NCURVE)
+DEF_ICON(SURFACE_NCIRCLE)
+DEF_ICON(SURFACE_NSURFACE)
+DEF_ICON(SURFACE_NCYLINDER)
+DEF_ICON(SURFACE_NSPHERE)
+DEF_ICON(SURFACE_NTORUS)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK636)
+ DEF_ICON(BLANK637)
+ DEF_ICON(BLANK638)
+#endif
+DEF_ICON(CURVE_BEZCURVE)
+DEF_ICON(CURVE_BEZCIRCLE)
+DEF_ICON(CURVE_NCURVE)
+DEF_ICON(CURVE_NCIRCLE)
+DEF_ICON(CURVE_PATH)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK644)
+ DEF_ICON(BLANK645)
+ DEF_ICON(BLANK646)
+ DEF_ICON(BLANK647)
+ DEF_ICON(BLANK648)
+ DEF_ICON(BLANK649)
+ DEF_ICON(BLANK650)
+ DEF_ICON(BLANK651)
+ DEF_ICON(BLANK652)
+ DEF_ICON(BLANK653)
+ DEF_ICON(BLANK654)
+ DEF_ICON(BLANK655)
+#endif
/* EMPTY */
-DEF_ICON(ICON_FORCE_FORCE)
-DEF_ICON(ICON_FORCE_WIND)
-DEF_ICON(ICON_FORCE_VORTEX)
-DEF_ICON(ICON_FORCE_MAGNETIC)
-DEF_ICON(ICON_FORCE_HARMONIC)
-DEF_ICON(ICON_FORCE_CHARGE)
-DEF_ICON(ICON_FORCE_LENNARDJONES)
-DEF_ICON(ICON_FORCE_TEXTURE)
-DEF_ICON(ICON_FORCE_CURVE)
-DEF_ICON(ICON_FORCE_BOID)
-DEF_ICON(ICON_FORCE_TURBULENCE)
-DEF_ICON(ICON_FORCE_DRAG)
-DEF_ICON(ICON_BLANK672)
-DEF_ICON(ICON_BLANK673)
-DEF_ICON(ICON_BLANK674)
-DEF_ICON(ICON_BLANK675)
-DEF_ICON(ICON_BLANK676)
-DEF_ICON(ICON_BLANK677)
-DEF_ICON(ICON_BLANK678)
-DEF_ICON(ICON_BLANK679)
-DEF_ICON(ICON_BLANK680)
-DEF_ICON(ICON_BLANK681)
-DEF_ICON(ICON_BLANK682)
-DEF_ICON(ICON_BLANK683)
-DEF_ICON(ICON_BLANK684)
-DEF_ICON(ICON_BLANK685)
+DEF_ICON(FORCE_FORCE)
+DEF_ICON(FORCE_WIND)
+DEF_ICON(FORCE_VORTEX)
+DEF_ICON(FORCE_MAGNETIC)
+DEF_ICON(FORCE_HARMONIC)
+DEF_ICON(FORCE_CHARGE)
+DEF_ICON(FORCE_LENNARDJONES)
+DEF_ICON(FORCE_TEXTURE)
+DEF_ICON(FORCE_CURVE)
+DEF_ICON(FORCE_BOID)
+DEF_ICON(FORCE_TURBULENCE)
+DEF_ICON(FORCE_DRAG)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK672)
+ DEF_ICON(BLANK673)
+ DEF_ICON(BLANK674)
+ DEF_ICON(BLANK675)
+ DEF_ICON(BLANK676)
+ DEF_ICON(BLANK677)
+ DEF_ICON(BLANK678)
+ DEF_ICON(BLANK679)
+ DEF_ICON(BLANK680)
+ DEF_ICON(BLANK681)
+ DEF_ICON(BLANK682)
+ DEF_ICON(BLANK683)
+ DEF_ICON(BLANK684)
+ DEF_ICON(BLANK685)
/* EMPTY */
-DEF_ICON(ICON_BLANK690)
-DEF_ICON(ICON_BLANK691)
-DEF_ICON(ICON_BLANK692)
-DEF_ICON(ICON_BLANK693)
-DEF_ICON(ICON_BLANK694)
-DEF_ICON(ICON_BLANK695)
-DEF_ICON(ICON_BLANK696)
-DEF_ICON(ICON_BLANK697)
-DEF_ICON(ICON_BLANK698)
-DEF_ICON(ICON_BLANK699)
-DEF_ICON(ICON_BLANK700)
-DEF_ICON(ICON_BLANK701)
-DEF_ICON(ICON_BLANK702)
-DEF_ICON(ICON_BLANK703)
-DEF_ICON(ICON_BLANK704)
-DEF_ICON(ICON_BLANK705)
-DEF_ICON(ICON_BLANK706)
-DEF_ICON(ICON_BLANK707)
-DEF_ICON(ICON_BLANK708)
-DEF_ICON(ICON_BLANK709)
-DEF_ICON(ICON_BLANK710)
-DEF_ICON(ICON_BLANK711)
-DEF_ICON(ICON_BLANK712)
-DEF_ICON(ICON_BLANK713)
-DEF_ICON(ICON_BLANK714)
-DEF_ICON(ICON_BLANK715)
+ DEF_ICON(BLANK690)
+ DEF_ICON(BLANK691)
+ DEF_ICON(BLANK692)
+ DEF_ICON(BLANK693)
+ DEF_ICON(BLANK694)
+ DEF_ICON(BLANK695)
+ DEF_ICON(BLANK696)
+ DEF_ICON(BLANK697)
+ DEF_ICON(BLANK698)
+ DEF_ICON(BLANK699)
+ DEF_ICON(BLANK700)
+ DEF_ICON(BLANK701)
+ DEF_ICON(BLANK702)
+ DEF_ICON(BLANK703)
+ DEF_ICON(BLANK704)
+ DEF_ICON(BLANK705)
+ DEF_ICON(BLANK706)
+ DEF_ICON(BLANK707)
+ DEF_ICON(BLANK708)
+ DEF_ICON(BLANK709)
+ DEF_ICON(BLANK710)
+ DEF_ICON(BLANK711)
+ DEF_ICON(BLANK712)
+ DEF_ICON(BLANK713)
+ DEF_ICON(BLANK714)
+ DEF_ICON(BLANK715)
/* EMPTY */
-DEF_ICON(ICON_BLANK720)
-DEF_ICON(ICON_BLANK721)
-DEF_ICON(ICON_BLANK722)
-DEF_ICON(ICON_BLANK733)
-DEF_ICON(ICON_BLANK734)
-DEF_ICON(ICON_BLANK735)
-DEF_ICON(ICON_BLANK736)
-DEF_ICON(ICON_BLANK737)
-DEF_ICON(ICON_BLANK738)
-DEF_ICON(ICON_BLANK739)
-DEF_ICON(ICON_BLANK740)
-DEF_ICON(ICON_BLANK741)
-DEF_ICON(ICON_BLANK742)
-DEF_ICON(ICON_BLANK743)
-DEF_ICON(ICON_BLANK744)
-DEF_ICON(ICON_BLANK745)
-DEF_ICON(ICON_BLANK746)
-DEF_ICON(ICON_BLANK747)
-DEF_ICON(ICON_BLANK748)
-DEF_ICON(ICON_BLANK749)
-DEF_ICON(ICON_BLANK750)
-DEF_ICON(ICON_BLANK751)
-DEF_ICON(ICON_BLANK752)
-DEF_ICON(ICON_BLANK753)
-DEF_ICON(ICON_BLANK754)
-DEF_ICON(ICON_BLANK755)
+ DEF_ICON(BLANK720)
+ DEF_ICON(BLANK721)
+ DEF_ICON(BLANK722)
+ DEF_ICON(BLANK733)
+ DEF_ICON(BLANK734)
+ DEF_ICON(BLANK735)
+ DEF_ICON(BLANK736)
+ DEF_ICON(BLANK737)
+ DEF_ICON(BLANK738)
+ DEF_ICON(BLANK739)
+ DEF_ICON(BLANK740)
+ DEF_ICON(BLANK741)
+ DEF_ICON(BLANK742)
+ DEF_ICON(BLANK743)
+ DEF_ICON(BLANK744)
+ DEF_ICON(BLANK745)
+ DEF_ICON(BLANK746)
+ DEF_ICON(BLANK747)
+ DEF_ICON(BLANK748)
+ DEF_ICON(BLANK749)
+ DEF_ICON(BLANK750)
+ DEF_ICON(BLANK751)
+ DEF_ICON(BLANK752)
+ DEF_ICON(BLANK753)
+ DEF_ICON(BLANK754)
+ DEF_ICON(BLANK755)
/* EMPTY */
-DEF_ICON(ICON_BLANK760)
-DEF_ICON(ICON_BLANK761)
-DEF_ICON(ICON_BLANK762)
-DEF_ICON(ICON_BLANK763)
-DEF_ICON(ICON_BLANK764)
-DEF_ICON(ICON_BLANK765)
-DEF_ICON(ICON_BLANK766)
-DEF_ICON(ICON_BLANK767)
-DEF_ICON(ICON_BLANK768)
-DEF_ICON(ICON_BLANK769)
-DEF_ICON(ICON_BLANK770)
-DEF_ICON(ICON_BLANK771)
-DEF_ICON(ICON_BLANK772)
-DEF_ICON(ICON_BLANK773)
-DEF_ICON(ICON_BLANK774)
-DEF_ICON(ICON_BLANK775)
-DEF_ICON(ICON_BLANK776)
-DEF_ICON(ICON_BLANK777)
-DEF_ICON(ICON_BLANK778)
-DEF_ICON(ICON_BLANK779)
-DEF_ICON(ICON_BLANK780)
-DEF_ICON(ICON_BLANK781)
-DEF_ICON(ICON_BLANK782)
-DEF_ICON(ICON_BLANK783)
-DEF_ICON(ICON_BLANK784)
-DEF_ICON(ICON_BLANK785)
+ DEF_ICON(BLANK760)
+ DEF_ICON(BLANK761)
+ DEF_ICON(BLANK762)
+ DEF_ICON(BLANK763)
+ DEF_ICON(BLANK764)
+ DEF_ICON(BLANK765)
+ DEF_ICON(BLANK766)
+ DEF_ICON(BLANK767)
+ DEF_ICON(BLANK768)
+ DEF_ICON(BLANK769)
+ DEF_ICON(BLANK770)
+ DEF_ICON(BLANK771)
+ DEF_ICON(BLANK772)
+ DEF_ICON(BLANK773)
+ DEF_ICON(BLANK774)
+ DEF_ICON(BLANK775)
+ DEF_ICON(BLANK776)
+ DEF_ICON(BLANK777)
+ DEF_ICON(BLANK778)
+ DEF_ICON(BLANK779)
+ DEF_ICON(BLANK780)
+ DEF_ICON(BLANK781)
+ DEF_ICON(BLANK782)
+ DEF_ICON(BLANK783)
+ DEF_ICON(BLANK784)
+ DEF_ICON(BLANK785)
+#endif
/* MODIFIERS */
-DEF_ICON(ICON_MODIFIER)
-DEF_ICON(ICON_MOD_WAVE)
-DEF_ICON(ICON_MOD_BUILD)
-DEF_ICON(ICON_MOD_DECIM)
-DEF_ICON(ICON_MOD_MIRROR)
-DEF_ICON(ICON_MOD_SOFT)
-DEF_ICON(ICON_MOD_SUBSURF)
-DEF_ICON(ICON_HOOK)
-DEF_ICON(ICON_MOD_PHYSICS)
-DEF_ICON(ICON_MOD_PARTICLES)
-DEF_ICON(ICON_MOD_BOOLEAN)
-DEF_ICON(ICON_MOD_EDGESPLIT)
-DEF_ICON(ICON_MOD_ARRAY)
-DEF_ICON(ICON_MOD_UVPROJECT)
-DEF_ICON(ICON_MOD_DISPLACE)
-DEF_ICON(ICON_MOD_CURVE)
-DEF_ICON(ICON_MOD_LATTICE)
-DEF_ICON(ICON_CONSTRAINT_DATA)
-DEF_ICON(ICON_MOD_ARMATURE)
-DEF_ICON(ICON_MOD_SHRINKWRAP)
-DEF_ICON(ICON_MOD_CAST)
-DEF_ICON(ICON_MOD_MESHDEFORM)
-DEF_ICON(ICON_MOD_BEVEL)
-DEF_ICON(ICON_MOD_SMOOTH)
-DEF_ICON(ICON_MOD_SIMPLEDEFORM)
-DEF_ICON(ICON_MOD_MASK)
+DEF_ICON(MODIFIER)
+DEF_ICON(MOD_WAVE)
+DEF_ICON(MOD_BUILD)
+DEF_ICON(MOD_DECIM)
+DEF_ICON(MOD_MIRROR)
+DEF_ICON(MOD_SOFT)
+DEF_ICON(MOD_SUBSURF)
+DEF_ICON(HOOK)
+DEF_ICON(MOD_PHYSICS)
+DEF_ICON(MOD_PARTICLES)
+DEF_ICON(MOD_BOOLEAN)
+DEF_ICON(MOD_EDGESPLIT)
+DEF_ICON(MOD_ARRAY)
+DEF_ICON(MOD_UVPROJECT)
+DEF_ICON(MOD_DISPLACE)
+DEF_ICON(MOD_CURVE)
+DEF_ICON(MOD_LATTICE)
+DEF_ICON(CONSTRAINT_DATA)
+DEF_ICON(MOD_ARMATURE)
+DEF_ICON(MOD_SHRINKWRAP)
+DEF_ICON(MOD_CAST)
+DEF_ICON(MOD_MESHDEFORM)
+DEF_ICON(MOD_BEVEL)
+DEF_ICON(MOD_SMOOTH)
+DEF_ICON(MOD_SIMPLEDEFORM)
+DEF_ICON(MOD_MASK)
/* MODIFIERS */
-DEF_ICON(ICON_MOD_CLOTH)
-DEF_ICON(ICON_MOD_EXPLODE)
-DEF_ICON(ICON_MOD_FLUIDSIM)
-DEF_ICON(ICON_MOD_MULTIRES)
-DEF_ICON(ICON_MOD_SMOKE)
-DEF_ICON(ICON_MOD_SOLIDIFY)
-DEF_ICON(ICON_MOD_SCREW)
-DEF_ICON(ICON_BLANK160)
-DEF_ICON(ICON_BLANK161)
-DEF_ICON(ICON_BLANK162)
-DEF_ICON(ICON_BLANK163)
-DEF_ICON(ICON_BLANK164)
-DEF_ICON(ICON_BLANK165)
-DEF_ICON(ICON_BLANK166)
-DEF_ICON(ICON_BLANK167)
-DEF_ICON(ICON_BLANK168)
-DEF_ICON(ICON_BLANK169)
-DEF_ICON(ICON_BLANK170)
-DEF_ICON(ICON_BLANK171)
-DEF_ICON(ICON_BLANK172)
-DEF_ICON(ICON_BLANK173)
-DEF_ICON(ICON_BLANK174)
-DEF_ICON(ICON_BLANK175)
-DEF_ICON(ICON_BLANK176)
-DEF_ICON(ICON_BLANK177)
-DEF_ICON(ICON_BLANK177b)
+DEF_ICON(MOD_CLOTH)
+DEF_ICON(MOD_EXPLODE)
+DEF_ICON(MOD_FLUIDSIM)
+DEF_ICON(MOD_MULTIRES)
+DEF_ICON(MOD_SMOKE)
+DEF_ICON(MOD_SOLIDIFY)
+DEF_ICON(MOD_SCREW)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK160)
+ DEF_ICON(BLANK161)
+ DEF_ICON(BLANK162)
+ DEF_ICON(BLANK163)
+ DEF_ICON(BLANK164)
+ DEF_ICON(BLANK165)
+ DEF_ICON(BLANK166)
+ DEF_ICON(BLANK167)
+ DEF_ICON(BLANK168)
+ DEF_ICON(BLANK169)
+ DEF_ICON(BLANK170)
+ DEF_ICON(BLANK171)
+ DEF_ICON(BLANK172)
+ DEF_ICON(BLANK173)
+ DEF_ICON(BLANK174)
+ DEF_ICON(BLANK175)
+ DEF_ICON(BLANK176)
+ DEF_ICON(BLANK177)
+ DEF_ICON(BLANK177b)
+#endif
/* ANIMATION */
-DEF_ICON(ICON_REC)
-DEF_ICON(ICON_PLAY)
-DEF_ICON(ICON_FF)
-DEF_ICON(ICON_REW)
-DEF_ICON(ICON_PAUSE)
-DEF_ICON(ICON_PREV_KEYFRAME)
-DEF_ICON(ICON_NEXT_KEYFRAME)
-DEF_ICON(ICON_PLAY_AUDIO)
-DEF_ICON(ICON_PLAY_REVERSE)
-DEF_ICON(ICON_PREVIEW_RANGE)
-DEF_ICON(ICON_BLANK180)
-DEF_ICON(ICON_PMARKER_ACT)
-DEF_ICON(ICON_PMARKER_SEL)
-DEF_ICON(ICON_PMARKER)
-DEF_ICON(ICON_MARKER_HLT)
-DEF_ICON(ICON_MARKER)
-DEF_ICON(ICON_SPACE2) // XXX
-DEF_ICON(ICON_SPACE3) // XXX
-DEF_ICON(ICON_BLANK181)
-DEF_ICON(ICON_KEY_DEHLT)
-DEF_ICON(ICON_KEY_HLT)
-DEF_ICON(ICON_MUTE_IPO_OFF)
-DEF_ICON(ICON_MUTE_IPO_ON)
-DEF_ICON(ICON_BLANK182)
-DEF_ICON(ICON_BLANK183)
-DEF_ICON(ICON_BLANK183b)
+DEF_ICON(REC)
+DEF_ICON(PLAY)
+DEF_ICON(FF)
+DEF_ICON(REW)
+DEF_ICON(PAUSE)
+DEF_ICON(PREV_KEYFRAME)
+DEF_ICON(NEXT_KEYFRAME)
+DEF_ICON(PLAY_AUDIO)
+DEF_ICON(PLAY_REVERSE)
+DEF_ICON(PREVIEW_RANGE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK180)
+#endif
+DEF_ICON(PMARKER_ACT)
+DEF_ICON(PMARKER_SEL)
+DEF_ICON(PMARKER)
+DEF_ICON(MARKER_HLT)
+DEF_ICON(MARKER)
+DEF_ICON(SPACE2) // XXX
+DEF_ICON(SPACE3) // XXX
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK181)
+#endif
+DEF_ICON(KEY_DEHLT)
+DEF_ICON(KEY_HLT)
+DEF_ICON(MUTE_IPO_OFF)
+DEF_ICON(MUTE_IPO_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK182)
+ DEF_ICON(BLANK183)
+ DEF_ICON(BLANK183b)
/* available */
-DEF_ICON(ICON_BLANK184)
-DEF_ICON(ICON_BLANK185)
-DEF_ICON(ICON_BLANK186)
-DEF_ICON(ICON_BLANK187)
-DEF_ICON(ICON_BLANK188)
-DEF_ICON(ICON_BLANK189)
-DEF_ICON(ICON_BLANK190)
-DEF_ICON(ICON_BLANK191)
-DEF_ICON(ICON_BLANK192)
-DEF_ICON(ICON_BLANK193)
-DEF_ICON(ICON_BLANK194)
-DEF_ICON(ICON_BLANK195)
-DEF_ICON(ICON_BLANK196)
-DEF_ICON(ICON_BLANK197)
-DEF_ICON(ICON_BLANK198)
-DEF_ICON(ICON_BLANK199)
-DEF_ICON(ICON_BLANK200)
-DEF_ICON(ICON_BLANK201)
-DEF_ICON(ICON_BLANK202)
-DEF_ICON(ICON_BLANK203)
-DEF_ICON(ICON_BLANK204)
-DEF_ICON(ICON_BLANK205)
-DEF_ICON(ICON_BLANK206)
-DEF_ICON(ICON_BLANK207)
-DEF_ICON(ICON_BLANK208)
-DEF_ICON(ICON_BLANK208b)
+ DEF_ICON(BLANK184)
+ DEF_ICON(BLANK185)
+ DEF_ICON(BLANK186)
+ DEF_ICON(BLANK187)
+ DEF_ICON(BLANK188)
+ DEF_ICON(BLANK189)
+ DEF_ICON(BLANK190)
+ DEF_ICON(BLANK191)
+ DEF_ICON(BLANK192)
+ DEF_ICON(BLANK193)
+ DEF_ICON(BLANK194)
+ DEF_ICON(BLANK195)
+ DEF_ICON(BLANK196)
+ DEF_ICON(BLANK197)
+ DEF_ICON(BLANK198)
+ DEF_ICON(BLANK199)
+ DEF_ICON(BLANK200)
+ DEF_ICON(BLANK201)
+ DEF_ICON(BLANK202)
+ DEF_ICON(BLANK203)
+ DEF_ICON(BLANK204)
+ DEF_ICON(BLANK205)
+ DEF_ICON(BLANK206)
+ DEF_ICON(BLANK207)
+ DEF_ICON(BLANK208)
+ DEF_ICON(BLANK208b)
+#endif
/* EDITING */
-DEF_ICON(ICON_VERTEXSEL)
-DEF_ICON(ICON_EDGESEL)
-DEF_ICON(ICON_FACESEL)
-DEF_ICON(ICON_LINKEDSEL)
-DEF_ICON(ICON_BLANK210)
-DEF_ICON(ICON_ROTATE)
-DEF_ICON(ICON_CURSOR)
-DEF_ICON(ICON_ROTATECOLLECTION)
-DEF_ICON(ICON_ROTATECENTER)
-DEF_ICON(ICON_ROTACTIVE)
-DEF_ICON(ICON_ALIGN)
-DEF_ICON(ICON_BLANK211)
-DEF_ICON(ICON_SMOOTHCURVE)
-DEF_ICON(ICON_SPHERECURVE)
-DEF_ICON(ICON_ROOTCURVE)
-DEF_ICON(ICON_SHARPCURVE)
-DEF_ICON(ICON_LINCURVE)
-DEF_ICON(ICON_NOCURVE)
-DEF_ICON(ICON_RNDCURVE)
-DEF_ICON(ICON_PROP_OFF)
-DEF_ICON(ICON_PROP_ON)
-DEF_ICON(ICON_PROP_CON)
-DEF_ICON(ICON_BLANK212)
-DEF_ICON(ICON_PARTICLE_POINT)
-DEF_ICON(ICON_PARTICLE_TIP)
-DEF_ICON(ICON_PARTICLE_PATH)
+DEF_ICON(VERTEXSEL)
+DEF_ICON(EDGESEL)
+DEF_ICON(FACESEL)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK209)
+ DEF_ICON(BLANK210)
+#endif
+DEF_ICON(ROTATE)
+DEF_ICON(CURSOR)
+DEF_ICON(ROTATECOLLECTION)
+DEF_ICON(ROTATECENTER)
+DEF_ICON(ROTACTIVE)
+DEF_ICON(ALIGN)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK211)
+#endif
+DEF_ICON(SMOOTHCURVE)
+DEF_ICON(SPHERECURVE)
+DEF_ICON(ROOTCURVE)
+DEF_ICON(SHARPCURVE)
+DEF_ICON(LINCURVE)
+DEF_ICON(NOCURVE)
+DEF_ICON(RNDCURVE)
+DEF_ICON(PROP_OFF)
+DEF_ICON(PROP_ON)
+DEF_ICON(PROP_CON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK212)
+#endif
+DEF_ICON(PARTICLE_POINT)
+DEF_ICON(PARTICLE_TIP)
+DEF_ICON(PARTICLE_PATH)
/* EDITING */
-DEF_ICON(ICON_MAN_TRANS)
-DEF_ICON(ICON_MAN_ROT)
-DEF_ICON(ICON_MAN_SCALE)
-DEF_ICON(ICON_MANIPUL)
-DEF_ICON(ICON_SNAP_OFF)
-DEF_ICON(ICON_SNAP_ON)
-DEF_ICON(ICON_SNAP_NORMAL)
-DEF_ICON(ICON_SNAP_INCREMENT)
-DEF_ICON(ICON_SNAP_VERTEX)
-DEF_ICON(ICON_SNAP_EDGE)
-DEF_ICON(ICON_SNAP_FACE)
-DEF_ICON(ICON_SNAP_VOLUME)
-DEF_ICON(ICON_UVS_FACE)
-DEF_ICON(ICON_STICKY_UVS_LOC)
-DEF_ICON(ICON_STICKY_UVS_DISABLE)
-DEF_ICON(ICON_STICKY_UVS_VERT)
-DEF_ICON(ICON_CLIPUV_DEHLT)
-DEF_ICON(ICON_CLIPUV_HLT)
-DEF_ICON(ICON_SNAP_PEEL_OBJECT)
-DEF_ICON(ICON_GRID)
-DEF_ICON(ICON_GEARS)
-DEF_ICON(ICON_BLANK221)
-DEF_ICON(ICON_BLANK224)
-DEF_ICON(ICON_BLANK225)
-DEF_ICON(ICON_BLANK226)
-DEF_ICON(ICON_BLANK226b)
+DEF_ICON(MAN_TRANS)
+DEF_ICON(MAN_ROT)
+DEF_ICON(MAN_SCALE)
+DEF_ICON(MANIPUL)
+DEF_ICON(SNAP_OFF)
+DEF_ICON(SNAP_ON)
+DEF_ICON(SNAP_NORMAL)
+DEF_ICON(SNAP_INCREMENT)
+DEF_ICON(SNAP_VERTEX)
+DEF_ICON(SNAP_EDGE)
+DEF_ICON(SNAP_FACE)
+DEF_ICON(SNAP_VOLUME)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK220)
+#endif
+DEF_ICON(STICKY_UVS_LOC)
+DEF_ICON(STICKY_UVS_DISABLE)
+DEF_ICON(STICKY_UVS_VERT)
+DEF_ICON(CLIPUV_DEHLT)
+DEF_ICON(CLIPUV_HLT)
+DEF_ICON(SNAP_PEEL_OBJECT)
+DEF_ICON(GRID)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK221)
+ DEF_ICON(BLANK222)
+ DEF_ICON(BLANK224)
+ DEF_ICON(BLANK225)
+ DEF_ICON(BLANK226)
+ DEF_ICON(BLANK226b)
+#endif
/* EDITING */
-DEF_ICON(ICON_PASTEDOWN)
-DEF_ICON(ICON_COPYDOWN)
-DEF_ICON(ICON_PASTEFLIPUP)
-DEF_ICON(ICON_PASTEFLIPDOWN)
-DEF_ICON(ICON_BLANK227)
-DEF_ICON(ICON_BLANK228)
-DEF_ICON(ICON_BLANK229)
-DEF_ICON(ICON_BLANK230)
-DEF_ICON(ICON_SNAP_SURFACE)
-DEF_ICON(ICON_BLANK232)
-DEF_ICON(ICON_BLANK233)
-DEF_ICON(ICON_RETOPO)
-DEF_ICON(ICON_UV_VERTEXSEL)
-DEF_ICON(ICON_UV_EDGESEL)
-DEF_ICON(ICON_UV_FACESEL)
-DEF_ICON(ICON_UV_ISLANDSEL)
-DEF_ICON(ICON_UV_SYNC_SELECT)
-DEF_ICON(ICON_BLANK240)
-DEF_ICON(ICON_BLANK241)
-DEF_ICON(ICON_BLANK242)
-DEF_ICON(ICON_BLANK243)
-DEF_ICON(ICON_BLANK244)
-DEF_ICON(ICON_BLANK245)
-DEF_ICON(ICON_BLANK246)
-DEF_ICON(ICON_BLANK247)
-DEF_ICON(ICON_BLANK247b)
+DEF_ICON(PASTEDOWN)
+DEF_ICON(COPYDOWN)
+DEF_ICON(PASTEFLIPUP)
+DEF_ICON(PASTEFLIPDOWN)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK227)
+ DEF_ICON(BLANK228)
+ DEF_ICON(BLANK229)
+ DEF_ICON(BLANK230)
+#endif
+DEF_ICON(SNAP_SURFACE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK232)
+ DEF_ICON(BLANK233)
+#endif
+DEF_ICON(RETOPO)
+DEF_ICON(UV_VERTEXSEL)
+DEF_ICON(UV_EDGESEL)
+DEF_ICON(UV_FACESEL)
+DEF_ICON(UV_ISLANDSEL)
+DEF_ICON(UV_SYNC_SELECT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK240)
+ DEF_ICON(BLANK241)
+ DEF_ICON(BLANK242)
+ DEF_ICON(BLANK243)
+ DEF_ICON(BLANK244)
+ DEF_ICON(BLANK245)
+ DEF_ICON(BLANK246)
+ DEF_ICON(BLANK247)
+ DEF_ICON(BLANK247b)
+#endif
/* 3D VIEW */
-DEF_ICON(ICON_BBOX)
-DEF_ICON(ICON_WIRE)
-DEF_ICON(ICON_SOLID)
-DEF_ICON(ICON_SMOOTH)
-DEF_ICON(ICON_POTATO)
-DEF_ICON(ICON_BLANK248)
-DEF_ICON(ICON_ORTHO)
-DEF_ICON(ICON_ORTHO_OFF)
-DEF_ICON(ICON_CAMERA)
-DEF_ICON(ICON_LOCKVIEW_OFF)
-DEF_ICON(ICON_LOCKVIEW_ON)
-DEF_ICON(ICON_BLANK250)
-DEF_ICON(ICON_AXIS_SIDE)
-DEF_ICON(ICON_AXIS_FRONT)
-DEF_ICON(ICON_AXIS_TOP)
-DEF_ICON(ICON_NDOF_DOM)
-DEF_ICON(ICON_NDOF_TURN)
-DEF_ICON(ICON_NDOF_FLY)
-DEF_ICON(ICON_NDOF_TRANS)
-DEF_ICON(ICON_LAYER_USED)
-DEF_ICON(ICON_LAYER_ACTIVE)
-DEF_ICON(ICON_BLANK254)
-DEF_ICON(ICON_BLANK255)
-DEF_ICON(ICON_BLANK256)
-DEF_ICON(ICON_BLANK257)
-DEF_ICON(ICON_BLANK257b)
+DEF_ICON(BBOX)
+DEF_ICON(WIRE)
+DEF_ICON(SOLID)
+DEF_ICON(SMOOTH)
+DEF_ICON(POTATO)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK248)
+#endif
+DEF_ICON(ORTHO)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK249)
+ DEF_ICON(BLANK250)
+#endif
+DEF_ICON(LOCKVIEW_OFF)
+DEF_ICON(LOCKVIEW_ON)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK251)
+#endif
+DEF_ICON(AXIS_SIDE)
+DEF_ICON(AXIS_FRONT)
+DEF_ICON(AXIS_TOP)
+DEF_ICON(NDOF_DOM)
+DEF_ICON(NDOF_TURN)
+DEF_ICON(NDOF_FLY)
+DEF_ICON(NDOF_TRANS)
+DEF_ICON(LAYER_USED)
+DEF_ICON(LAYER_ACTIVE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK254)
+ DEF_ICON(BLANK255)
+ DEF_ICON(BLANK256)
+ DEF_ICON(BLANK257)
+ DEF_ICON(BLANK257b)
/* available */
-DEF_ICON(ICON_BLANK258)
-DEF_ICON(ICON_BLANK259)
-DEF_ICON(ICON_BLANK260)
-DEF_ICON(ICON_BLANK261)
-DEF_ICON(ICON_BLANK262)
-DEF_ICON(ICON_BLANK263)
-DEF_ICON(ICON_BLANK264)
-DEF_ICON(ICON_BLANK265)
-DEF_ICON(ICON_BLANK266)
-DEF_ICON(ICON_BLANK267)
-DEF_ICON(ICON_BLANK268)
-DEF_ICON(ICON_BLANK269)
-DEF_ICON(ICON_BLANK270)
-DEF_ICON(ICON_BLANK271)
-DEF_ICON(ICON_BLANK272)
-DEF_ICON(ICON_BLANK273)
-DEF_ICON(ICON_BLANK274)
-DEF_ICON(ICON_BLANK275)
-DEF_ICON(ICON_BLANK276)
-DEF_ICON(ICON_BLANK277)
-DEF_ICON(ICON_BLANK278)
-DEF_ICON(ICON_BLANK279)
-DEF_ICON(ICON_BLANK280)
-DEF_ICON(ICON_BLANK281)
-DEF_ICON(ICON_BLANK282)
-DEF_ICON(ICON_BLANK282b)
+ DEF_ICON(BLANK258)
+ DEF_ICON(BLANK259)
+ DEF_ICON(BLANK260)
+ DEF_ICON(BLANK261)
+ DEF_ICON(BLANK262)
+ DEF_ICON(BLANK263)
+ DEF_ICON(BLANK264)
+ DEF_ICON(BLANK265)
+ DEF_ICON(BLANK266)
+ DEF_ICON(BLANK267)
+ DEF_ICON(BLANK268)
+ DEF_ICON(BLANK269)
+ DEF_ICON(BLANK270)
+ DEF_ICON(BLANK271)
+ DEF_ICON(BLANK272)
+ DEF_ICON(BLANK273)
+ DEF_ICON(BLANK274)
+ DEF_ICON(BLANK275)
+ DEF_ICON(BLANK276)
+ DEF_ICON(BLANK277)
+ DEF_ICON(BLANK278)
+ DEF_ICON(BLANK279)
+ DEF_ICON(BLANK280)
+ DEF_ICON(BLANK281)
+ DEF_ICON(BLANK282)
+ DEF_ICON(BLANK282b)
+#endif
/* FILE SELECT */
-DEF_ICON(ICON_SORTALPHA)
-DEF_ICON(ICON_SORTBYEXT)
-DEF_ICON(ICON_SORTTIME)
-DEF_ICON(ICON_SORTSIZE)
-DEF_ICON(ICON_LONGDISPLAY)
-DEF_ICON(ICON_SHORTDISPLAY)
-DEF_ICON(ICON_GHOST)
-DEF_ICON(ICON_IMGDISPLAY)
-DEF_ICON(ICON_BLANK284)
-DEF_ICON(ICON_BLANK285)
-DEF_ICON(ICON_BOOKMARKS)
-DEF_ICON(ICON_FONTPREVIEW)
-DEF_ICON(ICON_FILTER)
-DEF_ICON(ICON_NEWFOLDER)
-DEF_ICON(ICON_BLANK285F)
-DEF_ICON(ICON_FILE_PARENT)
-DEF_ICON(ICON_FILE_REFRESH)
-DEF_ICON(ICON_FILE_FOLDER)
-DEF_ICON(ICON_FILE_BLANK)
-DEF_ICON(ICON_FILE_BLEND)
-DEF_ICON(ICON_FILE_IMAGE)
-DEF_ICON(ICON_FILE_MOVIE)
-DEF_ICON(ICON_FILE_SCRIPT)
-DEF_ICON(ICON_FILE_SOUND)
-DEF_ICON(ICON_FILE_FONT)
-DEF_ICON(ICON_BLANK291b)
+DEF_ICON(SORTALPHA)
+DEF_ICON(SORTBYEXT)
+DEF_ICON(SORTTIME)
+DEF_ICON(SORTSIZE)
+DEF_ICON(LONGDISPLAY)
+DEF_ICON(SHORTDISPLAY)
+DEF_ICON(GHOST)
+DEF_ICON(IMGDISPLAY)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK284)
+ DEF_ICON(BLANK285)
+#endif
+DEF_ICON(BOOKMARKS)
+DEF_ICON(FONTPREVIEW)
+DEF_ICON(FILTER)
+DEF_ICON(NEWFOLDER)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK285F)
+#endif
+DEF_ICON(FILE_PARENT)
+DEF_ICON(FILE_REFRESH)
+DEF_ICON(FILE_FOLDER)
+DEF_ICON(FILE_BLANK)
+DEF_ICON(FILE_BLEND)
+DEF_ICON(FILE_IMAGE)
+DEF_ICON(FILE_MOVIE)
+DEF_ICON(FILE_SCRIPT)
+DEF_ICON(FILE_SOUND)
+DEF_ICON(FILE_FONT)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK291b)
/* available */
-DEF_ICON(ICON_BLANK292)
-DEF_ICON(ICON_BLANK293)
-DEF_ICON(ICON_BLANK294)
-DEF_ICON(ICON_BLANK295)
-DEF_ICON(ICON_BLANK296)
-DEF_ICON(ICON_BLANK297)
-DEF_ICON(ICON_BLANK298)
-DEF_ICON(ICON_BLANK299)
-DEF_ICON(ICON_BLANK300)
-DEF_ICON(ICON_BLANK301)
-DEF_ICON(ICON_BLANK302)
-DEF_ICON(ICON_BLANK303)
-DEF_ICON(ICON_BLANK304)
-DEF_ICON(ICON_BLANK305)
-DEF_ICON(ICON_BLANK306)
-DEF_ICON(ICON_BACK)
-DEF_ICON(ICON_FORWARD)
-DEF_ICON(ICON_BLANK309)
-DEF_ICON(ICON_BLANK310)
-DEF_ICON(ICON_BLANK311)
-DEF_ICON(ICON_BLANK312)
-DEF_ICON(ICON_BLANK313)
-DEF_ICON(ICON_BLANK314)
-DEF_ICON(ICON_BLANK315)
-DEF_ICON(ICON_BLANK316)
-DEF_ICON(ICON_DISK_DRIVE)
+ DEF_ICON(BLANK292)
+ DEF_ICON(BLANK293)
+ DEF_ICON(BLANK294)
+ DEF_ICON(BLANK295)
+ DEF_ICON(BLANK296)
+ DEF_ICON(BLANK297)
+ DEF_ICON(BLANK298)
+ DEF_ICON(BLANK299)
+ DEF_ICON(BLANK300)
+ DEF_ICON(BLANK301)
+ DEF_ICON(BLANK302)
+ DEF_ICON(BLANK303)
+ DEF_ICON(BLANK304)
+ DEF_ICON(BLANK305)
+ DEF_ICON(BLANK306)
+#endif
+DEF_ICON(BACK)
+DEF_ICON(FORWARD)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK309)
+ DEF_ICON(BLANK310)
+ DEF_ICON(BLANK311)
+ DEF_ICON(BLANK312)
+ DEF_ICON(BLANK313)
+ DEF_ICON(BLANK314)
+ DEF_ICON(BLANK315)
+ DEF_ICON(BLANK316)
+#endif
+DEF_ICON(DISK_DRIVE)
/* SHADING / TEXT */
-DEF_ICON(ICON_MATPLANE)
-DEF_ICON(ICON_MATSPHERE)
-DEF_ICON(ICON_MATCUBE)
-DEF_ICON(ICON_MONKEY)
-DEF_ICON(ICON_HAIR)
-DEF_ICON(ICON_ALIASED)
-DEF_ICON(ICON_ANTIALIASED)
-DEF_ICON(ICON_MAT_SPHERE_SKY)
-DEF_ICON(ICON_BLANK319)
-DEF_ICON(ICON_BLANK320)
-DEF_ICON(ICON_BLANK321)
-DEF_ICON(ICON_BLANK322)
-DEF_ICON(ICON_WORDWRAP_OFF)
-DEF_ICON(ICON_WORDWRAP_ON)
-DEF_ICON(ICON_SYNTAX_OFF)
-DEF_ICON(ICON_SYNTAX_ON)
-DEF_ICON(ICON_LINENUMBERS_OFF)
-DEF_ICON(ICON_LINENUMBERS_ON)
-DEF_ICON(ICON_SCRIPTPLUGINS) // XXX CREATE NEW
-DEF_ICON(ICON_BLANK323)
-DEF_ICON(ICON_BLANK324)
-DEF_ICON(ICON_BLANK325)
-DEF_ICON(ICON_BLANK326)
-DEF_ICON(ICON_BLANK327)
-DEF_ICON(ICON_BLANK328)
-DEF_ICON(ICON_BLANK328b)
+DEF_ICON(MATPLANE)
+DEF_ICON(MATSPHERE)
+DEF_ICON(MATCUBE)
+DEF_ICON(MONKEY)
+DEF_ICON(HAIR)
+DEF_ICON(ALIASED)
+DEF_ICON(ANTIALIASED)
+DEF_ICON(MAT_SPHERE_SKY)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK319)
+ DEF_ICON(BLANK320)
+ DEF_ICON(BLANK321)
+ DEF_ICON(BLANK322)
+#endif
+DEF_ICON(WORDWRAP_OFF)
+DEF_ICON(WORDWRAP_ON)
+DEF_ICON(SYNTAX_OFF)
+DEF_ICON(SYNTAX_ON)
+DEF_ICON(LINENUMBERS_OFF)
+DEF_ICON(LINENUMBERS_ON)
+DEF_ICON(SCRIPTPLUGINS) // XXX CREATE NEW
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK323)
+ DEF_ICON(BLANK324)
+ DEF_ICON(BLANK325)
+ DEF_ICON(BLANK326)
+ DEF_ICON(BLANK327)
+ DEF_ICON(BLANK328)
+ DEF_ICON(BLANK328b)
+#endif
/* SEQUENCE / IMAGE EDITOR */
-DEF_ICON(ICON_SEQ_SEQUENCER)
-DEF_ICON(ICON_SEQ_PREVIEW)
-DEF_ICON(ICON_SEQ_LUMA_WAVEFORM)
-DEF_ICON(ICON_SEQ_CHROMA_SCOPE)
-DEF_ICON(ICON_SEQ_HISTOGRAM)
-DEF_ICON(ICON_SEQ_SPLITVIEW)
-DEF_ICON(ICON_BLANK331)
-DEF_ICON(ICON_BLANK332)
-DEF_ICON(ICON_BLANK333)
-DEF_ICON(ICON_IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
-DEF_ICON(ICON_IMAGE_RGB_ALPHA)
-DEF_ICON(ICON_IMAGE_ALPHA)
-DEF_ICON(ICON_IMAGE_ZDEPTH)
-DEF_ICON(ICON_IMAGEFILE)
-DEF_ICON(ICON_BLANK336)
-DEF_ICON(ICON_BLANK337)
-DEF_ICON(ICON_BLANK338)
-DEF_ICON(ICON_BLANK339)
-DEF_ICON(ICON_BLANK340)
-DEF_ICON(ICON_BLANK341)
-DEF_ICON(ICON_BLANK342)
-DEF_ICON(ICON_BLANK343)
-DEF_ICON(ICON_BLANK344)
-DEF_ICON(ICON_BLANK345)
-DEF_ICON(ICON_BLANK346)
-DEF_ICON(ICON_BLANK346b)
+DEF_ICON(SEQ_SEQUENCER)
+DEF_ICON(SEQ_PREVIEW)
+DEF_ICON(SEQ_LUMA_WAVEFORM)
+DEF_ICON(SEQ_CHROMA_SCOPE)
+DEF_ICON(SEQ_HISTOGRAM)
+DEF_ICON(SEQ_SPLITVIEW)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK331)
+ DEF_ICON(BLANK332)
+ DEF_ICON(BLANK333)
+#endif
+DEF_ICON(IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
+DEF_ICON(IMAGE_RGB_ALPHA)
+DEF_ICON(IMAGE_ALPHA)
+DEF_ICON(IMAGE_ZDEPTH)
+DEF_ICON(IMAGEFILE)
+#ifndef DEF_ICON_BLANK_SKIP
+ DEF_ICON(BLANK336)
+ DEF_ICON(BLANK337)
+ DEF_ICON(BLANK338)
+ DEF_ICON(BLANK339)
+ DEF_ICON(BLANK340)
+ DEF_ICON(BLANK341)
+ DEF_ICON(BLANK342)
+ DEF_ICON(BLANK343)
+ DEF_ICON(BLANK344)
+ DEF_ICON(BLANK345)
+ DEF_ICON(BLANK346)
+ DEF_ICON(BLANK346b)
+#endif
/* brush icons */
-DEF_ICON(ICON_BRUSH_ADD)
-DEF_ICON(ICON_BRUSH_BLOB)
-DEF_ICON(ICON_BRUSH_BLUR)
-DEF_ICON(ICON_BRUSH_CLAY)
-DEF_ICON(ICON_BRUSH_CLONE)
-DEF_ICON(ICON_BRUSH_CREASE)
-DEF_ICON(ICON_BRUSH_DARKEN)
-DEF_ICON(ICON_BRUSH_FILL)
-DEF_ICON(ICON_BRUSH_FLATTEN)
-DEF_ICON(ICON_BRUSH_GRAB)
-DEF_ICON(ICON_BRUSH_INFLATE)
-DEF_ICON(ICON_BRUSH_LAYER)
-DEF_ICON(ICON_BRUSH_LIGHTEN)
-DEF_ICON(ICON_BRUSH_MIX)
-DEF_ICON(ICON_BRUSH_MULTIPLY)
-DEF_ICON(ICON_BRUSH_NUDGE)
-DEF_ICON(ICON_BRUSH_PINCH)
-DEF_ICON(ICON_BRUSH_SCRAPE)
-DEF_ICON(ICON_BRUSH_SCULPT_DRAW)
-DEF_ICON(ICON_BRUSH_SMEAR)
-DEF_ICON(ICON_BRUSH_SMOOTH)
-DEF_ICON(ICON_BRUSH_SNAKE_HOOK)
-DEF_ICON(ICON_BRUSH_SOFTEN)
-DEF_ICON(ICON_BRUSH_SUBTRACT)
-DEF_ICON(ICON_BRUSH_TEXDRAW)
-DEF_ICON(ICON_BRUSH_THUMB)
-DEF_ICON(ICON_BRUSH_ROTATE)
-DEF_ICON(ICON_BRUSH_VERTEXDRAW)
-
- /* vector icons */
-
-DEF_ICON(VICO_VIEW3D_VEC)
-DEF_ICON(VICO_EDIT_VEC)
-DEF_ICON(VICO_EDITMODE_DEHLT)
-DEF_ICON(VICO_EDITMODE_HLT)
-DEF_ICON(VICO_DISCLOSURE_TRI_RIGHT_VEC)
-DEF_ICON(VICO_DISCLOSURE_TRI_DOWN_VEC)
-DEF_ICON(VICO_MOVE_UP_VEC)
-DEF_ICON(VICO_MOVE_DOWN_VEC)
-DEF_ICON(VICO_X_VEC)
-DEF_ICON(VICO_SMALL_TRI_RIGHT_VEC)
+DEF_ICON(BRUSH_ADD)
+DEF_ICON(BRUSH_BLOB)
+DEF_ICON(BRUSH_BLUR)
+DEF_ICON(BRUSH_CLAY)
+DEF_ICON(BRUSH_CLONE)
+DEF_ICON(BRUSH_CREASE)
+DEF_ICON(BRUSH_DARKEN)
+DEF_ICON(BRUSH_FILL)
+DEF_ICON(BRUSH_FLATTEN)
+DEF_ICON(BRUSH_GRAB)
+DEF_ICON(BRUSH_INFLATE)
+DEF_ICON(BRUSH_LAYER)
+DEF_ICON(BRUSH_LIGHTEN)
+DEF_ICON(BRUSH_MIX)
+DEF_ICON(BRUSH_MULTIPLY)
+DEF_ICON(BRUSH_NUDGE)
+DEF_ICON(BRUSH_PINCH)
+DEF_ICON(BRUSH_SCRAPE)
+DEF_ICON(BRUSH_SCULPT_DRAW)
+DEF_ICON(BRUSH_SMEAR)
+DEF_ICON(BRUSH_SMOOTH)
+DEF_ICON(BRUSH_SNAKE_HOOK)
+DEF_ICON(BRUSH_SOFTEN)
+DEF_ICON(BRUSH_SUBTRACT)
+DEF_ICON(BRUSH_TEXDRAW)
+DEF_ICON(BRUSH_THUMB)
+DEF_ICON(BRUSH_ROTATE)
+DEF_ICON(BRUSH_VERTEXDRAW)
+/* vector icons, VICO_ prefix added */
+DEF_VICO(VIEW3D_VEC)
+DEF_VICO(EDIT_VEC)
+DEF_VICO(EDITMODE_DEHLT)
+DEF_VICO(EDITMODE_HLT)
+DEF_VICO(DISCLOSURE_TRI_RIGHT_VEC)
+DEF_VICO(DISCLOSURE_TRI_DOWN_VEC)
+DEF_VICO(MOVE_UP_VEC)
+DEF_VICO(MOVE_DOWN_VEC)
+DEF_VICO(X_VEC)
+DEF_VICO(SMALL_TRI_RIGHT_VEC)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 40985a918d4..553ac3b0222 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file UI_interface.h
+ * \ingroup editorui
+ */
+
#ifndef UI_INTERFACE_H
#define UI_INTERFACE_H
@@ -77,26 +81,27 @@ typedef struct uiLayout uiLayout;
#define UI_EMBOSST 3 /* Table */
/* uiBlock->direction */
+#define UI_DIRECTION (UI_TOP|UI_DOWN|UI_LEFT|UI_RIGHT)
#define UI_TOP 1
#define UI_DOWN 2
#define UI_LEFT 4
#define UI_RIGHT 8
-#define UI_DIRECTION 15
+
#define UI_CENTER 16
#define UI_SHIFT_FLIPPED 32
/* uiBlock->autofill (not yet used) */
-#define UI_BLOCK_COLLUMNS 1
-#define UI_BLOCK_ROWS 2
+// #define UI_BLOCK_COLLUMNS 1
+// #define UI_BLOCK_ROWS 2
/* uiBlock->flag (controls) */
#define UI_BLOCK_LOOP 1
#define UI_BLOCK_REDRAW 2
#define UI_BLOCK_RET_1 4 /* XXX 2.5 not implemented */
#define UI_BLOCK_NUMSELECT 8
-#define UI_BLOCK_ENTER_OK 16
-#define UI_BLOCK_NOSHADOW 32
-#define UI_BLOCK_UNUSED 64
+/*#define UI_BLOCK_ENTER_OK 16*/ /*UNUSED*/
+/*#define UI_BLOCK_NOSHADOW 32*/ /*UNUSED*/
+/*#define UI_BLOCK_UNUSED 64*/ /*UNUSED*/
#define UI_BLOCK_MOVEMOUSE_QUIT 128
#define UI_BLOCK_KEEP_OPEN 256
#define UI_BLOCK_POPUP 512
@@ -113,13 +118,8 @@ typedef struct uiLayout uiLayout;
/* block->flag bits 12-15 are identical to but->flag bits */
/* panel controls */
-#define UI_PNL_TRANSP 1
#define UI_PNL_SOLID 2
-
#define UI_PNL_CLOSE 32
-#define UI_PNL_STOW 64
-#define UI_PNL_TO_MOUSE 128
-#define UI_PNL_UNSTOW 256
#define UI_PNL_SCALE 512
/* warning the first 6 flags are internal */
@@ -146,15 +146,17 @@ typedef struct uiLayout uiLayout;
#define UI_BUT_ANIMATED (1<<20)
#define UI_BUT_ANIMATED_KEY (1<<21)
#define UI_BUT_DRIVEN (1<<22)
-#define UI_BUT_INACTIVE (1<<23)
-#define UI_BUT_LAST_ACTIVE (1<<24)
-#define UI_BUT_UNDO (1<<25)
-#define UI_BUT_IMMEDIATE (1<<26)
-#define UI_BUT_NO_TOOLTIP (1<<27)
+#define UI_BUT_REDALERT (1<<23)
+#define UI_BUT_INACTIVE (1<<24)
+#define UI_BUT_LAST_ACTIVE (1<<25)
+#define UI_BUT_UNDO (1<<26)
+#define UI_BUT_IMMEDIATE (1<<27)
+#define UI_BUT_NO_TOOLTIP (1<<28)
+#define UI_BUT_NO_UTF8 (1<<29)
#define UI_BUT_NO_UTF8 (1<<28)
-#define UI_BUT_VEC_SIZE_LOCK (1<<29) /* used to flag if color hsv-circle should keep luminance */
-#define UI_BUT_COLOR_CUBIC (1<<30) /* cubic saturation for the color wheel */
+#define UI_BUT_VEC_SIZE_LOCK (1<<30) /* used to flag if color hsv-circle should keep luminance */
+#define UI_BUT_COLOR_CUBIC (1<<31) /* cubic saturation for the color wheel */
#define UI_PANEL_WIDTH 340
#define UI_COMPACT_PANEL_WIDTH 160
@@ -170,7 +172,7 @@ typedef struct uiLayout uiLayout;
#define SHO 64
#define INT 96
#define FLO 128
-#define FUN 192
+/*#define FUN 192*/ /*UNUSED*/
#define BIT 256
#define BUTPOIN (128+64+32)
@@ -214,6 +216,7 @@ typedef struct uiLayout uiLayout;
#define TOGBUT (37<<9)
#define OPTION (38<<9)
#define OPTIONN (39<<9)
+ /* buttons with value >= SEARCH_MENU don't get undo pushes */
#define SEARCH_MENU (40<<9)
#define BUT_EXTRA (41<<9)
#define HSVCIRCLE (42<<9)
@@ -250,6 +253,9 @@ int uiGetRoundBox(void);
void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad);
void uiDrawMenuBox(float minx, float miny, float maxx, float maxy, short flag, short direction);
void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, float maxy);
+void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float rad);
+void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
+void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight);
/* state for scrolldrawing */
#define UI_SCROLL_PRESSED 1
@@ -266,7 +272,7 @@ typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event);
*
* Functions used to create popup menus. For more extended menus the
* uiPupMenuBegin/End functions can be used to define own items with
- * the uiItem functions inbetween. If it is a simple confirmation menu
+ * the uiItem functions in between. If it is a simple confirmation menu
* or similar, popups can be created with a single function call. */
typedef struct uiPopupMenu uiPopupMenu;
@@ -275,10 +281,10 @@ uiPopupMenu *uiPupMenuBegin(struct bContext *C, const char *title, int icon);
void uiPupMenuEnd(struct bContext *C, struct uiPopupMenu *head);
struct uiLayout *uiPupMenuLayout(uiPopupMenu *head);
-void uiPupMenuOkee(struct bContext *C, char *opname, char *str, ...);
-void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, char *filename);
-void uiPupMenuNotice(struct bContext *C, char *str, ...);
-void uiPupMenuError(struct bContext *C, char *str, ...);
+void uiPupMenuOkee(struct bContext *C, const char *opname, const char *str, ...);
+void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, const char *filename);
+void uiPupMenuNotice(struct bContext *C, const char *str, ...);
+void uiPupMenuError(struct bContext *C, const char *str, ...);
void uiPupMenuReports(struct bContext *C, struct ReportList *reports);
void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registered menu */
@@ -290,7 +296,7 @@ void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registere
typedef uiBlock* (*uiBlockCreateFunc)(struct bContext *C, struct ARegion *ar, void *arg1);
void uiPupBlock(struct bContext *C, uiBlockCreateFunc func, void *arg);
-void uiPupBlockO(struct bContext *C, uiBlockCreateFunc func, void *arg, char *opname, int opcontext);
+void uiPupBlockO(struct bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext);
void uiPupBlockOperator(struct bContext *C, uiBlockCreateFunc func, struct wmOperator *op, int opcontext);
void uiPupBlockClose(struct bContext *C, uiBlock *block);
@@ -310,9 +316,9 @@ uiBlock *uiBeginBlock(const struct bContext *C, struct ARegion *region, const ch
void uiEndBlock(const struct bContext *C, uiBlock *block);
void uiDrawBlock(const struct bContext *C, struct uiBlock *block);
-uiBlock *uiGetBlock(char *name, struct ARegion *ar);
+uiBlock *uiGetBlock(const char *name, struct ARegion *ar);
-void uiBlockSetEmboss(uiBlock *block, short dt);
+void uiBlockSetEmboss(uiBlock *block, char dt);
void uiFreeBlock(const struct bContext *C, uiBlock *block);
void uiFreeBlocks(const struct bContext *C, struct ListBase *lb);
@@ -320,7 +326,7 @@ void uiFreeInactiveBlocks(const struct bContext *C, struct ListBase *lb);
void uiBlockSetRegion(uiBlock *block, struct ARegion *region);
-void uiBlockSetButLock(uiBlock *block, int val, char *lockstr);
+void uiBlockSetButLock(uiBlock *block, int val, const char *lockstr);
void uiBlockClearButLock(uiBlock *block);
/* automatic aligning, horiz or verical */
@@ -333,7 +339,7 @@ enum {
UI_BLOCK_BOUNDS_TEXT,
UI_BLOCK_BOUNDS_POPUP_MOUSE,
UI_BLOCK_BOUNDS_POPUP_MENU,
- UI_BLOCK_BOUNDS_POPUP_CENTER,
+ UI_BLOCK_BOUNDS_POPUP_CENTER
} eBlockBoundsCalc;
void uiBoundsBlock(struct uiBlock *block, int addval);
@@ -379,62 +385,66 @@ int uiButActiveOnly (const struct bContext *C, uiBlock *block, uiBut *but);
* - O: operator */
uiBut *uiDefBut(uiBlock *block,
- int type, int retval, char *str,
- short x1, short y1,
+ int type, int retval, const char *str,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefButF(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButI(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButS(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButC(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefButF(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButI(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButS(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButC(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButR(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefButO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefButTextO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip);
uiBut *uiDefIconBut(uiBlock *block,
int type, int retval, int icon,
- short x1, short y1,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int icon, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, int x1, int y1, short x2, short y2, const char *tip);
uiBut *uiDefIconTextBut(uiBlock *block,
- int type, int retval, int icon, char *str,
- short x1, short y1,
+ int type, int retval, int icon, const char *str,
+ int x1, int y1,
short x2, short y2,
void *poin,
float min, float max,
- float a1, float a2, char *tip);
-uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip);
-uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
+ float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, struct PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip);
+uiBut *uiDefIconTextButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
/* for passing inputs to ButO buttons */
struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
+void uiButSetUnitType(uiBut *but, const int unit_type);
+int uiButGetUnitType(uiBut *but);
+
/* Special Buttons
*
* Butons with a more specific purpose:
@@ -460,34 +470,34 @@ struct PointerRNA *uiButGetOperatorPtrRNA(uiBut *but);
#define UI_ID_PREVIEWS 2048
#define UI_ID_FULL (UI_ID_RENAME|UI_ID_BROWSE|UI_ID_ADD_NEW|UI_ID_OPEN|UI_ID_ALONE|UI_ID_DELETE|UI_ID_LOCAL)
-typedef void (*uiIDPoinFuncFP)(struct bContext *C, char *str, struct ID **idpp);
+typedef void (*uiIDPoinFuncFP)(struct bContext *C, const char *str, struct ID **idpp);
typedef void (*uiIDPoinFunc)(struct bContext *C, struct ID *id, int event);
-uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, char *str,
- short x1, short y1, short x2, short y2, void *idpp, char *tip);
+uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str,
+ int x1, int y1, short x2, short y2, void *idpp, const char *tip);
int uiIconFromID(struct ID *id);
-uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, char *str, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *str, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *func_arg1, const char *str, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, const char *str, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, short x1, short y1, short x2, short y2, char *tip);
-uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip);
+uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, int x1, int y1, short x2, short y2, const char *tip);
+uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip);
-uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip);
-uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip);
+uiBut *uiDefKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *spoin, const char *tip);
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *keypoin, short *modkeypoin, const char *tip);
-uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, float a1, float a2, char *tip);
+uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x1, int y1, short x2, short y2, float a1, float a2, const char *tip);
void uiBlockPickerButtons(struct uiBlock *block, float *col, float *hsv, float *old, char *hexcol, char mode, short retval);
-uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, char *name, int icon, int x1, int y1, int x2, int y2);
-void uiDefAutoButsRNA(const struct bContext *C, uiLayout *layout, struct PointerRNA *ptr, int columns);
+uiBut *uiDefAutoButR(uiBlock *block, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2);
+int uiDefAutoButsRNA(uiLayout *layout, struct PointerRNA *ptr, int (*check_prop)(struct PropertyRNA *), const char label_align);
/* Links
*
@@ -520,7 +530,7 @@ typedef void (*uiButHandleFunc)(struct bContext *C, void *arg1, void *arg2);
typedef void (*uiButHandleRenameFunc)(struct bContext *C, void *arg, char *origstr);
typedef void (*uiButHandleNFunc)(struct bContext *C, void *argN, void *arg2);
typedef void (*uiButCompleteFunc)(struct bContext *C, char *str, void *arg);
-typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, char *str, uiSearchItems *items);
+typedef void (*uiButSearchFunc)(const struct bContext *C, void *arg, const char *str, uiSearchItems *items);
typedef void (*uiBlockHandleFunc)(struct bContext *C, void *arg, int event);
/* use inside searchfunc to add items */
@@ -543,6 +553,8 @@ void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg);
void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext *C, void *, void *, void *, struct rcti *rect), void *arg1, void *arg2);
+void uiButSetFocusOnEnter (struct wmWindow *win, uiBut *but);
+
/* Autocomplete
*
* Tab complete helper functions, for use in uiButCompleteFunc callbacks.
@@ -551,7 +563,7 @@ void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext
typedef struct AutoComplete AutoComplete;
-AutoComplete *autocomplete_begin(char *startname, int maxlen);
+AutoComplete *autocomplete_begin(const char *startname, int maxlen);
void autocomplete_do_name(AutoComplete *autocpl, const char *name);
void autocomplete_end(AutoComplete *autocpl, char *autoname);
@@ -624,6 +636,13 @@ void UI_exit(void);
#define UI_ITEM_R_NO_BG 128
#define UI_ITEM_R_IMMEDIATE 256
+/* uiLayoutOperatorButs flags */
+#define UI_LAYOUT_OP_SHOW_TITLE 1
+#define UI_LAYOUT_OP_SHOW_EMPTY 2
+
+/* for more readable function names */
+#define ICON_NULL 0
+
uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout);
void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
@@ -631,8 +650,9 @@ void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
uiBlock *uiLayoutGetBlock(uiLayout *layout);
void uiLayoutSetFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv);
-void uiLayoutSetContextPointer(uiLayout *layout, char *name, struct PointerRNA *ptr);
-char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
+void uiLayoutSetContextPointer(uiLayout *layout, const char *name, struct PointerRNA *ptr);
+const char *uiLayoutIntrospect(uiLayout *layout); // XXX - testing
+void uiLayoutOperatorButs(const struct bContext *C, struct uiLayout *layout, struct wmOperator *op, int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag);
void uiLayoutSetOperatorContext(uiLayout *layout, int opcontext);
void uiLayoutSetActive(uiLayout *layout, int active);
@@ -669,28 +689,28 @@ uiBlock *uiLayoutAbsoluteBlock(uiLayout *layout);
/* templates */
void uiTemplateHeader(uiLayout *layout, struct bContext *C, int menus);
void uiTemplateDopeSheetFilter(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
-void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop);
-void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop);
-void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *newop, char *openop, char *unlinkop, int rows, int cols);
-void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- char *proptypename, char *text);
-void uiTemplatePathBuilder(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname,
- struct PointerRNA *root_ptr, char *text);
+void uiTemplateID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop);
+void uiTemplateIDBrowse(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop);
+void uiTemplateIDPreview(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname,
+ const char *newop, const char *openop, const char *unlinkop, int rows, int cols);
+void uiTemplateAnyID(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ const char *proptypename, const char *text);
+void uiTemplatePathBuilder(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ struct PointerRNA *root_ptr, const char *text);
uiLayout *uiTemplateModifier(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
-void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot);
-void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand);
-void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, char *propname, int type, int levels, int brush);
-void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
-void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname,
- PointerRNA *used_ptr, char *used_propname, int active_layer);
-void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *userptr, int compact);
+void uiTemplatePreview(uiLayout *layout, struct ID *id, int show_buttons, struct ID *parent, struct MTex *slot);
+void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int expand);
+void uiTemplateHistogram(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateWaveform(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateVectorscope(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiTemplateCurveMapping(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int type, int levels, int brush);
+void uiTemplateColorWheel(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int value_slider, int lock, int lock_luminosity, int cubic);
+void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, const char *propname,
+ PointerRNA *used_ptr, const char *used_propname, int active_layer);
+void uiTemplateImage(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *userptr, int compact);
void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
void uiTemplateOperatorSearch(uiLayout *layout);
@@ -698,52 +718,59 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex);
void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
-void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int maxrows, int type);
+void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *activeptr, const char *activeprop, int rows, int maxrows, int type);
/* items */
-void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
-void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value);
-void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value);
-void uiItemsEnumO(uiLayout *layout, char *opname, char *propname);
-void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
-void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
-void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value);
-void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value);
-PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, struct IDProperty *properties, int context, int flag);
-
-void uiItemR(uiLayout *layout, struct PointerRNA *ptr, char *propname, int flag, char *name, int icon);
-void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, char *name, int icon);
-void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value);
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon);
-void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname);
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon);
-void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, struct IDProperty *properties, int context, int flag);
-
-void uiItemL(uiLayout *layout, char *name, int icon); /* label */
-void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, char *name, int icon); /* label icon for dragging */
-void uiItemM(uiLayout *layout, struct bContext *C, char *menuname, char *name, int icon); /* menu */
-void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */
+void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
+void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value);
+void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
+void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname);
+void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
+void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
+void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value);
+void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
+PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, struct IDProperty *properties, int context, int flag);
+
+void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon);
+void uiItemFullR(uiLayout *layout, struct PointerRNA *ptr, struct PropertyRNA *prop, int index, int value, int flag, const char *name, int icon);
+void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value);
+void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon);
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname);
+void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon);
+void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, struct IDProperty *properties, int context, int flag);
+
+void uiItemL(uiLayout *layout, const char *name, int icon); /* label */
+void uiItemLDrag(uiLayout *layout, struct PointerRNA *ptr, const char *name, int icon); /* label icon for dragging */
+void uiItemM(uiLayout *layout, struct bContext *C, const char *menuname, const char *name, int icon); /* menu */
+void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value */
void uiItemS(uiLayout *layout); /* separator */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg);
-void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon);
-void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon);
+void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg);
+void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon);
+void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon);
/* UI Operators */
void UI_buttons_operatortypes(void);
/* Helpers for Operators */
-void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
+void uiContextActiveProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index);
+void uiContextAnimUpdate(const struct bContext *C);
void uiFileBrowseContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
void uiIDContextProperty(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop);
/* Styled text draw */
void uiStyleFontSet(struct uiFontStyle *fs);
-void uiStyleFontDraw(struct uiFontStyle *fs, struct rcti *rect, char *str);
-void uiStyleFontDrawRotated(struct uiFontStyle *fs, struct rcti *rect, char *str);
+void uiStyleFontDrawExt(struct uiFontStyle *fs, struct rcti *rect, const char *str,
+ float *r_xofs, float *r_yofs);
+void uiStyleFontDraw(struct uiFontStyle *fs, struct rcti *rect, const char *str);
+void uiStyleFontDrawRotated(struct uiFontStyle *fs, struct rcti *rect, const char *str);
+
+int UI_GetStringWidth(const char *str); // XXX temp
+void UI_DrawString(float x, float y, const char *str); // XXX temp
+void UI_DrawTriIcon(float x, float y, char dir);
-int UI_GetStringWidth(char *str); // XXX temp
-void UI_DrawString(float x, float y, char *str); // XXX temp
+/* linker workaround ack! */
+void UI_template_fix_linking(void);
#endif /* UI_INTERFACE_H */
diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index 73fc2d6316d..50b14cb832a 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file UI_interface_icons.h
+ * \ingroup editorui
+ */
+
#ifndef UI_INTERFACE_ICONS_H
#define UI_INTERFACE_ICONS_H
@@ -62,11 +66,11 @@ void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspec
void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha);
void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, float *rgb);
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha);
-void UI_icons_free();
+void UI_icons_free(void);
void UI_icons_free_drawinfo(void *drawinfo);
struct ListBase *UI_iconfile_list(void);
-int UI_iconfile_get_index(char *filename);
+int UI_iconfile_get_index(const char *filename);
#endif /* UI_INTERFACE_ICONS_H */
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 3b76520c4bf..9c3a378608b 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
@@ -30,12 +30,17 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file UI_resources.h
+ * \ingroup editorui
+ */
+
#ifndef UI_RESOURCES_H
#define UI_RESOURCES_H
/* elubie: TODO: move the typedef for icons to UI_interface_icons.h */
/* and add/replace include of UI_resources.h by UI_interface_icons.h */
-#define DEF_ICON(name) name,
+#define DEF_ICON(name) ICON_##name,
+#define DEF_VICO(name) VICO_##name,
typedef enum {
#define BIFICONID_FIRST (ICON_BLENDER)
@@ -45,6 +50,7 @@ typedef enum {
#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
} BIFIconID;
#undef DEF_ICON
+#undef DEF_VICO
typedef enum {
@@ -233,6 +239,10 @@ enum {
TH_PREVIEW_BACK,
TH_EDGE_CREASE,
+
+ TH_DRAWEXTRA_EDGELEN,
+ TH_DRAWEXTRA_FACEAREA,
+ TH_DRAWEXTRA_FACEANG
};
/* XXX WARNING: previous is saved in file, so do not change order! */
@@ -271,17 +281,17 @@ void UI_GetThemeColor3fv(int colorid, float *col);
void UI_GetThemeColorShade3fv(int colorid, int offset, float *col);
// get the 3 or 4 byte values
-void UI_GetThemeColor3ubv(int colorid, char *col);
-void UI_GetThemeColor4ubv(int colorid, char *col);
+void UI_GetThemeColor3ubv(int colorid, unsigned char col[3]);
+void UI_GetThemeColor4ubv(int colorid, unsigned char col[4]);
// get a theme color from specified space type
-void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col);
+void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]);
// blends and shades between two color pointers
-void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset);
+void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset);
// get a 3 byte color, blended and shaded between two other char color pointers
-void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset);
+void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset);
// clear the openGL ClearColor using the input colorid
void UI_ThemeClearColor(int colorid);
@@ -290,9 +300,8 @@ void UI_ThemeClearColor(int colorid);
void UI_SetTheme(int spacetype, int regionid);
/* only for buttons in theme editor! */
-char *UI_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid);
-char *UI_ThemeColorsPup(int spacetype);
+const unsigned char *UI_ThemeGetColorPtr(struct bTheme *btheme, int spacetype, int colorid);
-void UI_make_axis_color(char *src_col, char *dst_col, char axis);
+void UI_make_axis_color(const unsigned char *src_col, unsigned char *dst_col, const char axis);
#endif /* UI_ICONS_H */
diff --git a/source/blender/editors/include/UI_view2d.h b/source/blender/editors/include/UI_view2d.h
index bf4a3de9cc6..1aadb63181d 100644
--- a/source/blender/editors/include/UI_view2d.h
+++ b/source/blender/editors/include/UI_view2d.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file UI_view2d.h
+ * \ingroup editorui
+ */
+
#ifndef UI_VIEW2D_H
#define UI_VIEW2D_H
@@ -57,7 +61,7 @@ enum {
/* headers (this is basically the same as listview, but no y-panning) */
V2D_COMMONVIEW_HEADER,
/* ui region containing panels */
- V2D_COMMONVIEW_PANELS_UI,
+ V2D_COMMONVIEW_PANELS_UI
} eView2D_CommonViewTypes;
/* ---- Defines for Scroller/Grid Arguments ----- */
@@ -76,13 +80,13 @@ enum {
V2D_UNIT_VALUES,
V2D_UNIT_DEGREES,
V2D_UNIT_TIME,
- V2D_UNIT_SECONDSSEQ,
+ V2D_UNIT_SECONDSSEQ
} eView2D_Units;
/* clamping of grid values to whole numbers */
enum {
V2D_GRID_NOCLAMP = 0,
- V2D_GRID_CLAMP,
+ V2D_GRID_CLAMP
} eView2D_Clamp;
/* flags for grid-lines to draw */
@@ -156,14 +160,14 @@ void UI_view2d_totRect_set_resize(struct View2D *v2d, int width, int height, int
int UI_view2d_tab_set(struct View2D *v2d, int tab);
/* view matrix operations */
-void UI_view2d_view_ortho(const struct bContext *C, struct View2D *v2d);
-void UI_view2d_view_orthoSpecial(const struct bContext *C, struct View2D *v2d, short xaxis);
+void UI_view2d_view_ortho(struct View2D *v2d);
+void UI_view2d_view_orthoSpecial(struct ARegion *ar, struct View2D *v2d, short xaxis);
void UI_view2d_view_restore(const struct bContext *C);
/* grid drawing */
-View2DGrid *UI_view2d_grid_calc(const struct bContext *C, struct View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy);
-void UI_view2d_grid_draw(const struct bContext *C, struct View2D *v2d, View2DGrid *grid, int flag);
-void UI_view2d_constant_grid_draw(const struct bContext *C, struct View2D *v2d);
+View2DGrid *UI_view2d_grid_calc(struct Scene *scene, struct View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy);
+void UI_view2d_grid_draw(struct View2D *v2d, View2DGrid *grid, int flag);
+void UI_view2d_constant_grid_draw(struct View2D *v2d);
void UI_view2d_grid_size(View2DGrid *grid, float *r_dx, float *r_dy);
void UI_view2d_grid_free(View2DGrid *grid);
@@ -191,8 +195,8 @@ void UI_view2d_getscale(struct View2D *v2d, float *x, float *y);
short UI_view2d_mouse_in_scrollers(const struct bContext *C, struct View2D *v2d, int x, int y);
/* cached text drawing in v2d, to allow pixel-aligned draw as post process */
-void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, char *str);
-void UI_view2d_text_cache_rectf(struct View2D *v2d, struct rctf *rect, char *str);
+void UI_view2d_text_cache_add(struct View2D *v2d, float x, float y, const char *str, const char col[4]);
+void UI_view2d_text_cache_rectf(struct View2D *v2d, struct rctf *rect, const char *str, const char col[4]);
void UI_view2d_text_cache_draw(struct ARegion *ar);
/* operators */
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index 4b4590aeee5..09ea9f9ad7e 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -19,12 +19,11 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../gpu
../../imbuf
@@ -35,12 +34,33 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+set(SRC
+ interface.c
+ interface_anim.c
+ interface_draw.c
+ interface_handlers.c
+ interface_icons.c
+ interface_layout.c
+ interface_ops.c
+ interface_panel.c
+ interface_regions.c
+ interface_style.c
+ interface_templates.c
+ interface_utils.c
+ interface_widgets.c
+ resources.c
+ view2d.c
+ view2d_ops.c
+
+ interface_intern.h
+)
+
+if(WITH_INTERNATIONAL)
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_interface "${SRC}" "${INC}")
+blender_add_lib(bf_editor_interface "${SRC}" "${INC}")
diff --git a/source/blender/editors/interface/Makefile b/source/blender/editors/interface/Makefile
deleted file mode 100644
index 7b5d4e60fbd..00000000000
--- a/source/blender/editors/interface/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_interface
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
-
diff --git a/source/blender/editors/interface/SConscript b/source/blender/editors/interface/SConscript
index 214722e5efb..e3b730e85c1 100644
--- a/source/blender/editors/interface/SConscript
+++ b/source/blender/editors/interface/SConscript
@@ -4,11 +4,16 @@ Import ('env')
sources = env.Glob('*.c')
for source in env.Glob('*_api.c'):
- sources.remove(source)
+ sources.remove(source)
incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
+<<<<<<< .working
incs += ' ../../makesrna ../../windowmanager ../../gpu ../../bmesh'
incs += ' #/intern/guardedalloc #/extern/glew/include'
+=======
+incs += ' ../../makesrna ../../windowmanager #/intern/guardedalloc ../../gpu'
+incs += ' #/extern/glew/include ../../blenloader'
+>>>>>>> .merge-right.r35190
incs += ' ../../python/' # python button eval
defs = []
@@ -16,7 +21,7 @@ defs = []
if env['WITH_BF_INTERNATIONAL']:
defs.append('INTERNATIONAL')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
-
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
+
env.BlenderLib ( 'bf_editors_interface', sources, Split(incs), defs, libtype=['core'], priority=[110] )
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 021dcc940e6..674ad8d4a49 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,7 @@
#include <limits.h>
#include <math.h>
#include <string.h>
+#include <ctype.h>
#include "MEM_guardedalloc.h"
@@ -39,10 +40,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_library.h"
#include "BKE_unit.h"
+#include "BKE_utildefines.h" /* FILE_MAX */
#include "BIF_gl.h"
@@ -67,7 +70,7 @@
#define MENU_SEP_HEIGHT 6
/*
- * a full doc with API notes can be found in bf-blender/blender/doc/interface_API.txt
+ * a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt
*
* uiBlahBlah() external function
* ui_blah_blah() internal function
@@ -77,17 +80,17 @@ static void ui_free_but(const bContext *C, uiBut *but);
/* ************* translation ************** */
-int ui_translate_buttons()
+int ui_translate_buttons(void)
{
return (U.transopts & USER_TR_BUTTONS);
}
-int ui_translate_menus()
+int ui_translate_menus(void)
{
return (U.transopts & USER_TR_MENUS);
}
-int ui_translate_tooltips()
+int ui_translate_tooltips(void)
{
return (U.transopts & USER_TR_TOOLTIPS);
}
@@ -441,7 +444,7 @@ void uiCenteredBoundsBlock(uiBlock *block, int addval)
/* link line drawing is not part of buttons or theme.. so we stick with it here */
-static void ui_draw_linkline(uiBut *but, uiLinkLine *line)
+static void ui_draw_linkline(uiLinkLine *line)
{
rcti rect;
@@ -470,7 +473,7 @@ static void ui_draw_links(uiBlock *block)
if(but->type==LINK && but->link) {
line= but->link->lines.first;
while(line) {
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
line= line->next;
}
}
@@ -494,14 +497,15 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut)
if(oldbut->func_arg1 != oldbut && but->func_arg1 != oldbut->func_arg1) return 0;
if(oldbut->func_arg2 != oldbut && but->func_arg2 != oldbut->func_arg2) return 0;
if(!but->funcN && ((but->poin != oldbut->poin && (uiBut*)oldbut->poin != oldbut) || but->pointype != oldbut->pointype)) return 0;
+ if(but->optype != oldbut->optype) return 0;
return 1;
}
-static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut *but)
+static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut **butpp)
{
uiBlock *oldblock;
- uiBut *oldbut;
+ uiBut *oldbut, *but= *butpp;
int found= 0;
oldblock= block->oldblock;
@@ -511,29 +515,52 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
for(oldbut=oldblock->buttons.first; oldbut; oldbut=oldbut->next) {
if(ui_but_equals_old(oldbut, but)) {
if(oldbut->active) {
- but->flag= oldbut->flag;
- but->active= oldbut->active;
- but->pos= oldbut->pos;
- but->editstr= oldbut->editstr;
- but->editval= oldbut->editval;
- but->editvec= oldbut->editvec;
- but->editcoba= oldbut->editcoba;
- but->editcumap= oldbut->editcumap;
- but->selsta= oldbut->selsta;
- but->selend= oldbut->selend;
- but->softmin= oldbut->softmin;
- but->softmax= oldbut->softmax;
- but->linkto[0]= oldbut->linkto[0];
- but->linkto[1]= oldbut->linkto[1];
+#if 0
+// but->flag= oldbut->flag;
+#else
+ /* exception! redalert flag can't be update from old button.
+ * perhaps it should only copy spesific flags rather then all. */
+// but->flag= (oldbut->flag & ~UI_BUT_REDALERT) | (but->flag & UI_BUT_REDALERT);
+#endif
+// but->active= oldbut->active;
+// but->pos= oldbut->pos;
+// but->ofs= oldbut->ofs;
+// but->editstr= oldbut->editstr;
+// but->editval= oldbut->editval;
+// but->editvec= oldbut->editvec;
+// but->editcoba= oldbut->editcoba;
+// but->editcumap= oldbut->editcumap;
+// but->selsta= oldbut->selsta;
+// but->selend= oldbut->selend;
+// but->softmin= oldbut->softmin;
+// but->softmax= oldbut->softmax;
+// but->linkto[0]= oldbut->linkto[0];
+// but->linkto[1]= oldbut->linkto[1];
found= 1;
-
- oldbut->active= NULL;
+// oldbut->active= NULL;
+
+ /* move button over from oldblock to new block */
+ BLI_remlink(&oldblock->buttons, oldbut);
+ BLI_insertlink(&block->buttons, but, oldbut);
+ oldbut->block= block;
+ *butpp= oldbut;
+
+ /* still stuff needs to be copied */
+ oldbut->x1= but->x1; oldbut->y1= but->y1;
+ oldbut->x2= but->x2; oldbut->y2= but->y2;
+ oldbut->context= but->context; /* set by Layout */
+
+ BLI_remlink(&block->buttons, but);
+ ui_free_but(C, but);
+
+ /* note: if layout hasn't been applied yet, it uses old button pointers... */
+ }
+ else {
+ /* ensures one button can get activated, and in case the buttons
+ * draw are the same this gives O(1) lookup for each button */
+ BLI_remlink(&oldblock->buttons, oldbut);
+ ui_free_but(C, oldbut);
}
-
- /* ensures one button can get activated, and in case the buttons
- * draw are the same this gives O(1) lookup for each button */
- BLI_remlink(&oldblock->buttons, oldbut);
- ui_free_but(C, oldbut);
break;
}
@@ -579,11 +606,82 @@ int uiButActiveOnly(const bContext *C, uiBlock *block, uiBut *but)
return 1;
}
-void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
+/* assigns automatic keybindings to menu items for fast access
+ * (underline key in menu) */
+static void ui_menu_block_set_keyaccels(uiBlock *block)
+{
+ uiBut *but;
+
+ unsigned int meny_key_mask= 0;
+ unsigned char menu_key;
+ const char *str_pt;
+ int pass;
+ int tot_missing= 0;
+
+ /* only do it before bounding */
+ if(block->minx != block->maxx)
+ return;
+
+ for(pass=0; pass<2; pass++) {
+ /* 2 Passes, on for first letter only, second for any letter if first fails
+ * fun first pass on all buttons so first word chars always get first priority */
+
+ for(but=block->buttons.first; but; but=but->next) {
+ if(!ELEM4(but->type, BUT, MENU, BLOCK, PULLDOWN) || (but->flag & UI_HIDDEN)) {
+ /* pass */
+ }
+ else if(but->menu_key=='\0') {
+ if(but->str) {
+ for(str_pt= but->str; *str_pt; ) {
+ menu_key= tolower(*str_pt);
+ if((menu_key >= 'a' && menu_key <= 'z') && !(meny_key_mask & 1<<(menu_key-'a'))) {
+ meny_key_mask |= 1<<(menu_key-'a');
+ break;
+ }
+
+ if(pass==0) {
+ /* Skip to next delimeter on first pass (be picky) */
+ while(isalpha(*str_pt))
+ str_pt++;
+
+ if(*str_pt)
+ str_pt++;
+ }
+ else {
+ /* just step over every char second pass and find first usable key */
+ str_pt++;
+ }
+ }
+
+ if(*str_pt) {
+ but->menu_key= menu_key;
+ }
+ else {
+ /* run second pass */
+ tot_missing++;
+ }
+
+ /* if all keys have been used just exit, unlikely */
+ if(meny_key_mask == (1<<26)-1) {
+ return;
+ }
+ }
+ }
+ }
+
+ /* check if second pass is needed */
+ if(!tot_missing) {
+ break;
+ }
+ }
+}
+
+
+static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
{
uiBut *but;
IDProperty *prop;
- char buf[512], *butstr;
+ char buf[512];
/* only do it before bounding */
if(block->minx != block->maxx)
@@ -594,15 +692,10 @@ void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
prop= (but->opptr)? but->opptr->data: NULL;
if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
- butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps");
- strcpy(butstr, but->str);
- strcat(butstr, "|");
- strcat(butstr, buf);
-
+ char *butstr_orig= BLI_strdup(but->str);
+ BLI_snprintf(but->strdata, sizeof(but->strdata), "%s|%s", butstr_orig, buf);
+ MEM_freeN(butstr_orig);
but->str= but->strdata;
- BLI_strncpy(but->str, butstr, sizeof(but->strdata));
- MEM_freeN(butstr);
-
ui_check_but(but);
}
}
@@ -619,7 +712,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
* blocking, while still alowing buttons to be remade each redraw as it
* is expected by blender code */
for(but=block->buttons.first; but; but=but->next) {
- if(ui_but_update_from_old_block(C, block, but))
+ if(ui_but_update_from_old_block(C, block, &but))
ui_check_but(but);
/* temp? Proper check for greying out */
@@ -629,7 +722,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
if(but->context)
CTX_store_set((bContext*)C, but->context);
- if(ot == NULL || WM_operator_poll((bContext*)C, ot)==0) {
+ if(ot == NULL || WM_operator_poll_context((bContext*)C, ot, but->opcontext)==0) {
but->flag |= UI_BUT_DISABLED;
but->lock = 1;
}
@@ -652,6 +745,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
/* handle pending stuff */
if(block->layouts.first) uiBlockLayoutResolve(block, NULL, NULL);
ui_block_do_align(block);
+ if((block->flag & UI_BLOCK_LOOP) && (block->flag & UI_BLOCK_NUMSELECT)) ui_menu_block_set_keyaccels(block); /* could use a different flag to check */
if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block);
/* after keymaps! */
@@ -748,12 +842,16 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
if(block->flag & UI_BLOCK_LOOP)
ui_draw_menu_back(&style, block, &rect);
else if(block->panel)
- ui_draw_aligned_panel(ar, &style, block, &rect);
+ ui_draw_aligned_panel(&style, block, &rect);
/* widgets */
for(but= block->buttons.first; but; but= but->next) {
ui_but_to_pixelrect(&rect, ar, block, but);
- if(!(but->flag & UI_HIDDEN))
+
+ if(!(but->flag & UI_HIDDEN) &&
+ /* XXX: figure out why invalid coordinates happen when closing render window */
+ /* and material preview is redrawn in main window (temp fix for bug #23848) */
+ rect.xmin < rect.xmax && rect.ymin < rect.ymax)
ui_draw_but(C, ar, &style, but, &rect);
}
@@ -808,7 +906,13 @@ static void ui_is_but_sel(uiBut *but)
break;
case ROW:
case LISTROW:
- if(value == but->hardmax) push= 1;
+ /* support for rna enum buts */
+ if(but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
+ if((int)value & (int)but->hardmax) push= 1;
+ }
+ else {
+ if(value == but->hardmax) push= 1;
+ }
break;
case COL:
push= 2;
@@ -825,14 +929,14 @@ static void ui_is_but_sel(uiBut *but)
}
/* XXX 2.50 no links supported yet */
-
-static int uibut_contains_pt(uiBut *but, short *mval)
+#if 0
+static int uibut_contains_pt(uiBut *UNUSED(but), short *UNUSED(mval))
{
return 0;
}
-uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval)
+static uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval)
{
uiBut *bt;
@@ -856,7 +960,7 @@ uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval)
return NULL;
}
-
+#endif
static uiBut *ui_find_inlink(uiBlock *block, void *poin)
{
@@ -925,10 +1029,10 @@ void uiComposeLinks(uiBlock *block)
/* ************************************************ */
-void uiBlockSetButLock(uiBlock *block, int val, char *lockstr)
+void uiBlockSetButLock(uiBlock *block, int val, const char *lockstr)
{
if(val) {
- block->lock |= val;
+ block->lock= val ? 1:0;
block->lockstr= lockstr;
}
}
@@ -1084,12 +1188,12 @@ static void ui_do_active_linklines(uiBlock *block, short *mval)
if(line==act) {
if((line->flag & UI_SELECT)==0) {
line->flag |= UI_SELECT;
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
}
}
else if(line->flag & UI_SELECT) {
line->flag &= ~UI_SELECT;
- ui_draw_linkline(but, line);
+ ui_draw_linkline(line);
}
line= line->next;
}
@@ -1230,28 +1334,26 @@ int ui_is_but_float(uiBut *but)
int ui_is_but_unit(uiBut *but)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int unit_type;
-
- if(but->rnaprop==NULL)
+ int unit_type= uiButGetUnitType(but);
+
+ if(unit_type == PROP_UNIT_NONE)
return 0;
-
- unit_type = RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
-
- if (scene->unit.flag & USER_UNIT_ROT_RADIANS && unit_type == PROP_UNIT_ROTATION)
+
+#if 1 // removed so angle buttons get correct snapping
+ if (scene->unit.system_rotation == USER_UNIT_ROT_RADIANS && unit_type == PROP_UNIT_ROTATION)
return 0;
+#endif
/* for now disable time unit conversion */
if (unit_type == PROP_UNIT_TIME)
return 0;
if (scene->unit.system == USER_UNIT_NONE) {
- if (unit_type != PROP_UNIT_ROTATION)
+ if (unit_type != PROP_UNIT_ROTATION) {
return 0;
+ }
}
- if(unit_type == PROP_UNIT_NONE)
- return 0;
-
return 1;
}
@@ -1339,9 +1441,9 @@ void ui_set_but_val(uiBut *but, double value)
break;
case PROP_INT:
if(RNA_property_array_length(&but->rnapoin, prop))
- RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, value);
+ RNA_property_int_set_index(&but->rnapoin, prop, but->rnaindex, (int)value);
else
- RNA_property_int_set(&but->rnapoin, prop, value);
+ RNA_property_int_set(&but->rnapoin, prop, (int)value);
break;
case PROP_FLOAT:
if(RNA_property_array_length(&but->rnapoin, prop))
@@ -1350,7 +1452,14 @@ void ui_set_but_val(uiBut *but, double value)
RNA_property_float_set(&but->rnapoin, prop, value);
break;
case PROP_ENUM:
- RNA_property_enum_set(&but->rnapoin, prop, value);
+ if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
+ int ivalue= (int)value;
+ ivalue ^= RNA_property_enum_get(&but->rnapoin, prop); /* toggle for enum/flag buttons */
+ RNA_property_enum_set(&but->rnapoin, prop, ivalue);
+ }
+ else {
+ RNA_property_enum_set(&but->rnapoin, prop, value);
+ }
break;
default:
break;
@@ -1424,18 +1533,18 @@ int ui_get_but_string_max_length(uiBut *but)
static double ui_get_but_scale_unit(uiBut *but, double value)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int subtype= RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
- if(subtype == PROP_UNIT_LENGTH) {
+ if(unit_type == PROP_UNIT_LENGTH) {
return value * scene->unit.scale_length;
}
- else if(subtype == PROP_UNIT_AREA) {
+ else if(unit_type == PROP_UNIT_AREA) {
return value * pow(scene->unit.scale_length, 2);
}
- else if(subtype == PROP_UNIT_VOLUME) {
+ else if(unit_type == PROP_UNIT_VOLUME) {
return value * pow(scene->unit.scale_length, 3);
}
- else if(subtype == PROP_UNIT_TIME) { /* WARNING - using evil_C :| */
+ else if(unit_type == PROP_UNIT_TIME) { /* WARNING - using evil_C :| */
return FRA2TIME(value);
}
else {
@@ -1443,26 +1552,43 @@ static double ui_get_but_scale_unit(uiBut *but, double value)
}
}
+/* str will be overwritten */
+void ui_convert_to_unit_alt_name(uiBut *but, char *str, int maxlen)
+{
+ if(ui_is_but_unit(but)) {
+ int unit_type= uiButGetUnitType(but);
+ char *orig_str;
+ Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
+
+ orig_str= MEM_callocN(sizeof(char)*maxlen + 1, "textedit sub str");
+ memcpy(orig_str, str, maxlen);
+
+ bUnit_ToUnitAltName(str, maxlen, orig_str, scene->unit.system, unit_type>>16);
+
+ MEM_freeN(orig_str);
+ }
+}
+
static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double value, int pad)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
int do_split= scene->unit.flag & USER_UNIT_OPT_SPLIT;
- int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
int precision= but->a2;
if(scene->unit.scale_length<0.0001) scene->unit.scale_length= 1.0; // XXX do_versions
/* Sanity checks */
- if(precision>4) precision= 4;
+ if(precision>7) precision= 7;
else if(precision==0) precision= 2;
- bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type, do_split, pad);
+ bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type>>16, do_split, pad);
}
static float ui_get_but_step_unit(uiBut *but, float step_default)
{
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- int unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but)>>16;
float step;
step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, step_default), scene->unit.system, unit_type);
@@ -1541,6 +1667,10 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen)
if(but->a2==1) BLI_snprintf(str, maxlen, "%.1f", value);
else if(but->a2==2) BLI_snprintf(str, maxlen, "%.2f", value);
else if(but->a2==3) BLI_snprintf(str, maxlen, "%.3f", value);
+ else if(but->a2==4) BLI_snprintf(str, maxlen, "%.4f", value);
+ else if(but->a2==5) BLI_snprintf(str, maxlen, "%.5f", value);
+ else if(but->a2==6) BLI_snprintf(str, maxlen, "%.6f", value);
+ else if(but->a2==7) BLI_snprintf(str, maxlen, "%.7f", value);
else BLI_snprintf(str, maxlen, "%.4f", value);
}
else
@@ -1589,7 +1719,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
}
else if(but->type == IDPOIN) {
/* ID pointer */
- but->idpoin_func(C, (char*)str, but->idpoin_idpp);
+ but->idpoin_func(C, str, but->idpoin_idpp);
return 1;
}
else if(but->type == TEX) {
@@ -1610,25 +1740,20 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
/* number editing */
double value;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
{
char str_unit_convert[256];
- int unit_type;
+ int unit_type= uiButGetUnitType(but);
Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
- if(but->rnaprop)
- unit_type= RNA_SUBTYPE_UNIT_VALUE(RNA_property_subtype(but->rnaprop));
- else
- unit_type= 0;
-
BLI_strncpy(str_unit_convert, str, sizeof(str_unit_convert));
if(ui_is_but_unit(but)) {
/* ugly, use the draw string to get the value, this could cause problems if it includes some text which resolves to a unit */
- bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type);
+ bUnit_ReplaceString(str_unit_convert, sizeof(str_unit_convert), but->drawstr, ui_get_but_scale_unit(but, 1.0), scene->unit.system, unit_type>>16);
}
- if(BPY_eval_button(C, str_unit_convert, &value)) {
+ if(BPY_button_exec(C, str_unit_convert, &value)) {
value = ui_get_but_val(but); /* use its original value */
if(str[0])
@@ -1637,7 +1762,7 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
}
#else
value= atof(str);
-#endif
+#endif // WITH_PYTHON
if(!ui_is_but_float(but)) value= (int)floor(value + 0.5);
if(but->type==NUMABS) value= fabs(value);
@@ -1653,11 +1778,13 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
return 0;
}
-void ui_set_but_default(bContext *C, uiBut *but)
+void ui_set_but_default(bContext *C, uiBut *but, short all)
{
/* if there is a valid property that is editable... */
if (but->rnapoin.data && but->rnaprop && RNA_property_editable(&but->rnapoin, but->rnaprop)) {
- if(RNA_property_reset(&but->rnapoin, but->rnaprop, -1)) {
+ int index = (all)? -1 : but->rnaindex;
+
+ if(RNA_property_reset(&but->rnapoin, but->rnaprop, index)) {
/* perform updates required for this property */
RNA_property_update(C, &but->rnapoin, but->rnaprop);
}
@@ -1693,7 +1820,7 @@ static double soft_range_round_down(double value, double max)
void ui_set_but_soft_range(uiBut *but, double value)
{
PropertyType type;
- double softmin, softmax, step, precision;
+ double softmin, softmax /*, step, precision*/;
if(but->rnaprop) {
type= RNA_property_type(but->rnaprop);
@@ -1706,8 +1833,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
RNA_property_int_ui_range(&but->rnapoin, but->rnaprop, &imin, &imax, &istep);
softmin= (imin == INT_MIN)? -1e4: imin;
softmax= (imin == INT_MAX)? 1e4: imax;
- step= istep;
- precision= 1;
+ /*step= istep;*/ /*UNUSED*/
+ /*precision= 1;*/ /*UNUSED*/
}
else if(type == PROP_FLOAT) {
float fmin, fmax, fstep, fprecision;
@@ -1715,8 +1842,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
RNA_property_float_ui_range(&but->rnapoin, but->rnaprop, &fmin, &fmax, &fstep, &fprecision);
softmin= (fmin == -FLT_MAX)? -1e4: fmin;
softmax= (fmax == FLT_MAX)? 1e4: fmax;
- step= fstep;
- precision= fprecision;
+ /*step= fstep;*/ /*UNUSED*/
+ /*precision= fprecision;*/ /*UNUSED*/
}
else
return;
@@ -1900,7 +2027,7 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor
return block;
}
-uiBlock *uiGetBlock(char *name, ARegion *ar)
+uiBlock *uiGetBlock(const char *name, ARegion *ar)
{
uiBlock *block= ar->uiblocks.first;
@@ -1912,7 +2039,7 @@ uiBlock *uiGetBlock(char *name, ARegion *ar)
return NULL;
}
-void uiBlockSetEmboss(uiBlock *block, short dt)
+void uiBlockSetEmboss(uiBlock *block, char dt)
{
block->dt= dt;
}
@@ -2009,6 +2136,10 @@ void ui_check_but(uiBut *but)
if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value);
else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value);
else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value);
+ else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value);
+ else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value);
+ else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value);
+ else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value);
else sprintf(but->drawstr, "%s%.4f", but->str, value);
}
else {
@@ -2035,6 +2166,10 @@ void ui_check_but(uiBut *but)
if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value);
else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value);
else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value);
+ else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value);
+ else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value);
+ else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value);
+ else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value);
else sprintf(but->drawstr, "%s%.4f", but->str, value);
}
else {
@@ -2053,8 +2188,7 @@ void ui_check_but(uiBut *but)
ui_get_but_string(but, str, UI_MAX_DRAW_STR-strlen(but->str));
- strcpy(but->drawstr, but->str);
- strcat(but->drawstr, str);
+ BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%s", but->str, str);
}
break;
@@ -2101,11 +2235,6 @@ void ui_check_but(uiBut *but)
case HSVCUBE:
case HSVCIRCLE:
- {
- float rgb[3];
- ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], but->hsv, but->hsv+1, but->hsv+2);
- }
break;
default:
strncpy(but->drawstr, but->str, UI_MAX_DRAW_STR);
@@ -2152,7 +2281,7 @@ int ui_but_can_align(uiBut *but)
return !ELEM3(but->type, LABEL, OPTION, OPTIONN);
}
-static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
+static void ui_block_do_align_but(uiBut *first, int nr)
{
uiBut *prev, *but=NULL, *next;
int flag= 0, cols=0, rows=0;
@@ -2176,7 +2305,7 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
/* clear old flag */
but->flag &= ~UI_BUT_ALIGN;
-
+
if(flag==0) { /* first case */
if(next) {
if(buts_are_horiz(but, next)) {
@@ -2225,11 +2354,21 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
else { /* next button switches to new row */
if(prev && buts_are_horiz(prev, but))
- flag |= UI_BUT_ALIGN_LEFT;
+ flag |= UI_BUT_ALIGN_LEFT;
+ else {
+ flag &= ~UI_BUT_ALIGN_LEFT;
+ flag |= UI_BUT_ALIGN_TOP;
+ }
if( (flag & UI_BUT_ALIGN_TOP)==0) { /* stil top row */
- if(prev)
- flag= UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT;
+ if(prev) {
+ if(next && buts_are_horiz(but, next))
+ flag = UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT|UI_BUT_ALIGN_RIGHT;
+ else {
+ /* last button in top row */
+ flag = UI_BUT_ALIGN_DOWN|UI_BUT_ALIGN_LEFT;
+ }
+ }
else
flag |= UI_BUT_ALIGN_DOWN;
}
@@ -2262,6 +2401,10 @@ static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr)
/* the previous button is a single one in its row */
but->y2= (prev->y1+but->y2)/2.0;
prev->y1= but->y2;
+
+ but->x1= prev->x1;
+ if(next && buts_are_horiz(but, next)==0)
+ but->x2= prev->x2;
}
else {
/* the previous button is not a single one in its row */
@@ -2281,7 +2424,7 @@ void ui_block_do_align(uiBlock *block)
for(but=block->buttons.first; but;) {
if(but->alignnr) {
nr= but->alignnr;
- ui_block_do_align_but(block, but, nr);
+ ui_block_do_align_but(but, nr);
/* skip with same number */
for(; but && but->alignnr == nr; but=but->next);
@@ -2303,10 +2446,10 @@ for float buttons:
all greater values will be clamped to 4.
*/
-static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
- short slen;
+ int slen;
if(type & BUTPOIN) { /* a pointer is required */
if(poin==NULL)
@@ -2323,14 +2466,16 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
but->iconadd=0;
but->retval= retval;
- if( strlen(str)>=UI_MAX_NAME_STR-1 ) {
- but->str= MEM_callocN( strlen(str)+2, "uiDefBut");
- strcpy(but->str, str);
+
+ slen= strlen(str);
+ if(slen >= UI_MAX_NAME_STR-1) {
+ but->str= MEM_mallocN(slen+2, "ui_def_but str"); /* why +2 ? */
}
else {
but->str= but->strdata;
- strcpy(but->str, str);
}
+ memcpy(but->str, str, slen+1);
+
but->x1= x1;
but->y1= y1;
but->x2= (x1+x2);
@@ -2386,8 +2531,10 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
}
}
- if(ELEM8(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX, SEARCH_MENU, BUTM));
+ /* keep track of UI_interface.h */
+ if(ELEM7(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX, BUTM));
else if(ELEM5(but->type, SCROLL, SEPR, LINK, INLINK, FTPREVIEW));
+ else if(but->type >= SEARCH_MENU);
else but->flag |= UI_BUT_UNDO;
BLI_addtail(&block->buttons, but);
@@ -2398,7 +2545,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short
return but;
}
-uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
PropertyRNA *prop;
@@ -2434,8 +2581,11 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
else
BLI_dynstr_appendf(dynstr, "|%s %%x%d", item[i].name, item[i].value);
- if(value == item[i].value)
+ if(value == item[i].value) {
icon= item[i].icon;
+ if(!tip)
+ tip= item[i].description;
+ }
}
str= BLI_dynstr_get_cstring(dynstr);
BLI_dynstr_free(dynstr);
@@ -2452,18 +2602,18 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
for(i=0; i<totitem; i++) {
if(item[i].identifier[0] && item[i].value == (int)max) {
- str= (char*)item[i].name;
+ str= item[i].name;
icon= item[i].icon;
}
}
if(!str)
- str= (char*)RNA_property_ui_name(prop);
+ str= RNA_property_ui_name(prop);
if(free)
MEM_freeN(item);
}
else {
- str= (char*)RNA_property_ui_name(prop);
+ str= RNA_property_ui_name(prop);
icon= RNA_property_ui_icon(prop);
}
}
@@ -2478,7 +2628,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
for(i=0; i<totitem; i++) {
if(item[i].identifier[0] && item[i].value == (int)max) {
if(item[i].description[0])
- tip= (char*)item[i].description;
+ tip= item[i].description;
break;
}
}
@@ -2489,7 +2639,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
}
if(!tip)
- tip= (char*)RNA_property_ui_description(prop);
+ tip= RNA_property_ui_description(prop);
if(min == max || a1 == -1 || a2 == -1) {
if(proptype == PROP_INT) {
@@ -2532,7 +2682,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
}
else {
printf("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
- str= (char*)propname;
+ str= propname;
}
/* now create button */
@@ -2565,12 +2715,12 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
but->a1= ui_get_but_step_unit(but, but->a1);
if(freestr)
- MEM_freeN(str);
+ MEM_freeN((void *)str);
return but;
}
-uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip)
+static uiBut *ui_def_but_operator(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
wmOperatorType *ot;
@@ -2599,7 +2749,36 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext
return but;
}
-uiBut *uiDefBut(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *ui_def_but_operator_text(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
+{
+ uiBut *but;
+ wmOperatorType *ot;
+
+ ot= WM_operatortype_find(opname, 0);
+
+ if(!str) {
+ if(ot) str= ot->name;
+ else str= opname;
+ }
+
+ if ((!tip || tip[0]=='\0') && ot && ot->description) {
+ tip= ot->description;
+ }
+
+ but= ui_def_but(block, type, -1, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
+ but->optype= ot;
+ but->opcontext= opcontext;
+
+ if(!ot) {
+ but->flag |= UI_BUT_DISABLED;
+ but->lock = 1;
+ but->lockstr = "";
+ }
+
+ return but;
+}
+
+uiBut *uiDefBut(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2632,10 +2811,10 @@ static int findBitIndex(unsigned int x) {
struct AutoComplete {
int maxlen;
char *truncate;
- char *startname;
+ const char *startname;
};
-AutoComplete *autocomplete_begin(char *startname, int maxlen)
+AutoComplete *autocomplete_begin(const char *startname, int maxlen)
{
AutoComplete *autocpl;
@@ -2650,7 +2829,7 @@ AutoComplete *autocomplete_begin(char *startname, int maxlen)
void autocomplete_do_name(AutoComplete *autocpl, const char *name)
{
char *truncate= autocpl->truncate;
- char *startname= autocpl->startname;
+ const char *startname= autocpl->startname;
int a;
for(a=0; a<autocpl->maxlen-1; a++) {
@@ -2708,7 +2887,7 @@ static void autocomplete_id(bContext *C, char *str, void *arg_v)
}
}
-static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2717,39 +2896,39 @@ static uiBut *uiDefButBit(uiBlock *block, int type, int bit, int retval, char *s
return uiDefBut(block, type|BIT|bitIdx, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
}
}
-uiBut *uiDefButF(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButF(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|FLO, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitF(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|FLO, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButI(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButI(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|INT, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitI(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|INT, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButS(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButS(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|SHO, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitS(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|SHO, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButC(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButC(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefBut(block, type|CHA, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButBitC(uiBlock *block, int type, int bit, int retval, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefButBit(block, type|CHA, bit, retval, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefButR(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2759,7 +2938,7 @@ uiBut *uiDefButR(uiBlock *block, int type, int retval, char *str, short x1, shor
return but;
}
-uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefButO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -2770,8 +2949,18 @@ uiBut *uiDefButO(uiBlock *block, int type, char *opname, int opcontext, char *st
return but;
}
+uiBut *uiDefButTextO(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
+{
+ uiBut *but= ui_def_but_operator_text(block, type, opname, opcontext, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
+
+ if(but)
+ ui_check_but(but);
+
+ return but;
+}
+
/* if a1==1.0 then a2 is an extra icon blending factor (alpha 0.0 - 1.0) */
-uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, "", x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2782,7 +2971,7 @@ uiBut *uiDefIconBut(uiBlock *block, int type, int retval, int icon, short x1, sh
return but;
}
-static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2792,39 +2981,39 @@ static uiBut *uiDefIconButBit(uiBlock *block, int type, int bit, int retval, int
}
}
-uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButF(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|FLO, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitF(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|FLO, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButI(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|INT, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitI(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|INT, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButS(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|SHO, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitS(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|SHO, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButC(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconBut(block, type|CHA, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButBitC(uiBlock *block, int type, int bit, int retval, int icon, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconButBit(block, type|CHA, bit, retval, icon, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2839,7 +3028,7 @@ uiBut *uiDefIconButR(uiBlock *block, int type, int retval, int icon, short x1, s
return but;
}
-uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -2854,7 +3043,7 @@ uiBut *uiDefIconButO(uiBlock *block, int type, char *opname, int opcontext, int
}
/* Button containing both string label and icon */
-uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, poin, min, max, a1, a2, tip);
@@ -2867,7 +3056,7 @@ uiBut *uiDefIconTextBut(uiBlock *block, int type, int retval, int icon, char *st
return but;
}
-static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, char *tip)
+static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, void *poin, float min, float max, float a1, float a2, const char *tip)
{
int bitIdx= findBitIndex(bit);
if (bitIdx==-1) {
@@ -2877,39 +3066,39 @@ static uiBut *uiDefIconTextButBit(uiBlock *block, int type, int bit, int retval,
}
}
-uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButF(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|FLO, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitF(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, float *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|FLO, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButI(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|INT, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitI(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, int *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|INT, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButS(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|SHO, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitS(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, short *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|SHO, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButC(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextBut(block, type|CHA, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, char *str, short x1, short y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButBitC(uiBlock *block, int type, int bit, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, char *poin, float min, float max, float a1, float a2, const char *tip)
{
return uiDefIconTextButBit(block, type|CHA, bit, retval, icon, str, x1, y1, x2, y2, (void*) poin, min, max, a1, a2, tip);
}
-uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *str, short x1, short y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, char *tip)
+uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2, const char *tip)
{
uiBut *but;
@@ -2925,7 +3114,7 @@ uiBut *uiDefIconTextButR(uiBlock *block, int type, int retval, int icon, char *s
return but;
}
-uiBut *uiDefIconTextButO(uiBlock *block, int type, char *opname, int opcontext, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextButO(uiBlock *block, int type, const char *opname, int opcontext, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but;
@@ -3091,6 +3280,21 @@ PointerRNA *uiButGetOperatorPtrRNA(uiBut *but)
return but->opptr;
}
+void uiButSetUnitType(uiBut *but, const int unit_type)
+{
+ but->unit_type= (unsigned char)(unit_type>>16);
+}
+
+int uiButGetUnitType(uiBut *but)
+{
+ if(but->rnaprop) {
+ return RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ }
+ else {
+ return ((int)but->unit_type)<<16;
+ }
+}
+
void uiBlockSetHandleFunc(uiBlock *block, uiBlockHandleFunc func, void *arg)
{
block->handle_func= func;
@@ -3156,7 +3360,7 @@ void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg)
but->autofunc_arg= arg;
}
-uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, char *str, short x1, short y1, short x2, short y2, void *idpp, char *tip)
+uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int retval, const char *str, int x1, int y1, short x2, short y2, void *idpp, const char *tip)
{
uiBut *but= ui_def_but(block, IDPOIN, retval, str, x1, y1, x2, y2, NULL, 0.0, 0.0, 0.0, 0.0, tip);
but->idpoin_func= func;
@@ -3169,7 +3373,7 @@ uiBut *uiDefIDPoinBut(uiBlock *block, uiIDPoinFuncFP func, short blocktype, int
return but;
}
-uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3177,7 +3381,7 @@ uiBut *uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *st
return but;
}
-uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, NULL, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3189,7 +3393,7 @@ uiBut *uiDefBlockButN(uiBlock *block, uiBlockCreateFunc func, void *argN, char *
}
-uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->block_create_func= func;
@@ -3197,7 +3401,7 @@ uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, char
return but;
}
-uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
but->menu_create_func= func;
@@ -3205,7 +3409,7 @@ uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, char *str,
return but;
}
-uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3221,7 +3425,7 @@ uiBut *uiDefIconTextMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, in
return but;
}
-uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, PULLDOWN, 0, "", x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3236,7 +3440,7 @@ uiBut *uiDefIconMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, int ic
}
/* Block button containing both string label and icon */
-uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, char *str, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int icon, const char *str, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, 0, str, x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3255,7 +3459,7 @@ uiBut *uiDefIconTextBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg,
}
/* Block button containing icon */
-uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, short x1, short y1, short x2, short y2, char *tip)
+uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int retval, int icon, int x1, int y1, short x2, short y2, const char *tip)
{
uiBut *but= ui_def_but(block, BLOCK, retval, "", x1, y1, x2, y2, arg, 0.0, 0.0, 0.0, 0.0, tip);
@@ -3270,7 +3474,7 @@ uiBut *uiDefIconBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, int
return but;
}
-uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *spoin, char *tip)
+uiBut *uiDefKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *spoin, const char *tip)
{
uiBut *but= ui_def_but(block, KEYEVT|SHO, retval, str, x1, y1, x2, y2, spoin, 0.0, 0.0, 0.0, 0.0, tip);
ui_check_but(but);
@@ -3279,7 +3483,7 @@ uiBut *uiDefKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1
/* short pointers hardcoded */
/* modkeypoin will be set to KM_SHIFT, KM_ALT, KM_CTRL, KM_OSKEY bits */
-uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short y1, short x2, short y2, short *keypoin, short *modkeypoin, char *tip)
+uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, const char *str, int x1, int y1, short x2, short y2, short *keypoin, short *modkeypoin, const char *tip)
{
uiBut *but= ui_def_but(block, HOTKEYEVT|SHO, retval, str, x1, y1, x2, y2, keypoin, 0.0, 0.0, 0.0, 0.0, tip);
but->modifier_key= *modkeypoin;
@@ -3290,7 +3494,7 @@ uiBut *uiDefHotKeyevtButS(uiBlock *block, int retval, char *str, short x1, short
/* arg is pointer to string/name, use uiButSetSearchFunc() below to make this work */
/* here a1 and a2, if set, control thumbnail preview rows/cols */
-uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, short x1, short y1, short x2, short y2, float a1, float a2, char *tip)
+uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxlen, int x1, int y1, short x2, short y2, float a1, float a2, const char *tip)
{
uiBut *but= ui_def_but(block, SEARCH_MENU, retval, "", x1, y1, x2, y2, arg, 0.0, maxlen, a1, a2, tip);
@@ -3304,6 +3508,7 @@ uiBut *uiDefSearchBut(uiBlock *block, void *arg, int retval, int icon, int maxle
return but;
}
+
/* arg is user value, searchfunc and handlefunc both get it as arg */
/* if active set, button opens with this item visible and selected */
void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandleFunc bfunc, void *active)
@@ -3312,6 +3517,29 @@ void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandl
but->search_arg= arg;
uiButSetFunc(but, bfunc, arg, active);
+
+ /* search buttons show red-alert if item doesn't exist, not for menus */
+ if(0==(but->block->flag & UI_BLOCK_LOOP)) {
+ /* skip empty buttons, not all buttons need input, we only show invalid */
+ if(but->drawstr[0])
+ ui_but_search_test(but);
+ }
+}
+
+/* push a new event onto event queue to activate the given button
+ * (usually a text-field) upon entering a popup
+ */
+void uiButSetFocusOnEnter(wmWindow *win, uiBut *but)
+{
+ wmEvent event;
+
+ event= *(win->eventstate);
+ event.type= EVT_BUT_OPEN;
+ event.val= KM_PRESS;
+ event.customdata= but;
+ event.customdatafree= FALSE;
+
+ wm_event_add(win, &event);
}
/* Program Init/Exit */
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index c99622c7518..0f77b437eeb 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -84,6 +84,8 @@ int ui_but_anim_expression_set(uiBut *but, const char *str)
if(driver && driver->type == DRIVER_TYPE_PYTHON) {
BLI_strncpy(driver->expression, str, sizeof(driver->expression));
+ driver->flag |= DRIVER_FLAG_RECOMPILE;
+ WM_event_add_notifier(but->block->evil_C, NC_ANIMATION|ND_KEYFRAME, NULL);
return 1;
}
}
@@ -105,83 +107,60 @@ void ui_but_anim_autokey(bContext *C, uiBut *but, Scene *scene, float cfra)
// TODO: this should probably respect the keyingset only option for anim
if(autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
short flag = ANIM_get_keyframing_flags(scene, 1);
fcu->flag &= ~FCURVE_SELECTED;
- insert_keyframe(id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
}
}
-void uiAnimContextProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
-{
- ARegion *ar= CTX_wm_region(C);
- uiBlock *block;
- uiBut *but;
-
- memset(ptr, 0, sizeof(*ptr));
- *prop= NULL;
- *index= 0;
-
- if(ar) {
- for(block=ar->uiblocks.first; block; block=block->next) {
- for(but=block->buttons.first; but; but= but->next) {
- if((but->active || but->flag & UI_BUT_LAST_ACTIVE) && but->rnapoin.id.data) {
- *ptr= but->rnapoin;
- *prop= but->rnaprop;
- *index= but->rnaindex;
- return;
- }
- }
- }
- }
-}
-
void ui_but_anim_insert_keyframe(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_keyframe_insert_button", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_delete_keyframe(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_keyframe_delete_button", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_add_driver(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_driver_button_add", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_remove_driver(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_driver_button_remove", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_copy_driver(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_copy_driver_button", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_paste_driver(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_paste_driver_button", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_add_keyingset(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_keyingset_button_add", WM_OP_INVOKE_DEFAULT, NULL);
}
void ui_but_anim_remove_keyingset(bContext *C)
{
- /* this operator calls uiAnimContextProperty above */
+ /* this operator calls uiContextActiveProperty */
WM_operator_name_call(C, "ANIM_OT_keyingset_button_remove", WM_OP_INVOKE_DEFAULT, NULL);
}
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 2a9a1335b1f..940a9791a4e 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,10 +33,12 @@
#include "DNA_screen_types.h"
#include "BLI_math.h"
+#include "BLI_rect.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -48,6 +50,7 @@
#include "UI_interface.h"
+/* own include */
#include "interface_intern.h"
#define UI_RB_ALPHA 16
@@ -76,7 +79,7 @@ int uiGetRoundBox(void)
return roundboxtype;
}
-void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad)
+void uiDrawBox(int mode, float minx, float miny, float maxx, float maxy, float rad)
{
float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},
{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
@@ -146,7 +149,7 @@ static void round_box_shade_col(float *col1, float *col2, float fac)
/* linear horizontal shade within button or in outline */
/* view2d scrollers use it */
-void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown)
+void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown)
{
float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},
{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
@@ -253,7 +256,7 @@ void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy
/* linear vertical shade within button or in outline */
/* view2d scrollers use it */
-void gl_round_box_vertical_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight)
+void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight)
{
float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},
{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};
@@ -371,20 +374,21 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad)
glEnable( GL_LINE_SMOOTH );
glEnable( GL_BLEND );
- gl_round_box(GL_LINE_LOOP, minx, miny, maxx, maxy, rad);
+ uiDrawBox(GL_LINE_LOOP, minx, miny, maxx, maxy, rad);
glDisable( GL_BLEND );
glDisable( GL_LINE_SMOOTH );
}
/* plain fake antialiased unfilled round rectangle */
-void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad, float asp)
+#if 0 /* UNUSED 2.5 */
+static void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad, float asp)
{
float color[4], alpha;
float raddiff;
int i, passes=4;
- /* get the colour and divide up the alpha */
+ /* get the color and divide up the alpha */
glGetFloatv(GL_CURRENT_COLOR, color);
alpha = 1; //color[3];
color[3]= 0.5*alpha/(float)passes;
@@ -397,7 +401,7 @@ void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad
/* draw lots of lines on top of each other */
for (i=passes; i>=(-passes); i--) {
- gl_round_box(GL_LINE_LOOP, minx, miny, maxx, maxy, rad+(i*raddiff));
+ uiDrawBox(GL_LINE_LOOP, minx, miny, maxx, maxy, rad+(i*raddiff));
}
glDisable( GL_BLEND );
@@ -405,6 +409,7 @@ void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad
color[3] = alpha;
glColor4fv(color);
}
+#endif
/* (old, used in outliner) plain antialiased filled box */
void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad)
@@ -419,13 +424,13 @@ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad)
}
/* solid part */
- gl_round_box(GL_POLYGON, minx, miny, maxx, maxy, rad);
+ uiDrawBox(GL_POLYGON, minx, miny, maxx, maxy, rad);
/* set antialias line */
glEnable( GL_LINE_SMOOTH );
glEnable( GL_BLEND );
- gl_round_box(GL_LINE_LOOP, minx, miny, maxx, maxy, rad);
+ uiDrawBox(GL_LINE_LOOP, minx, miny, maxx, maxy, rad);
glDisable( GL_BLEND );
glDisable( GL_LINE_SMOOTH );
@@ -459,7 +464,7 @@ void uiEmboss(float x1, float y1, float x2, float y2, int sel)
/* ************** SPECIAL BUTTON DRAWING FUNCTIONS ************* */
-void ui_draw_but_IMAGE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect)
+void ui_draw_but_IMAGE(ARegion *UNUSED(ar), uiBut *UNUSED(but), uiWidgetColors *UNUSED(wcol), rcti *rect)
{
extern char datatoc_splash_png[];
extern int datatoc_splash_png_size;
@@ -515,8 +520,8 @@ static void ui_draw_but_CHARTAB(uiBut *but)
int result = 0;
int charmax = G.charmax;
- /* <builtin> font in use. There are TTF <builtin> and non-TTF <builtin> fonts */
- if(!strcmp(G.selfont->name, "<builtin>"))
+ /* FO_BUILTIN_NAME font in use. There are TTF FO_BUILTIN_NAME and non-TTF FO_BUILTIN_NAME fonts */
+ if(!strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
if(G.ui_international == TRUE)
{
@@ -547,11 +552,9 @@ static void ui_draw_but_CHARTAB(uiBut *but)
cs = G.charstart;
- /* Set the font, in case it is not <builtin> font */
- if(G.selfont && strcmp(G.selfont->name, "<builtin>"))
+ /* Set the font, in case it is not FO_BUILTIN_NAME font */
+ if(G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
- char tmpStr[256];
-
// Is the font file packed, if so then use the packed file
if(G.selfont->packedfile)
{
@@ -560,10 +563,11 @@ static void ui_draw_but_CHARTAB(uiBut *but)
}
else
{
+ char tmpStr[256];
int err;
- strcpy(tmpStr, G.selfont->name);
- BLI_path_abs(tmpStr, G.sce);
+ BLI_strncpy(tmpStr, G.selfont->name, sizeof(tmpStr));
+ BLI_path_abs(tmpStr, G.main->name);
err = FTF_SetFont((unsigned char *)tmpStr, 0, 14.0);
}
}
@@ -604,9 +608,9 @@ static void ui_draw_but_CHARTAB(uiBut *but)
memset(wstr, 0, sizeof(wchar_t)*2);
memset(ustr, 0, 16);
- // Set the font to be either unicode or <builtin>
+ // Set the font to be either unicode or FO_BUILTIN_NAME
wstr[0] = cs;
- if(strcmp(G.selfont->name, "<builtin>"))
+ if(strcmp(G.selfont->name, FO_BUILTIN_NAME))
{
wcs2utf8s((char *)ustr, (wchar_t *)wstr);
}
@@ -623,7 +627,7 @@ static void ui_draw_but_CHARTAB(uiBut *but)
}
}
- if((G.selfont && strcmp(G.selfont->name, "<builtin>")) || (G.selfont && !strcmp(G.selfont->name, "<builtin>") && G.ui_international == TRUE))
+ if((G.selfont && strcmp(G.selfont->name, FO_BUILTIN_NAME)) || (G.selfont && !strcmp(G.selfont->name, FO_BUILTIN_NAME) && G.ui_international == TRUE))
{
float wid;
float llx, lly, llz, urx, ury, urz;
@@ -710,10 +714,10 @@ static void draw_scope_end(rctf *rect, GLint *scissor)
/* outline */
glColor4f(0.f, 0.f, 0.f, 0.5f);
uiSetRoundBox(15);
- gl_round_box(GL_LINE_LOOP, rect->xmin-1, rect->ymin, rect->xmax+1, rect->ymax+1, 3.0f);
+ uiDrawBox(GL_LINE_LOOP, rect->xmin-1, rect->ymin, rect->xmax+1, rect->ymax+1, 3.0f);
}
-void histogram_draw_one(float r, float g, float b, float alpha, float x, float y, float w, float h, float *data, int res)
+static void histogram_draw_one(float r, float g, float b, float alpha, float x, float y, float w, float h, float *data, int res)
{
int i;
@@ -746,7 +750,7 @@ void histogram_draw_one(float r, float g, float b, float alpha, float x, float y
glDisable(GL_LINE_SMOOTH);
}
-void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Histogram *hist = (Histogram *)but->poin;
int res = hist->x_resolution;
@@ -771,7 +775,7 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *
glColor4f(0.f, 0.f, 0.f, 0.3f);
uiSetRoundBox(15);
- gl_round_box(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
+ uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
glColor4f(1.f, 1.f, 1.f, 0.08f);
/* draw grid lines here */
@@ -799,14 +803,14 @@ void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *
draw_scope_end(&rect, scissor);
}
-void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Scopes *scopes = (Scopes *)but->poin;
rctf rect;
int i, c;
float w, w3, h, alpha, yofs;
GLint scissor[4];
- float colors[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
+ float colors[3][3]= MAT3_UNITY;
float colorsycc[3][3] = {{1,0,1},{1,1,0},{0,1,1}};
float colors_alpha[3][3], colorsycc_alpha[3][3]; /* colors pre multiplied by alpha for speed up */
float min, max;
@@ -840,7 +844,7 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *r
glColor4f(0.f, 0.f, 0.f, 0.3f);
uiSetRoundBox(15);
- gl_round_box(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
+ uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
/* need scissor test, waveform can draw outside of boundary */
@@ -854,7 +858,7 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *r
sprintf(str,"%-3d",i*20);
str[3]='\0';
fdrawline(rect.xmin+22, yofs+(i/5.f)*h, rect.xmax+1, yofs+(i/5.f)*h);
- BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str);
+ BLF_draw_default(rect.xmin+1, yofs-5+(i/5.f)*h, 0, str, sizeof(str)-1);
/* in the loop because blf_draw reset it */
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
@@ -959,17 +963,17 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *r
draw_scope_end(&rect, scissor);
}
-float polar_to_x(float center, float diam, float ampli, float angle)
+static float polar_to_x(float center, float diam, float ampli, float angle)
{
return center + diam * ampli * cosf(angle);
}
-float polar_to_y(float center, float diam, float ampli, float angle)
+static float polar_to_y(float center, float diam, float ampli, float angle)
{
return center + diam * ampli * sinf(angle);
}
-void vectorscope_draw_target(float centerx, float centery, float diam, float r, float g, float b)
+static void vectorscope_draw_target(float centerx, float centery, float diam, float r, float g, float b)
{
float y,u,v;
float tangle=0.f, tampli;
@@ -1022,7 +1026,7 @@ void vectorscope_draw_target(float centerx, float centery, float diam, float r,
glEnd();
}
-void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *recti)
+void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *recti)
{
Scopes *scopes = (Scopes *)but->poin;
rctf rect;
@@ -1051,7 +1055,7 @@ void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti
glColor4f(0.f, 0.f, 0.f, 0.3f);
uiSetRoundBox(15);
- gl_round_box(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
+ uiDrawBox(GL_POLYGON, rect.xmin-1, rect.ymin-1, rect.xmax+1, rect.ymax+1, 3.0f);
/* need scissor test, hvectorscope can draw outside of boundary */
glGetIntegerv(GL_VIEWPORT, scissor);
@@ -1104,7 +1108,7 @@ void ui_draw_but_VECTORSCOPE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti
glDisable(GL_BLEND);
}
-void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *wcol, rcti *rect)
+void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect)
{
ColorBand *coba;
CBData *cbd;
@@ -1237,7 +1241,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* backdrop */
glColor3ubv((unsigned char*)wcol->inner);
uiSetRoundBox(15);
- gl_round_box(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f);
+ uiDrawBox(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f);
/* sphere color */
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffn);
@@ -1340,7 +1344,7 @@ static void ui_draw_but_curve_grid(rcti *rect, float zoomx, float zoomy, float o
}
-static void glColor3ubvShade(char *col, int shade)
+static void glColor3ubvShade(unsigned char *col, int shade)
{
glColor3ub(col[0]-shade>0?col[0]-shade:0,
col[1]-shade>0?col[1]-shade:0,
@@ -1354,6 +1358,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
CurveMapPoint *cmp;
float fx, fy, fac[2], zoomx, zoomy, offsx, offsy;
GLint scissor[4];
+ rcti scissor_new;
int a;
cumap= (CurveMapping *)(but->editcumap? but->editcumap: but->poin);
@@ -1361,7 +1366,12 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
/* need scissor test, curve can draw outside of boundary */
glGetIntegerv(GL_VIEWPORT, scissor);
- glScissor(ar->winrct.xmin + rect->xmin, ar->winrct.ymin+rect->ymin, rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+ scissor_new.xmin= ar->winrct.xmin + rect->xmin;
+ scissor_new.ymin= ar->winrct.ymin + rect->ymin;
+ scissor_new.xmax= ar->winrct.xmin + rect->xmax;
+ scissor_new.ymax= ar->winrct.ymin + rect->ymax;
+ BLI_isect_rcti(&scissor_new, &ar->winrct, &scissor_new);
+ glScissor(scissor_new.xmin, scissor_new.ymin, scissor_new.xmax-scissor_new.xmin, scissor_new.ymax-scissor_new.ymin);
/* calculate offset and zoom */
zoomx= (rect->xmax-rect->xmin-2.0*but->aspect)/(cumap->curr.xmax - cumap->curr.xmin);
@@ -1371,7 +1381,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
/* backdrop */
if(cumap->flag & CUMA_DO_CLIP) {
- glColor3ubvShade(wcol->inner, -20);
+ glColor3ubvShade((unsigned char *)wcol->inner, -20);
glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
glColor3ubv((unsigned char*)wcol->inner);
glRectf(rect->xmin + zoomx*(cumap->clipr.xmin-offsx),
@@ -1385,13 +1395,13 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
}
/* grid, every .25 step */
- glColor3ubvShade(wcol->inner, -16);
+ glColor3ubvShade((unsigned char *)wcol->inner, -16);
ui_draw_but_curve_grid(rect, zoomx, zoomy, offsx, offsy, 0.25f);
/* grid, every 1.0 step */
- glColor3ubvShade(wcol->inner, -24);
+ glColor3ubvShade((unsigned char *)wcol->inner, -24);
ui_draw_but_curve_grid(rect, zoomx, zoomy, offsx, offsy, 1.0f);
/* axes */
- glColor3ubvShade(wcol->inner, -50);
+ glColor3ubvShade((unsigned char *)wcol->inner, -50);
glBegin(GL_LINES);
glVertex2f(rect->xmin, rect->ymin + zoomy*(-offsy));
glVertex2f(rect->xmax, rect->ymin + zoomy*(-offsy));
@@ -1403,7 +1413,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
if (but->a1 != -1) {
if (but->a1 == UI_GRAD_H) {
rcti grid;
- float col[3];
+ float col[3]= {0.0f, 0.0f, 0.0f}; /* dummy arg */
grid.xmin = rect->xmin + zoomx*(-offsx);
grid.xmax = rect->xmax + zoomx*(-offsx);
@@ -1567,6 +1577,7 @@ void uiDrawBoxShadow(unsigned char alpha, float minx, float miny, float maxx, fl
void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
{
+ int i;
float rad;
float a;
char alpha= 2;
@@ -1577,20 +1588,21 @@ void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
else
rad= radius;
-
- if(select) a= 12.0f*aspect; else a= 12.0f*aspect;
- for(; a>0.0f; a-=aspect) {
+
+ i= 12;
+ if(select) a= i*aspect; else a= i*aspect;
+ for(; i--; a-=aspect) {
/* alpha ranges from 2 to 20 or so */
glColor4ub(0, 0, 0, alpha);
alpha+= 2;
- gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
+ uiDrawBox(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
}
/* outline emphasis */
glEnable( GL_LINE_SMOOTH );
glColor4ub(0, 0, 0, 100);
- gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
+ uiDrawBox(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius+0.5f);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 9b3b194d74b..a556d8322b2 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,6 +29,7 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -37,6 +38,8 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "PIL_time.h"
#include "BKE_colortools.h"
@@ -44,6 +47,7 @@
#include "BKE_idprop.h"
#include "BKE_report.h"
#include "BKE_texture.h"
+#include "BKE_unit.h"
#include "ED_screen.h"
#include "ED_util.h"
@@ -322,18 +326,22 @@ static void ui_apply_autokey_undo(bContext *C, uiBut *but)
{
Scene *scene= CTX_data_scene(C);
uiAfterFunc *after;
- char *str= NULL;
if(but->flag & UI_BUT_UNDO) {
+ const char *str= NULL;
+
/* define which string to use for undo */
if ELEM(but->type, LINK, INLINK) str= "Add button link";
else if ELEM(but->type, MENU, ICONTEXTROW) str= but->drawstr;
else if(but->drawstr[0]) str= but->drawstr;
else str= but->tip;
- }
- /* delayed, after all other funcs run, popups are closed, etc */
- if(str) {
+ /* fallback, else we dont get an undo! */
+ if(str == NULL || str[0] == '\0') {
+ str= "Unknown Action";
+ }
+
+ /* delayed, after all other funcs run, popups are closed, etc */
after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc");
BLI_strncpy(after->undostr, str, sizeof(after->undostr));
BLI_addtail(&UIAfterFuncs, after);
@@ -428,7 +436,7 @@ static void ui_apply_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data
data->applied= 1;
}
-static void ui_apply_but_TOG(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data)
+static void ui_apply_but_TOG(bContext *C, uiBut *but, uiHandleButtonData *data)
{
double value;
int w, lvalue, push;
@@ -644,13 +652,12 @@ static int ui_but_mouse_inside_icon(uiBut *but, ARegion *ar, wmEvent *event)
return BLI_in_rcti(&rect, x, y);
}
-#define UI_DRAG_THRESHOLD 3
static int ui_but_start_drag(bContext *C, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
/* prevent other WM gestures to start while we try to drag */
WM_gestures_remove(C);
- if( ABS(data->dragstartx - event->x) + ABS(data->dragstarty - event->y) > UI_DRAG_THRESHOLD ) {
+ if( ABS(data->dragstartx - event->x) + ABS(data->dragstarty - event->y) > U.dragthreshold ) {
wmDrag *drag;
button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -895,7 +902,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
case BUT_TOGDUAL:
case OPTION:
case OPTIONN:
- ui_apply_but_TOG(C, block, but, data);
+ ui_apply_but_TOG(C, but, data);
break;
case ROW:
case LISTROW:
@@ -1066,19 +1073,19 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
/* text/string and ID data */
else if(ELEM3(but->type, TEX, IDPOIN, SEARCH_MENU)) {
- uiHandleButtonData *data= but->active;
+ uiHandleButtonData *active_data= but->active;
if(but->poin==NULL && but->rnapoin.data==NULL);
else if(mode=='c') {
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
- BLI_strncpy(buf, data->str, UI_MAX_DRAW_STR);
- WM_clipboard_text_set(data->str, 0);
- data->cancel= 1;
+ BLI_strncpy(buf, active_data->str, UI_MAX_DRAW_STR);
+ WM_clipboard_text_set(active_data->str, 0);
+ active_data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
else {
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
- BLI_strncpy(data->str, buf, data->maxlen);
+ BLI_strncpy(active_data->str, buf, active_data->maxlen);
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
}
@@ -1279,7 +1286,7 @@ static int ui_textedit_type_ascii(uiBut *but, uiHandleButtonData *data, char asc
return changed;
}
-void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump)
+static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int select, int jump)
{
char *str;
int len;
@@ -1314,10 +1321,11 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
} else {
if(select) {
/* make a selection, starting from the cursor position */
+ int tlen;
but->selsta = but->pos;
but->pos++;
- if(but->pos>strlen(str)) but->pos= strlen(str);
+ if(but->pos > (tlen= strlen(str))) but->pos= tlen;
but->selend = but->pos;
} else if(jump) {
@@ -1329,8 +1337,9 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
if(test_special_char(str[but->pos])) break;
}
} else {
+ int tlen;
but->pos++;
- if(but->pos>strlen(str)) but->pos= strlen(str);
+ if(but->pos > (tlen= strlen(str))) but->pos= tlen;
}
}
}
@@ -1382,7 +1391,7 @@ void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction, int s
}
}
-void ui_textedit_move_end(uiBut *but, uiHandleButtonData *data, int direction, int select)
+static void ui_textedit_move_end(uiBut *but, uiHandleButtonData *data, int direction, int select)
{
char *str;
@@ -1555,7 +1564,8 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
int i;
for(i=0; data->str[i]; i++) {
if(!isascii(data->str[i])) {
- data->str[i]= '\0';
+ /* no stripping actually: just convert to alt name */
+ ui_convert_to_unit_alt_name(but, data->str, data->maxlen);
break;
}
}
@@ -1586,7 +1596,7 @@ static void ui_textedit_begin(bContext *C, uiBut *but, uiHandleButtonData *data)
static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
{
if(but) {
- if(ui_is_utf8_but(but)) {
+ if(!ui_is_utf8_but(but)) {
int strip= BLI_utf8_invalid_strip(but->editstr, strlen(but->editstr));
/* not a file?, strip non utf-8 chars */
if(strip) {
@@ -1814,6 +1824,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
/* only update when typing for TAB key */
if(update && data->interactive) ui_apply_button(C, block, but, data, 1);
else ui_check_but(but);
+ but->changed= TRUE;
if(data->searchbox)
ui_searchbox_update(C, data->searchbox, but, 1); /* 1 = reset */
@@ -2075,6 +2086,12 @@ static int ui_do_but_HOTKEYEVT(bContext *C, uiBut *but, uiHandleButtonData *data
button_activate_state(C, but, BUTTON_STATE_EXIT);
return WM_UI_HANDLER_BREAK;
}
+ else if(event->type == ESCKEY) {
+ data->cancel= 1;
+ data->escapecancel= 1;
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ }
+
}
}
@@ -2194,26 +2211,47 @@ static int ui_do_but_EXIT(bContext *C, uiBut *but, uiHandleButtonData *data, wmE
}
/* var names match ui_numedit_but_NUM */
-static float ui_numedit_apply_snapf(float tempf, float softmin, float softmax, float softrange, int snap)
+static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, float softmax, float softrange, int snap)
{
- if(tempf==softmin || tempf==softmax)
- return tempf;
+ if(tempf==softmin || tempf==softmax || snap==0) {
+ /* pass */
+ }
+ else {
+ float fac= 1.0f;
+
+ if(ui_is_but_unit(but)) {
+ Scene *scene= CTX_data_scene((bContext *)but->block->evil_C);
+ int unit_type= uiButGetUnitType(but)>>16;
+
+ if(bUnit_IsValid(scene->unit.system, unit_type)) {
+ fac= (float)bUnit_BaseScalar(scene->unit.system, unit_type);
+ if(ELEM3(unit_type, B_UNIT_LENGTH, B_UNIT_AREA, B_UNIT_VOLUME)) {
+ fac /= scene->unit.scale_length;
+ }
+ }
+ }
- switch(snap) {
- case 0:
- break;
- case 1:
- if(tempf==softmin || tempf==softmax) { }
- else if(softrange < 2.10) tempf= 0.1*floor(10*tempf);
- else if(softrange < 21.0) tempf= floor(tempf);
- else tempf= 10.0*floor(tempf/10.0);
- break;
- case 2:
- if(tempf==softmin || tempf==softmax) { }
- else if(softrange < 2.10) tempf= 0.01*floor(100.0*tempf);
- else if(softrange < 21.0) tempf= 0.1*floor(10.0*tempf);
- else tempf= floor(tempf);
- break;
+ if(fac != 1.0f) {
+ /* snap in unit-space */
+ tempf /= fac;
+ softmin /= fac;
+ softmax /= fac;
+ softrange /= fac;
+ }
+
+ if(snap==1) {
+ if(softrange < 2.10) tempf= 0.1*floor(10*tempf);
+ else if(softrange < 21.0) tempf= floor(tempf);
+ else tempf= 10.0*floor(tempf/10.0);
+ }
+ else if(snap==2) {
+ if(softrange < 2.10) tempf= 0.01*floor(100.0*tempf);
+ else if(softrange < 21.0) tempf= 0.1*floor(10.0*tempf);
+ else tempf= floor(tempf);
+ }
+
+ if(fac != 1.0f)
+ tempf *= fac;
}
return tempf;
@@ -2266,7 +2304,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
if(ui_is_but_float(but)) {
fac *= 0.01*but->a1;
tempf = data->startvalue + ((mx - data->dragstartx) * fac);
- tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, softrange, snap);
+ tempf= ui_numedit_apply_snapf(but, tempf, softmin, softmax, softrange, snap);
#if 1 /* fake moving the click start, nicer for dragging back after passing the limit */
if(tempf < softmin) {
@@ -2359,7 +2397,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
}
else {
temp= 0;
- tempf= ui_numedit_apply_snapf(tempf, softmin, softmax, softrange, snap);
+ tempf= ui_numedit_apply_snapf(but, tempf, softmin, softmax, softrange, snap);
CLAMP(tempf, softmin, softmax);
@@ -2806,17 +2844,18 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wm
}
else if(but->type==COL) {
if( ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->alt) {
+ float *hsv= ui_block_hsv_get(but->block);
float col[3];
ui_get_but_vectorf(but, col);
- rgb_to_hsv(col[0], col[1], col[2], but->hsv, but->hsv+1, but->hsv+2);
+ rgb_to_hsv_compat(col[0], col[1], col[2], hsv, hsv+1, hsv+2);
if(event->type==WHEELDOWNMOUSE)
- but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f);
+ hsv[2]= CLAMPIS(hsv[2]-0.05f, 0.0f, 1.0f);
else
- but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f);
+ hsv[2]= CLAMPIS(hsv[2]+0.05f, 0.0f, 1.0f);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], data->vec, data->vec+1, data->vec+2);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], data->vec, data->vec+1, data->vec+2);
ui_set_but_vectorf(but, data->vec);
button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -2946,7 +2985,8 @@ static int ui_do_but_NORMAL(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx, int my)
{
- float rgb[3], hsv[3];
+ float rgb[3];
+ float *hsv= ui_block_hsv_get(but->block);
float x, y;
int changed= 1;
int color_profile = but->block->color_profile;
@@ -2955,51 +2995,53 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx,
if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
color_profile = BLI_PR_NONE;
}
-
+
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
+
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
/* relative position within box */
x= ((float)mx-but->x1)/(but->x2-but->x1);
y= ((float)my-but->y1)/(but->y2-but->y1);
CLAMP(x, 0.0, 1.0);
CLAMP(y, 0.0, 1.0);
-
- if(but->a1==0) {
- hsv[2]= x;
- hsv[1]= y;
- }
- else if(but->a1==1) {
- hsv[0]= x;
- hsv[2]= y;
- }
- else if(but->a1==2) {
- hsv[0]= x;
- hsv[1]= y;
- }
- else if(but->a1==3) {
- hsv[0]= x;
- }
- else if(but->a1==4) {
- hsv[1]= x;
- }
- else if(but->a1==5) {
- hsv[2]= x;
- }
- else if (but->a1==9){
- float range;
-
- /* vertical 'value' strip */
+ switch((int)but->a1) {
+ case UI_GRAD_SV:
+ hsv[2]= x;
+ hsv[1]= y;
+ break;
+ case UI_GRAD_HV:
+ hsv[0]= x;
+ hsv[2]= y;
+ break;
+ case UI_GRAD_HS:
+ hsv[0]= x;
+ hsv[1]= y;
+ break;
+ case UI_GRAD_H:
+ hsv[0]= x;
+ break;
+ case UI_GRAD_S:
+ hsv[1]= x;
+ break;
+ case UI_GRAD_V:
+ hsv[2]= x;
+ break;
+ case UI_GRAD_V_ALT:
+ /* vertical 'value' strip */
+
/* exception only for value strip - use the range set in but->min/max */
- range = but->softmax - but->softmin;
- hsv[2] = y*range + but->softmin;
+ hsv[2] = y * (but->softmax - but->softmin) + but->softmin;
if (color_profile)
hsv[2] = srgb_to_linearrgb(hsv[2]);
if (hsv[2] > but->softmax)
hsv[2] = but->softmax;
+ break;
+ default:
+ assert(!"invalid hsv type");
}
hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
@@ -3033,23 +3075,25 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
- if (but->a1==9){
- float rgb[3], hsv[3], def_hsv[3];
- float *def;
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ if (but->a1==UI_GRAD_V_ALT){
int len;
/* reset only value */
len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
if (len >= 3) {
+ float rgb[3], def_hsv[3];
+ float *def;
+ float *hsv= ui_block_hsv_get(but->block);
def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
hsv_to_rgb(hsv[0], hsv[1], def_hsv[2], rgb, rgb+1, rgb+2);
ui_set_but_vectorf(but, rgb);
@@ -3087,13 +3131,15 @@ static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx
{
rcti rect;
int changed= 1;
- float rgb[3], hsv[3];
+ float rgb[3];
+ float hsv[3];
rect.xmin= but->x1; rect.xmax= but->x2;
rect.ymin= but->y1; rect.ymax= but->y2;
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ copy_v3_v3(hsv, ui_block_hsv_get(but->block));
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
/* exception, when using color wheel in 'locked' value state:
* allow choosing a hue for black values, by giving a tiny increment */
@@ -3151,22 +3197,24 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
- float rgb[3], hsv[3], def_hsv[3];
- float *def;
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
int len;
/* reset only saturation */
len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
if (len >= 3) {
+ float rgb[3], def_hsv[3];
+ float *def;
+ float *hsv= ui_block_hsv_get(but->block);
def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
hsv_to_rgb(hsv[0], def_hsv[1], hsv[2], rgb, rgb+1, rgb+2);
ui_set_but_vectorf(but, rgb);
@@ -3186,12 +3234,14 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
}
/* XXX hardcoded keymap check.... */
else if(event->type == WHEELDOWNMOUSE) {
- but->hsv[2]= CLAMPIS(but->hsv[2]-0.05f, 0.0f, 1.0f);
+ float *hsv= ui_block_hsv_get(but->block);
+ hsv[2]= CLAMPIS(hsv[2]-0.05f, 0.0f, 1.0f);
ui_set_but_hsv(but); // converts to rgb
ui_numedit_apply(C, block, but, data);
}
else if(event->type == WHEELUPMOUSE) {
- but->hsv[2]= CLAMPIS(but->hsv[2]+0.05f, 0.0f, 1.0f);
+ float *hsv= ui_block_hsv_get(but->block);
+ hsv[2]= CLAMPIS(hsv[2]+0.05f, 0.0f, 1.0f);
ui_set_but_hsv(but); // converts to rgb
ui_numedit_apply(C, block, but, data);
}
@@ -3411,7 +3461,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
if(event->type==LEFTMOUSE && event->val==KM_PRESS) {
CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
- CurveMapPoint *cmp= cuma->curve;
+ CurveMapPoint *cmp;
float fx, fy, zoomx, zoomy, offsx, offsy;
float dist, mindist= 200.0f; // 14 pixels radius
int sel= -1;
@@ -3534,7 +3584,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
return WM_UI_HANDLER_CONTINUE;
}
-static int in_scope_resize_zone(uiBut *but, int x, int y)
+static int in_scope_resize_zone(uiBut *but, int UNUSED(x), int y)
{
// bottom corner return (x > but->x2 - SCOPE_RESIZE_PAD) && (y < but->y1 + SCOPE_RESIZE_PAD);
return (y < but->y1 + SCOPE_RESIZE_PAD);
@@ -3593,7 +3643,8 @@ static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
Histogram *hist = (Histogram *)but->poin;
hist->ymax = 1.f;
@@ -3675,7 +3726,8 @@ static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleB
return WM_UI_HANDLER_BREAK;
}
- else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
Scopes *scopes = (Scopes *)but->poin;
scopes->wavefrm_yfac = 1.f;
@@ -3709,13 +3761,13 @@ static int ui_numedit_but_VECTORSCOPE(uiBut *but, uiHandleButtonData *data, int
Scopes *scopes = (Scopes *)but->poin;
rcti rect;
int changed= 1;
- float dx, dy;
+ /* float dx, dy; */
rect.xmin= but->x1; rect.xmax= but->x2;
rect.ymin= but->y1; rect.ymax= but->y2;
- dx = mx - data->draglastx;
- dy = my - data->draglasty;
+ /* dx = mx - data->draglastx; */
+ /* dy = my - data->draglasty; */
if (in_scope_resize_zone(but, data->dragstartx, data->dragstarty)) {
/* resize vectorscope widget itself */
@@ -3773,7 +3825,7 @@ static int ui_do_but_VECTORSCOPE(bContext *C, uiBlock *block, uiBut *but, uiHand
}
#ifdef INTERNATIONAL
-static int ui_do_but_CHARTAB(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
+static int ui_do_but_CHARTAB(bContext *UNUSED(C), uiBlock *UNUSED(block), uiBut *UNUSED(but), uiHandleButtonData *UNUSED(data), wmEvent *UNUSED(event))
{
/* XXX 2.50 bad global and state access */
#if 0
@@ -3911,34 +3963,36 @@ static int ui_do_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data, wmE
return WM_UI_HANDLER_CONTINUE;
}
-static void but_shortcut_name_func(bContext *C, void *arg1, int event)
+static void but_shortcut_name_func(bContext *C, void *arg1, int UNUSED(event))
{
uiBut *but = (uiBut *)arg1;
-
- char buf[512], *butstr, *cpoin;
-
+
if (but->optype) {
+ char buf[512], *cpoin;
+
IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
/* complex code to change name of button */
if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
-
- butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps");
-
+ wmKeyMap *km= NULL;
+ char *butstr_orig;
+
// XXX but->str changed... should not, remove the hotkey from it
cpoin= strchr(but->str, '|');
if(cpoin) *cpoin= 0;
-
- strcpy(butstr, but->str);
- strcat(butstr, "|");
- strcat(butstr, buf);
-
+
+ butstr_orig= BLI_strdup(but->str);
+ BLI_snprintf(but->strdata, sizeof(but->strdata), "%s|%s", butstr_orig, buf);
+ MEM_freeN(butstr_orig);
but->str= but->strdata;
- BLI_strncpy(but->str, butstr, sizeof(but->strdata));
- MEM_freeN(butstr);
-
+
ui_check_but(but);
- } else {
+
+ /* set the keymap editable else the key wont save */
+ WM_key_event_operator_id(C, but->optype->idname, but->opcontext, prop, 1, &km);
+ WM_keymap_copy_to_user(km);
+ }
+ else {
/* shortcut was removed */
cpoin= strchr(but->str, '|');
if(cpoin) *cpoin= 0;
@@ -3964,14 +4018,14 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg)
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
uiBlockSetHandleFunc(block, but_shortcut_name_func, but);
- uiBlockSetFlag(block, UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
+ uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
uiBlockSetDirection(block, UI_CENTER);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
- uiPopupBoundsBlock(block, 6, 100, 10);
+ uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
return block;
@@ -3990,35 +4044,39 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg)
km = WM_keymap_guess_opname(C, but->optype->idname);
kmi = WM_keymap_add_item(km, but->optype->idname, AKEY, KM_PRESS, 0, 0);
- MEM_freeN(kmi->properties);
- if (prop)
- kmi->properties= IDP_CopyProperty(prop);
-
+
+ if (prop) {
+ prop= IDP_CopyProperty(prop);
+ }
+
+ /* prop can be NULL */
+ WM_keymap_properties_reset(kmi, prop);
+
RNA_pointer_create(NULL, &RNA_KeyMapItem, kmi, &ptr);
-
+
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
uiBlockSetHandleFunc(block, but_shortcut_name_func, but);
uiBlockSetFlag(block, UI_BLOCK_RET_1);
uiBlockSetDirection(block, UI_CENTER);
-
+
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", 0);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
- uiPopupBoundsBlock(block, 6, 100, 10);
+ uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
return block;
}
-static void popup_change_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void popup_change_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
button_timers_tooltip_remove(C, but);
uiPupBlock(C, menu_change_shortcut, but);
}
-static void remove_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void remove_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
wmKeyMap *km;
@@ -4032,7 +4090,7 @@ static void remove_shortcut_func(bContext *C, void *arg1, void *arg2)
but_shortcut_name_func(C, but, 0);
}
-static void popup_add_shortcut_func(bContext *C, void *arg1, void *arg2)
+static void popup_add_shortcut_func(bContext *C, void *arg1, void *UNUSED(arg2))
{
uiBut *but = (uiBut *)arg1;
button_timers_tooltip_remove(C, but);
@@ -4045,7 +4103,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiPopupMenu *pup;
uiLayout *layout;
int length;
- char *name;
+ const char *name;
if((but->rnapoin.data && but->rnaprop)==0 && but->optype==NULL)
return 0;
@@ -4053,42 +4111,47 @@ static int ui_but_menu(bContext *C, uiBut *but)
button_timers_tooltip_remove(C, but);
if(but->rnaprop)
- name= (char*)RNA_property_ui_name(but->rnaprop);
+ name= RNA_property_ui_name(but->rnaprop);
else if (but->optype)
name= but->optype->name;
else
name= "<needs_name>"; // XXX - should never happen.
- pup= uiPupMenuBegin(C, name, 0);
+ pup= uiPupMenuBegin(C, name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
if(but->rnapoin.data && but->rnaprop) {
+ short is_anim= RNA_property_animateable(&but->rnapoin, but->rnaprop);
+
+ /* second slower test, saved people finding keyframe items in menus when its not possible */
+ if(is_anim)
+ is_anim= RNA_property_path_from_ID_check(&but->rnapoin, but->rnaprop);
length= RNA_property_array_length(&but->rnapoin, but->rnaprop);
/* Keyframes */
if(but->flag & UI_BUT_ANIMATED_KEY) {
if(length) {
- uiItemBooleanO(layout, "Replace Keyframes", 0, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Replace Single Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframes", 0, "ANIM_OT_keyframe_delete_button", "all", 1);
- uiItemBooleanO(layout, "Delete Single Keyframe", 0, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Replace Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframes", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
}
else {
- uiItemBooleanO(layout, "Replace Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframe", 0, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
}
}
else if(but->flag & UI_BUT_DRIVEN);
- else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ else if(is_anim) {
if(length) {
- uiItemBooleanO(layout, "Insert Keyframes", 0, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Insert Single Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Insert Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
}
else
- uiItemBooleanO(layout, "Insert Keyframe", 0, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
}
/* Drivers */
@@ -4096,43 +4159,43 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Delete Drivers", 0, "ANIM_OT_driver_button_remove", "all", 1);
- uiItemBooleanO(layout, "Delete Single Driver", 0, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Drivers", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
}
else
- uiItemBooleanO(layout, "Delete Driver", 0, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
- uiItemO(layout, "Copy Driver", 0, "ANIM_OT_copy_driver_button");
+ uiItemO(layout, "Copy Driver", ICON_NULL, "ANIM_OT_copy_driver_button");
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", 0, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
}
- else if(but->flag & UI_BUT_ANIMATED_KEY);
- else if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ else if(but->flag & (UI_BUT_ANIMATED_KEY|UI_BUT_ANIMATED));
+ else if(is_anim) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add Drivers", 0, "ANIM_OT_driver_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single Driver", 0, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Drivers", ICON_NULL, "ANIM_OT_driver_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
}
else
- uiItemBooleanO(layout, "Add Driver", 0, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", 0, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
}
/* Keying Sets */
- if(RNA_property_animateable(&but->rnapoin, but->rnaprop)) {
+ if(is_anim) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add All to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add All to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
}
else {
- uiItemBooleanO(layout, "Add to Keying Set", 0, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", 0, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
}
}
@@ -4144,14 +4207,14 @@ static int ui_but_menu(bContext *C, uiBut *but)
//Paste Property Value
if(length) {
- uiItemBooleanO(layout, "Reset All to Default Values", 0, "UI_OT_reset_default_button", "all", 1);
- uiItemBooleanO(layout, "Reset Single to Default Value", 0, "UI_OT_reset_default_button", "all", 0);
+ uiItemBooleanO(layout, "Reset All to Default Values", ICON_NULL, "UI_OT_reset_default_button", "all", 1);
+ uiItemBooleanO(layout, "Reset Single to Default Value", ICON_NULL, "UI_OT_reset_default_button", "all", 0);
}
else
- uiItemO(layout, "Reset to Default Value", 0, "UI_OT_reset_default_button");
+ uiItemO(layout, "Reset to Default Value", ICON_NULL, "UI_OT_reset_default_button");
- uiItemO(layout, "Copy Data Path", 0, "UI_OT_copy_data_path_button");
- uiItemO(layout, "Copy To Selected", 0, "UI_OT_copy_to_selected_button");
+ uiItemO(layout, "Copy Data Path", ICON_NULL, "UI_OT_copy_data_path_button");
+ uiItemO(layout, "Copy To Selected", ICON_NULL, "UI_OT_copy_to_selected_button");
uiItemS(layout);
}
@@ -4200,28 +4263,29 @@ static int ui_but_menu(bContext *C, uiBut *but)
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
-
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
- WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
+ /* XXX inactive option, not for public! */
+/* WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", RNA_property_description(but->rnaprop));
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ */
}
else if (but->optype) {
WM_operator_py_idname(buf, but->optype->idname);
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", 0, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", but->optype->description);
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", 0, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
}
}
@@ -4232,6 +4296,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
{
+// Scene *scene= CTX_data_scene(C);
uiHandleButtonData *data;
int retval;
@@ -4241,7 +4306,12 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
if(but->flag & UI_BUT_DISABLED)
return WM_UI_HANDLER_CONTINUE;
- if(data->state == BUTTON_STATE_HIGHLIGHT) {
+ if( (data->state == BUTTON_STATE_HIGHLIGHT) &&
+ /* check prevval because of modal operators [#24016],
+ * modifier check is to allow Ctrl+C for copy.
+ * if this causes other problems, remove this check and suffer the bug :) - campbell */
+ (event->prevval != KM_PRESS || ISKEYMODIFIER(event->prevtype))
+ ) {
/* handle copy-paste */
if(ELEM(event->type, CKEY, VKEY) && event->val==KM_PRESS && (event->ctrl || event->oskey)) {
ui_but_copy_paste(C, but, data, (event->type == CKEY)? 'c': 'v');
@@ -4285,9 +4355,11 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
return WM_UI_HANDLER_BREAK;
}
/* reset to default */
- else if(ELEM(event->type, ZEROKEY,PAD0) && event->val == KM_PRESS) {
+ /* XXX hardcoded keymap check.... */
+ else if(ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ /* ctrl-0 = for arrays, only the active one gets done (vs whole array for just 0) */
if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM)))
- ui_set_but_default(C, but);
+ ui_set_but_default(C, but, !event->ctrl);
}
/* handle menu */
else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) {
@@ -4384,7 +4456,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
retval= ui_do_but_BUT(C, but, data, event);
break;
case COL:
- if(but->a1 == 9) // signal to prevent calling up color picker
+ if(but->a1 == UI_GRAD_V_ALT) // signal to prevent calling up color picker
retval= ui_do_but_EXIT(C, but, data, event);
else
retval= ui_do_but_BLOCK(C, but, data, event);
@@ -4539,7 +4611,7 @@ static int ui_mouse_inside_button(ARegion *ar, uiBut *but, int x, int y)
return 1;
}
-static uiBut *ui_but_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
+static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
{
uiBlock *block;
uiBut *but, *butover= NULL;
@@ -4571,7 +4643,7 @@ static uiBut *ui_but_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
return butover;
}
-static uiBut *ui_list_find_mouse_over(wmWindow *win, ARegion *ar, int x, int y)
+static uiBut *ui_list_find_mouse_over(ARegion *ar, int x, int y)
{
uiBlock *block;
uiBut *but;
@@ -4609,19 +4681,21 @@ static void button_timers_tooltip_remove(bContext *C, uiBut *but)
uiHandleButtonData *data;
data= but->active;
+ if(data) {
- if(data->tooltiptimer) {
- WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
- data->tooltiptimer= NULL;
- }
- if(data->tooltip) {
- ui_tooltip_free(C, data->tooltip);
- data->tooltip= NULL;
- }
+ if(data->tooltiptimer) {
+ WM_event_remove_timer(data->wm, data->window, data->tooltiptimer);
+ data->tooltiptimer= NULL;
+ }
+ if(data->tooltip) {
+ ui_tooltip_free(C, data->tooltip);
+ data->tooltip= NULL;
+ }
- if(data->autoopentimer) {
- WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
- data->autoopentimer= NULL;
+ if(data->autoopentimer) {
+ WM_event_remove_timer(data->wm, data->window, data->autoopentimer);
+ data->autoopentimer= NULL;
+ }
}
}
@@ -4760,7 +4834,7 @@ static void button_activate_init(bContext *C, ARegion *ar, uiBut *but, uiButtonA
/* we disable auto_open in the block after a threshold, because we still
* want to allow auto opening adjacent menus even if no button is activated
- * inbetween going over to the other button, but only for a short while */
+ * in between going over to the other button, but only for a short while */
if(type == BUTTON_ACTIVATE_OVER && but->block->auto_open)
if(but->block->auto_open_last+BUTTON_AUTO_OPEN_THRESH < PIL_check_seconds_timer())
but->block->auto_open= 0;
@@ -4811,7 +4885,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
/* apply the button action or value */
if(!onfree)
- ui_apply_button(C, block, but, data, 0);
+ ui_apply_button(C, block, but, data, 0);
/* if this button is in a menu, this will set the button return
* value to the button value and the menu return value to ok, the
@@ -4860,7 +4934,7 @@ static void button_activate_exit(bContext *C, uiHandleButtonData *data, uiBut *b
but->flag &= ~(UI_ACTIVE|UI_SELECT);
but->flag |= UI_BUT_LAST_ACTIVE;
if(!onfree)
- ui_check_but(but);
+ ui_check_but(but);
/* adds empty mousemove in queue for re-init handler, in case mouse is
* still over a button. we cannot just check for this ourselfs because
@@ -4883,6 +4957,91 @@ void ui_button_active_free(const bContext *C, uiBut *but)
}
}
+/* helper function for insert keyframe, reset to default, etc operators */
+void uiContextActiveProperty(const bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index)
+{
+ ARegion *ar= CTX_wm_region(C);
+
+ memset(ptr, 0, sizeof(*ptr));
+ *prop= NULL;
+ *index= 0;
+
+ while(ar) {
+ uiBlock *block;
+ uiBut *but, *activebut= NULL;
+
+ /* find active button */
+ for(block=ar->uiblocks.first; block; block=block->next) {
+ for(but=block->buttons.first; but; but= but->next) {
+ if(but->active)
+ activebut= but;
+ else if(!activebut && (but->flag & UI_BUT_LAST_ACTIVE))
+ activebut= but;
+ }
+ }
+
+ if(activebut && activebut->rnapoin.data) {
+ uiHandleButtonData *data= activebut->active;
+
+ /* found RNA button */
+ *ptr= activebut->rnapoin;
+ *prop= activebut->rnaprop;
+ *index= activebut->rnaindex;
+
+ /* recurse into opened menu, like colorpicker case */
+ if(data && data->menu && (ar != data->menu->region)) {
+ ar = data->menu->region;
+ }
+ else {
+ return;
+ }
+ }
+ else {
+ /* no active button */
+ return;
+ }
+ }
+}
+
+/* helper function for insert keyframe, reset to default, etc operators */
+void uiContextAnimUpdate(const bContext *C)
+{
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
+ uiBlock *block;
+ uiBut *but, *activebut;
+
+ while(ar) {
+ /* find active button */
+ activebut= NULL;
+
+ for(block=ar->uiblocks.first; block; block=block->next) {
+ for(but=block->buttons.first; but; but= but->next) {
+ ui_but_anim_flag(but, (scene)? scene->r.cfra: 0.0f);
+ ED_region_tag_redraw(ar);
+
+ if(but->active)
+ activebut= but;
+ else if(!activebut && (but->flag & UI_BUT_LAST_ACTIVE))
+ activebut= but;
+ }
+ }
+
+ if(activebut) {
+ /* always recurse into opened menu, so all buttons update (like colorpicker) */
+ uiHandleButtonData *data= activebut->active;
+ if(data && data->menu)
+ ar = data->menu->region;
+ else
+ return;
+ }
+ else {
+ /* no active button */
+ return;
+ }
+ }
+}
+
/************** handle activating a button *************/
static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event)
@@ -4900,11 +5059,10 @@ static uiBut *uit_but_find_open_event(ARegion *ar, wmEvent *event)
static int ui_handle_button_over(bContext *C, wmEvent *event, ARegion *ar)
{
- wmWindow *win= CTX_wm_window(C);
uiBut *but;
if(event->type == MOUSEMOVE) {
- but= ui_but_find_mouse_over(win, ar, event->x, event->y);
+ but= ui_but_find_mouse_over(ar, event->x, event->y);
if(but)
button_activate_init(C, ar, but, BUTTON_ACTIVATE_OVER);
}
@@ -4982,7 +5140,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
- else if(ui_but_find_mouse_over(data->window, ar, event->x, event->y) != but) {
+ else if(ui_but_find_mouse_over(ar, event->x, event->y) != but) {
data->cancel= 1;
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
@@ -5043,16 +5201,17 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
}
else {
/* deselect the button when moving the mouse away */
+ /* also de-activate for buttons that only show higlights */
if(ui_mouse_inside_button(ar, but, event->x, event->y)) {
if(!(but->flag & UI_SELECT)) {
- but->flag |= UI_SELECT;
+ but->flag |= (UI_SELECT|UI_ACTIVE);
data->cancel= 0;
ED_region_tag_redraw(data->region);
}
}
else {
if(but->flag & UI_SELECT) {
- but->flag &= ~UI_SELECT;
+ but->flag &= ~(UI_SELECT|UI_ACTIVE);
data->cancel= 1;
ED_region_tag_redraw(data->region);
}
@@ -5078,9 +5237,16 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
retval= WM_UI_HANDLER_CONTINUE;
}
else if(data->state == BUTTON_STATE_MENU_OPEN) {
+ /* check for exit because of mouse-over another button */
switch(event->type) {
- case MOUSEMOVE: {
- uiBut *bt= ui_but_find_mouse_over(data->window, ar, event->x, event->y);
+ case MOUSEMOVE:
+
+ if(data->menu && data->menu->region)
+ if(ui_mouse_inside_region(data->menu->region, event->x, event->y))
+ break;
+
+ {
+ uiBut *bt= ui_but_find_mouse_over(ar, event->x, event->y);
if(bt && bt->active != data) {
if(but->type != COL) /* exception */
@@ -5115,8 +5281,7 @@ static int ui_handle_button_event(bContext *C, wmEvent *event, uiBut *but)
static int ui_handle_list_event(bContext *C, wmEvent *event, ARegion *ar)
{
- wmWindow *win= CTX_wm_window(C);
- uiBut *but= ui_list_find_mouse_over(win, ar, event->x, event->y);
+ uiBut *but= ui_list_find_mouse_over(ar, event->x, event->y);
int retval= WM_UI_HANDLER_CONTINUE;
int value, min, max;
@@ -5303,7 +5468,7 @@ static int ui_mouse_motion_towards_check(uiBlock *block, uiPopupBlockHandle *men
return menu->dotowards;
}
-int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int topmenu)
+static int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu, int UNUSED(topmenu))
{
ARegion *ar;
uiBlock *block;
@@ -5381,20 +5546,49 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
if(event->val==KM_PRESS) {
but= ui_but_find_activated(ar);
if(but) {
- if(ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE))
- but= ui_but_next(but);
- else
- but= ui_but_prev(but);
+ /* is there a situation where UI_LEFT or UI_RIGHT would also change navigation direction? */
+ if( ((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_DOWN)) ||
+ ((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_RIGHT)) ||
+ ((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_TOP))
+ ) {
+ /* the following is just a hack - uiBut->type set to BUT and BUTM have there menus built
+ * opposite ways - this should be changed so that all popup-menus use the same uiBlock->direction */
+ if(but->type & BUT)
+ but= ui_but_next(but);
+ else
+ but= ui_but_prev(but);
+ }
+ else {
+ if(but->type & BUT)
+ but= ui_but_prev(but);
+ else
+ but= ui_but_next(but);
+ }
if(but)
ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE);
}
if(!but) {
- if(ELEM(event->type, UPARROWKEY, WHEELUPMOUSE))
- bt= ui_but_last(block);
- else
- bt= ui_but_first(block);
+ if( ((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_DOWN)) ||
+ ((ELEM(event->type, UPARROWKEY, WHEELUPMOUSE)) && (block->direction & UI_RIGHT)) ||
+ ((ELEM(event->type, DOWNARROWKEY, WHEELDOWNMOUSE)) && (block->direction & UI_TOP))
+ ) {
+ if((bt= ui_but_first(block)) && (bt->type & BUT)) {
+ bt= ui_but_last(block);
+ }
+ else {
+ /* keep ui_but_first() */
+ }
+ }
+ else {
+ if((bt= ui_but_first(block)) && (bt->type & BUT)) {
+ /* keep ui_but_first() */
+ }
+ else {
+ bt= ui_but_last(block);
+ }
+ }
if(bt)
ui_handle_button_activate(C, ar, bt, BUTTON_ACTIVATE);
@@ -5406,25 +5600,25 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
break;
- case ONEKEY: case PAD1:
+ case ONEKEY: case PAD1:
act= 1;
- case TWOKEY: case PAD2:
+ case TWOKEY: case PAD2:
if(act==0) act= 2;
- case THREEKEY: case PAD3:
+ case THREEKEY: case PAD3:
if(act==0) act= 3;
- case FOURKEY: case PAD4:
+ case FOURKEY: case PAD4:
if(act==0) act= 4;
- case FIVEKEY: case PAD5:
+ case FIVEKEY: case PAD5:
if(act==0) act= 5;
- case SIXKEY: case PAD6:
+ case SIXKEY: case PAD6:
if(act==0) act= 6;
- case SEVENKEY: case PAD7:
+ case SEVENKEY: case PAD7:
if(act==0) act= 7;
- case EIGHTKEY: case PAD8:
+ case EIGHTKEY: case PAD8:
if(act==0) act= 8;
- case NINEKEY: case PAD9:
+ case NINEKEY: case PAD9:
if(act==0) act= 9;
- case ZEROKEY: case PAD0:
+ case ZEROKEY: case PAD0:
if(act==0) act= 10;
if((block->flag & UI_BLOCK_NUMSELECT) && event->val==KM_PRESS) {
@@ -5460,8 +5654,68 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
retval= WM_UI_HANDLER_BREAK;
}
+ break;
+
+ /* Handle keystrokes on menu items */
+ case AKEY:
+ case BKEY:
+ case CKEY:
+ case DKEY:
+ case EKEY:
+ case FKEY:
+ case GKEY:
+ case HKEY:
+ case IKEY:
+ case JKEY:
+ case KKEY:
+ case LKEY:
+ case MKEY:
+ case NKEY:
+ case OKEY:
+ case PKEY:
+ case QKEY:
+ case RKEY:
+ case SKEY:
+ case TKEY:
+ case UKEY:
+ case VKEY:
+ case WKEY:
+ case XKEY:
+ case YKEY:
+ case ZKEY:
+ {
+ if( (event->val == KM_PRESS) &&
+ (event->shift == FALSE) &&
+ (event->ctrl == FALSE) &&
+ (event->oskey == FALSE)
+ ) {
+ for(but= block->buttons.first; but; but= but->next) {
+
+ if(but->menu_key==event->type) {
+ if(but->type == BUT) {
+ /* mainly for operator buttons */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_APPLY);
+ }
+ else if(ELEM(but->type, BLOCK, PULLDOWN)) {
+ /* open submenus (like right arrow key) */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_OPEN);
+ }
+ else if (but->type == MENU) {
+ /* activate menu items */
+ ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE);
+ }
+ else {
+ printf("Error, but->menu_key type: %d\n", but->type);
+ }
+
+ break;
+ }
+ }
+ retval= WM_UI_HANDLER_BREAK;
+ }
break;
+ }
}
}
@@ -5474,7 +5728,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
if(ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE) && event->val==KM_PRESS) {
if(saferct && !BLI_in_rctf(&saferct->parent, event->x, event->y)) {
- if(block->flag & (UI_BLOCK_OUT_1|UI_BLOCK_KEEP_OPEN))
+ if(block->flag & (UI_BLOCK_OUT_1))
menu->menuretval= UI_RETURN_OK;
else
menu->menuretval= UI_RETURN_OUT;
@@ -5488,10 +5742,10 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
menu->menuretval= UI_RETURN_CANCEL;
}
else if(ELEM(event->type, RETKEY, PADENTER) && event->val==KM_PRESS) {
- /* enter will always close this block, but we let the event
- * get handled by the button if it is activated */
+ /* enter will always close this block, we let the event
+ * get handled by the button if it is activated, otherwise we cancel */
if(!ui_but_find_activated(ar))
- menu->menuretval= UI_RETURN_OK;
+ menu->menuretval= UI_RETURN_CANCEL;
}
else {
ui_mouse_motion_towards_check(block, menu, mx, my);
@@ -5515,7 +5769,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
/* strict check, and include the parent rect */
if(!menu->dotowards && !saferct) {
- if(block->flag & (UI_BLOCK_OUT_1|UI_BLOCK_KEEP_OPEN))
+ if(block->flag & (UI_BLOCK_OUT_1))
menu->menuretval= UI_RETURN_OK;
else
menu->menuretval= UI_RETURN_OUT;
@@ -5638,7 +5892,7 @@ static int ui_handle_menus_recursive(bContext *C, wmEvent *event, uiPopupBlockHa
/* *************** UI event handlers **************** */
-static int ui_handler_region(bContext *C, wmEvent *event, void *userdata)
+static int ui_handler_region(bContext *C, wmEvent *event, void *UNUSED(userdata))
{
ARegion *ar;
uiBut *but;
@@ -5676,7 +5930,7 @@ static int ui_handler_region(bContext *C, wmEvent *event, void *userdata)
return retval;
}
-static void ui_handler_remove_region(bContext *C, void *userdata)
+static void ui_handler_remove_region(bContext *C, void *UNUSED(userdata))
{
bScreen *sc;
ARegion *ar;
@@ -5696,7 +5950,7 @@ static void ui_handler_remove_region(bContext *C, void *userdata)
ui_apply_but_funcs_after(C);
}
-static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata)
+static int ui_handler_region_menu(bContext *C, wmEvent *event, void *UNUSED(userdata))
{
ARegion *ar;
uiBut *but;
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 499c676bf6f..6efed8c8e22 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,10 +43,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "DNA_brush_types.h"
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
@@ -60,6 +62,7 @@
#include "IMB_imbuf_types.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "ED_datafiles.h"
#include "ED_render.h"
@@ -330,7 +333,7 @@ static void vicon_editmode_hlt_draw(int x, int y, int w, int h, float alpha)
viconutil_draw_points(pts, 3, 1);
}
-static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float alpha)
+static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
GLint pts[3][2];
@@ -345,7 +348,7 @@ static void vicon_editmode_dehlt_draw(int x, int y, int w, int h, float alpha)
viconutil_draw_points(pts, 3, 1);
}
-static void vicon_disclosure_tri_right_draw(int x, int y, int w, int h, float alpha)
+static void vicon_disclosure_tri_right_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2;
@@ -370,7 +373,7 @@ static void vicon_disclosure_tri_right_draw(int x, int y, int w, int h, float al
viconutil_draw_lineloop_smooth(pts, 3);
}
-static void vicon_small_tri_right_draw(int x, int y, int w, int h, float alpha)
+static void vicon_small_tri_right_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2-4;
@@ -392,7 +395,7 @@ static void vicon_small_tri_right_draw(int x, int y, int w, int h, float alpha)
glShadeModel(GL_FLAT);
}
-static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alpha)
+static void vicon_disclosure_tri_down_draw(int x, int y, int w, int UNUSED(h), float alpha)
{
GLint pts[3][2];
int cx = x+w/2;
@@ -417,7 +420,7 @@ static void vicon_disclosure_tri_down_draw(int x, int y, int w, int h, float alp
viconutil_draw_lineloop_smooth(pts, 3);
}
-static void vicon_move_up_draw(int x, int y, int w, int h, float alpha)
+static void vicon_move_up_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
int d=-2;
@@ -435,7 +438,7 @@ static void vicon_move_up_draw(int x, int y, int w, int h, float alpha)
glDisable(GL_LINE_SMOOTH);
}
-static void vicon_move_down_draw(int x, int y, int w, int h, float alpha)
+static void vicon_move_down_draw(int x, int y, int w, int h, float UNUSED(alpha))
{
int d=2;
@@ -453,7 +456,7 @@ static void vicon_move_down_draw(int x, int y, int w, int h, float alpha)
glDisable(GL_LINE_SMOOTH);
}
-static void init_brush_icons()
+static void init_brush_icons(void)
{
#define INIT_BRUSH_ICON(icon_id, name) \
@@ -498,14 +501,14 @@ static void init_brush_icons()
#undef INIT_BRUSH_ICON
}
-static void init_internal_icons()
+static void init_internal_icons(void)
{
bTheme *btheme= U.themes.first;
ImBuf *bbuf= NULL;
int x, y, icontype;
char iconfilestr[FILE_MAXDIR+FILE_MAXFILE];
- if ((btheme!=NULL) && (strlen(btheme->tui.iconfile) > 0)) {
+ if ((btheme!=NULL) && btheme->tui.iconfile[0]) {
char *datadir= BLI_get_folder(BLENDER_DATAFILES, NULL);
if (datadir) {
BLI_make_file_string("/", iconfilestr, datadir, btheme->tui.iconfile);
@@ -611,7 +614,7 @@ static void init_iconfile_list(struct ListBase *list)
/* since BLI_getdir changes the current working directory, restore it
back to old value afterwards */
- if(!BLI_getwdN(olddir))
+ if(!BLI_getwdN(olddir, sizeof(olddir)))
restoredir = 0;
totfile = BLI_getdir(icondirstr, &dir);
if (restoredir && !chdir(olddir)) {} /* fix warning about checking return value */
@@ -621,20 +624,30 @@ static void init_iconfile_list(struct ListBase *list)
char *filename = dir[i].relname;
if(BLI_testextensie(filename, ".png")) {
-
+
/* check to see if the image is the right size, continue if not */
/* copying strings here should go ok, assuming that we never get back
a complete path to file longer than 256 chars */
sprintf(iconfilestr, "%s/%s", icondirstr, filename);
- if(BLI_exists(iconfilestr)) bbuf = IMB_loadiffname(iconfilestr, IB_rect);
-
- ifilex = bbuf->x;
- ifiley = bbuf->y;
- IMB_freeImBuf(bbuf);
+ if(BLI_exists(iconfilestr))
+ bbuf= IMB_loadiffname(iconfilestr, IB_rect);
+ else
+ bbuf= NULL;
+
+
+ if(bbuf) {
+ ifilex = bbuf->x;
+ ifiley = bbuf->y;
+ IMB_freeImBuf(bbuf);
+ }
+ else {
+ ifilex= ifiley= 0;
+ }
+ /* bad size or failed to load */
if ((ifilex != ICON_IMAGE_W) || (ifiley != ICON_IMAGE_H))
continue;
-
+
/* found a potential icon file, so make an entry for it in the cache list */
ifile = MEM_callocN(sizeof(IconFile), "IconFile");
@@ -670,7 +683,7 @@ static void free_iconfile_list(struct ListBase *list)
}
}
-int UI_iconfile_get_index(char *filename)
+int UI_iconfile_get_index(const char *filename)
{
IconFile *ifile;
ListBase *list=&(iconfilelist);
@@ -692,7 +705,7 @@ ListBase *UI_iconfile_list(void)
}
-void UI_icons_free()
+void UI_icons_free(void)
{
if(icongltex.id) {
glDeleteTextures(1, &icongltex.id);
@@ -719,7 +732,7 @@ void UI_icons_free_drawinfo(void *drawinfo)
}
}
-static DrawInfo *icon_create_drawinfo()
+static DrawInfo *icon_create_drawinfo(void)
{
DrawInfo *di = NULL;
@@ -736,7 +749,7 @@ int UI_icon_get_width(int icon_id)
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_width: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -761,7 +774,7 @@ int UI_icon_get_height(int icon_id)
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_height: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -832,8 +845,17 @@ static void icon_set_image(bContext *C, ID *id, PreviewImage* prv_img, int miple
prv_img->w[miplevel], prv_img->h[miplevel]);
}
-static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw, int rh, unsigned int *rect, float alpha, float *rgb)
+static void icon_draw_rect(float x, float y, int w, int h, float UNUSED(aspect), int rw, int rh, unsigned int *rect, float alpha, float *rgb, short is_preview)
{
+ ImBuf *ima= NULL;
+
+ /* sanity check */
+ if(w<=0 || h<=0 || w>2000 || h>2000) {
+ printf("icon_draw_rect: icons are %i x %i pixels?\n", w, h);
+ BLI_assert(!"invalid icon size");
+ return;
+ }
+
/* modulate color */
if(alpha != 1.0f)
glPixelTransferf(GL_ALPHA_SCALE, alpha);
@@ -844,38 +866,26 @@ static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw,
glPixelTransferf(GL_BLUE_SCALE, rgb[2]);
}
- /* position */
- glRasterPos2f(x, y);
- // XXX ui_rasterpos_safe(x, y, aspect);
-
- /* draw */
- if((w<1 || h<1)) {
- // XXX - TODO 2.5 verify whether this case can happen
- if (G.f & G_DEBUG)
- printf("what the heck! - icons are %i x %i pixels?\n", w, h);
- }
/* rect contains image in 'rendersize', we only scale if needed */
- else if(rw!=w && rh!=h) {
- if(w>2000 || h>2000) { /* something has gone wrong! */
- if (G.f & G_DEBUG)
- printf("insane icon size w=%d h=%d\n",w,h);
- }
- else {
- ImBuf *ima;
+ if(rw!=w && rh!=h) {
+ /* first allocate imbuf for scaling and copy preview into it */
+ ima = IMB_allocImBuf(rw, rh, 32, IB_rect);
+ memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
+ IMB_scaleImBuf(ima, w, h); /* scale it */
+ rect= ima->rect;
+ }
- /* first allocate imbuf for scaling and copy preview into it */
- ima = IMB_allocImBuf(rw, rh, 32, IB_rect, 0);
- memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
-
- /* scale it */
- IMB_scaleImBuf(ima, w, h);
- glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
-
- IMB_freeImBuf(ima);
- }
+ /* draw */
+ if(is_preview) {
+ glaDrawPixelsSafe(x, y, w, h, w, GL_RGBA, GL_UNSIGNED_BYTE, rect);
}
- else
+ else {
+ glRasterPos2f(x, y);
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+ }
+
+ if(ima)
+ IMB_freeImBuf(ima);
/* restore color */
if(alpha != 0.0f)
@@ -888,7 +898,7 @@ static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw,
}
}
-static void icon_draw_texture(float x, float y, float w, float h, int ix, int iy, int iw, int ih, float alpha, float *rgb)
+static void icon_draw_texture(float x, float y, float w, float h, int ix, int iy, int UNUSED(iw), int ih, float alpha, float *rgb)
{
float x1, x2, y1, y2;
@@ -931,7 +941,7 @@ static int preview_size(int miplevel)
return 0;
}
-static void icon_draw_size(float x, float y, int icon_id, float aspect, float alpha, float *rgb, int miplevel, int draw_size, int nocreate)
+static void icon_draw_size(float x, float y, int icon_id, float aspect, float alpha, float *rgb, int miplevel, int draw_size, int UNUSED(nocreate), int is_preview)
{
Icon *icon = NULL;
DrawInfo *di = NULL;
@@ -940,7 +950,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
icon = BKE_icon_get(icon_id);
- if (!icon) {
+ if (icon==ICON_NULL) {
if (G.f & G_DEBUG)
printf("icon_draw_mipmap: Internal error, no icon for icon ID: %d\n", icon_id);
return;
@@ -962,7 +972,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
if(di->type == ICON_TYPE_VECTOR) {
/* vector icons use the uiBlock transformation, they are not drawn
with untransformed coordinates like the other icons */
- di->data.vector.func(x, y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f);
+ di->data.vector.func((int)x, (int)y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f);
}
else if(di->type == ICON_TYPE_TEXTURE) {
icon_draw_texture(x, y, w, h, di->data.texture.x, di->data.texture.y,
@@ -974,7 +984,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
if(!iimg->rect) return; /* something has gone wrong! */
- icon_draw_rect(x, y, w, h, aspect, iimg->w, iimg->h, iimg->rect, alpha, rgb);
+ icon_draw_rect(x, y, w, h, aspect, iimg->w, iimg->h, iimg->rect, alpha, rgb, is_preview);
}
else if(di->type == ICON_TYPE_PREVIEW) {
PreviewImage* pi = BKE_previewimg_get((ID*)icon->obj);
@@ -985,68 +995,102 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
/* preview images use premul alpha ... */
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- icon_draw_rect(x, y, w, h, aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel], 1.0f, NULL);
+ icon_draw_rect(x, y, w, h, aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel], 1.0f, NULL, is_preview);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
}
}
-void ui_id_icon_render(bContext *C, ID *id, int preview)
+static void ui_id_icon_render(bContext *C, ID *id, int big)
{
PreviewImage *pi = BKE_previewimg_get(id);
-
+
if (pi) {
if ((pi->changed[0] ||!pi->rect[0])) /* changed only ever set by dynamic icons */
{
- /* create the preview rect if necessary */
+ /* create the rect if necessary */
icon_set_image(C, id, pi, 0); /* icon size */
- if (preview)
- icon_set_image(C, id, pi, 1); /* preview size */
+ if (big)
+ icon_set_image(C, id, pi, 1); /* bigger preview size */
pi->changed[0] = 0;
}
}
}
-static int ui_id_brush_get_icon(bContext *C, ID *id, int preview)
+static void ui_id_brush_render(bContext *C, ID *id)
+{
+ PreviewImage *pi = BKE_previewimg_get(id);
+ int i;
+
+ if(!pi)
+ return;
+
+ for(i = 0; i < PREVIEW_MIPMAPS; i++) {
+ /* check if rect needs to be created; changed
+ only set by dynamic icons */
+ if((pi->changed[i] || !pi->rect[i])) {
+ icon_set_image(C, id, pi, i);
+ pi->changed[i] = 0;
+ }
+ }
+}
+
+
+static int ui_id_brush_get_icon(bContext *C, ID *id)
{
Brush *br = (Brush*)id;
if(br->flag & BRUSH_CUSTOM_ICON) {
BKE_icon_getid(id);
- ui_id_icon_render(C, id, preview);
+ ui_id_brush_render(C, id);
}
- else if(!id->icon_id) {
- /* no icon found, reset it */
-
- /* this is not nice, should probably make
- brushes be strictly in one paint mode only
- to avoid this kind of thing */
+ else {
Object *ob = CTX_data_active_object(C);
- EnumPropertyItem *items;
- int tool;
-
- if(ob && (ob->mode & OB_MODE_SCULPT)) {
+ SpaceImage *sima;
+ EnumPropertyItem *items = NULL;
+ int tool, mode = 0;
+
+ /* XXX: this is not nice, should probably make brushes
+ be strictly in one paint mode only to avoid
+ checking various context stuff here */
+
+ if(CTX_wm_view3d(C) && ob) {
+ if(ob->mode & OB_MODE_SCULPT)
+ mode = OB_MODE_SCULPT;
+ else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT))
+ mode = OB_MODE_VERTEX_PAINT;
+ else if(ob->mode & OB_MODE_TEXTURE_PAINT)
+ mode = OB_MODE_TEXTURE_PAINT;
+ }
+ else if((sima = CTX_wm_space_image(C)) &&
+ (sima->flag & SI_DRAWTOOL)) {
+ mode = OB_MODE_TEXTURE_PAINT;
+ }
+
+ /* reset the icon */
+ if(mode == OB_MODE_SCULPT) {
items = brush_sculpt_tool_items;
tool = br->sculpt_tool;
}
- else if(ob && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT))) {
+ else if(mode == OB_MODE_VERTEX_PAINT) {
items = brush_vertexpaint_tool_items;
tool = br->vertexpaint_tool;
}
- else {
+ else if(mode == OB_MODE_TEXTURE_PAINT) {
items = brush_imagepaint_tool_items;
tool = br->imagepaint_tool;
}
- RNA_enum_icon_from_value(items, tool, &id->icon_id);
+ if(!items || !RNA_enum_icon_from_value(items, tool, &id->icon_id))
+ id->icon_id = 0;
}
return id->icon_id;
}
-int ui_id_icon_get(bContext *C, ID *id, int preview)
+int ui_id_icon_get(bContext *C, ID *id, int big)
{
int iconid= 0;
@@ -1054,7 +1098,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
switch(GS(id->name))
{
case ID_BR:
- iconid= ui_id_brush_get_icon(C, id, preview);
+ iconid= ui_id_brush_get_icon(C, id);
break;
case ID_MA: /* fall through */
case ID_TE: /* fall through */
@@ -1063,7 +1107,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
case ID_LA: /* fall through */
iconid= BKE_icon_getid(id);
/* checks if not exists, or changed */
- ui_id_icon_render(C, id, preview);
+ ui_id_icon_render(C, id, big);
break;
default:
break;
@@ -1075,7 +1119,7 @@ int ui_id_icon_get(bContext *C, ID *id, int preview)
static void icon_draw_mipmap(float x, float y, int icon_id, float aspect, float alpha, int miplevel, int nocreate)
{
int draw_size = preview_size(miplevel);
- icon_draw_size(x, y, icon_id, aspect, alpha, NULL, miplevel, draw_size, nocreate);
+ icon_draw_size(x, y, icon_id, aspect, alpha, NULL, miplevel, draw_size, nocreate, FALSE);
}
void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alpha)
@@ -1086,7 +1130,7 @@ void UI_icon_draw_aspect(float x, float y, int icon_id, float aspect, float alph
void UI_icon_draw_aspect_color(float x, float y, int icon_id, float aspect, float *rgb)
{
int draw_size = preview_size(PREVIEW_MIPMAP_ZERO);
- icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, PREVIEW_MIPMAP_ZERO, draw_size, 0);
+ icon_draw_size(x, y, icon_id, aspect, 1.0f, rgb, PREVIEW_MIPMAP_ZERO, draw_size, FALSE, FALSE);
}
void UI_icon_draw(float x, float y, int icon_id)
@@ -1096,7 +1140,7 @@ void UI_icon_draw(float x, float y, int icon_id)
void UI_icon_draw_size(float x, float y, int size, int icon_id, float alpha)
{
- icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, 0, size, 1);
+ icon_draw_size(x, y, icon_id, 1.0f, alpha, NULL, PREVIEW_MIPMAP_ZERO, size, TRUE, FALSE);
}
void UI_icon_draw_preview(float x, float y, int icon_id)
@@ -1111,6 +1155,6 @@ void UI_icon_draw_preview_aspect(float x, float y, int icon_id, float aspect)
void UI_icon_draw_preview_aspect_size(float x, float y, int icon_id, float aspect, int size)
{
- icon_draw_size(x, y, icon_id, aspect, 1.0f, NULL, PREVIEW_MIPMAP_LARGE, size, 0);
+ icon_draw_size(x, y, icon_id, aspect, 1.0f, NULL, PREVIEW_MIPMAP_LARGE, size, FALSE, TRUE);
}
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 84d6605651b..b5f8897d32c 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -96,15 +96,14 @@ typedef enum {
#define UI_MAX_DRAW_STR 400
#define UI_MAX_NAME_STR 128
-#define UI_ARRAY 29
/* panel limits */
#define UI_PANEL_MINX 100
#define UI_PANEL_MINY 70
/* uiBut->flag */
-#define UI_SELECT 1
-#define UI_MOUSE_OVER 2
+#define UI_SELECT 1 /* use when the button is pressed */
+/*#define UI_MOUSE_OVER 2*/ /*UNUSED, free flag*/
#define UI_ACTIVE 4
#define UI_HAS_ICON 8
#define UI_TEXTINPUT 16
@@ -120,7 +119,7 @@ typedef enum {
#define PNL_CLOSEDX 2
#define PNL_CLOSEDY 4
#define PNL_CLOSED 6
-#define PNL_TABBED 8
+/*#define PNL_TABBED 8*/ /*UNUSED*/
#define PNL_OVERLAP 16
/* Button text selection:
@@ -171,8 +170,9 @@ struct uiBut {
char *poin;
float hardmin, hardmax, softmin, softmax;
- float a1, a2, hsv[3]; // hsv is temp memory for hsv buttons
+ float a1, a2;
float aspect;
+ char col[4];
uiButHandleFunc func;
void *func_arg1;
@@ -203,13 +203,15 @@ struct uiBut {
uiLink *link;
short linkto[2];
- char *tip, *lockstr;
+ const char *tip, *lockstr;
BIFIconID icon;
- short but_align; /* aligning buttons, horiz/vertical */
- short lock;
+ char lock;
+ char dt;
+ char changed; /* could be made into a single flag */
+ unsigned char unit_type; /* so buttons can support unit systems which are not RNA */
short modifier_key;
- short iconadd, dt;
+ short iconadd;
/* IDPOIN data */
uiIDPoinFuncFP idpoin_func;
@@ -234,9 +236,10 @@ struct uiBut {
struct IDProperty *opproperties;
struct PointerRNA *opptr;
short opcontext;
-
+ unsigned char menu_key; /* 'a'-'z', always lower case */
+
/* Draggable data, type is WM_DRAG_... */
- short dragtype;
+ char dragtype;
void *dragpoin;
struct ImBuf *imb;
float imb_scale;
@@ -296,32 +299,33 @@ struct uiBlock {
void *drawextra_arg1;
void *drawextra_arg2;
- int afterval, flag;
-
- short direction, dt;
- short auto_open, in_use;
+ int flag;
+ char direction, dt;
+ short auto_open;
double auto_open_last;
- int lock;
- char *lockstr;
+ const char *lockstr;
+
+ char lock;
+ char active; // to keep blocks while drawing and free them afterwards
+ char tooltipdisabled; // to avoid tooltip after click
+ char endblock; // uiEndBlock done?
float xofs, yofs; // offset to parent button
int dobounds, mx, my; // for doing delayed
int bounds, minbounds; // for doing delayed
- int endblock; // uiEndBlock done?
rctf safety; // pulldowns, to detect outside, can differ per case how it is created
ListBase saferct; // uiSafetyRct list
uiPopupBlockHandle *handle; // handle
- int tooltipdisabled; // to avoid tooltip after click
- int active; // to keep blocks while drawing and free them afterwards
int puphash; // popup menu hash for memory
- int color_profile; // color profile for correcting linear colors for display
-
void *evil_C; // XXX hack for dynamic operator enums
+
+ float _hsv[3]; // XXX, only access via ui_block_hsv_get()
+ char color_profile; // color profile for correcting linear colors for display
};
typedef struct uiSafetyRct {
@@ -356,10 +360,11 @@ extern void ui_set_but_vectorf(uiBut *but, float *vec);
extern void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float mx, float my);
extern void ui_get_but_string(uiBut *but, char *str, int maxlen);
+extern void ui_convert_to_unit_alt_name(uiBut *but, char *str, int maxlen);
extern int ui_set_but_string(struct bContext *C, uiBut *but, const char *str);
extern int ui_get_but_string_max_length(uiBut *but);
-extern void ui_set_but_default(struct bContext *C, uiBut *but);
+extern void ui_set_but_default(struct bContext *C, uiBut *but, short all);
extern void ui_set_but_soft_range(uiBut *but, double value);
@@ -407,6 +412,8 @@ void ui_tooltip_free(struct bContext *C, struct ARegion *ar);
uiBut *ui_popup_menu_memory(uiBlock *block, uiBut *but);
+float *ui_block_hsv_get(uiBlock *block);
+
/* searchbox for string button */
ARegion *ui_searchbox_create(struct bContext *C, struct ARegion *butregion, uiBut *but);
int ui_searchbox_inside(struct ARegion *ar, int x, int y);
@@ -415,6 +422,7 @@ void ui_searchbox_autocomplete(struct bContext *C, struct ARegion *ar, uiBut *bu
void ui_searchbox_event(struct bContext *C, struct ARegion *ar, uiBut *but, struct wmEvent *event);
void ui_searchbox_apply(uiBut *but, struct ARegion *ar);
void ui_searchbox_free(struct bContext *C, struct ARegion *ar);
+void ui_but_search_test(uiBut *but);
typedef uiBlock* (*uiBlockHandleCreateFunc)(struct bContext *C, struct uiPopupBlockHandle *handle, void *arg1);
@@ -429,22 +437,15 @@ void ui_set_name_menu(uiBut *but, int value);
int ui_step_name_menu(uiBut *but, int step);
struct AutoComplete;
-struct AutoComplete *autocomplete_begin(char *startname, int maxlen);
-void autocomplete_do_name(struct AutoComplete *autocpl, const char *name);
-void autocomplete_end(struct AutoComplete *autocpl, char *autoname);
/* interface_panel.c */
extern int ui_handler_panel_region(struct bContext *C, struct wmEvent *event);
-extern void ui_draw_aligned_panel(struct ARegion *ar, struct uiStyle *style, uiBlock *block, rcti *rect);
+extern void ui_draw_aligned_panel(struct uiStyle *style, uiBlock *block, rcti *rect);
/* interface_draw.c */
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
-extern void gl_round_box_vertical_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadeLeft, float shadeRight);
-
-void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha);
+void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha);
void ui_draw_but_HISTOGRAM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, struct uiWidgetColors *wcol, rcti *rect);
@@ -471,14 +472,13 @@ extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *s
struct ThemeUI;
void ui_widget_color_init(struct ThemeUI *tui);
-void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state);
-void ui_draw_preview_item(struct uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state);
+void ui_draw_menu_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
+void ui_draw_preview_item(struct uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state);
/* interface_style.c */
void uiStyleInit(void);
/* interface_icons.c */
-void ui_id_icon_render(struct bContext *C, struct ID *id, int preview);
int ui_id_icon_get(struct bContext *C, struct ID *id, int preview);
/* resources.c */
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 1d98b1f22c1..432904fd243 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,14 +26,17 @@
#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
#include "DNA_screen_types.h"
+#include "DNA_armature_types.h"
#include "DNA_userdef_types.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -152,7 +155,7 @@ typedef struct uiLayoutItemRoot {
/************************** Item ***************************/
-static char *ui_item_name_add_colon(char *name, char namestr[UI_MAX_NAME_STR])
+static const char *ui_item_name_add_colon(const char *name, char namestr[UI_MAX_NAME_STR])
{
int len= strlen(name);
@@ -205,7 +208,7 @@ static int ui_layout_vary_direction(uiLayout *layout)
}
/* estimated size of text + icon */
-static int ui_text_icon_width(uiLayout *layout, char *name, int icon, int compact)
+static int ui_text_icon_width(uiLayout *layout, const char *name, int icon, int compact)
{
int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X;
@@ -326,7 +329,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index)
}
/* create buttons for an item with an RNA array */
-static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only)
+static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand, int slider, int toggle, int icon_only)
{
uiStyle *style= layout->root->style;
uiBut *but;
@@ -343,7 +346,7 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
uiBlockSetCurLayout(block, sub);
/* create label */
- if(strcmp(name, "") != 0)
+ if(name[0])
uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
/* create buttons */
@@ -352,23 +355,35 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
int butw, buth, unit;
int cols= (len >= 20)? 2: 1;
int colbuts= len/(2*cols);
+ int layer_used= 0;
uiBlockSetCurLayout(block, uiLayoutAbsolute(layout, 0));
unit= UI_UNIT_X*0.75;
butw= unit;
buth= unit;
+
+ if(ptr->type == &RNA_Armature) {
+ bArmature *arm= (bArmature *)ptr->data;
+ layer_used= arm->layer_used;
+ }
for(b=0; b<cols; b++) {
uiBlockBeginAlign(block);
for(a=0; a<colbuts; a++) {
- but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth);
+ if(layer_used & (1<<(a+b*colbuts))) icon= ICON_LAYER_USED;
+ else icon= ICON_BLANK1;
+
+ but= uiDefAutoButR(block, ptr, prop, a+b*colbuts, "", icon, x + butw*a, y+buth, butw, buth);
if(subtype == PROP_LAYER_MEMBER)
uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+b*colbuts));
}
for(a=0; a<colbuts; a++) {
- but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", ICON_BLANK1, x + butw*a, y, butw, buth);
+ if(layer_used & (1<<(a+len/2+b*colbuts))) icon= ICON_LAYER_USED;
+ else icon= ICON_BLANK1;
+
+ but= uiDefAutoButR(block, ptr, prop, a+len/2+b*colbuts, "", icon, x + butw*a, y, butw, buth);
if(subtype == PROP_LAYER_MEMBER)
uiButSetFunc(but, ui_layer_but_cb, but, SET_INT_IN_POINTER(a+len/2+b*colbuts));
}
@@ -393,14 +408,14 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
col= a % dim_size[0];
row= a / dim_size[0];
- but= uiDefAutoButR(block, ptr, prop, a, "", 0, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
+ but= uiDefAutoButR(block, ptr, prop, a, "", ICON_NULL, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
if(slider && but->type==NUM)
but->type= NUMSLI;
}
}
else {
if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand)
- uiDefAutoButR(block, ptr, prop, -1, "", 0, 0, 0, w, UI_UNIT_Y);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, 0, 0, w, UI_UNIT_Y);
if(!ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) || expand) {
/* layout for known array subtypes */
@@ -434,12 +449,12 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon
uiBlockSetCurLayout(block, layout);
}
-static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, char *uiname, int x, int y, int w, int h, int icon_only)
+static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, const char *uiname, int h, int icon_only)
{
uiBut *but;
EnumPropertyItem *item;
const char *identifier;
- char *name;
+ const char *name;
int a, totitem, itemw, icon, value, free;
identifier= RNA_property_identifier(prop);
@@ -450,12 +465,12 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt
if(!item[a].identifier[0])
continue;
- name= (!uiname || uiname[0])? (char*)item[a].name: "";
+ name= (!uiname || uiname[0])? item[a].name: "";
icon= item[a].icon;
value= item[a].value;
itemw= ui_text_icon_width(block->curlayout, name, icon, 0);
- if(icon && strcmp(name, "") != 0 && !icon_only)
+ if(icon && name[0] && !icon_only)
but= uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
else if(icon)
but= uiDefIconButR(block, ROW, 0, icon, 0, 0, itemw, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
@@ -472,7 +487,7 @@ static void ui_item_enum_expand(uiLayout *layout, uiBlock *block, PointerRNA *pt
}
/* callback for keymap item change button */
-static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v)
+static void ui_keymap_but_cb(bContext *UNUSED(C), void *but_v, void *UNUSED(key_v))
{
uiBut *but= but_v;
@@ -483,7 +498,7 @@ static void ui_keymap_but_cb(bContext *C, void *but_v, void *key_v)
}
/* create label + button for RNA property */
-static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag)
+static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h, int flag)
{
uiLayout *sub;
uiBut *but=NULL;
@@ -494,7 +509,7 @@ static uiBut *ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, i
sub= uiLayoutRow(layout, 0);
uiBlockSetCurLayout(block, sub);
- if(strcmp(name, "") != 0) {
+ if(name[0]) {
/* XXX UI_GetStringWidth is not accurate
labelw= UI_GetStringWidth(name);
CLAMP(labelw, w/4, 3*w/4);*/
@@ -569,7 +584,7 @@ void uiFileBrowseContextProperty(const bContext *C, PointerRNA *ptr, PropertyRNA
/********************* Button Items *************************/
/* disabled item */
-static void ui_item_disabled(uiLayout *layout, char *name)
+static void ui_item_disabled(uiLayout *layout, const char *name)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -582,14 +597,14 @@ static void ui_item_disabled(uiLayout *layout, char *name)
w= ui_text_icon_width(layout, name, 0, 0);
- but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
but->flag |= UI_BUT_DISABLED;
but->lock = 1;
but->lockstr = "";
}
/* operator items */
-PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDProperty *properties, int context, int flag)
+PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, IDProperty *properties, int context, int flag)
{
uiBlock *block= layout->root->block;
wmOperatorType *ot= WM_operatortype_find(idname, 0);
@@ -614,13 +629,15 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP
if (flag & UI_ITEM_R_NO_BG)
uiBlockSetEmboss(block, UI_EMBOSSN);
- if(icon && strcmp(name, "") != 0)
- but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
+ if(icon && name[0])
+ but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, name, 0, 0, w, UI_UNIT_Y, NULL);
else if(icon)
but= uiDefIconButO(block, BUT, ot->idname, context, icon, 0, 0, w, UI_UNIT_Y, NULL);
else
- but= uiDefButO(block, BUT, ot->idname, context, (char*)name, 0, 0, w, UI_UNIT_Y, NULL);
-
+ but= uiDefButO(block, BUT, ot->idname, context, name, 0, 0, w, UI_UNIT_Y, NULL);
+
+ assert(but->optype != NULL);
+
/* text alignment for toolbar buttons */
if((layout->root->type == UI_LAYOUT_TOOLBAR) && !icon)
but->flag |= UI_TEXT_LEFT;
@@ -646,7 +663,7 @@ PointerRNA uiItemFullO(uiLayout *layout, char *idname, char *name, int icon, IDP
return PointerRNA_NULL;
}
-static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname, int retval)
+static const char *ui_menu_enumpropname(uiLayout *layout, const char *opname, const char *propname, int retval)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
@@ -666,7 +683,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, &totitem, &free);
if(RNA_enum_name(item, retval, &name)) {
if(free) MEM_freeN(item);
- return (char*)name;
+ return name;
}
if(free)
@@ -676,7 +693,7 @@ static char *ui_menu_enumpropname(uiLayout *layout, char *opname, char *propname
return "";
}
-void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *propname, int value)
+void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value)
{
PointerRNA ptr;
@@ -689,7 +706,7 @@ void uiItemEnumO(uiLayout *layout, char *opname, char *name, int icon, char *pro
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty *properties, int context, int flag)
+void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, IDProperty *properties, int context, int flag)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
PointerRNA ptr;
@@ -716,20 +733,20 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
for(i=0; i<totitem; i++) {
if(item[i].identifier[0]) {
if(properties) {
- PointerRNA ptr;
+ PointerRNA tptr;
- WM_operator_properties_create(&ptr, opname);
- if(ptr.data) {
- IDP_FreeProperty(ptr.data);
- MEM_freeN(ptr.data);
+ WM_operator_properties_create(&tptr, opname);
+ if(tptr.data) {
+ IDP_FreeProperty(tptr.data);
+ MEM_freeN(tptr.data);
}
- ptr.data= IDP_CopyProperty(properties);
- RNA_enum_set(&ptr, propname, item[i].value);
+ tptr.data= IDP_CopyProperty(properties);
+ RNA_enum_set(&tptr, propname, item[i].value);
- uiItemFullO(column, opname, (char*)item[i].name, item[i].icon, ptr.data, context, flag);
+ uiItemFullO(column, opname, item[i].name, item[i].icon, tptr.data, context, flag);
}
else
- uiItemEnumO(column, opname, (char*)item[i].name, item[i].icon, propname, item[i].value);
+ uiItemEnumO(column, opname, item[i].name, item[i].icon, propname, item[i].value);
}
else {
if(item[i].name) {
@@ -739,11 +756,11 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, (char*)item[i].name, 0);
+ uiItemL(column, item[i].name, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
- else
+ else /* XXX bug here, collums draw bottom item badly */
uiItemS(column);
}
}
@@ -753,13 +770,13 @@ void uiItemsFullEnumO(uiLayout *layout, char *opname, char *propname, IDProperty
}
}
-void uiItemsEnumO(uiLayout *layout, char *opname, char *propname)
+void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname)
{
uiItemsFullEnumO(layout, opname, propname, NULL, layout->root->opcontext, 0);
}
/* for use in cases where we have */
-void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value_str)
+void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str)
{
PointerRNA ptr;
@@ -796,7 +813,7 @@ void uiItemEnumO_string(uiLayout *layout, char *name, int icon, char *opname, ch
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
+void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
{
PointerRNA ptr;
@@ -806,7 +823,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char *
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value)
+void uiItemIntO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
{
PointerRNA ptr;
@@ -816,7 +833,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value)
+void uiItemFloatO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, float value)
{
PointerRNA ptr;
@@ -826,7 +843,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value)
+void uiItemStringO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value)
{
PointerRNA ptr;
@@ -836,14 +853,14 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p
uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
}
-void uiItemO(uiLayout *layout, char *name, int icon, char *opname)
+void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname)
{
uiItemFullO(layout, opname, name, icon, NULL, layout->root->opcontext, 0);
}
/* RNA property items */
-static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h)
+static void ui_item_rna_size(uiLayout *layout, const char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int icon_only, int *r_w, int *r_h)
{
PropertyType type;
PropertySubType subtype;
@@ -864,7 +881,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
/* increase height for arrays */
if(index == RNA_NO_INDEX && len > 0) {
- if(!name[0] && icon == 0)
+ if(!name[0] && icon == ICON_NULL)
h= 0;
if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER))
@@ -875,7 +892,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
h += len*UI_UNIT_Y;
}
else if(ui_layout_vary_direction(layout) == UI_ITEM_VARY_X) {
- if(type == PROP_BOOLEAN && strcmp(name, "") != 0)
+ if(type == PROP_BOOLEAN && name[0])
w += UI_UNIT_X/5;
else if(type == PROP_ENUM)
w += UI_UNIT_X/4;
@@ -887,7 +904,7 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PointerRNA
*r_h= h;
}
-void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, char *name, int icon)
+void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int flag, const char *name, int icon)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -903,8 +920,8 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
/* set name and icon */
if(!name)
- name= (char*)RNA_property_ui_name(prop);
- if(!icon)
+ name= RNA_property_ui_name(prop);
+ if(icon == ICON_NULL)
icon= RNA_property_ui_icon(prop);
if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_POINTER))
@@ -917,8 +934,15 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
if(layout->root->type == UI_LAYOUT_MENU) {
if(type == PROP_BOOLEAN)
icon= (RNA_property_boolean_get(ptr, prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
- else if(type == PROP_ENUM && index == RNA_ENUM_VALUE)
- icon= (RNA_property_enum_get(ptr, prop) == value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
+ else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) {
+ int enum_value= RNA_property_enum_get(ptr, prop);
+ if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
+ icon= (enum_value & value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
+ }
+ else {
+ icon= (enum_value == value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT;
+ }
+ }
}
slider= (flag & UI_ITEM_R_SLIDER);
@@ -938,9 +962,9 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
ui_item_array(layout, block, name, icon, ptr, prop, len, 0, 0, w, h, expand, slider, toggle, icon_only);
/* enum item */
else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) {
- char *identifier= (char*)RNA_property_identifier(prop);
+ const char *identifier= RNA_property_identifier(prop);
- if(icon && strcmp(name, "") != 0 && !icon_only)
+ if(icon && name[0] && !icon_only)
uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
else if(icon)
uiDefIconButR(block, ROW, 0, icon, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
@@ -948,29 +972,35 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
uiDefButR(block, ROW, 0, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL);
}
/* expanded enum */
- else if(type == PROP_ENUM && expand)
- ui_item_enum_expand(layout, block, ptr, prop, name, 0, 0, w, h, icon_only);
+ else if(type == PROP_ENUM && (expand || RNA_property_flag(prop) & PROP_ENUM_FLAG))
+ ui_item_enum_expand(layout, block, ptr, prop, name, h, icon_only);
/* property with separate label */
else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) {
but= ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h, flag);
ui_but_add_search(but, ptr, prop, NULL, NULL);
+
+ if(layout->redalert)
+ uiButSetFlag(but, UI_BUT_REDALERT);
}
/* single button */
else {
- but= uiDefAutoButR(block, ptr, prop, index, (char*)name, icon, 0, 0, w, h);
+ but= uiDefAutoButR(block, ptr, prop, index, name, icon, 0, 0, w, h);
if(slider && but->type==NUM)
but->type= NUMSLI;
if(toggle && but->type==OPTION)
but->type= TOG;
+
+ if(layout->redalert)
+ uiButSetFlag(but, UI_BUT_REDALERT);
}
if (no_bg)
uiBlockSetEmboss(block, UI_EMBOSS);
}
-void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *name, int icon)
+void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -983,7 +1013,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, int flag, char *
uiItemFullR(layout, ptr, prop, RNA_NO_INDEX, 0, flag, name, icon);
}
-void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname, int value)
+void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA *ptr, const char *propname, int value)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -996,7 +1026,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr,
uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, value, 0, name, icon);
}
-void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon)
+void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *value, const char *name, int icon)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
EnumPropertyItem *item;
@@ -1019,7 +1049,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname
for(a=0; item[a].identifier; a++) {
if(item[a].value == ivalue) {
- uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, (char*)item[a].name, item[a].icon);
+ uiItemFullR(layout, ptr, prop, RNA_ENUM_VALUE, ivalue, 0, name ? name : item[a].name, icon ? icon : item[a].icon);
break;
}
}
@@ -1028,7 +1058,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, char *propname
MEM_freeN(item);
}
-void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
+void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop;
uiBlock *block= layout->root->block;
@@ -1051,7 +1081,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
for(i=0; i<totitem; i++) {
if(item[i].identifier[0]) {
- uiItemEnumR(column, (char*)item[i].name, 0, ptr, propname, item[i].value);
+ uiItemEnumR(column, item[i].name, ICON_NULL, ptr, propname, item[i].value);
}
else {
if(item[i].name) {
@@ -1061,7 +1091,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname)
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, (char*)item[i].name, 0);
+ uiItemL(column, item[i].name, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1084,7 +1114,7 @@ typedef struct CollItemSearch {
int iconid;
} CollItemSearch;
-int sort_search_items_list(void *a, void *b)
+static int sort_search_items_list(void *a, void *b)
{
CollItemSearch *cis1 = (CollItemSearch *)a;
CollItemSearch *cis2 = (CollItemSearch *)b;
@@ -1095,13 +1125,14 @@ int sort_search_items_list(void *a, void *b)
return 0;
}
-static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, uiSearchItems *items)
+static void rna_search_cb(const struct bContext *C, void *arg_but, const char *str, uiSearchItems *items)
{
uiBut *but= arg_but;
char *name;
int i=0, iconid=0, flag= RNA_property_flag(but->rnaprop);
ListBase *items_list= MEM_callocN(sizeof(ListBase), "items_list");
CollItemSearch *cis;
+ const int skip_filter= !but->changed;
/* build a temporary list of relevant items first */
RNA_PROP_BEGIN(&but->rnasearchpoin, itemptr, but->rnasearchprop) {
@@ -1133,7 +1164,7 @@ static void rna_search_cb(const struct bContext *C, void *arg_but, char *str, ui
}
if(name) {
- if(BLI_strcasestr(name, str)) {
+ if(skip_filter || BLI_strcasestr(name, str)) {
cis = MEM_callocN(sizeof(CollItemSearch), "CollectionItemSearch");
cis->name = MEM_dupallocN(name);
cis->index = i;
@@ -1206,13 +1237,13 @@ void ui_but_add_search(uiBut *but, PointerRNA *ptr, PropertyRNA *prop, PointerRN
but->hardmax= MAX2(but->hardmax, 256);
but->rnasearchpoin= *searchptr;
but->rnasearchprop= searchprop;
- but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT|UI_BUT_UNDO;
+ but->flag |= UI_ICON_LEFT|UI_TEXT_LEFT;
uiButSetSearchFunc(but, rna_search_cb, but, NULL, NULL);
}
}
-void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *searchptr, char *searchpropname, char *name, int icon)
+void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
{
PropertyRNA *prop, *searchprop;
PropertyType type;
@@ -1237,13 +1268,18 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
searchprop= RNA_struct_find_property(searchptr, searchpropname);
- if(!searchprop || RNA_property_type(searchprop) != PROP_COLLECTION) {
+
+ if(!searchprop) {
printf("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
+ else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
+ printf("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ return;
+ }
/* get icon & name */
- if(!icon) {
+ if(icon==ICON_NULL) {
if(type == PROP_POINTER)
icontype= RNA_property_pointer_type(ptr, prop);
else
@@ -1252,7 +1288,7 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, char *propname, st
icon= RNA_struct_ui_icon(icontype);
}
if(!name)
- name= (char*)RNA_property_ui_name(prop);
+ name= RNA_property_ui_name(prop);
/* create button */
block= uiLayoutGetBlock(layout);
@@ -1274,7 +1310,7 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt)
mt->draw(C, &menu);
}
-static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN)
+static void ui_item_menu(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -1297,11 +1333,11 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
w -= 10;
if(name[0] && icon)
- but= uiDefIconTextMenuBut(block, func, arg, icon, (char*)name, 0, 0, w, h, "");
+ but= uiDefIconTextMenuBut(block, func, arg, icon, name, 0, 0, w, h, "");
else if(icon)
but= uiDefIconMenuBut(block, func, arg, icon, 0, 0, w, h, "");
else
- but= uiDefMenuBut(block, func, arg, (char*)name, 0, 0, w, h, "");
+ but= uiDefMenuBut(block, func, arg, name, 0, 0, w, h, "");
if(argN) { /* ugly .. */
but->poin= (char*)but;
@@ -1316,7 +1352,7 @@ static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFun
}
}
-void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon)
+void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const char *name, int icon)
{
MenuType *mt;
@@ -1336,7 +1372,7 @@ void uiItemM(uiLayout *layout, bContext *C, char *menuname, char *name, int icon
}
/* label item */
-static uiBut *uiItemL_(uiLayout *layout, char *name, int icon)
+static uiBut *uiItemL_(uiLayout *layout, const char *name, int icon)
{
uiBlock *block= layout->root->block;
uiBut *but;
@@ -1351,22 +1387,22 @@ static uiBut *uiItemL_(uiLayout *layout, char *name, int icon)
w= ui_text_icon_width(layout, name, icon, 0);
- if(icon && strcmp(name, "") != 0)
- but= uiDefIconTextBut(block, LABEL, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ if(icon && name[0])
+ but= uiDefIconTextBut(block, LABEL, 0, icon, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
else if(icon)
but= uiDefIconBut(block, LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
else
- but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
return but;
}
-void uiItemL(uiLayout *layout, char *name, int icon)
+void uiItemL(uiLayout *layout, const char *name, int icon)
{
uiItemL_(layout, name, icon);
}
-void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon)
+void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, const char *name, int icon)
{
uiBut *but= uiItemL_(layout, name, icon);
@@ -1377,7 +1413,7 @@ void uiItemLDrag(uiLayout *layout, PointerRNA *ptr, char *name, int icon)
/* value item */
-void uiItemV(uiLayout *layout, char *name, int icon, int argval)
+void uiItemV(uiLayout *layout, const char *name, int icon, int argval)
{
/* label */
uiBlock *block= layout->root->block;
@@ -1393,12 +1429,12 @@ void uiItemV(uiLayout *layout, char *name, int icon, int argval)
w= ui_text_icon_width(layout, name, icon, 0);
- if(icon && strcmp(name, "") != 0)
- uiDefIconTextButF(block, BUTM, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
+ if(icon && name[0])
+ uiDefIconTextButF(block, BUTM, 0, icon, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
else if(icon)
uiDefIconButF(block, BUTM, 0, icon, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
else
- uiDefButF(block, BUTM, 0, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
+ uiDefButF(block, BUTM, 0, name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, "");
}
/* separator item */
@@ -1411,7 +1447,7 @@ void uiItemS(uiLayout *layout)
}
/* level items */
-void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg)
+void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg)
{
if(!func)
return;
@@ -1421,12 +1457,12 @@ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func,
typedef struct MenuItemLevel {
int opcontext;
- char *opname;
- char *propname;
+ const char *opname;
+ const char *propname;
PointerRNA rnapoin;
} MenuItemLevel;
-static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
+static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, void *arg)
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
@@ -1434,7 +1470,7 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg)
uiItemsEnumO(layout, lvl->opname, lvl->propname);
}
-void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name, int icon)
+void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
MenuItemLevel *lvl;
@@ -1457,7 +1493,7 @@ void uiItemMenuEnumO(uiLayout *layout, char *opname, char *propname, char *name,
ui_item_menu(layout, name, icon, menu_item_enum_opname_menu, NULL, lvl);
}
-static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
+static void menu_item_enum_rna_menu(bContext *UNUSED(C), uiLayout *layout, void *arg)
{
MenuItemLevel *lvl= (MenuItemLevel*)(((uiBut*)arg)->func_argN);
@@ -1465,7 +1501,7 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg)
uiItemsEnumR(layout, &lvl->rnapoin, lvl->propname);
}
-void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon)
+void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, const char *name, int icon)
{
MenuItemLevel *lvl;
PropertyRNA *prop;
@@ -1477,7 +1513,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname, c
}
if(!name)
- name= (char*)RNA_property_ui_name(prop);
+ name= RNA_property_ui_name(prop);
if(layout->root->type == UI_LAYOUT_MENU && !icon)
icon= ICON_BLANK1;
@@ -1666,7 +1702,7 @@ static void ui_litem_layout_column(uiLayout *litem)
}
/* root layout */
-static void ui_litem_estimate_root(uiLayout *litem)
+static void ui_litem_estimate_root(uiLayout *UNUSED(litem))
{
/* nothing to do */
}
@@ -2161,6 +2197,7 @@ uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align)
split->litem.enabled= 1;
split->litem.context= layout->context;
split->litem.space= layout->root->style->columnspace;
+ split->litem.w= layout->w;
split->percentage= percentage;
BLI_addtail(&layout->items, split);
@@ -2539,12 +2576,11 @@ void uiBlockLayoutResolve(uiBlock *block, int *x, int *y)
/* XXX silly trick, interface_templates.c doesn't get linked
* because it's not used by other files in this module? */
{
- void ui_template_fix_linking();
- ui_template_fix_linking();
+ UI_template_fix_linking();
}
}
-void uiLayoutSetContextPointer(uiLayout *layout, char *name, PointerRNA *ptr)
+void uiLayoutSetContextPointer(uiLayout *layout, const char *name, PointerRNA *ptr)
{
uiBlock *block= layout->root->block;
layout->context= CTX_store_add(&block->contexts, name, ptr);
@@ -2622,7 +2658,7 @@ static void ui_intro_uiLayout(DynStr *ds, uiLayout *layout)
}
static char *str = NULL; // XXX, constant re-freeing, far from ideal.
-char *uiLayoutIntrospect(uiLayout *layout)
+const char *uiLayoutIntrospect(uiLayout *layout)
{
DynStr *ds= BLI_dynstr_new();
@@ -2636,3 +2672,81 @@ char *uiLayoutIntrospect(uiLayout *layout)
return str;
}
+
+/* this function does not initialize the layout, functions can be called on the layout before and after */
+void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,int (*check_prop)(struct PropertyRNA *), const char label_align, const short flag)
+{
+ if(!op->properties) {
+ IDPropertyTemplate val = {0};
+ op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
+ }
+
+ if(flag & UI_LAYOUT_OP_SHOW_TITLE) {
+ uiItemL(layout, op->type->name, ICON_NULL);
+ }
+
+ /* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
+ * just fails silently */
+ if(!WM_operator_repeat_check(C, op)) {
+ uiBlockSetButLock(uiLayoutGetBlock(layout), TRUE, "Operator cannot redo");
+ uiItemL(layout, "* Redo Unsupported *", ICON_NULL); // XXX, could give some nicer feedback or not show redo panel at all?
+ }
+
+ if(op->type->ui) {
+ op->layout= layout;
+ op->type->ui((bContext*)C, op);
+ op->layout= NULL;
+
+ /* UI_LAYOUT_OP_SHOW_EMPTY ignored */
+ }
+ else {
+ wmWindowManager *wm= CTX_wm_manager(C);
+ PointerRNA ptr;
+ int empty;
+
+ RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+ /* menu */
+ if(op->type->flag & OPTYPE_PRESET) {
+ /* XXX, no simple way to get WM_MT_operator_presets.bl_label from python! Label remains the same always! */
+ PointerRNA op_ptr;
+ uiLayout *row;
+
+ row= uiLayoutRow(layout, TRUE);
+ uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NULL);
+
+ WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
+ RNA_string_set(&op_ptr, "operator", op->type->idname);
+ op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMIN, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+
+ WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
+ RNA_string_set(&op_ptr, "operator", op->type->idname);
+ RNA_boolean_set(&op_ptr, "remove_active", 1);
+ op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
+ }
+
+ /* main draw call */
+ empty= uiDefAutoButsRNA(layout, &ptr, check_prop, label_align) == 0;
+
+ if(empty && (flag & UI_LAYOUT_OP_SHOW_EMPTY)) {
+ uiItemL(layout, "No Properties.", ICON_NULL);
+ }
+ }
+
+ /* set various special settings for buttons */
+ {
+ uiBut *but;
+
+ for(but= uiLayoutGetBlock(layout)->buttons.first; but; but= but->next) {
+ /* no undo for buttons for operator redo panels */
+ uiButClearFlag(but, UI_BUT_UNDO);
+
+ /* if button is operator's default property, and a text-field, enable focus for it
+ * - this is used for allowing operators with popups to rename stuff with fewer clicks
+ */
+ if ((but->rnaprop == op->type->prop) && (but->type == TEX)) {
+ uiButSetFocusOnEnter(CTX_wm_window(C), but);
+ }
+ }
+ }
+}
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index caee3c1c2fe..2e6793fb5d5 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,16 +29,20 @@
#include <math.h>
#include <string.h>
-
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_text_types.h" /* for UI_OT_reports_to_text */
#include "BLI_blenlib.h"
#include "BLI_math_color.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_text.h" /* for UI_OT_reports_to_text */
+#include "BKE_report.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -68,7 +72,7 @@ static int eyedropper_init(bContext *C, wmOperator *op)
op->customdata= eye= MEM_callocN(sizeof(Eyedropper), "Eyedropper");
- uiAnimContextProperty(C, &eye->ptr, &eye->prop, &eye->index);
+ uiContextActiveProperty(C, &eye->ptr, &eye->prop, &eye->index);
return (eye->ptr.data && eye->prop && RNA_property_editable(&eye->ptr, eye->prop));
}
@@ -134,7 +138,7 @@ static int eyedropper_modal(bContext *C, wmOperator *op, wmEvent *event)
}
/* Modal Operator init */
-static int eyedropper_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int eyedropper_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* init */
if (eyedropper_init(C, op)) {
@@ -173,7 +177,7 @@ static int eyedropper_poll(bContext *C)
else return 1;
}
-void UI_OT_eyedropper(wmOperatorType *ot)
+static void UI_OT_eyedropper(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Eyedropper";
@@ -195,7 +199,7 @@ void UI_OT_eyedropper(wmOperatorType *ot)
/* Reset Default Theme ------------------------ */
-static int reset_default_theme_exec(bContext *C, wmOperator *op)
+static int reset_default_theme_exec(bContext *C, wmOperator *UNUSED(op))
{
ui_theme_init_default();
WM_event_add_notifier(C, NC_WINDOW, NULL);
@@ -203,7 +207,7 @@ static int reset_default_theme_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UI_OT_reset_default_theme(wmOperatorType *ot)
+static void UI_OT_reset_default_theme(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reset to Default Theme";
@@ -219,7 +223,7 @@ void UI_OT_reset_default_theme(wmOperatorType *ot)
/* Copy Data Path Operator ------------------------ */
-static int copy_data_path_button_exec(bContext *C, wmOperator *op)
+static int copy_data_path_button_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr;
PropertyRNA *prop;
@@ -228,9 +232,9 @@ static int copy_data_path_button_exec(bContext *C, wmOperator *op)
int index;
/* try to create driver using property retrieved from UI */
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
- if (ptr.data && prop) {
+ if (ptr.id.data && ptr.data && prop) {
path= RNA_path_from_ID_to_property(&ptr, prop);
if (path) {
@@ -243,7 +247,7 @@ static int copy_data_path_button_exec(bContext *C, wmOperator *op)
return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-void UI_OT_copy_data_path_button(wmOperatorType *ot)
+static void UI_OT_copy_data_path_button(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Data Path";
@@ -266,7 +270,7 @@ static int reset_default_button_poll(bContext *C)
PropertyRNA *prop;
int index;
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
return (ptr.data && prop && RNA_property_editable(&ptr, prop));
}
@@ -279,7 +283,7 @@ static int reset_default_button_exec(bContext *C, wmOperator *op)
int index, all = RNA_boolean_get(op->ptr, "all");
/* try to reset the nominated setting to its default value */
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
/* if there is a valid property that is editable... */
if (ptr.data && prop && RNA_property_editable(&ptr, prop)) {
@@ -293,7 +297,7 @@ static int reset_default_button_exec(bContext *C, wmOperator *op)
return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-void UI_OT_reset_default_button(wmOperatorType *ot)
+static void UI_OT_reset_default_button(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reset to Default Value";
@@ -335,7 +339,7 @@ static int copy_to_selected_button_poll(bContext *C)
PropertyRNA *prop;
int index, success= 0;
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.data && prop) {
CollectionPointerLink *link;
@@ -361,7 +365,7 @@ static int copy_to_selected_button_exec(bContext *C, wmOperator *op)
int index, all = RNA_boolean_get(op->ptr, "all");
/* try to reset the nominated setting to its default value */
- uiAnimContextProperty(C, &ptr, &prop, &index);
+ uiContextActiveProperty(C, &ptr, &prop, &index);
/* if there is a valid property that is editable... */
if (ptr.data && prop) {
@@ -385,7 +389,7 @@ static int copy_to_selected_button_exec(bContext *C, wmOperator *op)
return (success)? OPERATOR_FINISHED: OPERATOR_CANCELLED;
}
-void UI_OT_copy_to_selected_button(wmOperatorType *ot)
+static void UI_OT_copy_to_selected_button(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy To Selected";
@@ -402,7 +406,51 @@ void UI_OT_copy_to_selected_button(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "all", 1, "All", "Reset to default values all elements of the array.");
}
-
+
+/* Reports to Textblock Operator ------------------------ */
+
+/* FIXME: this is just a temporary operator so that we can see all the reports somewhere
+ * when there are too many to display...
+ */
+
+static int reports_to_text_poll(bContext *C)
+{
+ return CTX_wm_reports(C) != NULL;
+}
+
+static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ ReportList *reports = CTX_wm_reports(C);
+ Text *txt;
+ char *str;
+
+ /* create new text-block to write to */
+ txt = add_empty_text("Recent Reports");
+
+ /* convert entire list to a display string, and add this to the text-block
+ * - if commandline debug option enabled, show debug reports too
+ * - otherwise, up to info (which is what users normally see)
+ */
+ str = BKE_reports_string(reports, (G.f & G_DEBUG)? RPT_DEBUG : RPT_INFO);
+
+ write_text(txt, str);
+ MEM_freeN(str);
+
+ return OPERATOR_FINISHED;
+}
+
+static void UI_OT_reports_to_textblock(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Reports to Text Block";
+ ot->idname= "UI_OT_reports_to_textblock";
+ ot->description= "Write the reports ";
+
+ /* callbacks */
+ ot->poll= reports_to_text_poll;
+ ot->exec= reports_to_text_exec;
+}
+
/* ********************************************************* */
/* Registration */
@@ -413,5 +461,6 @@ void UI_buttons_operatortypes(void)
WM_operatortype_append(UI_OT_copy_data_path_button);
WM_operatortype_append(UI_OT_reset_default_button);
WM_operatortype_append(UI_OT_copy_to_selected_button);
+ WM_operatortype_append(UI_OT_reports_to_textblock); // XXX: temp?
}
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 9d22f3c5212..c069ae4d833 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* a full doc with API notes can be found in bf-blender/blender/doc/interface_API.txt */
+/* a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt */
#include <math.h>
#include <stdlib.h>
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_userdef_types.h"
@@ -308,7 +309,8 @@ static void ui_offset_panel_block(uiBlock *block)
/**************************** drawing *******************************/
/* extern used by previewrender */
-void uiPanelPush(uiBlock *block)
+#if 0 /*UNUSED 2.5*/
+static void uiPanelPush(uiBlock *block)
{
glPushMatrix();
@@ -316,24 +318,26 @@ void uiPanelPush(uiBlock *block)
glTranslatef((float)block->panel->ofsx, (float)block->panel->ofsy, 0.0);
}
-void uiPanelPop(uiBlock *block)
+static void uiPanelPop(uiBlock *UNUSED(block))
{
glPopMatrix();
}
+#endif
/* triangle 'icon' for panel header */
-void ui_draw_tria_icon(float x, float y, char dir)
+/* NOTE - this seems to be only used for hiding nodes now */
+void UI_DrawTriIcon(float x, float y, char dir)
{
if(dir=='h') {
- ui_draw_anti_tria(x-1, y, x-1, y+11.0, x+9, y+6.25);
+ ui_draw_anti_tria( x-3,y-5, x-3,y+5, x+7,y );
}
else {
- ui_draw_anti_tria(x-3, y+10, x+8-1, y+10, x+4.25-2, y);
+ ui_draw_anti_tria( x-5,y+3, x+5,y+3, x,y-7);
}
}
/* triangle 'icon' inside rect */
-void ui_draw_tria_rect(rctf *rect, char dir)
+static void ui_draw_tria_rect(rctf *rect, char dir)
{
if(dir=='h') {
float half= 0.5f*(rect->ymax - rect->ymin);
@@ -345,7 +349,7 @@ void ui_draw_tria_rect(rctf *rect, char dir)
}
}
-void ui_draw_anti_x(float x1, float y1, float x2, float y2)
+static void ui_draw_anti_x(float x1, float y1, float x2, float y2)
{
/* set antialias line */
@@ -425,7 +429,7 @@ static void ui_draw_panel_dragwidget(rctf *rect)
}
-static void ui_draw_aligned_panel_header(ARegion *ar, uiStyle *style, uiBlock *block, rcti *rect, char dir)
+static void ui_draw_aligned_panel_header(uiStyle *style, uiBlock *block, rcti *rect, char dir)
{
Panel *panel= block->panel;
rcti hrect;
@@ -468,7 +472,7 @@ static void rectf_scale(rctf *rect, float scale)
}
/* panel integrated in buttonswindow, tool/property lists etc */
-void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
{
Panel *panel= block->panel;
rcti headrect;
@@ -499,7 +503,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
/* horizontal title */
if(!(panel->flag & PNL_CLOSEDX)) {
- ui_draw_aligned_panel_header(ar, style, block, &headrect, 'h');
+ ui_draw_aligned_panel_header(style, block, &headrect, 'h');
/* itemrect smaller */
itemrect.xmax= headrect.xmax - 5.0f/block->aspect;
@@ -518,7 +522,7 @@ void ui_draw_aligned_panel(ARegion *ar, uiStyle *style, uiBlock *block, rcti *re
}
else if(panel->flag & PNL_CLOSEDX) {
/* draw vertical title */
- ui_draw_aligned_panel_header(ar, style, block, &headrect, 'v');
+ ui_draw_aligned_panel_header(style, block, &headrect, 'v');
}
/* an open panel */
else {
@@ -653,7 +657,7 @@ static int compare_panel(const void *a1, const void *a2)
/* this doesnt draw */
/* returns 1 when it did something */
-int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag)
+static int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag)
{
uiStyle *style= U.uistyles.first;
Panel *pa;
@@ -772,7 +776,7 @@ static void ui_do_animate(const bContext *C, Panel *panel)
}
}
-void uiBeginPanels(const bContext *C, ARegion *ar)
+void uiBeginPanels(const bContext *UNUSED(C), ARegion *ar)
{
Panel *pa;
@@ -798,7 +802,7 @@ void uiEndPanels(const bContext *C, ARegion *ar)
if(block->active && block->panel)
ui_offset_panel_block(block);
- /* consistancy; are panels not made, whilst they have tabs */
+ /* consistency; are panels not made, whilst they have tabs */
for(panot= ar->panels.first; panot; panot= panot->next) {
if((panot->runtime_flag & PNL_ACTIVE)==0) { // not made
@@ -953,10 +957,11 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in
if(my >= block->maxy) button= 1;
}
else if(block->panel->control & UI_PNL_CLOSE) {
- if(mx <= block->minx+10+PNL_ICON-2) button= 2;
- else if(mx <= block->minx+10+2*PNL_ICON+2) button= 1;
+ /* whole of header can be used to collapse panel (except top-right corner) */
+ if(mx <= block->maxx-8-PNL_ICON) button= 2;
+ //else if(mx <= block->minx+10+2*PNL_ICON+2) button= 1;
}
- else if(mx <= block->minx+10+PNL_ICON+2) {
+ else if(mx <= block->maxx-PNL_ICON-12) {
button= 1;
}
@@ -994,10 +999,7 @@ static void ui_handle_panel_header(const bContext *C, uiBlock *block, int mx, in
else
ED_region_tag_redraw(ar);
}
- else if(block->panel->flag & PNL_CLOSED) {
- panel_activate_state(C, block->panel, PANEL_STATE_DRAG);
- }
- else {
+ else if(mx <= (block->maxx-PNL_ICON-12)+PNL_ICON+2) {
panel_activate_state(C, block->panel, PANEL_STATE_DRAG);
}
}
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 50b85360196..c1eaf66fb65 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -27,6 +27,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -34,6 +35,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
@@ -70,7 +72,7 @@
/*********************** Menu Data Parsing ********************* */
typedef struct MenuEntry {
- char *str;
+ const char *str;
int retval;
int icon;
int sepr;
@@ -78,7 +80,7 @@ typedef struct MenuEntry {
typedef struct MenuData {
char *instr;
- char *title;
+ const char *title;
int titleicon;
MenuEntry *items;
@@ -98,7 +100,7 @@ static MenuData *menudata_new(char *instr)
return md;
}
-static void menudata_set_title(MenuData *md, char *title, int titleicon)
+static void menudata_set_title(MenuData *md, const char *title, int titleicon)
{
if (!md->title)
md->title= title;
@@ -106,7 +108,7 @@ static void menudata_set_title(MenuData *md, char *title, int titleicon)
md->titleicon= titleicon;
}
-static void menudata_add_item(MenuData *md, char *str, int retval, int icon, int sepr)
+static void menudata_add_item(MenuData *md, const char *str, int retval, int icon, int sepr)
{
if (md->nitems==md->itemssize) {
int nsize= md->itemssize?(md->itemssize<<1):1;
@@ -128,7 +130,7 @@ static void menudata_add_item(MenuData *md, char *str, int retval, int icon, int
md->nitems++;
}
-void menudata_free(MenuData *md)
+static void menudata_free(MenuData *md)
{
MEM_freeN(md->instr);
if (md->items)
@@ -149,11 +151,12 @@ void menudata_free(MenuData *md)
* @param str String to be parsed.
* @retval new menudata structure, free with menudata_free()
*/
-MenuData *decompose_menu_string(char *str)
+static MenuData *decompose_menu_string(char *str)
{
char *instr= BLI_strdup(str);
MenuData *md= menudata_new(instr);
- char *nitem= NULL, *s= instr;
+ const char *nitem= NULL;
+ char *s= instr;
int nicon=0, nretval= 1, nitem_is_title= 0, nitem_is_sepr= 0;
while (1) {
@@ -269,7 +272,7 @@ int ui_step_name_menu(uiBut *but, int step)
/******************** Creating Temporary regions ******************/
-ARegion *ui_add_temporary_region(bScreen *sc)
+static ARegion *ui_add_temporary_region(bScreen *sc)
{
ARegion *ar;
@@ -282,7 +285,7 @@ ARegion *ui_add_temporary_region(bScreen *sc)
return ar;
}
-void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar)
+static void ui_remove_temporary_region(bContext *C, bScreen *sc, ARegion *ar)
{
if(CTX_wm_window(C))
wm_draw_region_clear(CTX_wm_window(C), ar);
@@ -300,12 +303,12 @@ typedef struct uiTooltipData {
rcti bbox;
uiFontStyle fstyle;
char lines[MAX_TOOLTIP_LINES][512];
- int linedark[MAX_TOOLTIP_LINES];
+ unsigned int color[MAX_TOOLTIP_LINES];
int totline;
int toth, spaceh, lineh;
} uiTooltipData;
-static void ui_tooltip_region_draw(const bContext *C, ARegion *ar)
+static void ui_tooltip_region_draw_cb(const bContext *UNUSED(C), ARegion *ar)
{
uiTooltipData *data= ar->regiondata;
rcti bbox= data->bbox;
@@ -320,16 +323,14 @@ static void ui_tooltip_region_draw(const bContext *C, ARegion *ar)
bbox.ymin= bbox.ymax - data->lineh;
for(a=0; a<data->totline; a++) {
- if(!data->linedark[a]) glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- else glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
-
+ cpack(data->color[a]);
uiStyleFontDraw(&data->fstyle, &bbox, data->lines[a]);
bbox.ymin -= data->lineh + data->spaceh;
bbox.ymax -= data->lineh + data->spaceh;
}
}
-static void ui_tooltip_region_free(ARegion *ar)
+static void ui_tooltip_region_free_cb(ARegion *ar)
{
uiTooltipData *data;
@@ -358,6 +359,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(but->tip && strlen(but->tip)) {
BLI_strncpy(data->lines[data->totline], but->tip, sizeof(data->lines[0]));
+ data->color[data->totline]= 0xFFFFFF;
data->totline++;
}
@@ -367,7 +369,7 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Shortcut: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -377,18 +379,18 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
ui_get_but_string(but, buf, sizeof(buf));
if(buf[0]) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Value: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
if(but->rnaprop) {
- int unit_type = RNA_SUBTYPE_UNIT(RNA_property_subtype(but->rnaprop));
+ int unit_type= uiButGetUnitType(but);
if (unit_type == PROP_UNIT_ROTATION) {
if (RNA_property_type(but->rnaprop) == PROP_FLOAT) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Radians: %f", RNA_property_float_get_index(&but->rnapoin, but->rnaprop, but->rnaindex));
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -397,21 +399,23 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
if(ui_but_anim_expression_get(but, buf, sizeof(buf))) {
/* expression */
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Expression: %s", buf);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
/* rna info */
- BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop));
- data->linedark[data->totline]= 1;
- data->totline++;
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s.%s", RNA_struct_identifier(but->rnapoin.type), RNA_property_identifier(but->rnaprop));
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
if(but->rnapoin.id.data) {
ID *id= but->rnapoin.id.data;
if(id->lib && id->lib->name) {
BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Library: %s", id->lib->name);
- data->linedark[data->totline]= 1;
+ data->color[data->totline]= 0x888888;
data->totline++;
}
}
@@ -424,13 +428,30 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
str= WM_operator_pystring(C, but->optype, opptr, 0);
/* operator info */
- BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", str);
- data->linedark[data->totline]= 1;
- data->totline++;
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", str);
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
MEM_freeN(str);
+
+ /* second check if we are disabled - why */
+ if(but->flag & UI_BUT_DISABLED) {
+ const char *poll_msg;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+ WM_operator_poll_context(C, but->optype, but->opcontext);
+ poll_msg= CTX_wm_operator_poll_msg_get(C);
+ if(poll_msg) {
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Disabled: %s", poll_msg);
+ data->color[data->totline]= 0x6666ff; /* alert */
+ data->totline++;
+ }
+ }
}
+ assert(data->totline < MAX_TOOLTIP_LINES);
+
if(data->totline == 0) {
MEM_freeN(data);
return NULL;
@@ -440,8 +461,8 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
ar= ui_add_temporary_region(CTX_wm_screen(C));
memset(&type, 0, sizeof(ARegionType));
- type.draw= ui_tooltip_region_draw;
- type.free= ui_tooltip_region_free;
+ type.draw= ui_tooltip_region_draw_cb;
+ type.free= ui_tooltip_region_free_cb;
ar->type= &type;
/* set font, get bb */
@@ -592,9 +613,12 @@ int uiSearchItemAdd(uiSearchItems *items, const char *name, void *poin, int icon
return 1;
}
- BLI_strncpy(items->names[items->totitem], name, items->maxstrlen);
- items->pointers[items->totitem]= poin;
- items->icons[items->totitem]= iconid;
+ if(items->names)
+ BLI_strncpy(items->names[items->totitem], name, items->maxstrlen);
+ if(items->pointers)
+ items->pointers[items->totitem]= poin;
+ if(items->icons)
+ items->icons[items->totitem]= iconid;
items->totitem++;
@@ -817,7 +841,7 @@ void ui_searchbox_autocomplete(bContext *C, ARegion *ar, uiBut *but, char *str)
}
}
-static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
+static void ui_searchbox_region_draw_cb(const bContext *UNUSED(C), ARegion *ar)
{
uiSearchboxData *data= ar->regiondata;
@@ -825,7 +849,7 @@ static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
wmOrtho2(-0.01f, ar->winx-0.01f, -0.01f, ar->winy-0.01f);
if(!data->noback)
- ui_draw_search_back(U.uistyles.first, NULL, &data->bbox);
+ ui_draw_search_back(NULL, NULL, &data->bbox); /* style not used yet */
/* draw text */
if(data->items.totitem) {
@@ -884,7 +908,7 @@ static void ui_searchbox_region_draw(const bContext *C, ARegion *ar)
}
}
-static void ui_searchbox_region_free(ARegion *ar)
+static void ui_searchbox_region_free_cb(ARegion *ar)
{
uiSearchboxData *data= ar->regiondata;
int a;
@@ -916,8 +940,8 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
ar= ui_add_temporary_region(CTX_wm_screen(C));
memset(&type, 0, sizeof(ARegionType));
- type.draw= ui_searchbox_region_draw;
- type.free= ui_searchbox_region_free;
+ type.draw= ui_searchbox_region_draw_cb;
+ type.free= ui_searchbox_region_free_cb;
ar->type= &type;
/* create searchbox data */
@@ -1008,7 +1032,7 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
x2= winx;
}
}
- if(y1 < 0) {
+ if(y1 < 0) { /* XXX butregion NULL check?, there is one above */
int newy1;
UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, 0, &newy1);
newy1 += butregion->winrct.ymin;
@@ -1058,6 +1082,39 @@ void ui_searchbox_free(bContext *C, ARegion *ar)
ui_remove_temporary_region(C, CTX_wm_screen(C), ar);
}
+/* sets red alert if button holds a string it can't find */
+/* XXX weak: search_func adds all partial matches... */
+void ui_but_search_test(uiBut *but)
+{
+ uiSearchItems *items= MEM_callocN(sizeof(uiSearchItems), "search items");
+ int x1;
+
+ /* setup search struct */
+ items->maxitem= 10;
+ items->maxstrlen= 256;
+ items->names= MEM_callocN(items->maxitem*sizeof(void *), "search names");
+ for(x1=0; x1<items->maxitem; x1++)
+ items->names[x1]= MEM_callocN(but->hardmax+1, "search names");
+
+ but->search_func(but->block->evil_C, but->search_arg, but->drawstr, items);
+
+ /* only redalert when we are sure of it, this can miss cases when >10 matches */
+ if(items->totitem==0)
+ uiButSetFlag(but, UI_BUT_REDALERT);
+ else if(items->more==0) {
+ for(x1= 0; x1<items->totitem; x1++)
+ if(strcmp(but->drawstr, items->names[x1])==0)
+ break;
+ if(x1==items->totitem)
+ uiButSetFlag(but, UI_BUT_REDALERT);
+ }
+
+ for(x1=0; x1<items->maxitem; x1++)
+ MEM_freeN(items->names[x1]);
+ MEM_freeN(items->names);
+ MEM_freeN(items);
+}
+
/************************* Creating Menu Blocks **********************/
@@ -1116,6 +1173,7 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
if(but) {
int left=0, right=0, top=0, down=0;
int winx, winy;
+ int offscreen;
wm_window_get_size(window, &winx, &winy);
@@ -1206,6 +1264,12 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
// apply requested offset in the block
xof += block->xofs/block->aspect;
yof += block->yofs/block->aspect;
+
+ /* clamp to window bounds, could be made into an option if its ever annoying */
+ if( (offscreen= (block->miny+yof)) < 0) yof -= offscreen; /* bottom */
+ else if((offscreen= (block->maxy+yof)-winy) > 0) yof -= offscreen; /* top */
+ if( (offscreen= (block->minx+xof)) < 0) xof -= offscreen; /* left */
+ else if((offscreen= (block->maxx+xof)-winx) > 0) xof -= offscreen; /* right */
}
/* apply */
@@ -1396,7 +1460,7 @@ void ui_popup_block_free(bContext *C, uiPopupBlockHandle *handle)
/***************************** Menu Button ***************************/
-static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
+static void ui_block_func_MENUSTR(bContext *UNUSED(C), uiLayout *layout, void *arg_str)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1431,7 +1495,7 @@ static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
uiItemL(layout, md->title, md->titleicon);
}
else {
- uiItemL(layout, md->title, 0);
+ uiItemL(layout, md->title, ICON_NULL);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1478,7 +1542,7 @@ static void ui_block_func_MENUSTR(bContext *C, uiLayout *layout, void *arg_str)
menudata_free(md);
}
-void ui_block_func_ICONROW(bContext *C, uiLayout *layout, void *arg_but)
+void ui_block_func_ICONROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1492,7 +1556,7 @@ void ui_block_func_ICONROW(bContext *C, uiLayout *layout, void *arg_but)
&handle->retvalue, (float)a, 0.0, 0, 0, "");
}
-void ui_block_func_ICONTEXTROW(bContext *C, uiLayout *layout, void *arg_but)
+void ui_block_func_ICONTEXTROW(bContext *UNUSED(C), uiLayout *layout, void *arg_but)
{
uiBlock *block= uiLayoutGetBlock(layout);
uiPopupBlockHandle *handle= block->handle;
@@ -1549,27 +1613,22 @@ static void ui_warp_pointer(short x, short y)
void ui_set_but_hsv(uiBut *but)
{
float col[3];
+ float *hsv= ui_block_hsv_get(but->block);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], col, col+1, col+2);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
ui_set_but_vectorf(but, col);
}
/* also used by small picker, be careful with name checks below... */
-void ui_update_block_buts_rgb(uiBlock *block, float *rgb, float *rhsv)
+static void ui_update_block_buts_rgb(uiBlock *block, float *rgb)
{
uiBut *bt;
- float hsv[3];
+ float *hsv= ui_block_hsv_get(block);
/* this is to keep the H and S value when V is equal to zero
* and we are working in HSV mode, of course!
*/
- if (rhsv) {
- hsv[0]= rhsv[0];
- hsv[1]= rhsv[1];
- hsv[2]= rhsv[2];
- }
- else
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
// this updates button strings, is hackish... but button pointers are on stack of caller function
for(bt= block->buttons.first; bt; bt= bt->next) {
@@ -1625,7 +1684,7 @@ void ui_update_block_buts_rgb(uiBlock *block, float *rgb, float *rhsv)
}
}
-static void do_picker_rna_cb(bContext *C, void *bt1, void *unused)
+static void do_picker_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1635,29 +1694,29 @@ static void do_picker_rna_cb(bContext *C, void *bt1, void *unused)
if (prop) {
RNA_property_float_get_array(&ptr, prop, rgb);
- ui_update_block_buts_rgb(but->block, rgb, NULL);
+ ui_update_block_buts_rgb(but->block, rgb);
}
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void do_hsv_rna_cb(bContext *C, void *bt1, void *hsv_arg)
+static void do_hsv_rna_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
- float *hsv = (float *)hsv_arg;
float rgb[3];
+ float *hsv= ui_block_hsv_get(but->block);
hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
- ui_update_block_buts_rgb(but->block, rgb, hsv);
+ ui_update_block_buts_rgb(but->block, rgb);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl)
+static void do_hex_rna_cb(bContext *UNUSED(C), void *bt1, void *hexcl)
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1672,13 +1731,13 @@ static void do_hex_rna_cb(bContext *C, void *bt1, void *hexcl)
srgb_to_linearrgb_v3_v3(rgb, rgb);
}
- ui_update_block_buts_rgb(but->block, rgb, NULL);
+ ui_update_block_buts_rgb(but->block, rgb);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
}
-static void close_popup_cb(bContext *C, void *bt1, void *arg)
+static void close_popup_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *but= (uiBut *)bt1;
uiPopupBlockHandle *popup= but->block->handle;
@@ -1718,7 +1777,7 @@ static void picker_new_hide_reveal(uiBlock *block, short colormode)
}
}
-static void do_picker_new_mode_cb(bContext *C, void *bt1, void *colv)
+static void do_picker_new_mode_cb(bContext *UNUSED(C), void *bt1, void *UNUSED(arg))
{
uiBut *bt= bt1;
short colormode= ui_get_but_val(bt);
@@ -1772,16 +1831,18 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
uiBut *bt;
int width, butwidth;
static char tip[50];
- static float hsv[3];
static char hexcol[128];
float rgb_gamma[3];
float min, max, step, precision;
const char *propname = RNA_property_identifier(prop);
+ float *hsv= ui_block_hsv_get(block);
+
+ ui_block_hsv_get(block);
width= PICKER_TOTAL_W;
butwidth = width - UI_UNIT_X - 10;
- /* existence of profile means storage is in linear colour space, with display correction */
+ /* existence of profile means storage is in linear color space, with display correction */
if (block->color_profile == BLI_PR_NONE) {
sprintf(tip, "Value in Display Color Space");
copy_v3_v3(rgb_gamma, rgb);
@@ -1796,7 +1857,6 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
RNA_property_float_ui_range(ptr, prop, &min, &max, &step, &precision);
RNA_property_float_get_array(ptr, prop, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
switch (U.color_picker_type) {
case USER_CP_CIRCLE:
@@ -1816,11 +1876,11 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
/* mode */
uiBlockBeginAlign(block);
bt= uiDefButS(block, ROW, 0, "RGB", 0, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 0.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, rgb);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
bt= uiDefButS(block, ROW, 0, "HSV", width/3, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 1.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, hsv);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
bt= uiDefButS(block, ROW, 0, "Hex", 2*width/3, -30, width/3, UI_UNIT_Y, &colormode, 0.0, 2.0, 0, 0, "");
- uiButSetFunc(bt, do_picker_new_mode_cb, bt, hexcol);
+ uiButSetFunc(bt, do_picker_new_mode_cb, bt, NULL);
uiBlockEndAlign(block);
bt= uiDefIconButO(block, BUT, "UI_OT_eyedropper", WM_OP_INVOKE_DEFAULT, ICON_EYEDROPPER, butwidth+10, -60, UI_UNIT_X, UI_UNIT_Y, NULL);
@@ -1835,7 +1895,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
bt= uiDefButR(block, NUMSLI, 0, "B ", 0, -100, butwidth, UI_UNIT_Y, ptr, propname, 2, 0.0, 0.0, 0, 3, "Blue");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
- // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", 0);
+ // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NULL);
// but need to use uiButSetFunc for updating other fake buttons
/* HSV values */
@@ -1856,19 +1916,19 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
rgb[3]= 1.0f;
}
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
sprintf(hexcol, "%02X%02X%02X", FTOCHAR(rgb_gamma[0]), FTOCHAR(rgb_gamma[1]), FTOCHAR(rgb_gamma[2]));
bt= uiDefBut(block, TEX, 0, "Hex: ", 0, -60, butwidth, UI_UNIT_Y, hexcol, 0, 8, 0, 0, "Hex triplet for color (#RRGGBB)");
uiButSetFunc(bt, do_hex_rna_cb, bt, hexcol);
uiDefBut(block, LABEL, 0, "(Gamma Corrected)", 0, -80, butwidth, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, "");
+ rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
picker_new_hide_reveal(block, colormode);
}
-static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *event)
+static int ui_picker_small_wheel_cb(const bContext *UNUSED(C), uiBlock *block, wmEvent *event)
{
float add= 0.0f;
@@ -1884,16 +1944,17 @@ static int ui_picker_small_wheel(const bContext *C, uiBlock *block, wmEvent *eve
if(but->type==HSVCUBE && but->active==NULL) {
uiPopupBlockHandle *popup= block->handle;
float col[3];
+ float *hsv= ui_block_hsv_get(block);
ui_get_but_vectorf(but, col);
- rgb_to_hsv(col[0], col[1], col[2], but->hsv, but->hsv+1, but->hsv+2);
- but->hsv[2]= CLAMPIS(but->hsv[2]+add, 0.0f, 1.0f);
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], col, col+1, col+2);
+ rgb_to_hsv_compat(col[0], col[1], col[2], hsv, hsv+1, hsv+2);
+ hsv[2]= CLAMPIS(hsv[2]+add, 0.0f, 1.0f);
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
ui_set_but_vectorf(but, col);
- ui_update_block_buts_rgb(block, col, NULL);
+ ui_update_block_buts_rgb(block, col);
if(popup)
popup->menuretval= UI_RETURN_UPDATE;
@@ -1920,12 +1981,13 @@ uiBlock *ui_block_func_COL(bContext *C, uiPopupBlockHandle *handle, void *arg_bu
uiBlockSetFlag(block, UI_BLOCK_MOVEMOUSE_QUIT);
VECCOPY(handle->retvec, but->editvec);
-
+
uiBlockPicker(block, handle->retvec, &but->rnapoin, but->rnaprop);
- block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN;
+
+ block->flag= UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_KEEP_OPEN|UI_BLOCK_OUT_1;
uiBoundsBlock(block, 10);
- block->block_event_func= ui_picker_small_wheel;
+ block->block_event_func= ui_picker_small_wheel_cb;
/* and lets go */
block->direction= UI_TOP;
@@ -2169,7 +2231,7 @@ uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon)
uiDefIconTextBut(pup->block, LABEL, 0, icon, titlestr, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
}
else {
- but= uiDefBut(pup->block, LABEL, 0, (char*)title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
+ but= uiDefBut(pup->block, LABEL, 0, title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, "");
but->flag= UI_TEXT_LEFT;
}
}
@@ -2226,22 +2288,23 @@ static void confirm_cancel_operator(void *opv)
WM_operator_free(opv);
}
-static void vconfirm_opname(bContext *C, char *opname, char *title, char *itemfmt, va_list ap)
+static void vconfirm_opname(bContext *C, const char *opname, const char *title, const char *itemfmt, va_list ap)
{
uiPopupBlockHandle *handle;
char *s, buf[512];
s= buf;
if (title) s+= sprintf(s, "%s%%t|", title);
- vsprintf(s, itemfmt, ap);
+ vsnprintf(s, sizeof(buf) - (s - buf), itemfmt, ap);
+ buf[sizeof(buf) - 1]= '\0';
handle= ui_popup_menu_create(C, NULL, NULL, NULL, NULL, buf);
handle->popup_func= operator_name_cb;
- handle->popup_arg= opname;
+ handle->popup_arg= (void *)opname;
}
-static void confirm_operator(bContext *C, wmOperator *op, char *title, char *item)
+static void confirm_operator(bContext *C, wmOperator *op, const char *title, const char *item)
{
uiPopupBlockHandle *handle;
char *s, buf[512];
@@ -2256,7 +2319,7 @@ static void confirm_operator(bContext *C, wmOperator *op, char *title, char *ite
handle->cancel_func= confirm_cancel_operator;
}
-void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
+void uiPupMenuOkee(bContext *C, const char *opname, const char *str, ...)
{
va_list ap;
char titlestr[256];
@@ -2268,7 +2331,7 @@ void uiPupMenuOkee(bContext *C, char *opname, char *str, ...)
va_end(ap);
}
-void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
+void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename)
{
size_t len= strlen(filename);
@@ -2286,7 +2349,7 @@ void uiPupMenuSaveOver(bContext *C, wmOperator *op, char *filename)
confirm_operator(C, op, "Save Over", filename);
}
-void uiPupMenuNotice(bContext *C, char *str, ...)
+void uiPupMenuNotice(bContext *C, const char *str, ...)
{
va_list ap;
@@ -2295,7 +2358,7 @@ void uiPupMenuNotice(bContext *C, char *str, ...)
va_end(ap);
}
-void uiPupMenuError(bContext *C, char *str, ...)
+void uiPupMenuError(bContext *C, const char *str, ...)
{
va_list ap;
char nfmt[256];
@@ -2357,7 +2420,7 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
if(mt->poll && mt->poll(C, mt)==0)
return;
- pup= uiPupMenuBegin(C, mt->label, 0);
+ pup= uiPupMenuBegin(C, mt->label, ICON_NULL);
layout= uiPupMenuLayout(pup);
menu.layout= layout;
@@ -2371,7 +2434,7 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
/*************************** Popup Block API **************************/
-void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, int opcontext)
+void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, const char *opname, int opcontext)
{
wmWindow *window= CTX_wm_window(C);
uiPopupBlockHandle *handle;
@@ -2416,3 +2479,7 @@ void uiPupBlockClose(bContext *C, uiBlock *block)
}
}
+float *ui_block_hsv_get(uiBlock *block)
+{
+ return block->_hsv;
+}
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 03676ae5e06..8e206f35b7f 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -136,7 +136,9 @@ static uiFont *uifont_to_blfont(int id)
/* *************** draw ************************ */
-void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
+
+void uiStyleFontDrawExt(uiFontStyle *fs, rcti *rect, const char *str,
+ float *r_xofs, float *r_yofs)
{
float height;
int xofs=0, yofs;
@@ -165,16 +167,26 @@ void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, char *str)
if (fs->kerning == 1)
BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
- BLF_draw(fs->uifont_id, str);
+ BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
BLF_disable(fs->uifont_id, BLF_CLIPPING);
if (fs->shadow)
BLF_disable(fs->uifont_id, BLF_SHADOW);
if (fs->kerning == 1)
BLF_disable(fs->uifont_id, BLF_KERNING_DEFAULT);
+
+ *r_xofs= xofs;
+ *r_yofs= yofs;
+}
+
+void uiStyleFontDraw(uiFontStyle *fs, rcti *rect, const char *str)
+{
+ float xofs, yofs;
+ uiStyleFontDrawExt(fs, rect, str,
+ &xofs, &yofs);
}
/* drawn same as above, but at 90 degree angle */
-void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
+void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, const char *str)
{
float height;
int xofs, yofs;
@@ -218,7 +230,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
if (fs->kerning == 1)
BLF_enable(fs->uifont_id, BLF_KERNING_DEFAULT);
- BLF_draw(fs->uifont_id, str);
+ BLF_draw(fs->uifont_id, str, 65535); /* XXX, use real length */
BLF_disable(fs->uifont_id, BLF_ROTATION);
BLF_disable(fs->uifont_id, BLF_CLIPPING);
if (fs->shadow)
@@ -230,7 +242,7 @@ void uiStyleFontDrawRotated(uiFontStyle *fs, rcti *rect, char *str)
/* ************** helpers ************************ */
/* temporarily, does widget font */
-int UI_GetStringWidth(char *str)
+int UI_GetStringWidth(const char *str)
{
uiStyle *style= U.uistyles.first;
uiFontStyle *fstyle= &style->widget;
@@ -249,13 +261,19 @@ int UI_GetStringWidth(char *str)
}
/* temporarily, does widget font */
-void UI_DrawString(float x, float y, char *str)
+void UI_DrawString(float x, float y, const char *str)
{
uiStyle *style= U.uistyles.first;
+ if (style->widget.kerning == 1)
+ BLF_enable(style->widget.uifont_id, BLF_KERNING_DEFAULT);
+
uiStyleFontSet(&style->widget);
BLF_position(style->widget.uifont_id, x, y, 0.0f);
- BLF_draw(style->widget.uifont_id, str);
+ BLF_draw(style->widget.uifont_id, str, 65535); /* XXX, use real length */
+
+ if (style->widget.kerning == 1)
+ BLF_disable(style->widget.uifont_id, BLF_KERNING_DEFAULT);
}
/* ************** init exit ************************ */
@@ -308,6 +326,18 @@ void uiStyleInit(void)
if(style==NULL) {
ui_style_new(&U.uistyles, "Default Style");
}
+
+ // XXX, this should be moved into a style, but for now best only load the monospaced font once.
+ if (blf_mono_font == -1)
+ blf_mono_font= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_size(blf_mono_font, 12, 72);
+
+ /* second for rendering else we get threading problems */
+ if (blf_mono_font_render == -1)
+ blf_mono_font_render= BLF_load_mem_unique("monospace", (unsigned char *)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
+
+ BLF_size(blf_mono_font_render, 12, 72);
}
void uiStyleFontSet(uiFontStyle *fs)
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 45ebc9bf136..9fd88fa75a9 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,14 +32,19 @@
#include "DNA_userdef_types.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+#include "BKE_animsys.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_material.h"
#include "BKE_texture.h"
#include "BKE_report.h"
+#include "BKE_displist.h"
#include "ED_screen.h"
#include "ED_render.h"
@@ -54,7 +59,7 @@
#include "BLF_api.h"
-void ui_template_fix_linking()
+void UI_template_fix_linking(void)
{
}
@@ -95,7 +100,7 @@ static void id_search_call_cb(bContext *C, void *arg_template, void *item)
}
/* ID Search browse menu, do the search */
-static void id_search_cb(const bContext *C, void *arg_template, char *str, uiSearchItems *items)
+static void id_search_cb(const bContext *C, void *arg_template, const char *str, uiSearchItems *items)
{
TemplateID *template= (TemplateID*)arg_template;
ListBase *lb= template->idlb;
@@ -139,7 +144,6 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
static char search[256];
static TemplateID template;
PointerRNA idptr;
- wmEvent event;
wmWindow *win= CTX_wm_window(C);
uiBlock *block;
uiBut *but;
@@ -180,12 +184,8 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
uiBlockSetDirection(block, UI_DOWN);
uiEndBlock(C, block);
- event= *(win->eventstate); /* XXX huh huh? make api call */
- event.type= EVT_BUT_OPEN;
- event.val= KM_PRESS;
- event.customdata= but;
- event.customdatafree= FALSE;
- wm_event_add(win, &event);
+ /* give search-field focus */
+ uiButSetFocusOnEnter(win, but);
return block;
}
@@ -250,8 +250,8 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
break;
case UI_ID_FAKE_USER:
if(id) {
- if(id->flag & LIB_FAKEUSER) id->us++;
- else id->us--;
+ if(id->flag & LIB_FAKEUSER) id_us_plus(id);
+ else id_us_min(id);
}
else return;
break;
@@ -269,6 +269,8 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
if(id) {
/* make copy */
if(id_copy(id, &newid, 0) && newid) {
+ /* copy animation actions too */
+ BKE_copy_animdata_id_action(id);
/* us is 1 by convention, but RNA_property_pointer_set
will also incremement it, so set it to zero */
newid->us= 0;
@@ -287,7 +289,36 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
}
}
-static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, char *newop, char *openop, char *unlinkop)
+static const char *template_id_browse_tip(StructRNA *type)
+{
+ if(type) {
+ switch(RNA_type_to_ID_code(type)) {
+ case ID_SCE: return "Browse Scene to be linked";
+ case ID_OB: return "Browse Object to be linked";
+ case ID_ME: return "Browse Mesh Data to be linked";
+ case ID_CU: return "Browse Curve Data to be linked";
+ case ID_MB: return "Browse MetaBall Data to be linked";
+ case ID_MA: return "Browse Material to be linked";
+ case ID_TE: return "Browse Texture to be linked";
+ case ID_IM: return "Browse Image to be linked";
+ case ID_LA: return "Browse Lattice Data to be linked";
+ case ID_CA: return "Browse Camera Data to be linked";
+ case ID_WO: return "Browse World Settings to be linked";
+ case ID_SCR: return "Choose Screen lay-out";
+ case ID_TXT: return "Browse Text to be linked";
+ case ID_SO: return "Browse Sound to be linked";
+ case ID_AR: return "Browse Armature data to be linked";
+ case ID_AC: return "Browse Action to be linked";
+ case ID_NT: return "Browse Node Tree to be linked";
+ case ID_BR: return "Browse Brush to be linked";
+ case ID_PA: return "Browse Particle System to be linked";
+ case ID_GD: return "Browse Grease Pencil Data to be linked";
+ }
+ }
+ return "Browse ID data to be linked";
+}
+
+static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, StructRNA *type, int flag, const char *newop, const char *openop, const char *unlinkop)
{
uiBut *but;
uiBlock *block;
@@ -308,7 +339,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(flag & UI_ID_PREVIEWS) {
- but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, "Browse ID data");
+ but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*6, UI_UNIT_Y*6, template_id_browse_tip(type));
if(type) {
but->icon= RNA_struct_ui_icon(type);
if (id) but->icon = ui_id_icon_get(C, id, 1);
@@ -322,7 +353,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
} else
if(flag & UI_ID_BROWSE) {
- but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*1.6, UI_UNIT_Y, "Browse ID data");
+ but= uiDefBlockButN(block, id_search_menu, MEM_dupallocN(template), "", 0, 0, UI_UNIT_X*1.6, UI_UNIT_Y, template_id_browse_tip(type));
if(type) {
but->icon= RNA_struct_ui_icon(type);
/* default dragging of icon for id browse buttons */
@@ -337,11 +368,13 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
/* text button with name */
if(id) {
char name[UI_MAX_NAME_STR];
+ const short user_alert= (id->us <= 0);
//text_idbutton(id, name);
name[0]= '\0';
but= uiDefButR(block, TEX, 0, name, 0, 0, UI_UNIT_X*6, UI_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL);
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME));
+ if(user_alert) uiButSetFlag(but, UI_BUT_REDALERT);
if(id->lib) {
if(id->flag & LIB_INDIRECT) {
@@ -373,6 +406,8 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib))
uiButSetFlag(but, UI_BUT_DISABLED);
}
+
+ if(user_alert) uiButSetFlag(but, UI_BUT_REDALERT);
if(id->lib == NULL && !(ELEM4(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT))) {
uiDefButR(block, TOG, 0, "F", 0, 0, UI_UNIT_X, UI_UNIT_Y, &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
@@ -412,12 +447,14 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
}
/* delete button */
- if(id && (flag & UI_ID_DELETE)) {
+ if(id && (flag & UI_ID_DELETE) && (RNA_property_flag(template->prop) & PROP_NEVER_UNLINK)==0) {
if(unlinkop) {
but= uiDefIconButO(block, BUT, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ /* so we can access the template from operators, font unlinking needs this */
+ uiButSetNFunc(but, NULL, MEM_dupallocN(template), 0);
}
else {
- but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Unlink datablock, Shift + Click to force removal on save");
+ but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Unlink datablock. Shift + Click to set users to zero, data gets not saved");
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_DELETE));
if(RNA_property_flag(template->prop) & PROP_NEVER_NULL)
@@ -431,7 +468,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
uiBlockEndAlign(block);
}
-static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int flag, int prv_rows, int prv_cols)
+static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int flag, int prv_rows, int prv_cols)
{
TemplateID *template;
PropertyRNA *prop;
@@ -454,7 +491,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
flag |= UI_ID_ADD_NEW;
if(openop)
flag |= UI_ID_OPEN;
-
+
type= RNA_property_pointer_type(ptr, prop);
template->idlb= which_libbase(CTX_data_main(C), RNA_type_to_ID_code(type));
@@ -469,17 +506,17 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, char
MEM_freeN(template);
}
-void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
+void uiTemplateID(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE, 0, 0);
}
-void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop)
+void uiTemplateIDBrowse(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME, 0, 0);
}
-void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols)
+void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int rows, int cols)
{
ui_template_id(layout, C, ptr, propname, newop, openop, unlinkop, UI_ID_BROWSE|UI_ID_RENAME|UI_ID_DELETE|UI_ID_PREVIEWS, rows, cols);
}
@@ -491,7 +528,7 @@ void uiTemplateIDPreview(uiLayout *layout, bContext *C, PointerRNA *ptr, char *p
* - propname: property identifier for property that ID-pointer gets stored to
* - proptypename: property identifier for property used to determine the type of ID-pointer that can be used
*/
-void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *proptypename, char *text)
+void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *proptypename, const char *text)
{
PropertyRNA *propID, *propType;
uiLayout *row;
@@ -514,16 +551,16 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
/* Label - either use the provided text, or will become "ID-Block:" */
if (text)
- uiItemL(row, text, 0);
+ uiItemL(row, text, ICON_NULL);
else
- uiItemL(row, "ID-Block:", 0);
+ uiItemL(row, "ID-Block:", ICON_NULL);
/* ID-Type Selector - just have a menu of icons */
// FIXME: the icon-only setting doesn't work when we supply a blank name
- uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* ID-Block Selector - just use pointer widget... */
- uiItemFullR(row, ptr, propID, 0, 0, 0, "", 0);
+ uiItemFullR(row, ptr, propID, 0, 0, 0, "", ICON_NULL);
}
/********************* RNA Path Builder Template ********************/
@@ -536,7 +573,7 @@ void uiTemplateAnyID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
* - propname: property identifier for property that path gets stored to
* - root_ptr: struct that path gets built from
*/
-void uiTemplatePathBuilder(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *root_ptr, char *text)
+void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propname, PointerRNA *UNUSED(root_ptr), const char *text)
{
PropertyRNA *propPath;
uiLayout *row;
@@ -595,7 +632,7 @@ static void modifiers_setOnCage(bContext *C, void *ob_v, void *md_v)
}
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
@@ -614,7 +651,7 @@ static void modifiers_convertToReal(bContext *C, void *ob_v, void *md_v)
ob->partype = PAROBJECT;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ED_undo_push(C, "Modifier convert to real");
}
@@ -668,14 +705,14 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetEmboss(block, UI_EMBOSSN);
/* Open/Close ................................. */
- uiItemR(row, &ptr, "show_expanded", 0, "", 0);
+ uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NULL);
/* modifier-type icon */
uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
uiBlockSetEmboss(block, UI_EMBOSS);
/* modifier name */
- uiItemR(row, &ptr, "name", 0, "", 0);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
/* mode enabling buttons */
uiBlockBeginAlign(block);
@@ -683,11 +720,11 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect))
&& (md->type!=eModifierType_Surface) )
{
- uiItemR(row, &ptr, "show_render", 0, "", 0);
- uiItemR(row, &ptr, "show_viewport", 0, "", 0);
+ uiItemR(row, &ptr, "show_render", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NULL);
if (mti->flags & eModifierTypeFlag_SupportsEditmode)
- uiItemR(row, &ptr, "show_in_editmode", 0, "", 0);
+ uiItemR(row, &ptr, "show_in_editmode", 0, "", ICON_NULL);
}
if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex))
{
@@ -697,6 +734,21 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiButSetFlag(but, UI_BUT_DISABLED);
uiButSetFunc(but, modifiers_setOnCage, ob, md);
}
+
+ /* tesselation point for curve-typed objects */
+ if (ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ /* some modifiers could work with pre-tesselated curves only */
+ if (ELEM3(md->type, eModifierType_Hook, eModifierType_Softbody, eModifierType_MeshDeform)) {
+ /* add disabled pre-tesselated button, so users could have
+ message for this modifiers */
+ but = uiDefIconButBitI(block, TOG, eModifierMode_ApplyOnSpline, 0, ICON_SURFACE_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "This modifier could be applied on splines' points only");
+ uiButSetFlag(but, UI_BUT_DISABLED);
+ } else if (mti->type != eModifierTypeType_Constructive) {
+ /* constructive modifiers tesselates curve before applying */
+ uiItemR(row, &ptr, "use_apply_on_spline", 0, "", ICON_NULL);
+ }
+ }
+
uiBlockEndAlign(block);
/* Up/Down + Delete ........................... */
@@ -727,9 +779,9 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) {
if(ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB))
- uiItemO(row, "Convert", 0, "OBJECT_OT_duplicates_make_real");
+ uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_duplicates_make_real");
else if(psys->part->ren_as == PART_DRAW_PATH)
- uiItemO(row, "Convert", 0, "OBJECT_OT_modifier_convert");
+ uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_modifier_convert");
}
}
else {
@@ -744,7 +796,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
- uiItemO(row, "Copy", 0, "OBJECT_OT_modifier_copy");
+ uiItemO(row, "Copy", ICON_NULL, "OBJECT_OT_modifier_copy");
}
/* result is the layout block inside the box, that we return so that modifier settings can be drawn */
@@ -817,17 +869,14 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
#define REMAKEIPO 8
#define B_DIFF 9
-void do_constraint_panels(bContext *C, void *arg, int event)
+static void do_constraint_panels(bContext *C, void *ob_pt, int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= (Object *)ob_pt;
switch(event) {
case B_CONSTRAINT_TEST:
- // XXX allqueue(REDRAWVIEW3D, 0);
- // XXX allqueue(REDRAWBUTSOBJECT, 0);
- // XXX allqueue(REDRAWBUTSEDIT, 0);
break; // no handling
case B_CONSTRAINT_CHANGETARGET:
if (ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
@@ -843,17 +892,13 @@ void do_constraint_panels(bContext *C, void *arg, int event)
// object_test_constraints(ob);
// if(ob->pose) update_pose_constraint_flags(ob->pose);
- if(ob->type==OB_ARMATURE) DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ if(ob->type==OB_ARMATURE) DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ else DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
-
- // XXX allqueue(REDRAWVIEW3D, 0);
- // XXX allqueue(REDRAWBUTSOBJECT, 0);
- // XXX allqueue(REDRAWBUTSEDIT, 0);
}
-static void constraint_active_func(bContext *C, void *ob_v, void *con_v)
+static void constraint_active_func(bContext *UNUSED(C), void *ob_v, void *con_v)
{
ED_object_constraint_set_active(ob_v, con_v);
}
@@ -890,7 +935,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* unless button has own callback, it adds this callback to button */
block= uiLayoutGetBlock(layout);
- uiBlockSetHandleFunc(block, do_constraint_panels, NULL);
+ uiBlockSetHandleFunc(block, do_constraint_panels, ob);
uiBlockSetFunc(block, constraint_active_func, ob, con);
RNA_pointer_create(&ob->id, &RNA_Constraint, con, &ptr);
@@ -909,20 +954,22 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* open/close */
uiBlockSetEmboss(block, UI_EMBOSSN);
- uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
- /* XXX if (con->flag & CONSTRAINT_DISABLE)
- uiBlockSetCol(block, TH_REDALERT);*/
-
/* name */
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, xco+10, yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ if (con->flag & CONSTRAINT_DISABLE)
+ uiLayoutSetRedAlert(row, 1);
+
if(proxy_protected == 0) {
- uiItemR(row, &ptr, "name", 0, "", 0);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
}
else
- uiItemL(row, con->name, 0);
+ uiItemL(row, con->name, ICON_NULL);
+
+ uiLayoutSetRedAlert(row, 0);
/* proxy-protected constraints cannot be edited, so hide up/down + close buttons */
if (proxy_protected) {
@@ -957,6 +1004,11 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
show_upbut= ((prev_proxylock == 0) && (con->prev));
show_downbut= (con->next) ? 1 : 0;
+ /* enabled */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ uiItemR(row, &ptr, "mute", 0, "", (con->flag & CONSTRAINT_OFF) ? ICON_MUTE_IPO_ON : ICON_MUTE_IPO_OFF);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
/* up/down */
@@ -970,9 +1022,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
uiBlockEndAlign(block);
}
- /* enabled */
- uiItemR(row, &ptr, "mute", 0, "", 0);
-
/* Close 'button' - emboss calls here disable drawing of 'button' behind X */
uiBlockSetEmboss(block, UI_EMBOSSN);
uiItemO(row, "", ICON_X, "CONSTRAINT_OT_delete");
@@ -991,7 +1040,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
box= uiLayoutBox(col);
block= uiLayoutAbsoluteBlock(box);
result= box;
- }
+ }
/* clear any locks set up for proxies/lib-linking */
uiBlockClearButLock(block);
@@ -1048,7 +1097,7 @@ static void do_preview_buttons(bContext *C, void *arg, int event)
}
}
-void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
+void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, MTex *slot)
{
uiLayout *row, *col;
uiBlock *block;
@@ -1096,7 +1145,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
uiBlockSetHandleFunc(block, do_preview_buttons, NULL);
/* add buttons */
- if(pid) {
+ if (pid && show_buttons) {
if(GS(pid->name) == ID_MA || (pparent && GS(pparent->name) == ID_MA)) {
if(GS(pid->name) == ID_MA) ma= (Material*)pid;
else ma= (Material*)pparent;
@@ -1106,7 +1155,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
col = uiLayoutColumn(row, 1);
uiLayoutSetScaleX(col, 1.5);
- uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", 0);
+ uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", ICON_NULL);
}
if(pr_texture) {
@@ -1126,7 +1175,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, ID *parent, MTex *slot)
/* Alpha buton for texture preview */
if(*pr_texture!=TEX_PR_OTHER) {
row = uiLayoutRow(layout, 0);
- uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, 0);
+ uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, ICON_NULL);
}
}
}
@@ -1140,7 +1189,7 @@ typedef struct RNAUpdateCb {
PropertyRNA *prop;
} RNAUpdateCb;
-static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+static void rna_update_cb(bContext *C, void *arg_cb, void *UNUSED(arg))
{
RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
@@ -1241,8 +1290,8 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, &ptr, "position", 0, "Pos", 0);
- uiItemR(row, &ptr, "color", 0, "", 0);
+ uiItemR(row, &ptr, "position", 0, "Pos", ICON_NULL);
+ uiItemR(row, &ptr, "color", 0, "", ICON_NULL);
}
}
@@ -1266,7 +1315,7 @@ static void colorband_buttons_small(uiLayout *layout, uiBlock *block, ColorBand
CBData *cbd= coba->data + coba->cur;
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
- uiItemR(layout, &ptr, "color", 0, "", 0);
+ uiItemR(layout, &ptr, "color", 0, "", ICON_NULL);
}
bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
@@ -1287,7 +1336,7 @@ static void colorband_buttons_layout(uiLayout *layout, uiBlock *block, ColorBand
colorband_buttons_large(layout, block, coba, 0, 0, cb);
}
-void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, const char *propname, int expand)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1317,7 +1366,7 @@ void uiTemplateColorRamp(uiLayout *layout, PointerRNA *ptr, char *propname, int
/********************* Histogram Template ************************/
-void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1346,7 +1395,7 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int
hist = (Histogram *)cptr.data;
- hist->height= (hist->height<=0)?100:hist->height;
+ hist->height= (hist->height<=20)?20:hist->height;
bt= uiDefBut(block, HISTOGRAM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, hist->height, hist, 0, 0, 0, 0, "");
uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
@@ -1356,7 +1405,7 @@ void uiTemplateHistogram(uiLayout *layout, PointerRNA *ptr, char *propname, int
/********************* Waveform Template ************************/
-void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1383,7 +1432,7 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int e
block= uiLayoutAbsoluteBlock(layout);
- scopes->wavefrm_height= (scopes->wavefrm_height<=0)?100:scopes->wavefrm_height;
+ scopes->wavefrm_height= (scopes->wavefrm_height<=20)?20:scopes->wavefrm_height;
bt= uiDefBut(block, WAVEFORM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->wavefrm_height, scopes, 0, 0, 0, 0, "");
@@ -1392,7 +1441,7 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, char *propname, int e
/********************* Vectorscope Template ************************/
-void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, int expand)
+void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, const char *propname)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
@@ -1419,7 +1468,7 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, in
block= uiLayoutAbsoluteBlock(layout);
- scopes->vecscope_height= (scopes->vecscope_height<=0)?100:scopes->vecscope_height;
+ scopes->vecscope_height= (scopes->vecscope_height<=20)?20:scopes->vecscope_height;
bt= uiDefBut(block, VECTORSCOPE, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->vecscope_height, scopes, 0, 0, 0, 0, "");
uiButSetNFunc(bt, rna_update_cb, MEM_dupallocN(cb), NULL);
@@ -1430,7 +1479,7 @@ void uiTemplateVectorscope(uiLayout *layout, PointerRNA *ptr, char *propname, in
/********************* CurveMapping Template ************************/
-static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *UNUSED(arg))
{
CurveMapping *cumap = cumap_v;
float d;
@@ -1448,7 +1497,7 @@ static void curvemap_buttons_zoom_in(bContext *C, void *cumap_v, void *unused)
ED_region_tag_redraw(CTX_wm_region(C));
}
-static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *UNUSED(unused))
{
CurveMapping *cumap = cumap_v;
float d, d1;
@@ -1485,7 +1534,7 @@ static void curvemap_buttons_zoom_out(bContext *C, void *cumap_v, void *unused)
ED_region_tag_redraw(CTX_wm_region(C));
}
-static void curvemap_buttons_setclip(bContext *C, void *cumap_v, void *unused)
+static void curvemap_buttons_setclip(bContext *UNUSED(C), void *cumap_v, void *UNUSED(arg))
{
CurveMapping *cumap = cumap_v;
@@ -1605,7 +1654,7 @@ static uiBlock *curvemap_brush_tools_func(bContext *C, struct ARegion *ar, void
return block;
}
-static void curvemap_buttons_redraw(bContext *C, void *arg1, void *arg2)
+static void curvemap_buttons_redraw(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
ED_region_tag_redraw(CTX_wm_region(C));
}
@@ -1745,8 +1794,8 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
/* black/white levels */
if(levels) {
split= uiLayoutSplit(layout, 0, 0);
- uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
uiLayoutRow(layout, 0);
bt=uiDefBut(block, BUT, 0, "Reset", 0, 0, UI_UNIT_X*10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
@@ -1756,7 +1805,7 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
uiBlockSetNFunc(block, NULL, NULL, NULL);
}
-void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, int type, int levels, int brush)
+void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propname, int type, int levels, int brush)
{
RNAUpdateCb *cb;
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
@@ -1782,7 +1831,7 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, char *propname, i
#define WHEEL_SIZE 100
-void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int value_slider, int lock, int lock_luminosity, int cubic)
+void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propname, int value_slider, int lock, int lock_luminosity, int cubic)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
uiBlock *block= uiLayoutGetBlock(layout);
@@ -1819,7 +1868,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, char *propname, int
uiItemS(row);
if (value_slider)
- uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, 9, 0, "");
+ uiDefButR(block, HSVCUBE, 0, "", WHEEL_SIZE+6, 0, 14, WHEEL_SIZE, ptr, propname, -1, softmin, softmax, UI_GRAD_V_ALT, 0, "");
}
/********************* Layer Buttons Template ************************/
@@ -1847,23 +1896,20 @@ static void handle_layer_buttons(bContext *C, void *arg1, void *arg2)
// - for now, grouping of layers is determined by dividing up the length of
// the array of layer bitflags
-void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
- PointerRNA *used_ptr, char *used_propname, int active_layer)
+void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
+ PointerRNA *used_ptr, const char *used_propname, int active_layer)
{
uiLayout *uRow, *uCol;
PropertyRNA *prop, *used_prop= NULL;
int groups, cols, layers;
int group, col, layer, row;
int cols_per_group = 5;
- const char *desc;
-
+
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
printf("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
-
- desc= RNA_property_description(prop);
/* the number of layers determines the way we group them
* - we want 2 rows only (for now)
@@ -1920,7 +1966,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname,
/************************* List Template **************************/
-static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
+static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon, int big)
{
ID *id= NULL;
int icon;
@@ -1941,7 +1987,7 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
/* get icon from ID */
if(id) {
- icon= ui_id_icon_get(C, id, 1);
+ icon= ui_id_icon_get(C, id, big);
if(icon)
return icon;
@@ -1950,13 +1996,13 @@ static int list_item_icon_get(bContext *C, PointerRNA *itemptr, int rnaicon)
return rnaicon;
}
-static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, char *activepropname)
+static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, PointerRNA *itemptr, int i, int rnaicon, PointerRNA *activeptr, const char *activepropname)
{
- Object *ob;
uiBlock *block= uiLayoutGetBlock(layout);
uiBut *but;
uiLayout *split, *overlap, *sub, *row;
- char *name, *namebuf;
+ char *namebuf;
+ const char *name;
int icon;
overlap= uiLayoutOverlap(layout);
@@ -1970,8 +2016,8 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
sub= uiLayoutRow(overlap, 0);
/* retrieve icon and name */
- icon= list_item_icon_get(C, itemptr, rnaicon);
- if(!icon || icon == ICON_DOT)
+ icon= list_item_icon_get(C, itemptr, rnaicon, 0);
+ if(icon == ICON_NULL || icon == ICON_DOT)
icon= 0;
namebuf= RNA_struct_name_get_alloc(itemptr, NULL, 0);
@@ -1994,8 +2040,30 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiBlockSetEmboss(block, UI_EMBOSS);
uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "use", 0, 0, 0, 0, 0, NULL);
}
+ else if(RNA_struct_is_a(itemptr->type, &RNA_MaterialSlot)) {
+ /* provision to draw active node name */
+ Material *ma, *manode;
+ Object *ob= (Object*)ptr->id.data;
+ int index= (Material**)itemptr->data - ob->mat;
+
+ /* default item with material base name */
+ uiItemL(sub, name, icon);
+
+ ma= give_current_material(ob, index+1);
+ if(ma) {
+ manode= give_node_material(ma);
+ if(manode) {
+ char str[MAX_ID_NAME + 12];
+ sprintf(str, "Node %s", manode->id.name+2);
+ uiItemL(sub, str, ui_id_icon_get(C, &manode->id, 1));
+ }
+ else if(ma->use_nodes) {
+ uiItemL(sub, "Node <none>", ICON_NULL);
+ }
+ }
+ }
else if(itemptr->type == &RNA_ShapeKey) {
- ob= (Object*)activeptr->data;
+ Object *ob= (Object*)activeptr->data;
split= uiLayoutSplit(sub, 0.75f, 0);
@@ -2003,8 +2071,8 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiBlockSetEmboss(block, UI_EMBOSSN);
row= uiLayoutRow(split, 1);
- if(i == 0) uiItemL(row, "", 0);
- else uiItemR(row, itemptr, "value", 0, "", 0);
+ if(i == 0) uiItemL(row, "", ICON_NULL);
+ else uiItemR(row, itemptr, "value", 0, "", ICON_NULL);
if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH))
uiLayoutSetActive(row, 0);
@@ -2019,7 +2087,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
MEM_freeN(namebuf);
}
-void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *activeptr, char *activepropname, int rows, int maxrows, int listtype)
+void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, PointerRNA *activeptr, const char *activepropname, int rows, int maxrows, int listtype)
{
//Scene *scene= CTX_data_scene(C);
PropertyRNA *prop= NULL, *activeprop;
@@ -2093,7 +2161,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
if(i == 9)
row= uiLayoutRow(col, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
but= uiDefIconButR(block, LISTROW, 0, icon, 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
uiButSetFlag(but, UI_BUT_NO_TOOLTIP);
@@ -2117,7 +2185,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
if(found) {
/* create button */
name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
- icon= list_item_icon_get(C, &itemptr, rnaicon);
+ icon= list_item_icon_get(C, &itemptr, rnaicon, 0);
uiItemL(row, (name)? name: "", icon);
if(name)
@@ -2131,7 +2199,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/* if not found, add in dummy button */
if(i == 0)
- uiItemL(row, "", 0);
+ uiItemL(row, "", ICON_NULL);
/* next/prev button */
sprintf(str, "%d :", i);
@@ -2184,7 +2252,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/* add dummy buttons to fill space */
while(i < pa->list_scroll+items) {
if(i >= pa->list_scroll)
- uiItemL(col, "", 0);
+ uiItemL(col, "", ICON_NULL);
i++;
}
@@ -2198,7 +2266,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propna
/************************* Operator Search Template **************************/
-static void operator_call_cb(bContext *C, void *arg1, void *arg2)
+static void operator_call_cb(bContext *C, void *UNUSED(arg1), void *arg2)
{
wmOperatorType *ot= arg2;
@@ -2206,7 +2274,7 @@ static void operator_call_cb(bContext *C, void *arg1, void *arg2)
WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
}
-static void operator_search_cb(const bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -2253,7 +2321,7 @@ void uiTemplateOperatorSearch(uiLayout *layout)
#define B_STOPANIM 3
#define B_STOPCOMPO 4
-static void do_running_jobs(bContext *C, void *arg, int event)
+static void do_running_jobs(bContext *C, void *UNUSED(arg), int event)
{
switch(event) {
case B_STOPRENDER:
@@ -2274,11 +2342,10 @@ static void do_running_jobs(bContext *C, void *arg, int event)
void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
{
bScreen *screen= CTX_wm_screen(C);
- Scene *scene= CTX_data_scene(C);
wmWindowManager *wm= CTX_wm_manager(C);
ScrArea *sa= CTX_wm_area(C);
uiBlock *block;
- void *owner;
+ void *owner= NULL;
int handle_event;
block= uiLayoutGetBlock(layout);
@@ -2287,17 +2354,24 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
uiBlockSetHandleFunc(block, do_running_jobs, NULL);
if(sa->spacetype==SPACE_NODE) {
- owner = sa;
+ if(WM_jobs_test(wm, sa))
+ owner = sa;
handle_event= B_STOPCOMPO;
- } else {
+ }
+ else {
+ Scene *scene;
+ /* another scene can be rendering too, for example via compositor */
+ for(scene= CTX_data_main(C)->scene.first; scene; scene= scene->id.next)
+ if(WM_jobs_test(wm, scene))
+ break;
owner = scene;
handle_event= B_STOPRENDER;
}
- if(WM_jobs_test(wm, owner)) {
- uiLayout *abs;
+ if(owner) {
+ uiLayout *ui_abs;
- abs = uiLayoutAbsolute(layout, 0);
+ ui_abs= uiLayoutAbsolute(layout, 0);
uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE,
0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job");
@@ -2320,12 +2394,12 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
Report *report= BKE_reports_last_displayable(reports);
ReportTimerInfo *rti;
- uiLayout *abs;
+ uiLayout *ui_abs;
uiBlock *block;
uiBut *but;
uiStyle *style= U.uistyles.first;
int width;
- float hsv[3];
+ int icon=0;
/* if the report display has timed out, don't show */
if (!reports->reporttimer) return;
@@ -2334,10 +2408,8 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
if (!rti || rti->widthfac==0.0 || !report) return;
- abs = uiLayoutAbsolute(layout, 0);
- block= uiLayoutGetBlock(abs);
-
- rgb_to_hsv(rti->col[0], rti->col[1], rti->col[2], hsv+0, hsv+1, hsv+2);
+ ui_abs= uiLayoutAbsolute(layout, 0);
+ block= uiLayoutGetBlock(ui_abs);
width = BLF_width(style->widget.uifont_id, report->message);
width = MIN2(rti->widthfac*width, width);
@@ -2346,23 +2418,39 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
/* make a box around the report to make it stand out */
uiBlockBeginAlign(block);
but= uiDefBut(block, ROUNDBOX, 0, "", 0, 0, UI_UNIT_X+10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- copy_v3_v3(but->hsv, hsv); /* set the report's bg colour in but->hsv - ROUNDBOX feature */
-
+ /* set the report's bg color in but->col - ROUNDBOX feature */
+ but->col[0]= FTOCHAR(rti->col[0]);
+ but->col[1]= FTOCHAR(rti->col[1]);
+ but->col[2]= FTOCHAR(rti->col[2]);
+ but->col[3]= 255;
+
but= uiDefBut(block, ROUNDBOX, 0, "", UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
- but->hsv[0] = but->hsv[1] = 0.0; /* set a greyscale bg colour in but->hsv - ROUNDBOX feature */
- but->hsv[2] = rti->greyscale;
+ but->col[0]= but->col[1]= but->col[2]= FTOCHAR(rti->greyscale);
+ but->col[3]= 255;
+
uiBlockEndAlign(block);
/* icon and report message on top */
if(report->type & RPT_ERROR_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_ERROR;
else if(report->type & RPT_WARNING_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_ERROR, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_ERROR;
else if(report->type & RPT_INFO_ALL)
- uiDefIconBut(block, LABEL, 0, ICON_INFO, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ icon = ICON_INFO;
- uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ /* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report
+ * to be shown instead of icon when appropriate...
+ */
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ if (reports->list.first != reports->list.last)
+ uiDefIconButO(block, BUT, "UI_OT_reports_to_textblock", WM_OP_INVOKE_REGION_WIN, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, "Click to see rest of reports in textblock: 'Recent Reports'");
+ else
+ uiDefIconBut(block, LABEL, 0, icon, 2, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
+ uiBlockSetEmboss(block, UI_EMBOSS);
+
+ uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
}
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index 37278340275..e7848c07095 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -26,11 +26,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
@@ -40,7 +43,7 @@
/*************************** RNA Utilities ******************************/
-uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, char *name, int icon, int x1, int y1, int x2, int y2)
+uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2)
{
uiBut *but=NULL;
const char *propname= RNA_property_identifier(prop);
@@ -55,19 +58,11 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
switch(RNA_property_type(prop)) {
case PROP_BOOLEAN: {
- int value, length;
if(arraylen && index == -1)
return NULL;
-
- length= RNA_property_array_length(ptr, prop);
-
- if(length)
- value= RNA_property_boolean_get_index(ptr, prop, index);
- else
- value= RNA_property_boolean_get(ptr, prop);
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, ICONTOG, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, ICONTOG, 0, icon, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -87,7 +82,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
but= uiDefButR(block, NUM, 0, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
break;
case PROP_ENUM:
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, MENU, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, MENU, 0, icon, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -95,7 +90,7 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
but= uiDefButR(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
break;
case PROP_STRING:
- if(icon && name && strcmp(name, "") == 0)
+ if(icon && name && name[0] == '\0')
but= uiDefIconButR(block, TEX, 0, icon, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
else if(icon)
but= uiDefIconTextButR(block, TEX, 0, icon, name, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL);
@@ -104,7 +99,6 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
break;
case PROP_POINTER: {
PointerRNA pptr;
- int icon;
pptr= RNA_property_pointer_get(ptr, prop);
if(!pptr.type)
@@ -131,35 +125,57 @@ uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int ind
return but;
}
-void uiDefAutoButsRNA(const bContext *C, uiLayout *layout, PointerRNA *ptr, int columns)
+int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(PropertyRNA *), const char label_align)
{
uiLayout *split, *col;
int flag;
- char *name;
+ const char *name;
+ int tot= 0;
+
+ assert(ELEM3(label_align, '\0', 'H', 'V'));
RNA_STRUCT_BEGIN(ptr, prop) {
flag= RNA_property_flag(prop);
- if(flag & PROP_HIDDEN)
+ if(flag & PROP_HIDDEN || (check_prop && check_prop(prop)==FALSE))
continue;
- name= (char*)RNA_property_ui_name(prop);
+ if(label_align != '\0') {
+ name= RNA_property_ui_name(prop);
- if(columns == 1) {
- col= uiLayoutColumn(layout, 1);
- uiItemL(col, name, 0);
- }
- else if(columns == 2) {
- split = uiLayoutSplit(layout, 0.5f, 0);
+ if(label_align=='V') {
+ col= uiLayoutColumn(layout, 1);
+ uiItemL(col, name, ICON_NULL);
+ }
+ else if(label_align=='H') {
+ split = uiLayoutSplit(layout, 0.5f, 0);
- uiItemL(uiLayoutColumn(split, 0), name, 0);
- col= uiLayoutColumn(split, 0);
+ uiItemL(uiLayoutColumn(split, 0), name, ICON_NULL);
+ col= uiLayoutColumn(split, 0);
+ }
+ else {
+ col= NULL;
+ }
+
+ /* may meed to add more cases here.
+ * don't override enum flag names */
+ if(flag & PROP_ENUM_FLAG) {
+ name= NULL;
+ }
+ else {
+ name= ""; /* name is shown above, empty name for button below */
+ }
+ }
+ else {
+ col= layout;
+ name= NULL; /* no smart label alignment, show default name with button */
}
- else
- col= NULL;
- uiItemFullR(col, ptr, prop, -1, 0, 0, "", 0);
+ uiItemFullR(col, ptr, prop, -1, 0, 0, name, ICON_NULL);
+ tot++;
}
RNA_STRUCT_END;
+
+ return tot;
}
/***************************** ID Utilities *******************************/
@@ -171,7 +187,7 @@ int uiIconFromID(ID *id)
short idcode;
if(id==NULL)
- return 0;
+ return ICON_NULL;
idcode= GS(id->name);
@@ -189,5 +205,5 @@ int uiIconFromID(ID *id)
will set the right type, also with subclassing */
RNA_id_pointer_create(id, &ptr);
- return (ptr.type)? RNA_struct_ui_icon(ptr.type): 0;
+ return (ptr.type)? RNA_struct_ui_icon(ptr.type) : ICON_NULL;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 539be96c4ce..aaa46a3105f 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -24,9 +24,9 @@
*/
#include <limits.h>
-#include <math.h>
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include "DNA_screen_types.h"
@@ -35,6 +35,8 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BLI_rect.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -284,8 +286,10 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, rcti *rect, fl
float facxi= (maxxi!=minxi) ? 1.0f/(maxxi-minxi) : 0.0f; /* for uv, can divide by zero */
float facyi= (maxyi!=minyi) ? 1.0f/(maxyi-minyi) : 0.0f;
int a, tot= 0, minsize;
+ const int hnum= ((roundboxalign & (1|2))==(1|2) || (roundboxalign & (4|8))==(4|8)) ? 1 : 2;
+ const int vnum= ((roundboxalign & (1|8))==(1|8) || (roundboxalign & (2|4))==(2|4)) ? 1 : 2;
- minsize= MIN2(rect->xmax-rect->xmin, rect->ymax-rect->ymin);
+ minsize= MIN2((rect->xmax-rect->xmin)*hnum, (rect->ymax-rect->ymin)*vnum);
if(2.0f*rad > minsize)
rad= 0.5f*minsize;
@@ -552,7 +556,7 @@ static void widget_check_trias(uiWidgetTrias *tria, rcti *rect)
/* prepares shade colors */
-static void shadecolors4(char *coltop, char *coldown, char *color, short shadetop, short shadedown)
+static void shadecolors4(char *coltop, char *coldown, const char *color, short shadetop, short shadedown)
{
coltop[0]= CLAMPIS(color[0]+shadetop, 0, 255);
@@ -566,7 +570,7 @@ static void shadecolors4(char *coltop, char *coldown, char *color, short shadeto
coldown[3]= color[3];
}
-static void round_box_shade_col4(char *col1, char *col2, float fac)
+static void round_box_shade_col4(const char *col1, const char *col2, float fac)
{
int faci, facm;
unsigned char col[4];
@@ -742,22 +746,24 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
#define PREVIEW_PAD 4
-static void widget_draw_preview(BIFIconID icon, float aspect, float alpha, rcti *rect)
+static void widget_draw_preview(BIFIconID icon, float UNUSED(alpha), rcti *rect)
{
- int w, h, x, y, size;
+ int w, h, size;
- if(!icon)
+ if(icon==ICON_NULL)
return;
w = rect->xmax - rect->xmin;
h = rect->ymax - rect->ymin;
size = MIN2(w, h);
size -= PREVIEW_PAD*2; /* padding */
-
- x = rect->xmin + w/2 - size/2;
- y = rect->ymin + h/2 - size/2;
-
- UI_icon_draw_preview_aspect_size(x, y, icon, aspect, size);
+
+ if(size > 0) {
+ int x = rect->xmin + w/2 - size/2;
+ int y = rect->ymin + h/2 - size/2;
+
+ UI_icon_draw_preview_aspect_size(x, y, icon, 1.0f, size);
+ }
}
@@ -770,7 +776,7 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, float alpha, rcti *rect
float aspect, height;
if (but->flag & UI_ICON_PREVIEW) {
- widget_draw_preview(icon, but->block->aspect, alpha, rect);
+ widget_draw_preview(icon, alpha, rect);
return;
}
@@ -865,28 +871,42 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
if (fstyle->kerning==1) /* for BLF_width */
BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
- but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr);
- but->ofs= 0;
+ /* if text editing we define ofs dynamically */
+ if(but->editstr && but->pos >= 0) {
+ if(but->ofs > but->pos)
+ but->ofs= but->pos;
+ }
+ else but->ofs= 0;
- while(but->strwidth > okwidth ) {
-
- but->ofs++;
- but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs);
+ but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr + but->ofs);
+
+ while(but->strwidth > okwidth) {
- /* textbut exception */
- if(but->editstr && but->pos != -1) {
- int pos= but->pos+1;
+ /* textbut exception, clip right when... */
+ if(but->editstr && but->pos >= 0) {
+ float width;
+ char buf[256];
- if(pos-1 < but->ofs) {
- pos= but->ofs-pos+1;
- but->ofs -= pos;
- if(but->ofs<0) {
- but->ofs= 0;
- pos--;
- }
- but->drawstr[ strlen(but->drawstr)-pos ]= 0;
+ /* copy draw string */
+ BLI_strncpy(buf, but->drawstr, sizeof(buf));
+ /* string position of cursor */
+ buf[but->pos]= 0;
+ width= BLF_width(fstyle->uifont_id, buf+but->ofs);
+
+ /* if cursor is at 20 pixels of right side button we clip left */
+ if(width > okwidth-20)
+ but->ofs++;
+ else {
+ /* shift string to the left */
+ if(width < 20 && but->ofs > 0)
+ but->ofs--;
+ but->drawstr[ strlen(but->drawstr)-1 ]= 0;
}
}
+ else
+ but->ofs++;
+
+ but->strwidth= BLF_width(fstyle->uifont_id, but->drawstr+but->ofs);
if(but->strwidth < 10) break;
}
@@ -959,6 +979,9 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
// int transopts;
char *cpoin = NULL;
+ /* for underline drawing */
+ float font_xofs, font_yofs;
+
uiStyleFontSet(fstyle);
if(but->editstr || (but->flag & UI_TEXT_LEFT))
@@ -1036,7 +1059,40 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
}
glColor3ubv((unsigned char*)wcol->text);
- uiStyleFontDraw(fstyle, rect, but->drawstr+but->ofs);
+
+ uiStyleFontDrawExt(fstyle, rect, but->drawstr+but->ofs, &font_xofs, &font_yofs);
+
+ if(but->menu_key != '\0') {
+ char fixedbuf[128];
+ char *str;
+
+ BLI_strncpy(fixedbuf, but->drawstr + but->ofs, sizeof(fixedbuf));
+
+ str= strchr(fixedbuf, but->menu_key-32); /* upper case */
+ if(str==NULL)
+ str= strchr(fixedbuf, but->menu_key);
+
+ if(str) {
+ int ul_index= -1;
+ float ul_advance;
+
+ ul_index= (int)(str - fixedbuf);
+
+ if (fstyle->kerning == 1) {
+ BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
+ }
+
+ fixedbuf[ul_index]= '\0';
+ ul_advance= BLF_width(fstyle->uifont_id, fixedbuf);
+
+ BLF_position(fstyle->uifont_id, rect->xmin+font_xofs + ul_advance, rect->ymin+font_yofs, 0.0f);
+ BLF_draw(fstyle->uifont_id, "_", 2);
+
+ if (fstyle->kerning == 1) {
+ BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
+ }
+ }
+ }
/* part text right aligned */
if(cpoin) {
@@ -1054,7 +1110,10 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
if(but==NULL) return;
/* clip but->drawstr to fit in available space */
- if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) {
+ if (but->editstr && but->pos >= 0) {
+ ui_text_leftclip(fstyle, but, rect);
+ }
+ else if (ELEM4(but->type, NUM, NUMABS, NUMSLI, SLI)) {
ui_text_label_rightclip(fstyle, but, rect);
}
else if (ELEM(but->type, TEX, SEARCH_MENU)) {
@@ -1117,7 +1176,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
*/
-static struct uiWidgetStateColors wcol_state= {
+static struct uiWidgetStateColors wcol_state_colors= {
{115, 190, 76, 255},
{90, 166, 51, 255},
{240, 235, 100, 255},
@@ -1387,12 +1446,12 @@ void ui_widget_color_init(ThemeUI *tui)
tui->wcol_list_item= wcol_list_item;
tui->wcol_progress= wcol_progress;
- tui->wcol_state= wcol_state;
+ tui->wcol_state= wcol_state_colors;
}
/* ************ button callbacks, state ***************** */
-static void widget_state_blend(char *cp, char *cpstate, float fac)
+static void widget_state_blend(char *cp, const char *cpstate, const float fac)
{
if(fac != 0.0f) {
cp[0]= (int)((1.0f-fac)*cp[0] + fac*cpstate[0]);
@@ -1420,8 +1479,7 @@ static void widget_state(uiWidgetType *wt, int state)
VECCOPY(wt->wcol.text, wt->wcol.text_sel);
- if (!(state & UI_TEXTINPUT))
- /* swap for selection - show depressed */
+ if(state & UI_SELECT)
SWAP(short, wt->wcol.shadetop, wt->wcol.shadedown);
}
else {
@@ -1438,6 +1496,11 @@ static void widget_state(uiWidgetType *wt, int state)
wt->wcol.inner[2]= wt->wcol.inner[2]>=240? 255 : wt->wcol.inner[2]+15;
}
}
+
+ if(state & UI_BUT_REDALERT) {
+ char red[4]= {255, 0, 0};
+ widget_state_blend(wt->wcol.inner, red, 0.4f);
+ }
}
/* sliders use special hack which sets 'item' as inner when drawing filling */
@@ -1452,12 +1515,16 @@ static void widget_state_numslider(uiWidgetType *wt, int state)
/* now, set the inner-part so that it reflects state settings too */
// TODO: maybe we should have separate settings for the blending colors used for this case?
if(state & UI_SELECT) {
+
if(state & UI_BUT_ANIMATED_KEY)
widget_state_blend(wt->wcol.item, wcol_state->inner_key_sel, blend);
else if(state & UI_BUT_ANIMATED)
widget_state_blend(wt->wcol.item, wcol_state->inner_anim_sel, blend);
else if(state & UI_BUT_DRIVEN)
widget_state_blend(wt->wcol.item, wcol_state->inner_driven_sel, blend);
+
+ if(state & UI_SELECT)
+ SWAP(short, wt->wcol.shadetop, wt->wcol.shadedown);
}
else {
if(state & UI_BUT_ANIMATED_KEY)
@@ -1476,13 +1543,13 @@ static void widget_state_label(uiWidgetType *wt, int state)
widget_state(wt, state);
if(state & UI_SELECT)
- UI_GetThemeColor4ubv(TH_TEXT_HI, wt->wcol.text);
+ UI_GetThemeColor4ubv(TH_TEXT_HI, (unsigned char *)wt->wcol.text);
else
- UI_GetThemeColor4ubv(TH_TEXT, wt->wcol.text);
+ UI_GetThemeColor4ubv(TH_TEXT, (unsigned char *)wt->wcol.text);
}
-static void widget_state_nothing(uiWidgetType *wt, int state)
+static void widget_state_nothing(uiWidgetType *wt, int UNUSED(state))
{
wt->wcol= *(wt->wcol_theme);
}
@@ -1631,12 +1698,12 @@ void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float
*valrad= atan2(mx, my)/(2.0f*M_PI) + 0.5f;
}
-void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
+static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
{
/* gouraud triangle fan */
float radstep, ang= 0.0f;
float centx, centy, radius;
- float rgb[3], hsv[3], hsvo[3], col[3], colcent[3];
+ float rgb[3], hsvo[3], hsv[3], col[3], colcent[3];
int a, tot= 32;
int color_profile = but->block->color_profile;
@@ -1654,7 +1721,8 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* color */
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+ copy_v3_v3(hsv, ui_block_hsv_get(but->block));
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
copy_v3_v3(hsvo, hsv);
/* exception: if 'lock' is set
@@ -1714,16 +1782,14 @@ void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
/* ************ custom buttons, old stuff ************** */
/* draws in resolution of 20x4 colors */
-void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha)
+void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha)
{
int a;
- float h, s, v;
+ float h= hsv[0], s= hsv[1], v= hsv[2];
float dx, dy, sx1, sx2, sy;
float col0[4][3]; // left half, rect bottom to top
float col1[4][3]; // right half, rect bottom to top
-
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], &h, &s, &v);
-
+
/* draw series of gouraud rects */
glShadeModel(GL_SMOOTH);
@@ -1764,6 +1830,12 @@ void ui_draw_gradient(rcti *rect, float *rgb, int type, float alpha)
VECCOPY(col1[1], col1[2]);
VECCOPY(col1[3], col1[2]);
break;
+ default:
+ assert(!"invalid 'type' argument");
+ hsv_to_rgb(1.0, 1.0, 1.0, &col1[2][0], &col1[2][1], &col1[2][2]);
+ VECCOPY(col1[0], col1[2]);
+ VECCOPY(col1[1], col1[2]);
+ VECCOPY(col1[3], col1[2]);
}
/* old below */
@@ -1848,11 +1920,21 @@ static void ui_draw_but_HSVCUBE(uiBut *but, rcti *rect)
{
float rgb[3], h,s,v;
float x=0.0f, y=0.0f;
+ float *hsv= ui_block_hsv_get(but->block);
+ float hsvn[3];
+
+ h= hsv[0];
+ s= hsv[1];
+ v= hsv[2];
ui_get_but_vectorf(but, rgb);
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], &h, &s, &v);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], &h, &s, &v);
+
+ hsvn[0]= h;
+ hsvn[1]= s;
+ hsvn[2]= v;
- ui_draw_gradient(rect, rgb, but->a1, 1.f);
+ ui_draw_gradient(rect, hsvn, but->a1, 1.f);
switch((int)but->a1) {
case UI_GRAD_SV:
@@ -1892,7 +1974,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
int color_profile = but->block->color_profile;
if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
- color_profile = BLI_PR_NONE;
+ color_profile = BLI_PR_NONE;
ui_get_but_vectorf(but, rgb);
rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
@@ -1930,7 +2012,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
/* ************ separator, for menus etc ***************** */
-static void ui_draw_separator(uiBut *but, rcti *rect, uiWidgetColors *wcol)
+static void ui_draw_separator(rcti *rect, uiWidgetColors *wcol)
{
int y = rect->ymin + (rect->ymax - rect->ymin)/2 - 1;
unsigned char col[4];
@@ -1954,6 +2036,9 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
float rad= 0.5f*(rect->ymax - rect->ymin);
float textofs = rad*0.75;
+ if(state & UI_SELECT)
+ SWAP(short, wcol->shadetop, wcol->shadedown);
+
widget_init(&wtb);
/* fully rounded */
@@ -2099,7 +2184,7 @@ void uiWidgetScrollDraw(uiWidgetColors *wcol, rcti *rect, rcti *slider, int stat
}
}
-static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
rcti rect1;
double value;
@@ -2160,7 +2245,7 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
uiWidgetScrollDraw(wcol, rect, &rect1, state);
}
-static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
rcti rect_prog = *rect, rect_bar = *rect;
float value = but->a1;
@@ -2186,7 +2271,7 @@ static void widget_progressbar(uiBut *but, uiWidgetColors *wcol, rcti *rect, int
rect->xmin -= 6;
}
-static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_link(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
if(but->flag & UI_SELECT) {
@@ -2208,7 +2293,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
uiWidgetBase wtb, wtb1;
rcti rect1;
double value;
- float offs, fac;
+ float offs, toffs, fac;
char outline[3];
widget_init(&wtb);
@@ -2218,6 +2303,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
/* fully rounded */
offs= 0.5f*(rect->ymax - rect->ymin);
+ toffs = offs*0.75f;
round_box_edges(&wtb, roundboxalign, rect, offs);
wtb.outline= 0;
@@ -2227,7 +2313,9 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
VECCOPY(outline, wcol->outline);
VECCOPY(wcol->outline, wcol->item);
VECCOPY(wcol->inner, wcol->item);
- SWAP(short, wcol->shadetop, wcol->shadedown);
+
+ if(!(state & UI_SELECT))
+ SWAP(short, wcol->shadetop, wcol->shadedown);
rect1= *rect;
@@ -2251,7 +2339,9 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
widgetbase_draw(&wtb1, wcol);
VECCOPY(wcol->outline, outline);
- SWAP(short, wcol->shadetop, wcol->shadedown);
+
+ if(!(state & UI_SELECT))
+ SWAP(short, wcol->shadetop, wcol->shadedown);
/* outline */
wtb.outline= 1;
@@ -2259,10 +2349,13 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
widgetbase_draw(&wtb, wcol);
/* text space */
- rect->xmin += offs*0.75f;
- rect->xmax -= offs*0.75f;
+ rect->xmin += toffs;
+ rect->xmax -= toffs;
}
+/* I think 3 is sufficient border to indicate keyed status */
+#define SWATCH_KEYED_BORDER 3
+
static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
uiWidgetBase wtb;
@@ -2287,6 +2380,19 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
ui_get_but_vectorf(but, col);
+ if(state & (UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN|UI_BUT_REDALERT)) {
+ // draw based on state - color for keyed etc
+ widgetbase_draw(&wtb, wcol);
+
+ // inset to draw swatch color
+ rect->xmin+= SWATCH_KEYED_BORDER;
+ rect->xmax-= SWATCH_KEYED_BORDER;
+ rect->ymin+= SWATCH_KEYED_BORDER;
+ rect->ymax-= SWATCH_KEYED_BORDER;
+
+ round_box_edges(&wtb, roundboxalign, rect, 5.0f);
+ }
+
if (color_profile)
linearrgb_to_srgb_v3_v3(col, col);
@@ -2301,11 +2407,28 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
}
+static void widget_icon_has_anim(uiBut *UNUSED(but), uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
+{
+ if(state & (UI_BUT_ANIMATED|UI_BUT_ANIMATED_KEY|UI_BUT_DRIVEN|UI_BUT_REDALERT)) {
+ uiWidgetBase wtb;
+
+ widget_init(&wtb);
+ wtb.outline= 0;
+
+ /* rounded */
+ round_box_edges(&wtb, 15, rect, 10.0f);
+ widgetbase_draw(&wtb, wcol);
+ }
+}
+
static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
{
uiWidgetBase wtb;
+ if(state & UI_SELECT)
+ SWAP(short, wcol->shadetop, wcol->shadedown);
+
widget_init(&wtb);
/* half rounded */
@@ -2316,7 +2439,7 @@ static void widget_textbut(uiWidgetColors *wcol, rcti *rect, int state, int roun
}
-static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2334,7 +2457,7 @@ static void widget_menubut(uiWidgetColors *wcol, rcti *rect, int state, int roun
rect->xmax -= (rect->ymax-rect->ymin);
}
-static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2347,7 +2470,7 @@ static void widget_menuiconbut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
if(state & UI_ACTIVE) {
uiWidgetBase wtb;
@@ -2362,7 +2485,7 @@ static void widget_pulldownbut(uiWidgetColors *wcol, rcti *rect, int state, int
}
}
-static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
@@ -2375,7 +2498,7 @@ static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
@@ -2388,7 +2511,7 @@ static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int state, int
widgetbase_draw(&wtb, wcol);
}
-static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int UNUSED(roundboxalign))
{
uiWidgetBase wtb;
rcti recttemp= *rect;
@@ -2421,7 +2544,7 @@ static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int ro
}
-static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2434,7 +2557,7 @@ static void widget_radiobut(uiWidgetColors *wcol, rcti *rect, int state, int rou
}
-static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
char old_col[3];
@@ -2443,13 +2566,11 @@ static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state,
VECCOPY(old_col, wcol->inner);
- /* abuse but->hsv - if it's non-zero, use this colour as the box's background */
- if ((but->hsv[0] != 0.0) || (but->hsv[1] != 0.0) || (but->hsv[2] != 0.0)) {
- float rgb[3];
- hsv_to_rgb(but->hsv[0], but->hsv[1], but->hsv[2], rgb+0, rgb+1, rgb+2);
- wcol->inner[0] = rgb[0] * 255;
- wcol->inner[1] = rgb[1] * 255;
- wcol->inner[2] = rgb[2] * 255;
+ /* abuse but->hsv - if it's non-zero, use this color as the box's background */
+ if (but->col[3]) {
+ wcol->inner[0] = but->col[0];
+ wcol->inner[1] = but->col[1];
+ wcol->inner[2] = but->col[2];
}
/* half rounded */
@@ -2464,7 +2585,7 @@ static void widget_box(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state,
VECCOPY(wcol->inner, old_col);
}
-static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_but(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
@@ -2477,7 +2598,7 @@ static void widget_but(uiWidgetColors *wcol, rcti *rect, int state, int roundbox
}
-static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int UNUSED(state), int roundboxalign)
{
uiWidgetBase wtb;
float rad= 5.0f; //0.5f*(rect->ymax - rect->ymin);
@@ -2493,7 +2614,7 @@ static void widget_roundbut(uiWidgetColors *wcol, rcti *rect, int state, int rou
static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *wt, rcti *rect)
{
uiWidgetBase wtb;
- char col[4];
+ unsigned char col[4];
/* state copy! */
wt->wcol= *(wt->wcol_theme);
@@ -2506,7 +2627,7 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
/* make mask to draw over image */
UI_GetThemeColor3ubv(TH_BACK, col);
- glColor3ubv((unsigned char*)col);
+ glColor3ubv(col);
round_box__edges(&wtb, 15, rect, 0.0f, 4.0);
widgetbase_outline(&wtb);
@@ -2643,7 +2764,7 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
/* specials */
case UI_WTYPE_ICON:
- wt.draw= NULL;
+ wt.custom= widget_icon_has_anim;
break;
case UI_WTYPE_SWATCH:
@@ -2742,7 +2863,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
widget_draw_text_icon(&style->widgetlabel, &tui->wcol_menu_back, but, rect);
break;
case SEPR:
- ui_draw_separator(but, rect, &tui->wcol_menu_item);
+ ui_draw_separator(rect, &tui->wcol_menu_item);
break;
default:
@@ -2854,7 +2975,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
break;
case HSVCUBE:
- if(but->a1==9) // vertical V slider, uses new widget draw now
+ if(but->a1 == UI_GRAD_V_ALT) // vertical V slider, uses new widget draw now
ui_draw_but_HSV_v(but, rect);
else // other HSV pickers...
ui_draw_but_HSVCUBE(but, rect);
@@ -2928,7 +3049,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
}
}
-void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_menu_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
{
uiWidgetType *wt= widget_type(UI_WTYPE_MENU_BACK);
@@ -2940,7 +3061,7 @@ void ui_draw_menu_back(uiStyle *style, uiBlock *block, rcti *rect)
}
-void ui_draw_search_back(uiStyle *style, uiBlock *block, rcti *rect)
+void ui_draw_search_back(uiStyle *UNUSED(style), uiBlock *block, rcti *rect)
{
uiWidgetType *wt= widget_type(UI_WTYPE_BOX);
@@ -2959,7 +3080,7 @@ void ui_draw_search_back(uiStyle *style, uiBlock *block, rcti *rect)
/* helper call to draw a menu item without button */
/* state: UI_ACTIVE or 0 */
-void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state)
+void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
{
uiWidgetType *wt= widget_type(UI_WTYPE_MENU_ITEM);
rcti _rect= *rect;
@@ -3005,7 +3126,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid,
}
}
-void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid, int state)
+void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
{
rcti trect = *rect;
@@ -3014,7 +3135,7 @@ void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconi
wt->state(wt, state);
wt->draw(&wt->wcol, rect, 0, 0);
- widget_draw_preview(iconid, 1.f, 1.f, rect);
+ widget_draw_preview(iconid, 1.0f, rect);
if (state == UI_ACTIVE)
glColor3ubv((unsigned char*)wt->wcol.text);
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 1661cf73d53..890ce14f53b 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
@@ -36,7 +36,6 @@
#include "MEM_guardedalloc.h"
-
#include "DNA_curve_types.h"
#include "DNA_userdef_types.h"
#include "DNA_screen_types.h"
@@ -44,13 +43,13 @@
#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
-
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -81,14 +80,14 @@ void ui_resources_free(void)
/* THEMES */
/* ******************************************************** */
-char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
+const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
{
ThemeSpace *ts= NULL;
static char error[4]={240, 0, 240, 255};
static char alert[4]={240, 60, 60, 255};
static char headerdesel[4]={0,0,0,255};
- char *cp= error;
+ const char *cp= error;
if(btheme) {
@@ -285,6 +284,12 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
cp= ts->face_dot; break;
case TH_FACEDOT_SIZE:
cp= &ts->facedot_size; break;
+ case TH_DRAWEXTRA_EDGELEN:
+ cp= ts->extra_edge_len; break;
+ case TH_DRAWEXTRA_FACEAREA:
+ cp= ts->extra_face_area; break;
+ case TH_DRAWEXTRA_FACEANG:
+ cp= ts->extra_face_angle; break;
case TH_NORMAL:
cp= ts->normal; break;
case TH_VNORMAL:
@@ -407,7 +412,7 @@ char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
}
}
- return cp;
+ return (unsigned char *)cp;
}
#define SETCOLTEST(col, r, g, b, a) if(col[3]==0) {col[0]=r; col[1]=g; col[2]= b; col[3]= a;}
@@ -466,7 +471,7 @@ static void ui_theme_init_new(bTheme *btheme)
*/
void ui_theme_init_default(void)
{
- bTheme *btheme= U.themes.first;
+ bTheme *btheme;
/* we search for the theme with name Default */
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
@@ -520,6 +525,11 @@ void ui_theme_init_default(void)
SETCOL(btheme->tv3d.vertex_normal, 0x23, 0x61, 0xDD, 255);
SETCOL(btheme->tv3d.face_dot, 255, 133, 0, 255);
btheme->tv3d.facedot_size= 4;
+
+ SETCOL(btheme->tv3d.extra_edge_len, 32, 0, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_area, 0, 32, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_angle, 0, 0, 128, 255);
+
SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tv3d.nurb_uline, 0x90, 0x90, 0x00, 255);
@@ -717,20 +727,20 @@ void UI_SetTheme(int spacetype, int regionid)
// for space windows only
void UI_ThemeColor(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
- glColor3ub(cp[0], cp[1], cp[2]);
+ glColor3ubv(cp);
}
// plus alpha
void UI_ThemeColor4(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
- glColor4ub(cp[0], cp[1], cp[2], cp[3]);
+ glColor4ubv(cp);
}
@@ -738,7 +748,7 @@ void UI_ThemeColor4(int colorid)
void UI_ThemeColorShade(int colorid, int offset)
{
int r, g, b;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
r= offset + (int) cp[0];
@@ -753,7 +763,7 @@ void UI_ThemeColorShade(int colorid, int offset)
void UI_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
{
int r, g, b, a;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
r= coloffset + (int) cp[0];
@@ -771,7 +781,7 @@ void UI_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset)
void UI_ThemeColorBlend(int colorid1, int colorid2, float fac)
{
int r, g, b;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -788,7 +798,7 @@ void UI_ThemeColorBlend(int colorid1, int colorid2, float fac)
void UI_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
{
int r, g, b;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -809,7 +819,7 @@ void UI_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
void UI_ThemeColorBlendShadeAlpha(int colorid1, int colorid2, float fac, int offset, int alphaoffset)
{
int r, g, b, a;
- char *cp1, *cp2;
+ const unsigned char *cp1, *cp2;
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
@@ -832,7 +842,7 @@ void UI_ThemeColorBlendShadeAlpha(int colorid1, int colorid2, float fac, int off
// get individual values, not scaled
float UI_GetThemeValuef(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
return ((float)cp[0]);
@@ -842,7 +852,7 @@ float UI_GetThemeValuef(int colorid)
// get individual values, not scaled
int UI_GetThemeValue(int colorid)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
return ((int) cp[0]);
@@ -853,7 +863,7 @@ int UI_GetThemeValue(int colorid)
// get the color, range 0.0-1.0
void UI_GetThemeColor3fv(int colorid, float *col)
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= ((float)cp[0])/255.0;
@@ -865,7 +875,7 @@ void UI_GetThemeColor3fv(int colorid, float *col)
void UI_GetThemeColorShade3fv(int colorid, int offset, float *col)
{
int r, g, b;
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
@@ -882,9 +892,9 @@ void UI_GetThemeColorShade3fv(int colorid, int offset, float *col)
}
// get the color, in char pointer
-void UI_GetThemeColor3ubv(int colorid, char *col)
+void UI_GetThemeColor3ubv(int colorid, unsigned char col[3])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= cp[0];
@@ -893,9 +903,9 @@ void UI_GetThemeColor3ubv(int colorid, char *col)
}
// get the color, in char pointer
-void UI_GetThemeColor4ubv(int colorid, char *col)
+void UI_GetThemeColor4ubv(int colorid, unsigned char col[4])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
col[0]= cp[0];
@@ -904,9 +914,9 @@ void UI_GetThemeColor4ubv(int colorid, char *col)
col[3]= cp[3];
}
-void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
+void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4])
{
- char *cp;
+ const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, spacetype, colorid);
col[0]= cp[0];
@@ -916,7 +926,7 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
}
// blends and shades between two char color pointers
-void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset)
+void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset)
{
int r, g, b;
@@ -933,7 +943,7 @@ void UI_ColorPtrBlendShade3ubv(char *cp1, char *cp2, float fac, int offset)
}
// get a 3 byte color, blended and shaded between two other char color pointers
-void UI_GetColorPtrBlendShade3ubv(char *cp1, char *cp2, char *col, float fac, int offset)
+void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset)
{
int r, g, b;
@@ -959,26 +969,27 @@ void UI_ThemeClearColor(int colorid)
glClearColor(col[0], col[1], col[2], 0.0);
}
-void UI_make_axis_color(char *src_col, char *dst_col, char axis)
+void UI_make_axis_color(const unsigned char src_col[3], unsigned char dst_col[3], const char axis)
{
switch(axis)
{
- case 'x':
case 'X':
dst_col[0]= src_col[0]>219?255:src_col[0]+36;
dst_col[1]= src_col[1]<26?0:src_col[1]-26;
dst_col[2]= src_col[2]<26?0:src_col[2]-26;
break;
- case 'y':
case 'Y':
dst_col[0]= src_col[0]<46?0:src_col[0]-36;
dst_col[1]= src_col[1]>189?255:src_col[1]+66;
dst_col[2]= src_col[2]<46?0:src_col[2]-36;
break;
- default:
+ case 'Z':
dst_col[0]= src_col[0]<26?0:src_col[0]-26;
dst_col[1]= src_col[1]<26?0:src_col[1]-26;
dst_col[2]= src_col[2]>209?255:src_col[2]+46;
+ break;
+ default:
+ BLI_assert(!"invalid axis arg");
}
}
@@ -1001,10 +1012,8 @@ void init_userdef_do_versions(void)
U.tb_rightmouse= 5;
}
if(U.mixbufsize==0) U.mixbufsize= 2048;
- if (BLI_streq(U.tempdir, "/")) {
- char *tmp= getenv("TEMP");
-
- strcpy(U.tempdir, tmp?tmp:"/tmp/");
+ if (strcmp(U.tempdir, "/") == 0) {
+ BLI_where_is_temp(U.tempdir, sizeof(U.tempdir), FALSE);
}
if (U.autokey_mode == 0) {
/* 'add/replace' but not on */
@@ -1012,7 +1021,7 @@ void init_userdef_do_versions(void)
}
if (U.savetime <= 0) {
U.savetime = 1;
-// XXX error("startup.blend is buggy, please consider removing it.\n");
+// XXX error(STRINGIFY(BLENDER_STARTUP_FILE)" is buggy, please consider removing it.\n");
}
/* transform widget settings */
if(U.tw_hotspot==0) {
@@ -1192,7 +1201,7 @@ void init_userdef_do_versions(void)
if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 11)) {
bTheme *btheme;
for (btheme= U.themes.first; btheme; btheme= btheme->next) {
- /* these should all use the same colour */
+ /* these should all use the same color */
SETCOL(btheme->tv3d.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tipo.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tact.cframe, 0x60, 0xc0, 0x40, 255);
@@ -1498,6 +1507,20 @@ void init_userdef_do_versions(void)
btheme->tui.wcol_progress= wcol_progress;
}
}
+
+ if (bmain->versionfile < 255 || (bmain->versionfile == 255 && bmain->subversionfile < 2)) {
+ bTheme *btheme;
+ for(btheme= U.themes.first; btheme; btheme= btheme->next) {
+ SETCOL(btheme->tv3d.extra_edge_len, 32, 0, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_angle, 0, 32, 0, 255);
+ SETCOL(btheme->tv3d.extra_face_area, 0, 0, 128, 255);
+ }
+ }
+
+ if (bmain->versionfile < 257) {
+ /* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs, so that it doesn't linger around from old configs like a ghost */
+ U.autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
+ }
/* GL Texture Garbage Collection (variable abused above!) */
if (U.textimeout == 0) {
@@ -1514,7 +1537,7 @@ void init_userdef_do_versions(void)
U.dbl_click_time = 350;
}
if (U.anim_player_preset == 0) {
- U.anim_player_preset =1 ;
+ U.anim_player_preset = 1 ;
}
if (U.scrcastfps == 0) {
U.scrcastfps = 10;
@@ -1523,6 +1546,8 @@ void init_userdef_do_versions(void)
if (U.v2d_min_gridsize == 0) {
U.v2d_min_gridsize= 35;
}
+ if (U.dragthreshold == 0 )
+ U.dragthreshold= 5;
/* funny name, but it is GE stuff, moves userdef stuff to engine */
// XXX space_set_commmandline_options();
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index 14ec7c6d0d6..e4c328758c0 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,10 +36,11 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -57,6 +58,9 @@
/* *********************************************************************** */
+/* XXX still unresolved: scrolls hide/unhide vs region mask handling */
+/* XXX there's V2D_SCROLL_HORIZONTAL_HIDE and V2D_SCROLL_HORIZONTAL_FULLR ... */
+
/* helper to allow scrollbars to dynamically hide
* - returns a copy of the scrollbar settings with the flags to display
* horizontal/vertical scrollbars removed
@@ -83,6 +87,7 @@ static void view2d_masks(View2D *v2d)
v2d->mask.ymax= v2d->winy - 1;
#if 0
+ // XXX see above
v2d->scroll &= ~(V2D_SCROLL_HORIZONTAL_HIDE|V2D_SCROLL_VERTICAL_HIDE);
/* check size if: */
if (v2d->scroll & V2D_SCROLL_HORIZONTAL)
@@ -250,8 +255,6 @@ void UI_view2d_region_reinit(View2D *v2d, short type, int winx, int winy)
/* absolutely no scrollers allowed */
v2d->scroll= 0;
- /* pixel offsets need to be applied for smooth UI controls */
- v2d->flag |= (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
}
break;
@@ -845,7 +848,7 @@ void UI_view2d_totRect_set_resize (View2D *v2d, int width, int height, int resiz
if (ELEM3(0, v2d, width, height)) {
if (G.f & G_DEBUG)
- printf("Error: View2D totRect set exiting: v2d=%p width=%d height=%d \n", v2d, width, height); // XXX temp debug info
+ printf("Error: View2D totRect set exiting: v2d=%p width=%d height=%d \n", (void *)v2d, width, height); // XXX temp debug info
return;
}
@@ -967,7 +970,7 @@ static void view2d_map_cur_using_mask(View2D *v2d, rctf *curmasked)
}
/* Set view matrices to use 'cur' rect as viewing frame for View2D drawing */
-void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
+void UI_view2d_view_ortho(View2D *v2d)
{
rctf curmasked;
float xofs, yofs;
@@ -975,10 +978,6 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* pixel offsets (-0.375f) are needed to get 1:1 correspondance with pixels for smooth UI drawing,
* but only applied where requsted
*/
- /* XXX ton: fix this! */
- xofs= 0.0; // (v2d->flag & V2D_PIXELOFS_X) ? 0.375f : 0.0f;
- yofs= 0.0; // (v2d->flag & V2D_PIXELOFS_Y) ? 0.375f : 0.0f;
-
/* XXX brecht: instead of zero at least use a tiny offset, otherwise
* pixel rounding is effectively random due to float inaccuracy */
xofs= 0.001f*(v2d->cur.xmax - v2d->cur.xmin)/(v2d->mask.xmax - v2d->mask.xmin);
@@ -987,6 +986,19 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* apply mask-based adjustments to cur rect (due to scrollers), to eliminate scaling artifacts */
view2d_map_cur_using_mask(v2d, &curmasked);
+ curmasked.xmin-= xofs; curmasked.xmax-=xofs;
+ curmasked.ymin-= yofs; curmasked.ymax-=yofs;
+
+ /* XXX ton: this flag set by outliner, for icons */
+ if(v2d->flag & V2D_PIXELOFS_X) {
+ curmasked.xmin= floor(curmasked.xmin) - 0.001f;
+ curmasked.xmax= floor(curmasked.xmax) - 0.001f;
+ }
+ if(v2d->flag & V2D_PIXELOFS_Y) {
+ curmasked.ymin= floor(curmasked.ymin) - 0.001f;
+ curmasked.ymax= floor(curmasked.ymax) - 0.001f;
+ }
+
/* set matrix on all appropriate axes */
wmOrtho2(curmasked.xmin-xofs, curmasked.xmax-xofs, curmasked.ymin-yofs, curmasked.ymax-yofs);
@@ -997,9 +1009,8 @@ void UI_view2d_view_ortho(const bContext *C, View2D *v2d)
/* Set view matrices to only use one axis of 'cur' only
* - xaxis = if non-zero, only use cur x-axis, otherwise use cur-yaxis (mostly this will be used for x)
*/
-void UI_view2d_view_orthoSpecial(const bContext *C, View2D *v2d, short xaxis)
+void UI_view2d_view_orthoSpecial(ARegion *ar, View2D *v2d, short xaxis)
{
- ARegion *ar= CTX_wm_region(C);
rctf curmasked;
float xofs, yofs;
@@ -1070,7 +1081,7 @@ static void step_to_grid(float *step, int *power, int unit)
/* for frames, we want 1.0 frame intervals only */
if (unit == V2D_UNIT_FRAMES) {
rem = 1.0f;
- *step = 1.0f;
+ *step = 2.0f; /* use 2 since there are grid lines drawn in between, this way to get 1 line per frane */
}
/* prevents printing 1.0 2.0 3.0 etc */
@@ -1098,15 +1109,14 @@ static void step_to_grid(float *step, int *power, int unit)
*
* - xunits,yunits = V2D_UNIT_* grid steps in seconds or frames
* - xclamp,yclamp = V2D_CLAMP_* only show whole-number intervals
- * - winx = width of region we're drawing to
+ * - winx = width of region we're drawing to, note: not used but keeping for completeness.
* - winy = height of region we're drawing into
*/
-View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int winx, int winy)
+View2DGrid *UI_view2d_grid_calc(Scene *scene, View2D *v2d, short xunits, short xclamp, short yunits, short yclamp, int UNUSED(winx), int winy)
{
- Scene *scene= CTX_data_scene(C);
+
View2DGrid *grid;
float space, pixels, seconddiv;
- int secondgrid;
/* check that there are at least some workable args */
if (ELEM(V2D_ARG_DUMMY, xunits, xclamp) && ELEM(V2D_ARG_DUMMY, yunits, yclamp))
@@ -1117,11 +1127,9 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
/* rule: gridstep is minimal GRIDSTEP pixels */
if (xunits == V2D_UNIT_SECONDS) {
- secondgrid= 1;
seconddiv= (float)(0.01 * FPS);
}
else {
- secondgrid= 0;
seconddiv= 1.0f;
}
@@ -1130,9 +1138,11 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
space= v2d->cur.xmax - v2d->cur.xmin;
pixels= (float)(v2d->mask.xmax - v2d->mask.xmin);
- grid->dx= (U.v2d_min_gridsize * space) / (seconddiv * pixels);
- step_to_grid(&grid->dx, &grid->powerx, xunits);
- grid->dx *= seconddiv;
+ if(pixels!=0.0f) {
+ grid->dx= (U.v2d_min_gridsize * space) / (seconddiv * pixels);
+ step_to_grid(&grid->dx, &grid->powerx, xunits);
+ grid->dx *= seconddiv;
+ }
if (xclamp == V2D_GRID_CLAMP) {
if (grid->dx < 0.1f) grid->dx= 0.1f;
@@ -1174,7 +1184,7 @@ View2DGrid *UI_view2d_grid_calc(const bContext *C, View2D *v2d, short xunits, sh
}
/* Draw gridlines in the given 2d-region */
-void UI_view2d_grid_draw(const bContext *C, View2D *v2d, View2DGrid *grid, int flag)
+void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
{
float vec1[2], vec2[2];
int a, step;
@@ -1283,7 +1293,7 @@ void UI_view2d_grid_draw(const bContext *C, View2D *v2d, View2DGrid *grid, int f
}
/* Draw a constant grid in given 2d-region */
-void UI_view2d_constant_grid_draw(const bContext *C, View2D *v2d)
+void UI_view2d_constant_grid_draw(View2D *v2d)
{
float start, step= 25.0f;
@@ -1481,7 +1491,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
scrollers->yclamp= yclamp;
scrollers->yunits= yunits;
- scrollers->grid= UI_view2d_grid_calc(C, v2d, xunits, xclamp, yunits, yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
+ scrollers->grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, xunits, xclamp, yunits, yclamp, (hor.xmax - hor.xmin), (vert.ymax - vert.ymin));
}
/* return scrollers */
@@ -1489,7 +1499,7 @@ View2DScrollers *UI_view2d_scrollers_calc(const bContext *C, View2D *v2d, short
}
/* Print scale marking along a time scrollbar */
-static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, float y, float val, int power, short unit, char dir)
+static void scroll_printstr(Scene *scene, float x, float y, float val, int power, short unit, char dir)
{
int len;
char str[32];
@@ -1526,7 +1536,7 @@ static void scroll_printstr(View2DScrollers *scrollers, Scene *scene, float x, f
}
/* draw it */
- BLF_draw_default(x, y, 0.0f, str);
+ BLF_draw_default(x, y, 0.0f, str, sizeof(str)-1);
}
/* Draw scrollbars in the given 2d-region */
@@ -1570,6 +1580,9 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
state |= UI_SCROLL_ARROWS;
}
+ UI_ThemeColor(TH_BACK);
+ glRecti(v2d->hor.xmin, v2d->hor.ymin, v2d->hor.xmax, v2d->hor.ymax);
+
uiWidgetScrollDraw(&wcol, &hor, &slider, state);
}
@@ -1614,16 +1627,16 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
switch (vs->xunits) {
case V2D_UNIT_FRAMES: /* frames (as whole numbers)*/
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMES, 'h');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMES, 'h');
break;
case V2D_UNIT_FRAMESCALE: /* frames (not always as whole numbers) */
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMESCALE, 'h');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_FRAMESCALE, 'h');
break;
case V2D_UNIT_SECONDS: /* seconds */
fac2= val/(float)FPS;
- scroll_printstr(vs, scene, fac, h, fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
+ scroll_printstr(scene, fac, h, fac2, grid->powerx, V2D_UNIT_SECONDS, 'h');
break;
case V2D_UNIT_SECONDSSEQ: /* seconds with special calculations (only used for sequencer only) */
@@ -1634,13 +1647,13 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
time= (float)floor(fac2);
fac2= fac2-time;
- scroll_printstr(vs, scene, fac, h, time+(float)FPS*fac2/100.0f, grid->powerx, V2D_UNIT_SECONDSSEQ, 'h');
+ scroll_printstr(scene, fac, h, time+(float)FPS*fac2/100.0f, grid->powerx, V2D_UNIT_SECONDSSEQ, 'h');
}
break;
case V2D_UNIT_DEGREES: /* Graph Editor for rotation Drivers */
/* HACK: although we're drawing horizontal, we make this draw as 'vertical', just to get degree signs */
- scroll_printstr(vs, scene, fac, h, val, grid->powerx, V2D_UNIT_DEGREES, 'v');
+ scroll_printstr(scene, fac, h, val, grid->powerx, V2D_UNIT_DEGREES, 'v');
break;
}
}
@@ -1678,6 +1691,9 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
state |= UI_SCROLL_ARROWS;
}
+ UI_ThemeColor(TH_BACK);
+ glRecti(v2d->vert.xmin, v2d->vert.ymin, v2d->vert.xmax, v2d->vert.ymax);
+
uiWidgetScrollDraw(&wcol, &vert, &slider, state);
}
@@ -1694,10 +1710,10 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
* NOTE: it's assumed that that scrollbar is there if this is involved!
*/
fac= (grid->starty- v2d->cur.ymin) / (v2d->cur.ymax - v2d->cur.ymin);
- fac= (vert.ymin + V2D_SCROLL_HEIGHT) + fac*(vert.ymax - vert.ymin - V2D_SCROLL_HEIGHT);
+ fac= vert.ymin + fac*(vert.ymax - vert.ymin);
dfac= (grid->dy) / (v2d->cur.ymax - v2d->cur.ymin);
- dfac= dfac * (vert.ymax - vert.ymin - V2D_SCROLL_HEIGHT);
+ dfac= dfac * (vert.ymax - vert.ymin);
/* set starting value, and text color */
UI_ThemeColor(TH_TEXT);
@@ -1719,7 +1735,7 @@ void UI_view2d_scrollers_draw(const bContext *C, View2D *v2d, View2DScrollers *v
if(fac < vert.ymin+10)
continue;
- scroll_printstr(vs, scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v');
+ scroll_printstr(scene, (float)(vert.xmax)-2.0f, fac, val, grid->powery, vs->yunits, 'v');
}
BLF_disable_default(BLF_ROTATION);
@@ -2003,48 +2019,58 @@ static ListBase strings= {NULL, NULL};
typedef struct View2DString {
struct View2DString *next, *prev;
- float col[4];
- char str[128];
+ union {
+ unsigned char ub[4];
+ int pack;
+ } col;
short mval[2];
rcti rect;
} View2DString;
-void UI_view2d_text_cache_add(View2D *v2d, float x, float y, char *str)
+void UI_view2d_text_cache_add(View2D *v2d, float x, float y, const char *str, const char col[4])
{
int mval[2];
UI_view2d_view_to_region(v2d, x, y, mval, mval+1);
if(mval[0]!=V2D_IS_CLIPPED && mval[1]!=V2D_IS_CLIPPED) {
+ int len= strlen(str)+1;
/* use calloc, rect has to be zeroe'd */
- View2DString *v2s= MEM_callocN(sizeof(View2DString), "View2DString");
-
+ View2DString *v2s= MEM_callocN(sizeof(View2DString)+len, "View2DString");
+ char *v2s_str= (char *)(v2s+1);
+ memcpy(v2s_str, str, len);
+
BLI_addtail(&strings, v2s);
- BLI_strncpy(v2s->str, str, 128);
+ v2s->col.pack= *((int *)col);
v2s->mval[0]= mval[0];
v2s->mval[1]= mval[1];
- glGetFloatv(GL_CURRENT_COLOR, v2s->col);
}
}
/* no clip (yet) */
-void UI_view2d_text_cache_rectf(View2D *v2d, rctf *rect, char *str)
+void UI_view2d_text_cache_rectf(View2D *v2d, rctf *rect, const char *str, const char col[4])
{
- View2DString *v2s= MEM_callocN(sizeof(View2DString), "View2DString");
-
+ int len= strlen(str)+1;
+ View2DString *v2s= MEM_callocN(sizeof(View2DString)+len, "View2DString");
+ char *v2s_str= (char *)(v2s+1);
+ memcpy(v2s_str, str, len);
+
UI_view2d_to_region_no_clip(v2d, rect->xmin, rect->ymin, &v2s->rect.xmin, &v2s->rect.ymin);
UI_view2d_to_region_no_clip(v2d, rect->xmax, rect->ymax, &v2s->rect.xmax, &v2s->rect.ymax);
-
+
+ v2s->col.pack= *((int *)col);
+ v2s->mval[0]= v2s->rect.xmin;
+ v2s->mval[1]= v2s->rect.ymin;
+
BLI_addtail(&strings, v2s);
- BLI_strncpy(v2s->str, str, 128);
- glGetFloatv(GL_CURRENT_COLOR, v2s->col);
}
void UI_view2d_text_cache_draw(ARegion *ar)
{
View2DString *v2s;
+ int col_pack_prev= 0;
// glMatrixMode(GL_PROJECTION);
// glPushMatrix();
@@ -2053,18 +2079,23 @@ void UI_view2d_text_cache_draw(ARegion *ar)
ED_region_pixelspace(ar);
for(v2s= strings.first; v2s; v2s= v2s->next) {
- glColor3fv(v2s->col);
- if(v2s->rect.xmin==v2s->rect.xmax)
- BLF_draw_default((float)v2s->mval[0], (float)v2s->mval[1], 0.0, v2s->str);
+ const char *str= (const char *)(v2s+1);
+ int xofs=0, yofs;
+
+ yofs= ceil( 0.5f*(v2s->rect.ymax - v2s->rect.ymin - BLF_height_default("28")));
+ if(yofs<1) yofs= 1;
+
+ if(col_pack_prev != v2s->col.pack) {
+ glColor3ubv(v2s->col.ub);
+ col_pack_prev= v2s->col.pack;
+ }
+
+ if(v2s->rect.xmin >= v2s->rect.xmax)
+ BLF_draw_default((float)v2s->mval[0]+xofs, (float)v2s->mval[1]+yofs, 0.0, str, 65535);
else {
- int xofs=0, yofs;
-
- yofs= ceil( 0.5f*(v2s->rect.ymax - v2s->rect.ymin - BLF_height_default("28")));
- if(yofs<1) yofs= 1;
-
BLF_clipping_default(v2s->rect.xmin-4, v2s->rect.ymin-4, v2s->rect.xmax+4, v2s->rect.ymax+4);
BLF_enable_default(BLF_CLIPPING);
- BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, v2s->str);
+ BLF_draw_default(v2s->rect.xmin+xofs, v2s->rect.ymin+yofs, 0.0f, str, 65535);
BLF_disable_default(BLF_CLIPPING);
}
}
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index de1b26e987b..66a58e71ed6 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +32,7 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -46,6 +47,8 @@
#include "UI_view2d.h"
+#include "PIL_time.h" /* USER_ZOOM_CONT */
+
static int view2d_poll(bContext *C)
{
ARegion *ar= CTX_wm_region(C);
@@ -119,7 +122,7 @@ static int view_pan_init(bContext *C, wmOperator *op)
}
/* apply transform to view (i.e. adjust 'cur' rect) */
-static void view_pan_apply(bContext *C, wmOperator *op)
+static void view_pan_apply(wmOperator *op)
{
v2dViewPanData *vpd= op->customdata;
View2D *v2d= vpd->v2d;
@@ -146,7 +149,6 @@ static void view_pan_apply(bContext *C, wmOperator *op)
ED_region_tag_redraw(vpd->ar);
UI_view2d_sync(vpd->sc, vpd->sa, v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
/* exceptions */
if (vpd->sa->spacetype==SPACE_OUTLINER) {
@@ -157,7 +159,7 @@ static void view_pan_apply(bContext *C, wmOperator *op)
}
/* cleanup temp customdata */
-static void view_pan_exit(bContext *C, wmOperator *op)
+static void view_pan_exit(wmOperator *op)
{
if (op->customdata) {
MEM_freeN(op->customdata);
@@ -173,8 +175,8 @@ static int view_pan_exec(bContext *C, wmOperator *op)
if (!view_pan_init(C, op))
return OPERATOR_CANCELLED;
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -200,8 +202,8 @@ static int view_pan_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", event->prevx - event->x);
RNA_int_set(op->ptr, "deltay", event->prevy - event->y);
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
@@ -237,7 +239,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
vpd->lastx= event->x;
vpd->lasty= event->y;
- view_pan_apply(C, op);
+ view_pan_apply(op);
}
break;
@@ -248,7 +250,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx));
RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
- view_pan_exit(C, op);
+ view_pan_exit(op);
WM_cursor_restore(CTX_wm_window(C));
WM_operator_name_call(C, "VIEW2D_OT_zoom", WM_OP_INVOKE_DEFAULT, NULL);
@@ -261,7 +263,7 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "deltax", (vpd->startx - vpd->lastx));
RNA_int_set(op->ptr, "deltay", (vpd->starty - vpd->lasty));
- view_pan_exit(C, op);
+ view_pan_exit(op);
WM_cursor_restore(CTX_wm_window(C));
return OPERATOR_FINISHED;
@@ -272,13 +274,13 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int view_pan_cancel(bContext *C, wmOperator *op)
+static int view_pan_cancel(bContext *UNUSED(C), wmOperator *op)
{
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_CANCELLED;
}
-void VIEW2D_OT_pan(wmOperatorType *ot)
+static void VIEW2D_OT_pan(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Pan View";
@@ -313,7 +315,7 @@ static int view_scrollright_exec(bContext *C, wmOperator *op)
/* also, check if can pan in horizontal axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_X) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -322,13 +324,13 @@ static int view_scrollright_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltay", 0);
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_scroll_right(wmOperatorType *ot)
+static void VIEW2D_OT_scroll_right(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Right";
@@ -357,7 +359,7 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op)
/* also, check if can pan in horizontal axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_X) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -366,13 +368,13 @@ static int view_scrollleft_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltay", 0);
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_scroll_left(wmOperatorType *ot)
+static void VIEW2D_OT_scroll_left(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Left";
@@ -400,7 +402,7 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op)
/* also, check if can pan in vertical axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -408,14 +410,19 @@ static int view_scrolldown_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltax", 0);
RNA_int_set(op->ptr, "deltay", -40);
+ if(RNA_boolean_get(op->ptr, "page")) {
+ ARegion *ar= CTX_wm_region(C);
+ RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymin - ar->v2d.mask.ymax);
+ }
+
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_scroll_down(wmOperatorType *ot)
+static void VIEW2D_OT_scroll_down(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Down";
@@ -428,6 +435,7 @@ void VIEW2D_OT_scroll_down(wmOperatorType *ot)
/* rna - must keep these in sync with the other operators */
RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX);
+ RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll down one page.");
}
@@ -444,7 +452,7 @@ static int view_scrollup_exec(bContext *C, wmOperator *op)
/* also, check if can pan in vertical axis */
vpd= op->customdata;
if (vpd->v2d->keepofs & V2D_LOCKOFS_Y) {
- view_pan_exit(C, op);
+ view_pan_exit(op);
return OPERATOR_PASS_THROUGH;
}
@@ -452,14 +460,19 @@ static int view_scrollup_exec(bContext *C, wmOperator *op)
RNA_int_set(op->ptr, "deltax", 0);
RNA_int_set(op->ptr, "deltay", 40);
+ if(RNA_boolean_get(op->ptr, "page")) {
+ ARegion *ar= CTX_wm_region(C);
+ RNA_int_set(op->ptr, "deltay", ar->v2d.mask.ymax - ar->v2d.mask.ymin);
+ }
+
/* apply movement, then we're done */
- view_pan_apply(C, op);
- view_pan_exit(C, op);
+ view_pan_apply(op);
+ view_pan_exit(op);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_scroll_up(wmOperatorType *ot)
+static void VIEW2D_OT_scroll_up(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroll Up";
@@ -472,6 +485,7 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
/* rna - must keep these in sync with the other operators */
RNA_def_int(ot->srna, "deltax", 0, INT_MIN, INT_MAX, "Delta X", "", INT_MIN, INT_MAX);
RNA_def_int(ot->srna, "deltay", 0, INT_MIN, INT_MAX, "Delta Y", "", INT_MIN, INT_MAX);
+ RNA_def_boolean(ot->srna, "page", 0, "Page", "Scroll up one page.");
}
/* ********************************************************* */
@@ -494,7 +508,11 @@ void VIEW2D_OT_scroll_up(wmOperatorType *ot)
typedef struct v2dViewZoomData {
View2D *v2d; /* view2d we're operating in */
ARegion *ar;
-
+
+ /* needed for continuous zoom */
+ wmTimer *timer;
+ double timer_lastdraw;
+
int lastx, lasty; /* previous x/y values of mouse in window */
float dx, dy; /* running tally of previous delta values (for obtaining final zoom) */
float mx_2d, my_2d; /* initial mouse location in v2d coords */
@@ -628,13 +646,12 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vzd->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* --------------- Individual Operators ------------------- */
/* cleanup temp customdata */
-static void view_zoomstep_exit(bContext *C, wmOperator *op)
+static void view_zoomstep_exit(wmOperator *op)
{
if (op->customdata) {
MEM_freeN(op->customdata);
@@ -656,7 +673,7 @@ static int view_zoomin_exec(bContext *C, wmOperator *op)
/* apply movement, then we're done */
view_zoomstep_apply(C, op);
- view_zoomstep_exit(C, op);
+ view_zoomstep_exit(op);
return OPERATOR_FINISHED;
}
@@ -682,7 +699,7 @@ static int view_zoomin_invoke(bContext *C, wmOperator *op, wmEvent *event)
return view_zoomin_exec(C, op);
}
-void VIEW2D_OT_zoom_in(wmOperatorType *ot)
+static void VIEW2D_OT_zoom_in(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom In";
@@ -691,7 +708,7 @@ void VIEW2D_OT_zoom_in(wmOperatorType *ot)
/* api callbacks */
ot->invoke= view_zoomin_invoke;
- ot->exec= view_zoomin_exec;
+// ot->exec= view_zoomin_exec; // XXX, needs view_zoomdrag_init called first.
ot->poll= view_zoom_poll;
/* rna - must keep these in sync with the other operators */
@@ -713,7 +730,7 @@ static int view_zoomout_exec(bContext *C, wmOperator *op)
/* apply movement, then we're done */
view_zoomstep_apply(C, op);
- view_zoomstep_exit(C, op);
+ view_zoomstep_exit(op);
return OPERATOR_FINISHED;
}
@@ -739,7 +756,7 @@ static int view_zoomout_invoke(bContext *C, wmOperator *op, wmEvent *event)
return view_zoomout_exec(C, op);
}
-void VIEW2D_OT_zoom_out(wmOperatorType *ot)
+static void VIEW2D_OT_zoom_out(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom Out";
@@ -748,7 +765,7 @@ void VIEW2D_OT_zoom_out(wmOperatorType *ot)
/* api callbacks */
ot->invoke= view_zoomout_invoke;
- ot->exec= view_zoomout_exec;
+// ot->exec= view_zoomout_exec; // XXX, needs view_zoomdrag_init called first.
ot->poll= view_zoom_poll;
/* rna - must keep these in sync with the other operators */
@@ -775,7 +792,18 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
/* get amount to move view by */
dx= RNA_float_get(op->ptr, "deltax");
dy= RNA_float_get(op->ptr, "deltay");
-
+
+ /* continous zoom shouldn't move that fast... */
+ if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ double time= PIL_check_seconds_timer();
+ float time_step= (float)(time - vzd->timer_lastdraw);
+
+ dx *= time_step * 0.5f;
+ dy *= time_step * 0.5f;
+
+ vzd->timer_lastdraw= time;
+ }
+
/* only move view on an axis if change is allowed */
if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0) {
if (v2d->keepofs & V2D_LOCKOFS_X) {
@@ -822,13 +850,17 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vzd->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* cleanup temp customdata */
static void view_zoomdrag_exit(bContext *C, wmOperator *op)
{
if (op->customdata) {
+ v2dViewZoomData *vzd= op->customdata;
+
+ if(vzd->timer)
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), vzd->timer);
+
MEM_freeN(op->customdata);
op->customdata= NULL;
}
@@ -905,6 +937,12 @@ static int view_zoomdrag_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* add temp handler */
WM_event_add_modal_handler(C, op);
+ if (U.viewzoom == USER_ZOOM_CONT) {
+ /* needs a timer to continue redrawing */
+ vzd->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+ vzd->timer_lastdraw= PIL_check_seconds_timer();
+ }
+
return OPERATOR_RUNNING_MODAL;
}
@@ -915,91 +953,94 @@ static int view_zoomdrag_modal(bContext *C, wmOperator *op, wmEvent *event)
View2D *v2d= vzd->v2d;
/* execute the events */
- switch (event->type) {
- case MOUSEMOVE:
- {
- float dx, dy;
+ if (event->type == TIMER && event->customdata == vzd->timer) {
+ view_zoomdrag_apply(C, op);
+ }
+ else if(event->type == MOUSEMOVE) {
+ float dx, dy;
+
+ /* calculate new delta transform, based on zooming mode */
+ if (U.viewzoom == USER_ZOOM_SCALE) {
+ /* 'scale' zooming */
+ float dist;
- /* calculate new delta transform, based on zooming mode */
- if (U.viewzoom == USER_ZOOM_SCALE) {
- /* 'scale' zooming */
- float dist;
-
- /* x-axis transform */
- dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f;
- dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f);
- dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin);
+ /* x-axis transform */
+ dist = (v2d->mask.xmax - v2d->mask.xmin) / 2.0f;
+ dx= 1.0f - ((float)fabs(vzd->lastx - dist) + 2.0f) / ((float)fabs(event->x - dist) + 2.0f);
+ dx*= 0.5f * (v2d->cur.xmax - v2d->cur.xmin);
+
+ /* y-axis transform */
+ dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f;
+ dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f);
+ dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin);
+ }
+ else {
+ /* 'continuous' or 'dolly' */
+ float fac;
+
+ /* x-axis transform */
+ fac= 0.01f * (event->x - vzd->lastx);
+ dx= fac * (v2d->cur.xmax - v2d->cur.xmin);
+
+ /* y-axis transform */
+ fac= 0.01f * (event->y - vzd->lasty);
+ dy= fac * (v2d->cur.ymax - v2d->cur.ymin);
+#if 0
+ /* continous zoom shouldn't move that fast... */
+ if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ double time= PIL_check_seconds_timer();
+ float time_step= (float)(time - vzd->timer_lastdraw);
+
+ dx /= (0.1f / time_step);
+ dy /= (0.1f / time_step);
- /* y-axis transform */
- dist = (v2d->mask.ymax - v2d->mask.ymin) / 2.0f;
- dy= 1.0f - ((float)fabs(vzd->lasty - dist) + 2.0f) / ((float)fabs(event->y - dist) + 2.0f);
- dy*= 0.5f * (v2d->cur.ymax - v2d->cur.ymin);
+ vzd->timer_lastdraw= time;
}
- else {
- /* 'continuous' or 'dolly' */
- float fac;
-
- /* x-axis transform */
- fac= 0.01f * (event->x - vzd->lastx);
- dx= fac * (v2d->cur.xmax - v2d->cur.xmin);
-
- /* y-axis transform */
- fac= 0.01f * (event->y - vzd->lasty);
- dy= fac * (v2d->cur.ymax - v2d->cur.ymin);
+#endif
+ }
+
+ /* set transform amount, and add current deltas to stored total delta (for redo) */
+ RNA_float_set(op->ptr, "deltax", dx);
+ RNA_float_set(op->ptr, "deltay", dy);
+ vzd->dx += dx;
+ vzd->dy += dy;
+
+ /* store mouse coordinates for next time, if not doing continuous zoom
+ * - continuous zoom only depends on distance of mouse to starting point to determine rate of change
+ */
+ if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
+ vzd->lastx= event->x;
+ vzd->lasty= event->y;
+ }
+
+ /* apply zooming */
+ view_zoomdrag_apply(C, op);
+ }
+ else if (ELEM3(event->type, LEFTMOUSE, MIDDLEMOUSE, RIGHTMOUSE)) { /* XXX needs modal keymap */
+ if (event->val==KM_RELEASE) {
+ /* for redo, store the overall deltas - need to respect zoom-locks here... */
+ if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0)
+ RNA_float_set(op->ptr, "deltax", vzd->dx);
+ else
+ RNA_float_set(op->ptr, "deltax", 0);
- /* continous zoom shouldn't move that fast... */
- if (U.viewzoom == USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
- dx /= 20.0f;
- dy /= 20.0f;
- }
- }
-
- /* set transform amount, and add current deltas to stored total delta (for redo) */
- RNA_float_set(op->ptr, "deltax", dx);
- RNA_float_set(op->ptr, "deltay", dy);
- vzd->dx += dx;
- vzd->dy += dy;
+ if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0)
+ RNA_float_set(op->ptr, "deltay", vzd->dy);
+ else
+ RNA_float_set(op->ptr, "deltay", 0);
- /* store mouse coordinates for next time, if not doing continuous zoom
- * - continuous zoom only depends on distance of mouse to starting point to determine rate of change
- */
- if (U.viewzoom != USER_ZOOM_CONT) { // XXX store this setting as RNA prop?
- vzd->lastx= event->x;
- vzd->lasty= event->y;
- }
+ /* free customdata */
+ view_zoomdrag_exit(C, op);
+ WM_cursor_restore(CTX_wm_window(C));
- /* apply zooming */
- view_zoomdrag_apply(C, op);
+ return OPERATOR_FINISHED;
}
- break;
-
- case LEFTMOUSE:
- case MIDDLEMOUSE:
- if (event->val==KM_RELEASE) {
- /* for redo, store the overall deltas - need to respect zoom-locks here... */
- if ((v2d->keepzoom & V2D_LOCKZOOM_X)==0)
- RNA_float_set(op->ptr, "deltax", vzd->dx);
- else
- RNA_float_set(op->ptr, "deltax", 0);
-
- if ((v2d->keepzoom & V2D_LOCKZOOM_Y)==0)
- RNA_float_set(op->ptr, "deltay", vzd->dy);
- else
- RNA_float_set(op->ptr, "deltay", 0);
-
- /* free customdata */
- view_zoomdrag_exit(C, op);
- WM_cursor_restore(CTX_wm_window(C));
-
- return OPERATOR_FINISHED;
- }
- break;
}
return OPERATOR_RUNNING_MODAL;
}
-void VIEW2D_OT_zoom(wmOperatorType *ot)
+static void VIEW2D_OT_zoom(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom View";
@@ -1095,12 +1136,11 @@ static int view_borderzoom_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_zoom_border(wmOperatorType *ot)
+static void VIEW2D_OT_zoom_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Zoom to Border";
@@ -1140,7 +1180,7 @@ typedef struct v2dScrollerMove {
ARegion *ar; /* region that the scroller is in */
short scroller; /* scroller that mouse is in ('h' or 'v') */
- short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active colour?)
+ short zone; /* -1 is min zoomer, 0 is bar, 1 is max zoomer */ // XXX find some way to provide visual feedback of this (active color?)
float fac; /* view adjustment factor, based on size of region */
float delta; /* amount moved by mouse on axis of interest */
@@ -1169,7 +1209,7 @@ enum {
SCROLLHANDLE_MAX,
SCROLLHANDLE_MIN_OUTSIDE,
SCROLLHANDLE_MAX_OUTSIDE
-} eV2DScrollerHandle_Zone;
+} /*eV2DScrollerHandle_Zone*/;
/* ------------------------ */
@@ -1355,7 +1395,6 @@ static void scroller_activate_apply(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(vsm->ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
}
/* handle user input for scrollers - calculations of mouse-movement need to be done here, not in the apply callback! */
@@ -1477,7 +1516,7 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, wmEvent *event)
scroller_activate_exit(C, op);
/* can't catch this event for ourselves, so let it go to someone else? */
- // FIXME: still this doesn't fall through to the item_activate callback for the outliner...
+ /* XXX note: if handlers use mask rect to clip input, input will fail for this case */
return OPERATOR_PASS_THROUGH;
}
@@ -1498,7 +1537,7 @@ static int scroller_activate_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
/* LMB-Drag in Scrollers - not repeatable operator! */
-void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
+static void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scroller Activate";
@@ -1517,7 +1556,7 @@ void VIEW2D_OT_scroller_activate(wmOperatorType *ot)
/* ********************************************************* */
/* RESET */
-static int reset_exec(bContext *C, wmOperator *op)
+static int reset_exec(bContext *C, wmOperator *UNUSED(op))
{
uiStyle *style= U.uistyles.first;
ARegion *ar= CTX_wm_region(C);
@@ -1560,12 +1599,11 @@ static int reset_exec(bContext *C, wmOperator *op)
/* request updates to be done... */
ED_region_tag_redraw(ar);
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
- WM_event_add_mousemove(C);
return OPERATOR_FINISHED;
}
-void VIEW2D_OT_reset(wmOperatorType *ot)
+static void VIEW2D_OT_reset(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reset View";
@@ -1658,8 +1696,10 @@ void UI_view2d_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "VIEW2D_OT_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0);
+
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "page", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "page", 1);
+
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0);
WM_keymap_add_item(keymap, "VIEW2D_OT_zoom_out", PADMINUS, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 809ccb86234..2295cca29a9 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -19,11 +19,11 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
+ ../uvedit
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
../../imbuf
@@ -34,8 +34,21 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ meshtools.c
+ loopcut.c
+ mesh_ops.c
+ editbmesh_bvh.c
+ editbmesh_bvh.h
+ editbmesh_add.c
+ bmeshutils.c
+ mesh_intern.h
+ bmesh_selecthistory.c
+ bmesh_select.c
+ mesh_data.c
+ bmesh_tools.c
+ knifetool.c
+ editface.c
+)
-BLENDERLIB(bf_editor_mesh "${SRC}" "${INC}")
+blender_add_lib(bf_editor_mesh "${SRC}" "${INC}")
diff --git a/source/blender/editors/mesh/Makefile b/source/blender/editors/mesh/Makefile
deleted file mode 100644
index be57f72329a..00000000000
--- a/source/blender/editors/mesh/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_mesh
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/mesh/SConscript b/source/blender/editors/mesh/SConscript
index 35e5dc5296e..388fdbc15b7 100644
--- a/source/blender/editors/mesh/SConscript
+++ b/source/blender/editors/mesh/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../gpu'
+incs += ' ../../gpu ../../blenloader'
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
incs += ' ../../bmesh '
diff --git a/source/blender/editors/mesh/bmesh_select.c b/source/blender/editors/mesh/bmesh_select.c
index 0f24764f51f..00b30dc3f5a 100644
--- a/source/blender/editors/mesh/bmesh_select.c
+++ b/source/blender/editors/mesh/bmesh_select.c
@@ -67,6 +67,7 @@ BMEditMesh_mods.c, UI level access, no geometry changes
#include "BKE_utildefines.h"
#include "BKE_report.h"
#include "BKE_tessmesh.h"
+#include "BKE_paint.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -93,29 +94,26 @@ BMEditMesh_mods.c, UI level access, no geometry changes
#include "BLO_sys_types.h" // for intptr_t support
-/* XXX */
-static void waitcursor() {}
-static int pupmenu() {return 0;}
-
/* ****************************** MIRROR **************** */
void EDBM_select_mirrored(Object *obedit, BMEditMesh *em)
{
-#if 0 //BMESH_TODO
if(em->selectmode & SCE_SELECT_VERTEX) {
BMVert *eve, *v1;
+ BMIter iter;
+ int i;
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) {
- v1= BMEditMesh_get_x_mirror_vert(obedit, em, eve->co);
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_TestHFlag(eve, BM_SELECT) && !BM_TestHFlag(eve, BM_HIDDEN)) {
+ v1= editbmesh_get_x_mirror_vert(obedit, em, eve, eve->co, i);
if(v1) {
- eve->f &= ~SELECT;
- v1->f |= SELECT;
+ BM_Select(em->bm, eve, 0);
+ BM_Select(em->bm, v1, 1);
}
}
+ i++;
}
}
-#endif
}
void EDBM_automerge(Scene *scene, Object *obedit, int update)
@@ -133,7 +131,7 @@ void EDBM_automerge(Scene *scene, Object *obedit, int update)
BMO_CallOpf(em->bm, "automerge verts=%hv dist=%f", BM_SELECT, scene->toolsettings->doublimit);
if (update) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
}
}
}
@@ -718,7 +716,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
/* we succeeded */
@@ -760,7 +758,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
/* we succeeded */
@@ -806,7 +804,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
EDBM_selectmode_flush(em);
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
/* we succeeded */
@@ -900,162 +898,6 @@ static void walker_select(BMEditMesh *em, int walkercode, void *start, int selec
BMW_End(&walker);
}
-#if 0
-/* selects quads in loop direction of indicated edge */
-/* only flush over edges with valence <= 2 */
-void faceloop_select(EditMesh *em, EditEdge *startedge, int select)
-{
- EditEdge *eed;
- EditFace *efa;
- int looking= 1;
-
- /* in eed->f1 we put the valence (amount of faces in edge) */
- /* in eed->f2 we put tagged flag as correct loop */
- /* in efa->f1 we put tagged flag as correct to select */
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- eed->f1= 0;
- eed->f2= 0;
- }
- for(efa= em->faces.first; efa; efa= efa->next) {
- efa->f1= 0;
- if(efa->h==0) {
- efa->e1->f1++;
- efa->e2->f1++;
- efa->e3->f1++;
- if(efa->e4) efa->e4->f1++;
- }
- }
-
- /* tag startedge OK*/
- startedge->f2= 1;
-
- while(looking) {
- looking= 0;
-
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->h==0 && efa->e4 && efa->f1==0) { /* not done quad */
- if(efa->e1->f1<=2 && efa->e2->f1<=2 && efa->e3->f1<=2 && efa->e4->f1<=2) { /* valence ok */
-
- /* if edge tagged, select opposing edge and mark face ok */
- if(efa->e1->f2) {
- efa->e3->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- else if(efa->e2->f2) {
- efa->e4->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- if(efa->e3->f2) {
- efa->e1->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- if(efa->e4->f2) {
- efa->e2->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- }
- }
- }
- }
-
- /* (de)select the faces */
- if(select!=2) {
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->f1) EM_select_face(efa, select);
- }
- }
-}
-#endif
-
-
-/* selects or deselects edges that:
-- if edges has 2 faces:
- - has vertices with valence of 4
- - not shares face with previous edge
-- if edge has 1 face:
- - has vertices with valence 4
- - not shares face with previous edge
- - but also only 1 face
-- if edge no face:
- - has vertices with valence 2
-*/
-
-/*
- Almostly exactly the same code as faceloop select
-*/
-static void edgering_select(BMEditMesh *em, BMEdge *startedge, int select)
-{
-#if 0 //BMESH_TODO
- BMEdge *eed;
- BMFace *efa;
- int looking= 1;
-
- /* in eed->f1 we put the valence (amount of faces in edge) */
- /* in eed->f2 we put tagged flag as correct loop */
- /* in efa->f1 we put tagged flag as correct to select */
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- eed->f1= 0;
- eed->f2= 0;
- }
- for(efa= em->faces.first; efa; efa= efa->next) {
- efa->f1= 0;
- if(efa->h==0) {
- efa->e1->f1++;
- efa->e2->f1++;
- efa->e3->f1++;
- if(efa->e4) efa->e4->f1++;
- }
- }
-
- /* tag startedge OK */
- startedge->f2= 1;
-
- while(looking) {
- looking= 0;
-
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->e4 && efa->f1==0 && !efa->h) { /* not done quad */
- if(efa->e1->f1<=2 && efa->e2->f1<=2 && efa->e3->f1<=2 && efa->e4->f1<=2) { /* valence ok */
-
- /* if edge tagged, select opposing edge and mark face ok */
- if(efa->e1->f2) {
- efa->e3->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- else if(efa->e2->f2) {
- efa->e4->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- if(efa->e3->f2) {
- efa->e1->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- if(efa->e4->f2) {
- efa->e2->f2= 1;
- efa->f1= 1;
- looking= 1;
- }
- }
- }
- }
- }
-
- /* (de)select the edges */
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->f2) EM_select_edge(eed, select);
- }
-#endif
-}
-
static int loop_multiselect(bContext *C, wmOperator *op)
{
#if 0 //BMESH_TODO
@@ -1275,7 +1117,7 @@ static void mouse_mesh_shortest_path(bContext *C, short mval[2])
break;
}
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
}
#endif
@@ -1803,7 +1645,7 @@ static int mesh_select_nth_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, "Unimplemented");
#endif
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -2324,5 +2166,5 @@ void MESH_OT_select_random(wmOperatorType *ot)
/* props */
RNA_def_float_percentage(ot->srna, "percent", 50.f, 0.0f, 100.0f, "Percent", "Percentage of elements to select randomly.", 0.f, 100.0f);
- RNA_def_boolean(ot->srna, "extend", FALSE, "Extend Selection", "Extend selection instead of deselecting everything first.");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Selection", "Extend selection instead of deselecting everything first.");
}
diff --git a/source/blender/editors/mesh/bmesh_tools.c b/source/blender/editors/mesh/bmesh_tools.c
index d1febba944d..7f15056d6bd 100644
--- a/source/blender/editors/mesh/bmesh_tools.c
+++ b/source/blender/editors/mesh/bmesh_tools.c
@@ -72,6 +72,7 @@
#include "BKE_bmesh.h"
#include "BKE_report.h"
#include "BKE_tessmesh.h"
+#include "BKE_texture.h"
#include "BKE_main.h"
#include "BIF_gl.h"
@@ -89,6 +90,8 @@
#include "UI_interface.h"
+#include "RE_render_ext.h"
+
#include "mesh_intern.h"
#include "bmesh.h"
@@ -125,7 +128,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
RNA_boolean_get(op->ptr, "tess_single_edge"),
RNA_boolean_get(op->ptr, "gridfill"));
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -285,7 +288,7 @@ short EDBM_Extrude_face_indiv(BMEditMesh *em, wmOperator *op, short flag, float
#endif
/* extrudes individual edges */
-short EDBM_Extrude_edges_indiv(BMEditMesh *em, wmOperator *op, short flag, float *nor)
+short EDBM_Extrude_edges_indiv(BMEditMesh *em, wmOperator *op, short flag, float *UNUSED(nor))
{
BMOperator bmop;
@@ -550,7 +553,7 @@ static int extrude_repeat_mesh(bContext *C, wmOperator *op)
EDBM_RecalcNormals(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -921,7 +924,7 @@ static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
//retopo_do_all();
WM_event_add_notifier(C, NC_GEOM|ND_DATA, vc.obedit->data);
- DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(vc.obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -941,7 +944,7 @@ void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int delete_mesh(bContext *C, Object *obedit, wmOperator *op, int event, Scene *scene)
+static int delete_mesh(bContext *C, Object *obedit, wmOperator *op, int event, Scene *UNUSED(scene))
{
BMEditMesh *bem = ((Mesh*)obedit->data)->edit_btmesh;
@@ -993,7 +996,7 @@ static int delete_mesh(bContext *C, Object *obedit, wmOperator *op, int event, S
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1060,7 +1063,7 @@ static int addedgeface_mesh_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -1164,7 +1167,7 @@ static int editbmesh_mark_seam(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1213,7 +1216,7 @@ static int editbmesh_mark_sharp(bContext *C, wmOperator *op)
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1250,7 +1253,7 @@ static int editbmesh_vert_connect(bContext *C, wmOperator *op)
len = BMO_GetSlot(&bmop, "edgeout")->len;
BMO_Finish_Op(bm, &bmop);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return len ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
@@ -1283,7 +1286,7 @@ static int editbmesh_edge_split(bContext *C, wmOperator *op)
len = BMO_GetSlot(&bmop, "outsplit")->len;
BMO_Finish_Op(bm, &bmop);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return len ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
@@ -1323,7 +1326,7 @@ static int mesh_duplicate_exec(bContext *C, wmOperator *op)
if (!EDBM_FinishOp(em, &bmop, op, 1))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -1363,7 +1366,7 @@ static int flip_normals(bContext *C, wmOperator *op)
if (!EDBM_CallOpf(em, op, "reversefaces faces=%hf", BM_SELECT))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1448,7 +1451,7 @@ static int edge_rotate_selected(bContext *C, wmOperator *op)
if (!EDBM_FinishOp(em, &bmop, op, 1))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1508,7 +1511,7 @@ static int pin_mesh_exec(bContext *C, wmOperator *op)
EDBM_pin_mesh(em, RNA_boolean_get(op->ptr, "unselected"));
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1563,7 +1566,7 @@ static int unpin_mesh_exec(bContext *C, wmOperator *op)
EDBM_unpin_mesh(em, RNA_boolean_get(op->ptr, "unselected"));
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1626,7 +1629,7 @@ static int hide_mesh_exec(bContext *C, wmOperator *op)
EDBM_hide_mesh(em, RNA_boolean_get(op->ptr, "unselected"));
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1679,7 +1682,7 @@ static int reveal_mesh_exec(bContext *C, wmOperator *op)
EDBM_reveal_mesh(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1711,7 +1714,7 @@ static int normals_make_consistent_exec(bContext *C, wmOperator *op)
if (RNA_boolean_get(op->ptr, "inside"))
EDBM_CallOpf(em, op, "reversefaces faces=%hf", BM_SELECT);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1777,7 +1780,7 @@ static int do_smooth_vertex(bContext *C, wmOperator *op)
//BMESH_TODO: need to handle the x-axis editing option here properly.
//should probably make a helper function for that? I dunno.
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1852,7 +1855,7 @@ static int bm_test_exec(bContext *C, wmOperator *op)
BMW_End(&walker);
#endif
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1900,7 +1903,7 @@ static int mesh_faces_shade_smooth_exec(bContext *C, wmOperator *op)
mesh_set_smooth_faces(em, 1);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1928,7 +1931,7 @@ static int mesh_faces_shade_flat_exec(bContext *C, wmOperator *op)
mesh_set_smooth_faces(em, 0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1979,9 +1982,9 @@ static int mesh_rotate_uvs(bContext *C, wmOperator *op)
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
-/* DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+/* DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
*/
/* we succeeded */
@@ -2005,9 +2008,9 @@ static int mesh_reverse_uvs(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
-/* DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+/* DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
*/
/* we succeeded */
@@ -2035,7 +2038,7 @@ static int mesh_rotate_colors(bContext *C, wmOperator *op)
/* dependencies graph and notification stuff */
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
/* DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_GEOM_SELECT, ob);
@@ -2061,7 +2064,7 @@ static int mesh_reverse_colors(bContext *C, wmOperator *op)
if( !EDBM_FinishOp(em, &bmop, op, 1) )
return OPERATOR_CANCELLED;
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
/* we succeeded */
@@ -2115,7 +2118,7 @@ static int mesh_reverse_colors(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
#endif
@@ -2246,8 +2249,8 @@ static int merge_target(BMEditMesh *em, Scene *scene, View3D *v3d, Object *ob,
return OPERATOR_CANCELLED;
fac = 1.0f / (float)i;
- VECMUL(cent, fac);
- VECCOPY(co, cent);
+ mul_v3_fl(cent, fac);
+ copy_v3_v3(co, cent);
vco = co;
}
@@ -2296,7 +2299,7 @@ static int merge_exec(bContext *C, wmOperator *op)
if(!status)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -2399,7 +2402,7 @@ static int removedoublesflag_exec(bContext *C, wmOperator *op)
}
*/
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -2481,7 +2484,7 @@ int select_vertex_path_exec(bContext *C, wmOperator *op)
/* DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_GEOM_SELECT, ob);
*/
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -2887,7 +2890,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
BMBVH_FreeBVH(bvhtree);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3087,7 +3090,7 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -3150,7 +3153,7 @@ static void shape_propagate(Object *obedit, BMEditMesh *em, wmOperator *op)
}
#endif
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
}
@@ -3162,7 +3165,7 @@ static int shape_propagate_to_all_exec(bContext *C, wmOperator *op)
shape_propagate(obedit, em, op);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -3221,7 +3224,7 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op)
VECCOPY(sco, co);
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -3373,7 +3376,7 @@ static int solidify_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3690,7 +3693,7 @@ static int knife_cut_exec(bContext *C, wmOperator *op)
BLI_ghash_free(gh, NULL, (GHashValFreeFP)WMEM_freeN);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3854,7 +3857,7 @@ static int fill_mesh_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
#endif
return OPERATOR_FINISHED;
@@ -3885,7 +3888,7 @@ static int beauty_fill_exec(bContext *C, wmOperator *op)
BKE_mesh_end_editmesh(obedit->data, em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
#endif
return OPERATOR_FINISHED;
@@ -3915,7 +3918,7 @@ static int quads_convert_to_tris_exec(bContext *C, wmOperator *op)
if (!EDBM_CallOpf(em, op, "triangulate faces=%hf", BM_SELECT))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3954,7 +3957,7 @@ static int tris_convert_to_quads_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -3990,7 +3993,7 @@ static int edge_flip_exec(bContext *C, wmOperator *op)
edge_flip(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -4028,7 +4031,7 @@ static int split_mesh(bContext *C, wmOperator *op)
WM_cursor_wait(0);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -4127,7 +4130,7 @@ static int spin_mesh(bContext *C, wmOperator *op, float *dvec, int steps, float
EM_fgon_flags(em);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
}
BKE_mesh_end_editmesh(obedit->data, em);
@@ -4148,7 +4151,7 @@ static int spin_mesh_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
#endif
return OPERATOR_FINISHED;
@@ -4251,7 +4254,7 @@ static int screw_mesh_exec(bContext *C, wmOperator *op)
}
if(spin_mesh(C, op, dvec, turns*steps, 360.0f*turns, 0)) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BKE_mesh_end_editmesh(obedit->data, em);
@@ -4524,3 +4527,269 @@ void MESH_OT_select_mirror(wmOperatorType *ot)
/* props */
RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the existing selection");
}
+
+/********* qsort routines. not sure how to make these
+ work, since we aren't using linked lists for
+ geometry anymore. might need a sortof "swap"
+ function for bmesh elements. *********/
+
+typedef struct xvertsort {
+ float x;
+ BMVert *v1;
+} xvertsort;
+
+
+static int vergxco(const void *v1, const void *v2)
+{
+ const xvertsort *x1=v1, *x2=v2;
+
+ if( x1->x > x2->x ) return 1;
+ else if( x1->x < x2->x) return -1;
+ return 0;
+}
+
+struct facesort {
+ uintptr_t x;
+ struct EditFace *efa;
+};
+
+static int vergface(const void *v1, const void *v2)
+{
+ const struct facesort *x1=v1, *x2=v2;
+
+ if( x1->x > x2->x ) return 1;
+ else if( x1->x < x2->x) return -1;
+ return 0;
+}
+
+// XXX is this needed?
+/* called from buttons */
+static void xsortvert_flag__doSetX(void *userData, EditVert *UNUSED(eve), int x, int UNUSED(y), int index)
+{
+ xvertsort *sortblock = userData;
+
+ sortblock[index].x = x;
+}
+
+/* all verts with (flag & 'flag') are sorted */
+static void xsortvert_flag(bContext *C, int flag)
+{
+#if 0 //hrm, geometry isn't in linked lists anymore. . .
+ ViewContext vc;
+ BMEditMesh *em;
+ BMVert *eve;
+ BMIter iter;
+ xvertsort *sortblock;
+ ListBase tbase;
+ int i, amount;
+
+ em_setup_viewcontext(C, &vc);
+ em = vc.em;
+
+ amount = em->bm->totvert;
+ sortblock = MEM_callocN(sizeof(xvertsort)*amount,"xsort");
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if(BM_TestHFlag(eve, BM_SELECT))
+ sortblock[i].v1 = eve;
+ }
+
+ ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
+ mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, 0);
+
+ qsort(sortblock, amount, sizeof(xvertsort), vergxco);
+
+ /* make temporal listbase */
+ tbase.first= tbase.last= 0;
+ for (i=0; i<amount; i++) {
+ eve = sortblock[i].v1;
+
+ if (eve) {
+ BLI_remlink(&vc.em->verts, eve);
+ BLI_addtail(&tbase, eve);
+ }
+ }
+
+ BLI_movelisttolist(&vc.em->verts, &tbase);
+
+ MEM_freeN(sortblock);
+#endif
+
+}
+
+static int mesh_vertices_sort_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ xsortvert_flag(C, SELECT);
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_vertices_sort(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Vertex Sort";
+ ot->description= "Sort vertex order";
+ ot->idname= "MESH_OT_vertices_sort";
+
+ /* api callbacks */
+ ot->exec= mesh_vertices_sort_exec;
+
+ ot->poll= EM_view3d_poll; /* uses view relative X axis to sort verts */
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+#if 0
+/* called from buttons */
+static void hashvert_flag(EditMesh *em, int flag)
+{
+ /* switch vertex order using hash table */
+ EditVert *eve;
+ struct xvertsort *sortblock, *sb, onth, *newsort;
+ ListBase tbase;
+ int amount, a, b;
+
+ /* count */
+ eve= em->verts.first;
+ amount= 0;
+ while(eve) {
+ if(eve->f & flag) amount++;
+ eve= eve->next;
+ }
+ if(amount==0) return;
+
+ /* allocate memory */
+ sb= sortblock= (struct xvertsort *)MEM_mallocN(sizeof(struct xvertsort)*amount,"sortremovedoub");
+ eve= em->verts.first;
+ while(eve) {
+ if(eve->f & flag) {
+ sb->v1= eve;
+ sb++;
+ }
+ eve= eve->next;
+ }
+
+ BLI_srand(1);
+
+ sb= sortblock;
+ for(a=0; a<amount; a++, sb++) {
+ b= (int)(amount*BLI_drand());
+ if(b>=0 && b<amount) {
+ newsort= sortblock+b;
+ onth= *sb;
+ *sb= *newsort;
+ *newsort= onth;
+ }
+ }
+
+ /* make temporal listbase */
+ tbase.first= tbase.last= 0;
+ sb= sortblock;
+ while(amount--) {
+ eve= sb->v1;
+ BLI_remlink(&em->verts, eve);
+ BLI_addtail(&tbase, eve);
+ sb++;
+ }
+
+ BLI_movelisttolist(&em->verts, &tbase);
+
+ MEM_freeN(sortblock);
+
+}
+#endif
+
+static int mesh_vertices_randomize_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+ //hashvert_flag(em, SELECT);
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_vertices_randomize(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Vertex Randomize";
+ ot->description= "Randomize vertex order";
+ ot->idname= "MESH_OT_vertices_randomize";
+
+ /* api callbacks */
+ ot->exec= mesh_vertices_randomize_exec;
+
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/******end of qsort stuff ****/
+
+
+static int mesh_noise_exec(bContext *C, wmOperator *op)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ BMEditMesh *em= (((Mesh *)obedit->data))->edit_btmesh;
+ Material *ma;
+ Tex *tex;
+ BMVert *eve;
+ BMIter iter;
+ float fac= RNA_float_get(op->ptr, "factor");
+
+ if(em==NULL) return OPERATOR_FINISHED;
+
+ ma= give_current_material(obedit, obedit->actcol);
+ if(ma==0 || ma->mtex[0]==0 || ma->mtex[0]->tex==0) {
+ BKE_report(op->reports, RPT_WARNING, "Mesh has no material or texture assigned.");
+ return OPERATOR_FINISHED;
+ }
+ tex= give_current_material_texture(ma);
+
+ if(tex->type==TEX_STUCCI) {
+ float b2, vec[3];
+ float ofs= tex->turbul/200.0;
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_TestHFlag(eve, BM_SELECT) && !BM_TestHFlag(eve, BM_HIDDEN)) {
+ b2= BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]);
+ if(tex->stype) ofs*=(b2*b2);
+ vec[0]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0]+ofs, eve->co[1], eve->co[2]));
+ vec[1]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1]+ofs, eve->co[2]));
+ vec[2]= fac*(b2-BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]+ofs));
+
+ add_v3_v3(eve->co, vec);
+ }
+ }
+ }
+ else {
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_TestHFlag(eve, BM_SELECT) && !BM_TestHFlag(eve, BM_HIDDEN)) {
+ float tin, dum;
+ externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum, 0);
+ eve->co[2]+= fac*tin;
+ }
+ }
+ }
+
+ EDBM_RecalcNormals(em);
+
+ DAG_id_tag_update(obedit->data, 0);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+
+ return OPERATOR_FINISHED;
+}
+
+void MESH_OT_noise(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Noise";
+ ot->description= "Use vertex coordinate as texture coordinate";
+ ot->idname= "MESH_OT_noise";
+
+ /* api callbacks */
+ ot->exec= mesh_noise_exec;
+ ot->poll= ED_operator_editmesh;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_float(ot->srna, "factor", 0.1f, -FLT_MAX, FLT_MAX, "Factor", "", 0.0f, 1.0f);
+}
diff --git a/source/blender/editors/mesh/bmeshutils.c b/source/blender/editors/mesh/bmeshutils.c
index 356e3c1ce1f..de5b468d93c 100644
--- a/source/blender/editors/mesh/bmeshutils.c
+++ b/source/blender/editors/mesh/bmeshutils.c
@@ -120,7 +120,7 @@ void EDBM_stats_update(BMEditMesh *em)
}
}
-int EDBM_InitOpf(BMEditMesh *em, BMOperator *bmop, wmOperator *op, char *fmt, ...)
+int EDBM_InitOpf(BMEditMesh *em, BMOperator *bmop, wmOperator *op, const char *fmt, ...)
{
BMesh *bm = em->bm;
va_list list;
@@ -178,7 +178,7 @@ int EDBM_FinishOp(BMEditMesh *em, BMOperator *bmop, wmOperator *op, int report)
return 1;
}
-int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, char *fmt, ...)
+int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, const char *fmt, ...)
{
BMesh *bm = em->bm;
BMOperator bmop;
@@ -203,7 +203,7 @@ int EDBM_CallOpf(BMEditMesh *em, wmOperator *op, char *fmt, ...)
return EDBM_FinishOp(em, &bmop, op, 1);
}
-int EDBM_CallAndSelectOpf(BMEditMesh *em, wmOperator *op, char *selectslot, char *fmt, ...)
+int EDBM_CallAndSelectOpf(BMEditMesh *em, wmOperator *op, const char *selectslot, const char *fmt, ...)
{
BMesh *bm = em->bm;
BMOperator bmop;
@@ -229,7 +229,7 @@ int EDBM_CallAndSelectOpf(BMEditMesh *em, wmOperator *op, char *selectslot, char
return EDBM_FinishOp(em, &bmop, op, 1);
}
-int EDBM_CallOpfSilent(BMEditMesh *em, char *fmt, ...)
+int EDBM_CallOpfSilent(BMEditMesh *em, const char *fmt, ...)
{
BMesh *bm = em->bm;
BMOperator bmop;
@@ -618,7 +618,7 @@ static void free_undo(void *umv)
}
/* and this is all the undo system needs to know */
-void undo_push_mesh(bContext *C, char *name)
+void undo_push_mesh(bContext *C, const char *name)
{
undo_editmode_push(C, name, getEditMesh, free_undo, undoMesh_to_editbtMesh, editbtMesh_to_undoMesh, NULL);
}
diff --git a/source/blender/editors/mesh/editbmesh_add.c b/source/blender/editors/mesh/editbmesh_add.c
index 9a9a49b25e0..de4be3b72dd 100644
--- a/source/blender/editors/mesh/editbmesh_add.c
+++ b/source/blender/editors/mesh/editbmesh_add.c
@@ -137,7 +137,7 @@ static void make_prim_init(bContext *C, float *dia, float mat[][4],
ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
*state = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
*dia *= new_primitive_matrix(C, loc, rot, mat);
}
@@ -146,7 +146,7 @@ static void make_prim_finish(bContext *C, int *state, int enter_editmode)
{
Object *obedit = CTX_data_edit_object(C);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
/* userdef */
@@ -308,6 +308,8 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
make_prim_finish(C, &state, enter_editmode);
+
+ return OPERATOR_FINISHED;
}
void MESH_OT_primitive_cylinder_add(wmOperatorType *ot)
diff --git a/source/blender/editors/mesh/editbmesh_bvh.c b/source/blender/editors/mesh/editbmesh_bvh.c
index dfa703512d2..ba1ca4a440c 100644
--- a/source/blender/editors/mesh/editbmesh_bvh.c
+++ b/source/blender/editors/mesh/editbmesh_bvh.c
@@ -143,8 +143,8 @@ void BMBVH_FreeBVH(BMBVHTree *tree)
}
/*taken from bvhutils.c*/
-static float ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, float *v0,
- float *v1, float *v2, float *uv, float e)
+static float ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), float *v0,
+ float *v1, float *v2, float *uv, float UNUSED(e))
{
float dist;
#if 0
@@ -230,7 +230,7 @@ BVHTree *BMBVH_BVHTree(BMBVHTree *tree)
return tree->tree;
}
-static void vertsearchcallback(void *userdata, int index, const float *co, BVHTreeNearest *hit)
+static void vertsearchcallback(void *userdata, int index, const float *UNUSED(co), BVHTreeNearest *hit)
{
BMBVHTree *tree = userdata;
BMLoop **ls = tree->em->looptris[index];
@@ -315,7 +315,7 @@ static short winding(float *v1, float *v2, float *v3)
return 1;
}
-static float topo_compare(BMesh *bm, BMVert *v1, BMVert *v2, int tag)
+static float topo_compare(BMesh *bm, BMVert *v1, BMVert *v2)
{
BMIter iter1, iter2;
BMEdge *e1, *e2, *cure1 = NULL, *cure2 = NULL;
@@ -559,12 +559,12 @@ static float topo_compare(BMesh *bm, BMVert *v1, BMVert *v2, int tag)
return 1.0f - w;
}
-static void vertsearchcallback_topo(void *userdata, int index, const float *co, BVHTreeNearest *hit)
+static void vertsearchcallback_topo(void *userdata, int index, const float *UNUSED(co), BVHTreeNearest *UNUSED(hit))
{
BMBVHTree *tree = userdata;
BMLoop **ls = tree->em->looptris[index];
int i;
- float dist, maxdist, vec[3], w;
+ float maxdist, vec[3], w;
maxdist = tree->maxdist;
@@ -577,7 +577,8 @@ static void vertsearchcallback_topo(void *userdata, int index, const float *co,
sub_v3_v3v3(vec, tree->co, ls[i]->v->co);
dis = dot_v3v3(vec, vec);
- w = topo_compare(tree->em->bm, tree->v, ls[i]->v, tree->curtag++);
+ w = topo_compare(tree->em->bm, tree->v, ls[i]->v);
+ tree->curtag++;
if (w < tree->curw-FLT_EPSILON*4) {
tree->curw = w;
@@ -607,7 +608,6 @@ static void vertsearchcallback_topo(void *userdata, int index, const float *co,
BMVert *BMBVH_FindClosestVertTopo(BMBVHTree *tree, float *co, float maxdist, BMVert *sourcev)
{
BVHTreeNearest hit;
- BMIter iter;
memset(&hit, 0, sizeof(hit));
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index b11eeebfb2a..c692466a1ef 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_heap.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -52,12 +53,6 @@
#include "BIF_gl.h"
-
-#ifndef DISABLE_PYTHON
-//#include "BPY_extern.h"
-//#include "BPY_menus.h"
-#endif
-
#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -68,14 +63,9 @@
/* own include */
#include "mesh_intern.h"
-/* ***************** XXX **************** */
-static int pupmenu(const char *dummy) {return 0;}
-/* ***************** XXX **************** */
-
-
/* copy the face flags, most importantly selection from the mesh to the final derived mesh,
* use in object mode when selecting faces (while painting) */
-void object_facesel_flush_dm(Object *ob)
+void paintface_flush_flags(Object *ob)
{
Mesh *me= get_mesh(ob);
DerivedMesh *dm= ob->derivedFinal;
@@ -106,8 +96,7 @@ void object_facesel_flush_dm(Object *ob)
}
/* returns 0 if not found, otherwise 1 */
-int facesel_face_pick(struct bContext *C, Mesh *me, Object *ob,
- short *mval, unsigned int *index, short rect)
+static int facesel_face_pick(struct bContext *C, Mesh *me, Object *ob, short *mval, unsigned int *index, short rect)
{
Scene *scene = CTX_data_scene(C);
ViewContext vc;
@@ -173,63 +162,55 @@ MTexPoly *EDBM_get_active_mtface(BMEditMesh *em, BMFace **act_efa, int sloppy)
return NULL;
}
-void reveal_tface(Scene *scene)
+void paintface_hide(Object *ob, const int unselected)
{
Mesh *me;
MPoly *mface;
int a;
- me= get_mesh(OBACT);
+ me= get_mesh(ob);
if(me==0 || me->totpoly==0) return;
-
+
mface= me->mpoly;
a= me->totpoly;
while(a--) {
- if(mface->flag & ME_HIDE) {
- mface->flag |= ME_FACE_SEL;
- mface->flag -= ME_HIDE;
+ if((mface->flag & ME_HIDE) == 0) {
+ if(unselected) {
+ if( (mface->flag & ME_FACE_SEL)==0) mface->flag |= ME_HIDE;
+ }
+ else {
+ if( (mface->flag & ME_FACE_SEL)) mface->flag |= ME_HIDE;
+ }
}
+ if(mface->flag & ME_HIDE) mface->flag &= ~ME_FACE_SEL;
+
mface++;
}
-
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+
+ paintface_flush_flags(ob);
}
-void hide_tface(Scene *scene)
+
+void paintface_reveal(Object *ob)
{
Mesh *me;
MPoly *mface;
int a;
- int shift=0, alt= 0; // XXX
-
- me= get_mesh(OBACT);
+
+ me= get_mesh(ob);
if(me==0 || me->totpoly==0) return;
-
- if(alt) {
- reveal_tface(scene);
- return;
- }
-
+
mface= me->mpoly;
a= me->totpoly;
while(a--) {
- if(mface->flag & ME_HIDE);
- else {
- if(shift) {
- if( (mface->flag & ME_FACE_SEL)==0) mface->flag |= ME_HIDE;
- }
- else {
- if( (mface->flag & ME_FACE_SEL)) mface->flag |= ME_HIDE;
- }
+ if(mface->flag & ME_HIDE) {
+ mface->flag |= ME_FACE_SEL;
+ mface->flag -= ME_HIDE;
}
- if(mface->flag & ME_HIDE) mface->flag &= ~ME_FACE_SEL;
-
mface++;
}
-
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
+
+ paintface_flush_flags(ob);
}
/* Set tface seams based on edge data, uses hash table to find seam edges. */
@@ -246,7 +227,7 @@ static void hash_add_face(EdgeHash *ehash, MPoly *mf, MLoop *mloop)
}
-void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
+static void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
{
EdgeHash *ehash, *seamhash;
MPoly *mf;
@@ -340,12 +321,9 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
}
MEM_freeN(linkflag);
-
- // BIF_undo_push("Select linked UV face");
- // object_tface_flags_changed(OBACT, 0);
}
-void select_linked_tfaces(bContext *C, Object *ob, short mval[2], int mode)
+void paintface_select_linked(bContext *UNUSED(C), Object *ob, short UNUSED(mval[2]), int mode)
{
Mesh *me;
unsigned int index=0;
@@ -363,10 +341,11 @@ void select_linked_tfaces(bContext *C, Object *ob, short mval[2], int mode)
select_linked_tfaces_with_seams(mode, me, index);
- object_facesel_flush_dm(ob);
+ paintface_flush_flags(ob);
}
-void selectall_tface(Object *ob, int action)
+/* note: caller needs to run paintface_flush_flags(ob) after this */
+void paintface_deselect_all_visible(Object *ob, int action, short flush_flags)
{
Mesh *me;
MPoly *mface;
@@ -375,40 +354,32 @@ void selectall_tface(Object *ob, int action)
me= get_mesh(ob);
if(me==0) return;
- if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
-
+ if(action == SEL_INVERT) {
mface= me->mpoly;
a= me->totpoly;
while(a--) {
- if((mface->flag & ME_HIDE) == 0 && mface->flag & ME_FACE_SEL) {
- action = SEL_DESELECT;
- break;
+ if((mface->flag & ME_HIDE) == 0) {
+ mface->flag ^= ME_FACE_SEL;
}
mface++;
}
- }
-
- mface= me->mpoly;
- a= me->totpoly;
- while(a--) {
- if((mface->flag & ME_HIDE) == 0) {
- switch (action) {
- case SEL_SELECT:
- mface->flag |= ME_FACE_SEL;
- break;
- case SEL_DESELECT:
- mface->flag &= ~ME_FACE_SEL;
- break;
- case SEL_INVERT:
- mface->flag ^= ME_FACE_SEL;
- break;
+ } else {
+ if (action == SEL_TOGGLE) {
+ action = SEL_SELECT;
+
+ mface= me->mpoly;
+ a= me->totpoly;
+ while(a--) {
+ if((mface->flag & ME_HIDE) == 0 && mface->flag & ME_FACE_SEL) {
+ action = SEL_DESELECT;
+ break;
+ }
+ mface++;
}
}
- mface++;
}
- object_facesel_flush_dm(ob);
+ //BMESH_TODO object_facesel_flush_dm(ob);
// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
@@ -429,16 +400,11 @@ void selectswap_tface(Scene *scene)
if(mface->flag & ME_FACE_SEL) mface->flag &= ~ME_FACE_SEL;
else mface->flag |= ME_FACE_SEL;
}
- mface++;
}
-
- object_facesel_flush_dm(OBACT);
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
-int minmax_tface(Scene *scene, float *min, float *max)
+int paintface_minmax(Object *ob, float *min, float *max)
{
- Object *ob;
Mesh *me;
MPoly *mf;
MTexPoly *tf;
@@ -446,9 +412,6 @@ int minmax_tface(Scene *scene, float *min, float *max)
MVert *mv;
int a, b, ok=0;
float vec[3], bmat[3][3];
-
- ob = OBACT;
- if (ob==0) return ok;
me= get_mesh(ob);
if(!me || !me->mtpoly) return ok;
@@ -710,7 +673,7 @@ int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, BMEdge *
}
/* *************************************** */
-
+#if 0
static void seam_edgehash_insert_face(EdgeHash *ehash, MPoly *mf, MLoop *loopstart)
{
MLoop *ml1, *ml2;
@@ -779,11 +742,10 @@ void seam_mark_clear_tface(Scene *scene, short mode)
// unwrap_lscm(1);
me->drawflag |= ME_DRAWSEAMS;
-
-// XXX notifier! object_tface_flags_changed(OBACT, 1);
}
+#endif
-int face_select(struct bContext *C, Object *ob, short mval[2], int extend)
+int paintface_mouse_select(struct bContext *C, Object *ob, short mval[2], int extend)
{
Mesh *me;
MPoly *mface, *msel;
@@ -823,34 +785,35 @@ int face_select(struct bContext *C, Object *ob, short mval[2], int extend)
/* image window redraw */
- object_facesel_flush_dm(ob);
-// XXX notifier! object_tface_flags_changed(OBACT, 1);
+ paintface_flush_flags(ob);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, ob->data);
ED_region_tag_redraw(CTX_wm_region(C)); // XXX - should redraw all 3D views
return 1;
}
-void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, int extend)
+int do_paintface_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
+ Object *ob = vc->obact;
Mesh *me;
MPoly *mface;
struct ImBuf *ibuf;
unsigned int *rt;
char *selar;
- int a, sx, sy, index;
+ int a, index;
+ int sx= rect->xmax-rect->xmin+1;
+ int sy= rect->ymax-rect->ymin+1;
- ViewContext vc;
- view3d_set_viewcontext(C, &vc);
-
me= get_mesh(ob);
- if(me==0) return;
- if(me->totpoly==0) return;
+ if(me==0) return 0;
+ if(me->totpoly==0) return 0;
+
+ if(me==NULL || me->totface==0 || sx*sy <= 0)
+ return OPERATOR_CANCELLED;
selar= MEM_callocN(me->totpoly+1, "selar");
- sx= (rect->xmax-rect->xmin+1);
- sy= (rect->ymax-rect->ymin+1);
- if(sx*sy<=0) return;
+ if (extend == 0 && select)
+ paintface_deselect_all_visible(vc->obact, SEL_DESELECT, FALSE);
if (extend == 0 && select) {
mface= me->mpoly;
@@ -860,11 +823,11 @@ void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, i
}
}
- view3d_validate_backbuf(&vc);
+ view3d_validate_backbuf(vc);
- ibuf = IMB_allocImBuf(sx,sy,32,IB_rect,0);
+ ibuf = IMB_allocImBuf(sx,sy,32,IB_rect);
rt = ibuf->rect;
- glReadPixels(rect->xmin+vc.ar->winrct.xmin, rect->ymin+vc.ar->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+ glReadPixels(rect->xmin+vc->ar->winrct.xmin, rect->ymin+vc->ar->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
if(ENDIAN_ORDER==B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf);
a= sx*sy;
@@ -890,11 +853,11 @@ void face_borderselect(struct bContext *C, Object *ob, rcti *rect, int select, i
IMB_freeImBuf(ibuf);
MEM_freeN(selar);
-
-// XXX notifier! object_tface_flags_changed(OBACT, 0);
#ifdef __APPLE__
glReadBuffer(GL_BACK);
#endif
-
- object_facesel_flush_dm(ob);
+
+ paintface_flush_flags(vc->obact);
+
+ return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/mesh/knifetool.c b/source/blender/editors/mesh/knifetool.c
index 10143b5af7c..60910497fad 100755
--- a/source/blender/editors/mesh/knifetool.c
+++ b/source/blender/editors/mesh/knifetool.c
@@ -803,7 +803,7 @@ BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree, float
return edges;
}
-knife_bgl_get_mats(knifetool_opdata *kcd, bglMats *mats)
+void knife_bgl_get_mats(knifetool_opdata *kcd, bglMats *mats)
{
bgl_get_mats(mats);
//copy_m4_m4(mats->modelview, kcd->vc.rv3d->viewmat);
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c
index a699561e4bb..0c9f9d8d68d 100644
--- a/source/blender/editors/mesh/loopcut.c
+++ b/source/blender/editors/mesh/loopcut.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,11 +34,11 @@
#include <stdio.h>
#include "DNA_ID.h"
+#include "DNA_object_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
-#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
@@ -48,12 +48,16 @@
#include "BLI_dynstr.h" /*for WM_operator_pystring */
#include "BLI_editVert.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
-#include "BKE_scene.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+#include "BKE_array_mallocn.h"
#include "BKE_tessmesh.h"
#include "BKE_depsgraph.h"
@@ -98,13 +102,15 @@ typedef struct tringselOpData {
} tringselOpData;
/* modal loop selection drawing callback */
-static void ringsel_draw(const bContext *C, ARegion *ar, void *arg)
+static void ringsel_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
{
- int i;
+ View3D *v3d = CTX_wm_view3d(C);
tringselOpData *lcd = arg;
+ int i;
if (lcd->totedge > 0) {
- glDisable(GL_DEPTH_TEST);
+ if(v3d && v3d->zbuf)
+ glDisable(GL_DEPTH_TEST);
glPushMatrix();
glMultMatrixf(lcd->ob->obmat);
@@ -118,7 +124,8 @@ static void ringsel_draw(const bContext *C, ARegion *ar, void *arg)
glEnd();
glPopMatrix();
- glEnable(GL_DEPTH_TEST);
+ if(v3d && v3d->zbuf)
+ glEnable(GL_DEPTH_TEST);
}
}
@@ -260,11 +267,11 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
lcd->totedge = tot;
}
-static void ringsel_find_edge(tringselOpData *lcd, const bContext *C, ARegion *ar, int cuts)
+static void ringsel_find_edge(tringselOpData *lcd, int cuts)
{
if (lcd->eed) {
edgering_sel(lcd, cuts, 0);
- } else {
+ } else if(lcd->edges) {
if (lcd->edges)
MEM_freeN(lcd->edges);
lcd->edges = NULL;
@@ -278,10 +285,11 @@ static void ringsel_finish(bContext *C, wmOperator *op)
int cuts= RNA_int_get(op->ptr, "number_cuts");
if (lcd->eed) {
+ BMEditMesh *em = lcd->em;
+
edgering_sel(lcd, cuts, 1);
+
if (lcd->do_cut) {
- BMEditMesh *em = lcd->em;
-
BM_esubdivideflag(lcd->ob, em->bm, BM_SELECT, 0.0f,
0.0f, 0, cuts, SUBDIV_SELECT_LOOPCUT,
SUBD_PATH, 0, 0);
@@ -295,17 +303,29 @@ static void ringsel_finish(bContext *C, wmOperator *op)
EDBM_selectmode_set(em);
WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, CTX_data_scene(C));
+
+ WM_event_add_notifier(C, NC_SCENE|ND_TOOLSETTINGS, CTX_data_scene(C));
}
WM_event_add_notifier(C, NC_GEOM|ND_SELECT|ND_DATA, lcd->ob->data);
- DAG_id_flush_update(lcd->ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(lcd->ob->data, 0);
+ }
+ else {
+
+ /* sets as active, useful for other tools */
+ if(em->selectmode & SCE_SELECT_VERTEX)
+ EDBM_selectmode_flush(em);
+ if(em->selectmode & SCE_SELECT_EDGE)
+ EDBM_selectmode_flush(em);
+
+ EDBM_selectmode_flush(lcd->em);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, lcd->ob->data);
}
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, lcd->ob->data);
}
}
/* called when modal loop selection is done... */
-static void ringsel_exit (bContext *C, wmOperator *op)
+static void ringsel_exit(bContext *UNUSED(C), wmOperator *op)
{
tringselOpData *lcd= op->customdata;
@@ -344,7 +364,7 @@ static int ringsel_init (bContext *C, wmOperator *op, int do_cut)
return 1;
}
-static int ringsel_cancel (bContext *C, wmOperator *op)
+static int ringcut_cancel (bContext *C, wmOperator *op)
{
/* this is just a wrapper around exit() */
ringsel_exit(C, op);
@@ -356,7 +376,7 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt)
tringselOpData *lcd;
BMEdge *edge;
int dist = 75;
-
+
view3d_operator_needs_opengl(C);
if (!ringsel_init(C, op, 0))
@@ -366,25 +386,35 @@ static int ringsel_invoke (bContext *C, wmOperator *op, wmEvent *evt)
WM_event_add_modal_handler(C, op);
lcd = op->customdata;
+
+ if (lcd->em->selectmode == SCE_SELECT_FACE) {
+ ringsel_exit(C, op);
+ WM_operator_name_call(C, "MESH_OT_loop_select", WM_OP_INVOKE_REGION_WIN, NULL);
+ return OPERATOR_CANCELLED;
+ }
+
lcd->vc.mval[0] = evt->mval[0];
lcd->vc.mval[1] = evt->mval[1];
edge = EDBM_findnearestedge(&lcd->vc, &dist);
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, 1);
+ ringsel_find_edge(lcd, 1);
}
return OPERATOR_RUNNING_MODAL;
}
-
static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
+ Object *obedit= CTX_data_edit_object(C);
tringselOpData *lcd;
BMEdge *edge;
int dist = 75;
+ if(modifiers_isDeformedByLattice(obedit) || modifiers_isDeformedByArmature(obedit))
+ BKE_report(op->reports, RPT_WARNING, "Loop cut doesn't work well on deformed edit mesh display");
+
view3d_operator_needs_opengl(C);
if (!ringsel_init(C, op, 1))
@@ -400,9 +430,10 @@ static int ringcut_invoke (bContext *C, wmOperator *op, wmEvent *evt)
edge = EDBM_findnearestedge(&lcd->vc, &dist);
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, 1);
+ ringsel_find_edge(lcd, 1);
}
-
+ ED_area_headerprint(CTX_wm_area(C), "Select a ring to be cut, use mouse-wheel or page-up/down for number of cuts");
+
return OPERATOR_RUNNING_MODAL;
}
@@ -427,6 +458,7 @@ static int ringsel_modal (bContext *C, wmOperator *op, wmEvent *event)
ringsel_finish(C, op);
ringsel_exit(C, op);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
return OPERATOR_FINISHED;
}
@@ -437,8 +469,9 @@ static int ringsel_modal (bContext *C, wmOperator *op, wmEvent *event)
if (event->val == KM_RELEASE) {
/* cancel */
ED_region_tag_redraw(lcd->ar);
+ ED_area_headerprint(CTX_wm_area(C), NULL);
- return ringsel_cancel(C, op);
+ return ringcut_cancel(C, op);
}
ED_region_tag_redraw(lcd->ar);
@@ -453,7 +486,7 @@ static int ringsel_modal (bContext *C, wmOperator *op, wmEvent *event)
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
+ ringsel_find_edge(lcd, cuts);
}
ED_region_tag_redraw(lcd->ar);
@@ -497,7 +530,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
/* cancel */
ED_region_tag_redraw(lcd->ar);
- return ringsel_cancel(C, op);
+ return ringcut_cancel(C, op);
}
ED_region_tag_redraw(lcd->ar);
@@ -509,7 +542,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
cuts++;
RNA_int_set(op->ptr,"number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
+ ringsel_find_edge(lcd, cuts);
ED_region_tag_redraw(lcd->ar);
break;
@@ -520,7 +553,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
cuts=MAX2(cuts-1,1);
RNA_int_set(op->ptr,"number_cuts",cuts);
- ringsel_find_edge(lcd, C, lcd->ar,cuts);
+ ringsel_find_edge(lcd, cuts);
ED_region_tag_redraw(lcd->ar);
break;
@@ -534,7 +567,7 @@ static int loopcut_modal (bContext *C, wmOperator *op, wmEvent *event)
if (edge != lcd->eed) {
lcd->eed = edge;
- ringsel_find_edge(lcd, C, lcd->ar, cuts);
+ ringsel_find_edge(lcd, cuts);
}
ED_region_tag_redraw(lcd->ar);
@@ -556,8 +589,8 @@ void MESH_OT_edgering_select (wmOperatorType *ot)
/* callbacks */
ot->invoke= ringsel_invoke;
ot->modal= ringsel_modal;
- ot->cancel= ringsel_cancel;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->cancel= ringcut_cancel;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
@@ -575,8 +608,8 @@ void MESH_OT_loopcut (wmOperatorType *ot)
/* callbacks */
ot->invoke= ringcut_invoke;
ot->modal= loopcut_modal;
- ot->cancel= ringsel_cancel;
- ot->poll= ED_operator_editmesh_view3d;
+ ot->cancel= ringcut_cancel;
+ ot->poll= ED_operator_editmesh_region_view3d;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING;
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 959cbd21b87..0ae3076170c 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,11 @@
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
@@ -48,10 +53,6 @@
#include "BKE_report.h"
#include "BKE_tessmesh.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-#include "BLI_edgehash.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -170,7 +171,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
}
}
-int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const char *name, int active_set)
+int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_set)
{
BMEditMesh *em;
int layernum;
@@ -191,7 +192,6 @@ int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, cons
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
if(active_set || layernum==0)
CustomData_set_layer_active(&em->bm->ldata, CD_MLOOPUV, layernum);
-
}
else {
layernum= CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
@@ -214,7 +214,7 @@ int ED_mesh_uv_texture_add(bContext *C, Scene *scene, Object *ob, Mesh *me, cons
mesh_update_customdata_pointers(me);
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -238,7 +238,7 @@ int ED_mesh_uv_texture_remove(bContext *C, Object *ob, Mesh *me)
delete_customdata_layer(C, ob, cdlp);
delete_customdata_layer(C, ob, cdlu);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -287,7 +287,7 @@ int ED_mesh_color_add(bContext *C, Scene *scene, Object *ob, Mesh *me, const cha
*/
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -305,7 +305,7 @@ int ED_mesh_color_remove(bContext *C, Object *ob, Mesh *me)
return 0;
delete_customdata_layer(C, ob, cdl);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return 1;
@@ -320,13 +320,12 @@ static int layers_poll(bContext *C)
return (ob && !ob->id.lib && ob->type==OB_MESH && data && !data->lib);
}
-static int uv_texture_add_exec(bContext *C, wmOperator *op)
+static int uv_texture_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
- if(!ED_mesh_uv_texture_add(C, scene, ob, me, NULL, TRUE))
+ if(!ED_mesh_uv_texture_add(C, me, NULL, TRUE))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -350,6 +349,7 @@ void MESH_OT_uv_texture_add(wmOperatorType *ot)
static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
+ View3D *v3d= CTX_wm_view3d(C);
Base *base= ED_view3d_give_base_under_cursor(C, event->mval);
Image *ima= NULL;
Mesh *me;
@@ -368,8 +368,7 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
char path[FILE_MAX];
RNA_string_get(op->ptr, "filepath", path);
- ima= BKE_add_image_file(path,
- scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(path);
}
else {
RNA_string_get(op->ptr, "name", name);
@@ -402,6 +401,10 @@ static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
me->edit_btmesh= NULL;
}
+ /* dummie drop support; ensure view shows a result :) */
+ if(v3d)
+ v3d->flag2 |= V3D_SOLID_TEX;
+
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -426,7 +429,7 @@ void MESH_OT_drop_named_image(wmOperatorType *ot)
RNA_def_string(ot->srna, "filepath", "Path", FILE_MAX, "Filepath", "Path to image file");
}
-static int uv_texture_remove_exec(bContext *C, wmOperator *op)
+static int uv_texture_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -454,7 +457,7 @@ void MESH_OT_uv_texture_remove(wmOperatorType *ot)
/*********************** vertex color operators ************************/
-static int vertex_color_add_exec(bContext *C, wmOperator *op)
+static int vertex_color_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -481,7 +484,7 @@ void MESH_OT_vertex_color_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_color_remove_exec(bContext *C, wmOperator *op)
+static int vertex_color_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -509,7 +512,7 @@ void MESH_OT_vertex_color_remove(wmOperatorType *ot)
/*********************** sticky operators ************************/
-static int sticky_add_exec(bContext *C, wmOperator *op)
+static int sticky_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
@@ -521,7 +524,7 @@ static int sticky_add_exec(bContext *C, wmOperator *op)
RE_make_sticky(scene, v3d);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -542,7 +545,7 @@ void MESH_OT_sticky_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int sticky_remove_exec(bContext *C, wmOperator *op)
+static int sticky_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Mesh *me= ob->data;
@@ -553,7 +556,7 @@ static int sticky_remove_exec(bContext *C, wmOperator *op)
CustomData_free_layer_active(&me->vdata, CD_MSTICKY, me->totvert);
me->msticky= NULL;
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
@@ -576,83 +579,14 @@ void MESH_OT_sticky_remove(wmOperatorType *ot)
/************************** Add Geometry Layers *************************/
-static void mesh_calc_edges(Mesh *mesh, int update)
-{
-#if 0
- CustomData edata;
- EdgeHashIterator *ehi;
- MFace *mf = mesh->mface;
- MEdge *med, *med_orig;
- EdgeHash *eh = BLI_edgehash_new();
- int i, *index, totedge, totface = mesh->totface;
-
- if(mesh->totedge==0)
- update= 0;
-
- if(update) {
- /* assume existing edges are valid
- * useful when adding more faces and generating edges from them */
- med= mesh->medge;
- for(i= 0; i<mesh->totedge; i++, med++)
- BLI_edgehash_insert(eh, med->v1, med->v2, med);
- }
-
- for (i = 0; i < totface; i++, mf++) {
- if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
- BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
- BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
-
- if (mf->v4) {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
- BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
- BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
- } else {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
- BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
- }
- }
-
- totedge = BLI_edgehash_size(eh);
-
- /* write new edges into a temporary CustomData */
- memset(&edata, 0, sizeof(edata));
- CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
-
- ehi = BLI_edgehashIterator_new(eh);
- med = CustomData_get_layer(&edata, CD_MEDGE);
- for(i = 0; !BLI_edgehashIterator_isDone(ehi);
- BLI_edgehashIterator_step(ehi), ++i, ++med, ++index) {
-
- if(update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
- *med= *med_orig; /* copy from the original */
- } else {
- BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
- med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- }
- }
- BLI_edgehashIterator_free(ehi);
-
- /* free old CustomData and assign new one */
- CustomData_free(&mesh->edata, mesh->totedge);
- mesh->edata = edata;
- mesh->totedge = totedge;
-
- mesh->medge = CustomData_get_layer(&mesh->edata, CD_MEDGE);
-
- BLI_edgehash_free(eh, NULL);
-#endif
-}
-
void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
{
if(calc_edges || (mesh->totface && mesh->totedge == 0))
- mesh_calc_edges(mesh, calc_edges);
+ BKE_mesh_calc_edges(mesh, calc_edges);
mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
- DAG_id_flush_update(&mesh->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mesh->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
}
@@ -779,8 +713,7 @@ void ED_mesh_faces_add(Mesh *mesh, ReportList *reports, int count)
if(mesh->edit_btmesh) {
BKE_report(reports, RPT_ERROR, "Can't add faces in edit mode.");
return;
-}
-
+ }
mesh_add_faces(mesh, count);
}
@@ -808,3 +741,4 @@ void ED_mesh_calc_normals(Mesh *me)
{
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
+
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 327d0e95487..ba5f87f47a2 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,9 +51,6 @@ struct BMEdge;
struct BMFace;
struct wmOperator;
-
-#define UVCOPY(t, s) memcpy(t, s, 2 * sizeof(float));
-
/* ******************** bmeshutils.c */
/*
@@ -63,7 +60,7 @@ ok: the EDBM module is for editmode bmesh stuff. in contrast, the
*/
/*calls a bmesh op, reporting errors to the user, etc*/
-int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, char *fmt, ...);
+int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, const char *fmt, ...);
/*calls a bmesh op, reporting errors to the user, etc.
@@ -72,7 +69,7 @@ int EDBM_CallOpf(struct BMEditMesh *em, struct wmOperator *op, char *fmt, ...);
//moved to ED_mesh.h
/*same as above, but doesn't report errors.*/
-int EDBM_CallOpfSilent(struct BMEditMesh *em, char *fmt, ...);
+int EDBM_CallOpfSilent(struct BMEditMesh *em, const 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
@@ -80,7 +77,7 @@ int EDBM_CallOpfSilent(struct BMEditMesh *em, char *fmt, ...);
execute the operator with BM_Exec_Op*/
int EDBM_InitOpf(struct BMEditMesh *em, struct BMOperator *bmop,
- struct wmOperator *op, char *fmt, ...);
+ struct wmOperator *op, const char *fmt, ...);
/*cleans up after a bmesh operator*/
int EDBM_FinishOp(struct BMEditMesh *em, struct BMOperator *bmop,
struct wmOperator *op, int report);
@@ -101,8 +98,7 @@ int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, BMEdge *
extern void free_editvert(EditMesh *em, EditVert *eve);
extern void free_editedge(EditMesh *em, EditEdge *eed);
-extern void free_editface(EditMesh *em, EditFace *efa);
-void free_editMesh(EditMesh *em);
+extern void free_editface(EditMesh *em, EditFace *efa);;
/*frees dst mesh, then copies the contents of
*src (the struct) to dst. */
@@ -193,9 +189,6 @@ extern int EM_view3d_poll(struct bContext *C);
/* ******************* editmesh_loop.c */
-#define LOOP_SELECT 1
-#define LOOP_CUT 2
-
void MESH_OT_knife_cut(struct wmOperatorType *ot);
/* ******************* editmesh_mods.c */
@@ -224,11 +217,11 @@ void MESH_OT_loop_multi_select(struct wmOperatorType *ot);
void MESH_OT_mark_seam(struct wmOperatorType *ot);
void MESH_OT_mark_sharp(struct wmOperatorType *ot);
void MESH_OT_vertices_smooth(struct wmOperatorType *ot);
+void MESH_OT_noise(struct wmOperatorType *ot);
void MESH_OT_flip_normals(struct wmOperatorType *ot);
void MESH_OT_solidify(struct wmOperatorType *ot);
void MESH_OT_select_nth(struct wmOperatorType *ot);
-
#define SUBDIV_SELECT_ORIG 0
#define SUBDIV_SELECT_INNER 1
#define SUBDIV_SELECT_INNER_SEL 2
@@ -249,6 +242,8 @@ int EdgeSlide(EditMesh *em, struct wmOperator *op, short immediate, float imperc
void MESH_OT_merge(struct wmOperatorType *ot);
void MESH_OT_subdivide(struct wmOperatorType *ot);
void MESH_OT_remove_doubles(struct wmOperatorType *ot);
+void MESH_OT_vertices_randomize(struct wmOperatorType *ot);
+void MESH_OT_vertices_sort(struct wmOperatorType *ot);
void MESH_OT_extrude(struct wmOperatorType *ot);
void MESH_OT_spin(struct wmOperatorType *ot);
void MESH_OT_screw(struct wmOperatorType *ot);
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index f966852672f..519a77fa4aa 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,6 +45,7 @@
#include "WM_types.h"
#include "ED_object.h"
+#include "ED_mesh.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -83,6 +84,8 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_primitive_ico_sphere_add);
WM_operatortype_append(MESH_OT_duplicate);
WM_operatortype_append(MESH_OT_remove_doubles);
+ WM_operatortype_append(MESH_OT_vertices_sort);
+ WM_operatortype_append(MESH_OT_vertices_randomize);
WM_operatortype_append(MESH_OT_spin);
WM_operatortype_append(MESH_OT_screw);
@@ -123,6 +126,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_mark_seam);
WM_operatortype_append(MESH_OT_mark_sharp);
WM_operatortype_append(MESH_OT_vertices_smooth);
+ WM_operatortype_append(MESH_OT_noise);
WM_operatortype_append(MESH_OT_flip_normals);
WM_operatortype_append(MESH_OT_knife_cut);
WM_operatortype_append(MESH_OT_rip);
@@ -146,7 +150,8 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_knifetool);
}
-int ED_operator_editmesh_face_select(bContext *C)
+#if 0 /* UNUSED, remove? */
+static int ED_operator_editmesh_face_select(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
if(obedit && obedit->type==OB_MESH) {
@@ -157,6 +162,7 @@ int ED_operator_editmesh_face_select(bContext *C)
}
return 0;
}
+#endif
void ED_operatormacros_mesh(void)
{
@@ -229,7 +235,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
- kmi= WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_ALT|KM_CTRL, 0);
kmi= WM_keymap_add_item(keymap, "MESH_OT_edgering_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
@@ -245,12 +251,12 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1);
- RNA_float_set(WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0)->ptr,"sharpness",135.0);
+ WM_keymap_add_item(keymap, "MESH_OT_faces_select_linked_flat", FKEY, KM_PRESS, (KM_CTRL|KM_SHIFT|KM_ALT), 0);
WM_keymap_add_item(keymap, "MESH_OT_select_similar", GKEY, KM_PRESS, KM_SHIFT, 0);
/* selection mode */
- WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_selection_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
/* hide */
WM_keymap_add_item(keymap, "MESH_OT_hide", HKEY, KM_PRESS, 0, 0);
@@ -261,10 +267,11 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_normals_make_consistent", NKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0)->ptr, "inside", 1);
- WM_keymap_add_item(keymap, "view3d.edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_individual_move", EKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_edit_mesh_extrude_move_normal", EKEY, KM_PRESS, 0, 0); /* python operator */
WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_extrude", EKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_edge_crease", EKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "MESH_OT_spin", RKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0);
@@ -291,7 +298,8 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
/* use KM_CLICK because same key is used for tweaks */
WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_CTRL, 0);
-
+ RNA_boolean_set(WM_keymap_add_item(keymap, "MESH_OT_dupli_extrude_cursor", ACTIONMOUSE, KM_CLICK, KM_SHIFT|KM_CTRL, 0)->ptr, "rotate_source", 0);
+
WM_keymap_add_item(keymap, "MESH_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MESH_OT_delete", DELKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index a99ca251cc2..153153552bd 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,7 +33,6 @@
#include <stddef.h>
#include <stdlib.h>
-#include <string.h>
#include <math.h>
#include <float.h>
@@ -47,6 +46,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_rand.h" /* for randome face sorting */
@@ -64,6 +64,7 @@
#include "BKE_material.h"
#include "BKE_report.h"
#include "BKE_tessmesh.h"
+#include "BKE_multires.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -76,14 +77,14 @@
/* own include */
#include "mesh_intern.h"
-
+#include "uvedit_intern.h"
/* * ********************** no editmode!!! *********** */
/*********************** JOIN ***************************/
/* join selected meshes into the active mesh, context sensitive
-return 0 if no join is made (error) and 1 of the join is done */
+return 0 if no join is made (error) and 1 if the join is done */
int join_mesh_exec(bContext *C, wmOperator *op)
{
@@ -92,11 +93,11 @@ int join_mesh_exec(bContext *C, wmOperator *op)
Object *ob= CTX_data_active_object(C);
Material **matar, *ma;
Mesh *me;
- MVert *mvert, *mv, *mvertmain;
- MEdge *medge = NULL, *medgemain;
- MFace *mface = NULL, *mfacemain;
- MPoly *mpoly = NULL, *mpolymain;
- MLoop *mloop = NULL, *mloopmain;
+ MVert *mvert, *mv;
+ MEdge *medge = NULL;
+ MFace *mface = NULL;
+ MPoly *mpoly = NULL;
+ MLoop *mloop = NULL;
Key *key, *nkey=NULL;
KeyBlock *kb, *okb, *kbn;
float imat[4][4], cmat[4][4], *fp1, *fp2, curpos;
@@ -107,12 +108,16 @@ int join_mesh_exec(bContext *C, wmOperator *op)
MDeformVert *dvert;
CustomData vdata, edata, fdata, ldata, pdata;
- if(scene->obedit)
+ if(scene->obedit) {
+ BKE_report(op->reports, RPT_WARNING, "Cant join while in editmode");
return OPERATOR_CANCELLED;
+ }
/* ob is the object we are adding geometry to */
- if(!ob || ob->type!=OB_MESH)
+ if(!ob || ob->type!=OB_MESH) {
+ BKE_report(op->reports, RPT_WARNING, "Active object is not a mesh");
return OPERATOR_CANCELLED;
+ }
/* count & check */
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
@@ -137,15 +142,25 @@ int join_mesh_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* that way the active object is always selected */
- if(ok==0)
+ if(ok==0) {
+ BKE_report(op->reports, RPT_WARNING, "Active object is not a selected mesh");
return OPERATOR_CANCELLED;
+ }
/* only join meshes if there are verts to join, there aren't too many, and we only had one mesh selected */
me= (Mesh *)ob->data;
key= me->key;
- if(totvert==0 || totvert>MESH_MAX_VERTS || totvert==me->totvert)
+
+ if(totvert==0 || totvert==me->totvert) {
+ BKE_report(op->reports, RPT_WARNING, "No mesh data to join");
return OPERATOR_CANCELLED;
+ }
+ if(totvert > MESH_MAX_VERTS) {
+ BKE_reportf(op->reports, RPT_WARNING, "Joining results in %d vertices, limit is " STRINGIFY(MESH_MAX_VERTS), totvert);
+ return OPERATOR_CANCELLED;
+ }
+
/* new material indices and material array */
matar= MEM_callocN(sizeof(void*)*totmat, "join_mesh matar");
if (totmat) matmap= MEM_callocN(sizeof(int)*totmat, "join_mesh matmap");
@@ -274,13 +289,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
mface= CustomData_add_layer(&fdata, CD_MFACE, CD_CALLOC, NULL, totface);
mloop= CustomData_add_layer(&ldata, CD_MLOOP, CD_CALLOC, NULL, totloop);
mpoly= CustomData_add_layer(&pdata, CD_MPOLY, CD_CALLOC, NULL, totpoly);
-
- mvertmain= mvert;
- medgemain= medge;
- mfacemain= mface;
- mloopmain = mloop;
- mpolymain = mpoly;
-
+
vertofs= 0;
edgeofs= 0;
faceofs= 0;
@@ -409,6 +418,9 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
}
+ if(base->object!=ob)
+ multiresModifier_prepare_join(scene, base->object, ob);
+
CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
CustomData_copy_data(&me->fdata, &fdata, 0, faceofs, me->totface);
@@ -557,10 +569,19 @@ int join_mesh_exec(bContext *C, wmOperator *op)
}
DAG_scene_sort(bmain, scene); // removed objects, need to rebuild dag before editmode call
-
+
+#if 0
ED_object_enter_editmode(C, EM_WAITCURSOR);
ED_object_exit_editmode(C, EM_FREEDATA|EM_WAITCURSOR|EM_DO_UNDO);
-
+#else
+ /* toggle editmode using lower level functions so this can be called from python */
+ EDBM_MakeEditBMesh(scene->toolsettings, scene, ob);
+ EDBM_LoadEditBMesh(scene, ob);
+ EDBM_FreeEditBMesh(me->edit_btmesh);
+ MEM_freeN(me->edit_btmesh);
+ me->edit_btmesh= NULL;
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
+#endif
WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
return OPERATOR_FINISHED;
@@ -598,9 +619,9 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
if (!ok) {
if (nonequal_verts)
- BKE_report(op->reports, RPT_ERROR, "Selected meshes must have equal numbers of vertices.");
+ BKE_report(op->reports, RPT_WARNING, "Selected meshes must have equal numbers of vertices.");
else
- BKE_report(op->reports, RPT_ERROR, "No additional selected meshes with equal vertex count to join.");
+ BKE_report(op->reports, RPT_WARNING, "No additional selected meshes with equal vertex count to join.");
return OPERATOR_CANCELLED;
}
@@ -815,8 +836,7 @@ intptr_t mesh_octree_table(Object *ob, BMEditMesh *em, float *co, char mode)
BMIter iter;
BMVert *eve;
- eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
- for (; eve; eve=BMIter_Step(&iter))
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
DO_MINMAX(eve->co, min, max)
}
else {
@@ -852,8 +872,7 @@ intptr_t mesh_octree_table(Object *ob, BMEditMesh *em, float *co, char mode)
BMVert *eve;
BMIter iter;
- eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
- for (; eve; eve=BMIter_Step(&iter)) {
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
mesh_octree_add_nodes(MeshOctree.table, eve->co, MeshOctree.offs, MeshOctree.div, (intptr_t)(eve));
}
}
@@ -911,31 +930,27 @@ static int mesh_topo_lookup_mode = -1;
/* if end, ob can be NULL */
long mesh_mirrtopo_table(Object *ob, char mode)
{
-#if 0
if(mode=='u') { /* use table */
Mesh *me= ob->data;
if( (mesh_topo_lookup==NULL) ||
(mesh_topo_lookup_mode != ob->mode) ||
- (me->edit_mesh && me->edit_mesh->totvert != mesh_topo_lookup_tot) ||
- (me->edit_mesh==NULL && me->totvert != mesh_topo_lookup_tot)
+ (me->edit_btmesh && me->edit_btmesh->bm->totvert != mesh_topo_lookup_tot) ||
+ (me->edit_btmesh==NULL && me->totvert != mesh_topo_lookup_tot)
) {
mesh_mirrtopo_table(ob, 's');
}
} else if(mode=='s') { /* start table */
Mesh *me= ob->data;
MEdge *medge;
- EditMesh *em= me->edit_mesh;
-
-
- /* editmode*/
- EditEdge *eed;
-
- int a, last, totvert;
- int totUnique= -1, totUniqueOld= -1;
-
+ BMEditMesh *em= me->edit_btmesh;
+ BMEdge *eed;
+ BMIter iter;
MIRRHASH_TYPE *MirrTopoHash = NULL;
MIRRHASH_TYPE *MirrTopoHash_Prev = NULL;
MirrTopoPair *MirrTopoPairs;
+ int a, last, totvert;
+ int totUnique= -1, totUniqueOld= -1;
+
mesh_topo_lookup_mode= ob->mode;
/* reallocate if needed */
@@ -945,12 +960,15 @@ long mesh_mirrtopo_table(Object *ob, char mode)
}
if(em) {
- EditVert *eve;
+ BMVert *eve;
+
totvert= 0;
- for(eve= em->verts.first; eve; eve= eve->next) {
- eve->hash = totvert++;
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BMINDEX_SET(eve, totvert);
+ totvert++;
}
- } else {
+ }
+ else {
totvert = me->totvert;
}
@@ -958,9 +976,9 @@ long mesh_mirrtopo_table(Object *ob, char mode)
/* Initialize the vert-edge-user counts used to detect unique topology */
if(em) {
- for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->hash]++;
- MirrTopoHash[eed->v2->hash]++;
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ MirrTopoHash[BMINDEX_GET(eed->v1)]++;
+ MirrTopoHash[BMINDEX_GET(eed->v2)]++;
}
} else {
for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -976,9 +994,9 @@ long mesh_mirrtopo_table(Object *ob, char mode)
/* use the number of edges per vert to give verts unique topology IDs */
if(em) {
- for(eed=em->edges.first; eed; eed= eed->next) {
- MirrTopoHash[eed->v1->hash] += MirrTopoHash_Prev[eed->v2->hash];
- MirrTopoHash[eed->v2->hash] += MirrTopoHash_Prev[eed->v1->hash];
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ MirrTopoHash[BMINDEX_GET(eed->v1)] += MirrTopoHash_Prev[BMINDEX_GET(eed->v2)];
+ MirrTopoHash[BMINDEX_GET(eed->v2)] += MirrTopoHash_Prev[BMINDEX_GET(eed->v1)];
}
} else {
for(a=0, medge=me->medge; a<me->totedge; a++, medge++) {
@@ -1017,7 +1035,7 @@ long mesh_mirrtopo_table(Object *ob, char mode)
mesh_topo_lookup = MEM_mallocN( totvert * sizeof(long), "mesh_topo_lookup" );
if(em) {
- EM_init_index_arrays(em,1,0,0);
+ EDBM_init_index_arrays(em,1,0,0);
}
@@ -1041,8 +1059,8 @@ long mesh_mirrtopo_table(Object *ob, char mode)
if ((a==totvert) || (MirrTopoPairs[a-1].hash != MirrTopoPairs[a].hash)) {
if (a-last==2) {
if(em) {
- mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] = (long)EM_get_vert_for_index(MirrTopoPairs[a-2].vIndex);
- mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] = (long)EM_get_vert_for_index(MirrTopoPairs[a-1].vIndex);
+ mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] = (long)EDBM_get_vert_for_index(em, MirrTopoPairs[a-2].vIndex);
+ mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] = (long)EDBM_get_vert_for_index(em, MirrTopoPairs[a-1].vIndex);
} else {
mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] = MirrTopoPairs[a-2].vIndex;
mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] = MirrTopoPairs[a-1].vIndex;
@@ -1052,7 +1070,7 @@ long mesh_mirrtopo_table(Object *ob, char mode)
}
}
if(em) {
- EM_free_index_arrays();
+ EDBM_free_index_arrays(em);
}
MEM_freeN( MirrTopoPairs );
@@ -1071,12 +1089,9 @@ long mesh_mirrtopo_table(Object *ob, char mode)
mesh_topo_lookup_tot= -1;
}
return 0;
-#endif
-
- return 0;
}
-int mesh_get_x_mirror_vert_spacial(Object *ob, int index)
+static int mesh_get_x_mirror_vert_spacial(Object *ob, int index)
{
Mesh *me= ob->data;
MVert *mvert;
@@ -1090,33 +1105,25 @@ int mesh_get_x_mirror_vert_spacial(Object *ob, int index)
return mesh_octree_table(ob, NULL, vec, 'u');
}
-/*BMESH_TODO: hook into editbmesh_bvh.h code, though that'll require caching the
- bvh structure most likely, not too difficult*/
-BMVert *editmesh_get_x_mirror_vert(Object *ob, BMEditMesh *em, float *co)
+static int mesh_get_x_mirror_vert_topo(Object *ob, int index)
{
-#if 0
if (mesh_mirrtopo_table(ob, 'u')==-1)
return -1;
return mesh_topo_lookup[index];
-#endif
- return NULL;
-
}
int mesh_get_x_mirror_vert(Object *ob, int index)
{
-#if 0 //BMESH_TODO
if (((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_TOPO) {
return mesh_get_x_mirror_vert_topo(ob, index);
} else {
return mesh_get_x_mirror_vert_spacial(ob, index);
}
-#endif
return 0;
}
-static EditVert *editmesh_get_x_mirror_vert_spacial(Object *ob, EditMesh *em, float *co)
+static BMVert *editbmesh_get_x_mirror_vert_spacial(Object *ob, BMEditMesh *em, float *co)
{
float vec[3];
intptr_t poinval;
@@ -1138,41 +1145,48 @@ static EditVert *editmesh_get_x_mirror_vert_spacial(Object *ob, EditMesh *em, fl
return NULL;
}
-static EditVert *editmesh_get_x_mirror_vert_topo(Object *ob, struct EditMesh *em, EditVert *eve, int index)
+static BMVert *editbmesh_get_x_mirror_vert_topo(Object *ob, struct BMEditMesh *em, BMVert *eve, int index)
{
long poinval;
if (mesh_mirrtopo_table(ob, 'u')==-1)
return NULL;
- if (index!=-1) {
- index = BLI_findindex(&em->verts, eve);
+ if (index == -1) {
+ BMIter iter;
+ BMVert *v;
+
+ index = 0;
+ BM_ITER(v, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if (v == eve)
+ break;
+ index++;
+ }
+
+ if (index == em->bm->totvert) {
+ return NULL;
+ }
}
- if (index==-1)
- return NULL;
-
poinval= mesh_topo_lookup[ index ];
if(poinval != -1)
- return (EditVert *)(poinval);
+ return (BMVert *)(poinval);
return NULL;
-}
+}
-#if 0
-EditVert *editmesh_get_x_mirror_vert(Object *ob, struct EditMesh *em, EditVert *eve, float *co, int index)
+BMVert *editbmesh_get_x_mirror_vert(Object *ob, struct BMEditMesh *em, BMVert *eve, float *co, int index)
{
//BMESH_TODO use this flag, ME_EDIT_MIRROR_TOPO, at appropriate places
if (((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_TOPO) {
- return editmesh_get_x_mirror_vert_topo(ob, em, eve, index);
+ return editbmesh_get_x_mirror_vert_topo(ob, em, eve, index);
} else {
- return editmesh_get_x_mirror_vert_spacial(ob, em, eve->co);
+ return editbmesh_get_x_mirror_vert_spacial(ob, em, co);
}
}
-#endif
-#if 0
-float *editmesh_get_mirror_uv(int axis, float *uv, float *mirrCent, float *face_cent)
+
+float *editmesh_get_mirror_uv(BMEditMesh *em, int axis, float *uv, float *mirrCent, float *face_cent)
{
float vec[2];
float cent_vec[2];
@@ -1200,30 +1214,33 @@ float *editmesh_get_mirror_uv(int axis, float *uv, float *mirrCent, float *face_
/* TODO - Optimize */
{
- EditFace *efa;
- int i, len;
- for(efa=em->faces.first; efa; efa=efa->next) {
- MTFace *tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- uv_center(tf->uv, cent, (void *)efa->v4);
-
+ BMIter iter;
+ BMFace *efa;
+
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ poly_uv_center(em, efa, cent);
+
if ( (fabs(cent[0] - cent_vec[0]) < 0.001) && (fabs(cent[1] - cent_vec[1]) < 0.001) ) {
- len = efa->v4 ? 4 : 3;
- for (i=0; i<len; i++) {
- if ( (fabs(tf->uv[i][0] - vec[0]) < 0.001) && (fabs(tf->uv[i][1] - vec[1]) < 0.001) ) {
- return tf->uv[i];
- }
+ BMIter liter;
+ BMLoop *l;
+
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ if ( (fabs(luv->uv[0] - vec[0]) < 0.001) && (fabs(luv->uv[1] - vec[1]) < 0.001) ) {
+ return luv->uv;
+
}
}
}
}
+ }
return NULL;
}
-#endif
-static unsigned int mirror_facehash(void *ptr)
+static unsigned int mirror_facehash(const void *ptr)
{
- MFace *mf= ptr;
+ const MFace *mf= ptr;
int v0, v1;
if(mf->v4) {
@@ -1262,7 +1279,7 @@ static int mirror_facerotation(MFace *a, MFace *b)
return -1;
}
-static int mirror_facecmp(void *a, void *b)
+static int mirror_facecmp(const void *a, const void *b)
{
return (mirror_facerotation((MFace*)a, (MFace*)b) == -1);
}
diff --git a/source/blender/editors/metaball/CMakeLists.txt b/source/blender/editors/metaball/CMakeLists.txt
index 5e821a5c1e8..af3d25699ed 100644
--- a/source/blender/editors/metaball/CMakeLists.txt
+++ b/source/blender/editors/metaball/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../makesdna
../../makesrna
@@ -32,4 +31,11 @@ SET(INC
../../../../intern/guardedalloc
)
-BLENDERLIB(bf_editor_metaball "${SRC}" "${INC}")
+set(SRC
+ mball_edit.c
+ mball_ops.c
+
+ mball_intern.h
+)
+
+blender_add_lib(bf_editor_metaball "${SRC}" "${INC}")
diff --git a/source/blender/editors/metaball/Makefile b/source/blender/editors/metaball/Makefile
deleted file mode 100644
index c28ef59e9db..00000000000
--- a/source/blender/editors/metaball/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_metaball
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/metaball/SConscript b/source/blender/editors/metaball/SConscript
index e526a1560cf..b1a1ce935db 100644
--- a/source/blender/editors/metaball/SConscript
+++ b/source/blender/editors/metaball/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../gpu'
+incs += ' ../../gpu ../../blenloader'
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
env.BlenderLib ( 'bf_editors_metaball', sources, Split(incs), [], libtype=['core'], priority=[45] )
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 62ebe84e078..48750e9c6b8 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
@@ -47,6 +48,7 @@
#include "BKE_context.h"
#include "BKE_mball.h"
+#include "ED_mball.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_transform.h"
@@ -55,6 +57,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "mball_intern.h"
+
/* This function is used to free all MetaElems from MetaBall */
void free_editMball(Object *obedit)
{
@@ -84,26 +88,24 @@ void make_editMball(Object *obedit)
/* This function is called, when MetaBall Object switched from
* edit mode to object mode. List od MetaElements is copied
* from object->data->edit_elems to object->data->elems. */
-void load_editMball(Object *obedit)
+void load_editMball(Object *UNUSED(obedit))
{
}
/* Add metaelem primitive to metaball object (which is in edit mode) */
-MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int newname)
+MetaElem *add_metaball_primitive(bContext *C, float mat[4][4], int type, int UNUSED(newname))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mball = (MetaBall*)obedit->data;
MetaElem *ml;
- if(!obedit) return NULL;
-
/* Deselect all existing metaelems */
ml= mball->editelems->first;
while(ml) {
ml->flag &= ~SELECT;
ml= ml->next;
}
-
+
ml= add_metaball_element(mball, type);
copy_v3_v3(&ml->x, mat[3]);
@@ -177,7 +179,7 @@ void MBALL_OT_select_all(wmOperatorType *ot)
/***************************** Select inverse operator *****************************/
/* Invert metaball selection */
-static int select_inverse_metaelems_exec(bContext *C, wmOperator *op)
+static int select_inverse_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb = (MetaBall*)obedit->data;
@@ -266,7 +268,7 @@ void MBALL_OT_select_random_metaelems(struct wmOperatorType *ot)
/***************************** Duplicate operator *****************************/
/* Duplicate selected MetaElements */
-static int duplicate_metaelems_exec(bContext *C, wmOperator *op)
+static int duplicate_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb = (MetaBall*)obedit->data;
@@ -284,13 +286,13 @@ static int duplicate_metaelems_exec(bContext *C, wmOperator *op)
ml= ml->prev;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
}
-static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
int retv= duplicate_metaelems_exec(C, op);
@@ -325,7 +327,7 @@ void MBALL_OT_duplicate_metaelems(wmOperatorType *ot)
/***************************** Delete operator *****************************/
/* Delete all selected MetaElems (not MetaBall) */
-static int delete_metaelems_exec(bContext *C, wmOperator *op)
+static int delete_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb= (MetaBall*)obedit->data;
@@ -343,7 +345,7 @@ static int delete_metaelems_exec(bContext *C, wmOperator *op)
ml= next;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -372,28 +374,18 @@ static int hide_metaelems_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb= (MetaBall*)obedit->data;
MetaElem *ml;
- int hide_unselected= RNA_boolean_get(op->ptr, "unselected");
+ const int invert= RNA_boolean_get(op->ptr, "unselected") ? SELECT : 0;
ml= mb->editelems->first;
if(ml) {
- /* Hide unselected metaelems */
- if(hide_unselected) {
- while(ml){
- if(!(ml->flag & SELECT))
- ml->flag |= MB_HIDE;
- ml= ml->next;
- }
- /* Hide selected metaelems */
- } else {
- while(ml){
- if(ml->flag & SELECT)
- ml->flag |= MB_HIDE;
- ml= ml->next;
- }
+ while(ml){
+ if((ml->flag & SELECT) != invert)
+ ml->flag |= MB_HIDE;
+ ml= ml->next;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -420,7 +412,7 @@ void MBALL_OT_hide_metaelems(wmOperatorType *ot)
/***************************** Unhide operator *****************************/
/* Unhide all edited MetaElems */
-static int reveal_metaelems_exec(bContext *C, wmOperator *op)
+static int reveal_metaelems_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
MetaBall *mb= (MetaBall*)obedit->data;
@@ -434,7 +426,7 @@ static int reveal_metaelems_exec(bContext *C, wmOperator *op)
ml= ml->next;
}
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mb);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
return OPERATOR_FINISHED;
@@ -606,7 +598,7 @@ static void free_undoMball(void *lbv)
MEM_freeN(lb);
}
-ListBase *metaball_get_editelems(Object *ob)
+static ListBase *metaball_get_editelems(Object *ob)
{
if(ob && ob->type==OB_MBALL) {
struct MetaBall *mb= (struct MetaBall*)ob->data;
@@ -623,7 +615,7 @@ static void *get_data(bContext *C)
}
/* this is undo system for MetaBalls */
-void undo_push_mball(bContext *C, char *name)
+void undo_push_mball(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_data, free_undoMball, undoMball_to_editMball, editMball_to_undoMball, NULL);
}
diff --git a/source/blender/editors/metaball/mball_intern.h b/source/blender/editors/metaball/mball_intern.h
index 454b30eceef..36c263bde47 100644
--- a/source/blender/editors/metaball/mball_intern.h
+++ b/source/blender/editors/metaball/mball_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c
index 14402d7dae6..99d313e2a30 100644
--- a/source/blender/editors/metaball/mball_ops.c
+++ b/source/blender/editors/metaball/mball_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,7 +31,7 @@
#include "RNA_access.h"
-
+#include "ED_mball.h"
#include "ED_screen.h"
#include "mball_intern.h"
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index e1085fd87ca..edf3834002e 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
../../gpu
@@ -37,12 +36,27 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+set(SRC
+ object_add.c
+ object_bake.c
+ object_constraint.c
+ object_edit.c
+ object_group.c
+ object_hook.c
+ object_lattice.c
+ object_modifier.c
+ object_ops.c
+ object_relations.c
+ object_select.c
+ object_shapekey.c
+ object_transform.c
+ object_vgroup.c
+
+ object_intern.h
+)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_object "${SRC}" "${INC}")
+blender_add_lib(bf_editor_object "${SRC}" "${INC}")
diff --git a/source/blender/editors/object/Makefile b/source/blender/editors/object/Makefile
deleted file mode 100644
index 4694653b115..00000000000
--- a/source/blender/editors/object/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_object
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript
index d6da69f4a3a..5db12f32d8b 100644
--- a/source/blender/editors/object/SConscript
+++ b/source/blender/editors/object/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc'
+incs += ' ../../windowmanager #/intern/guardedalloc ../../blenloader'
incs += ' ../../makesrna ../../python ../../ikplugin ../../bmesh'
incs += ' ../../render/extern/include ../../gpu' # for object_bake.c
@@ -17,7 +17,7 @@ if env['OURPLATFORM'] == 'linux2':
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_object', sources, Split(incs), defs, libtype=['core'], priority=[35] )
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index e4b71368315..c997baa3a30 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,8 +43,10 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
+#include "BKE_animsys.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_context.h"
@@ -104,15 +106,16 @@ void ED_object_location_from_view(bContext *C, float *loc)
void ED_object_rotation_from_view(bContext *C, float *rot)
{
- RegionView3D *rv3d= ED_view3d_context_rv3d(C);
-
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
if(rv3d) {
- rv3d->viewquat[0]= -rv3d->viewquat[0];
- quat_to_eul( rot, rv3d->viewquat);
- rv3d->viewquat[0]= -rv3d->viewquat[0];
+ float quat[4];
+ copy_qt_qt(quat, rv3d->viewquat);
+ quat[0]= -quat[0];
+ quat_to_eul(rot, quat);
+ }
+ else {
+ zero_v3(rot);
}
- else
- rot[0] = rot[1] = rot[2] = 0.f;
}
void ED_object_base_init_transform(bContext *C, Base *base, float *loc, float *rot)
@@ -161,11 +164,6 @@ float ED_object_new_primitive_matrix(bContext *C, Object *obedit, float *loc, fl
/********************* Add Object Operator ********************/
-void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */
-{
- /* keep here to get things compile, remove later */
-}
-
void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode)
{
PropertyRNA *prop;
@@ -218,7 +216,7 @@ static void object_add_generic_invoke_options(bContext *C, wmOperator *op)
}
}
-int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
object_add_generic_invoke_options(C, op);
return op->type->exec(C, op);
@@ -260,9 +258,11 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa
view_align = FALSE;
else if (RNA_property_is_set(op->ptr, "view_align"))
view_align = RNA_boolean_get(op->ptr, "view_align");
- else
+ else {
view_align = U.flag & USER_ADD_VIEWALIGNED;
-
+ RNA_boolean_set(op->ptr, "view_align", view_align);
+ }
+
if (view_align)
ED_object_rotation_from_view(C, rot);
else
@@ -280,6 +280,7 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa
}
/* for object add primitive operators */
+/* do not call undo push in this function (users of this function have to) */
Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer)
{
Main *bmain= CTX_data_main(C);
@@ -336,7 +337,7 @@ void OBJECT_OT_add(wmOperatorType *ot)
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -363,11 +364,6 @@ static EnumPropertyItem field_type_items[] = {
{PFIELD_DRAG, "DRAG", ICON_FORCE_DRAG, "Drag", ""},
{0, NULL, 0, NULL, NULL}};
-void add_effector_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menus, only non-editmode stuff */
-{
- /* keep here to get things compile, remove later */
-}
-
/* for effector add primitive operators */
static Object *effector_add_type(bContext *C, wmOperator *op, int type)
{
@@ -408,6 +404,8 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type)
ob->pd= object_add_collision_fields(type);
+ DAG_scene_sort(CTX_data_main(C), CTX_data_scene(C));
+
return ob;
}
@@ -431,7 +429,7 @@ void OBJECT_OT_effector_add(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= effector_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -482,7 +480,7 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_camera_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -492,20 +490,10 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
/* ***************** add primitives *************** */
-
-static EnumPropertyItem prop_metaball_types[]= {
- {MB_BALL, "MBALL_BALL", ICON_META_BALL, "Meta Ball", ""},
- {MB_TUBE, "MBALL_CAPSULE", ICON_META_CAPSULE, "Meta Capsule", ""},
- {MB_PLANE, "MBALL_PLANE", ICON_META_PLANE, "Meta Plane", ""},
- {MB_CUBE, "MBALL_CUBE", ICON_META_CUBE, "Meta Cube", ""},
- {MB_ELIPSOID, "MBALL_ELLIPSOID", ICON_META_ELLIPSOID, "Meta Ellipsoid", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
static int object_metaball_add_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
- MetaElem *elem;
+ /*MetaElem *elem;*/ /*UNUSED*/
int newob= 0;
int enter_editmode;
unsigned int layer;
@@ -521,12 +509,12 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE, layer);
newob = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
ED_object_new_primitive_matrix(C, obedit, loc, rot, mat);
- elem= (MetaElem*)add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob);
-
+ /* elem= (MetaElem *) */ add_metaball_primitive(C, mat, RNA_enum_get(op->ptr, "type"), newob);
+
/* userdef */
if (newob && !enter_editmode) {
ED_object_exit_editmode(C, EM_FREEDATA);
@@ -537,7 +525,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *obedit= CTX_data_edit_object(C);
uiPopupMenu *pup;
@@ -545,7 +533,7 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *even
object_add_generic_invoke_options(C, op);
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
if(!obedit || obedit->type == OB_MBALL)
uiItemsEnumO(layout, op->type->idname, "type");
@@ -571,7 +559,7 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
- RNA_def_enum(ot->srna, "type", prop_metaball_types, 0, "Primitive", "");
+ RNA_def_enum(ot->srna, "type", metaelem_type_items, 0, "Primitive", "");
ED_object_add_generic_props(ot, TRUE);
}
@@ -606,7 +594,7 @@ void OBJECT_OT_text_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_add_text_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -617,7 +605,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
View3D *v3d= CTX_wm_view3d(C);
- RegionView3D *rv3d= NULL;
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
int newob= 0;
int enter_editmode;
unsigned int layer;
@@ -632,16 +620,13 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
ED_object_enter_editmode(C, 0);
newob = 1;
}
- else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ else DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
if(obedit==NULL) {
BKE_report(op->reports, RPT_ERROR, "Cannot create editmode armature.");
return OPERATOR_CANCELLED;
}
- if(v3d)
- rv3d= CTX_wm_region(C)->regiondata;
-
/* v3d and rv3d are allowed to be NULL */
add_primitive_bone(CTX_data_scene(C), v3d, rv3d);
@@ -664,14 +649,14 @@ void OBJECT_OT_armature_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= ED_object_add_generic_invoke;
ot->exec= object_armature_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
ED_object_add_generic_props(ot, TRUE);
}
-static char *get_lamp_defname(int type)
+static const char *get_lamp_defname(int type)
{
switch (type) {
case LA_LOCAL: return "Point";
@@ -697,9 +682,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer);
- if(ob && ob->data)
- ((Lamp*)ob->data)->type= type;
-
+ ((Lamp*)ob->data)->type= type;
rename_id((ID *)ob, get_lamp_defname(type));
rename_id((ID *)ob->data, get_lamp_defname(type));
@@ -724,7 +707,7 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_lamp_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -781,7 +764,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot)
ot->invoke= WM_enum_search_invoke;
ot->exec= group_instance_add_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -805,7 +788,7 @@ void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
MEM_freeN(base);
}
-static int object_delete_exec(bContext *C, wmOperator *op)
+static int object_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -817,6 +800,10 @@ static int object_delete_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
if(base->object->type==OB_LAMP) islamp= 1;
+
+ /* deselect object -- it could be used in other scenes */
+ base->object->flag &= ~SELECT;
+
/* remove from current scene only */
ED_base_object_free_and_unlink(bmain, scene, base);
}
@@ -843,7 +830,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_operator_confirm;
ot->exec= object_delete_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -851,7 +838,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/**************************** Copy Utilities ******************************/
-static void copy_object__forwardModifierLinks(void *userData, Object *ob,
+static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob),
ID **idpoin)
{
/* this is copied from ID_NEW; it might be better to have a macro */
@@ -984,14 +971,19 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
basen->lay= base->lay;
BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */
basen->object= ob;
- ob->ipo= NULL; /* make sure apply works */
- ob->parent= ob->track= NULL;
+
+ /* make sure apply works */
+ BKE_free_animdata(&ob->id);
+ ob->adt = NULL;
+
+ ob->parent= NULL;
+ ob->constraints.first= ob->constraints.last= NULL;
ob->disp.first= ob->disp.last= NULL;
ob->transflag &= ~OB_DUPLI;
ob->lay= base->lay;
copy_m4_m4(ob->obmat, dob->mat);
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
}
copy_object_set_idnew(C, 0);
@@ -1001,7 +993,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base)
base->object->transflag &= ~OB_DUPLI;
}
-static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
+static int object_duplicates_make_real_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1010,6 +1002,9 @@ static int object_duplicates_make_real_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
make_object_duplilist_real(C, scene, base);
+
+ /* dependencies were changed */
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARENT, base->object);
}
CTX_DATA_END;
@@ -1032,7 +1027,7 @@ void OBJECT_OT_duplicates_make_real(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_duplicates_make_real_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1047,9 +1042,7 @@ static EnumPropertyItem convert_target_items[]= {
static void curvetomesh(Scene *scene, Object *ob)
{
- Curve *cu= ob->data;
-
- if(cu->disp.first==0)
+ if(ob->disp.first==0)
makeDispListCurveTypes(scene, ob, 0); /* force creation */
nurbs_to_mesh(ob); /* also does users */
@@ -1077,7 +1070,7 @@ static Base *duplibase_for_convert(Scene *scene, Base *base, Object *ob)
}
obn= copy_object(ob);
- obn->recalc |= OB_RECALC_ALL;
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
basen= MEM_mallocN(sizeof(Base), "duplibase");
*basen= *base;
@@ -1102,8 +1095,8 @@ static int convert_exec(bContext *C, wmOperator *op)
Nurb *nu;
MetaBall *mb;
Mesh *me;
- int target= RNA_enum_get(op->ptr, "target");
- int keep_original= RNA_boolean_get(op->ptr, "keep_original");
+ const short target= RNA_enum_get(op->ptr, "target");
+ const short keep_original= RNA_boolean_get(op->ptr, "keep_original");
int a, mballConverted= 0;
/* don't forget multiple users! */
@@ -1112,17 +1105,31 @@ static int convert_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
ob->flag &= ~OB_DONE;
+
+ /* flag data thats not been edited (only needed for !keep_original) */
+ if(ob->data) {
+ ((ID *)ob->data)->flag |= LIB_DOIT;
+ }
}
CTX_DATA_END;
CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
ob= base->object;
- if(ob->flag & OB_DONE) {
+ if(ob->flag & OB_DONE || !IS_TAGGED(ob->data)) {
if (ob->type != target) {
base->flag &= ~SELECT;
ob->flag &= ~SELECT;
}
+
+ /* obdata already modified */
+ if(!IS_TAGGED(ob->data)) {
+ /* When 2 objects with linked data are selected, converting both
+ * would keep modifiers on all but the converted object [#26003] */
+ if(ob->type == OB_MESH) {
+ object_free_modifiers(ob); /* after derivedmesh calls! */
+ }
+ }
}
else if (ob->type==OB_MESH && target == OB_CURVE) {
ob->flag |= OB_DONE;
@@ -1161,7 +1168,7 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_mesh(me);
} else {
newob = ob;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
/* make new mesh data from the original copy */
@@ -1194,7 +1201,7 @@ static int convert_exec(bContext *C, wmOperator *op)
cu= newob->data;
- if (!cu->disp.first)
+ if (!newob->disp.first)
makeDispListCurveTypes(scene, newob, 0);
newob->type= OB_CURVE;
@@ -1222,7 +1229,7 @@ static int convert_exec(bContext *C, wmOperator *op)
for(ob1= bmain->object.first; ob1; ob1=ob1->id.next) {
if(ob1->data==ob->data) {
ob1->type= OB_CURVE;
- ob1->recalc |= OB_RECALC_ALL;
+ ob1->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
}
}
@@ -1231,8 +1238,12 @@ static int convert_exec(bContext *C, wmOperator *op)
for(nu=cu->nurb.first; nu; nu=nu->next)
nu->charidx= 0;
- if(target == OB_MESH)
+ if(target == OB_MESH) {
curvetomesh(scene, newob);
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
+ }
}
else if(ELEM(ob->type, OB_CURVE, OB_SURF)) {
ob->flag |= OB_DONE;
@@ -1249,19 +1260,17 @@ static int convert_exec(bContext *C, wmOperator *op)
newob->data= copy_curve(ob->data);
} else {
newob= ob;
+
+ /* meshes doesn't use displist */
+ freedisplist(&newob->disp);
}
curvetomesh(scene, newob);
}
}
- else if(ob->type==OB_MBALL) {
+ else if(ob->type==OB_MBALL && target == OB_MESH) {
Object *baseob;
- if (target != OB_MESH) {
- ob->flag |= OB_DONE;
- continue;
- }
-
base->flag &= ~SELECT;
ob->flag &= ~SELECT;
@@ -1303,11 +1312,12 @@ static int convert_exec(bContext *C, wmOperator *op)
mballConverted= 1;
}
- else
- continue;
}
- else
+ else {
continue;
+ }
+
+ /* tag obdata if it was been changed */
/* If the original object is active then make this object active */
if(basen) {
@@ -1319,8 +1329,9 @@ static int convert_exec(bContext *C, wmOperator *op)
basen= NULL;
}
- if (!keep_original) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ if (!keep_original && (ob->flag & OB_DONE)) {
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ ((ID *)ob->data)->flag &= ~LIB_DOIT; /* flag not to convert this datablock again */
}
/* delete original if needed */
@@ -1359,11 +1370,13 @@ static int convert_exec(bContext *C, wmOperator *op)
ED_base_object_activate(C, basact);
BASACT= basact;
} else if (BASACT->object->flag & OB_DONE) {
- WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER|ND_DATA, BASACT->object);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, BASACT->object);
+ WM_event_add_notifier(C, NC_OBJECT|ND_DATA, BASACT->object);
}
DAG_scene_sort(bmain, scene);
- WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
return OPERATOR_FINISHED;
}
@@ -1413,7 +1426,7 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
}
else {
obn= copy_object(ob);
- obn->recalc |= OB_RECALC_ALL;
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
basen= MEM_mallocN(sizeof(Base), "duplibase");
*basen= *base;
@@ -1449,17 +1462,12 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
}
}
}
- if(dupflag & USER_DUP_ACT){ /* Not buttons in the UI to modify this, add later? */
- id= (ID *)obn->action;
- if (id){
- ID_NEW_US(obn->action)
- else{
- obn->action= copy_action(obn->action);
- }
- id->us--;
- }
- }
#endif // XXX old animation system
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&obn->id);
+ }
+
if(dupflag & USER_DUP_MAT) {
for(a=0; a<obn->totcol; a++) {
id= (ID *)obn->mat[a];
@@ -1467,6 +1475,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
ID_NEW_US(obn->mat[a])
else obn->mat[a]= copy_material(obn->mat[a]);
id->us--;
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&obn->mat[a]->id);
+ }
}
}
}
@@ -1477,6 +1489,11 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
if(id) {
ID_NEW_US(psys->part)
else psys->part= psys_copy_settings(psys->part);
+
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action(&psys->part->id);
+ }
+
id->us--;
}
}
@@ -1544,7 +1561,10 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
case OB_LAMP:
if(dupflag & USER_DUP_LAMP) {
ID_NEW_US2(obn->data )
- else obn->data= copy_lamp(obn->data);
+ else {
+ obn->data= copy_lamp(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
@@ -1568,29 +1588,42 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
case OB_LATTICE:
if(dupflag!=0) {
ID_NEW_US2(obn->data )
- else obn->data= copy_lattice(obn->data);
+ else {
+ obn->data= copy_lattice(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
case OB_CAMERA:
if(dupflag!=0) {
ID_NEW_US2(obn->data )
- else obn->data= copy_camera(obn->data);
+ else {
+ obn->data= copy_camera(obn->data);
+ didit= 1;
+ }
id->us--;
}
break;
}
-
- if(dupflag & USER_DUP_MAT) {
- matarar= give_matarar(obn);
- if(didit && matarar) {
- for(a=0; a<obn->totcol; a++) {
- id= (ID *)(*matarar)[a];
- if(id) {
- ID_NEW_US( (*matarar)[a] )
- else (*matarar)[a]= copy_material((*matarar)[a]);
-
- id->us--;
+
+ /* check if obdata is copied */
+ if(didit) {
+ if(dupflag & USER_DUP_ACT) {
+ BKE_copy_animdata_id_action((ID *)obn->data);
+ }
+
+ if(dupflag & USER_DUP_MAT) {
+ matarar= give_matarar(obn);
+ if(matarar) {
+ for(a=0; a<obn->totcol; a++) {
+ id= (ID *)(*matarar)[a];
+ if(id) {
+ ID_NEW_US( (*matarar)[a] )
+ else (*matarar)[a]= copy_material((*matarar)[a]);
+
+ id->us--;
+ }
}
}
}
@@ -1647,8 +1680,10 @@ static int duplicate_exec(bContext *C, wmOperator *op)
/* new object becomes active */
if(BASACT==base)
ED_base_object_activate(C, basen);
-
- ED_render_id_flush_update(bmain, basen->object->data);
+
+ if(basen->object->data) {
+ DAG_id_tag_update(basen->object->data, 0);
+ }
}
CTX_DATA_END;
@@ -1673,7 +1708,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= duplicate_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1686,20 +1721,6 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
/* **************** add named object, for dragdrop ************* */
-/* contextual operator dupli */
-
-static int add_named_poll(bContext *C)
-{
- if(!ED_operator_scene_editable(C)) {
- return 0;
- } else {
- Object *ob= CTX_data_active_object(C);
- if(ob && ob->mode != OB_MODE_OBJECT)
- return 0;
- else
- return 1;
- }
-}
static int add_named_exec(bContext *C, wmOperator *op)
{
@@ -1758,7 +1779,7 @@ void OBJECT_OT_add_named(wmOperatorType *ot)
/* api callbacks */
ot->exec= add_named_exec;
- ot->poll= add_named_poll;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1782,7 +1803,6 @@ static int join_poll(bContext *C)
return 0;
}
-
static int join_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -1796,7 +1816,7 @@ static int join_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, "Can't edit external libdata.");
return OPERATOR_CANCELLED;
}
-
+
if(ob->type == OB_MESH)
return join_mesh_exec(C, op);
else if(ELEM(ob->type, OB_CURVE, OB_SURF))
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index a03d1a29333..e2b125fdbe7 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,12 +42,14 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
+#include "BKE_multires.h"
#include "BKE_report.h"
#include "RE_pipeline.h"
@@ -63,11 +65,14 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
+
+#include "object_intern.h"
/* ****************** render BAKING ********************** */
/* threaded break test */
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return G.afbreek;
}
@@ -114,7 +119,7 @@ typedef struct BakeRender {
} BakeRender;
/* use by exec and invoke */
-int test_bake_internal(bContext *C, ReportList *reports)
+static int test_bake_internal(bContext *C, ReportList *reports)
{
Scene *scene= CTX_data_scene(C);
@@ -137,6 +142,12 @@ static void init_bake_internal(BakeRender *bkr, bContext *C)
{
Scene *scene= CTX_data_scene(C);
+ /* flush multires changes (for sculpt) */
+ multires_force_render_update(CTX_data_active_object(C));
+
+ /* get editmode results */
+ ED_object_exit_editmode(C, 0); /* 0 = does not exit editmode */
+
bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
bkr->main= CTX_data_main(C);
bkr->scene= scene;
@@ -227,13 +238,13 @@ static void bake_freejob(void *bkv)
BakeRender *bkr= bkv;
finish_bake_internal(bkr);
- if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No Images found to bake to");
+ if(bkr->tot==0) BKE_report(bkr->reports, RPT_ERROR, "No objects or images found to bake to");
MEM_freeN(bkr);
G.rendering = 0;
}
/* catch esc */
-static int objects_bake_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int objects_bake_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
/* no running blender, remove handler and pass through */
if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C)))
@@ -248,10 +259,14 @@ static int objects_bake_render_modal(bContext *C, wmOperator *op, wmEvent *event
return OPERATOR_PASS_THROUGH;
}
-static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *_event)
+static int objects_bake_render_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(_event))
{
Scene *scene= CTX_data_scene(C);
+ /* only one render job at a time */
+ if(WM_jobs_test(CTX_wm_manager(C), scene))
+ return OPERATOR_CANCELLED;
+
if(test_bake_internal(C, op->reports)==0) {
return OPERATOR_CANCELLED;
}
@@ -295,9 +310,7 @@ static int bake_image_exec(bContext *C, wmOperator *op)
}
else {
ListBase threads;
- BakeRender bkr;
-
- memset(&bkr, 0, sizeof(bkr));
+ BakeRender bkr= {0};
init_bake_internal(&bkr, C);
bkr.reports= op->reports;
@@ -323,7 +336,7 @@ static int bake_image_exec(bContext *C, wmOperator *op)
}
BLI_end_threads(&threads);
- if(bkr.tot==0) BKE_report(op->reports, RPT_ERROR, "No Images found to bake to");
+ if(bkr.tot==0) BKE_report(op->reports, RPT_ERROR, "No valid images found to bake to");
finish_bake_internal(&bkr);
}
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index e3944883482..306f5f89275 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
@@ -53,7 +54,7 @@
#include "BKE_report.h"
#include "BIK_api.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -65,6 +66,7 @@
#include "RNA_enum_types.h"
#include "ED_object.h"
+#include "ED_armature.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -138,7 +140,7 @@ bConstraint *get_active_constraint (Object *ob)
/* ------------- PyConstraints ------------------ */
/* this callback sets the text-file to be used for selected menu item */
-void validate_pyconstraint_cb (void *arg1, void *arg2)
+static void validate_pyconstraint_cb (void *arg1, void *arg2)
{
bPythonConstraint *data = arg1;
Text *text= NULL;
@@ -153,9 +155,9 @@ void validate_pyconstraint_cb (void *arg1, void *arg2)
data->text = text;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* this returns a string for the list of usable pyconstraint script names */
-char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
+static char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
{
DynStr *pupds= BLI_dynstr_new();
Text *text;
@@ -194,21 +196,26 @@ char *buildmenu_pyconstraints (Text *con_text, int *pyconindex)
return str;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
+#if 0 // UNUSED, until pyconstraints are added back.
/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
-void update_pyconstraint_cb (void *arg1, void *arg2)
+static void update_pyconstraint_cb (void *arg1, void *arg2)
{
-#ifndef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)arg1; /* unused */
+ (void)arg2; /* unused */
+#else
Object *owner= (Object *)arg1;
bConstraint *con= (bConstraint *)arg2;
if (owner && con)
BPY_pyconstraint_update(owner, con);
#endif
}
+#endif // UNUSED
/* helper function for add_constriant - sets the last target for the active constraint */
-static void set_constraint_nth_target (bConstraint *con, Object *target, char subtarget[], int index)
+static void set_constraint_nth_target (bConstraint *con, Object *target, const char subtarget[], int index)
{
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
@@ -400,11 +407,26 @@ static void test_constraints (Object *owner, bPoseChannel *pchan)
for (ct= targets.first; ct; ct= ct->next) {
/* general validity checks (for those constraints that need this) */
if (exist_object(ct->tar) == 0) {
+ /* object doesn't exist, but constraint requires target */
ct->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
}
else if (ct->tar == owner) {
- if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ if (type == CONSTRAINT_OBTYPE_BONE) {
+ if (!get_named_bone(get_armature(owner), ct->subtarget)) {
+ /* bone must exist in armature... */
+ // TODO: clear subtarget?
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ else if (strcmp(pchan->name, ct->subtarget) == 0) {
+ /* cannot target self */
+ ct->subtarget[0] = '\0';
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+ }
+ else {
+ /* cannot use self as target */
+ ct->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
}
}
@@ -464,11 +486,11 @@ static EnumPropertyItem constraint_owner_items[] = {
static int edit_constraint_poll_generic(bContext *C, StructRNA *rna_type)
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", rna_type);
- Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
-
+ Object *ob= (ptr.id.data) ? ptr.id.data : ED_object_active_context(C);
+
if (!ob || ob->id.lib) return 0;
- if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
-
+ if (ptr.id.data && ((ID*)ptr.id.data)->lib) return 0;
+
return 1;
}
@@ -510,7 +532,7 @@ static int edit_constraint_invoke_properties(bContext *C, wmOperator *op)
return 0;
}
-static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Object *ob, int type)
+static bConstraint *edit_constraint_property_get(wmOperator *op, Object *ob, int type)
{
char constraint_name[32];
int owner = RNA_enum_get(op->ptr, "owner");
@@ -526,11 +548,20 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob
bPoseChannel *pchan= get_active_posechannel(ob);
if (pchan)
list = &pchan->constraints;
- else
+ else {
+ //if (G.f & G_DEBUG)
+ //printf("edit_constraint_property_get: No active bone for object '%s'\n", (ob)? ob->id.name+2 : "<None>");
return NULL;
+ }
+ }
+ else {
+ //if (G.f & G_DEBUG)
+ //printf("edit_constraint_property_get: defaulting to getting list in the standard way\n");
+ list = get_active_constraints(ob);
}
con = constraints_findByName(list, constraint_name);
+ printf("constraint found = %p, %s\n", con, (con)?con->name:"<Not found>");
if (con && (type != 0) && (con->type != type))
con = NULL;
@@ -546,7 +577,7 @@ static bConstraint *edit_constraint_property_get(bContext *C, wmOperator *op, Ob
static int stretchto_reset_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_STRETCHTO);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_STRETCHTO);
bStretchToConstraint *data= (con) ? (bStretchToConstraint *)con->data : NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
@@ -561,7 +592,7 @@ static int stretchto_reset_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int stretchto_reset_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return stretchto_reset_exec(C, op);
@@ -589,7 +620,7 @@ void CONSTRAINT_OT_stretchto_reset (wmOperatorType *ot)
static int limitdistance_reset_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_DISTLIMIT);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_DISTLIMIT);
bDistLimitConstraint *data= (con) ? (bDistLimitConstraint *)con->data : NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
@@ -604,7 +635,7 @@ static int limitdistance_reset_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int limitdistance_reset_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return limitdistance_reset_exec(C, op);
@@ -635,13 +666,16 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
bPoseChannel *pchan= NULL;
/* despite 3 layers of checks, we may still not be able to find a constraint */
- if (data == NULL)
+ if (data == NULL) {
+ printf("DEBUG: Child-Of Set Inverse - object = '%s'\n", (ob)? ob->id.name+2 : "<None>");
+ BKE_report(op->reports, RPT_ERROR, "Couldn't find constraint data for Child-Of Set Inverse");
return OPERATOR_CANCELLED;
+ }
/* try to find a pose channel */
// TODO: get from context instead?
@@ -691,7 +725,7 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int childof_set_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return childof_set_inverse_exec(C, op);
@@ -719,9 +753,14 @@ void CONSTRAINT_OT_childof_set_inverse (wmOperatorType *ot)
static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, CONSTRAINT_TYPE_CHILDOF);
+ bConstraint *con = edit_constraint_property_get(op, ob, CONSTRAINT_TYPE_CHILDOF);
bChildOfConstraint *data= (con) ? (bChildOfConstraint *)con->data : NULL;
+ if(data==NULL) {
+ BKE_report(op->reports, RPT_ERROR, "Childof constraint not found.");
+ return OPERATOR_CANCELLED;
+ }
+
/* simply clear the matrix */
unit_m4(data->invmat);
@@ -730,7 +769,7 @@ static int childof_clear_inverse_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int childof_clear_inverse_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return childof_clear_inverse_exec(C, op);
@@ -775,8 +814,8 @@ void ED_object_constraint_update(Object *ob)
object_test_constraints(ob);
- if(ob->type==OB_ARMATURE) DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
- else DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ if(ob->type==OB_ARMATURE) DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ else DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
void ED_object_constraint_dependency_update(Main *bmain, Scene *scene, Object *ob)
@@ -793,7 +832,7 @@ static int constraint_poll(bContext *C)
return (ptr.id.data && ptr.data);
}
-static int constraint_delete_exec (bContext *C, wmOperator *op)
+static int constraint_delete_exec (bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "constraint", &RNA_Constraint);
Object *ob= ptr.id.data;
@@ -805,8 +844,10 @@ static int constraint_delete_exec (bContext *C, wmOperator *op)
/* there's no active constraint now, so make sure this is the case */
constraints_set_active(lb, NULL);
+ ED_object_constraint_update(ob); /* needed to set the flags on posebones correctly */
+
/* notifiers */
- WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, ob);
return OPERATOR_FINISHED;
}
@@ -834,7 +875,7 @@ void CONSTRAINT_OT_delete (wmOperatorType *ot)
static int constraint_move_down_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, 0);
+ bConstraint *con = edit_constraint_property_get(op, ob, 0);
if (con && con->next) {
ListBase *conlist= get_constraint_lb(ob, con, NULL);
@@ -852,7 +893,7 @@ static int constraint_move_down_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int constraint_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int constraint_move_down_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return constraint_move_down_exec(C, op);
@@ -882,7 +923,7 @@ void CONSTRAINT_OT_move_down (wmOperatorType *ot)
static int constraint_move_up_exec (bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- bConstraint *con = edit_constraint_property_get(C, op, ob, 0);
+ bConstraint *con = edit_constraint_property_get(op, ob, 0);
if (con && con->prev) {
ListBase *conlist= get_constraint_lb(ob, con, NULL);
@@ -900,7 +941,7 @@ static int constraint_move_up_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int constraint_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int constraint_move_up_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_constraint_invoke_properties(C, op))
return constraint_move_up_exec(C, op);
@@ -929,11 +970,11 @@ void CONSTRAINT_OT_move_up (wmOperatorType *ot)
/************************ remove constraint operators *********************/
-static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
+static int pose_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* free constraints for all selected bones */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -947,7 +988,7 @@ static int pose_constraints_clear_exec(bContext *C, wmOperator *op)
DAG_scene_sort(bmain, scene); /* sort order of objects */
/* do updates */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
return OPERATOR_FINISHED;
@@ -966,7 +1007,7 @@ void POSE_OT_constraints_clear(wmOperatorType *ot)
}
-static int object_constraints_clear_exec(bContext *C, wmOperator *op)
+static int object_constraints_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -975,7 +1016,7 @@ static int object_constraints_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
{
free_constraints(&ob->constraints);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
CTX_DATA_END;
@@ -1018,14 +1059,19 @@ static int pose_constraint_copy_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, bPoseChannel*, chan, selected_pose_bones)
{
/* if we're not handling the object we're copying from, copy all constraints over */
- if (pchan != chan)
+ if (pchan != chan) {
copy_constraints(&chan->constraints, &pchan->constraints, TRUE);
+ /* update flags (need to add here, not just copy) */
+ chan->constflag |= pchan->constflag;
+ }
}
CTX_DATA_END;
/* force depsgraph to get recalculated since new relationships added */
DAG_scene_sort(bmain, scene); /* sort order of objects/bones */
+ WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, NULL);
+
return OPERATOR_FINISHED;
}
@@ -1044,7 +1090,7 @@ void POSE_OT_constraints_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_constraint_copy_exec(bContext *C, wmOperator *op)
+static int object_constraint_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -1228,11 +1274,18 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
bPoseChannel *pchan;
bConstraint *con;
- if(list == &ob->constraints)
+ if (list == &ob->constraints) {
pchan= NULL;
- else
+ }
+ else {
pchan= get_active_posechannel(ob);
-
+
+ /* ensure not to confuse object/pose adding */
+ if (pchan == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No active pose bone to add a constraint to.");
+ return OPERATOR_CANCELLED;
+ }
+ }
/* check if constraint to be added is valid for the given constraints stack */
if (type == CONSTRAINT_TYPE_NULL) {
return OPERATOR_CANCELLED;
@@ -1276,22 +1329,10 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
}
/* do type-specific tweaking to the constraint settings */
- // TODO: does action constraint need anything here - i.e. spaceonce?
switch (type) {
- case CONSTRAINT_TYPE_CHILDOF:
- {
- /* if this constraint is being added to a posechannel, make sure
- * the constraint gets evaluated in pose-space */
- if (ob->mode & OB_MODE_POSE) {
- con->ownspace = CONSTRAINT_SPACE_POSE;
- con->flag |= CONSTRAINT_SPACEONCE;
- }
- }
- break;
-
case CONSTRAINT_TYPE_PYTHON: // FIXME: this code is not really valid anymore
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
char *menustr;
int scriptint= 0;
/* popup a list of usable scripts */
@@ -1315,20 +1356,20 @@ static int constraint_add_exec(bContext *C, wmOperator *op, Object *ob, ListBase
/* make sure all settings are valid - similar to above checks, but sometimes can be wrong */
object_test_constraints(ob);
-
- if (ob->pose)
+
+ if (pchan)
update_pose_constraint_flags(ob->pose);
-
-
+
+
/* force depsgraph to get recalculated since new relationships added */
DAG_scene_sort(bmain, scene); /* sort order of objects */
if ((ob->type==OB_ARMATURE) && (pchan)) {
ob->pose->flag |= POSE_RECALC; /* sort pose channels */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
}
else
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_ADDED, ob);
@@ -1362,7 +1403,7 @@ static int object_constraint_add_exec(bContext *C, wmOperator *op)
/* dummy operator callback */
static int pose_constraint_add_exec(bContext *C, wmOperator *op)
{
- Object *ob= ED_object_active_context(C);
+ Object *ob= ED_object_pose_armature(ED_object_active_context(C));
int type= RNA_enum_get(op->ptr, "type");
short with_targets= 0;
@@ -1463,9 +1504,9 @@ void POSE_OT_constraint_add_with_targets(wmOperatorType *ot)
// TODO: should these be here, or back in editors/armature/poseobject.c again?
/* present menu with options + validation for targets to use */
-static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
bPoseChannel *pchan= get_active_posechannel(ob);
bConstraint *con= NULL;
@@ -1490,7 +1531,7 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
}
/* prepare popup menu to choose targetting options */
- pup= uiPupMenuBegin(C, "Add IK", 0);
+ pup= uiPupMenuBegin(C, "Add IK", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* the type of targets we'll set determines the menu entries to show... */
@@ -1499,14 +1540,14 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *evt)
* - the only thing that matters is that we want a target...
*/
if (tar_pchan)
- uiItemBooleanO(layout, "To Active Bone", 0, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Bone", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
else
- uiItemBooleanO(layout, "To Active Object", 0, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
}
else {
/* we have a choice of adding to a new empty, or not setting any target (targetless IK) */
- uiItemBooleanO(layout, "To New Empty Object", 0, "POSE_OT_ik_add", "with_targets", 1);
- uiItemBooleanO(layout, "Without Targets", 0, "POSE_OT_ik_add", "with_targets", 0);
+ uiItemBooleanO(layout, "To New Empty Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "Without Targets", ICON_NULL, "POSE_OT_ik_add", "with_targets", 0);
}
/* finish building the menu, and process it (should result in calling self again) */
@@ -1547,9 +1588,9 @@ void POSE_OT_ik_add(wmOperatorType *ot)
/* ------------------ */
/* remove IK constraints from selected bones */
-static int pose_ik_clear_exec(bContext *C, wmOperator *op)
+static int pose_ik_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
/* only remove IK Constraints */
CTX_DATA_BEGIN(C, bPoseChannel*, pchan, selected_pose_bones)
@@ -1568,7 +1609,7 @@ static int pose_ik_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
/* refresh depsgraph */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, ob);
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 8a0fc56fa87..ba336ad388c 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_rand.h"
@@ -49,6 +50,7 @@
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_force.h"
#include "DNA_meshdata_types.h"
#include "DNA_vfont_types.h"
@@ -58,6 +60,7 @@
#include "BKE_constraint.h"
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_effect.h"
#include "BKE_depsgraph.h"
#include "BKE_font.h"
#include "BKE_image.h"
@@ -98,13 +101,13 @@
#include "object_intern.h" // own include
/* ************* XXX **************** */
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static int pupmenu(const char *msg) {return 0;}
+static void error(const char *UNUSED(arg)) {}
+static void waitcursor(int UNUSED(val)) {}
+static int pupmenu(const char *UNUSED(msg)) {return 0;}
/* port over here */
-static bContext *C;
-static void error_libdata() {}
+static bContext *evil_C;
+static void error_libdata(void) {}
/* find the correct active object per context
@@ -121,7 +124,7 @@ Object *ED_object_active_context(bContext *C)
/* ********* clear/set restrict view *********/
-static int object_hide_view_clear_exec(bContext *C, wmOperator *op)
+static int object_hide_view_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
ScrArea *sa= CTX_wm_area(C);
@@ -168,7 +171,7 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
short changed = 0;
- int unselected= RNA_boolean_get(op->ptr, "unselected");
+ const int unselected= RNA_boolean_get(op->ptr, "unselected");
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
if(!unselected) {
@@ -220,7 +223,7 @@ void OBJECT_OT_hide_view_set(wmOperatorType *ot)
}
/* 99% same as above except no need for scene refreshing (TODO, update render preview) */
-static int object_hide_render_clear_exec(bContext *C, wmOperator *op)
+static int object_hide_render_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
short changed= 0;
@@ -257,7 +260,7 @@ void OBJECT_OT_hide_render_clear(wmOperatorType *ot)
static int object_hide_render_set_exec(bContext *C, wmOperator *op)
{
- int unselected= RNA_boolean_get(op->ptr, "unselected");
+ const int unselected= RNA_boolean_get(op->ptr, "unselected");
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
if(!unselected) {
@@ -326,11 +329,12 @@ void ED_object_exit_editmode(bContext *C, int flag)
MEM_freeN(me->edit_btmesh);
me->edit_btmesh= NULL;
}
-
+#if 0 //BMESH_TODO
if(obedit->restore_mode & OB_MODE_WEIGHT_PAINT) {
mesh_octree_table(NULL, NULL, NULL, 'e');
mesh_mirrtopo_table(NULL, 'e');
}
+#endif
}
else if (obedit->type==OB_ARMATURE) {
ED_armature_from_edit(obedit);
@@ -373,7 +377,7 @@ void ED_object_exit_editmode(bContext *C, int flag)
BKE_ptcache_object_reset(scene, obedit, PTCACHE_RESET_DEPSGRAPH);
/* also flush ob recalc, doesn't take much overhead, but used for particles */
- DAG_id_flush_update(&obedit->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_OB|OB_RECALC_DATA);
if(flag & EM_DO_UNDO)
ED_undo_push(C, "Editmode");
@@ -435,7 +439,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
- if(me->pv) mesh_pmv_off(ob, me);
+ if(me->pv) mesh_pmv_off(me);
ok= 1;
scene->obedit= ob; // context sees this
@@ -462,7 +466,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
scene->obedit= ob;
ED_armature_to_edit(ob);
/* to ensure all goes in restposition and without striding */
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL); // XXX: should this be OB_RECALC_DATA?
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME); // XXX: should this be OB_RECALC_DATA?
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_ARMATURE, scene);
}
@@ -496,7 +500,7 @@ void ED_object_enter_editmode(bContext *C, int flag)
}
if(ok) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
scene->obedit= NULL; // XXX for context
@@ -508,12 +512,12 @@ void ED_object_enter_editmode(bContext *C, int flag)
if(flag & EM_WAITCURSOR) waitcursor(0);
}
-static int editmode_toggle_exec(bContext *C, wmOperator *op)
+static int editmode_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
if(!CTX_data_edit_object(C))
ED_object_enter_editmode(C, EM_WAITCURSOR);
else
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
+ ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* had EM_DO_UNDO but op flag calls undo too [#24685] */
return OPERATOR_FINISHED;
}
@@ -526,7 +530,10 @@ static int editmode_toggle_poll(bContext *C)
if(ELEM(NULL, ob, ob->data) || ((ID *)ob->data)->lib)
return 0;
- return ob && (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
+ if (ob->restrictflag & OB_RESTRICT_VIEW)
+ return 0;
+
+ return (ob->type == OB_MESH || ob->type == OB_ARMATURE ||
ob->type == OB_FONT || ob->type == OB_MBALL ||
ob->type == OB_LATTICE || ob->type == OB_SURF ||
ob->type == OB_CURVE);
@@ -551,7 +558,7 @@ void OBJECT_OT_editmode_toggle(wmOperatorType *ot)
/* *************************** */
-static int posemode_exec(bContext *C, wmOperator *op)
+static int posemode_exec(bContext *C, wmOperator *UNUSED(op))
{
Base *base= CTX_data_active_base(C);
@@ -583,20 +590,11 @@ void OBJECT_OT_posemode_toggle(wmOperatorType *ot)
ot->poll= ED_operator_object_active_editable;
/* flag */
- ot->flag= OPTYPE_REGISTER;
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* *********************** */
-void check_editmode(int type)
-{
- Object *obedit= NULL; // XXX
-
- if (obedit==NULL || obedit->type==type) return;
-
-// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO); /* freedata, and undo */
-}
-
#if 0
// XXX should be in view3d?
@@ -721,7 +719,7 @@ static void spot_interactive(Object *ob, int mode)
}
#endif
-void special_editmenu(Scene *scene, View3D *v3d)
+static void special_editmenu(Scene *scene, View3D *v3d)
{
// XXX static short numcuts= 2;
Object *ob= OBACT;
@@ -740,9 +738,9 @@ void special_editmenu(Scene *scene, View3D *v3d)
MTFace *tface;
MFace *mface;
int a;
-
- if(me==0 || me->mtface==0) return;
-
+
+ if(me==NULL || me->mtface==NULL) return;
+
nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5| TwoSide%x6|Clr Tex%x7| Shared%x8| Light%x9| Invisible%x10| Collision%x11| TwoSide%x12");
tface= me->mtface;
@@ -764,7 +762,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
tface->mode |= TF_TWOSIDE; break;
case 7:
tface->mode &= ~TF_TEX;
- tface->tpage= 0;
+ tface->tpage= NULL;
break;
case 8:
tface->mode &= ~TF_SHAREDCOL; break;
@@ -779,19 +777,19 @@ void special_editmenu(Scene *scene, View3D *v3d)
}
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if(ob->mode & OB_MODE_VERTEX_PAINT) {
Mesh *me= get_mesh(ob);
- if(me==0 || (me->mcol==NULL && me->mtface==NULL) ) return;
+ if(me==NULL || (me->mcol==NULL && me->mtface==NULL) ) return;
nr= pupmenu("Specials%t|Shared VertexCol%x1");
if(nr==1) {
// XXX do_shared_vertexcol(me);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
else if(ob->mode & OB_MODE_WEIGHT_PAINT) {
@@ -838,7 +836,7 @@ void special_editmenu(Scene *scene, View3D *v3d)
break;
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
if(nr>0) waitcursor(0);
#endif
@@ -1054,7 +1052,7 @@ static void copymenu_modifiers(Main *bmain, Scene *scene, View3D *v3d, Object *o
Base *base;
int i, event;
char str[512];
- char *errorstr= NULL;
+ const char *errorstr= NULL;
strcpy(str, "Copy Modifiers %t");
@@ -1080,13 +1078,13 @@ static void copymenu_modifiers(Main *bmain, Scene *scene, View3D *v3d, Object *o
for (base= FIRSTBASE; base; base= base->next) {
if(base->object != ob) {
if(TESTBASELIB(v3d, base)) {
- ModifierData *md;
base->object->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
if (base->object->type==ob->type) {
/* copy all */
if (event==NUM_MODIFIER_TYPES) {
+ ModifierData *md;
object_free_modifiers(base->object);
for (md=ob->modifiers.first; md; md=md->next) {
@@ -1196,7 +1194,7 @@ static void copy_texture_space(Object *to, Object *ob)
}
-void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
+static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
{
Object *ob;
Base *base;
@@ -1237,9 +1235,9 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
else if(event==2) { /* rot */
VECCOPY(base->object->rot, ob->rot);
VECCOPY(base->object->drot, ob->drot);
- /* Quats arnt used yet */
- /*VECCOPY(base->object->quat, ob->quat);
- VECCOPY(base->object->dquat, ob->dquat);*/
+
+ QUATCOPY(base->object->quat, ob->quat);
+ QUATCOPY(base->object->dquat, ob->dquat);
}
else if(event==3) { /* size */
VECCOPY(base->object->size, ob->size);
@@ -1325,7 +1323,7 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
BKE_text_to_curve(scene, base->object, 0); /* needed? */
- strcpy(cu1->family, cu->family);
+ BLI_strncpy(cu1->family, cu->family, sizeof(cu1->family));
base->object->recalc |= OB_RECALC_DATA;
}
@@ -1444,7 +1442,7 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
DAG_ids_flush_update(bmain, 0);
}
-void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d)
+static void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d)
{
Object *ob;
short event;
@@ -1498,6 +1496,39 @@ void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d)
copy_attr(bmain, scene, v3d, event);
}
+/* ******************* force field toggle operator ***************** */
+
+static int forcefield_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob->pd == NULL)
+ ob->pd = object_add_collision_fields(PFIELD_FORCE);
+
+ if(ob->pd->forcefield == 0)
+ ob->pd->forcefield = PFIELD_FORCE;
+ else
+ ob->pd->forcefield = 0;
+
+ return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_forcefield_toggle(wmOperatorType *ot)
+{
+
+ /* identifiers */
+ ot->name= "Toggle Force Field";
+ ot->description = "Toggle object's force field";
+ ot->idname= "OBJECT_OT_forcefield_toggle";
+
+ /* api callbacks */
+ ot->exec= forcefield_toggle_exec;
+ ot->poll= ED_operator_object_active_editable;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ********************************************** */
/* Motion Paths */
@@ -1527,7 +1558,7 @@ void ED_objects_recalculate_paths(bContext *C, Scene *scene)
/* For the object with pose/action: create path curves for selected bones
* This recalculates the WHOLE path within the pchan->pathsf and pchan->pathef range
*/
-static int object_calculate_paths_exec (bContext *C, wmOperator *op)
+static int object_calculate_paths_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -1567,7 +1598,7 @@ void OBJECT_OT_paths_calculate (wmOperatorType *ot)
/* --------- */
/* for the object with pose/action: clear path curves for selected bones only */
-void ED_objects_clear_paths(bContext *C, Scene *scene)
+void ED_objects_clear_paths(bContext *C)
{
/* loop over objects in scene */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
@@ -1582,12 +1613,10 @@ void ED_objects_clear_paths(bContext *C, Scene *scene)
}
/* operator callback for this */
-static int object_clear_paths_exec (bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
-
+static int object_clear_paths_exec (bContext *C, wmOperator *UNUSED(op))
+{
/* use the backend function for this */
- ED_objects_clear_paths(C, scene);
+ ED_objects_clear_paths(C);
/* notifiers for updates */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
@@ -1625,7 +1654,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
if(ob->type==OB_MESH) {
mesh_set_smooth_flag(ob, !clear);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
done= 1;
@@ -1638,7 +1667,7 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
else nu->flag &= ~ME_SMOOTH;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
done= 1;
@@ -1684,7 +1713,7 @@ void OBJECT_OT_shade_smooth(wmOperatorType *ot)
/* ********************** */
-void image_aspect(Scene *scene, View3D *v3d)
+static void image_aspect(Scene *scene, View3D *v3d)
{
/* all selected objects with an image map: scale in image aspect */
Base *base;
@@ -1730,7 +1759,7 @@ void image_aspect(Scene *scene, View3D *v3d)
else ob->size[1]= ob->size[0]*y/x;
done= 1;
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
if(done) break;
@@ -1743,7 +1772,7 @@ void image_aspect(Scene *scene, View3D *v3d)
}
-int vergbaseco(const void *a1, const void *a2)
+static int vergbaseco(const void *a1, const void *a2)
{
Base **x1, **x2;
@@ -1759,7 +1788,7 @@ int vergbaseco(const void *a1, const void *a2)
}
-void auto_timeoffs(Scene *scene, View3D *v3d)
+static void auto_timeoffs(Scene *scene, View3D *v3d)
{
Base *base, **basesort, **bs;
float start, delta;
@@ -1800,7 +1829,7 @@ void auto_timeoffs(Scene *scene, View3D *v3d)
}
-void ofs_timeoffs(Scene *scene, View3D *v3d)
+static void ofs_timeoffs(Scene *scene, View3D *v3d)
{
float offset=0.0f;
@@ -1809,7 +1838,7 @@ void ofs_timeoffs(Scene *scene, View3D *v3d)
// XXX if(fbutton(&offset, -10000.0f, 10000.0f, 10, 10, "Offset")==0) return;
/* make array of all bases, xco yco (screen) */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ CTX_DATA_BEGIN(evil_C, Object*, ob, selected_editable_objects) {
ob->sf += offset;
if (ob->sf < -MAXFRAMEF) ob->sf = -MAXFRAMEF;
else if (ob->sf > MAXFRAMEF) ob->sf = MAXFRAMEF;
@@ -1819,20 +1848,20 @@ void ofs_timeoffs(Scene *scene, View3D *v3d)
}
-void rand_timeoffs(Scene *scene, View3D *v3d)
+static void rand_timeoffs(Scene *scene, View3D *v3d)
{
Base *base;
- float rand=0.0f;
+ float rand_ofs=0.0f;
if(BASACT==0 || v3d==NULL) return;
-// XXX if(fbutton(&rand, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
+// XXX if(fbutton(&rand_ofs, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
- rand *= 2;
+ rand_ofs *= 2;
for(base= FIRSTBASE; base; base= base->next) {
if(TESTBASELIB(v3d, base)) {
- base->object->sf += (BLI_drand()-0.5) * rand;
+ base->object->sf += (BLI_drand()-0.5) * rand_ofs;
if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF;
else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF;
}
@@ -1840,7 +1869,7 @@ void rand_timeoffs(Scene *scene, View3D *v3d)
}
-static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
EnumPropertyItem *input = object_mode_items;
EnumPropertyItem *item= NULL;
@@ -1892,7 +1921,7 @@ static const char *object_mode_op_string(int mode)
/* checks the mode to be set is compatible with the object
* should be made into a generic function */
-static int object_mode_set_compat(bContext *C, wmOperator *op, Object *ob)
+static int object_mode_set_compat(bContext *UNUSED(C), wmOperator *op, Object *ob)
{
ObjectMode mode = RNA_enum_get(op->ptr, "mode");
@@ -2006,7 +2035,7 @@ void ED_object_toggle_modes(bContext *C, int mode)
/************************ Game Properties ***********************/
-static int game_property_new(bContext *C, wmOperator *op)
+static int game_property_new(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
bProperty *prop;
@@ -2089,7 +2118,7 @@ static EnumPropertyItem game_properties_copy_operations[] ={
static EnumPropertyItem gameprops_items[]= {
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= ED_object_active_context(C);
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -2171,7 +2200,7 @@ void OBJECT_OT_game_property_copy(wmOperatorType *ot)
ot->prop=prop;
}
-static int game_property_clear_exec(bContext *C, wmOperator *op)
+static int game_property_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
free_properties(&ob_iter->prop);
@@ -2197,35 +2226,34 @@ void OBJECT_OT_game_property_clear(wmOperatorType *ot)
/************************ Copy Logic Bricks ***********************/
-static int logicbricks_copy_exec(bContext *C, wmOperator *op)
+static int logicbricks_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob=ED_object_active_context(C);
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
if(ob != ob_iter) {
- if (ob->data != ob_iter->data){
- /* first: free all logic */
- free_sensors(&ob_iter->sensors);
- unlink_controllers(&ob_iter->controllers);
- free_controllers(&ob_iter->controllers);
- unlink_actuators(&ob_iter->actuators);
- free_actuators(&ob_iter->actuators);
-
- /* now copy it, this also works without logicbricks! */
- clear_sca_new_poins_ob(ob);
- copy_sensors(&ob_iter->sensors, &ob->sensors);
- copy_controllers(&ob_iter->controllers, &ob->controllers);
- copy_actuators(&ob_iter->actuators, &ob->actuators);
- set_sca_new_poins_ob(ob_iter);
-
- /* some menu settings */
- ob_iter->scavisflag= ob->scavisflag;
- ob_iter->scaflag= ob->scaflag;
-
- /* set the initial state */
- ob_iter->state= ob->state;
- ob_iter->init_state= ob->init_state;
- }
+ /* first: free all logic */
+ free_sensors(&ob_iter->sensors);
+ unlink_controllers(&ob_iter->controllers);
+ free_controllers(&ob_iter->controllers);
+ unlink_actuators(&ob_iter->actuators);
+ free_actuators(&ob_iter->actuators);
+
+ /* now copy it, this also works without logicbricks! */
+ clear_sca_new_poins_ob(ob);
+ copy_sensors(&ob_iter->sensors, &ob->sensors);
+ copy_controllers(&ob_iter->controllers, &ob->controllers);
+ copy_actuators(&ob_iter->actuators, &ob->actuators);
+ set_sca_new_poins_ob(ob_iter);
+
+ /* some menu settings */
+ ob_iter->scavisflag= ob->scavisflag;
+ ob_iter->scaflag= ob->scaflag;
+
+ /* set the initial state */
+ ob_iter->state= ob->state;
+ ob_iter->init_state= ob->init_state;
+
if(ob_iter->totcol==ob->totcol) {
ob_iter->actcol= ob->actcol;
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob_iter);
diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c
index f000485466f..fa78c7f052f 100644
--- a/source/blender/editors/object/object_group.c
+++ b/source/blender/editors/object/object_group.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,8 +29,8 @@
#include <string.h>
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_group_types.h"
#include "DNA_object_types.h"
@@ -96,7 +96,7 @@ void GROUP_OT_objects_add_active(wmOperatorType *ot)
/* api callbacks */
ot->exec= objects_add_active_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -143,13 +143,13 @@ void GROUP_OT_objects_remove_active(wmOperatorType *ot)
/* api callbacks */
ot->exec= objects_remove_active_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int group_objects_remove_exec(bContext *C, wmOperator *op)
+static int group_objects_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -177,7 +177,7 @@ void GROUP_OT_objects_remove(wmOperatorType *ot)
/* api callbacks */
ot->exec= group_objects_remove_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -214,7 +214,7 @@ void GROUP_OT_create(wmOperatorType *ot)
/* api callbacks */
ot->exec= group_create_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -224,7 +224,7 @@ void GROUP_OT_create(wmOperatorType *ot)
/****************** properties window operators *********************/
-static int group_add_exec(bContext *C, wmOperator *op)
+static int group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -293,7 +293,7 @@ void OBJECT_OT_group_link(wmOperatorType *ot)
ot->prop= prop;
}
-static int group_remove_exec(bContext *C, wmOperator *op)
+static int group_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 3db44660269..aeb26035722 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "BLI_editVert.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_lattice_types.h"
@@ -450,7 +451,7 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o
hmd->indexar= indexar;
copy_v3_v3(hmd->cent, cent);
hmd->totindex= tot;
- BLI_strncpy(hmd->name, name, 32);
+ BLI_strncpy(hmd->name, name, sizeof(hmd->name));
/* matrix calculus */
/* vert x (obmat x hook->imat) x hook->obmat x ob->imat */
@@ -507,7 +508,7 @@ void OBJECT_OT_hook_add_selobj(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_add_hook_newob_exec(bContext *C, wmOperator *op)
+static int object_add_hook_newob_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -554,13 +555,13 @@ static int object_hook_remove_exec(bContext *C, wmOperator *op)
BLI_remlink(&ob->modifiers, (ModifierData *)hmd);
modifier_free((ModifierData *)hmd);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob = CTX_data_edit_object(C);
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -649,7 +650,7 @@ static int object_hook_reset_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
@@ -705,7 +706,7 @@ static int object_hook_recenter_exec(bContext *C, wmOperator *op)
sub_v3_v3v3(hmd->cent, scene->cursor, ob->obmat[3]);
mul_m3_v3(imat, hmd->cent);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
@@ -768,7 +769,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op)
hmd->indexar= indexar;
hmd->totindex= tot;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index ed75c4060a2..8cb30cbe56c 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -84,6 +84,7 @@ void OBJECT_OT_shade_smooth(struct wmOperatorType *ot);
void OBJECT_OT_shade_flat(struct wmOperatorType *ot);
void OBJECT_OT_paths_calculate(struct wmOperatorType *ot);
void OBJECT_OT_paths_clear(struct wmOperatorType *ot);
+void OBJECT_OT_forcefield_toggle(struct wmOperatorType *ot);
void OBJECT_OT_game_property_new(struct wmOperatorType *ot);
void OBJECT_OT_game_property_remove(struct wmOperatorType *ot);
@@ -151,6 +152,7 @@ void OBJECT_OT_modifier_copy(struct wmOperatorType *ot);
void OBJECT_OT_multires_subdivide(struct wmOperatorType *ot);
void OBJECT_OT_multires_reshape(struct wmOperatorType *ot);
void OBJECT_OT_multires_higher_levels_delete(struct wmOperatorType *ot);
+void OBJECT_OT_multires_base_apply(struct wmOperatorType *ot);
void OBJECT_OT_multires_external_save(struct wmOperatorType *ot);
void OBJECT_OT_multires_external_pack(struct wmOperatorType *ot);
void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c
index 5997ff96f83..97794e18e4d 100644
--- a/source/blender/editors/object/object_lattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
#include "DNA_lattice_types.h"
@@ -46,8 +49,8 @@
#include "BKE_lattice.h"
#include "BKE_mesh.h"
-#include "BLI_listbase.h"
-
+#include "ED_lattice.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_util.h"
@@ -85,8 +88,6 @@ void make_editLatt(Object *obedit)
free_editLatt(obedit);
- lt= obedit->data;
-
actkey= ob_get_keyblock(obedit);
if(actkey)
key_to_latt(actkey, lt);
@@ -155,7 +156,7 @@ void load_editLatt(Object *obedit)
}
if(editlt->dvert) {
- int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
copy_dverts(lt->dvert, editlt->dvert, tot);
@@ -182,7 +183,7 @@ void ED_setflagsLatt(Object *obedit, int flag)
}
}
-int select_all_exec(bContext *C, wmOperator *op)
+static int select_all_exec(bContext *C, wmOperator *op)
{
Object *obedit= CTX_data_edit_object(C);
Lattice *lt= obedit->data;
@@ -249,7 +250,7 @@ void LATTICE_OT_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
-int make_regular_poll(bContext *C)
+static int make_regular_poll(bContext *C)
{
Object *ob;
@@ -259,7 +260,7 @@ int make_regular_poll(bContext *C)
return (ob && ob->type==OB_LATTICE);
}
-int make_regular_exec(bContext *C, wmOperator *op)
+static int make_regular_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
Lattice *lt;
@@ -274,7 +275,7 @@ int make_regular_exec(bContext *C, wmOperator *op)
resizelattice(lt, lt->pntsu, lt->pntsv, lt->pntsw, NULL);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -414,7 +415,7 @@ static void *get_editlatt(bContext *C)
}
/* and this is all the undo system needs to know */
-void undo_push_lattice(bContext *C, char *name)
+void undo_push_lattice(bContext *C, const char *name)
{
undo_editmode_push(C, name, get_editlatt, free_undoLatt, undoLatt_to_editLatt, editLatt_to_undoLatt, validate_undoLatt);
}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 4d70ae34e52..95771c9e5f9 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,6 +42,8 @@
#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BLI_path_util.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_curve.h"
#include "BKE_context.h"
@@ -60,6 +62,7 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_softbody.h"
+#include "BKE_tessmesh.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -68,6 +71,7 @@
#include "ED_armature.h"
#include "ED_object.h"
#include "ED_screen.h"
+#include "ED_mesh.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -76,18 +80,24 @@
/******************************** API ****************************/
-ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, char *name, int type)
+ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
{
ModifierData *md=NULL, *new_md=NULL;
ModifierTypeInfo *mti = modifierType_getInfo(type);
-
+
+ /* only geometry objects should be able to get modifiers [#25291] */
+ if(!ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) {
+ BKE_reportf(reports, RPT_WARNING, "Modifiers cannot be added to Object '%s'", ob->id.name+2);
+ return NULL;
+ }
+
if(mti->flags&eModifierTypeFlag_Single) {
if(modifiers_findByType(ob, type)) {
BKE_report(reports, RPT_WARNING, "Only one modifier of this type allowed.");
return NULL;
}
}
-
+
if(type == eModifierType_ParticleSystem) {
/* don't need to worry about the new modifier's name, since that is set to the number
* of particle systems which shouldn't have too many duplicates
@@ -132,9 +142,12 @@ ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *sc
}
else if(type == eModifierType_Surface)
DAG_scene_sort(bmain, scene);
+ else if(type == eModifierType_Multires)
+ /* set totlvl from existing MDISPS layer if object already had it */
+ multiresModifier_set_levels_from_disps((MultiresModifierData *)new_md, ob);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return new_md;
}
@@ -189,14 +202,27 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob
else if(md->type == eModifierType_Multires) {
Mesh *me= ob->data;
- CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
- CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ if(me->edit_btmesh) {
+ BMEditMesh *em= me->edit_btmesh;
+ /* CustomData_external_remove is used here only to mark layer as non-external
+ for further free-ing, so zero element count looks safer than em->totface */
+ CustomData_external_remove(&em->bm->ldata, &me->id, CD_MDISPS, 0);
+ BM_free_data_layer(em, &em->bm->ldata, CD_MDISPS);
+ } else {
+ CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop);
+ CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop);
+ }
+ }
+
+ if(ELEM(md->type, eModifierType_Softbody, eModifierType_Cloth) &&
+ ob->particlesystem.first == NULL) {
+ ob->mode &= ~OB_MODE_PARTICLE_EDIT;
}
BLI_remlink(&ob->modifiers, md);
modifier_free(md);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* sorting has to be done after the update so that dynamic systems can react properly */
if(sort_depsgraph)
@@ -247,7 +273,7 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
return 1;
}
-int ED_object_modifier_convert(ReportList *reports, Main *bmain, Scene *scene, Object *ob, ModifierData *md)
+int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *scene, Object *ob, ModifierData *md)
{
Object *obn;
ParticleSystem *psys;
@@ -373,7 +399,7 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M
BKE_report(reports, RPT_ERROR, "Only deforming modifiers can be applied to Shapes");
return 0;
}
- mesh_pmv_off(ob, me);
+ mesh_pmv_off(me);
dm = mesh_create_derived_for_modifier(scene, ob, md);
if (!dm) {
@@ -421,7 +447,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
return 0;
}
- mesh_pmv_off(ob, me);
+ mesh_pmv_off(me);
/* Multires: ensure that recent sculpting is applied */
if(md->type == eModifierType_Multires)
@@ -442,6 +468,11 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
DM_to_mesh(dm, me);
dm->release(dm);
+
+ if(md->type == eModifierType_Multires) {
+ CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface);
+ CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface);
+ }
}
}
else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
@@ -463,7 +494,7 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob,
MEM_freeN(vertexCos);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
BKE_report(reports, RPT_ERROR, "Cannot apply modifier for this object type");
@@ -514,7 +545,7 @@ int ED_object_modifier_apply(ReportList *reports, Scene *scene, Object *ob, Modi
return 1;
}
-int ED_object_modifier_copy(ReportList *reports, Object *ob, ModifierData *md)
+int ED_object_modifier_copy(ReportList *UNUSED(reports), Object *ob, ModifierData *md)
{
ModifierData *nmd;
@@ -543,7 +574,7 @@ static int modifier_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= ED_object_active_context(C);
EnumPropertyItem *item= NULL, *md_item;
@@ -601,20 +632,21 @@ void OBJECT_OT_modifier_add(wmOperatorType *ot)
/************************ generic functions for operators using mod names and data context *********************/
-static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type)
+static int edit_modifier_poll_generic(bContext *C, StructRNA *rna_type, int obtype_flag)
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", rna_type);
Object *ob= (ptr.id.data)?ptr.id.data:ED_object_active_context(C);
if (!ob || ob->id.lib) return 0;
- if (ptr.data && ((ID*)ptr.id.data)->lib) return 0;
+ if (obtype_flag && ((1<<ob->type) & obtype_flag)==0) return 0;
+ if (ptr.id.data && ((ID*)ptr.id.data)->lib) return 0;
return 1;
}
static int edit_modifier_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_Modifier);
+ return edit_modifier_poll_generic(C, &RNA_Modifier, 0);
}
static void edit_modifier_properties(wmOperatorType *ot)
@@ -639,7 +671,7 @@ static int edit_modifier_invoke_properties(bContext *C, wmOperator *op)
return 0;
}
-static ModifierData *edit_modifier_property_get(bContext *C, wmOperator *op, Object *ob, int type)
+static ModifierData *edit_modifier_property_get(wmOperator *op, Object *ob, int type)
{
char modifier_name[32];
ModifierData *md;
@@ -660,17 +692,24 @@ static int modifier_remove_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
+ int mode_orig = ob->mode;
if(!ob || !md || !ED_object_modifier_remove(op->reports, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ /* if cloth/softbody was removed, particle mode could be cleared */
+ if(mode_orig & OB_MODE_PARTICLE_EDIT)
+ if((ob->mode & OB_MODE_PARTICLE_EDIT)==0)
+ if(scene->basact && scene->basact->object==ob)
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
return OPERATOR_FINISHED;
}
-static int modifier_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_remove_exec(C, op);
@@ -698,18 +737,18 @@ void OBJECT_OT_modifier_remove(wmOperatorType *ot)
static int modifier_move_up_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_move_up(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_move_up_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_move_up_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_move_up_exec(C, op);
@@ -737,18 +776,18 @@ void OBJECT_OT_modifier_move_up(wmOperatorType *ot)
static int modifier_move_down_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_move_down(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_move_down_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_move_down_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_move_down_exec(C, op);
@@ -777,20 +816,20 @@ static int modifier_apply_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
int apply_as= RNA_enum_get(op->ptr, "apply_as");
if(!ob || !md || !ED_object_modifier_apply(op->reports, scene, ob, md, apply_as)) {
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_apply_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_apply_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_apply_exec(C, op);
@@ -827,18 +866,18 @@ static int modifier_convert_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_convert(op->reports, bmain, scene, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_convert_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_convert_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_convert_exec(C, op);
@@ -866,18 +905,18 @@ void OBJECT_OT_modifier_convert(wmOperatorType *ot)
static int modifier_copy_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ModifierData *md = edit_modifier_property_get(C, op, ob, 0);
+ ModifierData *md = edit_modifier_property_get(op, ob, 0);
if(!ob || !md || !ED_object_modifier_copy(op->reports, ob, md))
return OPERATOR_CANCELLED;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int modifier_copy_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int modifier_copy_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return modifier_copy_exec(C, op);
@@ -904,13 +943,13 @@ void OBJECT_OT_modifier_copy(wmOperatorType *ot)
static int multires_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_MultiresModifier);
+ return edit_modifier_poll_generic(C, &RNA_MultiresModifier, (1<<OB_MESH));
}
static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -922,7 +961,7 @@ static int multires_higher_levels_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_higher_levels_delete_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_higher_levels_delete_exec(C, op);
@@ -949,20 +988,20 @@ void OBJECT_OT_multires_higher_levels_delete(wmOperatorType *ot)
static int multires_subdivide_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
multiresModifier_subdivide(mmd, ob, 0, mmd->simple);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int multires_subdivide_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_subdivide_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_subdivide_exec(C, op);
@@ -991,7 +1030,7 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
{
Object *ob= ED_object_active_context(C), *secondob= NULL;
Scene *scene= CTX_data_scene(C);
- MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1014,13 +1053,13 @@ static int multires_reshape_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int multires_reshape_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_reshape_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return multires_reshape_exec(C, op);
@@ -1061,7 +1100,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "filepath", path);
if(relative)
- BLI_path_rel(path, G.sce);
+ BLI_path_rel(path, G.main->name);
CustomData_external_add(&me->fdata, &me->id, CD_MDISPS, me->totface, path);
CustomData_external_write(&me->fdata, &me->id, CD_MASK_MESH, me->totface, 0);
@@ -1069,7 +1108,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Object *ob = ED_object_active_context(C);
MultiresModifierData *mmd;
@@ -1079,7 +1118,7 @@ static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *e
if (!edit_modifier_invoke_properties(C, op))
return OPERATOR_CANCELLED;
- mmd = (MultiresModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Multires);
+ mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1123,7 +1162,7 @@ void OBJECT_OT_multires_external_save(wmOperatorType *ot)
/****************** multires pack operator *********************/
-static int multires_external_pack_exec(bContext *C, wmOperator *op)
+static int multires_external_pack_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob = ED_object_active_context(C);
Mesh *me= ob->data;
@@ -1150,18 +1189,60 @@ void OBJECT_OT_multires_external_pack(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/********************* multires apply base ***********************/
+static int multires_base_apply_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ MultiresModifierData *mmd = (MultiresModifierData *)edit_modifier_property_get(op, ob, eModifierType_Multires);
+
+ if (!mmd)
+ return OPERATOR_CANCELLED;
+
+ multiresModifier_base_apply(mmd, ob);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int multires_base_apply_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ if (edit_modifier_invoke_properties(C, op))
+ return multires_base_apply_exec(C, op);
+ else
+ return OPERATOR_CANCELLED;
+}
+
+
+void OBJECT_OT_multires_base_apply(wmOperatorType *ot)
+{
+ ot->name= "Multires Apply Base";
+ ot->description= "Modify the base mesh to conform to the displaced mesh";
+ ot->idname= "OBJECT_OT_multires_base_apply";
+
+ ot->poll= multires_poll;
+ ot->invoke= multires_base_apply_invoke;
+ ot->exec= multires_base_apply_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ edit_modifier_properties(ot);
+}
+
+
/************************ mdef bind operator *********************/
static int meshdeform_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier);
+ return edit_modifier_poll_generic(C, &RNA_MeshDeformModifier, (1<<OB_MESH));
}
static int meshdeform_bind_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob = ED_object_active_context(C);
- MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_MeshDeform);
+ MeshDeformModifierData *mmd = (MeshDeformModifierData *)edit_modifier_property_get(op, ob, eModifierType_MeshDeform);
if (!mmd)
return OPERATOR_CANCELLED;
@@ -1181,7 +1262,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op)
mmd->totcagevert= 0;
mmd->totinfluence= 0;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
}
else {
@@ -1213,7 +1294,7 @@ static int meshdeform_bind_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int meshdeform_bind_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int meshdeform_bind_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return meshdeform_bind_exec(C, op);
@@ -1242,26 +1323,26 @@ void OBJECT_OT_meshdeform_bind(wmOperatorType *ot)
static int explode_poll(bContext *C)
{
- return edit_modifier_poll_generic(C, &RNA_ExplodeModifier);
+ return edit_modifier_poll_generic(C, &RNA_ExplodeModifier, 0);
}
static int explode_refresh_exec(bContext *C, wmOperator *op)
{
Object *ob = ED_object_active_context(C);
- ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(C, op, ob, eModifierType_Explode);
+ ExplodeModifierData *emd = (ExplodeModifierData *)edit_modifier_property_get(op, ob, eModifierType_Explode);
if (!emd)
return OPERATOR_CANCELLED;
emd->flag |= eExplodeFlag_CalcFaces;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob);
return OPERATOR_FINISHED;
}
-static int explode_refresh_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int explode_refresh_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_modifier_invoke_properties(C, op))
return explode_refresh_exec(C, op);
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 6e9e8eeb5e5..6f854872aad 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,12 +29,12 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -77,6 +77,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_shade_flat);
WM_operatortype_append(OBJECT_OT_paths_calculate);
WM_operatortype_append(OBJECT_OT_paths_clear);
+ WM_operatortype_append(OBJECT_OT_forcefield_toggle);
WM_operatortype_append(OBJECT_OT_parent_set);
WM_operatortype_append(OBJECT_OT_parent_no_inverse_set);
@@ -134,6 +135,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_multires_subdivide);
WM_operatortype_append(OBJECT_OT_multires_reshape);
WM_operatortype_append(OBJECT_OT_multires_higher_levels_delete);
+ WM_operatortype_append(OBJECT_OT_multires_base_apply);
WM_operatortype_append(OBJECT_OT_multires_external_save);
WM_operatortype_append(OBJECT_OT_multires_external_pack);
WM_operatortype_append(OBJECT_OT_meshdeform_bind);
@@ -378,7 +380,7 @@ void ED_keymap_object(wmKeyConfig *keyconf)
ED_object_generic_keymap(keyconf, keymap, 2);
}
-void ED_object_generic_keymap(struct wmKeyConfig *keyconf, struct wmKeyMap *keymap, int do_pet)
+void ED_object_generic_keymap(struct wmKeyConfig *UNUSED(keyconf), struct wmKeyMap *keymap, int do_pet)
{
wmKeyMapItem *kmi;
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index d23ea57e0e7..b3b1d9123aa 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,6 +47,7 @@
#include "BLI_editVert.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_animsys.h"
@@ -57,6 +58,7 @@
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_global.h"
+#include "BKE_fcurve.h"
#include "BKE_lattice.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -83,6 +85,7 @@
#include "ED_armature.h"
#include "ED_curve.h"
+#include "ED_keyframing.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_view3d.h"
@@ -191,7 +194,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if(ob != obedit) {
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
par= obedit->parent;
while(par) {
@@ -257,7 +260,7 @@ void OBJECT_OT_vertex_parent_set(wmOperatorType *ot)
static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
{
Scene *scene= CTX_data_scene(C);
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_active_context(C);
/* sanity checks */
if (!scene || scene->id.lib || !ob)
@@ -274,10 +277,9 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
else if (ob->id.lib) {
uiPopupMenu *pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION);
uiLayout *layout= uiPupMenuLayout(pup);
- PointerRNA props_ptr;
/* create operator menu item with relevant properties filled in */
- props_ptr= uiItemFullO(layout, op->idname, op->type->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ uiItemFullO(layout, op->idname, op->type->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* present the menu and be done... */
uiPupMenuEnd(C, pup);
@@ -294,7 +296,7 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int make_proxy_exec (bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
- Object *ob, *gob= CTX_data_active_object(C);
+ Object *ob, *gob= ED_object_active_context(C);
GroupObject *go;
Scene *scene= CTX_data_scene(C);
@@ -338,7 +340,7 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
/* depsgraph flushes are needed for the new data */
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&newob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&newob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, newob);
}
else {
@@ -350,19 +352,17 @@ static int make_proxy_exec (bContext *C, wmOperator *op)
}
/* Generic itemf's for operators that take library args */
-static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem item_tmp= {0}, *item= NULL;
int totitem= 0;
int i= 0;
- Object *ob= CTX_data_active_object(C);
+ Object *ob= ED_object_active_context(C);
GroupObject *go;
if(!ob || !ob->dup_group)
return DummyRNA_DEFAULT_items;
- memset(&item_tmp, 0, sizeof(item_tmp));
-
/* find the object to affect */
for (go= ob->dup_group->gobject.first; go; go= go->next) {
item_tmp.identifier= item_tmp.name= go->ob->id.name+2;
@@ -418,17 +418,20 @@ static int parent_clear_exec(bContext *C, wmOperator *op)
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ if(ob->parent == NULL)
+ continue;
+
if(type == 0) {
ob->parent= NULL;
}
else if(type == 1) {
ob->parent= NULL;
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, FALSE);
}
else if(type == 2)
unit_m4(ob->parentinv);
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
}
CTX_DATA_END;
@@ -520,7 +523,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *par= CTX_data_active_object(C);
+ Object *par= ED_object_active_context(C);
bPoseChannel *pchan= NULL;
int partype= RNA_enum_get(op->ptr, "type");
int pararm= ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO);
@@ -540,6 +543,17 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
else cu->flag |= CU_FOLLOW;
+ /* if follow, add F-Curve for ctime (i.e. "eval_time") so that path-follow works */
+ if(partype == PAR_FOLLOW) {
+ /* get or create F-Curve */
+ bAction *act = verify_adt_action(&cu->id, 1);
+ FCurve *fcu = verify_fcurve(act, NULL, "eval_time", 0, 1);
+
+ /* setup dummy 'generator' modifier here to get 1-1 correspondance still working */
+ if (!fcu->bezt && !fcu->fpt && !fcu->modifiers.first)
+ add_fmodifier(&fcu->modifiers, FMODIFIER_TYPE_GENERATOR);
+ }
+
/* fall back on regular parenting now (for follow only) */
if(partype == PAR_FOLLOW)
partype= PAR_OBJECT;
@@ -554,7 +568,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
}
- /* context itterator */
+ /* context iterator */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if(ob!=par) {
@@ -566,8 +580,8 @@ static int parent_set_exec(bContext *C, wmOperator *op)
Object workob;
/* apply transformation of previous parenting */
- object_apply_mat4(ob, ob->obmat);
-
+ /* object_apply_mat4(ob, ob->obmat); */ /* removed because of bug [#23577] */
+
/* set the parent (except for follow-path constraint option) */
if(partype != PAR_PATH_CONST)
ob->parent= par;
@@ -635,12 +649,14 @@ static int parent_set_exec(bContext *C, wmOperator *op)
}
else if(pararm && ob->type==OB_MESH && par->type == OB_ARMATURE) {
if(partype == PAR_ARMATURE_NAME)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_NAME, 0);
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_NAME, 0);
else if(partype == PAR_ARMATURE_ENVELOPE)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE, 0);
- else if(partype == PAR_ARMATURE_AUTO)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO, 0);
-
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_ENVELOPE, 0);
+ else if(partype == PAR_ARMATURE_AUTO) {
+ WM_cursor_wait(1);
+ create_vgroups_from_armature(op->reports, scene, ob, par, ARM_GROUPS_AUTO, 0);
+ WM_cursor_wait(0);
+ }
/* get corrected inverse */
ob->partype= PAROBJECT;
what_does_parent(scene, ob, &workob);
@@ -662,14 +678,15 @@ static int parent_set_exec(bContext *C, wmOperator *op)
DAG_scene_sort(bmain, scene);
DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ WM_event_add_notifier(C, NC_OBJECT|ND_PARENT, NULL);
return OPERATOR_FINISHED;
}
-static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
- Object *ob= CTX_data_active_object(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", 0);
+ Object *ob= ED_object_active_context(C);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -709,7 +726,7 @@ void OBJECT_OT_parent_set(wmOperatorType *ot)
ot->invoke= parent_set_invoke;
ot->exec= parent_set_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_object_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -722,11 +739,11 @@ void OBJECT_OT_parent_set(wmOperatorType *ot)
static int parent_noinv_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
- Object *par= CTX_data_active_object(C);
+ Object *par= ED_object_active_context(C);
par->recalc |= OB_RECALC_OB;
- /* context itterator */
+ /* context iterator */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
if (ob != par) {
if (test_parent_loop(par, ob)) {
@@ -773,7 +790,7 @@ void OBJECT_OT_parent_no_inverse_set(wmOperatorType *ot)
/************************ Clear Slow Parent Operator *********************/
-static int object_slow_parent_clear_exec(bContext *C, wmOperator *op)
+static int object_slow_parent_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -815,7 +832,7 @@ void OBJECT_OT_slow_parent_clear(wmOperatorType *ot)
/********************** Make Slow Parent Operator *********************/
-static int object_slow_parent_set_exec(bContext *C, wmOperator *op)
+static int object_slow_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -876,7 +893,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
/* remove track-object for old track */
ob->track= NULL;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* also remove all tracking constraints */
for (con= ob->constraints.last; con; con= pcon) {
@@ -886,7 +903,7 @@ static int object_track_clear_exec(bContext *C, wmOperator *op)
}
if(type == 1)
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, TRUE);
}
CTX_DATA_END;
@@ -908,7 +925,7 @@ void OBJECT_OT_track_clear(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= object_track_clear_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -929,7 +946,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Object *obact= CTX_data_active_object(C);
+ Object *obact= ED_object_active_context(C);
int type= RNA_enum_get(op->ptr, "type");
@@ -943,7 +960,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA)
@@ -962,7 +979,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA) {
@@ -983,7 +1000,7 @@ static int track_set_exec(bContext *C, wmOperator *op)
data = con->data;
data->tar = obact;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* Lamp and Camera track differently by default */
if (ob->type == OB_LAMP || ob->type == OB_CAMERA) {
@@ -1013,7 +1030,7 @@ void OBJECT_OT_track_set(wmOperatorType *ot)
ot->invoke= WM_menu_invoke;
ot->exec= track_set_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1030,7 +1047,8 @@ static unsigned int move_to_layer_init(bContext *C, wmOperator *op)
unsigned int lay= 0;
if(!RNA_property_is_set(op->ptr, "layers")) {
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
lay |= base->lay;
}
CTX_DATA_END;
@@ -1078,8 +1096,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
if(v3d && v3d->localvd) {
/* now we can move out of localview. */
- // XXX if (!okee("Move from localview")) return;
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
lay= base->lay & ~v3d->lay;
base->lay= lay;
base->object->lay= lay;
@@ -1091,7 +1109,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
}
else {
/* normal non localview operation */
- CTX_DATA_BEGIN(C, Base*, base, selected_editable_bases) {
+ /* note: layers are set in bases, library objects work for this */
+ CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
/* upper byte is used for local view */
local= base->lay & 0xFF000000;
base->lay= lay + local;
@@ -1105,7 +1124,9 @@ static int move_to_layer_exec(bContext *C, wmOperator *op)
/* warning, active object may be hidden now */
- WM_event_add_notifier(C, NC_SCENE|NC_OBJECT|ND_DRAW, scene); /* is NC_SCENE needed ? */
+ WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
+
WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene);
DAG_scene_sort(bmain, scene);
@@ -1123,7 +1144,7 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot)
/* api callbacks */
ot->invoke= move_to_layer_invoke;
ot->exec= move_to_layer_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1134,9 +1155,9 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot)
/************************** Link to Scene Operator *****************************/
-void link_to_scene(Main *bmain, unsigned short nr)
-{
#if 0
+static void link_to_scene(Main *UNUSED(bmain), unsigned short UNUSED(nr))
+{
Scene *sce= (Scene*) BLI_findlink(&bmain->scene, G.curscreen->scenenr-1);
Base *base, *nbase;
@@ -1152,8 +1173,8 @@ void link_to_scene(Main *bmain, unsigned short nr)
id_us_plus((ID *)base->object);
}
}
-#endif
}
+#endif
static int make_links_scene_exec(bContext *C, wmOperator *op)
{
@@ -1232,7 +1253,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
ID *id;
int a;
- ob= CTX_data_active_object(C);
+ ob= ED_object_active_context(C);
CTX_DATA_BEGIN(C, Object*, obt, selected_editable_objects) {
if(ob != obt) {
@@ -1259,8 +1280,8 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
}
break;
case MAKE_LINKS_ANIMDATA:
- BKE_copy_animdata_id((ID *)obt, (ID *)ob);
- BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data);
+ BKE_copy_animdata_id((ID *)obt, (ID *)ob, FALSE);
+ BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data, FALSE);
break;
case MAKE_LINKS_DUPLIGROUP:
obt->dup_group= ob->dup_group;
@@ -1271,7 +1292,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
break;
case MAKE_LINKS_MODIFIERS:
object_link_modifiers(obt, ob);
- obt->recalc |= OB_RECALC_ALL;
+ obt->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
break;
}
}
@@ -1279,6 +1300,8 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
+ DAG_scene_sort(bmain, CTX_data_scene(C));
+
DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
return OPERATOR_FINISHED;
@@ -1295,6 +1318,7 @@ void OBJECT_OT_make_links_scene(wmOperatorType *ot)
ot->idname= "OBJECT_OT_make_links_scene";
/* api callbacks */
+ ot->invoke= WM_enum_search_invoke;
ot->exec= make_links_scene_exec;
/* better not run the poll check */
@@ -1317,8 +1341,6 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
{MAKE_LINKS_MODIFIERS, "MODIFIERS", 0, "Modifiers", ""},
{0, NULL, 0, NULL, NULL}};
- PropertyRNA *prop;
-
/* identifiers */
ot->name= "Link Data";
ot->description = "Make links from the active object to other selected objects";
@@ -1326,24 +1348,24 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
/* api callbacks */
ot->exec= make_links_data_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- prop= RNA_def_enum(ot->srna, "type", make_links_items, 0, "Type", "");
+ ot->prop= RNA_def_enum(ot->srna, "type", make_links_items, 0, "Type", "");
}
/**************************** Make Single User ********************************/
-static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
+static void single_object_users__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), Object **obpoin)
{
ID_NEW(*obpoin);
}
-void single_object_users(Scene *scene, View3D *v3d, int flag)
+static void single_object_users(Scene *scene, View3D *v3d, int flag)
{
Base *base;
Object *ob, *obn;
@@ -1354,6 +1376,11 @@ void single_object_users(Scene *scene, View3D *v3d, int flag)
for(base= FIRSTBASE; base; base= base->next) {
ob= base->object;
+ /* newid may still have some trash from Outliner tree building,
+ * so clear that first to avoid errors [#26002]
+ */
+ ob->id.newid = NULL;
+
if( (base->flag & flag)==flag ) {
if(ob->id.lib==NULL && ob->id.us>1) {
/* base gets copy of object */
@@ -1387,7 +1414,7 @@ void single_object_users(Scene *scene, View3D *v3d, int flag)
set_sca_new_poins();
}
-void new_id_matar(Material **matar, int totcol)
+static void new_id_matar(Material **matar, int totcol)
{
ID *id;
int a;
@@ -1409,7 +1436,7 @@ void new_id_matar(Material **matar, int totcol)
}
}
-void single_obdata_users(Main *bmain, Scene *scene, int flag)
+static void single_obdata_users(Main *bmain, Scene *scene, int flag)
{
Object *ob;
Lamp *la;
@@ -1425,17 +1452,17 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
if(ob->id.lib==NULL && (base->flag & flag)==flag ) {
id= ob->data;
- if(id && id->us>1 && id->lib==0) {
+ if(id && id->us>1 && id->lib==NULL) {
ob->recalc= OB_RECALC_DATA;
+ BKE_copy_animdata_id_action(id);
+
switch(ob->type) {
case OB_LAMP:
- if(id && id->us>1 && id->lib==NULL) {
- ob->data= la= copy_lamp(ob->data);
- for(a=0; a<MAX_MTEX; a++) {
- if(la->mtex[a]) {
- ID_NEW(la->mtex[a]->object);
- }
+ ob->data= la= copy_lamp(ob->data);
+ for(a=0; a<MAX_MTEX; a++) {
+ if(la->mtex[a]) {
+ ID_NEW(la->mtex[a]->object);
}
}
break;
@@ -1443,7 +1470,8 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
ob->data= copy_camera(ob->data);
break;
case OB_MESH:
- me= ob->data= copy_mesh(ob->data);
+ ob->data= copy_mesh(ob->data);
+ //me= ob->data;
//if(me && me->key)
// ipo_idnew(me->key->ipo); /* drivers */
break;
@@ -1476,52 +1504,6 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
}
-#if 0 // XXX old animation system
- id= (ID *)ob->action;
- if (id && id->us>1 && id->lib==NULL){
- if(id->newid){
- ob->action= (bAction *)id->newid;
- id_us_plus(id->newid);
- }
- else {
- ob->action= copy_action(ob->action);
- id->us--;
- id->newid=(ID *)ob->action;
- }
- }
- id= (ID *)ob->ipo;
- if(id && id->us>1 && id->lib==NULL) {
- if(id->newid) {
- ob->ipo= (Ipo *)id->newid;
- id_us_plus(id->newid);
- }
- else {
- ob->ipo= copy_ipo(ob->ipo);
- id->us--;
- id->newid= (ID *)ob->ipo;
- }
- ipo_idnew(ob->ipo); /* drivers */
- }
- /* other ipos */
- switch(ob->type) {
- case OB_LAMP:
- la= ob->data;
- if(la->ipo && la->ipo->id.us>1) {
- la->ipo->id.us--;
- la->ipo= copy_ipo(la->ipo);
- ipo_idnew(la->ipo); /* drivers */
- }
- break;
- case OB_CAMERA:
- cam= ob->data;
- if(cam->ipo && cam->ipo->id.us>1) {
- cam->ipo->id.us--;
- cam->ipo= copy_ipo(cam->ipo);
- ipo_idnew(cam->ipo); /* drivers */
- }
- break;
- }
-#endif // XXX old animation system
}
}
@@ -1532,27 +1514,18 @@ void single_obdata_users(Main *bmain, Scene *scene, int flag)
}
}
-void single_ipo_users(Scene *scene, int flag)
+static void single_object_action_users(Scene *scene, int flag)
{
-#if 0 // XXX old animation system
Object *ob;
Base *base;
- ID *id;
for(base= FIRSTBASE; base; base= base->next) {
ob= base->object;
if(ob->id.lib==NULL && (flag==0 || (base->flag & SELECT)) ) {
ob->recalc= OB_RECALC_DATA;
-
- id= (ID *)ob->ipo;
- if(id && id->us>1 && id->lib==NULL) {
- ob->ipo= copy_ipo(ob->ipo);
- id->us--;
- ipo_idnew(ob->ipo); /* drivers */
- }
+ BKE_copy_animdata_id_action(&ob->id);
}
}
-#endif // XXX old animation system
}
static void single_mat_users(Scene *scene, int flag, int do_textures)
@@ -1574,17 +1547,11 @@ static void single_mat_users(Scene *scene, int flag, int do_textures)
if(ma->id.us>1) {
man= copy_material(ma);
-
+ BKE_copy_animdata_id_action(&man->id);
+
man->id.us= 0;
assign_material(ob, man, a);
-
-#if 0 // XXX old animation system
- if(ma->ipo) {
- man->ipo= copy_ipo(ma->ipo);
- ma->ipo->id.us--;
- ipo_idnew(ma->ipo); /* drivers */
- }
-#endif // XXX old animation system
+
if(do_textures) {
for(b=0; b<MAX_MTEX; b++) {
if(ma->mtex[b] && ma->mtex[b]->tex) {
@@ -1603,7 +1570,7 @@ static void single_mat_users(Scene *scene, int flag, int do_textures)
}
}
-void do_single_tex_user(Tex **from)
+static void do_single_tex_user(Tex **from)
{
Tex *tex, *texn;
@@ -1617,13 +1584,14 @@ void do_single_tex_user(Tex **from)
}
else if(tex->id.us>1) {
texn= copy_texture(tex);
+ BKE_copy_animdata_id_action(&texn->id);
tex->id.newid= (ID *)texn;
tex->id.us--;
*from= texn;
}
}
-void single_tex_users_expand(Main *bmain)
+static void single_tex_users_expand(Main *bmain)
{
/* only when 'parent' blocks are LIB_NEW */
Material *ma;
@@ -1737,7 +1705,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
Material *ma, ***matarar;
Lamp *la;
ID *id;
- int a, b, mode= RNA_enum_get(op->ptr, "type");;
+ int a, b, mode= RNA_enum_get(op->ptr, "type");
if(mode==3) {
all_local(NULL, 0); /* NULL is all libs */
@@ -1768,6 +1736,16 @@ static int make_local_exec(bContext *C, wmOperator *op)
id_make_local(id, 0);
adt= BKE_animdata_from_id(id);
if(adt) BKE_animdata_make_local(adt);
+
+ /* tag indirect data direct */
+ matarar= (Material ***)give_matarar(ob);
+ if(matarar) {
+ for(a=0; a<ob->totcol; a++) {
+ ma= (*matarar)[a];
+ if(ma)
+ id_lib_extern(&ma->id);
+ }
+ }
}
for(psys=ob->particlesystem.first; psys; psys=psys->next)
@@ -1828,7 +1806,7 @@ void OBJECT_OT_make_local(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= make_local_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1857,7 +1835,7 @@ static int make_single_user_exec(bContext *C, wmOperator *op)
single_mat_users(scene, flag, TRUE);
if(RNA_boolean_get(op->ptr, "animation"))
- single_ipo_users(scene, flag);
+ single_object_action_users(scene, flag);
clear_id_newpoins();
@@ -1880,19 +1858,19 @@ void OBJECT_OT_make_single_user(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= make_single_user_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- ot->prop= RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
+ ot->prop= RNA_def_enum(ot->srna, "type", type_items, SELECT, "Type", "");
RNA_def_boolean(ot->srna, "object", 0, "Object", "Make single user objects");
RNA_def_boolean(ot->srna, "obdata", 0, "Object Data", "Make single user object data");
RNA_def_boolean(ot->srna, "material", 0, "Materials", "Make materials local to each datablock");
RNA_def_boolean(ot->srna, "texture", 0, "Textures", "Make textures local to each material");
- RNA_def_boolean(ot->srna, "animation", 0, "Animation Data", "Make animation data local to each object");
+ RNA_def_boolean(ot->srna, "animation", 0, "Object Animation", "Make animation data local to each object");
}
static int drop_named_material_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -1927,7 +1905,7 @@ void OBJECT_OT_drop_named_material(wmOperatorType *ot)
/* api callbacks */
ot->invoke= drop_named_material_invoke;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_UNDO;
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index fa9a97f4e74..7a92b16020e 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,6 +42,7 @@
#include "BLI_listbase.h"
#include "BLI_rand.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_group.h"
@@ -51,11 +52,13 @@
#include "BKE_property.h"
#include "BKE_report.h"
#include "BKE_scene.h"
+#include "BKE_library.h"
#include "BKE_deform.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -72,7 +75,8 @@
* this takes into account the 'restrict selection in 3d view' flag.
* deselect works always, the restriction just prevents selection */
-/* Note: send a NC_SCENE|ND_OB_SELECT notifier yourself! */
+/* Note: send a NC_SCENE|ND_OB_SELECT notifier yourself! (or
+ * or a NC_SCENE|ND_OB_VISIBLE in case of visibility toggling */
void ED_base_object_select(Base *base, short mode)
{
@@ -147,7 +151,7 @@ void OBJECT_OT_select_by_type(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_by_type_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -329,7 +333,7 @@ void OBJECT_OT_select_linked(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_linked_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -429,7 +433,7 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in
}
/* build the menu. */
- pup= uiPupMenuBegin(C, "Select Group", 0);
+ pup= uiPupMenuBegin(C, "Select Group", ICON_NULL);
layout= uiPupMenuLayout(pup);
for (i=0; i<group_count; i++) {
@@ -617,7 +621,7 @@ void OBJECT_OT_select_grouped(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_menu_invoke;
ot->exec= object_select_grouped_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -659,14 +663,14 @@ static int object_select_by_layer_exec(bContext *C, wmOperator *op)
void OBJECT_OT_select_by_layer(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select by layer";
+ ot->name= "Select by Layer";
ot->description = "Select all visible objects on a layer";
ot->idname= "OBJECT_OT_select_by_layer";
/* api callbacks */
/*ot->invoke = XXX - need a int grid popup*/
ot->exec= object_select_by_layer_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -678,7 +682,7 @@ void OBJECT_OT_select_by_layer(wmOperatorType *ot)
/************************** Select Inverse *************************/
-static int object_select_inverse_exec(bContext *C, wmOperator *op)
+static int object_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
if (base->flag & SELECT)
@@ -704,7 +708,7 @@ void OBJECT_OT_select_inverse(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_inverse_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -765,7 +769,7 @@ void OBJECT_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_all_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -808,13 +812,13 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "select same group";
+ ot->name= "Select Same Group";
ot->description = "Select object in the same group";
ot->idname= "OBJECT_OT_select_same_group";
/* api callbacks */
ot->exec= object_select_same_group_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -825,21 +829,26 @@ void OBJECT_OT_select_same_group(wmOperatorType *ot)
/**************************** Select Mirror ****************************/
static int object_select_mirror_exec(bContext *C, wmOperator *op)
{
+ Scene *scene= CTX_data_scene(C);
short extend;
extend= RNA_boolean_get(op->ptr, "extend");
CTX_DATA_BEGIN(C, Base*, primbase, selected_bases) {
-
char tmpname[32];
+
flip_side_name(tmpname, primbase->object->id.name+2, TRUE);
+
+ if(strcmp(tmpname, primbase->object->id.name+2)!=0) { /* names differ */
+ Object *ob= (Object *)find_id("OB", tmpname);
+ if(ob) {
+ Base *secbase= object_in_scene(ob, scene);
- CTX_DATA_BEGIN(C, Base*, secbase, visible_bases) {
- if(!strcmp(secbase->object->id.name+2, tmpname)) {
- ED_base_object_select(secbase, BA_SELECT);
+ if(secbase) {
+ ED_base_object_select(secbase, BA_SELECT);
+ }
}
}
- CTX_DATA_END;
if (extend == 0) ED_base_object_select(primbase, BA_DESELECT);
@@ -862,7 +871,7 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_mirror_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -878,8 +887,11 @@ static int object_select_name_exec(bContext *C, wmOperator *op)
short changed = 0;
if(!extend) {
- CTX_DATA_BEGIN(C, Base*, base, visible_bases) {
- ED_base_object_select(base, BA_DESELECT);
+ CTX_DATA_BEGIN(C, Base*, base, selectable_bases) {
+ if((base->flag & SELECT) == 0) {
+ ED_base_object_select(base, BA_DESELECT);
+ changed= 1;
+ }
}
CTX_DATA_END;
}
@@ -916,7 +928,7 @@ void OBJECT_OT_select_name(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_select_name_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -964,7 +976,7 @@ void OBJECT_OT_select_random(wmOperatorType *ot)
/* api callbacks */
/*ot->invoke= object_select_random_invoke XXX - need a number popup ;*/
ot->exec = object_select_random_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index 7b1ab933e28..e3c3a4372c1 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_key_types.h"
@@ -53,6 +54,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_curve.h"
#include "BLO_sys_types.h" // for intptr_t support
@@ -100,8 +102,25 @@ static int ED_object_shape_key_remove(bContext *C, Object *ob)
BLI_remlink(&key->block, kb);
key->totkey--;
- if(key->refkey== kb)
+ if(key->refkey== kb) {
key->refkey= key->block.first;
+
+ if(key->refkey) {
+ /* apply new basis key on original data */
+ switch(ob->type) {
+ case OB_MESH:
+ key_to_mesh(key->refkey, ob->data);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ key_to_curve(key->refkey, ob->data, BKE_curve_nurbs(ob->data));
+ break;
+ case OB_LATTICE:
+ key_to_latt(key->refkey, ob->data);
+ break;
+ }
+ }
+ }
if(kb->data) MEM_freeN(kb->data);
MEM_freeN(kb);
@@ -137,13 +156,13 @@ static int ED_object_shape_key_remove(bContext *C, Object *ob)
free_libblock_us(&(bmain->key), key);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return 1;
}
-static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
+static int object_shape_key_mirror(bContext *C, Object *ob)
{
KeyBlock *kb;
Key *key;
@@ -165,10 +184,10 @@ static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
Mesh *me= ob->data;
MVert *mv;
- mesh_octree_table(ob, NULL, NULL, 's');
+ //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 's');
for(i1=0, mv=me->mvert; i1<me->totvert; i1++, mv++) {
- i2= mesh_get_x_mirror_vert(ob, i1);
+ i2= -1; //BMESH_TODO mesh_get_x_mirror_vert(ob, i1);
if(i2==i1) {
fp1= ((float *)kb->data) + i1*3;
fp1[0] = -fp1[0];
@@ -191,14 +210,14 @@ static int ED_object_shape_key_mirror(bContext *C, Scene *scene, Object *ob)
}
}
- mesh_octree_table(ob, NULL, NULL, 'e');
+ //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 'e');
}
/* todo, other types? */
MEM_freeN(tag_elem);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return 1;
@@ -235,8 +254,8 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Shape Key";
- ot->name= "Add shape key to the object.";
ot->idname= "OBJECT_OT_shape_key_add";
+ ot->description= "Add shape key to the object";
/* api callbacks */
ot->poll= shape_key_mode_poll;
@@ -249,7 +268,7 @@ void OBJECT_OT_shape_key_add(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "from_mix", 1, "From Mix", "Create the new shape key from the existing mix of keys.");
}
-static int shape_key_remove_exec(bContext *C, wmOperator *op)
+static int shape_key_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -263,8 +282,8 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Remove Shape Key";
- ot->name= "Remove shape key from the object.";
ot->idname= "OBJECT_OT_shape_key_remove";
+ ot->description= "Remove shape key from the object";
/* api callbacks */
ot->poll= shape_key_mode_poll;
@@ -274,7 +293,7 @@ void OBJECT_OT_shape_key_remove(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int shape_key_clear_exec(bContext *C, wmOperator *op)
+static int shape_key_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Key *key= ob_get_key(ob);
@@ -286,7 +305,7 @@ static int shape_key_clear_exec(bContext *C, wmOperator *op)
for(kb=key->block.first; kb; kb=kb->next)
kb->curval= 0.0f;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
@@ -307,12 +326,11 @@ void OBJECT_OT_shape_key_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int shape_key_mirror_exec(bContext *C, wmOperator *op)
+static int shape_key_mirror_exec(bContext *C, wmOperator *UNUSED(op))
{
- Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
- if(!ED_object_shape_key_mirror(C, scene, ob))
+ if(!object_shape_key_mirror(C, ob))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -375,7 +393,7 @@ static int shape_key_move_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 0b52b84a7f9..92040cdbf03 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,6 +39,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_curve.h"
@@ -48,6 +49,7 @@
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_tessmesh.h"
+#include "BKE_multires.h"
#include "RNA_define.h"
#include "RNA_access.h"
@@ -65,29 +67,171 @@
/*************************** Clear Transformation ****************************/
-static int object_location_clear_exec(bContext *C, wmOperator *op)
+/* clear location of object */
+static void object_clear_loc(Object *ob)
+{
+ /* clear location if not locked */
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
+ ob->loc[0]= ob->dloc[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
+ ob->loc[1]= ob->dloc[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
+ ob->loc[2]= ob->dloc[2]= 0.0f;
+}
+
+/* clear rotation of object */
+static void object_clear_rot(Object *ob)
+{
+ /* clear rotations that aren't locked */
+ if (ob->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
+ if (ob->protectflag & OB_LOCK_ROT4D) {
+ /* perform clamping on a component by component basis */
+ if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ if ((ob->protectflag & OB_LOCK_ROTW) == 0)
+ ob->rotAngle= ob->drotAngle= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->rotAxis[0]= ob->drotAxis[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->rotAxis[1]= ob->drotAxis[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->rotAxis[2]= ob->drotAxis[2]= 0.0f;
+
+ /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
+ if (IS_EQ(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQ(ob->rotAxis[1], ob->rotAxis[2]))
+ ob->rotAxis[1] = 1.0f;
+ if (IS_EQ(ob->drotAxis[0], ob->drotAxis[1]) && IS_EQ(ob->drotAxis[1], ob->drotAxis[2]))
+ ob->drotAxis[1]= 1.0f;
+ }
+ else if (ob->rotmode == ROT_MODE_QUAT) {
+ if ((ob->protectflag & OB_LOCK_ROTW) == 0)
+ ob->quat[0]= ob->dquat[0]= 1.0f;
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->quat[1]= ob->dquat[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->quat[2]= ob->dquat[2]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->quat[3]= ob->dquat[3]= 0.0f;
+
+ // TODO: does this quat need normalising now?
+ }
+ else {
+ /* the flag may have been set for the other modes, so just ignore the extra flag... */
+ if ((ob->protectflag & OB_LOCK_ROTX) == 0)
+ ob->rot[0]= ob->drot[0]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTY) == 0)
+ ob->rot[1]= ob->drot[1]= 0.0f;
+ if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
+ ob->rot[2]= ob->drot[2]= 0.0f;
+ }
+ }
+ else {
+ /* perform clamping using euler form (3-components) */
+ // FIXME: deltas are not handled for these cases yet...
+ float eul[3], oldeul[3], quat1[4] = {0};
+
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ QUATCOPY(quat1, ob->quat);
+ quat_to_eul(oldeul, ob->quat);
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_eulO(oldeul, EULER_ORDER_DEFAULT, ob->rotAxis, ob->rotAngle);
+ }
+ else {
+ copy_v3_v3(oldeul, ob->rot);
+ }
+
+ eul[0]= eul[1]= eul[2]= 0.0f;
+
+ if (ob->protectflag & OB_LOCK_ROTX)
+ eul[0]= oldeul[0];
+ if (ob->protectflag & OB_LOCK_ROTY)
+ eul[1]= oldeul[1];
+ if (ob->protectflag & OB_LOCK_ROTZ)
+ eul[2]= oldeul[2];
+
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ eul_to_quat(ob->quat, eul);
+ /* quaternions flip w sign to accumulate rotations correctly */
+ if ((quat1[0]<0.0f && ob->quat[0]>0.0f) || (quat1[0]>0.0f && ob->quat[0]<0.0f)) {
+ mul_qt_fl(ob->quat, -1.0f);
+ }
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ eulO_to_axis_angle(ob->rotAxis, &ob->rotAngle,eul, EULER_ORDER_DEFAULT);
+ }
+ else {
+ copy_v3_v3(ob->rot, eul);
+ }
+ }
+ } // Duplicated in source/blender/editors/armature/editarmature.c
+ else {
+ if (ob->rotmode == ROT_MODE_QUAT) {
+ unit_qt(ob->quat);
+ unit_qt(ob->dquat);
+ }
+ else if (ob->rotmode == ROT_MODE_AXISANGLE) {
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
+ unit_axis_angle(ob->drotAxis, &ob->drotAngle);
+ }
+ else {
+ zero_v3(ob->rot);
+ zero_v3(ob->drot);
+ }
+ }
+}
+
+/* clear scale of object */
+static void object_clear_scale(Object *ob)
+{
+ /* clear scale factors which are not locked */
+ if ((ob->protectflag & OB_LOCK_SCALEX)==0) {
+ ob->dsize[0]= 0.0f;
+ ob->size[0]= 1.0f;
+ }
+ if ((ob->protectflag & OB_LOCK_SCALEY)==0) {
+ ob->dsize[1]= 0.0f;
+ ob->size[1]= 1.0f;
+ }
+ if ((ob->protectflag & OB_LOCK_SCALEZ)==0) {
+ ob->dsize[2]= 0.0f;
+ ob->size[2]= 1.0f;
+ }
+}
+
+/* --------------- */
+
+/* generic exec for clear-transform operators */
+static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
+ void (*clear_func)(Object*), const char default_ksName[])
{
Main *bmain = CTX_data_main(C);
- Scene *scene = CTX_data_scene(C);
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
+ Scene *scene= CTX_data_scene(C);
+ KeyingSet *ks;
- /* clear location of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ /* sanity checks */
+ if ELEM(NULL, clear_func, default_ksName) {
+ BKE_report(op->reports, RPT_ERROR, "Programming error: missing clear transform func or Keying Set Name");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* get KeyingSet to use */
+ ks = ANIM_get_keyingset_for_autokeying(scene, default_ksName);
+
+ /* operate on selected objects only if they aren't in weight-paint mode
+ * (so that object-transform clearing won't be applied at same time as bone-clearing)
+ */
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
+ {
if (!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear location if not locked */
- if ((ob->protectflag & OB_LOCK_LOCX)==0)
- ob->loc[0]= ob->dloc[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_LOCY)==0)
- ob->loc[1]= ob->dloc[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_LOCZ)==0)
- ob->loc[2]= ob->dloc[2]= 0.0f;
-
+ /* run provided clearing function */
+ clear_func(ob);
+
/* auto keyframing */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
ListBase dsources = {NULL, NULL};
/* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
+ * 1) add datasource override for the Object
* 2) insert keyframes
* 3) free the extra info
*/
@@ -95,9 +239,10 @@ static int object_location_clear_exec(bContext *C, wmOperator *op)
ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
BLI_freelistN(&dsources);
}
+
+ /* tag for updates */
+ ob->recalc |= OB_RECALC_OB;
}
-
- ob->recalc |= OB_RECALC_OB;
}
CTX_DATA_END;
@@ -109,6 +254,14 @@ static int object_location_clear_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* --------------- */
+
+
+static int object_location_clear_exec(bContext *C, wmOperator *op)
+{
+ return object_clear_transform_generic_exec(C, op, object_clear_loc, "Location");
+}
+
void OBJECT_OT_location_clear(wmOperatorType *ot)
{
/* identifiers */
@@ -118,7 +271,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_location_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -126,130 +279,7 @@ void OBJECT_OT_location_clear(wmOperatorType *ot)
static int object_rotation_clear_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
-
- /* clear rotation of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear rotations that aren't locked */
- if (ob->protectflag & (OB_LOCK_ROTX|OB_LOCK_ROTY|OB_LOCK_ROTZ|OB_LOCK_ROTW)) {
- if (ob->protectflag & OB_LOCK_ROT4D) {
- /* perform clamping on a component by component basis */
- if (ob->rotmode == ROT_MODE_AXISANGLE) {
- if ((ob->protectflag & OB_LOCK_ROTW) == 0)
- ob->rotAngle= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->rotAxis[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->rotAxis[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->rotAxis[2]= 0.0f;
-
- /* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQ(ob->rotAxis[1], ob->rotAxis[2]))
- ob->rotAxis[1] = 1.0f;
- }
- else if (ob->rotmode == ROT_MODE_QUAT) {
- if ((ob->protectflag & OB_LOCK_ROTW) == 0)
- ob->quat[0]= 1.0f;
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->quat[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->quat[2]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->quat[3]= 0.0f;
- }
- else {
- /* the flag may have been set for the other modes, so just ignore the extra flag... */
- if ((ob->protectflag & OB_LOCK_ROTX) == 0)
- ob->rot[0]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTY) == 0)
- ob->rot[1]= 0.0f;
- if ((ob->protectflag & OB_LOCK_ROTZ) == 0)
- ob->rot[2]= 0.0f;
- }
- }
- else {
- /* perform clamping using euler form (3-components) */
- float eul[3], oldeul[3], quat1[4] = {0};
-
- if (ob->rotmode == ROT_MODE_QUAT) {
- QUATCOPY(quat1, ob->quat);
- quat_to_eul( oldeul,ob->quat);
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- axis_angle_to_eulO( oldeul, EULER_ORDER_DEFAULT,ob->rotAxis, ob->rotAngle);
- }
- else {
- copy_v3_v3(oldeul, ob->rot);
- }
-
- eul[0]= eul[1]= eul[2]= 0.0f;
-
- if (ob->protectflag & OB_LOCK_ROTX)
- eul[0]= oldeul[0];
- if (ob->protectflag & OB_LOCK_ROTY)
- eul[1]= oldeul[1];
- if (ob->protectflag & OB_LOCK_ROTZ)
- eul[2]= oldeul[2];
-
- if (ob->rotmode == ROT_MODE_QUAT) {
- eul_to_quat( ob->quat,eul);
- /* quaternions flip w sign to accumulate rotations correctly */
- if ((quat1[0]<0.0f && ob->quat[0]>0.0f) || (quat1[0]>0.0f && ob->quat[0]<0.0f)) {
- mul_qt_fl(ob->quat, -1.0f);
- }
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- eulO_to_axis_angle( ob->rotAxis, &ob->rotAngle,eul, EULER_ORDER_DEFAULT);
- }
- else {
- copy_v3_v3(ob->rot, eul);
- }
- }
- } // Duplicated in source/blender/editors/armature/editarmature.c
- else {
- if (ob->rotmode == ROT_MODE_QUAT) {
- ob->quat[1]=ob->quat[2]=ob->quat[3]= 0.0f;
- ob->quat[0]= 1.0f;
- }
- else if (ob->rotmode == ROT_MODE_AXISANGLE) {
- /* by default, make rotation of 0 radians around y-axis (roll) */
- ob->rotAxis[0]=ob->rotAxis[2]=ob->rotAngle= 0.0f;
- ob->rotAxis[1]= 1.0f;
- }
- else {
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0f;
- }
- }
-
- /* auto keyframing */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- ListBase dsources = {NULL, NULL};
-
- /* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
- * 2) insert keyframes
- * 3) free the extra info
- */
- ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL);
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- BLI_freelistN(&dsources);
- }
- }
-
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- /* this is needed so children are also updated */
- DAG_ids_flush_update(bmain, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
+ return object_clear_transform_generic_exec(C, op, object_clear_rot, "Rotation");
}
void OBJECT_OT_rotation_clear(wmOperatorType *ot)
@@ -261,7 +291,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_rotation_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -269,51 +299,7 @@ void OBJECT_OT_rotation_clear(wmOperatorType *ot)
static int object_scale_clear_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
-
- /* clear scales of selected objects if not in weight-paint mode */
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* clear scale factors which are not locked */
- if ((ob->protectflag & OB_LOCK_SCALEX)==0) {
- ob->dsize[0]= 0.0f;
- ob->size[0]= 1.0f;
- }
- if ((ob->protectflag & OB_LOCK_SCALEY)==0) {
- ob->dsize[1]= 0.0f;
- ob->size[1]= 1.0f;
- }
- if ((ob->protectflag & OB_LOCK_SCALEZ)==0) {
- ob->dsize[2]= 0.0f;
- ob->size[2]= 1.0f;
- }
-
- /* auto keyframing */
- if (autokeyframe_cfra_can_key(scene, &ob->id)) {
- ListBase dsources = {NULL, NULL};
-
- /* now insert the keyframe(s) using the Keying Set
- * 1) add datasource override for the PoseChannel
- * 2) insert keyframes
- * 3) free the extra info
- */
- ANIM_relative_keyingset_add_source(&dsources, &ob->id, NULL, NULL);
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- BLI_freelistN(&dsources);
- }
- }
- ob->recalc |= OB_RECALC_OB;
- }
- CTX_DATA_END;
-
- /* this is needed so children are also updated */
- DAG_ids_flush_update(bmain, 0);
-
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
-
- return OPERATOR_FINISHED;
+ return object_clear_transform_generic_exec(C, op, object_clear_scale, "Scaling");
}
void OBJECT_OT_scale_clear(wmOperatorType *ot)
@@ -325,20 +311,24 @@ void OBJECT_OT_scale_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_scale_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int object_origin_clear_exec(bContext *C, wmOperator *op)
+/* --------------- */
+
+static int object_origin_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
- float *v1, *v3, mat[3][3];
- int armature_clear= 0;
+ float *v1, *v3;
+ float mat[3][3];
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- if(ob->parent) {
+ CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects)
+ {
+ if (ob->parent) {
+ /* vectors pointed to by v1 and v3 will get modified */
v1= ob->loc;
v3= ob->parentinv[3];
@@ -350,8 +340,7 @@ static int object_origin_clear_exec(bContext *C, wmOperator *op)
}
CTX_DATA_END;
- if(armature_clear==0) /* in this case flush was done */
- DAG_ids_flush_update(bmain, 0);
+ DAG_ids_flush_update(bmain, 0);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
@@ -367,7 +356,7 @@ void OBJECT_OT_origin_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= object_origin_clear_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -385,7 +374,7 @@ static void ignore_parent_tx(Main *bmain, Scene *scene, Object *ob )
/* a change was made, adjust the children to compensate */
for(ob_child=bmain->object.first; ob_child; ob_child=ob_child->id.next) {
if(ob_child->parent == ob) {
- object_apply_mat4(ob_child, ob_child->obmat);
+ object_apply_mat4(ob_child, ob_child->obmat, TRUE, FALSE);
what_does_parent(scene, ob_child, &workob);
invert_m4_m4(ob_child->parentinv, workob.obmat);
}
@@ -452,8 +441,18 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
object_to_mat3(ob, rsmat);
else if(apply_scale)
object_scale_to_mat3(ob, rsmat);
- else if(apply_rot)
+ else if(apply_rot) {
+ float tmat[3][3], timat[3][3];
+
+ /* simple rotation matrix */
object_rot_to_mat3(ob, rsmat);
+
+ /* correct for scale, note mul_m3_m3m3 has swapped args! */
+ object_scale_to_mat3(ob, tmat);
+ invert_m3_m3(timat, tmat);
+ mul_m3_m3m3(rsmat, timat, rsmat);
+ mul_m3_m3m3(rsmat, rsmat, tmat);
+ }
else
unit_m3(rsmat);
@@ -476,6 +475,8 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
if(ob->type==OB_MESH) {
me= ob->data;
+ multiresModifier_scale_disp(scene, ob);
+
/* adjust data */
mvert= me->mvert;
for(a=0; a<me->totvert; a++, mvert++)
@@ -524,22 +525,19 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
continue;
if(apply_loc)
- ob->loc[0]= ob->loc[1]= ob->loc[2]= 0.0f;
+ zero_v3(ob->loc);
if(apply_scale)
ob->size[0]= ob->size[1]= ob->size[2]= 1.0f;
if(apply_rot) {
- ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0f;
- ob->quat[1]= ob->quat[2]= ob->quat[3]= 0.0f;
- ob->rotAxis[0]= ob->rotAxis[2]= 0.0f;
- ob->rotAngle= 0.0f;
-
- ob->quat[0]= ob->rotAxis[1]= 1.0f;
+ zero_v3(ob->rot);
+ unit_qt(ob->quat);
+ unit_axis_angle(ob->rotAxis, &ob->rotAngle);
}
where_is_object(scene, ob);
ignore_parent_tx(bmain, scene, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA);
change = 1;
}
@@ -552,16 +550,19 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
return OPERATOR_FINISHED;
}
-static int visual_transform_apply_exec(bContext *C, wmOperator *op)
+static int visual_transform_apply_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int change = 0;
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
where_is_object(scene, ob);
- object_apply_mat4(ob, ob->obmat);
+ object_apply_mat4(ob, ob->obmat, TRUE, TRUE);
where_is_object(scene, ob);
-
+
+ /* update for any children that may get moved */
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+
change = 1;
}
CTX_DATA_END;
@@ -582,7 +583,7 @@ void OBJECT_OT_visual_transform_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= visual_transform_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -602,7 +603,7 @@ void OBJECT_OT_location_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= location_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -622,7 +623,7 @@ void OBJECT_OT_scale_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= scale_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -642,7 +643,7 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= rotation_apply_exec;
- ot->poll= ED_operator_object_active_editable;
+ ot->poll= ED_operator_scene_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -650,7 +651,7 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot)
/************************ Texture Space Transform ****************************/
-void texspace_edit(Scene *scene, View3D *v3d)
+static void texspace_edit(Scene *scene, View3D *v3d)
{
Base *base;
int nr=0;
@@ -763,7 +764,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
EDBM_RecalcNormals(em);
tot_change++;
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
}
@@ -854,7 +855,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
if(obedit) {
if (centermode == GEOMETRY_TO_ORIGIN) {
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
}
break;
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 3cc0be8d640..b568edad636 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,7 @@
#include <string.h>
#include <stddef.h>
#include <math.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -46,6 +47,7 @@
#include "BLI_blenlib.h"
#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
@@ -70,6 +72,8 @@
/************************ Exported Functions **********************/
static void vgroup_remap_update_users(Object *ob, int *map);
+static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *defgroup);
+static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg);
static Lattice *vgroup_edit_lattice(Object *ob)
{
@@ -81,7 +85,17 @@ static Lattice *vgroup_edit_lattice(Object *ob)
return NULL;
}
-bDeformGroup *ED_vgroup_add_name(Object *ob, char *name)
+int ED_vgroup_object_is_edit_mode(Object *ob)
+{
+ if(ob->type == OB_MESH)
+ return (((Mesh*)ob->data)->edit_btmesh != NULL);
+ else if(ob->type == OB_LATTICE)
+ return (((Lattice*)ob->data)->editlatt != NULL);
+
+ return 0;
+}
+
+bDeformGroup *ED_vgroup_add_name(Object *ob, const char *name)
{
bDeformGroup *defgroup;
@@ -105,6 +119,25 @@ bDeformGroup *ED_vgroup_add(Object *ob)
return ED_vgroup_add_name(ob, "Group");
}
+void ED_vgroup_delete(Object *ob, bDeformGroup *defgroup)
+{
+ bDeformGroup *dg = (bDeformGroup *)ob->defbase.first;
+
+ while (dg) {
+ if (dg == defgroup)
+ break;
+ dg = dg->next;
+ }
+
+ if (dg == NULL)
+ return;
+
+ if(ED_vgroup_object_is_edit_mode(ob))
+ vgroup_delete_edit_mode(ob, dg);
+ else
+ vgroup_delete_object_mode(ob, dg);
+}
+
void ED_vgroup_data_create(ID *id)
{
/* create deform verts */
@@ -119,7 +152,7 @@ void ED_vgroup_data_create(ID *id)
}
}
-int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
+static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
{
if(id) {
switch(GS(id->name)) {
@@ -275,7 +308,7 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
/* for mesh in object mode
lattice can be in editmode */
-void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
+static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
{
/* This routine removes the vertex from the deform
* group with number def_nr.
@@ -343,7 +376,7 @@ void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
/* for Mesh in Object mode */
/* allows editmode for Lattice */
-void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode)
+static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode)
{
/* add the vert to the deform group with the
* specified number
@@ -463,23 +496,10 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)
/* This routine removes the vertex from the specified
* deform group.
*/
-
- int def_nr;
-
- /* if the object is NULL abort
- */
- if(!ob)
+ const int def_nr= defgroup_find_index(ob, dg);
+ if(def_nr < 0)
return;
- /* get the deform number that cooresponds
- * to this deform group, and abort if it
- * can not be found.
- */
- def_nr = defgroup_find_index(ob, dg);
- if(def_nr < 0) return;
-
- /* call another routine to do the work
- */
ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
}
@@ -512,7 +532,7 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
}
if(dvert==NULL)
- return 0.0f;
+ return -1;
dvert += vertnum;
@@ -520,22 +540,22 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
if(dvert->dw[i].def_nr == def_nr)
return dvert->dw[i].weight;
- return 0.0f;
+ return -1;
}
float ED_vgroup_vert_weight(Object *ob, bDeformGroup *dg, int vertnum)
{
int def_nr;
- if(!ob) return 0.0f;
+ if(!ob) return -1;
def_nr = defgroup_find_index(ob, dg);
- if(def_nr < 0) return 0.0f;
+ if(def_nr < 0) return -1;
return get_vert_def_nr(ob, def_nr, vertnum);
}
-void ED_vgroup_select_by_name(Object *ob, char *name)
+void ED_vgroup_select_by_name(Object *ob, const char *name)
{ /* note: ob->actdef==0 signals on painting to create a new one, if a bone in posemode is selected */
ob->actdef= defgroup_name_index(ob, name) + 1;
}
@@ -560,8 +580,10 @@ static void vgroup_select_verts(Object *ob, int select)
if(dvert && dvert->totweight){
for(i=0; i<dvert->totweight; i++){
if(dvert->dw[i].def_nr == (ob->actdef-1)){
- BM_Select(em->bm, eve, select);
- break;
+ if (!BM_TestHFlag(eve, BM_HIDDEN)) {
+ BM_Select(em->bm, eve, select);
+ break;
+ }
}
}
}
@@ -597,7 +619,7 @@ static void vgroup_select_verts(Object *ob, int select)
static void vgroup_duplicate(Object *ob)
{
bDeformGroup *dg, *cdg;
- char name[32], s[32];
+ char name[sizeof(dg->name)];
MDeformWeight *org, *cpy;
MDeformVert *dvert, **dvert_array=NULL;
int i, idg, icdg, dvert_tot=0;
@@ -606,26 +628,17 @@ static void vgroup_duplicate(Object *ob)
if(!dg)
return;
- if(strstr(dg->name, "_copy")) {
- BLI_strncpy(name, dg->name, 32); /* will be renamed _copy.001... etc */
+ if(!strstr(dg->name, "_copy")) {
+ BLI_snprintf(name, sizeof(name), "%s_copy", dg->name);
}
else {
- BLI_snprintf(name, 32, "%s_copy", dg->name);
- while(defgroup_find_name(ob, name)) {
- if((strlen(name) + 6) > 32) {
- if (G.f & G_DEBUG)
- printf("Internal error: the name for the new vertex group is > 32 characters");
- return;
- }
- strcpy(s, name);
- BLI_snprintf(name, 32, "%s_copy", s);
- }
- }
+ BLI_snprintf(name, sizeof(name), "%s", dg->name);
+ }
cdg = defgroup_duplicate(dg);
strcpy(cdg->name, name);
defgroup_unique_name(cdg, ob);
-
+
BLI_addtail(&ob->defbase, cdg);
idg = (ob->actdef-1);
@@ -1106,61 +1119,53 @@ static void vgroup_delete_update_users(Object *ob, int id)
}
-static void vgroup_delete_object_mode(Object *ob)
+static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg)
{
- bDeformGroup *dg;
- MDeformVert *dvert, *dvert_array=NULL;
+ MDeformVert *dvert_array=NULL;
int i, e, dvert_tot=0;
-
- dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
- if(!dg)
- return;
+ const int dg_index= BLI_findindex(&ob->defbase, dg);
+
+ assert(dg_index > -1);
ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
if(dvert_array) {
- for(i = 0; i < dvert_tot; i++) {
- dvert = dvert_array + i;
- if(dvert) {
- if(defvert_find_index(dvert, (ob->actdef-1)))
- ED_vgroup_vert_remove(ob, dg, i);
- }
+ MDeformVert *dvert;
+ for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
+ ED_vgroup_vert_remove(ob, dg, i); /* ok if the dg isnt in this dvert, will continue silently */
}
- for(i = 0; i < dvert_tot; i++) {
- dvert = dvert_array+i;
- if(dvert) {
- for(e = 0; e < dvert->totweight; e++) {
- if(dvert->dw[e].def_nr > (ob->actdef-1))
- dvert->dw[e].def_nr--;
+ for(i= 0, dvert= dvert_array; i < dvert_tot; i++, dvert++) {
+ for(e = 0; e < dvert->totweight; e++) {
+ if(dvert->dw[e].def_nr > dg_index) {
+ dvert->dw[e].def_nr--;
}
}
}
}
- vgroup_delete_update_users(ob, ob->actdef);
+ vgroup_delete_update_users(ob, dg_index + 1);
- /* Update the active deform index if necessary */
- if(ob->actdef == BLI_countlist(&ob->defbase))
- ob->actdef--;
-
/* Remove the group */
BLI_freelinkN(&ob->defbase, dg);
+
+ /* Update the active deform index if necessary */
+ if(ob->actdef > dg_index)
+ ob->actdef--;
+ if(ob->actdef < 1 && ob->defbase.first)
+ ob->actdef= 1;
+
}
/* only in editmode */
/* removes from active defgroup, if allverts==0 only selected vertices */
-static void vgroup_active_remove_verts(Object *ob, int allverts)
+static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGroup *dg)
{
BMVert *eve;
MDeformVert *dvert;
MDeformWeight *newdw;
- bDeformGroup *dg, *eg;
+ bDeformGroup *eg;
int i;
- dg=BLI_findlink(&ob->defbase, ob->actdef-1);
- if(!dg)
- return;
-
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
BMEditMesh *em = me->edit_btmesh;
@@ -1210,20 +1215,15 @@ static void vgroup_active_remove_verts(Object *ob, int allverts)
}
}
-static void vgroup_delete_edit_mode(Object *ob)
+static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
{
- bDeformGroup *defgroup;
int i;
+ const int dg_index= BLI_findindex(&ob->defbase, dg);
- if(!ob->actdef)
- return;
-
- defgroup = BLI_findlink(&ob->defbase, ob->actdef-1);
- if(!defgroup)
- return;
+ assert(dg_index > -1);
/* Make sure that no verts are using this group */
- vgroup_active_remove_verts(ob, 1);
+ vgroup_active_remove_verts(ob, TRUE, dg);
/* Make sure that any verts with higher indices are adjusted accordingly */
if(ob->type==OB_MESH) {
@@ -1238,7 +1238,7 @@ static void vgroup_delete_edit_mode(Object *ob)
if(dvert)
for(i=0; i<dvert->totweight; i++)
- if(dvert->dw[i].def_nr > (ob->actdef-1))
+ if(dvert->dw[i].def_nr > dg_index)
dvert->dw[i].def_nr--;
}
}
@@ -1252,24 +1252,26 @@ static void vgroup_delete_edit_mode(Object *ob)
tot= lt->pntsu*lt->pntsv*lt->pntsw;
for(a=0, bp= lt->def; a<tot; a++, bp++, dvert++) {
for(i=0; i<dvert->totweight; i++){
- if(dvert->dw[i].def_nr > (ob->actdef-1))
+ if(dvert->dw[i].def_nr > dg_index)
dvert->dw[i].def_nr--;
}
}
}
}
- vgroup_delete_update_users(ob, ob->actdef);
+ vgroup_delete_update_users(ob, dg_index + 1);
+
+ /* Remove the group */
+ BLI_freelinkN (&ob->defbase, dg);
/* Update the active deform index if necessary */
- if(ob->actdef==BLI_countlist(&ob->defbase))
+ if(ob->actdef > dg_index)
ob->actdef--;
-
- /* Remove the group */
- BLI_freelinkN (&ob->defbase, defgroup);
-
+ if(ob->actdef < 1 && ob->defbase.first)
+ ob->actdef= 1;
+
/* remove all dverts */
- if(ob->actdef==0) {
+ if(ob->defbase.first == NULL) {
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
@@ -1297,10 +1299,14 @@ static int vgroup_object_in_edit_mode(Object *ob)
static void vgroup_delete(Object *ob)
{
+ bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef-1);
+ if(!dg)
+ return;
+
if(vgroup_object_in_edit_mode(ob))
- vgroup_delete_edit_mode(ob);
+ vgroup_delete_edit_mode(ob, dg);
else
- vgroup_delete_object_mode(ob);
+ vgroup_delete_object_mode(ob, dg);
}
static void vgroup_delete_all(Object *ob)
@@ -1352,7 +1358,6 @@ static void vgroup_assign_verts(Object *ob, float weight)
dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if(dvert && BM_TestHFlag(eve, BM_SELECT)) {
- done=0;
/* See if this vert already has a reference to this group */
/* If so: Change its weight */
done=0;
@@ -1403,22 +1408,14 @@ static void vgroup_assign_verts(Object *ob, float weight)
/* removes from all defgroup, if allverts==0 only selected vertices */
static void vgroup_remove_verts(Object *ob, int allverts)
{
- int actdef, defCount;
-
- actdef= ob->actdef;
- defCount= BLI_countlist(&ob->defbase);
-
- if(defCount == 0)
- return;
-
/* To prevent code redundancy, we just use vgroup_active_remove_verts, but that
* only operates on the active vgroup. So we iterate through all groups, by changing
* active group index
*/
- for(ob->actdef= 1; ob->actdef <= defCount; ob->actdef++)
- vgroup_active_remove_verts(ob, allverts);
-
- ob->actdef= actdef;
+ bDeformGroup *dg;
+ for(dg= ob->defbase.first; dg; dg= dg->next) {
+ vgroup_active_remove_verts(ob, allverts, dg);
+ }
}
/********************** vertex group operators *********************/
@@ -1441,12 +1438,12 @@ static int vertex_group_poll_edit(bContext *C)
return vgroup_object_in_edit_mode(ob);
}
-static int vertex_group_add_exec(bContext *C, wmOperator *op)
+static int vertex_group_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
ED_vgroup_add(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -1476,7 +1473,7 @@ static int vertex_group_remove_exec(bContext *C, wmOperator *op)
else
vgroup_delete(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -1509,7 +1506,7 @@ static int vertex_group_assign_exec(bContext *C, wmOperator *op)
ED_vgroup_add(ob);
vgroup_assign_verts(ob, ts->vgroup_weight);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -1538,10 +1535,17 @@ static int vertex_group_remove_from_exec(bContext *C, wmOperator *op)
if(RNA_boolean_get(op->ptr, "all"))
vgroup_remove_verts(ob, 0);
- else
- vgroup_active_remove_verts(ob, 0);
+ else {
+ bDeformGroup *dg= BLI_findlink(&ob->defbase, ob->actdef - 1);
+
+ if(dg == NULL) {
+ return OPERATOR_CANCELLED;
+ }
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ vgroup_active_remove_verts(ob, FALSE, dg);
+ }
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -1564,7 +1568,7 @@ void OBJECT_OT_vertex_group_remove_from(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "all", 0, "All", "Remove from all vertex groups.");
}
-static int vertex_group_select_exec(bContext *C, wmOperator *op)
+static int vertex_group_select_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
@@ -1591,7 +1595,7 @@ void OBJECT_OT_vertex_group_select(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_deselect_exec(bContext *C, wmOperator *op)
+static int vertex_group_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_edit_object(C);
@@ -1615,12 +1619,12 @@ void OBJECT_OT_vertex_group_deselect(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_copy_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_duplicate(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1650,7 +1654,7 @@ static int vertex_group_levels_exec(bContext *C, wmOperator *op)
vgroup_levels(ob, offset, gain);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1674,13 +1678,13 @@ void OBJECT_OT_vertex_group_levels(wmOperatorType *ot)
RNA_def_float(ot->srna, "gain", 1.f, 0.f, FLT_MAX, "Gain", "Value to multiply weights by.", 0.0f, 10.f);
}
-static int vertex_group_normalize_exec(bContext *C, wmOperator *op)
+static int vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_normalize(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1708,7 +1712,7 @@ static int vertex_group_normalize_all_exec(bContext *C, wmOperator *op)
vgroup_normalize_all(ob, lock_active);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1738,7 +1742,7 @@ static int vertex_group_invert_exec(bContext *C, wmOperator *op)
int auto_remove= RNA_boolean_get(op->ptr,"auto_remove");
vgroup_invert(ob, auto_assign, auto_remove);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1763,13 +1767,13 @@ void OBJECT_OT_vertex_group_invert(wmOperatorType *ot)
}
-static int vertex_group_blend_exec(bContext *C, wmOperator *op)
+static int vertex_group_blend_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
vgroup_blend(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1803,7 +1807,7 @@ static int vertex_group_clean_exec(bContext *C, wmOperator *op)
if(all_groups) vgroup_clean_all(ob, limit, keep_single);
else vgroup_clean(ob, limit, keep_single);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1836,7 +1840,7 @@ static int vertex_group_mirror_exec(bContext *C, wmOperator *op)
ED_vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), RNA_boolean_get(op->ptr,"flip_group_names"));
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
@@ -1848,7 +1852,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
/* identifiers */
ot->name= "Mirror Vertex Group";
ot->idname= "OBJECT_OT_vertex_group_mirror";
- ot->description= "Mirror weights, and flip vertex group names, copying when only one side is selected";
+ ot->description= "Mirror all vertex groups, flip weights and/or names, editing only selected vertices, flipping when both sides are selected otherwise copy from unselected";
/* api callbacks */
ot->poll= vertex_group_poll_edit;
@@ -1859,11 +1863,11 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "mirror_weights", TRUE, "Mirror Weights", "Mirror weights.");
- RNA_def_boolean(ot->srna, "flip_group_names", TRUE, "Flip Groups", "Flip vertex group names while mirroring.");
+ RNA_def_boolean(ot->srna, "flip_group_names", TRUE, "Flip Groups", "Flip vertex group names.");
}
-static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -1877,7 +1881,7 @@ static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
BLI_duplicatelist(&base->object->defbase, &ob->defbase);
base->object->actdef= ob->actdef;
- DAG_id_flush_update(&base->object->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&base->object->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, base->object);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, base->object->data);
@@ -1904,7 +1908,7 @@ void OBJECT_OT_vertex_group_copy_to_linked(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *op)
+static int vertex_group_copy_to_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obact= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -1924,7 +1928,7 @@ void OBJECT_OT_vertex_group_copy_to_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Copy Vertex Group to Selected";
ot->idname= "OBJECT_OT_vertex_group_copy_to_selected";
- ot->description= "Copy Vertex Groups to other selected objects with matching indicies";
+ ot->description= "Copy Vertex Groups to other selected objects with matching indices";
/* api callbacks */
ot->poll= vertex_group_poll;
@@ -1944,13 +1948,13 @@ static int set_active_group_exec(bContext *C, wmOperator *op)
ob->actdef= nr+1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
return OPERATOR_FINISHED;
}
-static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *ptr, int *free)
+static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
EnumPropertyItem tmp = {0, "", 0, "", ""};
@@ -2071,6 +2075,8 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
vgroup_remap_update_users(ob, sort_map_update);
ob->actdef= sort_map_update[ob->actdef];
+
+ MEM_freeN(sort_map_update);
return OPERATOR_FINISHED;
}
@@ -2080,7 +2086,7 @@ static int vgroup_sort(void *def_a_ptr, void *def_b_ptr)
bDeformGroup *def_a= (bDeformGroup *)def_a_ptr;
bDeformGroup *def_b= (bDeformGroup *)def_b_ptr;
- return strcmp(def_a->name, def_b->name);
+ return BLI_natstrcmp(def_a->name, def_b->name);
}
static int vertex_group_sort_exec(bContext *C, wmOperator *op)
@@ -2099,7 +2105,7 @@ static int vertex_group_sort_exec(bContext *C, wmOperator *op)
ret = vgroup_do_remap(ob, name_array, op);
if (ret != OPERATOR_CANCELLED) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
}
@@ -2153,7 +2159,7 @@ static int vgroup_move_exec(bContext *C, wmOperator *op)
if (name_array) MEM_freeN(name_array);
if (ret != OPERATOR_CANCELLED) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob);
}
diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt
index be826654311..a0aa3e489dd 100644
--- a/source/blender/editors/physics/CMakeLists.txt
+++ b/source/blender/editors/physics/CMakeLists.txt
@@ -19,11 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../makesdna
../../makesrna
@@ -32,16 +31,23 @@ SET(INC
../../../../intern/guardedalloc
)
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+set(SRC
+ particle_boids.c
+ particle_edit.c
+ particle_object.c
+ physics_fluid.c
+ physics_ops.c
+ physics_pointcache.c
+
+ physics_intern.h
+)
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_editor_physics "${SRC}" "${INC}")
+blender_add_lib(bf_editor_physics "${SRC}" "${INC}")
diff --git a/source/blender/editors/physics/Makefile b/source/blender/editors/physics/Makefile
deleted file mode 100644
index 9ffc3a5b372..00000000000
--- a/source/blender/editors/physics/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_physics
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
diff --git a/source/blender/editors/physics/SConscript b/source/blender/editors/physics/SConscript
index ec90c74a35b..b3425be7d35 100644
--- a/source/blender/editors/physics/SConscript
+++ b/source/blender/editors/physics/SConscript
@@ -5,7 +5,11 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../gpu ../../bmesh'
+=======
+incs += ' ../../gpu ../../blenloader'
+>>>>>>> .merge-right.r35190
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
defs = ''
diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c
index a18890881a8..f659c33b5e1 100644
--- a/source/blender/editors/physics/particle_boids.c
+++ b/source/blender/editors/physics/particle_boids.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,13 +32,15 @@
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "BKE_boids.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_particle.h"
-#include "BLI_listbase.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
#include "RNA_define.h"
@@ -76,7 +78,7 @@ static int rule_add_exec(bContext *C, wmOperator *op)
BLI_addtail(&state->rules, rule);
- DAG_id_flush_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
return OPERATOR_FINISHED;
@@ -98,7 +100,7 @@ void BOID_OT_rule_add(wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", boidrule_type_items, 0, "Type", "");
}
-static int rule_del_exec(bContext *C, wmOperator *op)
+static int rule_del_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -128,7 +130,7 @@ static int rule_del_exec(bContext *C, wmOperator *op)
rule->flag |= BOIDRULE_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -149,7 +151,7 @@ void BOID_OT_rule_del(wmOperatorType *ot)
}
/************************ move up/down boid rule operators *********************/
-static int rule_move_up_exec(bContext *C, wmOperator *op)
+static int rule_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -166,7 +168,7 @@ static int rule_move_up_exec(bContext *C, wmOperator *op)
BLI_remlink(&state->rules, rule);
BLI_insertlink(&state->rules, rule->prev->prev, rule);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
break;
}
@@ -187,7 +189,7 @@ void BOID_OT_rule_move_up(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int rule_move_down_exec(bContext *C, wmOperator *op)
+static int rule_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -204,7 +206,7 @@ static int rule_move_down_exec(bContext *C, wmOperator *op)
BLI_remlink(&state->rules, rule);
BLI_insertlink(&state->rules, rule->next, rule);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
break;
}
@@ -227,7 +229,7 @@ void BOID_OT_rule_move_down(wmOperatorType *ot)
/************************ add/del boid state operators *********************/
-static int state_add_exec(bContext *C, wmOperator *op)
+static int state_add_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -266,7 +268,7 @@ void BOID_OT_state_add(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int state_del_exec(bContext *C, wmOperator *op)
+static int state_del_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -301,7 +303,7 @@ static int state_del_exec(bContext *C, wmOperator *op)
state->flag |= BOIDSTATE_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -322,7 +324,7 @@ void BOID_OT_state_del(wmOperatorType *ot)
}
/************************ move up/down boid state operators *********************/
-static int state_move_up_exec(bContext *C, wmOperator *op)
+static int state_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -359,7 +361,7 @@ void BOID_OT_state_move_up(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int state_move_down_exec(bContext *C, wmOperator *op)
+static int state_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -375,7 +377,7 @@ static int state_move_down_exec(bContext *C, wmOperator *op)
if(state->flag & BOIDSTATE_CURRENT && state->next) {
BLI_remlink(&boids->states, state);
BLI_insertlink(&boids->states, state->next, state);
- DAG_id_flush_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&psys->part->id, OB_RECALC_DATA|PSYS_RECALC_RESET);
break;
}
}
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index eaadd3e7d83..b5d07025ca5 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <math.h>
#include <string.h>
+#include <assert.h>
#include "MEM_guardedalloc.h"
@@ -40,6 +41,13 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_kdtree.h"
+#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
@@ -51,19 +59,13 @@
#include "BKE_particle.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
-#include "BKE_pointcache.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_dynstr.h"
-#include "BLI_kdtree.h"
-#include "BLI_rand.h"
+#include "BKE_pointcache.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "ED_physics.h"
#include "ED_mesh.h"
#include "ED_particle.h"
#include "ED_view3d.h"
@@ -369,8 +371,18 @@ static void PE_set_view3d_data(bContext *C, PEData *data)
/* note, the object argument means the modelview matrix does not account for the objects matrix, use viewmat rather then (obmat * viewmat) */
view3d_get_transformation(data->vc.ar, data->vc.rv3d, NULL, &data->mats);
- if((data->vc.v3d->drawtype>OB_WIRE) && (data->vc.v3d->flag & V3D_ZBUF_SELECT))
- view3d_validate_backbuf(&data->vc);
+ if((data->vc.v3d->drawtype>OB_WIRE) && (data->vc.v3d->flag & V3D_ZBUF_SELECT)) {
+ if(data->vc.v3d->flag & V3D_INVALID_BACKBUF) {
+ /* needed or else the draw matrix can be incorrect */
+ view3d_operator_needs_opengl(C);
+
+ view3d_validate_backbuf(&data->vc);
+ /* we may need to force an update here by setting the rv3d as dirty
+ * for now it seems ok, but take care!:
+ * rv3d->depths->dirty = 1; */
+ view3d_update_depths(data->vc.ar);
+ }
+ }
}
/*************************** selection utilities *******************************/
@@ -397,14 +409,23 @@ static int key_test_depth(PEData *data, float co[3])
x=wco[0];
y=wco[1];
+#if 0 /* works well but too slow on some systems [#23118] */
x+= (short)data->vc.ar->winrct.xmin;
y+= (short)data->vc.ar->winrct.ymin;
/* PE_set_view3d_data calls this. no need to call here */
/* view3d_validate_backbuf(&data->vc); */
glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
+#else /* faster to use depths, these are calculated in PE_set_view3d_data */
+ {
+ ViewDepths *vd = data->vc.rv3d->depths;
+ assert(vd && vd->depths);
+ /* we know its not clipped */
+ depth= vd->depths[y * vd->w + x];
+ }
+#endif
- if((float)uz - 0.0001 > depth)
+ if((float)uz - 0.00001 > depth)
return 0;
else
return 1;
@@ -464,13 +485,10 @@ static int key_inside_test(PEData *data, float co[3])
static int point_is_selected(PTCacheEditPoint *point)
{
KEY_K;
- int sel;
if(point->flag & PEP_HIDE)
return 0;
- sel= 0;
-
LOOP_SELECTED_KEYS {
return 1;
}
@@ -573,7 +591,7 @@ static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected
ParticleSystemModifierData *psmd = NULL;
ParticleEditSettings *pset= PE_settings(data->scene);
POINT_P; KEY_K;
- float mat[4][4], imat[4][4];
+ float mat[4][4]= MAT4_UNITY, imat[4][4]= MAT4_UNITY;
if(edit->psys)
psmd= psys_get_modifier(data->ob, edit->psys);
@@ -582,9 +600,6 @@ static void foreach_mouse_hit_key(PEData *data, ForKeyMatFunc func, int selected
if(pset->selectmode==SCE_SELECT_PATH)
selected= 0;
- unit_m4(imat);
- unit_m4(mat);
-
LOOP_VISIBLE_POINTS {
if(pset->selectmode==SCE_SELECT_END) {
/* only do end keys */
@@ -756,6 +771,9 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
if(!mpa) {
if(!edit->mirror_cache)
PE_update_mirror_cache(ob, psys);
+
+ if(!edit->mirror_cache)
+ return; /* something went wrong! */
mi= edit->mirror_cache[i];
if(mi == -1)
@@ -774,6 +792,7 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
if(mpoint->keys) MEM_freeN(mpoint->keys);
mpa->hair= MEM_dupallocN(pa->hair);
+ mpa->totkey= pa->totkey;
mpoint->keys= MEM_dupallocN(point->keys);
mpoint->totkey= point->totkey;
@@ -782,7 +801,7 @@ static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys
for(k=0; k<mpa->totkey; k++, mkey++, mhkey++) {
mkey->co= mhkey->co;
mkey->time= &mhkey->time;
- mkey->flag &= PEK_SELECT;
+ mkey->flag &= ~PEK_SELECT;
}
}
@@ -829,6 +848,9 @@ static void PE_apply_mirror(Object *ob, ParticleSystem *psys)
if(!edit->mirror_cache)
PE_update_mirror_cache(ob, psys);
+ if(!edit->mirror_cache)
+ return; /* something went wrong */
+
/* we delay settings the PARS_EDIT_RECALC for mirrored particles
* to avoid doing mirror twice */
LOOP_POINTS {
@@ -918,7 +940,7 @@ static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit)
}
}
/* force set distances between neighbouring keys */
-void PE_apply_lengths(Scene *scene, PTCacheEdit *edit)
+static void PE_apply_lengths(Scene *scene, PTCacheEdit *edit)
{
ParticleEditSettings *pset=PE_settings(scene);
@@ -1018,10 +1040,8 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
{
DerivedMesh *dm=psys_get_modifier(ob,psys)->dm;
PTCacheEdit *edit= psys->edit;
- MFace *mface;
- MVert *mvert;
float *vec, *nor;
- int i, totface, totvert;
+ int i, totface /*, totvert*/;
if(!dm)
return;
@@ -1032,7 +1052,7 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
BLI_kdtree_free(edit->emitter_field);
totface=dm->getNumTessFaces(dm);
- totvert=dm->getNumVerts(dm);
+ /*totvert=dm->getNumVerts(dm);*/ /*UNSUED*/
edit->emitter_cosnos=MEM_callocN(totface*6*sizeof(float),"emitter cosnos");
@@ -1041,9 +1061,9 @@ static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
vec=edit->emitter_cosnos;
nor=vec+3;
- mvert=dm->getVertDataArray(dm,CD_MVERT);
for(i=0; i<totface; i++, vec+=6, nor+=6) {
- mface=dm->getTessFaceData(dm,i,CD_MFACE);
+ MFace *mface=dm->getTessFaceData(dm,i,CD_MFACE);
+ MVert *mvert;
mvert=dm->getVertData(dm,mface->v1,CD_MVERT);
VECCOPY(vec,mvert->co);
@@ -1125,7 +1145,7 @@ static void update_world_cos(Object *ob, PTCacheEdit *edit)
}
}
}
-static void update_velocities(Object *ob, PTCacheEdit *edit)
+static void update_velocities(PTCacheEdit *edit)
{
/*TODO: get frs_sec properly */
float vec1[3], vec2[3], frs_sec, dfra;
@@ -1208,7 +1228,7 @@ void PE_update_object(Scene *scene, Object *ob, int useflag)
if(edit->psys)
update_world_cos(ob, edit);
if(pset->flag & PE_AUTO_VELOCITY)
- update_velocities(ob, edit);
+ update_velocities(edit);
PE_hide_keys_time(scene, edit, CFRA);
/* regenerate path caches */
@@ -1243,7 +1263,7 @@ static void select_key(PEData *data, int point_index, int key_index)
point->flag |= PEP_EDIT_RECALC;
}
-static void select_keys(PEData *data, int point_index, int key_index)
+static void select_keys(PEData *data, int point_index, int UNUSED(key_index))
{
PTCacheEdit *edit = data->edit;
PTCacheEditPoint *point = edit->points + point_index;
@@ -1387,7 +1407,7 @@ static void select_root(PEData *data, int point_index)
data->edit->points[point_index].flag |= PEP_EDIT_RECALC; /* redraw selection only */
}
-static int select_roots_exec(bContext *C, wmOperator *op)
+static int select_roots_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1427,7 +1447,7 @@ static void select_tip(PEData *data, int point_index)
point->flag |= PEP_EDIT_RECALC; /* redraw selection only */
}
-static int select_tips_exec(bContext *C, wmOperator *op)
+static int select_tips_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1466,8 +1486,6 @@ static int select_linked_exec(bContext *C, wmOperator *op)
mval[0]= location[0];
mval[1]= location[1];
- view3d_operator_needs_opengl(C);
-
PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad=75.0f;
@@ -1512,6 +1530,17 @@ void PARTICLE_OT_select_linked(wmOperatorType *ot)
}
/************************ border select operator ************************/
+void PE_deselect_all_visible(PTCacheEdit *edit)
+{
+ POINT_P; KEY_K;
+
+ LOOP_VISIBLE_POINTS {
+ LOOP_SELECTED_KEYS {
+ key->flag &= ~PEK_SELECT;
+ point->flag |= PEP_EDIT_RECALC;
+ }
+ }
+}
int PE_border_select(bContext *C, rcti *rect, int select, int extend)
{
@@ -1523,16 +1552,8 @@ int PE_border_select(bContext *C, rcti *rect, int select, int extend)
if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- if (extend == 0 && select) {
- POINT_P; KEY_K;
-
- LOOP_VISIBLE_POINTS {
- LOOP_SELECTED_KEYS {
- key->flag &= ~PEK_SELECT;
- point->flag |= PEP_EDIT_RECALC;
- }
- }
- }
+ if (extend == 0 && select)
+ PE_deselect_all_visible(edit);
PE_set_view3d_data(C, &data);
data.rect= rect;
@@ -1573,7 +1594,7 @@ int PE_circle_select(bContext *C, int selecting, short *mval, float rad)
/************************ lasso select operator ************************/
-int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
+int PE_lasso_select(bContext *C, short mcords[][2], short moves, short extend, short select)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -1583,13 +1604,19 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
ParticleSystem *psys = edit->psys;
ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
POINT_P; KEY_K;
- float co[3], mat[4][4];
+ float co[3], mat[4][4]= MAT4_UNITY;
short vertco[2];
+ PEData data;
+
if(!PE_start_edit(edit))
return OPERATOR_CANCELLED;
- unit_m4(mat);
+ if (extend == 0 && select)
+ PE_deselect_all_visible(edit);
+
+ /* only for depths */
+ PE_set_view3d_data(C, &data);
LOOP_VISIBLE_POINTS {
if(edit->psys && !(psys->flag & PSYS_GLOBAL_HAIR))
@@ -1600,7 +1627,7 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
VECCOPY(co, key->co);
mul_m4_v3(mat, co);
project_short(ar, co, vertco);
- if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
+ if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1]) && key_test_depth(&data, co)) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
point->flag |= PEP_EDIT_RECALC;
@@ -1618,7 +1645,7 @@ int PE_lasso_select(bContext *C, short mcords[][2], short moves, short select)
VECCOPY(co, key->co);
mul_m4_v3(mat, co);
project_short(ar, co,vertco);
- if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1])) {
+ if((vertco[0] != IS_CLIPPED) && lasso_inside(mcords,moves,vertco[0],vertco[1]) && key_test_depth(&data, co)) {
if(select && !(key->flag & PEK_SELECT)) {
key->flag |= PEK_SELECT;
point->flag |= PEP_EDIT_RECALC;
@@ -1690,7 +1717,7 @@ void PARTICLE_OT_hide(wmOperatorType *ot)
/*************************** reveal operator **************************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
@@ -1758,7 +1785,7 @@ static void select_less_keys(PEData *data, int point_index)
}
}
-static int select_less_exec(bContext *C, wmOperator *op)
+static int select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1819,7 +1846,7 @@ static void select_more_keys(PEData *data, int point_index)
}
}
-static int select_more_exec(bContext *C, wmOperator *op)
+static int select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -1846,7 +1873,7 @@ void PARTICLE_OT_select_more(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
PTCacheEdit *edit;
@@ -1889,7 +1916,7 @@ static void rekey_particle(PEData *data, int pa_index)
{
PTCacheEdit *edit= data->edit;
ParticleSystem *psys= edit->psys;
- ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa= psys->particles + pa_index;
PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
@@ -1898,6 +1925,10 @@ static void rekey_particle(PEData *data, int pa_index)
float dval, sta, end;
int k;
+ sim.scene= data->scene;
+ sim.ob= data->ob;
+ sim.psys= edit->psys;
+
pa->flag |= PARS_REKEY;
key= new_keys= MEM_callocN(data->totrekey * sizeof(HairKey),"Hair re-key keys");
@@ -1982,7 +2013,7 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
{
PTCacheEdit *edit= PE_get_current(scene, ob);
ParticleSystem *psys;
- ParticleSimulationData sim = {scene, ob, edit ? edit->psys : NULL, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa;
ParticleKey state;
HairKey *new_keys, *key;
@@ -1993,6 +2024,10 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
psys = edit->psys;
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+
pa= psys->particles + pa_index;
pa->flag |= PARS_REKEY;
@@ -2022,19 +2057,18 @@ static void rekey_particle_to_time(Scene *scene, Object *ob, int pa_index, float
/************************* utilities **************************/
-static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psys, int mirror)
+static int remove_tagged_particles(Object *ob, ParticleSystem *psys, int mirror)
{
PTCacheEdit *edit = psys->edit;
ParticleData *pa, *npa=0, *new_pars=0;
POINT_P;
PTCacheEditPoint *npoint=0, *new_points=0;
ParticleSystemModifierData *psmd;
- int i, totpart, new_totpart= psys->totpart, removed= 0;
+ int i, new_totpart= psys->totpart, removed= 0;
if(mirror) {
/* mirror tags */
psmd= psys_get_modifier(ob, psys);
- totpart= psys->totpart;
LOOP_TAGGED_POINTS {
PE_mirror_particle(ob, psmd->dm, psys, psys->particles + p, NULL);
@@ -2050,6 +2084,15 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
if(new_totpart) {
npa= new_pars= MEM_callocN(new_totpart * sizeof(ParticleData), "ParticleData array");
npoint= new_points= MEM_callocN(new_totpart * sizeof(PTCacheEditPoint), "PTCacheEditKey array");
+
+ if(ELEM(NULL, new_pars, new_points)) {
+ /* allocation error! */
+ if(new_pars)
+ MEM_freeN(new_pars);
+ if(new_points)
+ MEM_freeN(new_points);
+ return 0;
+ }
}
pa= psys->particles;
@@ -2092,7 +2135,7 @@ static int remove_tagged_particles(Scene *scene, Object *ob, ParticleSystem *psy
return removed;
}
-static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
+static void remove_tagged_keys(Object *ob, ParticleSystem *psys)
{
PTCacheEdit *edit= psys->edit;
ParticleData *pa;
@@ -2123,7 +2166,7 @@ static void remove_tagged_keys(Scene *scene, Object *ob, ParticleSystem *psys)
if(new_totkey < 2)
point->flag |= PEP_TAG;
}
- remove_tagged_particles(scene, ob, psys, pe_x_mirror(ob));
+ remove_tagged_particles(ob, psys, pe_x_mirror(ob));
LOOP_POINTS {
pa = psys->particles + p;
@@ -2187,7 +2230,7 @@ static void subdivide_particle(PEData *data, int pa_index)
{
PTCacheEdit *edit= data->edit;
ParticleSystem *psys= edit->psys;
- ParticleSimulationData sim = {data->scene, data->ob, edit->psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa= psys->particles + pa_index;
PTCacheEditPoint *point = edit->points + pa_index;
ParticleKey state;
@@ -2198,6 +2241,10 @@ static void subdivide_particle(PEData *data, int pa_index)
short totnewkey=0;
float endtime;
+ sim.scene= data->scene;
+ sim.ob= data->ob;
+ sim.psys= edit->psys;
+
for(k=0, ekey=point->keys; k<pa->totkey-1; k++,ekey++) {
if(ekey->flag&PEK_SELECT && (ekey+1)->flag&PEK_SELECT)
totnewkey++;
@@ -2260,7 +2307,7 @@ static void subdivide_particle(PEData *data, int pa_index)
pa->flag &= ~PARS_REKEY;
}
-static int subdivide_exec(bContext *C, wmOperator *op)
+static int subdivide_exec(bContext *C, wmOperator *UNUSED(op))
{
PEData data;
@@ -2347,7 +2394,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
BLI_kdtree_free(tree);
/* remove tagged particles - don't do mirror here! */
- remove_tagged_particles(scene, ob, psys, 0);
+ remove_tagged_particles(ob, psys, 0);
totremoved += removed;
} while(removed);
@@ -2356,7 +2403,7 @@ static int remove_doubles_exec(bContext *C, wmOperator *op)
BKE_reportf(op->reports, RPT_INFO, "Remove %d double particles.", totremoved);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
return OPERATOR_FINISHED;
@@ -2406,7 +2453,7 @@ static int weight_set_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
return OPERATOR_FINISHED;
@@ -2430,7 +2477,7 @@ void PARTICLE_OT_weight_set(wmOperatorType *ot)
/************************ cursor drawing *******************************/
-static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
+static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata))
{
ParticleEditSettings *pset= PE_settings(CTX_data_scene(C));
ParticleBrushData *brush;
@@ -2574,16 +2621,16 @@ static int delete_exec(bContext *C, wmOperator *op)
if(type == DEL_KEY) {
foreach_selected_key(&data, set_delete_particle_key);
- remove_tagged_keys(data.scene, data.ob, data.edit->psys);
+ remove_tagged_keys(data.ob, data.edit->psys);
recalc_lengths(data.edit);
}
else if(type == DEL_PARTICLE) {
foreach_selected_point(&data, set_delete_particle);
- remove_tagged_particles(data.scene, data.ob, data.edit->psys, pe_x_mirror(data.ob));
+ remove_tagged_particles(data.ob, data.edit->psys, pe_x_mirror(data.ob));
recalc_lengths(data.edit);
}
- DAG_id_flush_update(&data.ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&data.ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, data.ob);
return OPERATOR_FINISHED;
@@ -2629,7 +2676,7 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
if(!psmd->dm)
return;
- mirrorfaces= mesh_get_x_mirror_faces(ob, NULL);
+ //BMESH_TODO mirrorfaces= mesh_get_x_mirror_faces(ob, NULL);
if(!edit->mirror_cache)
PE_update_mirror_cache(ob, psys);
@@ -2734,7 +2781,7 @@ static void PE_mirror_x(Scene *scene, Object *ob, int tagged)
MEM_freeN(mirrorfaces);
}
-static int mirror_exec(bContext *C, wmOperator *op)
+static int mirror_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -2744,7 +2791,7 @@ static int mirror_exec(bContext *C, wmOperator *op)
update_world_cos(ob, edit);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -2765,7 +2812,7 @@ void PARTICLE_OT_mirror(wmOperatorType *ot)
/************************* brush edit callbacks ********************/
-static void brush_comb(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_comb(PEData *data, float UNUSED(mat[][4]), float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
ParticleEditSettings *pset= PE_settings(data->scene);
float cvec[3], fac;
@@ -3034,7 +3081,7 @@ static void brush_puff(PEData *data, int point_index)
}
-static void brush_weight(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_weight(PEData *data, float UNUSED(mat[][4]), float UNUSED(imat[][4]), int point_index, int key_index, PTCacheEditKey *UNUSED(key))
{
/* roots have full weight allways */
if(key_index) {
@@ -3048,7 +3095,7 @@ static void brush_weight(PEData *data, float mat[][4], float imat[][4], int poin
}
}
-static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_smooth_get(PEData *data, float mat[][4], float UNUSED(imat[][4]), int UNUSED(point_index), int key_index, PTCacheEditKey *key)
{
if(key_index) {
float dvec[3];
@@ -3060,7 +3107,7 @@ static void brush_smooth_get(PEData *data, float mat[][4], float imat[][4], int
}
}
-static void brush_smooth_do(PEData *data, float mat[][4], float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
+static void brush_smooth_do(PEData *data, float UNUSED(mat[][4]), float imat[][4], int point_index, int key_index, PTCacheEditKey *key)
{
float vec[3], dvec[3];
@@ -3087,13 +3134,13 @@ static int brush_add(PEData *data, short number)
ParticleSystem *psys= edit->psys;
ParticleData *add_pars= MEM_callocN(number*sizeof(ParticleData),"ParticleData add");
ParticleSystemModifierData *psmd= psys_get_modifier(ob,psys);
- ParticleSimulationData sim = {scene, ob, psys, psmd};
+ ParticleSimulationData sim= {0};
ParticleEditSettings *pset= PE_settings(scene);
int i, k, n= 0, totpart= psys->totpart;
float mco[2];
short dmx= 0, dmy= 0;
float co1[3], co2[3], min_d, imat[4][4];
- float framestep, timestep= psys_get_timestep(&sim);
+ float framestep, timestep;
short size= pset->brush[PE_BRUSH_ADD].size;
short size2= size*size;
DerivedMesh *dm=0;
@@ -3103,7 +3150,14 @@ static int brush_add(PEData *data, short number)
return 0;
BLI_srandom(psys->seed+data->mval[0]+data->mval[1]);
-
+
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psmd;
+
+ timestep= psys_get_timestep(&sim);
+
/* painting onto the deformed mesh, could be an option? */
if(psmd->dm->deformedOnly)
dm= psmd->dm;
@@ -3200,18 +3254,17 @@ static int brush_add(PEData *data, short number)
framestep= pa->lifetime/(float)(pset->totaddkey-1);
if(tree) {
- HairKey *hkey;
- ParticleKey key[3];
+ ParticleData *ppa;
+ HairKey *thkey;
+ ParticleKey key3[3];
KDTreeNearest ptn[3];
int w, maxw;
- float maxd, mind, dd, totw=0.0, weight[3];
+ float maxd, totw=0.0, weight[3];
psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0,0,0);
maxw= BLI_kdtree_find_n_nearest(tree,3,co1,NULL,ptn);
maxd= ptn[maxw-1].dist;
- mind= ptn[0].dist;
- dd= maxd - mind;
for(w=0; w<maxw; w++) {
weight[w]= (float)pow(2.0, (double)(-6.0f * ptn[w].dist / maxd));
@@ -3224,40 +3277,46 @@ static int brush_add(PEData *data, short number)
for(w=0; w<maxw; w++)
weight[w] /= totw;
+ ppa= psys->particles+ptn[0].index;
+
for(k=0; k<pset->totaddkey; k++) {
- hkey= (HairKey*)pa->hair + k;
- hkey->time= pa->time + k * framestep;
+ thkey= (HairKey*)pa->hair + k;
+ thkey->time= pa->time + k * framestep;
- key[0].time= hkey->time/ 100.0f;
- psys_get_particle_on_path(&sim, ptn[0].index, key, 0);
- mul_v3_fl(key[0].co, weight[0]);
+ key3[0].time= thkey->time/ 100.0f;
+ psys_get_particle_on_path(&sim, ptn[0].index, key3, 0);
+ mul_v3_fl(key3[0].co, weight[0]);
+
+ /* TODO: interpolatint the weight would be nicer */
+ thkey->weight= (ppa->hair+MIN2(k, ppa->totkey-1))->weight;
if(maxw>1) {
- key[1].time= key[0].time;
- psys_get_particle_on_path(&sim, ptn[1].index, key + 1, 0);
- mul_v3_fl(key[1].co, weight[1]);
- VECADD(key[0].co, key[0].co, key[1].co);
+ key3[1].time= key3[0].time;
+ psys_get_particle_on_path(&sim, ptn[1].index, &key3[1], 0);
+ mul_v3_fl(key3[1].co, weight[1]);
+ VECADD(key3[0].co, key3[0].co, key3[1].co);
if(maxw>2) {
- key[2].time= key[0].time;
- psys_get_particle_on_path(&sim, ptn[2].index, key + 2, 0);
- mul_v3_fl(key[2].co, weight[2]);
- VECADD(key[0].co, key[0].co, key[2].co);
+ key3[2].time= key3[0].time;
+ psys_get_particle_on_path(&sim, ptn[2].index, &key3[2], 0);
+ mul_v3_fl(key3[2].co, weight[2]);
+ VECADD(key3[0].co, key3[0].co, key3[2].co);
}
}
if(k==0)
- VECSUB(co1, pa->state.co, key[0].co);
+ VECSUB(co1, pa->state.co, key3[0].co);
- VECADD(hkey->co, key[0].co, co1);
+ VECADD(thkey->co, key3[0].co, co1);
- hkey->time= key[0].time;
+ thkey->time= key3[0].time;
}
}
else {
for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
VECADDFAC(hkey->co, pa->state.co, pa->state.vel, k * framestep * timestep);
hkey->time += k * framestep;
+ hkey->weight = 1.f - (float)k/(float)(pset->totaddkey-1);
}
}
for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
@@ -3288,6 +3347,9 @@ typedef struct BrushEdit {
int first;
int lastmouse[2];
+
+ /* optional cached view settings to avoid setting on every mousemove */
+ PEData data;
} BrushEdit;
static int brush_edit_init(bContext *C, wmOperator *op)
@@ -3312,6 +3374,9 @@ static int brush_edit_init(bContext *C, wmOperator *op)
bedit->ob= ob;
bedit->edit= edit;
+ /* cache view depths and settings for re-use */
+ PE_set_view3d_data(C, &bedit->data);
+
return 1;
}
@@ -3359,6 +3424,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
if(((pset->brushtype == PE_BRUSH_ADD) ?
(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
|| bedit->first) {
+ PEData data= bedit->data;
view3d_operator_needs_opengl(C);
selected= (short)count_selected_keys(scene, edit);
@@ -3366,9 +3432,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
switch(pset->brushtype) {
case PE_BRUSH_COMB:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3388,10 +3451,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_CUT:
{
- PEData data;
-
if(edit->psys && edit->pathcache) {
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
data.cutfac= brush->strength;
@@ -3401,7 +3461,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
else
foreach_point(&data, brush_cut);
- removed= remove_tagged_particles(scene, ob, edit->psys, pe_x_mirror(ob));
+ removed= remove_tagged_particles(ob, edit->psys, pe_x_mirror(ob));
if(pset->flag & PE_KEEP_LENGTHS)
recalc_lengths(edit);
}
@@ -3412,9 +3472,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_LENGTH:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3433,10 +3490,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_PUFF:
{
- PEData data;
-
if(edit->psys) {
- PE_set_view3d_data(C, &data);
data.dm= psmd->dm;
data.mval= mval;
data.rad= (float)brush->size;
@@ -3457,10 +3511,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_ADD:
{
- PEData data;
-
if(edit->psys && edit->psys->part->from==PART_FROM_FACE) {
- PE_set_view3d_data(C, &data);
data.mval= mval;
added= brush_add(&data, brush->count);
@@ -3474,9 +3525,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_SMOOTH:
{
- PEData data;
-
- PE_set_view3d_data(C, &data);
data.mval= mval;
data.rad= (float)brush->size;
@@ -3498,9 +3546,6 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
}
case PE_BRUSH_WEIGHT:
{
- PEData data;
- PE_set_view3d_data(C, &data);
-
if(edit->psys) {
data.dm= psmd->dm;
data.mval= mval;
@@ -3521,10 +3566,10 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
if(pset->brushtype == PE_BRUSH_ADD && pe_x_mirror(ob))
PE_mirror_x(scene, ob, 1);
- update_world_cos(ob,edit);
- psys_free_path_cache(NULL, edit);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
- }
+ update_world_cos(ob,edit);
+ psys_free_path_cache(NULL, edit);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ }
else
PE_update_object(scene, ob, 1);
@@ -3538,7 +3583,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
pset->flag |= lock_root;
}
-static void brush_edit_exit(bContext *C, wmOperator *op)
+static void brush_edit_exit(wmOperator *op)
{
BrushEdit *bedit= op->customdata;
@@ -3555,7 +3600,7 @@ static int brush_edit_exec(bContext *C, wmOperator *op)
}
RNA_END;
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_FINISHED;
}
@@ -3573,7 +3618,7 @@ static void brush_edit_apply_event(bContext *C, wmOperator *op, wmEvent *event)
RNA_collection_add(op->ptr, "stroke", &itemptr);
RNA_float_set_array(&itemptr, "mouse", mouse);
- RNA_boolean_set(&itemptr, "flip", event->shift != 0); // XXX hardcoded
+ RNA_boolean_set(&itemptr, "pen_flip", event->shift != 0); // XXX hardcoded
/* apply */
brush_edit_apply(C, op, &itemptr);
@@ -3597,7 +3642,7 @@ static int brush_edit_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case MIDDLEMOUSE:
case RIGHTMOUSE: // XXX hardcoded
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_FINISHED;
case MOUSEMOVE:
brush_edit_apply_event(C, op, event);
@@ -3607,9 +3652,9 @@ static int brush_edit_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int brush_edit_cancel(bContext *C, wmOperator *op)
+static int brush_edit_cancel(bContext *UNUSED(C), wmOperator *op)
{
- brush_edit_exit(C, op);
+ brush_edit_exit(op);
return OPERATOR_CANCELLED;
}
@@ -3682,8 +3727,6 @@ static void make_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(; pm; pm=pm->next) {
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
-
- pm->index_array = MEM_dupallocN(pm->index_array);
}
}
@@ -3758,9 +3801,7 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
for(i=0; i<BPHYS_TOT_DATA; i++)
pm->data[i] = MEM_dupallocN(pm->data[i]);
- pm->index_array = MEM_dupallocN(pm->index_array);
-
- BKE_ptcache_mem_init_pointers(pm);
+ BKE_ptcache_mem_pointers_init(pm);
LOOP_POINTS {
LOOP_KEYS {
@@ -3771,13 +3812,13 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
key->time = &key->ftime;
}
}
- BKE_ptcache_mem_incr_pointers(pm);
+ BKE_ptcache_mem_pointers_incr(pm);
}
}
}
}
-void PE_undo_push(Scene *scene, char *str)
+void PE_undo_push(Scene *scene, const char *str)
{
PTCacheEdit *edit= PE_get_current(scene, OBACT);
PTCacheUndo *undo;
@@ -3848,7 +3889,17 @@ void PE_undo_step(Scene *scene, int step)
}
}
- DAG_id_flush_update(&OBACT->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&OBACT->id, OB_RECALC_DATA);
+}
+
+int PE_undo_valid(Scene *scene)
+{
+ PTCacheEdit *edit= PE_get_current(scene, OBACT);
+
+ if(edit) {
+ return (edit->undo.last != edit->undo.first);
+ }
+ return 0;
}
static void PTCacheUndo_number(Scene *scene, PTCacheEdit *edit, int nr)
@@ -3974,6 +4025,9 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
if(cache && cache->flag & PTCACHE_DISK_CACHE)
return;
+ if(psys == NULL && cache->mem_cache.first == NULL)
+ return;
+
if(!edit) {
totpoint = psys ? psys->totpart : ((PTCacheMem*)cache->mem_cache.first)->totpoint;
@@ -4001,12 +4055,16 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
key->co= hkey->co;
key->time= &hkey->time;
key->flag= hkey->editflag;
- if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ if(!(psys->flag & PSYS_GLOBAL_HAIR)) {
key->flag |= PEK_USE_WCO;
+ hkey->editflag |= PEK_USE_WCO;
+ }
+
hkey++;
}
pa++;
}
+ update_world_cos(ob, edit);
}
else {
PTCacheMem *pm;
@@ -4020,25 +4078,9 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
totframe++;
for(pm=cache->mem_cache.first; pm; pm=pm->next) {
- BKE_ptcache_mem_init_pointers(pm);
-
LOOP_POINTS {
- if(psys) {
- if(pm->index_array) {
- if(pm->index_array[p])
- BKE_ptcache_mem_seek_pointers(p, pm);
- else
- continue;
- }
- else {
- pa = psys->particles + p;
- if((pm->next && pm->next->frame < pa->time)
- || (pm->prev && pm->prev->frame >= pa->dietime)) {
- BKE_ptcache_mem_incr_pointers(pm);
- continue;
- }
- }
- }
+ if(BKE_ptcache_mem_pointers_seek(p, pm) == 0)
+ continue;
if(!point->totkey) {
key = point->keys = MEM_callocN(totframe*sizeof(PTCacheEditKey),"ParticleEditKeys");
@@ -4052,7 +4094,7 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
key->rot = pm->cur[BPHYS_DATA_ROTATION];
key->ftime = (float)pm->frame;
key->time = &key->ftime;
- BKE_ptcache_mem_incr_pointers(pm);
+ BKE_ptcache_mem_pointers_incr(pm);
point->totkey++;
}
@@ -4084,7 +4126,7 @@ static int particle_edit_toggle_poll(bContext *C)
return (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody));
}
-static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
+static int particle_edit_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
@@ -4108,7 +4150,7 @@ static int particle_edit_toggle_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_MODE_OBJECT, NULL);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
return OPERATOR_FINISHED;
}
@@ -4130,7 +4172,7 @@ void PARTICLE_OT_particle_edit_toggle(wmOperatorType *ot)
/************************ set editable operator ************************/
-static int clear_edited_exec(bContext *C, wmOperator *op)
+static int clear_edited_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_active_object(C);
ParticleSystem *psys = psys_get_current(ob);
@@ -4148,7 +4190,7 @@ static int clear_edited_exec(bContext *C, wmOperator *op)
psys_reset(psys, PSYS_RESET_DEPSGRAPH);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
else { /* some operation might have protected hair from editing so let's clear the flag */
@@ -4156,7 +4198,7 @@ static int clear_edited_exec(bContext *C, wmOperator *op)
psys->flag &= ~PSYS_GLOBAL_HAIR;
psys->flag &= ~PSYS_EDITED;
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE|NA_EDITED, ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index 4885a8b04ec..7f830478f2a 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -45,7 +46,7 @@
#include "BKE_main.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "RNA_define.h"
@@ -60,7 +61,7 @@
/********************** particle system slot operators *********************/
-static int particle_system_add_exec(bContext *C, wmOperator *op)
+static int particle_system_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Scene *scene = CTX_data_scene(C);
@@ -91,7 +92,7 @@ void OBJECT_OT_particle_system_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int particle_system_remove_exec(bContext *C, wmOperator *op)
+static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Scene *scene = CTX_data_scene(C);
@@ -138,7 +139,7 @@ static int psys_poll(bContext *C)
return (ptr.data != NULL);
}
-static int new_particle_settings_exec(bContext *C, wmOperator *op)
+static int new_particle_settings_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
Main *bmain= CTX_data_main(C);
@@ -167,7 +168,7 @@ static int new_particle_settings_exec(bContext *C, wmOperator *op)
psys_check_boid_data(psys);
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -191,7 +192,7 @@ void PARTICLE_OT_new(wmOperatorType *ot)
/********************** keyed particle target operators *********************/
-static int new_particle_target_exec(bContext *C, wmOperator *op)
+static int new_particle_target_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -216,7 +217,7 @@ static int new_particle_target_exec(bContext *C, wmOperator *op)
BLI_addtail(&psys->targets, pt);
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -237,7 +238,7 @@ void PARTICLE_OT_new_target(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int remove_particle_target_exec(bContext *C, wmOperator *op)
+static int remove_particle_target_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
@@ -265,7 +266,7 @@ static int remove_particle_target_exec(bContext *C, wmOperator *op)
pt->flag |= PTARGET_CURRENT;
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
@@ -288,7 +289,7 @@ void PARTICLE_OT_target_remove(wmOperatorType *ot)
/************************ move up particle target operator *********************/
-static int target_move_up_exec(bContext *C, wmOperator *op)
+static int target_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -304,7 +305,7 @@ static int target_move_up_exec(bContext *C, wmOperator *op)
BLI_remlink(&psys->targets, pt);
BLI_insertlink(&psys->targets, pt->prev->prev, pt);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
break;
}
@@ -327,7 +328,7 @@ void PARTICLE_OT_target_move_up(wmOperatorType *ot)
/************************ move down particle target operator *********************/
-static int target_move_down_exec(bContext *C, wmOperator *op)
+static int target_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -342,7 +343,7 @@ static int target_move_down_exec(bContext *C, wmOperator *op)
BLI_remlink(&psys->targets, pt);
BLI_insertlink(&psys->targets, pt->next, pt);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
break;
}
@@ -365,7 +366,7 @@ void PARTICLE_OT_target_move_down(wmOperatorType *ot)
/************************ move up particle dupliweight operator *********************/
-static int dupliob_move_up_exec(bContext *C, wmOperator *op)
+static int dupliob_move_up_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -403,7 +404,7 @@ void PARTICLE_OT_dupliob_move_up(wmOperatorType *ot)
/********************** particle dupliweight operators *********************/
-static int copy_particle_dupliob_exec(bContext *C, wmOperator *op)
+static int copy_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -442,7 +443,7 @@ void PARTICLE_OT_dupliob_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int remove_particle_dupliob_exec(bContext *C, wmOperator *op)
+static int remove_particle_dupliob_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -487,7 +488,7 @@ void PARTICLE_OT_dupliob_remove(wmOperatorType *ot)
/************************ move down particle dupliweight operator *********************/
-static int dupliob_move_down_exec(bContext *C, wmOperator *op)
+static int dupliob_move_down_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr = CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem);
ParticleSystem *psys= ptr.data;
@@ -595,6 +596,7 @@ static int disconnect_hair_exec(bContext *C, wmOperator *op)
disconnect_hair(scene, ob, psys);
}
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
return OPERATOR_FINISHED;
@@ -622,7 +624,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
PTCacheEditPoint *point;
PTCacheEditKey *ekey = NULL;
HairKey *key;
- BVHTreeFromMesh bvhtree;
+ BVHTreeFromMesh bvhtree= {0};
BVHTreeNearest nearest;
MFace *mface;
DerivedMesh *dm = NULL;
@@ -638,14 +640,13 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
point= edit ? edit->points : NULL;
if(psmd->dm->deformedOnly)
- dm= psmd->dm;
+ /* we don't want to mess up psmd->dm when converting to global coordinates below */
+ dm= CDDM_copy(psmd->dm, 0);
else
dm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
numverts = dm->getNumVerts (dm);
- memset( &bvhtree, 0, sizeof(bvhtree) );
-
/* convert to global coordinates */
for (i=0; i<numverts; i++)
mul_m4_v3(ob->obmat, CDDM_get_vert(dm, i)->co);
@@ -703,8 +704,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
}
free_bvhtree_from_mesh(&bvhtree);
- if(!psmd->dm->deformedOnly)
- dm->release(dm);
+ dm->release(dm);
psys_free_path_cache(psys, psys->edit);
@@ -734,6 +734,7 @@ static int connect_hair_exec(bContext *C, wmOperator *op)
connect_hair(scene, ob, psys);
}
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_PARTICLE, ob);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index f411f92d395..93b0ca49915 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -1,4 +1,4 @@
-/**
+/*
* fluidsim.c
*
* $Id$
@@ -53,6 +53,7 @@
#include "BLI_blenlib.h"
#include "BLI_threads.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_armature.h"
@@ -77,8 +78,8 @@
#include "LBM_fluidsim.h"
-
#include "ED_screen.h"
+#include "ED_fluidsim.h"
#include "WM_types.h"
@@ -342,7 +343,7 @@ static void free_all_fluidobject_channels(ListBase *fobjects)
}
}
-static void fluid_init_all_channels(bContext *C, Object *fsDomain, FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects)
+static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), FluidsimSettings *domainSettings, FluidAnimChannels *channels, ListBase *fobjects)
{
Scene *scene = CTX_data_scene(C);
Base *base;
@@ -420,7 +421,7 @@ static void fluid_init_all_channels(bContext *C, Object *fsDomain, FluidsimSetti
/* Modifying the global scene isn't nice, but we can do it in
* this part of the process before a threaded job is created */
scene->r.cfra = (int)eval_time;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, CTX_wm_screen(C), 1);
/* now scene data should be current according to animation system, so we fill the channels */
@@ -633,17 +634,17 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
FILE *fileCfg;
int dirExist = 0;
char newSurfdataPath[FILE_MAXDIR+FILE_MAXFILE]; // modified output settings
- char *suffixConfig = FLUID_SUFFIX_CONFIG;
+ const char *suffixConfig = FLUID_SUFFIX_CONFIG;
int outStringsChanged = 0;
// prepare names...
strncpy(targetDir, domainSettings->surfdataPath, FILE_MAXDIR);
strncpy(newSurfdataPath, domainSettings->surfdataPath, FILE_MAXDIR);
- BLI_path_abs(targetDir, G.sce); // fixed #frame-no
-
- strcpy(targetFile, targetDir);
- strcat(targetFile, suffixConfig);
- strcat(targetFile,".tmp"); // dont overwrite/delete original file
+ BLI_path_abs(targetDir, G.main->name); // fixed #frame-no
+
+ // .tmp: dont overwrite/delete original file
+ BLI_snprintf(targetFile, FILE_MAXDIR+FILE_MAXFILE, "%s%s.tmp", targetDir, suffixConfig);
+
// make sure all directories exist
// as the bobjs use the same dir, this only needs to be checked
// for the cfg output
@@ -663,19 +664,13 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
char blendFile[FILE_MAXDIR+FILE_MAXFILE];
// invalid dir, reset to current/previous
- strcpy(blendDir, G.sce);
+ BLI_strncpy(blendDir, G.main->name, FILE_MAXDIR+FILE_MAXFILE);
BLI_splitdirstring(blendDir, blendFile);
- if(strlen(blendFile)>6){
- int len = strlen(blendFile);
- if( (blendFile[len-6]=='.')&& (blendFile[len-5]=='b')&& (blendFile[len-4]=='l')&&
- (blendFile[len-3]=='e')&& (blendFile[len-2]=='n')&& (blendFile[len-1]=='d') ){
- blendFile[len-6] = '\0';
- }
- }
- // todo... strip .blend ?
- snprintf(newSurfdataPath,FILE_MAXFILE+FILE_MAXDIR,"//fluidsimdata/%s_%s_", blendFile, fsDomain->id.name);
+ BLI_replace_extension(blendFile, FILE_MAXDIR+FILE_MAXFILE, ""); /* strip .blend */
+
+ BLI_snprintf(newSurfdataPath, FILE_MAXDIR+FILE_MAXFILE ,"//fluidsimdata/%s_%s_", blendFile, fsDomain->id.name);
- snprintf(debugStrBuffer,256,"fluidsimBake::error - warning resetting output dir to '%s'\n", newSurfdataPath);
+ BLI_snprintf(debugStrBuffer, 256, "fluidsimBake::error - warning resetting output dir to '%s'\n", newSurfdataPath);
elbeemDebugOut(debugStrBuffer);
outStringsChanged=1;
}
@@ -685,16 +680,16 @@ static int fluid_init_filepaths(Object *fsDomain, char *targetDir, char *targetF
if(outStringsChanged) {
char dispmsg[FILE_MAXDIR+FILE_MAXFILE+256];
int selection=0;
- strcpy(dispmsg,"Output settings set to: '");
+ BLI_strncpy(dispmsg,"Output settings set to: '", sizeof(dispmsg));
strcat(dispmsg, newSurfdataPath);
strcat(dispmsg, "'%t|Continue with changed settings%x1|Discard and abort%x0");
// ask user if thats what he/she wants...
selection = pupmenu(dispmsg);
if(selection<1) return 0; // 0 from menu, or -1 aborted
- strcpy(targetDir, newSurfdataPath);
+ BLI_strncpy(targetDir, newSurfdataPath, sizeof(targetDir));
strncpy(domainSettings->surfdataPath, newSurfdataPath, FILE_MAXDIR);
- BLI_path_abs(targetDir, G.sce); // fixed #frame-no
+ BLI_path_abs(targetDir, G.main->name); // fixed #frame-no
}
#endif
return outStringsChanged;
@@ -720,7 +715,7 @@ static void fluidbake_free(void *customdata)
}
/* called by fluidbake, only to check job 'stop' value */
-static int fluidbake_breakjob(void *customdata)
+static int fluidbake_breakjob(void *UNUSED(customdata))
{
//FluidBakeJob *fb= (FluidBakeJob *)customdata;
//return *(fb->stop);
@@ -813,8 +808,8 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
int gridlevels = 0;
const char *strEnvName = "BLENDER_ELBEEMDEBUG"; // from blendercall.cpp
- char *suffixConfig = FLUID_SUFFIX_CONFIG;
- char *suffixSurface = FLUID_SUFFIX_SURFACE;
+ const char *suffixConfig = FLUID_SUFFIX_CONFIG;
+ const char *suffixSurface = FLUID_SUFFIX_SURFACE;
char targetDir[FILE_MAXDIR+FILE_MAXFILE]; // store & modify output settings
char targetFile[FILE_MAXDIR+FILE_MAXFILE]; // temp. store filename from targetDir for access
@@ -910,7 +905,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
/* reset to original current frame */
scene->r.cfra = origFrame;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, CTX_wm_screen(C), 1);
/* ---- XXX: No Time animation curve for now, leaving this code here for reference
@@ -956,9 +951,8 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
}
/* ******** start writing / exporting ******** */
- strcpy(targetFile, targetDir);
- strcat(targetFile, suffixConfig);
- strcat(targetFile,".tmp"); // dont overwrite/delete original file
+ // use .tmp, dont overwrite/delete original file
+ BLI_snprintf(targetFile, 240, "%s%s.tmp", targetDir, suffixConfig);
// make sure these directories exist as well
if(outStringsChanged) {
@@ -986,8 +980,8 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
fsset->aniFrameTime = channels->aniFrameTime;
fsset->noOfFrames = noFrames; // is otherwise subtracted in parser
- strcpy(targetFile, targetDir);
- strcat(targetFile, suffixSurface);
+ BLI_snprintf(targetFile, 240, "%s%s", targetDir, suffixSurface);
+
// defaults for compressibility and adaptive grids
fsset->gstar = domainSettings->gstar;
fsset->maxRefine = domainSettings->maxRefine; // check <-> gridlevels
@@ -996,7 +990,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
fsset->surfaceSmoothing = domainSettings->surfaceSmoothing;
fsset->surfaceSubdivs = domainSettings->surfaceSubdivs;
fsset->farFieldSize = domainSettings->farFieldSize;
- strcpy( fsset->outputPath, targetFile);
+ BLI_strncpy(fsset->outputPath, targetFile, 240);
// domain channels
fsset->channelSizeFrameTime =
@@ -1047,7 +1041,7 @@ int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
return 1;
}
-void fluidsimFreeBake(Object *ob)
+void fluidsimFreeBake(Object *UNUSED(ob))
{
/* not implemented yet */
}
@@ -1056,27 +1050,27 @@ void fluidsimFreeBake(Object *ob)
/* compile dummy functions for disabled fluid sim */
-FluidsimSettings *fluidsimSettingsNew(Object *srcob)
+FluidsimSettings *fluidsimSettingsNew(Object *UNUSED(srcob))
{
return NULL;
}
-void fluidsimSettingsFree(FluidsimSettings *fss)
+void fluidsimSettingsFree(FluidsimSettings *UNUSED(fss))
{
}
-FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
+FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *UNUSED(fss))
{
return NULL;
}
/* only compile dummy functions */
-int fluidsimBake(bContext *C, ReportList *reports, Object *ob)
+static int fluidsimBake(bContext *UNUSED(C), ReportList *UNUSED(reports), Object *UNUSED(ob))
{
return 0;
}
-void fluidsimFreeBake(Object *ob)
+static void fluidsimFreeBake(Object *UNUSED(ob))
{
}
diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c
index 2b7f8e9d5a2..7d2b872038f 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 35f86a49aa7..4c8c69bce01 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -31,6 +31,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_scene_types.h"
#include "BKE_context.h"
@@ -41,13 +44,10 @@
#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
-
-#include "BLI_blenlib.h"
+
#include "ED_particle.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -56,7 +56,7 @@
#include "physics_intern.h"
-static int cache_break_test(void *cbd) {
+static int cache_break_test(void *UNUSED(cbd)) {
return G.afbreek==1;
}
static int ptcache_bake_all_poll(bContext *C)
@@ -75,15 +75,15 @@ static int ptcache_poll(bContext *C)
return (ptr.data && ptr.id.data);
}
-void bake_console_progress(void *arg, int nr)
+static void bake_console_progress(void *UNUSED(arg), int nr)
{
printf("\rbake: %3i%%", nr);
fflush(stdout);
}
-void bake_console_progress_end(void *arg)
+static void bake_console_progress_end(void *UNUSED(arg))
{
- printf("\n");
+ printf("\rbake: done!\n");
}
static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
@@ -103,6 +103,9 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
baker.break_test = cache_break_test;
baker.break_data = NULL;
+ /* Disabled for now as this doesn't work properly,
+ * and pointcache baking will be reimplemented with
+ * the job system soon anyways. */
if (win) {
baker.progressbar = (void (*)(void *, int))WM_timecursor;
baker.progressend = (void (*)(void *))WM_cursor_restore;
@@ -113,14 +116,14 @@ static int ptcache_bake_all_exec(bContext *C, wmOperator *op)
baker.progresscontext = NULL;
}
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
WM_event_add_notifier(C, NC_OBJECT|ND_POINTCACHE, NULL);
return OPERATOR_FINISHED;
}
-static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op)
+static int ptcache_free_bake_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Base *base;
@@ -201,6 +204,9 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
baker.break_test = cache_break_test;
baker.break_data = NULL;
+ /* Disabled for now as this doesn't work properly,
+ * and pointcache baking will be reimplemented with
+ * the job system soon anyways. */
if (win) {
baker.progressbar = (void (*)(void *, int))WM_timecursor;
baker.progressend = (void (*)(void *))WM_cursor_restore;
@@ -212,7 +218,7 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
baker.progresscontext = NULL;
}
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
BLI_freelistN(&pidlist);
@@ -221,7 +227,7 @@ static int ptcache_bake_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_free_bake_exec(bContext *C, wmOperator *op)
+static int ptcache_free_bake_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
PointCache *cache= ptr.data;
@@ -241,7 +247,7 @@ static int ptcache_free_bake_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *op)
+static int ptcache_bake_from_cache_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
PointCache *cache= ptr.data;
@@ -295,7 +301,7 @@ void PTCACHE_OT_bake_from_cache(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int ptcache_add_new_exec(bContext *C, wmOperator *op)
+static int ptcache_add_new_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
@@ -320,7 +326,7 @@ static int ptcache_add_new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int ptcache_remove_exec(bContext *C, wmOperator *op)
+static int ptcache_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "point_cache", &RNA_PointCache);
Scene *scene= CTX_data_scene(C);
diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt
index 550c812c320..ec62588b8fa 100644
--- a/source/blender/editors/render/CMakeLists.txt
+++ b/source/blender/editors/render/CMakeLists.txt
@@ -19,9 +19,8 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenfont
../../blenkernel
../../blenlib
@@ -29,27 +28,31 @@ SET(INC
../../gpu
../../imbuf
../../bmesh
- ../include
- ../../../../intern/guardedalloc
- ../../../../extern/glew/include
../../makesdna
../../makesrna
- ../../python
../../render/extern/include
../../windowmanager
+ ../../../../intern/guardedalloc
+ ../../../../extern/glew/include
)
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+set(SRC
+ render_internal.c
+ render_opengl.c
+ render_ops.c
+ render_preview.c
+ render_shading.c
+
+ render_intern.h
+)
-IF(WITH_OPENMP)
- ADD_DEFINITIONS(-DPARALLEL=1)
-ENDIF(WITH_OPENMP)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_OPENMP)
+ add_definitions(-DPARALLEL=1)
+endif()
-BLENDERLIB(bf_editor_render "${SRC}" "${INC}")
+blender_add_lib(bf_editor_render "${SRC}" "${INC}")
diff --git a/source/blender/editors/render/Makefile b/source/blender/editors/render/Makefile
deleted file mode 100644
index 510e5372e22..00000000000
--- a/source/blender/editors/render/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_render
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
-
-ifeq ($(OS), darwin)
- ifeq ($(WITH_BF_OPENMP), true)
- CPPFLAGS += -DPARALLEL=1
- endif
-endif
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index a0441155629..c61d00f22a7 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 083202e5a03..52280fa8e6a 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_threads.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
@@ -43,6 +44,7 @@
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BKE_multires.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
@@ -66,7 +68,7 @@
static ScrArea *biggest_area(bContext *C);
static ScrArea *biggest_non_image_area(bContext *C);
-static ScrArea *find_area_showing_r_result(bContext *C);
+static ScrArea *find_area_showing_r_result(bContext *C, wmWindow **win);
static ScrArea *find_area_image_empty(bContext *C);
/* called inside thread! */
@@ -195,6 +197,9 @@ void screen_set_image_output(bContext *C, int mx, int my)
SpaceImage *sima;
int area_was_image=0;
+ if(scene->r.displaymode==R_OUTPUT_NONE)
+ return;
+
if(scene->r.displaymode==R_OUTPUT_WINDOW) {
rcti rect;
int sizex, sizey;
@@ -227,9 +232,13 @@ void screen_set_image_output(bContext *C, int mx, int my)
}
if(!sa) {
- sa= find_area_showing_r_result(C);
+ sa= find_area_showing_r_result(C, &win);
if(sa==NULL)
sa= find_area_image_empty(C);
+
+ /* if area found in other window, we make that one show in front */
+ if(win && win!=CTX_wm_window(C))
+ wm_window_raise(win);
if(sa==NULL) {
/* find largest open non-image area */
@@ -331,24 +340,25 @@ static ScrArea *biggest_area(bContext *C)
}
-static ScrArea *find_area_showing_r_result(bContext *C)
+static ScrArea *find_area_showing_r_result(bContext *C, wmWindow **win)
{
wmWindowManager *wm= CTX_wm_manager(C);
- wmWindow *win;
ScrArea *sa = NULL;
SpaceImage *sima;
/* find an imagewindow showing render result */
- for(win=wm->windows.first; win; win=win->next) {
- for(sa=win->screen->areabase.first; sa; sa= sa->next) {
+ for(*win=wm->windows.first; *win; *win= (*win)->next) {
+ for(sa= (*win)->screen->areabase.first; sa; sa= sa->next) {
if(sa->spacetype==SPACE_IMAGE) {
sima= sa->spacedata.first;
if(sima->image && sima->image->type==IMA_TYPE_R_RESULT)
break;
}
}
+ if(sa)
+ break;
}
-
+
return sa;
}
@@ -388,7 +398,7 @@ static ScrArea *find_empty_image_area(bContext *C)
}
#endif // XXX not used
-static void render_error_reports(void *reports, char *str)
+static void render_error_reports(void *reports, const char *str)
{
BKE_report(reports, RPT_ERROR, str);
}
@@ -401,7 +411,14 @@ static int screen_render_exec(bContext *C, wmOperator *op)
Image *ima;
View3D *v3d= CTX_wm_view3d(C);
Main *mainp= CTX_data_main(C);
- int lay= (v3d)? v3d->lay: scene->lay;
+ unsigned int lay= (v3d)? v3d->lay: scene->lay;
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return OPERATOR_CANCELLED;
+ }
if(re==NULL) {
re= RE_NewRender(scene->id.name);
@@ -421,13 +438,13 @@ static int screen_render_exec(bContext *C, wmOperator *op)
since sequence rendering can call that recursively... (peter) */
seq_stripelem_cache_cleanup();
- if(RNA_boolean_get(op->ptr, "animation"))
+ if(is_animation)
RE_BlenderAnim(re, mainp, scene, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
else
- RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra);
+ RE_BlenderFrame(re, mainp, scene, NULL, lay, scene->r.cfra, is_write_still);
// no redraw needed, we leave state as we entered it
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, scene);
@@ -441,7 +458,7 @@ typedef struct RenderJob {
wmWindow *win;
SceneRenderLayer *srl;
int lay;
- int anim;
+ short anim, write_still;
Image *image;
ImageUser iuser;
short *stop;
@@ -568,16 +585,35 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
if(rj->anim)
RE_BlenderAnim(rj->re, rj->main, rj->scene, rj->lay, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
else
- RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra);
+ RE_BlenderFrame(rj->re, rj->main, rj->scene, rj->srl, rj->lay, rj->scene->r.cfra, rj->write_still);
}
static void render_endjob(void *rjv)
{
- RenderJob *rj= rjv;
+ RenderJob *rj= rjv;
+
+ /* this render may be used again by the sequencer without the active 'Render' where the callbacks
+ * would be re-assigned. assign dummy callbacks to avoid referencing freed renderjobs bug [#24508] */
+ RE_InitRenderCB(rj->re);
if(rj->main != G.main)
free_main(rj->main);
+ /* else the frame will not update for the original value */
+ if(!(rj->scene->r.scemode & R_NO_FRAME_UPDATE))
+ ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
+
+ /* XXX above function sets all tags in nodes */
+ ntreeClearTags(rj->scene->nodetree);
+
+ /* potentially set by caller */
+ rj->scene->r.scemode &= ~R_NO_FRAME_UPDATE;
+
+ if(rj->srl) {
+ NodeTagIDChanged(rj->scene->nodetree, &rj->scene->id);
+ WM_main_add_notifier(NC_NODE|NA_EDITED, rj->scene);
+ }
+
/* XXX render stability hack */
G.rendering = 0;
WM_main_add_notifier(NC_WINDOW, NULL);
@@ -596,7 +632,7 @@ static int render_breakjob(void *rjv)
}
/* catch esc */
-static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int screen_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
/* no running blender, remove handler and pass through */
if(0==WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
@@ -625,11 +661,23 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
wmJob *steve;
RenderJob *rj;
Image *ima;
-
+ int jobflag;
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+
/* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
return OPERATOR_CANCELLED;
+ if(!RE_is_rendering_allowed(scene, op->reports, render_error_reports)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return OPERATOR_CANCELLED;
+ }
+
/* stop all running jobs, currently previews frustrate Render */
WM_jobs_stop_all(CTX_wm_manager(C));
@@ -667,6 +715,8 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* ensure at least 1 area shows result */
screen_set_image_output(C, event->x, event->y);
+ jobflag= WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS;
+
/* single layer re-render */
if(RNA_property_is_set(op->ptr, "layer")) {
SceneRenderLayer *rl;
@@ -678,11 +728,12 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
scn = (Scene *)BLI_findstring(&mainp->scene, scene_name, offsetof(ID, name) + 2);
rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
-
+
if (scn && rl) {
scene = scn;
srl = rl;
}
+ jobflag |= WM_JOB_SUSPEND;
}
/* job custom data */
@@ -692,13 +743,14 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
rj->win= CTX_wm_window(C);
rj->srl = srl;
rj->lay = (v3d)? v3d->lay: scene->lay;
- rj->anim= RNA_boolean_get(op->ptr, "animation");
+ rj->anim= is_animation;
+ rj->write_still= is_write_still && !is_animation;
rj->iuser.scene= scene;
rj->iuser.ok= 1;
rj->reports= op->reports;
/* setup job */
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", WM_JOB_EXCL_RENDER|WM_JOB_PRIORITY|WM_JOB_PROGRESS);
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", jobflag);
WM_jobs_customdata(steve, rj, render_freejob);
WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob);
@@ -751,9 +803,10 @@ void RENDER_OT_render(wmOperatorType *ot)
ot->modal= screen_render_modal;
ot->exec= screen_render_exec;
- ot->poll= ED_operator_screenactive;
+ /*ot->poll= ED_operator_screenactive;*/ /* this isnt needed, causes failer in background mode */
- RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
+ RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene");
+ RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)");
RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render");
RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene");
}
@@ -763,14 +816,14 @@ void RENDER_OT_render(wmOperatorType *ot)
/* *********************** cancel render viewer *************** */
-static int render_view_cancel_exec(bContext *C, wmOperator *unused)
+static int render_view_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
{
wmWindow *win= CTX_wm_window(C);
ScrArea *sa= CTX_wm_area(C);
SpaceImage *sima= sa->spacedata.first;
/* test if we have a temp screen in front */
- if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
+ if(CTX_wm_window(C)->screen->temp) {
wm_window_lower(CTX_wm_window(C));
return OPERATOR_FINISHED;
}
@@ -810,33 +863,54 @@ void RENDER_OT_view_cancel(struct wmOperatorType *ot)
/* *********************** show render viewer *************** */
-static int render_view_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
+static int render_view_show_invoke(bContext *C, wmOperator *UNUSED(unused), wmEvent *event)
{
- ScrArea *sa= find_area_showing_r_result(C);
-
- /* test if we have a temp screen in front */
- if(CTX_wm_window(C)->screen->full==SCREENTEMP) {
- wm_window_lower(CTX_wm_window(C));
+ wmWindow *wincur = CTX_wm_window(C);
+
+ /* test if we have currently a temp screen active */
+ if(wincur->screen->temp) {
+ wm_window_lower(wincur);
}
- /* determine if render already shows */
- else if(sa) {
- SpaceImage *sima= sa->spacedata.first;
-
- if(sima->flag & SI_PREVSPACE) {
- sima->flag &= ~SI_PREVSPACE;
-
- if(sima->flag & SI_FULLWINDOW) {
- sima->flag &= ~SI_FULLWINDOW;
- ED_screen_full_prevspace(C, sa);
+ else {
+ wmWindow *win, *winshow;
+ ScrArea *sa= find_area_showing_r_result(C, &winshow);
+
+ /* is there another window showing result? */
+ for(win= CTX_wm_manager(C)->windows.first; win; win= win->next) {
+ if(win->screen->temp || (win==winshow && winshow!=wincur)) {
+ wm_window_raise(win);
+ return OPERATOR_FINISHED;
}
- else if(sima->next) {
- ED_area_newspace(C, sa, sima->next->spacetype);
- ED_area_tag_redraw(sa);
+ }
+
+ /* determine if render already shows */
+ if(sa) {
+ /* but don't close it when rendering */
+ if(!G.rendering) {
+ SpaceImage *sima= sa->spacedata.first;
+
+ if(sima->flag & SI_PREVSPACE) {
+ sima->flag &= ~SI_PREVSPACE;
+
+ if(sima->flag & SI_FULLWINDOW) {
+ sima->flag &= ~SI_FULLWINDOW;
+ ED_screen_full_prevspace(C, sa);
+ }
+ else if(sima->next) {
+ /* workaround for case of double prevspace, render window
+ with a file browser on top of it (same as in ED_area_prevspace) */
+ if(sima->next->spacetype == SPACE_FILE && sima->next->next)
+ ED_area_newspace(C, sa, sima->next->next->spacetype);
+ else
+ ED_area_newspace(C, sa, sima->next->spacetype);
+ ED_area_tag_redraw(sa);
+ }
+ }
}
}
- }
- else {
- screen_set_image_output(C, event->x, event->y);
+ else {
+ screen_set_image_output(C, event->x, event->y);
+ }
}
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 7833f93b3b5..68bf4fa9b5b 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
@@ -81,6 +82,7 @@ typedef struct OGLRender {
GPUOffScreen *ofs;
int sizex, sizey;
+ int write_still;
ReportList *reports;
bMovieHandle *mh;
@@ -112,7 +114,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
float winmat[4][4];
int sizex= oglrender->sizex;
int sizey= oglrender->sizey;
- int view_context = (v3d != NULL);
+ const short view_context= (v3d != NULL);
rr= RE_AcquireResultRead(oglrender->re);
@@ -132,14 +134,51 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
/* render 3d view */
if(rv3d->persp==RV3D_CAMOB && v3d->camera) {
+ /*int is_ortho= scene->r.mode & R_ORTHO;*/
RE_GetCameraWindow(oglrender->re, v3d->camera, scene->r.cfra, winmat);
+
+ }
+ else {
+ rctf viewplane;
+ float clipsta, clipend;
+
+ int is_ortho= get_view3d_viewplane(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL);
+ if(is_ortho) orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend);
+ else perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
+ }
+
+ if((scene->r.mode & R_OSA) == 0) {
ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf);
}
else {
- ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL);
+ /* simple accumulation, less hassle then FSAA FBO's */
+# define SAMPLES 5 /* fixed, easy to have more but for now this is ok */
+ const float jit_ofs[SAMPLES][2] = {{0, 0}, {0.5f, 0.5f}, {-0.5f,-0.5f}, {-0.5f, 0.5f}, {0.5f, -0.5f}};
+ float winmat_jitter[4][4];
+ float *accum_buffer= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum1");
+ float *accum_tmp= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum2");
+ int j;
+
+ /* first sample buffer, also initializes 'rv3d->persmat' */
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, accum_buffer);
+
+ /* skip the first sample */
+ for(j=1; j < SAMPLES; j++) {
+ copy_m4_m4(winmat_jitter, winmat);
+ window_translate_m4(winmat_jitter, rv3d->persmat, jit_ofs[j][0] / sizex, jit_ofs[j][1] / sizey);
+
+ ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter);
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, accum_tmp);
+ add_vn_vn(accum_buffer, accum_tmp, sizex*sizey*sizeof(float));
+ }
+
+ mul_vn_vn_fl(rr->rectf, accum_buffer, sizex*sizey*sizeof(float), 1.0/SAMPLES);
+
+ MEM_freeN(accum_buffer);
+ MEM_freeN(accum_tmp);
}
-
- glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, rr->rectf);
GPU_offscreen_unbind(oglrender->ofs); /* unbind */
}
@@ -158,7 +197,20 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
/* update byte from float buffer */
ibuf= BKE_image_acquire_ibuf(oglrender->ima, &oglrender->iuser, &lock);
- if(ibuf) image_buffer_rect_update(NULL, rr, ibuf, NULL);
+
+ if(ibuf) {
+ image_buffer_rect_update(NULL, rr, ibuf, NULL);
+
+ if(oglrender->write_still) {
+ char name[FILE_MAX];
+ int ok;
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE);
+ ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ if(ok) printf("OpenGL Render written to '%s'\n", name);
+ else printf("OpenGL Render failed to write '%s'\n", name);
+ }
+ }
+
BKE_image_release_ibuf(oglrender->ima, lock);
}
@@ -170,24 +222,31 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
GPUOffScreen *ofs;
OGLRender *oglrender;
int sizex, sizey;
- int view_context= RNA_boolean_get(op->ptr, "view_context");
+ short is_view_context= RNA_boolean_get(op->ptr, "view_context");
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
+ const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
/* ensure we have a 3d view */
-
+
if(!ED_view3d_context_activate(C)) {
RNA_boolean_set(op->ptr, "view_context", 0);
- view_context = 0;
+ is_view_context= 0;
}
/* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
return 0;
- if(!view_context && scene->camera==NULL) {
+ if(!is_view_context && scene->camera==NULL) {
BKE_report(op->reports, RPT_ERROR, "Scene has no camera.");
return 0;
}
+ if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+ BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected.");
+ return 0;
+ }
+
/* stop all running jobs, currently previews frustrate Render */
WM_jobs_stop_all(CTX_wm_manager(C));
@@ -198,7 +257,8 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
sizex= (scene->r.size*scene->r.xsch)/100;
sizey= (scene->r.size*scene->r.ysch)/100;
- ofs= GPU_offscreen_create(sizex, sizey);
+ /* corrects render size with actual size, not every card supports non-power-of-two dimensions */
+ ofs= GPU_offscreen_create(&sizex, &sizey);
if(!ofs) {
BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer.");
@@ -214,7 +274,9 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
oglrender->sizey= sizey;
oglrender->scene= scene;
- if(view_context) {
+ oglrender->write_still= is_write_still && !is_animation;
+
+ if(is_view_context) {
oglrender->v3d= CTX_wm_view3d(C);
oglrender->ar= CTX_wm_region(C);
oglrender->rv3d= CTX_wm_region_view3d(C);
@@ -291,8 +353,8 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
}
oglrender->cfrao= scene->r.cfra;
- oglrender->nfra= SFRA;
- scene->r.cfra= SFRA;
+ oglrender->nfra= PSFRA;
+ scene->r.cfra= PSFRA;
return 1;
}
@@ -305,11 +367,11 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
void *lock;
char name[FILE_MAXDIR+FILE_MAXFILE];
int ok= 0;
- int view_context = (oglrender->v3d != NULL);
+ const short view_context= (oglrender->v3d != NULL);
/* update animated image textures for gpu, etc,
* call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */
- ED_image_update_frame(C);
+ ED_image_update_frame(bmain, scene->r.cfra);
/* go to next frame */
while(CFRA<oglrender->nfra) {
@@ -351,7 +413,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
}
}
else {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
ok= BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
if(ok==0) {
@@ -375,7 +437,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
scene->r.cfra++;
/* stop at the end or on error */
- if(scene->r.cfra > EFRA || !ok) {
+ if(scene->r.cfra > PEFRA || !ok) {
screen_opengl_render_end(C, op->customdata);
return 0;
}
@@ -387,7 +449,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event)
{
OGLRender *oglrender= op->customdata;
-
+ int anim= RNA_boolean_get(op->ptr, "animation");
int ret;
switch(event->type) {
@@ -407,7 +469,13 @@ static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *even
/* run first because screen_opengl_render_anim_step can free oglrender */
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene);
- ret= screen_opengl_render_anim_step(C, op);
+ if(anim == 0) {
+ screen_opengl_render_apply(op->customdata);
+ screen_opengl_render_end(C, op->customdata);
+ return OPERATOR_FINISHED;
+ }
+ else
+ ret= screen_opengl_render_anim_step(C, op);
/* stop at the end or on error */
if(ret == 0) {
@@ -419,43 +487,35 @@ static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *even
static int screen_opengl_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
+ OGLRender *oglrender;
int anim= RNA_boolean_get(op->ptr, "animation");
if(!screen_opengl_render_init(C, op))
return OPERATOR_CANCELLED;
- if(!anim) {
- /* render image */
- screen_opengl_render_apply(op->customdata);
- screen_opengl_render_end(C, op->customdata);
- screen_set_image_output(C, event->x, event->y);
-
- return OPERATOR_FINISHED;
- }
- else {
- OGLRender *oglrender= op->customdata;
-
+ if(anim) {
if(!screen_opengl_render_anim_initialize(C, op))
return OPERATOR_CANCELLED;
-
- screen_set_image_output(C, event->x, event->y);
-
- WM_event_add_modal_handler(C, op);
- oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
-
- return OPERATOR_RUNNING_MODAL;
}
+
+ oglrender= op->customdata;
+ screen_set_image_output(C, event->x, event->y);
+
+ WM_event_add_modal_handler(C, op);
+ oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+
+ return OPERATOR_RUNNING_MODAL;
}
/* executes blocking render */
static int screen_opengl_render_exec(bContext *C, wmOperator *op)
{
- int anim= RNA_boolean_get(op->ptr, "animation");
+ const short is_animation= RNA_boolean_get(op->ptr, "animation");
if(!screen_opengl_render_init(C, op))
return OPERATOR_CANCELLED;
- if(!anim) { /* same as invoke */
+ if(!is_animation) { /* same as invoke */
/* render image */
screen_opengl_render_apply(op->customdata);
screen_opengl_render_end(C, op->customdata);
@@ -495,7 +555,8 @@ void RENDER_OT_opengl(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
- RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
+ RNA_def_boolean(ot->srna, "animation", 0, "Animation", "Render files from the animation range of this scene");
+ RNA_def_boolean(ot->srna, "write_still", 0, "Write Image", "Save rendered the image to the output path (used only when animation is disabled)");
RNA_def_boolean(ot->srna, "view_context", 1, "View Context", "Use the current 3D view for rendering, else use scene settings.");
}
diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c
index b1cb1d9c2f1..11cbf120391 100644
--- a/source/blender/editors/render/render_ops.c
+++ b/source/blender/editors/render/render_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,8 @@
#include "WM_api.h"
+#include "ED_render.h"
+
#include "render_intern.h" // own include
#if (defined(WITH_QUICKTIME) && !defined(USE_QTKIT))
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 71bee8c5b08..95a5220d562 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -45,10 +45,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "DNA_world_types.h"
#include "DNA_camera_types.h"
#include "DNA_material_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
#include "DNA_space_types.h"
@@ -66,6 +68,7 @@
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
+#include "BKE_idprop.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -94,7 +97,7 @@
#define PR_YMAX 195
/* XXX */
-static int qtest() {return 0;}
+static int qtest(void) {return 0;}
/* XXX */
ImBuf* get_brush_icon(Brush *brush)
@@ -111,7 +114,7 @@ ImBuf* get_brush_icon(Brush *brush)
// first use the path directly to try and load the file
BLI_strncpy(path, brush->icon_filepath, sizeof(brush->icon_filepath));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
brush->icon_imbuf= IMB_loadiffname(path, flags);
@@ -121,7 +124,7 @@ ImBuf* get_brush_icon(Brush *brush)
path[0]= 0;
- BLI_make_file_string(G.sce, path, folder, brush->icon_filepath);
+ BLI_make_file_string(G.main->name, path, folder, brush->icon_filepath);
if (path[0])
brush->icon_imbuf= IMB_loadiffname(path, flags);
@@ -148,6 +151,10 @@ typedef struct ShaderPreview {
ID *parent;
MTex *slot;
+ /* node materials need full copy during preview render, glsl uses it too */
+ Material *matcopy;
+ float col[4]; /* active object color */
+
int sizex, sizey;
unsigned int *pr_rect;
int pr_method;
@@ -190,7 +197,7 @@ void draw_tex_crop(Tex *tex)
}
/* temporal abuse; if id_code is -1 it only does texture.... solve! */
-void BIF_preview_changed(short id_code)
+void BIF_preview_changed(short UNUSED(id_code))
{
#if 0
ScrArea *sa;
@@ -280,6 +287,7 @@ void ED_preview_init_dbase(void)
BlendFileData *bfd;
extern int datatoc_preview_blend_size;
extern char datatoc_preview_blend[];
+ const int fileflags= G.fileflags;
G.fileflags |= G_FILE_NO_UI;
bfd= BLO_read_from_memory(datatoc_preview_blend, datatoc_preview_blend_size, NULL);
@@ -288,7 +296,7 @@ void ED_preview_init_dbase(void)
MEM_freeN(bfd);
}
- G.fileflags &= ~G_FILE_NO_UI;
+ G.fileflags= fileflags;
}
void ED_preview_free_dbase(void)
@@ -306,6 +314,32 @@ static Object *find_object(ListBase *lb, const char *name)
return ob;
}
+static int preview_mat_has_sss(Material *mat, bNodeTree *ntree)
+{
+ if(mat) {
+ if(mat->sss_flag & MA_DIFF_SSS)
+ return 1;
+ if(mat->nodetree)
+ if( preview_mat_has_sss(NULL, mat->nodetree))
+ return 1;
+ }
+ else if(ntree) {
+ bNode *node;
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==NODE_GROUP && node->id) {
+ if( preview_mat_has_sss(NULL, (bNodeTree *)node->id))
+ return 1;
+ }
+ else if(node->id && ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) {
+ mat= (Material *)node->id;
+ if(mat->sss_flag & MA_DIFF_SSS)
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
/* call this with a pointer to initialize preview scene */
/* call this with NULL to restore assigned ID pointers in preview scene */
static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPreview *sp)
@@ -317,6 +351,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce= pr_main->scene.first;
if(sce) {
+
/* this flag tells render to not execute depsgraph or ipos etc */
sce->r.scemode |= R_PREVIEWBUTS;
/* set world always back, is used now */
@@ -328,10 +363,18 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
sce->r.color_mgt_flag = scene->r.color_mgt_flag;
+
+ /* prevent overhead for small renders and icons (32) */
+ if(id && sp->sizex < 40)
+ sce->r.xparts= sce->r.yparts= 1;
+ else
+ sce->r.xparts= sce->r.yparts= 4;
+
/* exception: don't color manage texture previews or icons */
- if((sp && sp->pr_method==PR_ICON_RENDER) || id_type == ID_TE)
+ if((id && sp->pr_method==PR_ICON_RENDER) || id_type == ID_TE)
sce->r.color_mgt_flag &= ~R_COLOR_MANAGEMENT;
- if((sp && sp->pr_method==PR_ICON_RENDER) && id_type != ID_WO)
+
+ if((id && sp->pr_method==PR_ICON_RENDER) && id_type != ID_WO)
sce->r.alphamode= R_ALPHAPREMUL;
else
sce->r.alphamode= R_ADDSKY;
@@ -340,12 +383,21 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
strcpy(sce->r.engine, scene->r.engine);
if(id_type==ID_MA) {
- Material *mat= (Material *)id;
+ Material *mat= NULL, *origmat= (Material *)id;
if(id) {
+ /* work on a copy */
+ mat= localize_material(origmat);
+ sp->matcopy= mat;
+ BLI_addtail(&pr_main->mat, mat);
+
init_render_material(mat, 0, NULL); /* call that retrieves mode_l */
end_render_material(mat);
+ /* un-useful option */
+ if(sp->pr_method==PR_ICON_RENDER)
+ mat->shade_flag &= ~MA_OBCOLOR;
+
/* turn on raytracing if needed */
if(mat->mode_l & MA_RAYMIRROR)
sce->r.mode |= R_RAYTRACE;
@@ -353,7 +405,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce->r.mode |= R_RAYTRACE;
if((mat->mode_l & MA_RAYTRANSP) && (mat->mode_l & MA_TRANSP))
sce->r.mode |= R_RAYTRACE;
- if(mat->sss_flag & MA_DIFF_SSS)
+ if(preview_mat_has_sss(mat, NULL))
sce->r.mode |= R_SSS;
/* turn off fake shadows if needed */
@@ -384,7 +436,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
- if(sp && sp->pr_method==PR_ICON_RENDER) {
+ if(sp->pr_method==PR_ICON_RENDER) {
if (mat->material_type == MA_TYPE_HALO) {
sce->lay= 1<<MA_FLAT;
}
@@ -394,16 +446,23 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
else {
sce->lay= 1<<mat->pr_type;
- if(mat->nodetree && sp->pr_method==PR_NODE_RENDER)
+ if(mat->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
ntreeInitPreview(mat->nodetree, sp->sizex, sp->sizey);
+ ntreeInitPreview(origmat->nodetree, sp->sizex, sp->sizey);
+ }
}
}
else {
sce->r.mode &= ~(R_OSA|R_RAYTRACE|R_SSS);
+
}
for(base= sce->base.first; base; base= base->next) {
if(base->object->id.name[2]=='p') {
+ /* copy over object color, in case material uses it */
+ copy_v4_v4(base->object->col, sp->col);
+
if(ELEM4(base->object->type, OB_MESH, OB_CURVE, OB_SURF, OB_MBALL)) {
/* don't use assign_material, it changed mat->id.us, which shows in the UI */
Material ***matar= give_matarar(base->object);
@@ -428,7 +487,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
if(mat && mat->mtex[0]) {
mat->mtex[0]->tex= tex;
- if(sp && sp->slot)
+ if(tex && sp->slot)
mat->mtex[0]->which_output = sp->slot->which_output;
/* show alpha in this case */
@@ -444,7 +503,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
- if(tex && tex->nodetree && sp && sp->pr_method==PR_NODE_RENDER)
+ if(tex && tex->nodetree && sp->pr_method==PR_NODE_RENDER)
ntreeInitPreview(tex->nodetree, sp->sizex, sp->sizey);
}
else if(id_type==ID_LA) {
@@ -487,16 +546,16 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
Render *re;
RenderResult rres;
char name[32];
- int gamma_correct=0;
+ int do_gamma_correct=0;
int offx=0, newx= rect->xmax-rect->xmin, newy= rect->ymax-rect->ymin;
if (id && GS(id->name) != ID_TE) {
/* exception: don't color manage texture previews - show the raw values */
- if (sce) gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ if (sce) do_gamma_correct = sce->r.color_mgt_flag & R_COLOR_MANAGEMENT;
}
- if(!split || first) sprintf(name, "Preview %p", sa);
- else sprintf(name, "SecondPreview %p", sa);
+ if(!split || first) sprintf(name, "Preview %p", (void *)sa);
+ else sprintf(name, "SecondPreview %p", (void *)sa);
if(split) {
if(first) {
@@ -518,7 +577,7 @@ static int ed_preview_draw_rect(ScrArea *sa, Scene *sce, ID *id, int split, int
newrect->xmax= MAX2(newrect->xmax, rect->xmin + rres.rectx + offx);
newrect->ymax= MAX2(newrect->ymax, rect->ymin + rres.recty);
- glaDrawPixelsSafe_to32(rect->xmin+offx, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, gamma_correct);
+ glaDrawPixelsSafe_to32(rect->xmin+offx, rect->ymin, rres.rectx, rres.recty, rres.rectx, rres.rectf, do_gamma_correct);
RE_ReleaseResultImage(re);
return 1;
@@ -562,7 +621,7 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
sbuts->preview= 0;
ok= 0;
}
-
+
if(ok==0) {
ED_preview_shader_job(C, sa, id, parent, slot, newx, newy, PR_BUTS_RENDER);
}
@@ -571,7 +630,7 @@ void ED_preview_draw(const bContext *C, void *idp, void *parentp, void *slotp, r
/* ******************************** Icon Preview **************************** */
-void ED_preview_icon_draw(const bContext *C, void *idp, void *arg1, void *arg2, rcti *rect)
+void ED_preview_icon_draw(const bContext *UNUSED(C), void *UNUSED(idp), void *UNUSED(arg1), void *UNUSED(arg2), rcti *UNUSED(rect))
{
}
@@ -603,7 +662,7 @@ void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renrect)
}
-void BIF_view3d_previewrender_signal(ScrArea *sa, short signal)
+void BIF_view3d_previewrender_signal(ScrArea *UNUSED(sa), short UNUSED(signal))
{
#if 0
View3D *v3d= sa->spacedata.first;
@@ -625,7 +684,7 @@ void BIF_view3d_previewrender_signal(ScrArea *sa, short signal)
#endif
}
-void BIF_view3d_previewrender_free(View3D *v3d)
+void BIF_view3d_previewrender_free(View3D *UNUSED(v3d))
{
#if 0
if(v3d->ri) {
@@ -683,7 +742,7 @@ static int view3d_previewrender_get_rects(ScrArea *sa, rctf *viewplane, RenderIn
}
/* called before a panel gets moved/scaled, makes sure we can see through */
-void BIF_view3d_previewrender_clear(ScrArea *sa)
+void BIF_view3d_previewrender_clear(ScrArea *UNUSED(sa))
{
#if 0
View3D *v3d= sa->spacedata.first;
@@ -736,7 +795,7 @@ void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
ri->status= 0;
- sprintf(name, "View3dPreview %p", sa);
+ sprintf(name, "View3dPreview %p", (void *)sa);
re= ri->re= RE_NewRender(name);
//RE_display_draw_cb(re, view3d_previewrender_progress);
//RE_stats_draw_cb(re, view3d_previewrender_stats);
@@ -844,7 +903,7 @@ void BIF_view3d_previewrender(Main *bmain, Scene *scene, ScrArea *sa)
}
/* in panel space! */
-static void view3d_previewdraw_rect(ScrArea *sa, uiBlock *block, RenderInfo *ri)
+static void view3d_previewdraw_rect(ScrArea *UNUSED(sa), uiBlock *UNUSED(block), RenderInfo *ri)
{
// rctf dispf;
@@ -887,7 +946,7 @@ void BIF_view3d_previewdraw(struct ScrArea *sa, struct uiBlock *block)
/* **************************** new shader preview system ****************** */
/* inside thread, called by renderer, sets job update value */
-static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rcti *rect)
+static void shader_preview_draw(void *spv, RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect))
{
ShaderPreview *sp= spv;
@@ -898,15 +957,21 @@ static void shader_preview_draw(void *spv, RenderResult *rr, volatile struct rct
static int shader_preview_break(void *spv)
{
ShaderPreview *sp= spv;
-
+
return *(sp->stop);
}
/* outside thread, called before redraw notifiers, it moves finished preview over */
static void shader_preview_updatejob(void *spv)
{
-// ShaderPreview *sp= spv;
+ ShaderPreview *sp= spv;
+ if(sp->id && GS(sp->id->name) == ID_MA) {
+ Material *mat= (Material *)sp->id;
+
+ if(sp->matcopy && mat->nodetree && sp->matcopy->nodetree)
+ ntreeLocalSync(sp->matcopy->nodetree, mat->nodetree);
+ }
}
static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int first)
@@ -917,7 +982,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
short idtype= GS(id->name);
char name[32];
int sizex;
-
+
/* get the stuff from the builtin preview dbase */
sce= preview_prepare_scene(sp->scene, id, idtype, sp); // XXX sizex
if(sce==NULL) return;
@@ -941,7 +1006,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
else if(sp->pr_method==PR_NODE_RENDER) {
if(idtype == ID_MA) sce->r.scemode |= R_MATNODE_PREVIEW;
else if(idtype == ID_TE) sce->r.scemode |= R_TEXNODE_PREVIEW;
- sce->r.mode |= R_OSA;
+ sce->r.mode &= ~R_OSA;
}
else { /* PR_BUTS_RENDER */
sce->r.mode |= R_OSA;
@@ -970,12 +1035,14 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sizex;
/* entire cycle for render engine */
- RE_PreviewRender(re, G.main, sce);
+ RE_PreviewRender(re, pr_main, sce);
((Camera *)sce->camera->data)->lens= oldlens;
/* handle results */
if(sp->pr_method==PR_ICON_RENDER) {
+ // char *rct= (char *)(sp->pr_rect + 32*16 + 16);
+
if(sp->pr_rect)
RE_ResultGet32(re, sp->pr_rect);
}
@@ -987,7 +1054,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
}
/* unassign the pointers, reset vars */
- preview_prepare_scene(sp->scene, NULL, GS(id->name), NULL);
+ preview_prepare_scene(sp->scene, NULL, GS(id->name), sp);
}
/* runs inside thread for material and icons */
@@ -1012,6 +1079,23 @@ static void shader_preview_free(void *customdata)
{
ShaderPreview *sp= customdata;
+ if(sp->matcopy) {
+ struct IDProperty *properties;
+ /* node previews */
+ shader_preview_updatejob(sp);
+
+ /* get rid of copied material */
+ BLI_remlink(&pr_main->mat, sp->matcopy);
+ free_material(sp->matcopy);
+
+ properties= IDP_GetProperties((ID *)sp->matcopy, FALSE);
+ if (properties) {
+ IDP_FreeProperty(properties);
+ MEM_freeN(properties);
+ }
+ MEM_freeN(sp->matcopy);
+ }
+
MEM_freeN(sp);
}
@@ -1085,14 +1169,13 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
if(idtype == ID_IM) {
Image *ima= (Image*)id;
ImBuf *ibuf= NULL;
- ImageUser iuser;
+ ImageUser iuser= {0};
/* ima->ok is zero when Image cannot load */
if(ima==NULL || ima->ok==0)
return;
/* setup dummy image user */
- memset(&iuser, 0, sizeof(ImageUser));
iuser.ok= iuser.framenr= 1;
iuser.scene= sp->scene;
@@ -1141,7 +1224,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
/* use same function for icon & shader, so the job manager
does not run two of them at the same time. */
-static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *progress)
+static void common_preview_startjob(void *customdata, short *stop, short *do_update, float *UNUSED(progress))
{
ShaderPreview *sp= customdata;
@@ -1165,8 +1248,9 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
{
wmJob *steve;
ShaderPreview *sp;
-
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER);
+
+ /* suspended start means it starts after 1 timer step, see WM_jobs_timer below */
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), owner, "Icon Preview", WM_JOB_EXCL_RENDER|WM_JOB_SUSPEND);
sp= MEM_callocN(sizeof(ShaderPreview), "shader preview");
/* customdata for preview thread */
@@ -1177,10 +1261,10 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
sp->pr_method= PR_ICON_RENDER;
sp->pr_rect= rect;
sp->id = id;
-
+
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
- WM_jobs_timer(steve, 0.1, NC_MATERIAL, NC_MATERIAL);
+ WM_jobs_timer(steve, 0.25, NC_MATERIAL, NC_MATERIAL);
WM_jobs_callbacks(steve, common_preview_startjob, NULL, NULL, common_preview_endjob);
WM_jobs_start(CTX_wm_manager(C), steve);
@@ -1188,6 +1272,7 @@ void ED_preview_icon_job(const bContext *C, void *owner, ID *id, unsigned int *r
void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, MTex *slot, int sizex, int sizey, int method)
{
+ Object *ob= CTX_data_active_object(C);
wmJob *steve;
ShaderPreview *sp;
@@ -1203,6 +1288,8 @@ void ED_preview_shader_job(const bContext *C, void *owner, ID *id, ID *parent, M
sp->id = id;
sp->parent= parent;
sp->slot= slot;
+ if(ob && ob->totcol) copy_v4_v4(sp->col, ob->col);
+ else sp->col[0]= sp->col[1]= sp->col[2]= sp->col[3]= 1.0f;
/* setup job */
WM_jobs_customdata(steve, sp, shader_preview_free);
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 27ab8d06b04..e4e3ee7576c 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,10 +34,17 @@
#include "DNA_material_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_world_types.h"
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "BKE_animsys.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -58,11 +65,6 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
-#include "BLI_listbase.h"
-
#include "GPU_material.h"
#include "RNA_access.h"
@@ -70,6 +72,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_render.h"
#include "ED_curve.h"
#include "ED_mesh.h"
@@ -80,7 +83,7 @@
#include "render_intern.h" // own include
/***************************** Updates ***********************************
- * ED_render_id_flush_update gets called from DAG_id_flush_update, to do *
+ * ED_render_id_flush_update gets called from DAG_id_tag_update, to do *
* editor level updates when the ID changes. when these ID blocks are in *
* the dependency graph, we can get rid of the manual dependency checks */
@@ -117,7 +120,7 @@ static int nodes_use_tex(bNodeTree *ntree, Tex *tex)
return 0;
}
-static void material_changed(Main *bmain, Material *ma)
+static void material_changed(Main *UNUSED(bmain), Material *ma)
{
/* icons */
BKE_icon_changed(BKE_icon_getid(&ma->id));
@@ -209,7 +212,7 @@ static void image_changed(Main *bmain, Image *ima)
texture_changed(bmain, tex);
}
-static void scene_changed(Main *bmain, Scene *sce)
+static void scene_changed(Main *bmain, Scene *UNUSED(scene))
{
Object *ob;
Material *ma;
@@ -255,7 +258,7 @@ void ED_render_id_flush_update(Main *bmain, ID *id)
/********************** material slot operators *********************/
-static int material_slot_add_exec(bContext *C, wmOperator *op)
+static int material_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -264,6 +267,7 @@ static int material_slot_add_exec(bContext *C, wmOperator *op)
object_add_material_slot(ob);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_OB_SHADING, ob);
return OPERATOR_FINISHED;
}
@@ -289,8 +293,16 @@ static int material_slot_remove_exec(bContext *C, wmOperator *op)
if(!ob)
return OPERATOR_CANCELLED;
+ /* Removing material slots in edit mode screws things up, see bug #21822.*/
+ if(ob == CTX_data_edit_object(C)) {
+ BKE_report(op->reports, RPT_ERROR, "Unable to remove material slot in edit mode.");
+ return OPERATOR_CANCELLED;
+ }
+
object_remove_material_slot(ob);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+ WM_event_add_notifier(C, NC_OBJECT|ND_OB_SHADING, ob);
return OPERATOR_FINISHED;
}
@@ -309,7 +321,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int material_slot_assign_exec(bContext *C, wmOperator *op)
+static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
@@ -350,7 +362,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
return OPERATOR_FINISHED;
@@ -395,36 +407,38 @@ static int material_slot_de_select(bContext *C, int select)
BezTriple *bezt;
int a;
- for(nu= nurbs->first; nu; nu=nu->next) {
- if(nu->mat_nr==ob->actcol-1) {
- if(nu->bezt) {
- a= nu->pntsu;
- bezt= nu->bezt;
- while(a--) {
- if(bezt->hide==0) {
- if(select) {
- bezt->f1 |= SELECT;
- bezt->f2 |= SELECT;
- bezt->f3 |= SELECT;
- }
- else {
- bezt->f1 &= ~SELECT;
- bezt->f2 &= ~SELECT;
- bezt->f3 &= ~SELECT;
+ if(nurbs) {
+ for(nu= nurbs->first; nu; nu=nu->next) {
+ if(nu->mat_nr==ob->actcol-1) {
+ if(nu->bezt) {
+ a= nu->pntsu;
+ bezt= nu->bezt;
+ while(a--) {
+ if(bezt->hide==0) {
+ if(select) {
+ bezt->f1 |= SELECT;
+ bezt->f2 |= SELECT;
+ bezt->f3 |= SELECT;
+ }
+ else {
+ bezt->f1 &= ~SELECT;
+ bezt->f2 &= ~SELECT;
+ bezt->f3 &= ~SELECT;
+ }
}
+ bezt++;
}
- bezt++;
}
- }
- else if(nu->bp) {
- a= nu->pntsu*nu->pntsv;
- bp= nu->bp;
- while(a--) {
- if(bp->hide==0) {
- if(select) bp->f1 |= SELECT;
- else bp->f1 &= ~SELECT;
+ else if(nu->bp) {
+ a= nu->pntsu*nu->pntsv;
+ bp= nu->bp;
+ while(a--) {
+ if(bp->hide==0) {
+ if(select) bp->f1 |= SELECT;
+ else bp->f1 &= ~SELECT;
+ }
+ bp++;
}
- bp++;
}
}
}
@@ -436,7 +450,7 @@ static int material_slot_de_select(bContext *C, int select)
return OPERATOR_FINISHED;
}
-static int material_slot_select_exec(bContext *C, wmOperator *op)
+static int material_slot_select_exec(bContext *C, wmOperator *UNUSED(op))
{
return material_slot_de_select(C, 1);
}
@@ -455,7 +469,7 @@ void OBJECT_OT_material_slot_select(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int material_slot_deselect_exec(bContext *C, wmOperator *op)
+static int material_slot_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
return material_slot_de_select(C, 0);
}
@@ -475,7 +489,7 @@ void OBJECT_OT_material_slot_deselect(wmOperatorType *ot)
}
-static int material_slot_copy_exec(bContext *C, wmOperator *op)
+static int material_slot_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
Material ***matar;
@@ -516,7 +530,7 @@ void OBJECT_OT_material_slot_copy(wmOperatorType *ot)
/********************** new material operator *********************/
-static int new_material_exec(bContext *C, wmOperator *op)
+static int new_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
PointerRNA ptr, idptr;
@@ -562,7 +576,7 @@ void MATERIAL_OT_new(wmOperatorType *ot)
/********************** new texture operator *********************/
-static int new_texture_exec(bContext *C, wmOperator *op)
+static int new_texture_exec(bContext *C, wmOperator *UNUSED(op))
{
Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
PointerRNA ptr, idptr;
@@ -608,7 +622,7 @@ void TEXTURE_OT_new(wmOperatorType *ot)
/********************** new world operator *********************/
-static int new_world_exec(bContext *C, wmOperator *op)
+static int new_world_exec(bContext *C, wmOperator *UNUSED(op))
{
World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data;
PointerRNA ptr, idptr;
@@ -654,7 +668,7 @@ void WORLD_OT_new(wmOperatorType *ot)
/********************** render layer operators *********************/
-static int render_layer_add_exec(bContext *C, wmOperator *op)
+static int render_layer_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -680,7 +694,7 @@ void SCENE_OT_render_layer_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int render_layer_remove_exec(bContext *C, wmOperator *op)
+static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
SceneRenderLayer *rl;
@@ -729,12 +743,12 @@ void SCENE_OT_render_layer_remove(wmOperatorType *ot)
static int texture_slot_move(bContext *C, wmOperator *op)
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
- Material *ma = (Material *)id;
if(id) {
MTex **mtex_ar, *mtexswap;
short act;
int type= RNA_enum_get(op->ptr, "type");
+ struct AnimData *adt= BKE_animdata_from_id(id);
give_active_mtex(id, &mtex_ar, &act);
@@ -744,9 +758,9 @@ static int texture_slot_move(bContext *C, wmOperator *op)
mtex_ar[act] = mtex_ar[act-1];
mtex_ar[act-1] = mtexswap;
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act-1, -1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act-1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act-1, -1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act, act-1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, -1, act, 0);
if(GS(id->name)==ID_MA) {
Material *ma= (Material *)id;
@@ -766,9 +780,9 @@ static int texture_slot_move(bContext *C, wmOperator *op)
mtex_ar[act] = mtex_ar[act+1];
mtex_ar[act+1] = mtexswap;
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act+1, -1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, act, act+1, 0);
- BKE_animdata_fix_paths_rename(id, ma->adt, "texture_slots", NULL, NULL, -1, act, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act+1, -1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, act, act+1, 0);
+ BKE_animdata_fix_paths_rename(id, adt, "texture_slots", NULL, NULL, -1, act, 0);
if(GS(id->name)==ID_MA) {
Material *ma= (Material *)id;
@@ -783,6 +797,7 @@ static int texture_slot_move(bContext *C, wmOperator *op)
}
}
+ DAG_id_tag_update(id, 0);
WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
}
@@ -820,6 +835,7 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
ImBuf *ibuf=NULL;
int dx;
int retval;
+ int relative= (RNA_struct_find_property(op->ptr, "relative_path") && RNA_boolean_get(op->ptr, "relative_path"));
if(env->cube[1]==NULL) {
BKE_report(op->reports, RPT_ERROR, "There is no generated environment map available to save");
@@ -829,7 +845,7 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
dx= env->cube[1]->x;
if (env->type == ENV_CUBE) {
- ibuf = IMB_allocImBuf(3*dx, 2*dx, 24, IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(3*dx, 2*dx, 24, IB_rectfloat);
IMB_rectcpy(ibuf, env->cube[0], 0, 0, 0, 0, dx, dx);
IMB_rectcpy(ibuf, env->cube[1], dx, 0, 0, 0, dx, dx);
@@ -839,13 +855,20 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
IMB_rectcpy(ibuf, env->cube[5], 2*dx, dx, 0, 0, dx, dx);
}
else if (env->type == ENV_PLANE) {
- ibuf = IMB_allocImBuf(dx, dx, 24, IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(dx, dx, 24, IB_rectfloat);
IMB_rectcpy(ibuf, env->cube[1], 0, 0, 0, 0, dx, dx);
}
+ else {
+ BKE_report(op->reports, RPT_ERROR, "Invalid environment map type");
+ return OPERATOR_CANCELLED;
+ }
if (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
ibuf->profile = IB_PROFILE_LINEAR_RGB;
+ /* to save, we first get absolute path */
+ BLI_path_abs(str, G.main->name);
+
if (BKE_write_ibuf(scene, ibuf, str, imtype, scene->r.subimtype, scene->r.quality)) {
retval = OPERATOR_FINISHED;
}
@@ -853,6 +876,9 @@ static int save_envmap(wmOperator *op, Scene *scene, EnvMap *env, char *str, int
BKE_reportf(op->reports, RPT_ERROR, "Error saving environment map to %s.", str);
retval = OPERATOR_CANCELLED;
}
+ /* in case we were saving with relative paths, change back again */
+ if(relative)
+ BLI_path_rel(str, G.main->name);
IMB_freeImBuf(ibuf);
ibuf = NULL;
@@ -885,7 +911,7 @@ static int envmap_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
//Scene *scene= CTX_data_scene(C);
@@ -897,7 +923,7 @@ static int envmap_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
//RNA_enum_set(op->ptr, "file_type", scene->r.imtype);
- RNA_string_set(op->ptr, "filepath", G.sce);
+ RNA_string_set(op->ptr, "filepath", G.main->name);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -937,7 +963,7 @@ void TEXTURE_OT_envmap_save(wmOperatorType *ot)
WM_operator_properties_filesel(ot, FOLDERFILE|IMAGEFILE|MOVIEFILE, FILE_SPECIAL, FILE_SAVE, WM_FILESEL_FILEPATH|WM_FILESEL_RELPATH);
}
-static int envmap_clear_exec(bContext *C, wmOperator *op)
+static int envmap_clear_exec(bContext *C, wmOperator *UNUSED(op))
{
Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
@@ -977,7 +1003,7 @@ void TEXTURE_OT_envmap_clear(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int envmap_clear_all_exec(bContext *C, wmOperator *op)
+static int envmap_clear_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain = CTX_data_main(C);
Tex *tex;
@@ -1009,7 +1035,7 @@ void TEXTURE_OT_envmap_clear_all(wmOperatorType *ot)
/********************** material operators *********************/
/* material copy/paste */
-static int copy_material_exec(bContext *C, wmOperator *op)
+static int copy_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
@@ -1037,7 +1063,7 @@ void MATERIAL_OT_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int paste_material_exec(bContext *C, wmOperator *op)
+static int paste_material_exec(bContext *C, wmOperator *UNUSED(op))
{
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
@@ -1074,7 +1100,7 @@ void ED_render_clear_mtex_copybuf(void)
mtexcopied= 0;
}
-void copy_mtex_copybuf(ID *id)
+static void copy_mtex_copybuf(ID *id)
{
MTex **mtex= NULL;
@@ -1090,6 +1116,9 @@ void copy_mtex_copybuf(ID *id)
mtex= &(((World *)id)->mtex[(int)((World *)id)->texact]);
// mtex= wrld->mtex[(int)wrld->texact]; // TODO
break;
+ case ID_PA:
+ mtex= &(((ParticleSettings *)id)->mtex[(int)((ParticleSettings *)id)->texact]);
+ break;
}
if(mtex && *mtex) {
@@ -1101,7 +1130,7 @@ void copy_mtex_copybuf(ID *id)
}
}
-void paste_mtex_copybuf(ID *id)
+static void paste_mtex_copybuf(ID *id)
{
MTex **mtex= NULL;
@@ -1120,6 +1149,9 @@ void paste_mtex_copybuf(ID *id)
mtex= &(((World *)id)->mtex[(int)((World *)id)->texact]);
// mtex= wrld->mtex[(int)wrld->texact]; // TODO
break;
+ case ID_PA:
+ mtex= &(((ParticleSettings *)id)->mtex[(int)((ParticleSettings *)id)->texact]);
+ break;
}
if(mtex) {
@@ -1137,7 +1169,7 @@ void paste_mtex_copybuf(ID *id)
}
-static int copy_mtex_exec(bContext *C, wmOperator *op)
+static int copy_mtex_exec(bContext *C, wmOperator *UNUSED(op))
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
@@ -1176,7 +1208,7 @@ void TEXTURE_OT_slot_copy(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int paste_mtex_exec(bContext *C, wmOperator *op)
+static int paste_mtex_exec(bContext *C, wmOperator *UNUSED(op))
{
ID *id= CTX_data_pointer_get_type(C, "texture_slot", &RNA_TextureSlot).id.data;
@@ -1184,6 +1216,7 @@ static int paste_mtex_exec(bContext *C, wmOperator *op)
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
Lamp *la= CTX_data_pointer_get_type(C, "lamp", &RNA_Lamp).data;
World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data;
+ ParticleSystem *psys= CTX_data_pointer_get_type(C, "particle_system", &RNA_ParticleSystem).data;
if (ma)
id = &ma->id;
@@ -1191,6 +1224,8 @@ static int paste_mtex_exec(bContext *C, wmOperator *op)
id = &la->id;
else if (wo)
id = &wo->id;
+ else if (psys)
+ id = &psys->part->id;
if (id==NULL)
return OPERATOR_CANCELLED;
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index f9b5ceba0e4..5663a9ee750 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -19,23 +19,29 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
../../imbuf
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ area.c
+ glutil.c
+ screen_context.c
+ screen_edit.c
+ screen_ops.c
+ screendump.c
+
+ screen_intern.h
+)
-BLENDERLIB(bf_editor_screen "${SRC}" "${INC}")
+blender_add_lib(bf_editor_screen "${SRC}" "${INC}")
diff --git a/source/blender/editors/screen/SConscript b/source/blender/editors/screen/SConscript
index 5ce15cf5472..6370c9d3153 100644
--- a/source/blender/editors/screen/SConscript
+++ b/source/blender/editors/screen/SConscript
@@ -11,10 +11,10 @@ incs += ' #/intern/guardedalloc #/extern/glew/include'
defs = ''
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( 'bf_editors_screen', sources, Split(incs), Split(defs), libtype=['core'], priority=[105] )
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 90f9d5683c2..4ddb5d059e4 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -144,7 +145,7 @@ void ED_area_do_refresh(bContext *C, ScrArea *sa)
/* based on screen region draw tags, set draw tags in azones, and future region tabs etc */
/* only exported for WM */
-void ED_area_overdraw_flush(bContext *C, ScrArea *sa, ARegion *ar)
+void ED_area_overdraw_flush(ScrArea *sa, ARegion *ar)
{
AZone *az;
@@ -163,31 +164,26 @@ void ED_area_overdraw_flush(bContext *C, ScrArea *sa, ARegion *ar)
static void area_draw_azone(short x1, short y1, short x2, short y2)
{
- float xmin = x1;
- float xmax = x2-2;
- float ymin = y1-1;
- float ymax = y2-3;
-
- float dx= 0.3f*(xmax-xmin);
- float dy= 0.3f*(ymax-ymin);
+ int dx= floor(0.3f*(x2-x1));
+ int dy= floor(0.3f*(y2-y1));
glColor4ub(255, 255, 255, 180);
- fdrawline(xmin, ymax, xmax, ymin);
+ fdrawline(x1, y2, x2, y1);
glColor4ub(255, 255, 255, 130);
- fdrawline(xmin, ymax-dy, xmax-dx, ymin);
+ fdrawline(x1, y2-dy, x2-dx, y1);
glColor4ub(255, 255, 255, 80);
- fdrawline(xmin, ymax-2*dy, xmax-2*dx, ymin);
+ fdrawline(x1, y2-2*dy, x2-2*dx, y1);
glColor4ub(0, 0, 0, 210);
- fdrawline(xmin, ymax+1, xmax+1, ymin);
+ fdrawline(x1, y2+1, x2+1, y1);
glColor4ub(0, 0, 0, 180);
- fdrawline(xmin, ymax-dy+1, xmax-dx+1, ymin);
+ fdrawline(x1, y2-dy+1, x2-dx+1, y1);
glColor4ub(0, 0, 0, 150);
- fdrawline(xmin, ymax-2*dy+1, xmax-2*dx+1, ymin);
+ fdrawline(x1, y2-2*dy+1, x2-2*dx+1, y1);
}
-static void region_draw_azone(ScrArea *sa, AZone *az)
+static void region_draw_azone(AZone *az)
{
GLUquadricObj *qobj = NULL;
short midx = az->x1 + (az->x2 - az->x1)/2;
@@ -247,7 +243,7 @@ void ED_area_overdraw(bContext *C)
if(az->type==AZONE_AREA) {
area_draw_azone(az->x1, az->y1, az->x2, az->y2);
} else if(az->type==AZONE_REGION) {
- region_draw_azone(sa, az);
+ region_draw_azone(az);
}
az->do_draw= 0;
@@ -338,7 +334,7 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
UI_ThemeColor(TH_TEXT);
- BLF_draw_default(20, 8, 0.0f, ar->headerstr);
+ BLF_draw_default(20, 8, 0.0f, ar->headerstr, 65535); /* XXX, use real length */
}
else if(at->draw) {
at->draw(C, ar);
@@ -405,6 +401,19 @@ void ED_area_tag_redraw(ScrArea *sa)
ED_region_tag_redraw(ar);
}
+void ED_area_tag_redraw_regiontype(ScrArea *sa, int regiontype)
+{
+ ARegion *ar;
+
+ if(sa) {
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
+ if(ar->regiontype == regiontype) {
+ ED_region_tag_redraw(ar);
+ }
+ }
+ }
+}
+
void ED_area_tag_refresh(ScrArea *sa)
{
if(sa)
@@ -437,7 +446,6 @@ void ED_area_headerprint(ScrArea *sa, const char *str)
/* ************************************************************ */
-#define AZONESPOT 12
static void area_azone_initialize(ScrArea *sa)
{
AZone *az;
@@ -451,8 +459,8 @@ static void area_azone_initialize(ScrArea *sa)
az->type= AZONE_AREA;
az->x1= sa->totrct.xmin;
az->y1= sa->totrct.ymin;
- az->x2= sa->totrct.xmin + AZONESPOT-1;
- az->y2= sa->totrct.ymin + AZONESPOT-1;
+ az->x2= sa->totrct.xmin + AZONESPOT;
+ az->y2= sa->totrct.ymin + AZONESPOT;
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
az= (AZone *)MEM_callocN(sizeof(AZone), "actionzone");
@@ -460,38 +468,40 @@ static void area_azone_initialize(ScrArea *sa)
az->type= AZONE_AREA;
az->x1= sa->totrct.xmax+1;
az->y1= sa->totrct.ymax+1;
- az->x2= sa->totrct.xmax-AZONESPOT+1;
- az->y2= sa->totrct.ymax-AZONESPOT+1;
+ az->x2= sa->totrct.xmax-AZONESPOT;
+ az->y2= sa->totrct.ymax-AZONESPOT;
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
#define AZONEPAD_EDGE 4
-#define AZONEPAD_ICON 8
+#define AZONEPAD_ICON 9
static void region_azone_edge(AZone *az, ARegion *ar)
{
- if(az->edge=='t') {
- az->x1= ar->winrct.xmin;
- az->y1= ar->winrct.ymax - AZONEPAD_EDGE;
- az->x2= ar->winrct.xmax;
- az->y2= ar->winrct.ymax;
- }
- else if(az->edge=='b') {
- az->x1= ar->winrct.xmin;
- az->y1= ar->winrct.ymin + AZONEPAD_EDGE;
- az->x2= ar->winrct.xmax;
- az->y2= ar->winrct.ymin;
- }
- else if(az->edge=='l') {
- az->x1= ar->winrct.xmin;
- az->y1= ar->winrct.ymin;
- az->x2= ar->winrct.xmin + AZONEPAD_EDGE;
- az->y2= ar->winrct.ymax;
- }
- else { // if(az->edge=='r') {
- az->x1= ar->winrct.xmax;
- az->y1= ar->winrct.ymin;
- az->x2= ar->winrct.xmax - AZONEPAD_EDGE;
- az->y2= ar->winrct.ymax;
+ switch(az->edge) {
+ case AE_TOP_TO_BOTTOMRIGHT:
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymax - AZONEPAD_EDGE;
+ az->x2= ar->winrct.xmax;
+ az->y2= ar->winrct.ymax;
+ break;
+ case AE_BOTTOM_TO_TOPLEFT:
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymin + AZONEPAD_EDGE;
+ az->x2= ar->winrct.xmax;
+ az->y2= ar->winrct.ymin;
+ break;
+ case AE_LEFT_TO_TOPRIGHT:
+ az->x1= ar->winrct.xmin;
+ az->y1= ar->winrct.ymin;
+ az->x2= ar->winrct.xmin + AZONEPAD_EDGE;
+ az->y2= ar->winrct.ymax;
+ break;
+ case AE_RIGHT_TO_TOPLEFT:
+ az->x1= ar->winrct.xmax;
+ az->y1= ar->winrct.ymin;
+ az->x2= ar->winrct.xmax - AZONEPAD_EDGE;
+ az->y2= ar->winrct.ymax;
+ break;
}
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
@@ -502,33 +512,38 @@ static void region_azone_icon(ScrArea *sa, AZone *az, ARegion *ar)
AZone *azt;
int tot=0;
+ /* count how many actionzones with along same edge are available.
+ This allows for adding more action zones in the future without
+ having to worry about correct offset */
for(azt= sa->actionzones.first; azt; azt= azt->next) {
if(azt->edge == az->edge) tot++;
}
- if(az->edge=='t') {
- az->x1= ar->winrct.xmax - tot*2*AZONEPAD_ICON;
- az->y1= ar->winrct.ymax + AZONEPAD_ICON;
- az->x2= ar->winrct.xmax - tot*AZONEPAD_ICON;
- az->y2= ar->winrct.ymax + 2*AZONEPAD_ICON;
- }
- else if(az->edge=='b') {
- az->x1= ar->winrct.xmin + AZONEPAD_ICON;
- az->y1= ar->winrct.ymin - 2*AZONEPAD_ICON;
- az->x2= ar->winrct.xmin + 2*AZONEPAD_ICON;
- az->y2= ar->winrct.ymin - AZONEPAD_ICON;
- }
- else if(az->edge=='l') {
- az->x1= ar->winrct.xmin - 2*AZONEPAD_ICON;
- az->y1= ar->winrct.ymax - tot*2*AZONEPAD_ICON;
- az->x2= ar->winrct.xmin - AZONEPAD_ICON;
- az->y2= ar->winrct.ymax - tot*AZONEPAD_ICON;
- }
- else { // if(az->edge=='r') {
- az->x1= ar->winrct.xmax + AZONEPAD_ICON;
- az->y1= ar->winrct.ymax - tot*2*AZONEPAD_ICON;
- az->x2= ar->winrct.xmax + 2*AZONEPAD_ICON;
- az->y2= ar->winrct.ymax - tot*AZONEPAD_ICON;
+ switch(az->edge) {
+ case AE_TOP_TO_BOTTOMRIGHT:
+ az->x1= ar->winrct.xmax - tot*2*AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax + AZONEPAD_ICON;
+ az->x2= ar->winrct.xmax - tot*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax + 2*AZONEPAD_ICON;
+ break;
+ case AE_BOTTOM_TO_TOPLEFT:
+ az->x1= ar->winrct.xmin + AZONEPAD_ICON;
+ az->y1= ar->winrct.ymin - 2*AZONEPAD_ICON;
+ az->x2= ar->winrct.xmin + 2*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymin - AZONEPAD_ICON;
+ break;
+ case AE_LEFT_TO_TOPRIGHT:
+ az->x1= ar->winrct.xmin - 2*AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax - tot*2*AZONEPAD_ICON;
+ az->x2= ar->winrct.xmin - AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax - tot*AZONEPAD_ICON;
+ break;
+ case AE_RIGHT_TO_TOPLEFT:
+ az->x1= ar->winrct.xmax + AZONEPAD_ICON;
+ az->y1= ar->winrct.ymax - tot*2*AZONEPAD_ICON;
+ az->x2= ar->winrct.xmax + 2*AZONEPAD_ICON;
+ az->y2= ar->winrct.ymax - tot*AZONEPAD_ICON;
+ break;
}
BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
@@ -537,22 +552,21 @@ static void region_azone_icon(ScrArea *sa, AZone *az, ARegion *ar)
for(azt= sa->actionzones.first; azt; azt= azt->next) {
if(az!=azt) {
if( ABS(az->x1-azt->x1) < 2 && ABS(az->y1-azt->y1) < 2) {
- if(az->edge=='t' || az->edge=='b') {
+ if(az->edge==AE_TOP_TO_BOTTOMRIGHT || az->edge==AE_BOTTOM_TO_TOPLEFT) {
az->x1+= AZONESPOT;
az->x2+= AZONESPOT;
- BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
- else {
+ else{
az->y1-= AZONESPOT;
az->y2-= AZONESPOT;
- BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
+ BLI_init_rcti(&az->rect, az->x1, az->x2, az->y1, az->y2);
}
}
}
}
-static void region_azone_initialize(ScrArea *sa, ARegion *ar, char edge)
+static void region_azone_initialize(ScrArea *sa, ARegion *ar, AZEdge edge)
{
AZone *az;
@@ -575,17 +589,16 @@ static void region_azone_initialize(ScrArea *sa, ARegion *ar, char edge)
static void region_azone_add(ScrArea *sa, ARegion *ar, int alignment)
{
- /* edge code (t b l r) is where azone will be drawn */
+ /* edge code (t b l r) is along which area edge azone will be drawn */
if(alignment==RGN_ALIGN_TOP)
- region_azone_initialize(sa, ar, 'b');
+ region_azone_initialize(sa, ar, AE_BOTTOM_TO_TOPLEFT);
else if(alignment==RGN_ALIGN_BOTTOM)
- region_azone_initialize(sa, ar, 't');
+ region_azone_initialize(sa, ar, AE_TOP_TO_BOTTOMRIGHT);
else if(ELEM(alignment, RGN_ALIGN_RIGHT, RGN_OVERLAP_RIGHT))
- region_azone_initialize(sa, ar, 'l');
+ region_azone_initialize(sa, ar, AE_LEFT_TO_TOPRIGHT);
else if(ELEM(alignment, RGN_ALIGN_LEFT, RGN_OVERLAP_LEFT))
- region_azone_initialize(sa, ar, 'r');
-
+ region_azone_initialize(sa, ar, AE_RIGHT_TO_TOPLEFT);
}
/* dir is direction to check, not the splitting edge direction! */
@@ -812,7 +825,7 @@ static void area_calc_totrct(ScrArea *sa, int sizex, int sizey)
/* used for area initialize below */
-static void region_subwindow(wmWindowManager *wm, wmWindow *win, ARegion *ar)
+static void region_subwindow(wmWindow *win, ARegion *ar)
{
if(ar->flag & (RGN_FLAG_HIDDEN|RGN_FLAG_TOO_SMALL)) {
if(ar->swinid)
@@ -903,7 +916,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
/* region windows, default and own handlers */
for(ar= sa->regionbase.first; ar; ar= ar->next) {
- region_subwindow(wm, win, ar);
+ region_subwindow(win, ar);
if(ar->swinid) {
/* default region handlers */
@@ -926,7 +939,7 @@ void ED_region_init(bContext *C, ARegion *ar)
// ARegionType *at= ar->type;
/* refresh can be called before window opened */
- region_subwindow(CTX_wm_manager(C), CTX_wm_window(C), ar);
+ region_subwindow(CTX_wm_window(C), ar);
ar->winx= ar->winrct.xmax - ar->winrct.xmin + 1;
ar->winy= ar->winrct.ymax - ar->winrct.ymin + 1;
@@ -941,7 +954,6 @@ void ED_region_toggle_hidden(bContext *C, ARegion *ar)
ScrArea *sa= CTX_wm_area(C);
ar->flag ^= RGN_FLAG_HIDDEN;
- ar->v2d.flag &= ~V2D_IS_INITIALISED; /* XXX should become hide/unhide api? */
if(ar->flag & RGN_FLAG_HIDDEN)
WM_event_remove_handlers(C, &ar->handlers);
@@ -1085,23 +1097,18 @@ void ED_area_newspace(bContext *C, ScrArea *sa, int type)
/*send space change notifyer*/
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CHANGED, sa);
-
- ED_area_tag_redraw(sa);
+
ED_area_tag_refresh(sa);
}
+
+ /* also redraw when re-used */
+ ED_area_tag_redraw(sa);
}
void ED_area_prevspace(bContext *C, ScrArea *sa)
{
SpaceLink *sl = (sa) ? sa->spacedata.first : CTX_wm_space_data(C);
- /* Special handling of filebrowser to stop background thread for
- thumbnail creation - don't want to waste cpu resources if not showing
- the filebrowser */
- if (sl->spacetype == SPACE_FILE) {
- ED_fileselect_exit(C, (SpaceFile*)sl);
- }
-
if(sl->next) {
/* workaround for case of double prevspace, render window
with a file browser on top of it */
@@ -1119,7 +1126,7 @@ void ED_area_prevspace(bContext *C, ScrArea *sa)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CHANGED, sa);
}
-static char *editortype_pup(void)
+static const char *editortype_pup(void)
{
return(
"Editor type:%t"
@@ -1154,11 +1161,11 @@ static char *editortype_pup(void)
"|%l"
- "|Console %x18"
+ "|Python Console %x18"
);
}
-static void spacefunc(struct bContext *C, void *arg1, void *arg2)
+static void spacefunc(struct bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
ED_area_newspace(C, CTX_wm_area(C), CTX_wm_area(C)->butspacetype);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1216,7 +1223,7 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco)
/************************ standard UI regions ************************/
-void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context, int contextnr)
+void ED_region_panels(const bContext *C, ARegion *ar, int vertical, const char *context, int contextnr)
{
ScrArea *sa= CTX_wm_area(C);
uiStyle *style= U.uistyles.first;
@@ -1246,7 +1253,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
uiBeginPanels(C, ar);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
for(pt= ar->type->paneltypes.first; pt; pt= pt->next) {
/* verify context */
@@ -1277,6 +1284,9 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
panel->labelofs= xco - triangle;
panel->layout= NULL;
}
+ else {
+ panel->labelofs= 0;
+ }
if(open) {
short panelContext;
@@ -1367,7 +1377,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *contex
UI_view2d_totRect_set(v2d, x+V2D_SCROLL_WIDTH, y+V2D_SCROLL_HEIGHT);
/* set the view */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* this does the actual drawing! */
uiEndPanels(C, ar);
@@ -1416,7 +1426,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
xco= maxco= 8;
yco= HEADERY-3;
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index 06da91c3e37..ce96df5d3b1 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,14 +26,14 @@
*/
#include <stdio.h>
-#include <math.h>
#include <string.h>
#include "MEM_guardedalloc.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
#include "BKE_colortools.h"
#include "BLI_math.h"
@@ -527,7 +527,8 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
glaDrawPixelsTexScaled(x, y, img_w, img_h, format, rect, 1.0f, 1.0f);
}
-void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf, int gamma_correct)
+/* row_w is unused but kept for completeness */
+void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int UNUSED(row_w), float *rectf, int do_gamma_correct)
{
unsigned char *rect32;
@@ -536,7 +537,7 @@ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w,
rect32= MEM_mallocN(img_w*img_h*sizeof(int), "temp 32 bits");
- if (gamma_correct) {
+ if (do_gamma_correct) {
floatbuf_to_srgb_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
} else {
floatbuf_to_byte(rectf, rect32, 0, img_w, 0, img_h, img_w);
@@ -764,15 +765,15 @@ void bglBegin(int mode)
}
}
-int bglPointHack() {
+int bglPointHack(void) {
float value[4];
- int pointhack;
+ int pointhack_px;
glGetFloatv(GL_POINT_SIZE_RANGE, value);
if(value[1]<2.0) {
glGetFloatv(GL_POINT_SIZE, value);
- pointhack= floor(value[0]+0.5);
- if(pointhack>4) pointhack= 4;
- return pointhack;
+ pointhack_px= floor(value[0]+0.5);
+ if(pointhack_px>4) pointhack_px= 4;
+ return pointhack_px;
}
return 0;
}
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index fbc83b1de65..754d75fe9a5 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,9 +33,13 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+#include "BKE_object.h"
#include "BKE_action.h"
+#include "BKE_armature.h"
#include "BKE_sequencer.h"
#include "RNA_access.h"
@@ -43,11 +47,26 @@
#include "ED_object.h"
#include "ED_armature.h"
+#include "screen_intern.h"
+
+const char *screen_context_dir[] = {
+ "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
+ "selected_objects", "selected_bases",
+ "selected_editable_objects", "selected_editable_bases",
+ "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones",
+ "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
+ "active_base", "active_object", "object", "edit_object",
+ "sculpt_object", "vertex_paint_object", "weight_paint_object",
+ "texture_paint_object", "particle_edit_object",
+ "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
+ NULL};
+
int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result)
{
bScreen *sc= CTX_wm_screen(C);
Scene *scene= sc->scene;
Base *base;
+ unsigned int lay = scene->lay;
#if 0 /* Using the context breaks adding objects in the UI. Need to find out why - campbell */
Object *obact= CTX_data_active_object(C);
@@ -60,18 +79,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
#endif
if(CTX_data_dir(member)) {
- static const char *dir[] = {
- "scene", "visible_objects", "visible_bases", "selected_objects", "selected_bases",
- "selected_editable_objects", "selected_editable_bases",
- "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones",
- "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
- "active_base", "active_object", "object", "edit_object",
- "sculpt_object", "vertex_paint_object", "weight_paint_object",
- "texture_paint_object", "particle_edit_object",
- "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
- NULL};
-
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, screen_context_dir);
return 1;
}
else if(CTX_data_equals(member, "scene")) {
@@ -92,6 +100,22 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
return 1;
}
+ else if(CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) {
+ int selectable_objects= CTX_data_equals(member, "selectable_objects");
+
+ for(base=scene->base.first; base; base=base->next) {
+ if(base->lay & lay) {
+ if((base->object->restrictflag & OB_RESTRICT_VIEW)==0 && (base->object->restrictflag & OB_RESTRICT_SELECT)==0) {
+ if(selectable_objects)
+ CTX_data_id_list_add(result, &base->object->id);
+ else
+ CTX_data_list_add(result, &scene->id, &RNA_ObjectBase, base);
+ }
+ }
+ }
+ CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
+ return 1;
+ }
else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
int selected_objects= CTX_data_equals(member, "selected_objects");
@@ -209,14 +233,15 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "visible_pose_bones")) {
- bArmature *arm= (obact) ? obact->data : NULL;
+ Object *obpose= ED_object_pose_armature(obact);
+ bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
- if (obact && obact->pose && arm) {
- for (pchan= obact->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (obpose && obpose->pose && arm) {
+ for (pchan= obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
- if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
- CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
+ CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
@@ -224,15 +249,16 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "selected_pose_bones")) {
- bArmature *arm= (obact) ? obact->data : NULL;
+ Object *obpose= ED_object_pose_armature(obact);
+ bArmature *arm= (obpose) ? obpose->data : NULL;
bPoseChannel *pchan;
- if (obact && obact->pose && arm) {
- for (pchan= obact->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (obpose && obpose->pose && arm) {
+ for (pchan= obpose->pose->chanbase.first; pchan; pchan= pchan->next) {
/* ensure that PoseChannel is on visible layer and is not hidden in PoseMode */
- if ((pchan->bone) && (arm->layer & pchan->bone->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
- if (pchan->bone->flag & BONE_SELECTED || pchan->bone == arm->act_bone)
- CTX_data_list_add(result, &obact->id, &RNA_PoseBone, pchan);
+ if (PBONE_VISIBLE(arm, pchan->bone)) {
+ if (pchan->bone->flag & BONE_SELECTED)
+ CTX_data_list_add(result, &obpose->id, &RNA_PoseBone, pchan);
}
}
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
@@ -258,10 +284,11 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
else if(CTX_data_equals(member, "active_pose_bone")) {
bPoseChannel *pchan;
+ Object *obpose= ED_object_pose_armature(obact);
- pchan= get_active_posechannel(obact);
+ pchan= get_active_posechannel(obpose);
if (pchan) {
- CTX_data_pointer_set(result, &obact->id, &RNA_PoseBone, pchan);
+ CTX_data_pointer_set(result, &obpose->id, &RNA_PoseBone, pchan);
return 1;
}
}
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 8874c5d1bc8..f2f11f42204 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -53,6 +54,7 @@
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_screen_types.h"
+#include "ED_fileselect.h"
#include "UI_interface.h"
@@ -308,7 +310,7 @@ static void screen_delarea(bContext *C, bScreen *sc, ScrArea *sa)
/* return 0: no split possible */
/* else return (integer) screencoordinate split point */
-static short testsplitpoint(wmWindow *win, ScrArea *sa, char dir, float fac)
+static short testsplitpoint(ScrArea *sa, char dir, float fac)
{
short x, y;
@@ -344,7 +346,7 @@ static short testsplitpoint(wmWindow *win, ScrArea *sa, char dir, float fac)
}
}
-ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac)
+ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge)
{
ScrArea *newa=NULL;
ScrVert *sv1, *sv2;
@@ -352,7 +354,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
if(sa==NULL) return NULL;
- split= testsplitpoint(win, sa, dir, fac);
+ split= testsplitpoint(sa, dir, fac);
if(split==0) return NULL;
if(dir=='h') {
@@ -398,7 +400,8 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
}
/* remove double vertices en edges */
- removedouble_scrverts(sc);
+ if(merge)
+ removedouble_scrverts(sc);
removedouble_scredges(sc);
removenotused_scredges(sc);
@@ -407,7 +410,7 @@ ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac
/* empty screen, with 1 dummy area without spacedata */
/* uses window size */
-bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name)
+bScreen *ED_screen_add(wmWindow *win, Scene *scene, const char *name)
{
bScreen *sc;
ScrVert *sv1, *sv2, *sv3, *sv4;
@@ -415,6 +418,7 @@ bScreen *ED_screen_add(wmWindow *win, Scene *scene, char *name)
sc= alloc_libblock(&G.main->screen, ID_SCR, name);
sc->scene= scene;
sc->do_refresh= 1;
+ sc->redraws_flag= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
sc->winid= win->winid;
sv1= screen_addvert(sc, 0, 0);
@@ -483,7 +487,7 @@ static void screen_copy(bScreen *to, bScreen *from)
/* with sa as center, sb is located at: 0=W, 1=N, 2=E, 3=S */
/* -1 = not valid check */
/* used with join operator */
-int area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb)
+int area_getorientation(ScrArea *sa, ScrArea *sb)
{
ScrVert *sav1, *sav2, *sav3, *sav4;
ScrVert *sbv1, *sbv2, *sbv3, *sbv4;
@@ -522,7 +526,7 @@ int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2)
{
int dir;
- dir = area_getorientation(scr, sa1, sa2);
+ dir = area_getorientation(sa1, sa2);
/*printf("dir is : %i \n", dir);*/
if (dir < 0)
@@ -642,18 +646,20 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
/* make sure it fits! */
for(sv= sc->vertbase.first; sv; sv= sv->next) {
+ /* FIXME, this resizing logic is no good when resizing the window + redrawing [#24428]
+ * need some way to store these as floats internally and re-apply from there. */
tempf= ((float)sv->vec.x)*facx;
sv->vec.x= (short)(tempf+0.5);
sv->vec.x+= AREAGRID-1;
sv->vec.x-= (sv->vec.x % AREAGRID);
-
+
CLAMP(sv->vec.x, 0, winsizex);
- tempf= ((float)sv->vec.y )*facy;
+ tempf= ((float)sv->vec.y)*facy;
sv->vec.y= (short)(tempf+0.5);
sv->vec.y+= AREAGRID-1;
sv->vec.y-= (sv->vec.y % AREAGRID);
-
+
CLAMP(sv->vec.y, 0, winsizey);
}
}
@@ -860,7 +866,7 @@ static void scrarea_draw_shape_dark(ScrArea *sa, char dir)
}
/* draw screen area ligher with arrow shape ("eraser" of previous dark shape) */
-static void scrarea_draw_shape_light(ScrArea *sa, char dir)
+static void scrarea_draw_shape_light(ScrArea *sa, char UNUSED(dir))
{
glBlendFunc(GL_DST_COLOR, GL_SRC_ALPHA);
glEnable(GL_BLEND);
@@ -992,7 +998,7 @@ void ED_screen_draw(wmWindow *win)
/* blended join arrow */
if (sa1 && sa2) {
- dir = area_getorientation(win->screen, sa1, sa2);
+ dir = area_getorientation(sa1, sa2);
if (dir >= 0) {
switch(dir) {
case 0: /* W */
@@ -1024,27 +1030,35 @@ void ED_screen_draw(wmWindow *win)
/* make this screen usable */
/* for file read and first use, for scaling window, area moves */
void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
-{
- ScrArea *sa;
- rcti winrct= {0, win->sizex-1, 0, win->sizey-1};
-
- screen_test_scale(win->screen, win->sizex, win->sizey);
+{
+ /* exception for bg mode, we only need the screen context */
+ if (!G.background) {
+ ScrArea *sa;
+ rcti winrct;
- if(win->screen->mainwin==0)
- win->screen->mainwin= wm_subwindow_open(win, &winrct);
- else
- wm_subwindow_position(win, win->screen->mainwin, &winrct);
+ winrct.xmin= 0;
+ winrct.xmax= win->sizex-1;
+ winrct.ymin= 0;
+ winrct.ymax= win->sizey-1;
+
+ screen_test_scale(win->screen, win->sizex, win->sizey);
+
+ if(win->screen->mainwin==0)
+ win->screen->mainwin= wm_subwindow_open(win, &winrct);
+ else
+ wm_subwindow_position(win, win->screen->mainwin, &winrct);
+
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ /* set spacetype and region callbacks, calls init() */
+ /* sets subwindows for regions, adds handlers */
+ ED_area_initialize(wm, win, sa);
+ }
- for(sa= win->screen->areabase.first; sa; sa= sa->next) {
- /* set spacetype and region callbacks, calls init() */
- /* sets subwindows for regions, adds handlers */
- ED_area_initialize(wm, win, sa);
+ /* wake up animtimer */
+ if(win->screen->animtimer)
+ WM_event_timer_sleep(wm, win, win->screen->animtimer, 0);
}
- /* wake up animtimer */
- if(win->screen->animtimer)
- WM_event_timer_sleep(wm, win, win->screen->animtimer, 0);
-
if(G.f & G_DEBUG) printf("set screen\n");
win->screen->do_refresh= 0;
@@ -1090,6 +1104,10 @@ void ED_area_exit(bContext *C, ScrArea *sa)
ScrArea *prevsa= CTX_wm_area(C);
ARegion *ar;
+ if (sa->spacetype == SPACE_FILE) {
+ ED_fileselect_exit(C, (SpaceFile*)(sa) ? sa->spacedata.first : CTX_wm_space_data(C));
+ }
+
CTX_wm_area_set(C, sa);
for(ar= sa->regionbase.first; ar; ar= ar->next)
ED_region_exit(C, ar);
@@ -1125,8 +1143,7 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
/* mark it available for use for other windows */
screen->winid= 0;
- /* before deleting the temp screen or we get invalid access */
- if (prevwin->screen->full != SCREENTEMP) {
+ if (prevwin->screen->temp == 0) {
/* use previous window if possible */
CTX_wm_window_set(C, prevwin);
} else {
@@ -1134,11 +1151,6 @@ void ED_screen_exit(bContext *C, wmWindow *window, bScreen *screen)
CTX_wm_window_set(C, NULL);
}
- /* if temp screen, delete it */
- if(screen->full == SCREENTEMP) {
- Main *bmain= CTX_data_main(C);
- free_libblock(&bmain->screen, screen);
- }
}
/* *********************************** */
@@ -1157,7 +1169,7 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event)
if(az->type==AZONE_AREA)
WM_cursor_set(win, CURSOR_EDIT);
else if(az->type==AZONE_REGION) {
- if(az->edge == 'l' || az->edge == 'r')
+ if(az->edge == AE_LEFT_TO_TOPRIGHT || az->edge == AE_RIGHT_TO_TOPLEFT)
WM_cursor_set(win, CURSOR_X_MOVE);
else
WM_cursor_set(win, CURSOR_Y_MOVE);
@@ -1307,6 +1319,7 @@ void ED_screen_set(bContext *C, bScreen *sc)
ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
WM_event_add_notifier(C, NC_WINDOW, NULL);
+ WM_event_add_notifier(C, NC_SCREEN|ND_SCREENSET, sc);
/* makes button hilites work */
WM_event_add_mousemove(C);
@@ -1426,7 +1439,7 @@ void ED_screen_set_scene(bContext *C, Scene *scene)
CTX_data_scene_set(C, scene);
set_scene_bg(CTX_data_main(C), scene);
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, curscreen, 1);
/* complete redraw */
WM_event_add_notifier(C, NC_WINDOW, NULL);
@@ -1500,8 +1513,18 @@ void ED_screen_full_restore(bContext *C, ScrArea *sa)
if (sl->next) {
/* specific checks for space types */
+
+ int sima_restore = 0;
+
+ /* Special check added for non-render image window (back from fullscreen through "Back to Previous" button) */
if (sl->spacetype == SPACE_IMAGE) {
SpaceImage *sima= sa->spacedata.first;
+ if (!(sima->flag & SI_PREVSPACE) && !(sima->flag & SI_FULLWINDOW))
+ sima_restore = 1;
+ }
+
+ if (sl->spacetype == SPACE_IMAGE && !sima_restore) {
+ SpaceImage *sima= sa->spacedata.first;
if (sima->flag & SI_PREVSPACE)
sima->flag &= ~SI_PREVSPACE;
if (sima->flag & SI_FULLWINDOW) {
@@ -1534,46 +1557,39 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
}
if(sa && sa->full) {
+ ScrArea *old;
short fulltype;
sc= sa->full; /* the old screen to restore */
oldscreen= win->screen; /* the one disappearing */
fulltype = sc->full;
+ sc->full= 0;
- /* refuse to go out of SCREENAUTOPLAY as long as G_FLAGS_AUTOPLAY
- is set */
-
- if (fulltype != SCREENAUTOPLAY || (G.flags & G_FILE_AUTOPLAY) == 0) {
- ScrArea *old;
-
- sc->full= 0;
+ /* removed: SCREENAUTOPLAY exception here */
+
+ /* find old area */
+ for(old= sc->areabase.first; old; old= old->next)
+ if(old->full) break;
+ if(old==NULL) {
+ if (G.f & G_DEBUG)
+ printf("something wrong in areafullscreen\n");
+ return NULL;
+ }
- /* find old area */
- for(old= sc->areabase.first; old; old= old->next)
- if(old->full) break;
- if(old==NULL) {
- if (G.f & G_DEBUG)
- printf("something wrong in areafullscreen\n");
- return NULL;
- }
- // old feature described below (ton)
- // in autoplay screens the headers are disabled by
- // default. So use the old headertype instead
+ area_copy_data(old, sa, 1); /* 1 = swap spacelist */
+ if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
+ old->full= NULL;
- area_copy_data(old, sa, 1); /* 1 = swap spacelist */
- if (sa->flag & AREA_TEMP_INFO) sa->flag &= ~AREA_TEMP_INFO;
- old->full= NULL;
+ /* animtimer back */
+ sc->animtimer= oldscreen->animtimer;
+ oldscreen->animtimer= NULL;
- /* animtimer back */
- sc->animtimer= oldscreen->animtimer;
- oldscreen->animtimer= NULL;
+ ED_screen_set(C, sc);
- ED_screen_set(C, sc);
+ free_screen(oldscreen);
+ free_libblock(&CTX_data_main(C)->screen, oldscreen);
- free_screen(oldscreen);
- free_libblock(&CTX_data_main(C)->screen, oldscreen);
- }
}
else {
ScrArea *newa;
@@ -1588,7 +1604,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
*/
oldscreen->full = SCREENFULL;
- BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "temp");
+ BLI_snprintf(newname, sizeof(newname), "%s-%s", oldscreen->id.name+2, "full");
sc= ED_screen_add(win, oldscreen->scene, newname);
sc->full = SCREENFULL; // XXX
@@ -1597,7 +1613,7 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
oldscreen->animtimer= NULL;
/* returns the top small area */
- newa= area_split(win, sc, (ScrArea *)sc->areabase.first, 'h', 0.99f);
+ newa= area_split(sc, (ScrArea *)sc->areabase.first, 'h', 0.99f, 1);
ED_area_newspace(C, newa, SPACE_INFO);
/* use random area when we have no active one, e.g. when the
@@ -1722,20 +1738,17 @@ void ED_screen_animation_timer_update(bScreen *screen, int redraws, int refresh)
}
}
-/* results in fully updated anim system */
-void ED_update_for_newframe(const bContext *C, int mute)
-{
- Main *bmain= CTX_data_main(C);
- bScreen *screen= CTX_wm_screen(C);
- Scene *scene= CTX_data_scene(C);
-
+/* results in fully updated anim system
+ * screen can be NULL */
+void ED_update_for_newframe(Main *bmain, Scene *scene, bScreen *screen, int UNUSED(mute))
+{
#ifdef DURIAN_CAMERA_SWITCH
void *camera= scene_camera_switch_find(scene);
if(camera && scene->camera != camera) {
bScreen *sc;
scene->camera= camera;
/* are there cameras in the views that are not in the scene? */
- for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
+ for(sc= bmain->screen.first; sc; sc= sc->id.next) {
BKE_screen_view3d_scene_sync(sc);
}
}
@@ -1745,7 +1758,7 @@ void ED_update_for_newframe(const bContext *C, int mute)
/* update animated image textures for gpu, etc,
* call before scene_update_for_newframe so modifiers with textuers dont lag 1 frame */
- ED_image_update_frame(C);
+ ED_image_update_frame(bmain, scene->r.cfra);
/* this function applies the changes too */
/* XXX future: do all windows */
@@ -1767,7 +1780,7 @@ void ED_update_for_newframe(const bContext *C, int mute)
/* update animated texture nodes */
{
Tex *tex;
- for(tex= CTX_data_main(C)->tex.first; tex; tex= tex->id.next)
+ for(tex= bmain->tex.first; tex; tex= tex->id.next)
if( tex->use_nodes && tex->nodetree ) {
ntreeTexTagAnimated( tex->nodetree );
}
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index 79789b1876e..50a3159644d 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,14 +32,16 @@
struct wmWindow;
struct Scene;
+#define AZONESPOT 12
+
/* area.c */
void area_copy_data (ScrArea *sa1, ScrArea *sa2, int swap_space);
/* screen_edit.c */
ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2);
-ScrArea *area_split(wmWindow *win, bScreen *sc, ScrArea *sa, char dir, float fac);
+ScrArea *area_split(bScreen *sc, ScrArea *sa, char dir, float fac, int merge);
int screen_area_join(bContext *C, bScreen* scr, ScrArea *sa1, ScrArea *sa2);
-int area_getorientation(bScreen *screen, ScrArea *sa, ScrArea *sb);
+int area_getorientation(ScrArea *sa, ScrArea *sb);
void select_connected_scredge(bScreen *sc, ScrEdge *edge);
void removenotused_scrverts(bScreen *sc);
@@ -49,10 +51,12 @@ void removenotused_scredges(bScreen *sc);
int scredge_is_horizontal(ScrEdge *se);
ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my);
-AZone *is_in_area_actionzone(ScrArea *sa, int x, int y);
+struct AZone *is_in_area_actionzone(ScrArea *sa, int x, int y);
/* screen_context.c */
-void ed_screen_context(const bContext *C, const char *member, bContextDataResult *result);
+int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result);
+
+extern const char *screen_context_dir[]; /* doc access */
/* screendump.c */
void SCREEN_OT_screenshot(struct wmOperatorType *ot);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 2b9a929d4bf..2c9a11b2112 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_armature_types.h"
#include "DNA_lattice_types.h"
@@ -55,8 +56,10 @@
#include "WM_types.h"
#include "ED_util.h"
+#include "ED_image.h"
#include "ED_screen.h"
#include "ED_object.h"
+#include "ED_armature.h"
#include "ED_screen_types.h"
#include "ED_keyframes_draw.h"
@@ -64,6 +67,7 @@
#include "RNA_define.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "wm_window.h"
@@ -116,6 +120,24 @@ int ED_operator_scene_editable(bContext *C)
return 0;
}
+int ED_operator_objectmode(bContext *C)
+{
+ Scene *scene= CTX_data_scene(C);
+ Object *obact= CTX_data_active_object(C);
+
+ if(scene==NULL || scene->id.lib)
+ return 0;
+ if( CTX_data_edit_object(C) )
+ return 0;
+
+ /* add a check for ob->mode too? */
+ if(obact && obact->mode)
+ return 0;
+
+ return 1;
+}
+
+
static int ed_spacetype_test(bContext *C, int type)
{
if(ED_operator_areaactive(C)) {
@@ -130,6 +152,28 @@ int ED_operator_view3d_active(bContext *C)
return ed_spacetype_test(C, SPACE_VIEW3D);
}
+int ED_operator_region_view3d_active(bContext *C)
+{
+ if(CTX_wm_region_view3d(C))
+ return TRUE;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region");
+ return FALSE;
+}
+
+/* generic for any view2d which uses anim_ops */
+int ED_operator_animview_active(bContext *C)
+{
+ if(ED_operator_areaactive(C)) {
+ SpaceLink *sl= (SpaceLink *)CTX_wm_space_data(C);
+ if (sl && (ELEM6(sl->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_IPO, SPACE_TIME)))
+ return TRUE;
+ }
+
+ CTX_wm_operator_poll_msg_set(C, "expected an timeline/animation area to be active");
+ return 0;
+}
+
int ED_operator_timeline_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_TIME);
@@ -140,6 +184,19 @@ int ED_operator_outliner_active(bContext *C)
return ed_spacetype_test(C, SPACE_OUTLINER);
}
+int ED_operator_outliner_active_no_editobject(bContext *C)
+{
+ if(ed_spacetype_test(C, SPACE_OUTLINER)) {
+ Object *ob = ED_object_active_context(C);
+ Object *obedit= CTX_data_edit_object(C);
+ if(ob && ob == obedit)
+ return 0;
+ else
+ return 1;
+ }
+ return 0;
+}
+
int ED_operator_file_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_FILE);
@@ -166,7 +223,7 @@ int ED_operator_node_active(bContext *C)
}
// XXX rename
-int ED_operator_ipo_active(bContext *C)
+int ED_operator_graphedit_active(bContext *C)
{
return ed_spacetype_test(C, SPACE_IPO);
}
@@ -191,15 +248,33 @@ int ED_operator_logic_active(bContext *C)
return ed_spacetype_test(C, SPACE_LOGIC);
}
+int ED_operator_info_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_INFO);
+}
+
+
+int ED_operator_console_active(bContext *C)
+{
+ return ed_spacetype_test(C, SPACE_CONSOLE);
+}
+
int ED_operator_object_active(bContext *C)
{
- return NULL != ED_object_active_context(C);
+ Object *ob = ED_object_active_context(C);
+ return ((ob != NULL) && !(ob->restrictflag & OB_RESTRICT_VIEW));
}
int ED_operator_object_active_editable(bContext *C)
{
Object *ob = ED_object_active_context(C);
- return ((ob != NULL) && !(ob->id.lib));
+ return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW));
+}
+
+int ED_operator_object_active_editable_mesh(bContext *C)
+{
+ Object *ob = ED_object_active_context(C);
+ return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH);
}
int ED_operator_editmesh(bContext *C)
@@ -215,6 +290,15 @@ int ED_operator_editmesh_view3d(bContext *C)
return ED_operator_editmesh(C) && ED_operator_view3d_active(C);
}
+int ED_operator_editmesh_region_view3d(bContext *C)
+{
+ if(ED_operator_editmesh(C) && CTX_wm_region_view3d(C))
+ return 1;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region & editmesh");
+ return 0;
+}
+
int ED_operator_editarmature(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
@@ -226,27 +310,26 @@ int ED_operator_editarmature(bContext *C)
int ED_operator_posemode(bContext *C)
{
Object *obact= CTX_data_active_object(C);
- Object *obedit= CTX_data_edit_object(C);
-
- if ((obact != obedit) && (obact) && (obact->type==OB_ARMATURE))
- return (obact->mode & OB_MODE_POSE)!=0;
-
+
+ if (obact && !(obact->mode & OB_MODE_EDIT)) {
+ Object *obpose;
+ if((obpose= ED_object_pose_armature(obact))) {
+ if((obact == obpose) || (obact->mode & OB_MODE_WEIGHT_PAINT)) {
+ return 1;
+ }
+ }
+ }
+
return 0;
}
-
+/* wrapper for ED_space_image_show_uvedit */
int ED_operator_uvedit(bContext *C)
{
+ SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
- BMEditMesh *em= NULL;
-
- if(obedit && obedit->type==OB_MESH)
- em= ((Mesh *)obedit->data)->edit_btmesh;
- if (em && em->bm->totface && CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY))
- return 1;
-
- return 0;
+ return ED_space_image_show_uvedit(sima, obedit);
}
int ED_operator_uvmap(bContext *C)
@@ -271,6 +354,14 @@ int ED_operator_editsurfcurve(bContext *C)
return 0;
}
+int ED_operator_editsurfcurve_region_view3d(bContext *C)
+{
+ if(ED_operator_editsurfcurve(C) && CTX_wm_region_view3d(C))
+ return 1;
+
+ CTX_wm_operator_poll_msg_set(C, "expected a view3d region & editcurve");
+ return 0;
+}
int ED_operator_editcurve(bContext *C)
{
@@ -381,7 +472,10 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
for(az= sa->actionzones.first; az; az= az->next) {
if(BLI_in_rcti(&az->rect, x, y)) {
if(az->type == AZONE_AREA) {
- if(isect_point_tri_v2_int(az->x1, az->y1, az->x2, az->y2, x, y))
+ /* no triangle intersect but a hotspot circle based on corner */
+ int radius= (x-az->x1)*(x-az->x1) + (y-az->y1)*(y-az->y1);
+
+ if(radius <= AZONESPOT*AZONESPOT)
break;
}
else if(az->type == AZONE_REGION) {
@@ -394,7 +488,7 @@ AZone *is_in_area_actionzone(ScrArea *sa, int x, int y)
}
-static void actionzone_exit(bContext *C, wmOperator *op)
+static void actionzone_exit(wmOperator *op)
{
if(op->customdata)
MEM_freeN(op->customdata);
@@ -440,7 +534,7 @@ static int actionzone_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* region azone directly reacts on mouse clicks */
if(sad->az->type==AZONE_REGION) {
actionzone_apply(C, op, AZONE_REGION);
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
else {
@@ -480,16 +574,16 @@ static int actionzone_modal(bContext *C, wmOperator *op, wmEvent *event)
sad->sa2= screen_areahascursor(CTX_wm_screen(C), event->x, event->y);
/* apply sends event */
actionzone_apply(C, op, sad->az->type);
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
break;
case ESCKEY:
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
case LEFTMOUSE:
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
}
@@ -540,7 +634,7 @@ typedef struct sAreaSwapData {
ScrArea *sa1, *sa2;
} sAreaSwapData;
-static int area_swap_init(bContext *C, wmOperator *op, wmEvent *event)
+static int area_swap_init(wmOperator *op, wmEvent *event)
{
sAreaSwapData *sd= NULL;
sActionzoneData *sad= event->customdata;
@@ -574,7 +668,7 @@ static int area_swap_cancel(bContext *C, wmOperator *op)
static int area_swap_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(!area_swap_init(C, op, event))
+ if(!area_swap_init(op, event))
return OPERATOR_PASS_THROUGH;
/* add modal handler */
@@ -660,7 +754,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* poll() checks area context, but we don't accept full-area windows */
if(sc->full != SCREENNORMAL) {
if(event->type==EVT_ACTIONZONE_AREA)
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_CANCELLED;
}
@@ -682,7 +776,7 @@ static int area_dupli_invoke(bContext *C, wmOperator *op, wmEvent *event)
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
if(event->type==EVT_ACTIONZONE_AREA)
- actionzone_exit(C, op);
+ actionzone_exit(op);
return OPERATOR_FINISHED;
}
@@ -1076,7 +1170,7 @@ static int area_split_apply(bContext *C, wmOperator *op)
fac= RNA_float_get(op->ptr, "factor");
dir= RNA_enum_get(op->ptr, "direction");
- sd->narea= area_split(CTX_wm_window(C), sc, sd->sarea, dir, fac);
+ sd->narea= area_split(sc, sd->sarea, dir, fac, 0); /* 0 = no merge */
if(sd->narea) {
ScrVert *sv;
@@ -1283,19 +1377,19 @@ typedef struct RegionMoveData {
int bigger, smaller, origval;
int origx, origy;
int maxsize;
- char edge;
+ AZEdge edge;
} RegionMoveData;
-static int area_max_regionsize(ScrArea *sa, ARegion *scalear, char edge)
+static int area_max_regionsize(ScrArea *sa, ARegion *scalear, AZEdge edge)
{
ARegion *ar;
int dist;
- if(edge=='l' || edge=='r') {
+ if(edge==AE_RIGHT_TO_TOPLEFT || edge==AE_LEFT_TO_TOPRIGHT) {
dist = sa->totrct.xmax - sa->totrct.xmin;
- } else { /* t, b */
+ } else { /* AE_BOTTOM_TO_TOPLEFT, AE_TOP_TO_BOTTOMRIGHT */
dist = sa->totrct.ymax - sa->totrct.ymin;
}
@@ -1317,9 +1411,9 @@ static int area_max_regionsize(ScrArea *sa, ARegion *scalear, char edge)
/* case of regions in regions, like operator properties panel */
/* these can sit on top of other regions such as headers, so account for this */
- else if (edge == 'b' && scalear->alignment & RGN_ALIGN_TOP && ar->alignment == RGN_ALIGN_TOP && ar->regiontype == RGN_TYPE_HEADER)
+ else if (edge == AE_BOTTOM_TO_TOPLEFT && scalear->alignment & RGN_ALIGN_TOP && ar->alignment == RGN_ALIGN_TOP && ar->regiontype == RGN_TYPE_HEADER)
dist -= ar->winy;
- else if (edge == 't' && scalear->alignment & RGN_ALIGN_BOTTOM && ar->alignment == RGN_ALIGN_BOTTOM && ar->regiontype == RGN_TYPE_HEADER)
+ else if (edge == AE_TOP_TO_BOTTOMRIGHT && scalear->alignment & RGN_ALIGN_BOTTOM && ar->alignment == RGN_ALIGN_BOTTOM && ar->regiontype == RGN_TYPE_HEADER)
dist -= ar->winy;
}
@@ -1359,7 +1453,7 @@ static int region_scale_invoke(bContext *C, wmOperator *op, wmEvent *event)
rmd->ar->sizey= rmd->ar->type->prefsizey;
/* now copy to regionmovedata */
- if(rmd->edge=='l' || rmd->edge=='r') {
+ if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT) {
rmd->origval= rmd->ar->sizex;
} else {
rmd->origval= rmd->ar->sizey;
@@ -1391,9 +1485,9 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
switch(event->type) {
case MOUSEMOVE:
- if(rmd->edge=='l' || rmd->edge=='r') {
+ if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT) {
delta= event->x - rmd->origx;
- if(rmd->edge=='l') delta= -delta;
+ if(rmd->edge==AE_LEFT_TO_TOPRIGHT) delta= -delta;
rmd->ar->sizex= rmd->origval + delta;
CLAMP(rmd->ar->sizex, 0, rmd->maxsize);
@@ -1407,13 +1501,17 @@ static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
ED_region_toggle_hidden(C, rmd->ar);
}
else {
+ int maxsize=0;
delta= event->y - rmd->origy;
- if(rmd->edge=='b') delta= -delta;
+ if(rmd->edge==AE_BOTTOM_TO_TOPLEFT) delta= -delta;
rmd->ar->sizey= rmd->origval + delta;
CLAMP(rmd->ar->sizey, 0, rmd->maxsize);
- if(rmd->ar->sizey < 24) {
+ if(rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS)
+ maxsize = rmd->maxsize - ((rmd->sa->headertype==2)?48:24) - 10;
+
+ if(rmd->ar->sizey < 24 || (maxsize > 0 && (rmd->ar->sizey > maxsize)) ) {
rmd->ar->sizey= rmd->origval;
if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
ED_region_toggle_hidden(C, rmd->ar);
@@ -1505,15 +1603,32 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot)
static int frame_jump_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
-
- if (RNA_boolean_get(op->ptr, "end"))
- CFRA= PEFRA;
- else
- CFRA= PSFRA;
-
- sound_seek_scene(C);
+ wmTimer *animtimer= CTX_wm_screen(C)->animtimer;
+
+ /* Don't change CFRA directly if animtimer is running as this can cause
+ * first/last frame not to be actually shown (bad since for example physics
+ * simulations aren't reset properly).
+ */
+ if(animtimer) {
+ ScreenAnimData *sad = animtimer->customdata;
+
+ sad->flag |= ANIMPLAY_FLAG_USE_NEXT_FRAME;
+
+ if (RNA_boolean_get(op->ptr, "end"))
+ sad->nextfra= PEFRA;
+ else
+ sad->nextfra= PSFRA;
+ }
+ else {
+ if (RNA_boolean_get(op->ptr, "end"))
+ CFRA= PEFRA;
+ else
+ CFRA= PSFRA;
+
+ sound_seek_scene(C);
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ }
return OPERATOR_FINISHED;
}
@@ -1541,6 +1656,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
+ bDopeSheet ads= {0};
DLRBT_Tree keys;
ActKeyColumn *ak;
float cfra= (scene)? (float)(CFRA) : 0.0f;
@@ -1555,10 +1671,10 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
BLI_dlrbTree_init(&keys);
/* populate tree with keyframe nodes */
- if (scene && scene->adt)
- scene_to_keylist(NULL, scene, &keys, NULL);
- if (ob && ob->adt)
- ob_to_keylist(NULL, ob, &keys, NULL);
+ if (scene)
+ scene_to_keylist(&ads, scene, &keys, NULL);
+ if (ob)
+ ob_to_keylist(&ads, ob, &keys, NULL);
/* build linked-list for searching */
BLI_dlrbTree_linkedlist_sync(&keys);
@@ -1623,6 +1739,10 @@ static int screen_set_exec(bContext *C, wmOperator *op)
int tot= BLI_countlist(&CTX_data_main(C)->screen);
int delta= RNA_int_get(op->ptr, "delta");
+ /* temp screens are for userpref or render display */
+ if(screen->temp)
+ return OPERATOR_CANCELLED;
+
/* return to previous state before switching screens */
if(sa && sa->full)
ED_screen_full_restore(C, sa);
@@ -1671,7 +1791,7 @@ static void SCREEN_OT_screen_set(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
-static int screen_full_area_exec(bContext *C, wmOperator *op)
+static int screen_full_area_exec(bContext *C, wmOperator *UNUSED(op))
{
ED_screen_full_toggle(C, CTX_wm_window(C), CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -1878,7 +1998,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
if (sa) {
if (jd->sa1 != sa) {
- dir = area_getorientation(sc, jd->sa1, sa);
+ dir = area_getorientation(jd->sa1, sa);
if (dir >= 0) {
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
jd->sa2 = sa;
@@ -1889,7 +2009,7 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
we check if area has common border with the one marked for removal
in this case we can swap areas.
*/
- dir = area_getorientation(sc, sa, jd->sa2);
+ dir = area_getorientation(sa, jd->sa2);
if (dir >= 0) {
if (jd->sa1) jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
@@ -1915,13 +2035,13 @@ static int area_join_modal(bContext *C, wmOperator *op, wmEvent *event)
jd->sa2 = sa;
if (jd->sa1) jd->sa1->flag |= AREA_FLAG_DRAWJOINFROM;
if (jd->sa2) jd->sa2->flag |= AREA_FLAG_DRAWJOINTO;
- dir = area_getorientation(sc, jd->sa1, jd->sa2);
+ dir = area_getorientation(jd->sa1, jd->sa2);
if (dir < 0) {
printf("oops, didn't expect that!\n");
}
}
else {
- dir = area_getorientation(sc, jd->sa1, sa);
+ dir = area_getorientation(jd->sa1, sa);
if (dir >= 0) {
if (jd->sa2) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
jd->sa2 = sa;
@@ -1976,9 +2096,47 @@ static void SCREEN_OT_area_join(wmOperatorType *ot)
RNA_def_int(ot->srna, "max_y", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
}
+
+static int spacedata_cleanup(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ bScreen *screen;
+ ScrArea *sa;
+ int tot= 0;
+
+ for(screen= bmain->screen.first; screen; screen= screen->id.next) {
+ for(sa= screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacedata.first != sa->spacedata.last) {
+ SpaceLink *sl= sa->spacedata.first;
+
+ BLI_remlink(&sa->spacedata, sl);
+ tot+= BLI_countlist(&sa->spacedata);
+ BKE_spacedata_freelist(&sa->spacedata);
+ BLI_addtail(&sa->spacedata, sl);
+ }
+ }
+ }
+ BKE_reportf(op->reports, RPT_INFO, "Removed amount of editors: %d", tot);
+
+ return OPERATOR_FINISHED;
+}
+
+static void SCREEN_OT_spacedata_cleanup(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Clean-up space-data";
+ ot->description= "Remove unused settings for invisible editors";
+ ot->idname= "SCREEN_OT_spacedata_cleanup";
+
+ /* api callbacks */
+ ot->exec= spacedata_cleanup;
+ ot->poll= WM_operator_winactive;
+
+}
+
/* ************** repeat last operator ***************************** */
-static int repeat_last_exec(bContext *C, wmOperator *op)
+static int repeat_last_exec(bContext *C, wmOperator *UNUSED(op))
{
wmOperator *lastop= CTX_wm_manager(C)->operators.last;
@@ -2002,7 +2160,7 @@ static void SCREEN_OT_repeat_last(wmOperatorType *ot)
}
-static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *lastop;
@@ -2014,11 +2172,11 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(items==0)
return OPERATOR_CANCELLED;
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--)
- uiItemIntO(layout, lastop->type->name, 0, op->type->idname, "index", i);
+ uiItemIntO(layout, lastop->type->name, ICON_NULL, op->type->idname, "index", i);
uiPupMenuEnd(C, pup);
@@ -2059,7 +2217,7 @@ static void SCREEN_OT_repeat_history(wmOperatorType *ot)
/* ********************** redo operator ***************************** */
-static int redo_last_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int redo_last_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *lastop;
@@ -2178,7 +2336,7 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
/* api callbacks */
// ot->invoke= WM_operator_confirm;
ot->exec= region_quadview_exec;
- ot->poll= ED_operator_areaactive;
+ ot->poll= ED_operator_region_view3d_active;
ot->flag= 0;
}
@@ -2187,7 +2345,7 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
/* ************** region flip operator ***************************** */
/* flip a region alignment */
-static int region_flip_exec(bContext *C, wmOperator *op)
+static int region_flip_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
@@ -2225,7 +2383,7 @@ static void SCREEN_OT_region_flip(wmOperatorType *ot)
/* ************** header flip operator ***************************** */
/* flip a header region alignment */
-static int header_flip_exec(bContext *C, wmOperator *op)
+static int header_flip_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
@@ -2279,30 +2437,30 @@ static void SCREEN_OT_header_flip(wmOperatorType *ot)
/* ************** header tools operator ***************************** */
-static int header_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int header_toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Header", 0);
+ pup= uiPupMenuBegin(C, "Header", ICON_NULL);
layout= uiPupMenuLayout(pup);
// XXX SCREEN_OT_region_flip doesn't work - gets wrong context for active region, so added custom operator
if (ar->alignment == RGN_ALIGN_TOP)
- uiItemO(layout, "Flip to Bottom", 0, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Bottom", ICON_NULL, "SCREEN_OT_header_flip");
else
- uiItemO(layout, "Flip to Top", 0, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Top", ICON_NULL, "SCREEN_OT_header_flip");
uiItemS(layout);
/* file browser should be fullscreen all the time, but other regions can be maximised/restored... */
if (sa->spacetype != SPACE_FILE) {
if (sa->full)
- uiItemO(layout, "Tile Area", 0, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Tile Area", ICON_NULL, "SCREEN_OT_screen_full_area");
else
- uiItemO(layout, "Maximize Area", 0, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Maximize Area", ICON_NULL, "SCREEN_OT_screen_full_area");
}
uiPupMenuEnd(C, pup);
@@ -2310,7 +2468,7 @@ static int header_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void SCREEN_OT_header_toolbox(wmOperatorType *ot)
+static void SCREEN_OT_header_toolbox(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Header Toolbox";
@@ -2393,7 +2551,7 @@ static int match_region_with_redraws(int spacetype, int regiontype, int redraws)
return 0;
}
-static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
+static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
bScreen *screen= CTX_wm_screen(C);
@@ -2465,12 +2623,19 @@ static int screen_animation_step(bContext *C, wmOperator *op, wmEvent *event)
}
}
}
+
+ /* next frame overriden by user action (pressed jump to first/last frame) */
+ if(sad->flag & ANIMPLAY_FLAG_USE_NEXT_FRAME) {
+ scene->r.cfra = sad->nextfra;
+ sad->flag &= ~ANIMPLAY_FLAG_USE_NEXT_FRAME;
+ sad->flag |= ANIMPLAY_FLAG_JUMPED;
+ }
if (sad->flag & ANIMPLAY_FLAG_JUMPED)
sound_seek_scene(C);
/* since we follow drawflags, we can't send notifier but tag regions ourselves */
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, screen, 1);
for (sa= screen->areabase.first; sa; sa= sa->next) {
ARegion *ar;
@@ -2531,38 +2696,19 @@ int ED_screen_animation_play(bContext *C, int sync, int mode)
sound_stop_scene(scene);
}
else {
- ScrArea *sa= CTX_wm_area(C);
- int refresh= SPACE_TIME;
+ int refresh= SPACE_TIME; /* these settings are currently only available from a menu in the TimeLine */
if (mode == 1) // XXX only play audio forwards!?
sound_play_scene(scene);
- /* 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)) {
- redraws |= TIME_SEQ;
- }
-
- ED_screen_animation_timer(C, redraws, refresh, sync, mode);
+ ED_screen_animation_timer(C, screen->redraws_flag, refresh, sync, mode);
+
+ if (screen->animtimer) {
+ wmTimer *wt= screen->animtimer;
+ ScreenAnimData *sad= wt->customdata;
- if(screen->animtimer) {
- wmTimer *wt= screen->animtimer;
- ScreenAnimData *sad= wt->customdata;
-
- sad->ar= CTX_wm_region(C);
+ sad->ar= CTX_wm_region(C);
}
- }
}
return OPERATOR_FINISHED;
@@ -2595,11 +2741,11 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate");
}
-static int screen_animation_cancel_exec(bContext *C, wmOperator *op)
+static int screen_animation_cancel_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *screen= CTX_wm_screen(C);
- if(screen->animtimer) {
+ if (screen->animtimer) {
ScreenAnimData *sad= screen->animtimer->customdata;
Scene *scene= CTX_data_scene(C);
@@ -2723,9 +2869,8 @@ static void SCREEN_OT_back_to_previous(struct wmOperatorType *ot)
/* *********** show user pref window ****** */
-static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
+static int userpref_show_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
- ScrArea *sa;
rcti rect;
int sizex, sizey;
@@ -2741,9 +2886,6 @@ static int userpref_show_invoke(bContext *C, wmOperator *unused, wmEvent *event)
/* changes context! */
WM_window_open_temp(C, &rect, WM_WINDOW_USERPREFS);
- sa= CTX_wm_area(C);
-
-
return OPERATOR_FINISHED;
}
@@ -2762,7 +2904,7 @@ static void SCREEN_OT_userpref_show(struct wmOperatorType *ot)
/********************* new screen operator *********************/
-static int screen_new_exec(bContext *C, wmOperator *op)
+static int screen_new_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *win= CTX_wm_window(C);
bScreen *sc= CTX_wm_screen(C);
@@ -2773,7 +2915,7 @@ static int screen_new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_new(wmOperatorType *ot)
+static void SCREEN_OT_new(wmOperatorType *ot)
{
/* identifiers */
ot->name= "New Screen";
@@ -2789,7 +2931,7 @@ void SCREEN_OT_new(wmOperatorType *ot)
/********************* delete screen operator *********************/
-static int screen_delete_exec(bContext *C, wmOperator *op)
+static int screen_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *sc= CTX_wm_screen(C);
@@ -2798,7 +2940,7 @@ static int screen_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCREEN_OT_delete(wmOperatorType *ot)
+static void SCREEN_OT_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Screen"; //was scene
@@ -2820,7 +2962,7 @@ static int scene_new_exec(bContext *C, wmOperator *op)
Main *bmain= CTX_data_main(C);
int type= RNA_enum_get(op->ptr, "type");
- newscene= copy_scene(bmain, scene, type);
+ newscene= copy_scene(scene, type);
/* these can't be handled in blenkernel curently, so do them here */
if(type == SCE_COPY_LINK_DATA)
@@ -2833,7 +2975,7 @@ static int scene_new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCENE_OT_new(wmOperatorType *ot)
+static void SCENE_OT_new(wmOperatorType *ot)
{
static EnumPropertyItem type_items[]= {
{SCE_COPY_EMPTY, "EMPTY", 0, "Empty", "Add empty scene"},
@@ -2860,7 +3002,7 @@ void SCENE_OT_new(wmOperatorType *ot)
/********************* delete scene operator *********************/
-static int scene_delete_exec(bContext *C, wmOperator *op)
+static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2869,7 +3011,7 @@ static int scene_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SCENE_OT_delete(wmOperatorType *ot)
+static void SCENE_OT_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Scene";
@@ -2885,6 +3027,7 @@ void SCENE_OT_delete(wmOperatorType *ot)
/* **************** Assigning operatortypes to global list, adding handlers **************** */
+
/* called in spacetypes.c */
void ED_operatortypes_screen(void)
{
@@ -2908,6 +3051,7 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_screen_set);
WM_operatortype_append(SCREEN_OT_screen_full_area);
WM_operatortype_append(SCREEN_OT_back_to_previous);
+ WM_operatortype_append(SCREEN_OT_spacedata_cleanup);
WM_operatortype_append(SCREEN_OT_screenshot);
WM_operatortype_append(SCREEN_OT_screencast);
WM_operatortype_append(SCREEN_OT_userpref_show);
@@ -2929,6 +3073,7 @@ void ED_operatortypes_screen(void)
/* tools shared by more space types */
WM_operatortype_append(ED_OT_undo);
+ WM_operatortype_append(ED_OT_undo_push);
WM_operatortype_append(ED_OT_redo);
}
@@ -2958,9 +3103,27 @@ static void keymap_modal_set(wmKeyConfig *keyconf)
}
+static int open_file_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
+{
+ if(drag->type==WM_DRAG_PATH) {
+ if(drag->icon==ICON_FILE_BLEND)
+ return 1;
+ }
+ return 0;
+}
+
+static void open_file_drop_copy(wmDrag *drag, wmDropBox *drop)
+{
+ /* copy drag path to properties */
+ RNA_string_set(drop->ptr, "filepath", drag->path);
+ drop->opcontext= WM_OP_EXEC_DEFAULT;
+}
+
+
/* called in spacetypes.c */
void ED_keymap_screen(wmKeyConfig *keyconf)
{
+ ListBase *lb;
wmKeyMap *keymap;
//wmKeyMapItem *kmi;
@@ -3074,6 +3237,10 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", DOWNARROWKEY, KM_PRESS, KM_ALT, 0);
#endif
+ /* dropbox for entire window */
+ lb= WM_dropboxmap_find("Window", 0, 0);
+ WM_dropbox_add(lb, "WM_OT_open_mainfile", open_file_drop_poll, open_file_drop_copy);
+
keymap_modal_set(keyconf);
}
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 56efa0a5a83..7ac73eb8c14 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -42,6 +43,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_image.h"
#include "BKE_report.h"
#include "BKE_writeavi.h"
@@ -69,29 +71,31 @@ static int screenshot_exec(bContext *C, wmOperator *op)
{
ScreenshotData *scd= op->customdata;
- if(scd && scd->dumprect) {
- Scene *scene= CTX_data_scene(C);
- ImBuf *ibuf;
- char path[FILE_MAX];
-
- RNA_string_get(op->ptr, "filepath", path);
-
- strcpy(G.ima, path);
- BLI_path_abs(path, G.sce);
+ if(scd) {
+ if(scd->dumprect) {
+ Scene *scene= CTX_data_scene(C);
+ ImBuf *ibuf;
+ char path[FILE_MAX];
- /* BKE_add_image_extension() checks for if extension was already set */
- if(scene->r.scemode & R_EXTENSION)
- if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
- BKE_add_image_extension(path, scene->r.imtype);
+ RNA_string_get(op->ptr, "filepath", path);
- ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0, 0);
- ibuf->rect= scd->dumprect;
-
- BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
+ strcpy(G.ima, path);
+ BLI_path_abs(path, G.main->name);
+
+ /* BKE_add_image_extension() checks for if extension was already set */
+ if(scene->r.scemode & R_EXTENSION)
+ if(strlen(path)<FILE_MAXDIR+FILE_MAXFILE-5)
+ BKE_add_image_extension(path, scene->r.imtype);
+
+ ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0);
+ ibuf->rect= scd->dumprect;
+
+ BKE_write_ibuf(scene, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality);
- IMB_freeImBuf(ibuf);
+ IMB_freeImBuf(ibuf);
- MEM_freeN(scd->dumprect);
+ MEM_freeN(scd->dumprect);
+ }
MEM_freeN(scd);
op->customdata= NULL;
}
@@ -132,7 +136,7 @@ static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int fscre
}
-static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
unsigned int *dumprect;
int dumpsx, dumpsy;
@@ -158,6 +162,18 @@ static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
+static int screenshot_cancel(bContext *UNUSED(C), wmOperator *op)
+{
+ ScreenshotData *scd= op->customdata;
+
+ if(scd) {
+ if(scd->dumprect)
+ MEM_freeN(scd->dumprect);
+ MEM_freeN(scd);
+ op->customdata= NULL;
+ }
+ return OPERATOR_CANCELLED;
+}
void SCREEN_OT_screenshot(wmOperatorType *ot)
{
@@ -167,6 +183,7 @@ void SCREEN_OT_screenshot(wmOperatorType *ot)
ot->invoke= screenshot_invoke;
ot->exec= screenshot_exec;
ot->poll= WM_operator_winactive;
+ ot->cancel= screenshot_cancel;
ot->flag= 0;
@@ -214,7 +231,7 @@ static void screenshot_updatejob(void *sjv)
/* only this runs inside thread */
-static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *progress)
+static void screenshot_startjob(void *sjv, short *stop, short *do_update, float *UNUSED(progress))
{
ScreenshotJob *sj= sjv;
RenderData rd= sj->scene->r;
@@ -251,11 +268,11 @@ static void screenshot_startjob(void *sjv, short *stop, short *do_update, float
break;
}
else {
- ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.planes, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(sj->dumpsx, sj->dumpsy, rd.planes, 0);
char name[FILE_MAXDIR+FILE_MAXFILE];
int ok;
- BKE_makepicstring(name, rd.pic, cfra, rd.imtype, rd.scemode & R_EXTENSION);
+ BKE_makepicstring(name, rd.pic, cfra, rd.imtype, rd.scemode & R_EXTENSION, TRUE);
ibuf->rect= sj->dumprect;
ok= BKE_write_ibuf(sj->scene, ibuf, name, rd.imtype, rd.subimtype, rd.quality);
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt
index f0493d8e2d8..a22ed87c182 100644
--- a/source/blender/editors/sculpt_paint/CMakeLists.txt
+++ b/source/blender/editors/sculpt_paint/CMakeLists.txt
@@ -19,23 +19,32 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../imbuf
../../gpu
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
../../render/extern/include
+ ../../../../intern/guardedalloc
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ paint_image.c
+ paint_ops.c
+ paint_stroke.c
+ paint_undo.c
+ paint_utils.c
+ paint_vertex.c
+ sculpt.c
+ sculpt_undo.c
+
+ paint_intern.h
+ sculpt_intern.h
+)
-BLENDERLIB(bf_editor_sculpt_paint "${SRC}" "${INC}")
+blender_add_lib(bf_editor_sculpt_paint "${SRC}" "${INC}")
diff --git a/source/blender/editors/sculpt_paint/Makefile b/source/blender/editors/sculpt_paint/Makefile
deleted file mode 100644
index f9f39fea7eb..00000000000
--- a/source/blender/editors/sculpt_paint/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sculpt_paint
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/sculpt_paint/SConscript b/source/blender/editors/sculpt_paint/SConscript
index b9cc294d44d..6c1fe79d8bc 100644
--- a/source/blender/editors/sculpt_paint/SConscript
+++ b/source/blender/editors/sculpt_paint/SConscript
@@ -8,11 +8,15 @@ defs = []
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../render/extern/include'
+<<<<<<< .working
incs += ' ../../gpu ../../makesrna ../../bmesh'
+=======
+incs += ' ../../gpu ../../makesrna ../../blenloader'
+>>>>>>> .merge-right.r35190
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] == 'linuxcross':
if env['WITH_BF_OPENMP']:
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 35924ad9afb..72eb72e19f0 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* imagepaint.c
*
@@ -44,8 +44,10 @@
#include "BLI_dynstr.h"
#include "BLI_linklist.h"
#include "BLI_memarena.h"
-#include "PIL_time.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
+#include "PIL_time.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -163,17 +165,17 @@ typedef struct ImagePaintRegion {
#define PROJ_DEBUG_WINCLIP 1
/* projectFaceSeamFlags options */
-//#define PROJ_FACE_IGNORE 1<<0 /* When the face is hidden, backfacing or occluded */
-//#define PROJ_FACE_INIT 1<<1 /* When we have initialized the faces data */
-#define PROJ_FACE_SEAM1 1<<0 /* If this face has a seam on any of its edges */
-#define PROJ_FACE_SEAM2 1<<1
-#define PROJ_FACE_SEAM3 1<<2
-#define PROJ_FACE_SEAM4 1<<3
-
-#define PROJ_FACE_NOSEAM1 1<<4
-#define PROJ_FACE_NOSEAM2 1<<5
-#define PROJ_FACE_NOSEAM3 1<<6
-#define PROJ_FACE_NOSEAM4 1<<7
+//#define PROJ_FACE_IGNORE (1<<0) /* When the face is hidden, backfacing or occluded */
+//#define PROJ_FACE_INIT (1<<1) /* When we have initialized the faces data */
+#define PROJ_FACE_SEAM1 (1<<0) /* If this face has a seam on any of its edges */
+#define PROJ_FACE_SEAM2 (1<<1)
+#define PROJ_FACE_SEAM3 (1<<2)
+#define PROJ_FACE_SEAM4 (1<<3)
+
+#define PROJ_FACE_NOSEAM1 (1<<4)
+#define PROJ_FACE_NOSEAM2 (1<<5)
+#define PROJ_FACE_NOSEAM3 (1<<6)
+#define PROJ_FACE_NOSEAM4 (1<<7)
#define PROJ_SRC_VIEW 1
#define PROJ_SRC_IMAGE_CAM 2
@@ -189,8 +191,8 @@ typedef struct ImagePaintRegion {
#define PROJ_FACE_SCALE_SEAM 0.99f
#define PROJ_BUCKET_NULL 0
-#define PROJ_BUCKET_INIT 1<<0
-// #define PROJ_BUCKET_CLONE_INIT 1<<1
+#define PROJ_BUCKET_INIT (1<<0)
+// #define PROJ_BUCKET_CLONE_INIT (1<<1)
/* used for testing doubles, if a point is on a line etc */
#define PROJ_GEOM_TOLERANCE 0.00075f
@@ -383,7 +385,7 @@ static void *image_undo_push_tile(Image *ima, ImBuf *ibuf, ImBuf **tmpibuf, int
return tile->rect;
if (*tmpibuf==NULL)
- *tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect, 0);
+ *tmpibuf = IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32, IB_rectfloat|IB_rect);
tile= MEM_callocN(sizeof(UndoImageTile), "UndoImageTile");
strcpy(tile->idname, ima->id.name);
@@ -410,7 +412,7 @@ static void image_undo_restore(bContext *C, ListBase *lb)
UndoImageTile *tile;
tmpibuf= IMB_allocImBuf(IMAPAINT_TILE_SIZE, IMAPAINT_TILE_SIZE, 32,
- IB_rectfloat|IB_rect, 0);
+ IB_rectfloat|IB_rect);
for(tile=lb->first; tile; tile=tile->next) {
/* find image based on name, pointer becomes invalid with global undo */
@@ -430,7 +432,8 @@ static void image_undo_restore(bContext *C, ListBase *lb)
GPU_free_image(ima); /* force OpenGL reload */
if(ibuf->rect_float)
- imb_freerectImBuf(ibuf); /* force recreate of char rect */
+ ibuf->userflags |= IB_RECT_INVALID; /* force recreate of char rect */
+
}
IMB_freeImBuf(tmpibuf);
@@ -473,8 +476,6 @@ static int project_bucket_offset_safe(const ProjPaintState *ps, const float proj
}
}
-#define SIDE_OF_LINE(pa, pb, pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
-
/* still use 2D X,Y space but this works for verts transformed by a perspective matrix, using their 4th component as a weight */
static void barycentric_weights_v2_persp(float v1[4], float v2[4], float v3[4], float co[2], float w[3])
{
@@ -639,9 +640,8 @@ static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], float
}
}
else {
- xi = (int)((uv[0]*ibuf->x) + 0.5f);
- yi = (int)((uv[1]*ibuf->y) + 0.5f);
-
+ //xi = (int)((uv[0]*ibuf->x) + 0.5f);
+ //yi = (int)((uv[1]*ibuf->y) + 0.5f);
//if (xi<0 || xi>=ibuf->x || yi<0 || yi>=ibuf->y) return 0;
/* wrap */
@@ -936,7 +936,7 @@ static int pixel_bounds_array(float (* uv)[2], rcti *bounds_px, const int ibuf_x
#ifndef PROJ_DEBUG_NOSEAMBLEED
-/* This function returns 1 if this face has a seam along the 2 face-vert indicies
+/* This function returns 1 if this face has a seam along the 2 face-vert indices
* 'orig_i1_fidx' and 'orig_i2_fidx' */
static int check_seam(const ProjPaintState *ps, const int orig_face, const int orig_i1_fidx, const int orig_i2_fidx, int *other_face, int *orig_fidx)
{
@@ -949,7 +949,7 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
const MFace *orig_mf = ps->dm_mface + orig_face;
const MTFace *orig_tf = ps->dm_mtface + orig_face;
- /* vert indicies from face vert order indicies */
+ /* vert indices from face vert order indices */
i1 = (*(&orig_mf->v1 + orig_i1_fidx));
i2 = (*(&orig_mf->v1 + orig_i2_fidx));
@@ -1013,8 +1013,11 @@ static void uv_image_outset(float (*orig_uv)[2], float (*outset_uv)[2], const fl
float puv[4][2]; /* pixelspace uv's */
float no1[2], no2[2], no3[2], no4[2]; /* normals */
float dir1[2], dir2[2], dir3[2], dir4[2];
- float ibuf_inv[2] = {1.0f / (float)ibuf_x, 1.0f / (float)ibuf_y};
-
+ float ibuf_inv[2];
+
+ ibuf_inv[0]= 1.0f / (float)ibuf_x;
+ ibuf_inv[1]= 1.0f / (float)ibuf_y;
+
/* make UV's in pixel space so we can */
puv[0][0] = orig_uv[0][0] * ibuf_x;
puv[0][1] = orig_uv[0][1] * ibuf_y;
@@ -1139,6 +1142,7 @@ static void project_face_seams_init(const ProjPaintState *ps, const int face_ind
/* TODO - move to arithb.c */
/* little sister we only need to know lambda */
+#ifndef PROJ_DEBUG_NOSEAMBLEED
static float lambda_cp_line2(const float p[2], const float l1[2], const float l2[2])
{
float h[2], u[2];
@@ -1151,6 +1155,7 @@ static float lambda_cp_line2(const float p[2], const float l1[2], const float l2
return(dot_v2v2(u, h)/dot_v2v2(u, u));
}
+#endif // PROJ_DEBUG_NOSEAMBLEED
/* Converts a UV location to a 3D screenspace location
@@ -1233,7 +1238,7 @@ static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const
}
/* run this outside project_paint_uvpixel_init since pixels with mask 0 dont need init */
-float project_paint_uvpixel_mask(
+static float project_paint_uvpixel_mask(
const ProjPaintState *ps,
const int face_index,
const int side,
@@ -1623,6 +1628,7 @@ static int line_clip_rect2f(
/* scale the quad & tri about its center
* scaling by PROJ_FACE_SCALE_SEAM (0.99x) is used for getting fake UV pixel coords that are on the
* edge of the face but slightly inside it occlusion tests dont return hits on adjacent faces */
+#ifndef PROJ_DEBUG_NOSEAMBLEED
static void scale_quad(float insetCos[4][3], float *origCos[4], const float inset)
{
float cent[3];
@@ -1666,7 +1672,7 @@ static void scale_tri(float insetCos[4][3], float *origCos[4], const float inset
add_v3_v3(insetCos[1], cent);
add_v3_v3(insetCos[2], cent);
}
-
+#endif //PROJ_DEBUG_NOSEAMBLEED
static float Vec2Lenf_nosqrt(const float *v1, const float *v2)
{
@@ -1689,7 +1695,7 @@ static float Vec2Lenf_nosqrt_other(const float *v1, const float v2_1, const floa
/* note, use a squared value so we can use Vec2Lenf_nosqrt
* be sure that you have done a bounds check first or this may fail */
/* only give bucket_bounds as an arg because we need it elsewhere */
-static int project_bucket_isect_circle(const int bucket_x, const int bucket_y, const float cent[2], const float radius_squared, rctf *bucket_bounds)
+static int project_bucket_isect_circle(const float cent[2], const float radius_squared, rctf *bucket_bounds)
{
/* Would normally to a simple intersection test, however we know the bounds of these 2 already intersect
@@ -1852,7 +1858,7 @@ static void project_bucket_clip_face(
{
int inside_bucket_flag = 0;
int inside_face_flag = 0;
- const int flip = ((SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) > 0.0f) != (SIDE_OF_LINE(uv1co, uv2co, uv3co) > 0.0f));
+ const int flip = ((line_point_side_v2(v1coSS, v2coSS, v3coSS) > 0.0f) != (line_point_side_v2(uv1co, uv2co, uv3co) > 0.0f));
float bucket_bounds_ss[4][2];
@@ -2134,15 +2140,15 @@ if __name__ == '__main__':
/* checks if pt is inside a convex 2D polyline, the polyline must be ordered rotating clockwise
- * otherwise it would have to test for mixed (SIDE_OF_LINE > 0.0f) cases */
-int IsectPoly2Df(const float pt[2], float uv[][2], const int tot)
+ * otherwise it would have to test for mixed (line_point_side_v2 > 0.0f) cases */
+static int IsectPoly2Df(const float pt[2], float uv[][2], const int tot)
{
int i;
- if (SIDE_OF_LINE(uv[tot-1], uv[0], pt) < 0.0f)
+ if (line_point_side_v2(uv[tot-1], uv[0], pt) < 0.0f)
return 0;
for (i=1; i<tot; i++) {
- if (SIDE_OF_LINE(uv[i-1], uv[i], pt) < 0.0f)
+ if (line_point_side_v2(uv[i-1], uv[i], pt) < 0.0f)
return 0;
}
@@ -2152,10 +2158,10 @@ int IsectPoly2Df(const float pt[2], float uv[][2], const int tot)
static int IsectPoly2Df_twoside(const float pt[2], float uv[][2], const int tot)
{
int i;
- int side = (SIDE_OF_LINE(uv[tot-1], uv[0], pt) > 0.0f);
+ int side = (line_point_side_v2(uv[tot-1], uv[0], pt) > 0.0f);
for (i=1; i<tot; i++) {
- if ((SIDE_OF_LINE(uv[i-1], uv[i], pt) > 0.0f) != side)
+ if ((line_point_side_v2(uv[i-1], uv[i], pt) > 0.0f) != side)
return 0;
}
@@ -2196,7 +2202,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
float tf_uv_pxoffset[4][2]; /* bucket bounds in UV space so we can init pixels only for this face, */
float xhalfpx, yhalfpx;
- const float ibuf_xf = ibuf->x, ibuf_yf = ibuf->y;
+ const float ibuf_xf = (float)ibuf->x, ibuf_yf = (float)ibuf->y;
int has_x_isect = 0, has_isect = 0; /* for early loop exit */
@@ -2496,26 +2502,32 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
/* Only bother calculating the weights if we intersect */
if (ps->do_mask_normal || ps->dm_mtface_clone) {
-#if 0
- /* This is not QUITE correct since UV is not inside the UV's but good enough for seams */
+#if 1
+ /* get the UV on the line since we want to copy the pixels from there for bleeding */
+ float uv_close[2];
+ float fac= closest_to_line_v2(uv_close, uv, tf_uv_pxoffset[fidx1], tf_uv_pxoffset[fidx2]);
+ if (fac < 0.0f) copy_v2_v2(uv_close, tf_uv_pxoffset[fidx1]);
+ else if (fac > 1.0f) copy_v2_v2(uv_close, tf_uv_pxoffset[fidx2]);
+
if (side) {
- barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[2], tf_uv_pxoffset[3], uv, w);
+ barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[2], tf_uv_pxoffset[3], uv_close, w);
}
else {
- barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[1], tf_uv_pxoffset[2], uv, w);
+ barycentric_weights_v2(tf_uv_pxoffset[0], tf_uv_pxoffset[1], tf_uv_pxoffset[2], uv_close, w);
}
-#endif
-#if 1
+#else /* this is buggy with quads, dont use for now */
+
/* Cheat, we know where we are along the edge so work out the weights from that */
fac = fac1 + (fac * (fac2-fac1));
+
w[0]=w[1]=w[2]= 0.0;
if (side) {
- w[fidx1?fidx1-1:0] = fac;
- w[fidx2?fidx2-1:0] = 1.0f-fac;
+ w[fidx1?fidx1-1:0] = 1.0f-fac;
+ w[fidx2?fidx2-1:0] = fac;
}
else {
- w[fidx1] = fac;
- w[fidx2] = 1.0f-fac;
+ w[fidx1] = 1.0f-fac;
+ w[fidx2] = fac;
}
#endif
}
@@ -2565,7 +2577,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
}
-/* takes floating point screenspace min/max and returns int min/max to be used as indicies for ps->bucketRect, ps->bucketFlags */
+/* takes floating point screenspace min/max and returns int min/max to be used as indices for ps->bucketRect, ps->bucketFlags */
static void project_paint_bucket_bounds(const ProjPaintState *ps, const float min[2], const float max[2], int bucketMin[2], int bucketMax[2])
{
/* divide by bucketWidth & bucketHeight so the bounds are offset in bucket grid units */
@@ -2652,7 +2664,7 @@ static void project_bucket_init(const ProjPaintState *ps, const int thread_index
* calculated when it might not be needed later, (at the moment at least)
* obviously it shouldn't have bugs though */
-static int project_bucket_face_isect(ProjPaintState *ps, float min[2], float max[2], int bucket_x, int bucket_y, int bucket_index, const MFace *mf)
+static int project_bucket_face_isect(ProjPaintState *ps, int bucket_x, int bucket_y, const MFace *mf)
{
/* TODO - replace this with a tricker method that uses sideofline for all screenCoords's edges against the closest bucket corner */
rctf bucket_bounds;
@@ -2712,11 +2724,11 @@ static int project_bucket_face_isect(ProjPaintState *ps, float min[2], float max
/* Add faces to the bucket but dont initialize its pixels
* TODO - when painting occluded, sort the faces on their min-Z and only add faces that faces that are not occluded */
-static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf, const MTFace *tf, const int face_index)
+static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf, const int face_index)
{
float min[2], max[2], *vCoSS;
int bucketMin[2], bucketMax[2]; /* for ps->bucketRect indexing */
- int fidx, bucket_x, bucket_y, bucket_index;
+ int fidx, bucket_x, bucket_y;
int has_x_isect = -1, has_isect = 0; /* for early loop exit */
MemArena *arena = ps->arena_mt[0]; /* just use the first thread arena since threading has not started yet */
@@ -2733,10 +2745,8 @@ static void project_paint_delayed_face_init(ProjPaintState *ps, const MFace *mf,
for (bucket_y = bucketMin[1]; bucket_y < bucketMax[1]; bucket_y++) {
has_x_isect = 0;
for (bucket_x = bucketMin[0]; bucket_x < bucketMax[0]; bucket_x++) {
-
- bucket_index = bucket_x + (bucket_y * ps->buckets_x);
-
- if (project_bucket_face_isect(ps, min, max, bucket_x, bucket_y, bucket_index, mf)) {
+ if (project_bucket_face_isect(ps, bucket_x, bucket_y, mf)) {
+ int bucket_index= bucket_x + (bucket_y * ps->buckets_x);
BLI_linklist_prepend_arena(
&ps->bucketFaces[ bucket_index ],
SET_INT_IN_POINTER(face_index), /* cast to a pointer to shut up the compiler */
@@ -2820,7 +2830,7 @@ static void project_paint_begin(ProjPaintState *ps)
/* Workaround for subsurf selection, try the display mesh first */
if (ps->source==PROJ_SRC_IMAGE_CAM) {
/* using render mesh, assume only camera was rendered from */
- ps->dm = mesh_create_derived_render(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE);
+ ps->dm = mesh_create_derived_render(ps->scene, ps->ob, ps->scene->customdata_mask | CD_MASK_MTFACE);
ps->dm_release= TRUE;
}
else if(ps->ob->derivedFinal && CustomData_has_layer( &ps->ob->derivedFinal->faceData, CD_MTFACE)) {
@@ -2828,7 +2838,7 @@ static void project_paint_begin(ProjPaintState *ps)
ps->dm_release= FALSE;
}
else {
- ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->v3d->customdata_mask | CD_MASK_MTFACE);
+ ps->dm = mesh_get_derived_final(ps->scene, ps->ob, ps->scene->customdata_mask | CD_MASK_MTFACE);
ps->dm_release= TRUE;
}
@@ -3196,7 +3206,7 @@ static void project_paint_begin(ProjPaintState *ps)
}
}
else {
- if (SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) < 0.0f) {
+ if (line_point_side_v2(v1coSS, v2coSS, v3coSS) < 0.0f) {
continue;
}
@@ -3219,7 +3229,7 @@ static void project_paint_begin(ProjPaintState *ps)
if (image_index != -1) {
/* Initialize the faces screen pixels */
/* Add this to a list to initialize later */
- project_paint_delayed_face_init(ps, mf, tf, face_index);
+ project_paint_delayed_face_init(ps, mf, face_index);
}
}
}
@@ -3502,7 +3512,7 @@ static int project_bucket_iter_next(ProjPaintState *ps, int *bucket_index, rctf
project_bucket_bounds(ps, ps->context_bucket_x, ps->context_bucket_y, bucket_bounds);
if ( (ps->source != PROJ_SRC_VIEW) ||
- project_bucket_isect_circle(ps->context_bucket_x, ps->context_bucket_y, mval, (float)(diameter*diameter), bucket_bounds)
+ project_bucket_isect_circle(mval, (float)(diameter*diameter), bucket_bounds)
) {
*bucket_index = ps->context_bucket_x + (ps->context_bucket_y * ps->buckets_x);
ps->context_bucket_x++;
@@ -3571,7 +3581,7 @@ static void blend_color_mix_accum(unsigned char *cp, const unsigned char *cp1, c
cp[3]= alpha > 255 ? 255 : alpha;
}
-static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask)
+static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask)
{
if (ps->is_airbrush==0 && mask < 1.0f) {
projPixel->newColor.uint = IMB_blend_color(projPixel->newColor.uint, ((ProjPixelClone*)projPixel)->clonepx.uint, (int)(alpha*255), ps->blend);
@@ -3582,7 +3592,7 @@ static void do_projectpaint_clone(ProjPaintState *ps, ProjPixel *projPixel, floa
}
}
-static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask)
+static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask)
{
if (ps->is_airbrush==0 && mask < 1.0f) {
IMB_blend_color_float(projPixel->newColor.f, projPixel->newColor.f, ((ProjPixelClone *)projPixel)->clonepx.f, alpha, ps->blend);
@@ -3599,7 +3609,7 @@ static void do_projectpaint_clone_f(ProjPaintState *ps, ProjPixel *projPixel, fl
* accumulation of color greater then 'projPixel->mask' however in the case of smear its not
* really that important to be correct as it is with clone and painting
*/
-static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels, float co[2])
+static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels, float co[2])
{
unsigned char rgba_ub[4];
@@ -3610,7 +3620,7 @@ static void do_projectpaint_smear(ProjPaintState *ps, ProjPixel *projPixel, floa
BLI_linklist_prepend_arena(smearPixels, (void *)projPixel, smearArena);
}
-static void do_projectpaint_smear_f(ProjPaintState *ps, ProjPixel *projPixel, float *rgba, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels_f, float co[2])
+static void do_projectpaint_smear_f(ProjPaintState *ps, ProjPixel *projPixel, float alpha, float mask, MemArena *smearArena, LinkNode **smearPixels_f, float co[2])
{
unsigned char rgba_ub[4];
unsigned char rgba_smear[4];
@@ -3759,7 +3769,8 @@ static void *do_projectpaint_thread(void *ph_v)
if (falloff > 0.0f) {
if (ps->is_texbrush) {
- brush_sample_tex(ps->brush, projPixel->projCoSS, rgba);
+ /* note, for clone and smear, we only use the alpha, could be a special function */
+ brush_sample_tex(ps->brush, projPixel->projCoSS, rgba, thread_index);
alpha = rgba[3];
} else {
alpha = 1.0f;
@@ -3810,20 +3821,20 @@ static void *do_projectpaint_thread(void *ph_v)
case PAINT_TOOL_CLONE:
if (is_floatbuf) {
if (((ProjPixelClone *)projPixel)->clonepx.f[3]) {
- do_projectpaint_clone_f(ps, projPixel, rgba, alpha, mask);
+ do_projectpaint_clone_f(ps, projPixel, alpha, mask); /* rgba isnt used for cloning, only alpha */
}
}
else {
if (((ProjPixelClone*)projPixel)->clonepx.ch[3]) {
- do_projectpaint_clone(ps, projPixel, rgba, alpha, mask);
+ do_projectpaint_clone(ps, projPixel, alpha, mask); /* rgba isnt used for cloning, only alpha */
}
}
break;
case PAINT_TOOL_SMEAR:
sub_v2_v2v2(co, projPixel->projCoSS, pos_ofs);
- if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels_f, co);
- else do_projectpaint_smear(ps, projPixel, rgba, alpha, mask, smearArena, &smearPixels, co);
+ if (is_floatbuf) do_projectpaint_smear_f(ps, projPixel, alpha, mask, smearArena, &smearPixels_f, co);
+ else do_projectpaint_smear(ps, projPixel, alpha, mask, smearArena, &smearPixels, co);
break;
default:
if (is_floatbuf) do_projectpaint_draw_f(ps, projPixel, rgba, alpha, mask);
@@ -3863,7 +3874,7 @@ static void *do_projectpaint_thread(void *ph_v)
return NULL;
}
-static int project_paint_op(void *state, ImBuf *ibufb, float *lastpos, float *pos)
+static int project_paint_op(void *state, ImBuf *UNUSED(ibufb), float *lastpos, float *pos)
{
/* First unpack args from the struct */
ProjPaintState *ps = (ProjPaintState *)state;
@@ -3930,7 +3941,7 @@ static int project_paint_op(void *state, ImBuf *ibufb, float *lastpos, float *po
}
-static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, int *prevmval_i, int *mval_i, double time, float pressure)
+static int project_paint_sub_stroke(ProjPaintState *ps, BrushPainter *painter, int *UNUSED(prevmval_i), int *mval_i, double time, float pressure)
{
/* Use mouse coords as floats for projection painting */
@@ -3966,7 +3977,7 @@ static int project_paint_stroke(ProjPaintState *ps, BrushPainter *painter, int *
/* Imagepaint Partial Redraw & Dirty Region */
-static void imapaint_clear_partial_redraw()
+static void imapaint_clear_partial_redraw(void)
{
memset(&imapaintpartial, 0, sizeof(imapaintpartial));
}
@@ -4014,9 +4025,10 @@ static void imapaint_image_update(SpaceImage *sima, Image *image, ImBuf *ibuf, s
{
if(ibuf->rect_float)
/* TODO - should just update a portion from imapaintpartial! */
- imb_freerectImBuf(ibuf); /* force recreate of char rect */
+ ibuf->userflags |= IB_RECT_INVALID; /* force recreate of char rect */
+
if(ibuf->mipmap[0])
- imb_freemipmapImBuf(ibuf);
+ ibuf->userflags |= IB_MIPMAP_INVALID;
/* todo: should set_tpage create ->rect? */
if(texpaint || (sima && sima->lock)) {
@@ -4183,7 +4195,7 @@ static void imapaint_lift_smear(ImBuf *ibuf, ImBuf *ibufb, int *pos)
int a, tot;
imapaint_set_region(region, 0, 0, pos[0], pos[1], ibufb->x, ibufb->y);
- tot= imapaint_torus_split_region(region, ibuf, ibufb);
+ tot= imapaint_torus_split_region(region, ibufb, ibuf);
for(a=0; a<tot; a++)
IMB_rectblend(ibufb, ibuf, region[a].destx, region[a].desty,
@@ -4196,7 +4208,7 @@ static ImBuf *imapaint_lift_clone(ImBuf *ibuf, ImBuf *ibufb, int *pos)
/* note: allocImbuf returns zero'd memory, so regions outside image will
have zero alpha, and hence not be blended onto the image */
int w=ibufb->x, h=ibufb->y, destx=0, desty=0, srcx=pos[0], srcy=pos[1];
- ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->depth, ibufb->flags, 0);
+ ImBuf *clonebuf= IMB_allocImBuf(w, h, ibufb->depth, ibufb->flags);
IMB_rectclip(clonebuf, ibuf, &destx, &desty, &srcx, &srcy, &w, &h);
IMB_rectblend(clonebuf, ibuf, destx, desty, srcx, srcy, w, h,
@@ -4389,7 +4401,7 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
ibuf= BKE_image_get_ibuf(newimage, s->sima? &s->sima->iuser: NULL);
if(ibuf && ibuf->rect)
- imapaint_pick_uv(s->scene, s->ob, s->me, newfaceindex, mval, newuv);
+ imapaint_pick_uv(s->scene, s->ob, newfaceindex, mval, newuv);
else {
newimage = NULL;
newuv[0] = newuv[1] = 0.0f;
@@ -4400,8 +4412,8 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
/* see if stroke is broken, and if so finish painting in old position */
if (s->image) {
- imapaint_pick_uv(s->scene, s->ob, s->me, s->faceindex, mval, fwuv);
- imapaint_pick_uv(s->scene, s->ob, s->me, newfaceindex, prevmval, bkuv);
+ imapaint_pick_uv(s->scene, s->ob, s->faceindex, mval, fwuv);
+ imapaint_pick_uv(s->scene, s->ob, newfaceindex, prevmval, bkuv);
if (newimage == s->image)
breakstroke= texpaint_break_stroke(s->uv, fwuv, bkuv, newuv);
@@ -4412,7 +4424,7 @@ static int imapaint_paint_stroke(ViewContext *vc, ImagePaintState *s, BrushPaint
fwuv[0]= fwuv[1]= 0.0f;
if (breakstroke) {
- imapaint_pick_uv(s->scene, s->ob, s->me, s->faceindex, mval, fwuv);
+ imapaint_pick_uv(s->scene, s->ob, s->faceindex, mval, fwuv);
redraw |= imapaint_paint_sub_stroke(s, painter, s->image, texpaint,
fwuv, time, 1, pressure);
imapaint_clear_partial_redraw();
@@ -4528,6 +4540,8 @@ typedef struct PaintOperation {
ViewContext vc;
wmTimer *timer;
+
+ short restore_projection;
} PaintOperation;
static void paint_redraw(bContext *C, ImagePaintState *s, int final)
@@ -4536,29 +4550,8 @@ static void paint_redraw(bContext *C, ImagePaintState *s, int final)
if(s->image)
GPU_free_image(s->image);
+ /* compositor listener deals with updating */
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, s->image);
-
- // XXX node update
-#if 0
- if(!s->sima && s->image) {
- /* after paint, tag Image or RenderResult nodes changed */
- if(s->scene->nodetree) {
- imagepaint_composite_tags(s->scene->nodetree, image, &s->sima->iuser);
- }
- /* signal composite (hurmf, need an allqueue?) */
- if(s->sima->lock) {
- ScrArea *sa;
- for(sa=s->screen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_NODE) {
- if(((SpaceNode *)sa->spacedata.first)->treetype==NTREE_COMPOSIT) {
- addqueue(sa->win, UI_BUT_EVENT, B_NODE_TREE_EXEC);
- break;
- }
- }
- }
- }
- }
-#endif
}
else {
if(!s->sima || !s->sima->lock)
@@ -4634,6 +4627,13 @@ static int texture_paint_init(bContext *C, wmOperator *op)
pop->first= 1;
op->customdata= pop;
+ /* XXX: Soften tool does not support projection painting atm, so just disable
+ projection for this brush */
+ if(brush->imagepaint_tool == PAINT_TOOL_SOFTEN) {
+ settings->imapaint.flag |= IMAGEPAINT_PROJECT_DISABLE;
+ pop->restore_projection = 1;
+ }
+
/* initialize from context */
if(CTX_wm_region_view3d(C)) {
pop->mode= PAINT_MODE_3D;
@@ -4774,6 +4774,9 @@ static void paint_exit(bContext *C, wmOperator *op)
if(pop->timer)
WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), pop->timer);
+ if(pop->restore_projection)
+ settings->imapaint.flag &= ~IMAGEPAINT_PROJECT_DISABLE;
+
settings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
imapaint_canvas_free(&pop->s);
brush_painter_free(pop->painter);
@@ -4966,7 +4969,7 @@ static int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
/************************ cursor drawing *******************************/
-static void brush_drawcursor(bContext *C, int x, int y, void *customdata)
+static void brush_drawcursor(bContext *C, int x, int y, void *UNUSED(customdata))
{
Brush *brush= image_paint_brush(C);
Paint *paint= paint_get_active(CTX_data_scene(C));
@@ -5007,23 +5010,38 @@ static void toggle_paint_cursor(bContext *C, int enable)
settings->imapaint.paintcursor= WM_paint_cursor_activate(CTX_wm_manager(C), image_paint_poll, brush_drawcursor, NULL);
}
+/* enable the paint cursor if it isn't already.
+
+ purpose is to make sure the paint cursor is shown if paint
+ mode is enabled in the image editor. the paint poll will
+ ensure that the cursor is hidden when not in paint mode */
+void ED_space_image_paint_update(wmWindowManager *wm, ToolSettings *settings)
+{
+ ImagePaintSettings *imapaint = &settings->imapaint;
+
+ if(!imapaint->paintcursor) {
+ imapaint->paintcursor =
+ WM_paint_cursor_activate(wm, image_paint_poll,
+ brush_drawcursor, NULL);
+ }
+}
+
/* ************ image paint radial control *************/
static int paint_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
float zoom;
ToolSettings *ts = CTX_data_scene(C)->toolsettings;
get_imapaint_zoom(C, &zoom, &zoom);
- toggle_paint_cursor(C, !ts->imapaint.paintcursor);
+ toggle_paint_cursor(C, 0);
brush_radial_control_invoke(op, paint_brush(&ts->imapaint.paint), zoom);
return WM_radial_control_invoke(C, op, event);
}
static int paint_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- ToolSettings *ts = CTX_data_scene(C)->toolsettings;
int ret = WM_radial_control_modal(C, op, event);
if(ret != OPERATOR_RUNNING_MODAL)
- toggle_paint_cursor(C, !ts->imapaint.paintcursor);
+ toggle_paint_cursor(C, 1);
return ret;
}
@@ -5032,10 +5050,10 @@ static int paint_radial_control_exec(bContext *C, wmOperator *op)
Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
float zoom;
int ret;
- char str[256];
+ char str[64];
get_imapaint_zoom(C, &zoom, &zoom);
ret = brush_radial_control_exec(op, brush, 1.0f / zoom);
- WM_radial_control_string(op, str, 256);
+ WM_radial_control_string(op, str, sizeof(str));
WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
@@ -5130,7 +5148,7 @@ static int grab_clone_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int grab_clone_cancel(bContext *C, wmOperator *op)
+static int grab_clone_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
@@ -5178,11 +5196,40 @@ static int sample_color_invoke(bContext *C, wmOperator *op, wmEvent *event)
ARegion *ar= CTX_wm_region(C);
int location[2];
- location[0]= event->x - ar->winrct.xmin;
- location[1]= event->y - ar->winrct.ymin;
- RNA_int_set_array(op->ptr, "location", location);
+ if(ar) {
+ location[0]= event->x - ar->winrct.xmin;
+ location[1]= event->y - ar->winrct.ymin;
+ RNA_int_set_array(op->ptr, "location", location);
+
+ sample_color_exec(C, op);
+ }
+
+ WM_event_add_modal_handler(C, op);
- return sample_color_exec(C, op);
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sample_color_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar= CTX_wm_region(C);
+ int location[2];
+
+ switch(event->type) {
+ case LEFTMOUSE:
+ case RIGHTMOUSE: // XXX hardcoded
+ return OPERATOR_FINISHED;
+ case MOUSEMOVE:
+ if(ar) {
+ location[0]= event->x - ar->winrct.xmin;
+ location[1]= event->y - ar->winrct.ymin;
+ RNA_int_set_array(op->ptr, "location", location);
+
+ sample_color_exec(C, op);
+ }
+ break;
+ }
+
+ return OPERATOR_RUNNING_MODAL;
}
void PAINT_OT_sample_color(wmOperatorType *ot)
@@ -5194,6 +5241,7 @@ void PAINT_OT_sample_color(wmOperatorType *ot)
/* api callbacks */
ot->exec= sample_color_exec;
ot->invoke= sample_color_invoke;
+ ot->modal= sample_color_modal;
ot->poll= image_paint_poll;
/* flags */
@@ -5315,7 +5363,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
toggle_paint_cursor(C, 1);
}
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
return OPERATOR_FINISHED;
@@ -5349,8 +5397,8 @@ static int texture_paint_radial_control_exec(bContext *C, wmOperator *op)
{
Brush *brush = paint_brush(&CTX_data_scene(C)->toolsettings->imapaint.paint);
int ret = brush_radial_control_exec(op, brush, 1);
- char str[256];
- WM_radial_control_string(op, str, 256);
+ char str[64];
+ WM_radial_control_string(op, str, sizeof(str));
WM_event_add_notifier(C, NC_BRUSH|NA_EDITED, brush);
@@ -5398,13 +5446,11 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
{
Image *image= BLI_findlink(&CTX_data_main(C)->image, RNA_enum_get(op->ptr, "image"));
Scene *scene= CTX_data_scene(C);
- ProjPaintState ps;
+ ProjPaintState ps= {0};
int orig_brush_size;
IDProperty *idgroup;
IDProperty *view_data= NULL;
- memset(&ps, 0, sizeof(ps));
-
project_state_init(C, OBACT, &ps);
if(ps.ob==NULL || ps.ob->type != OB_MESH) {
@@ -5428,10 +5474,10 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
idgroup= IDP_GetProperties(&image->id, 0);
if(idgroup) {
- view_data= IDP_GetPropertyFromGroup(idgroup, PROJ_VIEW_DATA_ID);
+ view_data= IDP_GetPropertyTypeFromGroup(idgroup, PROJ_VIEW_DATA_ID, IDP_ARRAY);
/* type check to make sure its ok */
- if(view_data->len != PROJ_VIEW_DATA_SIZE || view_data->type != IDP_ARRAY || view_data->subtype != IDP_FLOAT) {
+ if(view_data->len != PROJ_VIEW_DATA_SIZE || view_data->subtype != IDP_FLOAT) {
BKE_report(op->reports, RPT_ERROR, "Image project data invalid.");
return OPERATOR_CANCELLED;
}
@@ -5537,6 +5583,13 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op)
if(h > maxsize) h= maxsize;
ibuf= ED_view3d_draw_offscreen_imbuf(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), w, h, IB_rect);
+ if(!ibuf) {
+ /* Mostly happens when OpenGL offscreen buffer was failed to create, */
+ /* but could be other reasons. Should be handled in the future. nazgul */
+ BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer.");
+ return OPERATOR_CANCELLED;
+ }
+
image= BKE_add_image_imbuf(ibuf);
if(image) {
@@ -5578,6 +5631,7 @@ void PAINT_OT_image_from_view(wmOperatorType *ot)
/* api callbacks */
ot->exec= texture_paint_image_from_view_exec;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER;
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index 3ed314095ef..e0a09184e28 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,19 +29,21 @@
#ifndef ED_PAINT_INTERN_H
#define ED_PAINT_INTERN_H
+struct ARegion;
struct bContext;
-struct Scene;
-struct Object;
+struct bglMats;
+struct Brush;
+struct ListBase;
struct Mesh;
+struct Object;
struct PaintStroke;
struct PointerRNA;
+struct Scene;
+struct VPaint;
struct ViewContext;
struct wmEvent;
struct wmOperator;
struct wmOperatorType;
-struct ARegion;
-struct VPaint;
-struct ListBase;
/* paint_stroke.c */
typedef int (*StrokeGetLocation)(struct bContext *C, struct PaintStroke *stroke, float location[3], float mouse[2]);
@@ -54,6 +56,8 @@ struct PaintStroke *paint_stroke_new(struct bContext *C,
StrokeUpdateStep update_step, StrokeDone done);
void paint_stroke_free(struct PaintStroke *stroke);
+int paint_space_stroke_enabled(struct Brush *br);
+
int paint_stroke_modal(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
int paint_stroke_exec(struct bContext *C, struct wmOperator *op);
struct ViewContext *paint_stroke_view_context(struct PaintStroke *stroke);
@@ -98,8 +102,11 @@ void PAINT_OT_image_from_view(struct wmOperatorType *ot);
/* paint_utils.c */
+void projectf(struct bglMats *mats, const float v[3], float p[2]);
+float paint_calc_object_space_radius(struct ViewContext *vc, float center[3], float pixel_radius);
+float paint_get_tex_pixel(struct Brush* br, float u, float v);
int imapaint_pick_face(struct ViewContext *vc, struct Mesh *me, int *mval, unsigned int *index);
-void imapaint_pick_uv(struct Scene *scene, struct Object *ob, struct Mesh *mesh, unsigned int faceindex, int *xy, float *uv);
+void imapaint_pick_uv(struct Scene *scene, struct Object *ob, unsigned int faceindex, int *xy, float *uv);
void paint_sample_color(struct Scene *scene, struct ARegion *ar, int x, int y);
void BRUSH_OT_curve_preset(struct wmOperatorType *ot);
@@ -107,15 +114,18 @@ void BRUSH_OT_curve_preset(struct wmOperatorType *ot);
void PAINT_OT_face_select_linked(struct wmOperatorType *ot);
void PAINT_OT_face_select_linked_pick(struct wmOperatorType *ot);
void PAINT_OT_face_select_all(struct wmOperatorType *ot);
+void PAINT_OT_face_select_inverse(struct wmOperatorType *ot);
+void PAINT_OT_face_select_hide(struct wmOperatorType *ot);
+void PAINT_OT_face_select_reveal(struct wmOperatorType *ot);
int facemask_paint_poll(struct bContext *C);
/* stroke operator */
-typedef enum wmBrushStrokeMode {
- WM_BRUSHSTROKE_NORMAL,
- WM_BRUSHSTROKE_INVERT,
- WM_BRUSHSTROKE_SMOOTH,
-} wmBrushStrokeMode;
+typedef enum BrushStrokeMode {
+ BRUSH_STROKE_NORMAL,
+ BRUSH_STROKE_INVERT,
+ BRUSH_STROKE_SMOOTH,
+} BrushStrokeMode;
/* paint_undo.c */
typedef void (*UndoRestoreCb)(struct bContext *C, struct ListBase *lb);
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index b5cadb9c484..979b6508b16 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -19,6 +19,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -26,6 +28,7 @@
#include "BKE_context.h"
#include "BKE_paint.h"
+#include "ED_sculpt.h"
#include "ED_screen.h"
#include "UI_resources.h"
@@ -42,7 +45,7 @@
//#include <stdio.h>
/* Brush operators */
-static int brush_add_exec(bContext *C, wmOperator *op)
+static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
{
/*int type = RNA_enum_get(op->ptr, "type");*/
Paint *paint = paint_get_active(CTX_data_scene(C));
@@ -58,7 +61,7 @@ static int brush_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void BRUSH_OT_add(wmOperatorType *ot)
+static void BRUSH_OT_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Brush";
@@ -113,7 +116,7 @@ static int brush_scale_size_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void BRUSH_OT_scale_size(wmOperatorType *ot)
+static void BRUSH_OT_scale_size(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Scale Sculpt/Paint Brush Size";
@@ -129,7 +132,7 @@ void BRUSH_OT_scale_size(wmOperatorType *ot)
RNA_def_float(ot->srna, "scalar", 1, 0, 2, "Scalar", "Factor to scale brush size by", 0, 2);
}
-static int vertex_color_set_exec(bContext *C, wmOperator *op)
+static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene = CTX_data_scene(C);
Object *obact = CTX_data_active_object(C);
@@ -140,7 +143,7 @@ static int vertex_color_set_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void PAINT_OT_vertex_color_set(wmOperatorType *ot)
+static void PAINT_OT_vertex_color_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Vertex Colors";
@@ -154,7 +157,7 @@ void PAINT_OT_vertex_color_set(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int brush_reset_exec(bContext *C, wmOperator *op)
+static int brush_reset_exec(bContext *C, wmOperator *UNUSED(op))
{
Paint *paint = paint_get_active(CTX_data_scene(C));
struct Brush *brush = paint_brush(paint);
@@ -169,7 +172,7 @@ static int brush_reset_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void BRUSH_OT_reset(wmOperatorType *ot)
+static void BRUSH_OT_reset(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reset Brush";
@@ -221,76 +224,79 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(PAINT_OT_face_select_linked);
WM_operatortype_append(PAINT_OT_face_select_linked_pick);
WM_operatortype_append(PAINT_OT_face_select_all);
+ WM_operatortype_append(PAINT_OT_face_select_inverse);
+ WM_operatortype_append(PAINT_OT_face_select_hide);
+ WM_operatortype_append(PAINT_OT_face_select_reveal);
}
-static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *path)
+static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *mode)
{
wmKeyMapItem *kmi;
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 0);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 1);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 2);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 3);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 4);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 5);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 6);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 7);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 8);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 9);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ONEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 10);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", TWOKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 11);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", THREEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 12);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FOURKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 13);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 14);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SIXKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 15);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 16);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 17);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", NINEKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 18);
- kmi= WM_keymap_add_item(keymap, "WM_OT_context_set_int", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", path);
- RNA_int_set(kmi->ptr, "value", 19);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 1);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 2);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 3);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 4);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 5);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 6);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 7);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 8);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 9);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 10);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 11);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 12);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 13);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 14);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 15);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 16);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 17);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 18);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "mode", mode);
+ RNA_int_set(kmi->ptr, "number", 19);
}
-static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *path)
+static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *UNUSED(path))
{
wmKeyMapItem *kmi;
@@ -315,11 +321,9 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_radial_control", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_RADIALCONTROL_ANGLE);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", WM_BRUSHSTROKE_NORMAL);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", WM_BRUSHSTROKE_INVERT);
- RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_BRUSHSTROKE_SMOOTH);
-
- //stroke_mode_modal_keymap(keyconf);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "mode", BRUSH_STROKE_NORMAL);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "mode", BRUSH_STROKE_INVERT);
+ RNA_enum_set(WM_keymap_add_item(keymap, "SCULPT_OT_brush_stroke", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", BRUSH_STROKE_SMOOTH);
for(i=0; i<=5; i++)
RNA_int_set(WM_keymap_add_item(keymap, "OBJECT_OT_subdivision_set", ZEROKEY+i, KM_PRESS, KM_CTRL, 0)->ptr, "level", i);
@@ -333,12 +337,12 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
RNA_int_set(kmi->ptr, "level", -1);
RNA_boolean_set(kmi->ptr, "relative", 1);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.sculpt.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "sculpt");
ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size");
/* */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_anchor");
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", AKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.stroke_method");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_smooth_stroke");
@@ -349,43 +353,6 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_airbrush");
- /* brush switching */
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", DKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "SculptDraw");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", SKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Smooth");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", PKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Pinch/Magnify");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", GKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Grab");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", LKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Layer");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, KM_SHIFT, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Crease");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", CKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Clay");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", IKEY, KM_PRESS, 0, 0);
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Inflate/Deflate");
-
- kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_id", TKEY, KM_PRESS, KM_SHIFT, 0); // was just T in 2.4x
- RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush");
- RNA_string_set(kmi->ptr, "value", "Flatten/Contrast");
-
/* Vertex Paint mode */
keymap= WM_keymap_find(keyconf, "Vertex Paint", 0, 0);
keymap->poll= vertex_paint_mode_poll;
@@ -398,7 +365,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap,
"PAINT_OT_vertex_color_set",KKEY, KM_PRESS, KM_SHIFT, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.vertex_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "vertex_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.vertex_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
@@ -416,7 +383,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap,
"PAINT_OT_weight_set", KKEY, KM_PRESS, KM_SHIFT, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.weight_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "weight_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.weight_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
@@ -428,6 +395,9 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
keymap= WM_keymap_find(keyconf, "Image Paint", 0, 0);
keymap->poll= image_texture_paint_poll;
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_image_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
+
RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_texture_paint_radial_control", FKEY, KM_PRESS, 0, 0)->ptr, "mode", WM_RADIALCONTROL_SIZE);
RNA_enum_set(WM_keymap_add_item(keymap, "PAINT_OT_texture_paint_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "mode", WM_RADIALCONTROL_STRENGTH);
@@ -436,7 +406,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "PAINT_OT_sample_color", RIGHTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PAINT_OT_clone_cursor_set", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
- ed_keymap_paint_brush_switch(keymap, "tool_settings.image_paint.active_brush_index");
+ ed_keymap_paint_brush_switch(keymap, "image_paint");
ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
@@ -447,7 +417,11 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
keymap->poll= facemask_paint_poll;
WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_face_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+ WM_keymap_add_item(keymap, "PAINT_OT_face_select_reveal", HKEY, KM_PRESS, KM_ALT, 0);
+
WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked_pick", LKEY, KM_PRESS, 0, 0);
-
}
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 6d58731d79c..3a67775cb98 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -28,6 +28,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
@@ -41,9 +44,6 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "BLI_math.h"
-
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -51,8 +51,9 @@
#include "ED_view3d.h"
#include "paint_intern.h"
-#include "sculpt_intern.h" // XXX, for expedience in getting this working, refactor later (or this just shows that this needs unification)
-
+/* still needed for sculpt_stroke_get_location, should be
+ removed eventually (TODO) */
+#include "sculpt_intern.h"
#include <float.h>
#include <math.h>
@@ -100,109 +101,6 @@ static void paint_draw_smooth_stroke(bContext *C, int x, int y, void *customdata
glDisable(GL_LINE_SMOOTH);
}
-#if 0
-
-// grid texture for testing
-
-#define GRID_WIDTH 8
-#define GRID_LENGTH 8
-
-#define W (0xFFFFFFFF)
-#define G (0x00888888)
-#define E (0xE1E1E1E1)
-#define C (0xC3C3C3C3)
-#define O (0xB4B4B4B4)
-#define Q (0xA9A9A9A9)
-
-static unsigned grid_texture0[256] =
-{
- W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,G,G,G,G,G,G,G,G,G,G,G,G,G,G,W,
- W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,
-};
-
-static unsigned grid_texture1[64] =
-{
- C,C,C,C,C,C,C,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,G,G,G,G,G,G,C,
- C,C,C,C,C,C,C,C,
-};
-
-static unsigned grid_texture2[16] =
-{
- O,O,O,O,
- O,G,G,O,
- O,G,G,O,
- O,O,O,O,
-};
-
-static unsigned grid_texture3[4] =
-{
- Q,Q,
- Q,Q,
-};
-
-static unsigned grid_texture4[1] =
-{
- Q,
-};
-
-#undef W
-#undef G
-#undef E
-#undef C
-#undef O
-#undef Q
-
-static void load_grid()
-{
- static GLuint overlay_texture;
-
- if (!overlay_texture) {
- //GLfloat largest_supported_anisotropy;
-
- glGenTextures(1, &overlay_texture);
- glBindTexture(GL_TEXTURE_2D, overlay_texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture0);
- glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture1);
- glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture2);
- glTexImage2D(GL_TEXTURE_2D, 3, GL_RGB, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture3);
- glTexImage2D(GL_TEXTURE_2D, 4, GL_RGB, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, grid_texture4);
- glEnable(GL_TEXTURE_2D);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
- //glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_supported_anisotropy);
- //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest_supported_anisotropy);
- }
-}
-
-#endif
-
-extern float get_tex_pixel(Brush* br, float u, float v);
-
typedef struct Snapshot {
float size[3];
float ofs[3];
@@ -253,7 +151,7 @@ static void make_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
snap->winy = vc->ar->winy;
}
-int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
+static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
{
static GLuint overlay_texture = 0;
static int init = 0;
@@ -268,8 +166,12 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
int j;
int refresh;
+#ifndef _OPENMP
+ (void)sd; /* quied unused warning */
+#endif
+
if (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED && !br->mtex.tex) return 0;
-
+
refresh =
!overlay_texture ||
(br->mtex.tex &&
@@ -369,7 +271,7 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
x += br->mtex.ofs[0];
y += br->mtex.ofs[1];
- avg = br->mtex.tex ? get_tex_pixel(br, x, y) : 1;
+ avg = br->mtex.tex ? paint_get_tex_pixel(br, x, y) : 1;
avg += br->texture_sample_bias;
@@ -420,18 +322,6 @@ int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
return 1;
}
-/* Convert a point in model coordinates to 2D screen coordinates. */
-// XXX duplicated from sculpt.c, deal with this later.
-static void projectf(bglMats *mats, const float v[3], float p[2])
-{
- double ux, uy, uz;
-
- gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
- (GLint *)mats->viewport, &ux, &uy, &uz);
- p[0]= ux;
- p[1]= uy;
-}
-
static int project_brush_radius(RegionView3D* rv3d, float radius, float location[3], bglMats* mats)
{
float view[3], nonortho[3], ortho[3], offset[3], p1[2], p2[2];
@@ -472,7 +362,8 @@ static int project_brush_radius(RegionView3D* rv3d, float radius, float location
return len_v2v2(p1, p2);
}
-int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, float location[3], float modelview[16], float projection[16], int viewport[4])
+static int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius,
+ float location[3])
{
struct PaintStroke *stroke;
float window[2];
@@ -483,12 +374,11 @@ int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, floa
window[0] = x + stroke->vc.ar->winrct.xmin;
window[1] = y + stroke->vc.ar->winrct.ymin;
- memcpy(modelview, stroke->vc.rv3d->viewmat, sizeof(float[16]));
- memcpy(projection, stroke->vc.rv3d->winmat, sizeof(float[16]));
- memcpy(viewport, stroke->mats.viewport, sizeof(int[4]));
-
- if (stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) {
- *pixel_radius = project_brush_radius(stroke->vc.rv3d, brush_unprojected_radius(stroke->brush), location, &stroke->mats);
+ if(stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh &&
+ sculpt_stroke_get_location(C, stroke, location, window)) {
+ *pixel_radius = project_brush_radius(stroke->vc.rv3d,
+ brush_unprojected_radius(stroke->brush),
+ location, &stroke->mats);
if (*pixel_radius == 0)
*pixel_radius = brush_size(stroke->brush);
@@ -510,58 +400,174 @@ int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, floa
return hit;
}
-// XXX duplicated from sculpt.c
-float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset)
+/* Draw an overlay that shows what effect the brush's texture will
+ have on brush strength */
+/* TODO: sculpt only for now */
+static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
+ ViewContext *vc, int x, int y)
{
- float delta[3], scale, loc[3];
+ rctf quad;
+
+ /* check for overlay mode */
+ if(!(brush->flag & BRUSH_TEXTURE_OVERLAY) ||
+ !(ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED)))
+ return;
+
+ /* save lots of GL state
+ TODO: check on whether all of these are needed? */
+ glPushAttrib(GL_COLOR_BUFFER_BIT|
+ GL_CURRENT_BIT|
+ GL_DEPTH_BUFFER_BIT|
+ GL_ENABLE_BIT|
+ GL_LINE_BIT|
+ GL_POLYGON_BIT|
+ GL_STENCIL_BUFFER_BIT|
+ GL_TRANSFORM_BIT|
+ GL_VIEWPORT_BIT|
+ GL_TEXTURE_BIT);
+
+ if(load_tex(sd, brush, vc)) {
+ glEnable(GL_BLEND);
- mul_v3_m4v3(loc, ob->obmat, center);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthMask(GL_FALSE);
+ glDepthFunc(GL_ALWAYS);
+
+ glMatrixMode(GL_TEXTURE);
+ glPushMatrix();
+ glLoadIdentity();
+
+ if(brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
+ /* brush rotation */
+ glTranslatef(0.5f, 0.5f, 0);
+ glRotatef(((brush->flag & BRUSH_RAKE) ?
+ sd->last_angle : sd->special_rotation) * (180.0f/M_PI),
+ 0, 0, 1);
+ glTranslatef(-0.5f, -0.5f, 0);
+
+ /* scale based on tablet pressure */
+ if(sd->draw_pressure && brush_use_size_pressure(brush)) {
+ glTranslatef(0.5f, 0.5f, 0);
+ glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
+ glTranslatef(-0.5f, -0.5f, 0);
+ }
- initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
- window_to_3d_delta(vc->ar, delta, offset, 0);
+ if(sd->draw_anchored) {
+ const float *aim = sd->anchored_initial_mouse;
+ const rcti *win = &vc->ar->winrct;
+ quad.xmin = aim[0]-sd->anchored_size - win->xmin;
+ quad.ymin = aim[1]-sd->anchored_size - win->ymin;
+ quad.xmax = aim[0]+sd->anchored_size - win->xmin;
+ quad.ymax = aim[1]+sd->anchored_size - win->ymin;
+ }
+ else {
+ const int radius= brush_size(brush);
+ quad.xmin = x - radius;
+ quad.ymin = y - radius;
+ quad.xmax = x + radius;
+ quad.ymax = y + radius;
+ }
+ }
+ else {
+ quad.xmin = 0;
+ quad.ymin = 0;
+ quad.xmax = vc->ar->winrct.xmax - vc->ar->winrct.xmin;
+ quad.ymax = vc->ar->winrct.ymax - vc->ar->winrct.ymin;
+ }
- scale= fabsf(mat4_to_scale(ob->obmat));
- scale= (scale == 0.0f)? 1.0f: scale;
+ /* set quad color */
+ glColor4f(U.sculpt_paint_overlay_col[0],
+ U.sculpt_paint_overlay_col[1],
+ U.sculpt_paint_overlay_col[2],
+ brush->texture_overlay_alpha / 100.0f);
+
+ /* draw textured quad */
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex2f(quad.xmin, quad.ymin);
+ glTexCoord2f(1, 0);
+ glVertex2f(quad.xmax, quad.ymin);
+ glTexCoord2f(1, 1);
+ glVertex2f(quad.xmax, quad.ymax);
+ glTexCoord2f(0, 1);
+ glVertex2f(quad.xmin, quad.ymax);
+ glEnd();
+
+ glPopMatrix();
+ }
- return len_v3(delta)/scale;
+ glPopAttrib();
}
-// XXX paint cursor now does a lot of the same work that is needed during a sculpt stroke
-// problem: all this stuff was not intended to be used at this point, so things feel a
-// bit hacked. I've put lots of stuff in Brush that probably better goes in Paint
-// Functions should be refactored so that they can be used between sculpt.c and
-// paint_stroke.c clearly and optimally and the lines of communication between the
-// two modules should be more clearly defined.
-static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
+/* Special actions taken when paint cursor goes over mesh */
+/* TODO: sculpt only for now */
+static void paint_cursor_on_hit(Sculpt *sd, Brush *brush, ViewContext *vc,
+ float location[3], float *visual_strength)
{
- ViewContext vc;
-
- (void)unused;
+ float unprojected_radius, projected_radius;
- view3d_set_viewcontext(C, &vc);
-
- if (vc.obact->sculpt) {
- Paint *paint = paint_get_active(CTX_data_scene(C));
- Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
- Brush *brush = paint_brush(paint);
+ /* TODO: check whether this should really only be done when
+ brush is over mesh? */
+ if(sd->draw_pressure && brush_use_alpha_pressure(brush))
+ (*visual_strength) *= sd->pressure_value;
- int pixel_radius, viewport[4];
- float location[3], modelview[16], projection[16];
+ if(sd->draw_anchored)
+ projected_radius = sd->anchored_size;
+ else {
+ if(brush->flag & BRUSH_ANCHORED)
+ projected_radius = 8;
+ else
+ projected_radius = brush_size(brush);
+ }
+ unprojected_radius = paint_calc_object_space_radius(vc, location,
+ projected_radius);
- int hit;
+ if(sd->draw_pressure && brush_use_size_pressure(brush))
+ unprojected_radius *= sd->pressure_value;
- int flip;
- int sign;
+ if(!brush_use_locked_size(brush))
+ brush_set_unprojected_radius(brush, unprojected_radius);
+}
- float* col;
- float alpha;
+static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
+{
+ Paint *paint = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(paint);
+ ViewContext vc;
+ float final_radius;
+ float translation[2];
+ float outline_alpha, *outline_col;
+
+ /* set various defaults */
+ translation[0] = x;
+ translation[1] = y;
+ outline_alpha = 0.5;
+ outline_col = brush->add_col;
+ final_radius = brush_size(brush);
+
+ /* check that brush drawing is enabled */
+ if(!(paint->flags & PAINT_SHOW_BRUSH))
+ return;
+
+ /* can't use stroke vc here because this will be called during
+ mouse over too, not just during a stroke */
+ view3d_set_viewcontext(C, &vc);
+ /* TODO: as sculpt and other paint modes are unified, this
+ special mode of drawing will go away */
+ if(vc.obact->sculpt) {
+ Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
+ float location[3];
+ int pixel_radius, hit;
const float root_alpha = brush_alpha(brush);
float visual_strength = root_alpha*root_alpha;
-
const float min_alpha = 0.20f;
const float max_alpha = 0.80f;
+ /* this is probably here so that rake takes into
+ account the brush movements before the stroke
+ starts, but this doesn't really belong in draw code
+ (TODO) */
{
const float u = 0.5f;
const float v = 1 - u;
@@ -570,7 +576,7 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
const float dx = sd->last_x - x;
const float dy = sd->last_y - y;
- if (dx*dx + dy*dy >= r*r) {
+ if(dx*dx + dy*dy >= r*r) {
sd->last_angle = atan2(dx, dy);
sd->last_x = u*sd->last_x + v*x;
@@ -578,252 +584,106 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
}
}
- if(!brush_use_locked_size(brush) && !(paint->flags & PAINT_SHOW_BRUSH))
- return;
+ /* test if brush is over the mesh */
+ hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location);
- hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport);
+ /* draw overlay */
+ paint_draw_alpha_overlay(sd, brush, &vc, x, y);
- if (brush_use_locked_size(brush))
+ if(brush_use_locked_size(brush))
brush_set_size(brush, pixel_radius);
- // XXX: no way currently to know state of pen flip or invert key modifier without starting a stroke
- flip = 1;
-
- sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1);
-
- if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
- col = brush->sub_col;
- else
- col = brush->add_col;
-
- alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f;
-
- if (ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED) && brush->flag & BRUSH_TEXTURE_OVERLAY) {
- glPushAttrib(
- GL_COLOR_BUFFER_BIT|
- GL_CURRENT_BIT|
- GL_DEPTH_BUFFER_BIT|
- GL_ENABLE_BIT|
- GL_LINE_BIT|
- GL_POLYGON_BIT|
- GL_STENCIL_BUFFER_BIT|
- GL_TRANSFORM_BIT|
- GL_VIEWPORT_BIT|
- GL_TEXTURE_BIT);
-
- if (load_tex(sd, brush, &vc)) {
- glEnable(GL_BLEND);
-
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- glDepthMask(GL_FALSE);
- glDepthFunc(GL_ALWAYS);
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
- glLoadIdentity();
-
- if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
- glTranslatef(0.5f, 0.5f, 0);
-
- if (brush->flag & BRUSH_RAKE) {
- glRotatef(sd->last_angle*(float)(180.0/M_PI), 0, 0, 1);
- }
- else {
- glRotatef(sd->special_rotation*(float)(180.0/M_PI), 0, 0, 1);
- }
-
- glTranslatef(-0.5f, -0.5f, 0);
-
- if (sd->draw_pressure && brush_use_size_pressure(brush)) {
- glTranslatef(0.5f, 0.5f, 0);
- glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
- glTranslatef(-0.5f, -0.5f, 0);
- }
- }
-
- glColor4f(
- U.sculpt_paint_overlay_col[0],
- U.sculpt_paint_overlay_col[1],
- U.sculpt_paint_overlay_col[2],
- brush->texture_overlay_alpha / 100.0f);
-
- glBegin(GL_QUADS);
- if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
- if (sd->draw_anchored) {
- glTexCoord2f(0, 0);
- glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(1, 0);
- glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(1, 1);
- glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
-
- glTexCoord2f(0, 1);
- glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
- }
- else {
- const int radius= brush_size(brush);
-
- glTexCoord2f(0, 0);
- glVertex2f((float)x-radius, (float)y-radius);
-
- glTexCoord2f(1, 0);
- glVertex2f((float)x+radius, (float)y-radius);
-
- glTexCoord2f(1, 1);
- glVertex2f((float)x+radius, (float)y+radius);
-
- glTexCoord2f(0, 1);
- glVertex2f((float)x-radius, (float)y+radius);
- }
- }
- else {
- glTexCoord2f(0, 0);
- glVertex2f(0, 0);
-
- glTexCoord2f(1, 0);
- glVertex2f(viewport[2], 0);
-
- glTexCoord2f(1, 1);
- glVertex2f(viewport[2], viewport[3]);
-
- glTexCoord2f(0, 1);
- glVertex2f(0, viewport[3]);
- }
- glEnd();
-
- glPopMatrix();
- }
-
- glPopAttrib();
+ /* check if brush is subtracting, use different color then */
+ /* TODO: no way currently to know state of pen flip or
+ invert key modifier without starting a stroke */
+ if((!(brush->flag & BRUSH_INVERTED) ^
+ !(brush->flag & BRUSH_DIR_IN)) &&
+ ELEM5(brush->sculpt_tool, SCULPT_TOOL_DRAW,
+ SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY,
+ SCULPT_TOOL_PINCH, SCULPT_TOOL_CREASE))
+ outline_col = brush->sub_col;
+
+ /* only do if brush is over the mesh */
+ if(hit)
+ paint_cursor_on_hit(sd, brush, &vc, location, &visual_strength);
+
+ /* don't show effect of strength past the soft limit */
+ if(visual_strength > 1)
+ visual_strength = 1;
+
+ outline_alpha = ((paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ?
+ min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f);
+
+ if(sd->draw_anchored) {
+ final_radius = sd->anchored_size;
+ translation[0] = sd->anchored_initial_mouse[0] - vc.ar->winrct.xmin;
+ translation[1] = sd->anchored_initial_mouse[1] - vc.ar->winrct.ymin;
}
+ }
- if (hit) {
- float unprojected_radius;
-
- // XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
- //wmEvent* event = CTX_wm_window(C)->eventstate;
-
- if (sd->draw_pressure && brush_use_alpha_pressure(brush))
- visual_strength *= sd->pressure_value;
-
- // don't show effect of strength past the soft limit
- if (visual_strength > 1) visual_strength = 1;
-
- if (sd->draw_anchored) {
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, sd->anchored_size);
- }
- else {
- if (brush->flag & BRUSH_ANCHORED)
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, 8);
- else
- unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush_size(brush));
- }
-
- if (sd->draw_pressure && brush_use_size_pressure(brush))
- unprojected_radius *= sd->pressure_value;
-
- if (!brush_use_locked_size(brush))
- brush_set_unprojected_radius(brush, unprojected_radius);
-
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
-
- }
+ /* make lines pretty */
+ glEnable(GL_BLEND);
+ glEnable(GL_LINE_SMOOTH);
- glPushAttrib(
- GL_COLOR_BUFFER_BIT|
- GL_CURRENT_BIT|
- GL_DEPTH_BUFFER_BIT|
- GL_ENABLE_BIT|
- GL_LINE_BIT|
- GL_POLYGON_BIT|
- GL_STENCIL_BUFFER_BIT|
- GL_TRANSFORM_BIT|
- GL_VIEWPORT_BIT|
- GL_TEXTURE_BIT);
+ /* set brush color */
+ glColor4f(outline_col[0], outline_col[1], outline_col[2], outline_alpha);
- glColor4f(col[0], col[1], col[2], alpha);
+ /* draw brush outline */
+ glTranslatef(translation[0], translation[1], 0);
+ glutil_draw_lined_arc(0.0, M_PI*2.0, final_radius, 40);
+ glTranslatef(-translation[0], -translation[1], 0);
- glEnable(GL_BLEND);
+ /* restore GL state */
+ glDisable(GL_BLEND);
+ glDisable(GL_LINE_SMOOTH);
+}
- glEnable(GL_LINE_SMOOTH);
+/* if this is a tablet event, return tablet pressure and set *pen_flip
+ to 1 if the eraser tool is being used, 0 otherwise */
+static float event_tablet_data(wmEvent *event, int *pen_flip)
+{
+ int erasor = 0;
+ float pressure = 1;
- if (sd->draw_anchored) {
- glTranslatef(sd->anchored_initial_mouse[0] - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1] - vc.ar->winrct.ymin, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, sd->anchored_size, 40);
- glTranslatef(-sd->anchored_initial_mouse[0] + vc.ar->winrct.xmin, -sd->anchored_initial_mouse[1] + vc.ar->winrct.xmin, 0.0f);
- }
- else {
- glTranslatef((float)x, (float)y, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40);
- glTranslatef(-(float)x, -(float)y, 0.0f);
- }
+ if(event->custom == EVT_DATA_TABLET) {
+ wmTabletData *wmtab= event->customdata;
- glPopAttrib();
+ erasor = (wmtab->Active == EVT_TABLET_ERASER);
+ pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1;
}
- else {
- Paint *paint = paint_get_active(CTX_data_scene(C));
- Brush *brush = paint_brush(paint);
-
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
-
- glColor4f(brush->add_col[0], brush->add_col[1], brush->add_col[2], 0.5f);
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
- glTranslatef((float)x, (float)y, 0.0f);
- glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40); // XXX: for now use the brushes size instead of potentially using the unified size because the feature has been enabled for sculpt
- glTranslatef((float)-x, (float)-y, 0.0f);
+ if(pen_flip)
+ (*pen_flip) = erasor;
- glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
- }
+ return pressure;
}
/* Put the location of the next stroke dot into the stroke RNA and apply it to the mesh */
static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *event, float mouse_in[2])
{
- Paint *paint = paint_get_active(CTX_data_scene(C)); // XXX
- Brush *brush = paint_brush(paint); // XXX
-
+ Paint *paint = paint_get_active(CTX_data_scene(C));
+ Brush *brush = paint_brush(paint);
+ PaintStroke *stroke = op->customdata;
float mouse[3];
-
PointerRNA itemptr;
-
float location[3];
-
float pressure;
- int pen_flip;
-
- ViewContext vc; // XXX
-
- PaintStroke *stroke = op->customdata;
+ int pen_flip;
- view3d_set_viewcontext(C, &vc); // XXX
+ /* see if tablet affects event */
+ pressure = event_tablet_data(event, &pen_flip);
- /* Tablet */
- if(event->custom == EVT_DATA_TABLET) {
- wmTabletData *wmtab= event->customdata;
-
- pressure = (wmtab->Active != EVT_TABLET_NONE) ? wmtab->Pressure : 1;
- pen_flip = (wmtab->Active == EVT_TABLET_ERASER);
- }
- else {
- pressure = 1;
- pen_flip = 0;
- }
-
- // XXX: temporary check for sculpt mode until things are more unified
- if (vc.obact->sculpt) {
+ /* TODO: as sculpt and other paint modes are unified, this
+ separation will go away */
+ if(stroke->vc.obact->sculpt) {
float delta[3];
brush_jitter_pos(brush, mouse_in, mouse);
- // XXX: meh, this is round about because brush_jitter_pos isn't written in the best way to be reused here
- if (brush->flag & BRUSH_JITTER_PRESSURE) {
+ /* XXX: meh, this is round about because
+ brush_jitter_pos isn't written in the best way to
+ be reused here */
+ if(brush->flag & BRUSH_JITTER_PRESSURE) {
sub_v3_v3v3(delta, mouse, mouse_in);
mul_v3_fl(delta, pressure);
add_v3_v3v3(mouse, mouse_in, delta);
@@ -832,7 +692,7 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev
else
copy_v3_v3(mouse, mouse_in);
- /* XXX: can remove the if statement once all modes have this */
+ /* TODO: can remove the if statement once all modes have this */
if(stroke->get_location)
stroke->get_location(C, stroke, location, mouse);
else
@@ -841,10 +701,10 @@ static void paint_brush_stroke_add_step(bContext *C, wmOperator *op, wmEvent *ev
/* Add to stroke */
RNA_collection_add(op->ptr, "stroke", &itemptr);
- RNA_float_set_array(&itemptr, "location", location);
- RNA_float_set_array(&itemptr, "mouse", mouse);
- RNA_boolean_set (&itemptr, "pen_flip", pen_flip);
- RNA_float_set (&itemptr, "pressure", pressure);
+ RNA_float_set_array(&itemptr, "location", location);
+ RNA_float_set_array(&itemptr, "mouse", mouse);
+ RNA_boolean_set(&itemptr, "pen_flip", pen_flip);
+ RNA_float_set(&itemptr, "pressure", pressure);
stroke->last_mouse_position[0] = mouse[0];
stroke->last_mouse_position[1] = mouse[1];
@@ -878,14 +738,6 @@ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *ev
return 1;
}
-/* Returns zero if the stroke dots should not be spaced, non-zero otherwise */
-static int paint_space_stroke_enabled(Brush *br)
-{
- return (br->flag & BRUSH_SPACE) &&
- !(br->flag & BRUSH_ANCHORED) &&
- !ELEM4(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK);
-}
-
/* For brushes with stroke spacing enabled, moves mouse in steps
towards the final mouse location. */
static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const float final_mouse[2])
@@ -906,23 +758,24 @@ static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const
if(length > FLT_EPSILON) {
int steps;
int i;
- float pressure = 1;
-
- // XXX duplicate code
- if(event->custom == EVT_DATA_TABLET) {
- wmTabletData *wmtab= event->customdata;
- if(wmtab->Active != EVT_TABLET_NONE)
- pressure = brush_use_size_pressure(stroke->brush) ? wmtab->Pressure : 1;
- }
-
- scale = (brush_size(stroke->brush)*pressure*stroke->brush->spacing/50.0f) / length;
- mul_v2_fl(vec, scale);
-
- steps = (int)(1.0f / scale);
-
- for(i = 0; i < steps; ++i, ++cnt) {
- add_v2_v2(mouse, vec);
- paint_brush_stroke_add_step(C, op, event, mouse);
+ float pressure= 1.0f;
+
+ /* XXX mysterious :) what has 'use size' do with this here... if you don't check for it, pressure fails */
+ if(brush_use_size_pressure(stroke->brush))
+ pressure = event_tablet_data(event, NULL);
+
+ if(pressure > FLT_EPSILON) {
+ scale = (brush_size(stroke->brush)*pressure*stroke->brush->spacing/50.0f) / length;
+ if(scale > FLT_EPSILON) {
+ mul_v2_fl(vec, scale);
+
+ steps = (int)(1.0f / scale);
+
+ for(i = 0; i < steps; ++i, ++cnt) {
+ add_v2_v2(mouse, vec);
+ paint_brush_stroke_add_step(C, op, event, mouse);
+ }
+ }
}
}
}
@@ -957,6 +810,14 @@ void paint_stroke_free(PaintStroke *stroke)
MEM_freeN(stroke);
}
+/* Returns zero if the stroke dots should not be spaced, non-zero otherwise */
+int paint_space_stroke_enabled(Brush *br)
+{
+ return (br->flag & BRUSH_SPACE) &&
+ !(br->flag & BRUSH_ANCHORED) &&
+ !ELEM4(br->sculpt_tool, SCULPT_TOOL_GRAB, SCULPT_TOOL_THUMB, SCULPT_TOOL_ROTATE, SCULPT_TOOL_SNAKE_HOOK);
+}
+
int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
{
PaintStroke *stroke = op->customdata;
diff --git a/source/blender/editors/sculpt_paint/paint_undo.c b/source/blender/editors/sculpt_paint/paint_undo.c
index c2f82b8e2e0..49fc1f01869 100644
--- a/source/blender/editors/sculpt_paint/paint_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_undo.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* Undo system for painting and sculpting.
@@ -27,9 +27,11 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_userdef_types.h"
-#include "BLI_listbase.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -62,13 +64,13 @@ static UndoStack MeshUndoStack = {UNDO_PAINT_MESH, {NULL, NULL}, NULL};
/* Generic */
-static void undo_restore(bContext *C, UndoStack *stack, UndoElem *uel)
+static void undo_restore(bContext *C, UndoStack *UNUSED(stack), UndoElem *uel)
{
if(uel && uel->restore)
uel->restore(C, &uel->elems);
}
-static void undo_elem_free(UndoStack *stack, UndoElem *uel)
+static void undo_elem_free(UndoStack *UNUSED(stack), UndoElem *uel)
{
if(uel && uel->free) {
uel->free(&uel->elems);
@@ -237,6 +239,27 @@ int ED_undo_paint_step(bContext *C, int type, int step, const char *name)
return 0;
}
+int ED_undo_paint_valid(int type, const char *name)
+{
+ UndoStack *stack;
+
+ if(type == UNDO_PAINT_IMAGE)
+ stack= &ImageUndoStack;
+ else if(type == UNDO_PAINT_MESH)
+ stack= &MeshUndoStack;
+ else
+ return 0;
+
+ if(stack->current==NULL);
+ else {
+ if(name && strcmp(stack->current->name, name) == 0)
+ return 1;
+ else
+ return stack->elems.first != stack->elems.last;
+ }
+ return 0;
+}
+
void ED_undo_paint_free(void)
{
undo_stack_free(&ImageUndoStack);
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 47170dfdbdf..9090093bd7c 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -9,18 +9,22 @@
#include "DNA_scene_types.h"
#include "DNA_brush_types.h"
-#include "RNA_access.h"
-#include "RNA_define.h"
-
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_DerivedMesh.h"
#include "BKE_paint.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
#include "BIF_gl.h"
+/* TODO: remove once projectf goes away */
+#include "BIF_glutil.h"
+
+#include "RE_shader_ext.h"
#include "ED_view3d.h"
#include "ED_screen.h"
@@ -33,6 +37,55 @@
#include "paint_intern.h"
+/* convert a point in model coordinates to 2D screen coordinates */
+/* TODO: can be deleted once all calls are replaced with
+ view3d_project_float() */
+void projectf(bglMats *mats, const float v[3], float p[2])
+{
+ double ux, uy, uz;
+
+ gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
+ (GLint *)mats->viewport, &ux, &uy, &uz);
+ p[0]= ux;
+ p[1]= uy;
+}
+
+float paint_calc_object_space_radius(ViewContext *vc, float center[3],
+ float pixel_radius)
+{
+ Object *ob = vc->obact;
+ float delta[3], scale, loc[3];
+
+ mul_v3_m4v3(loc, ob->obmat, center);
+
+ initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
+ window_to_3d_delta(vc->ar, delta, pixel_radius, 0);
+
+ scale= fabsf(mat4_to_scale(ob->obmat));
+ scale= (scale == 0.0f)? 1.0f: scale;
+
+ return len_v3(delta)/scale;
+}
+
+float paint_get_tex_pixel(Brush* br, float u, float v)
+{
+ TexResult texres;
+ float co[3];
+ int hasrgb;
+
+ co[0] = u;
+ co[1] = v;
+ co[2] = 0;
+
+ memset(&texres, 0, sizeof(TexResult));
+ hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 0, &texres);
+
+ if (hasrgb & TEX_RGB)
+ texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta;
+
+ return texres.tin;
+}
+
/* 3D Paint */
static void imapaint_project(Object *ob, float *model, float *proj, float *co, float *pco)
@@ -88,7 +141,7 @@ static void imapaint_tri_weights(Object *ob, float *v1, float *v2, float *v3, fl
}
/* compute uv coordinates of mouse in face */
-void imapaint_pick_uv(Scene *scene, Object *ob, Mesh *mesh, unsigned int faceindex, int *xy, float *uv)
+void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, int *xy, float *uv)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
int *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
@@ -233,9 +286,9 @@ void BRUSH_OT_curve_preset(wmOperatorType *ot)
/* face-select ops */
-static int paint_select_linked_exec(bContext *C, wmOperator *op)
+static int paint_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
- select_linked_tfaces(C, CTX_data_active_object(C), NULL, 2);
+ paintface_select_linked(C, CTX_data_active_object(C), NULL, 2);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
@@ -255,7 +308,7 @@ void PAINT_OT_face_select_linked(wmOperatorType *ot)
static int paint_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
int mode= RNA_boolean_get(op->ptr, "extend") ? 1:0;
- select_linked_tfaces(C, CTX_data_active_object(C), event->mval, mode);
+ paintface_select_linked(C, CTX_data_active_object(C), event->mval, mode);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
@@ -277,7 +330,8 @@ void PAINT_OT_face_select_linked_pick(wmOperatorType *ot)
static int face_select_all_exec(bContext *C, wmOperator *op)
{
- selectall_tface(CTX_data_active_object(C), RNA_enum_get(op->ptr, "action"));
+ Object *ob= CTX_data_active_object(C);
+ paintface_deselect_all_visible(ob, RNA_enum_get(op->ptr, "action"), TRUE);
ED_region_tag_redraw(CTX_wm_region(C));
return OPERATOR_FINISHED;
}
@@ -296,3 +350,69 @@ void PAINT_OT_face_select_all(wmOperatorType *ot)
WM_operator_properties_select_all(ot);
}
+
+static int face_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob= CTX_data_active_object(C);
+ paintface_deselect_all_visible(ob, SEL_INVERT, TRUE);
+ ED_region_tag_redraw(CTX_wm_region(C));
+ return OPERATOR_FINISHED;
+}
+
+
+void PAINT_OT_face_select_inverse(wmOperatorType *ot)
+{
+ ot->name= "Face Select Invert";
+ ot->description= "Invert selection of faces";
+ ot->idname= "PAINT_OT_face_select_inverse";
+
+ ot->exec= face_select_inverse_exec;
+ ot->poll= facemask_paint_poll;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int face_select_hide_exec(bContext *C, wmOperator *op)
+{
+ const int unselected= RNA_boolean_get(op->ptr, "unselected");
+ Object *ob= CTX_data_active_object(C);
+ paintface_hide(ob, unselected);
+ ED_region_tag_redraw(CTX_wm_region(C));
+ return OPERATOR_FINISHED;
+}
+
+void PAINT_OT_face_select_hide(wmOperatorType *ot)
+{
+ ot->name= "Face Select Hide";
+ ot->description= "Hide selected faces";
+ ot->idname= "PAINT_OT_face_select_hide";
+
+ ot->exec= face_select_hide_exec;
+ ot->poll= facemask_paint_poll;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects.");
+}
+
+static int face_select_reveal_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Object *ob= CTX_data_active_object(C);
+ paintface_reveal(ob);
+ ED_region_tag_redraw(CTX_wm_region(C));
+ return OPERATOR_FINISHED;
+}
+
+void PAINT_OT_face_select_reveal(wmOperatorType *ot)
+{
+ ot->name= "Face Select Reveal";
+ ot->description= "Reveal hidden faces";
+ ot->idname= "PAINT_OT_face_select_reveal";
+
+ ot->exec= face_select_reveal_exec;
+ ot->poll= facemask_paint_poll;
+
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects.");
+}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 12b9e982d02..e16dac94076 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,6 +42,7 @@
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_cellalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "IMB_imbuf.h"
@@ -158,7 +159,7 @@ static int *get_indexarray(Mesh *me)
/* in contradiction to cpack drawing colors, the MCOL colors (vpaint colors) are per byte!
so not endian sensitive. Mcol = ABGR!!! so be cautious with cpack calls */
-unsigned int rgba_to_mcol(float r, float g, float b, float a)
+static unsigned int rgba_to_mcol(float r, float g, float b, float a)
{
int ir, ig, ib, ia;
unsigned int col;
@@ -334,7 +335,7 @@ static void make_vertexcol(Object *ob) /* single ob */
memset(me->mcol, 255, 4*sizeof(MCol)*me->totface);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
@@ -409,7 +410,7 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
}
}
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
@@ -493,7 +494,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
dw->weight= paintweight;
if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
- int j= mesh_get_x_mirror_vert(ob, faceverts[i]);
+ int j= -1; //BMESH_TODO mesh_get_x_mirror_vert(ob, faceverts[i]);
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1) {
@@ -523,10 +524,10 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
MEM_freeN(indexar);
copy_wpaint_prev(wp, NULL, 0);
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
-/* XXX: should be re-implemented as a vertex/weight paint 'colour correct' operator
+/* XXX: should be re-implemented as a vertex/weight paint 'color correct' operator
void vpaint_dogamma(Scene *scene)
{
@@ -928,7 +929,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
/* sets wp->weight to the closest weight value to vertex */
/* note: we cant sample frontbuf, weight colors are interpolated too unpredictable */
#if 0
-void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
+static void sample_wpaint(Scene *scene, ARegion *ar, View3D *UNUSED(v3d), int mode)
{
ViewContext vc;
ToolSettings *ts= scene->toolsettings;
@@ -987,7 +988,7 @@ void sample_wpaint(Scene *scene, ARegion *ar, View3D *v3d, int mode)
val= 0; // XXX pupmenu(str);
if(val>=0) {
ob->actdef= val+1;
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
}
MEM_freeN(str);
}
@@ -1102,7 +1103,7 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index,
do_weight_paint_auto_normalize(me->dvert+index, vgroup, validmap);
if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
- int j= mesh_get_x_mirror_vert(ob, index);
+ int j= -1; //BMESH_TODO mesh_get_x_mirror_vert(ob, index);
if(j>=0) {
/* copy, not paint again */
if(vgroup_mirror != -1)
@@ -1120,7 +1121,7 @@ static void do_weight_paint_vertex(VPaint *wp, Object *ob, int index,
/* *************** set wpaint operator ****************** */
-static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
+static int set_wpaint(bContext *C, wmOperator *UNUSED(op)) /* toggle */
{
Object *ob= CTX_data_active_object(C);
Scene *scene= CTX_data_scene(C);
@@ -1139,7 +1140,7 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
* exit (exit needs doing regardless because we
* should redeform).
*/
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
if(ob->mode & OB_MODE_WEIGHT_PAINT) {
Object *par;
@@ -1150,7 +1151,7 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
paint_init(&wp->paint, PAINT_CURSOR_WEIGHT_PAINT);
paint_cursor_start(C, weight_paint_poll);
- mesh_octree_table(ob, NULL, NULL, 's');
+ //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 's');
/* verify if active weight group is also active bone */
par= modifiers_isDeformedByArmature(ob);
@@ -1162,8 +1163,8 @@ static int set_wpaint(bContext *C, wmOperator *op) /* toggle */
}
}
else {
- mesh_octree_table(NULL, NULL, NULL, 'e');
- mesh_mirrtopo_table(NULL, 'e');
+ //BMESH_TODO mesh_octree_table(NULL, NULL, NULL, 'e');
+ //BMESH_TODO mesh_mirrtopo_table(NULL, 'e');
}
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
@@ -1315,7 +1316,7 @@ struct WPaintData {
char *vgroup_validmap; /*stores if vgroups tie to deforming bones or not*/
};
-static char *wpaint_make_validmap(Mesh *me, Object *ob)
+static char *wpaint_make_validmap(Object *ob)
{
bDeformGroup *dg;
ModifierData *md;
@@ -1373,7 +1374,7 @@ static char *wpaint_make_validmap(Mesh *me, Object *ob)
return validmap;
}
-static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
+static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene= CTX_data_scene(C);
struct PaintStroke *stroke = op->customdata;
@@ -1397,8 +1398,10 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
makeDerivedMesh(scene, ob, NULL, CD_MASK_BAREMESH);
/* if nothing was added yet, we make dverts and a vertex deform group */
- if (!me->dvert)
+ if (!me->dvert) {
ED_vgroup_data_create(&me->id);
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
+ }
/* make mode data storage */
wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
@@ -1410,7 +1413,7 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *event)
vgroups affect deform bones*/
wpd->auto_normalize = ts->auto_normalize;
if (wpd->auto_normalize)
- wpd->vgroup_validmap = wpaint_make_validmap(me, ob);
+ wpd->vgroup_validmap = wpaint_make_validmap(ob);
// if(qual & LR_CTRLKEY) {
// sample_wpaint(scene, ar, v3d, 0);
@@ -1493,7 +1496,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
Object *ob;
Mesh *me;
float mat[4][4];
- float paintweight= ts->vgroup_weight;
+ float paintweight;
int *indexar;
int totindex, index, totw, flip;
float alpha;
@@ -1578,10 +1581,10 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
}
if(brush->vertexpaint_tool==VP_BLUR) {
- MDeformWeight *dw, *(*dw_func)(MDeformVert *, int);
+ MDeformWeight *dw, *(*dw_func)(MDeformVert *, const int);
if(wp->flag & VP_ONLYVGROUP)
- dw_func= (void *)defvert_find_index; /* uses a const, cast to quiet warning */
+ dw_func= (MDeformWeight *(*)(MDeformVert *, const int))defvert_find_index;
else
dw_func= defvert_verify_index;
@@ -1622,7 +1625,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
swap_m4m4(vc->rv3d->persmat, mat);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
ED_region_tag_redraw(vc->ar);
}
@@ -1661,7 +1664,7 @@ static void wpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
}
}
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
}
@@ -1699,7 +1702,7 @@ void PAINT_OT_weight_paint(wmOperatorType *ot)
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", "");
}
-static int weight_paint_set_exec(bContext *C, wmOperator *op)
+static int weight_paint_set_exec(bContext *C, wmOperator *UNUSED(op))
{
struct Scene *scene= CTX_data_scene(C);
Object *obact = CTX_data_active_object(C);
@@ -1763,7 +1766,7 @@ static int set_vpaint(bContext *C, wmOperator *op) /* toggle */
if (me)
/* update modifier stack for mapping requirements */
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_SCENE|ND_MODE, scene);
@@ -1862,7 +1865,7 @@ static void vpaint_build_poly_facemap(struct VPaintData *vd, Mesh *me,
}
}
-static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *event)
+static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent *UNUSED(event))
{
ToolSettings *ts= CTX_data_tool_settings(C);
struct PaintStroke *stroke = op->customdata;
@@ -1905,7 +1908,7 @@ static int vpaint_stroke_test_start(bContext *C, struct wmOperator *op, wmEvent
}
#if 0
-static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index, float mval[2], float pressure, int flip)
+static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index, float mval[2], float pressure, int UNUSED(flip))
{
ViewContext *vc = &vpd->vc;
Brush *brush = paint_brush(&vp->paint);
@@ -2088,7 +2091,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
do_shared_vertexcol(me);
ED_region_tag_redraw(vc->ar);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ob->data, 0);
}
static void vpaint_stroke_done(bContext *C, struct PaintStroke *stroke)
@@ -2157,9 +2160,9 @@ static int weight_from_bones_exec(bContext *C, wmOperator *op)
Mesh *me= ob->data;
int type= RNA_enum_get(op->ptr, "type");
- create_vgroups_from_armature(scene, ob, armob, type, (me->editflag & ME_EDIT_MIRROR_X));
+ create_vgroups_from_armature(op->reports, scene, ob, armob, type, (me->editflag & ME_EDIT_MIRROR_X));
- DAG_id_flush_update(&me->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&me->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 13dfabc69cb..a94cb9dd971 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
#include "BLI_pbvh.h"
@@ -57,23 +58,24 @@
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_report.h"
+#include "BKE_lattice.h" /* for armature_deform_verts */
-#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
+
+#include "ED_sculpt.h"
#include "ED_screen.h"
#include "ED_view3d.h"
+#include "ED_util.h" /* for crazyspace correction */
#include "paint_intern.h"
#include "sculpt_intern.h"
#include "RNA_access.h"
#include "RNA_define.h"
-
#include "RE_render_ext.h"
-#include "RE_shader_ext.h"
#include "GPU_buffers.h"
@@ -85,10 +87,6 @@
#include <omp.h>
#endif
-/* ==== FORWARD DEFINITIONS =====
- *
- */
-
void ED_sculpt_force_update(bContext *C)
{
Object *ob= CTX_data_active_object(C);
@@ -97,12 +95,39 @@ void ED_sculpt_force_update(bContext *C)
multires_force_update(ob);
}
+void ED_sculpt_modifiers_changed(Object *ob)
+{
+ SculptSession *ss= ob->sculpt;
+
+ if(!ss->cache) {
+ /* we free pbvh on changes, except during sculpt since it can't deal with
+ changing PVBH node organization, we hope topology does not change in
+ the meantime .. weak */
+ if(ss->pbvh) {
+ BLI_pbvh_free(ss->pbvh);
+ ss->pbvh= NULL;
+ }
+
+ sculpt_free_deformMats(ob->sculpt);
+ } else {
+ PBVHNode **nodes;
+ int n, totnode;
+
+ BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+
+ for(n = 0; n < totnode; n++)
+ BLI_pbvh_node_mark_update(nodes[n]);
+
+ MEM_freeN(nodes);
+ }
+}
+
/* Sculpt mode handles multires differently from regular meshes, but only if
it's the last modifier on the stack and it is not on the first level */
struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
{
Mesh *me= (Mesh*)ob->data;
- ModifierData *md, *nmd;
+ ModifierData *md;
if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
/* multires can't work without displacement layer */
@@ -113,48 +138,56 @@ struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
if(md->type == eModifierType_Multires) {
MultiresModifierData *mmd= (MultiresModifierData*)md;
- /* Check if any of the modifiers after multires are active
- * if not it can use the multires struct */
- for(nmd= md->next; nmd; nmd= nmd->next)
- if(modifier_isEnabled(scene, nmd, eModifierMode_Realtime))
- break;
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime))
+ continue;
- if(!nmd && mmd->sculptlvl > 0)
- return mmd;
+ if(mmd->sculptlvl > 0) return mmd;
+ else return NULL;
}
}
return NULL;
}
-/* Checks whether full update mode (slower) needs to be used to work with modifiers */
-int sculpt_modifiers_active(Scene *scene, Object *ob)
+/* Check if there are any active modifiers in stack (used for flushing updates at enter/exit sculpt mode) */
+static int sculpt_has_active_modifiers(Scene *scene, Object *ob)
{
ModifierData *md;
- MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
- /* check if there are any modifiers after what we are sculpting,
- for a multires modifier with a deform modifier in front, we
- do no need to recalculate the modifier stack. note that this
- needs to be in sync with ccgDM_use_grid_pbvh! */
- if(mmd)
- md= mmd->modifier.next;
- else
- md= modifiers_getVirtualModifierList(ob);
-
+ md= modifiers_getVirtualModifierList(ob);
+
/* exception for shape keys because we can edit those */
for(; md; md= md->next) {
if(modifier_isEnabled(scene, md, eModifierMode_Realtime))
- if(md->type != eModifierType_ShapeKey)
- return 1;
+ return 1;
}
return 0;
}
-/* ===== STRUCTS =====
- *
- */
+/* Checks if there are any supported deformation modifiers active */
+int sculpt_modifiers_active(Scene *scene, Object *ob)
+{
+ ModifierData *md;
+ MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
+
+ if(mmd) return 0;
+
+ md= modifiers_getVirtualModifierList(ob);
+
+ /* exception for shape keys because we can edit those */
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+ if(md->type==eModifierType_ShapeKey) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform)
+ return 1;
+ }
+
+ return 0;
+}
typedef enum StrokeFlags {
CLIP_X = 1,
@@ -228,36 +261,10 @@ typedef struct StrokeCache {
float plane_trim_squared;
} StrokeCache;
-/* ===== OPENGL =====
- *
- * Simple functions to get data from the GL
- */
-
-/* Convert a point in model coordinates to 2D screen coordinates. */
-static void projectf(bglMats *mats, const float v[3], float p[2])
-{
- double ux, uy, uz;
-
- gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
- (GLint *)mats->viewport, &ux, &uy, &uz);
- p[0]= ux;
- p[1]= uy;
-}
-
-/*XXX: static void project(bglMats *mats, const float v[3], short p[2])
-{
- float f[2];
- projectf(mats, v, f);
-
- p[0]= f[0];
- p[1]= f[1];
-}
-*/
-
/*** BVH Tree ***/
/* Get a screen-space rectangle of the modified area */
-int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d,
+static int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d,
Object *ob, rcti *rect)
{
StrokeCache *cache = ob->sculpt->cache;
@@ -362,6 +369,7 @@ static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test)
{
test->radius_squared= ss->cache->radius_squared;
copy_v3_v3(test->location, ss->cache->location);
+ test->dist= 0.0f; /* just for initialize */
}
static int sculpt_brush_test(SculptBrushTest *test, float co[3])
@@ -431,7 +439,6 @@ static float frontface(Brush *brush, float sculpt_normal[3], short no[3], float
else {
dot= dot_v3v3(fno, sculpt_normal);
}
-
return dot > 0 ? dot : 0;
}
else {
@@ -527,19 +534,19 @@ static void flip_coord(float out[3], float in[3], const char symm)
out[2]= in[2];
}
-float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle)
+static float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle)
{
float mirror[3];
float distsq;
- float mat[4][4];
//flip_coord(mirror, cache->traced_location, symm);
flip_coord(mirror, cache->true_location, symm);
- unit_m4(mat);
- rotate_m4(mat, axis, angle);
-
- mul_m4_v3(mat, mirror);
+ if(axis != 0) {
+ float mat[4][4]= MAT4_UNITY;
+ rotate_m4(mat, axis, angle);
+ mul_m4_v3(mat, mirror);
+ }
//distsq = len_squared_v3v3(mirror, cache->traced_location);
distsq = len_squared_v3v3(mirror, cache->true_location);
@@ -669,66 +676,6 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
}
}
-float get_tex_pixel(Brush* br, float u, float v)
-{
- TexResult texres;
- float co[3];
- int hasrgb;
-
- co[0] = u;
- co[1] = v;
- co[2] = 0;
-
- memset(&texres, 0, sizeof(TexResult));
- hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 1, &texres);
-
- if (hasrgb & TEX_RGB)
- texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta;
-
- return texres.tin;
-}
-
-#if 0
-
-/* Get a pixel from the texcache at (px, py) */
-static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py)
-{
- unsigned *p;
- p = ss->texcache + py * ss->texcache_side + px;
- return ((unsigned char*)(p))[0];
-}
-
-static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float v)
-{
- unsigned x, y, x2, y2;
- const int tc_max = ss->texcache_side - 1;
- float urat, vrat, uopp;
-
- if(u < 0) u = 0;
- else if(u >= ss->texcache_side) u = tc_max;
- if(v < 0) v = 0;
- else if(v >= ss->texcache_side) v = tc_max;
-
- x = floor(u);
- y = floor(v);
- x2 = x + 1;
- y2 = y + 1;
-
- if(x2 > ss->texcache_side) x2 = tc_max;
- if(y2 > ss->texcache_side) y2 = tc_max;
-
- urat = u - x;
- vrat = v - y;
- uopp = 1 - urat;
-
- return ((get_texcache_pixel(ss, x, y) * uopp +
- get_texcache_pixel(ss, x2, y) * urat) * (1 - vrat) +
- (get_texcache_pixel(ss, x, y2) * uopp +
- get_texcache_pixel(ss, x2, y2) * urat) * vrat) / 255.0;
-}
-
-#endif
-
/* Return a multiplier for brush strength on a particular vertex. */
static float tex_strength(SculptSession *ss, Brush *br, float *point, const float len)
{
@@ -744,7 +691,7 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
/* Get strength by feeding the vertex
location directly into a texture */
externtex(mtex, point, &avg,
- &jnk, &jnk, &jnk, &jnk);
+ &jnk, &jnk, &jnk, &jnk, 0);
}
else if(ss->texcache) {
float rotation = -mtex->rot;
@@ -812,7 +759,7 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
x += br->mtex.ofs[0];
y += br->mtex.ofs[1];
- avg = get_tex_pixel(br, x, y);
+ avg = paint_get_tex_pixel(br, x, y);
}
avg += br->texture_sample_bias;
@@ -887,6 +834,8 @@ static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNod
float out_flip[3] = {0.0f, 0.0f, 0.0f};
+ (void)sd; /* unused w/o openmp */
+
zero_v3(an);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
@@ -1004,7 +953,9 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
/* Don't modify corner vertices */
if(ncount==1) {
- copy_v3_v3(avg, ss->mvert[vert].co);
+ if(ss->deform_cos) copy_v3_v3(avg, ss->deform_cos[vert]);
+ else copy_v3_v3(avg, ss->mvert[vert].co);
+
return;
}
@@ -1020,7 +971,8 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
for(i=0; i<(f->v4?4:3); ++i) {
if(i != skip && (ncount!=2 || BLI_countlist(&ss->fmap[(&f->v1)[i]]) <= 2)) {
- add_v3_v3(avg, ss->mvert[(&f->v1)[i]].co);
+ if(ss->deform_cos) add_v3_v3(avg, ss->deform_cos[(&f->v1)[i]]);
+ else add_v3_v3(avg, ss->mvert[(&f->v1)[i]].co);
++total;
}
}
@@ -1030,8 +982,10 @@ static void neighbor_average(SculptSession *ss, float avg[3], const unsigned ver
if(total>0)
mul_v3_fl(avg, 1.0f / total);
- else
- copy_v3_v3(avg, ss->mvert[vert].co);
+ else {
+ if(ss->deform_cos) copy_v3_v3(avg, ss->deform_cos[vert]);
+ else copy_v3_v3(avg, ss->mvert[vert].co);
+ }
}
static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node, float bstrength)
@@ -1335,7 +1289,7 @@ static void do_pinch_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
if(vd.mvert)
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
+ }
}
BLI_pbvh_vertex_iter_end;
}
@@ -1349,9 +1303,14 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
int n;
float len;
- if (brush->normal_weight > 0)
+ if (brush->normal_weight > 0 || brush->flag & BRUSH_FRONTFACE) {
+ int cache= 1;
+ /* grab brush requires to test on original data */
+ SWAP(int, ss->cache->original, cache);
calc_sculpt_normal(sd, ss, an, nodes, totnode);
-
+ SWAP(int, ss->cache->original, cache);
+ }
+
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
len = len_v3(grab_delta);
@@ -1441,7 +1400,7 @@ static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
int n;
float len;
- if (brush->normal_weight > 0)
+ if (brush->normal_weight > 0 || brush->flag & BRUSH_FRONTFACE)
calc_sculpt_normal(sd, ss, an, nodes, totnode);
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
@@ -1580,7 +1539,7 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
Brush *brush = paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
float area_normal[3], offset[3];
- float lim= ss->cache->radius / 4;
+ float lim= brush->height;
int n;
if(bstrength < 0)
@@ -1613,15 +1572,15 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
sculpt_brush_test_init(ss, &test);
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test(&test, vd.co)) {
- const float fade = bstrength*ss->cache->radius*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno);
+ if(sculpt_brush_test(&test, origco[vd.i])) {
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno);
float *disp= &layer_disp[vd.i];
float val[3];
*disp+= fade;
/* Don't let the displacement go past the limit */
- if((lim < 0 && *disp < lim) || (lim > 0 && *disp > lim))
+ if((lim < 0 && *disp < lim) || (lim >= 0 && *disp > lim))
*disp = lim;
mul_v3_v3fl(val, offset, *disp);
@@ -1687,6 +1646,8 @@ static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
float count = 0;
+ (void)sd; /* unused w/o openmp */
+
zero_v3(fc);
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
@@ -1741,6 +1702,8 @@ static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, P
// fc
float count = 0;
+ (void)sd; /* unused w/o openmp */
+
// an
zero_v3(an);
@@ -2304,9 +2267,8 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
ofs= key_to_vertcos(ob, kb);
/* calculate key coord offsets (from previous location) */
- for (a= 0; a < me->totvert; a++) {
+ for (a= 0; a < me->totvert; a++)
VECSUB(ofs[a], vertCos[a], ofs[a]);
- }
/* apply offsets on other keys */
currkey = me->key->block.first;
@@ -2336,17 +2298,6 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
vertcos_to_key(ob, kb, vertCos);
}
-/* copy the modified vertices from bvh to the active key */
-static void sculpt_update_keyblock(SculptSession *ss)
-{
- float (*vertCos)[3]= BLI_pbvh_get_vertCos(ss->pbvh);
-
- if (vertCos) {
- sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos);
- MEM_freeN(vertCos);
- }
-}
-
static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
{
SculptSearchSphereData data;
@@ -2432,108 +2383,134 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
}
}
- /* copy the modified vertices from mesh to the active key */
- if(ss->kb)
- mesh_to_key(ss->ob->data, ss->kb);
-
- /* optimization: we could avoid copying new coords to keyblock at each */
- /* stroke step if there are no modifiers due to pbvh is used for displaying */
- /* so to increase speed we'll copy new coords to keyblock when stroke is done */
- if(ss->kb && ss->modifiers_active) sculpt_update_keyblock(ss);
-
MEM_freeN(nodes);
}
}
+/* flush displacement from deformed PBVH vertex to original mesh */
+static void sculpt_flush_pbvhvert_deform(SculptSession *ss, PBVHVertexIter *vd)
+{
+ Object *ob= ss->ob;
+ Mesh *me= ob->data;
+ float disp[3], newco[3];
+ int index= vd->vert_indices[vd->i];
+
+ sub_v3_v3v3(disp, vd->co, ss->deform_cos[index]);
+ mul_m3_v3(ss->deform_imats[index], disp);
+ add_v3_v3v3(newco, disp, ss->orig_cos[index]);
+
+ copy_v3_v3(ss->deform_cos[index], vd->co);
+ copy_v3_v3(ss->orig_cos[index], newco);
+
+ if(!ss->kb)
+ copy_v3_v3(me->mvert[index].co, newco);
+}
+
static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
{
Brush *brush= paint_brush(&sd->paint);
PBVHNode** nodes;
- int totnode;
- int n;
+ int totnode, n;
BLI_pbvh_gather_proxies(ss->pbvh, &nodes, &totnode);
- switch (brush->sculpt_tool) {
- case SCULPT_TOOL_GRAB:
- case SCULPT_TOOL_ROTATE:
- case SCULPT_TOOL_THUMB:
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for (n= 0; n < totnode; n++) {
- PBVHVertexIter vd;
- PBVHProxyNode* proxies;
- int proxy_count;
- float (*origco)[3];
+ if(!ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
+ /* these brushes start from original coordinates */
+ const int use_orco = (ELEM3(brush->sculpt_tool, SCULPT_TOOL_GRAB,
+ SCULPT_TOOL_ROTATE, SCULPT_TOOL_THUMB));
- origco= sculpt_undo_push_node(ss, nodes[n])->co;
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for (n= 0; n < totnode; n++) {
+ PBVHVertexIter vd;
+ PBVHProxyNode* proxies;
+ int proxy_count;
+ float (*orco)[3];
- BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
+ if(use_orco)
+ orco= sculpt_undo_push_node(ss, nodes[n])->co;
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- float val[3];
- int p;
+ BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
+
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ float val[3];
+ int p;
- copy_v3_v3(val, origco[vd.i]);
+ if(use_orco)
+ copy_v3_v3(val, orco[vd.i]);
+ else
+ copy_v3_v3(val, vd.co);
- for (p= 0; p < proxy_count; p++)
- add_v3_v3(val, proxies[p].co[vd.i]);
+ for (p= 0; p < proxy_count; p++)
+ add_v3_v3(val, proxies[p].co[vd.i]);
- sculpt_clip(sd, ss, vd.co, val);
- }
- BLI_pbvh_vertex_iter_end;
+ sculpt_clip(sd, ss, vd.co, val);
- BLI_pbvh_node_free_proxies(nodes[n]);
+ if(ss->modifiers_active)
+ sculpt_flush_pbvhvert_deform(ss, &vd);
}
+ BLI_pbvh_vertex_iter_end;
- break;
+ BLI_pbvh_node_free_proxies(nodes[n]);
+ }
+ }
- case SCULPT_TOOL_DRAW:
- case SCULPT_TOOL_CLAY:
- case SCULPT_TOOL_CLAY_TUBES:
- case SCULPT_TOOL_CREASE:
- case SCULPT_TOOL_BLOB:
- case SCULPT_TOOL_FILL:
- case SCULPT_TOOL_FLATTEN:
- case SCULPT_TOOL_INFLATE:
- case SCULPT_TOOL_NUDGE:
- case SCULPT_TOOL_PINCH:
- case SCULPT_TOOL_SCRAPE:
- case SCULPT_TOOL_SNAKE_HOOK:
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for (n= 0; n < totnode; n++) {
- PBVHVertexIter vd;
- PBVHProxyNode* proxies;
- int proxy_count;
+ if (nodes)
+ MEM_freeN(nodes);
+}
- BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
+/* copy the modified vertices from bvh to the active key */
+static void sculpt_update_keyblock(SculptSession *ss)
+{
+ float (*vertCos)[3];
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- float val[3];
- int p;
+ /* Keyblock update happens after hadning deformation caused by modifiers,
+ so ss->orig_cos would be updated with new stroke */
+ if(ss->orig_cos) vertCos = ss->orig_cos;
+ else vertCos = BLI_pbvh_get_vertCos(ss->pbvh);
- copy_v3_v3(val, vd.co);
+ if (vertCos) {
+ sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos);
- for (p= 0; p < proxy_count; p++)
- add_v3_v3(val, proxies[p].co[vd.i]);
+ if(vertCos != ss->orig_cos)
+ MEM_freeN(vertCos);
+ }
+}
- sculpt_clip(sd, ss, vd.co, val);
- }
- BLI_pbvh_vertex_iter_end;
+/* flush displacement from deformed PBVH to original layer */
+static void sculpt_flush_stroke_deform(Sculpt *sd, SculptSession *ss)
+{
+ if(!ss->kb) {
+ Object *ob= ss->ob;
+ Mesh *me= (Mesh*)ob->data;
+ Brush *brush= paint_brush(&sd->paint);
- BLI_pbvh_node_free_proxies(nodes[n]);
+ if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
+ /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't
+ propagate needed deformation to original base */
- }
+ int n, totnode;
+ PBVHNode** nodes;
- break;
+ BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
- case SCULPT_TOOL_SMOOTH:
- case SCULPT_TOOL_LAYER:
- default:
- break;
- }
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for (n= 0; n < totnode; n++) {
+ PBVHVertexIter vd;
- if (nodes)
- MEM_freeN(nodes);
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ sculpt_flush_pbvhvert_deform(ss, &vd);
+ }
+ BLI_pbvh_vertex_iter_end;
+ }
+
+ MEM_freeN(nodes);
+ }
+
+ /* Modifiers could depend on mesh normals, so we should update them/
+ Note, then if sculpting happens on locked key, normals should be re-calculated
+ after applying coords from keyblock on base mesh */
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ } else sculpt_update_keyblock(ss);
}
//static int max_overlap_count(Sculpt *sd)
@@ -2555,8 +2532,10 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
/* Flip all the editdata across the axis/axes specified by symm. Used to
calculate multiple modifications to the mesh when symmetry is enabled. */
-static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float feather)
+static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm, const char axis, const float angle, const float UNUSED(feather))
{
+ (void)sd; /* unused */
+
flip_coord(cache->location, cache->true_location, symm);
flip_coord(cache->grab_delta_symmetry, cache->grab_delta, symm);
flip_coord(cache->view_normal, cache->true_view_normal, symm);
@@ -2575,8 +2554,11 @@ static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm,
unit_m4(cache->symm_rot_mat);
unit_m4(cache->symm_rot_mat_inv);
- rotate_m4(cache->symm_rot_mat, axis, angle);
- rotate_m4(cache->symm_rot_mat_inv, axis, -angle);
+
+ if(axis) { /* expects XYZ */
+ rotate_m4(cache->symm_rot_mat, axis, angle);
+ rotate_m4(cache->symm_rot_mat_inv, axis, -angle);
+ }
mul_m4_v3(cache->symm_rot_mat, cache->location);
mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry);
@@ -2594,6 +2576,18 @@ static void do_radial_symmetry(Sculpt *sd, SculptSession *ss, Brush *brush, cons
}
}
+/* noise texture gives different values for the same input coord; this
+ can tear a multires mesh during sculpting so do a stitch in this
+ case */
+static void sculpt_fix_noise_tear(Sculpt *sd, SculptSession *ss)
+{
+ Brush *brush = paint_brush(&sd->paint);
+ MTex *mtex = &brush->mtex;
+
+ if(ss->multires && mtex->tex && mtex->tex->type == TEX_NOISE)
+ multires_stitch_grids(ss->ob);
+}
+
static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
{
Brush *brush = paint_brush(&sd->paint);
@@ -2624,6 +2618,12 @@ static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
sculpt_combine_proxies(sd, ss);
+ /* hack to fix noise texture tearing mesh */
+ sculpt_fix_noise_tear(sd, ss);
+
+ if (ss->modifiers_active)
+ sculpt_flush_stroke_deform(sd, ss);
+
cache->first_time= 0;
}
@@ -2645,6 +2645,17 @@ static void sculpt_update_tex(Sculpt *sd, SculptSession *ss)
}
}
+void sculpt_free_deformMats(SculptSession *ss)
+{
+ if(ss->orig_cos) MEM_freeN(ss->orig_cos);
+ if(ss->deform_cos) MEM_freeN(ss->deform_cos);
+ if(ss->deform_imats) MEM_freeN(ss->deform_imats);
+
+ ss->orig_cos = NULL;
+ ss->deform_cos = NULL;
+ ss->deform_imats = NULL;
+}
+
void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
@@ -2679,6 +2690,23 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
ss->pbvh = dm->getPBVH(ob, dm);
ss->fmap = (need_fmap && dm->getFaceMap)? dm->getFaceMap(ob, dm): NULL;
+ if(ss->modifiers_active) {
+ if(!ss->orig_cos) {
+ int a;
+
+ sculpt_free_deformMats(ss);
+
+ if(ss->kb) ss->orig_cos = key_to_vertcos(ob, ss->kb);
+ else ss->orig_cos = mesh_getVertexCos(ob->data, NULL);
+
+ crazyspace_build_sculpt(scene, ob, &ss->deform_imats, &ss->deform_cos);
+ BLI_pbvh_apply_vertCos(ss->pbvh, ss->deform_cos);
+
+ for(a = 0; a < ((Mesh*)ob->data)->totvert; ++a)
+ invert_m3(ss->deform_imats[a]);
+ }
+ } else sculpt_free_deformMats(ss);
+
/* if pbvh is deformed, key block is already applied to it */
if (ss->kb && !BLI_pbvh_isDeformed(ss->pbvh)) {
float (*vertCos)[3]= key_to_vertcos(ob, ss->kb);
@@ -2702,7 +2730,7 @@ int sculpt_poll(bContext *C)
return sculpt_mode_poll(C) && paint_poll(C);
}
-static char *sculpt_tool_name(Sculpt *sd)
+static const char *sculpt_tool_name(Sculpt *sd)
{
Brush *brush = paint_brush(&sd->paint);
@@ -2804,21 +2832,6 @@ static void SCULPT_OT_radial_control(wmOperatorType *ot)
/**** Operator for applying a stroke (various attributes including mouse path)
using the current brush. ****/
-static float unproject_brush_radius(Object *ob, ViewContext *vc, float center[3], float offset)
-{
- float delta[3], scale, loc[3];
-
- mul_v3_m4v3(loc, ob->obmat, center);
-
- initgrabz(vc->rv3d, loc[0], loc[1], loc[2]);
- window_to_3d_delta(vc->ar, delta, offset, 0);
-
- scale= fabsf(mat4_to_scale(ob->obmat));
- scale= (scale == 0.0f)? 1.0f: scale;
-
- return len_v3(delta)/scale;
-}
-
static void sculpt_cache_free(StrokeCache *cache)
{
if(cache->face_norms)
@@ -2828,6 +2841,36 @@ static void sculpt_cache_free(StrokeCache *cache)
MEM_freeN(cache);
}
+/* Initialize mirror modifier clipping */
+static void sculpt_init_mirror_clipping(Object *ob, SculptSession *ss)
+{
+ ModifierData *md;
+ int i;
+
+ for(md= ob->modifiers.first; md; md= md->next) {
+ if(md->type==eModifierType_Mirror &&
+ (md->mode & eModifierMode_Realtime)) {
+ MirrorModifierData *mmd = (MirrorModifierData*)md;
+
+ if(mmd->flag & MOD_MIR_CLIPPING) {
+ /* check each axis for mirroring */
+ for(i = 0; i < 3; ++i) {
+ if(mmd->flag & (MOD_MIR_AXIS_X << i)) {
+ /* enable sculpt clipping */
+ ss->cache->flag |= CLIP_X << i;
+
+ /* update the clip tolerance */
+ if(mmd->tolerance >
+ ss->cache->clip_tolerance[i])
+ ss->cache->clip_tolerance[i] =
+ mmd->tolerance;
+ }
+ }
+ }
+ }
+ }
+}
+
/* Initialize the stroke cache invariants from operator properties */
static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSession *ss, wmOperator *op, wmEvent *event)
{
@@ -2835,7 +2878,6 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
Brush *brush = paint_brush(&sd->paint);
ViewContext *vc = paint_stroke_view_context(op->customdata);
Object *ob= CTX_data_active_object(C);
- ModifierData *md;
int i;
int mode;
@@ -2853,22 +2895,9 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
ss->cache->plane_trim_squared = brush->plane_trim * brush->plane_trim;
- /* Initialize mirror modifier clipping */
-
ss->cache->flag = 0;
- for(md= ob->modifiers.first; md; md= md->next) {
- if(md->type==eModifierType_Mirror && (md->mode & eModifierMode_Realtime)) {
- const MirrorModifierData *mmd = (MirrorModifierData*) md;
-
- /* Mark each axis that needs clipping along with its tolerance */
- if(mmd->flag & MOD_MIR_CLIPPING) {
- ss->cache->flag |= CLIP_X << mmd->axis;
- if(mmd->tolerance > ss->cache->clip_tolerance[mmd->axis])
- ss->cache->clip_tolerance[mmd->axis] = mmd->tolerance;
- }
- }
- }
+ sculpt_init_mirror_clipping(ob, ss);
/* Initial mouse location */
if (event) {
@@ -2881,8 +2910,13 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
}
mode = RNA_int_get(op->ptr, "mode");
- cache->invert = mode == WM_BRUSHSTROKE_INVERT;
- cache->alt_smooth = mode == WM_BRUSHSTROKE_SMOOTH;
+ cache->invert = mode == BRUSH_STROKE_INVERT;
+ cache->alt_smooth = mode == BRUSH_STROKE_SMOOTH;
+
+ /* not very nice, but with current events system implementation
+ we can't handle brush appearance inversion hotkey separately (sergey) */
+ if(cache->invert) brush->flag |= BRUSH_INVERTED;
+ else brush->flag &= ~BRUSH_INVERTED;
/* Alt-Smooth */
if (ss->cache->alt_smooth) {
@@ -2919,8 +2953,12 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
ss->layer_co= MEM_mallocN(sizeof(float) * 3 * ss->totvert,
"sculpt mesh vertices copy");
- for(i = 0; i < ss->totvert; ++i)
- copy_v3_v3(ss->layer_co[i], ss->mvert[i].co);
+ if(ss->deform_cos) memcpy(ss->layer_co, ss->deform_cos, ss->totvert);
+ else {
+ for(i = 0; i < ss->totvert; ++i) {
+ copy_v3_v3(ss->layer_co[i], ss->mvert[i].co);
+ }
+ }
}
}
@@ -2936,7 +2974,7 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
cache->original = 1;
}
- if(ELEM7(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES))
+ if(ELEM8(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_CREASE, SCULPT_TOOL_BLOB, SCULPT_TOOL_LAYER, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_CLAY_TUBES, SCULPT_TOOL_ROTATE))
if(!(brush->flag & BRUSH_ACCUMULATE))
cache->original = 1;
@@ -3043,7 +3081,13 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
cache->pen_flip = RNA_boolean_get(ptr, "pen_flip");
RNA_float_get_array(ptr, "mouse", cache->mouse);
- cache->pressure = RNA_float_get(ptr, "pressure");
+ /* XXX: Use preassure value from first brush step for brushes which don't
+ support strokes (grab, thumb). They depends on initial state and
+ brush coord/pressure/etc.
+ It's more an events design issue, which doesn't split coordinate/pressure/angle
+ changing events. We should avoid this after events system re-design */
+ if(paint_space_stroke_enabled(brush) || cache->first_time)
+ cache->pressure = RNA_float_get(ptr, "pressure");
/* Truly temporary data that isn't stored in properties */
@@ -3055,7 +3099,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
if(cache->first_time) {
if (!brush_use_locked_size(brush)) {
- cache->initial_radius= unproject_brush_radius(ss->ob, cache->vc, cache->true_location, brush_size(brush));
+ cache->initial_radius= paint_calc_object_space_radius(cache->vc, cache->true_location, brush_size(brush));
brush_set_unprojected_radius(brush, cache->initial_radius);
}
else {
@@ -3117,7 +3161,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
if (!hit)
copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
- cache->radius= unproject_brush_radius(ss->ob, paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius);
+ cache->radius= paint_calc_object_space_radius(paint_stroke_view_context(stroke), cache->true_location, cache->pixel_radius);
cache->radius_squared = cache->radius*cache->radius;
copy_v3_v3(sd->anchored_location, cache->true_location);
@@ -3178,7 +3222,7 @@ typedef struct {
int original;
} SculptRaycastData;
-void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin)
+static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin)
{
if (BLI_pbvh_node_get_tmin(node) < *tmin) {
SculptRaycastData *srd = data_v;
@@ -3328,7 +3372,7 @@ static void sculpt_flush_update(bContext *C)
GPU_drawobject_free(ob->derivedFinal);
if(ss->modifiers_active) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ED_region_tag_redraw(ar);
}
else {
@@ -3336,7 +3380,6 @@ static void sculpt_flush_update(bContext *C)
int off = 0;
BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL);
-
if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
//rcti tmp;
@@ -3433,14 +3476,17 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
/* Finished */
if(ss->cache) {
+ Brush *brush= paint_brush(&sd->paint);
+ brush->flag &= ~BRUSH_INVERTED;
+
sculpt_stroke_modifiers_check(C, ss);
/* Alt-Smooth */
if (ss->cache->alt_smooth) {
Paint *p= &sd->paint;
- Brush *br= (Brush *)find_id("BR", ss->cache->saved_active_brush_name);
- if(br) {
- paint_brush_set(p, br);
+ brush= (Brush *)find_id("BR", ss->cache->saved_active_brush_name);
+ if(brush) {
+ paint_brush_set(p, brush);
}
}
@@ -3460,7 +3506,7 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
/* try to avoid calling this, only for e.g. linked duplicates now */
if(((Mesh*)ob->data)->id.us > 1)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
@@ -3522,10 +3568,10 @@ static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
{
static EnumPropertyItem stroke_mode_items[] = {
- { WM_BRUSHSTROKE_NORMAL, "NORMAL", 0, "Normal", "Apply brush normally" },
- { WM_BRUSHSTROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke" },
- { WM_BRUSHSTROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke" },
- { 0 }
+ {BRUSH_STROKE_NORMAL, "NORMAL", 0, "Normal", "Apply brush normally"},
+ {BRUSH_STROKE_INVERT, "INVERT", 0, "Invert", "Invert action of brush for duration of stroke"},
+ {BRUSH_STROKE_SMOOTH, "SMOOTH", 0, "Smooth", "Switch brush to smooth mode for duration of stroke"},
+ {0}
};
/* identifiers */
@@ -3546,7 +3592,7 @@ static void SCULPT_OT_brush_stroke(wmOperatorType *ot)
RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement,
"Stroke", "");
- RNA_def_enum(ot->srna, "mode", stroke_mode_items, WM_BRUSHSTROKE_NORMAL,
+ RNA_def_enum(ot->srna, "mode", stroke_mode_items, BRUSH_STROKE_NORMAL,
"Sculpt Stroke Mode",
"Action taken when a sculpt stroke is made");
@@ -3608,14 +3654,14 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *unused)
/* multires in sculpt mode could have different from object mode subdivision level */
flush_recalc |= mmd && mmd->sculptlvl != mmd->lvl;
/* if object has got active modifiers, it's dm could be different in sculpt mode */
- //flush_recalc |= sculpt_modifiers_active(scene, ob);
+ flush_recalc |= sculpt_has_active_modifiers(scene, ob);
if(ob->mode & OB_MODE_SCULPT) {
if(mmd)
multires_force_update(ob);
if(flush_recalc)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* Leave sculptmode */
ob->mode &= ~OB_MODE_SCULPT;
@@ -3627,7 +3673,7 @@ static int sculpt_toggle_mode(bContext *C, wmOperator *unused)
ob->mode |= OB_MODE_SCULPT;
if(flush_recalc)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
/* Create persistent sculpt mode data */
if(!ts->sculpt) {
@@ -3661,16 +3707,15 @@ static void SCULPT_OT_sculptmode_toggle(wmOperatorType *ot)
/* api callbacks */
ot->exec= sculpt_toggle_mode;
- ot->poll= ED_operator_object_active;
+ ot->poll= ED_operator_object_active_editable_mesh;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void ED_operatortypes_sculpt()
+void ED_operatortypes_sculpt(void)
{
WM_operatortype_append(SCULPT_OT_radial_control);
WM_operatortype_append(SCULPT_OT_brush_stroke);
WM_operatortype_append(SCULPT_OT_sculptmode_toggle);
WM_operatortype_append(SCULPT_OT_set_persistent_base);
}
-
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 254876d9b68..76a7349606c 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -55,13 +55,15 @@ void sculpt_radialcontrol_start(int mode);
struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob);
struct Brush *sculptmode_brush(void);
-//void do_symmetrical_brush_actions(struct Sculpt *sd, struct wmOperator *wm, struct BrushAction *a, short *, short *);
void sculpt(Sculpt *sd);
int sculpt_poll(struct bContext *C);
void sculpt_update_mesh_elements(struct Scene *scene, struct Object *ob, int need_fmap);
+/* Deformed mesh sculpt */
+void sculpt_free_deformMats(struct SculptSession *ss);
+
/* Stroke */
struct SculptStroke *sculpt_stroke_new(const int max);
void sculpt_stroke_free(struct SculptStroke *);
@@ -70,9 +72,6 @@ void sculpt_stroke_apply(struct Sculpt *sd, struct SculptStroke *);
void sculpt_stroke_apply_all(struct Sculpt *sd, struct SculptStroke *);
int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float out[3], float mouse[2]);
-/* Partial Mesh Visibility */
-void sculptmode_pmv(int mode);
-
/* Undo */
typedef struct SculptUndoNode {
@@ -82,6 +81,7 @@ typedef struct SculptUndoNode {
void *node; /* only during push, not valid afterwards! */
float (*co)[3];
+ float (*orig_co)[3];
short (*no)[3];
int totvert;
@@ -104,13 +104,10 @@ typedef struct SculptUndoNode {
SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node);
SculptUndoNode *sculpt_undo_get_node(PBVHNode *node);
-void sculpt_undo_push_begin(char *name);
+void sculpt_undo_push_begin(const char *name);
void sculpt_undo_push_end(void);
-struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob);
int sculpt_modifiers_active(Scene *scene, Object *ob);
void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3]);
-void brush_jitter_pos(struct Brush *brush, float *pos, float *jitterpos);
-
#endif
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index e92740678fd..d88d7a5ac49 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -33,6 +33,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_threads.h"
@@ -48,10 +49,13 @@
#include "BKE_multires.h"
#include "BKE_paint.h"
#include "BKE_key.h"
+#include "BKE_mesh.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "GPU_buffers.h"
+
#include "ED_sculpt.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
@@ -64,6 +68,12 @@ static void update_cb(PBVHNode *node, void *unused)
BLI_pbvh_node_mark_update(node);
}
+static void sculpt_restore_deformed(SculptSession *ss, SculptUndoNode *unode, int uindex, int oindex, float coord[3])
+{
+ swap_v3_v3(coord, unode->orig_co[uindex]);
+ copy_v3_v3(unode->co[uindex], ss->deform_cos[oindex]);
+}
+
static void sculpt_undo_restore(bContext *C, ListBase *lb)
{
Scene *scene = CTX_data_scene(C);
@@ -114,8 +124,10 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
float (*vertCos)[3];
vertCos= key_to_vertcos(ob, ss->kb);
- for(i=0; i<unode->totvert; i++)
- swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ for(i=0; i<unode->totvert; i++) {
+ if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], vertCos[index[i]]);
+ else swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ }
/* propagate new coords to keyblock */
sculpt_vertcos_to_key(ob, ss->kb, vertCos);
@@ -127,7 +139,8 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
MEM_freeN(vertCos);
} else {
for(i=0; i<unode->totvert; i++) {
- swap_v3_v3(mvert[index[i]].co, unode->co[i]);
+ if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], mvert[index[i]].co);
+ else swap_v3_v3(mvert[index[i]].co, unode->co[i]);
mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE;
}
}
@@ -159,6 +172,7 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
}
if(update) {
+ int tag_update= 0;
/* we update all nodes still, should be more clever, but also
needs to work correct when exiting/entering sculpt mode and
the nodes get recreated, though in that case it could do all */
@@ -168,8 +182,21 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
if((mmd=sculpt_multires_active(scene, ob)))
multires_mark_as_modified(ob);
- if(ss->modifiers_active || ((Mesh*)ob->data)->id.us > 1)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ tag_update= ((Mesh*)ob->data)->id.us > 1;
+
+ if(ss->modifiers_active) {
+ Mesh *me= ob->data;
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+
+ sculpt_free_deformMats(ss);
+ tag_update|= 1;
+ }
+
+ if(tag_update)
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+
+ /* for non-PBVH drawing, need to recreate VBOs */
+ GPU_drawobject_free(ob->derivedFinal);
}
}
@@ -188,6 +215,8 @@ static void sculpt_undo_free(ListBase *lb)
MEM_freeN(unode->grids);
if(unode->layer_disp)
MEM_freeN(unode->layer_disp);
+ if(unode->orig_co)
+ MEM_freeN(unode->orig_co);
}
}
@@ -249,6 +278,9 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
unode->index= MEM_mapallocN(sizeof(int)*allvert, "SculptUndoNode.index");
}
+ if(ss->modifiers_active)
+ unode->orig_co= MEM_callocN(allvert*sizeof(*unode->orig_co), "undoSculpt orig_cos");
+
BLI_unlock_thread(LOCK_CUSTOM1);
/* copy threaded, hopefully this is the performance critical part */
@@ -260,6 +292,9 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
if(vd.no) VECCOPY(unode->no[vd.i], vd.no)
else normal_float_to_short_v3(unode->no[vd.i], vd.fno);
if(vd.vert_indices) unode->index[vd.i]= vd.vert_indices[vd.i];
+
+ if(ss->modifiers_active)
+ copy_v3_v3(unode->orig_co[vd.i], ss->orig_cos[unode->index[vd.i]]);
}
BLI_pbvh_vertex_iter_end;
}
@@ -274,7 +309,7 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
return unode;
}
-void sculpt_undo_push_begin(char *name)
+void sculpt_undo_push_begin(const char *name)
{
undo_paint_push_begin(UNDO_PAINT_MESH, name,
sculpt_undo_restore, sculpt_undo_free);
diff --git a/source/blender/editors/sound/CMakeLists.txt b/source/blender/editors/sound/CMakeLists.txt
index 02765726c6e..c2f7707309b 100644
--- a/source/blender/editors/sound/CMakeLists.txt
+++ b/source/blender/editors/sound/CMakeLists.txt
@@ -19,17 +19,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
- ../../../../intern/audaspace/intern
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+ ../../../../intern/audaspace/intern
+)
+
+set(SRC
+ sound_ops.c
+
+ sound_intern.h
)
-BLENDERLIB(bf_editor_sound "${SRC}" "${INC}")
+blender_add_lib(bf_editor_sound "${SRC}" "${INC}")
diff --git a/source/blender/editors/sound/Makefile b/source/blender/editors/sound/Makefile
deleted file mode 100644
index f51e15627a2..00000000000
--- a/source/blender/editors/sound/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_opsound
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/sound/SConscript b/source/blender/editors/sound/SConscript
index 8010dd49c57..e17bccdadd9 100644
--- a/source/blender/editors/sound/SConscript
+++ b/source/blender/editors/sound/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../../blenloader'
incs += ' #/intern/audaspace/intern'
defs = []
diff --git a/source/blender/editors/sound/sound_intern.h b/source/blender/editors/sound/sound_intern.h
index 455c1896c7c..4cc91c9fec4 100644
--- a/source/blender/editors/sound/sound_intern.h
+++ b/source/blender/editors/sound/sound_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index fe1fe3266bc..2d8f1dc240c 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,9 +29,13 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include <stddef.h>
#include "MEM_guardedalloc.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -41,13 +45,11 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_packedFile.h"
#include "BKE_sound.h"
-#include "BLI_blenlib.h"
-
-
#include "RNA_access.h"
#include "RNA_define.h"
#include "RNA_enum_types.h"
@@ -59,6 +61,9 @@
#include "AUD_C-API.h"
+#include "ED_sound.h"
+#include "ED_util.h"
+
#include "sound_intern.h"
/******************** open sound operator ********************/
@@ -185,7 +190,7 @@ static int pack_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void SOUND_OT_pack(wmOperatorType *ot)
+static void SOUND_OT_pack(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Pack Sound";
@@ -202,72 +207,17 @@ void SOUND_OT_pack(wmOperatorType *ot)
/********************* unpack operator *********************/
-// XXX this function is in image_ops.c too, exactly the same, should be moved to a generally accessible position
-static void unpack_menu(bContext *C, char *opname, char *abs_name, char *folder, PackedFile *pf)
-{
- uiPopupMenu *pup;
- uiLayout *layout;
- char line[FILE_MAX + 100];
- char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
-
- strcpy(local_name, abs_name);
- BLI_splitdirstring(local_name, fi);
- sprintf(local_name, "//%s/%s", folder, fi);
-
- pup= uiPupMenuBegin(C, "Unpack file", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE);
-
- if(strcmp(abs_name, local_name)) {
- switch(checkPackedFile(local_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- sprintf(line, "Overwrite %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- break;
- }
- }
-
- switch(checkPackedFile(abs_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", abs_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", abs_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- sprintf(line, "Overwrite %s", local_name);
- uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- break;
- }
-
- uiPupMenuEnd(C, pup);
-}
-
-static int unpack_exec(bContext *C, wmOperator *op)
+static int sound_unpack_exec(bContext *C, wmOperator *op)
{
int method= RNA_enum_get(op->ptr, "method");
- Editing* ed = CTX_data_scene(C)->ed;
- bSound* sound;
-
- if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
- return OPERATOR_CANCELLED;
+ bSound* sound= NULL;
- sound = ed->act_seq->sound;
+ /* find the suppplied image by name */
+ if (RNA_property_is_set(op->ptr, "id")) {
+ char sndname[22];
+ RNA_string_get(op->ptr, "id", sndname);
+ sound = BLI_findstring(&CTX_data_main(C)->sound, sndname, offsetof(ID, name) + 2);
+ }
if(!sound || !sound->packedfile)
return OPERATOR_CANCELLED;
@@ -275,16 +225,19 @@ static int unpack_exec(bContext *C, wmOperator *op)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
- unpackSound(op->reports, sound, method);
+ unpackSound(CTX_data_main(C), op->reports, sound, method);
return OPERATOR_FINISHED;
}
-static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sound_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Editing* ed = CTX_data_scene(C)->ed;
bSound* sound;
+ if(RNA_property_is_set(op->ptr, "id"))
+ return sound_unpack_exec(C, op);
+
if(!ed || !ed->act_seq || ed->act_seq->type != SEQ_SOUND)
return OPERATOR_CANCELLED;
@@ -296,12 +249,12 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
- unpack_menu(C, "SOUND_OT_unpack", sound->name, "audio", sound->packedfile);
+ unpack_menu(C, "SOUND_OT_unpack", sound->id.name+2, sound->name, "audio", sound->packedfile);
return OPERATOR_FINISHED;
}
-void SOUND_OT_unpack(wmOperatorType *ot)
+static void SOUND_OT_unpack(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Unpack Sound";
@@ -309,8 +262,8 @@ void SOUND_OT_unpack(wmOperatorType *ot)
ot->idname= "SOUND_OT_unpack";
/* api callbacks */
- ot->exec= unpack_exec;
- ot->invoke= unpack_invoke;
+ ot->exec= sound_unpack_exec;
+ ot->invoke= sound_unpack_invoke;
ot->poll= sound_poll;
/* flags */
@@ -318,6 +271,7 @@ void SOUND_OT_unpack(wmOperatorType *ot)
/* properties */
RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
+ RNA_def_string(ot->srna, "id", "", 21, "Sound Name", "Sound datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */
}
/* ******************************************************* */
diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt
index 85275b2db23..9280e4d0e7f 100644
--- a/source/blender/editors/space_action/CMakeLists.txt
+++ b/source/blender/editors/space_action/CMakeLists.txt
@@ -19,17 +19,25 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
)
+set(SRC
+ action_draw.c
+ action_edit.c
+ action_ops.c
+ action_select.c
+ space_action.c
+
+ action_intern.h
+)
-BLENDERLIB(bf_editor_space_action "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_action "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_action/Makefile b/source/blender/editors/space_action/Makefile
deleted file mode 100644
index 19aeb54cc2f..00000000000
--- a/source/blender/editors/space_action/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_action
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_action/SConscript b/source/blender/editors/space_action/SConscript
index 9ef42882b26..0fee8ff68ab 100644
--- a/source/blender/editors/space_action/SConscript
+++ b/source/blender/editors/space_action/SConscript
@@ -4,6 +4,6 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
-env.BlenderLib ( 'bf_editors_space_action', sources, Split(incs), [], libtype=['core'], priority=[80] )
+env.BlenderLib ( 'bf_editors_space_action', sources, Split(incs), [], libtype=['core'], priority=[40] )
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index d2067790b2f..040c5ebaf47 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,9 +34,9 @@
#include <string.h>
#include <float.h>
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
/* Types --------------------------------------------------------------- */
@@ -45,7 +45,7 @@
#include "BKE_action.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
/* Everything from source (BIF, BDR, BSE) ------------------------------ */
@@ -58,12 +58,13 @@
#include "ED_anim_api.h"
#include "ED_keyframes_draw.h"
+#include "action_intern.h"
/* ************************************************************************* */
/* Channel List */
/* left hand part */
-void draw_channel_names(bContext *C, bAnimContext *ac, SpaceAction *saction, ARegion *ar)
+void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -90,8 +91,8 @@ void draw_channel_names(bContext *C, bAnimContext *ac, SpaceAction *saction, ARe
*/
v2d->tot.ymin= (float)(-height);
}
- /* need to do a view-sync here, so that the keys area doesn't jump around */
- UI_view2d_sync(NULL, ac->sa, v2d, V2D_VIEWSYNC_AREA_VERTICAL);
+ /* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
+ UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY);
/* loop through channels, and set up drawing depending on their type */
{ /* first pass: just the standard GL-drawing for backdrop + text */
@@ -162,9 +163,9 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
float act_start, act_end, y;
int height, items;
- char col1[3], col2[3];
- char col1a[3], col2a[3];
- char col1b[3], col2b[3];
+ unsigned char col1[3], col2[3];
+ unsigned char col1a[3], col2a[3];
+ unsigned char col1b[3], col2b[3];
/* get theme colors */
@@ -228,7 +229,7 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
switch (ale->type) {
case ANIMTYPE_SUMMARY:
{
- // FIXME: hardcoded colours - reddish color from NLA
+ // FIXME: hardcoded colors - reddish color from NLA
glColor4f(0.8f, 0.2f, 0.0f, 0.4f);
}
break;
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 916b0032f17..2c3a88c390e 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,8 +35,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -53,10 +55,12 @@
#include "UI_view2d.h"
#include "ED_anim_api.h"
+#include "ED_gpencil.h"
#include "ED_keyframing.h"
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_transform.h"
+#include "ED_markers.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -70,28 +74,44 @@
/* ******************** New Action Operator *********************** */
-static int act_new_exec(bContext *C, wmOperator *op)
+static int act_new_exec(bContext *C, wmOperator *UNUSED(op))
{
- bAction *action;
PointerRNA ptr, idptr;
PropertyRNA *prop;
- // XXX need to restore behaviour to copy old actions...
- action= add_empty_action("Action");
-
/* hook into UI */
uiIDContextProperty(C, &ptr, &prop);
-
- if(prop) {
- /* when creating new ID blocks, use is already 1, but RNA
- * pointer se also increases user, so this compensates it */
+
+ if (prop) {
+ bAction *action=NULL, *oldact=NULL;
+ PointerRNA oldptr;
+
+ /* create action - the way to do this depends on whether we've got an
+ * existing one there already, in which case we make a copy of it
+ * (which is useful for "versioning" actions within the same file)
+ */
+ oldptr = RNA_property_pointer_get(&ptr, prop);
+ oldact = (bAction *)oldptr.id.data;
+
+ if (oldact && GS(oldact->id.name)==ID_AC) {
+ /* make a copy of the existing action */
+ action= copy_action(oldact);
+ }
+ else {
+ /* just make a new (empty) action */
+ action= add_empty_action("Action");
+ }
+
+ /* when creating new ID blocks, use is already 1 (fake user),
+ * but RNA pointer use also increases user, so this compensates it
+ */
action->id.us--;
-
+
RNA_id_pointer_create(&action->id, &idptr);
RNA_property_pointer_set(&ptr, prop, idptr);
RNA_property_update(C, &ptr, prop);
}
-
+
/* set notifier that keyframes have changed */
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
@@ -173,7 +193,7 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
/* ****************** Automatic Preview-Range Operator ****************** */
-static int actkeys_previewrange_exec(bContext *C, wmOperator *op)
+static int actkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene;
@@ -217,7 +237,7 @@ void ACTION_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int actkeys_viewall_exec(bContext *C, wmOperator *op)
+static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -291,7 +311,8 @@ static short copy_action_keys (bAnimContext *ac)
}
-static short paste_action_keys (bAnimContext *ac)
+static short paste_action_keys (bAnimContext *ac,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
ListBase anim_data = {NULL, NULL};
int filter, ok=0;
@@ -301,7 +322,7 @@ static short paste_action_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* paste keyframes */
- ok= paste_animedit_keys(ac, &anim_data);
+ ok= paste_animedit_keys(ac, &anim_data, offset_mode, merge_mode);
/* clean up */
BLI_freelistN(&anim_data);
@@ -341,29 +362,35 @@ void ACTION_OT_copy (wmOperatorType *ot)
ot->description= "Copy selected keyframes to the copy/paste buffer";
/* api callbacks */
+// ot->invoke= WM_operator_props_popup; // better wait for graph redo panel
ot->exec= actkeys_copy_exec;
ot->poll= ED_operator_action_active;
-
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-
-
static int actkeys_paste_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
+
+ const eKeyPasteOffset offset_mode= RNA_enum_get(op->ptr, "offset");
+ const eKeyMergeMode merge_mode= RNA_enum_get(op->ptr, "merge");
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
+ if(ac.reports==NULL) {
+ ac.reports= op->reports;
+ }
+
/* paste keyframes */
if (ac.datatype == ANIMCONT_GPENCIL) {
// FIXME...
}
else {
- if (paste_action_keys(&ac)) {
+ if (paste_action_keys(&ac, offset_mode, merge_mode)) {
BKE_report(op->reports, RPT_ERROR, "No keyframes to paste");
return OPERATOR_CANCELLED;
}
@@ -391,12 +418,15 @@ void ACTION_OT_paste (wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "offset", keyframe_paste_offset_items, KEYFRAME_PASTE_OFFSET_CFRA_START, "Offset", "Paste time offset of keys");
+ RNA_def_enum(ot->srna, "merge", keyframe_paste_merge_items, KEYFRAME_PASTE_MERGE_MIX, "Type", "Method of merking pasted keys and existing");
}
/* ******************** Insert Keyframes Operator ************************* */
/* defines for insert keyframes tool */
-EnumPropertyItem prop_actkeys_insertkey_types[] = {
+static EnumPropertyItem prop_actkeys_insertkey_types[] = {
{1, "ALL", 0, "All Channels", ""},
{2, "SEL", 0, "Only Selected Channels", ""},
{3, "GROUP", 0, "In Active Group", ""}, // xxx not in all cases
@@ -410,8 +440,8 @@ static void insert_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
+ ReportList *reports = ac->reports;
Scene *scene= ac->scene;
- float cfra= (float)CFRA;
short flag = 0;
/* filter data */
@@ -428,7 +458,8 @@ static void insert_action_keys(bAnimContext *ac, short mode)
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
-
+ float cfra;
+
/* adjust current frame for NLA-scaling */
if (adt)
cfra= BKE_nla_tweakedit_remap(adt, (float)CFRA, NLATIME_CONVERT_UNMAP);
@@ -437,7 +468,7 @@ static void insert_action_keys(bAnimContext *ac, short mode)
/* if there's an id */
if (ale->id)
- insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
else
insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
}
@@ -509,10 +540,10 @@ static void duplicate_action_keys (bAnimContext *ac)
/* loop through filtered data and delete selected keys */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ANIMTYPE_GPLAYER)
- // delete_gplayer_frames((bGPDlayer *)ale->data);
- //else
+ if (ale->type == ANIMTYPE_FCURVE)
duplicate_fcurve_keys((FCurve *)ale->key_data);
+ else
+ duplicate_gplayer_frames((bGPDlayer *)ale->data);
}
/* free filtered list */
@@ -521,7 +552,7 @@ static void duplicate_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
+static int actkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -541,7 +572,7 @@ static int actkeys_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED; // xxx - start transform
}
-static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
actkeys_duplicate_exec(C, op);
@@ -598,8 +629,8 @@ static void delete_action_keys (bAnimContext *ac)
if ((fcu->totvert == 0) && (list_has_suitable_fmodifier(&fcu->modifiers, 0, FMI_TYPE_GENERATE_CURVE) == 0))
ANIM_fcurve_delete_from_animdata(ac, adt, fcu);
}
- //else
- // delete_gplayer_frames((bGPDlayer *)ale->data);
+ else
+ delete_gplayer_frames((bGPDlayer *)ale->data);
}
/* free filtered list */
@@ -608,7 +639,7 @@ static void delete_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_delete_exec(bContext *C, wmOperator *op)
+static int actkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -734,7 +765,7 @@ static void sample_action_keys (bAnimContext *ac)
/* ------------------- */
-static int actkeys_sample_exec(bContext *C, wmOperator *op)
+static int actkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -777,7 +808,7 @@ void ACTION_OT_sample (wmOperatorType *ot)
/* ******************** Set Extrapolation-Type Operator *********************** */
/* defines for set extrapolation-type for selected keyframes tool */
-EnumPropertyItem prop_actkeys_expo_types[] = {
+static EnumPropertyItem prop_actkeys_expo_types[] = {
{FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant Extrapolation", ""},
{FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear Extrapolation", ""},
{0, NULL, 0, NULL, NULL}
@@ -791,7 +822,7 @@ static void setexpo_action_keys(bAnimContext *ac, short mode)
int filter;
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_SEL | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through setting mode per F-Curve */
@@ -924,7 +955,7 @@ void ACTION_OT_interpolation_type (wmOperatorType *ot)
/* ******************** Set Handle-Type Operator *********************** */
-EnumPropertyItem actkeys_handle_type_items[] = {
+static EnumPropertyItem actkeys_handle_type_items[] = {
{HD_FREE, "FREE", 0, "Free", ""},
{HD_VECT, "VECTOR", 0, "Vector", ""},
{HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
@@ -1096,21 +1127,19 @@ void ACTION_OT_keyframe_type (wmOperatorType *ot)
/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int actkeys_framejump_exec(bContext *C, wmOperator *op)
+static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
- /* init edit data */
- memset(&ked, 0, sizeof(KeyframeEditData));
-
+ /* init edit data */
/* loop over action data, averaging values */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
@@ -1159,7 +1188,7 @@ void ACTION_OT_frame_jump (wmOperatorType *ot)
/* ******************** Snap Keyframes Operator *********************** */
/* defines for snap keyframes tool */
-EnumPropertyItem prop_actkeys_snap_types[] = {
+static EnumPropertyItem prop_actkeys_snap_types[] = {
{ACTKEYS_SNAP_CFRA, "CFRA", 0, "Current frame", ""},
{ACTKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
{ACTKEYS_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry?
@@ -1174,7 +1203,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc edit_cb;
/* filter data */
@@ -1186,8 +1215,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
/* get beztriple editing callbacks */
edit_cb= ANIM_editkeyframes_snap(mode);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.scene= ac->scene;
if (mode == ACTKEYS_SNAP_NEAREST_MARKER) {
ked.list.first= (ac->markers) ? ac->markers->first : NULL;
@@ -1260,7 +1288,7 @@ void ACTION_OT_snap (wmOperatorType *ot)
/* ******************** Mirror Keyframes Operator *********************** */
/* defines for mirror keyframes tool */
-EnumPropertyItem prop_actkeys_mirror_types[] = {
+static EnumPropertyItem prop_actkeys_mirror_types[] = {
{ACTKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current frame", ""},
{ACTKEYS_MIRROR_XAXIS, "XAXIS", 0, "By Values over Value=0", ""},
{ACTKEYS_MIRROR_MARKER, "MARKER", 0, "By Times over First Selected Marker", ""},
@@ -1274,13 +1302,12 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc edit_cb;
/* get beztriple editing callbacks */
edit_cb= ANIM_editkeyframes_mirror(mode);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.scene= ac->scene;
/* for 'first selected marker' mode, need to find first selected marker first! */
@@ -1289,13 +1316,7 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
TimeMarker *marker= NULL;
/* find first selected marker */
- if (ac->markers) {
- for (marker= ac->markers->first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- break;
- }
- }
- }
+ marker= ED_markers_get_first_selected(ac->markers);
/* store marker's time (if available) */
if (marker)
diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h
index b02e95ac138..feaf2c2d786 100644
--- a/source/blender/editors/space_action/action_intern.h
+++ b/source/blender/editors/space_action/action_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ struct bAnimListElem;
/* ***************************************** */
/* action_draw.c */
-void draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceAction *saction, struct ARegion *ar);
+void draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct ARegion *ar);
void draw_channel_strips(struct bAnimContext *ac, struct SpaceAction *saction, struct ARegion *ar);
struct ActKeysInc *init_aki_data(struct bAnimContext *ac, struct bAnimListElem *ale);
@@ -59,14 +59,14 @@ void ACTION_OT_select_column(struct wmOperatorType *ot);
void ACTION_OT_select_linked(struct wmOperatorType *ot);
void ACTION_OT_select_more(struct wmOperatorType *ot);
void ACTION_OT_select_less(struct wmOperatorType *ot);
+void ACTION_OT_select_leftright(struct wmOperatorType *ot);
void ACTION_OT_clickselect(struct wmOperatorType *ot);
/* defines for left-right select tool */
enum {
- ACTKEYS_LRSEL_TEST = -1,
- ACTKEYS_LRSEL_NONE,
+ ACTKEYS_LRSEL_TEST = 0,
ACTKEYS_LRSEL_LEFT,
- ACTKEYS_LRSEL_RIGHT,
+ ACTKEYS_LRSEL_RIGHT
} eActKeys_LeftRightSelect_Mode;
/* defines for column-select mode */
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index 19dd4512909..acb2fa09d04 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -58,6 +58,7 @@ void action_operatortypes(void)
WM_operatortype_append(ACTION_OT_select_linked);
WM_operatortype_append(ACTION_OT_select_more);
WM_operatortype_append(ACTION_OT_select_less);
+ WM_operatortype_append(ACTION_OT_select_leftright);
/* editing */
WM_operatortype_append(ACTION_OT_snap);
@@ -96,8 +97,16 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
kmi= WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "left_right", ACTKEYS_LRSEL_TEST);
+
+ /* select left/right */
+ WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "extend", 1);
+
+ kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_LEFT);
+ kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_RIGHT);
/* deselect all */
WM_keymap_add_item(keymap, "ACTION_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
@@ -131,7 +140,7 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "ACTION_OT_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
/* menu + set setting */
- WM_keymap_add_item(keymap, "ACTION_OT_handle_type", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACTION_OT_handle_type", VKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "ACTION_OT_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_keyframe_type", RKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index b2c47194384..b9662a8b8e5 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,8 +34,10 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -49,6 +51,7 @@
#include "UI_view2d.h"
#include "ED_anim_api.h"
+#include "ED_gpencil.h"
#include "ED_keyframes_draw.h"
#include "ED_keyframes_edit.h"
#include "ED_markers.h"
@@ -74,10 +77,7 @@
* - This is called by the deselect all operator, as well as other ones!
*
* - test: check if select or deselect all
- * - sel: how to select keyframes
- * 0 = deselect
- * 1 = select
- * 2 = invert
+ * - sel: how to select keyframes (SELECT_*)
*/
static void deselect_action_keys (bAnimContext *ac, short test, short sel)
{
@@ -85,7 +85,7 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -98,17 +98,16 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* init BezTriple looping data */
- memset(&ked, 0, sizeof(KeyframeEditData));
test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED);
/* See if we should be selecting or deselecting */
if (test) {
for (ale= anim_data.first; ale; ale= ale->next) {
if (ale->type == ANIMTYPE_GPLAYER) {
- //if (is_gplayer_frame_selected(ale->data)) {
- // sel= 0;
- // break;
- //}
+ if (is_gplayer_frame_selected(ale->data)) {
+ sel= SELECT_SUBTRACT;
+ break;
+ }
}
else {
if (ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, test_cb, NULL)) {
@@ -124,10 +123,10 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
/* Now set the flags */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ACTTYPE_GPLAYER)
- // set_gplayer_frame_selection(ale->data, sel);
- //else
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL);
+ if (ale->type == ANIMTYPE_GPLAYER)
+ set_gplayer_frame_selection(ale->data, sel);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, sel_cb, NULL);
}
/* Cleanup */
@@ -187,7 +186,7 @@ enum {
ACTKEYS_BORDERSEL_ALLKEYS = 0,
ACTKEYS_BORDERSEL_FRAMERANGE,
ACTKEYS_BORDERSEL_CHANNELS,
-} eActKeys_BorderSelect_Mode;
+} /*eActKeys_BorderSelect_Mode*/;
static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short selectmode)
@@ -254,9 +253,9 @@ static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short
!((ymax < rectf.ymin) || (ymin > rectf.ymax)) )
{
/* loop over data selecting */
- //if (ale->type == ANIMTYPE_GPLAYER)
- // borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode);
- //else
+ if (ale->type == ANIMTYPE_GPLAYER)
+ borderselect_gplayer_frames(ale->data, rectf.xmin, rectf.xmax, selectmode);
+ else
ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, filterflag);
}
@@ -367,7 +366,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
float min, max;
/* get extreme markers */
@@ -378,8 +377,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
/* get editing funcs + data */
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
select_cb= ANIM_editkeyframes_select(SELECT_ADD);
-
- memset(&ked, 0, sizeof(KeyframeEditData));
+
ked.f1= min;
ked.f2= max;
@@ -396,6 +394,9 @@ static void markers_selectkeys_between (bAnimContext *ac)
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
+ else if (ale->type == ANIMTYPE_GPLAYER) {
+ borderselect_gplayer_frames(ale->data, min, max, SELECT_ADD);
+ }
else {
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
@@ -416,10 +417,9 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
Scene *scene= ac->scene;
CfraElem *ce;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* initialise keyframe editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* build list of columns */
switch (mode) {
@@ -428,8 +428,8 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
filter= (ANIMFILTER_VISIBLE);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- //for (ale= anim_data.first; ale; ale= ale->next)
- // gplayer_make_cfra_list(ale->data, &elems, 1);
+ for (ale= anim_data.first; ale; ale= ale->next)
+ gplayer_make_cfra_list(ale->data, &ked.list, 1);
}
else {
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY);
@@ -484,20 +484,10 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
ked.f1= ce->cfra;
/* select elements with frame number matching cfraelem */
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
-
-#if 0 // XXX reenable when Grease Pencil stuff is back
- if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- bGPDframe *gpf;
-
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (ecfra == gpf->framenum)
- gpf->flag |= GP_FRAME_SELECT;
- }
- }
- //else...
-#endif // XXX reenable when Grease Pencil stuff is back
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->data, ce->cfra, SELECT_ADD);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
}
@@ -551,7 +541,7 @@ void ACTION_OT_select_column (wmOperatorType *ot)
/* ******************** Select Linked Operator *********************** */
-static int actkeys_select_linked_exec (bContext *C, wmOperator *op)
+static int actkeys_select_linked_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -613,13 +603,12 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc build_cb;
/* init selmap building data */
build_cb= ANIM_editkeyframes_buildselmap(mode);
- memset(&ked, 0, sizeof(KeyframeEditData));
/* loop through all of the keys and select additional keyframes based on these */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
@@ -650,7 +639,7 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
/* ----------------- */
-static int actkeys_select_more_exec (bContext *C, wmOperator *op)
+static int actkeys_select_more_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -684,7 +673,7 @@ void ACTION_OT_select_more (wmOperatorType *ot)
/* ----------------- */
-static int actkeys_select_less_exec (bContext *C, wmOperator *op)
+static int actkeys_select_less_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -716,58 +705,27 @@ void ACTION_OT_select_less (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
}
-/* ******************** Mouse-Click Select Operator *********************** */
-/* This operator works in one of three ways:
- * - 1) keyframe under mouse - no special modifiers
- * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier
- * - 3) column select all keyframes in frame under mouse - CTRL modifier
- *
- * In addition to these basic options, the SHIFT modifier can be used to toggle the
- * selection mode between replacing the selection (without) and inverting the selection (with).
- */
+/* ******************** Select Left/Right Operator ************************* */
+/* Select keyframes left/right of the current frame indicator */
/* defines for left-right select tool */
static EnumPropertyItem prop_actkeys_leftright_select_types[] = {
{ACTKEYS_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""},
- {ACTKEYS_LRSEL_NONE, "OFF", 0, "Don't select", ""},
{ACTKEYS_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""},
{ACTKEYS_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""},
{0, NULL, 0, NULL, NULL}
};
-/* sensitivity factor for frame-selections */
-#define FRAME_CLICK_THRESH 0.1f
-
-/* ------------------- */
-
-/* option 1) select keyframe directly under mouse */
-static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx)
-{
- bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL;
- int ds_filter = ((ads) ? (ads->filterflag) : (0));
-
- KeyframeEditData ked;
- KeyframeEditFunc select_cb, ok_cb;
-
- /* get functions for selecting keyframes */
- select_cb= ANIM_editkeyframes_select(select_mode);
- ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
- memset(&ked, 0, sizeof(KeyframeEditData));
- ked.f1= selx;
-
- /* select the nominated keyframe on the given frame */
- ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter);
-}
+/* --------------------------------- */
-/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */
-static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short select_mode)
+static void actkeys_select_leftright (bAnimContext *ac, short leftright, short select_mode)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
Scene *scene= ac->scene;
/* if select mode is replace, deselect all keyframes (and channels) first */
@@ -783,13 +741,12 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
select_cb= ANIM_editkeyframes_select(select_mode);
- memset(&ked, 0, sizeof(KeyframeEditFunc));
if (leftright == ACTKEYS_LRSEL_LEFT) {
ked.f1 = MINAFRAMEF;
- ked.f2 = (float)(CFRA + FRAME_CLICK_THRESH);
+ ked.f2 = (float)(CFRA + 0.1f);
}
else {
- ked.f1 = (float)(CFRA - FRAME_CLICK_THRESH);
+ ked.f1 = (float)(CFRA - 0.1f);
ked.f2 = MAXFRAMEF;
}
@@ -800,7 +757,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
- /* select keys on the side where most data occurs */
+ /* select keys */
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
@@ -809,20 +766,21 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
}
- //else if (ale->type == ANIMTYPE_GPLAYER)
- // borderselect_gplayer_frames(ale->data, min, max, SELECT_ADD);
+ else if (ale->type == ANIMTYPE_GPLAYER)
+ borderselect_gplayer_frames(ale->data, ked.f1, ked.f2, select_mode);
else
ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
/* Sync marker support */
- if((select_mode==SELECT_ADD) && (ac->spacetype==SPACE_ACTION) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) {
+ if (select_mode==SELECT_ADD) {
SpaceAction *saction= ac->sa->spacedata.first;
- if (saction && saction->flag & SACTION_MARKERS_MOVE) {
+ if ((saction) && (saction->flag & SACTION_MARKERS_MOVE)) {
+ ListBase *markers = ED_animcontext_get_markers(ac);
TimeMarker *marker;
- for (marker= scene->markers.first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if( ((leftright == ACTKEYS_LRSEL_LEFT) && (marker->frame < CFRA)) ||
((leftright == ACTKEYS_LRSEL_RIGHT) && (marker->frame >= CFRA)) )
{
@@ -839,6 +797,130 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short
BLI_freelistN(&anim_data);
}
+/* ----------------- */
+
+static int actkeys_select_leftright_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+ short selectmode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* select mode is either replace (deselect all, then add) or add/extend */
+ if (RNA_boolean_get(op->ptr, "extend"))
+ selectmode= SELECT_INVERT;
+ else
+ selectmode= SELECT_REPLACE;
+
+ /* if "test" mode is set, we don't have any info to set this with */
+ if (leftright == ACTKEYS_LRSEL_TEST)
+ return OPERATOR_CANCELLED;
+
+ /* do the selecting now */
+ actkeys_select_leftright(&ac, leftright, selectmode);
+
+ /* set notifier that keyframe selection (and channels too) have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static int actkeys_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* handle mode-based testing */
+ if (leftright == ACTKEYS_LRSEL_TEST) {
+ Scene *scene= ac.scene;
+ ARegion *ar= ac.ar;
+ View2D *v2d= &ar->v2d;
+
+ int mval[2];
+ float x;
+
+ /* get mouse coordinates (in region coordinates) */
+ mval[0]= (event->x - ar->winrct.xmin);
+ mval[1]= (event->y - ar->winrct.ymin);
+
+ /* determine which side of the current frame mouse is on */
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
+ if (x < CFRA)
+ RNA_int_set(op->ptr, "mode", ACTKEYS_LRSEL_LEFT);
+ else
+ RNA_int_set(op->ptr, "mode", ACTKEYS_LRSEL_RIGHT);
+ }
+
+ /* perform selection */
+ return actkeys_select_leftright_exec(C, op);
+}
+
+void ACTION_OT_select_leftright (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Left/Right";
+ ot->idname= "ACTION_OT_select_leftright";
+ ot->description= "Select keyframes to the left or the right of the current frame";
+
+ /* api callbacks */
+ ot->invoke= actkeys_select_leftright_invoke;
+ ot->exec= actkeys_select_leftright_exec;
+ ot->poll= ED_operator_action_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ ot->prop= RNA_def_enum(ot->srna, "mode", prop_actkeys_leftright_select_types, ACTKEYS_LRSEL_TEST, "Mode", "");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", "");
+}
+
+/* ******************** Mouse-Click Select Operator *********************** */
+/* This operator works in one of three ways:
+ * - 1) keyframe under mouse - no special modifiers
+ * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier
+ * - 3) column select all keyframes in frame under mouse - CTRL modifier
+ *
+ * In addition to these basic options, the SHIFT modifier can be used to toggle the
+ * selection mode between replacing the selection (without) and inverting the selection (with).
+ */
+
+/* sensitivity factor for frame-selections */
+#define FRAME_CLICK_THRESH 0.1f
+
+/* ------------------- */
+
+/* option 1) select keyframe directly under mouse */
+static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx)
+{
+ bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL;
+ int ds_filter = ((ads) ? (ads->filterflag) : (0));
+
+ KeyframeEditData ked= {{0}};
+ KeyframeEditFunc select_cb, ok_cb;
+
+ /* get functions for selecting keyframes */
+ select_cb= ANIM_editkeyframes_select(select_mode);
+ ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME);
+ ked.f1= selx;
+
+ /* select the nominated keyframe on the given frame */
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->data, selx, select_mode);
+ else
+ ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter);
+}
+
+/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */
+/* (see actkeys_select_leftright) */
+
/* Option 3) Selects all visible keyframes in the same frame as the mouse click */
static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float selx)
{
@@ -847,10 +929,9 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
int filter;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* initialise keyframe editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* set up BezTriple edit callbacks */
select_cb= ANIM_editkeyframes_select(select_mode);
@@ -875,20 +956,10 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
ked.f1= selx;
/* select elements with frame number matching cfra */
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
-
-#if 0 // XXX reenable when Grease Pencil stuff is back
- if (ale->type == ANIMTYPE_GPLAYER) {
- bGPDlayer *gpl= (bGPDlayer *)ale->data;
- bGPDframe *gpf;
-
- for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
- if (ecfra == gpf->framenum)
- gpf->flag |= GP_FRAME_SELECT;
- }
- }
- //else...
-#endif // XXX reenable when Grease Pencil stuff is back
+ if (ale->type == ANIMTYPE_GPLAYER)
+ select_gpencil_frame(ale->key_data, selx, select_mode);
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
}
/* free elements */
@@ -943,7 +1014,6 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
ActKeyColumn *ak, *akn=NULL;
/* make list of keyframes */
- // TODO: it would be great if we didn't have to apply this to all the keyframes to do this...
BLI_dlrbTree_init(&anim_keys);
if (ale->key_data) {
@@ -978,27 +1048,22 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
/* dopesheet summary covers everything */
summary_to_keylist(ac, &anim_keys, NULL);
}
- else if (ale->type == ANIMTYPE_GROUP) {
+ else if (ale->type == ANIMTYPE_GROUP) {
+ // TODO: why don't we just give groups key_data too?
bActionGroup *agrp= (bActionGroup *)ale->data;
agroup_to_keylist(adt, agrp, &anim_keys, NULL);
}
- else if (ale->type == ANIMTYPE_GPDATABLOCK) {
- /* cleanup */
- // FIXME:...
- BLI_freelistN(&anim_data);
- return;
- }
else if (ale->type == ANIMTYPE_GPLAYER) {
- struct bGPDlayer *gpl= (struct bGPDlayer *)ale->data;
- gpl_to_keylist(ads, gpl, &anim_keys, NULL);
+ // TODO: why don't we just give gplayers key_data too?
+ bGPDlayer *gpl = (bGPDlayer *)ale->data;
+ gpl_to_keylist(ads, gpl, &anim_keys);
}
- /* loop through keyframes, finding one that was within the range clicked on */
- // TODO: replace this with API calls instead of inlining
+ /* start from keyframe at root of BST, traversing until we find one within the range that was clicked on */
for (ak= anim_keys.root; ak; ak= akn) {
if (IN_RANGE(ak->cfra, rectf.xmin, rectf.xmax)) {
/* set the frame to use, and apply inverse-correction for NLA-mapping
- * so that the frame will get selected by the selection functiosn without
+ * so that the frame will get selected by the selection functions without
* requiring to map each frame once again...
*/
selx= BKE_nla_tweakedit_remap(adt, ak->cfra, NLATIME_CONVERT_UNMAP);
@@ -1051,11 +1116,16 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
}
}
else if (ac->datatype == ANIMCONT_GPENCIL) {
+ /* deselect all other channels first */
ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- /* Highlight gpencil layer */
- //gpl->flag |= GP_LAYER_SELECT;
- //gpencil_layer_setactive(gpd, gpl);
+ /* Highlight GPencil Layer */
+ if ((ale && ale->data) && (ale->type == ANIMTYPE_GPLAYER)) {
+ bGPDlayer *gpl = ale->data;
+
+ gpl->flag |= GP_LAYER_SELECT;
+ //gpencil_layer_setactive(gpd, gpl);
+ }
}
}
@@ -1063,11 +1133,7 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
if (ale) {
if (found) {
/* apply selection to keyframes */
- if (/*gpl*/0) {
- /* grease pencil */
- //select_gpencil_frame(gpl, (int)selx, selectmode);
- }
- else if (column) {
+ if (column) {
/* select all keyframes in the same frame as the one we hit on the active channel */
actkeys_mselect_column(ac, select_mode, selx);
}
@@ -1114,23 +1180,8 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even
/* column selection */
column= RNA_boolean_get(op->ptr, "column");
- /* figure out action to take */
- if (RNA_enum_get(op->ptr, "left_right")) {
- /* select all keys on same side of current frame as mouse */
- float x;
-
- UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
- if (x < CFRA)
- RNA_int_set(op->ptr, "left_right", ACTKEYS_LRSEL_LEFT);
- else
- RNA_int_set(op->ptr, "left_right", ACTKEYS_LRSEL_RIGHT);
-
- actkeys_mselect_leftright(&ac, RNA_enum_get(op->ptr, "left_right"), selectmode);
- }
- else {
- /* select keyframe(s) based upon mouse position*/
- mouse_action_keys(&ac, mval, selectmode, column);
- }
+ /* select keyframe(s) based upon mouse position*/
+ mouse_action_keys(&ac, mval, selectmode, column);
/* set notifier that keyframe selection (and channels too) have changed */
WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL);
@@ -1154,8 +1205,6 @@ void ACTION_OT_clickselect (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* id-props */
- // XXX should we make this into separate operators?
- RNA_def_enum(ot->srna, "left_right", prop_actkeys_leftright_select_types, 0, "Left Right", ""); // CTRLKEY
RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
RNA_def_boolean(ot->srna, "column", 0, "Column Select", ""); // ALTKEY
}
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 7b96618d923..b08ddfbcba9 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -51,6 +52,7 @@
#include "UI_resources.h"
#include "UI_view2d.h"
+#include "ED_space_api.h"
#include "ED_anim_api.h"
#include "ED_markers.h"
@@ -101,16 +103,17 @@ static SpaceLink *action_new(const bContext *C)
ar->v2d.cur = ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= FLT_MAX;
+ ar->v2d.max[1]= FLT_MAX;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
+ ar->v2d.keepofs= V2D_KEEPOFS_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -118,7 +121,7 @@ static SpaceLink *action_new(const bContext *C)
}
/* not spacelink itself */
-static void action_free(SpaceLink *sl)
+static void action_free(SpaceLink *UNUSED(sl))
{
// SpaceAction *saction= (SpaceAction*) sl;
@@ -126,7 +129,7 @@ static void action_free(SpaceLink *sl)
/* spacetype; init callback */
-static void action_init(struct wmWindowManager *wm, ScrArea *sa)
+static void action_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceAction *saction = sa->spacedata.first;
saction->flag |= SACTION_TEMP_NEEDCHANSYNC;
@@ -169,12 +172,12 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* time grid */
unit= (saction->flag & SACTION_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
UI_view2d_grid_free(grid);
/* data */
@@ -188,11 +191,13 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
- draw_markers_time(C, 0);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
+
+ flag = (saction->flag & SACTION_POSEMARKERS_SHOW)? DRAW_MARKERS_LOCAL : 0;
+ draw_markers_time(C, flag);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -219,7 +224,6 @@ static void action_channel_area_init(wmWindowManager *wm, ARegion *ar)
static void action_channel_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
- SpaceAction *saction= CTX_wm_space_action(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -228,11 +232,11 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data */
if (ANIM_animdata_get_context(C, &ac)) {
- draw_channel_names((bContext *)C, &ac, saction, ar);
+ draw_channel_names((bContext *)C, &ac, ar);
}
/* reset view matrix */
@@ -246,7 +250,7 @@ static void action_channel_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
-static void action_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void action_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -348,6 +352,13 @@ static void action_listener(ScrArea *sa, wmNotifier *wmn)
/* context changes */
switch (wmn->category) {
+ case NC_SCREEN:
+ if (wmn->data == ND_GPENCIL) {
+ /* only handle this event in GPencil mode for performance considerations */
+ if (saction->mode == SACTCONT_GPENCIL)
+ ED_area_tag_redraw(sa);
+ }
+ break;
case NC_ANIMATION:
/* for selection changes of animation data, we can just redraw... otherwise autocolor might need to be done again */
if (ELEM(wmn->data, ND_KEYFRAME, ND_ANIMCHAN) && (wmn->action == NA_SELECTED))
@@ -417,7 +428,7 @@ static void action_header_area_listener(ARegion *ar, wmNotifier *wmn)
static void action_refresh(const bContext *C, ScrArea *sa)
{
- SpaceAction *saction= CTX_wm_space_action(C);
+ SpaceAction *saction= (SpaceAction *)sa->spacedata.first;
/* update the state of the animchannels in response to changes from the data they represent
* NOTE: the temp flag is used to indicate when this needs to be done, and will be cleared once handled
@@ -425,6 +436,7 @@ static void action_refresh(const bContext *C, ScrArea *sa)
if (saction->flag & SACTION_TEMP_NEEDCHANSYNC) {
ANIM_sync_animchannels_to_data(C);
saction->flag &= ~SACTION_TEMP_NEEDCHANSYNC;
+ ED_area_tag_redraw(sa);
}
/* region updates? */
@@ -455,7 +467,7 @@ void ED_spacetype_action(void)
art->init= action_main_area_init;
art->draw= action_main_area_draw;
art->listener= action_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_api/CMakeLists.txt b/source/blender/editors/space_api/CMakeLists.txt
index f186b4f1c8a..3977a47066c 100644
--- a/source/blender/editors/space_api/CMakeLists.txt
+++ b/source/blender/editors/space_api/CMakeLists.txt
@@ -19,10 +19,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
../include
@@ -30,6 +30,12 @@ SET(INC
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ space.c
+ spacetypes.c
)
-BLENDERLIB(bf_editor_space_api "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_api "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_api/Makefile b/source/blender/editors/space_api/Makefile
deleted file mode 100644
index deaa46a9582..00000000000
--- a/source/blender/editors/space_api/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_space
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_api/SConscript b/source/blender/editors/space_api/SConscript
index d8be59941eb..6bf901cf8ad 100644
--- a/source/blender/editors/space_api/SConscript
+++ b/source/blender/editors/space_api/SConscript
@@ -3,7 +3,7 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna'
+incs = '../include ../../blenlib ../../blenkernel ../../blenloader ../../makesdna'
incs += ' ../../windowmanager ../../python ../../makesrna ../../bmesh'
incs += ' #/intern/guardedalloc #/extern/glew/include'
diff --git a/source/blender/editors/space_api/space.c b/source/blender/editors/space_api/space.c
index e862358c465..bfe47f6e35a 100644
--- a/source/blender/editors/space_api/space.c
+++ b/source/blender/editors/space_api/space.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 1ed00b43e2b..db857d4be9f 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,11 +25,14 @@
#include <stdlib.h>
#include "MEM_guardedalloc.h"
+
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_windowmanager_types.h"
+
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_tessmesh.h"
@@ -227,19 +230,19 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
/* ********************* space template *********************** */
/* allocate and init some vars */
-static SpaceLink *xxx_new(const bContext *C)
+static SpaceLink *xxx_new(const bContext *UNUSED(C))
{
return NULL;
}
/* not spacelink itself */
-static void xxx_free(SpaceLink *sl)
+static void xxx_free(SpaceLink *UNUSED(sl))
{
}
/* spacetype; init callback for usage, should be redoable */
-static void xxx_init(wmWindowManager *wm, ScrArea *sa)
+static void xxx_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
/* link area to SpaceXXX struct */
@@ -249,7 +252,7 @@ static void xxx_init(wmWindowManager *wm, ScrArea *sa)
/* add types to regions */
}
-static SpaceLink *xxx_duplicate(SpaceLink *sl)
+static SpaceLink *xxx_duplicate(SpaceLink *UNUSED(sl))
{
return NULL;
@@ -260,13 +263,13 @@ static void xxx_operatortypes(void)
/* register operator types for this space */
}
-static void xxx_keymap(wmKeyConfig *keyconf)
+static void xxx_keymap(wmKeyConfig *UNUSED(keyconf))
{
/* add default items to keymap */
}
/* only called once, from screen/spacetypes.c */
-void ED_spacetype_xxx(void)
+static void ED_spacetype_xxx(void)
{
static SpaceType st;
diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt
index bb50ac0cc86..94b3f1c3926 100644
--- a/source/blender/editors/space_buttons/CMakeLists.txt
+++ b/source/blender/editors/space_buttons/CMakeLists.txt
@@ -19,16 +19,24 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ buttons_context.c
+ buttons_header.c
+ buttons_ops.c
+ space_buttons.c
+
+ buttons_intern.h
)
-BLENDERLIB(bf_editor_space_buttons "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_buttons "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_buttons/Makefile b/source/blender/editors/space_buttons/Makefile
deleted file mode 100644
index 28758fb168b..00000000000
--- a/source/blender/editors/space_buttons/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_buttons
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../render/extern/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_buttons/SConscript b/source/blender/editors/space_buttons/SConscript
index b82f0db49a0..38a65cadfab 100644
--- a/source/blender/editors/space_buttons/SConscript
+++ b/source/blender/editors/space_buttons/SConscript
@@ -5,7 +5,11 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../makesrna ../../render/extern/include ../../bmesh'
+=======
+incs += ' ../../makesrna ../../render/extern/include ../../blenloader'
+>>>>>>> .merge-right.r35190
defs = []
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 343237dee5e..486cc462584 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,9 @@
#include "MEM_guardedalloc.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
+
#include "DNA_armature_types.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
@@ -38,8 +41,6 @@
#include "DNA_world_types.h"
#include "DNA_brush_types.h"
-#include "BLI_listbase.h"
-
#include "BKE_context.h"
#include "BKE_action.h"
#include "BKE_material.h"
@@ -48,7 +49,7 @@
#include "BKE_particle.h"
#include "BKE_screen.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
@@ -65,6 +66,7 @@ typedef struct ButsContextPath {
PointerRNA ptr[8];
int len;
int flag;
+ int tex_ctx;
} ButsContextPath;
static int set_pointer_type(ButsContextPath *path, bContextDataResult *result, StructRNA *type)
@@ -305,7 +307,12 @@ static int buttons_context_path_particle(ButsContextPath *path)
{
Object *ob;
ParticleSystem *psys;
+ PointerRNA *ptr= &path->ptr[path->len-1];
+ /* if we already have (pinned) particle settings, we're done */
+ if(RNA_struct_is_a(ptr->type, &RNA_ParticleSettings)) {
+ return 1;
+ }
/* if we have an object, get the active particle system */
if(buttons_context_path_object(path)) {
ob= path->ptr[path->len-1].data;
@@ -323,7 +330,7 @@ static int buttons_context_path_particle(ButsContextPath *path)
return 0;
}
-static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
+static int buttons_context_path_brush(ButsContextPath *path)
{
Scene *scene;
Brush *br= NULL;
@@ -352,12 +359,13 @@ static int buttons_context_path_brush(const bContext *C, ButsContextPath *path)
return 0;
}
-static int buttons_context_path_texture(const bContext *C, ButsContextPath *path)
+static int buttons_context_path_texture(ButsContextPath *path)
{
Material *ma;
Lamp *la;
Brush *br;
World *wo;
+ ParticleSystem *psys;
Tex *tex;
PointerRNA *ptr= &path->ptr[path->len-1];
int orig_len = path->len;
@@ -367,7 +375,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
return 1;
}
/* try brush */
- if((path->flag & SB_BRUSH_TEX) && buttons_context_path_brush(C, path)) {
+ if((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
br= path->ptr[path->len-1].data;
if(br) {
@@ -379,7 +387,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
}
}
/* try world */
- if((path->flag & SB_WORLD_TEX) && buttons_context_path_world(path)) {
+ if((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
wo= path->ptr[path->len-1].data;
if(wo && GS(wo->id.name)==ID_WO) {
@@ -390,6 +398,28 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
return 1;
}
}
+ /* try particles */
+ if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
+ if(path->ptr[path->len-1].type == &RNA_ParticleSettings) {
+ ParticleSettings *part = path->ptr[path->len-1].data;
+
+ tex= give_current_particle_texture(part);
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ else {
+ psys= path->ptr[path->len-1].data;
+
+ if(psys && psys->part && GS(psys->part->id.name)==ID_PA) {
+ tex= give_current_particle_texture(psys->part);
+
+ RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
+ path->len++;
+ return 1;
+ }
+ }
+ }
/* try material */
if(buttons_context_path_material(path)) {
ma= path->ptr[path->len-1].data;
@@ -416,7 +446,7 @@ static int buttons_context_path_texture(const bContext *C, ButsContextPath *path
}
/* try brushes again in case of no material, lamp, etc */
path->len = orig_len;
- if(buttons_context_path_brush(C, path)) {
+ if(buttons_context_path_brush(path)) {
br= path->ptr[path->len-1].data;
if(br) {
@@ -441,6 +471,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
memset(path, 0, sizeof(*path));
path->flag= flag;
+ path->tex_ctx = sbuts->texture_context;
/* if some ID datablock is pinned, set the root pointer */
if(sbuts->pinid) {
@@ -485,7 +516,7 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
found= buttons_context_path_material(path);
break;
case BCONTEXT_TEXTURE:
- found= buttons_context_path_texture(C, path);
+ found= buttons_context_path_texture(path);
break;
case BCONTEXT_BONE:
found= buttons_context_path_bone(path);
@@ -515,7 +546,7 @@ static int buttons_shading_context(const bContext *C, int mainb)
return 0;
}
-static int buttons_shading_new_context(const bContext *C, int flag, int mainb)
+static int buttons_shading_new_context(const bContext *C, int flag)
{
Object *ob= CTX_data_active_object(C);
@@ -533,13 +564,12 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
{
ButsContextPath *path;
PointerRNA *ptr;
- int a, pflag, flag= 0;
+ int a, pflag= 0, flag= 0;
if(!sbuts->path)
sbuts->path= MEM_callocN(sizeof(ButsContextPath), "ButsContextPath");
path= sbuts->path;
- pflag= (sbuts->flag & (SB_WORLD_TEX|SB_BRUSH_TEX));
/* for each context, see if we can compute a valid path to it, if
* this is the case, we know we have to display the button */
@@ -568,7 +598,7 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
if((flag & (1 << sbuts->mainb)) == 0) {
if(sbuts->flag & SB_SHADING_CONTEXT) {
/* try to keep showing shading related buttons */
- sbuts->mainb= buttons_shading_new_context(C, flag, sbuts->mainb);
+ sbuts->mainb= buttons_shading_new_context(C, flag);
}
else if(flag & BCONTEXT_OBJECT) {
sbuts->mainb= BCONTEXT_OBJECT;
@@ -602,6 +632,12 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
/************************* Context Callback ************************/
+const char *buttons_context_dir[] = {
+ "world", "object", "mesh", "armature", "lattice", "curve",
+ "meta_ball", "lamp", "camera", "material", "material_slot",
+ "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable",
+ "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
+
int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
{
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -612,13 +648,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
/* here we handle context, getting data from precomputed path */
if(CTX_data_dir(member)) {
- static const char *dir[] = {
- "world", "object", "mesh", "armature", "lattice", "curve",
- "meta_ball", "lamp", "camera", "material", "material_slot",
- "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable",
- "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
-
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, buttons_context_dir);
return 1;
}
else if(CTX_data_equals(member, "world")) {
@@ -731,6 +761,12 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
if(br)
CTX_data_pointer_set(result, &br->id, &RNA_BrushTextureSlot, &br->mtex);
}
+ else if((ptr=get_pointer_type(path, &RNA_ParticleSystem))) {
+ ParticleSettings *part= ((ParticleSystem *)ptr->data)->part;
+
+ if(part)
+ CTX_data_pointer_set(result, &part->id, &RNA_ParticleSettingsTextureSlot, part->mtex[(int)part->texact]);
+ }
return 1;
}
@@ -821,7 +857,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
/************************* Drawing the Path ************************/
-static void pin_cb(bContext *C, void *arg1, void *arg2)
+static void pin_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
{
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -909,6 +945,14 @@ ID *buttons_context_id_path(const bContext *C)
for(a=path->len-1; a>=0; a--) {
ptr= &path->ptr[a];
+ /* pin particle settings instead of system, since only settings are an idblock*/
+ if(sbuts->mainb == BCONTEXT_PARTICLE && sbuts->flag & SB_PIN_CONTEXT) {
+ if(ptr->type == &RNA_ParticleSystem && ptr->data) {
+ ParticleSystem *psys = (ParticleSystem *)ptr->data;
+ return &psys->part->id;
+ }
+ }
+
if(ptr->id.data) {
return ptr->id.data;
break;
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index ab756b638fa..cf0ae07d891 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,16 +29,16 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "ED_screen.h"
#include "ED_types.h"
-
+#include "DNA_object_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -50,7 +50,29 @@
#define B_CONTEXT_SWITCH 101
#define B_BUTSPREVIEW 102
-static void do_buttons_buttons(bContext *C, void *arg, int event)
+static void set_texture_context(bContext *C, SpaceButs *sbuts)
+{
+ switch(sbuts->mainb) {
+ case BCONTEXT_MATERIAL:
+ sbuts->texture_context = SB_TEXC_MAT_OR_LAMP;
+ break;
+ case BCONTEXT_DATA:
+ {
+ Object *ob = CTX_data_active_object(C);
+ if(ob && ob->type==OB_LAMP)
+ sbuts->texture_context = SB_TEXC_MAT_OR_LAMP;
+ break;
+ }
+ case BCONTEXT_WORLD:
+ sbuts->texture_context = SB_TEXC_WORLD;
+ break;
+ case BCONTEXT_PARTICLE:
+ sbuts->texture_context = SB_TEXC_PARTICLES;
+ break;
+ }
+}
+
+static void do_buttons_buttons(bContext *C, void *UNUSED(arg), int event)
{
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -62,11 +84,7 @@ static void do_buttons_buttons(bContext *C, void *arg, int event)
case B_BUTSPREVIEW:
ED_area_tag_redraw(CTX_wm_area(C));
- /* silly exception */
- if(sbuts->mainb == BCONTEXT_WORLD)
- sbuts->flag |= SB_WORLD_TEX;
- else if(sbuts->mainb != BCONTEXT_TEXTURE)
- sbuts->flag &= ~SB_WORLD_TEX;
+ set_texture_context(C, sbuts);
sbuts->preview= 1;
break;
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index 9478168f35a..dda64ae1b40 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -65,6 +65,8 @@ void buttons_context_draw(const struct bContext *C, struct uiLayout *layout);
void buttons_context_register(struct ARegionType *art);
struct ID *buttons_context_id_path(const struct bContext *C);
+extern const char *buttons_context_dir[]; /* doc access */
+
/* buttons_ops.c */
void BUTTONS_OT_file_browse(struct wmOperatorType *ot);
void BUTTONS_OT_toolbox(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index c4357008a9c..b2edff87f9c 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,8 +33,14 @@
#include "DNA_userdef_types.h"
#include "BLI_fileops.h"
+#include "BLI_path_util.h"
+#include "BLI_storage.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -49,7 +55,7 @@
/********************** toolbox operator *********************/
-static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
bScreen *sc= CTX_wm_screen(C);
SpaceButs *sbuts= CTX_wm_space_buts(C);
@@ -59,7 +65,7 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_pointer_create(&sc->id, &RNA_SpaceProperties, sbuts, &ptr);
- pup= uiPupMenuBegin(C, "Align", 0);
+ pup= uiPupMenuBegin(C, "Align", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumR(layout, &ptr, "align");
uiPupMenuEnd(C, pup);
@@ -89,12 +95,32 @@ typedef struct FileBrowseOp {
static int file_browse_exec(bContext *C, wmOperator *op)
{
FileBrowseOp *fbo= op->customdata;
- char *str;
+ ID *id;
+ char *base, *str, path[FILE_MAX];
if (RNA_property_is_set(op->ptr, "filepath")==0 || fbo==NULL)
return OPERATOR_CANCELLED;
str= RNA_string_get_alloc(op->ptr, "filepath", 0, 0);
+
+ /* add slash for directories, important for some properties */
+ if(RNA_property_subtype(fbo->prop) == PROP_DIRPATH) {
+ char name[FILE_MAX];
+
+ id = fbo->ptr.id.data;
+ base = (id && id->lib)? id->lib->filepath: G.main->name;
+
+ BLI_strncpy(path, str, FILE_MAX);
+ BLI_path_abs(path, base);
+
+ if(BLI_is_dir(path)) {
+ str = MEM_reallocN(str, strlen(str)+2);
+ BLI_add_slash(str);
+ }
+ else
+ BLI_splitdirstring(str, name);
+ }
+
RNA_property_string_set(&fbo->ptr, fbo->prop, str);
RNA_property_update(C, &fbo->ptr, fbo->prop);
MEM_freeN(str);
@@ -103,7 +129,7 @@ static int file_browse_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int file_browse_cancel(bContext *C, wmOperator *op)
+static int file_browse_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -154,10 +180,12 @@ static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_string_set(op->ptr, "filepath", str);
MEM_freeN(str);
- if(RNA_struct_find_property(op->ptr, "relative_path"))
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
+ if(RNA_struct_find_property(op->ptr, "relative_path")) {
+ if(!RNA_property_is_set(op->ptr, "relative_path")) {
+ /* annoying exception!, if were dealign with the user prefs, default relative to be off */
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS && (ptr.data != &U));
+ }
+ }
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 0b6e752574b..b6feb4ee1d6 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,16 +29,17 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -55,7 +56,7 @@
/* ******************** default callbacks for buttons space ***************** */
-static SpaceLink *buttons_new(const bContext *C)
+static SpaceLink *buttons_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceButs *sbuts;
@@ -69,7 +70,7 @@ static SpaceLink *buttons_new(const bContext *C)
BLI_addtail(&sbuts->regionbase, ar);
ar->regiontype= RGN_TYPE_HEADER;
- ar->alignment= RGN_ALIGN_BOTTOM;
+ ar->alignment= RGN_ALIGN_TOP;
#if 0
/* context area */
@@ -103,7 +104,7 @@ static void buttons_free(SpaceLink *sl)
}
/* spacetype; init callback */
-static void buttons_init(struct wmWindowManager *wm, ScrArea *sa)
+static void buttons_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceButs *sbuts= sa->spacedata.first;
@@ -177,13 +178,13 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar)
sbuts->mainbo= sbuts->mainb;
}
-void buttons_operatortypes(void)
+static void buttons_operatortypes(void)
{
WM_operatortype_append(BUTTONS_OT_toolbox);
WM_operatortype_append(BUTTONS_OT_file_browse);
}
-void buttons_keymap(struct wmKeyConfig *keyconf)
+static void buttons_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Property Editor", SPACE_BUTS, 0);
@@ -191,7 +192,7 @@ void buttons_keymap(struct wmKeyConfig *keyconf)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void buttons_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void buttons_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
}
@@ -203,7 +204,7 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
buttons_header_buttons(C, ar);
@@ -235,12 +236,8 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
buttons_area_redraw(sa, BCONTEXT_RENDER);
break;
case ND_FRAME:
- buttons_area_redraw(sa, BCONTEXT_RENDER);
- buttons_area_redraw(sa, BCONTEXT_MATERIAL);
- buttons_area_redraw(sa, BCONTEXT_TEXTURE);
- buttons_area_redraw(sa, BCONTEXT_WORLD);
- buttons_area_redraw(sa, BCONTEXT_DATA);
- buttons_area_redraw(sa, BCONTEXT_PHYSICS);
+ /* any buttons area can have animated properties so redraw all */
+ ED_area_tag_redraw(sa);
sbuts->preview= 1;
break;
case ND_OB_ACTIVE:
@@ -263,6 +260,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
switch(wmn->data) {
case ND_TRANSFORM:
buttons_area_redraw(sa, BCONTEXT_OBJECT);
+ buttons_area_redraw(sa, BCONTEXT_DATA); /* autotexpace flag */
break;
case ND_POSE:
case ND_BONE_ACTIVE:
@@ -284,6 +282,7 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
case ND_PARTICLE:
if (wmn->action == NA_EDITED)
buttons_area_redraw(sa, BCONTEXT_PARTICLE);
+ sbuts->preview= 1;
break;
case ND_DRAW:
buttons_area_redraw(sa, BCONTEXT_OBJECT);
@@ -351,6 +350,10 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
break;
}
break;
+ case NC_NODE:
+ if(wmn->action==NA_SELECTED)
+ ED_area_tag_redraw(sa);
+ break;
/* Listener for preview render, when doing an global undo. */
case NC_WINDOW:
ED_area_tag_redraw(sa);
diff --git a/source/blender/editors/space_console/CMakeLists.txt b/source/blender/editors/space_console/CMakeLists.txt
index 0cee45576b8..d1cb716fa84 100644
--- a/source/blender/editors/space_console/CMakeLists.txt
+++ b/source/blender/editors/space_console/CMakeLists.txt
@@ -19,22 +19,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenfont
../../blenkernel
../../blenlib
../../blenloader
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ console_draw.c
+ console_ops.c
+ space_console.c
+
+ console_intern.h
)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_space_console "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_console "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_console/Makefile b/source/blender/editors/space_console/Makefile
deleted file mode 100644
index 4ae157507e0..00000000000
--- a/source/blender/editors/space_console/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2009 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-LIBNAME = ed_console
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_console/SConscript b/source/blender/editors/space_console/SConscript
index d50902446ba..f246f08d7ac 100644
--- a/source/blender/editors/space_console/SConscript
+++ b/source/blender/editors/space_console/SConscript
@@ -5,19 +5,19 @@ sources = env.Glob('*.c')
defs = []
incs = [
- '../include',
- '#extern/glew/include',
- '#/intern/guardedalloc',
- '../../makesdna',
- '../../makesrna',
- '../../blenkernel',
- '../../blenlib',
- '../../windowmanager',
- '../../blenfont',
- '../../blenloader',
+ '../include',
+ '#extern/glew/include',
+ '#/intern/guardedalloc',
+ '../../makesdna',
+ '../../makesrna',
+ '../../blenkernel',
+ '../../blenlib',
+ '../../windowmanager',
+ '../../blenfont',
+ '../../blenloader',
]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_console', sources, incs, defs, libtype=['core'], priority=[95] )
diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c
index 74d47ad675d..ffb6bdb1f57 100644
--- a/source/blender/editors/space_console/console_draw.c
+++ b/source/blender/editors/space_console/console_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -33,17 +28,18 @@
#include <sys/stat.h>
#include <limits.h>
-
#include "BLF_api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
-// #include "BKE_suggestions.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
+
+#include "MEM_guardedalloc.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -56,68 +52,26 @@
#include "console_intern.h"
-static int mono= -1; // XXX needs proper storage and change all the BLF_* here!
-
-static void console_font_begin(SpaceConsole *sc)
-{
- if(mono == -1)
- mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
- BLF_size(mono, sc->lheight-2, 72);
-}
+#include "../space_info/textview.h"
-static void console_line_color(unsigned char *fg, int type)
+static void console_line_color(unsigned char fg[3], int type)
{
switch(type) {
case CONSOLE_LINE_OUTPUT:
- UI_GetThemeColor3ubv(TH_CONSOLE_OUTPUT, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_OUTPUT, fg);
break;
case CONSOLE_LINE_INPUT:
- UI_GetThemeColor3ubv(TH_CONSOLE_INPUT, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_INPUT, fg);
break;
case CONSOLE_LINE_INFO:
- UI_GetThemeColor3ubv(TH_CONSOLE_INFO, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_INFO, fg);
break;
case CONSOLE_LINE_ERROR:
- UI_GetThemeColor3ubv(TH_CONSOLE_ERROR, (char *)fg);
+ UI_GetThemeColor3ubv(TH_CONSOLE_ERROR, fg);
break;
}
}
-static void console_report_color(unsigned char *fg, unsigned char *bg, Report *report, int bool)
-{
- /*
- if (type & RPT_ERROR_ALL) { fg[0]=220; fg[1]=0; fg[2]=0; }
- else if (type & RPT_WARNING_ALL) { fg[0]=220; fg[1]=96; fg[2]=96; }
- else if (type & RPT_OPERATOR_ALL) { fg[0]=96; fg[1]=128; fg[2]=255; }
- else if (type & RPT_INFO_ALL) { fg[0]=0; fg[1]=170; fg[2]=0; }
- else if (type & RPT_DEBUG_ALL) { fg[0]=196; fg[1]=196; fg[2]=196; }
- else { fg[0]=196; fg[1]=196; fg[2]=196; }
- */
- if(report->flag & SELECT) {
- fg[0]=255; fg[1]=255; fg[2]=255;
- if(bool) {
- bg[0]=96; bg[1]=128; bg[2]=255;
- }
- else {
- bg[0]=90; bg[1]=122; bg[2]=249;
- }
- }
-
- else {
- fg[0]=0; fg[1]=0; fg[2]=0;
-
- if(bool) {
- bg[0]=120; bg[1]=120; bg[2]=120;
- }
- else {
- bg[0]=114; bg[1]=114; bg[2]=114;
- }
-
- }
-}
-
typedef struct ConsoleDrawContext {
int cwidth;
int lheight;
@@ -126,322 +80,168 @@ typedef struct ConsoleDrawContext {
int ymin, ymax;
int *xy; // [2]
int *sel; // [2]
- int *pos_pick;
+ int *pos_pick; // bottom of view == 0, top of file == combine chars, end of line is lower then start.
int *mval; // [2]
int draw;
} ConsoleDrawContext;
-static void console_draw_sel(int sel[2], int xy[2], int str_len, int cwidth, int console_width, int lheight)
+void console_scrollback_prompt_begin(struct SpaceConsole *sc, ConsoleLine *cl_dummy)
{
- if(sel[0] <= str_len && sel[1] >= 0) {
- int sta = MAX2(sel[0], 0);
- int end = MIN2(sel[1], str_len);
-
- /* highly confusing but draws correctly */
- if(sel[0] < 0 || sel[1] > str_len) {
- if(sel[0] > 0) {
- end= sta;
- sta= 0;
- }
- if (sel[1] <= str_len) {
- sta= end;
- end= str_len;
- }
- }
- /* end confusement */
-
- {
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_halftone);
- glEnable( GL_BLEND );
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glColor4ub(255, 255, 255, 96);
- }
- glRecti(xy[0]+(cwidth*sta), xy[1]-2 + lheight, xy[0]+(cwidth*end), xy[1]-2);
- {
- glDisable(GL_POLYGON_STIPPLE);
- glDisable( GL_BLEND );
- }
- }
-
- sel[0] -= str_len + 1;
- sel[1] -= str_len + 1;
+ /* fake the edit line being in the scroll buffer */
+ ConsoleLine *cl= sc->history.last;
+ cl_dummy->type= CONSOLE_LINE_INPUT;
+ cl_dummy->len= cl_dummy->len_alloc= strlen(sc->prompt) + cl->len;
+ cl_dummy->len_alloc= cl_dummy->len + 1;
+ cl_dummy->line= MEM_mallocN(cl_dummy->len_alloc, "cl_dummy");
+ memcpy(cl_dummy->line, sc->prompt, (cl_dummy->len_alloc - cl->len));
+ memcpy(cl_dummy->line + ((cl_dummy->len_alloc - cl->len)) - 1, cl->line, cl->len + 1);
+ BLI_addtail(&sc->scrollback, cl_dummy);
}
-
-
-/* return 0 if the last line is off the screen
- * should be able to use this for any string type */
-
-static int console_draw_string(ConsoleDrawContext *cdc, char *str, int str_len, unsigned char *fg, unsigned char *bg)
+void console_scrollback_prompt_end(struct SpaceConsole *sc, ConsoleLine *cl_dummy)
{
- int rct_ofs= cdc->lheight/4;
- int tot_lines = (str_len/cdc->console_width)+1; /* total number of lines for wrapping */
- int y_next = (str_len > cdc->console_width) ? cdc->xy[1]+cdc->lheight*tot_lines : cdc->xy[1]+cdc->lheight;
-
- /* just advance the height */
- if(cdc->draw==0) {
- if(cdc->pos_pick) {
- if((cdc->mval[1] != INT_MAX) && cdc->xy[1] <= cdc->mval[1]) {
- if((cdc->xy[1]+cdc->lheight >= cdc->mval[1])) {
- int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth));
- *cdc->pos_pick += MIN2(ofs, str_len);
- } else
- *cdc->pos_pick += str_len + 1;
- }
+ MEM_freeN(cl_dummy->line);
+ BLI_remlink(&sc->scrollback, cl_dummy);
+}
- }
+#define CONSOLE_DRAW_MARGIN 4
+#define CONSOLE_DRAW_SCROLL 16
- cdc->xy[1]= y_next;
- return 1;
- }
- else if (y_next-cdc->lheight < cdc->ymin) {
- /* have not reached the drawable area so don't break */
- cdc->xy[1]= y_next;
-
- /* adjust selection even if not drawing */
- if(cdc->sel[0] != cdc->sel[1]) {
- cdc->sel[0] -= str_len + 1;
- cdc->sel[1] -= str_len + 1;
- }
- return 1;
- }
- if(str_len > cdc->console_width) { /* wrap? */
- char *line_stride= str + ((tot_lines-1) * cdc->console_width); /* advance to the last line and draw it first */
- char eol; /* baclup the end of wrapping */
-
- if(bg) {
- glColor3ub(bg[0], bg[1], bg[2]);
- glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, (cdc->xy[1]+(cdc->lheight*tot_lines))+rct_ofs);
- }
+/* console textview callbacks */
+static int console_textview_begin(TextViewContext *tvc)
+{
+ SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ tvc->lheight= sc->lheight;
+ tvc->sel_start= sc->sel_start;
+ tvc->sel_end= sc->sel_end;
+
+ /* iterator */
+ tvc->iter= sc->scrollback.last;
+
+ return (tvc->iter != NULL);
+}
- glColor3ub(fg[0], fg[1], fg[2]);
+static void console_textview_end(TextViewContext *tvc)
+{
+ SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ (void)sc;
+
+}
- /* last part needs no clipping */
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, line_stride);
+static int console_textview_step(TextViewContext *tvc)
+{
+ return ((tvc->iter= (void *)((Link *)tvc->iter)->prev) != NULL);
+}
- if(cdc->sel[0] != cdc->sel[1]) {
- cdc->sel[0] += str_len - (cdc->console_width % str_len);
- cdc->sel[1] += str_len - (cdc->console_width % str_len);
- console_draw_sel(cdc->sel, cdc->xy, cdc->console_width % str_len, cdc->cwidth, cdc->console_width, cdc->lheight);
- glColor3ub(fg[0], fg[1], fg[2]);
- }
+static int console_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ ConsoleLine *cl= (ConsoleLine *)tvc->iter;
+ *line= cl->line;
+ *len= cl->len;
- cdc->xy[1] += cdc->lheight;
-
- line_stride -= cdc->console_width;
-
- for(; line_stride >= str; line_stride -= cdc->console_width) {
- eol = line_stride[cdc->console_width];
- line_stride[cdc->console_width]= '\0';
-
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, line_stride);
-
- if(cdc->sel[0] != cdc->sel[1]) {
- console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->console_width, cdc->lheight);
- glColor3ub(fg[0], fg[1], fg[2]);
- }
-
- cdc->xy[1] += cdc->lheight;
-
- line_stride[cdc->console_width] = eol; /* restore */
-
- /* check if were out of view bounds */
- if(cdc->xy[1] > cdc->ymax)
- return 0;
- }
- }
- else { /* simple, no wrap */
+ return 1;
+}
- if(bg) {
- glColor3ub(bg[0], bg[1], bg[2]);
- glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, cdc->xy[1]+cdc->lheight-rct_ofs);
+static int console_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char UNUSED(bg[3]))
+{
+ ConsoleLine *cl_iter= (ConsoleLine *)tvc->iter;
+
+ /* annoying hack, to draw the prompt */
+ if(tvc->iter_index == 0) {
+ const SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ const ConsoleLine *cl= (ConsoleLine *)sc->history.last;
+ const int prompt_len= strlen(sc->prompt);
+ const int cursor_loc= cl->cursor + prompt_len;
+ int xy[2] = {CONSOLE_DRAW_MARGIN, CONSOLE_DRAW_MARGIN};
+ int pen[2];
+ xy[1] += tvc->lheight/6;
+
+ /* account for wrapping */
+ if(cl->len < tvc->console_width) {
+ /* simple case, no wrapping */
+ pen[0]= tvc->cwidth * cursor_loc;
+ pen[1]= -2;
+ }
+ else {
+ /* wrap */
+ pen[0]= tvc->cwidth * (cursor_loc % tvc->console_width);
+ pen[1]= -2 + (((cl->len / tvc->console_width) - (cursor_loc / tvc->console_width)) * tvc->lheight);
}
- glColor3ub(fg[0], fg[1], fg[2]);
-
- BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
- BLF_draw(mono, str);
-
- if(cdc->sel[0] != cdc->sel[1])
- console_draw_sel(cdc->sel, cdc->xy, str_len, cdc->cwidth, cdc->console_width, cdc->lheight);
-
- cdc->xy[1] += cdc->lheight;
+ /* cursor */
+ UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, fg);
+ glColor3ubv(fg);
- if(cdc->xy[1] > cdc->ymax)
- return 0;
+ glRecti( (xy[0] + pen[0]) - 1,
+ (xy[1] + pen[1]),
+ (xy[0] + pen[0]) + 1,
+ (xy[1] + pen[1] + tvc->lheight)
+ );
}
- return 1;
+ console_line_color(fg, cl_iter->type);
+
+ return TVC_LINE_FG;
}
-#define CONSOLE_DRAW_MARGIN 4
-#define CONSOLE_DRAW_SCROLL 16
-static int console_text_main__internal(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+static int console_textview_main__internal(struct SpaceConsole *sc, struct ARegion *ar, int draw, int mval[2], void **mouse_pick, int *pos_pick)
{
+ ConsoleLine cl_dummy= {NULL};
+ int ret= 0;
+
View2D *v2d= &ar->v2d;
- ConsoleLine *cl= sc->history.last;
- ConsoleDrawContext cdc;
-
- int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN;
- int xy[2], y_prev;
- int cwidth;
- int console_width; /* number of characters that fit into the width of the console (fixed width) */
- int sel[2]= {-1, -1}; /* defaults disabled */
- unsigned char fg[3];
+ TextViewContext tvc= {0};
- console_font_begin(sc);
- cwidth = BLF_fixed_width(mono);
-
- console_width= (ar->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) )/cwidth;
- if (console_width < 8) console_width= 8;
-
- xy[0]= x_orig; xy[1]= y_orig;
-
- if(mval[1] != INT_MAX)
- mval[1] += (v2d->cur.ymin + CONSOLE_DRAW_MARGIN);
-
- if(pos_pick)
- *pos_pick = 0;
-
- /* constants for the sequencer context */
- cdc.cwidth= cwidth;
- cdc.lheight= sc->lheight;
- cdc.console_width= console_width;
- cdc.winx= ar->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL);
- cdc.ymin= v2d->cur.ymin;
- cdc.ymax= v2d->cur.ymax;
- cdc.xy= xy;
- cdc.sel= sel;
- cdc.pos_pick= pos_pick;
- cdc.mval= mval;
- cdc.draw= draw;
-
- if(sc->type==CONSOLE_TYPE_PYTHON) {
- int prompt_len;
-
- if(sc->sel_start != sc->sel_end) {
- sel[0]= sc->sel_start;
- sel[1]= sc->sel_end;
- // printf("%d %d\n", sel[0], sel[1]);
- }
-
- /* text */
- if(draw) {
- prompt_len= strlen(sc->prompt);
- console_line_color(fg, CONSOLE_LINE_INPUT);
- glColor3ub(fg[0], fg[1], fg[2]);
-
- /* command line */
- if(prompt_len) {
- BLF_position(mono, xy[0], xy[1], 0); xy[0] += cwidth * prompt_len;
- BLF_draw(mono, sc->prompt);
- }
- BLF_position(mono, xy[0], xy[1], 0);
- BLF_draw(mono, cl->line);
-
- /* cursor */
- UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, (char *)fg);
- glColor3ub(fg[0], fg[1], fg[2]);
- glRecti(xy[0]+(cwidth*cl->cursor) -1, xy[1]-2, xy[0]+(cwidth*cl->cursor) +1, xy[1]+sc->lheight-2);
-
- xy[0]= x_orig; /* remove prompt offset */
- }
-
- xy[1] += sc->lheight;
-
- for(cl= sc->scrollback.last; cl; cl= cl->prev) {
- y_prev= xy[1];
-
- if(draw)
- console_line_color(fg, cl->type);
-
- if(!console_draw_string(&cdc, cl->line, cl->len, fg, NULL)) {
- /* when drawing, if we pass v2d->cur.ymax, then quit */
- if(draw) {
- break; /* past the y limits */
- }
- }
-
- if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
- *mouse_pick= (void *)cl;
- break;
- }
- }
- }
- else {
- Report *report;
- int report_mask= 0;
- int bool= 0;
- unsigned char bg[3];
-
- if(draw) {
- glClearColor(120.0/255.0, 120.0/255.0, 120.0/255.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- }
+ tvc.begin= console_textview_begin;
+ tvc.end= console_textview_end;
- /* convert our display toggles into a flag compatible with BKE_report flags */
- report_mask= console_report_mask(sc);
-
- for(report=reports->list.last; report; report=report->prev) {
-
- if(report->type & report_mask) {
- y_prev= xy[1];
-
- if(draw)
- console_report_color(fg, bg, report, bool);
-
- if(!console_draw_string(&cdc, report->message, report->len, fg, bg)) {
- /* when drawing, if we pass v2d->cur.ymax, then quit */
- if(draw) {
- break; /* past the y limits */
- }
- }
- if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
- *mouse_pick= (void *)report;
- break;
- }
-
- bool = !(bool);
- }
- }
- }
- xy[1] += sc->lheight*2;
+ tvc.step= console_textview_step;
+ tvc.line_get= console_textview_line_get;
+ tvc.line_color= console_textview_line_color;
-
- return xy[1]-y_orig;
-}
+ tvc.arg1= sc;
+ tvc.arg2= NULL;
-void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
-{
- int mval[2] = {INT_MAX, INT_MAX};
- console_text_main__internal(sc, ar, reports, 1, mval, NULL, NULL);
+ /* view */
+ tvc.sel_start= sc->sel_start;
+ tvc.sel_end= sc->sel_end;
+ tvc.lheight= sc->lheight;
+ tvc.ymin= v2d->cur.ymin;
+ tvc.ymax= v2d->cur.ymax;
+ tvc.winx= ar->winx;
+
+ console_scrollback_prompt_begin(sc, &cl_dummy);
+ ret= textview_draw(&tvc, draw, mval, mouse_pick, pos_pick);
+ console_scrollback_prompt_end(sc, &cl_dummy);
+
+ return ret;
}
-int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports)
+
+void console_textview_main(struct SpaceConsole *sc, struct ARegion *ar)
{
int mval[2] = {INT_MAX, INT_MAX};
- return console_text_main__internal(sc, ar, reports, 0, mval, NULL, NULL);
+ console_textview_main__internal(sc, ar, 1, mval, NULL, NULL);
}
-void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mouse_y)
+int console_textview_height(struct SpaceConsole *sc, struct ARegion *ar)
{
- int mval[2] = {0, mouse_y};
- void *mouse_pick= NULL;
- console_text_main__internal(sc, ar, reports, 0, mval, &mouse_pick, NULL);
- return (void *)mouse_pick;
+ int mval[2] = {INT_MAX, INT_MAX};
+ return console_textview_main__internal(sc, ar, 0, mval, NULL, NULL);
}
-// XXX - breaks with line wrap
-int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mval[2])
+int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, int mval[2])
{
int pos_pick= 0;
void *mouse_pick= NULL;
- console_text_main__internal(sc, ar, reports, 0, mval, &mouse_pick, &pos_pick);
+ int mval_clamp[2];
+
+ mval_clamp[0]= CLAMPIS(mval[0], CONSOLE_DRAW_MARGIN, ar->winx-(CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN));
+ mval_clamp[1]= CLAMPIS(mval[1], CONSOLE_DRAW_MARGIN, ar->winy-CONSOLE_DRAW_MARGIN);
+
+ console_textview_main__internal(sc, ar, 0, mval_clamp, &mouse_pick, &pos_pick);
return pos_pick;
}
diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h
index c74d39f25e3..acdd7e33a8e 100644
--- a/source/blender/editors/space_console/console_intern.h
+++ b/source/blender/editors/space_console/console_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,10 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -36,16 +32,18 @@ struct ReportList;
struct bContext;
/* console_draw.c */
-void console_text_main(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports);
-int console_text_height(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports); /* needed to calculate the scrollbar */
-void *console_text_pick(struct SpaceConsole *sc, struct ARegion *ar, struct ReportList *reports, int mouse_y); /* needed for selection */
-int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, ReportList *reports, int mval[2]);
+void console_textview_main(struct SpaceConsole *sc, struct ARegion *ar);
+int console_textview_height(struct SpaceConsole *sc, struct ARegion *ar); /* needed to calculate the scrollbar */
+int console_char_pick(struct SpaceConsole *sc, struct ARegion *ar, int mval[2]);
+
+void console_scrollback_prompt_begin(struct SpaceConsole *sc, ConsoleLine *cl_dummy);
+void console_scrollback_prompt_end(struct SpaceConsole *sc, ConsoleLine *cl_dummy);
/* console_ops.c */
void console_history_free(SpaceConsole *sc, ConsoleLine *cl);
void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl);
-ConsoleLine *console_history_add_str(const struct bContext *C, char *str, int own);
-ConsoleLine *console_scrollback_add_str(const struct bContext *C, char *str, int own);
+ConsoleLine *console_history_add_str(struct SpaceConsole *sc, char *str, int own);
+ConsoleLine *console_scrollback_add_str(struct SpaceConsole *sc, char *str, int own);
ConsoleLine *console_history_verify(const struct bContext *C);
@@ -65,19 +63,6 @@ void CONSOLE_OT_copy(struct wmOperatorType *ot);
void CONSOLE_OT_paste(struct wmOperatorType *ot);
void CONSOLE_OT_select_set(struct wmOperatorType *ot);
-
-
-/* console_report.c */
-void CONSOLE_OT_select_pick(struct wmOperatorType *ot); /* report selection */
-void CONSOLE_OT_select_all_toggle(struct wmOperatorType *ot);
-void CONSOLE_OT_select_border(struct wmOperatorType *ot);
-
-void CONSOLE_OT_report_replay(struct wmOperatorType *ot);
-void CONSOLE_OT_report_delete(struct wmOperatorType *ot);
-void CONSOLE_OT_report_copy(struct wmOperatorType *ot);
-
-
-
enum { LINE_BEGIN, LINE_END, PREV_CHAR, NEXT_CHAR, PREV_WORD, NEXT_WORD };
enum { DEL_ALL, DEL_NEXT_CHAR, DEL_PREV_CHAR, DEL_SELECTION, DEL_NEXT_SEL, DEL_PREV_SEL };
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
index 9a53531ba73..b3de56995bd 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -38,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_text.h" /* only for character utility funcs */
@@ -45,6 +41,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_view2d.h"
#include "ED_screen.h"
#include "RNA_access.h"
@@ -52,6 +49,19 @@
#include "console_intern.h"
+static void console_textview_update_rect(SpaceConsole *sc, ARegion *ar)
+{
+ View2D *v2d= &ar->v2d;
+
+ UI_view2d_totRect_set(v2d, ar->winx-1, console_textview_height(sc, ar));
+}
+
+static void console_select_offset(SpaceConsole *sc, const int offset)
+{
+ sc->sel_start += offset;
+ sc->sel_end += offset;
+}
+
void console_history_free(SpaceConsole *sc, ConsoleLine *cl)
{
BLI_remlink(&sc->history, cl);
@@ -65,7 +75,7 @@ void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl)
MEM_freeN(cl);
}
-void console_scrollback_limit(SpaceConsole *sc)
+static void console_scrollback_limit(SpaceConsole *sc)
{
int tot;
@@ -188,7 +198,7 @@ static ConsoleLine *console_scrollback_add(const bContext *C, ConsoleLine *from)
}
#endif
-static ConsoleLine *console_lb_add_str__internal(ListBase *lb, const bContext *C, char *str, int own)
+static ConsoleLine *console_lb_add_str__internal(ListBase *lb, char *str, int own)
{
ConsoleLine *ci= MEM_callocN(sizeof(ConsoleLine), "ConsoleLine Add");
if(own) ci->line= str;
@@ -199,13 +209,15 @@ static ConsoleLine *console_lb_add_str__internal(ListBase *lb, const bContext *C
BLI_addtail(lb, ci);
return ci;
}
-ConsoleLine *console_history_add_str(const bContext *C, char *str, int own)
+ConsoleLine *console_history_add_str(SpaceConsole *sc, char *str, int own)
{
- return console_lb_add_str__internal(&CTX_wm_space_console(C)->history, C, str, own);
+ return console_lb_add_str__internal(&sc->history, str, own);
}
-ConsoleLine *console_scrollback_add_str(const bContext *C, char *str, int own)
+ConsoleLine *console_scrollback_add_str(SpaceConsole *sc, char *str, int own)
{
- return console_lb_add_str__internal(&CTX_wm_space_console(C)->scrollback, C, str, own);
+ ConsoleLine *ci= console_lb_add_str__internal(&sc->scrollback, str, own);
+ console_select_offset(sc, ci->len + 1);
+ return ci;
}
ConsoleLine *console_history_verify(const bContext *C)
@@ -256,22 +268,6 @@ static int console_line_insert(ConsoleLine *ci, char *str)
return len;
}
-static int console_edit_poll(bContext *C)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
-
- if(!sc || sc->type != CONSOLE_TYPE_PYTHON)
- return 0;
-
- return 1;
-}
-#if 0
-static int console_poll(bContext *C)
-{
- return (CTX_wm_space_console(C) != NULL);
-}
-#endif
-
/* static funcs for text editing */
/* similar to the text editor, with some not used. keep compatible */
@@ -353,25 +349,42 @@ void CONSOLE_OT_move(wmOperatorType *ot)
/* api callbacks */
ot->exec= move_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_enum(ot->srna, "type", move_type_items, LINE_BEGIN, "Type", "Where to move cursor to.");
}
-
+#define TAB_LENGTH 4
static int insert_exec(bContext *C, wmOperator *op)
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
-
- int len= console_line_insert(ci, str);
+ int len;
+
+ // XXX, alligned tab key hack
+ if(str[0]=='\t' && str[1]=='\0') {
+ len= TAB_LENGTH - (ci->cursor % TAB_LENGTH);
+ MEM_freeN(str);
+ str= MEM_mallocN(len + 1, "insert_exec");
+ memset(str, ' ', len);
+ str[len]= '\0';
+ }
+
+ len= console_line_insert(ci, str);
MEM_freeN(str);
- if(len==0)
+ if(len==0) {
return OPERATOR_CANCELLED;
-
+ }
+ else {
+ console_select_offset(sc, len);
+ }
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -379,9 +392,19 @@ static int insert_exec(bContext *C, wmOperator *op)
static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(!RNA_property_is_set(op->ptr, "text")) {
- char str[2] = {event->ascii, '\0'};
- RNA_string_set(op->ptr, "text", str);
+ // if(!RNA_property_is_set(op->ptr, "text")) { /* always set from keymap XXX */
+ if(!RNA_string_length(op->ptr, "text")) {
+ /* if alt/ctrl/super are pressed pass through */
+ if(event->ctrl || event->oskey) {
+ return OPERATOR_PASS_THROUGH;
+ }
+ else {
+ char str[2];
+ str[0]= event->ascii;
+ str[1]= '\0';
+
+ RNA_string_set(op->ptr, "text", str);
+ }
}
return insert_exec(C, op);
}
@@ -396,7 +419,7 @@ void CONSOLE_OT_insert(wmOperatorType *ot)
/* api callbacks */
ot->exec= insert_exec;
ot->invoke= insert_invoke;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -412,13 +435,12 @@ static EnumPropertyItem delete_type_items[]= {
static int delete_exec(bContext *C, wmOperator *op)
{
-
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
-
-
- int done = 0;
- int type= RNA_enum_get(op->ptr, "type");
+ const short type= RNA_enum_get(op->ptr, "type");
+ int done = 0;
if(ci->len==0) {
return OPERATOR_CANCELLED;
@@ -442,9 +464,14 @@ static int delete_exec(bContext *C, wmOperator *op)
break;
}
- if(!done)
+ if(!done) {
return OPERATOR_CANCELLED;
-
+ }
+ else {
+ console_select_offset(sc, -1);
+ }
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -460,7 +487,7 @@ void CONSOLE_OT_delete(wmOperatorType *ot)
/* api callbacks */
ot->exec= delete_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_enum(ot->srna, "type", delete_type_items, DEL_NEXT_CHAR, "Type", "Which part of the text to delete.");
@@ -471,6 +498,7 @@ void CONSOLE_OT_delete(wmOperatorType *ot)
static int clear_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
short scrollback= RNA_boolean_get(op->ptr, "scrollback");
short history= RNA_boolean_get(op->ptr, "history");
@@ -486,9 +514,10 @@ static int clear_exec(bContext *C, wmOperator *op)
while(sc->history.first)
console_history_free(sc, sc->history.first);
}
-
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
-
+
return OPERATOR_FINISHED;
}
@@ -501,7 +530,7 @@ void CONSOLE_OT_clear(wmOperatorType *ot)
/* api callbacks */
ot->exec= clear_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_boolean(ot->srna, "scrollback", 1, "Scrollback", "Clear the scrollback history");
@@ -514,9 +543,11 @@ void CONSOLE_OT_clear(wmOperatorType *ot)
static int history_cycle_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
+
ConsoleLine *ci= console_history_verify(C); /* TODO - stupid, just prevernts crashes when no command line */
-
short reverse= RNA_boolean_get(op->ptr, "reverse"); /* assumes down, reverse is up */
+ int prev_len= ci->len;
/* keep a copy of the line above so when history is cycled
* this is the only function that needs to know about the double-up */
@@ -545,7 +576,12 @@ static int history_cycle_exec(bContext *C, wmOperator *op)
console_history_add(C, (ConsoleLine *)sc->history.last);
}
+
+ ci= sc->history.last;
+ console_select_offset(sc, ci->len - prev_len);
+ /* could be wrapped so update scroll rect */
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -560,7 +596,7 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot)
/* api callbacks */
ot->exec= history_cycle_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_boolean(ot->srna, "reverse", 0, "Reverse", "reverse cycle history");
@@ -570,13 +606,15 @@ void CONSOLE_OT_history_cycle(wmOperatorType *ot)
/* the python exec operator uses this */
static int history_append_exec(bContext *C, wmOperator *op)
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ScrArea *sa= CTX_wm_area(C);
ConsoleLine *ci= console_history_verify(C);
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); /* own this text in the new line, dont free */
int cursor= RNA_int_get(op->ptr, "current_character");
short rem_dupes= RNA_boolean_get(op->ptr, "remove_duplicates");
+ int prev_len= ci->len;
if(rem_dupes) {
- SpaceConsole *sc= CTX_wm_space_console(C);
ConsoleLine *cl;
while((cl= console_history_find(sc, ci->line, ci)))
@@ -588,11 +626,12 @@ static int history_append_exec(bContext *C, wmOperator *op)
}
}
- ci= console_history_add_str(C, str, 1); /* own the string */
+ ci= console_history_add_str(sc, str, 1); /* own the string */
+ console_select_offset(sc, ci->len - prev_len);
console_line_cursor_set(ci, cursor);
-
- ED_area_tag_redraw(CTX_wm_area(C));
-
+
+ ED_area_tag_redraw(sa);
+
return OPERATOR_FINISHED;
}
@@ -605,7 +644,7 @@ void CONSOLE_OT_history_append(wmOperatorType *ot)
/* api callbacks */
ot->exec= history_append_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -618,16 +657,20 @@ void CONSOLE_OT_history_append(wmOperatorType *ot)
static int scrollback_append_exec(bContext *C, wmOperator *op)
{
SpaceConsole *sc= CTX_wm_space_console(C);
- ConsoleLine *ci= console_history_verify(C);
+ ARegion *ar= CTX_wm_region(C);
+ ConsoleLine *ci;
char *str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); /* own this text in the new line, dont free */
int type= RNA_enum_get(op->ptr, "type");
+
+ console_history_verify(C);
- ci= console_scrollback_add_str(C, str, 1); /* own the string */
+ ci= console_scrollback_add_str(sc, str, 1); /* own the string */
ci->type= type;
console_scrollback_limit(sc);
-
+
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -650,7 +693,7 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
/* api callbacks */
ot->exec= scrollback_append_exec;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
/* properties */
RNA_def_string(ot->srna, "text", "", 0, "Text", "Text to insert at the cursor position.");
@@ -658,10 +701,9 @@ void CONSOLE_OT_scrollback_append(wmOperatorType *ot)
}
-static int copy_exec(bContext *C, wmOperator *op)
+static int copy_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceConsole *sc= CTX_wm_space_console(C);
- int buf_len;
DynStr *buf_dyn= BLI_dynstr_new();
char *buf_str;
@@ -670,6 +712,8 @@ static int copy_exec(bContext *C, wmOperator *op)
int sel[2];
int offset= 0;
+ ConsoleLine cl_dummy= {0};
+
#if 0
/* copy whole file */
for(cl= sc->scrollback.first; cl; cl= cl->next) {
@@ -681,43 +725,25 @@ static int copy_exec(bContext *C, wmOperator *op)
if(sc->sel_start == sc->sel_end)
return OPERATOR_CANCELLED;
+ console_scrollback_prompt_begin(sc, &cl_dummy);
for(cl= sc->scrollback.first; cl; cl= cl->next) {
offset += cl->len + 1;
}
- if(offset==0)
+ if(offset==0) {
+ console_scrollback_prompt_end(sc, &cl_dummy);
return OPERATOR_CANCELLED;
-
+ }
offset -= 1;
sel[0]= offset - sc->sel_end;
sel[1]= offset - sc->sel_start;
for(cl= sc->scrollback.first; cl; cl= cl->next) {
-
- int sta= MAX2(0, sel[0]);
- int end= MIN2(cl->len, sel[1]);
-
if(sel[0] <= cl->len && sel[1] >= 0) {
- int str_len= cl->len;
-
- /* highly confusing but draws correctly */
- if(sel[0] < 0 || sel[1] > str_len) {
- if(sel[0] > 0) {
- end= sta;
- sta= 0;
- }
- if (sel[1] <= str_len) {
- sta= end;
- end= str_len;
- }
- }
- /* end confusement */
-
- SWAP(int, sta, end);
- end= cl->len - end;
- sta= cl->len - sta;
+ int sta= MAX2(sel[0], 0);
+ int end= MIN2(sel[1], cl->len);
if(BLI_dynstr_get_len(buf_dyn))
BLI_dynstr_append(buf_dyn, "\n");
@@ -730,11 +756,14 @@ static int copy_exec(bContext *C, wmOperator *op)
}
buf_str= BLI_dynstr_get_cstring(buf_dyn);
- buf_len= BLI_dynstr_get_len(buf_dyn);
+
BLI_dynstr_free(buf_dyn);
WM_clipboard_text_set(buf_str, 0);
MEM_freeN(buf_str);
+
+ console_scrollback_prompt_end(sc, &cl_dummy);
+
return OPERATOR_FINISHED;
}
@@ -746,14 +775,16 @@ void CONSOLE_OT_copy(wmOperatorType *ot)
ot->idname= "CONSOLE_OT_copy";
/* api callbacks */
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
ot->exec= copy_exec;
/* properties */
}
-static int paste_exec(bContext *C, wmOperator *op)
+static int paste_exec(bContext *C, wmOperator *UNUSED(op))
{
+ SpaceConsole *sc= CTX_wm_space_console(C);
+ ARegion *ar= CTX_wm_region(C);
ConsoleLine *ci= console_history_verify(C);
char *buf_str= WM_clipboard_text_get(0);
@@ -762,7 +793,6 @@ static int paste_exec(bContext *C, wmOperator *op)
if(buf_str==NULL)
return OPERATOR_CANCELLED;
- buf_next= buf_str;
buf_step= buf_str;
while((buf_next=buf_step) && buf_next[0] != '\0') {
@@ -777,11 +807,12 @@ static int paste_exec(bContext *C, wmOperator *op)
ci= console_history_verify(C);
}
- console_line_insert(ci, buf_next);
+ console_select_offset(sc, console_line_insert(ci, buf_next));
}
MEM_freeN(buf_str);
+ console_textview_update_rect(sc, ar);
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
@@ -795,7 +826,7 @@ void CONSOLE_OT_paste(wmOperatorType *ot)
ot->idname= "CONSOLE_OT_paste";
/* api callbacks */
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
ot->exec= paste_exec;
/* properties */
@@ -806,10 +837,11 @@ typedef struct SetConsoleCursor {
int sel_init;
} SetConsoleCursor;
-static void set_cursor_to_pos(SpaceConsole *sc, ARegion *ar, SetConsoleCursor *scu, int mval[2], int sel)
+// TODO, cursor placement without selection
+static void set_cursor_to_pos(SpaceConsole *sc, ARegion *ar, SetConsoleCursor *scu, int mval[2], int UNUSED(sel))
{
int pos;
- pos= console_char_pick(sc, ar, NULL, mval);
+ pos= console_char_pick(sc, ar, mval);
if(scu->sel_init == INT_MAX) {
scu->sel_init= pos;
@@ -835,13 +867,24 @@ static void console_modal_select_apply(bContext *C, wmOperator *op, wmEvent *eve
SpaceConsole *sc= CTX_wm_space_console(C);
ARegion *ar= CTX_wm_region(C);
SetConsoleCursor *scu= op->customdata;
- int mval[2] = {event->mval[0], event->mval[1]};
+ int mval[2];
+ int sel_prev[2];
+
+ mval[0]= event->mval[0];
+ mval[1]= event->mval[1];
+ sel_prev[0]= sc->sel_start;
+ sel_prev[1]= sc->sel_end;
+
set_cursor_to_pos(sc, ar, scu, mval, TRUE);
- ED_area_tag_redraw(CTX_wm_area(C));
+
+ /* only redraw if the selection changed */
+ if(sel_prev[0] != sc->sel_start || sel_prev[1] != sc->sel_end) {
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
}
-static void set_cursor_exit(bContext *C, wmOperator *op)
+static void set_cursor_exit(bContext *UNUSED(C), wmOperator *op)
{
// SpaceConsole *sc= CTX_wm_space_console(C);
SetConsoleCursor *scu= op->customdata;
@@ -910,5 +953,5 @@ void CONSOLE_OT_select_set(wmOperatorType *ot)
ot->invoke= console_modal_select_invoke;
ot->modal= console_modal_select;
ot->cancel= console_modal_select_cancel;
- ot->poll= console_edit_poll;
+ ot->poll= ED_operator_console_active;
}
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index 4ee69bbd809..ebf96cca191 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -16,17 +16,12 @@
* 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.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
*
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
-
- #include <string.h>
+#include <string.h>
#include <stdio.h>
#ifdef WIN32
@@ -37,16 +32,17 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_idcode.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
-
#include "RNA_access.h"
#include "WM_api.h"
@@ -57,17 +53,9 @@
#include "console_intern.h" // own include
-static void console_update_rect(const bContext *C, ARegion *ar)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
- View2D *v2d= &ar->v2d;
-
- UI_view2d_totRect_set(v2d, ar->winx-1, console_text_height(sc, ar, CTX_wm_reports(C)));
-}
-
/* ******************** default callbacks for console space ***************** */
-static SpaceLink *console_new(const bContext *C)
+static SpaceLink *console_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceConsole *sconsole;
@@ -76,8 +64,6 @@ static SpaceLink *console_new(const bContext *C)
sconsole->spacetype= SPACE_CONSOLE;
sconsole->lheight= 14;
- sconsole->type= CONSOLE_TYPE_PYTHON;
- sconsole->rpt_mask= CONSOLE_RPT_OP; /* ? - not sure whats a good default here?*/
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for console");
@@ -93,7 +79,7 @@ static SpaceLink *console_new(const bContext *C)
BLI_addtail(&sconsole->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
-
+ /* keep in sync with info */
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.align |= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
ar->v2d.keepofs |= V2D_LOCKOFS_X;
@@ -121,7 +107,7 @@ static void console_free(SpaceLink *sl)
/* spacetype; init callback */
-static void console_init(struct wmWindowManager *wm, ScrArea *sa)
+static void console_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -162,12 +148,11 @@ static void console_main_area_init(wmWindowManager *wm, ARegion *ar)
/* ************* dropboxes ************* */
-static int id_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int id_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- if(sc->type==CONSOLE_TYPE_PYTHON)
- if(drag->type==WM_DRAG_ID)
- return 1;
+// SpaceConsole *sc= CTX_wm_space_console(C);
+ if(drag->type==WM_DRAG_ID)
+ return 1;
return 0;
}
@@ -182,12 +167,11 @@ static void id_drop_copy(wmDrag *drag, wmDropBox *drop)
RNA_string_set(drop->ptr, "text", text);
}
-static int path_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int path_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- if(sc->type==CONSOLE_TYPE_PYTHON)
- if(drag->type==WM_DRAG_PATH)
- return 1;
+// SpaceConsole *sc= CTX_wm_space_console(C);
+ if(drag->type==WM_DRAG_PATH)
+ return 1;
return 0;
}
@@ -216,23 +200,21 @@ static void console_main_area_draw(const bContext *C, ARegion *ar)
SpaceConsole *sc= CTX_wm_space_console(C);
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
-
- if((sc->type==CONSOLE_TYPE_PYTHON) && (sc->scrollback.first==NULL))
+
+ if(sc->scrollback.first==NULL)
WM_operator_name_call((bContext *)C, "CONSOLE_OT_banner", WM_OP_EXEC_DEFAULT, NULL);
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- console_update_rect(C, ar);
-
/* worlks best with no view2d matrix set */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
console_history_verify(C); /* make sure we have some command line */
- console_text_main(sc, ar, CTX_wm_reports(C));
+ console_textview_main(sc, ar);
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -243,7 +225,7 @@ static void console_main_area_draw(const bContext *C, ARegion *ar)
UI_view2d_scrollers_free(scrollers);
}
-void console_operatortypes(void)
+static void console_operatortypes(void)
{
/* console_ops.c */
WM_operatortype_append(CONSOLE_OT_move);
@@ -259,18 +241,9 @@ void console_operatortypes(void)
WM_operatortype_append(CONSOLE_OT_copy);
WM_operatortype_append(CONSOLE_OT_paste);
WM_operatortype_append(CONSOLE_OT_select_set);
-
- /* console_report.c */
- WM_operatortype_append(CONSOLE_OT_select_pick);
- WM_operatortype_append(CONSOLE_OT_select_all_toggle);
- WM_operatortype_append(CONSOLE_OT_select_border);
-
- WM_operatortype_append(CONSOLE_OT_report_replay);
- WM_operatortype_append(CONSOLE_OT_report_delete);
- WM_operatortype_append(CONSOLE_OT_report_copy);
}
-void console_keymap(struct wmKeyConfig *keyconf)
+static void console_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Console", SPACE_CONSOLE, 0);
wmKeyMapItem *kmi;
@@ -327,7 +300,7 @@ void console_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", RETKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", PADENTER, KM_PRESS, 0, 0);
@@ -335,16 +308,6 @@ void console_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CONSOLE_OT_autocomplete", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* python operator - space_text.py */
#endif
- /* report selection */
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_select_border", BKEY, KM_PRESS, 0, 0);
-
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_replay", RKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", XKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "CONSOLE_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
-
WM_keymap_add_item(keymap, "CONSOLE_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CONSOLE_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
#ifdef __APPLE__
@@ -354,14 +317,14 @@ void console_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", " "); /* fake tabs */
+ RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", "\t"); /* fake tabs */
WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
}
/****************** header region ******************/
/* add handlers, stuff you only do once or on area/region changes */
-static void console_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void console_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -371,19 +334,15 @@ static void console_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void console_main_area_listener(ScrArea *sa, wmNotifier *wmn)
+static void console_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
- SpaceConsole *sc= sa->spacedata.first;
+ // SpaceInfo *sinfo= sa->spacedata.first;
/* context changes */
switch(wmn->category) {
case NC_SPACE:
if(wmn->data == ND_SPACE_CONSOLE) { /* generic redraw request */
- ED_area_tag_redraw(sa);
- }
- else if(wmn->data == ND_SPACE_CONSOLE_REPORT && sc->type==CONSOLE_TYPE_REPORT) {
- /* redraw also but only for report view, could do less redraws by checking the type */
- ED_area_tag_redraw(sa);
+ ED_region_tag_redraw(ar);
}
break;
}
@@ -405,7 +364,6 @@ void ED_spacetype_console(void)
st->operatortypes= console_operatortypes;
st->keymap= console_keymap;
st->dropboxes= console_dropboxes;
- st->listener= console_main_area_listener;
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype console region");
@@ -414,7 +372,7 @@ void ED_spacetype_console(void)
art->init= console_main_area_init;
art->draw= console_main_area_draw;
-
+ art->listener= console_main_area_listener;
diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt
index 5cbe9bbe0ba..d77ed306daf 100644
--- a/source/blender/editors/space_file/CMakeLists.txt
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -19,49 +19,56 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenfont
../../blenkernel
../../blenlib
../../blenloader
../../imbuf
- ../include
- ../../../../intern/audaspace/intern
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
- ../../render/extern/include
../../windowmanager
+ ../../render/extern/include
+ ../../../../intern/guardedalloc
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ file_draw.c
+ file_ops.c
+ file_panels.c
+ filelist.c
+ filesel.c
+ fsmenu.c
+ space_file.c
+
+ file_intern.h
+ filelist.h
+ fsmenu.h
+)
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-BLENDERLIB(bf_editor_space_file "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_file "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_file/SConscript b/source/blender/editors/space_file/SConscript
index 9de705e99d3..7c55b40e816 100644
--- a/source/blender/editors/space_file/SConscript
+++ b/source/blender/editors/space_file/SConscript
@@ -14,10 +14,10 @@ if env['WITH_BF_OPENJPEG']:
defs.append('WITH_OPENJPEG')
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
if env['WITH_BF_TIFF']:
- defs.append('WITH_TIFF')
+ defs.append('WITH_TIFF')
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 5f435aa0cbe..041280aaf7e 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,9 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <math.h>
#include <string.h>
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_storage_types.h"
#ifdef WIN32
@@ -40,6 +42,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BLF_api.h"
@@ -76,10 +79,10 @@
enum {
B_FS_DIRNAME,
B_FS_FILENAME
-} eFile_ButEvents;
+} /*eFile_ButEvents*/;
-static void do_file_buttons(bContext *C, void *arg, int event)
+static void do_file_buttons(bContext *C, void *UNUSED(arg), int event)
{
switch(event) {
case B_FS_FILENAME:
@@ -134,7 +137,7 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
ARegion* artmp;
/* Initialize UI block. */
- sprintf(name, "win %p", ar);
+ sprintf(name, "win %p", (void *)ar);
block = uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_file_buttons, NULL);
@@ -172,7 +175,11 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
/* Text input fields for directory and file. */
if (available_w > 0) {
- but = uiDefBut(block, TEX, B_FS_DIRNAME, "",
+ int overwrite_alert= file_draw_check_exists(sfile);
+ /* callbacks for operator check functions */
+ uiBlockSetFunc(block, file_draw_check_cb, NULL, NULL);
+
+ but = uiDefButTextO(block, TEX, "FILE_OT_directory", 0, "",
min_x, line1_y, line1_w-chan_offs, btn_h,
params->dir, 0.0, (float)FILE_MAX-1, 0, 0,
"File path.");
@@ -182,9 +189,17 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
but = uiDefBut(block, TEX, B_FS_FILENAME, "",
min_x, line2_y, line2_w-chan_offs, btn_h,
params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0,
- "File name.");
+ overwrite_alert ?"File name, overwrite existing." : "File name.");
uiButSetCompleteFunc(but, autocomplete_file, NULL);
uiButSetFlag(but, UI_BUT_NO_UTF8);
+
+ /* check if this overrides a file and if the operator option is used */
+ if(overwrite_alert) {
+ uiButSetFlag(but, UI_BUT_REDALERT);
+ }
+
+ /* clear func */
+ uiBlockSetFunc(block, NULL, NULL, NULL);
}
/* Filename number increment / decrement buttons. */
@@ -227,56 +242,6 @@ static void draw_tile(int sx, int sy, int width, int height, int colorid, int sh
uiRoundBox(sx, sy - height, sx + width, sy, 5);
}
-#define FILE_SHORTEN_END 0
-#define FILE_SHORTEN_FRONT 1
-
-static float shorten_string(char* string, float w, int flag)
-{
- char temp[FILE_MAX];
- short shortened = 0;
- float sw = 0;
- float pad = 0;
-
- if (w <= 0) {
- *string = '\0';
- return 0.0;
- }
-
- sw = file_string_width(string);
- if (flag == FILE_SHORTEN_FRONT) {
- char *s = string;
- BLI_strncpy(temp, "...", 4);
- pad = file_string_width(temp);
- while ((*s) && (sw+pad>w)) {
- s++;
- sw = file_string_width(s);
- shortened = 1;
- }
- if (shortened) {
- int slen = strlen(s);
- BLI_strncpy(temp+3, s, slen+1);
- temp[slen+4] = '\0';
- BLI_strncpy(string, temp, slen+4);
- }
- } else {
- char *s = string;
- while (sw>w) {
- int slen = strlen(string);
- string[slen-1] = '\0';
- sw = file_string_width(s);
- shortened = 1;
- }
-
- if (shortened) {
- int slen = strlen(string);
- if (slen > 3) {
- BLI_strncpy(string+slen-3, "...", 4);
- }
- }
- }
-
- return sw;
-}
static int get_file_icon(struct direntry *file)
{
@@ -291,6 +256,8 @@ static int get_file_icon(struct direntry *file)
}
else if (file->flags & BLENDERFILE)
return ICON_FILE_BLEND;
+ else if (file->flags & BLENDERFILE_BACKUP)
+ return ICON_FILE_BLEND;
else if (file->flags & IMAGEFILE)
return ICON_FILE_IMAGE;
else if (file->flags & MOVIEFILE)
@@ -315,37 +282,37 @@ static void file_draw_icon(uiBlock *block, char *path, int sx, int sy, int icon,
{
uiBut *but;
float x,y;
- float alpha=1.0f;
+ /*float alpha=1.0f;*/
x = (float)(sx);
y = (float)(sy-height);
- if (icon == ICON_FILE_BLANK) alpha = 0.375f;
+ /*if (icon == ICON_FILE_BLANK) alpha = 0.375f;*/
but= uiDefIconBut(block, LABEL, 0, icon, x, y, width, height, NULL, 0.0, 0.0, 0, 0, "");
uiButSetDragPath(but, path);
}
-static void file_draw_string(int sx, int sy, const char* string, float width, int height, int flag)
+static void file_draw_string(int sx, int sy, const char* string, float width, int height, short align)
{
uiStyle *style= U.uistyles.first;
- int soffs;
+ uiFontStyle fs = style->widgetlabel;
+ rcti rect;
char fname[FILE_MAXFILE];
- float sw;
- float x,y;
+ fs.align = align;
BLI_strncpy(fname,string, FILE_MAXFILE);
- sw = shorten_string(fname, width, flag );
-
- soffs = (width - sw) / 2;
- x = (float)(sx);
- y = (float)(sy-height);
+ file_shorten_string(fname, width+1.0, 0);
- uiStyleFontSet(&style->widget);
- BLF_position(style->widget.uifont_id, x, y, 0);
- BLF_draw(style->widget.uifont_id, fname);
+ /* no text clipping needed, uiStyleFontDraw does it but is a bit too strict (for buttons it works) */
+ rect.xmin = sx;
+ rect.xmax = sx + ceil(width+4.0f);
+ rect.ymin = sy - height;
+ rect.ymax = sy;
+
+ uiStyleFontDraw(&fs, &rect, fname);
}
void file_calc_previews(const bContext *C, ARegion *ar)
@@ -421,7 +388,7 @@ static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int
}
}
-static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
+static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
{
char newname[FILE_MAX+12];
char orgname[FILE_MAX+12];
@@ -433,9 +400,9 @@ static void renamebutton_cb(bContext *C, void *arg1, char *oldname)
struct direntry *file = (struct direntry *)arg1;
#endif
- BLI_make_file_string(G.sce, orgname, sfile->params->dir, oldname);
+ BLI_make_file_string(G.main->name, orgname, sfile->params->dir, oldname);
BLI_strncpy(filename, sfile->params->renameedit, sizeof(filename));
- BLI_make_file_string(G.sce, newname, sfile->params->dir, filename);
+ BLI_make_file_string(G.main->name, newname, sfile->params->dir, filename);
if( strcmp(orgname, newname) != 0 ) {
if (!BLI_exists(newname)) {
@@ -500,9 +467,11 @@ void file_draw_list(const bContext *C, ARegion *ar)
int colorid = 0;
int sx, sy;
int offset;
+ int textwidth, textheight;
int i;
- float sw, spos;
short is_icon;
+ short align;
+
numfiles = filelist_numfiles(files);
@@ -525,6 +494,11 @@ void file_draw_list(const bContext *C, ARegion *ar)
numfiles_layout += layout->columns;
}
+ textwidth =( FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
+ textheight = layout->textheight*3.0/2.0 + 0.5;
+
+ align = ( FILE_IMGDISPLAY == params->display) ? UI_STYLE_TEXT_CENTER : UI_STYLE_TEXT_LEFT;
+
for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i)
{
ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
@@ -535,20 +509,6 @@ void file_draw_list(const bContext *C, ARegion *ar)
UI_ThemeColor4(TH_TEXT);
- spos = ( FILE_IMGDISPLAY == params->display ) ? sx : sx + ICON_DEFAULT_WIDTH + 4;
-
- sw = file_string_width(file->relname);
- if (file->flags & EDITING) {
- int but_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
-
- uiBut *but = uiDefBut(block, TEX, 1, "", spos, sy-layout->tile_h-3,
- but_width, layout->textheight*2, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
- uiButSetRenameFunc(but, renamebutton_cb, file);
- uiButSetFlag(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
- if ( 0 == uiButActiveOnly(C, block, but)) {
- file->flags &= ~EDITING;
- }
- }
if (!(file->flags & EDITING)) {
if (params->active_file == i) {
@@ -571,58 +531,61 @@ void file_draw_list(const bContext *C, ARegion *ar)
}
file_draw_preview(block, file, sx, sy, imb, layout, !is_icon && (file->flags & IMAGEFILE));
-
} else {
file_draw_icon(block, file->path, sx, sy-3, get_file_icon(file), ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH);
+ sx += ICON_DEFAULT_WIDTH + 4;
}
UI_ThemeColor4(TH_TEXT);
+
+ if (file->flags & EDITING) {
+ uiBut *but = uiDefBut(block, TEX, 1, "", sx , sy-layout->tile_h-3,
+ textwidth, textheight, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
+ uiButSetRenameFunc(but, renamebutton_cb, file);
+ uiButSetFlag(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
+ if ( 0 == uiButActiveOnly(C, block, but)) {
+ file->flags &= ~EDITING;
+ }
+ }
+
if (!(file->flags & EDITING)) {
- float name_width = (FILE_IMGDISPLAY == params->display) ? layout->tile_w : sw;
- file_draw_string(spos, sy, file->relname, name_width, layout->tile_h, FILE_SHORTEN_END);
+ int tpos = (FILE_IMGDISPLAY == params->display) ? sy - layout->tile_h + layout->textheight : sy;
+ file_draw_string(sx+1, tpos, file->relname, textwidth, textheight, align);
}
if (params->display == FILE_SHORTDISPLAY) {
- spos += layout->column_widths[COLUMN_NAME] + 12;
+ sx += layout->column_widths[COLUMN_NAME] + 12;
if (!(file->type & S_IFDIR)) {
- sw = file_string_width(file->size);
- file_draw_string(spos, sy, file->size, sw+1, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_SIZE] + 12;
+ file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_SIZE] + 12;
}
} else if (params->display == FILE_LONGDISPLAY) {
- spos += layout->column_widths[COLUMN_NAME] + 12;
+ sx += layout->column_widths[COLUMN_NAME] + 12;
#ifndef WIN32
/* rwx rwx rwx */
- sw = file_string_width(file->mode1);
- file_draw_string(spos, sy, file->mode1, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE1] + 12;
+ file_draw_string(sx, sy, file->mode1, layout->column_widths[COLUMN_MODE1], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE1] + 12;
- sw = file_string_width(file->mode2);
- file_draw_string(spos, sy, file->mode2, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE2] + 12;
+ file_draw_string(sx, sy, file->mode2, layout->column_widths[COLUMN_MODE2], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE2] + 12;
- sw = file_string_width(file->mode3);
- file_draw_string(spos, sy, file->mode3, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_MODE3] + 12;
+ file_draw_string(sx, sy, file->mode3, layout->column_widths[COLUMN_MODE3], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_MODE3] + 12;
- sw = file_string_width(file->owner);
- file_draw_string(spos, sy, file->owner, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_OWNER] + 12;
+ file_draw_string(sx, sy, file->owner, layout->column_widths[COLUMN_OWNER] , layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_OWNER] + 12;
#endif
- sw = file_string_width(file->date);
- file_draw_string(spos, sy, file->date, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_DATE] + 12;
+ file_draw_string(sx, sy, file->date, layout->column_widths[COLUMN_DATE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_DATE] + 12;
- sw = file_string_width(file->time);
- file_draw_string(spos, sy, file->time, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_TIME] + 12;
+ file_draw_string(sx, sy, file->time, layout->column_widths[COLUMN_TIME] , layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_TIME] + 12;
if (!(file->type & S_IFDIR)) {
- sw = file_string_width(file->size);
- file_draw_string(spos, sy, file->size, sw, layout->tile_h, FILE_SHORTEN_END);
- spos += layout->column_widths[COLUMN_SIZE] + 12;
+ file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
+ sx += layout->column_widths[COLUMN_SIZE] + 12;
}
}
}
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index c77379b39a0..d9f7e7dc833 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -46,6 +46,9 @@ void file_calc_previews(const bContext *C, ARegion *ar);
void file_draw_previews(const bContext *C, ARegion *ar);
void file_draw_list(const bContext *C, ARegion *ar);
+void file_draw_check_cb(bContext *C, void *arg1, void *arg2);
+int file_draw_check_exists(SpaceFile *sfile);
+
/* file_ops.h */
struct wmOperatorType;
struct wmOperator;
@@ -63,6 +66,7 @@ void FILE_OT_cancel(struct wmOperatorType *ot);
void FILE_OT_parent(struct wmOperatorType *ot);
void FILE_OT_directory_new(struct wmOperatorType *ot);
void FILE_OT_filename(struct wmOperatorType *ot);
+void FILE_OT_directory(struct wmOperatorType *ot);
void FILE_OT_previous(struct wmOperatorType *ot);
void FILE_OT_next(struct wmOperatorType *ot);
void FILE_OT_refresh(struct wmOperatorType *ot);
@@ -84,10 +88,15 @@ int file_delete_exec(bContext *C, struct wmOperator *unused);
int file_hilight_set(struct SpaceFile *sfile, struct ARegion *ar, int mx, int my);
+void file_sfile_to_operator(struct wmOperator *op, struct SpaceFile *sfile, char *filepath);
+void file_operator_to_sfile(struct SpaceFile *sfile, struct wmOperator *op);
+
/* filesel.c */
+float file_shorten_string(char* string, float w, int front);
float file_string_width(const char* str);
-float file_font_pointsize();
+
+float file_font_pointsize(void);
void file_change_dir(bContext *C, int checkdir);
int file_select_match(struct SpaceFile *sfile, const char *pattern);
void autocomplete_directory(struct bContext *C, char *str, void *arg_v);
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 2a50b505c57..100931e02eb 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,8 +30,10 @@
#include "BKE_screen.h"
#include "BKE_global.h"
#include "BKE_report.h"
+#include "BKE_main.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_storage_types.h"
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -190,7 +192,7 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
/* avoids /../../ */
BLI_parent_dir(params->dir);
} else {
- BLI_cleanup_dir(G.sce, params->dir);
+ BLI_cleanup_dir(G.main->name, params->dir);
strcat(params->dir, file->relname);
BLI_add_slash(params->dir);
}
@@ -206,7 +208,11 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
}
}
- }
+ }
+
+ /* update operator for name change event */
+ file_draw_check_cb(C, NULL, NULL);
+
return retval;
}
@@ -255,7 +261,6 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
- short val;
rcti rect;
int extend = RNA_boolean_get(op->ptr, "extend");
int fill = RNA_boolean_get(op->ptr, "fill");
@@ -265,7 +270,6 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
rect.xmin = rect.xmax = event->x - ar->winrct.xmin;
rect.ymin = rect.ymax = event->y - ar->winrct.ymin;
- val = event->val;
if(!BLI_in_rcti(&ar->v2d.mask, rect.xmin, rect.ymin))
return OPERATOR_CANCELLED;
@@ -300,7 +304,7 @@ void FILE_OT_select(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "fill", 0, "Fill", "Select everything beginning with the last selection.");
}
-static int file_select_all_exec(bContext *C, wmOperator *op)
+static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -357,7 +361,7 @@ static int bookmark_select_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "dir", entry);
BLI_strncpy(params->dir, entry, sizeof(params->dir));
- BLI_cleanup_dir(G.sce, params->dir);
+ BLI_cleanup_dir(G.main->name, params->dir);
file_change_dir(C, 1);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
@@ -380,7 +384,7 @@ void FILE_OT_select_bookmark(wmOperatorType *ot)
RNA_def_string(ot->srna, "dir", "", 256, "Dir", "");
}
-static int bookmark_add_exec(bContext *C, wmOperator *op)
+static int bookmark_add_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -475,7 +479,7 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
return (params->active_file != origfile);
}
-static int file_highlight_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int file_highlight_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -500,26 +504,19 @@ void FILE_OT_highlight(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active;
}
-int file_cancel_exec(bContext *C, wmOperator *unused)
+int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
-
- folderlist_free(sfile->folders_prev);
- folderlist_free(sfile->folders_next);
-
- WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_CANCEL);
- sfile->op = NULL;
+ wmOperator *op = sfile->op;
- if (sfile->files) {
- ED_fileselect_clear(C, sfile);
- MEM_freeN(sfile->files);
- sfile->files= NULL;
- }
+ sfile->op = NULL;
+
+ WM_event_fileselect_event(C, op, EVT_FILESELECT_CANCEL);
return OPERATOR_FINISHED;
}
-int file_operator_poll(bContext *C)
+static int file_operator_poll(bContext *C)
{
int poll = ED_operator_file_active(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -541,6 +538,118 @@ void FILE_OT_cancel(struct wmOperatorType *ot)
ot->poll= file_operator_poll;
}
+
+void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath)
+{
+ BLI_join_dirfile(filepath, FILE_MAX, sfile->params->dir, sfile->params->file); /* XXX, not real length */
+ if(RNA_struct_find_property(op->ptr, "relative_path")) {
+ if(RNA_boolean_get(op->ptr, "relative_path")) {
+ BLI_path_rel(filepath, G.main->name);
+ }
+ }
+
+ if(RNA_struct_find_property(op->ptr, "filename")) {
+ RNA_string_set(op->ptr, "filename", sfile->params->file);
+ }
+ if(RNA_struct_find_property(op->ptr, "directory")) {
+ RNA_string_set(op->ptr, "directory", sfile->params->dir);
+ }
+ if(RNA_struct_find_property(op->ptr, "filepath")) {
+ RNA_string_set(op->ptr, "filepath", filepath);
+ }
+
+ /* some ops have multiple files to select */
+ {
+ PointerRNA itemptr;
+ int i, numfiles = filelist_numfiles(sfile->files);
+ struct direntry *file;
+ if(RNA_struct_find_property(op->ptr, "files")) {
+ for (i=0; i<numfiles; i++) {
+ file = filelist_file(sfile->files, i);
+ if(file->flags & ACTIVEFILE) {
+ if ((file->type & S_IFDIR)==0) {
+ RNA_collection_add(op->ptr, "files", &itemptr);
+ RNA_string_set(&itemptr, "name", file->relname);
+ }
+ }
+ }
+ }
+
+ if(RNA_struct_find_property(op->ptr, "dirs")) {
+ for (i=0; i<numfiles; i++) {
+ file = filelist_file(sfile->files, i);
+ if(file->flags & ACTIVEFILE) {
+ if ((file->type & S_IFDIR)) {
+ RNA_collection_add(op->ptr, "dirs", &itemptr);
+ RNA_string_set(&itemptr, "name", file->relname);
+ }
+ }
+ }
+ }
+ }
+}
+
+void file_operator_to_sfile(SpaceFile *sfile, wmOperator *op)
+{
+ int change= FALSE;
+ if(RNA_struct_find_property(op->ptr, "filename")) {
+ RNA_string_get(op->ptr, "filename", sfile->params->file);
+ change= TRUE;
+ }
+ if(RNA_struct_find_property(op->ptr, "directory")) {
+ RNA_string_get(op->ptr, "directory", sfile->params->dir);
+ change= TRUE;
+ }
+
+ /* If neither of the above are set, split the filepath back */
+ if(RNA_struct_find_property(op->ptr, "filepath")) {
+ if(change==FALSE) {
+ char filepath[FILE_MAX];
+ RNA_string_get(op->ptr, "filepath", filepath);
+ BLI_split_dirfile(filepath, sfile->params->dir, sfile->params->file);
+ }
+ }
+
+ /* XXX, files and dirs updates missing, not really so important though */
+}
+
+void file_draw_check_cb(bContext *C, void *UNUSED(arg1), void *UNUSED(arg2))
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ wmOperator *op= sfile->op;
+ if(op) { /* fail on reload */
+ if(op->type->check) {
+ char filepath[FILE_MAX];
+ file_sfile_to_operator(op, sfile, filepath);
+
+ /* redraw */
+ if(op->type->check(C, op)) {
+ file_operator_to_sfile(sfile, op);
+
+ /* redraw, else the changed settings wont get updated */
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
+ }
+ }
+}
+
+int file_draw_check_exists(SpaceFile *sfile)
+{
+ if(sfile->op) { /* fails on reload */
+ if(RNA_struct_find_property(sfile->op->ptr, "check_existing")) {
+ if(RNA_boolean_get(sfile->op->ptr, "check_existing")) {
+ char filepath[FILE_MAX];
+ BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file);
+ if(BLI_exists(filepath) && !BLI_is_dir(filepath)) {
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ return FALSE;
+}
+
/* sends events now, so things get handled on windowqueue level */
int file_exec(bContext *C, wmOperator *exec_op)
{
@@ -568,64 +677,13 @@ int file_exec(bContext *C, wmOperator *exec_op)
sfile->op = NULL;
- BLI_join_dirfile(filepath, sfile->params->dir, sfile->params->file);
- if(RNA_struct_find_property(op->ptr, "relative_path")) {
- if(RNA_boolean_get(op->ptr, "relative_path")) {
- BLI_path_rel(filepath, G.sce);
- }
- }
-
- if(RNA_struct_find_property(op->ptr, "filename")) {
- RNA_string_set(op->ptr, "filename", sfile->params->file);
- }
- if(RNA_struct_find_property(op->ptr, "directory")) {
- RNA_string_set(op->ptr, "directory", sfile->params->dir);
- }
- if(RNA_struct_find_property(op->ptr, "filepath")) {
- RNA_string_set(op->ptr, "filepath", filepath);
- }
-
- /* some ops have multiple files to select */
- {
- PointerRNA itemptr;
- int i, numfiles = filelist_numfiles(sfile->files);
- struct direntry *file;
- if(RNA_struct_find_property(op->ptr, "files")) {
- for (i=0; i<numfiles; i++) {
- file = filelist_file(sfile->files, i);
- if(file->flags & ACTIVEFILE) {
- if ((file->type & S_IFDIR)==0) {
- RNA_collection_add(op->ptr, "files", &itemptr);
- RNA_string_set(&itemptr, "name", file->relname);
- }
- }
- }
- }
-
- if(RNA_struct_find_property(op->ptr, "dirs")) {
- for (i=0; i<numfiles; i++) {
- file = filelist_file(sfile->files, i);
- if(file->flags & ACTIVEFILE) {
- if ((file->type & S_IFDIR)) {
- RNA_collection_add(op->ptr, "dirs", &itemptr);
- RNA_string_set(&itemptr, "name", file->relname);
- }
- }
- }
- }
- }
-
- folderlist_free(sfile->folders_prev);
- folderlist_free(sfile->folders_next);
+ file_sfile_to_operator(op, sfile, filepath);
fsmenu_insert_entry(fsmenu_get(), FS_CATEGORY_RECENT, sfile->params->dir,0, 1);
- BLI_make_file_string(G.sce, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
+ BLI_make_file_string(G.main->name, filepath, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_BOOKMARK_FILE);
fsmenu_write_file(fsmenu_get(), filepath);
WM_event_fileselect_event(C, op, EVT_FILESELECT_EXEC);
- ED_fileselect_clear(C, sfile);
- MEM_freeN(sfile->files);
- sfile->files= NULL;
}
return OPERATOR_FINISHED;
@@ -646,14 +704,14 @@ void FILE_OT_execute(struct wmOperatorType *ot)
}
-int file_parent_exec(bContext *C, wmOperator *unused)
+int file_parent_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
if (BLI_has_parent(sfile->params->dir)) {
BLI_parent_dir(sfile->params->dir);
- BLI_cleanup_dir(G.sce, sfile->params->dir);
+ BLI_cleanup_dir(G.main->name, sfile->params->dir);
file_change_dir(C, 0);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
}
@@ -677,7 +735,7 @@ void FILE_OT_parent(struct wmOperatorType *ot)
}
-int file_refresh_exec(bContext *C, wmOperator *unused)
+static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -701,7 +759,7 @@ void FILE_OT_previous(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_previous_exec(bContext *C, wmOperator *unused)
+int file_previous_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -732,7 +790,7 @@ void FILE_OT_next(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_next_exec(bContext *C, wmOperator *unused)
+int file_next_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
@@ -754,7 +812,7 @@ int file_next_exec(bContext *C, wmOperator *unused)
/* only meant for timer usage */
-static int file_smoothscroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ScrArea *sa = CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -871,13 +929,13 @@ static int new_folder_path(const char* parent, char *folder, char *name)
int len = 0;
BLI_strncpy(name, "New Folder", FILE_MAXFILE);
- BLI_join_dirfile(folder, parent, name);
+ BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
/* check whether folder with the name already exists, in this case
add number to the name. Check length of generated name to avoid
crazy case of huge number of folders each named 'New Folder (x)' */
while (BLI_exists(folder) && (len<FILE_MAXFILE)) {
len = BLI_snprintf(name, FILE_MAXFILE, "New Folder(%d)", i);
- BLI_join_dirfile(folder, parent, name);
+ BLI_join_dirfile(folder, FILE_MAX, parent, name); /* XXX, not real length */
i++;
}
@@ -888,6 +946,8 @@ int file_directory_new_exec(bContext *C, wmOperator *op)
{
char name[FILE_MAXFILE];
char path[FILE_MAX];
+ int generate_name= 1;
+
SpaceFile *sfile= CTX_wm_space_file(C);
if(!sfile->params) {
@@ -895,13 +955,22 @@ int file_directory_new_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- /* create a new, non-existing folder name */
- if (!new_folder_path(sfile->params->dir, path, name)) {
- BKE_report(op->reports,RPT_ERROR, "Couldn't create new folder name.");
- return OPERATOR_CANCELLED;
+ path[0] = '\0';
+
+ if(RNA_struct_find_property(op->ptr, "directory")) {
+ RNA_string_get(op->ptr, "directory", path);
+ if (path[0] != '\0') generate_name= 0;
}
-
- /* rename the file */
+
+ if (generate_name) {
+ /* create a new, non-existing folder name */
+ if (!new_folder_path(sfile->params->dir, path, name)) {
+ BKE_report(op->reports,RPT_ERROR, "Couldn't create new folder name.");
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ /* create the file */
BLI_recurdir_fileops(path);
if (!BLI_exists(path)) {
@@ -935,24 +1004,68 @@ void FILE_OT_directory_new(struct wmOperatorType *ot)
ot->invoke= WM_operator_confirm;
ot->exec= file_directory_new_exec;
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+
+ RNA_def_string_dir_path(ot->srna, "directory", "", FILE_MAX, "Directory", "Name of new directory");
+
}
-int file_directory_exec(bContext *C, wmOperator *unused)
+
+static void file_expand_directory(bContext *C)
{
SpaceFile *sfile= CTX_wm_space_file(C);
if(sfile->params) {
if ( sfile->params->dir[0] == '~' ) {
char tmpstr[sizeof(sfile->params->dir)-1];
- strncpy(tmpstr, sfile->params->dir+1, sizeof(tmpstr));
- BLI_join_dirfile(sfile->params->dir, BLI_getDefaultDocumentFolder(), tmpstr);
+ BLI_strncpy(tmpstr, sfile->params->dir+1, sizeof(tmpstr));
+ BLI_join_dirfile(sfile->params->dir, sizeof(sfile->params->dir), BLI_getDefaultDocumentFolder(), tmpstr);
}
#ifdef WIN32
if (sfile->params->dir[0] == '\0')
get_default_root(sfile->params->dir);
#endif
- BLI_cleanup_dir(G.sce, sfile->params->dir);
+ }
+}
+
+static int file_directory_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ file_expand_directory(C);
+
+ if (!BLI_exists(sfile->params->dir)) {
+ return WM_operator_confirm_message(C, op, "Create new directory?");
+ }
+
+ return file_directory_exec(C, op);
+ }
+
+ return OPERATOR_CANCELLED;
+}
+
+
+
+int file_directory_exec(bContext *C, wmOperator *UNUSED(unused))
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+
+ if(sfile->params) {
+ file_expand_directory(C);
+
+ if (!BLI_exists(sfile->params->dir)) {
+ BLI_recurdir_fileops(sfile->params->dir);
+ }
+
+ /* special case, user may have pasted a fulepath into the directory */
+ if(BLI_exists(sfile->params->dir) && BLI_is_dir(sfile->params->dir) == 0) {
+ char path[sizeof(sfile->params->dir)];
+ BLI_strncpy(path, sfile->params->dir, sizeof(path));
+ BLI_split_dirfile(path, sfile->params->dir, sfile->params->file);
+ }
+
+ BLI_cleanup_dir(G.main->name, sfile->params->dir);
BLI_add_slash(sfile->params->dir);
file_change_dir(C, 1);
@@ -963,7 +1076,7 @@ int file_directory_exec(bContext *C, wmOperator *unused)
return OPERATOR_FINISHED;
}
-int file_filename_exec(bContext *C, wmOperator *unused)
+int file_filename_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -978,6 +1091,18 @@ int file_filename_exec(bContext *C, wmOperator *unused)
return OPERATOR_FINISHED;
}
+void FILE_OT_directory(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Enter Directory Name";
+ ot->description= "Enter a directory name";
+ ot->idname= "FILE_OT_directory";
+
+ /* api callbacks */
+ ot->invoke= file_directory_invoke;
+ ot->exec= file_directory_exec;
+ ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
+}
void FILE_OT_refresh(struct wmOperatorType *ot)
{
@@ -991,7 +1116,7 @@ void FILE_OT_refresh(struct wmOperatorType *ot)
ot->poll= ED_operator_file_active; /* <- important, handler is on window level */
}
-int file_hidedot_exec(bContext *C, wmOperator *unused)
+static int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1044,7 +1169,7 @@ struct ARegion *file_buttons_region(struct ScrArea *sa)
return arnew;
}
-int file_bookmark_toggle_exec(bContext *C, wmOperator *unused)
+static int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= file_buttons_region(sa);
@@ -1068,7 +1193,7 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot)
}
-int file_filenum_exec(bContext *C, wmOperator *op)
+static int file_filenum_exec(bContext *C, wmOperator *op)
{
SpaceFile *sfile= CTX_wm_space_file(C);
ScrArea *sa= CTX_wm_area(C);
@@ -1077,6 +1202,7 @@ int file_filenum_exec(bContext *C, wmOperator *op)
if(sfile->params && (inc != 0)) {
BLI_newname(sfile->params->file, inc);
ED_area_tag_redraw(sa);
+ file_draw_check_cb(C, NULL, NULL);
// WM_event_add_notifier(C, NC_WINDOW, NULL);
}
@@ -1099,7 +1225,7 @@ void FILE_OT_filenum(struct wmOperatorType *ot)
RNA_def_int(ot->srna, "increment", 1, 0, 100, "Increment", "", 0,100);
}
-int file_rename_exec(bContext *C, wmOperator *op)
+static int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
@@ -1110,6 +1236,8 @@ int file_rename_exec(bContext *C, wmOperator *op)
if ( (0<=idx) && (idx<numfiles) ) {
struct direntry *file= filelist_file(sfile->files, idx);
file->flags |= EDITING;
+ BLI_strncpy(sfile->params->renameedit, file->relname, FILE_MAXFILE);
+ sfile->params->renamefile[0]= '\0';
}
ED_area_tag_redraw(sa);
}
@@ -1118,7 +1246,7 @@ int file_rename_exec(bContext *C, wmOperator *op)
}
-int file_rename_poll(bContext *C)
+static int file_rename_poll(bContext *C)
{
int poll = ED_operator_file_active(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1149,7 +1277,7 @@ void FILE_OT_rename(struct wmOperatorType *ot)
}
-int file_delete_poll(bContext *C)
+static int file_delete_poll(bContext *C)
{
int poll = ED_operator_file_active(C);
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1171,7 +1299,7 @@ int file_delete_poll(bContext *C)
return poll;
}
-int file_delete_exec(bContext *C, wmOperator *op)
+int file_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
char str[FILE_MAX];
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -1179,7 +1307,7 @@ int file_delete_exec(bContext *C, wmOperator *op)
file = filelist_file(sfile->files, sfile->params->active_file);
- BLI_make_file_string(G.sce, str, sfile->params->dir, file->relname);
+ BLI_make_file_string(G.main->name, str, sfile->params->dir, file->relname);
BLI_delete(str, 0, 0);
ED_fileselect_clear(C, sfile);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c
index 4a505bc022f..37abc854937 100644
--- a/source/blender/editors/space_file/file_panels.c
+++ b/source/blender/editors/space_file/file_panels.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,9 +30,11 @@
#include "BKE_screen.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
#include "MEM_guardedalloc.h"
@@ -49,7 +51,7 @@
#include <string.h>
-static void file_panel_cb(bContext *C, void *arg_entry, void *arg_unused)
+static void file_panel_cb(bContext *C, void *arg_entry, void *UNUSED(arg_v))
{
PointerRNA ptr;
char *entry= (char*)arg_entry;
@@ -67,7 +69,6 @@ static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory cat
uiBut *but;
uiLayout *box, *col;
struct FSMenu* fsmenu = fsmenu_get();
- char *curdir= (sfile->params)? sfile->params->dir: "";
int i, i_iter, nentries = fsmenu_get_nentries(fsmenu, category);
/* reset each time */
@@ -94,8 +95,11 @@ static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory cat
entry = fsmenu_get_entry(fsmenu, category, i);
/* set this list item as active if we have a match */
- if(strcmp(curdir, entry) == 0)
- *nr= i;
+ if(sfile->params) {
+ if(strcmp(sfile->params->dir, entry) == 0) {
+ *nr= i;
+ }
+ }
/* create nice bookmark name, shows last directory in the full path currently */
BLI_strncpy(temp, entry, FILE_MAX);
@@ -136,7 +140,7 @@ static void file_panel_bookmarks(const bContext *C, Panel *pa)
if(sfile) {
row= uiLayoutRow(pa->layout, 0);
uiItemO(row, "Add", ICON_ZOOMIN, "file.bookmark_add");
- uiItemL(row, NULL, 0);
+ uiItemL(row, NULL, ICON_NULL);
file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1, 0);
}
@@ -146,12 +150,15 @@ static void file_panel_recent(const bContext *C, Panel *pa)
{
SpaceFile *sfile= CTX_wm_space_file(C);
- if(sfile)
- file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0, 1);
+ if(sfile) {
+ if ( !(U.uiflag & USER_HIDE_RECENT) ) {
+ file_panel_category(C, pa, FS_CATEGORY_RECENT, &sfile->recentnr, ICON_FILE_FOLDER, 0, 1);
+ }
+ }
}
-static int file_panel_operator_poll(const bContext *C, PanelType *pt)
+static int file_panel_operator_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceFile *sfile= CTX_wm_space_file(C);
return (sfile && sfile->op);
@@ -165,38 +172,26 @@ static void file_panel_operator_header(const bContext *C, Panel *pa)
BLI_strncpy(pa->drawname, op->type->name, sizeof(pa->drawname));
}
+static int file_panel_check_prop(PropertyRNA *prop)
+{
+ const char *prop_id= RNA_property_identifier(prop);
+ return !( strcmp(prop_id, "filepath") == 0 ||
+ strcmp(prop_id, "directory") == 0 ||
+ strcmp(prop_id, "filename") == 0
+ );
+}
+
static void file_panel_operator(const bContext *C, Panel *pa)
{
SpaceFile *sfile= CTX_wm_space_file(C);
wmOperator *op= sfile->op;
- int empty= 1, flag;
+ // int empty= 1, flag;
+
+ uiBlockSetFunc(uiLayoutGetBlock(pa->layout), file_draw_check_cb, NULL, NULL);
- if(op->type->ui) {
- op->layout= pa->layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else {
- RNA_STRUCT_BEGIN(op->ptr, prop) {
- flag= RNA_property_flag(prop);
-
- if(flag & PROP_HIDDEN)
- continue;
- if(strcmp(RNA_property_identifier(prop), "filepath") == 0)
- continue;
- if(strcmp(RNA_property_identifier(prop), "directory") == 0)
- continue;
- if(strcmp(RNA_property_identifier(prop), "filename") == 0)
- continue;
-
- uiItemFullR(pa->layout, op->ptr, prop, -1, 0, 0, NULL, 0);
- empty= 0;
- }
- RNA_STRUCT_END;
+ uiLayoutOperatorButs(C, pa->layout, op, file_panel_check_prop, '\0', UI_LAYOUT_OP_SHOW_EMPTY);
- if(empty)
- uiItemL(pa->layout, "No properties.", 0);
- }
+ uiBlockSetFunc(uiLayoutGetBlock(pa->layout), NULL, NULL, NULL);
}
void file_panels_register(ARegionType *art)
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index c3bea2a5bea..41667a96ab6 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,7 +27,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
/* global includes */
#include <stdlib.h>
@@ -46,6 +45,7 @@
#include "BLI_linklist.h"
#include "BLI_storage_types.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#ifdef WIN32
#include "BLI_winstuff.h"
@@ -61,6 +61,7 @@
#include "DNA_space_types.h"
+#include "ED_fileselect.h"
#include "ED_datafiles.h"
#include "IMB_imbuf.h"
@@ -69,10 +70,11 @@
#include "PIL_time.h"
-
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_resources.h"
+
#include "filelist.h"
/* max length of library group name within filesel */
@@ -108,6 +110,7 @@ typedef struct FileList
short prv_h;
short hide_dot;
unsigned int filter;
+ char filter_glob[64];
short changed;
struct BlendHandle *libfiledata;
@@ -237,8 +240,8 @@ static int compare_size(const void *a1, const void *a2)
static int compare_extension(const void *a1, const void *a2) {
const struct direntry *entry1=a1, *entry2=a2;
- char *sufix1, *sufix2;
- char *nil="";
+ const char *sufix1, *sufix2;
+ const char *nil="";
if (!(sufix1= strstr (entry1->relname, ".blend.gz")))
sufix1= strrchr (entry1->relname, '.');
@@ -294,7 +297,7 @@ static int is_hidden_file(const char* filename, short hide_dot)
return is_hidden;
}
-static int is_filtered_file(struct direntry* file, const char* dir, unsigned int filter, short hide_dot)
+static int is_filtered_file(struct direntry* file, const char* UNUSED(dir), unsigned int filter, short hide_dot)
{
int is_filtered=0;
if (filter) {
@@ -323,7 +326,7 @@ static int is_filtered_lib(struct direntry* file, const char* dir, unsigned int
return is_filtered;
}
-static int is_filtered_main(struct direntry* file, const char* dir, unsigned int filter, short hide_dot)
+static int is_filtered_main(struct direntry* file, const char* UNUSED(dir), unsigned int UNUSED(filter), short hide_dot)
{
return !is_hidden_file(file->relname, hide_dot);
}
@@ -359,7 +362,7 @@ void filelist_filter(FileList* filelist)
}
}
-void filelist_init_icons()
+void filelist_init_icons(void)
{
short x, y, k;
ImBuf *bbuf;
@@ -370,7 +373,7 @@ void filelist_init_icons()
for (x=0; x<SPECIAL_IMG_COLS; x++) {
int tile = SPECIAL_IMG_COLS*y + x;
if (tile < SPECIAL_IMG_MAX) {
- ibuf = IMB_allocImBuf(SPECIAL_IMG_SIZE, SPECIAL_IMG_SIZE, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf(SPECIAL_IMG_SIZE, SPECIAL_IMG_SIZE, 32, IB_rect);
for (k=0; k<SPECIAL_IMG_SIZE; k++) {
memcpy(&ibuf->rect[k*SPECIAL_IMG_SIZE], &bbuf->rect[(k+y*SPECIAL_IMG_SIZE)*SPECIAL_IMG_SIZE*SPECIAL_IMG_COLS+x*SPECIAL_IMG_SIZE], SPECIAL_IMG_SIZE*sizeof(int));
}
@@ -382,7 +385,7 @@ void filelist_init_icons()
}
}
-void filelist_free_icons()
+void filelist_free_icons(void)
{
int i;
for (i=0; i < SPECIAL_IMG_MAX; ++i) {
@@ -392,7 +395,7 @@ void filelist_free_icons()
}
//-----------------FOLDERLIST (previous/next) --------------//
-struct ListBase* folderlist_new()
+struct ListBase* folderlist_new(void)
{
ListBase* p = MEM_callocN( sizeof(ListBase), "folderlist" );
return p;
@@ -547,6 +550,7 @@ void filelist_free(struct FileList* filelist)
free(filelist->filelist);
filelist->filelist = 0;
filelist->filter = 0;
+ filelist->filter_glob[0] = '\0';
filelist->numfiltered =0;
filelist->hide_dot =0;
}
@@ -589,7 +593,7 @@ short filelist_changed(struct FileList* filelist)
return filelist->changed;
}
-struct ImBuf * filelist_loadimage(struct FileList* filelist, int index)
+static struct ImBuf * filelist_loadimage(struct FileList* filelist, int index)
{
ImBuf *imb = NULL;
int fidx = 0;
@@ -713,21 +717,135 @@ void filelist_setfilter(struct FileList* filelist, unsigned int filter)
filelist->filter = filter;
}
+void filelist_setfilter_types(struct FileList* filelist, const char *filter_glob)
+{
+ BLI_strncpy(filelist->filter_glob, filter_glob, sizeof(filelist->filter_glob));
+}
+
+static int file_is_blend_backup(const char *str)
+{
+ short a, b;
+ int retval= 0;
+
+ a= strlen(str);
+ b= 7;
+
+ if(a==0 || b>=a);
+ else {
+ char *loc;
+
+ if(a > b+1)
+ b++;
+
+ /* allow .blend1 .blend2 .blend32 */
+ loc= BLI_strcasestr(str+a-b, ".blend");
+
+ if(loc)
+ retval= 1;
+ }
+
+ return (retval);
+}
+
+
+static int file_extension_type(char *relname)
+{
+ if(BLO_has_bfile_extension(relname)) {
+ return BLENDERFILE;
+ } else if(file_is_blend_backup(relname)) {
+ return BLENDERFILE_BACKUP;
+ } else if(BLI_testextensie(relname, ".py")) {
+ return PYSCRIPTFILE;
+ } else if(BLI_testextensie(relname, ".txt")
+ || BLI_testextensie(relname, ".glsl")
+ || BLI_testextensie(relname, ".data")) {
+ return TEXTFILE;
+ } else if( BLI_testextensie(relname, ".ttf")
+ || BLI_testextensie(relname, ".ttc")
+ || BLI_testextensie(relname, ".pfb")
+ || BLI_testextensie(relname, ".otf")
+ || BLI_testextensie(relname, ".otc")) {
+ return FTFONTFILE;
+ } else if(BLI_testextensie(relname, ".btx")) {
+ return BTXFILE;
+ } else if(BLI_testextensie(relname, ".dae")) {
+ return COLLADAFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_image)
+ || (G.have_quicktime && BLI_testextensie_array(relname, imb_ext_image_qt))) {
+ return IMAGEFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_movie)) {
+ return MOVIEFILE;
+ } else if(BLI_testextensie_array(relname, imb_ext_audio)) {
+ return SOUNDFILE;
+ }
+ return 0;
+}
+
+int ED_file_extension_icon(char *relname)
+{
+ int type= file_extension_type(relname);
+
+ if (type == BLENDERFILE || type==BLENDERFILE_BACKUP)
+ return ICON_FILE_BLEND;
+ else if (type == IMAGEFILE)
+ return ICON_FILE_IMAGE;
+ else if (type == MOVIEFILE)
+ return ICON_FILE_MOVIE;
+ else if (type == PYSCRIPTFILE)
+ return ICON_FILE_SCRIPT;
+ else if (type == PYSCRIPTFILE)
+ return ICON_FILE_SCRIPT;
+ else if (type == SOUNDFILE)
+ return ICON_FILE_SOUND;
+ else if (type == FTFONTFILE)
+ return ICON_FILE_FONT;
+ else if (type == BTXFILE)
+ return ICON_FILE_BLANK;
+ else if (type == COLLADAFILE)
+ return ICON_FILE_BLANK;
+
+ return ICON_FILE_BLANK;
+}
+
+static void filelist_setfiletypes(struct FileList* filelist)
+{
+ struct direntry *file;
+ int num;
+
+ file= filelist->filelist;
+
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ file->type= file->s.st_mode; /* restore the mess below */
+
+ /* Don't check extensions for directories */
+ if (file->type & S_IFDIR) {
+ continue;
+ }
+ file->flags = file_extension_type(file->relname);
+
+ if(filelist->filter_glob
+ && BLI_testextensie_glob(file->relname, filelist->filter_glob)) {
+ file->flags= OPERATORFILE;
+ }
+
+ }
+}
+
static void filelist_read_dir(struct FileList* filelist)
{
- char wdir[FILE_MAX];
+ char wdir[FILE_MAX]= "";
if (!filelist) return;
filelist->fidx = 0;
filelist->filelist = 0;
- BLI_getwdN(wdir);
+ BLI_getwdN(wdir, sizeof(wdir)); /* backup cwd to restore after */
- BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_cleanup_dir(G.main->name, filelist->dir);
filelist->numfiles = BLI_getdir(filelist->dir, &(filelist->filelist));
if(!chdir(wdir)) {} /* fix warning about not checking return value */
- filelist_setfiletypes(filelist, G.have_quicktime);
+ filelist_setfiletypes(filelist);
filelist_filter(filelist);
}
@@ -740,7 +858,7 @@ static void filelist_read_main(struct FileList* filelist)
static void filelist_read_library(struct FileList* filelist)
{
if (!filelist) return;
- BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_cleanup_dir(G.main->name, filelist->dir);
filelist_from_library(filelist);
if(!filelist->libfiledata) {
int num;
@@ -783,50 +901,6 @@ void filelist_parent(struct FileList* filelist)
filelist_readdir(filelist);
}
-void filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
-{
- struct direntry *file;
- int num;
-
- file= filelist->filelist;
-
- for(num=0; num<filelist->numfiles; num++, file++) {
- file->flags= 0;
- file->type= file->s.st_mode; /* restore the mess below */
-
- /* Don't check extensions for directories */
- if (file->type & S_IFDIR) {
- continue;
- }
-
- if(BLO_has_bfile_extension(file->relname)) {
- file->flags |= BLENDERFILE;
- } else if(BLI_testextensie(file->relname, ".py")) {
- file->flags |= PYSCRIPTFILE;
- } else if(BLI_testextensie(file->relname, ".txt")
- || BLI_testextensie(file->relname, ".glsl")
- || BLI_testextensie(file->relname, ".data")) {
- file->flags |= TEXTFILE;
- } else if( BLI_testextensie(file->relname, ".ttf")
- || BLI_testextensie(file->relname, ".ttc")
- || BLI_testextensie(file->relname, ".pfb")
- || BLI_testextensie(file->relname, ".otf")
- || BLI_testextensie(file->relname, ".otc")) {
- file->flags |= FTFONTFILE;
- } else if(BLI_testextensie(file->relname, ".btx")) {
- file->flags |= BTXFILE;
- } else if(BLI_testextensie(file->relname, ".dae")) {
- file->flags |= COLLADAFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_image)
- || (has_quicktime && BLI_testextensie_array(file->relname, imb_ext_image_qt))) {
- file->flags |= IMAGEFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_movie)) {
- file->flags |= MOVIEFILE;
- } else if(BLI_testextensie_array(file->relname, imb_ext_audio)) {
- file->flags |= SOUNDFILE;
- }
- }
-}
void filelist_swapselect(struct FileList* filelist)
{
@@ -877,7 +951,7 @@ static int groupname_to_code(char *group)
char buf[32];
char *lslash;
- BLI_strncpy(buf, group, 31);
+ BLI_strncpy(buf, group, sizeof(buf));
lslash= BLI_last_slash(buf);
if (lslash)
lslash[0]= '\0';
@@ -902,7 +976,7 @@ void filelist_from_library(struct FileList* filelist)
return;
}
- BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
+ BLI_strncpy(filename, G.main->name, sizeof(filename));
/* there we go */
/* for the time being only read filedata when libfiledata==0 */
@@ -955,7 +1029,7 @@ void filelist_from_library(struct FileList* filelist)
/* first allocate imbuf for copying preview into it */
if (w > 0 && h > 0 && rect) {
- ima = IMB_allocImBuf(w, h, 32, IB_rect, 0);
+ ima = IMB_allocImBuf(w, h, 32, IB_rect);
memcpy(ima->rect, rect, w*h*sizeof(unsigned int));
filelist->filelist[i + 1].image = ima;
filelist->filelist[i + 1].flags = IMAGEFILE;
@@ -969,7 +1043,7 @@ void filelist_from_library(struct FileList* filelist)
filelist_sort(filelist, FILE_SORT_ALPHA);
- BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
+ BLI_strncpy(G.main->name, filename, sizeof(filename)); // prevent G.main->name to change
filelist->filter = 0;
filelist_filter(filelist);
@@ -1126,16 +1200,15 @@ static void thumbnail_joblist_free(ThumbnailJob *tj)
FileImage* limg = tj->loadimages.first;
/* free the images not yet copied to the filelist -> these will get freed with the filelist */
- while (limg != tj->loadimages.last) {
+ for( ; limg; limg= limg->next) {
if ((limg->img) && (!limg->done)) {
IMB_freeImBuf(limg->img);
}
- limg = limg->next;
}
BLI_freelistN(&tj->loadimages);
}
-static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *progress)
+static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float *UNUSED(progress))
{
ThumbnailJob *tj= tjv;
FileImage* limg = tj->loadimages.first;
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index b2a86b9c764..ff7e6869ee3 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,8 +47,8 @@ struct rcti;
struct ReportList;
struct FileList * filelist_new(short type);
-void filelist_init_icons();
-void filelist_free_icons();
+void filelist_init_icons(void);
+void filelist_free_icons(void);
int filelist_find(struct FileList* filelist, char *file);
void filelist_free(struct FileList* filelist);
void filelist_sort(struct FileList* filelist, short sort);
@@ -58,6 +58,7 @@ void filelist_setdir(struct FileList* filelist, const char *dir);
struct direntry * filelist_file(struct FileList* filelist, int index);
void filelist_hidedot(struct FileList* filelist, short hide);
void filelist_setfilter(struct FileList* filelist, unsigned int filter);
+void filelist_setfilter_types(struct FileList* filelist, const char *filter_glob);
void filelist_filter(struct FileList* filelist);
void filelist_swapselect(struct FileList* filelist);
void filelist_imgsize(struct FileList* filelist, short w, short h);
@@ -68,16 +69,15 @@ void filelist_readdir(struct FileList* filelist);
int filelist_empty(struct FileList* filelist);
void filelist_parent(struct FileList* filelist);
-void filelist_setfiletypes(struct FileList* filelist, short has_quicktime);
-
+struct BlendHandle *filelist_lib(struct FileList* filelist);
int filelist_islibrary (struct FileList* filelist, char* dir, char* group);
void filelist_from_main(struct FileList* filelist);
void filelist_from_library(struct FileList* filelist);
void filelist_freelib(struct FileList* filelist);
void filelist_hideparent(struct FileList* filelist, short hide);
-struct ListBase * folderlist_new();
+struct ListBase * folderlist_new(void);
void folderlist_free(struct ListBase* folderlist);
struct ListBase * folderlist_duplicate(ListBase* folderlist);
void folderlist_popdir(struct ListBase* folderlist, char *dir);
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 52d59270663..c481c5afffc 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -59,11 +59,14 @@
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
+#include "BLI_path_util.h"
#include "BLI_storage_types.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BLF_api.h"
@@ -77,6 +80,7 @@
#include "RNA_access.h"
#include "UI_interface.h"
+#include "UI_interface_icons.h"
#include "file_intern.h"
#include "filelist.h"
@@ -104,7 +108,8 @@ short ED_fileselect_set_params(SpaceFile *sfile)
if (!sfile->params) {
sfile->params= MEM_callocN(sizeof(FileSelectParams), "fileselparams");
/* set path to most recently opened .blend */
- BLI_split_dirfile(G.sce, sfile->params->dir, sfile->params->file);
+ BLI_split_dirfile(G.main->name, sfile->params->dir, sfile->params->file);
+ sfile->params->filter_glob[0] = '\0';
}
params = sfile->params;
@@ -141,8 +146,8 @@ short ED_fileselect_set_params(SpaceFile *sfile)
}
if(params->dir[0]) {
- BLI_cleanup_dir(G.sce, params->dir);
- BLI_path_abs(params->dir, G.sce);
+ BLI_cleanup_dir(G.main->name, params->dir);
+ BLI_path_abs(params->dir, G.main->name);
}
params->filter = 0;
@@ -168,6 +173,14 @@ short ED_fileselect_set_params(SpaceFile *sfile)
params->filter |= RNA_boolean_get(op->ptr, "filter_btx") ? BTXFILE : 0;
if(RNA_struct_find_property(op->ptr, "filter_collada"))
params->filter |= RNA_boolean_get(op->ptr, "filter_collada") ? COLLADAFILE : 0;
+ if (RNA_struct_find_property(op->ptr, "filter_glob")) {
+ RNA_string_get(op->ptr, "filter_glob", params->filter_glob);
+ params->filter |= (OPERATORFILE|FOLDERFILE);
+ }
+ else {
+ params->filter_glob[0] = '\0';
+ }
+
if (params->filter != 0) {
if (U.uiflag & USER_FILTERFILEEXTS) {
params->flag |= FILE_FILTER;
@@ -188,18 +201,23 @@ short ED_fileselect_set_params(SpaceFile *sfile)
params->flag |= RNA_boolean_get(op->ptr, "autoselect") ? FILE_AUTOSELECT : 0;
params->flag |= RNA_boolean_get(op->ptr, "active_layer") ? FILE_ACTIVELAY : 0;
}
-
- if(params->filter & (IMAGEFILE|MOVIEFILE))
- params->display= FILE_IMGDISPLAY;
- else
- params->display= FILE_SHORTDISPLAY;
+ if (U.uiflag & USER_SHOW_THUMBNAILS) {
+ if(params->filter & (IMAGEFILE|MOVIEFILE))
+ params->display= FILE_IMGDISPLAY;
+ else
+ params->display= FILE_SHORTDISPLAY;
+ } else {
+ params->display= FILE_SHORTDISPLAY;
+ }
+
} else {
/* default values, if no operator */
params->type = FILE_UNIX;
params->flag |= FILE_HIDE_DOT;
params->display = FILE_SHORTDISPLAY;
params->filter = 0;
+ params->filter_glob[0] = '\0';
params->sort = FILE_SORT_ALPHA;
}
@@ -271,21 +289,78 @@ void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, int *x, int *y)
}
}
+/* Shorten a string to a given width w.
+ If front is set, shorten from the front,
+ otherwise shorten from the end. */
+float file_shorten_string(char* string, float w, int front)
+{
+ char temp[FILE_MAX];
+ short shortened = 0;
+ float sw = 0;
+ float pad = 0;
+
+ if (w <= 0) {
+ *string = '\0';
+ return 0.0;
+ }
+
+ sw = file_string_width(string);
+ if (front == 1) {
+ char *s = string;
+ BLI_strncpy(temp, "...", 4);
+ pad = file_string_width(temp);
+ while ((*s) && (sw+pad>w)) {
+ s++;
+ sw = file_string_width(s);
+ shortened = 1;
+ }
+ if (shortened) {
+ int slen = strlen(s);
+ BLI_strncpy(temp+3, s, slen+1);
+ temp[slen+4] = '\0';
+ BLI_strncpy(string, temp, slen+4);
+ }
+ } else {
+ char *s = string;
+ while (sw>w) {
+ int slen = strlen(string);
+ string[slen-1] = '\0';
+ sw = file_string_width(s);
+ shortened = 1;
+ }
+
+ if (shortened) {
+ int slen = strlen(string);
+ if (slen > 3) {
+ BLI_strncpy(string+slen-3, "...", 4);
+ }
+ }
+ }
+
+ return sw;
+}
+
float file_string_width(const char* str)
{
uiStyle *style= U.uistyles.first;
uiStyleFontSet(&style->widget);
- return BLF_width(style->widget.uifont_id, (char *)str);
+ return BLF_width(style->widget.uifont_id, str);
}
-float file_font_pointsize()
+float file_font_pointsize(void)
{
+#if 0
float s;
char tmp[2] = "X";
uiStyle *style= U.uistyles.first;
uiStyleFontSet(&style->widget);
s = BLF_height(style->widget.uifont_id, tmp);
return style->widget.points;
+#else
+ uiStyle *style= U.uistyles.first;
+ uiStyleFontSet(&style->widget);
+ return style->widget.points;
+#endif
}
static void column_widths(struct FileList* files, struct FileLayout* layout)
@@ -303,7 +378,7 @@ static void column_widths(struct FileList* files, struct FileLayout* layout)
if (file) {
int len;
len = file_string_width(file->relname);
- if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len + 20;
+ if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len;
len = file_string_width(file->date);
if (len > layout->column_widths[COLUMN_DATE]) layout->column_widths[COLUMN_DATE] = len;
len = file_string_width(file->time);
@@ -375,11 +450,12 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
column_widths(sfile->files, layout);
if (params->display == FILE_SHORTDISPLAY) {
- maxlen = layout->column_widths[COLUMN_NAME] + 12 +
- layout->column_widths[COLUMN_SIZE];
- maxlen += 20; // for icon
+ maxlen = ICON_DEFAULT_WIDTH + 4 +
+ layout->column_widths[COLUMN_NAME] + 12 +
+ layout->column_widths[COLUMN_SIZE] + 12;
} else {
- maxlen = layout->column_widths[COLUMN_NAME] + 12 +
+ maxlen = ICON_DEFAULT_WIDTH + 4 +
+ layout->column_widths[COLUMN_NAME] + 12 +
#ifndef WIN32
layout->column_widths[COLUMN_MODE1] + 12 +
layout->column_widths[COLUMN_MODE2] + 12 +
@@ -388,8 +464,8 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
#endif
layout->column_widths[COLUMN_DATE] + 12 +
layout->column_widths[COLUMN_TIME] + 12 +
- layout->column_widths[COLUMN_SIZE];
- maxlen += 20; // for icon
+ layout->column_widths[COLUMN_SIZE] + 12;
+
}
layout->tile_w = maxlen;
if(layout->rows > 0)
@@ -453,7 +529,7 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern)
return match;
}
-void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
+void autocomplete_directory(struct bContext *C, char *str, void *UNUSED(arg_v))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -479,7 +555,7 @@ void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
char path[FILE_MAX];
struct stat status;
- BLI_join_dirfile(path, dirname, de->d_name);
+ BLI_join_dirfile(path, sizeof(path), dirname, de->d_name);
if (stat(path, &status) == 0) {
if (S_ISDIR(status.st_mode)) { /* is subdir */
@@ -500,7 +576,7 @@ void autocomplete_directory(struct bContext *C, char *str, void *arg_v)
}
}
-void autocomplete_file(struct bContext *C, char *str, void *arg_v)
+void autocomplete_file(struct bContext *C, char *str, void *UNUSED(arg_v))
{
SpaceFile *sfile= CTX_wm_space_file(C);
@@ -531,5 +607,18 @@ void ED_fileselect_clear(struct bContext *C, struct SpaceFile *sfile)
void ED_fileselect_exit(struct bContext *C, struct SpaceFile *sfile)
{
- thumbnails_stop(sfile->files, C);
+ if(!sfile) return;
+ if(sfile->op)
+ WM_event_fileselect_event(C, sfile->op, EVT_FILESELECT_EXTERNAL_CANCEL);
+ sfile->op = NULL;
+
+ folderlist_free(sfile->folders_prev);
+ folderlist_free(sfile->folders_next);
+
+ if (sfile->files) {
+ ED_fileselect_clear(C, sfile);
+ MEM_freeN(sfile->files);
+ sfile->files= NULL;
+ }
+
}
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index 8211257da02..340c7f72e4a 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -157,7 +157,7 @@ short fsmenu_can_save (struct FSMenu* fsmenu, FSMenuCategory category, int idx)
return fsme?fsme->save:0;
}
-void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save)
+void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, const char *path, int sorted, short save)
{
FSMenuEntry *prev;
FSMenuEntry *fsme;
@@ -280,13 +280,10 @@ void fsmenu_read_bookmarks(struct FSMenu* fsmenu, const char *filename)
void fsmenu_read_system(struct FSMenu* fsmenu)
{
char line[256];
- FILE *fp;
-
#ifdef WIN32
/* Add the drive names to the listing */
{
__int64 tmp;
- char folder[256];
char tmps[4];
int i;
@@ -304,10 +301,10 @@ void fsmenu_read_system(struct FSMenu* fsmenu)
}
/* Adding Desktop and My Documents */
- SHGetSpecialFolderPath(0, folder, CSIDL_PERSONAL, 0);
- fsmenu_insert_entry(fsmenu,FS_CATEGORY_BOOKMARKS, folder, 1, 0);
- SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
- fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, folder, 1, 0);
+ SHGetSpecialFolderPath(0, line, CSIDL_PERSONAL, 0);
+ fsmenu_insert_entry(fsmenu,FS_CATEGORY_BOOKMARKS, line, 1, 0);
+ SHGetSpecialFolderPath(0, line, CSIDL_DESKTOPDIRECTORY, 0);
+ fsmenu_insert_entry(fsmenu, FS_CATEGORY_BOOKMARKS, line, 1, 0);
}
#else
#ifdef __APPLE__
@@ -474,6 +471,7 @@ void fsmenu_read_system(struct FSMenu* fsmenu)
/* loop over mount points */
struct mntent *mnt;
int len;
+ FILE *fp;
fp = setmntent (MOUNTED, "r");
if (fp == NULL) {
diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h
index dcf8d3eb632..ec322de5c52 100644
--- a/source/blender/editors/space_file/fsmenu.h
+++ b/source/blender/editors/space_file/fsmenu.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -56,7 +56,7 @@ char* fsmenu_get_entry (struct FSMenu* fsmenu, FSMenuCategory category, int ind
* Duplicate entries are not added.
* @param sorted Should entry be inserted in sorted order?
*/
-void fsmenu_insert_entry (struct FSMenu* fsmenu, FSMenuCategory category, char *path, int sorted, short save);
+void fsmenu_insert_entry (struct FSMenu* fsmenu, FSMenuCategory category, const char *path, int sorted, short save);
/** Return whether the entry was created by the user and can be saved and deleted */
short fsmenu_can_save (struct FSMenu* fsmenu, FSMenuCategory category, int index);
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index 7b9423332f2..4c475039c37 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,10 +42,12 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "ED_fileselect.h"
@@ -59,14 +61,13 @@
#include "UI_view2d.h"
-
#include "file_intern.h" // own include
#include "fsmenu.h"
#include "filelist.h"
/* ******************** default callbacks for file space ***************** */
-static SpaceLink *file_new(const bContext *C)
+static SpaceLink *file_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceFile *sfile;
@@ -143,7 +144,7 @@ static void file_free(SpaceLink *sl)
/* spacetype; init callback, area size changes, screen set, etc */
-static void file_init(struct wmWindowManager *wm, ScrArea *sa)
+static void file_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceFile *sfile= (SpaceFile*)sa->spacedata.first;
//printf("file_init\n");
@@ -178,7 +179,7 @@ static SpaceLink *file_duplicate(SpaceLink *sl)
return (SpaceLink *)sfilen;
}
-static void file_refresh(const bContext *C, ScrArea *sa)
+static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
{
SpaceFile *sfile= CTX_wm_space_file(C);
FileSelectParams *params = ED_fileselect_get_params(sfile);
@@ -192,6 +193,7 @@ static void file_refresh(const bContext *C, ScrArea *sa)
}
filelist_hidedot(sfile->files, params->flag & FILE_HIDE_DOT);
filelist_setfilter(sfile->files, params->flag & FILE_FILTER ? params->filter : 0);
+ filelist_setfilter_types(sfile->files, params->filter_glob);
if (filelist_empty(sfile->files))
{
thumbnails_stop(sfile->files, C);
@@ -326,6 +328,13 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
v2d->scroll = V2D_SCROLL_BOTTOM;
v2d->keepofs &= ~V2D_LOCKOFS_X;
v2d->keepofs |= V2D_LOCKOFS_Y;
+
+ /* XXX this happens on scaling down Screen (like from startup.blend) */
+ /* view2d has no type specific for filewindow case, which doesnt scroll vertically */
+ if(v2d->cur.ymax < 0) {
+ v2d->cur.ymin -= v2d->cur.ymax;
+ v2d->cur.ymax= 0;
+ }
}
/* v2d has initialized flag, so this call will only set the mask correct */
UI_view2d_region_reinit(v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
@@ -334,7 +343,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
file_calc_previews(C, ar);
/* set view */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* on first read, find active file */
if (params->active_file == -1) {
@@ -354,7 +363,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar)
}
-void file_operatortypes(void)
+static void file_operatortypes(void)
{
WM_operatortype_append(FILE_OT_select);
WM_operatortype_append(FILE_OT_select_all_toggle);
@@ -376,10 +385,11 @@ void file_operatortypes(void)
WM_operatortype_append(FILE_OT_delete);
WM_operatortype_append(FILE_OT_rename);
WM_operatortype_append(FILE_OT_smoothscroll);
+ WM_operatortype_append(FILE_OT_directory);
}
/* NOTE: do not add .blend file reading on this level */
-void file_keymap(struct wmKeyConfig *keyconf)
+static void file_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMapItem *kmi;
/* keys for all areas */
@@ -456,7 +466,7 @@ static void file_channel_area_draw(const bContext *C, ARegion *ar)
ED_region_panels(C, ar, 1, NULL, -1);
}
-static void file_channel_area_listener(ARegion *ar, wmNotifier *wmn)
+static void file_channel_area_listener(ARegion *UNUSED(ar), wmNotifier *wmn)
{
/* context changes */
switch(wmn->category) {
@@ -504,7 +514,7 @@ static void file_ui_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
file_draw_buttons(C, ar);
diff --git a/source/blender/editors/space_file/writeimage.c b/source/blender/editors/space_file/writeimage.c
deleted file mode 100644
index b69bfdc0231..00000000000
--- a/source/blender/editors/space_file/writeimage.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <string.h>
-
-
-#include "IMB_imbuf.h"
-#include "IMB_imbuf_types.h"
-
-#include "BLI_blenlib.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_space_types.h"
-
-#include "BKE_context.h"
-#include "BKE_global.h"
-#include "BKE_image.h"
-
-#include "RE_pipeline.h"
-
-#include "file_intern.h"
-
-/* XXX */
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {}
-static int saveover(const char *dummy) {return 0;}
-/* XXX */
-
-
-/* ------------------------------------------------------------------------- */
-
-/* callback for fileselect to save rendered image, renderresult was checked to exist */
-static void save_rendered_image_cb_real(char *name, int confirm)
-{
- Scene *scene= NULL; // XXX
- char str[FILE_MAXDIR+FILE_MAXFILE];
- int overwrite;
-
- if(BLI_testextensie(name,".blend")) {
- error("Wrong filename");
- return;
- }
-
- /* BKE_add_image_extension() checks for if extension was already set */
- if(scene->r.scemode & R_EXTENSION)
- if(strlen(name)<FILE_MAXDIR+FILE_MAXFILE-5)
- BKE_add_image_extension(name, scene->r.imtype);
-
- strcpy(str, name);
- BLI_path_abs(str, G.sce);
-
- if (confirm)
- overwrite = saveover(str);
- else
- overwrite = 1;
-
- if(overwrite) {
- if(scene->r.imtype==R_MULTILAYER) {
- Render *re= RE_GetRender(scene->id.name);
- RenderResult *rr= RE_AcquireResultRead(re);
- if(rr)
- RE_WriteRenderResult(rr, str, scene->r.quality);
- RE_ReleaseResult(re);
- }
- else {
- Render *re= RE_GetRender(scene->id.name);
- RenderResult rres;
- ImBuf *ibuf;
-
- RE_AcquireResultImage(re, &rres);
-
- waitcursor(1); /* from screen.c */
-
- ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
- ibuf->rect= (unsigned int *)rres.rect32;
- ibuf->rect_float= rres.rectf;
- ibuf->zbuf_float= rres.rectz;
-
- /* float factor for random dither, imbuf takes care of it */
- ibuf->dither= scene->r.dither_intensity;
-
- BKE_write_ibuf(scene, ibuf, str, scene->r.imtype, scene->r.subimtype, scene->r.quality);
- IMB_freeImBuf(ibuf); /* imbuf knows rects are not part of ibuf */
-
- RE_ReleaseResultImage(re);
- }
-
- strcpy(G.ima, name);
-
- waitcursor(0);
- }
-}
-
-
-void save_image_filesel_str(Scene *scene, char *str)
-{
- switch(scene->r.imtype) {
-#ifdef WITH_HDR
- case R_RADHDR:
- strcpy(str, "Save Radiance HDR");
- break;
-#endif
- case R_FFMPEG:
- case R_H264:
- case R_XVID:
- case R_THEORA:
- case R_PNG:
- strcpy(str, "Save PNG");
- break;
-#ifdef WITH_DDS
- case R_DDS:
- strcpy(str, "Save DDS");
- break;
-#endif
- case R_BMP:
- strcpy(str, "Save BMP");
- break;
-#ifdef WITH_TIFF
- case R_TIFF:
- strcpy(str, "Save TIFF");
- break;
-#endif
-#ifdef WITH_OPENEXR
- case R_OPENEXR:
- strcpy(str, "Save OpenEXR");
- break;
-#endif
-#ifdef WITH_CINEON
- case R_CINEON:
- strcpy(str, "Save Cineon");
- break;
- case R_DPX:
- strcpy(str, "Save DPX");
- break;
-#endif
- case R_RAWTGA:
- strcpy(str, "Save Raw Targa");
- break;
- case R_IRIS:
- strcpy(str, "Save IRIS");
- break;
- case R_IRIZ:
- strcpy(str, "Save IRIS");
- break;
- case R_TARGA:
- strcpy(str, "Save Targa");
- break;
- case R_MULTILAYER:
- strcpy(str, "Save Multi Layer EXR");
- break;
-#ifdef WITH_OPENJPEG
- case R_JP2:
- strcpy(str, "Save JPEG2000");
- break;
-#endif
- /* default we save jpeg, also for all movie formats */
- case R_JPEG90:
- case R_AVICODEC:
- case R_AVIRAW:
- case R_AVIJPEG:
- default:
- strcpy(str, "Save JPEG");
- break;
- }
-}
-
-static void save_rendered_image_cb(char *name)
-{
- save_rendered_image_cb_real(name, 1);
-}
-
-/* no fileselect, no confirm */
-void BIF_save_rendered_image(char *name)
-{
- save_rendered_image_cb_real(name, 0);
-}
-
-/* calls fileselect */
-void BIF_save_rendered_image_fs(Scene *scene)
-{
- Render *re= RE_GetRender(scene->id.name);
- RenderResult rres;
-
- RE_AcquireResultImage(re, &rres);
-
- if(!rres.rectf && !rres.rect32) {
- error("No image rendered");
- }
- else {
- char dir[FILE_MAXDIR * 2], str[FILE_MAXFILE * 2];
-
- if(G.ima[0]==0) {
- strcpy(dir, G.sce);
- BLI_splitdirstring(dir, str);
- strcpy(G.ima, dir);
- }
-
- save_image_filesel_str(scene, str);
- activate_fileselect(FILE_SPECIAL, str, G.ima, save_rendered_image_cb);
- }
-
- RE_ReleaseResultImage(re);
-}
-
-
diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt
index 6ad95d920c6..5b5fd41bf23 100644
--- a/source/blender/editors/space_graph/CMakeLists.txt
+++ b/source/blender/editors/space_graph/CMakeLists.txt
@@ -19,17 +19,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
../../../../intern/audaspace/intern
)
-BLENDERLIB(bf_editor_space_graph "${SRC}" "${INC}")
+set(SRC
+ graph_buttons.c
+ graph_draw.c
+ graph_edit.c
+ graph_ops.c
+ graph_select.c
+ graph_utils.c
+ space_graph.c
+
+ graph_intern.h
+)
+
+blender_add_lib(bf_editor_space_graph "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_graph/Makefile b/source/blender/editors/space_graph/Makefile
deleted file mode 100644
index 1ac744af239..00000000000
--- a/source/blender/editors/space_graph/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_graph
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-
-# own include
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_graph/SConscript b/source/blender/editors/space_graph/SConscript
index 174894ddfad..75d0927192b 100644
--- a/source/blender/editors/space_graph/SConscript
+++ b/source/blender/editors/space_graph/SConscript
@@ -5,6 +5,6 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' #/intern/audaspace/intern'
+incs += ' #/intern/audaspace/intern ../../blenloader'
env.BlenderLib ( 'bf_editors_space_graph', sources, Split(incs), [], libtype=['core'], priority=[50] )
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index 14f684dd9e3..8c97e269aa4 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,6 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ -76,7 +77,7 @@
/* -------------- */
-static void do_graph_region_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
{
//Scene *scene= CTX_data_scene(C);
@@ -116,7 +117,7 @@ static int graph_panel_context(const bContext *C, bAnimListElem **ale, FCurve **
return 1;
}
-static int graph_panel_poll(const bContext *C, PanelType *pt)
+static int graph_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
return graph_panel_context(C, NULL, NULL);
}
@@ -138,19 +139,19 @@ static void graph_panel_view(const bContext *C, Panel *pa)
/* 2D-Cursor */
col= uiLayoutColumn(pa->layout, 0);
- uiItemR(col, &spaceptr, "show_cursor", 0, NULL, 0);
+ uiItemR(col, &spaceptr, "show_cursor", 0, NULL, ICON_NULL);
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
- uiItemO(subcol, "Cursor from Selection", 0, "GRAPH_OT_frame_jump");
+ uiItemO(subcol, "Cursor from Selection", ICON_NULL, "GRAPH_OT_frame_jump");
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", 0);
+ uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", ICON_NULL);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_CFRA);
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", 0);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", ICON_NULL);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE);
}
@@ -184,20 +185,20 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
/* RNA-Path Editing - only really should be enabled when things aren't working */
col= uiLayoutColumn(layout, 1);
- uiLayoutSetEnabled(col, (fcu->flag & FCURVE_DISABLED));
+ uiLayoutSetEnabled(col, (fcu->flag & FCURVE_DISABLED)!=0);
uiItemR(col, &fcu_ptr, "data_path", 0, "", ICON_RNA);
- uiItemR(col, &fcu_ptr, "array_index", 0, NULL, 0);
+ uiItemR(col, &fcu_ptr, "array_index", 0, NULL, ICON_NULL);
/* color settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Display Color:", 0);
+ uiItemL(col, "Display Color:", ICON_NULL);
row= uiLayoutRow(col, 1);
- uiItemR(row, &fcu_ptr, "color_mode", 0, "", 0);
+ uiItemR(row, &fcu_ptr, "color_mode", 0, "", ICON_NULL);
subrow= uiLayoutRow(row, 1);
uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM));
- uiItemR(subrow, &fcu_ptr, "color", 0, "", 0);
+ uiItemR(subrow, &fcu_ptr, "color", 0, "", ICON_NULL);
MEM_freeN(ale);
}
@@ -263,23 +264,34 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
/* interpolation */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, ICON_NULL);
/* numerical coordinate editing */
col= uiLayoutColumn(layout, 1);
/* keyframe itself */
- uiItemR(col, &bezt_ptr, "co", 0, "Key", 0);
+ uiItemR(col, &bezt_ptr, "co", 0, "Key", ICON_NULL);
/* previous handle - only if previous was Bezier interpolation */
if ((prevbezt) && (prevbezt->ipo == BEZT_IPO_BEZ))
- uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, ICON_NULL);
/* next handle - only if current is Bezier interpolation */
if (bezt->ipo == BEZT_IPO_BEZ)
- uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, 0);
+ uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, ICON_NULL);
+ }
+ else {
+ if ((fcu->bezt == NULL) && (fcu->modifiers.first)) {
+ /* modifiers only - so no keyframes to be active */
+ uiItemL(layout, "F-Curve only has F-Modifiers", ICON_NULL);
+ uiItemL(layout, "See Modifiers panel below", ICON_INFO);
+ }
+ else if (fcu->fpt) {
+ /* samples only */
+ uiItemL(layout, "F-Curve doesn't have any keyframes as it only contains sampled points", ICON_NULL);
+ }
+ else
+ uiItemL(layout, "No active keyframe on F-Curve", ICON_NULL);
}
- else
- uiItemL(layout, "No active keyframe on F-Curve", 0);
MEM_freeN(ale);
}
@@ -288,7 +300,7 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
#define B_IPO_DEPCHANGE 10
-static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_driver_buttons(bContext *C, void *UNUSED(arg), int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -310,22 +322,23 @@ static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
}
/* callback to remove the active driver */
-static void driver_remove_cb (bContext *C, void *ale_v, void *dummy_v)
+static void driver_remove_cb (bContext *C, void *ale_v, void *UNUSED(arg))
{
bAnimListElem *ale= (bAnimListElem *)ale_v;
ID *id= ale->id;
FCurve *fcu= ale->data;
+ ReportList *reports = CTX_wm_reports(C);
/* try to get F-Curve that driver lives on, and ID block which has this AnimData */
if (ELEM(NULL, id, fcu))
return;
/* call API method to remove this driver */
- ANIM_remove_driver(id, fcu->rna_path, fcu->array_index, 0);
+ ANIM_remove_driver(reports, id, fcu->rna_path, fcu->array_index, 0);
}
/* callback to add a target variable to the active driver */
-static void driver_add_var_cb (bContext *C, void *driver_v, void *dummy_v)
+static void driver_add_var_cb (bContext *UNUSED(C), void *driver_v, void *UNUSED(arg))
{
ChannelDriver *driver= (ChannelDriver *)driver_v;
@@ -334,7 +347,7 @@ static void driver_add_var_cb (bContext *C, void *driver_v, void *dummy_v)
}
/* callback to remove target variable from active driver */
-static void driver_delete_var_cb (bContext *C, void *driver_v, void *dvar_v)
+static void driver_delete_var_cb (bContext *UNUSED(C), void *driver_v, void *dvar_v)
{
ChannelDriver *driver= (ChannelDriver *)driver_v;
DriverVar *dvar= (DriverVar *)dvar_v;
@@ -344,7 +357,7 @@ static void driver_delete_var_cb (bContext *C, void *driver_v, void *dvar_v)
}
/* callback to reset the driver's flags */
-static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v)
+static void driver_update_flags_cb (bContext *UNUSED(C), void *fcu_v, void *UNUSED(arg))
{
FCurve *fcu= (FCurve *)fcu_v;
ChannelDriver *driver= fcu->driver;
@@ -355,7 +368,7 @@ static void driver_update_flags_cb (bContext *C, void *fcu_v, void *dummy_v)
}
/* drivers panel poll */
-static int graph_panel_drivers_poll(const bContext *C, PanelType *pt)
+static int graph_panel_drivers_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceIpo *sipo= CTX_wm_space_graph(C);
@@ -365,9 +378,8 @@ static int graph_panel_drivers_poll(const bContext *C, PanelType *pt)
return graph_panel_context(C, NULL, NULL);
}
-
/* settings for 'single property' driver variable type */
-static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__singleProp(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
PointerRNA dtar_ptr;
@@ -379,7 +391,7 @@ static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layou
/* Target ID */
row= uiLayoutRow(layout, 0);
- uiTemplateAnyID(row, (bContext *)C, &dtar_ptr, "id", "id_type", "Prop:");
+ uiTemplateAnyID(row, &dtar_ptr, "id", "id_type", "Prop:");
/* Target Property */
// TODO: make this less technical...
@@ -392,12 +404,12 @@ static void graph_panel_driverVar__singleProp(const bContext *C, uiLayout *layou
col= uiLayoutColumn(layout, 1);
block= uiLayoutGetBlock(col);
/* rna path */
- uiTemplatePathBuilder(col, (bContext *)C, &dtar_ptr, "data_path", &root_ptr, "Path");
+ uiTemplatePathBuilder(col, &dtar_ptr, "data_path", &root_ptr, "Path");
}
}
/* settings for 'rotation difference' driver variable type */
-static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__rotDiff(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
DriverTarget *dtar2= &dvar->targets[1];
@@ -412,7 +424,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
/* Bone 1 */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Bone 1:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Bone 1:");
if (dtar->id && ob1->pose) {
PointerRNA tar_ptr;
@@ -422,7 +434,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
}
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Bone 2:");
+ uiTemplateAnyID(col, &dtar2_ptr, "id", "id_type", "Bone 2:");
if (dtar2->id && ob2->pose) {
PointerRNA tar_ptr;
@@ -433,7 +445,7 @@ static void graph_panel_driverVar__rotDiff(const bContext *C, uiLayout *layout,
}
/* settings for 'location difference' driver variable type */
-static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
DriverTarget *dtar2= &dvar->targets[1];
@@ -448,7 +460,7 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
/* Bone 1 */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Ob/Bone 1:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Ob/Bone 1:");
if (dtar->id && ob1->pose) {
PointerRNA tar_ptr;
@@ -457,10 +469,10 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
+ uiTemplateAnyID(col, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
if (dtar2->id && ob2->pose) {
PointerRNA tar_ptr;
@@ -469,11 +481,11 @@ static void graph_panel_driverVar__locDiff(const bContext *C, uiLayout *layout,
uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
}
/* settings for 'transform channel' driver variable type */
-static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout, ID *id, DriverVar *dvar)
+static void graph_panel_driverVar__transChan(uiLayout *layout, ID *id, DriverVar *dvar)
{
DriverTarget *dtar= &dvar->targets[0];
Object *ob = (Object *)dtar->id;
@@ -485,7 +497,7 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout
/* properties */
col= uiLayoutColumn(layout, 1);
- uiTemplateAnyID(col, (bContext *)C, &dtar_ptr, "id", "id_type", "Ob/Bone:");
+ uiTemplateAnyID(col, &dtar_ptr, "id", "id_type", "Ob/Bone:");
if (dtar->id && ob->pose) {
PointerRNA tar_ptr;
@@ -495,8 +507,8 @@ static void graph_panel_driverVar__transChan(const bContext *C, uiLayout *layout
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, &dtar_ptr, "transform_type", 0, "", 0);
- uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, 0);
+ uiItemR(row, &dtar_ptr, "transform_type", 0, "", ICON_NULL);
+ uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
}
/* driver settings for active F-Curve (only for 'Drivers' mode) */
@@ -535,12 +547,12 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
block= uiLayoutGetBlock(col);
- uiItemR(col, &driver_ptr, "type", 0, NULL, 0);
+ uiItemR(col, &driver_ptr, "type", 0, NULL, ICON_NULL);
/* show expression box if doing scripted drivers, and/or error messages when invalid drivers exist */
if (driver->type == DRIVER_TYPE_PYTHON) {
/* expression */
- uiItemR(col, &driver_ptr, "expression", 0, "Expr", 0);
+ uiItemR(col, &driver_ptr, "expression", 0, "Expr", ICON_NULL);
/* errors? */
if (driver->flag & DRIVER_FLAG_INVALID)
@@ -554,17 +566,17 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
/* debug setting */
- uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, 0);
+ uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, ICON_NULL);
/* value of driver */
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
uiLayout *row= uiLayoutRow(col, 1);
char valBuf[32];
- uiItemL(row, "Driver Value:", 0);
+ uiItemL(row, "Driver Value:", ICON_NULL);
sprintf(valBuf, "%.3f", driver->curval);
- uiItemL(row, valBuf, 0);
+ uiItemL(row, valBuf, ICON_NULL);
}
/* add driver variables */
@@ -589,7 +601,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
row= uiLayoutRow(box, 0);
block= uiLayoutGetBlock(row);
/* variable name */
- uiItemR(row, &dvar_ptr, "name", 0, "", 0);
+ uiItemR(row, &dvar_ptr, "name", 0, "", ICON_NULL);
/* remove button */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -599,37 +611,36 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
/* variable type */
row= uiLayoutRow(box, 0);
- uiItemR(row, &dvar_ptr, "type", 0, "", 0);
+ uiItemR(row, &dvar_ptr, "type", 0, "", ICON_NULL);
/* variable type settings */
box= uiLayoutBox(col);
/* controls to draw depends on the type of variable */
switch (dvar->type) {
case DVAR_TYPE_SINGLE_PROP: /* single property */
- graph_panel_driverVar__singleProp(C, box, ale->id, dvar);
+ graph_panel_driverVar__singleProp(box, ale->id, dvar);
break;
case DVAR_TYPE_ROT_DIFF: /* rotational difference */
- graph_panel_driverVar__rotDiff(C, box, ale->id, dvar);
+ graph_panel_driverVar__rotDiff(box, ale->id, dvar);
break;
case DVAR_TYPE_LOC_DIFF: /* location difference */
- graph_panel_driverVar__locDiff(C, box, ale->id, dvar);
+ graph_panel_driverVar__locDiff(box, ale->id, dvar);
break;
case DVAR_TYPE_TRANSFORM_CHAN: /* transform channel */
- graph_panel_driverVar__transChan(C, box, ale->id, dvar);
+ graph_panel_driverVar__transChan(box, ale->id, dvar);
break;
}
/* value of variable */
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
- uiLayout *row;
char valBuf[32];
box= uiLayoutBox(col);
row= uiLayoutRow(box, 1);
- uiItemL(row, "Value:", 0);
+ uiItemL(row, "Value:", ICON_NULL);
sprintf(valBuf, "%.3f", dvar->curval);
- uiItemL(row, valBuf, 0);
+ uiItemL(row, valBuf, ICON_NULL);
}
}
@@ -642,7 +653,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
#define B_FMODIFIER_REDRAW 20
-static void do_graph_region_modifier_buttons(bContext *C, void *arg, int event)
+static void do_graph_region_modifier_buttons(bContext *C, void *UNUSED(arg), int event)
{
switch (event) {
case B_REDR:
@@ -733,7 +744,7 @@ void graph_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int graph_properties(bContext *C, wmOperator *op)
+static int graph_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= graph_has_buttons_region(sa);
@@ -748,9 +759,10 @@ void GRAPH_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "GRAPH_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= graph_properties;
- ot->poll= ED_operator_ipo_active; // xxx
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= 0;
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index f780a6c31ee..44bc3fe7d94 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -48,7 +49,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
#include "BKE_fcurve.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -70,7 +71,7 @@
*/
#define drawFCurveFade(fcu) ( ((fcu)->flag & FCURVE_SELECTED)? 1.0f : 0.25f )
-/* set the colour for some point from some value given packed into an int
+/* set the color for some point from some value given packed into an int
* - intV: integer value containing color info packed into an int
* - alpha: float value describing the
*/
@@ -87,7 +88,7 @@
/* Envelope -------------- */
// TODO: draw a shaded poly showing the region of influence too!!!
-static void draw_fcurve_modifier_controls_envelope (FCurve *fcu, FModifier *fcm, View2D *v2d)
+static void draw_fcurve_modifier_controls_envelope (FModifier *fcm, View2D *v2d)
{
FMod_Envelope *env= (FMod_Envelope *)fcm->data;
FCM_EnvelopeData *fed;
@@ -137,7 +138,7 @@ static void draw_fcurve_modifier_controls_envelope (FCurve *fcu, FModifier *fcm,
/* Points ---------------- */
/* helper func - draw keyframe vertices only for an F-Curve */
-static void draw_fcurve_vertices_keyframes (bAnimContext *ac, FCurve *fcu, View2D *v2d, short edit, short sel)
+static void draw_fcurve_vertices_keyframes (FCurve *fcu, SpaceIpo *UNUSED(sipo), View2D *v2d, short edit, short sel)
{
BezTriple *bezt= fcu->bezt;
const float fac= 0.05f * (v2d->cur.xmax - v2d->cur.xmin);
@@ -209,7 +210,7 @@ static void draw_fcurve_handle_control (float x, float y, float xscale, float ys
}
/* helper func - draw handle vertices only for an F-Curve (if it is not protected) */
-static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCurve *fcu, View2D *v2d, short sel)
+static void draw_fcurve_vertices_handles (FCurve *fcu, SpaceIpo *sipo, View2D *v2d, short sel, short sel_handle_only)
{
BezTriple *bezt= fcu->bezt;
BezTriple *prevbezt = NULL;
@@ -225,7 +226,7 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
else UI_ThemeColor(TH_HANDLE_VERTEX);
/* anti-aliased lines for more consistent appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
for (i=0; i < fcu->totvert; i++, prevbezt=bezt, bezt++) {
@@ -237,7 +238,7 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
* Also, need to take into account whether the keyframe was selected
* if a Graph Editor option to only show handles of selected keys is on.
*/
- if ( !(sipo->flag & SIPO_SELVHANDLESONLY) || BEZSELECTED(bezt) ) {
+ if ( !sel_handle_only || BEZSELECTED(bezt) ) {
if ( (!prevbezt && (bezt->ipo==BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo==BEZT_IPO_BEZ)) ) {
if ((bezt->f1 & SELECT) == sel)/* && v2d->cur.xmin < bezt->vec[0][0] < v2d->cur.xmax)*/
draw_fcurve_handle_control(bezt->vec[0][0], bezt->vec[0][1], xscale, yscale, hsize);
@@ -250,12 +251,12 @@ static void draw_fcurve_vertices_handles (bAnimContext *ac, SpaceIpo *sipo, FCur
}
}
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
/* helper func - set color to draw F-Curve data with */
-static void set_fcurve_vertex_color (SpaceIpo *sipo, FCurve *fcu, short sel)
+static void set_fcurve_vertex_color (FCurve *fcu, short sel)
{
/* Fade the 'intensity' of the vertices based on the selection of the curves too */
int alphaOffset= (int)((drawFCurveFade(fcu) - 1.0f) * 255);
@@ -274,7 +275,7 @@ static void set_fcurve_vertex_color (SpaceIpo *sipo, FCurve *fcu, short sel)
}
-static void draw_fcurve_vertices (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu, int do_handles)
+static void draw_fcurve_vertices (SpaceIpo *sipo, ARegion *ar, FCurve *fcu, short do_handles, short sel_handle_only)
{
View2D *v2d= &ar->v2d;
@@ -290,19 +291,19 @@ static void draw_fcurve_vertices (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
/* draw the two handles first (if they're shown, the curve doesn't have just a single keyframe, and the curve is being edited) */
if (do_handles)
{
- set_fcurve_vertex_color(sipo, fcu, 0);
- draw_fcurve_vertices_handles(ac, sipo, fcu, v2d, 0);
+ set_fcurve_vertex_color(fcu, 0);
+ draw_fcurve_vertices_handles(fcu, sipo, v2d, 0, sel_handle_only);
- set_fcurve_vertex_color(sipo, fcu, 1);
- draw_fcurve_vertices_handles(ac, sipo, fcu, v2d, 1);
+ set_fcurve_vertex_color(fcu, 1);
+ draw_fcurve_vertices_handles(fcu, sipo, v2d, 1, sel_handle_only);
}
/* draw keyframes over the handles */
- set_fcurve_vertex_color(sipo, fcu, 0);
- draw_fcurve_vertices_keyframes(ac, fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), 0);
+ set_fcurve_vertex_color(fcu, 0);
+ draw_fcurve_vertices_keyframes(fcu, sipo, v2d, !(fcu->flag & FCURVE_PROTECTED), 0);
- set_fcurve_vertex_color(sipo, fcu, 1);
- draw_fcurve_vertices_keyframes(ac, fcu, v2d, !(fcu->flag & FCURVE_PROTECTED), 1);
+ set_fcurve_vertex_color(fcu, 1);
+ draw_fcurve_vertices_keyframes(fcu, sipo, v2d, !(fcu->flag & FCURVE_PROTECTED), 1);
glPointSize(1.0f);
}
@@ -329,7 +330,7 @@ static int draw_fcurve_handles_check(SpaceIpo *sipo, FCurve *fcu)
/* draw lines for F-Curve handles only (this is only done in EditMode)
* note: draw_fcurve_handles_check must be checked before running this. */
-static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
+static void draw_fcurve_handles (SpaceIpo *sipo, FCurve *fcu)
{
int sel, b;
@@ -346,7 +347,7 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
BezTriple *bezt=fcu->bezt, *prevbezt=NULL;
int basecol= (sel)? TH_HANDLE_SEL_FREE : TH_HANDLE_FREE;
float *fp;
- char col[4];
+ unsigned char col[4];
/* if only selected keyframes have handles shown, skip the first round */
if ((sel == 0) && (sipo->flag & SIPO_SELVHANDLESONLY))
@@ -406,7 +407,7 @@ static void draw_fcurve_handles (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3]= drawFCurveFade(fcu) * 255;
glColor4ubv((GLubyte *)col);
-
+
glVertex2fv(fp); glVertex2fv(fp+3);
}
}
@@ -455,7 +456,7 @@ static void draw_fcurve_sample_control (float x, float y, float xscale, float ys
}
/* helper func - draw keyframe vertices only for an F-Curve */
-static void draw_fcurve_samples (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
+static void draw_fcurve_samples (SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
{
FPoint *first, *last;
float hsize, xscale, yscale;
@@ -475,21 +476,21 @@ static void draw_fcurve_samples (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar,
/* draw */
if (first && last) {
/* anti-aliased lines for more consistent appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
draw_fcurve_sample_control(first->vec[0], first->vec[1], xscale, yscale, hsize);
draw_fcurve_sample_control(last->vec[0], last->vec[1], xscale, yscale, hsize);
glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
}
}
/* Curve ---------------- */
/* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
-static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, SpaceIpo *sipo, View2D *v2d, View2DGrid *grid)
+static void draw_fcurve_curve (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
{
ChannelDriver *driver;
float samplefreq, ctime;
@@ -627,7 +628,7 @@ static void draw_fcurve_curve_samples (bAnimContext *ac, ID *id, FCurve *fcu, Vi
}
/* helper func - draw one repeat of an F-Curve */
-static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
+static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d)
{
BezTriple *prevbezt= fcu->bezt;
BezTriple *bezt= prevbezt+1;
@@ -784,7 +785,7 @@ static void draw_fcurve_curve_bezts (bAnimContext *ac, ID *id, FCurve *fcu, View
/* Draw the 'ghost' F-Curves (i.e. snapshots of the curve)
* NOTE: unit mapping has already been applied to the values, so do not try and apply again
*/
-void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGrid *grid)
+void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
{
FCurve *fcu;
@@ -793,7 +794,7 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
glLineWidth(3.0f);
/* anti-aliased lines for less jagged appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
/* the ghost curves are simply sampled F-Curves stored in sipo->ghostCurves */
@@ -812,7 +813,7 @@ void graph_draw_ghost_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, Vie
setlinestyle(0);
glLineWidth(1.0f);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
@@ -870,7 +871,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
}
/* anti-aliased lines for less jagged appearance */
- glEnable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
/* draw F-Curve */
@@ -878,12 +879,12 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* draw a curve affected by modifiers or only allowed to have integer values
* by sampling it at various small-intervals over the visible region
*/
- draw_fcurve_curve(ac, ale->id, fcu, sipo, &ar->v2d, grid);
+ draw_fcurve_curve(ac, ale->id, fcu, &ar->v2d, grid);
}
else if ( ((fcu->bezt) || (fcu->fpt)) && (fcu->totvert) ) {
/* just draw curve based on defined data (i.e. no modifiers) */
if (fcu->bezt)
- draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d, grid);
+ draw_fcurve_curve_bezts(ac, ale->id, fcu, &ar->v2d);
else if (fcu->fpt)
draw_fcurve_curve_samples(ac, ale->id, fcu, &ar->v2d);
}
@@ -891,7 +892,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* restore settings */
setlinestyle(0);
- glDisable(GL_LINE_SMOOTH);
+ if ((sipo->flag & SIPO_BEAUTYDRAW_OFF)==0) glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
@@ -899,12 +900,12 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
* - if the option to only show controls if the F-Curve is selected is enabled, we must obey this
*/
if (!(sipo->flag & SIPO_SELCUVERTSONLY) || (fcu->flag & FCURVE_SELECTED)) {
- if (fcurve_needs_draw_fmodifier_controls(fcu, fcm)) {
+ if (fcurve_are_keyframes_usable(fcu) == 0) {
/* only draw controls if this is the active modifier */
if ((fcu->flag & FCURVE_ACTIVE) && (fcm)) {
switch (fcm->type) {
case FMODIFIER_TYPE_ENVELOPE: /* envelope */
- draw_fcurve_modifier_controls_envelope(fcu, fcm, &ar->v2d);
+ draw_fcurve_modifier_controls_envelope(fcm, &ar->v2d);
break;
}
}
@@ -919,15 +920,15 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
if (do_handles) {
/* only draw handles/vertices on keyframes */
glEnable(GL_BLEND);
- draw_fcurve_handles(ac, sipo, ar, fcu);
+ draw_fcurve_handles(sipo, fcu);
glDisable(GL_BLEND);
}
- draw_fcurve_vertices(ac, sipo, ar, fcu, do_handles);
+ draw_fcurve_vertices(sipo, ar, fcu, do_handles, (sipo->flag & SIPO_SELVHANDLESONLY));
}
else {
/* samples: only draw two indicators at either end as indicators */
- draw_fcurve_samples(ac, sipo, ar, fcu);
+ draw_fcurve_samples(sipo, ar, fcu);
}
/* unapply unit mapping */
@@ -948,7 +949,7 @@ void graph_draw_curves (bAnimContext *ac, SpaceIpo *sipo, ARegion *ar, View2DGri
/* Channel List */
/* left hand part */
-void graph_draw_channel_names(bContext *C, bAnimContext *ac, SpaceIpo *sipo, ARegion *ar)
+void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 5c692ba1112..5756c99862d 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -60,6 +61,7 @@
#include "ED_keyframes_edit.h"
#include "ED_screen.h"
#include "ED_transform.h"
+#include "ED_markers.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -119,6 +121,10 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
if ((ymax) && (tymax > *ymax)) *ymax= tymax;
}
+ /* ensure that the extents are not too extreme that view implodes...*/
+ if ((xmin && xmax) && (fabs(*xmax - *xmin) < 0.1)) *xmax += 0.1;
+ if ((ymin && ymax) && (fabs(*ymax - *ymin) < 0.1)) *ymax += 0.1;
+
/* free memory */
BLI_freelistN(&anim_data);
}
@@ -140,7 +146,7 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
/* ****************** Automatic Preview-Range Operator ****************** */
-static int graphkeys_previewrange_exec(bContext *C, wmOperator *op)
+static int graphkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene;
@@ -172,10 +178,11 @@ void GRAPH_OT_previewrange_set (wmOperatorType *ot)
/* identifiers */
ot->name= "Auto-Set Preview Range";
ot->idname= "GRAPH_OT_previewrange_set";
+ ot->description= "Automatically set Preview Range based on range of keyframes";
/* api callbacks */
ot->exec= graphkeys_previewrange_exec;
- ot->poll= graphop_visible_keyframes_poll;
+ ot->poll= ED_operator_graphedit_active; // XXX: unchecked poll to get fsamples working too, but makes modifier damage trickier...
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -183,7 +190,7 @@ void GRAPH_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int graphkeys_viewall_exec(bContext *C, wmOperator *op)
+static int graphkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -223,7 +230,7 @@ void GRAPH_OT_view_all (wmOperatorType *ot)
/* api callbacks */
ot->exec= graphkeys_viewall_exec;
- ot->poll= graphop_visible_keyframes_poll;
+ ot->poll= ED_operator_graphedit_active; // XXX: unchecked poll to get fsamples working too, but makes modifier damage trickier...
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -305,7 +312,7 @@ static void create_ghost_curves (bAnimContext *ac, int start, int end)
/* ------------------- */
-static int graphkeys_create_ghostcurves_exec(bContext *C, wmOperator *op)
+static int graphkeys_create_ghostcurves_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
View2D *v2d;
@@ -349,7 +356,7 @@ void GRAPH_OT_ghost_curves_create (wmOperatorType *ot)
/* ******************** Clear Ghost-Curves Operator *********************** */
/* This operator clears the 'ghost curves' for the active Graph Editor */
-static int graphkeys_clear_ghostcurves_exec(bContext *C, wmOperator *op)
+static int graphkeys_clear_ghostcurves_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
SpaceIpo *sipo;
@@ -381,7 +388,7 @@ void GRAPH_OT_ghost_curves_clear (wmOperatorType *ot)
/* api callbacks */
ot->exec= graphkeys_clear_ghostcurves_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -393,7 +400,7 @@ void GRAPH_OT_ghost_curves_clear (wmOperatorType *ot)
/* ******************** Insert Keyframes Operator ************************* */
/* defines for insert keyframes tool */
-EnumPropertyItem prop_graphkeys_insertkey_types[] = {
+static EnumPropertyItem prop_graphkeys_insertkey_types[] = {
{1, "ALL", 0, "All Channels", ""},
{2, "SEL", 0, "Only Selected Channels", ""},
{0, NULL, 0, NULL, NULL}
@@ -406,8 +413,8 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
+ ReportList *reports = ac->reports;
Scene *scene= ac->scene;
- float cfra= (float)CFRA;
short flag = 0;
/* filter data */
@@ -423,6 +430,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
for (ale= anim_data.first; ale; ale= ale->next) {
AnimData *adt= ANIM_nla_mapping_get(ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
+ float cfra;
/* adjust current frame for NLA-mapping */
if (adt)
@@ -432,7 +440,7 @@ static void insert_graph_keys(bAnimContext *ac, short mode)
/* if there's an id */
if (ale->id)
- insert_keyframe(ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, ale->id, NULL, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
else
insert_vert_fcurve(fcu, cfra, fcu->curval, 0);
}
@@ -507,19 +515,33 @@ static int graphkeys_click_insert_exec (bContext *C, wmOperator *op)
}
fcu = ale->data;
- /* get frame and value from props */
- frame= RNA_float_get(op->ptr, "frame");
- val= RNA_float_get(op->ptr, "value");
-
- /* apply inverse NLA-mapping to frame to get correct time in un-scaled action */
- adt= ANIM_nla_mapping_get(&ac, ale);
- frame= BKE_nla_tweakedit_remap(adt, frame, NLATIME_CONVERT_UNMAP);
-
- /* apply inverse unit-mapping to value to get correct value for F-Curves */
- val *= ANIM_unit_mapping_get_factor(ac.scene, ale->id, fcu, 1);
-
- /* insert keyframe on the specified frame + value */
- insert_vert_fcurve(fcu, frame, val, 0);
+ /* when there are F-Modifiers on the curve, only allow adding
+ * keyframes if these will be visible after doing so...
+ */
+ if (fcurve_is_keyframable(fcu)) {
+ /* get frame and value from props */
+ frame= RNA_float_get(op->ptr, "frame");
+ val= RNA_float_get(op->ptr, "value");
+
+ /* apply inverse NLA-mapping to frame to get correct time in un-scaled action */
+ adt= ANIM_nla_mapping_get(&ac, ale);
+ frame= BKE_nla_tweakedit_remap(adt, frame, NLATIME_CONVERT_UNMAP);
+
+ /* apply inverse unit-mapping to value to get correct value for F-Curves */
+ val *= ANIM_unit_mapping_get_factor(ac.scene, ale->id, fcu, 1);
+
+ /* insert keyframe on the specified frame + value */
+ insert_vert_fcurve(fcu, frame, val, 0);
+ }
+ else {
+ /* warn about why this can't happen */
+ if (fcu->fpt)
+ BKE_report(op->reports, RPT_ERROR, "Keyframes cannot be added to sampled F-Curves");
+ else if (fcu->flag & FCURVE_PROTECTED)
+ BKE_report(op->reports, RPT_ERROR, "Active F-Curve is not editable");
+ else
+ BKE_report(op->reports, RPT_ERROR, "Remove F-Modifiers from F-Curve to add keyframes");
+ }
/* free temp data */
MEM_freeN(ale);
@@ -603,7 +625,8 @@ static short copy_graph_keys (bAnimContext *ac)
return ok;
}
-static short paste_graph_keys (bAnimContext *ac)
+static short paste_graph_keys (bAnimContext *ac,
+ const eKeyPasteOffset offset_mode, const eKeyMergeMode merge_mode)
{
ListBase anim_data = {NULL, NULL};
int filter, ok=0;
@@ -613,7 +636,7 @@ static short paste_graph_keys (bAnimContext *ac)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* paste keyframes */
- ok= paste_animedit_keys(ac, &anim_data);
+ ok= paste_animedit_keys(ac, &anim_data, offset_mode, merge_mode);
/* clean up */
BLI_freelistN(&anim_data);
@@ -661,14 +684,20 @@ void GRAPH_OT_copy (wmOperatorType *ot)
static int graphkeys_paste_exec(bContext *C, wmOperator *op)
{
bAnimContext ac;
+
+ const eKeyPasteOffset offset_mode= RNA_enum_get(op->ptr, "offset");
+ const eKeyMergeMode merge_mode= RNA_enum_get(op->ptr, "merge");
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
+ if(ac.reports==NULL) {
+ ac.reports= op->reports;
+ }
+
/* paste keyframes */
- if (paste_graph_keys(&ac)) {
- BKE_report(op->reports, RPT_ERROR, "No keyframes to paste");
+ if (paste_graph_keys(&ac, offset_mode, merge_mode)) {
return OPERATOR_CANCELLED;
}
@@ -689,11 +718,15 @@ void GRAPH_OT_paste (wmOperatorType *ot)
ot->description= "Paste keyframes from copy/paste buffer for the selected channels, starting on the current frame";
/* api callbacks */
+// ot->invoke= WM_operator_props_popup; // better wait for graph redo panel
ot->exec= graphkeys_paste_exec;
ot->poll= graphop_editable_keyframes_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "offset", keyframe_paste_offset_items, KEYFRAME_PASTE_OFFSET_CFRA_START, "Offset", "Paste time offset of keys");
+ RNA_def_enum(ot->srna, "merge", keyframe_paste_merge_items, KEYFRAME_PASTE_MERGE_MIX, "Type", "Method of merking pasted keys and existing");
}
/* ******************** Duplicate Keyframes Operator ************************* */
@@ -719,7 +752,7 @@ static void duplicate_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_duplicate_exec(bContext *C, wmOperator *op)
+static int graphkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -739,7 +772,7 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
graphkeys_duplicate_exec(C, op);
@@ -799,7 +832,7 @@ static void delete_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_delete_exec(bContext *C, wmOperator *op)
+static int graphkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -935,7 +968,7 @@ static void bake_graph_curves (bAnimContext *ac, int start, int end)
/* ------------------- */
-static int graphkeys_bake_exec(bContext *C, wmOperator *op)
+static int graphkeys_bake_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
Scene *scene= NULL;
@@ -1001,7 +1034,7 @@ typedef struct tSoundBakeInfo {
/* Sampling callback used to determine the value from the sound to
* save in the F-Curve at the specified frame
*/
-static float fcurve_samplingcb_sound (FCurve *fcu, void *data, float evaltime)
+static float fcurve_samplingcb_sound (FCurve *UNUSED(fcu), void *data, float evaltime)
{
tSoundBakeInfo *sbi= (tSoundBakeInfo *)data;
@@ -1149,7 +1182,7 @@ static void sample_graph_keys (bAnimContext *ac)
/* ------------------- */
-static int graphkeys_sample_exec(bContext *C, wmOperator *op)
+static int graphkeys_sample_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1191,7 +1224,7 @@ void GRAPH_OT_sample (wmOperatorType *ot)
/* ******************** Set Extrapolation-Type Operator *********************** */
/* defines for set extrapolation-type for selected keyframes tool */
-EnumPropertyItem prop_graphkeys_expo_types[] = {
+static EnumPropertyItem prop_graphkeys_expo_types[] = {
{FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant Extrapolation", ""},
{FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear Extrapolation", ""},
{0, NULL, 0, NULL, NULL}
@@ -1205,7 +1238,7 @@ static void setexpo_graph_keys(bAnimContext *ac, short mode)
int filter;
/* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* loop through setting mode per F-Curve */
@@ -1334,15 +1367,6 @@ void GRAPH_OT_interpolation_type (wmOperatorType *ot)
/* ******************** Set Handle-Type Operator *********************** */
-EnumPropertyItem graphkeys_handle_type_items[] = {
- {HD_FREE, "FREE", 0, "Free", ""},
- {HD_VECT, "VECTOR", 0, "Vector", ""},
- {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
- {0, "", 0, "", ""},
- {HD_AUTO, "AUTO", 0, "Auto", "Handles that are automatically adjusted upon moving the keyframe. Whole curve"},
- {HD_AUTO_ANIM, "ANIM_CLAMPED", 0, "Auto Clamped", "Auto handles clamped to not overshoot. Whole curve"},
- {0, NULL, 0, NULL, NULL}};
-
/* ------------------- */
/* this function is responsible for setting handle-type of selected keyframes */
@@ -1409,6 +1433,15 @@ static int graphkeys_handletype_exec(bContext *C, wmOperator *op)
void GRAPH_OT_handle_type (wmOperatorType *ot)
{
+ /* sync with editcurve_handle_type_items */
+ static EnumPropertyItem graphkeys_handle_type_items[] = {
+ {HD_AUTO, "AUTO", 0, "Automatic", "Handles that are automatically adjusted upon moving the keyframe. Whole curve"},
+ {HD_VECT, "VECTOR", 0, "Vector", ""},
+ {HD_ALIGN, "ALIGNED", 0, "Aligned", ""},
+ {HD_FREE, "FREE_ALIGN", 0, "Free", ""},
+ {HD_AUTO_ANIM, "ANIM_CLAMPED", 0, "Auto Clamped", "Auto handles clamped to not overshoot. Whole curve"},
+ {0, NULL, 0, NULL, NULL}};
+
/* identifiers */
ot->name= "Set Keyframe Handle Type";
ot->idname= "GRAPH_OT_handle_type";
@@ -1530,7 +1563,7 @@ void GRAPH_OT_euler_filter (wmOperatorType *ot)
/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
-static int graphkeys_framejump_exec(bContext *C, wmOperator *op)
+static int graphkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data= {NULL, NULL};
@@ -1604,7 +1637,7 @@ void GRAPH_OT_frame_jump (wmOperatorType *ot)
/* ******************** Snap Keyframes Operator *********************** */
/* defines for snap keyframes tool */
-EnumPropertyItem prop_graphkeys_snap_types[] = {
+static EnumPropertyItem prop_graphkeys_snap_types[] = {
{GRAPHKEYS_SNAP_CFRA, "CFRA", 0, "Current Frame", ""},
{GRAPHKEYS_SNAP_VALUE, "VALUE", 0, "Cursor Value", ""},
{GRAPHKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
@@ -1712,7 +1745,7 @@ void GRAPH_OT_snap (wmOperatorType *ot)
/* ******************** Mirror Keyframes Operator *********************** */
/* defines for mirror keyframes tool */
-EnumPropertyItem prop_graphkeys_mirror_types[] = {
+static EnumPropertyItem prop_graphkeys_mirror_types[] = {
{GRAPHKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current Frame", ""},
{GRAPHKEYS_MIRROR_VALUE, "VALUE", 0, "By Values over Cursor Value", ""},
{GRAPHKEYS_MIRROR_YAXIS, "YAXIS", 0, "By Times over Time=0", ""},
@@ -1743,13 +1776,7 @@ static void mirror_graph_keys(bAnimContext *ac, short mode)
TimeMarker *marker= NULL;
/* find first selected marker */
- if (ac->markers) {
- for (marker= ac->markers->first; marker; marker=marker->next) {
- if (marker->flag & SELECT) {
- break;
- }
- }
- }
+ marker= ED_markers_get_first_selected(ac->markers);
/* store marker's time (if available) */
if (marker)
@@ -1835,7 +1862,7 @@ void GRAPH_OT_mirror (wmOperatorType *ot)
/* ******************** Smooth Keyframes Operator *********************** */
-static int graphkeys_smooth_exec(bContext *C, wmOperator *op)
+static int graphkeys_smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
ListBase anim_data = {NULL, NULL};
@@ -1890,13 +1917,13 @@ void GRAPH_OT_smooth (wmOperatorType *ot)
/* ******************** Add F-Modifier Operator *********************** */
/* present a special customised popup menu for this, with some filtering */
-static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Curve Modifier", 0);
+ pup= uiPupMenuBegin(C, "Add F-Curve Modifier", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
@@ -1909,7 +1936,7 @@ static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *eve
continue;
/* create operator menu item with relevant properties filled in */
- props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, 0, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* the only thing that gets set from the menu is the type of F-Modifier to add */
RNA_enum_set(&props_ptr, "type", i);
/* the following properties are just repeats of existing ones... */
@@ -1940,7 +1967,7 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
/* filter data */
filter= (ANIMFILTER_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
if (RNA_boolean_get(op->ptr, "only_active"))
- filter |= ANIMFILTER_ACTIVE;
+ filter |= ANIMFILTER_ACTIVE; // FIXME: enforce in this case only a single channel to get handled?
else
filter |= (ANIMFILTER_SEL|ANIMFILTER_CURVEVISIBLE);
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
@@ -1954,7 +1981,7 @@ static int graph_fmodifier_add_exec(bContext *C, wmOperator *op)
fcm= add_fmodifier(&fcu->modifiers, type);
if (fcm)
set_active_fmodifier(&fcu->modifiers, fcm);
- else { // TODO: stop when this happens?
+ else {
BKE_report(op->reports, RPT_ERROR, "Modifier couldn't be added. See console for details.");
break;
}
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index a637ed15fcd..b596e659b63 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -48,10 +48,10 @@ struct ARegion *graph_has_buttons_region(struct ScrArea *sa);
/* ***************************************** */
/* graph_draw.c */
-void graph_draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
+void graph_draw_channel_names(struct bContext *C, struct bAnimContext *ac, struct ARegion *ar);
void graph_draw_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar, struct View2DGrid *grid, short sel);
-void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar, struct View2DGrid *grid);
+void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
/* ***************************************** */
/* graph_header.c */
@@ -66,14 +66,14 @@ void GRAPH_OT_select_column(struct wmOperatorType *ot);
void GRAPH_OT_select_linked(struct wmOperatorType *ot);
void GRAPH_OT_select_more(struct wmOperatorType *ot);
void GRAPH_OT_select_less(struct wmOperatorType *ot);
+void GRAPH_OT_select_leftright(struct wmOperatorType *ot);
void GRAPH_OT_clickselect(struct wmOperatorType *ot);
/* defines for left-right select tool */
enum {
- GRAPHKEYS_LRSEL_TEST = -1,
- GRAPHKEYS_LRSEL_NONE,
+ GRAPHKEYS_LRSEL_TEST = 0,
GRAPHKEYS_LRSEL_LEFT,
- GRAPHKEYS_LRSEL_RIGHT,
+ GRAPHKEYS_LRSEL_RIGHT
} eGraphKeys_LeftRightSelect_Mode;
/* defines for column-select mode */
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 0069e6e0675..93004a871d0 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,10 +29,11 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_sound.h"
@@ -158,7 +159,7 @@ static int graphview_cursor_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-void GRAPH_OT_cursor_set(wmOperatorType *ot)
+static void GRAPH_OT_cursor_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Cursor";
@@ -169,7 +170,7 @@ void GRAPH_OT_cursor_set(wmOperatorType *ot)
ot->exec= graphview_cursor_exec;
ot->invoke= graphview_cursor_invoke;
ot->modal= graphview_cursor_modal;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_UNDO;
@@ -181,7 +182,7 @@ void GRAPH_OT_cursor_set(wmOperatorType *ot)
/* Toggle Handles ----------------------------------------------------------------- */
-static int view_toggle_handles_exec (bContext *C, wmOperator *op)
+static int view_toggle_handles_exec (bContext *C, wmOperator *UNUSED(op))
{
SpaceIpo *sipo= CTX_wm_space_graph(C);
ARegion *ar= CTX_wm_region(C);
@@ -198,15 +199,16 @@ static int view_toggle_handles_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void GRAPH_OT_view_togglehandles (wmOperatorType *ot)
+static void GRAPH_OT_view_togglehandles (wmOperatorType *ot)
{
/* identification */
ot->name= "Show/Hide All Handles";
ot->idname= "GRAPH_OT_handles_view_toggle";
+ ot->description= "Toggle whether handles are drawn on all keyframes that need them";
/* callbacks */
ot->exec= view_toggle_handles_exec;
- ot->poll= ED_operator_ipo_active;
+ ot->poll= ED_operator_graphedit_active;
}
/* ************************** registration - operator types **********************************/
@@ -233,6 +235,7 @@ void graphedit_operatortypes(void)
WM_operatortype_append(GRAPH_OT_select_linked);
WM_operatortype_append(GRAPH_OT_select_more);
WM_operatortype_append(GRAPH_OT_select_less);
+ WM_operatortype_append(GRAPH_OT_select_leftright);
/* editing */
WM_operatortype_append(GRAPH_OT_snap);
@@ -285,20 +288,28 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
RNA_boolean_set(kmi->ptr, "column", 1);
- kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "left_right", GRAPHKEYS_LRSEL_TEST);
kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "curves", 1);
kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "curves", 1);
RNA_boolean_set(kmi->ptr, "extend", 1);
+ /* select left/right */
+ WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "extend", 1);
+
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_LEFT);
+ kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_RIGHT);
+
/* deselect all */
WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
/* borderselect */
- kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, 0, 0);
kmi = WM_keymap_add_item(keymap, "GRAPH_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "axis_range", 1);
@@ -331,10 +342,9 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "GRAPH_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_mirror", MKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_handle_type", HKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_handle_type", VKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "GRAPH_OT_interpolation_type", TKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
-
/* destructive */
WM_keymap_add_item(keymap, "GRAPH_OT_clean", OKEY, KM_PRESS, 0, 0);
@@ -350,7 +360,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* insertkey */
WM_keymap_add_item(keymap, "GRAPH_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_click_insert", LEFTMOUSE, KM_CLICK, KM_CTRL, 0);
/* copy/paste */
WM_keymap_add_item(keymap, "GRAPH_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
@@ -382,6 +392,8 @@ void graphedit_keymap(wmKeyConfig *keyconf)
/* keymap for all regions */
keymap= WM_keymap_find(keyconf, "Graph Editor Generic", SPACE_IPO, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_properties", NKEY, KM_PRESS, 0, 0);
+ /* extrapolation works on channels, not keys */
+ WM_keymap_add_item(keymap, "GRAPH_OT_extrapolation_type", EKEY, KM_PRESS, KM_SHIFT, 0);
/* channels */
/* Channels are not directly handled by the Graph Editor module, but are inherited from the Animation module.
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index cdc8166f2d6..0d6f097c613 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_object_types.h"
@@ -85,7 +86,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
int filter;
SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -95,7 +96,6 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
/* init BezTriple looping data */
- memset(&ked, 0, sizeof(KeyframeEditData));
test_cb= ANIM_editkeyframes_ok(BEZT_OK_SELECTED);
/* See if we should be selecting or deselecting */
@@ -539,7 +539,7 @@ void GRAPH_OT_select_column (wmOperatorType *ot)
/* ******************** Select Linked Operator *********************** */
-static int graphkeys_select_linked_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_linked_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -638,7 +638,7 @@ static void select_moreless_graph_keys (bAnimContext *ac, short mode)
/* ----------------- */
-static int graphkeys_select_more_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_more_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -672,7 +672,7 @@ void GRAPH_OT_select_more (wmOperatorType *ot)
/* ----------------- */
-static int graphkeys_select_less_exec (bContext *C, wmOperator *op)
+static int graphkeys_select_less_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -704,26 +704,166 @@ void GRAPH_OT_select_less (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/;
}
-/* ******************** Mouse-Click Select Operator *********************** */
-/* This operator works in one of three ways:
- * - 1) keyframe under mouse - no special modifiers
- * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier
- * - 3) column select all keyframes in frame under mouse - CTRL modifier
- *
- * In addition to these basic options, the SHIFT modifier can be used to toggle the
- * selection mode between replacing the selection (without) and inverting the selection (with).
- */
+/* ******************** Select Left/Right Operator ************************* */
+/* Select keyframes left/right of the current frame indicator */
/* defines for left-right select tool */
static EnumPropertyItem prop_graphkeys_leftright_select_types[] = {
{GRAPHKEYS_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""},
- {GRAPHKEYS_LRSEL_NONE, "OFF", 0, "Don't select", ""},
{GRAPHKEYS_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""},
{GRAPHKEYS_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""},
{0, NULL, 0, NULL, NULL}
};
-/* ------------------- */
+/* --------------------------------- */
+
+static void graphkeys_select_leftright (bAnimContext *ac, short leftright, short select_mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ KeyframeEditFunc ok_cb, select_cb;
+ KeyframeEditData ked= {{0}};
+ Scene *scene= ac->scene;
+
+ /* if select mode is replace, deselect all keyframes (and channels) first */
+ if (select_mode==SELECT_REPLACE) {
+ select_mode= SELECT_ADD;
+
+ /* deselect all other channels and keyframes */
+ ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ deselect_graph_keys(ac, 0, SELECT_SUBTRACT);
+ }
+
+ /* set callbacks and editing data */
+ ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
+ select_cb= ANIM_editkeyframes_select(select_mode);
+
+ if (leftright == GRAPHKEYS_LRSEL_LEFT) {
+ ked.f1 = MINAFRAMEF;
+ ked.f2 = (float)(CFRA + 0.1f);
+ }
+ else {
+ ked.f1 = (float)(CFRA - 0.1f);
+ ked.f2 = MAXFRAMEF;
+ }
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* select keys */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ AnimData *adt= ANIM_nla_mapping_get(ac, ale);
+
+ if (adt) {
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ }
+ else
+ ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&anim_data);
+}
+
+/* ----------------- */
+
+static int graphkeys_select_leftright_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+ short selectmode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* select mode is either replace (deselect all, then add) or add/extend */
+ if (RNA_boolean_get(op->ptr, "extend"))
+ selectmode= SELECT_INVERT;
+ else
+ selectmode= SELECT_REPLACE;
+
+ /* if "test" mode is set, we don't have any info to set this with */
+ if (leftright == GRAPHKEYS_LRSEL_TEST)
+ return OPERATOR_CANCELLED;
+
+ /* do the selecting now */
+ graphkeys_select_leftright(&ac, leftright, selectmode);
+
+ /* set notifier that keyframe selection (and channels too) have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static int graphkeys_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* handle mode-based testing */
+ if (leftright == GRAPHKEYS_LRSEL_TEST) {
+ Scene *scene= ac.scene;
+ ARegion *ar= ac.ar;
+ View2D *v2d= &ar->v2d;
+
+ short mval[2];
+ float x;
+
+ /* get mouse coordinates (in region coordinates) */
+ mval[0]= (event->x - ar->winrct.xmin);
+ mval[1]= (event->y - ar->winrct.ymin);
+
+ /* determine which side of the current frame mouse is on */
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
+ if (x < CFRA)
+ RNA_int_set(op->ptr, "mode", GRAPHKEYS_LRSEL_LEFT);
+ else
+ RNA_int_set(op->ptr, "mode", GRAPHKEYS_LRSEL_RIGHT);
+ }
+
+ /* perform selection */
+ return graphkeys_select_leftright_exec(C, op);
+}
+
+void GRAPH_OT_select_leftright (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Left/Right";
+ ot->idname= "GRAPH_OT_select_leftright";
+ ot->description= "Select keyframes to the left or the right of the current frame";
+
+ /* api callbacks */
+ ot->invoke= graphkeys_select_leftright_invoke;
+ ot->exec= graphkeys_select_leftright_exec;
+ ot->poll= graphop_visible_keyframes_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ ot->prop= RNA_def_enum(ot->srna, "mode", prop_graphkeys_leftright_select_types, GRAPHKEYS_LRSEL_TEST, "Mode", "");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", "");
+}
+
+/* ******************** Mouse-Click Select Operator *********************** */
+/* This operator works in one of three ways:
+ * - 1) keyframe under mouse - no special modifiers
+ * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier
+ * - 3) column select all keyframes in frame under mouse - CTRL modifier
+ *
+ * In addition to these basic options, the SHIFT modifier can be used to toggle the
+ * selection mode between replacing the selection (without) and inverting the selection (with).
+ */
/* temp info for caching handle vertices close */
typedef struct tNearestVertInfo {
@@ -886,7 +1026,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa
}
/* helper for find_nearest_fcurve_vert() - get the best match to use */
-static tNearestVertInfo *get_best_nearest_fcurve_vert (bAnimContext *ac, ListBase *matches)
+static tNearestVertInfo *get_best_nearest_fcurve_vert (ListBase *matches)
{
tNearestVertInfo *nvi = NULL;
short found = 0;
@@ -941,7 +1081,7 @@ static tNearestVertInfo *find_nearest_fcurve_vert (bAnimContext *ac, int mval[2]
get_nearest_fcurve_verts_list(ac, mval, &matches);
/* step 2: find the best vert */
- nvi= get_best_nearest_fcurve_vert(ac, &matches);
+ nvi= get_best_nearest_fcurve_vert(&matches);
BLI_freelistN(&matches);
@@ -956,6 +1096,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
{
SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
tNearestVertInfo *nvi;
+ BezTriple *bezt= NULL;
/* find the beztriple that we're selecting, and the handle that was clicked on */
nvi = find_nearest_fcurve_vert(ac, mval);
@@ -985,8 +1126,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
if ((curves_only == 0) && ((nvi->fcu->flag & FCURVE_PROTECTED)==0)) {
/* only if there's keyframe */
if (nvi->bezt) {
- BezTriple *bezt= nvi->bezt;
-
+ bezt= nvi->bezt; /* used to check bezt seletion is set */
/* depends on selection mode */
if (select_mode == SELECT_INVERT) {
/* keyframe - invert select of all */
@@ -1042,11 +1182,23 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
/* only change selection of channel when the visibility of keyframes doesn't depend on this */
if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) {
/* select or deselect curve? */
- if (select_mode == SELECT_INVERT)
- nvi->fcu->flag ^= FCURVE_SELECTED;
- else if (select_mode == SELECT_ADD)
- nvi->fcu->flag |= FCURVE_SELECTED;
-
+ if (bezt) {
+ /* take selection status from item that got hit, to prevent flip/flop on channel
+ * selection status when shift-selecting (i.e. "SELECT_INVERT") points
+ */
+ if (BEZSELECTED(bezt))
+ nvi->fcu->flag |= FCURVE_SELECTED;
+ else
+ nvi->fcu->flag &= ~FCURVE_SELECTED;
+ }
+ else {
+ /* didn't hit any channel, so just apply that selection mode to the curve's selection status */
+ if (select_mode == SELECT_INVERT)
+ nvi->fcu->flag ^= FCURVE_SELECTED;
+ else if (select_mode == SELECT_ADD)
+ nvi->fcu->flag |= FCURVE_SELECTED;
+ }
+
/* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
if (nvi->fcu->flag & FCURVE_SELECTED) {
int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
@@ -1059,67 +1211,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
}
/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */
-static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, short select_mode)
-{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
- KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked;
- Scene *scene= ac->scene;
-
- /* if select mode is replace, deselect all keyframes (and channels) first */
- if (select_mode==SELECT_REPLACE) {
- /* reset selection mode to add to selection */
- select_mode= SELECT_ADD;
-
- /* deselect all other keyframes */
- deselect_graph_keys(ac, 0, SELECT_SUBTRACT);
-
- /* deselect other channels too, but only only do this if
- * selection of channel when the visibility of keyframes
- * doesn't depend on this
- */
- if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0)
- ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- }
-
- /* set callbacks and editing data */
- ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE);
- select_cb= ANIM_editkeyframes_select(select_mode);
-
- memset(&ked, 0, sizeof(KeyframeEditFunc));
- if (leftright == GRAPHKEYS_LRSEL_LEFT) {
- ked.f1 = MINAFRAMEF;
- ked.f2 = (float)(CFRA + 0.1f);
- }
- else {
- ked.f1 = (float)(CFRA - 0.1f);
- ked.f2 = MAXFRAMEF;
- }
-
- /* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* select keys on the side where most data occurs */
- for (ale= anim_data.first; ale; ale= ale->next) {
- AnimData *adt= ANIM_nla_mapping_get(ac, ale);
-
- if (adt) {
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
- }
- else
- ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL);
- }
-
- /* Cleanup */
- BLI_freelistN(&anim_data);
-}
+/* (see graphkeys_select_leftright) */
/* Option 3) Selects all visible keyframes in the same frame as the mouse click */
static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short select_mode)
@@ -1228,24 +1320,12 @@ static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *ev
selectmode= SELECT_REPLACE;
/* figure out action to take */
- if (RNA_enum_get(op->ptr, "left_right")) {
- /* select all keys on same side of current frame as mouse */
- float x;
-
- UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
- if (x < CFRA)
- RNA_int_set(op->ptr, "left_right", GRAPHKEYS_LRSEL_LEFT);
- else
- RNA_int_set(op->ptr, "left_right", GRAPHKEYS_LRSEL_RIGHT);
-
- graphkeys_mselect_leftright(&ac, RNA_enum_get(op->ptr, "left_right"), selectmode);
- }
- else if (RNA_boolean_get(op->ptr, "column")) {
+ if (RNA_boolean_get(op->ptr, "column")) {
/* select all keyframes in the same frame as the one that was under the mouse */
graphkeys_mselect_column(&ac, mval, selectmode);
}
else if (RNA_boolean_get(op->ptr, "curves")) {
- /* select all keyframes in F-Curve under mouse */
+ /* select all keyframes in the same F-Curve as the one under the mouse */
mouse_graph_keys(&ac, mval, selectmode, 1);
}
else {
@@ -1272,8 +1352,6 @@ void GRAPH_OT_clickselect (wmOperatorType *ot)
ot->poll= graphop_visible_keyframes_poll;
/* id-props */
- // XXX should we make this into separate operators?
- RNA_def_enum(ot->srna, "left_right", prop_graphkeys_leftright_select_types, 0, "Left Right", ""); // CTRLKEY
RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
RNA_def_boolean(ot->srna, "column", 0, "Column Select", "Select all keyframes that occur on the same frame as the one under the mouse"); // ALTKEY
RNA_def_boolean(ot->srna, "curves", 0, "Only Curves", "Select all the keyframes in the curve"); // CTRLKEY + ALTKEY
diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c
index 927149a268d..7c3b61e79b3 100644
--- a/source/blender/editors/space_graph/graph_utils.c
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -87,57 +87,6 @@ bAnimListElem *get_active_fcurve_channel (bAnimContext *ac)
/* ************************************************************** */
/* Operator Polling Callbacks */
-/* check if any FModifiers to draw controls for - fcm is 'active' modifier
- * used for the polling callbacks + also for drawing
- */
-// TODO: restructure these tests
-// TODO: maybe for now, just allow editing always for now...
-short fcurve_needs_draw_fmodifier_controls (FCurve *fcu, FModifier *fcm)
-{
- /* don't draw if there aren't any modifiers at all */
- if (fcu->modifiers.first == NULL)
- return 0;
-
- /* if only one modifier
- * - don't draw if it is muted or disabled
- * - set it as the active one if no active one is present
- */
- if (fcu->modifiers.first == fcu->modifiers.last) {
- fcm= fcu->modifiers.first;
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
- return 0;
- }
-
- /* if there's an active modifier - don't draw if it doesn't drastically
- * alter the curve...
- */
- if (fcm) {
- switch (fcm->type) {
- /* clearly harmless */
- case FMODIFIER_TYPE_CYCLES:
- return 0;
- case FMODIFIER_TYPE_STEPPED:
- return 0;
-
- /* borderline... */
- case FMODIFIER_TYPE_NOISE:
- return 0;
- }
- }
-
- /* if only active modifier - don't draw if it is muted or disabled */
- if (fcm) {
- if (fcm->flag & (FMODIFIER_FLAG_DISABLED|FMODIFIER_FLAG_MUTED))
- return 0;
- }
-
- /* if we're still here, this means that there are modifiers with controls to be drawn */
- // FIXME: what happens if all the modifiers were muted/disabled
- return 1;
-}
-
-/* ------------------- */
-
/* Check if there are any visible keyframes (for selection tools) */
int graphop_visible_keyframes_poll (bContext *C)
{
@@ -167,7 +116,6 @@ int graphop_visible_keyframes_poll (bContext *C)
for (ale = anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->data;
- FModifier *fcm;
/* visible curves for selection must fulfull the following criteria:
* - it has bezier keyframes
@@ -176,10 +124,10 @@ int graphop_visible_keyframes_poll (bContext *C)
*/
if (fcu->bezt == NULL)
continue;
- fcm= find_active_fmodifier(&fcu->modifiers);
-
- found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
- if (found) break;
+ if (fcurve_are_keyframes_usable(fcu)) {
+ found = 1;
+ break;
+ }
}
/* cleanup and return findings */
@@ -216,7 +164,6 @@ int graphop_editable_keyframes_poll (bContext *C)
for (ale = anim_data.first; ale; ale= ale->next) {
FCurve *fcu= (FCurve *)ale->data;
- FModifier *fcm;
/* editable curves must fulfull the following criteria:
* - it has bezier keyframes
@@ -226,10 +173,10 @@ int graphop_editable_keyframes_poll (bContext *C)
*/
if (fcu->bezt == NULL)
continue;
- fcm= find_active_fmodifier(&fcu->modifiers);
-
- found= (fcurve_needs_draw_fmodifier_controls(fcu, fcm) == 0);
- if (found) break;
+ if (fcurve_is_keyframable(fcu)) {
+ found = 1;
+ break;
+ }
}
/* cleanup and return findings */
@@ -261,6 +208,11 @@ int graphop_active_fcurve_poll (bContext *C)
/* free temp data... */
has_fcurve= ((ale->data) && (ale->type == ANIMTYPE_FCURVE));
+ if(has_fcurve) {
+ FCurve *fcu= (FCurve *)ale->data;
+ has_fcurve= (fcu->flag & FCURVE_VISIBLE)!=0;
+ }
+
MEM_freeN(ale);
/* return success */
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index ca372d74da6..38919076b13 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,6 +37,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -44,6 +45,7 @@
#include "BKE_fcurve.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "ED_anim_api.h"
#include "ED_markers.h"
@@ -175,7 +177,7 @@ static void graph_free(SpaceLink *sl)
/* spacetype; init callback */
-static void graph_init(struct wmWindowManager *wm, ScrArea *sa)
+static void graph_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceIpo *sipo= (SpaceIpo *)sa->spacedata.first;
@@ -229,17 +231,17 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* grid */
unitx= (sipo->flag & SIPO_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMESCALE;
- grid= UI_view2d_grid_calc(C, v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unitx, V2D_GRID_NOCLAMP, unity, V2D_GRID_NOCLAMP, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
/* draw data */
if (ANIM_animdata_get_context(C, &ac)) {
/* draw ghost curves */
- graph_draw_ghost_curves(&ac, sipo, ar, grid);
+ graph_draw_ghost_curves(&ac, sipo, ar);
/* draw curves twice - unselected, then selected, so that the are fewer occlusion problems */
graph_draw_curves(&ac, sipo, ar, grid, 0);
@@ -282,11 +284,11 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -314,7 +316,6 @@ static void graph_channel_area_init(wmWindowManager *wm, ARegion *ar)
static void graph_channel_area_draw(const bContext *C, ARegion *ar)
{
- SpaceIpo *sipo= CTX_wm_space_graph(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -325,11 +326,11 @@ static void graph_channel_area_draw(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* draw channels */
if (ANIM_animdata_get_context(C, &ac)) {
- graph_draw_channel_names((bContext*)C, &ac, sipo, ar);
+ graph_draw_channel_names((bContext*)C, &ac, ar);
}
/* reset view matrix */
@@ -342,7 +343,7 @@ static void graph_channel_area_draw(const bContext *C, ARegion *ar)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void graph_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void graph_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -539,24 +540,22 @@ static void graph_refresh(const bContext *C, ScrArea *sa)
/* F-Curve's array index is automatically mapped to RGB values. This works best of 3-value vectors.
* TODO: find a way to module the hue so that not all curves have same color...
*/
-
- /* standard table of colors to use */
- const float _colorsets[4][3]=
- {
- {1.0f, 0.0f, 0.0f}, /* red */
- {0.0f, 1.0f, 0.0f}, /* green */
- {0.0f, 0.0f, 1.0f}, /* blue */
- {0.3f, 0.8f, 1.0f}, /* 'unknown' color - bluish so as to not conflict with handles */
- };
-
- /* simply copy the relevant color over to the F-Curve */
- if ((fcu->array_index >= 0) && (fcu->array_index < 3)) {
- /* if the index is within safe bounds, use index to access table */
- VECCOPY(fcu->color, _colorsets[fcu->array_index]);
- }
- else {
- /* use the 'unknown' color... */
- VECCOPY(fcu->color, _colorsets[3]);
+ float *col= fcu->color;
+
+ switch(fcu->array_index) {
+ case 0:
+ col[0]= 1.0f; col[1]= 0.0f; col[2]= 0.0f;
+ break;
+ case 1:
+ col[0]= 0.0f; col[1]= 1.0f; col[2]= 0.0f;
+ break;
+ case 2:
+ col[0]= 0.0f; col[1]= 0.0f; col[2]= 1.0f;
+ break;
+ default:
+ /* 'unknown' color - bluish so as to not conflict with handles */
+ col[0]= 0.3f; col[1]= 0.8f; col[2]= 1.0f;
+ break;
}
}
break;
@@ -602,7 +601,7 @@ void ED_spacetype_ipo(void)
art->init= graph_main_area_init;
art->draw= graph_main_area_draw;
art->listener= graph_region_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt
index 59749a47afd..8568278d0bb 100644
--- a/source/blender/editors/space_image/CMakeLists.txt
+++ b/source/blender/editors/space_image/CMakeLists.txt
@@ -19,36 +19,51 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
+ ../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
../../bmesh
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
- ../../render/extern/include
../../windowmanager
+ ../../render/extern/include
+ ../../../../intern/guardedalloc
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ image_buttons.c
+ image_draw.c
+ image_header.c
+ image_ops.c
+ image_render.c
+ space_image.c
+
+ image_intern.h
+)
+
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
+
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_LCMS)
- SET(INC ${INC} ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_LCMS)
+ set(INC ${INC} ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-BLENDERLIB(bf_editor_space_image "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_image "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_image/SConscript b/source/blender/editors/space_image/SConscript
index 933a30808dc..7d966025006 100644
--- a/source/blender/editors/space_image/SConscript
+++ b/source/blender/editors/space_image/SConscript
@@ -3,20 +3,28 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../render/extern/include ../../makesrna ../../bmesh'
+=======
+incs += ' ../../render/extern/include ../../makesrna ../../blenloader'
+>>>>>>> .merge-right.r35190
defs = []
if env['WITH_BF_LCMS']:
- defs.append('WITH_LCMS')
- incs += ' ' + env['BF_LCMS_INC']
+ defs.append('WITH_LCMS')
+ incs += ' ' + env['BF_LCMS_INC']
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
+if env['WITH_BF_OPENJPEG']:
+ defs.append('WITH_OPENJPEG')
if env['WITH_BF_TIFF']:
- defs.append('WITH_TIFF')
-
+ defs.append('WITH_TIFF')
+if env['WITH_BF_CINEON']:
+ defs.append('WITH_CINEON')
+
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 44f3f5f5764..dfaeccd7993 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
@@ -98,7 +99,7 @@
static void image_editvertex_buts(const bContext *C, uiBlock *block);
-static void do_image_panel_events(bContext *C, void *arg, int event)
+static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
{
SpaceImage *sima= CTX_wm_space_image(C);
@@ -138,21 +139,28 @@ static void image_info(Image *ima, ImBuf *ibuf, char *str)
if(ibuf->rect_float) {
if(ibuf->channels!=4) {
- sprintf(str+ofs, "%d float channel(s)", ibuf->channels);
+ ofs+= sprintf(str+ofs, "%d float channel(s)", ibuf->channels);
}
else if(ibuf->depth==32)
- strcat(str, " RGBA float");
+ ofs+= sprintf(str+ofs, " RGBA float");
else
- strcat(str, " RGB float");
+ ofs+= sprintf(str+ofs, " RGB float");
}
else {
if(ibuf->depth==32)
- strcat(str, " RGBA byte");
+ ofs+= sprintf(str+ofs, " RGBA byte");
else
- strcat(str, " RGB byte");
+ ofs+= sprintf(str+ofs, " RGB byte");
}
if(ibuf->zbuf || ibuf->zbuf_float)
- strcat(str, " + Z");
+ ofs+= sprintf(str+ofs, " + Z");
+
+ if(ima->source==IMA_SRC_SEQUENCE) {
+ char *file= BLI_last_slash(ibuf->name);
+ if(file==NULL) file= ibuf->name;
+ else file++;
+ sprintf(str+ofs, ", %s", file);
+ }
}
@@ -285,11 +293,18 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
/* is used for both read and write... */
-static int image_panel_poll(const bContext *C, PanelType *pt)
+static int image_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceImage *sima= CTX_wm_space_image(C);
+ ImBuf *ibuf;
+ void *lock;
+ int result;
+
+ ibuf= ED_space_image_acquire_buffer(sima, &lock);
+ result= ibuf && ibuf->rect_float;
+ ED_space_image_release_buffer(sima, lock);
- return ED_space_image_has_buffer(sima);
+ return result;
}
static void image_panel_curves(const bContext *C, Panel *pa)
@@ -320,6 +335,8 @@ static void image_panel_curves(const bContext *C, Panel *pa)
#if 0
/* 0: disable preview
otherwise refresh preview
+
+ XXX if you put this back, also check XXX in image_main_area_draw() */
*/
void image_preview_event(int event)
{
@@ -455,7 +472,7 @@ static void image_panel_preview(ScrArea *sa, short cntrl) // IMAGE_HANDLER_PREVI
/* ********************* callbacks for standard image buttons *************** */
-static char *slot_menu()
+static char *slot_menu(void)
{
char *str;
int a, slot;
@@ -471,7 +488,8 @@ static char *slot_menu()
return str;
}
-static char *layer_menu(RenderResult *rr, short *curlay)
+/* TODO, curlay should be removed? */
+static char *layer_menu(RenderResult *rr, short *UNUSED(curlay))
{
RenderLayer *rl;
int len= 64 + 32*BLI_countlist(&rr->layers);
@@ -687,7 +705,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr,
if(rr==NULL || iuser==NULL)
return;
if(rr->layers.first==NULL) {
- uiItemL(row, "No Layers in Render Result.", 0);
+ uiItemL(row, "No Layers in Render Result.", ICON_NULL);
return;
}
@@ -717,7 +735,7 @@ typedef struct RNAUpdateCb {
ImageUser *iuser;
} RNAUpdateCb;
-static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
+static void rna_update_cb(bContext *C, void *arg_cb, void *UNUSED(arg))
{
RNAUpdateCb *cb= (RNAUpdateCb*)arg_cb;
@@ -731,7 +749,7 @@ static void rna_update_cb(bContext *C, void *arg_cb, void *arg_unused)
RNA_property_update(C, &cb->ptr, cb->prop);
}
-void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *userptr, int compact)
+void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *propname, PointerRNA *userptr, int compact)
{
PropertyRNA *prop;
PointerRNA imaptr;
@@ -748,15 +766,21 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
if(!ptr->data)
return;
-
+
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
printf("uiTemplateImage: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
+ if(RNA_property_type(prop) != PROP_POINTER) {
+ printf("uiTemplateImage: expected pointer property for %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
+
block= uiLayoutGetBlock(layout);
+
imaptr= RNA_property_pointer_get(ptr, prop);
ima= imaptr.data;
iuser= userptr->data;
@@ -781,8 +805,8 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, ima->id.name+2, 0);
- uiItemL(layout, str, 0);
+ uiItemL(layout, ima->id.name+2, ICON_NULL);
+ uiItemL(layout, str, ICON_NULL);
if(ima->type==IMA_TYPE_COMPOSITE) {
// XXX not working yet
@@ -814,7 +838,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
}
else {
row= uiLayoutRow(layout, 0);
- uiItemR(row, &imaptr, "source", 0, NULL, 0);
+ uiItemR(row, &imaptr, "source", 0, NULL, ICON_NULL);
if(ima->source != IMA_SRC_GENERATED) {
row= uiLayoutRow(layout, 1);
@@ -828,7 +852,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
row= uiLayoutRow(split, 1);
uiLayoutSetEnabled(row, ima->packedfile==NULL);
- uiItemR(row, &imaptr, "filepath", 0, "", 0);
+ uiItemR(row, &imaptr, "filepath", 0, "", ICON_NULL);
uiItemO(row, "", ICON_FILE_REFRESH, "image.reload");
}
@@ -852,7 +876,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
ibuf= BKE_image_acquire_ibuf(ima, iuser, &lock);
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, str, 0);
+ uiItemL(layout, str, ICON_NULL);
}
}
@@ -863,13 +887,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_fields", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_fields", 0, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "use_fields"));
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_premultiply", 0, NULL, 0);
+ uiItemR(col, &imaptr, "use_premultiply", 0, NULL, ICON_NULL);
}
}
@@ -882,30 +906,30 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propn
sprintf(str, "(%d) Frames", iuser->framenr);
row= uiLayoutRow(col, 1);
- uiItemR(col, userptr, "frame_duration", 0, str, 0);
+ uiItemR(col, userptr, "frame_duration", 0, str, ICON_NULL);
if(ima->anim) {
block= uiLayoutGetBlock(row);
but= uiDefBut(block, BUT, 0, "Match Movie Length", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames to match the movie or sequence.");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
- uiItemR(col, userptr, "frame_start", 0, "Start", 0);
- uiItemR(col, userptr, "frame_offset", 0, NULL, 0);
+ uiItemR(col, userptr, "frame_start", 0, "Start", ICON_NULL);
+ uiItemR(col, userptr, "frame_offset", 0, NULL, ICON_NULL);
col= uiLayoutColumn(split, 0);
- uiItemR(col, userptr, "fields_per_frame", 0, "Fields", 0);
- uiItemR(col, userptr, "use_auto_refresh", 0, NULL, 0);
- uiItemR(col, userptr, "use_cyclic", 0, NULL, 0);
+ uiItemR(col, userptr, "fields_per_frame", 0, "Fields", ICON_NULL);
+ uiItemR(col, userptr, "use_auto_refresh", 0, NULL, ICON_NULL);
+ uiItemR(col, userptr, "use_cyclic", 0, NULL, ICON_NULL);
}
else if(ima->source==IMA_SRC_GENERATED) {
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 1);
- uiItemR(col, &imaptr, "generated_width", 0, "X", 0);
- uiItemR(col, &imaptr, "generated_height", 0, "Y", 0);
+ uiItemR(col, &imaptr, "generated_width", 0, "X", ICON_NULL);
+ uiItemR(col, &imaptr, "generated_height", 0, "Y", ICON_NULL);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
}
@@ -929,7 +953,7 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
}
}
-static int image_panel_uv_poll(const bContext *C, PanelType *pt)
+static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
{
Object *obedit= CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
@@ -974,7 +998,7 @@ void image_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int image_properties(bContext *C, wmOperator *op)
+static int image_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= image_has_buttons_region(sa);
@@ -989,6 +1013,7 @@ void IMAGE_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "IMAGE_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= image_properties;
ot->poll= ED_operator_image_active;
@@ -997,7 +1022,7 @@ void IMAGE_OT_properties(wmOperatorType *ot)
ot->flag= 0;
}
-static int image_scopes(bContext *C, wmOperator *op)
+static int image_scopes(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= image_has_scope_region(sa);
@@ -1012,6 +1037,7 @@ void IMAGE_OT_scopes(wmOperatorType *ot)
{
ot->name= "Scopes";
ot->idname= "IMAGE_OT_scopes";
+ ot->description= "Toggle display scopes panel";
ot->exec= image_scopes;
ot->poll= ED_operator_image_active;
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index 98c178cca19..e19a001f005 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,7 +39,10 @@
#include "DNA_brush_types.h"
#include "PIL_time.h"
+
#include "BLI_threads.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -49,9 +52,15 @@
#include "BKE_image.h"
#include "BKE_paint.h"
+#ifdef WITH_LCMS
+#include "BKE_colortools.h"
+#endif
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BLF_api.h"
+
#include "ED_gpencil.h"
#include "ED_image.h"
@@ -66,7 +75,7 @@
#define HEADER_HEIGHT 18
-static void image_verify_buffer_float(SpaceImage *sima, Image *ima, ImBuf *ibuf, int color_manage)
+static void image_verify_buffer_float(Image *ima, ImBuf *ibuf, int color_manage)
{
/* detect if we need to redo the curve map.
ibuf->rect is zero for compositor and render results after change
@@ -75,7 +84,7 @@ static void image_verify_buffer_float(SpaceImage *sima, Image *ima, ImBuf *ibuf,
NOTE: if float buffer changes, we have to manually remove the rect
*/
- if(ibuf->rect_float && ibuf->rect==NULL) {
+ if(ibuf->rect_float && (ibuf->rect==NULL || (ibuf->userflags & IB_RECT_INVALID)) ) {
if(color_manage) {
if(ima && ima->source == IMA_SRC_VIEWER)
ibuf->profile = IB_PROFILE_LINEAR_RGB;
@@ -121,36 +130,41 @@ static void draw_render_info(Scene *scene, Image *ima, ARegion *ar)
void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf)
{
char str[256];
- int ofs;
-
- ofs= sprintf(str, "X: %d Y: %d ", x, y);
+ int ofs= 0;
+
+ ofs += BLI_snprintf(str + ofs, sizeof(str)-ofs, "X: %4d Y: %4d ", x, y);
if(cp)
- ofs+= sprintf(str+ofs, "| R: %d G: %d B: %d A: %d ", cp[0], cp[1], cp[2], cp[3]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]);
if(fp) {
if(channels==4)
- ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
else if(channels==1)
- ofs+= sprintf(str+ofs, "| Val: %.3f ", fp[0]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Val: %.3f ", fp[0]);
else if(channels==3)
- ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]);
}
if(zp)
- ofs+= sprintf(str+ofs, "| Z: %.4f ", 0.5+0.5*(((float)*zp)/(float)0x7fffffff));
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.4f ", 0.5+0.5*(((float)*zp)/(float)0x7fffffff));
if(zpf)
- ofs+= sprintf(str+ofs, "| Z: %.3f ", *zpf);
-
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.3f ", *zpf);
+ (void)ofs;
+
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glColor4f(.0,.0,.0,.25);
- glRectf(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 30.0);
+ glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20);
glDisable(GL_BLEND);
glColor3ub(255, 255, 255);
- UI_DrawString(10, 10, str);
+ // UI_DrawString(6, 6, str); // works ok but fixed width is nicer.
+ BLF_size(blf_mono_font, 11, 72);
+ BLF_position(blf_mono_font, 6, 6, 0);
+ BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+
}
/* image drawing */
@@ -363,7 +377,7 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image
}
#ifdef WITH_LCMS
else if(sima->flag & SI_COLOR_CORRECTION) {
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
if(sima_draw_colorcorrected_pixels(x, y, ibuf)==0) {
unsigned char col1[3]= {100, 0, 100}, col2[3]= {160, 0, 160}; /* pink says 'warning' in blender land */
@@ -378,12 +392,12 @@ static void draw_image_buffer(SpaceImage *sima, ARegion *ar, Scene *scene, Image
sima_draw_alpha_backdrop(x, y, ibuf->x, ibuf->y, zoomx, zoomy, col1, col2);
glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
/* we don't draw floats buffers directly but
* convert them, and optionally apply curves */
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
if(ibuf->rect)
glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
@@ -436,7 +450,7 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene,
sima->curtile = ima->xrep*ima->yrep - 1;
/* create char buffer from float if needed */
- image_verify_buffer_float(sima, ima, ibuf, color_manage);
+ image_verify_buffer_float(ima, ibuf, color_manage);
/* retrieve part of image buffer */
dx= ibuf->x/ima->xrep;
@@ -461,13 +475,18 @@ static void draw_image_buffer_tiled(SpaceImage *sima, ARegion *ar, Scene *scene,
static void draw_image_buffer_repeated(SpaceImage *sima, ARegion *ar, Scene *scene, Image *ima, ImBuf *ibuf, float zoomx, float zoomy)
{
- float x, y;
- double time_current;
-
- time_current = PIL_check_seconds_timer();
+ const double time_current= PIL_check_seconds_timer();
+
+ const int xmax= ceil(ar->v2d.cur.xmax);
+ const int ymax= ceil(ar->v2d.cur.ymax);
+ const int xmin= floor(ar->v2d.cur.xmin);
+ const int ymin= floor(ar->v2d.cur.ymin);
+
+ int x;
- for(x=floor(ar->v2d.cur.xmin); x<ar->v2d.cur.xmax; x += 1.0f) {
- for(y=floor(ar->v2d.cur.ymin); y<ar->v2d.cur.ymax; y += 1.0f) {
+ for(x=xmin; x<xmax; x++) {
+ int y;
+ for(y=ymin; y<ymax; y++) {
if(ima && (ima->tpageflag & IMA_TILES))
draw_image_buffer_tiled(sima, ar, scene, ima, ibuf, x, y, zoomx, zoomy);
else
@@ -575,7 +594,7 @@ static unsigned char *get_alpha_clone_image(Scene *scene, int *width, int *heigh
return rect;
}
-static void draw_image_paint_helpers(SpaceImage *sima, ARegion *ar, Scene *scene, float zoomx, float zoomy)
+static void draw_image_paint_helpers(ARegion *ar, Scene *scene, float zoomx, float zoomy)
{
Brush *brush;
int x, y, w, h;
@@ -654,7 +673,8 @@ void draw_image_main(SpaceImage *sima, ARegion *ar, Scene *scene)
draw_image_buffer(sima, ar, scene, ima, ibuf, 0.0f, 0.0f, zoomx, zoomy);
/* paint helpers */
- draw_image_paint_helpers(sima, ar, scene, zoomx, zoomy);
+ if(sima->flag & SI_DRAWTOOL)
+ draw_image_paint_helpers(ar, scene, zoomx, zoomy);
/* XXX integrate this code */
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index 0ec917846fd..be481053693 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,28 +33,24 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_mesh.h"
-
#include "ED_image.h"
#include "WM_types.h"
-
#include "UI_interface.h"
-
-
#include "image_intern.h"
/********************** toolbox operator *********************/
-static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
@@ -64,13 +60,13 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event)
show_uvedit= ED_space_image_show_uvedit(sima, obedit);
- pup= uiPupMenuBegin(C, "Toolbox", 0);
+ pup= uiPupMenuBegin(C, "Toolbox", ICON_NULL);
layout= uiPupMenuLayout(pup);
- uiItemM(layout, C, "IMAGE_MT_view", NULL, 0);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, 0);
- uiItemM(layout, C, "IMAGE_MT_image", NULL, 0);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, 0);
+ uiItemM(layout, C, "IMAGE_MT_view", NULL, ICON_NULL);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, ICON_NULL);
+ uiItemM(layout, C, "IMAGE_MT_image", NULL, ICON_NULL);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, ICON_NULL);
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index c038f58375c..f3804fbc453 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -46,6 +46,8 @@ struct bNodeTree;
struct ARegion *image_has_buttons_region(struct ScrArea *sa);
struct ARegion *image_has_scope_region(struct ScrArea *sa);
+extern const char *image_context_dir[]; /* doc access */
+
/* image_header.c */
void image_header_buttons(const struct bContext *C, struct ARegion *ar);
@@ -77,6 +79,8 @@ void IMAGE_OT_save_sequence(struct wmOperatorType *ot);
void IMAGE_OT_pack(struct wmOperatorType *ot);
void IMAGE_OT_unpack(struct wmOperatorType *ot);
+void IMAGE_OT_invert(struct wmOperatorType *ot);
+
void IMAGE_OT_cycle_render_slot(struct wmOperatorType *ot);
void IMAGE_OT_sample(struct wmOperatorType *ot);
@@ -85,9 +89,6 @@ void IMAGE_OT_curves_point_set(struct wmOperatorType *ot);
void IMAGE_OT_record_composite(struct wmOperatorType *ot);
-/* uvedit_draw.c */
-void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
-
/* image_panels.c */
struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree);
void image_buttons_register(struct ARegionType *art);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 3b335487557..19fe795bb58 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +32,10 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_node_types.h"
#include "DNA_packedFile_types.h"
@@ -50,9 +54,6 @@
#include "BKE_screen.h"
#include "BKE_tessmesh.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -68,6 +69,7 @@
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_uvedit.h"
+#include "ED_util.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -128,6 +130,7 @@ static int space_image_buffer_exists_poll(bContext *C)
static int space_image_file_exists_poll(bContext *C)
{
if(space_image_buffer_exists_poll(C)) {
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
void *lock;
@@ -137,7 +140,7 @@ static int space_image_file_exists_poll(bContext *C)
ibuf= ED_space_image_acquire_buffer(sima, &lock);
if(ibuf) {
BLI_strncpy(name, ibuf->name, FILE_MAX);
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
poll= (BLI_exists(name) && BLI_is_writable(name));
}
ED_space_image_release_buffer(sima, lock);
@@ -436,20 +439,16 @@ void IMAGE_OT_view_zoom(wmOperatorType *ot)
* Default behavior is to reset the position of the image and set the zoom to 1
* If the image will not fit within the window rectangle, the zoom is adjusted */
-static int view_all_exec(bContext *C, wmOperator *op)
+static int view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima;
ARegion *ar;
- Scene *scene;
- Object *obedit;
float aspx, aspy, zoomx, zoomy, w, h;
int width, height;
/* retrieve state */
sima= CTX_wm_space_image(C);
ar= CTX_wm_region(C);
- scene= (Scene*)CTX_data_scene(C);
- obedit= CTX_data_edit_object(C);
ED_space_image_size(sima, &width, &height);
ED_space_image_aspect(sima, &aspx, &aspy);
@@ -490,7 +489,7 @@ void IMAGE_OT_view_all(wmOperatorType *ot)
/********************** view selected operator *********************/
-static int view_selected_exec(bContext *C, wmOperator *op)
+static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima;
ARegion *ar;
@@ -547,7 +546,7 @@ void IMAGE_OT_view_selected(wmOperatorType *ot)
/********************** view zoom in/out operator *********************/
-static int view_zoom_in_exec(bContext *C, wmOperator *op)
+static int view_zoom_in_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
@@ -570,7 +569,7 @@ void IMAGE_OT_view_zoom_in(wmOperatorType *ot)
ot->poll= space_image_main_area_poll;
}
-static int view_zoom_out_exec(bContext *C, wmOperator *op)
+static int view_zoom_out_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ARegion *ar= CTX_wm_region(C);
@@ -683,7 +682,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
op->customdata= NULL;
@@ -692,9 +691,10 @@ static int open_cancel(bContext *C, wmOperator *op)
static int open_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima= CTX_wm_space_image(C);
+ SpaceImage *sima= CTX_wm_space_image(C); /* XXX other space types can call */
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
+ ImageUser *iuser= NULL;
PropertyPointerRNA *pprop;
PointerRNA idptr;
Image *ima= NULL;
@@ -705,7 +705,7 @@ static int open_exec(bContext *C, wmOperator *op)
errno= 0;
- ima= BKE_add_image_file(str, scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(str);
if(!ima) {
if(op->customdata) MEM_freeN(op->customdata);
@@ -728,11 +728,25 @@ static int open_exec(bContext *C, wmOperator *op)
RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
RNA_property_update(C, &pprop->ptr, pprop->prop);
}
- else if(sima)
+ else if(sima) {
ED_space_image_set(C, sima, scene, obedit, ima);
+ iuser= &sima->iuser;
+ }
+ else {
+ Tex *tex= CTX_data_pointer_get_type(C, "texture", &RNA_Texture).data;
+ if(tex && tex->type==TEX_IMAGE)
+ iuser= &tex->iuser;
+
+ }
+
+ /* initialize because of new image */
+ if(iuser) {
+ iuser->sfra= 1;
+ iuser->offset= 0;
+ iuser->fie_ima= 2;
+ }
- // XXX other users?
- BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD);
+ BKE_image_signal(ima, iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
MEM_freeN(op->customdata);
@@ -740,9 +754,9 @@ static int open_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- SpaceImage *sima= CTX_wm_space_image(C);
+ SpaceImage *sima= CTX_wm_space_image(C); /* XXX other space types can call */
char *path=U.textudir;
Image *ima= NULL;
@@ -773,6 +787,7 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
+/* called by other space types too */
void IMAGE_OT_open(wmOperatorType *ot)
{
/* identifiers */
@@ -802,7 +817,7 @@ static int replace_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
RNA_string_get(op->ptr, "filepath", str);
- BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */
+ BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)); /* we cant do much if the str is longer then 240 :/ */
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -810,7 +825,7 @@ static int replace_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int replace_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int replace_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
@@ -850,60 +865,74 @@ void IMAGE_OT_replace(wmOperatorType *ot)
/* assumes name is FILE_MAX */
/* ima->name and ibuf->name should end up the same */
-static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *path)
+static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOperator *op, char *path, int do_newpath)
{
Image *ima= ED_space_image(sima);
void *lock;
ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock);
if (ibuf) {
- int relative= RNA_boolean_get(op->ptr, "relative_path");
- int save_copy= (RNA_struct_find_property(op->ptr, "copy") && RNA_boolean_get(op->ptr, "copy"));
+ Main *bmain= CTX_data_main(C);
+ const short relative= (RNA_struct_find_property(op->ptr, "relative_path") && RNA_boolean_get(op->ptr, "relative_path"));
+ const short save_copy= (RNA_struct_find_property(op->ptr, "copy") && RNA_boolean_get(op->ptr, "copy"));
+ short ok= FALSE;
+
+ BLI_path_abs(path, bmain->name);
+ /* old global to ensure a 2nd save goes to same dir */
+ BLI_strncpy(G.ima, path, sizeof(G.ima));
+
+ WM_cursor_wait(1);
+
+ if(ima->type == IMA_TYPE_R_RESULT) {
+ /* enforce user setting for RGB or RGBA, but skip BW */
+ if(scene->r.planes==32) {
+ ibuf->depth= 32;
+ }
+ else if(scene->r.planes==24) {
+ ibuf->depth= 24;
+ }
+ }
+ else {
+ /* TODO, better solution, if a 24bit image is painted onto it may contain alpha */
+ if(ibuf->userflags & IB_BITMAPDIRTY) { /* it has been painted onto */
+ /* checks each pixel, not ideal */
+ ibuf->depth= BKE_alphatest_ibuf(ibuf) ? 32 : 24;
+ }
+ }
- BLI_path_abs(path, G.sce);
-
if(scene->r.scemode & R_EXTENSION) {
BKE_add_image_extension(path, sima->imtypenr);
}
- /* enforce user setting for RGB or RGBA, but skip BW */
- if(scene->r.planes==32)
- ibuf->depth= 32;
- else if(scene->r.planes==24)
- ibuf->depth= 24;
-
- WM_cursor_wait(1);
-
if(sima->imtypenr==R_MULTILAYER) {
RenderResult *rr= BKE_image_acquire_renderresult(scene, ima);
if(rr) {
RE_WriteRenderResult(rr, path, scene->r.quality);
-
- if(relative)
- BLI_path_rel(path, G.sce); /* only after saving */
-
- if(!save_copy) {
- BLI_strncpy(ima->name, path, sizeof(ima->name));
- BLI_strncpy(ibuf->name, path, sizeof(ibuf->name));
-
- /* should be function? nevertheless, saving only happens here */
- for(ibuf= ima->ibufs.first; ibuf; ibuf= ibuf->next)
- ibuf->userflags &= ~IB_BITMAPDIRTY;
- }
+ ok= TRUE;
}
- else
+ else {
BKE_report(op->reports, RPT_ERROR, "Did not write, no Multilayer Image");
+ }
BKE_image_release_renderresult(scene, ima);
}
else if (BKE_write_ibuf(scene, ibuf, path, sima->imtypenr, scene->r.subimtype, scene->r.quality)) {
+ ok= TRUE;
+ }
+ if(ok) {
if(relative)
- BLI_path_rel(path, G.sce); /* only after saving */
-
- if(!save_copy) {
+ BLI_path_rel(path, bmain->name); /* only after saving */
- BLI_strncpy(ima->name, path, sizeof(ima->name));
+ if(ibuf->name[0]==0) {
BLI_strncpy(ibuf->name, path, sizeof(ibuf->name));
+ BLI_strncpy(ima->name, path, sizeof(ima->name));
+ }
+
+ if(!save_copy) {
+ if(do_newpath) {
+ BLI_strncpy(ima->name, path, sizeof(ima->name));
+ BLI_strncpy(ibuf->name, path, sizeof(ibuf->name));
+ }
ibuf->userflags &= ~IB_BITMAPDIRTY;
@@ -927,13 +956,12 @@ static void save_image_doit(bContext *C, SpaceImage *sima, Scene *scene, wmOpera
ima->source= IMA_SRC_FILE;
ima->type= IMA_TYPE_IMAGE;
}
-
- /* name image as how we saved it */
- rename_id(&ima->id, BLI_path_basename(path));
}
- }
- else
+ }
+ else {
BKE_reportf(op->reports, RPT_ERROR, "Couldn't write image: %s", path);
+ }
+
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -956,17 +984,31 @@ static int save_as_exec(bContext *C, wmOperator *op)
sima->imtypenr= RNA_enum_get(op->ptr, "file_type");
RNA_string_get(op->ptr, "filepath", str);
- save_image_doit(C, sima, scene, op, str);
+ save_image_doit(C, sima, scene, op, str, TRUE);
return OPERATOR_FINISHED;
}
-static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
+
+static int save_as_check(bContext *UNUSED(C), wmOperator *op)
+{
+ char filepath[FILE_MAX];
+ RNA_string_get(op->ptr, "filepath", filepath);
+ if(BKE_add_image_extension(filepath, RNA_enum_get(op->ptr, "file_type"))) {
+ RNA_string_set(op->ptr, "filepath", filepath);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
Scene *scene= CTX_data_scene(C);
ImBuf *ibuf;
+ char filename[FILE_MAX];
+
void *lock;
if(!RNA_property_is_set(op->ptr, "relative_path"))
@@ -995,15 +1037,21 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_enum_set(op->ptr, "file_type", sima->imtypenr);
if(ibuf->name[0]==0)
- BLI_strncpy(ibuf->name, G.ima, FILE_MAX);
-
+ if ( (G.ima[0] == '/') && (G.ima[1] == '/') && (G.ima[2] == '\0') ) {
+ BLI_strncpy(filename, "//untitled", FILE_MAX);
+ } else {
+ BLI_strncpy(filename, G.ima, FILE_MAX);
+ }
+ else
+ BLI_strncpy(filename, ibuf->name, FILE_MAX);
+
/* enable save_copy by default for render results */
if(ELEM(ima->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE) && !RNA_property_is_set(op->ptr, "copy")) {
RNA_boolean_set(op->ptr, "copy", TRUE);
}
// XXX note: we can give default menu enums to operator for this
- image_filesel(C, op, ibuf->name);
+ image_filesel(C, op, filename);
ED_space_image_release_buffer(sima, lock);
@@ -1023,6 +1071,7 @@ void IMAGE_OT_save_as(wmOperatorType *ot)
/* api callbacks */
ot->exec= save_as_exec;
+ ot->check= save_as_check;
ot->invoke= save_as_invoke;
ot->poll= space_image_buffer_exists_poll;
@@ -1040,6 +1089,7 @@ void IMAGE_OT_save_as(wmOperatorType *ot)
static int save_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima = ED_space_image(sima);
void *lock;
@@ -1055,11 +1105,11 @@ static int save_exec(bContext *C, wmOperator *op)
/* if exists, saves over without fileselect */
- BLI_strncpy(name, ibuf->name, FILE_MAX);
+ BLI_strncpy(name, ima->name, FILE_MAX);
if(name[0]==0)
BLI_strncpy(name, G.ima, FILE_MAX);
else
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
if(BLI_exists(name) && BLI_is_writable(name)) {
rr= BKE_image_acquire_renderresult(scene, ima);
@@ -1072,7 +1122,7 @@ static int save_exec(bContext *C, wmOperator *op)
BKE_image_release_renderresult(scene, ima);
ED_space_image_release_buffer(sima, lock);
- save_image_doit(C, sima, scene, op, name);
+ save_image_doit(C, sima, scene, op, name, FALSE);
}
else {
ED_space_image_release_buffer(sima, lock);
@@ -1102,6 +1152,7 @@ void IMAGE_OT_save(wmOperatorType *ot)
static int save_sequence_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
SpaceImage *sima= CTX_wm_space_image(C);
ImBuf *ibuf;
int tot= 0;
@@ -1145,7 +1196,7 @@ static int save_sequence_exec(bContext *C, wmOperator *op)
char name[FILE_MAX];
BLI_strncpy(name, ibuf->name, sizeof(name));
- BLI_path_abs(name, G.sce);
+ BLI_path_abs(name, bmain->name);
if(0 == IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat)) {
BKE_reportf(op->reports, RPT_ERROR, "Could not write image %s.", name);
@@ -1176,7 +1227,7 @@ void IMAGE_OT_save_sequence(wmOperatorType *ot)
/******************** reload image operator ********************/
-static int reload_exec(bContext *C, wmOperator *op)
+static int reload_exec(bContext *C, wmOperator *UNUSED(op))
{
Image *ima= CTX_data_edit_image(C);
SpaceImage *sima= CTX_wm_space_image(C);
@@ -1207,7 +1258,7 @@ void IMAGE_OT_reload(wmOperatorType *ot)
/********************** new image operator *********************/
-static int new_exec(bContext *C, wmOperator *op)
+static int image_new_exec(bContext *C, wmOperator *op)
{
SpaceImage *sima;
Scene *scene;
@@ -1264,6 +1315,13 @@ static int new_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* XXX, Ton is not a fan of OK buttons but using this function to avoid undo/redo bug while in mesh-editmode, - campbell */
+static int image_new_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+{
+ return WM_operator_props_dialog_popup(C, op, 300, 100);
+
+}
+
void IMAGE_OT_new(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -1274,14 +1332,14 @@ void IMAGE_OT_new(wmOperatorType *ot)
ot->idname= "IMAGE_OT_new";
/* api callbacks */
- ot->exec= new_exec;
- ot->invoke= WM_operator_props_popup;
-
+ ot->exec= image_new_exec;
+ ot->invoke= image_new_invoke;
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_string(ot->srna, "name", "Untitled", 21, "Name", "Image datablock name.");
+ RNA_def_string(ot->srna, "name", "untitled", 21, "Name", "Image datablock name.");
RNA_def_int(ot->srna, "width", 1024, 1, INT_MAX, "Width", "Image width.", 1, 16384);
RNA_def_int(ot->srna, "height", 1024, 1, INT_MAX, "Height", "Image height.", 1, 16384);
prop= RNA_def_float_color(ot->srna, "color", 4, NULL, 0.0f, FLT_MAX, "Color", "Default fill color.", 0.0f, 1.0f);
@@ -1291,6 +1349,89 @@ void IMAGE_OT_new(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "float", 0, "32 bit Float", "Create image with 32 bit floating point bit depth.");
}
+/********************* invert operators *********************/
+
+static int image_invert_poll(bContext *C)
+{
+ Image *ima= CTX_data_edit_image(C);
+ ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+
+ if( ibuf != NULL )
+ return 1;
+ return 0;
+}
+
+static int image_invert_exec(bContext *C, wmOperator *op)
+{
+ Image *ima= CTX_data_edit_image(C);
+ ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+
+ // flags indicate if this channel should be inverted
+ short r,g,b,a;
+ int i, dirty = 0;
+
+ if( ibuf == NULL) // TODO: this should actually never happen, but does for render-results -> cleanup
+ return OPERATOR_CANCELLED;
+
+ r = RNA_boolean_get(op->ptr, "invert_r");
+ g = RNA_boolean_get(op->ptr, "invert_g");
+ b = RNA_boolean_get(op->ptr, "invert_b");
+ a = RNA_boolean_get(op->ptr, "invert_a");
+
+ /* TODO: make this into an IMB_invert_channels(ibuf,r,g,b,a) method!? */
+ if (ibuf->rect_float) {
+
+ float *fp = (float *) ibuf->rect_float;
+ for( i = ibuf->x * ibuf->y; i > 0; i--, fp+=4 ) {
+ if( r ) fp[0] = 1.0f - fp[0];
+ if( g ) fp[1] = 1.0f - fp[1];
+ if( b ) fp[2] = 1.0f - fp[2];
+ if( a ) fp[3] = 1.0f - fp[3];
+ }
+ dirty = 1;
+ IMB_rect_from_float(ibuf);
+ }
+ else if(ibuf->rect) {
+
+ char *cp = (char *) ibuf->rect;
+ for( i = ibuf->x * ibuf->y; i > 0; i--, cp+=4 ) {
+ if( r ) cp[0] = 255 - cp[0];
+ if( g ) cp[1] = 255 - cp[1];
+ if( b ) cp[2] = 255 - cp[2];
+ if( a ) cp[3] = 255 - cp[3];
+ }
+ dirty = 1;
+ }
+ else
+ return OPERATOR_CANCELLED;
+
+ ibuf->userflags |= IB_BITMAPDIRTY; // mark as modified
+ WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
+
+ return OPERATOR_FINISHED;
+
+}
+
+void IMAGE_OT_invert(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Invert Channels";
+ ot->idname= "IMAGE_OT_invert";
+
+ /* api callbacks */
+ ot->exec= image_invert_exec;
+ ot->poll= image_invert_poll;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "invert_r", 0, "Red", "Invert Red Channel");
+ RNA_def_boolean(ot->srna, "invert_g", 0, "Green", "Invert Green Channel");
+ RNA_def_boolean(ot->srna, "invert_b", 0, "Blue", "Invert Blue Channel");
+ RNA_def_boolean(ot->srna, "invert_a", 0, "Alpha", "Invert Alpha Channel");
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/********************* pack operator *********************/
static int pack_test(bContext *C, wmOperator *op)
@@ -1335,7 +1476,7 @@ static int pack_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int pack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Image *ima= CTX_data_edit_image(C);
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
@@ -1349,7 +1490,7 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) {
pup= uiPupMenuBegin(C, "OK", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1);
+ uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", ICON_NULL, op->idname, "as_png", 1);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
@@ -1378,101 +1519,15 @@ void IMAGE_OT_pack(wmOperatorType *ot)
/********************* unpack operator *********************/
-void unpack_menu(bContext *C, char *opname, Image *ima, char *folder, PackedFile *pf)
-{
- PointerRNA props_ptr;
- uiPopupMenu *pup;
- uiLayout *layout;
- char line[FILE_MAXDIR + FILE_MAXFILE + 100];
- char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
- char *abs_name = ima->name;
-
- strcpy(local_name, abs_name);
- BLI_splitdirstring(local_name, fi);
- sprintf(local_name, "//%s/%s", folder, fi);
-
- pup= uiPupMenuBegin(C, "Unpack file", 0);
- layout= uiPupMenuLayout(pup);
-
- uiItemEnumO(layout, opname, "Remove Pack", 0, "method", PF_REMOVE);
-
- if(strcmp(abs_name, local_name)) {
- switch(checkPackedFile(local_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", local_name);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name);
-
- sprintf(line, "Overwrite %s", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
-
- break;
- }
- }
-
- switch(checkPackedFile(abs_name, pf)) {
- case PF_NOFILE:
- sprintf(line, "Create %s", abs_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- case PF_EQUAL:
- sprintf(line, "Use %s (identical)", abs_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- case PF_DIFFERS:
- sprintf(line, "Use %s (differs)", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
-
- sprintf(line, "Overwrite %s", local_name);
- //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, 0, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
- RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
- RNA_string_set(&props_ptr, "image", ima->id.name+2);
- break;
- }
-
- uiPupMenuEnd(C, pup);
-}
-
-static int unpack_exec(bContext *C, wmOperator *op)
+static int image_unpack_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int method= RNA_enum_get(op->ptr, "method");
/* find the suppplied image by name */
- if (RNA_property_is_set(op->ptr, "image")) {
+ if (RNA_property_is_set(op->ptr, "id")) {
char imaname[22];
- RNA_string_get(op->ptr, "image", imaname);
+ RNA_string_get(op->ptr, "id", imaname);
ima = BLI_findstring(&CTX_data_main(C)->image, imaname, offsetof(ID, name) + 2);
if (!ima) ima = CTX_data_edit_image(C);
}
@@ -1495,12 +1550,12 @@ static int unpack_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int image_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Image *ima= CTX_data_edit_image(C);
- if(RNA_property_is_set(op->ptr, "image"))
- return unpack_exec(C, op);
+ if(RNA_property_is_set(op->ptr, "id"))
+ return image_unpack_exec(C, op);
if(!ima || !ima->packedfile)
return OPERATOR_CANCELLED;
@@ -1512,8 +1567,8 @@ static int unpack_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
-
- unpack_menu(C, "IMAGE_OT_unpack", ima, "textures", ima->packedfile);
+
+ unpack_menu(C, "IMAGE_OT_unpack", ima->id.name+2, ima->name, "textures", ima->packedfile);
return OPERATOR_FINISHED;
}
@@ -1526,15 +1581,15 @@ void IMAGE_OT_unpack(wmOperatorType *ot)
ot->idname= "IMAGE_OT_unpack";
/* api callbacks */
- ot->exec= unpack_exec;
- ot->invoke= unpack_invoke;
+ ot->exec= image_unpack_exec;
+ ot->invoke= image_unpack_invoke;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/* properties */
RNA_def_enum(ot->srna, "method", unpack_method_items, PF_USE_LOCAL, "Method", "How to unpack.");
- RNA_def_string(ot->srna, "image", "", 21, "Image Name", "Image datablock name to unpack.");
+ RNA_def_string(ot->srna, "id", "", 21, "Image Name", "Image datablock name to unpack."); /* XXX, weark!, will fail with library, name collisions */
}
/******************** sample image operator ********************/
@@ -1558,12 +1613,12 @@ typedef struct ImageSampleInfo {
int draw;
} ImageSampleInfo;
-static void sample_draw(const bContext *C, ARegion *ar, void *arg_info)
+static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info)
{
ImageSampleInfo *info= arg_info;
-
- draw_image_info(ar, info->channels, info->x, info->y, info->colp,
- info->colfp, info->zp, info->zfp);
+ if(info->draw) {
+ draw_image_info(ar, info->channels, info->x, info->y, info->colp, info->colfp, info->zp, info->zfp);
+ }
}
static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
@@ -1574,16 +1629,16 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
ImBuf *ibuf= ED_space_image_acquire_buffer(sima, &lock);
ImageSampleInfo *info= op->customdata;
float fx, fy;
- int x, y;
+ int mx, my;
if(ibuf == NULL) {
ED_space_image_release_buffer(sima, lock);
return;
}
- x= event->x - ar->winrct.xmin;
- y= event->y - ar->winrct.ymin;
- UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
+ mx= event->x - ar->winrct.xmin;
+ my= event->y - ar->winrct.ymin;
+ UI_view2d_region_to_view(&ar->v2d, mx, my, &fx, &fy);
if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
float *fp;
@@ -1644,11 +1699,13 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
if(point == 1) {
curvemapping_set_black_white(sima->cumap, NULL, info->colfp);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
}
else if(point == 0) {
curvemapping_set_black_white(sima->cumap, info->colfp, NULL);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
}
}
}
@@ -1888,7 +1945,7 @@ typedef struct RecordCompositeData {
int sfra, efra;
} RecordCompositeData;
-int record_composite_apply(bContext *C, wmOperator *op)
+static int record_composite_apply(bContext *C, wmOperator *op)
{
SpaceImage *sima= CTX_wm_space_image(C);
RecordCompositeData *rcd= op->customdata;
@@ -1971,9 +2028,9 @@ static int record_composite_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int record_composite_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- RecordCompositeData *rcd= op->customdata;
+ RecordCompositeData *rcd;
if(!record_composite_init(C, op))
return OPERATOR_CANCELLED;
@@ -2042,14 +2099,20 @@ static int cycle_render_slot_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int a, slot, cur= ima->render_slot;
+ const short use_reverse= RNA_boolean_get(op->ptr, "reverse");
for(a=1; a<IMA_MAX_RENDER_SLOT; a++) {
- slot= (cur+a)%IMA_MAX_RENDER_SLOT;
+ slot= (cur + (use_reverse ? -a:a))%IMA_MAX_RENDER_SLOT;
+ if(slot<0) slot+=IMA_MAX_RENDER_SLOT;
if(ima->renders[slot] || slot == ima->last_render_slot) {
ima->render_slot= slot;
break;
}
+ else if((slot - 1) == ima->last_render_slot && slot < IMA_MAX_RENDER_SLOT) {
+ ima->render_slot= slot;
+ break;
+ }
}
if(a == IMA_MAX_RENDER_SLOT)
@@ -2072,6 +2135,8 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_boolean(ot->srna, "reverse", 0, "Cycle in Reverse", "");
}
/******************** TODO ********************/
@@ -2080,11 +2145,9 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
/* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */
-void ED_image_update_frame(const bContext *C)
+void ED_image_update_frame(const Main *mainp, int cfra)
{
- Main *mainp= CTX_data_main(C);
- Scene *scene= CTX_data_scene(C);
- wmWindowManager *wm= CTX_wm_manager(C);
+ wmWindowManager *wm;
wmWindow *win;
Tex *tex;
@@ -2093,13 +2156,13 @@ void ED_image_update_frame(const bContext *C)
if(tex->type==TEX_IMAGE && tex->ima) {
if(ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
if(tex->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&tex->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&tex->iuser, cfra, 0);
}
}
}
/* image window, compo node users */
- if(wm) {
+ for(wm=mainp->wm.first; wm; wm= wm->id.next) { /* only 1 wm */
for(win= wm->windows.first; win; win= win->next) {
ScrArea *sa;
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
@@ -2108,12 +2171,12 @@ void ED_image_update_frame(const bContext *C)
BGpic *bgpic;
for(bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next)
if(bgpic->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&bgpic->iuser, cfra, 0);
}
else if(sa->spacetype==SPACE_IMAGE) {
SpaceImage *sima= sa->spacedata.first;
if(sima->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(&sima->iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(&sima->iuser, cfra, 0);
}
else if(sa->spacetype==SPACE_NODE) {
SpaceNode *snode= sa->spacedata.first;
@@ -2125,7 +2188,7 @@ void ED_image_update_frame(const bContext *C)
ImageUser *iuser= node->storage;
if(ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
if(iuser->flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
+ BKE_image_user_calc_frame(iuser, cfra, 0);
}
}
}
diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c
index be9d60a5adb..03ac3f4e79e 100644
--- a/source/blender/editors/space_image/image_render.c
+++ b/source/blender/editors/space_image/image_render.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,8 @@
#include <stdlib.h>
#include <stdio.h>
+#include "BLI_utildefines.h"
+
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -50,7 +52,7 @@ static ScrArea *image_area= NULL;
/* can get as well the full picture, as the parts while rendering */
/* XXX will be obsolete, here for reference now */
-void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *renrect)
+static void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *renrect)
{
float x1, y1, *rectf= NULL;
unsigned int *rect32= NULL;
@@ -122,7 +124,7 @@ void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *ren
/* coming from BIF_toggle_render_display() */
-void imagewindow_toggle_render(bContext *C)
+static void imagewindow_toggle_render(bContext *C)
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa;
@@ -149,7 +151,7 @@ void imagewindow_toggle_render(bContext *C)
}
/* NOTE: called while render, so no malloc allowed! */
-static void imagewindow_renderinfo_cb(void *handle, RenderStats *rs)
+static void imagewindow_renderinfo_cb(void *UNUSED(handle), RenderStats *UNUSED(rs))
{
if(image_area) {
// XXX BIF_make_render_text(rs);
@@ -161,7 +163,7 @@ static void imagewindow_renderinfo_cb(void *handle, RenderStats *rs)
}
}
-void ED_space_image_render_callbacks(bContext *C, Render *re)
+static void ED_space_image_render_callbacks(bContext *C, Render *re)
{
// RE_display_init_cb(re, C, imagewindow_init_display_cb);
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 60b43844034..ed59a35229a 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,6 +39,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_context.h"
@@ -49,6 +50,7 @@
#include "IMB_imbuf_types.h"
+#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_space_api.h"
#include "ED_screen.h"
@@ -226,9 +228,18 @@ void ED_space_image_uv_aspect(SpaceImage *sima, float *aspx, float *aspy)
ED_space_image_aspect(sima, aspx, aspy);
ED_space_image_size(sima, &w, &h);
+
+ *aspx *= (float)w;
+ *aspy *= (float)h;
- *aspx *= (float)w/256.0f;
- *aspy *= (float)h/256.0f;
+ if(*aspx < *aspy) {
+ *aspy= *aspy / *aspx;
+ *aspx= 1.0f;
+ }
+ else {
+ *aspx= *aspx / *aspy;
+ *aspy= 1.0f;
+ }
}
void ED_image_uv_aspect(Image *ima, float *aspx, float *aspy)
@@ -257,11 +268,9 @@ int ED_space_image_show_paint(SpaceImage *sima)
int ED_space_image_show_uvedit(SpaceImage *sima, Object *obedit)
{
- if(ED_space_image_show_render(sima))
- return 0;
- if(ED_space_image_show_paint(sima))
+ if(sima && (ED_space_image_show_render(sima) || ED_space_image_show_paint(sima)))
return 0;
-
+
if(obedit && obedit->type == OB_MESH) {
BMEditMesh *em = ((Mesh*)obedit->data)->edit_btmesh;
int ret;
@@ -368,7 +377,7 @@ ARegion *image_has_scope_region(ScrArea *sa)
/* ******************** default callbacks for image space ***************** */
-static SpaceLink *image_new(const bContext *C)
+static SpaceLink *image_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceImage *simage;
@@ -383,6 +392,7 @@ static SpaceLink *image_new(const bContext *C)
simage->iuser.frames= 100;
scopes_new(&simage->scopes);
+ simage->sample_line_hist.height= 100;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for image");
@@ -428,7 +438,7 @@ static void image_free(SpaceLink *sl)
/* spacetype; init callback, add handlers */
-static void image_init(struct wmWindowManager *wm, ScrArea *sa)
+static void image_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
ListBase *lb= WM_dropboxmap_find("Image", SPACE_IMAGE, 0);
@@ -448,7 +458,7 @@ static SpaceLink *image_duplicate(SpaceLink *sl)
return (SpaceLink *)simagen;
}
-void image_operatortypes(void)
+static void image_operatortypes(void)
{
WM_operatortype_append(IMAGE_OT_view_all);
WM_operatortype_append(IMAGE_OT_view_pan);
@@ -467,6 +477,8 @@ void image_operatortypes(void)
WM_operatortype_append(IMAGE_OT_save_sequence);
WM_operatortype_append(IMAGE_OT_pack);
WM_operatortype_append(IMAGE_OT_unpack);
+
+ WM_operatortype_append(IMAGE_OT_invert);
WM_operatortype_append(IMAGE_OT_cycle_render_slot);
@@ -481,9 +493,10 @@ void image_operatortypes(void)
WM_operatortype_append(IMAGE_OT_scopes);
}
-void image_keymap(struct wmKeyConfig *keyconf)
+static void image_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Image Generic", SPACE_IMAGE, 0);
+ wmKeyMapItem *kmi;
WM_keymap_add_item(keymap, "IMAGE_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_open", OKEY, KM_PRESS, KM_ALT, 0);
@@ -494,12 +507,14 @@ void image_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "IMAGE_OT_scopes", PKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, KM_ALT, 0)->ptr, "reverse", TRUE);
keymap= WM_keymap_find(keyconf, "Image", SPACE_IMAGE, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MIDDLEMOUSE, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_pan", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_view_zoom_in", WHEELINMOUSE, KM_PRESS, 0, 0);
@@ -522,10 +537,15 @@ void image_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "IMAGE_OT_curves_point_set", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "point", 1);
WM_keymap_add_item(keymap, "IMAGE_OT_toolbox", SPACEKEY, KM_PRESS, 0, 0);
+
+ /* toggle editmode is handy to have while UV unwrapping */
+ kmi= WM_keymap_add_item(keymap, "OBJECT_OT_mode_set", TABKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", OB_MODE_EDIT);
+ RNA_boolean_set(kmi->ptr, "toggle", 1);
}
/* dropboxes */
-static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM3(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -549,7 +569,7 @@ static void image_dropboxes(void)
-static void image_refresh(const bContext *C, ScrArea *sa)
+static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
{
SpaceImage *sima= CTX_wm_space_image(C);
Object *obedit= CTX_data_edit_object(C);
@@ -568,13 +588,13 @@ static void image_refresh(const bContext *C, ScrArea *sa)
MTexPoly *tf;
if(em && EDBM_texFaceCheck(em)) {
- sima->image= ima= NULL;
+ sima->image= NULL;
tf = EDBM_get_active_mtexpoly(em, NULL, 1); /* partially selected face is ok */
if(tf && (tf->mode & TF_TEX)) {
/* don't need to check for pin here, see above */
- sima->image= ima= tf->tpage;
+ sima->image= tf->tpage;
if(sima->flag & SI_EDITTILE);
else sima->curtile= tf->tile;
@@ -623,29 +643,35 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn)
switch(wmn->data) {
case ND_DATA:
case ND_SELECT:
+ image_scopes_tag_refresh(sa);
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
break;
}
case NC_OBJECT:
+ {
+ Object *ob= (Object *)wmn->reference;
switch(wmn->data) {
case ND_TRANSFORM:
- if(sima->lock && (sima->flag & SI_DRAWSHADOW)) {
+ case ND_MODIFIER:
+ if(ob && (ob->mode & OB_MODE_EDIT) && sima->lock && (sima->flag & SI_DRAWSHADOW)) {
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
}
break;
}
+ }
}
}
+const char *image_context_dir[] = {"edit_image", NULL};
+
static int image_context(const bContext *C, const char *member, bContextDataResult *result)
{
SpaceImage *sima= CTX_wm_space_image(C);
if(CTX_data_dir(member)) {
- static const char *dir[] = {"edit_image", NULL};
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, image_context_dir);
}
else if(CTX_data_equals(member, "edit_image")) {
CTX_data_id_pointer_set(result, (ID*)ED_space_image(sima));
@@ -743,6 +769,9 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
//View2DScrollers *scrollers;
float col[3];
+ /* XXX not supported yet, disabling for now */
+ scene->r.scemode &= ~R_COMP_CROP;
+
/* clear and setup matrix */
UI_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
@@ -758,7 +787,7 @@ static void image_main_area_draw(const bContext *C, ARegion *ar)
draw_image_main(sima, ar, scene);
/* and uvs in 0.0-1.0 space */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
draw_uvedit_main(sima, ar, scene, obedit);
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
@@ -874,7 +903,7 @@ static void image_scope_area_listener(ARegion *ar, wmNotifier *wmn)
/************************* header region **************************/
/* add handlers, stuff you only do once or on area/region changes */
-static void image_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void image_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
index 473f1f2fcff..9ebd86f5c2b 100644
--- a/source/blender/editors/space_info/CMakeLists.txt
+++ b/source/blender/editors/space_info/CMakeLists.txt
@@ -19,18 +19,30 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
+ ../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
../../bmesh
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ info_ops.c
+ info_stats.c
+ info_draw.c
+ info_report.c
+ textview.c
+ space_info.c
+
+ info_intern.h
+ textview.h
)
-BLENDERLIB(bf_editor_space_info "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_info "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_info/SConscript b/source/blender/editors/space_info/SConscript
index cf1d8ab7d77..18de1a13d9d 100644
--- a/source/blender/editors/space_info/SConscript
+++ b/source/blender/editors/space_info/SConscript
@@ -4,7 +4,11 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf ../../blenfont'
+<<<<<<< .working
incs += ' ../../bmesh ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+=======
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
+>>>>>>> .merge-right.r35190
defs = []
diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c
new file mode 100644
index 00000000000..6b3c3f1ad25
--- /dev/null
+++ b/source/blender/editors/space_info/info_draw.c
@@ -0,0 +1,302 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2010 Blender Foundation.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+
+#include "BLF_api.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_space_types.h"
+#include "DNA_screen_types.h"
+
+// #include "BKE_suggestions.h"
+#include "BKE_report.h"
+
+
+#include "MEM_guardedalloc.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_datafiles.h"
+#include "ED_types.h"
+
+#include "UI_resources.h"
+
+#include "info_intern.h"
+#include "../space_info/textview.h"
+
+/* complicates things a bit, so leaving in old simple code */
+#define USE_INFO_NEWLINE
+
+static void info_report_color(unsigned char *fg, unsigned char *bg, Report *report, int bool)
+{
+ if(report->flag & SELECT) {
+ fg[0]=255; fg[1]=255; fg[2]=255;
+ if(bool) {
+ bg[0]=96; bg[1]=128; bg[2]=255;
+ }
+ else {
+ bg[0]=90; bg[1]=122; bg[2]=249;
+ }
+ }
+ else {
+ fg[0]=0; fg[1]=0; fg[2]=0;
+
+ if (report->type & RPT_ERROR_ALL) {
+ if (bool) { bg[0]=220; bg[1]=0; bg[2]=0; }
+ else { bg[0]=214; bg[1]=0; bg[2]=0; }
+ }
+ else if (report->type & RPT_WARNING_ALL) {
+ if (bool) { bg[0]=220; bg[1]=128; bg[2]=96; }
+ else { bg[0]=214; bg[1]=122; bg[2]=90; }
+ }
+#if 0 // XXX: this looks like the selected colour, so don't use this
+ else if (report->type & RPT_OPERATOR_ALL) {
+ if (bool) { bg[0]=96; bg[1]=128; bg[2]=255; }
+ else { bg[0]=90; bg[1]=122; bg[2]=249; }
+ }
+#endif
+ else if (report->type & RPT_INFO_ALL) {
+ if (bool) { bg[0]=0; bg[1]=170; bg[2]=0; }
+ else { bg[0]=0; bg[1]=164; bg[2]=0; }
+ }
+ else if (report->type & RPT_DEBUG_ALL) {
+ if (bool) { bg[0]=196; bg[1]=196; bg[2]=196; }
+ else { bg[0]=190; bg[1]=190; bg[2]=190; }
+ }
+ else {
+ if (bool) { bg[0]=120; bg[1]=120; bg[2]=120; }
+ else { bg[0]=114; bg[1]=114; bg[2]=114; }
+ }
+ }
+}
+
+/* reports! */
+#ifdef USE_INFO_NEWLINE
+static void report_textview_init__internal(TextViewContext *tvc)
+{
+ Report *report= (Report *)tvc->iter;
+ const char *str= report->message;
+ const char *next_str= strchr(str + tvc->iter_char, '\n');
+
+ if(next_str) {
+ tvc->iter_char_next= (int)(next_str - str);
+ }
+ else {
+ tvc->iter_char_next= report->len;
+ }
+}
+
+static int report_textview_skip__internal(TextViewContext *tvc)
+{
+ SpaceInfo *sinfo= (SpaceInfo *)tvc->arg1;
+ const int report_mask= info_report_mask(sinfo);
+ while (tvc->iter && (((Report *)tvc->iter)->type & report_mask)==0) {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ }
+ return (tvc->iter != NULL);
+}
+
+#endif // USE_INFO_NEWLINE
+
+static int report_textview_begin(TextViewContext *tvc)
+{
+ // SpaceConsole *sc= (SpaceConsole *)tvc->arg1;
+ ReportList *reports= (ReportList *)tvc->arg2;
+
+ tvc->lheight= 14; //sc->lheight;
+ tvc->sel_start= 0;
+ tvc->sel_end= 0;
+
+ /* iterator */
+ tvc->iter= reports->list.last;
+
+ glClearColor(120.0/255.0, 120.0/255.0, 120.0/255.0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+#ifdef USE_INFO_NEWLINE
+ tvc->iter_tmp= 0;
+ if(tvc->iter && report_textview_skip__internal(tvc)) {
+ /* init the newline iterator */
+ tvc->iter_char= 0;
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+#else
+ return (tvc->iter != NULL);
+#endif
+}
+
+static void report_textview_end(TextViewContext *UNUSED(tvc))
+{
+ /* pass */
+}
+
+#ifdef USE_INFO_NEWLINE
+static int report_textview_step(TextViewContext *tvc)
+{
+ /* simple case, but no newline support */
+ Report *report= (Report *)tvc->iter;
+
+ if(report->len <= tvc->iter_char_next) {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ if(tvc->iter && report_textview_skip__internal(tvc)) {
+ tvc->iter_tmp++;
+
+ tvc->iter_char= 0; /* reset start */
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
+ }
+ else {
+ /* step to the next newline */
+ tvc->iter_char= tvc->iter_char_next + 1;
+ report_textview_init__internal(tvc);
+
+ return TRUE;
+ }
+}
+
+static int report_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ Report *report= (Report *)tvc->iter;
+ *line= report->message + tvc->iter_char;
+ *len= tvc->iter_char_next - tvc->iter_char;
+ return 1;
+}
+
+static int report_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3])
+{
+ Report *report= (Report *)tvc->iter;
+ info_report_color(fg, bg, report, tvc->iter_tmp % 2);
+ return TVC_LINE_FG | TVC_LINE_BG;
+}
+
+
+#else // USE_INFO_NEWLINE
+
+static int report_textview_step(TextViewContext *tvc)
+{
+ SpaceInfo *sinfo= (SpaceInfo *)tvc->arg1;
+ const int report_mask= info_report_mask(sinfo);
+ do {
+ tvc->iter= (void *)((Link *)tvc->iter)->prev;
+ } while (tvc->iter && (((Report *)tvc->iter)->type & report_mask)==0);
+
+ return (tvc->iter != NULL);
+}
+
+static int report_textview_line_get(struct TextViewContext *tvc, const char **line, int *len)
+{
+ Report *report= (Report *)tvc->iter;
+ *line= report->message;
+ *len= report->len;
+
+ return 1;
+}
+
+static int report_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3])
+{
+ Report *report= (Report *)tvc->iter;
+ info_report_color(fg, bg, report, tvc->iter_tmp % 2);
+ return TVC_LINE_FG | TVC_LINE_BG;
+}
+
+#endif // USE_INFO_NEWLINE
+
+#undef USE_INFO_NEWLINE
+
+static int info_textview_main__internal(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+{
+ int ret= 0;
+
+ View2D *v2d= &ar->v2d;
+
+ TextViewContext tvc= {0};
+ tvc.begin= report_textview_begin;
+ tvc.end= report_textview_end;
+
+ tvc.step= report_textview_step;
+ tvc.line_get= report_textview_line_get;
+ tvc.line_color= report_textview_line_color;
+
+ tvc.arg1= sinfo;
+ tvc.arg2= reports;
+
+ /* view */
+ tvc.sel_start= 0;
+ tvc.sel_end= 0;
+ tvc.lheight= 14; //sc->lheight;
+ tvc.ymin= v2d->cur.ymin;
+ tvc.ymax= v2d->cur.ymax;
+ tvc.winx= ar->winx;
+
+ ret= textview_draw(&tvc, draw, mval, mouse_pick, pos_pick);
+
+ return ret;
+}
+
+void *info_text_pick(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int mouse_y)
+{
+ void *mouse_pick= NULL;
+ int mval[2];
+
+ mval[0]= 0;
+ mval[1]= mouse_y;
+
+ info_textview_main__internal(sinfo, ar, reports, 0, mval, &mouse_pick, NULL);
+ return (void *)mouse_pick;
+}
+
+
+int info_textview_height(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports)
+{
+ int mval[2] = {INT_MAX, INT_MAX};
+ return info_textview_main__internal(sinfo, ar, reports, 0, mval, NULL, NULL);
+}
+
+void info_textview_main(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports)
+{
+ int mval[2] = {INT_MAX, INT_MAX};
+ info_textview_main__internal(sinfo, ar, reports, 1, mval, NULL, NULL);
+}
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
index 4053bbf5a1f..cda1123fa79 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,7 +30,9 @@
/* internal exports only */
+struct SpaceInfo;
struct wmOperatorType;
+struct ReportList;
void FILE_OT_pack_all(struct wmOperatorType *ot);
void FILE_OT_unpack_all(struct wmOperatorType *ot);
@@ -41,5 +43,19 @@ void FILE_OT_find_missing_files(struct wmOperatorType *ot);
void INFO_OT_reports_display_update(struct wmOperatorType *ot);
-#endif /* ED_INFO_INTERN_H */
+/* info_draw.c */
+void *info_text_pick(struct SpaceInfo *sinfo, struct ARegion *ar, ReportList *reports, int mouse_y);
+int info_textview_height(struct SpaceInfo *sinfo, struct ARegion *ar, struct ReportList *reports);
+void info_textview_main(struct SpaceInfo *sinfo, struct ARegion *ar, struct ReportList *reports);
+
+/* info_report.c */
+int info_report_mask(struct SpaceInfo *sinfo);
+void INFO_OT_select_pick(struct wmOperatorType *ot); /* report selection */
+void INFO_OT_select_all_toggle(struct wmOperatorType *ot);
+void INFO_OT_select_border(struct wmOperatorType *ot);
+void INFO_OT_report_replay(struct wmOperatorType *ot);
+void INFO_OT_report_delete(struct wmOperatorType *ot);
+void INFO_OT_report_copy(struct wmOperatorType *ot);
+
+#endif /* ED_INFO_INTERN_H */
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
index 51767d3e006..a4243f7c19e 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_bpath.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -73,7 +74,7 @@ static int pack_all_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int pack_all_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Main *bmain= CTX_data_main(C);
Image *ima;
@@ -133,7 +134,7 @@ static int unpack_all_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Main *bmain= CTX_data_main(C);
uiPopupMenu *pup;
@@ -154,7 +155,7 @@ static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *event)
else
sprintf(title, "Unpack %d files", count);
- pup= uiPupMenuBegin(C, title, 0);
+ pup= uiPupMenuBegin(C, title, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -186,12 +187,17 @@ void FILE_OT_unpack_all(wmOperatorType *ot)
static int make_paths_relative_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+
if(!G.relbase_valid) {
BKE_report(op->reports, RPT_WARNING, "Can't set relative paths with an unsaved blend file.");
return OPERATOR_CANCELLED;
}
- makeFilesRelative(G.sce, op->reports);
+ makeFilesRelative(bmain, bmain->name, op->reports);
+
+ /* redraw everything so any changed paths register */
+ WM_main_add_notifier(NC_WINDOW, NULL);
return OPERATOR_FINISHED;
}
@@ -213,12 +219,18 @@ void FILE_OT_make_paths_relative(wmOperatorType *ot)
static int make_paths_absolute_exec(bContext *C, wmOperator *op)
{
+ Main *bmain= CTX_data_main(C);
+
if(!G.relbase_valid) {
BKE_report(op->reports, RPT_WARNING, "Can't set absolute paths with an unsaved blend file.");
return OPERATOR_CANCELLED;
}
- makeFilesAbsolute(G.sce, op->reports);
+ makeFilesAbsolute(bmain, bmain->name, op->reports);
+
+ /* redraw everything so any changed paths register */
+ WM_main_add_notifier(NC_WINDOW, NULL);
+
return OPERATOR_FINISHED;
}
@@ -237,14 +249,14 @@ void FILE_OT_make_paths_absolute(wmOperatorType *ot)
/********************* report missing files operator *********************/
-static int report_missing_files_exec(bContext *C, wmOperator *op)
+static int report_missing_files_exec(bContext *UNUSED(C), wmOperator *op)
{
char txtname[24]; /* text block name */
txtname[0] = '\0';
/* run the missing file check */
- checkMissingFiles(G.sce, op->reports);
+ checkMissingFiles(G.main, op->reports);
return OPERATOR_FINISHED;
}
@@ -264,18 +276,18 @@ void FILE_OT_report_missing_files(wmOperatorType *ot)
/********************* find missing files operator *********************/
-static int find_missing_files_exec(bContext *C, wmOperator *op)
+static int find_missing_files_exec(bContext *UNUSED(C), wmOperator *op)
{
char *path;
path= RNA_string_get_alloc(op->ptr, "filepath", NULL, 0);
- findMissingFiles(path, G.sce);
+ findMissingFiles(G.main, path);
MEM_freeN(path);
return OPERATOR_FINISHED;
}
-static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int find_missing_files_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* XXX file open button text "Find Missing Files" */
WM_event_add_fileselect(C, op);
@@ -312,8 +324,8 @@ void FILE_OT_find_missing_files(wmOperatorType *ot)
#define INFO_COLOR_TIMEOUT 3.0
#define ERROR_TIMEOUT 10.0
#define ERROR_COLOR_TIMEOUT 6.0
-#define COLLAPSE_TIMEOUT 0.2
-static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *event)
+#define COLLAPSE_TIMEOUT 0.25
+static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
wmWindowManager *wm= CTX_wm_manager(C);
ReportList *reports= CTX_wm_reports(C);
@@ -323,12 +335,16 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
float neutral_col[3] = {0.35, 0.35, 0.35};
float neutral_grey= 0.6;
float timeout=0.0, color_timeout=0.0;
+ int send_note= 0;
/* escape if not our timer */
- if(reports->reporttimer==NULL || reports->reporttimer != event->customdata)
+ if( (reports->reporttimer==NULL) ||
+ (reports->reporttimer != event->customdata) ||
+ ((report= BKE_reports_last_displayable(reports))==NULL) /* may have been deleted */
+ ) {
return OPERATOR_PASS_THROUGH;
-
- report= BKE_reports_last_displayable(reports);
+ }
+
rti = (ReportTimerInfo *)reports->reporttimer->customdata;
timeout = (report->type & RPT_ERROR_ALL)?ERROR_TIMEOUT:INFO_TIMEOUT;
@@ -345,7 +361,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
}
if (rti->widthfac == 0.0) {
- /* initialise colours based on report type */
+ /* initialise colors based on report type */
if(report->type & RPT_ERROR_ALL) {
rti->col[0] = 1.0;
rti->col[1] = 0.2;
@@ -366,17 +382,25 @@ static int update_reports_display_invoke(bContext *C, wmOperator *op, wmEvent *e
progress = reports->reporttimer->duration / timeout;
color_progress = reports->reporttimer->duration / color_timeout;
- /* fade colours out sharply according to progress through fade-out duration */
- interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress);
- rti->greyscale = interpf(neutral_grey, rti->greyscale, color_progress);
+ /* save us from too many draws */
+ if(color_progress <= 1.0f) {
+ send_note= 1;
+
+ /* fade colors out sharply according to progress through fade-out duration */
+ interp_v3_v3v3(rti->col, rti->col, neutral_col, color_progress);
+ rti->greyscale = interpf(neutral_grey, rti->greyscale, color_progress);
+ }
/* collapse report at end of timeout */
if (progress*timeout > timeout - COLLAPSE_TIMEOUT) {
rti->widthfac = (progress*timeout - (timeout - COLLAPSE_TIMEOUT)) / COLLAPSE_TIMEOUT;
rti->widthfac = 1.0 - rti->widthfac;
+ send_note= 1;
}
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL);
+ if(send_note) {
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO, NULL);
+ }
return (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH);
}
@@ -395,3 +419,5 @@ void INFO_OT_reports_display_update(wmOperatorType *ot)
/* properties */
}
+
+/* report operators */
diff --git a/source/blender/editors/space_console/console_report.c b/source/blender/editors/space_info/info_report.c
index 51bffa5b981..8766df6a0b9 100644
--- a/source/blender/editors/space_console/console_report.c
+++ b/source/blender/editors/space_info/info_report.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,11 +17,6 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
@@ -29,12 +24,13 @@
#include <stdlib.h>
#include <string.h>
+#include <limits.h>
#include "MEM_guardedalloc.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -47,43 +43,39 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#include "console_intern.h"
+#include "info_intern.h"
-int console_report_mask(SpaceConsole *sc)
+int info_report_mask(SpaceInfo *UNUSED(sinfo))
{
+#if 0
int report_mask = 0;
- if(sc->rpt_mask & CONSOLE_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_INFO) report_mask |= RPT_INFO_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_WARN) report_mask |= RPT_WARNING_ALL;
- if(sc->rpt_mask & CONSOLE_RPT_ERR) report_mask |= RPT_ERROR_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_DEBUG) report_mask |= RPT_DEBUG_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_INFO) report_mask |= RPT_INFO_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_OP) report_mask |= RPT_OPERATOR_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_WARN) report_mask |= RPT_WARNING_ALL;
+ if(sinfo->rpt_mask & INFO_RPT_ERR) report_mask |= RPT_ERROR_ALL;
return report_mask;
-}
-
-static int console_report_poll(bContext *C)
-{
- SpaceConsole *sc= CTX_wm_space_console(C);
-
- if(!sc || sc->type != CONSOLE_TYPE_REPORT)
- return 0;
+#endif
- return 1;
+ return RPT_DEBUG_ALL|RPT_INFO_ALL|RPT_OPERATOR_ALL|RPT_WARNING_ALL|RPT_ERROR_ALL;
}
-static int report_replay_exec(bContext *C, wmOperator *op)
+// TODO, get this working again!
+static int report_replay_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
- ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
- Report *report;
+// SpaceInfo *sc= CTX_wm_space_info(C);
+// ReportList *reports= CTX_wm_reports(C);
+// int report_mask= info_report_mask(sc);
+// Report *report;
+#if 0
sc->type= CONSOLE_TYPE_PYTHON;
for(report=reports->list.last; report; report=report->prev) {
if((report->type & report_mask) && (report->type & RPT_OPERATOR_ALL) && (report->flag & SELECT)) {
- console_history_add_str(C, report->message, 0);
+ console_history_add_str(sc, report->message, 0);
WM_operator_name_call(C, "CONSOLE_OT_execute", WM_OP_EXEC_DEFAULT, NULL);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -91,21 +83,21 @@ static int report_replay_exec(bContext *C, wmOperator *op)
}
sc->type= CONSOLE_TYPE_REPORT;
-
+#endif
ED_area_tag_redraw(CTX_wm_area(C));
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_replay(wmOperatorType *ot)
+void INFO_OT_report_replay(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Replay Operators";
ot->description= "Replay selected reports";
- ot->idname= "CONSOLE_OT_report_replay";
+ ot->idname= "INFO_OT_report_replay";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_replay_exec;
/* flags */
@@ -131,12 +123,15 @@ static int select_report_pick_exec(bContext *C, wmOperator *op)
static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
Report *report;
- report= console_text_pick(sc, ar, reports, event->mval[1]);
+ /* uses opengl */
+ wmSubWindowSet(CTX_wm_window(C), ar->swinid);
+
+ report= info_text_pick(sinfo, ar, reports, event->mval[1]);
RNA_int_set(op->ptr, "report_index", BLI_findindex(&reports->list, report));
@@ -144,15 +139,15 @@ static int select_report_pick_invoke(bContext *C, wmOperator *op, wmEvent *event
}
-void CONSOLE_OT_select_pick(wmOperatorType *ot)
+void INFO_OT_select_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select report";
ot->description= "Select reports by index";
- ot->idname= "CONSOLE_OT_select_pick";
+ ot->idname= "INFO_OT_select_pick";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->invoke= select_report_pick_invoke;
ot->exec= select_report_pick_exec;
@@ -165,11 +160,11 @@ void CONSOLE_OT_select_pick(wmOperatorType *ot)
-static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
+static int report_select_all_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
int deselect= 0;
Report *report;
@@ -198,15 +193,15 @@ static int report_select_all_toggle_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_select_all_toggle(wmOperatorType *ot)
+void INFO_OT_select_all_toggle(wmOperatorType *ot)
{
/* identifiers */
ot->name= "(De)Select All";
ot->description= "(de)select all reports";
- ot->idname= "CONSOLE_OT_select_all_toggle";
+ ot->idname= "INFO_OT_select_all_toggle";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_select_all_toggle_exec;
/* flags */
@@ -218,10 +213,10 @@ void CONSOLE_OT_select_all_toggle(wmOperatorType *ot)
/* borderselect operator */
static int borderselect_exec(bContext *C, wmOperator *op)
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ARegion *ar= CTX_wm_region(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report_min, *report_max, *report;
//View2D *v2d= UI_view2d_fromcontext(C);
@@ -246,8 +241,8 @@ static int borderselect_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmax, &rectf.ymax);
*/
- report_min= console_text_pick(sc, ar, reports, rect.ymax);
- report_max= console_text_pick(sc, ar, reports, rect.ymin);
+ report_min= info_text_pick(sinfo, ar, reports, rect.ymax);
+ report_max= info_text_pick(sinfo, ar, reports, rect.ymin);
/* get the first report if none found */
if(report_min==NULL) {
@@ -291,19 +286,19 @@ static int borderselect_exec(bContext *C, wmOperator *op)
/* ****** Border Select ****** */
-void CONSOLE_OT_select_border(wmOperatorType *ot)
+void INFO_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
ot->description= "Toggle border selection";
- ot->idname= "CONSOLE_OT_select_border";
+ ot->idname= "INFO_OT_select_border";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= borderselect_exec;
ot->modal= WM_border_select_modal;
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
/* flags */
/* ot->flag= OPTYPE_REGISTER; */
@@ -314,11 +309,11 @@ void CONSOLE_OT_select_border(wmOperatorType *ot)
-static int report_delete_exec(bContext *C, wmOperator *op)
+static int report_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report, *report_next;
@@ -329,7 +324,7 @@ static int report_delete_exec(bContext *C, wmOperator *op)
if((report->type & report_mask) && (report->flag & SELECT)) {
BLI_remlink(&reports->list, report);
- MEM_freeN(report->message);
+ MEM_freeN((void *)report->message);
MEM_freeN(report);
}
@@ -341,15 +336,15 @@ static int report_delete_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_delete(wmOperatorType *ot)
+void INFO_OT_report_delete(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Delete Reports";
ot->description= "Delete selected reports";
- ot->idname= "CONSOLE_OT_report_delete";
+ ot->idname= "INFO_OT_report_delete";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_delete_exec;
/* flags */
@@ -359,11 +354,11 @@ void CONSOLE_OT_report_delete(wmOperatorType *ot)
}
-static int report_copy_exec(bContext *C, wmOperator *op)
+static int report_copy_exec(bContext *C, wmOperator *UNUSED(op))
{
- SpaceConsole *sc= CTX_wm_space_console(C);
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
ReportList *reports= CTX_wm_reports(C);
- int report_mask= console_report_mask(sc);
+ int report_mask= info_report_mask(sinfo);
Report *report;
@@ -386,15 +381,15 @@ static int report_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void CONSOLE_OT_report_copy(wmOperatorType *ot)
+void INFO_OT_report_copy(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Copy Reports to Clipboard";
ot->description= "Copy selected reports to Clipboard";
- ot->idname= "CONSOLE_OT_report_copy";
+ ot->idname= "INFO_OT_report_copy";
/* api callbacks */
- ot->poll= console_report_poll;
+ ot->poll= ED_operator_info_active;
ot->exec= report_copy_exec;
/* flags */
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index 7ffa68a9be1..b9e4730ec41 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,15 +34,17 @@
#include "DNA_meta_types.h"
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_anim.h"
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
-#include "BKE_utildefines.h"
#include "BKE_tessmesh.h"
+#include "ED_info.h"
#include "ED_armature.h"
#include "ED_mesh.h"
#include "ED_curve.h" /* for ED_curve_editnurbs */
@@ -92,13 +94,12 @@ static void stats_object(Object *ob, int sel, int totob, SceneStats *stats)
case OB_SURF:
case OB_CURVE:
case OB_FONT: {
- Curve *cu= ob->data;
int tot= 0, totf= 0;
stats->totcurve += totob;
- if(cu->disp.first)
- count_displist(&cu->disp, &tot, &totf);
+ if(ob->disp.first)
+ count_displist(&ob->disp, &tot, &totf);
tot *= totob;
totf *= totob;
@@ -318,12 +319,10 @@ static void stats_dupli_object(Base *base, Object *ob, SceneStats *stats)
/* Statistics displayed in info header. Called regularly on scene changes. */
static void stats_update(Scene *scene)
{
- SceneStats stats;
+ SceneStats stats= {0};
Object *ob= (scene->basact)? scene->basact->object: NULL;
Base *base;
- memset(&stats, 0, sizeof(stats));
-
if(scene->obedit) {
/* Edit Mode */
stats_object_edit(scene->obedit, &stats);
@@ -332,7 +331,7 @@ static void stats_update(Scene *scene)
/* Pose Mode */
stats_object_pose(ob, &stats);
}
- else if(ob && (ob->flag & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ else if(ob && (ob->flag & OB_MODE_ALL_PAINT)) {
/* Sculpt and Paint Mode */
stats_object_paint(ob, &stats);
}
@@ -361,9 +360,9 @@ static void stats_string(Scene *scene)
mmap_in_use= MEM_get_mapped_memory_in_use();
/* get memory statistics */
- s= memstr + sprintf(memstr, " | Mem:%.2fM", ((mem_in_use-mmap_in_use)>>10)/1024.0);
+ s= memstr + sprintf(memstr, " | Mem:%.2fM", (double)((mem_in_use-mmap_in_use)>>10)/1024.0);
if(mmap_in_use)
- sprintf(s, " (%.2fM)", ((mmap_in_use)>>10)/1024.0);
+ sprintf(s, " (%.2fM)", (double)((mmap_in_use)>>10)/1024.0);
s= stats->infostr;
@@ -411,7 +410,7 @@ void ED_info_stats_clear(Scene *scene)
}
}
-char *ED_info_stats_string(Scene *scene)
+const char *ED_info_stats_string(Scene *scene)
{
if(!scene->stats)
stats_update(scene);
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index b47c8e8d189..b9415d630be 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,17 +29,18 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -49,20 +50,22 @@
#include "UI_resources.h"
#include "UI_interface.h"
-
+#include "UI_view2d.h"
#include "info_intern.h" // own include
/* ******************** default callbacks for info space ***************** */
-static SpaceLink *info_new(const bContext *C)
+static SpaceLink *info_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceInfo *sinfo;
sinfo= MEM_callocN(sizeof(SpaceInfo), "initinfo");
sinfo->spacetype= SPACE_INFO;
-
+
+ sinfo->rpt_mask= INFO_RPT_OP;
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for info");
@@ -76,11 +79,22 @@ static SpaceLink *info_new(const bContext *C)
BLI_addtail(&sinfo->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
+ /* keep in sync with console */
+ ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
+ ar->v2d.align |= V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y; /* align bottom left */
+ ar->v2d.keepofs |= V2D_LOCKOFS_X;
+ ar->v2d.keepzoom = (V2D_LOCKZOOM_X|V2D_LOCKZOOM_Y|V2D_LIMITZOOM|V2D_KEEPASPECT);
+ ar->v2d.keeptot= V2D_KEEPTOT_BOUNDS;
+ ar->v2d.minzoom= ar->v2d.maxzoom= 1.0f;
+
+ /* for now, aspect ratio should be maintained, and zoom is clamped within sane default limits */
+ //ar->v2d.keepzoom= (V2D_KEEPASPECT|V2D_LIMITZOOM);
+
return (SpaceLink *)sinfo;
}
/* not spacelink itself */
-static void info_free(SpaceLink *sl)
+static void info_free(SpaceLink *UNUSED(sl))
{
// SpaceInfo *sinfo= (SpaceInfo*) sl;
@@ -88,7 +102,7 @@ static void info_free(SpaceLink *sl)
/* spacetype; init callback */
-static void info_init(struct wmWindowManager *wm, ScrArea *sa)
+static void info_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -107,17 +121,55 @@ static SpaceLink *info_duplicate(SpaceLink *sl)
/* add handlers, stuff you only do once or on area/region changes */
static void info_main_area_init(wmWindowManager *wm, ARegion *ar)
{
+ wmKeyMap *keymap;
+
+ UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
+
+ /* own keymap */
+ keymap= WM_keymap_find(wm->defaultconf, "Info", SPACE_INFO, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+}
+
+static void info_textview_update_rect(const bContext *C, ARegion *ar)
+{
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
+ View2D *v2d= &ar->v2d;
+
+ UI_view2d_totRect_set(v2d, ar->winx-1, info_textview_height(sinfo, ar, CTX_wm_reports(C)));
}
static void info_main_area_draw(const bContext *C, ARegion *ar)
{
-
+ /* draw entirely, view changes should be handled here */
+ SpaceInfo *sinfo= CTX_wm_space_info(C);
+ View2D *v2d= &ar->v2d;
+ View2DScrollers *scrollers;
+
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
+
+ /* quick way to avoid drawing if not bug enough */
+ if(ar->winy < 16)
+ return;
+
+ info_textview_update_rect(C, ar);
+
+ /* worlks best with no view2d matrix set */
+ UI_view2d_view_ortho(v2d);
+
+ info_textview_main(sinfo, ar, CTX_wm_reports(C));
+
+ /* reset view matrix */
+ UI_view2d_view_restore(C);
+
+ /* scrollers */
+ scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_GRID_CLAMP);
+ UI_view2d_scrollers_draw(C, v2d, scrollers);
+ UI_view2d_scrollers_free(scrollers);
}
-void info_operatortypes(void)
+static void info_operatortypes(void)
{
WM_operatortype_append(FILE_OT_pack_all);
WM_operatortype_append(FILE_OT_unpack_all);
@@ -125,19 +177,41 @@ void info_operatortypes(void)
WM_operatortype_append(FILE_OT_make_paths_absolute);
WM_operatortype_append(FILE_OT_report_missing_files);
WM_operatortype_append(FILE_OT_find_missing_files);
-
WM_operatortype_append(INFO_OT_reports_display_update);
+
+ /* info_report.c */
+ WM_operatortype_append(INFO_OT_select_pick);
+ WM_operatortype_append(INFO_OT_select_all_toggle);
+ WM_operatortype_append(INFO_OT_select_border);
+
+ WM_operatortype_append(INFO_OT_report_replay);
+ WM_operatortype_append(INFO_OT_report_delete);
+ WM_operatortype_append(INFO_OT_report_copy);
}
-void info_keymap(struct wmKeyConfig *keyconf)
+static void info_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Window", 0, 0);
WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMER, KM_ANY, KM_ANY, 0);
+
+ /* info space */
+ keymap= WM_keymap_find(keyconf, "Info", SPACE_INFO, 0);
+
+
+ /* report selection */
+ WM_keymap_add_item(keymap, "INFO_OT_select_pick", SELECTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_select_border", BKEY, KM_PRESS, 0, 0);
+
+ WM_keymap_add_item(keymap, "INFO_OT_report_replay", RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_delete", XKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_delete", DELKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "INFO_OT_report_copy", CKEY, KM_PRESS, KM_CTRL, 0);
}
/* add handlers, stuff you only do once or on area/region changes */
-static void info_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void info_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -149,7 +223,17 @@ static void info_header_area_draw(const bContext *C, ARegion *ar)
static void info_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
+ // SpaceInfo *sinfo= sa->spacedata.first;
+
/* context changes */
+ switch(wmn->category) {
+ case NC_SPACE:
+ if(wmn->data == ND_SPACE_INFO_REPORT) {
+ /* redraw also but only for report view, could do less redraws by checking the type */
+ ED_region_tag_redraw(ar);
+ }
+ break;
+ }
}
static void info_header_listener(ARegion *ar, wmNotifier *wmn)
@@ -179,7 +263,7 @@ static void info_header_listener(ARegion *ar, wmNotifier *wmn)
}
-static void recent_files_menu(const bContext *C, Menu *menu)
+static void recent_files_menu_draw(const bContext *UNUSED(C), Menu *menu)
{
struct RecentFile *recent;
uiLayout *layout= menu->layout;
@@ -189,18 +273,18 @@ static void recent_files_menu(const bContext *C, Menu *menu)
uiItemStringO(layout, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
} else {
- uiItemL(layout, "No Recent Files", 0);
+ uiItemL(layout, "No Recent Files", ICON_NULL);
}
}
-void recent_files_menu_register()
+static void recent_files_menu_register(void)
{
MenuType *mt;
mt= MEM_callocN(sizeof(MenuType), "spacetype info menu recent files");
strcpy(mt->idname, "INFO_MT_file_open_recent");
strcpy(mt->label, "Open Recent...");
- mt->draw= recent_files_menu;
+ mt->draw= recent_files_menu_draw;
WM_menutype_add(mt);
}
@@ -223,10 +307,11 @@ void ED_spacetype_info(void)
/* regions: main window */
art= MEM_callocN(sizeof(ARegionType), "spacetype info region");
art->regionid = RGN_TYPE_WINDOW;
+ art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
+
art->init= info_main_area_init;
art->draw= info_main_area_draw;
art->listener= info_main_area_listener;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
BLI_addhead(&st->regiontypes, art);
@@ -246,4 +331,3 @@ void ED_spacetype_info(void)
BKE_spacetype_register(st);
}
-
diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c
new file mode 100644
index 00000000000..c718c3a9532
--- /dev/null
+++ b/source/blender/editors/space_info/textview.c
@@ -0,0 +1,298 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <assert.h>
+
+#include "BLF_api.h"
+
+#include "BLI_utildefines.h"
+
+
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "ED_datafiles.h"
+
+#include "textview.h"
+
+static void console_font_begin(TextViewContext *sc)
+{
+ BLF_size(blf_mono_font, sc->lheight-2, 72);
+}
+
+typedef struct ConsoleDrawContext {
+ int cwidth;
+ int lheight;
+ int console_width; /* number of characters that fit into the width of the console (fixed width) */
+ int winx;
+ int ymin, ymax;
+ int *xy; // [2]
+ int *sel; // [2]
+ int *pos_pick; // bottom of view == 0, top of file == combine chars, end of line is lower then start.
+ int *mval; // [2]
+ int draw;
+} ConsoleDrawContext;
+
+static void console_draw_sel(int sel[2], int xy[2], int str_len_draw, int cwidth, int lheight)
+{
+ if(sel[0] <= str_len_draw && sel[1] >= 0) {
+ int sta = MAX2(sel[0], 0);
+ int end = MIN2(sel[1], str_len_draw);
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_halftone);
+ glEnable( GL_BLEND );
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4ub(255, 255, 255, 96);
+
+ glRecti(xy[0]+(cwidth*sta), xy[1]-2 + lheight, xy[0]+(cwidth*end), xy[1]-2);
+
+ glDisable(GL_POLYGON_STIPPLE);
+ glDisable( GL_BLEND );
+ }
+}
+
+
+/* return 0 if the last line is off the screen
+ * should be able to use this for any string type */
+
+static int console_draw_string(ConsoleDrawContext *cdc, const char *str, int str_len, unsigned char *fg, unsigned char *bg)
+{
+#define STEP_SEL(value) cdc->sel[0] += (value); cdc->sel[1] += (value)
+ int rct_ofs= cdc->lheight/4;
+ int tot_lines = (str_len/cdc->console_width)+1; /* total number of lines for wrapping */
+ int y_next = (str_len > cdc->console_width) ? cdc->xy[1]+cdc->lheight*tot_lines : cdc->xy[1]+cdc->lheight;
+ const int mono= blf_mono_font;
+
+ /* just advance the height */
+ if(cdc->draw==0) {
+ if(cdc->pos_pick && (cdc->mval[1] != INT_MAX)) {
+ if(cdc->xy[1] <= cdc->mval[1]) {
+ if((y_next >= cdc->mval[1])) {
+ int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth));
+
+ /* wrap */
+ if(str_len > cdc->console_width)
+ ofs += (cdc->console_width * ((int)((((float)(y_next - cdc->mval[1]) / (float)(y_next-cdc->xy[1])) * tot_lines))));
+
+ CLAMP(ofs, 0, str_len);
+ *cdc->pos_pick += str_len - ofs;
+ } else
+ *cdc->pos_pick += str_len + 1;
+ }
+ }
+
+ cdc->xy[1]= y_next;
+ return 1;
+ }
+ else if (y_next-cdc->lheight < cdc->ymin) {
+ /* have not reached the drawable area so don't break */
+ cdc->xy[1]= y_next;
+
+ /* adjust selection even if not drawing */
+ if(cdc->sel[0] != cdc->sel[1]) {
+ STEP_SEL(-(str_len + 1));
+ }
+
+ return 1;
+ }
+
+ if(str_len > cdc->console_width) { /* wrap? */
+ const int initial_offset= ((tot_lines-1) * cdc->console_width);
+ const char *line_stride= str + initial_offset; /* advance to the last line and draw it first */
+
+ int sel_orig[2];
+ VECCOPY2D(sel_orig, cdc->sel);
+
+ /* invert and swap for wrapping */
+ cdc->sel[0] = str_len - sel_orig[1];
+ cdc->sel[1] = str_len - sel_orig[0];
+
+ if(bg) {
+ glColor3ubv(bg);
+ glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, (cdc->xy[1]+(cdc->lheight*tot_lines))+rct_ofs);
+ }
+
+ glColor3ubv(fg);
+
+ /* last part needs no clipping */
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, line_stride, str_len - initial_offset);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ STEP_SEL(-initial_offset);
+ // glColor4ub(255, 0, 0, 96); // debug
+ console_draw_sel(cdc->sel, cdc->xy, str_len % cdc->console_width, cdc->cwidth, cdc->lheight);
+ STEP_SEL(cdc->console_width);
+ glColor3ubv(fg);
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ line_stride -= cdc->console_width;
+
+ for(; line_stride >= str; line_stride -= cdc->console_width) {
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, line_stride, cdc->console_width);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ // glColor4ub(0, 255, 0, 96); // debug
+ console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->lheight);
+ STEP_SEL(cdc->console_width);
+ glColor3ubv(fg);
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ /* check if were out of view bounds */
+ if(cdc->xy[1] > cdc->ymax)
+ return 0;
+ }
+
+ VECCOPY2D(cdc->sel, sel_orig);
+ STEP_SEL(-(str_len + 1));
+ }
+ else { /* simple, no wrap */
+
+ if(bg) {
+ glColor3ubv(bg);
+ glRecti(0, cdc->xy[1]-rct_ofs, cdc->winx, cdc->xy[1]+cdc->lheight-rct_ofs);
+ }
+
+ glColor3ubv(fg);
+
+ BLF_position(mono, cdc->xy[0], cdc->xy[1], 0);
+ BLF_draw(mono, str, str_len);
+
+ if(cdc->sel[0] != cdc->sel[1]) {
+ int isel[2];
+
+ isel[0]= str_len - cdc->sel[1];
+ isel[1]= str_len - cdc->sel[0];
+
+ // glColor4ub(255, 255, 0, 96); // debug
+ console_draw_sel(isel, cdc->xy, str_len, cdc->cwidth, cdc->lheight);
+ STEP_SEL(-(str_len + 1));
+ }
+
+ cdc->xy[1] += cdc->lheight;
+
+ if(cdc->xy[1] > cdc->ymax)
+ return 0;
+ }
+
+ return 1;
+#undef STEP_SEL
+}
+
+#define CONSOLE_DRAW_MARGIN 4
+#define CONSOLE_DRAW_SCROLL 16
+
+int textview_draw(TextViewContext *tvc, int draw, int mval[2], void **mouse_pick, int *pos_pick)
+{
+ ConsoleDrawContext cdc= {0};
+
+ int x_orig=CONSOLE_DRAW_MARGIN, y_orig=CONSOLE_DRAW_MARGIN + tvc->lheight/6;
+ int xy[2], y_prev;
+ int sel[2]= {-1, -1}; /* defaults disabled */
+ unsigned char fg[3], bg[3];
+ const int mono= blf_mono_font;
+
+ console_font_begin(tvc);
+
+ xy[0]= x_orig; xy[1]= y_orig;
+
+ if(mval[1] != INT_MAX)
+ mval[1] += (tvc->ymin + CONSOLE_DRAW_MARGIN);
+
+ if(pos_pick)
+ *pos_pick = 0;
+
+ /* constants for the sequencer context */
+ cdc.cwidth= (int)BLF_fixed_width(mono);
+ assert(cdc.cwidth > 0);
+ cdc.lheight= tvc->lheight;
+ cdc.console_width= (tvc->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN*2) ) / cdc.cwidth;
+ CLAMP(cdc.console_width, 1, INT_MAX); /* avoid divide by zero on small windows */
+ cdc.winx= tvc->winx-(CONSOLE_DRAW_MARGIN+CONSOLE_DRAW_SCROLL);
+ cdc.ymin= tvc->ymin;
+ cdc.ymax= tvc->ymax;
+ cdc.xy= xy;
+ cdc.sel= sel;
+ cdc.pos_pick= pos_pick;
+ cdc.mval= mval;
+ cdc.draw= draw;
+
+ /* shouldnt be needed */
+ tvc->cwidth= cdc.cwidth;
+ tvc->console_width= cdc.console_width;
+ tvc->iter_index= 0;
+
+ if(tvc->sel_start != tvc->sel_end) {
+ sel[0]= tvc->sel_start;
+ sel[1]= tvc->sel_end;
+ }
+
+ if(tvc->begin(tvc)) {
+
+ do {
+ const char *ext_line;
+ int ext_len;
+ int color_flag= 0;
+
+ y_prev= xy[1];
+
+ if(draw)
+ color_flag= tvc->line_color(tvc, fg, bg);
+
+ tvc->line_get(tvc, &ext_line, &ext_len);
+
+ if(!console_draw_string(&cdc, ext_line, ext_len, (color_flag & TVC_LINE_FG) ? fg : NULL, (color_flag & TVC_LINE_BG) ? bg : NULL)) {
+ /* when drawing, if we pass v2d->cur.ymax, then quit */
+ if(draw) {
+ break; /* past the y limits */
+ }
+ }
+
+ if((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) {
+ *mouse_pick= (void *)tvc->iter;
+ break;
+ }
+
+ tvc->iter_index++;
+
+ } while(tvc->step(tvc));
+ }
+
+ tvc->end(tvc);
+
+ xy[1] += tvc->lheight * 2;
+
+ return xy[1] - y_orig;
+}
diff --git a/source/blender/editors/space_info/textview.h b/source/blender/editors/space_info/textview.h
new file mode 100644
index 00000000000..5d20eef56c9
--- /dev/null
+++ b/source/blender/editors/space_info/textview.h
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+typedef struct TextViewContext {
+ int lheight;
+ int sel_start, sel_end;
+
+ /* view settings */
+ int cwidth; /* shouldnt be needed! */
+ int console_width; /* shouldnt be needed! */
+
+ int winx;
+ int ymin, ymax;
+
+ /* callbacks */
+ int (*begin)(struct TextViewContext *tvc);
+ void (*end)(struct TextViewContext *tvc);
+ void *arg1;
+ void *arg2;
+
+ /* iterator */
+ int (*step)(struct TextViewContext *tvc);
+ int (*line_get)(struct TextViewContext *tvc, const char **, int *);
+ int (*line_color)(struct TextViewContext *tvc, unsigned char fg[3], unsigned char bg[3]);
+ void *iter;
+ int iter_index;
+ int iter_char; /* char intex, used for multi-line report display */
+ int iter_char_next; /* same as above, next \n */
+ int iter_tmp; /* internal iterator use */
+
+} TextViewContext;
+
+int textview_draw(struct TextViewContext *tvc, int draw, int mval[2], void **mouse_pick, int *pos_pick);
+
+#define TVC_LINE_FG (1<<0)
+#define TVC_LINE_BG (1<<1)
diff --git a/source/blender/editors/space_logic/CMakeLists.txt b/source/blender/editors/space_logic/CMakeLists.txt
index 91087d57f11..d33bf2db5e1 100644
--- a/source/blender/editors/space_logic/CMakeLists.txt
+++ b/source/blender/editors/space_logic/CMakeLists.txt
@@ -19,21 +19,29 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
../../editors/interface
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ logic_buttons.c
+ logic_ops.c
+ logic_window.c
+ space_logic.c
+
+ logic_intern.h
)
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-BLENDERLIB(bf_editor_space_logic "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_logic "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_logic/Makefile b/source/blender/editors/space_logic/Makefile
deleted file mode 100644
index 9b72e132be8..00000000000
--- a/source/blender/editors/space_logic/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_logic
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../interface
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_logic/SConscript b/source/blender/editors/space_logic/SConscript
index 307d229fb3f..6beb3ecb48f 100644
--- a/source/blender/editors/space_logic/SConscript
+++ b/source/blender/editors/space_logic/SConscript
@@ -5,11 +5,11 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna ../interface'
+incs += ' ../../makesrna ../interface ../../blenloader'
defs = []
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
env.BlenderLib ( 'bf_editors_space_game', sources, Split(incs), defs, libtype=['core'], priority=[120] )
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index 4f68dfb3804..1450bc3b3b5 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,22 +23,20 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
#include <string.h>
#include <stdio.h>
#include "DNA_meshdata_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "ED_screen.h"
-
#include "RNA_access.h"
#include "RNA_define.h"
@@ -84,7 +82,7 @@ static void logic_panel_view_properties(const bContext *C, Panel *pa)
}
#endif
-void logic_buttons_register(ARegionType *art)
+void logic_buttons_register(ARegionType *UNUSED(art))
{
#if 0
PanelType *pt;
@@ -104,7 +102,7 @@ void logic_buttons_register(ARegionType *art)
}
-static int logic_properties(bContext *C, wmOperator *op)
+static int logic_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= logic_has_buttons_region(sa);
@@ -200,6 +198,7 @@ void LOGIC_OT_links_cut(wmOperatorType *ot)
ot->name= "Cut links";
ot->idname= "LOGIC_OT_links_cut";
+ ot->description= "Remove logic brick connections";
ot->invoke= WM_gesture_lines_invoke;
ot->modal= WM_gesture_lines_modal;
diff --git a/source/blender/editors/space_logic/logic_intern.h b/source/blender/editors/space_logic/logic_intern.h
index 0c30aa711f1..acd5eb0e098 100644
--- a/source/blender/editors/space_logic/logic_intern.h
+++ b/source/blender/editors/space_logic/logic_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c
index 4641fd2ce61..979979ff23e 100644
--- a/source/blender/editors/space_logic/logic_ops.c
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,11 +33,13 @@
#include "DNA_actuator_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_main.h"
#include "BKE_sca.h"
+#include "ED_logic.h"
#include "ED_object.h"
#include "ED_screen.h"
@@ -51,7 +53,6 @@
#include "logic_intern.h"
/* ************* Generic Operator Helpers ************* */
-
static int edit_sensor_poll(bContext *C)
{
PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor);
@@ -238,7 +239,7 @@ static int sensor_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
- static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+ static int sensor_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_sensor_invoke_properties(C, op))
return sensor_remove_exec(C, op);
@@ -246,7 +247,7 @@ static int sensor_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_sensor_remove(wmOperatorType *ot)
+static void LOGIC_OT_sensor_remove(wmOperatorType *ot)
{
ot->name= "Remove Sensor";
ot->description= "Remove a sensor from the active object";
@@ -298,7 +299,7 @@ static int sensor_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void LOGIC_OT_sensor_add(wmOperatorType *ot)
+static void LOGIC_OT_sensor_add(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -341,7 +342,7 @@ static int controller_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
- static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+ static int controller_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_controller_invoke_properties(C, op))
return controller_remove_exec(C, op);
@@ -349,7 +350,7 @@ static int controller_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_controller_remove(wmOperatorType *ot)
+static void LOGIC_OT_controller_remove(wmOperatorType *ot)
{
ot->name= "Remove Controller";
ot->description= "Remove a controller from the active object";
@@ -415,7 +416,7 @@ static int controller_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void LOGIC_OT_controller_add(wmOperatorType *ot)
+static void LOGIC_OT_controller_add(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Add Controller";
@@ -455,7 +456,7 @@ static int actuator_remove_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_actuator_invoke_properties(C, op))
return actuator_remove_exec(C, op);
@@ -463,7 +464,7 @@ static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_actuator_remove(wmOperatorType *ot)
+static void LOGIC_OT_actuator_remove(wmOperatorType *ot)
{
ot->name= "Remove Actuator";
ot->description= "Remove a actuator from the active object";
@@ -515,7 +516,7 @@ static int actuator_add_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void LOGIC_OT_actuator_add(wmOperatorType *ot)
+static void LOGIC_OT_actuator_add(wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -562,7 +563,7 @@ static int sensor_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_sensor_invoke_properties(C, op)) {
return sensor_move_exec(C, op);
@@ -571,7 +572,7 @@ static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_sensor_move(wmOperatorType *ot)
+static void LOGIC_OT_sensor_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move Sensor";
@@ -607,7 +608,7 @@ static int controller_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_controller_invoke_properties(C, op)) {
return controller_move_exec(C, op);
@@ -616,7 +617,7 @@ static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_controller_move(wmOperatorType *ot)
+static void LOGIC_OT_controller_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move Controller";
@@ -652,7 +653,7 @@ static int actuator_move_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (edit_actuator_invoke_properties(C, op)) {
return actuator_move_exec(C, op);
@@ -661,7 +662,7 @@ static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
}
-void LOGIC_OT_actuator_move(wmOperatorType *ot)
+static void LOGIC_OT_actuator_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Move Actuator";
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index 4b778e80b0e..f7a65d27bb3 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,7 +45,9 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BKE_action.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_library.h"
@@ -182,7 +184,7 @@ void make_unique_prop_names(bContext *C, char *str)
MEM_freeN(names);
}
-static void make_unique_prop_names_cb(bContext *C, void *strv, void *redraw_view3d_flagv)
+static void make_unique_prop_names_cb(bContext *C, void *strv, void *UNUSED(redraw_view3d_flagv))
{
char *str= strv;
// int redraw_view3d_flag= GET_INT_FROM_POINTER(redraw_view3d_flagv);
@@ -354,7 +356,7 @@ static void old_sca_move_actuator(bContext *C, void *datav, void *move_up)
}
}
-void do_logic_buts(bContext *C, void *arg, int event)
+static void do_logic_buts(bContext *C, void *UNUSED(arg), int event)
{
Main *bmain= CTX_data_main(C);
bSensor *sens;
@@ -593,7 +595,7 @@ void do_logic_buts(bContext *C, void *arg, int event)
}
-static char *sensor_name(int type)
+static const char *sensor_name(int type)
{
switch (type) {
case SENS_ALWAYS:
@@ -630,7 +632,7 @@ static char *sensor_name(int type)
return "unknown";
}
-static char *sensor_pup(void)
+static const char *sensor_pup(void)
{
/* the number needs to match defines in DNA_sensor_types.h */
return "Sensors %t|Always %x0|Delay %x13|Keyboard %x3|Mouse %x5|"
@@ -638,7 +640,7 @@ static char *sensor_pup(void)
"Property %x4|Random %x8|Ray %x9|Message %x10|Joystick %x11|Actuator %x12|Armature %x14";
}
-static char *controller_name(int type)
+static const char *controller_name(int type)
{
switch (type) {
case CONT_LOGIC_AND:
@@ -661,12 +663,12 @@ static char *controller_name(int type)
return "unknown";
}
-static char *controller_pup(void)
+static const char *controller_pup(void)
{
return "Controllers %t|AND %x0|OR %x1|XOR %x6|NAND %x4|NOR %x5|XNOR %x7|Expression %x2|Python %x3";
}
-static char *actuator_name(int type)
+static const char *actuator_name(int type)
{
switch (type) {
case ACT_SHAPEACTION:
@@ -718,7 +720,7 @@ static char *actuator_name(int type)
-static char *actuator_pup(Object *owner)
+static const char *actuator_pup(Object *owner)
{
switch (owner->type)
{
@@ -964,7 +966,7 @@ static void set_col_sensor(int type, int medium)
}
-static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
+static void verify_logicbutton_func(bContext *UNUSED(C), void *data1, void *data2)
{
bSensor *sens= (bSensor*)data1;
@@ -976,12 +978,12 @@ static void verify_logicbutton_func(bContext *C, void *data1, void *data2)
}
}
-static void test_scriptpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_scriptpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->text, name, offsetof(ID, name) + 2);
}
-static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_actionpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->action, name, offsetof(ID, name) + 2);
if(*idpp)
@@ -989,35 +991,35 @@ static void test_actionpoin_but(struct bContext *C, char *name, ID **idpp)
}
-static void test_obpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_obpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->object, name, offsetof(ID, name) + 2);
if(*idpp)
id_lib_extern(*idpp); /* checks lib data, sets correct flag for saving then */
}
-static void test_meshpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_meshpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->mesh, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_matpoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_matpoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->mat, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_scenepoin_but(struct bContext *C, char *name, ID **idpp)
+static void test_scenepoin_but(struct bContext *C, const char *name, ID **idpp)
{
*idpp= BLI_findstring(&CTX_data_main(C)->scene, name, offsetof(ID, name) + 2);
if(*idpp)
id_us_plus(*idpp);
}
-static void test_keyboard_event(struct bContext *C, void *arg_ks, void *arg_unused)
+static void test_keyboard_event(struct bContext *UNUSED(C), void *arg_ks, void *UNUSED(arg))
{
bKeyboardSensor *ks= (bKeyboardSensor*)arg_ks;
@@ -1078,6 +1080,20 @@ static void draw_default_sensor_header(bSensor *sens,
"Invert the level (output) of this sensor");
}
+static void get_armature_bone_constraint(Object *ob, const char *posechannel, const char *constraint_name, bConstraint **constraint)
+{
+ /* check that bone exist in the active object */
+ if (ob->type == OB_ARMATURE && ob->pose) {
+ bPoseChannel *pchan= get_pose_channel(ob->pose, posechannel);
+ if(pchan) {
+ bConstraint *con= BLI_findstring(&pchan->constraints, constraint_name, offsetof(bConstraint, name));
+ if(con) {
+ *constraint= con;
+ }
+ }
+ }
+ /* didn't find any */
+}
static void check_armature_bone_constraint(Object *ob, char *posechannel, char *constraint)
{
/* check that bone exist in the active object */
@@ -1116,7 +1132,7 @@ static void check_armature_sensor(bContext *C, void *arg1_but, void *arg2_sens)
check_armature_bone_constraint(ob, sens->posechannel, sens->constraint);
}
-static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short xco, short yco, short width,char* objectname)
+static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short xco, short yco, short width)
{
bNearSensor *ns = NULL;
bTouchSensor *ts = NULL;
@@ -1134,7 +1150,7 @@ static short draw_sensorbuttons(Object *ob, bSensor *sens, uiBlock *block, short
bDelaySensor *ds = NULL;
uiBut *but;
short ysize;
- char *str;
+ const char *str;
/* yco is at the top of the rect, draw downwards */
@@ -1734,7 +1750,7 @@ static void set_col_actuator(int item, int medium)
}
-static void change_object_actuator(bContext *C, void *act, void *arg)
+static void change_object_actuator(bContext *UNUSED(C), void *act, void *UNUSED(arg))
{
bObjectActuator *oa = act;
@@ -1758,7 +1774,7 @@ static void change_object_actuator(bContext *C, void *act, void *arg)
}
}
-static void change_ipo_actuator(bContext *C, void *arg1_but, void *arg2_ia)
+static void change_ipo_actuator(bContext *UNUSED(C), void *arg1_but, void *arg2_ia)
{
bIpoActuator *ia = arg2_ia;
uiBut *but = arg1_but;
@@ -1770,13 +1786,13 @@ static void change_ipo_actuator(bContext *C, void *arg1_but, void *arg2_ia)
but->retval = B_REDR;
}
-void update_object_actuator_PID(bContext *C, void *act, void *arg)
+static void update_object_actuator_PID(bContext *UNUSED(C), void *act, void *UNUSED(arg))
{
bObjectActuator *oa = act;
oa->forcerot[0] = 60.0f*oa->forcerot[1];
}
-char *get_state_name(Object *ob, short bit)
+static char *get_state_name(Object *ob, short bit)
{
bController *cont;
unsigned int mask;
@@ -1839,7 +1855,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
float *fp;
short ysize = 0, wval;
- char *str;
+ const char *str;
int myline, stbit;
uiBut *but;
@@ -2014,8 +2030,8 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
}
else
{
- uiDefButI(block, NUM, 0, "Sta: ",xco+10, yco-44, (width-20)/2, 19, &aa->sta, 1.0, MAXFRAMEF, 0, 0, "Start frame");
- uiDefButI(block, NUM, 0, "End: ",xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &aa->end, 1.0, MAXFRAMEF, 0, 0, "End frame");
+ uiDefButF(block, NUM, 0, "Sta: ",xco+10, yco-44, (width-20)/2, 19, &aa->sta, 1.0, MAXFRAMEF, 0, 0, "Start frame");
+ uiDefButF(block, NUM, 0, "End: ",xco+10+(width-20)/2, yco-44, (width-20)/2, 19, &aa->end, 1.0, MAXFRAMEF, 0, 0, "End frame");
}
uiDefButS(block, NUM, 0, "Blendin: ", xco+10, yco-64, (width-20)/2, 19, &aa->blendin, 0.0, 32767, 0.0, 0.0, "Number of frames of motion blending");
@@ -2076,11 +2092,11 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
"Use this property to define the Ipo position");
}
else {
- uiDefButI(block, NUM, 0,
+ uiDefButF(block, NUM, 0,
"Sta", xco+10, yco-44, (width-80)/2, 19,
&ia->sta, 1.0, MAXFRAMEF, 0, 0,
"Start frame");
- uiDefButI(block, NUM, 0,
+ uiDefButF(block, NUM, 0,
"End", xco+10+(width-80)/2, yco-44, (width-80)/2, 19,
&ia->end, 1.0, MAXFRAMEF, 0, 0,
"End frame");
@@ -2167,7 +2183,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
uiDefButF(block, NUM, 0, "Cone Inner Angle: ", xco+wval+10, yco-176, wval, 19, &sa->sound3D.cone_inner_angle, 0.0, 360.0, 0.0, 0.0, "The angle of the inner cone.");
}
}
- MEM_freeN(str);
+ MEM_freeN((void *)str);
}
else {
uiDefButO(block, BUT, "sound.open", 0, "Load Sound", xco+10, yco-22, width-20, 19, "Load a sound file.");
@@ -2206,7 +2222,6 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
eoa= act->data;
if(eoa->type==ACT_EDOB_ADD_OBJECT) {
- int wval; /* just a temp width */
ysize = 92;
glRects(xco, yco-ysize, xco+width, yco);
uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
@@ -2920,7 +2935,7 @@ static short draw_actuatorbuttons(Main *bmain, Object *ob, bActuator *act, uiBlo
return yco-4;
}
-static void do_sensor_menu(bContext *C, void *arg, int event)
+static void do_sensor_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -2949,7 +2964,7 @@ static void do_sensor_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int yco=0;
@@ -2969,7 +2984,7 @@ static uiBlock *sensor_menu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_controller_menu(bContext *C, void *arg, int event)
+static void do_controller_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -2998,7 +3013,7 @@ static void do_controller_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *controller_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int yco=0;
@@ -3018,7 +3033,7 @@ static uiBlock *controller_menu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_actuator_menu(bContext *C, void *arg, int event)
+static void do_actuator_menu(bContext *C, void *UNUSED(arg), int event)
{
SpaceLogic *slogic= CTX_wm_space_logic(C);
ID **idar;
@@ -3047,7 +3062,7 @@ static void do_actuator_menu(bContext *C, void *arg, int event)
if(idar) MEM_freeN(idar);
}
-static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
int xco=0;
@@ -3069,7 +3084,7 @@ static uiBlock *actuator_menu(bContext *C, ARegion *ar, void *arg_unused)
-static void check_controller_state_mask(bContext *C, void *arg1_but, void *arg2_mask)
+static void check_controller_state_mask(bContext *UNUSED(C), void *arg1_but, void *arg2_mask)
{
unsigned int *cont_mask = arg2_mask;
uiBut *but = arg1_but;
@@ -3122,7 +3137,7 @@ static uiBlock *controller_state_mask_menu(bContext *C, ARegion *ar, void *arg_c
return block;
}
-static void do_object_state_menu(bContext *C, void *arg, int event)
+static void do_object_state_menu(bContext *UNUSED(C), void *arg, int event)
{
Object *ob = arg;
@@ -3183,19 +3198,19 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *lo
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
} else {
- uiItemL(row, sensor_name(sens->type), 0);
- uiItemL(row, sens->name, 0);
+ uiItemL(row, sensor_name(sens->type), ICON_NULL);
+ uiItemL(row, sens->name, ICON_NULL);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_sensors_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3216,14 +3231,14 @@ static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(split, 1);
uiItemR(row, ptr, "use_pulse_true_level", 0, "", ICON_DOTSUP);
uiItemR(row, ptr, "use_pulse_false_level", 0, "", ICON_DOTSDOWN);
- uiItemR(row, ptr, "frequency", 0, "Freq", 0);
+ uiItemR(row, ptr, "frequency", 0, "Freq", ICON_NULL);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", 0);
+ uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", ICON_NULL);
}
/* sensors in alphabetical order */
@@ -3246,7 +3261,7 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Sensor only available for armatures", 0);
+ uiItemL(layout, "Sensor only available for armatures", ICON_NULL);
return;
}
@@ -3262,8 +3277,9 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "test_type", 0, NULL, 0);
- uiItemR(row, ptr, "value", 0, NULL, 0);
+ uiItemR(row, ptr, "test_type", 0, NULL, ICON_NULL);
+ if (RNA_enum_get(ptr, "test_type") != SENS_ARM_STATE_CHANGED)
+ uiItemR(row, ptr, "value", 0, NULL, ICON_NULL);
}
static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3275,12 +3291,12 @@ static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C
split = uiLayoutSplit(layout, 0.3, 0);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "use_material")) {
case SENS_COLLISION_PROPERTY:
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
break;
case SENS_COLLISION_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
@@ -3294,48 +3310,48 @@ static void draw_sensor_delay(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "delay", 0, NULL, 0);
- uiItemR(row, ptr, "duration", 0, NULL, 0);
- uiItemR(row, ptr, "use_repeat", 0, NULL, 0);
+ uiItemR(row, ptr, "delay", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "duration", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_repeat", 0, NULL, ICON_NULL);
}
static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemR(layout, ptr, "joystick_index", 0, NULL, 0);
- uiItemR(layout, ptr, "event_type", 0, NULL, 0);
+ uiItemR(layout, ptr, "joystick_index", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "event_type", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "event_type")) {
case SENS_JOY_BUTTON:
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "button_number", 0, NULL, 0);
+ uiItemR(col, ptr, "button_number", 0, NULL, ICON_NULL);
break;
case SENS_JOY_AXIS:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "axis_number", 0, NULL, 0);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, 0);
+ uiItemR(row, ptr, "axis_number", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "axis_direction", 0, NULL, 0);
+ uiItemR(col, ptr, "axis_direction", 0, NULL, ICON_NULL);
break;
case SENS_JOY_HAT:
- uiItemR(layout, ptr, "hat_number", 0, NULL, 0);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, 0);
+ uiItemR(layout, ptr, "hat_number", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "hat_direction", 0, NULL, 0);
+ uiItemR(col, ptr, "hat_direction", 0, NULL, ICON_NULL);
break;
case SENS_JOY_AXIS_SINGLE:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "single_axis_number", 0, NULL, 0);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, 0);
+ uiItemR(row, ptr, "single_axis_number", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
break;
}
}
@@ -3347,47 +3363,47 @@ static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr)
uiLayout *row, *col;
row = uiLayoutRow(layout, 0);
- uiItemL(row, "Key:", 0);
+ uiItemL(row, "Key:", ICON_NULL);
col = uiLayoutColumn(row, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
- uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", 0);
+ uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
row = uiLayoutRow(col, 0);
- uiItemL(row, "First Modifier:", 0);
- uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", 0);
+ uiItemL(row, "First Modifier:", ICON_NULL);
+ uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemL(row, "Second Modifier:", 0);
- uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", 0);
+ uiItemL(row, "Second Modifier:", ICON_NULL);
+ uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", ICON_NULL);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, 0);
- uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, ICON_NULL);
}
static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "subject", 0, NULL, 0);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
}
static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mouse_event", 0, NULL, 0);
+ uiItemR(layout, ptr, "mouse_event", 0, NULL, ICON_NULL);
}
static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, 0);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "distance", 0, NULL, 0);
- uiItemR(row, ptr, "reset_distance", 0, NULL, 0);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "reset_distance", 0, NULL, ICON_NULL);
}
static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
@@ -3396,22 +3412,22 @@ static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
PointerRNA settings_ptr;
uiLayout *row;
- uiItemR(layout, ptr, "evaluation_type", 0, NULL, 0);
+ uiItemR(layout, ptr, "evaluation_type", 0, NULL, ICON_NULL);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "evaluation_type")) {
case SENS_PROP_INTERVAL:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "value_min", 0, NULL, 0);
- uiItemR(row, ptr, "value_max", 0, NULL, 0);
+ uiItemR(row, ptr, "value_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "value_max", 0, NULL, ICON_NULL);
break;
case SENS_PROP_EQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case SENS_PROP_NEQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case SENS_PROP_CHANGED:
break;
@@ -3422,17 +3438,17 @@ static void draw_sensor_radar(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, 0);
- uiItemR(layout, ptr, "axis", 0, NULL, 0);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "axis", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "angle", 0, NULL, 0);
- uiItemR(row, ptr, "distance", 0, NULL, 0);
+ uiItemR(row, ptr, "angle", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
}
static void draw_sensor_random(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "seed", 0, NULL, 0);
+ uiItemR(layout, ptr, "seed", 0, NULL, ICON_NULL);
}
static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3442,10 +3458,10 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "ray_type", 0, "", 0);
+ uiItemR(split, ptr, "ray_type", 0, "", ICON_NULL);
switch (RNA_enum_get(ptr, "ray_type")) {
case SENS_RAY_PROPERTY:
- uiItemR(split, ptr, "property", 0, "", 0);
+ uiItemR(split, ptr, "property", 0, "", ICON_NULL);
break;
case SENS_RAY_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", "", ICON_MATERIAL_DATA);
@@ -3453,18 +3469,18 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
}
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "axis", 0, "", 0);
+ uiItemR(split, ptr, "axis", 0, "", ICON_NULL);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "range", 0, NULL, 0);
- uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "range", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
}
static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "material", 0, NULL, 0);
+ uiItemR(layout, ptr, "material", 0, NULL, ICON_NULL);
}
-void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C)
+static void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
uiLayout *box;
@@ -3536,19 +3552,19 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
/* XXX provisory for Blender 2.50Beta */
uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, "Set controller state index (from 1 to 30)");
} else {
- uiItemL(row, controller_name(cont->type), 0);
- uiItemL(row, cont->name, 0);
- uiItemL(row, state, 0);
+ uiItemL(row, controller_name(cont->type), ICON_NULL);
+ uiItemL(row, cont->name, ICON_NULL);
+ uiItemL(row, state, ICON_NULL);
}
- uiItemR(row, ptr, "use_priority", 0, "", 0);
+ uiItemR(row, ptr, "use_priority", 0, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3560,7 +3576,7 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "expression", 0, "", 0);
+ uiItemR(layout, ptr, "expression", 0, "", ICON_NULL);
}
static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
@@ -3568,23 +3584,23 @@ static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
uiLayout *split, *subsplit;
split = uiLayoutSplit(layout, 0.3, 1);
- uiItemR(split, ptr, "mode", 0, "", 0);
+ uiItemR(split, ptr, "mode", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "mode") == CONT_PY_SCRIPT) {
- uiItemR(split, ptr, "text", 0, "", 0);
+ uiItemR(split, ptr, "text", 0, "", ICON_NULL);
}
else {
subsplit = uiLayoutSplit(split, 0.8, 0);
- uiItemR(subsplit, ptr, "module", 0, "", 0);
- uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subsplit, ptr, "module", 0, "", ICON_NULL);
+ uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
}
}
-static void draw_controller_state(uiLayout *layout, PointerRNA *ptr)
+static void draw_controller_state(uiLayout *UNUSED(layout), PointerRNA *UNUSED(ptr))
{
}
-void draw_brick_controller(uiLayout *layout, PointerRNA *ptr)
+static void draw_brick_controller(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *box;
@@ -3626,19 +3642,19 @@ static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", 0);
- uiItemR(row, ptr, "name", 0, "", 0);
+ uiItemR(row, ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "name", 0, "", ICON_NULL);
} else {
- uiItemL(row, actuator_name(act->type), 0);
- uiItemL(row, act->name, 0);
+ uiItemL(row, actuator_name(act->type), ICON_NULL);
+ uiItemL(row, act->name, ICON_NULL);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_actuators_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", 0);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3655,34 +3671,34 @@ static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", 0);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_mode", 0, "", 0);
- uiItemR(row, ptr, "action", 0, NULL, 0);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, 0);
+ uiItemR(row, ptr, "play_mode", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, 0);
- uiItemR(row, ptr, "priority", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, 0);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
#endif
}
@@ -3691,11 +3707,12 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
bActuator *act = (bActuator*)ptr->data;
bArmatureActuator *aa = (bArmatureActuator *) act->data;
Object *ob = (Object *)ptr->id.data;
+ bConstraint *constraint = NULL;
PointerRNA pose_ptr, pchan_ptr;
- PropertyRNA *bones_prop;
+ PropertyRNA *bones_prop = NULL;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", 0);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
return;
}
@@ -3704,7 +3721,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
bones_prop = RNA_struct_find_property(&pose_ptr, "bones");
}
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
@@ -3712,7 +3729,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
break;
case ACT_ARM_ENABLE:
case ACT_ARM_DISABLE:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
@@ -3720,25 +3737,30 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
}
break;
case ACT_ARM_SETTARGET:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "target", 0, NULL, 0);
- uiItemR(layout, ptr, "secondary_target", 0, NULL, 0);
+ uiItemR(layout, ptr, "target", 0, NULL, ICON_NULL);
+
+ /* show second target only if the constraint supports it */
+ get_armature_bone_constraint(ob, aa->posechannel, aa->constraint, &constraint);
+ if (constraint && constraint->type == CONSTRAINT_TYPE_KINEMATIC) {
+ uiItemR(layout, ptr, "secondary_target", 0, NULL, ICON_NULL);
+ }
break;
case ACT_ARM_SETWEIGHT:
- if (&pose_ptr.data) {
+ if (ob->pose) {
uiItemPointerR(layout, ptr, "bone", &pose_ptr, "bones", NULL, ICON_BONE_DATA);
if (RNA_property_collection_lookup_string(&pose_ptr, bones_prop, aa->posechannel, &pchan_ptr))
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "weight", 0, NULL, 0);
+ uiItemR(layout, ptr, "weight", 0, NULL, ICON_NULL);
break;
}
}
@@ -3746,15 +3768,15 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
static void draw_actuator_camera(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "object", 0, NULL, 0);
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "height", 0, NULL, 0);
- uiItemR(row, ptr, "axis", 0, NULL, 0);
+ uiItemR(row, ptr, "height", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis", 0, NULL, ICON_NULL);
- row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "min", 0, NULL, 0);
- uiItemR(row, ptr, "max", 0, NULL, 0);
+ row = uiLayoutRow(layout, 1);
+ uiItemR(row, ptr, "min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "max", 0, NULL, ICON_NULL);
}
static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3764,96 +3786,96 @@ static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_CONST_TYPE_LOC:
- uiItemR(layout, ptr, "limit", 0, NULL, 0);
+ uiItemR(layout, ptr, "limit", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "limit_min", 0, NULL, 0);
- uiItemR(row, ptr, "limit_max", 0, NULL, 0);
+ uiItemR(row, ptr, "limit_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "limit_max", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_DIST:
split = uiLayoutSplit(layout, 0.8, 0);
- uiItemR(split, ptr, "direction", 0, NULL, 0);
+ uiItemR(split, ptr, "direction", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemL(col, "Range:", 0);
- uiItemR(col, ptr, "range", 0, "", 0);
+ uiItemL(col, "Range:", ICON_NULL);
+ uiItemR(col, ptr, "range", 0, "", ICON_NULL);
col = uiLayoutColumn(row, 1);
- uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 0);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_force_distance")==1);
- uiItemR(subcol, ptr, "distance", 0, "", 0);
+ uiItemR(subcol, ptr, "distance", 0, "", ICON_NULL);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "time", 0, NULL, 0);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_ORI:
- uiItemR(layout, ptr, "direction_axis", 0, NULL, 0);
+ uiItemR(layout, ptr, "direction_axis_pos", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
+ uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "rotation_max", 0, NULL, 0);
+ uiItemR(row, ptr, "rotation_max", 0, NULL, ICON_NULL);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "angle_min", 0, NULL, 0);
- uiItemR(row, ptr, "angle_max", 0, NULL, 0);
+ uiItemR(row, ptr, "angle_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angle_max", 0, NULL, ICON_NULL);
break;
case ACT_CONST_TYPE_FH:
split=uiLayoutSplit(layout, 0.75, 0);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, 0);
+ uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
- uiItemR(row, ptr, "fh_height", 0, NULL, 0);
- uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, 0);
+ uiItemR(row, ptr, "fh_height", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "direction_axis", 0, NULL, 0);
+ uiItemR(row, ptr, "direction_axis", 0, NULL, ICON_NULL);
split = uiLayoutSplit(row, 0.9, 0);
- uiItemR(split, ptr, "spring", 0, NULL, 0);
- uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, 0);
+ uiItemR(split, ptr, "spring", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, 0);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
}
}
@@ -3862,53 +3884,53 @@ static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr)
{
Object *ob = (Object *)ptr->id.data;
uiLayout *row, *split, *subsplit;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_EDOB_ADD_OBJECT:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, 0);
- uiItemR(row, ptr, "time", 0, NULL, 0);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_END_OBJECT:
break;
case ACT_EDOB_REPLACE_MESH:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", 0);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
break;
}
split = uiLayoutSplit(layout, 0.6, 0);
- uiItemR(split, ptr, "mesh", 0, NULL, 0);
+ uiItemR(split, ptr, "mesh", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_TRACK_TO:
split = uiLayoutSplit(layout, 0.5, 0);
- uiItemR(split, ptr, "track_object", 0, NULL, 0);
+ uiItemR(split, ptr, "track_object", 0, NULL, ICON_NULL);
subsplit = uiLayoutSplit(split, 0.7, 0);
- uiItemR(subsplit, ptr, "time", 0, NULL, 0);
- uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subsplit, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_EDOB_DYNAMICS:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", 0);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
break;
}
- uiItemR(layout, ptr, "dynamic_operation", 0, NULL, 0);
+ uiItemR(layout, ptr, "dynamic_operation", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "dynamic_operation") == ACT_EDOB_SET_MASS)
- uiItemR(layout, ptr, "mass", 0, NULL, 0);
+ uiItemR(layout, ptr, "mass", 0, NULL, ICON_NULL);
break;
}
}
@@ -3917,31 +3939,31 @@ static void draw_actuator_filter_2d(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row, *split;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_2DFILTER_CUSTOMFILTER:
- uiItemR(layout, ptr, "filter_pass", 0, NULL, 0);
- uiItemR(layout, ptr, "glsl_shader", 0, NULL, 0);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "glsl_shader", 0, NULL, ICON_NULL);
break;
case ACT_2DFILTER_MOTIONBLUR:
split=uiLayoutSplit(layout, 0.75, 1);
row= uiLayoutRow(split, 0);
uiLayoutSetActive(row, RNA_boolean_get(ptr, "use_motion_blur")==1);
- uiItemR(row, ptr, "motion_blur_factor", 0, NULL, 0);
- uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "motion_blur_factor", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
default: // all other 2D Filters
- uiItemR(layout, ptr, "filter_pass", 0, NULL, 0);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "mode") == ACT_GAME_LOAD)
- uiItemR(layout, ptr, "filename", 0, NULL, 0);
+ uiItemR(layout, ptr, "filename", 0, NULL, ICON_NULL);
}
static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
@@ -3954,27 +3976,27 @@ static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_type", 0, "", 0);
+ uiItemR(row, ptr, "play_type", 0, "", ICON_NULL);
subrow= uiLayoutRow(row, 1);
- uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
col = uiLayoutColumn(subrow, 0);
uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force")));
- uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
- uiItemR(row, ptr, "apply_to_children", 0, NULL, 0);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
}
static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3989,15 +4011,15 @@ static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
uiItemPointerR(layout, ptr, "to_property", &main_ptr, "objects", NULL, ICON_OBJECT_DATA);
- uiItemR(layout, ptr, "subject", 0, NULL, 0);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "body_type", 0, NULL, 0);
+ uiItemR(row, ptr, "body_type", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "body_type") == ACT_MESG_MESG)
- uiItemR(row, ptr, "body_message", 0, "", 0);
+ uiItemR(row, ptr, "body_message", 0, "", ICON_NULL);
else // mode == ACT_MESG_PROP
- uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", 0);
+ uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", ICON_NULL);
}
static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
@@ -4011,99 +4033,104 @@ static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
physics_type = RNA_enum_get(&settings_ptr, "physics_type");
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_OBJECT_NORMAL:
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_location", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_rotation", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
if (ELEM3(physics_type, OB_BODY_TYPE_DYNAMIC, OB_BODY_TYPE_RIGID, OB_BODY_TYPE_SOFT)) {
- uiItemL(layout, "Dynamic Object Settings:", 0);
+ uiItemL(layout, "Dynamic Object Settings:", ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "force", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "force", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "torque", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "torque", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(layout, ptr, "damping", 0, NULL, 0);
+ uiItemR(layout, ptr, "damping", 0, NULL, ICON_NULL);
}
break;
case ACT_OBJECT_SERVO:
- uiItemR(layout, ptr, "reference_object", 0, NULL, 0);
+ uiItemR(layout, ptr, "reference_object", 0, NULL, ICON_NULL);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, 0);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_x")==1);
- uiItemR(subcol, ptr, "force_max_x", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_x", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_x", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_x", 0, NULL, ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_y")==1);
- uiItemR(subcol, ptr, "force_max_y", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_y", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_y", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_y", 0, NULL, ICON_NULL);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_z")==1);
- uiItemR(subcol, ptr, "force_max_z", 0, NULL, 0);
- uiItemR(subcol, ptr, "force_min_z", 0, NULL, 0);
+ uiItemR(subcol, ptr, "force_max_z", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_min_z", 0, NULL, ICON_NULL);
//XXXACTUATOR missing labels from original 2.49 ui (e.g. Servo, Min, Max, Fast)
//Layout designers willing to help on that, please compare with 2.49 ui
// (since the old code is going to be deleted ... soon)
col = uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr)
{
- uiLayout *row;
+ uiLayout *row, *subrow;
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
- uiItemR(layout, ptr, "object", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
- row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_compound", 0, NULL, 0);
- uiItemR(row, ptr, "use_ghost", 0, NULL, 0);
+ if (RNA_enum_get(ptr, "mode") == ACT_PARENT_SET) {
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
+
+ row = uiLayoutRow(layout, 0);
+ uiItemR(row, ptr, "use_compound", 0, NULL, ICON_NULL);
+ subrow= uiLayoutRow(row, 0);
+ uiLayoutSetActive(subrow, RNA_boolean_get(ptr, "use_compound")==1);
+ uiItemR(subrow, ptr, "use_ghost", 0, NULL, ICON_NULL);
+ }
}
static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr)
@@ -4118,30 +4145,30 @@ static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
switch(RNA_enum_get(ptr, "mode"))
{
case ACT_PROP_TOGGLE:
break;
case ACT_PROP_ADD:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case ACT_PROP_ASSIGN:
- uiItemR(layout, ptr, "value", 0, NULL, 0);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
break;
case ACT_PROP_COPY:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, 0);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
if(ob_from){
RNA_pointer_create((ID *)ob_from, &RNA_GameObjectSettings, ob_from, &obj_settings_ptr);
- uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, ICON_NULL);
}else
{
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, 0);
- uiItemR(subrow, ptr, "object_property", 0, NULL, 0);
+ uiItemR(subrow, ptr, "object_property", 0, NULL, ICON_NULL);
}
break;
}
@@ -4158,72 +4185,72 @@ static void draw_actuator_random(uiLayout *layout, PointerRNA *ptr)
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "seed", 0, NULL, 0);
- uiItemR(row, ptr, "distribution", 0, NULL, 0);
+ uiItemR(row, ptr, "seed", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distribution", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
switch (RNA_enum_get(ptr, "distribution")){
case ACT_RANDOM_BOOL_CONST:
- uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, 0);
+ uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
break;
case ACT_RANDOM_BOOL_UNIFORM:
- uiItemL(row, "Choose between true and false, 50% chance each", 0);
+ uiItemL(row, "Choose between true and false, 50% chance each", ICON_NULL);
break;
case ACT_RANDOM_BOOL_BERNOUILLI:
- uiItemR(row, ptr, "chance", 0, NULL, 0);
+ uiItemR(row, ptr, "chance", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_CONST:
- uiItemR(row, ptr, "int_value", 0, NULL, 0);
+ uiItemR(row, ptr, "int_value", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_UNIFORM:
- uiItemR(row, ptr, "int_min", 0, NULL, 0);
- uiItemR(row, ptr, "int_max", 0, NULL, 0);
+ uiItemR(row, ptr, "int_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "int_max", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_INT_POISSON:
- uiItemR(row, ptr, "int_mean", 0, NULL, 0);
+ uiItemR(row, ptr, "int_mean", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_CONST:
- uiItemR(row, ptr, "float_value", 0, NULL, 0);
+ uiItemR(row, ptr, "float_value", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_UNIFORM:
- uiItemR(row, ptr, "float_min", 0, NULL, 0);
- uiItemR(row, ptr, "float_max", 0, NULL, 0);
+ uiItemR(row, ptr, "float_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "float_max", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_NORMAL:
- uiItemR(row, ptr, "float_mean", 0, NULL, 0);
- uiItemR(row, ptr, "standard_derivation", 0, NULL, 0);
+ uiItemR(row, ptr, "float_mean", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "standard_derivation", 0, NULL, ICON_NULL);
break;
case ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL:
- uiItemR(row, ptr, "half_life_time", 0, NULL, 0);
+ uiItemR(row, ptr, "half_life_time", 0, NULL, ICON_NULL);
break;
}
}
static void draw_actuator_scene(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_SCENE_CAMERA:
- uiItemR(layout, ptr, "camera", 0, NULL, 0);
+ uiItemR(layout, ptr, "camera", 0, NULL, ICON_NULL);
break;
case ACT_SCENE_RESTART:
break;
default: // ACT_SCENE_SET|ACT_SCENE_ADD_FRONT|ACT_SCENE_ADD_BACK|ACT_SCENE_REMOVE|ACT_SCENE_SUSPEND|ACT_SCENE_RESUME
- uiItemR(layout, ptr, "scene", 0, NULL, 0);
+ uiItemR(layout, ptr, "scene", 0, NULL, ICON_NULL);
break;
}
}
@@ -4235,35 +4262,35 @@ static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_MESH){
- uiItemL(layout, "Actuator only available for mesh objects", 0);
+ uiItemL(layout, "Actuator only available for mesh objects", ICON_NULL);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "mode", 0, "", 0);
- uiItemR(row, ptr, "action", 0, NULL, 0);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, 0);
+ uiItemR(row, ptr, "mode", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, 0);
- uiItemR(row, ptr, "frame_end", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, 0);
- uiItemR(row, ptr, "priority", 0, NULL, 0);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, 0);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, 0);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
#endif
}
@@ -4274,35 +4301,35 @@ static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C)
uiTemplateID(layout, C, ptr, "sound", NULL, "SOUND_OT_open", NULL);
if (!RNA_pointer_get(ptr, "sound").data)
{
- uiItemL(layout, "Select a sound from the list or load a new one", 0);
+ uiItemL(layout, "Select a sound from the list or load a new one", ICON_NULL);
return;
}
- uiItemR(layout, ptr, "mode", 0, NULL, 0);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "volume", 0, NULL, 0);
- uiItemR(row, ptr, "pitch", 0, NULL, 0);
+ uiItemR(row, ptr, "volume", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "pitch", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_sound_3d", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_sound_3d", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d")==1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain_3d_min", 0, NULL, 0);
- uiItemR(row, ptr, "gain_3d_max", 0, NULL, 0);
+ uiItemR(row, ptr, "gain_3d_min", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "gain_3d_max", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "distance_3d_reference", 0, NULL, 0);
- uiItemR(row, ptr, "distance_3d_max", 0, NULL, 0);
+ uiItemR(row, ptr, "distance_3d_reference", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance_3d_max", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, 0);
- uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, 0);
+ uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, ICON_NULL);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, 0);
- uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, 0);
+ uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, ICON_NULL);
}
static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
@@ -4313,7 +4340,7 @@ static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
split = uiLayoutSplit(layout, 0.35, 0);
- uiItemR(split, ptr, "operation", 0, NULL, 0);
+ uiItemR(split, ptr, "operation", 0, NULL, ICON_NULL);
uiTemplateLayers(split, ptr, "states", &settings_ptr, "used_states", 0);
}
@@ -4323,12 +4350,12 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_visible", 0, NULL, 0);
- uiItemR(row, ptr, "use_occlusion", 0, NULL, 0);
- uiItemR(row, ptr, "apply_to_children", 0, NULL, 0);
+ uiItemR(row, ptr, "use_visible", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_occlusion", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
}
-void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
+static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
{
uiLayout *box;
@@ -4416,7 +4443,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
RNA_pointer_create(NULL, &RNA_SpaceLogicEditor, slogic, &logic_ptr);
idar= get_selected_and_linked_obs(C, &count, slogic->scaflag);
- sprintf(name, "buttonswin %p", ar);
+ sprintf(name, "buttonswin %p", (void *)ar);
block= uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_logic_buts, NULL);
@@ -4469,9 +4496,9 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", 0);
+ uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", ICON_NULL);
for(a=0; a<count; a++) {
bController *cont;
@@ -4494,7 +4521,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(split, 1);
uiDefButBitS(block, TOG, OB_SHOWCONT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide controllers");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", ICON_NULL);
if (RNA_boolean_get(&settings_ptr, "show_state_panel")) {
@@ -4502,8 +4529,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
split= uiLayoutSplit(box, 0.2, 0);
col= uiLayoutColumn(split, 0);
- uiItemL(col, "Visible", 0);
- uiItemL(col, "Initial", 0);
+ uiItemL(col, "Visible", ICON_NULL);
+ uiItemL(col, "Initial", ICON_NULL);
subsplit= uiLayoutSplit(split, 0.85, 0);
col= uiLayoutColumn(subsplit, 0);
@@ -4514,8 +4541,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiTemplateLayers(row, &settings_ptr, "states_initial", &settings_ptr, "used_states", 0);
col= uiLayoutColumn(subsplit, 0);
- uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, 0);
- uiItemR(col, &settings_ptr, "show_debug_state", 0, "", 0);
+ uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, &settings_ptr, "show_debug_state", 0, "", ICON_NULL);
}
/* End of Drawing the Controller Header common to all Selected Objects */
@@ -4572,10 +4599,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", 0);
- uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", 0);
+ uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", ICON_NULL);
for(a=0; a<count; a++) {
bSensor *sens;
@@ -4589,7 +4616,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWSENS, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide sensors");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", ICON_NULL);
if ((ob->scaflag & OB_SHOWSENS) == 0) continue;
@@ -4638,10 +4665,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", 0);
- uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", 0);
- uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", 0);
- uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", 0);
+ uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", ICON_NULL);
for(a=0; a<count; a++) {
bActuator *act;
@@ -4655,7 +4682,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWACT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide actuators");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", 0);
+ uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", ICON_NULL);
if ((ob->scaflag & OB_SHOWACT) == 0) continue;
@@ -4734,7 +4761,7 @@ void logic_buttons(bContext *C, ARegion *ar)
if(ob==NULL) return;
// uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- sprintf(name, "buttonswin %p", ar);
+ sprintf(name, "buttonswin %p", (void *)ar);
block= uiBeginBlock(C, ar, name, UI_EMBOSS);
uiBlockSetHandleFunc(block, do_logic_buts, NULL);
@@ -4771,8 +4798,6 @@ void logic_buttons(bContext *C, ARegion *ar)
uiDefButBitS(block, TOG, BUTS_CONT_LINK, B_REDR, "Link", xco+110+2*(width-100)/3, yco+35, (width-100)/3, UI_UNIT_Y, &slogic->scaflag, 0, 0, 0, 0, "Show linked Objects to Sensor/Actuator");
uiBlockEndAlign(block);
- ob= CTX_data_active_object(C);
-
for(a=0; a<count; a++) {
unsigned int controller_state_mask = 0; /* store a bitmask for states that are used */
@@ -4955,7 +4980,7 @@ void logic_buttons(bContext *C, ARegion *ar)
uiButSetFunc(but, make_unique_prop_names_cb, sens->name, (void*) 0);
sens->otype= sens->type;
- yco= draw_sensorbuttons(ob, sens, block, xco, yco, width,ob->id.name);
+ yco= draw_sensorbuttons(ob, sens, block, xco, yco, width);
if(yco-6 < ycoo) ycoo= (yco+ycoo-20)/2;
}
else {
@@ -5039,9 +5064,9 @@ void logic_buttons(bContext *C, ARegion *ar)
else {
set_col_actuator(act->type, 1);
glRecti((short)(xco+22), yco, (short)(xco+width-22),(short)(yco+19));
- but= uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator type");
+ /* but= */ uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator type");
// uiButSetFunc(but, old_sca_move_actuator, act, NULL);
- but= uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-(pin?156:134)), UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator name");
+ /* but= */ uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-(pin?156:134)), UI_UNIT_Y, act, 0, 0, 0, 0, "Actuator name");
// uiButSetFunc(but, old_sca_move_actuator, act, NULL);
uiBlockBeginAlign(block);
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 01af324334b..69ac68f6f82 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,10 +34,12 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -82,7 +84,7 @@ ARegion *logic_has_buttons_region(ScrArea *sa)
/* ******************** default callbacks for image space ***************** */
-static SpaceLink *logic_new(const bContext *C)
+static SpaceLink *logic_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceLogic *slogic;
@@ -145,7 +147,7 @@ static SpaceLink *logic_new(const bContext *C)
}
/* not spacelink itself */
-static void logic_free(SpaceLink *sl)
+static void logic_free(SpaceLink *UNUSED(sl))
{
// Spacelogic *slogic= (SpaceLogic*) sl;
@@ -156,7 +158,7 @@ static void logic_free(SpaceLink *sl)
/* spacetype; init callback */
-static void logic_init(struct wmWindowManager *wm, ScrArea *sa)
+static void logic_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -168,13 +170,13 @@ static SpaceLink *logic_duplicate(SpaceLink *sl)
return (SpaceLink *)slogicn;
}
-void logic_operatortypes(void)
+static void logic_operatortypes(void)
{
WM_operatortype_append(LOGIC_OT_properties);
WM_operatortype_append(LOGIC_OT_links_cut);
}
-void logic_keymap(struct wmKeyConfig *keyconf)
+static void logic_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Logic Editor", SPACE_LOGIC, 0);
@@ -183,7 +185,7 @@ void logic_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_menu(keymap, "LOGIC_MT_logicbricks_add", AKEY, KM_PRESS, KM_SHIFT, 0);
}
-static void logic_refresh(const bContext *C, ScrArea *sa)
+static void logic_refresh(const bContext *UNUSED(C), ScrArea *UNUSED(sa))
{
// SpaceLogic *slogic= CTX_wm_space_logic(C);
// Object *obedit= CTX_data_edit_object(C);
@@ -217,11 +219,9 @@ static void logic_listener(ARegion *ar, wmNotifier *wmn)
}
}
-static int logic_context(const bContext *C, const char *member, bContextDataResult *result)
+static int logic_context(const bContext *UNUSED(C), const char *UNUSED(member), bContextDataResult *UNUSED(result))
{
// SpaceLogic *slogic= CTX_wm_space_logic(C);
-
-
return 0;
}
@@ -251,7 +251,7 @@ static void logic_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
logic_buttons((bContext *)C, ar);
@@ -287,7 +287,7 @@ static void logic_buttons_area_draw(const bContext *C, ARegion *ar)
/************************* header region **************************/
/* add handlers, stuff you only do once or on area/region changes */
-static void logic_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void logic_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt
index be8020b0793..f8503739844 100644
--- a/source/blender/editors/space_nla/CMakeLists.txt
+++ b/source/blender/editors/space_nla/CMakeLists.txt
@@ -19,16 +19,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ nla_buttons.c
+ nla_channels.c
+ nla_draw.c
+ nla_edit.c
+ nla_ops.c
+ nla_select.c
+ space_nla.c
+
+ nla_intern.h
)
-BLENDERLIB(bf_editor_space_nla "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_nla "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_nla/Makefile b/source/blender/editors/space_nla/Makefile
deleted file mode 100644
index fd940081c16..00000000000
--- a/source/blender/editors/space_nla/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_nla
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_nla/SConscript b/source/blender/editors/space_nla/SConscript
index 790e3ad822c..51ce829ed8d 100644
--- a/source/blender/editors/space_nla/SConscript
+++ b/source/blender/editors/space_nla/SConscript
@@ -4,6 +4,6 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
env.BlenderLib ( 'bf_editors_space_nla', sources, Split(incs), [], libtype=['core'], priority=[85] )
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index fc869c4b46f..cc1a699e13f 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,8 @@
#include "DNA_anim_types.h"
+#include "BLI_utildefines.h"
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -66,7 +68,7 @@
/* -------------- */
-static void do_nla_region_buttons(bContext *C, void *arg, int event)
+static void do_nla_region_buttons(bContext *C, void *UNUSED(arg), int event)
{
//Scene *scene= CTX_data_scene(C);
@@ -172,25 +174,25 @@ static int nla_panel_poll(const bContext *C, PanelType *pt)
}
#endif
-static int nla_animdata_panel_poll(const bContext *C, PanelType *pt)
+static int nla_animdata_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, &ptr, NULL, NULL) && (ptr.data != NULL));
}
-static int nla_track_panel_poll(const bContext *C, PanelType *pt)
+static int nla_track_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, NULL, &ptr, NULL) && (ptr.data != NULL));
}
-static int nla_strip_panel_poll(const bContext *C, PanelType *pt)
+static int nla_strip_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
return (nla_panel_context(C, NULL, NULL, &ptr) && (ptr.data != NULL));
}
-static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
+static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *UNUSED(pt))
{
PointerRNA ptr;
NlaStrip *strip;
@@ -210,7 +212,7 @@ static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *pt)
static void nla_panel_animdata (const bContext *C, Panel *pa)
{
PointerRNA adt_ptr;
- AnimData *adt;
+ /* AnimData *adt; */
uiLayout *layout= pa->layout;
uiLayout *row;
uiBlock *block;
@@ -218,7 +220,8 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* check context and also validity of pointer */
if (!nla_panel_context(C, &adt_ptr, NULL, NULL))
return;
- adt= adt_ptr.data;
+
+ /* adt= adt_ptr.data; */
block= uiLayoutGetBlock(layout);
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
@@ -230,15 +233,15 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, ICON_NULL);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, ICON_NULL);
/* influence */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_influence", 0, NULL, 0);
+ uiItemR(row, &adt_ptr, "action_influence", 0, NULL, ICON_NULL);
}
/* active NLA-Track */
@@ -279,40 +282,40 @@ static void nla_panel_properties(const bContext *C, Panel *pa)
/* strip type */
row= uiLayoutColumn(layout, 1);
uiItemR(row, &strip_ptr, "name", 0, NULL, ICON_NLA); // XXX icon?
- uiItemR(row, &strip_ptr, "type", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "type", 0, NULL, ICON_NULL);
/* strip extents */
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Strip Extents:", 0);
- uiItemR(column, &strip_ptr, "frame_start", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "frame_end", 0, NULL, 0);
+ uiItemL(column, "Strip Extents:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "frame_end", 0, NULL, ICON_NULL);
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, ICON_NULL);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "blend_type", 0, NULL, 0);
+ uiItemR(row, &strip_ptr, "blend_type", 0, NULL, ICON_NULL);
/* blend in/out + autoblending
* - blend in/out can only be set when autoblending is off
*/
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence")==0);
- uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, 0); // XXX as toggle?
+ uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, ICON_NULL); // XXX as toggle?
subcol= uiLayoutColumn(column, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "use_auto_blend")==0);
- uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, 0);
- uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, 0);
+ uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, ICON_NULL);
/* settings */
column= uiLayoutColumn(layout, 1);
- uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time")));
- uiItemL(column, "Playback Settings:", 0);
- uiItemR(column, &strip_ptr, "mute", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, 0);
+ uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "use_animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time")));
+ uiItemL(column, "Playback Settings:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "mute", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, ICON_NULL);
}
@@ -339,17 +342,17 @@ static void nla_panel_actclip(const bContext *C, Panel *pa)
/* action extents */
// XXX custom names were used here (to avoid the prefixes)... probably not necessary in future?
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Action Extents:", 0);
- uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", 0);
- uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", 0);
- uiItemO(column, NULL, 0, "NLA_OT_action_sync_length");
+ uiItemL(column, "Action Extents:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", ICON_NULL);
+ uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", ICON_NULL);
+ uiItemO(column, NULL, ICON_NULL, "NLA_OT_action_sync_length");
/* action usage */
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time")==0);
- uiItemL(column, "Playback Settings:", 0);
- uiItemR(column, &strip_ptr, "scale", 0, NULL, 0);
- uiItemR(column, &strip_ptr, "repeat", 0, NULL, 0);
+ uiItemL(column, "Playback Settings:", ICON_NULL);
+ uiItemR(column, &strip_ptr, "scale", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "repeat", 0, NULL, ICON_NULL);
}
/* evaluation settings for active NLA-Strip */
@@ -368,22 +371,22 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa)
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
column= uiLayoutColumn(layout, 1);
- uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, 0);
+ uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, ICON_NULL);
subcolumn= uiLayoutColumn(column, 1);
uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "use_animated_influence"));
- uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, 0);
+ uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, ICON_NULL);
column= uiLayoutColumn(layout, 1);
subrow= uiLayoutRow(column, 0);
- uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, 0);
- uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, 0);
+ uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, ICON_NULL);
+ uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, ICON_NULL);
subcolumn= uiLayoutColumn(column, 1);
subrow= uiLayoutRow(subcolumn, 0);
uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "use_animated_time"));
- uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, 0);
+ uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, ICON_NULL);
}
/* F-Modifiers for active NLA-Strip */
@@ -477,7 +480,7 @@ void nla_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int nla_properties(bContext *C, wmOperator *op)
+static int nla_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= nla_has_buttons_region(sa);
@@ -492,6 +495,7 @@ void NLA_OT_properties(wmOperatorType *ot)
{
ot->name= "Properties";
ot->idname= "NLA_OT_properties";
+ ot->description= "Toggle display properties panel";
ot->exec= nla_properties;
ot->poll= ED_operator_nla_active;
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index b00cba676d0..9212d6f678b 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,10 +35,10 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_nla.h"
@@ -173,6 +173,7 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho
case ANIMTYPE_DSARM:
case ANIMTYPE_DSMESH:
case ANIMTYPE_DSTEX:
+ case ANIMTYPE_DSLAT:
{
/* sanity checking... */
if (ale->adt) {
@@ -295,7 +296,6 @@ static int mouse_nla_channels (bAnimContext *ac, float x, int channel_index, sho
static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
View2D *v2d;
int mval[2], channel_index;
@@ -308,7 +308,6 @@ static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *e
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
v2d= &ar->v2d;
@@ -342,8 +341,9 @@ static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent *e
void NLA_OT_channels_click (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Mouse Click on Channels";
+ ot->name= "Mouse Click on NLA Channels";
ot->idname= "NLA_OT_channels_click";
+ ot->description= "Handle clicks to select NLA channels";
/* api callbacks */
ot->invoke= nlachannels_mouseclick_invoke;
@@ -433,7 +433,7 @@ void NLA_OT_tracks_add (wmOperatorType *ot)
/* ******************** Delete Tracks Operator ***************************** */
/* Delete selected NLA Tracks */
-static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op)
+static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -455,6 +455,12 @@ static int nlaedit_delete_tracks_exec (bContext *C, wmOperator *op)
NlaTrack *nlt= (NlaTrack *)ale->data;
AnimData *adt= ale->adt;
+ /* if track is currently 'solo', then AnimData should have its
+ * 'has solo' flag disabled
+ */
+ if (nlt->flag & NLATRACK_SOLO)
+ adt->flag &= ~ADT_NLA_SOLO_TRACK;
+
/* call delete on this track - deletes all strips too */
free_nlatrack(&adt->nla_tracks, nlt);
}
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index f489fc4774f..b09fb97094e 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,11 +37,11 @@
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_fcurve.h"
#include "BKE_nla.h"
@@ -64,9 +64,6 @@
#include "nla_intern.h" // own include
-/* XXX */
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
/* *********************************************** */
/* Strips */
@@ -144,7 +141,7 @@ static void nla_action_draw_keyframes (AnimData *adt, bAction *act, View2D *v2d,
* - size is 3.0f which is smaller than the editable keyframes, so that there is a distinction
*/
for (ak= keys.first; ak; ak= ak->next)
- draw_keyframe_shape(ak->cfra, y, xscale, 3.0f, 0, ak->key_type, KEYFRAME_SHAPE_FRAME);
+ draw_keyframe_shape(ak->cfra, y, xscale, 3.0f, 0, ak->key_type, KEYFRAME_SHAPE_FRAME, 1.0f);
/* free icons */
BLI_dlrbTree_free(&keys);
@@ -174,7 +171,7 @@ static void nla_strip_get_color_inside (AnimData *adt, NlaStrip *strip, float co
}
else if (strip->type == NLASTRIP_TYPE_META) {
/* Meta Clip */
- // TODO: should temporary metas get different colours too?
+ // TODO: should temporary metas get different colors too?
if (strip->flag & NLASTRIP_FLAG_SELECT) {
/* selected - use a bold purple color */
// FIXME: hardcoded temp-hack colors
@@ -222,7 +219,7 @@ static void nla_strip_get_color_inside (AnimData *adt, NlaStrip *strip, float co
}
/* helper call for drawing influence/time control curves for a given NLA-strip */
-static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip_curves (NlaStrip *strip, float yminc, float ymaxc)
{
const float yheight = ymaxc - yminc;
@@ -275,7 +272,7 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl
}
/* time -------------------------- */
- // XXX do we want to draw this curve? in a different colour too?
+ // XXX do we want to draw this curve? in a different color too?
/* turn off AA'd lines */
glDisable(GL_LINE_SMOOTH);
@@ -283,7 +280,7 @@ static void nla_draw_strip_curves (NlaStrip *strip, View2D *v2d, float yminc, fl
}
/* main call for drawing a single NLA-strip */
-static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *UNUSED(nlt), NlaStrip *strip, View2D *v2d, float yminc, float ymaxc)
{
float color[3];
@@ -347,14 +344,14 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
/* draw 'inside' of strip itself */
glColor3fv(color);
uiSetRoundBox(15); /* all corners rounded */
- gl_round_box_shade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1);
+ uiDrawBoxShade(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1);
/* draw strip's control 'curves'
* - only if user hasn't hidden them...
*/
if ((snla->flag & SNLA_NOSTRIPCURVES) == 0)
- nla_draw_strip_curves(strip, v2d, yminc, ymaxc);
+ nla_draw_strip_curves(strip, yminc, ymaxc);
/* draw strip outline
* - color used here is to indicate active vs non-active
@@ -373,7 +370,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
setlinestyle(4);
/* draw outline */
- gl_round_box_shade(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1);
+ uiDrawBoxShade(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1);
/* if action-clip strip, draw lines delimiting repeats too (in the same color as outline) */
if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQ(strip->repeat, 1.0f)==0) {
@@ -417,9 +414,10 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStr
}
/* add the relevant text to the cache of text-strings to draw in pixelspace */
-static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View2D *v2d, float yminc, float ymaxc)
+static void nla_draw_strip_text (NlaTrack *UNUSED(nlt), NlaStrip *strip, int UNUSED(index), View2D *v2d, float yminc, float ymaxc)
{
char str[256], dir[3];
+ char col[4];
rctf rect;
/* 'dir' - direction that strip is played in */
@@ -434,12 +432,15 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
else
sprintf(str, "%s | %.2f %s %.2f", strip->name, strip->start, dir, strip->end);
- /* set text colour - if colours (see above) are light, draw black text, otherwise draw white */
- if (strip->flag & (NLASTRIP_FLAG_ACTIVE|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_TWEAKUSER))
- glColor3f(0.0f, 0.0f, 0.0f);
- else
- glColor3f(1.0f, 1.0f, 1.0f);
-
+ /* set text color - if colors (see above) are light, draw black text, otherwise draw white */
+ if (strip->flag & (NLASTRIP_FLAG_ACTIVE|NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_TWEAKUSER)) {
+ col[0]= col[1]= col[2]= 0;
+ }
+ else {
+ col[0]= col[1]= col[2]= 255;
+ }
+ col[3]= 1.0;
+
/* set bounding-box for text
* - padding of 2 'units' on either side
*/
@@ -450,7 +451,8 @@ static void nla_draw_strip_text (NlaTrack *nlt, NlaStrip *strip, int index, View
rect.ymax= ymaxc;
/* add this string to the cache of texts to draw*/
- UI_view2d_text_cache_rectf(v2d, &rect, str);
+
+ UI_view2d_text_cache_rectf(v2d, &rect, str, col);
}
/* ---------------------- */
@@ -480,8 +482,6 @@ void draw_nla_main_data (bAnimContext *ac, SpaceNla *snla, ARegion *ar)
* (NOTE: this is ok here, the configuration is pretty straightforward)
*/
v2d->tot.ymin= (float)(-height);
- /* need to do a view-sync here, so that the strips area doesn't jump around */
- UI_view2d_sync(NULL, ac->sa, v2d, V2D_VIEWSYNC_AREA_VERTICAL);
/* loop through channels, and set up drawing depending on their type */
y= (float)(-NLACHANNEL_HEIGHT);
@@ -708,7 +708,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie
/* draw slightly shifted up vertically to look like it has more separtion from other channels,
* but we then need to slightly shorten it so that it doesn't look like it overlaps
*/
- gl_round_box(GL_POLYGON, x+offset, yminc+NLACHANNEL_SKIP, (float)v2d->cur.xmax, ymaxc+NLACHANNEL_SKIP-1, 8);
+ uiDrawBox(GL_POLYGON, x+offset, yminc+NLACHANNEL_SKIP, (float)v2d->cur.xmax, ymaxc+NLACHANNEL_SKIP-1, 8);
/* clear group value, otherwise we cause errors... */
group = 0;
@@ -815,7 +815,7 @@ static void draw_nla_channel_list_gl (bAnimContext *ac, ListBase *anim_data, Vie
}
}
-void draw_nla_channel_list (bContext *C, bAnimContext *ac, SpaceNla *snla, ARegion *ar)
+void draw_nla_channel_list (bContext *C, bAnimContext *ac, ARegion *ar)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -840,6 +840,8 @@ void draw_nla_channel_list (bContext *C, bAnimContext *ac, SpaceNla *snla, ARegi
* (NOTE: this is ok here, the configuration is pretty straightforward)
*/
v2d->tot.ymin= (float)(-height);
+ /* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */
+ UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY);
/* draw channels */
{ /* first pass: backdrops + oldstyle drawing */
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 247987cda9f..64fcb8d6ac5 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_fcurve.h"
@@ -457,7 +458,7 @@ void NLA_OT_transition_add (wmOperatorType *ot)
/* Add new meta-strips incorporating the selected strips */
/* add the specified action as new strip */
-static int nlaedit_add_meta_exec (bContext *C, wmOperator *op)
+static int nlaedit_add_meta_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -518,7 +519,7 @@ void NLA_OT_meta_add (wmOperatorType *ot)
/* ******************** Remove Meta-Strip Operator ***************************** */
/* Separate out the strips held by the selected meta-strips */
-static int nlaedit_remove_meta_exec (bContext *C, wmOperator *op)
+static int nlaedit_remove_meta_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -572,7 +573,7 @@ void NLA_OT_meta_remove (wmOperatorType *ot)
* the originals were housed in.
*/
-static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
+static int nlaedit_duplicate_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -620,8 +621,8 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
/* deselect the original and the active flag */
strip->flag &= ~(NLASTRIP_FLAG_SELECT|NLASTRIP_FLAG_ACTIVE);
- /* auto-name it */
- BKE_nlastrip_validate_name(adt, strip);
+ /* auto-name newly created strip */
+ BKE_nlastrip_validate_name(adt, nstrip);
done++;
}
@@ -645,11 +646,11 @@ static int nlaedit_duplicate_exec (bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
nlaedit_duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TIME_TRANSLATE); // XXX
+ RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -677,7 +678,7 @@ void NLA_OT_duplicate (wmOperatorType *ot)
/* ******************** Delete Strips Operator ***************************** */
/* Deletes the selected NLA-Strips */
-static int nlaedit_delete_exec (bContext *C, wmOperator *op)
+static int nlaedit_delete_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -810,7 +811,7 @@ static void nlaedit_split_strip_actclip (AnimData *adt, NlaTrack *nlt, NlaStrip
}
/* split a given Meta strip */
-static void nlaedit_split_strip_meta (AnimData *adt, NlaTrack *nlt, NlaStrip *strip)
+static void nlaedit_split_strip_meta (NlaTrack *nlt, NlaStrip *strip)
{
/* simply ungroup it for now... */
BKE_nlastrips_clear_metastrip(&nlt->strips, strip);
@@ -818,7 +819,7 @@ static void nlaedit_split_strip_meta (AnimData *adt, NlaTrack *nlt, NlaStrip *st
/* ----- */
-static int nlaedit_split_exec (bContext *C, wmOperator *op)
+static int nlaedit_split_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -852,7 +853,7 @@ static int nlaedit_split_exec (bContext *C, wmOperator *op)
break;
case NLASTRIP_TYPE_META: /* meta-strips need special handling */
- nlaedit_split_strip_meta(adt, nlt, strip);
+ nlaedit_split_strip_meta(nlt, strip);
break;
default: /* for things like Transitions, do not split! */
@@ -893,7 +894,7 @@ void NLA_OT_split (wmOperatorType *ot)
/* ******************** Bake Strips Operator ***************************** */
/* Bakes the NLA Strips for the active AnimData blocks */
-static int nlaedit_bake_exec (bContext *C, wmOperator *op)
+static int nlaedit_bake_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -928,7 +929,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void NLA_OT_bake (wmOperatorType *ot)
+static void NLA_OT_bake (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Bake Strips";
@@ -949,7 +950,7 @@ void NLA_OT_bake (wmOperatorType *ot)
/* ******************** Toggle Muting Operator ************************** */
/* Toggles whether strips are muted or not */
-static int nlaedit_toggle_mute_exec (bContext *C, wmOperator *op)
+static int nlaedit_toggle_mute_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1005,10 +1006,168 @@ void NLA_OT_mute_toggle (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ******************** Swap Strips Operator ************************** */
+/* Tries to exchange strips within their owner tracks */
+
+static int nlaedit_swap_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* get a list of the editable tracks being shown in the NLA */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS | ANIMFILTER_FOREDIT);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* consider each track in turn */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+
+ NlaStrip *strip, *stripN=NULL;
+ NlaStrip *sa=NULL, *sb=NULL;
+
+ /* make temporary metastrips so that entire islands of selections can be moved around */
+ BKE_nlastrips_make_metas(&nlt->strips, 1);
+
+ /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this,
+ * and this island has two strips inside it, then we should be able to just swap these still...
+ */
+ if ((nlt->strips.first == nlt->strips.last) && (nlt->strips.first != NULL)) {
+ NlaStrip *mstrip = (NlaStrip *)nlt->strips.first;
+
+ if ((mstrip->flag & NLASTRIP_FLAG_TEMP_META) && (BLI_countlist(&mstrip->strips) == 2))
+ {
+ /* remove this temp meta, so that we can see the strips inside */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+ }
+
+ /* get two selected strips only (these will be metas due to prev step) to operate on
+ * - only allow swapping 2, as with more the context becomes unclear
+ */
+ for (strip = nlt->strips.first; strip; strip = stripN) {
+ stripN = strip->next;
+
+ if (strip->flag & NLASTRIP_FLAG_SELECT) {
+ /* first or second strip? */
+ if (sa == NULL) {
+ /* store as first */
+ sa = strip;
+ }
+ else if (sb == NULL) {
+ /* store as second */
+ sb = strip;
+ }
+ else {
+ /* too many selected */
+ break;
+ }
+ }
+ }
+
+ if (strip) {
+ /* too many selected warning */
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Too many clusters of strips selected in NLA Track (%s). Needs exactly 2 to be selected.",
+ nlt->name);
+ }
+ else if (sa == NULL) {
+ /* no warning as this is just a common case, and it may get annoying when doing multiple tracks */
+ }
+ else if (sb == NULL) {
+ /* too few selected warning */
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Too few clusters of strips selected in NLA Track (%s). Needs exactly 2 to be selected.",
+ nlt->name);
+ }
+ else {
+ float nsa[2], nsb[2];
+
+ /* remove these strips from the track, so that we can test if they can fit in the proposed places */
+ BLI_remlink(&nlt->strips, sa);
+ BLI_remlink(&nlt->strips, sb);
+
+ /* calculate new extents for strips */
+ /* a --> b */
+ nsa[0] = sb->start;
+ nsa[1] = sb->start + (sa->end - sa->start);
+ /* b --> a */
+ nsb[0] = sa->start;
+ nsb[1] = sa->start + (sb->end - sb->start);
+
+ /* check if the track has room for the strips to be swapped */
+ if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) &&
+ BKE_nlastrips_has_space(&nlt->strips, nsb[0], nsb[1]))
+ {
+ /* set new extents for strips then */
+ sa->start = nsa[0];
+ sa->end = nsa[1];
+ BKE_nlameta_flush_transforms(sa);
+
+ sb->start = nsb[0];
+ sb->end = nsb[1];
+ BKE_nlameta_flush_transforms(sb);
+ }
+ else {
+ /* not enough room to swap, so show message */
+ if ((sa->flag & NLASTRIP_FLAG_TEMP_META) || (sb->flag & NLASTRIP_FLAG_TEMP_META)) {
+ BKE_report(op->reports, RPT_WARNING,
+ "Cannot swap selected strips as they will not be able to fit in their new places");
+ }
+ else {
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Cannot swap '%s' and '%s' as one or both will not be able to fit in their new places",
+ sa->name, sb->name);
+ }
+ }
+
+ /* add strips back to track now */
+ BKE_nlatrack_add_strip(nlt, sa);
+ BKE_nlatrack_add_strip(nlt, sb);
+ }
+
+ /* clear (temp) metastrips */
+ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&anim_data);
+
+ /* refresh auto strip properties */
+ ED_nla_postop_refresh(&ac);
+
+ /* set notifier that things have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_EDITED, NULL);
+
+ /* done */
+ return OPERATOR_FINISHED;
+}
+
+void NLA_OT_swap (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Swap Strips";
+ ot->idname= "NLA_OT_swap";
+ ot->description= "Swap order of selected strips within tracks";
+
+ /* api callbacks */
+ ot->exec= nlaedit_swap_exec;
+ ot->poll= nlaop_poll_tweakmode_off;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ******************** Move Strips Up Operator ************************** */
/* Tries to move the selected strips into the track above if possible. */
-static int nlaedit_move_up_exec (bContext *C, wmOperator *op)
+static int nlaedit_move_up_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1082,7 +1241,7 @@ void NLA_OT_move_up (wmOperatorType *ot)
/* ******************** Move Strips Down Operator ************************** */
/* Tries to move the selected strips into the track above if possible. */
-static int nlaedit_move_down_exec (bContext *C, wmOperator *op)
+static int nlaedit_move_down_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1250,7 +1409,7 @@ static short bezt_apply_nlamapping (KeyframeEditData *ked, BezTriple *bezt)
return 0;
}
-static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
+static int nlaedit_apply_scale_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1258,7 +1417,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked;
+ KeyframeEditData ked= {{0}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1269,7 +1428,6 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *op)
ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
/* init the editing data */
- memset(&ked, 0, sizeof(KeyframeEditData));
/* for each NLA-Track, apply scale of all selected strips */
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -1333,7 +1491,7 @@ void NLA_OT_apply_scale (wmOperatorType *ot)
/* ******************** Clear Scale Operator ***************************** */
/* Reset the scaling of the selected strips to 1.0f */
-static int nlaedit_clear_scale_exec (bContext *C, wmOperator *op)
+static int nlaedit_clear_scale_exec (bContext *C, wmOperator *UNUSED(op))
{
bAnimContext ac;
@@ -1397,7 +1555,7 @@ void NLA_OT_clear_scale (wmOperatorType *ot)
/* Moves the start-point of the selected strips to the specified places */
/* defines for snap keyframes tool */
-EnumPropertyItem prop_nlaedit_snap_types[] = {
+static EnumPropertyItem prop_nlaedit_snap_types[] = {
{NLAEDIT_SNAP_CFRA, "CFRA", 0, "Current frame", ""},
{NLAEDIT_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry?
{NLAEDIT_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry?
@@ -1544,13 +1702,13 @@ void NLA_OT_snap (wmOperatorType *ot)
/* ******************** Add F-Modifier Operator *********************** */
/* present a special customised popup menu for this, with some filtering */
-static int nla_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *event)
+static int nla_fmodifier_add_invoke (bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Modifier", 0);
+ pup= uiPupMenuBegin(C, "Add F-Modifier", ICON_NULL);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
@@ -1639,6 +1797,7 @@ void NLA_OT_fmodifier_add (wmOperatorType *ot)
/* identifiers */
ot->name= "Add F-Modifier";
ot->idname= "NLA_OT_fmodifier_add";
+ ot->description= "Add F-Modifier of the secified type to the selected NLA-Strips";
/* api callbacks */
ot->invoke= nla_fmodifier_add_invoke;
@@ -1702,7 +1861,7 @@ void NLA_OT_fmodifier_copy (wmOperatorType *ot)
/* identifiers */
ot->name= "Copy F-Modifiers";
ot->idname= "NLA_OT_fmodifier_copy";
- ot->description= "Copy the F-Modifier(s) of the active NLA-Strip.";
+ ot->description= "Copy the F-Modifier(s) of the active NLA-Strip";
/* api callbacks */
ot->exec= nla_fmodifier_copy_exec;
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index 7570969158b..bd3a80a65c2 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,7 +45,7 @@ void NLA_OT_properties(wmOperatorType *ot);
/* nla_draw.c */
void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar);
-void draw_nla_channel_list(bContext *C, bAnimContext *ac, SpaceNla *snla, ARegion *ar);
+void draw_nla_channel_list(bContext *C, bAnimContext *ac, ARegion *ar);
/* **************************************** */
/* nla_header.c */
@@ -60,13 +60,14 @@ enum {
NLAEDIT_LRSEL_TEST = -1,
NLAEDIT_LRSEL_NONE,
NLAEDIT_LRSEL_LEFT,
- NLAEDIT_LRSEL_RIGHT,
+ NLAEDIT_LRSEL_RIGHT
} eNlaEdit_LeftRightSelect_Mode;
/* --- */
void NLA_OT_select_all_toggle(wmOperatorType *ot);
void NLA_OT_select_border(wmOperatorType *ot);
+void NLA_OT_select_leftright(wmOperatorType *ot);
void NLA_OT_click_select(wmOperatorType *ot);
/* **************************************** */
@@ -78,7 +79,7 @@ enum {
NLAEDIT_SNAP_CFRA = 1,
NLAEDIT_SNAP_NEAREST_FRAME,
NLAEDIT_SNAP_NEAREST_SECOND,
- NLAEDIT_SNAP_NEAREST_MARKER,
+ NLAEDIT_SNAP_NEAREST_MARKER
} eNlaEdit_Snap_Mode;
/* --- */
@@ -100,6 +101,7 @@ void NLA_OT_split(wmOperatorType *ot);
void NLA_OT_mute_toggle(wmOperatorType *ot);
+void NLA_OT_swap(wmOperatorType *ot);
void NLA_OT_move_up(wmOperatorType *ot);
void NLA_OT_move_down(wmOperatorType *ot);
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 85a169f2bb0..358b847db20 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -122,6 +122,7 @@ void nla_operatortypes(void)
WM_operatortype_append(NLA_OT_click_select);
WM_operatortype_append(NLA_OT_select_border);
WM_operatortype_append(NLA_OT_select_all_toggle);
+ WM_operatortype_append(NLA_OT_select_leftright);
/* edit */
WM_operatortype_append(NLA_OT_tweakmode_enter);
@@ -139,6 +140,7 @@ void nla_operatortypes(void)
WM_operatortype_append(NLA_OT_mute_toggle);
+ WM_operatortype_append(NLA_OT_swap);
WM_operatortype_append(NLA_OT_move_up);
WM_operatortype_append(NLA_OT_move_down);
@@ -156,7 +158,7 @@ void nla_operatortypes(void)
/* ************************** registration - keymaps **********************************/
-static void nla_keymap_channels (wmKeyConfig *keyconf, wmKeyMap *keymap)
+static void nla_keymap_channels(wmKeyMap *keymap)
{
/* NLA-specific (different to standard channels keymap) -------------------------- */
/* selection */
@@ -173,30 +175,6 @@ static void nla_keymap_channels (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* delete tracks */
WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", DELKEY, KM_PRESS, 0, 0);
-
- /* General Animation Channels keymap (see anim_channels.c) ----------------------- */
- /* selection */
- /* borderselect - not in tweakmode */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", BKEY, KM_PRESS, 0, 0);
-
- /* deselect all - not in tweakmode */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", AKEY, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1);
-
- /* settings */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_toggle", WKEY, KM_PRESS, KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_enable", WKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_setting_disable", WKEY, KM_PRESS, KM_ALT, 0);
-
- /* settings - specialised hotkeys */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0);
-
- /* expand/collapse */
- WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, 0, 0);
-
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1);
- RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1);
}
static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap)
@@ -208,8 +186,17 @@ static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, 0, 0);
kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
- kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "left_right", NLAEDIT_LRSEL_TEST);
+
+ /* select left/right */
+ WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
+ kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "extend", 1);
+
+ kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_LEFT);
+ kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0);
+ RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_RIGHT);
+
/* deselect all */
WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
@@ -249,6 +236,9 @@ static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* toggles */
WM_keymap_add_item(keymap, "NLA_OT_mute_toggle", HKEY, KM_PRESS, 0, 0);
+ /* swap */
+ WM_keymap_add_item(keymap, "NLA_OT_swap", FKEY, KM_PRESS, KM_ALT, 0);
+
/* move up */
WM_keymap_add_item(keymap, "NLA_OT_move_up", PAGEUPKEY, KM_PRESS, 0, 0);
/* move down */
@@ -287,7 +277,7 @@ void nla_keymap(wmKeyConfig *keyconf)
* However, those operations which involve clicking on channels and/or the placement of them in the view are implemented here instead
*/
keymap= WM_keymap_find(keyconf, "NLA Channels", SPACE_NLA, 0);
- nla_keymap_channels(keyconf, keymap);
+ nla_keymap_channels(keymap);
/* data */
keymap= WM_keymap_find(keyconf, "NLA Editor", SPACE_NLA, 0);
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index f49897e79fe..ec51be4d419 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -90,7 +90,7 @@ enum {
DESELECT_STRIPS_NOTEST = 0,
DESELECT_STRIPS_TEST,
DESELECT_STRIPS_CLEARACTIVE,
-} eDeselectNlaStrips;
+} /*eDeselectNlaStrips*/;
/* Deselects strips in the NLA Editor
* - This is called by the deselect all operator, as well as other ones!
@@ -182,8 +182,9 @@ static int nlaedit_deselectall_exec(bContext *C, wmOperator *op)
void NLA_OT_select_all_toggle (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Select All";
+ ot->name= "Select or Deselect All";
ot->idname= "NLA_OT_select_all_toggle";
+ ot->description= "(De)Select all NLA-Strips";
/* api callbacks */
ot->exec= nlaedit_deselectall_exec;
@@ -198,18 +199,18 @@ void NLA_OT_select_all_toggle (wmOperatorType *ot)
/* ******************** Border Select Operator **************************** */
/* This operator currently works in one of three ways:
- * -> BKEY - 1) all strips within region are selected (ACTKEYS_BORDERSEL_ALLSTRIPS)
+ * -> BKEY - 1) all strips within region are selected (NLAEDIT_BORDERSEL_ALLSTRIPS)
* -> ALT-BKEY - depending on which axis of the region was larger...
- * -> 2) x-axis, so select all frames within frame range (ACTKEYS_BORDERSEL_FRAMERANGE)
- * -> 3) y-axis, so select all frames within channels that region included (ACTKEYS_BORDERSEL_CHANNELS)
+ * -> 2) x-axis, so select all frames within frame range (NLAEDIT_BORDERSEL_FRAMERANGE)
+ * -> 3) y-axis, so select all frames within channels that region included (NLAEDIT_BORDERSEL_CHANNELS)
*/
/* defines for borderselect mode */
-enum {
+static enum {
NLA_BORDERSEL_ALLSTRIPS = 0,
NLA_BORDERSEL_FRAMERANGE,
NLA_BORDERSEL_CHANNELS,
-} eActKeys_BorderSelect_Mode;
+} eNLAEDIT_BorderSelect_Mode;
static void borderselect_nla_strips (bAnimContext *ac, rcti rect, short mode, short selectmode)
@@ -321,6 +322,7 @@ void NLA_OT_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "NLA_OT_select_border";
+ ot->description= "Use box selection to grab NLA-Strips";
/* api callbacks */
ot->invoke= WM_border_select_invoke;
@@ -338,28 +340,164 @@ void NLA_OT_select_border(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", "");
}
-/* ******************** Mouse-Click Select Operator *********************** */
-/* This operator works in one of 2 ways:
- * 1) Select the strip directly under the mouse
- * 2) Select all the strips to one side of the mouse
- */
+/* ******************** Select Left/Right Operator ************************* */
+/* Select keyframes left/right of the current frame indicator */
/* defines for left-right select tool */
static EnumPropertyItem prop_nlaedit_leftright_select_types[] = {
{NLAEDIT_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""},
- {NLAEDIT_LRSEL_NONE, "OFF", 0, "Don't select", ""},
{NLAEDIT_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""},
{NLAEDIT_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""},
{0, NULL, 0, NULL, NULL}
};
-/* sensitivity factor for frame-selections */
-#define FRAME_CLICK_THRESH 0.1f
+/* ------------------- */
+static void nlaedit_select_leftright (bContext *C, bAnimContext *ac, short leftright, short select_mode)
+{
+ ListBase anim_data = {NULL, NULL};
+ bAnimListElem *ale;
+ int filter;
+
+ Scene *scene= ac->scene;
+ float xmin, xmax;
+
+ /* if currently in tweakmode, exit tweakmode first */
+ if (scene->flag & SCE_NLA_EDIT_ON)
+ WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL);
+
+ /* if select mode is replace, deselect all keyframes (and channels) first */
+ if (select_mode==SELECT_REPLACE) {
+ select_mode= SELECT_ADD;
+
+ /* deselect all other channels and keyframes */
+ ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
+ deselect_nla_strips(ac, 0, SELECT_SUBTRACT);
+ }
+
+ /* get range, and get the right flag-setting mode */
+ if (leftright == NLAEDIT_LRSEL_LEFT) {
+ xmin = MINAFRAMEF;
+ xmax = (float)(CFRA + 0.1f);
+ }
+ else {
+ xmin = (float)(CFRA - 0.1f);
+ xmax = MAXFRAMEF;
+ }
+
+ select_mode= selmodes_to_flagmodes(select_mode);
+
+
+ /* filter data */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
+ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
+
+ /* select strips on the side where most data occurs */
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ NlaTrack *nlt= (NlaTrack *)ale->data;
+ NlaStrip *strip;
+
+ /* check each strip to see if it is appropriate */
+ for (strip= nlt->strips.first; strip; strip= strip->next) {
+ if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) {
+ ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT);
+ }
+ }
+ }
+
+ /* Cleanup */
+ BLI_freelistN(&anim_data);
+}
/* ------------------- */
-/* option 1) select strip directly under mouse */
+static int nlaedit_select_leftright_exec (bContext *C, wmOperator *op)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+ short selectmode;
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* select mode is either replace (deselect all, then add) or add/extend */
+ if (RNA_boolean_get(op->ptr, "extend"))
+ selectmode= SELECT_INVERT;
+ else
+ selectmode= SELECT_REPLACE;
+
+ /* if "test" mode is set, we don't have any info to set this with */
+ if (leftright == NLAEDIT_LRSEL_TEST)
+ return OPERATOR_CANCELLED;
+
+ /* do the selecting now */
+ nlaedit_select_leftright(C, &ac, leftright, selectmode);
+
+ /* set notifier that keyframe selection (and channels too) have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+static int nlaedit_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event)
+{
+ bAnimContext ac;
+ short leftright = RNA_enum_get(op->ptr, "mode");
+
+ /* get editor data */
+ if (ANIM_animdata_get_context(C, &ac) == 0)
+ return OPERATOR_CANCELLED;
+
+ /* handle mode-based testing */
+ if (leftright == NLAEDIT_LRSEL_TEST) {
+ Scene *scene= ac.scene;
+ ARegion *ar= ac.ar;
+ View2D *v2d= &ar->v2d;
+
+ int mval[2];
+ float x;
+
+ /* get mouse coordinates (in region coordinates) */
+ mval[0]= (event->x - ar->winrct.xmin);
+ mval[1]= (event->y - ar->winrct.ymin);
+
+ /* determine which side of the current frame mouse is on */
+ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
+ if (x < CFRA)
+ RNA_int_set(op->ptr, "mode", NLAEDIT_LRSEL_LEFT);
+ else
+ RNA_int_set(op->ptr, "mode", NLAEDIT_LRSEL_RIGHT);
+ }
+
+ /* perform selection */
+ return nlaedit_select_leftright_exec(C, op);
+}
+
+void NLA_OT_select_leftright (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Left/Right";
+ ot->idname= "NLA_OT_select_leftright";
+ ot->description= "Select strips to the left or the right of the current frame ";
+
+ /* api callbacks */
+ ot->invoke= nlaedit_select_leftright_invoke;
+ ot->exec= nlaedit_select_leftright_exec;
+ ot->poll= ED_operator_nla_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* id-props */
+ ot->prop= RNA_def_enum(ot->srna, "mode", prop_nlaedit_leftright_select_types, NLAEDIT_LRSEL_TEST, "Mode", "");
+ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", "");
+}
+
+
+/* ******************** Mouse-Click Select Operator *********************** */
+
+/* select strip directly under mouse */
static void mouse_nla_strips (bContext *C, bAnimContext *ac, int mval[2], short select_mode)
{
ListBase anim_data = {NULL, NULL};
@@ -461,63 +599,6 @@ static void mouse_nla_strips (bContext *C, bAnimContext *ac, int mval[2], short
}
}
-/* Option 2) Selects all the strips on either side of the current frame (depends on which side the mouse is on) */
-static void nlaedit_mselect_leftright (bContext *C, bAnimContext *ac, short leftright, short select_mode)
-{
- ListBase anim_data = {NULL, NULL};
- bAnimListElem *ale;
- int filter;
-
- Scene *scene= ac->scene;
- float xmin, xmax;
-
- /* if currently in tweakmode, exit tweakmode first */
- if (scene->flag & SCE_NLA_EDIT_ON)
- WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL);
-
- /* if select mode is replace, deselect all keyframes (and channels) first */
- if (select_mode==SELECT_REPLACE) {
- select_mode= SELECT_ADD;
-
- /* deselect all other channels and keyframes */
- ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR);
- deselect_nla_strips(ac, 0, SELECT_SUBTRACT);
- }
-
- /* get range, and get the right flag-setting mode */
- if (leftright == NLAEDIT_LRSEL_LEFT) {
- xmin = MINAFRAMEF;
- xmax = (float)(CFRA + FRAME_CLICK_THRESH);
- }
- else {
- xmin = (float)(CFRA - FRAME_CLICK_THRESH);
- xmax = MAXFRAMEF;
- }
-
- select_mode= selmodes_to_flagmodes(select_mode);
-
-
- /* filter data */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS);
- ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
-
- /* select strips on the side where most data occurs */
- for (ale= anim_data.first; ale; ale= ale->next) {
- NlaTrack *nlt= (NlaTrack *)ale->data;
- NlaStrip *strip;
-
- /* check each strip to see if it is appropriate */
- for (strip= nlt->strips.first; strip; strip= strip->next) {
- if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) {
- ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT);
- }
- }
- }
-
- /* Cleanup */
- BLI_freelistN(&anim_data);
-}
-
/* ------------------- */
/* handle clicking */
@@ -548,24 +629,9 @@ static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even
selectmode= SELECT_INVERT;
else
selectmode= SELECT_REPLACE;
-
- /* figure out action to take */
- if (RNA_enum_get(op->ptr, "left_right")) {
- /* select all keys on same side of current frame as mouse */
- float x;
-
- UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL);
- if (x < CFRA)
- RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_LEFT);
- else
- RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_RIGHT);
- nlaedit_mselect_leftright(C, &ac, RNA_enum_get(op->ptr, "left_right"), selectmode);
- }
- else {
- /* select strips based upon mouse position */
- mouse_nla_strips(C, &ac, mval, selectmode);
- }
+ /* select strips based upon mouse position */
+ mouse_nla_strips(C, &ac, mval, selectmode);
/* set notifier that things have changed */
WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL);
@@ -579,6 +645,7 @@ void NLA_OT_click_select (wmOperatorType *ot)
/* identifiers */
ot->name= "Mouse Select";
ot->idname= "NLA_OT_click_select";
+ ot->description= "Handle clicks to select NLA Strips";
/* api callbacks - absolutely no exec() this yet... */
ot->invoke= nlaedit_clickselect_invoke;
@@ -588,8 +655,6 @@ void NLA_OT_click_select (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* id-props */
- // XXX should we make this into separate operators?
- RNA_def_enum(ot->srna, "left_right", prop_nlaedit_leftright_select_types, 0, "Left Right", ""); // CTRLKEY
RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY
}
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index 92c5ef6c410..c1bd5a98551 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,12 +37,14 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_anim_api.h"
#include "ED_markers.h"
#include "ED_screen.h"
@@ -148,16 +150,17 @@ static SpaceLink *nla_new(const bContext *C)
ar->v2d.cur = ar->v2d.tot;
ar->v2d.min[0]= 0.0f;
- ar->v2d.min[1]= 0.0f;
+ ar->v2d.min[1]= 0.0f;
ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= 10000.0f;
+ ar->v2d.max[1]= 10000.0f;
ar->v2d.minzoom= 0.01f;
ar->v2d.maxzoom= 50;
ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
ar->v2d.scroll |= (V2D_SCROLL_RIGHT);
ar->v2d.keepzoom= V2D_LOCKZOOM_Y;
+ ar->v2d.keepofs= V2D_KEEPOFS_Y;
ar->v2d.align= V2D_ALIGN_NO_POS_Y;
ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL;
@@ -177,7 +180,7 @@ static void nla_free(SpaceLink *sl)
/* spacetype; init callback */
-static void nla_init(struct wmWindowManager *wm, ScrArea *sa)
+static void nla_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceNla *snla= (SpaceNla *)sa->spacedata.first;
@@ -208,9 +211,13 @@ static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar)
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy);
/* own keymap */
- // TODO: cannot use generic copy, need special NLA version
+ /* own channels map first to override some channel keymaps */
keymap= WM_keymap_find(wm->defaultconf, "NLA Channels", SPACE_NLA, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ /* now generic channels map for everything else that can apply */
+ keymap= WM_keymap_find(wm->defaultconf, "Animation Channels", 0, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+
keymap= WM_keymap_find(wm->defaultconf, "NLA Generic", SPACE_NLA, 0);
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
}
@@ -218,7 +225,6 @@ static void nla_channel_area_init(wmWindowManager *wm, ARegion *ar)
/* draw entirely, view changes should be handled here */
static void nla_channel_area_draw(const bContext *C, ARegion *ar)
{
- SpaceNla *snla= CTX_wm_space_nla(C);
bAnimContext ac;
View2D *v2d= &ar->v2d;
View2DScrollers *scrollers;
@@ -227,11 +233,11 @@ static void nla_channel_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data */
if (ANIM_animdata_get_context(C, &ac)) {
- draw_nla_channel_list((bContext *)C, &ac, snla, ar);
+ draw_nla_channel_list((bContext *)C, &ac, ar);
}
/* reset view matrix */
@@ -272,12 +278,12 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* time grid */
unit= (snla->flag & SNLA_DRAWTIME)? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, V2D_GRIDLINES_ALL);
+ grid= UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL);
UI_view2d_grid_free(grid);
/* data */
@@ -289,7 +295,7 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
UI_view2d_text_cache_draw(ar);
}
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* current frame */
if (snla->flag & SNLA_DRAWTIME) flag |= DRAWCFRA_UNIT_SECONDS;
@@ -297,11 +303,11 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* reset view matrix */
@@ -315,7 +321,7 @@ static void nla_main_area_draw(const bContext *C, ARegion *ar)
/* add handlers, stuff you only do once or on area/region changes */
-static void nla_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void nla_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -510,7 +516,7 @@ void ED_spacetype_nla(void)
art->init= nla_main_area_init;
art->draw= nla_main_area_draw;
art->listener= nla_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index 0c8f9fc1ee2..955f57002a5 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -19,24 +19,34 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
+ ../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
- ../include
- ../../../../intern/guardedalloc
- ../../../../intern/opennl/extern
../../makesdna
../../makesrna
../../nodes
- ../../render/extern/include
../../windowmanager
+ ../../render/extern/include
+ ../../../../intern/guardedalloc
+ ../../../../intern/opennl/extern
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ drawnode.c
+ node_buttons.c
+ node_draw.c
+ node_edit.c
+ node_header.c
+ node_ops.c
+ node_select.c
+ node_state.c
+ space_node.c
+
+ node_intern.h
+)
-BLENDERLIB(bf_editor_space_node "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_node "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_node/Makefile b/source/blender/editors/space_node/Makefile
deleted file mode 100644
index 6c12149a43f..00000000000
--- a/source/blender/editors/space_node/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_node
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_node/SConscript b/source/blender/editors/space_node/SConscript
index 5493e2d739f..6a5556e3e51 100644
--- a/source/blender/editors/space_node/SConscript
+++ b/source/blender/editors/space_node/SConscript
@@ -3,23 +3,23 @@ Import ('env')
sources = env.Glob('*.c')
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../nodes ../../render/extern/include'
+incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
+incs += ' ../../nodes ../../render/extern/include ../../blenloader'
incs += ' ../../windowmanager #intern/guardedalloc #extern/glew/include'
defs = []
cf = []
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
- #cf.append('/WX')
- pass
+ #cf.append('/WX')
+ pass
if env['CC'] == 'gcc':
- #cf.append('-Werror')
- pass
+ #cf.append('-Werror')
+ pass
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( 'bf_editors_space_node', sources, Split(incs), defs, libtype=['core'], priority=[55], compileflags=cf )
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index f865c30dc45..880b537de02 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_node_types.h"
#include "DNA_material_types.h"
@@ -43,6 +44,7 @@
#include "BKE_context.h"
#include "BKE_curve.h"
+#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -53,11 +55,15 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BLF_api.h"
+
#include "MEM_guardedalloc.h"
#include "RNA_access.h"
+#include "ED_node.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -72,12 +78,7 @@
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
-void node_buts_group(uiLayout *layout, bContext *C, PointerRNA *ptr)
-{
- uiTemplateIDBrowse(layout, C, ptr, "nodetree", NULL, NULL, "");
-}
-
-static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
PointerRNA sockptr;
PropertyRNA *prop;
@@ -86,10 +87,10 @@ static void node_buts_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
prop = RNA_struct_find_property(ptr, "outputs");
RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr);
- uiItemR(layout, &sockptr, "default_value", 0, "", 0);
+ uiItemR(layout, &sockptr, "default_value", 0, "", ICON_NULL);
}
-static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
PointerRNA sockptr;
@@ -101,22 +102,22 @@ static void node_buts_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
col = uiLayoutColumn(layout, 0);
uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0);
- uiItemR(col, &sockptr, "default_value", 0, "", 0);
+ uiItemR(col, &sockptr, "default_value", 0, "", ICON_NULL);
}
-static void node_buts_mix_rgb(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_mix_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "blend_type", 0, "", 0);
+ uiItemR(row, ptr, "blend_type", 0, "", ICON_NULL);
if(ntree->type == NTREE_COMPOSIT)
uiItemR(row, ptr, "use_alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
}
-static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_time(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
#if 0
@@ -134,27 +135,29 @@ static void node_buts_time(uiLayout *layout, bContext *C, PointerRNA *ptr)
uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Sta", 0);
- uiItemR(row, ptr, "frame_end", 0, "End", 0);
+ uiItemR(row, ptr, "frame_start", 0, "Sta", ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
}
-static void node_buts_colorramp(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_colorramp(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateColorRamp(layout, ptr, "color_ramp", 0);
}
-static void node_buts_curvevec(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_curvevec(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0, 0);
}
static float *_sample_col= NULL; // bad bad, 2.5 will do better?
-void node_curvemap_sample(float *col)
+#if 0
+static void node_curvemap_sample(float *col)
{
_sample_col= col;
}
+#endif
-static void node_buts_curvecol(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
bNode *node= ptr->data;
CurveMapping *cumap= node->storage;
@@ -169,16 +172,27 @@ static void node_buts_curvecol(uiLayout *layout, bContext *C, PointerRNA *ptr)
uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0, 0);
}
-static void node_buts_normal(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_normal_cb(bContext *C, void *ntree_v, void *node_v)
+{
+ Main *bmain = CTX_data_main(C);
+
+ ED_node_generic_update(bmain, ntree_v, node_v);
+ WM_event_add_notifier(C, NC_NODE|NA_EDITED, ntree_v);
+}
+
+static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiBlock *block= uiLayoutAbsoluteBlock(layout);
+ bNodeTree *ntree= ptr->id.data;
bNode *node= ptr->data;
rctf *butr= &node->butr;
bNodeSocket *sock= node->outputs.first; /* first socket stores normal */
+ uiBut *bt;
- uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
+ bt= uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
(short)butr->xmin, (short)butr->xmin, butr->xmax-butr->xmin, butr->xmax-butr->xmin,
sock->ns.vec, 0.0f, 1.0f, 0, 0, "");
+ uiButSetFunc(bt, node_normal_cb, ntree, node);
}
#if 0 // not used in 2.5x yet
static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
@@ -198,7 +212,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
node->id= &tex->id;
id_us_plus(node->id);
- BLI_strncpy(node->name, node->id->name+2, 21);
+ BLI_strncpy(node->name, node->id->name+2, sizeof(node->name));
nodeSetActive(ntree, node);
@@ -212,7 +226,7 @@ static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
node->menunr= 0;
}
#endif
-static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
+static void node_dynamic_update_cb(bContext *C, void *UNUSED(ntree_v), void *node_v)
{
Main *bmain= CTX_data_main(C);
Material *ma;
@@ -244,7 +258,7 @@ static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
// XXX BIF_preview_changed(ID_MA);
}
-static void node_buts_texture(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_texture(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
bNode *node= ptr->data;
@@ -255,17 +269,17 @@ static void node_buts_texture(uiLayout *layout, bContext *C, PointerRNA *ptr)
(node->type != TEX_NODE_TEXTURE)
);
- uiItemR(layout, ptr, "texture", 0, "", 0);
+ uiItemR(layout, ptr, "texture", 0, "", ICON_NULL);
if(multi) {
/* Number Drawing not optimal here, better have a list*/
- uiItemR(layout, ptr, "node_output", 0, "", 0);
+ uiItemR(layout, ptr, "node_output", 0, "", ICON_NULL);
}
}
-static void node_buts_math(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", 0);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
}
/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
@@ -285,7 +299,7 @@ static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
oldid= node->id;
node->id= BLI_findlink(&bmain->text, node->menunr-1);
id_us_plus(node->id);
- BLI_strncpy(node->name, node->id->name+2, 21); /* huh? why 21? */
+ BLI_strncpy(node->name, node->id->name+2, sizeof(node->name));
node->custom1= BSET(node->custom1, NODE_DYNAMIC_NEW);
@@ -307,40 +321,40 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA
if(!node->id) return;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_diffuse", 0, NULL, 0);
- uiItemR(col, ptr, "use_specular", 0, NULL, 0);
- uiItemR(col, ptr, "invert_normal", 0, NULL, 0);
+ uiItemR(col, ptr, "use_diffuse", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_specular", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "invert_normal", 0, NULL, ICON_NULL);
}
-static void node_shader_buts_mapping(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
- uiItemL(layout, "Location:", 0);
+ uiItemL(layout, "Location:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "location", 0, "", 0);
+ uiItemR(row, ptr, "location", 0, "", ICON_NULL);
- uiItemL(layout, "Rotation:", 0);
+ uiItemL(layout, "Rotation:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "rotation", 0, "", 0);
+ uiItemR(row, ptr, "rotation", 0, "", ICON_NULL);
- uiItemL(layout, "Scale:", 0);
+ uiItemL(layout, "Scale:", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "scale", 0, "", 0);
+ uiItemR(row, ptr, "scale", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_min", 0, "Min", 0);
- uiItemR(row, ptr, "min", 0, "", 0);
+ uiItemR(row, ptr, "use_min", 0, "Min", ICON_NULL);
+ uiItemR(row, ptr, "min", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_max", 0, "Max", 0);
- uiItemR(row, ptr, "max", 0, "", 0);
+ uiItemR(row, ptr, "use_max", 0, "Max", ICON_NULL);
+ uiItemR(row, ptr, "max", 0, "", ICON_NULL);
}
-static void node_shader_buts_vect_math(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_shader_buts_vect_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", 0);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
}
static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -353,12 +367,12 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
if(obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA dataptr= RNA_pointer_get(&obptr, "data");
- uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", 0);
- uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", 0);
+ uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", ICON_NULL);
+ uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", ICON_NULL);
}
else {
- uiItemR(col, ptr, "uv_layer", 0, "UV", 0);
- uiItemR(col, ptr, "color_layer", 0, "VCol", 0);
+ uiItemR(col, ptr, "uv_layer", 0, "UV", ICON_NULL);
+ uiItemR(col, ptr, "color_layer", 0, "VCol", ICON_NULL);
}
}
@@ -376,7 +390,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *
/* B_NODE_EXEC is handled in butspace.c do_node_buts */
if(!node->id) {
- char *strp;
+ const char *strp;
IDnames_to_pupstring(&strp, NULL, "", &(bmain->text), NULL, NULL);
node->menunr= 0;
bt= uiDefButS(block, MENU, B_NODE_EXEC/*+node->nr*/, strp,
@@ -384,7 +398,7 @@ static void node_shader_buts_dynamic(uiLayout *layout, bContext *C, PointerRNA *
&node->menunr, 0, 0, 0, 0, "Browses existing choices");
uiButSetFunc(bt, node_browse_text_cb, ntree, node);
xoff=19;
- if(strp) MEM_freeN(strp);
+ if(strp) MEM_freeN((void *)strp);
}
else {
bt = uiDefBut(block, BUT, B_NOP, "Update",
@@ -474,21 +488,21 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &imaptr, "source", 0, NULL, 0);
+ uiItemR(col, &imaptr, "source", 0, NULL, ICON_NULL);
if (ELEM(RNA_enum_get(&imaptr, "source"), IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "frame_duration", 0, NULL, 0);
- uiItemR(col, ptr, "frame_start", 0, NULL, 0);
- uiItemR(col, ptr, "frame_offset", 0, NULL, 0);
- uiItemR(col, ptr, "use_cyclic", 0, NULL, 0);
- uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, 0);
+ uiItemR(col, ptr, "frame_duration", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_cyclic", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NULL);
}
col= uiLayoutColumn(layout, 0);
if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER)
- uiItemR(col, ptr, "layer", 0, NULL, 0);
+ uiItemR(col, ptr, "layer", 0, NULL, ICON_NULL);
}
static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -507,7 +521,7 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
col= uiLayoutColumn(layout, 0);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "layer", 0, "", 0);
+ uiItemR(row, ptr, "layer", 0, "", ICON_NULL);
prop = RNA_struct_find_property(ptr, "layer");
if (!(RNA_property_enum_identifier(C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name)))
@@ -524,432 +538,447 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
}
-static void node_composit_buts_blur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiLayout *col;
+ uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filter_type", 0, "", 0);
+ uiItemR(col, ptr, "filter_type", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "filter_type")!= R_FILTER_FAST_GAUSS) {
- uiItemR(col, ptr, "use_bokeh", 0, NULL, 0);
- uiItemR(col, ptr, "use_gamma_correction", 0, NULL, 0);
+ uiItemR(col, ptr, "use_bokeh", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "use_relative", 0, NULL, 0);
- col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "use_relative", 0, NULL, ICON_NULL);
+
if (RNA_boolean_get(ptr, "use_relative")) {
- uiItemR(col, ptr, "factor_x", 0, "X", 0);
- uiItemR(col, ptr, "factor_y", 0, "Y", 0);
+ uiItemL(col, "Aspect Correction", 0);
+ row= uiLayoutRow(layout, 1);
+ uiItemR(row, ptr, "aspect_correction", UI_ITEM_R_EXPAND, NULL, 0);
+
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "factor_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "factor_y", 0, "Y", ICON_NULL);
}
else {
- uiItemR(col, ptr, "size_x", 0, "X", 0);
- uiItemR(col, ptr, "size_y", 0, "Y", 0);
+ col= uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "size_y", 0, "Y", ICON_NULL);
}
}
-static void node_composit_buts_dblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_dblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
- uiItemR(layout, ptr, "iterations", 0, NULL, 0);
- uiItemR(layout, ptr, "use_wrap", 0, NULL, 0);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_wrap", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Center:", 0);
- uiItemR(col, ptr, "center_x", 0, "X", 0);
- uiItemR(col, ptr, "center_y", 0, "Y", 0);
+ uiItemL(col, "Center:", ICON_NULL);
+ uiItemR(col, ptr, "center_x", 0, "X", ICON_NULL);
+ uiItemR(col, ptr, "center_y", 0, "Y", ICON_NULL);
uiItemS(layout);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "distance", 0, NULL, 0);
- uiItemR(col, ptr, "angle", 0, NULL, 0);
+ uiItemR(col, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
uiItemS(layout);
- uiItemR(layout, ptr, "spin", 0, NULL, 0);
- uiItemR(layout, ptr, "zoom", 0, NULL, 0);
+ uiItemR(layout, ptr, "spin", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "zoom", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "iterations", 0, NULL, 0);
- uiItemR(col, ptr, "sigma_color", 0, NULL, 0);
- uiItemR(col, ptr, "sigma_space", 0, NULL, 0);
+ uiItemR(col, ptr, "iterations", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "sigma_color", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "sigma_space", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_defocus(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *sub, *col;
col= uiLayoutColumn(layout, 0);
- uiItemL(col, "Bokeh Type:", 0);
- uiItemR(col, ptr, "bokeh", 0, "", 0);
- uiItemR(col, ptr, "angle", 0, NULL, 0);
+ uiItemL(col, "Bokeh Type:", ICON_NULL);
+ uiItemR(col, ptr, "bokeh", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1);
- uiItemR(col, ptr, "f_stop", 0, NULL, 0);
+ uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "blur_max", 0, NULL, 0);
- uiItemR(layout, ptr, "threshold", 0, NULL, 0);
+ uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_preview", 0, NULL, 0);
+ uiItemR(col, ptr, "use_preview", 0, NULL, ICON_NULL);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_preview"));
- uiItemR(sub, ptr, "samples", 0, NULL, 0);
+ uiItemR(sub, ptr, "samples", 0, NULL, ICON_NULL);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_zbuffer", 0, NULL, 0);
+ uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NULL);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer")==0);
- uiItemR(sub, ptr, "z_scale", 0, NULL, 0);
+ uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NULL);
}
/* qdn: glare node */
-static void node_composit_buts_glare(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_glare(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "glare_type", 0, "", 0);
- uiItemR(layout, ptr, "quality", 0, "", 0);
+ uiItemR(layout, ptr, "glare_type", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "quality", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")!= 1) {
- uiItemR(layout, ptr, "iterations", 0, NULL, 0);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")!= 0)
- uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
- uiItemR(layout, ptr, "mix", 0, NULL, 0);
- uiItemR(layout, ptr, "threshold", 0, NULL, 0);
+ uiItemR(layout, ptr, "mix", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "streaks", 0, NULL, 0);
- uiItemR(layout, ptr, "angle_offset", 0, NULL, 0);
+ uiItemR(layout, ptr, "streaks", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "angle_offset", 0, NULL, ICON_NULL);
}
if (RNA_enum_get(ptr, "glare_type")== 0 || RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "glare_type")== 0)
- uiItemR(layout, ptr, "use_rotate_45", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_rotate_45", 0, NULL, ICON_NULL);
}
if (RNA_enum_get(ptr, "glare_type")== 1) {
- uiItemR(layout, ptr, "size", 0, NULL, 0);
+ uiItemR(layout, ptr, "size", 0, NULL, ICON_NULL);
}
}
-static void node_composit_buts_tonemap(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_tonemap(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tonemap_type", 0, "", 0);
+ uiItemR(col, ptr, "tonemap_type", 0, "", ICON_NULL);
if (RNA_enum_get(ptr, "tonemap_type")== 0) {
- uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "offset", 0, NULL, 0);
- uiItemR(col, ptr, "gamma", 0, NULL, 0);
+ uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "gamma", 0, NULL, ICON_NULL);
}
else {
- uiItemR(col, ptr, "intensity", 0, NULL, 0);
- uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "intensity", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
}
-static void node_composit_buts_lensdist(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_lensdist(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_projector", 0, NULL, 0);
+ uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NULL);
col = uiLayoutColumn(col, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector")==0);
- uiItemR(col, ptr, "use_jitter", 0, NULL, 0);
- uiItemR(col, ptr, "use_fit", 0, NULL, 0);
+ uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_vecblur(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_vecblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "samples", 0, NULL, 0);
- uiItemR(col, ptr, "factor", 0, "Blur", 0);
+ uiItemR(col, ptr, "samples", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "factor", 0, "Blur", ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Speed:", 0);
- uiItemR(col, ptr, "speed_min", 0, "Min", 0);
- uiItemR(col, ptr, "speed_max", 0, "Max", 0);
+ uiItemL(col, "Speed:", ICON_NULL);
+ uiItemR(col, ptr, "speed_min", 0, "Min", ICON_NULL);
+ uiItemR(col, ptr, "speed_max", 0, "Max", ICON_NULL);
- uiItemR(layout, ptr, "use_curved", 0, NULL, 0);
+ uiItemR(layout, ptr, "use_curved", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_filter(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_filter(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", 0);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
}
-static void node_composit_buts_flip(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_flip(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "axis", 0, "", 0);
+ uiItemR(layout, ptr, "axis", 0, "", ICON_NULL);
}
-static void node_composit_buts_crop(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_crop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
- uiItemR(layout, ptr, "use_crop_size", 0, NULL, 0);
- uiItemR(layout, ptr, "relative", 0, NULL, 0);
-
+ uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "relative", 0, NULL, ICON_NULL);
+
col= uiLayoutColumn(layout, 1);
if (RNA_boolean_get(ptr, "relative")){
- uiItemR(col, ptr, "rel_min_x", 0, "Left", 0);
- uiItemR(col, ptr, "rel_max_x", 0, "Right", 0);
- uiItemR(col, ptr, "rel_min_y", 0, "Up", 0);
- uiItemR(col, ptr, "rel_max_y", 0, "Down", 0);
+ uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NULL);
+ uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NULL);
+ uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NULL);
+ uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NULL);
} else {
- uiItemR(col, ptr, "min_x", 0, "Left", 0);
- uiItemR(col, ptr, "max_x", 0, "Right", 0);
- uiItemR(col, ptr, "min_y", 0, "Up", 0);
- uiItemR(col, ptr, "max_y", 0, "Down", 0);
-}
+ uiItemR(col, ptr, "min_x", 0, "Left", ICON_NULL);
+ uiItemR(col, ptr, "max_x", 0, "Right", ICON_NULL);
+ uiItemR(col, ptr, "min_y", 0, "Up", ICON_NULL);
+ uiItemR(col, ptr, "max_y", 0, "Down", ICON_NULL);
+ }
}
-static void node_composit_buts_splitviewer(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_splitviewer(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row, *col;
col= uiLayoutColumn(layout, 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(col, ptr, "factor", 0, NULL, 0);
+ uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(col, ptr, "factor", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_map_value(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *sub, *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, NULL, 0);
- uiItemR(col, ptr, "size", 0, NULL, 0);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "size", 0, NULL, ICON_NULL);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_min", 0, NULL, 0);
+ uiItemR(col, ptr, "use_min", 0, NULL, ICON_NULL);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min"));
- uiItemR(sub, ptr, "min", 0, "", 0);
+ uiItemR(sub, ptr, "min", 0, "", ICON_NULL);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_max", 0, NULL, 0);
+ uiItemR(col, ptr, "use_max", 0, NULL, ICON_NULL);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max"));
- uiItemR(sub, ptr, "max", 0, "", 0);
+ uiItemR(sub, ptr, "max", 0, "", ICON_NULL);
+}
+
+static void node_composit_buts_alphaover(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiLayout *col;
+
+ col =uiLayoutColumn(layout, 1);
+ uiItemR(col, ptr, "use_premultiply", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "premul", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_alphaover(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_zcombine(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_premultiply", 0, NULL, 0);
- uiItemR(col, ptr, "premul", 0, NULL, 0);
+ uiItemR(col, ptr, "use_alpha", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_hue_sat(uiLayout *layout, bContext *C, PointerRNA *ptr)
+
+static void node_composit_buts_hue_sat(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_dilateerode(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_dilateerode(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "distance", 0, NULL, 0);
+ uiItemR(layout, ptr, "distance", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_diff_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_distance_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_color_spill(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row, *col;
- uiItemL(layout, "Despill Channel:", 0);
+ uiItemL(layout, "Despill Channel:", ICON_NULL);
row =uiLayoutRow(layout,0);
- uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, 0);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", 0);
+ uiItemL(col, "Limiting Channel:", ICON_NULL);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "use_unspill", 0, NULL, 0);
+ uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "use_unspill")== 1) {
- uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
}
-static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tolerance", 0, NULL, 0);
- uiItemR(col, ptr, "threshold", 0, NULL, 0);
+ uiItemR(col, ptr, "tolerance", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "threshold", 0, NULL, ICON_NULL);
col= uiLayoutColumn(layout, 1);
- /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0); Removed for now */
- uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, 0);
- /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0); Removed for now*/
+ /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now */
+ uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now*/
}
-static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_channel_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_channel_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemL(layout, "Color Space:", 0);
+ uiItemL(layout, "Color Space:", ICON_NULL);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col=uiLayoutColumn(layout, 0);
- uiItemL(col, "Key Channel:", 0);
+ uiItemL(col, "Key Channel:", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, 0);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", 0);
+ uiItemL(col, "Limiting Channel:", ICON_NULL);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_luma_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_luma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, 0);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, 0);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
}
-static void node_composit_buts_map_uv(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_map_uv(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "alpha", 0, NULL, 0);
+ uiItemR(layout, ptr, "alpha", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_id_mask(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_id_mask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "index", 0, NULL, 0);
+ uiItemR(layout, ptr, "index", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_file_output(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_file_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filepath", 0, "", 0);
- uiItemR(col, ptr, "image_type", 0, "", 0);
+ uiItemR(col, ptr, "filepath", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "image_type", 0, "", ICON_NULL);
row= uiLayoutRow(layout, 0);
if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) {
- uiItemR(row, ptr, "use_exr_half", 0, NULL, 0);
- uiItemR(row, ptr, "exr_codec", 0, "", 0);
+ uiItemR(row, ptr, "use_exr_half", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "exr_codec", 0, "", ICON_NULL);
}
else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", 0);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", ICON_NULL);
}
else if (RNA_enum_get(ptr, "image_type")== R_PNG) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", 0);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", ICON_NULL);
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Start", 0);
- uiItemR(row, ptr, "frame_end", 0, "End", 0);
+ uiItemR(row, ptr, "frame_start", 0, "Start", ICON_NULL);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
}
-static void node_composit_buts_scale(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "space", 0, "", 0);
+ uiItemR(layout, ptr, "space", 0, "", ICON_NULL);
}
-static void node_composit_buts_rotate(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", 0);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
}
-static void node_composit_buts_invert(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "invert_rgb", 0, NULL, 0);
- uiItemR(col, ptr, "invert_alpha", 0, NULL, 0);
+ uiItemR(col, ptr, "invert_rgb", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "invert_alpha", 0, NULL, ICON_NULL);
}
-static void node_composit_buts_premulkey(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_premulkey(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mapping", 0, "", 0);
+ uiItemR(layout, ptr, "mapping", 0, "", ICON_NULL);
}
-static void node_composit_buts_view_levels(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_view_levels(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
}
-static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *split, *col, *row;
- uiItemR(layout, ptr, "correction_method", 0, NULL, 0);
+ uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NULL);
if (RNA_enum_get(ptr, "correction_method")== 0) {
@@ -957,17 +986,17 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "lift", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "lift", 0, NULL, 0);
+ uiItemR(row, ptr, "lift", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gamma", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gamma", 0, NULL, 0);
+ uiItemR(row, ptr, "gamma", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gain", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain", 0, NULL, 0);
+ uiItemR(row, ptr, "gain", 0, NULL, ICON_NULL);
} else {
@@ -975,26 +1004,31 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *C, Point
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "offset", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "offset", 0, NULL, 0);
+ uiItemR(row, ptr, "offset", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "power", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "power", 0, NULL, 0);
+ uiItemR(row, ptr, "power", 0, NULL, ICON_NULL);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "slope", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "slope", 0, NULL, 0);
+ uiItemR(row, ptr, "slope", 0, NULL, ICON_NULL);
}
}
-static void node_composit_buts_huecorrect(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiTemplateCurveMapping(layout, ptr, "mapping", 'h', 0, 0);
}
+static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+{
+ uiItemR(layout, ptr, "mode", 0, "", ICON_NULL);
+}
+
/* only once called */
static void node_composit_set_butfunc(bNodeType *ntype)
{
@@ -1136,6 +1170,13 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_HUECORRECT:
ntype->uifunc=node_composit_buts_huecorrect;
break;
+ case CMP_NODE_ZCOMBINE:
+ ntype->uifunc=node_composit_buts_zcombine;
+ break;
+ case CMP_NODE_COMBYCCA:
+ case CMP_NODE_SEPYCCA:
+ ntype->uifunc=node_composit_buts_ycc;
+ break;
default:
ntype->uifunc= NULL;
}
@@ -1143,20 +1184,20 @@ static void node_composit_set_butfunc(bNodeType *ntype)
/* ****************** BUTTON CALLBACKS FOR TEXTURE NODES ***************** */
-static void node_texture_buts_bricks(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_bricks(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, "Offset", 0);
- uiItemR(col, ptr, "offset_frequency", 0, "Frequency", 0);
+ uiItemR(col, ptr, "offset", 0, "Offset", ICON_NULL);
+ uiItemR(col, ptr, "offset_frequency", 0, "Frequency", ICON_NULL);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "squash", 0, "Squash", 0);
- uiItemR(col, ptr, "squash_frequency", 0, "Frequency", 0);
+ uiItemR(col, ptr, "squash", 0, "Squash", ICON_NULL);
+ uiItemR(col, ptr, "squash_frequency", 0, "Frequency", ICON_NULL);
}
-static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
PointerRNA tex_ptr;
bNode *node= ptr->data;
@@ -1170,42 +1211,42 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *C, PointerRNA *pt
switch( tex->type ) {
case TEX_BLEND:
- uiItemR(col, &tex_ptr, "progression", 0, "", 0);
+ uiItemR(col, &tex_ptr, "progression", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_MARBLE:
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "marble_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_WOOD:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
- uiItemR(col, &tex_ptr, "stype", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "wood_type", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "stype")==TEX_BAND || RNA_enum_get(&tex_ptr, "stype")==TEX_RING));
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
+ uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "wood_type")==TEX_BAND || RNA_enum_get(&tex_ptr, "wood_type")==TEX_RING));
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
break;
case TEX_CLOUDS:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "stype", UI_ITEM_R_EXPAND, NULL, 0);
+ uiItemR(row, &tex_ptr, "cloud_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, 0);
- uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", 0);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", ICON_NULL);
break;
case TEX_DISTNOISE:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", 0);
- uiItemR(col, &tex_ptr, "noise_distortion", 0, "", 0);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_distortion", 0, "", ICON_NULL);
break;
}
}
@@ -1215,9 +1256,9 @@ static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *p
uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL);
}
-static void node_texture_buts_output(uiLayout *layout, bContext *C, PointerRNA *ptr)
+static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filepath", 0, "", 0);
+ uiItemR(layout, ptr, "filepath", 0, "", ICON_NULL);
}
/* only once called */
@@ -1332,9 +1373,32 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
}
if(ibuf->rect) {
- glPixelZoom(snode->zoom, snode->zoom);
- glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
- glPixelZoom(1.0f, 1.0f);
+ if (snode->flag & SNODE_SHOW_ALPHA) {
+ glPixelZoom(snode->zoom, snode->zoom);
+ /* swap bytes, so alpha is most significant one, then just draw it as luminance int */
+ if(ENDIAN_ORDER == B_ENDIAN)
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_LUMINANCE, GL_UNSIGNED_INT, ibuf->rect);
+
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
+ glPixelZoom(1.0f, 1.0f);
+ } else if (snode->flag & SNODE_USE_ALPHA) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPixelZoom(snode->zoom, snode->zoom);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
+ glPixelZoom(1.0f, 1.0f);
+ glDisable(GL_BLEND);
+ } else {
+ glPixelZoom(snode->zoom, snode->zoom);
+
+ glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
+ glPixelZoom(1.0f, 1.0f);
+ }
}
glMatrixMode(GL_PROJECTION);
@@ -1347,6 +1411,47 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
}
}
+void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp)
+{
+ char str[256];
+ int ofs;
+
+ ofs= sprintf(str, "X: %4d Y: %4d ", x, y);
+
+ if(channels==4) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
+ }
+ else if(channels==1) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| Val: %3d ", cp[0]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| Val: %.3f ", fp[0]);
+ }
+ else if(channels==3) {
+ if(cp)
+ ofs+= sprintf(str+ofs, "| R: %3d G: %3d B: %3d ", cp[0], cp[1], cp[2]);
+ if (fp)
+ ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]);
+ }
+
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ glColor4f(.0,.0,.0,.25);
+ glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20);
+ glDisable(GL_BLEND);
+
+ glColor3ub(255, 255, 255);
+
+ // UI_DrawString(6, 6, str); // works ok but fixed width is nicer.
+ BLF_size(blf_mono_font, 11, 72);
+ BLF_position(blf_mono_font, 6, 6, 0);
+ BLF_draw_ascii(blf_mono_font, str, sizeof(str));
+}
+
#if 0
/* note: needs to be userpref or opengl profile option */
static void draw_nodespace_back_tex(ScrArea *sa, SpaceNode *snode)
@@ -1445,7 +1550,7 @@ int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, floa
}
#define LINK_RESOL 24
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int do_shaded)
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 )
{
float coord_array[LINK_RESOL+1][2];
@@ -1453,32 +1558,59 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
float dist, spline_step = 0.0f;
int i;
+ /* store current linewidth */
+ float linew;
+ glGetFloatv(GL_LINE_WIDTH, &linew);
+
/* we can reuse the dist variable here to increment the GL curve eval amount*/
dist = 1.0f/(float)LINK_RESOL;
+ glEnable(GL_LINE_SMOOTH);
+
+ if(do_triple) {
+ UI_ThemeColorShadeAlpha(th_col3, -80, -120);
+ glLineWidth(4.0f);
+
+ glBegin(GL_LINE_STRIP);
+ for(i=0; i<=LINK_RESOL; i++) {
+ glVertex2fv(coord_array[i]);
+ }
+ glEnd();
+ }
+
+ UI_ThemeColor(th_col1);
+ glLineWidth(1.5f);
+
glBegin(GL_LINE_STRIP);
for(i=0; i<=LINK_RESOL; i++) {
if(do_shaded) {
UI_ThemeColorBlend(th_col1, th_col2, spline_step);
spline_step += dist;
- }
+ }
glVertex2fv(coord_array[i]);
}
glEnd();
+
+ glDisable(GL_LINE_SMOOTH);
+
+ /* restore previuos linewidth */
+ glLineWidth(linew);
}
}
/* note; this is used for fake links in groups too */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
{
- int do_shaded= 1, th_col1= TH_WIRE, th_col2= TH_WIRE;
+ int do_shaded= 0, th_col1= TH_HEADER, th_col2= TH_HEADER;
+ int do_triple= 0, th_col3= TH_WIRE;
- if(link->fromnode==NULL && link->tonode==NULL)
+ if(link->fromsock==NULL && link->tosock==NULL)
return;
- if(link->fromnode==NULL || link->tonode==NULL) {
- UI_ThemeColor(TH_WIRE);
- do_shaded= 0;
+ /* new connection */
+ if(!link->fromsock || !link->tosock) {
+ th_col1 = TH_ACTIVE;
+ do_triple = 1;
}
else {
/* going to give issues once... */
@@ -1488,8 +1620,8 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
return;
/* a bit ugly... but thats how we detect the internal group links */
- if(link->fromnode==link->tonode) {
- UI_ThemeColorBlend(TH_BACK, TH_WIRE, 0.25f);
+ if(!link->fromnode || !link->tonode) {
+ UI_ThemeColorBlend(TH_BACK, TH_WIRE, 0.5f);
do_shaded= 0;
}
else {
@@ -1499,15 +1631,16 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
th_col1= TH_EDGE_SELECT;
if(link->tonode->flag & SELECT)
th_col2= TH_EDGE_SELECT;
+ do_shaded= 1;
+ do_triple= 1;
}
else {
- UI_ThemeColor(TH_REDALERT);
- do_shaded= 0;
+ th_col1 = TH_REDALERT;
}
}
}
- node_draw_link_bezier(v2d, snode, link, th_col1, th_col2, do_shaded);
+ node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
}
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 11319d817c7..12f99baa800 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,20 +31,20 @@
#include <math.h>
#include <float.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
-
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_node.h"
#include "BKE_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -63,7 +63,7 @@
#define B_NOP 1
#define B_REDR 2
-static void do_node_region_buttons(bContext *C, void *arg, int event)
+static void do_node_region_buttons(bContext *C, void *UNUSED(arg), int event)
{
//SpaceNode *snode= CTX_wm_space_node(C);
@@ -75,7 +75,7 @@ static void do_node_region_buttons(bContext *C, void *arg, int event)
}
/* poll callback for active node */
-static int active_node_poll(const bContext *C, PanelType *pt)
+static int active_node_poll(const bContext *C, PanelType *UNUSED(pt))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -135,7 +135,7 @@ void node_buttons_register(ARegionType *art)
BLI_addtail(&art->paneltypes, pt);
}
-static int node_properties(bContext *C, wmOperator *op)
+static int node_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= node_has_buttons_region(sa);
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index cc7c966e397..c766b797534 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,8 @@
#include <stdio.h>
#include <string.h>
+#include "MEM_guardedalloc.h"
+
#include "DNA_node_types.h"
#include "DNA_material_types.h"
#include "DNA_object_types.h"
@@ -40,10 +42,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
+#include "BKE_node.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -51,6 +55,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_node.h"
#include "ED_gpencil.h"
#include "UI_interface.h"
@@ -65,10 +70,11 @@
#include "node_intern.h"
+/* width of socket columns in group display */
+#define NODE_GROUP_FRAME 120
+
// XXX interface.h
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
-extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
-extern void ui_draw_tria_icon(float x, float y, char dir);
void ED_node_changed_update(ID *id, bNode *node)
{
@@ -78,8 +84,8 @@ void ED_node_changed_update(ID *id, bNode *node)
node_tree_from_ID(id, &nodetree, &edittree, &treetype);
if(treetype==NTREE_SHADER) {
- DAG_id_flush_update(id, 0);
- WM_main_add_notifier(NC_MATERIAL|ND_SHADING, id);
+ DAG_id_tag_update(id, 0);
+ WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
}
else if(treetype==NTREE_COMPOSIT) {
NodeTagChanged(edittree, node);
@@ -92,7 +98,7 @@ void ED_node_changed_update(ID *id, bNode *node)
WM_main_add_notifier(NC_SCENE|ND_NODES, id);
}
else if(treetype==NTREE_TEXTURE) {
- DAG_id_flush_update(id, 0);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_TEXTURE|ND_NODES, id);
}
}
@@ -112,7 +118,7 @@ static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
return 0;
}
-void ED_node_generic_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
+void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
{
Material *ma;
Tex *tex;
@@ -174,7 +180,7 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
if (node->flag & NODE_SELECT) {
/* ui block */
- sprintf(str, "node buttons %p", node);
+ sprintf(str, "node buttons %p", (void *)node);
node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
}
@@ -185,7 +191,7 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
if (!(node->flag & (NODE_GROUP_EDIT|NODE_SELECT))) {
/* ui block */
- sprintf(str, "node buttons %p", node);
+ sprintf(str, "node buttons %p", (void *)node);
node->block= uiBeginBlock(C, CTX_wm_region(C), str, UI_EMBOSS);
uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
}
@@ -264,10 +270,6 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
BLI_unlock_thread(LOCK_PREVIEW);
}
- /* XXX ugly hack, typeinfo for group is generated */
- if(node->type == NODE_GROUP)
- node->typeinfo->uifunc= node_buts_group;
-
/* buttons rect? */
if((node->flag & NODE_OPTIONS) && node->typeinfo->uifunc) {
dy-= NODE_DYS/2;
@@ -310,7 +312,7 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
}
/* based on settings in node, sets drawing rect info. each redraw! */
-static void node_update_hidden(const bContext *C, bNode *node)
+static void node_update_hidden(bNode *node)
{
bNodeSocket *nsock;
float rad, drad, hiddenrad= HIDDEN_RAD;
@@ -383,9 +385,13 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNode *node;
- bNodeSocket *nsock;
+ bNodeSocket *sock, *gsock;
rctf *rect= &gnode->totr;
int counter;
+ int dy;
+
+ rect->xmin = rect->xmax = gnode->locx;
+ rect->ymin = rect->ymax = gnode->locy;
/* center them, is a bit of abuse of locx and locy though */
for(node= ngroup->nodes.first; node; node= node->next) {
@@ -393,7 +399,7 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
node->locy+= gnode->locy;
if(node->flag & NODE_HIDDEN)
- node_update_hidden(C, node);
+ node_update_hidden(node);
else
node_update(C, ntree, node);
node->locx-= gnode->locx;
@@ -408,23 +414,43 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
else
BLI_union_rctf(rect, &node->totr);
}
- if(counter==1) return; /* should be prevented? */
- rect->xmin-= NODE_DY;
+ /* add some room for links to group sockets */
+ rect->xmin -= 4*NODE_DY;
+ rect->xmax += 4*NODE_DY;
rect->ymin-= NODE_DY;
- rect->xmax+= NODE_DY;
rect->ymax+= NODE_DY;
- /* output sockets */
- for(nsock= gnode->outputs.first; nsock; nsock= nsock->next) {
- nsock->locx= rect->xmax;
- nsock->locy= nsock->tosock->locy;
+ /* input sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->inputs)-1);
+ for(gsock=ngroup->inputs.first, sock=gnode->inputs.first; gsock; gsock=gsock->next, sock=sock->next) {
+ gsock->locx = rect->xmin;
+ sock->locx = rect->xmin - NODE_GROUP_FRAME;
+ sock->locy = gsock->locy = dy;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+
+ dy -= 2*NODE_DY;
}
- /* input sockets */
- for(nsock= gnode->inputs.first; nsock; nsock= nsock->next) {
- nsock->locx= rect->xmin;
- nsock->locy= nsock->tosock->locy;
+ /* output sockets */
+ dy = 0.5f*(rect->ymin+rect->ymax) + NODE_DY*(BLI_countlist(&gnode->outputs)-1);
+ for(gsock=ngroup->outputs.first, sock=gnode->outputs.first; gsock; gsock=gsock->next, sock=sock->next) {
+ gsock->locx = rect->xmax;
+ sock->locx = rect->xmax + NODE_GROUP_FRAME;
+ sock->locy = gsock->locy = dy - NODE_DYS;
+
+ /* prevent long socket lists from growing out of the group box */
+ if (dy-3*NODE_DYS < rect->ymin)
+ rect->ymin = dy-3*NODE_DYS;
+ if (dy+3*NODE_DYS > rect->ymax)
+ rect->ymax = dy+3*NODE_DYS;
+
+ dy -= 2*NODE_DY;
}
}
@@ -433,11 +459,9 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
{
bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
bNodeSocket *sock;
- bNodeLink link;
+ bNodeLink link= {0};
int a;
- memset(&link, 0, sizeof(bNodeLink));
-
/* connect the first value buffer in with first value out */
/* connect the first RGBA buffer in with first RGBA out */
@@ -451,7 +475,6 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
}
/* outputs, draw lines */
- UI_ThemeColor(TH_REDALERT);
glEnable(GL_BLEND);
glEnable( GL_LINE_SMOOTH );
@@ -462,17 +485,17 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
if(sock->type==SOCK_VALUE && valsock) {
link.fromsock= valsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
valsock= NULL;
}
if(sock->type==SOCK_VECTOR && vecsock) {
link.fromsock= vecsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
vecsock= NULL;
}
if(sock->type==SOCK_RGBA && colsock) {
link.fromsock= colsock;
- node_draw_link_bezier(v2d, snode, &link, TH_WIRE, TH_WIRE, 0);
+ node_draw_link_bezier(v2d, snode, &link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
colsock= NULL;
}
}
@@ -484,7 +507,7 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
/* nice AA filled circle */
/* this might have some more generic use */
-static void circle_draw(float x, float y, float size, int type, int col[3])
+static void circle_draw(float x, float y, float size, int col[3])
{
/* 16 values of sin function */
static float si[16] = {
@@ -539,11 +562,11 @@ static void socket_circle_draw(bNodeSocket *sock, float size)
else {
col[0]= 100; col[1]= 200; col[2]= 100;
}
-
- circle_draw(sock->locx, sock->locy, size, sock->type, col);
+
+ circle_draw(sock->locx, sock->locy, size, col);
}
-static void node_sync_cb(bContext *C, void *snode_v, void *node_v)
+static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
{
SpaceNode *snode= snode_v;
@@ -555,29 +578,6 @@ static void node_sync_cb(bContext *C, void *snode_v, void *node_v)
/* ************** Socket callbacks *********** */
-/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
-static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *socket_v)
-{
- bNodeSocket *sock= socket_v;
- uiBlock *block;
-
- SpaceNode *snode= CTX_wm_space_node(C);
- bNodeTree *ntree = snode->nodetree;
- PointerRNA ptr;
- uiLayout *layout;
-
- RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
-
- block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
- uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
-
- layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, sock->locx, sock->locy-8, 140, 20, U.uistyles.first), 0);
-
- uiItemR(layout, &ptr, "default_value", UI_ITEM_R_EXPAND, "", 0);
-
- return block;
-}
-
/* not a callback */
static void node_draw_preview(bNodePreview *preview, rctf *prv)
{
@@ -619,12 +619,11 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
glPixelZoom(xscale, yscale);
glEnable(GL_BLEND);
- glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */
glColor4f(1.0, 1.0, 1.0, 1.0);
glaDrawPixelsTex(prv->xmin, prv->ymin, preview->xsize, preview->ysize, GL_UNSIGNED_BYTE, preview->rect);
- glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glDisable(GL_BLEND);
glPixelZoom(1.0f, 1.0f);
@@ -633,17 +632,91 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
}
-static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *node)
+typedef struct SocketVectorMenuArgs {
+ PointerRNA ptr;
+ int x, y, width;
+ uiButHandleFunc cb;
+ void *arg1, *arg2;
+} SocketVectorMenuArgs;
+
+/* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
+static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *args_v)
+{
+ SocketVectorMenuArgs *args= (SocketVectorMenuArgs*)args_v;
+ uiBlock *block;
+ uiLayout *layout;
+
+ block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
+ uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
+
+ layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, 20, U.uistyles.first), 0);
+
+ uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NULL);
+
+ return block;
+}
+
+static void node_draw_socket_button(bNodeTree *ntree, bNodeSocket *sock, const char *name,
+ uiBlock *block, int x, int y, int width,
+ uiButHandleFunc cb, void *arg1, void *arg2)
+{
+ uiBut *bt= NULL;
+ PointerRNA ptr;
+ int labelw;
+ SocketVectorMenuArgs *args;
+
+ RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+
+ switch (sock->type) {
+ case SOCK_VALUE:
+ bt=uiDefButR(block, NUM, B_NODE_EXEC, name,
+ x, y+1, width, 17,
+ &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
+ if (cb)
+ uiButSetFunc(bt, cb, arg1, arg2);
+ break;
+
+ case SOCK_VECTOR:
+ args= MEM_callocN(sizeof(SocketVectorMenuArgs), "SocketVectorMenuArgs");
+
+ args->ptr = ptr;
+ args->x = x;
+ args->y = y;
+ args->width = width;
+ args->cb = cb;
+ args->arg1 = arg1;
+ args->arg2 = arg2;
+
+ uiDefBlockButN(block, socket_vector_menu, args, name,
+ x, y+1, width, 17,
+ "");
+ break;
+
+ case SOCK_RGBA:
+ labelw= width - 40;
+
+ bt=uiDefButR(block, COL, B_NODE_EXEC, "",
+ x, y+2, (labelw>0 ? 40 : width), 15,
+ &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
+ if (cb)
+ uiButSetFunc(bt, cb, arg1, arg2);
+
+ if (name[0]!='\0' && labelw>0)
+ uiDefBut(block, LABEL, 0, name,
+ x + 40, y+2, labelw, 15,
+ NULL, 0, 0, 0, 0, "");
+ break;
+ }
+}
+
+static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
{
bNodeSocket *sock;
- uiBut *bt;
rctf *rct= &node->totr;
- float /*slen,*/ iconofs;
- int /*ofs,*/ color_id= node_get_colorid(node);
+ float iconofs;
+ int color_id= node_get_colorid(node);
char showname[128]; /* 128 used below */
View2D *v2d = &ar->v2d;
- bNodeTree *ntree = snode->nodetree;
- PointerRNA ptr;
/* hurmf... another candidate for callback, have to see how this works first */
if(node->id && node->block && snode->treetype==NTREE_SHADER)
@@ -666,12 +739,15 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorShade(color_id, -20);
else
UI_ThemeColor(color_id);
+
+ if(node->flag & NODE_MUTED)
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
uiSetRoundBox(3);
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
- /* show/hide icons, note this sequence is copied in editnode.c */
- iconofs= rct->xmax;
+ /* show/hide icons, note this sequence is copied in do_header_node() node_state.c */
+ iconofs= rct->xmax - 7.0f;
if(node->typeinfo->flag & NODE_PREVIEW) {
int icon_id;
@@ -680,7 +756,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
icon_id= ICON_MATERIAL;
else
icon_id= ICON_MATERIAL_DATA;
- iconofs-=22.0f;
+ iconofs-=15.0f;
uiDefIconBut(node->block, LABEL, B_REDR, icon_id, iconofs, rct->ymax-NODE_DY,
UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
}
@@ -715,18 +791,18 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open/close entirely? */
- ui_draw_tria_icon(rct->xmin+8.0f, rct->ymax-NODE_DY+4.0f, 'v');
+ UI_DrawTriIcon(rct->xmin+10.0f, rct->ymax-NODE_DY/2.0f, 'v');
+ /* this isn't doing anything for the label, so commenting out
if(node->flag & SELECT)
UI_ThemeColor(TH_TEXT_HI);
else
- UI_ThemeColor(TH_TEXT);
+ UI_ThemeColor(TH_TEXT); */
- if(node->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, node->name, sizeof(showname));
+ if (node->typeinfo->labelfunc)
+ BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
- /* todo: auto name display for node types */
- BLI_strncpy(showname, node->name, sizeof(showname));
+ BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -744,12 +820,19 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
/* scaling indicator */
node_scaling_widget(TH_NODE, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect);
- /* outline active emphasis */
- if(node->flag & NODE_ACTIVE) {
+ /* outline active and selected emphasis */
+ if( node->flag & (NODE_ACTIVE|SELECT) ) {
glEnable(GL_BLEND);
- glColor4ub(200, 200, 200, 140);
- uiSetRoundBox(15-4);
- gl_round_box(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
+ glEnable( GL_LINE_SMOOTH );
+ /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+ if( node->flag & NODE_ACTIVE )
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
+ else
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
+ uiSetRoundBox(15-4); // round all corners except lower right
+ uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
+
+ glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}
@@ -763,38 +846,10 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
socket_circle_draw(sock, NODE_SOCKSIZE);
- RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
-
if(node->block && sock->link==NULL) {
-
- if(sock->type==SOCK_VALUE) {
- bt=uiDefButR(node->block, NUM, B_NODE_EXEC, sock->name,
- (short)sock->locx+NODE_DYS, (short)(sock->locy)-9, (short)node->width-NODE_DY, 17,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- uiButSetFunc(bt, node_sync_cb, snode, node);
- }
- else if(sock->type==SOCK_VECTOR) {
- uiDefBlockBut(node->block, socket_vector_menu, sock, sock->name,
- (short)sock->locx+NODE_DYS, (short)sock->locy-9, (short)node->width-NODE_DY, 17,
- "");
- }
- else if(node->block && sock->type==SOCK_RGBA) {
- short labelw= (short)node->width-NODE_DY-40, width;
-
- if(labelw>0) width= 40; else width= (short)node->width-NODE_DY;
-
- bt=uiDefButR(node->block, COL, B_NODE_EXEC, "",
- (short)sock->locx+NODE_DYS, (short)(sock->locy)-8, width, 15,
- &ptr, "default_value", 0, sock->ns.min, sock->ns.max, -1, -1, NULL);
- uiButSetFunc(bt, node_sync_cb, snode, node);
-
- if(labelw>0) uiDefBut(node->block, LABEL, 0, sock->name,
- (short)(sock->locx+NODE_DYS) + 40, (short)sock->locy-8, labelw, 15,
- NULL, 0, 0, 0, 0, "");
- }
+ node_draw_socket_button(ntree, sock, sock->name, node->block, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, node_sync_cb, snode, node);
}
else {
-
uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f),
(short)(node->width-NODE_DY), NODE_DY, NULL, 0, 0, 0, 0, "");
}
@@ -850,14 +905,22 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
/* body */
- UI_ThemeColor(color_id);
+ UI_ThemeColor(color_id);
+ if(node->flag & NODE_MUTED)
+ UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
- /* outline active emphasis */
- if(node->flag & NODE_ACTIVE) {
+ /* outline active and selected emphasis */
+ if( node->flag & (NODE_ACTIVE|SELECT) ) {
glEnable(GL_BLEND);
- glColor4ub(200, 200, 200, 140);
- gl_round_box(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
+ glEnable( GL_LINE_SMOOTH );
+ /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+ if( node->flag & NODE_ACTIVE )
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
+ else
+ UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
+ uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
+ glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}
@@ -868,7 +931,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
/* open entirely icon */
- ui_draw_tria_icon(rct->xmin+9.0f, centy-6.0f, 'h');
+ UI_DrawTriIcon(rct->xmin+10.0f, centy, 'h');
/* disable lines */
if(node->flag & NODE_MUTED)
@@ -880,14 +943,11 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColor(TH_TEXT);
if(node->miniwidth>0.0f) {
-
-
- if(node->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, node->name, sizeof(showname));
+ if (node->typeinfo->labelfunc)
+ BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
- /* todo: auto name display */
- BLI_strncpy(showname, node->name, sizeof(showname));
-
+ BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
+
//if(node->flag & NODE_MUTED)
// sprintf(showname, "[%s]", showname);
@@ -946,7 +1006,7 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
else if(node->flag & NODE_HIDDEN)
node_draw_hidden(C, ar, snode, node);
else
- node_draw_basis(C, ar, snode, node);
+ node_draw_basis(C, ar, snode, ntree, node);
}
}
@@ -957,97 +1017,176 @@ static void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode,
else if(node->flag & NODE_HIDDEN)
node_draw_hidden(C, ar, snode, node);
else
- node_draw_basis(C, ar, snode, node);
+ node_draw_basis(C, ar, snode, ntree, node);
}
}
}
-/* fake links from groupnode to internal nodes */
-static void node_draw_group_links(View2D *v2d, SpaceNode *snode, bNode *gnode)
+static void group_verify_cb(bContext *UNUSED(C), void *UNUSED(snode_v), void *ngroup_v)
{
- bNodeLink fakelink;
- bNodeSocket *sock;
-
- glEnable(GL_BLEND);
- glEnable(GL_LINE_SMOOTH);
-
- fakelink.tonode= fakelink.fromnode= gnode;
+ bNodeTree *ngroup= (bNodeTree*)ngroup_v;
- for(sock= gnode->inputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- if(sock->tosock) {
- fakelink.fromsock= sock;
- fakelink.tosock= sock->tosock;
- node_draw_link(v2d, snode, &fakelink);
- }
- }
- }
-
- for(sock= gnode->outputs.first; sock; sock= sock->next) {
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
- if(sock->tosock) {
- fakelink.tosock= sock;
- fakelink.fromsock= sock->tosock;
- node_draw_link(v2d, snode, &fakelink);
- }
- }
- }
-
- glDisable(GL_BLEND);
- glDisable(GL_LINE_SMOOTH);
+ nodeGroupVerify(ngroup);
}
/* groups are, on creation, centered around 0,0 */
-static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *gnode)
+static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNodeSocket *sock;
rctf rect= gnode->totr;
- char showname[128];
+ int index;
+ uiLayout *layout;
+ PointerRNA ptr;
+ uiBut *bt;
/* backdrop header */
glEnable(GL_BLEND);
uiSetRoundBox(3);
UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
- gl_round_box(GL_POLYGON, rect.xmin, rect.ymax, rect.xmax, rect.ymax+NODE_DY, BASIS_RAD);
+ uiDrawBox(GL_POLYGON, rect.xmin-NODE_GROUP_FRAME, rect.ymax, rect.xmax+NODE_GROUP_FRAME, rect.ymax+26, BASIS_RAD);
/* backdrop body */
UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
- uiSetRoundBox(12);
- gl_round_box(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
-
- /* selection outline */
+ uiSetRoundBox(0);
+ uiDrawBox(GL_POLYGON, rect.xmin, rect.ymin, rect.xmax, rect.ymax, BASIS_RAD);
+
+ /* input column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(8);
+ uiDrawBox(GL_POLYGON, rect.xmin-NODE_GROUP_FRAME, rect.ymin, rect.xmin, rect.ymax, BASIS_RAD);
+
+ /* output column */
+ UI_ThemeColorShadeAlpha(TH_BACK, 10, -50);
+ uiSetRoundBox(4);
+ uiDrawBox(GL_POLYGON, rect.xmax, rect.ymin, rect.xmax+NODE_GROUP_FRAME, rect.ymax, BASIS_RAD);
+
+ /* input column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmin, rect.ymin);
+ glVertex2f(rect.xmin, rect.ymax);
+ glEnd();
+
+ /* output column separator */
+ glColor4ub(200, 200, 200, 140);
+ glBegin(GL_LINES);
+ glVertex2f(rect.xmax, rect.ymin);
+ glVertex2f(rect.xmax, rect.ymax);
+ glEnd();
+
+ /* group node outline */
uiSetRoundBox(15);
glColor4ub(200, 200, 200, 140);
glEnable( GL_LINE_SMOOTH );
- gl_round_box(GL_LINE_LOOP, rect.xmin, rect.ymin, rect.xmax, rect.ymax+NODE_DY, BASIS_RAD);
+ uiDrawBox(GL_LINE_LOOP, rect.xmin-NODE_GROUP_FRAME, rect.ymin, rect.xmax+NODE_GROUP_FRAME, rect.ymax+26, BASIS_RAD);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
/* backdrop title */
UI_ThemeColor(TH_TEXT_HI);
- if (gnode->flag & NODE_CUSTOM_NAME)
- BLI_strncpy(showname, gnode->name, sizeof(showname));
- else
- BLI_strncpy(showname, ngroup->id.name+2, sizeof(showname));
+ layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin+15), (short)(rect.ymax+23),
+ MIN2((int)(rect.xmax - rect.xmin-18.0f), 140), 20, U.uistyles.first);
+ RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
+ uiTemplateIDBrowse(layout, (bContext*)C, &ptr, "node_tree", NULL, NULL, NULL);
+ uiBlockLayoutResolve(gnode->block, NULL, NULL);
- // XXX this shows some scaling artifacts
- UI_DrawString(rect.xmin+8.0f, rect.ymax+5.0f, showname);
+ /* draw the internal tree nodes and links */
+ node_draw_nodetree(C, ar, snode, ngroup);
+
+ /* group sockets */
+ for(sock=ngroup->inputs.first, index=0; sock; sock=sock->next, ++index) {
+ socket_circle_draw(sock, NODE_SOCKSIZE);
+ /* small hack to use socket_circle_draw function with offset */
+ sock->locx -= NODE_GROUP_FRAME;
+ socket_circle_draw(sock, NODE_SOCKSIZE);
+ sock->locx += NODE_GROUP_FRAME;
+
+ bt = uiDefBut(gnode->block, TEX, 0, "",
+ sock->locx-114, sock->locy+1, 72, NODE_DY,
+ sock->name, 0, 31, 0, 0, "");
+ uiButSetFunc(bt, group_verify_cb, snode, ngroup);
+
+ node_draw_socket_button(ngroup, sock, "", gnode->block,
+ sock->locx-114, sock->locy-NODE_DY, 72,
+ NULL, NULL, NULL);
+
+ uiBlockSetDirection(gnode->block, UI_TOP);
+ uiBlockBeginAlign(gnode->block);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
+ sock->locx-40, sock->locy, 16, 16, "");
+ if (!sock->prev)
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
+ sock->locx-40, sock->locy-16, 16, 16, "");
+ if (!sock->next)
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+ uiBlockEndAlign(gnode->block);
+ uiBlockSetDirection(gnode->block, 0);
+
+ uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
+ sock->locx-22, sock->locy-8, 16, 16, "");
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_IN);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSS);
+ }
- /* links from groupsockets to the internal nodes */
- node_draw_group_links(&ar->v2d, snode, gnode);
+ for(sock=ngroup->outputs.first, index=0; sock; sock=sock->next, ++index) {
+ socket_circle_draw(sock, NODE_SOCKSIZE);
+ /* small hack to use socket_circle_draw function with offset */
+ sock->locx += NODE_GROUP_FRAME;
+ socket_circle_draw(sock, NODE_SOCKSIZE);
+ sock->locx -= NODE_GROUP_FRAME;
+
+ uiBlockSetEmboss(gnode->block, UI_EMBOSSN);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_remove", 0, ICON_X,
+ sock->locx+6, sock->locy-8, 16, 16, "");
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
+ uiBlockSetEmboss(gnode->block, UI_EMBOSS);
+
+ uiBlockSetDirection(gnode->block, UI_TOP);
+ uiBlockBeginAlign(gnode->block);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_up", 0, ICON_TRIA_UP,
+ sock->locx+24, sock->locy, 16, 16, "");
+ if (!sock->prev)
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
+ bt = uiDefIconButO(gnode->block, BUT, "NODE_OT_group_socket_move_down", 0, ICON_TRIA_DOWN,
+ sock->locx+24, sock->locy-16, 16, 16, "");
+ if (!sock->next)
+ uiButSetFlag(bt, UI_BUT_DISABLED);
+ RNA_int_set(uiButGetOperatorPtrRNA(bt), "index", index);
+ RNA_enum_set(uiButGetOperatorPtrRNA(bt), "in_out", SOCK_OUT);
+ uiBlockEndAlign(gnode->block);
+ uiBlockSetDirection(gnode->block, 0);
+
+ if (sock->link) {
+ bt = uiDefBut(gnode->block, TEX, 0, "",
+ sock->locx+42, sock->locy-NODE_DYS+1, 72, NODE_DY,
+ sock->name, 0, 31, 0, 0, "");
+ uiButSetFunc(bt, group_verify_cb, snode, ngroup);
+ }
+ else {
+ bt = uiDefBut(gnode->block, TEX, 0, "",
+ sock->locx+42, sock->locy+1, 72, NODE_DY,
+ sock->name, 0, 31, 0, 0, "");
+ uiButSetFunc(bt, group_verify_cb, snode, ngroup);
+
+ node_draw_socket_button(ngroup, sock, "", gnode->block, sock->locx+42, sock->locy-NODE_DY, 72, NULL, NULL, NULL);
+ }
+ }
- /* group sockets */
- for(sock= gnode->inputs.first; sock; sock= sock->next)
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, NODE_SOCKSIZE);
- for(sock= gnode->outputs.first; sock; sock= sock->next)
- if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL)))
- socket_circle_draw(sock, NODE_SOCKSIZE);
-
- /* and finally the whole tree */
- node_draw_nodetree(C, ar, snode, ngroup);
+ uiEndBlock(C, gnode->block);
+ uiDrawBlock(C, gnode->block);
+ gnode->block= NULL;
}
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
@@ -1060,7 +1199,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
//uiFreeBlocksWin(&sa->uiblocks, sa->win);
@@ -1072,7 +1211,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
snode->aspect= (v2d->cur.xmax - v2d->cur.xmin)/((float)ar->winx);
// XXX snode->curfont= uiSetCurFont_ext(snode->aspect);
- UI_view2d_constant_grid_draw(C, v2d);
+ UI_view2d_constant_grid_draw(v2d);
/* backdrop */
draw_nodespace_back_pix(ar, snode, color_manage);
@@ -1097,7 +1236,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
if(node->flag & NODE_GROUP_EDIT)
node_update_group(C, snode->nodetree, node);
else if(node->flag & NODE_HIDDEN)
- node_update_hidden(C, node);
+ node_update_hidden(node);
else
node_update(C, snode->nodetree, node);
}
@@ -1107,7 +1246,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
/* active group */
for(node= snode->nodetree->nodes.first; node; node= node->next) {
if(node->flag & NODE_GROUP_EDIT)
- node_draw_group(C, ar, snode, node);
+ node_draw_group(C, ar, snode, snode->nodetree, node);
}
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 829c74fd26d..8086ce3621a 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,11 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_storage_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -48,20 +53,17 @@
#include "BKE_node.h"
#include "BKE_material.h"
#include "BKE_paint.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
#include "BKE_report.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_storage_types.h"
-
#include "RE_pipeline.h"
#include "IMB_imbuf_types.h"
#include "ED_node.h"
#include "ED_screen.h"
+#include "ED_space_api.h"
#include "ED_render.h"
#include "RNA_access.h"
@@ -73,10 +75,17 @@
#include "UI_interface.h"
#include "UI_view2d.h"
+#include "IMB_imbuf.h"
+
+#include "RNA_enum_types.h"
+
#include "node_intern.h"
-#define SOCK_IN 1
-#define SOCK_OUT 2
+static EnumPropertyItem socket_in_out_items[] = {
+ { SOCK_IN, "IN", 0, "In", "" },
+ { SOCK_OUT, "OUT", 0, "Out", "" },
+ { 0, NULL, 0, NULL, NULL}
+};
/* ***************** composite job manager ********************** */
@@ -98,7 +107,7 @@ static int compo_breakjob(void *cjv)
}
/* called by compo, wmJob sends notifier */
-static void compo_redrawjob(void *cjv, char *str)
+static void compo_redrawjob(void *cjv, char *UNUSED(str))
{
CompoJob *cj= cjv;
@@ -194,8 +203,19 @@ void snode_composite_job(const bContext *C, ScrArea *sa)
/* ***************************************** */
+/* operator poll callback */
+static int composite_node_active(bContext *C)
+{
+ if( ED_operator_node_active(C)) {
+ SpaceNode *snode= CTX_wm_space_node(C);
+ if(snode->treetype==NTREE_COMPOSIT)
+ return 1;
+ }
+ return 0;
+}
+
/* also checks for edited groups */
-bNode *editnode_get_active(bNodeTree *ntree)
+static bNode *editnode_get_active(bNodeTree *ntree)
{
bNode *node;
@@ -211,6 +231,8 @@ bNode *editnode_get_active(bNodeTree *ntree)
void snode_notify(bContext *C, SpaceNode *snode)
{
+ WM_event_add_notifier(C, NC_NODE|NA_EDITED, NULL);
+
if(snode->treetype==NTREE_SHADER)
WM_event_add_notifier(C, NC_MATERIAL|ND_NODES, snode->id);
else if(snode->treetype==NTREE_COMPOSIT)
@@ -244,7 +266,7 @@ void ED_node_shader_default(Material *ma)
return;
}
- ma->nodetree= ntreeAddTree(NTREE_SHADER);
+ ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE);
out= nodeAddNodeType(ma->nodetree, SH_NODE_OUTPUT, NULL, NULL);
out->locx= 300.0f; out->locy= 300.0f;
@@ -275,15 +297,17 @@ void ED_node_composit_default(Scene *sce)
return;
}
- sce->nodetree= ntreeAddTree(NTREE_COMPOSIT);
+ sce->nodetree= ntreeAddTree("Compositing Nodetree", NTREE_COMPOSIT, FALSE);
out= nodeAddNodeType(sce->nodetree, CMP_NODE_COMPOSITE, NULL, NULL);
out->locx= 300.0f; out->locy= 400.0f;
out->id= &sce->id;
+ id_us_plus(out->id);
in= nodeAddNodeType(sce->nodetree, CMP_NODE_R_LAYERS, NULL, NULL);
in->locx= 10.0f; in->locy= 400.0f;
in->id= &sce->id;
+ id_us_plus(in->id);
nodeSetActive(sce->nodetree, in);
/* links from color to color */
@@ -310,7 +334,7 @@ void ED_node_texture_default(Tex *tx)
return;
}
- tx->nodetree= ntreeAddTree(NTREE_TEXTURE);
+ tx->nodetree= ntreeAddTree("Texture Nodetree", NTREE_TEXTURE, FALSE);
out= nodeAddNodeType(tx->nodetree, TEX_NODE_OUTPUT, NULL, NULL);
out->locx= 300.0f; out->locy= 300.0f;
@@ -326,6 +350,7 @@ void ED_node_texture_default(Tex *tx)
ntreeSolveOrder(tx->nodetree); /* needed for pointers */
}
+/* id is supposed to contain a node tree */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype)
{
bNode *node= NULL;
@@ -343,6 +368,10 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
*ntree= ((Tex*)id)->nodetree;
if(treetype) *treetype= NTREE_TEXTURE;
}
+ else {
+ if(treetype) *treetype= 0;
+ return;
+ }
/* find editable group */
if(edittree) {
@@ -431,11 +460,25 @@ void node_set_active(SpaceNode *snode, bNode *node)
nodeSetActive(snode->edittree, node);
if(node->type!=NODE_GROUP) {
+ int was_output= (node->flag & NODE_DO_OUTPUT);
+
/* tree specific activate calls */
if(snode->treetype==NTREE_SHADER) {
/* when we select a material, active texture is cleared, for buttons */
if(node->id && GS(node->id->name)==ID_MA)
nodeClearActiveID(snode->edittree, ID_TE);
+
+ if(node->type==SH_NODE_OUTPUT) {
+ bNode *tnode;
+
+ for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ if( tnode->type==SH_NODE_OUTPUT)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+
+ node->flag |= NODE_DO_OUTPUT;
+ if(was_output==0)
+ ED_node_changed_update(snode->id, node);
+ }
// XXX
#if 0
@@ -452,7 +495,7 @@ void node_set_active(SpaceNode *snode, bNode *node)
/* make active viewer, currently only 1 supported... */
if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
bNode *tnode;
- int was_output= (node->flag & NODE_DO_OUTPUT);
+
for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
if( ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
@@ -480,6 +523,16 @@ void node_set_active(SpaceNode *snode, bNode *node)
scene->r.actlay= node->custom1;
}
}
+ else if(node->type==CMP_NODE_COMPOSITE) {
+ bNode *tnode;
+
+ for(tnode= snode->edittree->nodes.first; tnode; tnode= tnode->next)
+ if( tnode->type==CMP_NODE_COMPOSITE)
+ tnode->flag &= ~NODE_DO_OUTPUT;
+
+ node->flag |= NODE_DO_OUTPUT;
+ ED_node_changed_update(snode->id, node);
+ }
}
else if(snode->treetype==NTREE_TEXTURE) {
// XXX
@@ -502,7 +555,7 @@ void node_tree_verify_groups(bNodeTree *nodetree)
/* does all materials */
if(gnode)
- nodeVerifyGroup((bNodeTree *)gnode->id);
+ nodeGroupVerify((bNodeTree *)gnode->id);
}
@@ -541,7 +594,7 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode)
ntreeSolveOrder(snode->nodetree);
}
-static int node_group_edit_exec(bContext *C, wmOperator *op)
+static int node_group_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
@@ -556,7 +609,7 @@ static int node_group_edit_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int node_group_edit_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *gnode;
@@ -586,6 +639,241 @@ void NODE_OT_group_edit(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* ***************** Add Group Socket operator ************* */
+
+static int node_group_socket_add_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ int in_out= -1;
+ char name[32]= "";
+ int type= SOCK_VALUE;
+ bNodeTree *ngroup= snode->edittree;
+ bNodeSocket *sock;
+
+ ED_preview_kill_jobs(C);
+
+ if (RNA_property_is_set(op->ptr, "name"))
+ RNA_string_get(op->ptr, "name", name);
+
+ if (RNA_property_is_set(op->ptr, "type"))
+ type = RNA_enum_get(op->ptr, "type");
+
+ if (RNA_property_is_set(op->ptr, "in_out"))
+ in_out = RNA_enum_get(op->ptr, "in_out");
+ else
+ return OPERATOR_CANCELLED;
+
+ sock = nodeGroupAddSocket(ngroup, name, type, in_out);
+
+ node_tree_verify_groups(snode->nodetree);
+
+ snode_notify(C, snode);
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_socket_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Add Group Socket";
+ ot->description = "Add node group socket";
+ ot->idname = "NODE_OT_group_socket_add";
+
+ /* api callbacks */
+ ot->exec = node_group_socket_add_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output");
+ RNA_def_string(ot->srna, "name", "", 32, "Name", "Group socket name");
+ RNA_def_enum(ot->srna, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of the group socket");
+}
+
+/* ***************** Remove Group Socket operator ************* */
+
+static int node_group_socket_remove_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ int index= -1;
+ int in_out= -1;
+ bNodeTree *ngroup= snode->edittree;
+ bNodeSocket *sock;
+
+ ED_preview_kill_jobs(C);
+
+ if (RNA_property_is_set(op->ptr, "index"))
+ index = RNA_int_get(op->ptr, "index");
+ else
+ return OPERATOR_CANCELLED;
+
+ if (RNA_property_is_set(op->ptr, "in_out"))
+ in_out = RNA_enum_get(op->ptr, "in_out");
+ else
+ return OPERATOR_CANCELLED;
+
+ sock = (bNodeSocket*)BLI_findlink(in_out==SOCK_IN ? &ngroup->inputs : &ngroup->outputs, index);
+ if (sock) {
+ nodeGroupRemoveSocket(ngroup, sock, in_out);
+ node_tree_verify_groups(snode->nodetree);
+
+ snode_notify(C, snode);
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_socket_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Remove Group Socket";
+ ot->description = "Removed node group socket";
+ ot->idname = "NODE_OT_group_socket_remove";
+
+ /* api callbacks */
+ ot->exec = node_group_socket_remove_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output");
+}
+
+/* ***************** Move Group Socket Up operator ************* */
+
+static int node_group_socket_move_up_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ int index= -1;
+ int in_out= -1;
+ bNodeTree *ngroup= snode->edittree;
+ bNodeSocket *sock, *prev;
+
+ ED_preview_kill_jobs(C);
+
+ if (RNA_property_is_set(op->ptr, "index"))
+ index = RNA_int_get(op->ptr, "index");
+ else
+ return OPERATOR_CANCELLED;
+
+ if (RNA_property_is_set(op->ptr, "in_out"))
+ in_out = RNA_enum_get(op->ptr, "in_out");
+ else
+ return OPERATOR_CANCELLED;
+
+ /* swap */
+ if (in_out==SOCK_IN) {
+ sock = (bNodeSocket*)BLI_findlink(&ngroup->inputs, index);
+ prev = sock->prev;
+ /* can't move up the first socket */
+ if (!prev)
+ return OPERATOR_CANCELLED;
+ BLI_remlink(&ngroup->inputs, sock);
+ BLI_insertlinkbefore(&ngroup->inputs, prev, sock);
+ }
+ else if (in_out==SOCK_OUT) {
+ sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
+ prev = sock->prev;
+ /* can't move up the first socket */
+ if (!prev)
+ return OPERATOR_CANCELLED;
+ BLI_remlink(&ngroup->outputs, sock);
+ BLI_insertlinkbefore(&ngroup->outputs, prev, sock);
+ }
+ node_tree_verify_groups(snode->nodetree);
+
+ snode_notify(C, snode);
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_socket_move_up(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Move Group Socket Up";
+ ot->description = "Move up node group socket";
+ ot->idname = "NODE_OT_group_socket_move_up";
+
+ /* api callbacks */
+ ot->exec = node_group_socket_move_up_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output");
+}
+
+/* ***************** Move Group Socket Up operator ************* */
+
+static int node_group_socket_move_down_exec(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode = CTX_wm_space_node(C);
+ int index= -1;
+ int in_out= -1;
+ bNodeTree *ngroup= snode->edittree;
+ bNodeSocket *sock, *next;
+
+ ED_preview_kill_jobs(C);
+
+ if (RNA_property_is_set(op->ptr, "index"))
+ index = RNA_int_get(op->ptr, "index");
+ else
+ return OPERATOR_CANCELLED;
+
+ if (RNA_property_is_set(op->ptr, "in_out"))
+ in_out = RNA_enum_get(op->ptr, "in_out");
+ else
+ return OPERATOR_CANCELLED;
+
+ /* swap */
+ if (in_out==SOCK_IN) {
+ sock = (bNodeSocket*)BLI_findlink(&ngroup->inputs, index);
+ next = sock->next;
+ /* can't move down the last socket */
+ if (!next)
+ return OPERATOR_CANCELLED;
+ BLI_remlink(&ngroup->inputs, sock);
+ BLI_insertlinkafter(&ngroup->inputs, next, sock);
+ }
+ else if (in_out==SOCK_OUT) {
+ sock = (bNodeSocket*)BLI_findlink(&ngroup->outputs, index);
+ next = sock->next;
+ /* can't move down the last socket */
+ if (!next)
+ return OPERATOR_CANCELLED;
+ BLI_remlink(&ngroup->outputs, sock);
+ BLI_insertlinkafter(&ngroup->outputs, next, sock);
+ }
+ node_tree_verify_groups(snode->nodetree);
+
+ snode_notify(C, snode);
+
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_group_socket_move_down(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Move Group Socket Down";
+ ot->description = "Move down node group socket";
+ ot->idname = "NODE_OT_group_socket_move_down";
+
+ /* api callbacks */
+ ot->exec = node_group_socket_move_down_exec;
+ ot->poll = ED_operator_node_active;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ RNA_def_int(ot->srna, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "in_out", socket_in_out_items, SOCK_IN, "Socket Type", "Input or Output");
+}
+
/* ******************** Ungroup operator ********************** */
static int node_group_ungroup_exec(bContext *C, wmOperator *op)
@@ -605,11 +893,11 @@ static int node_group_ungroup_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
if(gnode->type!=NODE_GROUP) {
- BKE_report(op->reports, RPT_ERROR, "Not a group");
+ BKE_report(op->reports, RPT_WARNING, "Not a group");
return OPERATOR_CANCELLED;
}
else if(!nodeGroupUnGroup(snode->edittree, gnode)) {
- BKE_report(op->reports, RPT_ERROR, "Can't ungroup");
+ BKE_report(op->reports, RPT_WARNING, "Can't ungroup");
return OPERATOR_CANCELLED;
}
@@ -736,6 +1024,8 @@ static int snode_bg_viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
MEM_freeN(nvm);
op->customdata= NULL;
+
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_NODE, NULL);
return OPERATOR_FINISHED;
}
@@ -750,12 +1040,15 @@ static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
Image *ima;
ImBuf *ibuf;
int pad= 10;
+ void *lock;
ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
- ibuf= BKE_image_get_ibuf(ima, NULL);
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
- if(ibuf == NULL)
+ if(ibuf == NULL) {
+ BKE_image_release_ibuf(ima, lock);
return OPERATOR_CANCELLED;
+ }
nvm= MEM_callocN(sizeof(NodeViewMove), "NodeViewMove struct");
op->customdata= nvm;
@@ -766,6 +1059,8 @@ static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
nvm->xmax = ar->winx/2 + ibuf->x/2 - pad;
nvm->ymin = -(ar->winy/2) - ibuf->y/2 + pad;
nvm->ymax = ar->winy/2 + ibuf->y/2 - pad;
+
+ BKE_image_release_ibuf(ima, lock);
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -778,12 +1073,13 @@ void NODE_OT_backimage_move(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Background Image Move";
+ ot->description = "Move Node backdrop";
ot->idname= "NODE_OT_backimage_move";
/* api callbacks */
ot->invoke= snode_bg_viewmove_invoke;
ot->modal= snode_bg_viewmove_modal;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -811,7 +1107,7 @@ void NODE_OT_backimage_zoom(wmOperatorType *ot)
/* api callbacks */
ot->exec= backimage_zoom;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -820,6 +1116,169 @@ void NODE_OT_backimage_zoom(wmOperatorType *ot)
RNA_def_float(ot->srna, "factor", 1.2f, 0.0f, 10.0f, "Factor", "", 0.0f, 10.0f);
}
+/******************** sample backdrop operator ********************/
+
+typedef struct ImageSampleInfo {
+ ARegionType *art;
+ void *draw_handle;
+ int x, y;
+ int channels;
+ int color_manage;
+
+ char col[4];
+ float colf[4];
+
+ int draw;
+} ImageSampleInfo;
+
+static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info)
+{
+ ImageSampleInfo *info= arg_info;
+
+ draw_nodespace_color_info(ar, info->channels, info->x, info->y, info->col, info->colf);
+}
+
+static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ ImageSampleInfo *info= op->customdata;
+ void *lock;
+ Image *ima;
+ ImBuf *ibuf;
+ float fx, fy, bufx, bufy;
+ int mx, my;
+
+ ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+ if(!ibuf)
+ return;
+
+ if(!ibuf->rect) {
+ if(info->color_manage)
+ ibuf->profile = IB_PROFILE_LINEAR_RGB;
+ else
+ ibuf->profile = IB_PROFILE_NONE;
+ IMB_rect_from_float(ibuf);
+ }
+
+ mx= event->x - ar->winrct.xmin;
+ my= event->y - ar->winrct.ymin;
+ /* map the mouse coords to the backdrop image space */
+ bufx = ibuf->x * snode->zoom;
+ bufy = ibuf->y * snode->zoom;
+ fx = (bufx > 0.0f ? ((float)mx - 0.5f*ar->winx - snode->xof) / bufx + 0.5f : 0.0f);
+ fy = (bufy > 0.0f ? ((float)my - 0.5f*ar->winy - snode->yof) / bufy + 0.5f : 0.0f);
+
+ if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
+ float *fp;
+ char *cp;
+ int x= (int)(fx*ibuf->x), y= (int)(fy*ibuf->y);
+
+ CLAMP(x, 0, ibuf->x-1);
+ CLAMP(y, 0, ibuf->y-1);
+
+ info->x= x;
+ info->y= y;
+ info->draw= 1;
+ info->channels= ibuf->channels;
+
+ if(ibuf->rect) {
+ cp= (char *)(ibuf->rect + y*ibuf->x + x);
+
+ info->col[0]= cp[0];
+ info->col[1]= cp[1];
+ info->col[2]= cp[2];
+ info->col[3]= cp[3];
+
+ info->colf[0]= (float)cp[0]/255.0f;
+ info->colf[1]= (float)cp[1]/255.0f;
+ info->colf[2]= (float)cp[2]/255.0f;
+ info->colf[3]= (float)cp[3]/255.0f;
+ }
+ if(ibuf->rect_float) {
+ fp= (ibuf->rect_float + (ibuf->channels)*(y*ibuf->x + x));
+
+ info->colf[0]= fp[0];
+ info->colf[1]= fp[1];
+ info->colf[2]= fp[2];
+ info->colf[3]= fp[3];
+ }
+ }
+ else
+ info->draw= 0;
+
+ BKE_image_release_ibuf(ima, lock);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+}
+
+static void sample_exit(bContext *C, wmOperator *op)
+{
+ ImageSampleInfo *info= op->customdata;
+
+ ED_region_draw_cb_exit(info->art, info->draw_handle);
+ ED_area_tag_redraw(CTX_wm_area(C));
+ MEM_freeN(info);
+}
+
+static int sample_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ ImageSampleInfo *info;
+
+ if(snode->treetype!=NTREE_COMPOSIT || !(snode->flag & SNODE_BACKDRAW))
+ return OPERATOR_CANCELLED;
+
+ info= MEM_callocN(sizeof(ImageSampleInfo), "ImageSampleInfo");
+ info->art= ar->type;
+ info->draw_handle = ED_region_draw_cb_activate(ar->type, sample_draw, info, REGION_DRAW_POST_PIXEL);
+ op->customdata= info;
+
+ sample_apply(C, op, event);
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sample_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ switch(event->type) {
+ case LEFTMOUSE:
+ case RIGHTMOUSE: // XXX hardcoded
+ sample_exit(C, op);
+ return OPERATOR_CANCELLED;
+ case MOUSEMOVE:
+ sample_apply(C, op, event);
+ break;
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int sample_cancel(bContext *C, wmOperator *op)
+{
+ sample_exit(C, op);
+ return OPERATOR_CANCELLED;
+}
+
+void NODE_OT_backimage_sample(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Backimage Sample";
+ ot->idname= "NODE_OT_backimage_sample";
+
+ /* api callbacks */
+ ot->invoke= sample_invoke;
+ ot->modal= sample_modal;
+ ot->cancel= sample_cancel;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+}
/* ********************** size widget operator ******************** */
@@ -1095,7 +1554,7 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
}
-static int node_active_link_viewer(bContext *C, wmOperator *op)
+static int node_active_link_viewer(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -1133,7 +1592,7 @@ void NODE_OT_link_viewer(wmOperatorType *ot)
/* return 0, nothing done */
-/*static*/ int node_mouse_groupheader(SpaceNode *snode)
+static int node_mouse_groupheader(SpaceNode *snode)
{
bNode *gnode;
float mx=0, my=0;
@@ -1214,6 +1673,33 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket **
}
}
}
+
+ /* check group sockets
+ * NB: using ngroup->outputs as input sockets and vice versa here!
+ */
+ if(in_out & SOCK_IN) {
+ for(sock= snode->edittree->outputs.first; sock; sock= sock->next) {
+ if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
+ if(BLI_in_rctf(&rect, sock->locx, sock->locy)) {
+ *nodep= NULL; /* NULL node pointer indicates group socket */
+ *sockp= sock;
+ return 1;
+ }
+ }
+ }
+ }
+ if(in_out & SOCK_OUT) {
+ for(sock= snode->edittree->inputs.first; sock; sock= sock->next) {
+ if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
+ if(BLI_in_rctf(&rect, sock->locx, sock->locy)) {
+ *nodep= NULL; /* NULL node pointer indicates group socket */
+ *sockp= sock;
+ return 1;
+ }
+ }
+ }
+ }
+
return 0;
}
@@ -1254,6 +1740,16 @@ static int node_socket_hilights(SpaceNode *snode, int in_out)
return redraw;
}
+static int outside_group_rect(SpaceNode *snode)
+{
+ bNode *gnode= node_tree_get_editgroup(snode->nodetree);
+ if (gnode) {
+ return (snode->mx < gnode->totr.xmin || snode->mx >= gnode->totr.xmax
+ || snode->my < gnode->totr.ymin || snode->my >= gnode->totr.ymax);
+ }
+ return 0;
+}
+
/* ****************** Add *********************** */
@@ -1262,7 +1758,7 @@ typedef struct bNodeListItem {
struct bNode *node;
} bNodeListItem;
-int sort_nodes_locx(void *a, void *b)
+static int sort_nodes_locx(void *a, void *b)
{
bNodeListItem *nli1 = (bNodeListItem *)a;
bNodeListItem *nli2 = (bNodeListItem *)b;
@@ -1358,7 +1854,7 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
ListBase *nodelist = MEM_callocN(sizeof(ListBase), "items_list");
bNodeListItem *nli;
bNode *node;
- int i;
+ int i, numlinks=0;
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & NODE_SELECT) {
@@ -1396,11 +1892,15 @@ void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace)
nodeRemSocketLinks(snode->edittree, sock_to);
nodeAddLink(snode->edittree, node_fr, sock_fr, node_to, sock_to);
NodeTagChanged(snode->edittree, node_to);
+ ++numlinks;
break;
}
}
- ntreeSolveOrder(snode->edittree);
+ if (numlinks > 0) {
+ node_tree_verify_groups(snode->nodetree);
+ ntreeSolveOrder(snode->edittree);
+ }
BLI_freelistN(nodelist);
MEM_freeN(nodelist);
@@ -1433,7 +1933,7 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
/* generics */
if(node) {
node->locx= locx;
- node->locy= locy + 60.0f; // arbitrary.. so its visible
+ node->locy= locy + 60.0f; // arbitrary.. so its visible, (0,0) is top of node
node->flag |= SELECT;
gnode= node_tree_get_editgroup(snode->nodetree);
@@ -1467,15 +1967,39 @@ bNode *node_add_node(SpaceNode *snode, Scene *scene, int type, float locx, float
/* ****************** Duplicate *********************** */
-static int node_duplicate_exec(bContext *C, wmOperator *op)
+static int node_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
+ bNodeTree *ntree= snode->edittree;
+ bNode *node, *newnode, *last;
ED_preview_kill_jobs(C);
-
- ntreeCopyTree(snode->edittree, 1); /* 1 == internally selected nodes */
- ntreeSolveOrder(snode->edittree);
+ last = ntree->nodes.last;
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->flag & SELECT) {
+ newnode = nodeCopyNode(ntree, node);
+
+ /* deselect old node, select the copy instead */
+ node->flag &= ~(NODE_SELECT|NODE_ACTIVE);
+ newnode->flag |= NODE_SELECT;
+
+ if(newnode->id) {
+ /* simple id user adjustment, node internal functions dont touch this
+ * but operators and readfile.c do. */
+ id_us_plus(newnode->id);
+ /* to ensure redraws or rerenders happen */
+ ED_node_changed_update(snode->id, newnode);
+ }
+ }
+
+ /* make sure we don't copy new nodes again! */
+ if (node==last)
+ break;
+ }
+
+ ntreeSolveOrder(ntree);
+
node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
@@ -1520,19 +2044,24 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL
break;
}
if(tlink) {
- /* is there a free input socket with same type? */
- for(sock= tlink->tonode->inputs.first; sock; sock= sock->next) {
- if(sock->type==tlink->fromsock->type)
- if(nodeCountSocketLinks(snode->edittree, sock) < sock->limit)
- break;
- }
- if(sock) {
- tlink->tosock= sock;
- sock->flag &= ~SOCK_HIDDEN;
+ /* try to move the existing link to the next available socket */
+ if (tlink->tonode) {
+ /* is there a free input socket with same type? */
+ for(sock= tlink->tonode->inputs.first; sock; sock= sock->next) {
+ if(sock->type==tlink->fromsock->type)
+ if(nodeCountSocketLinks(snode->edittree, sock) < sock->limit)
+ break;
+ }
+ if(sock) {
+ tlink->tosock= sock;
+ sock->flag &= ~SOCK_HIDDEN;
+ }
+ else {
+ nodeRemLink(snode->edittree, tlink);
+ }
}
- else {
+ else
nodeRemLink(snode->edittree, tlink);
- }
}
}
}
@@ -1563,7 +2092,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if(in_out==SOCK_OUT) {
if(find_indicated_socket(snode, &tnode, &tsock, SOCK_IN)) {
if(nodeFindLink(snode->edittree, sock, tsock)==NULL) {
- if(tnode!=node && link->tonode!=tnode && link->tosock!= tsock) {
+ if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) {
link->tonode= tnode;
link->tosock= tsock;
ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
@@ -1579,7 +2108,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if(find_indicated_socket(snode, &tnode, &tsock, SOCK_OUT)) {
if(nodeFindLink(snode->edittree, sock, tsock)==NULL) {
if(nodeCountSocketLinks(snode->edittree, tsock) < tsock->limit) {
- if(tnode!=node && link->fromnode!=tnode && link->fromsock!= tsock) {
+ if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) {
link->fromnode= tnode;
link->fromsock= tsock;
ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
@@ -1600,19 +2129,28 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
case LEFTMOUSE:
case RIGHTMOUSE:
case MIDDLEMOUSE:
-
- /* remove link? */
- if(link->tonode==NULL || link->fromnode==NULL) {
- nodeRemLink(snode->edittree, link);
- }
- else {
+ if(link->tosock && link->fromsock) {
/* send changed events for original tonode and new */
- if(link->tonode)
+ if(link->tonode)
NodeTagChanged(snode->edittree, link->tonode);
/* we might need to remove a link */
- if(in_out==SOCK_OUT) node_remove_extra_links(snode, link->tosock, link);
+ if(in_out==SOCK_OUT)
+ node_remove_extra_links(snode, link->tosock, link);
}
+ else if (outside_group_rect(snode) && (link->tonode || link->fromnode)) {
+ /* automatically add new group socket */
+ if (link->tonode && link->tosock) {
+ link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN);
+ link->fromnode = NULL;
+ }
+ else if (link->fromnode && link->fromsock) {
+ link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT);
+ link->tonode = NULL;
+ }
+ }
+ else
+ nodeRemLink(snode->edittree, link);
ntreeSolveOrder(snode->edittree);
node_tree_verify_groups(snode->nodetree);
@@ -1735,7 +2273,7 @@ static int node_make_link_exec(bContext *C, wmOperator *op)
ED_preview_kill_jobs(C);
- snode_autoconnect(snode, 0, replace);
+ snode_autoconnect(snode, 1, replace);
node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
@@ -1771,7 +2309,7 @@ static int cut_links_intersect(bNodeLink *link, float mcoords[][2], int tot)
if(node_link_bezier_points(NULL, NULL, link, coord_array, LINK_RESOL)) {
for(i=0; i<tot-1; i++)
- for(b=0; b<LINK_RESOL-1; b++)
+ for(b=0; b<LINK_RESOL; b++)
if(isect_line_line_v2(mcoords[i], mcoords[i+1], coord_array[b], coord_array[b+1]) > 0)
return 1;
}
@@ -1845,8 +2383,9 @@ void NODE_OT_links_cut(wmOperatorType *ot)
/* ******************************** */
// XXX some code needing updating to operators...
+
/* goes over all scenes, reads render layers */
-static int node_read_renderlayers_exec(bContext *C, wmOperator *op)
+static int node_read_renderlayers_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
@@ -1882,24 +2421,25 @@ void NODE_OT_read_renderlayers(wmOperatorType *ot)
ot->exec= node_read_renderlayers_exec;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= 0;
}
-static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *op)
+static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Main *bmain= CTX_data_main(C);
SpaceNode *snode= CTX_wm_space_node(C);
Scene *curscene= CTX_data_scene(C);
Render *re= RE_NewRender(curscene->id.name);
-// WM_cursor_wait(1);
+ WM_cursor_wait(1);
- RE_MergeFullSample(re, curscene, snode->nodetree);
+ RE_MergeFullSample(re, bmain, curscene, snode->nodetree);
snode_notify(C, snode);
-// WM_cursor_wait(0);
+ WM_cursor_wait(0);
return OPERATOR_FINISHED;
}
@@ -1912,40 +2452,61 @@ void NODE_OT_read_fullsamplelayers(wmOperatorType *ot)
ot->exec= node_read_fullsamplelayers_exec;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= 0;
}
-
-/* ************************* */
-
-void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser)
+int node_render_changed_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Scene *sce= CTX_data_scene(C);
bNode *node;
- if(ntree==NULL)
- return;
-
- /* search for renderresults */
- if(image->type==IMA_TYPE_R_RESULT) {
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->type==CMP_NODE_R_LAYERS && node->id==NULL) {
- /* imageuser comes from ImageWin, so indexes are offset 1 */
- if(node->custom1==iuser->layer-1)
- NodeTagChanged(ntree, node);
- }
+ for(node= sce->nodetree->nodes.first; node; node= node->next) {
+ if(node->id==(ID *)sce && node->need_exec) {
+ break;
}
}
- else {
- for(node= ntree->nodes.first; node; node= node->next) {
- if(node->id== &image->id)
- NodeTagChanged(ntree, node);
+ if(node) {
+ SceneRenderLayer *srl= BLI_findlink(&sce->r.layers, node->custom1);
+
+ if(srl) {
+ PointerRNA op_ptr;
+
+ WM_operator_properties_create(&op_ptr, "RENDER_OT_render");
+ RNA_string_set(&op_ptr, "layer", srl->name);
+ RNA_string_set(&op_ptr, "scene", sce->id.name+2);
+
+ /* to keep keypositions */
+ sce->r.scemode |= R_NO_FRAME_UPDATE;
+
+ WM_operator_name_call(C, "RENDER_OT_render", WM_OP_INVOKE_DEFAULT, &op_ptr);
+
+ WM_operator_properties_free(&op_ptr);
+
+ return OPERATOR_FINISHED;
}
+
}
+ return OPERATOR_CANCELLED;
+}
+
+void NODE_OT_render_changed(wmOperatorType *ot)
+{
+
+ ot->name= "Render Changed Layer";
+ ot->idname= "NODE_OT_render_changed";
+
+ ot->exec= node_render_changed_exec;
+
+ ot->poll= composite_node_active;
+
+ /* flags */
+ ot->flag= 0;
}
+
/* ****************** Make Group operator ******************* */
static int node_group_make_exec(bContext *C, wmOperator *op)
@@ -1954,7 +2515,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
bNode *gnode;
if(snode->edittree!=snode->nodetree) {
- BKE_report(op->reports, RPT_ERROR, "Can not add a new Group in a Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not add a new Group in a Group");
return OPERATOR_CANCELLED;
}
@@ -1967,7 +2528,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
}
if(gnode) {
- BKE_report(op->reports, RPT_ERROR, "Can not add RenderLayer in a Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not add RenderLayer in a Group");
return OPERATOR_CANCELLED;
}
}
@@ -1976,7 +2537,7 @@ static int node_group_make_exec(bContext *C, wmOperator *op)
gnode= nodeMakeGroupFromSelected(snode->nodetree);
if(gnode==NULL) {
- BKE_report(op->reports, RPT_ERROR, "Can not make Group");
+ BKE_report(op->reports, RPT_WARNING, "Can not make Group");
return OPERATOR_CANCELLED;
}
else {
@@ -2037,7 +2598,7 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
}
}
-static int node_hide_exec(bContext *C, wmOperator *op)
+static int node_hide_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2067,7 +2628,7 @@ void NODE_OT_hide_toggle(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_preview_exec(bContext *C, wmOperator *op)
+static int node_preview_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2099,7 +2660,7 @@ void NODE_OT_preview_toggle(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_socket_toggle_exec(bContext *C, wmOperator *op)
+static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -2150,7 +2711,7 @@ void NODE_OT_hide_socket_toggle(wmOperatorType *ot)
/* ****************** Mute operator *********************** */
-static int node_mute_exec(bContext *C, wmOperator *op)
+static int node_mute_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node;
@@ -2192,7 +2753,7 @@ void NODE_OT_mute_toggle(wmOperatorType *ot)
/* ****************** Delete operator ******************* */
-static int node_delete_exec(bContext *C, wmOperator *op)
+static int node_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
bNode *node, *next;
@@ -2233,7 +2794,7 @@ void NODE_OT_delete(wmOperatorType *ot)
/* ****************** Show Cyclic Dependencies Operator ******************* */
-static int node_show_cycles_exec(bContext *C, wmOperator *op)
+static int node_show_cycles_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode= CTX_wm_space_node(C);
@@ -2277,7 +2838,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
errno= 0;
- ima= BKE_add_image_file(path, scene ? scene->r.cfra : 1);
+ ima= BKE_add_image_file(path);
if(!ima) {
BKE_reportf(op->reports, RPT_ERROR, "Can't read: \"%s\", %s.", path, errno ? strerror(errno) : "Unsupported image format");
@@ -2306,7 +2867,7 @@ static int node_add_file_exec(bContext *C, wmOperator *op)
node = node_add_node(snode, scene, ntype, snode->mx, snode->my);
if (!node) {
- BKE_report(op->reports, RPT_ERROR, "Could not add an image node.");
+ BKE_report(op->reports, RPT_WARNING, "Could not add an image node.");
return OPERATOR_CANCELLED;
}
@@ -2342,7 +2903,7 @@ void NODE_OT_add_file(wmOperatorType *ot)
/* callbacks */
ot->exec= node_add_file_exec;
ot->invoke= node_add_file_invoke;
- ot->poll= ED_operator_node_active;
+ ot->poll= composite_node_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 17c50b32e98..4d4896d65a0 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,28 +37,43 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_node.h"
#include "BKE_main.h"
-
#include "WM_api.h"
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_view2d.h"
#include "node_intern.h"
/* ************************ add menu *********************** */
-static void do_node_add(bContext *C, void *arg, int event)
+static void do_node_add(bContext *C, void *UNUSED(arg), int event)
{
SpaceNode *snode= CTX_wm_space_node(C);
+ ScrArea *sa= CTX_wm_area(C);
+ ARegion *ar;
bNode *node;
+ /* get location to add node at mouse */
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ if(ar->regiontype == RGN_TYPE_WINDOW) {
+ wmWindow *win= CTX_wm_window(C);
+ int x= win->eventstate->x - ar->winrct.xmin;
+ int y= win->eventstate->y - ar->winrct.ymin;
+
+ if(y < 60) y+= 60;
+ UI_view2d_region_to_view(&ar->v2d, x, y, &snode->mx, &snode->my);
+ }
+ }
+
/* store selection in temp test flag */
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->flag & NODE_SELECT) node->flag |= NODE_TEST;
@@ -125,7 +140,7 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
if(ngroup->type==ntree->type) {
- uiItemV(layout, ngroup->id.name+2, 0, NODE_GROUP_MENU+tot);
+ uiItemV(layout, ngroup->id.name+2, ICON_NULL, NODE_GROUP_MENU+tot);
a++;
}
}
@@ -137,11 +152,11 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(a=0, type= ntree->alltypes.first; type; type=type->next) {
if(type->nclass == nodeclass && type->name) {
if(type->type == NODE_DYNAMIC) {
- uiItemV(layout, type->name, 0, NODE_DYNAMIC_MENU+script);
+ uiItemV(layout, type->name, ICON_NULL, NODE_DYNAMIC_MENU+script);
script++;
}
else
- uiItemV(layout, type->name, 0, type->type);
+ uiItemV(layout, type->name, ICON_NULL, type->type);
a++;
}
@@ -151,8 +166,8 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
static void node_menu_add(const bContext *C, Menu *menu)
{
- uiLayout *layout= menu->layout;
SpaceNode *snode= CTX_wm_space_node(C);
+ uiLayout *layout= menu->layout;
if(!snode->nodetree)
uiLayoutSetActive(layout, 0);
@@ -189,7 +204,7 @@ static void node_menu_add(const bContext *C, Menu *menu)
}
}
-void node_menus_register(ARegionType *art)
+void node_menus_register(void)
{
MenuType *mt;
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 77fda0627e7..31eb7a7bfd2 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ ARegion *node_has_buttons_region(ScrArea *sa);
/* node_header.c */
void node_header_buttons(const bContext *C, ARegion *ar);
-void node_menus_register(struct ARegionType *art);
+void node_menus_register(void);
/* node_draw.c */
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d);
@@ -68,11 +68,10 @@ void NODE_OT_select_same_type_prev(wmOperatorType *ot);
/* drawnode.c */
void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link);
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int th_col2, int do_shaded);
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3 );
int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, float coord_array[][2], int resol);
void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage);
-
-void node_buts_group(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr);
+void draw_nodespace_color_info(ARegion *ar, int channels, int x, int y, char *cp, float *fp);
/* node_edit.c */
void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype);
@@ -91,7 +90,7 @@ void node_tree_verify_groups(bNodeTree *nodetree);
void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace);
int node_has_hidden_sockets(bNode *node);
void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set);
-
+int node_render_changed_exec(bContext *, wmOperator *);
void NODE_OT_duplicate(struct wmOperatorType *ot);
void NODE_OT_delete(struct wmOperatorType *ot);
@@ -104,6 +103,10 @@ void NODE_OT_links_cut(struct wmOperatorType *ot);
void NODE_OT_group_make(struct wmOperatorType *ot);
void NODE_OT_group_ungroup(struct wmOperatorType *ot);
void NODE_OT_group_edit(struct wmOperatorType *ot);
+void NODE_OT_group_socket_add(struct wmOperatorType *ot);
+void NODE_OT_group_socket_remove(struct wmOperatorType *ot);
+void NODE_OT_group_socket_move_up(struct wmOperatorType *ot);
+void NODE_OT_group_socket_move_down(struct wmOperatorType *ot);
void NODE_OT_mute_toggle(struct wmOperatorType *ot);
void NODE_OT_hide_toggle(struct wmOperatorType *ot);
@@ -114,11 +117,16 @@ void NODE_OT_show_cyclic_dependencies(struct wmOperatorType *ot);
void NODE_OT_link_viewer(struct wmOperatorType *ot);
void NODE_OT_read_fullsamplelayers(struct wmOperatorType *ot);
void NODE_OT_read_renderlayers(struct wmOperatorType *ot);
+void NODE_OT_render_changed(struct wmOperatorType *ot);
+
void NODE_OT_backimage_move(struct wmOperatorType *ot);
void NODE_OT_backimage_zoom(struct wmOperatorType *ot);
+void NODE_OT_backimage_sample(wmOperatorType *ot);
void NODE_OT_add_file(struct wmOperatorType *ot);
+extern const char *node_context_dir[];
+
// XXXXXX
// XXX from BSE_node.h
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index 46cd8515f23..e563ae4e3f4 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,7 @@
#include "BKE_context.h"
+#include "ED_node.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -73,14 +74,20 @@ void node_operatortypes(void)
WM_operatortype_append(NODE_OT_group_make);
WM_operatortype_append(NODE_OT_group_ungroup);
WM_operatortype_append(NODE_OT_group_edit);
+ WM_operatortype_append(NODE_OT_group_socket_add);
+ WM_operatortype_append(NODE_OT_group_socket_remove);
+ WM_operatortype_append(NODE_OT_group_socket_move_up);
+ WM_operatortype_append(NODE_OT_group_socket_move_down);
WM_operatortype_append(NODE_OT_link_viewer);
WM_operatortype_append(NODE_OT_read_renderlayers);
WM_operatortype_append(NODE_OT_read_fullsamplelayers);
+ WM_operatortype_append(NODE_OT_render_changed);
WM_operatortype_append(NODE_OT_backimage_move);
WM_operatortype_append(NODE_OT_backimage_zoom);
+ WM_operatortype_append(NODE_OT_backimage_sample);
WM_operatortype_append(NODE_OT_add_file);
}
@@ -136,7 +143,7 @@ void node_keymap(struct wmKeyConfig *keyconf)
RNA_float_set(kmi->ptr, "factor", 0.83333f);
kmi= WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, KM_ALT, 0);
RNA_float_set(kmi->ptr, "factor", 1.2f);
-
+ WM_keymap_add_item(keymap, "NODE_OT_backimage_sample", ACTIONMOUSE, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "replace", 1);
@@ -167,8 +174,10 @@ void node_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "NODE_OT_group_ungroup", GKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "NODE_OT_group_edit", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_read_renderlayers", RKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_read_fullsamplelayers", RKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "NODE_OT_render_changed", ZKEY, KM_PRESS, 0, 0);
+
transform_keymap_for_space(keyconf, keymap, SPACE_NODE);
}
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index ec08cdf07ac..bcc69c1f260 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "BKE_context.h"
#include "BLI_rect.h"
+#include "BLI_utildefines.h"
#include "ED_screen.h"
#include "ED_types.h"
@@ -108,13 +109,6 @@ static int node_select_exec(bContext *C, wmOperator *op)
/* perform the select */
node= node_mouse_select(snode, ar, mval, extend);
-
- /* WATCH THIS, there are a few other ways to change the active material */
- if(node) {
- if (node->id && ELEM(GS(node->id->name), ID_MA, ID_TE)) {
- WM_event_add_notifier(C, NC_MATERIAL|ND_SHADING_DRAW, node->id);
- }
- }
/* send notifiers */
WM_event_add_notifier(C, NC_NODE|NA_SELECTED, NULL);
@@ -143,6 +137,7 @@ void NODE_OT_select(wmOperatorType *ot)
/* identifiers */
ot->name= "Select";
ot->idname= "NODE_OT_select";
+ ot->description= "Select node under cursor";
/* api callbacks */
ot->invoke= node_select_invoke;
@@ -223,6 +218,7 @@ void NODE_OT_select_border(wmOperatorType *ot)
/* identifiers */
ot->name= "Border Select";
ot->idname= "NODE_OT_select_border";
+ ot->description= "Use box selection to select nodes";
/* api callbacks */
ot->invoke= node_border_select_invoke;
@@ -241,7 +237,7 @@ void NODE_OT_select_border(wmOperatorType *ot)
/* ****** Select/Deselect All ****** */
-static int node_select_all_exec(bContext *C, wmOperator *op)
+static int node_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNode *first = snode->edittree->nodes.first;
@@ -282,7 +278,7 @@ void NODE_OT_select_all(wmOperatorType *ot)
/* ****** Select Linked To ****** */
-static int node_select_linked_to_exec(bContext *C, wmOperator *op)
+static int node_select_linked_to_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeLink *link;
@@ -292,7 +288,7 @@ static int node_select_linked_to_exec(bContext *C, wmOperator *op)
node->flag &= ~NODE_TEST;
for (link=snode->edittree->links.first; link; link=link->next) {
- if (link->fromnode->flag & NODE_SELECT)
+ if (link->fromnode && link->tonode && (link->fromnode->flag & NODE_SELECT))
link->tonode->flag |= NODE_TEST;
}
@@ -322,7 +318,7 @@ void NODE_OT_select_linked_to(wmOperatorType *ot)
/* ****** Select Linked From ****** */
-static int node_select_linked_from_exec(bContext *C, wmOperator *op)
+static int node_select_linked_from_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
bNodeLink *link;
@@ -332,7 +328,7 @@ static int node_select_linked_from_exec(bContext *C, wmOperator *op)
node->flag &= ~NODE_TEST;
for(link=snode->edittree->links.first; link; link=link->next) {
- if(link->tonode->flag & NODE_SELECT)
+ if(link->fromnode && link->tonode && (link->tonode->flag & NODE_SELECT))
link->fromnode->flag |= NODE_TEST;
}
@@ -362,7 +358,7 @@ void NODE_OT_select_linked_from(wmOperatorType *ot)
/* ****** Select Same Type ****** */
-static int node_select_same_type_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
@@ -388,7 +384,7 @@ void NODE_OT_select_same_type(wmOperatorType *ot)
/* ****** Select The Next/Prev Node Of The Same Type ****** */
-static int node_select_same_type_next_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_next_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
@@ -412,7 +408,7 @@ void NODE_OT_select_same_type_next(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
-static int node_select_same_type_prev_exec(bContext *C, wmOperator *op)
+static int node_select_same_type_prev_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceNode *snode = CTX_wm_space_node(C);
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index b4f09f960d6..abb3d83d336 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,11 +31,12 @@
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
+#include "BLI_rect.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_node.h"
-#include "BLI_rect.h"
-
#include "ED_screen.h"
#include "RNA_access.h"
@@ -116,21 +117,21 @@ static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
node->flag ^= NODE_PREVIEW;
return 1;
}
- totr.xmin-=18.0f;
+ totr.xmin-=15.0f;
}
if(node->type == NODE_GROUP) {
if(BLI_in_rctf(&totr, mx, my)) {
snode_make_group_editable(snode, node);
return 1;
}
- totr.xmin-=18.0f;
+ totr.xmin-=15.0f;
}
if(node->typeinfo->flag & NODE_OPTIONS) {
if(BLI_in_rctf(&totr, mx, my)) {
node->flag ^= NODE_OPTIONS;
return 1;
}
- totr.xmin-=18.0f;
+ totr.xmin-=15.0f;
}
/* hide unused sockets */
if(BLI_in_rctf(&totr, mx, my)) {
@@ -140,7 +141,7 @@ static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my)
return 0;
}
-static int do_header_hidden_node(SpaceNode *snode, bNode *node, float mx, float my)
+static int do_header_hidden_node(bNode *node, float mx, float my)
{
rctf totr= node->totr;
@@ -164,7 +165,7 @@ static int node_toggle_visibility(SpaceNode *snode, ARegion *ar, short *mval)
for(next_node(snode->edittree); (node=next_node(NULL));) {
if(node->flag & NODE_HIDDEN) {
- if(do_header_hidden_node(snode, node, mx, my)) {
+ if(do_header_hidden_node(node, mx, my)) {
ED_region_tag_redraw(ar);
return 1;
}
@@ -227,7 +228,7 @@ void NODE_OT_visibility_toggle(wmOperatorType *ot)
/* **************** View All Operator ************** */
-static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
+static void snode_home(ScrArea *UNUSED(sa), ARegion *ar, SpaceNode* snode)
{
bNode *node;
rctf *cur, *tot;
@@ -278,7 +279,7 @@ static void snode_home(ScrArea *sa, ARegion *ar, SpaceNode* snode)
UI_view2d_curRect_validate(&ar->v2d);
}
-static int node_view_all_exec(bContext *C, wmOperator *op)
+static int node_view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
@@ -295,6 +296,7 @@ void NODE_OT_view_all(wmOperatorType *ot)
/* identifiers */
ot->name= "View All";
ot->idname= "NODE_OT_view_all";
+ ot->description= "Resize view so you can see all nodes";
/* api callbacks */
ot->exec= node_view_all_exec;
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index d9a4dda9d6e..4bccd14bb42 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,10 +39,13 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "BKE_node.h"
+#include "ED_space_api.h"
#include "ED_render.h"
#include "ED_screen.h"
@@ -88,7 +91,7 @@ ARegion *node_has_buttons_region(ScrArea *sa)
/* ******************** default callbacks for node space ***************** */
-static SpaceLink *node_new(const bContext *C)
+static SpaceLink *node_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceNode *snode;
@@ -96,6 +99,9 @@ static SpaceLink *node_new(const bContext *C)
snode= MEM_callocN(sizeof(SpaceNode), "initnode");
snode->spacetype= SPACE_NODE;
+ /* backdrop */
+ snode->zoom = 1.0f;
+
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for node");
@@ -117,15 +123,15 @@ static SpaceLink *node_new(const bContext *C)
BLI_addtail(&snode->regionbase, ar);
ar->regiontype= RGN_TYPE_WINDOW;
- ar->v2d.tot.xmin= -10.0f;
- ar->v2d.tot.ymin= -10.0f;
- ar->v2d.tot.xmax= 512.0f;
- ar->v2d.tot.ymax= 512.0f;
+ ar->v2d.tot.xmin= -256.0f;
+ ar->v2d.tot.ymin= -256.0f;
+ ar->v2d.tot.xmax= 768.0f;
+ ar->v2d.tot.ymax= 768.0f;
- ar->v2d.cur.xmin= 0.0f;
- ar->v2d.cur.ymin= 0.0f;
- ar->v2d.cur.xmax= 512.0f;
- ar->v2d.cur.ymax= 512.0f;
+ ar->v2d.cur.xmin= -256.0f;
+ ar->v2d.cur.ymin= -256.0f;
+ ar->v2d.cur.xmax= 768.0f;
+ ar->v2d.cur.ymax= 768.0f;
ar->v2d.min[0]= 1.0f;
ar->v2d.min[1]= 1.0f;
@@ -144,20 +150,23 @@ static SpaceLink *node_new(const bContext *C)
}
/* not spacelink itself */
-static void node_free(SpaceLink *sl)
+static void node_free(SpaceLink *UNUSED(sl))
{
}
/* spacetype; init callback */
-static void node_init(struct wmWindowManager *wm, ScrArea *sa)
+static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
{
+ /* note, ED_area_tag_refresh will re-execute compositor */
+ SpaceNode *snode= sa->spacedata.first;
+ int type= snode->treetype;
/* preview renders */
switch(wmn->category) {
@@ -167,23 +176,35 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
case ND_FRAME:
ED_area_tag_refresh(sa);
break;
+ case ND_TRANSFORM_DONE:
+ if(type==NTREE_COMPOSIT) {
+ if(snode->flag & SNODE_AUTO_RENDER) {
+ snode->recalc= 1;
+ ED_area_tag_refresh(sa);
+ }
+ }
+ break;
}
break;
case NC_WM:
if(wmn->data==ND_FILEREAD)
ED_area_tag_refresh(sa);
break;
-
+
/* future: add ID checks? */
case NC_MATERIAL:
- if(wmn->data==ND_SHADING)
- ED_area_tag_refresh(sa);
- else if(wmn->data==ND_SHADING_DRAW)
- ED_area_tag_refresh(sa);
+ if(type==NTREE_SHADER) {
+ if(wmn->data==ND_SHADING)
+ ED_area_tag_refresh(sa);
+ else if(wmn->data==ND_SHADING_DRAW)
+ ED_area_tag_refresh(sa);
+ }
break;
case NC_TEXTURE:
- if(wmn->data==ND_NODES)
- ED_area_tag_refresh(sa);
+ if(type==NTREE_SHADER || type==NTREE_TEXTURE) {
+ if(wmn->data==ND_NODES)
+ ED_area_tag_refresh(sa);
+ }
break;
case NC_TEXT:
/* pynodes */
@@ -200,6 +221,20 @@ static void node_area_listener(ScrArea *sa, wmNotifier *wmn)
if (wmn->action == NA_EDITED)
ED_area_tag_refresh(sa);
break;
+
+ case NC_IMAGE:
+ if (wmn->action == NA_EDITED) {
+ if(type==NTREE_COMPOSIT) {
+ Scene *scene= wmn->window->screen->scene;
+
+ /* note that NodeTagIDChanged is alredy called by BKE_image_signal() on all
+ * scenes so really this is just to know if the images is used in the compo else
+ * painting on images could become very slow when the compositor is open. */
+ if(NodeTagIDChanged(scene->nodetree, wmn->reference))
+ ED_area_tag_refresh(sa);
+ }
+ }
+ break;
}
}
@@ -218,8 +253,15 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa)
}
else if(snode->treetype==NTREE_COMPOSIT) {
Scene *scene= (Scene *)snode->id;
- if(scene->use_nodes)
- snode_composite_job(C, sa);
+ if(scene->use_nodes) {
+ /* recalc is set on 3d view changes for auto compo */
+ if(snode->recalc) {
+ snode->recalc= 0;
+ node_render_changed_exec((struct bContext*)C, NULL);
+ }
+ else
+ snode_composite_job(C, sa);
+ }
}
else if(snode->treetype==NTREE_TEXTURE) {
Tex *tex= (Tex *)snode->id;
@@ -288,7 +330,7 @@ static void node_main_area_draw(const bContext *C, ARegion *ar)
/* ************* dropboxes ************* */
-static int node_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int node_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -327,7 +369,7 @@ static void node_dropboxes(void)
/* add handlers, stuff you only do once or on area/region changes */
-static void node_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void node_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -369,13 +411,14 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn)
}
}
+const char *node_context_dir[] = {"selected_nodes", NULL};
+
static int node_context(const bContext *C, const char *member, bContextDataResult *result)
{
SpaceNode *snode= CTX_wm_space_node(C);
if(CTX_data_dir(member)) {
- static const char *dir[] = {"selected_nodes", NULL};
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, node_context_dir);
return 1;
}
else if(CTX_data_equals(member, "selected_nodes")) {
@@ -434,7 +477,7 @@ void ED_spacetype_node(void)
BLI_addhead(&st->regiontypes, art);
- node_menus_register(art);
+ node_menus_register();
/* regions: listview/buttons */
art= MEM_callocN(sizeof(ARegionType), "spacetype node region");
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index 78c4fcbdd8d..6dc5792ad0c 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -19,18 +19,25 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
- ../include
- ../../../../intern/guardedalloc
- ../../../../intern/opennl/extern
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+ ../../../../intern/opennl/extern
+)
+
+set(SRC
+ outliner.c
+ outliner_ops.c
+ space_outliner.c
+
+ outliner_intern.h
)
-BLENDERLIB(bf_editor_space_outliner "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_outliner "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_outliner/Makefile b/source/blender/editors/space_outliner/Makefile
deleted file mode 100644
index bd6725c5b71..00000000000
--- a/source/blender/editors/space_outliner/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_outliner
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_outliner/SConscript b/source/blender/editors/space_outliner/SConscript
index a7f487a4149..ab0b8582d33 100644
--- a/source/blender/editors/space_outliner/SConscript
+++ b/source/blender/editors/space_outliner/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc ../../makesrna'
+incs += ' ../../windowmanager #/intern/guardedalloc ../../makesrna ../../blenloader'
incs += ' #/extern/glew/include'
env.BlenderLib ( 'bf_editors_space_outliner', sources, Split(incs), [], libtype=['core'], priority=[60] )
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 2f32c54a1a5..91a2754545b 100644
--- a/source/blender/editors/space_outliner/outliner.c
+++ b/source/blender/editors/space_outliner/outliner.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,6 +51,7 @@
#include "DNA_object_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#if defined WIN32 && !defined _LIBC
# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
@@ -120,7 +121,7 @@
/* ************* XXX **************** */
-static void error(const char *dummy, ...) {}
+static void error(const char *UNUSED(arg), ...) {}
/* ********************************** */
@@ -187,7 +188,7 @@ static void check_persistant(SpaceOops *soops, TreeElement *te, ID *id, short ty
/* case 1; no TreeStore */
if(soops->treestore==NULL) {
- ts= soops->treestore= MEM_callocN(sizeof(TreeStore), "treestore");
+ soops->treestore= MEM_callocN(sizeof(TreeStore), "treestore");
}
ts= soops->treestore;
@@ -240,7 +241,7 @@ void outliner_free_tree(ListBase *lb)
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
- if(te->flag & TE_FREE_NAME) MEM_freeN(te->name);
+ if(te->flag & TE_FREE_NAME) MEM_freeN((void *)te->name);
MEM_freeN(te);
}
}
@@ -324,7 +325,7 @@ static ID *outliner_search_back(SpaceOops *soops, TreeElement *te, short idcode)
struct treesort {
TreeElement *te;
ID *id;
- char *name;
+ const char *name;
short idcode;
};
@@ -340,7 +341,7 @@ static int treesort_alpha(const void *v1, const void *v2)
if(comp==1) return 1;
else if(comp==2) return -1;
else if(comp==3) {
- int comp= strcmp(x1->name, x2->name);
+ comp= strcmp(x1->name, x2->name);
if( comp>0 ) return 1;
else if( comp<0) return -1;
@@ -1112,8 +1113,8 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
c= RNA_property_array_item_char(prop, index);
te->name= MEM_callocN(sizeof(char)*20, "OutlinerRNAArrayName");
- if(c) sprintf(te->name, " %c", c);
- else sprintf(te->name, " %d", index+1);
+ if(c) sprintf((char *)te->name, " %c", c);
+ else sprintf((char *)te->name, " %d", index+1);
te->flag |= TE_FREE_NAME;
}
}
@@ -1188,7 +1189,7 @@ static void outliner_make_hierarchy(SpaceOops *soops, ListBase *lb)
}
/* Helped function to put duplicate sequence in the same tree. */
-int need_add_seq_dup(Sequence *seq)
+static int need_add_seq_dup(Sequence *seq)
{
Sequence *p;
@@ -1225,7 +1226,7 @@ int need_add_seq_dup(Sequence *seq)
return(1);
}
-void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index)
+static void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index)
{
TreeElement *ch;
Sequence *p;
@@ -1243,7 +1244,7 @@ void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index)
}
}
-static int outliner_filter_has_name(TreeElement *te, char *name, int flags)
+static int outliner_filter_has_name(TreeElement *te, const char *name, int flags)
{
#if 0
int found= 0;
@@ -1308,7 +1309,7 @@ static int outliner_filter_tree(SpaceOops *soops, ListBase *lb)
outliner_free_tree(&te->subtree);
BLI_remlink(lb, te);
- if(te->flag & TE_FREE_NAME) MEM_freeN(te->name);
+ if(te->flag & TE_FREE_NAME) MEM_freeN((void *)te->name);
MEM_freeN(te);
}
}
@@ -1408,7 +1409,6 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
for(group= mainvar->group.first; group; group= group->id.next) {
if(group->gobject.first) {
te= outliner_add_element(soops, &soops->tree, group, NULL, 0, 0);
- tselem= TREESTORE(te);
for(go= group->gobject.first; go; go= go->next) {
ten= outliner_add_element(soops, &te->subtree, go->ob, te, 0, 0);
@@ -1509,6 +1509,42 @@ static void outliner_build_tree(Main *mainvar, Scene *scene, SpaceOops *soops)
/* **************** INTERACTIVE ************* */
+
+static int outliner_scroll_page_exec(bContext *C, wmOperator *op)
+{
+ ARegion *ar= CTX_wm_region(C);
+ int dy= ar->v2d.mask.ymax - ar->v2d.mask.ymin;
+ int up= 0;
+
+ if(RNA_boolean_get(op->ptr, "up"))
+ up= 1;
+
+ if(up == 0) dy= -dy;
+ ar->v2d.cur.ymin+= dy;
+ ar->v2d.cur.ymax+= dy;
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void OUTLINER_OT_scroll_page(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Scroll Page";
+ ot->idname= "OUTLINER_OT_scroll_page";
+ ot->description= "Scroll page up or down";
+
+ /* callbacks */
+ ot->exec= outliner_scroll_page_exec;
+ ot->poll= ED_operator_outliner_active;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "up", 0, "Up", "Scroll up one page.");
+}
+
+
static int outliner_count_levels(SpaceOops *soops, ListBase *lb, int curlevel)
{
TreeElement *te;
@@ -1553,17 +1589,44 @@ static void outliner_set_flag(SpaceOops *soops, ListBase *lb, short flag, short
/* --- */
-void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+/* same check needed for both object operation and restrict column button func
+ * return 0 when in edit mode (cannot restrict view or select)
+ * otherwise return 1 */
+static int common_restrict_check(bContext *C, Object *ob)
+{
+ /* Don't allow hide an object in edit mode,
+ * check the bug #22153 and #21609, #23977
+ */
+ Object *obedit= CTX_data_edit_object(C);
+ if (obedit && obedit == ob) {
+ /* found object is hidden, reset */
+ if (ob->restrictflag & OB_RESTRICT_VIEW)
+ ob->restrictflag &= ~OB_RESTRICT_VIEW;
+ /* found object is unselectable, reset */
+ if (ob->restrictflag & OB_RESTRICT_SELECT)
+ ob->restrictflag &= ~OB_RESTRICT_SELECT;
+ return 0;
+ }
+
+ return 1;
+}
+
+static void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
- if(base || (base= object_in_scene((Object *)tselem->id, scene))) {
+ Object *ob = (Object *)tselem->id;
+
+ /* add check for edit mode */
+ if(!common_restrict_check(C, ob)) return;
+
+ if(base || (base= object_in_scene(ob, scene))) {
if((base->object->restrictflag ^= OB_RESTRICT_VIEW)) {
ED_base_object_select(base, BA_DESELECT);
}
}
}
-static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_visibility_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1571,6 +1634,7 @@ static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op)
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_VISIBLE, scene);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
@@ -1579,20 +1643,20 @@ static int outliner_toggle_visibility_exec(bContext *C, wmOperator *op)
void OUTLINER_OT_visibility_toggle(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Toggle Visability";
+ ot->name= "Toggle Visibility";
ot->idname= "OUTLINER_OT_visibility_toggle";
ot->description= "Toggle the visibility of selected items";
/* callbacks */
ot->exec= outliner_toggle_visibility_exec;
- ot->poll= ED_operator_outliner_active;
+ ot->poll= ED_operator_outliner_active_no_editobject;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* --- */
-static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_toggle_selectability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -1602,7 +1666,7 @@ static void object_toggle_selectability_cb(bContext *C, Scene *scene, TreeElemen
}
}
-static int outliner_toggle_selectability_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_selectability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1610,6 +1674,7 @@ static int outliner_toggle_selectability_exec(bContext *C, wmOperator *op)
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
@@ -1624,12 +1689,12 @@ void OUTLINER_OT_selectability_toggle(wmOperatorType *ot)
/* callbacks */
ot->exec= outliner_toggle_selectability_exec;
- ot->poll= ED_operator_outliner_active;
+ ot->poll= ED_operator_outliner_active_no_editobject;
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -1639,7 +1704,7 @@ void object_toggle_renderability_cb(bContext *C, Scene *scene, TreeElement *te,
}
}
-static int outliner_toggle_renderability_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_renderability_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -1668,7 +1733,7 @@ void OUTLINER_OT_renderability_toggle(wmOperatorType *ot)
/* --- */
-static int outliner_toggle_expanded_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_expanded_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
@@ -1699,10 +1764,11 @@ void OUTLINER_OT_expanded_toggle(wmOperatorType *ot)
/* --- */
-static int outliner_toggle_selected_exec(bContext *C, wmOperator *op)
+static int outliner_toggle_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
+ Scene *scene= CTX_data_scene(C);
if (outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1))
outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0);
@@ -1711,6 +1777,7 @@ static int outliner_toggle_selected_exec(bContext *C, wmOperator *op)
soops->storeflag |= SO_TREESTORE_REDRAW;
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
@@ -1778,6 +1845,7 @@ void OUTLINER_OT_show_one_level(wmOperatorType *ot)
/* identifiers */
ot->name= "Show/Hide One Level";
ot->idname= "OUTLINER_OT_show_one_level";
+ ot->description= "Expand/collapse all entries by one level";
/* callbacks */
ot->exec= outliner_one_level_exec;
@@ -1789,6 +1857,8 @@ void OUTLINER_OT_show_one_level(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "open", 1, "Open", "Expand all entries one level deep.");
}
+/* This is not used anywhere at the moment */
+#if 0
/* return 1 when levels were opened */
static int outliner_open_back(SpaceOops *soops, TreeElement *te)
{
@@ -1805,8 +1875,6 @@ static int outliner_open_back(SpaceOops *soops, TreeElement *te)
return retval;
}
-/* This is not used anywhere at the moment */
-#if 0
static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *teFind, int *found)
{
TreeElement *te;
@@ -1832,7 +1900,7 @@ static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *te
#endif
// XXX just use View2D ops for this?
-void outliner_page_up_down(Scene *scene, ARegion *ar, SpaceOops *soops, int up)
+static void outliner_page_up_down(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int up)
{
int dy= ar->v2d.mask.ymax-ar->v2d.mask.ymin;
@@ -1900,15 +1968,14 @@ static void tree_element_set_active_object(bContext *C, Scene *scene, SpaceOops
scene_deselect_all(scene);
ED_base_object_select(base, BA_SELECT);
}
- if(C)
+ if(C) {
ED_base_object_activate(C, base); /* adds notifier */
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
+ }
}
if(ob!=scene->obedit)
ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
-
}
static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
@@ -1955,13 +2022,13 @@ static int tree_element_active_material(bContext *C, Scene *scene, SpaceOops *so
static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tep;
- TreeStoreElem *tselem, *tselemp;
+ TreeStoreElem /* *tselem,*/ *tselemp;
Object *ob=OBACT;
SpaceButs *sbuts=NULL;
if(ob==NULL) return 0; // no active object
- tselem= TREESTORE(te);
+ /*tselem= TREESTORE(te);*/ /*UNUSED*/
/* find buttons area (note, this is undefined really still, needs recode in blender) */
/* XXX removed finding sbuts */
@@ -2019,12 +2086,14 @@ static int tree_element_active_texture(bContext *C, Scene *scene, SpaceOops *soo
}
}
- WM_event_add_notifier(C, NC_TEXTURE, NULL);
+ if(set)
+ WM_event_add_notifier(C, NC_TEXTURE, NULL);
+
return 0;
}
-static int tree_element_active_lamp(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_lamp(bContext *UNUSED(C), Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
Object *ob;
@@ -2040,6 +2109,16 @@ static int tree_element_active_lamp(bContext *C, Scene *scene, SpaceOops *soops,
return 0;
}
+static int tree_element_active_camera(bContext *UNUSED(C), Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+{
+ Object *ob= (Object *)outliner_search_back(soops, te, ID_OB);
+
+ if(set)
+ return 0;
+
+ return scene->camera == ob;
+}
+
static int tree_element_active_world(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
{
TreeElement *tep;
@@ -2077,7 +2156,7 @@ static int tree_element_active_defgroup(bContext *C, Scene *scene, TreeElement *
ob= (Object *)tselem->id;
if(set) {
ob->actdef= te->index+1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
}
else {
@@ -2114,13 +2193,11 @@ static int tree_element_active_posechannel(bContext *C, Scene *scene, TreeElemen
if(set) {
if(!(pchan->bone->flag & BONE_HIDDEN_P)) {
- if(set==2) ED_pose_deselectall(ob, 2, 0); // 2 = clear active tag
- else ED_pose_deselectall(ob, 0, 0); // 0 = deselect
+ if(set==2) ED_pose_deselectall(ob, 2); // 2 = clear active tag
+ else ED_pose_deselectall(ob, 0); // 0 = deselect
if(set==2 && (pchan->bone->flag & BONE_SELECTED)) {
pchan->bone->flag &= ~BONE_SELECTED;
- if(arm->act_bone==pchan->bone)
- arm->act_bone= NULL;
} else {
pchan->bone->flag |= BONE_SELECTED;
arm->act_bone= pchan->bone;
@@ -2145,13 +2222,11 @@ static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te,
if(set) {
if(!(bone->flag & BONE_HIDDEN_P)) {
- if(set==2) ED_pose_deselectall(OBACT, 2, 0); // 2 is clear active tag
- else ED_pose_deselectall(OBACT, 0, 0);
+ if(set==2) ED_pose_deselectall(OBACT, 2); // 2 is clear active tag
+ else ED_pose_deselectall(OBACT, 0);
if(set==2 && (bone->flag & BONE_SELECTED)) {
bone->flag &= ~BONE_SELECTED;
- if(arm->act_bone==bone)
- arm->act_bone= NULL;
} else {
bone->flag |= BONE_SELECTED;
arm->act_bone= bone;
@@ -2172,32 +2247,54 @@ static int tree_element_active_bone(bContext *C, Scene *scene, TreeElement *te,
/* ebones only draw in editmode armature */
-static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static void tree_element_active_ebone__sel(bContext *C, Scene *scene, bArmature *arm, EditBone *ebone, short sel)
{
- EditBone *ebone= te->directdata;
-
- if(set) {
- if(!(ebone->flag & BONE_HIDDEN_A)) {
- bArmature *arm= scene->obedit->data;
- if(set==2) ED_armature_deselectall(scene->obedit, 2, 0); // only clear active tag
- else ED_armature_deselectall(scene->obedit, 0, 0); // deselect
+ if(sel) {
+ ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL;
+ arm->act_edbone= ebone;
+ // flush to parent?
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag |= BONE_TIPSEL;
+ }
+ else {
+ ebone->flag &= ~(BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL);
+ // flush to parent?
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag &= ~BONE_TIPSEL;
+ }
- ebone->flag |= BONE_SELECTED|BONE_ROOTSEL|BONE_TIPSEL;
- arm->act_edbone= ebone;
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, scene->obedit);
+}
+static int tree_element_active_ebone(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
+{
+ bArmature *arm= scene->obedit->data;
+ EditBone *ebone= te->directdata;
- // flush to parent?
- if(ebone->parent && (ebone->flag & BONE_CONNECTED)) ebone->parent->flag |= BONE_TIPSEL;
-
- WM_event_add_notifier(C, NC_OBJECT|ND_BONE_ACTIVE, scene->obedit);
+ if(set==1) {
+ if(!(ebone->flag & BONE_HIDDEN_A)) {
+ ED_armature_deselect_all(scene->obedit, 0); // deselect
+ tree_element_active_ebone__sel(C, scene, arm, ebone, TRUE);
+ return 1;
}
}
- else {
- if (ebone->flag & BONE_SELECTED) return 1;
+ else if (set==2) {
+ if(!(ebone->flag & BONE_HIDDEN_A)) {
+ if(!(ebone->flag & BONE_SELECTED)) {
+ tree_element_active_ebone__sel(C, scene, arm, ebone, TRUE);
+ return 1;
+ }
+ else {
+ /* entirely selected, so de-select */
+ tree_element_active_ebone__sel(C, scene, arm, ebone, FALSE);
+ return 0;
+ }
+ }
+ }
+ else if (ebone->flag & BONE_SELECTED) {
+ return 1;
}
return 0;
}
-static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_modifier(bContext *C, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2210,7 +2307,7 @@ static int tree_element_active_modifier(bContext *C, TreeElement *te, TreeStoreE
return 0;
}
-static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_psys(bContext *C, Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2223,7 +2320,7 @@ static int tree_element_active_psys(bContext *C, Scene *scene, TreeElement *te,
return 0;
}
-static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_constraint(bContext *C, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
if(set) {
Object *ob= (Object *)tselem->id;
@@ -2235,7 +2332,7 @@ static int tree_element_active_constraint(bContext *C, TreeElement *te, TreeStor
return 0;
}
-static int tree_element_active_text(bContext *C, Scene *scene, SpaceOops *soops, TreeElement *te, int set)
+static int tree_element_active_text(bContext *UNUSED(C), Scene *UNUSED(scene), SpaceOops *UNUSED(soops), TreeElement *UNUSED(te), int UNUSED(set))
{
// XXX removed
return 0;
@@ -2256,11 +2353,13 @@ static int tree_element_active(bContext *C, Scene *scene, SpaceOops *soops, Tree
return tree_element_active_texture(C, scene, soops, te, set);
case ID_TXT:
return tree_element_active_text(C, scene, soops, te, set);
+ case ID_CA:
+ return tree_element_active_camera(C, scene, soops, te, set);
}
return 0;
}
-static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *tselem, int set)
{
Object *ob= (Object *)tselem->id;
Base *base= object_in_scene(ob, scene);
@@ -2280,7 +2379,7 @@ static int tree_element_active_pose(bContext *C, Scene *scene, TreeElement *te,
return 0;
}
-static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence(TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
Sequence *seq= (Sequence*) te->directdata;
@@ -2294,7 +2393,7 @@ static int tree_element_active_sequence(bContext *C, TreeElement *te, TreeStoreE
return(0);
}
-static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_sequence_dup(Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
Sequence *seq, *p;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -2321,7 +2420,7 @@ static int tree_element_active_sequence_dup(bContext *C, Scene *scene, TreeEleme
return(0);
}
-static int tree_element_active_keymap_item(bContext *C, TreeElement *te, TreeStoreElem *tselem, int set)
+static int tree_element_active_keymap_item(bContext *UNUSED(C), TreeElement *te, TreeStoreElem *UNUSED(tselem), int set)
{
wmKeyMapItem *kmi= te->directdata;
@@ -2366,9 +2465,9 @@ static int tree_element_type_active(bContext *C, Scene *scene, SpaceOops *soops,
case TSE_POSEGRP:
return tree_element_active_posegroup(C, scene, te, tselem, set);
case TSE_SEQUENCE:
- return tree_element_active_sequence(C, te, tselem, set);
+ return tree_element_active_sequence(te, tselem, set);
case TSE_SEQUENCE_DUP:
- return tree_element_active_sequence_dup(C, scene, te, tselem, set);
+ return tree_element_active_sequence_dup(scene, te, tselem, set);
case TSE_KEYMAP_ITEM:
return tree_element_active_keymap_item(C, te, tselem, set);
@@ -2446,19 +2545,7 @@ static int do_outliner_item_activate(bContext *C, Scene *scene, ARegion *ar, Spa
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
else if(ELEM5(te->idcode, ID_ME, ID_CU, ID_MB, ID_LT, ID_AR)) {
- Object *obedit= CTX_data_edit_object(C);
- if(obedit)
- ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO);
- else {
- Object *ob= CTX_data_active_object(C);
-
- /* Don't allow edit mode if the object is hide!
- * check the bug #22153 and #21609
- */
- if (ob && (!(ob->restrictflag & OB_RESTRICT_VIEW)))
- ED_object_enter_editmode(C, EM_WAITCURSOR);
- // XXX extern_set_butspace(F9KEY, 0);
- }
+ WM_operator_name_call(C, "OBJECT_OT_editmode_toggle", WM_OP_INVOKE_REGION_WIN, NULL);
} else { // rest of types
tree_element_active(C, scene, soops, te, 1);
}
@@ -2485,9 +2572,12 @@ static int outliner_item_activate(bContext *C, wmOperator *op, wmEvent *event)
TreeElement *te;
float fmval[2];
int extend= RNA_boolean_get(op->ptr, "extend");
-
+
UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin, fmval, fmval+1);
-
+
+ if(!ELEM3(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF, SO_KEYMAP) && !(soops->flag & SO_HIDE_RESTRICTCOLS) && fmval[0] > ar->v2d.cur.xmax - OL_TOG_RESTRICT_VIEWX)
+ return OPERATOR_CANCELLED;
+
for(te= soops->tree.first; te; te= te->next) {
if(do_outliner_item_activate(C, scene, ar, soops, te, extend, fmval)) break;
}
@@ -2520,6 +2610,7 @@ void OUTLINER_OT_item_activate(wmOperatorType *ot)
{
ot->name= "Activate Item";
ot->idname= "OUTLINER_OT_item_activate";
+ ot->description= "Handle mouse clicks to activate/select items";
ot->invoke= outliner_item_activate;
@@ -2582,6 +2673,7 @@ void OUTLINER_OT_item_openclose(wmOperatorType *ot)
{
ot->name= "Open/Close Item";
ot->idname= "OUTLINER_OT_item_openclose";
+ ot->description= "Toggle whether item under cursor is enabled or closed";
ot->invoke= outliner_item_openclose;
@@ -2612,9 +2704,11 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
error("Cannot edit sequence name");
else if(tselem->id->lib) {
// XXX error_libdata();
- } else if(te->idcode == ID_LI && te->parent) {
+ }
+ else if(te->idcode == ID_LI && te->parent) {
error("Cannot edit the path of an indirectly linked library");
- } else {
+ }
+ else {
tselem->flag |= TSE_TEXTBUT;
ED_region_tag_redraw(ar);
}
@@ -2628,7 +2722,7 @@ static int do_outliner_item_rename(bContext *C, ARegion *ar, SpaceOops *soops, T
return 0;
}
-static int outliner_item_rename(bContext *C, wmOperator *op, wmEvent *event)
+static int outliner_item_rename(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
@@ -2649,45 +2743,13 @@ void OUTLINER_OT_item_rename(wmOperatorType *ot)
{
ot->name= "Rename Item";
ot->idname= "OUTLINER_OT_item_rename";
+ ot->description= "Rename item under cursor";
ot->invoke= outliner_item_rename;
ot->poll= ED_operator_outliner_active;
}
-
-
-/* recursive helper for function below */
-static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
-{
- TreeStoreElem *tselem= TREESTORE(te);
-
- /* store coord and continue, we need coordinates for elements outside view too */
- te->xs= (float)startx;
- te->ys= (float)(*starty);
- *starty-= OL_H;
-
- if((tselem->flag & TSE_CLOSED)==0) {
- TreeElement *ten;
- for(ten= te->subtree.first; ten; ten= ten->next) {
- outliner_set_coordinates_element(soops, ten, startx+OL_X, starty);
- }
- }
-
-}
-
-/* to retrieve coordinates with redrawing the entire tree */
-static void outliner_set_coordinates(ARegion *ar, SpaceOops *soops)
-{
- TreeElement *te;
- int starty= (int)(ar->v2d.tot.ymax)-OL_H;
- int startx= 0;
-
- for(te= soops->tree.first; te; te= te->next) {
- outliner_set_coordinates_element(soops, te, startx, &starty);
- }
-}
-
static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
{
TreeElement *te, *tes;
@@ -2698,7 +2760,7 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
if(tselem->type==0) {
if(tselem->id==id) return te;
/* only deeper on scene or object */
- if( te->idcode==ID_OB || te->idcode==ID_SCE) {
+ if( te->idcode==ID_OB || te->idcode==ID_SCE || (soops->outlinevis == SO_GROUPS && te->idcode==ID_GR)) {
tes= outliner_find_id(soops, &te->subtree, id);
if(tes) return tes;
}
@@ -2707,7 +2769,7 @@ static TreeElement *outliner_find_id(SpaceOops *soops, ListBase *lb, ID *id)
return NULL;
}
-static int outliner_show_active_exec(bContext *C, wmOperator *op)
+static int outliner_show_active_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *so= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -2753,8 +2815,66 @@ void OUTLINER_OT_show_active(wmOperatorType *ot)
/* callbacks */
ot->exec= outliner_show_active_exec;
ot->poll= ED_operator_outliner_active;
+}
+
+/* tse is not in the treestore, we use its contents to find a match */
+static TreeElement *outliner_find_tse(SpaceOops *soops, TreeStoreElem *tse)
+{
+ TreeStore *ts= soops->treestore;
+ TreeStoreElem *tselem;
+ int a;
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ if(tse->id==NULL) return NULL;
+
+ /* check if 'tse' is in treestore */
+ tselem= ts->data;
+ for(a=0; a<ts->usedelem; a++, tselem++) {
+ if((tse->type==0 && tselem->type==0) || (tselem->type==tse->type && tselem->nr==tse->nr)) {
+ if(tselem->id==tse->id) {
+ break;
+ }
+ }
+ }
+ if(tselem)
+ return outliner_find_tree_element(&soops->tree, a);
+
+ return NULL;
+}
+
+
+/* Called to find an item based on name.
+ */
+#if 0
+
+/* recursive helper for function below */
+static void outliner_set_coordinates_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
+{
+ TreeStoreElem *tselem= TREESTORE(te);
+
+ /* store coord and continue, we need coordinates for elements outside view too */
+ te->xs= (float)startx;
+ te->ys= (float)(*starty);
+ *starty-= OL_H;
+
+ if((tselem->flag & TSE_CLOSED)==0) {
+ TreeElement *ten;
+ for(ten= te->subtree.first; ten; ten= ten->next) {
+ outliner_set_coordinates_element(soops, ten, startx+OL_X, starty);
+ }
+ }
+
+}
+
+/* to retrieve coordinates with redrawing the entire tree */
+static void outliner_set_coordinates(ARegion *ar, SpaceOops *soops)
+{
+ TreeElement *te;
+ int starty= (int)(ar->v2d.tot.ymax)-OL_H;
+ int startx= 0;
+
+ for(te= soops->tree.first; te; te= te->next) {
+ outliner_set_coordinates_element(soops, te, startx, &starty);
+ }
}
/* find next element that has this name */
@@ -2786,34 +2906,7 @@ static TreeElement *outliner_find_named(SpaceOops *soops, ListBase *lb, char *na
return NULL;
}
-/* tse is not in the treestore, we use its contents to find a match */
-static TreeElement *outliner_find_tse(SpaceOops *soops, TreeStoreElem *tse)
-{
- TreeStore *ts= soops->treestore;
- TreeStoreElem *tselem;
- int a;
-
- if(tse->id==NULL) return NULL;
-
- /* check if 'tse' is in treestore */
- tselem= ts->data;
- for(a=0; a<ts->usedelem; a++, tselem++) {
- if((tse->type==0 && tselem->type==0) || (tselem->type==tse->type && tselem->nr==tse->nr)) {
- if(tselem->id==tse->id) {
- break;
- }
- }
- }
- if(tselem)
- return outliner_find_tree_element(&soops->tree, a);
-
- return NULL;
-}
-
-
-/* Called to find an item based on name.
- */
-void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again, int flags)
+static void outliner_find_panel(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int again, int flags)
{
TreeElement *te= NULL;
TreeElement *last_find;
@@ -2885,6 +2978,7 @@ void outliner_find_panel(Scene *scene, ARegion *ar, SpaceOops *soops, int again,
error("Not found: %s", name);
}
}
+#endif
/* helper function for tree_element_shwo_hierarchy() - recursively checks whether subtrees have any objects*/
static int subtree_has_objects(SpaceOops *soops, ListBase *lb)
@@ -2927,7 +3021,7 @@ static void tree_element_show_hierarchy(Scene *scene, SpaceOops *soops, ListBase
}
/* show entire object level hierarchy */
-static int outliner_show_hierarchy_exec(bContext *C, wmOperator *op)
+static int outliner_show_hierarchy_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soops= CTX_wm_space_outliner(C);
ARegion *ar= CTX_wm_region(C);
@@ -3045,7 +3139,7 @@ static void set_operation_types(SpaceOops *soops, ListBase *lb,
}
}
-static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_material_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *UNUSED(tselem))
{
Material **matar=NULL;
int a, totcol=0;
@@ -3079,7 +3173,7 @@ static void unlink_material_cb(bContext *C, Scene *scene, TreeElement *te, TreeS
}
}
-static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_texture_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *UNUSED(tselem))
{
MTex **mtex= NULL;
int a;
@@ -3108,7 +3202,7 @@ static void unlink_texture_cb(bContext *C, Scene *scene, TreeElement *te, TreeSt
}
}
-static void unlink_group_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void unlink_group_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *tsep, TreeStoreElem *tselem)
{
Group *group= (Group *)tselem->id;
@@ -3145,7 +3239,7 @@ static void outliner_do_libdata_operation(bContext *C, Scene *scene, SpaceOops *
/* */
-static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_select_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3156,7 +3250,7 @@ static void object_select_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
}
}
-static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_deselect_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3167,7 +3261,7 @@ static void object_deselect_cb(bContext *C, Scene *scene, TreeElement *te, TreeS
}
}
-static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Base *base= (Base *)te->directdata;
@@ -3182,12 +3276,10 @@ static void object_delete_cb(bContext *C, Scene *scene, TreeElement *te, TreeSto
te->directdata= NULL;
tselem->id= NULL;
}
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
}
-static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void id_local_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
if(tselem->id->lib && (tselem->id->flag & LIB_EXTERN)) {
tselem->id->lib= NULL;
@@ -3196,7 +3288,7 @@ static void id_local_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreEle
}
}
-static void group_linkobs2scene_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *tsep, TreeStoreElem *tselem)
+static void group_linkobs2scene_cb(bContext *UNUSED(C), Scene *scene, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem)
{
Group *group= (Group *)tselem->id;
GroupObject *gob;
@@ -3220,7 +3312,7 @@ static void group_linkobs2scene_cb(bContext *C, Scene *scene, TreeElement *te, T
}
}
-static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *soops, ListBase *lb,
+static void outliner_do_object_operation(bContext *C, Scene *scene_act, SpaceOops *soops, ListBase *lb,
void (*operation_cb)(bContext *C, Scene *scene, TreeElement *, TreeStoreElem *, TreeStoreElem *))
{
TreeElement *te;
@@ -3231,23 +3323,25 @@ static void outliner_do_object_operation(bContext *C, Scene *scene, SpaceOops *s
if(tselem->flag & TSE_SELECTED) {
if(tselem->type==0 && te->idcode==ID_OB) {
// when objects selected in other scenes... dunno if that should be allowed
- Scene *sce= (Scene *)outliner_search_back(soops, te, ID_SCE);
- if(sce && scene != sce) {
- ED_screen_set_scene(C, sce);
+ Scene *scene_owner= (Scene *)outliner_search_back(soops, te, ID_SCE);
+ if(scene_owner && scene_act != scene_owner) {
+ ED_screen_set_scene(C, scene_owner);
}
-
- operation_cb(C, scene, te, NULL, tselem);
+ /* important to use 'scene_owner' not scene_act else deleting objects can crash.
+ * only use 'scene_act' when 'scene_owner' is NULL, which can happen when the
+ * outliner isnt showing scenes: Visible Layer draw mode for eg. */
+ operation_cb(C, scene_owner ? scene_owner : scene_act, te, NULL, tselem);
}
}
if((tselem->flag & TSE_CLOSED)==0) {
- outliner_do_object_operation(C, scene, soops, &te->subtree, operation_cb);
+ outliner_do_object_operation(C, scene_act, soops, &te->subtree, operation_cb);
}
}
}
/* ******************************************** */
-static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void pchan_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
bPoseChannel *pchan= (bPoseChannel *)te->directdata;
@@ -3263,7 +3357,7 @@ static void pchan_cb(int event, TreeElement *te, TreeStoreElem *tselem)
pchan->bone->flag &= ~BONE_HIDDEN_P;
}
-static void bone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void bone_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
Bone *bone= (Bone *)te->directdata;
@@ -3279,7 +3373,7 @@ static void bone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
bone->flag &= ~BONE_HIDDEN_P;
}
-static void ebone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void ebone_cb(int event, TreeElement *te, TreeStoreElem *UNUSED(tselem))
{
EditBone *ebone= (EditBone *)te->directdata;
@@ -3295,7 +3389,7 @@ static void ebone_cb(int event, TreeElement *te, TreeStoreElem *tselem)
ebone->flag &= ~BONE_HIDDEN_A;
}
-static void sequence_cb(int event, TreeElement *te, TreeStoreElem *tselem)
+static void sequence_cb(int event, TreeElement *UNUSED(te), TreeStoreElem *UNUSED(tselem))
{
// Sequence *seq= (Sequence*) te->directdata;
if(event==1) {
@@ -3322,7 +3416,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li
}
}
-void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
+static void outliner_del(bContext *C, Scene *scene, ARegion *UNUSED(ar), SpaceOops *soops)
{
if(soops->outlinevis==SO_SEQUENCE)
@@ -3331,6 +3425,7 @@ void outliner_del(bContext *C, Scene *scene, ARegion *ar, SpaceOops *soops)
outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
DAG_scene_sort(CTX_data_main(C), scene);
ED_undo_push(C, "Delete Objects");
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
}
}
@@ -3352,7 +3447,7 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
SpaceOops *soops= CTX_wm_space_outliner(C);
int event;
- char *str= NULL;
+ const char *str= NULL;
/* check for invalid states */
if (soops == NULL)
@@ -3368,34 +3463,38 @@ static int outliner_object_operation_exec(bContext *C, wmOperator *op)
}
str= "Select Objects";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
else if(event==2) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_deselect_cb);
str= "Deselect Objects";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
else if(event==4) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_delete_cb);
DAG_scene_sort(bmain, scene);
str= "Delete Objects";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene);
}
- else if(event==5) { /* disabled, see above (ton) */
+ else if(event==5) { /* disabled, see above enum (ton) */
outliner_do_object_operation(C, scene, soops, &soops->tree, id_local_cb);
str= "Localized Objects";
}
else if(event==6) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_visibility_cb);
str= "Toggle Visibility";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_VISIBLE, scene);
}
else if(event==7) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_selectability_cb);
str= "Toggle Selectability";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
else if(event==8) {
outliner_do_object_operation(C, scene, soops, &soops->tree, object_toggle_renderability_cb);
str= "Toggle Renderability";
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_RENDER, scene);
}
-
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
ED_undo_push(C, str);
@@ -3677,7 +3776,7 @@ static int do_outliner_operation_event(bContext *C, Scene *scene, ARegion *ar, S
}
-static int outliner_operation(bContext *C, wmOperator *op, wmEvent *event)
+static int outliner_operation(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
@@ -3699,6 +3798,7 @@ void OUTLINER_OT_operation(wmOperatorType *ot)
{
ot->name= "Execute Operation";
ot->idname= "OUTLINER_OT_operation";
+ ot->description= "Context menu for item operations";
ot->invoke= outliner_operation;
@@ -3727,7 +3827,7 @@ static int ed_operator_outliner_datablocks_active(bContext *C)
* this function does not do that yet
*/
static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreElem *tselem,
- ID **id, char **path, int *array_index, short *flag, short *groupmode)
+ ID **id, char **path, int *array_index, short *flag, short *UNUSED(groupmode))
{
ListBase hierarchy = {NULL, NULL};
LinkData *ld;
@@ -3865,12 +3965,12 @@ static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreEle
enum {
DRIVERS_EDITMODE_ADD = 0,
DRIVERS_EDITMODE_REMOVE,
-} eDrivers_EditModes;
+} /*eDrivers_EditModes*/;
/* Utilities ---------------------------------- */
/* Recursively iterate over tree, finding and working on selected items */
-static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short mode)
+static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, ReportList *reports, short mode)
{
TreeElement *te;
TreeStoreElem *tselem;
@@ -3895,6 +3995,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
/* only if ID and path were set, should we perform any actions */
if (id && path) {
+ short dflags = CREATEDRIVER_WITH_DEFAULT_DVAR;
int arraylen = 1;
/* array checks */
@@ -3916,13 +4017,13 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
case DRIVERS_EDITMODE_ADD:
{
/* add a new driver with the information obtained (only if valid) */
- ANIM_add_driver(id, path, array_index, flag, DRIVER_TYPE_PYTHON);
+ ANIM_add_driver(reports, id, path, array_index, dflags, DRIVER_TYPE_PYTHON);
}
break;
case DRIVERS_EDITMODE_REMOVE:
{
/* remove driver matching the information obtained (only if valid) */
- ANIM_remove_driver(id, path, array_index, flag);
+ ANIM_remove_driver(reports, id, path, array_index, dflags);
}
break;
}
@@ -3937,7 +4038,7 @@ static void do_outliner_drivers_editop(SpaceOops *soops, ListBase *tree, short m
/* go over sub-tree */
if ((tselem->flag & TSE_CLOSED)==0)
- do_outliner_drivers_editop(soops, &te->subtree, mode);
+ do_outliner_drivers_editop(soops, &te->subtree, reports, mode);
}
}
@@ -3952,10 +4053,10 @@ static int outliner_drivers_addsel_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* recursively go into tree, adding selected items */
- do_outliner_drivers_editop(soutliner, &soutliner->tree, DRIVERS_EDITMODE_ADD);
+ do_outliner_drivers_editop(soutliner, &soutliner->tree, op->reports, DRIVERS_EDITMODE_ADD);
/* send notifiers */
- WM_event_add_notifier(C, ND_KEYS, NULL); // XXX
+ WM_event_add_notifier(C, NC_ANIMATION|ND_FCURVES_ORDER, NULL); // XXX
return OPERATOR_FINISHED;
}
@@ -3972,7 +4073,7 @@ void OUTLINER_OT_drivers_add_selected(wmOperatorType *ot)
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
@@ -3987,7 +4088,7 @@ static int outliner_drivers_deletesel_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
/* recursively go into tree, adding selected items */
- do_outliner_drivers_editop(soutliner, &soutliner->tree, DRIVERS_EDITMODE_REMOVE);
+ do_outliner_drivers_editop(soutliner, &soutliner->tree, op->reports, DRIVERS_EDITMODE_REMOVE);
/* send notifiers */
WM_event_add_notifier(C, ND_KEYS, NULL); // XXX
@@ -4007,7 +4108,7 @@ void OUTLINER_OT_drivers_delete_selected(wmOperatorType *ot)
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* ***************** KEYINGSET OPERATIONS *************** */
@@ -4018,7 +4119,7 @@ void OUTLINER_OT_drivers_delete_selected(wmOperatorType *ot)
enum {
KEYINGSET_EDITMODE_ADD = 0,
KEYINGSET_EDITMODE_REMOVE,
-} eKeyingSet_EditModes;
+} /*eKeyingSet_EditModes*/;
/* Utilities ---------------------------------- */
@@ -4089,12 +4190,9 @@ static void do_outliner_keyingset_editop(SpaceOops *soops, KeyingSet *ks, ListBa
if (ksp) {
/* free path's data */
- // TODO: we probably need an API method for this
- if (ksp->rna_path) MEM_freeN(ksp->rna_path);
+ BKE_keyingset_free_path(ks, ksp);
+
ks->active_path= 0;
-
- /* remove path from set */
- BLI_freelinkN(&ks->paths, ksp);
}
}
break;
@@ -4140,20 +4238,21 @@ void OUTLINER_OT_keyingset_add_selected(wmOperatorType *ot)
{
/* identifiers */
ot->idname= "OUTLINER_OT_keyingset_add_selected";
- ot->name= "Keyingset Add Selected";
+ ot->name= "Keying Set Add Selected";
+ ot->description= "Add selected items (blue-grey rows) to active Keying Set";
/* api callbacks */
ot->exec= outliner_keyingset_additems_exec;
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* Remove Operator ---------------------------------- */
-static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *op)
+static int outliner_keyingset_removeitems_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceOops *soutliner= CTX_wm_space_outliner(C);
Scene *scene= CTX_data_scene(C);
@@ -4176,14 +4275,15 @@ void OUTLINER_OT_keyingset_remove_selected(wmOperatorType *ot)
{
/* identifiers */
ot->idname= "OUTLINER_OT_keyingset_remove_selected";
- ot->name= "Keyingset Remove Selected";
+ ot->name= "Keying Set Remove Selected";
+ ot->description = "Remove selected items (blue-grey rows) from active Keying Set";
/* api callbacks */
ot->exec= outliner_keyingset_removeitems_exec;
ot->poll= ed_operator_outliner_datablocks_active;
/* flags */
- ot->flag = OPTYPE_UNDO;
+ ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* ***************** DRAW *************** */
@@ -4474,7 +4574,6 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa
if(level<1 || (tselem->type==0 && te->idcode==ID_OB)) {
/* active blocks get white circle */
- active= 0;
if(tselem->type==0) {
if(te->idcode==ID_OB) active= (OBACT==(Object *)tselem->id);
else if(scene->obedit && scene->obedit->data==tselem->id) active= 1; // XXX use context?
@@ -4505,6 +4604,21 @@ static void outliner_draw_iconrow(bContext *C, uiBlock *block, Scene *scene, Spa
}
+/* closed tree element */
+static void outliner_set_coord_tree_element(SpaceOops *soops, TreeElement *te, int startx, int *starty)
+{
+ TreeElement *ten;
+
+ /* store coord and continue, we need coordinates for elements outside view too */
+ te->xs= (float)startx;
+ te->ys= (float)(*starty);
+
+ for(ten= te->subtree.first; ten; ten= ten->next) {
+ outliner_set_coord_tree_element(soops, ten, startx+OL_X, starty);
+ }
+}
+
+
static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene, ARegion *ar, SpaceOops *soops, TreeElement *te, int startx, int *starty)
{
TreeElement *ten;
@@ -4659,13 +4773,18 @@ static void outliner_draw_tree_element(bContext *C, uiBlock *block, Scene *scene
te->ys= (float)*starty;
te->xend= startx+offsx;
- *starty-= OL_H;
-
if((tselem->flag & TSE_CLOSED)==0) {
- for(ten= te->subtree.first; ten; ten= ten->next) {
+ *starty-= OL_H;
+
+ for(ten= te->subtree.first; ten; ten= ten->next)
outliner_draw_tree_element(C, block, scene, ar, soops, ten, startx+OL_X, starty);
- }
}
+ else {
+ for(ten= te->subtree.first; ten; ten= ten->next)
+ outliner_set_coord_tree_element(soops, te, startx, starty);
+
+ *starty-= OL_H;
+ }
}
static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, int *starty)
@@ -4779,7 +4898,7 @@ static void outliner_draw_tree(bContext *C, uiBlock *block, Scene *scene, ARegio
}
-static void outliner_back(ARegion *ar, SpaceOops *soops)
+static void outliner_back(ARegion *ar)
{
int ystart;
@@ -4793,7 +4912,7 @@ static void outliner_back(ARegion *ar, SpaceOops *soops)
}
}
-static void outliner_draw_restrictcols(ARegion *ar, SpaceOops *soops)
+static void outliner_draw_restrictcols(ARegion *ar)
{
int ystart;
@@ -4835,16 +4954,8 @@ static void restrictbutton_view_cb(bContext *C, void *poin, void *poin2)
{
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
- Object *obedit= CTX_data_edit_object(C);
- /* Don't allow hide an objet in edit mode,
- * check the bug #22153 and #21609
- */
- if (obedit && obedit == ob) {
- if (ob->restrictflag & OB_RESTRICT_VIEW)
- ob->restrictflag &= ~OB_RESTRICT_VIEW;
- return;
- }
+ if(!common_restrict_check(C, ob)) return;
/* deselect objects that are invisible */
if (ob->restrictflag & OB_RESTRICT_VIEW) {
@@ -4861,6 +4972,8 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
Scene *scene = (Scene *)poin;
Object *ob = (Object *)poin2;
+ if(!common_restrict_check(C, ob)) return;
+
/* if select restriction has just been turned on */
if (ob->restrictflag & OB_RESTRICT_SELECT) {
/* Ouch! There is no backwards pointer from Object to Base,
@@ -4871,26 +4984,26 @@ static void restrictbutton_sel_cb(bContext *C, void *poin, void *poin2)
}
-static void restrictbutton_rend_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_rend_cb(bContext *C, void *poin, void *UNUSED(poin2))
{
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, poin);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_RENDER, poin);
}
-static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_r_lay_cb(bContext *C, void *poin, void *UNUSED(poin2))
{
WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, poin);
}
-static void restrictbutton_modifier_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_modifier_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
Object *ob = (Object *)poin2;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
-static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_bone_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
Bone *bone= (Bone *)poin2;
if(bone && (bone->flag & BONE_HIDDEN_P))
@@ -4898,7 +5011,7 @@ static void restrictbutton_bone_cb(bContext *C, void *poin, void *poin2)
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
}
-static void restrictbutton_ebone_cb(bContext *C, void *poin, void *poin2)
+static void restrictbutton_ebone_cb(bContext *C, void *UNUSED(poin), void *poin2)
{
EditBone *ebone= (EditBone *)poin2;
if(ebone && (ebone->flag & BONE_HIDDEN_A))
@@ -4930,7 +5043,7 @@ static int group_select_flag(Group *gr)
return 0;
}
-static void restrictbutton_gr_restrict_flag(bContext *C, void *poin, void *poin2, int flag)
+static void restrictbutton_gr_restrict_flag(void *poin, void *poin2, int flag)
{
Scene *scene = (Scene *)poin;
GroupObject *gob;
@@ -4947,28 +5060,31 @@ static void restrictbutton_gr_restrict_flag(bContext *C, void *poin, void *poin2
}
else {
for(gob= gr->gobject.first; gob; gob= gob->next) {
- gob->ob->restrictflag |= flag;
+ /* not in editmode */
+ if(scene->obedit!=gob->ob) {
+ gob->ob->restrictflag |= flag;
- if(flag==OB_RESTRICT_VIEW)
- if((gob->ob->flag & SELECT) == 0)
- ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT);
+ if(flag==OB_RESTRICT_VIEW)
+ if((gob->ob->flag & SELECT) == 0)
+ ED_base_object_select(object_in_scene(gob->ob, scene), BA_SELECT);
+ }
}
}
}
static void restrictbutton_gr_restrict_view(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_VIEW);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_VIEW);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
static void restrictbutton_gr_restrict_select(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_SELECT);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_SELECT);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
static void restrictbutton_gr_restrict_render(bContext *C, void *poin, void *poin2)
{
- restrictbutton_gr_restrict_flag(C, poin, poin2, OB_RESTRICT_RENDER);
+ restrictbutton_gr_restrict_flag(poin, poin2, OB_RESTRICT_RENDER);
WM_event_add_notifier(C, NC_GROUP, NULL);
}
@@ -5003,7 +5119,7 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
if (te->idcode == ID_LI) {
char expanded[FILE_MAXDIR + FILE_MAXFILE];
BLI_strncpy(expanded, ((Library *)tselem->id)->name, FILE_MAXDIR + FILE_MAXFILE);
- BLI_path_abs(expanded, G.sce);
+ BLI_path_abs(expanded, G.main->name);
if (!BLI_exists(expanded)) {
error("This path does not exist, correct this before saving");
}
@@ -5022,11 +5138,11 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
bArmature *arm= (bArmature *)tselem->id;
if(arm->edbo) {
EditBone *ebone= te->directdata;
- char newname[32];
+ char newname[sizeof(ebone->name)];
/* restore bone name */
- BLI_strncpy(newname, ebone->name, 32);
- BLI_strncpy(ebone->name, oldname, 32);
+ BLI_strncpy(newname, ebone->name, sizeof(ebone->name));
+ BLI_strncpy(ebone->name, oldname, sizeof(ebone->name));
ED_armature_bone_rename(obedit->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, OBACT);
}
@@ -5037,15 +5153,15 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
{
Bone *bone= te->directdata;
Object *ob;
- char newname[32];
+ char newname[sizeof(bone->name)];
// always make current object active
tree_element_set_active_object(C, scene, soops, te, 1);
ob= OBACT;
/* restore bone name */
- BLI_strncpy(newname, bone->name, 32);
- BLI_strncpy(bone->name, oldname, 32);
+ BLI_strncpy(newname, bone->name, sizeof(bone->name));
+ BLI_strncpy(bone->name, oldname, sizeof(bone->name));
ED_armature_bone_rename(ob->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
@@ -5054,15 +5170,15 @@ static void namebutton_cb(bContext *C, void *tsep, char *oldname)
{
bPoseChannel *pchan= te->directdata;
Object *ob;
- char newname[32];
+ char newname[sizeof(pchan->name)];
// always make current object active
tree_element_set_active_object(C, scene, soops, te, 1);
ob= OBACT;
/* restore bone name */
- BLI_strncpy(newname, pchan->name, 32);
- BLI_strncpy(pchan->name, oldname, 32);
+ BLI_strncpy(newname, pchan->name, sizeof(pchan->name));
+ BLI_strncpy(pchan->name, oldname, sizeof(pchan->name));
ED_armature_bone_rename(ob->data, oldname, newname);
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
}
@@ -5104,17 +5220,17 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1,
&ptr, "hide", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_view_cb, scene, ob);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1,
&ptr, "hide_select", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_sel_cb, scene, ob);
bt= uiDefIconButR(block, ICONTOG, 0, ICON_RESTRICT_RENDER_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1,
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1,
&ptr, "hide_render", -1, 0, 0, -1, -1, NULL);
uiButSetFunc(bt, restrictbutton_rend_cb, scene, ob);
@@ -5128,15 +5244,15 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_VIEW);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_view, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_SELECT);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_select, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_RENDER);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_gr_restrict_render, scene, gr);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5146,7 +5262,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, 0, ICON_CHECKBOX_HLT-1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5159,13 +5275,13 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
bt= uiDefIconButBitI(block, ICONTOG, passflag, 0, ICON_CHECKBOX_HLT-1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
layflag++; /* is lay_xor */
if(ELEM8(passflag, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_INDIRECT, SCE_PASS_EMIT, SCE_PASS_ENVIRONMENT))
bt= uiDefIconButBitI(block, TOG, passflag, 0, (*layflag & passflag)?ICON_DOT:ICON_BLANK1,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
uiButSetFunc(bt, restrictbutton_r_lay_cb, tselem->id, NULL);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5176,11 +5292,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Realtime, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_modifier_cb, scene, ob);
bt= uiDefIconButBitI(block, ICONTOGN, eModifierMode_Render, 0, ICON_RESTRICT_RENDER_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (short)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, &(md->mode), 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_modifier_cb, scene, ob);
}
else if(tselem->type==TSE_POSE_CHANNEL) {
@@ -5189,11 +5305,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_P, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, bone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, &(bone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_bone_cb, NULL, NULL);
}
else if(tselem->type==TSE_EBONE) {
@@ -5201,11 +5317,11 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
bt= uiDefIconButBitI(block, ICONTOG, BONE_HIDDEN_A, 0, ICON_RESTRICT_VIEW_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, ebone);
bt= uiDefIconButBitI(block, ICONTOG, BONE_UNSELECTABLE, 0, ICON_RESTRICT_SELECT_OFF,
- (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (short)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, &(ebone->flag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_ebone_cb, NULL, NULL);
}
}
@@ -5214,10 +5330,10 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
}
}
-static void outliner_draw_rnacols(ARegion *ar, SpaceOops *soops, int sizex)
+static void outliner_draw_rnacols(ARegion *ar, int sizex)
{
View2D *v2d= &ar->v2d;
-
+
float miny = v2d->cur.ymin-V2D_SCROLL_HEIGHT;
if(miny<v2d->tot.ymin) miny = v2d->tot.ymin;
@@ -5252,13 +5368,13 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
prop= te->directdata;
if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
- uiDefAutoButR(block, ptr, prop, -1, "", 0, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
ptr= &te->rnaptr;
prop= te->directdata;
- uiDefAutoButR(block, ptr, prop, te->index, "", 0, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, te->index, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
}
@@ -5266,7 +5382,7 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
}
}
-static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
+static void operator_call_cb(struct bContext *UNUSED(C), void *arg_kmi, void *arg2)
{
wmOperatorType *ot= arg2;
wmKeyMapItem *kmi= arg_kmi;
@@ -5275,7 +5391,7 @@ static void operator_call_cb(struct bContext *C, void *arg_kmi, void *arg2)
BLI_strncpy(kmi->idname, ot->idname, OP_MAX_TYPENAME);
}
-static void operator_search_cb(const struct bContext *C, void *arg_kmi, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *UNUSED(C), void *UNUSED(arg_kmi), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -5344,89 +5460,79 @@ static short keymap_menu_type(short type)
return 0;
}
-static char *keymap_type_menu(void)
+static const char *keymap_type_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Event Type %%t");
-
- str += sprintf(str, formatstr, "Keyboard", OL_KM_KEYBOARD);
- str += sprintf(str, formatstr, "Mouse", OL_KM_MOUSE);
- str += sprintf(str, formatstr, "Tweak", OL_KM_TWEAK);
-// str += sprintf(str, formatstr, "Specials", OL_KM_SPECIALS);
-
+ static const char string[]=
+ "Event Type%t"
+ "|Keyboard%x" STRINGIFY(OL_KM_KEYBOARD)
+ "|Mouse%x" STRINGIFY(OL_KM_MOUSE)
+ "|Tweak%x" STRINGIFY(OL_KM_TWEAK)
+// "|Specials%x" STRINGIFY(OL_KM_SPECIALS)
+ ;
+
return string;
-}
-
-static char *keymap_mouse_menu(void)
-{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Mouse Event %%t");
-
- str += sprintf(str, formatstr, "Left Mouse", LEFTMOUSE);
- str += sprintf(str, formatstr, "Middle Mouse", MIDDLEMOUSE);
- str += sprintf(str, formatstr, "Right Mouse", RIGHTMOUSE);
- str += sprintf(str, formatstr, "Button4 Mouse ", BUTTON4MOUSE);
- str += sprintf(str, formatstr, "Button5 Mouse ", BUTTON5MOUSE);
- str += sprintf(str, formatstr, "Action Mouse", ACTIONMOUSE);
- str += sprintf(str, formatstr, "Select Mouse", SELECTMOUSE);
- str += sprintf(str, formatstr, "Mouse Move", MOUSEMOVE);
- str += sprintf(str, formatstr, "Wheel Up", WHEELUPMOUSE);
- str += sprintf(str, formatstr, "Wheel Down", WHEELDOWNMOUSE);
- str += sprintf(str, formatstr, "Wheel In", WHEELINMOUSE);
- str += sprintf(str, formatstr, "Wheel Out", WHEELOUTMOUSE);
- str += sprintf(str, formatstr, "Mouse/Trackpad Pan", MOUSEPAN);
- str += sprintf(str, formatstr, "Mouse/Trackpad Zoom", MOUSEZOOM);
- str += sprintf(str, formatstr, "Mouse/Trackpad Rotate", MOUSEROTATE);
-
+}
+
+static const char *keymap_mouse_menu(void)
+{
+ static const char string[]=
+ "Mouse Event%t"
+ "|Left Mouse%x" STRINGIFY(LEFTMOUSE)
+ "|Middle Mouse%x" STRINGIFY(MIDDLEMOUSE)
+ "|Right Mouse%x" STRINGIFY(RIGHTMOUSE)
+ "|Middle Mouse%x" STRINGIFY(MIDDLEMOUSE)
+ "|Right Mouse%x" STRINGIFY(RIGHTMOUSE)
+ "|Button4 Mouse%x" STRINGIFY(BUTTON4MOUSE)
+ "|Button5 Mouse%x" STRINGIFY(BUTTON5MOUSE)
+ "|Action Mouse%x" STRINGIFY(ACTIONMOUSE)
+ "|Select Mouse%x" STRINGIFY(SELECTMOUSE)
+ "|Mouse Move%x" STRINGIFY(MOUSEMOVE)
+ "|Wheel Up%x" STRINGIFY(WHEELUPMOUSE)
+ "|Wheel Down%x" STRINGIFY(WHEELDOWNMOUSE)
+ "|Wheel In%x" STRINGIFY(WHEELINMOUSE)
+ "|Wheel Out%x" STRINGIFY(WHEELOUTMOUSE)
+ "|Mouse/Trackpad Pan%x" STRINGIFY(MOUSEPAN)
+ "|Mouse/Trackpad Zoom%x" STRINGIFY(MOUSEZOOM)
+ "|Mouse/Trackpad Rotate%x" STRINGIFY(MOUSEROTATE)
+ ;
+
return string;
}
-static char *keymap_tweak_menu(void)
+static const char *keymap_tweak_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Tweak Event %%t");
-
- str += sprintf(str, formatstr, "Left Mouse", EVT_TWEAK_L);
- str += sprintf(str, formatstr, "Middle Mouse", EVT_TWEAK_M);
- str += sprintf(str, formatstr, "Right Mouse", EVT_TWEAK_R);
- str += sprintf(str, formatstr, "Action Mouse", EVT_TWEAK_A);
- str += sprintf(str, formatstr, "Select Mouse", EVT_TWEAK_S);
-
+ static const char string[]=
+ "Tweak Event%t"
+ "|Left Mouse%x" STRINGIFY(EVT_TWEAK_L)
+ "|Middle Mouse%x" STRINGIFY(EVT_TWEAK_M)
+ "|Right Mouse%x" STRINGIFY(EVT_TWEAK_R)
+ "|Action Mouse%x" STRINGIFY(EVT_TWEAK_A)
+ "|Select Mouse%x" STRINGIFY(EVT_TWEAK_S)
+ ;
+
return string;
}
-static char *keymap_tweak_dir_menu(void)
+static const char *keymap_tweak_dir_menu(void)
{
- static char string[500];
- static char formatstr[] = "|%s %%x%d";
- char *str= string;
-
- str += sprintf(str, "Tweak Direction %%t");
-
- str += sprintf(str, formatstr, "Any", KM_ANY);
- str += sprintf(str, formatstr, "North", EVT_GESTURE_N);
- str += sprintf(str, formatstr, "North-East", EVT_GESTURE_NE);
- str += sprintf(str, formatstr, "East", EVT_GESTURE_E);
- str += sprintf(str, formatstr, "Sout-East", EVT_GESTURE_SE);
- str += sprintf(str, formatstr, "South", EVT_GESTURE_S);
- str += sprintf(str, formatstr, "South-West", EVT_GESTURE_SW);
- str += sprintf(str, formatstr, "West", EVT_GESTURE_W);
- str += sprintf(str, formatstr, "North-West", EVT_GESTURE_NW);
-
+ static const char string[]=
+ "Tweak Direction%t"
+ "|Any%x" STRINGIFY(KM_ANY)
+ "|North%x" STRINGIFY(EVT_GESTURE_N)
+ "|North-East%x" STRINGIFY(EVT_GESTURE_NE)
+ "|East%x" STRINGIFY(EVT_GESTURE_E)
+ "|Sout-East%x" STRINGIFY(EVT_GESTURE_SE)
+ "|South%x" STRINGIFY(EVT_GESTURE_S)
+ "|South-West%x" STRINGIFY(EVT_GESTURE_SW)
+ "|West%x" STRINGIFY(EVT_GESTURE_W)
+ "|North-West%x" STRINGIFY(EVT_GESTURE_NW)
+ ;
+
return string;
}
-static void keymap_type_cb(bContext *C, void *kmi_v, void *unused_v)
+static void keymap_type_cb(bContext *C, void *kmi_v, void *UNUSED(arg_v))
{
wmKeyMapItem *kmi= kmi_v;
short maptype= keymap_menu_type(kmi->type);
@@ -5464,7 +5570,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
tselem= TREESTORE(te);
if(te->ys+2*OL_H >= ar->v2d.cur.ymin && te->ys <= ar->v2d.cur.ymax) {
uiBut *but;
- char *str;
+ const char *str;
int xstart= 240;
int butw1= 20; /* operator */
int butw2= 90; /* event type, menus */
@@ -5513,7 +5619,7 @@ static void outliner_draw_keymapbuts(uiBlock *block, ARegion *ar, SpaceOops *soo
uiDefButS(block, OPTION, 0, "Shift", xstart, (int)te->ys+1, butw3+5, OL_H-1, &kmi->shift, 0, 0, 0, 0, "Modifier"); xstart+= butw3+5;
uiDefButS(block, OPTION, 0, "Ctrl", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->ctrl, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
uiDefButS(block, OPTION, 0, "Alt", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->alt, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
- uiDefButS(block, OPTION, 0, "Cmd", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->oskey, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
+ uiDefButS(block, OPTION, 0, "OS", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->oskey, 0, 0, 0, 0, "Modifier"); xstart+= butw3;
xstart+= 5;
uiDefKeyevtButS(block, 0, "", xstart, (int)te->ys+1, butw3, OL_H-1, &kmi->keymodifier, "Key Modifier code");
xstart+= butw3+5;
@@ -5559,8 +5665,8 @@ static void outliner_buttons(const bContext *C, uiBlock *block, ARegion *ar, Spa
if(dx<100) dx= 100;
spx=te->xs+2*OL_X-4;
if(spx+dx+10>ar->v2d.cur.xmax) dx = ar->v2d.cur.xmax-spx-10;
-
- bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", spx, (short)te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
+
+ bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "", spx, (int)te->ys, dx+10, OL_H-1, (void *)te->name, 1.0, (float)len, 0, 0, "");
uiButSetRenameFunc(bt, namebutton_cb, tselem);
/* returns false if button got removed */
@@ -5627,17 +5733,19 @@ void draw_outliner(const bContext *C)
/* update size of tot-rect (extents of data/viewable area) */
UI_view2d_totRect_set(v2d, sizex, sizey);
+ /* force display to pixel coords */
+ v2d->flag |= (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
/* set matrix for 2d-view controls */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* draw outliner stuff (background, hierachy lines and names) */
- outliner_back(ar, soops);
+ outliner_back(ar);
block= uiBeginBlock(C, ar, "outliner buttons", UI_EMBOSS);
outliner_draw_tree((bContext *)C, block, scene, ar, soops);
if(ELEM(soops->outlinevis, SO_DATABLOCKS, SO_USERDEF)) {
/* draw rna buttons */
- outliner_draw_rnacols(ar, soops, sizex_rna);
+ outliner_draw_rnacols(ar, sizex_rna);
outliner_draw_rnabuts(block, scene, ar, soops, sizex_rna, &soops->tree);
}
else if(soops->outlinevis == SO_KEYMAP) {
@@ -5645,10 +5753,13 @@ void draw_outliner(const bContext *C)
}
else if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
/* draw restriction columns */
- outliner_draw_restrictcols(ar, soops);
+ outliner_draw_restrictcols(ar);
outliner_draw_restrictbuts(block, scene, ar, soops, &soops->tree);
}
-
+
+ /* draw edit buttons if nessecery */
+ outliner_buttons(C, block, ar, soops, &soops->tree);
+
/* draw edit buttons if nessecery */
outliner_buttons(C, block, ar, soops, &soops->tree);
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index fa3078a365b..5f9165a6a31 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -49,7 +49,7 @@ typedef struct TreeElement {
short index; // index for data arrays
short idcode; // from TreeStore id
short xend; // width of item display, for select
- char *name;
+ const char *name;
void *directdata; // Armature Bones, Base, Sequence, Strip...
PointerRNA rnaptr; // RNA Pointer
} TreeElement;
@@ -131,6 +131,8 @@ void OUTLINER_OT_show_hierarchy(struct wmOperatorType *ot);
void OUTLINER_OT_selected_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_expanded_toggle(struct wmOperatorType *ot);
+void OUTLINER_OT_scroll_page(struct wmOperatorType *ot);
+
void OUTLINER_OT_renderability_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_selectability_toggle(struct wmOperatorType *ot);
void OUTLINER_OT_visibility_toggle(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index d23e950a033..da1b831aefc 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -56,6 +56,7 @@ void outliner_operatortypes(void)
WM_operatortype_append(OUTLINER_OT_show_one_level);
WM_operatortype_append(OUTLINER_OT_show_active);
WM_operatortype_append(OUTLINER_OT_show_hierarchy);
+ WM_operatortype_append(OUTLINER_OT_scroll_page);
WM_operatortype_append(OUTLINER_OT_selected_toggle);
WM_operatortype_append(OUTLINER_OT_expanded_toggle);
@@ -77,7 +78,7 @@ void outliner_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, 0, 0)->ptr, "extend", 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_RELEASE, 0, 0)->ptr, "extend", 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1);
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0);
@@ -91,6 +92,9 @@ void outliner_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PERIODKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEDOWNKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "up", 1);
+
WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADPLUSKEY, KM_PRESS, 0, 0); /* open */
RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0)->ptr, "open", 0); /* close */
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index d3db64d6d03..a4900eb919b 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,16 +29,17 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "WM_api.h"
@@ -60,7 +61,8 @@ static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar)
/* own keymap */
keymap= WM_keymap_find(wm->defaultconf, "Outliner", SPACE_OUTLINER, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+ /* don't pass on view2d mask, it's always set with scrollbar space, hide fails */
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, NULL, &ar->winrct);
}
static void outliner_main_area_draw(const bContext *C, ARegion *ar)
@@ -84,11 +86,11 @@ static void outliner_main_area_draw(const bContext *C, ARegion *ar)
}
-static void outliner_main_area_free(ARegion *ar)
+static void outliner_main_area_free(ARegion *UNUSED(ar))
{
+
}
-
static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
/* context changes */
@@ -97,11 +99,14 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
switch(wmn->data) {
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
+ case ND_OB_RENDER:
case ND_MODE:
case ND_KEYINGSET:
case ND_FRAME:
case ND_RENDER_OPTIONS:
case ND_LAYER:
+ case ND_WORLD:
ED_region_tag_redraw(ar);
break;
}
@@ -113,13 +118,26 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
break;
case ND_BONE_ACTIVE:
case ND_BONE_SELECT:
+ case ND_DRAW:
+ case ND_PARENT:
+ case ND_OB_SHADING:
ED_region_tag_redraw(ar);
break;
+ case ND_CONSTRAINT:
+ switch(wmn->action) {
+ case NA_ADDED:
+ case NA_REMOVED:
+ case NA_RENAME:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
case ND_MODIFIER:
- if(wmn->action == NA_RENAME)
- ED_region_tag_redraw(ar);
+ /* all modifier actions now */
+ ED_region_tag_redraw(ar);
break;
}
+ break;
case NC_GROUP:
/* all actions now, todo: check outliner view mode? */
ED_region_tag_redraw(ar);
@@ -137,6 +155,25 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
if(wmn->action == NA_RENAME)
ED_region_tag_redraw(ar);
break;
+ case NC_MATERIAL:
+ switch(wmn->data) {
+ case ND_SHADING:
+ case ND_SHADING_DRAW:
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
+ case NC_TEXTURE:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_GEOM:
+ switch(wmn->data) {
+ case ND_DATA:
+ /* needed for vertex groups only, no special notifier atm so use NC_GEOM|ND_DATA */
+ ED_region_tag_redraw(ar);
+ break;
+ }
+ break;
}
}
@@ -145,7 +182,7 @@ static void outliner_main_area_listener(ARegion *ar, wmNotifier *wmn)
/* ************************ header outliner area region *********************** */
/* add handlers, stuff you only do once or on area/region changes */
-static void outliner_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void outliner_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -155,7 +192,7 @@ static void outliner_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void outliner_header_area_free(ARegion *ar)
+static void outliner_header_area_free(ARegion *UNUSED(ar))
{
}
@@ -176,7 +213,7 @@ static void outliner_header_area_listener(ARegion *ar, wmNotifier *wmn)
/* ******************** default callbacks for outliner space ***************** */
-static SpaceLink *outliner_new(const bContext *C)
+static SpaceLink *outliner_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceOops *soutliner;
@@ -220,7 +257,7 @@ static void outliner_free(SpaceLink *sl)
}
/* spacetype; init callback */
-static void outliner_init(wmWindowManager *wm, ScrArea *sa)
+static void outliner_init(wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt
index 58b3affe2d4..165a43568e4 100644
--- a/source/blender/editors/space_script/CMakeLists.txt
+++ b/source/blender/editors/space_script/CMakeLists.txt
@@ -19,22 +19,29 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ script_edit.c
+ script_header.c
+ script_ops.c
+ space_script.c
+
+ script_intern.h
)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC} ../../python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ list(APPEND INC ${PYTHON_INCLUDE_DIRS} ../../python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_space_script "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_script "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_script/Makefile b/source/blender/editors/space_script/Makefile
deleted file mode 100644
index 35462b8c255..00000000000
--- a/source/blender/editors/space_script/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_script
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_script/SConscript b/source/blender/editors/space_script/SConscript
index a78f1a66762..c30e204f6f4 100644
--- a/source/blender/editors/space_script/SConscript
+++ b/source/blender/editors/space_script/SConscript
@@ -5,12 +5,12 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../../blenloader'
incs += ' ../../python'
defs = []
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_script', sources, Split(incs), defs, libtype=['core'], priority=[90] )
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 610fecaa543..aff9774b2a9 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,9 +29,8 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -46,20 +45,22 @@
#include "script_intern.h" // own include
-#ifndef DISABLE_PYTHON
-#include "BPY_extern.h" /* BPY_run_python_script */
+#ifdef WITH_PYTHON
+#include "BPY_extern.h" /* BPY_script_exec */
#endif
static int run_pyfile_exec(bContext *C, wmOperator *op)
{
char path[512];
RNA_string_get(op->ptr, "filepath", path);
-#ifndef DISABLE_PYTHON
- if(BPY_run_python_script(C, path, NULL, op->reports)) {
+#ifdef WITH_PYTHON
+ if(BPY_filepath_exec(C, path, op->reports)) {
ARegion *ar= CTX_wm_region(C);
ED_region_tag_redraw(ar);
return OPERATOR_FINISHED;
}
+#else
+ (void)C; /* unused */
#endif
return OPERATOR_CANCELLED; /* FAIL */
}
@@ -80,15 +81,18 @@ void SCRIPT_OT_python_file_run(wmOperatorType *ot)
}
-static int script_reload_exec(bContext *C, wmOperator *op)
+static int script_reload_exec(bContext *C, wmOperator *UNUSED(op))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* TODO, this crashes on netrender and keying sets, need to look into why
* disable for now unless running in debug mode */
WM_cursor_wait(1);
- BPY_eval_string(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
+ BPY_string_exec(C, "__import__('bpy').utils.load_scripts(reload_scripts=True)");
WM_cursor_wait(0);
+ WM_event_add_notifier(C, NC_WINDOW, NULL);
return OPERATOR_FINISHED;
+#else
+ (void)C; /* unused */
#endif
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/space_script/script_header.c b/source/blender/editors/space_script/script_header.c
index 6e65d458451..278b07408cb 100644
--- a/source/blender/editors/space_script/script_header.c
+++ b/source/blender/editors/space_script/script_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,9 +29,9 @@
#include <string.h>
#include <stdio.h>
-
-
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
@@ -39,23 +39,20 @@
#include "ED_types.h"
#include "ED_util.h"
-
-
#include "UI_interface.h"
#include "UI_resources.h"
#include "UI_view2d.h"
#include "script_intern.h"
-
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
ScrArea *curarea= CTX_wm_area(C);
uiBlock *block;
@@ -81,10 +78,10 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_script_buttons(bContext *C, void *arg, int event)
+static void do_script_buttons(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
- switch(event) {
- }
+ //switch(event) {
+ //}
}
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index ed625bb8ec6..28d80b76705 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c
index a52ffbd0808..c0b4979e80e 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c
index f93ddc6efbe..64e0307aec9 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,16 +29,17 @@
#include <string.h>
#include <stdio.h>
-
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -49,7 +50,7 @@
#include "UI_resources.h"
#include "UI_view2d.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -61,7 +62,7 @@
/* ******************** default callbacks for script space ***************** */
-static SpaceLink *script_new(const bContext *C)
+static SpaceLink *script_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceScript *sscript;
@@ -94,7 +95,7 @@ static void script_free(SpaceLink *sl)
{
SpaceScript *sscript= (SpaceScript*) sl;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*free buttons references*/
if (sscript->but_refs) {
// XXX BPy_Set_DrawButtonsList(sscript->but_refs);
@@ -107,7 +108,7 @@ static void script_free(SpaceLink *sl)
/* spacetype; init callback */
-static void script_init(struct wmWindowManager *wm, ScrArea *sa)
+static void script_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -145,16 +146,17 @@ static void script_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
- // BPY_run_python_script(C, "/root/blender-svn/blender25/test.py", NULL);
+ // BPY_script_exec(C, "/root/blender-svn/blender25/test.py", NULL);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (sscript->script) {
- //BPY_run_python_script_space(scpt->script.filename, NULL);
- BPY_run_script_space_draw(C, sscript);
+ // BPY_run_script_space_draw(C, sscript);
}
+#else
+ (void)sscript;
#endif
/* reset view matrix */
@@ -164,7 +166,7 @@ static void script_main_area_draw(const bContext *C, ARegion *ar)
}
/* add handlers, stuff you only do once or on area/region changes */
-static void script_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void script_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -174,7 +176,7 @@ static void script_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void script_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void script_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
// XXX - Todo, need the ScriptSpace accessible to get the python script to run.
diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt
index 383cc05b7f7..d162ac2f4fc 100644
--- a/source/blender/editors/space_sequencer/CMakeLists.txt
+++ b/source/blender/editors/space_sequencer/CMakeLists.txt
@@ -19,18 +19,30 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../imbuf
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
../../../../intern/audaspace/intern
)
-BLENDERLIB(bf_editor_space_sequencer "${SRC}" "${INC}")
+set(SRC
+ sequencer_add.c
+ sequencer_buttons.c
+ sequencer_draw.c
+ sequencer_edit.c
+ sequencer_ops.c
+ sequencer_scopes.c
+ sequencer_select.c
+ space_sequencer.c
+
+ sequencer_intern.h
+)
+
+blender_add_lib(bf_editor_space_sequencer "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_sequencer/Makefile b/source/blender/editors/space_sequencer/Makefile
deleted file mode 100644
index bd2b837d499..00000000000
--- a/source/blender/editors/space_sequencer/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sequencer
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_sequencer/SConscript b/source/blender/editors/space_sequencer/SConscript
index 7a3fb6982ef..65bbf900556 100644
--- a/source/blender/editors/space_sequencer/SConscript
+++ b/source/blender/editors/space_sequencer/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../blenfont ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../../blenloader'
incs += ' #/intern/audaspace/intern'
env.BlenderLib ( 'bf_editors_space_sequencer', sources, Split(incs), [], libtype=['core'], priority=[100] )
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index e58e2ebb328..9e5f6a1d065 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -40,7 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_storage_types.h"
-
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -73,9 +73,12 @@
/* Generic functions, reused by add strip operators */
/* avoid passing multiple args and be more verbose */
-#define SEQPROP_STARTFRAME 1<<0
-#define SEQPROP_ENDFRAME 1<<1
-#define SEQPROP_FILES 1<<2
+#define SEQPROP_STARTFRAME (1<<0)
+#define SEQPROP_ENDFRAME (1<<1)
+#define SEQPROP_FILES (1<<2)
+#define SEQPROP_NOPATHS (1<<3)
+
+#define SELECT 1
static void sequencer_generic_props__internal(wmOperatorType *ot, int flag)
{
@@ -101,7 +104,7 @@ static void sequencer_generic_invoke_path__internal(bContext *C, wmOperator *op,
if(last_seq && last_seq->strip && SEQ_HAS_PATH(last_seq)) {
char path[sizeof(last_seq->strip->dir)];
BLI_strncpy(path, last_seq->strip->dir, sizeof(path));
- BLI_path_abs(path, G.sce);
+ BLI_path_abs(path, G.main->name);
RNA_string_set(op->ptr, identifier, path);
}
}
@@ -127,12 +130,15 @@ static void sequencer_generic_invoke_xy__internal(bContext *C, wmOperator *op, w
if ((flag & SEQPROP_ENDFRAME) && RNA_property_is_set(op->ptr, "frame_end")==0)
RNA_int_set(op->ptr, "frame_end", (int)mval_v2d[0] + 25); // XXX arbitary but ok for now.
- sequencer_generic_invoke_path__internal(C, op, "filepath");
- sequencer_generic_invoke_path__internal(C, op, "directory");
+ if (!(flag & SEQPROP_NOPATHS)) {
+ sequencer_generic_invoke_path__internal(C, op, "filepath");
+ sequencer_generic_invoke_path__internal(C, op, "directory");
+ }
}
static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op)
{
+ int relative= RNA_struct_find_property(op->ptr, "relative_path") && RNA_boolean_get(op->ptr, "relative_path");
int is_file= -1;
memset(seq_load, 0, sizeof(SeqLoadInfo));
@@ -150,6 +156,10 @@ static void seq_load_operator_info(SeqLoadInfo *seq_load, wmOperator *op)
is_file= 0;
}
+ if((is_file != -1) && relative)
+ BLI_path_rel(seq_load->path, G.main->name);
+
+
if (RNA_struct_find_property(op->ptr, "frame_end")) {
seq_load->end_frame = RNA_int_get(op->ptr, "frame_end");
}
@@ -193,7 +203,6 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
Sequence *seq; /* generic strip vars */
Strip *strip;
- StripElem *se;
int start_frame, channel; /* operator props */
@@ -219,7 +228,7 @@ static int sequencer_add_scene_strip_exec(bContext *C, wmOperator *op)
strip->len = seq->len = sce_seq->r.efra - sce_seq->r.sfra + 1;
strip->us= 1;
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
strcpy(seq->name+2, sce_seq->id.name+2);
seqbase_unique_name_recursive(&ed->seqbase, seq);
@@ -248,6 +257,9 @@ static int sequencer_add_scene_strip_invoke(bContext *C, wmOperator *op, wmEvent
return OPERATOR_CANCELLED;
}
+ if(!RNA_property_is_set(op->ptr, "scene"))
+ return WM_enum_search_invoke(C, op, event);
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
return sequencer_add_scene_strip_exec(C, op);
// needs a menu
@@ -303,7 +315,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
RNA_BEGIN(op->ptr, itemptr, "files") {
RNA_string_get(&itemptr, "name", file_only);
- BLI_join_dirfile(seq_load.path, dir_only, file_only);
+ BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only);
seq= seq_load_func(C, ed->seqbasep, &seq_load);
}
@@ -336,23 +348,23 @@ static int sequencer_add_movie_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_movie_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
- return sequencer_add_movie_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
/* This is for drag and drop */
- if(RNA_property_is_set(op->ptr, "filepath"))
+ if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
return sequencer_add_movie_strip_exec(C, op);
-
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
-
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -391,23 +403,23 @@ static int sequencer_add_sound_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_sound_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath"))
- return sequencer_add_sound_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
-
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
-
+
/* This is for drag and drop */
- if(RNA_property_is_set(op->ptr, "filepath"))
+ if(RNA_collection_length(op->ptr, "files") || RNA_property_is_set(op->ptr, "filepath")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_NOPATHS);
return sequencer_add_sound_strip_exec(C, op);
-
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, 0);
-
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
@@ -495,23 +507,26 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
static int sequencer_add_image_strip_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- if(RNA_collection_length(op->ptr, "files"))
- return sequencer_add_image_strip_exec(C, op);
if(!ED_operator_sequencer_active(C)) {
BKE_report(op->reports, RPT_ERROR, "Sequencer area not active");
return OPERATOR_CANCELLED;
}
- if(!RNA_property_is_set(op->ptr, "relative_path"))
- RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
+ /* drag drop has set the names */
+ if(RNA_collection_length(op->ptr, "files")) {
+ sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME|SEQPROP_NOPATHS);
+ return sequencer_add_image_strip_exec(C, op);
+ }
+
sequencer_generic_invoke_xy__internal(C, op, event, SEQPROP_ENDFRAME);
+
+ if(!RNA_property_is_set(op->ptr, "relative_path"))
+ RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
WM_event_add_fileselect(C, op);
return OPERATOR_RUNNING_MODAL;
-
- //return sequencer_add_image_strip_exec(C, op);
}
@@ -545,13 +560,12 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
Sequence *seq; /* generic strip vars */
Strip *strip;
- StripElem *se;
struct SeqEffectHandle sh;
int start_frame, end_frame, channel, type; /* operator props */
Sequence *seq1, *seq2, *seq3;
- char *error_msg;
+ const char *error_msg;
start_frame= RNA_int_get(op->ptr, "frame_start");
end_frame= RNA_int_get(op->ptr, "frame_end");
@@ -600,7 +614,7 @@ static int sequencer_add_effect_strip_exec(bContext *C, wmOperator *op)
strip->len = seq->len;
strip->us= 1;
if(seq->len>0)
- strip->stripdata= se= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
if (seq->type==SEQ_PLUGIN) {
char path[FILE_MAX];
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index 4394e334614..956dfda1764 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,14 +31,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -47,13 +46,13 @@
#include "sequencer_intern.h"
-static void do_sequencer_panel_events(bContext *C, void *arg, int event)
+static void do_sequencer_panel_events(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static void sequencer_panel_view_properties(const bContext *C, Panel *pa)
+static void sequencer_panel_view_properties(const bContext *UNUSED(C), Panel *pa)
{
uiBlock *block;
@@ -63,7 +62,7 @@ static void sequencer_panel_view_properties(const bContext *C, Panel *pa)
}
-static void sequencer_panel_properties(const bContext *C, Panel *pa)
+static void sequencer_panel_properties(const bContext *UNUSED(C), Panel *pa)
{
uiBlock *block;
@@ -92,7 +91,7 @@ void sequencer_buttons_register(ARegionType *art)
/* **************** operator to open/close properties view ************* */
-static int sequencer_properties(bContext *C, wmOperator *op)
+static int sequencer_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= sequencer_has_buttons_region(sa);
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index afd8895edd9..b344077a69a 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +32,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
@@ -44,7 +45,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_sequencer.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
#include "IMB_imbuf.h"
@@ -63,31 +64,32 @@
/* own include */
#include "sequencer_intern.h"
+
#define SEQ_LEFTHANDLE 1
#define SEQ_RIGHTHANDLE 2
/* Note, Dont use WHILE_SEQ while drawing! - it messes up transform, - Campbell */
+static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2);
-int no_rightbox=0, no_leftbox= 0;
-static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float x2, float y2);
-
-static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
+static void get_seq_color3ubv(Scene *curscene, Sequence *seq, unsigned char col[3])
{
- char blendcol[3];
- float hsv[3], rgb[3];
+ unsigned char blendcol[3];
SolidColorVars *colvars = (SolidColorVars *)seq->effectdata;
switch(seq->type) {
case SEQ_IMAGE:
UI_GetThemeColor3ubv(TH_SEQ_IMAGE, col);
break;
+
case SEQ_META:
UI_GetThemeColor3ubv(TH_SEQ_META, col);
break;
+
case SEQ_MOVIE:
UI_GetThemeColor3ubv(TH_SEQ_MOVIE, col);
break;
+
case SEQ_SCENE:
UI_GetThemeColor3ubv(TH_SEQ_SCENE, col);
@@ -95,24 +97,17 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
UI_GetColorPtrBlendShade3ubv(col, col, col, 1.0, 20);
}
break;
-
+
/* transitions */
case SEQ_CROSS:
case SEQ_GAMCROSS:
case SEQ_WIPE:
- /* slightly offset hue to distinguish different effects */
UI_GetThemeColor3ubv(TH_SEQ_TRANSITION, col);
-
- rgb[0] = col[0]/255.0; rgb[1] = col[1]/255.0; rgb[2] = col[2]/255.0;
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
- if (seq->type == SEQ_CROSS) hsv[0]+= 0.04;
- if (seq->type == SEQ_GAMCROSS) hsv[0]+= 0.08;
- if (seq->type == SEQ_WIPE) hsv[0]+= 0.12;
-
- if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
- hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
- col[0] = (char)(rgb[0]*255); col[1] = (char)(rgb[1]*255); col[2] = (char)(rgb[2]*255);
+
+ /* slightly offset hue to distinguish different effects */
+ if (seq->type == SEQ_CROSS) rgb_byte_set_hue_float_offset(col,0.04);
+ if (seq->type == SEQ_GAMCROSS) rgb_byte_set_hue_float_offset(col,0.08);
+ if (seq->type == SEQ_WIPE) rgb_byte_set_hue_float_offset(col,0.12);
break;
/* effects */
@@ -126,42 +121,37 @@ static void get_seq_color3ubv(Scene *curscene, Sequence *seq, char *col)
case SEQ_OVERDROP:
case SEQ_GLOW:
case SEQ_MULTICAM:
- /* slightly offset hue to distinguish different effects */
UI_GetThemeColor3ubv(TH_SEQ_EFFECT, col);
- rgb[0] = col[0]/255.0; rgb[1] = col[1]/255.0; rgb[2] = col[2]/255.0;
- rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
-
- if (seq->type == SEQ_ADD) hsv[0]+= 0.04;
- if (seq->type == SEQ_SUB) hsv[0]+= 0.08;
- if (seq->type == SEQ_MUL) hsv[0]+= 0.12;
- if (seq->type == SEQ_ALPHAOVER) hsv[0]+= 0.16;
- if (seq->type == SEQ_ALPHAUNDER) hsv[0]+= 0.20;
- if (seq->type == SEQ_OVERDROP) hsv[0]+= 0.24;
- if (seq->type == SEQ_GLOW) hsv[0]+= 0.28;
- if (seq->type == SEQ_TRANSFORM) hsv[0]+= 0.36;
-
- if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
- hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
- col[0] = (char)(rgb[0]*255); col[1] = (char)(rgb[1]*255); col[2] = (char)(rgb[2]*255);
+ /* slightly offset hue to distinguish different effects */
+ if (seq->type == SEQ_ADD) rgb_byte_set_hue_float_offset(col,0.04);
+ if (seq->type == SEQ_SUB) rgb_byte_set_hue_float_offset(col,0.08);
+ if (seq->type == SEQ_MUL) rgb_byte_set_hue_float_offset(col,0.12);
+ if (seq->type == SEQ_ALPHAOVER) rgb_byte_set_hue_float_offset(col,0.16);
+ if (seq->type == SEQ_ALPHAUNDER) rgb_byte_set_hue_float_offset(col,0.20);
+ if (seq->type == SEQ_OVERDROP) rgb_byte_set_hue_float_offset(col,0.24);
+ if (seq->type == SEQ_GLOW) rgb_byte_set_hue_float_offset(col,0.28);
+ if (seq->type == SEQ_TRANSFORM) rgb_byte_set_hue_float_offset(col,0.36);
break;
+
case SEQ_COLOR:
if (colvars->col) {
- col[0]= (char)(colvars->col[0]*255);
- col[1]= (char)(colvars->col[1]*255);
- col[2]= (char)(colvars->col[2]*255);
+ rgb_float_to_byte(colvars->col, col);
} else {
col[0] = col[1] = col[2] = 128;
}
break;
+
case SEQ_PLUGIN:
UI_GetThemeColor3ubv(TH_SEQ_PLUGIN, col);
break;
+
case SEQ_SOUND:
UI_GetThemeColor3ubv(TH_SEQ_AUDIO, col);
blendcol[0] = blendcol[1] = blendcol[2] = 128;
if(seq->flag & SEQ_MUTE) UI_GetColorPtrBlendShade3ubv(col, blendcol, col, 0.5, 20);
break;
+
default:
col[0] = 10; col[1] = 255; col[2] = 40;
}
@@ -221,7 +211,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
/* Note, this used to use WHILE_SEQ, but it messes up the seq->depth value, (needed by transform when doing overlap checks)
* so for now, just use the meta's immediate children, could be fixed but its only drawing - Campbell */
Sequence *seq;
- char col[4];
+ unsigned char col[4];
int chan_min= MAXSEQ;
int chan_max= 0;
@@ -257,7 +247,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
get_seq_color3ubv(scene, seq, col);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
/* clamp within parent sequence strip bounds */
if(x1_chan < x1) x1_chan= x1;
@@ -269,7 +259,7 @@ static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, float y1,
glRectf(x1_chan, y1_chan, x2_chan, y2_chan);
UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -30);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
fdrawbox(x1_chan, y1_chan, x2_chan, y2_chan);
if((seqm->flag & SEQ_MUTE) == 0 && (seq->flag & SEQ_MUTE))
@@ -352,7 +342,7 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
}
if(G.moving || (seq->flag & whichsel)) {
- cpack(0xFFFFFF);
+ const char col[4]= {255, 255, 255, 255};
if (direction == SEQ_LEFTHANDLE) {
sprintf(str, "%d", seq->startdisp);
x1= rx1;
@@ -362,14 +352,14 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
x1= x2 - handsize*0.75;
y1= y2 + 0.05;
}
- UI_view2d_text_cache_add(v2d, x1, y1, str);
+ UI_view2d_text_cache_add(v2d, x1, y1, str, col);
}
}
-static void draw_seq_extensions(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *seq)
+static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
{
float x1, x2, y1, y2, pixely, a;
- char col[3], blendcol[3];
+ unsigned char col[3], blendcol[3];
View2D *v2d= &ar->v2d;
if(seq->type >= SEQ_EFFECT) return;
@@ -471,11 +461,12 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, SpaceSeq *sseq, Seque
}
/* draw info text on a sequence strip */
-static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float y1, float y2, char *background_col)
+static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float y1, float y2, const unsigned char background_col[3])
{
rctf rect;
char str[32 + FILE_MAXDIR+FILE_MAXFILE];
const char *name= seq->name+2;
+ char col[4];
if(name[0]=='\0')
name= give_seqname(seq);
@@ -520,22 +511,23 @@ static void draw_seq_text(View2D *v2d, Sequence *seq, float x1, float x2, float
}
if(seq->flag & SELECT){
- cpack(0xFFFFFF);
+ col[0]= col[1]= col[2]= 255;
}else if ((((int)background_col[0] + (int)background_col[1] + (int)background_col[2]) / 3) < 50){
- cpack(0x505050); /* use lighter text colour for dark background */
+ col[0]= col[1]= col[2]= 80; /* use lighter text color for dark background */
}else{
- cpack(0);
+ col[0]= col[1]= col[2]= 0;
}
-
+ col[3]= 255;
+
rect.xmin= x1;
rect.ymin= y1;
rect.xmax= x2;
rect.ymax= y2;
- UI_view2d_text_cache_rectf(v2d, &rect, str);
+ UI_view2d_text_cache_rectf(v2d, &rect, str, col);
}
/* draws a shaded strip, made from gradient + flat color + gradient */
-static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float x2, float y2)
+static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2)
{
float ymid1, ymid2;
@@ -553,7 +545,7 @@ static void draw_shadedstrip(Sequence *seq, char *col, float x1, float y1, float
if(seq->flag & SELECT) UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, -50);
else UI_GetColorPtrBlendShade3ubv(col, col, col, 0.0, 0);
- glColor3ubv((GLubyte *)col);
+ glColor3ubv(col);
glVertex2f(x1,y1);
glVertex2f(x2,y1);
@@ -595,13 +587,11 @@ Draw a sequence strip, bounds check already made
ARegion is currently only used to get the windows width in pixels
so wave file sample drawing precision is zoom adjusted
*/
-static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *seq, int outline_tint, float pixelx)
+static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline_tint, float pixelx)
{
- // XXX
- extern void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown);
View2D *v2d= &ar->v2d;
float x1, x2, y1, y2;
- char col[3], background_col[3], is_single_image;
+ unsigned char col[3], background_col[3], is_single_image;
/* we need to know if this is a single image/color or not for drawing */
is_single_image = (char)seq_single_check(seq);
@@ -627,7 +617,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
/* draw additional info and controls */
if (!is_single_image)
- draw_seq_extensions(scene, ar, sseq, seq);
+ draw_seq_extensions(scene, ar, seq);
draw_seq_handle(v2d, seq, pixelx, SEQ_LEFTHANDLE);
draw_seq_handle(v2d, seq, pixelx, SEQ_RIGHTHANDLE);
@@ -655,7 +645,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
glLineStipple(1, 0x8888);
}
- gl_round_box_shade(GL_LINE_LOOP, x1, y1, x2, y2, 0.0, 0.1, 0.0);
+ uiDrawBoxShade(GL_LINE_LOOP, x1, y1, x2, y2, 0.0, 0.1, 0.0);
if (seq->flag & SEQ_MUTE) {
glDisable(GL_LINE_STIPPLE);
@@ -681,7 +671,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, SpaceSeq *sseq, Sequence *
static Sequence *special_seq_update= 0;
-void set_special_seq_update(int val)
+static void set_special_seq_update(int val)
{
// int x;
@@ -694,7 +684,6 @@ void set_special_seq_update(int val)
void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq, int cfra, int frame_ofs)
{
- extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
struct Main *bmain= CTX_data_main(C);
struct ImBuf *ibuf = 0;
struct ImBuf *scope = 0;
@@ -705,6 +694,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
float proxy_size = 100.0;
GLuint texid;
GLuint last_texid;
+ SeqRenderData context;
render_size = sseq->render_size;
if (render_size == 0) {
@@ -740,12 +730,18 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f);
UI_view2d_curRect_validate(v2d);
+ /* only initialize the preview if a render is in progress */
+ if(G.rendering)
+ return;
+
+ context = seq_new_render_data(bmain, scene, rectx, recty, proxy_size);
+
if (special_seq_update)
- ibuf= give_ibuf_seq_direct(bmain, scene, rectx, recty, cfra + frame_ofs, proxy_size, special_seq_update);
+ ibuf= give_ibuf_seq_direct(context, cfra + frame_ofs, special_seq_update);
else if (!U.prefetchframes) // XXX || (G.f & G_PLAYANIM) == 0) {
- ibuf= (ImBuf *)give_ibuf_seq(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
+ ibuf= (ImBuf *)give_ibuf_seq(context, cfra + frame_ofs, sseq->chanshown);
else
- ibuf= (ImBuf *)give_ibuf_seq_threaded(bmain, scene, rectx, recty, cfra + frame_ofs, sseq->chanshown, proxy_size);
+ ibuf= (ImBuf *)give_ibuf_seq_threaded(context, cfra + frame_ofs, sseq->chanshown);
if(ibuf==NULL)
return;
@@ -784,7 +780,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
}
/* setting up the view - actual drawing starts here */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
last_texid= glaGetOneInteger(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_2D);
@@ -855,7 +851,7 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
uiSetRoundBox(15);
- gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
+ uiDrawBox(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
@@ -878,7 +874,8 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_view2d_view_restore(C);
}
-void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
+#if 0
+void drawprefetchseqspace(Scene *scene, ARegion *UNUSED(ar), SpaceSeq *sseq)
{
int rectx, recty;
int render_size = sseq->render_size;
@@ -901,6 +898,7 @@ void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
proxy_size);
}
}
+#endif
/* draw backdrop of the sequencer strips view */
static void draw_seq_backdrop(View2D *v2d)
@@ -948,7 +946,6 @@ static void draw_seq_backdrop(View2D *v2d)
static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
{
Scene *scene= CTX_data_scene(C);
- SpaceSeq *sseq= CTX_wm_space_seq(C);
View2D *v2d= &ar->v2d;
Sequence *last_seq = seq_active_get(scene);
int sel = 0, j;
@@ -970,7 +967,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
else if (seq->machine > v2d->cur.ymax) continue;
/* strip passed all tests unscathed... so draw it now */
- draw_seq_strip(scene, ar, sseq, seq, outline_tint, pixelx);
+ draw_seq_strip(scene, ar, seq, outline_tint, pixelx);
}
/* draw selected next time round */
@@ -979,14 +976,11 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
/* draw the last selected last (i.e. 'active' in other parts of Blender), removes some overlapping error */
if (last_seq)
- draw_seq_strip(scene, ar, sseq, last_seq, 120, pixelx);
+ draw_seq_strip(scene, ar, last_seq, 120, pixelx);
}
-static void seq_draw_sfra_efra(const bContext *C, SpaceSeq *sseq, ARegion *ar)
-{
- View2D *v2d= UI_view2d_fromcontext(C);
- Scene *scene= CTX_data_scene(C);
-
+static void seq_draw_sfra_efra(Scene *scene, View2D *v2d)
+{
glEnable(GL_BLEND);
/* draw darkened area outside of active timeline
@@ -1028,7 +1022,7 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* calculate extents of sequencer strips/data
@@ -1041,9 +1035,9 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
draw_seq_backdrop(v2d);
/* regular grid-pattern over the rest of the view (i.e. frame grid lines) */
- UI_view2d_constant_grid_draw(C, v2d);
+ UI_view2d_constant_grid_draw(v2d);
- seq_draw_sfra_efra(C, sseq, ar);
+ seq_draw_sfra_efra(scene, v2d);
/* sequence strips (if there is data available to be drawn) */
if (ed) {
@@ -1055,17 +1049,17 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
}
/* current frame */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
if ((sseq->flag & SEQ_DRAWFRAMES)==0) flag |= DRAWCFRA_UNIT_SECONDS;
if ((sseq->flag & SEQ_NO_DRAW_CFRANUM)==0) flag |= DRAWCFRA_SHOW_NUMBOX;
ANIM_draw_cfra(C, v2d, flag);
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, DRAW_MARKERS_LINES);
/* preview range */
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
ANIM_draw_previewrange(C, v2d);
/* overlap playhead */
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index d1654dc5d37..b0547ff9994 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_storage_types.h"
-
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
#include "DNA_userdef_types.h"
@@ -69,11 +69,11 @@
/* own include */
#include "sequencer_intern.h"
-static void error(const char *dummy) {}
-static void waitcursor(int val) {}
-static void activate_fileselect(int d1, char *d2, char *d3, void *d4) {}
-static int pupmenu(const char *dummy) {return 0;}
-static int okee(const char *dummy) {return 0;}
+static void error(const char *UNUSED(dummy)) {}
+static void waitcursor(int UNUSED(val)) {}
+static void activate_fileselect(int UNUSED(d1), const char *UNUSED(d2), const char *UNUSED(d3), void *UNUSED(d4)) {}
+static int pupmenu(const char *UNUSED(dummy)) {return 0;}
+static int okee(const char *UNUSED(dummy)) {return 0;}
/* XXX */
@@ -106,7 +106,7 @@ EnumPropertyItem prop_side_types[] = {
{0, NULL, 0, NULL, NULL}
};
-EnumPropertyItem prop_side_lr_types[] = {
+static EnumPropertyItem prop_side_lr_types[] = {
{SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""},
{SEQ_SIDE_RIGHT, "RIGHT", 0, "Right", ""},
{0, NULL, 0, NULL, NULL}
@@ -121,28 +121,6 @@ typedef struct TransSeq {
int len;
} TransSeq;
-Sequence *get_foreground_frame_seq(Scene *scene, int frame)
-{
- Editing *ed= seq_give_editing(scene, FALSE);
- Sequence *seq, *best_seq=NULL;
- int best_machine = -1;
-
- if(!ed) return NULL;
-
- for (seq=ed->seqbasep->first; seq; seq= seq->next) {
- if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame)
- continue;
- /* only use elements you can see - not */
- if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) {
- if (seq->machine > best_machine) {
- best_seq = seq;
- best_machine = seq->machine;
- }
- }
- }
- return best_seq;
-}
-
void seq_rectf(Sequence *seq, rctf *rectf)
{
if(seq->startstill) rectf->xmin= seq->start;
@@ -159,7 +137,7 @@ static void change_plugin_seq(Scene *scene, char *str) /* called from fileselect
struct SeqEffectHandle sh;
Sequence *last_seq= seq_active_get(scene);
- if(last_seq && last_seq->type != SEQ_PLUGIN) return;
+ if(last_seq==NULL || last_seq->type != SEQ_PLUGIN) return;
sh = get_sequence_effect(last_seq);
sh.free(last_seq);
@@ -205,7 +183,7 @@ void boundbox_seq(Scene *scene, rctf *rect)
}
-int mouse_frame_side(View2D *v2d, short mouse_x, int frame )
+static int mouse_frame_side(View2D *v2d, short mouse_x, int frame )
{
short mval[2];
float mouseloc[2];
@@ -252,7 +230,7 @@ Sequence *find_neighboring_sequence(Scene *scene, Sequence *test, int lr, int se
return NULL;
}
-Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel)
+static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel)
{
/* sel - 0==unselected, 1==selected, -1==done care*/
Sequence *seq,*best_seq = NULL;
@@ -468,7 +446,7 @@ static void reload_sound_strip(Scene *scene, char *name)
}
#endif
-static void reload_image_strip(Scene *scene, char *name)
+static void reload_image_strip(Scene *scene, char *UNUSED(name))
{
Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq=NULL, *seqact;
@@ -506,7 +484,7 @@ static void reload_image_strip(Scene *scene, char *name)
}
-void change_sequence(Scene *scene)
+static void change_sequence(Scene *scene)
{
Editing *ed= seq_give_editing(scene, FALSE);
Sequence *last_seq= seq_active_get(scene);
@@ -603,7 +581,7 @@ void change_sequence(Scene *scene)
}
-int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, char **error_str)
+int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, const char **error_str)
{
Editing *ed = seq_give_editing(scene, FALSE);
Sequence *seq1= 0, *seq2= 0, *seq3= 0, *seq;
@@ -735,7 +713,7 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de
}
-static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
+static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -782,13 +760,13 @@ static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cut
}
}
- reload_sequence_new_file(bmain, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
calc_sequence(scene, seq);
new_tstripdata(seq);
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
+ seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
}
if (seqn) {
@@ -822,14 +800,14 @@ static Sequence *cut_seq_hard(Main *bmain, Scene *scene, Sequence * seq, int cut
seqn->startstill = 0;
}
- reload_sequence_new_file(bmain, scene, seqn, FALSE);
+ reload_sequence_new_file(scene, seqn, FALSE);
calc_sequence(scene, seqn);
new_tstripdata(seqn);
}
return seqn;
}
-static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cutframe)
+static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
Sequence *seqn = 0;
@@ -879,7 +857,7 @@ static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cut
if (!skip_dup) {
/* Duplicate AFTER the first change */
- seqn = seq_dupli_recursive(scene, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
+ seqn = seq_dupli_recursive(scene, NULL, seq, SEQ_DUPE_UNIQUE_NAME | SEQ_DUPE_ANIM);
}
if (seqn) {
@@ -919,22 +897,22 @@ static Sequence *cut_seq_soft(Main *bmain, Scene *scene, Sequence * seq, int cut
/* like duplicate, but only duplicate and cut overlapping strips,
* strips to the left of the cutframe are ignored and strips to the right are moved into the new list */
-static int cut_seq_list(Main *bmain, Scene *scene, ListBase *old, ListBase *new, int cutframe,
- Sequence * (*cut_seq)(Main *, Scene *, Sequence *, int))
+static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe,
+ Sequence * (*cut_seq)(Scene *, Sequence *, int))
{
int did_something = FALSE;
- Sequence *seq, *seq_next;
+ Sequence *seq, *seq_next_iter;
seq= old->first;
while(seq) {
- seq_next = seq->next; /* we need this because we may remove seq */
+ seq_next_iter = seq->next; /* we need this because we may remove seq */
seq->tmp= NULL;
if(seq->flag & SELECT) {
if(cutframe > seq->startdisp &&
cutframe < seq->enddisp) {
- Sequence * seqn = cut_seq(bmain, scene, seq, cutframe);
+ Sequence * seqn = cut_seq(scene, seq, cutframe);
if (seqn) {
BLI_addtail(new, seqn);
}
@@ -947,12 +925,12 @@ static int cut_seq_list(Main *bmain, Scene *scene, ListBase *old, ListBase *new,
BLI_addtail(new, seq);
}
}
- seq = seq_next;
+ seq = seq_next_iter;
}
return did_something;
}
-int insert_gap(Scene *scene, int gap, int cfra)
+static int insert_gap(Scene *scene, int gap, int cfra)
{
Sequence *seq;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -974,7 +952,7 @@ int insert_gap(Scene *scene, int gap, int cfra)
return done;
}
-void touch_seq_files(Scene *scene)
+static void touch_seq_files(Scene *scene)
{
Sequence *seq;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -992,7 +970,7 @@ void touch_seq_files(Scene *scene)
if(seq->flag & SELECT) {
if(seq->type==SEQ_MOVIE) {
if(seq->strip && seq->strip->stripdata) {
- BLI_make_file_string(G.sce, str, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_make_file_string(G.main->name, str, seq->strip->dir, seq->strip->stripdata->name);
BLI_touch(seq->name);
}
}
@@ -1004,7 +982,8 @@ void touch_seq_files(Scene *scene)
waitcursor(0);
}
-void set_filter_seq(Main *bmain, Scene *scene)
+/*
+static void set_filter_seq(Scene *scene)
{
Sequence *seq;
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1018,17 +997,17 @@ void set_filter_seq(Main *bmain, Scene *scene)
if(seq->flag & SELECT) {
if(seq->type==SEQ_MOVIE) {
seq->flag |= SEQ_FILTERY;
- reload_sequence_new_file(bmain, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
calc_sequence(scene, seq);
}
}
}
SEQ_END
-
}
+*/
-void seq_remap_paths(Scene *scene)
+static void seq_remap_paths(Scene *scene)
{
Sequence *seq, *last_seq = seq_active_get(scene);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1059,8 +1038,7 @@ void seq_remap_paths(Scene *scene)
BLI_strncpy(stripped, seq->strip->dir + strlen(from), FILE_MAX);
/* new path */
- BLI_strncpy(seq->strip->dir, to, FILE_MAX);
- strcat(seq->strip->dir, stripped);
+ BLI_snprintf(seq->strip->dir, sizeof(seq->strip->dir), "%s%s", to, stripped);
printf("new %s\n", seq->strip->dir);
}
}
@@ -1070,7 +1048,7 @@ void seq_remap_paths(Scene *scene)
}
-void no_gaps(Scene *scene)
+static void no_gaps(Scene *scene)
{
Editing *ed= seq_give_editing(scene, FALSE);
int cfra, first= 0, done;
@@ -1137,14 +1115,15 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
snap_frame= RNA_int_get(op->ptr, "frame");
- /* problem: contents of meta's are all shifted to the same position... */
-
/* also check metas */
- SEQP_BEGIN(ed, seq) {
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if (seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK) &&
seq_tx_test(seq)) {
if((seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0) {
- seq->start= snap_frame-seq->startofs+seq->startstill;
+ /* simple but no anim update */
+ /* seq->start= snap_frame-seq->startofs+seq->startstill; */
+
+ seq_translate(scene, seq, (snap_frame-seq->startofs+seq->startstill) - seq->start);
} else {
if(seq->flag & SEQ_LEFTSEL) {
seq_tx_set_final_left(seq, snap_frame);
@@ -1156,10 +1135,10 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
calc_sequence(scene, seq);
}
}
- SEQ_END
- /* test for effects and overlap */
- SEQP_BEGIN(ed, seq) {
+ /* test for effects and overlap
+ * dont use SEQP_BEGIN since that would be recursive */
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if(seq->flag & SELECT && !(seq->depth==0 && seq->flag & SEQ_LOCK)) {
seq->flag &= ~SEQ_OVERLAP;
if( seq_test_overlap(ed->seqbasep, seq) ) {
@@ -1175,7 +1154,6 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
calc_sequence(scene, seq);
}
}
- SEQ_END;
/* as last: */
sort_seq(scene);
@@ -1185,7 +1163,7 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sequencer_snap_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Scene *scene = CTX_data_scene(C);
@@ -1310,7 +1288,7 @@ void SEQUENCER_OT_unmute(struct wmOperatorType *ot)
/* lock operator */
-static int sequencer_lock_exec(bContext *C, wmOperator *op)
+static int sequencer_lock_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1343,7 +1321,7 @@ void SEQUENCER_OT_lock(struct wmOperatorType *ot)
}
/* unlock operator */
-static int sequencer_unlock_exec(bContext *C, wmOperator *op)
+static int sequencer_unlock_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1376,7 +1354,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot)
}
/* reload operator */
-static int sequencer_reload_exec(bContext *C, wmOperator *op)
+static int sequencer_reload_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1409,7 +1387,7 @@ void SEQUENCER_OT_reload(struct wmOperatorType *ot)
}
/* reload operator */
-static int sequencer_refresh_all_exec(bContext *C, wmOperator *op)
+static int sequencer_refresh_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1440,7 +1418,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Sequence *seq1, *seq2, *seq3, *last_seq = seq_active_get(scene);
- char *error_msg;
+ const char *error_msg;
if(!seq_effect_find_selected(scene, last_seq, last_seq->type, &seq1, &seq2, &seq3, &error_msg)) {
BKE_report(op->reports, RPT_ERROR, error_msg);
@@ -1466,7 +1444,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-int sequencer_effect_poll(bContext *C)
+static int sequencer_effect_poll(bContext *C)
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1497,6 +1475,42 @@ void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot)
}
+static int sequencer_swap_inputs_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ Sequence *seq, *last_seq = seq_active_get(scene);
+
+ if(last_seq->seq1==NULL || last_seq->seq2 == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No valid inputs to swap");
+ return OPERATOR_CANCELLED;
+ }
+
+ seq = last_seq->seq1;
+ last_seq->seq1 = last_seq->seq2;
+ last_seq->seq2 = seq;
+
+ update_changed_seq_and_deps(scene, last_seq, 1, 1);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
+
+ return OPERATOR_FINISHED;
+}
+void SEQUENCER_OT_swap_inputs(struct wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Swap Inputs";
+ ot->idname= "SEQUENCER_OT_swap_inputs";
+ ot->description="Swap the first two inputs for the effects strip";
+
+ /* api callbacks */
+ ot->exec= sequencer_swap_inputs_exec;
+ ot->poll= sequencer_effect_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
/* cut operator */
static EnumPropertyItem prop_cut_types[] = {
{SEQ_CUT_SOFT, "SOFT", 0, "Soft", ""},
@@ -1506,7 +1520,6 @@ static EnumPropertyItem prop_cut_types[] = {
static int sequencer_cut_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
int cut_side, cut_hard, cut_frame;
@@ -1521,16 +1534,14 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op)
newlist.first= newlist.last= NULL;
if (cut_hard==SEQ_CUT_HARD) {
- changed = cut_seq_list(bmain, scene,
- ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
+ changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_hard);
} else {
- changed = cut_seq_list(bmain, scene,
- ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
+ changed = cut_seq_list(scene, ed->seqbasep, &newlist, cut_frame, cut_seq_soft);
}
if (newlist.first) { /* got new strips ? */
Sequence *seq;
- addlisttolist(ed->seqbasep, &newlist);
+ BLI_movelisttolist(ed->seqbasep, &newlist);
if (cut_side != SEQ_SIDE_BOTH) {
SEQP_BEGIN(ed, seq) {
@@ -1609,7 +1620,7 @@ static int apply_unique_name_cb(Sequence *seq, void *arg_pt)
}
-static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
+static int sequencer_add_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1619,12 +1630,12 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
if(ed==NULL)
return OPERATOR_CANCELLED;
- seqbase_dupli_recursive(scene, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
+ seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_CONTEXT);
if(nseqbase.first) {
Sequence * seq= nseqbase.first;
/* rely on the nseqbase list being added at the end */
- addlisttolist(ed->seqbasep, &nseqbase);
+ BLI_movelisttolist(ed->seqbasep, &nseqbase);
for( ; seq; seq= seq->next)
seq_recursive_apply(seq, apply_unique_name_cb, scene);
@@ -1636,7 +1647,7 @@ static int sequencer_add_duplicate_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
sequencer_add_duplicate_exec(C, op);
@@ -1666,7 +1677,7 @@ void SEQUENCER_OT_duplicate(wmOperatorType *ot)
}
/* delete operator */
-static int sequencer_delete_exec(bContext *C, wmOperator *op)
+static int sequencer_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1747,7 +1758,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
- Sequence *seq, *seq_new, *seq_next;
+ Sequence *seq, *seq_new;
Strip *strip_new;
StripElem *se, *se_new;
int start_ofs, cfra, frame_end;
@@ -1759,7 +1770,6 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
if((seq->flag & SELECT) && (seq->type == SEQ_IMAGE) && (seq->len > 1)) {
/* remove seq so overlap tests dont conflict,
see seq_free_sequence below for the real free'ing */
- seq_next = seq->next;
BLI_remlink(ed->seqbasep, seq);
/* if(seq->ipo) seq->ipo->id.us--; */
/* XXX, remove fcurve and assign to split image strips */
@@ -1784,7 +1794,7 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
/* new stripdata */
strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem");
- strncpy(se_new->name, se->name, FILE_MAXFILE-1);
+ BLI_strncpy(se_new->name, se->name, sizeof(se_new->name));
calc_sequence(scene, seq_new);
if(step > 1) {
@@ -1840,7 +1850,7 @@ void SEQUENCER_OT_images_separate(wmOperatorType *ot)
/* META Operators */
/* separate_meta_toggle operator */
-static int sequencer_meta_toggle_exec(bContext *C, wmOperator *op)
+static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1985,7 +1995,7 @@ static int seq_depends_on_meta(Sequence *seq, Sequence *seqm)
}
/* separate_meta_make operator */
-static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
+static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -1995,7 +2005,7 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
if(last_seq==NULL || last_seq->type!=SEQ_META)
return OPERATOR_CANCELLED;
- addlisttolist(ed->seqbasep, &last_seq->seqbase);
+ BLI_movelisttolist(ed->seqbasep, &last_seq->seqbase);
last_seq->seqbase.first= 0;
last_seq->seqbase.last= 0;
@@ -2010,16 +2020,16 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
recurs_del_seq_flag(scene, ed->seqbasep, SEQ_FLAG_DELETE, 0);
- /* test for effects and overlap */
- SEQP_BEGIN(ed, seq) {
+ /* test for effects and overlap
+ * dont use SEQP_BEGIN since that would be recursive */
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
if(seq->flag & SELECT) {
seq->flag &= ~SEQ_OVERLAP;
- if( seq_test_overlap(ed->seqbasep, seq) ) {
+ if(seq_test_overlap(ed->seqbasep, seq)) {
shuffle_seq(ed->seqbasep, seq, scene);
}
}
}
- SEQ_END;
sort_seq(scene);
seq_update_muting(scene, ed);
@@ -2046,7 +2056,7 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
}
/* view_all operator */
-static int sequencer_view_all_exec(bContext *C, wmOperator *op)
+static int sequencer_view_all_exec(bContext *C, wmOperator *UNUSED(op))
{
//Scene *scene= CTX_data_scene(C);
bScreen *sc= CTX_wm_screen(C);
@@ -2078,7 +2088,7 @@ void SEQUENCER_OT_view_all(wmOperatorType *ot)
}
/* view_all operator */
-static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op)
+static int sequencer_view_all_preview_exec(bContext *C, wmOperator *UNUSED(op))
{
bScreen *sc= CTX_wm_screen(C);
ScrArea *area= CTX_wm_area(C);
@@ -2169,6 +2179,7 @@ void SEQUENCER_OT_view_zoom_ratio(wmOperatorType *ot)
/* identifiers */
ot->name= "Sequencer View Zoom Ratio";
ot->idname= "SEQUENCER_OT_view_zoom_ratio";
+ ot->description = "Change zoom ratio of sequencer preview";
/* api callbacks */
ot->exec= sequencer_view_zoom_ratio_exec;
@@ -2189,7 +2200,7 @@ static EnumPropertyItem view_type_items[] = {
#endif
/* view_all operator */
-static int sequencer_view_toggle_exec(bContext *C, wmOperator *op)
+static int sequencer_view_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceSeq *sseq= (SpaceSeq *)CTX_wm_space_data(C);
@@ -2218,7 +2229,7 @@ void SEQUENCER_OT_view_toggle(wmOperatorType *ot)
/* view_selected operator */
-static int sequencer_view_selected_exec(bContext *C, wmOperator *op)
+static int sequencer_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
View2D *v2d= UI_view2d_fromcontext(C);
@@ -2354,7 +2365,7 @@ static int next_prev_edit_internal(Scene *scene, int side)
}
/* move frame to next edit point operator */
-static int sequencer_next_edit_exec(bContext *C, wmOperator *op)
+static int sequencer_next_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2384,7 +2395,7 @@ void SEQUENCER_OT_next_edit(wmOperatorType *ot)
}
/* move frame to previous edit point operator */
-static int sequencer_previous_edit_exec(bContext *C, wmOperator *op)
+static int sequencer_previous_edit_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2518,27 +2529,24 @@ void SEQUENCER_OT_swap(wmOperatorType *ot)
RNA_def_enum(ot->srna, "side", prop_side_lr_types, SEQ_SIDE_RIGHT, "Side", "Side of the strip to swap");
}
-static int sequencer_rendersize_exec(bContext *C, wmOperator *op)
+static int sequencer_rendersize_exec(bContext *C, wmOperator *UNUSED(op))
{
int retval = OPERATOR_CANCELLED;
Scene *scene= CTX_data_scene(C);
Sequence *active_seq = seq_active_get(scene);
+ StripElem *se = NULL;
if(active_seq==NULL)
return OPERATOR_CANCELLED;
- switch (active_seq->type) {
+
+ if (active_seq->strip) {
+ switch (active_seq->type) {
case SEQ_IMAGE:
+ se = give_stripelem(active_seq, scene->r.cfra);
+ break;
case SEQ_MOVIE:
- if (active_seq->strip) {
- // prevent setting the render size if sequence values aren't initialized
- if ( (active_seq->strip->orx>0) && (active_seq->strip->ory>0) ) {
- scene->r.xsch= active_seq->strip->orx;
- scene->r.ysch= active_seq->strip->ory;
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
- retval = OPERATOR_FINISHED;
- }
- }
+ se = active_seq->strip->stripdata;
break;
case SEQ_SCENE:
case SEQ_META:
@@ -2546,7 +2554,19 @@ static int sequencer_rendersize_exec(bContext *C, wmOperator *op)
case SEQ_HD_SOUND:
default:
break;
+ }
}
+
+ if (se) {
+ // prevent setting the render size if sequence values aren't initialized
+ if ( (se->orig_width > 0) && (se->orig_height > 0) ) {
+ scene->r.xsch= se->orig_width;
+ scene->r.ysch= se->orig_height;
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
+ retval = OPERATOR_FINISHED;
+ }
+ }
+
return retval;
}
@@ -2595,7 +2615,7 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- seqbase_dupli_recursive(scene, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
+ seqbase_dupli_recursive(scene, NULL, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
seqbase_clipboard_frame= scene->r.cfra;
/* Need to remove anything that references the current scene */
@@ -2638,7 +2658,7 @@ static void seq_offset(Scene *scene, Sequence *seq, int ofs)
calc_sequence_disp(scene, seq);
}
-static int sequencer_paste_exec(bContext *C, wmOperator *op)
+static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, TRUE); /* create if needed */
@@ -2649,7 +2669,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op)
deselect_all_seq(scene);
ofs = scene->r.cfra - seqbase_clipboard_frame;
- seqbase_dupli_recursive(scene, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
+ seqbase_dupli_recursive(scene, NULL, &nseqbase, &seqbase_clipboard, SEQ_DUPE_UNIQUE_NAME);
/* transform pasted strips before adding */
if(ofs) {
@@ -2658,7 +2678,7 @@ static int sequencer_paste_exec(bContext *C, wmOperator *op)
}
}
- addlisttolist(ed->seqbasep, &nseqbase);
+ BLI_movelisttolist(ed->seqbasep, &nseqbase);
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index bf0dfff8e98..e0266e88bc9 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -54,9 +54,6 @@ void seq_reset_imageofs(struct SpaceSeq *sseq);
/* sequencer_edit.c */
struct View2D;
-int seq_single_check(struct Sequence *seq);
-int seq_tx_get_final_left(struct Sequence *seq, int metaclip);
-int seq_tx_get_final_right(struct Sequence *seq, int metaclip);
void seq_rectf(struct Sequence *seq, struct rctf *rectf);
void boundbox_seq(struct Scene *scene, struct rctf *rect);
struct Sequence *find_nearest_seq(struct Scene *scene, struct View2D *v2d, int *hand, short mval[2]);
@@ -64,8 +61,7 @@ struct Sequence *find_neighboring_sequence(struct Scene *scene, struct Sequence
void deselect_all_seq(struct Scene *scene);
void recurs_sel_seq(struct Sequence *seqm);
int event_to_efftype(int event);
-int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3, char **error_str);
-struct Sequence *alloc_sequence(struct ListBase *lb, int cfra, int machine);
+int seq_effect_find_selected(struct Scene *scene, struct Sequence *activeseq, int type, struct Sequence **selseq1, struct Sequence **selseq2, struct Sequence **selseq3, const char **error_str);
/* operator helpers */
int sequencer_edit_poll(struct bContext *C);
@@ -87,6 +83,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot);
void SEQUENCER_OT_reload(struct wmOperatorType *ot);
void SEQUENCER_OT_refresh_all(struct wmOperatorType *ot);
void SEQUENCER_OT_reassign_inputs(struct wmOperatorType *ot);
+void SEQUENCER_OT_swap_inputs(struct wmOperatorType *ot);
void SEQUENCER_OT_duplicate(struct wmOperatorType *ot);
void SEQUENCER_OT_delete(struct wmOperatorType *ot);
void SEQUENCER_OT_images_separate(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 6ca0a13f172..62c478f916f 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -60,6 +60,7 @@ void sequencer_operatortypes(void)
WM_operatortype_append(SEQUENCER_OT_reload);
WM_operatortype_append(SEQUENCER_OT_refresh_all);
WM_operatortype_append(SEQUENCER_OT_reassign_inputs);
+ WM_operatortype_append(SEQUENCER_OT_swap_inputs);
WM_operatortype_append(SEQUENCER_OT_duplicate);
WM_operatortype_append(SEQUENCER_OT_delete);
WM_operatortype_append(SEQUENCER_OT_images_separate);
@@ -118,6 +119,12 @@ void sequencer_keymap(wmKeyConfig *keyconf)
/* operators for sequence */
keymap= WM_keymap_find(keyconf, "Sequencer", SPACE_SEQ, 0);
+
+ WM_keymap_add_item(keymap, "MARKER_OT_add", MKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
+ WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "MARKER_OT_duplicate", DKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
@@ -163,6 +170,7 @@ void sequencer_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_swap", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "side", SEQ_SIDE_RIGHT);
WM_keymap_add_item(keymap, "SEQUENCER_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_swap_inputs", SKEY, KM_PRESS, KM_ALT, 0);
/* multicam editing keyboard layout, switch to camera 1-10 using
regular number keys */
@@ -243,9 +251,6 @@ void sequencer_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all_preview", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
-
- keymap= WM_keymap_find(keyconf, "SequencerPreview", SPACE_SEQ, 0);
-
WM_keymap_add_item(keymap, "SEQUENCER_OT_view_ghost_border", OKEY, KM_PRESS, 0, 0);
/* would prefer to use numpad keys for job */
diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c
index d9d027823bc..87ad27403da 100644
--- a/source/blender/editors/space_sequencer/sequencer_scopes.c
+++ b/source/blender/editors/space_sequencer/sequencer_scopes.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,7 +26,9 @@
#include <math.h>
#include <string.h>
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -143,7 +145,7 @@ static void wform_put_grid(unsigned char * tgt, int w, int h)
static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect);
int x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -189,7 +191,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(ibuf->x + 3, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -249,7 +251,7 @@ struct ImBuf *make_waveform_view_from_ibuf(struct ImBuf * ibuf)
static struct ImBuf *make_sep_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(
- ibuf->x + 3, 515, 32, IB_rect, 0);
+ ibuf->x + 3, 515, 32, IB_rect);
int x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -299,7 +301,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(
- ibuf->x + 3, 515, 32, IB_rect, 0);
+ ibuf->x + 3, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
unsigned char* tgt = (unsigned char*) rval->rect;
@@ -422,7 +424,7 @@ static void draw_zebra_float(struct ImBuf * src,struct ImBuf * ibuf,float perc)
struct ImBuf * make_zebra_view_from_ibuf(struct ImBuf * src, float perc)
{
- struct ImBuf * ibuf = IMB_allocImBuf(src->x, src->y, 32, IB_rect, 0);
+ struct ImBuf * ibuf = IMB_allocImBuf(src->x, src->y, 32, IB_rect);
if (src->rect_float) {
draw_zebra_float(src, ibuf, perc);
@@ -463,7 +465,7 @@ static void draw_histogram_bar(struct ImBuf * ibuf, int x,float val, int col)
static struct ImBuf *make_histogram_view_from_ibuf_byte(
struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect);
int n,c,x,y;
unsigned char* src = (unsigned char*) ibuf->rect;
@@ -517,7 +519,7 @@ static int get_bin_float(float f)
static struct ImBuf *make_histogram_view_from_ibuf_float(
struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect);
int n,c,x,y;
float* src = ibuf->rect_float;
@@ -596,7 +598,7 @@ static void vectorscope_put_cross(unsigned char r, unsigned char g,
static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect);
int x,y;
char* src = (char*) ibuf->rect;
char* tgt = (char*) rval->rect;
@@ -643,7 +645,7 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf)
static struct ImBuf *make_vectorscope_view_from_ibuf_float(struct ImBuf * ibuf)
{
- struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect, 0);
+ struct ImBuf * rval = IMB_allocImBuf(515, 515, 32, IB_rect);
int x,y;
float* src = ibuf->rect_float;
char* tgt = (char*) rval->rect;
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index a61e05517d9..7a6f5f0890b 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -35,9 +35,9 @@
#endif
#include <sys/types.h>
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_scene_types.h"
@@ -58,9 +58,9 @@
/* own include */
#include "sequencer_intern.h"
-static void *find_nearest_marker(int d1, int d2) {return NULL;}
+static void *find_nearest_marker(int UNUSED(d1), int UNUSED(d2)) {return NULL;}
-void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */
+static void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */
{
Sequence *neighbor;
@@ -154,7 +154,7 @@ void select_surround_from_last(Scene *scene)
#endif
-void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING BACK */
+static void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING BACK */
{
Editing *ed= seq_give_editing(scene, FALSE);
@@ -176,8 +176,8 @@ void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING B
// remove this function, replace with invert operator
//void swap_select_seq(Scene *scene)
-
-void select_neighbor_from_last(Scene *scene, int lr)
+#if 0
+static void select_neighbor_from_last(Scene *scene, int lr)
{
Sequence *seq= seq_active_get(scene);
Sequence *neighbor;
@@ -206,10 +206,10 @@ void select_neighbor_from_last(Scene *scene, int lr)
if (change) {
}
}
-
+#endif
/* (de)select operator */
-static int sequencer_deselect_exec(bContext *C, wmOperator *op)
+static int sequencer_deselect_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -255,7 +255,7 @@ void SEQUENCER_OT_select_all_toggle(struct wmOperatorType *ot)
/* (de)select operator */
-static int sequencer_select_inverse_exec(bContext *C, wmOperator *op)
+static int sequencer_select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Editing *ed= seq_give_editing(scene, FALSE);
@@ -363,16 +363,16 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceSeq *sseq= CTX_wm_space_seq(C);
if (sseq && sseq->flag & SEQ_MARKER_TRANS) {
- TimeMarker *marker;
+ TimeMarker *tmarker;
- for (marker= scene->markers.first; marker; marker= marker->next) {
- if( ((x < CFRA) && marker->frame < CFRA) ||
- ((x >= CFRA) && marker->frame >= CFRA)
+ for (tmarker= scene->markers.first; tmarker; tmarker= tmarker->next) {
+ if( ((x < CFRA) && tmarker->frame < CFRA) ||
+ ((x >= CFRA) && tmarker->frame >= CFRA)
) {
- marker->flag |= SELECT;
+ tmarker->flag |= SELECT;
}
else {
- marker->flag &= ~SELECT;
+ tmarker->flag &= ~SELECT;
}
}
}
@@ -582,7 +582,7 @@ static int select_more_less_seq__internal(Scene *scene, int sel, int linked) {
/* select more operator */
-static int sequencer_select_more_exec(bContext *C, wmOperator *op)
+static int sequencer_select_more_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -613,7 +613,7 @@ void SEQUENCER_OT_select_more(wmOperatorType *ot)
/* select less operator */
-static int sequencer_select_less_exec(bContext *C, wmOperator *op)
+static int sequencer_select_less_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -700,7 +700,7 @@ void SEQUENCER_OT_select_linked_pick(wmOperatorType *ot)
/* select linked operator */
-static int sequencer_select_linked_exec(bContext *C, wmOperator *op)
+static int sequencer_select_linked_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int selected;
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 4cf25ab9585..4816de46511 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,12 +36,15 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_sequencer.h"
#include "BKE_global.h"
+#include "ED_space_api.h"
+#include "ED_sequencer.h"
#include "ED_screen.h"
#include "ED_view3d.h" /* only for sequencer view3d drawing callback */
@@ -82,7 +85,7 @@ ARegion *sequencer_has_buttons_region(ScrArea *sa)
return arnew;
}
-ARegion *sequencer_find_region(ScrArea *sa, short type)
+static ARegion *sequencer_find_region(ScrArea *sa, short type)
{
ARegion *ar=NULL;
@@ -236,7 +239,7 @@ static SpaceLink *sequencer_new(const bContext *C)
}
/* not spacelink itself */
-static void sequencer_free(SpaceLink *sl)
+static void sequencer_free(SpaceLink *UNUSED(sl))
{
// SpaceSeq *sseq= (SpaceSequencer*) sl;
@@ -246,7 +249,7 @@ static void sequencer_free(SpaceLink *sl)
/* spacetype; init callback */
-static void sequencer_init(struct wmWindowManager *wm, ScrArea *sa)
+static void sequencer_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -296,7 +299,7 @@ static void sequencer_main_area_draw(const bContext *C, ARegion *ar)
/* ************* dropboxes ************* */
-static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int image_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM(drag->icon, ICON_FILE_IMAGE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -304,7 +307,7 @@ static int image_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int movie_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int movie_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM3(drag->icon, 0, ICON_FILE_MOVIE, ICON_FILE_BLANK)) /* rule might not work? */
@@ -312,7 +315,7 @@ static int movie_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int sound_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int sound_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
if(ELEM(drag->icon, ICON_FILE_SOUND, ICON_FILE_BLANK)) /* rule might not work? */
@@ -334,6 +337,7 @@ static void sequencer_drop_copy(wmDrag *drag, wmDropBox *drop)
RNA_string_set(drop->ptr, "directory", dir);
+ RNA_collection_clear(drop->ptr, "files");
RNA_collection_add(drop->ptr, "files", &itemptr);
RNA_string_set(&itemptr, "name", file);
}
@@ -352,7 +356,7 @@ static void sequencer_dropboxes(void)
/* ************* end drop *********** */
/* add handlers, stuff you only do once or on area/region changes */
-static void sequencer_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void sequencer_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -371,6 +375,7 @@ static void sequencer_main_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_MARKERS:
+ case ND_RENDER_OPTIONS: /* for FPS and FPS Base */
case ND_SEQUENCER:
ED_region_tag_redraw(ar);
break;
@@ -516,7 +521,7 @@ void ED_spacetype_sequencer(void)
art->init= sequencer_main_area_init;
art->draw= sequencer_main_area_draw;
art->listener= sequencer_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt
index 60c8f5e44bd..d0054836381 100644
--- a/source/blender/editors/space_sound/CMakeLists.txt
+++ b/source/blender/editors/space_sound/CMakeLists.txt
@@ -19,16 +19,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ sound_header.c
+ space_sound.c
+
+ sound_intern.h
)
-BLENDERLIB(bf_editor_space_sound "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_sound "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_sound/Makefile b/source/blender/editors/space_sound/Makefile
deleted file mode 100644
index 9afda815f59..00000000000
--- a/source/blender/editors/space_sound/Makefile
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_sound
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_sound/SConscript b/source/blender/editors/space_sound/SConscript
index e4fffb53e4c..d76fb7939ea 100644
--- a/source/blender/editors/space_sound/SConscript
+++ b/source/blender/editors/space_sound/SConscript
@@ -4,6 +4,6 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
env.BlenderLib ( 'bf_editors_space_sound', sources, Split(incs), [], libtype=['core'], priority=[75] )
diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c
index fbf6d8c85c9..a78990d74ff 100644
--- a/source/blender/editors/space_sound/sound_header.c
+++ b/source/blender/editors/space_sound/sound_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
@@ -40,7 +42,6 @@
#include "ED_types.h"
#include "ED_util.h"
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -53,12 +54,12 @@
/* ************************ header area region *********************** */
-static void do_viewmenu(bContext *C, void *arg, int event)
+static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
{
}
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
ScrArea *curarea= CTX_wm_area(C);
uiBlock *block;
@@ -84,7 +85,7 @@ static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
return block;
}
-static void do_sound_buttons(bContext *C, void *arg, int event)
+static void do_sound_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
{
switch(event) {
}
diff --git a/source/blender/editors/space_sound/sound_intern.h b/source/blender/editors/space_sound/sound_intern.h
index 7117e7d6df9..485876e20db 100644
--- a/source/blender/editors/space_sound/sound_intern.h
+++ b/source/blender/editors/space_sound/sound_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
index 905e1d6cdd9..8218ce09ad8 100644
--- a/source/blender/editors/space_sound/space_sound.c
+++ b/source/blender/editors/space_sound/space_sound.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,10 +36,12 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -55,7 +57,7 @@
/* ******************** default callbacks for sound space ***************** */
-static SpaceLink *sound_new(const bContext *C)
+static SpaceLink *sound_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceSound *ssound;
@@ -106,7 +108,7 @@ static SpaceLink *sound_new(const bContext *C)
}
/* not spacelink itself */
-static void sound_free(SpaceLink *sl)
+static void sound_free(SpaceLink *UNUSED(sl))
{
// SpaceSound *ssound= (SpaceSound*) sl;
@@ -115,7 +117,7 @@ static void sound_free(SpaceLink *sl)
/* spacetype; init callback */
-static void sound_init(struct wmWindowManager *wm, ScrArea *sa)
+static void sound_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -153,7 +155,7 @@ static void sound_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* data... */
@@ -164,18 +166,18 @@ static void sound_main_area_draw(const bContext *C, ARegion *ar)
/* scrollers? */
}
-void sound_operatortypes(void)
+static void sound_operatortypes(void)
{
}
-void sound_keymap(struct wmKeyConfig *keyconf)
+static void sound_keymap(struct wmKeyConfig *UNUSED(keyconf))
{
}
/* add handlers, stuff you only do once or on area/region changes */
-static void sound_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void sound_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
}
@@ -194,7 +196,7 @@ static void sound_header_area_draw(const bContext *C, ARegion *ar)
glClear(GL_COLOR_BUFFER_BIT);
/* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(C, &ar->v2d);
+ UI_view2d_view_ortho(&ar->v2d);
sound_header_buttons(C, ar);
@@ -202,7 +204,7 @@ static void sound_header_area_draw(const bContext *C, ARegion *ar)
UI_view2d_view_restore(C);
}
-static void sound_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void sound_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
}
diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt
index 0616cf5147a..21481dc6543 100644
--- a/source/blender/editors/space_text/CMakeLists.txt
+++ b/source/blender/editors/space_text/CMakeLists.txt
@@ -19,23 +19,31 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ space_text.c
+ text_draw.c
+ text_header.c
+ text_ops.c
+ text_python.c
+
+ text_intern.h
)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC} ../../python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ list(APPEND INC ${PYTHON_INCLUDE_DIRS} ../../python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_editor_text "${SRC}" "${INC}")
+blender_add_lib(bf_editor_text "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_text/Makefile b/source/blender/editors/space_text/Makefile
deleted file mode 100644
index 8bc12852e18..00000000000
--- a/source/blender/editors/space_text/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_text
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_text/SConscript b/source/blender/editors/space_text/SConscript
index 09ba961bfce..6ad6427f1d3 100644
--- a/source/blender/editors/space_text/SConscript
+++ b/source/blender/editors/space_text/SConscript
@@ -5,9 +5,9 @@ sources = env.Glob('*.c')
defs = []
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../python ../../makesrna ../../blenfont'
+incs += ' ../../python ../../makesrna ../../blenfont ../../blenloader'
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
env.BlenderLib ( 'bf_editors_space_text', sources, Split(incs), defs, libtype=['core'], priority=[95] )
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index c8c19a0bc93..93240d3f318 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,10 +37,12 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "BIF_gl.h"
@@ -59,7 +61,7 @@
/* ******************** default callbacks for text space ***************** */
-static SpaceLink *text_new(const bContext *C)
+static SpaceLink *text_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceText *stext;
@@ -69,6 +71,7 @@ static SpaceLink *text_new(const bContext *C)
stext->lheight= 12;
stext->tabnumber= 4;
+ stext->margin_column= 80;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for text");
@@ -92,11 +95,12 @@ static void text_free(SpaceLink *sl)
SpaceText *stext= (SpaceText*) sl;
stext->text= NULL;
+ text_free_caches(stext);
}
/* spacetype; init callback */
-static void text_init(struct wmWindowManager *wm, ScrArea *sa)
+static void text_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -104,9 +108,11 @@ static void text_init(struct wmWindowManager *wm, ScrArea *sa)
static SpaceLink *text_duplicate(SpaceLink *sl)
{
SpaceText *stextn= MEM_dupallocN(sl);
-
+
/* clear or remove stuff from old */
-
+
+ stextn->drawcache= NULL; /* space need it's own cache */
+
return (SpaceLink *)stextn;
}
@@ -117,12 +123,32 @@ static void text_listener(ScrArea *sa, wmNotifier *wmn)
/* context changes */
switch(wmn->category) {
case NC_TEXT:
- if(!wmn->reference || wmn->reference == st->text || wmn->data == ND_DISPLAY || wmn->action == NA_EDITED) {
- ED_area_tag_redraw(sa);
+ /* check if active text was changed, no need to redraw if text isn't active
+ reference==NULL means text was unlinked, should update anyway for this
+ case -- no way to know was text active before unlinking or not */
+ if(wmn->reference && wmn->reference != st->text)
+ break;
+
+ switch(wmn->data) {
+ case ND_DISPLAY:
+ case ND_CURSOR:
+ ED_area_tag_redraw(sa);
+ break;
+ }
- if(wmn->action == NA_EDITED)
- if(st->text)
+ switch(wmn->action) {
+ case NA_EDITED:
+ if(st->text) {
+ text_drawcache_tag_update(st, 1);
text_update_edited(st->text);
+ }
+
+ ED_area_tag_redraw(sa);
+ /* no break -- fall down to tag redraw */
+ case NA_ADDED:
+ case NA_REMOVED:
+ ED_area_tag_redraw(sa);
+ break;
}
break;
@@ -161,6 +187,7 @@ static void text_operatortypes(void)
WM_operatortype_append(TEXT_OT_select_line);
WM_operatortype_append(TEXT_OT_select_all);
+ WM_operatortype_append(TEXT_OT_select_word);
WM_operatortype_append(TEXT_OT_jump);
WM_operatortype_append(TEXT_OT_move);
@@ -168,6 +195,7 @@ static void text_operatortypes(void)
WM_operatortype_append(TEXT_OT_delete);
WM_operatortype_append(TEXT_OT_overwrite_toggle);
+ WM_operatortype_append(TEXT_OT_selection_set);
WM_operatortype_append(TEXT_OT_cursor_set);
WM_operatortype_append(TEXT_OT_scroll);
WM_operatortype_append(TEXT_OT_scroll_bar);
@@ -198,9 +226,21 @@ static void text_keymap(struct wmKeyConfig *keyconf)
#ifdef __APPLE__
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", LINE_END);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", LEFTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", UPARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move", DOWNARROWKEY, KM_PRESS, KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
+
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
- RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_BEGIN);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", LINE_END);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", LEFTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", PREV_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", RIGHTARROWKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", NEXT_WORD);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", UPARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_TOP);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_move_select", DOWNARROWKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0)->ptr, "type", FILE_BOTTOM);
+
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "type", DEL_PREV_WORD);
+
WM_keymap_add_item(keymap, "TEXT_OT_save", SKEY, KM_PRESS, KM_ALT|KM_OSKEY, 0);
WM_keymap_add_item(keymap, "TEXT_OT_save_as", SKEY, KM_PRESS, KM_ALT|KM_SHIFT|KM_OSKEY, 0);
WM_keymap_add_item(keymap, "TEXT_OT_cut", XKEY, KM_PRESS, KM_OSKEY, 0);
@@ -241,6 +281,10 @@ static void text_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_cut", DELKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_copy", INSERTKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_paste", INSERTKEY, KM_PRESS, KM_SHIFT, 0);
+
if(U.uiflag & USER_MMB_PASTE) // XXX not dynamic
RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0)->ptr, "selection", 1);
@@ -251,9 +295,11 @@ static void text_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_CTRL, 0)->ptr, "split_lines", 1);
WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_select_word", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_indent", TABKEY, KM_PRESS, 0, 0);
@@ -294,14 +340,15 @@ static void text_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
-
+
WM_keymap_add_item(keymap, "TEXT_OT_overwrite_toggle", INSERTKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "TEXT_OT_selection_set", EVT_TWEAK_L, KM_ANY, 0, 0);
WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0);
- RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1);
RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "lines", -1);
RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "lines", 1);
@@ -314,13 +361,14 @@ static void text_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last!
}
+const char *text_context_dir[] = {"edit_text", NULL};
+
static int text_context(const bContext *C, const char *member, bContextDataResult *result)
{
SpaceText *st= CTX_wm_space_text(C);
if(CTX_data_dir(member)) {
- static const char *dir[] = {"edit_text", NULL};
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, text_context_dir);
return 1;
}
else if(CTX_data_equals(member, "edit_text")) {
@@ -361,7 +409,7 @@ static void text_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- // UI_view2d_view_ortho(C, v2d);
+ // UI_view2d_view_ortho(v2d);
/* data... */
draw_text_main(st, ar);
@@ -372,7 +420,7 @@ static void text_main_area_draw(const bContext *C, ARegion *ar)
/* scrollers? */
}
-static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
+static void text_cursor(wmWindow *win, ScrArea *UNUSED(sa), ARegion *UNUSED(ar))
{
WM_cursor_set(win, BC_TEXTEDITCURSOR);
}
@@ -381,10 +429,10 @@ static void text_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
/* ************* dropboxes ************* */
-static int text_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int text_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_PATH)
- if(ELEM(drag->icon, 0, ICON_FILE_BLANK)) /* rule might not work? */
+ if(ELEM(drag->icon, ICON_FILE_SCRIPT, ICON_FILE_BLANK)) /* rule might not work? */
return 1;
return 0;
}
@@ -410,7 +458,7 @@ static void text_dropboxes(void)
/****************** header region ******************/
/* add handlers, stuff you only do once or on area/region changes */
-static void text_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void text_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 62274fc664a..c047d99c894 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -10,7 +10,6 @@
*
* 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
@@ -37,6 +36,7 @@
#include "BLF_api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_text_types.h"
#include "DNA_space_types.h"
@@ -46,7 +46,7 @@
#include "BKE_context.h"
#include "BKE_suggestions.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
@@ -57,25 +57,22 @@
#include "text_intern.h"
/******************** text font drawing ******************/
-static int mono= -1; // XXX needs proper storage and change all the BLF_* here
+// XXX, fixme
+#define mono blf_mono_font
static void text_font_begin(SpaceText *st)
{
- if(mono == -1)
- mono= BLF_load_mem("monospace", (unsigned char*)datatoc_bmonofont_ttf, datatoc_bmonofont_ttf_size);
-
- BLF_aspect(mono, 1.0);
BLF_size(mono, st->lheight, 72);
}
-static void text_font_end(SpaceText *st)
+static void text_font_end(SpaceText *UNUSED(st))
{
}
-static int text_font_draw(SpaceText *st, int x, int y, char *str)
+static int text_font_draw(SpaceText *UNUSED(st), int x, int y, char *str)
{
BLF_position(mono, x, y, 0);
- BLF_draw(mono, str);
+ BLF_draw(mono, str, 65535); /* XXX, use real length */
return BLF_width(mono, str);
}
@@ -83,17 +80,16 @@ static int text_font_draw(SpaceText *st, int x, int y, char *str)
static int text_font_draw_character(SpaceText *st, int x, int y, char c)
{
char str[2];
-
str[0]= c;
str[1]= '\0';
BLF_position(mono, x, y, 0);
- BLF_draw(mono, str);
+ BLF_draw(mono, str, 1);
return st->cwidth;
}
-int text_font_width(SpaceText *st, char *str)
+int text_font_width(SpaceText *UNUSED(st), const char *str)
{
return BLF_width(mono, str);
}
@@ -128,7 +124,7 @@ static void flatten_string_append(FlattenString *fs, char c, int accum)
fs->pos++;
}
-int flatten_string(SpaceText *st, FlattenString *fs, char *in)
+int flatten_string(SpaceText *st, FlattenString *fs, const char *in)
{
int r = 0, i = 0;
@@ -254,7 +250,7 @@ static int find_bool(char *string)
/* Ensures the format string for the given line is long enough, reallocating
as needed. Allocation is done here, alone, to ensure consistency. */
-int text_check_format_len(TextLine *line, unsigned int len)
+static int text_check_format_len(TextLine *line, unsigned int len)
{
if(line->format) {
if(strlen(line->format) < len) {
@@ -498,7 +494,7 @@ int wrap_width(SpaceText *st, ARegion *ar)
int x, max;
x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- max= (winx-x)/st->cwidth;
+ max= st->cwidth ? (winx-x)/st->cwidth : 0;
return max>8 ? max : 8;
}
@@ -521,9 +517,22 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
linep= text->lines.first;
i= st->top;
while(i>0 && linep) {
- if(linep == linein) return; /* Line before top */
- linep= linep->next;
- i--;
+ int lines= text_get_visible_lines(st, ar, linep->line);
+
+ /* Line before top */
+ if(linep == linein) {
+ if(lines <= i)
+ /* no visible part of line */
+ return;
+ }
+
+ if (i-lines<0) {
+ break;
+ } else {
+ linep= linep->next;
+ (*offl)+= lines-1;
+ i-= lines;
+ }
}
max= wrap_width(st, ar);
@@ -548,10 +557,18 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
while(chars--) {
if(i-start>=max) {
- if(chop && linep==linein && i >= cursin)
+ if(chop && linep==linein && i >= cursin) {
+ if (i==cursin) {
+ (*offl)++;
+ *offc -= end-start;
+ }
+
return;
+ }
+
(*offl)++;
*offc -= end-start;
+
start= end;
end += max;
chop= 1;
@@ -570,7 +587,65 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *
}
}
-static int get_char_pos(SpaceText *st, char *line, int cur)
+void wrap_offset_in_line(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *offl, int *offc)
+{
+ int i, j, start, end, chars, max, chop;
+ char ch;
+
+ *offl= *offc= 0;
+
+ if(!st->text) return;
+ if(!st->wordwrap) return;
+
+ max= wrap_width(st, ar);
+
+ start= 0;
+ end= max;
+ chop= 1;
+ *offc= 0;
+
+ for(i=0, j=0; linein->line[j]!='\0'; j++) {
+
+ /* Mimic replacement of tabs */
+ ch= linein->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ if(i<cursin) cursin += chars-1;
+ ch= ' ';
+ }
+ else
+ chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ if(chop && i >= cursin) {
+ if (i==cursin) {
+ (*offl)++;
+ *offc -= end-start;
+ }
+
+ return;
+ }
+
+ (*offl)++;
+ *offc -= end-start;
+
+ start= end;
+ end += max;
+ chop= 1;
+ }
+ else if(ch==' ' || ch=='-') {
+ end = i+1;
+ chop= 0;
+ if(i >= cursin)
+ return;
+ }
+ i++;
+ }
+ }
+}
+
+int text_get_char_pos(SpaceText *st, const char *line, int cur)
{
int a=0, i;
@@ -583,7 +658,7 @@ static int get_char_pos(SpaceText *st, char *line, int cur)
return a;
}
-static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format)
+static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format, int skip)
{
FlattenString fs;
int basex, i, a, len, start, end, max, lines;
@@ -599,6 +674,14 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
end= max;
for(i=0; i<len; i++) {
if(i-start >= max) {
+ /* skip hidden part of line */
+ if(skip) {
+ skip--;
+ start= end;
+ end += max;
+ continue;
+ }
+
/* Draw the visible portion of text on the overshot line */
for(a=start; a<end; a++) {
if(st->showsyntax && format) format_draw_color(format[a]);
@@ -609,6 +692,8 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
lines++;
start= end;
end += max;
+
+ if(y<=0) break;
}
else if(str[i]==' ' || str[i]=='-') {
end = i+1;
@@ -616,7 +701,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
}
/* Draw the remaining text */
- for(a=start; a<len; a++) {
+ for(a=start; a<len && y > 0; a++) {
if(st->showsyntax && format)
format_draw_color(format[a]);
@@ -631,7 +716,7 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char
static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, char *format)
{
FlattenString fs;
- int r=0, w= 0;
+ int r=0, w= 0, amount;
int *acc;
char *in;
@@ -647,18 +732,26 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
if(draw) {
if(st->showsyntax && format) {
- int amount, a;
+ int a;
format = format+cshift;
amount = strlen(in);
+ if(maxwidth)
+ amount= MIN2(amount, maxwidth);
for(a = 0; a < amount; a++) {
format_draw_color(format[a]);
x += text_font_draw_character(st, x, y, in[a]);
}
}
- else
+ else {
+ amount = strlen(in);
+ if(maxwidth)
+ amount= MIN2(amount, maxwidth);
+
+ in[amount]= 0;
text_font_draw(st, x, y, in);
+ }
}
else {
while(w-- && *acc++ < maxwidth)
@@ -675,23 +768,313 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
return r+TXT_OFFSET;
}
+/************************ cache utilities *****************************/
+
+typedef struct DrawCache {
+ int *line_height;
+ int total_lines, nlines;
+
+ /* this is needed to check cache relevance */
+ int winx, wordwrap, showlinenrs, tabnumber;
+ short lheight;
+ char cwidth;
+ char text_id[MAX_ID_NAME];
+
+ /* for partial lines recalculation */
+ short update_flag;
+ int valid_head, valid_tail; /* amount of unchanged lines */
+} DrawCache;
+
+static void text_drawcache_init(SpaceText *st)
+{
+ DrawCache *drawcache= MEM_callocN(sizeof (DrawCache), "text draw cache");
+
+ drawcache->winx= -1;
+ drawcache->nlines= BLI_countlist(&st->text->lines);
+ drawcache->text_id[0]= '\0';
+
+ st->drawcache= drawcache;
+}
+
+static void text_update_drawcache(SpaceText *st, ARegion *ar)
+{
+ DrawCache *drawcache;
+ int full_update= 0, nlines= 0;
+ Text *txt= st->text;
+
+ if(!st->drawcache) text_drawcache_init(st);
+
+ text_update_character_width(st);
+
+ drawcache= (DrawCache *)st->drawcache;
+ nlines= drawcache->nlines;
+
+ /* check if full cache update is needed */
+ full_update|= drawcache->winx != ar->winx; /* area was resized */
+ full_update|= drawcache->wordwrap != st->wordwrap; /* word-wrapping option was toggled */
+ full_update|= drawcache->showlinenrs != st->showlinenrs; /* word-wrapping option was toggled */
+ full_update|= drawcache->tabnumber != st->tabnumber; /* word-wrapping option was toggled */
+ full_update|= drawcache->lheight != st->lheight; /* word-wrapping option was toggled */
+ full_update|= drawcache->cwidth != st->cwidth; /* word-wrapping option was toggled */
+ full_update|= strncmp(drawcache->text_id, txt->id.name, MAX_ID_NAME); /* text datablock was changed */
+
+ if(st->wordwrap) {
+ /* update line heights */
+ if(full_update || !drawcache->line_height) {
+ drawcache->valid_head = 0;
+ drawcache->valid_tail = 0;
+ drawcache->update_flag = 1;
+ }
+
+ if(drawcache->update_flag) {
+ TextLine *line= st->text->lines.first;
+ int lineno= 0, size, lines_count;
+ int *fp= drawcache->line_height, *new_tail, *old_tail;
+
+ nlines= BLI_countlist(&txt->lines);
+ size= sizeof(int)*nlines;
+
+ if(fp) fp= MEM_reallocN(fp, size);
+ else fp= MEM_callocN(size, "text drawcache line_height");
+
+ drawcache->valid_tail= drawcache->valid_head= 0;
+ old_tail= fp + drawcache->nlines - drawcache->valid_tail;
+ new_tail= fp + nlines - drawcache->valid_tail;
+ memmove(new_tail, old_tail, drawcache->valid_tail);
+
+ drawcache->total_lines= 0;
+
+ if(st->showlinenrs)
+ st->linenrs_tot= (int)floor(log10((float)nlines)) + 1;
+
+ while(line) {
+ if(drawcache->valid_head) { /* we're inside valid head lines */
+ lines_count= fp[lineno];
+ drawcache->valid_head--;
+ } else if (lineno > new_tail - fp) { /* we-re inside valid tail lines */
+ lines_count= fp[lineno];
+ } else {
+ lines_count= text_get_visible_lines(st, ar, line->line);
+ }
+
+ fp[lineno]= lines_count;
+
+ line= line->next;
+ lineno++;
+ drawcache->total_lines+= lines_count;
+ }
+
+ drawcache->line_height= fp;
+ }
+ } else {
+ if(drawcache->line_height) {
+ MEM_freeN(drawcache->line_height);
+ drawcache->line_height= NULL;
+ }
+
+ if(full_update || drawcache->update_flag) {
+ nlines= BLI_countlist(&txt->lines);
+
+ if(st->showlinenrs)
+ st->linenrs_tot= (int)floor(log10((float)nlines)) + 1;
+ }
+
+ drawcache->total_lines= nlines;
+ }
+
+ drawcache->nlines= nlines;
+
+ /* store settings */
+ drawcache->winx = ar->winx;
+ drawcache->wordwrap = st->wordwrap;
+ drawcache->lheight = st->lheight;
+ drawcache->cwidth = st->cwidth;
+ drawcache->showlinenrs = st->showlinenrs;
+ drawcache->tabnumber = st->tabnumber;
+
+ strncpy(drawcache->text_id, txt->id.name, MAX_ID_NAME);
+
+ /* clear update flag */
+ drawcache->update_flag = 0;
+ drawcache->valid_head = 0;
+ drawcache->valid_tail = 0;
+}
+
+void text_drawcache_tag_update(SpaceText *st, int full)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ if(drawcache) {
+ Text *txt= st->text;
+
+ if(drawcache->update_flag) {
+ /* happens when tagging update from space listener */
+ /* should do nothing to prevent locally tagged cache be fully recalculated */
+ return;
+ }
+
+ if(!full) {
+ int sellno= BLI_findindex(&txt->lines, txt->sell);
+ int curlno= BLI_findindex(&txt->lines, txt->curl);
+
+ if(curlno < sellno) {
+ drawcache->valid_head= curlno;
+ drawcache->valid_tail= drawcache->nlines - sellno - 1;
+ } else {
+ drawcache->valid_head= sellno;
+ drawcache->valid_tail= drawcache->nlines - curlno - 1;
+ }
+
+ /* quick cache recalculation is also used in delete operator,
+ which could merge lines which are adjusent to current selection lines
+ expand recalculate area to this lines */
+ if(drawcache->valid_head>0) drawcache->valid_head--;
+ if(drawcache->valid_tail>0) drawcache->valid_tail--;
+ } else {
+ drawcache->valid_head= 0;
+ drawcache->valid_tail= 0;
+ }
+
+ drawcache->update_flag= 1;
+ }
+}
+
+void text_free_caches(SpaceText *st)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ if(drawcache) {
+ if(drawcache->line_height)
+ MEM_freeN(drawcache->line_height);
+
+ MEM_freeN(drawcache);
+ }
+}
+
+/************************ word-wrap utilities *****************************/
+
+/* cache should be updated in caller */
+static int text_get_visible_lines_no(SpaceText *st, int lineno)
+{
+ DrawCache *drawcache= (DrawCache *)st->drawcache;
+
+ return drawcache->line_height[lineno];
+}
+
+int text_get_visible_lines(SpaceText *st, ARegion *ar, const char *str)
+{
+ int i, j, start, end, max, lines, chars;
+ char ch;
+
+ max= wrap_width(st, ar);
+ lines= 1;
+ start= 0;
+ end= max;
+ for(i= 0, j= 0; str[j] != '\0'; j++) {
+ /* Mimic replacement of tabs */
+ ch= str[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start >= max) {
+ lines++;
+ start= end;
+ end += max;
+ }
+ else if(ch==' ' || ch=='-') {
+ end= i+1;
+ }
+
+ i++;
+ }
+ }
+
+ return lines;
+}
+
+int text_get_span_wrap(SpaceText *st, ARegion *ar, TextLine *from, TextLine *to)
+{
+ if(st->wordwrap) {
+ int ret=0;
+ TextLine *tmp= from;
+
+ /* Look forwards */
+ while (tmp) {
+ if (tmp == to) return ret;
+ ret+= text_get_visible_lines(st, ar, tmp->line);
+ tmp= tmp->next;
+ }
+
+ return ret;
+ } else return txt_get_span(from, to);
+}
+
+int text_get_total_lines(SpaceText *st, ARegion *ar)
+{
+ DrawCache *drawcache;
+
+ text_update_drawcache(st, ar);
+ drawcache= (DrawCache *)st->drawcache;
+
+ return drawcache->total_lines;
+}
+
+/* Move pointer to first visible line (top) */
+static TextLine *first_visible_line(SpaceText *st, ARegion *ar, int *wrap_top)
+{
+ Text *text= st->text;
+ TextLine* pline= text->lines.first;
+ int i= st->top, lineno= 0;
+
+ text_update_drawcache(st, ar);
+
+ if(wrap_top) *wrap_top= 0;
+
+ if(st->wordwrap) {
+ while(i>0 && pline) {
+ int lines= text_get_visible_lines_no(st, lineno);
+
+ if (i-lines<0) {
+ if(wrap_top) *wrap_top= i;
+ break;
+ } else {
+ pline= pline->next;
+ i-= lines;
+ lineno++;
+ }
+ }
+ } else {
+ for(i=st->top; pline->next && i>0; i--)
+ pline= pline->next;
+ }
+
+ return pline;
+}
+
/************************ draw scrollbar *****************************/
-static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
+static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll, rcti *back)
{
- int lhlstart, lhlend, ltexth;
+ int lhlstart, lhlend, ltexth, sell_off, curl_off;
short barheight, barstart, hlstart, hlend, blank_lines;
short pix_available, pix_top_margin, pix_bottom_margin, pix_bardiff;
pix_top_margin = 8;
pix_bottom_margin = 4;
pix_available = ar->winy - pix_top_margin - pix_bottom_margin;
- ltexth= txt_get_span(st->text->lines.first, st->text->lines.last);
+ ltexth= text_get_total_lines(st, ar);
blank_lines = st->viewlines / 2;
/* nicer code: use scroll rect for entire bar */
- //scroll->xmin= 5;
- //scroll->xmax= 17;
+ back->xmin= ar->winx -18;
+ back->xmax= ar->winx;
+ back->ymin= 0;
+ back->ymax= ar->winy;
+
scroll->xmin= ar->winx - 17;
scroll->xmax= ar->winx - 5;
scroll->ymin= 4;
@@ -722,10 +1105,10 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
st->pix_per_line= (pix_available > 0)? (float) ltexth/pix_available: 0;
if(st->pix_per_line<.1) st->pix_per_line=.1f;
- lhlstart = MIN2(txt_get_span(st->text->lines.first, st->text->curl),
- txt_get_span(st->text->lines.first, st->text->sell));
- lhlend = MAX2(txt_get_span(st->text->lines.first, st->text->curl),
- txt_get_span(st->text->lines.first, st->text->sell));
+ curl_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->curl);
+ sell_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->sell);
+ lhlstart = MIN2(curl_off, sell_off);
+ lhlend = MAX2(curl_off, sell_off);
if(ltexth > 0) {
hlstart = (lhlstart * pix_available)/ltexth;
@@ -787,19 +1170,23 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll)
CLAMP(st->txtscroll.ymax, pix_bottom_margin, ar->winy - pix_top_margin);
}
-static void draw_textscroll(SpaceText *st, ARegion *ar, rcti *scroll)
+static void draw_textscroll(SpaceText *st, rcti *scroll, rcti *back)
{
bTheme *btheme= U.themes.first;
uiWidgetColors wcol= btheme->tui.wcol_scroll;
- char col[3];
+ unsigned char col[4];
float rad;
+ UI_ThemeColor(TH_BACK);
+ glRecti(back->xmin, back->ymin, back->xmax, back->ymax);
+
uiWidgetScrollDraw(&wcol, scroll, &st->txtbar, (st->flags & ST_SCROLL_SELECT)?UI_SCROLL_PRESSED:0);
uiSetRoundBox(15);
rad= 0.4f*MIN2(st->txtscroll.xmax - st->txtscroll.xmin, st->txtscroll.ymax - st->txtscroll.ymin);
UI_GetThemeColor3ubv(TH_HILITE, col);
- glColor4ub(col[0], col[1], col[2], 48);
+ col[3]= 48;
+ glColor4ubv(col);
glEnable(GL_BLEND);
uiRoundBox(st->txtscroll.xmin+1, st->txtscroll.ymin, st->txtscroll.xmax-1, st->txtscroll.ymax, rad);
glDisable(GL_BLEND);
@@ -811,78 +1198,80 @@ static void draw_markers(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
TextMarker *marker, *next;
- TextLine *top, *bottom, *line;
- int offl, offc, i, cy, x1, x2, y1, y2, x, y;
+ TextLine *top, *line;
+ int offl, offc, i, x1, x2, y1, y2, x, y;
+ int topi, topy;
+
+ /* Move pointer to first visible line (top) */
+ top= first_visible_line(st, ar, NULL);
+ topi= BLI_findindex(&text->lines, top);
- for(i=st->top, top= text->lines.first; top->next && i>0; i--)
- top= top->next;
+ topy= txt_get_span(text->lines.first, top);
- for(i=st->viewlines-1, bottom=top; bottom->next && i>0; i--)
- bottom= bottom->next;
-
for(marker= text->markers.first; marker; marker= next) {
next= marker->next;
- for(cy= 0, line= top; line; cy++, line= line->next) {
- if(cy+st->top==marker->lineno) {
- /* Remove broken markers */
- if(marker->end>line->len || marker->start>marker->end) {
- BLI_freelinkN(&text->markers, marker);
- break;
- }
+ /* invisible line (before top) */
+ if(marker->lineno<topi) continue;
- wrap_offset(st, ar, line, marker->start, &offl, &offc);
- x1= get_char_pos(st, line->line, marker->start) - st->left + offc;
- y1= cy + offl;
- wrap_offset(st, ar, line, marker->end, &offl, &offc);
- x2= get_char_pos(st, line->line, marker->end) - st->left + offc;
- y2= cy + offl;
-
- glColor3ub(marker->color[0], marker->color[1], marker->color[2]);
- x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- y= ar->winy-3;
-
- if(y1==y2) {
- y -= y1*st->lheight;
- glBegin(GL_LINE_LOOP);
- glVertex2i(x+x2*st->cwidth+1, y);
- glVertex2i(x+x1*st->cwidth-2, y);
- glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
- glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
- glEnd();
- }
- else {
- y -= y1*st->lheight;
- glBegin(GL_LINE_STRIP);
- glVertex2i(ar->winx, y);
- glVertex2i(x+x1*st->cwidth-2, y);
- glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
- glVertex2i(ar->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
-
- for(i=y1+1; i<y2; i++) {
- glBegin(GL_LINES);
- glVertex2i(x, y);
- glVertex2i(ar->winx, y);
- glVertex2i(x, y-st->lheight);
- glVertex2i(ar->winx, y-st->lheight);
- glEnd();
- y-=st->lheight;
- }
+ line= BLI_findlink(&text->lines, marker->lineno);
- glBegin(GL_LINE_STRIP);
- glVertex2i(x, y);
- glVertex2i(x+x2*st->cwidth+1, y);
- glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
- glVertex2i(x, y-st->lheight);
- glEnd();
- }
+ /* Remove broken markers */
+ if(marker->end>line->len || marker->start>marker->end) {
+ BLI_freelinkN(&text->markers, marker);
+ continue;
+ }
- break;
+ wrap_offset(st, ar, line, marker->start, &offl, &offc);
+ y1 = txt_get_span(top, line) - st->top + offl + topy;
+ x1 = text_get_char_pos(st, line->line, marker->start) - st->left + offc;
+
+ wrap_offset(st, ar, line, marker->end, &offl, &offc);
+ y2 = txt_get_span(top, line) - st->top + offl + topy;
+ x2 = text_get_char_pos(st, line->line, marker->end) - st->left + offc;
+
+ /* invisible part of line (before top, after last visible line) */
+ if(y2 < 0 || y1 > st->top+st->viewlines) continue;
+
+ glColor3ubv(marker->color);
+ x= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
+ y= ar->winy-3;
+
+ if(y1==y2) {
+ y -= y1*st->lheight;
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(x+x2*st->cwidth+1, y);
+ glVertex2i(x+x1*st->cwidth-2, y);
+ glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
+ glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
+ glEnd();
+ }
+ else {
+ y -= y1*st->lheight;
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(ar->winx, y);
+ glVertex2i(x+x1*st->cwidth-2, y);
+ glVertex2i(x+x1*st->cwidth-2, y-st->lheight);
+ glVertex2i(ar->winx, y-st->lheight);
+ glEnd();
+ y-=st->lheight;
+
+ for(i=y1+1; i<y2; i++) {
+ glBegin(GL_LINES);
+ glVertex2i(x, y);
+ glVertex2i(ar->winx, y);
+ glVertex2i(x, y-st->lheight);
+ glVertex2i(ar->winx, y-st->lheight);
+ glEnd();
+ y-=st->lheight;
}
- if(line==bottom) break;
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(x, y);
+ glVertex2i(x+x2*st->cwidth+1, y);
+ glVertex2i(x+x2*st->cwidth+1, y-st->lheight);
+ glVertex2i(x, y-st->lheight);
+ glEnd();
}
}
}
@@ -893,7 +1282,7 @@ static void draw_documentation(SpaceText *st, ARegion *ar)
{
TextLine *tmp;
char *docs, buf[DOC_WIDTH+1], *p;
- int len, i, br, lines;
+ int i, br, lines;
int boxw, boxh, l, x, y, top;
if(!st || !st->text) return;
@@ -918,7 +1307,6 @@ static void draw_documentation(SpaceText *st, ARegion *ar)
}
top= y= ar->winy - st->lheight*l - 2;
- len= strlen(docs);
boxw= DOC_WIDTH*st->cwidth + 20;
boxh= (DOC_HEIGHT+1)*st->lheight;
@@ -1033,7 +1421,7 @@ static void draw_suggestion_list(SpaceText *st, ARegion *ar)
UI_ThemeColor(TH_SHADE2);
glRecti(x+16, y-3, x+16+w, y+st->lheight-3);
}
- b=1; /* b=1 colour block, text is default. b=0 no block, colour text */
+ b=1; /* b=1 color block, text is default. b=0 no block, color text */
switch (item->type) {
case 'k': UI_ThemeColor(TH_SYNTAX_B); b=0; break;
case 'm': UI_ThemeColor(TH_TEXT); break;
@@ -1057,17 +1445,18 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
int vcurl, vcurc, vsell, vselc, hidden=0;
- int offl, offc, x, y, w, i;
-
+ int x, y, w, i;
+
/* Draw the selection */
if(text->curl!=text->sell || text->curc!=text->selc) {
+ int offl, offc;
/* Convert all to view space character coordinates */
wrap_offset(st, ar, text->curl, text->curc, &offl, &offc);
vcurl = txt_get_span(text->lines.first, text->curl) - st->top + offl;
- vcurc = get_char_pos(st, text->curl->line, text->curc) - st->left + offc;
+ vcurc = text_get_char_pos(st, text->curl->line, text->curc) - st->left + offc;
wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
+ vselc = text_get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
if(vcurc<0) vcurc=0;
if(vselc<0) vselc=0, hidden=1;
@@ -1104,9 +1493,10 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
}
else {
+ int offl, offc;
wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
vsell = txt_get_span(text->lines.first, text->sell) - st->top + offl;
- vselc = get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
+ vselc = text_get_char_pos(st, text->sell->line, text->selc) - st->left + offc;
if(vselc<0) {
vselc= 0;
@@ -1115,17 +1505,30 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
}
if(st->line_hlight) {
- y= ar->winy-2 - vsell*st->lheight;
- if(!(y<0 || y > ar->winy)) { /* check we need to draw */
- int x1= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
- int x2= x1 + ar->winx;
- y= ar->winy-2 - vsell*st->lheight;
-
+ int x1, x2, y1, y2;
+
+ if(st->wordwrap) {
+ int visible_lines = text_get_visible_lines(st, ar, text->sell->line);
+ int offl, offc;
+
+ wrap_offset_in_line(st, ar, text->sell, text->selc, &offl, &offc);
+
+ y1= ar->winy-2 - (vsell-offl)*st->lheight;
+ y2= y1-st->lheight*visible_lines+1;
+ } else {
+ y1= ar->winy-2 - vsell*st->lheight;
+ y2= y1-st->lheight+1;
+ }
+
+ if(!(y1<0 || y2 > ar->winy)) { /* check we need to draw */
+ x1= st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
+ x2= x1 + ar->winx;
+
glColor4ub(255, 255, 255, 32);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- glRecti(x1-4, y, x2, y-st->lheight+1);
+ glRecti(x1-4, y1, x2, y2);
glDisable(GL_BLEND);
}
}
@@ -1138,8 +1541,10 @@ static void draw_cursor(SpaceText *st, ARegion *ar)
if(st->overwrite) {
char ch= text->sell->line[text->selc];
- if(!ch) ch= ' ';
+
w= st->cwidth;
+ if(ch=='\t') w*= st->tabnumber-(vselc+st->left)%st->tabnumber;
+
UI_ThemeColor(TH_HILITE);
glRecti(x, y-st->lheight-1, x+w, y-st->lheight+1);
}
@@ -1243,7 +1648,7 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
/* draw opening bracket */
ch= startl->line[startc];
wrap_offset(st, ar, startl, startc, &offl, &offc);
- viewc= get_char_pos(st, startl->line, startc) - st->left + offc;
+ viewc= text_get_char_pos(st, startl->line, startc) - st->left + offc;
if(viewc >= 0){
viewl= txt_get_span(text->lines.first, startl) - st->top + offl;
@@ -1255,7 +1660,7 @@ static void draw_brackets(SpaceText *st, ARegion *ar)
/* draw closing bracket */
ch= endl->line[endc];
wrap_offset(st, ar, endl, endc, &offl, &offc);
- viewc= get_char_pos(st, endl->line, endc) - st->left + offc;
+ viewc= text_get_char_pos(st, endl->line, endc) - st->left + offc;
if(viewc >= 0) {
viewl= txt_get_span(text->lines.first, endl) - st->top + offl;
@@ -1271,14 +1676,17 @@ void draw_text_main(SpaceText *st, ARegion *ar)
{
Text *text= st->text;
TextLine *tmp;
- rcti scroll;
+ rcti scroll, back;
char linenr[12];
- int i, x, y, winx, linecount= 0;
+ int i, x, y, winx, linecount= 0, lineno= 0;
+ int wraplinecount= 0, wrap_skip= 0;
/* if no text, nothing to do */
if(!text)
return;
+ text_update_drawcache(st, ar);
+
/* make sure all the positional pointers exist */
if(!text->curl || !text->sell || !text->lines.first || !text->lines.last)
txt_clean_text(text);
@@ -1287,16 +1695,32 @@ void draw_text_main(SpaceText *st, ARegion *ar)
else st->viewlines= 0;
/* update rects for scroll */
- calc_text_rcts(st, ar, &scroll); /* scroll will hold the entire bar size */
+ calc_text_rcts(st, ar, &scroll, &back); /* scroll will hold the entire bar size */
/* update syntax formatting if needed */
tmp= text->lines.first;
+ lineno= 0;
for(i= 0; i<st->top && tmp; i++) {
if(st->showsyntax && !tmp->format)
txt_format_line(st, tmp, 0);
- tmp= tmp->next;
- linecount++;
+ if(st->wordwrap) {
+ int lines= text_get_visible_lines_no(st, lineno);
+
+ if (wraplinecount+lines>st->top) {
+ wrap_skip= st->top-wraplinecount;
+ break;
+ } else {
+ wraplinecount+= lines;
+ tmp= tmp->next;
+ linecount++;
+ }
+ } else {
+ tmp= tmp->next;
+ linecount++;
+ }
+
+ lineno++;
}
text_font_begin(st);
@@ -1305,7 +1729,6 @@ void draw_text_main(SpaceText *st, ARegion *ar)
/* draw line numbers background */
if(st->showlinenrs) {
- st->linenrs_tot = (int)floor(log10((float)(linecount + st->viewlines))) + 1;
x= TXT_OFFSET + TEXTXLOC;
UI_ThemeColor(TH_GRID);
@@ -1328,7 +1751,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
if(st->showsyntax && !tmp->format)
txt_format_line(st, tmp, 0);
- if(st->showlinenrs) {
+ if(st->showlinenrs && !wrap_skip) {
/* draw line number */
if(tmp == text->curl)
UI_ThemeColor(TH_HILITE);
@@ -1344,21 +1767,32 @@ void draw_text_main(SpaceText *st, ARegion *ar)
if(st->wordwrap) {
/* draw word wrapped text */
- int lines = text_draw_wrapped(st, tmp->line, x, y, winx-x, tmp->format);
+ int lines = text_draw_wrapped(st, tmp->line, x, y, winx-x, tmp->format, wrap_skip);
y -= lines*st->lheight;
}
else {
/* draw unwrapped text */
- text_draw(st, tmp->line, st->left, 0, 1, x, y, tmp->format);
+ text_draw(st, tmp->line, st->left, ar->winx/st->cwidth, 1, x, y, tmp->format);
y -= st->lheight;
}
+
+ wrap_skip= 0;
}
+ if(st->flags&ST_SHOW_MARGIN) {
+ UI_ThemeColor(TH_HILITE);
+
+ glBegin(GL_LINES);
+ glVertex2i(x+st->cwidth*st->margin_column, 0);
+ glVertex2i(x+st->cwidth*st->margin_column, ar->winy - 2);
+ glEnd();
+ }
+
/* draw other stuff */
draw_brackets(st, ar);
draw_markers(st, ar);
glTranslatef(0.375f, 0.375f, 0.0f); /* XXX scroll requires exact pixel space */
- draw_textscroll(st, ar, &scroll);
+ draw_textscroll(st, &scroll, &back);
draw_documentation(st, ar);
draw_suggestion_list(st, ar);
@@ -1398,6 +1832,12 @@ void text_update_cursor_moved(bContext *C)
text_update_character_width(st);
i= txt_get_span(text->lines.first, text->sell);
+ if(st->wordwrap) {
+ int offl, offc;
+ wrap_offset(st, CTX_wm_region(C), text->sell, text->selc, &offl, &offc);
+ i+= offl;
+ }
+
if(st->top+st->viewlines <= i || st->top > i)
st->top= i - st->viewlines/2;
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index 672940cf3cb..8e209365c0c 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,6 +47,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
@@ -57,7 +58,7 @@
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// XXX #include "BPY_menus.h"
#endif
@@ -69,7 +70,7 @@
/************************** properties ******************************/
-ARegion *text_has_properties_region(ScrArea *sa)
+static ARegion *text_has_properties_region(ScrArea *sa)
{
ARegion *ar, *arnew;
@@ -101,7 +102,7 @@ static int properties_poll(bContext *C)
return (CTX_wm_space_text(C) != NULL);
}
-static int properties_exec(bContext *C, wmOperator *op)
+static int properties_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= text_has_properties_region(sa);
@@ -133,23 +134,23 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", 0);
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
if(txt_has_sel(text)) {
- uiItemO(layout, NULL, 0, "TEXT_OT_cut");
- uiItemO(layout, NULL, 0, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
}
- uiItemO(layout, NULL, 0, "TEXT_OT_paste");
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
- uiItemO(layout, NULL, 0, "TEXT_OT_save");
- uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
- uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -159,10 +160,10 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Edit", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_cut");
- uiItemO(layout, NULL, 0, "TEXT_OT_copy");
- uiItemO(layout, NULL, 0, "TEXT_OT_paste");
+ pup= uiPupMenuBegin(C, "Edit", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
uiPupMenuEnd(C, pup);
}
@@ -172,18 +173,18 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
- uiItemO(layout, NULL, 0, "TEXT_OT_save");
- uiItemO(layout, NULL, 0, "TEXT_OT_save_as");
- uiItemO(layout, NULL, 0, "TEXT_OT_run_script");
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", 0);
- uiItemO(layout, NULL, 0, "TEXT_OT_new");
- uiItemO(layout, NULL, 0, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NULL);
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -193,7 +194,7 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Text", 0);
+ pup= uiPupMenuBegin(C, "Text", ICON_NULL);
uiItemEnumO(layout, "TEXT_OT_move", "Top of File", 0, "type", FILE_TOP);
uiItemEnumO(layout, "TEXT_OT_move", "Bottom of File", 0, "type", FILE_BOTTOM);
uiItemEnumO(layout, "TEXT_OT_move", "Page Up", 0, "type", PREV_PAGE);
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index a93f30ac62a..c8e973811e2 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,16 +44,10 @@ struct wmWindowManager;
/* text_draw.c */
void draw_text_main(struct SpaceText *st, struct ARegion *ar);
-int text_check_bracket(char ch);
-int text_check_delim(char ch);
-int text_check_digit(char ch);
-int text_check_identifier(char ch);
-int text_check_whitespace(char ch);
-
int text_font_width_character(struct SpaceText *st);
-int text_font_width(struct SpaceText *st, char *str);
+int text_font_width(struct SpaceText *st, const char *str);
-void text_update_line_edited(struct Text *text, struct TextLine *line);
+void text_update_line_edited(struct TextLine *line);
void text_update_edited(struct Text *text);
void text_update_character_width(struct SpaceText *st);
void text_update_cursor_moved(struct bContext *C);
@@ -85,17 +79,25 @@ typedef struct FlattenString {
int pos, len;
} FlattenString;
-int flatten_string(struct SpaceText *st, FlattenString *fs, char *in);
+int flatten_string(struct SpaceText *st, FlattenString *fs, const char *in);
void flatten_string_free(FlattenString *fs);
int wrap_width(struct SpaceText *st, struct ARegion *ar);
void wrap_offset(struct SpaceText *st, struct ARegion *ar, struct TextLine *linein, int cursin, int *offl, int *offc);
+void wrap_offset_in_line(struct SpaceText *st, struct ARegion *ar, struct TextLine *linep, int cursin, int *offl, int *offc);
+int text_get_char_pos(struct SpaceText *st, const char *line, int cur);
+
+void text_drawcache_tag_update(struct SpaceText *st, int full);
+void text_free_caches(struct SpaceText *st);
int text_file_modified(struct Text *text);
int text_do_suggest_select(struct SpaceText *st, struct ARegion *ar);
-void text_pop_suggest_list();
+void text_pop_suggest_list(void);
+int text_get_visible_lines(struct SpaceText *st, struct ARegion *ar, const char *str);
+int text_get_span_wrap(struct SpaceText *st, struct ARegion *ar, struct TextLine *from, struct TextLine *to);
+int text_get_total_lines(struct SpaceText *st, struct ARegion *ar);
/* text_ops.c */
enum { LINE_BEGIN, LINE_END, FILE_TOP, FILE_BOTTOM, PREV_CHAR, NEXT_CHAR,
@@ -131,6 +133,7 @@ void TEXT_OT_previous_marker(struct wmOperatorType *ot);
void TEXT_OT_select_line(struct wmOperatorType *ot);
void TEXT_OT_select_all(struct wmOperatorType *ot);
+void TEXT_OT_select_word(struct wmOperatorType *ot);
void TEXT_OT_jump(struct wmOperatorType *ot);
void TEXT_OT_move(struct wmOperatorType *ot);
@@ -140,6 +143,7 @@ void TEXT_OT_overwrite_toggle(struct wmOperatorType *ot);
void TEXT_OT_scroll(struct wmOperatorType *ot);
void TEXT_OT_scroll_bar(struct wmOperatorType *ot);
+void TEXT_OT_selection_set(struct wmOperatorType *ot);
void TEXT_OT_cursor_set(struct wmOperatorType *ot);
void TEXT_OT_line_number(struct wmOperatorType *ot);
@@ -155,5 +159,8 @@ void TEXT_OT_to_3d_object(struct wmOperatorType *ot);
void TEXT_OT_resolve_conflict(struct wmOperatorType *ot);
+/* space_text.c */
+extern const char *text_context_dir[]; /* doc access */
+
#endif /* ED_TEXT_INTERN_H */
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index d39056c6bbc..10c98a06511 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,8 @@
#include "DNA_userdef_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "PIL_time.h"
#include "BKE_context.h"
@@ -50,6 +52,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "ED_text.h"
#include "ED_curve.h"
#include "ED_screen.h"
#include "UI_interface.h"
@@ -58,7 +61,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -66,7 +69,7 @@
/************************ poll ***************************/
-static int text_new_poll(bContext *C)
+static int text_new_poll(bContext *UNUSED(C))
{
return 1;
}
@@ -122,10 +125,9 @@ static int text_region_edit_poll(bContext *C)
return 1;
}
-
/********************** updates *********************/
-void text_update_line_edited(Text *text, TextLine *line)
+void text_update_line_edited(TextLine *line)
{
if(!line)
return;
@@ -142,12 +144,12 @@ void text_update_edited(Text *text)
TextLine *line;
for(line=text->lines.first; line; line=line->next)
- text_update_line_edited(text, line);
+ text_update_line_edited(line);
}
/******************* new operator *********************/
-static int new_exec(bContext *C, wmOperator *op)
+static int new_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text;
@@ -162,7 +164,9 @@ static int new_exec(bContext *C, wmOperator *op)
if(prop) {
/* when creating new ID blocks, use is already 1, but RNA
* pointer se also increases user, so this compensates it */
- text->id.us--;
+ /* doesnt always seem to happen... (ton) */
+ if(text->id.us>1)
+ text->id.us--;
RNA_id_pointer_create(&text->id, &idptr);
RNA_property_pointer_set(&ptr, prop, idptr);
@@ -171,6 +175,7 @@ static int new_exec(bContext *C, wmOperator *op)
else if(st) {
st->text= text;
st->top= 0;
+ text_drawcache_tag_update(st, 1);
}
WM_event_add_notifier(C, NC_TEXT|NA_ADDED, text);
@@ -203,7 +208,7 @@ static void open_init(bContext *C, wmOperator *op)
uiIDContextProperty(C, &pprop->ptr, &pprop->prop);
}
-static int open_cancel(bContext *C, wmOperator *op)
+static int open_cancel(bContext *UNUSED(C), wmOperator *op)
{
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
@@ -220,7 +225,7 @@ static int open_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "filepath", str);
- text= add_text(str, G.sce);
+ text= add_text(str, G.main->name);
if(!text) {
if(op->customdata) MEM_freeN(op->customdata);
@@ -254,6 +259,7 @@ static int open_exec(bContext *C, wmOperator *op)
text->name = NULL;
}
+ text_drawcache_tag_update(st, 1);
WM_event_add_notifier(C, NC_TEXT|NA_ADDED, text);
MEM_freeN(op->customdata);
@@ -261,10 +267,10 @@ static int open_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int open_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
- char *path= (text && text->name)? text->name: G.sce;
+ char *path= (text && text->name)? text->name: G.main->name;
if(RNA_property_is_set(op->ptr, "filepath"))
return open_exec(C, op);
@@ -308,13 +314,14 @@ static int reload_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(text->compiled)
- BPY_free_compiled_text(text);
+ BPY_text_free_code(text);
#endif
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
return OPERATOR_FINISHED;
@@ -335,7 +342,13 @@ void TEXT_OT_reload(wmOperatorType *ot)
/******************* delete operator *********************/
-static int unlink_exec(bContext *C, wmOperator *op)
+static int text_unlink_poll(bContext *C)
+{
+ /* it should be possible to unlink texts if they're lib-linked in... */
+ return CTX_data_edit_text(C) != NULL;
+}
+
+static int unlink_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
SpaceText *st= CTX_wm_space_text(C);
@@ -357,7 +370,9 @@ static int unlink_exec(bContext *C, wmOperator *op)
unlink_text(bmain, text);
free_libblock(&bmain->text, text);
- WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, text);
+
+ text_drawcache_tag_update(st, 1);
+ WM_event_add_notifier(C, NC_TEXT|NA_REMOVED, NULL);
return OPERATOR_FINISHED;
}
@@ -372,7 +387,7 @@ void TEXT_OT_unlink(wmOperatorType *ot)
/* api callbacks */
ot->exec= unlink_exec;
ot->invoke= WM_operator_confirm;
- ot->poll= text_edit_poll;
+ ot->poll= text_unlink_poll;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -380,7 +395,7 @@ void TEXT_OT_unlink(wmOperatorType *ot)
/******************* make internal operator *********************/
-static int make_internal_exec(bContext *C, wmOperator *op)
+static int make_internal_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -433,7 +448,7 @@ static void txt_write_file(Text *text, ReportList *reports)
char file[FILE_MAXDIR+FILE_MAXFILE];
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
fp= fopen(file, "w");
if(fp==NULL) {
@@ -506,7 +521,7 @@ static int save_as_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
char *str;
@@ -519,7 +534,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if(text->flags & TXT_ISMEM)
str= text->id.name+2;
else
- str= G.sce;
+ str= G.main->name;
RNA_string_set(op->ptr, "filepath", str);
WM_event_add_fileselect(C, op);
@@ -552,7 +567,9 @@ static int run_script_poll(bContext *C)
static int run_script_exec(bContext *C, wmOperator *op)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
+ (void)C; /* unused */
+
BKE_report(op->reports, RPT_ERROR, "Python disabled in this build");
return OPERATOR_CANCELLED;
@@ -560,13 +577,22 @@ static int run_script_exec(bContext *C, wmOperator *op)
Text *text= CTX_data_edit_text(C);
SpaceText *st= CTX_wm_space_text(C);
- if (BPY_run_python_script(C, NULL, text, op->reports))
+ /* only for comparison */
+ void *curl_prev= text->curl;
+ int curc_prev= text->curc;
+
+ if (BPY_text_exec(C, text, op->reports))
return OPERATOR_FINISHED;
-
+
/* Dont report error messages while live editing */
- if(!(st && st->live_edit))
+ if(!(st && st->live_edit)) {
+ if(text->curl != curl_prev || curc_prev != text->curc) {
+ text_update_cursor_moved(C);
+ WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+ }
+
BKE_report(op->reports, RPT_ERROR, "Python script fail, look in the console for now...");
-
+ }
return OPERATOR_CANCELLED;
#endif
}
@@ -588,9 +614,9 @@ void TEXT_OT_run_script(wmOperatorType *ot)
/******************* refresh pyconstraints operator *********************/
-static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
+static int refresh_pyconstraints_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#if 0
Text *text= CTX_data_edit_text(C);
Object *ob;
@@ -622,7 +648,7 @@ static int refresh_pyconstraints_exec(bContext *C, wmOperator *op)
}
if(update) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
#endif
@@ -738,6 +764,8 @@ static int paste_exec(bContext *C, wmOperator *op)
if(!buf)
return OPERATOR_CANCELLED;
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_insert_buf(text, buf);
text_update_edited(text);
@@ -782,7 +810,7 @@ static void txt_copy_clipboard(Text *text)
}
}
-static int copy_exec(bContext *C, wmOperator *op)
+static int copy_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -809,6 +837,8 @@ static int cut_exec(bContext *C, wmOperator *op)
{
Text *text= CTX_data_edit_text(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_copy_clipboard(text);
txt_delete_selected(text);
@@ -836,10 +866,12 @@ void TEXT_OT_cut(wmOperatorType *ot)
/******************* indent operator *********************/
-static int indent_exec(bContext *C, wmOperator *op)
+static int indent_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
if(txt_has_sel(text)) {
txt_order_cursors(text);
indent(text);
@@ -869,11 +901,13 @@ void TEXT_OT_indent(wmOperatorType *ot)
/******************* unindent operator *********************/
-static int unindent_exec(bContext *C, wmOperator *op)
+static int unindent_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
unindent(text);
@@ -902,13 +936,15 @@ void TEXT_OT_unindent(wmOperatorType *ot)
/******************* line break operator *********************/
-static int line_break_exec(bContext *C, wmOperator *op)
+static int line_break_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
int a, curts;
int space = (text->flags & TXT_TABSTOSPACES) ? st->tabnumber : 1;
+ text_drawcache_tag_update(st, 0);
+
// double check tabs/spaces before splitting the line
curts= setcurr_tab_spaces(text, space);
txt_split_curline(text);
@@ -923,8 +959,8 @@ static int line_break_exec(bContext *C, wmOperator *op)
if(text->curl) {
if(text->curl->prev)
- text_update_line_edited(text, text->curl->prev);
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl->prev);
+ text_update_line_edited(text->curl);
}
text_update_cursor_moved(C);
@@ -947,11 +983,13 @@ void TEXT_OT_line_break(wmOperatorType *ot)
/******************* comment operator *********************/
-static int comment_exec(bContext *C, wmOperator *op)
+static int comment_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
comment(text);
text_update_edited(text);
@@ -978,11 +1016,13 @@ void TEXT_OT_comment(wmOperatorType *ot)
/******************* uncomment operator *********************/
-static int uncomment_exec(bContext *C, wmOperator *op)
+static int uncomment_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
if(txt_has_sel(text)) {
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
txt_order_cursors(text);
uncomment(text);
text_update_edited(text);
@@ -1130,6 +1170,7 @@ static int convert_whitespace_exec(bContext *C, wmOperator *op)
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(st, 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
return OPERATOR_FINISHED;
@@ -1152,7 +1193,7 @@ void TEXT_OT_convert_whitespace(wmOperatorType *ot)
/******************* select all operator *********************/
-static int select_all_exec(bContext *C, wmOperator *op)
+static int select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1178,7 +1219,7 @@ void TEXT_OT_select_all(wmOperatorType *ot)
/******************* select line operator *********************/
-static int select_line_exec(bContext *C, wmOperator *op)
+static int select_line_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1197,14 +1238,41 @@ void TEXT_OT_select_line(wmOperatorType *ot)
ot->idname= "TEXT_OT_select_line";
ot->description= "Select text by line";
- /* api clinebacks */
+ /* api callbacks */
ot->exec= select_line_exec;
ot->poll= text_edit_poll;
}
+/******************* select word operator *********************/
+
+static int select_word_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Text *text= CTX_data_edit_text(C);
+
+ txt_jump_left(text, 0);
+ txt_jump_right(text, 1);
+
+ text_update_cursor_moved(C);
+ WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+
+ return OPERATOR_FINISHED;
+}
+
+void TEXT_OT_select_word(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Select Word";
+ ot->idname= "TEXT_OT_select_word";
+ ot->description= "Select word under cursor";
+
+ /* api callbacks */
+ ot->exec= select_word_exec;
+ ot->poll= text_edit_poll;
+}
+
/******************* previous marker operator *********************/
-static int previous_marker_exec(bContext *C, wmOperator *op)
+static int previous_marker_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
TextMarker *mrk;
@@ -1240,7 +1308,7 @@ void TEXT_OT_previous_marker(wmOperatorType *ot)
/******************* next marker operator *********************/
-static int next_marker_exec(bContext *C, wmOperator *op)
+static int next_marker_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
TextMarker *mrk;
@@ -1276,7 +1344,7 @@ void TEXT_OT_next_marker(wmOperatorType *ot)
/******************* clear all markers operator *********************/
-static int clear_all_markers_exec(bContext *C, wmOperator *op)
+static int clear_all_markers_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -1317,146 +1385,370 @@ static EnumPropertyItem move_type_items[]= {
{NEXT_PAGE, "NEXT_PAGE", 0, "Next Page", ""},
{0, NULL, 0, NULL, NULL}};
+/* get cursor position in line by relative wrapped line and column positions */
+static int text_get_cursor_rel(SpaceText* st, ARegion *ar, TextLine *linein, int rell, int relc)
+{
+ int i, j, start, end, max, chop, curs, loop, endj, found, selc;
+ char ch;
+
+ max= wrap_width(st, ar);
+
+ selc= start= endj= curs= found= 0;
+ end= max;
+ chop= loop= 1;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= linein->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(rell==0 && i-start==relc) {
+ /* current position could be wrapped to next line */
+ /* this should be checked when end of current line would be reached */
+ selc= j;
+ found= 1;
+ }
+ else if(i-end==relc) {
+ curs= j;
+ }
+ if(i-start>=max) {
+ if(found) {
+ /* exact cursor position was found, check if it's */
+ /* still on needed line (hasn't been wrapped) */
+ if(selc>endj && !chop) selc= endj;
+ loop= 0;
+ break;
+ }
+
+ if(chop) endj= j;
+
+ start= end;
+ end += max;
+ chop= 1;
+ rell--;
+
+ if(rell==0 && i-start>=relc) {
+ selc= curs;
+ loop= 0;
+ break;
+ }
+ }
+ else if (ch=='\0') {
+ if(!found) selc= linein->len;
+ loop= 0;
+ break;
+ }
+ else if(ch==' ' || ch=='-') {
+ if(found) {
+ loop= 0;
+ break;
+ }
+
+ if(rell==0 && i-start>=relc) {
+ selc= curs;
+ loop= 0;
+ break;
+ }
+ end= i+1;
+ endj= j;
+ chop= 0;
+ }
+ i++;
+ }
+ }
+
+ return selc;
+}
+
+static int cursor_skip_find_line(SpaceText* st, ARegion *ar,
+ int lines, TextLine **linep, int *charp, int *rell, int *relc)
+{
+ int offl, offc, visible_lines;
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ *relc= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ *rell= lines;
+
+ /* handle current line */
+ if(lines>0) {
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if(*rell-visible_lines+offl>=0) {
+ if(!(*linep)->next) {
+ if(offl < visible_lines-1) {
+ *rell= visible_lines-1;
+ return 1;
+ }
+
+ *charp= (*linep)->len;
+ return 0;
+ }
+
+ *rell-= visible_lines-offl;
+ *linep=(*linep)->next;
+ } else {
+ *rell+= offl;
+ return 1;
+ }
+ } else {
+ if(*rell+offl<=0) {
+ if(!(*linep)->prev) {
+ if(offl) {
+ *rell= 0;
+ return 1;
+ }
+
+ *charp= 0;
+ return 0;
+ }
+
+ *rell+= offl;
+ *linep=(*linep)->prev;
+ } else {
+ *rell+= offl;
+ return 1;
+ }
+ }
+
+ /* skip lines and find destination line and offsets */
+ while(*linep) {
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if(lines<0) { /* moving top */
+ if(*rell+visible_lines >= 0) {
+ *rell+= visible_lines;
+ break;
+ }
+
+ if(!(*linep)->prev) {
+ *rell= 0;
+ break;
+ }
+
+ *rell+= visible_lines;
+ *linep=(*linep)->prev;
+ } else { /* moving bottom */
+ if(*rell-visible_lines < 0) break;
+
+ if(!(*linep)->next) {
+ *rell= visible_lines-1;
+ break;
+ }
+
+ *rell-= visible_lines;
+ *linep=(*linep)->next;
+ }
+ }
+
+ return 1;
+}
+
static void wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offc, lin;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+ char ch;
text_update_character_width(st);
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, -offc);
- text->selc= -offc;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, -offc);
- text->curc= -offc;
- txt_pop_sel(text);
+ oldc= *charp;
+ oldl= txt_get_span(text->lines.first, *linep);
+
+ max= wrap_width(st, ar);
+
+ start= endj= 0;
+ end= max;
+ chop= loop= 1;
+ *charp= 0;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= (*linep)->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ *charp= endj;
+
+ if(j>=oldc) {
+ if(ch=='\0') *charp= start;
+ loop= 0;
+ break;
+ }
+
+ if(chop) endj= j;
+
+ start= end;
+ end += max;
+ chop= 1;
+ }
+ else if(ch==' ' || ch=='-' || ch=='\0') {
+ if(j>=oldc) {
+ *charp= start;
+ loop= 0;
+ break;
+ }
+
+ end= i+1;
+ endj= j+1;
+ chop= 0;
+ }
+ i++;
+ }
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, oldl, *charp);
}
static void wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offc, lin, startl, c;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+ char ch;
text_update_character_width(st);
- lin= txt_get_span(text->lines.first, text->sell);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- startl= offl;
- c= text->selc;
- while (offl==startl && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- } if (offl!=startl) c--;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, lin, text->selc, lin, c);
- text->selc= c;
- } else {
- txt_undo_add_toop(text, UNDO_CTO, lin, text->curc, lin, c);
- text->curc= c;
- txt_pop_sel(text);
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
+
+ oldc= *charp;
+ oldl= txt_get_span(text->lines.first, *linep);
+
+ max= wrap_width(st, ar);
+
+ start= endj= 0;
+ end= max;
+ chop= loop= 1;
+ *charp= 0;
+
+ for(i=0, j=0; loop; j++) {
+ int chars;
+ /* Mimic replacement of tabs */
+ ch= (*linep)->line[j];
+ if(ch=='\t') {
+ chars= st->tabnumber-i%st->tabnumber;
+ ch= ' ';
+ }
+ else chars= 1;
+
+ while(chars--) {
+ if(i-start>=max) {
+ if(chop) endj= j-1;
+
+ if(endj>=oldc) {
+ if(ch=='\0') *charp= (*linep)->len;
+ else *charp= endj;
+ loop= 0;
+ break;
+ }
+
+ start= end;
+ end += max;
+ chop= 1;
+ } else if(ch=='\0') {
+ *charp= (*linep)->len;
+ loop= 0;
+ break;
+ } else if(ch==' ' || ch=='-') {
+ end= i+1;
+ endj= j;
+ chop= 0;
+ }
+ i++;
+ }
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, oldl, *charp);
}
static void wrap_move_up(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, offl_1, offc, fromline, toline, c, target;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, offl, offc, col, newl;
text_update_character_width(st);
- wrap_offset(st, ar, text->sell, 0, &offl_1, &offc);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (offl==offl_1) {
- if (!text->sell->prev) {
- txt_move_bol(text, sel);
- return;
- }
- toline--;
- c= text->sell->prev->len; /* End of prev. line */
- wrap_offset(st, ar, text->sell->prev, c, &offl, &offc);
- c= -offc+target;
+ /* store previous position */
+ oldc= *charp;
+ newl= oldl= txt_get_span(text->lines.first, *linep);
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ col= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ if(offl) {
+ *charp= text_get_cursor_rel(st, ar, *linep, offl-1, col);
+ newl= BLI_findindex(&text->lines, linep);
} else {
- c= -offc-1; /* End of prev. line */
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- c= -offc+target;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline<fromline) text->sell= text->sell->prev;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline<fromline) text->curl= text->curl->prev;
- if(text->curl) {
- if (c>text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
+ if((*linep)->prev) {
+ int visible_lines;
+
+ *linep= (*linep)->prev;
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+ *charp= text_get_cursor_rel(st, ar, *linep, visible_lines-1, col);
+ newl--;
+ } else *charp= 0;
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, newl, *charp);
}
static void wrap_move_down(SpaceText *st, ARegion *ar, short sel)
{
Text *text= st->text;
- int offl, startoff, offc, fromline, toline, c, target;
+ TextLine **linep;
+ int *charp;
+ int oldl, oldc, offl, offc, col, newl, visible_lines;
text_update_character_width(st);
- wrap_offset(st, ar, text->sell, text->selc, &offl, &offc);
- fromline= toline= txt_get_span(text->lines.first, text->sell);
- target= text->selc + offc;
- startoff= offl;
- c= text->selc;
- while (offl==startoff && text->sell->line[c]!='\0') {
- c++;
- wrap_offset(st, ar, text->sell, c, &offl, &offc);
- }
+ if (sel) linep= &text->sell, charp= &text->selc;
+ else linep= &text->curl, charp= &text->curc;
- if (text->sell->line[c]=='\0') {
- if (!text->sell->next) {
- txt_move_eol(text, sel);
- return;
- }
- toline++;
- c= target;
+ /* store previous position */
+ oldc= *charp;
+ newl= oldl= txt_get_span(text->lines.first, *linep);
+
+ wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
+ col= text_get_char_pos(st, (*linep)->line, *charp) + offc;
+ visible_lines= text_get_visible_lines(st, ar, (*linep)->line);
+ if(offl<visible_lines-1) {
+ *charp= text_get_cursor_rel(st, ar, *linep, offl+1, col);
+ newl= BLI_findindex(&text->lines, linep);
} else {
- c += target;
- if (c > text->sell->len) c= text->sell->len;
- }
- if (c<0) c=0;
-
- if (sel) {
- txt_undo_add_toop(text, UNDO_STO, fromline, text->selc, toline, c);
- if (toline>fromline) text->sell= text->sell->next;
- if(text->sell) {
- if (c>text->sell->len) c= text->sell->len;
- text->selc= c;
- }
- }
- else if(text->curl) {
- txt_undo_add_toop(text, UNDO_CTO, fromline, text->curc, toline, c);
- if (toline>fromline) text->curl= text->curl->next;
- if(text->curl) {
- if (c > text->curl->len) c= text->curl->len;
- text->curc= c;
- txt_pop_sel(text);
- }
+ if((*linep)->next) {
+ *linep= (*linep)->next;
+ *charp= text_get_cursor_rel(st, ar, *linep, 0, col);
+ newl++;
+ } else *charp= (*linep)->len;
}
+
+ if (!sel) txt_pop_sel(text);
+ txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, oldl, oldc, newl, *charp);
}
/* Moves the cursor vertically by the specified number of lines.
@@ -1465,7 +1757,7 @@ static void wrap_move_down(SpaceText *st, ARegion *ar, short sel)
This is to replace screen_skip for PageUp/Down operations.
*/
-static void cursor_skip(Text *text, int lines, int sel)
+static void cursor_skip(SpaceText* st, ARegion *ar, Text *text, int lines, int sel)
{
TextLine **linep;
int oldl, oldc, *charp;
@@ -1475,13 +1767,21 @@ static void cursor_skip(Text *text, int lines, int sel)
oldl= txt_get_span(text->lines.first, *linep);
oldc= *charp;
- while (lines>0 && (*linep)->next) {
- *linep= (*linep)->next;
- lines--;
- }
- while (lines<0 && (*linep)->prev) {
- *linep= (*linep)->prev;
- lines++;
+ if(st && ar && st->wordwrap) {
+ int rell, relc;
+
+ /* find line and offsets inside it needed to set cursor position */
+ if(cursor_skip_find_line(st, ar, lines, linep, charp, &rell, &relc))
+ *charp= text_get_cursor_rel (st, ar, *linep, rell, relc);
+ } else {
+ while (lines>0 && (*linep)->next) {
+ *linep= (*linep)->next;
+ lines--;
+ }
+ while (lines<0 && (*linep)->prev) {
+ *linep= (*linep)->prev;
+ lines++;
+ }
}
if (*charp > (*linep)->len) *charp= (*linep)->len;
@@ -1546,18 +1846,18 @@ static int move_cursor(bContext *C, int type, int select)
break;
case PREV_PAGE:
- if(st) cursor_skip(text, -st->viewlines, select);
- else cursor_skip(text, -10, select);
+ if(st) cursor_skip(st, ar, st->text, -st->viewlines, select);
+ else cursor_skip(NULL, NULL, text, -10, select);
break;
case NEXT_PAGE:
- if(st) cursor_skip(text, st->viewlines, select);
- else cursor_skip(text, 10, select);
+ if(st) cursor_skip(st, ar, st->text, st->viewlines, select);
+ else cursor_skip(NULL, NULL, text, 10, select);
break;
}
text_update_cursor_moved(C);
- WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
return OPERATOR_FINISHED;
}
@@ -1629,7 +1929,7 @@ static int jump_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int jump_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int jump_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return WM_operator_props_dialog_popup(C,op,200,100);
@@ -1665,6 +1965,8 @@ static int delete_exec(bContext *C, wmOperator *op)
Text *text= CTX_data_edit_text(C);
int type= RNA_enum_get(op->ptr, "type");
+ text_drawcache_tag_update(CTX_wm_space_text(C), 0);
+
if(type == DEL_PREV_WORD)
txt_backspace_word(text);
else if(type == DEL_PREV_CHAR)
@@ -1674,7 +1976,7 @@ static int delete_exec(bContext *C, wmOperator *op)
else if(type == DEL_NEXT_CHAR)
txt_delete_char(text);
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
@@ -1703,7 +2005,7 @@ void TEXT_OT_delete(wmOperatorType *ot)
/******************* toggle overwrite operator **********************/
-static int toggle_overwrite_exec(bContext *C, wmOperator *op)
+static int toggle_overwrite_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
@@ -1729,39 +2031,53 @@ void TEXT_OT_overwrite_toggle(wmOperatorType *ot)
/******************* scroll operator **********************/
/* Moves the view vertically by the specified number of lines */
-static void screen_skip(SpaceText *st, int lines)
+static void screen_skip(SpaceText *st, ARegion *ar, int lines)
{
int last;
- st->top += lines;
+ st->top += lines;
- last= txt_get_span(st->text->lines.first, st->text->lines.last);
+ last= text_get_total_lines(st, ar);
last= last - (st->viewlines/2);
if(st->top>last) st->top= last;
if(st->top<0) st->top= 0;
}
+/* quick enum for tsc->zone (scroller handles) */
+enum {
+ SCROLLHANDLE_BAR,
+ SCROLLHANDLE_MIN_OUTSIDE,
+ SCROLLHANDLE_MAX_OUTSIDE
+};
+
typedef struct TextScroll {
short old[2];
- short hold[2];
short delta[2];
int first;
- int characters;
- int lines;
int scrollbar;
+
+ int zone;
} TextScroll;
+static int text_scroll_poll(bContext *C)
+{
+ /* it should be possible to still scroll linked texts to read them, even if they can't be edited... */
+ return CTX_data_edit_text(C) != NULL;
+}
+
static int scroll_exec(bContext *C, wmOperator *op)
{
SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
int lines= RNA_int_get(op->ptr, "lines");
if(lines == 0)
return OPERATOR_CANCELLED;
- screen_skip(st, lines*U.wheellinescroll);
+ screen_skip(st, ar, lines*U.wheellinescroll);
ED_area_tag_redraw(CTX_wm_area(C));
@@ -1771,41 +2087,44 @@ static int scroll_exec(bContext *C, wmOperator *op)
static void scroll_apply(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
TextScroll *tsc= op->customdata;
- short *mval= event->mval;
+ short mval[2]= {event->x, event->y};
+ short txtdelta[2] = {0, 0};
text_update_character_width(st);
if(tsc->first) {
tsc->old[0]= mval[0];
tsc->old[1]= mval[1];
- tsc->hold[0]= mval[0];
- tsc->hold[1]= mval[1];
tsc->first= 0;
}
+ tsc->delta[0]+= mval[0] - tsc->old[0];
+ tsc->delta[1]+= mval[1] - tsc->old[1];
+
if(!tsc->scrollbar) {
- tsc->delta[0]= (tsc->hold[0]-mval[0])/st->cwidth;
- tsc->delta[1]= (mval[1]-tsc->hold[1])/st->lheight;
+ txtdelta[0]= -tsc->delta[0]/st->cwidth;
+ txtdelta[1]= tsc->delta[1]/st->lheight;
+
+ tsc->delta[0]%= st->cwidth;
+ tsc->delta[1]%= st->lheight;
+ }
+ else {
+ txtdelta[1]= -tsc->delta[1]*st->pix_per_line;
+ tsc->delta[1]+= txtdelta[1]/st->pix_per_line;
}
- else
- tsc->delta[1]= (tsc->hold[1]-mval[1])*st->pix_per_line;
-
- if(tsc->delta[0] || tsc->delta[1]) {
- screen_skip(st, tsc->delta[1]);
- tsc->lines += tsc->delta[1];
+ if(txtdelta[0] || txtdelta[1]) {
+ screen_skip(st, ar, txtdelta[1]);
if(st->wordwrap) {
st->left= 0;
}
else {
- st->left+= tsc->delta[0];
+ st->left+= txtdelta[0];
if(st->left<0) st->left= 0;
}
-
- tsc->hold[0]= mval[0];
- tsc->hold[1]= mval[1];
ED_area_tag_redraw(CTX_wm_area(C));
}
@@ -1824,13 +2143,30 @@ static void scroll_exit(bContext *C, wmOperator *op)
static int scroll_modal(bContext *C, wmOperator *op, wmEvent *event)
{
+ TextScroll *tsc= op->customdata;
+ SpaceText *st= CTX_wm_space_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
switch(event->type) {
case MOUSEMOVE:
- scroll_apply(C, op, event);
+ if(tsc->zone == SCROLLHANDLE_BAR)
+ scroll_apply(C, op, event);
break;
case LEFTMOUSE:
case RIGHTMOUSE:
case MIDDLEMOUSE:
+ if(ELEM(tsc->zone, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE)) {
+ int last;
+
+ st->top+= st->viewlines * (tsc->zone==SCROLLHANDLE_MIN_OUTSIDE ? 1 : -1);
+
+ last= text_get_total_lines(st, ar);
+ last= last - (st->viewlines/2);
+
+ CLAMP(st->top, 0, last);
+
+ ED_area_tag_redraw(CTX_wm_area(C));
+ }
scroll_exit(C, op);
return OPERATOR_FINISHED;
}
@@ -1855,6 +2191,7 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
tsc->first= 1;
+ tsc->zone= SCROLLHANDLE_BAR;
op->customdata= tsc;
st->flags|= ST_SCROLL_SELECT;
@@ -1862,11 +2199,11 @@ static int scroll_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (event->type == MOUSEPAN) {
text_update_character_width(st);
- tsc->hold[0] = event->prevx;
- tsc->hold[1] = event->prevy;
+ tsc->old[0] = event->x;
+ tsc->old[1] = event->x;
/* Sensitivity of scroll set to 4pix per line/char */
- event->mval[0] = event->prevx + (event->x - event->prevx)*st->cwidth/4;
- event->mval[1] = event->prevy + (event->y - event->prevy)*st->lheight/4;
+ tsc->delta[0] = (event->x - event->prevx)*st->cwidth/4;
+ tsc->delta[1] = (event->y - event->prevy)*st->lheight/4;
tsc->first = 0;
tsc->scrollbar = 0;
scroll_apply(C, op, event);
@@ -1894,10 +2231,10 @@ void TEXT_OT_scroll(wmOperatorType *ot)
ot->invoke= scroll_invoke;
ot->modal= scroll_modal;
ot->cancel= scroll_cancel;
- ot->poll= text_space_edit_poll;
+ ot->poll= text_scroll_poll;
/* flags */
- ot->flag= OPTYPE_BLOCKING;
+ ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
/* properties */
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
@@ -1905,24 +2242,54 @@ void TEXT_OT_scroll(wmOperatorType *ot)
/******************** scroll bar operator *******************/
+static int text_region_scroll_poll(bContext *C)
+{
+ /* same as text_region_edit_poll except it works on libdata too */
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= CTX_data_edit_text(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ if(!st || !text)
+ return 0;
+
+ if(!ar || ar->regiontype != RGN_TYPE_WINDOW)
+ return 0;
+
+ return 1;
+}
+
static int scroll_bar_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
ARegion *ar= CTX_wm_region(C);
TextScroll *tsc;
short *mval= event->mval;
+ int zone= -1;
if(RNA_property_is_set(op->ptr, "lines"))
return scroll_exec(C, op);
/* verify we are in the right zone */
- if(!(mval[0]>ar->winx-TXT_SCROLL_WIDTH && mval[0]<ar->winx-TXT_SCROLL_SPACE
- && mval[1]>TXT_SCROLL_SPACE && mval[1]<ar->winy))
+ if(mval[0]>st->txtbar.xmin && mval[0]<st->txtbar.xmax) {
+ if(mval[1]>=st->txtbar.ymin && mval[1]<=st->txtbar.ymax) {
+ /* mouse inside scroll handle */
+ zone = SCROLLHANDLE_BAR;
+ }
+ else if(mval[1]>TXT_SCROLL_SPACE && mval[1]<ar->winy-TXT_SCROLL_SPACE) {
+ if(mval[1]<st->txtbar.ymin) zone= SCROLLHANDLE_MIN_OUTSIDE;
+ else zone= SCROLLHANDLE_MAX_OUTSIDE;
+ }
+ }
+
+ if(zone == -1) {
+ /* we are outside slider - nothing to do */
return OPERATOR_PASS_THROUGH;
+ }
tsc= MEM_callocN(sizeof(TextScroll), "TextScroll");
tsc->first= 1;
tsc->scrollbar= 1;
+ tsc->zone= zone;
op->customdata= tsc;
st->flags|= ST_SCROLL_SELECT;
@@ -1946,7 +2313,7 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot)
ot->invoke= scroll_bar_invoke;
ot->modal= scroll_modal;
ot->cancel= scroll_cancel;
- ot->poll= text_region_edit_poll;
+ ot->poll= text_region_scroll_poll;
/* flags */
ot->flag= OPTYPE_BLOCKING;
@@ -1955,13 +2322,13 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot)
RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100);
}
-/******************* set cursor operator **********************/
+/******************* set selection operator **********************/
-typedef struct SetCursor {
+typedef struct SetSelection {
int selecting;
int selc, sell;
short old[2];
-} SetCursor;
+} SetSelection;
static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
{
@@ -1976,7 +2343,7 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
if(sel) { linep= &text->sell; charp= &text->selc; }
else { linep= &text->curl; charp= &text->curc; }
- y= (ar->winy - y)/st->lheight;
+ y= (ar->winy - 2 - y)/st->lheight;
if(st->showlinenrs)
x-= TXT_OFFSET+TEXTXLOC;
@@ -1987,24 +2354,36 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
x = (x/st->cwidth) + st->left;
if(st->wordwrap) {
- int i, j, endj, curs, max, chop, start, end, chars, loop;
+ int i, j, endj, curs, max, chop, start, end, loop, found;
char ch;
/* Point to first visible line */
*linep= text->lines.first;
- for(i=0; i<st->top && (*linep)->next; i++) *linep= (*linep)->next;
+ i= st->top;
+ while(i>0 && *linep) {
+ int lines= text_get_visible_lines(st, ar, (*linep)->line);
+
+ if (i-lines<0) {
+ y+= i;
+ break;
+ } else {
+ *linep= (*linep)->next;
+ i-= lines;
+ }
+ }
max= wrap_width(st, ar);
loop= 1;
+ found= 0;
while(loop && *linep) {
start= 0;
end= max;
chop= 1;
- chars= 0;
curs= 0;
endj= 0;
for(i=0, j=0; loop; j++) {
+ int chars;
/* Mimic replacement of tabs */
ch= (*linep)->line[j];
@@ -2021,22 +2400,34 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
*charp= endj;
loop= 0;
break;
- /* Exactly at the cursor, done */
+ /* Exactly at the cursor */
}
else if(y==0 && i-start==x) {
+ /* current position could be wrapped to next line */
+ /* this should be checked when end of current line would be reached */
*charp= curs= j;
- loop= 0;
- break;
+ found= 1;
/* Prepare curs for next wrap */
}
else if(i-end==x) {
curs= j;
}
if(i-start>=max) {
+ if(found) {
+ /* exact cursor position was found, check if it's */
+ /* still on needed line (hasn't been wrapped) */
+ if(*charp>endj && !chop && ch!='\0') (*charp)= endj;
+ loop= 0;
+ break;
+ }
+
if(chop) endj= j;
- y--;
start= end;
end += max;
+
+ if(j<(*linep)->len)
+ y--;
+
chop= 1;
if(y==0 && i-start>=x) {
*charp= curs;
@@ -2045,6 +2436,11 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
}
}
else if(ch==' ' || ch=='-' || ch=='\0') {
+ if(found) {
+ loop= 0;
+ break;
+ }
+
if(y==0 && i-start>=x) {
*charp= curs;
loop= 0;
@@ -2058,13 +2454,13 @@ static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel)
}
if(ch=='\0') break;
}
- if(!loop || y<0) break;
+ if(!loop || found) break;
if(!(*linep)->next) {
*charp= (*linep)->len;
break;
}
-
+
/* On correct line but didn't meet cursor, must be at end */
if(y==0) {
*charp= (*linep)->len;
@@ -2098,11 +2494,11 @@ static void set_cursor_apply(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
ARegion *ar= CTX_wm_region(C);
- SetCursor *scu= op->customdata;
+ SetSelection *ssel= op->customdata;
if(event->mval[1]<0 || event->mval[1]>ar->winy) {
- int d= (scu->old[1]-event->mval[1])*st->pix_per_line;
- if(d) screen_skip(st, d);
+ int d= (ssel->old[1]-event->mval[1])*st->pix_per_line;
+ if(d) screen_skip(st, ar, d);
set_cursor_to_pos(st, ar, event->mval[0], event->mval[1]<0?0:ar->winy, 1);
@@ -2125,8 +2521,8 @@ static void set_cursor_apply(bContext *C, wmOperator *op, wmEvent *event)
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
- scu->old[0]= event->mval[0];
- scu->old[1]= event->mval[1];
+ ssel->old[0]= event->mval[0];
+ ssel->old[1]= event->mval[1];
}
}
@@ -2134,7 +2530,7 @@ static void set_cursor_exit(bContext *C, wmOperator *op)
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= st->text;
- SetCursor *scu= op->customdata;
+ SetSelection *ssel= op->customdata;
int linep2, charp2;
char *buffer;
@@ -2147,44 +2543,29 @@ static void set_cursor_exit(bContext *C, wmOperator *op)
linep2= txt_get_span(st->text->lines.first, st->text->sell);
charp2= st->text->selc;
- if(scu->sell!=linep2 || scu->selc!=charp2)
- txt_undo_add_toop(st->text, UNDO_STO, scu->sell, scu->selc, linep2, charp2);
+ if(ssel->sell!=linep2 || ssel->selc!=charp2)
+ txt_undo_add_toop(st->text, UNDO_STO, ssel->sell, ssel->selc, linep2, charp2);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
- MEM_freeN(scu);
+ MEM_freeN(ssel);
}
-static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int set_selection_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
- ARegion *ar= CTX_wm_region(C);
- SetCursor *scu;
-
- op->customdata= MEM_callocN(sizeof(SetCursor), "SetCursor");
- scu= op->customdata;
- scu->selecting= RNA_boolean_get(op->ptr, "select");
+ SetSelection *ssel;
- scu->old[0]= event->mval[0];
- scu->old[1]= event->mval[1];
+ op->customdata= MEM_callocN(sizeof(SetSelection), "SetCursor");
+ ssel= op->customdata;
+ ssel->selecting= RNA_boolean_get(op->ptr, "select");
- if(!scu->selecting) {
- int curl= txt_get_span(st->text->lines.first, st->text->curl);
- int curc= st->text->curc;
- int linep2, charp2;
-
- set_cursor_to_pos(st, ar, event->mval[0], event->mval[1], 0);
+ ssel->old[0]= event->mval[0];
+ ssel->old[1]= event->mval[1];
- linep2= txt_get_span(st->text->lines.first, st->text->curl);
- charp2= st->text->selc;
-
- if(curl!=linep2 || curc!=charp2)
- txt_undo_add_toop(st->text, UNDO_CTO, curl, curc, linep2, charp2);
- }
-
- scu->sell= txt_get_span(st->text->lines.first, st->text->sell);
- scu->selc= st->text->selc;
+ ssel->sell= txt_get_span(st->text->lines.first, st->text->sell);
+ ssel->selc= st->text->selc;
WM_event_add_modal_handler(C, op);
@@ -2193,7 +2574,7 @@ static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int set_cursor_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int set_selection_modal(bContext *C, wmOperator *op, wmEvent *event)
{
switch(event->type) {
case LEFTMOUSE:
@@ -2209,32 +2590,86 @@ static int set_cursor_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int set_cursor_cancel(bContext *C, wmOperator *op)
+static int set_selection_cancel(bContext *C, wmOperator *op)
{
set_cursor_exit(C, op);
return OPERATOR_FINISHED;
}
+void TEXT_OT_selection_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Set Selection";
+ ot->idname= "TEXT_OT_selection_set";
+ ot->description= "Set cursor selection";
+
+ /* api callbacks */
+ ot->invoke= set_selection_invoke;
+ ot->modal= set_selection_modal;
+ ot->cancel= set_selection_cancel;
+ ot->poll= text_region_edit_poll;
+
+ /* properties */
+ RNA_def_boolean(ot->srna, "select", 0, "Select", "Set selection end rather than cursor.");
+}
+
+/******************* set cursor operator **********************/
+
+static int set_cursor_exec(bContext *C, wmOperator *op)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+ Text *text= st->text;
+ ARegion *ar= CTX_wm_region(C);
+ int x= RNA_int_get(op->ptr, "x");
+ int y= RNA_int_get(op->ptr, "y");
+ int oldl, oldc;
+
+ oldl= txt_get_span(text->lines.first, text->curl);
+ oldc= text->curc;
+
+ set_cursor_to_pos(st, ar, x, y, 0);
+
+ txt_undo_add_toop(text, UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, text->curl), text->curc);
+
+ text_update_cursor_moved(C);
+ WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text);
+
+ return OPERATOR_PASS_THROUGH;
+}
+
+static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ SpaceText *st= CTX_wm_space_text(C);
+
+ if(event->mval[0]>=st->txtbar.xmin)
+ return OPERATOR_PASS_THROUGH;
+
+ RNA_int_set(op->ptr, "x", event->mval[0]);
+ RNA_int_set(op->ptr, "y", event->mval[1]);
+
+ return set_cursor_exec(C, op);
+}
+
void TEXT_OT_cursor_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Cursor";
ot->idname= "TEXT_OT_cursor_set";
- ot->description= "Set cursor selection";
-
+ ot->description= "Set cursor position";
+
/* api callbacks */
ot->invoke= set_cursor_invoke;
- ot->modal= set_cursor_modal;
- ot->cancel= set_cursor_cancel;
+ ot->exec= set_cursor_exec;
ot->poll= text_region_edit_poll;
/* properties */
- RNA_def_boolean(ot->srna, "select", 0, "Select", "Set selection end rather than cursor.");
+ RNA_def_boolean(ot->srna, "x", 0, "X", "X-coordinate to set cursor to.");
+ RNA_def_boolean(ot->srna, "y", 0, "Y", "X-coordinate to set cursor to.");
}
/******************* line number operator **********************/
-static int line_number_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int line_number_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
@@ -2244,10 +2679,12 @@ static int line_number_invoke(bContext *C, wmOperator *op, wmEvent *event)
static int jump_to= 0;
static double last_jump= 0;
+ text_update_character_width(st);
+
if(!st->showlinenrs)
return OPERATOR_PASS_THROUGH;
- if(!(mval[0]>2 && mval[0]<60 && mval[1]>2 && mval[1]<ar->winy-2))
+ if(!(mval[0]>2 && mval[0]<(TXT_OFFSET + TEXTXLOC) && mval[1]>2 && mval[1]<ar->winy-2))
return OPERATOR_PASS_THROUGH;
if(!(event->ascii>='0' && event->ascii<='9'))
@@ -2290,6 +2727,8 @@ static int insert_exec(bContext *C, wmOperator *op)
char *str;
int done = 0, i;
+ text_drawcache_tag_update(st, 0);
+
str= RNA_string_get_alloc(op->ptr, "text", NULL, 0);
if(st && st->overwrite) {
@@ -2307,7 +2746,7 @@ static int insert_exec(bContext *C, wmOperator *op)
if(!done)
return OPERATOR_CANCELLED;
- text_update_line_edited(text, text->curl);
+ text_update_line_edited(text->curl);
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
@@ -2317,18 +2756,22 @@ static int insert_exec(bContext *C, wmOperator *op)
static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- char str[2];
int ret;
- /* XXX old code from winqreadtextspace, is it still needed somewhere? */
- /* smartass code to prevent the CTRL/ALT events below from not working! */
- /*if(qual & (LR_ALTKEY|LR_CTRLKEY))
- if(!ispunct(ascii))
- ascii= 0;*/
- str[0]= event->ascii;
- str[1]= '\0';
+ // if(!RNA_property_is_set(op->ptr, "text")) { /* always set from keymap XXX */
+ if(!RNA_string_length(op->ptr, "text")) {
+ /* if alt/ctrl/super are pressed pass through */
+ if(event->ctrl || event->oskey) {
+ return OPERATOR_PASS_THROUGH;
+ }
+ else {
+ char str[2];
+ str[0]= event->ascii;
+ str[1]= '\0';
+ RNA_string_set(op->ptr, "text", str);
+ }
+ }
- RNA_string_set(op->ptr, "text", str);
ret = insert_exec(C, op);
/* run the script while editing, evil but useful */
@@ -2396,9 +2839,10 @@ static int find_and_replace(bContext *C, wmOperator *op, short mode)
}
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
}
else if(mode==TEXT_MARK_ALL) {
- char color[4];
+ unsigned char color[4];
UI_GetThemeColor4ubv(TH_SHADE2, color);
if(txt_find_marker(text, text->curl, text->selc, TMARK_GRP_FINDALL, 0)) {
@@ -2529,7 +2973,7 @@ void TEXT_OT_find_set_selected(wmOperatorType *ot)
/******************* replace set selected *********************/
-static int replace_set_selected_exec(bContext *C, wmOperator *op)
+static int replace_set_selected_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceText *st= CTX_wm_space_text(C);
Text *text= CTX_data_edit_text(C);
@@ -2579,7 +3023,7 @@ int text_file_modified(Text *text)
return 0;
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
if(!BLI_exists(file))
return 2;
@@ -2607,7 +3051,7 @@ static void text_ignore_modified(Text *text)
if(!text || !text->name) return;
BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.sce);
+ BLI_path_abs(file, G.main->name);
if(!BLI_exists(file)) return;
@@ -2639,7 +3083,7 @@ static int resolve_conflict_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
Text *text= CTX_data_edit_text(C);
uiPopupMenu *pup;
@@ -2649,7 +3093,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
case 1:
if(text->flags & TXT_ISDIRTY) {
/* modified locally and externally, ahhh. offer more possibilites. */
- pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk (ignore local changes)", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Save to disk (ignore outside changes)", 0, "resolution", RESOLVE_SAVE);
@@ -2657,7 +3101,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File Modified Outside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Modified Outside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Make text internal (separate copy)", 0, "resolution", RESOLVE_MAKE_INTERNAL);
@@ -2666,7 +3110,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
break;
case 2:
- pup= uiPupMenuBegin(C, "File Deleted Outside Blender", 0);
+ pup= uiPupMenuBegin(C, "File Deleted Outside Blender", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Make text internal", 0, "resolution", RESOLVE_MAKE_INTERNAL);
uiItemEnumO(layout, op->type->idname, "Recreate file", 0, "resolution", RESOLVE_SAVE);
@@ -2741,6 +3185,7 @@ void ED_text_undo_step(bContext *C, int step)
text_update_edited(text);
text_update_cursor_moved(C);
+ text_drawcache_tag_update(CTX_wm_space_text(C), 1);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
}
diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c
index aee1a7ecfd6..b60a6a1abe4 100644
--- a/source/blender/editors/space_text/text_python.c
+++ b/source/blender/editors/space_text/text_python.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -98,7 +98,7 @@ int text_do_suggest_select(SpaceText *st, ARegion *ar)
return 1;
}
-void text_pop_suggest_list()
+void text_pop_suggest_list(void)
{
SuggItem *item, *sel;
int *top, i;
@@ -182,12 +182,12 @@ static void confirm_suggestion(Text *text, int skipleft)
#define LR_SHIFTKEY 0
#define LR_ALTKEY 0
#define LR_CTRLKEY 0
-#define LR_COMMANDKEY 0
+#define LR_OSKEY 0
// XXX
static int doc_scroll= 0;
-short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
+static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
{
ARegion *ar= NULL; // XXX
int qual= 0; // XXX
@@ -204,7 +204,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
if(tools & TOOL_SUGG_LIST) {
if((ascii != '_' && ascii != '*' && ispunct(ascii)) || text_check_whitespace(ascii)) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
else if((st->overwrite && txt_replace_char(st->text, ascii)) || txt_add_char(st->text, ascii)) {
get_suggest_prefix(st->text, 0);
@@ -230,7 +230,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
case MIDDLEMOUSE:
if(text_do_suggest_select(st, ar)) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
swallow= 1;
}
else {
@@ -248,7 +248,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
case RETKEY:
if(tools & TOOL_SUGG_LIST) {
confirm_suggestion(st->text, 0);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
swallow= 1;
draw= 1;
}
@@ -358,7 +358,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
}
#if 0
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Run text plugin scripts if enabled */
if(st->doplugins && event && val) {
if(BPY_menu_do_shortcut(PYMENU_TEXTPLUGIN, event, qual)) {
@@ -370,7 +370,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val)
; // XXX redraw_alltext();
#endif
-short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
+static short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
{
Text *text;
TextMarker *marker, *mrk, *nxt;
@@ -388,7 +388,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
/* Find the next temporary marker */
if(evnt==TABKEY) {
int lineno= txt_get_span(text->lines.first, text->curl);
- TextMarker *mrk= text->markers.first;
+ mrk= text->markers.first;
while(mrk) {
if(!marker && (mrk->flags & TMARK_TEMP)) marker= mrk;
if((mrk->flags & TMARK_TEMP) && (mrk->lineno > lineno || (mrk->lineno==lineno && mrk->end > text->curc))) {
@@ -430,11 +430,11 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
if(st->overwrite) {
if(txt_replace_char(text, ascii))
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
else {
if(txt_add_char(text, ascii)) {
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
}
}
@@ -459,7 +459,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
txt_move_to(text, mrk->lineno, mrk->start+c, 0);
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
txt_backspace_char(text);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
if(mrk==marker || mrk==nxt) break;
mrk= nxt;
}
@@ -479,7 +479,7 @@ short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val)
txt_move_to(text, mrk->lineno, mrk->start+c, 0);
if(s!=c) txt_move_to(text, mrk->lineno, mrk->start+s, 1);
txt_delete_char(text);
- text_update_line_edited(st->text, st->text->curl);
+ text_update_line_edited(st->text->curl);
if(mrk==marker || mrk==nxt) break;
mrk= nxt;
}
diff --git a/source/blender/editors/space_time/CMakeLists.txt b/source/blender/editors/space_time/CMakeLists.txt
index 39b7ba355b9..c8727084548 100644
--- a/source/blender/editors/space_time/CMakeLists.txt
+++ b/source/blender/editors/space_time/CMakeLists.txt
@@ -19,16 +19,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ space_time.c
+ time_ops.c
+
+ time_intern.h
)
-BLENDERLIB(bf_editor_space_time "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_time "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_time/Makefile b/source/blender/editors/space_time/Makefile
deleted file mode 100644
index 958c3018f82..00000000000
--- a/source/blender/editors/space_time/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_time
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_time/SConscript b/source/blender/editors/space_time/SConscript
index eb3a43a87b7..c08339ba692 100644
--- a/source/blender/editors/space_time/SConscript
+++ b/source/blender/editors/space_time/SConscript
@@ -5,6 +5,6 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../makesrna'
+incs += ' ../../makesrna ../../blenloader'
env.BlenderLib ( 'bf_editors_space_time', sources, Split(incs), [], libtype=['core'], priority=[65] )
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index a3c20ee3341..65902c692c4 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,6 +36,7 @@
#include "BLI_blenlib.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
@@ -55,17 +56,15 @@
#include "UI_resources.h"
#include "UI_view2d.h"
+#include "ED_space_api.h"
#include "ED_markers.h"
#include "time_intern.h"
/* ************************ main time area region *********************** */
-static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar)
-{
- View2D *v2d= UI_view2d_fromcontext(C);
- Scene *scene= CTX_data_scene(C);
-
+static void time_draw_sfra_efra(Scene *scene, View2D *v2d)
+{
/* draw darkened area outside of active timeline
* frame range used is preview range or scene range */
UI_ThemeColorShade(TH_BACK, -25);
@@ -86,25 +85,84 @@ static void time_draw_sfra_efra(const bContext *C, SpaceTime *stime, ARegion *ar
#define CACHE_DRAW_HEIGHT 3.0f
-static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
+static void time_draw_cache(SpaceTime *stime, Object *ob)
{
- SpaceTimeCache *stc;
+ PTCacheID *pid;
+ ListBase pidlist;
+ SpaceTimeCache *stc = stime->caches.first;
float yoffs=0.f;
- if (!(stime->cache_display & TIME_CACHE_DISPLAY))
+ if (!(stime->cache_display & TIME_CACHE_DISPLAY) || (!ob))
return;
-
- for (stc= stime->caches.first; stc; stc=stc->next) {
- float col[4];
-
- if (!stc->array || !stc->ok)
+
+ BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
+
+ /* iterate over pointcaches on the active object,
+ * add spacetimecache and vertex array for each */
+ for(pid=pidlist.first; pid; pid=pid->next) {
+ float col[4], *fp;
+ int i, sta = pid->cache->startframe, end = pid->cache->endframe;
+ int len = (end - sta + 1)*4;
+
+ switch(pid->type) {
+ case PTCACHE_TYPE_SOFTBODY:
+ if (!(stime->cache_display & TIME_CACHE_SOFTBODY)) continue;
+ break;
+ case PTCACHE_TYPE_PARTICLES:
+ if (!(stime->cache_display & TIME_CACHE_PARTICLES)) continue;
+ break;
+ case PTCACHE_TYPE_CLOTH:
+ if (!(stime->cache_display & TIME_CACHE_CLOTH)) continue;
+ break;
+ case PTCACHE_TYPE_SMOKE_DOMAIN:
+ case PTCACHE_TYPE_SMOKE_HIGHRES:
+ if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue;
+ break;
+ }
+
+ if(pid->cache->cached_frames == NULL)
continue;
+
+
+ /* make sure we have stc with correct array length */
+ if(stc == NULL || MEM_allocN_len(stc->array) != len*2*sizeof(float)) {
+ if(stc) {
+ MEM_freeN(stc->array);
+ }
+ else {
+ stc = MEM_callocN(sizeof(SpaceTimeCache), "spacetimecache");
+ BLI_addtail(&stime->caches, stc);
+ }
+
+ stc->array = MEM_callocN(len*2*sizeof(float), "SpaceTimeCache array");
+ }
+
+ /* fill the vertex array with a quad for each cached frame */
+ for (i=sta, fp=stc->array; i<=end; i++) {
+ if (pid->cache->cached_frames[i-sta]) {
+ fp[0] = (float)i-0.5f;
+ fp[1] = 0.0;
+ fp+=2;
+
+ fp[0] = (float)i-0.5f;
+ fp[1] = 1.0;
+ fp+=2;
+
+ fp[0] = (float)i+0.5f;
+ fp[1] = 1.0;
+ fp+=2;
+
+ fp[0] = (float)i+0.5f;
+ fp[1] = 0.0;
+ fp+=2;
+ }
+ }
glPushMatrix();
glTranslatef(0.0, (float)V2D_SCROLL_HEIGHT+yoffs, 0.0);
glScalef(1.0, CACHE_DRAW_HEIGHT, 0.0);
- switch(stc->type) {
+ switch(pid->type) {
case PTCACHE_TYPE_SOFTBODY:
col[0] = 1.0; col[1] = 0.4; col[2] = 0.02;
col[3] = 0.1;
@@ -127,17 +185,17 @@ static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
glEnable(GL_BLEND);
- glRectf((float)stc->startframe, 0.0, (float)stc->endframe, 1.0);
+ glRectf((float)sta, 0.0, (float)end, 1.0);
col[3] = 0.4;
- if (stc->flag & PTCACHE_BAKED) {
+ if (pid->cache->flag & PTCACHE_BAKED) {
col[0] -= 0.4; col[1] -= 0.4; col[2] -= 0.4;
}
glColor4fv(col);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, stc->array);
- glDrawArrays(GL_QUADS, 0, stc->len);
+ glDrawArrays(GL_QUADS, 0, (fp-stc->array)/2);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_BLEND);
@@ -145,6 +203,19 @@ static void time_draw_cache(const bContext *C, SpaceTime *stime, ARegion *ar)
glPopMatrix();
yoffs += CACHE_DRAW_HEIGHT;
+
+ stc = stc->next;
+ }
+
+ BLI_freelistN(&pidlist);
+
+ /* free excessive caches */
+ while(stc) {
+ SpaceTimeCache *tmp = stc->next;
+ BLI_remlink(&stime->caches, stc);
+ MEM_freeN(stc->array);
+ MEM_freeN(stc);
+ stc = tmp;
}
}
@@ -162,94 +233,10 @@ static void time_cache_free(SpaceTime *stime)
BLI_freelistN(&stime->caches);
}
-static void time_cache_refresh(const bContext *C, SpaceTime *stime, ARegion *ar)
+static void time_cache_refresh(SpaceTime *stime)
{
- Object *ob = CTX_data_active_object(C);
- PTCacheID *pid;
- ListBase pidlist;
-
+ /* Free previous caches to indicate full refresh */
time_cache_free(stime);
-
- if (!(stime->cache_display & TIME_CACHE_DISPLAY) || (!ob))
- return;
-
- BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
-
- /* iterate over pointcaches on the active object,
- * add spacetimecache and vertex array for each */
- for(pid=pidlist.first; pid; pid=pid->next) {
- SpaceTimeCache *stc;
- float *fp, *array;
- int i, len;
-
- switch(pid->type) {
- case PTCACHE_TYPE_SOFTBODY:
- if (!(stime->cache_display & TIME_CACHE_SOFTBODY)) continue;
- break;
- case PTCACHE_TYPE_PARTICLES:
- if (!(stime->cache_display & TIME_CACHE_PARTICLES)) continue;
- break;
- case PTCACHE_TYPE_CLOTH:
- if (!(stime->cache_display & TIME_CACHE_CLOTH)) continue;
- break;
- case PTCACHE_TYPE_SMOKE_DOMAIN:
- case PTCACHE_TYPE_SMOKE_HIGHRES:
- if (!(stime->cache_display & TIME_CACHE_SMOKE)) continue;
- break;
- }
-
- stc= MEM_callocN(sizeof(SpaceTimeCache), "spacetimecache");
-
- stc->type = pid->type;
-
- if (pid->cache->flag & PTCACHE_BAKED)
- stc->flag |= PTCACHE_BAKED;
- if (pid->cache->flag & PTCACHE_DISK_CACHE)
- stc->flag |= PTCACHE_DISK_CACHE;
-
- /* first allocate with maximum number of frames needed */
- BKE_ptcache_id_time(pid, CTX_data_scene(C), 0, &stc->startframe, &stc->endframe, NULL);
- len = (stc->endframe - stc->startframe + 1)*4;
- fp = array = MEM_callocN(len*2*sizeof(float), "temporary timeline cache array");
-
- /* fill the vertex array with a quad for each cached frame */
- for (i=stc->startframe; i<=stc->endframe; i++) {
-
- if (BKE_ptcache_id_exist(pid, i)) {
- fp[0] = (float)i;
- fp[1] = 0.0;
- fp+=2;
-
- fp[0] = (float)i;
- fp[1] = 1.0;
- fp+=2;
-
- fp[0] = (float)(i+1);
- fp[1] = 1.0;
- fp+=2;
-
- fp[0] = (float)(i+1);
- fp[1] = 0.0;
- fp+=2;
- }
- }
- /* update with final number of frames */
- stc->len = (i-stc->startframe)*4;
- stc->array = MEM_mallocN(stc->len*2*sizeof(float), "SpaceTimeCache array");
- memcpy(stc->array, array, stc->len*2*sizeof(float));
-
- MEM_freeN(array);
- array = NULL;
-
- stc->ok = 1;
-
- BLI_addtail(&stime->caches, stc);
- }
-
- /* todo: sort time->caches list for consistent order */
- // ...
-
- BLI_freelistN(&pidlist);
}
/* helper function - find actkeycolumn that occurs on cframe, or the nearest one if not found */
@@ -277,7 +264,7 @@ static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe)
/* helper for time_draw_keyframes() */
static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
{
- bDopeSheet ads;
+ bDopeSheet ads= {0};
DLRBT_Tree keys;
ActKeyColumn *ak;
@@ -286,7 +273,6 @@ static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
/* init dopesheet settings */
// FIXME: the ob_to_keylist function currently doesn't take this into account...
- memset(&ads, 0, sizeof(bDopeSheet));
if (onlysel)
ads.filterflag |= ADS_FILTER_ONLYSEL;
@@ -374,7 +360,7 @@ static void time_draw_keyframes(const bContext *C, SpaceTime *stime, ARegion *ar
/* ---------------- */
-static void time_refresh(const bContext *C, ScrArea *sa)
+static void time_refresh(const bContext *UNUSED(C), ScrArea *sa)
{
SpaceTime *stime = (SpaceTime *)sa->spacedata.first;
ARegion *ar;
@@ -382,7 +368,7 @@ static void time_refresh(const bContext *C, ScrArea *sa)
/* find the main timeline region and refresh cache display*/
for (ar= sa->regionbase.first; ar; ar= ar->next) {
if (ar->regiontype==RGN_TYPE_WINDOW) {
- time_cache_refresh(C, stime, ar);
+ time_cache_refresh(stime);
break;
}
}
@@ -396,14 +382,17 @@ static void time_listener(ScrArea *sa, wmNotifier *wmn)
switch (wmn->category) {
case NC_OBJECT:
switch (wmn->data) {
+ case ND_BONE_ACTIVE:
case ND_POINTCACHE:
+ case ND_MODIFIER:
+ case ND_PARTICLE:
ED_area_tag_refresh(sa);
ED_area_tag_redraw(sa);
break;
}
break;
case NC_SCENE:
- switch (wmn->data) {
+ switch (wmn->data) {
case ND_OB_ACTIVE:
case ND_FRAME:
ED_area_tag_refresh(sa);
@@ -424,11 +413,17 @@ static void time_listener(ScrArea *sa, wmNotifier *wmn)
break;
}
case NC_SPACE:
- switch (wmn->data) {
+ switch (wmn->data) {
case ND_SPACE_CHANGED:
ED_area_tag_refresh(sa);
break;
}
+ case NC_WM:
+ switch (wmn->data) {
+ case ND_FILEREAD:
+ ED_area_tag_refresh(sa);
+ break;
+ }
}
}
@@ -449,7 +444,9 @@ static void time_main_area_init(wmWindowManager *wm, ARegion *ar)
static void time_main_area_draw(const bContext *C, ARegion *ar)
{
/* draw entirely, view changes should be handled here */
+ Scene *scene= CTX_data_scene(C);
SpaceTime *stime= CTX_wm_space_time(C);
+ Object *obact = CTX_data_active_object(C);
View2D *v2d= &ar->v2d;
View2DGrid *grid;
View2DScrollers *scrollers;
@@ -459,32 +456,32 @@ static void time_main_area_draw(const bContext *C, ARegion *ar)
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
- UI_view2d_view_ortho(C, v2d);
+ UI_view2d_view_ortho(v2d);
/* start and end frame */
- time_draw_sfra_efra(C, stime, ar);
+ time_draw_sfra_efra(scene, v2d);
/* grid */
unit= (stime->flag & TIME_DRAWFRAMES)? V2D_UNIT_FRAMES: V2D_UNIT_SECONDS;
- grid= UI_view2d_grid_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
- UI_view2d_grid_draw(C, v2d, grid, (V2D_VERTICAL_LINES|V2D_VERTICAL_AXIS));
+ grid= UI_view2d_grid_calc(scene, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy);
+ UI_view2d_grid_draw(v2d, grid, (V2D_VERTICAL_LINES|V2D_VERTICAL_AXIS));
UI_view2d_grid_free(grid);
- /* keyframes */
- if(!G.rendering) /* ANIM_nla_mapping_apply_fcurve() modifies curve data while rendering, possible race condition */
- time_draw_keyframes(C, stime, ar);
-
/* current frame */
if ((stime->flag & TIME_DRAWFRAMES)==0) flag |= DRAWCFRA_UNIT_SECONDS;
if (stime->flag & TIME_CFRA_NUM) flag |= DRAWCFRA_SHOW_NUMBOX;
ANIM_draw_cfra(C, v2d, flag);
+ /* keyframes */
+ if(!G.rendering) /* ANIM_nla_mapping_apply_fcurve() modifies curve data while rendering, possible race condition */
+ time_draw_keyframes(C, stime, ar);
+
/* markers */
- UI_view2d_view_orthoSpecial(C, v2d, 1);
+ UI_view2d_view_orthoSpecial(ar, v2d, 1);
draw_markers_time(C, 0);
/* caches */
- time_draw_cache(C, stime, ar);
+ time_draw_cache(stime, obact);
/* reset view matrix */
UI_view2d_view_restore(C);
@@ -510,20 +507,22 @@ static void time_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch (wmn->data) {
+ case ND_OB_SELECT:
+ case ND_OB_ACTIVE:
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_KEYINGSET:
case ND_RENDER_OPTIONS:
- ED_region_tag_redraw(ar);
- break;
+ ED_region_tag_redraw(ar);
+ break;
+ }
}
}
-}
/* ************************ header time area region *********************** */
/* add handlers, stuff you only do once or on area/region changes */
-static void time_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void time_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -544,6 +543,7 @@ static void time_header_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch (wmn->data) {
+ case ND_OB_SELECT:
case ND_FRAME:
case ND_FRAME_RANGE:
case ND_KEYINGSET:
@@ -570,7 +570,7 @@ static SpaceLink *time_new(const bContext *C)
stime= MEM_callocN(sizeof(SpaceTime), "inittime");
stime->spacetype= SPACE_TIME;
- stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN;
+ stime->redraws= TIME_ALL_3D_WIN|TIME_ALL_ANIM_WIN; // XXX: depreceated
stime->flag |= TIME_DRAWFRAMES;
/* header */
@@ -621,7 +621,7 @@ static void time_free(SpaceLink *sl)
/* spacetype; init callback in ED_area_initialize() */
/* init is called to (re)initialize an existing editor (file read, screen changes) */
/* validate spacedata, add own area level handlers */
-static void time_init(wmWindowManager *wm, ScrArea *sa)
+static void time_init(wmWindowManager *UNUSED(wm), ScrArea *sa)
{
SpaceTime *stime= (SpaceTime *)sa->spacedata.first;
@@ -638,7 +638,7 @@ static SpaceLink *time_duplicate(SpaceLink *sl)
SpaceTime *stime= (SpaceTime *)sl;
SpaceTime *stimen= MEM_dupallocN(stime);
- time_cache_free(stimen);
+ stimen->caches.first = stimen->caches.last = NULL;
return (SpaceLink *)stimen;
}
diff --git a/source/blender/editors/space_time/time_intern.h b/source/blender/editors/space_time/time_intern.h
index 31164d0c27a..f6faeb8ffda 100644
--- a/source/blender/editors/space_time/time_intern.h
+++ b/source/blender/editors/space_time/time_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index fb80d54d5e6..3abee9df5a0 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,24 +29,23 @@
#include <stdlib.h>
#include <math.h>
-
#include "DNA_scene_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
+#include "time_intern.h"
/* ****************** Start/End Frame Operators *******************************/
-static int time_set_sfra_exec (bContext *C, wmOperator *op)
+static int time_set_sfra_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int frame= CFRA;
@@ -70,7 +69,7 @@ static int time_set_sfra_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void TIME_OT_start_frame_set (wmOperatorType *ot)
+static void TIME_OT_start_frame_set (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Start Frame";
@@ -86,7 +85,7 @@ void TIME_OT_start_frame_set (wmOperatorType *ot)
}
-static int time_set_efra_exec (bContext *C, wmOperator *op)
+static int time_set_efra_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
int frame= CFRA;
@@ -110,7 +109,7 @@ static int time_set_efra_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void TIME_OT_end_frame_set (wmOperatorType *ot)
+static void TIME_OT_end_frame_set (wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set End Frame";
@@ -127,7 +126,7 @@ void TIME_OT_end_frame_set (wmOperatorType *ot)
/* ************************ View All Operator *******************************/
-static int time_view_all_exec (bContext *C, wmOperator *op)
+static int time_view_all_exec (bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
@@ -152,7 +151,7 @@ static int time_view_all_exec (bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void TIME_OT_view_all (wmOperatorType *ot)
+static void TIME_OT_view_all (wmOperatorType *ot)
{
/* identifiers */
ot->name= "View All";
diff --git a/source/blender/editors/space_userpref/CMakeLists.txt b/source/blender/editors/space_userpref/CMakeLists.txt
index 1752f39cfa5..68fe9d3e04c 100644
--- a/source/blender/editors/space_userpref/CMakeLists.txt
+++ b/source/blender/editors/space_userpref/CMakeLists.txt
@@ -19,16 +19,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ space_userpref.c
+ userpref_ops.c
+
+ userpref_intern.h
)
-BLENDERLIB(bf_editor_space_userpref "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_userpref "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_userpref/Makefile b/source/blender/editors/space_userpref/Makefile
deleted file mode 100644
index 8510c355ab4..00000000000
--- a/source/blender/editors/space_userpref/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_userpref
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_userpref/SConscript b/source/blender/editors/space_userpref/SConscript
index 3ba1543b840..5c52e6f4c41 100644
--- a/source/blender/editors/space_userpref/SConscript
+++ b/source/blender/editors/space_userpref/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf ../../blenfont'
-incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
defs = []
diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c
index 8eea83a1083..96881fde320 100644
--- a/source/blender/editors/space_userpref/space_userpref.c
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,12 +33,13 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_screen.h"
#include "ED_screen.h"
-
+#include "ED_space_api.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -47,7 +48,7 @@
/* ******************** default callbacks for userpref space ***************** */
-static SpaceLink *userpref_new(const bContext *C)
+static SpaceLink *userpref_new(const bContext *UNUSED(C))
{
ARegion *ar;
SpaceUserPref *spref;
@@ -72,7 +73,7 @@ static SpaceLink *userpref_new(const bContext *C)
}
/* not spacelink itself */
-static void userpref_free(SpaceLink *sl)
+static void userpref_free(SpaceLink *UNUSED(sl))
{
// SpaceUserPref *spref= (SpaceUserPref*) sl;
@@ -80,7 +81,7 @@ static void userpref_free(SpaceLink *sl)
/* spacetype; init callback */
-static void userpref_init(struct wmWindowManager *wm, ScrArea *sa)
+static void userpref_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -107,17 +108,17 @@ static void userpref_main_area_draw(const bContext *C, ARegion *ar)
ED_region_panels(C, ar, 1, NULL, -1);
}
-void userpref_operatortypes(void)
+static void userpref_operatortypes(void)
{
}
-void userpref_keymap(struct wmKeyConfig *keyconf)
+static void userpref_keymap(struct wmKeyConfig *UNUSED(keyconf))
{
}
/* add handlers, stuff you only do once or on area/region changes */
-static void userpref_header_area_init(wmWindowManager *wm, ARegion *ar)
+static void userpref_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
{
ED_region_header_init(ar);
}
@@ -127,19 +128,20 @@ static void userpref_header_area_draw(const bContext *C, ARegion *ar)
ED_region_header(C, ar);
}
-static void userpref_main_area_listener(ARegion *ar, wmNotifier *wmn)
+static void userpref_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
}
-static void userpref_header_listener(ARegion *ar, wmNotifier *wmn)
+static void userpref_header_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
{
/* context changes */
+#if 0
switch(wmn->category) {
default:
break;
}
-
+#endif
}
/* only called once, from space/spacetypes.c */
diff --git a/source/blender/editors/space_userpref/userpref_intern.h b/source/blender/editors/space_userpref/userpref_intern.h
index 206c8efe70e..ca1f231df00 100644
--- a/source/blender/editors/space_userpref/userpref_intern.h
+++ b/source/blender/editors/space_userpref/userpref_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c
index c959e9fcafb..29449202ed9 100644
--- a/source/blender/editors/space_userpref/userpref_ops.c
+++ b/source/blender/editors/space_userpref/userpref_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 733c81676d1..3e611ab406e 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -19,33 +19,49 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
../include
../../blenfont
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
../../gpu
../../imbuf
- ../../../../intern/guardedalloc
- ../../../../intern/smoke/extern
../../makesdna
../../makesrna
- ../../render/extern/include
../../windowmanager
+ ../../render/extern/include
+ ../../../../intern/guardedalloc
+ ../../../../intern/smoke/extern
)
-IF(WITH_GAMEENGINE)
- SET(INC ${INC} ../../../kernel/gen_system)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+set(SRC
+ drawanimviz.c
+ drawarmature.c
+ drawmesh.c
+ drawobject.c
+ drawvolume.c
+ space_view3d.c
+ view3d_buttons.c
+ view3d_draw.c
+ view3d_edit.c
+ view3d_fly.c
+ view3d_header.c
+ view3d_ops.c
+ view3d_select.c
+ view3d_snap.c
+ view3d_toolbar.c
+ view3d_view.c
+
+ view3d_intern.h
+)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_GAMEENGINE)
+ list(APPEND INC ../../../kernel/gen_system)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_editor_space_view3d "${SRC}" "${INC}")
+blender_add_lib(bf_editor_space_view3d "${SRC}" "${INC}")
diff --git a/source/blender/editors/space_view3d/Makefile b/source/blender/editors/space_view3d/Makefile
deleted file mode 100644
index 58d88194c22..00000000000
--- a/source/blender/editors/space_view3d/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_view3d
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../blenfont
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_SMOKE)/include
-ifneq ($(NAN_NO_KETSJI),true)
- CPPFLAGS += -I../../../kernel/gen_system
-endif
-
-# own include
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/space_view3d/SConscript b/source/blender/editors/space_view3d/SConscript
index 907afc12020..9c1c03ff373 100644
--- a/source/blender/editors/space_view3d/SConscript
+++ b/source/blender/editors/space_view3d/SConscript
@@ -6,14 +6,14 @@ defs = [ 'GLEW_STATIC' ]
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
-incs += ' ../../render/extern/include'
+incs += ' ../../render/extern/include ../../blenloader'
incs += ' ../../gpu ../../makesrna ../../blenfont ../../bmesh'
incs += ' #/intern/smoke/extern'
incs += ' #source/kernel/gen_system'
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( 'bf_editors_space_view3d', sources, Split(incs), defines = defs, libtype=['core'], priority=[40] )
diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c
index fb271556a9c..3c72547bd66 100644
--- a/source/blender/editors/space_view3d/drawanimviz.c
+++ b/source/blender/editors/space_view3d/drawanimviz.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,7 @@
#include <string.h>
#include <math.h>
+#include "BLO_sys_types.h"
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
@@ -64,7 +65,7 @@
// - include support for editing the path verts
/* Set up drawing environment for drawing motion paths */
-void draw_motion_paths_init(Scene *scene, View3D *v3d, ARegion *ar)
+void draw_motion_paths_init(View3D *v3d, ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
@@ -78,8 +79,7 @@ void draw_motion_paths_init(Scene *scene, View3D *v3d, ARegion *ar)
* - assumes that the viewport has already been initialised properly
* i.e. draw_motion_paths_init() has been called
*/
-// FIXME: the text is still drawn in the wrong space - it includes the current transforms of the object still...
-void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
+void draw_motion_path_instance(Scene *scene,
Object *ob, bPoseChannel *pchan, bAnimVizSettings *avs, bMotionPath *mpath)
{
//RegionView3D *rv3d= ar->regiondata;
@@ -201,15 +201,24 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
UI_ThemeColor(TH_TEXT_HI);
}
+ // XXX, this isnt up to date but probably should be kept so.
+ invert_m4_m4(ob->imat, ob->obmat);
+
/* Draw frame numbers at each framestep value */
if (avs->path_viewflag & MOTIONPATH_VIEW_FNUMS) {
+ unsigned char col[4];
+ UI_GetThemeColor3ubv(TH_TEXT_HI, col);
+ col[3]= 255;
+
for (i=0, mpv=mpv_start; i < len; i+=stepsize, mpv+=stepsize) {
char str[32];
+ float co[3];
/* only draw framenum if several consecutive highlighted points don't occur on same point */
if (i == 0) {
sprintf(str, "%d", (i+sfra));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
else if ((i > stepsize) && (i < len-stepsize)) {
bMotionPathVert *mpvP = (mpv - stepsize);
@@ -217,7 +226,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
if ((equals_v3v3(mpv->co, mpvP->co)==0) || (equals_v3v3(mpv->co, mpvN->co)==0)) {
sprintf(str, "%d", (sfra+i));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -225,6 +235,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
/* Keyframes - dots and numbers */
if (avs->path_viewflag & MOTIONPATH_VIEW_KFRAS) {
+ unsigned char col[4];
+
AnimData *adt= BKE_animdata_from_id(&ob->id);
DLRBT_Tree keys;
@@ -250,8 +262,11 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
}
/* Draw slightly-larger yellow dots at each keyframe */
- UI_ThemeColor(TH_VERTEX_SELECT);
+ UI_GetThemeColor3ubv(TH_VERTEX_SELECT, col);
+ col[3]= 255;
+
glPointSize(4.0f); // XXX perhaps a bit too big
+ glColor3ubv(col);
glBegin(GL_POINTS);
for (i=0, mpv=mpv_start; i < len; i++, mpv++) {
@@ -266,6 +281,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
/* Draw frame numbers of keyframes */
if (avs->path_viewflag & MOTIONPATH_VIEW_KFNOS) {
+ float co[3];
for (i=0, mpv=mpv_start; i < len; i++, mpv++) {
float mframe= (float)(sfra + i);
@@ -273,7 +289,8 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
char str[32];
sprintf(str, "%d", (sfra+i));
- view3d_cached_text_draw_add(mpv->co[0], mpv->co[1], mpv->co[2], str, 0, 0);
+ mul_v3_m4v3(co, ob->imat, mpv->co);
+ view3d_cached_text_draw_add(co, str, 0, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -283,7 +300,7 @@ void draw_motion_path_instance(Scene *scene, View3D *v3d, ARegion *ar,
}
/* Clean up drawing environment after drawing motion paths */
-void draw_motion_paths_cleanup(Scene *scene, View3D *v3d, ARegion *ar)
+void draw_motion_paths_cleanup(View3D *v3d)
{
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
glPopMatrix();
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index 1d86e0d074f..93a08af6903 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,6 +43,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_dlrbTree.h"
+#include "BLI_utildefines.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
@@ -50,7 +51,7 @@
#include "BKE_global.h"
#include "BKE_modifier.h"
#include "BKE_nla.h"
-#include "BKE_utildefines.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -140,7 +141,7 @@ static void cp_shade_color3ub (char cp[], int offset)
}
/* This function sets the gl-color for coloring a certain bone (based on bcolor) */
-static short set_pchan_glColor (short colCode, int armflag, int boneflag, int constflag)
+static short set_pchan_glColor (short colCode, int boneflag, int constflag)
{
switch (colCode) {
case PCHAN_COLOR_NORMAL:
@@ -150,6 +151,9 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
if (boneflag & BONE_DRAW_ACTIVE) {
VECCOPY(cp, bcolor->active);
+ if(!(boneflag & BONE_SELECTED)) {
+ cp_shade_color3ub(cp, -80);
+ }
}
else if (boneflag & BONE_SELECTED) {
VECCOPY(cp, bcolor->select);
@@ -163,7 +167,8 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
glColor3ub(cp[0], cp[1], cp[2]);
}
else {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorShade(TH_BONE_POSE, 40);
+ if (boneflag & BONE_DRAW_ACTIVE && boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_BONE_POSE, 40);
+ else if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorBlend(TH_WIRE, TH_BONE_POSE, 0.15f); /* unselected active */
else if (boneflag & BONE_SELECTED) UI_ThemeColor(TH_BONE_POSE);
else UI_ThemeColor(TH_WIRE);
}
@@ -284,6 +289,13 @@ static short set_pchan_glColor (short colCode, int armflag, int boneflag, int co
return 0;
}
+static void set_ebone_glColor(const unsigned int boneflag)
+{
+ if (boneflag & BONE_DRAW_ACTIVE && boneflag & BONE_SELECTED) UI_ThemeColor(TH_EDGE_SELECT);
+ else if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, 0.15f); /* unselected active */
+ else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
+ else UI_ThemeColor(TH_WIRE);
+}
/* *************** Armature drawing, helper calls for parts ******************* */
@@ -310,7 +322,7 @@ static void drawsolidcube_size(float xsize, float ysize, float zsize)
if(displist==0) {
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
glBegin(GL_QUADS);
n[0]= -1.0;
@@ -340,19 +352,17 @@ static void drawsolidcube_size(float xsize, float ysize, float zsize)
glEndList();
}
- else glCallList(displist);
-
+
+ glCallList(displist);
}
static void drawcube_size(float xsize, float ysize, float zsize)
{
static GLuint displist=0;
- glScalef(xsize, ysize, zsize);
-
if(displist == 0) {
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
glBegin(GL_LINE_STRIP);
glVertex3fv(cube[0]); glVertex3fv(cube[1]);glVertex3fv(cube[2]); glVertex3fv(cube[3]);
@@ -368,7 +378,9 @@ static void drawcube_size(float xsize, float ysize, float zsize)
glEndList();
}
- else glCallList(displist);
+
+ glScalef(xsize, ysize, zsize);
+ glCallList(displist);
}
@@ -381,7 +393,7 @@ static void draw_bonevert(void)
GLUquadricObj *qobj;
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
glPushMatrix();
@@ -400,8 +412,8 @@ static void draw_bonevert(void)
glPopMatrix();
glEndList();
}
- else
- glCallList(displist);
+
+ glCallList(displist);
}
static void draw_bonevert_solid(void)
@@ -412,7 +424,7 @@ static void draw_bonevert_solid(void)
GLUquadricObj *qobj;
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj, GLU_FILL);
@@ -423,11 +435,11 @@ static void draw_bonevert_solid(void)
glEndList();
}
- else
- glCallList(displist);
+
+ glCallList(displist);
}
-static void draw_bone_octahedral()
+static void draw_bone_octahedral(void)
{
static GLuint displist=0;
@@ -435,7 +447,7 @@ static void draw_bone_octahedral()
float vec[6][3];
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
@@ -467,8 +479,8 @@ static void draw_bone_octahedral()
glEndList();
}
- else
- glCallList(displist);
+
+ glCallList(displist);
}
static void draw_bone_solid_octahedral(void)
@@ -479,7 +491,7 @@ static void draw_bone_solid_octahedral(void)
float vec[6][3], nor[3];
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
vec[0][0]= vec[0][1]= vec[0][2]= 0.0f;
vec[5][0]= vec[5][2]= 0.0f; vec[5][1]= 1.0f;
@@ -529,8 +541,8 @@ static void draw_bone_solid_octahedral(void)
glEndList();
}
- else
- glCallList(displist);
+
+ glCallList(displist);
}
/* *************** Armature drawing, bones ******************* */
@@ -551,7 +563,7 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id)
}
else {
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0);
else
UI_ThemeColor(TH_BONE_SOLID);
}
@@ -574,7 +586,7 @@ static void draw_bone_points(int dt, int armflag, unsigned int boneflag, int id)
}
else {
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, 0);
else
UI_ThemeColor(TH_BONE_SOLID);
}
@@ -616,17 +628,17 @@ static float co[16] ={
/* smat, imat = mat & imat to draw screenaligned */
-static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag, bPoseChannel *pchan, EditBone *ebone)
+static void draw_sphere_bone_dist(float smat[][4], float imat[][4], bPoseChannel *pchan, EditBone *ebone)
{
- float head, tail, length, dist;
+ float head, tail, dist /*, length*/;
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
if (ebone) {
/* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = len_v3v3(ebone->head, ebone->tail);
-
- length= ebone->length;
+
+ /*length= ebone->length;*/ /*UNUSED*/
tail= ebone->rad_tail;
dist= ebone->dist;
if (ebone->parent && (ebone->flag & BONE_CONNECTED))
@@ -637,7 +649,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
tailvec= ebone->tail;
}
else {
- length= pchan->bone->length;
+ /*length= pchan->bone->length;*/ /*UNUSED*/
tail= pchan->bone->rad_tail;
dist= pchan->bone->dist;
if (pchan->parent && (pchan->bone->flag & BONE_CONNECTED))
@@ -655,6 +667,26 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
mul_mat3_m4_v3(smat, dirvec);
/* clear zcomp */
dirvec[2]= 0.0f;
+
+ if(head != tail) {
+ /* correcyion when viewing along the bones axis
+ * it pops in and out but better then artifacts, [#23841] */
+ float view_dist= len_v2(dirvec);
+
+ if(head - view_dist > tail) {
+ tailvec= headvec;
+ tail = head;
+ zero_v3(dirvec);
+ dirvec[0]= 0.00001; // XXX. weak but ok
+ }
+ else if(tail - view_dist > head) {
+ headvec= tailvec;
+ head = tail;
+ zero_v3(dirvec);
+ dirvec[0]= 0.00001; // XXX. weak but ok
+ }
+ }
+
/* move vector back */
mul_mat3_m4_v3(imat, dirvec);
@@ -728,7 +760,7 @@ static void draw_sphere_bone_dist(float smat[][4], float imat[][4], int boneflag
/* smat, imat = mat & imat to draw screenaligned */
static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag, int boneflag, int constflag, unsigned int id, bPoseChannel *pchan, EditBone *ebone)
{
- float head, tail, length;
+ float head, tail /*, length*/;
float *headvec, *tailvec, dirvec[3];
/* figure out the sizes of spheres */
@@ -736,7 +768,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
/* this routine doesn't call get_matrix_editbone() that calculates it */
ebone->length = len_v3v3(ebone->head, ebone->tail);
- length= ebone->length;
+ /*length= ebone->length;*/ /*UNUSED*/
tail= ebone->rad_tail;
if (ebone->parent && (boneflag & BONE_CONNECTED))
head= ebone->parent->rad_tail;
@@ -746,7 +778,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
tailvec= ebone->tail;
}
else {
- length= pchan->bone->length;
+ /*length= pchan->bone->length;*/ /*UNUSED*/
tail= pchan->bone->rad_tail;
if ((pchan->parent) && (boneflag & BONE_CONNECTED))
head= pchan->parent->bone->rad_tail;
@@ -762,7 +794,7 @@ static void draw_sphere_bone_wire(float smat[][4], float imat[][4], int armflag,
else UI_ThemeColor(TH_VERTEX);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
/* Draw root point if we are not connected */
if ((boneflag & BONE_CONNECTED)==0) {
@@ -883,7 +915,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
else UI_ThemeColorShade(TH_BONE_SOLID, -30);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_END, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_END, boneflag, constflag);
else if (dt==OB_SOLID)
UI_ThemeColorShade(TH_BONE_SOLID, -30);
@@ -913,7 +945,7 @@ static void draw_sphere_bone(int dt, int armflag, int boneflag, int constflag, u
else UI_ThemeColor(TH_BONE_SOLID);
}
else if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_BASE, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SPHEREBONE_BASE, boneflag, constflag);
else if (dt == OB_SOLID)
UI_ThemeColor(TH_BONE_SOLID);
@@ -983,7 +1015,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
if (armflag & (ARM_EDITMODE|ARM_POSEMODE)) {
glLineWidth(4.0f);
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else if (armflag & ARM_EDITMODE) {
UI_ThemeColor(TH_WIRE);
}
@@ -1028,7 +1060,7 @@ static void draw_line_bone(int armflag, int boneflag, int constflag, unsigned in
glLoadName(id & 0xFFFF); /* object tag, for bordersel optim */
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_LINEBONE, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_LINEBONE, boneflag, constflag);
}
glLineWidth(2.0);
@@ -1127,15 +1159,13 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
/* colors for modes */
if (armflag & ARM_POSEMODE) {
if (dt <= OB_WIRE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
}
else if (armflag & ARM_EDITMODE) {
if (dt==OB_WIRE) {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColor(TH_EDGE_SELECT);
- else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
- else UI_ThemeColor(TH_WIRE);
+ set_ebone_glColor(boneflag);
}
else
UI_ThemeColor(TH_BONE_SOLID);
@@ -1151,7 +1181,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
glEnable(GL_LIGHTING);
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
else
UI_ThemeColor(TH_BONE_SOLID);
@@ -1166,7 +1196,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
if (armflag & ARM_POSEMODE) {
if (constflag) {
/* set constraint colors */
- if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, boneflag, constflag)) {
glEnable(GL_BLEND);
draw_b_bone_boxes(OB_SOLID, pchan, xwidth, length, zwidth);
@@ -1175,7 +1205,7 @@ static void draw_b_bone(int dt, int armflag, int boneflag, int constflag, unsign
}
/* restore colors */
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
}
}
@@ -1201,9 +1231,9 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
if (dt <= OB_WIRE)
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
else
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
}
@@ -1218,14 +1248,12 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
if (dt <= OB_WIRE) {
/* colors */
if (armflag & ARM_EDITMODE) {
- if (boneflag & BONE_DRAW_ACTIVE) UI_ThemeColor(TH_EDGE_SELECT);
- else if (boneflag & BONE_SELECTED) UI_ThemeColorShade(TH_EDGE_SELECT, -20);
- else UI_ThemeColor(TH_WIRE);
+ set_ebone_glColor(boneflag);
}
else if (armflag & ARM_POSEMODE) {
if (constflag) {
/* draw constraint colors */
- if (set_pchan_glColor(PCHAN_COLOR_CONSTS, armflag, boneflag, constflag)) {
+ if (set_pchan_glColor(PCHAN_COLOR_CONSTS, boneflag, constflag)) {
glEnable(GL_BLEND);
draw_bone_solid_octahedral();
@@ -1234,7 +1262,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
}
/* restore colors */
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, constflag);
}
}
draw_bone_octahedral();
@@ -1242,7 +1270,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
else {
/* solid */
if (armflag & ARM_POSEMODE)
- set_pchan_glColor(PCHAN_COLOR_SOLID, armflag, boneflag, constflag);
+ set_pchan_glColor(PCHAN_COLOR_SOLID, boneflag, constflag);
else
UI_ThemeColor(TH_BONE_SOLID);
draw_bone_solid_octahedral();
@@ -1263,7 +1291,7 @@ static void draw_custom_bone(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obje
/* colors for posemode */
if (armflag & ARM_POSEMODE) {
- set_pchan_glColor(PCHAN_COLOR_NORMAL, armflag, boneflag, 0);
+ set_pchan_glColor(PCHAN_COLOR_NORMAL, boneflag, 0);
}
if (id != -1) {
@@ -1545,7 +1573,7 @@ static void bone_matrix_translate_y(float mat[][4], float y)
}
/* assumes object is Armature with pose */
-static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt)
+static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, short ghost)
{
RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
@@ -1558,6 +1586,9 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
short do_dashed= 3, draw_wire= 0;
short flag, constflag;
+ /* being set below */
+ arm->layer_used= 0;
+
/* hacky... prevent outline select from drawing dashed helplines */
glGetFloatv(GL_LINE_WIDTH, &tmp);
if (tmp > 1.1) do_dashed &= ~1;
@@ -1582,7 +1613,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (bone && !(bone->flag & (BONE_HIDDEN_P|BONE_NO_DEFORM|BONE_HIDDEN_PG))) {
if (bone->flag & (BONE_SELECTED)) {
if (bone->layer & arm->layer)
- draw_sphere_bone_dist(smat, imat, bone->flag, pchan, NULL);
+ draw_sphere_bone_dist(smat, imat, pchan, NULL);
}
}
}
@@ -1604,6 +1635,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
+ arm->layer_used |= bone->layer;
if ( (bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG)) ) {
if (bone->layer & arm->layer) {
@@ -1622,7 +1654,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
/* set color-set to use */
@@ -1686,9 +1718,11 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
}
/* prepare colors */
- if (arm->flag & ARM_POSEMODE)
+ if(ghost) {
+ /* 13 October 2009, Disabled this to make ghosting show the right colors (Aligorith) */
+ }
+ else if (arm->flag & ARM_POSEMODE)
set_pchan_colorset(ob, pchan);
-#if 0 // XXX - 13 October 2009, Disabled this to make ghosting show the right colors (Aligorith)
else {
if ((scene->basact)==base) {
if (base->flag & (SELECT+BA_WAS_SEL)) UI_ThemeColor(TH_ACTIVE);
@@ -1699,7 +1733,6 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
else UI_ThemeColor(TH_WIRE);
}
}
-#endif
/* catch exception for bone with hidden parent */
flag= bone->flag;
@@ -1707,7 +1740,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
draw_custom_bone(scene, v3d, rv3d, pchan->custom, OB_WIRE, arm->flag, flag, index, bone->length);
@@ -1721,8 +1754,8 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (index != -1)
index+= 0x10000; // pose bones count in higher 2 bytes only
}
-
- if (draw_wire) {
+ /* stick bones have not been drawn yet so dont clear object selection in this case */
+ if ((arm->drawtype != ARM_LINE) && draw_wire) {
/* object tag, for bordersel optim */
glLoadName(index & 0xFFFF);
index= -1;
@@ -1748,10 +1781,11 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
bone= pchan->bone;
+ arm->layer_used |= bone->layer;
if ((bone) && !(bone->flag & (BONE_HIDDEN_P|BONE_HIDDEN_PG))) {
if (bone->layer & arm->layer) {
- if ((do_dashed & 1) && (bone->parent)) {
+ if ((do_dashed & 1) && (pchan->parent)) {
/* Draw a line from our root to the parent's tip
* - only if V3D_HIDE_HELPLINES is enabled...
*/
@@ -1802,7 +1836,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((bone == arm->act_bone) && (bone->flag & BONE_SELECTED))
+ if (bone == arm->act_bone)
flag |= BONE_DRAW_ACTIVE;
/* extra draw service for pose mode */
@@ -1853,6 +1887,12 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
/* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
if ((G.f & G_PICKSEL) == 0) {
float vec[3];
+
+ unsigned char col[4];
+ float col_f[3];
+ glGetFloatv(GL_CURRENT_COLOR, col_f); /* incase this is not set below */
+ rgb_float_to_byte(col_f, col);
+ col[3]= 255;
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
@@ -1861,17 +1901,16 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
if (pchan->bone->layer & arm->layer) {
if (arm->flag & (ARM_EDITMODE|ARM_POSEMODE)) {
bone= pchan->bone;
-
- if (bone->flag & BONE_SELECTED) UI_ThemeColor(TH_TEXT_HI);
- else UI_ThemeColor(TH_TEXT);
+ UI_GetThemeColor3ubv((bone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, col);
}
- else if (dt > OB_WIRE)
- UI_ThemeColor(TH_TEXT);
-
+ else if (dt > OB_WIRE) {
+ UI_GetThemeColor3ubv(TH_TEXT, col);
+ }
+
/* Draw names of bone */
if (arm->flag & ARM_DRAWNAMES) {
mid_v3_v3v3(vec, pchan->pose_head, pchan->pose_tail);
- view3d_cached_text_draw_add(vec[0], vec[1], vec[2], pchan->name, 10, 0);
+ view3d_cached_text_draw_add(vec, pchan->name, 10, 0, col);
}
/* Draw additional axes on the bone tail */
@@ -1880,8 +1919,9 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
copy_m4_m4(bmat, pchan->pose_mat);
bone_matrix_translate_y(bmat, pchan->bone->length);
glMultMatrixf(bmat);
-
- drawaxes(pchan->bone->length*0.25f, 0, OB_ARROWS);
+
+ glColor3ubv(col);
+ drawaxes(pchan->bone->length*0.25f, OB_ARROWS);
glPopMatrix();
}
@@ -1920,6 +1960,9 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
unsigned int index;
int flag;
+ /* being set in code below */
+ arm->layer_used= 0;
+
/* envelope (deform distance) */
if(arm->drawtype==ARM_ENVELOPE) {
/* precalc inverse matrix for drawing screen aligned */
@@ -1933,11 +1976,11 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
- for (eBone=arm->edbo->first, index=0; eBone; eBone=eBone->next, index++) {
+ for (eBone=arm->edbo->first; eBone; eBone=eBone->next) {
if (eBone->layer & arm->layer) {
if ((eBone->flag & (BONE_HIDDEN_A|BONE_NO_DEFORM))==0) {
if (eBone->flag & (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL))
- draw_sphere_bone_dist(smat, imat, eBone->flag, NULL, eBone);
+ draw_sphere_bone_dist(smat, imat, NULL, eBone);
}
}
}
@@ -1949,7 +1992,6 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
/* if solid we draw it first */
if ((dt > OB_WIRE) && (arm->drawtype!=ARM_LINE)) {
- index= 0;
for (eBone=arm->edbo->first, index=0; eBone; eBone=eBone->next, index++) {
if (eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
@@ -1959,11 +2001,11 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && !EBONE_VISIBLE(arm, eBone->parent))
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((eBone == arm->act_edbone) && (eBone->flag & BONE_SELECTED))
+ if (eBone == arm->act_edbone)
flag |= BONE_DRAW_ACTIVE;
if (arm->drawtype==ARM_ENVELOPE)
@@ -1993,16 +2035,17 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
index= 0; /* do selection codes */
for (eBone=arm->edbo->first; eBone; eBone=eBone->next) {
+ arm->layer_used |= eBone->layer;
if (eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
/* catch exception for bone with hidden parent */
flag= eBone->flag;
- if ( (eBone->parent) && ((eBone->parent->flag & BONE_HIDDEN_A) || (eBone->parent->layer & arm->layer)==0) )
+ if ( (eBone->parent) && !EBONE_VISIBLE(arm, eBone->parent))
flag &= ~BONE_CONNECTED;
/* set temporary flag for drawing bone as active, but only if selected */
- if ((eBone == arm->act_edbone) && (eBone->flag & BONE_SELECTED))
+ if (eBone == arm->act_edbone)
flag |= BONE_DRAW_ACTIVE;
if (arm->drawtype == ARM_ENVELOPE) {
@@ -2043,6 +2086,7 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
}
/* restore */
+ if(index!=-1) glLoadName(-1);
if (arm->drawtype==ARM_LINE);
else if (dt>OB_WIRE) bglPolygonOffset(rv3d->dist, 0.0f);
@@ -2051,21 +2095,22 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
// patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing
if ((G.f & G_PICKSEL) == 0) {
float vec[3];
+ unsigned char col[4];
+ col[3]= 255;
if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
- for (eBone=arm->edbo->first, index=0; eBone; eBone=eBone->next, index++) {
+ for (eBone=arm->edbo->first; eBone; eBone=eBone->next) {
if(eBone->layer & arm->layer) {
if ((eBone->flag & BONE_HIDDEN_A)==0) {
-
- if (eBone->flag & BONE_SELECTED) UI_ThemeColor(TH_TEXT_HI);
- else UI_ThemeColor(TH_TEXT);
-
+
+ UI_GetThemeColor3ubv((eBone->flag & BONE_SELECTED) ? TH_TEXT_HI : TH_TEXT, col);
+
/* Draw name */
if (arm->flag & ARM_DRAWNAMES) {
mid_v3_v3v3(vec, eBone->head, eBone->tail);
glRasterPos3fv(vec);
- view3d_cached_text_draw_add(vec[0], vec[1], vec[2], eBone->name, 10, 0);
+ view3d_cached_text_draw_add(vec, eBone->name, 10, 0, col);
}
/* Draw additional axes */
if (arm->flag & ARM_DRAWAXES) {
@@ -2073,8 +2118,9 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, int dt)
get_matrix_editbone(eBone, bmat);
bone_matrix_translate_y(bmat, eBone->length);
glMultMatrixf(bmat);
-
- drawaxes(eBone->length*0.25f, 0, OB_ARROWS);
+
+ glColor3ubv(col);
+ drawaxes(eBone->length*0.25f, OB_ARROWS);
glPopMatrix();
}
@@ -2102,16 +2148,16 @@ static void draw_pose_paths(Scene *scene, View3D *v3d, ARegion *ar, Object *ob)
bPoseChannel *pchan;
/* setup drawing environment for paths */
- draw_motion_paths_init(scene, v3d, ar);
+ draw_motion_paths_init(v3d, ar);
/* draw paths where they exist and they releated bone is visible */
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if ((pchan->bone->layer & arm->layer) && (pchan->mpath))
- draw_motion_path_instance(scene, v3d, ar, ob, pchan, avs, pchan->mpath);
+ draw_motion_path_instance(scene, ob, pchan, avs, pchan->mpath);
}
/* cleanup after drawing */
- draw_motion_paths_cleanup(scene, v3d, ar);
+ draw_motion_paths_cleanup(v3d);
}
@@ -2191,7 +2237,7 @@ static void draw_ghost_poses_range(Scene *scene, View3D *v3d, ARegion *ar, Base
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2270,7 +2316,7 @@ static void draw_ghost_poses_keys(Scene *scene, View3D *v3d, ARegion *ar, Base *
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
glDisable(GL_BLEND);
if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
@@ -2340,7 +2386,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
}
@@ -2355,7 +2401,7 @@ static void draw_ghost_poses(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (CFRA != cfrao) {
BKE_animsys_evaluate_animdata(&ob->id, adt, (float)CFRA, ADT_RECALC_ALL);
where_is_pose(scene, ob);
- draw_pose_bones(scene, v3d, ar, base, OB_WIRE);
+ draw_pose_bones(scene, v3d, ar, base, OB_WIRE, TRUE);
}
}
}
@@ -2389,7 +2435,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
/* we use color for solid lighting */
glColorMaterial(GL_FRONT_AND_BACK, GL_SPECULAR);
glEnable(GL_COLOR_MATERIAL);
- glColor3ub(0,0,0); // clear spec
+ glColor3ub(255,0,255); // clear spec
glDisable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
@@ -2438,7 +2484,7 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
}
}
}
- draw_pose_bones(scene, v3d, ar, base, dt);
+ draw_pose_bones(scene, v3d, ar, base, dt, FALSE);
arm->flag &= ~ARM_POSEMODE;
if(ob->mode & OB_MODE_POSE)
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 9acb7443a8f..030f368aaa2 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,7 +34,7 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
-
+#include "BLI_utildefines.h"
#include "DNA_material_types.h"
#include "DNA_meshdata_types.h"
@@ -51,9 +51,9 @@
#include "BKE_material.h"
#include "BKE_paint.h"
#include "BKE_property.h"
-#include "BKE_utildefines.h"
#include "BKE_tessmesh.h"
+
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -95,13 +95,10 @@ static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
EdgeHash *eh = BLI_edgehash_new();
int i;
MFace *mf;
- MTFace *tf = NULL;
for (i=0; i<me->totface; i++) {
mf = &me->mface[i];
- if (me->mtface)
- tf = &me->mtface[i];
-
+
if (mf->v3) {
if (!(mf->flag&ME_HIDE)) {
unsigned int flags = eEdge_Visible;
@@ -170,6 +167,7 @@ static int draw_tfaces3D__setSelectOpts(void *userData, int index)
return flags & eEdge_Select;
}
+#if 0
static int draw_tfaces3D__setActiveOpts(void *userData, int index)
{
struct { Mesh *me; EdgeHash *eh; } *data = userData;
@@ -193,8 +191,21 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
else
return 0;
}
+#endif
+
+/* draws unselected */
+static int draw_tfaces3D__drawFaceOptsInv(void *userData, int index)
+{
+ Mesh *me = (Mesh*)userData;
+
+ MFace *mface = &me->mface[index];
+ if (!(mface->flag&ME_HIDE) && !(mface->flag&ME_FACE_SEL))
+ return 2; /* Don't set color */
+ else
+ return 0;
+}
-static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh *dm)
+static void draw_tfaces3D(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm, short draw_seams)
{
struct { Mesh *me; EdgeHash *eh; } data;
@@ -205,17 +216,17 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
glDisable(GL_LIGHTING);
bglPolygonOffset(rv3d->dist, 1.0);
- /* Draw (Hidden) Edges */
+ /* Draw (Hidden) Edges */
+ setlinestyle(1);
UI_ThemeColor(TH_EDGE_FACESEL);
dm->drawMappedEdges(dm, draw_tfaces3D__setHiddenOpts, &data);
+ setlinestyle(0);
- /* Draw Seams */
- if(me->drawflag & ME_DRAWSEAMS) {
+ /* Draw Seams */
+ if(draw_seams && me->drawflag & ME_DRAWSEAMS) {
UI_ThemeColor(TH_EDGE_SEAM);
glLineWidth(2);
-
dm->drawMappedEdges(dm, draw_tfaces3D__setSeamOpts, &data);
-
glLineWidth(1);
}
@@ -223,10 +234,16 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
if(me->drawflag & ME_DRAWFACES) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#if 0
UI_ThemeColor4(TH_FACE_SELECT);
dm->drawMappedFacesTex(dm, draw_tfaces3D__drawFaceOpts, (void*)me);
-
+#else
+ /* dull unselected faces so as not to get in the way of seeing color */
+ glColor4ub(96, 96, 96, 64);
+ dm->drawMappedFacesTex(dm, draw_tfaces3D__drawFaceOptsInv, (void*)me);
+#endif
+
glDisable(GL_BLEND);
}
@@ -238,8 +255,6 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh
dm->drawMappedEdges(dm, draw_tfaces3D__setSelectOpts, &data);
setlinestyle(0);
- dm->drawMappedEdges(dm, draw_tfaces3D__setActiveOpts, &data);
-
bglPolygonOffset(rv3d->dist, 0.0); // resets correctly now, even after calling accumulated offsets
BLI_edgehash_free(data.eh, NULL);
@@ -327,7 +342,7 @@ static int set_draw_settings_cached(int clearcache, int textured, MTFace *texfac
/* Icky globals, fix with userdata parameter */
-struct TextureDrawState {
+static struct TextureDrawState {
Object *ob;
int islit, istex;
int color_profile;
@@ -367,7 +382,7 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
glShadeModel(GL_SMOOTH);
}
-static void draw_textured_end()
+static void draw_textured_end(void)
{
/* switch off textures */
GPU_set_tpage(NULL, 0);
@@ -561,17 +576,18 @@ static int draw_em_tf_mapped__set_draw(void *userData, int index)
static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
{
Mesh *me = (Mesh*)userData;
- MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
- MFace *mface = (me->mface)? &me->mface[index]: NULL;
-
- if ((mface->flag&ME_HIDE) || (tface && (tface->mode&TF_INVISIBLE)))
- return 0;
-
+
+ if ( (me->mface && me->mface[index].flag & ME_HIDE) ||
+ (me->mtface && (me->mtface[index].mode & TF_INVISIBLE))
+ ) {
+ return 0;
+ }
+
*drawSmooth_r = 1;
return 1;
}
-void draw_mesh_text(Scene *scene, Object *ob, int glsl)
+static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
{
Mesh *me = ob->data;
DerivedMesh *ddm;
@@ -667,20 +683,20 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* draw the textured mesh */
draw_textured_begin(scene, v3d, rv3d, ob);
+ glColor4f(1.0f,1.0f,1.0f,1.0f);
+
if(ob->mode & OB_MODE_EDIT) {
- glColor4f(1.0f,1.0f,1.0f,1.0f);
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, me->edit_btmesh);
} else if(faceselect) {
if(ob->mode & OB_MODE_WEIGHT_PAINT)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1, GPU_enable_material);
else
- dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
+ dm->drawMappedFacesTex(dm, me->mface ? draw_tface_mapped__set_draw : NULL, me);
}
else {
if( GPU_buffer_legacy(dm) )
dm->drawFacesTex(dm, draw_tface__set_draw_legacy);
else {
- glColor4f(1.0f,1.0f,1.0f,1.0f);
if( !CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL) )
add_tface_color_layer(dm);
dm->drawFacesTex(dm, draw_tface__set_draw);
@@ -695,7 +711,7 @@ void draw_mesh_textured(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *o
/* draw edges and selected faces over textured mesh */
if(!(ob == scene->obedit) && faceselect)
- draw_tfaces3D(rv3d, ob, me, dm);
+ draw_tfaces3D(rv3d, me, dm, ob->mode & OB_MODE_WEIGHT_PAINT);
/* reset from negative scale correction */
glFrontFace(GL_CCW);
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 6b3d9abf181..a87cbd0530d 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,6 +47,7 @@
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h" //for the where_on_path function
#include "BKE_constraint.h" // for the get_constraint_target function
@@ -67,7 +68,7 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_unit.h"
-#include "BKE_utildefines.h"
+
#include "BKE_tessmesh.h"
#include "smoke_API.h"
@@ -318,12 +319,16 @@ static float cosval[32] ={
1.00000000
};
-static void draw_xyz_wire(float *c, float size, int axis)
+static void draw_xyz_wire(const float c[3], float size, int axis)
{
float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f};
float dim = size * 0.1;
- float dx[3]={dim, 0.0, 0.0}, dy[3]={0.0, dim, 0.0}, dz[3]={0.0, 0.0, dim};
-
+ float dx[3], dy[3], dz[3];
+
+ dx[0]=dim; dx[1]=0.f; dx[2]=0.f;
+ dy[0]=0.f; dy[1]=dim; dy[2]=0.f;
+ dz[0]=0.f; dz[1]=0.f; dz[2]=dim;
+
switch(axis) {
case 0: /* x axis */
glBegin(GL_LINES);
@@ -400,8 +405,7 @@ static void draw_xyz_wire(float *c, float size, int axis)
}
-/* flag is same as for draw_object */
-void drawaxes(float size, int flag, char drawtype)
+void drawaxes(float size, char drawtype)
{
int axis;
float v1[3]= {0.0, 0.0, 0.0};
@@ -412,16 +416,16 @@ void drawaxes(float size, int flag, char drawtype)
case OB_PLAINAXES:
for (axis=0; axis<3; axis++) {
- float v1[3]= {0.0, 0.0, 0.0};
- float v2[3]= {0.0, 0.0, 0.0};
-
glBegin(GL_LINES);
v1[axis]= size;
v2[axis]= -size;
glVertex3fv(v1);
glVertex3fv(v2);
-
+
+ /* reset v1 & v2 to zero */
+ v1[axis]= v2[axis]= 0.0f;
+
glEnd();
}
break;
@@ -477,10 +481,8 @@ void drawaxes(float size, int flag, char drawtype)
case OB_ARROWS:
default:
for (axis=0; axis<3; axis++) {
- float v1[3]= {0.0, 0.0, 0.0};
- float v2[3]= {0.0, 0.0, 0.0};
- int arrow_axis= (axis==0)?1:0;
-
+ const int arrow_axis= (axis==0) ? 1:0;
+
glBegin(GL_LINES);
v2[axis]= size;
@@ -501,12 +503,16 @@ void drawaxes(float size, int flag, char drawtype)
v2[axis]+= size*0.125;
draw_xyz_wire(v2, size, axis);
+
+
+ /* reset v1 & v2 to zero */
+ v1[arrow_axis]= v1[axis]= v2[axis]= 0.0f;
}
break;
}
}
-void drawcircball(int mode, float *cent, float rad, float tmat[][4])
+void drawcircball(int mode, const float cent[3], float rad, float tmat[][4])
{
float vec[3], vx[3], vy[3];
int a, tot=32;
@@ -525,12 +531,9 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
}
/* circle for object centers, special_color is for library or ob users */
-static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int selstate, int special_color)
+static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, const float co[3], int selstate, int special_color)
{
- float size;
-
- size= rv3d->persmat[0][3]*vec[0]+ rv3d->persmat[1][3]*vec[1]+ rv3d->persmat[2][3]*vec[2]+ rv3d->persmat[3][3];
- size*= rv3d->pixsize*((float)U.obcenter_dia*0.5f);
+ const float size= view3d_pixel_size(rv3d, co) * (float)U.obcenter_dia * 0.5f;
/* using gldepthfunc guarantees that it does write z values, but not checks for it, so centers remain visible independt order of drawing */
if(v3d->zbuf) glDepthFunc(GL_ALWAYS);
@@ -546,10 +549,10 @@ static void drawcentercircle(View3D *v3d, RegionView3D *rv3d, float *vec, int se
else if (selstate == SELECT) UI_ThemeColorShadeAlpha(TH_SELECT, 0, -80);
else if (selstate == DESELECT) UI_ThemeColorShadeAlpha(TH_TRANSFORM, 0, -80);
}
- drawcircball(GL_POLYGON, vec, size, rv3d->viewinv);
+ drawcircball(GL_POLYGON, co, size, rv3d->viewinv);
UI_ThemeColorShadeAlpha(TH_WIRE, 0, -30);
- drawcircball(GL_LINE_LOOP, vec, size, rv3d->viewinv);
+ drawcircball(GL_LINE_LOOP, co, size, rv3d->viewinv);
glDisable(GL_BLEND);
if(v3d->zbuf) glDepthFunc(GL_LEQUAL);
@@ -561,33 +564,38 @@ static int CachedTextLevel= 0;
typedef struct ViewCachedString {
struct ViewCachedString *next, *prev;
- float vec[3], col[4];
- char str[128];
+ float vec[3];
+ union {
+ unsigned char ub[4];
+ int pack;
+ } col;
short mval[2];
short xoffs;
short flag;
+ /* str is allocated past the end */
} ViewCachedString;
-void view3d_cached_text_draw_begin()
+void view3d_cached_text_draw_begin(void)
{
ListBase *strings= &CachedText[CachedTextLevel];
strings->first= strings->last= NULL;
CachedTextLevel++;
}
-void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag)
+void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag, const unsigned char col[4])
{
+ int alloc_len= strlen(str) + 1;
ListBase *strings= &CachedText[CachedTextLevel-1];
- ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString), "ViewCachedString");
+ ViewCachedString *vos= MEM_callocN(sizeof(ViewCachedString) + alloc_len, "ViewCachedString");
BLI_addtail(strings, vos);
- BLI_strncpy(vos->str, str, 128);
- vos->vec[0]= x;
- vos->vec[1]= y;
- vos->vec[2]= z;
- glGetFloatv(GL_CURRENT_COLOR, vos->col);
+ copy_v3_v3(vos->vec, co);
+ vos->col.pack= *((int *)col);
vos->xoffs= xoffs;
vos->flag= flag;
+
+ /* allocate past the end */
+ memcpy(++vos, str, alloc_len);
}
void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4])
@@ -607,6 +615,8 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
}
if(tot) {
+ int col_pack_prev= 0;
+
#if 0
bglMats mats; /* ZBuffer depth vars */
double ux, uy, uz;
@@ -641,8 +651,18 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
}
#endif
if(vos->mval[0]!=IS_CLIPPED) {
- glColor3fv(vos->col);
- BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, vos->str);
+ const char *str= (char *)(vos+1);
+
+ if(col_pack_prev != vos->col.pack) {
+ glColor3ubv(vos->col.ub);
+ col_pack_prev= vos->col.pack;
+ }
+ if(vos->flag & V3D_CACHE_TEXT_ASCII) {
+ BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ }
+ else {
+ BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ }
}
}
@@ -782,7 +802,9 @@ static void spotvolume(float *lvec, float *vvec, float inp)
cross_v3_v3v3(temp,vvec,lvec); /* equation for a plane through vvec en lvec */
cross_v3_v3v3(plane,lvec,temp); /* a plane perpendicular to this, parrallel with lvec */
- normalize_v3(plane);
+ /* vectors are exactly aligned, use the X axis, this is arbitrary */
+ if(normalize_v3(plane) == 0.0f)
+ plane[1]= 1.0f;
/* now we've got two equations: one of a cone and one of a plane, but we have
three unknowns. We remove one unkown by rotating the plane to z=0 (the plane normal) */
@@ -894,13 +916,17 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z)
static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt, int flag)
{
Object *ob= base->object;
+ const float pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
Lamp *la= ob->data;
float vec[3], lvec[3], vvec[3], circrad, x,y,z;
- float pixsize, lampsize;
+ float lampsize;
float imat[4][4], curcol[4];
- char col[4];
- int drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && la->type == LA_SPOT && (la->mode & LA_SHOW_CONE));
-
+ unsigned char col[4];
+ /* cone can't be drawn for duplicated lamps, because duplilist would be freed to */
+ /* the moment of view3d_draw_transp() call */
+ const short is_view= (rv3d->persp==RV3D_CAMOB && v3d->camera == base->object);
+ const short drawcone= (dt>OB_WIRE && !(G.f & G_PICKSEL) && (la->type == LA_SPOT) && (la->mode & LA_SHOW_CONE) && !(base->flag & OB_FROMDUPLI) && !is_view);
+
if(drawcone && !v3d->transp) {
/* in this case we need to draw delayed */
add_view3d_after(&v3d->afterdraw_transp, base, flag);
@@ -912,14 +938,15 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glLoadMatrixf(rv3d->viewmat);
/* lets calculate the scale: */
- pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
- pixsize*= rv3d->pixsize;
lampsize= pixsize*((float)U.obcenter_dia*0.5f);
/* and view aligned matrix: */
copy_m4_m4(imat, rv3d->viewinv);
normalize_v3(imat[0]);
normalize_v3(imat[1]);
+
+ /* lamp center */
+ copy_v3_v3(vec, ob->obmat[3]);
/* for AA effects */
glGetFloatv(GL_CURRENT_COLOR, curcol);
@@ -934,7 +961,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
}
/* Inner Circle */
- copy_v3_v3(vec, ob->obmat[3]);
glEnable(GL_BLEND);
drawcircball(GL_LINE_LOOP, vec, lampsize, imat);
glDisable(GL_BLEND);
@@ -1004,7 +1030,10 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glPopMatrix(); /* back in object space */
zero_v3(vec);
- if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
+ if(is_view) {
+ /* skip drawing extra info */
+ }
+ else if ((la->type==LA_SPOT) || (la->type==LA_YF_PHOTON)) {
lvec[0]=lvec[1]= 0.0;
lvec[2] = 1.0;
x = rv3d->persmat[0][2];
@@ -1147,12 +1176,12 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
setlinestyle(0);
- if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF) ) {
+ if((la->type == LA_SPOT) && (la->mode & LA_SHAD_BUF) && (is_view == FALSE)) {
drawshadbuflimits(la, ob->obmat);
}
UI_GetThemeColor4ubv(TH_LAMP, col);
- glColor4ub(col[0], col[1], col[2], col[3]);
+ glColor4ubv(col);
glEnable(GL_BLEND);
@@ -1212,10 +1241,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
{
/* a standing up pyramid with (0,0,0) as top */
Camera *cam;
- World *wrld;
- float nobmat[4][4], vec[8][4], fac, facx, facy, depth, aspx, aspy, caspx, caspy;
+ float vec[8][4], facx, facy, depth, aspx, aspy, caspx, caspy, shx, shy;
int i;
+ float drawsize;
+ const short is_view= (rv3d->persp==RV3D_CAMOB && ob==v3d->camera);
+ const float scax= 1.0f / len_v3(ob->obmat[0]);
+ const float scay= 1.0f / len_v3(ob->obmat[1]);
+ const float scaz= 1.0f / len_v3(ob->obmat[2]);
+
cam= ob->data;
aspx= (float) scene->r.xsch*scene->r.xasp;
aspy= (float) scene->r.ysch*scene->r.yasp;
@@ -1232,36 +1266,55 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
- if(rv3d->persp>=2 && cam->type==CAM_ORTHO && ob==v3d->camera) {
- facx= 0.5*cam->ortho_scale*caspx;
- facy= 0.5*cam->ortho_scale*caspy;
- depth= -cam->clipsta-0.1;
+ if(cam->type==CAM_ORTHO) {
+ facx= 0.5f * cam->ortho_scale * caspx * scax;
+ facy= 0.5f * cam->ortho_scale * caspy * scay;
+ shx= cam->shiftx * cam->ortho_scale * scax;
+ shy= cam->shifty * cam->ortho_scale * scay;
+ depth= is_view ? -((cam->clipsta * scaz) + 0.1f) : - cam->drawsize * cam->ortho_scale * scaz;
+
+ drawsize= 0.5f * cam->ortho_scale;
}
else {
- fac= cam->drawsize;
- if(rv3d->persp>=2 && ob==v3d->camera) fac= cam->clipsta+0.1; /* that way it's always visible */
-
- depth= - fac*cam->lens/16.0;
- facx= fac*caspx;
- facy= fac*caspy;
+ /* that way it's always visible - clipsta+0.1 */
+ float fac;
+ drawsize= cam->drawsize / ((scax + scay + scaz) / 3.0f);
+
+ if(is_view) {
+ /* fixed depth, variable size (avoids exceeding clipping range) */
+ depth = -(cam->clipsta + 0.1);
+ fac = depth / (cam->lens/-16.0f * scaz);
+ }
+ else {
+ /* fixed size, variable depth (stays a reasonable size in the 3D view) */
+ depth= drawsize * cam->lens/-16.0f * scaz;
+ fac= drawsize;
+ }
+
+ facx= fac * caspx * scax;
+ facy= fac * caspy * scay;
+ shx= cam->shiftx*fac*2 * scax;
+ shy= cam->shifty*fac*2 * scay;
}
- vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.001; /* GLBUG: for picking at iris Entry (well thats old!) */
- vec[1][0]= facx; vec[1][1]= facy; vec[1][2]= depth;
- vec[2][0]= facx; vec[2][1]= -facy; vec[2][2]= depth;
- vec[3][0]= -facx; vec[3][1]= -facy; vec[3][2]= depth;
- vec[4][0]= -facx; vec[4][1]= facy; vec[4][2]= depth;
+ vec[0][0]= 0.0; vec[0][1]= 0.0; vec[0][2]= 0.0;
+ vec[1][0]= shx + facx; vec[1][1]= shy + facy; vec[1][2]= depth;
+ vec[2][0]= shx + facx; vec[2][1]= shy - facy; vec[2][2]= depth;
+ vec[3][0]= shx - facx; vec[3][1]= shy - facy; vec[3][2]= depth;
+ vec[4][0]= shx - facx; vec[4][1]= shy + facy; vec[4][2]= depth;
+ /* camera frame */
glBegin(GL_LINE_LOOP);
glVertex3fv(vec[1]);
glVertex3fv(vec[2]);
glVertex3fv(vec[3]);
glVertex3fv(vec[4]);
glEnd();
-
- if(rv3d->persp>=2 && ob==v3d->camera) return;
-
+ if(is_view)
+ return;
+
+ /* center point to camera frame */
glBegin(GL_LINE_STRIP);
glVertex3fv(vec[2]);
glVertex3fv(vec[0]);
@@ -1275,7 +1328,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
/* arrow on top */
vec[0][2]= depth;
-
+
/* draw an outline arrow for inactive cameras and filled
* for active cameras. We actually draw both outline+filled
* for active cameras so the wire can be seen side-on */
@@ -1283,24 +1336,26 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
if (i==0) glBegin(GL_LINE_LOOP);
else if (i==1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES);
else break;
+
+ vec[0][0]= shx + ((-0.7 * drawsize) * scax);
+ vec[0][1]= shy + ((drawsize * (caspy + 0.1)) * scay);
+ glVertex3fv(vec[0]); /* left */
- vec[0][0]= -0.7*cam->drawsize*caspx;
- vec[0][1]= 1.1*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
-
- vec[0][0]= 0.0;
- vec[0][1]= 1.8*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
+ vec[0][0]= shx + ((0.7 * drawsize) * scax);
+ glVertex3fv(vec[0]); /* right */
- vec[0][0]= 0.7*cam->drawsize*caspx;
- vec[0][1]= 1.1*cam->drawsize*caspy;
- glVertex3fv(vec[0]);
+ vec[0][0]= shx;
+ vec[0][1]= shy + ((1.1 * drawsize * (caspy + 0.7)) * scay);
+ glVertex3fv(vec[0]); /* top */
glEnd();
}
if(flag==0) {
if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) {
+ float nobmat[4][4];
+ World *wrld;
+
/* draw in normalized object matrix space */
copy_m4_m4(nobmat, ob->obmat);
normalize_m4(nobmat);
@@ -1465,7 +1520,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob)
* if not, ED_view3d_init_mats_rv3d() can be used for selection tools
* but would not give correct results with dupli's for eg. which dont
* use the object matrix in the useual way */
-static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
struct { void (*func)(void *userData, BMVert *eve, int x, int y, int index); void *userData; ViewContext vc; int clipVerts; float pmat[4][4], vmat[4][4]; } *data = userData;
BMVert *eve = EDBM_get_vert_for_index(data->vc.em, index);
@@ -1561,7 +1616,7 @@ void mesh_foreachScreenEdge(ViewContext *vc, void (*func)(void *userData, BMEdge
dm->release(dm);
}
-static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
+static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
{
struct { void (*func)(void *userData, BMFace *efa, int x, int y, int index); void *userData; ViewContext vc; float pmat[4][4], vmat[4][4]; } *data = userData;
float cent2[3];
@@ -1679,7 +1734,7 @@ static void draw_dm_face_normals(BMEditMesh *em, Scene *scene, DerivedMesh *dm)
glEnd();
}
-static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *no)
+static void draw_dm_face_centers__mapFunc(void *userData, int index, float *cent, float *UNUSED(no))
{
BMFace *efa = EDBM_get_face_for_index(((void **)userData)[0], index);
BMEditMesh *em = ((void **)userData)[0];
@@ -1785,7 +1840,7 @@ static void draw_dm_vert_pins(BMEditMesh *em, DerivedMesh *dm, Mesh *me)
}
/* Draw verts with color set based on selection */
-static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
struct { BMEditMesh *em; int sel; BMVert *eve_act; } *data = userData;
BMVert *eve = EDBM_get_vert_for_index(data->em, index);
@@ -1955,6 +2010,8 @@ static int draw_dm_edges_pins__setDrawOptions(void *userData, int index)
else {
return pin; }
}
+
+ return 0;
}
static void draw_dm_edges_pins(BMEditMesh *em, DerivedMesh *dm, Mesh *me)
@@ -1982,7 +2039,7 @@ static void draw_dm_edges_sharp(BMEditMesh *em, DerivedMesh *dm)
/* Draw faces with color set based on selection
* return 2 for the active face so it renders with stipple enabled */
-static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
{
struct { unsigned char *cols[3]; BMEditMesh *em; BMFace *efa_act; Mesh *me;} *data = userData;
BMFace *efa = EDBM_get_face_for_index(data->em, index);
@@ -2035,7 +2092,7 @@ static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba
data.efa_act = efa_act;
data.me = me;
- dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0);
+ dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0, GPU_enable_material);
}
static int draw_dm_creases__setDrawOptions(void *userData, int index)
@@ -2077,7 +2134,7 @@ static int draw_dm_bweights__setDrawOptions(void *userData, int index)
return 0;
}
}
-static void draw_dm_bweights__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void draw_dm_bweights__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
BMEditMesh *em = userData;
BMVert *eve = EDBM_get_vert_for_index(userData, index);
@@ -2126,7 +2183,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
if(v3d->zbuf) glDepthMask(0); // disable write in zbuffer, zbuf select
for (sel=0; sel<2; sel++) {
- char col[4], fcol[4];
+ unsigned char col[4], fcol[4];
int pass;
UI_GetThemeColor3ubv(sel?TH_VERTEX_SELECT:TH_VERTEX, col);
@@ -2154,13 +2211,13 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
if(ts->selectmode & SCE_SELECT_VERTEX) {
glPointSize(size);
- glColor4ubv((GLubyte *)col);
+ glColor4ubv(col);
draw_dm_verts(em, cageDM, sel, eve_act);
}
if(check_ob_drawface_dot(scene, v3d, obedit->dt)) {
glPointSize(fsize);
- glColor4ubv((GLubyte *)fcol);
+ glColor4ubv(fcol);
draw_dm_face_centers(em, cageDM, sel);
}
@@ -2184,9 +2241,9 @@ static void draw_em_fancy_edges(BMEditMesh *em, Scene *scene, View3D *v3d,
unsigned char wireCol[4], selCol[4], actCol[4];
/* since this function does transparant... */
- UI_GetThemeColor4ubv(TH_EDGE_SELECT, (char *)selCol);
- UI_GetThemeColor4ubv(TH_WIRE, (char *)wireCol);
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)actCol);
+ UI_GetThemeColor4ubv(TH_EDGE_SELECT, selCol);
+ UI_GetThemeColor4ubv(TH_WIRE, wireCol);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, actCol);
/* when sel only is used, dont render wire, only selected, this is used for
* textured draw mode when the 'edges' option is disabled */
@@ -2245,42 +2302,30 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
float v1[3], v2[3], v3[3], v4[3], vmid[3];
float fvec[3];
char val[32]; /* Stores the measurement display text here */
- char conv_float[5]; /* Use a float conversion matching the grid size */
- float area, col[3]; /* area of the face, color of the text to draw */
+ const char *conv_float; /* Use a float conversion matching the grid size */
+ unsigned char col[3]; /* color of the text to draw */
+ float area; /* area of the face */
float grid= unit->system ? unit->scale_length : v3d->grid;
const int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
const int do_global= v3d->flag & V3D_GLOBAL_STATS;
const int do_moving= G.moving;
- if(v3d->flag2 & V3D_RENDER_OVERRIDE)
- return;
-
/* make the precision of the pronted value proportionate to the gridsize */
- if (grid < 0.01f)
- strcpy(conv_float, "%.6f");
- else if (grid < 0.1f)
- strcpy(conv_float, "%.5f");
- else if (grid < 1.0f)
- strcpy(conv_float, "%.4f");
- else if (grid < 10.0f)
- strcpy(conv_float, "%.3f");
- else
- strcpy(conv_float, "%.2f");
-
-
+ if (grid < 0.01f) conv_float= "%.6g";
+ else if (grid < 0.1f) conv_float= "%.5g";
+ else if (grid < 1.0f) conv_float= "%.4g";
+ else if (grid < 10.0f) conv_float= "%.3g";
+ else conv_float= "%.2g";
+
if(v3d->zbuf && (v3d->flag & V3D_ZBUF_SELECT)==0)
glDisable(GL_DEPTH_TEST);
if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0f);
- if(me->drawflag & ME_DRAW_EDGELEN) {
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more red */
- if(col[0]> 0.5f) {col[1]*=0.7f; col[2]*= 0.7f;}
- else col[0]= col[0]*0.7f + 0.3f;
- glColor3fv(col);
-
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
+
for(eed= em->edges.first; eed; eed= eed->next) {
/* draw non fgon edges, or selected edges, or edges next to selected verts while draging */
if((eed->h != EM_FGON) && ((eed->f & SELECT) || (do_moving && ((eed->v1->f & SELECT) || (eed->v2->f & SELECT)) ))) {
@@ -2298,19 +2343,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
else
sprintf(val, conv_float, len_v3v3(v1, v2));
- view3d_cached_text_draw_add(vmid[0], vmid[1], vmid[2], val, 0, 0);
+ view3d_cached_text_draw_add(vmid, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
- if(me->drawflag & ME_DRAW_FACEAREA) {
+ if(me->drawflag & ME_DRAWEXTRA_FACEAREA) {
// XXX extern int faceselectedOR(EditFace *efa, int flag); // editmesh.h shouldn't be in this file... ok for now?
-
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more green */
- if(col[1]> 0.5f) {col[0]*=0.7f; col[2]*= 0.7f;}
- else col[1]= col[1]*0.7f + 0.3f;
- glColor3fv(col);
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col);
for(efa= em->faces.first; efa; efa= efa->next) {
if((efa->f & SELECT)) { // XXX || (do_moving && faceselectedOR(efa, SELECT)) ) {
@@ -2337,20 +2377,14 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
else
sprintf(val, conv_float, area);
- view3d_cached_text_draw_add(efa->cent[0], efa->cent[1], efa->cent[2], val, 0, 0);
+ view3d_cached_text_draw_add(efa->cent, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
- if(me->drawflag & ME_DRAW_EDGEANG) {
+ if(me->drawflag & ME_DRAWEXTRA_FACEANG) {
EditEdge *e1, *e2, *e3, *e4;
-
- UI_GetThemeColor3fv(TH_TEXT, col);
- /* make color a bit more blue */
- if(col[2]> 0.5f) {col[0]*=0.7f; col[1]*= 0.7f;}
- else col[2]= col[2]*0.7f + 0.3f;
- glColor3fv(col);
-
+ UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
for(efa= em->faces.first; efa; efa= efa->next) {
copy_v3_v3(v1, efa->v1->co);
copy_v3_v3(v2, efa->v2->co);
@@ -2377,31 +2411,31 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
if( (e4->f & e1->f & SELECT) || (do_moving && (efa->v1->f & SELECT)) ) {
/* Vec 1 */
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
interp_v3_v3v3(fvec, efa->cent, efa->v1->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e1->f & e2->f & SELECT) || (do_moving && (efa->v2->f & SELECT)) ) {
/* Vec 2 */
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
interp_v3_v3v3(fvec, efa->cent, efa->v2->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e2->f & e3->f & SELECT) || (do_moving && (efa->v3->f & SELECT)) ) {
/* Vec 3 */
if(efa->v4)
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
else
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v3->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
/* Vec 4 */
if(efa->v4) {
if( (e3->f & e4->f & SELECT) || (do_moving && (efa->v4->f & SELECT)) ) {
- sprintf(val,"%.3f", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
+ sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v4->co, 0.8f);
- view3d_cached_text_draw_add(fvec[0], fvec[1], fvec[2], val, 0, 0);
+ view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
}
@@ -2414,7 +2448,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
#endif
}
-static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth_r)
+static int draw_em_fancy__setFaceOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
{
BMFace *efa = EDBM_get_face_for_index(userData, index);
@@ -2477,7 +2511,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
glEnable(GL_LIGHTING);
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
- finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0);
+ finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, me->edit_btmesh, 0, GPU_enable_material);
glFrontFace(GL_CCW);
glDisable(GL_LIGHTING);
@@ -2497,12 +2531,12 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
}
}
- if((me->drawflag & (ME_DRAWFACES)) || paint_facesel_test(ob)) { /* transp faces */
+ if(me->drawflag & ME_DRAWFACES) { /* transp faces */
unsigned char col1[4], col2[4], col3[4];
- UI_GetThemeColor4ubv(TH_FACE, (char *)col1);
- UI_GetThemeColor4ubv(TH_FACE_SELECT, (char *)col2);
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
+ UI_GetThemeColor4ubv(TH_FACE, col1);
+ UI_GetThemeColor4ubv(TH_FACE_SELECT, col2);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3);
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
@@ -2521,7 +2555,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
* */
unsigned char col1[4], col2[4], col3[4];
col1[3] = col2[3] = 0; /* dont draw */
- UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
+ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3);
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
@@ -2598,7 +2632,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_dm_vert_pins(em, cageDM, me);
}
- if(me->drawflag & (ME_DRAW_EDGELEN|ME_DRAW_FACEAREA|ME_DRAW_EDGEANG))
+ if(me->drawflag & (ME_DRAWEXTRA_EDGELEN|ME_DRAWEXTRA_FACEAREA|ME_DRAWEXTRA_FACEANG) && !((v3d->flag2 & V3D_RENDER_OVERRIDE)))
draw_em_measure_stats(v3d, rv3d, ob, em, &scene->unit);
}
@@ -2637,7 +2671,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm)
}
}
-static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int wpaint__setSolidDrawOptions(void *userData, int UNUSED(index), int *drawSmooth_r)
{
*drawSmooth_r = 1;
return 1;
@@ -2648,11 +2682,12 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
Object *ob= base->object;
Mesh *me = ob->data;
Material *ma= give_current_material(ob, 1);
- int hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+ const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO));
+ const short is_paint_sel= (ob==OBACT && paint_facesel_test(ob));
int draw_wire = 0;
- int totvert, totedge, totface;
+ int /* totvert,*/ totedge, totface;
DispList *dl;
- DerivedMesh *dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ DerivedMesh *dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
if(!dm)
return;
@@ -2661,7 +2696,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
draw_wire = 2; /* draw wire after solid using zoffset and depth buffer adjusment */
}
- totvert = dm->getNumVerts(dm);
+ /* totvert = dm->getNumVerts(dm); */ /*UNUSED*/
totedge = dm->getNumEdges(dm);
totface = dm->getNumTessFaces(dm);
@@ -2670,7 +2705,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
- if (ob==OBACT && paint_facesel_test(ob)) draw_wire = 0;
+ if (is_paint_sel) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
@@ -2684,11 +2719,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
else if(dt==OB_WIRE || totface==0) {
draw_wire = 1; /* draw wire only, no depth buffer stuff */
}
- else if( (ob==OBACT && (ob->mode & OB_MODE_TEXTURE_PAINT || paint_facesel_test(ob))) ||
+ else if( (is_paint_sel || (ob==OBACT && ob->mode & OB_MODE_TEXTURE_PAINT)) ||
CHECK_OB_DRAWTEXTURE(v3d, dt))
{
- int faceselect= (ob==OBACT && paint_facesel_test(ob));
- if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || paint_facesel_test(ob)) && !draw_wire) {
+ if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !(G.f&G_PICKSEL || is_paint_sel) && !draw_wire) {
draw_mesh_object_outline(v3d, ob, dm);
}
@@ -2703,10 +2737,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glFrontFace(GL_CCW);
}
else {
- draw_mesh_textured(scene, v3d, rv3d, ob, dm, faceselect);
+ draw_mesh_textured(scene, v3d, rv3d, ob, dm, is_paint_sel);
}
- if(!faceselect) {
+ if(!is_paint_sel) {
if(base->flag & SELECT)
UI_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
else
@@ -2721,25 +2755,26 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
/* weight paint in solid mode, special case. focus on making the weights clear
* rather then the shading, this is also forced in wire view */
GPU_enable_material(0, NULL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1);
-
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material);
+
bglPolygonOffset(rv3d->dist, 1.0);
glDepthMask(0); // disable write in zbuffer, selected edge wires show better
glEnable(GL_BLEND);
- glColor4ub(196, 196, 196, 196);
+ glColor4ub(255, 255, 255, 96);
glEnable(GL_LINE_STIPPLE);
- glLineStipple(1, 0x8888);
+ glLineStipple(1, 0xAAAA);
- dm->drawEdges(dm, 1, 0);
+ dm->drawEdges(dm, 1, 1);
bglPolygonOffset(rv3d->dist, 0.0);
glDepthMask(1);
glDisable(GL_LINE_STIPPLE);
GPU_disable_material();
-
-
+
+ /* since we already draw wire as wp guide, dont draw over the top */
+ draw_wire= 0;
}
else {
Paint *p;
@@ -2803,7 +2838,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me->mface, 1, GPU_enable_material);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
@@ -2811,10 +2846,10 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
}
else if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_TEXTURE_PAINT)) {
if(me->mcol)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1, GPU_enable_material);
else {
glColor3f(1.0f, 1.0f, 1.0f);
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0, GPU_enable_material);
}
}
else do_draw= 1;
@@ -2827,7 +2862,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
dm->release(dm);
shadeDispList(scene, base);
dl = find_displist(&ob->disp, DL_VERTCOL);
- dm= mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
}
if ((v3d->flag&V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && (base->flag&SELECT) && !draw_wire) {
@@ -2936,7 +2971,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
finalDM = cageDM = editbmesh_get_derived_base(ob, em);
else
cageDM = editbmesh_get_derived_cage_and_final(scene, ob, em, &finalDM,
- v3d->customdata_mask);
+ scene->customdata_mask);
if(dt>OB_WIRE) {
// no transp in editmode, the fancy draw over goes bad then
@@ -3277,12 +3312,15 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B
int glsl = draw_glsl_material(scene, ob, v3d, dt);
GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL);
- if (!glsl)
+ if(!glsl) {
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+ glEnable(GL_LIGHTING);
+ dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material);
+ glDisable(GL_LIGHTING);
+ }
+ else
+ dm->drawFacesGLSL(dm, GPU_enable_material);
- glEnable(GL_LIGHTING);
- dm->drawFacesSolid(dm, NULL, 0, GPU_enable_material);
- glDisable(GL_LIGHTING);
GPU_end_object_materials();
} else {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_SOLID)==0)
@@ -3312,7 +3350,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
case OB_CURVE:
cu= ob->data;
- lb= &cu->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -3359,7 +3397,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
break;
case OB_SURF:
- lb= &((Curve *)ob->data)->disp;
+ lb= &ob->disp;
if(solid) {
dl= lb->first;
@@ -3452,16 +3490,22 @@ static void draw_particle_arrays(int draw_as, int totpoint, int ob_dt, int selec
static void draw_particle(ParticleKey *state, int draw_as, short draw, float pixsize, float imat[4][4], float *draw_line, ParticleBillboardData *bb, ParticleDrawData *pdd)
{
float vec[3], vec2[3];
- float *vd = pdd->vd;
- float *cd = pdd->cd;
+ float *vd = NULL;
+ float *cd = NULL;
float ma_r=0.0f;
float ma_g=0.0f;
float ma_b=0.0f;
- if(pdd->ma_r) {
- ma_r = *pdd->ma_r;
- ma_g = *pdd->ma_g;
- ma_b = *pdd->ma_b;
+ /* null only for PART_DRAW_CIRC */
+ if(pdd) {
+ vd = pdd->vd;
+ cd = pdd->cd;
+
+ if(pdd->ma_r) {
+ ma_r = *pdd->ma_r;
+ ma_g = *pdd->ma_g;
+ ma_b = *pdd->ma_b;
+ }
}
switch(draw_as){
@@ -3485,13 +3529,15 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
vec[1]=vec[2]=0.0;
mul_qt_v3(state->rot,vec);
if(draw_as==PART_DRAW_AXIS) {
- cd[1]=cd[2]=cd[4]=cd[5]=0.0;
- cd[0]=cd[3]=1.0;
- cd[6]=cd[8]=cd[9]=cd[11]=0.0;
- cd[7]=cd[10]=1.0;
- cd[13]=cd[12]=cd[15]=cd[16]=0.0;
- cd[14]=cd[17]=1.0;
- pdd->cd+=18;
+ if(cd) {
+ cd[1]=cd[2]=cd[4]=cd[5]=0.0;
+ cd[0]=cd[3]=1.0;
+ cd[6]=cd[8]=cd[9]=cd[11]=0.0;
+ cd[7]=cd[10]=1.0;
+ cd[13]=cd[12]=cd[15]=cd[16]=0.0;
+ cd[14]=cd[17]=1.0;
+ pdd->cd+=18;
+ }
copy_v3_v3(vec2,state->co);
}
@@ -3553,8 +3599,6 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
}
case PART_DRAW_CIRC:
{
- if(pdd->ma_r)
- glColor3f(ma_r,ma_g,ma_b);
drawcircball(GL_LINE_LOOP, state->co, pixsize, imat);
break;
}
@@ -3607,24 +3651,24 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix
static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ParticleSystem *psys, int ob_dt)
{
Object *ob=base->object;
- ParticleSystemModifierData *psmd;
ParticleEditSettings *pset = PE_settings(scene);
ParticleSettings *part;
ParticleData *pars, *pa;
ParticleKey state, *states=0;
ParticleBillboardData bb;
- ParticleSimulationData sim = {scene, ob, psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleDrawData *pdd = psys->pdd;
Material *ma;
float vel[3], imat[4][4];
float timestep, pixsize=1.0, pa_size, r_tilt, r_length;
float pa_time, pa_birthtime, pa_dietime, pa_health;
- float cfra= bsystem_time(scene, ob,(float)CFRA,0.0);
+ float cfra;
float ma_r=0.0f, ma_g=0.0f, ma_b=0.0f;
int a, totpart, totpoint=0, totve=0, drawn, draw_as, totchild=0;
int select=ob->flag&SELECT, create_cdata=0, need_v=0;
GLint polygonmode[2];
char val[32];
+ unsigned char tcol[4]= {0, 0, 0, 255};
/* 1. */
if(psys==0)
@@ -3651,7 +3695,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
return;
/* 2. */
- sim.psmd = psmd = psys_get_modifier(ob,psys);
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd = psys_get_modifier(ob,psys);
if(part->phystype==PART_PHYS_KEYED){
if(psys->flag&PSYS_KEYED){
@@ -3679,20 +3726,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(v3d->zbuf) glDepthMask(1);
if((ma) && (part->draw&PART_DRAW_MAT_COL)) {
- glColor3f(ma->r,ma->g,ma->b);
+ rgb_float_to_byte(&(ma->r), tcol);
ma_r = ma->r;
ma_g = ma->g;
ma_b = ma->b;
}
- else
- cpack(0);
- if(pdd) {
- pdd->ma_r = &ma_r;
- pdd->ma_g = &ma_g;
- pdd->ma_b = &ma_b;
- }
+ glColor3ubv(tcol);
timestep= psys_get_timestep(&sim);
@@ -3729,8 +3770,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
case PART_DRAW_CROSS:
case PART_DRAW_AXIS:
/* lets calculate the scale: */
- pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
- pixsize*= rv3d->pixsize;
+ pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
+
if(part->draw_size==0.0)
pixsize*=2.0;
else
@@ -3846,12 +3887,24 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
pdd->nd= pdd->ndata;
pdd->tot_vec_size= tot_vec_size;
}
+ else if(psys->pdd) {
+ psys_free_pdd(psys);
+ MEM_freeN(psys->pdd);
+ pdd = psys->pdd = NULL;
+ }
+
+ if(pdd) {
+ pdd->ma_r = &ma_r;
+ pdd->ma_g = &ma_g;
+ pdd->ma_b = &ma_b;
+ }
psys->lattice= psys_get_lattice(&sim);
- if(pdd && draw_as!=PART_DRAW_PATH){
+ /* circles don't use drawdata, so have to add a special case here */
+ if((pdd || draw_as==PART_DRAW_CIRC) && draw_as!=PART_DRAW_PATH){
/* 5. */
- if((pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
+ if(pdd && (pdd->flag & PARTICLE_DRAW_DATA_UPDATED)
&& (pdd->vedata || part->draw & (PART_DRAW_SIZE|PART_DRAW_NUM|PART_DRAW_HEALTH))==0) {
totpoint = pdd->totpoint; /* draw data is up to date */
}
@@ -3997,7 +4050,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(drawn) {
/* additional things to draw for each particle */
/* (velocity, size and number) */
- if((part->draw & PART_DRAW_VEL) && pdd->vedata){
+ if((part->draw & PART_DRAW_VEL) && pdd && pdd->vedata){
copy_v3_v3(pdd->ved,state.co);
pdd->ved += 3;
mul_v3_v3fl(vel, state.vel, timestep);
@@ -4019,16 +4072,24 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
char *val_pos= val;
val[0]= '\0';
- if(part->draw&PART_DRAW_NUM)
- val_pos += sprintf(val, "%i", a);
-
- if((part->draw & PART_DRAW_HEALTH) && a < totpart && part->phystype==PART_PHYS_BOIDS)
- sprintf(val_pos, (val_pos==val) ? "%.2f" : ":%.2f", pa_health);
+ if(part->draw&PART_DRAW_NUM) {
+ if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+ sprintf(val_pos, "%d:%.2f", a, pa_health);
+ }
+ else {
+ sprintf(val_pos, "%d", a);
+ }
+ }
+ else {
+ if(a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype==PART_PHYS_BOIDS)) {
+ sprintf(val_pos, "%.2f", pa_health);
+ }
+ }
/* in path drawing state.co is the end point */
/* use worldspace beause object matrix is already applied */
mul_v3_m4v3(vec_txt, ob->imat, state.co);
- view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+ view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, tcol);
}
}
}
@@ -4117,12 +4178,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
for(a=0, pa=psys->particles; a<totpart; a++, pa++){
float vec_txt[3];
- val[0]= '\0';
-
sprintf(val, "%i", a);
/* use worldspace beause object matrix is already applied */
mul_v3_m4v3(vec_txt, ob->imat, cache[a]->co);
- view3d_cached_text_draw_add(vec_txt[0], vec_txt[1], vec_txt[2], val, 10, V3D_CACHE_TEXT_WORLDSPACE);
+ view3d_cached_text_draw_add(vec_txt, val, 10, V3D_CACHE_TEXT_WORLDSPACE|V3D_CACHE_TEXT_ASCII, tcol);
}
}
}
@@ -4214,8 +4273,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
psys->lattice= NULL;
}
- if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) )
+ if(pdd) {
+ /* drop references to stack memory */
+ pdd->ma_r= pdd->ma_g= pdd->ma_b= NULL;
+ }
+
+ if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
glLoadMatrixf(rv3d->viewmat);
+ }
}
static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit)
@@ -4228,7 +4293,7 @@ static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit
psys_cache_edit_paths(scene, ob, edit, CFRA);
}
-static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, PTCacheEdit *edit, int dt)
+static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
{
ParticleCacheKey **cache, *path, *pkey;
PTCacheEditPoint *point;
@@ -4263,8 +4328,8 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, RegionView3D *rv3d, Obj
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
- glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH);
if(pset->brushtype == PE_BRUSH_WEIGHT) {
@@ -4933,9 +4998,17 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
while (nr-->0) { /* accounts for empty bevel lists */
float fac= bevp->radius * ts->normalsize;
- float vec_a[3] = { fac,0, 0}; // Offset perpendicular to the curve
- float vec_b[3] = {-fac,0, 0}; // Delta along the curve
+ float vec_a[3]; // Offset perpendicular to the curve
+ float vec_b[3]; // Delta along the curve
+
+ vec_a[0]= fac;
+ vec_a[1]= 0.0f;
+ vec_a[2]= 0.0f;
+ vec_b[0]= -fac;
+ vec_b[1]= 0.0f;
+ vec_b[2]= 0.0f;
+
mul_qt_v3(bevp->quat, vec_a);
mul_qt_v3(bevp->quat, vec_b);
add_v3_v3(vec_a, bevp->vec);
@@ -4974,7 +5047,7 @@ static void draw_empty_sphere (float size)
GLUquadricObj *qobj;
displist= glGenLists(1);
- glNewList(displist, GL_COMPILE_AND_EXECUTE);
+ glNewList(displist, GL_COMPILE);
glPushMatrix();
@@ -4995,8 +5068,8 @@ static void draw_empty_sphere (float size)
}
glScalef(size, size, size);
- glCallList(displist);
- glScalef(1/size, 1/size, 1/size);
+ glCallList(displist);
+ glScalef(1.0f/size, 1.0f/size, 1.0f/size);
}
/* draw a cone for use as an empty drawtype */
@@ -5022,9 +5095,9 @@ static void draw_empty_cone (float size)
}
/* draw points on curve speed handles */
+#if 0 // XXX old animation system stuff
static void curve_draw_speed(Scene *scene, Object *ob)
{
-#if 0 // XXX old animation system stuff
Curve *cu= ob->data;
IpoCurve *icu;
BezTriple *bezt;
@@ -5050,8 +5123,8 @@ static void curve_draw_speed(Scene *scene, Object *ob)
glPointSize(1.0);
bglEnd();
-#endif // XXX old animation system stuff
}
+#endif // XXX old animation system stuff
static void draw_textcurs(float textcurs[][2])
@@ -5436,7 +5509,8 @@ static void draw_box(float vec[8][3])
}
/* uses boundbox, function used by Ketsji */
-void get_local_bounds(Object *ob, float *center, float *size)
+#if 0
+static void get_local_bounds(Object *ob, float *center, float *size)
{
BoundBox *bb= object_get_boundbox(ob);
@@ -5454,8 +5528,7 @@ void get_local_bounds(Object *ob, float *center, float *size)
center[2]= (bb->vec[0][2] + bb->vec[1][2])/2.0;
}
}
-
-
+#endif
static void draw_bb_quadric(BoundBox *bb, short type)
{
@@ -5498,7 +5571,7 @@ static void draw_bb_quadric(BoundBox *bb, short type)
static void draw_bounding_volume(Scene *scene, Object *ob)
{
- BoundBox *bb=0;
+ BoundBox *bb= NULL;
if(ob->type==OB_MESH) {
bb= mesh_get_bb(ob);
@@ -5507,10 +5580,12 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
bb= ob->bb ? ob->bb : ( (Curve *)ob->data )->bb;
}
else if(ob->type==OB_MBALL) {
- bb= ob->bb;
- if(bb==0) {
- makeDispListMBall(scene, ob);
+ if(is_basis_mball(ob)) {
bb= ob->bb;
+ if(bb==NULL) {
+ makeDispListMBall(scene, ob);
+ bb= ob->bb;
+ }
}
}
else {
@@ -5518,7 +5593,7 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
return;
}
- if(bb==0) return;
+ if(bb==NULL) return;
if(ob->boundtype==OB_BOUND_BOX) draw_box(bb->vec);
else draw_bb_quadric(bb, ob->boundtype);
@@ -5561,7 +5636,7 @@ static void drawtexspace(Object *ob)
}
/* draws wire outline */
-static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
+static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
{
RegionView3D *rv3d= ar->regiondata;
Object *ob= base->object;
@@ -5577,7 +5652,7 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
hasfaces= dm->getNumFaces(dm);
} else {
- hasfaces= displist_has_faces(&cu->disp);
+ hasfaces= displist_has_faces(&ob->disp);
}
if (hasfaces && boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
@@ -5585,13 +5660,15 @@ static void drawSolidSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base)
if (dm) {
draw_mesh_object_outline(v3d, ob, dm);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
draw_index_wire= 1;
}
} else if (ob->type==OB_MBALL) {
- if((base->flag & OB_FROMDUPLI)==0)
- drawDispListwire(&ob->disp);
+ if(is_basis_mball(ob)) {
+ if((base->flag & OB_FROMDUPLI)==0)
+ drawDispListwire(&ob->disp);
+ }
}
else if(ob->type==OB_ARMATURE) {
if(!(ob->mode & OB_MODE_POSE))
@@ -5638,14 +5715,16 @@ static void drawWireExtra(Scene *scene, RegionView3D *rv3d, Object *ob)
if (ob->derivedFinal) {
drawCurveDMWired(ob);
} else {
- drawDispListwire(&cu->disp);
+ drawDispListwire(&ob->disp);
}
if (ob->type==OB_CURVE)
draw_index_wire= 1;
}
} else if (ob->type==OB_MBALL) {
- drawDispListwire(&ob->disp);
+ if(is_basis_mball(ob)) {
+ drawDispListwire(&ob->disp);
+ }
}
glDepthMask(1);
@@ -5682,34 +5761,40 @@ static void draw_hooks(Object *ob)
}
}
-//<rcruiz>
-void drawRBpivot(bRigidBodyJointConstraint *data)
+static void drawRBpivot(bRigidBodyJointConstraint *data)
{
int axis;
- float v1[3]= {data->pivX, data->pivY, data->pivZ};
- float eu[3]= {data->axX, data->axY, data->axZ};
float mat[4][4];
- eul_to_mat4(mat,eu);
+ /* color */
+ float curcol[4];
+ unsigned char tcol[4];
+ glGetFloatv(GL_CURRENT_COLOR, curcol);
+ rgb_float_to_byte(curcol, tcol);
+ tcol[3]= 255;
+
+ eul_to_mat4(mat,&data->axX);
glLineWidth (4.0f);
setlinestyle(2);
for (axis=0; axis<3; axis++) {
float dir[3] = {0,0,0};
- float v[3]= {data->pivX, data->pivY, data->pivZ};
+ float v[3];
+
+ copy_v3_v3(v, &data->pivX);
dir[axis] = 1.f;
glBegin(GL_LINES);
mul_m4_v3(mat,dir);
add_v3_v3(v, dir);
- glVertex3fv(v1);
+ glVertex3fv(&data->pivX);
glVertex3fv(v);
glEnd();
if (axis==0)
- view3d_cached_text_draw_add(v[0], v[1], v[2], "px", 0, 0);
+ view3d_cached_text_draw_add(v, "px", 0, V3D_CACHE_TEXT_ASCII, tcol);
else if (axis==1)
- view3d_cached_text_draw_add(v[0], v[1], v[2], "py", 0, 0);
+ view3d_cached_text_draw_add(v, "py", 0, V3D_CACHE_TEXT_ASCII, tcol);
else
- view3d_cached_text_draw_add(v[0], v[1], v[2], "pz", 0, 0);
+ view3d_cached_text_draw_add(v, "pz", 0, V3D_CACHE_TEXT_ASCII, tcol);
}
glLineWidth (1.0f);
setlinestyle(0);
@@ -5847,13 +5932,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
bAnimVizSettings *avs= &ob->avs;
/* setup drawing environment for paths */
- draw_motion_paths_init(scene, v3d, ar);
+ draw_motion_paths_init(v3d, ar);
/* draw motion path for object */
- draw_motion_path_instance(scene, v3d, ar, ob, NULL, avs, ob->mpath);
+ draw_motion_path_instance(scene, ob, NULL, avs, ob->mpath);
/* cleanup after drawing */
- draw_motion_paths_cleanup(scene, v3d, ar);
+ draw_motion_paths_cleanup(v3d);
}
/* multiply view with object matrix.
@@ -5950,17 +6035,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* bad exception, solve this! otherwise outline shows too late */
if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- cu= ob->data;
/* still needed for curves hidden in other layers. depgraph doesnt handle that yet */
- if (cu->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
+ if (ob->disp.first==NULL) makeDispListCurveTypes(scene, ob, 0);
}
- /* draw outline for selected solid objects, mesh does itself */
+ /* draw outline for selected objects, mesh does itself */
if((v3d->flag & V3D_SELECT_OUTLINE) && ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) && ob->type!=OB_MESH) {
- if(dt>OB_WIRE && dt<OB_TEXTURE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
+ if(dt>OB_WIRE && (ob->mode & OB_MODE_EDIT)==0 && (flag & DRAW_SCENESET)==0) {
if (!(ob->dtx&OB_DRAWWIRE) && (ob->flag&SELECT) && !(flag&DRAW_PICKING)) {
- drawSolidSelect(scene, v3d, ar, base);
+ drawObjectSelect(scene, v3d, ar, base);
}
}
}
@@ -6077,9 +6161,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if(boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
-
- if(cu->path)
- curve_draw_speed(scene, ob);
+
+//XXX old animsys if(cu->path)
+// curve_draw_speed(scene, ob);
}
break;
case OB_MBALL:
@@ -6098,7 +6182,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
case OB_EMPTY:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
- drawaxes(ob->empty_drawsize, flag, ob->empty_drawtype);
+ drawaxes(ob->empty_drawsize, ob->empty_drawtype);
break;
case OB_LAMP:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
@@ -6124,7 +6208,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
break;
default:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- drawaxes(1.0, flag, OB_ARROWS);
+ drawaxes(1.0, OB_ARROWS);
}
}
@@ -6177,7 +6261,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
draw_new_particle_system(scene, v3d, rv3d, base, psys, dt);
}
-
+ invert_m4_m4(ob->imat, ob->obmat);
view3d_cached_text_draw_end(v3d, ar, 0, NULL);
glMultMatrixf(ob->obmat);
@@ -6196,7 +6280,8 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
PTCacheEdit *edit = PE_create_current(scene, ob);
if(edit) {
glLoadMatrixf(rv3d->viewmat);
- draw_ptcache_edit(scene, v3d, rv3d, ob, edit, dt);
+ draw_update_ptcache_edit(scene, ob, edit);
+ draw_ptcache_edit(scene, v3d, edit);
glMultMatrixf(ob->obmat);
}
}
@@ -6245,12 +6330,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
// only draw domains
if(smd->domain && smd->domain->fluid)
{
- if(!smd->domain->wt || !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
+ if(CFRA < smd->domain->point_cache[0]->startframe)
+ ; /* don't show smoke before simulation starts, this could be made an option in the future */
+ else if(!smd->domain->wt || !(smd->domain->viewsettings & MOD_SMOKE_VIEW_SHOWBIG))
{
// #if 0
smd->domain->tex = NULL;
GPU_create_smoke(smd, 0);
- draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res, smd->domain->dx, smd->domain->tex_shadow);
GPU_free_smoke(smd);
// #endif
#if 0
@@ -6301,7 +6388,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
{
smd->domain->tex = NULL;
GPU_create_smoke(smd, 1);
- draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
+ draw_volume(ar, smd->domain->tex, smd->domain->p0, smd->domain->p1, smd->domain->res_wt, smd->domain->dx_wt, smd->domain->tex_shadow);
GPU_free_smoke(smd);
}
}
@@ -6324,7 +6411,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(dtx && (G.f & G_RENDER_OGL)==0) {
if(dtx & OB_AXIS) {
- drawaxes(1.0f, flag, OB_ARROWS);
+ drawaxes(1.0f, OB_ARROWS);
}
if(dtx & OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
@@ -6335,7 +6422,13 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* patch for several 3d cards (IBM mostly) that crash on glSelect with text drawing */
/* but, we also dont draw names for sets or duplicators */
if(flag == 0) {
- view3d_cached_text_draw_add(0.0f, 0.0f, 0.0f, ob->id.name+2, 10, 0);
+ float zero[3]= {0,0,0};
+ float curcol[4];
+ unsigned char tcol[4];
+ glGetFloatv(GL_CURRENT_COLOR, curcol);
+ rgb_float_to_byte(curcol, tcol);
+ tcol[3]= 255;
+ view3d_cached_text_draw_add(zero, ob->id.name+2, 10, 0, tcol);
}
}
/*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
@@ -6357,6 +6450,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* return warning, this is cached text draw */
+ invert_m4_m4(ob->imat, ob->obmat);
view3d_cached_text_draw_end(v3d, ar, 1, NULL);
glLoadMatrixf(rv3d->viewmat);
@@ -6415,15 +6509,16 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* Drawing the constraint lines */
- list = &ob->constraints;
- if (list) {
+ if (ob->constraints.first) {
bConstraint *curcon;
bConstraintOb *cob;
- char col[4], col2[4];
+ unsigned char col1[4], col2[4];
+
+ list = &ob->constraints;
- UI_GetThemeColor3ubv(TH_GRID, col);
- UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_GetThemeColor3ubv(TH_GRID, col1);
+ UI_make_axis_color(col1, col2, 'Z');
+ glColor3ubv(col2);
cob= constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
@@ -6464,7 +6559,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
/* ***************** BACKBUF SEL (BBS) ********* */
-static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
void **ptrs = userData;
int offset = (intptr_t) ptrs[0];
@@ -6505,7 +6600,7 @@ static void bbs_mesh_wire(BMEditMesh *em, DerivedMesh *dm, int offset)
dm->drawMappedEdges(dm, bbs_mesh_wire__setDrawOptions, ptrs);
}
-static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
{
if (!BM_TestHFlag(EDBM_get_face_for_index(((void**)userData)[0], index), BM_HIDDEN)) {
if (((void**)userData)[1]) {
@@ -6517,7 +6612,7 @@ static int bbs_mesh_solid__setSolidDrawOptions(void *userData, int index, int *d
}
}
-static void bbs_mesh_solid__drawCenter(void *userData, int index, float *cent, float *no)
+static void bbs_mesh_solid__drawCenter(void *userData, int index, float *cent, float *UNUSED(no))
{
BMFace *efa = EDBM_get_face_for_index(((void**)userData)[0], index);
@@ -6537,7 +6632,7 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
if (facecol) {
ptrs[1] = (void*)(intptr_t) 1;
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material);
if(check_ob_drawface_dot(scene, v3d, ob->dt)) {
glPointSize(UI_GetThemeValuef(TH_FACEDOT_SIZE));
@@ -6548,17 +6643,17 @@ static void bbs_mesh_solid_EM(BMEditMesh *em, Scene *scene, View3D *v3d,
}
} else {
- dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0);
+ dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, ptrs, 0, GPU_enable_material);
}
}
-static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
{
WM_set_framebuffer_index_color(index+1);
return 1;
}
-static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *drawSmooth_r)
+static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
{
Mesh *me = userData;
@@ -6570,16 +6665,15 @@ static int bbs_mesh_solid_hide__setDrawOpts(void *userData, int index, int *draw
}
}
-static void bbs_mesh_solid(Scene *scene, View3D *v3d, Object *ob)
+static void bbs_mesh_solid(Scene *scene, Object *ob)
{
- DerivedMesh *dm = mesh_get_derived_final(scene, ob, v3d->customdata_mask);
+ DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
Mesh *me = (Mesh*)ob->data;
- int face_sel_mode = (me->flag & ME_EDIT_PAINT_MASK) ? 1:0;
glColor3ub(0, 0, 0);
- if(face_sel_mode) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0);
- else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0);
+ if((me->editflag & ME_EDIT_PAINT_MASK)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, me, 0, GPU_enable_material);
+ else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, me, 0, GPU_enable_material);
dm->release(dm);
}
@@ -6629,7 +6723,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
EDBM_free_index_arrays(em);
}
- else bbs_mesh_solid(scene, v3d, ob);
+ else bbs_mesh_solid(scene, ob);
}
break;
case OB_CURVE:
@@ -6686,7 +6780,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
GPU_end_object_materials();
}
else if(edm)
- edm->drawMappedFaces(edm, NULL, NULL, 0);
+ edm->drawMappedFaces(edm, NULL, NULL, 0, GPU_enable_material);
glDisable(GL_LIGHTING);
}
@@ -6705,7 +6799,7 @@ void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object
draw_object_mesh_instance(scene, v3d, rv3d, ob, dt, outline);
break;
case OB_EMPTY:
- drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);
+ drawaxes(ob->empty_drawsize, ob->empty_drawtype);
break;
}
}
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index f8cd34cf849..a2eefa2aad1 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,10 +31,6 @@
#include "MEM_guardedalloc.h"
-
-
-
-
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
@@ -44,6 +40,7 @@
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_curve.h"
#include "BKE_constraint.h" // for the get_constraint_target function
@@ -65,7 +62,7 @@
#include "BKE_particle.h"
#include "BKE_property.h"
#include "BKE_smoke.h"
-#include "BKE_utildefines.h"
+
#include "smoke_API.h"
#include "BIF_gl.h"
@@ -100,7 +97,7 @@ static void tend ( void )
{
QueryPerformanceCounter ( &liCurrentTime );
}
-static double tval()
+static double tval( void )
{
return ((double)( (liCurrentTime.QuadPart - liStartTime.QuadPart)* (double)1000.0/(double)liFrequency.QuadPart ));
}
@@ -124,12 +121,12 @@ static double tval()
t2 = ( double ) _tend.tv_sec*1000 + ( double ) _tend.tv_usec/ ( 1000 );
return t2-t1;
}
-#endif
+ #endif
#endif
struct GPUTexture;
-int intersect_edges(float *points, float a, float b, float c, float d, float edges[12][2][3])
+static int intersect_edges(float *points, float a, float b, float c, float d, float edges[12][2][3])
{
int i;
float t;
@@ -175,7 +172,7 @@ static int larger_pow2(int n)
return n*2;
}
-void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
+void draw_volume(ARegion *ar, GPUTexture *tex, float *min, float *max, int res[3], float dx, GPUTexture *tex_shadow)
{
RegionView3D *rv3d= ar->regiondata;
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 8fbe764c633..dd3b5f42b89 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,10 +37,13 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+#include "BKE_object.h"
#include "BKE_context.h"
#include "BKE_screen.h"
+#include "ED_space_api.h"
#include "ED_screen.h"
#include "ED_object.h"
@@ -191,21 +194,24 @@ static SpaceLink *view3d_new(const bContext *C)
v3d->lay= v3d->layact= scene->lay;
v3d->camera= scene->camera;
}
- v3d->scenelock= 1;
+ v3d->scenelock= TRUE;
v3d->grid= 1.0f;
v3d->gridlines= 16;
v3d->gridsubdiv = 10;
- v3d->drawtype= OB_WIRE;
+ v3d->drawtype= OB_SOLID;
v3d->gridflag |= V3D_SHOW_X;
v3d->gridflag |= V3D_SHOW_Y;
v3d->gridflag |= V3D_SHOW_FLOOR;
v3d->gridflag &= ~V3D_SHOW_Z;
+ v3d->flag |= V3D_SELECT_OUTLINE;
+
v3d->lens= 35.0f;
v3d->near= 0.01f;
v3d->far= 500.0f;
+ v3d->twflag |= U.tw_flag & V3D_USE_MANIPULATOR;
v3d->twtype= V3D_MANIP_TRANSLATE;
v3d->around= V3D_CENTROID;
@@ -249,8 +255,8 @@ static SpaceLink *view3d_new(const bContext *C)
ar->regiondata= MEM_callocN(sizeof(RegionView3D), "region view3d");
rv3d= ar->regiondata;
rv3d->viewquat[0]= 1.0f;
- rv3d->persp= 1;
- rv3d->view= 7;
+ rv3d->persp= RV3D_PERSP;
+ rv3d->view= RV3D_VIEW_PERSPORTHO;
rv3d->dist= 10.0;
return (SpaceLink *)v3d;
@@ -274,7 +280,7 @@ static void view3d_free(SpaceLink *sl)
/* spacetype; init callback */
-static void view3d_init(struct wmWindowManager *wm, ScrArea *sa)
+static void view3d_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
{
}
@@ -316,6 +322,10 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
/* object ops. */
+ /* important to be before Pose keymap since they can both be enabled at once */
+ keymap= WM_keymap_find(wm->defaultconf, "Face Mask", 0, 0);
+ WM_event_add_keymap_handler(&ar->handlers, keymap);
+
/* pose is not modal, operator poll checks for this */
keymap= WM_keymap_find(wm->defaultconf, "Pose", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -331,9 +341,6 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
keymap= WM_keymap_find(wm->defaultconf, "Weight Paint", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
-
- keymap= WM_keymap_find(wm->defaultconf, "Face Mask", 0, 0);
- WM_event_add_keymap_handler(&ar->handlers, keymap);
keymap= WM_keymap_find(wm->defaultconf, "Sculpt", 0, 0);
WM_event_add_keymap_handler(&ar->handlers, keymap);
@@ -387,7 +394,7 @@ static void view3d_main_area_init(wmWindowManager *wm, ARegion *ar)
}
-static int view3d_ob_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_ob_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -397,7 +404,7 @@ static int view3d_ob_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_mat_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
if(drag->type==WM_DRAG_ID) {
ID *id= (ID *)drag->poin;
@@ -407,26 +414,27 @@ static int view3d_mat_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
return 0;
}
-static int view3d_ima_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
+static int view3d_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, wmEvent *UNUSED(event))
{
- if(drag->type==WM_DRAG_ID) {
- ID *id= (ID *)drag->poin;
- if( GS(id->name)==ID_IM )
- return 1;
- }
- else if(drag->type==WM_DRAG_PATH){
- if(ELEM(drag->icon, 0, ICON_FILE_IMAGE)) /* rule might not work? */
- return 1;
- }
- return 0;
+ if(drag->type==WM_DRAG_ID) {
+ ID *id= (ID *)drag->poin;
+ if( GS(id->name)==ID_IM )
+ return 1;
}
+ else if(drag->type==WM_DRAG_PATH){
+ if(ELEM(drag->icon, 0, ICON_FILE_IMAGE)) /* rule might not work? */
+ return 1;
+ }
+ return 0;
+}
static int view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
{
if( ED_view3d_give_base_under_cursor(C, event->mval) ) {
- return 0;
-}
+ return 0;
+ }
+
return view3d_ima_drop_poll(C, drag, event);
}
@@ -477,7 +485,7 @@ static void view3d_dropboxes(void)
WM_dropbox_add(lb, "OBJECT_OT_add_named_cursor", view3d_ob_drop_poll, view3d_ob_drop_copy);
WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy);
WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_ob_drop_poll, view3d_id_path_drop_copy);
- WM_dropbox_add(lb, "VIEW3D_OT_add_background_image", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
+ WM_dropbox_add(lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
}
@@ -529,39 +537,40 @@ static void *view3d_main_area_duplicate(void *poin)
return NULL;
}
-static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn)
+static void view3d_recalc_used_layers(ARegion *ar, wmNotifier *wmn, Scene *scene)
{
wmWindow *win= wmn->wm->winactive;
ScrArea *sa;
+ unsigned int lay_used= 0;
+ Base *base;
if (!win) return;
- sa= win->screen->areabase.first;
-
- while(sa) {
- if(sa->spacetype == SPACE_VIEW3D)
- if(BLI_findindex(&sa->regionbase, ar) >= 0) {
- View3D *v3d= sa->spacedata.first;
- Scene *scene= wmn->reference;
- Base *base;
+ base= scene->base.first;
+ while(base) {
+ lay_used |= base->lay & ((1<<20)-1); /* ignore localview */
- v3d->lay_used= 0;
- base= scene->base.first;
- while(base) {
- v3d->lay_used|= base->lay;
+ if (lay_used == (1<<20)-1)
+ break;
- base= base->next;
- }
+ base= base->next;
+ }
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ if(sa->spacetype == SPACE_VIEW3D) {
+ if(BLI_findindex(&sa->regionbase, ar) != -1) {
+ View3D *v3d= sa->spacedata.first;
+ v3d->lay_used= lay_used;
break;
}
-
- sa= sa->next;
+ }
}
}
static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
{
+ bScreen *sc;
+
/* context changes */
switch(wmn->category) {
case NC_ANIMATION:
@@ -584,18 +593,22 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_SCENE:
switch(wmn->data) {
case ND_LAYER_CONTENT:
- view3d_recalc_used_layers(ar, wmn);
+ view3d_recalc_used_layers(ar, wmn, wmn->reference);
ED_region_tag_redraw(ar);
break;
case ND_FRAME:
case ND_TRANSFORM:
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
case ND_LAYER:
case ND_RENDER_OPTIONS:
case ND_MODE:
ED_region_tag_redraw(ar);
break;
+ case ND_WORLD:
+ /* handled by space_view3d_listener() for v3d access */
+ break;
}
if (wmn->action == NA_EDITED)
ED_region_tag_redraw(ar);
@@ -614,6 +627,11 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
}
+ switch(wmn->action) {
+ case NA_ADDED:
+ ED_region_tag_redraw(ar);
+ break;
+ }
break;
case NC_GEOM:
switch(wmn->data) {
@@ -646,8 +664,15 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
case NC_WORLD:
switch(wmn->data) {
case ND_WORLD_DRAW:
- ED_region_tag_redraw(ar);
+ /* handled by space_view3d_listener() for v3d access */
break;
+ case ND_WORLD_STARS:
+ {
+ RegionView3D *rv3d= ar->regiondata;
+ if(rv3d->persp == RV3D_CAMOB) {
+ ED_region_tag_redraw(ar);
+ }
+ }
}
break;
case NC_LAMP:
@@ -680,16 +705,29 @@ static void view3d_main_area_listener(ARegion *ar, wmNotifier *wmn)
ED_region_tag_redraw(ar);
break;
case NC_SCREEN:
- if(wmn->data == ND_GPENCIL)
- ED_region_tag_redraw(ar);
- else if(wmn->data==ND_ANIMPLAY)
- ED_region_tag_redraw(ar);
+ switch(wmn->data) {
+ case ND_GPENCIL:
+ case ND_ANIMPLAY:
+ case ND_SKETCH:
+ ED_region_tag_redraw(ar);
+ break;
+ case ND_SCREENBROWSE:
+ case ND_SCREENDELETE:
+ case ND_SCREENSET:
+ /* screen was changed, need to update used layers due to NC_SCENE|ND_LAYER_CONTENT */
+ /* updates used layers only for View3D in active screen */
+ sc= wmn->reference;
+ view3d_recalc_used_layers(ar, wmn, sc->scene);
+ ED_region_tag_redraw(ar);
+ break;
+ }
+
break;
}
}
/* concept is to retrieve cursor type context-less */
-static void view3d_main_area_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
+static void view3d_main_area_cursor(wmWindow *win, ScrArea *UNUSED(sa), ARegion *UNUSED(ar))
{
Scene *scene= win->screen->scene;
@@ -725,6 +763,7 @@ static void view3d_header_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
case ND_MODE:
case ND_LAYER:
case ND_TOOLSETTINGS:
@@ -778,6 +817,7 @@ static void view3d_buttons_area_listener(ARegion *ar, wmNotifier *wmn)
case ND_FRAME:
case ND_OB_ACTIVE:
case ND_OB_SELECT:
+ case ND_OB_VISIBLE:
case ND_MODE:
case ND_LAYER:
case ND_LAYER_CONTENT:
@@ -871,20 +911,61 @@ static void view3d_props_area_listener(ARegion *ar, wmNotifier *wmn)
}
}
+/*area (not region) level listener*/
+static void space_view3d_listener(struct ScrArea *sa, struct wmNotifier *wmn)
+{
+ View3D *v3d = sa->spacedata.first;
+
+ /* context changes */
+ switch(wmn->category) {
+ case NC_SCENE:
+ switch(wmn->data) {
+ case ND_WORLD:
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE)
+ ED_area_tag_redraw_regiontype(sa, RGN_TYPE_WINDOW);
+ break;
+ }
+ break;
+ case NC_WORLD:
+ switch(wmn->data) {
+ case ND_WORLD_DRAW:
+ if(v3d->flag2 & V3D_RENDER_OVERRIDE)
+ ED_area_tag_redraw_regiontype(sa, RGN_TYPE_WINDOW);
+ break;
+ }
+ break;
+
+ }
+
+#if 0 // removed since BKE_image_user_calc_frame is now called in draw_bgpic because screen_ops doesnt call the notifier.
+ if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) {
+ View3D *v3d = area->spacedata.first;
+ BGpic *bgpic = v3d->bgpicbase.first;
+
+ for (; bgpic; bgpic = bgpic->next) {
+ if (bgpic->ima) {
+ Scene *scene = wmn->reference;
+ BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
+ }
+ }
+ }
+#endif
+}
+
+const char *view3d_context_dir[] = {
+ "selected_objects", "selected_bases", "selected_editable_objects",
+ "selected_editable_bases", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
+ "active_base", "active_object", NULL};
+
static int view3d_context(const bContext *C, const char *member, bContextDataResult *result)
{
View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
Base *base;
- int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */
+ unsigned int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */
if(CTX_data_dir(member)) {
- static const char *dir[] = {
- "selected_objects", "selected_bases", "selected_editable_objects",
- "selected_editable_bases", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases",
- "active_base", "active_object", NULL};
-
- CTX_data_dir_set(result, dir);
+ CTX_data_dir_set(result, view3d_context_dir);
}
else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
int selected_objects= CTX_data_equals(member, "selected_objects");
@@ -973,23 +1054,6 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
return -1; /* found but not available */
}
-/*area (not region) level listener*/
-#if 0 // removed since BKE_image_user_calc_frame is now called in draw_bgpic because screen_ops doesnt call the notifier.
-void space_view3d_listener(struct ScrArea *area, struct wmNotifier *wmn)
-{
- if (wmn->category == NC_SCENE && wmn->data == ND_FRAME) {
- View3D *v3d = area->spacedata.first;
- BGpic *bgpic = v3d->bgpicbase.first;
-
- for (; bgpic; bgpic = bgpic->next) {
- if (bgpic->ima) {
- Scene *scene = wmn->reference;
- BKE_image_user_calc_frame(&bgpic->iuser, scene->r.cfra, 0);
- }
- }
- }
-}
-#endif
/* only called once, from space/spacetypes.c */
void ED_spacetype_view3d(void)
@@ -1003,7 +1067,7 @@ void ED_spacetype_view3d(void)
st->new= view3d_new;
st->free= view3d_free;
st->init= view3d_init;
-// st->listener = space_view3d_listener;
+ st->listener = space_view3d_listener;
st->duplicate= view3d_duplicate;
st->operatortypes= view3d_operatortypes;
st->keymap= view3d_keymap;
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 77172ed2c96..7c80db76e9e 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_context.h"
@@ -57,7 +58,6 @@
#include "BKE_tessmesh.h"
#include "BKE_deform.h"
-
#include "WM_api.h"
#include "WM_types.h"
@@ -129,7 +129,7 @@ typedef struct {
/* is used for both read and write... */
-static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
{
uiBlock *block= (layout)? uiLayoutAbsoluteBlock(layout): NULL;
MDeformVert *dvert=NULL;
@@ -281,32 +281,32 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
mul_m4_v3(ob->obmat, median);
if(block) { // buttons
- int but_y;
- if((ob->parent) && (ob->partype == PARBONE)) but_y = 135;
- else but_y = 150;
-
-
-
+ uiBut *but;
+
memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
uiBlockBeginAlign(block);
if(tot==1) {
uiDefBut(block, LABEL, 0, "Vertex:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
-
+
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+
if(totw==1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 100, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
uiBlockEndAlign(block);
if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 0, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "");
if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
}
else {
uiBlockBeginAlign(block);
@@ -322,11 +322,14 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
else {
uiDefBut(block, LABEL, 0, "Median:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 90, 200, 20, &(tfp->ve_median[1]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 70, 200, 20, &(tfp->ve_median[2]), -lim, lim, 10, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
if(totw==tot) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 50, 200, 20, &(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 25, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
@@ -344,17 +347,17 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, "Local", 100, 45, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays local values");
uiBlockEndAlign(block);
if(totweight)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "Weight is used for SoftBody Goal");
if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 0, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
uiBlockEndAlign(block);
}
}
if(totedge==1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 1, 3, "");
else if(totedge>1)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Mean Crease:", 0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 1, 3, "");
}
else { // apply
@@ -374,26 +377,72 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d
Mesh *me= ob->data;
BMEditMesh *em = me->edit_btmesh;
BMVert *eve;
- BMEdge *eed;
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
- if(BM_TestHFlag(eve, BM_SELECT)) {
- add_v3_v3(eve->co, median);
+ if(len_v3(median) > 0.000001) {
+
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if(BM_TestHFlag(eve, BM_SELECT)) {
+ add_v3_v3(eve->co, median);
+ }
}
+
+ EDBM_RecalcNormals(em);
}
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- if(BM_TestHFlag(eed, BM_SELECT)) {
- float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
- if (!crease) continue;
-
- /* ensure the median can be set to zero or one */
- if(ve_median[3]==0.0f) *crease= 0.0f;
- else if(ve_median[3]==1.0f) *crease= 1.0f;
+ if(median[3] != 0.0f) {
+ BMEdge *eed;
+ const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0 : (ve_median[3] >= 1.0f ? 1.0 : FLT_MAX));
+
+ if(fixed_crease != FLT_MAX) {
+ /* simple case */
+
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+ if (!crease) break;
+
+ *crease= fixed_crease;
+ }
+ }
+ }
+ else {
+ /* scale crease to target median */
+ float median_new= ve_median[3];
+ float median_orig= ve_median[3] - median[3]; /* previous median value */
+
+ /* incase of floating point error */
+ CLAMP(median_orig, 0.0, 1.0);
+ CLAMP(median_new, 0.0, 1.0);
+
+ if(median_new < median_orig) {
+ /* scale down */
+ const float sca= median_new / median_orig;
+
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+
+ if (!crease) break;
+
+ *crease *= sca;
+ CLAMP(*crease, 0.0, 1.0);
+ }
+ }
+ }
else {
- *crease+= median[3];
- CLAMP(*crease, 0.0, 1.0);
+ /* scale up */
+ const float sca= (1.0f - median_new) / (1.0f - median_orig);
+
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+ if (!crease) break;
+
+ *crease = 1.0f - ((1.0f - *crease) * sca);
+ CLAMP(*crease, 0.0, 1.0);
+ }
+ }
}
}
}
@@ -496,15 +545,14 @@ static void act_vert_def(Object *ob, BMVert **eve, MDeformVert **dvert)
static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int index)
{
Mesh *me= ob->data;
-#if 0 //BMESH_TODO use editbmesh_bvh.h code for this! see EDBM_FindNearestVertTopo.
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve_mirr;
+ BMEditMesh *em = me->edit_btmesh;
+ BMVert *eve_mirr;
- eve_mirr= editmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
+ eve_mirr= editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
if(eve_mirr && eve_mirr != eve) {
- MDeformVert *dvert_src= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- MDeformVert *dvert_dst= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
+ MDeformVert *dvert_src= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ MDeformVert *dvert_dst= CustomData_bmesh_get(&em->bm->vdata, eve_mirr->head.data, CD_MDEFORMVERT);
if(dvert_dst) {
if(def_nr == -1) {
/* all vgroups, add groups where neded */
@@ -522,7 +570,6 @@ static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int inde
}
}
}
-#endif
}
static void vgroup_adjust_active(Object *ob, int def_nr)
@@ -648,7 +695,7 @@ static void vgroup_normalize_active(Object *ob)
}
-static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
+static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event)
{
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
@@ -671,11 +718,11 @@ static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
// ED_vgroup_mirror(ob, 1, 1, 0);
/* default for now */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
}
-int view3d_panel_vgroup_poll(const bContext *C, PanelType *pt)
+static int view3d_panel_vgroup_poll(const bContext *C, PanelType *UNUSED(pt))
{
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
@@ -745,61 +792,61 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiLayoutSetActive(split, !(bone->parent && bone->flag & BONE_CONNECTED));
}
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "location", 0, "Location", 0);
+ uiItemR(colsub, ptr, "location", 0, "Location", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
split = uiLayoutSplit(layout, 0.8, 0);
switch(RNA_enum_get(ptr, "rotation_mode")) {
case ROT_MODE_QUAT: /* quaternion */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
else
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
case ROT_MODE_AXISANGLE: /* axis angle */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", 0);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
else
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
default: /* euler rotations */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", 0);
+ uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
break;
}
- uiItemR(layout, ptr, "rotation_mode", 0, "", 0);
+ uiItemR(layout, ptr, "rotation_mode", 0, "", ICON_NULL);
split = uiLayoutSplit(layout, 0.8, 0);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "scale", 0, "Scale", 0);
+ uiItemR(colsub, ptr, "scale", 0, "Scale", ICON_NULL);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", 0);
- uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemL(colsub, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
if (ptr->type == &RNA_Object) {
Object *ob = ptr->data;
if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
- uiItemR(layout, ptr, "dimensions", 0, "Dimensions", 0);
+ uiItemR(layout, ptr, "dimensions", 0, "Dimensions", ICON_NULL);
}
}
-static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_posearmature_buts(uiLayout *layout, Object *ob)
{
// uiBlock *block= uiLayoutGetBlock(layout);
// bArmature *arm;
@@ -808,13 +855,14 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
PointerRNA pchanptr;
uiLayout *col;
// uiLayout *row;
+// uiBut *but;
pchan= get_active_posechannel(ob);
// row= uiLayoutRow(layout, 0);
if (!pchan) {
- uiItemL(layout, "No Bone Active", 0);
+ uiItemL(layout, "No Bone Active", ICON_NULL);
return;
}
@@ -846,9 +894,13 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
uiDefBut(block, LABEL, 0, "Location:", 0, 240, 100, 20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "X:", 0, 220, 120, 19, pchan->loc, -lim, lim, 100, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "Y:", 0, 200, 120, 19, pchan->loc+1, -lim, lim, 100, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL2, "Z:", 0, 180, 120, 19, pchan->loc+2, -lim, lim, 100, 3, "");
+
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "X:", 0, 220, 120, 19, pchan->loc, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "Y:", 0, 200, 120, 19, pchan->loc+1, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
+ but= uiDefButF(block, NUM, B_ARMATUREPANEL2, "Z:", 0, 180, 120, 19, pchan->loc+2, -lim, lim, 100, 3, "");
+ uiButSetUnitType(but, PROP_UNIT_LENGTH);
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -886,22 +938,24 @@ static void v3d_posearmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
}
/* assumes armature editmode */
-void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev)
+#if 0
+static void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev)
{
EditBone *eBone= bonev;
- char oldname[32], newname[32];
-
+ char oldname[sizeof(eBone->name)], newname[sizeof(eBone->name)];
+
/* need to be on the stack */
- BLI_strncpy(newname, eBone->name, 32);
- BLI_strncpy(oldname, (char *)namev, 32);
+ BLI_strncpy(newname, eBone->name, sizeof(eBone->name));
+ BLI_strncpy(oldname, (char *)namev, sizeof(eBone->name));
/* restore */
- BLI_strncpy(eBone->name, oldname, 32);
-
+ BLI_strncpy(eBone->name, oldname, sizeof(eBone->name));
+
ED_armature_bone_rename(CTX_data_edit_object(C)->data, oldname, newname); // editarmature.c
WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, CTX_data_edit_object(C)); // XXX fix
}
+#endif
-static void v3d_editarmature_buts(uiLayout *layout, View3D *v3d, Object *ob, float lim)
+static void v3d_editarmature_buts(uiLayout *layout, Object *ob)
{
// uiBlock *block= uiLayoutGetBlock(layout);
bArmature *arm= ob->data;
@@ -921,21 +975,21 @@ static void v3d_editarmature_buts(uiLayout *layout, View3D *v3d, Object *ob, flo
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &eboneptr, "head", 0, "Head", 0);
+ uiItemR(col, &eboneptr, "head", 0, "Head", ICON_NULL);
if (ebone->parent && ebone->flag & BONE_CONNECTED ) {
PointerRNA parptr = RNA_pointer_get(&eboneptr, "parent");
- uiItemR(col, &parptr, "tail_radius", 0, "Radius", 0);
+ uiItemR(col, &parptr, "tail_radius", 0, "Radius (Parent)", ICON_NULL);
} else {
- uiItemR(col, &eboneptr, "head_radius", 0, "Radius", 0);
+ uiItemR(col, &eboneptr, "head_radius", 0, "Radius", ICON_NULL);
}
- uiItemR(col, &eboneptr, "tail", 0, "Tail", 0);
- uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", 0);
+ uiItemR(col, &eboneptr, "tail", 0, "Tail", ICON_NULL);
+ uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", ICON_NULL);
- uiItemR(col, &eboneptr, "roll", 0, "Roll", 0);
+ uiItemR(col, &eboneptr, "roll", 0, "Roll", ICON_NULL);
}
-static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim)
+static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
{
PointerRNA mbptr, ptr;
MetaBall *mball= ob->data;
@@ -951,37 +1005,37 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob, float lim)
RNA_pointer_create(&mball->id, &RNA_MetaElement, mball->lastelem, &ptr);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "location", 0, "Location", 0);
+ uiItemR(col, &ptr, "co", 0, "Location", ICON_NULL);
- uiItemR(col, &ptr, "radius", 0, "Radius", 0);
- uiItemR(col, &ptr, "stiffness", 0, "Stiffness", 0);
+ uiItemR(col, &ptr, "radius", 0, "Radius", ICON_NULL);
+ uiItemR(col, &ptr, "stiffness", 0, "Stiffness", ICON_NULL);
- uiItemR(col, &ptr, "type", 0, "Type", 0);
+ uiItemR(col, &ptr, "type", 0, "Type", ICON_NULL);
col= uiLayoutColumn(layout, 1);
switch (RNA_enum_get(&ptr, "type")) {
case MB_BALL:
break;
case MB_CUBE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
- uiItemR(col, &ptr, "size_z", 0, "Z", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
break;
case MB_TUBE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
break;
case MB_PLANE:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
break;
case MB_ELIPSOID:
- uiItemL(col, "Size:", 0);
- uiItemR(col, &ptr, "size_x", 0, "X", 0);
- uiItemR(col, &ptr, "size_y", 0, "Y", 0);
- uiItemR(col, &ptr, "size_z", 0, "Z", 0);
+ uiItemL(col, "Size:", ICON_NULL);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
break;
}
}
@@ -994,7 +1048,7 @@ static int test_parent_loop(Object *par, Object *ob)
return test_parent_loop(par->parent, ob);
}
-static void do_view3d_region_buttons(bContext *C, void *arg, int event)
+static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
@@ -1011,14 +1065,14 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
return; /* no notifier! */
case B_OBJECTPANEL:
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
break;
case B_OBJECTPANELMEDIAN:
if(ob) {
- v3d_editvertex_buts(C, NULL, v3d, ob, 1.0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ v3d_editvertex_buts(NULL, v3d, ob, 1.0);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
break;
@@ -1029,7 +1083,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
ob->parent= NULL;
else {
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
break;
@@ -1063,12 +1117,15 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
case B_ARMATUREPANEL2:
{
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
break;
case B_TRANSFORMSPACEADD:
- BIF_createTransformOrientation(C, NULL, "", 1, 0);
+ {
+ char names[sizeof(((TransformOrientation *)NULL)->name)]= "";
+ BIF_createTransformOrientation(C, NULL, names, 1, 0);
break;
+ }
case B_TRANSFORMSPACECLEAR:
BIF_clearTransformOrientation(C);
break;
@@ -1116,7 +1173,7 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
int a;
for(a=0; a<me->totvert; a++)
ED_vgroup_vert_remove (ob, defGroup, a);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
}
break;
@@ -1157,16 +1214,6 @@ static void do_view3d_region_buttons(bContext *C, void *arg, int event)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, ob);
}
-void removeTransformOrientation_func(bContext *C, void *target, void *unused)
-{
- BIF_removeTransformOrientation(C, (TransformOrientation *) target);
-}
-
-void selectTransformOrientation_func(bContext *C, void *target, void *unused)
-{
- BIF_selectTransformOrientation(C, (TransformOrientation *) target);
-}
-
static void view3d_panel_object(const bContext *C, Panel *pa)
{
uiBlock *block;
@@ -1208,12 +1255,12 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
RNA_id_pointer_create(&ob->id, &obptr);
if(ob==obedit) {
- if(ob->type==OB_ARMATURE) v3d_editarmature_buts(col, v3d, ob, lim);
- if(ob->type==OB_MBALL) v3d_editmetaball_buts(col, ob, lim);
- else v3d_editvertex_buts(C, col, v3d, ob, lim);
+ if(ob->type==OB_ARMATURE) v3d_editarmature_buts(col, ob);
+ if(ob->type==OB_MBALL) v3d_editmetaball_buts(col, ob);
+ else v3d_editvertex_buts(col, v3d, ob, lim);
}
else if(ob->mode & OB_MODE_POSE) {
- v3d_posearmature_buts(col, v3d, ob, lim);
+ v3d_posearmature_buts(col, ob);
}
else {
@@ -1381,53 +1428,6 @@ static void view3d_panel_bonesketch_spaces(const bContext *C, Panel *pa)
uiBlockEndAlign(block);
}
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- int retval;
-
- if (G.f & G_DEBUG)
- printf("operator redo %s\n", lastop->type->name);
- ED_undo_pop(C);
- retval= WM_operator_repeat(C, lastop);
- if((retval & OPERATOR_FINISHED)==0) {
- if (G.f & G_DEBUG)
- printf("operator redo failed %s\n", lastop->type->name);
- ED_undo_redo(C);
- }
- }
-}
-
-static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
-{
- wmWindowManager *wm= CTX_wm_manager(C);
- wmOperator *op;
- PointerRNA ptr;
- uiBlock *block;
-
- block= uiLayoutGetBlock(pa->layout);
-
- /* only for operators that are registered and did an undo push */
- for(op= wm->operators.last; op; op= op->prev)
- if((op->type->flag & OPTYPE_REGISTER) && (op->type->flag & OPTYPE_UNDO))
- break;
-
- if(op==NULL)
- return;
-
- uiBlockSetFunc(block, redo_cb, op, NULL);
-
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
- uiDefAutoButsRNA(C, pa->layout, &ptr, 2);
-}
#endif // XXX not used
void view3d_buttons_register(ARegionType *art)
@@ -1456,7 +1456,7 @@ void view3d_buttons_register(ARegionType *art)
// XXX view3d_panel_preview(C, ar, 0);
}
-static int view3d_properties(bContext *C, wmOperator *op)
+static int view3d_properties(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_buttons_region(sa);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 0dc505e0146..4d591645679 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_context.h"
@@ -55,10 +56,7 @@
#include "BKE_global.h"
#include "BKE_paint.h"
#include "BKE_scene.h"
-#include "BKE_screen.h"
-#include "BKE_tessmesh.h"
#include "BKE_unit.h"
-#include "BKE_utildefines.h"
#include "RE_pipeline.h" // make_stars
@@ -246,15 +244,13 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
#define GRID_MIN_PX 6.0f
-static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_unit)
+static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **grid_unit)
{
/* extern short bgpicmode; */
RegionView3D *rv3d= ar->regiondata;
float wx, wy, x, y, fw, fx, fy, dx;
float vec4[4];
- char col[3], col2[3];
-
- *grid_unit= NULL;
+ unsigned char col[3], col2[3];
vec4[0]=vec4[1]=vec4[2]=0.0;
vec4[3]= 1.0;
@@ -269,7 +265,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
x= (wx)*fx/fw;
y= (wy)*fy/fw;
- vec4[0]=vec4[1]= (unit->system) ? 1.0 : v3d->grid;
+ vec4[0]=vec4[1]= v3d->grid;
vec4[2]= 0.0;
vec4[3]= 1.0;
@@ -309,7 +305,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
/* Store the smallest drawn grid size units name so users know how big each grid cell is */
if(*grid_unit==NULL) {
*grid_unit= bUnit_GetNameDisplay(usys, i);
- rv3d->gridview= (scalar * unit->scale_length);
+ rv3d->gridview= (scalar * v3d->grid) / unit->scale_length;
}
blend_fac= 1-((GRID_MIN_PX*2)/dx_scalar);
@@ -402,17 +398,19 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
setlinestyle(0);
/* center cross */
+ /* horizontal line */
if( ELEM(rv3d->view, RV3D_VIEW_RIGHT, RV3D_VIEW_LEFT))
- UI_make_axis_color(col, col2, 'y');
- else UI_make_axis_color(col, col2, 'x');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ else UI_make_axis_color(col, col2, 'X');
+ glColor3ubv(col2);
fdrawline(0.0, y, (float)ar->winx, y);
+ /* vertical line */
if( ELEM(rv3d->view, RV3D_VIEW_TOP, RV3D_VIEW_BOTTOM))
- UI_make_axis_color(col, col2, 'y');
- else UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ else UI_make_axis_color(col, col2, 'Z');
+ glColor3ubv(col2);
fdrawline(x, 0.0, x, (float)ar->winy);
@@ -420,22 +418,39 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, char **grid_u
}
#undef GRID_MIN_PX
-static void drawfloor(Scene *scene, View3D *v3d)
+static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
{
- float vert[3], grid;
+ float vert[3], grid, grid_scale;
int a, gridlines, emphasise;
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
short draw_line = 0;
vert[2]= 0.0;
if(v3d->gridlines<3) return;
+ grid_scale= v3d->grid;
+ /* use 'grid_scale' instead of 'v3d->grid' from now on */
+
+ /* apply units */
+ if(scene->unit.system) {
+ void *usys;
+ int len;
+
+ bUnit_GetSystem(&usys, &len, scene->unit.system, B_UNIT_LENGTH);
+
+ if(usys) {
+ int i= bUnit_GetBaseUnit(usys);
+ *grid_unit= bUnit_GetNameDisplay(usys, i);
+ grid_scale = (grid_scale * bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
+ }
+ }
+
if(v3d->zbuf && scene->obedit) glDepthMask(0); // for zbuffer-select
gridlines= v3d->gridlines/2;
- grid= gridlines*v3d->grid;
-
+ grid= gridlines * grid_scale;
+
UI_GetThemeColor3ubv(TH_GRID, col);
UI_GetThemeColor3ubv(TH_BACK, col2);
@@ -450,8 +465,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
if(a==0) {
/* check for the 'show Y axis' preference */
if (v3d->gridflag & V3D_SHOW_Y) {
- UI_make_axis_color(col, col2, 'y');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Y');
+ glColor3ubv(col2);
draw_line = 1;
} else if (v3d->gridflag & V3D_SHOW_FLOOR) {
@@ -475,7 +490,7 @@ static void drawfloor(Scene *scene, View3D *v3d)
if (draw_line) {
glBegin(GL_LINE_STRIP);
- vert[0]= a*v3d->grid;
+ vert[0]= a * grid_scale;
vert[1]= grid;
glVertex3fv(vert);
vert[1]= -grid;
@@ -489,8 +504,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
if(a==0) {
/* check for the 'show X axis' preference */
if (v3d->gridflag & V3D_SHOW_X) {
- UI_make_axis_color(col, col2, 'x');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'X');
+ glColor3ubv(col2);
draw_line = 1;
} else if (v3d->gridflag & V3D_SHOW_FLOOR) {
@@ -514,7 +529,7 @@ static void drawfloor(Scene *scene, View3D *v3d)
if (draw_line) {
glBegin(GL_LINE_STRIP);
- vert[1]= a*v3d->grid;
+ vert[1]= a * grid_scale;
vert[0]= grid;
glVertex3fv(vert );
vert[0]= -grid;
@@ -526,8 +541,8 @@ static void drawfloor(Scene *scene, View3D *v3d)
/* draw the Z axis line */
/* check for the 'show Z axis' preference */
if (v3d->gridflag & V3D_SHOW_Z) {
- UI_make_axis_color(col, col2, 'z');
- glColor3ubv((GLubyte *)col2);
+ UI_make_axis_color(col, col2, 'Z');
+ glColor3ubv(col2);
glBegin(GL_LINE_STRIP);
vert[0]= 0;
@@ -574,94 +589,85 @@ static void drawcursor(Scene *scene, ARegion *ar, View3D *v3d)
}
}
-/* Draw a live substitute of the view icon, which is always shown */
+/* Draw a live substitute of the view icon, which is always shown
+ * colors copied from transform_manipulator.c, we should keep these matching. */
static void draw_view_axis(RegionView3D *rv3d)
{
const float k = U.rvisize; /* axis size */
const float toll = 0.5; /* used to see when view is quasi-orthogonal */
const float start = k + 1.0; /* axis center in screen coordinates, x=y */
float ydisp = 0.0; /* vertical displacement to allow obj info text */
-
- /* rvibright ranges approx. from original axis icon color to gizmo color */
- float bright = U.rvibright / 15.0f;
-
- unsigned char col[3];
- unsigned char gridcol[3];
- float colf[3];
-
- float vec[4];
+ int bright = 25*(float)U.rvibright + 5; /* axis alpha (rvibright has range 0-10) */
+
+ float vec[3];
float dx, dy;
- float h, s, v;
/* thickness of lines is proportional to k */
- /* (log(k)-1) gives a more suitable thickness, but fps decreased by about 3 fps */
- glLineWidth(k / 10);
- //glLineWidth(log(k)-1); // a bit slow
-
- UI_GetThemeColor3ubv(TH_GRID, (char *)gridcol);
-
+ glLineWidth(2);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
/* X */
- vec[0] = vec[3] = 1;
+ vec[0] = 1;
vec[1] = vec[2] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'x');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.3;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(220, 0, 0, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x", 1);
}
+ /* BLF_draw_default disables blending */
+ glEnable(GL_BLEND);
+
/* Y */
- vec[1] = vec[3] = 1;
+ vec[1] = 1;
vec[0] = vec[2] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'y');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.3;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(0, 220, 0, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y", 1);
}
+
+ glEnable(GL_BLEND);
/* Z */
- vec[2] = vec[3] = 1;
+ vec[2] = 1;
vec[1] = vec[0] = 0;
mul_qt_v3(rv3d->viewquat, vec);
-
- UI_make_axis_color((char *)gridcol, (char *)col, 'z');
- rgb_to_hsv(col[0]/255.0f, col[1]/255.0f, col[2]/255.0f, &h, &s, &v);
- s = s<0.5 ? s+0.5 : 1.0;
- v = 0.5;
- v = (v<1.0-(bright) ? v+bright : 1.0);
- hsv_to_rgb(h, s, v, colf, colf+1, colf+2);
- glColor3fv(colf);
-
dx = vec[0] * k;
dy = vec[1] * k;
- fdrawline(start, start + ydisp, start + dx, start + dy + ydisp);
+
+ glColor4ub(30, 30, 220, bright);
+ glBegin(GL_LINES);
+ glVertex2f(start, start + ydisp);
+ glVertex2f(start + dx, start + dy + ydisp);
+ glEnd();
+
if (fabs(dx) > toll || fabs(dy) > toll) {
- BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z");
+ BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z", 1);
}
-
+
/* restore line-width */
+
glLineWidth(1.0);
+ glDisable(GL_BLEND);
}
@@ -685,9 +691,9 @@ static void draw_view_icon(RegionView3D *rv3d)
glDisable(GL_BLEND);
}
-static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
+static const char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
{
- char *name = NULL;
+ const char *name = NULL;
switch (rv3d->view) {
case RV3D_VIEW_FRONT:
@@ -736,24 +742,17 @@ static char *view3d_get_name(View3D *v3d, RegionView3D *rv3d)
static void draw_viewport_name(ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
- char *name = view3d_get_name(v3d, rv3d);
- char *printable = NULL;
+ const char *name= view3d_get_name(v3d, rv3d);
+ char tmpstr[24];
if (v3d->localvd) {
- printable = MEM_mallocN(strlen(name) + strlen(" (Local)_"), "viewport_name"); /* '_' gives space for '\0' */
- strcpy(printable, name);
- strcat(printable, " (Local)");
- } else {
- printable = name;
+ BLI_snprintf(tmpstr, sizeof(tmpstr), "%s (Local)", name);
+ name= tmpstr;
}
- if (printable) {
+ if (name) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(22, ar->winy-17, 0.0f, printable);
- }
-
- if (v3d->localvd) {
- MEM_freeN(printable);
+ BLF_draw_default(22, ar->winy-17, 0.0f, name, sizeof(tmpstr));
}
}
@@ -828,7 +827,7 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
sprintf(info, "(%d) %s", CFRA, ob->id.name+2);
}
- /* colour depends on whether there is a keyframe */
+ /* color depends on whether there is a keyframe */
if (id_frame_has_keyframe((ID *)ob, /*BKE_curframe(scene)*/(float)(CFRA), v3d->keyflags))
UI_ThemeColor(TH_VERTEX_SELECT);
else
@@ -841,17 +840,17 @@ static void draw_selected_name(Scene *scene, Object *ob, View3D *v3d)
else
sprintf(info, "(%d)", CFRA);
- /* colour is always white */
+ /* color is always white */
UI_ThemeColor(TH_TEXT_HI);
}
if (U.uiflag & USER_SHOW_ROTVIEWICON)
offset = 14 + (U.rvisize * 2);
- BLF_draw_default(offset, 10, 0.0f, info);
+ BLF_draw_default(offset, 10, 0.0f, info, sizeof(info)-1);
}
-static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2])
+void view3d_viewborder_size_get(Scene *scene, ARegion *ar, float size_r[2])
{
float winmax= MAX2(ar->winx, ar->winy);
float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
@@ -865,12 +864,12 @@ static void view3d_get_viewborder_size(Scene *scene, ARegion *ar, float size_r[2
}
}
-void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r)
+void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, View3D *v3d, rctf *viewborder_r, short do_shift)
{
float zoomfac, size[2];
float dx= 0.0f, dy= 0.0f;
- view3d_get_viewborder_size(scene, ar, size);
+ view3d_viewborder_size_get(scene, ar, size);
if (rv3d == NULL)
rv3d = ar->regiondata;
@@ -904,12 +903,13 @@ void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, Vi
viewborder_r->xmax-= dx;
viewborder_r->ymax-= dy;
- if(v3d->camera && v3d->camera->type==OB_CAMERA) {
+ if(do_shift && v3d->camera && v3d->camera->type==OB_CAMERA) {
Camera *cam= v3d->camera->data;
float w = viewborder_r->xmax - viewborder_r->xmin;
float h = viewborder_r->ymax - viewborder_r->ymin;
float side = MAX2(w, h);
-
+
+ if(do_shift == -1) side *= -1;
viewborder_r->xmin+= cam->shiftx*side;
viewborder_r->xmax+= cam->shiftx*side;
viewborder_r->ymin+= cam->shifty*side;
@@ -917,67 +917,8 @@ void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, Vi
}
}
-void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
-{
- RegionView3D *rv3d= ar->regiondata;
- float size[2];
- int im_width= (scene->r.size*scene->r.xsch)/100;
-
- view3d_get_viewborder_size(scene, ar, size);
-
- rv3d->camzoom= (sqrt(4.0*im_width/size[0]) - M_SQRT2)*50.0;
- rv3d->camzoom= CLAMPIS(rv3d->camzoom, -30, 300);
-}
-
-
-static void drawviewborder_flymode(ARegion *ar)
-{
- /* draws 4 edge brackets that frame the safe area where the
- mouse can move during fly mode without spinning the view */
- float x1, x2, y1, y2;
-
- x1= 0.45*(float)ar->winx;
- y1= 0.45*(float)ar->winy;
- x2= 0.55*(float)ar->winx;
- y2= 0.55*(float)ar->winy;
- cpack(0);
-
-
- glBegin(GL_LINES);
- /* bottom left */
- glVertex2f(x1,y1);
- glVertex2f(x1,y1+5);
-
- glVertex2f(x1,y1);
- glVertex2f(x1+5,y1);
-
- /* top right */
- glVertex2f(x2,y2);
- glVertex2f(x2,y2-5);
-
- glVertex2f(x2,y2);
- glVertex2f(x2-5,y2);
-
- /* top left */
- glVertex2f(x1,y2);
- glVertex2f(x1,y2-5);
-
- glVertex2f(x1,y2);
- glVertex2f(x1+5,y2);
-
- /* bottom right */
- glVertex2f(x2,y1);
- glVertex2f(x2,y1+5);
-
- glVertex2f(x2,y1);
- glVertex2f(x2-5,y1);
- glEnd();
-}
-
-
static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
{
- extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad); // interface_panel.c
float fac, a;
float x1, x2, y1, y2;
float x1i, x2i, y1i, y2i;
@@ -991,7 +932,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
if(v3d->camera->type==OB_CAMERA)
ca = v3d->camera->data;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &viewborder);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &viewborder, FALSE);
/* the offsets */
x1= viewborder.xmin;
y1= viewborder.ymin;
@@ -1064,7 +1005,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 0.25, 0);
uiSetRoundBox(15);
- gl_round_box(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
+ uiDrawBox(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
}
setlinestyle(0);
@@ -1073,7 +1014,7 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
/* camera name - draw in highlighted text color */
if (ca && (ca->flag & CAM_SHOWNAME)) {
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2);
+ BLF_draw_default(x1i, y1i-15, 0.0f, v3d->camera->id.name+2, sizeof(v3d->camera->id.name)-2);
UI_ThemeColor(TH_WIRE);
}
}
@@ -1190,7 +1131,7 @@ ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax,
if(ymax >= vc->ar->winy) ymaxc= vc->ar->winy-1; else ymaxc= ymax;
if(yminc > ymaxc) return NULL;
- ibuf= IMB_allocImBuf((xmaxc-xminc+1), (ymaxc-yminc+1), 32, IB_rect,0);
+ ibuf= IMB_allocImBuf((xmaxc-xminc+1), (ymaxc-yminc+1), 32, IB_rect);
view3d_validate_backbuf(vc);
@@ -1210,7 +1151,7 @@ ImBuf *view3d_read_backbuf(ViewContext *vc, short xmin, short ymin, short xmax,
if(xminc==xmin && xmaxc==xmax && yminc==ymin && ymaxc==ymax)
return ibuf;
- ibuf1= IMB_allocImBuf( (xmax-xmin+1),(ymax-ymin+1),32,IB_rect,0);
+ ibuf1= IMB_allocImBuf( (xmax-xmin+1),(ymax-ymin+1),32,IB_rect);
rd= ibuf->rect;
dr= ibuf1->rect;
@@ -1328,7 +1269,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
if(rv3d->persp==RV3D_CAMOB) {
rctf vb;
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb, FALSE);
x1= vb.xmin;
y1= vb.ymin;
@@ -1458,26 +1399,26 @@ static void view3d_draw_transp(Scene *scene, ARegion *ar, View3D *v3d)
static void view3d_draw_xray(Scene *scene, ARegion *ar, View3D *v3d, int clear)
{
View3DAfter *v3da, *next;
-
+
if(clear && v3d->zbuf)
glClear(GL_DEPTH_BUFFER_BIT);
-
- v3d->xray= TRUE;
+
+ v3d->xray= TRUE;
for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
- next= v3da->next;
- draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+ next= v3da->next;
+ draw_object(scene, ar, v3d, v3da->base, v3da->flag);
BLI_remlink(&v3d->afterdraw_xray, v3da);
- MEM_freeN(v3da);
- }
- v3d->xray= FALSE;
+ MEM_freeN(v3da);
}
+ v3d->xray= FALSE;
+}
/* clears zbuffer and draws it over */
static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, int clear)
{
View3DAfter *v3da, *next;
-
+
if(clear && v3d->zbuf)
glClear(GL_DEPTH_BUFFER_BIT);
@@ -1486,14 +1427,14 @@ static void view3d_draw_xraytransp(Scene *scene, ARegion *ar, View3D *v3d, int c
for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
next= v3da->next;
- draw_object(scene, ar, v3d, v3da->base, v3da->flag);
+ draw_object(scene, ar, v3d, v3da->base, v3da->flag);
BLI_remlink(&v3d->afterdraw_xraytransp, v3da);
- MEM_freeN(v3da);
- }
+ MEM_freeN(v3da);
+ }
v3d->transp= FALSE;
v3d->xray= FALSE;
-
+
}
/* *********************** */
@@ -1528,7 +1469,7 @@ static void draw_dupli_objects_color(Scene *scene, ARegion *ar, View3D *v3d, Bas
{
RegionView3D *rv3d= ar->regiondata;
ListBase *lb;
- DupliObject *dob_prev= NULL, *dob, *dob_next;
+ DupliObject *dob_prev= NULL, *dob, *dob_next= NULL;
Base tbase;
BoundBox bb, *bb_tmp; /* use a copy because draw_object, calls clear_mesh_caches */
GLuint displist=0;
@@ -1638,8 +1579,62 @@ static void draw_dupli_objects(Scene *scene, ARegion *ar, View3D *v3d, Base *bas
draw_dupli_objects_color(scene, ar, v3d, base, color);
}
+void view3d_update_depths_rect(ARegion *ar, ViewDepths *d, rcti *rect)
+{
+ int x, y, w, h;
+ rcti r;
+ /* clamp rect by area */
+
+ r.xmin= 0;
+ r.xmax= ar->winx-1;
+ r.ymin= 0;
+ r.ymax= ar->winy-1;
+
+ /* Constrain rect to depth bounds */
+ BLI_isect_rcti(&r, rect, rect);
+
+ /* assign values to compare with the ViewDepths */
+ x= rect->xmin;
+ y= rect->ymin;
-void view3d_update_depths(ARegion *ar, View3D *v3d)
+ w= rect->xmax - rect->xmin;
+ h= rect->ymax - rect->ymin;
+
+ if(w <= 0 || h <= 0) {
+ if(d->depths)
+ MEM_freeN(d->depths);
+ d->depths= NULL;
+
+ d->damaged= FALSE;
+ }
+ else if( d->w != w ||
+ d->h != h ||
+ d->x != x ||
+ d->y != y ||
+ d->depths==NULL
+ ) {
+ d->x= x;
+ d->y= y;
+ d->w= w;
+ d->h= h;
+
+ if(d->depths)
+ MEM_freeN(d->depths);
+
+ d->depths= MEM_mallocN(sizeof(float)*d->w*d->h,"View depths Subset");
+
+ d->damaged= TRUE;
+ }
+
+ if(d->damaged) {
+ glReadPixels(ar->winrct.xmin+d->x,ar->winrct.ymin+d->y, d->w,d->h, GL_DEPTH_COMPONENT,GL_FLOAT, d->depths);
+ glGetDoublev(GL_DEPTH_RANGE,d->depth_range);
+ d->damaged= FALSE;
+ }
+}
+
+/* note, with nouveau drivers the glReadPixels() is very slow. [#24339] */
+void view3d_update_depths(ARegion *ar)
{
RegionView3D *rv3d= ar->regiondata;
@@ -1669,6 +1664,30 @@ void view3d_update_depths(ARegion *ar, View3D *v3d)
}
}
+/* utility function to find the closest Z value, use for autodepth */
+float view3d_depth_near(ViewDepths *d)
+{
+ /* convert to float for comparisons */
+ const float near= (float)d->depth_range[0];
+ const float far_real= (float)d->depth_range[1];
+ float far= far_real;
+
+ const float *depths= d->depths;
+ float depth= FLT_MAX;
+ int i= (int)d->w * (int)d->h; /* cast to avoid short overflow */
+
+ /* far is both the starting 'far' value
+ * and the closest value found. */
+ while(i--) {
+ depth= *depths++;
+ if((depth < far) && (depth > near)) {
+ far= depth;
+ }
+ }
+
+ return far == far_real ? FLT_MAX : far;
+}
+
void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d)
{
short zbuf= v3d->zbuf;
@@ -1698,7 +1717,6 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
{
RegionView3D *rv3d= ar->regiondata;
Base *base;
- Scene *sce;
short zbuf= v3d->zbuf;
short flag= v3d->flag;
float glalphaclip= U.glalphaclip;
@@ -1731,7 +1749,8 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
if (func == NULL || func(base)) {
draw_object(scene, ar, v3d, base, 0);
@@ -1770,9 +1789,9 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
if(v3d->afterdraw_xray.first || v3d->afterdraw_xraytransp.first) {
- glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
+ glDepthFunc(GL_ALWAYS); /* always write into the depth bufer, overwriting front z values */
for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
- next= v3da->next;
+ next= v3da->next;
draw_object(scene, ar, v3d, v3da->base, 0);
}
glDepthFunc(GL_LEQUAL); /* Now write the depth buffer normally */
@@ -1787,7 +1806,7 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
BLI_remlink(&v3d->afterdraw_transp, v3da);
MEM_freeN(v3da);
}
-
+
v3d->xray= TRUE;
v3d->transp= FALSE;
for(v3da= v3d->afterdraw_xray.first; v3da; v3da= next) {
@@ -1795,8 +1814,8 @@ void draw_depth(Scene *scene, ARegion *ar, View3D *v3d, int (* func)(void *))
draw_object(scene, ar, v3d, v3da->base, 0);
BLI_remlink(&v3d->afterdraw_xray, v3da);
MEM_freeN(v3da);
- }
-
+ }
+
v3d->xray= TRUE;
v3d->transp= TRUE;
for(v3da= v3d->afterdraw_xraytransp.first; v3da; v3da= next) {
@@ -1853,16 +1872,14 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
{
ListBase shadows;
View3DShadow *shadow;
- Scene *sce;
+ Scene *sce_iter;
Base *base;
Object *ob;
- ARegion ar;
- RegionView3D rv3d;
shadows.first= shadows.last= NULL;
/* update lamp transform and gather shadow lamps */
- for(SETLOOPER(scene, base)) {
+ for(SETLOOPER(scene, sce_iter, base)) {
ob= base->object;
if(ob->type == OB_LAMP)
@@ -1886,6 +1903,8 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* this needs to be done better .. */
float viewmat[4][4], winmat[4][4];
int drawtype, lay, winsize, flag2=v3d->flag2;
+ ARegion ar= {0};
+ RegionView3D rv3d= {{{0}}};
drawtype= v3d->drawtype;
lay= v3d->lay;
@@ -1897,9 +1916,6 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
GPU_lamp_shadow_buffer_bind(shadow->lamp, viewmat, &winsize, winmat);
- memset(&ar, 0, sizeof(ar));
- memset(&rv3d, 0, sizeof(rv3d));
-
ar.regiondata= &rv3d;
ar.regiontype= RGN_TYPE_WINDOW;
rv3d.persp= RV3D_CAMOB;
@@ -1923,8 +1939,10 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* *********************** customdata **************** */
/* goes over all modes and view3d settings */
-static CustomDataMask get_viewedit_datamask(bScreen *screen, Scene *scene, Object *ob)
+CustomDataMask ED_viewedit_datamask(bScreen *screen)
{
+ Scene *scene= screen->scene;
+ Object *ob= scene->basact ? scene->basact->object : NULL;
CustomDataMask mask = CD_MASK_BAREMESH;
ScrArea *sa;
@@ -1974,29 +1992,34 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
if(viewmat)
copy_m4_m4(rv3d->viewmat, viewmat);
else
- setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
+ setviewmatrixview3d(scene, v3d, rv3d); /* note: calls where_is_object for camera... */
/* update utilitity matrices */
mul_m4_m4m4(rv3d->persmat, rv3d->viewmat, rv3d->winmat);
invert_m4_m4(rv3d->persinv, rv3d->persmat);
invert_m4_m4(rv3d->viewinv, rv3d->viewmat);
-
+
/* calculate pixelsize factor once, is used for lamps and obcenters */
{
- float len1, len2, vec[3];
-
- copy_v3_v3(vec, rv3d->persinv[0]);
- len1= normalize_v3(vec);
- copy_v3_v3(vec, rv3d->persinv[1]);
- len2= normalize_v3(vec);
-
- rv3d->pixsize= 2.0f*(len1>len2?len1:len2);
+ /* note: '1.0f / len_v3(v1)' replaced 'len_v3(rv3d->viewmat[0])'
+ * because of float point precision problems at large values [#23908] */
+ float v1[3], v2[3];
+ float len1, len2;
+
+ v1[0]= rv3d->persmat[0][0];
+ v1[1]= rv3d->persmat[1][0];
+ v1[2]= rv3d->persmat[2][0];
+
+ v2[0]= rv3d->persmat[0][1];
+ v2[1]= rv3d->persmat[1][1];
+ v2[2]= rv3d->persmat[2][1];
- /* correct for window size */
- if(ar->winx > ar->winy) rv3d->pixsize/= (float)ar->winx;
- else rv3d->pixsize/= (float)ar->winy;
+ len1= 1.0f / len_v3(v1);
+ len2= 1.0f / len_v3(v2);
+
+ rv3d->pixsize = (2.0f * MAX2(len1, len2)) / (float)MAX2(ar->winx, ar->winy);
}
-
+
/* set for opengl */
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(rv3d->winmat);
@@ -2006,7 +2029,6 @@ static void view3d_main_area_setup_view(Scene *scene, View3D *v3d, ARegion *ar,
void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, int winy, float viewmat[][4], float winmat[][4])
{
- Scene *sce;
Base *base;
float backcol[3];
int bwinx, bwiny;
@@ -2020,7 +2042,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
brect= ar->winrct;
ar->winx= winx;
- ar->winy= winy;
+ ar->winy= winy;
ar->winrct.xmin= 0;
ar->winrct.ymin= 0;
ar->winrct.xmax= winx;
@@ -2033,6 +2055,10 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
/* free images which can have changed on frame-change
* warning! can be slow so only free animated images - campbell */
GPU_free_images_anim();
+
+ /* shadow buffers, before we setup matrices */
+ if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
+ gpu_update_lamps_shadows(scene, v3d);
/* set background color, fallback on the view background color */
if(scene->world) {
@@ -2061,14 +2087,15 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
UI_ThemeColorBlend(TH_WIRE, TH_BACK, 0.6f);
draw_object(scene, ar, v3d, base, DRAW_CONSTCOLOR|DRAW_SCENESET);
-
+
if(base->object->transflag & OB_DUPLI)
draw_dupli_objects_color(scene, ar, v3d, base, TH_WIRE);
- }
+ }
}
}
@@ -2123,9 +2150,12 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
RegionView3D *rv3d= ar->regiondata;
ImBuf *ibuf;
GPUOffScreen *ofs;
+
+ /* state changes make normal drawing go weird otherwise */
+ glPushAttrib(GL_LIGHTING_BIT);
/* bind */
- ofs= GPU_offscreen_create(sizex, sizey);
+ ofs= GPU_offscreen_create(&sizex, &sizey);
if(ofs == NULL)
return NULL;
@@ -2146,13 +2176,13 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
}
/* read in pixels & stamp */
- ibuf= IMB_allocImBuf(sizex, sizey, 32, flag, 0);
+ ibuf= IMB_allocImBuf(sizex, sizey, 32, flag);
if(ibuf->rect_float)
glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, ibuf->rect_float);
else if(ibuf->rect)
- glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
-
+ glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+
//if((scene->r.stamp & R_STAMP_ALL) && (scene->r.stamp & R_STAMP_DRAW))
// BKE_stamp_buf(scene, NULL, rr->rectf, rr->rectx, rr->recty, 4);
@@ -2160,6 +2190,8 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
GPU_offscreen_unbind(ofs);
GPU_offscreen_free(ofs);
+ glPopAttrib();
+
if(ibuf->rect_float && ibuf->rect)
IMB_rect_from_float(ibuf);
@@ -2169,13 +2201,9 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
/* creates own 3d views, used by the sequencer */
ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype)
{
- View3D v3d;
- ARegion ar;
- RegionView3D rv3d;
-
- memset(&v3d, 0, sizeof(v3d));
- memset(&ar, 0, sizeof(ar));
- memset(&rv3d, 0, sizeof(rv3d));
+ View3D v3d= {0};
+ ARegion ar= {0};
+ RegionView3D rv3d= {{{0}}};
/* connect data */
v3d.regionbase.first= v3d.regionbase.last= &ar;
@@ -2256,24 +2284,20 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5));
}
- BLF_draw_default(22, ar->winy-17, 0.0f, printable);
+ BLF_draw_default(22, ar->winy-17, 0.0f, printable, sizeof(printable)-1);
}
+/* warning: this function has duplicate drawing in ED_view3d_draw_offscreen() */
void view3d_main_area_draw(const bContext *C, ARegion *ar)
{
Scene *scene= CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
- Scene *sce;
Base *base;
Object *ob;
float backcol[3];
- int retopo= 0, sculptparticle= 0;
- Object *obact = OBACT;
- char *grid_unit= NULL;
-
- /* from now on all object derived meshes check this */
- v3d->customdata_mask= get_viewedit_datamask(CTX_wm_screen(C), scene, obact);
+ unsigned int lay_used;
+ const char *grid_unit= NULL;
/* shadow buffers, before we setup matrices */
if(draw_glsl_material(scene, NULL, v3d, v3d->drawtype))
@@ -2320,22 +2344,25 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// needs to be done always, gridview is adjusted in drawgrid() now
rv3d->gridview= v3d->grid;
-
- if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- if(rv3d->view==0 || rv3d->persp != RV3D_ORTHO) {
- drawfloor(scene, v3d);
- if(rv3d->persp==RV3D_CAMOB) {
- if(scene->world) {
- if(scene->world->mode & WO_STARS) {
- RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
- star_stuff_term_func);
- }
+ if(rv3d->view==0 || rv3d->persp != RV3D_ORTHO) {
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ drawfloor(scene, v3d, &grid_unit);
+ }
+ if(rv3d->persp==RV3D_CAMOB) {
+ if(scene->world) {
+ if(scene->world->mode & WO_STARS) {
+ RE_make_stars(NULL, scene, star_stuff_init_func, star_stuff_vertex_func,
+ star_stuff_term_func);
}
+ }
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
if(v3d->flag & V3D_DISPBGPICS) draw_bgpic(scene, ar, v3d);
}
}
- else {
+ }
+ else {
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
ED_region_pixelspace(ar);
drawgrid(&scene->unit, ar, v3d, &grid_unit);
/* XXX make function? replaces persp(1) */
@@ -2355,7 +2382,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* draw set first */
if(scene->set) {
- for(SETLOOPER(scene->set, base)) {
+ Scene *sce_iter;
+ for(SETLOOPER(scene->set, sce_iter, base)) {
if(v3d->lay & base->lay) {
@@ -2370,9 +2398,13 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* Transp and X-ray afterdraw stuff for sets is done later */
}
-
+
+ lay_used= 0;
+
/* then draw not selected and the duplis, but skip editmode object */
for(base= scene->base.first; base; base= base->next) {
+ lay_used |= base->lay & ((1<<20)-1);
+
if(v3d->lay & base->lay) {
/* dupli drawing */
@@ -2386,11 +2418,20 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
}
-// retopo= retopo_mesh_check() || retopo_curve_check();
- sculptparticle= (obact && obact->mode & (OB_MODE_PARTICLE_EDIT)) && !scene->obedit;
- if(retopo)
- view3d_update_depths(ar, v3d);
-
+ if(v3d->lay_used != lay_used) { /* happens when loading old files or loading with UI load */
+ ARegion *ar_iter;
+ ScrArea *sa= CTX_wm_area(C);
+
+ /* find header and force tag redraw */
+ for(ar_iter= sa->regionbase.first; ar_iter; ar_iter= ar_iter->next)
+ if(ar_iter->regiontype==RGN_TYPE_HEADER) {
+ ED_region_tag_redraw(ar_iter);
+ break;
+ }
+
+ v3d->lay_used= lay_used;
+ }
+
/* draw selected and editmode */
for(base= scene->base.first; base; base= base->next) {
if(v3d->lay & base->lay) {
@@ -2398,11 +2439,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
draw_object(scene, ar, v3d, base, 0);
}
}
-
- if(!retopo && sculptparticle && !(obact && (obact->dtx & OB_DRAWXRAY))) {
- view3d_update_depths(ar, v3d);
- }
-
+
// REEB_draw();
/* Transp and X-ray afterdraw stuff */
@@ -2411,11 +2448,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
if(v3d->afterdraw_xraytransp.first) view3d_draw_xraytransp(scene, ar, v3d, 1);
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
-
- if(!retopo && sculptparticle && (obact && (OBACT->dtx & OB_DRAWXRAY))) {
- view3d_update_depths(ar, v3d);
- }
-
+
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
@@ -2446,8 +2479,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
/* Draw particle edit brush XXX (removed) */
- if(rv3d->persp==RV3D_CAMOB) drawviewborder(scene, ar, v3d);
- if(rv3d->rflag & RV3D_FLYMODE) drawviewborder_flymode(ar);
+ if(rv3d->persp==RV3D_CAMOB)
+ drawviewborder(scene, ar, v3d);
if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
@@ -2469,8 +2502,14 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
draw_viewport_name(ar, v3d);
}
if (grid_unit) { /* draw below the viewport name */
+ char tstr[32]= "";
+
UI_ThemeColor(TH_TEXT_HI);
- BLF_draw_default(22, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, grid_unit);
+ if(v3d->grid != 1.0f) {
+ BLI_snprintf(tstr, sizeof(tstr), "%s x %.4g", grid_unit, v3d->grid);
+ }
+
+ BLF_draw_default(22, ar->winy-(USER_SHOW_VIEWPORTNAME?40:20), 0.0f, tstr[0]?tstr : grid_unit, sizeof(tstr)); /* XXX, use real length */
}
ob= OBACT;
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 6d09da2dbcf..86957ecb86c 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,12 +34,14 @@
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_camera_types.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_image.h"
@@ -52,6 +54,7 @@
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -60,10 +63,10 @@
#include "RNA_define.h"
#include "ED_particle.h"
-#include "ED_retopo.h"
#include "ED_screen.h"
#include "ED_transform.h"
#include "ED_mesh.h"
+#include "ED_view3d.h"
#include "PIL_time.h" /* smoothview */
@@ -158,6 +161,7 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
+ short clip= 0;
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
@@ -185,11 +189,16 @@ static void view3d_boxview_sync(ScrArea *sa, ARegion *ar)
rv3dtest->ofs[2]= rv3d->ofs[2];
}
+ clip |= rv3dtest->viewlock & RV3D_BOXCLIP;
+
ED_region_tag_redraw(artest);
}
}
}
- view3d_boxview_clip(sa);
+
+ if(clip) {
+ view3d_boxview_clip(sa);
+ }
}
/* for home, center etc */
@@ -197,6 +206,7 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
{
ARegion *artest;
RegionView3D *rv3d= ar->regiondata;
+ short clip= 0;
for(artest= sa->regionbase.first; artest; artest= artest->next) {
if(artest!=ar && artest->regiontype==RGN_TYPE_WINDOW) {
@@ -206,17 +216,23 @@ void view3d_boxview_copy(ScrArea *sa, ARegion *ar)
rv3dtest->dist= rv3d->dist;
copy_v3_v3(rv3dtest->ofs, rv3d->ofs);
ED_region_tag_redraw(artest);
+
+ clip |= rv3dtest->viewlock & RV3D_BOXCLIP;
}
}
}
- view3d_boxview_clip(sa);
+
+ if(clip) {
+ view3d_boxview_clip(sa);
+ }
}
-void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar)
+/* 'clip' is used to know if our clip setting has changed */
+void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar, short do_clip)
{
+ ARegion *arsync= NULL;
RegionView3D *rv3d= ar->regiondata;
short viewlock;
-
/* this function copies flags from the first of the 3 other quadview
regions to the 2 other, so it assumes this is the region whose
properties are always being edited, weak */
@@ -224,18 +240,30 @@ void ED_view3d_quadview_update(ScrArea *sa, ARegion *ar)
if((viewlock & RV3D_LOCKED)==0)
viewlock= 0;
- else if((viewlock & RV3D_BOXVIEW)==0)
+ else if((viewlock & RV3D_BOXVIEW)==0) {
viewlock &= ~RV3D_BOXCLIP;
+ do_clip= TRUE;
+ }
for(; ar; ar= ar->prev) {
if(ar->alignment==RGN_ALIGN_QSPLIT) {
rv3d= ar->regiondata;
rv3d->viewlock= viewlock;
+
+ if(do_clip && (viewlock & RV3D_BOXCLIP)==0) {
+ rv3d->rflag &= ~RV3D_BOXCLIP;
+ }
+
+ /* use arsync so we sync with one of the aligned views below
+ * else the view jumps on changing view settings like 'clip'
+ * since it copies from the perspective view */
+ arsync= ar;
}
}
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(sa, sa->regionbase.last);
+ if(rv3d->viewlock & RV3D_BOXVIEW) {
+ view3d_boxview_copy(sa, arsync ? arsync : sa->regionbase.last);
+ }
ED_area_tag_redraw(sa);
}
@@ -298,7 +326,7 @@ static void calctrackballvec(rcti *rect, int mx, int my, float *vec)
static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
{
static float lastofs[3] = {0,0,0};
- View3D *v3d = CTX_wm_view3d(C);
+ View3D *v3d;
RegionView3D *rv3d;
ViewOpsData *vod= MEM_callocN(sizeof(ViewOpsData), "viewops data");
@@ -306,6 +334,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= vod;
vod->sa= CTX_wm_area(C);
vod->ar= CTX_wm_region(C);
+ v3d= vod->sa->spacedata.first;
vod->rv3d= rv3d= vod->ar->regiondata;
vod->dist0= rv3d->dist;
copy_qt_qt(vod->oldquat, rv3d->viewquat);
@@ -378,19 +407,26 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
static void viewops_data_free(bContext *C, wmOperator *op)
{
+ ARegion *ar;
Paint *p = paint_get_active(CTX_data_scene(C));
- ViewOpsData *vod= op->customdata;
- vod->rv3d->rflag &= ~RV3D_NAVIGATING;
+ if(op->customdata) {
+ ViewOpsData *vod= op->customdata;
+ ar= vod->ar;
+ vod->rv3d->rflag &= ~RV3D_NAVIGATING;
- if(p && (p->flags & PAINT_FAST_NAVIGATE))
- ED_region_tag_redraw(vod->ar);
+ if(vod->timer)
+ WM_event_remove_timer(CTX_wm_manager(C), vod->timer->win, vod->timer);
- if(vod->timer)
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), vod->timer);
+ MEM_freeN(vod);
+ op->customdata= NULL;
+ }
+ else {
+ ar= CTX_wm_region(C);
+ }
- MEM_freeN(vod);
- op->customdata= NULL;
+ if(p && (p->flags & PAINT_FAST_NAVIGATE))
+ ED_region_tag_redraw(ar);
}
/* ************************** viewrotate **********************************/
@@ -664,6 +700,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
vod->oldx= x;
vod->oldy= y;
+ /* avoid precision loss over time */
+ normalize_qt(rv3d->viewquat);
+
ED_region_tag_redraw(vod->ar);
}
@@ -707,7 +746,7 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
viewrotate_apply(vod, event->x, event->y);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -718,36 +757,44 @@ static int viewrotate_modal(bContext *C, wmOperator *op, wmEvent *event)
static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
ViewOpsData *vod;
-
- if(rv3d->viewlock)
- return OPERATOR_CANCELLED;
+ RegionView3D *rv3d;
/* makes op->customdata */
viewops_data_create(C, op, event);
vod= op->customdata;
+ rv3d= vod->rv3d;
+
+ if(rv3d->viewlock) { /* poll should check but in some cases fails, see poll func for details */
+ viewops_data_free(C, op);
+ return OPERATOR_PASS_THROUGH;
+ }
/* switch from camera view when: */
- if(vod->rv3d->persp != RV3D_PERSP) {
+ if(rv3d->persp != RV3D_PERSP) {
- if (U.uiflag & USER_AUTOPERSP)
- vod->rv3d->persp= RV3D_PERSP;
- else if(vod->rv3d->persp==RV3D_CAMOB) {
+ if (U.uiflag & USER_AUTOPERSP) {
+ rv3d->persp= RV3D_PERSP;
+ }
+ else if(rv3d->persp==RV3D_CAMOB) {
/* changed since 2.4x, use the camera view */
- View3D *v3d = CTX_wm_view3d(C);
- if(v3d->camera)
+ View3D *v3d = vod->sa->spacedata.first;
+
+ if(v3d->camera) {
view3d_settings_from_ob(v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, NULL);
+ }
- vod->rv3d->persp= RV3D_PERSP;
+ if(rv3d->persp==RV3D_CAMOB) {
+ rv3d->persp= rv3d->lpersp;
+ }
}
ED_region_tag_redraw(vod->ar);
}
if (event->type == MOUSEPAN) {
viewrotate_apply(vod, event->prevx, event->prevy);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(rv3d);
viewops_data_free(C, op);
@@ -756,7 +803,7 @@ static int viewrotate_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if (event->type == MOUSEROTATE) {
/* MOUSEROTATE performs orbital rotation, so y axis delta is set to 0 */
viewrotate_apply(vod, event->prevx, event->y);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(rv3d);
viewops_data_free(C, op);
@@ -782,21 +829,6 @@ static int view3d_camera_active_poll(bContext *C)
return 0;
}
-static int view3d_rotate_poll(bContext *C)
-{
- if (!ED_operator_view3d_active(C)) {
- return 0;
- } else {
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- /* rv3d is null in menus, but it's ok when the menu is clicked on */
- /* XXX of course, this doesn't work with quadview
- * Maybe having exec return PASSTHROUGH would be better than polling here
- * Poll functions are full of problems anyway.
- * */
- return rv3d == NULL || rv3d->viewlock == 0;
- }
-}
-
void VIEW3D_OT_rotate(wmOperatorType *ot)
{
@@ -808,7 +840,7 @@ void VIEW3D_OT_rotate(wmOperatorType *ot)
/* api callbacks */
ot->invoke= viewrotate_invoke;
ot->modal= viewrotate_modal;
- ot->poll= view3d_rotate_poll;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -855,10 +887,11 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
static void viewmove_apply(ViewOpsData *vod, int x, int y)
{
if(vod->rv3d->persp==RV3D_CAMOB) {
- float max= (float)MAX2(vod->ar->winx, vod->ar->winy);
+ float zoomfac= (M_SQRT2 + vod->rv3d->camzoom/50.0);
+ zoomfac= (zoomfac*zoomfac)*0.5;
- vod->rv3d->camdx += (vod->oldx - x)/(max);
- vod->rv3d->camdy += (vod->oldy - y)/(max);
+ vod->rv3d->camdx += (vod->oldx - x)/(vod->ar->winx * zoomfac);
+ vod->rv3d->camdy += (vod->oldy - y)/(vod->ar->winy * zoomfac);
CLAMP(vod->rv3d->camdx, -1.0f, 1.0f);
CLAMP(vod->rv3d->camdy, -1.0f, 1.0f);
// XXX preview3d_event= 0;
@@ -913,7 +946,7 @@ static int viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
viewmove_apply(vod, event->x, event->y);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
@@ -931,7 +964,7 @@ static int viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
if (event->type == MOUSEPAN) {
ViewOpsData *vod= op->customdata;
viewmove_apply(vod, event->prevx, event->prevy);
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
@@ -1145,7 +1178,7 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
viewzoom_apply(vod, event->x, event->y, U.viewzoom);
}
else if (event_code==VIEW_CONFIRM) {
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1156,38 +1189,57 @@ static int viewzoom_modal(bContext *C, wmOperator *op, wmEvent *event)
static int viewzoom_exec(bContext *C, wmOperator *op)
{
- View3D *v3d = CTX_wm_view3d(C);
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ View3D *v3d;
+ RegionView3D *rv3d;
+ ScrArea *sa;
+ ARegion *ar;
+
int delta= RNA_int_get(op->ptr, "delta");
- int mx = RNA_int_get(op->ptr, "mx");
- int my = RNA_int_get(op->ptr, "my");
+ int mx, my;
+
+ if(op->customdata) {
+ ViewOpsData *vod= op->customdata;
+
+ sa= vod->sa;
+ ar= vod->ar;
+ }
+ else {
+ sa= CTX_wm_area(C);
+ ar= CTX_wm_region(C);
+ }
+
+ v3d= sa->spacedata.first;
+ rv3d= ar->regiondata;
+
+ mx= RNA_property_is_set(op->ptr, "mx") ? RNA_int_get(op->ptr, "mx") : ar->winx / 2;
+ my= RNA_property_is_set(op->ptr, "my") ? RNA_int_get(op->ptr, "my") : ar->winy / 2;
if(delta < 0) {
/* this min and max is also in viewmove() */
if(rv3d->persp==RV3D_CAMOB) {
rv3d->camzoom-= 10;
- if(rv3d->camzoom<-30) rv3d->camzoom= -30;
+ if(rv3d->camzoom < RV3D_CAMZOOM_MIN) rv3d->camzoom= RV3D_CAMZOOM_MIN;
}
else if(rv3d->dist<10.0*v3d->far) {
- view_zoom_mouseloc(CTX_wm_region(C), 1.2f, mx, my);
+ view_zoom_mouseloc(ar, 1.2f, mx, my);
}
}
else {
if(rv3d->persp==RV3D_CAMOB) {
rv3d->camzoom+= 10;
- if(rv3d->camzoom>600) rv3d->camzoom= 600;
+ if(rv3d->camzoom > RV3D_CAMZOOM_MAX) rv3d->camzoom= RV3D_CAMZOOM_MAX;
}
else if(rv3d->dist> 0.001*v3d->grid) {
- view_zoom_mouseloc(CTX_wm_region(C), .83333f, mx, my);
+ view_zoom_mouseloc(ar, .83333f, mx, my);
}
}
if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_sync(CTX_wm_area(C), CTX_wm_region(C));
+ view3d_boxview_sync(sa, ar);
+
+ request_depth_update(rv3d);
+ ED_region_tag_redraw(ar);
- request_depth_update(CTX_wm_region_view3d(C));
- ED_region_tag_redraw(CTX_wm_region(C));
-
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1195,8 +1247,6 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
- int delta= RNA_int_get(op->ptr, "delta");
-
/* if one or the other zoom position aren't set, set from event */
if (!RNA_property_is_set(op->ptr, "mx") || !RNA_property_is_set(op->ptr, "my"))
{
@@ -1204,7 +1254,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "my", event->y);
}
- if(delta) {
+ if(RNA_property_is_set(op->ptr, "delta")) {
/* makes op->customdata */
viewops_data_create(C, op, event);
viewzoom_exec(C, op);
@@ -1231,7 +1281,7 @@ static int viewzoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
vod->origy = vod->oldy = vod->origy + event->x - event->prevx;
viewzoom_apply(vod, event->prevx, event->prevy, USER_ZOOM_DOLLY);
}
- request_depth_update(CTX_wm_region_view3d(C));
+ request_depth_update(vod->rv3d);
viewops_data_free(C, op);
return OPERATOR_FINISHED;
@@ -1264,7 +1314,7 @@ void VIEW3D_OT_zoom(wmOperatorType *ot)
ot->invoke= viewzoom_invoke;
ot->exec= viewzoom_exec;
ot->modal= viewzoom_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -1274,7 +1324,7 @@ void VIEW3D_OT_zoom(wmOperatorType *ot)
RNA_def_int(ot->srna, "my", 0, 0, INT_MAX, "Zoom Position Y", "", 0, INT_MAX);
}
-static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
+static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
{
ARegion *ar= CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1289,19 +1339,18 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
int ok= 1, onedone=0;
if(center) {
- min[0]= min[1]= min[2]= 0.0f;
- max[0]= max[1]= max[2]= 0.0f;
-
/* in 2.4x this also move the cursor to (0, 0, 0) (with shift+c). */
curs= give_cursor(scene, v3d);
- curs[0]= curs[1]= curs[2]= 0.0;
+ zero_v3(min);
+ zero_v3(max);
+ zero_v3(curs);
}
else {
INIT_MINMAX(min, max);
}
for(base= scene->base.first; base; base= base->next) {
- if(base->lay & v3d->lay) {
+ if(BASE_VISIBLE(v3d, base)) {
onedone= 1;
minmax_object(base->object, min, max);
}
@@ -1318,9 +1367,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
return OPERATOR_FINISHED;
}
- afm[0]= (max[0]-min[0]);
- afm[1]= (max[1]-min[1]);
- afm[2]= (max[2]-min[2]);
+ sub_v3_v3v3(afm, max, min);
size= 0.7f*MAX3(afm[0], afm[1], afm[2]);
if(size==0.0) ok= 0;
@@ -1342,7 +1389,7 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
if (rv3d->persp==RV3D_CAMOB) {
rv3d->persp= RV3D_PERSP;
- smooth_view(C, NULL, v3d->camera, new_ofs, NULL, &new_dist, NULL);
+ smooth_view(C, v3d->camera, NULL, new_ofs, NULL, &new_dist, NULL);
}
else {
smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
@@ -1350,25 +1397,11 @@ static int viewhome_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.
}
// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT);
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), ar);
-
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
return OPERATOR_FINISHED;
}
-static int viewhome_poll(bContext *C)
-{
- if(ED_operator_view3d_active(C)) {
- RegionView3D *rv3d= CTX_wm_region_view3d(C); //XXX, when accessed from a header menu this doesnt work!
- if(rv3d && rv3d->persp!=RV3D_CAMOB) {
- return 1;
- }
- }
-
- return 0;
-}
void VIEW3D_OT_view_all(wmOperatorType *ot)
{
@@ -1378,8 +1411,8 @@ void VIEW3D_OT_view_all(wmOperatorType *ot)
ot->idname= "VIEW3D_OT_view_all";
/* api callbacks */
- ot->exec= viewhome_exec;
- ot->poll= viewhome_poll;
+ ot->exec= view3d_all_exec;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -1388,7 +1421,7 @@ void VIEW3D_OT_view_all(wmOperatorType *ot)
}
-static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview without local!, was centerview() in 2.4x */
+static int viewselected_exec(bContext *C, wmOperator *UNUSED(op)) /* like a localview without local!, was centerview() in 2.4x */
{
ARegion *ar= CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
@@ -1445,7 +1478,7 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi
}
}
else if (paint_facesel_test(ob)) {
- ok= minmax_tface(scene, min, max);
+ ok= paintface_minmax(ob, min, max);
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)) {
ok= PE_minmax(scene, min, max);
@@ -1505,9 +1538,9 @@ static int viewselected_exec(bContext *C, wmOperator *op) /* like a localview wi
smooth_view(C, NULL, NULL, new_ofs, NULL, ok_dist ? &new_dist : NULL, NULL);
}
+ /* smooth view does viewlock RV3D_BOXVIEW copy */
+
// XXX BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT);
- if(rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), ar);
return OPERATOR_FINISHED;
}
@@ -1522,13 +1555,13 @@ void VIEW3D_OT_view_selected(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewselected_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
}
-static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
+static int viewcenter_cursor_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -1540,8 +1573,7 @@ static int viewcenter_cursor_exec(bContext *C, wmOperator *op)
negate_v3_v3(new_ofs, give_cursor(scene, v3d));
smooth_view(C, NULL, NULL, new_ofs, NULL, NULL, NULL);
- if (rv3d->viewlock & RV3D_BOXVIEW)
- view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C));
+ /* smooth view does viewlock RV3D_BOXVIEW copy */
}
return OPERATOR_FINISHED;
@@ -1562,7 +1594,7 @@ void VIEW3D_OT_view_center_cursor(wmOperatorType *ot)
ot->flag= 0;
}
-static int view3d_center_camera_exec(bContext *C, wmOperator *op) /* was view3d_home() in 2.4x */
+static int view3d_center_camera_exec(bContext *C, wmOperator *UNUSED(op)) /* was view3d_home() in 2.4x */
{
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -1607,7 +1639,7 @@ static int render_border_exec(bContext *C, wmOperator *op)
rect.ymax= RNA_int_get(op->ptr, "ymax");
/* calculate range */
- view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb);
+ view3d_calc_camera_border(scene, ar, rv3d, v3d, &vb, FALSE);
scene->r.border.xmin= ((float)rect.xmin-vb.xmin)/(vb.xmax-vb.xmin);
scene->r.border.ymin= ((float)rect.ymin-vb.ymin)/(vb.ymax-vb.ymin);
@@ -1681,10 +1713,8 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
/* ZBuffer depth vars */
bglMats mats;
- float depth, depth_close= FLT_MAX;
- int had_depth = 0;
+ float depth_close= FLT_MAX;
double cent[2], p[3];
- int xs, ys;
/* note; otherwise opengl won't work */
view3d_operator_needs_opengl(C);
@@ -1698,38 +1728,19 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
+
+ {
+ /* avoid allocating the whole depth buffer */
+ ViewDepths depth_temp= {0};
- /* force updating */
- if (rv3d->depths) {
- had_depth = 1;
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
-
- /* Constrain rect to depth bounds */
- if (rect.xmin < 0) rect.xmin = 0;
- if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
- if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
-
- /* Find the closest Z pixel */
- for (xs=rect.xmin; xs < rect.xmax; xs++) {
- for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
- if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
- if (depth_close > depth) {
- depth_close = depth;
- }
- }
- }
- }
-
- if (had_depth==0) {
- MEM_freeN(rv3d->depths->depths);
- rv3d->depths->depths = NULL;
+ /* avoid view3d_update_depths() for speed. */
+ view3d_update_depths_rect(ar, &depth_temp, &rect);
+
+ /* find the closest Z pixel */
+ depth_close= view3d_depth_near(&depth_temp);
+
+ MEM_freeN(depth_temp.depths);
}
- rv3d->depths->damaged = 1;
cent[0] = (((double)rect.xmin)+((double)rect.xmax)) / 2;
cent[1] = (((double)rect.ymin)+((double)rect.ymax)) / 2;
@@ -1811,7 +1822,6 @@ static int view3d_zoom_border_invoke(bContext *C, wmOperator *op, wmEvent *event
void VIEW3D_OT_zoom_border(wmOperatorType *ot)
{
-
/* identifiers */
ot->name= "Border Zoom";
ot->description = "Zoom in the view to the nearest object contained in the border";
@@ -1822,7 +1832,7 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
ot->exec= view3d_zoom_border_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -1834,6 +1844,47 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX);
}
+
+/* sets the view to 1:1 camera/render-pixel */
+static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
+{
+ RegionView3D *rv3d= ar->regiondata;
+ float size[2];
+ int im_width= (scene->r.size*scene->r.xsch)/100;
+
+ view3d_viewborder_size_get(scene, ar, size);
+
+ rv3d->camzoom= (sqrt(4.0*im_width/size[0]) - M_SQRT2)*50.0;
+ rv3d->camzoom= CLAMPIS(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX);
+}
+
+static int view3d_zoom_1_to_1_camera_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene= CTX_data_scene(C);
+ ARegion *ar= CTX_wm_region(C);
+
+ view3d_set_1_to_1_viewborder(scene, ar);
+
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
+
+ return OPERATOR_FINISHED;
+}
+
+void VIEW3D_OT_zoom_camera_1_to_1(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Zoom Camera 1:1";
+ ot->description = "Match the camera to 1:1 to the render output";
+ ot->idname= "VIEW3D_OT_zoom_camera_1_to_1";
+
+ /* api callbacks */
+ ot->exec= view3d_zoom_1_to_1_camera_exec;
+ ot->poll= view3d_camera_active_poll;
+
+ /* flags */
+ ot->flag= 0;
+}
+
/* ********************* Changing view operator ****************** */
static EnumPropertyItem prop_view_items[] = {
@@ -1870,7 +1921,7 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s
float twmat[3][3];
/* same as transform manipulator when normal is set */
- ED_getTransformOrientationMatrix(C, twmat, TRUE);
+ ED_getTransformOrientationMatrix(C, twmat, FALSE);
mat3_to_quat( obact_quat,twmat);
invert_qt(obact_quat);
@@ -1903,14 +1954,14 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s
if (rv3d->persp==RV3D_CAMOB && v3d->camera) {
- if (U.uiflag & USER_AUTOPERSP) rv3d->persp= RV3D_ORTHO;
+ if (U.uiflag & USER_AUTOPERSP) rv3d->persp= view ? RV3D_ORTHO : RV3D_PERSP;
else if(rv3d->persp==RV3D_CAMOB) rv3d->persp= perspo;
smooth_view(C, v3d->camera, NULL, rv3d->ofs, new_quat, NULL, NULL);
}
else {
- if (U.uiflag & USER_AUTOPERSP) rv3d->persp= RV3D_ORTHO;
+ if (U.uiflag & USER_AUTOPERSP) rv3d->persp= view ? RV3D_ORTHO : RV3D_PERSP;
else if(rv3d->persp==RV3D_CAMOB) rv3d->persp= perspo;
smooth_view(C, NULL, NULL, NULL, new_quat, NULL, NULL);
@@ -1929,6 +1980,9 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
viewnum = RNA_enum_get(op->ptr, "type");
align_active = RNA_boolean_get(op->ptr, "align_active");
+ /* set this to zero, gets handled in axis_set_view */
+ if(rv3d->viewlock)
+ align_active= 0;
/* Use this to test if we started out with a camera */
@@ -2035,6 +2089,8 @@ static int viewnumpad_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+
+
void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
{
/* identifiers */
@@ -2044,7 +2100,7 @@ void VIEW3D_OT_viewnumpad(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewnumpad_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2112,7 +2168,7 @@ void VIEW3D_OT_view_orbit(wmOperatorType *ot)
/* api callbacks */
ot->exec= vieworbit_exec;
- ot->poll= view3d_rotate_poll;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2136,14 +2192,11 @@ static int viewpan_exec(bContext *C, wmOperator *op)
pandir = RNA_enum_get(op->ptr, "type");
initgrabz(rv3d, 0.0, 0.0, 0.0);
-
if(pandir == V3D_VIEW_PANRIGHT) window_to_3d_delta(ar, vec, -32, 0);
else if(pandir == V3D_VIEW_PANLEFT) window_to_3d_delta(ar, vec, 32, 0);
else if(pandir == V3D_VIEW_PANUP) window_to_3d_delta(ar, vec, 0, -25);
else if(pandir == V3D_VIEW_PANDOWN) window_to_3d_delta(ar, vec, 0, 25);
- rv3d->ofs[0]+= vec[0];
- rv3d->ofs[1]+= vec[1];
- rv3d->ofs[2]+= vec[2];
+ add_v3_v3(rv3d->ofs, vec);
if(rv3d->viewlock & RV3D_BOXVIEW)
view3d_boxview_sync(CTX_wm_area(C), ar);
@@ -2162,14 +2215,14 @@ void VIEW3D_OT_view_pan(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewpan_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
RNA_def_enum(ot->srna, "type", prop_view_pan_items, 0, "Pan", "Direction of View Pan");
}
-static int viewpersportho_exec(bContext *C, wmOperator *op)
+static int viewpersportho_exec(bContext *C, wmOperator *UNUSED(op))
{
ARegion *ar= CTX_wm_region(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -2194,7 +2247,7 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot)
/* api callbacks */
ot->exec= viewpersportho_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2202,32 +2255,31 @@ void VIEW3D_OT_view_persportho(wmOperatorType *ot)
/* ******************** add background image operator **************** */
-static BGpic *add_background_image(bContext *C)
+static BGpic *background_image_add(bContext *C)
{
View3D *v3d= CTX_wm_view3d(C);
-
+
BGpic *bgpic= MEM_callocN(sizeof(BGpic), "Background Image");
bgpic->size= 5.0;
bgpic->blend= 0.5;
bgpic->iuser.fie_ima= 2;
bgpic->iuser.ok= 1;
bgpic->view= 0; /* 0 for all */
-
+
BLI_addtail(&v3d->bgpicbase, bgpic);
-
+
return bgpic;
}
-static int add_background_image_exec(bContext *C, wmOperator *op)
+static int background_image_add_exec(bContext *C, wmOperator *UNUSED(op))
{
- add_background_image(C);
+ background_image_add(C);
return OPERATOR_FINISHED;
}
-static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int background_image_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- Scene *scene= CTX_data_scene(C);
View3D *v3d= CTX_wm_view3d(C);
Image *ima= NULL;
BGpic *bgpic;
@@ -2238,14 +2290,14 @@ static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *eve
char path[FILE_MAX];
RNA_string_get(op->ptr, "filepath", path);
- ima= BKE_add_image_file(path, scene ? scene->r.cfra : 1);
-}
+ ima= BKE_add_image_file(path);
+ }
else if(RNA_property_is_set(op->ptr, "name")) {
RNA_string_get(op->ptr, "name", name);
ima= (Image *)find_id("IM", name);
}
-
- bgpic = add_background_image(C);
+
+ bgpic = background_image_add(C);
if (ima) {
bgpic->ima = ima;
@@ -2262,16 +2314,16 @@ static int add_background_image_invoke(bContext *C, wmOperator *op, wmEvent *eve
return OPERATOR_FINISHED;
}
-void VIEW3D_OT_add_background_image(wmOperatorType *ot)
+void VIEW3D_OT_background_image_add(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Add Background Image";
ot->description= "Add a new background image";
- ot->idname = "VIEW3D_OT_add_background_image";
+ ot->idname = "VIEW3D_OT_background_image_add";
/* api callbacks */
- ot->invoke = add_background_image_invoke;
- ot->exec = add_background_image_exec;
+ ot->invoke = background_image_add_invoke;
+ ot->exec = background_image_add_exec;
ot->poll = ED_operator_view3d_active;
/* flags */
@@ -2284,33 +2336,34 @@ void VIEW3D_OT_add_background_image(wmOperatorType *ot)
/* ***** remove image operator ******* */
-static int remove_background_image_exec(bContext *C, wmOperator *op)
+static int background_image_remove_exec(bContext *C, wmOperator *op)
{
- BGpic *bgpic_rem = CTX_data_pointer_get_type(C, "bgpic", &RNA_BackgroundImage).data;
View3D *vd = CTX_wm_view3d(C);
int index = RNA_int_get(op->ptr, "index");
+ BGpic *bgpic_rem= BLI_findlink(&vd->bgpicbase, index);
- bgpic_rem = BLI_findlink(&vd->bgpicbase, index);
if(bgpic_rem) {
BLI_remlink(&vd->bgpicbase, bgpic_rem);
if(bgpic_rem->ima) bgpic_rem->ima->id.us--;
MEM_freeN(bgpic_rem);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, vd);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
}
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, vd);
-
- return OPERATOR_FINISHED;
}
-void VIEW3D_OT_remove_background_image(wmOperatorType *ot)
+void VIEW3D_OT_background_image_remove(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Remove Background Image";
ot->description= "Remove a background image from the 3D view";
- ot->idname = "VIEW3D_OT_remove_background_image";
+ ot->idname = "VIEW3D_OT_background_image_remove";
/* api callbacks */
- ot->exec = remove_background_image_exec;
+ ot->exec = background_image_remove_exec;
ot->poll = ED_operator_view3d_active;
/* flags */
@@ -2413,7 +2466,7 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
ot->exec= view3d_clipping_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= 0;
@@ -2428,7 +2481,7 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
/* ***************** 3d cursor cursor op ******************* */
/* mx my in region coords */
-static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int set_3dcursor_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
@@ -2462,7 +2515,9 @@ static int set_3dcursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
short depth_used = 0;
if (U.uiflag & USER_ORBIT_ZBUF) { /* maybe this should be accessed some other way */
- short mval_depth[2] = {mx, my};
+ short mval_depth[2];
+ mval_depth[0]= mx;
+ mval_depth[1]= my;
view3d_operator_needs_opengl(C);
if (view_autodist(scene, ar, v3d, mval_depth, fp))
depth_used= 1;
@@ -2553,7 +2608,7 @@ void VIEW3D_OT_manipulator(wmOperatorType *ot)
Transform_Properties(ot, P_CONSTRAINT);
}
-static int enable_manipulator_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int enable_manipulator_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
View3D *v3d = CTX_wm_view3d(C);
@@ -2591,90 +2646,49 @@ void VIEW3D_OT_enable_manipulator(wmOperatorType *ot)
/* ************************* below the line! *********************** */
-static float view_autodist_depth_margin(ARegion *ar, short *mval, int margin)
+static float view_autodist_depth_margin(ARegion *ar, short mval[2], int margin)
{
- RegionView3D *rv3d= ar->regiondata;
- float depth= FLT_MAX;
+ ViewDepths depth_temp= {0};
+ rcti rect;
+ float depth_close;
if(margin==0) {
- if (mval[0] < 0) return 0;
- if (mval[1] < 0) return 0;
- if (mval[0] >= rv3d->depths->w) return 0;
- if (mval[1] >= rv3d->depths->h) return 0;
-
/* Get Z Depths, needed for perspective, nice for ortho */
- depth= rv3d->depths->depths[mval[1]*rv3d->depths->w+mval[0]];
- if(depth >= rv3d->depths->depth_range[1] || depth <= rv3d->depths->depth_range[0]) {
- depth= FLT_MAX;
- }
+ rect.xmin= mval[0];
+ rect.ymin= mval[1];
+ rect.xmax= mval[0] + 1;
+ rect.ymax= mval[1] + 1;
}
else {
- rcti rect;
- float depth_close= FLT_MAX;
- int xs, ys;
-
rect.xmax = mval[0] + margin;
rect.ymax = mval[1] + margin;
rect.xmin = mval[0] - margin;
rect.ymin = mval[1] - margin;
-
- /* Constrain rect to depth bounds */
- if (rect.xmin < 0) rect.xmin = 0;
- if (rect.ymin < 0) rect.ymin = 0;
- if (rect.xmax >= rv3d->depths->w) rect.xmax = rv3d->depths->w-1;
- if (rect.ymax >= rv3d->depths->h) rect.ymax = rv3d->depths->h-1;
-
- /* Find the closest Z pixel */
- for (xs=rect.xmin; xs < rect.xmax; xs++) {
- for (ys=rect.ymin; ys < rect.ymax; ys++) {
- depth= rv3d->depths->depths[ys*rv3d->depths->w+xs];
- if(depth < rv3d->depths->depth_range[1] && depth > rv3d->depths->depth_range[0]) {
- if (depth_close > depth) {
- depth_close = depth;
- }
- }
- }
- }
-
- depth= depth_close;
}
- return depth;
+ view3d_update_depths_rect(ar, &depth_temp, &rect);
+ depth_close= view3d_depth_near(&depth_temp);
+ if(depth_temp.depths) MEM_freeN(depth_temp.depths);
+ return depth_close;
}
/* XXX todo Zooms in on a border drawn by the user */
int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mouse_worldloc[3] ) //, float *autodist )
{
- RegionView3D *rv3d= ar->regiondata;
bglMats mats; /* ZBuffer depth vars */
float depth_close= FLT_MAX;
- int had_depth = 0;
double cent[2], p[3];
/* Get Z Depths, needed for perspective, nice for ortho */
bgl_get_mats(&mats);
draw_depth(scene, ar, v3d, NULL);
- /* force updating */
- if (rv3d->depths) {
- had_depth = 1;
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
-
depth_close= view_autodist_depth_margin(ar, mval, 4);
if (depth_close==FLT_MAX)
return 0;
- if (had_depth==0) {
- MEM_freeN(rv3d->depths->depths);
- rv3d->depths->depths = NULL;
- }
- rv3d->depths->damaged = 1;
-
cent[0] = (double)mval[0];
cent[1] = (double)mval[1];
@@ -2689,8 +2703,6 @@ int view_autodist(Scene *scene, ARegion *ar, View3D *v3d, short *mval, float mou
int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, float *autodist )
{
- RegionView3D *rv3d= ar->regiondata;
-
/* Get Z Depths, needed for perspective, nice for ortho */
switch(mode) {
case 0:
@@ -2701,12 +2713,6 @@ int view_autodist_init(Scene *scene, ARegion *ar, View3D *v3d, int mode) //, flo
break;
}
- /* force updating */
- if (rv3d->depths) {
- rv3d->depths->damaged = 1;
- }
-
- view3d_update_depths(ar, v3d);
return 1;
}
@@ -2739,12 +2745,51 @@ int view_autodist_simple(ARegion *ar, short *mval, float mouse_worldloc[3], int
return 1;
}
-int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *depth)
+int view_autodist_depth(struct ARegion *ar, short mval[2], int margin, float *depth)
{
*depth= view_autodist_depth_margin(ar, mval, margin);
return (*depth==FLT_MAX) ? 0:1;
+}
+
+static int depth_segment_cb(int x, int y, void *userData)
+{
+ struct { struct ARegion *ar; int margin; float depth; } *data = userData;
+ short mval[2];
+ float depth;
+
+ mval[0]= (short)x;
+ mval[1]= (short)y;
+
+ depth= view_autodist_depth_margin(data->ar, mval, data->margin);
+
+ if(depth != FLT_MAX) {
+ data->depth= depth;
return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
+int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth)
+{
+ struct { struct ARegion *ar; int margin; float depth; } data = {0};
+ int p1[2];
+ int p2[2];
+
+ data.ar= ar;
+ data.margin= margin;
+ data.depth= FLT_MAX;
+
+ VECCOPY2D(p1, mval_sta);
+ VECCOPY2D(p2, mval_end);
+
+ plot_line_v2v2i(p1, p2, depth_segment_cb, &data);
+
+ *depth= data.depth;
+
+ return (*depth==FLT_MAX) ? 0:1;
}
/* ********************* NDOF ************************ */
@@ -2773,8 +2818,8 @@ int view_autodist_depth(struct ARegion *ar, short *mval, int margin, float *dept
// speed and os, i changed the scaling values, but
// those are still not ok
-
-float ndof_axis_scale[6] = {
+#if 0
+static float ndof_axis_scale[6] = {
+0.01, // Tx
+0.01, // Tz
+0.01, // Ty
@@ -2783,7 +2828,7 @@ float ndof_axis_scale[6] = {
+0.0015 // Ry
};
-void filterNDOFvalues(float *sbval)
+static void filterNDOFvalues(float *sbval)
{
int i=0;
float max = 0.0;
@@ -2803,7 +2848,7 @@ void filterNDOFvalues(float *sbval)
int dz_flag = 0;
float m_dist;
-void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
+void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int UNUSED(mode))
{
RegionView3D *rv3d= ar->regiondata;
int i;
@@ -2932,7 +2977,7 @@ void viewmoveNDOFfly(ARegion *ar, View3D *v3d, int mode)
// XXX BIF_view3d_previewrender_signal(ar, PR_DBASE|PR_DISPRECT);
}
-void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
+void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int UNUSED(mode))
{
RegionView3D *rv3d= ar->regiondata;
float fval[7];
@@ -3136,7 +3181,23 @@ void viewmoveNDOF(Scene *scene, ARegion *ar, View3D *v3d, int mode)
*/
// XXX scrarea_do_windraw(curarea);
}
-
-
-
-
+#endif // if 0, unused NDof code
+
+/* give a 4x4 matrix from a perspective view, only needs viewquat, ofs and dist
+ * basically the same as...
+ * rv3d->persp= RV3D_PERSP
+ * setviewmatrixview3d(scene, v3d, rv3d);
+ * setcameratoview3d(v3d, rv3d, v3d->camera);
+ * ...but less of a hassle
+ * */
+void view3d_persp_mat4(RegionView3D *rv3d, float mat[][4])
+{
+ float qt[4], dvec[3];
+ copy_qt_qt(qt, rv3d->viewquat);
+ qt[0]= -qt[0];
+ quat_to_mat4(mat, qt);
+ mat[3][2] -= rv3d->dist;
+ translate_m4(mat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
+ mul_v3_v3fl(dvec, mat[2], -rv3d->dist);
+ sub_v3_v3v3(mat[3], dvec, rv3d->ofs);
+}
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
new file mode 100644
index 00000000000..7a4fb86a4dd
--- /dev/null
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -0,0 +1,942 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* defines VIEW3D_OT_fly modal operator */
+
+#include "DNA_anim_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_context.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+
+#include "BKE_depsgraph.h" /* for fly mode updating */
+
+#include "BIF_gl.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_keyframing.h"
+#include "ED_screen.h"
+#include "ED_space_api.h"
+
+#include "PIL_time.h" /* smoothview */
+
+#include "view3d_intern.h" // own include
+
+/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
+#define FLY_MODAL_CANCEL 1
+#define FLY_MODAL_CONFIRM 2
+#define FLY_MODAL_ACCELERATE 3
+#define FLY_MODAL_DECELERATE 4
+#define FLY_MODAL_PAN_ENABLE 5
+#define FLY_MODAL_PAN_DISABLE 6
+#define FLY_MODAL_DIR_FORWARD 7
+#define FLY_MODAL_DIR_BACKWARD 8
+#define FLY_MODAL_DIR_LEFT 9
+#define FLY_MODAL_DIR_RIGHT 10
+#define FLY_MODAL_DIR_UP 11
+#define FLY_MODAL_DIR_DOWN 12
+#define FLY_MODAL_AXIS_LOCK_X 13
+#define FLY_MODAL_AXIS_LOCK_Z 14
+#define FLY_MODAL_PRECISION_ENABLE 15
+#define FLY_MODAL_PRECISION_DISABLE 16
+
+/* called in transform_ops.c, on each regeneration of keymaps */
+void fly_modal_keymap(wmKeyConfig *keyconf)
+{
+ static EnumPropertyItem modal_items[] = {
+ {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
+ {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
+ {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""},
+ {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""},
+
+ {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan Enable", ""},
+ {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan Disable", ""},
+
+ {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Fly Forward", ""},
+ {FLY_MODAL_DIR_BACKWARD,"BACKWARD", 0, "Fly Backward", ""},
+ {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Fly Left", ""},
+ {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Fly Right", ""},
+ {FLY_MODAL_DIR_UP, "UP", 0, "Fly Up", ""},
+ {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Fly Down", ""},
+
+ {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"},
+ {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"},
+
+ {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision Enable", ""},
+ {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision Disable", ""},
+
+ {0, NULL, 0, NULL, NULL}};
+
+ wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Fly Modal");
+
+ /* this function is called for each spacetype, only needs to add map once */
+ if(keymap) return;
+
+ keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
+
+ /* items for modal map */
+ WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CANCEL);
+
+ WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
+
+ WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
+ WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
+ WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
+ WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
+
+ WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_PAN_ENABLE);
+ WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PAN_DISABLE); /* XXX - Bug in the event system, middle mouse release doesnt work */
+
+ /* WASD */
+ WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
+ WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
+ WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
+ WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
+ WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
+ WM_modalkeymap_add_item(keymap, FKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
+
+ WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_X);
+ WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_Z);
+
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
+ WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
+
+ /* assign map to operators */
+ WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly");
+
+}
+
+typedef struct FlyInfo {
+ /* context stuff */
+ RegionView3D *rv3d;
+ View3D *v3d;
+ ARegion *ar;
+ Scene *scene;
+
+ wmTimer *timer; /* needed for redraws */
+
+ short state;
+ short use_precision;
+ short redraw;
+ short mval[2];
+
+ /* fly state state */
+ float speed; /* the speed the view is moving per redraw */
+ short axis; /* Axis index to move allong by default Z to move allong the view */
+ short pan_view; /* when true, pan the view instead of rotating */
+
+ /* relative view axis locking - xlock, zlock
+ 0; disabled
+ 1; enabled but not checking because mouse hasnt moved outside the margin since locking was checked an not needed
+ when the mouse moves, locking is set to 2 so checks are done.
+ 2; mouse moved and checking needed, if no view altering is donem its changed back to 1 */
+ short xlock, zlock;
+ float xlock_momentum, zlock_momentum; /* nicer dynamics */
+ float grid; /* world scale 1.0 default */
+
+ /* root most parent */
+ Object *root_parent;
+
+ /* backup values */
+ float dist_backup; /* backup the views distance since we use a zero dist for fly mode */
+ float ofs_backup[3]; /* backup the views offset incase the user cancels flying in non camera mode */
+ float rot_backup[4]; /* backup the views quat incase the user cancels flying in non camera mode. (quat for view, eul for camera) */
+ short persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */
+
+ void *obtfm; /* backup the objects transform */
+
+ /* compare between last state */
+ double time_lastwheel; /* used to accelerate when using the mousewheel a lot */
+ double time_lastdraw; /* time between draws */
+
+ void *draw_handle_pixel;
+
+ /* use for some lag */
+ float dvec_prev[3]; /* old for some lag */
+
+} FlyInfo;
+
+static void drawFlyPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *arg)
+{
+ FlyInfo *fly = arg;
+
+ /* draws 4 edge brackets that frame the safe area where the
+ mouse can move during fly mode without spinning the view */
+ float x1, x2, y1, y2;
+
+ x1= 0.45*(float)fly->ar->winx;
+ y1= 0.45*(float)fly->ar->winy;
+ x2= 0.55*(float)fly->ar->winx;
+ y2= 0.55*(float)fly->ar->winy;
+ cpack(0);
+
+
+ glBegin(GL_LINES);
+ /* bottom left */
+ glVertex2f(x1,y1);
+ glVertex2f(x1,y1+5);
+
+ glVertex2f(x1,y1);
+ glVertex2f(x1+5,y1);
+
+ /* top right */
+ glVertex2f(x2,y2);
+ glVertex2f(x2,y2-5);
+
+ glVertex2f(x2,y2);
+ glVertex2f(x2-5,y2);
+
+ /* top left */
+ glVertex2f(x1,y2);
+ glVertex2f(x1,y2-5);
+
+ glVertex2f(x1,y2);
+ glVertex2f(x1+5,y2);
+
+ /* bottom right */
+ glVertex2f(x2,y1);
+ glVertex2f(x2,y1+5);
+
+ glVertex2f(x2,y1);
+ glVertex2f(x2-5,y1);
+ glEnd();
+}
+
+/* FlyInfo->state */
+#define FLY_RUNNING 0
+#define FLY_CANCEL 1
+#define FLY_CONFIRM 2
+
+static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
+{
+ float upvec[3]; // tmp
+ float mat[3][3];
+
+ fly->rv3d= CTX_wm_region_view3d(C);
+ fly->v3d = CTX_wm_view3d(C);
+ fly->ar = CTX_wm_region(C);
+ fly->scene= CTX_data_scene(C);
+
+ if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->id.lib) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library");
+ return FALSE;
+ }
+
+ if(fly->v3d->ob_centre) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view is locked to an object");
+ return FALSE;
+ }
+
+ if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->constraints.first) {
+ BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints");
+ return FALSE;
+ }
+
+ fly->state= FLY_RUNNING;
+ fly->speed= 0.0f;
+ fly->axis= 2;
+ fly->pan_view= FALSE;
+ fly->xlock= FALSE;
+ fly->zlock= FALSE;
+ fly->xlock_momentum=0.0f;
+ fly->zlock_momentum=0.0f;
+ fly->grid= 1.0f;
+ fly->use_precision= 0;
+
+ fly->dvec_prev[0]= fly->dvec_prev[1]= fly->dvec_prev[2]= 0.0f;
+
+ fly->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
+
+ fly->mval[0] = event->x - fly->ar->winrct.xmin;
+ fly->mval[1] = event->y - fly->ar->winrct.ymin;
+
+
+ fly->time_lastdraw= fly->time_lastwheel= PIL_check_seconds_timer();
+
+ fly->draw_handle_pixel = ED_region_draw_cb_activate(fly->ar->type, drawFlyPixel, fly, REGION_DRAW_POST_PIXEL);
+
+ fly->rv3d->rflag |= RV3D_NAVIGATING; /* so we draw the corner margins */
+
+ /* detect weather to start with Z locking */
+ upvec[0]=1.0f; upvec[1]=0.0f; upvec[2]=0.0f;
+ copy_m3_m4(mat, fly->rv3d->viewinv);
+ mul_m3_v3(mat, upvec);
+ if (fabs(upvec[2]) < 0.1)
+ fly->zlock = 1;
+ upvec[0]=0; upvec[1]=0; upvec[2]=0;
+
+ fly->persp_backup= fly->rv3d->persp;
+ fly->dist_backup= fly->rv3d->dist;
+ if (fly->rv3d->persp==RV3D_CAMOB) {
+ Object *ob_back;
+ if((fly->root_parent=fly->v3d->camera->parent)) {
+ while(fly->root_parent->parent)
+ fly->root_parent= fly->root_parent->parent;
+ ob_back= fly->root_parent;
+ }
+ else {
+ ob_back= fly->v3d->camera;
+ }
+
+ /* store the original camera loc and rot */
+ /* TODO. axis angle etc */
+
+ fly->obtfm= object_tfm_backup(ob_back);
+
+ where_is_object(fly->scene, fly->v3d->camera);
+ negate_v3_v3(fly->rv3d->ofs, fly->v3d->camera->obmat[3]);
+
+ fly->rv3d->dist=0.0;
+ } else {
+ /* perspective or ortho */
+ if (fly->rv3d->persp==RV3D_ORTHO)
+ fly->rv3d->persp= RV3D_PERSP; /*if ortho projection, make perspective */
+ copy_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
+ copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs);
+ fly->rv3d->dist= 0.0f;
+
+ upvec[2]= fly->dist_backup; /*x and y are 0*/
+ mul_m3_v3(mat, upvec);
+ sub_v3_v3(fly->rv3d->ofs, upvec);
+ /*Done with correcting for the dist*/
+ }
+
+
+ /* center the mouse, probably the UI mafia are against this but without its quite annoying */
+ WM_cursor_warp(CTX_wm_window(C), fly->ar->winrct.xmin + fly->ar->winx/2, fly->ar->winrct.ymin + fly->ar->winy/2);
+
+ return 1;
+}
+
+static int flyEnd(bContext *C, FlyInfo *fly)
+{
+ RegionView3D *rv3d= fly->rv3d;
+ View3D *v3d = fly->v3d;
+
+ float upvec[3];
+
+ if(fly->state == FLY_RUNNING)
+ return OPERATOR_RUNNING_MODAL;
+
+ WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), fly->timer);
+
+ ED_region_draw_cb_exit(fly->ar->type, fly->draw_handle_pixel);
+
+ rv3d->dist= fly->dist_backup;
+
+ if (fly->state == FLY_CANCEL) {
+ /* Revert to original view? */
+ if (fly->persp_backup==RV3D_CAMOB) { /* a camera view */
+ Object *ob_back;
+ if(fly->root_parent)ob_back= fly->root_parent;
+ else ob_back= fly->v3d->camera;
+
+ /* store the original camera loc and rot */
+ object_tfm_restore(ob_back, fly->obtfm);
+
+ DAG_id_tag_update(&ob_back->id, OB_RECALC_OB);
+ } else {
+ /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
+ copy_qt_qt(rv3d->viewquat, fly->rot_backup);
+ copy_v3_v3(rv3d->ofs, fly->ofs_backup);
+ rv3d->persp= fly->persp_backup;
+ }
+ }
+ else if (fly->persp_backup==RV3D_CAMOB) { /* camera */
+ DAG_id_tag_update(fly->root_parent ? &fly->root_parent->id : &v3d->camera->id, OB_RECALC_OB);
+ }
+ else { /* not camera */
+ /* Apply the fly mode view */
+ /*restore the dist*/
+ float mat[3][3];
+ upvec[0]= upvec[1]= 0;
+ upvec[2]= fly->dist_backup; /*x and y are 0*/
+ copy_m3_m4(mat, rv3d->viewinv);
+ mul_m3_v3(mat, upvec);
+ add_v3_v3(rv3d->ofs, upvec);
+ /*Done with correcting for the dist */
+ }
+
+ rv3d->rflag &= ~RV3D_NAVIGATING;
+//XXX2.5 BIF_view3d_previewrender_signal(fly->sa, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */
+
+ if(fly->obtfm)
+ MEM_freeN(fly->obtfm);
+
+ if(fly->state == FLY_CONFIRM) {
+ MEM_freeN(fly);
+ return OPERATOR_FINISHED;
+ }
+
+ MEM_freeN(fly);
+ return OPERATOR_CANCELLED;
+}
+
+static void flyEvent(FlyInfo *fly, wmEvent *event)
+{
+ if (event->type == TIMER && event->customdata == fly->timer) {
+ fly->redraw = 1;
+ }
+ else if (event->type == MOUSEMOVE) {
+ fly->mval[0] = event->x - fly->ar->winrct.xmin;
+ fly->mval[1] = event->y - fly->ar->winrct.ymin;
+ } /* handle modal keymap first */
+ else if (event->type == EVT_MODAL_MAP) {
+ switch (event->val) {
+ case FLY_MODAL_CANCEL:
+ fly->state = FLY_CANCEL;
+ break;
+ case FLY_MODAL_CONFIRM:
+ fly->state = FLY_CONFIRM;
+ break;
+
+ case FLY_MODAL_ACCELERATE:
+ {
+ double time_currwheel;
+ float time_wheel;
+
+ time_currwheel= PIL_check_seconds_timer();
+ time_wheel = (float)(time_currwheel - fly->time_lastwheel);
+ fly->time_lastwheel = time_currwheel;
+ /*printf("Wheel %f\n", time_wheel);*/
+ /*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
+ time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+
+ if (fly->speed<0.0f) fly->speed= 0.0f;
+ else {
+ if (event->shift)
+ fly->speed+= fly->grid*time_wheel*0.1;
+ else
+ fly->speed+= fly->grid*time_wheel;
+ }
+ break;
+ }
+ case FLY_MODAL_DECELERATE:
+ {
+ double time_currwheel;
+ float time_wheel;
+
+ time_currwheel= PIL_check_seconds_timer();
+ time_wheel = (float)(time_currwheel - fly->time_lastwheel);
+ fly->time_lastwheel = time_currwheel;
+ time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+
+ if (fly->speed>0) fly->speed=0;
+ else {
+ if (event->shift)
+ fly->speed-= fly->grid*time_wheel*0.1;
+ else
+ fly->speed-= fly->grid*time_wheel;
+ }
+ break;
+ }
+ case FLY_MODAL_PAN_ENABLE:
+ fly->pan_view= TRUE;
+ break;
+ case FLY_MODAL_PAN_DISABLE:
+//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]);
+ fly->pan_view= FALSE;
+ break;
+
+ /* impliment WASD keys */
+ case FLY_MODAL_DIR_FORWARD:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed; /* flip speed rather then stopping, game like motion */
+ else if (fly->axis==2) fly->speed += fly->grid; /* increse like mousewheel if were already moving in that difection*/
+ fly->axis= 2;
+ break;
+ case FLY_MODAL_DIR_BACKWARD:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==2) fly->speed -= fly->grid;
+ fly->axis= 2;
+ break;
+ case FLY_MODAL_DIR_LEFT:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==0) fly->speed += fly->grid;
+ fly->axis= 0;
+ break;
+ case FLY_MODAL_DIR_RIGHT:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==0) fly->speed -= fly->grid;
+ fly->axis= 0;
+ break;
+ case FLY_MODAL_DIR_DOWN:
+ if (fly->speed < 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==1) fly->speed += fly->grid;
+ fly->axis= 1;
+ break;
+ case FLY_MODAL_DIR_UP:
+ if (fly->speed > 0.0f) fly->speed= -fly->speed;
+ else if (fly->axis==1) fly->speed -= fly->grid;
+ fly->axis= 1;
+ break;
+
+ case FLY_MODAL_AXIS_LOCK_X:
+ if (fly->xlock) fly->xlock=0;
+ else {
+ fly->xlock = 2;
+ fly->xlock_momentum = 0.0;
+ }
+ break;
+ case FLY_MODAL_AXIS_LOCK_Z:
+ if (fly->zlock) fly->zlock=0;
+ else {
+ fly->zlock = 2;
+ fly->zlock_momentum = 0.0;
+ }
+ break;
+
+ case FLY_MODAL_PRECISION_ENABLE:
+ fly->use_precision= TRUE;
+ break;
+ case FLY_MODAL_PRECISION_DISABLE:
+ fly->use_precision= FALSE;
+ break;
+
+ }
+ }
+}
+
+static int flyApply(bContext *C, FlyInfo *fly)
+{
+
+#define FLY_ROTATE_FAC 2.5f /* more is faster */
+#define FLY_ZUP_CORRECT_FAC 0.1f /* ammount to correct per step */
+#define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */
+
+ /*
+ fly mode - Shift+F
+ a fly loop where the user can move move the view as if they are flying
+ */
+ RegionView3D *rv3d= fly->rv3d;
+ View3D *v3d = fly->v3d;
+ ARegion *ar = fly->ar;
+ Scene *scene= fly->scene;
+
+ float prev_view_mat[4][4];
+
+ float mat[3][3], /* 3x3 copy of the view matrix so we can move allong the view axis */
+ dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */
+
+ /* Camera Uprighting variables */
+ upvec[3]={0,0,0}, /* stores the view's up vector */
+
+ moffset[2], /* mouse offset from the views center */
+ tmp_quat[4]; /* used for rotating the view */
+
+ int cent_orig[2], /* view center */
+//XXX- can avoid using // cent[2], /* view center modified */
+ xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
+ unsigned char
+ apply_rotation= 1; /* if the user presses shift they can look about without movinf the direction there looking*/
+
+ if(fly->root_parent)
+ view3d_persp_mat4(rv3d, prev_view_mat);
+
+ /* the dist defines a vector that is infront of the offset
+ to rotate the view about.
+ this is no good for fly mode because we
+ want to rotate about the viewers center.
+ but to correct the dist removal we must
+ alter offset so the view doesn't jump. */
+
+ xmargin= ar->winx/20.0f;
+ ymargin= ar->winy/20.0f;
+
+ cent_orig[0]= ar->winrct.xmin + ar->winx/2;
+ cent_orig[1]= ar->winrct.ymin + ar->winy/2;
+
+ {
+
+ /* mouse offset from the center */
+ moffset[0]= fly->mval[0]- ar->winx/2;
+ moffset[1]= fly->mval[1]- ar->winy/2;
+
+ /* enforce a view margin */
+ if (moffset[0]>xmargin) moffset[0]-=xmargin;
+ else if (moffset[0] < -xmargin) moffset[0]+=xmargin;
+ else moffset[0]=0;
+
+ if (moffset[1]>ymargin) moffset[1]-=ymargin;
+ else if (moffset[1] < -ymargin) moffset[1]+=ymargin;
+ else moffset[1]=0;
+
+
+ /* scale the mouse movement by this value - scales mouse movement to the view size
+ * moffset[0]/(ar->winx-xmargin*2) - window size minus margin (same for y)
+ *
+ * the mouse moves isnt linear */
+
+ if(moffset[0]) {
+ moffset[0] /= ar->winx - (xmargin*2);
+ moffset[0] *= fabs(moffset[0]);
+ }
+
+ if(moffset[1]) {
+ moffset[1] /= ar->winy - (ymargin*2);
+ moffset[1] *= fabs(moffset[1]);
+ }
+
+ /* Should we redraw? */
+ if(fly->speed != 0.0f || moffset[0] || moffset[1] || fly->zlock || fly->xlock || dvec[0] || dvec[1] || dvec[2] ) {
+ float dvec_tmp[3];
+ double time_current, time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
+ float time_redraw_clamped;
+
+ time_current= PIL_check_seconds_timer();
+ time_redraw= (float)(time_current - fly->time_lastdraw);
+ time_redraw_clamped= MIN2(0.05f, time_redraw); /* clamt the redraw time to avoid jitter in roll correction */
+ fly->time_lastdraw= time_current;
+ /*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */
+
+ /* Scale the time to use shift to scale the speed down- just like
+ shift slows many other areas of blender down */
+ if (fly->use_precision)
+ fly->speed= fly->speed * (1.0f-time_redraw_clamped);
+
+ copy_m3_m4(mat, rv3d->viewinv);
+
+ if (fly->pan_view==TRUE) {
+ /* pan only */
+ dvec_tmp[0]= -moffset[0];
+ dvec_tmp[1]= -moffset[1];
+ dvec_tmp[2]= 0;
+
+ if (fly->use_precision) {
+ dvec_tmp[0] *= 0.1;
+ dvec_tmp[1] *= 0.1;
+ }
+
+ mul_m3_v3(mat, dvec_tmp);
+ mul_v3_fl(dvec_tmp, time_redraw*200.0 * fly->grid);
+
+ } else {
+ float roll; /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
+
+ /* rotate about the X axis- look up/down */
+ if (moffset[1]) {
+ upvec[0]=1;
+ upvec[1]=0;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+ axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ if (fly->xlock) fly->xlock = 2; /*check for rotation*/
+ if (fly->zlock) fly->zlock = 2;
+ fly->xlock_momentum= 0.0f;
+ }
+
+ /* rotate about the Y axis- look left/right */
+ if (moffset[0]) {
+
+ /* if we're upside down invert the moffset */
+ upvec[0]=0;
+ upvec[1]=1;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+
+ if(upvec[2] < 0.0f)
+ moffset[0]= -moffset[0];
+
+ /* make the lock vectors */
+ if (fly->zlock) {
+ upvec[0]=0;
+ upvec[1]=0;
+ upvec[2]=1;
+ } else {
+ upvec[0]=0;
+ upvec[1]=1;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+ }
+
+ axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ if (fly->xlock) fly->xlock = 2;/*check for rotation*/
+ if (fly->zlock) fly->zlock = 2;
+ }
+
+ if (fly->zlock==2) {
+ upvec[0]=1;
+ upvec[1]=0;
+ upvec[2]=0;
+ mul_m3_v3(mat, upvec);
+
+ /*make sure we have some z rolling*/
+ if (fabs(upvec[2]) > 0.00001f) {
+ roll= upvec[2]*5;
+ upvec[0]=0; /*rotate the view about this axis*/
+ upvec[1]=0;
+ upvec[2]=1;
+
+ mul_m3_v3(mat, upvec);
+ axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL;
+ } else {
+ fly->zlock=1; /* dont check until the view rotates again */
+ fly->zlock_momentum= 0.0f;
+ }
+ }
+
+ if (fly->xlock==2 && moffset[1]==0) { /*only apply xcorrect when mouse isnt applying x rot*/
+ upvec[0]=0;
+ upvec[1]=0;
+ upvec[2]=1;
+ mul_m3_v3(mat, upvec);
+ /*make sure we have some z rolling*/
+ if (fabs(upvec[2]) > 0.00001) {
+ roll= upvec[2] * -5;
+
+ upvec[0]= 1.0f; /*rotate the view about this axis*/
+ upvec[1]= 0.0f;
+ upvec[2]= 0.0f;
+
+ mul_m3_v3(mat, upvec);
+
+ axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->xlock_momentum*0.1f); /* Rotate about the relative up vec */
+ mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
+
+ fly->xlock_momentum += 0.05f;
+ } else {
+ fly->xlock=1; /* see above */
+ fly->xlock_momentum= 0.0f;
+ }
+ }
+
+
+ if (apply_rotation) {
+ /* Normal operation */
+ /* define dvec, view direction vector */
+ dvec_tmp[0]= dvec_tmp[1]= dvec_tmp[2]= 0.0f;
+ /* move along the current axis */
+ dvec_tmp[fly->axis]= 1.0f;
+
+ mul_m3_v3(mat, dvec_tmp);
+
+ mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f);
+ }
+ }
+
+ /* impose a directional lag */
+ interp_v3_v3v3(dvec, dvec_tmp, fly->dvec_prev, (1.0f/(1.0f+(time_redraw*5.0f))));
+
+ if (rv3d->persp==RV3D_CAMOB) {
+ Object *lock_ob= fly->root_parent ? fly->root_parent : fly->v3d->camera;
+ if (lock_ob->protectflag & OB_LOCK_LOCX) dvec[0] = 0.0;
+ if (lock_ob->protectflag & OB_LOCK_LOCY) dvec[1] = 0.0;
+ if (lock_ob->protectflag & OB_LOCK_LOCZ) dvec[2] = 0.0;
+ }
+
+ add_v3_v3(rv3d->ofs, dvec);
+
+ /* todo, dynamic keys */
+#if 0
+ if (fly->zlock && fly->xlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->zlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else if (fly->xlock)
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+ else
+ ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
+#endif
+
+ /* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to the view */
+ if (rv3d->persp==RV3D_CAMOB) {
+ ID *id_key;
+ /* transform the parent or the camera? */
+ if(fly->root_parent) {
+ Object *ob_update;
+
+ float view_mat[4][4];
+ float prev_view_imat[4][4];
+ float diff_mat[4][4];
+ float parent_mat[4][4];
+
+ invert_m4_m4(prev_view_imat, prev_view_mat);
+ view3d_persp_mat4(rv3d, view_mat);
+ mul_m4_m4m4(diff_mat, prev_view_imat, view_mat);
+ mul_m4_m4m4(parent_mat, fly->root_parent->obmat, diff_mat);
+ object_apply_mat4(fly->root_parent, parent_mat, TRUE, FALSE);
+
+ // where_is_object(scene, fly->root_parent);
+
+ ob_update= v3d->camera->parent;
+ while(ob_update) {
+ DAG_id_tag_update(&ob_update->id, OB_RECALC_OB);
+ ob_update= ob_update->parent;
+ }
+
+ copy_m4_m4(prev_view_mat, view_mat);
+
+ id_key= &fly->root_parent->id;
+
+ }
+ else {
+ float view_mat[4][4];
+ view3d_persp_mat4(rv3d, view_mat);
+ object_apply_mat4(v3d->camera, view_mat, TRUE, FALSE);
+ id_key= &v3d->camera->id;
+ }
+
+ /* record the motion */
+ if (autokeyframe_cfra_can_key(scene, id_key)) {
+ ListBase dsources = {NULL, NULL};
+
+ /* add datasource override for the camera object */
+ ANIM_relative_keyingset_add_source(&dsources, id_key, NULL, NULL);
+
+ /* insert keyframes
+ * 1) on the first frame
+ * 2) on each subsequent frame
+ * TODO: need to check in future that frame changed before doing this
+ */
+ if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) {
+ KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ }
+ if (fly->speed) {
+ KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
+ }
+
+ /* free temp data */
+ BLI_freelistN(&dsources);
+ }
+ }
+ } else
+ /*were not redrawing but we need to update the time else the view will jump */
+ fly->time_lastdraw= PIL_check_seconds_timer();
+ /* end drawing */
+ copy_v3_v3(fly->dvec_prev, dvec);
+ }
+
+/* moved to flyEnd() */
+
+ return OPERATOR_FINISHED;
+}
+
+
+
+static int fly_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ FlyInfo *fly;
+
+ if(rv3d->viewlock)
+ return OPERATOR_CANCELLED;
+
+ fly= MEM_callocN(sizeof(FlyInfo), "FlyOperation");
+
+ op->customdata= fly;
+
+ if(initFlyInfo(C, fly, op, event)==FALSE) {
+ MEM_freeN(op->customdata);
+ return OPERATOR_CANCELLED;
+ }
+
+ flyEvent(fly, event);
+
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int fly_cancel(bContext *C, wmOperator *op)
+{
+ FlyInfo *fly = op->customdata;
+
+ fly->state = FLY_CANCEL;
+ flyEnd(C, fly);
+ op->customdata= NULL;
+
+ return OPERATOR_CANCELLED;
+}
+
+static int fly_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ int exit_code;
+ short do_draw= FALSE;
+ FlyInfo *fly= op->customdata;
+ RegionView3D *rv3d= fly->rv3d;
+ Object *fly_object= fly->root_parent ? fly->root_parent : fly->v3d->camera;
+
+ fly->redraw= 0;
+
+ flyEvent(fly, event);
+
+ if(event->type==TIMER && event->customdata == fly->timer)
+ flyApply(C, fly);
+
+ do_draw |= fly->redraw;
+
+ exit_code = flyEnd(C, fly);
+
+ if(exit_code!=OPERATOR_RUNNING_MODAL)
+ do_draw= TRUE;
+
+ if(do_draw) {
+ if(rv3d->persp==RV3D_CAMOB) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, fly_object);
+ }
+
+ ED_region_tag_redraw(CTX_wm_region(C));
+ }
+
+ return exit_code;
+}
+
+void VIEW3D_OT_fly(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Fly Navigation";
+ ot->description= "Interactively fly around the scene";
+ ot->idname= "VIEW3D_OT_fly";
+
+ /* api callbacks */
+ ot->invoke= fly_invoke;
+ ot->cancel= fly_cancel;
+ ot->modal= fly_modal;
+ ot->poll= ED_operator_view3d_active;
+
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index d7c7652e348..05735d810d3 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,6 +37,11 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_effect.h"
@@ -59,11 +64,6 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
-
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-
#include "UI_interface.h"
#include "UI_resources.h"
@@ -82,9 +82,6 @@
#define TEST_EDITMESH if(obedit==0) return; \
if( (v3d->lay & obedit->lay)==0 ) return;
-/* XXX port over */
-extern void borderselect();
-
/* view3d handler codes */
#define VIEW3D_HANDLER_BACKGROUND 1
#define VIEW3D_HANDLER_PROPERTIES 2
@@ -141,12 +138,13 @@ static void handle_view3d_lock(bContext *C)
}
}
-static int layers_exec(bContext *C, wmOperator *op)
+static int view3d_layers_exec(bContext *C, wmOperator *op)
{
- Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
+ Base *base;
+ int oldlay= v3d->lay;
int nr= RNA_int_get(op->ptr, "nr");
int toggle= RNA_boolean_get(op->ptr, "toggle");
@@ -204,8 +202,12 @@ static int layers_exec(bContext *C, wmOperator *op)
if(v3d->scenelock) handle_view3d_lock(C);
- /* new layers might need unflushed events events */
- DAG_scene_update_flags(bmain, scene, v3d->lay); /* tags all that moves and flushes */
+ /* XXX new layers might need updates, there is no provision yet to detect if that's needed */
+ oldlay= ~oldlay & v3d->lay;
+ for (base= scene->base.first; base; base= base->next) {
+ if(base->lay & oldlay)
+ base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA;
+ }
ED_area_tag_redraw(sa);
@@ -214,7 +216,7 @@ static int layers_exec(bContext *C, wmOperator *op)
/* applies shift and alt, lazy coding or ok? :) */
/* the local per-keymap-entry keymap will solve it */
-static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view3d_layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
if(event->ctrl || event->oskey)
return OPERATOR_PASS_THROUGH;
@@ -226,12 +228,12 @@ static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
int nr= RNA_int_get(op->ptr, "nr") + 10;
RNA_int_set(op->ptr, "nr", nr);
}
- layers_exec(C, op);
+ view3d_layers_exec(C, op);
return OPERATOR_FINISHED;
}
-int layers_poll(bContext *C)
+static int view3d_layers_poll(bContext *C)
{
return (ED_operator_view3d_active(C) && CTX_wm_view3d(C)->localvd==NULL);
}
@@ -244,9 +246,9 @@ void VIEW3D_OT_layers(wmOperatorType *ot)
ot->idname= "VIEW3D_OT_layers";
/* api callbacks */
- ot->invoke= layers_invoke;
- ot->exec= layers_exec;
- ot->poll= layers_poll;
+ ot->invoke= view3d_layers_invoke;
+ ot->exec= view3d_layers_exec;
+ ot->poll= view3d_layers_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -305,7 +307,7 @@ static char *view3d_modeselect_pup(Scene *scene)
}
-static void do_view3d_header_buttons(bContext *C, void *arg, int event)
+static void do_view3d_header_buttons(bContext *C, void *UNUSED(arg), int event)
{
wmWindow *win= CTX_wm_window(C);
ToolSettings *ts= CTX_data_tool_settings(C);
@@ -449,24 +451,14 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
} else {
v3d->modeselect = OB_MODE_OBJECT;
}
-
- v3d->flag &= ~V3D_MODE;
- /* not sure what the v3d->flag is useful for now... modeselect is confusing */
- if(obedit) v3d->flag |= V3D_EDITMODE;
- if(ob && (ob->mode & OB_MODE_POSE)) v3d->flag |= V3D_POSEMODE;
- if(ob && (ob->mode & OB_MODE_VERTEX_PAINT)) v3d->flag |= V3D_VERTEXPAINT;
- if(ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) v3d->flag |= V3D_WEIGHTPAINT;
- if(ob && (ob->mode & OB_MODE_TEXTURE_PAINT)) v3d->flag |= V3D_TEXTUREPAINT;
- if(paint_facesel_test(ob)) v3d->flag |= V3D_FACESELECT;
-
uiBlockBeginAlign(block);
uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) ,
0,0,126,20, &(v3d->modeselect), 0, 0, 0, 0, "Mode");
uiBlockEndAlign(block);
/* Draw type */
- uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
/* Manipulators aren't used in weight paint mode */
@@ -474,13 +466,13 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
PointerRNA meshptr;
RNA_pointer_create(&ob->id, &RNA_Mesh, ob->data, &meshptr);
- uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
} else {
- char *str_menu;
+ const char *str_menu;
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", 0);
- uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
/* NDOF */
/* Not implemented yet
@@ -495,7 +487,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
block= uiLayoutGetBlock(row);
if(v3d->twflag & V3D_USE_MANIPULATOR) {
@@ -510,11 +502,11 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
str_menu = BIF_menustringTransformOrientation(C, "Orientation");
uiDefButS(block, MENU, B_MAN_MODE, str_menu,0,0,70,YIC, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation");
- MEM_freeN(str_menu);
+ MEM_freeN((void *)str_menu);
}
if(obedit==NULL && v3d->localvd==NULL) {
- int ob_lay = ob ? ob->lay : 0;
+ unsigned int ob_lay = ob ? ob->lay : 0;
/* Layers */
if (v3d->scenelock)
@@ -523,7 +515,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
/* Scene lock */
- uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", 0);
+ uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
}
/* selection modus, dont use python for this since it cant do the toggle buttons with shift+click as well as clicking to set one. */
@@ -534,8 +526,8 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
row= uiLayoutRow(layout, 1);
block= uiLayoutGetBlock(row);
- uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
- uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_SEL_EDGE, ICON_EDGESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
- uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_SEL_FACE, ICON_FACESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
+ uiDefIconButBitI(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode");
+ uiDefIconButBitI(block, TOG, SCE_SELECT_EDGE, B_SEL_EDGE, ICON_EDGESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Edge select mode");
+ uiDefIconButBitI(block, TOG, SCE_SELECT_FACE, B_SEL_FACE, ICON_FACESEL, 0,0,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Face select mode");
}
}
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index cdb569c8f75..8cd07916b7b 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -54,22 +54,16 @@ struct bMotionPath;
#define DRAW_CONSTCOLOR 2
#define DRAW_SCENESET 4
-#define V3D_XRAY 1
-#define V3D_TRANSP 2
-#define V3D_XRAYTRANSP 4
-
-#define V3D_SELECT_MOUSE 1
-
/* view3d_header.c */
void view3d_header_buttons(const struct bContext *C, struct ARegion *ar);
void VIEW3D_OT_layers(struct wmOperatorType *ot);
/* view3d_ops.c */
void view3d_operatortypes(void);
-void view3d_keymap(struct wmKeyConfig *keyconf);
/* view3d_edit.c */
void VIEW3D_OT_zoom(struct wmOperatorType *ot);
+void VIEW3D_OT_zoom_camera_1_to_1(struct wmOperatorType *ot);
void VIEW3D_OT_move(struct wmOperatorType *ot);
void VIEW3D_OT_rotate(struct wmOperatorType *ot);
void VIEW3D_OT_view_all(struct wmOperatorType *ot);
@@ -79,8 +73,8 @@ void VIEW3D_OT_view_center_cursor(struct wmOperatorType *ot);
void VIEW3D_OT_view_center_camera(struct wmOperatorType *ot);
void VIEW3D_OT_view_pan(struct wmOperatorType *ot);
void VIEW3D_OT_view_persportho(struct wmOperatorType *ot);
-void VIEW3D_OT_add_background_image(struct wmOperatorType *ot);
-void VIEW3D_OT_remove_background_image(struct wmOperatorType *ot);
+void VIEW3D_OT_background_image_add(struct wmOperatorType *ot);
+void VIEW3D_OT_background_image_remove(struct wmOperatorType *ot);
void VIEW3D_OT_view_orbit(struct wmOperatorType *ot);
void VIEW3D_OT_clip_border(struct wmOperatorType *ot);
void VIEW3D_OT_cursor3d(struct wmOperatorType *ot);
@@ -91,13 +85,18 @@ void VIEW3D_OT_zoom_border(struct wmOperatorType *ot);
void VIEW3D_OT_drawtype(struct wmOperatorType *ot);
void view3d_boxview_copy(ScrArea *sa, ARegion *ar);
+void view3d_persp_mat4(struct RegionView3D *rv3d, float mat[][4]);
+
+/* view3d_fly.c */
+void view3d_keymap(struct wmKeyConfig *keyconf);
+void VIEW3D_OT_fly(struct wmOperatorType *ot);
/* drawanim.c */
-void draw_motion_paths_init(Scene *scene, View3D *v3d, struct ARegion *ar);
-void draw_motion_path_instance(Scene *scene, View3D *v3d, struct ARegion *ar,
+void draw_motion_paths_init(View3D *v3d, struct ARegion *ar);
+void draw_motion_path_instance(Scene *scene,
struct Object *ob, struct bPoseChannel *pchan,
struct bAnimVizSettings *avs, struct bMotionPath *mpath);
-void draw_motion_paths_cleanup(Scene *scene, View3D *v3d, struct ARegion *ar);
+void draw_motion_paths_cleanup(View3D *v3d);
@@ -106,13 +105,14 @@ void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, int
int draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, int dt);
void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob, int dt, int outline);
void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, struct Object *ob);
-void drawaxes(float size, int flag, char drawtype);
+void drawaxes(float size, char drawtype);
void view3d_cached_text_draw_begin(void);
-void view3d_cached_text_draw_add(float x, float y, float z, char *str, short xoffs, short flag);
+void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs, short flag, const unsigned char col[4]);
void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[][4]);
-#define V3D_CACHE_TEXT_ZBUF 1
-#define V3D_CACHE_TEXT_WORLDSPACE 2
+#define V3D_CACHE_TEXT_ZBUF (1<<0)
+#define V3D_CACHE_TEXT_WORLDSPACE (1<<1)
+#define V3D_CACHE_TEXT_ASCII (1<<2)
/* drawarmature.c */
int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, int flag);
@@ -127,10 +127,12 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
void view3d_clr_clipping(void);
void view3d_set_clipping(RegionView3D *rv3d);
void add_view3d_after(ListBase *lb, Base *base, int flag);
+void view3d_viewborder_size_get(struct Scene *scene, struct ARegion *ar, float size_r[2]);
void circf(float x, float y, float rad);
void circ(float x, float y, float rad);
-void view3d_update_depths(struct ARegion *ar, View3D *v3d);
+void view3d_update_depths_rect(struct ARegion *ar, struct ViewDepths *d, struct rcti *rect);
+float view3d_depth_near(struct ViewDepths *d);
/* view3d_select.c */
void VIEW3D_OT_select(struct wmOperatorType *ot);
@@ -141,13 +143,13 @@ void VIEW3D_OT_select_lasso(struct wmOperatorType *ot);
/* view3d_view.c */
void view3d_settings_from_ob(struct Object *ob, float *ofs, float *quat, float *dist, float *lens);
+int view3d_is_ortho(View3D *v3d, RegionView3D *rv3d);
void VIEW3D_OT_smoothview(struct wmOperatorType *ot);
void VIEW3D_OT_setcameratoview(struct wmOperatorType *ot);
void VIEW3D_OT_object_as_camera(struct wmOperatorType *ot);
void VIEW3D_OT_localview(struct wmOperatorType *ot);
void VIEW3D_OT_game_start(struct wmOperatorType *ot);
-void VIEW3D_OT_fly(struct wmOperatorType *ot);
int boundbox_clip(RegionView3D *rv3d, float obmat[][4], struct BoundBox *bb);
@@ -190,8 +192,10 @@ void VIEW3D_OT_evtrec(struct wmOperatorType *ot);
ARegion *view3d_has_buttons_region(ScrArea *sa);
ARegion *view3d_has_tools_region(ScrArea *sa);
+extern const char *view3d_context_dir[]; /* doc access */
+
/* draw_volume.c */
-void draw_volume(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct Base *base, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
+void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow);
#endif /* ED_VIEW3D_INTERN_H */
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index c436c179f8f..dc1d2e26de0 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,7 +38,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
-
+#include "BLI_utildefines.h"
#include "RNA_access.h"
@@ -60,13 +60,14 @@ void view3d_operatortypes(void)
WM_operatortype_append(VIEW3D_OT_rotate);
WM_operatortype_append(VIEW3D_OT_move);
WM_operatortype_append(VIEW3D_OT_zoom);
+ WM_operatortype_append(VIEW3D_OT_zoom_camera_1_to_1);
WM_operatortype_append(VIEW3D_OT_view_all);
WM_operatortype_append(VIEW3D_OT_viewnumpad);
WM_operatortype_append(VIEW3D_OT_view_orbit);
WM_operatortype_append(VIEW3D_OT_view_pan);
WM_operatortype_append(VIEW3D_OT_view_persportho);
- WM_operatortype_append(VIEW3D_OT_add_background_image);
- WM_operatortype_append(VIEW3D_OT_remove_background_image);
+ WM_operatortype_append(VIEW3D_OT_background_image_add);
+ WM_operatortype_append(VIEW3D_OT_background_image_remove);
WM_operatortype_append(VIEW3D_OT_view_selected);
WM_operatortype_append(VIEW3D_OT_view_center_cursor);
WM_operatortype_append(VIEW3D_OT_view_center_camera);
@@ -150,6 +151,8 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELINMOUSE, KM_PRESS, 0, 0)->ptr, "delta", 1);
RNA_int_set(WM_keymap_add_item(keymap, "VIEW3D_OT_zoom", WHEELOUTMOUSE, KM_PRESS, 0, 0)->ptr, "delta", -1);
+ WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_camera_1_to_1", PADENTER, KM_PRESS, KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_camera", HOMEKEY, KM_PRESS, 0, 0); /* only with camera view */
RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0); /* only without camera view */
RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1);
@@ -184,6 +187,26 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
/* active aligned, replaces '*' key in 2.4x */
+#ifdef WIN32
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+ kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT|KM_CTRL, 0);
+ RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
+ RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+#else
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
@@ -202,6 +225,7 @@ void view3d_keymap(wmKeyConfig *keyconf)
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
+#endif
WM_keymap_add_item(keymap, "VIEW3D_OT_localview", PADSLASHKEY, KM_PRESS, 0, 0);
@@ -275,7 +299,7 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_string_set(kmi->ptr, "value", "MEDIAN_POINT");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", COMMAKEY, KM_PRESS, KM_ALT, 0); /* new in 2.5 */
- RNA_string_set(kmi->ptr, "data_path", "space_data.pivot_point_align");
+ RNA_string_set(kmi->ptr, "data_path", "space_data.use_pivot_point_align");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SPACEKEY, KM_PRESS, KM_CTRL, 0); /* new in 2.5 */
RNA_string_set(kmi->ptr, "data_path", "space_data.show_manipulator");
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 776048c8f74..c557952a454 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1,5 +1,5 @@
-/**
- * $Id:
+/*
+ * $Id: view3d_select.c 35106 2011-02-23 10:52:22Z jesterking $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,22 +30,15 @@
#include <stdio.h>
#include <math.h>
#include <float.h>
+#include <assert.h>
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_lamp_types.h"
#include "DNA_meta_types.h"
-#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
-#include "DNA_space_types.h"
#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_userdef_types.h"
-#include "DNA_view3d_types.h"
-#include "DNA_world_types.h"
#include "MEM_guardedalloc.h"
@@ -54,14 +47,15 @@
#include "BLI_editVert.h"
#include "BLI_rand.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_paint.h"
+#include "BKE_armature.h"
#include "BKE_tessmesh.h"
-#include "RE_pipeline.h" // make_stars
-
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -75,16 +69,10 @@
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-#include "ED_retopo.h"
#include "ED_mball.h"
#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-#include "PIL_time.h" /* smoothview */
#include "view3d_intern.h" // own include
@@ -114,7 +102,7 @@ void view3d_get_view_aligned_coordinate(ViewContext *vc, float *fp, short mval[2
if(mval[0]!=IS_CLIPPED) {
window_to_3d_delta(vc->ar, dvec, mval[0]-mx, mval[1]-my);
- sub_v3_v3v3(fp, fp, dvec);
+ sub_v3_v3(fp, dvec);
}
}
@@ -199,21 +187,21 @@ void EDBM_backbuf_checkAndSelectFaces(BMEditMesh *em, int select)
void EDBM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
{
- MFace *mface = me->mface;
+ MPoly *mpoly = me->mpoly;
int a;
- if (mface) {
- for(a=1; a<=me->totface; a++, mface++) {
+ if (mpoly) {
+ for(a=1; a<=me->totpoly; a++, mpoly++) {
if(EDBM_check_backbuf(a)) {
- mface->flag = select?(mface->flag|ME_FACE_SEL):(mface->flag&~ME_FACE_SEL);
+ mpoly->flag = select?(mpoly->flag|ME_FACE_SEL):(mpoly->flag&~ME_FACE_SEL);
}
}
}
}
+#if 0
void arrows_move_cursor(unsigned short event)
{
-#if 0
short mval[2];
getmouseco_sc(mval);
@@ -227,12 +215,39 @@ void arrows_move_cursor(unsigned short event)
} else if(event==RIGHTARROWKEY) {
warp_pointer(mval[0]+1, mval[1]);
}
-#endif
}
+#endif
/* *********************** GESTURE AND LASSO ******************* */
+static int view3d_selectable_data(bContext *C)
+{
+ Object *ob = CTX_data_active_object(C);
+
+ if (!ED_operator_region_view3d_active(C))
+ return 0;
+
+ if(ob) {
+ if (ob->mode & OB_MODE_EDIT) {
+ if(ob->type == OB_FONT) {
+ return 0;
+ }
+ }
+ else {
+ if (ob->mode & OB_MODE_SCULPT) {
+ return 0;
+ }
+ if (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT) && !paint_facesel_test(ob)) {
+ return 0;
+ }
+ }
+ }
+
+ return 1;
+}
+
+
/* helper also for borderselect */
static int edge_fully_inside_rect(rcti *rect, short x1, short y1, short x2, short y2)
{
@@ -350,34 +365,43 @@ static void do_lasso_select_pose(ViewContext *vc, Object *ob, short mcords[][2],
bPoseChannel *pchan;
float vec[3];
short sco1[2], sco2[2];
+ bArmature *arm= ob->data;
if(ob->type!=OB_ARMATURE || ob->pose==NULL) return;
-
+
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
- project_short(vc->ar, vec, sco1);
- mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
- project_short(vc->ar, vec, sco2);
-
- if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
- if(select) pchan->bone->flag |= BONE_SELECTED;
- else pchan->bone->flag &= ~BONE_SELECTED;
+ if (PBONE_VISIBLE(arm, pchan->bone) && (pchan->bone->flag & BONE_UNSELECTABLE)==0) {
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_head);
+ project_short(vc->ar, vec, sco1);
+ mul_v3_m4v3(vec, ob->obmat, pchan->pose_tail);
+ project_short(vc->ar, vec, sco2);
+
+ if(lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
+ if(select) pchan->bone->flag |= BONE_SELECTED;
+ else pchan->bone->flag &= ~BONE_SELECTED;
+ }
}
}
-
- {
- bArmature *arm= ob->data;
- if(arm->act_bone && (arm->act_bone->flag & BONE_SELECTED)==0) {
- arm->act_bone= NULL;
+}
+
+static void object_deselect_all_visible(Scene *scene, View3D *v3d)
+{
+ Base *base;
+
+ for(base= scene->base.first; base; base= base->next) {
+ if(BASE_SELECTABLE(v3d, base)) {
+ ED_base_object_select(base, BA_DESELECT);
}
}
}
-
-static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Base *base;
+ if (extend == 0 && select)
+ object_deselect_all_visible(vc->scene, vc->v3d);
+
for(base= vc->scene->base.first; base; base= base->next) {
if(BASE_SELECTABLE(vc->v3d, base)) { /* use this to avoid un-needed lasso lookups */
project_short(vc->ar, base->object->obmat[3], &base->sx);
@@ -394,7 +418,7 @@ static void do_lasso_select_objects(ViewContext *vc, short mcords[][2], short mo
}
}
-void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
+static void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
{
short a;
@@ -409,12 +433,12 @@ void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
}
}
-static void do_lasso_select_mesh__doSelectVert(void *userData, BMVert *eve, int x, int y, int index)
+static void do_lasso_select_mesh__doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_Select_Vert(data->vc.em->bm, eve, data->select);
+ BM_Select(data->vc.em->bm, eve, data->select);
}
}
static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
@@ -426,28 +450,29 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int
if ( edge_fully_inside_rect(data->rect, x0, y0, x1, y1) &&
lasso_inside(data->mcords, data->moves, x0, y0) &&
lasso_inside(data->mcords, data->moves, x1, y1)) {
- BM_Select_Edge(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc.em->bm, eed, data->select);
data->done = 1;
}
} else {
if (lasso_inside_edge(data->mcords, data->moves, x0, y0, x1, y1)) {
- BM_Select_Edge(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc.em->bm, eed, data->select);
}
}
}
}
-static void do_lasso_select_mesh__doSelectFace(void *userData, BMFace *efa, int x, int y, int index)
+static void do_lasso_select_mesh__doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_Select_Face(data->vc.em->bm, efa, data->select);
+ BM_Select(data->vc.em->bm, efa, data->select);
}
}
-static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
struct { ViewContext vc; rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
+ ToolSettings *ts= vc->scene->toolsettings;
rcti rect;
int bbsel;
@@ -464,8 +489,11 @@ static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves
data.done = 0;
data.pass = 0;
- /* workaround: init mats first, EDBM_mask_init_backbuf_border can change
- view matrix to pixel space, breaking edge select with backbuf. fixes bug #20936 */
+ if (extend == 0 && select)
+ EDBM_clear_flag_all(vc->em, BM_SELECT);
+
+ /* workaround: init mats first, EM_mask_init_backbuf_border can change
+ view matrix to pixel space, breaking edge select with backbuf. fixes bug [#20936] */
/* [#21018] breaks zbuf select. run below. only if bbsel fails */
/* ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d) */
@@ -473,7 +501,7 @@ static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves
glLoadMatrixf(vc->rv3d->viewmat);
bbsel= EDBM_mask_init_backbuf_border(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_VERTEX) {
+ if(ts->selectmode & SCE_SELECT_VERTEX) {
if (bbsel) {
EDBM_backbuf_checkAndSelectVerts(vc->em, select);
} else {
@@ -481,7 +509,7 @@ static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves
mesh_foreachScreenVert(vc, do_lasso_select_mesh__doSelectVert, &data, 1);
}
}
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_EDGE) {
+ if(ts->selectmode & SCE_SELECT_EDGE) {
/* Does both bbsel and non-bbsel versions (need screen cos for both) */
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
@@ -494,7 +522,7 @@ static void do_lasso_select_mesh(ViewContext *vc, short mcords[][2], short moves
}
}
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_FACE) {
+ if(ts->selectmode & SCE_SELECT_FACE) {
if (bbsel) {
EDBM_backbuf_checkAndSelectFaces(vc->em, select);
} else {
@@ -540,7 +568,7 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
} else { /* Vert Sel*/
for (efa= em->faces.first; efa; efa= efa->next) {
tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
- if (simaFaceDraw_Check(efa, tf)) {
+ if (uvedit_face_visible(scene, ima, efa, tf)) {
nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
if ((select) != (simaUVSel_Check(efa, tf, i))) {
@@ -564,16 +592,17 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
}
#endif
-static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void do_lasso_select_curve__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } *data = userData;
-
+ struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } *data = userData;
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
+
if (lasso_inside(data->mcords, data->moves, x, y)) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- Curve *cu= data->vc.obedit->data;
-
if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
@@ -586,20 +615,25 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
}
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
-static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_curve(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
- struct { ViewContext vc; short (*mcords)[2]; short moves; short select; } data;
+ struct { ViewContext *vc; short (*mcords)[2]; short moves; short select; } data;
/* set vc->editnurb */
- data.vc = *vc;
+ data.vc = vc;
data.mcords = mcords;
data.moves = moves;
data.select = select;
+ if (extend == 0 && select)
+ CU_deselect_all(vc->obedit);
+
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data);
}
@@ -612,7 +646,7 @@ static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x,
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
struct { short (*mcords)[2]; short moves; short select; } data;
@@ -621,66 +655,112 @@ static void do_lasso_select_lattice(ViewContext *vc, short mcords[][2], short mo
data.moves = moves;
data.select = select;
+ if (extend == 0 && select)
+ ED_setflagsLatt(vc->obedit, 0);
+
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
lattice_foreachScreenVert(vc, do_lasso_select_lattice__doSelect, &data);
}
-static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_armature(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
bArmature *arm= vc->obedit->data;
EditBone *ebone;
float vec[3];
short sco1[2], sco2[2], didpoint;
-
+ int change= FALSE;
+
+ if (extend==0 && select)
+ ED_armature_deselect_all_visible(vc->obedit);
+
/* set editdata in vc */
for (ebone= arm->edbo->first; ebone; ebone=ebone->next) {
-
- mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
- project_short(vc->ar, vec, sco1);
- mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
- project_short(vc->ar, vec, sco2);
-
- didpoint= 0;
- if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
- if(select) ebone->flag |= BONE_ROOTSEL;
- else ebone->flag &= ~BONE_ROOTSEL;
- didpoint= 1;
+ if (EBONE_VISIBLE(arm, ebone) && (ebone->flag & BONE_UNSELECTABLE)==0) {
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->head);
+ project_short(vc->ar, vec, sco1);
+ mul_v3_m4v3(vec, vc->obedit->obmat, ebone->tail);
+ project_short(vc->ar, vec, sco2);
+
+ didpoint= 0;
+ if(lasso_inside(mcords, moves, sco1[0], sco1[1])) {
+ if(select) ebone->flag |= BONE_ROOTSEL;
+ else ebone->flag &= ~BONE_ROOTSEL;
+ didpoint= 1;
+ change= TRUE;
+ }
+ if(lasso_inside(mcords, moves, sco2[0], sco2[1])) {
+ if(select) ebone->flag |= BONE_TIPSEL;
+ else ebone->flag &= ~BONE_TIPSEL;
+ didpoint= 1;
+ change= TRUE;
+ }
+ /* if one of points selected, we skip the bone itself */
+ if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
+ if(select) ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
+ else ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ change= TRUE;
+ }
}
- if(lasso_inside(mcords, moves, sco2[0], sco2[1])) {
- if(select) ebone->flag |= BONE_TIPSEL;
- else ebone->flag &= ~BONE_TIPSEL;
- didpoint= 1;
+ }
+
+ if(change) {
+ ED_armature_sync_selection(arm->edbo);
+ ED_armature_validate_active(arm);
+ WM_main_add_notifier(NC_OBJECT|ND_BONE_SELECT, vc->obedit);
+ }
+}
+
+
+
+
+static void do_lasso_select_meta(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
+{
+ MetaBall *mb = (MetaBall*)vc->obedit->data;
+ MetaElem *ml;
+ float vec[3];
+ short sco[2];
+
+ if (extend == 0 && select) {
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ ml->flag &= ~SELECT;
}
- /* if one of points selected, we skip the bone itself */
- if(didpoint==0 && lasso_inside_edge(mcords, moves, sco1[0], sco1[1], sco2[0], sco2[1])) {
- if(select) ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
- else ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ }
+
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+
+ mul_v3_m4v3(vec, vc->obedit->obmat, &ml->x);
+ project_short(vc->ar, vec, sco);
+
+ if(lasso_inside(mcords, moves, sco[0], sco[1])) {
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
}
}
- ED_armature_sync_selection(arm->edbo);
- ED_armature_validate_active(arm);
}
-static void do_lasso_select_facemode(ViewContext *vc, short mcords[][2], short moves, short select)
+static void do_lasso_select_paintface(ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Object *ob= vc->obact;
Mesh *me= ob?ob->data:NULL;
rcti rect;
-
- if(me==NULL || me->mtface==NULL) return;
- if(me->totface==0) return;
-
- bm_vertoffs= me->totface+1; /* max index array */
-
+
+ if(me==NULL || me->totface==0)
+ return;
+
+ if(extend==0 && select)
+ paintface_deselect_all_visible(ob, SEL_DESELECT, FALSE); /* flush selection at the end */
+
+ bm_vertoffs= me->totpoly+1; /* max index array */
+
lasso_select_boundbox(&rect, mcords, moves);
EDBM_mask_init_backbuf_border(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
EDBM_backbuf_checkAndSelectTFaces(me, select);
-
+
EDBM_free_backbuf();
-
-// XXX object_tface_flags_changed(ob, 0);
+
+ paintface_flush_flags(ob);
}
#if 0
@@ -714,47 +794,55 @@ static void do_lasso_select_node(short mcords[][2], short moves, short select)
}
#endif
-void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short moves, short select)
+static void view3d_lasso_select(bContext *C, ViewContext *vc, short mcords[][2], short moves, short extend, short select)
{
Object *ob = CTX_data_active_object(C);
if(vc->obedit==NULL) { /* Object Mode */
if(paint_facesel_test(ob))
- do_lasso_select_facemode(vc, mcords, moves, select);
+ do_lasso_select_paintface(vc, mcords, moves, extend, select);
else if(ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))
;
else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT)
- PE_lasso_select(C, mcords, moves, select);
- else
- do_lasso_select_objects(vc, mcords, moves, select);
+ PE_lasso_select(C, mcords, moves, extend, select);
+ else {
+ do_lasso_select_objects(vc, mcords, moves, extend, select);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, vc->scene);
+ }
}
else { /* Edit Mode */
- if(vc->obedit->type==OB_MESH)
- do_lasso_select_mesh(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_CURVE || vc->obedit->type==OB_SURF)
- do_lasso_select_curve(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_LATTICE)
- do_lasso_select_lattice(vc, mcords, moves, select);
- else if(vc->obedit->type==OB_ARMATURE)
- do_lasso_select_armature(vc, mcords, moves, select);
-
+ switch(vc->obedit->type) {
+ case OB_MESH:
+ do_lasso_select_mesh(vc, mcords, moves, extend, select);
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ do_lasso_select_curve(vc, mcords, moves, extend, select);
+ break;
+ case OB_LATTICE:
+ do_lasso_select_lattice(vc, mcords, moves, extend, select);
+ break;
+ case OB_ARMATURE:
+ do_lasso_select_armature(vc, mcords, moves, extend, select);
+ break;
+ case OB_MBALL:
+ do_lasso_select_meta(vc, mcords, moves, extend, select);
+ break;
+ default:
+ assert(!"lasso select on incorrect object type");
+ }
+
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc->obedit->data);
}
}
-static EnumPropertyItem lasso_select_types[] = {
- {0, "SELECT", 0, "Select", ""},
- {1, "DESELECT", 0, "Deselect", ""},
- {0, NULL, 0, NULL, NULL}
-};
-
/* lasso operator gives properties, but since old code works
with short array we convert */
static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
{
ViewContext vc;
- int select, i= 0;
+ int i= 0;
short mcords[1024][2];
RNA_BEGIN(op->ptr, itemptr, "path") {
@@ -769,13 +857,15 @@ static int view3d_lasso_select_exec(bContext *C, wmOperator *op)
RNA_END;
if(i>1) {
+ short extend, select;
view3d_operator_needs_opengl(C);
/* setup view context for argument to callbacks */
view3d_set_viewcontext(C, &vc);
- select= RNA_enum_is_equal(C, op->ptr, "type", "SELECT");
- view3d_lasso_select(C, &vc, mcords, i, select);
+ extend= RNA_boolean_get(op->ptr, "extend");
+ select= !RNA_boolean_get(op->ptr, "deselect");
+ view3d_lasso_select(C, &vc, mcords, i, extend, select);
return OPERATOR_FINISHED;
}
@@ -791,13 +881,14 @@ void VIEW3D_OT_select_lasso(wmOperatorType *ot)
ot->invoke= WM_gesture_lasso_invoke;
ot->modal= WM_gesture_lasso_modal;
ot->exec= view3d_lasso_select_exec;
- ot->poll= WM_operator_winactive;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
RNA_def_collection_runtime(ot->srna, "path", &RNA_OperatorMousePath, "Path", "");
- RNA_def_enum(ot->srna, "type", lasso_select_types, 0, "Type", "");
+ RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect rather than select items.");
+ RNA_def_boolean(ot->srna, "extend", 1, "Extend", "Extend selection instead of deselecting everything first.");
}
@@ -922,7 +1013,7 @@ static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffe
}
else {
/* UI */
- uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", 0);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", ICON_NULL);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayout *split= uiLayoutSplit(layout, 0, 0);
uiLayout *column= uiLayoutColumn(split, 0);
@@ -942,7 +1033,7 @@ static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffe
WM_operator_properties_create(&ptr, "OBJECT_OT_select_name");
RNA_string_set(&ptr, "name", name);
RNA_boolean_set(&ptr, "extend", extend);
- uiItemFullO(column, name, uiIconFromID((ID *)ob), "OBJECT_OT_select_name", ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(column, "OBJECT_OT_select_name", name, uiIconFromID((ID *)ob), ptr.data, WM_OP_EXEC_DEFAULT, 0);
}
node= node->next;
@@ -1060,7 +1151,7 @@ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int
base= FIRSTBASE;
while(base) {
- if(base->lay & v3d->lay) {
+ if(BASE_SELECTABLE(v3d, base)) {
if(base->selcol==selcol) break;
}
base= base->next;
@@ -1079,7 +1170,7 @@ static Base *mouse_select_eval_buffer(ViewContext *vc, unsigned int *buffer, int
if(base==startbase) break;
}
- if(base->lay & v3d->lay) {
+ if(BASE_SELECTABLE(v3d, base)) {
for(a=0; a<hits; a++) {
if(has_bones) {
/* skip non-bone objects */
@@ -1288,16 +1379,17 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
return 0;
}
-static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void do_nurbs_box_select__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext vc; rcti *rect; int select; } *data = userData;
+ struct { ViewContext *vc; rcti *rect; int select; } *data = userData;
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
if (BLI_in_rcti(data->rect, x, y)) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- Curve *cu= data->vc.obedit->data;
-
if (cu->drawflag & CU_HIDE_HANDLES) {
/* can only be beztindex==0 here since handles are hidden */
bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
@@ -1310,23 +1402,26 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
}
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
-static void do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- struct { ViewContext vc; rcti *rect; int select; } data;
+ struct { ViewContext *vc; rcti *rect; int select; } data;
- data.vc = *vc;
+ data.vc = vc;
data.rect = rect;
data.select = select;
- if (extend == 0 && select) {
+ if (extend == 0 && select)
CU_deselect_all(vc->obedit);
- }
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, do_nurbs_box_select__doSelect, &data);
+
+ return OPERATOR_FINISHED;
}
static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, int y)
@@ -1337,7 +1432,7 @@ static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, i
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
struct { ViewContext vc; rcti *rect; int select, pass, done; } data;
@@ -1345,20 +1440,21 @@ static void do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int e
data.rect = rect;
data.select = select;
- if (extend == 0 && select) {
+ if (extend == 0 && select)
ED_setflagsLatt(vc->obedit, 0);
- }
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
lattice_foreachScreenVert(vc, do_lattice_box_select__doSelect, &data);
+
+ return OPERATOR_FINISHED;
}
-static void do_mesh_box_select__doSelectVert(void *userData, BMVert *eve, int x, int y, int index)
+static void do_mesh_box_select__doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_Select_Vert(data->vc.em->bm, eve, data->select);
+ BM_Select(data->vc.em->bm, eve, data->select);
}
}
static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
@@ -1368,32 +1464,28 @@ static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0
if(EDBM_check_backbuf(bm_solidoffs+index)) {
if (data->pass==0) {
if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_Select_Edge(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc.em->bm, eed, data->select);
data->done = 1;
}
} else {
if (edge_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_Select_Edge(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc.em->bm, eed, data->select);
}
}
}
}
-
-static void
-do_mesh_box_select__doSelectFace(void *userData, BMFace
- *efa, int x, int y,
- int index)
-
+static void do_mesh_box_select__doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_Select_Face(data->vc.em->bm, efa, data->select);
+ BM_Select(data->vc.em->bm, efa, data->select);
}
}
-static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
+static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
struct { ViewContext vc; rcti *rect; short select, pass, done; } data;
+ ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
data.vc= *vc;
@@ -1403,9 +1495,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
data.done = 0;
if (extend == 0 && select)
- {
EDBM_clear_flag_all(vc->em, BM_SELECT);
- }
/* workaround: init mats first, EM_mask_init_backbuf_border can change
view matrix to pixel space, breaking edge select with backbuf. fixes bug #20936 */
@@ -1417,7 +1507,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
glLoadMatrixf(vc->rv3d->viewmat);
bbsel= EDBM_init_backbuf_border(vc, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_VERTEX) {
+ if(ts->selectmode & SCE_SELECT_VERTEX) {
if (bbsel) {
EDBM_backbuf_checkAndSelectVerts(vc->em, select);
} else {
@@ -1425,7 +1515,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
mesh_foreachScreenVert(vc, do_mesh_box_select__doSelectVert, &data, 1);
}
}
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_EDGE) {
+ if(ts->selectmode & SCE_SELECT_EDGE) {
/* Does both bbsel and non-bbsel versions (need screen cos for both) */
data.pass = 0;
@@ -1437,7 +1527,7 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
}
}
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_FACE) {
+ if(ts->selectmode & SCE_SELECT_FACE) {
if(bbsel) {
EDBM_backbuf_checkAndSelectFaces(vc->em, select);
} else {
@@ -1449,264 +1539,289 @@ static void do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int exte
EDBM_free_backbuf();
EDBM_selectmode_flush(vc->em);
+
+ return OPERATOR_FINISHED;
}
-static int view3d_borderselect_exec(bContext *C, wmOperator *op)
+static int do_meta_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- ViewContext vc;
- Scene *scene= CTX_data_scene(C);
- ScrArea *sa= CTX_wm_area(C);
- View3D *v3d= sa->spacedata.first;
- Object *obedit= CTX_data_edit_object(C);
- Object *obact= CTX_data_active_object(C);
- rcti rect;
- Base *base;
+ MetaBall *mb = (MetaBall*)vc->obedit->data;
MetaElem *ml;
+ int a;
+
unsigned int buffer[4*MAXPICKBUF];
- int a, index;
- int extend;
- short hits, selecting;
+ short hits;
- view3d_operator_needs_opengl(C);
-
- /* setup view context for argument to callbacks */
- view3d_set_viewcontext(C, &vc);
-
- selecting= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
- rect.xmin= RNA_int_get(op->ptr, "xmin");
- rect.ymin= RNA_int_get(op->ptr, "ymin");
- rect.xmax= RNA_int_get(op->ptr, "xmax");
- rect.ymax= RNA_int_get(op->ptr, "ymax");
- extend = RNA_boolean_get(op->ptr, "extend");
+ hits= view3d_opengl_select(vc, buffer, MAXPICKBUF, rect);
- if(obedit==NULL && (paint_facesel_test(OBACT))) {
- face_borderselect(C, obact, &rect, selecting, extend);
- return OPERATOR_FINISHED;
- }
- else if(obedit==NULL && (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
- return PE_border_select(C, &rect, selecting, extend);
+ if (extend == 0 && select) {
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ ml->flag &= ~SELECT;
+ }
}
- else if(obedit==NULL && (obact && obact->mode & OB_MODE_SCULPT))
- return OPERATOR_CANCELLED;
- if(obedit) {
- if(obedit->type==OB_MESH) {
- Mesh *me= obedit->data;
- vc.em= me->edit_btmesh;
- do_mesh_box_select(&vc, &rect, selecting, extend);
-// if (EDBM_texFaceCheck())
- WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
-
- }
- else if(ELEM(obedit->type, OB_CURVE, OB_SURF)) {
- do_nurbs_box_select(&vc, &rect, selecting, extend);
- }
- else if(obedit->type==OB_MBALL) {
- MetaBall *mb = (MetaBall*)obedit->data;
- hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
-
- if (extend == 0 && selecting) {
- ml= mb->editelems->first;
-
- while(ml) {
- ml->flag &= ~SELECT;
- ml= ml->next;
- }
+ for(ml= mb->editelems->first; ml; ml= ml->next) {
+ for(a=0; a<hits; a++) {
+ if(ml->selcol1==buffer[ (4 * a) + 3 ]) {
+ ml->flag |= MB_SCALE_RAD;
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
+ break;
}
-
- ml= mb->editelems->first;
-
- while(ml) {
- for(a=0; a<hits; a++) {
- if(ml->selcol1==buffer[ (4 * a) + 3 ]) {
- ml->flag |= MB_SCALE_RAD;
- if(selecting) ml->flag |= SELECT;
- else ml->flag &= ~SELECT;
- break;
- }
- if(ml->selcol2==buffer[ (4 * a) + 3 ]) {
- ml->flag &= ~MB_SCALE_RAD;
- if(selecting) ml->flag |= SELECT;
- else ml->flag &= ~SELECT;
- break;
- }
- }
- ml= ml->next;
+ if(ml->selcol2==buffer[ (4 * a) + 3 ]) {
+ ml->flag &= ~MB_SCALE_RAD;
+ if(select) ml->flag |= SELECT;
+ else ml->flag &= ~SELECT;
+ break;
}
}
- else if(obedit->type==OB_ARMATURE) {
- bArmature *arm= obedit->data;
- EditBone *ebone;
-
- /* clear flag we use to detect point was affected */
- for(ebone= arm->edbo->first; ebone; ebone= ebone->next)
- ebone->flag &= ~BONE_DONE;
-
- if (extend==0 && selecting) {
- /* Set the flags */
- CTX_DATA_BEGIN(C, EditBone *, ebone, visible_bones) {
- /* ignore bone if selection can't change */
- if ((ebone->flag & BONE_UNSELECTABLE) == 0) {
- ebone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
- }
- CTX_DATA_END;
- }
+ }
- hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
-
- /* first we only check points inside the border */
- for (a=0; a<hits; a++){
- index = buffer[(4*a)+3];
- if (index!=-1) {
- ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
- if (index & BONESEL_TIP) {
- ebone->flag |= BONE_DONE;
- if (selecting) ebone->flag |= BONE_TIPSEL;
- else ebone->flag &= ~BONE_TIPSEL;
- }
-
- if (index & BONESEL_ROOT) {
- ebone->flag |= BONE_DONE;
- if (selecting) ebone->flag |= BONE_ROOTSEL;
- else ebone->flag &= ~BONE_ROOTSEL;
- }
+ return OPERATOR_FINISHED;
+}
+
+static int do_armature_box_select(ViewContext *vc, rcti *rect, short select, short extend)
+{
+ bArmature *arm= vc->obedit->data;
+ EditBone *ebone;
+ int a;
+
+ unsigned int buffer[4*MAXPICKBUF];
+ short hits;
+
+ hits= view3d_opengl_select(vc, buffer, MAXPICKBUF, rect);
+
+ /* clear flag we use to detect point was affected */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next)
+ ebone->flag &= ~BONE_DONE;
+
+ if (extend==0 && select)
+ ED_armature_deselect_all_visible(vc->obedit);
+
+ /* first we only check points inside the border */
+ for (a=0; a<hits; a++){
+ int index = buffer[(4*a)+3];
+ if (index!=-1) {
+ ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
+ if ((ebone->flag & BONE_UNSELECTABLE)==0) {
+ if (index & BONESEL_TIP) {
+ ebone->flag |= BONE_DONE;
+ if (select) ebone->flag |= BONE_TIPSEL;
+ else ebone->flag &= ~BONE_TIPSEL;
}
- }
-
- /* now we have to flush tag from parents... */
- for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
- if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
- if(ebone->parent->flag & BONE_DONE)
- ebone->flag |= BONE_DONE;
+
+ if (index & BONESEL_ROOT) {
+ ebone->flag |= BONE_DONE;
+ if (select) ebone->flag |= BONE_ROOTSEL;
+ else ebone->flag &= ~BONE_ROOTSEL;
}
}
-
- /* only select/deselect entire bones when no points where in the rect */
- for (a=0; a<hits; a++){
- index = buffer[(4*a)+3];
- if (index!=-1) {
- ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
- if (index & BONESEL_BONE) {
- if(!(ebone->flag & BONE_DONE)) {
- if (selecting)
- ebone->flag |= (BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
- else
- ebone->flag &= ~(BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
- }
+ }
+ }
+
+ /* now we have to flush tag from parents... */
+ for(ebone= arm->edbo->first; ebone; ebone= ebone->next) {
+ if(ebone->parent && (ebone->flag & BONE_CONNECTED)) {
+ if(ebone->parent->flag & BONE_DONE)
+ ebone->flag |= BONE_DONE;
+ }
+ }
+
+ /* only select/deselect entire bones when no points where in the rect */
+ for (a=0; a<hits; a++){
+ int index = buffer[(4*a)+3];
+ if (index!=-1) {
+ ebone = BLI_findlink(arm->edbo, index & ~(BONESEL_ANY));
+ if (index & BONESEL_BONE) {
+ if ((ebone->flag & BONE_UNSELECTABLE)==0) {
+ if(!(ebone->flag & BONE_DONE)) {
+ if (select)
+ ebone->flag |= (BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
+ else
+ ebone->flag &= ~(BONE_ROOTSEL|BONE_TIPSEL|BONE_SELECTED);
}
}
}
-
- }
- else if(obedit->type==OB_LATTICE) {
- do_lattice_box_select(&vc, &rect, selecting, extend);
}
}
- else { /* no editmode, unified for bones and objects */
- Bone *bone;
- Object *ob= OBACT;
- unsigned int *vbuffer=NULL; /* selection buffer */
- unsigned int *col; /* color in buffer */
- int bone_only;
- int totobj= MAXPICKBUF; // XXX solve later
-
- if((ob) && (ob->mode & OB_MODE_POSE))
- bone_only= 1;
- else
- bone_only= 0;
-
- if (extend == 0 && selecting) {
- base= FIRSTBASE;
+
+ ED_armature_sync_selection(arm->edbo);
+
+ return OPERATOR_CANCELLED;
+}
- if (bone_only) {
- CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) {
+static int do_object_pose_box_select(bContext *C, ViewContext *vc, rcti *rect, int select, int extend)
+{
+ Bone *bone;
+ Object *ob= vc->obact;
+ unsigned int *vbuffer=NULL; /* selection buffer */
+ unsigned int *col; /* color in buffer */
+ int bone_only;
+ int bone_selected=0;
+ int totobj= MAXPICKBUF; // XXX solve later
+ short hits;
+
+ if((ob) && (ob->mode & OB_MODE_POSE))
+ bone_only= 1;
+ else
+ bone_only= 0;
+
+ if (extend == 0 && select) {
+ if (bone_only) {
+ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, visible_pose_bones) {
+ if ((pchan->bone->flag & BONE_UNSELECTABLE)==0) {
pchan->bone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
}
- CTX_DATA_END;
- } else {
- while(base) {
- Base *next = base->next;
- if(base->lay & v3d->lay) {
- ED_base_object_select(base, BA_DESELECT);
- }
- base= next;
- }
}
+ CTX_DATA_END;
+ } else {
+ object_deselect_all_visible(vc->scene, vc->v3d);
}
+ }
- /* selection buffer now has bones potentially too, so we add MAXPICKBUF */
- vbuffer = MEM_mallocN(4 * (totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
- hits= view3d_opengl_select(&vc, vbuffer, 4*(totobj+MAXPICKBUF), &rect);
- /*
- LOGIC NOTES (theeth):
- The buffer and ListBase have the same relative order, which makes the selection
- very simple. Loop through both data sets at the same time, if the color
- is the same as the object, we have a hit and can move to the next color
- and object pair, if not, just move to the next object,
- keeping the same color until we have a hit.
-
- The buffer order is defined by OGL standard, hopefully no stupid GFX card
- does it incorrectly.
- */
-
- if (hits>0) { /* no need to loop if there's no hit */
- base= FIRSTBASE;
- col = vbuffer + 3;
-
- while(base && hits) {
- Base *next = base->next;
- if(base->lay & v3d->lay) {
- while (base->selcol == (*col & 0xFFFF)) { /* we got an object */
-
- if(*col & 0xFFFF0000) { /* we got a bone */
- bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
- if(bone) {
- if(selecting) {
+ /* selection buffer now has bones potentially too, so we add MAXPICKBUF */
+ vbuffer = MEM_mallocN(4 * (totobj+MAXPICKBUF) * sizeof(unsigned int), "selection buffer");
+ hits= view3d_opengl_select(vc, vbuffer, 4*(totobj+MAXPICKBUF), rect);
+ /*
+ LOGIC NOTES (theeth):
+ The buffer and ListBase have the same relative order, which makes the selection
+ very simple. Loop through both data sets at the same time, if the color
+ is the same as the object, we have a hit and can move to the next color
+ and object pair, if not, just move to the next object,
+ keeping the same color until we have a hit.
+
+ The buffer order is defined by OGL standard, hopefully no stupid GFX card
+ does it incorrectly.
+ */
+
+ if (hits>0) { /* no need to loop if there's no hit */
+ Base *base;
+ col = vbuffer + 3;
+
+ for(base= vc->scene->base.first; base && hits; base= base->next) {
+ if(BASE_SELECTABLE(vc->v3d, base)) {
+ while (base->selcol == (*col & 0xFFFF)) { /* we got an object */
+
+ if(*col & 0xFFFF0000) { /* we got a bone */
+ bone = get_indexed_bone(base->object, *col & ~(BONESEL_ANY));
+ if(bone) {
+ if(select) {
+ if ((bone->flag & BONE_UNSELECTABLE)==0) {
bone->flag |= BONE_SELECTED;
+ bone_selected=1;
// XXX select_actionchannel_by_name(base->object->action, bone->name, 1);
}
- else {
- bArmature *arm= base->object->data;
- bone->flag &= ~BONE_SELECTED;
+ }
+ else {
+ bArmature *arm= base->object->data;
+ bone->flag &= ~BONE_SELECTED;
// XXX select_actionchannel_by_name(base->object->action, bone->name, 0);
- if(arm->act_bone==bone)
- arm->act_bone= NULL;
-
- }
+ if(arm->act_bone==bone)
+ arm->act_bone= NULL;
+
}
}
- else if(!bone_only) {
- if (selecting)
- ED_base_object_select(base, BA_SELECT);
- else
- ED_base_object_select(base, BA_DESELECT);
- }
-
- col+=4; /* next color */
- hits--;
- if(hits==0) break;
}
+ else if(!bone_only) {
+ if (select)
+ ED_base_object_select(base, BA_SELECT);
+ else
+ ED_base_object_select(base, BA_DESELECT);
+ }
+
+ col+=4; /* next color */
+ hits--;
+ if(hits==0) break;
}
-
- base= next;
}
+
+ if (bone_selected) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, base->object);
+ }
+ }
- WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
+ WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, vc->scene);
+ }
+ MEM_freeN(vbuffer);
+
+ return hits > 0 ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+}
+
+static int view3d_borderselect_exec(bContext *C, wmOperator *op)
+{
+ ViewContext vc;
+ rcti rect;
+ short extend;
+ short select;
+
+ int ret= OPERATOR_CANCELLED;
+
+ view3d_operator_needs_opengl(C);
+
+ /* setup view context for argument to callbacks */
+ view3d_set_viewcontext(C, &vc);
+
+ select= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
+ rect.xmin= RNA_int_get(op->ptr, "xmin");
+ rect.ymin= RNA_int_get(op->ptr, "ymin");
+ rect.xmax= RNA_int_get(op->ptr, "xmax");
+ rect.ymax= RNA_int_get(op->ptr, "ymax");
+ extend = RNA_boolean_get(op->ptr, "extend");
+
+ if(vc.obedit) {
+ switch(vc.obedit->type) {
+ case OB_MESH:
+ vc.em= ((Mesh *)vc.obedit->data)->edit_btmesh;
+ ret= do_mesh_box_select(&vc, &rect, select, extend);
+// if (EM_texFaceCheck())
+ if(ret & OPERATOR_FINISHED) {
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
+ }
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ ret= do_nurbs_box_select(&vc, &rect, select, extend);
+ break;
+ case OB_MBALL:
+ ret= do_meta_box_select(&vc, &rect, select, extend);
+ break;
+ case OB_ARMATURE:
+ ret= do_armature_box_select(&vc, &rect, select, extend);
+ if(ret & OPERATOR_FINISHED) {
+ WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, vc.obedit);
+ }
+ break;
+ case OB_LATTICE:
+ ret= do_lattice_box_select(&vc, &rect, select, extend);
+ if(ret & OPERATOR_FINISHED) {
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
+ }
+ break;
+ default:
+ assert(!"border select on incorrect object type");
}
- MEM_freeN(vbuffer);
}
- return OPERATOR_FINISHED;
+ else { /* no editmode, unified for bones and objects */
+ if(vc.obact && vc.obact->mode & OB_MODE_SCULPT) {
+ /* pass */
+ }
+ else if(vc.obact && paint_facesel_test(vc.obact)) {
+ ret= do_paintface_box_select(&vc, &rect, select, extend);
+ }
+ else if(vc.obact && vc.obact->mode & OB_MODE_PARTICLE_EDIT) {
+ ret= PE_border_select(C, &rect, select, extend);
+ }
+ else { /* object mode with none active */
+ ret= do_object_pose_box_select(C, &vc, &rect, select, extend);
+ }
+ }
+
+ return ret;
}
/* *****************Selection Operators******************* */
-static EnumPropertyItem prop_select_types[] = {
- {0, "EXCLUSIVE", 0, "Exclusive", ""},
- {1, "EXTEND", 0, "Extend", ""},
- {0, NULL, 0, NULL, NULL}
-};
/* ****** Border Select ****** */
void VIEW3D_OT_select_border(wmOperatorType *ot)
@@ -1720,8 +1835,7 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
ot->invoke= WM_border_select_invoke;
ot->exec= view3d_borderselect_exec;
ot->modal= WM_border_select_modal;
-
- ot->poll= ED_operator_view3d_active;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -1736,8 +1850,8 @@ void VIEW3D_OT_select_border(wmOperatorType *ot)
static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit= CTX_data_edit_object(C);
- short extend= RNA_boolean_get(op->ptr, "extend");
Object *obact= CTX_data_active_object(C);
+ short extend= RNA_boolean_get(op->ptr, "extend");
short center= RNA_boolean_get(op->ptr, "center");
short enumerate= RNA_boolean_get(op->ptr, "enumerate");
int retval = 0;
@@ -1762,7 +1876,7 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT)
return PE_mouse_particles(C, event->mval, extend);
else if(obact && paint_facesel_test(obact))
- retval = face_select(C, obact, event->mval, extend);
+ retval = paintface_mouse_select(C, obact, event->mval, extend);
else
retval = mouse_select(C, event->mval, extend, center, enumerate);
@@ -1798,127 +1912,138 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* -------------------- circle select --------------------------------------------- */
-static void mesh_circle_doSelectVert(void *userData, BMVert *eve, int x, int y, int index)
+static void mesh_circle_doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
if (r<=data->radius) {
- BM_Select_Vert(data->vc->em->bm, eve, data->select);
+ BM_Select(data->vc->em->bm, eve, data->select);
}
}
-static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
+static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
if (edge_inside_circle(data->mval[0], data->mval[1], (short) data->radius, x0, y0, x1, y1)) {
- BM_Select_Edge(data->vc->em->bm, eed, data->select);
+ BM_Select(data->vc->em->bm, eed, data->select);
}
}
-static void mesh_circle_doSelectFace(void *userData, BMFace *efa, int x, int y, int index)
+static void mesh_circle_doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
if (r<=data->radius) {
- BM_Select_Face(data->vc->em->bm, efa, data->select);
+ BM_Select(data->vc->em->bm, efa, data->select);
}
}
-static void mesh_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void mesh_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
+ ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
- Object *ob= vc->obact;
+ struct {ViewContext *vc; short select, mval[2]; float radius; } data;
- if(vc->obedit==NULL && paint_facesel_test(ob)) {
- Mesh *me = ob?ob->data:NULL;
+ bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
+ ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
- if (me) {
- bm_vertoffs= me->totface+1; /* max index array */
+ vc->em= ((Mesh *)vc->obedit->data)->edit_btmesh;
- //bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
- //BMESH_TODO EM_backbuf_checkAndSelectTFaces(me, selecting==LEFTMOUSE);
- //EDBM_free_backbuf();
+ data.vc = vc;
+ data.select = select;
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
-// XXX object_tface_flags_changed(OBACT, 0);
+ if(ts->selectmode & SCE_SELECT_VERTEX) {
+ if(bbsel) {
+ EDBM_backbuf_checkAndSelectVerts(vc->em, select==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, 1);
}
}
- else {
- struct {ViewContext *vc; short select, mval[2]; float radius; } data;
-
- bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
- vc->em= ((Mesh *)vc->obedit->data)->edit_btmesh;
- ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
-
- data.vc = vc;
- data.select = selecting;
- data.mval[0] = mval[0];
- data.mval[1] = mval[1];
- data.radius = rad;
- data.vc = vc;
-
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_VERTEX) {
- if(bbsel) {
- EDBM_backbuf_checkAndSelectVerts(vc->em, selecting==LEFTMOUSE);
- } else {
- mesh_foreachScreenVert(vc, mesh_circle_doSelectVert, &data, 1);
- }
- }
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_EDGE) {
- if (bbsel) {
- EDBM_backbuf_checkAndSelectEdges(vc->em, selecting==LEFTMOUSE);
- } else {
- mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, 0);
- }
+ if(ts->selectmode & SCE_SELECT_EDGE) {
+ if (bbsel) {
+ EDBM_backbuf_checkAndSelectEdges(vc->em, select==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenEdge(vc, mesh_circle_doSelectEdge, &data, 0);
}
-
- if(vc->scene->toolsettings->selectmode & SCE_SELECT_FACE) {
- if(bbsel) {
- EDBM_backbuf_checkAndSelectFaces(vc->em, selecting==LEFTMOUSE);
- } else {
- mesh_foreachScreenFace(vc, mesh_circle_doSelectFace, &data);
- }
+ }
+
+ if(ts->selectmode & SCE_SELECT_FACE) {
+ if(bbsel) {
+ EDBM_backbuf_checkAndSelectFaces(vc->em, select==LEFTMOUSE);
+ } else {
+ mesh_foreachScreenFace(vc, mesh_circle_doSelectFace, &data);
}
+ }
+
+ EDBM_free_backbuf();
+ EDBM_selectmode_flush(vc->em);
+}
+static void paint_facesel_circle_select(ViewContext *vc, int select, short *mval, float rad)
+{
+ Object *ob= vc->obact;
+ Mesh *me = ob?ob->data:NULL;
+ int bbsel;
+
+ if (me) {
+ bm_vertoffs= me->totface+1; /* max index array */
+
+ bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
+ EDBM_backbuf_checkAndSelectTFaces(me, select==LEFTMOUSE);
EDBM_free_backbuf();
- EDBM_selectmode_flush(vc->em);
}
}
-static void nurbscurve_circle_doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
+static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
+ Object *obedit= data->vc->obedit;
+ Curve *cu= (Curve*)obedit->data;
if (r<=data->radius) {
if (bp) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
+
+ if (bp == cu->lastsel && !(bp->f1 & 1)) cu->lastsel = NULL;
} else {
- if (beztindex==0) {
- bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
- } else if (beztindex==1) {
- bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ if (cu->drawflag & CU_HIDE_HANDLES) {
+ /* can only be beztindex==0 here since handles are hidden */
+ bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
} else {
- bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|SELECT):(bezt->f1&~SELECT);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|SELECT):(bezt->f2&~SELECT);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|SELECT):(bezt->f3&~SELECT);
+ }
}
+
+ if (bezt == cu->lastsel && !(bezt->f2 & 1)) cu->lastsel = NULL;
}
}
}
-static void nurbscurve_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void nurbscurve_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
/* set vc-> edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
+ data.vc = vc;
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
nurbs_foreachScreenVert(vc, nurbscurve_circle_doSelect, &data);
@@ -1935,13 +2060,13 @@ static void latticecurve_circle_doSelect(void *userData, BPoint *bp, int x, int
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
}
}
-static void lattice_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void lattice_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
/* set vc-> edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
@@ -1951,6 +2076,67 @@ static void lattice_circle_select(ViewContext *vc, int selecting, short *mval, f
}
+// NOTE: pose-bone case is copied from editbone case...
+static short pchan_circle_doSelectJoint(void *userData, bPoseChannel *pchan, int x, int y)
+{
+ struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
+ int mx = x - data->mval[0], my = y - data->mval[1];
+ float r = sqrt(mx*mx + my*my);
+
+ if (r <= data->radius) {
+ if (data->select)
+ pchan->bone->flag |= BONE_SELECTED;
+ else
+ pchan->bone->flag &= ~BONE_SELECTED;
+ return 1;
+ }
+ return 0;
+}
+static void pose_circle_select(ViewContext *vc, int select, short *mval, float rad)
+{
+ struct {ViewContext *vc; short select, mval[2]; float radius; } data;
+ bPose *pose = vc->obact->pose;
+ bPoseChannel *pchan;
+ int change= FALSE;
+
+ /* set vc->edit data */
+ data.select = select;
+ data.mval[0] = mval[0];
+ data.mval[1] = mval[1];
+ data.radius = rad;
+
+ ED_view3d_init_mats_rv3d(vc->obact, vc->rv3d); /* for foreach's screen/vert projection */
+
+ /* check each PoseChannel... */
+ // TODO: could be optimised at some point
+ for (pchan = pose->chanbase.first; pchan; pchan = pchan->next) {
+ short sco1[2], sco2[2], didpoint=0;
+ float vec[3];
+
+ /* project head location to screenspace */
+ mul_v3_m4v3(vec, vc->obact->obmat, pchan->pose_head);
+ project_short(vc->ar, vec, sco1);
+
+ /* project tail location to screenspace */
+ mul_v3_m4v3(vec, vc->obact->obmat, pchan->pose_tail);
+ project_short(vc->ar, vec, sco2);
+
+ /* check if the head and/or tail is in the circle
+ * - the call to check also does the selection already
+ */
+ if (pchan_circle_doSelectJoint(&data, pchan, sco1[0], sco1[1]))
+ didpoint= 1;
+ if (pchan_circle_doSelectJoint(&data, pchan, sco2[0], sco2[1]))
+ didpoint= 1;
+
+ change |= didpoint;
+ }
+
+ if (change) {
+ WM_main_add_notifier(NC_OBJECT|ND_BONE_SELECT, vc->obact);
+ }
+}
+
static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int x, int y, short head)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } *data = userData;
@@ -1974,14 +2160,15 @@ static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int
}
return 0;
}
-static void armature_circle_select(ViewContext *vc, int selecting, short *mval, float rad)
+static void armature_circle_select(ViewContext *vc, int select, short *mval, float rad)
{
struct {ViewContext *vc; short select, mval[2]; float radius; } data;
bArmature *arm= vc->obedit->data;
EditBone *ebone;
+ int change= FALSE;
/* set vc->edit data */
- data.select = selecting;
+ data.select = select;
data.mval[0] = mval[0];
data.mval[1] = mval[1];
data.radius = rad;
@@ -2013,33 +2200,40 @@ static void armature_circle_select(ViewContext *vc, int selecting, short *mval,
/* only if the endpoints didn't get selected, deal with the middle of the bone too */
// XXX should we just do this always?
if ( (didpoint==0) && edge_inside_circle(mval[0], mval[1], rad, sco1[0], sco1[1], sco2[0], sco2[1]) ) {
- if (selecting)
+ if (select)
ebone->flag |= BONE_TIPSEL|BONE_ROOTSEL|BONE_SELECTED;
else
ebone->flag &= ~(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL);
+ change= TRUE;
}
+
+ change |= didpoint;
}
- ED_armature_validate_active(arm);
+ if(change) {
+ ED_armature_sync_selection(arm->edbo);
+ ED_armature_validate_active(arm);
+ WM_main_add_notifier(NC_OBJECT|ND_BONE_SELECT, vc->obedit);
+ }
}
/** Callbacks for circle selection in Editmode */
-static void obedit_circle_select(ViewContext *vc, short selecting, short *mval, float rad)
+static void obedit_circle_select(ViewContext *vc, short select, short *mval, float rad)
{
switch(vc->obedit->type) {
case OB_MESH:
- mesh_circle_select(vc, selecting, mval, rad);
+ mesh_circle_select(vc, select, mval, rad);
break;
case OB_CURVE:
case OB_SURF:
- nurbscurve_circle_select(vc, selecting, mval, rad);
+ nurbscurve_circle_select(vc, select, mval, rad);
break;
case OB_LATTICE:
- lattice_circle_select(vc, selecting, mval, rad);
+ lattice_circle_select(vc, select, mval, rad);
break;
case OB_ARMATURE:
- armature_circle_select(vc, selecting, mval, rad);
+ armature_circle_select(vc, select, mval, rad);
break;
default:
return;
@@ -2057,12 +2251,14 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
int x= RNA_int_get(op->ptr, "x");
int y= RNA_int_get(op->ptr, "y");
int radius= RNA_int_get(op->ptr, "radius");
- int gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
- int selecting;
+ int gesture_mode= RNA_int_get(op->ptr, "gesture_mode");
+ int select;
- selecting= (gesture_mode==GESTURE_MODAL_SELECT);
+ select= (gesture_mode==GESTURE_MODAL_SELECT);
- if(CTX_data_edit_object(C) || (obact && obact->mode & OB_MODE_PARTICLE_EDIT)) {
+ if( CTX_data_edit_object(C) || paint_facesel_test(obact) ||
+ (obact && (obact->mode & (OB_MODE_PARTICLE_EDIT|OB_MODE_POSE))) )
+ {
ViewContext vc;
short mval[2];
@@ -2073,26 +2269,32 @@ static int view3d_circle_select_exec(bContext *C, wmOperator *op)
mval[1]= y;
if(CTX_data_edit_object(C)) {
- obedit_circle_select(&vc, selecting, mval, (float)radius);
+ obedit_circle_select(&vc, select, mval, (float)radius);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obact->data);
}
+ else if(paint_facesel_test(obact)) {
+ paint_facesel_circle_select(&vc, select, mval, (float)radius);
+ WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obact->data);
+ }
+ else if(obact->mode & OB_MODE_POSE)
+ pose_circle_select(&vc, select, mval, (float)radius);
else
- return PE_circle_select(C, selecting, mval, (float)radius);
+ return PE_circle_select(C, select, mval, (float)radius);
}
else if(obact && obact->mode & OB_MODE_SCULPT) {
return OPERATOR_CANCELLED;
}
else {
Base *base;
- selecting= selecting?BA_SELECT:BA_DESELECT;
+ select= select?BA_SELECT:BA_DESELECT;
for(base= FIRSTBASE; base; base= base->next) {
- if(base->lay & v3d->lay) {
+ if(BASE_SELECTABLE(v3d, base)) {
project_short(ar, base->object->obmat[3], &base->sx);
if(base->sx!=IS_CLIPPED) {
int dx= base->sx-x;
int dy= base->sy-y;
if( dx*dx + dy*dy < radius*radius)
- ED_base_object_select(base, selecting);
+ ED_base_object_select(base, select);
}
}
}
@@ -2112,7 +2314,7 @@ void VIEW3D_OT_select_circle(wmOperatorType *ot)
ot->invoke= WM_gesture_circle_invoke;
ot->modal= WM_gesture_circle_modal;
ot->exec= view3d_circle_select_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= view3d_selectable_data;
/* flags */
ot->flag= OPTYPE_UNDO;
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 48e38c6c419..04b097ba097 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -1,5 +1,5 @@
-/**
- * $Id: view3d_snap.c 18967 2009-02-14 13:07:09Z ton $
+/*
+ * $Id: view3d_snap.c 35106 2011-02-23 10:52:22Z jesterking $
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -32,26 +32,18 @@
#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 "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_context.h"
@@ -65,16 +57,11 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "RNA_access.h"
-#include "RNA_define.h"
-#include "UI_interface.h"
-#include "ED_anim_api.h"
#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"
@@ -97,13 +84,13 @@ static TransVert *transvmain=NULL;
static int tottrans= 0;
/* copied from editobject.c, now uses (almost) proper depgraph */
-static void special_transvert_update(Scene *scene, Object *obedit)
+static void special_transvert_update(Object *obedit)
{
if(obedit) {
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
-
+ DAG_id_tag_update(obedit->data, 0);
+
if(obedit->type==OB_MESH) {
Mesh *me= obedit->data;
BM_Compute_Normals(me->edit_btmesh->bm); // does face centers too
@@ -114,6 +101,37 @@ static void special_transvert_update(Scene *scene, Object *obedit)
Nurb *nu= nurbs->first;
while(nu) {
+ /* keep handles' vectors unchanged */
+ if(nu->bezt) {
+ int a= nu->pntsu;
+ TransVert *tv= transvmain;
+ BezTriple *bezt= nu->bezt;
+
+ while(a--) {
+ if(bezt->f1 & SELECT) tv++;
+
+ if(bezt->f2 & SELECT) {
+ float v[3];
+
+ if(bezt->f1 & SELECT) {
+ sub_v3_v3v3(v, (tv-1)->oldloc, tv->oldloc);
+ add_v3_v3v3(bezt->vec[0], bezt->vec[1], v);
+ }
+
+ if(bezt->f3 & SELECT) {
+ sub_v3_v3v3(v, (tv+1)->oldloc, tv->oldloc);
+ add_v3_v3v3(bezt->vec[2], bezt->vec[1], v);
+ }
+
+ tv++;
+ }
+
+ if(bezt->f3 & SELECT) tv++;
+
+ bezt++;
+ }
+ }
+
test2DNurb(nu);
testhandlesNurb(nu); /* test for bezier too */
nu= nu->next;
@@ -133,7 +151,7 @@ static void special_transvert_update(Scene *scene, Object *obedit)
float diffvec[3];
sub_v3_v3v3(diffvec, tv->loc, tv->oldloc);
- add_v3_v3v3(ebo->tail, ebo->tail, diffvec);
+ add_v3_v3(ebo->tail, diffvec);
a++;
if (a<tottrans) tv++;
@@ -167,7 +185,9 @@ static void special_transvert_update(Scene *scene, Object *obedit)
}
/* copied from editobject.c, needs to be replaced with new transform code still */
-/* mode: 1 = proportional, 2 = all joints (for bones only) */
+/* mode flags: */
+#define TM_ALL_JOINTS 1 /* all joints (for bones only) */
+#define TM_SKIP_HANDLES 2 /* skip handles when control point is selected (for curves only) */
static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
{
Nurb *nu;
@@ -176,7 +196,6 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
TransVert *tv=NULL;
MetaElem *ml;
BMVert *eve;
- BMIter iter;
EditBone *ebo;
float total, center[3], centroid[3];
int a;
@@ -190,6 +209,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
Mesh *me= obedit->data;
BMEditMesh *em= me->edit_btmesh;
BMesh *bm = em->bm;
+ BMIter iter;
int proptrans= 0;
// transform now requires awareness for select mode, so we tag the f1 flags in verts
@@ -281,7 +301,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
short rootok= (!(ebo->parent && (ebo->flag & BONE_CONNECTED) && ebo->parent->flag & BONE_TIPSEL));
if ((tipsel && rootsel) || (rootsel)) {
- /* Don't add the tip (unless mode & 2, for getting all joints),
+ /* Don't add the tip (unless mode & TM_ALL_JOINTS, for getting all joints),
* otherwise we get zero-length bones as tips will snap to the same
* location as heads.
*/
@@ -294,7 +314,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tottrans++;
}
- if ((mode & 2) && (tipsel)) {
+ if ((mode & TM_ALL_JOINTS) && (tipsel)) {
VECCOPY (tv->oldloc, ebo->tail);
tv->loc= ebo->tail;
tv->nor= NULL;
@@ -320,7 +340,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
ListBase *nurbs= ED_curve_editnurbs(cu);
for(nu= nurbs->first; nu; nu= nu->next) {
- if((nu->type & 7)==CU_BEZIER)
+ if(nu->type == CU_BEZIER)
totmalloc += 3*nu->pntsu;
else
totmalloc += nu->pntsu*nu->pntsv;
@@ -329,19 +349,23 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
nu= nurbs->first;
while(nu) {
- if((nu->type & 7)==CU_BEZIER) {
+ if(nu->type == CU_BEZIER) {
a= nu->pntsu;
bezt= nu->bezt;
while(a--) {
if(bezt->hide==0) {
- if((mode & 1) || (bezt->f1 & SELECT)) {
+ int skip_handle= 0;
+ if(bezt->f2 & SELECT)
+ skip_handle= mode & TM_SKIP_HANDLES;
+
+ if((bezt->f1 & SELECT) && !skip_handle) {
VECCOPY(tv->oldloc, bezt->vec[0]);
tv->loc= bezt->vec[0];
tv->flag= bezt->f1 & SELECT;
tv++;
tottrans++;
}
- if((mode & 1) || (bezt->f2 & SELECT)) {
+ if(bezt->f2 & SELECT) {
VECCOPY(tv->oldloc, bezt->vec[1]);
tv->loc= bezt->vec[1];
tv->val= &(bezt->alfa);
@@ -350,7 +374,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tv++;
tottrans++;
}
- if((mode & 1) || (bezt->f3 & SELECT)) {
+ if((bezt->f3 & SELECT) && !skip_handle) {
VECCOPY(tv->oldloc, bezt->vec[2]);
tv->loc= bezt->vec[2];
tv->flag= bezt->f3 & SELECT;
@@ -366,7 +390,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
bp= nu->bp;
while(a--) {
if(bp->hide==0) {
- if((mode & 1) || (bp->f1 & SELECT)) {
+ if(bp->f1 & SELECT) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
tv->val= &(bp->alfa);
@@ -409,10 +433,10 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
- tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts curve");
+ tv=transvmain= MEM_callocN(a*sizeof(TransVert), "maketransverts latt");
while(a--) {
- if((mode & 1) || (bp->f1 & SELECT)) {
+ if(bp->f1 & SELECT) {
if(bp->hide==0) {
copy_v3_v3(tv->oldloc, bp->vec);
tv->loc= bp->vec;
@@ -425,6 +449,13 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
}
}
+ if(!tottrans && transvmain) {
+ /* prevent memory leak. happens for curves/latticies due to */
+ /* difficult condition of adding points to trans data */
+ MEM_freeN(transvmain);
+ transvmain= NULL;
+ }
+
/* cent etc */
tv= transvmain;
total= 0.0;
@@ -444,7 +475,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
/* *********************** operators ******************** */
-static int snap_sel_to_grid(bContext *C, wmOperator *op)
+static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
{
extern float originmat[3][3]; /* XXX object.c */
Main *bmain= CTX_data_main(C);
@@ -472,17 +503,17 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
VECCOPY(vec, tv->loc);
mul_m3_v3(bmat, vec);
- add_v3_v3v3(vec, vec, obedit->obmat[3]);
+ add_v3_v3(vec, obedit->obmat[3]);
vec[0]= gridf*floor(.5+ vec[0]/gridf);
vec[1]= gridf*floor(.5+ vec[1]/gridf);
vec[2]= gridf*floor(.5+ vec[2]/gridf);
- sub_v3_v3v3(vec, vec, obedit->obmat[3]);
+ sub_v3_v3(vec, obedit->obmat[3]);
mul_m3_v3(imat, vec);
VECCOPY(tv->loc, vec);
}
- special_transvert_update(scene, obedit);
+ special_transvert_update(obedit);
MEM_freeN(transvmain);
transvmain= NULL;
@@ -511,7 +542,12 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
armature_loc_pose_to_bone(pchan, vec, vecN);
/* adjust location */
- VECCOPY(pchan->loc, vecN);
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= vecN[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[0]= vecN[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[0]= vecN[2];
}
/* if the bone has a parent and is connected to the parent,
* don't do anything - will break chain unless we do auto-ik.
@@ -523,7 +559,7 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -537,16 +573,14 @@ static int snap_sel_to_grid(bContext *C, wmOperator *op)
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 {
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
ob->loc[0]+= vec[0];
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
ob->loc[1]+= vec[1];
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
ob->loc[2]+= vec[2];
- }
-
+
/* auto-keyframing */
// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
@@ -565,11 +599,12 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection to Grid";
+ ot->description= "Snap selected item(s) to nearest grid node";
ot->idname= "VIEW3D_OT_snap_selected_to_grid";
/* api callbacks */
ot->exec= snap_sel_to_grid;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -577,7 +612,7 @@ void VIEW3D_OT_snap_selected_to_grid(wmOperatorType *ot)
/* *************************************************** */
-static int snap_sel_to_curs(bContext *C, wmOperator *op)
+static int snap_sel_to_curs(bContext *C, wmOperator *UNUSED(op))
{
extern float originmat[3][3]; /* XXX object.c */
Main *bmain= CTX_data_main(C);
@@ -602,15 +637,12 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
- vec[0]= curs[0]-obedit->obmat[3][0];
- vec[1]= curs[1]-obedit->obmat[3][1];
- vec[2]= curs[2]-obedit->obmat[3][2];
-
+ sub_v3_v3v3(vec, curs, obedit->obmat[3]);
mul_m3_v3(imat, vec);
- VECCOPY(tv->loc, vec);
+ copy_v3_v3(tv->loc, vec);
}
- special_transvert_update(scene, obedit);
+ special_transvert_update(obedit);
MEM_freeN(transvmain);
transvmain= NULL;
@@ -636,8 +668,13 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
/* get location of cursor in bone-space */
armature_loc_pose_to_bone(pchan, cursp, curspn);
- /* calculate new position */
- VECCOPY(pchan->loc, curspn);
+ /* copy new position */
+ if ((pchan->protectflag & OB_LOCK_LOCX)==0)
+ pchan->loc[0]= curspn[0];
+ if ((pchan->protectflag & OB_LOCK_LOCY)==0)
+ pchan->loc[1]= curspn[1];
+ if ((pchan->protectflag & OB_LOCK_LOCZ)==0)
+ pchan->loc[2]= curspn[2];
}
/* if the bone has a parent and is connected to the parent,
* don't do anything - will break chain unless we do auto-ik.
@@ -649,7 +686,7 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
/* auto-keyframing */
// XXX autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
- DAG_id_flush_update(ob->data, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -663,15 +700,14 @@ static int snap_sel_to_curs(bContext *C, wmOperator *op)
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 {
+ if ((ob->protectflag & OB_LOCK_LOCX)==0)
ob->loc[0]+= vec[0];
+ if ((ob->protectflag & OB_LOCK_LOCY)==0)
ob->loc[1]+= vec[1];
+ if ((ob->protectflag & OB_LOCK_LOCZ)==0)
ob->loc[2]+= vec[2];
- }
+
/* auto-keyframing */
// XXX autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
@@ -690,6 +726,7 @@ void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection to Cursor";
+ ot->description= "Snap selected item(s) to cursor";
ot->idname= "VIEW3D_OT_snap_selected_to_cursor";
/* api callbacks */
@@ -702,7 +739,7 @@ void VIEW3D_OT_snap_selected_to_cursor(wmOperatorType *ot)
/* *************************************************** */
-static int snap_curs_to_grid(bContext *C, wmOperator *op)
+static int snap_curs_to_grid(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
RegionView3D *rv3d= CTX_wm_region_data(C);
@@ -726,11 +763,12 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Grid";
+ ot->description= "Snap cursor to nearest grid node";
ot->idname= "VIEW3D_OT_snap_cursor_to_grid";
/* api callbacks */
ot->exec= snap_curs_to_grid;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= ED_operator_region_view3d_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -738,7 +776,7 @@ void VIEW3D_OT_snap_cursor_to_grid(wmOperatorType *ot)
/* **************************************************** */
-static int snap_curs_to_sel(bContext *C, wmOperator *op)
+static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Scene *scene= CTX_data_scene(C);
@@ -757,7 +795,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
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], 2);
+ make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS|TM_SKIP_HANDLES);
if(tottrans==0) return OPERATOR_CANCELLED;
copy_m3_m4(bmat, obedit->obmat);
@@ -766,8 +804,8 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
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);
+ add_v3_v3(vec, obedit->obmat[3]);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
}
@@ -784,17 +822,17 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
transvmain= NULL;
}
else {
- Object *ob= CTX_data_active_object(C);
+ Object *obact= CTX_data_active_object(C);
- if(ob && (ob->mode & OB_MODE_POSE)) {
- bArmature *arm= ob->data;
+ if(obact && (obact->mode & OB_MODE_POSE)) {
+ bArmature *arm= obact->data;
bPoseChannel *pchan;
- for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (pchan = obact->pose->chanbase.first; pchan; pchan=pchan->next) {
if(arm->layer & pchan->bone->layer) {
if(pchan->bone->flag & BONE_SELECTED) {
VECCOPY(vec, pchan->pose_head);
- mul_m4_v3(ob->obmat, vec);
- add_v3_v3v3(centroid, centroid, vec);
+ mul_m4_v3(obact->obmat, vec);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
count++;
}
@@ -802,9 +840,9 @@ static int snap_curs_to_sel(bContext *C, wmOperator *op)
}
}
else {
- CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
+ CTX_DATA_BEGIN(C, Object*, ob, selected_objects) {
VECCOPY(vec, ob->obmat[3]);
- add_v3_v3v3(centroid, centroid, vec);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
count++;
}
@@ -832,6 +870,7 @@ void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Selected";
+ ot->description= "Snap cursor to center of selected item(s)";
ot->idname= "VIEW3D_OT_snap_cursor_to_selected";
/* api callbacks */
@@ -844,7 +883,7 @@ void VIEW3D_OT_snap_cursor_to_selected(wmOperatorType *ot)
/* ********************************************** */
-static int snap_curs_to_active(bContext *C, wmOperator *op)
+static int snap_curs_to_active(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_edit_object(C);
Object *obact= CTX_data_active_object(C);
@@ -882,6 +921,7 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Cursor to Active";
+ ot->description= "Snap cursor to active item";
ot->idname= "VIEW3D_OT_snap_cursor_to_active";
/* api callbacks */
@@ -892,221 +932,24 @@ void VIEW3D_OT_snap_cursor_to_active(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/* ************************************** */
-
-static int snap_selected_to_center(bContext *C, wmOperator *op)
+/* **************************************************** */
+/*New Code - Snap Cursor to Center -*/
+static int snap_curs_to_center(bContext *C, wmOperator *UNUSED(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);
- 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;
-
- 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 {
+ float *curs;
+ curs= give_cursor(scene, v3d);
- 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;
- }
+ curs[0]= 0.0;
+ curs[1]= 0.0;
+ curs[2]= 0.0;
- DAG_ids_flush_update(CTX_data_main(C), 0);
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
return OPERATOR_FINISHED;
}
-void VIEW3D_OT_snap_selected_to_center(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Snap Selection to Center";
- ot->idname= "VIEW3D_OT_snap_selected_to_center";
-
- /* api callbacks */
- ot->exec= snap_selected_to_center;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-}
-
-
-/* **************************************************** */
-/*New Code - Snap Cursor to Center -*/
-static int snap_curs_to_center(bContext *C, wmOperator *op)
-{
- Scene *scene= CTX_data_scene(C);
- View3D *v3d= CTX_wm_view3d(C);
- float *curs;
- curs= give_cursor(scene, v3d);
-
- curs[0]= 0.0;
- curs[1]= 0.0;
- curs[2]= 0.0;
-
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
-
- return OPERATOR_FINISHED;
-}
-
void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
{
@@ -1115,12 +958,12 @@ void VIEW3D_OT_snap_cursor_to_center(wmOperatorType *ot)
ot->description= "Snap cursor to the Center";
ot->idname= "VIEW3D_OT_snap_cursor_to_center";
- /* api callbacks */
- ot->exec= snap_curs_to_center;
- ot->poll= ED_operator_view3d_active;
+ /* api callbacks */
+ ot->exec= snap_curs_to_center;
+ ot->poll= ED_operator_view3d_active;
- /* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
/* **************************************************** */
@@ -1134,7 +977,7 @@ int minmax_verts(Object *obedit, float *min, float *max)
tottrans=0;
if ELEM5(obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE)
- make_trans_verts(obedit, bmat[0], bmat[1], 2);
+ make_trans_verts(obedit, bmat[0], bmat[1], TM_ALL_JOINTS);
if(tottrans==0) return 0;
@@ -1144,8 +987,8 @@ int minmax_verts(Object *obedit, float *min, float *max)
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);
+ add_v3_v3(vec, obedit->obmat[3]);
+ add_v3_v3(centroid, vec);
DO_MINMAX(vec, min, max);
}
@@ -1154,3 +997,4 @@ int minmax_verts(Object *obedit, float *min, float *max)
return 1;
}
+
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index c07d7d88944..3292c5d396c 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,6 +40,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_idprop.h"
@@ -63,27 +64,6 @@
/* ******************* view3d space & buttons ************** */
-
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- int retval;
-
- if (G.f & G_DEBUG)
- printf("operator redo %s\n", lastop->type->name);
- ED_undo_pop_op(C, lastop);
- retval= WM_operator_repeat(C, lastop);
- if((retval & OPERATOR_FINISHED)==0) {
- if (G.f & G_DEBUG)
- printf("operator redo failed %s\n", lastop->type->name);
- ED_undo_redo(C);
- }
- }
-}
-
static wmOperator *view3d_last_operator(const bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -99,22 +79,7 @@ static wmOperator *view3d_last_operator(const bContext *C)
static void view3d_panel_operator_redo_buts(const bContext *C, Panel *pa, wmOperator *op)
{
- wmWindowManager *wm= CTX_wm_manager(C);
- PointerRNA ptr;
-
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
- if(op->type->ui) {
- op->layout= pa->layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, pa->layout, &ptr, 1);
+ uiLayoutOperatorButs(C, pa->layout, op, NULL, 'V', 0);
}
static void view3d_panel_operator_redo_header(const bContext *C, Panel *pa)
@@ -129,7 +94,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm
{
if(op->type->flag & OPTYPE_MACRO) {
for(op= op->macro.first; op; op= op->next) {
- uiItemL(pa->layout, op->idname, 0);
+ uiItemL(pa->layout, op->type->name, ICON_NULL);
view3d_panel_operator_redo_operator(C, pa, op);
}
}
@@ -149,8 +114,12 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
return;
block= uiLayoutGetBlock(pa->layout);
+
+ if(ED_undo_valid(C, op->type->name)==0)
+ uiLayoutSetEnabled(pa->layout, 0);
- uiBlockSetFunc(block, redo_cb, op, NULL);
+ /* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
+ uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, op);
view3d_panel_operator_redo_operator(C, pa, op);
}
@@ -177,7 +146,7 @@ static void operator_call_cb(struct bContext *C, void *arg_listbase, void *arg2)
}
-static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -246,7 +215,7 @@ static void view3d_panel_tool_shelf(const bContext *C, Panel *pa)
for(ct= st->toolshelf.first; ct; ct= ct->next) {
if(0==strncmp(context, ct->context, OP_MAX_TYPENAME)) {
col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, ct->opname, NULL, 0, NULL, WM_OP_INVOKE_REGION_WIN, 0);
+ uiItemFullO(col, ct->opname, NULL, ICON_NULL, NULL, WM_OP_INVOKE_REGION_WIN, 0);
}
}
}
@@ -280,7 +249,7 @@ void view3d_tool_props_register(ARegionType *art)
/* ********** operator to open/close toolshelf region */
-static int view3d_toolshelf(bContext *C, wmOperator *op)
+static int view3d_toolshelf(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= view3d_has_tools_region(sa);
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 532c13314fd..794088de20c 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,12 +26,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-#include <float.h>
-
-#include "DNA_anim_types.h"
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
#include "DNA_scene_types.h"
@@ -40,9 +34,9 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_editVert.h"
-#include "BLI_rand.h"
+#include "BLI_rect.h"
+#include "BLI_listbase.h"
+#include "BLI_utildefines.h"
#include "BKE_anim.h"
#include "BKE_action.h"
@@ -52,25 +46,19 @@
#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_depsgraph.h" /* for fly mode updating */
-
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "GPU_draw.h"
+
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_keyframing.h"
#include "ED_screen.h"
#include "ED_armature.h"
-#include "GPU_draw.h"
-
-
-#include "PIL_time.h" /* smoothview */
-
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
#include "SYS_System.h"
#endif
@@ -81,15 +69,21 @@
opengl drawing context */
void view3d_operator_needs_opengl(const bContext *C)
{
+ wmWindow *win = CTX_wm_window(C);
ARegion *ar= CTX_wm_region(C);
+
+ view3d_region_operator_needs_opengl(win, ar);
+}
+void view3d_region_operator_needs_opengl(wmWindow *win, ARegion *ar)
+{
/* for debugging purpose, context should always be OK */
- if(ar->regiontype!=RGN_TYPE_WINDOW)
- printf("view3d_operator_needs_opengl error, wrong region\n");
+ if ((ar == NULL) || (ar->regiontype!=RGN_TYPE_WINDOW))
+ printf("view3d_region_operator_needs_opengl error, wrong region\n");
else {
RegionView3D *rv3d= ar->regiondata;
- wmSubWindowSet(CTX_wm_window(C), ar->swinid);
+ wmSubWindowSet(win, ar->swinid);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(rv3d->winmat);
glMatrixMode(GL_MODELVIEW);
@@ -153,8 +147,12 @@ void view3d_settings_from_ob(Object *ob, float *ofs, float *quat, float *dist, f
}
if (dist) {
- float vec[3] = {0.0f, 0.0f, -(*dist)};
float tquat[4];
+ float vec[3];
+
+ vec[0]= 0.0f;
+ vec[1]= 0.0f;
+ vec[2]= -(*dist);
mat4_to_quat(tquat, ob->obmat);
@@ -189,10 +187,10 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
- struct SmoothViewStore sms;
+ struct SmoothViewStore sms= {0};
+ short ok= FALSE;
/* initialize sms */
- memset(&sms,0,sizeof(struct SmoothViewStore));
copy_v3_v3(sms.new_ofs, rv3d->ofs);
copy_qt_qt(sms.new_quat, rv3d->viewquat);
sms.new_dist= rv3d->dist;
@@ -204,7 +202,7 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if(quat) copy_qt_qt(sms.new_quat, quat);
if(dist) sms.new_dist= *dist;
if(lens) sms.new_lens= *lens;
-
+
if (camera) {
view3d_settings_from_ob(camera, sms.new_ofs, sms.new_quat, &sms.new_dist, &sms.new_lens);
sms.to_camera= 1; /* restore view3d values in end */
@@ -213,15 +211,15 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
if (C && U.smooth_viewtx) {
int changed = 0; /* zero means no difference */
- if (sms.new_dist != rv3d->dist)
+ if (oldcamera != camera)
changed = 1;
- if (sms.new_lens != v3d->lens)
+ else if (sms.new_dist != rv3d->dist)
changed = 1;
-
- if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
+ else if (sms.new_lens != v3d->lens)
changed = 1;
-
- if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
+ else if (!equals_v3v3(sms.new_ofs, rv3d->ofs))
+ changed = 1;
+ else if (!equals_v4v4(sms.new_quat, rv3d->viewquat))
changed = 1;
/* The new view is different from the old one
@@ -280,22 +278,30 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
/* TIMER1 is hardcoded in keymap */
rv3d->smooth_timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER1, 1.0/100.0); /* max 30 frs/sec */
- return;
+ ok= TRUE;
}
}
/* if we get here nothing happens */
- if(sms.to_camera==0) {
- copy_v3_v3(rv3d->ofs, sms.new_ofs);
- copy_qt_qt(rv3d->viewquat, sms.new_quat);
- rv3d->dist = sms.new_dist;
- v3d->lens = sms.new_lens;
+ if(ok == FALSE) {
+ ARegion *ar= CTX_wm_region(C);
+
+ if(sms.to_camera==0) {
+ copy_v3_v3(rv3d->ofs, sms.new_ofs);
+ copy_qt_qt(rv3d->viewquat, sms.new_quat);
+ rv3d->dist = sms.new_dist;
+ v3d->lens = sms.new_lens;
+ }
+
+ if(rv3d->viewlock & RV3D_BOXVIEW)
+ view3d_boxview_copy(CTX_wm_area(C), ar);
+
+ ED_region_tag_redraw(ar);
}
- ED_region_tag_redraw(CTX_wm_region(C));
}
/* only meant for timer usage */
-static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -358,6 +364,9 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *op, wmEvent *event)
v3d->lens = sms->new_lens*step + sms->orig_lens*step_inv;
}
+ if(rv3d->viewlock & RV3D_BOXVIEW)
+ view3d_boxview_copy(CTX_wm_area(C), CTX_wm_region(C));
+
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d);
return OPERATOR_FINISHED;
@@ -379,7 +388,7 @@ void VIEW3D_OT_smoothview(wmOperatorType *ot)
/* ****************** change view operators ****************** */
-static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
+static void setcameratoview3d(RegionView3D *rv3d, Object *ob)
{
float dvec[3];
float mat3[3][3];
@@ -398,16 +407,18 @@ static void setcameratoview3d(View3D *v3d, RegionView3D *rv3d, Object *ob)
}
-static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
+static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
copy_qt_qt(rv3d->lviewquat, rv3d->viewquat);
rv3d->lview= rv3d->view;
- rv3d->lpersp= rv3d->persp;
+ if(rv3d->persp != RV3D_CAMOB) {
+ rv3d->lpersp= rv3d->persp;
+ }
- setcameratoview3d(v3d, rv3d, v3d->camera);
+ setcameratoview3d(rv3d, v3d->camera);
rv3d->persp = RV3D_CAMOB;
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, v3d->camera);
@@ -416,7 +427,7 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *op)
}
-int view3d_setcameratoview_poll(bContext *C)
+static int view3d_setcameratoview_poll(bContext *C)
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
@@ -443,25 +454,36 @@ void VIEW3D_OT_setcameratoview(wmOperatorType *ot)
}
-static int view3d_setobjectascamera_exec(bContext *C, wmOperator *op)
+static int view3d_setobjectascamera_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
Scene *scene= CTX_data_scene(C);
-
- if(BASACT) {
+ Object *ob = CTX_data_active_object(C);
+
+ if(ob) {
+ Object *camera_old= (rv3d->persp == RV3D_CAMOB && scene->camera) ? scene->camera : NULL;
rv3d->persp= RV3D_CAMOB;
- v3d->camera= OBACT;
+ v3d->camera= ob;
if(v3d->scenelock)
- scene->camera= OBACT;
- smooth_view(C, NULL, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
+ scene->camera= ob;
+
+ if(camera_old != ob) /* unlikely but looks like a glitch when set to the same */
+ smooth_view(C, camera_old, v3d->camera, rv3d->ofs, rv3d->viewquat, &rv3d->dist, &v3d->lens);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, CTX_data_scene(C));
}
- WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS|NC_OBJECT|ND_DRAW, CTX_data_scene(C));
-
return OPERATOR_FINISHED;
}
+static int region3d_unlocked_poll(bContext *C)
+{
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ return (rv3d && rv3d->viewlock==0);
+}
+
+
void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
{
@@ -472,7 +494,7 @@ void VIEW3D_OT_object_as_camera(wmOperatorType *ot)
/* api callbacks */
ot->exec= view3d_setobjectascamera_exec;
- ot->poll= ED_operator_view3d_active;
+ ot->poll= region3d_unlocked_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1052,6 +1074,17 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
if(cam) {
float dx= 0.5*fac*rv3d->camdx*(x2-x1);
float dy= 0.5*fac*rv3d->camdy*(y2-y1);
+
+ /* shift offset */
+ if(cam->type==CAM_ORTHO) {
+ dx += cam->shiftx * cam->ortho_scale;
+ dy += cam->shifty * cam->ortho_scale;
+ }
+ else {
+ dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0;
+ dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0;
+ }
+
x1+= dx;
x2+= dx;
y1+= dy;
@@ -1191,25 +1224,6 @@ static void view3d_viewlock(RegionView3D *rv3d)
}
}
-/* give a 4x4 matrix from a perspective view, only needs viewquat, ofs and dist
- * basically the same as...
- * rv3d->persp= RV3D_PERSP
- * setviewmatrixview3d(scene, v3d, rv3d);
- * setcameratoview3d(v3d, rv3d, v3d->camera);
- * ...but less of a hassle
- * */
-static void view3d_persp_mat4(RegionView3D *rv3d, float mat[][4])
-{
- float qt[4], dvec[3];
- copy_qt_qt(qt, rv3d->viewquat);
- qt[0]= -qt[0];
- quat_to_mat4(mat, qt);
- mat[3][2] -= rv3d->dist;
- translate_m4(mat, rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
- mul_v3_v3fl(dvec, mat[2], -rv3d->dist);
- sub_v3_v3v3(mat[3], dvec, rv3d->ofs);
-}
-
/* dont set windows active in in here, is used by renderwin too */
void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
{
@@ -1244,6 +1258,11 @@ void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
}
translate_m4( rv3d->viewmat,-vec[0], -vec[1], -vec[2]);
}
+ else if (v3d->ob_centre_cursor) {
+ float vec[3];
+ copy_v3_v3(vec, give_cursor(scene, v3d));
+ translate_m4(rv3d->viewmat, -vec[0], -vec[1], -vec[2]);
+ }
else translate_m4( rv3d->viewmat,rv3d->ofs[0], rv3d->ofs[1], rv3d->ofs[2]);
}
}
@@ -1529,7 +1548,6 @@ static void initlocalview(Main *bmain, Scene *scene, ScrArea *sa)
v3d->cursor[2]= -rv3d->ofs[2];
}
}
- if (v3d->near> 0.1) v3d->near= 0.1;
v3d->lay= locallay;
}
@@ -1616,7 +1634,7 @@ static void endlocalview(Scene *scene, ScrArea *sa)
}
}
-static int localview_exec(bContext *C, wmOperator *unused)
+static int localview_exec(bContext *C, wmOperator *UNUSED(unused))
{
View3D *v3d= CTX_wm_view3d(C);
@@ -1644,12 +1662,11 @@ void VIEW3D_OT_localview(wmOperatorType *ot)
ot->poll= ED_operator_view3d_active;
}
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
static ListBase queue_back;
-static void SaveState(bContext *C)
+static void SaveState(bContext *C, wmWindow *win)
{
- wmWindow *win= CTX_wm_window(C);
Object *obact = CTX_data_active_object(C);
glPushAttrib(GL_ALL_ATTRIB_BITS);
@@ -1664,9 +1681,8 @@ static void SaveState(bContext *C)
//XXX waitcursor(1);
}
-static void RestoreState(bContext *C)
+static void RestoreState(bContext *C, wmWindow *win)
{
- wmWindow *win= CTX_wm_window(C);
Object *obact = CTX_data_active_object(C);
if(obact && obact->mode & OB_MODE_TEXTURE_PAINT)
@@ -1680,9 +1696,11 @@ static void RestoreState(bContext *C)
//XXX waitcursor(0);
//XXX G.qual= 0;
- win->queue= queue_back;
+ if(win) /* check because closing win can set to NULL */
+ win->queue= queue_back;
GPU_state_init();
+ GPU_set_tpage(NULL, 0);
glPopAttrib();
}
@@ -1735,9 +1753,9 @@ void game_set_commmandline_options(GameData *gm)
/* maybe we need this defined somewhere else */
extern void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *cam_frame, int always_use_expand_framing);
-#endif // GAMEBLENDER == 1
+#endif // WITH_GAMEENGINE
-int game_engine_poll(bContext *C)
+static int game_engine_poll(bContext *C)
{
/* we need a context and area to launch BGE
it's a temporary solution to avoid crash at load time
@@ -1759,7 +1777,6 @@ int ED_view3d_context_activate(bContext *C)
bScreen *sc= CTX_wm_screen(C);
ScrArea *sa= CTX_wm_area(C);
ARegion *ar;
- RegionView3D *rv3d;
/* sa can be NULL when called from python */
if(sa==NULL || sa->spacetype != SPACE_VIEW3D)
@@ -1780,14 +1797,13 @@ int ED_view3d_context_activate(bContext *C)
// bad context switch ..
CTX_wm_area_set(C, sa);
CTX_wm_region_set(C, ar);
- rv3d= ar->regiondata;
return 1;
}
static int game_engine_exec(bContext *C, wmOperator *op)
{
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
Scene *startscene = CTX_data_scene(C);
ScrArea *sa, *prevsa= CTX_wm_area(C);
ARegion *ar, *prevar= CTX_wm_region(C);
@@ -1795,6 +1811,8 @@ static int game_engine_exec(bContext *C, wmOperator *op)
RegionView3D *rv3d;
rcti cam_frame;
+ (void)op; /* unused */
+
// bad context switch ..
if(!ED_view3d_context_activate(C))
return OPERATOR_CANCELLED;
@@ -1809,7 +1827,7 @@ static int game_engine_exec(bContext *C, wmOperator *op)
if(rv3d->persp==RV3D_CAMOB && startscene->gm.framing.type == SCE_GAMEFRAMING_BARS && startscene->gm.stereoflag != STEREO_DOME) { /* Letterbox */
rctf cam_framef;
- view3d_calc_camera_border(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef);
+ view3d_calc_camera_border(startscene, ar, rv3d, CTX_wm_view3d(C), &cam_framef, FALSE);
cam_frame.xmin = cam_framef.xmin + ar->winrct.xmin;
cam_frame.xmax = cam_framef.xmax + ar->winrct.xmin;
cam_frame.ymin = cam_framef.ymin + ar->winrct.ymin;
@@ -1824,16 +1842,25 @@ static int game_engine_exec(bContext *C, wmOperator *op)
}
- SaveState(C);
+ SaveState(C, prevwin);
StartKetsjiShell(C, ar, &cam_frame, 1);
+
+ /* window wasnt closed while the BGE was running */
+ if(BLI_findindex(&CTX_wm_manager(C)->windows, prevwin) == -1) {
+ prevwin= NULL;
+ CTX_wm_window_set(C, NULL);
+ }
- /* restore context, in case it changed in the meantime, for
- example by working in another window or closing it */
- CTX_wm_region_set(C, prevar);
- CTX_wm_window_set(C, prevwin);
- CTX_wm_area_set(C, prevsa);
- RestoreState(C);
+ if(prevwin) {
+ /* restore context, in case it changed in the meantime, for
+ example by working in another window or closing it */
+ CTX_wm_region_set(C, prevar);
+ CTX_wm_window_set(C, prevwin);
+ CTX_wm_area_set(C, prevsa);
+ }
+
+ RestoreState(C, prevwin);
//XXX restore_all_scene_cfra(scene_cfra_store);
set_scene_bg(CTX_data_main(C), startscene);
@@ -1843,6 +1870,7 @@ static int game_engine_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
#else
+ (void)C; /* unused */
BKE_report(op->reports, RPT_ERROR, "Game engine is disabled in this build.");
return OPERATOR_CANCELLED;
#endif
@@ -1862,852 +1890,6 @@ void VIEW3D_OT_game_start(wmOperatorType *ot)
ot->poll= game_engine_poll;
}
-
-/* NOTE: these defines are saved in keymap files, do not change values but just add new ones */
-#define FLY_MODAL_CANCEL 1
-#define FLY_MODAL_CONFIRM 2
-#define FLY_MODAL_ACCELERATE 3
-#define FLY_MODAL_DECELERATE 4
-#define FLY_MODAL_PAN_ENABLE 5
-#define FLY_MODAL_PAN_DISABLE 6
-#define FLY_MODAL_DIR_FORWARD 7
-#define FLY_MODAL_DIR_BACKWARD 8
-#define FLY_MODAL_DIR_LEFT 9
-#define FLY_MODAL_DIR_RIGHT 10
-#define FLY_MODAL_DIR_UP 11
-#define FLY_MODAL_DIR_DOWN 12
-#define FLY_MODAL_AXIS_LOCK_X 13
-#define FLY_MODAL_AXIS_LOCK_Z 14
-#define FLY_MODAL_PRECISION_ENABLE 15
-#define FLY_MODAL_PRECISION_DISABLE 16
-
-/* called in transform_ops.c, on each regeneration of keymaps */
-void fly_modal_keymap(wmKeyConfig *keyconf)
-{
- static EnumPropertyItem modal_items[] = {
- {FLY_MODAL_CANCEL, "CANCEL", 0, "Cancel", ""},
- {FLY_MODAL_CONFIRM, "CONFIRM", 0, "Confirm", ""},
- {FLY_MODAL_ACCELERATE, "ACCELERATE", 0, "Accelerate", ""},
- {FLY_MODAL_DECELERATE, "DECELERATE", 0, "Decelerate", ""},
-
- {FLY_MODAL_PAN_ENABLE, "PAN_ENABLE", 0, "Pan Enable", ""},
- {FLY_MODAL_PAN_DISABLE, "PAN_DISABLE", 0, "Pan Disable", ""},
-
- {FLY_MODAL_DIR_FORWARD, "FORWARD", 0, "Fly Forward", ""},
- {FLY_MODAL_DIR_BACKWARD,"BACKWARD", 0, "Fly Backward", ""},
- {FLY_MODAL_DIR_LEFT, "LEFT", 0, "Fly Left", ""},
- {FLY_MODAL_DIR_RIGHT, "RIGHT", 0, "Fly Right", ""},
- {FLY_MODAL_DIR_UP, "UP", 0, "Fly Up", ""},
- {FLY_MODAL_DIR_DOWN, "DOWN", 0, "Fly Down", ""},
-
- {FLY_MODAL_AXIS_LOCK_X, "AXIS_LOCK_X", 0, "X Axis Correction", "X axis correction (toggle)"},
- {FLY_MODAL_AXIS_LOCK_Z, "AXIS_LOCK_Z", 0, "X Axis Correction", "Z axis correction (toggle)"},
-
- {FLY_MODAL_PRECISION_ENABLE, "PRECISION_ENABLE", 0, "Precision Enable", ""},
- {FLY_MODAL_PRECISION_DISABLE, "PRECISION_DISABLE", 0, "Precision Disable", ""},
-
- {0, NULL, 0, NULL, NULL}};
-
- wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "View3D Fly Modal");
-
- /* this function is called for each spacetype, only needs to add map once */
- if(keymap) return;
-
- keymap= WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
-
- /* items for modal map */
- WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CANCEL);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CANCEL);
-
- WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_ANY, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, SPACEKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
- WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, FLY_MODAL_CONFIRM);
-
- WM_modalkeymap_add_item(keymap, PADPLUSKEY, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, PADMINUS, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
- WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, FLY_MODAL_ACCELERATE);
- WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, FLY_MODAL_DECELERATE);
-
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_PRESS, KM_ANY, 0, FLY_MODAL_PAN_ENABLE);
- WM_modalkeymap_add_item(keymap, MIDDLEMOUSE, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PAN_DISABLE); /* XXX - Bug in the event system, middle mouse release doesnt work */
-
- /* WASD */
- WM_modalkeymap_add_item(keymap, WKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_FORWARD);
- WM_modalkeymap_add_item(keymap, SKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_BACKWARD);
- WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_LEFT);
- WM_modalkeymap_add_item(keymap, DKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_RIGHT);
- WM_modalkeymap_add_item(keymap, RKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_UP);
- WM_modalkeymap_add_item(keymap, FKEY, KM_PRESS, 0, 0, FLY_MODAL_DIR_DOWN);
-
- WM_modalkeymap_add_item(keymap, XKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_X);
- WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, FLY_MODAL_AXIS_LOCK_Z);
-
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_PRESS, KM_ANY, 0, FLY_MODAL_PRECISION_ENABLE);
- WM_modalkeymap_add_item(keymap, LEFTSHIFTKEY, KM_RELEASE, KM_ANY, 0, FLY_MODAL_PRECISION_DISABLE);
-
- /* assign map to operators */
- WM_modalkeymap_assign(keymap, "VIEW3D_OT_fly");
-
-}
-
-typedef struct FlyInfo {
- /* context stuff */
- RegionView3D *rv3d;
- View3D *v3d;
- ARegion *ar;
- Scene *scene;
-
- wmTimer *timer; /* needed for redraws */
-
- short state;
- short use_precision;
- short redraw;
- short mval[2];
-
- /* fly state state */
- float speed; /* the speed the view is moving per redraw */
- short axis; /* Axis index to move allong by default Z to move allong the view */
- short pan_view; /* when true, pan the view instead of rotating */
-
- /* relative view axis locking - xlock, zlock
- 0; disabled
- 1; enabled but not checking because mouse hasnt moved outside the margin since locking was checked an not needed
- when the mouse moves, locking is set to 2 so checks are done.
- 2; mouse moved and checking needed, if no view altering is donem its changed back to 1 */
- short xlock, zlock;
- float xlock_momentum, zlock_momentum; /* nicer dynamics */
- float grid; /* world scale 1.0 default */
-
- /* root most parent */
- Object *root_parent;
-
- /* backup values */
- float dist_backup; /* backup the views distance since we use a zero dist for fly mode */
- float ofs_backup[3]; /* backup the views offset incase the user cancels flying in non camera mode */
- float rot_backup[4]; /* backup the views quat incase the user cancels flying in non camera mode. (quat for view, eul for camera) */
- short persp_backup; /* remember if were ortho or not, only used for restoring the view if it was a ortho view */
-
- void *obtfm; /* backup the objects transform */
-
- /* compare between last state */
- double time_lastwheel; /* used to accelerate when using the mousewheel a lot */
- double time_lastdraw; /* time between draws */
-
- /* use for some lag */
- float dvec_prev[3]; /* old for some lag */
-
-} FlyInfo;
-
-/* FlyInfo->state */
-#define FLY_RUNNING 0
-#define FLY_CANCEL 1
-#define FLY_CONFIRM 2
-
-static int initFlyInfo (bContext *C, FlyInfo *fly, wmOperator *op, wmEvent *event)
-{
- float upvec[3]; // tmp
- float mat[3][3];
-
- fly->rv3d= CTX_wm_region_view3d(C);
- fly->v3d = CTX_wm_view3d(C);
- fly->ar = CTX_wm_region(C);
- fly->scene= CTX_data_scene(C);
-
- if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->id.lib) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly a camera from an external library");
- return FALSE;
- }
-
- if(fly->v3d->ob_centre) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly when the view is locked to an object");
- return FALSE;
- }
-
- if(fly->rv3d->persp==RV3D_CAMOB && fly->v3d->camera->constraints.first) {
- BKE_report(op->reports, RPT_ERROR, "Cannot fly an object with constraints");
- return FALSE;
- }
-
- fly->state= FLY_RUNNING;
- fly->speed= 0.0f;
- fly->axis= 2;
- fly->pan_view= FALSE;
- fly->xlock= FALSE;
- fly->zlock= FALSE;
- fly->xlock_momentum=0.0f;
- fly->zlock_momentum=0.0f;
- fly->grid= 1.0f;
- fly->use_precision= 0;
-
- fly->dvec_prev[0]= fly->dvec_prev[1]= fly->dvec_prev[2]= 0.0f;
-
- fly->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
-
- fly->mval[0] = event->x - fly->ar->winrct.xmin;
- fly->mval[1] = event->y - fly->ar->winrct.ymin;
-
-
- fly->time_lastdraw= fly->time_lastwheel= PIL_check_seconds_timer();
-
- fly->rv3d->rflag |= RV3D_FLYMODE|RV3D_NAVIGATING; /* so we draw the corner margins */
-
- /* detect weather to start with Z locking */
- upvec[0]=1.0f; upvec[1]=0.0f; upvec[2]=0.0f;
- copy_m3_m4(mat, fly->rv3d->viewinv);
- mul_m3_v3(mat, upvec);
- if (fabs(upvec[2]) < 0.1)
- fly->zlock = 1;
- upvec[0]=0; upvec[1]=0; upvec[2]=0;
-
- fly->persp_backup= fly->rv3d->persp;
- fly->dist_backup= fly->rv3d->dist;
- if (fly->rv3d->persp==RV3D_CAMOB) {
- Object *ob_back;
- if((fly->root_parent=fly->v3d->camera->parent)) {
- while(fly->root_parent->parent)
- fly->root_parent= fly->root_parent->parent;
- ob_back= fly->root_parent;
- }
- else {
- ob_back= fly->v3d->camera;
- }
-
- /* store the original camera loc and rot */
- /* TODO. axis angle etc */
-
- fly->obtfm= object_tfm_backup(ob_back);
-
- where_is_object(fly->scene, fly->v3d->camera);
- negate_v3_v3(fly->rv3d->ofs, fly->v3d->camera->obmat[3]);
-
- fly->rv3d->dist=0.0;
- } else {
- /* perspective or ortho */
- if (fly->rv3d->persp==RV3D_ORTHO)
- fly->rv3d->persp= RV3D_PERSP; /*if ortho projection, make perspective */
- copy_qt_qt(fly->rot_backup, fly->rv3d->viewquat);
- copy_v3_v3(fly->ofs_backup, fly->rv3d->ofs);
- fly->rv3d->dist= 0.0f;
-
- upvec[2]= fly->dist_backup; /*x and y are 0*/
- mul_m3_v3(mat, upvec);
- sub_v3_v3(fly->rv3d->ofs, upvec);
- /*Done with correcting for the dist*/
- }
-
-
- /* center the mouse, probably the UI mafia are against this but without its quite annoying */
- WM_cursor_warp(CTX_wm_window(C), fly->ar->winrct.xmin + fly->ar->winx/2, fly->ar->winrct.ymin + fly->ar->winy/2);
-
- return 1;
-}
-
-static int flyEnd(bContext *C, FlyInfo *fly)
-{
- RegionView3D *rv3d= fly->rv3d;
- View3D *v3d = fly->v3d;
-
- float upvec[3];
-
- if(fly->state == FLY_RUNNING)
- return OPERATOR_RUNNING_MODAL;
-
- WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), fly->timer);
-
- rv3d->dist= fly->dist_backup;
-
- if (fly->state == FLY_CANCEL) {
- /* Revert to original view? */
- if (fly->persp_backup==RV3D_CAMOB) { /* a camera view */
- Object *ob_back;
- if(fly->root_parent)ob_back= fly->root_parent;
- else ob_back= fly->v3d->camera;
-
- /* store the original camera loc and rot */
- object_tfm_restore(ob_back, fly->obtfm);
-
- DAG_id_flush_update(&ob_back->id, OB_RECALC_OB);
- } else {
- /* Non Camera we need to reset the view back to the original location bacause the user canceled*/
- copy_qt_qt(rv3d->viewquat, fly->rot_backup);
- copy_v3_v3(rv3d->ofs, fly->ofs_backup);
- rv3d->persp= fly->persp_backup;
- }
- }
- else if (fly->persp_backup==RV3D_CAMOB) { /* camera */
- float mat3[3][3];
- if(fly->root_parent) {
- DAG_id_flush_update(&fly->root_parent->id, OB_RECALC_OB);
- }
- else {
- copy_m3_m4(mat3, v3d->camera->obmat);
- object_mat3_to_rot(v3d->camera, mat3, TRUE);
- DAG_id_flush_update(&v3d->camera->id, OB_RECALC_OB);
- }
-
-#if 0 //XXX2.5
- if (IS_AUTOKEY_MODE(NORMAL)) {
- allqueue(REDRAWIPO, 0);
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWTIME, 0);
- }
-#endif
- }
- else { /* not camera */
- /* Apply the fly mode view */
- /*restore the dist*/
- float mat[3][3];
- upvec[0]= upvec[1]= 0;
- upvec[2]= fly->dist_backup; /*x and y are 0*/
- copy_m3_m4(mat, rv3d->viewinv);
- mul_m3_v3(mat, upvec);
- add_v3_v3(rv3d->ofs, upvec);
- /*Done with correcting for the dist */
- }
-
- rv3d->rflag &= ~(RV3D_FLYMODE|RV3D_NAVIGATING);
-//XXX2.5 BIF_view3d_previewrender_signal(fly->sa, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */
-
- if(fly->obtfm)
- MEM_freeN(fly->obtfm);
-
- if(fly->state == FLY_CONFIRM) {
- MEM_freeN(fly);
- return OPERATOR_FINISHED;
- }
-
- MEM_freeN(fly);
- return OPERATOR_CANCELLED;
-}
-
-static void flyEvent(FlyInfo *fly, wmEvent *event)
-{
- if (event->type == TIMER && event->customdata == fly->timer) {
- fly->redraw = 1;
- }
- else if (event->type == MOUSEMOVE) {
- fly->mval[0] = event->x - fly->ar->winrct.xmin;
- fly->mval[1] = event->y - fly->ar->winrct.ymin;
- } /* handle modal keymap first */
- else if (event->type == EVT_MODAL_MAP) {
- switch (event->val) {
- case FLY_MODAL_CANCEL:
- fly->state = FLY_CANCEL;
- break;
- case FLY_MODAL_CONFIRM:
- fly->state = FLY_CONFIRM;
- break;
-
- case FLY_MODAL_ACCELERATE:
- {
- double time_currwheel;
- float time_wheel;
-
- time_currwheel= PIL_check_seconds_timer();
- time_wheel = (float)(time_currwheel - fly->time_lastwheel);
- fly->time_lastwheel = time_currwheel;
- /*printf("Wheel %f\n", time_wheel);*/
- /*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
-
- if (fly->speed<0.0f) fly->speed= 0.0f;
- else {
- if (event->shift)
- fly->speed+= fly->grid*time_wheel*0.1;
- else
- fly->speed+= fly->grid*time_wheel;
- }
- break;
- }
- case FLY_MODAL_DECELERATE:
- {
- double time_currwheel;
- float time_wheel;
-
- time_currwheel= PIL_check_seconds_timer();
- time_wheel = (float)(time_currwheel - fly->time_lastwheel);
- fly->time_lastwheel = time_currwheel;
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
-
- if (fly->speed>0) fly->speed=0;
- else {
- if (event->shift)
- fly->speed-= fly->grid*time_wheel*0.1;
- else
- fly->speed-= fly->grid*time_wheel;
- }
- break;
- }
- case FLY_MODAL_PAN_ENABLE:
- fly->pan_view= TRUE;
- break;
- case FLY_MODAL_PAN_DISABLE:
-//XXX2.5 warp_pointer(cent_orig[0], cent_orig[1]);
- fly->pan_view= FALSE;
- break;
-
- /* impliment WASD keys */
- case FLY_MODAL_DIR_FORWARD:
- if (fly->speed < 0.0f) fly->speed= -fly->speed; /* flip speed rather then stopping, game like motion */
- else fly->speed += fly->grid; /* increse like mousewheel if were already moving in that difection*/
- fly->axis= 2;
- break;
- case FLY_MODAL_DIR_BACKWARD:
- if (fly->speed>0) fly->speed= -fly->speed;
- else fly->speed -= fly->grid;
- fly->axis= 2;
- break;
- case FLY_MODAL_DIR_LEFT:
- if (fly->speed < 0.0f) fly->speed= -fly->speed;
- fly->axis= 0;
- break;
- case FLY_MODAL_DIR_RIGHT:
- if (fly->speed > 0.0f) fly->speed= -fly->speed;
- fly->axis= 0;
- break;
-
- case FLY_MODAL_DIR_UP:
- if (fly->speed > 0.0f) fly->speed= -fly->speed;
- fly->axis= 1;
- break;
-
- case FLY_MODAL_DIR_DOWN:
- if (fly->speed < 0.0f) fly->speed= -fly->speed;
- fly->axis= 1;
- break;
-
- case FLY_MODAL_AXIS_LOCK_X:
- if (fly->xlock) fly->xlock=0;
- else {
- fly->xlock = 2;
- fly->xlock_momentum = 0.0;
- }
- break;
- case FLY_MODAL_AXIS_LOCK_Z:
- if (fly->zlock) fly->zlock=0;
- else {
- fly->zlock = 2;
- fly->zlock_momentum = 0.0;
- }
- break;
-
- case FLY_MODAL_PRECISION_ENABLE:
- fly->use_precision= TRUE;
- break;
- case FLY_MODAL_PRECISION_DISABLE:
- fly->use_precision= FALSE;
- break;
-
- }
- }
-}
-
-static int flyApply(bContext *C, FlyInfo *fly)
-{
-
-#define FLY_ROTATE_FAC 2.5f /* more is faster */
-#define FLY_ZUP_CORRECT_FAC 0.1f /* ammount to correct per step */
-#define FLY_ZUP_CORRECT_ACCEL 0.05f /* increase upright momentum each step */
-
- /*
- fly mode - Shift+F
- a fly loop where the user can move move the view as if they are flying
- */
- RegionView3D *rv3d= fly->rv3d;
- View3D *v3d = fly->v3d;
- ARegion *ar = fly->ar;
- Scene *scene= fly->scene;
-
- float prev_view_mat[4][4];
-
- float mat[3][3], /* 3x3 copy of the view matrix so we can move allong the view axis */
- dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */
-
- /* Camera Uprighting variables */
- upvec[3]={0,0,0}, /* stores the view's up vector */
-
- moffset[2], /* mouse offset from the views center */
- tmp_quat[4]; /* used for rotating the view */
-
- int cent_orig[2], /* view center */
-//XXX- can avoid using // cent[2], /* view center modified */
- xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
- unsigned char
- apply_rotation= 1; /* if the user presses shift they can look about without movinf the direction there looking*/
-
- if(fly->root_parent)
- view3d_persp_mat4(rv3d, prev_view_mat);
-
- /* the dist defines a vector that is infront of the offset
- to rotate the view about.
- this is no good for fly mode because we
- want to rotate about the viewers center.
- but to correct the dist removal we must
- alter offset so the view doesn't jump. */
-
- xmargin= ar->winx/20.0f;
- ymargin= ar->winy/20.0f;
-
- cent_orig[0]= ar->winrct.xmin + ar->winx/2;
- cent_orig[1]= ar->winrct.ymin + ar->winy/2;
-
- {
-
- /* mouse offset from the center */
- moffset[0]= fly->mval[0]- ar->winx/2;
- moffset[1]= fly->mval[1]- ar->winy/2;
-
- /* enforce a view margin */
- if (moffset[0]>xmargin) moffset[0]-=xmargin;
- else if (moffset[0] < -xmargin) moffset[0]+=xmargin;
- else moffset[0]=0;
-
- if (moffset[1]>ymargin) moffset[1]-=ymargin;
- else if (moffset[1] < -ymargin) moffset[1]+=ymargin;
- else moffset[1]=0;
-
-
- /* scale the mouse movement by this value - scales mouse movement to the view size
- * moffset[0]/(ar->winx-xmargin*2) - window size minus margin (same for y)
- *
- * the mouse moves isnt linear */
-
- if(moffset[0]) {
- moffset[0] /= ar->winx - (xmargin*2);
- moffset[0] *= fabs(moffset[0]);
- }
-
- if(moffset[1]) {
- moffset[1] /= ar->winy - (ymargin*2);
- moffset[1] *= fabs(moffset[1]);
- }
-
- /* Should we redraw? */
- if(fly->speed != 0.0f || moffset[0] || moffset[1] || fly->zlock || fly->xlock || dvec[0] || dvec[1] || dvec[2] ) {
- float dvec_tmp[3];
- double time_current, time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
- float time_redraw_clamped;
-
- time_current= PIL_check_seconds_timer();
- time_redraw= (float)(time_current - fly->time_lastdraw);
- time_redraw_clamped= MIN2(0.05f, time_redraw); /* clamt the redraw time to avoid jitter in roll correction */
- fly->time_lastdraw= time_current;
- /*fprintf(stderr, "%f\n", time_redraw);*/ /* 0.002 is a small redraw 0.02 is larger */
-
- /* Scale the time to use shift to scale the speed down- just like
- shift slows many other areas of blender down */
- if (fly->use_precision)
- fly->speed= fly->speed * (1.0f-time_redraw_clamped);
-
- copy_m3_m4(mat, rv3d->viewinv);
-
- if (fly->pan_view==TRUE) {
- /* pan only */
- dvec_tmp[0]= -moffset[0];
- dvec_tmp[1]= -moffset[1];
- dvec_tmp[2]= 0;
-
- if (fly->use_precision) {
- dvec_tmp[0] *= 0.1;
- dvec_tmp[1] *= 0.1;
- }
-
- mul_m3_v3(mat, dvec_tmp);
- mul_v3_fl(dvec_tmp, time_redraw*200.0 * fly->grid);
-
- } else {
- float roll; /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
-
- /* rotate about the X axis- look up/down */
- if (moffset[1]) {
- upvec[0]=1;
- upvec[1]=0;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
- axis_angle_to_quat( tmp_quat, upvec, (float)moffset[1] * time_redraw * -FLY_ROTATE_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- if (fly->xlock) fly->xlock = 2; /*check for rotation*/
- if (fly->zlock) fly->zlock = 2;
- fly->xlock_momentum= 0.0f;
- }
-
- /* rotate about the Y axis- look left/right */
- if (moffset[0]) {
-
- /* if we're upside down invert the moffset */
- upvec[0]=0;
- upvec[1]=1;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
-
- if(upvec[2] < 0.0f)
- moffset[0]= -moffset[0];
-
- /* make the lock vectors */
- if (fly->zlock) {
- upvec[0]=0;
- upvec[1]=0;
- upvec[2]=1;
- } else {
- upvec[0]=0;
- upvec[1]=1;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
- }
-
- axis_angle_to_quat( tmp_quat, upvec, (float)moffset[0] * time_redraw * FLY_ROTATE_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- if (fly->xlock) fly->xlock = 2;/*check for rotation*/
- if (fly->zlock) fly->zlock = 2;
- }
-
- if (fly->zlock==2) {
- upvec[0]=1;
- upvec[1]=0;
- upvec[2]=0;
- mul_m3_v3(mat, upvec);
-
- /*make sure we have some z rolling*/
- if (fabs(upvec[2]) > 0.00001f) {
- roll= upvec[2]*5;
- upvec[0]=0; /*rotate the view about this axis*/
- upvec[1]=0;
- upvec[2]=1;
-
- mul_m3_v3(mat, upvec);
- axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->zlock_momentum * FLY_ZUP_CORRECT_FAC); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- fly->zlock_momentum += FLY_ZUP_CORRECT_ACCEL;
- } else {
- fly->zlock=1; /* dont check until the view rotates again */
- fly->zlock_momentum= 0.0f;
- }
- }
-
- if (fly->xlock==2 && moffset[1]==0) { /*only apply xcorrect when mouse isnt applying x rot*/
- upvec[0]=0;
- upvec[1]=0;
- upvec[2]=1;
- mul_m3_v3(mat, upvec);
- /*make sure we have some z rolling*/
- if (fabs(upvec[2]) > 0.00001) {
- roll= upvec[2] * -5;
-
- upvec[0]= 1.0f; /*rotate the view about this axis*/
- upvec[1]= 0.0f;
- upvec[2]= 0.0f;
-
- mul_m3_v3(mat, upvec);
-
- axis_angle_to_quat( tmp_quat, upvec, roll*time_redraw_clamped*fly->xlock_momentum*0.1f); /* Rotate about the relative up vec */
- mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, tmp_quat);
-
- fly->xlock_momentum += 0.05f;
- } else {
- fly->xlock=1; /* see above */
- fly->xlock_momentum= 0.0f;
- }
- }
-
-
- if (apply_rotation) {
- /* Normal operation */
- /* define dvec, view direction vector */
- dvec_tmp[0]= dvec_tmp[1]= dvec_tmp[2]= 0.0f;
- /* move along the current axis */
- dvec_tmp[fly->axis]= 1.0f;
-
- mul_m3_v3(mat, dvec_tmp);
-
- mul_v3_fl(dvec_tmp, fly->speed * time_redraw * 0.25f);
- }
- }
-
- /* impose a directional lag */
- interp_v3_v3v3(dvec, dvec_tmp, fly->dvec_prev, (1.0f/(1.0f+(time_redraw*5.0f))));
-
- if (rv3d->persp==RV3D_CAMOB) {
- Object *lock_ob= fly->root_parent ? fly->root_parent : fly->v3d->camera;
- if (lock_ob->protectflag & OB_LOCK_LOCX) dvec[0] = 0.0;
- if (lock_ob->protectflag & OB_LOCK_LOCY) dvec[1] = 0.0;
- if (lock_ob->protectflag & OB_LOCK_LOCZ) dvec[2] = 0.0;
- }
-
- add_v3_v3(rv3d->ofs, dvec);
-
- /* todo, dynamic keys */
-#if 0
- if (fly->zlock && fly->xlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else if (fly->zlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else if (fly->xlock)
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
- else
- ED_area_headerprint(fly->ar, "FlyKeys Speed:(+/- | Wheel), Upright Axis:X off/Z off, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB");
-#endif
-
- /* we are in camera view so apply the view ofs and quat to the view matrix and set the camera to the view */
- if (rv3d->persp==RV3D_CAMOB) {
- ID *id_key;
- /* transform the parent or the camera? */
- if(fly->root_parent) {
- Object *ob_update;
-
- float view_mat[4][4];
- float prev_view_imat[4][4];
- float diff_mat[4][4];
- float parent_mat[4][4];
-
- invert_m4_m4(prev_view_imat, prev_view_mat);
- view3d_persp_mat4(rv3d, view_mat);
- mul_m4_m4m4(diff_mat, prev_view_imat, view_mat);
- mul_m4_m4m4(parent_mat, fly->root_parent->obmat, diff_mat);
- object_apply_mat4(fly->root_parent, parent_mat);
-
- // where_is_object(scene, fly->root_parent);
-
- ob_update= v3d->camera->parent;
- while(ob_update) {
- DAG_id_flush_update(&ob_update->id, OB_RECALC_OB);
- ob_update= ob_update->parent;
- }
-
- copy_m4_m4(prev_view_mat, view_mat);
-
- id_key= &fly->root_parent->id;
-
- }
- else {
- float view_mat[4][4];
- view3d_persp_mat4(rv3d, view_mat);
- object_apply_mat4(v3d->camera, view_mat);
- id_key= &v3d->camera->id;
- }
-
- /* record the motion */
- if (autokeyframe_cfra_can_key(scene, id_key)) {
- ListBase dsources = {NULL, NULL};
-
- /* add datasource override for the camera object */
- ANIM_relative_keyingset_add_source(&dsources, id_key, NULL, NULL);
-
- /* insert keyframes
- * 1) on the first frame
- * 2) on each subsequent frame
- * TODO: need to check in future that frame changed before doing this
- */
- if (fly->xlock || fly->zlock || moffset[0] || moffset[1]) {
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- }
- if (fly->speed) {
- KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Location");
- ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA);
- }
-
- /* free temp data */
- BLI_freelistN(&dsources);
- }
- }
- } else
- /*were not redrawing but we need to update the time else the view will jump */
- fly->time_lastdraw= PIL_check_seconds_timer();
- /* end drawing */
- copy_v3_v3(fly->dvec_prev, dvec);
- }
-
-/* moved to flyEnd() */
-
- return OPERATOR_FINISHED;
-}
-
-
-
-static int fly_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- RegionView3D *rv3d= CTX_wm_region_view3d(C);
- FlyInfo *fly;
-
- if(rv3d->viewlock)
- return OPERATOR_CANCELLED;
-
- fly= MEM_callocN(sizeof(FlyInfo), "FlyOperation");
-
- op->customdata= fly;
-
- if(initFlyInfo(C, fly, op, event)==FALSE) {
- MEM_freeN(op->customdata);
- return OPERATOR_CANCELLED;
- }
-
- flyEvent(fly, event);
-
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
-}
-
-static int fly_cancel(bContext *C, wmOperator *op)
-{
- FlyInfo *fly = op->customdata;
-
- fly->state = FLY_CANCEL;
- flyEnd(C, fly);
- op->customdata= NULL;
-
- return OPERATOR_CANCELLED;
-}
-
-static int fly_modal(bContext *C, wmOperator *op, wmEvent *event)
-{
- int exit_code;
-
- FlyInfo *fly = op->customdata;
-
- fly->redraw= 0;
-
- flyEvent(fly, event);
-
- if(event->type==TIMER && event->customdata == fly->timer)
- flyApply(C, fly);
-
- if(fly->redraw) {
- ED_region_tag_redraw(CTX_wm_region(C));
- }
-
- exit_code = flyEnd(C, fly);
-
- if(exit_code!=OPERATOR_RUNNING_MODAL)
- ED_region_tag_redraw(CTX_wm_region(C));
-
- return exit_code;
-}
-
-void VIEW3D_OT_fly(wmOperatorType *ot)
-{
-
- /* identifiers */
- ot->name= "Fly Navigation";
- ot->description= "Interactively fly around the scene";
- ot->idname= "VIEW3D_OT_fly";
-
- /* api callbacks */
- ot->invoke= fly_invoke;
- ot->cancel= fly_cancel;
- ot->modal= fly_modal;
- ot->poll= ED_operator_view3d_active;
-
- /* flags */
- ot->flag= OPTYPE_BLOCKING;
-
-}
-
/* ************************************** */
void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, float vec[3])
@@ -2743,3 +1925,16 @@ void view3d_align_axis_to_vector(View3D *v3d, RegionView3D *rv3d, int axisidx, f
}
}
+int view3d_is_ortho(View3D *v3d, RegionView3D *rv3d)
+{
+ return (rv3d->persp == RV3D_ORTHO || (v3d->camera && ((Camera *)v3d->camera->data)->type == CAM_ORTHO));
+}
+
+float view3d_pixel_size(struct RegionView3D *rv3d, const float co[3])
+{
+ return (rv3d->persmat[3][3] + (
+ rv3d->persmat[0][3]*co[0] +
+ rv3d->persmat[1][3]*co[1] +
+ rv3d->persmat[2][3]*co[2])
+ ) * rv3d->pixsize;
+}
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index 1642648e056..f31d7ba6449 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -19,17 +19,31 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
- ../include
- ../../../../intern/guardedalloc
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ transform.c
+ transform_constraints.c
+ transform_conversions.c
+ transform_generics.c
+ transform_input.c
+ transform_manipulator.c
+ transform_ndofinput.c
+ transform_ops.c
+ transform_orientations.c
+ transform_snap.c
+
+ transform.h
)
-BLENDERLIB(bf_editor_transform "${SRC}" "${INC}")
+blender_add_lib(bf_editor_transform "${SRC}" "${INC}")
diff --git a/source/blender/editors/transform/Makefile b/source/blender/editors/transform/Makefile
deleted file mode 100644
index 9d23b763cd6..00000000000
--- a/source/blender/editors/transform/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_transform
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/transform/SConscript b/source/blender/editors/transform/SConscript
index 173eb8ce31d..9b59466bbc0 100644
--- a/source/blender/editors/transform/SConscript
+++ b/source/blender/editors/transform/SConscript
@@ -6,6 +6,10 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../render/extern/include'
+<<<<<<< .working
incs += ' ../../gpu ../../makesrna ../../bmesh'
+=======
+incs += ' ../../gpu ../../makesrna ../../blenloader'
+>>>>>>> .merge-right.r35190
env.BlenderLib ( 'bf_editors_transform', sources, Split(incs), [], libtype=['core'], priority=[40] )
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 7de8f0e28cd..f4ef67234e0 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -89,6 +89,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BLI_linklist.h"
@@ -103,6 +104,7 @@
#include "transform.h"
void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg);
+int doEdgeSlide(TransInfo *t, float perc);
/* ************************** SPACE DEPENDANT CODE **************************** */
@@ -298,7 +300,10 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
if (t->spacetype == SPACE_VIEW3D)
{
/* Do we need more refined tags? */
- WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
+ if(t->flag & T_POSE)
+ WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
+ else
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
/* for realtime animation record - send notifiers recognised by animation editors */
// XXX: is this notifier a lame duck?
@@ -334,7 +339,7 @@ static void viewRedrawForce(const bContext *C, TransInfo *t)
}
}
-static void viewRedrawPost(TransInfo *t)
+static void viewRedrawPost(bContext *C, TransInfo *t)
{
ED_area_headerprint(t->sa, NULL);
@@ -342,6 +347,10 @@ static void viewRedrawPost(TransInfo *t)
/* if autokeying is enabled, send notifiers that keyframes were added */
if (IS_AUTOKEY_ON(t->scene))
WM_main_add_notifier(NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
+
+ /* XXX temp, first hack to get auto-render in compositor work (ton) */
+ WM_event_add_notifier(C, NC_SCENE|ND_TRANSFORM_DONE, CTX_data_scene(C));
+
}
#if 0 // TRANSFORM_FIX_ME
@@ -368,7 +377,7 @@ static void viewRedrawPost(TransInfo *t)
/* ************************** TRANSFORMATIONS **************************** */
-void BIF_selectOrientation() {
+void BIF_selectOrientation(void) {
#if 0 // TRANSFORM_FIX_ME
short val;
char *str_menu = BIF_menustringTransformOrientation("Orientation");
@@ -381,7 +390,7 @@ void BIF_selectOrientation() {
#endif
}
-static void view_editmove(unsigned short event)
+static void view_editmove(unsigned short UNUSED(event))
{
#if 0 // TRANSFORM_FIX_ME
int refresh = 0;
@@ -478,6 +487,8 @@ static void view_editmove(unsigned short event)
* */
#define TFM_MODAL_PROPSIZE_UP 20
#define TFM_MODAL_PROPSIZE_DOWN 21
+#define TFM_MODAL_AUTOIK_LEN_INC 22
+#define TFM_MODAL_AUTOIK_LEN_DEC 23
/* called in transform_ops.c, on each regeneration of keymaps */
wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
@@ -504,6 +515,8 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
{NUM_MODAL_INCREMENT_DOWN, "INCREMENT_DOWN", 0, "Numinput Increment Down", ""},
{TFM_MODAL_PROPSIZE_UP, "PROPORTIONAL_SIZE_UP", 0, "Increase Proportional Influence", ""},
{TFM_MODAL_PROPSIZE_DOWN, "PROPORTIONAL_SIZE_DOWN", 0, "Decrease Poportional Influence", ""},
+ {TFM_MODAL_AUTOIK_LEN_INC, "AUTOIK_CHAIN_LEN_UP", 0, "Increase Max AutoIK Chain Length", ""},
+ {TFM_MODAL_AUTOIK_LEN_DEC, "AUTOIK_CHAIN_LEN_DOWN", 0, "Decrease Max AutoIK Chain Length", ""},
{0, NULL, 0, NULL, NULL}};
wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map");
@@ -527,6 +540,9 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
WM_modalkeymap_add_item(keymap, LEFTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
+
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_PRESS, KM_ANY, 0, TFM_MODAL_SNAP_INV_ON);
+ WM_modalkeymap_add_item(keymap, RIGHTCTRLKEY, KM_RELEASE, KM_ANY, 0, TFM_MODAL_SNAP_INV_OFF);
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
@@ -538,14 +554,19 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
-
+
+ WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
+ WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
+ WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_INC);
+ WM_modalkeymap_add_item(keymap, WHEELUPMOUSE, KM_PRESS, KM_SHIFT, 0, TFM_MODAL_AUTOIK_LEN_DEC);
+
return keymap;
}
int transformEvent(TransInfo *t, wmEvent *event)
{
- float mati[3][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}};
+ float mati[3][3]= MAT3_UNITY;
char cmode = constraintModeToChar(t);
int handled = 1;
@@ -559,7 +580,9 @@ int transformEvent(TransInfo *t, wmEvent *event)
t->mval[0] = event->x - t->ar->winrct.xmin;
t->mval[1] = event->y - t->ar->winrct.ymin;
- t->redraw |= TREDRAW_SOFT;
+ // t->redraw |= TREDRAW_SOFT; /* Use this for soft redraw. Might cause flicker in object mode */
+ t->redraw |= TREDRAW_HARD;
+
if (t->state == TRANS_STARTING) {
t->state = TRANS_RUNNING;
@@ -589,20 +612,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case TFM_MODAL_ROTATE:
/* only switch when... */
- if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
-
- resetTransRestrictions(t);
-
- if (t->mode == TFM_ROTATION) {
- restoreTransObjects(t);
- initTrackball(t);
- }
- else {
- restoreTransObjects(t);
- initRotation(t);
+ if(!(t->options & CTX_TEXTURE)) {
+ if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+
+ resetTransRestrictions(t);
+
+ if (t->mode == TFM_ROTATION) {
+ restoreTransObjects(t);
+ initTrackball(t);
+ }
+ else {
+ restoreTransObjects(t);
+ initRotation(t);
+ }
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw |= TREDRAW_HARD;
}
- initSnapping(t, NULL); // need to reinit after mode change
- t->redraw |= TREDRAW_HARD;
}
break;
case TFM_MODAL_RESIZE:
@@ -721,6 +746,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
case TFM_MODAL_PROPSIZE_UP:
if(t->flag & T_PROP_EDIT) {
t->prop_size*= 1.1f;
+ if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+ t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
calculatePropRatio(t);
}
t->redraw |= TREDRAW_HARD;
@@ -732,6 +759,16 @@ int transformEvent(TransInfo *t, wmEvent *event)
}
t->redraw |= TREDRAW_HARD;
break;
+ case TFM_MODAL_AUTOIK_LEN_INC:
+ if (t->flag & T_AUTOIK)
+ transform_autoik_update(t, 1);
+ t->redraw |= TREDRAW_HARD;
+ break;
+ case TFM_MODAL_AUTOIK_LEN_DEC:
+ if (t->flag & T_AUTOIK)
+ transform_autoik_update(t, -1);
+ t->redraw |= TREDRAW_HARD;
+ break;
default:
handled = 0;
break;
@@ -830,20 +867,22 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case RKEY:
/* only switch when... */
- if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
+ if(!(t->options & CTX_TEXTURE)) {
+ if( ELEM4(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL, TFM_TRANSLATION) ) {
- resetTransRestrictions(t);
+ resetTransRestrictions(t);
- if (t->mode == TFM_ROTATION) {
- restoreTransObjects(t);
- initTrackball(t);
- }
- else {
- restoreTransObjects(t);
- initRotation(t);
+ if (t->mode == TFM_ROTATION) {
+ restoreTransObjects(t);
+ initTrackball(t);
+ }
+ else {
+ restoreTransObjects(t);
+ initRotation(t);
+ }
+ initSnapping(t, NULL); // need to reinit after mode change
+ t->redraw |= TREDRAW_HARD;
}
- initSnapping(t, NULL); // need to reinit after mode change
- t->redraw |= TREDRAW_HARD;
}
break;
case CKEY:
@@ -947,6 +986,8 @@ int transformEvent(TransInfo *t, wmEvent *event)
case PADPLUSKEY:
if(event->alt && t->flag & T_PROP_EDIT) {
t->prop_size *= 1.1f;
+ if(t->spacetype==SPACE_VIEW3D && t->persp != RV3D_ORTHO)
+ t->prop_size= MIN2(t->prop_size, ((View3D *)t->view)->far);
calculatePropRatio(t);
}
t->redraw= 1;
@@ -1198,14 +1239,17 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
glEnd();
}
-static void drawHelpline(bContext *C, int x, int y, void *customdata)
+static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
{
TransInfo *t = (TransInfo*)customdata;
if (t->helpline != HLP_NONE && !(t->flag & T_USES_MANIPULATOR))
{
float vecrot[3], cent[2];
- int mval[2] = {x, y};
+ int mval[2];
+
+ mval[0]= x;
+ mval[1]= y;
VECCOPY(vecrot, t->center);
if(t->flag & T_EDIT) {
@@ -1303,20 +1347,20 @@ static void drawHelpline(bContext *C, int x, int y, void *customdata)
}
case HLP_TRACKBALL:
{
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
UI_GetThemeColor3ubv(TH_GRID, col);
glTranslatef(mval[0], mval[1], 0);
glLineWidth(3.0);
- UI_make_axis_color(col, col2, 'x');
+ UI_make_axis_color(col, col2, 'X');
glColor3ubv((GLubyte *)col2);
drawArrow(RIGHT, 5, 10, 5);
drawArrow(LEFT, 5, 10, 5);
- UI_make_axis_color(col, col2, 'y');
+ UI_make_axis_color(col, col2, 'Y');
glColor3ubv((GLubyte *)col2);
drawArrow(UP, 5, 10, 5);
@@ -1330,21 +1374,23 @@ static void drawHelpline(bContext *C, int x, int y, void *customdata)
}
}
-void drawTransformView(const struct bContext *C, struct ARegion *ar, void *arg)
+static void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(ar), void *arg)
{
TransInfo *t = arg;
- drawConstraint(C, t);
+ drawConstraint(t);
drawPropCircle(C, t);
drawSnapping(C, t);
}
-void drawTransformPixel(const struct bContext *C, struct ARegion *ar, void *arg)
+#if 0
+static void drawTransformPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *UNUSED(arg))
{
// TransInfo *t = arg;
//
// drawHelpline(C, t->mval[0], t->mval[1], t);
}
+#endif
void saveTransform(bContext *C, TransInfo *t, wmOperator *op)
{
@@ -1462,10 +1508,16 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
{
int options = 0;
+ t->context = C;
+
/* added initialize, for external calls to set stuff in TransInfo, like undo string */
t->state = TRANS_STARTING;
+ if(RNA_struct_find_property(op->ptr, "texture_space"))
+ if(RNA_boolean_get(op->ptr, "texture_space"))
+ options |= CTX_TEXTURE;
+
t->options = options;
t->mode = mode;
@@ -1531,7 +1583,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
if ((ELEM(kmi->type, LEFTCTRLKEY, RIGHTCTRLKEY) && event->ctrl) ||
(ELEM(kmi->type, LEFTSHIFTKEY, RIGHTSHIFTKEY) && event->shift) ||
(ELEM(kmi->type, LEFTALTKEY, RIGHTALTKEY) && event->alt) ||
- (kmi->type == COMMANDKEY && event->oskey)) {
+ (kmi->type == OSKEY && event->oskey)) {
t->modifiers |= MOD_SNAP_INVERT;
}
break;
@@ -1603,6 +1655,11 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
break;
case TFM_EDGE_SLIDE:
initEdgeSlide(t);
+ if(t->state == TRANS_CANCEL)
+ {
+ postTrans(C, t);
+ return 0;
+ }
break;
case TFM_BONE_ROLL:
initBoneRoll(t);
@@ -1650,7 +1707,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
/* overwrite initial values if operator supplied a non-null vector */
if (RNA_property_is_set(op->ptr, "value"))
{
- float values[4];
+ float values[4]= {0}; /* incase value isn't length 4, avoid uninitialized memory */
RNA_float_get_array(op->ptr, "value", values);
QUATCOPY(t->values, values);
QUATCOPY(t->auto_values, values);
@@ -1662,6 +1719,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
{
RNA_float_get_array(op->ptr, "axis", t->axis);
normalize_v3(t->axis);
+ copy_v3_v3(t->axis_orig, t->axis);
}
/* Constraint init from operator */
@@ -1689,11 +1747,15 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
}
}
+ t->context = NULL;
+
return 1;
}
-void transformApply(const bContext *C, TransInfo *t)
+void transformApply(bContext *C, TransInfo *t)
{
+ t->context = C;
+
if ((t->redraw & TREDRAW_HARD) || (t->draw_handle_apply == NULL && (t->redraw & TREDRAW_SOFT)))
{
selectConstraint(t);
@@ -1718,15 +1780,17 @@ void transformApply(const bContext *C, TransInfo *t)
//do_screenhandlers(G.curscreen);
t->redraw |= TREDRAW_HARD;
}
+
+ t->context = NULL;
}
-void drawTransformApply(const struct bContext *C, struct ARegion *ar, void *arg)
+void drawTransformApply(const bContext *C, struct ARegion *UNUSED(ar), void *arg)
{
TransInfo *t = arg;
if (t->redraw & TREDRAW_SOFT) {
t->redraw |= TREDRAW_HARD;
- transformApply(C, t);
+ transformApply((bContext *)C, t);
}
}
@@ -1734,11 +1798,17 @@ int transformEnd(bContext *C, TransInfo *t)
{
int exit_code = OPERATOR_RUNNING_MODAL;
+ t->context = C;
+
if (t->state != TRANS_STARTING && t->state != TRANS_RUNNING)
{
/* handle restoring objects */
if(t->state == TRANS_CANCEL)
{
+ /* exception, edge slide transformed UVs too */
+ if(t->mode==TFM_EDGE_SLIDE)
+ doEdgeSlide(t, 0.0f);
+
exit_code = OPERATOR_CANCELLED;
restoreTransObjects(t); // calls recalcData()
}
@@ -1754,7 +1824,7 @@ int transformEnd(bContext *C, TransInfo *t)
postTrans(C, t);
/* send events out for redraws */
- viewRedrawPost(t);
+ viewRedrawPost(C, t);
/* Undo as last, certainly after special_trans_update! */
@@ -1770,6 +1840,8 @@ int transformEnd(bContext *C, TransInfo *t)
viewRedrawForce(C, t);
}
+ t->context = NULL;
+
return exit_code;
}
@@ -1869,23 +1941,29 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
}
else {
/* quaternions get limited with euler... (compatability mode) */
- float eul[3], oldeul[3], quat1[4];
-
- QUATCOPY(quat1, quat);
- quat_to_eul( eul,quat);
- quat_to_eul( oldeul,oldquat);
-
+ float eul[3], oldeul[3], nquat[4], noldquat[4];
+ float qlen;
+
+ qlen= normalize_qt_qt(nquat, quat);
+ normalize_qt_qt(noldquat, oldquat);
+
+ quat_to_eul(eul, nquat);
+ quat_to_eul(oldeul, noldquat);
+
if (protectflag & OB_LOCK_ROTX)
eul[0]= oldeul[0];
if (protectflag & OB_LOCK_ROTY)
eul[1]= oldeul[1];
if (protectflag & OB_LOCK_ROTZ)
eul[2]= oldeul[2];
-
+
eul_to_quat( quat,eul);
+
+ /* restore original quat size */
+ mul_qt_fl(quat, qlen);
/* quaternions flip w sign to accumulate rotations correctly */
- if ( (quat1[0]<0.0f && quat[0]>0.0f) || (quat1[0]>0.0f && quat[0]<0.0f) ) {
+ if ( (nquat[0]<0.0f && quat[0]>0.0f) || (nquat[0]>0.0f && quat[0]<0.0f) ) {
mul_qt_fl(quat, -1.0f);
}
}
@@ -1893,18 +1971,17 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
/* ******************* TRANSFORM LIMITS ********************** */
-static void constraintTransLim(TransInfo *t, TransData *td)
+static void constraintTransLim(TransInfo *UNUSED(t), TransData *td)
{
if (td->con) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
- bConstraintOb cob;
+ bConstraintOb cob= {0};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
- memset(&cob, 0, sizeof(bConstraintOb));
unit_m4(cob.matrix);
VECCOPY(cob.matrix[3], td->loc);
@@ -1958,37 +2035,29 @@ static void constraintob_from_transdata(bConstraintOb *cob, TransData *td)
* - current space should be local
*/
memset(cob, 0, sizeof(bConstraintOb));
- if (td->rotOrder == ROT_MODE_QUAT) {
- /* quats */
- if (td->ext) {
+ if (td->ext)
+ {
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
+ /* quats */
/* objects and bones do normalization first too, otherwise
we don't necessarily end up with a rotation matrix, and
then conversion back to quat gives a different result */
float quat[4];
- copy_qt_qt(quat, td->ext->quat);
- normalize_qt(quat);
+ normalize_qt_qt(quat, td->ext->quat);
quat_to_mat4(cob->matrix, quat);
}
- else
- return;
- }
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
- /* axis angle */
- if (td->ext)
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
+ /* axis angle */
axis_angle_to_mat4(cob->matrix, &td->ext->quat[1], td->ext->quat[0]);
- else
- return;
- }
- else {
- /* eulers */
- if (td->ext)
- eulO_to_mat4(cob->matrix, td->ext->rot, td->rotOrder);
- else
- return;
+ }
+ else {
+ /* eulers */
+ eulO_to_mat4(cob->matrix, td->ext->rot, td->ext->rotOrder);
+ }
}
}
-static void constraintRotLim(TransInfo *t, TransData *td)
+static void constraintRotLim(TransInfo *UNUSED(t), TransData *td)
{
if (td->con) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_ROTLIMIT);
@@ -2042,17 +2111,17 @@ static void constraintRotLim(TransInfo *t, TransData *td)
if(dolimit) {
/* copy results from cob->matrix */
- if (td->rotOrder == ROT_MODE_QUAT) {
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
/* quats */
mat4_to_quat( td->ext->quat,cob.matrix);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* axis angle */
mat4_to_axis_angle( &td->ext->quat[1], &td->ext->quat[0],cob.matrix);
}
else {
/* eulers */
- mat4_to_eulO( td->ext->rot, td->rotOrder,cob.matrix);
+ mat4_to_eulO( td->ext->rot, td->ext->rotOrder,cob.matrix);
}
}
}
@@ -2062,14 +2131,13 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
{
if (td->con && td->ext) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
- bConstraintOb cob;
+ bConstraintOb cob= {0};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
* - they only care that cob->matrix is correctly set ;-)
* - current space should be local
*/
- memset(&cob, 0, sizeof(bConstraintOb));
if ((td->flag & TD_SINGLESIZE) && !(t->con.mode & CON_APPLY)) {
/* scale val and reset size */
return; // TODO: fix this case
@@ -2137,7 +2205,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
/* ************************** WARP *************************** */
-void postInputWarp(TransInfo *t, float values[3])
+static void postInputWarp(TransInfo *t, float values[3])
{
mul_v3_fl(values, (float)(M_PI * 2));
@@ -2177,7 +2245,7 @@ void initWarp(TransInfo *t)
mul_m4_v3(t->viewmat, center);
sub_v3_v3(center, t->viewmat[3]);
if (i)
- minmax_v3_v3v3(min, max, center);
+ minmax_v3v3_v3(min, max, center);
else {
copy_v3_v3(max, center);
copy_v3_v3(min, center);
@@ -2208,7 +2276,7 @@ int handleEventWarp(TransInfo *t, wmEvent *event)
return status;
}
-int Warp(TransInfo *t, short mval[2])
+int Warp(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float vec[3], circumfac, dist, phi0, co, si, *curs, cursor[3], gcursor[3];
@@ -2306,7 +2374,7 @@ int Warp(TransInfo *t, short mval[2])
/* ************************** SHEAR *************************** */
-void postInputShear(TransInfo *t, float values[3])
+static void postInputShear(TransInfo *UNUSED(t), float values[3])
{
mul_v3_fl(values, 0.05f);
}
@@ -2356,7 +2424,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
}
-int Shear(TransInfo *t, short mval[2])
+int Shear(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float vec[3];
@@ -2460,6 +2528,7 @@ void initResize(TransInfo *t)
static void headerResize(TransInfo *t, float vec[3], char *str) {
char tvec[60];
+ char *spos= str;
if (hasNumInput(&t->num)) {
outputNumInput(&(t->num), tvec);
}
@@ -2472,21 +2541,27 @@ static void headerResize(TransInfo *t, float vec[3], char *str) {
if (t->con.mode & CON_APPLY) {
switch(t->num.idx_max) {
case 0:
- sprintf(str, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
+ spos += sprintf(spos, "Scale: %s%s %s", &tvec[0], t->con.text, t->proptext);
break;
case 1:
- sprintf(str, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+ spos += sprintf(spos, "Scale: %s : %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
break;
case 2:
- sprintf(str, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ spos += sprintf(spos, "Scale: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
}
else {
if (t->flag & T_2D_EDIT)
- sprintf(str, "Scale X: %s Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
+ spos += sprintf(spos, "Scale X: %s Y: %s%s %s", &tvec[0], &tvec[20], t->con.text, t->proptext);
else
- sprintf(str, "Scale X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ spos += sprintf(spos, "Scale X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
}
+
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED)) {
+ spos += sprintf(spos, " Proportional size: %.2f", t->prop_size);
+ }
+
+ (void)spos;
}
#define SIGN(a) (a<-FLT_EPSILON?1:a>FLT_EPSILON?2:3)
@@ -2720,7 +2795,7 @@ void initToSphere(TransInfo *t)
t->val /= (float)t->total;
}
-int ToSphere(TransInfo *t, short mval[2])
+int ToSphere(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3];
float ratio, radius;
@@ -2785,7 +2860,7 @@ int ToSphere(TransInfo *t, short mval[2])
/* ************************** ROTATION *************************** */
-void postInputRotation(TransInfo *t, float values[3])
+static void postInputRotation(TransInfo *t, float values[3])
{
if ((t->con.mode & CON_APPLY) && t->con.applyRot) {
t->con.applyRot(t, NULL, t->axis, values);
@@ -2817,6 +2892,8 @@ void initRotation(TransInfo *t)
negate_v3_v3(t->axis, t->viewinv[2]);
normalize_v3(t->axis);
+
+ copy_v3_v3(t->axis_orig, t->axis);
}
static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short around) {
@@ -2851,7 +2928,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
if(td->flag & TD_USEQUAT) {
- mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
mat3_to_quat( quat,fmat); // Actual transform
if(td->ext->quat){
@@ -2894,9 +2971,19 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
sub_v3_v3v3(vec, vec, td->center); // Translation needed from the initial location
- mul_m3_v3(pmtx, vec); // To Global space
- mul_m3_v3(td->smtx, vec);// To Pose space
-
+ /* special exception, see TD_PBONE_LOCAL_MTX definition comments */
+ if(td->flag & TD_PBONE_LOCAL_MTX_P) {
+ /* do nothing */
+ }
+ else if (td->flag & TD_PBONE_LOCAL_MTX_C) {
+ mul_m3_v3(pmtx, vec); // To Global space
+ mul_m3_v3(td->ext->l_smtx, vec);// To Pose space (Local Location)
+ }
+ else {
+ mul_m3_v3(pmtx, vec); // To Global space
+ mul_m3_v3(td->smtx, vec);// To Pose space
+ }
+
protectedTransBits(td->protectflag, vec);
add_v3_v3v3(td->loc, td->iloc, vec);
@@ -2907,8 +2994,8 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
/* euler or quaternion/axis-angle? */
- if (td->rotOrder == ROT_MODE_QUAT) {
- mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ if (td->ext->rotOrder == ROT_MODE_QUAT) {
+ mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
mat3_to_quat( quat,fmat); // Actual transform
@@ -2917,13 +3004,13 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* calculate effect based on quats */
float iquat[4], tquat[4];
axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
- mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
mat3_to_quat( quat,fmat); // Actual transform
mul_qt_qtqt(tquat, quat, iquat);
@@ -2940,12 +3027,12 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* calculate the total rotatation in eulers */
VECCOPY(eul, td->ext->irot);
- eulO_to_mat3( eulmat,eul, td->rotOrder);
+ eulO_to_mat3( eulmat,eul, td->ext->rotOrder);
/* mat = transform, obmat = bone rotation */
mul_m3_m3m3(fmat, smat, eulmat);
- mat3_to_compatible_eulO( eul, td->ext->rot, td->rotOrder,fmat);
+ mat3_to_compatible_eulO( eul, td->ext->rot, td->ext->rotOrder,fmat);
/* and apply (to end result only) */
protectedRotateBits(td->protectflag, eul, td->ext->irot);
@@ -2977,25 +3064,25 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* rotation */
if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
/* euler or quaternion? */
- if ((td->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
- mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
+ mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
mat3_to_quat( quat,fmat); // Actual transform
mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat);
/* this function works on end result */
protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
}
- else if (td->rotOrder == ROT_MODE_AXISANGLE) {
+ else if (td->ext->rotOrder == ROT_MODE_AXISANGLE) {
/* calculate effect based on quats */
float iquat[4], tquat[4];
axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
- mul_serie_m3(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
+ mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
mat3_to_quat( quat,fmat); // Actual transform
mul_qt_qtqt(tquat, quat, iquat);
- quat_to_axis_angle( td->ext->rotAxis, td->ext->rotAngle,quat);
+ quat_to_axis_angle( td->ext->rotAxis, td->ext->rotAngle,tquat);
/* this function works on end result */
protectedAxisAngleBits(td->protectflag, td->ext->rotAxis, td->ext->rotAngle, td->ext->irotAxis, td->ext->irotAngle);
@@ -3008,11 +3095,11 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
/* calculate the total rotatation in eulers */
add_v3_v3v3(eul, td->ext->irot, td->ext->drot); /* we have to correct for delta rot */
- eulO_to_mat3( obmat,eul, td->rotOrder);
+ eulO_to_mat3( obmat,eul, td->ext->rotOrder);
/* mat = transform, obmat = object rotation */
mul_m3_m3m3(fmat, smat, obmat);
- mat3_to_compatible_eulO( eul, td->ext->rot, td->rotOrder,fmat);
+ mat3_to_compatible_eulO( eul, td->ext->rot, td->ext->rotOrder,fmat);
/* correct back for delta rot */
sub_v3_v3v3(eul, eul, td->ext->drot);
@@ -3055,14 +3142,12 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
}
}
-int Rotation(TransInfo *t, short mval[2])
+int Rotation(TransInfo *t, short UNUSED(mval[2]))
{
- char str[64];
+ char str[128];
float final;
-
- float mat[3][3];
-
+
final = t->values[0];
applyNDofInput(&t->ndof, &final);
@@ -3073,8 +3158,7 @@ int Rotation(TransInfo *t, short mval[2])
t->con.applyRot(t, NULL, t->axis, NULL);
} else {
/* reset axis if constraint is not set */
- negate_v3_v3(t->axis, t->viewinv[2]);
- normalize_v3(t->axis);
+ copy_v3_v3(t->axis, t->axis_orig);
}
applySnapping(t, &final);
@@ -3101,9 +3185,10 @@ int Rotation(TransInfo *t, short mval[2])
sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
}
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+ sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
+
t->values[0] = final;
-
- vec_rot_to_mat3( mat, t->axis, final);
applyRotation(t, final, t->axis);
@@ -3169,7 +3254,7 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
}
}
-int Trackball(TransInfo *t, short mval[2])
+int Trackball(TransInfo *t, short UNUSED(mval[2]))
{
char str[128];
float axis1[3], axis2[3];
@@ -3275,7 +3360,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
applyAspectRatio(t, dvec);
dist = len_v3(vec);
- if(t->scene->unit.system) {
+ if(!(t->flag & T_2D_EDIT) && t->scene->unit.system) {
int i, do_split= t->scene->unit.flag & USER_UNIT_OPT_SPLIT ? 1:0;
for(i=0; i<3; i++)
@@ -3288,7 +3373,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
}
}
- if(t->scene->unit.system)
+ if(!(t->flag & T_2D_EDIT) && t->scene->unit.system)
bUnit_AsString(distvec, sizeof(distvec), dist*t->scene->unit.scale_length, 4, t->scene->unit.system, B_UNIT_LENGTH, t->scene->unit.flag & USER_UNIT_OPT_SPLIT, 0);
else if( dist > 1e10 || dist < -1e10 ) /* prevent string buffer overflow */
sprintf(distvec, "%.4e", dist);
@@ -3324,6 +3409,9 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
else
sprintf(str, "Dx: %s Dy: %s Dz: %s (%s)%s %s %s", &tvec[0], &tvec[20], &tvec[40], distvec, t->con.text, t->proptext, &autoik[0]);
}
+
+ if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
+ sprintf(str, "%s Proportional size: %.2f", str, t->prop_size);
}
static void applyTranslation(TransInfo *t, float vec[3]) {
@@ -3389,13 +3477,16 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
}
/* uses t->vec to store actual translation in */
-int Translation(TransInfo *t, short mval[2])
+int Translation(TransInfo *t, short UNUSED(mval[2]))
{
char str[250];
if (t->con.mode & CON_APPLY) {
float pvec[3] = {0.0f, 0.0f, 0.0f};
float tvec[3];
+ if (hasNumInput(&t->num)) {
+ removeAspectRatio(t, t->values);
+ }
applySnapping(t, t->values);
t->con.applyVec(t, NULL, t->values, tvec, pvec);
VECCOPY(t->values, tvec);
@@ -3405,11 +3496,9 @@ int Translation(TransInfo *t, short mval[2])
applyNDofInput(&t->ndof, t->values);
snapGrid(t, t->values);
applyNumInput(&t->num, t->values);
- if (hasNumInput(&t->num))
- {
+ if (hasNumInput(&t->num)) {
removeAspectRatio(t, t->values);
}
-
applySnapping(t, t->values);
headerTranslation(t, t->values, str);
}
@@ -3455,7 +3544,7 @@ void initShrinkFatten(TransInfo *t)
-int ShrinkFatten(TransInfo *t, short mval[2])
+int ShrinkFatten(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3];
float distance;
@@ -3530,7 +3619,7 @@ void initTilt(TransInfo *t)
-int Tilt(TransInfo *t, short mval[2])
+int Tilt(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
int i;
@@ -3602,7 +3691,7 @@ void initCurveShrinkFatten(TransInfo *t)
t->flag |= T_NO_CONSTRAINT;
}
-int CurveShrinkFatten(TransInfo *t, short mval[2])
+int CurveShrinkFatten(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float ratio;
@@ -3670,7 +3759,7 @@ void initPushPull(TransInfo *t)
}
-int PushPull(TransInfo *t, short mval[2])
+int PushPull(TransInfo *t, short UNUSED(mval[2]))
{
float vec[3], axis[3];
float distance;
@@ -3803,12 +3892,12 @@ int handleEventBevel(TransInfo *t, wmEvent *event)
return 0;
}
-int Bevel(TransInfo *t, short mval[2])
+int Bevel(TransInfo *t, short UNUSED(mval[2]))
{
float distance,d;
int i;
char str[128];
- char *mode;
+ const char *mode;
TransData *td = t->data;
mode = (G.editBMesh->options & BME_BEVEL_VERT) ? "verts only" : "normal";
@@ -3871,7 +3960,7 @@ void initBevelWeight(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BevelWeight(TransInfo *t, short mval[2])
+int BevelWeight(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float weight;
@@ -3944,7 +4033,7 @@ void initCrease(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int Crease(TransInfo *t, short mval[2])
+int Crease(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float crease;
@@ -4138,7 +4227,7 @@ void initBoneEnvelope(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BoneEnvelope(TransInfo *t, short mval[2])
+int BoneEnvelope(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float ratio;
@@ -4202,7 +4291,7 @@ static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
return NULL;
}
-static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMLoop *l,
+static BMLoop *get_next_loop(BMesh *UNUSED(bm), BMVert *v, BMLoop *l,
BMEdge *olde, BMEdge *nexte, float vec[3])
{
BMLoop *firstl;
@@ -4219,7 +4308,7 @@ static BMLoop *get_next_loop(BMesh *bm, BMVert *v, BMLoop *l,
if (i) {
mul_v3_fl(a, 1.0f / (float)i);
} else {
- float f1[3], f2[3], f3[3], n[3];
+ float f1[3], f2[3], f3[3];
sub_v3_v3v3(f1, BM_OtherEdgeVert(olde, v)->co, v->co);
sub_v3_v3v3(f2, BM_OtherEdgeVert(nexte, v)->co, v->co);
@@ -4265,23 +4354,19 @@ static int createSlideVerts(TransInfo *t)
BMEditMesh *em = me->edit_btmesh;
BMesh *bm = em->bm;
BMIter iter, iter2;
- BMEdge *e, *e1, *e2, *ee, *le;
+ BMEdge *e, *e1, *ee, *le;
BMVert *v, *v2, *first;
BMLoop *l, *l1, *l2;
- TransDataSlideVert *tempsv, *sv;
- GHash **uvarray= NULL;
+ TransDataSlideVert *tempsv;
BMBVHTree *btree = BMBVH_NewBVH(em);
SmallHash table;
SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
- TransDataSlideUv *slideuvs=NULL, *suv=NULL, *suv_last=NULL;
RegionView3D *v3d = t->ar->regiondata;
ARegion *ar = t->ar;
float projectMat[4][4];
float start[3] = {0.0f, 0.0f, 0.0f}, dir[3], end[3] = {0.0f, 0.0f, 0.0f};
float vec[3], vec2[3], lastvec[3], size, dis=0.0, z;
- float totvec=0.0;
- int uvlay_tot= CustomData_number_of_layers(&em->bm->pdata, CD_MTFACE);
- int uvlay_idx, numsel, i, j;
+ int numsel, i, j;
if (!v3d) {
/*ok, let's try to survive this*/
@@ -4458,8 +4543,7 @@ static int createSlideVerts(TransInfo *t)
if (BM_TestHFlag(e, BM_SELECT)) {
BMIter iter2;
BMEdge *e2;
- TransDataSlideVert *sv1, *sv2;
- float vec1[3], dis2, ec2[3], vec[3], mval[2] = {t->mval[0], t->mval[1]}, d, z2;
+ float vec1[3], dis2, mval[2] = {t->mval[0], t->mval[1]}, d;
/*search cross edges for visible edge to the mouse cursor,
then use the shared vertex to calculate screen vector*/
@@ -4574,6 +4658,7 @@ static int createSlideVerts(TransInfo *t)
efa->e1->f1++;
if(efa->e1->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4582,6 +4667,7 @@ static int createSlideVerts(TransInfo *t)
efa->e2->f1++;
if(efa->e2->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4590,6 +4676,7 @@ static int createSlideVerts(TransInfo *t)
efa->e3->f1++;
if(efa->e3->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4598,13 +4685,15 @@ static int createSlideVerts(TransInfo *t)
efa->e4->f1++;
if(efa->e4->f1 > 2) {
//BKE_report(op->reports, RPT_ERROR, "3+ face edge");
+ MEM_freeN(sld);
return 0;
}
}
// Make sure loop is not 2 edges of same face
if(ct > 1) {
//BKE_report(op->reports, RPT_ERROR, "Loop crosses itself");
- return 0;
+ MEM_freeN(sld);
+ return 0;
}
}
@@ -4616,6 +4705,7 @@ static int createSlideVerts(TransInfo *t)
// Test for multiple segments
if(vertsel > numsel+1) {
//BKE_report(op->reports, RPT_ERROR, "Please choose a single edge loop");
+ MEM_freeN(sld);
return 0;
}
@@ -4652,6 +4742,7 @@ static int createSlideVerts(TransInfo *t)
if(timesthrough >= numsel*2) {
BLI_linklist_free(edgelist,NULL);
//BKE_report(op->reports, RPT_ERROR, "Could not order loop");
+ MEM_freeN(sld);
return 0;
}
}
@@ -4784,7 +4875,7 @@ static int createSlideVerts(TransInfo *t)
look = look->next;
}
- // make sure the UPs nad DOWNs are 'faceloops'
+ // make sure the UPs and DOWNs are 'faceloops'
// Also find the nearest slidevert to the cursor
look = vertlist;
@@ -4801,7 +4892,7 @@ static int createSlideVerts(TransInfo *t)
return 0;
}
- if(me->drawflag & ME_DRAW_EDGELEN) {
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
if(!(tempsv->up->f & SELECT)) {
tempsv->up->f |= SELECT;
tempsv->up->f2 |= 16;
@@ -4823,7 +4914,7 @@ static int createSlideVerts(TransInfo *t)
sv = BLI_ghash_lookup(vertgh, ev);
if(sv) {
- float co[3], co2[3], vec[3];
+ float co[3], co2[3], tvec[3];
ev = (EditVert*)look->link;
@@ -4840,12 +4931,12 @@ static int createSlideVerts(TransInfo *t)
}
if (ev == tempsv->up->v1) {
- sub_v3_v3v3(vec, co, co2);
+ sub_v3_v3v3(tvec, co, co2);
} else {
- sub_v3_v3v3(vec, co2, co);
+ sub_v3_v3v3(tvec, co2, co);
}
- add_v3_v3(start, vec);
+ add_v3_v3(start, tvec);
if (v3d) {
view3d_project_float(t->ar, tempsv->down->v1->co, co, projectMat);
@@ -4853,12 +4944,12 @@ static int createSlideVerts(TransInfo *t)
}
if (ev == tempsv->down->v1) {
- sub_v3_v3v3(vec, co2, co);
+ sub_v3_v3v3(tvec, co2, co);
} else {
- sub_v3_v3v3(vec, co, co2);
+ sub_v3_v3v3(tvec, co, co2);
}
- add_v3_v3(end, vec);
+ add_v3_v3(end, tvec);
totvec += 1.0f;
nearest = (EditVert*)look->link;
@@ -4876,7 +4967,26 @@ static int createSlideVerts(TransInfo *t)
start[0] = t->mval[0];
start[1] = t->mval[1];
add_v3_v3v3(end, start, vec);
-
+
+
+ /* Ensure minimum screen distance, when looking top down on edge loops */
+#define EDGE_SLIDE_MIN 30
+ if (len_squared_v2v2(start, end) < (EDGE_SLIDE_MIN * EDGE_SLIDE_MIN)) {
+ if(ABS(start[0]-end[0]) + ABS(start[1]-end[1]) < 4.0f) {
+ /* even more exceptional case, points are ontop of eachother */
+ end[0]= start[0];
+ end[1]= start[1] + EDGE_SLIDE_MIN;
+ }
+ else {
+ sub_v2_v2(end, start);
+ normalize_v2(end);
+ mul_v2_fl(end, EDGE_SLIDE_MIN);
+ add_v2_v2(end, start);
+ }
+ }
+#undef EDGE_SLIDE_MIN
+
+
sld->start[0] = (short) start[0];
sld->start[1] = (short) start[1];
sld->end[0] = (short) end[0];
@@ -4921,7 +5031,7 @@ static int createSlideVerts(TransInfo *t)
uv_new = tf->uv[k];
if (ev->tmp.l) {
- if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001 || fabs(suv->origuv[1]-uv_new[1])) {
+ if (fabs(suv->origuv[0]-uv_new[0]) > 0.0001f || fabs(suv->origuv[1]-uv_new[1]) > 0.0001f) {
ev->tmp.l = -1; /* Tag as invalid */
BLI_linklist_free(suv->fuv_list,NULL);
suv->fuv_list = NULL;
@@ -4995,8 +5105,23 @@ void freeSlideVerts(TransInfo *t)
#if 0
TransDataSlideUv *suv;
SlideData *sld = t->customData;
+ Mesh *me = t->obedit->data;
int uvlay_idx;
+ if(me->drawflag & ME_DRAWEXTRA_EDGELEN) {
+ TransDataSlideVert *tempsv;
+ LinkNode *look = sld->vertlist;
+ GHash *vertgh = sld->vhash;
+ while(look) {
+ tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link);
+ if(tempsv != NULL) {
+ tempsv->up->f &= !SELECT;
+ tempsv->down->f &= !SELECT;
+ }
+ look = look->next;
+ }
+ }
+
//BLI_ghash_free(edgesgh, freeGHash, NULL);
BLI_ghash_free(sld->vhash, NULL, (GHashValFreeFP)MEM_freeN);
BLI_linklist_free(sld->vertlist, NULL);
@@ -5031,7 +5156,11 @@ void initEdgeSlide(TransInfo *t)
t->mode = TFM_EDGE_SLIDE;
t->transform = EdgeSlide;
- createSlideVerts(t);
+ if(!createSlideVerts(t)) {
+ t->state= TRANS_CANCEL;
+ return;
+ }
+
sld = t->customData;
if (!sld)
@@ -5084,18 +5213,16 @@ int doEdgeSlide(TransInfo *t, float perc)
LinkNode *vertlist=sld->vertlist, *look;
GHash *vertgh = sld->vhash;
TransDataSlideVert *tempsv;
- float len = 0.0f;
+ float len;
int prop=1, flip=0;
/* UV correction vars */
GHash **uvarray= sld->uvhash;
int uvlay_tot= CustomData_number_of_layers(&em->fdata, CD_MTFACE);
int uvlay_idx;
- TransDataSlideUv *suv=sld->slideuv;
+ TransDataSlideUv *suv;
float uv_tmp[2];
LinkNode *fuv_link;
- len = 0.0f;
-
tempsv = BLI_ghash_lookup(vertgh,nearest);
centerVert = editedge_getSharedVert(tempsv->up, tempsv->down);
@@ -5187,7 +5314,7 @@ int doEdgeSlide(TransInfo *t, float perc)
#endif
}
-int EdgeSlide(TransInfo *t, short mval[2])
+int EdgeSlide(TransInfo *t, short UNUSED(mval[2]))
{
char str[50];
float final;
@@ -5246,7 +5373,7 @@ void initBoneRoll(TransInfo *t)
t->flag |= T_NO_CONSTRAINT|T_NO_PROJECT;
}
-int BoneRoll(TransInfo *t, short mval[2])
+int BoneRoll(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
int i;
@@ -5382,7 +5509,7 @@ void initMirror(TransInfo *t)
}
}
-int Mirror(TransInfo *t, short mval[2])
+int Mirror(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td;
float size[3], mat[3][3];
@@ -5459,7 +5586,7 @@ void initAlign(TransInfo *t)
initMouseInputMode(t, &t->mouse, INPUT_NONE);
}
-int Align(TransInfo *t, short mval[2])
+int Align(TransInfo *t, short UNUSED(mval[2]))
{
TransData *td = t->data;
float center[3];
@@ -5562,7 +5689,7 @@ static void applySeqSlide(TransInfo *t, float val[2]) {
}
}
-int SeqSlide(TransInfo *t, short mval[2])
+int SeqSlide(TransInfo *t, short UNUSED(mval[2]))
{
char str[200];
@@ -5790,7 +5917,7 @@ static void headerTimeTranslate(TransInfo *t, char *str)
sprintf(str, "DeltaX: %s", &tvec[0]);
}
-static void applyTimeTranslate(TransInfo *t, float sval)
+static void applyTimeTranslate(TransInfo *t, float UNUSED(sval))
{
TransData *td = t->data;
TransData2D *td2d = t->data2d;
@@ -6092,7 +6219,7 @@ static void applyTimeScale(TransInfo *t) {
}
}
-int TimeScale(TransInfo *t, short mval[2])
+int TimeScale(TransInfo *t, short UNUSED(mval[2]))
{
char str[200];
@@ -6113,16 +6240,16 @@ int TimeScale(TransInfo *t, short mval[2])
/* ************************************ */
-void BIF_TransformSetUndo(char *str)
+void BIF_TransformSetUndo(char *UNUSED(str))
{
// TRANSFORM_FIX_ME
//Trans.undostr= str;
}
-void NDofTransform()
-{
#if 0 // TRANSFORM_FIX_ME
+static void NDofTransform(void)
+{
float fval[7];
float maxval = 50.0f; // also serves as threshold
int axis = -1;
@@ -6167,5 +6294,5 @@ void NDofTransform()
initTransform(mode, CTX_NDOF);
Transform();
}
-#endif
}
+#endif
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 487609e0ad8..c01aa89d717 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -132,8 +132,8 @@ typedef struct TransCon {
typedef struct TransDataExtension {
float drot[3]; /* Initial object drot */
- float drotAngle; /* Initial object drotAngle */
- float drotAxis[3]; /* Initial object drotAxis */
+ // float drotAngle; /* Initial object drotAngle, TODO: not yet implimented */
+ // float drotAxis[3]; /* Initial object drotAxis, TODO: not yet implimented */
float dquat[4]; /* Initial object dquat */
float dsize[3]; /* Initial object dsize */
float *rot; /* Rotation of the data to transform (Faculative) */
@@ -147,6 +147,8 @@ typedef struct TransDataExtension {
float *size; /* Size of the data to transform (Faculative) */
float isize[3]; /* Initial size */
float obmat[4][4]; /* Object matrix */
+ float l_smtx[3][3]; /* use instead of td->smtx, It is the same but without the 'bone->bone_mat', see TD_PBONE_LOCAL_MTX_C */
+ int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */
} TransDataExtension;
typedef struct TransData2D {
@@ -167,7 +169,7 @@ typedef struct TransDataCurveHandleFlags {
typedef struct TransDataSeq {
struct Sequence *seq;
int flag; /* a copy of seq->flag that may be modified for nested strips */
- short start_offset; /* use this so we can have transform data at the strips start, but apply correctly to the start frame */
+ int start_offset; /* use this so we can have transform data at the strips start, but apply correctly to the start frame */
short sel_flag; /* one of SELECT, SEQ_LEFTSEL and SEQ_RIGHTSEL */
} TransDataSeq;
@@ -243,7 +245,6 @@ typedef struct TransData {
void *extra; /* extra data (mirrored element pointer, in editmode mesh to EditVert) (editbone for roll fixing) (...) */
int flag; /* Various flags */
short protectflag; /* If set, copy of Object or PoseChannel protection */
- int rotOrder; /* rotation mode, as defined in eRotationModes (DNA_action_types.h) */
} TransData;
typedef struct MouseInput {
@@ -324,8 +325,10 @@ typedef struct TransInfo {
float values[4];
float auto_values[4];
float axis[3];
+ float axis_orig[3]; /* TransCon can change 'axis', store the original value here */
void *view;
+ struct bContext *context; /* Only valid (non null) during an operator called function. */
struct ScrArea *sa;
struct ARegion *ar;
struct Scene *scene;
@@ -432,7 +435,7 @@ typedef struct TransInfo {
#define TD_USEQUAT (1 << 3)
#define TD_NOTCONNECTED (1 << 4)
#define TD_SINGLESIZE (1 << 5) /* used for scaling of MetaElem->rad */
-#define TD_TIMEONLY (1 << 8)
+/*#define TD_TIMEONLY (1 << 8) */ /*UNUSED*/
#define TD_NOCENTER (1 << 9)
#define TD_NO_EXT (1 << 10) /* ext abused for particle key timing */
#define TD_SKIP (1 << 11) /* don't transform this data */
@@ -443,6 +446,8 @@ typedef struct TransInfo {
#define TD_MIRROR_EDGE (1 << 16) /* For editmode mirror, clamp to x = 0 */
#define TD_MOVEHANDLE1 (1 << 17) /* For fcurve handles, move them along with their keyframes */
#define TD_MOVEHANDLE2 (1 << 18)
+#define TD_PBONE_LOCAL_MTX_P (1 << 19) /* exceptional case with pose bone rotating when a parent bone has 'Local Location' option enabled and rotating also transforms it. */
+#define TD_PBONE_LOCAL_MTX_C (1 << 20) /* same as above but for a child bone */
/* transsnap->status */
#define SNAP_FORCED 1
@@ -455,7 +460,7 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot);
int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
int transformEvent(TransInfo *t, struct wmEvent *event);
-void transformApply(const struct bContext *C, TransInfo *t);
+void transformApply(struct bContext *C, TransInfo *t);
int transformEnd(struct bContext *C, TransInfo *t);
void setTransformViewMatrices(TransInfo *t);
@@ -564,7 +569,6 @@ void flushTransSeq(TransInfo *t);
/*********************** exported from transform_manipulator.c ********** */
int gimbal_axis(struct Object *ob, float gmat[][3]); /* return 0 when no gimbal for selection */
int calc_manipulator_stats(const struct bContext *C);
-float get_drawsize(struct ARegion *ar, float *co);
/*********************** TransData Creation and General Handling *********** */
void createTransData(struct bContext *C, TransInfo *t);
@@ -582,7 +586,7 @@ void autokeyframe_pose_cb_func(struct bContext *C, struct Scene *scene, struct V
/*********************** Constraints *****************************/
-void drawConstraint(const struct bContext *C, TransInfo *t);
+void drawConstraint(TransInfo *t);
void getConstraintMatrix(TransInfo *t);
void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]);
@@ -591,7 +595,6 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char tex
void constraintNumInput(TransInfo *t, float vec[3]);
-void getConstraintMatrix(TransInfo *t);
int isLockConstraint(TransInfo *t);
int getConstraintSpaceDimension(TransInfo *t);
char constraintModeToChar(TransInfo *t);
@@ -668,8 +671,6 @@ TransDataCurveHandleFlags *initTransDataCurveHandes(TransData *td, struct BezTri
/* DRAWLINE options flags */
#define DRAWLIGHT 1
-#define DRAWDASHED 2
-#define DRAWBOLD 4
void applyTransObjects(TransInfo *t);
void restoreTransObjects(TransInfo *t);
@@ -725,9 +726,6 @@ void applyTransformOrientation(const struct bContext *C, float mat[3][3], char *
int getTransformOrientation(const struct bContext *C, float normal[3], float plane[3], int activeOnly);
-int createSpaceNormal(float mat[3][3], float normal[3]);
-int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
-
void freeSlideVerts(TransInfo *t);
#endif
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 5f097c5d12e..4427e472412 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -49,12 +49,13 @@
#include "BIF_glutil.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "ED_image.h"
#include "ED_view3d.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
//#include "blendef.h"
//
@@ -68,7 +69,7 @@
static void drawObjectConstraint(TransInfo *t);
/* ************************** CONSTRAINTS ************************* */
-void constraintAutoValues(TransInfo *t, float vec[3])
+static void constraintAutoValues(TransInfo *t, float vec[3])
{
int mode = t->con.mode;
if (mode & CON_APPLY)
@@ -154,14 +155,16 @@ static void postConstraintChecks(TransInfo *t, float vec[3], float pvec[3]) {
if (hasNumInput(&t->num)) {
applyNumInput(&t->num, vec);
+ removeAspectRatio(t, vec);
constraintNumInput(t, vec);
}
/* autovalues is operator param, use that directly but not if snapping is forced */
if (t->flag & T_AUTOVALUES && (t->tsnap.status & SNAP_FORCED) == 0)
{
- VECCOPY(vec, t->auto_values);
+ mul_v3_m3v3(vec, t->con.imtx, t->auto_values);
constraintAutoValues(t, vec);
+ /* inverse transformation at the end */
}
if (t->con.mode & CON_AXIS0) {
@@ -558,9 +561,8 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char fte
switch(orientation) {
case V3D_MANIP_GLOBAL:
{
- float mtx[3][3];
+ float mtx[3][3]= MAT3_UNITY;
sprintf(text, ftext, "global");
- unit_m3(mtx);
setConstraint(t, mtx, mode, text);
}
break;
@@ -593,7 +595,7 @@ void setUserConstraint(TransInfo *t, short orientation, int mode, const char fte
/*----------------- DRAWING CONSTRAINTS -------------------*/
-void drawConstraint(const struct bContext *C, TransInfo *t)
+void drawConstraint(TransInfo *t)
{
TransCon *tc = &(t->con);
@@ -623,9 +625,9 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
convertViewVec(t, vec, (short)(t->mval[0] - t->con.imval[0]), (short)(t->mval[1] - t->con.imval[1]));
add_v3_v3(vec, tc->center);
- drawLine(t, tc->center, tc->mtx[0], 'x', 0);
- drawLine(t, tc->center, tc->mtx[1], 'y', 0);
- drawLine(t, tc->center, tc->mtx[2], 'z', 0);
+ drawLine(t, tc->center, tc->mtx[0], 'X', 0);
+ drawLine(t, tc->center, tc->mtx[1], 'Y', 0);
+ drawLine(t, tc->center, tc->mtx[2], 'Z', 0);
glColor3ubv((GLubyte *)col2);
@@ -645,13 +647,13 @@ void drawConstraint(const struct bContext *C, TransInfo *t)
}
if (tc->mode & CON_AXIS0) {
- drawLine(t, tc->center, tc->mtx[0], 'x', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[0], 'X', DRAWLIGHT);
}
if (tc->mode & CON_AXIS1) {
- drawLine(t, tc->center, tc->mtx[1], 'y', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[1], 'Y', DRAWLIGHT);
}
if (tc->mode & CON_AXIS2) {
- drawLine(t, tc->center, tc->mtx[2], 'z', DRAWLIGHT);
+ drawLine(t, tc->center, tc->mtx[2], 'Z', DRAWLIGHT);
}
}
}
@@ -712,26 +714,26 @@ static void drawObjectConstraint(TransInfo *t) {
Without drawing the first light, users have little clue what they are doing.
*/
if (t->con.mode & CON_AXIS0) {
- drawLine(t, td->ob->obmat[3], td->axismtx[0], 'x', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[0], 'X', DRAWLIGHT);
}
if (t->con.mode & CON_AXIS1) {
- drawLine(t, td->ob->obmat[3], td->axismtx[1], 'y', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[1], 'Y', DRAWLIGHT);
}
if (t->con.mode & CON_AXIS2) {
- drawLine(t, td->ob->obmat[3], td->axismtx[2], 'z', DRAWLIGHT);
+ drawLine(t, td->ob->obmat[3], td->axismtx[2], 'Z', DRAWLIGHT);
}
td++;
for(i=1;i<t->total;i++,td++) {
if (t->con.mode & CON_AXIS0) {
- drawLine(t, td->ob->obmat[3], td->axismtx[0], 'x', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[0], 'X', 0);
}
if (t->con.mode & CON_AXIS1) {
- drawLine(t, td->ob->obmat[3], td->axismtx[1], 'y', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[1], 'Y', 0);
}
if (t->con.mode & CON_AXIS2) {
- drawLine(t, td->ob->obmat[3], td->axismtx[2], 'z', 0);
+ drawLine(t, td->ob->obmat[3], td->axismtx[2], 'Z', 0);
}
}
}
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index befcac13514..e55e6ba33e9 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,6 +47,7 @@
#include "DNA_constraint_types.h"
#include "DNA_scene_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_gpencil_types.h"
#include "MEM_guardedalloc.h"
@@ -57,6 +58,7 @@
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
+#include "BKE_gpencil.h"
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_main.h"
@@ -69,6 +71,7 @@
#include "BKE_bmesh.h"
#include "BKE_tessmesh.h"
#include "BKE_scene.h"
+#include "BKE_report.h"
#include "ED_anim_api.h"
@@ -83,6 +86,7 @@
#include "ED_types.h"
#include "ED_uvedit.h"
#include "ED_curve.h" /* for ED_curve_editnurbs */
+#include "ED_util.h" /* for crazyspace correction */
#include "UI_view2d.h"
@@ -90,6 +94,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "RNA_access.h"
@@ -105,20 +110,19 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list);
/* ************************** Functions *************************** */
-static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail) {
- TransData pivot = *head;
+static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, TransData *temp) {
TransData *ihead = head;
TransData *itail = tail;
- short connected = t->flag & T_PROP_CONNECTED;
+ *temp = *head;
while (head < tail)
{
- if (connected) {
- while ((tail->dist >= pivot.dist) && (head < tail))
+ if (t->flag & T_PROP_CONNECTED) {
+ while ((tail->dist >= temp->dist) && (head < tail))
tail--;
}
else {
- while ((tail->rdist >= pivot.rdist) && (head < tail))
+ while ((tail->rdist >= temp->rdist) && (head < tail))
tail--;
}
@@ -128,12 +132,12 @@ static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail) {
head++;
}
- if (connected) {
- while ((head->dist <= pivot.dist) && (head < tail))
+ if (t->flag & T_PROP_CONNECTED) {
+ while ((head->dist <= temp->dist) && (head < tail))
head++;
}
else {
- while ((head->rdist <= pivot.rdist) && (head < tail))
+ while ((head->rdist <= temp->rdist) && (head < tail))
head++;
}
@@ -144,16 +148,17 @@ static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail) {
}
}
- *head = pivot;
+ *head = *temp;
if (ihead < head) {
- qsort_trans_data(t, ihead, head-1);
+ qsort_trans_data(t, ihead, head-1, temp);
}
if (itail > head) {
- qsort_trans_data(t, head+1, itail);
+ qsort_trans_data(t, head+1, itail, temp);
}
}
void sort_trans_data_dist(TransInfo *t) {
+ TransData temp;
TransData *start = t->data;
int i = 1;
@@ -161,7 +166,7 @@ void sort_trans_data_dist(TransInfo *t) {
start++;
i++;
}
- qsort_trans_data(t, start, t->data + t->total - 1);
+ qsort_trans_data(t, start, t->data + t->total - 1, &temp);
}
static void sort_trans_data(TransInfo *t)
@@ -235,7 +240,7 @@ static void set_prop_dist(TransInfo *t, short with_dist)
/* ********************* texture space ********* */
-static void createTransTexspace(bContext *C, TransInfo *t)
+static void createTransTexspace(TransInfo *t)
{
Scene *scene = t->scene;
TransData *td;
@@ -270,6 +275,7 @@ static void createTransTexspace(bContext *C, TransInfo *t)
invert_m3_m3(td->smtx, td->mtx);
if (give_obdata_texspace(ob, &texflag, &td->loc, &td->ext->size, &td->ext->rot)) {
+ ob->dtx |= OB_TEXSPACE;
*texflag &= ~AUTOSPACE;
}
@@ -280,7 +286,7 @@ static void createTransTexspace(bContext *C, TransInfo *t)
/* ********************* edge (for crease) ***** */
-static void createTransEdge(bContext *C, TransInfo *t) {
+static void createTransEdge(TransInfo *t) {
BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
TransData *td = NULL;
BMEdge *eed;
@@ -453,17 +459,22 @@ static short apply_targetless_ik(Object *ob)
/* apply and decompose, doesn't work for constraints or non-uniform scale well */
{
- float rmat3[3][3], qrmat[3][3], imat[3][3], smat[3][3];
-
+ float rmat3[3][3], qrmat[3][3], imat3[3][3], smat[3][3];
+
copy_m3_m4(rmat3, rmat);
/* rotation */
- if (parchan->rotmode > 0)
- mat3_to_eulO( parchan->eul, parchan->rotmode,rmat3);
+ /* [#22409] is partially caused by this, as slight numeric error introduced during
+ * the solving process leads to locked-axis values changing. However, we cannot modify
+ * the values here, or else there are huge discreptancies between IK-solver (interactive)
+ * and applied poses.
+ */
+ if (parchan->rotmode > 0)
+ mat3_to_eulO(parchan->eul, parchan->rotmode,rmat3);
else if (parchan->rotmode == ROT_MODE_AXISANGLE)
- mat3_to_axis_angle( parchan->rotAxis, &pchan->rotAngle,rmat3);
+ mat3_to_axis_angle(parchan->rotAxis, &parchan->rotAngle,rmat3);
else
- mat3_to_quat( parchan->quat,rmat3);
+ mat3_to_quat(parchan->quat,rmat3);
/* for size, remove rotation */
/* causes problems with some constraints (so apply only if needed) */
@@ -475,8 +486,8 @@ static short apply_targetless_ik(Object *ob)
else
quat_to_mat3( qrmat,parchan->quat);
- invert_m3_m3(imat, qrmat);
- mul_m3_m3m3(smat, rmat3, imat);
+ invert_m3_m3(imat3, qrmat);
+ mul_m3_m3m3(smat, rmat3, imat3);
mat3_to_size( parchan->size,smat);
}
@@ -551,13 +562,13 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
QUATCOPY(td->ext->iquat, pchan->quat);
}
- td->rotOrder= pchan->rotmode;
+ td->ext->rotOrder= pchan->rotmode;
/* proper way to get parent transform + own transform + constraints transform */
copy_m3_m4(omat, ob->obmat);
- if (t->mode==TFM_TRANSLATION && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION))
+ if (ELEM(t->mode, TFM_TRANSLATION, TFM_RESIZE) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION))
unit_m3(bmat);
else
copy_m3_m3(bmat, pchan->bone->bone_mat);
@@ -571,16 +582,16 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
if (constraints_list_needinv(t, &pchan->constraints)) {
copy_m3_m4(tmat, pchan->constinv);
invert_m3_m3(cmat, tmat);
- mul_serie_m3(td->mtx, bmat, pmat, omat, cmat, 0,0,0,0); // dang mulserie swaps args
+ mul_serie_m3(td->mtx, bmat, pmat, omat, cmat, NULL,NULL,NULL,NULL); // dang mulserie swaps args
}
else
- mul_serie_m3(td->mtx, bmat, pmat, omat, 0,0,0,0,0); // dang mulserie swaps args
+ mul_serie_m3(td->mtx, bmat, pmat, omat, NULL,NULL,NULL,NULL,NULL); // dang mulserie swaps args
}
else {
if (constraints_list_needinv(t, &pchan->constraints)) {
copy_m3_m4(tmat, pchan->constinv);
invert_m3_m3(cmat, tmat);
- mul_serie_m3(td->mtx, bmat, omat, cmat, 0,0,0,0,0); // dang mulserie swaps args
+ mul_serie_m3(td->mtx, bmat, omat, cmat, NULL,NULL,NULL,NULL,NULL); // dang mulserie swaps args
}
else
mul_m3_m3m3(td->mtx, omat, bmat); // Mat3MulMat3 has swapped args!
@@ -588,6 +599,19 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
invert_m3_m3(td->smtx, td->mtx);
+ /* exceptional case: rotate the pose bone which also applies transformation
+ * when a parentless bone has BONE_NO_LOCAL_LOCATION [] */
+ if (!ELEM(t->mode, TFM_TRANSLATION, TFM_RESIZE) && (pchan->bone->flag & BONE_NO_LOCAL_LOCATION)) {
+ if(pchan->parent) {
+ /* same as td->smtx but without pchan->bone->bone_mat */
+ td->flag |= TD_PBONE_LOCAL_MTX_C;
+ mul_m3_m3m3(td->ext->l_smtx, pchan->bone->bone_mat, td->smtx);
+ }
+ else {
+ td->flag |= TD_PBONE_LOCAL_MTX_P;
+ }
+ }
+
/* for axismat we use bone's own transform */
copy_m3_m4(pmat, pchan->pose_mat);
mul_m3_m3m3(td->axismtx, omat, pmat);
@@ -668,7 +692,7 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
bone = pchan->bone;
- if ((bone->layer & arm->layer) && !(pchan->bone->flag & BONE_HIDDEN_P)) {
+ if (PBONE_VISIBLE(arm, bone)) {
if ((bone->flag & BONE_SELECTED) && !(ob->proxy && pchan->bone->layer & arm->layer_protected))
bone->flag |= BONE_TRANSFORM;
else
@@ -696,9 +720,8 @@ int count_set_pose_transflags(int *out_mode, short around, Object *ob)
for(pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
bone = pchan->bone;
if(bone->flag & BONE_TRANSFORM) {
-
total++;
-
+
if(mode == TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
@@ -739,7 +762,7 @@ static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
for (con= pchan->constraints.first; con; con= con->next) {
if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
bKinematicConstraint *data= con->data;
-
+
/* only accept if a temporary one (for auto-ik) */
if (data->flag & CONSTRAINT_IK_TEMP) {
/* chainlen is new chainlen, but is limited by maximum chainlen */
@@ -788,8 +811,9 @@ static void pose_grab_with_ik_clear(Object *ob)
for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
/* clear all temporary lock flags */
pchan->ikflag &= ~(BONE_IK_NO_XDOF_TEMP|BONE_IK_NO_YDOF_TEMP|BONE_IK_NO_ZDOF_TEMP);
-
+
pchan->constflag &= ~(PCHAN_HAS_IK|PCHAN_HAS_TARGET);
+
/* remove all temporary IK-constraints added */
for (con= pchan->constraints.first; con; con= next) {
next= con->next;
@@ -812,9 +836,9 @@ static void pose_grab_with_ik_clear(Object *ob)
/* adds the IK to pchan - returns if added */
static short pose_grab_with_ik_add(bPoseChannel *pchan)
{
+ bKinematicConstraint *targetless = NULL;
bKinematicConstraint *data;
bConstraint *con;
- bConstraint *targetless = 0;
/* Sanity check */
if (pchan == NULL)
@@ -823,15 +847,31 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
/* Rule: not if there's already an IK on this channel */
for (con= pchan->constraints.first; con; con= con->next) {
if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
- bKinematicConstraint *data= con->data;
- if(data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]==0)) {
- targetless = con;
+ data= con->data;
+
+ if (data->tar==NULL || (data->tar->type==OB_ARMATURE && data->subtarget[0]=='\0')) {
+ /* make reference to constraint to base things off later (if it's the last targetless constraint encountered) */
+ targetless = (bKinematicConstraint *)con->data;
+
/* but, if this is a targetless IK, we make it auto anyway (for the children loop) */
if (con->enforce!=0.0f) {
- targetless->flag |= CONSTRAINT_IK_AUTO;
- return 0;
+ data->flag |= CONSTRAINT_IK_AUTO;
+
+ /* if no chain length has been specified, just make things obey standard rotation locks too */
+ if (data->rootbone == 0) {
+ for (; pchan; pchan=pchan->parent) {
+ /* here, we set ik-settings for bone from pchan->protectflag */
+ // XXX: careful with quats/axis-angle rotations where we're locking 4d components
+ if (pchan->protectflag & OB_LOCK_ROTX) pchan->ikflag |= BONE_IK_NO_XDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTY) pchan->ikflag |= BONE_IK_NO_YDOF_TEMP;
+ if (pchan->protectflag & OB_LOCK_ROTZ) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP;
+ }
+ }
+
+ return 0;
}
}
+
if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0f))
return 0;
}
@@ -840,25 +880,32 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
con = add_pose_constraint(NULL, pchan, "TempConstraint", CONSTRAINT_TYPE_KINEMATIC);
pchan->constflag |= (PCHAN_HAS_IK|PCHAN_HAS_TARGET); /* for draw, but also for detecting while pose solving */
data= con->data;
- if (targetless) { /* if exists use values from last targetless IK-constraint as base */
- *data = *((bKinematicConstraint*)targetless->data);
+ if (targetless) {
+ /* if exists, use values from last targetless (but disabled) IK-constraint as base */
+ *data = *targetless;
}
else
data->flag= CONSTRAINT_IK_TIP;
data->flag |= CONSTRAINT_IK_TEMP|CONSTRAINT_IK_AUTO;
VECCOPY(data->grabtarget, pchan->pose_tail);
- data->rootbone= 1;
-
- /* we include only a connected chain */
- while ((pchan) && (pchan->bone->flag & BONE_CONNECTED)) {
+ data->rootbone= 0; /* watch-it! has to be 0 here, since we're still on the same bone for the first time through the loop [#25885] */
+
+ /* we only include bones that are part of a continual connected chain */
+ while (pchan) {
/* here, we set ik-settings for bone from pchan->protectflag */
+ // XXX: careful with quats/axis-angle rotations where we're locking 4d components
if (pchan->protectflag & OB_LOCK_ROTX) pchan->ikflag |= BONE_IK_NO_XDOF_TEMP;
if (pchan->protectflag & OB_LOCK_ROTY) pchan->ikflag |= BONE_IK_NO_YDOF_TEMP;
if (pchan->protectflag & OB_LOCK_ROTZ) pchan->ikflag |= BONE_IK_NO_ZDOF_TEMP;
-
+
/* now we count this pchan as being included */
data->rootbone++;
- pchan= pchan->parent;
+
+ /* continue to parent, but only if we're connected to it */
+ if (pchan->bone->flag & BONE_CONNECTED)
+ pchan = pchan->parent;
+ else
+ pchan = NULL;
}
/* make a copy of maximum chain-length */
@@ -938,7 +985,7 @@ static short pose_grab_with_ik(Object *ob)
/* only called with pose mode active object now */
-static void createTransPose(bContext *C, TransInfo *t, Object *ob)
+static void createTransPose(TransInfo *t, Object *ob)
{
bArmature *arm;
bPoseChannel *pchan;
@@ -1003,7 +1050,7 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
/* ********************* armature ************** */
-static void createTransArmatureVerts(bContext *C, TransInfo *t)
+static void createTransArmatureVerts(TransInfo *t)
{
EditBone *ebo;
bArmature *arm= t->obedit->data;
@@ -1203,7 +1250,7 @@ static void createTransArmatureVerts(bContext *C, TransInfo *t)
/* ********************* meta elements ********* */
-static void createTransMBallVerts(bContext *C, TransInfo *t)
+static void createTransMBallVerts(TransInfo *t)
{
MetaBall *mb = (MetaBall*)t->obedit->data;
MetaElem *ml;
@@ -1320,7 +1367,7 @@ static void calc_distanceCurveVerts(TransData *head, TransData *tail) {
}
/* Utility function for getting the handle data from bezier's */
-TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt) {
+static TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt) {
TransDataCurveHandleFlags *hdata;
td->flag |= TD_BEZTRIPLE;
hdata = td->hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data");
@@ -1401,7 +1448,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
) {
VECCOPY(td->iloc, bezt->vec[0]);
td->loc= bezt->vec[0];
- VECCOPY(td->center, bezt->vec[1]);
+ VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:0]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1460,7 +1507,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
) {
VECCOPY(td->iloc, bezt->vec[2]);
td->loc= bezt->vec[2];
- VECCOPY(td->center, bezt->vec[1]);
+ VECCOPY(td->center, bezt->vec[(hide_handles || bezt->f2 & SELECT) ? 1:2]);
if (hide_handles) {
if(bezt->f2 & SELECT) td->flag= TD_SELECTED;
else td->flag= 0;
@@ -1538,7 +1585,7 @@ static void createTransCurveVerts(bContext *C, TransInfo *t)
/* ********************* lattice *************** */
-static void createTransLatticeVerts(bContext *C, TransInfo *t)
+static void createTransLatticeVerts(TransInfo *t)
{
Lattice *latt = ((Lattice*)t->obedit->data)->editlatt->latt;
TransData *td = NULL;
@@ -1871,11 +1918,11 @@ static void editmesh_set_connectivity_distance(EditMesh *em, float mtx[][3])
VECADD(cent, cent, l->v->co);
}
- VECMUL(cent, 1.0f / (float)efa->len);
+ mul_v3_fl(cent, 1.0f / (float)efa->len);
}
if (cent[0] == 0.0f && cent[1] == 0.0f && cent[2] == 0.0f) cent[2] = 1.0f;
- VECCOPY(centout, cent);
+ copy_v3_v3(centout, cent);
}
#define VertsToTransData(t, td, em, eve, bweight) \
@@ -2077,7 +2124,7 @@ static void set_crazyspace_quats(BMEditMesh *em, float *origcos, float *mappedco
#endif
}
-void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) {
+static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) {
#if 0
BME_Vert *v;
BME_TransData *vtd;
@@ -2222,7 +2269,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
/* detect CrazySpace [tm] */
if(propmode==0) {
if(modifiers_getCageIndex(t->scene, t->obedit, NULL, 1)>=0) {
- if(modifiers_isCorrectableDeformed(t->scene, t->obedit)) {
+ if(modifiers_isCorrectableDeformed(t->obedit)) {
/* check if we can use deform matrices for modifier from the
start up to stack, they are more accurate than quats */
@@ -2232,9 +2279,9 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
correction with quats, relative to the coordinates after
the modifiers that support deform matrices (defcos) */
if(totleft > 0) {
- mappedcos= get_crazy_mapped_editverts(t);
+ mappedcos= crazyspace_get_mapped_editverts(t->scene, t->obedit);
quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
- set_crazyspace_quats(em, (float*)defcos, mappedcos, quats);
+ crazyspace_set_quats_editmesh(em, (float*)defcos, mappedcos, quats);
if(mappedcos)
MEM_freeN(mappedcos);
}
@@ -2374,11 +2421,10 @@ void flushTransNodes(TransInfo *t)
}
/* *** SEQUENCE EDITOR *** */
-#define XXX_DURIAN_ANIM_TX_HACK
void flushTransSeq(TransInfo *t)
{
ListBase *seqbasep= seq_give_editing(t->scene, FALSE)->seqbasep; /* Editing null check already done */
- int a, new_frame;
+ int a, new_frame, old_start;
TransData *td= NULL;
TransData2D *td2d= NULL;
TransDataSeq *tdsq= NULL;
@@ -2395,16 +2441,11 @@ void flushTransSeq(TransInfo *t)
for(a=0, td= t->data, td2d= t->data2d; a<t->total; a++, td++, td2d++) {
tdsq= (TransDataSeq *)td->extra;
seq= tdsq->seq;
+ old_start = seq->start;
new_frame= (int)floor(td2d->loc[0] + 0.5f);
switch (tdsq->sel_flag) {
case SELECT:
-#ifdef XXX_DURIAN_ANIM_TX_HACK
- if (seq != seq_prev) {
- int ofs = (new_frame - tdsq->start_offset) - seq->start; // breaks for single strips - color/image
- seq_offset_animdata(t->scene, seq, ofs);
- }
-#endif
if (seq->type != SEQ_META && (seq->depth != 0 || seq_tx_test(seq))) /* for meta's, their children move */
seq->start= new_frame - tdsq->start_offset;
@@ -2435,6 +2476,9 @@ void flushTransSeq(TransInfo *t)
else {
calc_sequence_disp(t->scene, seq);
}
+
+ if(tdsq->sel_flag == SELECT)
+ seq_offset_animdata(t->scene, seq, seq->start - old_start);
}
seq_prev= seq;
}
@@ -2525,7 +2569,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
- if(!ED_uvedit_test(t->obedit)) return;
+ if(!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
@@ -2742,6 +2786,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
for (ale= anim_data.first; ale; ale= ale->next) {
/* only if a real NLA-track */
if (ale->type == ANIMTYPE_NLATRACK) {
+ AnimData *adt = ale->adt;
NlaTrack *nlt= (NlaTrack *)ale->data;
NlaStrip *strip;
@@ -2766,7 +2811,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
tdn->id= ale->id;
tdn->oldTrack= tdn->nlt= nlt;
tdn->strip= strip;
- tdn->trackIndex= BLI_findindex(&nlt->strips, strip);
+ tdn->trackIndex= BLI_findindex(&adt->nla_tracks, nlt);
yval= (float)(tdn->trackIndex * NLACHANNEL_STEP);
@@ -2867,7 +2912,6 @@ static void createTransNlaData(bContext *C, TransInfo *t)
* It also makes sure gp-frames are still stored in chronological order after
* transform.
*/
-#if 0
static void posttrans_gpd_clean (bGPdata *gpd)
{
bGPDlayer *gpl;
@@ -2876,17 +2920,17 @@ static void posttrans_gpd_clean (bGPdata *gpd)
ListBase sel_buffer = {NULL, NULL};
bGPDframe *gpf, *gpfn;
bGPDframe *gfs, *gfsn;
-
+
/* loop 1: loop through and isolate selected gp-frames to buffer
* (these need to be sorted as they are isolated)
*/
for (gpf= gpl->frames.first; gpf; gpf= gpfn) {
short added= 0;
gpfn= gpf->next;
-
+
if (gpf->flag & GP_FRAME_SELECT) {
BLI_remlink(&gpl->frames, gpf);
-
+
/* find place to add them in buffer
* - go backwards as most frames will still be in order,
* so doing it this way will be faster
@@ -2903,27 +2947,27 @@ static void posttrans_gpd_clean (bGPdata *gpd)
BLI_addhead(&sel_buffer, gpf);
}
}
-
+
/* error checking: it is unlikely, but may be possible to have none selected */
if (sel_buffer.first == NULL)
continue;
-
+
/* if all were selected (i.e. gpl->frames is empty), then just transfer sel-buf over */
if (gpl->frames.first == NULL) {
gpl->frames.first= sel_buffer.first;
gpl->frames.last= sel_buffer.last;
-
+
continue;
}
-
+
/* loop 2: remove duplicates of frames in buffers */
for (gpf= gpl->frames.first; gpf && sel_buffer.first; gpf= gpfn) {
gpfn= gpf->next;
-
+
/* loop through sel_buffer, emptying stuff from front of buffer if ok */
for (gfs= sel_buffer.first; gfs && gpf; gfs= gfsn) {
gfsn= gfs->next;
-
+
/* if this buffer frame needs to go before current, add it! */
if (gfs->framenum < gpf->framenum) {
/* transfer buffer frame to frames list (before current) */
@@ -2935,24 +2979,22 @@ static void posttrans_gpd_clean (bGPdata *gpd)
/* transfer buffer frame to frames list (before current) */
BLI_remlink(&sel_buffer, gfs);
BLI_insertlinkbefore(&gpl->frames, gpf, gfs);
-
+
/* get rid of current frame */
- // TRANSFORM_FIX_ME
- //gpencil_layer_delframe(gpl, gpf);
+ gpencil_layer_delframe(gpl, gpf);
}
}
}
-
+
/* if anything is still in buffer, append to end */
for (gfs= sel_buffer.first; gfs; gfs= gfsn) {
gfsn= gfs->next;
-
+
BLI_remlink(&sel_buffer, gfs);
BLI_addtail(&gpl->frames, gfs);
}
}
}
-#endif
/* Called during special_aftertrans_update to make sure selected keyframes replace
* any other keyframes which may reside on that frame (that is not selected).
@@ -3075,15 +3117,14 @@ static int count_fcurve_keys(FCurve *fcu, char side, float cfra)
}
/* fully select selected beztriples, but only include if it's on the right side of cfra */
-#if 0
static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
{
bGPDframe *gpf;
int count = 0;
-
+
if (gpl == NULL)
return count;
-
+
/* only include points that occur on the right side of cfra */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
@@ -3091,10 +3132,9 @@ static int count_gplayer_frames(bGPDlayer *gpl, char side, float cfra)
count++;
}
}
-
+
return count;
}
-#endif
/* This function assigns the information to transdata */
static void TimeToTransData(TransData *td, float *time, AnimData *adt)
@@ -3131,23 +3171,23 @@ static TransData *ActionFCurveToTransData(TransData *td, TransData2D **td2dv, FC
/* only add if on the right 'side' of the current frame */
if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
TimeToTransData(td, bezt->vec[1], adt);
-
+
/*set flags to move handles as necassary*/
td->flag |= TD_MOVEHANDLE1|TD_MOVEHANDLE2;
td2d->h1 = bezt->vec[0];
td2d->h2 = bezt->vec[2];
-
+
VECCOPY2D(td2d->ih1, td2d->h1);
VECCOPY2D(td2d->ih2, td2d->h2);
-
+
td++;
td2d++;
}
}
}
-
+
*td2dv = td2d;
-
+
return td;
}
@@ -3182,12 +3222,11 @@ void flushTransGPactionData (TransInfo *t)
* The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
* on the named side are used.
*/
-#if 0
static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl, char side, float cfra)
{
bGPDframe *gpf;
int count= 0;
-
+
/* check for select frames on right side of current frame */
for (gpf= gpl->frames.first; gpf; gpf= gpf->next) {
if (gpf->flag & GP_FRAME_SELECT) {
@@ -3195,10 +3234,10 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
/* memory is calloc'ed, so that should zero everything nicely for us */
td->val= &tfd->val;
td->ival= (float)gpf->framenum;
-
+
tfd->val= (float)gpf->framenum;
tfd->sdata= &gpf->framenum;
-
+
/* advance td now */
td++;
tfd++;
@@ -3206,10 +3245,9 @@ static int GPLayerToTransData (TransData *td, tGPFtransdata *tfd, bGPDlayer *gpl
}
}
}
-
+
return count;
}
-#endif
static void createTransActionData(bContext *C, TransInfo *t)
{
@@ -3262,10 +3300,10 @@ static void createTransActionData(bContext *C, TransInfo *t)
else
cfra = (float)CFRA;
- //if (ale->type == ANIMTYPE_GPLAYER)
- // count += count_gplayer_frames(ale->data, t->frame_side, cfra);
- //else
+ if (ale->type == ANIMTYPE_FCURVE)
count += count_fcurve_keys(ale->key_data, t->frame_side, cfra);
+ else
+ count += count_gplayer_frames(ale->data, t->frame_side, cfra);
}
/* stop if trying to build list if nothing selected */
@@ -3298,15 +3336,15 @@ static void createTransActionData(bContext *C, TransInfo *t)
/* loop 2: build transdata array */
for (ale= anim_data.first; ale; ale= ale->next) {
- //if (ale->type == ANIMTYPE_GPLAYER) {
- // bGPDlayer *gpl= (bGPDlayer *)ale->data;
- // int i;
- //
- // i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra);
- // td += i;
- // tfd += i;
- //}
- //else {
+ if (ale->type == ANIMTYPE_GPLAYER) {
+ bGPDlayer *gpl= (bGPDlayer *)ale->data;
+ int i;
+
+ i = GPLayerToTransData(td, tfd, gpl, t->frame_side, cfra);
+ td += i;
+ tfd += i;
+ }
+ else {
AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
@@ -3319,7 +3357,7 @@ static void createTransActionData(bContext *C, TransInfo *t)
cfra = (float)CFRA;
td= ActionFCurveToTransData(td, &td2d, fcu, adt, t->frame_side, cfra);
- //}
+ }
}
/* check if we're supposed to be setting minx/maxx for TimeSlide */
@@ -3429,7 +3467,7 @@ static void bezt_to_transdata (TransData *td, TransData2D *td2d, AnimData *adt,
static void createTransGraphEditData(bContext *C, TransInfo *t)
{
- SpaceIpo *sipo= CTX_wm_space_graph(C);
+ SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
Scene *scene= t->scene;
ARegion *ar= t->ar;
View2D *v2d= &ar->v2d;
@@ -3446,6 +3484,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
int count=0, i;
float cfra;
float mtx[3][3], smtx[3][3];
+ const short use_handle = !(sipo->flag & SIPO_NOHANDLES);
/* determine what type of data we are operating on */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -3489,30 +3528,35 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse */
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
- if (sipo->around == V3D_LOCAL && !ELEM(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE)) {
+ const char sel1= use_handle ? bezt->f1 & SELECT : 0;
+ const char sel2= bezt->f2 & SELECT;
+ const char sel3= use_handle ? bezt->f3 & SELECT : 0;
+
+ if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) {
+ /* for 'normal' pivots - just include anything that is selected.
+ this works a bit differently in translation modes */
+ if (sel2) count++;
+ else {
+ if (sel1) count++;
+ if (sel3) count++;
+ }
+ }
+ else if (sipo->around == V3D_LOCAL) {
/* for local-pivot we only need to count the number of selected handles only, so that centerpoints don't
* don't get moved wrong
*/
if (bezt->ipo == BEZT_IPO_BEZ) {
- if (bezt->f1 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
+ if (sel1) count++;
+ if (sel3) count++;
}
- else if (bezt->f2 & SELECT) count++; // TODO: could this cause problems?
+ /* else if (sel2) count++; // TODO: could this cause problems? */
+ /* - yes this causes problems, because no td is created for the center point */
}
- else if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) {
- /* for 'normal' pivots - just include anything that is selected.
- this works a bit differently in translation modes */
- if (bezt->f2 & SELECT) count++;
- else {
- if (bezt->f1 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
- }
- }
else {
/* for 'normal' pivots - just include anything that is selected */
- if (bezt->f1 & SELECT) count++;
- if (bezt->f2 & SELECT) count++;
- if (bezt->f3 & SELECT) count++;
+ if (sel1) count++;
+ if (sel2) count++;
+ if (sel3) count++;
}
}
}
@@ -3577,21 +3621,25 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* only include BezTriples whose 'keyframe' occurs on the same side of the current frame as mouse (if applicable) */
for (i=0, bezt= fcu->bezt; i < fcu->totvert; i++, bezt++) {
if (FrameOnMouseSide(t->frame_side, bezt->vec[1][0], cfra)) {
+ const char sel1= use_handle ? bezt->f1 & SELECT : 0;
+ const char sel2= bezt->f2 & SELECT;
+ const char sel3= use_handle ? bezt->f3 & SELECT : 0;
+
TransDataCurveHandleFlags *hdata = NULL;
short h1=1, h2=1;
/* only include handles if selected, irrespective of the interpolation modes.
* also, only treat handles specially if the center point isn't selected.
*/
- if (!ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE) || !(bezt->f2 & SELECT)) {
- if (bezt->f1 & SELECT) {
+ if (!ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE) || !(sel2)) {
+ if (sel1) {
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 0, 1, 1, intvals, mtx, smtx);
}
else
h1= 0;
- if (bezt->f3 & SELECT) {
+ if (sel3) {
if (hdata==NULL)
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 2, 1, 1, intvals, mtx, smtx);
@@ -3601,34 +3649,32 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
}
/* only include main vert if selected */
- if (bezt->f2 & SELECT) {
+ if (sel2 && (sipo->around != V3D_LOCAL || ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE))) {
+
/* move handles relative to center */
if (ELEM3(t->mode, TFM_TRANSLATION, TFM_TIME_TRANSLATE, TFM_TIME_SLIDE)) {
- if (bezt->f1 & SELECT) td->flag |= TD_MOVEHANDLE1;
- if (bezt->f3 & SELECT) td->flag |= TD_MOVEHANDLE2;
+ if (sel1) td->flag |= TD_MOVEHANDLE1;
+ if (sel3) td->flag |= TD_MOVEHANDLE2;
}
- /* if scaling around individuals centers, do not include keyframes */
- if (sipo->around != V3D_LOCAL) {
- /* if handles were not selected, store their selection status */
- if (!(bezt->f1 & SELECT) && !(bezt->f3 & SELECT)) {
- if (hdata == NULL)
- hdata = initTransDataCurveHandles(td, bezt);
- }
-
- bezt_to_transdata(td++, td2d++, adt, bezt, 1, 1, 0, intvals, mtx, smtx);
+ /* if handles were not selected, store their selection status */
+ if (!(sel1) && !(sel3)) {
+ if (hdata == NULL)
+ hdata = initTransDataCurveHandles(td, bezt);
}
+
+ bezt_to_transdata(td++, td2d++, adt, bezt, 1, 1, 0, intvals, mtx, smtx);
- /* special hack (must be done after initTransDataCurveHandles(), as that stores handle settings to restore...):
- * - Check if we've got entire BezTriple selected and we're scaling/rotating that point,
- * then check if we're using auto-handles.
- * - If so, change them auto-handles to aligned handles so that handles get affected too
- */
- if ((bezt->h1 == HD_AUTO) && (bezt->h2 == HD_AUTO) && ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) {
- if (h1 && h2) {
- bezt->h1= HD_ALIGN;
- bezt->h2= HD_ALIGN;
- }
+ }
+ /* special hack (must be done after initTransDataCurveHandles(), as that stores handle settings to restore...):
+ * - Check if we've got entire BezTriple selected and we're scaling/rotating that point,
+ * then check if we're using auto-handles.
+ * - If so, change them auto-handles to aligned handles so that handles get affected too
+ */
+ if ((bezt->h1 == HD_AUTO) && (bezt->h2 == HD_AUTO) && ELEM(t->mode, TFM_ROTATION, TFM_RESIZE)) {
+ if (hdata && (sel1) && (sel3)) {
+ bezt->h1= HD_ALIGN;
+ bezt->h2= HD_ALIGN;
}
}
}
@@ -3645,20 +3691,20 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
/* ------------------------ */
-/* struct for use in re-sorting BezTriples during IPO transform */
+/* struct for use in re-sorting BezTriples during Graph Editor transform */
typedef struct BeztMap {
BezTriple *bezt;
- int oldIndex; /* index of bezt in icu->bezt array before sorting */
- int newIndex; /* index of bezt in icu->bezt array after sorting */
- short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */
- char pipo, cipo; /* interpolation of current and next segments */
+ unsigned int oldIndex; /* index of bezt in fcu->bezt array before sorting */
+ unsigned int newIndex; /* index of bezt in fcu->bezt array after sorting */
+ short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */
+ char pipo, cipo; /* interpolation of current and next segments */
} BeztMap;
/* This function converts an FCurve's BezTriple array to a BeztMap array
* NOTE: this allocates memory that will need to get freed later
*/
-static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
+static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert, const short UNUSED(use_handle))
{
BezTriple *bezt= bezts;
BezTriple *prevbezt= NULL;
@@ -3685,7 +3731,7 @@ static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
}
/* This function copies the code of sort_time_ipocurve, but acts on BeztMap structs instead */
-static void sort_time_beztmaps (BeztMap *bezms, int totvert)
+static void sort_time_beztmaps (BeztMap *bezms, int totvert, const short UNUSED(use_handle))
{
BeztMap *bezm;
int i, ok= 1;
@@ -3731,7 +3777,7 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert)
}
/* This function firstly adjusts the pointers that the transdata has to each BezTriple */
-static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert)
+static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert, const short use_handle)
{
BezTriple *bezts = fcu->bezt;
BeztMap *bezm;
@@ -3758,7 +3804,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
/* only selected verts */
if (bezm->pipo == BEZT_IPO_BEZ) {
- if (bezm->bezt->f1 & SELECT) {
+ if (use_handle && bezm->bezt->f1 & SELECT) {
if (td->loc2d == bezm->bezt->vec[0]) {
if (bezm->swapHs == 1)
td->loc2d= (bezts + bezm->newIndex)->vec[2];
@@ -3769,7 +3815,7 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
}
}
if (bezm->cipo == BEZT_IPO_BEZ) {
- if (bezm->bezt->f3 & SELECT) {
+ if (use_handle && bezm->bezt->f3 & SELECT) {
if (td->loc2d == bezm->bezt->vec[2]) {
if (bezm->swapHs == 1)
td->loc2d= (bezts + bezm->newIndex)->vec[0];
@@ -3782,6 +3828,11 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
if (bezm->bezt->f2 & SELECT) {
if (td->loc2d == bezm->bezt->vec[1]) {
td->loc2d= (bezts + bezm->newIndex)->vec[1];
+
+ /* if only control point is selected, the handle pointers need to be updated as well */
+ td->h1= (bezts + bezm->newIndex)->vec[0];
+ td->h2= (bezts + bezm->newIndex)->vec[2];
+
adjusted[j] = 1;
}
}
@@ -3802,7 +3853,9 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
*/
void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
{
+ SpaceIpo *sipo = (SpaceIpo *)t->sa->spacedata.first;
bAnimListElem *ale;
+ const short use_handle = !(sipo->flag & SIPO_NOHANDLES);
/* sort and reassign verts */
for (ale= anim_data->first; ale; ale= ale->next) {
@@ -3812,9 +3865,9 @@ void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
BeztMap *bezm;
/* adjust transform-data pointers */
- bezm= bezt_to_beztmaps(fcu->bezt, fcu->totvert);
- sort_time_beztmaps(bezm, fcu->totvert);
- beztmap_to_data(t, fcu, bezm, fcu->totvert);
+ bezm= bezt_to_beztmaps(fcu->bezt, fcu->totvert, use_handle);
+ sort_time_beztmaps(bezm, fcu->totvert, use_handle);
+ beztmap_to_data(t, fcu, bezm, fcu->totvert, use_handle);
/* free mapping stuff */
MEM_freeN(bezm);
@@ -3862,7 +3915,7 @@ void flushTransGraphData(TransInfo *t)
break;
}
}
-
+
/* we need to unapply the nla-mapping from the time in some situations */
if (adt)
td2d->loc2d[0]= BKE_nla_tweakedit_remap(adt, td2d->loc[0], NLATIME_CONVERT_UNMAP);
@@ -3874,12 +3927,12 @@ void flushTransGraphData(TransInfo *t)
td2d->loc2d[1]= (float)((int)td2d->loc[1]);
else
td2d->loc2d[1]= td2d->loc[1];
-
+
if ((td->flag & TD_MOVEHANDLE1) && td2d->h1) {
td2d->h1[0] = td2d->ih1[0] + td->loc[0] - td->iloc[0];
td2d->h1[1] = td2d->ih1[1] + td->loc[1] - td->iloc[1];
}
-
+
if ((td->flag & TD_MOVEHANDLE2) && td2d->h2) {
td2d->h2[0] = td2d->ih2[0] + td->loc[0] - td->iloc[0];
td2d->h2[1] = td2d->ih2[1] + td->loc[1] - td->iloc[1];
@@ -3887,47 +3940,7 @@ void flushTransGraphData(TransInfo *t)
}
}
-/* *************************** Object Transform data ******************* */
-
-/* Little helper function for ObjectToTransData used to give certain
- * constraints (ChildOf, FollowPath, and others that may be added)
- * inverse corrections for transform, so that they aren't in CrazySpace.
- * These particular constraints benefit from this, but others don't, hence
- * this semi-hack ;-) - Aligorith
- */
-static short constraints_list_needinv(TransInfo *t, ListBase *list)
-{
- bConstraint *con;
-
- /* loop through constraints, checking if there's one of the mentioned
- * constraints needing special crazyspace corrections
- */
- if (list) {
- for (con= list->first; con; con=con->next) {
- /* only consider constraint if it is enabled, and has influence on result */
- if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
- /* (affirmative) returns for specific constraints here... */
- /* constraints that require this regardless */
- if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
- if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
- if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
-
- /* constraints that require this only under special conditions */
- if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
- /* CopyRot constraint only does this when rotating, and offset is on */
- bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
-
- if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
- return 1;
- }
- }
- }
- }
-
- /* no appropriate candidates found */
- return 0;
-}
-
+/* ******************* Sequencer Transform data ******************* */
/* This function applies the rules for transforming a strip so duplicate
* checks dont need to be added in multiple places.
@@ -3937,14 +3950,20 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
* seq->depth must be set before running this function so we know if the strips
* are root level or not
*/
+#define XXX_DURIAN_ANIM_TX_HACK
static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count, int *flag)
{
#ifdef XXX_DURIAN_ANIM_TX_HACK
/* hack */
if((seq->flag & SELECT)==0 && seq->type & SEQ_EFFECT) {
- Sequence *seq_t[3] = {seq->seq1, seq->seq2, seq->seq3};
+ Sequence *seq_t[3];
int i;
+
+ seq_t[0]= seq->seq1;
+ seq_t[1]= seq->seq2;
+ seq_t[2]= seq->seq3;
+
for(i=0; i<3; i++) {
if (seq_t[i] && ((seq_t[i])->flag & SELECT) && !(seq_t[i]->flag & SEQ_LOCK) && !(seq_t[i]->flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)))
seq->flag |= SELECT;
@@ -4074,7 +4093,7 @@ static int SeqTransCount(TransInfo *t, ListBase *seqbase, int depth)
}
-static TransData *SeqToTransData(TransInfo *t, TransData *td, TransData2D *td2d, TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
+static TransData *SeqToTransData(TransData *td, TransData2D *td2d, TransDataSeq *tdsq, Sequence *seq, int flag, int sel_flag)
{
int start_left;
@@ -4159,16 +4178,16 @@ static int SeqToTransData_Recursive(TransInfo *t, ListBase *seqbase, TransData *
if (flag & SELECT) {
if (flag & (SEQ_LEFTSEL|SEQ_RIGHTSEL)) {
if (flag & SEQ_LEFTSEL) {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SEQ_LEFTSEL);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SEQ_LEFTSEL);
tot++;
}
if (flag & SEQ_RIGHTSEL) {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SEQ_RIGHTSEL);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SEQ_RIGHTSEL);
tot++;
}
}
else {
- SeqToTransData(t, td++, td2d++, tdsq++, seq, flag, SELECT);
+ SeqToTransData(td++, td2d++, tdsq++, seq, flag, SELECT);
tot++;
}
}
@@ -4327,8 +4346,49 @@ static void createTransSeqData(bContext *C, TransInfo *t)
}
+/* *********************** Object Transform data ******************* */
+
+/* Little helper function for ObjectToTransData used to give certain
+ * constraints (ChildOf, FollowPath, and others that may be added)
+ * inverse corrections for transform, so that they aren't in CrazySpace.
+ * These particular constraints benefit from this, but others don't, hence
+ * this semi-hack ;-) - Aligorith
+ */
+static short constraints_list_needinv(TransInfo *t, ListBase *list)
+{
+ bConstraint *con;
+
+ /* loop through constraints, checking if there's one of the mentioned
+ * constraints needing special crazyspace corrections
+ */
+ if (list) {
+ for (con= list->first; con; con=con->next) {
+ /* only consider constraint if it is enabled, and has influence on result */
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
+ /* (affirmative) returns for specific constraints here... */
+ /* constraints that require this regardless */
+ if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
+ if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
+ if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
+
+ /* constraints that require this only under special conditions */
+ if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
+ /* CopyRot constraint only does this when rotating, and offset is on */
+ bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
+
+ if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
+ return 1;
+ }
+ }
+ }
+ }
+
+ /* no appropriate candidates found */
+ return 0;
+}
+
/* transcribe given object into TransData for Transforming */
-static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *ob)
+static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
{
Scene *scene = t->scene;
float obmtx[3][3];
@@ -4386,8 +4446,8 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
td->ext->irotAngle= ob->rotAngle;
VECCOPY(td->ext->irotAxis, ob->rotAxis);
- td->ext->drotAngle= ob->drotAngle;
- VECCOPY(td->ext->drotAxis, ob->drotAxis);
+ // td->ext->drotAngle= ob->drotAngle; // XXX, not implimented
+ // VECCOPY(td->ext->drotAxis, ob->drotAxis); // XXX, not implimented
}
else {
td->ext->rot= NULL;
@@ -4398,7 +4458,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
QUATCOPY(td->ext->iquat, ob->quat);
QUATCOPY(td->ext->dquat, ob->dquat);
}
- td->rotOrder=ob->rotmode;
+ td->ext->rotOrder=ob->rotmode;
td->ext->size = ob->size;
VECCOPY(td->ext->isize, ob->size);
@@ -4438,7 +4498,7 @@ static void ObjectToTransData(bContext *C, TransInfo *t, TransData *td, Object *
/* sets flags in Bases to define whether they take part in transform */
/* it deselects Bases, so we have to call the clear function always after */
-static void set_trans_object_base_flags(bContext *C, TransInfo *t)
+static void set_trans_object_base_flags(TransInfo *t)
{
Scene *scene = t->scene;
View3D *v3d = t->view;
@@ -4473,8 +4533,11 @@ static void set_trans_object_base_flags(bContext *C, TransInfo *t)
while(parsel) {
if(parsel->flag & SELECT) {
Base *parbase = object_in_scene(parsel, scene);
- if TESTBASELIB_BGMODE(v3d, scene, parbase)
+ if(parbase) { /* in rare cases this can fail */
+ if TESTBASELIB_BGMODE(v3d, scene, parbase) {
break;
+ }
+ }
}
parsel= parsel->parent;
}
@@ -4612,6 +4675,7 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
// TODO: this should probably be done per channel instead...
if (autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
ListBase dsources = {NULL, NULL};
float cfra= (float)CFRA; // xxx this will do for now
@@ -4623,24 +4687,24 @@ void autokeyframe_ob_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *ob,
/* add datasource override for the camera object */
ANIM_relative_keyingset_add_source(&dsources, id, NULL, NULL);
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) {
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (active_ks)) {
/* only insert into active keyingset
* NOTE: we assume here that the active Keying Set does not need to have its iterator overridden spe
*/
ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
}
- else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)) {
AnimData *adt= ob->adt;
/* only key on available channels */
if (adt && adt->action) {
for (fcu= adt->action->curves.first; fcu; fcu= fcu->next) {
fcu->flag &= ~FCURVE_SELECTED;
- insert_keyframe(id, adt->action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, adt->action, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
}
}
}
- else if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) {
short doLoc=0, doRot=0, doScale=0;
/* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
@@ -4711,6 +4775,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
// TODO: this should probably be done per channel instead...
if (autokeyframe_cfra_can_key(scene, id)) {
+ ReportList *reports = CTX_wm_reports(C);
KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene);
float cfra= (float)CFRA;
short flag= 0;
@@ -4736,12 +4801,12 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
ANIM_relative_keyingset_add_source(&dsources, id, &RNA_PoseBone, pchan);
/* only insert into active keyingset? */
- if (IS_AUTOKEY_FLAG(ONLYKEYINGSET) && (active_ks)) {
+ if (IS_AUTOKEY_FLAG(scene, ONLYKEYINGSET) && (active_ks)) {
/* run the active Keying Set on the current datasource */
ANIM_apply_keyingset(C, &dsources, NULL, active_ks, MODIFYKEY_MODE_INSERT, cfra);
}
/* only insert into available channels? */
- else if (IS_AUTOKEY_FLAG(INSERTAVAIL)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)) {
if (act) {
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
/* only insert keyframes for this F-Curve if it affects the current bone */
@@ -4752,7 +4817,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
* NOTE: this will do constraints too, but those are ok to do here too?
*/
if (pchanName && strcmp(pchanName, pchan->name) == 0)
- insert_keyframe(id, act, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
+ insert_keyframe(reports, id, act, ((fcu->grp)?(fcu->grp->name):(NULL)), fcu->rna_path, fcu->array_index, cfra, flag);
if (pchanName) MEM_freeN(pchanName);
}
@@ -4760,7 +4825,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
}
}
/* only insert keyframe if needed? */
- else if (IS_AUTOKEY_FLAG(INSERTNEEDED)) {
+ else if (IS_AUTOKEY_FLAG(scene, INSERTNEEDED)) {
short doLoc=0, doRot=0, doScale=0;
/* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
@@ -4816,7 +4881,7 @@ void autokeyframe_pose_cb_func(bContext *C, Scene *scene, View3D *v3d, Object *o
*/
if (C && (ob->pose->avs.path_bakeflag & MOTIONPATH_BAKE_HAS_PATHS)) {
//ED_pose_clear_paths(C, ob); // XXX for now, don't need to clear
- ED_pose_recalculate_paths(C, scene, ob);
+ ED_pose_recalculate_paths(scene, ob);
}
}
else {
@@ -4924,9 +4989,9 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
// fixme... some of this stuff is not good
if (ob) {
if (ob->pose || ob_get_key(ob))
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
else
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
/* Do curve cleanups? */
@@ -4949,28 +5014,25 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
else if (ELEM(t->frame_side, 'L', 'R'))
scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side);
}
+ else if(t->mode == TFM_TIME_SCALE) {
+ scene_marker_tfm_scale(t->scene, t->vec[0], SELECT);
+ }
}
-
-#if 0 // XXX future of this is still not clear
+
else if (ac.datatype == ANIMCONT_GPENCIL) {
/* remove duplicate frames and also make sure points are in order! */
if ((cancelled == 0) || (duplicate))
{
- bScreen *sc= (bScreen *)ac.data;
- ScrArea *sa;
+ bGPdata *gpd;
- /* BAD... we need to loop over all screen areas for current screen...
- * - sync this with actdata_filter_gpencil() in editaction.c
- */
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- bGPdata *gpd= gpencil_data_get_active(sa);
-
- if (gpd)
+ // XXX: BAD! this get gpencil datablocks directly from main db...
+ // but that's how this currently works :/
+ for (gpd = G.main->gpencil.first; gpd; gpd = gpd->id.next) {
+ if (ID_REAL_USERS(gpd) > 1)
posttrans_gpd_clean(gpd);
}
}
}
-#endif // XXX future of this is still not clear
/* make sure all F-Curves are set correctly */
ANIM_editkeyframes_refresh(&ac);
@@ -5016,8 +5078,13 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
BLI_freelistN(&anim_data);
}
- /* make sure all F-Curves are set correctly */
- ANIM_editkeyframes_refresh(&ac);
+ /* Make sure all F-Curves are set correctly, but not if transform was
+ * canceled, since then curves were already restored to initial state.
+ * Note: if the refresh is really needed after cancel then some way
+ * has to be added to not update handle types (see bug 22289).
+ */
+ if(!cancelled)
+ ANIM_editkeyframes_refresh(&ac);
}
else if (t->spacetype == SPACE_NLA) {
bAnimContext ac;
@@ -5057,7 +5124,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
{
BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
/* table needs to be created for each edit command, since vertices can move etc */
- mesh_octree_table(t->obedit, em, NULL, 'e');
+ // BMESH_TODO mesh_octree_table(t->obedit, em, NULL, 'e');
}
}
else if ((t->flag & T_POSE) && (t->poseobj)) {
@@ -5070,6 +5137,14 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
arm= ob->data;
pose= ob->pose;
+ if((t->flag & T_AUTOIK) && (t->options & CTX_AUTOCONFIRM)) {
+ /* when running transform non-interactively (operator exec),
+ * we need to update the pose otherwise no updates get called during
+ * transform and the auto-ik is not applied. see [#26164] */
+ struct Object *ob=t->poseobj;
+ where_is_pose(t->scene, ob);
+ }
+
/* if target-less IK grabbing, we calculate the pchan transforms and clear flag */
if (!cancelled && t->mode==TFM_TRANSLATION)
targetless_ik= apply_targetless_ik(ob);
@@ -5087,15 +5162,15 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
/* automatic inserting of keys and unkeyed tagging - only if transform wasn't cancelled (or TFM_DUMMY) */
if (!cancelled && (t->mode != TFM_DUMMY)) {
autokeyframe_pose_cb_func(C, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if (arm->flag & ARM_DELAYDEFORM) {
/* old optimize trick... this enforces to bypass the depgraph */
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
ob->recalc= 0; // is set on OK position already by recalcData()
}
else
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else if(t->scene->basact && (ob = t->scene->basact->object) && (ob->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(t->scene, ob)) {
@@ -5106,10 +5181,10 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
for (i = 0; i < t->total; i++) {
TransData *td = t->data + i;
- Object *ob = td->ob;
ListBase pidlist;
PTCacheID *pid;
-
+ ob = td->ob;
+
if (td->flag & TD_NOACTION)
break;
@@ -5128,11 +5203,11 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
if (BKE_ptcache_object_reset(t->scene, ob, PTCACHE_RESET_OUTDATED))
ob->recalc |= OB_RECALC_DATA;
- /* Needed for proper updating of "quick cached" dynamics. */
- /* Creates troubles for moving animated objects without */
- /* autokey though, probably needed is an anim sys override? */
- /* Please remove if some other solution is found. -jahka */
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ /* Needed for proper updating of "quick cached" dynamics. */
+ /* Creates troubles for moving animated objects without */
+ /* autokey though, probably needed is an anim sys override? */
+ /* Please remove if some other solution is found. -jahka */
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
/* Set autokey if necessary */
if (!cancelled) {
@@ -5150,21 +5225,22 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
if (C && recalcObPaths) {
//ED_objects_clear_paths(C); // XXX for now, don't need to clear
ED_objects_recalculate_paths(C, t->scene);
+
+ /* recalculating the frame positions means we loose our original transform if its not auto-keyed [#24451]
+ * this hack re-applies it, which is annoying, only alternatives are...
+ * - dont recalc paths.
+ * - have an object_handle_update() which gives is the new transform without touching the objects.
+ * - only recalc paths on auto-keying.
+ * - ED_objects_recalculate_paths could backup/restore transforms.
+ * - re-apply the transform which is simplest in this case. (2 lines below)
+ */
+ t->redraw |= TREDRAW_HARD;
+ transformApply(C, t);
}
}
clear_trans_object_base_flags(t);
- if(t->spacetype == SPACE_VIEW3D)
- {
- View3D *v3d = t->view;
-
- /* restore manipulator */
- if (t->flag & T_MODAL) {
- v3d->twtype = t->twtype;
- }
- }
-
#if 0 // TRANSFORM_FIX_ME
if(resetslowpar)
@@ -5182,7 +5258,7 @@ static void createTransObject(struct bContext *C, TransInfo *t)
TransDataExtension *tx;
int propmode = t->flag & T_PROP_EDIT;
- set_trans_object_base_flags(C, t);
+ set_trans_object_base_flags(t);
/* count */
t->total= CTX_DATA_COUNT(C, selected_objects);
@@ -5208,7 +5284,7 @@ static void createTransObject(struct bContext *C, TransInfo *t)
td->flag = TD_SELECTED;
td->protectflag= ob->protectflag;
td->ext = tx;
- td->rotOrder= ob->rotmode;
+ td->ext->rotOrder= ob->rotmode;
if (base->flag & BA_TRANSFORM_CHILD)
{
@@ -5221,7 +5297,7 @@ static void createTransObject(struct bContext *C, TransInfo *t)
td->flag |= TD_SKIP;
}
- ObjectToTransData(C, t, td, ob);
+ ObjectToTransData(t, td, ob);
td->val = NULL;
td++;
tx++;
@@ -5242,9 +5318,9 @@ static void createTransObject(struct bContext *C, TransInfo *t)
{
td->protectflag= ob->protectflag;
td->ext = tx;
- td->rotOrder= ob->rotmode;
+ td->ext->rotOrder= ob->rotmode;
- ObjectToTransData(C, t, td, ob);
+ ObjectToTransData(t, td, ob);
td->val = NULL;
td++;
tx++;
@@ -5279,7 +5355,7 @@ static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node)
unit_m3(td->smtx);
}
-void createTransNodeData(bContext *C, TransInfo *t)
+static void createTransNodeData(bContext *C, TransInfo *t)
{
TransData *td;
TransData2D *td2d;
@@ -5301,12 +5377,12 @@ void createTransData(bContext *C, TransInfo *t)
if (t->options & CTX_TEXTURE) {
t->flag |= T_TEXTURE;
- createTransTexspace(C, t);
+ createTransTexspace(t);
}
else if (t->options & CTX_EDGE) {
t->ext = NULL;
t->flag |= T_EDIT;
- createTransEdge(C, t);
+ createTransEdge(t);
if(t->data && t->flag & T_PROP_EDIT) {
sort_trans_data(t); // makes selected become first in array
set_prop_dist(t, 1);
@@ -5368,14 +5444,14 @@ void createTransData(bContext *C, TransInfo *t)
createTransCurveVerts(C, t);
}
else if (t->obedit->type==OB_LATTICE) {
- createTransLatticeVerts(C, t);
+ createTransLatticeVerts(t);
}
else if (t->obedit->type==OB_MBALL) {
- createTransMBallVerts(C, t);
+ createTransMBallVerts(t);
}
else if (t->obedit->type==OB_ARMATURE) {
t->flag &= ~T_PROP_EDIT;
- createTransArmatureVerts(C, t);
+ createTransArmatureVerts(t);
}
else {
printf("edit type not implemented!\n");
@@ -5406,22 +5482,22 @@ void createTransData(bContext *C, TransInfo *t)
else if (ob && (ob->mode & OB_MODE_POSE)) {
// XXX this is currently limited to active armature only...
// XXX active-layer checking isn't done as that should probably be checked through context instead
- createTransPose(C, t, ob);
+ createTransPose(t, ob);
}
else if (ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) {
- /* exception, we look for the one selected armature */
- CTX_DATA_BEGIN(C, Object*, ob_armature, selected_objects)
- {
- if(ob_armature->type==OB_ARMATURE)
- {
- if((ob_armature->mode & OB_MODE_POSE) && ob_armature == modifiers_isDeformedByArmature(ob))
- {
- createTransPose(C, t, ob_armature);
- break;
+ /* important that ob_armature can be set even when its not selected [#23412]
+ * lines below just check is also visible */
+ Object *ob_armature= modifiers_isDeformedByArmature(ob);
+ if(ob_armature && ob_armature->mode & OB_MODE_POSE) {
+ Base *base_arm= object_in_scene(ob_armature, t->scene);
+ if(base_arm) {
+ View3D *v3d = t->view;
+ if(BASE_VISIBLE(v3d, base_arm)) {
+ createTransPose(t, ob_armature);
}
}
+
}
- CTX_DATA_END;
}
else if (ob && (ob->mode & OB_MODE_PARTICLE_EDIT)
&& PE_start_edit(PE_get_current(scene, ob))) {
@@ -5434,6 +5510,13 @@ void createTransData(bContext *C, TransInfo *t)
sort_trans_data_dist(t);
}
}
+ else if (ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_TEXTURE_PAINT))) {
+ /* sculpt mode and project paint have own undo stack
+ * transform ops redo clears sculpt/project undo stack.
+ *
+ * Could use 'OB_MODE_ALL_PAINT' since there are key conflicts,
+ * transform + paint isnt well supported. */
+ }
else {
createTransObject(C, t);
t->flag |= T_OBJECT;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 92de95252c3..cf66a9f9d93 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -88,7 +88,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_rand.h"
-
+#include "BLI_utildefines.h"
#include "WM_types.h"
#include "WM_api.h"
@@ -270,7 +270,7 @@ static void animrecord_check_state (Scene *scene, ID *id, wmTimer *animtimer)
* - we're not only keying for available channels
* - the option to add new actions for each round is not enabled
*/
- if (IS_AUTOKEY_FLAG(INSERTAVAIL)==0 && (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) {
+ if (IS_AUTOKEY_FLAG(scene, INSERTAVAIL)==0 && (scene->toolsettings->autokey_flag & ANIMRECORD_FLAG_WITHNLA)) {
/* if playback has just looped around, we need to add a new NLA track+strip to allow a clean pass to occur */
if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) {
AnimData *adt= BKE_animdata_from_id(id);
@@ -307,7 +307,7 @@ static void animrecord_check_state (Scene *scene, ID *id, wmTimer *animtimer)
static int fcu_test_selected(FCurve *fcu)
{
BezTriple *bezt= fcu->bezt;
- int i;
+ unsigned int i;
if (bezt==NULL) /* ignore baked */
return 0;
@@ -322,8 +322,7 @@ static int fcu_test_selected(FCurve *fcu)
/* called for updating while transform acts, once per redraw */
void recalcData(TransInfo *t)
{
- Scene *scene = t->scene;
- Base *base = scene->basact;
+ Base *base = t->scene->basact;
if (t->spacetype==SPACE_NODE) {
flushTransNodes(t);
@@ -335,15 +334,13 @@ void recalcData(TransInfo *t)
Scene *scene= t->scene;
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
- bAnimContext ac;
+ bAnimContext ac= {0};
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
/* initialise relevant anim-context 'context' data from TransInfo data */
/* NOTE: sync this with the code in ANIM_animdata_get_context() */
- memset(&ac, 0, sizeof(bAnimContext));
-
ac.scene= t->scene;
ac.obact= OBACT;
ac.sa= t->sa;
@@ -353,22 +350,29 @@ void recalcData(TransInfo *t)
ANIM_animdata_context_getdata(&ac);
- /* get animdata blocks visible in editor, assuming that these will be the ones where things changed */
- filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
- ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
-
- /* just tag these animdata-blocks to recalc, assuming that some data there changed
- * BUT only do this if realtime updates are enabled
- */
- if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
- for (ale= anim_data.first; ale; ale= ale->next) {
- /* set refresh tags for objects using this animation */
- ANIM_list_elem_update(t->scene, ale);
+ /* perform flush */
+ if (ac.datatype == ANIMCONT_GPENCIL) {
+ /* flush transform values back to actual coordinates */
+ flushTransGPactionData(t);
+ }
+ else {
+ /* get animdata blocks visible in editor, assuming that these will be the ones where things changed */
+ filter= (ANIMFILTER_VISIBLE | ANIMFILTER_ANIMDATA);
+ ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype);
+
+ /* just tag these animdata-blocks to recalc, assuming that some data there changed
+ * BUT only do this if realtime updates are enabled
+ */
+ if ((saction->flag & SACTION_NOREALTIMEUPDATES) == 0) {
+ for (ale= anim_data.first; ale; ale= ale->next) {
+ /* set refresh tags for objects using this animation */
+ ANIM_list_elem_update(t->scene, ale);
+ }
}
+
+ /* now free temp channels */
+ BLI_freelistN(&anim_data);
}
-
- /* now free temp channels */
- BLI_freelistN(&anim_data);
}
else if (t->spacetype == SPACE_IPO) {
Scene *scene;
@@ -585,7 +589,7 @@ void recalcData(TransInfo *t)
BKE_nlatrack_add_strip(track, strip);
tdn->nlt= track;
- tdn->trackIndex += (n + 1); /* + 1, since n==0 would mean that we didn't change track */
+ tdn->trackIndex++;
}
else /* can't move any further */
break;
@@ -603,7 +607,7 @@ void recalcData(TransInfo *t)
BKE_nlatrack_add_strip(track, strip);
tdn->nlt= track;
- tdn->trackIndex -= (n - 1); /* - 1, since n==0 would mean that we didn't change track */
+ tdn->trackIndex--;
}
else /* can't move any further */
break;
@@ -620,16 +624,11 @@ void recalcData(TransInfo *t)
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_re_solve();
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(t->obedit->data, 0);
}
}
else if (t->spacetype == SPACE_VIEW3D) {
- /* project */
- if(t->state != TRANS_CANCEL) {
- applyProject(t);
- }
-
if (t->obedit) {
if ELEM(t->obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= t->obedit->data;
@@ -638,8 +637,11 @@ void recalcData(TransInfo *t)
if(t->state != TRANS_CANCEL) {
clipMirrorModifier(t, t->obedit);
+ applyProject(t);
}
-#if 0 //XXX - possibly merged out? check if in trunk - joeedh
+
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
+
if (t->state == TRANS_CANCEL) {
while(nu) {
calchandlesNurb(nu); /* Cant do testhandlesNurb here, it messes up the h1 and h2 flags */
@@ -653,10 +655,14 @@ void recalcData(TransInfo *t)
nu= nu->next;
}
}
-#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(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
if(la->editlatt->latt->flag & LT_OUTSIDE) outside_lattice(la->editlatt->latt);
}
@@ -666,11 +672,12 @@ void recalcData(TransInfo *t)
/* mirror modifier clipping? */
if(t->state != TRANS_CANCEL) {
clipMirrorModifier(t, t->obedit);
+ applyProject(t);
}
if((t->options & CTX_NO_MIRROR) == 0 && (t->flag & T_MIRROR))
editbmesh_apply_to_mirror(t);
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
EDBM_RecalcNormals(em);
BMEdit_RecalcTesselation(em);
@@ -682,6 +689,10 @@ void recalcData(TransInfo *t)
TransData *td = t->data;
int i;
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
/* Ensure all bones are correctly adjusted */
for (ebo = edbo->first; ebo; ebo = ebo->next){
@@ -744,7 +755,7 @@ void recalcData(TransInfo *t)
mul_m3_v3(t->mat, up_axis);
}
- ebo->roll = ED_rollBoneToVector(ebo, up_axis);
+ ebo->roll = ED_rollBoneToVector(ebo, up_axis, FALSE);
}
}
}
@@ -754,7 +765,12 @@ void recalcData(TransInfo *t)
}
else
- DAG_id_flush_update(t->obedit->data, OB_RECALC_DATA); /* sets recalc flags */
+ {
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+ DAG_id_tag_update(t->obedit->data, 0); /* sets recalc flags */
+ }
}
else if( (t->flag & T_POSE) && t->poseobj) {
@@ -764,28 +780,37 @@ void recalcData(TransInfo *t)
/* if animtimer is running, and the object already has animation data,
* check if the auto-record feature means that we should record 'samples'
* (i.e. uneditable animation values)
+ *
+ * context is needed for keying set poll() functions.
*/
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
- if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
+ if ((t->animtimer) && (t->context) && IS_AUTOKEY_ON(t->scene)) {
int targetless_ik= (t->flag & T_AUTOIK); // XXX this currently doesn't work, since flags aren't set yet!
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_pose_cb_func(NULL, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
+ autokeyframe_pose_cb_func(t->context, t->scene, (View3D *)t->view, ob, t->mode, targetless_ik);
}
/* old optimize trick... this enforces to bypass the depgraph */
if (!(arm->flag & ARM_DELAYDEFORM)) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA); /* sets recalc flags */
}
else
- where_is_pose(scene, ob);
+ where_is_pose(t->scene, ob);
}
- else if(base && (base->object->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(scene, base->object)) {
+ else if(base && (base->object->mode & OB_MODE_PARTICLE_EDIT) && PE_get_current(t->scene, base->object)) {
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
flushTransParticles(t);
}
else {
int i;
+ if(t->state != TRANS_CANCEL) {
+ applyProject(t);
+ }
+
for (i = 0; i < t->total; i++) {
TransData *td = t->data + i;
Object *ob = td->ob;
@@ -803,13 +828,13 @@ void recalcData(TransInfo *t)
// TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
animrecord_check_state(t->scene, &ob->id, t->animtimer);
- autokeyframe_ob_cb_func(NULL, t->scene, (View3D *)t->view, ob, t->mode);
+ autokeyframe_ob_cb_func(t->context, t->scene, (View3D *)t->view, ob, t->mode);
}
/* sets recalc flags fully, instead of flushing existing ones
* otherwise proxies don't function correctly
*/
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
}
@@ -821,7 +846,7 @@ void recalcData(TransInfo *t)
void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
{
float v1[3], v2[3], v3[3];
- char col[3], col2[3];
+ unsigned char col[3], col2[3];
if (t->spacetype == SPACE_VIEW3D)
{
@@ -845,7 +870,7 @@ void drawLine(TransInfo *t, float *center, float *dir, char axis, short options)
UI_GetThemeColor3ubv(TH_GRID, col);
}
UI_make_axis_color(col, col2, axis);
- glColor3ubv((GLubyte *)col2);
+ glColor3ubv(col2);
setlinestyle(0);
glBegin(GL_LINE_STRIP);
@@ -968,6 +993,13 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
{
t->current_orientation = v3d->twmode;
}
+
+ /* exceptional case */
+ if(t->around==V3D_LOCAL && (t->settings->selectmode & SCE_SELECT_FACE)) {
+ if(ELEM3(t->mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL)) {
+ t->options |= CTX_NO_PET;
+ }
+ }
}
else if(t->spacetype==SPACE_IMAGE || t->spacetype==SPACE_NODE)
{
@@ -1070,8 +1102,9 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
/* TRANSFORM_FIX_ME rna restrictions */
- if (t->prop_size <= 0)
+ if (t->prop_size <= 0.00001f)
{
+ printf("Proportional size (%f) under 0.00001, reseting to 1!\n", t->prop_size);
t->prop_size = 1.0f;
}
@@ -1143,6 +1176,13 @@ void postTrans (bContext *C, TransInfo *t)
if(sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_end(t->state == TRANS_CANCEL);
}
+ else if(t->spacetype==SPACE_VIEW3D) {
+ View3D *v3d = t->sa->spacedata.first;
+ /* restore manipulator */
+ if (t->flag & T_MODAL) {
+ v3d->twtype = t->twtype;
+ }
+ }
if (t->mouse.data)
{
@@ -1186,6 +1226,13 @@ static void restoreElement(TransData *td) {
if (td->ext->rot) {
VECCOPY(td->ext->rot, td->ext->irot);
}
+ if(td->ext->rotAngle) {
+ *td->ext->rotAngle= td->ext->irotAngle;
+ }
+ if(td->ext->rotAxis) {
+ VECCOPY(td->ext->rotAxis, td->ext->irotAxis);
+ }
+ /* XXX, drotAngle & drotAxis not used yet */
if (td->ext->size) {
VECCOPY(td->ext->size, td->ext->isize);
}
@@ -1281,7 +1328,7 @@ void calculateCenterCursor2D(TransInfo *t)
calculateCenter2D(t);
}
-void calculateCenterCursorGraph2D(TransInfo *t)
+static void calculateCenterCursorGraph2D(TransInfo *t)
{
SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first;
Scene *scene= t->scene;
@@ -1331,7 +1378,7 @@ void calculateCenterBound(TransInfo *t)
if (i) {
if (t->data[i].flag & TD_SELECTED) {
if (!(t->data[i].flag & TD_NOCENTER))
- minmax_v3_v3v3(min, max, t->data[i].center);
+ minmax_v3v3_v3(min, max, t->data[i].center);
}
else {
/*
@@ -1572,25 +1619,3 @@ void calculatePropRatio(TransInfo *t)
strcpy(t->proptext, "");
}
}
-
-float get_drawsize(ARegion *ar, float *co)
-{
- RegionView3D *rv3d= ar->regiondata;
- float size, vec[3], len1, len2;
-
- /* size calculus, depending ortho/persp settings, like initgrabz() */
- size= rv3d->persmat[0][3]*co[0]+ rv3d->persmat[1][3]*co[1]+ rv3d->persmat[2][3]*co[2]+ rv3d->persmat[3][3];
-
- VECCOPY(vec, rv3d->persinv[0]);
- len1= normalize_v3(vec);
- VECCOPY(vec, rv3d->persinv[1]);
- len2= normalize_v3(vec);
-
- size*= 0.01f*(len1>len2?len1:len2);
-
- /* correct for window size to make widgets appear fixed size */
- if(ar->winx > ar->winy) size*= 1000.0f/(float)ar->winx;
- else size*= 1000.0f/(float)ar->winy;
-
- return size;
-}
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 54a86b3dca1..486fed91e3e 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,7 @@
#include "DNA_screen_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "WM_types.h"
@@ -37,7 +38,7 @@
/* ************************** INPUT FROM MOUSE *************************** */
-void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
float vec[3], dvec[3];
if(mi->precision)
@@ -55,7 +56,7 @@ void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
}
-void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
float ratio, precise_ratio, dx, dy;
if(mi->precision)
@@ -81,7 +82,7 @@ void InputSpring(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
output[0] = ratio;
}
-void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
{
InputSpring(t, mi, mval, output);
@@ -93,7 +94,7 @@ void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3
}
}
-void InputTrackBall(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
if(mi->precision)
@@ -111,7 +112,7 @@ void InputTrackBall(TransInfo *t, MouseInput *mi, short mval[2], float output[3]
output[1] *= mi->factor;
}
-void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
+static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
float x, pad;
pad = t->ar->winx / 10;
@@ -128,7 +129,7 @@ void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float out
output[0] = (x - pad) / (t->ar->winx - 2 * pad);
}
-void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
+static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
float vec[3];
InputVector(t, mi, mval, vec);
@@ -137,7 +138,7 @@ void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float
output[0] = dot_v3v3(t->viewinv[0], vec) * 2.0f;
}
-void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
+static void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
float y, pad;
pad = t->ar->winy / 10;
@@ -153,7 +154,7 @@ void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float outpu
output[0] = (y - pad) / (t->ar->winy - 2 * pad);
}
-void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
+static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) {
float vec[3];
InputVector(t, mi, mval, vec);
@@ -162,7 +163,7 @@ void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float ou
output[0] = dot_v3v3(t->viewinv[1], vec) * 2.0f;
}
-void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
+void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, short start[2], short end[2])
{
short *data;
@@ -178,7 +179,7 @@ void setCustomPoints(TransInfo *t, MouseInput *mi, short start[2], short end[2])
data[3] = end[1];
}
-void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
float length;
float distance;
@@ -211,7 +212,7 @@ void InputCustomRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[
}
}
-void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
+static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3])
{
double dx2 = mval[0] - mi->center[0];
double dy2 = mval[1] - mi->center[1];
@@ -272,7 +273,7 @@ void InputAngle(TransInfo *t, MouseInput *mi, short mval[2], float output[3])
output[0] = *angle;
}
-void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2])
+void initMouseInput(TransInfo *UNUSED(t), MouseInput *mi, int center[2], short mval[2])
{
mi->factor = 0;
mi->precision = 0;
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 1bf3bab2616..a281b388084 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -60,6 +60,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
#include "BIF_gl.h"
@@ -102,16 +103,6 @@
#define MAN_GHOST 1
#define MAN_MOVECOL 2
-
-static int is_mat4_flipped(float mat[][4])
-{
- float vec[3];
-
- cross_v3_v3v3(vec, mat[0], mat[1]);
- if( dot_v3v3(vec, mat[2]) < 0.0 ) return 1;
- return 0;
-}
-
/* transform widget center calc helper for below */
static void calc_tw_center(Scene *scene, float *co)
{
@@ -167,6 +158,37 @@ static void stats_editbone(RegionView3D *rv3d, EditBone *ebo)
protectflag_to_drawflags(OB_LOCK_LOC|OB_LOCK_ROT|OB_LOCK_SCALE, &rv3d->twdrawflag);
}
+/* could move into BLI_math however this is only useful for display/editing purposes */
+static void axis_angle_to_gimbal_axis(float gmat[3][3], float axis[3], float angle)
+{
+ /* X/Y are arbitrary axies, most importantly Z is the axis of rotation */
+
+ float cross_vec[3];
+ float quat[4];
+
+ /* this is an un-scientific method to get a vector to cross with
+ * XYZ intentionally YZX */
+ cross_vec[0]= axis[1];
+ cross_vec[1]= axis[2];
+ cross_vec[2]= axis[0];
+
+ /* X-axis */
+ cross_v3_v3v3(gmat[0], cross_vec, axis);
+ normalize_v3(gmat[0]);
+ axis_angle_to_quat(quat, axis, angle);
+ mul_qt_v3(quat, gmat[0]);
+
+ /* Y-axis */
+ axis_angle_to_quat(quat, axis, M_PI/2.0);
+ copy_v3_v3(gmat[1], gmat[0]);
+ mul_qt_v3(quat, gmat[1]);
+
+ /* Z-axis */
+ copy_v3_v3(gmat[2], axis);
+
+ normalize_m3(gmat);
+}
+
static int test_rotmode_euler(short rotmode)
{
@@ -180,10 +202,18 @@ int gimbal_axis(Object *ob, float gmat[][3])
{
bPoseChannel *pchan= get_active_posechannel(ob);
- if(pchan && test_rotmode_euler(pchan->rotmode)) {
+ if(pchan) {
float mat[3][3], tmat[3][3], obmat[3][3];
+ if(test_rotmode_euler(pchan->rotmode)) {
+ eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
+ }
+ else if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_gimbal_axis(mat, pchan->rotAxis, pchan->rotAngle);
+ }
+ else { /* quat */
+ return 0;
+ }
- eulO_to_gimbal_axis(mat, pchan->eul, pchan->rotmode);
/* apply bone transformation */
mul_m3_m3m3(tmat, pchan->bone->bone_mat, mat);
@@ -212,24 +242,23 @@ int gimbal_axis(Object *ob, float gmat[][3])
}
else {
if(test_rotmode_euler(ob->rotmode)) {
+ eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
+ }
+ else if(ob->rotmode == ROT_MODE_AXISANGLE) {
+ axis_angle_to_gimbal_axis(gmat, ob->rotAxis, ob->rotAngle);
+ }
+ else { /* quat */
+ return 0;
+ }
-
- if (ob->parent)
- {
- float parent_mat[3][3], amat[3][3];
-
- eulO_to_gimbal_axis(amat, ob->rot, ob->rotmode);
- copy_m3_m4(parent_mat, ob->parent->obmat);
- normalize_m3(parent_mat);
- mul_m3_m3m3(gmat, parent_mat, amat);
- return 1;
- }
- else
- {
- eulO_to_gimbal_axis(gmat, ob->rot, ob->rotmode);
- return 1;
- }
+ if (ob->parent)
+ {
+ float parent_mat[3][3];
+ copy_m3_m4(parent_mat, ob->parent->obmat);
+ normalize_m3(parent_mat);
+ mul_m3_m3m3(gmat, parent_mat, gmat);
}
+ return 1;
}
}
@@ -291,7 +320,7 @@ int calc_manipulator_stats(const bContext *C)
bArmature *arm= obedit->data;
EditBone *ebo;
for (ebo= arm->edbo->first; ebo; ebo=ebo->next){
- if(ebo->layer & arm->layer && !(ebo->flag & BONE_HIDDEN_A)) {
+ if(EBONE_VISIBLE(arm, ebo)) {
if (ebo->flag & BONE_TIPSEL) {
calc_tw_center(scene, ebo->tail);
totsel++;
@@ -321,7 +350,7 @@ int calc_manipulator_stats(const bContext *C)
while(a--) {
/* exceptions
* if handles are hidden then only check the center points.
- * If 2 or more are selected then only use the center point too.
+ * If the center knot is selected then only use this as the center point.
*/
if (cu->drawflag & CU_HIDE_HANDLES) {
if (bezt->f2 & SELECT) {
@@ -329,7 +358,7 @@ int calc_manipulator_stats(const bContext *C)
totsel++;
}
}
- else if ( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
+ else if (bezt->f2 & SELECT) {
calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
@@ -338,10 +367,6 @@ int calc_manipulator_stats(const bContext *C)
calc_tw_center(scene, bezt->vec[0]);
totsel++;
}
- if(bezt->f2) {
- calc_tw_center(scene, bezt->vec[1]);
- totsel++;
- }
if(bezt->f3) {
calc_tw_center(scene, bezt->vec[2]);
totsel++;
@@ -422,7 +447,7 @@ int calc_manipulator_stats(const bContext *C)
mul_m4_v3(ob->obmat, scene->twmax);
}
}
- else if(ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT))) {
+ else if(ob && (ob->mode & OB_MODE_ALL_PAINT)) {
;
}
else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
@@ -456,7 +481,7 @@ int calc_manipulator_stats(const bContext *C)
if(ob && !(ob->flag & SELECT)) ob= NULL;
for(base= scene->base.first; base; base= base->next) {
- if TESTBASELIB(scene, base) {
+ if TESTBASELIB(v3d, base) {
if(ob==NULL)
ob= base->object;
calc_tw_center(scene, base->object->obmat[3]);
@@ -524,7 +549,7 @@ int calc_manipulator_stats(const bContext *C)
}
/* don't draw axis perpendicular to the view */
-void test_manipulator_axis(const bContext *C)
+static void test_manipulator_axis(const bContext *C)
{
RegionView3D *rv3d= CTX_wm_region_view3d(C);
float angle;
@@ -565,17 +590,12 @@ void test_manipulator_axis(const bContext *C)
static float screen_aligned(RegionView3D *rv3d, float mat[][4])
{
- float vec[3], size;
-
- VECCOPY(vec, mat[0]);
- size= normalize_v3(vec);
-
glTranslatef(mat[3][0], mat[3][1], mat[3][2]);
/* sets view screen aligned */
glRotatef( -360.0f*saacos(rv3d->viewquat[0])/(float)M_PI, rv3d->viewquat[1], rv3d->viewquat[2], rv3d->viewquat[3]);
- return size;
+ return len_v3(mat[0]); /* draw scale */
}
@@ -679,20 +699,20 @@ static char axisBlendAngle(float angle)
moving: in transform theme color
else the red/green/blue
*/
-static void manipulator_setcolor(View3D *v3d, char axis, int colcode, char alpha)
+static void manipulator_setcolor(View3D *v3d, char axis, int colcode, unsigned char alpha)
{
- char col[4];
+ unsigned char col[4]= {0};
+ col[3]= alpha;
if(colcode==MAN_GHOST) {
- glColor4ub(0, 0, 0, 70);
+ col[3]= 70;
}
else if(colcode==MAN_MOVECOL) {
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- glColor4ub(col[0], col[1], col[2], alpha);
}
else {
switch(axis) {
- case 'c':
+ case 'C':
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
if(v3d->twmode == V3D_MANIP_LOCAL) {
col[0]= col[0]>200?255:col[0]+55;
@@ -704,19 +724,24 @@ static void manipulator_setcolor(View3D *v3d, char axis, int colcode, char alpha
col[1]= col[1]<55?0:col[1]-55;
col[2]= col[2]<55?0:col[2]-55;
}
- glColor4ub(col[0], col[1], col[2], alpha);
break;
- case 'x':
- glColor4ub(220, 0, 0, alpha);
+ case 'X':
+ col[0]= 220;
break;
- case 'y':
- glColor4ub(0, 220, 0, alpha);
+ case 'Y':
+ col[1]= 220;
break;
- case 'z':
- glColor4ub(30, 30, 220, alpha);
+ case 'Z':
+ col[0]= 30;
+ col[1]= 30;
+ col[2]= 220;
break;
+ default:
+ BLI_assert(!"invalid axis arg");
}
}
+
+ glColor4ubv(col);
}
/* viewmatrix should have been set OK, also no shademode! */
@@ -725,7 +750,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
/* axes */
if(flagx) {
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
if(flagx & MAN_SCALE_X) glLoadName(MAN_SCALE_X);
else if(flagx & MAN_TRANS_X) glLoadName(MAN_TRANS_X);
glBegin(GL_LINES);
@@ -736,7 +761,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
if(flagy) {
if(flagy & MAN_SCALE_Y) glLoadName(MAN_SCALE_Y);
else if(flagy & MAN_TRANS_Y) glLoadName(MAN_TRANS_Y);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
glBegin(GL_LINES);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
@@ -745,7 +770,7 @@ static void draw_manipulator_axes(View3D *v3d, RegionView3D *rv3d, int colcode,
if(flagz) {
if(flagz & MAN_SCALE_Z) glLoadName(MAN_SCALE_Z);
else if(flagz & MAN_TRANS_Z) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
@@ -761,7 +786,7 @@ static void preOrthoFront(int ortho, float twmat[][4], int axis)
orthogonalize_m4(omat, axis);
glPushMatrix();
glMultMatrixf(omat);
- glFrontFace( is_mat4_flipped(omat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(omat) ? GL_CW:GL_CCW);
}
}
@@ -777,7 +802,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
GLUquadricObj *qobj;
double plane[4];
float matt[4][4];
- float size, vec[3], unitmat[4][4];
+ float size, unitmat[4][4];
float cywid= 0.33f*0.01f*(float)U.tw_handlesize;
float cusize= cywid*0.65f;
int arcs= (G.rt!=2);
@@ -798,8 +823,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
gluQuadricDrawStyle(qobj, GLU_FILL);
/* prepare for screen aligned draw */
- VECCOPY(vec, rv3d->twmat[0]);
- size= normalize_v3(vec);
+ size= len_v3(rv3d->twmat[0]);
glPushMatrix();
glTranslatef(rv3d->twmat[3][0], rv3d->twmat[3][1], rv3d->twmat[3][2]);
@@ -858,12 +882,12 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
// XXX mul_m4_m3m4(matt, t->mat, rv3d->twmat);
if (ortho) {
glMultMatrixf(matt);
- glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(matt) ? GL_CW:GL_CCW);
}
}
else {
if (ortho) {
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
glMultMatrixf(rv3d->twmat);
}
}
@@ -875,7 +899,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
/* axis */
if( (drawflags & MAN_ROT_X) || (moving && (drawflags & MAN_ROT_Z)) ) {
preOrthoFront(ortho, rv3d->twmat, 2);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.2f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
@@ -884,7 +908,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
}
if( (drawflags & MAN_ROT_Y) || (moving && (drawflags & MAN_ROT_X)) ) {
preOrthoFront(ortho, rv3d->twmat, 0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.2f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
@@ -893,7 +917,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
}
if( (drawflags & MAN_ROT_Z) || (moving && (drawflags & MAN_ROT_Y)) ) {
preOrthoFront(ortho, rv3d->twmat, 1);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.2f);
glVertex3f(0.0f, 0.0f, 1.0f);
@@ -910,7 +934,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(drawflags & MAN_ROT_Z) {
preOrthoFront(ortho, matt, 2);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
postOrtho(ortho);
}
@@ -919,7 +943,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, matt, 0);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(-90.0, 0.0, 1.0, 0.0);
postOrtho(ortho);
@@ -929,7 +953,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, matt, 1);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
drawcircball(GL_LINE_LOOP, unitmat[3], 1.0, unitmat);
glRotatef(90.0, 1.0, 0.0, 0.0);
postOrtho(ortho);
@@ -945,7 +969,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(drawflags & MAN_ROT_Z) {
preOrthoFront(ortho, rv3d->twmat, 2);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
postOrtho(ortho);
}
@@ -954,7 +978,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 0);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(-90.0, 0.0, 1.0, 0.0);
postOrtho(ortho);
@@ -964,7 +988,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 1);
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
partial_donut(cusize/4.0f, 1.0f, 0, 48, 8, 48);
glRotatef(90.0, 1.0, 0.0, 0.0);
postOrtho(ortho);
@@ -980,7 +1004,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 2);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
partial_donut(0.7f*cusize, 1.0f, 31, 33, 8, 64);
@@ -993,7 +1017,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 1);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
glRotatef(90.0, 1.0, 0.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
@@ -1008,7 +1032,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
preOrthoFront(ortho, rv3d->twmat, 0);
glPushMatrix();
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
glRotatef(-90.0, 0.0, 1.0, 0.0);
glRotatef(90.0, 0.0, 0.0, 1.0);
@@ -1107,7 +1131,7 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
/* center circle, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_SCALE_C);
- manipulator_setcolor(v3d, 'c', colcode, 255);
+ manipulator_setcolor(v3d, 'C', colcode, 255);
glPushMatrix();
size= screen_aligned(rv3d, rv3d->twmat);
unit_m4(unitmat);
@@ -1124,11 +1148,11 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
copy_m4_m4(matt, rv3d->twmat); // to copy the parts outside of [3][3]
// XXX mul_m4_m3m4(matt, t->mat, rv3d->twmat);
glMultMatrixf(matt);
- glFrontFace( is_mat4_flipped(matt)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(matt) ? GL_CW:GL_CCW);
}
else {
glMultMatrixf(rv3d->twmat);
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
}
/* axis */
@@ -1140,21 +1164,21 @@ static void draw_manipulator_scale(View3D *v3d, RegionView3D *rv3d, int moving,
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_SCALE_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
drawsolidcube(cusize);
}
/* X cube */
glTranslatef(dz, 0.0, -dz);
if(drawflags & MAN_SCALE_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_X);
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
drawsolidcube(cusize);
}
/* Y cube */
glTranslatef(-dz, dz, 0.0);
if(drawflags & MAN_SCALE_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_SCALE_Y);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
drawsolidcube(cusize);
}
@@ -1205,7 +1229,7 @@ static void draw_cylinder(GLUquadricObj *qobj, float len, float width)
}
-static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int moving, int drawflags, int combo, int colcode)
+static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int UNUSED(moving), int drawflags, int combo, int colcode)
{
GLUquadricObj *qobj;
float cylen= 0.01f*(float)U.tw_handlesize;
@@ -1225,7 +1249,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
/* center circle, do not add to selection when shift is pressed (planar constraint) */
if( (G.f & G_PICKSEL) && shift==0) glLoadName(MAN_TRANS_C);
- manipulator_setcolor(v3d, 'c', colcode, 255);
+ manipulator_setcolor(v3d, 'C', colcode, 255);
glPushMatrix();
size= screen_aligned(rv3d, rv3d->twmat);
unit_m4(unitmat);
@@ -1252,7 +1276,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
glTranslatef(0.0, 0.0, dz);
if(drawflags & MAN_TRANS_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Z);
- manipulator_setcolor(v3d, 'z', colcode, axisBlendAngle(rv3d->twangle[2]));
+ manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->twangle[2]));
draw_cone(qobj, cylen, cywid);
}
/* X Cone */
@@ -1260,7 +1284,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
if(drawflags & MAN_TRANS_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, axisBlendAngle(rv3d->twangle[0]));
+ manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->twangle[0]));
draw_cone(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
@@ -1269,7 +1293,7 @@ static void draw_manipulator_translate(View3D *v3d, RegionView3D *rv3d, int movi
if(drawflags & MAN_TRANS_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_TRANS_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, axisBlendAngle(rv3d->twangle[1]));
+ manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->twangle[1]));
draw_cone(qobj, cylen, cywid);
}
@@ -1300,8 +1324,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
/* Screen aligned view rot circle */
if(drawflags & MAN_ROT_V) {
- float unitmat[4][4];
- unit_m4(unitmat);
+ float unitmat[4][4]= MAT4_UNITY;
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_V);
UI_ThemeColor(TH_TRANSFORM);
@@ -1335,7 +1358,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
glMultMatrixf(rv3d->twmat);
}
- glFrontFace( is_mat4_flipped(rv3d->twmat)?GL_CW:GL_CCW);
+ glFrontFace(is_negative_m4(rv3d->twmat) ? GL_CW:GL_CCW);
/* axis */
if( (G.f & G_PICKSEL)==0 ) {
@@ -1352,7 +1375,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
glTranslatef(0.0, 0.0, 1.0);
if(drawflags & MAN_ROT_Z) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Z);
- manipulator_setcolor(v3d, 'z', colcode, 255);
+ manipulator_setcolor(v3d, 'Z', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
}
/* X cyl */
@@ -1360,7 +1383,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
if(drawflags & MAN_ROT_X) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_X);
glRotatef(90.0, 0.0, 1.0, 0.0);
- manipulator_setcolor(v3d, 'x', colcode, 255);
+ manipulator_setcolor(v3d, 'X', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
glRotatef(-90.0, 0.0, 1.0, 0.0);
}
@@ -1369,7 +1392,7 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
if(drawflags & MAN_ROT_Y) {
if(G.f & G_PICKSEL) glLoadName(MAN_ROT_Y);
glRotatef(-90.0, 1.0, 0.0, 0.0);
- manipulator_setcolor(v3d, 'y', colcode, 255);
+ manipulator_setcolor(v3d, 'Y', colcode, 255);
draw_cylinder(qobj, cylen, cywid);
}
@@ -1385,17 +1408,6 @@ static void draw_manipulator_rotate_cyl(View3D *v3d, RegionView3D *rv3d, int mov
/* ********************************************* */
-static float get_manipulator_drawsize(ARegion *ar)
-{
- RegionView3D *rv3d= ar->regiondata;
- float size = get_drawsize(ar, rv3d->twmat[3]);
-
- size*= (float)U.tw_size;
-
- return size;
-}
-
-
/* main call, does calc centers & orientation too */
/* uses global G.moving */
static int drawflags= 0xFFFF; // only for the calls below, belongs in scene...?
@@ -1443,7 +1455,7 @@ void BIF_draw_manipulator(const bContext *C)
break;
}
- mul_mat3_m4_fl(rv3d->twmat, get_manipulator_drawsize(ar));
+ mul_mat3_m4_fl(rv3d->twmat, view3d_pixel_size(rv3d, rv3d->twmat[3]) * U.tw_size * 5.0f);
}
test_manipulator_axis(C);
diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c
index 3e47484c54c..f9ac1bd38d1 100644
--- a/source/blender/editors/transform/transform_ndofinput.c
+++ b/source/blender/editors/transform/transform_ndofinput.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,9 +27,10 @@
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
-#include "BKE_global.h" /* for G */
-#include "BKE_utildefines.h" /* ABS */
+#include "BLI_utildefines.h"
+#include "BKE_global.h" /* for G */
+ /* ABS */
#include "WM_types.h"
@@ -65,7 +66,7 @@ static void resetNDofInput(NDofInput *n)
}
-int handleNDofInput(NDofInput *n, wmEvent *event)
+int handleNDofInput(NDofInput *UNUSED(n), wmEvent *UNUSED(event))
{
int retval = 0;
// TRANSFORM_FIX_ME
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index b2d6fe4ea34..e1dd0191c0d 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,9 +31,11 @@
#include "RNA_enum_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_armature.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -53,20 +55,20 @@ typedef struct TransformModeItem
static float VecOne[3] = {1, 1, 1};
-char OP_TRANSLATION[] = "TRANSFORM_OT_translate";
-char OP_ROTATION[] = "TRANSFORM_OT_rotate";
-char OP_TOSPHERE[] = "TRANSFORM_OT_tosphere";
-char OP_RESIZE[] = "TRANSFORM_OT_resize";
-char OP_SHEAR[] = "TRANSFORM_OT_shear";
-char OP_WARP[] = "TRANSFORM_OT_warp";
-char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten";
-char OP_PUSH_PULL[] = "TRANSFORM_OT_push_pull";
-char OP_TILT[] = "TRANSFORM_OT_tilt";
-char OP_TRACKBALL[] = "TRANSFORM_OT_trackball";
-char OP_MIRROR[] = "TRANSFORM_OT_mirror";
-char OP_EDGE_SLIDE[] = "TRANSFORM_OT_edge_slide";
-char OP_EDGE_CREASE[] = "TRANSFORM_OT_edge_crease";
-char OP_SEQ_SLIDE[] = "TRANSFORM_OT_seq_slide";
+static char OP_TRANSLATION[] = "TRANSFORM_OT_translate";
+static char OP_ROTATION[] = "TRANSFORM_OT_rotate";
+static char OP_TOSPHERE[] = "TRANSFORM_OT_tosphere";
+static char OP_RESIZE[] = "TRANSFORM_OT_resize";
+static char OP_SHEAR[] = "TRANSFORM_OT_shear";
+static char OP_WARP[] = "TRANSFORM_OT_warp";
+static char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten";
+static char OP_PUSH_PULL[] = "TRANSFORM_OT_push_pull";
+static char OP_TILT[] = "TRANSFORM_OT_tilt";
+static char OP_TRACKBALL[] = "TRANSFORM_OT_trackball";
+static char OP_MIRROR[] = "TRANSFORM_OT_mirror";
+static char OP_EDGE_SLIDE[] = "TRANSFORM_OT_edge_slide";
+static char OP_EDGE_CREASE[] = "TRANSFORM_OT_edge_crease";
+static char OP_SEQ_SLIDE[] = "TRANSFORM_OT_seq_slide";
void TRANSFORM_OT_translate(struct wmOperatorType *ot);
void TRANSFORM_OT_rotate(struct wmOperatorType *ot);
@@ -83,7 +85,7 @@ void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot);
void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot);
void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot);
-TransformModeItem transform_modes[] =
+static TransformModeItem transform_modes[] =
{
{OP_TRANSLATION, TFM_TRANSLATION, TRANSFORM_OT_translate},
{OP_ROTATION, TFM_ROTATION, TRANSFORM_OT_rotate},
@@ -113,7 +115,7 @@ static int snap_type_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void TRANSFORM_OT_snap_type(wmOperatorType *ot)
+static void TRANSFORM_OT_snap_type(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Snap Type";
@@ -145,12 +147,12 @@ static int select_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int select_orientation_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Orientation", 0);
+ pup= uiPupMenuBegin(C, "Orientation", ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, "TRANSFORM_OT_select_orientation", "orientation");
uiPupMenuEnd(C, pup);
@@ -158,7 +160,7 @@ static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event
return OPERATOR_CANCELLED;
}
-void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
+static void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
{
PropertyRNA *prop;
@@ -171,7 +173,7 @@ void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
/* api callbacks */
ot->invoke = select_orientation_invoke;
ot->exec = select_orientation_exec;
- ot->poll = ED_operator_areaactive;
+ ot->poll = ED_operator_view3d_active;
prop= RNA_def_property(ot->srna, "orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation");
@@ -179,7 +181,7 @@ void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot)
}
-static int delete_orientation_exec(bContext *C, wmOperator *op)
+static int delete_orientation_exec(bContext *C, wmOperator *UNUSED(op))
{
View3D *v3d = CTX_wm_view3d(C);
int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
@@ -192,7 +194,7 @@ static int delete_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int delete_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int delete_orientation_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return delete_orientation_exec(C, op);
}
@@ -213,7 +215,7 @@ static int delete_orientation_poll(bContext *C)
return selected_index >= 0;
}
-void TRANSFORM_OT_delete_orientation(struct wmOperatorType *ot)
+static void TRANSFORM_OT_delete_orientation(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Delete Orientation";
@@ -243,12 +245,12 @@ static int create_orientation_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int create_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int create_orientation_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return create_orientation_exec(C, op);
}
-void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot)
+static void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot)
{
/* identifiers */
ot->name = "Create Orientation";
@@ -319,7 +321,10 @@ static int transform_modal(bContext *C, wmOperator *op, wmEvent *event)
TransInfo *t = op->customdata;
+ /* XXX insert keys are called here, and require context */
+ t->context= C;
exit_code = transformEvent(t, event);
+ t->context= NULL;
transformApply(C, t);
@@ -404,7 +409,7 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
if (flags & P_CONSTRAINT)
{
- prop= RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
+ RNA_def_boolean_vector(ot->srna, "constraint_axis", 3, NULL, "Constraint Axis", "");
prop= RNA_def_property(ot->srna, "constraint_orientation", PROP_ENUM, PROP_NONE);
RNA_def_property_ui_text(prop, "Orientation", "Transformation orientation");
RNA_def_enum_funcs(prop, rna_TransformOrientation_itemf);
@@ -422,7 +427,7 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
{
RNA_def_enum(ot->srna, "proportional", proportional_editing_items, 0, "Proportional Editing", "");
RNA_def_enum(ot->srna, "proportional_edit_falloff", proportional_falloff_items, 0, "Proportional Editing Falloff", "Falloff type for proportional editing mode.");
- RNA_def_float(ot->srna, "proportional_size", 1, 0, FLT_MAX, "Proportional Size", "", 0, 100);
+ RNA_def_float(ot->srna, "proportional_size", 1, 0.00001f, FLT_MAX, "Proportional Size", "", 0.001, 100);
}
if (flags & P_SNAP)
@@ -444,10 +449,15 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
}
}
}
+
+ if (flags & P_OPTIONS)
+ {
+ RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Object data texture space", "");
+ }
- // Add confirm method all the time. At the end because it's not really that important and should be hidden
- prop = RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button");
- RNA_def_property_flag(prop, PROP_HIDDEN);
+ // Add confirm method all the time. At the end because it's not really that important and should be hidden only in log, not in keymap edit
+ /*prop =*/ RNA_def_boolean(ot->srna, "release_confirm", 0, "Confirm on Release", "Always confirm operation when releasing button");
+ //RNA_def_property_flag(prop, PROP_HIDDEN);
}
void TRANSFORM_OT_translate(struct wmOperatorType *ot)
@@ -467,7 +477,7 @@ void TRANSFORM_OT_translate(struct wmOperatorType *ot)
RNA_def_float_vector_xyz(ot->srna, "value", 3, NULL, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
- Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP);
+ Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_ALIGN_SNAP|P_OPTIONS);
}
void TRANSFORM_OT_resize(struct wmOperatorType *ot)
@@ -487,7 +497,7 @@ void TRANSFORM_OT_resize(struct wmOperatorType *ot)
RNA_def_float_vector(ot->srna, "value", 3, VecOne, -FLT_MAX, FLT_MAX, "Vector", "", -FLT_MAX, FLT_MAX);
- Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP);
+ Transform_Properties(ot, P_CONSTRAINT|P_PROPORTIONAL|P_MIRROR|P_GEO_SNAP|P_OPTIONS);
}
@@ -752,7 +762,7 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot)
{TFM_PUSHPULL, "PUSHPULL", 0, "Pushpull", ""},
{TFM_CREASE, "CREASE", 0, "Crease", ""},
{TFM_MIRROR, "MIRROR", 0, "Mirror", ""},
- {TFM_BONESIZE, "BONESIZE", 0, "Bonesize", ""},
+ {TFM_BONESIZE, "BONE_SIZE", 0, "Bonesize", ""},
{TFM_BONE_ENVELOPE, "BONE_ENVELOPE", 0, "Bone_Envelope", ""},
{TFM_CURVE_SHRINKFATTEN, "CURVE_SHRINKFATTEN", 0, "Curve_Shrinkfatten", ""},
{TFM_BONE_ROLL, "BONE_ROLL", 0, "Bone_Roll", ""},
@@ -829,31 +839,37 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
switch(spaceid)
{
case SPACE_VIEW3D:
- km = WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_WARP, WKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_WARP, WKEY, KM_PRESS, KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, OP_TOSPHERE, SKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_TOSPHERE, SKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_select_orientation", SPACEKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_select_orientation", SPACEKEY, KM_PRESS, KM_ALT, 0);
km = WM_keymap_add_item(keymap, "TRANSFORM_OT_create_orientation", SPACEKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
RNA_boolean_set(km->ptr, "use", 1);
- km = WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, OP_MIRROR, MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "data_path", "tool_settings.use_snap");
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_snap_type", TABKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
+
+ km = WM_keymap_add_item(keymap, OP_TRANSLATION, TKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(km->ptr, "texture_space", 1);
+
+ km = WM_keymap_add_item(keymap, OP_RESIZE, TKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
+ RNA_boolean_set(km->ptr, "texture_space", 1);
break;
case SPACE_ACTION:
@@ -873,16 +889,16 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
break;
case SPACE_IPO:
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
break;
case SPACE_NLA:
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
@@ -898,35 +914,35 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
break;
case SPACE_NODE:
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_A, KM_ANY, 0, 0);
RNA_enum_set(km->ptr, "release_confirm", 1);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
RNA_enum_set(km->ptr, "release_confirm", 1);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
break;
case SPACE_SEQ:
- km= WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_SEQ_SLIDE, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
break;
case SPACE_IMAGE:
- km = WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
- km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
+ WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- km = WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
- km = WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(km->ptr, "data_path", "tool_settings.use_snap");
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index 2715f497cc1..b63d279a42b 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,7 +34,7 @@
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_armature.h"
#include "BKE_context.h"
#include "BKE_tessmesh.h"
@@ -43,6 +43,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
//#include "BIF_editmesh.h"
//#include "BIF_interface.h"
@@ -73,13 +74,12 @@ void BIF_clearTransformOrientation(bContext *C)
}
}
-TransformOrientation* findOrientationName(bContext *C, char *name)
+static TransformOrientation* findOrientationName(ListBase *lb, const char *name)
{
- ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts= NULL;
- for (ts = transform_spaces->first; ts; ts = ts->next) {
- if (strncmp(ts->name, name, 35) == 0) {
+ for (ts= lb->first; ts; ts = ts->next) {
+ if (strncmp(ts->name, name, sizeof(ts->name)-1) == 0) {
return ts;
}
}
@@ -87,34 +87,14 @@ TransformOrientation* findOrientationName(bContext *C, char *name)
return NULL;
}
-void uniqueOrientationName(bContext *C, char *name)
+static int uniqueOrientationNameCheck(void *arg, const char *name)
{
- if (findOrientationName(C, name) != NULL)
- {
- char tempname[64];
- int number;
- char *dot;
-
-
- number = strlen(name);
-
- if (number && isdigit(name[number-1]))
- {
- dot = strrchr(name, '.'); // last occurrence
- if (dot)
- *dot=0;
- }
+ return findOrientationName((ListBase *)arg, name) != NULL;
+}
- for (number = 1; number <= 999; number++)
- {
- sprintf(tempname, "%s.%03d", name, number);
- if (findOrientationName(C, tempname) == NULL)
- {
- BLI_strncpy(name, tempname, 32);
- break;
- }
- }
- }
+static void uniqueOrientationName(ListBase *lb, char *name)
+{
+ BLI_uniquename_cb(uniqueOrientationNameCheck, lb, "Space", '.', name, sizeof(((TransformOrientation *)NULL)->name));
}
void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name, int use, int overwrite)
@@ -142,7 +122,7 @@ void BIF_createTransformOrientation(bContext *C, ReportList *reports, char *name
}
}
-TransformOrientation *createObjectSpace(bContext *C, ReportList *reports, char *name, int overwrite) {
+TransformOrientation *createObjectSpace(bContext *C, ReportList *UNUSED(reports), char *name, int overwrite) {
Base *base = CTX_data_active_base(C);
Object *ob;
float mat[3][3];
@@ -288,11 +268,11 @@ TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[],
if (overwrite)
{
- ts = findOrientationName(C, name);
+ ts = findOrientationName(transform_spaces, name);
}
else
{
- uniqueOrientationName(C, name);
+ uniqueOrientationName(transform_spaces, name);
}
/* if not, create a new one */
@@ -311,7 +291,7 @@ TransformOrientation* addMatrixSpace(bContext *C, float mat[3][3], char name[],
void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
- TransformOrientation *ts = transform_spaces->first;
+ TransformOrientation *ts;
int i;
for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
@@ -338,35 +318,31 @@ void BIF_removeTransformOrientation(bContext *C, TransformOrientation *target) {
void BIF_removeTransformOrientationIndex(bContext *C, int index) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
- TransformOrientation *ts = transform_spaces->first;
- int i;
-
- for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
- if (i == index) {
- View3D *v3d = CTX_wm_view3d(C);
- if(v3d) {
- int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
-
- // Transform_fix_me NEED TO DO THIS FOR ALL VIEW3D
- if (selected_index == i) {
- v3d->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
- }
- else if (selected_index > i) {
- v3d->twmode--;
- }
-
- }
+ TransformOrientation *ts= BLI_findlink(transform_spaces, index);
- BLI_freelinkN(transform_spaces, ts);
- break;
+ if (ts) {
+ View3D *v3d = CTX_wm_view3d(C);
+ if(v3d) {
+ int selected_index = (v3d->twmode - V3D_MANIP_CUSTOM);
+
+ // Transform_fix_me NEED TO DO THIS FOR ALL VIEW3D
+ if (selected_index == index) {
+ v3d->twmode = V3D_MANIP_GLOBAL; /* fallback to global */
+ }
+ else if (selected_index > index) {
+ v3d->twmode--;
+ }
+
}
+
+ BLI_freelinkN(transform_spaces, ts);
}
}
void BIF_selectTransformOrientation(bContext *C, TransformOrientation *target) {
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
View3D *v3d = CTX_wm_view3d(C);
- TransformOrientation *ts = transform_spaces->first;
+ TransformOrientation *ts;
int i;
for (i = 0, ts = transform_spaces->first; ts; ts = ts->next, i++) {
@@ -426,7 +402,7 @@ EnumPropertyItem *BIF_enumTransformOrientation(bContext *C)
return item;
}
-char * BIF_menustringTransformOrientation(const bContext *C, char *title) {
+const char * BIF_menustringTransformOrientation(const bContext *C, const char *title) {
char menu[] = "%t|Global%x0|Local%x1|Gimbal%x4|Normal%x2|View%x3";
ListBase *transform_spaces = &CTX_data_scene(C)->transform_spaces;
TransformOrientation *ts;
@@ -834,14 +810,14 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
{
if (ebone->flag & BONE_SELECTED)
{
- float mat[3][3];
+ float tmat[3][3];
float vec[3];
sub_v3_v3v3(vec, ebone->tail, ebone->head);
normalize_v3(vec);
add_v3_v3(normal, vec);
- vec_roll_to_mat3(vec, ebone->roll, mat);
- add_v3_v3(plane, mat[2]);
+ vec_roll_to_mat3(vec, ebone->roll, tmat);
+ add_v3_v3(plane, tmat[2]);
}
}
}
@@ -898,7 +874,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
result = ORIENTATION_EDGE;
}
}
- else if(ob && (ob->mode & (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT|OB_MODE_PARTICLE_EDIT)))
+ else if(ob && (ob->mode & (OB_MODE_ALL_PAINT|OB_MODE_PARTICLE_EDIT)))
{
}
else {
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 3dbd83bfa52..7379eb46a3a 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -48,6 +48,7 @@
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
//#include "BDR_drawobject.h"
//
@@ -84,6 +85,8 @@
//#include "blendef.h" /* for selection modes */
+#define USE_BVH_FACE_SNAP
+
/********************* PROTOTYPES ***********************/
void setSnappingCallback(TransInfo *t);
@@ -107,17 +110,19 @@ float ResizeBetween(TransInfo *t, float p1[3], float p2[3]);
/****************** IMPLEMENTATIONS *********************/
+#if 0
int BIF_snappingSupported(Object *obedit)
{
int status = 0;
- if (obedit == NULL || ELEM3(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE)) /* only support object mesh, armature, curves */
+ if (obedit == NULL || ELEM4(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE)) /* only support object mesh, armature, curves */
{
status = 1;
}
return status;
}
+#endif
int validSnap(TransInfo *t)
{
@@ -135,30 +140,30 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
if (validSnap(t) && activeSnap(t))
{
- char col[4] = {1, 0, 1};
+ unsigned char col[4];
UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- glColor4ub(col[0], col[1], col[2], 128);
+ col[3]= 128;
+ glColor4ubv(col);
if (t->spacetype == SPACE_VIEW3D) {
TransSnapPoint *p;
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d = CTX_wm_region_view3d(C);
- float tmat[4][4], imat[4][4];
+ float imat[4][4];
float size;
glDisable(GL_DEPTH_TEST);
- size = 0.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
-
- copy_m4_m4(tmat, rv3d->viewmat);
- invert_m4_m4(imat, tmat);
+ size = 2.5f * UI_GetThemeValuef(TH_VERTEX_SIZE);
+
+ invert_m4_m4(imat, rv3d->viewmat);
for (p = t->tsnap.points.first; p; p = p->next) {
- drawcircball(GL_LINE_LOOP, p->co, size * get_drawsize(t->ar, p->co), imat);
+ drawcircball(GL_LINE_LOOP, p->co, view3d_pixel_size(rv3d, p->co) * size, imat);
}
if (t->tsnap.status & POINT_INIT) {
- drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, size * get_drawsize(t->ar, t->tsnap.snapPoint), imat);
+ drawcircball(GL_LINE_LOOP, t->tsnap.snapPoint, view3d_pixel_size(rv3d, t->tsnap.snapPoint) * size, imat);
}
/* draw normal if needed */
@@ -213,7 +218,7 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
}
}
-int handleSnapping(TransInfo *t, wmEvent *event)
+int handleSnapping(TransInfo *UNUSED(t), wmEvent *UNUSED(event))
{
int status = 0;
@@ -264,6 +269,8 @@ void applyProject(TransInfo *t)
}
else if (t->flag & T_OBJECT)
{
+ td->ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
+ object_handle_update(t->scene, td->ob);
VECCOPY(iloc, td->ob->obmat[3]);
}
@@ -353,7 +360,7 @@ int validSnappingNormal(TransInfo *t)
return 0;
}
-void initSnappingMode(TransInfo *t)
+static void initSnappingMode(TransInfo *t)
{
ToolSettings *ts = t->settings;
Object *obedit = t->obedit;
@@ -373,9 +380,10 @@ void initSnappingMode(TransInfo *t)
/* Edit mode */
if (t->tsnap.applySnap != NULL && // A snapping function actually exist
- (obedit != NULL && ELEM3(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE)) ) // Temporary limited to edit mode meshes, armature, curves
+ (obedit != NULL && ELEM4(obedit->type, OB_MESH, OB_ARMATURE, OB_CURVE, OB_LATTICE)) ) // Temporary limited to edit mode meshes, armature, curves
{
- if ((t->flag & T_PROP_EDIT) || t->tsnap.project) /* also exclude edit for project, for now */
+ /* editmode meshes now supported */
+ if ((obedit->type != OB_MESH) && ((t->flag & T_PROP_EDIT) || t->tsnap.project)) /* also exclude edit for project, for now */
{
t->tsnap.modeSelect = SNAP_NOT_OBEDIT;
}
@@ -599,7 +607,7 @@ void ApplySnapResize(TransInfo *t, float vec[3])
/********************** DISTANCE **************************/
-float TranslationBetween(TransInfo *t, float p1[3], float p2[3])
+float TranslationBetween(TransInfo *UNUSED(t), float p1[3], float p2[3])
{
return len_v3v3(p1, p2);
}
@@ -683,12 +691,12 @@ float ResizeBetween(TransInfo *t, float p1[3], float p2[3])
/********************** CALC **************************/
-void CalcSnapGrid(TransInfo *t, float *vec)
+void CalcSnapGrid(TransInfo *t, float *UNUSED(vec))
{
snapGridAction(t, t->tsnap.snapPoint, BIG_GEARS);
}
-void CalcSnapGeometry(TransInfo *t, float *vec)
+void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
{
if (t->spacetype == SPACE_VIEW3D)
{
@@ -706,7 +714,7 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
ListBase depth_peels;
DepthPeel *p1, *p2;
float *last_p = NULL;
- float dist = FLT_MAX;
+ float max_dist = FLT_MAX;
float p[3] = {0.0f, 0.0f, 0.0f};
depth_peels.first = depth_peels.last = NULL;
@@ -770,23 +778,27 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
if (last_p == NULL)
{
VECCOPY(p, vec);
- dist = 0;
+ max_dist = 0;
break;
}
new_dist = len_v3v3(last_p, vec);
- if (new_dist < dist)
+ if (new_dist < max_dist)
{
VECCOPY(p, vec);
- dist = new_dist;
+ max_dist = new_dist;
}
}
}
- if (dist != FLT_MAX)
+ if (max_dist != FLT_MAX)
{
VECCOPY(loc, p);
+ /* XXX, is there a correct normal in this case ???, for now just z up */
+ no[0]= 0.0;
+ no[1]= 0.0;
+ no[2]= 1.0;
found = 1;
}
@@ -1012,8 +1024,8 @@ void TargetSnapClosest(TransInfo *t)
}
}
/*================================================================*/
-
-int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4co, float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
+#ifndef USE_BVH_FACE_SNAP
+static int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4co, float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
{
float lambda;
int result;
@@ -1063,8 +1075,9 @@ int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4
return retval;
}
+#endif
-int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2no[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
+static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2no[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
{
float intersect[3] = {0, 0, 0}, ray_end[3], dvec[3];
int result;
@@ -1149,7 +1162,7 @@ int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2n
return retval;
}
-int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
+static int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth)
{
int retval = 0;
float dvec[3];
@@ -1193,7 +1206,7 @@ int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray
return retval;
}
-int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth)
+static int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *UNUSED(no), int *dist, float *depth)
{
float imat[4][4];
float ray_start_local[3], ray_normal_local[3];
@@ -1258,12 +1271,15 @@ int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float
return retval;
}
-int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, BMEditMesh *em, float obmat[][4], float ray_start[3], float ray_normal[3], short mval[2], float *loc, float *no, int *dist, float *depth)
+static int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob,
+ DerivedMesh *dm, BMEditMesh *em, float obmat[][4],
+ float ray_start[3], float ray_normal[3], float mval[2],
+ float *loc, float *no, int *dist, float *depth)
{
int retval = 0;
int totvert = dm->getNumVerts(dm);
int totface = dm->getNumTessFaces(dm);
-
+
if (totvert > 0) {
float imat[4][4];
float timat[3][3]; /* transpose inverse matrix for normals */
@@ -1296,19 +1312,23 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, B
{
case SCE_SNAP_MODE_FACE:
{
-#if 1 // Added for durian
+#ifdef USE_BVH_FACE_SNAP // Added for durian
BVHTreeRayHit hit;
BVHTreeFromMesh treeData;
+ /* local scale in normal direction */
+ float local_scale = len_v3(ray_normal_local);
+
+ treeData.em_evil= em;
bvhtree_from_mesh_faces(&treeData, dm, 0.0f, 4, 6);
hit.index = -1;
- hit.dist = *depth;
+ hit.dist = *depth * (*depth == FLT_MAX ? 1.0f : local_scale);
if(treeData.tree && BLI_bvhtree_ray_cast(treeData.tree, ray_start_local, ray_normal_local, 0.0f, &hit, treeData.raycast_callback, &treeData) != -1)
{
- if(hit.dist<=*depth) {
- *depth= hit.dist;
+ if(hit.dist/local_scale <= *depth) {
+ *depth= hit.dist/local_scale;
copy_v3_v3(loc, hit.co);
copy_v3_v3(no, hit.no);
@@ -1535,7 +1555,7 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, B
return retval;
}
-int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth)
+static int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth)
{
ToolSettings *ts= scene->toolsettings;
int retval = 0;
@@ -1547,7 +1567,8 @@ int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obma
if (editobject)
{
em = ((Mesh *)ob->data)->edit_btmesh;
- dm = editbmesh_get_derived_cage(scene, ob, em, CD_MASK_BAREMESH);
+ /* dm = editbmesh_get_derived_cage(scene, ob, em, CD_MASK_BAREMESH); */
+ dm = editbmesh_get_derived_base(ob, em); /* limitation, em & dm MUST have the same number of faces */
}
else
{
@@ -1567,7 +1588,7 @@ int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obma
return retval;
}
-int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mval[2], int *dist, float *loc, float *no, SnapMode mode) {
+static int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mval[2], int *dist, float *loc, float *no, SnapMode mode) {
Base *base;
float depth = FLT_MAX;
int retval = 0;
@@ -1593,10 +1614,9 @@ int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mv
Object *ob = base->object;
retval |= snapObject(scene, ar, ob, 0, ob->obmat, ray_start, ray_normal, mval, loc, no, dist, &depth);
}
-
- base= FIRSTBASE;
+
for ( base = FIRSTBASE; base != NULL; base = base->next ) {
- if ( BASE_SELECTABLE(v3d, base) && (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) ) {
+ if ( BASE_VISIBLE(v3d, base) && (base->flag & (BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA)) == 0 && ((mode == SNAP_NOT_SELECTED && (base->flag & (SELECT|BA_WAS_SEL)) == 0) || (ELEM(mode, SNAP_ALL, SNAP_NOT_OBEDIT) && base != BASACT)) ) {
Object *ob = base->object;
if (ob->transflag & OB_DUPLI)
@@ -1637,7 +1657,7 @@ int snapObjectsContext(bContext *C, float mval[2], int *dist, float *loc, float
/******************** PEELING *********************************/
-int cmpPeel(void *arg1, void *arg2)
+static int cmpPeel(void *arg1, void *arg2)
{
DepthPeel *p1 = arg1;
DepthPeel *p2 = arg2;
@@ -1655,7 +1675,7 @@ int cmpPeel(void *arg1, void *arg2)
return val;
}
-void removeDoublesPeel(ListBase *depth_peels)
+static void removeDoublesPeel(ListBase *depth_peels)
{
DepthPeel *peel;
@@ -1677,7 +1697,7 @@ void removeDoublesPeel(ListBase *depth_peels)
}
}
-void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], Object *ob)
+static void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], Object *ob)
{
DepthPeel *peel = MEM_callocN(sizeof(DepthPeel), "DepthPeel");
@@ -1691,7 +1711,7 @@ void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], O
peel->flag = 0;
}
-int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], ListBase *depth_peels)
+static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float UNUSED(mval[2]), ListBase *depth_peels)
{
int retval = 0;
int totvert = dm->getNumVerts(dm);
@@ -1799,7 +1819,7 @@ int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta
return retval;
}
-int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, float mval[2])
+static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, float mval[2])
{
Base *base;
int retval = 0;
@@ -1818,26 +1838,26 @@ int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase
for(dupli_ob = lb->first; dupli_ob; dupli_ob = dupli_ob->next)
{
- Object *ob = dupli_ob->ob;
+ Object *dob = dupli_ob->ob;
- if (ob->type == OB_MESH) {
+ if (dob->type == OB_MESH) {
#if 0 //BMESH_TODO
EditMesh *em;
DerivedMesh *dm = NULL;
int val;
- if (ob != obedit)
+ if (dob != obedit)
{
- dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+ dm = mesh_get_derived_final(scene, dob, CD_MASK_BAREMESH);
- val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
+ val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
else
{
- em = ((Mesh *)ob->data)->edit_mesh;
+ em = ((Mesh *)dob->data)->edit_mesh;
dm = editmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
- val = peelDerivedMesh(ob, dm, ob->obmat, ray_start, ray_normal, mval, depth_peels);
+ val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
retval = retval || val;
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index b4b2fd12cef..511b1ab49e0 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -19,16 +19,69 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
- ../include
- ../../../../intern/guardedalloc
+ ../../bmesh
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+)
+
+set(SRC
+ ed_util.c
+ editmode_undo.c
+ numinput.c
+ undo.c
+ crazyspace.c
+
+ util_intern.h
+ # general includes
+ ../include/BIF_gl.h
+ ../include/BIF_glutil.h
+ ../include/ED_anim_api.h
+ ../include/ED_armature.h
+ ../include/ED_curve.h
+ ../include/ED_datafiles.h
+ ../include/ED_fileselect.h
+ ../include/ED_fluidsim.h
+ ../include/ED_gpencil.h
+ ../include/ED_image.h
+ ../include/ED_info.h
+ ../include/ED_keyframes_draw.h
+ ../include/ED_keyframes_edit.h
+ ../include/ED_keyframing.h
+ ../include/ED_lattice.h
+ ../include/ED_logic.h
+ ../include/ED_markers.h
+ ../include/ED_mball.h
+ ../include/ED_mesh.h
+ ../include/ED_node.h
+ ../include/ED_numinput.h
+ ../include/ED_object.h
+ ../include/ED_particle.h
+ ../include/ED_physics.h
+ ../include/ED_render.h
+ ../include/ED_screen.h
+ ../include/ED_screen_types.h
+ ../include/ED_sculpt.h
+ ../include/ED_sequencer.h
+ ../include/ED_sound.h
+ ../include/ED_space_api.h
+ ../include/ED_text.h
+ ../include/ED_transform.h
+ ../include/ED_types.h
+ ../include/ED_util.h
+ ../include/ED_uvedit.h
+ ../include/ED_view3d.h
+ ../include/UI_icons.h
+ ../include/UI_interface.h
+ ../include/UI_interface_icons.h
+ ../include/UI_resources.h
+ ../include/UI_view2d.h
)
-BLENDERLIB(bf_editor_util "${SRC}" "${INC}")
+blender_add_lib(bf_editor_util "${SRC}" "${INC}")
diff --git a/source/blender/editors/util/Makefile b/source/blender/editors/util/Makefile
deleted file mode 100644
index 8535b3fb402..00000000000
--- a/source/blender/editors/util/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_util
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../python
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-# own include
-
-CPPFLAGS += -I../include
diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript
index 723708b3d31..2d5ee84333b 100644
--- a/source/blender/editors/util/SConscript
+++ b/source/blender/editors/util/SConscript
@@ -6,5 +6,6 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna ../../bmesh'
+incs += ' ../../blenloader'
env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core'], priority=[130] )
diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c
new file mode 100644
index 00000000000..6b7292fe6c7
--- /dev/null
+++ b/source/blender/editors/util/crazyspace.c
@@ -0,0 +1,407 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation,
+ * Sergey Sharybin
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_modifier.h"
+#include "BKE_multires.h"
+#include "BKE_mesh.h"
+#include "BKE_tessmesh.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+
+#include "ED_util.h"
+
+#define TAN_MAKE_VEC(a, b, c) a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2])
+static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3)
+{
+ float vecu[3], vecv[3];
+ float q1[4], q2[4];
+
+ TAN_MAKE_VEC(vecu, v1, v2);
+ TAN_MAKE_VEC(vecv, v1, v3);
+ tri_to_quat( q1,v1, vecu, vecv);
+
+ TAN_MAKE_VEC(vecu, def1, def2);
+ TAN_MAKE_VEC(vecv, def1, def3);
+ tri_to_quat( q2,def1, vecu, vecv);
+
+ sub_qt_qtqt(quat, q2, q1);
+}
+#undef TAN_MAKE_VEC
+
+static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
+{
+ float *vec = userData;
+
+ vec+= 3*index;
+ VECCOPY(vec, co);
+}
+
+static int modifiers_disable_subsurf_temporary(Object *ob)
+{
+ ModifierData *md;
+ int disabled = 0;
+
+ for(md=ob->modifiers.first; md; md=md->next)
+ if(md->type==eModifierType_Subsurf)
+ if(md->mode & eModifierMode_OnCage) {
+ md->mode ^= eModifierMode_DisableTemporary;
+ disabled= 1;
+ }
+
+ return disabled;
+}
+
+/* disable subsurf temporal, get mapped cos, and enable it */
+float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
+{
+ Mesh *me= obedit->data;
+ DerivedMesh *dm;
+ float *vertexcos;
+
+ /* disable subsurf temporal, get mapped cos, and enable it */
+ if(modifiers_disable_subsurf_temporary(obedit)) {
+ /* need to make new derivemesh */
+ makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
+ }
+
+ /* now get the cage */
+ dm= editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
+
+ vertexcos= MEM_mallocN(3*sizeof(float)*me->edit_btmesh->bm->totvert, "vertexcos map");
+ dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
+
+ dm->release(dm);
+
+ /* set back the flag, no new cage needs to be built, transform does it */
+ modifiers_disable_subsurf_temporary(obedit);
+
+ return vertexcos;
+}
+
+void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mappedcos, float *quats)
+{
+#if 0
+ BMEditVert *eve, *prev;
+ BMEditFace *efa;
+ BMIter iter;
+ float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
+ intptr_t index= 0;
+
+ /* two abused locations in vertices */
+ for(eve= em->verts.first; eve; eve= eve->next, index++) {
+ eve->tmp.p = NULL;
+ eve->prev= (EditVert *)index;
+ }
+
+ /* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */
+ for(efa= em->faces.first; efa; efa= efa->next) {
+
+ /* retrieve mapped coordinates */
+ v1= mappedcos + 3*(intptr_t)(efa->v1->prev);
+ v2= mappedcos + 3*(intptr_t)(efa->v2->prev);
+ v3= mappedcos + 3*(intptr_t)(efa->v3->prev);
+
+ co1= (origcos)? origcos + 3*(intptr_t)(efa->v1->prev): efa->v1->co;
+ co2= (origcos)? origcos + 3*(intptr_t)(efa->v2->prev): efa->v2->co;
+ co3= (origcos)? origcos + 3*(intptr_t)(efa->v3->prev): efa->v3->co;
+
+ if(efa->v2->tmp.p==NULL && efa->v2->f1) {
+ set_crazy_vertex_quat(quats, co2, co3, co1, v2, v3, v1);
+ efa->v2->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+
+ if(efa->v4) {
+ v4= mappedcos + 3*(intptr_t)(efa->v4->prev);
+ co4= (origcos)? origcos + 3*(intptr_t)(efa->v4->prev): efa->v4->co;
+
+ if(efa->v1->tmp.p==NULL && efa->v1->f1) {
+ set_crazy_vertex_quat(quats, co1, co2, co4, v1, v2, v4);
+ efa->v1->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+ if(efa->v3->tmp.p==NULL && efa->v3->f1) {
+ set_crazy_vertex_quat(quats, co3, co4, co2, v3, v4, v2);
+ efa->v3->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+ if(efa->v4->tmp.p==NULL && efa->v4->f1) {
+ set_crazy_vertex_quat(quats, co4, co1, co3, v4, v1, v3);
+ efa->v4->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+ }
+ else {
+ if(efa->v1->tmp.p==NULL && efa->v1->f1) {
+ set_crazy_vertex_quat(quats, co1, co2, co3, v1, v2, v3);
+ efa->v1->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+ if(efa->v3->tmp.p==NULL && efa->v3->f1) {
+ set_crazy_vertex_quat(quats, co3, co1, co2, v3, v1, v2);
+ efa->v3->tmp.p= (void*)quats;
+ quats+= 4;
+ }
+ }
+ }
+
+ /* restore abused prev pointer */
+ for(prev= NULL, eve= em->verts.first; eve; prev= eve, eve= eve->next)
+ eve->prev= prev;
+#endif
+}
+
+void crazyspace_set_quats_mesh(Mesh *me, float *origcos, float *mappedcos, float *quats)
+{
+ int i;
+ MVert *mvert;
+ MFace *mface;
+ float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
+
+ mvert= me->mvert;
+ for(i=0; i<me->totvert; i++, mvert++)
+ mvert->flag&= ~ME_VERT_TMP_TAG;
+
+ /* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */
+ mvert= me->mvert;
+ mface= me->mface;
+ for(i=0; i<me->totface; i++, mface++) {
+
+ /* retrieve mapped coordinates */
+ v1= mappedcos + 3*mface->v1;
+ v2= mappedcos + 3*mface->v2;
+ v3= mappedcos + 3*mface->v3;
+
+ co1= (origcos)? origcos + 3*mface->v1: mvert[mface->v1].co;
+ co2= (origcos)? origcos + 3*mface->v2: mvert[mface->v2].co;
+ co3= (origcos)? origcos + 3*mface->v3: mvert[mface->v3].co;
+
+ if((mvert[mface->v2].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v2*4], co2, co3, co1, v2, v3, v1);
+ mvert[mface->v2].flag|= ME_VERT_TMP_TAG;
+ }
+
+ if(mface->v4) {
+ v4= mappedcos + 3*mface->v4;
+ co4= (origcos)? origcos + 3*mface->v4: mvert[mface->v4].co;
+
+ if((mvert[mface->v1].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v1*4], co1, co2, co4, v1, v2, v4);
+ mvert[mface->v1].flag|= ME_VERT_TMP_TAG;
+ }
+ if((mvert[mface->v3].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v3*4], co3, co4, co2, v3, v4, v2);
+ mvert[mface->v3].flag|= ME_VERT_TMP_TAG;
+ }
+ if((mvert[mface->v4].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v4*4], co4, co1, co3, v4, v1, v3);
+ mvert[mface->v4].flag|= ME_VERT_TMP_TAG;
+ }
+ }
+ else {
+ if((mvert[mface->v1].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v1*4], co1, co2, co3, v1, v2, v3);
+ mvert[mface->v1].flag|= ME_VERT_TMP_TAG;
+ }
+ if((mvert[mface->v3].flag&ME_VERT_TMP_TAG)==0) {
+ set_crazy_vertex_quat(&quats[mface->v3*4], co3, co1, co2, v3, v1, v2);
+ mvert[mface->v3].flag|= ME_VERT_TMP_TAG;
+ }
+ }
+ }
+}
+
+int editbmesh_get_first_deform_matrices(Scene *scene, Object *ob, BMEditMesh *em,
+ float (**deformmats)[3][3], float (**deformcos)[3])
+{
+ ModifierData *md;
+ DerivedMesh *dm;
+ int i, a, numleft = 0, numVerts = 0;
+ int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
+ float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
+
+ modifiers_clearErrors(ob);
+
+ dm = NULL;
+ md = modifiers_getVirtualModifierList(ob);
+
+ /* compute the deformation matrices and coordinates for the first
+ modifiers with on cage editing that are enabled and support computing
+ deform matrices */
+ for(i = 0; md && i <= cageIndex; i++, md = md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ if(!editbmesh_modifier_is_enabled(scene, md, dm))
+ continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
+ if(!defmats) {
+ dm= getEditDerivedBMesh(em, ob, NULL);
+ deformedVerts= editbmesh_get_vertex_cos(em, &numVerts);
+ defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
+
+ for(a=0; a<numVerts; a++)
+ unit_m3(defmats[a]);
+ }
+
+ mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats,
+ numVerts);
+ }
+ else
+ break;
+ }
+
+ for(; md && i <= cageIndex; md = md->next, i++)
+ if(editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
+ numleft++;
+
+ if(dm)
+ dm->release(dm);
+
+ *deformmats= defmats;
+ *deformcos= deformedVerts;
+
+ return numleft;
+}
+
+int sculpt_get_first_deform_matrices(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
+{
+ ModifierData *md;
+ DerivedMesh *dm;
+ int a, numVerts= 0;
+ float (*defmats)[3][3]= NULL, (*deformedVerts)[3]= NULL;
+ MultiresModifierData *mmd= get_multires_modifier(scene, ob, 0);
+ int has_multires = mmd != NULL && mmd->sculptlvl > 0;
+ int numleft= 0;
+
+ if(has_multires) {
+ *deformmats= NULL;
+ *deformcos= NULL;
+ return numleft;
+ }
+
+ dm= NULL;
+ md= modifiers_getVirtualModifierList(ob);
+
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform) {
+ if(!defmats) {
+ Mesh *me= (Mesh*)ob->data;
+ dm= mesh_create_derived(me, ob, NULL);
+ deformedVerts= mesh_getVertexCos(me, &numVerts);
+ defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
+
+ for(a=0; a<numVerts; a++)
+ unit_m3(defmats[a]);
+ }
+
+ if(mti->deformMatrices) mti->deformMatrices(md, ob, dm, deformedVerts, defmats, numVerts);
+ else break;
+ }
+ }
+
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform)
+ numleft++;
+ }
+
+ if(dm)
+ dm->release(dm);
+
+ *deformmats= defmats;
+ *deformcos= deformedVerts;
+
+ return numleft;
+}
+
+void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
+{
+ int totleft= sculpt_get_first_deform_matrices(scene, ob, deformmats, deformcos);
+
+ if(totleft) {
+ /* there are deformation modifier which doesn't support deformation matricies
+ calculation. Need additional crazyspace correction */
+
+ float (*deformedVerts)[3]= *deformcos;
+ float (*origVerts)[3]= MEM_dupallocN(deformedVerts);
+ float *quats= NULL;
+ int i, deformed= 0;
+ ModifierData *md= modifiers_getVirtualModifierList(ob);
+ Mesh *me= (Mesh*)ob->data;
+
+ for(; md; md= md->next) {
+ ModifierTypeInfo *mti= modifierType_getInfo(md->type);
+
+ if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform) {
+ /* skip leading modifiers which have been alredy
+ handled in sculpt_get_first_deform_matrices */
+ if(mti->deformMatrices && !deformed)
+ continue;
+
+ mti->deformVerts(md, ob, NULL, deformedVerts, me->totvert, 0, 0);
+ deformed= 1;
+ }
+ }
+
+ quats= MEM_mallocN(me->totvert*sizeof(float)*4, "crazy quats");
+
+ crazyspace_set_quats_mesh(me, (float*)origVerts, (float*)deformedVerts, quats);
+
+ for(i=0; i<me->totvert; i++) {
+ float qmat[3][3], tmat[3][3];
+
+ quat_to_mat3(qmat, &quats[i*4]);
+ mul_m3_m3m3(tmat, qmat, (*deformmats)[i]);
+ copy_m3_m3((*deformmats)[i], tmat);
+ }
+
+ MEM_freeN(origVerts);
+ MEM_freeN(quats);
+ }
+}
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 8e2a30b4a69..314fcdc601b 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,18 +27,23 @@
*/
#include <stdlib.h>
+#include <string.h>
#include <math.h>
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_packedFile_types.h"
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_utildefines.h"
+#include "BKE_packedFile.h"
#include "ED_armature.h"
#include "ED_mesh.h"
@@ -48,6 +53,11 @@
#include "UI_interface.h"
+#include "WM_types.h"
+#include "RNA_access.h"
+
+
+
/* ********* general editor util funcs, not BKE stuff please! ********* */
void ED_editors_init(bContext *C)
@@ -91,8 +101,8 @@ void ED_editors_exit(bContext *C)
Object *ob= sce->obedit;
/* global in meshtools... */
- mesh_octree_table(NULL, NULL, NULL, 'e');
- mesh_mirrtopo_table(NULL, 'e');
+ //BMESH_TODO mesh_octree_table(NULL, NULL, NULL, 'e');
+ //BMESH_TODO mesh_mirrtopo_table(NULL, 'e');
if(ob) {
if(ob->type==OB_MESH) {
@@ -120,8 +130,8 @@ void ED_editors_exit(bContext *C)
/* if weight-painting is on, free mesh octree data */
if(ob->mode & OB_MODE_WEIGHT_PAINT) {
- mesh_octree_table(NULL, NULL, NULL, 'e');
- mesh_mirrtopo_table(NULL, 'e');
+ //BMESH_TODO mesh_octree_table(NULL, NULL, NULL, 'e');
+ //BMESH_TODO mesh_mirrtopo_table(NULL, 'e');
}
}
}
@@ -152,7 +162,7 @@ void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, fl
}
-int GetButStringLength(char *str)
+int GetButStringLength(const char *str)
{
int rt;
@@ -161,3 +171,91 @@ int GetButStringLength(char *str)
return rt + 15;
}
+
+void unpack_menu(bContext *C, const char *opname, const char *id_name, const char *abs_name, const char *folder, struct PackedFile *pf)
+{
+ PointerRNA props_ptr;
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ char line[FILE_MAXDIR + FILE_MAXFILE + 100];
+
+ pup= uiPupMenuBegin(C, "Unpack file", ICON_NULL);
+ layout= uiPupMenuLayout(pup);
+
+ sprintf(line, "Remove Pack");
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_REMOVE);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ if(G.relbase_valid) {
+ char local_name[FILE_MAXDIR + FILE_MAX], fi[FILE_MAX];
+
+ BLI_strncpy(local_name, abs_name, sizeof(local_name));
+ BLI_splitdirstring(local_name, fi);
+ sprintf(local_name, "//%s/%s", folder, fi);
+ if(strcmp(abs_name, local_name)!=0) {
+ switch(checkPackedFile(local_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", local_name);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ sprintf(line, "Overwrite %s", local_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ }
+ }
+ }
+
+ switch(checkPackedFile(abs_name, pf)) {
+ case PF_NOFILE:
+ sprintf(line, "Create %s", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ case PF_EQUAL:
+ sprintf(line, "Use %s (identical)", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ case PF_DIFFERS:
+ sprintf(line, "Use %s (differs)", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+
+ sprintf(line, "Overwrite %s", abs_name);
+ //uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
+ RNA_string_set(&props_ptr, "id", id_name);
+ break;
+ }
+
+ uiPupMenuEnd(C, pup);
+}
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 564439a7bb3..1e6f7cd8804 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,25 +37,29 @@
#include "DNA_object_types.h"
#include "DNA_screen_types.h"
-#include "BKE_context.h"
-#include "BKE_depsgraph.h"
-#include "BKE_global.h"
-
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+
+#include "ED_util.h"
#include "ED_mesh.h"
#include "UI_interface.h"
#include "UI_resources.h"
+#include "util_intern.h"
+
/* ***************** generic editmode undo system ********************* */
/*
Add this in your local code:
-void undo_editmode_push(bContext *C, char *name,
+void undo_editmode_push(bContext *C, const char *name,
void * (*getdata)(bContext *C), // use context to retrieve current editdata
void (*freedata)(void *), // pointer to function freeing data
void (*to_editmode)(void *, void *), // data to editmode conversion
@@ -74,7 +78,7 @@ void undo_editmode_menu(void) // history menu
/* ********************************************************************* */
/* ****** XXX ***** */
-void error(const char *dummy) {}
+static void error(const char *UNUSED(arg)) {}
/* ****** XXX ***** */
@@ -108,7 +112,7 @@ static void undo_restore(UndoElem *undo, void *editdata, void *obdata)
}
/* name can be a dynamic string */
-void undo_editmode_push(bContext *C, char *name,
+void undo_editmode_push(bContext *C, const char *name,
void * (*getdata)(bContext *C),
void (*freedata)(void *),
void (*to_editmode)(void *, void *, void *),
@@ -268,7 +272,7 @@ void undo_editmode_step(bContext *C, int step)
EDBM_selectmode_to_scene(CTX_data_scene(C), obedit);
}
- DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&obedit->id, OB_RECALC_DATA);
/* XXX notifiers */
}
@@ -313,6 +317,20 @@ void undo_editmode_name(bContext *C, const char *undoname)
}
}
+/* undoname optionally, if NULL it just checks for existing undo steps */
+int undo_editmode_valid(const char *undoname)
+{
+ if(undoname) {
+ UndoElem *uel;
+
+ for(uel= undobase.last; uel; uel= uel->prev) {
+ if(strcmp(undoname, uel->name)==0)
+ break;
+ }
+ return uel != NULL;
+ }
+ return undobase.last != undobase.first;
+}
/* ************** for interaction with menu/pullown */
@@ -341,7 +359,7 @@ void undo_editmode_menu(bContext *C)
if(event>0) undo_number(C, event);
}
-static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
+static void do_editmode_undohistorymenu(bContext *C, void *UNUSED(arg), int event)
{
Object *obedit= CTX_data_edit_object(C);
@@ -351,7 +369,7 @@ static void do_editmode_undohistorymenu(bContext *C, void *arg, int event)
}
-uiBlock *editmode_undohistorymenu(bContext *C, ARegion *ar, void *arg_unused)
+uiBlock *editmode_undohistorymenu(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
UndoElem *uel;
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index 868aa8ac6af..6ae5963564e 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,7 @@
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
+#include "BLI_utildefines.h"
#include "WM_types.h"
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index e5128ea784a..c2f8ae16cb8 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,13 +36,15 @@
#include "DNA_object_types.h"
-#include "BKE_blender.h"
-#include "BKE_context.h"
-
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_dynstr.h"
+#include "BLI_utildefines.h"
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_screen.h"
#include "ED_armature.h"
#include "ED_particle.h"
@@ -58,12 +60,16 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "RNA_access.h"
+#include "RNA_define.h"
#include "util_intern.h"
+#define MAXUNDONAME 64 /* XXX, make common define */
+
/* ***************** generic undo system ********************* */
-void ED_undo_push(bContext *C, char *str)
+void ED_undo_push(bContext *C, const char *str)
{
wmWindowManager *wm= CTX_wm_manager(C);
Object *obedit= CTX_data_edit_object(C);
@@ -156,9 +162,10 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
if(do_glob_undo) {
if(U.uiflag & USER_GLOBALUNDO) {
-#ifndef DISABLE_PYTHON
+ // note python defines not valid here anymore.
+ //#ifdef WITH_PYTHON
// XXX BPY_scripts_clear_pyobjects();
-#endif
+ //#endif
if(undoname)
BKE_undo_name(C, undoname);
else
@@ -196,18 +203,73 @@ void ED_undo_pop_op(bContext *C, wmOperator *op)
ed_undo_step(C, 0, op->type->name);
}
-static int ed_undo_exec(bContext *C, wmOperator *op)
+/* name optionally, function used to check for operator redo panel */
+int ED_undo_valid(const bContext *C, const char *undoname)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ Object *obact= CTX_data_active_object(C);
+ ScrArea *sa= CTX_wm_area(C);
+
+ if(sa && sa->spacetype==SPACE_IMAGE) {
+ SpaceImage *sima= (SpaceImage *)sa->spacedata.first;
+
+ if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) || sima->flag & SI_DRAWTOOL) {
+ return 1;
+ }
+ }
+
+ if(sa && sa->spacetype==SPACE_TEXT) {
+ return 1;
+ }
+ else if(obedit) {
+ if ELEM7(obedit->type, OB_MESH, OB_FONT, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
+ return undo_editmode_valid(undoname);
+ }
+ }
+ else {
+
+ /* if below tests fail, global undo gets executed */
+
+ if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) {
+ if( ED_undo_paint_valid(UNDO_PAINT_IMAGE, undoname) )
+ return 1;
+ }
+ else if(obact && obact->mode & OB_MODE_SCULPT) {
+ if( ED_undo_paint_valid(UNDO_PAINT_MESH, undoname) )
+ return 1;
+ }
+ else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) {
+ return PE_undo_valid(CTX_data_scene(C));
+ }
+
+ if(U.uiflag & USER_GLOBALUNDO) {
+ return BKE_undo_valid(undoname);
+ }
+ }
+ return 0;
+}
+
+static int ed_undo_exec(bContext *C, wmOperator *UNUSED(op))
{
/* "last operator" should disappear, later we can tie ths with undo stack nicer */
WM_operator_stack_clear(C);
return ed_undo_step(C, 1, NULL);
}
-static int ed_redo_exec(bContext *C, wmOperator *op)
+static int ed_undo_push_exec(bContext *C, wmOperator *op)
+{
+ char str[MAXUNDONAME];
+ RNA_string_get(op->ptr, "message", str);
+ ED_undo_push(C, str);
+ return OPERATOR_FINISHED;
+}
+
+static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op))
{
return ed_undo_step(C, -1, NULL);
}
+#if 0 /* UNUSED */
void ED_undo_menu(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
@@ -232,6 +294,7 @@ void ED_undo_menu(bContext *C)
}
}
}
+#endif
/* ********************** */
@@ -247,6 +310,19 @@ void ED_OT_undo(wmOperatorType *ot)
ot->poll= ED_operator_screenactive;
}
+void ED_OT_undo_push(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Undo Push";
+ ot->description= "Add an undo state (internal use only)";
+ ot->idname= "ED_OT_undo_push";
+
+ /* api callbacks */
+ ot->exec= ed_undo_push_exec;
+
+ RNA_def_string(ot->srna, "message", "Add an undo step *function may be moved*", MAXUNDONAME, "Undo Message", "");
+}
+
void ED_OT_redo(wmOperatorType *ot)
{
/* identifiers */
@@ -260,3 +336,53 @@ void ED_OT_redo(wmOperatorType *ot)
}
+/* ui callbacks should call this rather then calling WM_operator_repeat() themselves */
+int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
+{
+ int ret= 0;
+
+ if(op) {
+ ARegion *ar= CTX_wm_region(C);
+ ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
+
+ if(ar1)
+ CTX_wm_region_set(C, ar1);
+
+ if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) {
+ int retval;
+
+ if (G.f & G_DEBUG)
+ printf("redo_cb: operator redo %s\n", op->type->name);
+ ED_undo_pop_op(C, op);
+ retval= WM_operator_repeat(C, op);
+ if((retval & OPERATOR_FINISHED)==0) {
+ if (G.f & G_DEBUG)
+ printf("redo_cb: operator redo failed: %s, return %d\n", op->type->name, retval);
+ ED_undo_redo(C);
+ }
+ else {
+ ret= 1;
+ }
+ }
+
+ /* set region back */
+ CTX_wm_region_set(C, ar);
+ }
+ else {
+ if (G.f & G_DEBUG) {
+ printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ }
+ }
+
+ return ret;
+}
+
+void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
+{
+ ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}
+
+void ED_undo_operator_repeat_cb_evt(bContext *C, void *arg_op, int UNUSED(arg_event))
+{
+ ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}
diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h
index 73675ab4ef9..c448377f6b0 100644
--- a/source/blender/editors/util/util_intern.h
+++ b/source/blender/editors/util/util_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
/* editmode_undo.c */
void undo_editmode_clear(void);
void undo_editmode_name(bContext *C, const char *undoname);
+int undo_editmode_valid(const char *undoname);
#endif /* ED_UTIL_INTERN_H */
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt
index bb6caece99f..b9e718b3e7d 100644
--- a/source/blender/editors/uvedit/CMakeLists.txt
+++ b/source/blender/editors/uvedit/CMakeLists.txt
@@ -19,18 +19,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
+ ../include
../../blenkernel
+ ../../blenloader
../../blenlib
../../bmesh
- ../include
- ../../../../intern/guardedalloc
- ../../../../intern/opennl/extern
../../makesdna
../../makesrna
../../windowmanager
+ ../../../../intern/guardedalloc
+ ../../../../intern/opennl/extern
+)
+
+set(SRC
+ uvedit_draw.c
+ uvedit_ops.c
+ uvedit_parametrizer.c
+ uvedit_unwrap_ops.c
+
+ uvedit_intern.h
+ uvedit_parametrizer.h
)
-BLENDERLIB(bf_editor_uvedit "${SRC}" "${INC}")
+blender_add_lib(bf_editor_uvedit "${SRC}" "${INC}")
diff --git a/source/blender/editors/uvedit/Makefile b/source/blender/editors/uvedit/Makefile
deleted file mode 100644
index e4b9ae72ccb..00000000000
--- a/source/blender/editors/uvedit/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2007 Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-LIBNAME = ed_uvedit
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-# not very neat....
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-
-# own include
-
-CPPFLAGS += -I../include
-
diff --git a/source/blender/editors/uvedit/SConscript b/source/blender/editors/uvedit/SConscript
index 9926eb0c7ea..3e8c3851962 100644
--- a/source/blender/editors/uvedit/SConscript
+++ b/source/blender/editors/uvedit/SConscript
@@ -5,6 +5,10 @@ sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
+<<<<<<< .working
incs += ' ../../makesrna #/intern/opennl/extern ../../gpu ../../bmesh'
+=======
+incs += ' ../../makesrna #/intern/opennl/extern ../../gpu ../../blenloader'
+>>>>>>> .merge-right.r35190
env.BlenderLib ( 'bf_editors_uvedit', sources, Split(incs), [], libtype=['core'], priority=[45] )
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 6e10fe526da..04a6cf5c5b0 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,20 +39,23 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "BLI_math.h"
+#include "BLI_editVert.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_mesh.h"
-#include "BKE_utildefines.h"
#include "BKE_tessmesh.h"
-#include "BLI_math.h"
-#include "BLI_editVert.h"
#include "BLI_array.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "ED_util.h"
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_uvedit.h"
#include "UI_resources.h"
@@ -119,7 +122,7 @@ static int draw_uvs_face_check(Scene *scene)
return (ts->uv_selectmode == UV_SELECT_FACE);
}
-static void draw_uvs_shadow(SpaceImage *sima, Object *obedit)
+static void draw_uvs_shadow(Object *obedit)
{
BMEditMesh *em;
BMFace *efa;
@@ -421,7 +424,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
}
}
-static void draw_uvs_other(SpaceImage *sima, Scene *scene, Object *obedit, MTexPoly *activetf)
+static void draw_uvs_other(Scene *scene, Object *obedit, MTexPoly *activetf)
{
Base *base;
Image *curimage;
@@ -474,9 +477,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
MTexPoly *tf, *activetf = NULL;
MLoopUV *luv;
DerivedMesh *finaldm, *cagedm;
- char col1[4], col2[4];
+ unsigned char col1[4], col2[4];
float pointsize;
- int drawfaces, interpedges, lastsel, sel;
+ int drawfaces, interpedges;
int i;
Image *ima= sima->image;
@@ -493,7 +496,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
/* draw other uvs */
if(sima->flag & SI_DRAW_OTHER)
- draw_uvs_other(sima, scene, obedit, activetf);
+ draw_uvs_other(scene, obedit, activetf);
/* 1. draw shadow mesh */
@@ -676,8 +679,8 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glColor4ubv((unsigned char *)col2);
if(me->drawflag & ME_DRAWEDGES) {
+ int lastsel= 0, sel;
UI_GetThemeColor4ubv(TH_VERTEX_SELECT, col1);
- lastsel = sel = 0;
if(interpedges) {
glShadeModel(GL_SMOOTH);
@@ -857,7 +860,7 @@ void draw_uvedit_main(SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedi
if(show_uvedit || show_uvshadow) {
if(show_uvshadow)
- draw_uvs_shadow(sima, obedit);
+ draw_uvs_shadow(obedit);
else
draw_uvs(sima, scene, obedit);
diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h
index dedde856d4e..276dc4cef12 100644
--- a/source/blender/editors/uvedit/uvedit_intern.h
+++ b/source/blender/editors/uvedit/uvedit_intern.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,9 +41,6 @@ struct BMLoop;
struct BMEdge;
struct BMVert;
-#define UV_SELECT_ALL 1
-#define UV_SELECT_PINNED 2
-
/* id can be from 0 to 3 */
#define TF_PIN_MASK(id) (TF_PIN1 << id)
#define TF_SEL_MASK(id) (TF_SEL1 << id)
@@ -51,17 +48,6 @@ struct BMVert;
/* visibility and selection */
int uvedit_face_visible_nolocal(struct Scene *scene, struct BMFace *efa);
-/*all the uvedit_xxxx_[de]selected functions are
- declared in ED_uvedit.h*/
-int uvedit_face_select(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-int uvedit_face_deselect(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-
-void uvedit_edge_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_edge_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-
-void uvedit_uv_select(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-
/* geometric utilities */
void uv_center(float uv[][2], float cent[2], int quad);
float uv_area(float uv[][2], int quad);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 946428d9baf..a5d11d6796a 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,6 +44,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
@@ -56,6 +57,7 @@
#include "ED_image.h"
#include "ED_mesh.h"
+#include "ED_uvedit.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -141,12 +143,12 @@ void ED_uvedit_assign_image(Scene *scene, Object *obedit, Image *ima, Image *pre
/* and update depdency graph */
if(update)
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
}
/* dotile - 1, set the tile flag (from the space image)
* 2, set the tile index for the faces. */
-void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, int curtile)
+static int uvedit_set_tile(Object *obedit, Image *ima, int curtile)
{
BMEditMesh *em;
BMFace *efa;
@@ -155,11 +157,14 @@ void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, i
/* verify if we have something to do */
if(!ima || !ED_uvedit_test(obedit))
- return;
-
+ return 0;
+
+ if((ima->tpageflag & IMA_TILES) == 0)
+ return 0;
+
/* skip assigning these procedural images... */
if(ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE)
- return;
+ return 0;
em= ((Mesh*)obedit->data)->edit_btmesh;
@@ -170,8 +175,9 @@ void ED_uvedit_set_tile(bContext *C, Scene *scene, Object *obedit, Image *ima, i
tf->tile= curtile; /* set tile index */
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ DAG_id_tag_update(obedit->data, 0);
+
+ return 1;
}
/*********************** space conversion *********************/
@@ -277,7 +283,7 @@ int uvedit_edge_selected(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
return BM_TestHFlag(l->f, BM_SELECT);
else if(ts->selectmode == SCE_SELECT_EDGE) {
return BM_TestHFlag(l->e, BM_SELECT);
@@ -301,9 +307,9 @@ void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
BM_Select(em->bm, l->f, 1);
- else if(ts->selectmode == SCE_SELECT_EDGE)
+ else if(ts->selectmode & SCE_SELECT_EDGE)
BM_Select(em->bm, l->e, 1);
else {
BM_Select(em->bm, l->e->v1, 1);
@@ -327,9 +333,9 @@ void uvedit_edge_deselect(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
BM_Select(em->bm, l->f, 0);
- else if(ts->selectmode == SCE_SELECT_EDGE)
+ else if(ts->selectmode & SCE_SELECT_EDGE)
BM_Select(em->bm, l->e, 0);
else {
BM_Select(em->bm, l->e->v1, 0);
@@ -352,7 +358,7 @@ int uvedit_uv_selected(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
return BM_TestHFlag(l->f, BM_SELECT);
else
return BM_TestHFlag(l, BM_SELECT);
@@ -369,7 +375,7 @@ void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
BM_Select(em->bm, l->f, 1);
else
BM_Select(em->bm, l->v, 1);
@@ -386,7 +392,7 @@ void uvedit_uv_deselect(BMEditMesh *em, Scene *scene, BMLoop *l)
ToolSettings *ts= scene->toolsettings;
if(ts->uv_flag & UV_SYNC_SELECTION) {
- if(ts->selectmode == SCE_SELECT_FACE)
+ if(ts->selectmode & SCE_SELECT_FACE)
BM_Select(em->bm, l->f, 0);
else
BM_Select(em->bm, l->v, 0);
@@ -504,7 +510,7 @@ int ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float *min, float
return sel;
}
-int uvedit_center(Scene *scene, Image *ima, Object *obedit,
+static int uvedit_center(Scene *scene, Image *ima, Object *obedit,
float *cent, int mode)
{
BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
@@ -1084,7 +1090,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
i = 0;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- /* make_uv_vert_map_EM sets verts tmp.l to the indicies */
+ /* make_uv_vert_map_EM sets verts tmp.l to the indices */
vlist= EDBM_get_uv_map_vert(vmap, BMINDEX_GET(l->v));
startv= vlist;
@@ -1246,7 +1252,7 @@ static void weld_align_uv(bContext *C, int tool)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
@@ -1257,7 +1263,7 @@ static int align_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_align(wmOperatorType *ot)
+static void UV_OT_align(wmOperatorType *ot)
{
static EnumPropertyItem axis_items[] = {
{'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"},
@@ -1281,14 +1287,14 @@ void UV_OT_align(wmOperatorType *ot)
/* ******************** weld operator **************** */
-static int weld_exec(bContext *C, wmOperator *op)
+static int weld_exec(bContext *C, wmOperator *UNUSED(op))
{
weld_align_uv(C, 'w');
return OPERATOR_FINISHED;
}
-void UV_OT_weld(wmOperatorType *ot)
+static void UV_OT_weld(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Weld";
@@ -1311,7 +1317,6 @@ typedef struct UVVertAverage {
static int stitch_exec(bContext *C, wmOperator *op)
{
- SpaceImage *sima;
Scene *scene;
Object *obedit;
BMEditMesh *em;
@@ -1320,10 +1325,10 @@ static int stitch_exec(bContext *C, wmOperator *op)
BMIter iter, liter;
BMVert *eve;
Image *ima;
+ SpaceImage *sima= CTX_wm_space_image(C);
MTexPoly *tf;
MLoopUV *luv;
-
- sima= CTX_wm_space_image(C);
+
scene= CTX_data_scene(C);
obedit= CTX_data_edit_object(C);
em= ((Mesh*)obedit->data)->edit_btmesh;
@@ -1450,13 +1455,13 @@ static int stitch_exec(bContext *C, wmOperator *op)
MEM_freeN(uv_average);
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
-void UV_OT_stitch(wmOperatorType *ot)
+static void UV_OT_stitch(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Stitch";
@@ -1475,7 +1480,7 @@ void UV_OT_stitch(wmOperatorType *ot)
/* ******************** (de)select all operator **************** */
-static int select_inverse_exec(bContext *C, wmOperator *op)
+static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene;
ToolSettings *ts;
@@ -1516,7 +1521,7 @@ static int select_inverse_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_select_inverse(wmOperatorType *ot)
+static void UV_OT_select_inverse(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Inverse";
@@ -1597,12 +1602,8 @@ static int select_all_exec(bContext *C, wmOperator *op)
continue;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- char select_flag;
-
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- select_flag = luv->flag & MLOOPUV_VERTSEL;
-
switch (action) {
case SEL_SELECT:
luv->flag |= MLOOPUV_VERTSEL;
@@ -1623,7 +1624,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_select_all(wmOperatorType *ot)
+static void UV_OT_select_all(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select or Deselect All";
@@ -1934,7 +1935,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
}
}
#endif
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_PASS_THROUGH|OPERATOR_FINISHED;
@@ -1967,7 +1968,7 @@ static int select_invoke(bContext *C, wmOperator *op, wmEvent *event)
return select_exec(C, op);
}
-void UV_OT_select(wmOperatorType *ot)
+static void UV_OT_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select";
@@ -2016,7 +2017,7 @@ static int select_loop_invoke(bContext *C, wmOperator *op, wmEvent *event)
return select_loop_exec(C, op);
}
-void UV_OT_select_loop(wmOperatorType *ot)
+static void UV_OT_select_loop(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Loop Select";
@@ -2084,7 +2085,7 @@ static int select_linked_internal(bContext *C, wmOperator *op, wmEvent *event, i
select_linked(scene, ima, em, limit, hit_p, extend);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -2095,7 +2096,7 @@ static int select_linked_exec(bContext *C, wmOperator *op)
return select_linked_internal(C, op, NULL, 0);
}
-void UV_OT_select_linked(wmOperatorType *ot)
+static void UV_OT_select_linked(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked";
@@ -2122,7 +2123,7 @@ static int select_linked_pick_exec(bContext *C, wmOperator *op)
return select_linked_internal(C, op, NULL, 1);
}
-void UV_OT_select_linked_pick(wmOperatorType *ot)
+static void UV_OT_select_linked_pick(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Select Linked Pick";
@@ -2187,13 +2188,13 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
}
-void UV_OT_unlink_selection(wmOperatorType *ot)
+static void UV_OT_unlink_selection(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Unlink Selection";
@@ -2451,7 +2452,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-void UV_OT_select_border(wmOperatorType *ot)
+static void UV_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Border Select";
@@ -2475,9 +2476,8 @@ void UV_OT_select_border(wmOperatorType *ot)
/* ******************** circle select operator **************** */
-static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *sima,
- Scene *scene, int select, float *offset,
- float *ell, BMLoop *l, MLoopUV *luv)
+static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *sima, Scene *scene, int select,
+ float *offset, float *ell, BMLoop *l, MLoopUV *luv)
{
/* normalized ellipse: ell[0] = scaleX, ell[1] = scaleY */
float x, y, r2, *uv;
@@ -2495,7 +2495,7 @@ static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *sima,
}
}
-int circle_select_exec(bContext *C, wmOperator *op)
+static int circle_select_exec(bContext *C, wmOperator *op)
{
SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
@@ -2544,7 +2544,7 @@ int circle_select_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_circle_select(wmOperatorType *ot)
+static void UV_OT_circle_select(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Circle Select";
@@ -2614,7 +2614,7 @@ static int snap_cursor_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_snap_cursor(wmOperatorType *ot)
+static void UV_OT_snap_cursor(wmOperatorType *ot)
{
static EnumPropertyItem target_items[] = {
{0, "PIXELS", 0, "Pixels", ""},
@@ -2683,7 +2683,7 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe
BMINDEX_SET(eve, -1);
/* index every vert that has a selected UV using it, but only once so as to
- * get unique indicies and to count how much to malloc */
+ * get unique indices and to count how much to malloc */
BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if(!uvedit_face_visible(scene, ima, efa, tface)) {
@@ -2815,13 +2815,13 @@ static int snap_selection_exec(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
-void UV_OT_snap_selection(wmOperatorType *ot)
+static void UV_OT_snap_selection(wmOperatorType *ot)
{
static EnumPropertyItem target_items[] = {
{0, "PIXELS", 0, "Pixels", ""},
@@ -2881,7 +2881,7 @@ static int pin_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_pin(wmOperatorType *ot)
+static void UV_OT_pin(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Pin";
@@ -2899,7 +2899,7 @@ void UV_OT_pin(wmOperatorType *ot)
/******************* select pinned operator ***************/
-static int select_pinned_exec(bContext *C, wmOperator *op)
+static int select_pinned_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -2929,7 +2929,7 @@ static int select_pinned_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_select_pinned(wmOperatorType *ot)
+static void UV_OT_select_pinned(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Selected Pinned";
@@ -2957,6 +2957,7 @@ static int hide_exec(bContext *C, wmOperator *op)
MTexPoly *tf;
MLoopUV *luv;
int swap= RNA_boolean_get(op->ptr, "unselected");
+ int facemode= sima ? sima->flag & SI_SELACTFACE : 0;
if(ts->uv_flag & UV_SYNC_SELECTION) {
EDBM_hide_mesh(em, swap);
@@ -2981,15 +2982,39 @@ static int hide_exec(bContext *C, wmOperator *op)
hide = !hide;
if (hide) {
- BM_Select(em->bm, efa, 0);
- uvedit_face_deselect(scene, em, efa);
+ if (facemode) {
+ /*check that every UV is selected*/
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ if (!(luv->flag & MLOOPUV_VERTSEL))
+ break;
+ }
+
+ if (!luv) {
+ BM_Select(em->bm, efa, 0);
+ uvedit_face_deselect(scene, em, efa);
+ }
+ } else if(em->selectmode == SCE_SELECT_FACE) {
+ /*check if a UV is selected*/
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ BM_Select(em->bm, efa, 0);
+ }
+ luv->flag &= ~MLOOPUV_VERTSEL;
+ }
+ } else {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ if (luv->flag & MLOOPUV_VERTSEL) {
+ BM_Select(em->bm, l->v, 0);
+ luv->flag &= ~MLOOPUV_VERTSEL;
+ }
+ }
+ }
}
}
- ///*deselects too many but ok for now*/
- //if(em->selectmode & (SCE_SELECT_EDGE|SCE_SELECT_VERTEX))
- // EM_deselect_flush(em);
-
EDBM_validate_selections(em);
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
@@ -2997,7 +3022,7 @@ static int hide_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_hide(wmOperatorType *ot)
+static void UV_OT_hide(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Hide Selected";
@@ -3015,7 +3040,7 @@ void UV_OT_hide(wmOperatorType *ot)
/****************** reveal operator ******************/
-static int reveal_exec(bContext *C, wmOperator *op)
+static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
{
SpaceImage *sima= CTX_wm_space_image(C);
ToolSettings *ts= CTX_data_tool_settings(C);
@@ -3061,7 +3086,7 @@ static int reveal_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-void UV_OT_reveal(wmOperatorType *ot)
+static void UV_OT_reveal(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Reveal Hidden";
@@ -3081,6 +3106,9 @@ static int set_2d_cursor_exec(bContext *C, wmOperator *op)
SpaceImage *sima = CTX_wm_space_image(C);
float location[2];
+ if(!sima)
+ return OPERATOR_CANCELLED;
+
RNA_float_get_array(op->ptr, "location", location);
sima->cursor[0]= location[0];
sima->cursor[1]= location[1];
@@ -3104,7 +3132,7 @@ static int set_2d_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event)
return set_2d_cursor_exec(C, op);
}
-void UV_OT_cursor_set(wmOperatorType *ot)
+static void UV_OT_cursor_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set 2D Cursor";
@@ -3129,16 +3157,18 @@ static int set_tile_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
int tile[2];
-
- if(!ima || !(ima->tpageflag & IMA_TILES))
- return OPERATOR_CANCELLED;
+ Object *obedit= CTX_data_edit_object(C);
RNA_int_get_array(op->ptr, "tile", tile);
- ED_uvedit_set_tile(C, CTX_data_scene(C), CTX_data_edit_object(C), ima, tile[0] + ima->xrep*tile[1]);
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL);
+ if(uvedit_set_tile(obedit, ima, tile[0] + ima->xrep*tile[1])) {
+ WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_IMAGE, NULL);
- return OPERATOR_FINISHED;
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_CANCELLED;
}
static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -3170,7 +3200,7 @@ static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event)
return set_tile_exec(C, op);
}
-void UV_OT_tile_set(wmOperatorType *ot)
+static void UV_OT_tile_set(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Set Tile";
@@ -3232,6 +3262,7 @@ void ED_operatortypes_uvedit(void)
void ED_keymap_uvedit(wmKeyConfig *keyconf)
{
wmKeyMap *keymap;
+ wmKeyMapItem *kmi;
keymap= WM_keymap_find(keyconf, "UV Editor", 0, 0);
keymap->poll= ED_operator_uvedit;
@@ -3282,6 +3313,20 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf)
/* menus */
WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_snap", SKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_select_mode", TABKEY, KM_PRESS, KM_CTRL, 0);
+
+ /* pivot */
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "CENTER");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", COMMAKEY, KM_PRESS, KM_CTRL, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "MEDIAN");
+
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_set_enum", PERIODKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.uv_editor.pivot_point");
+ RNA_string_set(kmi->ptr, "value", "CURSOR");
ED_object_generic_keymap(keyconf, keymap, 2);
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 4ab04520582..524706fe42d 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -6,8 +6,9 @@
#include "BLI_rand.h"
#include "BLI_heap.h"
#include "BLI_boxpack2d.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "ONL_opennl.h"
@@ -3737,7 +3738,7 @@ static void p_smooth(PChart *chart)
int j, it2, maxiter2, it;
int nedges = chart->nedges, nwheel, gridx, gridy;
int edgesx, edgesy, nsize, esize, i, x, y, maxiter, totiter;
- float minv[2], maxv[2], median, invmedian, distortion, avglen2d, avglen3d;
+ float minv[2], maxv[2], median, invmedian, avglen2d, avglen3d;
float center[2], dx, dy, *nodes, dlimit, d, *oldnodesx, *oldnodesy;
float *nodesx, *nodesy, *hedges, *vedges, climit, moved, padding;
SmoothTriangle *triangles, *t, *t2, **tri, **trip;
@@ -3756,7 +3757,6 @@ static void p_smooth(PChart *chart)
invmedian = 1.0/median;
/* compute edge distortion */
- distortion = 0.0;
avglen2d = avglen3d = 0.0;
for (e=chart->edges; e; e=e->nextlink) {
@@ -4044,7 +4044,7 @@ static void p_smooth(PChart *chart)
/* Exported */
-ParamHandle *param_construct_begin()
+ParamHandle *param_construct_begin(void)
{
PHandle *handle = MEM_callocN(sizeof*handle, "PHandle");
handle->construction_chart = p_chart_new(handle);
@@ -4362,7 +4362,7 @@ void param_pack(ParamHandle *handle, float margin)
}
if(margin>0.0f) {
- /* multiply the margin by the area to give pradictable results not dependant on UV scale,
+ /* multiply the margin by the area to give predictable results not dependant on UV scale,
* ...Without using the area running pack multiple times also gives a bad feedback loop.
* multiply by 0.1 so the margin value from the UI can be from 0.0 to 1.0 but not give a massive margin */
margin = (margin*(float)area) * 0.1;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 912270da9ca..92ec80987e5 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -26,7 +26,7 @@ typedef enum ParamBool {
- output will be written to the uv pointers
*/
-ParamHandle *param_construct_begin();
+ParamHandle *param_construct_begin(void);
void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index d67dc77cfec..57264e2cd5c 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,12 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "BLI_math.h"
+#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
+#include "BLI_uvproject.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
@@ -129,7 +135,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
/****************** Parametrizer Conversion ***************/
-ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
+static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
short implicit, short fill, short sel,
short correct_aspect)
{
@@ -158,7 +164,7 @@ ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
}
}
- /* we need the vert indicies */
+ /* we need the vert indices */
a = 0;
BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
BMINDEX_SET(ev, a);
@@ -213,7 +219,7 @@ ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
BLI_addfilledge(firstv, v);
/*mode 2 enables shortest-diagonal for quads*/
- BLI_edgefill(2, 0);
+ BLI_edgefill(0);
for (sefa = fillfacebase.first; sefa; sefa=sefa->next) {
ls[0] = sefa->v1->tmp.p;
ls[1] = sefa->v2->tmp.p;
@@ -323,7 +329,7 @@ static void minimize_stretch_iteration(bContext *C, wmOperator *op, int interact
ms->lasttime = PIL_check_seconds_timer();
- DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ms->obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
}
}
@@ -346,7 +352,7 @@ static void minimize_stretch_exit(bContext *C, wmOperator *op, int cancel)
param_stretch_end(ms->handle);
param_delete(ms->handle);
- DAG_id_flush_update(ms->obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(ms->obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, ms->obedit->data);
MEM_freeN(ms);
@@ -367,7 +373,7 @@ static int minimize_stretch_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int minimize_stretch_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int minimize_stretch_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
MinStretch *ms;
@@ -462,7 +468,7 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
/* ******************** Pack Islands operator **************** */
-static int pack_islands_exec(bContext *C, wmOperator *op)
+static int pack_islands_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -474,7 +480,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -494,7 +500,7 @@ void UV_OT_pack_islands(wmOperatorType *ot)
/* ******************** Average Islands Scale operator **************** */
-static int average_islands_scale_exec(bContext *C, wmOperator *op)
+static int average_islands_scale_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -506,7 +512,7 @@ static int average_islands_scale_exec(bContext *C, wmOperator *op)
param_flush(handle);
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -531,7 +537,7 @@ static ParamHandle *liveHandle = NULL;
void ED_uvedit_live_unwrap_begin(Scene *scene, Object *obedit)
{
BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
- short abf = scene->toolsettings->unwrapper == 1;
+ short abf = scene->toolsettings->unwrapper == 0;
short fillholes = scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES;
if(!ED_uvedit_test(obedit)) {
@@ -852,6 +858,9 @@ static int unwrap_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ /* remember last method for live unwrap */
+ scene->toolsettings->unwrapper = method;
+
handle= construct_param_handle(scene, em, 0, fill_holes, 1, correct_aspect);
param_lscm_begin(handle, PARAM_FALSE, method == 0);
@@ -864,7 +873,7 @@ static int unwrap_exec(bContext *C, wmOperator *op)
param_delete(handle);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -964,7 +973,7 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -998,7 +1007,7 @@ void UV_OT_from_view(wmOperatorType *ot)
/********************** Reset operator ********************/
-static int reset_exec(bContext *C, wmOperator *op)
+static int reset_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
@@ -1066,7 +1075,7 @@ static int reset_exec(bContext *C, wmOperator *op)
}
}
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
BLI_array_free(uvs);
@@ -1171,7 +1180,7 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1244,7 +1253,7 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
@@ -1329,7 +1338,7 @@ static int cube_project_exec(bContext *C, wmOperator *op)
uv_map_clip_correct(em, op);
- DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+ DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 126cddf852f..c79206a5641 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -24,17 +24,36 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
+set(INC
+ .
+ ../blenlib
+ ../blenkernel
+ ../blenloader
+ ../imbuf
+ ../makesdna
+ ../makesrna
+ ../../../extern/glew/include
+ ../../../intern/guardedalloc
+ ../../../intern/smoke/extern
+)
-SET(INC
- . ../blenlib ../blenkernel ../makesdna ../makesrna ../include
- ../../../extern/glew/include ../../../intern/guardedalloc ../../../intern/smoke/extern ../imbuf)
+set(SRC
+ intern/gpu_buffers.c
+ intern/gpu_codegen.c
+ intern/gpu_draw.c
+ intern/gpu_extensions.c
+ intern/gpu_material.c
+ intern/gpu_shader_material.glsl.c
+ intern/gpu_shader_vertex.glsl.c
-IF(WIN32)
- INCLUDE_DIRECTORIES(${PTHREADS_INC})
-ENDIF(WIN32)
+ GPU_buffers.h
+ GPU_draw.h
+ GPU_extensions.h
+ GPU_material.h
+ intern/gpu_codegen.h
+)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_gpu "${SRC}" "${INC}")
+blender_add_lib(bf_gpu "${SRC}" "${INC}")
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 6f552e087d7..7ce166d92bd 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPU_buffers.h
+ * \ingroup gpu
+ */
+
#ifndef __GPU_BUFFERS_H__
#define __GPU_BUFFERS_H__
@@ -69,6 +73,8 @@ typedef struct GPUBuffer
unsigned int id; /* used with vertex buffer objects */
} GPUBuffer;
+/* stores deleted buffers so that new buffers wouldn't have to
+be recreated that often. */
typedef struct GPUBufferPool
{
int size; /* number of allocated buffers stored */
@@ -114,6 +120,7 @@ typedef struct GPUDrawObject
} GPUDrawObject;
+/* used for GLSL materials */
typedef struct GPUAttrib
{
int index;
@@ -121,7 +128,7 @@ typedef struct GPUAttrib
int type;
} GPUAttrib;
-GPUBufferPool *GPU_buffer_pool_new();
+GPUBufferPool *GPU_buffer_pool_new(void);
void GPU_buffer_pool_free( GPUBufferPool *pool );
void GPU_buffer_pool_free_unused( GPUBufferPool *pool );
@@ -171,8 +178,9 @@ void GPU_color_switch( int mode );
void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
/* called after drawing */
-void GPU_buffer_unbind();
+void GPU_buffer_unbind(void);
+/* used to check whether to use the old (without buffers) code */
int GPU_buffer_legacy( struct DerivedMesh *dm );
#endif
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 92bf43e9a5a..18a6f1ba73d 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPU_draw.h
+ * \ingroup gpu
+ */
+
#ifndef GPU_GAME_H
#define GPU_GAME_H
@@ -114,7 +118,7 @@ void GPU_paint_set_mipmap(int mipmap);
void GPU_paint_update_image(struct Image *ima, int x, int y, int w, int h, int mipmap);
void GPU_update_images_framechange(void);
int GPU_update_image_time(struct Image *ima, double time);
-int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap);
+int GPU_verify_image(struct Image *ima, struct ImageUser *iuser, int tftile, int compare, int mipmap);
void GPU_free_image(struct Image *ima);
void GPU_free_images(void);
void GPU_free_images_anim(void);
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index a7f43d3b0ae..90c99257087 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPU_extensions.h
+ * \ingroup gpu
+ */
+
#ifndef GPU_EXTENSIONS_H
#define GPU_EXTENSIONS_H
@@ -57,7 +61,7 @@ typedef struct GPUShader GPUShader;
void GPU_extensions_disable(void);
void GPU_extensions_init(void); /* call this before running any of the functions below */
void GPU_extensions_exit(void);
-int GPU_print_error(char *str);
+int GPU_print_error(const char *str);
int GPU_glsl_support(void);
int GPU_non_power_of_two_support(void);
@@ -130,19 +134,20 @@ int GPU_texture_opengl_height(GPUTexture *tex);
- after any of the GPU_framebuffer_* functions, GPU_framebuffer_restore must
be called before rendering to the window framebuffer again */
-GPUFrameBuffer *GPU_framebuffer_create();
+GPUFrameBuffer *GPU_framebuffer_create(void);
int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_free(GPUFrameBuffer *fb);
-void GPU_framebuffer_restore();
+void GPU_framebuffer_restore(void);
/* GPU OffScreen
- - wrapper around framebuffer and texture for simple offscreen drawing */
+ - wrapper around framebuffer and texture for simple offscreen drawing
+ - changes size if graphics card can't support it */
-GPUOffScreen *GPU_offscreen_create(int width, int height);
+GPUOffScreen *GPU_offscreen_create(int *width, int *height);
void GPU_offscreen_free(GPUOffScreen *ofs);
void GPU_offscreen_bind(GPUOffScreen *ofs);
void GPU_offscreen_unbind(GPUOffScreen *ofs);
@@ -156,9 +161,9 @@ GPUShader *GPU_shader_create(const char *vertexcode, const char *fragcode, const
void GPU_shader_free(GPUShader *shader);
void GPU_shader_bind(GPUShader *shader);
-void GPU_shader_unbind();
+void GPU_shader_unbind(GPUShader *shader);
-int GPU_shader_get_uniform(GPUShader *shader, char *name);
+int GPU_shader_get_uniform(GPUShader *shader, const char *name);
void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
int arraysize, float *value);
void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex);
diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h
index 02a2c3c7bf4..1d50c0586a0 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPU_material.h
+ * \ingroup gpu
+ */
+
#ifndef __GPU_MATERIAL__
#define __GPU_MATERIAL__
@@ -93,7 +97,7 @@ typedef enum GPUBlendMode {
typedef struct GPUNodeStack {
GPUType type;
- char *name;
+ const char *name;
float vec[4];
struct GPUNodeLink *link;
short hasinput;
@@ -101,7 +105,7 @@ typedef struct GPUNodeStack {
short sockettype;
} GPUNodeStack;
-GPUNodeLink *GPU_attribute(int type, char *name);
+GPUNodeLink *GPU_attribute(int type, const char *name);
GPUNodeLink *GPU_uniform(float *num);
GPUNodeLink *GPU_dynamic_uniform(float *num);
GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser);
@@ -110,8 +114,8 @@ GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex);
GPUNodeLink *GPU_socket(GPUNodeStack *sock);
GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
-int GPU_link(GPUMaterial *mat, char *name, ...);
-int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
+int GPU_link(GPUMaterial *mat, const char *name, ...);
+int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...);
void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
void GPU_material_enable_alpha(GPUMaterial *material);
@@ -122,7 +126,7 @@ GPUBlendMode GPU_material_blend_mode(GPUMaterial *material, float obcol[4]);
GPUMaterial *GPU_material_from_blender(struct Scene *scene, struct Material *ma);
void GPU_material_free(struct Material *ma);
-void GPU_materials_free();
+void GPU_materials_free(void);
void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
diff --git a/source/blender/gpu/Makefile b/source/blender/gpu/Makefile
deleted file mode 100644
index eaa8a69bfdd..00000000000
--- a/source/blender/gpu/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-# Makes module object directory and bounces make to subdirectories.
-
-SOURCEDIR = source/blender/gpu
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript
index 4f1cdc2ce76..515c7166c2a 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
defs = [ 'GLEW_STATIC' ]
-incs = '../blenlib ../blenkernel ../makesdna ../include'
+incs = '../blenlib ../blenkernel ../makesdna ../include ../blenloader'
incs += ' #/extern/glew/include #intern/guardedalloc #intern/smoke/extern ../imbuf .'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
diff --git a/source/blender/gpu/intern/Makefile b/source/blender/gpu/intern/Makefile
deleted file mode 100644
index 088b56edbab..00000000000
--- a/source/blender/gpu/intern/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-
-LIBNAME = gpu
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-ifeq ($(OS),$(findstring $(OS), "darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I$(NAN_SMOKE)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I../
-
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 524c05fdc73..7d45640da63 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,8 +38,9 @@
#include "MEM_guardedalloc.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "BLI_threads.h"
#include "DNA_meshdata_types.h"
@@ -58,13 +59,16 @@
#define MAX_GPU_ATTRIB_DATA 32
+/* material number is an 16-bit short and the range of short is from -16383 to 16383 (assume material number is non-negative) */
+#define MAX_MATERIALS 16384
+
/* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
-int useVBOs = -1;
-GPUBufferPool *globalPool = 0;
-int GLStates = 0;
-GPUAttrib attribData[MAX_GPU_ATTRIB_DATA] = { { -1, 0, 0 } };
+static int useVBOs = -1;
+static GPUBufferPool *globalPool = 0;
+static int GLStates = 0;
+static GPUAttrib attribData[MAX_GPU_ATTRIB_DATA] = { { -1, 0, 0 } };
-GPUBufferPool *GPU_buffer_pool_new()
+GPUBufferPool *GPU_buffer_pool_new(void)
{
GPUBufferPool *pool;
@@ -88,7 +92,7 @@ GPUBufferPool *GPU_buffer_pool_new()
return pool;
}
-void GPU_buffer_pool_remove( int index, GPUBufferPool *pool )
+static void GPU_buffer_pool_remove( int index, GPUBufferPool *pool )
{
int i;
@@ -107,7 +111,7 @@ void GPU_buffer_pool_remove( int index, GPUBufferPool *pool )
pool->size--;
}
-void GPU_buffer_pool_delete_last( GPUBufferPool *pool )
+static void GPU_buffer_pool_delete_last( GPUBufferPool *pool )
{
int last;
@@ -241,7 +245,7 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
if( pool == 0 )
pool = globalPool;
if( pool == 0 )
- globalPool = GPU_buffer_pool_new();
+ pool = globalPool = GPU_buffer_pool_new();
/* free the last used buffer in the queue if no more space, but only
if we are in the main thread. for e.g. rendering or baking it can
@@ -268,10 +272,9 @@ void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool )
GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
{
GPUDrawObject *object;
- MVert *mvert;
MFace *mface;
- int numverts[32768]; /* material number is an 16-bit short so there's at most 32768 materials */
- int redir[32768]; /* material number is an 16-bit short so there's at most 32768 materials */
+ int numverts[MAX_MATERIALS];
+ int redir[MAX_MATERIALS];
int *index;
int i;
int curmat, curverts, numfaces;
@@ -288,20 +291,19 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
object->indices[i].next = 0;
}
/*object->legacy = 1;*/
- memset(numverts,0,sizeof(int)*32768);
+ memset(numverts,0,sizeof(int)*MAX_MATERIALS);
- mvert = dm->getVertArray(dm);
mface = dm->getTessFaceArray(dm);
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
if( mface[i].v4 )
- numverts[mface[i].mat_nr+16383] += 6; /* split every quad into two triangles */
+ numverts[mface[i].mat_nr] += 6; /* split every quad into two triangles */
else
- numverts[mface[i].mat_nr+16383] += 3;
+ numverts[mface[i].mat_nr] += 3;
}
- for( i = 0; i < 32768; i++ ) {
+ for( i = 0; i < MAX_MATERIALS; i++ ) {
if( numverts[i] > 0 ) {
object->nmaterials++;
object->nelements += numverts[i];
@@ -311,9 +313,9 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_drawobject_new_index");
curmat = curverts = 0;
- for( i = 0; i < 32768; i++ ) {
+ for( i = 0; i < MAX_MATERIALS; i++ ) {
if( numverts[i] > 0 ) {
- object->materials[curmat].mat_nr = i-16383;
+ object->materials[curmat].mat_nr = i;
object->materials[curmat].start = curverts;
index[curmat] = curverts/3;
object->materials[curmat].end = curverts+numverts[i];
@@ -323,7 +325,7 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
}
object->faceRemap = MEM_mallocN(sizeof(int)*object->nelements/3,"GPU_drawobject_new_faceRemap");
for( i = 0; i < object->nmaterials; i++ ) {
- redir[object->materials[i].mat_nr+16383] = i; /* material number -> material index */
+ redir[object->materials[i].mat_nr] = i; /* material number -> material index */
}
object->indexMem = MEM_callocN(sizeof(IndexLink)*object->nelements,"GPU_drawobject_new_indexMem");
@@ -341,7 +343,7 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
}
for( i=0; i < numfaces; i++ ) {
- int curInd = index[redir[mface[i].mat_nr+16383]];
+ int curInd = index[redir[mface[i].mat_nr]];
object->faceRemap[curInd] = i;
ADDLINK( mface[i].v1, curInd*3 );
ADDLINK( mface[i].v2, curInd*3+1 );
@@ -352,10 +354,10 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm )
ADDLINK( mface[i].v4, curInd*3+4 );
ADDLINK( mface[i].v1, curInd*3+5 );
- index[redir[mface[i].mat_nr+16383]]+=2;
+ index[redir[mface[i].mat_nr]]+=2;
}
else {
- index[redir[mface[i].mat_nr+16383]]++;
+ index[redir[mface[i].mat_nr]]++;
}
}
@@ -491,7 +493,11 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
if(tri_data) {
for(i = 0; i < totface; ++i) {
MFace *f = mface + face_indices[i];
- int v[3] = {f->v1, f->v2, f->v3};
+ int v[3];
+
+ v[0]= f->v1;
+ v[1]= f->v2;
+ v[2]= f->v3;
for(j = 0; j < (f->v4 ? 2 : 1); ++j) {
for(k = 0; k < 3; ++k) {
@@ -592,8 +598,8 @@ void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
//printf("node updated %p\n", buffers_v);
}
-void *GPU_build_grid_buffers(DMGridData **grids,
- int *grid_indices, int totgrid, int gridsize)
+void *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indices),
+ int totgrid, int gridsize)
{
GPU_Buffers *buffers;
int i, j, k, totquad, offset= 0;
@@ -770,11 +776,11 @@ void GPU_free_buffers(void *buffers_v)
}
}
-GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
+static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int vector_size, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) )
{
GPUBuffer *buffer;
float *varray;
- int redir[32768];
+ int redir[MAX_MATERIALS];
int *index;
int i;
int success;
@@ -795,8 +801,8 @@ GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, G
index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup");
for( i = 0; i < object->nmaterials; i++ ) {
- index[i] = object->materials[i].start*3;
- redir[object->materials[i].mat_nr+16383] = i;
+ index[i] = object->materials[i].start*vector_size;
+ redir[object->materials[i].mat_nr] = i;
}
if( useVBOs ) {
@@ -852,7 +858,7 @@ GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, G
return buffer;
}
-void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+static void GPU_buffer_copy_vertex(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int start;
int i, j, numfaces;
@@ -867,11 +873,11 @@ void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *re
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
- start = index[redir[mface[i].mat_nr+16383]];
+ start = index[redir[mface[i].mat_nr]];
if( mface[i].v4 )
- index[redir[mface[i].mat_nr+16383]] += 18;
+ index[redir[mface[i].mat_nr]] += 18;
else
- index[redir[mface[i].mat_nr+16383]] += 9;
+ index[redir[mface[i].mat_nr]] += 9;
/* v1 v2 v3 */
VECCOPY(&varray[start],mvert[mface[i].v1].co);
@@ -894,14 +900,14 @@ void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *re
}
}
-GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_vertex\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex);
+ return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex);
}
-void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+static void GPU_buffer_copy_normal(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int i, numfaces;
int start;
@@ -915,14 +921,16 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
- start = index[redir[mface[i].mat_nr+16383]];
+ const int smoothnormal = (mface[i].flag & ME_SMOOTH);
+
+ start = index[redir[mface[i].mat_nr]];
if( mface[i].v4 )
- index[redir[mface[i].mat_nr+16383]] += 18;
+ index[redir[mface[i].mat_nr]] += 18;
else
- index[redir[mface[i].mat_nr+16383]] += 9;
+ index[redir[mface[i].mat_nr]] += 9;
/* v1 v2 v3 */
- if( mface[i].flag & ME_SMOOTH ) {
+ if(smoothnormal) {
VECCOPY(&varray[start],mvert[mface[i].v1].no);
VECCOPY(&varray[start+3],mvert[mface[i].v2].no);
VECCOPY(&varray[start+6],mvert[mface[i].v3].no);
@@ -944,7 +952,7 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
if( mface[i].v4 ) {
/* v3 v4 v1 */
- if( mface[i].flag & ME_SMOOTH ) {
+ if(smoothnormal) {
VECCOPY(&varray[start+9],mvert[mface[i].v3].no);
VECCOPY(&varray[start+12],mvert[mface[i].v4].no);
VECCOPY(&varray[start+15],mvert[mface[i].v1].no);
@@ -958,14 +966,14 @@ void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *re
}
}
-GPUBuffer *GPU_buffer_normal( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_normal( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_normal\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal);
+ return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal);
}
-void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user))
{
int start;
int i, numfaces;
@@ -985,11 +993,11 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir,
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
- start = index[redir[mface[i].mat_nr+16383]];
+ start = index[redir[mface[i].mat_nr]];
if( mface[i].v4 )
- index[redir[mface[i].mat_nr+16383]] += 12;
+ index[redir[mface[i].mat_nr]] += 12;
else
- index[redir[mface[i].mat_nr+16383]] += 6;
+ index[redir[mface[i].mat_nr]] += 6;
/* v1 v2 v3 */
VECCOPY2D(&varray[start],mtface[i].uv[0]);
@@ -1005,16 +1013,16 @@ void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir,
}
}
-GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_uv\n");
- if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 ) /* was sizeof(float)*2 but caused buffer overrun */
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv);
+ if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
+ return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(float)*2*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv);
else
return 0;
}
-void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
+static void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
{
int i, numfaces;
unsigned char *varray = (unsigned char *)varray_;
@@ -1025,11 +1033,11 @@ void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *r
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
- int start = index[redir[mface[i].mat_nr+16383]];
+ int start = index[redir[mface[i].mat_nr]];
if( mface[i].v4 )
- index[redir[mface[i].mat_nr+16383]] += 18;
+ index[redir[mface[i].mat_nr]] += 18;
else
- index[redir[mface[i].mat_nr+16383]] += 9;
+ index[redir[mface[i].mat_nr]] += 9;
/* v1 v2 v3 */
VECCOPY(&varray[start],&mcol[i*12]);
@@ -1044,7 +1052,7 @@ void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *r
}
}
-void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
+static void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
{
int i, numfaces;
unsigned char *varray = (unsigned char *)varray_;
@@ -1055,11 +1063,11 @@ void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *r
numfaces= dm->getNumTessFaces(dm);
for( i=0; i < numfaces; i++ ) {
- int start = index[redir[mface[i].mat_nr+16383]];
+ int start = index[redir[mface[i].mat_nr]];
if( mface[i].v4 )
- index[redir[mface[i].mat_nr+16383]] += 18;
+ index[redir[mface[i].mat_nr]] += 18;
else
- index[redir[mface[i].mat_nr+16383]] += 9;
+ index[redir[mface[i].mat_nr]] += 9;
/* v1 v2 v3 */
VECCOPY(&varray[start],&mcol[i*16]);
@@ -1074,7 +1082,7 @@ void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *r
}
}
-GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
{
unsigned char *colors;
int i, numfaces;
@@ -1101,24 +1109,22 @@ GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
colors[i*3+2] = mcol[i].r;
}
- result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 );
+ result = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 );
MEM_freeN(colors);
return result;
}
-void GPU_buffer_copy_edge( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+static void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user))
{
int i;
- MVert *mvert;
MEdge *medge;
unsigned int *varray_ = (unsigned int *)varray;
int numedges;
DEBUG_VBO("GPU_buffer_copy_edge\n");
- mvert = dm->getVertArray(dm);
medge = dm->getEdgeArray(dm);
numedges= dm->getNumEdges(dm);
@@ -1128,14 +1134,14 @@ void GPU_buffer_copy_edge( DerivedMesh *dm, float *varray, int *index, int *redi
}
}
-GPUBuffer *GPU_buffer_edge( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_edge( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_edge\n");
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge);
+ return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge);
}
-void GPU_buffer_copy_uvedge( DerivedMesh *dm, float *varray, int *index, int *redir, void *user )
+static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user))
{
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
int i, j=0;
@@ -1172,11 +1178,16 @@ void GPU_buffer_copy_uvedge( DerivedMesh *dm, float *varray, int *index, int *re
}
}
-GPUBuffer *GPU_buffer_uvedge( DerivedMesh *dm )
+static GPUBuffer *GPU_buffer_uvedge( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_uvedge\n");
-
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*(dm->drawObject->nelements/3)*2, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge);
+ /* logic here:
+ * ...each face gets 3 'nelements'
+ * ...3 edges per triangle
+ * ...each edge has its own, non-shared coords.
+ * so each tri corner needs minimum of 4 floats, quads used less so here we can over allocate and assume all tris.
+ * */
+ return GPU_buffer_setup( dm, dm->drawObject, 4, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge);
}
@@ -1487,7 +1498,7 @@ void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numd
glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
for( i = 0; i < numdata; i++ ) {
glEnableVertexAttribArrayARB( data[i].index );
- glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_TRUE, elementsize, (void *)offset );
+ glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_FALSE, elementsize, (void *)offset );
offset += data[i].size*GPU_typesize(data[i].type);
attribData[i].index = data[i].index;
@@ -1499,14 +1510,14 @@ void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numd
else {
for( i = 0; i < numdata; i++ ) {
glEnableVertexAttribArrayARB( data[i].index );
- glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_TRUE, elementsize, (char *)buffer->pointer + offset );
+ glVertexAttribPointerARB( data[i].index, data[i].size, data[i].type, GL_FALSE, elementsize, (char *)buffer->pointer + offset );
offset += data[i].size*GPU_typesize(data[i].type);
}
}
}
-void GPU_buffer_unbind()
+void GPU_buffer_unbind(void)
{
int i;
DEBUG_VBO("GPU_buffer_unbind\n");
@@ -1545,14 +1556,14 @@ void GPU_color3_upload( DerivedMesh *dm, unsigned char *data )
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new(dm);
GPU_buffer_free(dm->drawObject->colors,globalPool);
- dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 );
+ dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 );
}
void GPU_color4_upload( DerivedMesh *dm, unsigned char *data )
{
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new(dm);
GPU_buffer_free(dm->drawObject->colors,globalPool);
- dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 );
+ dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 );
}
void GPU_color_switch( int mode )
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index d596f573682..6225e5a3acc 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,12 +38,12 @@
#include "DNA_image_types.h"
#include "DNA_material_types.h"
-#include "BLI_dynstr.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BLI_dynstr.h"
#include "BLI_ghash.h"
#include "BLI_heap.h"
-
#include "GPU_material.h"
#include "GPU_extensions.h"
@@ -76,13 +76,13 @@ typedef enum GPUDataSource {
GPU_SOURCE_ATTRIB
} GPUDataSource;
-static char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
+static const char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4",
0, 0, 0, 0, "mat3", 0, 0, 0, 0, 0, 0, "mat4"};
struct GPUNode {
struct GPUNode *next, *prev;
- char *name;
+ const char *name;
int tag;
ListBase inputs;
@@ -93,7 +93,7 @@ struct GPUNodeLink {
GPUNodeStack *socket;
int attribtype;
- char *attribname;
+ const char *attribname;
int image;
@@ -188,7 +188,7 @@ static GHash *FUNCTION_HASH= NULL;
/*static char *FUNCTION_PROTOTYPES= NULL;
static GPUShader *FUNCTION_LIB= NULL;*/
-static int gpu_str_prefix(char *str, char *prefix)
+static int gpu_str_prefix(const char *str, const char *prefix)
{
while(*str && *prefix) {
if(*str != *prefix)
@@ -346,7 +346,7 @@ static char *gpu_generate_function_prototyps(GHash *hash)
}
#endif
-GPUFunction *GPU_lookup_function(char *name)
+GPUFunction *GPU_lookup_function(const char *name)
{
if(!FUNCTION_HASH) {
FUNCTION_HASH = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "GPU_lookup_function gh");
@@ -355,7 +355,7 @@ GPUFunction *GPU_lookup_function(char *name)
FUNCTION_LIB = GPU_shader_create_lib(datatoc_gpu_shader_material_glsl);*/
}
- return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, name);
+ return (GPUFunction*)BLI_ghash_lookup(FUNCTION_HASH, (void *)name);
}
void GPU_extensions_exit(void)
@@ -381,7 +381,7 @@ void GPU_extensions_exit(void)
/* GLSL code generation */
-static void codegen_convert_datatype(DynStr *ds, int from, int to, char *tmp, int id)
+static void codegen_convert_datatype(DynStr *ds, int from, int to, const char *tmp, int id)
{
char name[1024];
@@ -449,7 +449,7 @@ static int codegen_input_has_texture(GPUInput *input)
return input->tex != 0;
}
-char *GPU_builtin_name(GPUBuiltin builtin)
+const char *GPU_builtin_name(GPUBuiltin builtin)
{
if(builtin == GPU_VIEW_MATRIX)
return "unfviewmat";
@@ -554,7 +554,7 @@ static void codegen_print_uniforms_functions(DynStr *ds, ListBase *nodes)
{
GPUNode *node;
GPUInput *input;
- char *name;
+ const char *name;
int builtins = 0;
/* print uniforms */
@@ -686,7 +686,7 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_append(ds, ";\n");
}
-static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const char *name)
+static char *code_generate_fragment(ListBase *nodes, GPUOutput *output, const char *UNUSED(name))
{
DynStr *ds = BLI_dynstr_new();
char *code;
@@ -741,11 +741,12 @@ static char *code_generate_vertex(ListBase *nodes)
for (input=node->inputs.first; input; input=input->next)
if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) {
if(input->attribtype == CD_TANGENT) /* silly exception */
- BLI_dynstr_printf(ds, "\tvar%d = gl_NormalMatrix * ", input->attribid);
+ {
+ BLI_dynstr_printf(ds, "\tvar%d.xyz = normalize((gl_ModelViewMatrix * vec4(att%d.xyz, 0)).xyz);\n", input->attribid, input->attribid);
+ BLI_dynstr_printf(ds, "\tvar%d.w = att%d.w;\n", input->attribid, input->attribid);
+ }
else
- BLI_dynstr_printf(ds, "\tvar%d = ", input->attribid);
-
- BLI_dynstr_printf(ds, "att%d;\n", input->attribid);
+ BLI_dynstr_printf(ds, "\tvar%d = att%d;\n", input->attribid, input->attribid);
}
BLI_dynstr_append(ds, "}\n\n");
@@ -766,7 +767,7 @@ GPUShader *GPU_pass_shader(GPUPass *pass)
return pass->shader;
}
-void GPU_nodes_extract_dynamic_inputs(GPUPass *pass, ListBase *nodes)
+static void GPU_nodes_extract_dynamic_inputs(GPUPass *pass, ListBase *nodes)
{
GPUShader *shader = pass->shader;
GPUNode *node;
@@ -882,7 +883,7 @@ void GPU_pass_unbind(GPUPass *pass)
/* Node Link Functions */
-GPUNodeLink *GPU_node_link_create(int type)
+static GPUNodeLink *GPU_node_link_create(int type)
{
GPUNodeLink *link = MEM_callocN(sizeof(GPUNodeLink), "GPUNodeLink");
link->type = type;
@@ -891,7 +892,7 @@ GPUNodeLink *GPU_node_link_create(int type)
return link;
}
-void GPU_node_link_free(GPUNodeLink *link)
+static void GPU_node_link_free(GPUNodeLink *link)
{
link->users--;
@@ -907,16 +908,16 @@ void GPU_node_link_free(GPUNodeLink *link)
/* Node Functions */
-GPUNode *GPU_node_begin(char *name)
+static GPUNode *GPU_node_begin(const char *name)
{
GPUNode *node = MEM_callocN(sizeof(GPUNode), "GPUNode");
- node->name = name;
+ node->name= name;
return node;
}
-void GPU_node_end(GPUNode *node)
+static void GPU_node_end(GPUNode *UNUSED(node))
{
/* empty */
}
@@ -925,7 +926,7 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
{
GPUInput *input;
GPUNode *outnode;
- char *name;
+ const char *name;
if(link->output) {
outnode = link->output->node;
@@ -1036,7 +1037,7 @@ static void gpu_node_input_socket(GPUNode *node, GPUNodeStack *sock)
}
}
-void GPU_node_output(GPUNode *node, int type, char *name, GPUNodeLink **link)
+static void GPU_node_output(GPUNode *node, int type, const char *UNUSED(name), GPUNodeLink **link)
{
GPUOutput *output = MEM_callocN(sizeof(GPUOutput), "GPUOutput");
@@ -1055,7 +1056,7 @@ void GPU_node_output(GPUNode *node, int type, char *name, GPUNodeLink **link)
BLI_addtail(&node->outputs, output);
}
-void GPU_inputs_free(ListBase *inputs)
+static void GPU_inputs_free(ListBase *inputs)
{
GPUInput *input;
@@ -1069,7 +1070,7 @@ void GPU_inputs_free(ListBase *inputs)
BLI_freelistN(inputs);
}
-void GPU_node_free(GPUNode *node)
+static void GPU_node_free(GPUNode *node)
{
GPUOutput *output;
@@ -1085,7 +1086,7 @@ void GPU_node_free(GPUNode *node)
MEM_freeN(node);
}
-void GPU_nodes_free(ListBase *nodes)
+static void GPU_nodes_free(ListBase *nodes)
{
GPUNode *node;
@@ -1098,7 +1099,7 @@ void GPU_nodes_free(ListBase *nodes)
/* vertex attributes */
-void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *attribs)
+static void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *attribs)
{
GPUNode *node;
GPUInput *input;
@@ -1134,7 +1135,7 @@ void gpu_nodes_get_vertex_attributes(ListBase *nodes, GPUVertexAttribs *attribs)
}
}
-void gpu_nodes_get_builtin_flag(ListBase *nodes, int *builtin)
+static void gpu_nodes_get_builtin_flag(ListBase *nodes, int *builtin)
{
GPUNode *node;
GPUInput *input;
@@ -1149,7 +1150,7 @@ void gpu_nodes_get_builtin_flag(ListBase *nodes, int *builtin)
/* varargs linking */
-GPUNodeLink *GPU_attribute(int type, char *name)
+GPUNodeLink *GPU_attribute(int type, const char *name)
{
GPUNodeLink *link = GPU_node_link_create(0);
@@ -1230,7 +1231,7 @@ GPUNodeLink *GPU_builtin(GPUBuiltin builtin)
return link;
}
-int GPU_link(GPUMaterial *mat, char *name, ...)
+int GPU_link(GPUMaterial *mat, const char *name, ...)
{
GPUNode *node;
GPUFunction *function;
@@ -1266,7 +1267,7 @@ int GPU_link(GPUMaterial *mat, char *name, ...)
return 1;
}
-int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
+int GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, GPUNodeStack *out, ...)
{
GPUNode *node;
GPUFunction *function;
@@ -1333,7 +1334,7 @@ int GPU_link_changed(GPUNodeLink *link)
{
GPUNode *node;
GPUInput *input;
- char *name;
+ const char *name;
if(link->output) {
node = link->output->node;
@@ -1352,7 +1353,7 @@ int GPU_link_changed(GPUNodeLink *link)
/* Pass create/free */
-void gpu_nodes_tag(GPUNodeLink *link)
+static void gpu_nodes_tag(GPUNodeLink *link)
{
GPUNode *node;
GPUInput *input;
@@ -1370,7 +1371,7 @@ void gpu_nodes_tag(GPUNodeLink *link)
gpu_nodes_tag(input->link);
}
-void gpu_nodes_prune(ListBase *nodes, GPUNodeLink *outlink)
+static void gpu_nodes_prune(ListBase *nodes, GPUNodeLink *outlink)
{
GPUNode *node, *next;
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 3272f0fa1a9..3a9fe528345 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -55,7 +55,7 @@ typedef struct GPUFunction {
int totparam;
} GPUFunction;
-GPUFunction *GPU_lookup_function(char *name);
+GPUFunction *GPU_lookup_function(const char *name);
/* Pass Generation
- Takes a list of nodes and a desired output, and makes a pass. This
@@ -79,7 +79,7 @@ void GPU_pass_free(GPUPass *pass);
/* Material calls */
-char *GPU_builtin_name(GPUBuiltin builtin);
+const char *GPU_builtin_name(GPUBuiltin builtin);
void gpu_material_add_node(struct GPUMaterial *material, struct GPUNode *node);
int GPU_link_changed(struct GPUNodeLink *link);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index d14070a4c24..e1ca64388ae 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,6 +35,7 @@
#include "GL/glew.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
@@ -58,7 +59,7 @@
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_object.h"
-#include "BKE_utildefines.h"
+
#include "BLI_threads.h"
#include "BLI_blenlib.h"
@@ -307,7 +308,7 @@ static void gpu_make_repbind(Image *ima)
ima->repbind= MEM_callocN(sizeof(int)*ima->totbind, "repbind");
}
-static void gpu_clear_tpage()
+static void gpu_clear_tpage(void)
{
if(GTS.lasttface==0)
return;
@@ -394,7 +395,7 @@ static void gpu_verify_reflection(Image *ima)
}
}
-int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int tfmode, int compare, int mipmap)
+int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int mipmap)
{
ImBuf *ibuf = NULL;
unsigned int *bind = NULL;
@@ -593,7 +594,7 @@ int GPU_set_tpage(MTFace *tface, int mipmap)
gpu_verify_alpha_mode(tface);
gpu_verify_reflection(ima);
- if(GPU_verify_image(ima, NULL, tface->tile, tface->mode, 1, mipmap)) {
+ if(GPU_verify_image(ima, NULL, tface->tile, 1, mipmap)) {
GTS.curtile= GTS.tile;
GTS.curima= GTS.ima;
GTS.curtilemode= GTS.tilemode;
@@ -775,9 +776,9 @@ void GPU_free_smoke(SmokeModifierData *smd)
void GPU_create_smoke(SmokeModifierData *smd, int highres)
{
- if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && !smd->domain->tex && !highres)
+ if(smd->type & MOD_SMOKE_TYPE_DOMAIN && !smd->domain->tex && !highres)
smd->domain->tex = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smoke_get_density(smd->domain->fluid));
- else if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && !smd->domain->tex && highres)
+ else if(smd->type & MOD_SMOKE_TYPE_DOMAIN && !smd->domain->tex && highres)
smd->domain->tex = GPU_texture_create_3D(smd->domain->res_wt[0], smd->domain->res_wt[1], smd->domain->res_wt[2], smoke_turbulence_get_density(smd->domain->wt));
smd->domain->tex_shadow = GPU_texture_create_3D(smd->domain->res[0], smd->domain->res[1], smd->domain->res[2], smd->domain->shadow);
@@ -810,7 +811,8 @@ void GPU_free_unused_buffers(void)
BLI_freelistN(&image_free_queue);
/* vbo buffers */
- GPU_buffer_pool_free_unused(0);
+ /* it's probably not necessary to free all buffers every frame */
+ /* GPU_buffer_pool_free_unused(0); */
BLI_unlock_thread(LOCK_OPENGL);
}
@@ -871,9 +873,15 @@ void GPU_free_images_anim(void)
/* OpenGL state caching for materials */
+typedef struct GPUMaterialFixed {
+ float diff[4];
+ float spec[4];
+ int hard;
+} GPUMaterialFixed;
+
static struct GPUMaterialState {
- float (*matbuf)[2][4];
- float matbuf_fixed[FIXEDMAT][2][4];
+ GPUMaterialFixed (*matbuf);
+ GPUMaterialFixed matbuf_fixed[FIXEDMAT];
int totmat;
Material **gmatbuf;
@@ -893,7 +901,36 @@ static struct GPUMaterialState {
GPUBlendMode lastblendmode;
} GMS = {NULL};
-Material *gpu_active_node_material(Material *ma)
+/* fixed function material, alpha handed by caller */
+static void gpu_material_to_fixed(GPUMaterialFixed *smat, const Material *bmat, const int gamma, const Object *ob)
+{
+ if (bmat->mode & MA_SHLESS) {
+ copy_v3_v3(smat->diff, &bmat->r);
+ smat->diff[3]= 1.0;
+
+ if(gamma) {
+ linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
+ }
+ }
+ else {
+ mul_v3_v3fl(smat->diff, &bmat->r, bmat->ref + bmat->emit);
+ smat->diff[3]= 1.0; /* caller may set this to bmat->alpha */
+
+ if(bmat->shade_flag & MA_OBCOLOR)
+ mul_v3_v3(smat->diff, ob->col);
+
+ mul_v3_v3fl(smat->spec, &bmat->specr, bmat->spec);
+ smat->spec[3]= 1.0; /* always 1 */
+ smat->hard= CLAMPIS(bmat->har, 0, 128);
+
+ if(gamma) {
+ linearrgb_to_srgb_v3_v3(smat->diff, smat->diff);
+ linearrgb_to_srgb_v3_v3(smat->spec, smat->spec);
+ }
+ }
+}
+
+static Material *gpu_active_node_material(Material *ma)
{
if(ma && ma->use_nodes && ma->nodetree) {
bNode *node= nodeGetActiveID(ma->nodetree, ID_MA);
@@ -934,7 +971,7 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
*do_alpha_pass = 0;
if(GMS.totmat > FIXEDMAT) {
- GMS.matbuf= MEM_callocN(sizeof(*GMS.matbuf)*GMS.totmat, "GMS.matbuf");
+ GMS.matbuf= MEM_callocN(sizeof(GPUMaterialFixed)*GMS.totmat, "GMS.matbuf");
GMS.gmatbuf= MEM_callocN(sizeof(*GMS.gmatbuf)*GMS.totmat, "GMS.matbuf");
GMS.blendmode= MEM_callocN(sizeof(*GMS.blendmode)*GMS.totmat, "GMS.matbuf");
}
@@ -946,19 +983,10 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
/* no materials assigned? */
if(ob->totcol==0) {
- GMS.matbuf[0][0][0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
- GMS.matbuf[0][0][1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
- GMS.matbuf[0][0][2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
- GMS.matbuf[0][0][3]= 1.0;
-
- GMS.matbuf[0][1][0]= defmaterial.spec*defmaterial.specr;
- GMS.matbuf[0][1][1]= defmaterial.spec*defmaterial.specg;
- GMS.matbuf[0][1][2]= defmaterial.spec*defmaterial.specb;
- GMS.matbuf[0][1][3]= 1.0;
-
+ gpu_material_to_fixed(&GMS.matbuf[0], &defmaterial, 0, ob);
+
/* do material 1 too, for displists! */
- QUATCOPY(GMS.matbuf[1][0], GMS.matbuf[0][0]);
- QUATCOPY(GMS.matbuf[1][1], GMS.matbuf[0][1]);
+ memcpy(&GMS.matbuf[1], &GMS.matbuf[0], sizeof(GPUMaterialFixed));
if(glsl) {
GMS.gmatbuf[0]= &defmaterial;
@@ -985,32 +1013,13 @@ void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, O
}
else {
/* fixed function opengl materials */
- if (ma->mode & MA_SHLESS) {
- GMS.matbuf[a][0][0]= ma->r;
- GMS.matbuf[a][0][1]= ma->g;
- GMS.matbuf[a][0][2]= ma->b;
- if(gamma) linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][0][0], &GMS.matbuf[a][0][0]);
- } else {
- GMS.matbuf[a][0][0]= (ma->ref+ma->emit)*ma->r;
- GMS.matbuf[a][0][1]= (ma->ref+ma->emit)*ma->g;
- GMS.matbuf[a][0][2]= (ma->ref+ma->emit)*ma->b;
-
- GMS.matbuf[a][1][0]= ma->spec*ma->specr;
- GMS.matbuf[a][1][1]= ma->spec*ma->specg;
- GMS.matbuf[a][1][2]= ma->spec*ma->specb;
- GMS.matbuf[a][1][3]= 1.0;
-
- if(gamma) {
- linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][0][0], &GMS.matbuf[a][0][0]);
- linearrgb_to_srgb_v3_v3(&GMS.matbuf[a][1][0], &GMS.matbuf[a][1][0]);
- }
- }
+ gpu_material_to_fixed(&GMS.matbuf[a], ma, gamma, ob);
blendmode = (ma->alpha == 1.0f)? GPU_BLEND_SOLID: GPU_BLEND_ALPHA;
if(do_alpha_pass && GMS.alphapass)
- GMS.matbuf[a][0][3]= ma->alpha;
+ GMS.matbuf[a].diff[3]= ma->alpha;
else
- GMS.matbuf[a][0][3]= 1.0f;
+ GMS.matbuf[a].diff[3]= 1.0f;
}
/* setting do_alpha_pass = 1 indicates this object needs to be
@@ -1039,18 +1048,15 @@ int GPU_enable_material(int nr, void *attribs)
memset(&GMS, 0, sizeof(GMS));
- diff[0]= (defmaterial.ref+defmaterial.emit)*defmaterial.r;
- diff[1]= (defmaterial.ref+defmaterial.emit)*defmaterial.g;
- diff[2]= (defmaterial.ref+defmaterial.emit)*defmaterial.b;
+ mul_v3_v3fl(diff, &defmaterial.r, defmaterial.ref + defmaterial.emit);
diff[3]= 1.0;
- spec[0]= defmaterial.spec*defmaterial.specr;
- spec[1]= defmaterial.spec*defmaterial.specg;
- spec[2]= defmaterial.spec*defmaterial.specb;
+ mul_v3_v3fl(spec, &defmaterial.specr, defmaterial.spec);
spec[3]= 1.0;
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35); /* blender default */
return 0;
}
@@ -1094,8 +1100,9 @@ int GPU_enable_material(int nr, void *attribs)
}
else {
/* or do fixed function opengl material */
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GMS.matbuf[nr][0]);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GMS.matbuf[nr][1]);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, GMS.matbuf[nr].diff);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, GMS.matbuf[nr].spec);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, GMS.matbuf[nr].hard);
}
/* set (alpha) blending mode */
@@ -1257,14 +1264,14 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
if(la->type==LA_SUN) {
/* sun lamp */
- VECCOPY(direction, base->object->obmat[2]);
+ copy_v3_v3(direction, base->object->obmat[2]);
direction[3]= 0.0;
glLightfv(GL_LIGHT0+count, GL_POSITION, direction);
}
else {
/* other lamps with attenuation */
- VECCOPY(position, base->object->obmat[3]);
+ copy_v3_v3(position, base->object->obmat[3]);
position[3]= 1.0f;
glLightfv(GL_LIGHT0+count, GL_POSITION, position);
@@ -1274,9 +1281,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
if(la->type==LA_SPOT) {
/* spot lamp */
- direction[0]= -base->object->obmat[2][0];
- direction[1]= -base->object->obmat[2][1];
- direction[2]= -base->object->obmat[2][2];
+ negate_v3_v3(direction, base->object->obmat[2]);
glLightfv(GL_LIGHT0+count, GL_SPOT_DIRECTION, direction);
glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, la->spotsize/2.0);
glLightf(GL_LIGHT0+count, GL_SPOT_EXPONENT, 128.0*la->spotblend);
@@ -1288,9 +1293,7 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->energy*M_PI; //XXX la->power
/* setup energy */
- energy[0]= power*la->r;
- energy[1]= power*la->g;
- energy[2]= power*la->b;
+ mul_v3_v3fl(energy, &la->r, la->energy);
energy[3]= 1.0;
glLightfv(GL_LIGHT0+count, GL_DIFFUSE, energy);
@@ -1314,7 +1317,6 @@ void GPU_state_init(void)
/* also called when doing opengl rendering and in the game engine */
float mat_ambient[] = { 0.0, 0.0, 0.0, 0.0 };
float mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
- float mat_shininess[] = { 35.0 };
int a, x, y;
GLubyte pat[32*32];
const GLubyte *patc= pat;
@@ -1322,7 +1324,7 @@ void GPU_state_init(void)
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 35);
GPU_default_lights();
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index fa8ff7a6354..cc21572bfa1 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,10 +37,10 @@
#include "MEM_guardedalloc.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
@@ -67,10 +67,11 @@ static struct GPUGlobal {
int glslsupport;
int extdisabled;
int colordepth;
+ int npotdisabled; /* ATI 3xx-5xx (and more) chipsets support NPoT partially (== not enough) */
GPUDeviceType device;
GPUOSType os;
GPUDriverType driver;
-} GG = {1, 0, 0, 0};
+} GG = {1, 0, 0, 0, 0};
/* GPU Types */
@@ -81,16 +82,21 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver)
/* GPU Extensions */
-void GPU_extensions_disable()
+void GPU_extensions_disable(void)
{
GG.extdisabled = 1;
}
-void GPU_extensions_init()
+void GPU_extensions_init(void)
{
GLint r, g, b;
const char *vendor, *renderer;
+ /* can't avoid calling this multiple times, see wm_window_add_ghostwindow */
+ static char init= 0;
+ if(init) return;
+ init= 1;
+
glewInit();
/* glewIsSupported("GL_VERSION_2_0") */
@@ -114,6 +120,12 @@ void GPU_extensions_init()
if(strstr(vendor, "ATI")) {
GG.device = GPU_DEVICE_ATI;
GG.driver = GPU_DRIVER_OFFICIAL;
+
+ /* ATI X1xxx cards (R500 chipset) lack full support for npot textures
+ * although they report the GLEW_ARB_texture_non_power_of_two extension.
+ */
+ if(strstr(renderer, "X1"))
+ GG.npotdisabled = 1;
}
else if(strstr(vendor, "NVIDIA")) {
GG.device = GPU_DEVICE_NVIDIA;
@@ -126,11 +138,22 @@ void GPU_extensions_init()
GG.device = GPU_DEVICE_INTEL;
GG.driver = GPU_DRIVER_OFFICIAL;
}
- else if(strstr(renderer, "Mesa DRI R")) {
+ else if(strstr(renderer, "Mesa DRI R") || (strstr(renderer, "Gallium ") && strstr(renderer, " on ATI "))) {
GG.device = GPU_DEVICE_ATI;
GG.driver = GPU_DRIVER_OPENSOURCE;
+ /* ATI 9500 to X2300 cards support NPoT textures poorly
+ * Incomplete list http://dri.freedesktop.org/wiki/ATIRadeon
+ * New IDs from MESA's src/gallium/drivers/r300/r300_screen.c
+ */
+ if(strstr(renderer, "R3") || strstr(renderer, "RV3") ||
+ strstr(renderer, "R4") || strstr(renderer, "RV4") ||
+ strstr(renderer, "RS4") || strstr(renderer, "RC4") ||
+ strstr(renderer, "R5") || strstr(renderer, "RV5") ||
+ strstr(renderer, "RS600") || strstr(renderer, "RS690") ||
+ strstr(renderer, "RS740"))
+ GG.npotdisabled = 1;
}
- else if(strstr(renderer, "Nouveau")) {
+ else if(strstr(renderer, "Nouveau") || strstr(vendor, "nouveau")) {
GG.device = GPU_DEVICE_NVIDIA;
GG.driver = GPU_DRIVER_OPENSOURCE;
}
@@ -160,27 +183,30 @@ void GPU_extensions_init()
#endif
}
-int GPU_glsl_support()
+int GPU_glsl_support(void)
{
return !GG.extdisabled && GG.glslsupport;
}
-int GPU_non_power_of_two_support()
+int GPU_non_power_of_two_support(void)
{
/* Exception for buggy ATI/Apple driver in Mac OS X 10.5/10.6,
* they claim to support this but can cause system freeze */
if(GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_MAC, GPU_DRIVER_OFFICIAL))
return 0;
+ if(GG.npotdisabled)
+ return 0;
+
return GLEW_ARB_texture_non_power_of_two;
}
-int GPU_color_depth()
+int GPU_color_depth(void)
{
return GG.colordepth;
}
-int GPU_print_error(char *str)
+int GPU_print_error(const char *str)
{
GLenum errCode;
@@ -484,7 +510,7 @@ GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, double time,
glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
GPU_update_image_time(ima, time);
- bindcode = GPU_verify_image(ima, iuser, 0, 0, 0, mipmap);
+ bindcode = GPU_verify_image(ima, iuser, 0, 0, mipmap);
if(ima->gputexture) {
ima->gputexture->bindcode = bindcode;
@@ -654,7 +680,7 @@ struct GPUFrameBuffer {
GPUTexture *depthtex;
};
-GPUFrameBuffer *GPU_framebuffer_create()
+GPUFrameBuffer *GPU_framebuffer_create(void)
{
GPUFrameBuffer *fb;
@@ -744,7 +770,7 @@ void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex)
tex->fb = NULL;
}
-void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex)
+void GPU_framebuffer_texture_bind(GPUFrameBuffer *UNUSED(fb), GPUTexture *tex)
{
/* push attributes */
glPushAttrib(GL_ENABLE_BIT);
@@ -766,7 +792,7 @@ void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex)
glLoadIdentity();
}
-void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex)
+void GPU_framebuffer_texture_unbind(GPUFrameBuffer *UNUSED(fb), GPUTexture *UNUSED(tex))
{
/* restore matrix */
glMatrixMode(GL_PROJECTION);
@@ -799,7 +825,7 @@ void GPU_framebuffer_free(GPUFrameBuffer *fb)
MEM_freeN(fb);
}
-void GPU_framebuffer_restore()
+void GPU_framebuffer_restore(void)
{
if (GG.currentfb != 0) {
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
@@ -815,7 +841,7 @@ struct GPUOffScreen {
GPUTexture *depth;
};
-GPUOffScreen *GPU_offscreen_create(int width, int height)
+GPUOffScreen *GPU_offscreen_create(int *width, int *height)
{
GPUOffScreen *ofs;
@@ -827,18 +853,24 @@ GPUOffScreen *GPU_offscreen_create(int width, int height)
return NULL;
}
- ofs->depth = GPU_texture_create_depth(width, height);
+ ofs->depth = GPU_texture_create_depth(*width, *height);
if(!ofs->depth) {
GPU_offscreen_free(ofs);
return NULL;
}
+ if(*width!=ofs->depth->w || *height!=ofs->depth->h) {
+ *width= ofs->depth->w;
+ *height= ofs->depth->h;
+ printf("Offscreen size differs from given size!\n");
+ }
+
if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->depth)) {
GPU_offscreen_free(ofs);
return NULL;
}
- ofs->color = GPU_texture_create_2D(width, height, NULL);
+ ofs->color = GPU_texture_create_2D(*width, *height, NULL);
if(!ofs->color) {
GPU_offscreen_free(ofs);
return NULL;
@@ -889,7 +921,7 @@ struct GPUShader {
int totattrib; /* total number of attributes */
};
-static void shader_print_errors(char *task, char *log, const char *code)
+static void shader_print_errors(const char *task, char *log, const char *code)
{
const char *c, *pos, *end = code + strlen(code);
int line = 1;
@@ -1038,7 +1070,7 @@ void GPU_shader_bind(GPUShader *shader)
GPU_print_error("Post Shader Bind");
}
-void GPU_shader_unbind()
+void GPU_shader_unbind(GPUShader *UNUSED(shader))
{
GPU_print_error("Pre Shader Unbind");
glUseProgramObjectARB(0);
@@ -1058,12 +1090,12 @@ void GPU_shader_free(GPUShader *shader)
MEM_freeN(shader);
}
-int GPU_shader_get_uniform(GPUShader *shader, char *name)
+int GPU_shader_get_uniform(GPUShader *shader, const char *name)
{
return glGetUniformLocationARB(shader->object, name);
}
-void GPU_shader_uniform_vector(GPUShader *shader, int location, int length, int arraysize, float *value)
+void GPU_shader_uniform_vector(GPUShader *UNUSED(shader), int location, int length, int arraysize, float *value)
{
if(location == -1)
return;
@@ -1080,7 +1112,7 @@ void GPU_shader_uniform_vector(GPUShader *shader, int location, int length, int
GPU_print_error("Post Uniform Vector");
}
-void GPU_shader_uniform_texture(GPUShader *shader, int location, GPUTexture *tex)
+void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUTexture *tex)
{
GLenum arbnumber;
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index a86852d6c19..675c73da960 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,18 +40,21 @@
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_anim.h"
#include "BKE_colortools.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
+#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
+#include "IMB_imbuf_types.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -461,7 +464,7 @@ static void area_lamp_vectors(LampRen *lar)
static void ramp_blend(GPUMaterial *mat, GPUNodeLink *fac, GPUNodeLink *col1, GPUNodeLink *col2, int type, GPUNodeLink **outcol)
{
- static char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
+ static const char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
"mix_screen", "mix_div", "mix_diff", "mix_dark", "mix_light",
"mix_overlay", "mix_dodge", "mix_burn", "mix_hue", "mix_sat",
"mix_val", "mix_color", "mix_soft", "mix_linear"};
@@ -584,7 +587,7 @@ static void do_specular_ramp(GPUShadeInput *shi, GPUNodeLink *is, GPUNodeLink *t
}
}
-void add_user_list(ListBase *list, void *data)
+static void add_user_list(ListBase *list, void *data)
{
LinkData *link = MEM_callocN(sizeof(LinkData), "GPULinkData");
link->data = data;
@@ -596,7 +599,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
Material *ma= shi->mat;
GPUMaterial *mat= shi->gpumat;
GPUNodeLink *lv, *dist, *visifac, *is, *inp, *i, *vn, *view;
- GPUNodeLink *outcol, *specfac, *t, *shadfac;
+ GPUNodeLink *outcol, *specfac, *t, *shadfac= NULL;
float one = 1.0f;
if((lamp->mode & LA_ONLYSHADOW) && !(ma->mode & MA_SHADOW))
@@ -620,10 +623,8 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
}
else {
if(lamp->type == LA_AREA) {
- float area[4][4], areasize;
+ float area[4][4]= {{0.0f}}, areasize= 0.0f;
- memset(&area, 0, sizeof(area));
- memset(&areasize, 0, sizeof(areasize));
mat->dynproperty |= DYN_LAMP_VEC|DYN_LAMP_CO;
GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
@@ -749,10 +750,10 @@ static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
{
Base *base;
Object *ob;
- Scene *sce;
+ Scene *sce_iter;
GPULamp *lamp;
- for(SETLOOPER(shi->gpumat->scene, base)) {
+ for(SETLOOPER(shi->gpumat->scene, sce_iter, base)) {
ob= base->object;
if(ob->type==OB_LAMP) {
@@ -766,12 +767,12 @@ static void material_lights(GPUShadeInput *shi, GPUShadeResult *shr)
ListBase *lb = object_duplilist(shi->gpumat->scene, ob);
for(dob=lb->first; dob; dob=dob->next) {
- Object *ob = dob->ob;
-
- if(ob->type==OB_LAMP) {
- copy_m4_m4(ob->obmat, dob->mat);
+ Object *ob_iter = dob->ob;
+
+ if(ob_iter->type==OB_LAMP) {
+ copy_m4_m4(ob_iter->obmat, dob->mat);
- lamp = GPU_lamp_from_blender(shi->gpumat->scene, ob, base->object);
+ lamp = GPU_lamp_from_blender(shi->gpumat->scene, ob_iter, ob);
if(lamp)
shade_one_light(shi, shr, lamp);
}
@@ -876,12 +877,15 @@ static void do_material_tex(GPUShadeInput *shi)
MTex *mtex;
Tex *tex;
GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil, *tnorfac;
- GPUNodeLink *texco_norm, *texco_orco, *texco_object, *texco_tangent;
+ GPUNodeLink *texco_norm, *texco_orco, *texco_object;
GPUNodeLink *texco_global, *texco_uv = NULL;
GPUNodeLink *newnor, *orn;
char *lastuvname = NULL;
float one = 1.0f, norfac, ofs[3];
int tex_nr, rgbnor, talpha;
+ int init_done = 0, iBumpSpacePrev;
+ GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude;
+ int iFirstTimeNMap=1;
GPU_link(mat, "set_value", GPU_uniform(&one), &stencil);
@@ -890,7 +894,7 @@ static void do_material_tex(GPUShadeInput *shi)
GPU_link(mat, "texco_object", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
GPU_builtin(GPU_VIEW_POSITION), &texco_object);
- GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent);
+ //GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent);
GPU_link(mat, "texco_global", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
GPU_builtin(GPU_VIEW_POSITION), &texco_global);
@@ -947,7 +951,7 @@ static void do_material_tex(GPUShadeInput *shi)
rgbnor = 0;
if(tex && tex->type == TEX_IMAGE && tex->ima) {
- GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser), &tin, &trgb, &tnor);
+ GPU_link(mat, "mtex_image", texco, GPU_image(tex->ima, &tex->iuser), &tin, &trgb);
rgbnor= TEX_RGB;
if(tex->imaflag & TEX_USEALPHA)
@@ -1016,29 +1020,138 @@ static void do_material_tex(GPUShadeInput *shi)
}
if(!(mat->scene->gm.flag & GAME_GLSL_NO_EXTRA_TEX) && (mtex->mapto & MAP_NORM)) {
- if((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP)) {
- if(mtex->norfac < 0.0f)
- GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor);
-
- if(mtex->normapspace == MTEX_NSPACE_TANGENT)
- GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
- else
- newnor = tnor;
-
- norfac = MIN2(fabsf(mtex->norfac), 1.0);
- if(norfac == 1.0f && !GPU_link_changed(stencil)) {
- shi->vn = newnor;
- }
- else {
+ if(tex->type==TEX_IMAGE) {
+ if(tex->imaflag & TEX_NORMALMAP) {
+ /* normalmap image */
+ GPU_link(mat, "mtex_normal", texco, GPU_image(tex->ima, &tex->iuser), &tnor );
+
+ if(mtex->norfac < 0.0f)
+ GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor);
+
+ if(mtex->normapspace == MTEX_NSPACE_TANGENT)
+ {
+ if(iFirstTimeNMap!=0)
+ {
+ // use unnormalized normal (this is how we bake it - closer to gamedev)
+ GPUNodeLink *vNegNorm;
+ GPU_link(mat, "vec_math_negate", GPU_builtin(GPU_VIEW_NORMAL), &vNegNorm);
+ GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), vNegNorm, tnor, &newnor);
+ iFirstTimeNMap = 0;
+ }
+ else // otherwise use accumulated perturbations
+ {
+ GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor);
+ }
+ }
+ else
+ newnor = tnor;
+
+ norfac = MIN2(fabsf(mtex->norfac), 1.0);
+
+ if(norfac == 1.0f && !GPU_link_changed(stencil)) {
+ shi->vn = newnor;
+ }
+ else {
+ tnorfac = GPU_uniform(&norfac);
+
+ if(GPU_link_changed(stencil))
+ GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
+
+ GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
+ }
+
+ } else if( mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP)) {
+ /* ntap bumpmap image */
+ int iBumpSpace;
+ float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types
+ float hScaleTex = 13.0f; // factor for scaling texspace bumps
+
+ GPUNodeLink *surf_pos = GPU_builtin(GPU_VIEW_POSITION);
+ GPUNodeLink *vR1, *vR2;
+ GPUNodeLink *dBs, *dBt, *fDet;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ hScale = hScaleTex;
+ norfac = hScale * mtex->norfac;
tnorfac = GPU_uniform(&norfac);
-
+
if(GPU_link_changed(stencil))
GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
-
- GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
+
+ if( !init_done ) {
+ // copy shi->vn to vNorg and vNacc, set magnitude to 1
+ GPU_link(mat, "mtex_bump_normals_init", shi->vn, &vNorg, &vNacc, &fPrevMagnitude);
+ iBumpSpacePrev = 0;
+ init_done = 1;
+ }
+
+ // find current bump space
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ iBumpSpace = 1;
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ iBumpSpace = 2;
+ else
+ iBumpSpace = 4; // ViewSpace
+
+ // re-initialize if bump space changed
+ if( iBumpSpacePrev != iBumpSpace ) {
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ GPU_link( mat, "mtex_bump_init_objspace",
+ surf_pos, vNorg,
+ GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX),
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ GPU_link( mat, "mtex_bump_init_texturespace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ else
+ GPU_link( mat, "mtex_bump_init_viewspace",
+ surf_pos, vNorg,
+ fPrevMagnitude, vNacc,
+ &fPrevMagnitude, &vNacc,
+ &vR1, &vR2, &fDet );
+
+ iBumpSpacePrev = iBumpSpace;
+ }
+
+
+ if( mtex->texflag & MTEX_3TAP_BUMP )
+ GPU_link( mat, "mtex_bump_tap3",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+ else
+ GPU_link( mat, "mtex_bump_tap5",
+ texco, GPU_image(tex->ima, &tex->iuser), tnorfac,
+ &dBs, &dBt );
+
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ float ima_x= 512.0f, ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
+ ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
+ if(ibuf) {
+ ima_x= ibuf->x;
+ ima_y= ibuf->y;
+ }
+
+ GPU_link( mat, "mtex_bump_apply_texspace",
+ fDet, dBs, dBt, vR1, vR2,
+ GPU_image(tex->ima, &tex->iuser), texco, GPU_uniform(&ima_x), GPU_uniform(&ima_y), vNacc,
+ &vNacc, &shi->vn );
+ } else
+ GPU_link( mat, "mtex_bump_apply",
+ fDet, dBs, dBt, vR1, vR2, vNacc,
+ &vNacc, &shi->vn );
+
}
}
-
+
GPU_link(mat, "vec_math_negate", shi->vn, &orn);
GPU_link(mat, "texco_refl", shi->vn, shi->view, &shi->ref);
}
@@ -1226,7 +1339,7 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
GPU_link(mat, "linearrgb_to_srgb", shr->combined, &shr->combined);
}
-GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
+static GPUNodeLink *GPU_blender_material(GPUMaterial *mat, Material *ma)
{
GPUShadeInput shi;
GPUShadeResult shr;
@@ -1273,7 +1386,7 @@ GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma)
return mat;
}
-void GPU_materials_free()
+void GPU_materials_free(void)
{
Object *ob;
Material *ma;
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl
index 2d6df8675e4..f296dc3a67e 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl
@@ -641,9 +641,9 @@ void valtorgb(float fac, sampler1D colormap, out vec4 outcol, out float outalpha
outalpha = outcol.a;
}
-void rgbtobw(vec4 color, out float outval)
+void rgbtobw(vec4 color, out float outval)
{
- outval = color.r*0.35 + color.g*0.45 + color.b*0.2;
+ outval = color.r*0.35 + color.g*0.45 + color.b*0.2; /* keep these factors in sync with texture.h:RGBTOBW */
}
void invert(float fac, vec4 col, out vec4 outcol)
@@ -746,9 +746,9 @@ void texco_norm(vec3 normal, out vec3 outnormal)
outnormal = normalize(normal);
}
-void texco_tangent(vec3 tangent, out vec3 outtangent)
+void texco_tangent(vec4 tangent, out vec3 outtangent)
{
- outtangent = normalize(tangent);
+ outtangent = normalize(tangent.xyz);
}
void texco_global(mat4 viewinvmat, vec3 co, out vec3 global)
@@ -1090,12 +1090,164 @@ void mtex_2d_mapping(vec3 vec, out vec3 outvec)
outvec = vec3(vec.xy*0.5 + vec2(0.5, 0.5), vec.z);
}
-void mtex_image(vec3 vec, sampler2D ima, out float value, out vec4 color, out vec3 normal)
+void mtex_image(vec3 texco, sampler2D ima, out float value, out vec4 color)
{
- color = texture2D(ima, vec.xy);
+ color = texture2D(ima, texco.xy);
value = 1.0;
+}
+
+void mtex_normal(vec3 texco, sampler2D ima, out vec3 normal)
+{
+ // The invert of the red channel is to make
+ // the normal map compliant with the outside world.
+ // It needs to be done because in Blender
+ // the normal used points inward.
+ // Should this ever change this negate must be removed.
+ vec4 color = texture2D(ima, texco.xy);
+ normal = 2.0*(vec3(-color.r, color.g, color.b) - vec3(-0.5, 0.5, 0.5));
+}
+
+void mtex_bump_normals_init( vec3 vN, out vec3 vNorg, out vec3 vNacc, out float fPrevMagnitude )
+{
+ vNorg = vN;
+ vNacc = vN;
+ fPrevMagnitude = 1.0;
+}
+
+/** helper method to extract the upper left 3x3 matrix from a 4x4 matrix */
+mat3 to_mat3(mat4 m4)
+{
+ mat3 m3;
+ m3[0] = m4[0].xyz;
+ m3[1] = m4[1].xyz;
+ m3[2] = m4[2].xyz;
+ return m3;
+}
+
+void mtex_bump_init_objspace( vec3 surf_pos, vec3 surf_norm,
+ mat4 mView, mat4 mViewInv, mat4 mObj, mat4 mObjInv,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ mat3 obj2view = to_mat3(mView * mObj);
+ mat3 view2obj = to_mat3(mObjInv * mViewInv);
+
+ vec3 vSigmaS = view2obj * dFdx( surf_pos );
+ vec3 vSigmaT = view2obj * dFdy( surf_pos );
+ vec3 vN = normalize( surf_norm * obj2view );
+
+ vR1 = cross( vSigmaT, vN );
+ vR2 = cross( vN, vSigmaS ) ;
+ fDet = dot ( vSigmaS, vR1 );
+
+ /* pretransform vNacc (in mtex_bump_apply) using the inverse transposed */
+ vR1 = vR1 * view2obj;
+ vR2 = vR2 * view2obj;
+ vN = vN * view2obj;
+
+ float fMagnitude = abs(fDet) * length(vN);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_init_texturespace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = normalize( cross( vSigmaT, vN ) );
+ vR2 = normalize( cross( vN, vSigmaS ) );
+ fDet = sign( dot(vSigmaS, vR1) );
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_init_viewspace( vec3 surf_pos, vec3 surf_norm,
+ float fPrevMagnitude_in, vec3 vNacc_in,
+ out float fPrevMagnitude_out, out vec3 vNacc_out,
+ out vec3 vR1, out vec3 vR2, out float fDet )
+{
+ vec3 vSigmaS = dFdx( surf_pos );
+ vec3 vSigmaT = dFdy( surf_pos );
+ vec3 vN = surf_norm; /* normalized interpolated vertex normal */
+
+ vR1 = cross( vSigmaT, vN );
+ vR2 = cross( vN, vSigmaS ) ;
+ fDet = dot ( vSigmaS, vR1 );
+
+ float fMagnitude = abs(fDet);
+ vNacc_out = vNacc_in * (fMagnitude / fPrevMagnitude_in);
+ fPrevMagnitude_out = fMagnitude;
+}
+
+void mtex_bump_tap3( vec3 texco, sampler2D ima, float hScale,
+ out float dBs, out float dBt )
+{
+ vec2 STll = texco.xy;
+ vec2 STlr = texco.xy + dFdx(texco.xy) ;
+ vec2 STul = texco.xy + dFdy(texco.xy) ;
+
+ float Hll,Hlr,Hul;
+ rgbtobw( texture2D(ima, STll), Hll );
+ rgbtobw( texture2D(ima, STlr), Hlr );
+ rgbtobw( texture2D(ima, STul), Hul );
+
+ dBs = hScale * (Hlr - Hll);
+ dBt = hScale * (Hul - Hll);
+}
+
+void mtex_bump_tap5( vec3 texco, sampler2D ima, float hScale,
+ out float dBs, out float dBt )
+{
+ vec2 TexDx = dFdx(texco.xy);
+ vec2 TexDy = dFdy(texco.xy);
+
+ vec2 STc = texco.xy;
+ vec2 STl = texco.xy - 0.5 * TexDx ;
+ vec2 STr = texco.xy + 0.5 * TexDx ;
+ vec2 STd = texco.xy - 0.5 * TexDy ;
+ vec2 STu = texco.xy + 0.5 * TexDy ;
+
+ float Hc,Hl,Hr,Hd,Hu;
+ rgbtobw( texture2D(ima, STc), Hc );
+ rgbtobw( texture2D(ima, STl), Hl );
+ rgbtobw( texture2D(ima, STr), Hr );
+ rgbtobw( texture2D(ima, STd), Hd );
+ rgbtobw( texture2D(ima, STu), Hu );
- normal = 2.0*(vec3(color.r, -color.g, color.b) - vec3(0.5, -0.5, 0.5));
+ dBs = hScale * (Hr - Hl);
+ dBt = hScale * (Hu - Hd);
+}
+
+void mtex_bump_apply( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
+{
+ vec3 vSurfGrad = sign(fDet) * ( dBs * vR1 + dBt * vR2 );
+
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
+}
+
+void mtex_bump_apply_texspace( float fDet, float dBs, float dBt, vec3 vR1, vec3 vR2,
+ sampler2D ima, vec3 texco, float ima_x, float ima_y, vec3 vNacc_in,
+ out vec3 vNacc_out, out vec3 perturbed_norm )
+{
+ vec2 TexDx = dFdx(texco.xy);
+ vec2 TexDy = dFdy(texco.xy);
+
+ vec3 vSurfGrad = sign(fDet) * (
+ dBs / length( vec2(ima_x*TexDx.x, ima_y*TexDx.y) ) * vR1 +
+ dBt / length( vec2(ima_x*TexDy.x, ima_y*TexDy.y) ) * vR2 );
+
+ vNacc_out = vNacc_in - vSurfGrad;
+ perturbed_norm = normalize( vNacc_out );
}
void mtex_negate_texnormal(vec3 normal, out vec3 outnormal)
@@ -1103,12 +1255,11 @@ void mtex_negate_texnormal(vec3 normal, out vec3 outnormal)
outnormal = vec3(-normal.x, -normal.y, normal.z);
}
-void mtex_nspace_tangent(vec3 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
+void mtex_nspace_tangent(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
{
- tangent = normalize(tangent);
- vec3 B = cross(normal, tangent);
+ vec3 B = tangent.w * cross(normal, tangent.xyz);
- outnormal = texnormal.x*tangent + texnormal.y*B + texnormal.z*normal;
+ outnormal = texnormal.x*tangent.xyz + texnormal.y*B + texnormal.z*normal;
outnormal = normalize(outnormal);
}
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index e11c2700855..b1557552143 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,1139 +1,1203 @@
/* DataToC output of file <gpu_shader_material_glsl> */
-int datatoc_gpu_shader_material_glsl_size= 34245;
+int datatoc_gpu_shader_material_glsl_size= 38950;
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,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,
+ 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, 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,
+ 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, 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,
+ 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, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,
+ 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,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,
+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, 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, 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,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,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, 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, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46,
- 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97,
- 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43,
- 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98,
- 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
- 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,105,120, 95,100,105,102,102, 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, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 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, 97,114,107, 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, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103,
- 98, 42,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,108,105,103,104,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, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,
-114,103, 98, 42,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,111,100,103,101, 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, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33,
- 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
- 42, 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116,
- 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,
-116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61,
- 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10,
- 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,
-116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,
-109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,
-101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49,
- 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9,
- 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98,
- 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
- 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,
-117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,
-111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98,
- 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
- 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,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,116,109,112, 44, 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,116,109,112, 32, 61, 32,102, 97,
- 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
- 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112,
- 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41,
- 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,
-105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,
- 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,
-102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46,
- 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,
-109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112,
- 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,
-101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48,
- 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32,
- 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32,
- 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,
- 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,
-109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,
-108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49,
- 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,
-111,105,100, 32,109,105,120, 95,104,117,101, 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,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,
-103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50,
- 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108,
- 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,
-116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,
-105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97,
- 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,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,118,101, 99, 52, 32,
-104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
-115,118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,
-116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102,
- 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111,
- 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
-120, 95,118, 97,108, 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,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50,
- 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,
-111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,
-109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103,
- 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,
-114, 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,118,
-101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,
- 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41,
- 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,
-104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121,
- 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,
-116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,
-111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
-120, 95,115,111,102,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,
+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, 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, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,
+111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,
+117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46,
+ 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97,
+ 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61,
+ 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43,
+ 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
+120, 95,100,105,102,102, 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,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99,
- 52, 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32,
- 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97,
- 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50,
- 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,
-105,110,101, 97,114, 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, 10, 9,111,117,116, 99,111,108, 32,
- 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116,
- 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114,
- 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49,
- 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,
- 9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,
-108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59,
- 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42,
- 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,
- 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97,
- 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,
-111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108,
- 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,
-111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116,
- 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97,
- 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112,
- 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10,
- 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,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, 99,111,108,111,114, 46,114, 42,
- 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46,
- 50, 59, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,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, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49,
- 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,
-108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111,
- 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,
-102,108,111, 97,116, 32,102, 97, 99, 44, 32,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,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,
- 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46,
- 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59,
- 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46,
- 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46,
- 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48,
- 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,
-101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,
-101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59,
- 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,
-116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98,
- 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,
-111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99,
- 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46,
- 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98,
- 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,
-123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41,
- 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 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,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,
-108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 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,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,
-116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,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, 40, 49, 46, 48, 43,118,101, 99, 46,
-120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117,
- 97,100, 40,118,101, 99, 51, 32,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,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32,
- 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100,
- 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,
-102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116,
- 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,
-118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,
-122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43,
- 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,
-114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109,
- 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,
-114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101,
- 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,
-108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,
-101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46,
- 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48,
- 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,
-114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45,
- 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,
-111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123,
- 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,
-117,118, 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, 47,
- 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,
-101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,
-105,110,103, 10, 9, 32, 32, 32,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, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99,
- 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,
-109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
-108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110,
- 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32,
- 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47,
- 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,
-101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,
-116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10,
- 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109,
- 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 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, 99,111, 44, 32, 49,
- 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109,
- 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,
-101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101,
- 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,
- 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,
-102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-114,101,102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44,
- 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101,
- 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123,
- 10, 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,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101,
- 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100,
- 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
-108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
- 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100,
- 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,
-116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
-111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,
- 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59,
- 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,
-111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,
-118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
- 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59,
- 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99,
- 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99,
- 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,
-117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121,
- 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,
-108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103,
- 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 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,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102,
- 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10,
- 9, 9,105,110, 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,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 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,105,110,
- 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
-116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 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,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120,
- 99,111,108, 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,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,
-108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10,
- 9,101,108,115,101, 10, 9, 9,105,110, 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,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 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,116,101,120, 95,114,103, 98, 95,115,117,
- 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108,
- 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,
-118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108,
- 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,
-111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99,
- 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123,
- 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102,
- 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61,
- 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,
-102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,
-111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
-111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,
-105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97,
- 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,
-111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51,
+ 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, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 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, 97,114,107, 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, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,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,108,105,103,104,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, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98,
+ 42,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,111,100,103,101, 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, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48,
+ 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,
+108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108,
+ 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,
+108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46,
+ 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,
+ 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,
+109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109,112, 32,
+ 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,
+101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41,
+ 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,
+116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61,
+ 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42,
+ 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,
+111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116,
+ 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,
+ 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10, 9,
+125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,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,116,109,112, 44, 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,116,109,112, 32, 61, 32,102, 97, 99,109, 32,
+ 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,
+111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,
+ 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32,
+ 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,
+116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,
+115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99,
+109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
+ 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32,
+ 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32,
+ 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,
+102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9,
+101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102,
+ 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
+ 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,
+112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41,
+ 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101,
+ 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59,
+ 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,105,120, 95,104,117,101, 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,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,
+116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32,
+ 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
+115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116,111, 95,
+114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,
+111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
+ 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,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,118,101, 99, 52, 32,104,115,118,
+ 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41,
+ 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,
+104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109,
+ 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103,
+ 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118,
+ 97,108, 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,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,
+114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, 95,104,
+115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,
+115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,
+115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 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,118,101, 99, 52,
+ 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108,
+ 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
+ 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118,
+ 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10, 9,
+ 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,
+108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116,
+ 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,
+111,102,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,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49,
+ 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108,
+ 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,
+ 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,
+108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101,
+ 97,114, 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, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,
+111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108,
+ 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, 45, 32,
+ 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32,
+ 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102,
+ 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,
+103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,
+108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46,
+ 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, 62,
+ 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40,
+ 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,
+ 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98,
+ 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, 97,116,
+ 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32,118,101,
+ 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, 10,123,
+ 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, 32,102,
+ 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,
+105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116,
+ 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48,
+ 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50,
+ 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,
+119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,
+100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,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, 46,120,121,122, 32, 61, 32,109,
+105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32,
+ 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108,
+ 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,
+108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+ 44, 32,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,
+118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41,
+ 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, 40,104,
+115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,
+104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, 91, 49,
+ 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93,
+ 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 49,
+ 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40,104,115,
+118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,
+115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95,116,111,
+ 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,
+120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112,
+ 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9,114, 32,
+ 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, 98, 59,
+ 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,
+111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10,
+ 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,
+105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,
+108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, 98,
+ 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 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,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51,
+ 32,118,101, 99, 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,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,
+100, 95,108,105,110, 40,118,101, 99, 51, 32,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, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125,
+ 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,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,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9,111,117,
+116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,
+119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,
+117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,
+109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99,
+ 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42,
+ 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40,
+ 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,
+119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51,
+ 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101,
+ 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,
+116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32,
+ 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111,114,109,
+ 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110,111,114,
+109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9,110,111,
+114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10,125, 10,
+ 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, 97,116,
+116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, 61, 32,
+ 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 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, 47, 42, 32,100,105,115, 97, 98,108,101,
+100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, 32,108,
+101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, 32,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, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 44, 32,
+ 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,
+114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32,
+ 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104, 32,105,
+115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98,108,101,
+110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111,114,109,
+ 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
+116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,111,117,116, 32,
+118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116, 32, 61,
+ 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,
+101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 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, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,
+120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,
+105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,
+111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32,
+ 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49,
+ 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101,
+ 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,
+123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119,
+ 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,
+114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 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,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109,
+ 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51,
32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97,
- 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,
-116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41,
- 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116,
+ 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
+ 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,
+101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116,
+ 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110,
+ 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,
+108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,
+109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48,
+ 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48,
+ 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51,
+ 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,
+ 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97,
+ 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 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,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43,
+ 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 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,116, 42, 40, 49,
+ 46, 48, 32, 45, 32,116,101,120, 99,111,108, 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,105,110, 99,111,108, 46,103,
+ 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120,
+ 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 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,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 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,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,
+102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101,
+ 10, 9, 9,105,110, 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,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 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,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99,
+ 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
+116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123,
+ 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,
+116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,
+111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,
+105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,
+108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116,
99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,
111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111,
- 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102,
- 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120,
- 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108,
- 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,
-114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108,
- 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101,
- 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116,
- 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,
-110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116,
- 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101,
- 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97,
- 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,
-123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97,
- 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97,
- 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41,
- 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,
-117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,
-105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108,
- 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32,
- 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,
-108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98,
- 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,
-101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,
-116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,
-102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,
-120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,
-111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99,
+ 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61,
+ 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41,
+ 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,
+111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32,
+ 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32,
+ 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,
+120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,
+116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,
+111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,
+116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32,
+ 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32,
+ 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,
+118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,
+118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97,
+ 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61,
+ 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114,
+ 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,
+ 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,
+111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,
+116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,
+108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,
+111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46,
+ 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,
+116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,
+108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,
+111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,
+102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,
+120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,
+108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108,
+ 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,
+108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,
+101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,
+116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,
+105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,
+116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99,
51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123,
- 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44,
+ 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44,
32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44,
32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103,
- 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116,
+ 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116,
99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,
111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99,
- 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52,
+ 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52,
40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41,
44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10,
- 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108,
- 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,
-111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,
-111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44,
- 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,
-118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116,
- 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,
-109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61,
- 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
-102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59,
- 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118,
- 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,
-101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,
-109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109,
- 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,
-111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,
-108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116,
- 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,
-111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118,
- 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32,
- 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,
-116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118,
- 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,
- 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,
-109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32,
- 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,
-111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
-120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,
- 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,
-109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,
-116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,
-118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
-120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
-116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
- 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,
-101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,
+ 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,
+118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102,
+ 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108,
+ 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,
+111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108,
+ 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100,
+ 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99,
+ 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103,
+ 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10,
+ 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,
+108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41,
+ 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10,
+ 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,
+102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116,
+ 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97,
+ 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,
+ 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,
+118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,
+105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,
+108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,
+111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116,
+ 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123,
+ 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102,
+ 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45,
+ 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120,
+ 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,
+115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,
108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,
108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120,
95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,
- 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,
-109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,
-101,108,115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,
-116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10,
- 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,
-109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116,
- 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
-116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111,
- 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
-109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,
-102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108,
- 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59,
- 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111,
- 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,
-103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,
-109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,
-102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108,
- 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59,
- 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
-101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97,
- 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61,
- 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
-116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,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,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,
-102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,
-111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48,
- 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10,
- 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53,
- 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
-111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46,
- 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99,
- 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,
-108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99,
- 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,
-110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32,
- 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
-117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111,
- 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45,
- 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,
-116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123,
- 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103,
- 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
-108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116,
- 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111,
- 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,
-116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110,
- 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120,
- 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52,
- 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,
-118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98,
- 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46,
- 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,
-108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115,
- 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,
-111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,
-101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,
-117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,
-111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,
-118,101, 99, 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,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46,
- 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,
-101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99,
- 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,
-109, 97, 44, 32,118,101, 99, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 9, 10, 9,110,111,
-114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114,
- 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48,
- 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,
-109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,
-109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108,
- 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,
-100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,
-110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44,
- 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,116, 97,110,103,101,110,116, 32,
- 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32,
- 99,114,111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 41, 59, 10, 10, 9,111,117,116,110,111,114,
-109, 97,108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 32, 43, 32,116,101,120,110,
-111,114,109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10,
- 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108,
- 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111,
- 97,116, 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,
-110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,
-117,116,110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108,
- 32, 43, 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32,
- 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42,
- 42, 42, 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,
-109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,
-118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,
-112,118,101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46,
- 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114,
- 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
-108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,
-115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,
-116, 32, 61, 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,
-108,118, 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,
-112, 95,102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,
-115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97,
- 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,
-115,116, 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102,
- 95,105,110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116,
- 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,
-105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116,
- 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,
-100,101,114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,
-102,108,111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116,
- 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,
-108, 97,109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108,
- 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,
-118,105,115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,
-119, 32, 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112,
- 95,102, 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115,
- 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,
-101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116,
- 41, 46,120, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,
-101,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,
-102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,
-102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116,
- 59, 10, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48,
- 46, 48, 41, 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,
-105,108,105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,
-109, 97,116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,105,110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62,
- 32, 48, 46, 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116,
- 42,118,101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61,
- 32,109, 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,
-118,114,111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,
-115,113,114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114,
- 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,
-115,112,111,116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,
-118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116,
- 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105,
- 98,105,108,105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,
-115,112,111,116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97,
- 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,
-116, 32,116, 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10,
- 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9,
- 9,116, 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42,
- 47, 10, 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61,
- 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59,
- 10, 10, 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,
-125, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,
-102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,
-102, 97, 99, 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32,
- 48, 46, 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104,
- 97,100,101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41,
- 10,123, 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,
-114, 97,112,104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110,
- 77, 97,116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40,
- 99,111, 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,
-105,100, 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51,
- 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32,
- 99,114,111,115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,
-111,115,115, 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,
-118,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110,
- 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112,
- 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115,
- 95,110,111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32,
- 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111,
- 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46,
- 53, 42,105,110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,
-101,110,101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,
-118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116,
- 32,114, 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,
-105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61,
- 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,
-101, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,
-121,122, 41, 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,
-101, 97, 91, 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,
-114,111,115,115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,
-111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59,
- 10, 9, 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44,
- 32,118,101, 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,
-115,115, 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32,
- 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91,
- 49, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10,
- 9,114, 97,100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51,
- 93, 41, 41, 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,
-118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44,
- 32, 99, 91, 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91,
- 49, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41,
- 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10,
- 9,114,101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99,
- 51, 32,108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44,
- 32,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,
-116, 32,107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61,
- 32,112,111,115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112,
- 99,111, 59, 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48,
- 41, 32,123, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,
-111, 97,116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,
-101, 97, 44, 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115,
- 42, 97,114,101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
-100,105,102,102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99,
- 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104,
- 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109,
- 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,
-116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,
-111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,
-100,111,116, 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10,
- 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48,
- 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111,
- 97,116, 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,
-108,111, 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111,
- 97,116, 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,
-116, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9,
- 9,118,101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,
-110, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32,
- 86,105,101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9,
- 9,105,102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116,
- 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10,
- 9, 9, 9, 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125,
- 10, 10, 9, 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104,
- 42,114,111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41,
- 59, 10, 9, 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104,
- 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32,
- 42, 61, 32, 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42,
- 32,115,105,110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108,
- 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,
-111,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116,
- 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,
-114,115,108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48,
- 59, 10, 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104,
- 41, 32,124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,
-101,108,115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,
-109,111,111,116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,
-110,110, 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44,
- 32,102,108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123,
- 10, 9,105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125,
+ 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48,
+ 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42,
+ 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,
+117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120,
+ 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,
+ 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120,
+ 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101,
+ 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44,
+ 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118,
+ 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,
+ 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108,
+ 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,
+118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,
+101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,
+101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116,
+ 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10,
+ 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,
+101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,
+108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120,
+ 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10,
+ 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,
+116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118,
+ 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
+116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
+ 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102,
+ 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101,
+ 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
+108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,
+120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,
+116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41,
+ 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102,
+ 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101,
+ 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,
+108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,
+116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,
+102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108,
+ 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41,
+ 10,123, 10, 9,111,117,116,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,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116,
+ 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,
+114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,
+109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,
+111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,
+102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101,
+ 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59,
+ 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,
+120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108,
+ 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41,
+ 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,
+105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44,
+ 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,
+118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
+116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,
+108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99,
+ 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,
+114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98,
+ 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,
+116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,
+110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97,
+ 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,
+105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61,
+ 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,
+115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,
+111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,
+110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,
+116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,
+120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,
+125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,
+101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120,
+ 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10,
+ 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 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,118,101, 99,
+ 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,
+101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,
+101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,
+ 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61,
+ 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,
+101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99,
+ 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51,
+ 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 47, 32, 84,104,101, 32,105,110,118,101,114,116, 32,111,102, 32,116,104,101,
+ 32,114,101,100, 32, 99,104, 97,110,110,101,108, 32,105,115, 32,116,111, 32,109, 97,107,101, 10, 9, 47, 47, 32,116,104,101, 32,
+110,111,114,109, 97,108, 32,109, 97,112, 32, 99,111,109,112,108,105, 97,110,116, 32,119,105,116,104, 32,116,104,101, 32,111,117,
+116,115,105,100,101, 32,119,111,114,108,100, 46, 10, 9, 47, 47, 32, 73,116, 32,110,101,101,100,115, 32,116,111, 32, 98,101, 32,
+100,111,110,101, 32, 98,101, 99, 97,117,115,101, 32,105,110, 32, 66,108,101,110,100,101,114, 10, 9, 47, 47, 32,116,104,101, 32,
+110,111,114,109, 97,108, 32,117,115,101,100, 32,112,111,105,110,116,115, 32,105,110,119, 97,114,100, 46, 10, 9, 47, 47, 32, 83,
+104,111,117,108,100, 32,116,104,105,115, 32,101,118,101,114, 32, 99,104, 97,110,103,101, 32,116,104,105,115, 32,110,101,103, 97,
+116,101, 32,109,117,115,116, 32, 98,101, 32,114,101,109,111,118,101,100, 46, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,
+111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,
+110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 45, 99,111,108,111,114, 46,114, 44, 32, 99,111,108,
+111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 45, 48, 46, 53, 44, 32, 48, 46, 53, 44,
+ 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,
+115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44,
+ 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99,
+ 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125,
+ 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,
+104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32,
+ 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,
+109, 52, 41, 10,123, 10, 9,109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,
+121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61,
+ 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,
+109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,
+114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32,
+ 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52,
+ 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,
+108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97,
+ 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116,
+ 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116,
+ 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,
+106, 41, 59, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,
+106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97,
+ 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
+ 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121,
+ 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,
+122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82,
+ 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61,
+ 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,
+100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,
+114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,
+108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100,
+ 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32,
+ 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,
+119, 50,111, 98,106, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115,
+ 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32,
+ 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118,
+ 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,
+117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,
+109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,
+112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,
+102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78,
+ 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,
+118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,
+117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116,
+ 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,
+118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59,
+ 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32,
+ 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109,
+ 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,
+108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,
+118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,
+101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116,
+ 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10,
+ 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,
+118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,
+100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77,
+ 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,
+105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99,
+ 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9,
+ 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,
+118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111,
+ 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
+118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118,
+ 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116,
+ 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102,
+ 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,
+114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32,
+ 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,
+120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,
+109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,
+103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,
+118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115,
+ 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32,
+ 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41,
+ 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,
+100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99,
+ 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,
+108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101,
+ 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61,
+ 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101,
+ 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,
+120,121, 41, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,
+116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32,
+ 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114,
+ 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109,
+ 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101,
+ 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32,
+ 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116,
+ 97,112, 53, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,
+102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116,
+ 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,
+121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41,
+ 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83,
+ 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,
+101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120,
+ 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32,
+ 84,101,120, 68,121, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48,
+ 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,
+100, 44, 72,117, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83,
+ 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,
+109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,
+101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,
+101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111,
+ 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9,
+ 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116,
+ 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,
+116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,
+116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51,
+ 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,
+118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,
+101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,
+105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,
+118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45,
+ 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,
+114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,
+101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,
+101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118,
+ 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51,
+ 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121,
+ 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,
+101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,
+100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,
+101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120,
+ 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,
+102, 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,
+110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42,
+ 84,101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+ 32,100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,
+120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9,
+ 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,
+114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101,
+ 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,
+116,101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99,
+ 51, 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122,
+ 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,
+101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,
+101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10,
+ 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109,
+ 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,
+116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114,
+109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111,
+117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59,
+ 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116,
+ 32,110,111,114,102, 97, 99, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,110,101,119,110,111,
+114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,
+110,111,114,109, 97,108, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32,110,111,114,102, 97, 99, 41, 42,110,111,114,109, 97,108, 32, 43,
+ 32,110,111,114,102, 97, 99, 42,110,101,119,110,111,114,109, 97,108, 59, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,
+110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42,
+ 42, 32, 77, 65, 84, 69, 82, 73, 65, 76, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,108, 97,109,112,
+ 95,118,105,115,105, 98,105,108,105,116,121, 95,115,117,110, 95,104,101,109,105, 40,118,101, 99, 51, 32,108, 97,109,112,118,101,
+ 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32,108, 97,109,112,118,
+101, 99, 59, 10, 9,100,105,115,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59,
+ 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,111,116,104,101,114, 40,118,
+101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,118,
+ 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,
+102, 97, 99, 41, 10,123, 10, 9,108,118, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111, 59, 10, 9,100,105,115,116, 32,
+ 61, 32,108,101,110,103,116,104, 40,108,118, 41, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118,
+ 41, 59, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,
+102, 97,108,108,111,102,102, 95,105,110,118,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,
+ 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41,
+ 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116,
+ 32, 43, 32,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,105,
+110,118,115,113,117, 97,114,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,
+105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102,
+ 97, 99, 32, 61, 32,108, 97,109,112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,100,105,115,116, 42,100,
+105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102, 97,108,108,111,102,102, 95,115,108,105,100,101,
+114,115, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,108,100, 49, 44, 32,102,108,
+111, 97,116, 32,108,100, 50, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118,
+105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116,107,119, 32, 61, 32,108, 97,
+109,112,100,105,115,116, 42,108, 97,109,112,100,105,115,116, 59, 10, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,108, 97,109,
+112,100,105,115,116, 47, 40,108, 97,109,112,100,105,115,116, 32, 43, 32,108,100, 49, 42,100,105,115,116, 41, 59, 10, 9,118,105,
+115,105,102, 97, 99, 32, 42, 61, 32,108, 97,109,112,100,105,115,116,107,119, 47, 40,108, 97,109,112,100,105,115,116,107,119, 32,
+ 43, 32,108,100, 50, 42,100,105,115,116, 42,100,105,115,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,102,
+ 97,108,108,111,102,102, 95, 99,117,114,118,101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,115, 97,109,
+112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,118,105,115,105,102, 97, 99, 32, 61, 32,116,101,120,
+116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,100,105,115,116, 47,108, 97,109,112,100,105,115,116, 41, 46,
+120, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,104,101,114,
+101, 40,102,108,111, 97,116, 32,108, 97,109,112,100,105,115,116, 44, 32,102,108,111, 97,116, 32,100,105,115,116, 44, 32,102,108,
+111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97,
+ 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 61, 32,108, 97,109,112,100,105,115,116, 32, 45, 32,100,105,115,116, 59, 10,
+ 10, 9,111,117,116,118,105,115,105,102, 97, 99, 61, 32,118,105,115,105,102, 97, 99, 42,109, 97,120, 40,116, 44, 32, 48, 46, 48,
+ 41, 47,108, 97,109,112,100,105,115,116, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,
+105,116,121, 95,115,112,111,116, 95,115,113,117, 97,114,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,109, 97,
+116, 52, 32,108, 97,109,112,105,109, 97,116, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+105,110,112,114, 41, 10,123, 10, 9,105,102, 40,100,111,116, 40,108,118, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 62, 32, 48,
+ 46, 48, 41, 32,123, 10, 9, 9,118,101, 99, 51, 32,108,118,114,111,116, 32, 61, 32, 40,108, 97,109,112,105,109, 97,116, 42,118,
+101, 99, 52, 40,108,118, 44, 32, 48, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, 9,102,108,111, 97,116, 32,120, 32, 61, 32,109,
+ 97,120, 40, 97, 98,115, 40,108,118,114,111,116, 46,120, 47,108,118,114,111,116, 46,122, 41, 44, 32, 97, 98,115, 40,108,118,114,
+111,116, 46,121, 47,108,118,114,111,116, 46,122, 41, 41, 59, 10, 10, 9, 9,105,110,112,114, 32, 61, 32, 49, 46, 48, 47,115,113,
+114,116, 40, 49, 46, 48, 32, 43, 32,120, 42,120, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 10, 9, 9,105,110,112,114, 32, 61,
+ 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95,115,112,
+111,116, 95, 99,105,114, 99,108,101, 40,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,108,118, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112,114, 41, 10,123, 10, 9,105,110,112,114, 32, 61, 32,100,111,116, 40,108,
+118, 44, 32,108, 97,109,112,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,
+108,105,116,121, 95,115,112,111,116, 40,102,108,111, 97,116, 32,115,112,111,116,115,105, 44, 32,102,108,111, 97,116, 32,115,112,
+111,116, 98,108, 44, 32,102,108,111, 97,116, 32,105,110,112,114, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44,
+ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,
+116, 32, 61, 32,115,112,111,116,115,105, 59, 10, 10, 9,105,102, 40,105,110,112,114, 32, 60, 61, 32,116, 41, 32,123, 10, 9, 9,
+111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116,
+ 32, 61, 32,105,110,112,114, 32, 45, 32,116, 59, 10, 10, 9, 9, 47, 42, 32,115,111,102,116, 32, 97,114,101, 97, 32, 42, 47, 10,
+ 9, 9,105,102, 40,115,112,111,116, 98,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,105,110,112,114, 32, 42, 61, 32,115,
+109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49, 46, 48, 44, 32,116, 47,115,112,111,116, 98,108, 41, 59, 10, 10,
+ 9, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32,118,105,115,105,102, 97, 99, 42,105,110,112,114, 59, 10, 9,125, 10,
+125, 10, 10,118,111,105,100, 32,108, 97,109,112, 95,118,105,115,105, 98,105,108,105,116,121, 95, 99,108, 97,109,112, 40,102,108,
+111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,105,115,105,102, 97,
+ 99, 41, 10,123, 10, 9,111,117,116,118,105,115,105,102, 97, 99, 32, 61, 32, 40,118,105,115,105,102, 97, 99, 32, 60, 32, 48, 46,
+ 48, 48, 49, 41, 63, 32, 48, 46, 48, 58, 32,118,105,115,105,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
+101, 95,118,105,101,119, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 41, 10,123,
+ 10, 9, 47, 42, 32,104, 97,110,100,108,101, 32,112,101,114,115,112,101, 99,116,105,118,101, 47,111,114,116,104,111,103,114, 97,
+112,104,105, 99, 32, 42, 47, 10, 9,118,105,101,119, 32, 61, 32, 40,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,
+116,114,105,120, 91, 51, 93, 91, 51, 93, 32, 61, 61, 32, 48, 46, 48, 41, 63, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111,
+ 41, 58, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 45, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
+ 32,115,104, 97,100,101, 95,116, 97,110,103,101,110,116, 95,118, 40,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,116,
+ 97,110,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99, 32, 61, 32, 99,114,
+111,115,115, 40,108,118, 44, 32,116, 97,110,103, 41, 59, 10, 9,118,101, 99, 51, 32,118,110,111,114, 32, 61, 32, 99,114,111,115,
+115, 40, 99, 44, 32,116, 97,110,103, 41, 59, 10, 10, 9,118,110, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,118,110,
+111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,110,112, 40,118,101, 99, 51, 32,118,110, 44, 32,
+118,101, 99, 51, 32,108,118, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,105,110,112, 32, 61,
+ 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,110,
+111, 95,100,105,102,102,117,115,101, 40,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,
+ 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,105,115, 95,104,101,109,105, 40,102,108,111, 97,116,
+ 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32, 48, 46, 53, 42,
+105,110,112, 32, 43, 32, 48, 46, 53, 59, 10,125, 10, 10,102,108,111, 97,116, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,
+101,114,103,121, 40,109, 97,116, 52, 32, 97,114,101, 97, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,118,110,
+ 41, 10,123, 10, 9,118,101, 99, 51, 32,118,101, 99, 91, 52, 93, 44, 32, 99, 91, 52, 93, 59, 10, 9,102,108,111, 97,116, 32,114,
+ 97,100, 91, 52, 93, 44, 32,102, 97, 99, 59, 10, 9, 10, 9,118,101, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,
+101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 48, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99, 91, 49, 93, 32, 61, 32,110,
+111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 49, 93, 46,120,121,122, 41, 59, 10, 9,118,101, 99,
+ 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97, 91, 50, 93, 46,120,121,122,
+ 41, 59, 10, 9,118,101, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 32, 45, 32, 97,114,101, 97,
+ 91, 51, 93, 46,120,121,122, 41, 59, 10, 10, 9, 99, 91, 48, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,
+115,115, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9, 99, 91, 49, 93, 32, 61, 32,110,111,114,
+109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,
+ 99, 91, 50, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115, 40,118,101, 99, 91, 50, 93, 44, 32,118,
+101, 99, 91, 51, 93, 41, 41, 59, 10, 9, 99, 91, 51, 93, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,114,111,115,115,
+ 40,118,101, 99, 91, 51, 93, 44, 32,118,101, 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,114, 97,100, 91, 48, 93, 32, 61, 32, 97, 99,
+111,115, 40,100,111,116, 40,118,101, 99, 91, 48, 93, 44, 32,118,101, 99, 91, 49, 93, 41, 41, 59, 10, 9,114, 97,100, 91, 49, 93,
+ 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 49, 93, 44, 32,118,101, 99, 91, 50, 93, 41, 41, 59, 10, 9,114,
+ 97,100, 91, 50, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 50, 93, 44, 32,118,101, 99, 91, 51, 93, 41,
+ 41, 59, 10, 9,114, 97,100, 91, 51, 93, 32, 61, 32, 97, 99,111,115, 40,100,111,116, 40,118,101, 99, 91, 51, 93, 44, 32,118,101,
+ 99, 91, 48, 93, 41, 41, 59, 10, 10, 9,102, 97, 99, 61, 32, 32,114, 97,100, 91, 48, 93, 42,100,111,116, 40,118,110, 44, 32, 99,
+ 91, 48, 93, 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 49, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 49, 93,
+ 41, 59, 10, 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 50, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 50, 93, 41, 59, 10,
+ 9,102, 97, 99, 43, 61, 32,114, 97,100, 91, 51, 93, 42,100,111,116, 40,118,110, 44, 32, 99, 91, 51, 93, 41, 59, 10, 10, 9,114,
+101,116,117,114,110, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95,105,110,112, 95, 97,114,101, 97, 40,118,101, 99, 51, 32,112,111,115,105,116,105,111,110, 44, 32,118,101, 99, 51, 32,
+108, 97,109,112, 99,111, 44, 32,118,101, 99, 51, 32,108, 97,109,112,118,101, 99, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,109,
+ 97,116, 52, 32, 97,114,101, 97, 44, 32,102,108,111, 97,116, 32, 97,114,101, 97,115,105,122,101, 44, 32,102,108,111, 97,116, 32,
+107, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,112, 41, 10,123, 10, 9,118,101, 99, 51, 32, 99,111, 32, 61, 32,112,
+111,115,105,116,105,111,110, 59, 10, 9,118,101, 99, 51, 32,118,101, 99, 32, 61, 32, 99,111, 32, 45, 32,108, 97,109,112, 99,111,
+ 59, 10, 10, 9,105,102, 40,100,111,116, 40,118,101, 99, 44, 32,108, 97,109,112,118,101, 99, 41, 32, 60, 32, 48, 46, 48, 41, 32,
+123, 10, 9, 9,105,110,112, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,
+116, 32,105,110,116,101,110,115, 32, 61, 32, 97,114,101, 97, 95,108, 97,109,112, 95,101,110,101,114,103,121, 40, 97,114,101, 97,
+ 44, 32, 99,111, 44, 32,118,110, 41, 59, 10, 10, 9, 9,105,110,112, 32, 61, 32,112,111,119, 40,105,110,116,101,110,115, 42, 97,
+114,101, 97,115,105,122,101, 44, 32,107, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,
+102,102,117,115,101, 95,111,114,101,110, 95,110, 97,121,101,114, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,
+110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,111,117,103,104, 44, 32,
+111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,
+105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,
+110, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116,
+ 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,114,101, 97,108,110,108, 32, 61, 32,100,111,
+116, 40,110, 44, 32,108, 41, 59, 10, 10, 9,105,102, 40,114,101, 97,108,110,108, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,
+105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,102, 40,110,108, 32, 60, 32, 48, 46, 48, 41, 32,
+123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116,
+ 32,118,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111,
+ 97,116, 32, 76,105,116, 95, 65, 32, 61, 32, 97, 99,111,115, 40,114,101, 97,108,110,108, 41, 59, 10, 9, 9,102,108,111, 97,116,
+ 32, 86,105,101,119, 95, 65, 32, 61, 32, 97, 99,111,115, 40,110,118, 41, 59, 10, 10, 9, 9,118,101, 99, 51, 32, 76,105,116, 95,
+ 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 45, 32,114,101, 97,108,110,108, 42,110, 41, 59, 10, 9, 9,118,
+101, 99, 51, 32, 86,105,101,119, 95, 66, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 45, 32,110,118, 42,110, 41,
+ 59, 10, 10, 9, 9,102,108,111, 97,116, 32,116, 32, 61, 32,109, 97,120, 40,100,111,116, 40, 76,105,116, 95, 66, 44, 32, 86,105,
+101,119, 95, 66, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,102,108,111, 97,116, 32, 97, 44, 32, 98, 59, 10, 10, 9, 9,105,
+102, 40, 76,105,116, 95, 65, 32, 62, 32, 86,105,101,119, 95, 65, 41, 32,123, 10, 9, 9, 9, 97, 32, 61, 32, 76,105,116, 95, 65,
+ 59, 10, 9, 9, 9, 98, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9,
+ 9, 97, 32, 61, 32, 86,105,101,119, 95, 65, 59, 10, 9, 9, 9, 98, 32, 61, 32, 76,105,116, 95, 65, 59, 10, 9, 9,125, 10, 10,
+ 9, 9,102,108,111, 97,116, 32, 65, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 48, 46, 53, 42, 40, 40,114,111,117,103,104, 42,114,
+111,117,103,104, 41, 47, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 51, 51, 41, 41, 41, 59, 10,
+ 9, 9,102,108,111, 97,116, 32, 66, 32, 61, 32, 48, 46, 52, 53, 42, 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 47,
+ 40, 40,114,111,117,103,104, 42,114,111,117,103,104, 41, 32, 43, 32, 48, 46, 48, 57, 41, 41, 59, 10, 10, 9, 9, 98, 32, 42, 61,
+ 32, 48, 46, 57, 53, 59, 10, 9, 9,105,115, 32, 61, 32,110,108, 42, 40, 65, 32, 43, 32, 40, 66, 32, 42, 32,116, 32, 42, 32,115,
+105,110, 40, 97, 41, 32, 42, 32,116, 97,110, 40, 98, 41, 41, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95,100,105,102,102,117,115,101, 95,116,111,111,110, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,
+118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,
+104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61,
+ 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,
+108,116, 41, 59, 10, 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,105,115, 32, 61, 32, 49, 46, 48, 59, 10,
+ 9,101,108,115,101, 32,105,102, 40, 97,110,103, 32, 62, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,
+124,124, 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,
+115,101, 32,105,115, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,
+111,116,104, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,100,105,102,102,117,115,101, 95,109,105,110,110,
+ 97,101,114,116, 40,102,108,111, 97,116, 32,110,108, 44, 32,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,
+108,111, 97,116, 32,100, 97,114,107,110,101,115,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,
+105,102, 40,110,108, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,105,115, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,
+101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118,
+ 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48, 41, 10,
+ 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41, 44, 32,
+100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32, 61, 32,
+110,108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49,
+ 46, 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,101, 99,
+ 51, 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,116, 32,
+102,102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32, 61, 32,
+ 49, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119, 44, 32,
+118,110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59, 10, 9,
+ 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32, 43, 32,
+ 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102, 40,116,
+ 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116, 50, 62,
+ 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61, 32,116,
+ 50, 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51,
+ 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,108,111,
+ 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,102,114,
+101,115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59, 10,125,
+ 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,117,116,
+ 32,102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,105,115,
+ 60, 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44, 32, 49,
+ 46, 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10, 10,118,
+111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116,
+ 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
+111,117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,105, 32,
+ 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47, 42,101,
+108,115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
+116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,118,101,
+ 99, 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99, 51, 32,
+108, 97,109,112, 99,111,108, 44, 32,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,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,105, 42,
+108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,118,101,
+ 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95,104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,101, 99,
+ 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,
+102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,108,
+118, 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41, 59, 10,
+ 10, 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32, 43, 32,
+ 48, 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44, 32,104,
+ 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99, 40,118,
+101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,
+100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32,
+ 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32,
+ 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99,
+ 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
+101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,
+118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,
+101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43,
+ 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,105,102,
+ 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125,
10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44,
- 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9, 9,105,102, 40,100, 97,114,107,110,101,115,115, 32, 60, 61, 32, 49, 46, 48,
- 41, 10, 9, 9, 9,105,115, 32, 61, 32,110,108, 42,112,111,119, 40,109, 97,120, 40,110,118, 42,110,108, 44, 32, 48, 46, 49, 41,
- 44, 32,100, 97,114,107,110,101,115,115, 32, 45, 32, 49, 46, 48, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,105,115, 32,
- 61, 32,110,108, 42,112,111,119, 40, 49, 46, 48, 48, 48, 49, 32, 45, 32,110,118, 44, 32,100, 97,114,107,110,101,115,115, 32, 45,
- 32, 49, 46, 48, 41, 59, 10, 9,125, 10,125, 10, 10,102,108,111, 97,116, 32,102,114,101,115,110,101,108, 95,102, 97, 99, 40,118,
-101, 99, 51, 32,118,105,101,119, 44, 32,118,101, 99, 51, 32,118,110, 44, 32,102,108,111, 97,116, 32,103,114, 97,100, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99, 41, 10,123, 10, 9,102,108,111, 97,116, 32,116, 49, 44, 32,116, 50, 59, 10, 9,102,108,111, 97,
-116, 32,102,102, 97, 99, 59, 10, 10, 9,105,102, 40,102, 97, 99, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,102,102, 97, 99, 32,
- 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,116, 49, 61, 32,100,111,116, 40,118,105,101,119,
- 44, 32,118,110, 41, 59, 10, 9, 9,105,102, 40,116, 49, 62, 48, 46, 48, 41, 32, 32,116, 50, 61, 32, 49, 46, 48, 43,116, 49, 59,
- 10, 9, 9,101,108,115,101, 32,116, 50, 61, 32, 49, 46, 48, 45,116, 49, 59, 10, 10, 9, 9,116, 50, 61, 32,103,114, 97,100, 32,
- 43, 32, 40, 49, 46, 48, 45,103,114, 97,100, 41, 42,112,111,119, 40,116, 50, 44, 32,102, 97, 99, 41, 59, 10, 10, 9, 9,105,102,
- 40,116, 50, 60, 48, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40,116,
- 50, 62, 49, 46, 48, 41, 32,102,102, 97, 99, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,102,102, 97, 99, 32, 61,
- 32,116, 50, 59, 10, 9,125, 10, 10, 9,114,101,116,117,114,110, 32,102,102, 97, 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95,100,105,102,102,117,115,101, 95,102,114,101,115,110,101,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101,
- 99, 51, 32,108,118, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 95,105, 44, 32,102,
-108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,115, 41, 10,123, 10, 9,105,115, 32, 61, 32,
-102,114,101,115,110,101,108, 95,102, 97, 99, 40,108,118, 44, 32,118,110, 44, 32,102, 97, 99, 95,105, 44, 32,102, 97, 99, 41, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 99,117, 98,105, 99, 40,102,108,111, 97,116, 32,105,115, 44, 32,111,
-117,116, 32,102,108,111, 97,116, 32,111,117,116,105,115, 41, 10,123, 10, 9,105,102, 40,105,115, 62, 48, 46, 48, 32, 38, 38, 32,
-105,115, 60, 49, 46, 48, 41, 10, 9, 9,111,117,116,105,115, 61, 32,115,109,111,111,116,104,115,116,101,112, 40, 48, 46, 48, 44,
- 32, 49, 46, 48, 44, 32,105,115, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,105,115, 61, 32,105,115, 59, 10,125, 10,
- 10,118,111,105,100, 32,115,104, 97,100,101, 95,118,105,115,105,102, 97, 99, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111,
- 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,102,108,111, 97,116, 32,114,101,102,108, 44, 32,111,117,116, 32,102,108,111, 97,
-116, 32,111,117,116,105, 41, 10,123, 10, 9, 47, 42,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 42, 47, 10, 9, 9,111,117,116,
-105, 32, 61, 32,109, 97,120, 40,105, 42,118,105,115,105,102, 97, 99, 42,114,101,102,108, 44, 32, 48, 46, 48, 41, 59, 10, 9, 47,
- 42,101,108,115,101, 10, 9, 9,111,117,116,105, 32, 61, 32,105, 59, 42, 47, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,116, 97,110,103,101,110,116, 95,118, 95,115,112,101, 99, 40,118,101, 99, 51, 32,116, 97,110,103, 44, 32,111,117,116, 32,
-118,101, 99, 51, 32,118,110, 41, 10,123, 10, 9,118,110, 32, 61, 32,116, 97,110,103, 59, 10,125, 10, 10,118,111,105,100, 32,115,
-104, 97,100,101, 95, 97,100,100, 95,116,111, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,105, 44, 32,118,101, 99,
- 51, 32,108, 97,109,112, 99,111,108, 44, 32,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,105,102, 40,105, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,
-105, 42,108, 97,109,112, 99,111,108, 42, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,
-118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,104,101,109,105, 95,115,112,101, 99, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,108,118, 44, 32,118,
-101, 99, 51, 32,118,105,101,119, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,104, 97,114,100,
- 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10,
- 9,108,118, 32, 43, 61, 32,118,105,101,119, 59, 10, 9,108,118, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,118, 41,
- 59, 10, 10, 9,116, 32, 61, 32,100,111,116, 40,118,110, 44, 32,108,118, 41, 59, 10, 9,116, 32, 61, 32, 48, 46, 53, 42,116, 32,
- 43, 32, 48, 46, 53, 59, 10, 10, 9,116, 32, 61, 32,118,105,115,105,102, 97, 99, 42,115,112,101, 99, 42,112,111,119, 40,116, 44,
- 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,112,104,111,110,103, 95,115,112,101, 99,
- 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104,
- 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,
-104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,
-116, 32, 61, 32,109, 97,120, 40,100,111,116, 40,104, 44, 32,110, 41, 44, 32, 48, 46, 48, 41, 59, 10, 10, 9,115,112,101, 99,102,
- 97, 99, 32, 61, 32,112,111,119, 40,114,115,108,116, 44, 32,104, 97,114,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104,
- 97,100,101, 95, 99,111,111,107,116,111,114,114, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108,
- 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,104, 97,114,100, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
-115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118,
- 32, 43, 32,108, 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 10, 9,
-105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10,
- 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,
-110, 44, 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44,
- 32,104, 97,114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101,
- 99,102, 97, 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110,
- 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,
-111, 97,116, 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,
-116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32,
- 49, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101,
- 32,105,102, 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102,
- 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,
-111,119,101,114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40,
- 49, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,
-112,111,119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,
-104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104,
- 32, 61, 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9,
- 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9,
- 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41,
- 59, 10, 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102,
- 40,110,108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48,
- 59, 10, 9, 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,
-109, 97,120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116,
- 32, 97, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,
-110,118, 41, 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108,
- 41, 47,118,104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,
-102, 40, 97, 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,
-101, 32,105,102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,
-101,108,115,101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10,
- 9, 9, 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,
-102,114, 97, 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102,
- 32, 61, 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,
-104, 41, 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,
-118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49,
- 46, 48, 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,
-111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99,
- 32, 61, 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,
-103, 41, 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41,
- 44, 32, 48, 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,
-101, 95,119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,
-101, 99, 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,
-102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118,
- 41, 59, 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46,
- 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44,
- 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,
-108, 41, 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97,
- 99,111,115, 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115,
- 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40,
- 52, 46, 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,
-100,101,114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41,
- 41, 47, 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
-116,111,111,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118,
- 44, 32,102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116,
- 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109,
- 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,
-104, 44, 32,110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10,
- 10, 9,105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,
-115,101, 32,105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124,
- 32,116,115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,
-115,101, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,
-109,111,111,116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,
-100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,
-102, 97, 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101,
- 99,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,
-112, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104,
- 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99,
- 44, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10,
- 9,116, 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97,
- 99, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,
-116, 44, 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 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,116, 42,108, 97,
-109,112, 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100,
- 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59,
- 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50,
- 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
-102,108,111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125,
- 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,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,111,117,116, 99,111,
-108, 32, 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108,
- 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,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, 42,102, 97, 99,
- 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108,
- 44, 32,118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103,
- 98, 44, 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,
-118,101, 99, 51, 32, 99,111,108,111,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, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42,
- 48, 46, 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104,
- 97,100,102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
-117,116,115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,
-114,103,121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
-100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,
-100,102, 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,
-101, 99, 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45,
- 32,118,101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
- 32,115,104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,
-116, 32,115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,
-101, 99, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,
- 32, 61, 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32,
- 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99,
- 51, 32,114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112,
- 44, 32,109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,
-111,119, 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,
-117,108,116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,
-116, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,
-115,104, 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,
- 9, 47, 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,
-115,104, 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115,
- 42, 99,111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,
-115,104, 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
+ 32,118, 41, 44, 32, 48, 46, 48, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,105, 32, 61, 32,112,111,119, 40,110,104, 44, 32,104,
+ 97,114,100, 41, 59, 10, 10, 9, 9,105, 32, 61, 32,105, 47, 40, 48, 46, 49, 43,110,118, 41, 59, 10, 9, 9,115,112,101, 99,102,
+ 97, 99, 32, 61, 32,105, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 98,108,105,110,110, 95,115,
+112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,102,108,111, 97,
+116, 32,114,101,102,114, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 95,112,111,119,101,114, 44, 32,111,117,116, 32,
+102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,105,102, 40,114,101,102,114, 97, 99, 32, 60, 32, 49, 46,
+ 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,105,
+102, 40,115,112,101, 99, 95,112,111,119,101,114, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,115,112,101, 99,102, 97, 99,
+ 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40,115,112,101, 99, 95,112,111,119,
+101,114, 60, 49, 48, 48, 46, 48, 41, 10, 9, 9, 9,115,112,101, 99, 95,112,111,119,101,114, 61, 32,115,113,114,116, 40, 49, 46,
+ 48, 47,115,112,101, 99, 95,112,111,119,101,114, 41, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,115,112,101, 99, 95,112,111,
+119,101,114, 61, 32, 49, 48, 46, 48, 47,115,112,101, 99, 95,112,111,119,101,114, 59, 10, 10, 9, 9,118,101, 99, 51, 32,104, 32,
+ 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 32, 43, 32,108, 41, 59, 10, 9, 9,102,108,111, 97,116, 32,110,104, 32, 61,
+ 32,100,111,116, 40,110, 44, 32,104, 41, 59, 10, 9, 9,105,102, 40,110,104, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9, 9,
+115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,125, 10, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9,102,
+108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10,
+ 9, 9, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,100,111,116, 40,110, 44, 32,108, 41, 59, 10, 9, 9, 9,105,102, 40,110,
+108, 32, 60, 61, 32, 48, 46, 48, 49, 41, 32,123, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61, 32, 48, 46, 48, 59, 10,
+ 9, 9, 9,125, 10, 9, 9, 9,101,108,115,101, 32,123, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,118,104, 32, 61, 32,109, 97,
+120, 40,100,111,116, 40,118, 44, 32,104, 41, 44, 32, 48, 46, 48, 49, 41, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 97,
+ 32, 61, 32, 49, 46, 48, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 98, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,118,
+ 41, 47,118,104, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32, 99, 32, 61, 32, 40, 50, 46, 48, 42,110,104, 42,110,108, 41, 47,
+118,104, 59, 10, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,103, 32, 61, 32, 48, 46, 48, 59, 10, 10, 9, 9, 9, 9,105,102, 40,
+ 97, 32, 60, 32, 98, 32, 38, 38, 32, 97, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 97, 59, 10, 9, 9, 9, 9,101,108,115,101, 32,
+105,102, 40, 98, 32, 60, 32, 97, 32, 38, 38, 32, 98, 32, 60, 32, 99, 41, 32,103, 32, 61, 32, 98, 59, 10, 9, 9, 9, 9,101,108,
+115,101, 32,105,102, 40, 99, 32, 60, 32, 97, 32, 38, 38, 32, 99, 32, 60, 32, 98, 41, 32,103, 32, 61, 32, 99, 59, 10, 10, 9, 9,
+ 9, 9,102,108,111, 97,116, 32,112, 32, 61, 32,115,113,114,116, 40, 40, 40,114,101,102,114, 97, 99, 32, 42, 32,114,101,102,114,
+ 97, 99, 41, 43, 40,118,104, 42,118,104, 41, 45, 49, 46, 48, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,116, 32,102, 32, 61,
+ 32, 40, 40, 40,112, 45,118,104, 41, 42, 40,112, 45,118,104, 41, 41, 47, 40, 40,112, 43,118,104, 41, 42, 40,112, 43,118,104, 41,
+ 41, 41, 42, 40, 49, 46, 48, 43, 40, 40, 40, 40,118,104, 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 42, 40, 40,118,104,
+ 42, 40,112, 43,118,104, 41, 41, 45, 49, 46, 48, 41, 41, 47, 40, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48,
+ 41, 42, 40, 40,118,104, 42, 40,112, 45,118,104, 41, 41, 43, 49, 46, 48, 41, 41, 41, 41, 59, 10, 9, 9, 9, 9,102,108,111, 97,
+116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,110,104, 41, 59, 10, 10, 9, 9, 9, 9,115,112,101, 99,102, 97, 99, 32, 61,
+ 32,109, 97,120, 40,102, 42,103, 42,101,120,112, 95, 98,108,101,110,100,101,114, 40, 40, 45, 40, 97,110,103, 42, 97,110,103, 41,
+ 47, 40, 50, 46, 48, 42,115,112,101, 99, 95,112,111,119,101,114, 42,115,112,101, 99, 95,112,111,119,101,114, 41, 41, 41, 44, 32,
+ 48, 46, 48, 41, 59, 10, 9, 9, 9,125, 10, 9, 9,125, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,
+119, 97,114,100,105,115,111, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99,
+ 51, 32,118, 44, 32,102,108,111, 97,116, 32,114,109,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,115,112,101, 99,102, 97,
+ 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108, 32, 43, 32,118, 41, 59,
+ 10, 9,102,108,111, 97,116, 32,110,104, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,104, 41, 44, 32, 48, 46, 48, 48,
+ 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,118, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,118, 41, 44, 32, 48,
+ 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32,110,108, 32, 61, 32,109, 97,120, 40,100,111,116, 40,110, 44, 32,108, 41,
+ 44, 32, 48, 46, 48, 48, 49, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103,108,101, 32, 61, 32,116, 97,110, 40, 97, 99,111,
+115, 40,110,104, 41, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,108,112,104, 97, 32, 61, 32,109, 97,120, 40,114,109,115, 44, 32,
+ 48, 46, 48, 48, 49, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 61, 32,110,108, 32, 42, 32, 40, 49, 46, 48, 47, 40, 52, 46,
+ 48, 42, 77, 95, 80, 73, 42, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 42, 40,101,120,112, 95, 98,108,101,110,100,101,
+114, 40, 45, 40, 97,110,103,108,101, 42, 97,110,103,108,101, 41, 47, 40, 97,108,112,104, 97, 42, 97,108,112,104, 97, 41, 41, 47,
+ 40,115,113,114,116, 40,110,118, 42,110,108, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,116,111,
+111,110, 95,115,112,101, 99, 40,118,101, 99, 51, 32,110, 44, 32,118,101, 99, 51, 32,108, 44, 32,118,101, 99, 51, 32,118, 44, 32,
+102,108,111, 97,116, 32,115,105,122,101, 44, 32,102,108,111, 97,116, 32,116,115,109,111,111,116,104, 44, 32,111,117,116, 32,102,
+108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 41, 10,123, 10, 9,118,101, 99, 51, 32,104, 32, 61, 32,110,111,114,109, 97,108,
+105,122,101, 40,108, 32, 43, 32,118, 41, 59, 10, 9,102,108,111, 97,116, 32,114,115,108,116, 32, 61, 32,100,111,116, 40,104, 44,
+ 32,110, 41, 59, 10, 9,102,108,111, 97,116, 32, 97,110,103, 32, 61, 32, 97, 99,111,115, 40,114,115,108,116, 41, 59, 10, 10, 9,
+105,102, 40, 97,110,103, 32, 60, 32,115,105,122,101, 41, 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101,
+ 32,105,102, 40, 97,110,103, 32, 62, 61, 32, 40,115,105,122,101, 32, 43, 32,116,115,109,111,111,116,104, 41, 32,124,124, 32,116,
+115,109,111,111,116,104, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,115,108,116, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101,
+ 32,114,115,108,116, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40, 40, 97,110,103, 32, 45, 32,115,105,122,101, 41, 47,116,115,109,111,
+111,116,104, 41, 59, 10, 10, 9,115,112,101, 99,102, 97, 99, 32, 61, 32,114,115,108,116, 59, 10,125, 10, 10,118,111,105,100, 32,
+115,104, 97,100,101, 95,115,112,101, 99, 95, 97,114,101, 97, 95,105,110,112, 40,102,108,111, 97,116, 32,115,112,101, 99,102, 97,
+ 99, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,112,101, 99,102,
+ 97, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99,102, 97, 99, 32, 61, 32,115,112,101, 99,102, 97, 99, 42,105,110,112, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,115,112,101, 99, 95,116, 40,102,108,111, 97,116, 32,115,104, 97,100,
+102, 97, 99, 44, 32,102,108,111, 97,116, 32,115,112,101, 99, 44, 32,102,108,111, 97,116, 32,118,105,115,105,102, 97, 99, 44, 32,
+102,108,111, 97,116, 32,115,112,101, 99,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,116, 41, 10,123, 10, 9,116,
+ 32, 61, 32,115,104, 97,100,102, 97, 99, 42,115,112,101, 99, 42,118,105,115,105,102, 97, 99, 42,115,112,101, 99,102, 97, 99, 59,
+ 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 95,115,112,101, 99, 40,102,108,111, 97,116, 32,116, 44,
+ 32,118,101, 99, 51, 32,108, 97,109,112, 99,111,108, 44, 32,118,101, 99, 51, 32,115,112,101, 99, 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,116, 42,108, 97,109,112,
+ 99,111,108, 42,115,112,101, 99, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95, 97,100,100, 40,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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 59, 10,125,
+ 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100, 40,118,101, 99, 52, 32, 99,111,108, 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,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 32, 43, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,
+125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109, 97,100,100,102, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,
+111, 97,116, 32,102, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 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, 32, 43, 32,102, 42, 99,111,108, 49, 59, 10,125, 10, 10,
+118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 40,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,111,117,116, 99,111,108, 32,
+ 61, 32, 99,111,108, 49, 42, 99,111,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,109,117,108, 95,118,
+ 97,108,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,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, 42,102, 97, 99, 59, 10,
+125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,111, 98, 99,111,108,111,114, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
+118,101, 99, 52, 32,111, 98, 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,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 42,111, 98, 99,111,108, 46,114,103, 98, 44,
+ 32, 99,111,108, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114, 97,109,112, 95,114,103, 98,116,111, 98,119, 40,118,101,
+ 99, 51, 32, 99,111,108,111,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, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46,
+ 53, 56, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 49, 50, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95,111,110,108,121, 95,115,104, 97,100,111,119, 40,102,108,111, 97,116, 32,105, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,
+102, 97, 99, 44, 32,102,108,111, 97,116, 32,101,110,101,114,103,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
+115,104, 97,100,102, 97, 99, 41, 10,123, 10, 9,111,117,116,115,104, 97,100,102, 97, 99, 32, 61, 32,105, 42,101,110,101,114,103,
+121, 42, 40, 49, 46, 48, 32, 45, 32,115,104, 97,100,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,100,105,102,102,117,115,101, 40,102,108,111, 97,116, 32,115,104, 97,100,102,
+ 97, 99, 44, 32,118,101, 99, 51, 32,114,103, 98, 44, 32,118,101, 99, 52, 32,100,105,102,102, 44, 32,111,117,116, 32,118,101, 99,
+ 52, 32,111,117,116,100,105,102,102, 41, 10,123, 10, 9,111,117,116,100,105,102,102, 32, 61, 32,100,105,102,102, 32, 45, 32,118,
+101, 99, 52, 40,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,
+104, 97,100,101, 95,111,110,108,121, 95,115,104, 97,100,111,119, 95,115,112,101, 99,117,108, 97,114, 40,102,108,111, 97,116, 32,
+115,104, 97,100,102, 97, 99, 44, 32,118,101, 99, 51, 32,115,112,101, 99,114,103, 98, 44, 32,118,101, 99, 52, 32,115,112,101, 99,
+ 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,115,112,101, 99, 41, 10,123, 10, 9,111,117,116,115,112,101, 99, 32, 61,
+ 32,115,112,101, 99, 32, 45, 32,118,101, 99, 52, 40,115,112,101, 99,114,103, 98, 42,115,104, 97,100,102, 97, 99, 44, 32, 48, 46,
+ 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,115,116, 95,115,104, 97,100,111,119, 98,117,102, 40,118,101, 99, 51, 32,
+114, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 83,104, 97,100,111,119, 32,115,104, 97,100,111,119,109, 97,112, 44, 32,
+109, 97,116, 52, 32,115,104, 97,100,111,119,112,101,114,115,109, 97,116, 44, 32,102,108,111, 97,116, 32,115,104, 97,100,111,119,
+ 98,105, 97,115, 44, 32,102,108,111, 97,116, 32,105,110,112, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114,101,115,117,108,
+116, 41, 10,123, 10, 9,105,102, 40,105,110,112, 32, 60, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,101,115,117,108,116, 32,
+ 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,115,104,
+ 97,100,111,119,112,101,114,115,109, 97,116, 42,118,101, 99, 52, 40,114, 99,111, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9, 9, 47,
+ 47,102,108,111, 97,116, 32, 98,105, 97,115, 32, 61, 32, 40, 49, 46, 53, 32, 45, 32,105,110,112, 42,105,110,112, 41, 42,115,104,
+ 97,100,111,119, 98,105, 97,115, 59, 10, 9, 9, 99,111, 46,122, 32, 45, 61, 32,115,104, 97,100,111,119, 98,105, 97,115, 42, 99,
+111, 46,119, 59, 10, 10, 9, 9,114,101,115,117,108,116, 32, 61, 32,115,104, 97,100,111,119, 50, 68, 80,114,111,106, 40,115,104,
+ 97,100,111,119,109, 97,112, 44, 32, 99,111, 41, 46,120, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101,
+ 95,101,120,112,111,115,117,114,101, 95, 99,111,114,114,101, 99,116, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,102,108,111, 97,
+116, 32,108,105,110,102, 97, 99, 44, 32,102,108,111, 97,116, 32,108,111,103,102, 97, 99, 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,108,105,110,102, 97, 99, 42, 40, 49, 46, 48,
+ 32, 45, 32,101,120,112, 40, 99,111,108, 42,108,111,103,102, 97, 99, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,
100,101, 95,109,105,115,116, 95,102, 97, 99,116,111,114, 40,118,101, 99, 51, 32, 99,111, 44, 32,102,108,111, 97,116, 32,109,105,
115,116,115,116, 97, 44, 32,102,108,111, 97,116, 32,109,105,115,116,100,105,115,116, 44, 32,102,108,111, 97,116, 32,109,105,115,
116,116,121,112,101, 44, 32,102,108,111, 97,116, 32,109,105,115,105, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,
diff --git a/source/blender/gpu/intern/gpu_shader_vertex.glsl b/source/blender/gpu/intern/gpu_shader_vertex.glsl
index ba9ef7dead6..a86431bdd7a 100644
--- a/source/blender/gpu/intern/gpu_shader_vertex.glsl
+++ b/source/blender/gpu/intern/gpu_shader_vertex.glsl
@@ -7,6 +7,6 @@ void main()
vec4 co = gl_ModelViewMatrix * gl_Vertex;
varposition = co.xyz;
- varnormal = gl_NormalMatrix * gl_Normal;
+ varnormal = normalize(gl_NormalMatrix * gl_Normal);
gl_Position = gl_ProjectionMatrix * co;
diff --git a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
index edf93d838d5..5d9bd7c60d9 100644
--- a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
@@ -1,13 +1,14 @@
/* DataToC output of file <gpu_shader_vertex_glsl> */
-int datatoc_gpu_shader_vertex_glsl_size= 217;
+int datatoc_gpu_shader_vertex_glsl_size= 228;
char datatoc_gpu_shader_vertex_glsl[]= {
- 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110,
- 59, 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32,
-109, 97,105,110, 40, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119,
- 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 86,101,114,116,101,120, 59, 10, 10, 9,118, 97,114,112,111,115,105,116,105,111,
-110, 32, 61, 32, 99,111, 46,120,121,122, 59, 10, 9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,103,108, 95, 78,111,114,109,
- 97,108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 59, 10, 9,103,108, 95, 80,111,115,105,116,105,
+ 10,118, 97,114,
+121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110, 59, 10,118, 97,114,121,105,110,103, 32,118,
+101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32,109, 97,105,110, 40, 41, 10,123, 10, 9,118,
+101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 32, 42, 32,103,108,
+ 95, 86,101,114,116,101,120, 59, 10, 10, 9,118, 97,114,112,111,115,105,116,105,111,110, 32, 61, 32, 99,111, 46,120,121,122, 59,
+ 10, 9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,103,108, 95, 78,111,114,109, 97,
+108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 41, 59, 10, 9,103,108, 95, 80,111,115,105,116,105,
111,110, 32, 61, 32,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 32, 42, 32, 99,111, 59, 10, 10,
0};
diff --git a/source/blender/ikplugin/BIK_api.h b/source/blender/ikplugin/BIK_api.h
index 0f0703486a3..2ccd70723a3 100644
--- a/source/blender/ikplugin/BIK_api.h
+++ b/source/blender/ikplugin/BIK_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -73,7 +73,6 @@ int BIK_get_solver_param(struct bPose *pose, struct bPoseChannel *pchan, int id,
// number of solver available
// 0 = iksolver
// 1 = iTaSC
-#define BIK_SOLVER_COUNT 2
/* for use in BIK_get_constraint_param */
#define BIK_PARAM_CONSTRAINT_ERROR 0
diff --git a/source/blender/ikplugin/CMakeLists.txt b/source/blender/ikplugin/CMakeLists.txt
index ef1f4d450b9..47c773756a9 100644
--- a/source/blender/ikplugin/CMakeLists.txt
+++ b/source/blender/ikplugin/CMakeLists.txt
@@ -24,12 +24,32 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c intern/*.cpp)
+set(INC
+ ../blenlib
+ ../makesdna
+ ../blenkernel
+ ../ikplugin
+ ../../../intern/guardedalloc
+ ../../../intern/iksolver/extern
+)
+
+set(SRC
+ intern/ikplugin_api.c
+ intern/iksolver_plugin.c
-SET(INC
- ../../../intern/guardedalloc ../../../intern/iksolver/extern
- ../../../intern/itasc ../../../extern/Eigen2
- ../blenlib ../makesdna ../blenkernel ../include ../ikplugin
+ BIK_api.h
+ intern/ikplugin_api.h
+ intern/iksolver_plugin.h
+ intern/itasc_plugin.h
)
-BLENDERLIB(bf_ikplugin "${SRC}" "${INC}")
+if(WITH_IK_ITASC)
+ add_definitions(-DWITH_IK_ITASC)
+ list(APPEND INC ../../../extern/Eigen2)
+ list(APPEND INC ../../../intern/itasc)
+ list(APPEND SRC
+ ./intern/itasc_plugin.cpp
+ )
+endif()
+
+blender_add_lib(bf_ikplugin "${SRC}" "${INC}")
diff --git a/source/blender/ikplugin/Makefile b/source/blender/ikplugin/Makefile
deleted file mode 100644
index 28726586cc8..00000000000
--- a/source/blender/ikplugin/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# ***** 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.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/ikplugin
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/ikplugin/SConscript b/source/blender/ikplugin/SConscript
index a745a93077a..f60c42f8dc9 100644
--- a/source/blender/ikplugin/SConscript
+++ b/source/blender/ikplugin/SConscript
@@ -1,9 +1,11 @@
#!/usr/bin/python
Import ('env')
-
+defs = []
sources = env.Glob('intern/*.c') + env.Glob('intern/*.cpp')
incs = '#/intern/guardedalloc #/intern/iksolver/extern ../makesdna ../blenlib'
incs += ' ../blenkernel ../include ../ikplugin #/intern/itasc #/extern/Eigen2'
-env.BlenderLib ( 'bf_ikplugin', sources, Split(incs), [], libtype=['core','player'], priority=[180, 190] )
+defs.append('WITH_IK_ITASC')
+
+env.BlenderLib ( 'bf_ikplugin', sources, Split(incs), defs, libtype=['core','player'], priority=[180, 190] )
diff --git a/source/blender/ikplugin/intern/Makefile b/source/blender/ikplugin/intern/Makefile
deleted file mode 100644
index 352ab90df9d..00000000000
--- a/source/blender/ikplugin/intern/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-# ***** 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.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = ikplugin
-DIR = $(OCGDIR)/blender/ikplugin
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-CFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CFLAGS += -I../../makesdna
-CFLAGS += -I../../blenkernel
-CFLAGS += -I../../blenlib
-CFLAGS += -I../../include
-CFLAGS += -I../../../../intern/itasc
-CFLAGS += -I../../../../extern/Eigen2
-CFLAGS += -I..
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_IKSOLVER)/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../include
-CPPFLAGS += -I../../../../intern/itasc
-CPPFLAGS += -I../../../../extern/Eigen2
-CPPFLAGS += -I..
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
index cdc4ee11518..e26e3150669 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.c
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -33,7 +33,7 @@
#include "BLI_math.h"
#include "BKE_armature.h"
-#include "BKE_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_action_types.h"
#include "DNA_scene_types.h"
@@ -42,10 +42,12 @@
#include "ikplugin_api.h"
#include "iksolver_plugin.h"
-#include "itasc_plugin.h"
+#ifdef WITH_IK_ITASC
+#include "itasc_plugin.h"
+#endif
-static IKPlugin ikplugin_tab[BIK_SOLVER_COUNT] = {
+static IKPlugin ikplugin_tab[] = {
/* Legacy IK solver */
{
iksolver_initialize_tree,
@@ -55,6 +57,7 @@ static IKPlugin ikplugin_tab[BIK_SOLVER_COUNT] = {
NULL,
NULL,
NULL,
+#ifdef WITH_IK_ITASC
},
/* iTaSC IK solver */
{
@@ -65,13 +68,13 @@ static IKPlugin ikplugin_tab[BIK_SOLVER_COUNT] = {
itasc_clear_cache,
itasc_update_param,
itasc_test_constraint,
+#endif
}
};
-
static IKPlugin *get_plugin(bPose *pose)
{
- if (!pose || pose->iksolver < 0 || pose->iksolver >= BIK_SOLVER_COUNT)
+ if (!pose || pose->iksolver < 0 || pose->iksolver >= (sizeof(ikplugin_tab) / sizeof(IKPlugin)))
return NULL;
return &ikplugin_tab[pose->iksolver];
@@ -135,3 +138,4 @@ void BIK_test_constraint(struct Object *ob, struct bConstraint *cons)
if (plugin && plugin->test_constraint)
plugin->test_constraint(ob, cons);
}
+
diff --git a/source/blender/ikplugin/intern/ikplugin_api.h b/source/blender/ikplugin/intern/ikplugin_api.h
index edd98c5c239..f93c7ccd292 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.h
+++ b/source/blender/ikplugin/intern/ikplugin_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index 9c0f151aa8b..a79d46c2780 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -32,10 +32,11 @@
#include "BIK_api.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_constraint.h"
-#include "BKE_utildefines.h"
+
#include "DNA_object_types.h"
#include "DNA_action_types.h"
#include "DNA_constraint_types.h"
@@ -50,7 +51,7 @@
/* allocates PoseTree, and links that to root bone/channel */
/* Note: detecting the IK chain is duplicate code... in drawarmature.c and in transform_conversions.c */
-static void initialize_posetree(struct Object *ob, bPoseChannel *pchan_tip)
+static void initialize_posetree(struct Object *UNUSED(ob), bPoseChannel *pchan_tip)
{
bPoseChannel *curchan, *pchan_root=NULL, *chanlist[256], **oldchan;
PoseTree *tree;
@@ -488,7 +489,7 @@ static void free_posetree(PoseTree *tree)
///----------------------------------------
/// Plugin API for legacy iksolver
-void iksolver_initialize_tree(struct Scene *scene, struct Object *ob, float ctime)
+void iksolver_initialize_tree(struct Scene *UNUSED(scene), struct Object *ob, float UNUSED(ctime))
{
bPoseChannel *pchan;
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.h b/source/blender/ikplugin/intern/iksolver_plugin.h
index d41cc785c12..0cf03e78d8d 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.h
+++ b/source/blender/ikplugin/intern/iksolver_plugin.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
index 1be567371c6..e392a05cc54 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.cpp
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -32,6 +32,7 @@
#include <vector>
// iTaSC headers
+#ifdef WITH_IK_ITASC
#include "Armature.hpp"
#include "MovingFrame.hpp"
#include "CopyPose.hpp"
@@ -40,6 +41,7 @@
#include "Scene.hpp"
#include "Cache.hpp"
#include "Distance.hpp"
+#endif
#include "MEM_guardedalloc.h"
@@ -47,6 +49,7 @@ extern "C" {
#include "BIK_api.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_armature.h"
diff --git a/source/blender/ikplugin/intern/itasc_plugin.h b/source/blender/ikplugin/intern/itasc_plugin.h
index 8f7eaedcd31..906fa9c8ed3 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.h
+++ b/source/blender/ikplugin/intern/itasc_plugin.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt
index 49886bdc46f..c2c9c89ad10 100644
--- a/source/blender/imbuf/CMakeLists.txt
+++ b/source/blender/imbuf/CMakeLists.txt
@@ -24,60 +24,121 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-
-SET(INC
+set(INC
.
- ../makesdna
- ../../../intern/guardedalloc
- ../../../intern/memutil
- ../blenlib
../avi
+ ../blenlib
../blenkernel
- ${JPEG_INC}
- ${PNG_INC}
- ${ZLIB_INC}
+ ../blenloader
+ ../makesdna
+ ../../../intern/memutil
+ ../../../intern/guardedalloc
+ ${JPEG_INCLUDE_DIR}
+ ${PNG_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIRS}
+)
+
+set(SRC
+ intern/allocimbuf.c
+ intern/anim_movie.c
+ intern/bmp.c
+ intern/cache.c
+ intern/divers.c
+ intern/filetype.c
+ intern/filter.c
+ intern/imageprocess.c
+ intern/iris.c
+ intern/jp2.c
+ intern/jpeg.c
+ intern/md5.c
+ intern/metadata.c
+ intern/module.c
+ intern/png.c
+ intern/radiance_hdr.c
+ intern/readimage.c
+ intern/rectop.c
+ intern/rotate.c
+ intern/scaling.c
+ intern/targa.c
+ intern/thumbs.c
+ intern/thumbs_blend.c
+ intern/tiff.c
+ intern/util.c
+ intern/writeimage.c
+
+ IMB_imbuf.h
+ IMB_imbuf_types.h
+ IMB_thumbs.h
+ intern/IMB_allocimbuf.h
+ intern/IMB_anim.h
+ intern/IMB_filetype.h
+ intern/IMB_filter.h
+ intern/IMB_metadata.h
+ intern/cineon/cin_debug_stuff.h
+ intern/cineon/cineonfile.h
+ intern/cineon/cineonlib.h
+ intern/cineon/dpxfile.h
+ intern/cineon/dpxlib.h
+ intern/cineon/logImageCore.h
+ intern/cineon/logImageLib.h
+ intern/cineon/logmemfile.h
+ intern/dds/BlockDXT.h
+ intern/dds/Color.h
+ intern/dds/ColorBlock.h
+ intern/dds/Common.h
+ intern/dds/DirectDrawSurface.h
+ intern/dds/Image.h
+ intern/dds/PixelFormat.h
+ intern/dds/Stream.h
+ intern/dds/dds_api.h
+ intern/imbuf.h
+ intern/md5.h
+ intern/openexr/openexr_api.h
+ intern/openexr/openexr_multi.h
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_TIFF)
+ list(APPEND INC ${TIFF_INCLUDE_DIR})
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_TIFF)
- SET(INC ${INC} ${TIFF_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_OPENJPEG)
+ list(APPEND INC ${OPENJPEG_INC})
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- SET(INC ${INC} ${OPENJPEG_INC})
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_REDCODE)
+ list(APPEND INC ${REDCODE_INC})
+ add_definitions(-DWITH_REDCODE)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC
+ ../quicktime
+ ${QUICKTIME_INC}
+ )
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-BLENDERLIB(bf_imbuf "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 07b99dddfa5..625e684ea67 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -1,13 +1,39 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
/**
* @file IMB_imbuf.h
* @brief IMage Buffer module.
*
* This module offers import/export of several graphical file formats.
- * \ref IMB
* @ingroup imbuf
- * @ingroup undoc
*
- * @page IMB - Imbuf module external interface
+ * @page IMB Imbuf module external interface
*
*
* @section about About the IMB module
@@ -30,42 +56,14 @@
* @section dependencies Dependencies
*
* IMB needs:
- * - SDNA module
+ * - \ref DNA module
* The listbase types are used for handling the memory
* management.
- * - blenlib module
+ * - \ref blenlib module
* blenlib handles guarded memory management in blender-style.
* BLI_winstuff.h makes a few windows specific behaviours
* posix-compliant.
*/
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
#ifndef IMB_IMBUF_H
#define IMB_IMBUF_H
@@ -93,7 +91,7 @@ void IMB_exit(void);
*
* @attention Defined in readimage.c
*/
-struct ImBuf *IMB_ibImageFromMemory(unsigned char *mem, int size, int flags);
+struct ImBuf *IMB_ibImageFromMemory(unsigned char *mem, size_t size, int flags);
/**
*
@@ -117,9 +115,8 @@ void IMB_freeImBuf(struct ImBuf *ibuf);
*
* @attention Defined in allocimbuf.c
*/
-struct ImBuf *IMB_allocImBuf(short x, short y,
- unsigned char d, unsigned int flags,
- unsigned char bitmap);
+struct ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y,
+ unsigned char d, unsigned int flags);
/**
*
@@ -207,7 +204,7 @@ void IMB_close_anim(struct anim *anim);
* @attention Defined in anim.c
*/
-int ismovie(char *name);
+int ismovie(const char *name);
void IMB_anim_set_preseek(struct anim *anim, int preseek);
int IMB_anim_get_preseek(struct anim *anim);
@@ -245,6 +242,7 @@ void IMB_filter(struct ImBuf *ibuf);
void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
+void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
/**
@@ -272,19 +270,19 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1);
*
* @attention Defined in scaling.c
*/
-struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, short newx, short newy);
+struct ImBuf *IMB_scaleImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/**
*
* @attention Defined in scaling.c
*/
-struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy);
+struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy);
/**
*
* @attention Defined in writeimage.c
*/
-short IMB_saveiff(struct ImBuf *ibuf,char *naam,int flags);
+short IMB_saveiff(struct ImBuf *ibuf, const char *filepath, int flags);
/**
* Encodes a png image from an ImBuf
@@ -297,19 +295,19 @@ short IMB_png_encode(struct ImBuf *ibuf, int file, int flags);
*
* @attention Defined in util.c
*/
-int IMB_ispic(char *name);
+int IMB_ispic(const char *name);
/**
*
* @attention Defined in util.c
*/
-int IMB_isanim(char *name);
+int IMB_isanim(const char *name);
/**
*
* @attention Defined in util.c
*/
-int imb_get_anim_type(char *name);
+int imb_get_anim_type(const char *name);
/**
*
@@ -322,6 +320,7 @@ void IMB_float_from_rect(struct ImBuf *ibuf);
void IMB_float_from_rect_simple(struct ImBuf *ibuf); /* no profile conversion */
/* note, check that the conversion exists, only some are supported */
void IMB_convert_profile(struct ImBuf *ibuf, int profile);
+float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc);
/**
* Change the ordering of the color bytes pointed to by rect from
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 203a7268581..81512adf065 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* IMB_imbuf_types.h (mar-2001 nzc)
*
* Types needed for using the image buffer.
@@ -54,7 +54,6 @@ struct ImMetaData;
#define IB_FILENAME_SIZE 1023
/**
- * \brief The basic imbuf type
* \ingroup imbuf
* This is the abstraction of an image. ImBuf is the basic type used for all
* imbuf operations.
@@ -71,7 +70,11 @@ typedef struct ImBuf {
struct ImBuf *next, *prev; /**< allow lists of ImBufs, for caches or flipbooks */
/* dimensions */
- short x, y; /* width and Height of our image buffer */
+ int x, y; /* width and Height of our image buffer.
+ * Should be 'unsigned int' since most formats use this.
+ * but this is problematic with texture math in imagetexture.c
+ * avoid problems and use int. - campbell */
+
unsigned char depth; /* Active amount of bits/bitplanes */
int channels; /* amount of channels in rect_float (0 = 4 channel default) */
@@ -127,17 +130,13 @@ typedef struct ImBuf {
/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */
/**
- * \brief Flags used internally by blender for imagebuffers
+ * \brief userflags: Flags used internally by blender for imagebuffers
*/
#define IB_BITMAPFONT (1 << 0) /* this image is a font */
#define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */
-
-/* From iff.h. This was once moved away by Frank, now Nzc moves it
- * back. Such is the way it is... It is a long list of defines, and
- * there are a few external defines in the back. Most of the stuff is
- * probably imbuf_intern only. This will need to be merged later
- * on. */
+#define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */
+#define IB_RECT_INVALID (1 << 3) /* float buffer changed, needs recreation of byte rect */
/**
* \name Imbuf Component flags
diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h
index 9248b768cb6..ae7ccab98a1 100644
--- a/source/blender/imbuf/IMB_thumbs.h
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -69,12 +69,15 @@ void IMB_thumb_delete(const char* path, ThumbSize size);
ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source);
/* create the necessary dirs to store the thumbnails */
-void IMB_thumb_makedirs();
+void IMB_thumb_makedirs(void);
/* special function for loading a thumbnail embedded into a blend file */
ImBuf *IMB_loadblend_thumb(const char *path);
void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float aspect);
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
#endif /* _IMB_THUMBS_H */
diff --git a/source/blender/imbuf/Makefile b/source/blender/imbuf/Makefile
deleted file mode 100644
index 78eea89173f..00000000000
--- a/source/blender/imbuf/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/imbuf
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 6b3360a16c5..ecb9a89c274 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('intern/*.c')
incs = '. ../makesdna #/intern/guardedalloc #/intern/memutil ../blenlib'
-incs += ' ../avi ../blenkernel'
+incs += ' ../avi ../blenkernel ../blenloader'
incs += ' ' + env['BF_JPEG_INC']
@@ -45,7 +45,7 @@ if env['WITH_BF_REDCODE']:
incs += ' ' + env['BF_REDCODE_INC']
if env['WITH_BF_QUICKTIME']:
- incs += ' ../quicktime ' + env['BF_QUICKTIME_INC']
- defs.append('WITH_QUICKTIME')
+ incs += ' ../quicktime ' + env['BF_QUICKTIME_INC']
+ defs.append('WITH_QUICKTIME')
env.BlenderLib ( libname = 'bf_imbuf', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [185,115] )
diff --git a/source/blender/imbuf/intern/IMB_allocimbuf.h b/source/blender/imbuf/intern/IMB_allocimbuf.h
index e6f3abc26b0..bfe53f30321 100644
--- a/source/blender/imbuf/intern/IMB_allocimbuf.h
+++ b/source/blender/imbuf/intern/IMB_allocimbuf.h
@@ -39,15 +39,11 @@
struct ImBuf;
-short imb_addrectImBuf(struct ImBuf * ibuf);
-short imb_addrectfloatImBuf(struct ImBuf * ibuf);
short imb_addplanesImBuf(struct ImBuf *ibuf);
short imb_addencodedbufferImBuf(struct ImBuf *ibuf);
short imb_enlargeencodedbufferImBuf(struct ImBuf *ibuf);
-void imb_freerectImBuf(struct ImBuf *ibuf);
-void imb_freerectfloatImBuf(struct ImBuf *ibuf);
void imb_freeplanesImBuf(struct ImBuf *ibuf);
short imb_addcmapImBuf(struct ImBuf *ibuf);
diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h
index c9eac2c1399..ea492d8bbf5 100644
--- a/source/blender/imbuf/intern/IMB_anim.h
+++ b/source/blender/imbuf/intern/IMB_anim.h
@@ -1,4 +1,4 @@
-/**
+/*
* allocimbuf.h
*
* $Id$
@@ -110,19 +110,14 @@
#define LITTLE_LONG ENDIAN_NOP
#endif
-/****/
-
-#define ANIM_NONE (0)
-#define ANIM_SEQUENCE (1 << 0)
-#define ANIM_DIR (1 << 1)
-#define ANIM_DEPRECATED (1 << 2)
-#define ANIM_TGA (1 << 3)
+/* anim.curtype, runtime only */
+#define ANIM_NONE 0
+#define ANIM_SEQUENCE (1 << 0)
#define ANIM_MOVIE (1 << 4)
-#define ANIM_MDEC (1 << 5)
#define ANIM_AVI (1 << 6)
#define ANIM_QTIME (1 << 7)
-#define ANIM_FFMPEG (1 << 8)
-#define ANIM_REDCODE (1 << 9)
+#define ANIM_FFMPEG (1 << 8)
+#define ANIM_REDCODE (1 << 9)
#define MAXNUMSTREAMS 50
diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h
index 9fd4108bee9..a1066634aea 100644
--- a/source/blender/imbuf/intern/IMB_filetype.h
+++ b/source/blender/imbuf/intern/IMB_filetype.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,9 +37,9 @@ typedef struct ImFileType {
int (*is_a)(unsigned char *buf);
int (*ftype)(struct ImFileType *type, struct ImBuf *ibuf);
- struct ImBuf *(*load)(unsigned char *mem, int size, int flags);
- int (*save)(struct ImBuf *ibuf, char *name, int flags);
- void (*load_tile)(struct ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, unsigned int *rect);
+ struct ImBuf *(*load)(unsigned char *mem, size_t size, int flags);
+ int (*save)(struct ImBuf *ibuf, const char *name, int flags);
+ void (*load_tile)(struct ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int ty, unsigned int *rect);
int flag;
int filetype;
@@ -60,61 +60,60 @@ void imb_tile_cache_tile_free(struct ImBuf *ibuf, int tx, int ty);
/* png */
int imb_is_a_png(unsigned char *buf);
-struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags);
-int imb_savepng(struct ImBuf *ibuf, char *name, int flags);
+struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags);
+int imb_savepng(struct ImBuf *ibuf, const char *name, int flags);
/* targa */
int imb_is_a_targa(unsigned char *buf);
-struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags);
-int imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
+struct ImBuf *imb_loadtarga(unsigned char *mem, size_t size, int flags);
+int imb_savetarga(struct ImBuf * ibuf, const char *name, int flags);
/* iris */
int imb_is_a_iris(unsigned char *mem);
-struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags);
-int imb_saveiris(struct ImBuf * ibuf, char *name, int flags);
+struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags);
+int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags);
/* jp2 */
int imb_is_a_jp2(unsigned char *buf);
-struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags);
-int imb_savejp2(struct ImBuf *ibuf, char *name, int flags);
+struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags);
+int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags);
/* jpeg */
int imb_is_a_jpeg(unsigned char *mem);
-int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags);
-struct ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags);
-struct ImBuf * imb_load_jpeg (unsigned char * buffer, int size, int flags);
+int imb_savejpeg(struct ImBuf *ibuf, const char *name, int flags);
+struct ImBuf * imb_load_jpeg (unsigned char * buffer, size_t size, int flags);
/* bmp */
int imb_is_a_bmp(unsigned char *buf);
-struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags);
-int imb_savebmp(struct ImBuf *ibuf, char *name, int flags);
+struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags);
+int imb_savebmp(struct ImBuf *ibuf, const char *name, int flags);
/* cocoa */
-struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags);
-short imb_cocoaSaveImage(struct ImBuf *ibuf, char *name, int flags);
+struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, size_t size, int flags);
+short imb_cocoaSaveImage(struct ImBuf *ibuf, const char *name, int flags);
/* cineon */
-int imb_savecineon(struct ImBuf *buf, char *myfil, int flags);
-struct ImBuf *imb_loadcineon(unsigned char *mem, int size, int flags);
+int imb_savecineon(struct ImBuf *buf, const char *name, int flags);
+struct ImBuf *imb_loadcineon(unsigned char *mem, size_t size, int flags);
int imb_is_cineon(unsigned char *buf);
/* dpx */
-int imb_save_dpx(struct ImBuf *buf, char *myfile, int flags);
-struct ImBuf *imb_loaddpx(unsigned char *mem, int size, int flags);
+int imb_save_dpx(struct ImBuf *buf, const char *name, int flags);
+struct ImBuf *imb_loaddpx(unsigned char *mem, size_t size, int flags);
int imb_is_dpx(unsigned char *buf);
/* hdr */
int imb_is_a_hdr(unsigned char *buf);
-struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags);
-int imb_savehdr(struct ImBuf * ibuf, char *name, int flags);
+struct ImBuf *imb_loadhdr(unsigned char *mem, size_t size, int flags);
+int imb_savehdr(struct ImBuf * ibuf, const char *name, int flags);
/* tiff */
void imb_inittiff(void);
int imb_is_a_tiff(unsigned char *buf);
-struct ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags);
-void imb_loadtiletiff(struct ImBuf *ibuf, unsigned char *mem, int size,
+struct ImBuf *imb_loadtiff(unsigned char *mem, size_t size, int flags);
+void imb_loadtiletiff(struct ImBuf *ibuf, unsigned char *mem, size_t size,
int tx, int ty, unsigned int *rect);
-int imb_savetiff(struct ImBuf *ibuf, char *name, int flags);
+int imb_savetiff(struct ImBuf *ibuf, const char *name, int flags);
void *libtiff_findsymbol(char *name);
#endif /* IMB_FILETYPE_H */
diff --git a/source/blender/imbuf/intern/IMB_filter.h b/source/blender/imbuf/intern/IMB_filter.h
index 84ad72c520a..0d414cb4702 100644
--- a/source/blender/imbuf/intern/IMB_filter.h
+++ b/source/blender/imbuf/intern/IMB_filter.h
@@ -44,5 +44,7 @@ void imb_filterx(struct ImBuf *ibuf);
void IMB_premultiply_rect(unsigned int *rect, int depth, int w, int h);
void IMB_premultiply_rect_float(float *rect_float, int depth, int w, int h);
+void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1);
+
#endif
diff --git a/source/blender/imbuf/intern/IMB_metadata.h b/source/blender/imbuf/intern/IMB_metadata.h
index 625e0791e07..9011c7d04a7 100644
--- a/source/blender/imbuf/intern/IMB_metadata.h
+++ b/source/blender/imbuf/intern/IMB_metadata.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile
deleted file mode 100644
index 8e7272100b9..00000000000
--- a/source/blender/imbuf/intern/Makefile
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = imbuf
-DIR = $(OCGDIR)/blender/imbuf
-SOURCEDIR = source/blender/imbuf/intern
-
-include nan_subdirs.mk
-include nan_compile.mk
-include nan_definitions.mk
-
-DIRS =
-
-ifeq ($(WITH_CINEON), true)
- DIRS += cineon
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- DIRS += openexr
- CFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- DIRS += dds
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- ifndef BF_OPENJPEG_INC
- CFLAGS += -DWITH_OPENJPEG -I../../../../extern/libopenjpeg
- else
- CFLAGS += -DWITH_OPENJPEG -I$(BF_OPENJPEG_INC)
- endif
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I../../include
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../avi
-CPPFLAGS += -I../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../makesdna
-# external interface of this module
-CPPFLAGS += -I..
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
- CPPFLAGS += -I$(NAN_TIFF)/include
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 3f440c0bf6f..99b3c3a58d6 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -32,6 +32,8 @@
/* It's become a bit messy... Basically, only the IMB_ prefixed files
* should remain. */
+#include <stddef.h>
+
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -275,7 +277,8 @@ short imb_addrectfloatImBuf(ImBuf *ibuf)
if(ibuf==NULL) return FALSE;
- imb_freerectfloatImBuf(ibuf);
+ if(ibuf->rect_float)
+ imb_freerectfloatImBuf(ibuf); /* frees mipmap too, hrm */
size = ibuf->x *ibuf->y;
size = size *4 *sizeof(float);
@@ -296,8 +299,12 @@ short imb_addrectImBuf(ImBuf *ibuf)
int size;
if(ibuf==NULL) return FALSE;
- imb_freerectImBuf(ibuf);
-
+
+ /* don't call imb_freerectImBuf, it frees mipmaps, this call is used only too give float buffers display */
+ if(ibuf->rect && (ibuf->mall & IB_rect))
+ MEM_freeN(ibuf->rect);
+ ibuf->rect= NULL;
+
size = ibuf->x*ibuf->y;
size = size*sizeof(unsigned int);
@@ -322,7 +329,7 @@ short imb_addtilesImBuf(ImBuf *ibuf)
return (ibuf->tiles != NULL);
}
-ImBuf *IMB_allocImBuf(short x, short y, uchar d, unsigned int flags, uchar bitmap) /* XXX bitmap argument is deprecated */
+ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y, uchar d, unsigned int flags)
{
ImBuf *ibuf;
@@ -382,7 +389,7 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
y = ibuf1->y;
if(ibuf1->flags & IB_fields) y *= 2;
- ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags, 0);
+ ibuf2 = IMB_allocImBuf(x, y, ibuf1->depth, flags);
if(ibuf2 == NULL) return NULL;
if(flags & IB_rect)
@@ -441,7 +448,7 @@ static void imbuf_cache_destructor(void *data)
ibuf->c_handle = 0;
}
-static MEM_CacheLimiterC **get_imbuf_cache_limiter()
+static MEM_CacheLimiterC **get_imbuf_cache_limiter(void)
{
static MEM_CacheLimiterC *c = 0;
@@ -451,7 +458,7 @@ static MEM_CacheLimiterC **get_imbuf_cache_limiter()
return &c;
}
-void IMB_free_cache_limiter()
+void IMB_free_cache_limiter(void)
{
delete_MEM_CacheLimiter(*get_imbuf_cache_limiter());
*get_imbuf_cache_limiter() = 0;
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim_movie.c
index 096ed499f85..15369e17b28 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -1,4 +1,4 @@
-/**
+/*
* anim.c
*
* $Id$
@@ -60,9 +60,13 @@
#include "BLI_blenlib.h" /* BLI_remlink BLI_filesize BLI_addtail
BLI_countlist BLI_stringdec */
+#include "BLI_utildefines.h"
+
#include "MEM_guardedalloc.h"
#include "DNA_userdef_types.h"
+
+
#include "BKE_global.h"
#include "BKE_depsgraph.h"
@@ -163,7 +167,7 @@ static ImBuf * movie_fetchibuf(struct anim * anim, int position) {
if (anim == 0) return (0);
- ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect, 0);
+ ibuf = IMB_allocImBuf(anim->x, anim->y, 24, IB_rect);
if ( mvReadFrames(anim->track, position, 1, ibuf->x * ibuf->y *
sizeof(int), ibuf->rect ) != DM_SUCCESS ) {
@@ -214,14 +218,14 @@ int ismovie(char *name) {
#else
-int ismovie(char *name) {
+int ismovie(const char *UNUSED(name)) {
return 0;
}
/* never called, just keep the linker happy */
-static int startmovie(struct anim * anim) { return 1; }
-static ImBuf * movie_fetchibuf(struct anim * anim, int position) { return NULL; }
-static void free_anim_movie(struct anim * anim) { ; }
+static int startmovie(struct anim *UNUSED(anim)) { return 1; }
+static ImBuf * movie_fetchibuf(struct anim *UNUSED(anim), int UNUSED(position)) { return NULL; }
+static void free_anim_movie(struct anim *UNUSED(anim)) { ; }
#endif
@@ -483,7 +487,7 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
#else
if (1) {
#endif
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, IB_rect, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, IB_rect);
tmp = AVI_read_frame (anim->avi, AVI_FORMAT_RGB32, position,
AVI_get_stream(anim->avi, AVIST_VIDEO, 0));
@@ -509,7 +513,7 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
#ifdef WITH_FFMPEG
-extern void do_init_ffmpeg();
+extern void do_init_ffmpeg(void);
#ifdef FFMPEG_CODEC_IS_POINTER
static AVCodecContext* get_codec_from_stream(AVStream* stream)
@@ -809,7 +813,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
if (anim == 0) return (0);
- ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect);
avpicture_fill((AVPicture*) anim->pFrameRGB,
(unsigned char*) ibuf->rect,
@@ -838,7 +842,15 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
}
+/* disable seek_by_bytes for now, since bitrates are guessed wrong!
+ also: MPEG2TS-seeking was fixed in later versions of ffmpeg, so problem
+ is somewhat fixed by now (until we add correct timecode management code...)
+*/
+#if 0
seek_by_bytes = !!(anim->pFormatCtx->iformat->flags & AVFMT_TS_DISCONT);
+#else
+ seek_by_bytes = FALSE;
+#endif
if (position != anim->curposition + 1) {
#ifdef FFMPEG_OLD_FRAME_RATE
@@ -850,12 +862,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
av_q2d(anim->pFormatCtx->streams[anim->videoStream]
->r_frame_rate);
#endif
- double time_base =
- av_q2d(anim->pFormatCtx->streams[anim->videoStream]
- ->time_base);
+ double pts_time_base = av_q2d(anim->pFormatCtx->streams[anim->videoStream]->time_base);
long long pos;
- long long st_time = anim->pFormatCtx
- ->streams[anim->videoStream]->start_time;
+ long long st_time = anim->pFormatCtx->start_time;
int ret;
if (seek_by_bytes) {
@@ -875,7 +884,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
if (st_time != AV_NOPTS_VALUE) {
- pos += st_time * AV_TIME_BASE * time_base;
+ pos += st_time;
}
}
@@ -890,9 +899,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
pts_to_search = (long long)
- (((double) position) / time_base / frame_rate);
+ (((double) position) / pts_time_base / frame_rate);
if (st_time != AV_NOPTS_VALUE) {
- pts_to_search += st_time;
+ pts_to_search += st_time / pts_time_base/ AV_TIME_BASE;
}
pos_found = 0;
@@ -998,7 +1007,7 @@ static ImBuf * redcode_fetchibuf(struct anim * anim, int position) {
}
ibuf = IMB_allocImBuf(raw_frame->width * 2,
- raw_frame->height * 2, 32, IB_rectfloat, 0);
+ raw_frame->height * 2, 32, IB_rectfloat);
redcode_decode_video_float(raw_frame, ibuf->rect_float, 1);
@@ -1050,31 +1059,31 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
break;
case ANIM_MOVIE:
if (startmovie(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0); /* fake */
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0); /* fake */
break;
case ANIM_AVI:
if (startavi(anim)) {
printf("couldnt start avi\n");
return (0);
}
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#ifdef WITH_QUICKTIME
case ANIM_QTIME:
if (startquicktime(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#endif
#ifdef WITH_FFMPEG
case ANIM_FFMPEG:
if (startffmpeg(anim)) return (0);
- ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
#endif
#ifdef WITH_REDCODE
case ANIM_REDCODE:
if (startredcode(anim)) return (0);
- ibuf = IMB_allocImBuf (8, 8, 32, 0, 0);
+ ibuf = IMB_allocImBuf (8, 8, 32, 0);
break;
#endif
}
diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c
index bdcf60090c3..cf2638071bb 100644
--- a/source/blender/imbuf/intern/bmp.c
+++ b/source/blender/imbuf/intern/bmp.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -101,13 +101,15 @@ int imb_is_a_bmp(unsigned char *buf) {
return checkbmp(buf);
}
-struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
{
struct ImBuf *ibuf = 0;
BMPINFOHEADER bmi;
int x, y, depth, skip, i;
unsigned char *bmp, *rect;
unsigned short col;
+
+ (void)size; /* unused */
if (checkbmp(mem) == 0) return(0);
@@ -129,9 +131,9 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, int size, int flags)
/* printf("skip: %d, x: %d y: %d, depth: %d (%x)\n", skip, x, y,
depth, bmi.biBitCount); */
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(x, y, depth, 0, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, 0);
} else {
- ibuf = IMB_allocImBuf(x, y, depth, IB_rect, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, IB_rect);
bmp = mem + skip;
rect = (unsigned char *) ibuf->rect;
@@ -193,12 +195,14 @@ static int putShortLSB(unsigned short us,FILE *ofile) {
}
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_savebmp(struct ImBuf *ibuf, char *name, int flags) {
+int imb_savebmp(struct ImBuf *ibuf, const char *name, int flags) {
BMPINFOHEADER infoheader;
int bytesize, extrabytes, x, y, t, ptr;
uchar *data;
FILE *ofile;
+
+ (void)flags; /* unused */
extrabytes = (4 - ibuf->x*3 % 4) % 4;
bytesize = (ibuf->x * 3 + extrabytes) * ibuf->y;
diff --git a/source/blender/imbuf/intern/cache.c b/source/blender/imbuf/intern/cache.c
index 77e01d8ebef..23f0dd87b1a 100644
--- a/source/blender/imbuf/intern/cache.c
+++ b/source/blender/imbuf/intern/cache.c
@@ -22,12 +22,13 @@
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_listbase.h"
#include "BLI_memarena.h"
#include "BLI_threads.h"
-#include "BKE_utildefines.h"
+
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -82,40 +83,42 @@ typedef struct ImGlobalTileCache {
int totthread;
ThreadMutex mutex;
+
+ int initialized;
} ImGlobalTileCache;
static ImGlobalTileCache GLOBAL_CACHE;
/***************************** Hash Functions ********************************/
-static unsigned int imb_global_tile_hash(void *gtile_p)
+static unsigned int imb_global_tile_hash(const void *gtile_p)
{
- ImGlobalTile *gtile= gtile_p;
+ const ImGlobalTile *gtile= gtile_p;
return ((unsigned int)(intptr_t)gtile->ibuf)*769 + gtile->tx*53 + gtile->ty*97;
}
-static int imb_global_tile_cmp(void *a_p, void *b_p)
+static int imb_global_tile_cmp(const void *a_p, const void *b_p)
{
- ImGlobalTile *a= a_p;
- ImGlobalTile *b= b_p;
+ const ImGlobalTile *a= a_p;
+ const ImGlobalTile *b= b_p;
if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0;
else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1;
else return 1;
}
-static unsigned int imb_thread_tile_hash(void *ttile_p)
+static unsigned int imb_thread_tile_hash(const void *ttile_p)
{
- ImThreadTile *ttile= ttile_p;
+ const ImThreadTile *ttile= ttile_p;
return ((unsigned int)(intptr_t)ttile->ibuf)*769 + ttile->tx*53 + ttile->ty*97;
}
-static int imb_thread_tile_cmp(void *a_p, void *b_p)
+static int imb_thread_tile_cmp(const void *a_p, const void *b_p)
{
- ImThreadTile *a= a_p;
- ImThreadTile *b= b_p;
+ const ImThreadTile *a= a_p;
+ const ImThreadTile *b= b_p;
if(a->ibuf == b->ibuf && a->tx == b->tx && a->ty == b->ty) return 0;
else if(a->ibuf < b->ibuf || a->tx < b->tx || a->ty < b->ty) return -1;
@@ -203,6 +206,8 @@ void imb_tile_cache_init(void)
/* initialize for one thread, for places that access textures
outside of rendering (displace modifier, painting, ..) */
IMB_tile_cache_params(0, 0);
+
+ GLOBAL_CACHE.initialized = 1;
}
void imb_tile_cache_exit(void)
@@ -210,19 +215,23 @@ void imb_tile_cache_exit(void)
ImGlobalTile *gtile;
int a;
- for(gtile=GLOBAL_CACHE.tiles.first; gtile; gtile=gtile->next)
- imb_global_cache_tile_unload(gtile);
+ if(GLOBAL_CACHE.initialized) {
+ for(gtile=GLOBAL_CACHE.tiles.first; gtile; gtile=gtile->next)
+ imb_global_cache_tile_unload(gtile);
+
+ for(a=0; a<GLOBAL_CACHE.totthread; a++)
+ imb_thread_cache_exit(&GLOBAL_CACHE.thread_cache[a]);
- for(a=0; a<GLOBAL_CACHE.totthread; a++)
- imb_thread_cache_exit(&GLOBAL_CACHE.thread_cache[a]);
+ if(GLOBAL_CACHE.memarena)
+ BLI_memarena_free(GLOBAL_CACHE.memarena);
- if(GLOBAL_CACHE.memarena)
- BLI_memarena_free(GLOBAL_CACHE.memarena);
+ if(GLOBAL_CACHE.tilehash)
+ BLI_ghash_free(GLOBAL_CACHE.tilehash, NULL, NULL);
- if(GLOBAL_CACHE.tilehash)
- BLI_ghash_free(GLOBAL_CACHE.tilehash, NULL, NULL);
+ BLI_mutex_end(&GLOBAL_CACHE.mutex);
- BLI_mutex_end(&GLOBAL_CACHE.mutex);
+ memset(&GLOBAL_CACHE, 0, sizeof(ImGlobalTileCache));
+ }
}
/* presumed to be called when no threads are running */
diff --git a/source/blender/imbuf/intern/cineon/CMakeLists.txt b/source/blender/imbuf/intern/cineon/CMakeLists.txt
index cd887b6fc4e..92cba72c094 100644
--- a/source/blender/imbuf/intern/cineon/CMakeLists.txt
+++ b/source/blender/imbuf/intern/cineon/CMakeLists.txt
@@ -24,17 +24,24 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
.
- ../../../blenkernel
- ../../
..
+ ../..
+ ../../../blenkernel
+ ../../../blenloader
../../../blenlib
- intern/include
- ../../../../../intern/guardedalloc
../../../makesdna
+ ../../../../../intern/guardedalloc
+)
+
+set(SRC
+ cineon_dpx.c
+ cineonlib.c
+ dpxlib.c
+ logImageCore.c
+ logImageLib.c
+ logmemfile.c
)
-BLENDERLIB(bf_cineon "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf_cineon "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/cineon/Makefile b/source/blender/imbuf/intern/cineon/Makefile
deleted file mode 100644
index 6e940d530a9..00000000000
--- a/source/blender/imbuf/intern/cineon/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = cineon
-DIR = $(OCGDIR)/blender/imbuf/cineon
-SOURCEDIR = source/blender/imbuf/intern/cineon
-
-include nan_compile.mk
-include nan_definitions.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_TIFF)/include
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../avi
-CPPFLAGS += -I../../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../../makesdna
-# external interface of this module
-CPPFLAGS += -I../..
diff --git a/source/blender/imbuf/intern/cineon/SConscript b/source/blender/imbuf/intern/cineon/SConscript
index d9c8ab14d35..e1afb5ebd2d 100644
--- a/source/blender/imbuf/intern/cineon/SConscript
+++ b/source/blender/imbuf/intern/cineon/SConscript
@@ -5,6 +5,7 @@ source_files = env.Glob('*.c')
incs = ['.',
'../../../blenkernel',
+ '../../../blenloader',
'../../',
'..',
'../../../blenlib',
@@ -14,4 +15,4 @@ incs = ['.',
defs = []
-env.BlenderLib ('bf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [220,175])
+env.BlenderLib ('bf_imbuf_cineon', source_files, incs, defs, libtype=['core','player'], priority = [220,175])
diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c
index a9b229536cb..9882a9ea5ae 100644
--- a/source/blender/imbuf/intern/cineon/cineon_dpx.c
+++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -44,6 +44,7 @@
#include "MEM_guardedalloc.h"
+#if 0
static void cineon_conversion_parameters(LogImageByteConversionParameters *params)
{
// params->blackPoint = scene?scene->r.cineonblack:95;
@@ -55,8 +56,8 @@ static void cineon_conversion_parameters(LogImageByteConversionParameters *param
params->whitePoint = 685;
params->gamma = 1.0f;
params->doLogarithm = 0;
-
}
+#endif
static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int size, int flags)
{
@@ -88,7 +89,7 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
return NULL;
}
- ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags, 0);
+ ibuf = IMB_allocImBuf(width, height, 32, IB_rectfloat | flags);
row = MEM_mallocN(sizeof(unsigned short)*width*depth, "row in cineon_dpx.c");
frow = ibuf->rect_float+width*height*4;
@@ -116,32 +117,32 @@ static struct ImBuf *imb_load_dpx_cineon(unsigned char *mem, int use_cineon, int
return ibuf;
}
-static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int flags)
+static int imb_save_dpx_cineon(ImBuf *ibuf, const char *filename, int use_cineon, int flags)
{
LogImageByteConversionParameters conversion;
- int width, height, depth;
+ const int width= ibuf->x;
+ const int height= ibuf->y;
+ const int depth= 3;
LogImageFile* logImage;
unsigned short* line, *pixel;
int i, j;
- int index;
float *fline;
+ float *fbuf;
+ int is_alloc= 0;
+
+ (void)flags; /* unused */
- cineon_conversion_parameters(&conversion);
+ // cineon_conversion_parameters(&conversion);
+ logImageGetByteConversionDefaults(&conversion);
/*
* Get the drawable for the current image...
*/
- width = buf->x;
- height = buf->y;
- depth = 3;
-
-
- if (!buf->rect_float) {
- IMB_float_from_rect(buf);
- if (!buf->rect_float) { /* in the unlikely event that converting to a float buffer fails */
- return 0;
- }
+ fbuf= IMB_float_profile_ensure(ibuf, conversion.doLogarithm ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_NONE, &is_alloc);
+
+ if (fbuf == NULL) { /* in the unlikely event that converting to a float buffer fails */
+ return 0;
}
logImageSetVerbose((G.f & G_DEBUG) ? 1:0);
@@ -149,14 +150,15 @@ static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int f
if (!logImage) return 0;
- logImageSetByteConversion(logImage, &conversion);
+ if(logImageSetByteConversion(logImage, &conversion)==0) {
+ printf("error setting args\n");
+ }
- index = 0;
line = MEM_mallocN(sizeof(unsigned short)*depth*width, "line");
/*note that image is flipped when sent to logImageSetRowBytes (see last passed parameter).*/
for (j = 0; j < height; ++j) {
- fline = &buf->rect_float[width*j*4];
+ fline = &fbuf[width*j*4];
for (i=0; i<width; i++) {
float *fpix, fpix2[3];
/*we have to convert to cinepaint's 16-bit-per-channel here*/
@@ -177,10 +179,15 @@ static int imb_save_dpx_cineon(ImBuf *buf, char *filename, int use_cineon, int f
logImageClose(logImage);
MEM_freeN(line);
+
+ if(is_alloc) {
+ MEM_freeN(fbuf);
+ }
+
return 1;
}
-short imb_savecineon(struct ImBuf *buf, char *myfile, int flags)
+short imb_savecineon(struct ImBuf *buf, const char *myfile, int flags)
{
return imb_save_dpx_cineon(buf, myfile, 1, flags);
}
@@ -198,7 +205,7 @@ ImBuf *imb_loadcineon(unsigned char *mem, int size, int flags)
return NULL;
}
-short imb_save_dpx(struct ImBuf *buf, char *myfile, int flags)
+short imb_save_dpx(struct ImBuf *buf, const char *myfile, int flags)
{
return imb_save_dpx_cineon(buf, myfile, 0, flags);
}
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index 9c9156a4dd9..a2a0fae526d 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -185,6 +185,8 @@ dumpCineonImageInfo(CineonImageInformation* imageInfo) {
static void
fillCineonFormatInfo(CineonFile* cineon, CineonFormatInformation* formatInfo) {
+ (void)cineon; /* unused */
+
formatInfo->interleave = 0;
formatInfo->packing = 5;
formatInfo->signage = 0;
@@ -238,6 +240,8 @@ dumpCineonFormatInfo(CineonFormatInformation* formatInfo) {
static void
fillCineonOriginationInfo(CineonFile* cineon,
CineonOriginationInformation* originInfo, CineonFileInformation* fileInfo) {
+
+ (void)cineon; /* unused */
originInfo->x_offset = htonl(0);
originInfo->y_offset = htonl(0);
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.c b/source/blender/imbuf/intern/cineon/dpxlib.c
index 365d56939ed..ade69b4d7c0 100644
--- a/source/blender/imbuf/intern/cineon/dpxlib.c
+++ b/source/blender/imbuf/intern/cineon/dpxlib.c
@@ -39,6 +39,8 @@
static void
fillDpxChannelInfo(DpxFile* dpx, DpxChannelInformation* chan, int des) {
+ (void)dpx; /* unused */
+
chan->signage = 0;
chan->ref_low_data = htonl(0);
chan->ref_low_quantity = htonf(0.0);
@@ -160,7 +162,12 @@ dumpDpxImageInfo(DpxImageInformation* imageInfo) {
static void
fillDpxOriginationInfo(
- DpxFile* dpx, DpxOriginationInformation* originInfo, DpxFileInformation* fileInfo) {
+ DpxFile* dpx, DpxOriginationInformation* originInfo, DpxFileInformation* fileInfo)
+{
+ /* unused */
+ (void)dpx;
+ (void)originInfo;
+ (void)fileInfo;
}
static void
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.c b/source/blender/imbuf/intern/cineon/logImageCore.c
index 424fbcfc503..a340a81d2eb 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.c
+++ b/source/blender/imbuf/intern/cineon/logImageCore.c
@@ -154,7 +154,7 @@ ntohf(R32 f) {
#define UNDEF_FLOAT 0x7F800000
R32
-undefined() {
+undefined(void) {
Hack hack;
hack.i = UNDEF_FLOAT;
return hack.f;
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h
index 798dfebf059..0ff8e086622 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.h
+++ b/source/blender/imbuf/intern/cineon/logImageCore.h
@@ -103,7 +103,7 @@ typedef char ASCII;
R32 htonf(R32 f);
R32 ntohf(R32 f);
-R32 undefined();
+R32 undefined(void);
U16 reverseU16(U16 value);
U32 reverseU32(U32 value);
R32 reverseR32(R32 value);
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
index f482bd36271..b718c1255b2 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.cpp
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.h b/source/blender/imbuf/intern/dds/BlockDXT.h
index a9ecf8d3a88..cabd7cfeaea 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.h
+++ b/source/blender/imbuf/intern/dds/BlockDXT.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/CMakeLists.txt b/source/blender/imbuf/intern/dds/CMakeLists.txt
index 376dd3d61f4..7564287ce4a 100644
--- a/source/blender/imbuf/intern/dds/CMakeLists.txt
+++ b/source/blender/imbuf/intern/dds/CMakeLists.txt
@@ -24,21 +24,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE (GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
- ../../../blenkernel
- ../../../makesdna
- ../../
..
+ ../..
+ ./intern/include
../../../blenlib
- intern/include
+ ../../../blenkernel
+ ../../../makesdna
../../../../../intern/guardedalloc
)
+set(SRC
+ BlockDXT.cpp
+ ColorBlock.cpp
+ DirectDrawSurface.cpp
+ Image.cpp
+ Stream.cpp
+ dds_api.cpp
+)
+
if(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-BLENDERLIB(bf_dds "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf_dds "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/dds/Color.h b/source/blender/imbuf/intern/dds/Color.h
index 1f32b589bf8..fc180225522 100644
--- a/source/blender/imbuf/intern/dds/Color.h
+++ b/source/blender/imbuf/intern/dds/Color.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
index 637ececce5d..c03a8a2ebc4 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.cpp
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index 74cdcf661ed..f400a3ee0bb 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/Common.h b/source/blender/imbuf/intern/dds/Common.h
index 9712c290f7d..5fdeadd2a39 100644
--- a/source/blender/imbuf/intern/dds/Common.h
+++ b/source/blender/imbuf/intern/dds/Common.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
index f3518324386..8acec006ed8 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.h b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
index ed1972aa966..1b4694f9306 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.h
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
index f0da772156a..7041aab2e47 100644
--- a/source/blender/imbuf/intern/dds/Image.cpp
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
index cbe09c64550..e4286cba58a 100644
--- a/source/blender/imbuf/intern/dds/Image.h
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/Makefile b/source/blender/imbuf/intern/dds/Makefile
deleted file mode 100644
index d4f04382899..00000000000
--- a/source/blender/imbuf/intern/dds/Makefile
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dds
-DIR = $(OCGDIR)/blender/imbuf/dds
-SOURCEDIR = source/blender/imbuf/intern/dds
-
-include nan_compile.mk
-include nan_definitions.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_JPEG)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_TIFF)/include
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../avi
-CPPFLAGS += -I../../../quicktime
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-# This is not really needed, but until /include is cleaned, it must be
-# there for proper compilation.
-# - No, it is also needed in antialias, for listbase (nzc)
-CPPFLAGS += -I../../../makesdna
-# external interface of this module
-CPPFLAGS += -I../..
-CPPFLAGS += -I..
-CPPFLAGS += -I.
-CPPFLAGS += -DWITH_DDS
diff --git a/source/blender/imbuf/intern/dds/PixelFormat.h b/source/blender/imbuf/intern/dds/PixelFormat.h
index e27ddba0c43..a9a41b71326 100644
--- a/source/blender/imbuf/intern/dds/PixelFormat.h
+++ b/source/blender/imbuf/intern/dds/PixelFormat.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/SConscript b/source/blender/imbuf/intern/dds/SConscript
index 0b7fd50e317..918ae7b530b 100644
--- a/source/blender/imbuf/intern/dds/SConscript
+++ b/source/blender/imbuf/intern/dds/SConscript
@@ -4,16 +4,16 @@ Import ('env')
source_files = ['dds_api.cpp', 'DirectDrawSurface.cpp', 'Stream.cpp', 'BlockDXT.cpp', 'ColorBlock.cpp', 'Image.cpp']
incs = ['.',
- '../../',
- '../..',
- '..',
- '../../../makesdna',
- '../../../blenkernel',
- '../../../blenlib',
- 'intern/include',
- '#/intern/guardedalloc']
+ '../../',
+ '../..',
+ '..',
+ '../../../makesdna',
+ '../../../blenkernel',
+ '../../../blenlib',
+ 'intern/include',
+ '#/intern/guardedalloc']
defs = ['WITH_DDS']
-env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [230,190])
+env.BlenderLib ('bf_imbuf_dds', source_files, incs, defs, libtype=['core','player'], priority = [230,190])
diff --git a/source/blender/imbuf/intern/dds/Stream.cpp b/source/blender/imbuf/intern/dds/Stream.cpp
index b61634a9d9e..b9cb10d9acc 100644
--- a/source/blender/imbuf/intern/dds/Stream.cpp
+++ b/source/blender/imbuf/intern/dds/Stream.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/Stream.h b/source/blender/imbuf/intern/dds/Stream.h
index c14781616ad..991caea50da 100644
--- a/source/blender/imbuf/intern/dds/Stream.h
+++ b/source/blender/imbuf/intern/dds/Stream.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/dds/dds_api.cpp b/source/blender/imbuf/intern/dds/dds_api.cpp
index 9a106253397..16832ef9a47 100644
--- a/source/blender/imbuf/intern/dds/dds_api.cpp
+++ b/source/blender/imbuf/intern/dds/dds_api.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include <dds_api.h>
#include <Stream.h>
#include <DirectDrawSurface.h>
@@ -36,7 +37,7 @@ extern "C" {
#include "IMB_allocimbuf.h"
-int imb_save_dds(struct ImBuf * ibuf, char *name, int flags)
+int imb_save_dds(struct ImBuf * ibuf, const char *name, int flags)
{
return(0); /* todo: finish this function */
@@ -64,7 +65,7 @@ int imb_is_a_dds(unsigned char *mem) // note: use at most first 32 bytes
return(1);
}
-struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_load_dds(unsigned char *mem, size_t size, int flags)
{
struct ImBuf * ibuf = 0;
DirectDrawSurface dds(mem, size); /* reads header */
@@ -103,7 +104,7 @@ struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags)
// TODO use the image RGB or RGBA tag to determine the bits per pixel
if (dds.hasAlpha()) bits_per_pixel = 32;
else bits_per_pixel = 24;
- ibuf = IMB_allocImBuf(dds.width(), dds.height(), bits_per_pixel, 0, 0);
+ ibuf = IMB_allocImBuf(dds.width(), dds.height(), bits_per_pixel, 0);
if (ibuf == 0) return(0); /* memory allocation failed */
ibuf->ftype = DDS;
diff --git a/source/blender/imbuf/intern/dds/dds_api.h b/source/blender/imbuf/intern/dds/dds_api.h
index 6d9fa0839dd..d3f2048d5eb 100644
--- a/source/blender/imbuf/intern/dds/dds_api.h
+++ b/source/blender/imbuf/intern/dds/dds_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,9 +29,9 @@
extern "C" {
#endif
-int imb_save_dds(struct ImBuf *ibuf, char *name, int flags);
+int imb_save_dds(struct ImBuf *ibuf, const char *name, int flags);
int imb_is_a_dds(unsigned char *mem); /* use only first 32 bytes of mem */
-struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags);
+struct ImBuf *imb_load_dds(unsigned char *mem, size_t size, int flags);
#ifdef __cplusplus
}
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 7b3a07f10ad..3a89251a2fc 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -32,14 +32,17 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#include "BKE_utildefines.h"
+
#include "BKE_colortools.h"
+#include "MEM_guardedalloc.h"
+
void IMB_de_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
@@ -50,8 +53,8 @@ void IMB_de_interlace(struct ImBuf *ibuf)
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
ibuf->x *= 2;
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
@@ -78,8 +81,8 @@ void IMB_interlace(struct ImBuf *ibuf)
if (ibuf->rect) {
/* make copies */
- tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
- tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect, 0);
+ tbuf1 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
+ tbuf2 = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 32, IB_rect);
IMB_rectcpy(tbuf1, ibuf, 0, 0, 0, 0, ibuf->x, ibuf->y);
IMB_rectcpy(tbuf2, ibuf, 0, 0, 0, tbuf2->y, ibuf->x, ibuf->y);
@@ -163,7 +166,13 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
if (dither != 0.f) {
for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
const float d = (BLI_frand()-0.5)*dither;
- const float col[4] = {d+tof[0], d+tof[1], d+tof[2], d+tof[3]};
+ float col[4];
+
+ col[0]= d + tof[0];
+ col[1]= d + tof[1];
+ col[2]= d + tof[2];
+ col[3]= d + tof[3];
+
to[0] = FTOCHAR(col[0]);
to[1] = FTOCHAR(col[1]);
to[2] = FTOCHAR(col[2]);
@@ -179,19 +188,51 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
}
}
}
+ /* ensure user flag is reset */
+ ibuf->userflags &= ~IB_RECT_INVALID;
}
-void IMB_float_from_rect(struct ImBuf *ibuf)
+static void imb_float_from_rect_nonlinear(struct ImBuf *ibuf, float *fbuf)
{
- /* quick method to convert byte to floatbuf */
- float *tof = ibuf->rect_float;
+ float *tof = fbuf;
int i;
unsigned char *to = (unsigned char *) ibuf->rect;
-
- if(to==NULL) return;
- if(tof==NULL) {
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ tof[0] = ((float)to[0])*(1.0f/255.0f);
+ tof[1] = ((float)to[1])*(1.0f/255.0f);
+ tof[2] = ((float)to[2])*(1.0f/255.0f);
+ tof[3] = ((float)to[3])*(1.0f/255.0f);
+ to += 4;
+ tof += 4;
+ }
+}
+
+
+static void imb_float_from_rect_linear(struct ImBuf *ibuf, float *fbuf)
+{
+ float *tof = fbuf;
+ int i;
+ unsigned char *to = (unsigned char *) ibuf->rect;
+
+ for (i = ibuf->x * ibuf->y; i > 0; i--)
+ {
+ tof[0] = srgb_to_linearrgb(((float)to[0])*(1.0f/255.0f));
+ tof[1] = srgb_to_linearrgb(((float)to[1])*(1.0f/255.0f));
+ tof[2] = srgb_to_linearrgb(((float)to[2])*(1.0f/255.0f));
+ tof[3] = ((float)to[3])*(1.0f/255.0f);
+ to += 4;
+ tof += 4;
+ }
+}
+
+void IMB_float_from_rect(struct ImBuf *ibuf)
+{
+ /* quick method to convert byte to floatbuf */
+ if(ibuf->rect==NULL) return;
+ if(ibuf->rect_float==NULL) {
if (imb_addrectfloatImBuf(ibuf) == 0) return;
- tof = ibuf->rect_float;
}
/* Float bufs should be stored linear */
@@ -199,41 +240,18 @@ void IMB_float_from_rect(struct ImBuf *ibuf)
if (ibuf->profile != IB_PROFILE_NONE) {
/* if the image has been given a profile then we're working
* with color management in mind, so convert it to linear space */
-
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = srgb_to_linearrgb(((float)to[0])*(1.0f/255.0f));
- tof[1] = srgb_to_linearrgb(((float)to[1])*(1.0f/255.0f));
- tof[2] = srgb_to_linearrgb(((float)to[2])*(1.0f/255.0f));
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
+ imb_float_from_rect_linear(ibuf, ibuf->rect_float);
} else {
- for (i = ibuf->x * ibuf->y; i > 0; i--)
- {
- tof[0] = ((float)to[0])*(1.0f/255.0f);
- tof[1] = ((float)to[1])*(1.0f/255.0f);
- tof[2] = ((float)to[2])*(1.0f/255.0f);
- tof[3] = ((float)to[3])*(1.0f/255.0f);
- to += 4;
- tof += 4;
- }
+ imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
}
}
/* no profile conversion */
void IMB_float_from_rect_simple(struct ImBuf *ibuf)
{
- int profile = IB_PROFILE_NONE;
-
- /* no color management:
- * don't disturb the existing profiles */
- SWAP(int, ibuf->profile, profile);
-
- IMB_float_from_rect(ibuf);
-
- SWAP(int, ibuf->profile, profile);
+ if(ibuf->rect_float==NULL)
+ imb_addrectfloatImBuf(ibuf);
+ imb_float_from_rect_nonlinear(ibuf, ibuf->rect_float);
}
void IMB_convert_profile(struct ImBuf *ibuf, int profile)
@@ -258,9 +276,9 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
}
if(ibuf->rect) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rctf[0]= (unsigned char)((srgb_to_linearrgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f);
- rctf[1]= (unsigned char)((srgb_to_linearrgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f);
- rctf[2]= (unsigned char)((srgb_to_linearrgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f);
+ rct[0]= (unsigned char)((srgb_to_linearrgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
+ rct[1]= (unsigned char)((srgb_to_linearrgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
+ rct[2]= (unsigned char)((srgb_to_linearrgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
}
}
ok= TRUE;
@@ -277,9 +295,9 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
}
if(ibuf->rect) {
for (i = ibuf->x * ibuf->y; i > 0; i--, rct+=4) {
- rctf[0]= (unsigned char)((linearrgb_to_srgb((float)rctf[0]/255.0f) * 255.0f) + 0.5f);
- rctf[1]= (unsigned char)((linearrgb_to_srgb((float)rctf[1]/255.0f) * 255.0f) + 0.5f);
- rctf[2]= (unsigned char)((linearrgb_to_srgb((float)rctf[2]/255.0f) * 255.0f) + 0.5f);
+ rct[0]= (unsigned char)((linearrgb_to_srgb((float)rct[0]/255.0f) * 255.0f) + 0.5f);
+ rct[1]= (unsigned char)((linearrgb_to_srgb((float)rct[1]/255.0f) * 255.0f) + 0.5f);
+ rct[2]= (unsigned char)((linearrgb_to_srgb((float)rct[2]/255.0f) * 255.0f) + 0.5f);
}
}
ok= TRUE;
@@ -293,3 +311,48 @@ void IMB_convert_profile(struct ImBuf *ibuf, int profile)
ibuf->profile= profile;
}
+
+/* use when you need to get a buffer with a certain profile
+ * if the return */
+float *IMB_float_profile_ensure(struct ImBuf *ibuf, int profile, int *alloc)
+{
+ /* stupid but it works like this everywhere now */
+ const short is_lin_from= (ibuf->profile != IB_PROFILE_NONE);
+ const short is_lin_to= (profile != IB_PROFILE_NONE);
+
+
+ if(is_lin_from == is_lin_to) {
+ *alloc= 0;
+
+ /* simple case, just allocate the buffer and return */
+ if(ibuf->rect_float == NULL) {
+ IMB_float_from_rect(ibuf);
+ }
+
+ return ibuf->rect_float;
+ }
+ else {
+ /* conversion is needed, first check */
+ float *fbuf= MEM_mallocN(ibuf->x * ibuf->y * sizeof(float) * 4, "IMB_float_profile_ensure");
+ *alloc= 1;
+
+ if(ibuf->rect_float == NULL) {
+ if(is_lin_to) {
+ imb_float_from_rect_linear(ibuf, fbuf);
+ }
+ else {
+ imb_float_from_rect_nonlinear(ibuf, fbuf);
+ }
+ }
+ else {
+ if(is_lin_to) { /* lin -> nonlin */
+ linearrgb_to_srgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
+ }
+ else { /* nonlin -> lin */
+ srgb_to_linearrgb_rgba_rgba_buf(fbuf, ibuf->rect_float, ibuf->x * ibuf->y);
+ }
+ }
+
+ return fbuf;
+ }
+}
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index db2eef759dc..4e96fd94555 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -22,6 +22,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_filetype.h"
@@ -44,7 +45,7 @@ static int imb_ftype_default(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftyp
#if defined(__APPLE__) && defined(IMBUF_COCOA)
static int imb_ftype_cocoa(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype & TIF); }
#endif
-static int imb_ftype_iris(ImFileType *type, ImBuf *ibuf) { return (ibuf->ftype == IMAGIC); }
+static int imb_ftype_iris(ImFileType *type, ImBuf *ibuf) { (void)type; return (ibuf->ftype == IMAGIC); }
#ifdef WITH_QUICKTIME
static int imb_ftype_quicktime(ImFileType *type, ImBuf *ibuf) { return 0; } // XXX
#endif
@@ -55,11 +56,11 @@ void quicktime_exit(void);
#endif
ImFileType IMB_FILE_TYPES[]= {
- {NULL, NULL, imb_is_a_iris, imb_ftype_iris, imb_loadiris, imb_saveiris, NULL, 0, IMAGIC},
{NULL, NULL, imb_is_a_jpeg, imb_ftype_default, imb_load_jpeg, imb_savejpeg, NULL, 0, JPG},
{NULL, NULL, imb_is_a_png, imb_ftype_default, imb_loadpng, imb_savepng, NULL, 0, PNG},
{NULL, NULL, imb_is_a_bmp, imb_ftype_default, imb_bmp_decode, imb_savebmp, NULL, 0, BMP},
{NULL, NULL, imb_is_a_targa, imb_ftype_default, imb_loadtarga, imb_savetarga, NULL, 0, TGA},
+ {NULL, NULL, imb_is_a_iris, imb_ftype_iris, imb_loadiris, imb_saveiris, NULL, 0, IMAGIC},
#ifdef WITH_CINEON
{NULL, NULL, imb_is_dpx, imb_ftype_default, imb_loaddpx, imb_save_dpx, NULL, IM_FTYPE_FLOAT, DPX},
{NULL, NULL, imb_is_cineon, imb_ftype_default, imb_loadcineon, imb_savecineon, NULL, IM_FTYPE_FLOAT, CINEON},
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index 3cc266e460e..52ec4825d2b 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -29,9 +29,12 @@
* $Id$
*/
-#include "BKE_utildefines.h"
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_filter.h"
@@ -371,16 +374,53 @@ void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
}
}
+/* threadsafe version, only recreates existing maps */
+void IMB_remakemipmap(ImBuf *ibuf, int use_filter)
+{
+ ImBuf *hbuf = ibuf;
+ int curmap = 0;
+
+ ibuf->miptot= 1;
+
+ while(curmap < IB_MIPMAP_LEVELS) {
+
+ if(ibuf->mipmap[curmap]) {
+
+ if(use_filter) {
+ ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
+ IMB_filterN(nbuf, hbuf);
+ imb_onehalf_no_alloc(ibuf->mipmap[curmap], nbuf);
+ IMB_freeImBuf(nbuf);
+ }
+ else
+ imb_onehalf_no_alloc(ibuf->mipmap[curmap], hbuf);
+ }
+
+ ibuf->miptot= curmap+2;
+ hbuf= ibuf->mipmap[curmap];
+ if(hbuf)
+ hbuf->miplevel= curmap+1;
+
+ if(!hbuf || (hbuf->x <= 2 && hbuf->y <= 2))
+ break;
+
+ curmap++;
+ }
+}
+
+/* frees too (if there) and recreates new data */
void IMB_makemipmap(ImBuf *ibuf, int use_filter)
{
ImBuf *hbuf = ibuf;
int curmap = 0;
+ imb_freemipmapImBuf(ibuf);
+
ibuf->miptot= 1;
while(curmap < IB_MIPMAP_LEVELS) {
if(use_filter) {
- ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect, 0);
+ ImBuf *nbuf= IMB_allocImBuf(hbuf->x, hbuf->y, 32, IB_rect);
IMB_filterN(nbuf, hbuf);
ibuf->mipmap[curmap] = IMB_onehalf(nbuf);
IMB_freeImBuf(nbuf);
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index 8fa76fa4502..0bc311744a1 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/imbuf/intern/imbuf.h b/source/blender/imbuf/intern/imbuf.h
index 1e2f3ec461a..885bca29ac2 100644
--- a/source/blender/imbuf/intern/imbuf.h
+++ b/source/blender/imbuf/intern/imbuf.h
@@ -1,4 +1,4 @@
-/**
+/*
* imbuf.h (mar-2001 nzc)
*
* This header might have to become external...
diff --git a/source/blender/imbuf/intern/imbuf_cocoa.m b/source/blender/imbuf/intern/imbuf_cocoa.m
index 02c90c5bd09..9b627612d2a 100644
--- a/source/blender/imbuf/intern/imbuf_cocoa.m
+++ b/source/blender/imbuf/intern/imbuf_cocoa.m
@@ -93,7 +93,7 @@ struct ImBuf *imb_cocoaLoadImage(unsigned char *mem, int size, int flags)
[bitmapImage setSize:bitmapSize];
/* allocate the image buffer */
- ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0, 0);
+ ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0);
if (!ibuf) {
fprintf(stderr,
"imb_cocoaLoadImage: could not allocate memory for the " \
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index c676c401ccd..f29f68bdcb4 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -123,7 +123,8 @@ static int file_offset;
static unsigned short getshort(FILE *inf)
{
unsigned char * buf;
-
+ (void)inf; /* unused */
+
buf = file_data + file_offset;
file_offset += 2;
@@ -133,6 +134,7 @@ static unsigned short getshort(FILE *inf)
static unsigned int getlong(FILE *inf)
{
unsigned char * buf;
+ (void)inf; /* unused */
buf = file_data + file_offset;
file_offset += 4;
@@ -173,9 +175,8 @@ static void readheader(FILE *inf, IMAGE *image)
static int writeheader(FILE *outf, IMAGE *image)
{
- IMAGE t;
+ IMAGE t= {0};
- memset(&t, 0, sizeof(IMAGE));
fwrite(&t,sizeof(IMAGE),1,outf);
fseek(outf,0,SEEK_SET);
putshort(outf,image->imagic);
@@ -244,7 +245,7 @@ int imb_is_a_iris(unsigned char *mem)
*
*/
-struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
{
unsigned int *base, *lptr = NULL;
float *fbase, *fptr = NULL;
@@ -258,6 +259,8 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
int bpp, rle, cur, badorder;
ImBuf * ibuf;
+ (void)size; /* unused */
+
if(!imb_is_a_iris(mem)) return NULL;
/*printf("new iris\n");*/
@@ -283,7 +286,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
zsize = image.zsize;
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(image.xsize, image.ysize, 8 * image.zsize, 0, 0);
+ ibuf = IMB_allocImBuf(image.xsize, image.ysize, 8 * image.zsize, 0);
if (ibuf) ibuf->ftype = IMAGIC;
return(ibuf);
}
@@ -315,7 +318,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
if (bpp == 1) {
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
if (ibuf->depth > 32) ibuf->depth = 32;
base = ibuf->rect;
zbase = (unsigned int *)ibuf->zbuf;
@@ -356,7 +359,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
} else { /* bpp == 2 */
- ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat);
fbase = ibuf->rect_float;
@@ -399,7 +402,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
} else {
if (bpp == 1) {
- ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 8 * zsize, IB_rect);
if (ibuf->depth > 32) ibuf->depth = 32;
base = ibuf->rect;
@@ -424,7 +427,7 @@ struct ImBuf *imb_loadiris(unsigned char *mem, int size, int flags)
} else { /* bpp == 2 */
- ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ ibuf = IMB_allocImBuf(xsize, ysize, 32, (flags & IB_rect)|IB_rectfloat);
fbase = ibuf->rect_float;
@@ -658,7 +661,7 @@ static void expandrow(unsigned char *optr, unsigned char *iptr, int z)
* Added: zbuf write
*/
-static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, char *name, int *zptr)
+static int output_iris(unsigned int *lptr, int xsize, int ysize, int zsize, const char *name, int *zptr)
{
FILE *outf;
IMAGE *image;
@@ -812,7 +815,7 @@ static int compressrow(unsigned char *lbuf, unsigned char *rlebuf, int z, int cn
return optr - (unsigned char *)rlebuf;
}
-int imb_saveiris(struct ImBuf * ibuf, char *name, int flags)
+int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags)
{
short zsize;
int ret;
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index 558eaedf8b2..72b317c36da 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -55,49 +55,49 @@ typedef struct img_folder{
float *rates;
}img_fol_t;
-static int checkj2p(unsigned char *mem) /* J2K_CFMT */
+static int check_jp2(unsigned char *mem) /* J2K_CFMT */
{
return memcmp(JP2_HEAD, mem, 12) ? 0 : 1;
}
int imb_is_a_jp2(unsigned char *buf)
{
- return checkj2p(buf);
+ return check_jp2(buf);
}
/**
sample error callback expecting a FILE* client object
*/
-void error_callback(const char *msg, void *client_data) {
+static void error_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data;
fprintf(stream, "[ERROR] %s", msg);
}
/**
sample warning callback expecting a FILE* client object
*/
-void warning_callback(const char *msg, void *client_data) {
+static void warning_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data;
fprintf(stream, "[WARNING] %s", msg);
}
/**
sample debug callback expecting no client object
*/
-void info_callback(const char *msg, void *client_data) {
+static void info_callback(const char *msg, void *client_data) {
(void)client_data;
fprintf(stdout, "[INFO] %s", msg);
}
-struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_jp2_decode(unsigned char *mem, size_t size, int flags)
{
struct ImBuf *ibuf = 0;
int use_float = 0; /* for precision higher then 8 use float */
- long signed_offsets[4] = {0,0,0,0};
- int float_divs[4];
-
+ long signed_offsets[4]= {0, 0, 0, 0};
+ int float_divs[4]= {1, 1, 1, 1};
+
int index;
int w, h, depth;
@@ -112,7 +112,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */
opj_cio_t *cio = NULL;
- if (checkj2p(mem) == 0) return(0);
+ if (check_jp2(mem) == 0) return(0);
/* configure the event callbacks (not required) */
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
@@ -189,7 +189,7 @@ struct ImBuf *imb_jp2_decode(unsigned char *mem, int size, int flags)
float_divs[i]= (1<<image->comps[i].prec)-1;
}
- ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect, 0);
+ ibuf= IMB_allocImBuf(w, h, depth, use_float ? IB_rectfloat : IB_rect);
if (ibuf==NULL) {
if(dinfo)
@@ -322,7 +322,7 @@ static int initialise_4K_poc(opj_poc_t *POC, int numres){
return 2;
}
-void cinema_parameters(opj_cparameters_t *parameters){
+static void cinema_parameters(opj_cparameters_t *parameters){
parameters->tile_size_on = false;
parameters->cp_tdx=1;
parameters->cp_tdy=1;
@@ -355,7 +355,7 @@ void cinema_parameters(opj_cparameters_t *parameters){
}
-void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
+static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
int i;
float temp_rate;
@@ -661,7 +661,7 @@ static opj_image_t* ibuftoimage(ImBuf *ibuf, opj_cparameters_t *parameters) {
/* Found write info at http://users.ece.gatech.edu/~slabaugh/personal/c/bitmapUnix.c */
-int imb_savejp2(struct ImBuf *ibuf, char *name, int flags) {
+int imb_savejp2(struct ImBuf *ibuf, const char *name, int flags) {
int quality = ibuf->ftype & 0xff;
@@ -670,6 +670,8 @@ int imb_savejp2(struct ImBuf *ibuf, char *name, int flags) {
opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL;
+ (void)flags; /* unused */
+
/*
configure the event callbacks (not required)
setting of each callback is optionnal
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index 2bae7228220..d23223e4c11 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -58,7 +58,7 @@ static void init_source(j_decompress_ptr cinfo);
static boolean fill_input_buffer(j_decompress_ptr cinfo);
static void skip_input_data(j_decompress_ptr cinfo, long num_bytes);
static void term_source(j_decompress_ptr cinfo);
-static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, int size);
+static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t size);
static boolean handle_app1 (j_decompress_ptr cinfo);
static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int flags);
@@ -132,6 +132,7 @@ typedef my_source_mgr * my_src_ptr;
static void init_source(j_decompress_ptr cinfo)
{
+ (void)cinfo; /* unused */
}
@@ -165,9 +166,10 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
static void term_source(j_decompress_ptr cinfo)
{
+ (void)cinfo; /* unused */
}
-static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, int size)
+static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t size)
{
my_src_ptr src;
@@ -297,10 +299,12 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f
if (flags & IB_test) {
jpeg_abort_decompress(cinfo);
- ibuf = IMB_allocImBuf(x, y, 8 * depth, 0, 0);
- } else {
- ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect, 0);
-
+ ibuf = IMB_allocImBuf(x, y, 8 * depth, 0);
+ }
+ else if ((ibuf = IMB_allocImBuf(x, y, 8 * depth, IB_rect)) == NULL) {
+ jpeg_abort_decompress(cinfo);
+ }
+ else {
row_stride = cinfo->output_width * depth;
row_pointer = (*cinfo->mem->alloc_sarray) ((j_common_ptr) cinfo, JPOOL_IMAGE, row_stride, 1);
@@ -421,45 +425,16 @@ next_stamp_marker:
}
jpeg_destroy((j_common_ptr) cinfo);
- ibuf->ftype = ibuf_ftype;
- ibuf->profile = IB_PROFILE_SRGB;
- }
-
- return(ibuf);
-}
-
-ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags)
-{
- struct jpeg_decompress_struct _cinfo, *cinfo = &_cinfo;
- struct my_error_mgr jerr;
- FILE * infile;
- ImBuf * ibuf;
-
- if ((infile = fopen(filename, "rb")) == NULL) return 0;
-
- cinfo->err = jpeg_std_error(&jerr.pub);
- jerr.pub.error_exit = jpeg_error;
-
- /* Establish the setjmp return context for my_error_exit to use. */
- if (setjmp(jerr.setjmp_buffer)) {
- /* If we get here, the JPEG code has signaled an error.
- * We need to clean up the JPEG object, close the input file, and return.
- */
- jpeg_destroy_decompress(cinfo);
- fclose(infile);
- return NULL;
+ if(ibuf) {
+ ibuf->ftype = ibuf_ftype;
+ ibuf->profile = IB_PROFILE_SRGB;
+ }
}
- jpeg_create_decompress(cinfo);
- jpeg_stdio_src(cinfo, infile);
-
- ibuf = ibJpegImageFromCinfo(cinfo, flags);
-
- fclose(infile);
return(ibuf);
}
-ImBuf * imb_load_jpeg (unsigned char * buffer, int size, int flags)
+ImBuf * imb_load_jpeg (unsigned char * buffer, size_t size, int flags)
{
struct jpeg_decompress_struct _cinfo, *cinfo = &_cinfo;
struct my_error_mgr jerr;
@@ -616,7 +591,7 @@ static int init_jpeg(FILE * outfile, struct jpeg_compress_struct * cinfo, struct
}
-static int save_stdjpeg(char * name, struct ImBuf * ibuf)
+static int save_stdjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -650,7 +625,7 @@ static int save_stdjpeg(char * name, struct ImBuf * ibuf)
}
-static int save_vidjpeg(char * name, struct ImBuf * ibuf)
+static int save_vidjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -689,13 +664,13 @@ static int save_vidjpeg(char * name, struct ImBuf * ibuf)
return 1;
}
-static int save_jstjpeg(char * name, struct ImBuf * ibuf)
+static int save_jstjpeg(const char *name, struct ImBuf *ibuf)
{
char fieldname[1024];
struct ImBuf * tbuf;
int oldy, returnval;
- tbuf = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 24, IB_rect, 0);
+ tbuf = IMB_allocImBuf(ibuf->x, ibuf->y / 2, 24, IB_rect);
tbuf->ftype = ibuf->ftype;
tbuf->flags = ibuf->flags;
@@ -720,7 +695,7 @@ static int save_jstjpeg(char * name, struct ImBuf * ibuf)
return returnval;
}
-static int save_maxjpeg(char * name, struct ImBuf * ibuf)
+static int save_maxjpeg(const char *name, struct ImBuf *ibuf)
{
FILE * outfile;
struct jpeg_compress_struct _cinfo, *cinfo = &_cinfo;
@@ -759,7 +734,7 @@ static int save_maxjpeg(char * name, struct ImBuf * ibuf)
return 1;
}
-int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags)
+int imb_savejpeg(struct ImBuf *ibuf, const char *name, int flags)
{
ibuf->flags = flags;
diff --git a/source/blender/imbuf/intern/metadata.c b/source/blender/imbuf/intern/metadata.c
index 38ffa2fe2fa..67daaf36aad 100644
--- a/source/blender/imbuf/intern/metadata.c
+++ b/source/blender/imbuf/intern/metadata.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/module.c b/source/blender/imbuf/intern/module.c
index 5438066d164..f291c0de776 100644
--- a/source/blender/imbuf/intern/module.c
+++ b/source/blender/imbuf/intern/module.c
@@ -22,6 +22,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <stddef.h>
#include "IMB_imbuf.h"
#include "IMB_filetype.h"
diff --git a/source/blender/imbuf/intern/openexr/CMakeLists.txt b/source/blender/imbuf/intern/openexr/CMakeLists.txt
index cfc977ff155..ace4f4f9a65 100644
--- a/source/blender/imbuf/intern/openexr/CMakeLists.txt
+++ b/source/blender/imbuf/intern/openexr/CMakeLists.txt
@@ -24,13 +24,11 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC openexr_api.cpp)
-
-SET(INC
+set(INC
.
- ../../../blenkernel
- ../../
..
+ ../..
+ ../../../blenkernel
../../../blenlib
intern/include
../../../../../intern/guardedalloc
@@ -38,8 +36,12 @@ SET(INC
${OPENEXR_INC}
)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+set(SRC
+ openexr_api.cpp
+)
+
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-BLENDERLIB(bf_openexr "${SRC}" "${INC}")
+blender_add_lib(bf_imbuf_openexr "${SRC}" "${INC}")
diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile
deleted file mode 100644
index 820b2aeb003..00000000000
--- a/source/blender/imbuf/intern/openexr/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Gernot Ziegler <gz@lysator.liu.se>
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = openexr
-DIR = $(OCGDIR)/blender/imbuf/openexr
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# If compiling the API, WITH_OPENEXR must be set.
-CPPFLAGS += -DWITH_OPENEXR
-
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../imbuf/intern
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += $(NAN_OPENEXR_INC)
-CPPFLAGS += -I.
diff --git a/source/blender/imbuf/intern/openexr/SConscript b/source/blender/imbuf/intern/openexr/SConscript
index f504c503109..082bb82c322 100644
--- a/source/blender/imbuf/intern/openexr/SConscript
+++ b/source/blender/imbuf/intern/openexr/SConscript
@@ -4,15 +4,15 @@ Import ('env')
source_files = ['openexr_api.cpp']
incs = ['.',
- '../../../blenkernel',
- '../../',
- '..',
- '../../../blenlib',
- 'intern/include',
- '#/intern/guardedalloc',
- '../../../makesdna']
+ '../../../blenkernel',
+ '../../',
+ '..',
+ '../../../blenlib',
+ 'intern/include',
+ '#/intern/guardedalloc',
+ '../../../makesdna']
incs += Split(env['BF_OPENEXR_INC'])
defs = ['WITH_OPENEXR']
-env.BlenderLib ('bf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225,180])
+env.BlenderLib ('bf_imbuf_openexr', source_files, incs, defs, libtype=['core','player'], priority = [225,180])
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index 9b68e0e45eb..fe18984e528 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPLLICENSE BLOCK *****
*
@@ -28,6 +28,7 @@
#include <stdlib.h>
#include <stdio.h>
+#include <stddef.h>
#include <string>
@@ -93,7 +94,7 @@ class Mem_IStream: public IStream
{
public:
- Mem_IStream (unsigned char *exrbuf, int exrsize):
+ Mem_IStream (unsigned char *exrbuf, size_t exrsize):
IStream("dummy"), _exrpos (0), _exrsize(exrsize) { _exrbuf = exrbuf; }
virtual bool read (char c[], int n);
@@ -187,7 +188,7 @@ static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
header->insert(info->key, StringAttribute(info->value));
}
-static int imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags)
+static int imb_save_openexr_half(struct ImBuf *ibuf, const char *name, int flags)
{
int channels = ibuf->channels;
int width = ibuf->x;
@@ -314,7 +315,7 @@ static int imb_save_openexr_half(struct ImBuf *ibuf, char *name, int flags)
return (1);
}
-static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
+static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flags)
{
int channels = ibuf->channels;
int width = ibuf->x;
@@ -342,6 +343,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
int ystride = - xstride*width;
float *rect[4] = {NULL, NULL, NULL, NULL};
+ /* last scanline, stride negative */
rect[0]= ibuf->rect_float + channels*(height-1)*width;
rect[1]= rect[0]+1;
rect[2]= rect[0]+2;
@@ -372,7 +374,7 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, char *name, int flags)
}
-int imb_save_openexr(struct ImBuf *ibuf, char *name, int flags)
+int imb_save_openexr(struct ImBuf *ibuf, const char *name, int flags)
{
if (flags & IB_mem)
{
@@ -482,7 +484,7 @@ void IMB_exr_add_channel(void *handle, const char *layname, const char *passname
}
/* only used for writing temp. render results (not image files) */
-void IMB_exr_begin_write(void *handle, char *filename, int width, int height, int compress)
+void IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress)
{
ExrHandle *data= (ExrHandle *)handle;
Header header (width, height);
@@ -498,12 +500,12 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in
// openexr_header_metadata(&header, ibuf); // no imbuf. cant write
/* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */
- header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43 and newer"));
+ header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.55.1 and newer"));
data->ofile = new OutputFile(filename, header);
}
-void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley)
+void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley)
{
ExrHandle *data= (ExrHandle *)handle;
Header header (width, height);
@@ -528,7 +530,7 @@ void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width
}
/* read from file */
-int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
+int IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height)
{
ExrHandle *data= (ExrHandle *)handle;
@@ -551,7 +553,7 @@ int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
}
/* still clumsy name handling, layers/channels can be ordered as list in list later */
-void IMB_exr_set_channel(void *handle, char *layname, char *passname, int xstride, int ystride, float *rect)
+void IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
{
ExrHandle *data= (ExrHandle *)handle;
ExrChannel *echan;
@@ -615,9 +617,13 @@ void IMB_exr_write_channels(void *handle)
ExrChannel *echan;
if(data->channels.first) {
- for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
- frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
- echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+ for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
+ /* last scanline, stride negative */
+ float *rect = echan->rect + echan->xstride*(data->height-1)*data->width;
+
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)rect,
+ echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
+ }
data->ofile->setFrameBuffer (frameBuffer);
try {
@@ -638,11 +644,20 @@ void IMB_exr_read_channels(void *handle)
FrameBuffer frameBuffer;
ExrChannel *echan;
+ /* check if exr was saved with previous versions of blender which flipped images */
+ const StringAttribute *ta = data->ifile->header().findTypedAttribute <StringAttribute> ("BlenderMultiChannel");
+ short flip = (ta && strncmp(ta->value().c_str(), "Blender V2.43", 13)==0); /* 'previous multilayer attribute, flipped */
+
for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
- /* no datawindow correction needed */
- if(echan->rect)
- frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
- echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+
+ if(echan->rect) {
+ if(flip)
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)echan->rect,
+ echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
+ else
+ frameBuffer.insert (echan->name, Slice (FLOAT, (char *)(echan->rect + echan->xstride*(data->height-1)*data->width),
+ echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
+ }
else
printf("warning, channel with no rect set %s\n", echan->name);
}
@@ -943,7 +958,7 @@ static int exr_is_renderresult(InputFile *file)
return 0;
}
-struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
{
struct ImBuf *ibuf = NULL;
InputFile *file = NULL;
@@ -975,7 +990,7 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, int size, int flags)
}
else {
- ibuf = IMB_allocImBuf(width, height, 32, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, 32, 0);
ibuf->ftype = OPENEXR;
/* openEXR is linear as per EXR spec */
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h
index c23b47d1480..cd9f370f295 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.h
+++ b/source/blender/imbuf/intern/openexr/openexr_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,9 +33,6 @@
#ifdef __cplusplus
extern "C" {
#endif
-
-#define OPENEXR_FLOATRGB 0x1
-#define OPENEXR_ZBUF 0x2
#include <stdio.h>
@@ -46,9 +43,9 @@ extern "C" {
int imb_is_a_openexr (unsigned char *mem);
-int imb_save_openexr (struct ImBuf *ibuf, char *name, int flags);
+int imb_save_openexr (struct ImBuf *ibuf, const char *name, int flags);
-struct ImBuf *imb_load_openexr (unsigned char *mem, int size, int flags);
+struct ImBuf *imb_load_openexr (unsigned char *mem, size_t size, int flags);
#ifdef __cplusplus
}
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index c66abe76289..490c7050661 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,11 +44,11 @@
void * IMB_exr_get_handle (void);
void IMB_exr_add_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);
-int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height);
-void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress);
-void IMB_exrtile_begin_write (void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley);
+int IMB_exr_begin_read (void *handle, const char *filename, int *width, int *height);
+void IMB_exr_begin_write (void *handle, const char *filename, int width, int height, int compress);
+void IMB_exrtile_begin_write (void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley);
-void IMB_exr_set_channel (void *handle, char *layname, char *passname, int xstride, int ystride, float *rect);
+void IMB_exr_set_channel (void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect);
void IMB_exr_read_channels (void *handle);
void IMB_exr_write_channels (void *handle);
@@ -67,24 +67,27 @@ void IMB_exr_close (void *handle);
/* ugly... but we only use it on pipeline.c, render module, now */
void * IMB_exr_get_handle (void) {return NULL;}
-void IMB_exr_add_channel (void *handle, const char *layname, const char *channame, int xstride, int ystride, float *rect) {}
+void IMB_exr_add_channel (void *handle, const char *layname, const char *channame, int xstride, int ystride, float *rect) { (void)handle; (void)layname; (void)channame; (void)xstride; (void)ystride; (void)rect; }
-int IMB_exr_begin_read (void *handle, char *filename, int *width, int *height) {return 0;}
-void IMB_exr_begin_write (void *handle, char *filename, int width, int height, int compress) {}
-void IMB_exrtile_begin_write (void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley) {}
+int IMB_exr_begin_read (void *handle, const char *filename, int *width, int *height) { (void)handle; (void)filename; (void)width; (void)height; return 0;}
+void IMB_exr_begin_write (void *handle, const char *filename, int width, int height, int compress) { (void)handle; (void)filename; (void)width; (void)height; (void)compress; }
+void IMB_exrtile_begin_write (void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley) { (void)handle; (void)filename; (void)mipmap; (void)width; (void)height; (void)tilex; (void)tiley; }
-void IMB_exr_set_channel (void *handle, char *layname, char *channame, int xstride, int ystride, float *rect) {}
+void IMB_exr_set_channel (void *handle, char *layname, const char *channame, int xstride, int ystride, float *rect) { (void)handle; (void)layname; (void)channame; (void)xstride; (void)ystride; (void)rect; }
-void IMB_exr_read_channels (void *handle) {}
-void IMB_exr_write_channels (void *handle) {}
-void IMB_exrtile_write_channels (void *handle, int partx, int party, int level) {}
-void IMB_exrtile_clear_channels (void *handle) {}
+void IMB_exr_read_channels (void *handle) { (void)handle; }
+void IMB_exr_write_channels (void *handle) { (void)handle; }
+void IMB_exrtile_write_channels (void *handle, int partx, int party, int level) { (void)handle; (void)partx; (void)party; (void)level; }
+void IMB_exrtile_clear_channels (void *handle) { (void)handle; }
void IMB_exr_multilayer_convert (void *handle, void *base,
void * (*addlayer)(void *base, char *str),
- void (*addpass)(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id)) {}
+ void (*addpass)(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id))
+ {
+ (void)handle; (void)base; (void)addlayer; (void)addpass;
+ }
-void IMB_exr_close (void *handle) {}
+void IMB_exr_close (void *handle) { (void)handle; }
#endif
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 6344b227174..23a18df6197 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -61,7 +61,8 @@ int imb_is_a_png(unsigned char *mem)
}
static void Flush(png_structp png_ptr)
-{
+{
+ (void)png_ptr;
}
static void WriteData( png_structp png_ptr, png_bytep data, png_size_t length)
@@ -93,7 +94,7 @@ static void ReadData( png_structp png_ptr, png_bytep data, png_size_t length)
longjmp(png_jmpbuf(png_ptr), 1);
}
-int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
+int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
{
png_structp png_ptr;
png_infop info_ptr;
@@ -109,35 +110,33 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
compression= (int)(((float)(ibuf->ftype & 0xff) / 11.1111f));
compression= compression < 0 ? 0 : (compression > 9 ? 9 : compression);
+ /* for prints */
+ if(flags & IB_mem)
+ name= "<memory>";
+
bytesperpixel = (ibuf->depth + 7) >> 3;
if ((bytesperpixel > 4) || (bytesperpixel == 2)) {
- printf("imb_savepng: unsupported bytes per pixel: %d\n", bytesperpixel);
+ printf("imb_savepng: Cunsupported bytes per pixel: %d for file: '%s'\n", bytesperpixel, name);
return (0);
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (png_ptr == NULL) {
- printf("Cannot png_create_write_struct\n");
+ printf("imb_savepng: Cannot png_create_write_struct for file: '%s'\n", name);
return 0;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
- printf("Cannot png_create_info_struct\n");
+ printf("imb_savepng: Cannot png_create_info_struct for file: '%s'\n", name);
return 0;
}
if (setjmp(png_jmpbuf(png_ptr))) {
png_destroy_write_struct(&png_ptr, &info_ptr);
- if (pixels) MEM_freeN(pixels);
- if (row_pointers) MEM_freeN(row_pointers);
- // printf("Aborting\n");
- if (fp) {
- fflush(fp);
- fclose(fp);
- }
+ printf("imb_savepng: Cannot setjmp for file: '%s'\n", name);
return 0;
}
@@ -145,7 +144,8 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
pixels = MEM_mallocN(ibuf->x * ibuf->y * bytesperpixel * sizeof(unsigned char), "pixels");
if (pixels == NULL) {
- printf("Cannot allocate pixels array\n");
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ printf("imb_savepng: Cannot allocate pixels array of %dx%d, %d bytes per pixel for file: '%s'\n", ibuf->x, ibuf->y, bytesperpixel, name);
return 0;
}
@@ -193,7 +193,9 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
} else {
fp = fopen(name, "wb");
if (!fp) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
MEM_freeN(pixels);
+ printf("imb_savepng: Cannot open file for writing: '%s'\n", name);
return 0;
}
png_init_io(png_ptr, fp);
@@ -256,8 +258,12 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
// allocate memory for an array of row-pointers
row_pointers = (png_bytepp) MEM_mallocN(ibuf->y * sizeof(png_bytep), "row_pointers");
if (row_pointers == NULL) {
- printf("Cannot allocate row-pointers array\n");
+ printf("imb_savepng: Cannot allocate row-pointers array for file '%s'\n", name);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
MEM_freeN(pixels);
+ if (fp) {
+ fclose(fp);
+ }
return 0;
}
@@ -286,7 +292,7 @@ int imb_savepng(struct ImBuf *ibuf, char *name, int flags)
return(1);
}
-struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
{
struct ImBuf *ibuf = 0;
png_structp png_ptr;
@@ -317,7 +323,7 @@ struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags)
return 0;
}
- ps.size = size;
+ ps.size = size; /* XXX, 4gig limit! */
ps.data = mem;
ps.seek = 0;
@@ -368,7 +374,7 @@ struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags)
longjmp(png_jmpbuf(png_ptr), 1);
}
- ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, 8 * bytesperpixel, 0);
if (ibuf) {
ibuf->ftype = PNG;
diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c
index c5122ebe46c..9dbb4512e1f 100644
--- a/source/blender/imbuf/intern/radiance_hdr.c
+++ b/source/blender/imbuf/intern/radiance_hdr.c
@@ -173,7 +173,7 @@ int imb_is_a_hdr(unsigned char *buf)
return 0;
}
-struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags)
+struct ImBuf *imb_loadhdr(unsigned char *mem, size_t size, int flags)
{
struct ImBuf* ibuf;
RGBE* sline;
@@ -202,8 +202,8 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags)
ptr = (unsigned char *)strchr((char*)&mem[x+1], '\n');
ptr++;
- if (flags & IB_test) ibuf = IMB_allocImBuf(width, height, 32, 0, 0);
- else ibuf = IMB_allocImBuf(width, height, 32, (flags & IB_rect)|IB_rectfloat, 0);
+ if (flags & IB_test) ibuf = IMB_allocImBuf(width, height, 32, 0);
+ else ibuf = IMB_allocImBuf(width, height, 32, (flags & IB_rect)|IB_rectfloat);
if (ibuf==NULL) return NULL;
ibuf->ftype = RADHDR;
@@ -333,13 +333,15 @@ static void writeHeader(FILE *file, int width, int height)
fputc(10, file);
}
-int imb_savehdr(struct ImBuf *ibuf, char *name, int flags)
+int imb_savehdr(struct ImBuf *ibuf, const char *name, int flags)
{
FILE* file = fopen(name, "wb");
float *fp= NULL;
int y, width=ibuf->x, height=ibuf->y;
unsigned char *cp= NULL;
+ (void)flags; /* unused */
+
if (file==NULL) return 0;
writeHeader(file, width, height);
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index 3f4e177c78b..d4bd0ea59d0 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -46,7 +46,7 @@
#include "IMB_imbuf.h"
#include "IMB_filetype.h"
-ImBuf *IMB_ibImageFromMemory(unsigned char *mem, int size, int flags)
+ImBuf *IMB_ibImageFromMemory(unsigned char *mem, size_t size, int flags)
{
ImBuf *ibuf;
ImFileType *type;
@@ -79,7 +79,7 @@ ImBuf *IMB_loadifffile(int file, int flags)
{
ImBuf *ibuf;
unsigned char *mem;
- int size;
+ size_t size;
if(file == -1) return 0;
@@ -151,7 +151,7 @@ ImBuf *IMB_testiffname(char *name, int flags)
file = open(filename,O_BINARY|O_RDONLY);
if(file < 0) return 0;
- ibuf=IMB_loadifffile(file, flags|IB_test);
+ ibuf=IMB_loadifffile(file, flags|IB_test|IB_multilayer);
if(ibuf) {
BLI_strncpy(ibuf->name, name, sizeof(ibuf->name));
BLI_strncpy(ibuf->cachename, filename, sizeof(ibuf->cachename));
@@ -166,7 +166,7 @@ static void imb_loadtilefile(ImBuf *ibuf, int file, int tx, int ty, unsigned int
{
ImFileType *type;
unsigned char *mem;
- int size;
+ size_t size;
if(file == -1) return;
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index 53385743bb8..322e887ba8e 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,13 +30,14 @@
*/
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "imbuf.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_allocimbuf.h"
-#include "BKE_utildefines.h"
+
/* blend modes */
diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c
index 4edb7ac7877..ba4e3664c89 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -30,7 +30,9 @@
*/
#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
+
+
#include "MEM_guardedalloc.h"
#include "imbuf.h"
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index 0b8dea01ada..ea6cd0ffd78 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -62,7 +62,7 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1)
if (ibuf1->x <= 1) return(IMB_dupImBuf(ibuf1));
- ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
_p1 = (uchar *) ibuf1->rect;
@@ -123,7 +123,7 @@ struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
p1 = (int *) ibuf1->rect;
@@ -181,7 +181,7 @@ struct ImBuf *IMB_half_y(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
_p1 = (uchar *) ibuf1->rect;
@@ -249,7 +249,7 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1)
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
- ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags, 0);
+ ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags);
if (ibuf2==NULL) return (0);
p1 = (int *) ibuf1->rect;
@@ -286,26 +286,16 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1)
return (ibuf2);
}
-
-struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+/* result in ibuf2, scaling should be done correctly */
+void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
{
- struct ImBuf *ibuf2;
uchar *p1, *p2 = NULL, *dest;
float *p1f, *destf, *p2f = NULL;
int x,y;
int do_rect, do_float;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
-
do_rect= (ibuf1->rect != NULL);
-
- if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
- if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
- ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags, 0);
- if (ibuf2==NULL) return (0);
-
p1f = ibuf1->rect_float;
destf=ibuf2->rect_float;
p1 = (uchar *) ibuf1->rect;
@@ -343,9 +333,26 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
if (do_float) p1f+=4;
}
}
- return (ibuf2);
+
}
+struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
+{
+ struct ImBuf *ibuf2;
+
+ if (ibuf1==NULL) return (0);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+
+ if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
+ if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
+
+ ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags);
+ if (ibuf2==NULL) return (0);
+
+ imb_onehalf_no_alloc(ibuf2, ibuf1);
+
+ return (ibuf2);
+}
/* q_scale_linear_interpolation helper functions */
@@ -1439,7 +1446,7 @@ static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy)
}
}
-struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, short newx, short newy)
+struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, unsigned int newx, unsigned int newy)
{
if (ibuf==NULL) return (0);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
@@ -1468,7 +1475,7 @@ struct imbufRGBA {
float r, g, b, a;
};
-struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, short newx, short newy)
+struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned int newy)
{
unsigned int *rect,*_newrect,*newrect;
struct imbufRGBA *rectf, *_newrectf, *newrectf;
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index b5434b85b5a..fe1e00b4c2f 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -233,18 +233,13 @@ static int dumptarga(struct ImBuf * ibuf, FILE * file)
}
-int imb_savetarga(struct ImBuf * ibuf, char *name, int flags)
+int imb_savetarga(struct ImBuf * ibuf, const char *name, int flags)
{
- char buf[20];
+ char buf[20]= {0};
FILE *fildes;
short ok = 0;
-
- if (ibuf == 0) return (0);
- if (ibuf->rect == 0) return (0);
-
- memset(buf,0,sizeof(buf));
-
- /* buf[0] = 0; length string */
+
+ (void)flags; /* unused */
buf[16] = (ibuf->depth + 0x7 ) & ~0x7;
if (ibuf->depth > 8 ){
@@ -359,7 +354,7 @@ static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect)
}
}
-static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int mem_size, int psize)
+static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, size_t mem_size, int psize)
{
unsigned char *mem_end = mem+mem_size;
int count, col, size;
@@ -470,7 +465,7 @@ partial_load:
complete_partial_load(ibuf, rect);
}
-static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int mem_size, int psize)
+static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, size_t mem_size, int psize)
{
unsigned char *mem_end = mem+mem_size;
int col,size;
@@ -527,7 +522,7 @@ partial_load:
}
-struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags)
+struct ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags)
{
TARGA tga;
struct ImBuf * ibuf;
@@ -537,8 +532,8 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags)
if (checktarga(&tga,mem) == 0) return(0);
- if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0, 0);
- else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect, 0);
+ if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0);
+ else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect);
if (ibuf == 0) return(0);
ibuf->ftype = TGA;
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index f3415d44ecb..24c5a755aef 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -122,7 +122,7 @@ static const char hex[17] = "0123456789abcdef";
/* Note: This escape function works on file: URIs, but if you want to
* escape something else, please read RFC-2396 */
-void escape_uri_string (const char *string, char* escaped_string, int len,UnsafeCharacterSet mask)
+static void escape_uri_string (const char *string, char* escaped_string, int len,UnsafeCharacterSet mask)
{
#define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask))
@@ -148,7 +148,7 @@ void escape_uri_string (const char *string, char* escaped_string, int len,Unsafe
*q = '\0';
}
-void to_hex_char(char* hexbytes, const unsigned char* bytes, int len)
+static void to_hex_char(char* hexbytes, const unsigned char* bytes, int len)
{
const unsigned char *p;
char *q;
@@ -202,7 +202,7 @@ static int uri_from_filename( const char *path, char *uri )
return 1;
}
-static void thumbname_from_uri(const char* uri, char* thumb)
+static void thumbname_from_uri(const char* uri, char* thumb, const int thumb_len)
{
char hexdigest[33];
unsigned char digest[16];
@@ -211,24 +211,24 @@ static void thumbname_from_uri(const char* uri, char* thumb)
hexdigest[0] = '\0';
to_hex_char(hexdigest, digest, 16);
hexdigest[32] = '\0';
- sprintf(thumb, "%s.png", hexdigest);
+ BLI_snprintf(thumb, thumb_len, "%s.png", hexdigest);
}
-static int thumbpath_from_uri(const char* uri, char* path, ThumbSize size)
+static int thumbpath_from_uri(const char* uri, char* path, const int path_len, ThumbSize size)
{
char tmppath[FILE_MAX];
int rv = 0;
if (get_thumb_dir(tmppath, size)) {
char thumb[40];
- thumbname_from_uri(uri, thumb);
- BLI_snprintf(path, FILE_MAX, "%s%s", tmppath, thumb);
+ thumbname_from_uri(uri, thumb, sizeof(thumb));
+ BLI_snprintf(path, path_len, "%s%s", tmppath, thumb);
rv = 1;
}
return rv;
}
-void IMB_thumb_makedirs()
+void IMB_thumb_makedirs(void)
{
char tpath[FILE_MAX];
if (get_thumb_dir(tpath, THB_NORMAL)) {
@@ -271,7 +271,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
}
uri_from_filename(path, uri);
- thumbname_from_uri(uri, thumb);
+ thumbname_from_uri(uri, thumb, sizeof(thumb));
if (get_thumb_dir(tdir, size)) {
BLI_snprintf(tpath, FILE_MAX, "%s%s", tdir, thumb);
thumb[8] = '\0'; /* shorten for tempname, not needed anymore */
@@ -280,7 +280,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
return NULL;
}
if (size == THB_FAIL) {
- img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata, 0);
+ img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata);
if (!img) return 0;
} else {
if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) {
@@ -297,9 +297,9 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
if (img != NULL) {
stat(path, &info);
- sprintf(mtime, "%ld", info.st_mtime);
- sprintf(cwidth, "%d", img->x);
- sprintf(cheight, "%d", img->y);
+ BLI_snprintf(mtime, sizeof(mtime), "%ld", info.st_mtime);
+ BLI_snprintf(cwidth, sizeof(cwidth), "%d", img->x);
+ BLI_snprintf(cheight, sizeof(cheight), "%d", img->y);
}
} else if (THB_SOURCE_MOVIE == source) {
struct anim * anim = NULL;
@@ -315,7 +315,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
IMB_free_anim(anim);
}
stat(path, &info);
- sprintf(mtime, "%ld", info.st_mtime);
+ BLI_snprintf(mtime, sizeof(mtime), "%ld", info.st_mtime);
}
if (!img) return 0;
@@ -332,7 +332,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
IMB_scaleImBuf(img, ex, ey);
}
- sprintf(desc, "Thumbnail for %s", uri);
+ BLI_snprintf(desc, sizeof(desc), "Thumbnail for %s", uri);
IMB_metadata_change_field(img, "Description", desc);
IMB_metadata_change_field(img, "Software", "Blender");
IMB_metadata_change_field(img, "Thumb::URI", uri);
@@ -365,7 +365,7 @@ ImBuf* IMB_thumb_read(const char* path, ThumbSize size)
if (!uri_from_filename(path,uri)) {
return NULL;
}
- if (thumbpath_from_uri(uri, thumb, size)) {
+ if (thumbpath_from_uri(uri, thumb, sizeof(thumb), size)) {
img = IMB_loadiffname(thumb, IB_rect | IB_metadata);
}
@@ -381,7 +381,7 @@ void IMB_thumb_delete(const char* path, ThumbSize size)
if (!uri_from_filename(path ,uri)) {
return;
}
- if (thumbpath_from_uri(uri, thumb, size)) {
+ if (thumbpath_from_uri(uri, thumb, sizeof(thumb), size)) {
if (strncmp(path, thumb, strlen(thumb)) == 0) {
return;
}
@@ -406,14 +406,14 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
if (!uri_from_filename(path,uri)) {
return NULL;
}
- if (thumbpath_from_uri(uri, thumb, THB_FAIL)) {
+ if (thumbpath_from_uri(uri, thumb, sizeof(thumb), THB_FAIL)) {
/* failure thumb exists, don't try recreating */
if (BLI_exists(thumb)) {
return NULL;
}
}
- if (thumbpath_from_uri(uri, thumb, size)) {
+ if (thumbpath_from_uri(uri, thumb, sizeof(thumb), size)) {
if (strncmp(path, thumb, strlen(thumb)) == 0) {
img = IMB_loadiffname(path, IB_rect);
} else {
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index 2fef230f1c2..f12a795b0d6 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,8 @@
#include "zlib.h"
+#include "BLI_utildefines.h"
+
#include "BKE_utildefines.h"
#include "BKE_global.h"
@@ -102,7 +104,7 @@ static ImBuf *loadblend_thumb(gzFile gzfile)
return NULL;
/* finally malloc and read the data */
- img= IMB_allocImBuf(size[0], size[1], 32, IB_rect | IB_metadata, 0);
+ img= IMB_allocImBuf(size[0], size[1], 32, IB_rect | IB_metadata);
if(gzread(gzfile, img->rect, bhead[1]) != bhead[1]) {
IMB_freeImBuf(img);
@@ -161,11 +163,11 @@ void IMB_overlayblend_thumb(unsigned int *thumb, int width, int height, float as
{
int x, y;
- int hline, vline;
int stride_x= (margin_r - margin_l) - 2;
for(y=0; y < height; y++) {
for(x=0; x < width; x++, px+=4) {
+ int hline= 0, vline= 0;
if((x > margin_l && x < margin_r) && (y > margin_b && y < margin_t)) {
/* interior. skip */
x += stride_x;
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 6b94583f17d..35c1c372e71 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -45,12 +45,13 @@
#include <string.h>
#include "imbuf.h"
-
-#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BLI_math.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -93,11 +94,18 @@ typedef struct ImbTIFFMemFile {
static void imb_tiff_DummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
{
+ (void)fd;
+ (void)base;
+ (void)size;
}
static int imb_tiff_DummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
{
- return (0);
+ (void)fd;
+ (void)pbase;
+ (void)psize;
+
+ return (0);
}
/**
@@ -154,6 +162,10 @@ static tsize_t imb_tiff_ReadProc(thandle_t handle, tdata_t data, tsize_t n)
*/
static tsize_t imb_tiff_WriteProc(thandle_t handle, tdata_t data, tsize_t n)
{
+ (void)handle;
+ (void)data;
+ (void)n;
+
printf("imb_tiff_WriteProc: this function should not be called.\n");
return (-1);
}
@@ -262,7 +274,7 @@ static toff_t imb_tiff_SizeProc(thandle_t handle)
return (toff_t)(mfile->size);
}
-static TIFF *imb_tiff_client_open(ImbTIFFMemFile *memFile, unsigned char *mem, int size)
+static TIFF *imb_tiff_client_open(ImbTIFFMemFile *memFile, unsigned char *mem, size_t size)
{
/* open the TIFF client layer interface to the in-memory file */
memFile->mem = mem;
@@ -368,7 +380,7 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul)
ib_flag = IB_rect;
}
- tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag, 0);
+ tmpibuf= IMB_allocImBuf(ibuf->x, ibuf->y, ibuf->depth, ib_flag);
/* simple RGBA image */
if (!(bitspersample == 32 || bitspersample == 16)) {
@@ -423,9 +435,11 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul)
if(success) {
ibuf->profile = (bitspersample==32)?IB_PROFILE_LINEAR_RGB:IB_PROFILE_SRGB;
-
- if(ENDIAN_ORDER == B_ENDIAN)
- IMB_convert_rgba_to_abgr(tmpibuf);
+
+// Code seems to be not needed for 16 bits tif, on PPC G5 OSX (ton)
+ if(bitspersample < 16)
+ if(ENDIAN_ORDER == B_ENDIAN)
+ IMB_convert_rgba_to_abgr(tmpibuf);
if(premul) {
IMB_premultiply_alpha(tmpibuf);
ibuf->flags |= IB_premul;
@@ -464,7 +478,7 @@ void imb_inittiff(void)
*
* @return: A newly allocated ImBuf structure if successful, otherwise NULL.
*/
-ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
+ImBuf *imb_loadtiff(unsigned char *mem, size_t size, int flags)
{
TIFF *image = NULL;
ImBuf *ibuf = NULL, *hbuf;
@@ -497,7 +511,7 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
ib_depth = (spp==3)?24:32;
- ibuf = IMB_allocImBuf(width, height, ib_depth, 0, 0);
+ ibuf = IMB_allocImBuf(width, height, ib_depth, 0);
if(ibuf) {
ibuf->ftype = TIF;
}
@@ -533,7 +547,7 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
width= (width > 1)? width/2: 1;
height= (height > 1)? height/2: 1;
- hbuf= IMB_allocImBuf(width, height, 32, 0, 0);
+ hbuf= IMB_allocImBuf(width, height, 32, 0);
hbuf->miplevel= level;
hbuf->ftype= ibuf->ftype;
ibuf->mipmap[level-1] = hbuf;
@@ -573,7 +587,7 @@ ImBuf *imb_loadtiff(unsigned char *mem, int size, int flags)
return ibuf;
}
-void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty, unsigned int *rect)
+void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, size_t size, int tx, int ty, unsigned int *rect)
{
TIFF *image = NULL;
uint32 width, height;
@@ -631,7 +645,7 @@ void imb_loadtiletiff(ImBuf *ibuf, unsigned char *mem, int size, int tx, int ty,
* @return: 1 if the function is successful, 0 on failure.
*/
-int imb_savetiff(ImBuf *ibuf, char *name, int flags)
+int imb_savetiff(ImBuf *ibuf, const char *name, int flags)
{
TIFF *image = NULL;
uint16 samplesperpixel, bitspersample;
@@ -748,7 +762,7 @@ int imb_savetiff(ImBuf *ibuf, char *name, int flags)
if (samplesperpixel == 4) {
to16[to_i+3] = FTOUSHORT(fromf[from_i+3]);
- to_i++; from_i++;
+ /*to_i++; from_i++;*/ /*unused, set on each loop */
}
}
else {
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index cd447e5e43a..cdb7823e4f5 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -126,6 +126,7 @@ const char *imb_ext_movie[] = {
".flv",
".divx",
".xvid",
+ ".mxf",
NULL};
/* sort of wrong being here... */
@@ -142,7 +143,7 @@ const char *imb_ext_audio[] = {
".eac3",
NULL};
-static int IMB_ispic_name(char *name)
+static int IMB_ispic_name(const char *name)
{
ImFileType *type;
struct stat st;
@@ -176,7 +177,7 @@ static int IMB_ispic_name(char *name)
return FALSE;
}
-int IMB_ispic(char *filename)
+int IMB_ispic(const char *filename)
{
if(U.uiflag & USER_FILTERFILEEXTS) {
if( (BLI_testextensie_array(filename, imb_ext_image)) ||
@@ -195,12 +196,12 @@ int IMB_ispic(char *filename)
-static int isavi (char *name) {
+static int isavi (const char *name) {
return AVI_is_avi (name);
}
#ifdef WITH_QUICKTIME
-static int isqtime (char *name) {
+static int isqtime (const char *name) {
return anim_is_quicktime (name);
}
#endif
@@ -219,8 +220,8 @@ void silence_log_ffmpeg(int quiet)
}
}
-extern void do_init_ffmpeg();
-void do_init_ffmpeg()
+extern void do_init_ffmpeg(void);
+void do_init_ffmpeg(void)
{
static int ffmpeg_init = 0;
if (!ffmpeg_init) {
@@ -248,7 +249,7 @@ static AVCodecContext* get_codec_from_stream(AVStream* stream)
#endif
-static int isffmpeg (char *filename) {
+static int isffmpeg (const char *filename) {
AVFormatContext *pFormatCtx;
unsigned int i;
int videoStream;
@@ -319,7 +320,7 @@ static int isffmpeg (char *filename) {
#endif
#ifdef WITH_REDCODE
-static int isredcode(char * filename)
+static int isredcode(const char * filename)
{
struct redcode_handle * h = redcode_open(filename);
if (!h) {
@@ -331,7 +332,7 @@ static int isredcode(char * filename)
#endif
-int imb_get_anim_type(char * name) {
+int imb_get_anim_type(const char * name) {
int type;
struct stat st;
@@ -372,7 +373,7 @@ int imb_get_anim_type(char * name) {
return(0);
}
-int IMB_isanim(char *filename) {
+int IMB_isanim(const char *filename) {
int type;
if(U.uiflag & USER_FILTERFILEEXTS) {
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index b55ce4b1df4..d6694efec91 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -37,7 +37,7 @@
#include "imbuf.h"
-short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
+short IMB_saveiff(struct ImBuf *ibuf, const char *name, int flags)
{
ImFileType *type;
@@ -50,7 +50,7 @@ short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
if(ibuf->rect==NULL && ibuf->rect_float)
IMB_rect_from_float(ibuf);
}
-
+ /* TODO. have const char for image write funcs */
return type->save(ibuf, name, flags);
}
}
diff --git a/source/blender/makesdna/CMakeLists.txt b/source/blender/makesdna/CMakeLists.txt
index cb61082000d..e02b33b92c1 100644
--- a/source/blender/makesdna/CMakeLists.txt
+++ b/source/blender/makesdna/CMakeLists.txt
@@ -24,4 +24,4 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(intern)
+add_subdirectory(intern)
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 49c2df42810..267283ee47a 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/DNA_ID.h (mar-2001 nzc)
- *
- * ID and Library types, which are fundamental for sdna,
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,11 @@
#ifndef DNA_ID_H
#define DNA_ID_H
+/** \file DNA_ID.h
+ * \ingroup DNA
+ * \brief ID and Library types, which are fundamental for sdna.
+ */
+
#include "DNA_listBase.h"
#ifdef __cplusplus
@@ -127,8 +128,9 @@ typedef struct Library {
#define PREVIEW_MIPMAP_LARGE 1
typedef struct PreviewImage {
+ /* All values of 2 are really PREVIEW_MIPMAPS */
unsigned int w[2];
- unsigned int h[2];
+ unsigned int h[2];
short changed[2];
short changed_timestamp[2];
unsigned int * rect[2];
@@ -199,6 +201,11 @@ typedef struct PreviewImage {
#define ID_REAL_USERS(id) (((ID *)id)->us - ((((ID *)id)->flag & LIB_FAKEUSER) ? 1:0))
+#ifdef GS
+#undef GS
+#endif
+#define GS(a) (*((short *)(a)))
+
/* id->flag: set frist 8 bits always at zero while reading */
#define LIB_LOCAL 0
#define LIB_EXTERN 1
@@ -215,6 +222,8 @@ typedef struct PreviewImage {
#define LIB_DOIT 1024
/* tag existing data before linking so we know what is new */
#define LIB_PRE_EXISTING 2048
+/* runtime */
+#define LIB_ID_RECALC 4096
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index f7bbf9235ab..1618da90392 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file DNA_action_types.h
+ * \ingroup DNA
+ */
+
#ifndef DNA_ACTION_TYPES_H
#define DNA_ACTION_TYPES_H
@@ -56,7 +60,7 @@ typedef struct bMotionPathVert {
/* bMotionPathVert->flag */
typedef enum eMotionPathVert_Flag {
/* vert is selected */
- MOTIONPATH_VERT_SEL = (1<<0),
+ MOTIONPATH_VERT_SEL = (1<<0)
} eMotionPathVert_Flag;
/* ........ */
@@ -79,7 +83,7 @@ typedef enum eMotionPath_Flag {
/* (for bones) path represents the head of the bone */
MOTIONPATH_FLAG_BHEAD = (1<<0),
/* motion path is being edited */
- MOTIONPATH_FLAG_EDIT = (1<<1),
+ MOTIONPATH_FLAG_EDIT = (1<<1)
} eMotionPath_Flag;
/* Visualisation General --------------------------- */
@@ -114,7 +118,7 @@ typedef struct bAnimVizSettings {
/* bAnimVizSettings->recalc */
typedef enum eAnimViz_RecalcFlags {
/* motionpaths need recalculating */
- ANIMVIZ_RECALC_PATHS = (1<<0),
+ ANIMVIZ_RECALC_PATHS = (1<<0)
} eAnimViz_RecalcFlags;
@@ -127,13 +131,13 @@ typedef enum eOnionSkin_Types {
/* show ghosts within the specified frame range */
GHOST_TYPE_RANGE,
/* show ghosts on keyframes within the specified range only */
- GHOST_TYPE_KEYS,
+ GHOST_TYPE_KEYS
} eOnionSkin_Types;
/* bAnimVizSettings->ghost_flag */
typedef enum eOnionSkin_Flag {
/* only show selected bones in ghosts */
- GHOST_FLAG_ONLYSEL = (1<<0),
+ GHOST_FLAG_ONLYSEL = (1<<0)
} eOnionSkin_Flag;
@@ -142,7 +146,7 @@ typedef enum eMotionPaths_Types {
/* show the paths along their entire ranges */
MOTIONPATH_TYPE_RANGE = 0,
/* only show the parts of the paths around the current frame */
- MOTIONPATH_TYPE_ACFRA,
+ MOTIONPATH_TYPE_ACFRA
} eMotionPath_Types;
/* bAnimVizSettings->path_viewflag */
@@ -154,7 +158,7 @@ typedef enum eMotionPaths_ViewFlag {
/* show keyframe/frame numbers */
MOTIONPATH_VIEW_KFNOS = (1<<2),
/* find keyframes in whole action (instead of just in matching group name) */
- MOTIONPATH_VIEW_KFACT = (1<<3),
+ MOTIONPATH_VIEW_KFACT = (1<<3)
} eMotionPath_ViewFlag;
/* bAnimVizSettings->path_bakeflag */
@@ -164,7 +168,7 @@ typedef enum eMotionPaths_BakeFlag {
/* for bones - calculate head-points for curves instead of tips */
MOTIONPATH_BAKE_HEADS = (1<<1),
/* motion paths exist for AnimVizSettings instance - set when calc for first time, and unset when clearing */
- MOTIONPATH_BAKE_HAS_PATHS = (1<<2),
+ MOTIONPATH_BAKE_HAS_PATHS = (1<<2)
} eMotionPath_BakeFlag;
/* ************************************************ */
@@ -188,7 +192,7 @@ typedef struct bPoseChannel {
short flag; /* dynamic, for detecting transform changes */
short constflag; /* for quick detecting which constraints affect this channel */
short ikflag; /* settings for IK bones */
- short selectflag; /* copy of bone flag, so you can work with library armatures */
+ short selectflag; /* copy of bone flag, so you can work with library armatures, not for runtime use */
short protectflag; /* protect channels from being transformed */
short agrp_index; /* index of action-group this bone belongs to (0 = default/no group) */
@@ -203,12 +207,10 @@ typedef struct bPoseChannel {
struct bPoseChannel *child; /* set on read file or rebuild pose, the 'ik' child, for b-bones */
struct ListBase iktree; /* only while evaluating pose */
- /* only while deform, stores precalculated b_bone deform mats,
- dual quaternions */
- void *b_bone_mats;
- void *dual_quat;
- void *b_bone_dual_quats;
-
+ bMotionPath *mpath; /* motion path cache for this bone */
+ struct Object *custom; /* draws custom object instead of default bone shape */
+ struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
+
/* transforms - written in by actions or transform */
float loc[3];
float size[3];
@@ -234,9 +236,6 @@ typedef struct bPoseChannel {
float iklinweight; /* weight of joint stretch constraint */
float *path; /* totpath x 3 x float */ // XXX depreceated... old animation system (armature only viz)
- bMotionPath *mpath; /* motion path cache for this bone */
- struct Object *custom; /* draws custom object instead of default bone shape */
- struct bPoseChannel *custom_tx; /* odd feature, display with another bones transform. needed in rare cases for advanced rigs, since the alternative is highly complicated - campbell */
} bPoseChannel;
@@ -265,7 +264,7 @@ typedef enum ePchan_Flag {
/* has Spline IK */
POSE_HAS_IKS = (1<<14),
/* spline IK solving */
- POSE_IKSPLINE = (1<<15),
+ POSE_IKSPLINE = (1<<15)
} ePchan_Flag;
/* PoseChannel constflag (constraint detection) */
@@ -278,7 +277,7 @@ typedef enum ePchan_ConstFlag {
/* only for drawing Posemode too */
PCHAN_HAS_STRIDE = (1<<4),
/* spline IK */
- PCHAN_HAS_SPLINEIK = (1<<5),
+ PCHAN_HAS_SPLINEIK = (1<<5)
} ePchan_ConstFlag;
/* PoseChannel->ikflag */
@@ -296,7 +295,7 @@ typedef enum ePchan_IkFlag {
BONE_IK_NO_XDOF_TEMP = (1<<10),
BONE_IK_NO_YDOF_TEMP = (1<<11),
- BONE_IK_NO_ZDOF_TEMP = (1<<12),
+ BONE_IK_NO_ZDOF_TEMP = (1<<12)
} ePchan_IkFlag;
/* PoseChannel->rotmode and Object->rotmode */
@@ -314,9 +313,11 @@ typedef enum eRotationModes {
/* NOTE: space is reserved here for 18 other possible
* euler rotation orders not implemented
*/
- ROT_MODE_MAX, /* sentinel for Py API */
/* axis angle rotations */
- ROT_MODE_AXISANGLE = -1
+ ROT_MODE_AXISANGLE = -1,
+
+ ROT_MODE_MIN = ROT_MODE_AXISANGLE, /* sentinel for Py API */
+ ROT_MODE_MAX = ROT_MODE_ZYX
} eRotationModes;
/* Pose ------------------------------------ */
@@ -330,7 +331,9 @@ typedef struct bPose {
ListBase chanbase; /* list of pose channels, PoseBones in RNA */
struct GHash *chanhash; /* ghash for quicker string lookups */
- short flag, proxy_layer; /* proxy layer: copy from armature, gets synced */
+ short flag, pad;
+ unsigned int proxy_layer; /* proxy layer: copy from armature, gets synced */
+ int pad1;
float ctime; /* local action time of this pose */
float stride_offset[3]; /* applied to object */
@@ -364,7 +367,7 @@ typedef enum ePose_Flags {
/* set by armature_rebuild_pose to give a chance to the IK solver to rebuild IK tree */
POSE_WAS_REBUILT = (1<<5),
/* set by game_copy_pose to indicate that this pose is used in the game engine */
- POSE_GAME_ENGINE = (1<<6),
+ POSE_GAME_ENGINE = (1<<6)
} ePose_Flags;
/* IK Solvers ------------------------------------ */
@@ -372,7 +375,7 @@ typedef enum ePose_Flags {
/* bPose->iksolver and bPose->ikparam->iksolver */
typedef enum ePose_IKSolverType {
IKSOLVER_LEGACY = 0,
- IKSOLVER_ITASC,
+ IKSOLVER_ITASC
} ePose_IKSolverType;
/* header for all bPose->ikparam structures */
@@ -401,7 +404,7 @@ typedef enum eItasc_Flags {
ITASC_AUTO_STEP = (1<<0),
ITASC_INITIAL_REITERATION = (1<<1),
ITASC_REITERATION = (1<<2),
- ITASC_SIMULATION = (1<<3),
+ ITASC_SIMULATION = (1<<3)
} eItasc_Flags;
/* bItasc->solver */
@@ -425,7 +428,7 @@ typedef enum eItasc_Solver {
* ensure that action-groups never end up being the sole 'owner' of a channel.
*
* This is also exploited for bone-groups. Bone-Groups are stored per bPose, and are used
- * primarily to colour bones in the 3d-view. There are other benefits too, but those are mostly related
+ * primarily to color bones in the 3d-view. There are other benefits too, but those are mostly related
* to Action-Groups.
*/
typedef struct bActionGroup {
@@ -496,7 +499,7 @@ typedef enum eAction_Flags {
/* flags for evaluation/editing */
ACT_MUTED = (1<<9),
ACT_PROTECTED = (1<<10),
- ACT_DISABLED = (1<<11),
+ ACT_DISABLED = (1<<11)
} eAction_Flags;
@@ -533,7 +536,7 @@ typedef enum eDopeSheet_FilterFlag {
ADS_FILTER_NOSHAPEKEYS = (1<<6),
ADS_FILTER_NOMESH = (1<<7),
ADS_FILTER_NOOBJ = (1<<8), /* for animdata on object level, if we only want to concentrate on materials/etc. */
- // NOTE: there are a few more spaces for datablock filtering here...
+ ADS_FILTER_NOLAT = (1<<9),
ADS_FILTER_NOCAM = (1<<10),
ADS_FILTER_NOMAT = (1<<11),
ADS_FILTER_NOLAM = (1<<12),
@@ -553,12 +556,12 @@ typedef enum eDopeSheet_FilterFlag {
ADS_FILTER_INCL_HIDDEN = (1<<26), /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */
/* combination filters (some only used at runtime) */
- ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM),
+ ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM)
} eDopeSheet_FilterFlag;
/* DopeSheet general flags */
typedef enum eDopeSheet_Flag {
- ADS_FLAG_SUMMARY_COLLAPSED = (1<<0), /* when summary is shown, it is collapsed, so all other channels get hidden */
+ ADS_FLAG_SUMMARY_COLLAPSED = (1<<0) /* when summary is shown, it is collapsed, so all other channels get hidden */
} eDopeSheet_Flag;
@@ -596,9 +599,9 @@ typedef enum eSAction_Flag {
SACTION_NOTRANSKEYCULL = (1<<4),
/* don't include keyframes that are out of view */
//SACTION_HORIZOPTIMISEON = (1<<5), // XXX depreceated... old irrelevant trick
- /* hack for moving pose-markers (temp flag) */
- SACTION_POSEMARKERS_MOVE = (1<<6),
- /* don't draw action channels using group colours (where applicable) */
+ /* show pose-markers (local to action) in Action Editor mode */
+ SACTION_POSEMARKERS_SHOW = (1<<6),
+ /* don't draw action channels using group colors (where applicable) */
SACTION_NODRAWGCOLORS = (1<<7), // XXX depreceated... irrelevant for current groups implementation
/* don't draw current frame number beside frame indicator */
SACTION_NODRAWCFRANUM = (1<<8),
@@ -607,7 +610,7 @@ typedef enum eSAction_Flag {
/* don't perform realtime updates */
SACTION_NOREALTIMEUPDATES = (1<<10),
/* move markers as well as keyframes */
- SACTION_MARKERS_MOVE = (1<<11),
+ SACTION_MARKERS_MOVE = (1<<11)
} eSAction_Flag;
/* SpaceAction Mode Settings */
@@ -619,7 +622,7 @@ typedef enum eAnimEdit_Context {
/* editing of gpencil data */
SACTCONT_GPENCIL,
/* dopesheet (default) */
- SACTCONT_DOPESHEET,
+ SACTCONT_DOPESHEET
} eAnimEdit_Context;
/* SpaceAction AutoSnap Settings (also used by other Animation Editors) */
@@ -631,7 +634,7 @@ typedef enum eAnimEdit_AutoSnap {
/* snap to actual frames/seconds (nla-action time) */
SACTSNAP_FRAME,
/* snap to nearest marker */
- SACTSNAP_MARKER,
+ SACTSNAP_MARKER
} eAnimEdit_AutoSnap;
@@ -670,7 +673,7 @@ typedef enum ACHAN_FLAG {
ACHAN_EXPANDED = (1<<4),
ACHAN_SHOWIPO = (1<<5),
ACHAN_SHOWCONS = (1<<6),
- ACHAN_MOVED = (1<<31),
+ ACHAN_MOVED = (1<<31)
} ACHAN_FLAG;
#endif
diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h
index 76bb9a5f96f..683d8142cc9 100644
--- a/source/blender/makesdna/DNA_actuator_types.h
+++ b/source/blender/makesdna/DNA_actuator_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_actuator_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file DNA_actuator_types.h
+ * \ingroup DNA
+ */
+
#ifndef DNA_ACTUATOR_TYPES_H
#define DNA_ACTUATOR_TYPES_H
@@ -48,7 +51,7 @@ typedef struct bAddObjectActuator {
typedef struct bActionActuator {
struct bAction *act; /* Pointer to action */
short type, flag; /* Playback type */ // not in use
- int sta, end; /* Start & End frames */
+ float sta, end; /* Start & End frames */
char name[32]; /* For property-driven playback */
char frameProp[32]; /* Set this property to the actions current frame */
short blendin; /* Number of frames of blending */
@@ -112,14 +115,14 @@ typedef struct bObjectActuator {
short damping;
float forceloc[3], forcerot[3];
float pad[3], pad1[3];
- float dloc[3], drot[3];
+ float dloc[3], drot[3]; /* angle in radians */
float linearvelocity[3], angularvelocity[3];
struct Object *reference;
} bObjectActuator;
typedef struct bIpoActuator {
short flag, type;
- int sta, end;
+ float sta, end;
char name[32];
char frameProp[32]; /* Set this property to the actions current frame */
@@ -227,14 +230,14 @@ typedef struct bActuator {
struct bActuator *next, *prev, *mynew;
short type;
/**
- * Tells what type of actuator data <data> holds.
+ * Tells what type of actuator data \ref data holds.
*/
short flag;
short otype, go;
char name[32];
/**
- * Data must point to an object actuator type struct.
+ * data must point to an object actuator type struct.
*/
void *data;
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index 8c2fc7db390..31e02ff1877 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,10 @@
#ifndef DNA_ANIM_TYPES_H
#define DNA_ANIM_TYPES_H
+/** \file DNA_anim_types.h
+ * \ingroup DNA
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -88,7 +92,7 @@ typedef enum eFModifier_Flags {
/* modifier is active one (in UI) for editing purposes */
FMODIFIER_FLAG_ACTIVE = (1<<2),
/* user wants modifier to be skipped */
- FMODIFIER_FLAG_MUTED = (1<<3),
+ FMODIFIER_FLAG_MUTED = (1<<3)
} eFModifier_Flags;
/* --- */
@@ -109,7 +113,7 @@ typedef struct FMod_Generator {
/* generator modes */
typedef enum eFMod_Generator_Modes {
FCM_GENERATOR_POLYNOMIAL = 0,
- FCM_GENERATOR_POLYNOMIAL_FACTORISED,
+ FCM_GENERATOR_POLYNOMIAL_FACTORISED
} eFMod_Generator_Modes;
@@ -118,7 +122,7 @@ typedef enum eFMod_Generator_Modes {
*/
typedef enum eFMod_Generator_Flags {
/* generator works in conjunction with other modifiers (i.e. doesn't replace those before it) */
- FCM_GENERATOR_ADDITIVE = (1<<0),
+ FCM_GENERATOR_ADDITIVE = (1<<0)
} eFMod_Generator_Flags;
@@ -149,7 +153,7 @@ typedef enum eFMod_Generator_Functions {
FCM_GENERATOR_FN_TAN,
FCM_GENERATOR_FN_SQRT,
FCM_GENERATOR_FN_LN,
- FCM_GENERATOR_FN_SINC,
+ FCM_GENERATOR_FN_SINC
} eFMod_Generator_Functions;
@@ -186,7 +190,7 @@ typedef enum eFMod_Cycling_Modes {
FCM_EXTRAPOLATE_NONE = 0, /* don't do anything */
FCM_EXTRAPOLATE_CYCLIC, /* repeat keyframe range as-is */
FCM_EXTRAPOLATE_CYCLIC_OFFSET, /* repeat keyframe range, but with offset based on gradient between values */
- FCM_EXTRAPOLATE_MIRROR, /* alternate between forward and reverse playback of keyframe range */
+ FCM_EXTRAPOLATE_MIRROR /* alternate between forward and reverse playback of keyframe range */
} eFMod_Cycling_Modes;
@@ -209,7 +213,7 @@ typedef enum eFMod_Limit_Flags {
FCM_LIMIT_XMIN = (1<<0),
FCM_LIMIT_XMAX = (1<<1),
FCM_LIMIT_YMIN = (1<<2),
- FCM_LIMIT_YMAX = (1<<3),
+ FCM_LIMIT_YMAX = (1<<3)
} eFMod_Limit_Flags;
@@ -229,7 +233,7 @@ typedef enum eFMod_Noise_Modifications {
FCM_NOISE_MODIF_REPLACE = 0, /* Modify existing curve, matching it's shape */
FCM_NOISE_MODIF_ADD, /* Add noise to the curve */
FCM_NOISE_MODIF_SUBTRACT, /* Subtract noise from the curve */
- FCM_NOISE_MODIF_MULTIPLY, /* Multiply the curve by noise */
+ FCM_NOISE_MODIF_MULTIPLY /* Multiply the curve by noise */
} eFMod_Noise_Modifications;
@@ -379,7 +383,7 @@ typedef enum eDriver_Types {
/* smallest value */
DRIVER_TYPE_MIN,
/* largest value */
- DRIVER_TYPE_MAX,
+ DRIVER_TYPE_MAX
} eDriver_Types;
/* driver flags */
@@ -396,7 +400,7 @@ typedef enum eDriver_Flags {
/* the names are cached so they dont need have python unicode versions created each time */
DRIVER_FLAG_RENAMEVAR = (1<<4),
/* intermediate values of driver should be shown in the UI for debugging purposes */
- DRIVER_FLAG_SHOWDEBUG = (1<<5),
+ DRIVER_FLAG_SHOWDEBUG = (1<<5)
} eDriver_Flags;
/* F-Curves -------------------------------------- */
@@ -465,19 +469,22 @@ typedef enum eFCurve_Flags {
FCURVE_INT_VALUES = (1<<11),
/* curve can only have certain discrete-number values (no interpolation at all, for enums/booleans) */
FCURVE_DISCRETE_VALUES = (1<<12),
+
+ /* temporary tag for editing */
+ FCURVE_TAGGED = (1<<15)
} eFCurve_Flags;
/* extrapolation modes (only simple value 'extending') */
typedef enum eFCurve_Extend {
FCURVE_EXTRAPOLATE_CONSTANT = 0, /* just extend min/max keyframe value */
- FCURVE_EXTRAPOLATE_LINEAR, /* just extend gradient of segment between first segment keyframes */
+ FCURVE_EXTRAPOLATE_LINEAR /* just extend gradient of segment between first segment keyframes */
} eFCurve_Extend;
/* curve coloring modes */
typedef enum eFCurve_Coloring {
FCURVE_COLOR_AUTO_RAINBOW = 0, /* automatically determine color using rainbow (calculated at drawtime) */
FCURVE_COLOR_AUTO_RGB, /* automatically determine color using XYZ (array index) <-> RGB */
- FCURVE_COLOR_CUSTOM, /* custom color */
+ FCURVE_COLOR_CUSTOM /* custom color */
} eFCurve_Coloring;
/* ************************************************ */
@@ -572,7 +579,7 @@ typedef enum eNlaStrip_Blend_Mode {
NLASTRIP_MODE_REPLACE = 0,
NLASTRIP_MODE_ADD,
NLASTRIP_MODE_SUBTRACT,
- NLASTRIP_MODE_MULTIPLY,
+ NLASTRIP_MODE_MULTIPLY
} eNlaStrip_Blend_Mode;
/* NLA Strip Extrpolation Mode */
@@ -582,7 +589,7 @@ typedef enum eNlaStrip_Extrapolate_Mode {
/* only hold+extend last frame */
NLASTRIP_EXTEND_HOLD_FORWARD,
/* don't contribute at all */
- NLASTRIP_EXTEND_NOTHING,
+ NLASTRIP_EXTEND_NOTHING
} eNlaStrip_Extrapolate_Mode;
/* NLA Strip Settings */
@@ -619,7 +626,7 @@ typedef enum eNlaStrip_Flag {
/* temporary editing flags */
/* NLA-Strip is really just a temporary meta used to facilitate easier transform code */
NLASTRIP_FLAG_TEMP_META = (1<<30),
- NLASTRIP_FLAG_EDIT_TOUCHED = (1<<31),
+ NLASTRIP_FLAG_EDIT_TOUCHED = (1<<31)
} eNlaStrip_Flag;
/* NLA Strip Type */
@@ -629,7 +636,7 @@ typedef enum eNlaStrip_Type {
/* 'transition' - blends between the adjacent strips */
NLASTRIP_TYPE_TRANSITION,
/* 'meta' - a strip which acts as a container for a few others */
- NLASTRIP_TYPE_META,
+ NLASTRIP_TYPE_META
} eNlaStrip_Type;
/* NLA Tracks ------------------------------------- */
@@ -666,7 +673,7 @@ typedef enum eNlaTrack_Flag {
NLATRACK_PROTECTED = (1<<4),
/* track is not allowed to execute, usually as result of tweaking being enabled (internal flag) */
- NLATRACK_DISABLED = (1<<10),
+ NLATRACK_DISABLED = (1<<10)
} eNlaTrack_Flag;
@@ -702,7 +709,7 @@ typedef struct KS_Path {
/* KS_Path->flag */
typedef enum eKSP_Settings {
/* entire array (not just the specified index) gets keyframed */
- KSP_FLAG_WHOLE_ARRAY = (1<<0),
+ KSP_FLAG_WHOLE_ARRAY = (1<<0)
} eKSP_Settings;
/* KS_Path->groupmode */
@@ -716,26 +723,9 @@ typedef enum eKSP_Grouping {
/* path should be grouped using name of inner-most context item from templates
* - this is most useful for relative KeyingSets only
*/
- KSP_GROUP_TEMPLATE_ITEM,
+ KSP_GROUP_TEMPLATE_ITEM
} eKSP_Grouping;
-/* KS_Path->templates (Template Flags)
- *
- * Templates in paths are used to substitute information from the
- * active context into relavent places in the path strings. This
- * enum here defines the flags which define which templates are
- * required by a path before it can be used
- */
-typedef enum eKSP_TemplateTypes {
- KSP_TEMPLATE_OBJECT = (1<<0), /* #obj - selected object */
- KSP_TEMPLATE_PCHAN = (1<<1), /* #pch - selected posechannel */
- KSP_TEMPLATE_CONSTRAINT = (1<<2), /* #con - active only */
- KSP_TEMPLATE_NODE = (1<<3), /* #nod - selected node */
- KSP_TEMPLATE_MODIFIER = (1<<4), /* #mod - active only */
-
- KSP_TEMPLATE_ROT = (1<<16), /* modify rotation paths based on rotation mode of Object or Pose Channel */
-} eKSP_TemplateTypes;
-
/* ---------------- */
/* KeyingSet definition (ks)
@@ -767,7 +757,7 @@ typedef enum eKS_Settings {
/* keyingset cannot be removed (and doesn't need to be freed) */
KEYINGSET_BUILTIN = (1<<0),
/* keyingset does not depend on context info (i.e. paths are absolute) */
- KEYINGSET_ABSOLUTE = (1<<1),
+ KEYINGSET_ABSOLUTE = (1<<1)
} eKS_Settings;
/* Flags for use by keyframe creation/deletion calls */
@@ -777,7 +767,7 @@ typedef enum eInsertKeyFlags {
INSERTKEY_FAST = (1<<2), /* don't recalculate handles,etc. after adding key */
INSERTKEY_FASTR = (1<<3), /* don't realloc mem (or increase count, as array has already been set out) */
INSERTKEY_REPLACE = (1<<4), /* only replace an existing keyframe (this overrides INSERTKEY_NEEDED) */
- INSERTKEY_XYZ2RGB = (1<<5), /* transform F-Curves should have XYZ->RGB color mode */
+ INSERTKEY_XYZ2RGB = (1<<5) /* transform F-Curves should have XYZ->RGB color mode */
} eInsertKeyFlags;
/* ************************************************ */
@@ -874,14 +864,14 @@ typedef enum eAnimData_Flag {
ADT_UI_ACTIVE = (1<<15),
/* F-Curves from this AnimData block are not visible in the Graph Editor */
- ADT_CURVES_NOT_VISIBLE = (1<<16),
+ ADT_CURVES_NOT_VISIBLE = (1<<16)
} eAnimData_Flag;
/* Animation Data recalculation settings (to be set by depsgraph) */
typedef enum eAnimData_Recalc {
ADT_RECALC_DRIVERS = (1<<0),
ADT_RECALC_ANIM = (1<<1),
- ADT_RECALC_ALL = (ADT_RECALC_DRIVERS|ADT_RECALC_ANIM),
+ ADT_RECALC_ALL = (ADT_RECALC_DRIVERS|ADT_RECALC_ANIM)
} eAnimData_Recalc;
/* Base Struct for Anim ------------------------------------- */
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index f7533ff9bde..3547101612f 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,10 @@
#ifndef DNA_ARMATURE_TYPES_H
#define DNA_ARMATURE_TYPES_H
+/** \file DNA_armature_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -57,8 +61,9 @@ typedef struct Bone {
int flag;
float arm_head[3];
- float arm_tail[3]; /* head/tail and roll in Armature Space (rest pos) */
+ float arm_tail[3]; /* head/tail in Armature Space (rest pos) */
float arm_mat[4][4]; /* matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest pos*/
+ float arm_roll; /* roll in Armature Space (rest pos) */
float dist, weight; /* dist, weight: for non-deformgroup deforms */
float xwidth, length, zwidth; /* width: for block bones. keep in this order, transform! */
@@ -68,7 +73,7 @@ typedef struct Bone {
float size[3]; /* patch for upward compat, UNUSED! */
int layer; /* layers that bone appears on */
short segments; /* for B-bones */
- short pad[3];
+ short pad[1];
} Bone;
typedef struct bArmature {
@@ -79,6 +84,12 @@ typedef struct bArmature {
ListBase chainbase;
ListBase *edbo; /* editbone listbase, we use pointer so we can check state */
+ /* active bones should work like active object where possible
+ * - active and selection are unrelated
+ * - active & hidden is not allowed
+ * - from the user perspective active == last selected
+ * - active should be ignored when not visible (hidden layer) */
+
Bone *act_bone; /* active bone (when not in editmode) */
void *act_edbone; /* active editbone (in editmode) */
@@ -89,9 +100,8 @@ typedef struct bArmature {
short deformflag;
short pathflag;
- int pad;
-
- int layer, layer_protected; /* for buttons to work, both variables in this order together */
+ unsigned int layer_used; /* for UI, to show which layers are there */
+ unsigned int layer, layer_protected; /* for buttons to work, both variables in this order together */
// XXX depreceated... old animaton system (armature only viz) ---
short ghostep, ghostsize; /* number of frames to ghosts to show, and step between them */
@@ -116,7 +126,7 @@ typedef enum eArmature_Flag {
ARM_MIRROR_EDIT = (1<<8),
ARM_AUTO_IK = (1<<9),
ARM_NO_CUSTOM = (1<<10), /* made option negative, for backwards compat */
- ARM_COL_CUSTOM = (1<<11), /* draw custom colours */
+ ARM_COL_CUSTOM = (1<<11), /* draw custom colors */
ARM_GHOST_ONLYSEL = (1<<12), /* when ghosting, only show selected bones (this should belong to ghostflag instead) */ // XXX depreceated
ARM_DS_EXPAND = (1<<13)
} eArmature_Flag;
@@ -180,7 +190,9 @@ typedef enum eBone_Flag {
BONE_EDITMODE_LOCKED = (1<<19), /* bone transforms are locked in EditMode */
BONE_TRANSFORM_CHILD = (1<<20), /* Indicates that a parent is also being transformed */
BONE_UNSELECTABLE = (1<<21), /* bone cannot be selected */
- BONE_NO_LOCAL_LOCATION = (1<<22), /* bone location is in armature space */
+ BONE_NO_LOCAL_LOCATION = (1<<22) /* bone location is in armature space */
} eBone_Flag;
+#define MAXBONENAME 32
+
#endif
diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h
index 8584b5f99e9..8ce6b0cc2bb 100644
--- a/source/blender/makesdna/DNA_boid_types.h
+++ b/source/blender/makesdna/DNA_boid_types.h
@@ -1,6 +1,4 @@
-/* DNA_particle_types.h
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,10 @@
#ifndef DNA_BOID_TYPES_H
#define DNA_BOID_TYPES_H
+/** \file DNA_boid_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
typedef enum BoidRuleType {
@@ -104,6 +106,8 @@ typedef enum BoidMode {
eBoidMode_Liftoff,
NUM_BOID_MODES
} BoidMode;
+
+
typedef struct BoidData {
float health, acc[3];
short state_id, mode;
@@ -187,8 +191,8 @@ typedef struct BoidState {
typedef struct BoidSettings {
int options, last_state_id;
- float landing_smoothness, rt;
- float banking, height;
+ float landing_smoothness, height;
+ float banking, pitch;
float health, aggression;
float strength, accuracy, range;
diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h
index 1492319fe22..3d143dc3d0f 100644
--- a/source/blender/makesdna/DNA_brush_types.h
+++ b/source/blender/makesdna/DNA_brush_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,11 @@
#ifndef DNA_BRUSH_TYPES_H
#define DNA_BRUSH_TYPES_H
+/** \file DNA_brush_types.h
+ * \ingroup DNA
+ */
+
+
#include "DNA_ID.h"
#include "DNA_texture_types.h" /* for MTex */
@@ -80,13 +85,14 @@ typedef struct Brush {
char sculpt_tool; /* active sculpt tool */
char vertexpaint_tool; /* active vertex/weight paint tool/blend mode */
char imagepaint_tool; /* active image paint tool */
- char pad3;
+ char pad3[5];
float autosmooth_factor;
float crease_pinch_factor;
float plane_trim;
+ float height; /* affectable height of brush (layer height for layer tool, i.e.) */
float texture_sample_bias;
int texture_overlay_alpha;
@@ -127,6 +133,10 @@ typedef struct Brush {
#define BRUSH_FRONTFACE (1<<27)
#define BRUSH_CUSTOM_ICON (1<<28)
+/* temporary flag which sets up autmatically for correct
+ brush drawing when inverted modal operator is running */
+#define BRUSH_INVERTED (1<<29)
+
/* Brush.sculpt_tool */
#define SCULPT_TOOL_DRAW 1
#define SCULPT_TOOL_SMOOTH 2
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 3a9c7b22cde..4ebd7318ea8 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_camera_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_CAMERA_TYPES_H
#define DNA_CAMERA_TYPES_H
+/** \file DNA_camera_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#ifdef __cplusplus
@@ -78,7 +80,7 @@ typedef struct Camera {
#define CAM_PANORAMA 128
/* yafray: dof sampling switch */
-#define CAM_YF_NO_QMC 512
+/* #define CAM_YF_NO_QMC 512 */ /* depreceated */
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h
index 9b9f0ede526..1f78366287f 100644
--- a/source/blender/makesdna/DNA_cloth_types.h
+++ b/source/blender/makesdna/DNA_cloth_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef DNA_CLOTH_TYPES_H
#define DNA_CLOTH_TYPES_H
+/** \file DNA_cloth_types.h
+ * \ingroup DNA
+ */
+
/**
* This struct contains all the global data required to run a simulation.
* At the time of this writing, this structure contains data appropriate
diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h
index 3c1ef478626..8a556c4b87a 100644
--- a/source/blender/makesdna/DNA_color_types.h
+++ b/source/blender/makesdna/DNA_color_types.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +29,10 @@
#ifndef DNA_COLOR_TYPES_H
#define DNA_COLOR_TYPES_H
+/** \file DNA_color_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_vec_types.h"
/* general defines for kernel functions */
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index dbd9be14c0e..1d752fce4ef 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,10 @@
#ifndef DNA_CONSTRAINT_TYPES_H
#define DNA_CONSTRAINT_TYPES_H
+/** \file DNA_constraint_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#include "DNA_listBase.h"
@@ -94,7 +98,7 @@ typedef struct bConstraintTarget {
/* bConstraintTarget -> flag */
typedef enum B_CONSTRAINT_TARGET_FLAG {
- CONSTRAINT_TAR_TEMP = (1<<0), /* temporary target-struct that needs to be freed after use */
+ CONSTRAINT_TAR_TEMP = (1<<0) /* temporary target-struct that needs to be freed after use */
} B_CONSTRAINT_TARGET_FLAG;
/* bConstraintTarget/bConstraintOb -> type */
@@ -476,7 +480,7 @@ typedef enum eBConstraint_SpaceTypes {
/* for posechannels - local with parent */
CONSTRAINT_SPACE_PARLOCAL, /* = 3 */
/* for files from between 2.43-2.46 (should have been parlocal) */
- CONSTRAINT_SPACE_INVALID, /* = 4. do not exchange for anything! */
+ CONSTRAINT_SPACE_INVALID /* = 4. do not exchange for anything! */
} eBConstraint_SpaceTypes;
/* bConstraintChannel.flag */
@@ -496,7 +500,7 @@ typedef enum eCopyRotation_Flags {
ROTLIKE_X_INVERT = (1<<4),
ROTLIKE_Y_INVERT = (1<<5),
ROTLIKE_Z_INVERT = (1<<6),
- ROTLIKE_OFFSET = (1<<7),
+ ROTLIKE_OFFSET = (1<<7)
} eCopyRotation_Flags;
/* bLocateLikeConstraint.flag */
@@ -509,7 +513,7 @@ typedef enum eCopyLocation_Flags {
LOCLIKE_X_INVERT = (1<<4),
LOCLIKE_Y_INVERT = (1<<5),
LOCLIKE_Z_INVERT = (1<<6),
- LOCLIKE_OFFSET = (1<<7),
+ LOCLIKE_OFFSET = (1<<7)
} eCopyLocation_Flags;
/* bSizeLikeConstraint.flag */
@@ -517,50 +521,50 @@ typedef enum eCopyScale_Flags {
SIZELIKE_X = (1<<0),
SIZELIKE_Y = (1<<1),
SIZELIKE_Z = (1<<2),
- SIZELIKE_OFFSET = (1<<3),
+ SIZELIKE_OFFSET = (1<<3)
} eCopyScale_Flags;
/* bSameVolumeConstraint.flag */
typedef enum eSameVolume_Modes {
SAMEVOL_X = 0,
SAMEVOL_Y,
- SAMEVOL_Z,
+ SAMEVOL_Z
} eSameVolume_Modes;
/* Locked-Axis Values (Locked Track) */
typedef enum eLockAxis_Modes {
LOCK_X = 0,
LOCK_Y,
- LOCK_Z,
+ LOCK_Z
} eLockAxis_Modes;
/* Up-Axis Values (TrackTo and Locked Track) */
typedef enum eUpAxis_Modes {
UP_X = 0,
UP_Y,
- UP_Z,
+ UP_Z
} eUpAxis_Modes;
-/* Tracking axis (TrackTo, Locked Track, Damped Track) */
+/* Tracking axis (TrackTo, Locked Track, Damped Track) and minmax (floor) constraint */
typedef enum eTrackToAxis_Modes {
TRACK_X = 0,
TRACK_Y,
TRACK_Z,
TRACK_nX,
TRACK_nY,
- TRACK_nZ,
+ TRACK_nZ
} eTrackToAxis_Modes;
/* FollowPath flags */
typedef enum eFollowPath_Flags {
FOLLOWPATH_FOLLOW = (1<<0),
FOLLOWPATH_STATIC = (1<<1),
- FOLLOWPATH_RADIUS = (1<<2),
+ FOLLOWPATH_RADIUS = (1<<2)
} eFollowPath_Flags;
/* bTrackToConstraint->flags */
typedef enum eTrackTo_Flags {
- TARGET_Z_UP = (1<<0),
+ TARGET_Z_UP = (1<<0)
} eTrackTo_Flags;
/* Strech To Constraint -> volmode */
@@ -568,14 +572,14 @@ typedef enum eStretchTo_VolMode {
VOLUME_XZ = 0,
VOLUME_X,
VOLUME_Z,
- NO_VOLUME,
+ NO_VOLUME
} eStretchTo_VolMode;
/* Stretch To Constraint -> plane mode */
typedef enum eStretchTo_PlaneMode {
PLANE_X = 0,
PLANE_Y,
- PLANE_Z,
+ PLANE_Z
} eStretchTo_PlaneMode;
/* Clamp-To Constraint ->flag */
@@ -583,12 +587,12 @@ typedef enum eClampTo_Modes {
CLAMPTO_AUTO = 0,
CLAMPTO_X,
CLAMPTO_Y,
- CLAMPTO_Z,
+ CLAMPTO_Z
} eClampTo_Modes;
/* ClampTo Constraint ->flag2 */
typedef enum eClampTo_Flags {
- CLAMPTO_CYCLIC = (1<<0),
+ CLAMPTO_CYCLIC = (1<<0)
} eClampTo_Flags;
/* bKinematicConstraint->flag */
@@ -611,7 +615,7 @@ typedef enum eKinematic_Flags {
CONSTRAINT_IK_NO_ROT_Y = (1<<12),
CONSTRAINT_IK_NO_ROT_Z = (1<<13),
/* axis relative to target */
- CONSTRAINT_IK_TARGETAXIS = (1<<14),
+ CONSTRAINT_IK_TARGETAXIS = (1<<14)
} eKinematic_Flags;
/* bSplineIKConstraint->flag */
@@ -625,7 +629,7 @@ typedef enum eSplineIK_Flags {
/* evenly distribute the bones along the path regardless of length */
CONSTRAINT_SPLINEIK_EVENSPLITS = (1<<3),
/* don't adjust the x and z scaling of the bones by the curve radius */
- CONSTRAINT_SPLINEIK_NO_CURVERAD = (1<<4),
+ CONSTRAINT_SPLINEIK_NO_CURVERAD = (1<<4)
} eSplineIK_Flags;
/* bSplineIKConstraint->xzScaleMode */
@@ -635,14 +639,14 @@ typedef enum eSplineIK_XZScaleModes {
/* bones in the chain should take their x/z scales from the original scaling */
CONSTRAINT_SPLINEIK_XZS_ORIGINAL,
/* x/z scales are the inverse of the y-scale */
- CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC,
+ CONSTRAINT_SPLINEIK_XZS_VOLUMETRIC
} eSplineIK_XZScaleModes;
/* MinMax (floor) flags */
typedef enum eFloor_Flags {
MINMAX_STICKY = (1<<0),
MINMAX_STUCK = (1<<1),
- MINMAX_USEROT = (1<<2),
+ MINMAX_USEROT = (1<<2)
} eFloor_Flags;
/* transform limiting constraints -> flag2 */
@@ -650,7 +654,7 @@ typedef enum eTransformLimits_Flags2 {
/* not used anymore - for older Limit Location constraints only */
LIMIT_NOPARENT = (1<<0),
/* for all Limit constraints - allow to be used during transform? */
- LIMIT_TRANSFORM = (1<<1),
+ LIMIT_TRANSFORM = (1<<1)
} eTransformLimits_Flags2;
/* transform limiting constraints -> flag (own flags) */
@@ -660,33 +664,33 @@ typedef enum eTransformLimits_Flags {
LIMIT_YMIN = (1<<2),
LIMIT_YMAX = (1<<3),
LIMIT_ZMIN = (1<<4),
- LIMIT_ZMAX = (1<<5),
+ LIMIT_ZMAX = (1<<5)
} eTransformLimits_Flags;
/* limit rotation constraint -> flag (own flags) */
typedef enum eRotLimit_Flags {
LIMIT_XROT = (1<<0),
LIMIT_YROT = (1<<1),
- LIMIT_ZROT = (1<<2),
+ LIMIT_ZROT = (1<<2)
} eRotLimit_Flags;
/* distance limit constraint */
/* bDistLimitConstraint->flag */
typedef enum eDistLimit_Flag {
- LIMITDIST_USESOFT = (1<<0),
+ LIMITDIST_USESOFT = (1<<0)
} eDistLimit_Flag;
/* bDistLimitConstraint->mode */
typedef enum eDistLimit_Modes {
LIMITDIST_INSIDE = 0,
LIMITDIST_OUTSIDE,
- LIMITDIST_ONSURFACE,
+ LIMITDIST_ONSURFACE
} eDistLimit_Modes;
/* python constraint -> flag */
typedef enum ePyConstraint_Flags {
PYCON_USETARGETS = (1<<0),
- PYCON_SCRIPTERROR = (1<<1),
+ PYCON_SCRIPTERROR = (1<<1)
} ePyConstraint_Flags;
/* ChildOf Constraint -> flag */
@@ -700,6 +704,7 @@ typedef enum eChildOf_Flags {
CHILDOF_SIZEX = (1<<6),
CHILDOF_SIZEY = (1<<7),
CHILDOF_SIZEZ = (1<<8),
+ CHILDOF_ALL = 511
} eChildOf_Flags;
/* Pivot Constraint */
@@ -720,7 +725,7 @@ typedef enum ePivotConstraint_Axis {
/* consider +ve y-axis rotations */
PIVOTCON_AXIS_Y,
/* consider +ve z-axis rotations */
- PIVOTCON_AXIS_Z,
+ PIVOTCON_AXIS_Z
} ePivotConstraint_Axis;
/* settings for Pivot Constraint in general */
@@ -728,7 +733,7 @@ typedef enum ePivotConstraint_Flag {
/* offset is to be interpreted as being a fixed-point in space */
PIVOTCON_FLAG_OFFSET_ABS = (1<<0),
/* rotation-based activation uses negative rotation to drive result */
- PIVOTCON_FLAG_ROTACT_NEG = (1<<1),
+ PIVOTCON_FLAG_ROTACT_NEG = (1<<1)
} ePivotConstraint_Flag;
/* Rigid-Body Constraint */
diff --git a/source/blender/makesdna/DNA_controller_types.h b/source/blender/makesdna/DNA_controller_types.h
index fcd5587b14b..e48386e5c4e 100644
--- a/source/blender/makesdna/DNA_controller_types.h
+++ b/source/blender/makesdna/DNA_controller_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_controller_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_CONTROLLER_TYPES_H
#define DNA_CONTROLLER_TYPES_H
+/** \file DNA_controller_types.h
+ * \ingroup DNA
+ */
+
struct bActuator;
struct Text;
struct bSensor;
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 8537b703c69..b51612037fc 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/DNA_curve_types.h (mar-2001 nzc)
- *
- * Curve stuff.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,10 @@
#ifndef DNA_CURVE_TYPES_H
#define DNA_CURVE_TYPES_H
+/** \file DNA_curve_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
#include "DNA_ID.h"
@@ -63,8 +63,8 @@ typedef struct PathPoint {
#
#
typedef struct Path {
- int len;
struct PathPoint *data;
+ int len;
float totdist;
} Path;
@@ -141,7 +141,7 @@ typedef struct Nurb {
typedef struct CharInfo {
short kern;
- short mat_nr;
+ short mat_nr; /* index start at 1, unlike mesh & nurbs */
char flag;
char pad;
short pad2;
@@ -171,7 +171,7 @@ typedef struct Curve {
struct BoundBox *bb;
ListBase nurb; /* actual data, called splines in rna */
- ListBase disp;
+ ListBase disp; /* undeformed display list, used mostly for texture space calculation */
EditNurb *editnurb; /* edited data, not in file, use pointer so we can check for it */
@@ -189,11 +189,11 @@ typedef struct Curve {
float rot[3];
short texflag, pad1; /* keep a short because of give_obdata_texspace() */
-
- short drawflag, twist_mode, pad[2];
+ short drawflag, twist_mode;
float twist_smooth, smallcaps_scale;
- short pathlen, totcol;
+ int pathlen;
+ short pad, totcol;
short flag, bevresol;
float width, ext1, ext2;
@@ -314,14 +314,14 @@ typedef enum eBezTriple_Handle {
HD_AUTO,
HD_VECT,
HD_ALIGN,
- HD_AUTO_ANIM, /* not real handle type, but is just used as dummy item for anim code */
+ HD_AUTO_ANIM /* not real handle type, but is just used as dummy item for anim code */
} eBezTriple_Handle;
/* interpolation modes (used only for BezTriple->ipo) */
typedef enum eBezTriple_Interpolation {
BEZT_IPO_CONST = 0, /* constant interpolation */
BEZT_IPO_LIN, /* linear interpolation */
- BEZT_IPO_BEZ, /* bezier interpolation */
+ BEZT_IPO_BEZ /* bezier interpolation */
} eBezTriple_Interpolation;
/* types of keyframe (used only for BezTriple->hide when BezTriple is used in F-Curves) */
@@ -329,6 +329,7 @@ typedef enum eBezTriple_KeyframeType {
BEZT_KEYTYPE_KEYFRAME = 0, /* default - 'proper' Keyframe */
BEZT_KEYTYPE_EXTREME, /* 'extreme' keyframe */
BEZT_KEYTYPE_BREAKDOWN, /* 'breakdown' keyframe */
+ BEZT_KEYTYPE_JITTER, /* 'jitter' keyframe (for adding 'filler' secondary motion) */
} eBezTriple_KeyframeType;
/* checks if the given BezTriple is selected */
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 8d5d34fbe9b..eec2c8259ef 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file DNA_customdata_types.h
+ * \ingroup DNA
+ */
+
#ifndef DNA_CUSTOMDATA_TYPES_H
#define DNA_CUSTOMDATA_TYPES_H
-/* descriptor and storage for a custom data layer */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** descriptor and storage for a custom data layer */
typedef struct CustomDataLayer {
int type; /* type of data in layer */
int offset; /* in editmode, offset of layer in block */
@@ -48,7 +56,7 @@ typedef struct CustomDataExternal {
char filename[240]; /* FILE_MAX */
} CustomDataExternal;
-/* structure which stores custom element data associated with mesh elements
+/** structure which stores custom element data associated with mesh elements
* (vertices, edges or faces). The custom data is organised into a series of
* layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */
typedef struct CustomData {
@@ -146,4 +154,8 @@ typedef struct CustomData {
#define MAX_MTFACE 8
#define MAX_MCOL 8
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_documentation.h b/source/blender/makesdna/DNA_documentation.h
index a911b92c313..2e5eb3778c4 100644
--- a/source/blender/makesdna/DNA_documentation.h
+++ b/source/blender/makesdna/DNA_documentation.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,29 +25,32 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
+ */
+
+/**
+ * \page makesdna makesdna
+ * \ingroup DNA
*
- * @mainpage DNA- Makesdna modules
- *
- * @section about About the DNA module
+ * \section aboutdna About the DNA module
*
* The DNA module holds all type definitions that are serialized in a
* blender file. There is an executable that scans all files, looking
- * for struct-s to serialize (hence sdna: Struct DNA). From this
+ * for struct-s to serialize (hence sdna: Struct \ref DNA). From this
* information, it builds a file with numbers that encode the format,
* the names of variables, and the plce to look for them.
*
- * @section issues Known issues with DNA
+ * \section dnaissues Known issues with DNA
*
* - Function pointers:
*
* Because of historical reasons, some function pointers were
* untyped. The parser/dna generator has been modified to explicitly
* handle these special cases. Most pointers have been given proper
- * proto's by now. DNA_space_types.h::Spacefile::returnfuncmay still
+ * proto's by now. DNA_space_types.h::Spacefile::returnfunc may still
* be badly defined. The reason for this is that it is called with
* different types of arguments. It takes a char* at this moment...
*
- * - Path to the header files
+ * - %Path to the header files
*
* Also because of historical reasons, there is a path prefix to the
* headers that need to be scanned. This is the BASE_HEADER
@@ -55,15 +58,14 @@
* have to change this (Not very flexible, but it is hardly ever
* changed. Sorry.).
*
- * @section dependencies Dependencies
+ * \section dnadependencies Dependencies
*
* DNA has no external dependencies (except for a few system
* includes).
- *
- **/
+ * \section dnanote NOTE
-/* PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN
+ PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN
intern/dna_genfile.c
(ton)
diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h
index ee0b791a274..f87698a3d64 100644
--- a/source/blender/makesdna/DNA_effect_types.h
+++ b/source/blender/makesdna/DNA_effect_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_effect_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_EFFECT_TYPES_H
#define DNA_EFFECT_TYPES_H
+/** \file DNA_effect_types.h
+ * \ingroup DNA
+ */
+
/* don't forget, new effects also in writefile.c for dna!!! */
#define PAF_MAXMULT 4
diff --git a/source/blender/makesdna/DNA_fileglobal_types.h b/source/blender/makesdna/DNA_fileglobal_types.h
index ae539a18963..9aa3e1eb3c1 100644
--- a/source/blender/makesdna/DNA_fileglobal_types.h
+++ b/source/blender/makesdna/DNA_fileglobal_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_fileglobal_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_FILEGLOBAL_TYPES_H
#define DNA_FILEGLOBAL_TYPES_H
+/** \file DNA_fileglobal_types.h
+ * \ingroup DNA
+ */
+
struct bScreen;
struct Scene;
@@ -47,7 +49,8 @@ typedef struct FileGlobal {
struct Scene *curscene;
int fileflags;
int globalf;
-
+ int revision; /* svn revision from buildinfo */
+ int pad;
/* file path where this was saved, for recover */
char filename[240]; /* 240 = FILE_MAX */
} FileGlobal;
diff --git a/source/blender/makesdna/DNA_genfile.h b/source/blender/makesdna/DNA_genfile.h
index 75d21644267..e8ed6580206 100644
--- a/source/blender/makesdna/DNA_genfile.h
+++ b/source/blender/makesdna/DNA_genfile.h
@@ -25,12 +25,16 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * blenloader genfile private function prototypes
*/
#ifndef GENFILE_H
#define GENFILE_H
+/** \file DNA_genfile.h
+ * \ingroup DNA
+ * \brief blenloader genfile private function prototypes
+ */
+
struct SDNA;
extern unsigned char DNAstr[]; /* DNA.c */
@@ -45,7 +49,7 @@ char *DNA_struct_get_compareflags(struct SDNA *sdna, struct SDNA *newsdna);
void *DNA_struct_reconstruct(struct SDNA *newsdna, struct SDNA *oldsdna, char *compflags, int oldSDNAnr, int blocks, void *data);
int DNA_elem_array_size(const char *astr, int len);
-int DNA_elem_offset(struct SDNA *sdna, char *stype, char *vartype, char *name);
+int DNA_elem_offset(struct SDNA *sdna, const char *stype, const char *vartype, const char *name);
#endif
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 25378173929..ffccc08048e 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
#ifndef DNA_GPENCIL_TYPES_H
#define DNA_GPENCIL_TYPES_H
+/** \file DNA_gpencil_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_group_types.h b/source/blender/makesdna/DNA_group_types.h
index 61a527dd351..106b85a5372 100644
--- a/source/blender/makesdna/DNA_group_types.h
+++ b/source/blender/makesdna/DNA_group_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* blenlib/DNA_group_types.h (mar-2001 nzc)
*
* $Id$
@@ -31,6 +31,10 @@
#ifndef DNA_GROUP_TYPES_H
#define DNA_GROUP_TYPES_H
+/** \file DNA_group_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -40,8 +44,8 @@ typedef struct GroupObject {
struct GroupObject *next, *prev;
struct Object *ob;
void *lampren; /* used while render */
- int recalc; /* copy of ob->recalc, used to set animated groups OK */
- int pad;
+ short recalc; /* copy of ob->recalc, used to set animated groups OK */
+ char pad[6];
} GroupObject;
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index d1aa3c00ac4..99ed2319415 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_image_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_IMAGE_TYPES_H
#define DNA_IMAGE_TYPES_H
+/** \file DNA_image_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
struct PackedFile;
@@ -44,16 +46,20 @@ struct GPUTexture;
/* ImageUser is in Texture, in Nodes, Background Image, Image Window, .... */
/* should be used in conjunction with an ID * to Image. */
typedef struct ImageUser {
+ struct Scene *scene; /* to retrieve render result */
+
int framenr; /* movies, sequences: current to display */
int frames; /* total amount of frames to use */
int offset, sfra; /* offset within movie, start frame in global time */
- short fie_ima, cycl; /* fields/image in movie, cyclic flag */
- short flag, ok;
-
+ char fie_ima, cycl; /* fields/image in movie, cyclic flag */
+ char ok, pad;
+
short multi_index, layer, pass; /* listbase indices, for menu browsing or retrieve buffer */
- short menunr; /* localized menu entry, for handling browse event */
+
+ short flag;
- struct Scene *scene; /* to retrieve render result */
+ int pad2;
+
} ImageUser;
/* iuser->flag */
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index b7e15808ff0..5dba9154a3a 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_ipo_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,15 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* ==============================================
- * ATTENTION:
- *
- * The contents of this file are now officially depreceated. They were used for the 'old' animation system,
- * which has (as of 2.50) been replaced with a completely new system by Joshua Leung (aligorith). All defines,
- * etc. are only still maintained to provide backwards compatability for old files...
- *
- * =============================================
- */
+/** \file DNA_ipo_types.h
+ * \ingroup DNA
+ * \deprecated
+ * The contents of this file are now officially depreceated. They were used for the 'old' animation system,
+ * which has (as of 2.50) been replaced with a completely new system by Joshua Leung (aligorith). All defines,
+ * etc. are only still maintained to provide backwards compatability for old files.
+ */
#ifndef DNA_IPO_TYPES_H
#define DNA_IPO_TYPES_H
@@ -421,10 +417,10 @@ typedef struct Ipo {
#define PART_TOTNAM 25
#define PART_EMIT_FREQ 1
-#define PART_EMIT_LIFE 2
+/* #define PART_EMIT_LIFE 2 */ /*UNUSED*/
#define PART_EMIT_VEL 3
#define PART_EMIT_AVE 4
-#define PART_EMIT_SIZE 5
+/* #define PART_EMIT_SIZE 5 */ /*UNUSED*/
#define PART_AVE 6
#define PART_SIZE 7
diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h
index a9783d3465e..71b631e3d5e 100644
--- a/source/blender/makesdna/DNA_key_types.h
+++ b/source/blender/makesdna/DNA_key_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_key_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_KEY_TYPES_H
#define DNA_KEY_TYPES_H
+/** \file DNA_key_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 5231108a756..9377b5d8a09 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_lamp_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_LAMP_TYPES_H
#define DNA_LAMP_TYPES_H
+/** \file DNA_lamp_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#ifndef MAX_MTEX
@@ -140,7 +142,7 @@ typedef struct Lamp {
#define LA_SHAD_RAY 8192
/* yafray: lamp shadowbuffer flag, softlight */
/* Since it is used with LOCAL lamp, can't use LA_SHAD */
-#define LA_YF_SOFT 16384
+/* #define LA_YF_SOFT 16384 */ /* no longer used */
#define LA_LAYER_SHADOW 32768
#define LA_SHAD_TEX (1<<16)
#define LA_SHOW_CONE (1<<17)
diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h
index 94fc9fefb66..662ef9e8a45 100644
--- a/source/blender/makesdna/DNA_lattice_types.h
+++ b/source/blender/makesdna/DNA_lattice_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,8 +29,13 @@
#ifndef DNA_LATTICE_TYPES_H
#define DNA_LATTICE_TYPES_H
+/** \file DNA_lattice_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
+struct AnimData;
struct BPoint;
struct Ipo;
struct Key;
@@ -46,17 +51,18 @@ typedef struct EditLatt {
typedef struct Lattice {
ID id;
+ struct AnimData *adt;
short pntsu, pntsv, pntsw, flag;
short opntsu, opntsv, opntsw, pad2;
- char typeu, typev, typew, type;
+ char typeu, typev, typew, pad3;
int pad;
float fu, fv, fw, du, dv, dw;
struct BPoint *def;
- struct Ipo *ipo;
+ struct Ipo *ipo; /* XXX: depreceated... old animation system */
struct Key *key;
struct MDeformVert *dvert;
@@ -75,5 +81,7 @@ typedef struct Lattice {
#define LT_GRID 1
#define LT_OUTSIDE 2
+#define LT_DS_EXPAND 4
+
#endif
diff --git a/source/blender/makesdna/DNA_listBase.h b/source/blender/makesdna/DNA_listBase.h
index afeb79037f5..f52325c0e7b 100644
--- a/source/blender/makesdna/DNA_listBase.h
+++ b/source/blender/makesdna/DNA_listBase.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/BLI_listBase.h mar 2001 Nzc
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,14 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*
- * These structs are the foundation for all linked lists in the
- * library system.
*
*/
#ifndef DNA_LISTBASE_H
#define DNA_LISTBASE_H
+/** \file DNA_listBase.h
+ * \ingroup DNA
+ * \brief These structs are the foundation for all linked lists in the
+ * library system.
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index f8eb6e76693..860da1d80a4 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_material_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_MATERIAL_TYPES_H
#define DNA_MATERIAL_TYPES_H
+/** \file DNA_material_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#include "DNA_listBase.h"
@@ -300,6 +302,7 @@ typedef struct Material {
#define TEXCO_TANGENT 4096
/* still stored in vertex->accum, 1 D */
#define TEXCO_STRAND 8192
+#define TEXCO_PARTICLE 8192 /* strand is used for normal materials, particle for halo materials */
#define TEXCO_STRESS 16384
#define TEXCO_SPEED 32768
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 82a03cb4e1b..ec30a01c8e2 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef DNA_MESH_TYPES_H
#define DNA_MESH_TYPES_H
+/** \file DNA_mesh_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
#include "DNA_customdata_types.h"
@@ -170,9 +174,9 @@ typedef struct TFace {
#define ME_DRAWSHARP (1 << 8)
#define ME_DRAWBWEIGHTS (1 << 9)
-#define ME_DRAW_EDGELEN (1 << 10)
-#define ME_DRAW_FACEAREA (1 << 11)
-#define ME_DRAW_EDGEANG (1 << 12)
+#define ME_DRAWEXTRA_EDGELEN (1 << 10)
+#define ME_DRAWEXTRA_FACEAREA (1 << 11)
+#define ME_DRAWEXTRA_FACEANG (1 << 12)
#define ME_DRAW_PINS (1 << 13)
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 1cfbd9d8d51..6acbaf3cc45 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef DNA_MESHDATA_TYPES_H
#define DNA_MESHDATA_TYPES_H
+/** \file DNA_meshdata_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_customdata_types.h"
#include "DNA_listBase.h"
@@ -62,8 +66,7 @@ typedef struct MDeformVert {
typedef struct MVert {
float co[3];
short no[3];
- short mat_nr;
- char flag, bweight, pad[2];
+ char flag, bweight;
} MVert;
/* tesselation vertex color data.
diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h
index feadf7cd510..53f563341b3 100644
--- a/source/blender/makesdna/DNA_meta_types.h
+++ b/source/blender/makesdna/DNA_meta_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_meta_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_META_TYPES_H
#define DNA_META_TYPES_H
+/** \file DNA_meta_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -48,7 +50,7 @@ typedef struct MetaElem {
short type, flag, selcol1, selcol2;
float x, y, z; /* Position of center of MetaElem */
- float quat[4]; /* Rotation of MetaElem */
+ float quat[4]; /* Rotation of MetaElem (MUST be kept normalized) */
float expx; /* dimension parameters, used for some types like cubes */
float expy;
float expz;
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 27f9c9cd5f3..28840d55efc 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1,5 +1,4 @@
-/**
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,11 +20,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "DNA_listBase.h"
-
#ifndef DNA_MODIFIER_TYPES_H
#define DNA_MODIFIER_TYPES_H
+/** \file DNA_modifier_types.h
+ * \ingroup DNA
+ */
+
+#include "DNA_listBase.h"
+
+
#define MODSTACK_DEBUG 1
/* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
@@ -79,6 +83,7 @@ typedef enum ModifierMode {
eModifierMode_OnCage = (1<<3),
eModifierMode_Expanded = (1<<4),
eModifierMode_Virtual = (1<<5),
+ eModifierMode_ApplyOnSpline = (1<<6),
eModifierMode_DisableTemporary = (1 << 31)
} ModifierMode;
@@ -209,30 +214,32 @@ typedef struct ArrayModifierData {
#define MOD_ARR_FITCURVE 2
/* ArrayModifierData->offset_type */
-#define MOD_ARR_OFF_CONST 1<<0
-#define MOD_ARR_OFF_RELATIVE 1<<1
-#define MOD_ARR_OFF_OBJ 1<<2
+#define MOD_ARR_OFF_CONST (1<<0)
+#define MOD_ARR_OFF_RELATIVE (1<<1)
+#define MOD_ARR_OFF_OBJ (1<<2)
/* ArrayModifierData->flags */
-#define MOD_ARR_MERGE 1<<0
-#define MOD_ARR_MERGEFINAL 1<<1
+#define MOD_ARR_MERGE (1<<0)
+#define MOD_ARR_MERGEFINAL (1<<1)
typedef struct MirrorModifierData {
ModifierData modifier;
- short axis, flag;
+ short axis; /* deprecated, use flag instead */
+ short flag;
float tolerance;
struct Object *mirror_ob;
} MirrorModifierData;
/* MirrorModifierData->flag */
-#define MOD_MIR_CLIPPING 1<<0
-#define MOD_MIR_MIRROR_U 1<<1
-#define MOD_MIR_MIRROR_V 1<<2
-#define MOD_MIR_AXIS_X 1<<3
-#define MOD_MIR_AXIS_Y 1<<4
-#define MOD_MIR_AXIS_Z 1<<5
-#define MOD_MIR_VGROUP 1<<6
+#define MOD_MIR_CLIPPING (1<<0)
+#define MOD_MIR_MIRROR_U (1<<1)
+#define MOD_MIR_MIRROR_V (1<<2)
+#define MOD_MIR_AXIS_X (1<<3)
+#define MOD_MIR_AXIS_Y (1<<4)
+#define MOD_MIR_AXIS_Z (1<<5)
+#define MOD_MIR_VGROUP (1<<6)
+#define MOD_MIR_NO_MERGE (1<<7)
typedef struct EdgeSplitModifierData {
ModifierData modifier;
@@ -242,8 +249,8 @@ typedef struct EdgeSplitModifierData {
} EdgeSplitModifierData;
/* EdgeSplitModifierData->flags */
-#define MOD_EDGESPLIT_FROMANGLE 1<<1
-#define MOD_EDGESPLIT_FROMFLAG 1<<2
+#define MOD_EDGESPLIT_FROMANGLE (1<<1)
+#define MOD_EDGESPLIT_FROMFLAG (1<<2)
typedef struct BevelModifierData {
ModifierData modifier;
@@ -330,7 +337,7 @@ typedef struct UVProjectModifierData {
#define MOD_UVPROJECT_MAXPROJECTORS 10
/* UVProjectModifierData->flags */
-#define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
+#define MOD_UVPROJECT_OVERRIDEIMAGE (1<<0)
typedef struct DecimateModifierData {
ModifierData modifier;
@@ -383,13 +390,13 @@ enum {
};
/* WaveModifierData.flag */
-#define MOD_WAVE_X 1<<1
-#define MOD_WAVE_Y 1<<2
-#define MOD_WAVE_CYCL 1<<3
-#define MOD_WAVE_NORM 1<<4
-#define MOD_WAVE_NORM_X 1<<5
-#define MOD_WAVE_NORM_Y 1<<6
-#define MOD_WAVE_NORM_Z 1<<7
+#define MOD_WAVE_X (1<<1)
+#define MOD_WAVE_Y (1<<2)
+#define MOD_WAVE_CYCL (1<<3)
+#define MOD_WAVE_NORM (1<<4)
+#define MOD_WAVE_NORM_X (1<<5)
+#define MOD_WAVE_NORM_Y (1<<6)
+#define MOD_WAVE_NORM_Z (1<<7)
typedef struct WaveModifierData {
ModifierData modifier;
@@ -547,12 +554,9 @@ typedef struct MeshDeformModifierData {
} MeshDeformModifierData;
typedef enum {
- eParticleSystemFlag_Loaded = (1<<0),
- eParticleSystemFlag_Pars = (1<<1),
- eParticleSystemFlag_FromCurve = (1<<2),
- eParticleSystemFlag_DM_changed = (1<<3),
- eParticleSystemFlag_Disabled = (1<<4),
- eParticleSystemFlag_psys_updated = (1<<5),
+ eParticleSystemFlag_Pars = (1<<0),
+ eParticleSystemFlag_psys_updated = (1<<1),
+ eParticleSystemFlag_file_loaded = (1<<2),
} ParticleSystemModifierFlag;
typedef struct ParticleSystemModifierData {
@@ -584,7 +588,7 @@ typedef struct ParticleInstanceModifierData {
typedef enum {
eExplodeFlag_CalcFaces = (1<<0),
eExplodeFlag_PaSize = (1<<1),
- eExplodeFlag_EdgeSplit = (1<<2),
+ eExplodeFlag_EdgeCut = (1<<2),
eExplodeFlag_Unborn = (1<<3),
eExplodeFlag_Alive = (1<<4),
eExplodeFlag_Dead = (1<<5),
@@ -595,6 +599,7 @@ typedef struct ExplodeModifierData {
int *facepa;
short flag, vgroup;
float protect;
+ char uvname[32];
} ExplodeModifierData;
typedef struct MultiresModifierData {
diff --git a/source/blender/makesdna/DNA_nla_types.h b/source/blender/makesdna/DNA_nla_types.h
index 519d8ca8163..c64dda2afd0 100644
--- a/source/blender/makesdna/DNA_nla_types.h
+++ b/source/blender/makesdna/DNA_nla_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
#ifndef DNA_NLA_TYPES_H
#define DNA_NLA_TYPES_H
+/** \file DNA_nla_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
struct bAction;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index fe422bfa689..803e5418bcc 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
#ifndef DNA_NODE_TYPES_H
#define DNA_NODE_TYPES_H
+/** \file DNA_node_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
@@ -66,21 +70,29 @@ typedef struct bNodeSocket {
char name[32];
bNodeStack ns; /* custom data for inputs, only UI writes in this */
- short type, flag; /* type is copy from socket type struct */
- short limit, stack_index; /* limit for dependency sort, stack_index for exec */
- short intern; /* intern = tag for group nodes */
- short stack_index_ext; /* for groups, to find the caller stack index */
- int pad1;
+ short type, flag;
+ short limit; /* max. number of links */
+
+ /* stack data info (only during execution!) */
+ short stack_type; /* type of stack reference */
+ /* XXX only one of stack_ptr or stack_index is used (depending on stack_type).
+ * could store the index in the pointer with SET_INT_IN_POINTER (a bit ugly).
+ * (union won't work here, not supported by DNA)
+ */
+ struct bNodeStack *stack_ptr; /* constant input value */
+ short stack_index; /* local stack index or external input number */
+ short pad1;
float locx, locy;
/* internal data to retrieve relations and groups */
- int own_index, to_index; /* group socket identifiers, to find matching pairs after reading files */
+ int own_index; /* group socket identifiers, to find matching pairs after reading files */
+ struct bNodeSocket *groupsock;
+ int to_index; /* XXX deprecated, only used for restoring old group node links */
+ int pad2;
- struct bNodeSocket *tosock; /* group-node sockets point to the internal group counterpart sockets, set after read file */
struct bNodeLink *link; /* a link pointer, set in nodeSolveOrder() */
-
} bNodeSocket;
/* sock->type */
@@ -95,11 +107,16 @@ typedef struct bNodeSocket {
#define SOCK_IN_USE 4
/* unavailable is for dynamic sockets */
#define SOCK_UNAVAIL 8
-#
-#
+
+/* sock->stack_type */
+#define SOCK_STACK_LOCAL 1 /* part of the local tree stack */
+#define SOCK_STACK_EXTERN 2 /* use input stack pointer */
+#define SOCK_STACK_CONST 3 /* use pointer to constant input value */
+
typedef struct bNodePreview {
unsigned char *rect;
short xsize, ysize;
+ int pad;
} bNodePreview;
@@ -149,7 +166,7 @@ typedef struct bNode {
#define NODE_TEST 256
/* composite: don't do node but pass on buffer(s) */
#define NODE_MUTED 512
-#define NODE_CUSTOM_NAME 1024
+#define NODE_CUSTOM_NAME 1024 /* deprecated! */
typedef struct bNodeLink {
struct bNodeLink *next, *prev;
@@ -181,7 +198,7 @@ typedef struct bNodeTree {
int flag, pad;
ListBase alltypes; /* type definitions */
- struct bNodeType *owntype; /* for groups or dynamic trees, no read/write */
+ ListBase inputs, outputs; /* external sockets for group nodes */
int pad2[2];
@@ -203,7 +220,11 @@ typedef struct bNodeTree {
#define NTREE_EXEC_INIT 2
/* ntree->flag */
-#define NTREE_DS_EXPAND 1 /* for animation editors */
+#define NTREE_DS_EXPAND 1 /* for animation editors */
+/* XXX not nice, but needed as a temporary flag
+ * for group updates after library linking.
+ */
+#define NTREE_DO_VERSIONS 1024
/* data structs, for node->storage */
@@ -216,12 +237,11 @@ typedef struct NodeImageAnim {
typedef struct NodeBlurData {
short sizex, sizey;
- short samples, maxspeed, minspeed, relative;
+ short samples, maxspeed, minspeed, relative, aspect;
+ short curved;
float fac, percentx, percenty;
short filtertype;
char bokeh, gamma;
- short curved;
- short pad;
int image_in_width, image_in_height; /* needed for absolute/relative conversions */
} NodeBlurData;
@@ -336,4 +356,8 @@ typedef struct TexNodeOutput {
#define CMP_NODE_CHANNEL_MATTE_CS_YUV 3
#define CMP_NODE_CHANNEL_MATTE_CS_YCC 4
+#define CMP_NODE_BLUR_ASPECT_NONE 0
+#define CMP_NODE_BLUR_ASPECT_Y 1
+#define CMP_NODE_BLUR_ASPECT_X 2
+
#endif
diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h
index 700021eaceb..e8360b99d69 100644
--- a/source/blender/makesdna/DNA_object_fluidsim.h
+++ b/source/blender/makesdna/DNA_object_fluidsim.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -30,6 +30,10 @@
#ifndef DNA_OBJECT_FLUIDSIM_H
#define DNA_OBJECT_FLUIDSIM_H
+/** \file DNA_object_fluidsim.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index 63a6b8fbe4a..37568a22f54 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -30,6 +30,10 @@
#ifndef DNA_OBJECT_FORCE_H
#define DNA_OBJECT_FORCE_H
+/** \file DNA_object_force.h
+ * \ingroup DNA
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -129,7 +133,9 @@ typedef struct EffectorWeights {
*/
#define BPHYS_DATA_INDEX 0
#define BPHYS_DATA_LOCATION 1
+#define BPHYS_DATA_SMOKE_LOW 1
#define BPHYS_DATA_VELOCITY 2
+#define BPHYS_DATA_SMOKE_HIGH 2
#define BPHYS_DATA_ROTATION 3
#define BPHYS_DATA_AVELOCITY 4 /* used for particles */
#define BPHYS_DATA_XCONST 4 /* used for cloth */
@@ -139,20 +145,41 @@ typedef struct EffectorWeights {
#define BPHYS_TOT_DATA 8
+#define BPHYS_EXTRA_FLUID_SPRINGS 1
+
+typedef struct PTCacheExtra {
+ struct PTCacheExtra *next, *prev;
+ unsigned int type, totdata;
+ void *data;
+} PTCacheExtra;
+
typedef struct PTCacheMem {
struct PTCacheMem *next, *prev;
- int frame, totpoint;
+ unsigned int frame, totpoint;
unsigned int data_types, flag;
- int *index_array; /* quick access to stored points with index */
void *data[8]; /* BPHYS_TOT_DATA */
void *cur[8]; /* BPHYS_TOT_DATA */
+
+ struct ListBase extradata;
} PTCacheMem;
typedef struct PointCache {
struct PointCache *next, *prev;
int flag; /* generic flag */
- int step; /* frames between cached frames */
+
+ int step; /* The number of frames between cached frames.
+ * This should probably be an upper bound for a per point adaptive step in the future,
+ * buf for now it's the same for all points. Without adaptivity this can effect the perceived
+ * simulation quite a bit though. If for example particles are colliding with a horizontal
+ * plane (with high damping) they quickly come to a stop on the plane, however there are still
+ * forces acting on the particle (gravity and collisions), so the particle velocity isn't necessarily
+ * zero for the whole duration of the frame even if the particle seems stationary. If all simulation
+ * frames aren't cached (step > 1) these velocities are interpolated into movement for the non-cached
+ * frames. The result will look like the point is oscillating around the collision location. So for
+ * now cache step should be set to 1 for accurate reproduction of collisions.
+ */
+
int simframe; /* current frame of simulation (only if SIMULATION_VALID) */
int startframe; /* simulation start frame */
int endframe; /* simulation end frame */
@@ -161,12 +188,15 @@ typedef struct PointCache {
/* for external cache files */
int totpoint; /* number of cached points */
- int index, rt; /* modifier stack index */
+ int index; /* modifier stack index */
+ short compression, rt;
char name[64];
char prev_name[64];
char info[64];
char path[240]; /* file path */
+ char *cached_frames; /* array of length endframe-startframe+1 with flags to indicate cached frames */
+ /* can be later used for other per frame flags too if needed */
struct ListBase mem_cache;
struct PTCacheEdit *edit;
@@ -313,7 +343,7 @@ typedef struct SoftBody {
/* pd->flag: various settings */
#define PFIELD_USEMAX 1
-#define PDEFLE_DEFORM 2
+/*#define PDEFLE_DEFORM 2*/ /*UNUSED*/
#define PFIELD_GUIDE_PATH_ADD 4 /* TODO: do_versions for below */
#define PFIELD_PLANAR 8 /* used for do_versions */
#define PDEFLE_KILL_PART 16
@@ -367,10 +397,16 @@ typedef struct SoftBody {
#define PTCACHE_READ_INFO 1024
/* dont use the filename of the blendfile the data is linked from (write a local cache) */
#define PTCACHE_IGNORE_LIBPATH 2048
+/* high resolution cache is saved for smoke for backwards compatibility, so set this flag to know it's a "fake" cache */
+#define PTCACHE_FAKE_SMOKE (1<<12)
/* PTCACHE_OUTDATED + PTCACHE_FRAMES_SKIPPED */
#define PTCACHE_REDO_NEEDED 258
+#define PTCACHE_COMPRESS_NO 0
+#define PTCACHE_COMPRESS_LZO 1
+#define PTCACHE_COMPRESS_LZMA 2
+
/* ob->softflag */
#define OB_SB_ENABLE 1 /* deprecated, use modifier */
#define OB_SB_GOAL 2
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 1d3a2c1059c..5b4fc2e554f 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -1,8 +1,4 @@
-/**
- * blenlib/DNA_object_types.h (mar-2001 nzc)
- *
- * Object is a sort of wrapper for general info.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +29,11 @@
#ifndef DNA_OBJECT_TYPES_H
#define DNA_OBJECT_TYPES_H
+/** \file DNA_object_types.h
+ * \ingroup DNA
+ * \brief Object is a sort of wrapper for general info.
+ */
+
#include "DNA_listBase.h"
#include "DNA_ID.h"
#include "DNA_action_types.h" /* bAnimVizSettings */
@@ -198,7 +199,7 @@ typedef struct Object {
float bbsize[3];
short index; /* custom index, for renderpasses */
unsigned short actdef; /* current deformation group, note: index starts at 1 */
- float col[4]; /* object color, adjusted via IPO's only */
+ float col[4]; /* object color */
/**
* Settings for game objects
* bit 0: Object has dynamic behaviour
@@ -320,16 +321,15 @@ extern Object workob;
#define PARSLOW 16
/* (short) transflag */
-#define OB_OFFS_LOCAL 1
- // XXX OB_QUAT was never used, but is now depreceated in favour of standard rotation handling...
-#define OB_QUAT 2
+/*#define OB_OFFS_LOCAL 1*/ /*UNUSED*/
+/* #define OB_QUAT 2 */ /* never used, free flag */
#define OB_NEG_SCALE 4
#define OB_DUPLI (8+16+256+512+2048)
#define OB_DUPLIFRAMES 8
#define OB_DUPLIVERTS 16
#define OB_DUPLIROT 32
#define OB_DUPLINOSPEED 64
-#define OB_POWERTRACK 128
+/*#define OB_POWERTRACK 128*/ /*UNUSED*/
#define OB_DUPLIGROUP 256
#define OB_DUPLIFACES 512
#define OB_DUPLIFACES_SCALE 1024
@@ -342,9 +342,9 @@ extern Object workob;
#define OB_DRAWKEY 1
#define OB_DRAWKEYSEL 2
#define OB_OFFS_OB 4
-#define OB_OFFS_MAT 8
-#define OB_OFFS_VKEY 16
-#define OB_OFFS_PATH 32
+/* #define OB_OFFS_MAT 8 */ /*UNUSED*/
+/* #define OB_OFFS_VKEY 16 */ /*UNUSED*/
+/* #define OB_OFFS_PATH 32 */ /*UNUSED*/
#define OB_OFFS_PARENT 64
#define OB_OFFS_PARTICLE 128
/* get ipo from from action or not? */
@@ -401,7 +401,8 @@ extern Object workob;
#define OB_BOUND_CONE 3
#define OB_BOUND_POLYH 4
#define OB_BOUND_POLYT 5
-#define OB_BOUND_DYN_MESH 6
+/* #define OB_BOUND_DYN_MESH 6 */ /*UNUSED*/
+#define OB_BOUND_CAPSULE 7
#define OB_BOUND_CAPSULE 7
@@ -416,7 +417,7 @@ extern Object workob;
/* NOTE: this was used as a proper setting in past, so nullify before using */
#define BA_TEMP_TAG 32
-#define BA_FROMSET 128
+/* #define BA_FROMSET 128 */ /*UNUSED*/
#define BA_TRANSFORM_CHILD 256 /* child of a transformed object */
#define BA_TRANSFORM_PARENT 8192 /* parent of a transformed object */
@@ -437,7 +438,8 @@ extern Object workob;
#define OB_RECALC_DATA 2
/* time flag is set when time changes need recalc, so baked systems can ignore it */
#define OB_RECALC_TIME 4
-#define OB_RECALC_ALL 7
+ /* only use for matching any flag, NOT as an argument since more flags may be added. */
+#define OB_RECALC_ALL (OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME)
/* controller state */
#define OB_MAX_STATES 30
@@ -475,7 +477,7 @@ extern Object workob;
#define OB_LOCK_RIGID_BODY_Y_ROT_AXIS 64
#define OB_LOCK_RIGID_BODY_Z_ROT_AXIS 128
-#define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD)
+/* #define OB_LIFE (OB_PROP|OB_DYNAMIC|OB_ACTOR|OB_MAINACTOR|OB_CHILD) */
/* ob->body_type */
#define OB_BODY_TYPE_NO_COLLISION 0
@@ -557,6 +559,9 @@ typedef enum ObjectMode {
OB_MODE_POSE = 64
} ObjectMode;
+/* any mode where the brush system is used */
+#define OB_MODE_ALL_PAINT (OB_MODE_SCULPT|OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)
+
#define MAX_DUPLI_RECUR 8
#ifdef __cplusplus
diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h
index d30351b6c34..c44f10efde8 100644
--- a/source/blender/makesdna/DNA_outliner_types.h
+++ b/source/blender/makesdna/DNA_outliner_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef DNA_OUTLINER_TYPES_H
#define DNA_OUTLINER_TYPES_H
+/** \file DNA_outliner_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
struct ID;
diff --git a/source/blender/makesdna/DNA_packedFile_types.h b/source/blender/makesdna/DNA_packedFile_types.h
index 73f55ca186c..de7218ec704 100644
--- a/source/blender/makesdna/DNA_packedFile_types.h
+++ b/source/blender/makesdna/DNA_packedFile_types.h
@@ -1,7 +1,4 @@
-/* DNA_packedFile_types.h
- *
- * 12-oct-2000 nzc
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +30,12 @@
#ifndef DNA_PACKEDFILE_TYPES_H
#define DNA_PACKEDFILE_TYPES_H
+/** \file DNA_packedFile_types.h
+ * \ingroup DNA
+ * \author nzc
+ * \since 12-oct-2000 nzc
+ */
+
typedef struct PackedFile {
int size;
int seek;
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index 105fa6d5289..ae97b023e58 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -1,6 +1,4 @@
-/* DNA_particle_types.h
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +30,10 @@
#ifndef DNA_PARTICLE_TYPES_H
#define DNA_PARTICLE_TYPES_H
+/** \file DNA_particle_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
#include "DNA_boid_types.h"
@@ -61,6 +63,11 @@ typedef struct BoidParticle {
float rt;
} BoidParticle;
+typedef struct ParticleSpring {
+ float rest_length;
+ unsigned int particle_index[2], delete_flag;
+}ParticleSpring;
+
/* Child particles are created around or between parent particles */
typedef struct ChildParticle {
int num, parent; /* num is face index on the final derived mesh */
@@ -116,12 +123,17 @@ typedef struct ParticleData {
typedef struct SPHFluidSettings {
/*Particle Fluid*/
- float spring_k, radius, rest_length;
+ float spring_k, radius, rest_length, plasticity_constant, yield_ratio;
float viscosity_omega, viscosity_beta;
float stiffness_k, stiffness_knear, rest_density;
float buoyancy;
+ int flag, pad;
} SPHFluidSettings;
+/* fluid->flag */
+#define SPH_VISCOELASTIC_SPRINGS 1
+#define SPH_CURRENT_REST_LENGTH 2
+
typedef struct ParticleSettings {
ID id;
struct AnimData *adt;
@@ -132,7 +144,7 @@ typedef struct ParticleSettings {
struct EffectorWeights *effector_weights;
int flag;
- short type, from, distr;
+ short type, from, distr, texact;
/* physics modes */
short phystype, rotmode, avemode, reactevent;
short draw, draw_as, draw_size, childtype;
@@ -145,7 +157,7 @@ typedef struct ParticleSettings {
short adapt_angle, adapt_pix;
short disp, omat, interpolation, rotfrom, integrator;
- short kink, kink_axis;
+ short kink, kink_axis, rt2;
/* billboards */
short bb_align, bb_uv_split, bb_anim, bb_split_offset;
@@ -158,15 +170,15 @@ typedef struct ParticleSettings {
/* general values */
float sta, end, lifetime, randlife;
- float timetweak, jitfac, eff_hair;
- int totpart, userjit, grid_res;
+ float timetweak, jitfac, eff_hair, grid_rand;
+ int totpart, userjit, grid_res, effector_amount;
/* initial velocity factors */
float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
- float ob_vel[3], rt;
+ float ob_vel[3];
float avefac, phasefac, randrotfac, randphasefac;
/* physical properties */
- float mass, size, randsize, reactshape;
+ float mass, size, randsize;
/* global physical properties */
float acc[3], dragfac, brownfac, dampfac;
/* length */
@@ -178,13 +190,17 @@ typedef struct ParticleSettings {
/* clumping */
float clumpfac, clumppow;
/* kink */
- float kink_amp, kink_freq, kink_shape;
+ float kink_amp, kink_freq, kink_shape, kink_flat;
+ float kink_amp_clump;
/* rough */
float rough1, rough1_size;
float rough2, rough2_size, rough2_thres;
float rough_end, rough_end_shape;
/* length */
float clength, clength_thres;
+ /* parting */
+ float parting_fac;
+ float parting_min, parting_max;
/* branching */
float branch_thres;
/* drawing stuff */
@@ -194,6 +210,8 @@ typedef struct ParticleSettings {
/* keyed particles */
int keyed_loops;
+ struct MTex *mtex[18]; /* MAX_MTEX */
+
struct Group *dup_group;
struct ListBase dupliweights;
struct Group *eff_group; // deprecated
@@ -232,8 +250,8 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
float imat[4][4]; /* used for duplicators */
float cfra, tree_frame;
- int seed, rt;
- int flag, totpart, totchild, totcached, totchildcache;
+ int seed, child_seed;
+ int flag, totpart, totunexist, totchild, totcached, totchildcache, rt;
short recalc, target_psys, totkeyed, bakespace;
char bb_uvname[3][32]; /* billboard uv name */
@@ -250,6 +268,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
struct ListBase *effectors;
+ ParticleSpring *fluid_springs;
+ int tot_fluidsprings, alloc_fluidsprings;
+
struct KDTree *tree; /* used for interactions with self and other systems */
struct ParticleDrawData *pdd;
@@ -273,7 +294,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
/* for dopesheet */
#define PART_DS_EXPAND 8
-#define PART_HAIR_GEOMETRY 16
+#define PART_HAIR_REGROW 16 /* regrow hair for each frame */
#define PART_UNBORN 32 /*show unborn particles*/
#define PART_DIED 64 /*show died particles*/
@@ -287,25 +308,25 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_ROT_DYN (1<<14) /* dynamic rotation */
#define PART_SIZEMASS (1<<16)
-//#define PART_HAIR_GRAVITY (1<<15)
+#define PART_HIDE_ADVANCED_HAIR (1<<15)
//#define PART_ABS_TIME (1<<17)
//#define PART_GLOB_TIME (1<<18)
#define PART_BOIDS_2D (1<<19)
-#define PART_BRANCHING (1<<20)
-#define PART_ANIM_BRANCHING (1<<21)
-#define PART_SYMM_BRANCHING (1<<24)
+//#define PART_BRANCHING (1<<20)
+//#define PART_ANIM_BRANCHING (1<<21)
#define PART_HAIR_BSPLINE 1024
+#define PART_GRID_HEXAGONAL (1<<24)
#define PART_GRID_INVERT (1<<26)
-#define PART_CHILD_EFFECT (1<<27)
-#define PART_CHILD_SEAMS (1<<28)
-#define PART_CHILD_RENDER (1<<29)
-#define PART_CHILD_GUIDE (1<<30)
+#define PART_CHILD_EFFECT (1<<27)
+#define PART_CHILD_LONG_HAIR (1<<28)
+/* #define PART_CHILD_RENDER (1<<29) */ /*UNUSED*/
+#define PART_CHILD_GUIDE (1<<30)
#define PART_SELF_EFFECT (1<<22)
@@ -371,10 +392,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
/* part->bb_anim */
#define PART_BB_ANIM_NONE 0
-#define PART_BB_ANIM_TIME 1
+#define PART_BB_ANIM_AGE 1
#define PART_BB_ANIM_ANGLE 2
-#define PART_BB_ANIM_OFF_TIME 3
-#define PART_BB_ANIM_OFF_ANGLE 4
+#define PART_BB_ANIM_FRAME 3
/* part->bb_split_offset */
#define PART_BB_OFF_NONE 0
@@ -442,7 +462,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PSYS_ENABLED 16 /* deprecated */
#define PSYS_HAIR_UPDATED 32 /* signal for updating hair particle mode */
#define PSYS_DRAWING 64
-//#define PSYS_SOFT_BAKE 128
+#define PSYS_USE_IMAT 128
#define PSYS_DELETE 256 /* remove particlesystem as soon as possible */
#define PSYS_HAIR_DONE 512
#define PSYS_KEYED 1024
@@ -491,4 +511,25 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PTARGET_MODE_FRIEND 1
#define PTARGET_MODE_ENEMY 2
+/* mapto */
+/* init */
+#define PAMAP_INIT 15
+#define PAMAP_TIME (1<<0) /* emission time */
+#define PAMAP_LIFE (1<<1) /* life time */
+#define PAMAP_DENS (1<<2) /* density */
+#define PAMAP_SIZE (1<<3) /* physical size */
+/* reset */
+#define PAMAP_IVEL (1<<5) /* initial velocity */
+/* physics */
+#define PAMAP_PHYSICS 3136
+#define PAMAP_FIELD (1<<6) /* force fields */
+#define PAMAP_GRAVITY (1<<10)
+#define PAMAP_DAMP (1<<11)
+/* children */
+#define PAMAP_CHILD 912
+#define PAMAP_CLUMP (1<<7)
+#define PAMAP_KINK (1<<8)
+#define PAMAP_ROUGH (1<<9)
+#define PAMAP_LENGTH (1<<4)
+
#endif
diff --git a/source/blender/makesdna/DNA_property_types.h b/source/blender/makesdna/DNA_property_types.h
index e0da4e89f0f..04f0a6e60c6 100644
--- a/source/blender/makesdna/DNA_property_types.h
+++ b/source/blender/makesdna/DNA_property_types.h
@@ -1,8 +1,5 @@
-/**
- * blenlib/DNA_property_types.h (mar-2001 nzc)
+/*
*
- * Renderrecipe and scene decription. The fact that there is a
- * hierarchy here is a bit strange, and not desirable.
*
* $Id$
*
@@ -34,6 +31,14 @@
#ifndef DNA_PROPERTY_TYPES_H
#define DNA_PROPERTY_TYPES_H
+/** \file DNA_property_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ * \attention Renderrecipe and scene decription. The fact that there is a
+ * hierarchy here is a bit strange, and not desirable.
+ */
+
/* ********************* PROPERTY ************************ */
typedef struct bProperty {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index cc5d256615e..e3057e862b8 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,10 @@
#ifndef DNA_SCENE_TYPES_H
#define DNA_SCENE_TYPES_H
+/** \file DNA_scene_types.h
+ * \ingroup DNA
+ */
+
// XXX, temp feature
#define DURIAN_CAMERA_SWITCH
@@ -221,8 +225,8 @@ typedef struct RenderData {
float edgeR, edgeG, edgeB;
short fullscreen, xplay, yplay, freqplay; /* standalone player */ // XXX deprecated since 2.5
- short depth, attrib, rt2; /* standalone player */ // XXX deprecated since 2.5
- short frame_step; /* frames to jump during render/playback */
+ short depth, attrib; /* standalone player */ // XXX deprecated since 2.5
+ int frame_step; /* frames to jump during render/playback */
short stereomode; /* standalone player stereo settings */ // XXX deprecated since 2.5
@@ -453,7 +457,7 @@ typedef struct GameData {
/* stereo/dome mode */
struct GameDome dome;
- short stereoflag, stereomode, xsch, ysch; //xsch and ysch can be deleted !!!
+ short stereoflag, stereomode, xsch, ysch; //xsch and ysch used for backwards compat.
float eyeseparation, pad1;
} GameData;
@@ -492,6 +496,7 @@ typedef struct GameData {
#define GAME_GLSL_NO_EXTRA_TEX (1 << 11)
#define GAME_IGNORE_DEPRECATION_WARNINGS (1 << 12)
#define GAME_ENABLE_ANIMATION_RECORD (1 << 13)
+#define GAME_SHOW_MOUSE (1 << 14)
/* GameData.matmode */
#define GAME_MAT_TEXFACE 0
@@ -657,8 +662,11 @@ typedef struct ToolSettings {
short uvcalc_mapalign;
short uvcalc_flag;
short uv_flag, uv_selectmode;
- short uv_pad[2];
-
+ short uv_pad;
+
+ /* Grease Pencil */
+ short gpencil_flags;
+
/* Auto-IK */
short autoik_chainlen;
@@ -743,8 +751,10 @@ typedef struct bStats {
typedef struct UnitSettings {
/* Display/Editing unit options for each scene */
float scale_length; /* maybe have other unit conversions? */
- short system;
- short flag; /* imperial, metric etc */
+ char system; /* imperial, metric etc */
+ char system_rotation; /* not implimented as a propper unit system yet */
+ short flag;
+
} UnitSettings;
typedef struct PhysicsSettings {
@@ -760,7 +770,6 @@ typedef struct Scene {
struct World *world;
struct Scene *set;
- struct Image *ima;
ListBase base;
struct Base *basact; /* active base */
@@ -772,7 +781,7 @@ typedef struct Scene {
unsigned int lay; /* bitflags for layer visibility */
int layact; /* active layer */
- int pad1;
+ unsigned int customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
short flag; /* various settings */
@@ -804,7 +813,7 @@ typedef struct Scene {
short dagisvalid, dagflags;
short recalc; /* recalc = counterpart of ob->recalc */
- short jumpframe;
+ short pad6;
int pad5;
/* User-Defined KeyingSets */
@@ -828,12 +837,6 @@ typedef struct Scene {
/* **************** RENDERDATA ********************* */
-/* bufflag */
-#define R_BACKBUF 1
-#define R_BACKBUFANIM 2
-#define R_FRONTBUF 4
-#define R_FRONTBUFANIM 8
-
/* flag */
/* use preview range */
#define SCER_PRV_RANGE (1<<0)
@@ -851,7 +854,7 @@ typedef struct Scene {
#define R_BORDER 0x0200
#define R_PANORAMA 0x0400 /* deprecated as scene option, still used in renderer */
#define R_CROP 0x0800
-#define R_COSMO 0x1000
+/*#define R_COSMO 0x1000 deprecated */
#define R_ODDFIELD 0x2000
#define R_MBLUR 0x4000
/* unified was here */
@@ -859,7 +862,7 @@ typedef struct Scene {
/* R_GAUSS is obsolete, but used to retrieve setting from old files */
#define R_GAUSS 0x20000
/* fbuf obsolete... */
-#define R_FBUF 0x40000
+/*#define R_FBUF 0x40000*/
/* threads obsolete... is there for old files, now use for autodetect threads */
#define R_THREADS 0x80000
/* Use the same flag for autothreads */
@@ -880,7 +883,8 @@ typedef struct Scene {
#define R_OUTPUT_SCREEN 0
#define R_OUTPUT_AREA 1
#define R_OUTPUT_WINDOW 2
-#define R_OUTPUT_FORKED 3
+#define R_OUTPUT_NONE 3
+/*#define R_OUTPUT_FORKED 4*/
/* filtertype */
#define R_FILTER_BOX 0
@@ -924,10 +928,10 @@ typedef struct Scene {
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
#define R_NO_TEX 0x2000
-#define R_STAMP_INFO 0x4000 /* deprecated */
+#define R_NO_FRAME_UPDATE 0x4000
#define R_FULL_SAMPLE 0x8000
-#define R_DEPRECATED 0x10000
-#define R_RECURS_PROTECTION 0x20000
+/* #define R_DEPRECATED 0x10000 */
+/* #define R_RECURS_PROTECTION 0x20000 */
#define R_TEXNODE_PREVIEW 0x40000
/* r->stamp */
@@ -942,7 +946,8 @@ typedef struct Scene {
#define R_STAMP_FILENAME 0x0100
#define R_STAMP_SEQSTRIP 0x0200
#define R_STAMP_RENDERTIME 0x0400
-#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP|R_STAMP_RENDERTIME)
+#define R_STAMP_CAMERALENS 0x0800
+#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE|R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP|R_STAMP_RENDERTIME|R_STAMP_CAMERALENS)
/* alphamode */
#define R_ADDSKY 0
@@ -963,7 +968,7 @@ typedef struct Scene {
/* #define R_HAMX 2 */ /* hamx is nomore */
/* #define R_FTYPE 3 */ /* ftype is nomore */
#define R_JPEG90 4
-#define R_MOVIE 5
+/*#define R_MOVIE 5*/ /* movie is nomore */
#define R_IRIZ 7
#define R_RAWTGA 14
#define R_AVIRAW 15
@@ -1038,17 +1043,17 @@ typedef struct Scene {
#define TESTBASELIB_BGMODE(v3d, scene, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_EDITABLE_BGMODE(v3d, scene, base) (((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
+#define BASE_VISIBLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & OB_RESTRICT_VIEW)==0)
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last
#define BASACT (scene->basact)
-#define OBACT (BASACT? BASACT->object: 0)
+#define OBACT (BASACT? BASACT->object: NULL)
#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
#define ID_NEW_US(a) if( (a)->id.newid) {(a)= (void *)(a)->id.newid; (a)->id.us++;}
#define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;}
#define CFRA (scene->r.cfra)
#define SUBFRA (scene->r.subframe)
-#define F_CFRA ((float)(scene->r.cfra))
#define SFRA (scene->r.sfra)
#define EFRA (scene->r.efra)
#define PRVRANGEON (scene->r.flag & SCER_PRV_RANGE)
@@ -1157,8 +1162,9 @@ typedef enum SculptFlags {
/* ImagePaintSettings.flag */
#define IMAGEPAINT_DRAWING 1
-#define IMAGEPAINT_DRAW_TOOL 2
-#define IMAGEPAINT_DRAW_TOOL_DRAWING 4
+// #define IMAGEPAINT_DRAW_TOOL 2 // deprecated
+// #define IMAGEPAINT_DRAW_TOOL_DRAWING 4 // deprecated
+
/* projection painting only */
#define IMAGEPAINT_PROJECT_DISABLE 8 /* Non projection 3D painting */
#define IMAGEPAINT_PROJECT_XRAY 16
@@ -1170,7 +1176,7 @@ typedef enum SculptFlags {
/* toolsettings->uvcalc_flag */
#define UVCALC_FILLHOLES 1
-#define UVCALC_NO_ASPECT_CORRECT 2 /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
+/*#define UVCALC_NO_ASPECT_CORRECT 2*/ /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
#define UVCALC_TRANSFORM_CORRECT 4 /* adjust UV's while transforming to avoid distortion */
/* toolsettings->uv_flag */
@@ -1190,13 +1196,16 @@ typedef enum SculptFlags {
#define EDGE_MODE_TAG_CREASE 3
#define EDGE_MODE_TAG_BEVEL 4
+/* toolsettings->gpencil_flags */
+#define GP_TOOL_FLAG_PAINTSESSIONS_ON (1<<0)
+
/* toolsettings->particle flag */
#define PE_KEEP_LENGTHS 1
#define PE_LOCK_FIRST 2
#define PE_DEFLECT_EMITTER 4
#define PE_INTERPOLATE_ADDED 8
#define PE_DRAW_PART 16
-#define PE_X_MIRROR 64 /* deprecated */
+/* #define PE_X_MIRROR 64 */ /* deprecated */
#define PE_FADE_TIME 128
#define PE_AUTO_VELOCITY 256
@@ -1225,10 +1234,10 @@ typedef enum SculptFlags {
#define RETOPO 1
#define RETOPO_PAINT 2
-/* toolsettings->retopo_paint_tool */
-#define RETOPO_PEN 1
-#define RETOPO_LINE 2
-#define RETOPO_ELLIPSE 4
+/* toolsettings->retopo_paint_tool */ /*UNUSED*/
+/* #define RETOPO_PEN 1 */
+/* #define RETOPO_LINE 2 */
+/* #define RETOPO_ELLIPSE 4 */
/* toolsettings->skgen_options */
#define SKGEN_FILTER_INTERNAL (1 << 0)
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index a811fd9c014..381046daedc 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
#ifndef DNA_SCREEN_TYPES_H
#define DNA_SCREEN_TYPES_H
+/** \file DNA_screen_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_view2d_types.h"
#include "DNA_vec_types.h"
@@ -54,7 +58,11 @@ typedef struct bScreen {
struct Scene *scene;
struct Scene *newscene; /* temporary when switching */
- short full; /* fade out? */
+ int redraws_flag; /* user-setting for which editors get redrawn during anim playback (used to be time->redraws) */
+ int pad1;
+
+ short full; /* temp screen for image render display or fileselect */
+ short temp; /* temp screen in a temp window, don't save (like user prefs) */
short winid; /* winid from WM, starts with 1 */
short do_draw; /* notifier for drawing edges */
short do_refresh; /* notifier for scale screen, changed screen, etc */
@@ -66,7 +74,7 @@ typedef struct bScreen {
short mainwin; /* screensize subwindow, for screenedges and global menus */
short subwinactive; /* active subwindow */
- int pad2;
+ short pad;
struct wmTimer *animtimer; /* if set, screen has timer handler added in window */
void *context; /* context callback */
@@ -187,20 +195,20 @@ typedef struct ARegion {
#define HEADERDOWN 1
#define HEADERTOP 2
-#define SCREENNORMAL 0
-#define SCREENFULL 1
-#define SCREENAUTOPLAY 2
-#define SCREENTEMP 3
+/* screen->full */
+#define SCREENNORMAL 0
+#define SCREENFULL 1
+#define SCREENFULLTEMP 2
/* Panel->snap - for snapping to screen edges */
#define PNL_SNAP_NONE 0
-#define PNL_SNAP_TOP 1
-#define PNL_SNAP_RIGHT 2
-#define PNL_SNAP_BOTTOM 4
-#define PNL_SNAP_LEFT 8
+/* #define PNL_SNAP_TOP 1 */
+/* #define PNL_SNAP_RIGHT 2 */
+#define PNL_SNAP_BOTTOM 4
+/* #define PNL_SNAP_LEFT 8 */
-#define PNL_SNAP_DIST 9.0
+/* #define PNL_SNAP_DIST 9.0 */
/* paneltype flag */
#define PNL_DEFAULT_CLOSED 1
@@ -214,6 +222,7 @@ typedef struct ARegion {
#define SCREEN_HANDLER_VERSE 3
/* regiontype, first two are the default set */
+/* Do NOT change order, append on end. Types are hardcoded needed */
enum {
RGN_TYPE_WINDOW = 0,
RGN_TYPE_HEADER,
diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h
index f2bdfeff9dd..e5f924b5fa6 100644
--- a/source/blender/makesdna/DNA_sdna_types.h
+++ b/source/blender/makesdna/DNA_sdna_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_sdna.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,10 @@
*/
#ifndef DNA_SDNA_H
#define DNA_SDNA_H
+/**
+ * \file DNA_sdna_types.h
+ * \ingroup DNA
+ */
#
#
@@ -38,7 +40,7 @@ typedef struct SDNA {
int datalen; /* length of data */
int nr_names; /* total number of struct members */
- char **names; /* struct member names */
+ const char **names; /* struct member names */
int pointerlen; /* size of a pointer in bytes */
diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h
index d7256b5b9e0..fb7a3e70c7c 100644
--- a/source/blender/makesdna/DNA_sensor_types.h
+++ b/source/blender/makesdna/DNA_sensor_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_sensor_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,12 @@
*/
#ifndef DNA_SENSOR_TYPES_H
#define DNA_SENSOR_TYPES_H
+/** \file DNA_sensor_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ *
+ */
struct Object;
struct Material;
@@ -207,6 +211,14 @@ typedef struct bJoystickSensor {
#define SENS_RAY_NEG_Z_AXIS 5
//#define SENS_RAY_NEGATIVE_AXIS 1
+/* bRadarSensor->axis */
+#define SENS_RADAR_X_AXIS 0
+#define SENS_RADAR_Y_AXIS 1
+#define SENS_RADAR_Z_AXIS 2
+#define SENS_RADAR_NEG_X_AXIS 3
+#define SENS_RADAR_NEG_Y_AXIS 4
+#define SENS_RADAR_NEG_Z_AXIS 5
+
/* bMessageSensor->type */
#define SENS_MESG_MESG 0
#define SENS_MESG_PROP 1
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index d51dec97351..22f0c23ea9b 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_sequence_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,11 @@
*/
#ifndef DNA_SEQUENCE_TYPES_H
#define DNA_SEQUENCE_TYPES_H
+/** \file DNA_sequence_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
@@ -42,6 +45,7 @@ struct bSound;
typedef struct StripElem {
char name[80];
+ int orig_width, orig_height;
} StripElem;
typedef struct StripCrop {
@@ -81,7 +85,6 @@ typedef struct Strip {
int startstill, endstill;
StripElem *stripdata;
char dir[160];
- int orx, ory;
StripProxy *proxy;
StripCrop *crop;
StripTransform *transform;
@@ -232,6 +235,8 @@ typedef struct SpeedControlVars {
int lastValidFrame;
} SpeedControlVars;
+#define SELECT 1
+
/* Editor->over_flag */
#define SEQ_EDIT_OVERLAY_SHOW 1
#define SEQ_EDIT_OVERLAY_ABS 2
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index b8be51b378f..168481d3b29 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,12 +29,17 @@
#ifndef DNA_SMOKE_TYPES_H
#define DNA_SMOKE_TYPES_H
+/** \file DNA_smoke_types.h
+ * \ingroup DNA
+ */
+
/* flags */
#define MOD_SMOKE_HIGHRES (1<<1) /* enable high resolution */
#define MOD_SMOKE_DISSOLVE (1<<2) /* let smoke dissolve */
#define MOD_SMOKE_DISSOLVE_LOG (1<<3) /* using 1/x for dissolve */
#define MOD_SMOKE_HIGH_SMOOTH (1<<5) /* smoothens high res emission*/
+#define MOD_SMOKE_FILE_LOAD (1<<6) /* flag for file load */
/* noise */
#define MOD_SMOKE_NOISEWAVE (1<<0)
@@ -86,6 +91,8 @@ typedef struct SmokeDomainSettings {
int v3dnum;
int cache_comp;
int cache_high_comp;
+
+ /* Smoke uses only one cache from now on (index [0]), but keeping the array for now for reading old files. */
struct PointCache *point_cache[2]; /* definition is in DNA_object_force.h */
struct ListBase ptcaches[2];
struct EffectorWeights *effector_weights;
diff --git a/source/blender/makesdna/DNA_sound_types.h b/source/blender/makesdna/DNA_sound_types.h
index c10d306565b..3e5f82a8052 100644
--- a/source/blender/makesdna/DNA_sound_types.h
+++ b/source/blender/makesdna/DNA_sound_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_sound_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,11 @@
*/
#ifndef DNA_SOUND_TYPES_H
#define DNA_SOUND_TYPES_H
+/** \file DNA_sound_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
#include "DNA_listBase.h"
#include "DNA_ID.h"
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index bf64bc27b48..a23aed505ae 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_space_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,11 @@
*/
#ifndef DNA_SPACE_TYPES_H
#define DNA_SPACE_TYPES_H
+/** \file DNA_space_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
#include "DNA_listBase.h"
#include "DNA_color_types.h" /* for Histogram */
@@ -84,11 +87,20 @@ typedef struct SpaceInfo {
short blockhandler[8]; /* XXX depricate this */
- struct bScreen *screen; /* browse screen */
- struct Scene *scene; /* browse scene */
+ char rpt_mask;
+ char pad[7];
} SpaceInfo;
+/* SpaceInfo.rpt_mask */
+enum {
+ INFO_RPT_DEBUG = 1<<0,
+ INFO_RPT_INFO = 1<<1,
+ INFO_RPT_OP = 1<<2,
+ INFO_RPT_WARN = 1<<3,
+ INFO_RPT_ERR = 1<<4,
+};
+
/* 'Graph' Editor (formerly known as the IPO Editor) */
typedef struct SpaceIpo {
SpaceLink *next, *prev;
@@ -126,7 +138,8 @@ typedef struct SpaceButs {
short mainb, mainbo, mainbuser; /* context tabs */
short re_align, align; /* align for panels */
short preview; /* preview is signal to refresh */
- char flag, pad[3];
+ short texture_context; /* texture context selector (material, world, brush)*/
+ char flag, pad;
void *path; /* runtime */
int pathflag, dataicon; /* runtime */
@@ -157,12 +170,14 @@ typedef struct SpaceSeq {
} SpaceSeq;
typedef struct FileSelectParams {
- char title[24]; /* title, also used for the text of the execute button */
+ char title[32]; /* title, also used for the text of the execute button */
char dir[240]; /* directory */
char file[80]; /* file */
char renamefile[80];
char renameedit[80]; /* annoying but the first is only used for initialization */
+ char filter_glob[64]; /* list of filetypes to filter */
+
short type; /* XXXXX for now store type here, should be moved to the operator */
short flag; /* settings for filter, hiding dots files,... */
short sort; /* sort order */
@@ -229,9 +244,8 @@ typedef struct SpaceOops {
/* search stuff */
char search_string[32];
struct TreeStoreElem search_tse;
- int search_flags, do_;
-
- short flag, outlinevis, storeflag, pad;
+
+ short flag, outlinevis, storeflag, search_flags;
} SpaceOops;
typedef struct SpaceImage {
@@ -239,34 +253,30 @@ typedef struct SpaceImage {
ListBase regionbase; /* storage of regions for inactive spaces */
int spacetype;
- float blockscale;
- short blockhandler[8];
-
+ int flag;
+
struct Image *image;
struct ImageUser iuser;
+ struct CurveMapping *cumap;
- struct CurveMapping *cumap;
- short menunr, imanr, pad2;
+ struct Scopes scopes; /* histogram waveform and vectorscope */
+ struct Histogram sample_line_hist; /* sample line histogram */
+
+ struct bGPdata *gpd; /* grease pencil data */
+
+ float cursor[2]; /* UV editor 2d cursor */
+ float xof, yof; /* user defined offset, image is centered */
+ float zoom; /* user defined zoom level */
+ float centx, centy; /* storage for offset while render drawing */
+
short curtile; /* the currently active tile of the image when tile is enabled, is kept in sync with the active faces tile */
- int flag;
- short imtypenr, lock;
- short pin, pad3;
+ short imtypenr;
+ short lock;
+ short pin;
char dt_uv; /* UV draw type */
char sticky; /* sticky selection type */
char dt_uvstretch;
char around;
- float cursor[2]; /* UV editor 2d cursor */
-
- float xof, yof; /* user defined offset, image is centered */
- float zoom, pad4; /* user defined zoom level */
- float centx, centy; /* storage for offset while render drawing */
-
- struct bGPdata *gpd; /* grease pencil data */
-
- struct Scopes scopes; /* histogram waveform and vectorscope */
-
- struct Histogram sample_line_hist; /* sample line histogram */
-
} SpaceImage;
typedef struct SpaceNla {
@@ -316,6 +326,11 @@ typedef struct SpaceText {
char findstr[256]; /* ST_MAX_FIND_STR */
char replacestr[256]; /* ST_MAX_FIND_STR */
+
+ short margin_column; /* column number to show right margin at */
+ char pad[6];
+
+ void *drawcache; /* cache for faster drawing */
} SpaceText;
typedef struct Script {
@@ -332,9 +347,6 @@ typedef struct Script {
char scriptarg[256];
} Script;
#define SCRIPT_SET_NULL(_script) _script->py_draw = _script->py_event = _script->py_button = _script->py_browsercallback = _script->py_globaldict = NULL; _script->flags = 0;
-#define SCRIPT_RUNNING 0x01
-#define SCRIPT_GUI 0x02
-#define SCRIPT_FILESEL 0x04
typedef struct SpaceScript {
SpaceLink *next, *prev;
@@ -349,15 +361,11 @@ typedef struct SpaceScript {
void *but_refs;
} SpaceScript;
+# /* Only store the data array in the cache to avoid constant reallocation. */
+# /* No need to store when saved. */
typedef struct SpaceTimeCache {
struct SpaceTimeCache *next, *prev;
- int type;
- int flag;
-
float *array;
- int len;
- int startframe, endframe;
- int ok;
} SpaceTimeCache;
typedef struct SpaceTime {
@@ -371,7 +379,7 @@ typedef struct SpaceTime {
ListBase caches;
int cache_display, pad;
- int flag, redraws;
+ int flag, redraws; /* redraws is deprecated... moved to screen */
} SpaceTime;
@@ -395,8 +403,9 @@ typedef struct SpaceNode {
float mx, my; /* mousepos for drawing socketless link */
struct bNodeTree *nodetree, *edittree;
- int treetype; /* treetype: as same nodetree->type */
- short texfrom, pad; /* texfrom object, world or brush */
+ int treetype; /* treetype: as same nodetree->type */
+ short texfrom; /* texfrom object, world or brush */
+ short recalc; /* currently on 0/1, for auto compo */
struct bGPdata *gpd; /* grease-pencil data */
} SpaceNode;
@@ -404,6 +413,9 @@ typedef struct SpaceNode {
/* snode->flag */
#define SNODE_BACKDRAW 2
#define SNODE_DISPGP 4
+#define SNODE_USE_ALPHA 8
+#define SNODE_SHOW_ALPHA 16
+#define SNODE_AUTO_RENDER 32
/* snode->texfrom */
#define SNODE_TEX_OBJECT 0
@@ -505,21 +517,6 @@ enum {
CONSOLE_LINE_ERROR
};
-/* SpaceConsole.rpt_mask */
-enum {
- CONSOLE_TYPE_PYTHON=0,
- CONSOLE_TYPE_REPORT,
-};
-
-/* SpaceConsole.type see BKE_report.h */
-enum {
- CONSOLE_RPT_DEBUG = 1<<0,
- CONSOLE_RPT_INFO = 1<<1,
- CONSOLE_RPT_OP = 1<<2,
- CONSOLE_RPT_WARN = 1<<3,
- CONSOLE_RPT_ERR = 1<<4,
-};
-
typedef struct SpaceConsole {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
@@ -529,9 +526,7 @@ typedef struct SpaceConsole {
short blockhandler[8]; // XXX are these needed?
/* space vars */
- int type; /* console/report/..? */
- int rpt_mask; /* which reports to display */
- int flag, lheight;
+ int lheight, pad;
ListBase scrollback; /* ConsoleLine; output */
ListBase history; /* ConsoleLine; command history, current edited line is the first */
@@ -639,10 +634,16 @@ typedef struct SpaceSound {
/* sbuts->flag */
#define SB_PRV_OSA 1
#define SB_PIN_CONTEXT 2
-#define SB_WORLD_TEX 4
-#define SB_BRUSH_TEX 8
+//#define SB_WORLD_TEX 4 //not used anymore
+//#define SB_BRUSH_TEX 8 //not used anymore
#define SB_SHADING_CONTEXT 16
+/* sbuts->texture_context */
+#define SB_TEXC_MAT_OR_LAMP 0
+#define SB_TEXC_WORLD 1
+#define SB_TEXC_BRUSH 2
+#define SB_TEXC_PARTICLES 3
+
/* sbuts->align */
#define BUT_FREE 0
#define BUT_HORIZONTAL 1
@@ -714,7 +715,7 @@ enum FileSortTypeE {
#define EDITING (1<<0)
#define ACTIVEFILE (1<<1)
#define BLENDERFILE (1<<2)
-#define PSXFILE (1<<3)
+#define BLENDERFILE_BACKUP (1<<3)
#define IMAGEFILE (1<<4)
#define MOVIEFILE (1<<5)
#define PYSCRIPTFILE (1<<6)
@@ -725,6 +726,7 @@ enum FileSortTypeE {
#define FOLDERFILE (1<<11) /* represents folders for filtering */
#define BTXFILE (1<<12)
#define COLLADAFILE (1<<13)
+#define OPERATORFILE (1<<14) /* from filter_glob operator property */
/* SpaceImage->dt_uv */
#define SI_UVDT_OUTLINE 0
@@ -744,35 +746,35 @@ enum FileSortTypeE {
#define SI_STICKY_VERTEX 2
/* SpaceImage->flag */
-#define SI_BE_SQUARE 1<<0
-#define SI_EDITTILE 1<<1
-#define SI_CLIP_UV 1<<2
-#define SI_DRAWTOOL 1<<3
-#define SI_DEPRECATED1 1<<4 /* stick UVs to others in the same location */
-#define SI_DRAWSHADOW 1<<5
-#define SI_SELACTFACE 1<<6 /* deprecated */
-#define SI_DEPRECATED2 1<<7
-#define SI_DEPRECATED3 1<<8 /* stick UV selection to mesh vertex (UVs wont always be touching) */
-#define SI_COORDFLOATS 1<<9
-#define SI_PIXELSNAP 1<<10
-#define SI_LIVE_UNWRAP 1<<11
-#define SI_USE_ALPHA 1<<12
-#define SI_SHOW_ALPHA 1<<13
-#define SI_SHOW_ZBUF 1<<14
+#define SI_BE_SQUARE (1<<0)
+#define SI_EDITTILE (1<<1)
+#define SI_CLIP_UV (1<<2)
+#define SI_DRAWTOOL (1<<3)
+#define SI_DEPRECATED1 (1<<4) /* stick UVs to others in the same location */
+#define SI_DRAWSHADOW (1<<5)
+#define SI_SELACTFACE (1<<6) /* deprecated */
+#define SI_DEPRECATED2 (1<<7)
+#define SI_DEPRECATED3 (1<<8) /* stick UV selection to mesh vertex (UVs wont always be touching) */
+#define SI_COORDFLOATS (1<<9)
+#define SI_PIXELSNAP (1<<10)
+#define SI_LIVE_UNWRAP (1<<11)
+#define SI_USE_ALPHA (1<<12)
+#define SI_SHOW_ALPHA (1<<13)
+#define SI_SHOW_ZBUF (1<<14)
/* next two for render window dislay */
-#define SI_PREVSPACE 1<<15
-#define SI_FULLWINDOW 1<<16
-#define SI_DEPRECATED4 1<<17
-#define SI_DEPRECATED5 1<<18
+#define SI_PREVSPACE (1<<15)
+#define SI_FULLWINDOW (1<<16)
+#define SI_DEPRECATED4 (1<<17)
+#define SI_DEPRECATED5 (1<<18)
/* this means that the image is drawn until it reaches the view edge,
* in the image view, its unrelated to the 'tile' mode for texface */
-#define SI_DRAW_TILE 1<<19
-#define SI_SMOOTH_UV 1<<20
-#define SI_DRAW_STRETCH 1<<21
-#define SI_DISPGP 1<<22
-#define SI_DRAW_OTHER 1<<23
+#define SI_DRAW_TILE (1<<19)
+#define SI_SMOOTH_UV (1<<20)
+#define SI_DRAW_STRETCH (1<<21)
+#define SI_DISPGP (1<<22)
+#define SI_DRAW_OTHER (1<<23)
-#define SI_COLOR_CORRECTION 1<<24
+#define SI_COLOR_CORRECTION (1<<24)
/* SpaceIpo->flag (Graph Editor Settings) */
/* OLD DEPRECEATED SETTING */
@@ -800,6 +802,8 @@ enum FileSortTypeE {
#define SIPO_TEMP_NEEDCHANSYNC (1<<10)
/* don't perform realtime updates */
#define SIPO_NOREALTIMEUPDATES (1<<11)
+ /* don't draw curves with AA ("beauty-draw") for performance */
+#define SIPO_BEAUTYDRAW_OFF (1<<12)
/* SpaceIpo->mode (Graph Editor Mode) */
enum {
@@ -816,6 +820,7 @@ enum {
// execution (see BPY_main.c)
#define ST_FIND_WRAP 0x0020
#define ST_FIND_ALL 0x0040
+#define ST_SHOW_MARGIN 0x0080
/* stext->findstr/replacestr */
@@ -857,12 +862,6 @@ enum {
#define B_IMASELHOME 451
#define B_IMASELREMOVEBIP 452
-#define C_BACK 0xBAAAAA
-#define C_DARK 0x665656
-#define C_DERK 0x766666
-#define C_HI 0xCBBBBB
-#define C_LO 0x544444
-
/* nla->flag */
/* flags (1<<0), (1<<1), and (1<<3) are depreceated flags from old blenders */
/* draw timing in seconds instead of frames */
@@ -882,7 +881,7 @@ enum {
/* only keyframes from active/selected channels get shown */
#define TIME_ONLYACTSEL 4
-/* time->redraws */
+/* time->redraws (now screen->redraws_flag) */
#define TIME_REGION 1
#define TIME_ALL_3D_WIN 2
#define TIME_ALL_ANIM_WIN 4
@@ -930,6 +929,7 @@ enum {
/* space types, moved from DNA_screen_types.h */
+/* Do NOT change order, append on end. types are hardcoded needed */
enum {
SPACE_EMPTY,
SPACE_VIEW3D,
diff --git a/source/blender/makesdna/DNA_text_types.h b/source/blender/makesdna/DNA_text_types.h
index d89d15fa302..f805ced5dac 100644
--- a/source/blender/makesdna/DNA_text_types.h
+++ b/source/blender/makesdna/DNA_text_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_text_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +28,11 @@
*/
#ifndef DNA_TEXT_TYPES_H
#define DNA_TEXT_TYPES_H
+/** \file DNA_text_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
#include "DNA_listBase.h"
#include "DNA_ID.h"
@@ -48,7 +51,7 @@ typedef struct TextMarker {
int lineno, start, end, pad1; /* line number and start/end character indices */
int group, flags; /* see BKE_text.h for flag defines */
- char color[4], pad[4]; /* draw color of the marker */
+ unsigned char color[4], pad[4]; /* draw color of the marker */
} TextMarker;
typedef struct Text {
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index e9e058cbbd6..572a2282d45 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_texture_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,9 +29,19 @@
#ifndef DNA_TEXTURE_TYPES_H
#define DNA_TEXTURE_TYPES_H
+/** \file DNA_texture_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
+
#include "DNA_ID.h"
#include "DNA_image_types.h" /* ImageUser */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct AnimData;
struct Ipo;
struct PluginTex;
@@ -73,9 +81,9 @@ typedef struct MTex {
float densfac, scatterfac, reflfac;
/* particles */
- float timefac, lengthfac, clumpfac;
- float kinkfac, roughfac, padensfac;
- float lifefac, sizefac, ivelfac, pvelfac;
+ float timefac, lengthfac, clumpfac, dampfac;
+ float kinkfac, roughfac, padensfac, gravityfac;
+ float lifefac, sizefac, ivelfac, fieldfac;
/* lamp */
float shadowfac;
@@ -220,7 +228,7 @@ typedef struct Tex {
float vn_mexp;
short vn_distm, vn_coltype;
- short noisedepth, noisetype;
+ short noisedepth, noisetype; /* noisedepth MUST be <= 30 else we get floating point exceptions */
/* newnoise: noisebasis type for clouds/marble/etc, noisebasis2 only used for distorted noise */
short noisebasis, noisebasis2;
@@ -450,7 +458,11 @@ typedef struct TexMapping {
#define MTEX_VIEWSPACE 16
#define MTEX_DUPLI_MAPTO 32
#define MTEX_OB_DUPLI_ORIG 64
-#define MTEX_NEW_BUMP 128
+#define MTEX_COMPAT_BUMP 128
+#define MTEX_3TAP_BUMP 256
+#define MTEX_5TAP_BUMP 512
+#define MTEX_BUMP_OBJECTSPACE 1024
+#define MTEX_BUMP_TEXTURESPACE 2048
/* blendtype */
#define MTEX_BLEND 0
@@ -548,11 +560,17 @@ typedef struct TexMapping {
#define TEX_VD_RAW_16BIT 2
#define TEX_VD_IMAGE_SEQUENCE 3
#define TEX_VD_SMOKE 4
+/* for voxels which use VoxelData->source_path */
+#define TEX_VD_IS_SOURCE_PATH(_format) (ELEM3(_format, TEX_VD_BLENDERVOXEL, TEX_VD_RAW_8BIT, TEX_VD_RAW_16BIT))
/* smoke data types */
#define TEX_VD_SMOKEDENSITY 0
#define TEX_VD_SMOKEHEAT 1
#define TEX_VD_SMOKEVEL 2
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 153b6acd525..d66f612155a 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -1,6 +1,4 @@
-/**
- * blenkernel/DNA_userdef_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,10 +29,20 @@
#ifndef DNA_USERDEF_TYPES_H
#define DNA_USERDEF_TYPES_H
+/** \file DNA_userdef_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ *
+ */
#include "DNA_listBase.h"
#include "DNA_texture_types.h" /* ColorBand */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* themes; defines in BIF_resource.h */
struct ColorBand;
@@ -45,7 +53,7 @@ struct ColorBand;
/* default uifont_id offered by Blender */
#define UIFONT_DEFAULT 0
-#define UIFONT_BITMAP 1
+/*#define UIFONT_BITMAP 1*/ /*UNUSED*/
/* free slots */
#define UIFONT_CUSTOM1 2
#define UIFONT_CUSTOM2 3
@@ -84,6 +92,7 @@ typedef struct uiFontStyle {
/* this is fed to the layout engine and widget code */
+
typedef struct uiStyle {
struct uiStyle *next, *prev;
@@ -154,13 +163,13 @@ typedef struct ThemeSpace {
/* main window colors */
char back[4];
char title[4];
- char text[4];
+ char text[4];
char text_hi[4];
/* header colors */
char header[4];
char header_title[4];
- char header_text[4];
+ char header_text[4];
char header_text_hi[4];
/* button/tool regions */
@@ -172,7 +181,7 @@ typedef struct ThemeSpace {
/* listview regions */
char list[4];
char list_title[4];
- char list_text[4];
+ char list_text[4];
char list_text_hi[4];
/* float panel */
@@ -195,6 +204,7 @@ typedef struct ThemeSpace {
char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4];
char face[4], face_select[4]; // solid faces
char face_dot[4]; // selected color
+ char extra_edge_len[4], extra_face_angle[4], extra_face_area[4], pad3[4];
char normal[4];
char vertex_normal[4];
char bone_solid[4], bone_pose[4];
@@ -347,7 +357,7 @@ typedef struct UserDef {
short tw_hotspot, tw_flag, tw_handlesize, tw_size;
short textimeout,texcollectrate;
short wmdrawmethod; /* removed wmpad */
- short pad2;
+ short dragthreshold;
int memcachelimit;
int prefetchframes;
short frameserverport;
@@ -375,6 +385,9 @@ typedef struct UserDef {
short autokey_mode; /* autokeying mode */
short autokey_flag; /* flags for autokeying */
+
+ short text_render, pad9; /*options for text rendering*/
+ float pad10;
struct ColorBand coba_weight; /* from texture.h */
@@ -399,16 +412,16 @@ extern UserDef U; /* from blenkernel blender.c */
/* flag */
#define USER_AUTOSAVE (1 << 0)
-#define USER_AUTOGRABGRID (1 << 1) /* deprecated */
-#define USER_AUTOROTGRID (1 << 2) /* deprecated */
-#define USER_AUTOSIZEGRID (1 << 3) /* deprecated */
+/*#define USER_AUTOGRABGRID (1 << 1) deprecated */
+/*#define USER_AUTOROTGRID (1 << 2) deprecated */
+/*#define USER_AUTOSIZEGRID (1 << 3) deprecated */
#define USER_SCENEGLOBAL (1 << 4)
#define USER_TRACKBALL (1 << 5)
-#define USER_DUPLILINK (1 << 6)
-#define USER_FSCOLLUM (1 << 7)
+/*#define USER_DUPLILINK (1 << 6) deprecated */
+/*#define USER_FSCOLLUM (1 << 7) deprecated */
#define USER_MAT_ON_OB (1 << 8)
/*#define USER_NO_CAPSLOCK (1 << 9)*/ /* not used anywhere */
-#define USER_VIEWMOVE (1 << 10)
+/*#define USER_VIEWMOVE (1 << 10)*/ /* not used anywhere */
#define USER_TOOLTIPS (1 << 11)
#define USER_TWOBUTTONMOUSE (1 << 12)
#define USER_NONUMPAD (1 << 13)
@@ -424,6 +437,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_FILENOUI (1 << 23)
#define USER_NONEGFRAMES (1 << 24)
#define USER_TXT_TABSTOSPACES_DISABLE (1 << 25)
+#define USER_TOOLTIPS_PYTHON (1 << 26)
/* helper macro for checking frame clamping */
#define FRAMENUMBER_MIN_CLAMP(cfra) \
@@ -445,10 +459,10 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DRAWVIEWINFO (1 << 4)
#define USER_PLAINMENUS (1 << 5) // old EVTTOCONSOLE print ghost events, here for tuhopuu compat. --phase
// old flag for hide pulldown was here
-#define USER_FLIPFULLSCREEN (1 << 7)
+/*#define USER_FLIPFULLSCREEN (1 << 7)*/ /* deprecated */
#define USER_ALLWINCODECS (1 << 8)
#define USER_MENUOPENAUTO (1 << 9)
-#define USER_PANELPINNED (1 << 10) /* deprecated */
+/*#define USER_PANELPINNED (1 << 10) deprecated */
#define USER_AUTOPERSP (1 << 11)
#define USER_LOCKAROUND (1 << 12)
#define USER_GLOBALUNDO (1 << 13)
@@ -467,6 +481,8 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_ZOOM_INVERT (1 << 25)
#define USER_ZOOM_DOLLY_HORIZ (1 << 26)
#define USER_SPLASH_DISABLE (1 << 27)
+#define USER_HIDE_RECENT (1 << 28)
+#define USER_SHOW_THUMBNAILS (1 << 29)
/* Auto-Keying mode */
/* AUTOKEY_ON is a bitflag */
@@ -483,20 +499,20 @@ extern UserDef U; /* from blenkernel blender.c */
#define AUTOKEY_FLAG_INSERTNEEDED (1<<1)
#define AUTOKEY_FLAG_AUTOMATKEY (1<<2)
#define AUTOKEY_FLAG_XYZ2RGB (1<<3)
- /* U.autokey_flag (strictly autokeying only) */
+
+/* toolsettings->autokey_flag */
#define AUTOKEY_FLAG_ONLYKEYINGSET (1<<6)
- /* toolsettings->autokey_flag */
#define ANIMRECORD_FLAG_WITHNLA (1<<10)
/* transopts */
#define USER_TR_TOOLTIPS (1 << 0)
#define USER_TR_BUTTONS (1 << 1)
#define USER_TR_MENUS (1 << 2)
-#define USER_TR_FILESELECT (1 << 3)
-#define USER_TR_TEXTEDIT (1 << 4)
+/*#define USER_TR_FILESELECT (1 << 3) deprecated*/
+/*#define USER_TR_TEXTEDIT (1 << 4) deprecated*/
#define USER_DOTRANSLATE (1 << 5)
#define USER_USETEXTUREFONT (1 << 6)
-#define CONVERT_TO_UTF8 (1 << 7)
+/*#define CONVERT_TO_UTF8 (1 << 7) deprecated*/
/* dupflag */
#define USER_DUP_MESH (1 << 0)
@@ -513,7 +529,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DUP_PSYS (1 << 11)
/* gameflags */
-#define USER_DEPRECATED_FLAG 1
+// #define USER_DEPRECATED_FLAG 1
// #define USER_DISABLE_SOUND 2 deprecated, don't use without checking for
// backwards compatibilty in do_versions!
#define USER_DISABLE_MIPMAP 4
@@ -527,6 +543,9 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_DRAW_AUTOMATIC 3
#define USER_DRAW_OVERLAP_FLIP 4
+/* text draw options*/
+#define USER_TEXT_DISABLE_AA (1 << 0)
+
/* tw_flag (transform widget) */
/* gp_settings (Grease Pencil Settings) */
@@ -561,4 +580,8 @@ extern UserDef U; /* from blenkernel blender.c */
#define TH_OLDSKOOL 3
#define TH_SHADED 4
+#ifdef __cplusplus
+}
+#endif
+
#endif
diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h
index 5d6f1039ed5..2d7804c3d1d 100644
--- a/source/blender/makesdna/DNA_vec_types.h
+++ b/source/blender/makesdna/DNA_vec_types.h
@@ -1,6 +1,4 @@
-/**
- * vec_types.h dec 2000 Nzc
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,18 +30,26 @@
#ifndef DNA_VEC_TYPES_H
#define DNA_VEC_TYPES_H
+/** \file DNA_vec_types.h
+ * \ingroup DNA
+ * \since dec-2000
+ * \author nzc
+ */
/* types */
+
+/** vector of two shorts. */
typedef struct vec2s {
short x, y;
} vec2s;
+/** vector of two floats. */
typedef struct vec2f {
float x, y;
} vec2f;
/* not used at the moment */
-#if 0
+/*
typedef struct vec2i {
int x, y;
} vec2i;
@@ -75,13 +81,15 @@ typedef struct vec4f {
typedef struct vec4d {
double x, y, z, w;
} vec4d;
-#endif
+*/
+/** integer rectangle. */
typedef struct rcti {
int xmin, xmax;
int ymin, ymax;
} rcti;
+/** float rectangle. */
typedef struct rctf {
float xmin, xmax;
float ymin, ymax;
diff --git a/source/blender/makesdna/DNA_vfont_types.h b/source/blender/makesdna/DNA_vfont_types.h
index 8a96d8574c2..ec576055b55 100644
--- a/source/blender/makesdna/DNA_vfont_types.h
+++ b/source/blender/makesdna/DNA_vfont_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_vfont_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,12 @@
#ifndef DNA_VFONT_TYPES_H
#define DNA_VFONT_TYPES_H
+/** \file DNA_vfont_types.h
+ * \ingroup DNA
+ * \since mar-2001
+ * \author nzc
+ */
+
#include "DNA_ID.h"
struct PackedFile;
@@ -46,7 +50,7 @@ typedef struct VFont {
} VFont;
/* *************** FONT ****************** */
-
+#define FO_EDIT 0
#define FO_CURS 1
#define FO_CURSUP 2
#define FO_CURSDOWN 3
@@ -55,5 +59,6 @@ typedef struct VFont {
#define FO_PAGEDOWN 9
#define FO_SELCHANGE 10
+#define FO_BUILTIN_NAME "<builtin>"
#endif
diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h
index 75ad1e644d1..ac1d3409153 100644
--- a/source/blender/makesdna/DNA_view2d_types.h
+++ b/source/blender/makesdna/DNA_view2d_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_view2d_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_VIEW2D_TYPES_H
#define DNA_VIEW2D_TYPES_H
+/** \file DNA_view2d_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_vec_types.h"
/* ---------------------------------- */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 520fc56162c..3ffef475e1b 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_view3d_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_VIEW3D_TYPES_H
#define DNA_VIEW3D_TYPES_H
+/** \file DNA_view3d_types.h
+ * \ingroup DNA
+ */
+
struct ViewDepths;
struct Object;
struct Image;
@@ -89,14 +91,16 @@ typedef struct RegionView3D {
/* transform widget matrix */
float twmat[4][4];
-
- float viewquat[4], dist, zfac; /* zfac is initgrabz() result */
- float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
- float pixsize;
- float ofs[3];
- short camzoom, viewbut;
+
+ float viewquat[4]; /* view rotation, must be kept normalized */
+ float dist; /* distance from 'ofs' along -viewinv[2] vector, where result is negative as is 'ofs' */
+ float zfac; /* initgrabz() result */
+ float camdx, camdy; /* camera view offsets, 1.0 = viewplane moves entire width/height */
+ float pixsize; /* runtime only */
+ float ofs[3]; /* view center & orbit pivot, negative of worldspace location */
+ short camzoom;
short twdrawflag;
- short pad;
+ int pad;
short rflag, viewlock;
short persp;
@@ -120,7 +124,7 @@ typedef struct RegionView3D {
/* last view */
float lviewquat[4];
- short lpersp, lview;
+ short lpersp, lview; /* lpersp can never be set to 'RV3D_CAMOB' */
float gridview;
float twangle[3];
@@ -139,7 +143,7 @@ typedef struct View3D {
float viewquat[4], dist, pad1; /* XXX depricated */
- int lay_used; /* used while drawing */
+ unsigned int lay_used; /* used while drawing */
short persp; /* XXX depricated */
short view; /* XXX depricated */
@@ -153,13 +157,14 @@ typedef struct View3D {
char ob_centre_bone[32]; /* optional string for armature bone to define center */
- int lay, layact;
+ unsigned int lay;
+ int layact;
/**
* The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
* OB_SHADED or OB_TEXTURE */
short drawtype;
- short pad2;
+ short ob_centre_cursor; /* optional bool for 3d cursor to define center */
short scenelock, around, pad3;
short flag, flag2;
@@ -167,7 +172,7 @@ typedef struct View3D {
float lens, grid;
float gridview; /* XXX deprecated, now in RegionView3D */
- float padf, near, far;
+ float near, far;
float ofs[3]; /* XXX deprecated */
float cursor[3];
@@ -181,9 +186,6 @@ typedef struct View3D {
short twtype, twmode, twflag;
short twdrawflag; /* XXX deprecated */
- /* customdata flags from modes */
- unsigned int customdata_mask;
-
/* afterdraw, for xray & transparent */
struct ListBase afterdraw_transp;
struct ListBase afterdraw_xray;
@@ -202,20 +204,13 @@ typedef struct View3D {
} View3D;
-/* XXX this needs cleaning */
/* View3D->flag (short) */
-#define V3D_MODE (16+32+64+128+256+512)
-#define V3D_DISPIMAGE 1
+/*#define V3D_DISPIMAGE 1*/ /*UNUSED*/
#define V3D_DISPBGPICS 2
#define V3D_HIDE_HELPLINES 4
#define V3D_INVALID_BACKBUF 8
-#define V3D_EDITMODE 16
-#define V3D_VERTEXPAINT 32
-#define V3D_FACESELECT 64
-#define V3D_POSEMODE 128
-#define V3D_TEXTUREPAINT 256
-#define V3D_WEIGHTPAINT 512
+
#define V3D_ALIGN 1024
#define V3D_SELECT_OUTLINE 2048
#define V3D_ZBUF_SELECT 4096
@@ -228,7 +223,6 @@ typedef struct View3D {
#define RV3D_CAMOB 2
/* RegionView3d->rflag */
-#define RV3D_FLYMODE 2
#define RV3D_CLIPPING 4
#define RV3D_NAVIGATING 8
#define RV3D_GPULIGHT_UPDATE 16
@@ -293,12 +287,15 @@ typedef struct View3D {
/* USE = user setting, DRAW = based on selection */
#define V3D_USE_MANIPULATOR 1
#define V3D_DRAW_MANIPULATOR 2
-#define V3D_CALC_MANIPULATOR 4
+/* #define V3D_CALC_MANIPULATOR 4 */ /*UNUSED*/
/* BGPic->flag */
/* may want to use 1 for select ?*/
#define V3D_BGPIC_EXPANDED 2
+#define RV3D_CAMZOOM_MIN -30
+#define RV3D_CAMZOOM_MAX 600
+
#endif
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 07aef5a5328..1325272d94f 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,10 @@
#ifndef DNA_WINDOWMANAGER_TYPES_H
#define DNA_WINDOWMANAGER_TYPES_H
+/** \file DNA_windowmanager_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
@@ -81,16 +85,20 @@ typedef enum ReportType {
enum ReportListFlags {
RPT_PRINT = 1,
RPT_STORE = 2,
- RPT_FREE = 4,
+ RPT_FREE = 4
};
+#
+#
typedef struct Report {
struct Report *next, *prev;
short type; /* ReportType */
short flag;
int len; /* strlen(message), saves some time calculating the word wrap */
- char *typestr;
- char *message;
+ const char *typestr;
+ const char *message;
} Report;
+
+/* saved in the wm, dont remove */
typedef struct ReportList {
ListBase list;
int printlevel; /* ReportType */
@@ -100,6 +108,8 @@ typedef struct ReportList {
} ReportList;
/* timer customdata to control reports display */
+#
+#
typedef struct ReportTimerInfo {
float col[3];
float greyscale;
@@ -140,8 +150,8 @@ typedef struct wmWindowManager {
} wmWindowManager;
/* wmWindowManager.initialized */
-#define WM_INIT_WINDOW 1<<0
-#define WM_INIT_KEYMAP 1<<1
+#define WM_INIT_WINDOW (1<<0)
+#define WM_INIT_KEYMAP (1<<1)
/* the savable part, rest of data is local in ghostwinlay */
typedef struct wmWindow {
@@ -163,9 +173,10 @@ typedef struct wmWindow {
short monitor; /* multiscreen... no idea how to store yet */
short active; /* set to 1 if an active window, for quick rejects */
short cursor; /* current mouse cursor type */
- short lastcursor; /* for temp waitcursor */
+ short lastcursor; /* previous cursor when setting modal one */
+ short modalcursor; /* the current modal cursor */
short addmousemove; /* internal: tag this for extra mousemove event, makes cursors/buttons active on UI switching */
- short pad2[2];
+ short pad2;
struct wmEvent *eventstate; /* storage for event system */
@@ -223,7 +234,7 @@ typedef struct wmKeyMapItem {
/* runtime */
short maptype; /* keymap editor */
- short id; /* unique identifier */
+ short id; /* unique identifier. Positive for kmi that override builtins, negative otherwise */
short pad;
struct PointerRNA *ptr; /* rna pointer to access properties */
} wmKeyMapItem;
@@ -308,7 +319,7 @@ typedef struct wmOperator {
typedef enum wmRadialControlMode {
WM_RADIALCONTROL_SIZE,
WM_RADIALCONTROL_STRENGTH,
- WM_RADIALCONTROL_ANGLE,
+ WM_RADIALCONTROL_ANGLE
} wmRadialControlMode;
#endif /* DNA_WINDOWMANAGER_TYPES_H */
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 42c80f4b8b5..71d907f1c12 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -1,6 +1,4 @@
-/**
- * blenlib/DNA_world_types.h (mar-2001 nzc)
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +29,10 @@
#ifndef DNA_WORLD_TYPES_H
#define DNA_WORLD_TYPES_H
+/** \file DNA_world_types.h
+ * \ingroup DNA
+ */
+
#include "DNA_ID.h"
struct AnimData;
@@ -140,7 +142,7 @@ typedef struct World {
/* mode */
#define WO_MIST 1
#define WO_STARS 2
-#define WO_DOF 4
+/*#define WO_DOF 4*/
#define WO_ACTIVITY_CULLING 8
#define WO_ENV_LIGHT 16
#define WO_DBVT_CULLING 32
diff --git a/source/blender/makesdna/Makefile b/source/blender/makesdna/Makefile
deleted file mode 100644
index f83a6288e8d..00000000000
--- a/source/blender/makesdna/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-# This module does not build normal .o's, but a DNA.c file, to be
-# compiled with the rest of the sources. To speed things up a little,
-# the compilation is done here.
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/makesdna
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/makesdna/intern/CMakeLists.txt b/source/blender/makesdna/intern/CMakeLists.txt
index 0eb42373d6d..bb95e2c0fbc 100644
--- a/source/blender/makesdna/intern/CMakeLists.txt
+++ b/source/blender/makesdna/intern/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,22 +25,45 @@
#
# ***** END GPL LICENSE BLOCK *****
-INCLUDE_DIRECTORIES(../../../../intern/guardedalloc ..)
-FILE(GLOB INC_FILES ../*.h)
+# message(STATUS "Configuring makesdna")
+
+blender_include_dirs(
+ ../../../../intern/guardedalloc
+ ../../blenloader
+ ..
+)
# Build makesdna executable
-SET(SRC makesdna.c ../../../../intern/guardedalloc/intern/mallocn.c ../../../../intern/guardedalloc/intern/mmap_win.c)
-ADD_EXECUTABLE(makesdna ${SRC} ${INC_FILES})
+set(SRC
+ makesdna.c
+ ../../../../intern/guardedalloc/intern/mallocn.c
+)
+
+if(WIN32 AND NOT UNIX)
+ list(APPEND SRC
+ ../../../../intern/guardedalloc/intern/mmap_win.c
+ )
+endif()
+
+# SRC_DNA_INC is defined in the parent dir
+
+add_executable(makesdna ${SRC} ${SRC_DNA_INC})
# Output dna.c
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/
DEPENDS makesdna
)
# Build bf_dna library
-SET(SRC dna_genfile.c dna.c)
-BLENDERLIB(bf_dna "${SRC}" "${INC}")
+set(INC
+)
+
+set(SRC
+ dna_genfile.c
+ dna.c
+ ${SRC_DNA_INC}
+)
-MESSAGE(STATUS "Configuring makesdna")
+blender_add_lib(bf_dna "${SRC}" "${INC}")
diff --git a/source/blender/makesdna/intern/Makefile b/source/blender/makesdna/intern/Makefile
deleted file mode 100644
index 55b0c42acda..00000000000
--- a/source/blender/makesdna/intern/Makefile
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dna
-DIR = $(OCGDIR)/blender/makesdna
-CSRCS = DNA.c $(wildcard dna_*.c)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I..
-
-ifeq ($(OS),windows)
- # Windows needs these extra libs because of winstuff... It is not
- # _really_ needed, but it is the easiest fix for now. If you have
- # some spare time, try to trace down the exact dep. Then again, you
- # could also spend that time making the sdna system more robust.
- ifneq ($(FREE_WINDOWS),true)
- WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
- WINLIBS += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
- WINLIBS += winmm.lib opengl32.lib glu32.lib largeint.lib
- WINLIBS += /link /nodefaultlib:libc
- else
- LDFLAGS += -mwindows -mno-cygwin
- endif
-endif
-
-ifeq ($(OS), darwin)
- LDFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
-endif
-
-clean::
- @$(RM) $(DIR)/makesdna* $(DIR)/DNA.c
- @$(RM) $(DIR)/debug/makesdna* $(DIR)/debug/DNA.c
-
-# TODO include right .mk for ldflags
-
-# A small note: we do not use the debug version of the alloc lib. That
-# is done quite intentionally. If there is a bug in that lib, it needs
-# to be fixed by the module maintainer.
-DNAOBJS = $(filter-out %DNA.o, $(OBJS))
-
-$(DIR)/$(DEBUG_DIR)makesdna: $(DNAOBJS) $(DIR)/$(DEBUG_DIR)makesdna.o $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
- $(CC) $(LDFLAGS) -o $@ $^
-
-$(DIR)/$(DEBUG_DIR)DNA.c: $(DIR)/$(DEBUG_DIR)makesdna
- ifeq ($(OS),windows)
- $(SRCHOME)/tools/cygwin/cl_wrapper.pl - $(DIR)/$(DEBUG_DIR)makesdna \
- $(DIR)/$(DEBUG_DIR)DNA.c
- else
- $(DIR)/$(DEBUG_DIR)makesdna $(DIR)/$(DEBUG_DIR)DNA.c
- endif
-
-$(DIR)/$(DEBUG_DIR)makesdna.o: makesdna.c $(wildcard ../*.h)
- $(CC) -c $(CFLAGS) $(CPPFLAGS) makesdna.c -o $@
-
diff --git a/source/blender/makesdna/intern/SConscript b/source/blender/makesdna/intern/SConscript
index ac897eaed14..23a71ae104e 100644
--- a/source/blender/makesdna/intern/SConscript
+++ b/source/blender/makesdna/intern/SConscript
@@ -3,7 +3,7 @@ import sys
import os
def normpath(path):
- return os.path.abspath(os.path.normpath(path))
+ return os.path.abspath(os.path.normpath(path))
Import ('env')
cflags = ''
@@ -18,21 +18,25 @@ dna = env.Clone()
makesdna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesdna/\\"" ')
makesdna_tool.Append (CPPPATH = ['#/intern/guardedalloc',
+<<<<<<< .working
'../../makesdna', '../', '../../bmesh'])
+=======
+ '../../makesdna', '../../blenloader'])
+>>>>>>> .merge-right.r35190
if env['OURPLATFORM'] == 'linuxcross':
- USE_WINE = True # when cross compiling on linux 64bit this is useful
+ USE_WINE = True # when cross compiling on linux 64bit this is useful
else:
- USE_WINE = False
+ USE_WINE = False
if not USE_WINE:
- if env['OURPLATFORM'] == 'linuxcross':
- makesdna_tool.Replace(CC='gcc')
- makesdna_tool.Replace(AR='ar')
- makesdna_tool.Replace(LINK='gcc')
+ if env['OURPLATFORM'] == 'linuxcross':
+ makesdna_tool.Replace(CC='gcc')
+ makesdna_tool.Replace(AR='ar')
+ makesdna_tool.Replace(LINK='gcc')
if sys.platform != 'cygwin':
- makesdna_tool.Append (CCFLAGS = cflags)
+ makesdna_tool.Append (CCFLAGS = cflags)
makesdna_tool.Append (CPPDEFINES = defines)
makesdna_tool.Append( CFLAGS = env['CFLAGS'])
makesdna_tool.Append( CCFLAGS = env['CCFLAGS'])
@@ -40,15 +44,15 @@ makesdna_tool.Append( LINKFLAGS = env['PLATFORM_LINKFLAGS'])
targetdir = normpath(root_build_dir+'/lib')
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
- targetdir = '#'+targetdir
+ targetdir = '#'+targetdir
makesdna_tool.Append (LIBPATH = targetdir)
if env['BF_PROFILE']:
- makesdna_tool.Append (LINKFLAGS = env['BF_PROFILE_LINKFLAGS'])
+ makesdna_tool.Append (LINKFLAGS = env['BF_PROFILE_LINKFLAGS'])
targetdir = normpath(root_build_dir + '/makesdna')
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
- targetdir = '#' + targetdir
+ targetdir = '#' + targetdir
#root_build_dir = "#"
makesdna = makesdna_tool.Program (target = targetdir, source = source_files, LIBS=['bf_intern_guardedalloc', 'bf_blenlib'])
@@ -60,11 +64,12 @@ dna.Depends ('dna.c', header_files)
ap = os.path.abspath
if env['OURPLATFORM'] != 'linuxcross':
- if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
- dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
- else:
- dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
+ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
+ dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
+ else:
+ dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
else:
+<<<<<<< .working
if USE_WINE:
dna.Command ('dna.c', '', 'wine ' + ap(root_build_dir+os.sep+"makesdna $TARGET"))
else:
@@ -72,6 +77,12 @@ else:
dna.Command ('dna.c', '', "\"" + root_build_dir+os.sep+"makesdna\" $TARGET")
else:
dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna $TARGET")
+=======
+ if USE_WINE:
+ dna.Command ('dna.c', '', 'wine ' + root_build_dir+os.sep+"makesdna $TARGET")
+ else:
+ dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna.exe $TARGET")
+>>>>>>> .merge-right.r35190
obj = ['intern/dna.c', 'intern/dna_genfile.c']
Return ('obj')
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index fd98fd4ef08..3b6aafaffa0 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -31,6 +31,11 @@
* DNA handling
*/
+/** \file blender/makesdna/intern/dna_genfile.c
+ * \ingroup DNA
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -43,7 +48,7 @@
/* gcc 4.1 on mingw was complaining that __int64 was already defined
actually is saw the line below as typedef long long long long...
-Anyhow, since its already defined, its safe to do an ifndef here- Cambpell*/
+Anyhow, since its already defined, its safe to do an ifndef here- Campbell */
#ifdef FREE_WINDOWS
#ifndef __int64
typedef long long __int64;
@@ -196,7 +201,7 @@ void DNA_sdna_free(SDNA *sdna)
MEM_freeN(sdna);
}
-static int ispointer(char *name)
+static int ispointer(const char *name)
{
/* check if pointer or function pointer */
return (name[0]=='*' || (name[0]=='(' && name[1]=='*'));
@@ -206,7 +211,7 @@ static int elementsize(SDNA *sdna, short type, short name)
/* call with numbers from struct-array */
{
int mul, namelen, len;
- char *cp;
+ const char *cp;
cp= sdna->names[name];
len= 0;
@@ -251,7 +256,7 @@ static void printstruct(SDNA *sdna, short strnr)
}
#endif
-static short *findstruct_name(SDNA *sdna, char *str)
+static short *findstruct_name(SDNA *sdna, const char *str)
{
int a;
short *sp=0;
@@ -502,7 +507,7 @@ static void recurs_test_compflags(SDNA *sdna, char *compflags, int structnr)
{
int a, b, typenr, elems;
short *sp;
- char *cp;
+ const char *cp;
/* check all structs, test if it's inside another struct */
sp= sdna->structs[structnr];
@@ -546,7 +551,7 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
*/
int a, b;
short *spold, *spcur;
- char *str1, *str2;
+ const char *str1, *str2;
char *compflags;
if(sdna->nr_structs==0) {
@@ -627,7 +632,7 @@ char *DNA_struct_get_compareflags(SDNA *sdna, SDNA *newsdna)
return compflags;
}
-static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char *olddata)
+static void cast_elem(char *ctype, char *otype, const char *name, char *curdata, char *olddata)
{
double val = 0.0;
int arrlen, curlen=1, oldlen=1, ctypenr, otypenr;
@@ -721,7 +726,7 @@ static void cast_elem(char *ctype, char *otype, char *name, char *curdata, char
}
}
-static void cast_pointer(int curlen, int oldlen, char *name, char *curdata, char *olddata)
+static void cast_pointer(int curlen, int oldlen, const char *name, char *curdata, char *olddata)
{
#ifdef WIN32
__int64 lval;
@@ -764,7 +769,7 @@ static void cast_pointer(int curlen, int oldlen, char *name, char *curdata, char
}
}
-static int elem_strcmp(char *name, char *oname)
+static int elem_strcmp(const char *name, const char *oname)
{
int a=0;
@@ -780,10 +785,10 @@ static int elem_strcmp(char *name, char *oname)
return 0;
}
-static char *find_elem(SDNA *sdna, char *type, char *name, short *old, char *olddata, short **sppo)
+static char *find_elem(SDNA *sdna, const char *type, const char *name, short *old, char *olddata, short **sppo)
{
int a, elemcount, len;
- char *otype, *oname;
+ const char *otype, *oname;
/* without arraypart, so names can differ: return old namenr and type */
@@ -811,7 +816,7 @@ static char *find_elem(SDNA *sdna, char *type, char *name, short *old, char *old
return 0;
}
-static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *name, char *curdata, short *old, char *olddata)
+static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, const char *name, char *curdata, short *old, char *olddata)
{
/* rules: test for NAME:
- name equal:
@@ -823,7 +828,8 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *nam
can I force this?)
*/
int a, elemcount, len, array, oldsize, cursize, mul;
- char *otype, *oname, *cp;
+ char *otype;
+ const char *oname, *cp;
/* is 'name' an array? */
cp= name;
@@ -868,6 +874,10 @@ static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, char *nam
mul= len/oldsize;
mul*= (cursize < oldsize)? cursize: oldsize;
memcpy(curdata, olddata, mul);
+
+ /* terminate strings */
+ if(oldsize > cursize && strcmp(type, "char")==0)
+ curdata[mul-1]= 0;
}
else {
if(cursize>oldsize) cast_elem(type, otype, oname, curdata, olddata);
@@ -888,7 +898,8 @@ static void reconstruct_struct(SDNA *newsdna, SDNA *oldsdna, char *compflags, in
*/
int a, elemcount, elen, eleno, mul, mulo, firststructtypenr;
short *spo, *spc, *sppo;
- char *name, *nameo, *type, *cpo, *cpc;
+ char *type, *cpo, *cpc;
+ const char *name, *nameo;
if(oldSDNAnr== -1) return;
if(curSDNAnr== -1) return;
@@ -965,7 +976,8 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
*/
int a, mul, elemcount, elen, elena, firststructtypenr;
short *spo, *spc, skip;
- char *name, *type, *cpo, *cur, cval;
+ char *type, *cpo, *cur, cval;
+ const char *name;
if(oldSDNAnr== -1) return;
firststructtypenr= *(oldsdna->structs[0]);
@@ -1095,7 +1107,7 @@ void *DNA_struct_reconstruct(SDNA *newsdna, SDNA *oldsdna, char *compflags, int
return cur;
}
-int DNA_elem_offset(SDNA *sdna, char *stype, char *vartype, char *name)
+int DNA_elem_offset(SDNA *sdna, const char *stype, const char *vartype, const char *name)
{
int SDNAnr= DNA_struct_find_nr(sdna, stype);
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 7a2d659755a..711d7a08687 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,13 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file makesdna.c
+ * \brief Struct muncher for making SDNA.
+ * \ingroup DNA
*
- * Struct muncher for making SDNA
- *
+ * \section aboutmakesdnac About makesdna tool
* Originally by Ton, some mods by Frank, and some cleaning and
* extension by Nzc.
*
@@ -42,7 +46,7 @@
* and the offsets for reaching a particular one.
*
* There is a facility to get verbose output from sdna. Search for
- * debugSDNA. This int can be set to 0 (no output) to some int. Higher
+ * \ref debugSDNA. This int can be set to 0 (no output) to some int. Higher
* numbers give more output.
* */
@@ -62,7 +66,7 @@
/* Included the path relative from /source/blender/ here, so we can move */
/* headers around with more freedom. */
-char *includefiles[] = {
+const char *includefiles[] = {
// if you add files here, please add them at the end
// of makesdna.c (this file) as well
@@ -145,7 +149,8 @@ short **structs, *structdata; /* at sp= structs[a] is the first address of a str
sp[0] is type number
sp[1] is amount of elements
sp[2] sp[3] is typenr, namenr (etc) */
-/*
+/**
+ * Variable to control debug output of makesdna.
* debugSDNA:
* - 0 = no output, except errors
* - 1 = detail actions
@@ -160,12 +165,15 @@ int additional_slen_offset;
/* ************************************************************************** */
/**
- * Add type <str> to struct indexed by <len>, if it was not yet found.
+ * Add type \c str to struct indexed by \c len, if it was not yet found.
+ * \param str char
+ * \param len int
*/
-int add_type(char *str, int len);
+int add_type(const char *str, int len);
/**
- * Add variable <str> to
+ * Add variable \c str to
+ * \param str
*/
int add_name(char *str);
@@ -214,7 +222,7 @@ void printStructLenghts(void);
/* ************************* MAKEN DNA ********************** */
-int add_type(char *str, int len)
+int add_type(const char *str, int len)
{
int nr;
char *cp;
@@ -244,7 +252,7 @@ int add_type(char *str, int len)
if(nr_types>=maxnr) {
printf("too many types\n");
- return nr_types-1;;
+ return nr_types-1;
}
nr_types++;
@@ -269,7 +277,7 @@ int add_name(char *str)
additional_slen_offset = 0;
- if((str[0]==0) /* || (str[1]==0) */) return -1;
+ if(str[0]==0 /* || (str[1]==0) */) return -1;
if (str[0] == '(' && str[1] == '*') {
/* we handle function pointer and special array cases here, e.g.
@@ -281,7 +289,6 @@ int add_name(char *str)
if (debugSDNA > 3) printf("\t\t\t\t*** Function pointer or multidim array pointer found\n");
/* functionpointer: transform the type (sometimes) */
i = 0;
- j = 0;
while (str[i] != ')') {
buf[i] = str[i];
@@ -421,7 +428,11 @@ int preprocess_include(char *maindata, int len)
int a, newlen, comment = 0;
char *cp, *temp, *md;
- temp= MEM_mallocN(len, "preprocess_include");
+ /* note: len + 1, last character is a dummy to prevent
+ * comparisons using uninitialized memory */
+ temp= MEM_mallocN(len + 1, "preprocess_include");
+ temp[len]= ' ';
+
memcpy(temp, maindata, len);
// remove all c++ comments
@@ -1056,6 +1067,7 @@ int make_structDNA(char *baseDirectory, FILE *file)
MEM_freeN(names);
MEM_freeN(types);
MEM_freeN(typelens);
+ MEM_freeN(alphalens);
MEM_freeN(structs);
if (debugSDNA > -1) printf("done.\n");
diff --git a/source/blender/makesrna/CMakeLists.txt b/source/blender/makesrna/CMakeLists.txt
index ec48240bfc5..540597da578 100644
--- a/source/blender/makesrna/CMakeLists.txt
+++ b/source/blender/makesrna/CMakeLists.txt
@@ -24,4 +24,4 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(intern)
+add_subdirectory(intern)
diff --git a/source/blender/makesrna/Makefile b/source/blender/makesrna/Makefile
deleted file mode 100644
index 2b025949d77..00000000000
--- a/source/blender/makesrna/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Contributor(s): Blender Foundation (2008).
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# This module does not build normal .o's, but a RNA.c file, to be
-# compiled with the rest of the sources.
-#
-
-SOURCEDIR = source/blender/makesrna
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index e454dda0ae6..f02ea29d5e2 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,8 +22,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_ACCESS
-#define RNA_ACCESS
+#ifndef RNA_ACCESS_H
+#define RNA_ACCESS_H
+
+/** \file RNA_access.h
+ * \ingroup RNA
+ */
#include <stdarg.h>
@@ -43,7 +47,6 @@ struct Scene;
/* Types */
extern BlenderRNA BLENDER_RNA;
-
extern StructRNA RNA_Action;
extern StructRNA RNA_ActionConstraint;
extern StructRNA RNA_ActionGroup;
@@ -66,8 +69,9 @@ extern StructRNA RNA_ArrayModifier;
extern StructRNA RNA_BackgroundImage;
extern StructRNA RNA_BevelModifier;
extern StructRNA RNA_BezierSplinePoint;
-extern StructRNA RNA_BlenderRNA;
+extern StructRNA RNA_BlendData;
extern StructRNA RNA_BlendTexture;
+extern StructRNA RNA_BlenderRNA;
extern StructRNA RNA_BoidRule;
extern StructRNA RNA_BoidRuleAverageSpeed;
extern StructRNA RNA_BoidRuleAvoid;
@@ -157,6 +161,7 @@ extern StructRNA RNA_CompositorNodeTexture;
extern StructRNA RNA_CompositorNodeTime;
extern StructRNA RNA_CompositorNodeTonemap;
extern StructRNA RNA_CompositorNodeTranslate;
+extern StructRNA RNA_CompositorNodeTree;
extern StructRNA RNA_CompositorNodeValToRGB;
extern StructRNA RNA_CompositorNodeValue;
extern StructRNA RNA_CompositorNodeVecBlur;
@@ -174,8 +179,8 @@ extern StructRNA RNA_CopyScaleConstraint;
extern StructRNA RNA_CopyTransformsConstraint;
extern StructRNA RNA_Curve;
extern StructRNA RNA_CurveMap;
-extern StructRNA RNA_CurveMapping;
extern StructRNA RNA_CurveMapPoint;
+extern StructRNA RNA_CurveMapping;
extern StructRNA RNA_CurveModifier;
extern StructRNA RNA_CurvePoint;
extern StructRNA RNA_DampedTrackConstraint;
@@ -190,8 +195,8 @@ extern StructRNA RNA_DriverVariable;
extern StructRNA RNA_DupliObject;
extern StructRNA RNA_EdgeSplitModifier;
extern StructRNA RNA_EditBone;
-extern StructRNA RNA_EffectorWeights;
extern StructRNA RNA_EffectSequence;
+extern StructRNA RNA_EffectorWeights;
extern StructRNA RNA_EnumProperty;
extern StructRNA RNA_EnumPropertyItem;
extern StructRNA RNA_EnvironmentMap;
@@ -201,13 +206,6 @@ extern StructRNA RNA_ExplodeModifier;
extern StructRNA RNA_ExpressionController;
extern StructRNA RNA_FCurve;
extern StructRNA RNA_FCurveSample;
-extern StructRNA RNA_FieldSettings;
-extern StructRNA RNA_FileSelectParams;
-extern StructRNA RNA_FloatProperty;
-extern StructRNA RNA_FloorConstraint;
-extern StructRNA RNA_FluidFluidSettings;
-extern StructRNA RNA_FluidSettings;
-extern StructRNA RNA_FluidSimulationModifier;
extern StructRNA RNA_FModifier;
extern StructRNA RNA_FModifierCycles;
extern StructRNA RNA_FModifierEnvelope;
@@ -218,8 +216,19 @@ extern StructRNA RNA_FModifierLimits;
extern StructRNA RNA_FModifierNoise;
extern StructRNA RNA_FModifierPython;
extern StructRNA RNA_FModifierStepped;
+extern StructRNA RNA_FieldSettings;
+extern StructRNA RNA_FileSelectParams;
+extern StructRNA RNA_FloatProperty;
+extern StructRNA RNA_FloorConstraint;
+extern StructRNA RNA_FluidFluidSettings;
+extern StructRNA RNA_FluidSettings;
+extern StructRNA RNA_FluidSimulationModifier;
extern StructRNA RNA_FollowPathConstraint;
extern StructRNA RNA_Function;
+extern StructRNA RNA_GPencilFrame;
+extern StructRNA RNA_GPencilLayer;
+extern StructRNA RNA_GPencilStroke;
+extern StructRNA RNA_GPencilStrokePoint;
extern StructRNA RNA_GameBooleanProperty;
extern StructRNA RNA_GameFloatProperty;
extern StructRNA RNA_GameIntProperty;
@@ -229,10 +238,6 @@ extern StructRNA RNA_GameSoftBodySettings;
extern StructRNA RNA_GameStringProperty;
extern StructRNA RNA_GameTimerProperty;
extern StructRNA RNA_GlowSequence;
-extern StructRNA RNA_GPencilFrame;
-extern StructRNA RNA_GPencilLayer;
-extern StructRNA RNA_GPencilStroke;
-extern StructRNA RNA_GPencilStrokePoint;
extern StructRNA RNA_GreasePencil;
extern StructRNA RNA_Group;
extern StructRNA RNA_Header;
@@ -240,8 +245,6 @@ extern StructRNA RNA_HemiLamp;
extern StructRNA RNA_Histogram;
extern StructRNA RNA_HookModifier;
extern StructRNA RNA_ID;
-extern StructRNA RNA_IDProperty;
-extern StructRNA RNA_IDPropertyGroup;
extern StructRNA RNA_IKParam;
extern StructRNA RNA_Image;
extern StructRNA RNA_ImagePaint;
@@ -253,14 +256,14 @@ extern StructRNA RNA_IntProperty;
extern StructRNA RNA_Itasc;
extern StructRNA RNA_JoystickSensor;
extern StructRNA RNA_Key;
-extern StructRNA RNA_KeyboardSensor;
extern StructRNA RNA_KeyConfig;
+extern StructRNA RNA_KeyMap;
+extern StructRNA RNA_KeyMapItem;
+extern StructRNA RNA_KeyboardSensor;
extern StructRNA RNA_Keyframe;
extern StructRNA RNA_KeyingSet;
-extern StructRNA RNA_KeyingSetPath;
extern StructRNA RNA_KeyingSetInfo;
-extern StructRNA RNA_KeyMap;
-extern StructRNA RNA_KeyMapItem;
+extern StructRNA RNA_KeyingSetPath;
extern StructRNA RNA_KinematicConstraint;
extern StructRNA RNA_Lamp;
extern StructRNA RNA_LampSkySettings;
@@ -276,7 +279,6 @@ extern StructRNA RNA_LimitScaleConstraint;
extern StructRNA RNA_LockedTrackConstraint;
extern StructRNA RNA_Macro;
extern StructRNA RNA_MagicTexture;
-extern StructRNA RNA_BlendData;
extern StructRNA RNA_MarbleTexture;
extern StructRNA RNA_MaskModifier;
extern StructRNA RNA_Material;
@@ -325,6 +327,7 @@ extern StructRNA RNA_NlaStrip;
extern StructRNA RNA_NlaTrack;
extern StructRNA RNA_Node;
extern StructRNA RNA_NodeGroup;
+extern StructRNA RNA_NodeLink;
extern StructRNA RNA_NodeSocket;
extern StructRNA RNA_NodeTree;
extern StructRNA RNA_NoiseTexture;
@@ -352,7 +355,7 @@ extern StructRNA RNA_ParticleHairKey;
extern StructRNA RNA_ParticleInstanceModifier;
extern StructRNA RNA_ParticleKey;
extern StructRNA RNA_ParticleSettings;
-extern StructRNA RNA_SPHFluidSettings;
+extern StructRNA RNA_ParticleSettingsTextureSlot;
extern StructRNA RNA_ParticleSystem;
extern StructRNA RNA_ParticleSystemModifier;
extern StructRNA RNA_ParticleTarget;
@@ -362,14 +365,17 @@ extern StructRNA RNA_PluginTexture;
extern StructRNA RNA_PointCache;
extern StructRNA RNA_PointDensity;
extern StructRNA RNA_PointDensityTexture;
-extern StructRNA RNA_PointerProperty;
extern StructRNA RNA_PointLamp;
+extern StructRNA RNA_PointerProperty;
extern StructRNA RNA_Pose;
extern StructRNA RNA_PoseBone;
extern StructRNA RNA_Property;
+extern StructRNA RNA_PropertyGroup;
+extern StructRNA RNA_PropertyGroupItem;
extern StructRNA RNA_PropertySensor;
extern StructRNA RNA_PythonConstraint;
extern StructRNA RNA_PythonController;
+extern StructRNA RNA_RGBANodeSocket;
extern StructRNA RNA_RadarSensor;
extern StructRNA RNA_RandomSensor;
extern StructRNA RNA_RaySensor;
@@ -379,8 +385,8 @@ extern StructRNA RNA_RenderLayer;
extern StructRNA RNA_RenderPass;
extern StructRNA RNA_RenderResult;
extern StructRNA RNA_RenderSettings;
-extern StructRNA RNA_RGBANodeSocket;
extern StructRNA RNA_RigidBodyJointConstraint;
+extern StructRNA RNA_SPHFluidSettings;
extern StructRNA RNA_Scene;
extern StructRNA RNA_SceneGameData;
extern StructRNA RNA_SceneRenderLayer;
@@ -416,6 +422,7 @@ extern StructRNA RNA_ShaderNodeRGBToBW;
extern StructRNA RNA_ShaderNodeSeparateRGB;
extern StructRNA RNA_ShaderNodeSqueeze;
extern StructRNA RNA_ShaderNodeTexture;
+extern StructRNA RNA_ShaderNodeTree;
extern StructRNA RNA_ShaderNodeValToRGB;
extern StructRNA RNA_ShaderNodeValue;
extern StructRNA RNA_ShaderNodeVectorCurve;
@@ -438,7 +445,6 @@ extern StructRNA RNA_SolidifyModifier;
extern StructRNA RNA_Sound;
extern StructRNA RNA_SoundSequence;
extern StructRNA RNA_Space;
-extern StructRNA RNA_SpaceView3D;
extern StructRNA RNA_SpaceConsole;
extern StructRNA RNA_SpaceDopeSheetEditor;
extern StructRNA RNA_SpaceFileBrowser;
@@ -453,8 +459,9 @@ extern StructRNA RNA_SpaceProperties;
extern StructRNA RNA_SpaceSequenceEditor;
extern StructRNA RNA_SpaceTextEditor;
extern StructRNA RNA_SpaceTimeline;
-extern StructRNA RNA_SpaceUserPreferences;
extern StructRNA RNA_SpaceUVEditor;
+extern StructRNA RNA_SpaceUserPreferences;
+extern StructRNA RNA_SpaceView3D;
extern StructRNA RNA_SpeedControlSequence;
extern StructRNA RNA_Spline;
extern StructRNA RNA_SplineIKConstraint;
@@ -495,6 +502,7 @@ extern StructRNA RNA_TextureNodeRotate;
extern StructRNA RNA_TextureNodeScale;
extern StructRNA RNA_TextureNodeTexture;
extern StructRNA RNA_TextureNodeTranslate;
+extern StructRNA RNA_TextureNodeTree;
extern StructRNA RNA_TextureNodeValToNor;
extern StructRNA RNA_TextureNodeValToRGB;
extern StructRNA RNA_TextureNodeViewer;
@@ -531,6 +539,8 @@ extern StructRNA RNA_TransformConstraint;
extern StructRNA RNA_TransformSequence;
extern StructRNA RNA_UILayout;
extern StructRNA RNA_UIListItem;
+extern StructRNA RNA_UVProjectModifier;
+extern StructRNA RNA_UVProjector;
extern StructRNA RNA_UnitSettings;
extern StructRNA RNA_UnknownType;
extern StructRNA RNA_UserPreferences;
@@ -539,8 +549,6 @@ extern StructRNA RNA_UserPreferencesFilePaths;
extern StructRNA RNA_UserPreferencesSystem;
extern StructRNA RNA_UserPreferencesView;
extern StructRNA RNA_UserSolidLight;
-extern StructRNA RNA_UVProjectModifier;
-extern StructRNA RNA_UVProjector;
extern StructRNA RNA_ValueNodeSocket;
extern StructRNA RNA_VectorFont;
extern StructRNA RNA_VectorNodeSocket;
@@ -582,7 +590,7 @@ void RNA_pointer_create(struct ID *id, StructRNA *type, void *data, PointerRNA *
void RNA_blender_rna_pointer_create(PointerRNA *r_ptr);
void RNA_pointer_recast(PointerRNA *ptr, PointerRNA *r_ptr);
-extern PointerRNA PointerRNA_NULL;
+extern const PointerRNA PointerRNA_NULL;
/* Structs */
@@ -613,10 +621,13 @@ int RNA_struct_idprops_register_check(StructRNA *type);
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier);
-const struct ListBase *RNA_struct_defined_properties(StructRNA *srna);
+
+/* lower level functions for access to type properties */
+const struct ListBase *RNA_struct_type_properties(StructRNA *srna);
+PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier);
FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier);
-const struct ListBase *RNA_struct_defined_functions(StructRNA *srna);
+const struct ListBase *RNA_struct_type_functions(StructRNA *srna);
char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen);
@@ -678,9 +689,11 @@ int RNA_property_editable_index(PointerRNA *ptr, PropertyRNA *prop, int index);
int RNA_property_editable_flag(PointerRNA *ptr, PropertyRNA *prop); /* without lib check, only checks the flag */
int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop);
int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop); /* slow, use with care */
void RNA_property_update(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_update_main(struct Main *bmain, struct Scene *scene, PointerRNA *ptr, PropertyRNA *prop);
+int RNA_property_update_check(struct PropertyRNA *prop);
/* Property Data */
@@ -728,7 +741,7 @@ int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop);
PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value);
-// TODO: get default pointers...
+PointerRNA RNA_property_pointer_get_default(PointerRNA *ptr, PropertyRNA *prop);
void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter);
void RNA_property_collection_next(CollectionPropertyIterator *iter);
@@ -741,8 +754,8 @@ int RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, Pointer
/* efficient functions to set properties for arrays */
int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array);
-int RNA_property_collection_raw_get(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len);
-int RNA_property_collection_raw_set(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len);
+int RNA_property_collection_raw_get(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len);
+int RNA_property_collection_raw_set(struct ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len);
int RNA_raw_type_sizeof(RawPropertyType type);
RawPropertyType RNA_property_raw_type(PropertyRNA *prop);
@@ -834,7 +847,11 @@ char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, in
int RNA_string_length(PointerRNA *ptr, const char *name);
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value);
+/**
+ * Retrieve the named property from PointerRNA.
+ */
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name);
+/* Set the property name of PointerRNA ptr to ptr_value */
void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value);
void RNA_pointer_add(PointerRNA *ptr, const char *name);
@@ -909,8 +926,8 @@ void RNA_parameter_list_end(ParameterIterator *iter);
void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value);
void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value);
-void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value);
-void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value);
+void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value);
+void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value);
int RNA_parameter_length_get(ParameterList *parms, PropertyRNA *parm);
int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data);
void RNA_parameter_length_set(ParameterList *parms, PropertyRNA *parm, int length);
@@ -919,8 +936,16 @@ void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, void
int RNA_function_call(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms);
int RNA_function_call_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, ParameterList *parms);
-int RNA_function_call_direct(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...);
-int RNA_function_call_direct_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...);
+int RNA_function_call_direct(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 5, 6)));
+#endif
+;
+int RNA_function_call_direct_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 5, 6)));
+#endif
+;
int RNA_function_call_direct_va(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args);
int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, va_list args);
@@ -933,5 +958,4 @@ StructRNA *ID_code_to_RNA_type(short idcode);
}
#endif
-#endif /* RNA_ACCESS */
-
+#endif /* RNA_ACCESS_H */
diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h
index 6422950b5e4..f131f7c9ebe 100644
--- a/source/blender/makesrna/RNA_define.h
+++ b/source/blender/makesrna/RNA_define.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,9 @@
#ifndef RNA_DEFINE_H
#define RNA_DEFINE_H
-/* Functions used during preprocess and runtime, for defining the RNA. */
+/** \file RNA_define.h
+ * \ingroup RNA
+ * Functions used during preprocess and runtime, for defining the RNA. */
#include <float.h>
#include <limits.h>
@@ -86,6 +88,7 @@ PropertyRNA *RNA_def_string_dir_path(StructOrFunctionRNA *cont, const char *iden
PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont, const char *identifier, const char *default_value, int maxlen, const char *ui_name, const char *ui_description);
PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description);
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc);
PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax);
@@ -132,8 +135,9 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
void RNA_def_property_flag(PropertyRNA *prop, int flag);
void RNA_def_property_clear_flag(PropertyRNA *prop, int flag);
+void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype);
void RNA_def_property_array(PropertyRNA *prop, int length);
-void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[]);
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[]);
void RNA_def_property_range(PropertyRNA *prop, double min, double max);
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item);
@@ -192,10 +196,16 @@ void RNA_def_struct_duplicate_pointers(StructRNA *srna);
void RNA_def_struct_free_pointers(StructRNA *srna);
void RNA_def_func_duplicate_pointers(FunctionRNA *func);
void RNA_def_func_free_pointers(FunctionRNA *func);
-void RNA_def_property_duplicate_pointers(PropertyRNA *prop);
+void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, PropertyRNA *prop);
void RNA_def_property_free_pointers(PropertyRNA *prop);
int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *identifier);
+/* utilities */
+const char *RNA_property_typename(PropertyType type);
+#define IS_DNATYPE_FLOAT_COMPAT(_str) (strcmp(_str, "float") == 0 || strcmp(_str, "double") == 0)
+#define IS_DNATYPE_INT_COMPAT(_str) (strcmp(_str, "int") == 0 || strcmp(_str, "short") == 0 || strcmp(_str, "char") == 0)
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/RNA_documentation.h b/source/blender/makesrna/RNA_documentation.h
new file mode 100644
index 00000000000..de8e2336bf2
--- /dev/null
+++ b/source/blender/makesrna/RNA_documentation.h
@@ -0,0 +1,5 @@
+/** \page makesrna makesrna
+ * \ingroup RNA
+ * \section aboutmakesrna About RNA
+ * The \ref RNA module defines and provides the access API to the data, thus encapsulating \ref DNA
+ */
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 38ba44f2c2b..b9fb7c89468 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,8 +22,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_ENUM_TYPES
-#define RNA_ENUM_TYPES
+#ifndef RNA_ENUM_TYPES_H
+#define RNA_ENUM_TYPES_H
+
+/** \file RNA_enum_types.h
+ * \ingroup RNA
+ */
#include "RNA_types.h"
@@ -36,6 +40,7 @@ extern EnumPropertyItem DummyRNA_NULL_items[];
extern EnumPropertyItem DummyRNA_DEFAULT_items[];
extern EnumPropertyItem object_mode_items[];
+extern EnumPropertyItem metaelem_type_items[];
extern EnumPropertyItem proportional_falloff_items[];
extern EnumPropertyItem proportional_editing_items[];
@@ -56,6 +61,9 @@ extern EnumPropertyItem beztriple_interpolation_mode_items[];
extern EnumPropertyItem keyingset_path_grouping_items[];
+extern EnumPropertyItem keyframe_paste_offset_items[];
+extern EnumPropertyItem keyframe_paste_merge_items[];
+
extern EnumPropertyItem fmodifier_type_items[];
extern EnumPropertyItem nla_mode_extend_items[];
@@ -71,6 +79,8 @@ extern EnumPropertyItem brush_imagepaint_tool_items[];
extern EnumPropertyItem texture_type_items[];
+extern EnumPropertyItem lamp_type_items[];
+
extern EnumPropertyItem unpack_method_items[];
extern EnumPropertyItem object_type_items[];
@@ -79,8 +89,6 @@ extern EnumPropertyItem object_type_curve_items[];
extern EnumPropertyItem controller_type_items[];
-extern EnumPropertyItem space_type_items[];
-
extern EnumPropertyItem keymap_propvalue_items[];
extern EnumPropertyItem operator_context_items[];
@@ -92,6 +100,13 @@ extern EnumPropertyItem property_unit_items[];
extern EnumPropertyItem viewport_shade_items[];
+extern EnumPropertyItem node_socket_type_items[];
+
+extern EnumPropertyItem node_blend_type_items[];
+extern EnumPropertyItem node_math_items[];
+extern EnumPropertyItem node_vec_math_items[];
+extern EnumPropertyItem node_filter_items[];
+
struct bContext;
struct PointerRNA;
EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
@@ -109,7 +124,4 @@ EnumPropertyItem *RNA_image_local_itemf(struct bContext *C, struct PointerRNA *p
EnumPropertyItem *RNA_scene_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
EnumPropertyItem *RNA_scene_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
-#endif /* RNA_ENUM_TYPES */
-
-
-
+#endif /* RNA_ENUM_TYPES_H */
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 5caae56010f..13422415c2d 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,8 +24,8 @@
#include "BLO_sys_types.h"
-#ifndef RNA_TYPES
-#define RNA_TYPES
+#ifndef RNA_TYPES_H
+#define RNA_TYPES_H
#ifdef __cplusplus
extern "C" {
@@ -167,6 +167,10 @@ typedef enum PropertyFlag {
* only apply this to types that are derived from an ID ()*/
PROP_ID_SELF_CHECK = 1<<20,
PROP_NEVER_NULL = 1<<18,
+ /* currently only used for UI, this is similar to PROP_NEVER_NULL
+ * except that the value may be NULL at times, used for ObData, where an Empty's will be NULL
+ * but setting NULL on a mesh object is not possible. So, if its not NULL, setting NULL cant be done! */
+ PROP_NEVER_UNLINK = 1<<25,
/* flag contains multiple enums.
* note: not to be confused with prop->enumbitflags
@@ -183,6 +187,12 @@ typedef enum PropertyFlag {
* most common case is functions that return arrays where the array */
PROP_THICK_WRAP = 1<<23,
+ /* Reject values outside limits, use for python api only so far
+ * this is for use when silently clamping string length will give
+ * bad behavior later. Could also enforce this for INT's and other types.
+ * note: currently no support for function arguments or non utf8 paths (filepaths) */
+ PROP_NEVER_CLAMP = 1<<26,
+
/* internal flags */
PROP_BUILTIN = 1<<7,
PROP_EXPORT = 1<<8,
@@ -192,7 +202,7 @@ typedef enum PropertyFlag {
PROP_RAW_ARRAY = 1<<14,
PROP_FREE_POINTERS = 1<<15,
PROP_DYNAMIC = 1<<17, /* for dynamic arrays, and retvals of type string */
- PROP_ENUM_NO_CONTEXT = 1<<18 /* for enum that shouldn't be contextual */
+ PROP_ENUM_NO_CONTEXT = 1<<24 /* for enum that shouldn't be contextual */
} PropertyFlag;
typedef struct CollectionPropertyIterator {
@@ -307,13 +317,13 @@ typedef enum StructFlag {
STRUCT_RUNTIME = 4,
STRUCT_GENERATED = 8,
STRUCT_FREE_POINTERS = 16,
- STRUCT_NO_IDPROPERTIES = 32, /* Menu's and Panels don't need properties */
+ STRUCT_NO_IDPROPERTIES = 32 /* Menu's and Panels don't need properties */
} StructFlag;
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
-typedef int (*StructCallbackFunc)(struct PointerRNA *ptr, struct FunctionRNA *func, ParameterList *list);
+typedef int (*StructCallbackFunc)(struct bContext *C, struct PointerRNA *ptr, struct FunctionRNA *func, ParameterList *list);
typedef void (*StructFreeFunc)(void *data);
-typedef struct StructRNA *(*StructRegisterFunc)(const struct bContext *C, struct ReportList *reports, void *data,
+typedef struct StructRNA *(*StructRegisterFunc)(struct bContext *C, struct ReportList *reports, void *data,
const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
typedef void (*StructUnregisterFunc)(const struct bContext *C, struct StructRNA *type);
@@ -333,43 +343,41 @@ typedef struct BlenderRNA BlenderRNA;
typedef struct ExtensionRNA {
void *data;
StructRNA *srna;
-
- int (*call)(PointerRNA *, FunctionRNA *, ParameterList *);
- void (*free)(void *data);
+ StructCallbackFunc call;
+ StructFreeFunc free;
+
} ExtensionRNA;
/* fake struct definitions, needed otherwise collections end up owning the C
* structs like 'Object' when defined first */
-#define MainActions Main
-#define MainArmatures Main
-#define MainBrushes Main
-#define MainCameras Main
-#define MainCurves Main
-#define MainFonts Main
-#define MainGreasePencils Main
-#define MainGroups Main
-#define MainImages Main
-#define MainLamps Main
-#define MainLattices Main
-#define MainLibraries Main
-#define MainMaterials Main
-#define MainMeshes Main
-#define MainMetaBalls Main
-#define MainNodeTrees Main
-#define MainObjects Main
-#define MainParticles Main
-#define MainScenes Main
-#define MainScreens Main
-#define MainSounds Main
-#define MainTexts Main
-#define MainTextures Main
-#define MainWindowManagers Main
-#define MainWorlds Main
+#define BlendDataActions Main
+#define BlendDataArmatures Main
+#define BlendDataBrushes Main
+#define BlendDataCameras Main
+#define BlendDataCurves Main
+#define BlendDataFonts Main
+#define BlendDataGreasePencils Main
+#define BlendDataGroups Main
+#define BlendDataImages Main
+#define BlendDataLamps Main
+#define BlendDataLattices Main
+#define BlendDataLibraries Main
+#define BlendDataMaterials Main
+#define BlendDataMeshes Main
+#define BlendDataMetaBalls Main
+#define BlendDataNodeTrees Main
+#define BlendDataObjects Main
+#define BlendDataParticles Main
+#define BlendDataScenes Main
+#define BlendDataScreens Main
+#define BlendDataSounds Main
+#define BlendDataTexts Main
+#define BlendDataTextures Main
+#define BlendDataWindowManagers Main
+#define BlendDataWorlds Main
#ifdef __cplusplus
}
#endif
-#endif /* RNA_TYPES */
-
-
+#endif /* RNA_TYPES_H */
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index b184288f8b1..7f41fb758dd 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -7,58 +7,58 @@ o = SConscript('intern/SConscript')
objs += o
incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
-incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin'
+incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont ../blenloader'
incs += ' ../render/extern/include ../bmesh'
defs = []
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
if env['WITH_BF_TIFF']:
- defs.append('WITH_TIFF')
+ defs.append('WITH_TIFF')
if env['WITH_BF_OPENJPEG']:
- defs.append('WITH_OPENJPEG')
+ defs.append('WITH_OPENJPEG')
if env['WITH_BF_DDS']:
- defs.append('WITH_DDS')
+ defs.append('WITH_DDS')
if env['WITH_BF_CINEON']:
- defs.append('WITH_CINEON')
+ defs.append('WITH_CINEON')
if env['WITH_BF_HDR']:
- defs.append('WITH_HDR')
+ defs.append('WITH_HDR')
if env['WITH_BF_FFMPEG']:
- defs.append('WITH_FFMPEG')
- incs += ' ' + env['BF_FFMPEG_INC']
+ defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
if env['WITH_BF_OGG']:
- defs.append('WITH_OGG')
+ defs.append('WITH_OGG')
if env['WITH_BF_QUICKTIME']:
- defs.append('WITH_QUICKTIME')
- incs += ' ../quicktime'
+ defs.append('WITH_QUICKTIME')
+ incs += ' ../quicktime'
if env['WITH_BF_LCMS']:
- defs.append('WITH_LCMS')
- incs += ' ' + env['BF_LCMS_INC']
-
+ defs.append('WITH_LCMS')
+ incs += ' ' + env['BF_LCMS_INC']
+
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
+ defs.append('WITH_GAMEENGINE')
if env['BF_UNIT_TEST']:
- defs.append('UNIT_TEST')
+ defs.append('UNIT_TEST')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( 'bf_rna', objs, Split(incs), defines=defs, libtype=['core','player'], priority = [165,20] )
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 58d59242806..0b54d181a78 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id: CMakeLists.txt 17433 2008-11-12 21:16:53Z blendix $
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,126 +25,148 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
-FILE(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c")
-LIST(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
-LIST(REMOVE_ITEM DEFSRC ${APISRC})
+# Generated code has some unused vars we can ignore.
+remove_strict_flags()
+
+# message(STATUS "Configuring makesrna")
+
+file(GLOB DEFSRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c")
+file(GLOB APISRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*_api.c")
+list(REMOVE_ITEM DEFSRC rna_access.c rna_define.c makesrna.c)
+list(REMOVE_ITEM DEFSRC ${APISRC})
-STRING(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
+string(REGEX REPLACE "rna_([a-zA-Z0-9_-]*).c" "${CMAKE_CURRENT_BINARY_DIR}/rna_\\1_gen.c" GENSRC "${DEFSRC}")
+set_source_files_properties(GENSRC PROPERTIES GENERATED true)
+
+set(SRC_RNA_INC
+ ../RNA_access.h
+ ../RNA_define.h
+ ../RNA_documentation.h
+ ../RNA_enum_types.h
+ ../RNA_types.h
+)
-SET(SRC
+set(SRC
makesrna.c
rna_define.c
${DEFSRC}
${APISRC}
../../../../intern/guardedalloc/intern/mallocn.c
- ../../../../intern/guardedalloc/intern/mmap_win.c)
-
-INCLUDE_DIRECTORIES(
- ../../../../intern/audaspace/intern
- ../../../../intern/guardedalloc
- ../../../../intern/memutil
- ..
- ../../makesdna
- ../../blenkernel
- ../../bmesh
- ../../blenlib
- ../../ikplugin
- ../../windowmanager
- ../../editors/include
- ../../gpu
- ../../imbuf
- ../../render/extern/include
- ../../../../extern/glew/include
- . )
-
-FILE(GLOB INC_FILES ../*.h ../../makesdna/*.h)
+ ../../../../intern/guardedalloc/intern/mmap_win.c
+)
-IF(NOT WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(NOT WITH_PYTHON)
+set(INC
+)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_PYTHON)
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_OPENJPEG)
- ADD_DEFINITIONS(-DWITH_OPENJPEG)
-ENDIF(WITH_IMAGE_OPENJPEG)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../../quicktime)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../../quicktime)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_LCMS)
- SET(INC ${INC} ${LCMS_INCLUDE_DIR})
- ADD_DEFINITIONS(-DWITH_LCMS)
-ENDIF(WITH_LCMS)
+if(WITH_LCMS)
+ list(APPEND INC ${LCMS_INCLUDE_DIR})
+ add_definitions(-DWITH_LCMS)
+endif()
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
-IF(WITH_FFTW3)
- ADD_DEFINITIONS(-DFFTW3=1)
-ENDIF(WITH_FFTW3)
+if(WITH_FFTW3)
+ add_definitions(-DFFTW3=1)
+endif()
-IF(WITH_SDL)
- ADD_DEFINITIONS(-DWITH_SDL)
-ENDIF(WITH_SDL)
+if(WITH_SDL)
+ add_definitions(-DWITH_SDL)
+endif()
-IF(WITH_OPENAL)
- ADD_DEFINITIONS(-DWITH_OPENAL)
-ENDIF(WITH_OPENAL)
+if(WITH_OPENAL)
+ add_definitions(-DWITH_OPENAL)
+endif()
-IF(WITH_JACK)
- ADD_DEFINITIONS(-DWITH_JACK)
-ENDIF(WITH_JACK)
+if(WITH_JACK)
+ add_definitions(-DWITH_JACK)
+endif()
# Build makesrna executable
-ADD_EXECUTABLE(makesrna ${SRC} ${INC_FILES})
-TARGET_LINK_LIBRARIES(makesrna bf_dna)
+blender_include_dirs(
+ .
+ ..
+ ../../blenkernel
+ ../../blenloader
+ ../../blenlib
+ ../../bmesh
+ ../../blenfont
+ ../../gpu
+ ../../imbuf
+ ../../ikplugin
+ ../../makesdna
+ ../../windowmanager
+ ../../editors/include
+ ../../render/extern/include
+ ../../../../extern/glew/include
+ ../../../../intern/audaspace/intern
+ ../../../../intern/guardedalloc
+ ../../../../intern/memutil
+)
+
+add_executable(makesrna ${SRC} ${SRC_RNA_INC} ${SRC_DNA_INC})
+target_link_libraries(makesrna bf_dna)
# Output rna_*_gen.c
# note (linux only): with crashes try add this after COMMAND: valgrind --leak-check=full --track-origins=yes
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${GENSRC}
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesrna ${CMAKE_CURRENT_BINARY_DIR}/
DEPENDS makesrna
)
# Build bf_rna
-SET(SRC rna_access.c ${GENSRC})
-BLENDERLIB(bf_rna "${SRC}" "${INC}")
+set(SRC
+ rna_access.c
+ ${GENSRC}
+
+ ${SRC_RNA_INC}
+ rna_internal.h
+ rna_internal_types.h
+ rna_nodetree_types.h
+)
-MESSAGE(STATUS "Configuring makesrna")
+blender_add_lib(bf_rna "${SRC}" "${INC}")
diff --git a/source/blender/makesrna/intern/Makefile b/source/blender/makesrna/intern/Makefile
deleted file mode 100644
index 69d5581184d..00000000000
--- a/source/blender/makesrna/intern/Makefile
+++ /dev/null
@@ -1,158 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Contributor(s): Blender Foundation (2008).
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-LIBNAME = rna
-DIR = $(OCGDIR)/blender/makesrna
-
-ALLRNA = $(wildcard rna_*.c)
-DEFRNA = $(filter-out %rna_define.c, $(filter-out %rna_access.c, $(ALLRNA)))
-
-GENRNA = $(filter-out %_api.c, $(DEFRNA))
-GENSRCS = $(patsubst rna_%.c, rna_%_gen.c, $(GENRNA))
-GENTARGET = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.c, $(GENSRCS))
-
-MAKESRCS = $(DEFRNA) makesrna.c rna_define.c
-MAKEOBJS = $(patsubst %.c, $(DIR)/$(DEBUG_DIR)%.o, $(notdir $(MAKESRCS)))
-
-CSRCS = $(GENSRCS) rna_access.c
-
-include nan_compile.mk
-
-ifdef NAN_DEPEND
--include $(MAKESRCS:%.c=$(DIR)/$(DEBUG_DIR)%.d)
-endif
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-CPPFLAGS += -I../../../../intern/audaspace/intern
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../ikplugin
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I..
-CPPFLAGS += -I.
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
-endif
-
-ifeq ($(WITH_OPENEXR), true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_DDS), true)
- CPPFLAGS += -DWITH_DDS
-endif
-
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME -I../../quicktime
-endif
-
-ifeq ($(WITH_SDL),true)
- CPPFLAGS += -DWITH_SDL
-endif
-
-ifeq ($(WITH_JACK),true)
- CPPFLAGS += -DWITH_JACK
-endif
-
-ifeq ($(WITH_OPENAL),true)
- CPPFLAGS += -DWITH_OPENAL
-endif
-
-ifeq ($(WITH_TIFF),true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_LCMS),true)
- CPPFLAGS += -DWITH_LCMS
-endif
-
-ifeq ($(WITH_CINEON),true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR),true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-ifeq ($(OS),windows)
- # Windows needs these extra libs because of winstuff... It is not
- # _really_ needed, but it is the easiest fix for now. If you have
- # some spare time, try to trace down the exact dep.
- ifneq ($(FREE_WINDOWS),true)
- WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
- WINLIBS += advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
- WINLIBS += winmm.lib opengl32.lib glu32.lib largeint.lib
- WINLIBS += /link /nodefaultlib:libc
- else
- LDFLAGS += -mwindows -mno-cygwin
- endif
-endif
-
-ifeq ($(OS), darwin)
- LDFLAGS += -arch $(MACOSX_ARCHITECTURE) #-isysroot $(MACOSX_SDK) -mmacosx-version-min=$(MACOSX_MIN_VERS)
-endif
-
-clean::
- @$(RM) $(DIR)/makesrna* $(DIR)/rna*
- @$(RM) $(DIR)/debug/makesrna* $(DIR)/debug/rna*
-
-# TODO include right .mk for ldflags
-
-# A small note: we do not use the debug version of the alloc lib. That
-# is done quite intentionally. If there is a bug in that lib, it needs
-# to be fixed by the module maintainer.
-
-$(DIR)/$(DEBUG_DIR)makesrna: $(MAKEOBJS) $(OCGDIR)/blender/makesdna/$(DEBUG_DIR)libdna.a $(NAN_GUARDEDALLOC)/lib/libguardedalloc.a
- $(CC) $(LDFLAGS) -o $@ $(WINLIBS) $^
-
-$(DIR)/$(DEBUG_DIR)rna_phony_gen.c: $(DIR)/$(DEBUG_DIR)makesrna
- ifeq ($(OS),windows)
- $(SRCHOME)/tools/cygwin/cl_wrapper.pl - $(DIR)/$(DEBUG_DIR)makesrna \
- $(DIR)/$(DEBUG_DIR)
- else
- $(DIR)/$(DEBUG_DIR)makesrna $(DIR)/$(DEBUG_DIR)
- endif
- @touch $@
-
-$(GENTARGET): $(DIR)/$(DEBUG_DIR)rna_phony_gen.c
-
-$(DIR)/$(DEBUG_DIR)makesrna.o: makesrna.c $(wildcard rna_*.c)
- $(CC) -c $(CFLAGS) $(CPPFLAGS) makesrna.c -o $@
-
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 88b29e10d1d..2abed91ec02 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -3,10 +3,10 @@ import sys
import os
def normpath(path):
- return os.path.abspath(os.path.normpath(path))
+ return os.path.abspath(os.path.normpath(path))
Import ('env')
-cflags = ['-Wall']
+cflags = [] #['-Wall']
defines = []
root_build_dir=normpath(env['BF_BUILDDIR'])
@@ -29,47 +29,47 @@ makesrna_tool.Append(CCFLAGS = '-DBASE_HEADER="\\"source/blender/makesrna/\\"" '
defs = []
-incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel'
+incs = '#/intern/guardedalloc ../../blenlib ../../blenkernel ../../blenloader'
incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin'
-incs += ' ../../windowmanager ../../editors/include'
+incs += ' ../../windowmanager ../../editors/include ../../blenfont'
incs += ' ../../render/extern/include ../../bmesh'
incs += ' #/intern/audaspace/intern '
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
if env['WITH_BF_TIFF']:
defs.append('WITH_TIFF')
if env['WITH_BF_OPENJPEG']:
- defs.append('WITH_OPENJPEG')
+ defs.append('WITH_OPENJPEG')
if env['WITH_BF_DDS']:
- defs.append('WITH_DDS')
+ defs.append('WITH_DDS')
if env['WITH_BF_CINEON']:
- defs.append('WITH_CINEON')
+ defs.append('WITH_CINEON')
if env['WITH_BF_HDR']:
- defs.append('WITH_HDR')
+ defs.append('WITH_HDR')
if env['WITH_BF_FFMPEG']:
- defs.append('WITH_FFMPEG')
- incs += ' ' + env['BF_FFMPEG_INC']
+ defs.append('WITH_FFMPEG')
+ incs += ' ' + env['BF_FFMPEG_INC']
if env['WITH_BF_OGG']:
- defs.append('WITH_OGG')
+ defs.append('WITH_OGG')
if env['WITH_BF_QUICKTIME']:
- defs.append('WITH_QUICKTIME')
- incs += ' ../../quicktime'
+ defs.append('WITH_QUICKTIME')
+ incs += ' ../../quicktime'
if env['WITH_BF_LCMS']:
- defs.append('WITH_LCMS')
+ defs.append('WITH_LCMS')
if env['WITH_BF_GAMEENGINE']:
- defs.append('GAMEBLENDER=1')
-
+ defs.append('WITH_GAMEENGINE')
+
if env['WITH_BF_FFTW3']:
defs.append('FFTW3=1')
@@ -83,40 +83,40 @@ if env['WITH_BF_JACK']:
defs.append('WITH_JACK')
if env['BF_UNIT_TEST']:
- defs.append('UNIT_TEST')
+ defs.append('UNIT_TEST')
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
makesrna_tool.Append(CPPDEFINES=defs)
makesrna_tool.Append (CPPPATH = Split(incs))
if env['OURPLATFORM'] == 'linuxcross':
- USE_WINE = True # when cross compiling on linux 64bit this is useful
+ USE_WINE = True # when cross compiling on linux 64bit this is useful
else:
- USE_WINE = False
+ USE_WINE = False
if not USE_WINE:
- if env['OURPLATFORM'] == 'linuxcross':
- makesdna_tool.Replace(CC='gcc')
- makesdna_tool.Replace(AR='ar')
- makesdna_tool.Replace(LINK='gcc')
+ if env['OURPLATFORM'] == 'linuxcross':
+ makesdna_tool.Replace(CC='gcc')
+ makesdna_tool.Replace(AR='ar')
+ makesdna_tool.Replace(LINK='gcc')
if sys.platform != 'cygwin':
- makesrna_tool.Append (CCFLAGS = cflags)
+ makesrna_tool.Append (CCFLAGS = cflags)
makesrna_tool.Append (CPPDEFINES = defines)
libdir = root_build_dir+'/lib'
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
- libdir = '#' + libdir
+ libdir = '#' + libdir
makesrna_tool.Append (LIBPATH = libdir)
@@ -125,17 +125,17 @@ makesrna_tool.Append( CCFLAGS = env['CCFLAGS'])
makesrna_tool.Append( LINKFLAGS = env['PLATFORM_LINKFLAGS'])
if env['BF_PROFILE']:
- makesrna_tool.Append (LINKFLAGS = env['BF_PROFILE_FLAGS'])
+ makesrna_tool.Append (LINKFLAGS = env['BF_PROFILE_FLAGS'])
if env['BF_DEBUG']:
- makesrna_tool.Append(CFLAGS = env['BF_DEBUG_CFLAGS'])
- makesrna_tool.Append(CCFLAGS = env['BF_DEBUG_CCFLAGS'])
- if env['OURPLATFORM'] in ('win32-vc','win64-vc'):
- makesrna_tool.Append(LINKFLAGS = ['/DEBUG','/PDB:makesrna.pdb'])
+ makesrna_tool.Append(CFLAGS = env['BF_DEBUG_CFLAGS'])
+ makesrna_tool.Append(CCFLAGS = env['BF_DEBUG_CCFLAGS'])
+ if env['OURPLATFORM'] in ('win32-vc','win64-vc'):
+ makesrna_tool.Append(LINKFLAGS = ['/DEBUG','/PDB:makesrna.pdb'])
targetpath = root_build_dir+'/makesrna'
if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
- targetpath = '#' + targetpath
+ targetpath = '#' + targetpath
if env['OURPLATFORM'] == 'linux2' and root_build_dir[0]==os.sep:
makesrna = makesrna_tool.Program (target = targetpath, source = source_files, LIBS=['bf_intern_guardedalloc', 'bf_dna', 'bf_blenlib'])
@@ -147,24 +147,28 @@ rna.Depends (generated_files, makesrna)
# this seems bad, how to retrieve it from scons?
build_dir = root_build_dir + os.sep +'source' + os.sep + 'blender' + os.sep + 'makesrna' + os.sep + 'intern' + os.sep
+<<<<<<< .working
+=======
+
+>>>>>>> .merge-right.r35190
if env['OURPLATFORM'] != 'linuxcross':
- if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
- rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna.exe\" \"" + build_dir )
- else:
- rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna\" \"" + build_dir + '"' )
+ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
+ rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna.exe\" \"" + build_dir )
+ else:
+ rna.Command (generated_files, '', "\"" + root_build_dir+os.sep+"makesrna\" \"" + build_dir + '"' )
else:
- rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe " + build_dir)
-
- if USE_WINE:
- rna.Command (generated_files, '', 'wine ' + root_build_dir+os.sep+"makesrna.exe " + build_dir)
- else:
- rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe " + build_dir)
+ rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe " + build_dir)
+
+ if USE_WINE:
+ rna.Command (generated_files, '', 'wine ' + root_build_dir+os.sep+"makesrna.exe " + build_dir)
+ else:
+ rna.Command (generated_files, '', root_build_dir+os.sep+"makesrna.exe " + build_dir)
obj = ['intern/rna_access.c']
for generated_file in generated_files:
- obj += ['intern/' + generated_file]
+ obj += ['intern/' + generated_file]
Return ('obj')
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 68414eae3f8..247b87d7bc4 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
@@ -47,14 +48,40 @@
/* Replace if different */
#define TMP_EXT ".tmp"
-static int replace_if_different(char *tmpfile)
+
+/* copied from BLI_file_older */
+#include <sys/stat.h>
+static int file_older(const char *file1, const char *file2)
+{
+ struct stat st1, st2;
+ // printf("compare: %s %s\n", file1, file2);
+
+ if(stat(file1, &st1)) return 0;
+ if(stat(file2, &st2)) return 0;
+
+ return (st1.st_mtime < st2.st_mtime);
+}
+const char *makesrna_path= NULL;
+
+static int replace_if_different(char *tmpfile, const char *dep_files[])
{
// return 0; // use for testing had edited rna
#define REN_IF_DIFF \
- remove(orgfile); \
+ { \
+ FILE *file_test= fopen(orgfile, "rb"); \
+ if(file_test) { \
+ fclose(file_test); \
+ if(fp_org) fclose(fp_org); \
+ if(fp_new) fclose(fp_new); \
+ if(remove(orgfile) != 0) { \
+ fprintf(stderr, "%s:%d, Remove Error (%s): \"%s\"\n", __FILE__, __LINE__, strerror(errno), orgfile); \
+ return -1; \
+ } \
+ } \
+ } \
if(rename(tmpfile, orgfile) != 0) { \
- fprintf(stderr, "%s:%d, rename error: \"%s\" -> \"%s\"\n", __FILE__, __LINE__, tmpfile, orgfile); \
+ fprintf(stderr, "%s:%d, Rename Error (%s): \"%s\" -> \"%s\"\n", __FILE__, __LINE__, strerror(errno), tmpfile, orgfile); \
return -1; \
} \
remove(tmpfile); \
@@ -62,7 +89,7 @@ static int replace_if_different(char *tmpfile)
/* end REN_IF_DIFF */
- FILE *fp_new, *fp_org;
+ FILE *fp_new= NULL, *fp_org= NULL;
int len_new, len_org;
char *arr_new, *arr_org;
int cmp;
@@ -78,6 +105,42 @@ static int replace_if_different(char *tmpfile)
REN_IF_DIFF;
}
+
+ /* XXX, trick to work around dependancy problem
+ * assumes dep_files is in the same dir as makesrna.c, which is true for now. */
+
+ if(1) {
+ /* first check if makesrna.c is newer then generated files
+ * for development on makesrna.c you may want to disable this */
+ if(file_older(orgfile, __FILE__)) {
+ REN_IF_DIFF;
+ }
+
+ if(file_older(orgfile, makesrna_path)) {
+ REN_IF_DIFF;
+ }
+
+ /* now check if any files we depend on are newer then any generated files */
+ if(dep_files) {
+ int pass;
+ for(pass=0; dep_files[pass]; pass++) {
+ char from_path[4096]= __FILE__;
+ char *p1, *p2;
+
+ /* dir only */
+ p1= strrchr(from_path, '/');
+ p2= strrchr(from_path, '\\');
+ strcpy((p1 > p2 ? p1 : p2)+1, dep_files[pass]);
+ /* account for build deps, if makesrna.c (this file) is newer */
+ if(file_older(orgfile, from_path)) {
+ REN_IF_DIFF;
+ }
+ }
+ }
+ }
+ /* XXX end dep trick */
+
+
fp_new= fopen(tmpfile, "rb");
if(fp_new==NULL) {
@@ -199,7 +262,7 @@ static void rna_sortlist(ListBase *listbase, int(*cmp)(const void*, const void*)
static void rna_print_c_string(FILE *f, const char *str)
{
- static char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
+ static const char *escape[] = {"\''", "\"\"", "\??", "\\\\","\aa", "\bb", "\ff", "\nn", "\rr", "\tt", "\vv", NULL};
int i, j;
if(!str) {
@@ -292,7 +355,12 @@ static const char *rna_type_type_name(PropertyRNA *prop)
case PROP_FLOAT:
return "float";
case PROP_STRING:
- return "char*";
+ if(prop->flag & PROP_THICK_WRAP) {
+ return "char*";
+ }
+ else {
+ return "const char*";
+ }
default:
return NULL;
}
@@ -364,7 +432,7 @@ static int rna_enum_bitmask(PropertyRNA *prop)
static int rna_color_quantize(PropertyRNA *prop, PropertyDefRNA *dp)
{
- if(prop->type == PROP_FLOAT && prop->subtype == PROP_COLOR)
+ if(prop->type == PROP_FLOAT && (prop->subtype==PROP_COLOR || prop->subtype==PROP_COLOR_GAMMA))
if(strcmp(dp->dnatype, "float") != 0 && strcmp(dp->dnatype, "double") != 0)
return 1;
@@ -395,7 +463,7 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
{
char *func;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(!manualfunc) {
@@ -404,6 +472,28 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
DefRNA.error= 1;
return NULL;
}
+
+ /* typecheck, */
+ if(dp->dnatype && *dp->dnatype) {
+
+ if(prop->type == PROP_FLOAT) {
+ if(IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) {
+ if(prop->subtype != PROP_COLOR_GAMMA) { /* colors are an exception. these get translated */
+ fprintf(stderr, "rna_def_property_get_func1: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return NULL;
+ }
+ }
+ }
+ else if(prop->type == PROP_INT || prop->type == PROP_BOOLEAN || prop->type == PROP_ENUM) {
+ if(IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "rna_def_property_get_func2: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return NULL;
+ }
+ }
+ }
+
}
func= rna_alloc_function_name(srna->identifier, prop->identifier, "get");
@@ -576,7 +666,7 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
if(!(prop->flag & PROP_EDITABLE))
return NULL;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(!manualfunc) {
@@ -744,7 +834,7 @@ static char *rna_def_property_length_func(FILE *f, StructRNA *srna, PropertyRNA
{
char *func= NULL;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(prop->type == PROP_STRING) {
@@ -802,7 +892,7 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *
{
char *func, *getfunc;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(!manualfunc) {
@@ -858,9 +948,11 @@ static char *rna_def_property_begin_func(FILE *f, StructRNA *srna, PropertyRNA *
static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc, char *nextfunc)
{
+ /* note on indices, this is for external functions and ignores skipped values.
+ * so the the index can only be checked against the length when there is no 'skip' funcion. */
char *func;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(!manualfunc) {
@@ -875,55 +967,61 @@ static char *rna_def_property_lookup_int_func(FILE *f, StructRNA *srna, Property
func= rna_alloc_function_name(srna->identifier, prop->identifier, "lookup_int");
- fprintf(f, "PointerRNA %s(PointerRNA *ptr, int index)\n", func);
+ fprintf(f, "int %s(PointerRNA *ptr, int index, PointerRNA *r_ptr)\n", func);
fprintf(f, "{\n");
if(manualfunc) {
- fprintf(f, "\n return %s(ptr, index);\n", manualfunc);
+ fprintf(f, "\n return %s(ptr, index, r_ptr);\n", manualfunc);
fprintf(f, "}\n\n");
return func;
}
- fprintf(f, " PointerRNA r_ptr;\n");
+ fprintf(f, " int found= 0;\n");
fprintf(f, " CollectionPropertyIterator iter;\n\n");
fprintf(f, " %s_%s_begin(&iter, ptr);\n\n", srna->identifier, prop->identifier);
- fprintf(f, " {\n");
+ fprintf(f, " if(iter.valid){\n");
if(strcmp(nextfunc, "rna_iterator_array_next") == 0) {
fprintf(f, " ArrayIterator *internal= iter.internal;\n");
- fprintf(f, " if(internal->skip) {\n");
- fprintf(f, " while(index-- > 0) {\n");
- fprintf(f, " do {\n");
- fprintf(f, " internal->ptr += internal->itemsize;\n");
- fprintf(f, " } while(internal->skip(&iter, internal->ptr));\n");
+ fprintf(f, " if(index < 0 || index >= internal->length) {\n");
+ fprintf(f, "#ifdef __GNUC__\n");
+ fprintf(f, " printf(\"Array iterator out of range: %%s (index %%d)\\n\", __func__, index);\n");
+ fprintf(f, "#else\n");
+ fprintf(f, " printf(\"Array iterator out of range: (index %%d)\\n\", index);\n");
+ fprintf(f, "#endif\n");
+ fprintf(f, " }\n");
+ fprintf(f, " else if(internal->skip) {\n");
+ fprintf(f, " while(index-- > 0 && iter.valid) {\n");
+ fprintf(f, " rna_iterator_array_next(&iter);\n");
fprintf(f, " }\n");
+ fprintf(f, " found= (index == -1 && iter.valid);\n");
fprintf(f, " }\n");
fprintf(f, " else {\n");
fprintf(f, " internal->ptr += internal->itemsize*index;\n");
+ fprintf(f, " found= 1;\n");
fprintf(f, " }\n");
}
else if(strcmp(nextfunc, "rna_iterator_listbase_next") == 0) {
fprintf(f, " ListBaseIterator *internal= iter.internal;\n");
fprintf(f, " if(internal->skip) {\n");
- fprintf(f, " while(index-- > 0) {\n");
- fprintf(f, " do {\n");
- fprintf(f, " internal->link= internal->link->next;\n");
- fprintf(f, " } while(internal->skip(&iter, internal->link));\n");
+ fprintf(f, " while(index-- > 0 && iter.valid) {\n");
+ fprintf(f, " rna_iterator_listbase_next(&iter);\n");
fprintf(f, " }\n");
+ fprintf(f, " found= (index == -1 && iter.valid);\n");
fprintf(f, " }\n");
fprintf(f, " else {\n");
- fprintf(f, " while(index-- > 0)\n");
+ fprintf(f, " while(index-- > 0 && internal->link)\n");
fprintf(f, " internal->link= internal->link->next;\n");
+ fprintf(f, " found= (index == -1 && internal->link);\n");
fprintf(f, " }\n");
}
+ fprintf(f, " if(found) *r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
fprintf(f, " }\n\n");
-
- fprintf(f, " r_ptr = %s_%s_get(&iter);\n", srna->identifier, prop->identifier);
fprintf(f, " %s_%s_end(&iter);\n\n", srna->identifier, prop->identifier);
- fprintf(f, " return r_ptr;\n");
+ fprintf(f, " return found;\n");
#if 0
rna_print_data_get(f, dp);
@@ -952,7 +1050,7 @@ static char *rna_def_property_next_func(FILE *f, StructRNA *srna, PropertyRNA *p
{
char *func, *getfunc;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
if(!manualfunc)
@@ -978,7 +1076,7 @@ static char *rna_def_property_end_func(FILE *f, StructRNA *srna, PropertyRNA *pr
{
char *func;
- if(prop->flag & PROP_IDPROPERTY)
+ if(prop->flag & PROP_IDPROPERTY && manualfunc==NULL)
return NULL;
func= rna_alloc_function_name(srna->identifier, prop->identifier, "end");
@@ -1397,7 +1495,9 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
FunctionRNA *func;
PropertyDefRNA *dparm;
PropertyType type;
- char *funcname, *ptrstr, *valstr;
+ const char *funcname, *valstr;
+ const char *ptrstr;
+ const short has_data= (dfunc->cont.properties.first != NULL);
int flag, pout, cptr, first;
srna= dsrna->srna;
@@ -1415,7 +1515,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
/* variable definitions */
if(func->flag & FUNC_USE_SELF_ID) {
- fprintf(f, "\tstruct ID *_selfid;\n");
+ fprintf(f, "\tstruct ID *_selfid;\n");
}
if((func->flag & FUNC_NO_SELF)==0) {
@@ -1451,22 +1551,26 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
}
- fprintf(f, "\tchar *_data");
- if(func->c_ret) fprintf(f, ", *_retdata");
- fprintf(f, ";\n");
- fprintf(f, "\t\n");
+ if(has_data) {
+ fprintf(f, "\tchar *_data");
+ if(func->c_ret) fprintf(f, ", *_retdata");
+ fprintf(f, ";\n");
+ fprintf(f, "\t\n");
+ }
/* assign self */
if(func->flag & FUNC_USE_SELF_ID) {
- fprintf(f, "\t_selfid= (struct ID*)_ptr->id.data;\n");
+ fprintf(f, "\t_selfid= (struct ID*)_ptr->id.data;\n");
}
-
+
if((func->flag & FUNC_NO_SELF)==0) {
if(dsrna->dnaname) fprintf(f, "\t_self= (struct %s *)_ptr->data;\n", dsrna->dnaname);
else fprintf(f, "\t_self= (struct %s *)_ptr->data;\n", srna->identifier);
}
- fprintf(f, "\t_data= (char *)_parms->data;\n");
+ if(has_data) {
+ fprintf(f, "\t_data= (char *)_parms->data;\n");
+ }
dparm= dfunc->cont.properties.first;
for(; dparm; dparm= dparm->next) {
@@ -1478,7 +1582,8 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
if(dparm->prop==func->c_ret)
fprintf(f, "\t_retdata= _data;\n");
else {
- char *data_str;
+ const char *data_str;
+
if (cptr || (flag & PROP_DYNAMIC)) {
ptrstr= "**";
valstr= "*";
@@ -1558,7 +1663,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
if (dparm->prop->flag & PROP_DYNAMIC)
fprintf(f, "%s_len, %s", dparm->prop->identifier, dparm->prop->identifier);
else
- fprintf(f, "%s", dparm->prop->identifier);
+ fprintf(f, "%s", dparm->prop->identifier);
}
fprintf(f, ");\n");
@@ -1575,7 +1680,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
dfunc->gencall= funcname;
}
-static void rna_auto_types()
+static void rna_auto_types(void)
{
StructDefRNA *ds;
PropertyDefRNA *dp;
@@ -1643,20 +1748,6 @@ static const char *rna_property_structname(PropertyType type)
}
}
-static const char *rna_property_typename(PropertyType type)
-{
- switch(type) {
- case PROP_BOOLEAN: return "PROP_BOOLEAN";
- case PROP_INT: return "PROP_INT";
- case PROP_FLOAT: return "PROP_FLOAT";
- case PROP_STRING: return "PROP_STRING";
- case PROP_ENUM: return "PROP_ENUM";
- case PROP_POINTER: return "PROP_POINTER";
- case PROP_COLLECTION: return "PROP_COLLECTION";
- default: return "PROP_UNKNOWN";
- }
-}
-
static const char *rna_property_subtypename(PropertySubType type)
{
switch(type) {
@@ -1803,7 +1894,7 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
StructDefRNA *dsrna;
PropertyType type;
int flag, pout, cptr, first;
- char *ptrstr;
+ const char *ptrstr;
dsrna= rna_find_struct_def(srna);
func= dfunc->func;
@@ -1933,7 +2024,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
switch(prop->type) {
case PROP_ENUM: {
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
- int i, defaultfound= 0;
+ int i, defaultfound= 0, totflag= 0;
if(eprop->item) {
fprintf(f, "static EnumPropertyItem rna_%s%s_%s_items[%d] = {\n\t", srna->identifier, strnest, prop->identifier, eprop->totitem+1);
@@ -1945,16 +2036,31 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, eprop->item[i].name); fprintf(f, ", ");
rna_print_c_string(f, eprop->item[i].description); fprintf(f, "},\n\t");
- if(eprop->item[i].identifier[0])
- if(eprop->defaultvalue == eprop->item[i].value)
- defaultfound= 1;
+ if(eprop->item[i].identifier[0]) {
+ if(prop->flag & PROP_ENUM_FLAG) {
+ totflag |= eprop->item[i].value;
+ }
+ else {
+ if(eprop->defaultvalue == eprop->item[i].value) {
+ defaultfound= 1;
+ }
+ }
+ }
}
fprintf(f, "{0, NULL, 0, NULL, NULL}\n};\n\n");
- if(!defaultfound) {
- fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
- DefRNA.error= 1;
+ if(prop->flag & PROP_ENUM_FLAG) {
+ if(eprop->defaultvalue & ~totflag) {
+ fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default includes unused bits (%d).\n", srna->identifier, errnest, prop->identifier, eprop->defaultvalue & ~totflag);
+ DefRNA.error= 1;
+ }
+ }
+ else {
+ if(!defaultfound) {
+ fprintf(stderr, "rna_generate_structs: %s%s.%s, enum default is not in items.\n", srna->identifier, errnest, prop->identifier);
+ DefRNA.error= 1;
+ }
}
}
else {
@@ -2039,7 +2145,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
rna_print_c_string(f, prop->description); fprintf(f, ",\n\t");
fprintf(f, "%d,\n", prop->icon);
- fprintf(f, "\t%s, %s|%s, %s, %d, {%d, %d, %d}, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
+ fprintf(f, "\t%s, %s|%s, %s, %d, {%d, %d, %d}, %d,\n", RNA_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
fprintf(f, "\t%s%s, %d, %s, %s,\n", (prop->flag & PROP_CONTEXT_UPDATE)? "(UpdateFunc)": "", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable), rna_function_string(prop->itemeditable));
if(prop->flag & PROP_RAW_ACCESS) rna_set_raw_offset(f, srna, prop);
@@ -2191,11 +2297,9 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
prop= srna->cont.properties.last;
if(prop) fprintf(f, "(PropertyRNA*)&rna_%s_%s}},\n", srna->identifier, prop->identifier);
else fprintf(f, "NULL}},\n");
-
- fprintf(f, "\tNULL,NULL,\n"); /* PyType - Cant initialize here */
-
fprintf(f, "\t");
rna_print_c_string(f, srna->identifier);
+ fprintf(f, "\t, NULL,NULL\n"); /* PyType - Cant initialize here */
fprintf(f, ", %d, ", srna->flag);
rna_print_c_string(f, srna->name);
fprintf(f, ", ");
@@ -2249,12 +2353,12 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
}
typedef struct RNAProcessItem {
- char *filename;
- char *api_filename;
+ const char *filename;
+ const char *api_filename;
void (*define)(BlenderRNA *brna);
} RNAProcessItem;
-RNAProcessItem PROCESS_ITEMS[]= {
+static RNAProcessItem PROCESS_ITEMS[]= {
{"rna_rna.c", NULL, RNA_def_rna},
{"rna_ID.c", NULL, RNA_def_ID},
{"rna_texture.c", NULL, RNA_def_texture},
@@ -2312,7 +2416,7 @@ RNAProcessItem PROCESS_ITEMS[]= {
{"rna_world.c", NULL, RNA_def_world},
{NULL, NULL}};
-static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_filename)
+static void rna_generate(BlenderRNA *brna, FILE *f, const char *filename, const char *api_filename)
{
StructDefRNA *ds;
PropertyDefRNA *dp;
@@ -2323,6 +2427,7 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi
"#define RNA_RUNTIME\n\n");
fprintf(f, "#include <float.h>\n");
+ fprintf(f, "#include <stdio.h>\n");
fprintf(f, "#include <limits.h>\n");
fprintf(f, "#include <string.h>\n\n");
fprintf(f, "#include <stddef.h>\n\n");
@@ -2331,12 +2436,12 @@ static void rna_generate(BlenderRNA *brna, FILE *f, char *filename, char *api_fi
fprintf(f, "#include \"DNA_scene_types.h\"\n");
fprintf(f, "#include \"BLI_blenlib.h\"\n\n");
+ fprintf(f, "#include \"BLI_utildefines.h\"\n\n");
fprintf(f, "#include \"BKE_context.h\"\n");
fprintf(f, "#include \"BKE_library.h\"\n");
fprintf(f, "#include \"BKE_main.h\"\n");
fprintf(f, "#include \"BKE_report.h\"\n");
- fprintf(f, "#include \"BKE_utildefines.h\"\n\n");
fprintf(f, "#include \"RNA_define.h\"\n");
fprintf(f, "#include \"RNA_types.h\"\n");
@@ -2609,6 +2714,7 @@ static int rna_preprocess(char *outfile)
FILE *file;
char deffile[4096];
int i, status;
+ const char *deps[3]; /* expand as needed */
/* define rna */
brna= RNA_create();
@@ -2649,7 +2755,7 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ replace_if_different(deffile, NULL);
rna_sort(brna);
@@ -2677,7 +2783,12 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ /* avoid unneeded rebuilds */
+ deps[0]= PROCESS_ITEMS[i].filename;
+ deps[1]= PROCESS_ITEMS[i].api_filename;
+ deps[2]= NULL;
+
+ replace_if_different(deffile, deps);
}
/* create RNA_blender.h */
@@ -2701,7 +2812,7 @@ static int rna_preprocess(char *outfile)
}
}
- replace_if_different(deffile);
+ replace_if_different(deffile, NULL);
/* free RNA */
RNA_define_free(brna);
@@ -2726,6 +2837,7 @@ int main(int argc, char **argv)
}
else {
printf("Running makesrna, program versions %s\n", RNA_VERSION_DATE);
+ makesrna_path= argv[0];
return_status= rna_preprocess(argv[1]);
}
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index b9ef92cdca1..dfc2040b0aa 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +29,8 @@
#include "RNA_define.h"
#include "DNA_ID.h"
+#include "DNA_vfont_types.h"
+#include "DNA_object_types.h"
#include "WM_types.h"
@@ -72,6 +74,7 @@ EnumPropertyItem id_type_items[] = {
#include "BKE_library.h"
#include "BKE_animsys.h"
#include "BKE_material.h"
+#include "BKE_depsgraph.h"
/* name functions that ignore the first two ID characters */
void rna_ID_name_get(PointerRNA *ptr, char *value)
@@ -98,7 +101,8 @@ static int rna_ID_name_editable(PointerRNA *ptr)
ID *id= (ID*)ptr->data;
if (GS(id->name) == ID_VF) {
- if (strcmp(id->name+2, "<builtin>")==0)
+ VFont *vf= (VFont *)id;
+ if (strcmp(vf->name, FO_BUILTIN_NAME)==0)
return 0;
}
@@ -188,30 +192,30 @@ void rna_ID_fake_user_set(PointerRNA *ptr, int value)
if(value && !(id->flag & LIB_FAKEUSER)) {
id->flag |= LIB_FAKEUSER;
- id->us++;
+ id_us_plus(id);
}
else if(!value && (id->flag & LIB_FAKEUSER)) {
id->flag &= ~LIB_FAKEUSER;
- id->us--;
+ id_us_min(id);
}
}
-IDProperty *rna_IDPropertyGroup_idprops(PointerRNA *ptr, int create)
+IDProperty *rna_PropertyGroup_idprops(PointerRNA *ptr, int create)
{
return ptr->data;
}
-void rna_IDPropertyGroup_unregister(const bContext *C, StructRNA *type)
+void rna_PropertyGroup_unregister(const bContext *C, StructRNA *type)
{
RNA_struct_free(&BLENDER_RNA, type);
}
-StructRNA *rna_IDPropertyGroup_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+StructRNA *rna_PropertyGroup_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
PointerRNA dummyptr;
/* create dummy pointer */
- RNA_pointer_create(NULL, &RNA_IDPropertyGroup, NULL, &dummyptr);
+ RNA_pointer_create(NULL, &RNA_PropertyGroup, NULL, &dummyptr);
/* validate the python class */
if(validate(&dummyptr, data, NULL) != 0)
@@ -221,15 +225,15 @@ StructRNA *rna_IDPropertyGroup_register(const bContext *C, ReportList *reports,
* just a char pointer, but take care here, also be careful that python
* owns the string pointer which it could potentually free while blender
* is running. */
- if(strlen(identifier) >= sizeof(((IDProperty *)NULL)->name)) {
- BKE_reportf(reports, RPT_ERROR, "registering id property class: '%s' is too long, maximum length is %d.", identifier, sizeof(((IDProperty *)NULL)->name));
+ if(BLI_strnlen(identifier, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
+ BKE_reportf(reports, RPT_ERROR, "registering id property class: '%s' is too long, maximum length is " STRINGIFY(MAX_IDPROP_NAME) ".", identifier);
return NULL;
}
- return RNA_def_struct(&BLENDER_RNA, identifier, "IDPropertyGroup"); // XXX
+ return RNA_def_struct(&BLENDER_RNA, identifier, "PropertyGroup"); // XXX
}
-StructRNA* rna_IDPropertyGroup_refine(PointerRNA *ptr)
+StructRNA* rna_PropertyGroup_refine(PointerRNA *ptr)
{
return ptr->type;
}
@@ -239,19 +243,68 @@ ID *rna_ID_copy(ID *id)
ID *newid;
if(id_copy(id, &newid, 0)) {
- if(newid) newid->us--;
+ if(newid) id_us_min(newid);
return newid;
}
return NULL;
}
+static void rna_ID_update_tag(ID *id, ReportList *reports, int flag)
+{
+ /* XXX, new function for this! */
+ /*if (ob->type == OB_FONT) {
+ Curve *cu = ob->data;
+ freedisplist(&cu->disp);
+ BKE_text_to_curve(sce, ob, CU_LEFT);
+ }*/
+
+ if(flag == 0) {
+ /* pass */
+ }
+ else {
+ /* ensure flag us correct for the type */
+ switch(GS(id->name)) {
+ case ID_OB:
+ if(flag & ~(OB_RECALC_ALL)) {
+ BKE_report(reports, RPT_ERROR, "'refresh' incompatible with Object ID type");
+ return;
+ }
+ break;
+ /* Could add particle updates later */
+/* case ID_PA:
+ if(flag & ~(OB_RECALC_ALL|PSYS_RECALC)) {
+ BKE_report(reports, RPT_ERROR, "'refresh' incompatible with ParticleSettings ID type");
+ return;
+ }
+ break; */
+ default:
+ BKE_report(reports, RPT_ERROR, "This ID type is not compatible with any 'refresh' options");
+ return;
+ }
+ }
+
+ DAG_id_tag_update(id, flag);
+}
+
void rna_ID_user_clear(ID *id)
{
id->us= 0; /* dont save */
id->flag &= ~LIB_FAKEUSER;
}
+static void rna_IDPArray_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty *)ptr->data;
+ rna_iterator_array_begin(iter, IDP_IDPArray(prop), sizeof(IDProperty), prop->len, 0, NULL);
+}
+
+static int rna_IDPArray_length(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty *)ptr->data;
+ return prop->len;
+}
+
#else
static void rna_def_ID_properties(BlenderRNA *brna)
@@ -261,7 +314,8 @@ static void rna_def_ID_properties(BlenderRNA *brna)
/* this is struct is used for holding the virtual
* PropertyRNA's for ID properties */
- srna= RNA_def_struct(brna, "IDProperty", NULL);
+ srna= RNA_def_struct(brna, "PropertyGroupItem", NULL);
+ RNA_def_struct_sdna(srna, "IDProperty");
RNA_def_struct_ui_text(srna, "ID Property", "Property that stores arbitrary, user defined properties");
/* IDP_STRING */
@@ -296,11 +350,16 @@ static void rna_def_ID_properties(BlenderRNA *brna)
prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_struct_type(prop, "IDPropertyGroup");
+ RNA_def_property_struct_type(prop, "PropertyGroup");
prop= RNA_def_property(srna, "collection", PROP_COLLECTION, PROP_NONE);
RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
- RNA_def_property_struct_type(prop, "IDPropertyGroup");
+ RNA_def_property_struct_type(prop, "PropertyGroup");
+
+ prop= RNA_def_property(srna, "idp_array", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, "PropertyGroup");
+ RNA_def_property_collection_funcs(prop, "rna_IDPArray_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_IDPArray_length", 0, 0);
+ RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
// never tested, maybe its useful to have this?
#if 0
@@ -316,11 +375,12 @@ static void rna_def_ID_properties(BlenderRNA *brna)
/* ID property groups > level 0, since level 0 group is merged
* with native RNA properties. the builtin_properties will take
* care of the properties here */
- srna= RNA_def_struct(brna, "IDPropertyGroup", NULL);
+ srna= RNA_def_struct(brna, "PropertyGroup", NULL);
+ RNA_def_struct_sdna(srna, "IDPropertyGroup");
RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties");
- RNA_def_struct_idprops_func(srna, "rna_IDPropertyGroup_idprops");
- RNA_def_struct_register_funcs(srna, "rna_IDPropertyGroup_register", "rna_IDPropertyGroup_unregister");
- RNA_def_struct_refine_func(srna, "rna_IDPropertyGroup_refine");
+ RNA_def_struct_idprops_func(srna, "rna_PropertyGroup_idprops");
+ RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister");
+ RNA_def_struct_refine_func(srna, "rna_PropertyGroup_refine");
/* important so python types can have their name used in list views
* however this isnt prefect because it overrides how python would set the name
@@ -363,6 +423,12 @@ static void rna_def_ID(BlenderRNA *brna)
FunctionRNA *func;
PropertyRNA *prop, *parm;
+ static EnumPropertyItem update_flag_items[] = {
+ {OB_RECALC_OB, "OBJECT", 0, "Object", ""},
+ {OB_RECALC_DATA, "DATA", 0, "Data", ""},
+ {OB_RECALC_TIME, "TIME", 0, "Time", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "ID", NULL);
RNA_def_struct_ui_text(srna, "ID", "Base type for datablocks, defining a unique name, linking from other libraries and garbage collection");
RNA_def_struct_flag(srna, STRUCT_ID|STRUCT_ID_REFCOUNT);
@@ -414,6 +480,10 @@ static void rna_def_ID(BlenderRNA *brna)
func= RNA_def_function(srna, "animation_data_clear", "BKE_free_animdata");
RNA_def_function_ui_description(func, "Clear animation on this this ID.");
+ func= RNA_def_function(srna, "update_tag", "rna_ID_update_tag");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Tag the id to update its display data.");
+ RNA_def_enum_flag(func, "refresh", update_flag_items, 0, "", "Type of updates to perform.");
}
static void rna_def_library(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 2d39cac8c6d..cbde3fe1398 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "DNA_windowmanager_types.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
#include "BLI_ghash.h"
@@ -42,7 +43,7 @@
#include "BKE_idprop.h"
#include "BKE_main.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
@@ -56,9 +57,11 @@
#include "rna_internal.h"
+const PointerRNA PointerRNA_NULL= {{0}};
+
/* Init/Exit */
-void RNA_init()
+void RNA_init(void)
{
StructRNA *srna;
PropertyRNA *prop;
@@ -74,7 +77,7 @@ void RNA_init()
}
}
-void RNA_exit()
+void RNA_exit(void)
{
StructRNA *srna;
@@ -90,8 +93,6 @@ void RNA_exit()
/* Pointer */
-PointerRNA PointerRNA_NULL = {{0}, 0, 0};
-
void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
{
r_ptr->id.data= NULL;
@@ -101,11 +102,10 @@ void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
{
- PointerRNA tmp;
StructRNA *type, *idtype= NULL;
if(id) {
- memset(&tmp, 0, sizeof(tmp));
+ PointerRNA tmp= {{0}};
tmp.data= id;
idtype= rna_ID_refine(&tmp);
@@ -126,14 +126,15 @@ void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
{
- PointerRNA tmp;
+#if 0 /* UNUSED */
StructRNA *idtype= NULL;
if(id) {
- memset(&tmp, 0, sizeof(tmp));
+ PointerRNA tmp= {{0}};
tmp.data= id;
idtype= rna_ID_refine(&tmp);
}
+#endif
r_ptr->id.data= id;
r_ptr->type= type;
@@ -170,9 +171,8 @@ void RNA_blender_rna_pointer_create(PointerRNA *r_ptr)
PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data)
{
- PointerRNA result;
-
if(data) {
+ PointerRNA result;
result.data= data;
result.type= type;
rna_pointer_inherit_id(type, ptr, &result);
@@ -185,11 +185,11 @@ PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *da
else
result.type= type;
}
+ return result;
+ }
+ else {
+ return PointerRNA_NULL;
}
- else
- memset(&result, 0, sizeof(result));
-
- return result;
}
/**/
@@ -235,8 +235,9 @@ IDProperty *rna_idproperty_ui(PropertyRNA *prop)
}
}
- if (idprop)
- return IDP_GetPropertyFromGroup(idprop, ((IDProperty *)prop)->name);
+ if (idprop) {
+ return IDP_GetPropertyTypeFromGroup(idprop, ((IDProperty *)prop)->name, IDP_GROUP);
+ }
return NULL;
}
@@ -359,19 +360,20 @@ static int rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDPro
}
static PropertyRNA *typemap[IDP_NUMTYPES] =
- {(PropertyRNA*)&rna_IDProperty_string,
- (PropertyRNA*)&rna_IDProperty_int,
- (PropertyRNA*)&rna_IDProperty_float,
+ {(PropertyRNA*)&rna_PropertyGroupItem_string,
+ (PropertyRNA*)&rna_PropertyGroupItem_int,
+ (PropertyRNA*)&rna_PropertyGroupItem_float,
NULL, NULL, NULL,
- (PropertyRNA*)&rna_IDProperty_group, NULL,
- (PropertyRNA*)&rna_IDProperty_double};
+ (PropertyRNA*)&rna_PropertyGroupItem_group, NULL,
+ (PropertyRNA*)&rna_PropertyGroupItem_double,
+ (PropertyRNA*)&rna_PropertyGroupItem_idp_array};
static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
- {NULL, (PropertyRNA*)&rna_IDProperty_int_array,
- (PropertyRNA*)&rna_IDProperty_float_array,
+ {NULL, (PropertyRNA*)&rna_PropertyGroupItem_int_array,
+ (PropertyRNA*)&rna_PropertyGroupItem_float_array,
NULL, NULL, NULL,
- (PropertyRNA*)&rna_IDProperty_collection, NULL,
- (PropertyRNA*)&rna_IDProperty_double_array};
+ (PropertyRNA*)&rna_PropertyGroupItem_collection, NULL,
+ (PropertyRNA*)&rna_PropertyGroupItem_double_array};
IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
{
@@ -446,11 +448,10 @@ static const char *rna_ensure_property_description(PropertyRNA *prop)
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- if(idp_ui) { /* TODO, type checking on ID props */
-
- IDProperty *item= IDP_GetPropertyFromGroup(idp_ui, "description");
+ if(idp_ui) {
+ IDProperty *item= IDP_GetPropertyTypeFromGroup(idp_ui, "description", IDP_STRING);
if(item)
- return (char *)item->data.pointer ;
+ return IDP_String(item);
}
return ((IDProperty*)prop)->name; /* XXX - not correct */
@@ -568,11 +569,17 @@ PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
return prop;
}
-const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
+/* low level direct access to type->properties, note this ignores parent classes so should be used with care */
+const struct ListBase *RNA_struct_type_properties(StructRNA *srna)
{
return &srna->cont.properties;
}
+PropertyRNA *RNA_struct_type_find_property(StructRNA *srna, const char *identifier)
+{
+ return BLI_findstring_ptr(&srna->cont.properties, identifier, offsetof(PropertyRNA, identifier));
+}
+
FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
{
#if 1
@@ -609,7 +616,7 @@ FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
#endif
}
-const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
+const struct ListBase *RNA_struct_type_functions(StructRNA *srna)
{
return &srna->functions;
}
@@ -706,8 +713,8 @@ int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[
{
PropertyRNA *rprop= rna_ensure_property(prop);
- if(length && rprop->arraydimension > 1)
- rna_ensure_property_multi_array_length(ptr, prop, length);
+ if(length)
+ rna_ensure_property_multi_array_length(ptr, prop, length);
return rprop->arraydimension;
}
@@ -796,14 +803,15 @@ void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, in
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "min");
- *hardmin= item ? item->data.val : INT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
- item= IDP_GetPropertyFromGroup(idp_ui, "max");
- *hardmax= item ? item->data.val : INT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_INT);
+ *hardmin= item ? IDP_Int(item) : INT_MIN;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_INT);
+ *hardmax= item ? IDP_Int(item) : INT_MAX;
return;
}
@@ -826,17 +834,18 @@ void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin,
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_min");
- *softmin= item ? item->data.val : INT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_INT);
+ *softmin= item ? IDP_Int(item) : INT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_max");
- *softmax= item ? item->data.val : INT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_INT);
+ *softmax= item ? IDP_Int(item) : INT_MAX;
- item= IDP_GetPropertyFromGroup(idp_ui, "step");
- *step= item ? item->data.val : 1;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_INT);
+ *step= item ? IDP_Int(item) : 1;
return;
}
@@ -862,14 +871,15 @@ void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "min");
- *hardmin= item ? *(double*)&item->data.val : FLT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_DOUBLE);
+ *hardmin= item ? IDP_Double(item) : FLT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "max");
- *hardmax= item ? *(double*)&item->data.val : FLT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_DOUBLE);
+ *hardmax= item ? IDP_Double(item) : FLT_MAX;
return;
}
@@ -892,20 +902,21 @@ void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *soft
if(prop->magic != RNA_MAGIC) {
/* attempt to get the local ID values */
IDProperty *idp_ui= rna_idproperty_ui(prop);
- IDProperty *item;
- if(idp_ui) { /* TODO, type checking on ID props */
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_min");
- *softmin= item ? *(double*)&item->data.val : FLT_MIN;
+ if(idp_ui) {
+ IDProperty *item;
- item= IDP_GetPropertyFromGroup(idp_ui, "soft_max");
- *softmax= item ? *(double*)&item->data.val : FLT_MAX;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_DOUBLE);
+ *softmin= item ? IDP_Double(item) : FLT_MIN;
- item= IDP_GetPropertyFromGroup(idp_ui, "step");
- *step= item ? *(double*)&item->data.val : 1.0f;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_DOUBLE);
+ *softmax= item ? IDP_Double(item) : FLT_MAX;
- item= IDP_GetPropertyFromGroup(idp_ui, "precision");
- *precision= item ? *(double*)&item->data.val : 3.0f;
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_DOUBLE);
+ *step= item ? IDP_Double(item) : 1.0f;
+
+ item= IDP_GetPropertyTypeFromGroup(idp_ui, "precision", IDP_DOUBLE);
+ *precision= item ? IDP_Double(item) : 3.0f;
return;
}
@@ -1240,6 +1251,29 @@ int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
return 0;
}
+
+/* this function is to check if its possible to create a valid path from the ID
+ * its slow so dont call in a loop */
+int RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop)
+{
+ char *path= RNA_path_from_ID_to_property(ptr, prop);
+ int ret= 0;
+
+ if(path) {
+ PointerRNA id_ptr;
+ PointerRNA r_ptr;
+ PropertyRNA *r_prop;
+
+ RNA_id_pointer_create(ptr->id.data, &id_ptr);
+ RNA_path_resolve(&id_ptr, path, &r_ptr, &r_prop);
+ ret= (prop == r_prop);
+ MEM_freeN(path);
+ }
+
+ return ret;
+}
+
+
static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerRNA *ptr, PropertyRNA *prop)
{
int is_rna = (prop->magic == RNA_MAGIC);
@@ -1261,12 +1295,20 @@ static void rna_property_update(bContext *C, Main *bmain, Scene *scene, PointerR
else {
/* WARNING! This is so property drivers update the display!
* not especially nice */
- DAG_id_flush_update(ptr->id.data, OB_RECALC_ALL);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_main_add_notifier(NC_WINDOW, NULL);
}
}
+/* must keep in sync with 'rna_property_update'
+ * note, its possible this returns a false positive in the case of PROP_CONTEXT_UPDATE
+ * but this isnt likely to be a performance problem. */
+int RNA_property_update_check(PropertyRNA *prop)
+{
+ return (prop->magic != RNA_MAGIC || prop->update || prop->noteflag);
+}
+
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
{
rna_property_update(C, CTX_data_main(C), CTX_data_scene(C), ptr, prop);
@@ -1965,18 +2007,15 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
return RNA_property_pointer_get(ptr, prop);
}
else {
- PointerRNA result;
-
- memset(&result, 0, sizeof(result));
- return result;
+ return PointerRNA_NULL;
}
}
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
{
- IDProperty *idprop;
+ /*IDProperty *idprop;*/
- if((idprop=rna_idproperty_check(&prop, ptr))) {
+ if((/*idprop=*/ rna_idproperty_check(&prop, ptr))) {
/* not supported */
}
else {
@@ -1991,11 +2030,17 @@ void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr
}
}
+PointerRNA RNA_property_pointer_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop))
+{
+ //PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ return PointerRNA_NULL; // FIXME: there has to be a way...
+}
+
void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
{
- IDProperty *idprop;
+ /*IDProperty *idprop;*/
- if((idprop=rna_idproperty_check(&prop, ptr))) {
+ if((/*idprop=*/rna_idproperty_check(&prop, ptr))) {
/* already exists */
}
else if(prop->flag & PROP_IDPROPERTY) {
@@ -2066,7 +2111,7 @@ void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, Collectio
void RNA_property_collection_next(CollectionPropertyIterator *iter)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(iter->prop);
if(iter->idprop) {
rna_iterator_array_next(iter);
@@ -2080,7 +2125,7 @@ void RNA_property_collection_next(CollectionPropertyIterator *iter)
void RNA_property_collection_end(CollectionPropertyIterator *iter)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(iter->prop);
if(iter->idprop)
rna_iterator_array_end(iter);
@@ -2272,12 +2317,11 @@ int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, Poi
int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(prop);
if(cprop->lookupint) {
/* we have a callback defined, use it */
- *r_ptr= cprop->lookupint(ptr, key);
- return (r_ptr->data != NULL);
+ return cprop->lookupint(ptr, key, r_ptr);
}
else {
/* no callback defined, just iterate and find the nth item */
@@ -2302,12 +2346,11 @@ int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int k
int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(prop);
if(cprop->lookupstring) {
/* we have a callback defined, use it */
- *r_ptr= cprop->lookupstring(ptr, key);
- return (r_ptr->data != NULL);
+ return cprop->lookupstring(ptr, key, r_ptr);
}
else {
/* no callback defined, compare with name properties if they exist */
@@ -2421,7 +2464,7 @@ int RNA_raw_type_sizeof(RawPropertyType type)
}
}
-static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
+static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
{
StructRNA *ptype;
PointerRNA itemptr;
@@ -2723,12 +2766,12 @@ RawPropertyType RNA_property_raw_type(PropertyRNA *prop)
return prop->rawtype;
}
-int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
+int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len)
{
return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0);
}
-int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
+int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, const char *propname, void *array, RawPropertyType type, int len)
{
return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
}
@@ -2791,6 +2834,10 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
if(ptr == NULL)
length= 0;
+ else if (length == 0) {
+ ptr= NULL;
+ itemsize= 0;
+ }
internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
internal->ptr= ptr;
@@ -2798,7 +2845,8 @@ void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int i
internal->endptr= ((char*)ptr)+length*itemsize;
internal->itemsize= itemsize;
internal->skip= skip;
-
+ internal->length= length;
+
iter->internal= internal;
iter->valid= (internal->ptr != internal->endptr);
@@ -2863,6 +2911,7 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
{
const char *p;
char *buf;
+ char quote= '\0';
int i, j, len, escape;
len= 0;
@@ -2874,9 +2923,30 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
p= *path;
- escape= 0;
- while(*p && (*p != ']' || escape)) {
- escape= (*p == '\\');
+ /* 2 kinds of lookups now, quoted or unquoted */
+ quote= *p;
+
+ if(quote != '"')
+ quote= 0;
+
+ if(quote==0) {
+ while(*p && (*p != ']')) {
+ len++;
+ p++;
+ }
+ }
+ else {
+ escape= 0;
+ /* skip the first quote */
+ len++;
+ p++;
+ while(*p && (*p != quote || escape)) {
+ escape= (*p == '\\');
+ len++;
+ p++;
+ }
+
+ /* skip the last quoted char to get the ']' */
len++;
p++;
}
@@ -2906,7 +2976,7 @@ static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int
/* copy string, taking into account escaped ] */
if(bracket) {
for(p=*path, i=0, j=0; i<len; i++, p++) {
- if(*p == '\\' && *(p+1) == ']');
+ if(*p == '\\' && *(p+1) == quote);
else buf[j++]= *p;
}
@@ -2996,6 +3066,7 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
if(nextptr.data) {
curptr= nextptr;
prop= NULL; /* now we have a PointerRNA, the prop is our parent so forget it */
+ if(index) *index= -1;
}
else
return 0;
@@ -3004,29 +3075,32 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
case PROP_COLLECTION:
if(*path) {
if(*path == '[') {
- /* resolve the lookup with [] brackets */
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
-
- if(!token)
- return 0;
-
- /* check for "" to see if it is a string */
- if(rna_token_strip_quotes(token)) {
- RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
- }
- else {
- /* otherwise do int lookup */
- intkey= atoi(token);
- RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
- }
+ /* resolve the lookup with [] brackets */
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+
+ if(!token)
+ return 0;
+
+ /* check for "" to see if it is a string */
+ if(rna_token_strip_quotes(token)) {
+ RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
+ }
+ else {
+ /* otherwise do int lookup */
+ intkey= atoi(token);
+ if(intkey==0 && (token[0] != '0' || token[1] != '\0')) {
+ return 0; /* we can be sure the fixedbuf was used in this case */
+ }
+ RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
+ }
if(token != fixedbuf) {
- MEM_freeN(token);
+ MEM_freeN(token);
}
}
else {
PointerRNA c_ptr;
-
+
/* ensure we quit on invalid values */
nextptr.data = NULL;
@@ -3038,11 +3112,12 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
if(nextptr.data) {
curptr= nextptr;
prop= NULL; /* now we have a PointerRNA, the prop is our parent so forget it */
+ if(index) *index= -1;
}
else
return 0;
}
-
+
break;
default:
if (index==NULL)
@@ -3051,25 +3126,76 @@ int RNA_path_resolve_full(PointerRNA *ptr, const char *path, PointerRNA *r_ptr,
*index= -1;
if (*path) {
- if (*path=='[') {
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+ int index_arr[RNA_MAX_ARRAY_DIMENSION]= {0};
+ int len[RNA_MAX_ARRAY_DIMENSION];
+ const int dim= RNA_property_array_dimension(&curptr, prop, len);
+ int i, temp_index;
- /* check for "" to see if it is a string */
- if(rna_token_strip_quotes(token)) {
- *index= RNA_property_array_item_index(prop, *(token+1));
+ for(i=0; i<dim; i++) {
+ temp_index= -1;
+
+ /* multi index resolve */
+ if (*path=='[') {
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
+
+ if(token==NULL) {
+ /* invalid syntax blah[] */
+ return 0;
+ }
+ /* check for "" to see if it is a string */
+ else if(rna_token_strip_quotes(token)) {
+ temp_index= RNA_property_array_item_index(prop, *(token+1));
+ }
+ else {
+ /* otherwise do int lookup */
+ temp_index= atoi(token);
+
+ if(temp_index==0 && (token[0] != '0' || token[1] != '\0')) {
+ if(token != fixedbuf) {
+ MEM_freeN(token);
+ }
+
+ return 0;
+ }
+ }
}
- else {
- /* otherwise do int lookup */
- *index= atoi(token);
+ else if(dim==1) {
+ /* location.x || scale.X, single dimension arrays only */
+ token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
+ if(token==NULL) {
+ /* invalid syntax blah.. */
+ return 0;
+ }
+ temp_index= RNA_property_array_item_index(prop, *token);
+ }
+
+ if(token != fixedbuf) {
+ MEM_freeN(token);
}
+
+ /* out of range */
+ if(temp_index < 0 || temp_index >= len[i])
+ return 0;
+
+ index_arr[i]= temp_index;
+ /* end multi index resolve */
}
- else {
- token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
- *index= RNA_property_array_item_index(prop, *token);
+
+ /* arrays always contain numbers so further values are not valid */
+ if(*path) {
+ return 0;
}
+ else {
+ int totdim= 1;
+ int flat_index= 0;
- if(token != fixedbuf)
- MEM_freeN(token);
+ for(i=dim-1; i>=0; i--) {
+ flat_index += index_arr[i] * totdim;
+ totdim *= len[i];
+ }
+
+ *index= flat_index;
+ }
}
}
}
@@ -3119,7 +3245,7 @@ char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int
BLI_dynstr_append(dynstr, "\"");
}
else {
- sprintf(appendstr, "%d", intkey);
+ BLI_snprintf(appendstr, sizeof(appendstr), "%d", intkey);
BLI_dynstr_append(dynstr, appendstr);
}
@@ -3179,6 +3305,143 @@ char *RNA_path_back(const char *path)
return result;
}
+/* generic path search func
+ * if its needed this could also reference the IDProperty direct */
+typedef struct IDP_Chain {
+ struct IDP_Chain *up; /* parent member, reverse and set to child for path conversion. */
+
+ const char *name;
+ int index;
+
+} IDP_Chain;
+
+static char *rna_idp_path_create(IDP_Chain *child_link)
+{
+ DynStr *dynstr= BLI_dynstr_new();
+ char *path;
+ short first= TRUE;
+
+ int tot= 0;
+ IDP_Chain *link= child_link;
+
+ /* reverse the list */
+ IDP_Chain *link_prev;
+ link_prev= NULL;
+ while(link) {
+ IDP_Chain *link_next= link->up;
+ link->up= link_prev;
+ link_prev= link;
+ link= link_next;
+ tot++;
+ }
+
+ for(link= link_prev; link; link= link->up) {
+ /* pass */
+ if(link->index >= 0) {
+ BLI_dynstr_appendf(dynstr, first ? "%s[%d]" : ".%s[%d]", link->name, link->index);
+ }
+ else {
+ BLI_dynstr_appendf(dynstr, first ? "%s" : ".%s", link->name);
+ }
+
+ first= FALSE;
+ }
+
+ path= BLI_dynstr_get_cstring(dynstr);
+ BLI_dynstr_free(dynstr);
+
+ if(*path=='\0') {
+ MEM_freeN(path);
+ path= NULL;
+ }
+
+ return path;
+}
+
+static char *rna_idp_path(PointerRNA *ptr, IDProperty *haystack, IDProperty *needle, IDP_Chain *parent_link)
+{
+ char *path= NULL;
+ IDP_Chain link;
+
+ IDProperty *iter;
+ int i;
+
+ BLI_assert(haystack->type == IDP_GROUP);
+
+ link.up= parent_link;
+ link.name= NULL;
+ link.index= -1;
+
+ for (i=0, iter= haystack->data.group.first; iter; iter= iter->next, i++) {
+ if(needle == iter) { /* found! */
+ link.name= iter->name;
+ path= rna_idp_path_create(&link);
+ break;
+ }
+ else {
+ if(iter->type == IDP_GROUP) {
+ /* ensure this is RNA */
+ PointerRNA child_ptr= RNA_pointer_get(ptr, iter->name);
+ if(child_ptr.type) {
+ link.name= iter->name;
+ if((path= rna_idp_path(&child_ptr, iter, needle, &link))) {
+ break;
+ }
+ }
+ }
+ else if (iter->type == IDP_IDPARRAY) {
+ PropertyRNA *prop= RNA_struct_find_property(ptr, iter->name);
+ if(prop && prop->type == PROP_COLLECTION) {
+ IDProperty *array= IDP_IDPArray(iter);
+ if(needle >= array && needle < (iter->len + array)) { /* found! */
+ link.name= iter->name;
+ link.index= (int)(needle - array);
+ path= rna_idp_path_create(&link);
+ break;
+ }
+ else {
+ int i;
+ link.name= iter->name;
+ for(i= 0; i < iter->len; i++, array++) {
+ PointerRNA child_ptr;
+ if(RNA_property_collection_lookup_int(ptr, prop, i, &child_ptr)) {
+ link.index= i;
+ if((path= rna_idp_path(&child_ptr, array, needle, &link))) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return path;
+}
+
+static char *rna_path_from_ID_to_idpgroup(PointerRNA *ptr)
+{
+ PointerRNA id_ptr;
+ IDProperty *haystack;
+ IDProperty *needle;
+
+ BLI_assert(ptr->id.data != NULL);
+
+ /* TODO, Support Bones/PoseBones. no pointers stored to the bones from here, only the ID. See example in [#25746]
+ * unless this is added only way to find this is to also search all bones and pose bones of an armature or object */
+ RNA_id_pointer_create(ptr->id.data, &id_ptr);
+
+ haystack= RNA_struct_idprops(&id_ptr, FALSE);
+ if(haystack) { /* can fail when called on bones */
+ needle= ptr->data;
+ return rna_idp_path(&id_ptr, haystack, needle, NULL);
+ }
+ else {
+ return NULL;
+ }
+}
+
char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
{
char *ptrpath=NULL;
@@ -3206,6 +3469,10 @@ char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
else
return NULL; // can't do anything about this case yet...
}
+ else if (RNA_struct_is_a(ptr->type, &RNA_PropertyGroup)) {
+ /* special case, easier to deal with here then in ptr->type->path() */
+ return rna_path_from_ID_to_idpgroup(ptr);
+ }
else
return NULL;
}
@@ -3524,12 +3791,9 @@ PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
return RNA_property_pointer_get(ptr, prop);
}
else {
- PointerRNA result;
-
printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
- memset(&result, 0, sizeof(result));
- return result;
+ return PointerRNA_NULL;
}
}
@@ -3725,17 +3989,44 @@ char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
const char *identifier;
int val = RNA_property_enum_get(ptr, prop);
- if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
+ if(RNA_property_flag(prop) & PROP_ENUM_FLAG) {
+ /* represent as a python set */
+ EnumPropertyItem *item= NULL;
+ int free;
+
+ BLI_dynstr_append(dynstr, "{");
+
+ RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
+ if(item) {
+ short is_first= TRUE;
+ for (; item->identifier; item++) {
+ if(item->identifier[0] && item->value & val) {
+ BLI_dynstr_appendf(dynstr, is_first ? "'%s'" : ", '%s'", item->identifier);
+ is_first= FALSE;
+ }
+ }
+
+ if(free) {
+ MEM_freeN(item);
+ }
+ }
+
+ BLI_dynstr_append(dynstr, "}");
+ }
+ else if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
BLI_dynstr_appendf(dynstr, "'%s'", identifier);
}
else {
- BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
+ BLI_dynstr_append(dynstr, "'<UNKNOWN ENUM>'");
}
break;
}
case PROP_POINTER:
{
- BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
+ PointerRNA tptr= RNA_property_pointer_get(ptr, prop);
+ cstring= RNA_pointer_as_string(&tptr);
+ BLI_dynstr_append(dynstr, cstring);
+ MEM_freeN(cstring);
break;
}
case PROP_COLLECTION:
@@ -3923,8 +4214,6 @@ int RNA_parameter_list_ret_count(ParameterList *parms)
void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
{
- PropertyType ptype;
-
RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
iter->parms= parms;
@@ -3934,15 +4223,12 @@ void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
if(iter->valid) {
iter->size= rna_parameter_size_alloc(iter->parm);
- iter->data= (((char*)iter->parms->data)+iter->offset);
- ptype= RNA_property_type(iter->parm);
+ iter->data= (((char*)iter->parms->data)); /* +iter->offset, always 0 */
}
}
void RNA_parameter_list_next(ParameterIterator *iter)
{
- PropertyType ptype;
-
iter->offset+= iter->size;
iter->parm= iter->parm->next;
iter->valid= iter->parm != NULL;
@@ -3950,7 +4236,6 @@ void RNA_parameter_list_next(ParameterIterator *iter)
if(iter->valid) {
iter->size= rna_parameter_size_alloc(iter->parm);
iter->data= (((char*)iter->parms->data)+iter->offset);
- ptype= RNA_property_type(iter->parm);
}
}
@@ -3990,7 +4275,7 @@ void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void
RNA_parameter_get(parms, parm, value);
}
-void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
+void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, const void *value)
{
ParameterIterator iter;
@@ -4006,7 +4291,7 @@ void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
RNA_parameter_list_end(&iter);
}
-void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value)
+void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, const void *value)
{
PropertyRNA *parm;
@@ -4132,7 +4417,7 @@ static int rna_function_format_array_length(const char *format, int ofs, int fle
for (; ofs<flen && format[ofs]!=']' && idx<sizeof(*lenbuf)-1; idx++, ofs++)
lenbuf[idx]= format[ofs];
- if (ofs<flen && format[ofs++]==']') {
+ if (ofs<flen && format[ofs+1]==']') {
/* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
lenbuf[idx]= '\0';
return atoi(lenbuf);
@@ -4546,9 +4831,15 @@ int RNA_property_reset(PointerRNA *ptr, PropertyRNA *prop, int index)
return 1;
}
- //case PROP_POINTER:
+ case PROP_POINTER:
+ {
+ PointerRNA value= RNA_property_pointer_get_default(ptr, prop);
+ RNA_property_pointer_set(ptr, prop, value);
+ return 1;
+ }
+
default:
- // FIXME: many of the other types such as strings and pointers need this implemented too!
+ // FIXME: are there still any cases that haven't been handled? comment out "default" block to check :)
return 0;
}
}
@@ -4651,4 +4942,3 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
return 0;
}
-
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 42ddf340f12..0cc52c93b95 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -59,7 +59,7 @@ static void rna_ActionGroup_channels_next(CollectionPropertyIterator *iter)
iter->valid= (internal->link != NULL);
}
-static bActionGroup *rna_Action_groups_new(bAction *act, char name[])
+static bActionGroup *rna_Action_groups_new(bAction *act, const char name[])
{
return action_groups_add_new(act, name);
}
@@ -89,7 +89,7 @@ static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionG
MEM_freeN(agrp);
}
-static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, char *data_path, int index, char *group)
+static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const char *data_path, int index, const char *group)
{
if(group && group[0]=='\0') group= NULL;
@@ -128,7 +128,7 @@ static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *
}
}
-static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports, char name[])
+static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports, const char name[])
{
TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
marker->flag= 1;
@@ -141,7 +141,7 @@ static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports
static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, TimeMarker *marker)
{
if (!BLI_remlink_safe(&act->markers, marker)) {
- BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in action '%s'", marker->name, act->id.name+2);
+ BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in Action '%s'", marker->name, act->id.name+2);
return;
}
@@ -149,6 +149,41 @@ static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, Ti
MEM_freeN(marker);
}
+static PointerRNA rna_Action_active_pose_marker_get(PointerRNA *ptr)
+{
+ bAction *act= (bAction*)ptr->data;
+ return rna_pointer_inherit_refine(ptr, &RNA_TimelineMarker, BLI_findlink(&act->markers, act->active_marker-1));
+}
+
+static void rna_Action_active_pose_marker_set(PointerRNA *ptr, PointerRNA value)
+{
+ bAction *act= (bAction*)ptr->data;
+ act->active_marker= BLI_findindex(&act->markers, value.data) + 1;
+}
+
+static int rna_Action_active_pose_marker_index_get(PointerRNA *ptr)
+{
+ bAction *act= (bAction*)ptr->data;
+ return MAX2(act->active_marker-1, 0);
+}
+
+static void rna_Action_active_pose_marker_index_set(PointerRNA *ptr, int value)
+{
+ bAction *act= (bAction*)ptr->data;
+ act->active_marker= value+1;
+}
+
+static void rna_Action_active_pose_marker_index_range(PointerRNA *ptr, int *min, int *max)
+{
+ bAction *act= (bAction*)ptr->data;
+
+ *min= 0;
+ *max= BLI_countlist(&act->markers)-1;
+ *max= MAX2(0, *max);
+}
+
+
+
static void rna_Action_frame_range_get(PointerRNA *ptr,float *values)
{
calc_action_range(ptr->id.data, values, values+1, 1);
@@ -235,6 +270,12 @@ static void rna_def_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+ prop= RNA_def_property(srna, "show_lattices", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOLAT);
+ RNA_def_property_ui_text(prop, "Display Lattices", "Include visualization of Lattice related Animation data");
+ RNA_def_property_ui_icon(prop, ICON_LATTICE_DATA, 0);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
prop= RNA_def_property(srna, "show_cameras", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NOCAM);
RNA_def_property_ui_text(prop, "Display Camera", "Include visualization of Camera related Animation data");
@@ -399,8 +440,8 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_string(func, "data_path", "", 0, "Data Path", "FCurve data path to use.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
- parm= RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into.");
+ RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
+ RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into.");
parm= RNA_def_pointer(func, "fcurve", "FCurve", "", "Newly created fcurve");
RNA_def_function_return(func, parm);
@@ -416,6 +457,7 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
+ PropertyRNA *prop;
FunctionRNA *func;
PropertyRNA *parm;
@@ -439,6 +481,17 @@ static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "TimelineMarker");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, "rna_Action_active_pose_marker_get", "rna_Action_active_pose_marker_set", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Active Pose Marker", "Active pose marker for this Action");
+
+ prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "active_marker");
+ RNA_def_property_int_funcs(prop, "rna_Action_active_pose_marker_index_get", "rna_Action_active_pose_marker_index_set", "rna_Action_active_pose_marker_index_range");
+ RNA_def_property_ui_text(prop, "Active Pose Marker Index", "Index of active pose marker");
}
static void rna_def_action(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_action_api.c b/source/blender/makesrna/intern/rna_action_api.c
index 3d661f50115..7c26b4d40fa 100644
--- a/source/blender/makesrna/intern/rna_action_api.c
+++ b/source/blender/makesrna/intern/rna_action_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -44,7 +44,7 @@
void RNA_api_action(StructRNA *srna)
{
-
+
}
#endif
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index a4becb87e28..248d878e9e0 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include "RNA_define.h"
+#include "RNA_access.h"
#include "rna_internal.h"
#include "DNA_constraint_types.h"
@@ -34,6 +35,8 @@
#include "WM_types.h"
+#include "BLI_utildefines.h"
+
/* Always keep in alphabetical order */
EnumPropertyItem actuator_type_items[] ={
{ACT_ACTION, "ACTION", 0, "Action", ""},
@@ -41,7 +44,7 @@ EnumPropertyItem actuator_type_items[] ={
{ACT_CAMERA, "CAMERA", 0, "Camera", ""},
{ACT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""},
{ACT_EDIT_OBJECT, "EDIT_OBJECT", 0, "Edit Object", ""},
- {ACT_IPO, "F-Curve", 0, "F-Curve", ""},
+ {ACT_IPO, "FCURVE", 0, "F-Curve", ""},
{ACT_2DFILTER, "FILTER_2D", 0, "Filter 2D", ""},
{ACT_GAME, "GAME", 0, "Game", ""},
{ACT_MESSAGE, "MESSAGE", 0, "Message", ""},
@@ -116,6 +119,29 @@ static void rna_Actuator_type_set(struct PointerRNA *ptr, int value)
}
}
+static void rna_ConstraintActuator_type_set(struct PointerRNA *ptr, int value)
+{
+ bActuator *act= (bActuator *)ptr->data;
+ bConstraintActuator *ca= act->data;
+ if (value != ca->type)
+ {
+ ca->type = value;
+ switch (ca->type) {
+ case ACT_CONST_TYPE_ORI:
+ /* negative axis not supported in the orientation mode */
+ if (ELEM3(ca->mode, ACT_CONST_DIRNX,ACT_CONST_DIRNY, ACT_CONST_DIRNZ))
+ ca->mode = ACT_CONST_NONE;
+ break;
+
+ case ACT_CONST_TYPE_LOC:
+ case ACT_CONST_TYPE_DIST:
+ case ACT_CONST_TYPE_FH:
+ default:
+ break;
+ }
+ }
+}
+
static float rna_ConstraintActuator_limitmin_get(struct PointerRNA *ptr)
{
bActuator *act = (bActuator*)ptr->data;
@@ -283,7 +309,6 @@ static void rna_ConstraintActuator_spring_set(struct PointerRNA *ptr, float valu
*fp = value;
}
-
/* ConstraintActuator uses the same property for Material and Property.
Therefore we need to clear the property when "use_material_detect" mode changes */
static void rna_Actuator_constraint_detect_material_set(struct PointerRNA *ptr, int value)
@@ -323,6 +348,33 @@ static void rna_FcurveActuator_force_set(struct PointerRNA *ptr, int value)
ia->flag &= ~ACT_IPOFORCE;
}
+
+static void rna_ObjectActuator_type_set(struct PointerRNA *ptr, int value)
+{
+ bActuator *act= (bActuator *)ptr->data;
+ bObjectActuator *oa = act->data;
+ if (value != oa->type)
+ {
+ oa->type = value;
+ switch (oa->type) {
+ case ACT_OBJECT_NORMAL:
+ memset(oa, 0, sizeof(bObjectActuator));
+ oa->flag = ACT_FORCE_LOCAL|ACT_TORQUE_LOCAL|ACT_DLOC_LOCAL|ACT_DROT_LOCAL;
+ oa->type = ACT_OBJECT_NORMAL;
+ break;
+
+ case ACT_OBJECT_SERVO:
+ memset(oa, 0, sizeof(bObjectActuator));
+ oa->flag = ACT_LIN_VEL_LOCAL;
+ oa->type = ACT_OBJECT_SERVO;
+ oa->forcerot[0] = 30.0f;
+ oa->forcerot[1] = 0.5f;
+ oa->forcerot[2] = 0.0f;
+ break;
+ }
+ }
+}
+
static void rna_ObjectActuator_integralcoefficient_set(struct PointerRNA *ptr, float value)
{
bActuator *act = (bActuator*)ptr->data;
@@ -360,7 +412,7 @@ EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *fre
Object *ob= NULL;
int totitem= 0;
- if (ptr->type == &RNA_Actuator) {
+ if (ptr->type==&RNA_Actuator || RNA_struct_is_a(ptr->type, &RNA_Actuator)){
ob = (Object *)ptr->id.data;
} else {
/* can't use ob from ptr->id.data because that enum is also used by operators */
@@ -497,6 +549,7 @@ static void rna_def_action_actuator(BlenderRNA *brna)
static EnumPropertyItem prop_type_items[] ={
{ACT_ACTION_PLAY, "PLAY", 0, "Play", ""},
+ {ACT_ACTION_PINGPONG, "PINGPONG", 0, "Ping Pong", ""},
{ACT_ACTION_FLIPPER, "FLIPPER", 0, "Flipper", ""},
{ACT_ACTION_LOOP_STOP, "LOOPSTOP", 0, "Loop Stop", ""},
{ACT_ACTION_LOOP_END, "LOOPEND", 0, "Loop End", ""},
@@ -513,7 +566,7 @@ static void rna_def_action_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "play_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Action type", "Action playback type");
+ RNA_def_property_ui_text(prop, "Action Type", "Action playback type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
@@ -535,16 +588,16 @@ static void rna_def_action_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "Start frame", "");
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "End frame", "");
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "frame_blend_in", PROP_INT, PROP_NONE);
@@ -590,6 +643,7 @@ static void rna_def_object_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ObjectActuator_type_set", NULL);
RNA_def_property_ui_text(prop, "Motion Type", "Specify the motion system");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -669,7 +723,7 @@ static void rna_def_object_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Loc", "Sets the location");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "offset_rotation", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "offset_rotation", PROP_FLOAT, PROP_EULER);
RNA_def_property_float_sdna(prop, NULL, "drot");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 2);
@@ -781,15 +835,15 @@ static void rna_def_fcurve_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "F-Curve Type", "Specify the way you want to play the animation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_ui_range(prop, 1, MAXFRAME, 1, 1);
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 1.0, MAXFRAME, 100, 2);
RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -998,7 +1052,7 @@ static void rna_def_property_actuator(BlenderRNA *brna)
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
- RNA_def_property_ui_text(prop, "Value", "The value to use, use \"\" around strings");
+ RNA_def_property_ui_text(prop, "Value", "The name of the property or the value to use (use \"\" around strings)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* Copy Mode */
@@ -1048,6 +1102,14 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
+ static EnumPropertyItem prop_direction_pos_items[] ={
+ {ACT_CONST_NONE, "NONE", 0, "None", ""},
+ {ACT_CONST_DIRPX, "DIRPX", 0, "X axis", ""},
+ {ACT_CONST_DIRPY, "DIRPY", 0, "Y axis", ""},
+ {ACT_CONST_DIRPZ, "DIRPZ", 0, "Z axis", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
srna= RNA_def_struct(brna, "ConstraintActuator", "Actuator");
RNA_def_struct_ui_text(srna, "Constraint Actuator", "Actuator to handle Constraints");
RNA_def_struct_sdna_from(srna, "bConstraintActuator", "data");
@@ -1055,6 +1117,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ConstraintActuator_type_set", NULL);
RNA_def_property_ui_text(prop, "Constraints Mode", "The type of the constraint");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -1089,7 +1152,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Max", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "damping", PROP_INT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "damping", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "damp");
RNA_def_property_ui_range(prop, 0, 100, 1, 1);
RNA_def_property_ui_text(prop, "Damping", "Damping factor: time constant (in frame) of low pass filter");
@@ -1126,13 +1189,19 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Time", "Maximum activation time in frame, 0 for unlimited");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "damping_rotation", PROP_INT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "damping_rotation", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "rotdamp");
RNA_def_property_ui_range(prop, 0, 100, 1, 1);
- RNA_def_property_ui_text(prop, "rotDamp", "Use a different damping for orientation");
+ RNA_def_property_ui_text(prop, "RotDamp", "Use a different damping for orientation");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_CONST_TYPE_ORI */
+ prop= RNA_def_property(srna, "direction_axis_pos", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, prop_direction_pos_items);
+ RNA_def_property_ui_text(prop, "Direction", "Select the axis to be aligned along the reference direction");
+ RNA_def_property_update(prop, NC_LOGIC, NULL);
+
prop= RNA_def_property(srna, "rotation_max", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "maxrot");
RNA_def_property_array(prop, 3);
@@ -1140,16 +1209,16 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Reference Direction", "Reference Direction");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "minloc[0]");
- RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
- RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_range(prop, 0.0, 180.0);
+ RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to maintain with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "maxloc[0]");
- RNA_def_property_ui_range(prop, 0.0, 180.0, 10, 2);
- RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_range(prop, 0.0, 180.0);
+ RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle allowed with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_CONST_TYPE_FH */
@@ -1159,7 +1228,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Distance", "Height of the Fh area");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_spring_get", "rna_ConstraintActuator_spring_set", NULL);
RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
RNA_def_property_ui_text(prop, "Fh", "Spring force within the Fh area");
@@ -1331,8 +1400,8 @@ static void rna_def_scene_actuator(BlenderRNA *brna)
{ACT_SCENE_RESTART, "RESTART", 0, "Restart", ""},
{ACT_SCENE_SET, "SET", 0, "Set Scene", ""},
{ACT_SCENE_CAMERA, "CAMERA", 0, "Set Camera", ""},
- {ACT_SCENE_ADD_FRONT, "ADDFRONT", 0, "Add OverlayScene", ""},
- {ACT_SCENE_ADD_BACK, "ADDBACK", 0, "Add BackgroundScene", ""},
+ {ACT_SCENE_ADD_FRONT, "ADDFRONT", 0, "Add Overlay Scene", ""},
+ {ACT_SCENE_ADD_BACK, "ADDBACK", 0, "Add Background Scene", ""},
{ACT_SCENE_REMOVE, "REMOVE", 0, "Remove Scene", ""},
{ACT_SCENE_SUSPEND, "SUSPEND", 0, "Suspend Scene", ""},
{ACT_SCENE_RESUME, "RESUME", 0, "Resume Scene", ""},
@@ -1384,16 +1453,16 @@ static void rna_def_random_actuator(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_distribution_items[] ={
- {ACT_RANDOM_BOOL_CONST, "RESTART", 0, "Bool Constant", ""},
- {ACT_RANDOM_BOOL_UNIFORM, "SET", 0, "Bool Uniform", ""},
- {ACT_RANDOM_BOOL_BERNOUILLI, "CAMERA", 0, "Bool Bernoulli", ""},
- {ACT_RANDOM_INT_CONST, "ADDFRONT", 0, "Int Constant", ""},
- {ACT_RANDOM_INT_UNIFORM, "ADDBACK", 0, "Int Uniform", ""},
- {ACT_RANDOM_INT_POISSON, "REMOVE", 0, "Int Poisson", ""},
- {ACT_RANDOM_FLOAT_CONST, "SUSPEND", 0, "Float Constant", ""},
- {ACT_RANDOM_FLOAT_UNIFORM, "RESUME", 0, "Float Uniform", ""},
- {ACT_RANDOM_FLOAT_NORMAL, "RESUME", 0, "Float Normal", ""},
- {ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL, "RESUME", 0, "Float Neg. Exp.", ""},
+ {ACT_RANDOM_BOOL_CONST, "BOOL_CONSTANT", 0, "Bool Constant", ""},
+ {ACT_RANDOM_BOOL_UNIFORM, "BOOL_UNIFORM", 0, "Bool Uniform", ""},
+ {ACT_RANDOM_BOOL_BERNOUILLI, "BOOL_BERNOUILLI", 0, "Bool Bernouilli", ""},
+ {ACT_RANDOM_INT_CONST, "INT_CONSTANT", 0, "Int Constant", ""},
+ {ACT_RANDOM_INT_UNIFORM, "INT_UNIFORM", 0, "Int Uniform", ""},
+ {ACT_RANDOM_INT_POISSON, "INT_POISSON", 0, "Int Poisson", ""},
+ {ACT_RANDOM_FLOAT_CONST, "FLOAT_CONSTANT", 0, "Float Constant", ""},
+ {ACT_RANDOM_FLOAT_UNIFORM, "FLOAT_UNIFORM", 0, "Float Uniform", ""},
+ {ACT_RANDOM_FLOAT_NORMAL, "FLOAT_NORMAL", 0, "Float Normal", ""},
+ {ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL, "FLOAT_NEGATIVE_EXPONENTIAL", 0, "Float Neg. Exp.", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "RandomActuator", "Actuator");
@@ -1422,7 +1491,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
/* ACT_RANDOM_BOOL_CONST */
prop= RNA_def_property(srna, "use_always_true", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "int_arg_1", 1);
- RNA_def_property_ui_text(prop, "Always true", "Always false or always true");
+ RNA_def_property_ui_text(prop, "Always True", "Always false or always true");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_RANDOM_BOOL_UNIFORM */
@@ -1499,7 +1568,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "half_life_time", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "float_arg_1");
RNA_def_property_range(prop, -1000.0, 1000.0);
- RNA_def_property_ui_text(prop, "Half-life time", "Negative exponential dropoff");
+ RNA_def_property_ui_text(prop, "Half-Life Time", "Negative exponential dropoff");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1540,7 +1609,7 @@ static void rna_def_message_actuator(BlenderRNA *brna)
/* ACT_MESG_PROP */
prop= RNA_def_property(srna, "body_property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "body");
- RNA_def_property_ui_text(prop, "Propname", "The message body will be set by the Property Value");
+ RNA_def_property_ui_text(prop, "Prop Name", "The message body will be set by the Property Value");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1550,14 +1619,14 @@ static void rna_def_game_actuator(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem prop_type_items[] ={
-// {ACT_GAME_LOAD, "LOAD", 0, "Load game", ""},
-// {ACT_GAME_START, "START", 0, "Start loaded game", ""},
+// {ACT_GAME_LOAD, "LOAD", 0, "Load Game", ""},
+// {ACT_GAME_START, "START", 0, "Start Loaded Game", ""},
// keeping the load/start hacky for compatibility with 2.49
// ideally we could use ACT_GAME_START again and do a do_version()
- {ACT_GAME_LOAD, "START", 0, "Start new game", ""},
- {ACT_GAME_RESTART, "RESTART", 0, "Restart this game", ""},
- {ACT_GAME_QUIT, "QUIT", 0, "Quit this game", ""},
+ {ACT_GAME_LOAD, "START", 0, "Start Game From File", ""},
+ {ACT_GAME_RESTART, "RESTART", 0, "Restart Game", ""},
+ {ACT_GAME_QUIT, "QUIT", 0, "Quit Game", ""},
{ACT_GAME_SAVECFG, "SAVECFG", 0, "Save bge.logic.globalDict", ""},
{ACT_GAME_LOADCFG, "LOADCFG", 0, "Load bge.logic.globalDict", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1590,7 +1659,7 @@ static void rna_def_visibility_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_visible", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ACT_VISIBILITY_INVISIBLE);
- RNA_def_property_ui_text(prop, "Visible", "Set the objects visible. Initialized from the objects render restriction toggle (access in the outliner)");
+ RNA_def_property_ui_text(prop, "Visible", "Set the objects visible. Initialized from the object render restriction toggle in physics button");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "use_occlusion", PROP_BOOLEAN, PROP_NONE);
@@ -1629,13 +1698,13 @@ static void rna_def_twodfilter_actuator(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Filter2DActuator", "Actuator");
- RNA_def_struct_ui_text(srna, "2D Filter Actuator", "Actuator to ..");
+ RNA_def_struct_ui_text(srna, "Filter 2D Actuator", "Actuator to apply screen graphic effects");
RNA_def_struct_sdna_from(srna, "bTwoDFilterActuator", "data");
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "2D Filter Type", "");
+ RNA_def_property_ui_text(prop, "Filter 2D Type", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "glsl_shader", PROP_POINTER, PROP_NONE);
@@ -1699,7 +1768,7 @@ static void rna_def_parent_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_ghost", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ACT_PARENT_GHOST);
- RNA_def_property_ui_text(prop, "Ghost", "Make this object ghost while parented (only if not compound)");
+ RNA_def_property_ui_text(prop, "Ghost", "Make this object ghost while parented");
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -1710,6 +1779,7 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
static EnumPropertyItem prop_type_items[] ={
{ACT_ACTION_PLAY, "PLAY", 0, "Play", ""},
+ {ACT_ACTION_PINGPONG, "PINGPONG", 0, "Ping Pong", ""},
{ACT_ACTION_FLIPPER, "FLIPPER", 0, "Flipper", ""},
{ACT_ACTION_LOOP_STOP, "LOOPSTOP", 0, "Loop Stop", ""},
{ACT_ACTION_LOOP_END, "LOOPEND", 0, "Loop End", ""},
@@ -1726,7 +1796,7 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Action type", "Action playback type");
+ RNA_def_property_ui_text(prop, "Action Type", "Action playback type");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
@@ -1748,16 +1818,16 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Property", "Use this property to define the Action position");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "sta");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "Start frame", "");
+ prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sta");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "end");
- RNA_def_property_range(prop, 0, MAXFRAME);
- RNA_def_property_ui_text(prop, "End frame", "");
+ prop= RNA_def_property(srna, "frame_end", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "end");
+ RNA_def_property_ui_range(prop, 0.0, MAXFRAME, 100, 2);
+ RNA_def_property_ui_text(prop, "End Frame", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "frame_blend_in", PROP_INT, PROP_NONE);
@@ -1857,7 +1927,7 @@ static void rna_def_armature_actuator(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "subtarget");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Secondary Target", "Set weight of this constraint");
+ RNA_def_property_ui_text(prop, "Secondary Target", "Set this object as the secondary target of the constraint (only IK polar target at the moment)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_actuator_api.c b/source/blender/makesrna/intern/rna_actuator_api.c
index b61f9e252a6..e587b6f86e4 100644
--- a/source/blender/makesrna/intern/rna_actuator_api.c
+++ b/source/blender/makesrna/intern/rna_actuator_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c
index 92f146770c2..0214def4d07 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,8 @@
#include "ED_keyframing.h"
+#include "WM_types.h"
+
/* exported for use in API */
EnumPropertyItem keyingset_path_grouping_items[] = {
{KSP_GROUP_NAMED, "NAMED", 0, "Named Group", ""},
@@ -48,6 +50,9 @@ EnumPropertyItem keyingset_path_grouping_items[] = {
#ifdef RNA_RUNTIME
#include "BKE_animsys.h"
+#include "BKE_nla.h"
+
+#include "WM_api.h"
static int rna_AnimData_action_editable(PointerRNA *ptr)
{
@@ -60,12 +65,6 @@ static int rna_AnimData_action_editable(PointerRNA *ptr)
return 1;
}
-static void rna_AnimData_action_set(PointerRNA *ptr, PointerRNA value)
-{
- AnimData *adt= (AnimData*)(ptr->data);
- adt->action= value.data;
-}
-
/* ****************************** */
/* wrapper for poll callback */
@@ -86,7 +85,7 @@ static int RKS_POLL_rna_internal(KeyingSetInfo *ksi, bContext *C)
RNA_parameter_set_lookup(&list, "context", &C);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
/* read the result */
RNA_parameter_get_lookup(&list, "ok", &ret);
@@ -113,7 +112,7 @@ static void RKS_ITER_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks
RNA_parameter_set_lookup(&list, "ks", &ks);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -135,7 +134,7 @@ static void RKS_GEN_rna_internal(KeyingSetInfo *ksi, bContext *C, KeyingSet *ks,
RNA_parameter_set_lookup(&list, "data", data);
/* execute the function */
- ksi->ext.call(&ptr, func, &list);
+ ksi->ext.call(C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -163,11 +162,11 @@ static void rna_KeyingSetInfo_unregister(const bContext *C, StructRNA *type)
ANIM_keyingset_info_unregister(C, ksi);
}
-static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_KeyingSetInfo_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
KeyingSetInfo dummyksi = {0};
KeyingSetInfo *ksi;
- PointerRNA dummyptr;
+ PointerRNA dummyptr = {{0}};
int have_function[3];
/* setup dummy type info to store static properties in */
@@ -179,7 +178,7 @@ static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *repo
return NULL;
if (strlen(identifier) >= sizeof(dummyksi.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering keying set info class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyksi.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering keying set info class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyksi.idname));
return NULL;
}
@@ -204,9 +203,9 @@ static StructRNA *rna_KeyingSetInfo_register(const bContext *C, ReportList *repo
ksi->poll= (have_function[0])? RKS_POLL_rna_internal: NULL;
ksi->iter= (have_function[1])? RKS_ITER_rna_internal: NULL;
ksi->generate= (have_function[2])? RKS_GEN_rna_internal: NULL;
-
+
/* add and register with other info as needed */
- ANIM_keyingset_info_register(C, ksi);
+ ANIM_keyingset_info_register(ksi);
/* return the struct-rna added */
return ksi->ext.srna;
@@ -327,7 +326,7 @@ static PointerRNA rna_KeyingSet_typeinfo_get(PointerRNA *ptr)
static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *reports,
- ID *id, char rna_path[], int index, int group_method, char group_name[])
+ ID *id, const char rna_path[], int index, int group_method, const char group_name[])
{
KS_Path *ksp = NULL;
short flag = 0;
@@ -387,6 +386,36 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports)
}
}
+/* needs wrapper function to push notifier */
+static NlaTrack *rna_NlaTrack_new(AnimData *adt, bContext *C, NlaTrack *track)
+{
+ NlaTrack *new_track = add_nlatrack(adt, track);
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_ADDED, NULL);
+
+ return new_track;
+}
+
+static void rna_NlaTrack_remove(AnimData *adt, bContext *C, NlaTrack *track)
+{
+ free_nlatrack(&adt->nla_tracks, track);
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_REMOVED, NULL);
+}
+
+static PointerRNA rna_NlaTrack_active_get(PointerRNA *ptr)
+{
+ AnimData *adt= (AnimData*)ptr->data;
+ NlaTrack *track= BKE_nlatrack_find_active(&adt->nla_tracks);
+ return rna_pointer_inherit_refine(ptr, &RNA_NlaTrack, track);
+}
+
+static void rna_NlaTrack_active_set(PointerRNA *ptr, PointerRNA value)
+{
+ AnimData *adt= (AnimData*)ptr->data;
+ NlaTrack *track= (NlaTrack*)value.data;
+ BKE_nlatrack_set_active(&adt->nla_tracks, track);
+}
#else
@@ -394,21 +423,18 @@ static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports)
static void rna_def_common_keying_flags(StructRNA *srna, short reg)
{
PropertyRNA *prop;
-
- prop= RNA_def_property(srna, "use_insertkey_needed", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_NEEDED);
- RNA_def_property_ui_text(prop, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves");
- if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
-
- prop= RNA_def_property(srna, "use_insertkey_visual", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_MATRIX);
- RNA_def_property_ui_text(prop, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'");
- if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
-
- prop= RNA_def_property(srna, "use_insertkey_xyz_to_rgb", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "keyingflag", INSERTKEY_XYZ2RGB);
- RNA_def_property_ui_text(prop, "F-Curve Colors - XYZ to RGB", "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis");
- if (reg) RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+
+ static EnumPropertyItem keying_flag_items[] = {
+ {INSERTKEY_NEEDED, "INSERTKEY_NEEDED", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves"},
+ {INSERTKEY_MATRIX, "INSERTKEY_VISUAL", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'"},
+ {INSERTKEY_XYZ2RGB, "INSERTKEY_XYZ_TO_RGB", 0, "F-Curve Colors - XYZ to RGB", "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis"},
+ {0, NULL, 0, NULL, NULL}};
+
+ prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "keyingflag");
+ RNA_def_property_enum_items(prop, keying_flag_items);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL|PROP_ENUM_FLAG);
+ RNA_def_property_ui_text(prop, "Options", "Keying set options");
}
/* --- */
@@ -432,7 +458,7 @@ static void rna_def_keyingset_info(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
/* Name */
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -491,6 +517,7 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_ksPath_id_editable");
RNA_def_property_pointer_funcs(prop, NULL, NULL, "rna_ksPath_id_typef", NULL);
RNA_def_property_ui_text(prop, "ID-Block", "ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only)");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
prop= RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "idtype");
@@ -498,30 +525,36 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_enum_default(prop, ID_OB);
RNA_def_property_enum_funcs(prop, NULL, "rna_ksPath_id_type_set", NULL);
RNA_def_property_ui_text(prop, "ID Type", "Type of ID-block that can be used");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Group */
prop= RNA_def_property(srna, "group", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Group Name", "Name of Action Group to assign setting(s) for this path to");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Grouping */
prop= RNA_def_property(srna, "group_method", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "groupmode");
RNA_def_property_enum_items(prop, keyingset_path_grouping_items);
RNA_def_property_ui_text(prop, "Grouping Method", "Method used to define which Group-name to use");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Path + Array Index */
prop= RNA_def_property(srna, "data_path", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ksPath_RnaPath_get", "rna_ksPath_RnaPath_length", "rna_ksPath_RnaPath_set");
RNA_def_property_ui_text(prop, "Data Path", "Path to property setting");
RNA_def_struct_name_property(srna, prop); // XXX this is the best indicator for now...
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL);
prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific setting if applicable");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Flags */
prop= RNA_def_property(srna, "use_entire_array", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KSP_FLAG_WHOLE_ARRAY);
RNA_def_property_ui_text(prop, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used");
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
/* Keyframing Settings */
rna_def_common_keying_flags(srna, 0);
@@ -535,7 +568,7 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
-
+
PropertyRNA *prop;
RNA_def_property_srna(cprop, "KeyingSetPaths");
@@ -558,10 +591,10 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_string(func, "data_path", "", 256, "Data-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
RNA_def_property_flag(parm, PROP_REQUIRED);
/* index (defaults to -1 for entire array) */
- parm=RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX);
+ RNA_def_int(func, "index", -1, -1, INT_MAX, "Index", "The index of the destination property (i.e. axis of Location/Rotation/etc.), or -1 for the entire array.", 0, INT_MAX);
/* grouping */
- parm=RNA_def_enum(func, "group_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use.");
- parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
+ RNA_def_enum(func, "group_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use.");
+ RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
/* Remove Path */
@@ -604,6 +637,7 @@ static void rna_def_keyingset(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_ui_icon(srna, ICON_KEY_HLT); // TODO: we need a dedicated icon
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_RENAME, NULL);
/* KeyingSetInfo (Type Info) for Builtin Sets only */
prop= RNA_def_property(srna, "type_info", PROP_POINTER, PROP_NONE);
@@ -617,7 +651,7 @@ static void rna_def_keyingset(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "KeyingSetPath");
RNA_def_property_ui_text(prop, "Paths", "Keying Set Paths to define settings that get keyframed together");
rna_def_keyingset_paths(brna, prop);
-
+
/* Flags */
prop= RNA_def_property(srna, "is_path_absolute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -634,6 +668,42 @@ static void rna_def_keyingset(BlenderRNA *brna)
/* --- */
+static void rna_api_animdata_nla_tracks(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ PropertyRNA *prop;
+
+ RNA_def_property_srna(cprop, "NlaTracks");
+ srna= RNA_def_struct(brna, "NlaTracks", NULL);
+ RNA_def_struct_sdna(srna, "AnimData");
+ RNA_def_struct_ui_text(srna, "NLA Tracks", "Collection of NLA Tracks");
+
+ func = RNA_def_function(srna, "new", "rna_NlaTrack_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Add a new NLA Tracks");
+ RNA_def_pointer(func, "prev", "NlaTrack", "", "NLA Track to add the new one after.");
+ /* return type */
+ parm = RNA_def_pointer(func, "track", "NlaTrack", "", "New NLA Track.");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_NlaTrack_remove");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+ RNA_def_function_ui_description(func, "Remove a NLA Track.");
+ parm = RNA_def_pointer(func, "track", "NlaTrack", "", "NLA Track to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "NlaTrack");
+ RNA_def_property_pointer_funcs(prop, "rna_NlaTrack_active_get", "rna_NlaTrack_active_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active Constraint", "Active Object constraint");
+ /* XXX: should (but doesn't) update the active track in the NLA window */
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL);
+}
+
void rna_def_animdata_common(StructRNA *srna)
{
PropertyRNA *prop;
@@ -657,31 +727,35 @@ void rna_def_animdata(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "nla_tracks", NULL);
RNA_def_property_struct_type(prop, "NlaTrack");
RNA_def_property_ui_text(prop, "NLA Tracks", "NLA Tracks (i.e. Animation Layers)");
+
+ rna_api_animdata_nla_tracks(brna, prop);
/* Active Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
- RNA_def_property_pointer_funcs(prop, NULL, "rna_AnimData_action_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE); /* this flag as well as the dynamic test must be defined for this to be editable... */
RNA_def_property_editable_func(prop, "rna_AnimData_action_editable");
RNA_def_property_ui_text(prop, "Action", "Active Action for this datablock");
+ RNA_def_property_update(prop, NC_ANIMATION, NULL); /* this will do? */
-
/* Active Action Settings */
prop= RNA_def_property(srna, "action_extrapolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_extendmode");
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Action Extrapolation", "Action to take for gaps past the Active Action's range (when evaluating with NLA)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "act_blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Action Blending", "Method used for combining Active Action's result with result of NLA stack");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_influence", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "act_influence");
RNA_def_property_float_default(prop, 1.0f);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Action Influence", "Amount the Active Action contributes to the result of the NLA stack");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Drivers */
prop= RNA_def_property(srna, "drivers", PROP_COLLECTION, PROP_NONE);
@@ -693,6 +767,7 @@ void rna_def_animdata(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ADT_NLA_EVAL_OFF);
RNA_def_property_ui_text(prop, "NLA Evaluation Enabled", "NLA stack is evaluated when evaluating this block");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
}
/* --- */
diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c
index 1e62e10f211..6feb86ff45d 100644
--- a/source/blender/makesrna/intern/rna_animation_api.c
+++ b/source/blender/makesrna/intern/rna_animation_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c
index bbc1c841e47..91a5659f9aa 100644
--- a/source/blender/makesrna/intern/rna_animviz.c
+++ b/source/blender/makesrna/intern/rna_animviz.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_animviz.c 25824 2010-01-08 02:54:33Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index f2abe690218..a86a7bb2c18 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,6 +24,8 @@
#include <stdlib.h>
+#include "BLI_math.h"
+
#include "RNA_define.h"
#include "rna_internal.h"
@@ -37,8 +39,6 @@
#ifdef RNA_RUNTIME
-#include "BLI_math.h"
-
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_idprop.h"
@@ -51,7 +51,7 @@ static void rna_Armature_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
//WM_main_add_notifier(NC_OBJECT|ND_POSE, NULL);
}
@@ -66,12 +66,16 @@ static void rna_Armature_act_bone_set(PointerRNA *ptr, PointerRNA value)
}
else {
if(value.id.data != arm) {
- /* raise an error! */
- }
- else {
- arm->act_bone= value.data;
- arm->act_bone->flag |= BONE_SELECTED;
+ Object *ob = (Object *)value.id.data;
+
+ if(GS(ob->id.name)!=ID_OB || (ob->data != arm)) {
+ printf("ERROR: armature set active bone - new active doesn't come from this armature\n");
+ return;
+ }
}
+
+ arm->act_bone= value.data;
+ arm->act_bone->flag |= BONE_SELECTED;
}
}
@@ -93,7 +97,7 @@ static void rna_Armature_act_edit_bone_set(PointerRNA *ptr, PointerRNA value)
}
}
-EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, char *name)
+EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, const char *name)
{
if(arm->edbo==NULL) {
BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant add an editbone.", arm->id.name+2);
@@ -117,6 +121,20 @@ void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone
ED_armature_edit_bone_remove(arm, ebone);
}
+static void rna_Armature_update_layers(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bArmature *arm= ptr->id.data;
+ Object *ob;
+
+ /* proxy lib exception, store it here so we can restore layers on file
+ load, since it would otherwise get lost due to being linked data */
+ for(ob = bmain->object.first; ob; ob=ob->id.next)
+ if(ob->data == arm && ob->pose)
+ ob->pose->proxy_layer = arm->layer;
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, arm);
+}
+
static void rna_Armature_redraw_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
@@ -385,6 +403,9 @@ static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
#else
+static int rna_matrix_dimsize_4x4[]= {4, 4};
+static int rna_matrix_dimsize_3x3[]= {3, 3};
+
static void rna_def_bone_common(StructRNA *srna, int editbone)
{
PropertyRNA *prop;
@@ -414,7 +435,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_ui_text(prop, "Connected", "When bone has a parent, bone's head is struck to the parent's tail");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "use_hinge", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_inherit_rotation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone inherits rotation or scale from parent bone");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
@@ -468,16 +489,18 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_ui_text(prop, "Envelope Deform Weight", "Bone deformation weight (for Envelope deform only)");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
- prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_UNSIGNED);
if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
RNA_def_property_float_sdna(prop, NULL, "rad_head");
//RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
+ RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
RNA_def_property_ui_text(prop, "Envelope Head Radius", "Radius of head of bone (for Envelope deform only)");
- prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_UNSIGNED);
if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
RNA_def_property_float_sdna(prop, NULL, "rad_tail");
//RNA_def_property_range(prop, 0, 1000); // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
+ RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
RNA_def_property_ui_text(prop, "Envelope Tail Radius", "Radius of tail of bone (for Envelope deform only)");
/* b-bones deform settings */
@@ -498,6 +521,18 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "B-Bone Ease Out", "Length of second Bezier Handle (for B-Bones only)");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop= RNA_def_property(srna, "bbone_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "xwidth");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_text(prop, "B-Bone Display X Width", "B-Bone X size");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+ prop= RNA_def_property(srna, "bbone_z", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "zwidth");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_text(prop, "B-Bone Display Z Width", "B-Bone Z size");
+ RNA_def_property_update(prop, 0, "rna_Armature_update_data");
}
// err... bones should not be directly edited (only editbones should be...)
@@ -537,38 +572,59 @@ static void rna_def_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+ prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
+ RNA_def_property_ui_text(prop, "Select Head", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+ prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
+ RNA_def_property_ui_text(prop, "Select Tail", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* XXX better matrix descriptions possible (Arystan) */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "bone_mat");
- RNA_def_property_array(prop, 9);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_3x3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix");
prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "arm_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Bone Armature-Relative Matrix", "4x4 bone matrix relative to armature");
prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "tail");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
prop= RNA_def_property(srna, "tail_local", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "arm_tail");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Armature-Relative Tail", "Location of tail end of the bone relative to armature");
prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "head");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone relative to its parent");
prop= RNA_def_property(srna, "head_local", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "arm_head");
RNA_def_property_array(prop, 3);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature");
+
+ RNA_api_bone(srna);
}
static void rna_def_edit_bone(BlenderRNA *brna)
@@ -591,21 +647,25 @@ static void rna_def_edit_bone(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Parent", "Parent edit bone (in same Armature)");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
- prop= RNA_def_property(srna, "roll", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "roll", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_float_sdna(prop, NULL, "roll");
+ RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 0.1, 2);
RNA_def_property_ui_text(prop, "Roll", "Bone rotation around head-tail axis");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "head");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "tail");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
rna_def_bone_common(srna, 1);
@@ -613,32 +673,37 @@ static void rna_def_edit_bone(BlenderRNA *brna)
prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when in Edit Mode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
RNA_def_property_ui_text(prop, "Lock", "Bone is not able to be transformed when in Edit Mode");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
RNA_def_property_ui_text(prop, "Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
RNA_def_property_ui_text(prop, "Head Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
RNA_def_property_ui_text(prop, "Tail Select", "");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
/* calculated and read only, not actual data access */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
//RNA_def_property_float_sdna(prop, NULL, ""); // doesnt access any real data
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space)");
@@ -770,6 +835,7 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_enum_items(prop, prop_pose_position_items);
RNA_def_property_ui_text(prop, "Pose Position", "Show armature in binding pose or final posed state");
RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+ RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
@@ -794,7 +860,7 @@ static void rna_def_armature(BlenderRNA *brna)
RNA_def_property_array(prop, 32);
RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility");
RNA_def_property_boolean_funcs(prop, NULL, "rna_Armature_layer_set");
- RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_redraw_data");
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_update_layers");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
/* layer protection */
diff --git a/source/blender/makesrna/intern/rna_armature_api.c b/source/blender/makesrna/intern/rna_armature_api.c
index cd78bd6e578..00c0342ac3e 100644
--- a/source/blender/makesrna/intern/rna_armature_api.c
+++ b/source/blender/makesrna/intern/rna_armature_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -36,16 +36,17 @@
#include <stddef.h>
#include "BLI_blenlib.h"
+#include "BKE_armature.h"
+void rna_EditBone_align_roll(EditBone *ebo, float no[3])
+{
+ ebo->roll= ED_rollBoneToVector(ebo, no, FALSE);
+}
-void rna_EditBone_align_roll(EditBone *ebo, float *no)
+float rna_Bone_do_envelope(Bone *bone, float *vec)
{
- if(!is_zero_v3(no)) {
- float normal[3];
- copy_v3_v3(normal, no);
- normalize_v3(normal);
- ebo->roll= ED_rollBoneToVector(ebo, normal);
- }
+ float scale = (bone->flag & BONE_MULT_VG_ENV) == BONE_MULT_VG_ENV ? bone->weight : 1.0f;
+ return distfactor_to_bone(vec, bone->arm_head, bone->arm_tail, bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
}
#else
@@ -61,4 +62,18 @@ void RNA_api_armature_edit_bone(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
}
+void RNA_api_bone(StructRNA *srna)
+{
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ func= RNA_def_function(srna, "evaluate_envelope", "rna_Bone_do_envelope");
+ RNA_def_function_ui_description(func, "Calculate bone envelope at given point.");
+ parm= RNA_def_float_vector_xyz(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "Position in 3d space to evaluate", -FLT_MAX, FLT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return value */
+ parm= RNA_def_float(func, "factor", 0, -FLT_MAX, FLT_MAX, "Factor", "Envelope factor", -FLT_MAX, FLT_MAX);
+ RNA_def_function_return(func, parm);
+}
+
#endif
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index 3afa135d079..1a7f7f99c8f 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -78,10 +78,10 @@ static void rna_Boids_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
@@ -92,10 +92,10 @@ static void rna_Boids_reset_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
DAG_scene_sort(bmain, scene);
@@ -175,6 +175,26 @@ static void rna_BoidState_active_boid_rule_index_set(struct PointerRNA *ptr, int
}
}
+static int particle_id_check(PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ return (GS(id->name) == ID_PA);
+}
+
+static char *rna_BoidSettings_path(PointerRNA *ptr)
+{
+ BoidSettings *boids = (BoidSettings *)ptr->data;
+
+ if(particle_id_check(ptr)) {
+ ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+
+ if (part->boids == boids)
+ return BLI_sprintfN("boids");
+ }
+ return NULL;
+}
+
static PointerRNA rna_BoidSettings_active_boid_state_get(PointerRNA *ptr)
{
BoidSettings *boids= (BoidSettings*)ptr->data;
@@ -466,6 +486,7 @@ static void rna_def_boid_settings(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "BoidSettings", NULL);
+ RNA_def_struct_path_func(srna, "rna_BoidSettings_path");
RNA_def_struct_ui_text(srna, "Boid Settings", "Settings for boid physics");
prop= RNA_def_property(srna, "land_smooth", PROP_FLOAT, PROP_NONE);
@@ -480,6 +501,12 @@ static void rna_def_boid_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Banking", "Amount of rotation around velocity vector on turns");
RNA_def_property_update(prop, 0, "rna_Boids_reset");
+ prop= RNA_def_property(srna, "pitch", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "pitch");
+ RNA_def_property_range(prop, 0.0, 2.0);
+ RNA_def_property_ui_text(prop, "Pitch", "Amount of rotation around side vector");
+ RNA_def_property_update(prop, 0, "rna_Boids_reset");
+
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Height", "Boid height relative to particle size");
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 83d40a3802b..3f8e38a99c6 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,7 +37,6 @@
#include "IMB_imbuf.h"
-
#include "WM_types.h"
static EnumPropertyItem prop_direction_items[]= {
@@ -93,12 +92,11 @@ EnumPropertyItem brush_imagepaint_tool_items[] = {
#include "BKE_texture.h"
#include "BKE_brush.h"
#include "BKE_icons.h"
-
#include "BKE_paint.h"
#include "WM_api.h"
-static void rna_Brush_reset_icon(Brush *br, char *type)
+static void rna_Brush_reset_icon(Brush *br, const char *UNUSED(type))
{
ID *id = &br->id;
@@ -495,6 +493,13 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Plane Trim", "If a vertex is further from offset plane than this then it is not affected");
RNA_def_property_update(prop, 0, "rna_Brush_update");
+ prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "height");
+ RNA_def_property_float_default(prop, 0.5f);
+ RNA_def_property_range(prop, 0, 1.0f);
+ RNA_def_property_ui_text(prop, "Brush Height", "Affectable height of brush (layer height for layer tool, i.e.)");
+ RNA_def_property_update(prop, 0, "rna_Brush_update");
+
prop= RNA_def_property(srna, "texture_sample_bias", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "texture_sample_bias");
RNA_def_property_float_default(prop, 0);
@@ -766,7 +771,7 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- srna= RNA_def_struct(brna, "OperatorStrokeElement", "IDPropertyGroup");
+ srna= RNA_def_struct(brna, "OperatorStrokeElement", "PropertyGroup");
RNA_def_struct_ui_text(srna, "Operator Stroke Element", "");
prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ);
@@ -792,6 +797,11 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna)
prop= RNA_def_property(srna, "time", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_ui_text(prop, "Time", "");
+
+ /* used for Grease Pencil sketching sessions */
+ prop= RNA_def_property(srna, "is_start", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_IDPROPERTY);
+ RNA_def_property_ui_text(prop, "Is Stroke Start", "");
/* XXX: Tool (this will be for pressing a modifier key for a different brush,
e.g. switching to a Smooth brush in the middle of the stroke */
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index 9d82c472882..ad5fdbe9aba 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -99,11 +99,12 @@ void RNA_def_camera(BlenderRNA *brna)
prop= RNA_def_property(srna, "lens", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "lens");
RNA_def_property_range(prop, 1.0f, 5000.0f);
- RNA_def_property_ui_text(prop, "Lens", "Perspective Camera lens value in millimeters");
+ RNA_def_property_ui_text(prop, "Focal Length", "Perspective Camera lens value in millimeters");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Angle", "Perspective Camera lens field of view in degrees");
RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL); /* only for deg/rad conversion */
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
@@ -116,8 +117,8 @@ void RNA_def_camera(BlenderRNA *brna)
prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "drawsize");
- RNA_def_property_range(prop, 0.1f, 1000.0f);
- RNA_def_property_ui_range(prop, 0.01, 100, 1, 1);
+ RNA_def_property_range(prop, 0.01f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
RNA_def_property_ui_text(prop, "Draw Size", "Apparent size of the Camera object in the 3D View");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index 71e95248512..ed40eb95620 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -48,7 +48,19 @@ static void rna_cloth_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
+}
+
+static void rna_cloth_pinning_changed(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Object *ob= (Object*)ptr->id.data;
+// ClothSimSettings *settings = (ClothSimSettings*)ptr->data;
+ ClothModifierData *clmd = (ClothModifierData*)modifiers_findByType(ob, eModifierType_Cloth);
+
+ cloth_free_modifier(clmd);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -59,7 +71,7 @@ static void rna_cloth_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
settings->reset = 1;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -256,7 +268,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group_mass", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_ClothSettings_mass_vgroup_get", "rna_ClothSettings_mass_vgroup_length", "rna_ClothSettings_mass_vgroup_set");
RNA_def_property_ui_text(prop, "Mass Vertex Group", "Vertex Group for pinning of vertices");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
+ RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
prop= RNA_def_property(srna, "gravity", PROP_FLOAT, PROP_ACCELERATION);
RNA_def_property_array(prop, 3);
@@ -276,7 +288,7 @@ static void rna_def_cloth_sim_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_pin_cloth", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", CLOTH_SIMSETTINGS_FLAG_GOAL);
RNA_def_property_ui_text(prop, "Pin Cloth", "Enable pinning of cloth vertices to other objects/positions");
- RNA_def_property_update(prop, 0, "rna_cloth_update");
+ RNA_def_property_update(prop, 0, "rna_cloth_pinning_changed");
prop= RNA_def_property(srna, "pin_stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "goalspring");
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 89f3e459105..64f7c02da44 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -242,7 +242,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
}
break;
@@ -253,7 +253,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
for(node=ntree->nodes.first; node; node=node->next) {
if (ELEM3(node->type, SH_NODE_VALTORGB, CMP_NODE_VALTORGB, TEX_NODE_VALTORGB)) {
- ED_node_generic_update(bmain, scene, ntree, node);
+ ED_node_generic_update(bmain, ntree, node);
}
}
}
@@ -262,7 +262,7 @@ static void rna_ColorRamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE, tex);
}
break;
@@ -433,7 +433,7 @@ static void rna_def_color_ramp_element(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Color", "");
RNA_def_property_update(prop, 0, "rna_ColorRamp_update");
- prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "position", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "pos");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Position", "");
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index cf5db930898..9570d817726 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -79,7 +79,7 @@ EnumPropertyItem space_pchan_items[] = {
EnumPropertyItem space_object_items[] = {
{0, "WORLD", 0, "World Space", ""},
- {1, "LOCAL", 0, "Local (Without Parent) Space", ""},
+ {1, "LOCAL", 0, "Local Space", ""},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem constraint_ik_type_items[] ={
@@ -96,8 +96,6 @@ EnumPropertyItem constraint_ik_axisref_items[] ={
#ifdef RNA_RUNTIME
-#include <stdio.h>
-
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_constraint.h"
@@ -324,6 +322,47 @@ static void rna_SplineIKConstraint_joint_bindings_set(PointerRNA *ptr, const flo
memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
}
+/* Array Get/Set Functions for RigidBodyJointConstraint Min/Max Cone Limits */
+void rna_RigidBodyJointConstraint_limit_cone_min_get(PointerRNA *ptr, float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->minLimit;
+
+ values[0]= limit[3];
+ values[1]= limit[4];
+ values[2]= limit[5];
+}
+
+static void rna_RigidBodyJointConstraint_limit_cone_min_set(PointerRNA *ptr, const float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->minLimit;
+
+ limit[3]= values[0];
+ limit[4]= values[1];
+ limit[5]= values[2];
+}
+
+void rna_RigidBodyJointConstraint_limit_cone_max_get(PointerRNA *ptr, float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->maxLimit;
+
+ values[0]= limit[3];
+ values[1]= limit[4];
+ values[2]= limit[5];
+}
+
+static void rna_RigidBodyJointConstraint_limit_cone_max_set(PointerRNA *ptr, const float values[3])
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
+ float *limit = data->maxLimit;
+
+ limit[3]= values[0];
+ limit[4]= values[1];
+ limit[5]= values[2];
+}
+
#else
EnumPropertyItem constraint_distance_items[] = {
@@ -852,13 +891,14 @@ static void rna_def_constraint_transform_like(BlenderRNA *brna)
srna= RNA_def_struct(brna, "CopyTransformsConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Copy Transforms Constraint", "Copies all the transforms of the target");
- RNA_def_struct_sdna_from(srna, "bTransLikeConstraint", "data");
prop= RNA_def_property(srna, "head_tail", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, "bConstraint", "headtail");
RNA_def_property_ui_text(prop, "Head/Tail", "Target along length of bone: Head=0, Tail=1");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+ RNA_def_struct_sdna_from(srna, "bTransLikeConstraint", "data");
+
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "tar");
RNA_def_property_ui_text(prop, "Target", "Target Object");
@@ -877,12 +917,12 @@ static void rna_def_constraint_minmax(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem minmax_items[] = {
- {LOCLIKE_X, "FLOOR_X", 0, "X", ""},
- {LOCLIKE_Y, "FLOOR_Y", 0, "Y", ""},
- {LOCLIKE_Z, "FLOOR_Z", 0, "Z", ""},
- {LOCLIKE_X_INVERT, "FLOOR_NEGATIVE_X", 0, "-X", ""},
- {LOCLIKE_Y_INVERT, "FLOOR_NEGATIVE_Y", 0, "-Y", ""},
- {LOCLIKE_Z_INVERT, "FLOOR_NEGATIVE_Z", 0, "-Z", ""},
+ {TRACK_X, "FLOOR_X", 0, "X", ""},
+ {TRACK_Y, "FLOOR_Y", 0, "Y", ""},
+ {TRACK_Z, "FLOOR_Z", 0, "Z", ""},
+ {TRACK_nX, "FLOOR_NEGATIVE_X", 0, "-X", ""},
+ {TRACK_nY, "FLOOR_NEGATIVE_Y", 0, "-Y", ""},
+ {TRACK_nZ, "FLOOR_NEGATIVE_Z", 0, "-Z", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "FloorConstraint", "Constraint");
@@ -1072,7 +1112,7 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_dependency_update");
- prop= RNA_def_property(srna, "offset", PROP_INT, PROP_TIME);
+ prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TIME);
RNA_def_property_range(prop, MINAFRAME, MAXFRAME);
RNA_def_property_ui_text(prop, "Offset", "Offset from the position corresponding to the time frame");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
@@ -1241,11 +1281,7 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_range(prop, -M_PI*2, M_PI*2);
RNA_def_property_ui_text(prop, "Axis Z", "Rotate pivot on Z axis in degrees");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
-
- /* XXX not sure how to wrap the two 6 element arrays for the generic joint */
- //float minLimit[6];
- //float maxLimit[6];
-
+
prop= RNA_def_property(srna, "use_linked_collision", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DISABLE_LINKED_COLLISION);
RNA_def_property_ui_text(prop, "Disable Linked Collision", "Disable collision between linked bodies");
@@ -1255,6 +1291,66 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_DRAW_PIVOT);
RNA_def_property_ui_text(prop, "Draw Pivot", "Display the pivot point and rotation in 3D view");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+
+ /* Limit */
+
+ /* Limit Min/Max for genereic 6 DoF */
+ prop= RNA_def_property(srna, "limit_generic_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit");
+ RNA_def_property_array(prop, 6);
+ RNA_def_property_ui_text(prop, "Minimum Limit", "");
+
+ prop= RNA_def_property(srna, "limit_generic_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit");
+ RNA_def_property_array(prop, 6);
+ RNA_def_property_ui_text(prop, "Maximum Limit", "");
+
+ /* Limit Min/Max for Cone Twist */
+ prop= RNA_def_property(srna, "limit_cone_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit");
+ RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_min_get", "rna_RigidBodyJointConstraint_limit_cone_min_set", NULL);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Minimum Limit", "");
+
+ prop= RNA_def_property(srna, "limit_cone_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit");
+ RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_max_get", "rna_RigidBodyJointConstraint_limit_cone_max_set", NULL);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Maximum Limit", "");
+
+
+ /* Limit Booleans */
+ prop= RNA_def_property(srna, "use_limit_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
+ RNA_def_property_ui_text(prop, "Use X Limit", "Use minimum/maximum x limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_limit_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 2);
+ RNA_def_property_ui_text(prop, "Use Y Limit", "Use minimum/maximum y limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_limit_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 4);
+ RNA_def_property_ui_text(prop, "Use Z Limit", "Use minimum/maximum z limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_x", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 8);
+ RNA_def_property_ui_text(prop, "Use Angular X Limit", "Use minimum/maximum x angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_y", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 16);
+ RNA_def_property_ui_text(prop, "Use Angular Y Limit", "Use minimum/maximum y angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
+ prop= RNA_def_property(srna, "use_angular_limit_z", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", 32);
+ RNA_def_property_ui_text(prop, "Use Angular Z Limit", "Use minimum/maximum z angular limit");
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
+
}
static void rna_def_constraint_clamp_to(BlenderRNA *brna)
@@ -1919,6 +2015,7 @@ void RNA_def_constraint(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Constraint_name_set");
RNA_def_property_ui_text(prop, "Name", "Constraint name");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT|NA_RENAME, NULL);
/* enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
@@ -1942,7 +2039,7 @@ void RNA_def_constraint(BlenderRNA *brna)
/* flags */
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", CONSTRAINT_OFF);
- RNA_def_property_ui_text(prop, "Enabled", "Enable/Disable Constraint");
+ RNA_def_property_ui_text(prop, "Disable", "Enable/Disable Constraint");
prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CONSTRAINT_EXPAND);
diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c
index ebe0e363b26..58081d13867 100644
--- a/source/blender/makesrna/intern/rna_context.c
+++ b/source/blender/makesrna/intern/rna_context.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c
index ee0707ad0ae..535476685cd 100644
--- a/source/blender/makesrna/intern/rna_controller.c
+++ b/source/blender/makesrna/intern/rna_controller.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -207,7 +207,6 @@ void RNA_def_controller(BlenderRNA *brna)
prop= RNA_def_property(srna, "expression", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "str");
- RNA_def_property_string_maxlength(prop, 127);
RNA_def_property_ui_text(prop, "Expression", "");
RNA_def_property_update(prop, NC_LOGIC, NULL);
diff --git a/source/blender/makesrna/intern/rna_controller_api.c b/source/blender/makesrna/intern/rna_controller_api.c
index dab2ce8c3a1..c46a61fb1d8 100644
--- a/source/blender/makesrna/intern/rna_controller_api.c
+++ b/source/blender/makesrna/intern/rna_controller_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index e28212470c3..e103da253dc 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -77,6 +77,40 @@ EnumPropertyItem curve_type_items[] = {
#include "ED_curve.h" /* for BKE_curve_nurbs */
+/* highly irritating but from RNA we cant know this */
+static Nurb *curve_nurb_from_point(Curve *cu, const void *point, int *nu_index, int *pt_index)
+{
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu;
+ int i= 0;
+
+ for(nu= nurbs->first; nu; nu= nu->next, i++) {
+ if(nu->type == CU_BEZIER) {
+ if(point >= (void *)nu->bezt && point < (void *)(nu->bezt + nu->pntsu)) {
+ break;
+ }
+ }
+ else {
+ if(point >= (void *)nu->bp && point < (void *)(nu->bp + (nu->pntsu * nu->pntsv))) {
+ break;
+ }
+ }
+ }
+
+ if(nu) {
+ if(nu_index) {
+ *nu_index= i;
+ }
+
+ if(pt_index) {
+ if(nu->type == CU_BEZIER) *pt_index= (int)((BezTriple *)point - nu->bezt);
+ else *pt_index= (int)((BPoint *)point - nu->bp);
+ }
+ }
+
+ return nu;
+}
+
static StructRNA *rna_Curve_refine(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
@@ -141,6 +175,14 @@ static void rna_BezTriple_ctrlpoint_set(PointerRNA *ptr, const float *values)
bt->vec[1][2]= values[2];
}
+static void rna_Curve_texspace_set(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->data;
+
+ if (cu->texflag & CU_AUTOSPACE)
+ tex_space_curve(cu);
+}
+
static int rna_Curve_texspace_editable(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->data;
@@ -244,7 +286,7 @@ static void rna_BPoint_array_begin(CollectionPropertyIterator *iter, PointerRNA
static void rna_Curve_update_data_id(Main *bmain, Scene *scene, ID *id)
{
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
@@ -259,6 +301,17 @@ static void rna_Curve_update_deps(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Curve_update_data(bmain, scene, ptr);
}
+static void rna_Curve_update_points(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Nurb *nu= curve_nurb_from_point(cu, ptr->data, NULL, NULL);
+
+ if(nu)
+ calchandlesNurb(nu);
+
+ rna_Curve_update_data(bmain, scene, ptr);
+}
+
static PointerRNA rna_Curve_bevelObject_get(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
@@ -399,12 +452,24 @@ void rna_Curve_body_set(PointerRNA *ptr, const char *value)
BLI_strncpy(cu->str, value, len+1);
}
-static void rna_Nurb_update_handle_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Nurb_update_cyclic_u(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Nurb *nu= (Nurb*)ptr->data;
- if(nu->type == CU_BEZIER)
+ if(nu->type == CU_BEZIER) {
calchandlesNurb(nu);
+ } else {
+ nurbs_knot_calc_u(nu);
+ }
+
+ rna_Curve_update_data(bmain, scene, ptr);
+}
+
+static void rna_Nurb_update_cyclic_v(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Nurb *nu= (Nurb*)ptr->data;
+
+ nurbs_knot_calc_v(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -414,7 +479,7 @@ static void rna_Nurb_update_knot_u(Main *bmain, Scene *scene, PointerRNA *ptr)
Nurb *nu= (Nurb*)ptr->data;
clamp_nurb_order_u(nu);
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -424,7 +489,7 @@ static void rna_Nurb_update_knot_v(Main *bmain, Scene *scene, PointerRNA *ptr)
Nurb *nu= (Nurb*)ptr->data;
clamp_nurb_order_v(nu);
- makeknots(nu, 2);
+ nurbs_knot_calc_v(nu);
rna_Curve_update_data(bmain, scene, ptr);
}
@@ -441,7 +506,7 @@ static void rna_Curve_spline_points_add(ID *id, Nurb *nu, ReportList *reports, i
addNurbPoints(nu, number);
/* update */
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data_id(NULL, NULL, id);
}
@@ -458,7 +523,7 @@ static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, ReportList *reports
addNurbPointsBezier(nu, number);
/* update */
- makeknots(nu, 1);
+ nurbs_knot_calc_u(nu);
rna_Curve_update_data_id(NULL, NULL, id);
}
@@ -487,7 +552,7 @@ static Nurb *rna_Curve_spline_new(Curve *cu, int type)
nu->resolu= nu->resolv= 12;
nu->flag= CU_SMOOTH;
- BLI_addtail(&cu->nurb, nu);
+ BLI_addtail(BKE_curve_nurbs(cu), nu);
return nu;
}
@@ -536,6 +601,43 @@ static void rna_Curve_active_spline_set(PointerRNA *ptr, PointerRNA value)
cu->actnu= BLI_findindex(nubase, nu);
}
+static char *rna_Curve_spline_path(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ ListBase *nubase= BKE_curve_nurbs(cu);
+ Nurb *nu= ptr->data;
+ int index= BLI_findindex(nubase, nu);
+
+ if (index >= 0)
+ return BLI_sprintfN("splines[%d]", index);
+ else
+ return BLI_strdup("");
+}
+
+/* use for both bezier and nurbs */
+static char *rna_Curve_spline_point_path(PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ Nurb *nu;
+ void *point= ptr->data;
+ int nu_index, pt_index;
+
+ nu= curve_nurb_from_point(cu, point, &nu_index, &pt_index);
+
+ if (nu) {
+ if(nu->type == CU_BEZIER) {
+ return BLI_sprintfN("splines[%d].bezier_points[%d]", nu_index, pt_index);
+ }
+ else {
+ return BLI_sprintfN("splines[%d].points[%d]", nu_index, pt_index);
+ }
+ }
+ else {
+ return BLI_strdup("");
+ }
+}
+
+
static char *rna_TextBox_path(PointerRNA *ptr)
{
Curve *cu= (Curve*)ptr->id.data;
@@ -548,6 +650,12 @@ static char *rna_TextBox_path(PointerRNA *ptr)
return BLI_strdup("");
}
+static void rna_Curve_splines_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ Curve *cu= (Curve*)ptr->id.data;
+ rna_iterator_listbase_begin(iter, BKE_curve_nurbs(cu), NULL);
+}
+
#else
static void rna_def_bpoint(BlenderRNA *brna)
@@ -597,10 +705,11 @@ static void rna_def_bpoint(BlenderRNA *brna)
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- /*RNA_def_property_range(prop, 0.0f, 1.0f);*/
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
}
static void rna_def_beztriple(BlenderRNA *brna)
@@ -638,32 +747,32 @@ static void rna_def_beztriple(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "h1");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle types");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "h2");
RNA_def_property_enum_items(prop, beztriple_handle_type_items);
RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle types");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
/* Vector values */
prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle1_get", "rna_BezTriple_handle1_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_ctrlpoint_get", "rna_BezTriple_ctrlpoint_set", NULL);
RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_BezTriple_handle2_get", "rna_BezTriple_handle2_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Curve_update_points");
/* Number values */
prop= RNA_def_property(srna, "tilt", PROP_FLOAT, PROP_NONE);
@@ -679,10 +788,11 @@ static void rna_def_beztriple(BlenderRNA *brna)
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- /*RNA_def_property_range(prop, 0.0f, 1.0f);*/
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Bevel Radius", "Radius for bevelling");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_point_path");
}
static void rna_def_path(BlenderRNA *brna, StructRNA *srna)
@@ -733,9 +843,9 @@ static void rna_def_nurbs(BlenderRNA *brna, StructRNA *srna)
PropertyRNA *prop;
/* flags */
- prop= RNA_def_property(srna, "use_map_on_length", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
- RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box");
+ RNA_def_property_ui_text(prop, "Use UV for Mapping", "Uses the UV values as Generated textured coordinates");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
}
@@ -745,7 +855,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
static EnumPropertyItem prop_align_items[] = {
{CU_LEFT, "LEFT", 0, "Left", "Align text to the left"},
- {CU_MIDDLE, "CENTRAL", 0, "Center", "Center text"},
+ {CU_MIDDLE, "CENTER", 0, "Center", "Center text"},
{CU_RIGHT, "RIGHT", 0, "Right", "Align text to the right"},
{CU_JUSTIFY, "JUSTIFY", 0, "Justify", "Align to the left and the right"},
{CU_FLUSH, "FLUSH", 0, "Flush", "Align to the left and the right, with equal character spacing"},
@@ -832,7 +942,7 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
/* strings */
prop= RNA_def_property(srna, "family", PROP_STRING, PROP_NONE);
- RNA_def_property_string_maxlength(prop, 21);
+ RNA_def_property_string_maxlength(prop, (sizeof((ID *)NULL)->name)-2);
RNA_def_property_ui_text(prop, "Object Font", "Use Blender Objects as font characters. Give font objects a common name followed by the character it represents, eg. familya, familyb etc, and turn on Verts Duplication");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -862,11 +972,29 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ prop= RNA_def_property(srna, "font_bold", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfontb");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "font_italic", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfonti");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ prop= RNA_def_property(srna, "font_bold_italic", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "vfontbi");
+ RNA_def_property_ui_text(prop, "Font", "");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
prop= RNA_def_property(srna, "edit_format", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "curinfo");
RNA_def_property_ui_text(prop, "Edit Format", "Editing settings character formatting");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
-
+
/* flags */
prop= RNA_def_property(srna, "use_fast_edit", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST);
@@ -980,7 +1108,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
//PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+ //PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplinePoints");
srna= RNA_def_struct(brna, "SplinePoints", NULL);
@@ -990,7 +1118,7 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "rna_Curve_spline_points_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline.");
RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_int(func, "count", 1, 1, INT_MAX, "Number", "Number of points to add to the spline", 1, INT_MAX);
/*
func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1007,7 +1135,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
//PropertyRNA *prop;
FunctionRNA *func;
- PropertyRNA *parm;
+ //PropertyRNA *parm;
RNA_def_property_srna(cprop, "SplineBezierPoints");
srna= RNA_def_struct(brna, "SplineBezierPoints", NULL);
@@ -1017,7 +1145,7 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "add", "rna_Curve_spline_bezpoints_add");
RNA_def_function_ui_description(func, "Add a number of points to this spline.");
RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "number", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
+ RNA_def_int(func, "count", 1, INT_MIN, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
/*
func= RNA_def_function(srna, "remove", "rna_Curve_spline_remove");
@@ -1093,8 +1221,14 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "key");
RNA_def_property_ui_text(prop, "Shape Keys", "");
+
prop= RNA_def_property(srna, "splines", PROP_COLLECTION, PROP_NONE);
+#if 0
RNA_def_property_collection_sdna(prop, NULL, "nurb", NULL);
+#else
+ /* this way we get editmode nurbs too, keyframe in editmode */
+ RNA_def_property_collection_funcs(prop, "rna_Curve_splines_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
+#endif
RNA_def_property_struct_type(prop, "Spline");
RNA_def_property_ui_text(prop, "Splines", "Collection of splines in this curve data object");
rna_def_curve_splines(brna, prop);
@@ -1141,7 +1275,7 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution U", "Surface resolution in U direction");
RNA_def_property_update(prop, 0, "rna_Curve_resolution_u_update_data");
@@ -1149,20 +1283,20 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv");
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Resolution V", "Surface resolution in V direction");
RNA_def_property_update(prop, 0, "rna_Curve_resolution_v_update_data");
prop= RNA_def_property(srna, "render_resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu_ren");
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_range(prop, 0, 64, 1, 0);
RNA_def_property_ui_text(prop, "Render Resolution U", "Surface resolution in U direction used while rendering. Zero skips this property");
prop= RNA_def_property(srna, "render_resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv_ren");
RNA_def_property_ui_range(prop, 0, 64, 1, 0);
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_text(prop, "Render Resolution V", "Surface resolution in V direction used while rendering. Zero skips this property");
@@ -1222,14 +1356,15 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_fill_deform", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_DEFORM_FILL);
- RNA_def_property_ui_text(prop, "Fill deformed", "Fill curve after applying deformation");
+ RNA_def_property_ui_text(prop, "Fill deformed", "Fill curve after applying shape keys and all modifiers");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* texture space */
prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "texflag", CU_AUTOSPACE);
RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object");
-
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Curve_texspace_set");
+
prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
@@ -1251,9 +1386,9 @@ static void rna_def_curve(BlenderRNA *brna)
RNA_def_property_editable_func(prop, texspace_editable);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");*/
- prop= RNA_def_property(srna, "use_map_on_length", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_uv_as_generated", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_UV_ORCO);
- RNA_def_property_ui_text(prop, "Map Along Length", "Generate texture mapping coordinates following the curve direction, rather than the local bounding box");
+ RNA_def_property_ui_text(prop, "Use UV for mapping", "Uses the UV values as Generated textured coordinates");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* materials */
@@ -1341,14 +1476,14 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_u", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolu");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution U", "Curve or Surface subdivisions per segment");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop= RNA_def_property(srna, "resolution_v", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "resolv");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 64, 1, 0);
RNA_def_property_ui_text(prop, "Resolution V", "Surface subdivisions per segment");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
@@ -1356,12 +1491,12 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_cyclic_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic U", "Make this curve or surface a closed loop in the U direction");
- RNA_def_property_update(prop, 0, "rna_Nurb_update_handle_data"); /* only needed for cyclic_u because cyclic_v cant do bezier */
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_u");
prop= RNA_def_property(srna, "use_cyclic_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic V", "Make this surface a closed loop in the V direction");
- RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+ RNA_def_property_update(prop, 0, "rna_Nurb_update_cyclic_v");
/* Note, endpoint and bezier flags should never be on at the same time! */
@@ -1407,6 +1542,8 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* editing this needs knot recalc*/
RNA_def_property_ui_text(prop, "Character Index", "Location of this character in the text data (only for text curves)");
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+ RNA_def_struct_path_func(srna, "rna_Curve_spline_path");
}
void RNA_def_curve(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 750b1eef2a9..97c7df253a1 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,10 +34,11 @@
#include "DNA_genfile.h"
#include "DNA_sdna_types.h"
-#include "RNA_define.h"
-
-#include "BLI_ghash.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
+#include "RNA_define.h"
#include "rna_internal.h"
@@ -264,8 +265,8 @@ static ContainerDefRNA *rna_find_container_def(ContainerRNA *cont)
/* DNA utility function for looking up members */
typedef struct DNAStructMember {
- char *type;
- char *name;
+ const char *type;
+ const char *name;
int arraylength;
int pointerlevel;
} DNAStructMember;
@@ -295,7 +296,7 @@ static int rna_member_cmp(const char *name, const char *oname)
static int rna_find_sdna_member(SDNA *sdna, const char *structname, const char *membername, DNAStructMember *smember)
{
- char *dnaname;
+ const char *dnaname;
short *sp;
int a, b, structnr, totmember, cmp;
@@ -359,7 +360,7 @@ static int rna_validate_identifier(const char *identifier, char *error, int prop
int a=0;
/* list from http://docs.python.org/reference/lexical_analysis.html#id5 */
- static char *kwlist[] = {
+ static const char *kwlist[] = {
"and", "as", "assert", "break",
"class", "continue", "def", "del",
"elif", "else", "except", "exec",
@@ -411,7 +412,7 @@ static int rna_validate_identifier(const char *identifier, char *error, int prop
/* Blender Data Definition */
-BlenderRNA *RNA_create()
+BlenderRNA *RNA_create(void)
{
BlenderRNA *brna;
@@ -474,11 +475,12 @@ void RNA_struct_free(BlenderRNA *brna, StructRNA *srna)
PropertyRNA *prop, *nextprop;
PropertyRNA *parm, *nextparm;
+ /*
if(srna->flag & STRUCT_RUNTIME) {
if(RNA_struct_py_type_get(srna)) {
fprintf(stderr, "RNA_struct_free '%s' freed while holding a python reference\n", srna->identifier);
}
- }
+ } */
for(prop=srna->cont.properties.first; prop; prop=nextprop) {
nextprop= prop->next;
@@ -837,7 +839,7 @@ void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
{
- StructRNA *srna= DefRNA.laststruct;
+ /*StructRNA *srna= DefRNA.laststruct;*/ /* invalid for python defined props */
ContainerRNA *cont= cont_;
ContainerDefRNA *dcont;
PropertyDefRNA *dprop= NULL;
@@ -847,7 +849,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
char error[512];
if (rna_validate_identifier(identifier, error, 1) == 0) {
- fprintf(stderr, "RNA_def_property: property identifier \"%s.%s\" - %s\n", srna->identifier, identifier, error);
+ fprintf(stderr, "RNA_def_property: property identifier \"%s.%s\" - %s\n", CONTAINER_RNA_ID(cont), identifier, error);
DefRNA.error= 1;
}
@@ -855,7 +857,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
/* XXX - toto, detect supertype collisions */
if(rna_findlink(&dcont->properties, identifier)) {
- fprintf(stderr, "RNA_def_property: duplicate identifier \"%s.%s\"\n", srna->identifier, identifier);
+ fprintf(stderr, "RNA_def_property: duplicate identifier \"%s.%s\"\n", CONTAINER_RNA_ID(cont), identifier);
DefRNA.error= 1;
}
@@ -913,7 +915,7 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
case PROP_COLLECTION:
break;
default:
- fprintf(stderr, "RNA_def_property: \"%s.%s\", invalid property type.\n", srna->identifier, identifier);
+ fprintf(stderr, "RNA_def_property: \"%s.%s\", invalid property type.\n", CONTAINER_RNA_ID(cont), identifier);
DefRNA.error= 1;
return NULL;
}
@@ -1004,6 +1006,11 @@ void RNA_def_property_clear_flag(PropertyRNA *prop, int flag)
prop->flag &= ~flag;
}
+void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype)
+{
+ prop->subtype= subtype;
+}
+
void RNA_def_property_array(PropertyRNA *prop, int length)
{
StructRNA *srna= DefRNA.laststruct;
@@ -1020,6 +1027,12 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
return;
}
+ if(prop->arraydimension > 1) {
+ fprintf(stderr, "RNA_def_property_array: \"%s.%s\", array dimensions has been set to %d but would be overwritten as 1.\n", srna->identifier, prop->identifier, prop->arraydimension);
+ DefRNA.error= 1;
+ return;
+ }
+
switch(prop->type) {
case PROP_BOOLEAN:
case PROP_INT:
@@ -1035,7 +1048,7 @@ void RNA_def_property_array(PropertyRNA *prop, int length)
}
}
-void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, int length[])
+void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
{
StructRNA *srna= DefRNA.laststruct;
int i;
@@ -1380,20 +1393,36 @@ void RNA_def_property_enum_default(PropertyRNA *prop, int value)
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
eprop->defaultvalue= value;
- for(i=0; i<eprop->totitem; i++) {
- if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
- defaultfound= 1;
- }
-
- if(!defaultfound && eprop->totitem) {
- if(value == 0) {
- eprop->defaultvalue= eprop->item[0].value;
+ if(prop->flag & PROP_ENUM_FLAG) {
+ /* check all bits are accounted for */
+ int totflag= 0;
+ for(i=0; i<eprop->totitem; i++) {
+ if(eprop->item[i].identifier[0]) {
+ totflag |= eprop->item[i].value;
+ }
}
- else {
- fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+
+ if(eprop->defaultvalue & ~totflag) {
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default includes unused bits (%d).\n", srna->identifier, prop->identifier, eprop->defaultvalue & ~totflag);
DefRNA.error= 1;
}
}
+ else {
+ for(i=0; i<eprop->totitem; i++) {
+ if(eprop->item[i].identifier[0] && eprop->item[i].value == eprop->defaultvalue)
+ defaultfound= 1;
+ }
+
+ if(!defaultfound && eprop->totitem) {
+ if(value == 0) {
+ eprop->defaultvalue= eprop->item[0].value;
+ }
+ else {
+ fprintf(stderr, "RNA_def_property_enum_default: \"%s.%s\", default is not in items.\n", srna->identifier, prop->identifier);
+ DefRNA.error= 1;
+ }
+ }
+ }
break;
}
@@ -1480,8 +1509,19 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, co
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname)))
+ if((dp=rna_def_property_sdna(prop, structname, propname))) {
+
+ if(DefRNA.silent == 0) {
+ /* error check to ensure floats are not wrapped as ints/bools */
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "RNA_def_property_boolean_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+
dp->booleanbit= bit;
+ }
}
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int booleanbit)
@@ -1514,6 +1554,16 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
}
if((dp= rna_def_property_sdna(prop, structname, propname))) {
+
+ /* error check to ensure floats are not wrapped as ints/bools */
+ if(DefRNA.silent == 0) {
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_INT_COMPAT(dp->dnatype) == 0) {
+ fprintf(stderr, "RNA_def_property_int_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+
/* SDNA doesn't pass us unsigned unfortunately .. */
if(dp->dnatype && strcmp(dp->dnatype, "char") == 0) {
iprop->hardmin= iprop->softmin= CHAR_MIN;
@@ -1538,6 +1588,7 @@ void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
+ PropertyDefRNA *dp;
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1551,12 +1602,25 @@ void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, cons
return;
}
+ if((dp= rna_def_property_sdna(prop, structname, propname))) {
+ /* silent is for internal use */
+ if(DefRNA.silent == 0) {
+ if(dp->dnatype && *dp->dnatype && IS_DNATYPE_FLOAT_COMPAT(dp->dnatype) == 0) {
+ if(prop->subtype != PROP_COLOR_GAMMA) { /* colors are an exception. these get translated */
+ fprintf(stderr, "RNA_def_property_float_sdna: %s.%s is a '%s' but wrapped as type '%s'.\n", srna->identifier, prop->identifier, dp->dnatype, RNA_property_typename(prop->type));
+ DefRNA.error= 1;
+ return;
+ }
+ }
+ }
+ }
+
rna_def_property_sdna(prop, structname, propname);
}
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1570,7 +1634,7 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if(( /* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
prop->arraydimension= 0;
prop->totarraylength= 0;
@@ -1597,7 +1661,7 @@ void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structnam
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
StructRNA *srna= DefRNA.laststruct;
@@ -1612,7 +1676,7 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if((/* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
sprop->maxlength= prop->totarraylength;
prop->arraydimension= 0;
@@ -1623,7 +1687,7 @@ void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, con
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
{
- PropertyDefRNA *dp;
+ /* PropertyDefRNA *dp; */
StructRNA *srna= DefRNA.laststruct;
if(!DefRNA.preprocess) {
@@ -1637,7 +1701,7 @@ void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, co
return;
}
- if((dp=rna_def_property_sdna(prop, structname, propname))) {
+ if((/* dp= */ rna_def_property_sdna(prop, structname, propname))) {
if(prop->arraydimension) {
prop->arraydimension= 0;
prop->totarraylength= 0;
@@ -2164,6 +2228,27 @@ PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, co
return prop;
}
+/* same as above but sets 'PROP_ENUM_FLAG' before setting the default value */
+PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value,
+ const char *ui_name, const char *ui_description)
+{
+ ContainerRNA *cont= cont_;
+ PropertyRNA *prop;
+
+ if(!items) {
+ printf("RNA_def_enum_flag: items not allowed to be NULL.\n");
+ return NULL;
+ }
+
+ prop= RNA_def_property(cont, identifier, PROP_ENUM, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */
+ if(items) RNA_def_property_enum_items(prop, items);
+ RNA_def_property_enum_default(prop, default_value);
+ RNA_def_property_ui_text(prop, ui_name, ui_description);
+
+ return prop;
+}
+
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
{
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
@@ -2234,8 +2319,11 @@ PropertyRNA *RNA_def_float_matrix(StructOrFunctionRNA *cont_, const char *identi
{
ContainerRNA *cont= cont_;
PropertyRNA *prop;
- int length[2]= {rows, columns};
-
+ int length[2];
+
+ length[0]= rows;
+ length[1]= columns;
+
prop= RNA_def_property(cont, identifier, PROP_FLOAT, PROP_MATRIX);
RNA_def_property_multi_array(prop, 2, length);
if(default_value) RNA_def_property_float_array_default(prop, default_value);
@@ -2617,14 +2705,26 @@ void RNA_def_func_free_pointers(FunctionRNA *func)
}
}
-void RNA_def_property_duplicate_pointers(PropertyRNA *prop)
+void RNA_def_property_duplicate_pointers(StructOrFunctionRNA *cont_, PropertyRNA *prop)
{
+ ContainerRNA *cont= cont_;
EnumPropertyItem *earray;
float *farray;
int *iarray;
int a;
- if(prop->identifier) prop->identifier= BLI_strdup(prop->identifier);
+ /* annoying since we just added this to a hash, could make this add the correct key to the hash in the first place */
+ if(prop->identifier) {
+ if(cont->prophash) {
+ BLI_ghash_remove(cont->prophash, (void*)prop->identifier, NULL, NULL);
+ prop->identifier= BLI_strdup(prop->identifier);
+ BLI_ghash_insert(cont->prophash, (void*)prop->identifier, prop);
+ }
+ else {
+ prop->identifier= BLI_strdup(prop->identifier);
+ }
+ }
+
if(prop->name) prop->name= BLI_strdup(prop->name);
if(prop->description) prop->description= BLI_strdup(prop->description);
@@ -2772,3 +2872,17 @@ int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *ide
}
#endif
+const char *RNA_property_typename(PropertyType type)
+{
+ switch(type) {
+ case PROP_BOOLEAN: return "PROP_BOOLEAN";
+ case PROP_INT: return "PROP_INT";
+ case PROP_FLOAT: return "PROP_FLOAT";
+ case PROP_STRING: return "PROP_STRING";
+ case PROP_ENUM: return "PROP_ENUM";
+ case PROP_POINTER: return "PROP_POINTER";
+ case PROP_COLLECTION: return "PROP_COLLECTION";
+ }
+
+ return "PROP_UNKNOWN";
+}
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 3fdbe0bcc13..72f74f5a3e9 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -53,7 +53,7 @@ EnumPropertyItem fmodifier_type_items[] = {
{FMODIFIER_TYPE_CYCLES, "CYCLES", 0, "Cycles", ""},
{FMODIFIER_TYPE_NOISE, "NOISE", 0, "Noise", ""},
{FMODIFIER_TYPE_FILTER, "FILTER", 0, "Filter", ""},
- {FMODIFIER_TYPE_PYTHON, "PYTHON", 0, "Python", ""},
+ //{FMODIFIER_TYPE_PYTHON, "PYTHON", 0, "Python", ""}, // FIXME: not implemented yet!
{FMODIFIER_TYPE_LIMITS, "LIMITS", 0, "Limits", ""},
{FMODIFIER_TYPE_STEPPED, "STEPPED", 0, "Stepped Interpolation", ""},
{0, NULL, 0, NULL, NULL}};
@@ -62,6 +62,7 @@ EnumPropertyItem beztriple_keyframe_type_items[] = {
{BEZT_KEYTYPE_KEYFRAME, "KEYFRAME", 0, "Keyframe", ""},
{BEZT_KEYTYPE_BREAKDOWN, "BREAKDOWN", 0, "Breakdown", ""},
{BEZT_KEYTYPE_EXTREME, "EXTREME", 0, "Extreme", ""},
+ {BEZT_KEYTYPE_JITTER, "JITTER", 0, "Jitter", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -111,7 +112,7 @@ static void rna_ChannelDriver_update_data(Main *bmain, Scene *scene, PointerRNA
// TODO: this really needs an update guard...
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update(id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(id, OB_RECALC_OB|OB_RECALC_DATA);
WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
}
@@ -324,27 +325,46 @@ static void rna_FCurve_RnaPath_set(PointerRNA *ptr, const char *value)
if (fcu->rna_path)
MEM_freeN(fcu->rna_path);
- if (strlen(value))
+ if (strlen(value)) {
fcu->rna_path= BLI_strdup(value);
+ fcu->flag &= ~FCURVE_DISABLED;
+ }
else
fcu->rna_path= NULL;
}
static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
{
- AnimData *adt= BKE_animdata_from_id(ptr->id.data);
- bAction *act= (adt) ? adt->action : NULL;
+ ID *pid = (ID *)ptr->id.data;
+ ID *vid = (ID *)value.id.data;
FCurve *fcu= ptr->data;
-
- /* same ID? */
- if (value.data && (ptr->id.data != value.id.data)) {
+ bAction *act = NULL;
+
+ /* get action */
+ if (ELEM(NULL, pid, vid)) {
+ printf("ERROR: one of the ID's for the groups to assign to is invalid (ptr=%p, val=%p)\n", pid, vid);
+ return;
+ }
+ else if (value.data && (pid != vid)) {
/* id's differ, cant do this, should raise an error */
+ printf("ERROR: ID's differ - ptr=%p vs value=%p \n", pid, vid);
return;
}
+
+ if (GS(pid->name)==ID_AC && GS(vid->name)==ID_AC) {
+ /* the ID given is the action already - usually when F-Curve is obtained from an action's pointer */
+ act = (bAction *)pid;
+ }
+ else {
+ /* the ID given is the owner of the F-Curve (for drivers) */
+ AnimData *adt = BKE_animdata_from_id(ptr->id.data);
+ act = (adt)? adt->action : NULL;
+ }
+
/* already belongs to group? */
if (fcu->grp == value.data) {
/* nothing to do */
- printf("ERROR: F-Curve already belongs to the group\n");
+ printf("ERROR: F-Curve already belongs to this group\n");
return;
}
@@ -355,18 +375,16 @@ static void rna_FCurve_group_set(PointerRNA *ptr, PointerRNA value)
/* can't change the grouping of F-Curve when it doesn't belong to an action */
printf("ERROR: cannot assign F-Curve to group, since F-Curve is not attached to any ID\n");
return;
- }
-
- /* try to remove F-Curve from action (including from any existing groups)
- * - if after this op it is still attached to something, then it is a driver
- * not an animation curve as we thought, and we should exit
- */
- action_groups_remove_channel(act, fcu);
- if (fcu->next) {
- /* F-Curve is not one that exists in the action, since the above op couldn't remove it from the list */
+ }
+ /* make sure F-Curve exists in this action first, otherwise we could still have been tricked */
+ else if (BLI_findindex(&act->curves, fcu) == -1) {
+ printf("ERROR: F-Curve (%p) doesn't exist in action '%s'\n", fcu, act->id.name);
return;
}
+ /* try to remove F-Curve from action (including from any existing groups) */
+ action_groups_remove_channel(act, fcu);
+
/* add the F-Curve back to the action now in the right place */
// TODO: make the api function handle the case where there isn't any group to assign to
if (value.data) {
@@ -419,7 +437,7 @@ static void rna_FCurve_modifiers_remove(FCurve *fcu, ReportList *reports, FModif
if(BLI_findindex(&fcu->modifiers, fcm) == -1) {
BKE_reportf(reports, RPT_ERROR, "FCurveModifier '%s' not found in fcurve.", fcm->name);
return;
-}
+ }
remove_fmodifier(&fcu->modifiers, fcm);
}
@@ -529,25 +547,34 @@ static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, fl
*max= MAXFRAMEF;
}
-static BezTriple *rna_FKeyframe_points_add(FCurve *fcu, float frame, float value, int do_replace, int do_needed, int do_fast)
+static BezTriple *rna_FKeyframe_points_insert(FCurve *fcu, float frame, float value, int flag)
{
- int index;
- int flag= 0;
-
- if(do_replace) flag |= INSERTKEY_REPLACE;
- if(do_needed) flag |= INSERTKEY_NEEDED;
- if(do_fast) flag |= INSERTKEY_FAST;
+ int index= insert_vert_fcurve(fcu, frame, value, flag);
+ return ((fcu->bezt) && (index >= 0))? (fcu->bezt + index) : NULL;
+}
+static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
+{
+ if(tot > 0) {
+ if(fcu->totvert) {
+ BezTriple *nbezt= MEM_callocN(sizeof(BezTriple) * (fcu->totvert + tot), "rna_FKeyframe_points_add");
+ memcpy(nbezt, fcu->bezt, sizeof(BezTriple) * fcu->totvert);
+ MEM_freeN(fcu->bezt);
+ fcu->bezt= nbezt;
+ }
+ else {
+ fcu->bezt= MEM_callocN(sizeof(BezTriple) * tot, "rna_FKeyframe_points_add");
+ }
- index= insert_vert_fcurve(fcu, frame, value, flag);
- return index >= 0 ? fcu->bezt + index : NULL;
+ fcu->totvert += tot;
+ }
}
static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast)
{
int index= (int)(bezt - fcu->bezt);
if (index < 0 || index >= fcu->totvert) {
- BKE_report(reports, RPT_ERROR, "bezier not in fcurve.");
+ BKE_report(reports, RPT_ERROR, "Keyframe not in F-Curve.");
return;
}
@@ -745,8 +772,8 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Before Mode", "Cycling mode to use before first keyframe");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "cycles_before", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "before_cycles");
+ prop= RNA_def_property(srna, "cycles_before", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "before_cycles");
RNA_def_property_ui_text(prop, "Before Cycles", "Maximum number of cycles to allow before first keyframe. (0 = infinite)");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
@@ -757,8 +784,8 @@ static void rna_def_fmodifier_cycles(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "After Mode", "Cycling mode to use after last keyframe");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "cycles_after", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "after_cycles");
+ prop= RNA_def_property(srna, "cycles_after", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "after_cycles");
RNA_def_property_ui_text(prop, "After Cycles", "Maximum number of cycles to allow after last keyframe. (0 = infinite)");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
}
@@ -1102,9 +1129,9 @@ static void rna_def_channeldriver_variables(BlenderRNA *brna, PropertyRNA *cprop
/* remove variable */
func= RNA_def_function(srna, "remove", "rna_Driver_remove_variable");
- RNA_def_function_ui_description(func, "Remove an existing variable from the driver.");
+ RNA_def_function_ui_description(func, "Remove an existing variable from the driver.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- /* target to remove */
+ /* target to remove */
parm= RNA_def_pointer(func, "variable", "DriverVariable", "", "Variable to remove from the driver.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
@@ -1306,25 +1333,32 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
+ static EnumPropertyItem keyframe_flag_items[] = {
+ {INSERTKEY_REPLACE, "REPLACE", 0, "Replace", "Don't add any new keyframes, but just replace existing ones"},
+ {INSERTKEY_NEEDED, "NEEDED", 0, "Needed", "Only adds keyframes that are needed"},
+ {INSERTKEY_FAST, "FAST", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time"},
+ {0, NULL, 0, NULL, NULL}};
+
RNA_def_property_srna(cprop, "FCurveKeyframePoints");
srna= RNA_def_struct(brna, "FCurveKeyframePoints", NULL);
RNA_def_struct_sdna(srna, "FCurve");
RNA_def_struct_ui_text(srna, "Keyframe Points", "Collection of keyframe points");
- func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+ func= RNA_def_function(srna, "insert", "rna_FKeyframe_points_insert");
RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
parm= RNA_def_float(func, "frame", 0.0f, -FLT_MAX, FLT_MAX, "", "X Value of this keyframe point", -FLT_MAX, FLT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_float(func, "value", 0.0f, -FLT_MAX, FLT_MAX, "", "Y Value of this keyframe point", -FLT_MAX, FLT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
- /* optional */
- parm= RNA_def_boolean(func, "replace", 0, "Replace", "Replace existing keyframes");
- parm= RNA_def_boolean(func, "needed", 0, "Needed", "Only adds keyframes that are needed");
- parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe insertion to avoid recalculating the curve each time");
+
+ RNA_def_enum_flag(func, "options", keyframe_flag_items, 0, "", "Keyframe options.");
parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Newly created keyframe");
RNA_def_function_return(func, parm);
+ func= RNA_def_function(srna, "add", "rna_FKeyframe_points_add");
+ RNA_def_function_ui_description(func, "Add a keyframe point to a F-Curve.");
+ RNA_def_int(func, "count", 1, 1, INT_MAX, "Number", "Number of points to add to the spline", 1, INT_MAX);
func= RNA_def_function(srna, "remove", "rna_FKeyframe_points_remove");
RNA_def_function_ui_description(func, "Remove keyframe from an fcurve.");
@@ -1332,7 +1366,7 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_pointer(func, "keyframe", "Keyframe", "", "Keyframe to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* optional */
- parm= RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
+ RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
}
static void rna_def_fcurve(BlenderRNA *brna)
@@ -1393,6 +1427,7 @@ static void rna_def_fcurve(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color of the F-Curve in the Graph Editor");
RNA_def_property_update(prop, NC_ANIMATION, NULL);
diff --git a/source/blender/makesrna/intern/rna_fcurve_api.c b/source/blender/makesrna/intern/rna_fcurve_api.c
index 27deb242d73..12211f33966 100644
--- a/source/blender/makesrna/intern/rna_fcurve_api.c
+++ b/source/blender/makesrna/intern/rna_fcurve_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 68060e2cfe3..525f402e5fd 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,6 +42,7 @@
#include "BKE_depsgraph.h"
#include "BKE_fluidsim.h"
+#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
@@ -75,10 +76,40 @@ static void rna_fluid_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
+static int fluidsim_find_lastframe(FluidsimSettings *fss)
+{
+ char targetDir[FILE_MAXFILE+FILE_MAXDIR], targetFile[FILE_MAXFILE+FILE_MAXDIR];
+ int curFrame = 1;
+
+ BLI_snprintf(targetDir, sizeof(targetDir), "%sfluidsurface_final_####.bobj.gz", fss->surfdataPath);
+ BLI_path_abs(targetDir, G.main->name);
+
+ do {
+ BLI_strncpy(targetFile, targetDir, sizeof(targetFile));
+ BLI_path_frame(targetFile, curFrame++, 0);
+ } while(BLI_exist(targetFile));
+
+ return curFrame - 1;
+}
+
+static void rna_fluid_find_enframe(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ Object *ob= ptr->id.data;
+ FluidsimModifierData *fluidmd= (FluidsimModifierData*)modifiers_findByType(ob, eModifierType_Fluidsim);
+
+ if(fluidmd->fss->flag & OB_FLUIDSIM_REVERSE) {
+ fluidmd->fss->lastgoodframe = fluidsim_find_lastframe(fluidmd->fss);
+ }
+ else {
+ fluidmd->fss->lastgoodframe = -1;
+ }
+ rna_fluid_update(bmain, scene, ptr);
+}
+
static void rna_FluidSettings_update_type(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -231,8 +262,9 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_reverse_frames", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse fluid frames");
+ RNA_def_property_update(prop, 0, "rna_fluid_find_enframe");
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store baked fluid simulation files in");
@@ -469,7 +501,7 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Alpha Influence", "Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), 1=full. (large particles get lower alphas, smaller ones higher values)");
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_maxlength(prop, 240);
RNA_def_property_string_sdna(prop, NULL, "surfdataPath");
RNA_def_property_ui_text(prop, "Path", "Directory (and/or filename prefix) to store and load particles from");
@@ -527,6 +559,7 @@ static void rna_def_fluidsim_control(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", OB_FLUIDSIM_REVERSE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Reverse Frames", "Reverse control object movement");
+ RNA_def_property_update(prop, 0, "rna_fluid_find_enframe");
}
void RNA_def_fluidsim(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index c03af99ccb0..3b5c8f9e8a9 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -169,6 +169,7 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
/* Drawing Color */
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color for all strokes in this layer");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c
index bd1b7c96998..ebe6bdd5872 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 7dffa4aec74..96d85cda5e7 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -79,7 +79,7 @@ static void rna_Image_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE);
- DAG_id_flush_update(&ima->id, 0);
+ DAG_id_tag_update(&ima->id, 0);
}
static void rna_Image_fields_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -107,7 +107,7 @@ static void rna_Image_reload_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Image *ima= ptr->id.data;
BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
- DAG_id_flush_update(&ima->id, 0);
+ DAG_id_tag_update(&ima->id, 0);
}
static void rna_Image_generated_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -123,6 +123,21 @@ static void rna_ImageUser_update(Main *bmain, Scene *scene, PointerRNA *ptr)
BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
}
+
+char *rna_ImageUser_path(PointerRNA *ptr)
+{
+ if (ptr->id.data) {
+ // ImageUser *iuser= ptr->data;
+
+ switch(GS(((ID *)ptr->id.data)->name)) {
+ case ID_TE:
+ return BLI_strdup("image_user");
+ }
+ }
+
+ return BLI_strdup("");
+}
+
static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, int *free)
{
Image *ima= (Image*)ptr->data;
@@ -156,9 +171,19 @@ static void rna_Image_file_format_set(PointerRNA *ptr, int value)
{
Image *image= (Image*)ptr->data;
if(BKE_imtype_is_movie(value) == 0) { /* should be able to throw an error here */
- ImBuf *ibuf= BKE_image_get_ibuf(image, NULL);
+ ImBuf *ibuf;
+ int ftype= BKE_imtype_to_ftype(value);
+
+ /*
+ ibuf= BKE_image_get_ibuf(image, NULL);
if(ibuf)
- ibuf->ftype= BKE_imtype_to_ftype(value);
+ ibuf->ftype= ftype;
+ */
+
+ /* to be safe change all buffer file types */
+ for(ibuf= image->ibufs.first; ibuf; ibuf= ibuf->next) {
+ ibuf->ftype= ftype;
+ }
}
}
@@ -222,6 +247,7 @@ static void rna_def_imageuser(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ImageUser", NULL);
RNA_def_struct_ui_text(srna, "Image User", "Parameters defining how an Image datablock is used by another datablock");
+ RNA_def_struct_path_func(srna, "rna_ImageUser_path");
prop= RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
@@ -242,19 +268,19 @@ static void rna_def_imageuser(BlenderRNA *brna)
prop= RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "offset");
- RNA_def_property_range(prop, -MAXFRAMEF, MAXFRAMEF);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Offset", "Offsets the number of the frame to use in the animation");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
RNA_def_property_int_sdna(prop, NULL, "sfra");
- RNA_def_property_range(prop, 1.0f, MAXFRAMEF);
- RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie");
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
+ RNA_def_property_ui_text(prop, "Start Frame", "Sets the global starting frame of the movie/sequence, assuming first picture has a #1");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
prop= RNA_def_property(srna, "fields_per_frame", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fie_ima");
- RNA_def_property_range(prop, 1, MAXFRAMEF);
+ RNA_def_property_range(prop, 1, 200);
RNA_def_property_ui_text(prop, "Fields per Frame", "The number of fields per rendered frame (2 fields is 1 image)");
RNA_def_property_update(prop, 0, "rna_ImageUser_update");
diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
index e53d4a3f137..c858c25afe1 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_image_api.c 23507 2009-09-27 09:19:29Z kazanbas $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,8 +40,8 @@
#include "BKE_image.h"
#include "BKE_packedFile.h"
#include "BKE_main.h"
-#include "BKE_utildefines.h"
-#include "BKE_global.h" /* grr: G.sce */
+
+#include "BKE_global.h" /* grr: G.main->name */
#include "IMB_imbuf.h"
@@ -53,7 +53,7 @@
#include "MEM_guardedalloc.h"
-static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports, char *path, Scene *scene)
+static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports, const char *path, Scene *scene)
{
ImBuf *ibuf;
@@ -73,9 +73,17 @@ static void rna_Image_save_render(Image *image, bContext *C, ReportList *reports
if (ibuf == NULL) {
BKE_reportf(reports, RPT_ERROR, "Couldn't acquire buffer from image");
}
-
- if (!BKE_write_ibuf(NULL, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality)) {
- BKE_reportf(reports, RPT_ERROR, "Couldn't write image: %s", path);
+ else {
+ /* temp swap out the color */
+ const unsigned char imb_depth_back= ibuf->depth;
+ const float dither_back= ibuf->dither;
+ ibuf->depth= scene->r.planes;
+ ibuf->dither= scene->r.dither_intensity;
+ if (!BKE_write_ibuf(NULL, ibuf, path, scene->r.imtype, scene->r.subimtype, scene->r.quality)) {
+ BKE_reportf(reports, RPT_ERROR, "Couldn't write image: %s", path);
+ }
+ ibuf->depth= imb_depth_back;
+ ibuf->dither= dither_back;
}
BKE_image_release_ibuf(image, lock);
@@ -90,7 +98,7 @@ static void rna_Image_save(Image *image, ReportList *reports)
if(ibuf) {
char filename[FILE_MAXDIR + FILE_MAXFILE];
BLI_strncpy(filename, image->name, sizeof(filename));
- BLI_path_abs(filename, G.sce);
+ BLI_path_abs(filename, G.main->name);
if(image->packedfile) {
if (writePackedFile(reports, image->name, image->packedfile, 0) != RET_OK) {
@@ -190,9 +198,9 @@ void RNA_api_image(StructRNA *srna)
func= RNA_def_function(srna, "save_render", "rna_Image_save_render");
RNA_def_function_ui_description(func, "Save image to a specific path using a scenes render settings");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
- parm= RNA_def_string(func, "filepath", "", 0, "", "Save path.");
+ parm= RNA_def_string_file_path(func, "filepath", "", 0, "", "Save path.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from");
+ RNA_def_pointer(func, "scene", "Scene", "", "Scene to take image parameters from");
func= RNA_def_function(srna, "save", "rna_Image_save");
RNA_def_function_ui_description(func, "Save image to its source path");
@@ -208,8 +216,8 @@ void RNA_api_image(StructRNA *srna)
func= RNA_def_function(srna, "gl_load", "rna_Image_gl_load");
RNA_def_function_ui_description(func, "Load the image into OpenGL graphics memory");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", "The texture minifying function", -INT_MAX, INT_MAX);
- parm= RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", "The texture magnification function", -INT_MAX, INT_MAX);
+ RNA_def_int(func, "filter", GL_LINEAR_MIPMAP_NEAREST, -INT_MAX, INT_MAX, "Filter", "The texture minifying function", -INT_MAX, INT_MAX);
+ RNA_def_int(func, "mag", GL_LINEAR, -INT_MAX, INT_MAX, "Magnification", "The texture magnification function", -INT_MAX, INT_MAX);
/* return value */
parm= RNA_def_int(func, "error", 0, -INT_MAX, INT_MAX, "Error", "OpenGL error value", -INT_MAX, INT_MAX);
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 401f9de92d4..08f1fb7d2a1 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -191,10 +191,10 @@ void rna_ID_name_set(struct PointerRNA *ptr, const char *value);
struct StructRNA *rna_ID_refine(struct PointerRNA *ptr);
struct IDProperty *rna_ID_idprops(struct PointerRNA *ptr, int create);
void rna_ID_fake_user_set(struct PointerRNA *ptr, int value);
-struct IDProperty *rna_IDPropertyGroup_idprops(struct PointerRNA *ptr, int create);
-void rna_IDPropertyGroup_unregister(const struct bContext *C, struct StructRNA *type);
-struct StructRNA *rna_IDPropertyGroup_register(const struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
-struct StructRNA* rna_IDPropertyGroup_refine(struct PointerRNA *ptr);
+struct IDProperty *rna_PropertyGroup_idprops(struct PointerRNA *ptr, int create);
+void rna_PropertyGroup_unregister(const struct bContext *C, struct StructRNA *type);
+struct StructRNA *rna_PropertyGroup_register(struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
+struct StructRNA* rna_PropertyGroup_refine(struct PointerRNA *ptr);
void rna_object_vgroup_name_index_get(struct PointerRNA *ptr, char *value, int index);
int rna_object_vgroup_name_index_length(struct PointerRNA *ptr, int index);
@@ -224,6 +224,7 @@ char *rna_TextureSlot_path(struct PointerRNA *ptr);
void RNA_api_action(StructRNA *srna);
void RNA_api_armature_edit_bone(StructRNA *srna);
+void RNA_api_bone(StructRNA *srna);
void RNA_api_drivers(StructRNA *srna);
void RNA_api_image(struct StructRNA *srna);
void RNA_api_operator(struct StructRNA *srna);
@@ -232,6 +233,7 @@ void RNA_api_keyconfig(struct StructRNA *srna);
void RNA_api_keyingset(struct StructRNA *srna);
void RNA_api_keymap(struct StructRNA *srna);
void RNA_api_keymapitem(struct StructRNA *srna);
+void RNA_api_area(struct StructRNA *srna);
void RNA_api_main(struct StructRNA *srna);
void RNA_api_material(StructRNA *srna);
void RNA_api_mesh(struct StructRNA *srna);
@@ -277,18 +279,19 @@ void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop);
/* ID Properties */
-extern StringPropertyRNA rna_IDProperty_string;
-extern IntPropertyRNA rna_IDProperty_int;
-extern IntPropertyRNA rna_IDProperty_int_array;
-extern FloatPropertyRNA rna_IDProperty_float;
-extern FloatPropertyRNA rna_IDProperty_float_array;
-extern PointerPropertyRNA rna_IDProperty_group;
-extern CollectionPropertyRNA rna_IDProperty_collection;
-extern FloatPropertyRNA rna_IDProperty_double;
-extern FloatPropertyRNA rna_IDProperty_double_array;
+extern StringPropertyRNA rna_PropertyGroupItem_string;
+extern IntPropertyRNA rna_PropertyGroupItem_int;
+extern IntPropertyRNA rna_PropertyGroupItem_int_array;
+extern FloatPropertyRNA rna_PropertyGroupItem_float;
+extern FloatPropertyRNA rna_PropertyGroupItem_float_array;
+extern PointerPropertyRNA rna_PropertyGroupItem_group;
+extern CollectionPropertyRNA rna_PropertyGroupItem_collection;
+extern CollectionPropertyRNA rna_PropertyGroupItem_idp_array;
+extern FloatPropertyRNA rna_PropertyGroupItem_double;
+extern FloatPropertyRNA rna_PropertyGroupItem_double_array;
-extern StructRNA RNA_IDProperty;
-extern StructRNA RNA_IDPropertyGroup;
+extern StructRNA RNA_PropertyGroupItem;
+extern StructRNA RNA_PropertyGroup;
struct IDProperty *rna_idproperty_check(struct PropertyRNA **prop, struct PointerRNA *ptr);
@@ -298,7 +301,7 @@ void rna_builtin_properties_begin(struct CollectionPropertyIterator *iter, struc
void rna_builtin_properties_next(struct CollectionPropertyIterator *iter);
PointerRNA rna_builtin_properties_get(struct CollectionPropertyIterator *iter);
PointerRNA rna_builtin_type_get(struct PointerRNA *ptr);
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key);
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr);
/* Iterators */
@@ -318,9 +321,15 @@ PointerRNA rna_listbase_lookup_int(PointerRNA *ptr, StructRNA *type, struct List
typedef struct ArrayIterator {
char *ptr;
- char *endptr;
+ char *endptr; /* past the last valid pointer, only for comparisons, ignores skipped values */
void *free_ptr; /* will be free'd if set */
int itemsize;
+
+ /* array length with no skip functins applied, take care not to compare against index from animsys or python indices */
+ int length;
+
+ /* optional skip function, when set the array as viewed by rna can contain only a subset of the members.
+ * this changes indices so quick array index lookups are not possible when skip function is used. */
IteratorSkipFunc skip;
} ArrayIterator;
@@ -353,9 +362,9 @@ int rna_parameter_size(struct PropertyRNA *parm);
int rna_parameter_size_alloc(struct PropertyRNA *parm);
// XXX, these should not need to be defined here~!
-struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct ReportList *reports);
-struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct ReportList *reports, int index);
-void rna_mtex_texture_slots_clear(struct ID *self, struct ReportList *reports, int index);
+struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports);
+struct MTex *rna_mtex_texture_slots_create(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
+void rna_mtex_texture_slots_clear(struct ID *self, struct bContext *C, struct ReportList *reports, int index);
#endif /* RNA_INTERNAL_H */
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index 216533a8708..35a80fdec79 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,8 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef RNA_INTERNAL_TYPES
-#define RNA_INTERNAL_TYPES
+#ifndef RNA_INTERNAL_TYPES_H
+#define RNA_INTERNAL_TYPES_H
#include "DNA_listBase.h"
@@ -93,8 +93,8 @@ typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
typedef PointerRNA (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
-typedef PointerRNA (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key);
-typedef PointerRNA (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key);
+typedef int (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct PointerRNA *r_ptr);
+typedef int (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct PointerRNA *r_ptr);
/* Container - generic abstracted container of RNA properties */
typedef struct ContainerRNA {
@@ -108,7 +108,7 @@ struct FunctionRNA {
/* structs are containers of properties */
ContainerRNA cont;
- /* unique identifier */
+ /* unique identifier, keep after 'cont' */
const char *identifier;
/* various options */
int flag;
@@ -283,13 +283,14 @@ struct StructRNA {
/* structs are containers of properties */
ContainerRNA cont;
+ /* unique identifier, keep after 'cont' */
+ const char *identifier;
+
/* python type, this is a subtype of pyrna_struct_Type but used so each struct can have its own type
* which is useful for subclassing RNA */
void *py_type;
void *blender_type;
- /* unique identifier */
- const char *identifier;
/* various options */
int flag;
@@ -340,5 +341,6 @@ struct BlenderRNA {
ListBase structs;
};
-#endif /* RNA_INTERNAL_TYPES */
+#define CONTAINER_RNA_ID(cont) (const char *)(((ContainerRNA *)(cont))+1)
+#endif /* RNA_INTERNAL_TYPES_H */
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 970c825d30b..464d1d850a1 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -57,6 +57,7 @@ static Key *rna_ShapeKey_find_key(ID *id)
case ID_KE: return (Key*)id;
case ID_LT: return ((Lattice*)id)->key;
case ID_ME: return ((Mesh*)id)->key;
+ case ID_OB: return ob_get_key((Object*)id);
default: return NULL;
}
}
@@ -97,17 +98,55 @@ static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max)
*max= data->slidermax;
}
+/* epsilon for how close one end of shapekey range can get to the other */
+#define SHAPEKEY_SLIDER_TOL 0.001
+
+static void rna_ShapeKey_slider_min_range(PointerRNA *ptr, float *min, float *max)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+
+ *min= -10.0f;
+ *max= data->slidermax - SHAPEKEY_SLIDER_TOL;
+}
+
+static void rna_ShapeKey_slider_min_set(PointerRNA *ptr, float value)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+ float min, max;
+
+ rna_ShapeKey_slider_min_range(ptr, &min, &max);
+ CLAMP(value, min, max);
+ data->slidermin = value;
+}
+
+static void rna_ShapeKey_slider_max_range(PointerRNA *ptr, float *min, float *max)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+
+ *min= data->slidermin + SHAPEKEY_SLIDER_TOL;
+ *max= 10.0f;
+}
+
+static void rna_ShapeKey_slider_max_set(PointerRNA *ptr, float value)
+{
+ KeyBlock *data= (KeyBlock*)ptr->data;
+ float min, max;
+
+ rna_ShapeKey_slider_max_range(ptr, &min, &max);
+ CLAMP(value, min, max);
+ data->slidermax = value;
+}
+
+#undef SHAPEKEY_SLIDER_TOL
+
PointerRNA rna_object_shapekey_index_get(ID *id, int value)
{
Key *key= rna_ShapeKey_find_key(id);
KeyBlock *kb= NULL;
PointerRNA ptr;
- int a;
- if(key && value < key->totkey)
- for(a=0, kb=key->block.first; kb; kb=kb->next, a++)
- if(a == value)
- break;
+ if (key && value < key->totkey)
+ kb = BLI_findlink(&key->block, value);
RNA_pointer_create(id, &RNA_ShapeKey, kb, &ptr);
@@ -117,13 +156,11 @@ PointerRNA rna_object_shapekey_index_get(ID *id, int value)
int rna_object_shapekey_index_set(ID *id, PointerRNA value, int current)
{
Key *key= rna_ShapeKey_find_key(id);
- KeyBlock *kb;
- int a;
- if(key)
- for(a=0, kb=key->block.first; kb; kb=kb->next, a++)
- if(kb == value.data)
- return a;
+ if (key) {
+ int a = BLI_findindex(&key->block, value.data);
+ if (a >= 0) return a;
+ }
return current;
}
@@ -245,17 +282,17 @@ static void rna_ShapeKey_data_begin(CollectionPropertyIterator *iter, PointerRNA
Curve *cu;
Nurb *nu;
int tot= kb->totelem, size= key->elemsize;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt) {
tot /= 3;
size *= 3;
}
}
-
+
rna_iterator_array_begin(iter, (void*)kb->data, size, tot, 0, NULL);
}
@@ -266,15 +303,15 @@ static int rna_ShapeKey_data_length(PointerRNA *ptr)
Curve *cu;
Nurb *nu;
int tot= kb->totelem;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt)
tot /= 3;
}
-
+
return tot;
}
@@ -284,11 +321,11 @@ static PointerRNA rna_ShapeKey_data_get(CollectionPropertyIterator *iter)
StructRNA *type;
Curve *cu;
Nurb *nu;
-
+
if(GS(key->from->name) == ID_CU) {
cu= (Curve*)key->from;
nu= cu->nurb.first;
-
+
if(nu->bezt)
type= &RNA_ShapeKeyBezierPoint;
else
@@ -318,12 +355,88 @@ static void rna_Key_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
for(ob=bmain->object.first; ob; ob= ob->id.next) {
if(ob_get_key(ob) == key) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
}
}
+static KeyBlock *rna_ShapeKeyData_find_keyblock(Key *key, float *point)
+{
+ KeyBlock *kb;
+
+ /* sanity checks */
+ if (ELEM(NULL, key, point))
+ return NULL;
+
+ /* we'll need to manually search through the keyblocks and check
+ * if the point is somewhere in the middle of each block's data
+ */
+ for (kb = key->block.first; kb; kb = kb->next) {
+ if (kb->data) {
+ float *start = (float *)kb->data;
+ float *end;
+
+ /* easy cases first */
+ if ((start == NULL) || (start > point)) {
+ /* there's no chance point is in array */
+ continue;
+ }
+ else if (start == point) {
+ /* exact match - point is first in array */
+ return kb;
+ }
+
+ /* determine where end of array is
+ * - elemsize is in bytes, so use char* cast to get array in terms of bytes
+ */
+ end = (float *)((char *)start + (key->elemsize * kb->totelem));
+
+ /* if point's address is less than the end, then it is somewhere between start and end, so in array */
+ if (end > point) {
+ /* we've found the owner of the point data */
+ return kb;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int rna_ShapeKeyPoint_get_index(Key *key, KeyBlock *kb, float *point)
+{
+ /* if we frame the data array and point pointers as char*, then the difference between
+ * them will be in bytes. Thus, dividing through by key->elemsize (number of bytes per point)
+ * gives us the offset of point from start of array.
+ */
+ char *start = (char *)kb->data;
+ char *pt = (char *)point;
+
+ return (int)(pt - start) / key->elemsize;
+}
+
+static char *rna_ShapeKeyPoint_path(PointerRNA *ptr)
+{
+ ID *id = (ID *)ptr->id.data;
+ Key *key = rna_ShapeKey_find_key(ptr->id.data);
+ KeyBlock *kb;
+ float *point = (float *)ptr->data;
+
+ /* if we can get a key block, we can construct a path */
+ kb = rna_ShapeKeyData_find_keyblock(key, point);
+
+ if (kb) {
+ int index = rna_ShapeKeyPoint_get_index(key, kb, point);
+
+ if (GS(id->name) == ID_KE)
+ return BLI_sprintfN("keys[\"%s\"].data[%d]", kb->name, index);
+ else
+ return BLI_sprintfN("shape_keys.keys[\"%s\"].data[%d]", kb->name, index);
+ }
+ else
+ return NULL; // XXX: there's really no way to resolve this...
+}
+
#else
static void rna_def_keydata(BlenderRNA *brna)
@@ -333,6 +446,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyPoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Point", "Point in a shape key");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -342,6 +456,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyCurvePoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Curve Point", "Point in a shape key for curves");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); /* there's nothing type specific here, so this is fine for now */
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -356,6 +471,7 @@ static void rna_def_keydata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "ShapeKeyBezierPoint", NULL);
RNA_def_struct_ui_text(srna, "Shape Key Bezier Point", "Point in a shape key for bezier curves");
+ RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); /* there's nothing type specific here, so this is fine for now */
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -446,12 +562,14 @@ static void rna_def_keyblock(BlenderRNA *brna)
prop= RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "slidermin");
RNA_def_property_range(prop, -10.0f, 10.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_slider_min_set", "rna_ShapeKey_slider_min_range");
RNA_def_property_ui_text(prop, "Slider Min", "Minimum for slider");
prop= RNA_def_property(srna, "slider_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "slidermax");
RNA_def_property_range(prop, -10.0f, 10.0f);
RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_float_funcs(prop, NULL, "rna_ShapeKey_slider_max_set", "rna_ShapeKey_slider_max_range");
RNA_def_property_ui_text(prop, "Slider Max", "Maximum for slider");
prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index fb7bb4a9194..63857fad62d 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -105,7 +105,7 @@ static void rna_Lamp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
if(scene->gm.matmode == GAME_MAT_GLSL)
WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
else
@@ -116,7 +116,7 @@ static void rna_Lamp_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
}
@@ -124,7 +124,7 @@ static void rna_Lamp_sky_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- DAG_id_flush_update(&la->id, 0);
+ DAG_id_tag_update(&la->id, 0);
WM_main_add_notifier(NC_LAMP|ND_SKY, la);
}
@@ -144,6 +144,14 @@ static void rna_Lamp_spot_size_set(PointerRNA *ptr, float value)
#else
+EnumPropertyItem lamp_type_items[] = {
+ {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
+ {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
+ {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
+ {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
+ {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
+ {0, NULL, 0, NULL, NULL}};
+
static void rna_def_lamp_mtex(BlenderRNA *brna)
{
StructRNA *srna;
@@ -326,21 +334,13 @@ static void rna_def_lamp(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem prop_type_items[] = {
- {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
- {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
- {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
- {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
- {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "Lamp", "ID");
RNA_def_struct_refine_func(srna, "rna_Lamp_refine");
RNA_def_struct_ui_text(srna, "Lamp", "Lamp datablock for lighting a scene");
RNA_def_struct_ui_icon(srna, ICON_LAMP_DATA);
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, prop_type_items);
+ RNA_def_property_enum_items(prop, lamp_type_items);
RNA_def_property_ui_text(prop, "Type", "Type of Lamp");
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index f27a1ef86c0..5d5480e3761 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -91,7 +91,7 @@ static void rna_Lattice_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
@@ -180,6 +180,32 @@ static void rna_Lattice_vg_name_set(PointerRNA *ptr, const char *value)
strcpy(lt->editlatt->latt->vgroup, value);
}
+/* annoying, but is a consequence of RNA structures... */
+static char *rna_LatticePoint_path(PointerRNA *ptr)
+{
+ Lattice *lt= (Lattice*)ptr->id.data;
+ void *point= ptr->data;
+ BPoint *points = NULL;
+
+ if (lt->editlatt && lt->editlatt->latt->def)
+ points = lt->editlatt->latt->def;
+ else
+ points = lt->def;
+
+ if (points && point) {
+ int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+
+ /* only return index if in range */
+ if ((point >= (void *)points) && (point < (void *)(points + tot))) {
+ int pt_index = (int)((BPoint *)point - points);
+
+ return BLI_sprintfN("points[%d]", pt_index);
+ }
+ }
+
+ return BLI_strdup("");
+}
+
#else
@@ -191,6 +217,7 @@ static void rna_def_latticepoint(BlenderRNA *brna)
srna= RNA_def_struct(brna, "LatticePoint", NULL);
RNA_def_struct_sdna(srna, "BPoint");
RNA_def_struct_ui_text(srna, "LatticePoint", "Point in the lattice grid");
+ RNA_def_struct_path_func(srna, "rna_LatticePoint_path");
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_array(prop, 3);
@@ -287,6 +314,9 @@ static void rna_def_lattice(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "LatticePoint");
RNA_def_property_collection_funcs(prop, "rna_Lattice_points_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0);
RNA_def_property_ui_text(prop, "Points", "Points of the lattice");
+
+ /* pointers */
+ rna_def_animdata_common(srna);
}
void RNA_def_lattice(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 99758b8f0fe..b01d217376a 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,19 +36,6 @@
#include "BKE_global.h"
/* all the list begin functions are added manually here, Main is not in SDNA */
-static int rna_Main_debug_get(PointerRNA *ptr)
-{
- return G.f & G_DEBUG;
-}
-
-
-static void rna_Main_debug_set(PointerRNA *ptr, const int value)
-{
- if (value)
- G.f |= G_DEBUG;
- else
- G.f &= ~G_DEBUG;
-}
static int rna_Main_is_dirty_get(PointerRNA *ptr)
{
@@ -317,11 +304,6 @@ void RNA_def_main(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_Main_is_dirty_get", NULL);
RNA_def_property_ui_text(prop, "File is Saved", "Has the current session been saved to disk as a .blend file");
- prop= RNA_def_property(srna, "debug", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_Main_debug_get", "rna_Main_debug_set");
- RNA_def_property_ui_text(prop, "Debug", "Print debugging information in console");
-
-
for(i=0; lists[i].name; i++)
{
prop= RNA_def_property(srna, lists[i].identifier, PROP_COLLECTION, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 4ba9b7dd367..9b3f4209edd 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_main_api.c 21094 2009-06-23 00:09:26Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -79,14 +79,16 @@
#include "ED_screen.h"
-Tex *rna_Main_add_texture(Main *bmain, char *name)
+Tex *rna_Main_add_texture(Main *bmain, const char *name)
{
return add_texture(name);
}
-Camera *rna_Main_cameras_new(Main *bmain, char* name)
+Camera *rna_Main_cameras_new(Main *bmain, const char *name)
{
- return add_camera(name);
+ ID *id= add_camera(name);
+ id_us_min(id);
+ return (Camera *)id;
}
void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *camera)
{
@@ -98,7 +100,7 @@ void rna_Main_cameras_remove(Main *bmain, ReportList *reports, struct Camera *ca
/* XXX python now has invalid pointer? */
}
-Scene *rna_Main_scenes_new(Main *bmain, char* name)
+Scene *rna_Main_scenes_new(Main *bmain, const char *name)
{
return add_scene(name);
}
@@ -116,12 +118,13 @@ void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports, struc
return;
}
- ED_screen_set_scene(C, newscene);
+ if(CTX_wm_screen(C)->scene == scene)
+ ED_screen_set_scene(C, newscene);
unlink_scene(bmain, scene, newscene);
}
-Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *data)
+Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char *name, ID *data)
{
Object *ob;
int type= OB_EMPTY;
@@ -159,11 +162,11 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d
}
}
- data->us++;
+ id_us_plus(data);
}
ob= add_only_object(type, name);
- ob->id.us--;
+ id_us_min(&ob->id);
ob->data= data;
test_object_materials(ob->data);
@@ -173,27 +176,20 @@ Object *rna_Main_objects_new(Main *bmain, ReportList *reports, char* name, ID *d
void rna_Main_objects_remove(Main *bmain, ReportList *reports, struct Object *object)
{
- /*
- NOTE: the following example shows when this function should _not_ be called
-
- ob = bpy.data.add_object()
- scene.add_object(ob)
-
- # ob is freed here
- scene.remove_object(ob)
-
- # don't do this since ob is already freed!
- bpy.data.remove_object(ob)
- */
- if(ID_REAL_USERS(object) <= 0)
+ if(ID_REAL_USERS(object) <= 0) {
+ unlink_object(object); /* needed or ID pointers to this are not cleared */
free_libblock(&bmain->object, object);
- else
+ }
+ else {
BKE_reportf(reports, RPT_ERROR, "Object \"%s\" must have zero users to be removed, found %d.", object->id.name+2, ID_REAL_USERS(object));
+ }
}
-struct Material *rna_Main_materials_new(Main *bmain, char* name)
+struct Material *rna_Main_materials_new(Main *bmain, const char *name)
{
- return add_material(name);
+ ID *id= (ID *)add_material(name);
+ id_us_min(id);
+ return (Material *)id;
}
void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material *material)
{
@@ -205,11 +201,13 @@ void rna_Main_materials_remove(Main *bmain, ReportList *reports, struct Material
/* XXX python now has invalid pointer? */
}
-// XXX, commended for now, need to see how this can be used with node groups.
-struct bNodeTree *rna_Main_nodetree_new(Main *bmain, int type)
+struct bNodeTree *rna_Main_nodetree_new(Main *bmain, const char *name, int type)
{
- bNodeTree *tree = ntreeAddTree(type);
- tree->id.us--;
+ bNodeTree *tree = ntreeAddTree(name, type, TRUE);
+
+// ntreeMakeGroupSockets(tree);
+
+ id_us_min(&tree->id);
return tree;
}
void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, struct bNodeTree *tree)
@@ -222,10 +220,10 @@ void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, struct bNodeTree
/* XXX python now has invalid pointer? */
}
-Mesh *rna_Main_meshes_new(Main *bmain, char* name)
+Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
{
Mesh *me= add_mesh(name);
- me->id.us--;
+ id_us_min(&me->id);
return me;
}
void rna_Main_meshes_remove(Main *bmain, ReportList *reports, Mesh *mesh)
@@ -238,10 +236,11 @@ void rna_Main_meshes_remove(Main *bmain, ReportList *reports, Mesh *mesh)
/* XXX python now has invalid pointer? */
}
-Lamp *rna_Main_lamps_new(Main *bmain, char* name)
+Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type)
{
Lamp *lamp= add_lamp(name);
- lamp->id.us--;
+ lamp->type= type;
+ id_us_min(&lamp->id);
return lamp;
}
void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
@@ -254,19 +253,19 @@ void rna_Main_lamps_remove(Main *bmain, ReportList *reports, Lamp *lamp)
/* XXX python now has invalid pointer? */
}
-Image *rna_Main_images_new(Main *bmain, char* name, int width, int height, int alpha, int float_buffer)
+Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer)
{
float color[4]= {0.0, 0.0, 0.0, 1.0};
Image *image= BKE_add_image_size(width, height, name, alpha ? 32:24, float_buffer, 0, color);
- image->id.us--;
+ id_us_min(&image->id);
return image;
}
-Image *rna_Main_images_load(Main *bmain, ReportList *reports, char *filepath)
+Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath)
{
Image *ima;
errno= 0;
- ima= BKE_add_image_file(filepath, 0);
+ ima= BKE_add_image_file(filepath);
if(!ima)
BKE_reportf(reports, RPT_ERROR, "Can't read: \"%s\", %s.", filepath, errno ? strerror(errno) : "Unsupported image format");
@@ -283,10 +282,10 @@ void rna_Main_images_remove(Main *bmain, ReportList *reports, Image *image)
/* XXX python now has invalid pointer? */
}
-Lattice *rna_Main_lattices_new(Main *bmain, char* name)
+Lattice *rna_Main_lattices_new(Main *bmain, const char *name)
{
Lattice *lt= add_lattice(name);
- lt->id.us--;
+ id_us_min(&lt->id);
return lt;
}
void rna_Main_lattices_remove(Main *bmain, ReportList *reports, struct Lattice *lt)
@@ -297,10 +296,10 @@ void rna_Main_lattices_remove(Main *bmain, ReportList *reports, struct Lattice *
BKE_reportf(reports, RPT_ERROR, "Lattice \"%s\" must have zero users to be removed, found %d.", lt->id.name+2, ID_REAL_USERS(lt));
}
-Curve *rna_Main_curves_new(Main *bmain, char* name, int type)
+Curve *rna_Main_curves_new(Main *bmain, const char *name, int type)
{
Curve *cu= add_curve(name, type);
- cu->id.us--;
+ id_us_min(&cu->id);
return cu;
}
void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu)
@@ -311,10 +310,10 @@ void rna_Main_curves_remove(Main *bmain, ReportList *reports, struct Curve *cu)
BKE_reportf(reports, RPT_ERROR, "Curve \"%s\" must have zero users to be removed, found %d.", cu->id.name+2, ID_REAL_USERS(cu));
}
-MetaBall *rna_Main_metaballs_new(Main *bmain, char* name)
+MetaBall *rna_Main_metaballs_new(Main *bmain, const char *name)
{
MetaBall *mb= add_mball(name);
- mb->id.us--;
+ id_us_min(&mb->id);
return mb;
}
void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall *mb)
@@ -325,7 +324,7 @@ void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, struct MetaBall
BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" must have zero users to be removed, found %d.", mb->id.name+2, ID_REAL_USERS(mb));
}
-VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, char *filepath)
+VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *filepath)
{
VFont *font;
@@ -348,11 +347,11 @@ void rna_Main_fonts_remove(Main *bmain, ReportList *reports, VFont *vfont)
/* XXX python now has invalid pointer? */
}
-Tex *rna_Main_textures_new(Main *bmain, char* name, int type)
+Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
{
Tex *tex= add_texture(name);
tex_set_type(tex, type);
- tex->id.us--;
+ id_us_min(&tex->id);
return tex;
}
void rna_Main_textures_remove(Main *bmain, ReportList *reports, struct Tex *tex)
@@ -363,10 +362,10 @@ void rna_Main_textures_remove(Main *bmain, ReportList *reports, struct Tex *tex)
BKE_reportf(reports, RPT_ERROR, "Texture \"%s\" must have zero users to be removed, found %d.", tex->id.name+2, ID_REAL_USERS(tex));
}
-Brush *rna_Main_brushes_new(Main *bmain, char* name)
+Brush *rna_Main_brushes_new(Main *bmain, const char *name)
{
Brush *brush = add_brush(name);
- brush->id.us--;
+ id_us_min(&brush->id);
return brush;
}
void rna_Main_brushes_remove(Main *bmain, ReportList *reports, struct Brush *brush)
@@ -377,10 +376,10 @@ void rna_Main_brushes_remove(Main *bmain, ReportList *reports, struct Brush *bru
BKE_reportf(reports, RPT_ERROR, "Brush \"%s\" must have zero users to be removed, found %d.", brush->id.name+2, ID_REAL_USERS(brush));
}
-World *rna_Main_worlds_new(Main *bmain, char* name)
+World *rna_Main_worlds_new(Main *bmain, const char *name)
{
World *world = add_world(name);
- world->id.us--;
+ id_us_min(&world->id);
return world;
}
void rna_Main_worlds_remove(Main *bmain, ReportList *reports, struct World *world)
@@ -391,29 +390,29 @@ void rna_Main_worlds_remove(Main *bmain, ReportList *reports, struct World *worl
BKE_reportf(reports, RPT_ERROR, "World \"%s\" must have zero users to be removed, found %d.", world->id.name+2, ID_REAL_USERS(world));
}
-Group *rna_Main_groups_new(Main *bmain, char* name)
+Group *rna_Main_groups_new(Main *bmain, const char *name)
{
return add_group(name);
}
-void rna_Main_groups_remove(Main *bmain, ReportList *reports, Group *group)
+void rna_Main_groups_remove(Main *bmain, Group *group)
{
unlink_group(group);
free_libblock(&bmain->group, group);
/* XXX python now has invalid pointer? */
}
-Text *rna_Main_texts_new(Main *bmain, char* name)
+Text *rna_Main_texts_new(Main *bmain, const char *name)
{
return add_empty_text(name);
}
-void rna_Main_texts_remove(Main *bmain, ReportList *reports, Text *text)
+void rna_Main_texts_remove(Main *bmain, Text *text)
{
unlink_text(bmain, text);
free_libblock(&bmain->text, text);
/* XXX python now has invalid pointer? */
}
-Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath)
+Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *filepath)
{
Text *txt;
@@ -426,10 +425,10 @@ Text *rna_Main_texts_load(Main *bmain, ReportList *reports, char* filepath)
return txt;
}
-bArmature *rna_Main_armatures_new(Main *bmain, char* name)
+bArmature *rna_Main_armatures_new(Main *bmain, const char *name)
{
bArmature *arm= add_armature(name);
- arm->id.us--;
+ id_us_min(&arm->id);
return arm;
}
void rna_Main_armatures_remove(Main *bmain, ReportList *reports, bArmature *arm)
@@ -442,10 +441,10 @@ void rna_Main_armatures_remove(Main *bmain, ReportList *reports, bArmature *arm)
/* XXX python now has invalid pointer? */
}
-bAction *rna_Main_actions_new(Main *bmain, char* name)
+bAction *rna_Main_actions_new(Main *bmain, const char *name)
{
bAction *act= add_empty_action(name);
- act->id.us--;
+ id_us_min(&act->id);
act->id.flag &= ~LIB_FAKEUSER;
return act;
}
@@ -459,10 +458,10 @@ void rna_Main_actions_remove(Main *bmain, ReportList *reports, bAction *act)
/* XXX python now has invalid pointer? */
}
-ParticleSettings *rna_Main_particles_new(Main *bmain, char* name)
+ParticleSettings *rna_Main_particles_new(Main *bmain, const char *name)
{
ParticleSettings *part = psys_new_settings(name, bmain);
- part->id.us--;
+ id_us_min(&part->id);
return part;
}
void rna_Main_particles_remove(Main *bmain, ReportList *reports, ParticleSettings *part)
@@ -475,6 +474,35 @@ void rna_Main_particles_remove(Main *bmain, ReportList *reports, ParticleSetting
/* XXX python now has invalid pointer? */
}
+/* tag functions, all the same */
+void rna_Main_cameras_tag(Main *bmain, int value) { tag_main_lb(&bmain->camera, value); }
+void rna_Main_scenes_tag(Main *bmain, int value) { tag_main_lb(&bmain->scene, value); }
+void rna_Main_objects_tag(Main *bmain, int value) { tag_main_lb(&bmain->object, value); }
+void rna_Main_materials_tag(Main *bmain, int value) { tag_main_lb(&bmain->mat, value); }
+void rna_Main_node_groups_tag(Main *bmain, int value) { tag_main_lb(&bmain->nodetree, value); }
+void rna_Main_meshes_tag(Main *bmain, int value) { tag_main_lb(&bmain->mesh, value); }
+void rna_Main_lamps_tag(Main *bmain, int value) { tag_main_lb(&bmain->lamp, value); }
+void rna_Main_libraries_tag(Main *bmain, int value) { tag_main_lb(&bmain->library, value); }
+void rna_Main_screens_tag(Main *bmain, int value) { tag_main_lb(&bmain->screen, value); }
+void rna_Main_window_managers_tag(Main *bmain, int value) { tag_main_lb(&bmain->wm, value); }
+void rna_Main_images_tag(Main *bmain, int value) { tag_main_lb(&bmain->image, value); }
+void rna_Main_lattices_tag(Main *bmain, int value) { tag_main_lb(&bmain->latt, value); }
+void rna_Main_curves_tag(Main *bmain, int value) { tag_main_lb(&bmain->curve, value); }
+void rna_Main_metaballs_tag(Main *bmain, int value) { tag_main_lb(&bmain->mball, value); }
+void rna_Main_fonts_tag(Main *bmain, int value) { tag_main_lb(&bmain->vfont, value); }
+void rna_Main_textures_tag(Main *bmain, int value) { tag_main_lb(&bmain->tex, value); }
+void rna_Main_brushes_tag(Main *bmain, int value) { tag_main_lb(&bmain->brush, value); }
+void rna_Main_worlds_tag(Main *bmain, int value) { tag_main_lb(&bmain->world, value); }
+void rna_Main_groups_tag(Main *bmain, int value) { tag_main_lb(&bmain->group, value); }
+void rna_Main_shape_keys_tag(Main *bmain, int value) { tag_main_lb(&bmain->key, value); }
+void rna_Main_scripts_tag(Main *bmain, int value) { tag_main_lb(&bmain->script, value); }
+void rna_Main_texts_tag(Main *bmain, int value) { tag_main_lb(&bmain->text, value); }
+void rna_Main_sounds_tag(Main *bmain, int value) { tag_main_lb(&bmain->sound, value); }
+void rna_Main_armatures_tag(Main *bmain, int value) { tag_main_lb(&bmain->armature, value); }
+void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action, value); }
+void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); }
+void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); }
+
#else
void RNA_api_main(StructRNA *srna)
@@ -488,7 +516,7 @@ void RNA_api_main(StructRNA *srna)
/*
func= RNA_def_function(srna, "add_image", "rna_Main_add_image");
RNA_def_function_ui_description(func, "Add a new image.");
- parm= RNA_def_string(func, "filepath", "", 0, "", "File path to load image from.");
+ parm= RNA_def_string_file_path(func, "filepath", "", 0, "", "File path to load image from.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "image", "Image", "", "New image.");
RNA_def_function_return(func, parm);
@@ -502,8 +530,8 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainCameras");
- srna= RNA_def_struct(brna, "MainCameras", NULL);
+ RNA_def_property_srna(cprop, "BlendDataCameras");
+ srna= RNA_def_struct(brna, "BlendDataCameras", NULL);
RNA_def_struct_ui_text(srna, "Main Cameras", "Collection of cameras");
func= RNA_def_function(srna, "new", "rna_Main_cameras_new");
@@ -519,6 +547,10 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a camera from the current blendfile.");
parm= RNA_def_pointer(func, "camera", "Camera", "", "Camera to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_cameras_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -527,8 +559,8 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainScenes");
- srna= RNA_def_struct(brna, "MainScenes", NULL);
+ RNA_def_property_srna(cprop, "BlendDataScenes");
+ srna= RNA_def_struct(brna, "BlendDataScenes", NULL);
RNA_def_struct_ui_text(srna, "Main Scenes", "Collection of scenes");
func= RNA_def_function(srna, "new", "rna_Main_scenes_new");
@@ -552,8 +584,8 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainObjects");
- srna= RNA_def_struct(brna, "MainObjects", NULL);
+ RNA_def_property_srna(cprop, "BlendDataObjects");
+ srna= RNA_def_struct(brna, "BlendDataObjects", NULL);
RNA_def_struct_ui_text(srna, "Main Objects", "Collection of objects");
func= RNA_def_function(srna, "new", "rna_Main_objects_new");
@@ -573,6 +605,10 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_objects_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
@@ -581,8 +617,8 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainMaterials");
- srna= RNA_def_struct(brna, "MainMaterials", NULL);
+ RNA_def_property_srna(cprop, "BlendDataMaterials");
+ srna= RNA_def_struct(brna, "BlendDataMaterials", NULL);
RNA_def_struct_ui_text(srna, "Main Material", "Collection of materials");
func= RNA_def_function(srna, "new", "rna_Main_materials_new");
@@ -598,27 +634,32 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a material from the current blendfile.");
parm= RNA_def_pointer(func, "material", "Material", "", "Material to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_materials_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
-// FunctionRNA *func;
-// PropertyRNA *parm;
+ FunctionRNA *func;
+ PropertyRNA *parm;
-/* static EnumPropertyItem node_nodetree_items[] = {
+ static EnumPropertyItem node_nodetree_items[] = {
{0, "SHADER", 0, "Shader", ""},
{1, "COMPOSITE", 0, "Composite", ""},
{2, "TEXTURE", 0, "Texture", ""},
- {0, NULL, 0, NULL, NULL}}; */
+ {0, NULL, 0, NULL, NULL}};
- RNA_def_property_srna(cprop, "MainNodeTrees");
- srna= RNA_def_struct(brna, "MainNodeTrees", NULL);
+ RNA_def_property_srna(cprop, "BlendDataNodeTrees");
+ srna= RNA_def_struct(brna, "BlendDataNodeTrees", NULL);
RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees");
-#if 0 // need to see some examples of using these functions before enabling.
func= RNA_def_function(srna, "new", "rna_Main_nodetree_new");
RNA_def_function_ui_description(func, "Add a new node tree to the main database");
- parm= RNA_def_enum(func, "type", node_nodetree_items, 0, "Type", "The type of curve object to add");
+ parm= RNA_def_string(func, "name", "NodeGroup", 0, "", "New name for the datablock.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", node_nodetree_items, 0, "Type", "The type of node_group to add");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "tree", "NodeTree", "", "New node tree datablock.");
@@ -629,7 +670,10 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a node tree from the current blendfile.");
parm= RNA_def_pointer(func, "tree", "NodeTree", "", "Node tree to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
-#endif
+
+ func= RNA_def_function(srna, "tag", "rna_Main_node_groups_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -637,8 +681,8 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainMeshes");
- srna= RNA_def_struct(brna, "MainMeshes", NULL);
+ RNA_def_property_srna(cprop, "BlendDataMeshes");
+ srna= RNA_def_struct(brna, "BlendDataMeshes", NULL);
RNA_def_struct_ui_text(srna, "Main Meshes", "Collection of meshes");
func= RNA_def_function(srna, "new", "rna_Main_meshes_new");
@@ -654,6 +698,10 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile.");
parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_meshes_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -661,14 +709,16 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainLamps");
- srna= RNA_def_struct(brna, "MainLamps", NULL);
+ RNA_def_property_srna(cprop, "BlendDataLamps");
+ srna= RNA_def_struct(brna, "BlendDataLamps", NULL);
RNA_def_struct_ui_text(srna, "Main Lamps", "Collection of lamps");
func= RNA_def_function(srna, "new", "rna_Main_lamps_new");
RNA_def_function_ui_description(func, "Add a new lamp to the main database");
parm= RNA_def_string(func, "name", "Lamp", 0, "", "New name for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_enum(func, "type", lamp_type_items, 0, "Type", "The type of texture to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "lamp", "Lamp", "", "New lamp datablock.");
RNA_def_function_return(func, parm);
@@ -678,18 +728,55 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a lamp from the current blendfile.");
parm= RNA_def_pointer(func, "lamp", "Lamp", "", "Lamp to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_lamps_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "BlendDataLibraries");
+ srna= RNA_def_struct(brna, "BlendDataLibraries", NULL);
+ RNA_def_struct_ui_text(srna, "Main Libraries", "Collection of libraries");
+ func= RNA_def_function(srna, "tag", "rna_Main_libraries_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "BlendDataScreens");
+ srna= RNA_def_struct(brna, "BlendDataScreens", NULL);
+ RNA_def_struct_ui_text(srna, "Main Screens", "Collection of screens");
+ func= RNA_def_function(srna, "tag", "rna_Main_screens_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
{
-
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "BlendDataWindowManagers");
+ srna= RNA_def_struct(brna, "BlendDataWindowManagers", NULL);
+ RNA_def_struct_ui_text(srna, "Main Window Managers", "Collection of window managers");
+
+ func= RNA_def_function(srna, "tag", "rna_Main_window_managers_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -697,8 +784,8 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainImages");
- srna= RNA_def_struct(brna, "MainImages", NULL);
+ RNA_def_property_srna(cprop, "BlendDataImages");
+ srna= RNA_def_struct(brna, "BlendDataImages", NULL);
RNA_def_struct_ui_text(srna, "Main Images", "Collection of images");
func= RNA_def_function(srna, "new", "rna_Main_images_new");
@@ -706,9 +793,11 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
parm= RNA_def_string(func, "name", "Image", 0, "", "New name for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_int(func, "width", 1024, 1, INT_MAX, "", "Width of the image.", 0, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_int(func, "height", 1024, 1, INT_MAX, "", "Height of the image.", 0, INT_MAX);
- parm= RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
- parm= RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
+ RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
/* return type */
parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock.");
RNA_def_function_return(func, parm);
@@ -716,7 +805,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "load", "rna_Main_images_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Load a new image into the main database");
- parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the file to load.");
+ parm= RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the file to load.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "image", "Image", "", "New image datablock.");
@@ -727,6 +816,10 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove an image from the current blendfile.");
parm= RNA_def_pointer(func, "image", "Image", "", "Image to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_images_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
@@ -735,8 +828,8 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainLattices");
- srna= RNA_def_struct(brna, "MainLattices", NULL);
+ RNA_def_property_srna(cprop, "BlendDataLattices");
+ srna= RNA_def_struct(brna, "BlendDataLattices", NULL);
RNA_def_struct_ui_text(srna, "Main Lattices", "Collection of lattices");
func= RNA_def_function(srna, "new", "rna_Main_lattices_new");
@@ -752,6 +845,10 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a lattice from the current blendfile.");
parm= RNA_def_pointer(func, "lattice", "Lattice", "", "Lattice to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_lattices_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -759,8 +856,8 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainCurves");
- srna= RNA_def_struct(brna, "MainCurves", NULL);
+ RNA_def_property_srna(cprop, "BlendDataCurves");
+ srna= RNA_def_struct(brna, "BlendDataCurves", NULL);
RNA_def_struct_ui_text(srna, "Main Curves", "Collection of curves");
func= RNA_def_function(srna, "new", "rna_Main_curves_new");
@@ -778,6 +875,10 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a curve from the current blendfile.");
parm= RNA_def_pointer(func, "curve", "Curve", "", "Curve to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_curves_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -785,8 +886,8 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainMetaBalls");
- srna= RNA_def_struct(brna, "MainMetaBalls", NULL);
+ RNA_def_property_srna(cprop, "BlendDataMetaBalls");
+ srna= RNA_def_struct(brna, "BlendDataMetaBalls", NULL);
RNA_def_struct_ui_text(srna, "Main MetaBall", "Collection of metaballs");
func= RNA_def_function(srna, "new", "rna_Main_metaballs_new");
@@ -802,6 +903,10 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a metaball from the current blendfile.");
parm= RNA_def_pointer(func, "metaball", "MetaBall", "", "MetaBall to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_metaballs_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -809,14 +914,14 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainFonts");
- srna= RNA_def_struct(brna, "MainFonts", NULL);
+ RNA_def_property_srna(cprop, "BlendDataFonts");
+ srna= RNA_def_struct(brna, "BlendDataFonts", NULL);
RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts");
func= RNA_def_function(srna, "load", "rna_Main_fonts_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Load a new font into the main database");
- parm= RNA_def_string(func, "filepath", "File Path", 0, "", "path of the font to load.");
+ parm= RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the font to load.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "New font datablock.");
@@ -827,6 +932,10 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a font from the current blendfile.");
parm= RNA_def_pointer(func, "vfont", "VectorFont", "", "Font to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_fonts_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -834,8 +943,8 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainTextures");
- srna= RNA_def_struct(brna, "MainTextures", NULL);
+ RNA_def_property_srna(cprop, "BlendDataTextures");
+ srna= RNA_def_struct(brna, "BlendDataTextures", NULL);
RNA_def_struct_ui_text(srna, "Main Textures", "Collection of groups");
func= RNA_def_function(srna, "new", "rna_Main_textures_new");
@@ -853,6 +962,10 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a texture from the current blendfile.");
parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_textures_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -860,8 +973,8 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainBrushes");
- srna= RNA_def_struct(brna, "MainBrushes", NULL);
+ RNA_def_property_srna(cprop, "BlendDataBrushes");
+ srna= RNA_def_struct(brna, "BlendDataBrushes", NULL);
RNA_def_struct_ui_text(srna, "Main Brushes", "Collection of brushes");
func= RNA_def_function(srna, "new", "rna_Main_brushes_new");
@@ -877,6 +990,10 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a brush from the current blendfile.");
parm= RNA_def_pointer(func, "brush", "Brush", "", "Brush to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_brushes_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
@@ -885,8 +1002,8 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainWorlds");
- srna= RNA_def_struct(brna, "MainWorlds", NULL);
+ RNA_def_property_srna(cprop, "BlendDataWorlds");
+ srna= RNA_def_struct(brna, "BlendDataWorlds", NULL);
RNA_def_struct_ui_text(srna, "Main Worlds", "Collection of worlds");
func= RNA_def_function(srna, "new", "rna_Main_worlds_new");
@@ -902,6 +1019,10 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a world from the current blendfile.");
parm= RNA_def_pointer(func, "world", "World", "", "World to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_worlds_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
@@ -910,8 +1031,8 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainGroups");
- srna= RNA_def_struct(brna, "MainGroups", NULL);
+ RNA_def_property_srna(cprop, "BlendDataGroups");
+ srna= RNA_def_struct(brna, "BlendDataGroups", NULL);
RNA_def_struct_ui_text(srna, "Main Groups", "Collection of groups");
func= RNA_def_function(srna, "new", "rna_Main_groups_new");
@@ -923,10 +1044,13 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "remove", "rna_Main_groups_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a group from the current blendfile.");
parm= RNA_def_pointer(func, "group", "Group", "", "Group to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_groups_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -934,8 +1058,8 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainTexts");
- srna= RNA_def_struct(brna, "MainTexts", NULL);
+ RNA_def_property_srna(cprop, "BlendDataTexts");
+ srna= RNA_def_struct(brna, "BlendDataTexts", NULL);
RNA_def_struct_ui_text(srna, "Main Texts", "Collection of texts");
func= RNA_def_function(srna, "new", "rna_Main_texts_new");
@@ -947,7 +1071,6 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "remove", "rna_Main_texts_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove a text from the current blendfile.");
parm= RNA_def_pointer(func, "text", "Text", "", "Text to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
@@ -956,24 +1079,42 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "load", "rna_Main_texts_load");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Add a new text to the main database from a file");
- parm= RNA_def_string(func, "filepath", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock.");
+ parm= RNA_def_string_file_path(func, "filepath", "Path", FILE_MAXDIR + FILE_MAXFILE, "", "path for the datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
/* return type */
parm= RNA_def_pointer(func, "text", "Text", "", "New text datablock.");
RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_texts_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "BlendDataSounds");
+ srna= RNA_def_struct(brna, "BlendDataSounds", NULL);
+ RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds");
+
+ /* TODO, 'load' */
+ func= RNA_def_function(srna, "tag", "rna_Main_sounds_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainArmatures");
- srna= RNA_def_struct(brna, "MainArmatures", NULL);
+ RNA_def_property_srna(cprop, "BlendDataArmatures");
+ srna= RNA_def_struct(brna, "BlendDataArmatures", NULL);
RNA_def_struct_ui_text(srna, "Main Armatures", "Collection of armatures");
func= RNA_def_function(srna, "new", "rna_Main_armatures_new");
@@ -989,6 +1130,10 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a armature from the current blendfile.");
parm= RNA_def_pointer(func, "armature", "Armature", "", "Armature to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_armatures_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -996,8 +1141,8 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainActions");
- srna= RNA_def_struct(brna, "MainActions", NULL);
+ RNA_def_property_srna(cprop, "BlendDataActions");
+ srna= RNA_def_struct(brna, "BlendDataActions", NULL);
RNA_def_struct_ui_text(srna, "Main Actions", "Collection of actions");
func= RNA_def_function(srna, "new", "rna_Main_actions_new");
@@ -1013,6 +1158,10 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a action from the current blendfile.");
parm= RNA_def_pointer(func, "action", "Action", "", "Action to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_actions_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
{
@@ -1020,8 +1169,8 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
FunctionRNA *func;
PropertyRNA *parm;
- RNA_def_property_srna(cprop, "MainParticles");
- srna= RNA_def_struct(brna, "MainParticles", NULL);
+ RNA_def_property_srna(cprop, "BlendDataParticles");
+ srna= RNA_def_struct(brna, "BlendDataParticles", NULL);
RNA_def_struct_ui_text(srna, "Main Particle Settings", "Collection of particle settings");
func= RNA_def_function(srna, "new", "rna_Main_particles_new");
@@ -1037,10 +1186,25 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a particle settings instance from the current blendfile.");
parm= RNA_def_pointer(func, "particle", "ParticleSettings", "", "Particle Settings to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ func= RNA_def_function(srna, "tag", "rna_Main_particles_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
+
void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
{
+ StructRNA *srna;
+ FunctionRNA *func;
+ PropertyRNA *parm;
+ RNA_def_property_srna(cprop, "BlendDataGreasePencils");
+ srna= RNA_def_struct(brna, "BlendDataGreasePencils", NULL);
+ RNA_def_struct_ui_text(srna, "Main Grease Pencils", "Collection of grease pencils");
+
+ func= RNA_def_function(srna, "tag", "rna_Main_gpencil_tag");
+ parm= RNA_def_boolean(func, "value", 0, "Value", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index a3cd4e2fbde..7732e9157bd 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static EnumPropertyItem prop_texture_coordinates_items[] = {
{TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
{TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates"},
{TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object"},
-{TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)"},
+{TEXCO_STRAND, "STRAND", 0, "Strand / Particle", "Uses normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)"},
{TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates"},
{TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates"},
{TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates"},
@@ -67,7 +67,7 @@ static void rna_Material_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
if(scene->gm.matmode == GAME_MAT_GLSL)
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
else
@@ -78,7 +78,7 @@ static void rna_Material_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= ptr->id.data;
- DAG_id_flush_update(&ma->id, 0);
+ DAG_id_tag_update(&ma->id, 0);
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, ma);
}
@@ -276,7 +276,7 @@ static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, Poi
return item;
}
-MTex *rna_mtex_texture_slots_add(ID *self_id, ReportList *reports)
+MTex *rna_mtex_texture_slots_add(ID *self_id, struct bContext *C, ReportList *reports)
{
MTex *mtex= add_mtex_id(self_id, -1);
if (mtex == NULL) {
@@ -284,10 +284,13 @@ MTex *rna_mtex_texture_slots_add(ID *self_id, ReportList *reports)
return NULL;
}
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
+
return mtex;
}
-MTex *rna_mtex_texture_slots_create(ID *self_id, ReportList *reports, int index)
+MTex *rna_mtex_texture_slots_create(ID *self_id, struct bContext *C, ReportList *reports, int index)
{
MTex *mtex;
@@ -298,10 +301,13 @@ MTex *rna_mtex_texture_slots_create(ID *self_id, ReportList *reports, int index)
mtex= add_mtex_id(self_id, index);
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
+
return mtex;
}
-void rna_mtex_texture_slots_clear(ID *self_id, ReportList *reports, int index)
+void rna_mtex_texture_slots_clear(ID *self_id, struct bContext *C, ReportList *reports, int index)
{
MTex **mtex_ar;
short act;
@@ -323,6 +329,9 @@ void rna_mtex_texture_slots_clear(ID *self_id, ReportList *reports, int index)
MEM_freeN(mtex_ar[index]);
mtex_ar[index]= NULL;
}
+
+ /* for redraw only */
+ WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
}
#else
@@ -367,6 +376,19 @@ static void rna_def_material_mtex(BlenderRNA *brna)
{MTEX_NSPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem prop_bump_method_items[] = {
+ {0, "BUMP_ORIGINAL", 0, "Original", ""},
+ {MTEX_COMPAT_BUMP, "BUMP_COMPATIBLE", 0, "Compatible", ""},
+ {MTEX_3TAP_BUMP, "BUMP_DEFAULT", 0, "Default", ""},
+ {MTEX_5TAP_BUMP, "BUMP_BEST_QUALITY", 0, "Best Quality", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_bump_space_items[] = {
+ {0, "BUMP_VIEWSPACE", 0, "ViewSpace", ""},
+ {MTEX_BUMP_OBJECTSPACE, "BUMP_OBJECTSPACE", 0, "ObjectSpace", ""},
+ {MTEX_BUMP_TEXTURESPACE, "BUMP_TEXTURESPACE", 0, "TextureSpace", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "MaterialTextureSlot", "TextureSlot");
RNA_def_struct_sdna(srna, "MTex");
RNA_def_struct_ui_text(srna, "Material Texture Slot", "Texture slot for textures in a Material datablock");
@@ -496,7 +518,7 @@ static void rna_def_material_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "normal_map_space", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "normapspace");
RNA_def_property_enum_items(prop, prop_normal_map_space_items);
- RNA_def_property_ui_text(prop, "Normal Map Space", "");
+ RNA_def_property_ui_text(prop, "Normal Map Space", "Sets space of normal map image");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
@@ -668,9 +690,16 @@ static void rna_def_material_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "use_old_bump", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "texflag", MTEX_NEW_BUMP);
- RNA_def_property_ui_text(prop, "Old Bump", "Use old bump mapping (backwards compatibility option)");
+ prop= RNA_def_property(srna, "bump_method", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
+ RNA_def_property_enum_items(prop, prop_bump_method_items);
+ RNA_def_property_ui_text(prop, "Bump Method", "Method to use for bump mapping");
+ RNA_def_property_update(prop, 0, "rna_Material_update");
+
+ prop= RNA_def_property(srna, "bump_objectspace", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "texflag");
+ RNA_def_property_enum_items(prop, prop_bump_space_items);
+ RNA_def_property_ui_text(prop, "Bump Space", "Space to apply bump mapping in");
RNA_def_property_update(prop, 0, "rna_Material_update");
}
@@ -695,8 +724,8 @@ static void rna_def_material_colors(StructRNA *srna)
{MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
{MA_RAMP_VAL, "VALUE", 0, "Value", ""},
{MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
- {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""},
- {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""},
+ {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_ramp_input_items[] = {
@@ -920,7 +949,7 @@ static void rna_def_material_raymirror(BlenderRNA *brna)
prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "ray_depth");
- RNA_def_property_range(prop, 0, 10);
+ RNA_def_property_ui_range(prop, 0, 100, 1, 3);
RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-reflections");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -949,7 +978,7 @@ static void rna_def_material_raytra(BlenderRNA *brna)
prop= RNA_def_property(srna, "ior", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ang");
- RNA_def_property_range(prop, 1.0f, 3.0f);
+ RNA_def_property_range(prop, 0.25f, 4.0f);
RNA_def_property_ui_text(prop, "IOR", "Sets angular index of refraction for raytraced refraction");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -985,7 +1014,7 @@ static void rna_def_material_raytra(BlenderRNA *brna)
prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "ray_depth_tra");
- RNA_def_property_range(prop, 0, 10);
+ RNA_def_property_ui_range(prop, 0, 100, 1, 3);
RNA_def_property_ui_text(prop, "Depth", "Maximum allowed number of light inter-refractions");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1063,7 +1092,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
prop= RNA_def_property(srna, "cache_resolution", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "precache_resolution");
- RNA_def_property_range(prop, 0, 1024);
+ RNA_def_property_range(prop, 1, 1024);
RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1121,7 +1150,7 @@ static void rna_def_material_volume(BlenderRNA *brna)
prop= RNA_def_property(srna, "reflection_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "reflection_col");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Reflection Color", "Colour of light scattered out of the volume (does not affect transmission)");
+ RNA_def_property_ui_text(prop, "Reflection Color", "Color of light scattered out of the volume (does not affect transmission)");
RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "reflection", PROP_FLOAT, PROP_NONE);
@@ -1372,7 +1401,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_float_sdna(prop, NULL, "spec");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Specular Intensity", "");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
/* NOTE: "har", "param", etc are used for multiple purposes depending on
* settings. This should be fixed in DNA once, for RNA we just expose them
@@ -1383,7 +1412,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_int_sdna(prop, NULL, "har");
RNA_def_property_range(prop, 1, 511);
RNA_def_property_ui_text(prop, "Specular Hardness", "");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "specular_ior", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "refrac");
@@ -1403,7 +1432,7 @@ static void rna_def_material_specularity(StructRNA *srna)
RNA_def_property_ui_text(prop, "Specular Toon Smooth", "Smoothness of specular toon area");
RNA_def_property_update(prop, 0, "rna_Material_update");
- prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "rms");
RNA_def_property_range(prop, 0, 0.4);
RNA_def_property_ui_text(prop, "Specular Slope", "The standard deviation of surface slope");
@@ -1425,8 +1454,10 @@ static void rna_def_material_strand(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tangent Shading", "Uses direction of strands as normal for tangent-shading");
RNA_def_property_update(prop, 0, "rna_Material_update");
+ /* this flag is only set when rendering, not to be edited manually */
prop= RNA_def_property(srna, "use_surface_diffuse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_SURFDIFF);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Surface Diffuse", "Make diffuse shading more similar to shading the surface");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1584,7 +1615,7 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 2.0f, 1, 2);
RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_range(prop, 0, 1);
@@ -1599,7 +1630,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_object_color", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_OBCOLOR);
RNA_def_property_ui_text(prop, "Object Color", "Modulate the result with a per-object color");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "shadow_ray_bias", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "sbias");
@@ -1644,7 +1675,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_shadeless", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHLESS);
RNA_def_property_ui_text(prop, "Shadeless", "Makes this material insensitive to light or shadow");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_draw_update");
prop= RNA_def_property(srna, "use_vertex_color_light", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_VERTEXCOL);
@@ -1791,7 +1822,7 @@ void RNA_def_material(BlenderRNA *brna)
rna_def_animdata_common(srna);
rna_def_mtex_common(brna, srna, "rna_Material_mtex_begin", "rna_Material_active_texture_get",
"rna_Material_active_texture_set", "MaterialTextureSlot", "MaterialTextureSlots", "rna_Material_update");
-
+
/* only material has this one */
prop= RNA_def_property(srna, "use_textures", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "septex", 1);
@@ -1817,7 +1848,6 @@ void RNA_def_material(BlenderRNA *brna)
}
-/* curve.splines */
static void rna_def_texture_slots(BlenderRNA *brna, PropertyRNA *cprop, const char *structname, const char *structname_slots)
{
StructRNA *srna;
@@ -1832,23 +1862,20 @@ static void rna_def_texture_slots(BlenderRNA *brna, PropertyRNA *cprop, const ch
/* functions */
func= RNA_def_function(srna, "add", "rna_mtex_texture_slots_add");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "create", "rna_mtex_texture_slots_create");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to initialize.", 0, INT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "clear", "rna_mtex_texture_slots_clear");
- RNA_def_function_ui_description(func, "Add a number of points to this spline.");
- RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_REPORTS);
- parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clar.", 0, INT_MAX);
+ RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clear.", 0, INT_MAX);
RNA_def_property_flag(parm, PROP_REQUIRED);
}
diff --git a/source/blender/makesrna/intern/rna_material_api.c b/source/blender/makesrna/intern/rna_material_api.c
index 22eb537f24a..063f87caa3a 100644
--- a/source/blender/makesrna/intern/rna_material_api.c
+++ b/source/blender/makesrna/intern/rna_material_api.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index a8a2f08d76c..f667f72906b 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -61,7 +61,7 @@ static void rna_Mesh_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
/* cheating way for importers to avoid slow updates */
if(id->us > 0) {
- DAG_id_flush_update(id, OB_RECALC_DATA);
+ DAG_id_tag_update(id, OB_RECALC_DATA);
WM_main_add_notifier(NC_GEOM|ND_DATA, id);
}
}
@@ -993,7 +993,7 @@ static int rna_Mesh_tot_face_get(PointerRNA *ptr)
return me->edit_btmesh ? me->edit_btmesh->bm->totfacesel : 0;
}
-static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, char *name)
+static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bContext *C, const char *name)
{
CustomData *ldata;
CustomDataLayer *cdl= NULL;
@@ -1007,7 +1007,7 @@ static CustomDataLayer *rna_Mesh_vertex_color_new(struct Mesh *me, struct bConte
return cdl;
}
-static CustomDataLayer *rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, char *name)
+static CustomDataLayer *rna_Mesh_uv_texture_new(struct Mesh *me, struct bContext *C, const char *name)
{
CustomData *pdata;
CustomDataLayer *cdl= NULL;
@@ -1064,7 +1064,9 @@ static void rna_def_mvert(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
- RNA_def_property_float_sdna(prop, NULL, "no");
+ // RNA_def_property_float_sdna(prop, NULL, "no");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_float_funcs(prop, "rna_MeshVertex_normal_get", "rna_MeshVertex_normal_set", NULL);
RNA_def_property_ui_text(prop, "Normal", "Vertex Normal");
@@ -1876,17 +1878,17 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop= RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGELEN);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGELEN);
RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop= RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGEANG);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEANG);
RNA_def_property_ui_text(prop, "Edge Angles", "Displays the angles in the selected edges in degrees, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop= RNA_def_property(srna, "show_extra_face_area", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACEAREA);
+ RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEAREA);
RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces, Using global values when set in the transform panel");
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 938b4ee632b..f6c9405dc78 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_mesh_api.c 21283 2009-07-01 12:19:00Z blendix $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,10 +33,11 @@
#include "BLO_sys_types.h"
+#include "BKE_mesh.h"
#include "ED_mesh.h"
#ifdef RNA_RUNTIME
-char *rna_Mesh_unit_test_compare(struct Mesh *mesh, bContext *C, struct Mesh *mesh2)
+const char *rna_Mesh_unit_test_compare(struct Mesh *mesh, bContext *C, struct Mesh *mesh2)
{
char *ret = mesh_cmp(mesh, mesh2, FLT_EPSILON*60);
@@ -45,6 +46,7 @@ char *rna_Mesh_unit_test_compare(struct Mesh *mesh, bContext *C, struct Mesh *me
return ret;
}
+
#else
void RNA_api_mesh(StructRNA *srna)
@@ -71,6 +73,11 @@ void RNA_api_mesh(StructRNA *srna)
parm= RNA_def_string(func, "result", "nothing", 64, "Return value", "String description of result of comparison");
RNA_def_function_return(func, parm);
+ func= RNA_def_function(srna, "validate", "BKE_mesh_validate");
+ RNA_def_function_ui_description(func, "validate geometry, return True when the mesh has had invalid geometry corrected/removed.");
+ parm= RNA_def_boolean(func, "verbose", 0, "Verbose", "Output information about the errors found");
+ parm= RNA_def_boolean(func, "result", 0, "Result", "");
+ RNA_def_function_return(func, parm);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index 0f2c74d962e..e575ecabac9 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,7 @@
#include <stdlib.h>
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "rna_internal.h"
@@ -93,13 +94,20 @@ static void rna_MetaBall_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
/* cheating way for importers to avoid slow updates */
if(mb->id.us > 0) {
- for(ob=bmain->object.first; ob; ob= ob->id.next)
- if(ob->data == mb)
- copy_mball_properties(scene, ob);
-
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
- WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
+ for(ob=bmain->object.first; ob; ob= ob->id.next)
+ if(ob->data == mb)
+ copy_mball_properties(scene, ob);
+
+ DAG_id_tag_update(&mb->id, 0);
+ WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
+ }
}
+
+static void rna_MetaBall_update_rotation(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ MetaElem *ml= ptr->data;
+ normalize_qt(ml->quat);
+ rna_MetaBall_update_data(bmain, scene, ptr);
}
static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
@@ -108,7 +116,7 @@ static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
/* cheating way for importers to avoid slow updates */
if(mb->id.us > 0) {
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mb->id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
}
@@ -131,21 +139,13 @@ static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, Meta
/* cheating way for importers to avoid slow updates */
if(mb->id.us > 0) {
- DAG_id_flush_update(&mb->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&mb->id, 0);
WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
}
}
#else
-static EnumPropertyItem metaelem_type_items[] = {
- {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
- {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
- {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
- {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
- {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
- {0, NULL, 0, NULL, NULL}};
-
static void rna_def_metaelement(BlenderRNA *brna)
{
StructRNA *srna;
@@ -155,7 +155,7 @@ static void rna_def_metaelement(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "MetaElem");
RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a MetaBall datablock");
RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META);
-
+
/* enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, metaelem_type_items);
@@ -171,8 +171,8 @@ static void rna_def_metaelement(BlenderRNA *brna)
prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "quat");
- RNA_def_property_ui_text(prop, "Rotation", "");
- RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
+ RNA_def_property_ui_text(prop, "Rotation", "Normalized quaternion rotation");
+ RNA_def_property_update(prop, 0, "rna_MetaBall_update_rotation");
prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED|PROP_UNIT_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "rad");
@@ -232,7 +232,7 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
RNA_def_function_ui_description(func, "Add a new spline to the curve.");
- parm= RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
+ RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaelement.");
RNA_def_function_return(func, parm);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 3ae100f925b..03e5b744bc5 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -208,7 +208,7 @@ static char *rna_Modifier_path(PointerRNA *ptr)
static void rna_Modifier_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ptr->id.data);
}
@@ -248,14 +248,14 @@ static void rna_Smoke_set_type(Main *bmain, Scene *scene, PointerRNA *ptr)
{
psys = psmd->psys;
part = psys->part;
- part->flag |= PART_UNBORN;
part->lifetime = 1.0f;
part->sta = 1.0f;
part->end = 250.0f;
part->ren_as = PART_DRAW_NOT;
+ part->draw_as = PART_DRAW_DOT;
sprintf(psys->name, "SmokeParticles");
psys->recalc |= (PSYS_RECALC_RESET|PSYS_RECALC_PHYS);
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
}
if(smd->flow)
@@ -477,6 +477,19 @@ static void rna_ShrinkwrapModifier_target_set(PointerRNA *ptr, PointerRNA value)
modifier_object_set(ptr->id.data, &((ShrinkwrapModifierData*)ptr->data)->target, OB_MESH, value);
}
+static int rna_ShrinkwrapModifier_face_cull_get(PointerRNA *ptr)
+{
+ ShrinkwrapModifierData *swm= (ShrinkwrapModifierData*)ptr->data;
+ return swm->shrinkOpts & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
+}
+
+static void rna_ShrinkwrapModifier_face_cull_set(struct PointerRNA *ptr, int value)
+{
+ ShrinkwrapModifierData *swm= (ShrinkwrapModifierData*)ptr->data;
+
+ swm->shrinkOpts= (swm->shrinkOpts & ~(MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) | value;
+}
+
static void rna_MeshDeformModifier_object_set(PointerRNA *ptr, PointerRNA value)
{
modifier_object_set(ptr->id.data, &((MeshDeformModifierData*)ptr->data)->object, OB_MESH, value);
@@ -666,7 +679,7 @@ static void rna_def_modifier_lattice(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_LatticeModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -698,7 +711,7 @@ static void rna_def_modifier_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_CurveModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -776,6 +789,11 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_VGROUP);
RNA_def_property_ui_text(prop, "Mirror Vertex Groups", "Mirror vertex groups (e.g. .R->.L)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "use_mirror_merge", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", MOD_MIR_NO_MERGE);
+ RNA_def_property_ui_text(prop, "Merge Verticies", "Merge vertices within the merge threshold");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_mirror_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_MIR_MIRROR_U);
@@ -811,7 +829,7 @@ static void rna_def_modifier_decimate(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "DecimateModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_DECIM);
- prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "ratio", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "percent");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 1, 2);
@@ -992,36 +1010,36 @@ static void rna_def_modifier_armature(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
- prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
- RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
- RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ArmatureModifier_vgroup_set");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
- RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+ prop= RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
+ RNA_def_property_ui_text(prop, "Use Bone Envelopes", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_vertex_groups", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_VGROUP);
RNA_def_property_ui_text(prop, "Use Vertex Groups", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "use_bone_envelopes", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
- RNA_def_property_ui_text(prop, "Use Bone Envelopes", "");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
+
prop= RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
- RNA_def_property_ui_text(prop, "Quaternion", "Deform rotation interpolation with quaternions");
+ RNA_def_property_ui_text(prop, "Preserve Volume", "Deform rotation interpolation with quaternions");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_multi_modifier", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "multi", 0);
RNA_def_property_ui_text(prop, "Multi Modifier", "Use same input as previous modifier, and mix results using overall vgroup");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ArmatureModifier_vgroup_set");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
+ RNA_def_property_ui_text(prop, "Invert", "Invert vertex group influence");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_hook(BlenderRNA *brna)
@@ -1057,7 +1075,7 @@ static void rna_def_modifier_hook(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_HookModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -1166,12 +1184,12 @@ static void rna_def_modifier_array(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Constant Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "use_relative_offset", PROP_BOOLEAN, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "use_relative_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "offset_type", MOD_ARR_OFF_RELATIVE);
RNA_def_property_ui_text(prop, "Relative Offset", "Add an offset relative to the object's bounding box");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "relative_offset_displace", PROP_FLOAT, PROP_NONE); /* PROP_TRANSLATION causes units to be used which we dont want */
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_ui_text(prop, "Relative Offset Displacement", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1275,7 +1293,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DisplaceModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1306,7 +1324,7 @@ static void rna_def_modifier_displace(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "texmapping");
RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
RNA_def_property_ui_text(prop, "Texture Coordinates", "");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvlayer_name");
@@ -1438,7 +1456,7 @@ static void rna_def_modifier_smooth(BlenderRNA *brna)
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
- RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
+ RNA_def_property_ui_text(prop, "Vertex Group", "Name of Vertex Group which determines influence of modifier per point");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SmoothModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
@@ -1702,9 +1720,9 @@ static void rna_def_modifier_explode(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Protect", "Clean vertex group edges");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "use_edge_split", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_EdgeSplit);
- RNA_def_property_ui_text(prop, "Split Edges", "Split face edges for nicer shrapnel");
+ prop= RNA_def_property(srna, "use_edge_cut", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_EdgeCut);
+ RNA_def_property_ui_text(prop, "Cut Edges", "Cut face edges for nicer shrapnel");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "show_unborn", PROP_BOOLEAN, PROP_NONE);
@@ -1726,6 +1744,12 @@ static void rna_def_modifier_explode(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", eExplodeFlag_PaSize);
RNA_def_property_ui_text(prop, "Size", "Use particle size for the shrapnel");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "particle_uv", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "uvname");
+ RNA_def_property_string_maxlength(prop, 32);
+ RNA_def_property_ui_text(prop, "Particle UV", "UV Layer to change with particle age");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
}
static void rna_def_modifier_cloth(BlenderRNA *brna)
@@ -1870,6 +1894,12 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
{MOD_SHRINKWRAP_PROJECT, "PROJECT", 0, "Project", ""},
{MOD_SHRINKWRAP_NEAREST_VERTEX, "NEAREST_VERTEX", 0, "Nearest Vertex", ""},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem shrink_face_cull_items[] = {
+ {0, "OFF", 0, "Off", ""},
+ {MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE, "FRONT", 0, "Front", ""},
+ {MOD_SHRINKWRAP_CULL_TARGET_BACKFACE, "BACK", 0, "Back", ""},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ShrinkwrapModifier", "Modifier");
RNA_def_struct_ui_text(srna, "Shrinkwrap Modifier", "Shrink wrapping modifier to shrink wrap and object to a target");
@@ -1882,6 +1912,13 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mode", "");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ prop= RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "shrinkOpts");
+ RNA_def_property_enum_items(prop, shrink_face_cull_items);
+ RNA_def_property_enum_funcs(prop, "rna_ShrinkwrapModifier_face_cull_get", "rna_ShrinkwrapModifier_face_cull_set", NULL);
+ RNA_def_property_ui_text(prop, "Face Cull", "Stop vertices from projecting to a the face on the target when facing towards/away");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to");
RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL, "rna_Mesh_object_poll");
@@ -1900,11 +1937,11 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ShrinkwrapModifier_vgroup_set");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
+
prop= RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "keepDist");
- RNA_def_property_range(prop, 0, FLT_MAX);
- RNA_def_property_ui_range(prop, 0, 100, 1, 2);
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_ui_range(prop, -100, 100, 1, 2);
RNA_def_property_ui_text(prop, "Offset", "Distance to keep from the target");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
@@ -1940,16 +1977,6 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
- prop= RNA_def_property(srna, "use_cull_front_faces", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE);
- RNA_def_property_ui_text(prop, "Cull Front Faces", "Stop vertices from projecting to a front face on the target");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "use_cull_back_faces", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_BACKFACE);
- RNA_def_property_ui_text(prop, "Cull Back Faces", "Stop vertices from projecting to a back face on the target");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
prop= RNA_def_property(srna, "use_keep_above_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE);
RNA_def_property_ui_text(prop, "Keep Above Surface", "");
@@ -2280,6 +2307,7 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Render);
RNA_def_property_ui_text(prop, "Render", "Use modifier during rendering");
RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, NULL);
prop= RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Editmode);
@@ -2297,6 +2325,11 @@ void RNA_def_modifier(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
+ prop= RNA_def_property(srna, "use_apply_on_spline", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_ApplyOnSpline);
+ RNA_def_property_ui_text(prop, "Apply on spline", "Apply this and all preceding deformation modifiers on splines' points rather than on filled curve/surface");
+ RNA_def_property_ui_icon(prop, ICON_SURFACE_DATA, 0);
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* types */
rna_def_modifier_subsurf(brna);
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index 9fc6c481f12..d63fd39a728 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_nla.c 21537 2009-07-11 22:22:53Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,9 @@
#include "MEM_guardedalloc.h"
+#include "WM_api.h"
+#include "WM_types.h"
+
#ifdef RNA_RUNTIME
#include <stdio.h>
@@ -43,6 +46,8 @@
#include "BKE_animsys.h"
#include "BKE_nla.h"
+#include "ED_anim_api.h"
+
/* temp constant defined for these funcs only... */
#define NLASTRIP_MIN_LEN_THRESH 0.1f
@@ -263,6 +268,65 @@ static void rna_NlaStrip_animated_time_set(PointerRNA *ptr, int value)
data->flag &= ~NLASTRIP_FLAG_USR_TIME;
}
+static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *reports, const char *name, int start, bAction *action)
+{
+ NlaStrip *strip = add_nlastrip(action);
+
+ if (strip == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to create new strip.");
+ return NULL;
+ }
+
+ strip->end += (start - strip->start);
+ strip->start = start;
+
+ if (BKE_nlastrips_add_strip(&track->strips, strip) == 0) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to add strip. Track doesn't have any space to accommodate this new strip.");
+ free_nlastrip(NULL, strip);
+ return NULL;
+ }
+
+ /* create dummy AnimData block so that BKE_nlastrip_validate_name()
+ * can be used to ensure a valid name, as we don't have one here...
+ * - only the nla_tracks list is needed there, which we aim to reverse engineer here...
+ */
+ {
+ AnimData adt = {0};
+ NlaTrack *nlt, *nlt_p;
+
+ /* 'first' NLA track is found by going back up chain of given track's parents until we fall off */
+ nlt_p = track; nlt = track;
+ while ((nlt = nlt->prev) != NULL)
+ nlt_p = nlt;
+ adt.nla_tracks.first = nlt_p;
+
+ /* do the same thing to find the last track */
+ nlt_p = track; nlt = track;
+ while ((nlt = nlt->next) != NULL)
+ nlt_p = nlt;
+ adt.nla_tracks.last = nlt_p;
+
+ /* now we can just auto-name as usual */
+ BKE_nlastrip_validate_name(&adt, strip);
+ }
+
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_ADDED, NULL);
+
+ return strip;
+}
+
+static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *reports, NlaStrip *strip)
+{
+ if(BLI_findindex(&track->strips, strip) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "NLA's Strip '%s' not found in track '%s'", strip->name, track->name);
+ return;
+ }
+ else {
+ free_nlastrip(&track->strips, strip);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_REMOVED, NULL);
+ }
+}
+
#else
/* enum defines exported for rna_animation.c */
@@ -301,6 +365,7 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_NlaStrip_name_set");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Enums */
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
@@ -308,16 +373,19 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); // XXX for now, not editable, since this is dangerous
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "Type", "Type of NLA Strip");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "extrapolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "extendmode");
RNA_def_property_enum_items(prop, nla_mode_extend_items);
RNA_def_property_ui_text(prop, "Extrapolation", "Action to take for gaps past the strip extents");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "blendmode");
RNA_def_property_enum_items(prop, nla_mode_blend_items);
RNA_def_property_ui_text(prop, "Blending", "Method used for combining strip's result with accumulated result");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Strip extents */
prop= RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME);
@@ -337,32 +405,38 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "blendin");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_blend_in_set", NULL);
RNA_def_property_ui_text(prop, "Blend In", "Number of frames at start of strip to fade in influence");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "blend_out", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "blendout");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_blend_out_set", NULL);
RNA_def_property_ui_text(prop, "Blend Out", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_auto_blend", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_AUTO_BLENDS);
RNA_def_property_ui_text(prop, "Auto Blend In/Out", "Number of frames for Blending In/Out is automatically determined from overlapping strips");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action */
prop= RNA_def_property(srna, "action", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "act");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Action", "Action referenced by this strip");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action extents */
prop= RNA_def_property(srna, "action_frame_start", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "actstart");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_start_frame_set", NULL);
RNA_def_property_ui_text(prop, "Action Start Frame", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "action_frame_end", PROP_FLOAT, PROP_TIME);
RNA_def_property_float_sdna(prop, NULL, "actend");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_action_end_frame_set", NULL);
RNA_def_property_ui_text(prop, "Action End Frame", "");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Action Reuse */
prop= RNA_def_property(srna, "repeat", PROP_FLOAT, PROP_NONE);
@@ -370,12 +444,14 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_repeat_set", NULL);
RNA_def_property_range(prop, 0.1f, 1000.0f); /* these limits have currently be chosen arbitarily, but could be extended (minimum should still be > 0 though) if needed... */
RNA_def_property_ui_text(prop, "Repeat", "Number of times to repeat the action range");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_float_funcs(prop, NULL, "rna_NlaStrip_scale_set", NULL);
RNA_def_property_range(prop, 0.0001f, 1000.0f); /* these limits can be extended, but beyond this, we can get some crazy+annoying bugs due to numeric errors */
RNA_def_property_ui_text(prop, "Scale", "Scaling factor for action");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* Strip's F-Curves */
prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
@@ -396,21 +472,25 @@ static void rna_def_nlastrip(BlenderRNA *brna)
prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Influence", "Amount the strip contributes to the current result");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "strip_time", PROP_FLOAT, PROP_TIME);
RNA_def_property_ui_text(prop, "Strip Time", "Frame of referenced Action to evaluate");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
// TODO: should the animated_influence/time settings be animatable themselves?
prop= RNA_def_property(srna, "use_animated_influence", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_INFLUENCE);
RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_influence_set");
RNA_def_property_ui_text(prop, "Animated Influence", "Influence setting is controlled by an F-Curve rather than automatically determined");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_animated_time", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME);
RNA_def_property_boolean_funcs(prop, NULL, "rna_NlaStrip_animated_time_set");
RNA_def_property_ui_text(prop, "Animated Strip Time", "Strip time is controlled by an F-Curve rather than automatically determined");
-
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
+
prop= RNA_def_property(srna, "use_animated_time_cyclic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_USR_TIME_CYCLIC);
RNA_def_property_ui_text(prop, "Cyclic Strip Time", "Cycle the animated time within the action start & end");
@@ -421,23 +501,58 @@ static void rna_def_nlastrip(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Strip is active");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_SELECT);
RNA_def_property_ui_text(prop, "Select", "NLA Strip is selected");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Strip is not evaluated");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "use_reverse", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLASTRIP_FLAG_REVERSE);
RNA_def_property_ui_text(prop, "Reversed", "NLA Strip is played back in reverse order (only when timing is automatically determined)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
// TODO:
// - sync length
}
+static void rna_api_nlatrack_strips(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "NlaStrips");
+ srna= RNA_def_struct(brna, "NlaStrips", NULL);
+ RNA_def_struct_sdna(srna, "NlaTrack");
+ RNA_def_struct_ui_text(srna, "Nla Strips", "Collection of Nla Strips");
+
+ func = RNA_def_function(srna, "new", "rna_NlaStrip_new");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Add a new Action-Clip strip to the track");
+ parm= RNA_def_string(func, "name", "NlaStrip", 0, "", "Name for the NLA Strips.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm = RNA_def_int(func, "start", 0, INT_MIN, INT_MAX, "Start Frame", "Start frame for this strip.", INT_MIN, INT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm = RNA_def_pointer(func, "action", "Action", "", "Action to assign to this strip.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ /* return type */
+ parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "New NLA Strip.");
+ RNA_def_function_return(func, parm);
+
+ func = RNA_def_function(srna, "remove", "rna_NlaStrip_remove");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ RNA_def_function_ui_description(func, "Remove a NLA Strip.");
+ parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "NLA Strip to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+}
+
static void rna_def_nlatrack(BlenderRNA *brna)
{
StructRNA *srna;
@@ -451,34 +566,42 @@ static void rna_def_nlatrack(BlenderRNA *brna)
prop= RNA_def_property(srna, "strips", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "NlaStrip");
RNA_def_property_ui_text(prop, "NLA Strips", "NLA Strips on this NLA-track");
-
+
+ rna_api_nlatrack_strips(brna, prop);
+
/* name property */
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "");
RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
/* settings */
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_ACTIVE);
RNA_def_property_ui_text(prop, "Active", "NLA Track is active");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "is_solo", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* can be made editable by hooking it up to the necessary NLA API methods */
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SOLO);
RNA_def_property_ui_text(prop, "Solo", "NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled)");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_SELECTED);
RNA_def_property_ui_text(prop, "Select", "NLA Track is selected");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_MUTED);
RNA_def_property_ui_text(prop, "Muted", "NLA Track is not evaluated");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", NLATRACK_PROTECTED);
RNA_def_property_ui_text(prop, "Locked", "NLA Track is locked");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_NLA, NULL); /* this will do? */
}
/* --------- */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 47a9f8e7537..a526f360355 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,17 +41,90 @@
#include "BKE_texture.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "WM_types.h"
#include "MEM_guardedalloc.h"
+
+EnumPropertyItem node_socket_type_items[] = {
+ {SOCK_VALUE, "VALUE", 0, "Value", ""},
+ {SOCK_VECTOR, "VECTOR", 0, "Vector", ""},
+ {SOCK_RGBA, "RGBA", 0, "RGBA", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_blend_type_items[] = {
+{ 0, "MIX", 0, "Mix", ""},
+{ 1, "ADD", 0, "Add", ""},
+{ 3, "SUBTRACT", 0, "Subtract", ""},
+{ 2, "MULTIPLY", 0, "Multiply", ""},
+{ 4, "SCREEN", 0, "Screen", ""},
+{ 9, "OVERLAY", 0, "Overlay", ""},
+{ 5, "DIVIDE", 0, "Divide", ""},
+{ 6, "DIFFERENCE", 0, "Difference", ""},
+{ 7, "DARKEN", 0, "Darken", ""},
+{ 8, "LIGHTEN", 0, "Lighten", ""},
+{10, "DODGE", 0, "Dodge", ""},
+{11, "BURN", 0, "Burn", ""},
+{15, "COLOR", 0, "Color", ""},
+{14, "VALUE", 0, "Value", ""},
+{13, "SATURATION", 0, "Saturation", ""},
+{12, "HUE", 0, "Hue", ""},
+{16, "SOFT_LIGHT", 0, "Soft Light", ""},
+{17, "LINEAR_LIGHT", 0, "Linear Light",""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_math_items[] = {
+{ 0, "ADD", 0, "Add", ""},
+{ 1, "SUBTRACT", 0, "Subtract", ""},
+{ 2, "MULTIPLY", 0, "Multiply", ""},
+{ 3, "DIVIDE", 0, "Divide", ""},
+{ 4, "SINE", 0, "Sine", ""},
+{ 5, "COSINE", 0, "Cosine", ""},
+{ 6, "TANGENT", 0, "Tangent", ""},
+{ 7, "ARCSINE", 0, "Arcsine", ""},
+{ 8, "ARCCOSINE", 0, "Arccosine", ""},
+{ 9, "ARCTANGENT", 0, "Arctangent", ""},
+{10, "POWER", 0, "Power", ""},
+{11, "LOGARITHM", 0, "Logarithm", ""},
+{12, "MINIMUM", 0, "Minimum", ""},
+{13, "MAXIMUM", 0, "Maximum", ""},
+{14, "ROUND", 0, "Round", ""},
+{15, "LESS_THAN", 0, "Less Than", ""},
+{16, "GREATER_THAN", 0, "Greater Than", ""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_vec_math_items[] = {
+{0, "ADD", 0, "Add", ""},
+{1, "SUBTRACT", 0, "Subtract", ""},
+{2, "AVERAGE", 0, "Average", ""},
+{3, "DOT_PRODUCT", 0, "Dot Product", ""},
+{4, "CROSS_PRODUCT", 0, "Cross Product", ""},
+{5, "NORMALIZE", 0, "Normalize", ""},
+{0, NULL, 0, NULL, NULL}};
+
+EnumPropertyItem node_filter_items[] = {
+{0, "SOFTEN", 0, "Soften", ""},
+{1, "SHARPEN", 0, "Sharpen", ""},
+{2, "LAPLACE", 0, "Laplace", ""},
+{3, "SOBEL", 0, "Sobel", ""},
+{4, "PREWITT", 0, "Prewitt", ""},
+{5, "KIRSCH", 0, "Kirsch", ""},
+{6, "SHADOW", 0, "Shadow", ""},
+{0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
+#include "BLI_linklist.h"
+
#include "ED_node.h"
#include "RE_pipeline.h"
+#include "DNA_scene_types.h"
+#include "WM_api.h"
+
static StructRNA *rna_Node_refine(struct PointerRNA *ptr)
{
bNode *node = (bNode*)ptr->data;
@@ -89,6 +162,22 @@ static StructRNA *rna_NodeSocketType_refine(struct PointerRNA *ptr)
}
}
+static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->data;
+
+ switch(ntree->type) {
+ case NTREE_SHADER:
+ return &RNA_ShaderNodeTree;
+ case NTREE_COMPOSIT:
+ return &RNA_CompositorNodeTree;
+ case NTREE_TEXTURE:
+ return &RNA_TextureNodeTree;
+ default:
+ return &RNA_UnknownType;
+ }
+}
+
static char *rna_Node_path(PointerRNA *ptr)
{
bNode *node= (bNode*)ptr->data;
@@ -103,12 +192,22 @@ static char *rna_NodeSocket_path(PointerRNA *ptr)
bNode *node;
int socketindex;
- if (!nodeFindNode(ntree, sock, &node, NULL)) return NULL;
-
+ /* group sockets */
+ socketindex = BLI_findindex(&ntree->inputs, sock);
+ if (socketindex != -1)
+ return BLI_sprintfN("inputs[%d]", socketindex);
+
+ socketindex = BLI_findindex(&ntree->outputs, sock);
+ if (socketindex != -1)
+ return BLI_sprintfN("outputs[%d]", socketindex);
+
+ /* node sockets */
+ if (!nodeFindNode(ntree, sock, &node, NULL, NULL)) return NULL;
+
socketindex = BLI_findindex(&node->inputs, sock);
if (socketindex != -1)
return BLI_sprintfN("nodes[\"%s\"].inputs[%d]", node->name, socketindex);
-
+
socketindex = BLI_findindex(&node->outputs, sock);
if (socketindex != -1)
return BLI_sprintfN("nodes[\"%s\"].outputs[%d]", node->name, socketindex);
@@ -157,9 +256,25 @@ static void rna_Image_end_frame_set(PointerRNA *ptr, int value)
image->efra= value;
}
+static void rna_Node_scene_set(PointerRNA *ptr, PointerRNA value)
+{
+ bNode *node= (bNode*)ptr->data;
+
+ if (node->id) {
+ id_us_min(node->id);
+ node->id= NULL;
+ }
+
+ node->id= value.data;
+
+ id_us_plus(node->id);
+}
+
+
+
static void node_update(Main *bmain, Scene *scene, bNodeTree *ntree, bNode *node)
{
- ED_node_generic_update(bmain, scene, ntree, node);
+ ED_node_generic_update(bmain, ntree, node);
}
static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -175,12 +290,12 @@ static void rna_NodeGroup_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
- nodeVerifyGroup((bNodeTree *)node->id);
+ nodeGroupVerify((bNodeTree *)node->id);
node_update(bmain, scene, ntree, node);
}
-static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Node_name_set(PointerRNA *ptr, const char *value)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
bNode *node= (bNode*)ptr->data;
@@ -188,14 +303,13 @@ static void rna_Node_update_name(Main *bmain, Scene *scene, PointerRNA *ptr)
/* make a copy of the old name first */
BLI_strncpy(oldname, node->name, sizeof(node->name));
+ /* set new name */
+ BLI_strncpy(node->name, value, sizeof(node->name));
nodeUniqueName(ntree, node);
- node->flag |= NODE_CUSTOM_NAME;
/* fix all the animation data which may link to this */
BKE_all_animdata_fix_paths_rename("nodes", oldname, node->name);
-
- node_update(bmain, scene, ntree, node);
}
/* this should be done at display time! if no custom names are set */
@@ -253,7 +367,19 @@ static void rna_NodeSocket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
bNodeSocket *sock= (bNodeSocket*)ptr->data;
bNode *node;
- if (nodeFindNode(ntree, sock, &node, NULL))
+ if (nodeFindNode(ntree, sock, &node, NULL, NULL))
+ node_update(bmain, scene, ntree, node);
+}
+
+static void rna_NodeGroupSocket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bNodeTree *ntree= (bNodeTree*)ptr->id.data;
+ bNodeSocket *sock= (bNodeSocket*)ptr->data;
+ bNode *node;
+
+ nodeGroupVerify(ntree);
+
+ if (nodeFindNode(ntree, sock, &node, NULL, NULL))
node_update(bmain, scene, ntree, node);
}
@@ -389,6 +515,195 @@ static EnumPropertyItem *rna_Node_channel_itemf(bContext *C, PointerRNA *ptr, in
return item;
}
+static bNode *rna_NodeTree_node_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ bNode *node;
+
+ if (type == NODE_GROUP && group == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "node type \'GROUP\' missing group argument");
+ return NULL;
+ }
+ node = nodeAddNodeType(ntree, type, group, NULL);
+
+ if (node == NULL) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to create node");
+ }
+ else {
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ NodeTagChanged(ntree, node);
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+
+ if (group)
+ id_us_plus(&group->id);
+ }
+
+ return node;
+}
+
+static bNode *rna_NodeTree_node_composite_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ /* raises error on failier */
+ bNode *node= rna_NodeTree_node_new(ntree, C, reports, type, group);
+
+ if (node) {
+ if(ELEM4(node->type, CMP_NODE_COMPOSITE, CMP_NODE_DEFOCUS, CMP_NODE_OUTPUT_FILE, CMP_NODE_R_LAYERS)) {
+ /* annoying, find the node tree we are in, scene can be NULL */
+ Scene *scene;
+ for(scene= CTX_data_main(C)->scene.first; scene; scene= scene->id.next) {
+ if(scene->nodetree == ntree) {
+ break;
+ }
+ }
+ node->id= (ID *)scene;
+ id_us_plus(node->id);
+ }
+
+ ntreeCompositForceHidden(ntree, CTX_data_scene(C));
+ ntreeSolveOrder(ntree);
+ }
+
+ return node;
+}
+
+static bNode *rna_NodeTree_node_texture_new(bNodeTree *ntree, bContext *C, ReportList *reports, int type, bNodeTree *group)
+{
+ /* raises error on failier */
+ bNode *node= rna_NodeTree_node_new(ntree, C, reports, type, group);
+
+ if (node) {
+ ntreeTexCheckCyclics(ntree);
+ }
+
+ return node;
+}
+
+static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNode *node)
+{
+ if (BLI_findindex(&ntree->nodes, node) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate node '%s' in nodetree", node->name);
+ }
+ else {
+ if (node->id)
+ id_us_min(node->id);
+
+ nodeFreeNode(ntree, node);
+ nodeGroupVerify(ntree); /* update group node socket links*/
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+}
+
+static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, bNodeSocket *in, bNodeSocket *out)
+{
+ bNodeLink *ret;
+ bNode *fromnode, *tonode;
+
+ if (!nodeFindNode(ntree, in, &fromnode, NULL, NULL)) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate input socket's node in nodetree");
+ return NULL;
+ }
+
+ if (!nodeFindNode(ntree, out, &tonode, NULL, NULL)) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate output socket's node in nodetree");
+ return NULL;
+ }
+
+ /* unlink node input socket */
+ nodeRemSocketLinks(ntree, out);
+
+ ret= nodeAddLink(ntree, fromnode, in, tonode, out);
+
+ if(ret) {
+ NodeTagChanged(ntree, tonode);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+
+ ntreeSolveOrder(ntree);
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+ return ret;
+}
+
+static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNodeLink *link)
+{
+ if (BLI_findindex(&ntree->links, link) == -1) {
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate link in nodetree");
+ }
+ else {
+ nodeRemLink(ntree, link);
+ ntreeSolveOrder(ntree);
+ nodeGroupVerify(ntree); /* update group node socket links*/
+
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ }
+}
+
+static bNodeSocket *rna_NodeTree_input_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
+{
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_IN);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+}
+
+static bNodeSocket *rna_NodeTree_output_new(bNodeTree *ntree, ReportList *UNUSED(reports), const char *name, int type)
+{
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ bNodeSocket *gsock= nodeGroupAddSocket(ntree, name, type, SOCK_OUT);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+}
+
+static bNodeSocket *rna_NodeTree_input_expose(bNodeTree *ntree, ReportList *reports, bNodeSocket *sock, int add_link)
+{
+ bNode *node;
+ bNodeSocket *gsock;
+ int index, in_out;
+
+ if (!nodeFindNode(ntree, sock, &node, &index, &in_out))
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate socket in nodetree");
+ else if (in_out!=SOCK_IN)
+ BKE_reportf(reports, RPT_ERROR, "Socket is not an input");
+ else {
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_IN);
+ if (add_link)
+ nodeAddLink(ntree, NULL, gsock, node, sock);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+ }
+ return NULL;
+}
+
+static bNodeSocket *rna_NodeTree_output_expose(bNodeTree *ntree, ReportList *reports, bNodeSocket *sock, int add_link)
+{
+ bNode *node;
+ bNodeSocket *gsock;
+ int index, in_out;
+
+ if (!nodeFindNode(ntree, sock, &node, &index, &in_out))
+ BKE_reportf(reports, RPT_ERROR, "Unable to locate socket in nodetree");
+ else if (in_out!=SOCK_OUT)
+ BKE_reportf(reports, RPT_ERROR, "Socket is not an output");
+ else {
+ /* XXX should check if tree is a group here! no good way to do this currently. */
+ gsock = nodeGroupAddSocket(ntree, sock->name, sock->type, SOCK_OUT);
+ if (add_link)
+ nodeAddLink(ntree, node, sock, NULL, gsock);
+
+ nodeGroupVerify(ntree); /* update group node socket links*/
+ WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
+ return gsock;
+ }
+ return NULL;
+}
#else
@@ -406,73 +721,18 @@ static EnumPropertyItem prop_tri_channel_items[] = {
{ 3, "B", 0, "B", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem node_blend_type_items[] = {
-{ 0, "MIX", 0, "Mix", ""},
-{ 1, "ADD", 0, "Add", ""},
-{ 3, "SUBTRACT", 0, "Subtract", ""},
-{ 2, "MULTIPLY", 0, "Multiply", ""},
-{ 4, "SCREEN", 0, "Screen", ""},
-{ 9, "OVERLAY", 0, "Overlay", ""},
-{ 5, "DIVIDE", 0, "Divide", ""},
-{ 6, "DIFFERENCE", 0, "Difference", ""},
-{ 7, "DARKEN", 0, "Darken", ""},
-{ 8, "LIGHTEN", 0, "Lighten", ""},
-{10, "DODGE", 0, "Dodge", ""},
-{11, "BURN", 0, "Burn", ""},
-{15, "COLOR", 0, "Color", ""},
-{14, "VALUE", 0, "Value", ""},
-{13, "SATURATION", 0, "Saturation", ""},
-{12, "HUE", 0, "Hue", ""},
-{16, "SOFT_LIGHT", 0, "Soft Light", ""},
-{17, "LINEAR_LIGHT", 0, "Linear Light",""},
-{0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem node_flip_items[] = {
{0, "X", 0, "Flip X", ""},
{1, "Y", 0, "Flip Y", ""},
{2, "XY", 0, "Flip X & Y", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem node_math_items[] = {
-{ 0, "ADD", 0, "Add", ""},
-{ 1, "SUBTRACT", 0, "Subtract", ""},
-{ 2, "MULTIPLY", 0, "Multiply", ""},
-{ 3, "DIVIDE", 0, "Divide", ""},
-{ 4, "SINE", 0, "Sine", ""},
-{ 5, "COSINE", 0, "Cosine", ""},
-{ 6, "TANGENT", 0, "Tangent", ""},
-{ 7, "ARCSINE", 0, "Arcsine", ""},
-{ 8, "ARCCOSINE", 0, "Arccosine", ""},
-{ 9, "ARCTANGENT", 0, "Arctangent", ""},
-{10, "POWER", 0, "Power", ""},
-{11, "LOGARITHM", 0, "Logarithm", ""},
-{12, "MINIMUM", 0, "Minimum", ""},
-{13, "MAXIMUM", 0, "Maximum", ""},
-{14, "ROUND", 0, "Round", ""},
-{15, "LESS_THAN", 0, "Less Than", ""},
-{16, "GREATER_THAN", 0, "Greater Than", ""},
-{0, NULL, 0, NULL, NULL}};
-
-static EnumPropertyItem node_vec_math_items[] = {
-{0, "ADD", 0, "Add", ""},
-{1, "SUBTRACT", 0, "Subtract", ""},
-{2, "AVERAGE", 0, "Average", ""},
-{3, "DOT_PRODUCT", 0, "Dot Product", ""},
-{4, "CROSS_PRODUCT", 0, "Cross Product", ""},
-{5, "NORMALIZE", 0, "Normalize", ""},
+static EnumPropertyItem node_ycc_items[] = {
+{ 0, "ITUBT601", 0, "ITU 601", ""},
+{ 1, "ITUBT709", 0, "ITU 709", ""},
+{ 2, "JFIF", 0, "Jpeg", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem node_filter_items[] = {
-{0, "SOFTEN", 0, "Soften", ""},
-{1, "SHARPEN", 0, "Sharpen", ""},
-{2, "LAPLACE", 0, "Laplace", ""},
-{3, "SOBEL", 0, "Sobel", ""},
-{4, "PREWITT", 0, "Prewitt", ""},
-{5, "KIRSCH", 0, "Kirsch", ""},
-{6, "SHADOW", 0, "Shadow", ""},
-{0, NULL, 0, NULL, NULL}};
-
-
#define MaxNodes 1000
enum
@@ -515,15 +775,12 @@ static void init(void)
{
memset(nodes, 0, sizeof nodes);
- #define Str(x) #x
-
#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
- reg_node(ID, Category_##Category, EnumName, Str(Category##StructName), #Category, UIName, UIDesc);
+ reg_node(ID, Category_##Category, EnumName, STRINGIFY_ARG(Category##StructName), #Category, UIName, UIDesc);
#include "rna_nodetree_types.h"
#undef DefNode
- #undef Str
reg_node(NODE_GROUP, Category_GroupNode, "GROUP", "NodeGroup", "Node", "Group", "");
}
@@ -593,7 +850,7 @@ static void def_group(StructRNA *srna)
{
PropertyRNA *prop;
- prop = RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
+ prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
RNA_def_property_struct_type(prop, "NodeTree");
RNA_def_property_flag(prop, PROP_EDITABLE);
@@ -753,7 +1010,7 @@ static void def_sh_mapping(StructRNA *srna)
RNA_def_property_ui_range(prop, -10.f, 10.f, 0.1f, 2);
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_mapping_update");
- prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_EULER);
+ prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_XYZ); /* Not PROP_EUL, this is already in degrees, not radians */
RNA_def_property_float_sdna(prop, NULL, "rot");
RNA_def_property_ui_text(prop, "Rotation", "Rotation offset for the input coordinate");
RNA_def_property_ui_range(prop, -360.f, 360.f, 1.f, 2);
@@ -867,17 +1124,23 @@ static void def_cmp_blur(StructRNA *srna)
{R_FILTER_MITCH, "MITCH", 0, "Mitch", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem aspect_correction_type_items[] = {
+ {CMP_NODE_BLUR_ASPECT_NONE, "NONE", 0, "None", ""},
+ {CMP_NODE_BLUR_ASPECT_Y, "Y", 0, "Y", ""},
+ {CMP_NODE_BLUR_ASPECT_X, "X", 0, "X", ""},
+ {0, NULL, 0, NULL, NULL}};
+
RNA_def_struct_sdna_from(srna, "NodeBlurData", "storage");
prop = RNA_def_property(srna, "size_x", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizex");
- RNA_def_property_range(prop, 0, 256);
+ RNA_def_property_range(prop, 0, 2048);
RNA_def_property_ui_text(prop, "Size X", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "size_y", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sizey");
- RNA_def_property_range(prop, 0, 256);
+ RNA_def_property_range(prop, 0, 2048);
RNA_def_property_ui_text(prop, "Size Y", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -886,21 +1149,27 @@ static void def_cmp_blur(StructRNA *srna)
RNA_def_property_ui_text(prop, "Relative", "Use relative (percent) values to define blur radius");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+ prop = RNA_def_property(srna, "aspect_correction", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "aspect");
+ RNA_def_property_enum_items(prop, aspect_correction_type_items);
+ RNA_def_property_ui_text(prop, "Aspect Correction", "Type of aspect correction to use");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+
prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fac");
RNA_def_property_range(prop, 0.0f, 2.0f);
RNA_def_property_ui_text(prop, "Factor", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "factor_x", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "factor_x", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_sdna(prop, NULL, "percentx");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Relative Size X", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "factor_y", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "factor_y", PROP_FLOAT, PROP_PERCENTAGE);
RNA_def_property_float_sdna(prop, NULL, "percenty");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Relative Size Y", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1063,7 +1332,7 @@ static void def_cmp_image(StructRNA *srna)
prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "sfra");
- RNA_def_property_range(prop, 1, MAXFRAMEF);
+ RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
RNA_def_property_ui_text(prop, "Start Frame", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1097,8 +1366,9 @@ static void def_cmp_render_layers(StructRNA *srna)
prop = RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Node_scene_set", NULL, NULL);
RNA_def_property_struct_type(prop, "Scene");
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_ui_text(prop, "Scene", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1131,13 +1401,13 @@ static void def_cmp_output_file(StructRNA *srna)
{0, "NONE", 0, "None", ""},
{1, "PXR24", 0, "Pxr24 (lossy)", ""},
{2, "ZIP", 0, "ZIP (lossless)", ""},
- {3, "PIZ", 0, "PIX (lossless)", ""},
+ {3, "PIZ", 0, "PIZ (lossless)", ""},
{4, "RLE", 0, "RLE (lossless)", ""},
{0, NULL, 0, NULL, NULL}};
RNA_def_struct_sdna_from(srna, "NodeImageFile", "storage");
- prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "File Path", "Output path for the image, same functionality as render output.");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1637,7 +1907,7 @@ static void def_cmp_crop(StructRNA *srna)
RNA_def_property_boolean_sdna(prop, NULL, "custom1", 1);
RNA_def_property_ui_text(prop, "Crop Image Size", "Whether to crop the size of the input image");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
-
+
prop = RNA_def_property(srna, "relative", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Relative", "Use relative values to crop image");
@@ -1851,9 +2121,9 @@ static void def_cmp_glare(StructRNA *srna)
RNA_def_property_ui_text(prop, "Streaks", "Total number of streaks");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
- prop = RNA_def_property(srna, "angle_offset", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "angle_ofs");
- RNA_def_property_range(prop, 0.0f, 180.0f);
+ prop = RNA_def_property(srna, "angle_offset", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "angle_ofs");
+ RNA_def_property_range(prop, 0, 180);
RNA_def_property_ui_text(prop, "Angle Offset", "Streak angle offset in degrees");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1864,7 +2134,7 @@ static void def_cmp_glare(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "use_rotate_45", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "angle", 1);
+ RNA_def_property_boolean_sdna(prop, NULL, "angle", 0);
RNA_def_property_ui_text(prop, "Rotate 45", "Simple star filter: add 45 degree rotation offset");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -2037,6 +2307,27 @@ static void def_cmp_huecorrect(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
+static void def_cmp_zcombine(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "custom1", 0);
+ RNA_def_property_ui_text(prop, "Use Alpha", "Takes Alpha channel into account when doing the Z operation");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
+static void def_cmp_ycc(StructRNA *srna)
+{
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "custom1");
+ RNA_def_property_enum_items(prop, node_ycc_items);
+ RNA_def_property_ui_text(prop, "Mode", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
+}
+
/* -- Texture Nodes --------------------------------------------------------- */
@@ -2159,9 +2450,123 @@ static void rna_def_texture_node(BlenderRNA *brna)
/* -------------------------------------------------------------------------- */
+static void rna_def_nodetree_link_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "NodeLinks");
+ srna= RNA_def_struct(brna, "NodeLinks", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Node Links", "Collection of Node Links");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_link_new");
+ RNA_def_function_ui_description(func, "Add a node link to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "input", "NodeSocket", "", "The input socket.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "output", "NodeSocket", "", "The output socket.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return */
+ parm= RNA_def_pointer(func, "link", "NodeLink", "", "New node link.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_link_remove");
+ RNA_def_function_ui_description(func, "remove a node link from the node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "link", "NodeLink", "", "The node link to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_composite_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "CompositorNodes");
+ srna= RNA_def_struct(brna, "CompositorNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Compositor Nodes", "Collection of Compositor Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_composite_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", compositor_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_shader_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "ShaderNodes");
+ srna= RNA_def_struct(brna, "ShaderNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Shader Nodes", "Collection of Shader Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", shader_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
+static void rna_def_texture_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, "TextureNodes");
+ srna= RNA_def_struct(brna, "TextureNodes", NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Texture Nodes", "Collection of Texture Nodes");
+
+ func= RNA_def_function(srna, "new", "rna_NodeTree_node_texture_new");
+ RNA_def_function_ui_description(func, "Add a node to this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
+ parm= RNA_def_enum(func, "type", texture_node_type_items, 0, "Type", "Type of node to add");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_pointer(func, "group", "NodeTree", "", "The group tree");
+ /* return value */
+ parm= RNA_def_pointer(func, "node", "Node", "", "New node.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_NodeTree_node_remove");
+ RNA_def_function_ui_description(func, "remove a node from this node tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "node", "Node", "", "The node to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+}
+
static void rna_def_node_socket(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna = RNA_def_struct(brna, "NodeSocket", NULL);
RNA_def_struct_ui_text(srna, "Node Socket", "Input or output socket of a node");
@@ -2170,24 +2575,45 @@ static void rna_def_node_socket(BlenderRNA *brna)
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
+ prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+ /* XXX must be editable for group sockets. if necessary use a special rna definition for these */
+// RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Name", "Socket name");
+ RNA_def_struct_name_property(srna, prop);
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeGroupSocket_update");
+
+ /* can add back if there is any use in reading them */
+#if 0
+ prop = RNA_def_property(srna, "min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ns.min");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Minimum Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+
+ prop = RNA_def_property(srna, "max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ns.max");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Maximum Value", "");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_NodeSocket_update");
+#endif
+
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, node_socket_type_items);
+ RNA_def_property_ui_text(prop, "Type", "Node Socket type");
}
static void rna_def_node_socket_value(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "ValueNodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "ValueNodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "Value Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 1);
@@ -2200,18 +2626,13 @@ static void rna_def_node_socket_vector(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "VectorNodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "VectorNodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "Vector Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 3);
@@ -2224,18 +2645,13 @@ static void rna_def_node_socket_rgba(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "RGBANodeSocket", NULL);
+
+ srna = RNA_def_struct(brna, "RGBANodeSocket", "NodeSocket");
RNA_def_struct_ui_text(srna, "RGBA Node Socket", "Input or output socket of a node");
RNA_def_struct_sdna(srna, "bNodeSocket");
RNA_def_struct_ui_icon(srna, ICON_PLUG);
RNA_def_struct_path_func(srna, "rna_NodeSocket_path");
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Name", "Socket name");
- RNA_def_struct_name_property(srna, prop);
-
+
prop = RNA_def_property(srna, "default_value", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "ns.vec");
RNA_def_property_array(prop, 4);
@@ -2266,7 +2682,8 @@ static void rna_def_node(BlenderRNA *brna)
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Node name");
RNA_def_struct_name_property(srna, prop);
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update_name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
@@ -2279,31 +2696,176 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Outputs", "");
}
+static void rna_def_node_link(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "NodeLink", NULL);
+ RNA_def_struct_ui_text(srna, "NodeLink", "Link between nodes in a node tree");
+ RNA_def_struct_sdna(srna, "bNodeLink");
+ RNA_def_struct_ui_icon(srna, ICON_NODE);
+
+ prop = RNA_def_property(srna, "from_node", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "fromnode");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "From node", "");
+
+ prop = RNA_def_property(srna, "to_node", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tonode");
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "To node", "");
+
+ prop = RNA_def_property(srna, "from_socket", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "fromsock");
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "From socket", "");
+
+ prop = RNA_def_property(srna, "to_socket", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "tosock");
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "To socket", "");
+}
+
+static void rna_def_group_sockets_api(BlenderRNA *brna, PropertyRNA *cprop, int in_out)
+{
+ StructRNA *srna;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ RNA_def_property_srna(cprop, (in_out==SOCK_IN ? "GroupInputs" : "GroupOutputs"));
+ srna= RNA_def_struct(brna, (in_out==SOCK_IN ? "GroupInputs" : "GroupOutputs"), NULL);
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_text(srna, "Group Sockets", "Collection of group sockets");
+
+ func= RNA_def_function(srna, "new", (in_out==SOCK_IN ? "rna_NodeTree_input_new" : "rna_NodeTree_output_new"));
+ RNA_def_function_ui_description(func, "Add a socket to the group tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_string(func, "name", "Socket", 32, "Name", "Name of the socket");
+ RNA_def_enum(func, "type", node_socket_type_items, SOCK_VALUE, "Type", "Type of socket");
+ /* return value */
+ parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "expose", (in_out==SOCK_IN ? "rna_NodeTree_input_expose" : "rna_NodeTree_output_expose"));
+ RNA_def_function_ui_description(func, "Expose an internal socket in the group tree.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ RNA_def_pointer(func, "sock", "NodeSocket", "Socket", "Internal node socket to expose");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_boolean(func, "add_link", TRUE, "Add Link", "If TRUE, adds a link to the internal socket");
+ /* return value */
+ parm= RNA_def_pointer(func, "socket", "NodeSocket", "", "New socket.");
+ RNA_def_function_return(func, parm);
+}
+
static void rna_def_nodetree(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+
+ static EnumPropertyItem nodetree_type_items[] = {
+ {NTREE_SHADER, "SHADER", 0, "Shader", ""},
+ {NTREE_COMPOSIT, "COMPOSITE", 0, "Composite", ""},
+ {NTREE_TEXTURE, "TEXTURE", 0, "Texture", ""},
+ {0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "NodeTree", "ID");
RNA_def_struct_ui_text(srna, "Node Tree", "Node tree consisting of linked nodes used for materials, textures and compositing");
RNA_def_struct_sdna(srna, "bNodeTree");
RNA_def_struct_ui_icon(srna, ICON_NODETREE);
-
+ RNA_def_struct_refine_func(srna, "rna_NodeTree_refine");
+
/* AnimData */
rna_def_animdata_common(srna);
- /* Nodes Collection */
- prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
- RNA_def_property_struct_type(prop, "Node");
- RNA_def_property_ui_text(prop, "Nodes", "");
-
+ /* NodeLinks Collection */
+ prop = RNA_def_property(srna, "links", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "links", NULL);
+ RNA_def_property_struct_type(prop, "NodeLink");
+ RNA_def_property_ui_text(prop, "Links", "");
+ rna_def_nodetree_link_api(brna, prop);
+
/* Grease Pencil */
prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "gpd");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "GreasePencil");
RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+
+ prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_enum_items(prop, nodetree_type_items);
+ RNA_def_property_ui_text(prop, "Type", "Node Tree type");
+
+ /* group sockets */
+ prop = RNA_def_property(srna, "inputs", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "inputs", NULL);
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "Inputs", "");
+ rna_def_group_sockets_api(brna, prop, SOCK_IN);
+
+ prop = RNA_def_property(srna, "outputs", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL);
+ RNA_def_property_struct_type(prop, "NodeSocket");
+ RNA_def_property_ui_text(prop, "Outputs", "");
+ rna_def_group_sockets_api(brna, prop, SOCK_OUT);
+}
+
+static void rna_def_composite_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "CompositorNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Compositor Node Tree", "Node tree consisting of linked nodes used for compositing");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_composite_nodetree_api(brna, prop);
+}
+
+static void rna_def_shader_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ShaderNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Shader Node Tree", "Node tree consisting of linked nodes used for materials");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_shader_nodetree_api(brna, prop);
+}
+
+static void rna_def_texture_nodetree(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "TextureNodeTree", "NodeTree");
+ RNA_def_struct_ui_text(srna, "Texture Node Tree", "Node tree consisting of linked nodes used for textures");
+ RNA_def_struct_sdna(srna, "bNodeTree");
+ RNA_def_struct_ui_icon(srna, ICON_NODETREE);
+
+ /* Nodes Collection */
+ prop = RNA_def_property(srna, "nodes", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "nodes", NULL);
+ RNA_def_property_struct_type(prop, "Node");
+ RNA_def_property_ui_text(prop, "Nodes", "");
+
+ rna_def_texture_nodetree_api(brna, prop);
}
static void define_specific_node(BlenderRNA *brna, int id, void (*func)(StructRNA*))
@@ -2323,10 +2885,13 @@ void RNA_def_nodetree(BlenderRNA *brna)
rna_def_node_socket_vector(brna);
rna_def_node_socket_rgba(brna);
rna_def_node(brna);
+ rna_def_node_link(brna);
rna_def_shader_node(brna);
rna_def_compositor_node(brna);
rna_def_texture_node(brna);
-
+ rna_def_composite_nodetree(brna);
+ rna_def_shader_nodetree(brna);
+ rna_def_texture_nodetree(brna);
#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
define_specific_node(brna, ID, DefFunc);
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index f824f6f20ce..0dd622924fc 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -71,13 +71,13 @@ DefNode( CompositorNode, CMP_NODE_COMPOSITE, 0, "COMPO
DefNode( CompositorNode, CMP_NODE_OUTPUT_FILE, def_cmp_output_file, "OUTPUT_FILE", OutputFile, "Output File", "" )
DefNode( CompositorNode, CMP_NODE_TEXTURE, def_texture, "TEXTURE", Texture, "Texture", "" )
DefNode( CompositorNode, CMP_NODE_TRANSLATE, 0, "TRANSLATE", Translate, "Translate", "" )
-DefNode( CompositorNode, CMP_NODE_ZCOMBINE, 0, "ZCOMBINE", Zcombine, "Z Combine", "" )
+DefNode( CompositorNode, CMP_NODE_ZCOMBINE, def_cmp_zcombine, "ZCOMBINE", Zcombine, "Z Combine", "" )
DefNode( CompositorNode, CMP_NODE_COMBRGBA, 0, "COMBRGBA", CombRGBA, "Combine RGBA", "" )
DefNode( CompositorNode, CMP_NODE_DILATEERODE, def_cmp_dilate_erode, "DILATEERODE", DilateErode, "Dilate/Erode", "" )
DefNode( CompositorNode, CMP_NODE_ROTATE, def_cmp_rotate, "ROTATE", Rotate, "Rotate", "" )
DefNode( CompositorNode, CMP_NODE_SCALE, def_cmp_scale, "SCALE", Scale, "Scale", "" )
-DefNode( CompositorNode, CMP_NODE_SEPYCCA, 0, "SEPYCCA", SepYCCA, "Separate YCCA", "" )
-DefNode( CompositorNode, CMP_NODE_COMBYCCA, 0, "COMBYCCA", CombYCCA, "Combine YCCA", "" )
+DefNode( CompositorNode, CMP_NODE_SEPYCCA, def_cmp_ycc, "SEPYCCA", SepYCCA, "Separate YCCA", "" )
+DefNode( CompositorNode, CMP_NODE_COMBYCCA, def_cmp_ycc, "COMBYCCA", CombYCCA, "Combine YCCA", "" )
DefNode( CompositorNode, CMP_NODE_SEPYUVA, 0, "SEPYUVA", SepYUVA, "Separate YUVA", "" )
DefNode( CompositorNode, CMP_NODE_COMBYUVA, 0, "COMBYUVA", CombYUVA, "Combine YUVA", "" )
DefNode( CompositorNode, CMP_NODE_DIFF_MATTE, def_cmp_diff_matte, "DIFF_MATTE", DiffMatte, "Difference Key", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index cf4d554ac4d..48054604a25 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,21 +34,24 @@
#include "DNA_action_types.h"
#include "DNA_customdata_types.h"
#include "DNA_controller_types.h"
+#include "DNA_group_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
+#include "DNA_meta_types.h"
#include "BKE_tessmesh.h"
+#include "BKE_group.h" /* needed for object_in_group() */
#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
#include "ED_mesh.h"
#include "WM_api.h"
#include "WM_types.h"
-//bleh
+
EnumPropertyItem object_mode_items[] = {
{OB_MODE_OBJECT, "OBJECT", ICON_OBJECT_DATAMODE, "Object", ""},
{OB_MODE_EDIT, "EDIT", ICON_EDITMODE_HLT, "Edit", ""},
@@ -82,17 +85,25 @@ static EnumPropertyItem collision_bounds_items[] = {
//{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem metaelem_type_items[] = {
+ {MB_BALL, "BALL", ICON_META_BALL, "Ball", ""},
+ {MB_TUBE, "CAPSULE", ICON_META_CAPSULE, "Capsule", ""},
+ {MB_PLANE, "PLANE", ICON_META_PLANE, "Plane", ""},
+ {MB_ELIPSOID, "ELLIPSOID", ICON_META_ELLIPSOID, "Ellipsoid", ""}, // NOTE: typo at original definition!
+ {MB_CUBE, "CUBE", ICON_META_CUBE, "Cube", ""},
+ {0, NULL, 0, NULL, NULL}};
+
/* used for 2 enums */
#define OBTYPE_CU_CURVE {OB_CURVE, "CURVE", 0, "Curve", ""}
#define OBTYPE_CU_SURF {OB_SURF, "SURFACE", 0, "Surface", ""}
-#define OBTYPE_CU_TEXT {OB_FONT, "TEXT", 0, "Text", ""}
+#define OBTYPE_CU_FONT {OB_FONT, "FONT", 0, "Font", ""}
EnumPropertyItem object_type_items[] = {
{OB_MESH, "MESH", 0, "Mesh", ""},
OBTYPE_CU_CURVE,
OBTYPE_CU_SURF,
{OB_MBALL, "META", 0, "Meta", ""},
- OBTYPE_CU_TEXT,
+ OBTYPE_CU_FONT,
{0, "", 0, NULL, NULL},
{OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
{OB_LATTICE, "LATTICE", 0, "Lattice", ""},
@@ -105,15 +116,17 @@ EnumPropertyItem object_type_items[] = {
EnumPropertyItem object_type_curve_items[] = {
OBTYPE_CU_CURVE,
OBTYPE_CU_SURF,
- OBTYPE_CU_TEXT,
+ OBTYPE_CU_FONT,
{0, NULL, 0, NULL, NULL}};
-
+
+
#ifdef RNA_RUNTIME
#include "BLI_math.h"
#include "DNA_key_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_lattice_types.h"
#include "BKE_armature.h"
#include "BKE_bullet.h"
@@ -140,12 +153,13 @@ EnumPropertyItem object_type_curve_items[] = {
static void rna_Object_internal_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB);
}
static void rna_Object_matrix_world_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat);
+ /* dont use compat so we get predictable rotation */
+ object_apply_mat4(ptr->id.data, ((Object *)ptr->id.data)->obmat, FALSE, TRUE);
rna_Object_internal_update(bmain, scene, ptr);
}
@@ -179,12 +193,25 @@ static void rna_Object_matrix_local_set(PointerRNA *ptr, const float values[16])
copy_m4_m4(ob->obmat, (float(*)[4])values);
}
- object_apply_mat4(ob, ob->obmat);
+ /* dont use compat so we get predictable rotation */
+ object_apply_mat4(ob, ob->obmat, FALSE, FALSE);
+}
+
+static void rna_Object_matrix_basis_get(PointerRNA *ptr, float values[16])
+{
+ Object *ob= ptr->id.data;
+ object_to_mat4(ob, (float(*)[4])values);
+}
+
+static void rna_Object_matrix_basis_set(PointerRNA *ptr, const float values[16])
+{
+ Object *ob= ptr->id.data;
+ object_apply_mat4(ob, (float(*)[4])values, FALSE, FALSE);
}
void rna_Object_internal_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ptr->id.data);
}
@@ -216,8 +243,9 @@ void rna_Object_active_shape_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Object_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_OB);
DAG_scene_sort(bmain, scene);
+ WM_main_add_notifier(NC_OBJECT|ND_PARENT, ptr->id.data);
}
/* when changing the selection flag the scene needs updating */
@@ -403,6 +431,20 @@ static void rna_Object_parent_bone_set(PointerRNA *ptr, const char *value)
ED_object_parent(ob, ob->parent, ob->partype, value);
}
+static void rna_Object_dup_group_set(PointerRNA *ptr, PointerRNA value)
+{
+ Object *ob= (Object *)ptr->data;
+ Group *grp = (Group *)value.data;
+
+ /* must not let this be set if the object belongs in this group already,
+ * thus causing a cycle/infinite-recursion leading to crashes on load [#25298]
+ */
+ if (object_in_group(ob, grp) == 0)
+ ob->dup_group = grp;
+ else
+ BKE_report(NULL, RPT_ERROR, "Cannot set dupli-group as object belongs in group being instanced thus causing a cycle");
+}
+
static int rna_VertexGroup_index_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -547,11 +589,12 @@ static void rna_Object_active_material_index_range(PointerRNA *ptr, int *min, in
*max= MAX2(ob->totcol-1, 0);
}
+/* returns active base material */
static PointerRNA rna_Object_active_material_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
Material *ma;
-
+
ma= (ob->totcol)? give_current_material(ob, ob->actcol): NULL;
return rna_pointer_inherit_refine(ptr, &RNA_Material, ma);
}
@@ -560,6 +603,7 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
{
Object *ob= (Object*)ptr->id.data;
+ DAG_id_tag_update(value.data, 0);
assign_material(ob, value.data, ob->actcol);
}
@@ -770,6 +814,12 @@ static void rna_MaterialSlot_name_get(PointerRNA *ptr, char *str)
strcpy(str, "");
}
+static void rna_MaterialSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ rna_Object_internal_update(bmain, scene, ptr);
+ WM_main_add_notifier(NC_OBJECT|ND_OB_SHADING, ptr->id.data);
+}
+
/* why does this have to be so complicated?, can't all this crap be
* moved to in BGE conversion function? - Campbell *
*
@@ -1039,11 +1089,11 @@ static void rna_Object_constraints_remove(Object *object, ReportList *reports, b
}
remove_constraint(&object->constraints, con);
- ED_object_constraint_set_active(object, NULL);
- WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
- }
+ ED_object_constraint_set_active(object, NULL);
+ WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
+}
-static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, char *name, int type)
+static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, ReportList *reports, const char *name, int type)
{
return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
}
@@ -1061,15 +1111,65 @@ static void rna_Object_boundbox_get(PointerRNA *ptr, float *values)
memcpy(values, bb->vec, sizeof(bb->vec));
}
else {
- memset(values, -1.0f, sizeof(bb->vec));
+ fill_vn(values, sizeof(bb->vec)/sizeof(float), 0.0f);
}
}
-static void rna_Object_add_vertex_to_group(Object *ob, int index_len, int *index, bDeformGroup *def, float weight, int assignmode)
+static bDeformGroup *rna_Object_vgroup_new(Object *ob, const char *name)
+{
+ bDeformGroup *defgroup = ED_vgroup_add_name(ob, name);
+
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
+
+ return defgroup;
+}
+
+static void rna_Object_vgroup_remove(Object *ob, bDeformGroup *defgroup)
{
+ ED_vgroup_delete(ob, defgroup);
+
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
+}
+
+static void rna_VertexGroup_vertex_add(ID *id, bDeformGroup *def, ReportList *reports, int index_len, int *index, float weight, int assignmode)
+{
+ Object *ob = (Object *)id;
+
+ if(ED_vgroup_object_is_edit_mode(ob)) {
+ BKE_reportf(reports, RPT_ERROR, "VertexGroup.add(): Can't be called while object is in edit mode.");
+ return;
+ }
+
while(index_len--)
- ED_vgroup_vert_add(ob, def, *index++, weight, assignmode);
+ ED_vgroup_vert_add(ob, def, *index++, weight, assignmode); /* XXX, not efficient calling within loop*/
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, (ID *)ob->data);
+}
+
+static void rna_VertexGroup_vertex_remove(ID *id, bDeformGroup *dg, ReportList *reports, int index_len, int *index)
+{
+ Object *ob = (Object *)id;
+
+ if(ED_vgroup_object_is_edit_mode(ob)) {
+ BKE_reportf(reports, RPT_ERROR, "VertexGroup.remove(): Can't be called while object is in edit mode.");
+ return;
+ }
+
+ while(index_len--)
+ ED_vgroup_vert_remove(ob, dg, *index++);
+
+ WM_main_add_notifier(NC_GEOM|ND_DATA, (ID *)ob->data);
+}
+
+static float rna_VertexGroup_weight(ID *id, bDeformGroup *dg, ReportList *reports, int index)
+{
+ float weight = ED_vgroup_vert_weight((Object *)id, dg, index);
+
+ if(weight < 0) {
+ BKE_reportf(reports, RPT_ERROR, "Vertex not in group");
+ }
+ return weight;
}
/* generic poll functions */
@@ -1100,10 +1200,20 @@ int rna_Camera_object_poll(PointerRNA *ptr, PointerRNA value)
#else
+static int rna_matrix_dimsize_4x4[]= {4, 4};
+
static void rna_def_vertex_group(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
+
+ static EnumPropertyItem assign_mode_items[] = {
+ {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
+ {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
+ {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
+ {0, NULL, 0, NULL, NULL}
+ };
srna= RNA_def_struct(brna, "VertexGroup", NULL);
RNA_def_struct_sdna(srna, "bDeformGroup");
@@ -1113,12 +1223,38 @@ static void rna_def_vertex_group(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Vertex group name");
RNA_def_struct_name_property(srna, prop);
- RNA_def_property_update(prop, NC_GEOM|ND_DATA|NA_RENAME, NULL);
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA|NA_RENAME, "rna_Object_internal_update_data"); /* update data because modifiers may use [#24761] */
prop= RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_int_funcs(prop, "rna_VertexGroup_index_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Index", "Index number of the vertex group");
+
+ func= RNA_def_function(srna, "add", "rna_VertexGroup_vertex_add");
+ RNA_def_function_ui_description(func, "Add vertices to the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ /* TODO, see how array size of 0 works, this shouldnt be used */
+ prop= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
+ RNA_def_property_flag(prop, PROP_DYNAMIC|PROP_REQUIRED);
+ prop= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "remove", "rna_VertexGroup_vertex_remove");
+ RNA_def_function_ui_description(func, "Remove a vertex from the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ /* TODO, see how array size of 0 works, this shouldnt be used */
+ prop= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
+ RNA_def_property_flag(prop, PROP_DYNAMIC|PROP_REQUIRED);
+
+ func= RNA_def_function(srna, "weight", "rna_VertexGroup_weight");
+ RNA_def_function_ui_description(func, "Get a vertex weight from the group.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID);
+ prop=RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "The index of the vertex.", 0, INT_MAX);
+ RNA_def_property_flag(prop, PROP_REQUIRED);
+ prop= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
+ RNA_def_function_return(func, prop);
}
static void rna_def_material_slot(BlenderRNA *brna)
@@ -1144,13 +1280,13 @@ static void rna_def_material_slot(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_funcs(prop, "rna_MaterialSlot_material_get", "rna_MaterialSlot_material_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Material", "Material datablock used by this material slot");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "link", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, link_items);
RNA_def_property_enum_funcs(prop, "rna_MaterialSlot_link_get", "rna_MaterialSlot_link_set", NULL);
RNA_def_property_ui_text(prop, "Link", "Link material to object or the object's data");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_MaterialSlot_name_get", "rna_MaterialSlot_name_length", NULL);
@@ -1458,6 +1594,7 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "remove", "rna_Object_modifier_remove");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
RNA_def_function_ui_description(func, "Remove an existing modifier from the object.");
+
/* target to remove*/
parm= RNA_def_pointer(func, "modifier", "Modifier", "", "Modifier to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
@@ -1485,6 +1622,7 @@ static void rna_def_object_particle_systems(BlenderRNA *brna, PropertyRNA *cprop
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_funcs(prop, "rna_Object_active_particle_system_index_get", "rna_Object_active_particle_system_index_set", "rna_Object_active_particle_system_index_range");
RNA_def_property_ui_text(prop, "Active Particle System Index", "Index of active particle system slot");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_particle_update");
@@ -1494,13 +1632,6 @@ static void rna_def_object_particle_systems(BlenderRNA *brna, PropertyRNA *cprop
/* object.vertex_groups */
static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
- static EnumPropertyItem assign_mode_items[] = {
- {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace"},
- {WEIGHT_ADD, "ADD", 0, "Add", "Add"},
- {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract"},
- {0, NULL, 0, NULL, NULL}
- };
-
StructRNA *srna;
PropertyRNA *prop;
@@ -1520,30 +1651,23 @@ static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_internal_update_data");
prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_sdna(prop, NULL, "actdef");
RNA_def_property_int_funcs(prop, "rna_Object_active_vertex_group_index_get", "rna_Object_active_vertex_group_index_set", "rna_Object_active_vertex_group_index_range");
RNA_def_property_ui_text(prop, "Active Vertex Group Index", "Active index in vertex group array");
RNA_def_property_update(prop, NC_GEOM|ND_DATA, "rna_Object_internal_update_data");
/* vertex groups */ // add_vertex_group
- func= RNA_def_function(srna, "new", "ED_vgroup_add_name");
+ func= RNA_def_function(srna, "new", "rna_Object_vgroup_new");
RNA_def_function_ui_description(func, "Add vertex group to object.");
- parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
+ RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
RNA_def_function_return(func, parm);
- func= RNA_def_function(srna, "assign", "rna_Object_add_vertex_to_group");
- RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
- /* TODO, see how array size of 0 works, this shouldnt be used */
- parm= RNA_def_int_array(func, "index", 1, NULL, 0, 0, "", "Index List.", 0, 0);
- RNA_def_property_flag(parm, PROP_DYNAMIC);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
- RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ func= RNA_def_function(srna, "remove", "rna_Object_vgroup_remove");
+ RNA_def_function_ui_description(func, "Delete vertex group from object.");
+ parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
@@ -1552,23 +1676,10 @@ static void rna_def_object(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- static EnumPropertyItem object_type_items[] = {
- {OB_EMPTY, "EMPTY", 0, "Empty", ""},
- {OB_MESH, "MESH", 0, "Mesh", ""},
- {OB_CURVE, "CURVE", 0, "Curve", ""},
- {OB_SURF, "SURFACE", 0, "Surface", ""},
- {OB_FONT, "TEXT", 0, "Text", ""},
- {OB_MBALL, "META", 0, "Meta", ""},
- {OB_LAMP, "LAMP", 0, "Lamp", ""},
- {OB_CAMERA, "CAMERA", 0, "Camera", ""},
- {OB_LATTICE, "LATTICE", 0, "Lattice", ""},
- {OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
- {0, NULL, 0, NULL, NULL}};
-
static EnumPropertyItem empty_drawtype_items[] = {
+ {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
{OB_ARROWS, "ARROWS", 0, "Arrows", ""},
{OB_SINGLE_ARROW, "SINGLE_ARROW", 0, "Single Arrow", ""},
- {OB_PLAINAXES, "PLAIN_AXES", 0, "Plain Axes", ""},
{OB_CIRCLE, "CIRCLE", 0, "Circle", ""},
{OB_CUBE, "CUBE", 0, "Cube", ""},
{OB_EMPTY_SPHERE, "SPHERE", 0, "Sphere", ""},
@@ -1630,8 +1741,7 @@ static void rna_def_object(BlenderRNA *brna)
static float default_quat[4] = {1,0,0,0}; /* default quaternion values */
static float default_axisAngle[4] = {0,0,1,0}; /* default axis-angle rotation values */
static float default_scale[3] = {1,1,1}; /* default scale values */
- int matrix_dimsize[]= {4, 4};
- int boundbox_dimsize[]= {8, 3};
+ static int boundbox_dimsize[]= {8, 3};
srna= RNA_def_struct(brna, "Object", "ID");
RNA_def_struct_ui_text(srna, "Object", "Object datablock defining an object in a scene");
@@ -1642,7 +1752,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "ID");
RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_data_set", "rna_Object_data_typef", NULL);
RNA_def_property_editable_func(prop, "rna_Object_data_editable");
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
RNA_def_property_ui_text(prop, "Data", "Object data");
RNA_def_property_update(prop, 0, "rna_Object_internal_update_data");
@@ -1676,7 +1786,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_multi_array(prop, 2, boundbox_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_float_funcs(prop, "rna_Object_boundbox_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coordinates");
+ RNA_def_property_ui_text(prop, "Bound Box", "Objects bound box in object-space coordinates, all values are -1.0 when not available.");
/* parent */
prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
@@ -1730,7 +1840,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "material_slots", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
RNA_def_property_struct_type(prop, "MaterialSlot");
- RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, "rna_iterator_array_get", 0, 0, 0); /* don't dereference pointer! */
+ RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, "rna_iterator_array_get", NULL, NULL, NULL); /* don't dereference pointer! */
RNA_def_property_ui_text(prop, "Material Slots", "Material slots in the object");
prop= RNA_def_property(srna, "active_material", PROP_POINTER, PROP_NONE);
@@ -1738,18 +1848,20 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, "rna_Object_active_material_get", "rna_Object_active_material_set", NULL, NULL);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Material", "Active material being displayed");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_MaterialSlot_update");
prop= RNA_def_property(srna, "active_material_index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "actcol");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_funcs(prop, "rna_Object_active_material_index_get", "rna_Object_active_material_index_set", "rna_Object_active_material_index_range");
RNA_def_property_ui_text(prop, "Active Material Index", "Index of active material slot");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
/* transform */
prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_editable_array_func(prop, "rna_Object_location_editable");
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
RNA_def_property_ui_text(prop, "Location", "Location of the object");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
@@ -1787,6 +1899,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_editable_array_func(prop, "rna_Object_scale_editable");
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
RNA_def_property_float_array_default(prop, default_scale);
RNA_def_property_ui_text(prop, "Scale", "Scaling of the object");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
@@ -1794,6 +1907,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "dimensions", PROP_FLOAT, PROP_XYZ_LENGTH);
RNA_def_property_array(prop, 3);
RNA_def_property_float_funcs(prop, "rna_Object_dimensions_get", "rna_Object_dimensions_set", NULL);
+ RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
RNA_def_property_ui_text(prop, "Dimensions", "Absolute bounding box dimensions of the object");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
@@ -1863,16 +1977,25 @@ static void rna_def_object(BlenderRNA *brna)
/* matrix */
prop= RNA_def_property(srna, "matrix_world", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "obmat");
- RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Matrix World", "Worldspace transformation matrix");
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_world_update");
prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Local Matrix", "Parent relative transformation matrix");
RNA_def_property_float_funcs(prop, "rna_Object_matrix_local_get", "rna_Object_matrix_local_set", NULL);
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, NULL);
+ prop= RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Input Matrix", "Matrix access to location, rotation and scale (including deltas), before constraints and parenting are applied.");
+ RNA_def_property_float_funcs(prop, "rna_Object_matrix_basis_get", "rna_Object_matrix_basis_set", NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
+
/* collections */
prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "Constraint");
@@ -2010,6 +2133,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "dup_group");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_Object_dup_group_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Dupli Group", "Instance an existing group");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_dependency_update");
@@ -2114,7 +2238,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_transparent", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWTRANSP);
- RNA_def_property_ui_text(prop, "Draw Transparent", "Enables transparent materials for the object (Mesh only)");
+ RNA_def_property_ui_text(prop, "Draw Transparent", "Displays material transparency in the object");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
@@ -2132,6 +2256,7 @@ static void rna_def_object(BlenderRNA *brna)
/* pose */
prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "poselib");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "Action");
RNA_def_property_ui_text(prop, "Pose Library", "Action used as a pose library for armatures");
@@ -2141,7 +2266,7 @@ static void rna_def_object(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pose", "Current pose for armatures");
/* shape keys */
- prop= RNA_def_property(srna, "show_shape_key", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "show_only_shape_key", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "shapeflag", OB_SHAPE_LOCK);
RNA_def_property_ui_text(prop, "Shape Key Lock", "Always show the current Shape for this Object");
RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
@@ -2185,12 +2310,14 @@ static void rna_def_dupli_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "matrix_original", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "omat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Object Matrix", "The original matrix of this object before it was duplicated");
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Object Duplicate Matrix", "Object duplicate transformation matrix");
/* TODO: DupliObject has more properties that can be wrapped */
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index d48e714ea23..f2e12c91c49 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -56,6 +56,7 @@
#include "BKE_displist.h"
#include "BKE_font.h"
#include "BKE_mball.h"
+#include "BKE_modifier.h"
#include "BLI_math.h"
@@ -166,6 +167,8 @@ static Mesh *rna_Object_create_mesh(Object *ob, ReportList *reports, Scene *sce,
/* Copy materials to new mesh */
switch (ob->type) {
case OB_SURF:
+ case OB_FONT:
+ case OB_CURVE:
tmpmesh->totcol = tmpcu->totcol;
/* free old material list (if it exists) and adjust user counts */
@@ -232,6 +235,50 @@ static Mesh *rna_Object_create_mesh(Object *ob, ReportList *reports, Scene *sce,
return tmpmesh;
}
+/* mostly a copy from convertblender.c */
+static void dupli_render_particle_set(Scene *scene, Object *ob, int level, int enable)
+{
+ /* ugly function, but we need to set particle systems to their render
+ * settings before calling object_duplilist, to get render level duplis */
+ Group *group;
+ GroupObject *go;
+ ParticleSystem *psys;
+ DerivedMesh *dm;
+ float mat[4][4];
+
+ unit_m4(mat);
+
+ if(level >= MAX_DUPLI_RECUR)
+ return;
+
+ if(ob->transflag & OB_DUPLIPARTS) {
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(ELEM(psys->part->ren_as, PART_DRAW_OB, PART_DRAW_GR)) {
+ if(enable)
+ psys_render_set(ob, psys, mat, mat, 1, 1, 0.f);
+ else
+ psys_render_restore(ob, psys);
+ }
+ }
+
+ if(level == 0 && enable) {
+ /* this is to make sure we get render level duplis in groups:
+ * the derivedmesh must be created before init_render_mesh,
+ * since object_duplilist does dupliparticles before that */
+ dm = mesh_create_derived_render(scene, ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+ dm->release(dm);
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ psys_get_modifier(ob, psys)->flag &= ~eParticleSystemFlag_psys_updated;
+ }
+ }
+
+ if(ob->dup_group==NULL) return;
+ group= ob->dup_group;
+
+ for(go= group->gobject.first; go; go= go->next)
+ dupli_render_particle_set(scene, go->ob, level+1, enable);
+}
/* When no longer needed, duplilist should be freed with Object.free_duplilist */
static void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *sce)
{
@@ -247,13 +294,15 @@ static void rna_Object_create_duplilist(Object *ob, ReportList *reports, Scene *
free_object_duplilist(ob->duplilist);
ob->duplilist= NULL;
}
-
+ if(G.rendering)
+ dupli_render_particle_set(sce, ob, 0, 1);
ob->duplilist= object_duplilist(sce, ob);
-
+ if(G.rendering)
+ dupli_render_particle_set(sce, ob, 0, 0);
/* ob->duplilist should now be freed with Object.free_duplilist */
}
-static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
+static void rna_Object_free_duplilist(Object *ob)
{
if (ob->duplilist) {
free_object_duplilist(ob->duplilist);
@@ -261,49 +310,7 @@ static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
}
}
-/* copied from old API Object.makeDisplayList (Object.c)
- * use _ suffix because this exists for internal rna */
-static void rna_Object_update(Object *ob, Scene *sce, int object, int data, int time)
-{
- int flag= 0;
-
- if (ob->type == OB_FONT) {
- Curve *cu = ob->data;
- freedisplist(&cu->disp);
- BKE_text_to_curve(sce, ob, CU_LEFT);
- }
-
- if(object) flag |= OB_RECALC_OB;
- if(data) flag |= OB_RECALC_DATA;
- if(time) flag |= OB_RECALC_TIME;
-
- DAG_id_flush_update(&ob->id, flag);
-}
-
-static Object *rna_Object_find_armature(Object *ob)
-{
- Object *ob_arm = NULL;
-
- if (ob->type != OB_MESH) return NULL;
-
- if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
- ob_arm = ob->parent;
- }
- else {
- ModifierData *mod = (ModifierData*)ob->modifiers.first;
- while (mod) {
- if (mod->type == eModifierType_Armature) {
- ob_arm = ((ArmatureModifierData*)mod)->object;
- }
-
- mod = mod->next;
- }
- }
-
- return ob_arm;
-}
-
-static PointerRNA rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *reports, char *name, int from_mix)
+static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports, const char *name, int from_mix)
{
Scene *scene= CTX_data_scene(C);
KeyBlock *kb= NULL;
@@ -324,7 +331,7 @@ static PointerRNA rna_Object_add_shape_key(Object *ob, bContext *C, ReportList *
int rna_Object_is_visible(Object *ob, Scene *sce)
{
- return !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->lay & sce->lay;
+ return !(ob->restrictflag & OB_RESTRICT_VIEW) && (ob->lay & sce->lay);
}
/*
@@ -365,7 +372,7 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], float ray_end[3], float r_location[3], float r_normal[3], int *index)
{
- BVHTreeFromMesh treeData;
+ BVHTreeFromMesh treeData= {0};
if(ob->derivedFinal==NULL) {
BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for ray casting.", ob->id.name+2);
@@ -437,27 +444,26 @@ void RNA_api_object(StructRNA *srna)
/* duplis */
func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist");
- RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list.");
+ RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list to restore the objects real matrix and layers.");
parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate duplis.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
RNA_def_function_flag(func, FUNC_USE_REPORTS);
func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist");
RNA_def_function_ui_description(func, "Free the list of dupli objects.");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
/* Armature */
- func= RNA_def_function(srna, "find_armature", "rna_Object_find_armature");
+ func= RNA_def_function(srna, "find_armature", "modifiers_isDeformedByArmature");
RNA_def_function_ui_description(func, "Find armature influencing this object as a parent or via a modifier.");
parm= RNA_def_pointer(func, "ob_arm", "Object", "", "Armature object influencing this object or NULL.");
RNA_def_function_return(func, parm);
/* Shape key */
- func= RNA_def_function(srna, "add_shape_key", "rna_Object_add_shape_key");
+ func= RNA_def_function(srna, "shape_key_add", "rna_Object_shape_key_add");
RNA_def_function_ui_description(func, "Add shape key to an object.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
- parm= RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
- parm= RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
+ RNA_def_string(func, "name", "Key", 0, "", "Unique name for the new keylock."); /* optional */
+ RNA_def_boolean(func, "from_mix", 1, "", "Create new shape from existing mix of shapes.");
parm= RNA_def_pointer(func, "key", "ShapeKey", "", "New shape keyblock.");
RNA_def_property_flag(parm, PROP_RNAPTR);
RNA_def_function_return(func, parm);
@@ -484,16 +490,6 @@ void RNA_api_object(StructRNA *srna)
parm= RNA_def_int(func, "index", 0, 0, 0, "", "The face index, -1 when no intersection is found.", 0, 0);
RNA_def_function_output(func, parm);
-
- /* DAG */
- func= RNA_def_function(srna, "update", "rna_Object_update");
- RNA_def_function_ui_description(func, "Tag the object to update its display data.");
- parm= RNA_def_pointer(func, "scene", "Scene", "", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- RNA_def_boolean(func, "object", 1, "", "Tag the object for updating");
- RNA_def_boolean(func, "data", 1, "", "Tag the objects display data for updating");
- RNA_def_boolean(func, "time", 1, "", "Tag the object time related data for updating");
-
/* View */
func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
RNA_def_function_ui_description(func, "Determine if object is visible in a given scene.");
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index 3a8f66a3773..fe69fefa879 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -110,15 +110,19 @@ static void rna_Cache_change(Main *bmain, Scene *scene, PointerRNA *ptr)
BKE_ptcache_ids_from_object(&pidlist, ob, NULL, 0);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
for(pid=pidlist.first; pid; pid=pid->next) {
if(pid->cache==cache)
break;
}
- if(pid)
+ if(pid) {
+ /* Just make sure this wasn't changed. */
+ if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
+ cache->step = 1;
BKE_ptcache_update_info(pid);
+ }
BLI_freelistN(&pidlist);
}
@@ -140,8 +144,11 @@ static void rna_Cache_toggle_disk_cache(Main *bmain, Scene *scene, PointerRNA *p
break;
}
- if(pid)
+ /* smoke can only use disk cache */
+ if(pid && pid->type != PTCACHE_TYPE_SMOKE_DOMAIN)
BKE_ptcache_toggle_disk_cache(pid);
+ else
+ cache->flag ^= PTCACHE_DISK_CACHE;
BLI_freelistN(&pidlist);
}
@@ -153,7 +160,6 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
PTCacheID *pid = NULL, *pid2= NULL;
ListBase pidlist;
int new_name = 1;
- char name[80];
if(!ob)
return;
@@ -171,11 +177,9 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
if(!pid)
return;
- cache->flag |= (PTCACHE_BAKED|PTCACHE_DISK_CACHE|PTCACHE_SIMULATION_VALID);
- cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_FRAMES_SKIPPED);
-
BKE_ptcache_load_external(pid);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
else {
for(pid=pidlist.first; pid; pid=pid->next) {
@@ -190,19 +194,13 @@ static void rna_Cache_idname_change(Main *bmain, Scene *scene, PointerRNA *ptr)
if(new_name) {
if(pid2 && cache->flag & PTCACHE_DISK_CACHE) {
- /* TODO: change to simple file rename */
- strcpy(name, cache->name);
- strcpy(cache->name, cache->prev_name);
-
- cache->flag &= ~PTCACHE_DISK_CACHE;
+ char old_name[80];
+ char new_name[80];
- BKE_ptcache_toggle_disk_cache(pid2);
+ strcpy(old_name, cache->prev_name);
+ strcpy(new_name, cache->name);
- strcpy(cache->name, name);
-
- cache->flag |= PTCACHE_DISK_CACHE;
-
- BKE_ptcache_toggle_disk_cache(pid2);
+ BKE_ptcache_disk_cache_rename(pid2, old_name, new_name);
}
strcpy(cache->prev_name, cache->name);
@@ -482,7 +480,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
part->pd2->tex= 0;
}
- DAG_id_flush_update(&part->id, OB_RECALC_ALL|PSYS_RECALC_RESET);
+ DAG_id_tag_update(&part->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -494,7 +492,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
ob->pd->tex= 0;
}
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
}
@@ -524,7 +522,7 @@ static void rna_FieldSettings_shape_update(Main *bmain, Scene *scene, PointerRNA
static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
if(particle_id_check(ptr)) {
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_ALL|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME|PSYS_RECALC_RESET);
}
else {
Object *ob= (Object*)ptr->id.data;
@@ -541,9 +539,9 @@ static void rna_FieldSettings_dependency_update(Main *bmain, Scene *scene, Point
DAG_scene_sort(bmain, scene);
if(ob->type == OB_CURVE && ob->pd->forcefield == PFIELD_GUIDE)
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
else
- DAG_id_flush_update(&ob->id, OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
@@ -575,7 +573,7 @@ static char *rna_FieldSettings_path(PointerRNA *ptr)
static void rna_EffectorWeight_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -584,7 +582,7 @@ static void rna_EffectorWeight_dependency_update(Main *bmain, Scene *scene, Poin
{
DAG_scene_sort(bmain, scene);
- DAG_id_flush_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
+ DAG_id_tag_update((ID*)ptr->id.data, OB_RECALC_DATA|PSYS_RECALC_RESET);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
}
@@ -651,7 +649,7 @@ static void rna_CollisionSettings_update(Main *bmain, Scene *scene, PointerRNA *
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_ALL);
+ DAG_id_tag_update(&ob->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME);
WM_main_add_notifier(NC_OBJECT|ND_DRAW, ob);
}
@@ -659,7 +657,7 @@ static void rna_softbody_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_MODIFIER, ob);
}
@@ -720,6 +718,12 @@ static void rna_def_pointcache(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem point_cache_compress_items[] = {
+ {PTCACHE_COMPRESS_NO, "NO", 0, "No", "No compression"},
+ {PTCACHE_COMPRESS_LZO, "LIGHT", 0, "Light", "Fast but not so effective compression"},
+ {PTCACHE_COMPRESS_LZMA, "HEAVY", 0, "Heavy", "Effective but slow compression"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "PointCache", NULL);
RNA_def_struct_ui_text(srna, "Point Cache", "Point cache for physics simulations");
RNA_def_struct_ui_icon(srna, ICON_PHYSICS);
@@ -747,6 +751,11 @@ static void rna_def_pointcache(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Cache Index", "Index number of cache files");
RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change");
+ prop= RNA_def_property(srna, "compression", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, point_cache_compress_items);
+ RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
+ RNA_def_property_update(prop, 0, NULL);
+
/* flags */
prop= RNA_def_property(srna, "is_baked", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKED);
@@ -1160,7 +1169,7 @@ static void rna_def_field(BlenderRNA *brna)
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_size");
RNA_def_property_range(prop, 0.0f, 10.0f);
- RNA_def_property_ui_text(prop, "Size", "Size of the noise");
+ RNA_def_property_ui_text(prop, "Size", "Size of the turbulence");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
@@ -1214,7 +1223,7 @@ static void rna_def_field(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "f_noise");
RNA_def_property_range(prop, 0.0f, 10.0f);
- RNA_def_property_ui_text(prop, "Noise", "Noise of the force");
+ RNA_def_property_ui_text(prop, "Noise", "Amount of noise for the force strength");
RNA_def_property_update(prop, 0, "rna_FieldSettings_update");
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED);
@@ -1439,7 +1448,7 @@ static void rna_def_softbody(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {3, 3};
+ const int matrix_dimsize[]= {3, 3};
static EnumPropertyItem collision_type_items[] = {
@@ -1552,20 +1561,20 @@ static void rna_def_softbody(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Damp", "Edge spring friction");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "spring_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "springpreload");
+ prop= RNA_def_property(srna, "spring_length", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "springpreload");
RNA_def_property_range(prop, 0.0f, 200.0f);
RNA_def_property_ui_text(prop, "SL", "Alter spring length to shrink/blow up (unit %) 0 to disable");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "aero", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "aeroedge");
+ prop= RNA_def_property(srna, "aero", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "aeroedge");
RNA_def_property_range(prop, 0.0f, 30000.0f);
RNA_def_property_ui_text(prop, "Aero", "Make edges 'sail'");
RNA_def_property_update(prop, 0, "rna_softbody_update");
- prop= RNA_def_property(srna, "plastic", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "plastic");
+ prop= RNA_def_property(srna, "plastic", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "plastic");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Plastic", "Permanent deform");
RNA_def_property_update(prop, 0, "rna_softbody_update");
diff --git a/source/blender/makesrna/intern/rna_packedfile.c b/source/blender/makesrna/intern/rna_packedfile.c
index 41c4d9b2769..2effc616e53 100644
--- a/source/blender/makesrna/intern/rna_packedfile.c
+++ b/source/blender/makesrna/intern/rna_packedfile.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 1151215f5f7..2a4e018b741 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,7 @@
#include "rna_internal.h"
+#include "DNA_material_types.h"
#include "DNA_modifier_types.h"
#include "DNA_cloth_types.h"
#include "DNA_particle_types.h"
@@ -38,6 +39,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_boid_types.h"
+#include "DNA_texture_types.h"
#include "WM_types.h"
#include "WM_api.h"
@@ -95,6 +97,9 @@ EnumPropertyItem part_hair_ren_as_items[] = {
#ifdef RNA_RUNTIME
+#include "BLI_math.h"
+#include "BLI_listbase.h"
+
#include "BKE_context.h"
#include "BKE_cloth.h"
#include "BKE_deform.h"
@@ -103,9 +108,7 @@ EnumPropertyItem part_hair_ren_as_items[] = {
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-
-#include "BLI_math.h"
-#include "BLI_listbase.h"
+#include "BKE_texture.h"
/* use for object space hair get/set */
static void rna_ParticleHairKey_location_object_info(PointerRNA *ptr, ParticleSystemModifierData **psmd_pt, ParticleData **pa_pt)
@@ -201,10 +204,10 @@ static void particle_recalc(Main *bmain, Scene *scene, PointerRNA *ptr, short fl
psys->recalc = flag;
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
else
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA|flag);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA|flag);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
@@ -279,7 +282,7 @@ static void rna_Particle_target_reset(Main *bmain, Scene *scene, PointerRNA *ptr
psys->recalc = PSYS_RECALC_RESET;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
DAG_scene_sort(bmain, scene);
}
@@ -295,13 +298,14 @@ static void rna_Particle_target_redo(Main *bmain, Scene *scene, PointerRNA *ptr)
psys->recalc = PSYS_RECALC_REDO;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
}
static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *ptr)
{
+ Object *ob = (Object*)ptr->id.data;
ParticleSystem *psys = (ParticleSystem*)ptr->data;
if(psys && !psys->clmd) {
@@ -313,6 +317,8 @@ static void rna_Particle_hair_dynamics(Main *bmain, Scene *scene, PointerRNA *pt
}
else
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
+
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static PointerRNA rna_particle_settings_get(PointerRNA *ptr)
{
@@ -325,15 +331,21 @@ static PointerRNA rna_particle_settings_get(PointerRNA *ptr)
static void rna_particle_settings_set(PointerRNA *ptr, PointerRNA value)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ int old_type = 0;
- if(psys->part)
+
+ if(psys->part) {
+ old_type = psys->part->type;
psys->part->id.us--;
+ }
psys->part = (ParticleSettings *)value.data;
if(psys->part) {
psys->part->id.us++;
psys_check_boid_data(psys);
+ if(old_type != psys->part->type)
+ psys->recalc |= PSYS_RECALC_TYPE;
}
}
static void rna_Particle_abspathtime_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -378,6 +390,18 @@ static void rna_PartSettings_end_set(struct PointerRNA *ptr, float value)
settings->end = value;
}
+static void rna_PartSetting_hairlength_set(struct PointerRNA *ptr, float value)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ settings->normfac = value / 4.f;
+}
+
+static float rna_PartSetting_hairlength_get(struct PointerRNA *ptr)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+ return settings->normfac * 4.f;
+}
+
static void rna_PartSetting_linelentail_set(struct PointerRNA *ptr, float value)
{
ParticleSettings *settings = (ParticleSettings*)ptr->data;
@@ -414,6 +438,14 @@ static float rna_PartSetting_linelenhead_get(struct PointerRNA *ptr)
return settings->draw_line[1];
}
+
+static int rna_PartSettings_is_fluid_get(PointerRNA *ptr)
+{
+ ParticleSettings *part= (ParticleSettings*)ptr->data;
+
+ return part->type == PART_FLUID;
+}
+
static PointerRNA rna_ParticleSystem_active_particle_target_get(PointerRNA *ptr)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
@@ -512,6 +544,27 @@ static void rna_ParticleTarget_name_get(PointerRNA *ptr, char *str)
else
strcpy(str, "Invalid target!");
}
+
+static int particle_id_check(PointerRNA *ptr)
+{
+ ID *id= ptr->id.data;
+
+ return (GS(id->name) == ID_PA);
+}
+
+static char *rna_SPHFluidSettings_path(PointerRNA *ptr)
+{
+ SPHFluidSettings *fluid = (SPHFluidSettings *)ptr->data;
+
+ if(particle_id_check(ptr)) {
+ ParticleSettings *part = (ParticleSettings*)ptr->id.data;
+
+ if (part->fluid == fluid)
+ return BLI_sprintfN("fluid");
+ }
+ return NULL;
+}
+
static int rna_ParticleSystem_multiple_caches_get(PointerRNA *ptr)
{
ParticleSystem *psys= (ParticleSystem*)ptr->data;
@@ -697,6 +750,34 @@ static void psys_vg_name_set__internal(PointerRNA *ptr, const char *value, int i
}
}
+static char *rna_ParticleSystem_path(PointerRNA *ptr)
+{
+ ParticleSystem *psys= (ParticleSystem*)ptr->data;
+ return BLI_sprintfN("particle_systems[\"%s\"]", psys->name);
+}
+
+static void rna_ParticleSettings_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ ParticleSettings *part= (ParticleSettings*)ptr->data;
+ rna_iterator_array_begin(iter, (void*)part->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
+}
+
+static PointerRNA rna_ParticleSettings_active_texture_get(PointerRNA *ptr)
+{
+ ParticleSettings *part= (ParticleSettings*)ptr->data;
+ Tex *tex;
+
+ tex= give_current_particle_texture(part);
+ return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
+}
+
+static void rna_ParticleSettings_active_texture_set(PointerRNA *ptr, PointerRNA value)
+{
+ ParticleSettings *part= (ParticleSettings*)ptr->data;
+
+ set_current_particle_texture(part, value.data);
+}
+
/* irritating string functions for each index :/ */
static void rna_ParticleVGroup_name_get_0(PointerRNA *ptr, char *value) { psys_vg_name_get__internal(ptr, value, 0); }
static void rna_ParticleVGroup_name_get_1(PointerRNA *ptr, char *value) { psys_vg_name_get__internal(ptr, value, 1); }
@@ -863,7 +944,7 @@ static void rna_def_particle(BlenderRNA *brna)
/* Hair & Keyed Keys */
- prop= RNA_def_property(srna, "is_hair", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "hair", "totkey");
RNA_def_property_struct_type(prop, "ParticleHairKey");
RNA_def_property_ui_text(prop, "Hair", "");
@@ -936,7 +1017,7 @@ static void rna_def_particle_dupliweight(BlenderRNA *brna)
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "count", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, SHRT_MAX);
RNA_def_property_ui_text(prop, "Count", "The number of times this object is repeated with respect to other objects");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
}
@@ -947,68 +1028,322 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
PropertyRNA *prop;
srna = RNA_def_struct(brna, "SPHFluidSettings", NULL);
+ RNA_def_struct_path_func(srna, "rna_SPHFluidSettings_path");
RNA_def_struct_ui_text(srna, "SPH Fluid Settings", "Settings for particle fluids physics");
/* Fluid settings */
prop= RNA_def_property(srna, "spring_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "spring_k");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Spring", "Spring force constant");
- RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Spring Force", "Spring force");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "fluid_radius", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "radius");
- RNA_def_property_range(prop, 0.0f, 2.0f);
- RNA_def_property_ui_text(prop, "Radius", "Fluid interaction Radius");
+ RNA_def_property_range(prop, 0.0f, 20.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Interaction Radius", "Fluid interaction radius");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ /* Hidden in ui to give a little easier user experience. */
prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "rest_length");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Rest Length", "The Spring Rest Length (factor of interaction radius)");
- RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ RNA_def_property_ui_text(prop, "Rest Length", "Spring rest length (factor of interaction radius)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_viscoelastic_springs", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_VISCOELASTIC_SPRINGS);
+ RNA_def_property_ui_text(prop, "Viscoelastic Springs", "Use viscoelastic springs instead of Hooke's springs");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_initial_rest_length", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_CURRENT_REST_LENGTH);
+ RNA_def_property_ui_text(prop, "Initial Rest Length", "Use the initial length as spring rest length instead of interaction radius/2");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "plasticity", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "plasticity_constant");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Plasticity", "How much the spring rest length can change after the elastic limit is crossed");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "yield_ratio", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "yield_ratio");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Elastic Limit", "How much the spring has to be stretched/compressed in order to change it's rest length");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Viscosity */
- prop= RNA_def_property(srna, "viscosity_omega", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "linear_viscosity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosity_omega");
RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "viscosity_beta", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "square_viscosity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosity_beta");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity factor");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Double density relaxation */
- prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "density_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_k");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Stiffness ", "Constant K - Stiffness");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Density Force", "How strongly the fluid tends to rest density");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "stiffness_near", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "repulsion_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_knear");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Repulsion", "Repulsion factor: stiffness_knear");
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Repulsion", "How strongly the fluid tries to keep from clustering");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rest_density");
- RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_text(prop, "Rest Density", "Density");
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Rest Density", "Rest density of the fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Buoyancy */
prop= RNA_def_property(srna, "buoyancy", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "buoyancy");
RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Buoyancy", "");
+ RNA_def_property_ui_text(prop, "Buoyancy", "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
}
+static void rna_def_particle_settings_mtex(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ static EnumPropertyItem texco_items[] = {
+ {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates"},
+ {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
+ {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates"},
+ {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object"},
+ {TEXCO_STRAND, "STRAND", 0, "Strand / Particle", "Uses normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_mapping_items[] = {
+ {MTEX_FLAT, "FLAT", 0, "Flat", "Maps X and Y coordinates directly"},
+ {MTEX_CUBE, "CUBE", 0, "Cube", "Maps using the normal vector"},
+ {MTEX_TUBE, "TUBE", 0, "Tube", "Maps with Z as central axis"},
+ {MTEX_SPHERE, "SPHERE", 0, "Sphere", "Maps with Z as central axis"},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_x_mapping_items[] = {
+ {0, "NONE", 0, "None", ""},
+ {1, "X", 0, "X", ""},
+ {2, "Y", 0, "Y", ""},
+ {3, "Z", 0, "Z", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_y_mapping_items[] = {
+ {0, "NONE", 0, "None", ""},
+ {1, "X", 0, "X", ""},
+ {2, "Y", 0, "Y", ""},
+ {3, "Z", 0, "Z", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem prop_z_mapping_items[] = {
+ {0, "NONE", 0, "None", ""},
+ {1, "X", 0, "X", ""},
+ {2, "Y", 0, "Y", ""},
+ {3, "Z", 0, "Z", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+ srna= RNA_def_struct(brna, "ParticleSettingsTextureSlot", "TextureSlot");
+ RNA_def_struct_sdna(srna, "MTex");
+ RNA_def_struct_ui_text(srna, "Particle Settings Texture Slot", "Texture slot for textures in a Particle Settings datablock");
+
+ prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "texco");
+ RNA_def_property_enum_items(prop, texco_items);
+ RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "object");
+ RNA_def_property_struct_type(prop, "Object");
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "uvname");
+ RNA_def_property_ui_text(prop, "UV Layer", "UV layer to use for mapping with UV texture coordinates");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "mapping_x", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "projx");
+ RNA_def_property_enum_items(prop, prop_x_mapping_items);
+ RNA_def_property_ui_text(prop, "X Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "mapping_y", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "projy");
+ RNA_def_property_enum_items(prop, prop_y_mapping_items);
+ RNA_def_property_ui_text(prop, "Y Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "mapping_z", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "projz");
+ RNA_def_property_enum_items(prop, prop_z_mapping_items);
+ RNA_def_property_ui_text(prop, "Z Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, prop_mapping_items);
+ RNA_def_property_ui_text(prop, "Mapping", "");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ /* map to */
+ prop= RNA_def_property(srna, "use_map_time", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_TIME);
+ RNA_def_property_ui_text(prop, "Emission Time", "Affect the emission time of the particles");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_life", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_LIFE);
+ RNA_def_property_ui_text(prop, "Life Time", "Affect the life time of the particles");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_density", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_DENS);
+ RNA_def_property_ui_text(prop, "Density", "Affect the density of the particles");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_size", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_SIZE);
+ RNA_def_property_ui_text(prop, "Size", "Affect the particle size");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_velocity", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_IVEL);
+ RNA_def_property_ui_text(prop, "Initial Velocity", "Affect the particle initial velocity");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_field", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_FIELD);
+ RNA_def_property_ui_text(prop, "Force Field", "Affect the particle force fields");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_gravity", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_GRAVITY);
+ RNA_def_property_ui_text(prop, "Gravity", "Affect the particle gravity");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_damp", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_DAMP);
+ RNA_def_property_ui_text(prop, "Damp", "Affect the particle velocity damping");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "use_map_clump", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_CLUMP);
+ RNA_def_property_ui_text(prop, "Clump", "Affect the child clumping");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "use_map_kink", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_KINK);
+ RNA_def_property_ui_text(prop, "Kink", "Affect the child kink");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "use_map_rough", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_ROUGH);
+ RNA_def_property_ui_text(prop, "Rough", "Affect the child rough");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "use_map_length", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "mapto", PAMAP_LENGTH);
+ RNA_def_property_ui_text(prop, "Length", "Affect the child hair length");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+
+ /* influence factors */
+ prop= RNA_def_property(srna, "time_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "timefac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Emission Time Factor", "Amount texture affects particle emission time");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "life_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "lifefac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Life Time Factor", "Amount texture affects particle life time");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "density_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "padensfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Density Factor", "Amount texture affects particle density");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "size_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sizefac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Size Factor", "Amount texture affects physical particle size");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "velocity_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "ivelfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Velocity Factor", "Amount texture affects particle initial velocity");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+
+ prop= RNA_def_property(srna, "field_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fieldfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Field Factor", "Amount texture affects particle force fields");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "gravity_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "gravityfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Gravity Factor", "Amount texture affects particle gravity");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "damp_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "dampfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Damp Factor", "Amount texture affects particle damping");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+
+ prop= RNA_def_property(srna, "length_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "lengthfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Length Factor", "Amount texture affects child hair length");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "clump_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "clumpfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Clump Factor", "Amount texture affects child clump");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "kink_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "kinkfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Kink Factor", "Amount texture affects child kink");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "rough_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "roughfac");
+ RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+ RNA_def_property_ui_text(prop, "Rough Factor", "Amount texture affects child roughness");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+}
+
static void rna_def_particle_settings(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1066,8 +1401,8 @@ static void rna_def_particle_settings(BlenderRNA *brna)
static EnumPropertyItem child_type_items[] = {
{0, "NONE", 0, "None", ""},
- {PART_CHILD_PARTICLES, "PARTICLES", 0, "Particles", ""},
- {PART_CHILD_FACES, "FACES", 0, "Faces", ""},
+ {PART_CHILD_PARTICLES, "SIMPLE", 0, "Simple", ""},
+ {PART_CHILD_FACES, "INTERPOLATED", 0, "Interpolated", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1115,10 +1450,9 @@ static void rna_def_particle_settings(BlenderRNA *brna)
static EnumPropertyItem bb_anim_items[] = {
{PART_BB_ANIM_NONE, "NONE", 0, "None", ""},
- {PART_BB_ANIM_TIME, "TIME", 0, "Time", ""},
+ {PART_BB_ANIM_AGE, "AGE", 0, "Age", ""},
+ {PART_BB_ANIM_FRAME, "FRAME", 0, "Frame", ""},
{PART_BB_ANIM_ANGLE, "ANGLE", 0, "Angle", ""},
- //{PART_BB_ANIM_OFF_TIME, "OFF_TIME", 0, "off_time", ""},
- //{PART_BB_ANIM_OFF_ANGLE, "OFF_ANGLE", 0, "off_angle", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -1133,6 +1467,15 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Particle Settings", "Particle settings, reusable by multiple particle systems");
RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA);
+ rna_def_mtex_common(brna, srna, "rna_ParticleSettings_mtex_begin", "rna_ParticleSettings_active_texture_get",
+ "rna_ParticleSettings_active_texture_set", "ParticleSettingsTextureSlot", "ParticleSettingsTextureSlots", "rna_Particle_reset");
+
+ /* fluid particle type can't be checked from the type value in rna as it's not shown in the menu */
+ prop= RNA_def_property(srna, "is_fluid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_PartSettings_is_fluid_get", NULL);
+ RNA_def_property_ui_text(prop, "Fluid", "Particles were created by a fluid simulation");
+
/* flag */
prop= RNA_def_property(srna, "use_react_start_end", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_REACT_STA_END);
@@ -1146,6 +1489,11 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Multi React", "React multiple times");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "regrow_hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_REGROW);
+ RNA_def_property_ui_text(prop, "Regrow", "Regrow hair for each frame");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
prop= RNA_def_property(srna, "show_unborn", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_UNBORN);
RNA_def_property_ui_text(prop, "Unborn", "Show particles before they are emitted");
@@ -1192,26 +1540,17 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Mass from Size", "Multiply mass by particle size");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "use_advanced_hair", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", PART_HIDE_ADVANCED_HAIR);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Advanced", "Use full physics calculations for growing hair");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
prop= RNA_def_property(srna, "lock_boids_to_surface", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BOIDS_2D);
RNA_def_property_ui_text(prop, "Boids 2D", "Constrain boids to a surface");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "use_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_BRANCHING);
- RNA_def_property_ui_text(prop, "Branching", "Branch child paths from each other");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
- prop= RNA_def_property(srna, "use_animate_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_ANIM_BRANCHING);
- RNA_def_property_ui_text(prop, "Animated", "Animate branching");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
- prop= RNA_def_property(srna, "use_symmetric_branching", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_SYMM_BRANCHING);
- RNA_def_property_ui_text(prop, "Symmetric", "Start and end points are the same");
- RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
-
prop= RNA_def_property(srna, "use_hair_bspline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_HAIR_BSPLINE);
RNA_def_property_ui_text(prop, "B-Spline", "Interpolate hair using B-Splines");
@@ -1219,18 +1558,23 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "invert_grid", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_GRID_INVERT);
- RNA_def_property_ui_text(prop, "Invert", "Invert what is considered object and what is not");
+ RNA_def_property_ui_text(prop, "Invert Grid", "Invert what is considered object and what is not");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "hexagonal_grid", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_GRID_HEXAGONAL);
+ RNA_def_property_ui_text(prop, "Hexagonal Grid", "Create the grid in a hexagonal pattern");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "apply_effector_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_EFFECT);
- RNA_def_property_ui_text(prop, "Children", "Apply effectors to children");
+ RNA_def_property_ui_text(prop, "Effect Children", "Apply effectors to children");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- //prop= RNA_def_property(srna, "child_seams", PROP_BOOLEAN, PROP_NONE);
- //RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_SEAMS);
- //RNA_def_property_ui_text(prop, "Use seams", "Use seams to determine parents");
- //RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "create_long_hair_children", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_LONG_HAIR);
+ RNA_def_property_ui_text(prop, "Long Hair", "Calculate children that suit long hair well");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
prop= RNA_def_property(srna, "apply_guide_to_children", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PART_CHILD_GUIDE);
@@ -1390,7 +1734,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "draw_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 1000);
- RNA_def_property_ui_range(prop, 1, 100, 1, 0);
+ RNA_def_property_ui_range(prop, 0, 100, 1, 0);
RNA_def_property_ui_text(prop, "Draw Size", "Size of particles on viewport in pixels (0=default)");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1420,7 +1764,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
//TODO: not found in UI, readonly?
prop= RNA_def_property(srna, "keys_step", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 0, INT_MAX);//TODO:min,max
+ RNA_def_property_range(prop, 0, SHRT_MAX);//TODO:min,max
RNA_def_property_ui_text(prop, "Keys Step", "");
/* adaptive path rendering */
@@ -1614,11 +1958,24 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "grid_resolution", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "grid_res");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_range(prop, 1, 46); /* ~100k particles in a cube */
- RNA_def_property_ui_range(prop, 1, 215, 1, 0); /* ~10M particles in a cube */
+ RNA_def_property_range(prop, 1, 250); /* ~15M particles in a cube (ouch!), but could be very usable in a plane */
+ RNA_def_property_ui_range(prop, 1, 50, 1, 0); /* ~100k particles in a cube */
RNA_def_property_ui_text(prop, "Resolution", "The resolution of the particle grid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "grid_random", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "grid_rand");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Grid Randomness", "Add random offset to the grid locations");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "effector_amount", PROP_INT, PROP_UNSIGNED);
+ /* in theory PROP_ANIMATABLE perhaps should be cleared, but animating this can give some interesting results! */
+ RNA_def_property_range(prop, 0, 10000); /* 10000 effectors will bel SLOW, but who knows */
+ RNA_def_property_ui_range(prop, 0, 100, 1, 0);
+ RNA_def_property_ui_text(prop, "Effector Amount", "How many particles are effectors (0 is all particles)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
/* initial velocity factors */
prop= RNA_def_property(srna, "normal_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "normfac");//optional if prop names are the same
@@ -1700,6 +2057,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Random Phase", "Randomize rotation phase");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "hair_length", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_funcs(prop, "rna_PartSetting_hairlength_get", "rna_PartSetting_hairlength_set", NULL);
+ RNA_def_property_range(prop, 0.0f, 1000.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Hair Length", "Length of the hair");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
/* physical properties */
prop= RNA_def_property(srna, "mass", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.001f, 100000.0f);
@@ -1720,12 +2084,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Random Size", "Give the particle size a random variation");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "reaction_shape", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "reactshape");
- RNA_def_property_range(prop, 0.0f, 10.0f);
- RNA_def_property_ui_text(prop, "Shape", "Power of reaction strength dependence on distance to target");
- RNA_def_property_update(prop, 0, "rna_Particle_reset");
-
/* global physical properties */
prop= RNA_def_property(srna, "drag_factor", PROP_FLOAT, PROP_NONE);
@@ -1821,6 +2179,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Amplitude", "The amplitude of the offset");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "kink_amplitude_clump", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "kink_amp_clump");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Amplitude Clump", "How much clump effects kink amplitude");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
prop= RNA_def_property(srna, "kink_frequency", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "kink_freq");
RNA_def_property_range(prop, -100000.0f, 100000.0f);
@@ -1833,6 +2197,10 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Shape", "Adjust the offset to the beginning/end");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ prop= RNA_def_property(srna, "kink_flat", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Flatness", "How flat the hairs are");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
/* rough */
prop= RNA_def_property(srna, "roughness_1", PROP_FLOAT, PROP_NONE);
@@ -1894,6 +2262,25 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Threshold", "Amount of particles left untouched by child path length");
RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+ /* parting */
+ prop= RNA_def_property(srna, "child_parting_factor", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_fac");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Parting Factor", "Create parting in the children based on parent strands");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_parting_min", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_min");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "Parting Minimum", "Minimum root to tip angle (tip distance/root distance for long hair)");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
+ prop= RNA_def_property(srna, "child_parting_max", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "parting_max");
+ RNA_def_property_range(prop, 0.0f, 180.0f);
+ RNA_def_property_ui_text(prop, "Parting Maximum", "Maximum root to tip angle (tip distance/root distance for long hair)");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
/* branching */
prop= RNA_def_property(srna, "branch_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "branch_thres");
@@ -1942,18 +2329,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 1.0f, 100.0f, 0.1, 3);
RNA_def_property_ui_text(prop, "Loop count", "Number of times the keys are looped");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
-
- /* boids */
- prop= RNA_def_property(srna, "boids", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "BoidSettings");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Boid Settings", "");
-
- /* Fluid particles */
- prop= RNA_def_property(srna, "fluid", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "SPHFluidSettings");
- RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "SPH Fluid Settings", "");
/* draw objects & groups */
prop= RNA_def_property(srna, "dupli_group", PROP_POINTER, PROP_NONE);
@@ -1991,6 +2366,19 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Billboard Object", "Billboards face this object (default is active camera)");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
+ /* boids */
+ prop= RNA_def_property(srna, "boids", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "BoidSettings");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Boid Settings", "");
+
+ /* Fluid particles */
+ prop= RNA_def_property(srna, "fluid", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "SPHFluidSettings");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "SPH Fluid Settings", "");
+
+ /* Effector weights */
prop= RNA_def_property(srna, "effector_weights", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "EffectorWeights");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -2109,6 +2497,10 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Seed", "Offset in the random number table, to get a different randomized result");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+ prop= RNA_def_property(srna, "child_seed", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_ui_text(prop, "Child Seed", "Offset in the random number table for child particles, to get a different randomized result");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo_child");
+
/* hair */
prop= RNA_def_property(srna, "is_global_hair", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", PSYS_GLOBAL_HAIR);
@@ -2136,7 +2528,7 @@ static void rna_def_particle_system(BlenderRNA *brna)
prop= RNA_def_property(srna, "reactor_target_particle_system", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "target_psys");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Reactor Target Particle System", "For reactor systems, index of particle system on the target object");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -2336,20 +2728,23 @@ static void rna_def_particle_system(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_ParticleSystem_edited_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edited", "Particle system has been edited in particle mode");
+
+
+ RNA_def_struct_path_func(srna, "rna_ParticleSystem_path");
}
void RNA_def_particle(BlenderRNA *brna)
{
rna_def_particle_target(brna);
-
+ rna_def_fluid_settings(brna);
rna_def_particle_hair_key(brna);
rna_def_particle_key(brna);
- rna_def_fluid_settings(brna);
rna_def_child_particle(brna);
rna_def_particle(brna);
rna_def_particle_dupliweight(brna);
rna_def_particle_system(brna);
+ rna_def_particle_settings_mtex(brna);
rna_def_particle_settings(brna);
}
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index edd661760a0..e6aa753147a 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -70,7 +70,7 @@ static void rna_Pose_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
// XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
static void rna_Pose_IK_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -78,7 +78,7 @@ static void rna_Pose_IK_update(Main *bmain, Scene *scene, PointerRNA *ptr)
// XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
Object *ob= ptr->id.data;
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
BIK_clear_data(ob->pose);
}
@@ -91,13 +91,13 @@ static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value)
{
bActionGroup *grp= ptr->data;
- /* if valid value, set the new enum value, then copy the relevant colours? */
+ /* if valid value, set the new enum value, then copy the relevant colors? */
if ((value >= -1) && (value < 21))
grp->customCol= value;
else
return;
- /* only do color copying if using a custom color (i.e. not default colour) */
+ /* only do color copying if using a custom color (i.e. not default color) */
if (grp->customCol) {
if (grp->customCol > 0) {
/* copy theme colors on-to group's custom color in case user tries to edit color */
@@ -162,7 +162,7 @@ static void rna_Pose_ik_solver_update(Main *bmain, Scene *scene, PointerRNA *ptr
object_test_constraints(ob);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
}
/* rotation - axis-angle */
@@ -271,7 +271,7 @@ static void rna_Itasc_update(Main *bmain, Scene *scene, PointerRNA *ptr)
itasc->maxvel = 100.f;
BIK_update_param(ob->pose);
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -283,6 +283,21 @@ static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
rna_Itasc_update(bmain, scene, ptr);
}
+static void rna_PoseChannel_bone_custom_set(PointerRNA *ptr, PointerRNA value)
+{
+ bPoseChannel *pchan = (bPoseChannel*)ptr->data;
+
+
+ if (pchan->custom) {
+ id_us_min(&pchan->custom->id);
+ pchan->custom = NULL;
+ }
+
+ pchan->custom = value.data;
+
+ id_us_plus(&pchan->custom->id);
+}
+
static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
{
Object *ob= (Object*)ptr->id.data;
@@ -532,25 +547,29 @@ static int rna_PoseChannel_rotation_4d_editable(PointerRNA *ptr, int index)
}
/* not essential, but much faster then the default lookup function */
-PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key)
+int rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
- PointerRNA rptr;
bPose *pose= (bPose*)ptr->data;
bPoseChannel *pchan= get_pose_channel(pose, key);
- RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr);
- return rptr;
+ if(pchan) {
+ RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, r_ptr);
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
}
-static void rna_PoseChannel_matrix_local_get(PointerRNA *ptr, float *values)
+static void rna_PoseChannel_matrix_basis_get(PointerRNA *ptr, float *values)
{
bPoseChannel *pchan= (bPoseChannel*)ptr->data;
pchan_to_mat4(pchan, (float (*)[4])values);
}
-static void rna_PoseChannel_matrix_local_set(PointerRNA *ptr, const float *values)
+static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *values)
{
bPoseChannel *pchan= (bPoseChannel*)ptr->data;
- pchan_apply_mat4(pchan, (float (*)[4])values);
+ pchan_apply_mat4(pchan, (float (*)[4])values, FALSE); /* no compat for predictable result */
}
#else
@@ -683,6 +702,8 @@ static void rna_def_pose_channel(BlenderRNA *brna)
static float default_axisAngle[4] = {0,0,1,0}; /* default axis-angle rotation values */
static float default_scale[3] = {1,1,1}; /* default scale values */
+ const int matrix_dimsize[]= {4, 4};
+
StructRNA *srna;
PropertyRNA *prop;
@@ -706,10 +727,6 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
- RNA_def_property_ui_text(prop, "Select", "");
-
/* Baked Bone Path cache data */
rna_def_motionpath_common(srna);
@@ -784,18 +801,22 @@ static void rna_def_pose_channel(BlenderRNA *brna)
/* transform matrices - should be read-only since these are set directly by AnimSys evaluation */
prop= RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "chan_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints");
- prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
- RNA_def_property_array(prop, 16);
- RNA_def_property_ui_text(prop, "Local Matrix", "Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties.");
- RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_local_get", "rna_PoseChannel_matrix_local_set", NULL);
+ /* writable because it touches loc/scale/rot directly */
+ prop= RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+ RNA_def_property_ui_text(prop, "Basis Matrix", "Provides an alternative access to loc/scale/rotation relative to the parent and own rest bone.");
+ RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_basis_get", "rna_PoseChannel_matrix_basis_set", NULL);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+ /* final matrix */
prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "pose_mat");
- RNA_def_property_array(prop, 16);
+ RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel");
@@ -954,6 +975,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "custom");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_bone_custom_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
@@ -970,6 +992,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "agrp_index");
RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set", "rna_PoseChannel_bone_group_index_range");
RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group)");
RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
@@ -1190,7 +1213,7 @@ static void rna_def_pose(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "BoneGroup");
RNA_def_property_ui_text(prop, "Bone Groups", "Groups of the bones");
rna_def_bone_groups(brna, prop);
-
+
/* ik solvers */
prop= RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "iksolver");
diff --git a/source/blender/makesrna/intern/rna_pose_api.c b/source/blender/makesrna/intern/rna_pose_api.c
index d5280f6beda..b1daf8adcde 100644
--- a/source/blender/makesrna/intern/rna_pose_api.c
+++ b/source/blender/makesrna/intern/rna_pose_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_pose_api.c 23425 2009-09-22 19:09:04Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,8 +41,16 @@
/* #include "DNA_anim_types.h" */
#include "DNA_action_types.h" /* bPose */
+#include "BKE_armature.h"
+static float rna_PoseBone_do_envelope(bPoseChannel *chan, float *vec)
+{
+ Bone *bone = chan->bone;
+
+ float scale = (bone->flag & BONE_MULT_VG_ENV) == BONE_MULT_VG_ENV ? bone->weight : 1.0f;
+ return distfactor_to_bone(vec, chan->pose_head, chan->pose_tail, bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
+}
#else
void RNA_api_pose(StructRNA *srna)
@@ -53,8 +61,16 @@ void RNA_api_pose(StructRNA *srna)
void RNA_api_pose_channel(StructRNA *srna)
{
-// FunctionRNA *func;
-// PropertyRNA *parm;
+ PropertyRNA *parm;
+ FunctionRNA *func;
+
+ func= RNA_def_function(srna, "evaluate_envelope", "rna_PoseBone_do_envelope");
+ RNA_def_function_ui_description(func, "Calculate bone envelope at given point.");
+ parm= RNA_def_float_vector_xyz(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "Point", "Position in 3d space to evaluate", -FLT_MAX, FLT_MAX);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ /* return value */
+ parm= RNA_def_float(func, "factor", 0, -FLT_MAX, FLT_MAX, "Factor", "Envelope factor", -FLT_MAX, FLT_MAX);
+ RNA_def_function_return(func, parm);
}
diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c
index 13f913b978b..4ea54994561 100644
--- a/source/blender/makesrna/intern/rna_property.c
+++ b/source/blender/makesrna/intern/rna_property.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -154,7 +154,7 @@ void RNA_def_gameproperty(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bProperty");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "data");
+ // RNA_def_property_float_sdna(prop, NULL, "data");
RNA_def_property_ui_text(prop, "Value", "Property value");
RNA_def_property_range(prop, -10000, 10000);
RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL);
@@ -166,7 +166,7 @@ void RNA_def_gameproperty(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "bProperty");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "data");
+ // RNA_def_property_float_sdna(prop, NULL, "data");
RNA_def_property_ui_text(prop, "Value", "Property value");
RNA_def_property_range(prop, -10000, 10000);
RNA_def_property_float_funcs(prop, "rna_GameFloatProperty_value_get", "rna_GameFloatProperty_value_set", NULL);
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index e6b86ae8766..1d8c335e88f 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,9 +30,10 @@
#include "rna_internal.h"
-
#include "RE_pipeline.h"
+#include "BKE_utildefines.h"
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
@@ -42,27 +43,26 @@
#include "BKE_context.h"
#include "BKE_report.h"
-
/* RenderEngine */
static RenderEngineType internal_render_type = {
NULL, NULL, "BLENDER_RENDER", "Blender Render", RE_INTERNAL, NULL, {NULL, NULL, NULL, NULL}};
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
static RenderEngineType internal_game_type = {
NULL, NULL, "BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME, NULL, {NULL, NULL, NULL, NULL}};
#endif
ListBase R_engines = {NULL, NULL};
-void RE_engines_init()
+void RE_engines_init(void)
{
BLI_addtail(&R_engines, &internal_render_type);
-#if GAMEBLENDER == 1
+#ifdef WITH_GAMEENGINE
BLI_addtail(&R_engines, &internal_game_type);
#endif
}
-void RE_engines_exit()
+void RE_engines_exit(void)
{
RenderEngineType *type, *next;
@@ -91,7 +91,7 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "scene", &scene);
- engine->type->ext.call(&ptr, func, &list);
+ engine->type->ext.call(NULL, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -108,7 +108,7 @@ static void rna_RenderEngine_unregister(const bContext *C, StructRNA *type)
RNA_struct_free(&BLENDER_RNA, type);
}
-static StructRNA *rna_RenderEngine_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_RenderEngine_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
RenderEngineType *et, dummyet = {0};
RenderEngine dummyengine= {0};
@@ -124,7 +124,7 @@ static StructRNA *rna_RenderEngine_register(const bContext *C, ReportList *repor
return NULL;
if(strlen(identifier) >= sizeof(dummyet.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering render engine class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyet.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering render engine class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyet.idname));
return NULL;
}
@@ -271,7 +271,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
@@ -334,7 +334,9 @@ static void rna_def_render_layer(BlenderRNA *brna)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
prop= RNA_def_string(func, "filename", "", 0, "Filename", "Filename to load into this render tile, must be no smaller then the renderlayer");
RNA_def_property_flag(prop, PROP_REQUIRED);
-
+ prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "Offset X", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
+ prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Offset Y", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
+
RNA_define_verify_sdna(0);
rna_def_render_layer_common(srna, 0);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 81b0df1d840..4402f0a3665 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -54,6 +54,7 @@ EnumPropertyItem property_unit_items[] = {
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
/* Struct */
@@ -115,11 +116,12 @@ static int rna_idproperty_known(CollectionPropertyIterator *iter, void *data)
/* function to skip any id properties that are already known by RNA,
* for the second loop where we go over unknown id properties */
+ do {
+ for(prop= ptype->cont.properties.first; prop; prop=prop->next)
+ if((prop->flag & PROP_BUILTIN) == 0 && strcmp(prop->identifier, idprop->name) == 0)
+ return 1;
+ } while((ptype=ptype->base));
- for(prop= ptype->cont.properties.first; prop; prop=prop->next)
- if(strcmp(prop->identifier, idprop->name) == 0)
- return 1;
-
return 0;
}
@@ -299,13 +301,12 @@ PointerRNA rna_builtin_properties_get(CollectionPropertyIterator *iter)
return rna_Struct_properties_get(iter);
}
-PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key)
+int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
StructRNA *srna;
PropertyRNA *prop;
- PointerRNA propptr;
+ PointerRNA propptr= {{0}};
- memset(&propptr, 0, sizeof(propptr));
srna= ptr->type;
do {
@@ -315,15 +316,20 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
if(prop) {
propptr.type= &RNA_Property;
propptr.data= prop;
- return propptr;
+
+ *r_ptr= propptr;
+ return TRUE;
}
}
+ else {
+ for(prop=srna->cont.properties.first; prop; prop=prop->next) {
+ if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
+ propptr.type= &RNA_Property;
+ propptr.data= prop;
- for(prop=srna->cont.properties.first; prop; prop=prop->next) {
- if(!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key)==0) {
- propptr.type= &RNA_Property;
- propptr.data= prop;
- return propptr;
+ *r_ptr= propptr;
+ return TRUE;
+ }
}
}
} while((srna=srna->base));
@@ -342,13 +348,15 @@ PointerRNA rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key
if(strcmp(idp->name, key) == 0) {
propptr.type= &RNA_Property;
propptr.data= idp;
- return propptr;
+
+ *r_ptr= propptr;
+ return TRUE;
}
}
}
}
#endif
- return propptr;
+ return FALSE;
}
PointerRNA rna_builtin_type_get(PointerRNA *ptr)
@@ -474,6 +482,18 @@ static int rna_Property_is_never_none_get(PointerRNA *ptr)
return prop->flag & PROP_NEVER_NULL ? 1:0;
}
+static int rna_Property_is_hidden_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ return prop->flag & PROP_HIDDEN ? 1:0;
+}
+
+static int rna_Property_is_enum_flag_get(PointerRNA *ptr)
+{
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ return prop->flag & PROP_ENUM_FLAG ? 1:0;
+}
+
static int rna_Property_array_length_get(PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
@@ -836,34 +856,29 @@ static int rna_BlenderRNA_structs_length(PointerRNA *ptr)
{
return BLI_countlist(&((BlenderRNA*)ptr->data)->structs);
}
-static PointerRNA rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index)
+static int rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
{
StructRNA *srna= BLI_findlink(&((BlenderRNA*)ptr->data)->structs, index);
if(srna) {
- PointerRNA r_ptr;
- RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
- return r_ptr;
+ RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+ return TRUE;
}
else {
- return PointerRNA_NULL;
+ return FALSE;
}
}
-static PointerRNA rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key)
+static int rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
StructRNA *srna= ((BlenderRNA*)ptr->data)->structs.first;
- for(; srna; srna=srna->cont.next)
- if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0)
- break;
-
- if(srna) {
- PointerRNA r_ptr;
- RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
- return r_ptr;
- }
- else {
- return PointerRNA_NULL;
+ for(; srna; srna=srna->cont.next) {
+ if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0) {
+ RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
+ return TRUE;
+ }
}
+
+ return FALSE;
}
@@ -1011,6 +1026,11 @@ static void rna_def_property(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_Property_is_never_none_get", NULL);
RNA_def_property_ui_text(prop, "Never None", "True when this value can't be set to None");
+ prop= RNA_def_property(srna, "is_hidden", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Property_is_hidden_get", NULL);
+ RNA_def_property_ui_text(prop, "Hidden", "True when the property is hidden");
+
prop= RNA_def_property(srna, "is_output", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Property_use_output_get", NULL);
@@ -1030,6 +1050,11 @@ static void rna_def_property(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Property_runtime_get", NULL);
RNA_def_property_ui_text(prop, "Read Only", "Property is editable through RNA");
+
+ prop= RNA_def_property(srna, "is_enum_flag", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Property_is_enum_flag_get", NULL);
+ RNA_def_property_ui_text(prop, "Enum Flag", "True when multiple enums ");
}
static void rna_def_function(BlenderRNA *brna)
@@ -1195,6 +1220,14 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
+ /* same 'default' but uses 'PROP_ENUM_FLAG' */
+ prop= RNA_def_property(srna, "default_flag", PROP_ENUM, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_ENUM_FLAG);
+ RNA_def_property_enum_items(prop, default_dummy_items);
+ RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
+ RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
+
prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "EnumPropertyItem");
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 82fcedd4ac7..a8e8cbcc153 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -152,8 +152,14 @@ EnumPropertyItem image_type_items[] = {
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
+#include "RNA_access.h"
+
#include "MEM_guardedalloc.h"
+#include "BLI_threads.h"
+#include "BLI_editVert.h"
+#include "BLI_blenlib.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -168,10 +174,6 @@ EnumPropertyItem image_type_items[] = {
#include "BKE_screen.h"
#include "BKE_animsys.h"
-#include "BLI_threads.h"
-#include "BLI_editVert.h"
-#include "BLI_blenlib.h"
-
#include "WM_api.h"
#include "ED_info.h"
@@ -182,6 +184,21 @@ EnumPropertyItem image_type_items[] = {
#include "RE_pipeline.h"
+static int rna_Scene_object_bases_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
+{
+ Scene *scene= (Scene*)ptr->data;
+ Base *base;
+
+ for(base= scene->base.first; base; base= base->next) {
+ if(strncmp(base->object->id.name+2, key, sizeof(base->object->id.name)-2)==0) {
+ *r_ptr= rna_pointer_inherit_refine(ptr, &RNA_ObjectBase, base);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
{
ListBaseIterator *internal= iter->internal;
@@ -210,7 +227,7 @@ static Base *rna_Scene_object_link(Scene *scene, bContext *C, ReportList *report
if(scene == scene_act)
ob->lay= base->lay;
- ob->recalc |= OB_RECALC_ALL;
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
/* slows down importers too much, run scene.update() */
/* DAG_scene_sort(G.main, scene); */
@@ -299,6 +316,12 @@ static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr)
BKE_screen_view3d_main_sync(&bmain->screen, scene);
}
+static void rna_Scene_framelen_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ scene->r.framelen= (float)scene->r.framapto/(float)scene->r.images;
+}
+
+
static void rna_Scene_current_frame_set(PointerRNA *ptr, int value)
{
Scene *data= (Scene*)ptr->data;
@@ -405,7 +428,7 @@ static int rna_Scene_active_keying_set_index_get(PointerRNA *ptr)
}
/* get KeyingSet index stuff for list of Keying Sets editing UI
- * - value+1 since 0 is reserved for 'none'=
+ * - value+1 since 0 is reserved for 'none'
*/
static void rna_Scene_active_keying_set_index_set(PointerRNA *ptr, int value)
{
@@ -711,7 +734,7 @@ static void rna_Scene_glsl_update(Main *bmain, Scene *unused, PointerRNA *ptr)
{
Scene *scene= (Scene*)ptr->id.data;
- DAG_id_flush_update(&scene->id, 0);
+ DAG_id_tag_update(&scene->id, 0);
}
static void rna_RenderSettings_color_management_update(Main *bmain, Scene *unused, PointerRNA *ptr)
@@ -860,10 +883,10 @@ static void object_simplify_update(Object *ob)
static void rna_Scene_use_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- Scene *sce;
+ Scene *sce_iter;
Base *base;
- for(SETLOOPER(scene, base))
+ for(SETLOOPER(scene, sce_iter, base))
object_simplify_update(base->object);
DAG_ids_flush_update(bmain, 0);
@@ -919,7 +942,7 @@ static void rna_GameSettings_auto_start_set(PointerRNA *ptr, int value)
}
-static TimeMarker *rna_TimeLine_add(Scene *scene, char name[])
+static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
{
TimeMarker *marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
marker->flag= SELECT;
@@ -941,22 +964,12 @@ static void rna_TimeLine_remove(Scene *scene, ReportList *reports, TimeMarker *m
MEM_freeN(marker);
}
-static KeyingSet *rna_Scene_keying_set_new(Scene *sce, ReportList *reports,
- char name[], int absolute, int insertkey_needed, int insertkey_visual)
+static KeyingSet *rna_Scene_keying_set_new(Scene *sce, ReportList *reports, const char name[])
{
KeyingSet *ks= NULL;
- short flag=0, keyingflag=0;
-
- /* validate flags */
- if (absolute)
- flag |= KEYINGSET_ABSOLUTE;
- if (insertkey_needed)
- keyingflag |= INSERTKEY_NEEDED;
- if (insertkey_visual)
- keyingflag |= INSERTKEY_MATRIX;
-
+
/* call the API func, and set the active keyingset index */
- ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag);
+ ks= BKE_keyingset_add(&sce->keyingsets, name, KEYINGSET_ABSOLUTE, 0);
if (ks) {
sce->active_keyingset= BLI_countlist(&sce->keyingsets);
@@ -975,7 +988,7 @@ static void rna_def_transform_orientation(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {3, 3};
+ const int matrix_dimsize[]= {3, 3};
srna= RNA_def_struct(brna, "TransformOrientation", NULL);
@@ -1076,6 +1089,11 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Proportional Editing Falloff", "Falloff type for proportional editing mode");
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
+ prop= RNA_def_property(srna, "proportional_size", PROP_FLOAT, PROP_DISTANCE);
+ RNA_def_property_float_sdna(prop, NULL, "proportional_size");
+ RNA_def_property_ui_text(prop, "Proportional Size", "Display size for proportional editing circle");
+ RNA_def_property_range(prop, 0.00001, 5000.0);
+
prop= RNA_def_property(srna, "normal_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "normalsize");
RNA_def_property_ui_text(prop, "Normal Size", "Display size for normals in the 3D view");
@@ -1119,10 +1137,16 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_snap_project", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT);
- RNA_def_property_ui_text(prop, "Project Individual Elements", "Project vertices on the surface of other objects");
+ RNA_def_property_ui_text(prop, "Project Individual Elements", "Project individual elements on the surface of other objects");
RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
-
+
+ /* Grease Pencil */
+ prop = RNA_def_property(srna, "use_grease_pencil_sessions", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gpencil_flags", GP_TOOL_FLAG_PAINTSESSIONS_ON);
+ RNA_def_property_ui_text(prop, "Use Sketching Sessions", "Allow drawing multiple strokes at a time with Grease Pencil");
+ RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); // xxx: need toolbar to be redrawn...
+
/* Auto Keying */
prop= RNA_def_property(srna, "use_keyframe_insert_auto", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_mode", AUTOKEY_ON);
@@ -1137,7 +1161,12 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_record_with_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", ANIMRECORD_FLAG_WITHNLA);
RNA_def_property_ui_text(prop, "Layered", "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking");
-
+
+ prop= RNA_def_property(srna, "use_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_ONLYKEYINGSET);
+ RNA_def_property_ui_text(prop, "Auto Keyframe Insert Keying Set", "Automatic keyframe insertion using active Keying Set only");
+ RNA_def_property_ui_icon(prop, ICON_KEY_HLT, 0); // XXX: we need a dedicated icon
+
/* UV */
prop= RNA_def_property(srna, "uv_select_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "uv_selectmode");
@@ -1209,7 +1238,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "etch_subdivision_number", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "skgen_subdivision_number");
- RNA_def_property_range(prop, 1, 10000);
+ RNA_def_property_range(prop, 1, 255);
RNA_def_property_ui_text(prop, "Subdivisions", "Number of bones in the subdivided stroke");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -1274,6 +1303,11 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, unit_systems);
RNA_def_property_ui_text(prop, "Unit System", "The unit system to use for button display");
RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop= RNA_def_property(srna, "system_rotation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, rotation_units);
+ RNA_def_property_ui_text(prop, "Rotation Units", "Unit to use for displaying/editing rotation values");
+ RNA_def_property_update(prop, NC_WINDOW, NULL);
prop= RNA_def_property(srna, "scale_length", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_ui_text(prop, "Unit Scale", "Scale to use when converting between blender units and dimensions");
@@ -1285,12 +1319,6 @@ static void rna_def_unit_settings(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_UNIT_OPT_SPLIT);
RNA_def_property_ui_text(prop, "Separate Units", "Display units in pairs");
RNA_def_property_update(prop, NC_WINDOW, NULL);
-
- prop= RNA_def_property(srna, "rotation_units", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
- RNA_def_property_enum_items(prop, rotation_units);
- RNA_def_property_ui_text(prop, "Rotation Units", "Unit to use for displaying/editing rotation values");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
}
void rna_def_render_layer_common(StructRNA *srna, int scene)
@@ -1652,8 +1680,9 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "frame_color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "framing.col");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Framing Color", "Set colour of the bars");
+ RNA_def_property_ui_text(prop, "Framing Color", "Set color of the bars");
RNA_def_property_update(prop, NC_SCENE, NULL);
/* Stereo */
@@ -1726,8 +1755,8 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Physics Gravity", "Gravitational constant used for physics simulation in the game engine");
RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "occlusion_culling_resolution", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "occlusionRes");
+ prop= RNA_def_property(srna, "occlusion_culling_resolution", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "occlusionRes");
RNA_def_property_range(prop, 128.0, 1024.0);
RNA_def_property_ui_text(prop, "Occlusion Resolution", "The size of the occlusion buffer in pixel, use higher value for better precision (slower)");
RNA_def_property_update(prop, NC_SCENE, NULL);
@@ -1789,6 +1818,10 @@ static void rna_def_scene_game_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_PHYSICS);
RNA_def_property_ui_text(prop, "Show Physics Visualization", "Show a visualization of physics bounds and interactions");
+ prop= RNA_def_property(srna, "show_mouse", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GAME_SHOW_MOUSE);
+ RNA_def_property_ui_text(prop, "Show Mouse", "Start player with a visible mouse cursor");
+
prop= RNA_def_property(srna, "use_frame_rate", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GAME_ENABLE_ALL_FRAMES);
RNA_def_property_ui_text(prop, "Use Frame Rate", "Respect the frame rate rather than rendering as many frames as possible");
@@ -1918,6 +1951,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{R_OUTPUT_SCREEN, "SCREEN", 0, "Full Screen", "Images are rendered in full Screen"},
{R_OUTPUT_AREA, "AREA", 0, "Image Editor", "Images are rendered in Image Editor"},
{R_OUTPUT_WINDOW, "WINDOW", 0, "New Window", "Images are rendered in new Window"},
+ {R_OUTPUT_NONE, "NONE", 0, "No Output", "Images are rendered without drawing"},
{0, NULL, 0, NULL, NULL}};
/* Bake */
@@ -2114,6 +2148,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_percentage", PROP_INT, PROP_PERCENTAGE);
RNA_def_property_int_sdna(prop, NULL, "size");
+ RNA_def_property_range(prop, 1, INT_MAX);
RNA_def_property_ui_range(prop, 1, 100, 10, 1);
RNA_def_property_ui_text(prop, "Resolution %", "Percentage scale for render resolution");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2391,6 +2426,22 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "FPS Base", "Framerate base");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+ /* frame mapping */
+ prop= RNA_def_property(srna, "frame_map_old", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "framapto");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 1, 900);
+ RNA_def_property_ui_text(prop, "Frame Map Old", "Specify old mapping value in frames");
+ RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_framelen_update");
+
+ prop= RNA_def_property(srna, "frame_map_new", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "images");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_range(prop, 1, 900);
+ RNA_def_property_ui_text(prop, "Frame Map New", "Specify how many frames the Map Old will last");
+ RNA_def_property_update(prop, NC_SCENE|ND_FRAME, "rna_Scene_framelen_update");
+
+
prop= RNA_def_property(srna, "dither_intensity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "dither_intensity");
RNA_def_property_range(prop, 0.0f, 2.0f);
@@ -2649,11 +2700,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_full_sample_get", NULL);
RNA_def_property_ui_text(prop, "Full Sample","Save for every anti-aliasing sample the entire RenderLayer results. This solves anti-aliasing issues with compositing");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
-
- prop= RNA_def_property(srna, "use_backbuf", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "bufflag", R_BACKBUF);
- RNA_def_property_ui_text(prop, "Back Buffer", "Render backbuffer image");
- RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "displaymode");
@@ -2661,7 +2707,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Display", "Select where rendered images will be displayed");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
- prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "pic");
RNA_def_property_ui_text(prop, "Output Path", "Directory/name to save animations, # characters defines the position and length of frame numbers");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2739,6 +2785,11 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_CAMERA);
RNA_def_property_ui_text(prop, "Stamp Camera", "Include the name of the active camera in image metadata");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+
+ prop= RNA_def_property(srna, "use_stamp_lens", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_CAMERALENS);
+ RNA_def_property_ui_text(prop, "Stamp Lens", "Include the name of the active cameras lens in image metadata");
+ RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "use_stamp_scene", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_SCENE);
@@ -2833,6 +2884,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_single_layer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_SINGLE_LAYER);
RNA_def_property_ui_text(prop, "Single Layer", "Only render the active layer");
+ RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
/* engine */
@@ -2906,7 +2958,7 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Link object to scene, run scene.update() after.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
parm= RNA_def_pointer(func, "base", "ObjectBase", "", "The newly created base.");
RNA_def_function_return(func, parm);
@@ -2914,7 +2966,7 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Unlink object from scene.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene.");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
@@ -2996,17 +3048,13 @@ static void rna_def_scene_keying_sets(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_Scene_keying_set_new");
RNA_def_function_ui_description(func, "Add a new Keying Set to Scene.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ /* name */
+ RNA_def_string(func, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
+
/* returns the new KeyingSet */
parm= RNA_def_pointer(func, "keyingset", "KeyingSet", "", "Newly created Keying Set.");
RNA_def_function_return(func, parm);
- /* name */
- RNA_def_string(func, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
- /* flags */
- RNA_def_boolean(func, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
- /* keying flags */
- RNA_def_boolean(func, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
- RNA_def_boolean(func, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
-
+
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "KeyingSet");
RNA_def_property_flag(prop, PROP_EDITABLE);
@@ -3093,7 +3141,7 @@ void RNA_def_scene(BlenderRNA *brna)
prop= RNA_def_property(srna, "world", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "World", "World used for rendering the scene");
- RNA_def_property_update(prop, NC_SCENE|NC_WORLD, NULL);
+ RNA_def_property_update(prop, NC_SCENE|ND_WORLD, NULL);
prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ_LENGTH);
RNA_def_property_float_sdna(prop, NULL, "cursor");
@@ -3106,6 +3154,7 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "base", NULL);
RNA_def_property_struct_type(prop, "ObjectBase");
RNA_def_property_ui_text(prop, "Bases", "");
+ RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, "rna_Scene_object_bases_lookup_string");
rna_def_scene_bases(brna, prop);
prop= RNA_def_property(srna, "objects", PROP_COLLECTION, PROP_NONE);
@@ -3210,7 +3259,8 @@ void RNA_def_scene(BlenderRNA *brna)
/* Nodes (Compositing) */
- prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
RNA_def_property_ui_text(prop, "Node Tree", "Compositing node tree");
prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index f6a6453c703..042d3214edf 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -55,7 +55,12 @@ static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
scene_update_for_newframe(G.main, scene, (1<<20) - 1);
- WM_main_add_notifier(NC_SCENE|ND_FRAME, scene);
+ /* cant use NC_SCENE|ND_FRAME because this casues wm_event_do_notifiers to call
+ * scene_update_for_newframe which will loose any un-keyed changes [#24690] */
+ /* WM_main_add_notifier(NC_SCENE|ND_FRAME, scene); */
+
+ /* instead just redraw the views */
+ WM_main_add_notifier(NC_WINDOW, NULL);
}
static void rna_Scene_update_tagged(Scene *scene)
@@ -68,7 +73,7 @@ static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name
if(BKE_imtype_is_movie(rd->imtype))
BKE_makeanimstring(name, rd);
else
- BKE_makepicstring(name, rd->pic, (frame==INT_MIN) ? rd->cfra : frame, rd->imtype, rd->scemode & R_EXTENSION);
+ BKE_makepicstring(name, rd->pic, (frame==INT_MIN) ? rd->cfra : frame, rd->imtype, rd->scemode & R_EXTENSION, TRUE);
}
#else
@@ -82,7 +87,7 @@ void RNA_api_scene(StructRNA *srna)
RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately.");
parm= RNA_def_int(func, "frame", 0, MINAFRAME, MAXFRAME, "", "Frame number to set.", MINAFRAME, MAXFRAME);
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "subframe", 0.0, 0.0, 1.0, "", "Sub-frame time, between 0.0 and 1.0", 0.0, 1.0);
+ RNA_def_float(func, "subframe", 0.0, 0.0, 1.0, "", "Sub-frame time, between 0.0 and 1.0", 0.0, 1.0);
func= RNA_def_function(srna, "update", "rna_Scene_update_tagged");
RNA_def_function_ui_description(func, "Update data tagged to be updated from previous access to data or operators.");
@@ -94,9 +99,9 @@ void RNA_api_scene_render(StructRNA *srna)
PropertyRNA *parm;
func= RNA_def_function(srna, "frame_path", "rna_SceneRender_get_frame_path");
- RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately.");
- parm= RNA_def_int(func, "frame", INT_MIN, INT_MIN, INT_MAX, "", "Frame number to use, if unset the current frame will be used.", MINAFRAME, MAXFRAME);
- parm= RNA_def_string(func, "name", "", FILE_MAX, "File Name", "the resulting filename from the scenes render settings.");
+ RNA_def_function_ui_description(func, "Return the absolute path to the filename to be written for a given frame.");
+ RNA_def_int(func, "frame", INT_MIN, INT_MIN, INT_MAX, "", "Frame number to use, if unset the current frame will be used.", MINAFRAME, MAXFRAME);
+ parm= RNA_def_string_file_path(func, "filepath", "", FILE_MAX, "File Path", "the resulting filepath from the scenes render settings.");
RNA_def_property_flag(parm, PROP_THICK_WRAP); /* needed for string return value */
RNA_def_function_output(func, parm);
}
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index da8aab32f31..892090b7f38 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,14 +44,14 @@ EnumPropertyItem region_type_items[] = {
{RGN_TYPE_PREVIEW, "PREVIEW", 0, "Preview", ""},
{0, NULL, 0, NULL, NULL}};
-#ifdef RNA_RUNTIME
-
#include "ED_screen.h"
-
#include "WM_api.h"
#include "WM_types.h"
+#ifdef RNA_RUNTIME
+
+
static void rna_Screen_scene_set(PointerRNA *ptr, PointerRNA value)
{
bScreen *sc= (bScreen*)ptr->data;
@@ -74,6 +74,15 @@ static void rna_Screen_scene_update(bContext *C, PointerRNA *ptr)
}
}
+static void rna_Screen_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bScreen *screen= (bScreen*)ptr->data;
+
+ /* the settings for this are currently only available from a menu in the TimeLine, hence refresh=SPACE_TIME */
+ ED_screen_animation_timer_update(screen, screen->redraws_flag, SPACE_TIME);
+}
+
+
static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
@@ -83,7 +92,7 @@ static int rna_Screen_is_animation_playing_get(PointerRNA *ptr)
static int rna_Screen_fullscreen_get(PointerRNA *ptr)
{
bScreen *sc= (bScreen*)ptr->data;
- return (sc->full == SCREENFULL);
+ return (sc->full != 0);
}
static void rna_Area_type_set(PointerRNA *ptr, int value)
@@ -106,6 +115,7 @@ static void rna_def_area(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
+ FunctionRNA *func;
srna= RNA_def_struct(brna, "Area", NULL);
RNA_def_struct_ui_text(srna, "Area", "Area in a subdivided screen, containing an editor");
@@ -114,7 +124,7 @@ static void rna_def_area(BlenderRNA *brna)
prop= RNA_def_property(srna, "spaces", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "spacedata", NULL);
RNA_def_property_struct_type(prop, "Space");
- RNA_def_property_ui_text(prop, "Spaces", "Spaces contained in this area, the first space is active");
+ RNA_def_property_ui_text(prop, "Spaces", "Spaces contained in this area, the first being the active space. NOTE: Useful for example to restore a previously used 3d view space in a certain area to get the old view orientation.");
prop= RNA_def_property(srna, "active_space", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "spacedata.first");
@@ -139,6 +149,10 @@ static void rna_def_area(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Area_type_update");
RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
+
+ func= RNA_def_function(srna, "header_text_set", "ED_area_headerprint");
+ RNA_def_function_ui_description(func, "Set the header text");
+ RNA_def_string(func, "text", NULL, 0, "Text", "New string for the header, no argument clears the text.");
}
static void rna_def_region(BlenderRNA *brna)
@@ -170,6 +184,8 @@ static void rna_def_region(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "winy");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Height", "Region height");
+
+ RNA_def_function(srna, "tag_redraw", "ED_region_tag_redraw");
}
static void rna_def_screen(BlenderRNA *brna)
@@ -182,6 +198,7 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Screen", "Screen datablock, defining the layout of areas in a window");
RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ /* pointers */
prop= RNA_def_property(srna, "scene", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_NULL);
RNA_def_property_pointer_funcs(prop, NULL, "rna_Screen_scene_set", NULL, NULL);
@@ -189,11 +206,13 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_Screen_scene_update");
+ /* collections */
prop= RNA_def_property(srna, "areas", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "areabase", NULL);
RNA_def_property_struct_type(prop, "Area");
RNA_def_property_ui_text(prop, "Areas", "Areas the screen is subdivided into");
-
+
+ /* readonly status indicators */
prop= RNA_def_property(srna, "is_animation_playing", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Screen_is_animation_playing_get", NULL);
@@ -203,6 +222,42 @@ static void rna_def_screen(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Screen_fullscreen_get", NULL);
RNA_def_property_ui_text(prop, "Fullscreen", "An area is maximised, filling this screen");
+
+ /* Define Anim Playback Areas */
+ prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_REGION);
+ RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_3D_WIN);
+ RNA_def_property_ui_text(prop, "All 3D View Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_ANIM_WIN);
+ RNA_def_property_ui_text(prop, "Animation Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_BUTS_WIN);
+ RNA_def_property_ui_text(prop, "Property Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_ALL_IMAGE_WIN);
+ RNA_def_property_ui_text(prop, "Image Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_SEQ);
+ RNA_def_property_ui_text(prop, "Sequencer Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
+
+ prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "redraws_flag", TIME_NODES);
+ RNA_def_property_ui_text(prop, "Node Editors", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_Screen_redraw_update");
}
void RNA_def_screen(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 3b83ec2d3ad..a4face4de74 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -77,7 +77,7 @@ static EnumPropertyItem particle_edit_cache_brush_items[] = {
static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr)
{
ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
- ParticleBrushData *brush= NULL;;
+ ParticleBrushData *brush= NULL;
if(pset->brushtype != PE_BRUSH_NONE)
brush= &pset->brush[pset->brushtype];
@@ -105,7 +105,7 @@ static void rna_ParticleEdit_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Object *ob= (scene->basact)? scene->basact->object: NULL;
- if(ob) DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ if(ob) DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value)
{
@@ -115,7 +115,7 @@ static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value)
if((pset->brushtype == PE_BRUSH_WEIGHT || value == PE_BRUSH_WEIGHT) && pset->scene) {
Object *ob = (pset->scene->basact)? pset->scene->basact->object: NULL;
if(ob) {
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
}
}
@@ -160,10 +160,25 @@ static int rna_ParticleEdit_hair_get(PointerRNA *ptr)
static int rna_Brush_mode_poll(PointerRNA *ptr, PointerRNA value)
{
Scene *scene= (Scene *)ptr->id.data;
- Object *ob = OBACT;
+ ToolSettings *ts = scene->toolsettings;
Brush *brush= value.id.data;
- return ob->mode & brush->ob_mode;
+ int mode = 0;
+
+ /* check the origin of the Paint struct to see which paint
+ mode to select from */
+
+ if(ptr->data == &ts->imapaint)
+ mode = OB_MODE_TEXTURE_PAINT;
+ else if(ptr->data == ts->sculpt)
+ mode = OB_MODE_SCULPT;
+ else if(ptr->data == ts->vpaint)
+ mode = OB_MODE_VERTEX_PAINT;
+ else if(ptr->data == ts->wpaint)
+ mode = OB_MODE_WEIGHT_PAINT;
+
+ return brush->ob_mode & mode;
}
+
#else
static void rna_def_paint(BlenderRNA *brna)
@@ -274,15 +289,6 @@ static void rna_def_image_paint(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Image Paint", "Properties of image and texture painting mode");
/* booleans */
-
- prop= RNA_def_property(srna, "show_brush_draw", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL);
- RNA_def_property_ui_text(prop, "Show Brush Draw", "Enables brush shape while drawing");
-
- prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL_DRAWING);
- RNA_def_property_ui_text(prop, "Show Brush", "Enables brush shape while not drawing");
-
prop= RNA_def_property(srna, "use_projection", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_DISABLE);
RNA_def_property_ui_text(prop, "Project Paint", "Use projection painting for improved consistency in the brush strokes");
@@ -409,7 +415,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "default_key_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "totaddkey");
- RNA_def_property_range(prop, 2, INT_MAX);
+ RNA_def_property_range(prop, 2, SHRT_MAX);
RNA_def_property_ui_range(prop, 2, 20, 10, 3);
RNA_def_property_ui_text(prop, "Keys", "How many keys to make new particles with");
@@ -456,7 +462,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Particle Brush", "Particle editing brush");
prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 100, 10, 3);
RNA_def_property_ui_text(prop, "Size", "Brush size");
@@ -471,7 +477,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "steps", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "step");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 50, 10, 3);
RNA_def_property_ui_text(prop, "Steps", "Brush steps");
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index d20e5aebcfb..f4d732ee041 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,7 @@
#include "RNA_define.h"
#include "RNA_enum_types.h"
+#include "RNA_access.h"
#include "rna_internal.h"
@@ -115,7 +116,7 @@ EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free)
Object *ob=NULL;
int totitem= 0;
- if (ptr->type == &RNA_Sensor) {
+ if (ptr->type == &RNA_Sensor || RNA_struct_is_a(ptr->type, &RNA_Sensor)) {
ob = (Object *)ptr->id.data;
} else {
/* can't use ob from ptr->id.data because that enum is also used by operators */
@@ -156,6 +157,8 @@ static void rna_Sensor_keyboard_key_set(struct PointerRNA *ptr, int value)
if (ISKEYBOARD(value))
ks->key = value;
+ else
+ ks->key = 0;
}
static void rna_Sensor_keyboard_modifier_set(struct PointerRNA *ptr, int value)
@@ -165,6 +168,8 @@ static void rna_Sensor_keyboard_modifier_set(struct PointerRNA *ptr, int value)
if (ISKEYBOARD(value))
ks->qual = value;
+ else
+ ks->qual = 0;
}
static void rna_Sensor_keyboard_modifier2_set(struct PointerRNA *ptr, int value)
@@ -174,6 +179,8 @@ static void rna_Sensor_keyboard_modifier2_set(struct PointerRNA *ptr, int value)
if (ISKEYBOARD(value))
ks->qual2 = value;
+ else
+ ks->qual2 = 0;
}
static void rna_Sensor_tap_set(struct PointerRNA *ptr, int value)
@@ -325,7 +332,7 @@ static void rna_def_near_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
@@ -336,7 +343,7 @@ static void rna_def_near_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "reset_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "resetdist");
- RNA_def_property_ui_text(prop, "Reset Distance", "");
+ RNA_def_property_ui_text(prop, "Reset Distance", "The distance where the sensor forgets the actor");
RNA_def_property_range(prop, 0.0f, 10000.0f);
RNA_def_property_update(prop, NC_LOGIC, NULL);
}
@@ -381,7 +388,7 @@ static void rna_def_touch_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_pointer_sdna(prop, NULL, "ma");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for objects with this material (blank = all objects)");
/* note: custom set function is ONLY to avoid rna setting a user for this. */
RNA_def_property_pointer_funcs(prop, NULL, "rna_Sensor_touch_material_set", NULL, NULL);
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -419,12 +426,12 @@ static void rna_def_keyboard_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "target", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "targetName");
- RNA_def_property_ui_text(prop, "Target", "Property that indicates whether to log keystrokes as a string");
+ RNA_def_property_ui_text(prop, "Target", "Property that receive the keystrokes in case a string is logged");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "log", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "toggleName");
- RNA_def_property_ui_text(prop, "Log Toggle", "Property that receive the keystrokes in case a string is logged");
+ RNA_def_property_ui_text(prop, "Log Toggle", "Property that indicates whether to log keystrokes as a string");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "use_all_keys", PROP_BOOLEAN, PROP_NONE);
@@ -485,7 +492,7 @@ static void rna_def_armature_sensor(BlenderRNA *brna)
{SENS_ARM_LIN_ERROR_BELOW, "LINERRORBELOW", 0, "Lin error below", ""},
{SENS_ARM_LIN_ERROR_ABOVE, "LINERRORABOVE", 0, "Lin error above", ""},
{SENS_ARM_ROT_ERROR_BELOW, "ROTERRORBELOW", 0, "Rot error below", ""},
- {SENS_ARM_ROT_ERROR_ABOVE, "ROTERRORBELOW", 0, "Rot error above", ""},
+ {SENS_ARM_ROT_ERROR_ABOVE, "ROTERRORABOVE", 0, "Rot error above", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ArmatureSensor", "Sensor");
@@ -495,17 +502,17 @@ static void rna_def_armature_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "test_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type");
RNA_def_property_enum_items(prop, prop_type_items);
- RNA_def_property_ui_text(prop, "Test Type", "Type of value and test");
+ RNA_def_property_ui_text(prop, "Test", "Type of value and test");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "bone", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "posechannel");
- RNA_def_property_ui_text(prop, "Bone name", "Identify the bone to check value from");
+ RNA_def_property_ui_text(prop, "Bone Name", "Identify the bone to check value from");
RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update");
prop= RNA_def_property(srna, "constraint", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "constraint");
- RNA_def_property_ui_text(prop, "Constraint name", "Identify the bone constraint to check value from");
+ RNA_def_property_ui_text(prop, "Constraint Name", "Identify the bone constraint to check value from");
RNA_def_property_update(prop, NC_LOGIC, "rna_Sensor_Armature_update");
prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
@@ -576,13 +583,13 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX to make a setFunction to create a lookup with all materials in Blend File (not only this object mat.)
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "materialName");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/*//XXX either use a datablock look up to store the string name (material)
@@ -591,7 +598,7 @@ static void rna_def_collision_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
*/
}
@@ -600,12 +607,12 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
static EnumPropertyItem axis_items[] ={
- {SENS_RAY_X_AXIS, "XAXIS", 0, "+X axis", ""},
- {SENS_RAY_Y_AXIS, "YAXIS", 0, "+Y axis", ""},
- {SENS_RAY_Z_AXIS, "ZAXIS", 0, "+Z axis", ""},
- {SENS_RAY_NEG_X_AXIS, "NEGXAXIS", 0, "-X axis", ""},
- {SENS_RAY_NEG_Y_AXIS, "NEGYAXIS", 0, "-Y axis", ""},
- {SENS_RAY_NEG_Z_AXIS, "NEGZAXIS", 0, "-Z axis", ""},
+ {SENS_RADAR_X_AXIS, "XAXIS", 0, "+X axis", ""},
+ {SENS_RADAR_Y_AXIS, "YAXIS", 0, "+Y axis", ""},
+ {SENS_RADAR_Z_AXIS, "ZAXIS", 0, "+Z axis", ""},
+ {SENS_RADAR_NEG_X_AXIS, "NEGXAXIS", 0, "-X axis", ""},
+ {SENS_RADAR_NEG_Y_AXIS, "NEGYAXIS", 0, "-Y axis", ""},
+ {SENS_RADAR_NEG_Z_AXIS, "NEGZAXIS", 0, "-Z axis", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "RadarSensor", "Sensor");
@@ -614,7 +621,7 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "name");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
@@ -622,7 +629,7 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the radar cone is cast");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
RNA_def_property_range(prop, 0.0, 179.9);
RNA_def_property_ui_text(prop, "Angle", "Opening angle of the radar cone");
RNA_def_property_update(prop, NC_LOGIC, NULL);
@@ -679,12 +686,12 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "property", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "propname");
- RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property");
+ RNA_def_property_ui_text(prop, "Property", "Only look for Objects with this property (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "material", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "matname");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* //XXX either use a datablock look up to store the string name (material)
@@ -693,7 +700,7 @@ static void rna_def_ray_sensor(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "Material");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ma");
- RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material");
+ RNA_def_property_ui_text(prop, "Material", "Only look for Objects with this material (blank = all objects)");
*/
prop= RNA_def_property(srna, "use_x_ray", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_sensor_api.c b/source/blender/makesrna/intern/rna_sensor_api.c
index afdb71b4f3b..5bf0e00f05d 100644
--- a/source/blender/makesrna/intern/rna_sensor_api.c
+++ b/source/blender/makesrna/intern/rna_sensor_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index 3593efaa743..dae4b484aef 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -119,7 +119,7 @@ static void rna_Sequence_start_frame_set(PointerRNA *ptr, int value)
Sequence *seq= (Sequence*)ptr->data;
Scene *scene= (Scene*)ptr->id.data;
- seq->start= value;
+ seq_translate(scene, seq, value - seq->start);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -150,7 +150,7 @@ static void rna_Sequence_anim_startofs_final_set(PointerRNA *ptr, int value)
seq->anim_startofs = MIN2(value, seq->len + seq->anim_startofs);
- reload_sequence_new_file(G.main, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -161,7 +161,7 @@ static void rna_Sequence_anim_endofs_final_set(PointerRNA *ptr, int value)
seq->anim_endofs = MIN2(value, seq->len + seq->anim_endofs);
- reload_sequence_new_file(G.main, scene, seq, FALSE);
+ reload_sequence_new_file(scene, seq, FALSE);
rna_Sequence_frame_change_update(scene, seq);
}
@@ -446,7 +446,7 @@ static void rna_Sequence_filepath_get(PointerRNA *ptr, char *value)
Sequence *seq= (Sequence*)(ptr->data);
char path[FILE_MAX];
- BLI_join_dirfile(path, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_join_dirfile(path, sizeof(path), seq->strip->dir, seq->strip->stripdata->name);
BLI_strncpy(value, path, strlen(path)+1);
}
@@ -455,7 +455,7 @@ static int rna_Sequence_filepath_length(PointerRNA *ptr)
Sequence *seq= (Sequence*)(ptr->data);
char path[FILE_MAX];
- BLI_join_dirfile(path, seq->strip->dir, seq->strip->stripdata->name);
+ BLI_join_dirfile(path, sizeof(path), seq->strip->dir, seq->strip->stripdata->name);
return strlen(path)+1;
}
@@ -474,7 +474,7 @@ static void rna_Sequence_proxy_filepath_get(PointerRNA *ptr, char *value)
StripProxy *proxy= (StripProxy*)(ptr->data);
char path[FILE_MAX];
- BLI_join_dirfile(path, proxy->dir, proxy->file);
+ BLI_join_dirfile(path, sizeof(path), proxy->dir, proxy->file);
BLI_strncpy(value, path, strlen(path)+1);
}
@@ -483,7 +483,7 @@ static int rna_Sequence_proxy_filepath_length(PointerRNA *ptr)
StripProxy *proxy= (StripProxy*)(ptr->data);
char path[FILE_MAX];
- BLI_join_dirfile(path, proxy->dir, proxy->file);
+ BLI_join_dirfile(path, sizeof(path), proxy->dir, proxy->file);
return strlen(path)+1;
}
@@ -502,6 +502,12 @@ static void rna_Sequence_attenuation_set(PointerRNA *ptr, float value)
}
+static int rna_Sequence_input_count_get(PointerRNA *ptr)
+{
+ Sequence *seq= (Sequence*)(ptr->data);
+
+ return get_sequence_effect_num_inputs(seq->type);
+}
/*static void rna_SoundSequence_filename_set(PointerRNA *ptr, const char *value)
{
Sequence *seq= (Sequence*)(ptr->data);
@@ -552,7 +558,7 @@ static void rna_Sequence_mute_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static void rna_Sequence_filepath_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Sequence *seq= (Sequence*)(ptr->data);
- reload_sequence_new_file(G.main, scene, seq, TRUE);
+ reload_sequence_new_file(scene, seq, TRUE);
calc_sequence(scene, seq);
rna_Sequence_update(bmain, scene, ptr);
}
@@ -660,6 +666,16 @@ static void rna_def_strip_element(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "name");
RNA_def_property_ui_text(prop, "Filename", "");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+
+ prop= RNA_def_property(srna, "orig_width", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "orig_width");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Orig Width", "Original image width");
+
+ prop= RNA_def_property(srna, "orig_height", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "orig_height");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Orig Height", "Original image height");
}
static void rna_def_strip_crop(BlenderRNA *brna)
@@ -677,13 +693,13 @@ static void rna_def_strip_crop(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "min_x", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_y", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "bottom");
RNA_def_property_ui_text(prop, "Bottom", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "min_y", PROP_INT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "min_x", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "left");
RNA_def_property_ui_text(prop, "Left", "");
RNA_def_property_ui_range(prop, 0, 4096, 1, 0);
@@ -980,11 +996,29 @@ static void rna_def_sequence(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "speed_fader", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "speed_factor", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "speed_fader");
- RNA_def_property_ui_text(prop, "Speed effect fader position", "");
+ RNA_def_property_ui_text(prop, "Speed factor", "Multiply the current speed of the sequence with this number or remap current frame to this frame");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+ /* effect strip inputs */
+
+ prop= RNA_def_property(srna, "input_count", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, "rna_Sequence_input_count_get", NULL, NULL);
+
+ prop= RNA_def_property(srna, "input_1", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq1");
+ RNA_def_property_ui_text(prop, "Input 1", "First input for the effect strip");
+
+ prop= RNA_def_property(srna, "input_2", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq2");
+ RNA_def_property_ui_text(prop, "Input 2", "Second input for the effect strip");
+
+ prop= RNA_def_property(srna, "input_3", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "seq1");
+ RNA_def_property_ui_text(prop, "Input 3", "Third input for the effect strip");
+
RNA_api_sequence_strip(srna);
}
@@ -1248,6 +1282,11 @@ static void rna_def_movie(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "MPEG Preseek", "For MPEG movies, preseek this many frames");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
+ prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", "strip->len");
+ RNA_def_property_struct_type(prop, "SequenceElement");
+ RNA_def_property_ui_text(prop, "Elements", "");
+
prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_ui_text(prop, "File", "");
RNA_def_property_string_funcs(prop, "rna_Sequence_filepath_get", "rna_Sequence_filepath_length",
@@ -1281,7 +1320,7 @@ static void rna_def_sound(BlenderRNA *brna)
prop= RNA_def_property(srna, "attenuation", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, -100.0f, +40.0f);
- RNA_def_property_ui_text(prop, "Attenuation/db", "Attenuation in dezibel");
+ RNA_def_property_ui_text(prop, "Attenuation/dB", "Attenuation in decibel");
RNA_def_property_float_funcs(prop, "rna_Sequence_attenuation_get", "rna_Sequence_attenuation_set", NULL);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
@@ -1535,16 +1574,16 @@ static void rna_def_speed_control(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "SpeedControl Sequence", "Sequence strip to control the speed of other strips");
RNA_def_struct_sdna_from(srna, "SpeedControlVars", "effectdata");
- prop= RNA_def_property(srna, "global_speed", PROP_FLOAT, PROP_UNSIGNED);
+ prop= RNA_def_property(srna, "multiply_speed", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_float_sdna(prop, NULL, "globalSpeed");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* seq->facf0 is used to animate this */
- RNA_def_property_ui_text(prop, "Global Speed", "");
+ RNA_def_property_ui_text(prop, "Multiply Speed", "Multiply the resulting speed after the speed factor");
RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 0);
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "use_curve_velocity", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_as_speed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_INTEGRATE);
- RNA_def_property_ui_text(prop, "F-Curve Velocity", "Interpret the F-Curve value as a velocity instead of a frame number");
+ RNA_def_property_ui_text(prop, "Use as speed", "Interpret the value as speed instead of a frame number");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
prop= RNA_def_property(srna, "use_frame_blend", PROP_BOOLEAN, PROP_NONE);
@@ -1552,9 +1591,9 @@ static void rna_def_speed_control(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Frame Blending", "Blend two frames into the target for a smoother result");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
- prop= RNA_def_property(srna, "use_curve_compress_y", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "scale_to_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", SEQ_SPEED_COMPRESS_IPO_Y);
- RNA_def_property_ui_text(prop, "F-Curve Compress Y", "Scale F-Curve value to get the target frame number, F-Curve value runs from 0.0 to 1.0");
+ RNA_def_property_ui_text(prop, "Scale to length", "Scale values from 0.0 to 1.0 to target sequence length");
RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update");
}
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index 425bad9fcd7..614e3d7b031 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -66,7 +66,7 @@ void RNA_api_sequence_strip(StructRNA *srna)
func= RNA_def_function(srna, "swap", "rna_Sequence_swap_internal");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "other", "Sequence", "Other", "");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index 53f27bc06fb..f0d5600ac06 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +33,7 @@
#include "BKE_smoke.h"
#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_smoke_types.h"
@@ -49,7 +50,7 @@
static void rna_Smoke_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
- DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+ DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
}
static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -64,6 +65,9 @@ static void rna_Smoke_reset(Main *bmain, Scene *scene, PointerRNA *ptr)
smokeModifier_reset(settings->smd);
+ if(settings->smd && settings->smd->domain)
+ settings->point_cache[0]->flag |= PTCACHE_OUTDATED;
+
rna_Smoke_update(bmain, scene, ptr);
}
@@ -73,6 +77,9 @@ static void rna_Smoke_reset_dependancy(Main *bmain, Scene *scene, PointerRNA *pt
smokeModifier_reset(settings->smd);
+ if(settings->smd && settings->smd->domain)
+ settings->smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
+
rna_Smoke_dependency_update(bmain, scene, ptr);
}
@@ -165,14 +172,14 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "alpha");
RNA_def_property_range(prop, -5.0, 5.0);
RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
- RNA_def_property_ui_text(prop, "Gravity", "Higher value results in sinking smoke");
+ RNA_def_property_ui_text(prop, "Density", "How much density effects smoke motion, higher value results in faster rising smoke");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "beta", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "beta");
RNA_def_property_range(prop, -5.0, 5.0);
RNA_def_property_ui_range(prop, -5.0, 5.0, 0.02, 5);
- RNA_def_property_ui_text(prop, "Heat", "Higher value results in faster rising smoke");
+ RNA_def_property_ui_text(prop, "Heat", "How much heat effects smoke motion, higher value results in faster rising smoke");
RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "collision_group", PROP_POINTER, PROP_NONE);
@@ -208,40 +215,29 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 1.0, 10000.0);
RNA_def_property_ui_range(prop, 1.0, 10000.0, 1, 0);
RNA_def_property_ui_text(prop, "Dissolve Speed", "Dissolve Speed");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "use_dissolve_smoke", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE);
RNA_def_property_ui_text(prop, "Dissolve Smoke", "Enable smoke to disappear over time");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "use_dissolve_smoke_log", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_DISSOLVE_LOG);
RNA_def_property_ui_text(prop, "Logarithmic dissolve", "Using 1/x ");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
- prop= RNA_def_property(srna, "point_cache_low", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "point_cache", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
RNA_def_property_pointer_sdna(prop, NULL, "point_cache[0]");
RNA_def_property_ui_text(prop, "Point Cache", "");
- prop= RNA_def_property(srna, "point_cache_high", PROP_POINTER, PROP_NONE);
- RNA_def_property_flag(prop, PROP_NEVER_NULL);
- RNA_def_property_pointer_sdna(prop, NULL, "point_cache[1]");
- RNA_def_property_ui_text(prop, "Point Cache", "");
-
prop= RNA_def_property(srna, "point_cache_compress_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "cache_comp");
RNA_def_property_enum_items(prop, smoke_cache_comp_items);
RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
RNA_def_property_update(prop, 0, NULL);
- prop= RNA_def_property(srna, "point_cache_compress_high_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "cache_high_comp");
- RNA_def_property_enum_items(prop, smoke_cache_comp_items);
- RNA_def_property_ui_text(prop, "Cache Compression", "Compression method to be used");
- RNA_def_property_update(prop, 0, NULL);
-
prop= RNA_def_property(srna, "collision_extents", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "border_collisions");
RNA_def_property_enum_items(prop, smoke_domain_colli_items);
@@ -256,7 +252,7 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "smooth_emitter", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_SMOKE_HIGH_SMOOTH);
RNA_def_property_ui_text(prop, "Smooth Emitter", "Smoothens emitted smoke to avoid blockiness.");
- RNA_def_property_update(prop, 0, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Smoke_reset");
prop= RNA_def_property(srna, "time_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "time_scale");
diff --git a/source/blender/makesrna/intern/rna_sound.c b/source/blender/makesrna/intern/rna_sound.c
index 674fbbad9c6..dc30f0f09b4 100644
--- a/source/blender/makesrna/intern/rna_sound.c
+++ b/source/blender/makesrna/intern/rna_sound.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 780cc31edea..c6ed60c90f7 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,7 +31,10 @@
#include "rna_internal.h"
+#include "BKE_key.h"
+
#include "DNA_action_types.h"
+#include "DNA_key_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_space_types.h"
@@ -59,7 +62,7 @@ EnumPropertyItem space_type_items[] = {
{SPACE_TIME, "TIMELINE", 0, "Timeline", ""},
{SPACE_NODE, "NODE_EDITOR", 0, "Node Editor", ""},
{SPACE_LOGIC, "LOGIC_EDITOR", 0, "Logic Editor", ""},
- {SPACE_CONSOLE, "CONSOLE", 0, "Console", ""},
+ {SPACE_CONSOLE, "CONSOLE", 0, "Python Console", ""},
{SPACE_USERPREF, "USER_PREFERENCES", 0, "User Preferences", ""},
{0, NULL, 0, NULL, NULL}};
@@ -345,7 +348,18 @@ static void rna_RegionView3D_quadview_update(Main *main, Scene *scene, PointerRN
rna_area_region_from_regiondata(ptr, &sa, &ar);
if(sa && ar && ar->alignment==RGN_ALIGN_QSPLIT)
- ED_view3d_quadview_update(sa, ar);
+ ED_view3d_quadview_update(sa, ar, FALSE);
+}
+
+/* same as above but call clip==TRUE */
+static void rna_RegionView3D_quadview_clip_update(Main *main, Scene *scene, PointerRNA *ptr)
+{
+ ScrArea *sa;
+ ARegion *ar;
+
+ rna_area_region_from_regiondata(ptr, &sa, &ar);
+ if(sa && ar && ar->alignment==RGN_ALIGN_QSPLIT)
+ ED_view3d_quadview_update(sa, ar, TRUE);
}
static void rna_RegionView3D_view_location_get(PointerRNA *ptr, float *values)
@@ -370,6 +384,8 @@ static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr)
static void rna_SpaceImageEditor_paint_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
paint_init(&scene->toolsettings->imapaint.paint, PAINT_CURSOR_TEXTURE_PAINT);
+
+ ED_space_image_paint_update(bmain->wm.first, scene->toolsettings);
}
static int rna_SpaceImageEditor_show_render_get(PointerRNA *ptr)
@@ -474,7 +490,8 @@ static void rna_SpaceImageEditor_curves_update(Main *bmain, Scene *scene, Pointe
void *lock;
ibuf= ED_space_image_acquire_buffer(sima, &lock);
- curvemapping_do_ibuf(sima->cumap, ibuf);
+ if(ibuf->rect_float)
+ curvemapping_do_ibuf(sima->cumap, ibuf);
ED_space_image_release_buffer(sima, lock);
WM_main_add_notifier(NC_IMAGE, sima->image);
@@ -558,6 +575,14 @@ static void rna_SpaceProperties_pin_id_update(Main *bmain, Scene *scene, Pointer
}
+static void rna_SpaceProperties_context_set(PointerRNA *ptr, int value)
+{
+ SpaceButs *sbuts= (SpaceButs*)(ptr->data);
+
+ sbuts->mainb= value;
+ sbuts->mainbuser = value;
+}
+
static void rna_SpaceProperties_align_set(PointerRNA *ptr, int value)
{
SpaceButs *sbuts= (SpaceButs*)(ptr->data);
@@ -605,16 +630,6 @@ static void rna_ConsoleLine_cursor_index_range(PointerRNA *ptr, int *min, int *m
*max= ci->len;
}
-/* Space Time */
-
-static void rna_SpaceTime_redraw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- SpaceTime *st= (SpaceTime*)ptr->data;
- bScreen *screen= (bScreen*)ptr->id.data;
-
- ED_screen_animation_timer_update(screen, st->redraws, SPACE_TIME);
-}
-
/* Space Dopesheet */
static void rna_SpaceDopeSheetEditor_action_set(PointerRNA *ptr, PointerRNA value)
@@ -629,29 +644,64 @@ static void rna_SpaceDopeSheetEditor_action_update(Main *bmain, Scene *scene, Po
Object *obact= (scene->basact)? scene->basact->object: NULL;
/* we must set this action to be the one used by active object (if not pinned) */
- if(obact/* && saction->pin == 0*/) {
- AnimData *adt= BKE_id_add_animdata(&obact->id); /* this only adds if non-existant */
+ if (obact/* && saction->pin == 0*/) {
+ AnimData *adt = NULL;
+
+ if (saction->mode == SACTCONT_ACTION) {
+ // TODO: context selector could help decide this with more control?
+ adt= BKE_id_add_animdata(&obact->id); /* this only adds if non-existant */
+ }
+ else if (saction->mode == SACTCONT_SHAPEKEY) {
+ Key *key = ob_get_key(obact);
+ if (key)
+ adt= BKE_id_add_animdata(&key->id); /* this only adds if non-existant */
+ }
/* set action */
- adt->action= saction->action;
- id_us_plus(&adt->action->id);
+ if (adt) {
+ /* fix id-count of action we're replacing */
+ id_us_min(&adt->action->id);
+
+ /* show new id-count of action we're replacing */
+ adt->action= saction->action;
+ id_us_plus(&adt->action->id);
+ }
/* force depsgraph flush too */
- DAG_id_flush_update(&obact->id, OB_RECALC_OB|OB_RECALC_DATA);
+ DAG_id_tag_update(&obact->id, OB_RECALC_OB|OB_RECALC_DATA);
}
}
static void rna_SpaceDopeSheetEditor_mode_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
SpaceAction *saction= (SpaceAction*)(ptr->data);
+ Object *obact= (scene->basact)? scene->basact->object: NULL;
- /* special exception for ShapeKey Editor mode:
- * enable 'show sliders' by default, since one of the main
- * points of the ShapeKey Editor is to provide a one-stop shop
- * for controlling the shapekeys, whose main control is the value
- */
- if (saction->mode == SACTCONT_SHAPEKEY)
+ /* special exceptions for ShapeKey Editor mode */
+ if (saction->mode == SACTCONT_SHAPEKEY) {
+ Key *key = ob_get_key(obact);
+
+ /* 1) update the action stored for the editor */
+ if (key)
+ saction->action = (key->adt)? key->adt->action : NULL;
+ else
+ saction->action = NULL;
+
+ /* 2) enable 'show sliders' by default, since one of the main
+ * points of the ShapeKey Editor is to provide a one-stop shop
+ * for controlling the shapekeys, whose main control is the value
+ */
saction->flag |= SACTION_SLIDERS;
+ }
+ /* make sure action stored is valid */
+ else if (saction->mode == SACTCONT_ACTION) {
+ /* 1) update the action stored for the editor */
+ // TODO: context selector could help decide this with more control?
+ if (obact)
+ saction->action = (obact->adt)? obact->adt->action : NULL;
+ else
+ saction->action = NULL;
+ }
}
/* Space Graph Editor */
@@ -680,6 +730,71 @@ static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr)
ED_sequencer_update_view(C, view);
}
+static float rna_BackgroundImage_opacity_get(PointerRNA *ptr)
+{
+ BGpic *bgpic= (BGpic *)ptr->data;
+ return 1.0f-bgpic->blend;
+}
+
+static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value)
+{
+ BGpic *bgpic= (BGpic *)ptr->data;
+ bgpic->blend = 1.0f - value;
+}
+
+static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob = CTX_data_active_object(C);
+ EnumPropertyItem *item= NULL;
+ EnumPropertyItem tmp= {0, "", 0, "", ""};
+ int totitem= 0;
+
+ if(ob) {
+ if(ob->type == OB_LAMP) {
+ tmp.value = SB_TEXC_MAT_OR_LAMP;
+ tmp.description = "Show Lamp Textures";
+ tmp.identifier = "LAMP";
+ tmp.icon = ICON_LAMP_POINT;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+ else if(ob->totcol) {
+ tmp.value = SB_TEXC_MAT_OR_LAMP;
+ tmp.description = "Show Material Textures";
+ tmp.identifier = "MATERIAL";
+ tmp.icon = ICON_MATERIAL;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ if(ob->particlesystem.first) {
+ tmp.value = SB_TEXC_PARTICLES;
+ tmp.description = "Show Particle Textures";
+ tmp.identifier = "PARTICLE";
+ tmp.icon = ICON_PARTICLES;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+ }
+
+ if(scene && scene->world) {
+ tmp.value = SB_TEXC_WORLD;
+ tmp.description = "Show World Textures";
+ tmp.identifier = "WORLD";
+ tmp.icon = ICON_WORLD;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+ }
+
+ tmp.value = SB_TEXC_BRUSH;
+ tmp.description = "Show Brush Textures";
+ tmp.identifier = "BRUSH";
+ tmp.icon = ICON_BRUSH_DATA;
+ RNA_enum_item_add(&item, &totitem, &tmp);
+
+ RNA_enum_item_end(&item, &totitem);
+ *free = 1;
+
+ return item;
+}
+
#else
static void rna_def_space(BlenderRNA *brna)
@@ -915,9 +1030,10 @@ static void rna_def_background_image(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, FLT_MAX);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
- prop= RNA_def_property(srna, "transparency", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "blend");
- RNA_def_property_ui_text(prop, "Transparency", "Amount to blend the image against the background color");
+ RNA_def_property_float_funcs(prop, "rna_BackgroundImage_opacity_get", "rna_BackgroundImage_opacity_set", NULL);
+ RNA_def_property_ui_text(prop, "Opacity", "Image opacity to blend the image against the background color");
RNA_def_property_range(prop, 0.0, 1.0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -938,7 +1054,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- int matrix_dimsize[]= {4, 4};
+ const int matrix_dimsize[]= {4, 4};
static EnumPropertyItem pivot_items[] = {
{V3D_CENTER, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""},
@@ -967,12 +1083,17 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "lock_object", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_pointer_sdna(prop, NULL, "ob_centre");
- RNA_def_property_ui_text(prop, "Lock Object", "3D View center is locked to this object's position");
+ RNA_def_property_ui_text(prop, "Lock to Object", "3D View center is locked to this object's position");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "lock_bone", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "ob_centre_bone");
- RNA_def_property_ui_text(prop, "Lock Bone", "3D View center is locked to this bone's position");
+ RNA_def_property_ui_text(prop, "Lock to Bone", "3D View center is locked to this bone's position");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+
+ prop= RNA_def_property(srna, "lock_cursor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "ob_centre_cursor", 1);
+ RNA_def_property_ui_text(prop, "Lock to Cursor", "3D View center is locked to the cursor's position");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
prop= RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
@@ -1009,13 +1130,13 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_range(prop, 1.0f, FLT_MAX);
RNA_def_property_ui_text(prop, "Clip End", "3D View far clipping distance");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
-
- prop= RNA_def_property(srna, "grid_spacing", PROP_FLOAT, PROP_DISTANCE);
+
+ prop= RNA_def_property(srna, "grid_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "grid");
- RNA_def_property_ui_text(prop, "Grid Spacing", "The distance between 3D View grid lines");
+ RNA_def_property_ui_text(prop, "Grid Scale", "The distance between 3D View grid lines");
RNA_def_property_range(prop, 0.0f, FLT_MAX);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
-
+
prop= RNA_def_property(srna, "grid_lines", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "gridlines");
RNA_def_property_ui_text(prop, "Grid Lines", "The number of grid lines to display in perspective view");
@@ -1187,7 +1308,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_box_clip", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "viewlock", RV3D_BOXCLIP);
RNA_def_property_ui_text(prop, "Clip", "Clip objects based on what's visible in other side views");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_update");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_RegionView3D_quadview_clip_update");
prop= RNA_def_property(srna, "perspective_matrix", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_float_sdna(prop, NULL, "persmat");
@@ -1218,7 +1339,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4);
RNA_def_property_update(prop, NC_WINDOW, NULL);
- prop= RNA_def_property(srna, "view_rotate_method", PROP_FLOAT, PROP_QUATERNION);
+ prop= RNA_def_property(srna, "view_rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "viewquat");
RNA_def_property_ui_text(prop, "View Rotation", "Rotation in quaternions (keep normalized)");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
@@ -1255,6 +1376,10 @@ static void rna_def_space_buttons(BlenderRNA *brna)
{BUT_HORIZONTAL, "HORIZONTAL", 0, "Horizontal", ""},
{BUT_VERTICAL, "VERTICAL", 0, "Vertical", ""},
{0, NULL, 0, NULL, NULL}};
+
+ static EnumPropertyItem buttons_texture_context_items[] = {
+ {SB_TEXC_MAT_OR_LAMP, "MATERIAL", ICON_MATERIAL, "Material", "Material"},
+ {0, NULL, 0, NULL, NULL}}; //actually populated dynamically trough a function
srna= RNA_def_struct(brna, "SpaceProperties", "Space");
RNA_def_struct_sdna(srna, "SpaceButs");
@@ -1263,6 +1388,7 @@ static void rna_def_space_buttons(BlenderRNA *brna)
prop= RNA_def_property(srna, "context", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "mainb");
RNA_def_property_enum_items(prop, buttons_context_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_SpaceProperties_context_set", NULL);
RNA_def_property_ui_text(prop, "Context", "Type of active data to display and edit");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
@@ -1273,10 +1399,11 @@ static void rna_def_space_buttons(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Align", "Arrangement of the panels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
- prop= RNA_def_property(srna, "show_brush_texture", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", SB_BRUSH_TEX);
- RNA_def_property_ui_text(prop, "Brush Texture", "Show brush textures");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_PROPERTIES, NULL);
+ prop= RNA_def_property(srna, "texture_context", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_items(prop, buttons_texture_context_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceProperties_texture_context_itemf");
+ RNA_def_property_ui_text(prop, "Texture Context", "Type of texture data to display and edit");
+ RNA_def_property_update(prop, NC_TEXTURE, NULL);
/* pinned data */
prop= RNA_def_property(srna, "pin_id", PROP_POINTER, PROP_NONE);
@@ -1306,7 +1433,7 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, NULL, "rna_SpaceImageEditor_image_set", NULL, NULL);
RNA_def_property_ui_text(prop, "Image", "Image displayed and edited in this space");
RNA_def_property_flag(prop, PROP_EDITABLE);
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
+ RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL); // is handled in image editor too
prop= RNA_def_property(srna, "image_user", PROP_POINTER, PROP_NONE);
RNA_def_property_flag(prop, PROP_NEVER_NULL);
@@ -1571,6 +1698,17 @@ static void rna_def_space_text(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+ prop= RNA_def_property(srna, "show_margin", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_SHOW_MARGIN);
+ RNA_def_property_ui_text(prop, "Show Margin", "Show right margin");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+
+ prop= RNA_def_property(srna, "margin_column", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "margin_column");
+ RNA_def_property_range(prop, 0, 1024);
+ RNA_def_property_ui_text(prop, "Margin Column", "Column number to show right margin at");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL);
+
/* functionality options */
prop= RNA_def_property(srna, "use_overwrite", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overwrite", 1);
@@ -1613,7 +1751,7 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
{SACTCONT_DOPESHEET, "DOPESHEET", 0, "DopeSheet", ""},
{SACTCONT_ACTION, "ACTION", 0, "Action Editor", ""},
{SACTCONT_SHAPEKEY, "SHAPEKEY", 0, "ShapeKey Editor", ""},
- //{SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""}, // XXX: to be reimplemented, but not enough time before 2.53 - Aligorith, 2010Jul14
+ {SACTCONT_GPENCIL, "GPENCIL", 0, "Grease Pencil", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1652,6 +1790,11 @@ static void rna_def_space_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Sliders", "Show sliders beside F-Curve channels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+ prop= RNA_def_property(srna, "show_pose_markers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SACTION_POSEMARKERS_SHOW);
+ RNA_def_property_ui_text(prop, "Show Pose Markers", "Show markers belonging to the active action instead of Scene markers (Action and Shape Key Editors only)");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_DOPESHEET, NULL);
+
/* editing */
prop= RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SACTION_NOTRANSKEYCULL);
@@ -1745,6 +1888,11 @@ static void rna_def_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Only Selected Keyframes Handles", "Only show and edit handles of selected keyframes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+ prop= RNA_def_property(srna, "use_fancy_drawing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_BEAUTYDRAW_OFF);
+ RNA_def_property_ui_text(prop, "Use Fancy Drawing", "Draw F-Curves using Anti-Aliasing and other fancy effects. Disable for better performance");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
+
/* editing */
prop= RNA_def_property(srna, "use_auto_merge_keyframes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", SIPO_NOTRANSKEYCULL);
@@ -1849,43 +1997,7 @@ static void rna_def_space_time(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "SpaceTime");
RNA_def_struct_ui_text(srna, "Space Timeline Editor", "Timeline editor space data");
- /* Define Anim Playback Areas */
- prop= RNA_def_property(srna, "use_play_top_left_3d_editor", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_REGION);
- RNA_def_property_ui_text(prop, "Top-Left 3D Editor", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_3d_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_3D_WIN);
- RNA_def_property_ui_text(prop, "All 3D View Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_animation_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_ANIM_WIN);
- RNA_def_property_ui_text(prop, "Animation Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_properties_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_BUTS_WIN);
- RNA_def_property_ui_text(prop, "Property Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_image_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_ALL_IMAGE_WIN);
- RNA_def_property_ui_text(prop, "Image Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_sequence_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_SEQ);
- RNA_def_property_ui_text(prop, "Sequencer Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- prop= RNA_def_property(srna, "use_play_node_editors", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "redraws", TIME_NODES);
- RNA_def_property_ui_text(prop, "Node Editors", "");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, "rna_SpaceTime_redraw_update");
-
- /* Other options */
+ /* view settings */
prop= RNA_def_property(srna, "show_only_selected", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", TIME_ONLYACTSEL);
RNA_def_property_ui_text(prop, "Only Selected channels", "Show keyframes for active Object and/or its selected channels only");
@@ -1942,11 +2054,6 @@ static void rna_def_console_line(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, NULL, NULL, "rna_ConsoleLine_cursor_index_range");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
}
-
-static EnumPropertyItem console_type_items[] = {
- {CONSOLE_TYPE_PYTHON, "PYTHON", 0, "Python", ""},
- {CONSOLE_TYPE_REPORT, "REPORT", 0, "Report", ""},
- {0, NULL, 0, NULL, NULL}};
static void rna_def_space_console(BlenderRNA *brna)
{
@@ -1963,12 +2070,7 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_range(prop, 8, 32);
RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
-
- prop= RNA_def_property(srna, "console_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "type");
- RNA_def_property_enum_items(prop, console_type_items);
- RNA_def_property_ui_text(prop, "Type", "Console type");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
+
prop= RNA_def_property(srna, "select_start", PROP_INT, PROP_UNSIGNED); /* copied from text editor */
RNA_def_property_int_sdna(prop, NULL, "sel_start");
@@ -1978,32 +2080,6 @@ static void rna_def_space_console(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "sel_end");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE, NULL);
- /* reporting display */
- prop= RNA_def_property(srna, "show_report_debug", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_DEBUG);
- RNA_def_property_ui_text(prop, "Show Debug", "Display debug reporting info");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_info", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_INFO);
- RNA_def_property_ui_text(prop, "Show Info", "Display general information");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_operator", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_OP);
- RNA_def_property_ui_text(prop, "Show Operator", "Display the operator log");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_warning", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_WARN);
- RNA_def_property_ui_text(prop, "Show Warn", "Display warnings");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
- prop= RNA_def_property(srna, "show_report_error", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", CONSOLE_RPT_ERR);
- RNA_def_property_ui_text(prop, "Show Error", "Display error text");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
-
prop= RNA_def_property(srna, "prompt", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Prompt", "Command line prompt");
@@ -2126,6 +2202,11 @@ static void rna_def_fileselect_params(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Filter Folder", "Show folders");
RNA_def_property_ui_icon(prop, ICON_FILE_FOLDER, 0);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+
+ prop= RNA_def_property(srna, "filter_glob", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "filter_glob");
+ RNA_def_property_ui_text(prop, "Extension Filter", "");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
}
@@ -2141,15 +2222,46 @@ static void rna_def_space_filebrowser(BlenderRNA *brna)
prop= RNA_def_property(srna, "params", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "params");
RNA_def_property_ui_text(prop, "Filebrowser Parameter", "Parameters and Settings for the Filebrowser");
+
+ prop= RNA_def_property(srna, "operator", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "op");
+ RNA_def_property_ui_text(prop, "Operator", "");
}
static void rna_def_space_info(BlenderRNA *brna)
{
StructRNA *srna;
+ PropertyRNA *prop;
srna= RNA_def_struct(brna, "SpaceInfo", "Space");
RNA_def_struct_sdna(srna, "SpaceInfo");
RNA_def_struct_ui_text(srna, "Space Info", "Info space data");
+
+ /* reporting display */
+ prop= RNA_def_property(srna, "show_report_debug", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_DEBUG);
+ RNA_def_property_ui_text(prop, "Show Debug", "Display debug reporting info");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_info", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_INFO);
+ RNA_def_property_ui_text(prop, "Show Info", "Display general information");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_operator", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_OP);
+ RNA_def_property_ui_text(prop, "Show Operator", "Display the operator log");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_warning", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_WARN);
+ RNA_def_property_ui_text(prop, "Show Warn", "Display warnings");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
+
+ prop= RNA_def_property(srna, "show_report_error", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "rpt_mask", INFO_RPT_ERR);
+ RNA_def_property_ui_text(prop, "Show Error", "Display error text");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
}
static void rna_def_space_userpref(BlenderRNA *brna)
@@ -2183,7 +2295,13 @@ static void rna_def_space_node(BlenderRNA *brna)
{SNODE_TEX_WORLD, "WORLD", ICON_WORLD_DATA, "World", "Edit texture nodes from World"},
{SNODE_TEX_BRUSH, "BRUSH", ICON_BRUSH_DATA, "Brush", "Edit texture nodes from Brush"},
{0, NULL, 0, NULL, NULL}};
-
+
+ static EnumPropertyItem backdrop_channels_items[] = {
+ {0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
+ {SNODE_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha", "Draw image with RGB colors and alpha transparency"},
+ {SNODE_SHOW_ALPHA, "ALPHA", ICON_IMAGE_ALPHA, "Alpha", "Draw alpha transparency channel"},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "SpaceNodeEditor", "Space");
RNA_def_struct_sdna(srna, "SpaceNode");
RNA_def_struct_ui_text(srna, "Space Node Editor", "Node editor space data");
@@ -2209,7 +2327,8 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "ID From", "Datablock from which the edited datablock is linked");
- prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Node Tree", "Node tree being displayed and edited");
@@ -2217,6 +2336,35 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_BACKDRAW);
RNA_def_property_ui_text(prop, "Backdrop", "Use active Viewer Node output as backdrop for compositing nodes");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "use_auto_render", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SNODE_AUTO_RENDER);
+ RNA_def_property_ui_text(prop, "Auto Render", "Re-render and composite changed layer on 3D edits");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_zoom", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "zoom");
+ RNA_def_property_float_default(prop, 1.0f);
+ RNA_def_property_range(prop, 0.01f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 0.01, 100, 1, 2);
+ RNA_def_property_ui_text(prop, "Backdrop Zoom", "Backdrop zoom factor");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "xof");
+ RNA_def_property_ui_text(prop, "Backdrop X", "Backdrop X offset");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "yof");
+ RNA_def_property_ui_text(prop, "Backdrop Y", "Backdrop Y offset");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
+
+ prop= RNA_def_property(srna, "backdrop_channels", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
+ RNA_def_property_enum_items(prop, backdrop_channels_items);
+ RNA_def_property_ui_text(prop, "Draw Channels", "Channels of the image to draw");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE_VIEW, NULL);
}
static void rna_def_space_logic(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_test.c b/source/blender/makesrna/intern/rna_test.c
index 592d88c718a..ba5fdfcc5cf 100644
--- a/source/blender/makesrna/intern/rna_test.c
+++ b/source/blender/makesrna/intern/rna_test.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c
index 15e7ce525ba..ec71dd0f2d6 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -164,7 +164,8 @@ static void rna_def_text_marker(BlenderRNA *brna)
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Edit All", "Edit all markers of the same group as one");
- prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color", "Color to display the marker with");
}
diff --git a/source/blender/makesrna/intern/rna_text_api.c b/source/blender/makesrna/intern/rna_text_api.c
index 2534eb63f2b..9d884eaa257 100644
--- a/source/blender/makesrna/intern/rna_text_api.c
+++ b/source/blender/makesrna/intern/rna_text_api.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 567166fd15f..23a98804771 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -128,7 +128,7 @@ static void rna_Texture_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE, tex);
}
@@ -148,12 +148,13 @@ static void rna_Texture_voxeldata_image_update(Main *bmain, Scene *scene, Pointe
rna_Texture_voxeldata_update(bmain, scene, ptr);
}
+
/* Used for Texture Properties, used (also) for/in Nodes */
static void rna_Texture_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Tex *tex= ptr->id.data;
- DAG_id_flush_update(&tex->id, 0);
+ DAG_id_tag_update(&tex->id, 0);
WM_main_add_notifier(NC_TEXTURE|ND_NODES, tex);
}
@@ -168,11 +169,12 @@ void rna_TextureSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
ID *id= ptr->id.data;
- DAG_id_flush_update(id, 0);
+ DAG_id_tag_update(id, 0);
switch(GS(id->name)) {
case ID_MA:
WM_main_add_notifier(NC_MATERIAL|ND_SHADING, id);
+ WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
break;
case ID_WO:
WM_main_add_notifier(NC_WORLD, id);
@@ -183,6 +185,20 @@ void rna_TextureSlot_update(Main *bmain, Scene *scene, PointerRNA *ptr)
case ID_BR:
WM_main_add_notifier(NC_BRUSH, id);
break;
+ case ID_PA:
+ {
+ MTex *mtex= ptr->data;
+ int recalc = OB_RECALC_DATA;
+
+ if(mtex->mapto & PAMAP_INIT)
+ recalc |= PSYS_RECALC_RESET;
+ if(mtex->mapto & PAMAP_CHILD)
+ recalc |= PSYS_RECALC_CHILD;
+
+ DAG_id_tag_update(id, recalc);
+ WM_main_add_notifier(NC_OBJECT|ND_PARTICLE|NA_EDITED, NULL);
+ break;
+ }
}
}
@@ -325,9 +341,6 @@ static void rna_ImageTexture_mipmap_set(PointerRNA *ptr, int value)
if(value) tex->imaflag |= TEX_MIPMAP;
else tex->imaflag &= ~TEX_MIPMAP;
-
- if(tex->imaflag & TEX_MIPMAP)
- tex->texfilter = TXF_EWA;
}
static void rna_Envmap_source_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -363,6 +376,16 @@ static void rna_PointDensity_psys_set(PointerRNA *ptr, PointerRNA value)
pd->psys= BLI_findindex(&ob->particlesystem, value.data) + 1;
}
+static char *rna_PointDensity_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("point_density");
+}
+
+static char *rna_VoxelData_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("voxel_data");
+}
+
#else
static void rna_def_texmapping(BlenderRNA *brna)
@@ -429,8 +452,8 @@ static void rna_def_mtex(BlenderRNA *brna)
{MTEX_BLEND_SAT, "SATURATION", 0, "Saturation", ""},
{MTEX_BLEND_VAL, "VALUE", 0, "Value", ""},
{MTEX_BLEND_COLOR, "COLOR", 0, "Color", ""},
- {MTEX_SOFT_LIGHT, "SOFT LIGHT", 0, "Soft Light", ""},
- {MTEX_LIN_LIGHT , "LINEAR LIGHT", 0, "Linear Light", ""},
+ {MTEX_SOFT_LIGHT, "SOFT_LIGHT", 0, "Soft Light", ""},
+ {MTEX_LIN_LIGHT , "LINEAR_LIGHT", 0, "Linear Light", ""},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem output_node_items[] = {
@@ -473,7 +496,7 @@ static void rna_def_mtex(BlenderRNA *brna)
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "r");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Color", "The default color for textures that don't return RGB");
+ RNA_def_property_ui_text(prop, "Color", "The default color for textures that don't return RGB or when RGB to intensity is enabled");
RNA_def_property_update(prop, 0, "rna_TextureSlot_update");
prop= RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
@@ -676,8 +699,8 @@ static void rna_def_texture_clouds(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
@@ -811,8 +834,8 @@ static void rna_def_texture_marble(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -866,8 +889,8 @@ static void rna_def_texture_magic(BlenderRNA *brna)
prop= RNA_def_property(srna, "noise_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noisedepth");
- RNA_def_property_range(prop, 0, INT_MAX);
- RNA_def_property_ui_range(prop, 0, 6, 0, 2);
+ RNA_def_property_range(prop, 0, 30);
+ RNA_def_property_ui_range(prop, 0, 24, 0, 2);
RNA_def_property_ui_text(prop, "Noise Depth", "Sets the depth of the cloud calculation");
RNA_def_property_update(prop, 0, "rna_Texture_update");
}
@@ -979,13 +1002,6 @@ static void rna_def_texture_image(BlenderRNA *brna)
{TEX_REPEAT, "REPEAT", 0, "Repeat", "Causes the image to repeat horizontally and vertically"},
{TEX_CHECKER, "CHECKER", 0, "Checker", "Causes the image to repeat in checker board pattern"},
{0, NULL, 0, NULL, NULL}};
-
- static EnumPropertyItem prop_normal_space[] = {
- {MTEX_NSPACE_CAMERA, "CAMERA", 0, "Camera", ""},
- {MTEX_NSPACE_WORLD, "WORLD", 0, "World", ""},
- {MTEX_NSPACE_OBJECT, "OBJECT", 0, "Object", ""},
- {MTEX_NSPACE_TANGENT, "TANGENT", 0, "Tangent", ""},
- {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "ImageTexture", "Texture");
RNA_def_struct_ui_text(srna, "Image Texture", "");
@@ -1123,15 +1139,6 @@ static void rna_def_texture_image(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_NORMALMAP);
RNA_def_property_ui_text(prop, "Normal Map", "Uses image RGB values for normal mapping");
RNA_def_property_update(prop, 0, "rna_Texture_update");
-
- /* not sure why this goes in mtex instead of texture directly? */
- RNA_def_struct_sdna(srna, "MTex");
-
- prop= RNA_def_property(srna, "normal_space", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "normapspace");
- RNA_def_property_enum_items(prop, prop_normal_space);
- RNA_def_property_ui_text(prop, "Normal Space", "Sets space of normal map image");
- RNA_def_property_update(prop, 0, "rna_Texture_update");
}
static void rna_def_texture_plugin(BlenderRNA *brna)
@@ -1432,6 +1439,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
srna= RNA_def_struct(brna, "PointDensity", NULL);
RNA_def_struct_sdna(srna, "PointDensity");
RNA_def_struct_ui_text(srna, "PointDensity", "Point density settings");
+ RNA_def_struct_path_func(srna, "rna_PointDensity_path");
prop= RNA_def_property(srna, "point_source", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "source");
@@ -1520,7 +1528,7 @@ static void rna_def_texture_pointdensity(BlenderRNA *brna)
prop= RNA_def_property(srna, "turbulence_depth", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "noise_depth");
- RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_range(prop, 0, 30);
RNA_def_property_ui_text(prop, "Depth", "Level of detail in the added turbulent noise");
RNA_def_property_update(prop, 0, "rna_Texture_update");
@@ -1584,6 +1592,7 @@ static void rna_def_texture_voxeldata(BlenderRNA *brna)
srna= RNA_def_struct(brna, "VoxelData", NULL);
RNA_def_struct_sdna(srna, "VoxelData");
RNA_def_struct_ui_text(srna, "VoxelData", "Voxel data settings");
+ RNA_def_struct_path_func(srna, "rna_VoxelData_path");
prop= RNA_def_property(srna, "interpolation", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "interp_type");
diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c
index a436c746910..edff898b8db 100644
--- a/source/blender/makesrna/intern/rna_timeline.c
+++ b/source/blender/makesrna/intern/rna_timeline.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index f2c33f354c2..d6117c393a5 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -101,7 +101,7 @@ static int panel_poll(const bContext *C, PanelType *pt)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pt->ext.call(&ptr, func, &list);
+ pt->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -122,7 +122,7 @@ static void panel_draw(const bContext *C, Panel *pnl)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pnl->type->ext.call(&ptr, func, &list);
+ pnl->type->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -138,7 +138,7 @@ static void panel_draw_header(const bContext *C, Panel *pnl)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pnl->type->ext.call(&ptr, func, &list);
+ pnl->type->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -163,7 +163,7 @@ static void rna_Panel_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Panel_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
PanelType *pt, dummypt = {0};
@@ -180,7 +180,7 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
return NULL;
if(strlen(identifier) >= sizeof(dummypt.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering panel class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummypt.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering panel class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummypt.idname));
return NULL;
}
@@ -213,7 +213,19 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
pt->draw= (have_function[1])? panel_draw: NULL;
pt->draw_header= (have_function[2])? panel_draw_header: NULL;
- BLI_addtail(&art->paneltypes, pt);
+ /* XXX use "no header" flag for some ordering of panels until we have real panel ordering */
+ if(pt->flag & PNL_NO_HEADER) {
+ PanelType *pth = art->paneltypes.first;
+ while(pth && pth->flag & PNL_NO_HEADER)
+ pth=pth->next;
+
+ if(pth)
+ BLI_insertlinkbefore(&art->paneltypes, pth, pt);
+ else
+ BLI_addtail(&art->paneltypes, pt);
+ }
+ else
+ BLI_addtail(&art->paneltypes, pt);
/* update while blender is running */
if(C)
@@ -241,7 +253,7 @@ static void header_draw(const bContext *C, Header *hdr)
RNA_parameter_list_create(&list, &htr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- hdr->type->ext.call(&htr, func, &list);
+ hdr->type->ext.call((bContext *)C, &htr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -266,7 +278,7 @@ static void rna_Header_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Header_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
HeaderType *ht, dummyht = {0};
@@ -283,7 +295,7 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
return NULL;
if(strlen(identifier) >= sizeof(dummyht.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering header class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyht.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering header class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyht.idname));
return NULL;
}
@@ -341,7 +353,7 @@ static int menu_poll(const bContext *C, MenuType *pt)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- pt->ext.call(&ptr, func, &list);
+ pt->ext.call((bContext *)C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -362,7 +374,7 @@ static void menu_draw(const bContext *C, Menu *hdr)
RNA_parameter_list_create(&list, &mtr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- hdr->type->ext.call(&mtr, func, &list);
+ hdr->type->ext.call((bContext *)C, &mtr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -385,7 +397,7 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type)
WM_main_add_notifier(NC_SCREEN|NA_EDITED, NULL);
}
-static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Menu_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
MenuType *mt, dummymt = {0};
Menu dummymenu= {0};
@@ -401,7 +413,7 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
return NULL;
if(strlen(identifier) >= sizeof(dummymt.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummymt.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering menu class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummymt.idname));
return NULL;
}
@@ -449,6 +461,16 @@ static void rna_UILayout_active_set(PointerRNA *ptr, int value)
uiLayoutSetActive(ptr->data, value);
}
+static int rna_UILayout_alert_get(PointerRNA *ptr)
+{
+ return uiLayoutGetRedAlert(ptr->data);
+}
+
+static void rna_UILayout_alert_set(PointerRNA *ptr, int value)
+{
+ uiLayoutSetRedAlert(ptr->data, value);
+}
+
static void rna_UILayout_op_context_set(PointerRNA *ptr, int value)
{
uiLayoutSetOperatorContext(ptr->data, value);
@@ -552,10 +574,8 @@ static void rna_def_ui_layout(BlenderRNA *brna)
RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
RNA_def_property_ui_text(prop, "Enabled", "When false, this (sub)layout is greyed out.");
-#if 0
- prop= RNA_def_property(srna, "red_alert", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_UILayout_red_alert_get", "rna_UILayout_red_alert_set");
-#endif
+ prop= RNA_def_property(srna, "alert", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_UILayout_alert_get", "rna_UILayout_alert_set");
prop= RNA_def_property(srna, "alignment", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, alignment_items);
@@ -600,20 +620,20 @@ static void rna_def_panel(BlenderRNA *brna)
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
parm= RNA_def_pointer(func, "context", "Context", "", "");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* draw */
func= RNA_def_function(srna, "draw", NULL);
RNA_def_function_ui_description(func, "Draw UI elements into the panel UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
func= RNA_def_function(srna, "draw_header", NULL);
RNA_def_function_ui_description(func, "Draw UI elements into the panel's header UI layout.");
RNA_def_function_flag(func, FUNC_REGISTER);
parm= RNA_def_pointer(func, "context", "Context", "", "");
- RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "UILayout");
@@ -626,7 +646,7 @@ static void rna_def_panel(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_PT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_PT_hello\"");
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -688,7 +708,7 @@ static void rna_def_header(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_HT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_HT_hello\"");
prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
@@ -738,7 +758,7 @@ static void rna_def_menu(BlenderRNA *brna)
/* registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_property_ui_text(prop, "ID Name", "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_MT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_MT_hello\"");
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 973de2ae92b..d7ff6af9bb2 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,7 +35,7 @@
#ifdef RNA_RUNTIME
-static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char *name, int icon, int expand, int slider, int toggle, int icon_only, int event, int full_event, int emboss, int index)
+static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, const char *name, int icon, int expand, int slider, int toggle, int icon_only, int event, int full_event, int emboss, int index)
{
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
int flag= 0;
@@ -56,7 +56,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, char *propname, char
uiItemFullR(layout, ptr, prop, index, 0, flag, name, icon);
}
-static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int icon, int emboss)
+static PointerRNA rna_uiItemO(uiLayout *layout, const char *opname, const char *name, int icon, int emboss)
{
int flag= UI_ITEM_O_RETURN_PROPS;
flag |= (emboss)? 0: UI_ITEM_R_NO_BG;
@@ -65,11 +65,15 @@ static PointerRNA rna_uiItemO(uiLayout *layout, char *opname, char *name, int ic
#else
-#define DEF_ICON(name) {name, (#name)+5, 0, (#name)+5, ""},
+#define DEF_ICON_BLANK_SKIP
+#define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
+#define DEF_VICO(name) {VICO_##name, (#name), 0, (#name), ""},
static EnumPropertyItem icon_items[] = {
#include "UI_icons.h"
{0, NULL, 0, NULL, NULL}};
+#undef DEF_ICON_BLANK_SKIP
#undef DEF_ICON
+#undef DEF_VICO
static void api_ui_item_common(FunctionRNA *func)
{
@@ -137,7 +141,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
func= RNA_def_function(srna, "column_flow", "uiLayoutColumnFlow");
- parm= RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic.", 0, INT_MAX);
+ RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic.", 0, INT_MAX);
parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in.");
RNA_def_function_return(func, parm);
RNA_def_boolean(func, "align", 0, "", "Align buttons to each other.");
@@ -198,14 +202,14 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_return(func, parm);
RNA_def_function_ui_description(func, "Item. Places a button into the layout to call an Operator.");
-/* func= RNA_def_function(srna, "operator_enum", "uiItemEnumO_string");
+/* func= RNA_def_function(srna, "operator_enum_single", "uiItemEnumO_string");
api_ui_item_op_common(func);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "value", "", 0, "", "Enum property value.");
RNA_def_property_flag(parm, PROP_REQUIRED); */
- func= RNA_def_function(srna, "operator_enums", "uiItemsEnumO");
+ func= RNA_def_function(srna, "operator_enum", "uiItemsEnumO");
parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator.");
@@ -287,24 +291,22 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_int(func, "cols", 0, 0, INT_MAX, "Number of thumbnail preview columns to display", "", 0, INT_MAX);
func= RNA_def_function(srna, "template_any_ID", "uiTemplateAnyID");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "type_property", "", 0, "", "Identifier of property in data giving the type of the ID-blocks to use.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
+ RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
func= RNA_def_function(srna, "template_path_builder", "uiTemplatePathBuilder");
- RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in data.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "root", "ID", "", "ID-block from which path is evaluated from.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
- parm= RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
+ RNA_def_string(func, "text", "", 0, "", "Custom label to display in UI.");
func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
@@ -325,6 +327,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_function_ui_description(func, "Item. A preview window for materials, textures, lamps, etc.");
parm= RNA_def_pointer(func, "id", "ID", "", "ID datablock.");
RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_boolean(func, "show_buttons", 1, "", "Show preview buttons?");
RNA_def_pointer(func, "parent", "ID", "", "ID datablock.");
RNA_def_pointer(func, "slot", "TextureSlot", "", "Texture slot.");
@@ -343,17 +346,14 @@ void RNA_api_ui_layout(StructRNA *srna)
func= RNA_def_function(srna, "template_histogram", "uiTemplateHistogram");
RNA_def_function_ui_description(func, "Item. A histogramm widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_waveform", "uiTemplateWaveform");
RNA_def_function_ui_description(func, "Item. A waveform widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_vectorscope", "uiTemplateVectorscope");
RNA_def_function_ui_description(func, "Item. A vectorscope widget to analyze imaga data.");
api_ui_item_rna_common(func);
- RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
func= RNA_def_function(srna, "template_layers", "uiTemplateLayers");
api_ui_item_rna_common(func);
@@ -371,7 +371,7 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_boolean(func, "lock", 0, "", "Lock the color wheel display to value 1.0 regardless of actual color");
RNA_def_boolean(func, "lock_luminosity", 0, "", "Keep the color at its original vector length");
RNA_def_boolean(func, "cubic", 1, "", "Cubic saturation for picking values close to white");
-
+
func= RNA_def_function(srna, "template_image_layers", "uiTemplateImageLayers");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "image", "Image", "", "");
@@ -398,14 +398,14 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
parm= RNA_def_string(func, "active_property", "", 0, "", "Identifier of property in data, for the active element.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
- parm= RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Maximum number of rows to display.", 0, INT_MAX);
- parm= RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
+ RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
+ RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Maximum number of rows to display.", 0, INT_MAX);
+ RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
func= RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
- func= RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
+ RNA_def_function(srna, "template_operator_search", "uiTemplateOperatorSearch");
func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 1e6d656d7ce..1376786469a 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,22 +33,28 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_brush_types.h"
+#include "DNA_view3d_types.h"
#include "WM_api.h"
#include "WM_types.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "BKE_sound.h"
#ifdef RNA_RUNTIME
-#include "BKE_main.h"
+#include "DNA_object_types.h"
+#include "DNA_screen_types.h"
+
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
-#include "DNA_object_types.h"
-#include "GPU_draw.h"
#include "BKE_global.h"
+#include "BKE_main.h"
+
+#include "GPU_draw.h"
+
+#include "BLF_api.h"
#include "MEM_guardedalloc.h"
#include "MEM_CacheLimiterC-Api.h"
@@ -58,6 +64,34 @@ static void rna_userdef_update(Main *bmain, Scene *scene, PointerRNA *ptr)
WM_main_add_notifier(NC_WINDOW, NULL);
}
+static void rna_userdef_show_manipulator_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ UserDef *userdef = (UserDef *)ptr->data;
+
+ /* lame, loop over all views and set */
+ bScreen *sc;
+ ScrArea *sa;
+ SpaceLink *sl;
+
+ /* from scene copy to the other views */
+ for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ for(sl=sa->spacedata.first; sl; sl=sl->next) {
+ if(sl->spacetype==SPACE_VIEW3D) {
+ View3D *v3d= (View3D *)sl;
+ if(userdef->tw_flag & V3D_USE_MANIPULATOR)
+ v3d->twflag |= V3D_USE_MANIPULATOR;
+ else
+ v3d->twflag &= ~V3D_USE_MANIPULATOR;
+ }
+ }
+ }
+ }
+
+ rna_userdef_update(bmain, scene, ptr);
+}
+
+
static void rna_userdef_script_autoexec_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
UserDef *userdef = (UserDef*)ptr->data;
@@ -185,7 +219,7 @@ static void rna_UserDef_weight_color_update(Main *bmain, Scene *scene, PointerRN
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->mode & OB_MODE_WEIGHT_PAINT)
- DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
}
rna_userdef_update(bmain, scene, ptr);
@@ -221,8 +255,13 @@ static void rna_userdef_addon_remove(bAddon *bext)
static void rna_userdef_temp_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
extern char btempdir[];
- UserDef *userdef = (UserDef*)ptr->data;
- strncpy(btempdir, userdef->tempdir, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_where_is_temp(btempdir, FILE_MAX, 1);
+}
+
+static void rna_userdef_text_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ BLF_cache_clear();
+ WM_main_add_notifier(NC_WINDOW, NULL);
}
#else
@@ -334,32 +373,32 @@ static void rna_def_userdef_theme_ui_wcol(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "uiWidgetColors");
RNA_def_struct_ui_text(srna, "Theme Widget Color Set", "Theme settings for widget color sets");
- prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "outline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Outline", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Inner Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "item", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "item", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Item", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -389,32 +428,32 @@ static void rna_def_userdef_theme_ui_wcol_state(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "uiWidgetStateColors");
RNA_def_struct_ui_text(srna, "Theme Widget State Color", "Theme settings for widget state colors");
- prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_anim", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Animated", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_anim_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_anim_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Animated Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_key", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_key", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_key_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_key_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_driven", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_driven", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Driven", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "inner_driven_sel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "inner_driven_sel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Driven Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -566,60 +605,60 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
PropertyRNA *prop;
/* window */
- prop= RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "back", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Title", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* header */
- prop= RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "header_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "header_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "header_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Header Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
/* buttons */
// if(! ELEM(spacetype, SPACE_BUTS, SPACE_OUTLINER)) {
- prop= RNA_def_property(srna, "button", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text Titles", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "button_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "button_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Region Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -627,22 +666,22 @@ static void rna_def_userdef_theme_spaces_main(StructRNA *srna, int spacetype)
/* list/channels */
if(ELEM5(spacetype, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_NODE, SPACE_FILE)) {
- prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_title", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_title", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Title", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "list_text_hi", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "list_text_hi", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Source List Text Highlight", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -653,12 +692,12 @@ static void rna_def_userdef_theme_spaces_vertex(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "vertex", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "vertex_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -673,27 +712,27 @@ static void rna_def_userdef_theme_spaces_edge(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_seam", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Seam", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_sharp", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_sharp", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Sharp", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_crease", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_crease", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge Crease", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "edge_facesel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Edge UV Face Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -703,17 +742,17 @@ static void rna_def_userdef_theme_spaces_face(StructRNA *srna)
{
PropertyRNA *prop;
- prop= RNA_def_property(srna, "face", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Face Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "face_dot", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Face Dot Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -729,86 +768,86 @@ static void rna_def_userdef_theme_spaces_curves(StructRNA *srna, short incl_nurb
PropertyRNA *prop;
if (incl_nurbs) {
- prop= RNA_def_property(srna, "nurb_uline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_uline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_uline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb U-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_vline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_vline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_vline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb V-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_sel_uline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_sel_uline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_sel_uline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb active U-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "nurb_sel_vline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "nurb_sel_vline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "nurb_sel_vline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Nurb active V-lines", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "act_spline", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "act_spline", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "act_spline");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active spline", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
}
- prop= RNA_def_property(srna, "handle_free", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_free", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_free");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Free handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_auto", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_auto", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_auto");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Auto handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vect", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vect", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_vect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vector handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_align", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_align", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_align");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Align handle color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_free", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_free", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_free");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Free handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_auto", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_auto", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_auto");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Auto handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_vect", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_vect", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_vect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vector handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_sel_align", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_sel_align", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "handle_sel_align");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Align handle selected color", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "lastsel_point", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "lastsel_point", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "lastsel_point");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Last selected point", "");
@@ -828,51 +867,51 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_VIEW3D);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "lamp", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Lamp", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Object", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_grouped", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Grouped", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "object_grouped_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Object Grouped Active", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "transform", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "transform", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Transform", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -882,38 +921,53 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
rna_def_userdef_theme_spaces_face(srna);
rna_def_userdef_theme_spaces_curves(srna, 1);
- prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "extra_edge_len", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Edge Length Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "extra_face_angle", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Face Angle Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "extra_face_area", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Face Area Text", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Face Normal", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "vertex_normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "vertex_normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Vertex Normal", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bone_solid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bone_solid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Solid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bone_pose", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bone_pose", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bone Pose", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "pin", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "pin", PROP_INT, PROP_COLOR);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Pin", "");
RNA_def_property_update(prop, NC_WINDOW, NULL);
@@ -937,23 +991,23 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_IPO);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels_region", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels_region", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels Region", "");
@@ -962,18 +1016,18 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_curves(srna, 0);
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vertex", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "handle_vertex_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Handle Vertex Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -983,25 +1037,25 @@ static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Handle Vertex Size", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_channel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
@@ -1021,37 +1075,37 @@ static void rna_def_userdef_theme_space_file(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_FILE);
- prop= RNA_def_property(srna, "selected_file", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_file", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected File", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "tiles", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "tiles", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "panel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Tiles", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scrollbar", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scrollbar", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scrollbar", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scroll_handle", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scroll_handle", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scroll Handle", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_file", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_file", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active File", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_file_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_file_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "grid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active File Text", "");
@@ -1097,31 +1151,31 @@ static void rna_def_userdef_theme_space_console(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_CONSOLE);
- prop= RNA_def_property(srna, "line_output", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_output", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_output");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Output", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_input", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_input", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_input");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Input", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_info", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_info", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_info");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Info", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "line_error", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_error", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_error");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Error", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "console_cursor");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Cursor", "");
@@ -1155,55 +1209,55 @@ static void rna_def_userdef_theme_space_text(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_TEXT);
- prop= RNA_def_property(srna, "line_numbers_background", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "line_numbers_background", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "grid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Line Numbers Background", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scroll_bar", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scroll_bar", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scroll Bar", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "cursor", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Cursor", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_builtin", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxb");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Built-in", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_special", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxv");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Special", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_comment", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_comment", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxc");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Comment", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_string", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_string", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxl");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax String", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "syntax_numbers", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "syntax_numbers", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxn");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Syntax Numbers", "");
@@ -1223,49 +1277,49 @@ static void rna_def_userdef_theme_space_node(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_NODE);
- prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "wire");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wires", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "wire_select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "wire_select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "edge_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Wire Select", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "selected_text", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Selected Text", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "node_backdrop", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "node_backdrop", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxl");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Node Backdrop", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "in_out_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "in_out_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxn");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "In/Out Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "converter_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "converter_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxv");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Converter Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "operator_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "operator_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxb");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Operator Node", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "group_node", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "group_node", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "syntaxc");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Group Node", "");
@@ -1285,7 +1339,7 @@ static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_LOGIC);
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1305,7 +1359,7 @@ static void rna_def_userdef_theme_space_buts(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_BUTS);
- prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "panel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Panel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1324,12 +1378,12 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_TIME);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1349,18 +1403,18 @@ static void rna_def_userdef_theme_space_sound(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_SOUND);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1382,12 +1436,12 @@ static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
rna_def_userdef_theme_spaces_vertex(srna);
rna_def_userdef_theme_spaces_face(srna);
- prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "editmesh_active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Active Vert/Edge/Face", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scope_back", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scope_back", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "preview_back");
RNA_def_property_array(prop, 4);
RNA_def_property_ui_text(prop, "Scope region background color", "");
@@ -1407,78 +1461,78 @@ static void rna_def_userdef_theme_space_seq(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_IMAGE);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Window Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "movie_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "movie_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "movie");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Movie Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "image_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "image_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "image");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Image Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "scene_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "scene_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "scene");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Scene Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "audio_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "audio_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "audio");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Audio Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "effect_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "effect_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "effect");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Effect Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "plugin_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "plugin_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "plugin");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Plugin Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "transition_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "transition_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "transition");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Transition Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "meta_strip", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "meta_strip", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "meta");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Meta Strip", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "keyframe", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "keyframe", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "vertex_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Keyframe", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "draw_action", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "draw_action", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "bone_pose");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Draw Action", "");
@@ -1498,72 +1552,72 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_ACTION);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "value_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "value_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "face");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Value Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "View Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channels_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channels Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "channel_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active_channels_group", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "group_active");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active Channel Group", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "long_key", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Long Key", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "long_key_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Long Key Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_channel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_channel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Channel", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "dopesheet_subchannel", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "ds_subchannel");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "DopeSheet Sub-Channel", "");
@@ -1583,42 +1637,42 @@ static void rna_def_userdef_theme_space_nla(BlenderRNA *brna)
rna_def_userdef_theme_spaces_main(srna, SPACE_NLA);
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Grid", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "view_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade1");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "View Sliders", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bars", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bars", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "shade2");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bars", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "bars_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "bars_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "hilite");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Bars Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "strips", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Strips", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "strips_selected", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "strip_select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Strips Selected", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "cframe");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Current Frame", "");
@@ -1634,19 +1688,19 @@ static void rna_def_userdef_theme_colorset(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "ThemeWireColor");
RNA_def_struct_ui_text(srna, "Theme Bone Color Set", "Theme settings for bone color sets");
- prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "solid");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Normal", "Color used for the surface of bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "select", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "select", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "select");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Select", "Color used for selected bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
- prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "active", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Active", "Color used for active bones");
RNA_def_property_update(prop, 0, "rna_userdef_update");
@@ -1664,6 +1718,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
static EnumPropertyItem active_theme_area[] = {
{0, "USER_INTERFACE", ICON_UI, "User Interface", ""},
+ {18, "COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
{1, "VIEW_3D", ICON_VIEW3D, "3D View", ""},
{2, "TIMELINE", ICON_TIME, "Timeline", ""},
{3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""},
@@ -1679,7 +1734,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
{14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""},
{15, "INFO", ICON_INFO, "Info", ""},
{16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""},
- {17, "CONSOLE", ICON_CONSOLE, "Console", ""},
+ {17, "CONSOLE", ICON_CONSOLE, "Python Console", ""},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Theme", NULL);
@@ -1904,6 +1959,10 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TOOLTIPS);
RNA_def_property_ui_text(prop, "Tooltips", "Display tooltips");
+ prop= RNA_def_property(srna, "show_tooltips_python", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", USER_TOOLTIPS_PYTHON);
+ RNA_def_property_ui_text(prop, "Show Python Tooltips", "Show Python references in tooltips");
+
prop= RNA_def_property(srna, "show_object_info", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_DRAWVIEWINFO);
RNA_def_property_ui_text(prop, "Display Object Info", "Display objects name and frame number in 3D view");
@@ -2019,9 +2078,9 @@ static void rna_def_userdef_view(BlenderRNA *brna)
/* 3D transform widget */
prop= RNA_def_property(srna, "show_manipulator", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", 1);
+ RNA_def_property_boolean_sdna(prop, NULL, "tw_flag", V3D_USE_MANIPULATOR);
RNA_def_property_ui_text(prop, "Manipulator", "Use 3D transform manipulator");
- RNA_def_property_update(prop, 0, "rna_userdef_update");
+ RNA_def_property_update(prop, 0, "rna_userdef_show_manipulator_update");
prop= RNA_def_property(srna, "manipulator_size", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tw_size");
@@ -2105,7 +2164,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_drag_immediately", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELEASECONFIRM);
- RNA_def_property_ui_text(prop, "Release confirm", "Moving things with a mouse drag confirms when releasing the button");
+ RNA_def_property_ui_text(prop, "Release confirms", "Moving things with a mouse drag confirms when releasing the button");
/* Undo */
prop= RNA_def_property(srna, "undo_steps", PROP_INT, PROP_NONE);
@@ -2137,10 +2196,6 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTAVAIL);
RNA_def_property_ui_text(prop, "Auto Keyframe Insert Available", "Automatic keyframe insertion in available curves");
- prop= RNA_def_property(srna, "use_keyframe_insert_keyingset", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_ONLYKEYINGSET);
- RNA_def_property_ui_text(prop, "Auto Keyframe Insert Keying Set", "Automatic keyframe insertion using active Keying Set");
-
/* keyframing settings */
prop= RNA_def_property(srna, "use_keyframe_insert_needed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "autokey_flag", AUTOKEY_FLAG_INSERTNEEDED);
@@ -2195,7 +2250,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
/* sculpt and paint */
- prop= RNA_def_property(srna, "sculpt_paint_overlay_color", PROP_FLOAT, PROP_COLOR);
+ prop= RNA_def_property(srna, "sculpt_paint_overlay_color", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "sculpt_paint_overlay_col");
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Sculpt/Paint Overlay Color", "Color of texture overlay");
@@ -2552,6 +2607,11 @@ static void rna_def_userdef_system(BlenderRNA *brna)
RNA_def_property_range(prop, 50, 1000);
RNA_def_property_ui_text(prop, "Wait Timer (ms)", "Time in milliseconds between each frame recorded for screencast");
+ prop= RNA_def_property(srna, "use_text_antialiasing", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "text_render", USER_TEXT_DISABLE_AA);
+ RNA_def_property_ui_text(prop, "Text Anti-aliasing", "Draw user interface text anti-aliased");
+ RNA_def_property_update(prop, 0, "rna_userdef_text_update");
+
#if 0
prop= RNA_def_property(srna, "verse_master", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "versemaster");
@@ -2623,6 +2683,12 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_CONTINUOUS_MOUSE);
RNA_def_property_ui_text(prop, "Continuous Grab", "Allow moving the mouse outside the view on some manipulations (transform, ui control drag)");
+ /* tweak tablet & mouse preset */
+ prop= RNA_def_property(srna, "drag_threshold", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "dragthreshold");
+ RNA_def_property_range(prop, 3, 40);
+ RNA_def_property_ui_text(prop, "Drag Threshold", "Amount of pixels you have to drag before dragging UI items happens");
+
prop= RNA_def_property(srna, "ndof_pan_speed", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ndof_pan");
RNA_def_property_range(prop, 0, 200);
@@ -2665,6 +2731,10 @@ static void rna_def_userdef_input(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "keymaps", NULL);
RNA_def_property_struct_type(prop, "KeyMap");
RNA_def_property_ui_text(prop, "Edited Keymaps", "");
+
+ prop= RNA_def_property(srna, "active_keyconfig", PROP_STRING, PROP_DIRPATH);
+ RNA_def_property_string_sdna(prop, NULL, "keyconfigstr");
+ RNA_def_property_ui_text(prop, "Key Config", "The name of the active key configuration");
}
static void rna_def_userdef_filepaths(BlenderRNA *brna)
@@ -2695,10 +2765,18 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_FILTERFILEEXTS);
RNA_def_property_ui_text(prop, "Filter File Extensions", "Display only files with extensions in the image select window");
+ prop= RNA_def_property(srna, "hide_recent_locations", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_HIDE_RECENT);
+ RNA_def_property_ui_text(prop, "Hide Recent Locations", "Hide recent locations in the file selector");
+
+ prop= RNA_def_property(srna, "show_thumbnails", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_SHOW_THUMBNAILS);
+ RNA_def_property_ui_text(prop, "Show Thumbnails", "Open in thumbnail view for images and movies");
+
prop= RNA_def_property(srna, "use_relative_paths", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_RELPATHS);
RNA_def_property_ui_text(prop, "Relative Paths", "Default relative path option for the file selector");
-
+
prop= RNA_def_property(srna, "use_file_compression", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_FILECOMPRESS);
RNA_def_property_ui_text(prop, "Compress File", "Enable file compression when saving .blend files");
@@ -2725,7 +2803,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "render_output_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "renderdir");
- RNA_def_property_ui_text(prop, "Render Output Directory", "The default directory for rendering output");
+ RNA_def_property_ui_text(prop, "Render Output Directory", "The default directory for rendering output, for new scenes");
prop= RNA_def_property(srna, "script_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "pythondir");
@@ -2740,11 +2818,11 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Temporary Directory", "The directory for storing temporary save files");
RNA_def_property_update(prop, 0, "rna_userdef_temp_update");
- prop= RNA_def_property(srna, "image_editor", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "image_editor", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "image_editor");
RNA_def_property_ui_text(prop, "Image Editor", "Path to an image editor");
- prop= RNA_def_property(srna, "animation_player", PROP_STRING, PROP_DIRPATH);
+ prop= RNA_def_property(srna, "animation_player", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_sdna(prop, NULL, "anim_player");
RNA_def_property_ui_text(prop, "Animation Player", "Path to a custom animation/frame sequence player");
@@ -2763,7 +2841,7 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_auto_save_temporary_files", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_AUTOSAVE);
- RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files");
+ RNA_def_property_ui_text(prop, "Auto Save Temporary Files", "Automatic saving of temporary files in temp directory, uses process ID");
RNA_def_property_update(prop, 0, "rna_userdef_autosave_update");
prop= RNA_def_property(srna, "auto_save_time", PROP_INT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_vfont.c b/source/blender/makesrna/intern/rna_vfont.c
index 41387e806b9..f6b39f648c4 100644
--- a/source/blender/makesrna/intern/rna_vfont.c
+++ b/source/blender/makesrna/intern/rna_vfont.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 1cfc80a1730..54d1b1a55b4 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -101,7 +101,7 @@ EnumPropertyItem event_timer_type_items[]= {
{TIMER2, "TIMER2", 0, "Timer 2", ""},
{0, NULL, 0, NULL, NULL}};
-/* not returned: CAPSLOCKKEY, UNKNOWNKEY, GRLESSKEY */
+/* not returned: CAPSLOCKKEY, UNKNOWNKEY */
EnumPropertyItem event_type_items[] = {
{0, "NONE", 0, "", ""},
@@ -175,8 +175,8 @@ EnumPropertyItem event_type_items[] = {
{RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Right Ctrl", ""},
{RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Right Shift", ""},
{0, "", 0, NULL, NULL},
- {COMMANDKEY, "COMMAND", 0, "Command", ""},
- {0, "", 0, NULL, NULL},
+ {OSKEY, "OSKEY", 0, "OS Key", ""},
+ {GRLESSKEY, "GRLESS", 0, "Grless", ""},
{ESCKEY, "ESC", 0, "Esc", ""},
{TABKEY, "TAB", 0, "Tab", ""},
{RETKEY, "RET", 0, "Return", ""},
@@ -241,6 +241,11 @@ EnumPropertyItem event_type_items[] = {
{PAGEDOWNKEY, "PAGE_DOWN", 0, "Page Down", ""},
{ENDKEY, "END", 0, "End", ""},
{0, "", 0, NULL, NULL},
+ {MEDIAPLAY, "MEDIA_PLAY", 0, "Media Play/Pause", ""},
+ {MEDIASTOP, "MEDIA_STOP", 0, "Media Stop", ""},
+ {MEDIAFIRST, "MEDIA_FIRST", 0, "Media First", ""},
+ {MEDIALAST, "MEDIA_LAST", 0, "Media Last", ""},
+ {0, "", 0, NULL, NULL},
{WINDEACTIVATE, "WINDOW_DEACTIVATE", 0, "Window Deactivate", ""},
{TIMER, "TIMER", 0, "Timer", ""},
{TIMER0, "TIMER0", 0, "Timer 0", ""},
@@ -265,6 +270,7 @@ EnumPropertyItem operator_flag_items[] = {
{OPTYPE_BLOCKING, "BLOCKING", 0, "Finished", ""},
{OPTYPE_MACRO, "MACRO", 0, "Macro", ""},
{OPTYPE_GRAB_POINTER, "GRAB_POINTER", 0, "Grab Pointer", ""},
+ {OPTYPE_PRESET, "PRESET", 0, "Preset", ""},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem operator_return_items[] = {
@@ -294,6 +300,8 @@ EnumPropertyItem wm_report_items[] = {
#ifdef RNA_RUNTIME
+#include <assert.h>
+
#include "WM_api.h"
#include "BKE_idprop.h"
@@ -588,7 +596,7 @@ static void rna_wmKeyMapItem_idname_set(PointerRNA *ptr, const char *value)
if(strcmp(idname, kmi->idname) != 0) {
BLI_strncpy(kmi->idname, idname, sizeof(kmi->idname));
- WM_keymap_properties_reset(kmi);
+ WM_keymap_properties_reset(kmi, NULL);
}
}
@@ -612,24 +620,40 @@ static int rna_wmKeyMapItem_name_length(PointerRNA *ptr)
return 0;
}
+static int rna_KeyMapItem_userdefined_get(PointerRNA *ptr)
+{
+ wmKeyMapItem *kmi= ptr->data;
+ return kmi->id < 0;
+}
+
static void rna_wmClipboard_get(PointerRNA *ptr, char *value)
{
char *pbuf;
pbuf= WM_clipboard_text_get(FALSE);
- strcpy(value, pbuf);
-
- MEM_freeN(pbuf);
+ if(pbuf) {
+ strcpy(value, pbuf);
+ MEM_freeN(pbuf);
+ }
+ else {
+ value[0]= '\0';
+ }
}
static int rna_wmClipboard_length(PointerRNA *ptr)
{
- char *clipboard;
+ char *pbuf;
int length;
- clipboard = WM_clipboard_text_get(FALSE);
- length = (clipboard?strlen(clipboard):0);
- MEM_freeN(clipboard);
+ pbuf = WM_clipboard_text_get(FALSE);
+ if(pbuf) {
+ length = strlen(pbuf);
+ MEM_freeN(pbuf);
+ }
+ else {
+ length= 0;
+ }
+
return length;
}
@@ -639,10 +663,10 @@ static void rna_wmClipboard_set(PointerRNA *ptr, const char *value)
WM_clipboard_text_set((void *) value, FALSE);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static void rna_Operator_unregister(const bContext *C, StructRNA *type)
{
- char *idname;
+ const char *idname;
wmOperatorType *ot= RNA_struct_blender_type_get(type);
if(!ot)
@@ -658,7 +682,7 @@ static void rna_Operator_unregister(const bContext *C, StructRNA *type)
idname= ot->idname;
WM_operatortype_remove(ot->idname);
- MEM_freeN(idname);
+ MEM_freeN((void *)idname);
/* not to be confused with the RNA_struct_free that WM_operatortype_remove calls, they are 2 different srna's */
RNA_struct_free(&BLENDER_RNA, type);
@@ -677,7 +701,7 @@ static int operator_poll(bContext *C, wmOperatorType *ot)
RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- ot->ext.call(&ptr, func, &list);
+ ot->ext.call(C, &ptr, func, &list);
RNA_parameter_get_lookup(&list, "visible", &ret);
visible= *(int*)ret;
@@ -687,7 +711,7 @@ static int operator_poll(bContext *C, wmOperatorType *ot)
return visible;
}
-static int operator_exec(bContext *C, wmOperator *op)
+static int operator_execute(bContext *C, wmOperator *op)
{
PointerRNA opr;
ParameterList list;
@@ -700,7 +724,31 @@ static int operator_exec(bContext *C, wmOperator *op)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
+
+ RNA_parameter_get_lookup(&list, "result", &ret);
+ result= *(int*)ret;
+
+ RNA_parameter_list_free(&list);
+
+ return result;
+}
+
+/* same as execute() but no return value */
+static int operator_check(bContext *C, wmOperator *op)
+{
+ PointerRNA opr;
+ ParameterList list;
+ FunctionRNA *func;
+ void *ret;
+ int result;
+
+ RNA_pointer_create(&CTX_wm_screen(C)->id, op->type->ext.srna, op, &opr);
+ func= RNA_struct_find_function(&opr, "check");
+
+ RNA_parameter_list_create(&list, &opr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -724,7 +772,7 @@ static int operator_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "event", &event);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -749,7 +797,7 @@ static int operator_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "event", &event);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_get_lookup(&list, "result", &ret);
result= *(int*)ret;
@@ -770,7 +818,7 @@ static void operator_draw(bContext *C, wmOperator *op)
RNA_parameter_list_create(&list, &opr, func);
RNA_parameter_set_lookup(&list, "context", &C);
- op->type->ext.call(&opr, func, &list);
+ op->type->ext.call(C, &opr, func, &list);
RNA_parameter_list_free(&list);
}
@@ -781,12 +829,12 @@ void macro_wrapper(wmOperatorType *ot, void *userdata);
static char _operator_idname[OP_MAX_TYPENAME];
static char _operator_name[OP_MAX_TYPENAME];
static char _operator_descr[1024];
-static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
wmOperatorType dummyot = {0};
wmOperator dummyop= {0};
PointerRNA dummyotr;
- int have_function[5];
+ int have_function[6];
/* setup dummy operator & operator type to store static properties in */
dummyop.type= &dummyot;
@@ -795,30 +843,63 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
dummyot.description= _operator_descr; /* only assigne the pointer, string is NULL'd */
RNA_pointer_create(NULL, &RNA_Operator, &dummyop, &dummyotr);
+ /* clear incase they are left unset */
+ _operator_idname[0]= _operator_name[0]= _operator_descr[0]= '\0';
+
/* validate the python class */
if(validate(&dummyotr, data, have_function) != 0)
return NULL;
{ /* convert foo.bar to FOO_OT_bar
* allocate the description and the idname in 1 go */
- int idlen = strlen(_operator_idname) + 4;
- int namelen = strlen(_operator_name) + 1;
- int desclen = strlen(_operator_descr) + 1;
- char *ch, *ch_arr;
- ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
- WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
- dummyot.idname= ch;
- ch += idlen;
- strcpy(ch, _operator_name);
- dummyot.name = ch;
- ch += namelen;
- strcpy(ch, _operator_descr);
- dummyot.description = ch;
- }
- if(strlen(identifier) >= sizeof(dummyop.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyop.idname));
- return NULL;
+ /* inconveniently long name sanity check */
+ {
+ char *ch= _operator_idname;
+ int i;
+ int dot= 0;
+ for(i=0; *ch; i++) {
+ if((*ch >= 'a' && *ch <= 'z') || (*ch >= '0' && *ch <= '9') || *ch == '_') {
+ /* pass */
+ }
+ else if(*ch == '.') {
+ dot++;
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', at position %d", identifier, _operator_idname, i);
+ return NULL;
+ }
+
+ ch++;
+ }
+
+ if(i > ((int)sizeof(dummyop.idname)) - 3) {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', is too long, maximum length is %d.", identifier, _operator_idname, (int)sizeof(dummyop.idname) - 3);
+ return NULL;
+ }
+
+ if(dot != 1) {
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s', invalid bl_idname '%s', must contain 1 '.' character", identifier, _operator_idname);
+ return NULL;
+ }
+ }
+ /* end sanity check */
+
+ {
+ int idlen = strlen(_operator_idname) + 4;
+ int namelen = strlen(_operator_name) + 1;
+ int desclen = strlen(_operator_descr) + 1;
+ char *ch, *ch_arr;
+ ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
+ WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
+ dummyot.idname= ch;
+ ch += idlen;
+ strcpy(ch, _operator_name);
+ dummyot.name = ch;
+ ch += namelen;
+ strcpy(ch, _operator_descr);
+ dummyot.description = ch;
+ }
}
/* check if we have registered this operator type before, and remove it */
@@ -830,16 +911,17 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
/* create a new menu type */
dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
+ RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */
dummyot.ext.data= data;
dummyot.ext.call= call;
dummyot.ext.free= free;
dummyot.pyop_poll= (have_function[0])? operator_poll: NULL;
- dummyot.exec= (have_function[1])? operator_exec: NULL;
- dummyot.invoke= (have_function[2])? operator_invoke: NULL;
- dummyot.modal= (have_function[3])? operator_modal: NULL;
- dummyot.ui= (have_function[4])? operator_draw: NULL;
-
+ dummyot.exec= (have_function[1])? operator_execute: NULL;
+ dummyot.check= (have_function[2])? operator_check: NULL;
+ dummyot.invoke= (have_function[3])? operator_invoke: NULL;
+ dummyot.modal= (have_function[4])? operator_modal: NULL;
+ dummyot.ui= (have_function[5])? operator_draw: NULL;
WM_operatortype_append_ptr(operator_wrapper, (void *)&dummyot);
/* update while blender is running */
@@ -850,7 +932,7 @@ static StructRNA *rna_Operator_register(const bContext *C, ReportList *reports,
}
-static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+static StructRNA *rna_MacroOperator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
wmOperatorType dummyot = {0};
wmOperator dummyop= {0};
@@ -886,7 +968,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
}
if(strlen(identifier) >= sizeof(dummyop.idname)) {
- BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, sizeof(dummyop.idname));
+ BKE_reportf(reports, RPT_ERROR, "registering operator class: '%s' is too long, maximum length is %d.", identifier, (int)sizeof(dummyop.idname));
return NULL;
}
@@ -914,7 +996,7 @@ static StructRNA *rna_MacroOperator_register(const bContext *C, ReportList *repo
return dummyot.ext.srna;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
static StructRNA* rna_Operator_refine(PointerRNA *opr)
{
@@ -928,7 +1010,7 @@ static StructRNA* rna_MacroOperator_refine(PointerRNA *opr)
return (op->type && op->type->ext.srna)? op->type->ext.srna: &RNA_Macro;
}
-static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
+static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, const char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
{
// wmWindowManager *wm = CTX_wm_manager(C);
int modifier= 0;
@@ -949,7 +1031,7 @@ static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, char
return WM_keymap_add_item(km, idname, type, value, modifier, keymodifier);
}
-static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, ReportList *reports, char* propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
+static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, ReportList *reports, const char *propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
{
wmWindowManager *wm = CTX_wm_manager(C);
int modifier= 0;
@@ -988,7 +1070,7 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, Report
return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
}
-static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid, int modal)
+static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
{
if (modal == 0) {
return WM_keymap_find(keyconf, idname, spaceid, regionid);
@@ -997,12 +1079,12 @@ static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, char *idname, int spaceid,
}
}
-static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid)
+static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
{
return WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
}
-static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, char *idname)
+static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, const char *idname)
{
wmOperatorType *ot = WM_operatortype_find(idname, 0);
@@ -1012,6 +1094,31 @@ static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *keyconf, char *idname)
return ot->modalkeymap;
}
+/* just to work around 'const char *' warning and to ensure this is a python op */
+static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->idname;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_idname on a non-builtin operator");
+}
+
+static void rna_Operator_bl_label_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->name;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_label on a non-builtin operator");
+}
+
+static void rna_Operator_bl_description_set(PointerRNA *ptr, const char *value)
+{
+ wmOperator *data= (wmOperator*)(ptr->data);
+ char *str= (char *)data->type->description;
+ if(!str[0]) strcpy(str, value);
+ else assert(!"setting the bl_description on a non-builtin operator");
+}
+
#else /* RNA_RUNTIME */
static void rna_def_operator(BlenderRNA *brna)
@@ -1023,7 +1130,7 @@ static void rna_def_operator(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Operator", "Storage of an operator being executed, or registered after execution");
RNA_def_struct_sdna(srna, "wmOperator");
RNA_def_struct_refine_func(srna, "rna_Operator_refine");
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
RNA_def_struct_register_funcs(srna, "rna_Operator_register", "rna_Operator_unregister");
#endif
@@ -1049,19 +1156,25 @@ static void rna_def_operator(BlenderRNA *brna)
/* Registration */
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
- RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME-3); /* else it uses the pointer size!. -3 because '.' -> '_OT_' */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_label_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_REGISTER);
prop= RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->description");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
@@ -1086,7 +1199,7 @@ static void rna_def_macro_operator(BlenderRNA *brna)
RNA_def_struct_ui_text(srna, "Macro Operator", "Storage of a macro operator being executed, or registered after execution");
RNA_def_struct_sdna(srna, "wmOperator");
RNA_def_struct_refine_func(srna, "rna_MacroOperator_refine");
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
RNA_def_struct_register_funcs(srna, "rna_MacroOperator_register", "rna_Operator_unregister");
#endif
@@ -1105,18 +1218,24 @@ static void rna_def_macro_operator(BlenderRNA *brna)
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->name");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_label_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_flag(prop, PROP_REGISTER);
prop= RNA_def_property(srna, "bl_description", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->description");
RNA_def_property_string_maxlength(prop, 1024); /* else it uses the pointer size! */
- RNA_def_property_flag(prop, PROP_REGISTER);
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
+ // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
prop= RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
@@ -1154,7 +1273,7 @@ static void rna_def_operator_utils(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- srna= RNA_def_struct(brna, "OperatorMousePath", "IDPropertyGroup");
+ srna= RNA_def_struct(brna, "OperatorMousePath", "PropertyGroup");
RNA_def_struct_ui_text(srna, "Operator Mouse Path", "Mouse path values for operators that record such paths");
prop= RNA_def_property(srna, "loc", PROP_FLOAT, PROP_XYZ);
@@ -1172,7 +1291,7 @@ static void rna_def_operator_filelist_element(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- srna= RNA_def_struct(brna, "OperatorFileListElement", "IDPropertyGroup");
+ srna= RNA_def_struct(brna, "OperatorFileListElement", "PropertyGroup");
RNA_def_struct_ui_text(srna, "Operator File List Element", "");
@@ -1479,7 +1598,7 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_string_sdna(prop, NULL, "idname");
RNA_def_property_ui_text(prop, "Name", "Name of the key configuration");
RNA_def_struct_name_property(srna, prop);
-
+
prop= RNA_def_property(srna, "keymaps", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "KeyMap");
RNA_def_property_ui_text(prop, "Key Maps", "Key maps configured as part of this configuration");
@@ -1635,6 +1754,11 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
+ prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just override a builtin item)");
+ RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", NULL);
+
RNA_api_keymapitem(srna);
}
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 6eb9bfeb4c0..8c0be26d3a8 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rna_wm_api.c 21094 2009-06-23 00:09:26Z gsrb3d $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,6 +34,7 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_windowmanager_types.h"
#ifdef RNA_RUNTIME
@@ -50,7 +51,7 @@ static void rna_keymap_restore_item_to_default(wmKeyMap *km, bContext *C, wmKeyM
WM_keymap_restore_item_to_default(C, km, kmi);
}
-static void rna_Operator_report(wmOperator *op, int type, char *msg)
+static void rna_Operator_report(wmOperator *op, int type, const char *msg)
{
BKE_report(op->reports, type, msg);
}
@@ -62,7 +63,7 @@ static void rna_Operator_enum_search_invoke(bContext *C, wmOperator *op)
}
-static int rna_event_add_modal_handler(struct bContext *C, struct wmOperator *operator)
+static int rna_event_modal_handler_add(struct bContext *C, struct wmOperator *operator)
{
return WM_event_add_modal_handler(C, operator) != NULL;
}
@@ -87,13 +88,12 @@ static void rna_generic_op_invoke(FunctionRNA *func, int flag)
}
if(flag & WM_GEN_INVOKE_SIZE) {
- parm= RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX);
- parm= RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX);
+ RNA_def_int(func, "width", 300, 0, INT_MAX, "", "Width of the popup.", 0, INT_MAX);
+ RNA_def_int(func, "height", 20, 0, INT_MAX, "", "Height of the popup.", 0, INT_MAX);
}
if(flag & WM_GEN_INVOKE_RETURN) {
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", "");
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", "");
RNA_def_function_return(func, parm);
}
}
@@ -103,11 +103,11 @@ void RNA_api_wm(StructRNA *srna)
FunctionRNA *func;
PropertyRNA *parm;
- func= RNA_def_function(srna, "add_fileselect", "WM_event_add_fileselect");
+ func= RNA_def_function(srna, "fileselect_add", "WM_event_add_fileselect");
RNA_def_function_ui_description(func, "Show up the file selector.");
rna_generic_op_invoke(func, 0);
- func= RNA_def_function(srna, "add_modal_handler", "rna_event_add_modal_handler");
+ func= RNA_def_function(srna, "modal_handler_add", "rna_event_modal_handler_add");
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_USE_CONTEXT);
parm= RNA_def_pointer(func, "operator", "Operator", "", "Operator to call.");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -131,6 +131,11 @@ void RNA_api_wm(StructRNA *srna)
func= RNA_def_function(srna, "invoke_popup", "WM_operator_ui_popup");
RNA_def_function_ui_description(func, "Operator popup invoke.");
rna_generic_op_invoke(func, WM_GEN_INVOKE_SIZE|WM_GEN_INVOKE_RETURN);
+
+ func= RNA_def_function(srna, "invoke_confirm", "WM_operator_confirm");
+ RNA_def_function_ui_description(func, "Operator confirmation.");
+ rna_generic_op_invoke(func, WM_GEN_INVOKE_EVENT|WM_GEN_INVOKE_RETURN);
+
}
void RNA_api_operator(StructRNA *srna)
@@ -140,8 +145,8 @@ void RNA_api_operator(StructRNA *srna)
/* utility, not for registering */
func= RNA_def_function(srna, "report", "rna_Operator_report");
- parm= RNA_def_enum(func, "type", wm_report_items, 0, "Type", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "message", "", 0, "Report Message", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -153,44 +158,58 @@ void RNA_api_operator(StructRNA *srna)
RNA_def_function_ui_description(func, "Test if the operator can be called or not.");
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
- RNA_def_pointer(func, "context", "Context", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* exec */
func= RNA_def_function(srna, "execute", NULL);
RNA_def_function_ui_description(func, "Execute the operator.");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
- RNA_def_pointer(func, "context", "Context", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
+ /* check */
+ func= RNA_def_function(srna, "check", NULL);
+ RNA_def_function_ui_description(func, "Check the operator settings.");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ parm= RNA_def_boolean(func, "result", 0, "result", ""); // better name?
+ RNA_def_function_return(func, parm);
+
/* invoke */
func= RNA_def_function(srna, "invoke", NULL);
RNA_def_function_ui_description(func, "Invoke the operator.");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
- RNA_def_pointer(func, "context", "Context", "", "");
- RNA_def_pointer(func, "event", "Event", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ parm= RNA_def_pointer(func, "event", "Event", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "modal", NULL); /* same as invoke */
RNA_def_function_ui_description(func, "Modal operator function.");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
- RNA_def_pointer(func, "context", "Context", "", "");
- RNA_def_pointer(func, "event", "Event", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ parm= RNA_def_pointer(func, "event", "Event", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- parm= RNA_def_enum(func, "result", operator_return_items, 0, "result", ""); // better name?
- RNA_def_property_flag(parm, PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
RNA_def_function_return(func, parm);
/* draw */
func= RNA_def_function(srna, "draw", NULL);
RNA_def_function_ui_description(func, "Draw function for the operator.");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
- RNA_def_pointer(func, "context", "Context", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_api_macro(StructRNA *srna)
@@ -200,8 +219,8 @@ void RNA_api_macro(StructRNA *srna)
/* utility, not for registering */
func= RNA_def_function(srna, "report", "rna_Operator_report");
- parm= RNA_def_enum(func, "type", wm_report_items, 0, "Type", "");
- RNA_def_property_flag(parm, PROP_REQUIRED|PROP_ENUM_FLAG);
+ parm= RNA_def_enum_flag(func, "type", wm_report_items, 0, "Type", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_string(func, "message", "", 0, "Report Message", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
@@ -213,13 +232,15 @@ void RNA_api_macro(StructRNA *srna)
RNA_def_function_ui_description(func, "Test if the operator can be called or not.");
RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL);
RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", ""));
- RNA_def_pointer(func, "context", "Context", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
/* draw */
func= RNA_def_function(srna, "draw", NULL);
RNA_def_function_ui_description(func, "Draw function for the operator.");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
- RNA_def_pointer(func, "context", "Context", "", "");
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
}
void RNA_api_keyconfig(StructRNA *srna)
@@ -242,7 +263,7 @@ void RNA_api_keymap(StructRNA *srna)
parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "User editable key map.");
RNA_def_function_return(func, parm);
- func= RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
+ RNA_def_function(srna, "restore_to_default", "WM_keymap_restore_to_default");
func= RNA_def_function(srna, "restore_item_to_default", "rna_keymap_restore_item_to_default");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index ecf253acbce..2de7e0e206f 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -86,7 +86,7 @@ static void rna_World_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
World *wo= ptr->id.data;
- DAG_id_flush_update(&wo->id, 0);
+ DAG_id_tag_update(&wo->id, 0);
WM_main_add_notifier(NC_WORLD, wo);
}
@@ -94,10 +94,29 @@ static void rna_World_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
World *wo= ptr->id.data;
- DAG_id_flush_update(&wo->id, 0);
+ DAG_id_tag_update(&wo->id, 0);
WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
}
+/* so camera mist limits redraw */
+static void rna_World_draw_mist_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ World *wo= ptr->id.data;
+
+ DAG_id_tag_update(&wo->id, 0);
+ WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
+}
+
+static void rna_World_stars_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ World *wo= ptr->id.data;
+
+ DAG_id_tag_update(&wo->id, 0);
+ WM_main_add_notifier(NC_WORLD|ND_WORLD_STARS, wo);
+}
+
+
#else
static void rna_def_world_mtex(BlenderRNA *brna)
@@ -266,7 +285,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces to use for approximate ambient occlusion");
RNA_def_property_update(prop, 0, "rna_World_update");
@@ -290,7 +309,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "aodistfac");
- RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the 'shorter' the shadows");
+ RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the less influence farther away objects have influence");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
@@ -379,14 +398,14 @@ static void rna_def_world_mist(BlenderRNA *brna)
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "mistdist");
RNA_def_property_range(prop, 0, FLT_MAX);
RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
RNA_def_property_ui_text(prop, "Depth", "The distance over which the mist effect fades in");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "misthi");
@@ -414,31 +433,31 @@ static void rna_def_world_stars(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_stars", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS);
RNA_def_property_ui_text(prop, "Use Stars", "Enable starfield generation");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "starsize");
RNA_def_property_range(prop, 0, 10);
RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_draw_update"); /* use normal update since this isnt visualized */
prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "starmindist");
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "average_separation", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stardist");
RNA_def_property_range(prop, 2, 1000);
RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars");
- RNA_def_property_update(prop, 0, "rna_World_draw_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
prop= RNA_def_property(srna, "color_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
- RNA_def_property_update(prop, 0, "rna_World_update");
+ RNA_def_property_update(prop, 0, "rna_World_stars_update");
/* unused
prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
@@ -478,9 +497,8 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
/* RNA_def_property_update(prop, 0, "rna_World_update"); */
- /* render-only uses this, the notifier could be made to be more spesific */
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_World_update");
-
+ /* render-only uses this */
+ RNA_def_property_update(prop, NC_WORLD|ND_WORLD_DRAW, "rna_World_update");
prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
diff --git a/source/blender/makesrna/rna_cleanup/rna_properties.txt b/source/blender/makesrna/rna_cleanup/rna_properties.txt
index 92adbf4373e..a60bb61d6b1 100644
--- a/source/blender/makesrna/rna_cleanup/rna_properties.txt
+++ b/source/blender/makesrna/rna_cleanup/rna_properties.txt
@@ -1,3 +1,4 @@
+<<<<<<< .working
NOTE * CLASS.FROM -> TO: TYPE "DESCRIPTION"
#+ * ActionGroup.channels -> channels: collection, "(read-only) F-Curves in this group"
#+ * ActionGroup.custom_color -> custom_color: int "Index of custom color set"
@@ -4603,3 +4604,6 @@
#WorldStarsSettings.distance_min -> distance_min: float "Minimum distance to the camera for stars"
#+ * WorldStarsSettings.size -> size: float "Average screen dimension of stars"
#+ * WorldStarsSettings.use_stars -> use_stars: boolean "Enable starfield generation"
+=======
+# See svn history for example formatting for this file, currently this isnt in use.
+>>>>>>> .merge-right.r35190
diff --git a/source/blender/makesrna/rna_cleanup/rna_update.sh b/source/blender/makesrna/rna_cleanup/rna_update.sh
index a4d686cc482..a35ad6ef6c3 100755
--- a/source/blender/makesrna/rna_cleanup/rna_update.sh
+++ b/source/blender/makesrna/rna_cleanup/rna_update.sh
@@ -1,3 +1,4 @@
+<<<<<<< .working
cd ../../../../
./blender.bin --background --python ./release/scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt
cd ./source/blender/makesrna/rna_cleanup/
@@ -11,3 +12,18 @@ mv out_work_lost_work.txt rna_properties_lost.txt
cat rna_properties.txt | grep -v "^#" > rna_properties_edits.txt
./rna_cleaner.py rna_properties.txt
echo "Updated: rna_properties.txt rna_properties_edits.txt rna_properties_lost.txt "
+=======
+cd ../../../../
+./blender.bin --background --python ./release/scripts/modules/rna_info.py 2> source/blender/makesrna/rna_cleanup/out.txt
+cd ./source/blender/makesrna/rna_cleanup/
+./rna_cleaner.py out.txt
+./rna_cleaner.py rna_properties.txt
+./rna_cleaner_merge.py out_work.py rna_properties_work.py
+./rna_cleaner.py out_work_merged.py
+./rna_cleaner.py out_work_lost.py
+mv out_work_merged_work.txt rna_properties.txt # overwrite
+mv out_work_lost_work.txt rna_properties_lost.txt
+cat rna_properties.txt | grep -v "^#" > rna_properties_edits.txt
+./rna_cleaner.py rna_properties.txt
+echo "Updated: rna_properties.txt rna_properties_edits.txt rna_properties_lost.txt "
+>>>>>>> .merge-right.r35190
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index d0b5ade199a..0352aa8c05f 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -24,26 +24,80 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
+set(INC
. ./intern
../blenlib
+ ../blenloader
../makesdna
../blenkernel
../blenkernel/intern
../bmesh
../render/extern/include
- ../../../intern/guardedalloc
- ../../../intern/decimation/extern
+ ../../../intern/guardedalloc
../../../intern/elbeem/extern
- ../../../intern/bsp/extern
- ${ZLIB_INC}
+ ${ZLIB_INCLUDE_DIRS}
)
-IF(NOT WITH_FLUID)
- ADD_DEFINITIONS(-DDISABLE_ELBEEM)
-ENDIF(NOT WITH_FLUID)
+set(SRC
+ intern/MOD_armature.c
+ intern/MOD_array.c
+ intern/MOD_bevel.c
+ intern/MOD_boolean.c
+ intern/MOD_build.c
+ intern/MOD_cast.c
+ intern/MOD_cloth.c
+ intern/MOD_collision.c
+ intern/MOD_curve.c
+ intern/MOD_decimate.c
+ intern/MOD_displace.c
+ intern/MOD_edgesplit.c
+ intern/MOD_explode.c
+ intern/MOD_fluidsim.c
+ intern/MOD_fluidsim_util.c
+ intern/MOD_hook.c
+ intern/MOD_lattice.c
+ intern/MOD_mask.c
+ intern/MOD_meshdeform.c
+ intern/MOD_mirror.c
+ intern/MOD_multires.c
+ intern/MOD_none.c
+ intern/MOD_particleinstance.c
+ intern/MOD_particlesystem.c
+ intern/MOD_screw.c
+ intern/MOD_shapekey.c
+ intern/MOD_shrinkwrap.c
+ intern/MOD_simpledeform.c
+ intern/MOD_smoke.c
+ intern/MOD_smooth.c
+ intern/MOD_softbody.c
+ intern/MOD_solidify.c
+ intern/MOD_subsurf.c
+ intern/MOD_surface.c
+ intern/MOD_util.c
+ intern/MOD_uvproject.c
+ intern/MOD_wave.c
+
+ MOD_modifiertypes.h
+ intern/MOD_boolean_util.h
+ intern/MOD_fluidsim_util.h
+ intern/MOD_util.h
+)
+
+if(WITH_MOD_BOOLEAN)
+ add_definitions(-DWITH_MOD_BOOLEAN)
+ list(APPEND SRC
+ intern/MOD_boolean_util.c
+ )
+ list(APPEND INC ../../../intern/bsp/extern)
+endif()
+
+if(WITH_MOD_DECIMATE)
+ add_definitions(-DWITH_MOD_DECIMATE)
+ list(APPEND INC ../../../intern/decimation/extern)
+endif()
-BLENDERLIB(bf_modifiers "${SRC}" "${INC}")
+if(NOT WITH_MOD_FLUID)
+ add_definitions(-DDISABLE_ELBEEM)
+endif()
+blender_add_lib(bf_modifiers "${SRC}" "${INC}")
diff --git a/source/blender/modifiers/MOD_modifiertypes.h b/source/blender/modifiers/MOD_modifiertypes.h
index a792b163eea..8486e2b5d29 100644
--- a/source/blender/modifiers/MOD_modifiertypes.h
+++ b/source/blender/modifiers/MOD_modifiertypes.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file MOD_modifiertypes.h
+ * \ingroup modifiers
+ */
+
#ifndef MOD_MODIFIERTYPES_H
#define MOD_MODIFIERTYPES_H
@@ -69,6 +73,6 @@ extern ModifierTypeInfo modifierType_Solidify;
extern ModifierTypeInfo modifierType_Screw;
/* MOD_util.c */
-void modifier_type_init(ModifierTypeInfo *types[], ModifierType type);
+void modifier_type_init(ModifierTypeInfo *types[]);
#endif //MOD_MODIFIERTYPES_H
diff --git a/source/blender/modifiers/Makefile b/source/blender/modifiers/Makefile
deleted file mode 100644
index ddcddb90186..00000000000
--- a/source/blender/modifiers/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Ben Batt
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/modifiers
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript
index 39e3c62c579..c4196222ec8 100644
--- a/source/blender/modifiers/SConscript
+++ b/source/blender/modifiers/SConscript
@@ -5,16 +5,28 @@ sources = env.Glob('intern/*.c')
incs = '. ./intern'
incs += ' #/intern/guardedalloc #/intern/decimation/extern #/intern/bsp/extern #/intern/elbeem/extern'
+<<<<<<< .working
incs += ' ../render/extern/include ../bmesh'
+=======
+incs += ' ../render/extern/include ../blenloader'
+>>>>>>> .merge-right.r35190
incs += ' ../include ../blenlib ../makesdna ../blenkernel ../blenkernel/intern'
incs += ' ' + env['BF_ZLIB_INC']
defs = []
+# could be made optional
+defs += ['WITH_MOD_BOOLEAN']
+defs += ['WITH_MOD_DECIMATE']
+
if env['BF_NO_ELBEEM']:
- defs.append('DISABLE_ELBEEM')
+ defs.append('DISABLE_ELBEEM')
env.BlenderLib ( libname = 'bf_modifiers', sources = sources,
includes = Split(incs), defines=defs,
+<<<<<<< .working
libtype=['core','player'], priority = [161, 20] )
+=======
+ libtype=['core','player'], priority = [80, 40] )
+>>>>>>> .merge-right.r35190
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index d0e36f90ff5..fa39c197c7b 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -30,10 +30,19 @@
*
*/
+/** \file blender/modifiers/intern/MOD_armature.c
+ * \ingroup modifiers
+ */
+
+
#include <string.h>
#include "DNA_armature_types.h"
#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
@@ -60,20 +69,21 @@ static void copyData(ModifierData *md, ModifierData *target)
tamd->object = amd->object;
tamd->deformflag = amd->deformflag;
+ tamd->multi = amd->multi;
strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
CustomDataMask dataMask = 0;
/* ask for vertexgroups */
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -90,9 +100,10 @@ static void foreachObjectLink(
walk(userData, ob, &amd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -104,9 +115,12 @@ static void updateDepgraph(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -153,6 +167,19 @@ static void deformMatricesEM(
if(!derivedData) dm->release(dm);
}
+static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
+{
+ ArmatureModifierData *amd = (ArmatureModifierData*) md;
+ DerivedMesh *dm = derivedData;
+
+ if(!derivedData) dm = CDDM_from_mesh((Mesh*)ob->data, ob);
+
+ armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
+ amd->deformflag, NULL, amd->defgrp_name);
+
+ if(!derivedData) dm->release(dm);
+}
ModifierTypeInfo modifierType_Armature = {
/* name */ "Armature",
@@ -164,6 +191,7 @@ ModifierTypeInfo modifierType_Armature = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
/* applyModifier */ 0,
@@ -174,6 +202,7 @@ ModifierTypeInfo modifierType_Armature = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 98295ae0d8e..f5a276aeadc 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -37,6 +37,7 @@
#include "BLI_math.h"
#include "BLI_ghash.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_meshdata_types.h"
@@ -51,6 +52,10 @@
#include "depsgraph_private.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
static void initData(ModifierData *md)
{
ArrayModifierData *amd = (ArrayModifierData*) md;
@@ -544,6 +549,7 @@ ModifierTypeInfo modifierType_Array = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index e37bf18a293..8d34fdcb10e 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -29,13 +29,22 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+
+/** \file blender/modifiers/intern/MOD_bevel.c
+ * \ingroup modifiers
+ */
+
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
#include "BKE_bmesh.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
+#include "MOD_util.h"
+
static void initData(ModifierData *md)
{
@@ -66,20 +75,21 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tbmd->defgrp_name, bmd->defgrp_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
BevelModifierData *bmd = (BevelModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(bmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(bmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
#if 0
DerivedMesh *result;
@@ -109,9 +119,9 @@ static DerivedMesh *applyModifier(
return CDDM_copy(derivedData, 0);
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -128,6 +138,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -138,6 +149,7 @@ ModifierTypeInfo modifierType_Bevel = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 4e8e3117b7e..d4be9d3d03a 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -30,14 +30,23 @@
*
*/
+/** \file blender/modifiers/intern/MOD_boolean.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "depsgraph_private.h"
#include "MOD_boolean_util.h"
+#include "MOD_util.h"
static void copyData(ModifierData *md, ModifierData *target)
@@ -49,7 +58,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tbmd->operation = bmd->operation;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
@@ -66,9 +75,10 @@ static void foreachObjectLink(
walk(userData, ob, &bmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
@@ -80,10 +90,11 @@ static void updateDepgraph(
}
}
-
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+#ifdef WITH_MOD_BOOLEAN
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
BooleanModifierData *bmd = (BooleanModifierData*) md;
DerivedMesh *dm = bmd->object->derivedFinal;
@@ -104,12 +115,21 @@ static DerivedMesh *applyModifier(
return derivedData;
}
+#else // WITH_MOD_BOOLEAN
+static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ return derivedData;
+}
+#endif // WITH_MOD_BOOLEAN
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
- CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
+ CustomDataMask dataMask = CD_MASK_MTFACE | CD_MASK_MEDGE;
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -125,6 +145,7 @@ ModifierTypeInfo modifierType_Boolean = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -135,6 +156,7 @@ ModifierTypeInfo modifierType_Boolean = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean_util.c b/source/blender/modifiers/intern/MOD_boolean_util.c
index a0532f9db5c..cefad37ea26 100644
--- a/source/blender/modifiers/intern/MOD_boolean_util.c
+++ b/source/blender/modifiers/intern/MOD_boolean_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* CSG operations.
*/
+/** \file blender/modifiers/intern/MOD_boolean_util.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -37,6 +42,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BKE_cdderivedmesh.h"
@@ -47,6 +53,8 @@
#include "CSG_BooleanOps.h"
+#include "MOD_boolean_util.h"
+
/**
* Here's the vertex iterator structure used to walk through
* the blender vertex structure.
@@ -454,7 +462,7 @@ static void FreeMeshDescriptors(
FaceIt_Destruct(face_it);
}
-DerivedMesh *NewBooleanDerivedMesh_intern(
+static DerivedMesh *NewBooleanDerivedMesh_intern(
DerivedMesh *dm, struct Object *ob, DerivedMesh *dm_select, struct Object *ob_select,
int int_op_type, Material **mat, int *totmat)
{
@@ -581,7 +589,7 @@ int NewBooleanMesh(Scene *scene, Base *base, Base *base_select, int int_op_type)
MEM_freeN(mat);
/* update dag */
- DAG_id_flush_update(&ob_new->id, OB_RECALC_DATA);
+ DAG_id_tag_update(&ob_new->id, OB_RECALC_DATA);
return 1;
}
diff --git a/source/blender/modifiers/intern/MOD_boolean_util.h b/source/blender/modifiers/intern/MOD_boolean_util.h
index e415b368a85..2a4191de407 100644
--- a/source/blender/modifiers/intern/MOD_boolean_util.h
+++ b/source/blender/modifiers/intern/MOD_boolean_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/modifiers/intern/MOD_boolean_util.h
+ * \ingroup modifiers
+ */
+
+
#ifndef MOD_BOOLEAN_UTILS_H
#define MOD_BOOLEAN_UTILS_H
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index e027cc1fccc..e2a54648623 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -30,8 +30,14 @@
*
*/
+/** \file blender/modifiers/intern/MOD_build.c
+ * \ingroup modifiers
+ */
+
+
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_rand.h"
#include "BLI_ghash.h"
@@ -45,6 +51,7 @@
#include "BKE_particle.h"
#include "BKE_scene.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -65,21 +72,21 @@ static void copyData(ModifierData *md, ModifierData *target)
tbmd->seed = bmd->seed;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
DerivedMesh *result;
BuildModifierData *bmd = (BuildModifierData*) md;
int i;
int numFaces, numEdges;
- int maxVerts, maxEdges, maxFaces;
int *vertMap, *edgeMap, *faceMap;
float frac;
GHashIterator *hashIter;
@@ -90,19 +97,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
GHash *edgeHash = BLI_ghash_new(BLI_ghashutil_inthash,
BLI_ghashutil_intcmp, "build ed apply gh");
- maxVerts = dm->getNumVerts(dm);
- vertMap = MEM_callocN(sizeof(*vertMap) * maxVerts,
- "build modifier vertMap");
- for(i = 0; i < maxVerts; ++i) vertMap[i] = i;
+ const int maxVerts= dm->getNumVerts(dm);
+ const int maxEdges= dm->getNumEdges(dm);
+ const int maxFaces= dm->getNumTessFaces(dm);
- maxEdges = dm->getNumEdges(dm);
- edgeMap = MEM_callocN(sizeof(*edgeMap) * maxEdges,
- "build modifier edgeMap");
+ vertMap = MEM_callocN(sizeof(*vertMap) * maxVerts, "build modifier vertMap");
+ for(i = 0; i < maxVerts; ++i) vertMap[i] = i;
+ edgeMap = MEM_callocN(sizeof(*edgeMap) * maxEdges, "build modifier edgeMap");
for(i = 0; i < maxEdges; ++i) edgeMap[i] = i;
-
- maxFaces = dm->getNumTessFaces(dm);
- faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces,
- "build modifier faceMap");
+ faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, "build modifier faceMap");
for(i = 0; i < maxFaces; ++i) faceMap[i] = i;
if (ob) {
@@ -118,8 +121,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* if there's at least one face, build based on faces */
if(numFaces) {
- int maxEdges;
-
if(bmd->randomize)
BLI_array_randomize(faceMap, sizeof(*faceMap),
maxFaces, bmd->seed);
@@ -148,7 +149,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* get the set of edges that will be in the new mesh (i.e. all edges
* that have both verts in the new mesh)
*/
- maxEdges = dm->getNumEdges(dm);
for(i = 0; i < maxEdges; ++i) {
MEdge me;
dm->getEdge(dm, i, &me);
@@ -208,75 +208,72 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
BLI_ghash_size(edgeHash), numFaces, 0, 0);
/* copy the vertices across */
- for(hashIter = BLI_ghashIterator_new(vertHash);
- !BLI_ghashIterator_isDone(hashIter);
- BLI_ghashIterator_step(hashIter)) {
- MVert source;
- MVert *dest;
- int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
- int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
-
- dm->getVert(dm, oldIndex, &source);
- dest = CDDM_get_vert(result, newIndex);
-
- DM_copy_vert_data(dm, result, oldIndex, newIndex, 1);
- *dest = source;
- }
- BLI_ghashIterator_free(hashIter);
-
- /* copy the edges across, remapping indices */
- for(i = 0; i < BLI_ghash_size(edgeHash); ++i) {
- MEdge source;
- MEdge *dest;
- int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i)));
-
- dm->getEdge(dm, oldIndex, &source);
- dest = CDDM_get_edge(result, i);
-
- source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
- source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
-
- DM_copy_edge_data(dm, result, oldIndex, i, 1);
- *dest = source;
- }
-
- /* copy the faces across, remapping indices */
- for(i = 0; i < numFaces; ++i) {
- MFace source;
- MFace *dest;
- int orig_v4;
-
- dm->getTessFace(dm, faceMap[i], &source);
- dest = CDDM_get_tessface(result, i);
-
- orig_v4 = source.v4;
-
- source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
- source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
- source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3)));
- if(source.v4)
- source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4)));
-
- DM_copy_face_data(dm, result, faceMap[i], i, 1);
- *dest = source;
-
- test_index_face(dest, &result->faceData, i, (orig_v4 ? 4 : 3));
- }
-
- CDDM_calc_normals(result);
-
- BLI_ghash_free(vertHash, NULL, NULL);
- BLI_ghash_free(edgeHash, NULL, NULL);
-
- MEM_freeN(vertMap);
- MEM_freeN(edgeMap);
- MEM_freeN(faceMap);
+ for( hashIter = BLI_ghashIterator_new(vertHash);
+ !BLI_ghashIterator_isDone(hashIter);
+ BLI_ghashIterator_step(hashIter)
+ ) {
+ MVert source;
+ MVert *dest;
+ int oldIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getKey(hashIter));
+ int newIndex = GET_INT_FROM_POINTER(BLI_ghashIterator_getValue(hashIter));
+
+ dm->getVert(dm, oldIndex, &source);
+ dest = CDDM_get_vert(result, newIndex);
+
+ DM_copy_vert_data(dm, result, oldIndex, newIndex, 1);
+ *dest = source;
+ }
+ BLI_ghashIterator_free(hashIter);
+
+ /* copy the edges across, remapping indices */
+ for(i = 0; i < BLI_ghash_size(edgeHash); ++i) {
+ MEdge source;
+ MEdge *dest;
+ int oldIndex = GET_INT_FROM_POINTER(BLI_ghash_lookup(edgeHash, SET_INT_IN_POINTER(i)));
+
+ dm->getEdge(dm, oldIndex, &source);
+ dest = CDDM_get_edge(result, i);
+
+ source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
+ source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
+
+ DM_copy_edge_data(dm, result, oldIndex, i, 1);
+ *dest = source;
+ }
- dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/
- result->needsFree = 1;
- result->release(result);
+ /* copy the faces across, remapping indices */
+ for(i = 0; i < numFaces; ++i) {
+ MFace source;
+ MFace *dest;
+ int orig_v4;
+
+ dm->getTessFace(dm, faceMap[i], &source);
+ dest = CDDM_get_tessface(result, i);
+
+ orig_v4 = source.v4;
+
+ source.v1 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v1)));
+ source.v2 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v2)));
+ source.v3 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v3)));
+ if(source.v4)
+ source.v4 = GET_INT_FROM_POINTER(BLI_ghash_lookup(vertHash, SET_INT_IN_POINTER(source.v4)));
+
+ DM_copy_face_data(dm, result, faceMap[i], i, 1);
+ *dest = source;
+
+ test_index_face(dest, &result->faceData, i, (orig_v4 ? 4 : 3));
+ }
- return dm;
+ CDDM_calc_normals(result);
+
+ BLI_ghash_free(vertHash, NULL, NULL);
+ BLI_ghash_free(edgeHash, NULL, NULL);
+
+ MEM_freeN(vertMap);
+ MEM_freeN(edgeMap);
+ MEM_freeN(faceMap);
+
+ return result;
}
@@ -288,17 +285,19 @@ ModifierTypeInfo modifierType_Build = {
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_AcceptsCVs,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
/* dependsOnTime */ dependsOnTime,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL
};
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index 10843cf9677..68e9e173ee6 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -30,15 +30,22 @@
*
*/
+/** \file blender/modifiers/intern/MOD_cast.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
#include "BKE_modifier.h"
-#include "BKE_utildefines.h"
+
#include "depsgraph_private.h"
@@ -73,7 +80,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->defgrp_name, cmd->defgrp_name, 32);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
CastModifierData *cmd = (CastModifierData*) md;
short flag;
@@ -85,13 +92,13 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return 0;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CastModifierData *cmd = (CastModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(cmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(cmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -106,9 +113,10 @@ static void foreachObjectLink(
walk (userData, ob, &cmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
CastModifierData *cmd = (CastModifierData*) md;
@@ -566,14 +574,17 @@ static void cuboid_do(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = NULL;
CastModifierData *cmd = (CastModifierData *)md;
- dm = get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+ dm = get_dm(ob, NULL, derivedData, NULL, 0);
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
cuboid_do(cmd, ob, dm, vertexCos, numVerts);
@@ -589,7 +600,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm = get_dm(md->scene, ob, editData, derivedData, NULL, 0);
+ DerivedMesh *dm = get_dm(ob, editData, derivedData, NULL, 0);
CastModifierData *cmd = (CastModifierData *)md;
if (cmd->type == MOD_CAST_TYPE_CUBOID) {
@@ -613,6 +624,7 @@ ModifierTypeInfo modifierType_Cast = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -623,6 +635,7 @@ ModifierTypeInfo modifierType_Cast = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index bfb5f6ee028..999349dca7f 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -30,12 +30,20 @@
*
*/
+/** \file blender/modifiers/intern/MOD_cloth.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_cloth_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cloth.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
@@ -44,6 +52,7 @@
#include "depsgraph_private.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -61,7 +70,9 @@ static void initData(ModifierData *md)
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData, int useRenderParams, int isFinalCalc)
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
ClothModifierData *clmd = (ClothModifierData*) md;
DerivedMesh *result=NULL;
@@ -72,17 +83,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
initData(md);
if(!clmd->sim_parms || !clmd->coll_parms)
- return derivedData;
+ return dm;
}
- result = clothModifier_do(clmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
+ result = clothModifier_do(clmd, md->scene, ob, dm);
if(result)
{
CDDM_calc_normals(result);
return result;
}
- return derivedData;
+ return dm;
}
static void updateDepgraph(
@@ -111,16 +122,16 @@ static void updateDepgraph(
}
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CustomDataMask dataMask = 0;
ClothModifierData *clmd = (ClothModifierData*)md;
if(cloth_uses_vgroup(clmd))
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
if(clmd->sim_parms->shapekey_rest != 0)
- dataMask |= (1 << CD_CLOTH_ORCO);
+ dataMask |= CD_MASK_CLOTH_ORCO;
return dataMask;
}
@@ -150,7 +161,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tclmd->clothObject = NULL;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -191,6 +202,7 @@ ModifierTypeInfo modifierType_Cloth = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -201,6 +213,7 @@ ModifierTypeInfo modifierType_Cloth = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index fd43e057144..07b35cdf334 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_collision.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
@@ -37,6 +42,8 @@
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_collision.h"
#include "BKE_cdderivedmesh.h"
@@ -46,6 +53,7 @@
#include "BKE_pointcache.h"
#include "BKE_scene.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -94,19 +102,20 @@ static void freeData(ModifierData *md)
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
CollisionModifierData *collmd = (CollisionModifierData*) md;
DerivedMesh *dm = NULL;
- float current_time = 0;
- unsigned int numverts = 0, i = 0;
MVert *tempVert = NULL;
/* if possible use/create DerivedMesh */
@@ -121,6 +130,9 @@ static void deformVerts(
if(dm)
{
+ float current_time = 0;
+ unsigned int numverts = 0;
+
CDDM_apply_vert_coords(dm, vertexCos);
CDDM_calc_normals(dm);
@@ -132,7 +144,9 @@ static void deformVerts(
numverts = dm->getNumVerts ( dm );
if((current_time > collmd->time)|| (BKE_ptcache_get_continue_physics()))
- {
+ {
+ unsigned int i;
+
// check if mesh has changed
if(collmd->x && (numverts != collmd->numverts))
freeData((ModifierData *)collmd);
@@ -238,6 +252,7 @@ ModifierTypeInfo modifierType_Collision = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -248,6 +263,7 @@ ModifierTypeInfo modifierType_Collision = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 97c7a4b01d6..84fee7b5102 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -30,17 +30,26 @@
*
*/
+/** \file blender/modifiers/intern/MOD_curve.c
+ * \ingroup modifiers
+ */
+
+
#include <string.h>
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
#include "depsgraph_private.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -59,18 +68,18 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->name, cmd->name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
CurveModifierData *cmd = (CurveModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(cmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(cmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(userRenderParams))
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -87,9 +96,10 @@ static void foreachObjectLink(
walk(userData, ob, &cmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -101,9 +111,12 @@ static void updateDepgraph(
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -135,6 +148,7 @@ ModifierTypeInfo modifierType_Curve = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -145,6 +159,7 @@ ModifierTypeInfo modifierType_Curve = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index f75fc0dd1f4..4eae988f92f 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -30,9 +30,16 @@
*
*/
+/** \file blender/modifiers/intern/MOD_decimate.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
@@ -41,8 +48,11 @@
#include "MEM_guardedalloc.h"
+#ifdef WITH_MOD_DECIMATE
#include "LOD_decimation.h"
+#endif
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -59,9 +69,11 @@ static void copyData(ModifierData *md, ModifierData *target)
tdmd->percent = dmd->percent;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+#ifdef WITH_MOD_DECIMATE
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DecimateModifierData *dmd = (DecimateModifierData*) md;
DerivedMesh *dm = derivedData, *result = NULL;
@@ -179,7 +191,15 @@ exit:
return dm;
}
-
+#else // WITH_MOD_DECIMATE
+static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
+{
+ return derivedData;
+}
+#endif // WITH_MOD_DECIMATE
ModifierTypeInfo modifierType_Decimate = {
/* name */ "Decimate",
@@ -189,6 +209,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -199,6 +220,7 @@ ModifierTypeInfo modifierType_Decimate = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index 6dbe3d3622c..6ae5c14d5ef 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -30,10 +30,17 @@
*
*/
+/** \file blender/modifiers/intern/MOD_displace.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -75,16 +82,16 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
DisplaceModifierData *dmd = (DisplaceModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(dmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(dmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
/* ask for UV coordinates if we need them */
- if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= (1 << CD_MTFACE);
+ if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= CD_MASK_MTFACE;
return dataMask;
}
@@ -103,6 +110,12 @@ static int dependsOnTime(ModifierData *md)
}
}
+static int dependsOnNormals(ModifierData *md)
+{
+ DisplaceModifierData *dmd = (DisplaceModifierData *)md;
+ return (dmd->direction == MOD_DISP_DIR_NOR);
+}
+
static void foreachObjectLink(ModifierData *md, Object *ob,
ObjectWalkFunc walk, void *userData)
{
@@ -121,25 +134,32 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
DisplaceModifierData *dmd = (DisplaceModifierData*) md;
return (!dmd->texture || dmd->strength == 0.0f);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
DisplaceModifierData *dmd = (DisplaceModifierData*) md;
- if(dmd->map_object) {
+ if(dmd->map_object && dmd->texmapping == MOD_DISP_MAP_OBJECT) {
DagNode *curNode = dag_get_node(forest, dmd->map_object);
dag_add_relation(forest, curNode, obNode,
DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
}
+
+
+ if(dmd->texmapping == MOD_DISP_MAP_GLOBAL)
+ dag_add_relation(forest, obNode, obNode,
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Displace Modifier");
+
}
static void get_texture_coords(DisplaceModifierData *dmd, Object *ob,
@@ -302,11 +322,14 @@ static void displaceModifier_do(
MEM_freeN(tex_co);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos);
+ DerivedMesh *dm= get_cddm(ob, NULL, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -319,7 +342,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm= get_cddm(md->scene, ob, editData, derivedData, vertexCos);
+ DerivedMesh *dm= get_cddm(ob, editData, derivedData, vertexCos);
displaceModifier_do((DisplaceModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -339,6 +362,7 @@ ModifierTypeInfo modifierType_Displace = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -349,6 +373,7 @@ ModifierTypeInfo modifierType_Displace = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ dependsOnNormals,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 9d622669c78..4549448f45e 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -36,11 +36,13 @@
#include "BLI_edgehash.h"
#include "BLI_math.h"
#include "BLI_array.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_tessmesh.h"
+#include "BKE_mesh.h"
#include "MEM_guardedalloc.h"
@@ -446,6 +448,7 @@ ModifierTypeInfo modifierType_EdgeSplit = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index ec4137c2654..04687958efd 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_explode.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
@@ -37,6 +42,7 @@
#include "BLI_rand.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_deform.h"
@@ -46,10 +52,11 @@
#include "BKE_object.h"
#include "BKE_particle.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -74,24 +81,24 @@ static void copyData(ModifierData *md, ModifierData *target)
temd->protect = emd->protect;
temd->vgroup = emd->vgroup;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
ExplodeModifierData *emd= (ExplodeModifierData*) md;
CustomDataMask dataMask = 0;
if(emd->vgroup)
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
static void createFacepa(ExplodeModifierData *emd,
- ParticleSystemModifierData *psmd,
- Object *ob, DerivedMesh *dm)
+ ParticleSystemModifierData *psmd,
+ DerivedMesh *dm)
{
ParticleSystem *psys=psmd->psys;
MFace *fa=0, *mface=0;
@@ -127,11 +134,10 @@ static void createFacepa(ExplodeModifierData *emd,
/* set protected verts */
if(emd->vgroup){
MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
- float val;
if(dvert){
- int defgrp_index= emd->vgroup-1;
+ const int defgrp_index= emd->vgroup-1;
for(i=0; i<totvert; i++, dvert++){
- val = BLI_frand();
+ float val = BLI_frand();
val = (1.0f-emd->protect)*val + emd->protect*0.5f;
if(val < defvert_find_weight(dvert, defgrp_index))
vertpa[i] = -1;
@@ -179,15 +185,369 @@ static void createFacepa(ExplodeModifierData *emd,
BLI_kdtree_free(tree);
}
-static int edgesplit_get(EdgeHash *edgehash, int v1, int v2)
+static int edgecut_get(EdgeHash *edgehash, int v1, int v2)
{
return GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, v1, v2));
}
-static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
+
+const short add_faces[24] = {
+ 0,
+ 0, 0, 2, 0, 1, 2, 2, 0, 2, 1,
+ 2, 2, 2, 2, 3, 0, 0, 0, 1, 0,
+ 1, 1, 2
+ };
+
+MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
+{
+ MFace *df = CDDM_get_tessface(split, cur);
+ DM_copy_face_data(dm, split, i, cur, 1);
+ *df = *mf;
+ return df;
+}
+
+#define SET_VERTS(a, b, c, d) \
+ v[0]=mf->v##a; uv[0]=a-1; \
+ v[1]=mf->v##b; uv[1]=b-1; \
+ v[2]=mf->v##c; uv[2]=c-1; \
+ v[3]=mf->v##d; uv[3]=d-1;
+
+#define GET_ES(v1, v2) edgecut_get(eh, v1, v2);
+#define INT_UV(uvf, c0, c1) interp_v2_v2v2(uvf, mf->uv[c0], mf->uv[c1], 0.5f);
+
+static void remap_faces_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+ MFace *df3 = get_dface(dm, split, cur+2, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = GET_ES(v1, v2)
+ df1->v3 = GET_ES(v2, v3)
+ df1->v4 = v3;
+ df1->flag |= ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v2];
+ df2->v1 = GET_ES(v1, v2)
+ df2->v2 = v2;
+ df2->v3 = GET_ES(v2, v3)
+ df2->v4 = 0;
+ df2->flag &= ~ME_FACE_SEL;
+
+ facepa[cur+2] = vertpa[v1];
+ df3->v1 = v1;
+ df3->v2 = v3;
+ df3->v3 = v4;
+ df3->v4 = 0;
+ df3->flag &= ~ME_FACE_SEL;
+}
+
+static void remap_uvs_3_6_9_12(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+{
+ MTFace *mf, *df1, *df2, *df3;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ df3 = df1 + 2;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ INT_UV(df1->uv[1], c0, c1)
+ INT_UV(df1->uv[2], c1, c2)
+ copy_v2_v2(df1->uv[3], mf->uv[c2]);
+
+ INT_UV(df2->uv[0], c0, c1)
+ copy_v2_v2(df2->uv[1], mf->uv[c1]);
+ INT_UV(df2->uv[2], c1, c2)
+
+ copy_v2_v2(df3->uv[0], mf->uv[c0]);
+ copy_v2_v2(df3->uv[1], mf->uv[c2]);
+ copy_v2_v2(df3->uv[2], mf->uv[c3]);
+ }
+}
+
+static void remap_faces_5_10(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = v2;
+ df1->v3 = GET_ES(v2, v3)
+ df1->v4 = GET_ES(v1, v4)
+ df1->flag |= ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v3];
+ df2->v1 = GET_ES(v1, v4)
+ df2->v2 = GET_ES(v2, v3)
+ df2->v3 = v3;
+ df2->v4 = v4;
+ df2->flag |= ME_FACE_SEL;
+}
+
+static void remap_uvs_5_10(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+{
+ MTFace *mf, *df1, *df2;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ copy_v2_v2(df1->uv[1], mf->uv[c1]);
+ INT_UV(df1->uv[2], c1, c2)
+ INT_UV(df1->uv[3], c0, c3)
+
+ INT_UV(df2->uv[0], c0, c3)
+ INT_UV(df2->uv[1], c1, c2)
+ copy_v2_v2(df2->uv[2], mf->uv[c2]);
+ copy_v2_v2(df2->uv[3], mf->uv[c3]);
+
+ }
+}
+
+static void remap_faces_15(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+ MFace *df3 = get_dface(dm, split, cur+2, i, mf);
+ MFace *df4 = get_dface(dm, split, cur+3, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = GET_ES(v1, v2)
+ df1->v3 = GET_ES(v1, v3)
+ df1->v4 = GET_ES(v1, v4)
+ df1->flag |= ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v2];
+ df2->v1 = GET_ES(v1, v2)
+ df2->v2 = v2;
+ df2->v3 = GET_ES(v2, v3)
+ df2->v4 = GET_ES(v1, v3)
+ df2->flag |= ME_FACE_SEL;
+
+ facepa[cur+2] = vertpa[v3];
+ df3->v1 = GET_ES(v1, v3)
+ df3->v2 = GET_ES(v2, v3)
+ df3->v3 = v3;
+ df3->v4 = GET_ES(v3, v4)
+ df3->flag |= ME_FACE_SEL;
+
+ facepa[cur+3] = vertpa[v4];
+ df4->v1 = GET_ES(v1, v4)
+ df4->v2 = GET_ES(v1, v3)
+ df4->v3 = GET_ES(v3, v4)
+ df4->v4 = v4;
+ df4->flag |= ME_FACE_SEL;
+}
+
+static void remap_uvs_15(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+{
+ MTFace *mf, *df1, *df2, *df3, *df4;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ df3 = df1 + 2;
+ df4 = df1 + 3;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ INT_UV(df1->uv[1], c0, c1)
+ INT_UV(df1->uv[2], c0, c2)
+ INT_UV(df1->uv[3], c0, c3)
+
+ INT_UV(df2->uv[0], c0, c1)
+ copy_v2_v2(df2->uv[1], mf->uv[c1]);
+ INT_UV(df2->uv[2], c1, c2)
+ INT_UV(df2->uv[3], c0, c2)
+
+ INT_UV(df3->uv[0], c0, c2)
+ INT_UV(df3->uv[1], c1, c2)
+ copy_v2_v2(df3->uv[2], mf->uv[c2]);
+ INT_UV(df3->uv[3], c2, c3)
+
+ INT_UV(df4->uv[0], c0, c3)
+ INT_UV(df4->uv[1], c0, c2)
+ INT_UV(df4->uv[2], c2, c3)
+ copy_v2_v2(df4->uv[3], mf->uv[c3]);
+ }
+}
+
+static void remap_faces_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3, int v4)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+ MFace *df3 = get_dface(dm, split, cur+2, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = GET_ES(v1, v2)
+ df1->v3 = GET_ES(v2, v3)
+ df1->v4 = GET_ES(v1, v4)
+ df1->flag |= ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v2];
+ df2->v1 = GET_ES(v1, v2)
+ df2->v2 = v2;
+ df2->v3 = GET_ES(v2, v3)
+ df2->v4 = 0;
+ df2->flag &= ~ME_FACE_SEL;
+
+ facepa[cur+2] = vertpa[v4];
+ df3->v1 = GET_ES(v1, v4)
+ df3->v2 = GET_ES(v2, v3)
+ df3->v3 = v3;
+ df3->v4 = v4;
+ df3->flag |= ME_FACE_SEL;
+}
+
+static void remap_uvs_7_11_13_14(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2, int c3)
+{
+ MTFace *mf, *df1, *df2, *df3;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ df3 = df1 + 2;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ INT_UV(df1->uv[1], c0, c1)
+ INT_UV(df1->uv[2], c1, c2)
+ INT_UV(df1->uv[3], c0, c3)
+
+ INT_UV(df2->uv[0], c0, c1)
+ copy_v2_v2(df2->uv[1], mf->uv[c1]);
+ INT_UV(df2->uv[2], c1, c2)
+
+ INT_UV(df3->uv[0], c0, c3)
+ INT_UV(df3->uv[1], c1, c2)
+ copy_v2_v2(df3->uv[2], mf->uv[c2]);
+ copy_v2_v2(df3->uv[3], mf->uv[c3]);
+ }
+}
+
+static void remap_faces_19_21_22(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = GET_ES(v1, v2)
+ df1->v3 = GET_ES(v1, v3)
+ df1->v4 = 0;
+ df1->flag &= ~ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v2];
+ df2->v1 = GET_ES(v1, v2)
+ df2->v2 = v2;
+ df2->v3 = v3;
+ df2->v4 = GET_ES(v1, v3)
+ df2->flag |= ME_FACE_SEL;
+}
+
+static void remap_uvs_19_21_22(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
+{
+ MTFace *mf, *df1, *df2;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ INT_UV(df1->uv[1], c0, c1)
+ INT_UV(df1->uv[2], c0, c2)
+
+ INT_UV(df2->uv[0], c0, c1)
+ copy_v2_v2(df2->uv[1], mf->uv[c1]);
+ copy_v2_v2(df2->uv[2], mf->uv[c2]);
+ INT_UV(df2->uv[3], c0, c2)
+ }
+}
+
+static void remap_faces_23(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *facepa, int *vertpa, int i, EdgeHash *eh, int cur, int v1, int v2, int v3)
+{
+ MFace *df1 = get_dface(dm, split, cur, i, mf);
+ MFace *df2 = get_dface(dm, split, cur+1, i, mf);
+ MFace *df3 = get_dface(dm, split, cur+2, i, mf);
+
+ facepa[cur] = vertpa[v1];
+ df1->v1 = v1;
+ df1->v2 = GET_ES(v1, v2)
+ df1->v3 = GET_ES(v2, v3)
+ df1->v4 = GET_ES(v1, v3)
+ df1->flag |= ME_FACE_SEL;
+
+ facepa[cur+1] = vertpa[v2];
+ df2->v1 = GET_ES(v1, v2)
+ df2->v2 = v2;
+ df2->v3 = GET_ES(v2, v3)
+ df2->v4 = 0;
+ df2->flag &= ~ME_FACE_SEL;
+
+ facepa[cur+2] = vertpa[v3];
+ df3->v1 = GET_ES(v1, v3)
+ df3->v2 = GET_ES(v2, v3)
+ df3->v3 = v3;
+ df3->v4 = 0;
+ df3->flag &= ~ME_FACE_SEL;
+}
+
+static void remap_uvs_23(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
+{
+ MTFace *mf, *df1, *df2, *df3;
+ int l;
+
+ for(l=0; l<numlayer; l++) {
+ mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
+ df1 = mf+cur;
+ df2 = df1 + 1;
+ df3 = df1 + 2;
+ mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
+ mf += i;
+
+ copy_v2_v2(df1->uv[0], mf->uv[c0]);
+ INT_UV(df1->uv[1], c0, c1)
+ INT_UV(df1->uv[2], c1, c2)
+ INT_UV(df1->uv[3], c0, c2)
+
+ INT_UV(df2->uv[0], c0, c1)
+ copy_v2_v2(df2->uv[1], mf->uv[c1]);
+ INT_UV(df2->uv[2], c1, c2)
+
+ INT_UV(df2->uv[0], c0, c2)
+ INT_UV(df2->uv[1], c1, c2)
+ copy_v2_v2(df2->uv[2], mf->uv[c2]);
+ }
+}
+
+static DerivedMesh * cutEdges(ExplodeModifierData *emd, DerivedMesh *dm){
DerivedMesh *splitdm;
- MFace *mf=0,*df1=0,*df2=0,*df3=0;
- MFace *mface=CDDM_get_tessfaces(dm);
+ MFace *mf=NULL,*df1=NULL;
+ MFace *mface=dm->getTessFaceArray(dm);
MVert *dupve, *mv;
EdgeHash *edgehash;
EdgeHashIterator *ehi;
@@ -197,8 +557,9 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_facesplit");
int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2");
int *facepa = emd->facepa;
- int *fs, totesplit=0,totfsplit=0,totin=0,curdupvert=0,curdupface=0,curdupin=0;
- int i,j,v1,v2,v3,v4,esplit;
+ int *fs, totesplit=0,totfsplit=0,curdupface=0;
+ int i,j,v1,v2,v3,v4,esplit, v[4], uv[4];
+ int numlayer;
edgehash= BLI_edgehash_new();
@@ -213,52 +574,48 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
/* mark edges for splitting and how to split faces */
for (i=0,mf=mface,fs=facesplit; i<totface; i++,mf++,fs++) {
- if(mf->v4){
- v1=vertpa[mf->v1];
- v2=vertpa[mf->v2];
- v3=vertpa[mf->v3];
- v4=vertpa[mf->v4];
+ v1=vertpa[mf->v1];
+ v2=vertpa[mf->v2];
+ v3=vertpa[mf->v3];
- if(v1!=v2){
- BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL);
- (*fs)++;
- }
+ if(v1!=v2){
+ BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL);
+ (*fs) |= 1;
+ }
- if(v2!=v3){
- BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL);
- (*fs)++;
- }
+ if(v2!=v3){
+ BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL);
+ (*fs) |= 2;
+ }
+
+ if(mf->v4){
+ v4=vertpa[mf->v4];
if(v3!=v4){
BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL);
- (*fs)++;
+ (*fs) |= 4;
}
if(v1!=v4){
BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL);
- (*fs)++;
+ (*fs) |= 8;
}
- if(*fs==2){
- if((v1==v2 && v3==v4) || (v1==v4 && v2==v3))
- *fs=1;
- else if(v1!=v2){
- if(v1!=v4)
- BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL);
- else
- BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL);
- }
- else{
- if(v1!=v4)
- BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL);
- else
- BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL);
- }
+ /* mark center vertex as a fake edge split */
+ if(*fs == 15)
+ BLI_edgehash_insert(edgehash, mf->v1, mf->v3, NULL);
+ }
+ else {
+ (*fs) |= 16; /* mark face as tri */
+
+ if(v1!=v3){
+ BLI_edgehash_insert(edgehash, mf->v1, mf->v3, NULL);
+ (*fs) |= 4;
}
}
}
- /* count splits & reindex */
+ /* count splits & create indexes for new verts */
ehi= BLI_edgehashIterator_new(edgehash);
totesplit=totvert;
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
@@ -268,24 +625,11 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
BLI_edgehashIterator_free(ehi);
/* count new faces due to splitting */
- for(i=0,fs=facesplit; i<totface; i++,fs++){
- if(*fs==1)
- totfsplit+=1;
- else if(*fs==2)
- totfsplit+=2;
- else if(*fs==3)
- totfsplit+=3;
- else if(*fs==4){
- totfsplit+=3;
-
- mf=dm->getTessFaceData(dm,i,CD_MFACE);//CDDM_get_tessface(dm,i);
-
- if(vertpa[mf->v1]!=vertpa[mf->v2] && vertpa[mf->v2]!=vertpa[mf->v3])
- totin++;
- }
- }
+ for(i=0,fs=facesplit; i<totface; i++,fs++)
+ totfsplit += add_faces[*fs];
- splitdm= CDDM_from_template(dm, totesplit+totin, dm->getNumEdges(dm),totface+totfsplit, 0, 0);
+ splitdm= CDDM_from_template(dm, totesplit, 0, totface+totfsplit, 0, 0);
+ numlayer = CustomData_number_of_layers(&splitdm->faceData, CD_MTFACE);
/* copy new faces & verts (is it really this painful with custom data??) */
for(i=0; i<totvert; i++){
@@ -297,23 +641,13 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
DM_copy_vert_data(dm, splitdm, i, i, 1);
*dest = source;
}
- for(i=0; i<totface; i++){
- MFace source;
- MFace *dest;
- dm->getTessFace(dm, i, &source);
- dest = CDDM_get_tessface(splitdm, i);
-
- DM_copy_tessface_data(dm, splitdm, i, i, 1);
- *dest = source;
- }
/* override original facepa (original pointer is saved in caller function) */
facepa= MEM_callocN(sizeof(int)*(totface+totfsplit),"explode_facepa");
- memcpy(facepa,emd->facepa,totface*sizeof(int));
+ //memcpy(facepa,emd->facepa,totface*sizeof(int));
emd->facepa=facepa;
/* create new verts */
- curdupvert=totvert;
ehi= BLI_edgehashIterator_new(edgehash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
BLI_edgehashIterator_getKey(ehi, &i, &j);
@@ -333,320 +667,101 @@ static DerivedMesh * splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
BLI_edgehashIterator_free(ehi);
/* create new faces */
- curdupface=totface;
- curdupin=totesplit;
+ curdupface=0;//=totface;
+ //curdupin=totesplit;
for(i=0,fs=facesplit; i<totface; i++,fs++){
- if(*fs){
- mf=CDDM_get_tessface(splitdm,i);
-
- v1=vertpa[mf->v1];
- v2=vertpa[mf->v2];
- v3=vertpa[mf->v3];
- v4=vertpa[mf->v4];
- /* ouch! creating new faces & remapping them to new verts is no fun */
- if(*fs==1){
- df1=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- if(v1==v2){
- df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4);
- df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3);
- mf->v3=df1->v2;
- mf->v4=df1->v1;
- }
- else{
- df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2);
- df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4);
- mf->v2=df1->v1;
- mf->v3=df1->v4;
- }
-
- facepa[i]=v1;
- facepa[curdupface-1]=v3;
-
- test_index_face(df1, &splitdm->faceData, curdupface, (df1->v4 ? 4 : 3));
- }
- if(*fs==2){
- df1=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- if(v1!=v2){
- if(v1!=v4){
- df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4);
- df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2);
- df2->v1=df1->v3=mf->v2;
- df2->v3=df1->v4=mf->v4;
- df2->v2=mf->v3;
-
- mf->v2=df1->v2;
- mf->v3=df1->v1;
-
- df2->v4=mf->v4=0;
-
- facepa[i]=v1;
- }
- else{
- df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2);
- df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3);
- df1->v4=mf->v3;
- df2->v2=mf->v3;
- df2->v3=mf->v4;
-
- mf->v1=df1->v2;
- mf->v3=df1->v3;
-
- df2->v4=mf->v4=0;
-
- facepa[i]=v2;
- }
- facepa[curdupface-1]=facepa[curdupface-2]=v3;
- }
- else{
- if(v1!=v4){
- df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
- df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4);
- df1->v2=mf->v3;
-
- mf->v1=df1->v4;
- mf->v2=df1->v3;
- mf->v3=mf->v4;
-
- df2->v4=mf->v4=0;
-
- facepa[i]=v4;
- }
- else{
- df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3);
- df1->v4=edgesplit_get(edgehash, mf->v3, mf->v4);
- df1->v1=mf->v4;
- df1->v2=mf->v2;
- df2->v3=mf->v4;
-
- mf->v1=df1->v4;
- mf->v2=df1->v3;
-
- df2->v4=mf->v4=0;
-
- facepa[i]=v3;
- }
-
- facepa[curdupface-1]=facepa[curdupface-2]=v1;
- }
-
- test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
- }
- else if(*fs==3){
- df1=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df3=*mf;
- curdupface++;
-
- if(v1==v2){
- df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4);
- df3->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3);
- df3->v3=df2->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
- df3->v2=mf->v3;
- df2->v3=mf->v4;
- df1->v4=df2->v4=df3->v4=0;
-
- mf->v3=df1->v2;
- mf->v4=df1->v1;
-
- facepa[i]=facepa[curdupface-3]=v1;
- facepa[curdupface-1]=v3;
- facepa[curdupface-2]=v4;
- }
- else if(v2==v3){
- df3->v1=df2->v3=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v4);
- df2->v2=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2);
- df3->v2=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
-
- df3->v3=mf->v4;
- df2->v1=mf->v1;
- df1->v4=df2->v4=df3->v4=0;
-
- mf->v1=df1->v2;
- mf->v4=df1->v3;
-
- facepa[i]=facepa[curdupface-3]=v2;
- facepa[curdupface-1]=v4;
- facepa[curdupface-2]=v1;
- }
- else if(v3==v4){
- df3->v2=df2->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2);
- df2->v3=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3);
- df3->v3=df1->v3=edgesplit_get(edgehash, mf->v1, mf->v4);
-
- df3->v1=mf->v1;
- df2->v2=mf->v2;
- df1->v4=df2->v4=df3->v4=0;
-
- mf->v1=df1->v3;
- mf->v2=df1->v2;
-
- facepa[i]=facepa[curdupface-3]=v3;
- facepa[curdupface-1]=v1;
- facepa[curdupface-2]=v2;
- }
- else{
- df3->v1=df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2);
- df3->v3=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v2, mf->v3);
- df2->v3=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
-
- df3->v2=mf->v2;
- df2->v2=mf->v3;
- df1->v4=df2->v4=df3->v4=0;
-
- mf->v2=df1->v1;
- mf->v3=df1->v3;
-
- facepa[i]=facepa[curdupface-3]=v1;
- facepa[curdupface-1]=v2;
- facepa[curdupface-2]=v3;
- }
-
- test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
- }
- else if(*fs==4){
- if(v1!=v2 && v2!=v3){
-
- /* set new vert to face center */
- mv=CDDM_get_vert(splitdm,mf->v1);
- dupve=CDDM_get_vert(splitdm,curdupin);
- DM_copy_vert_data(splitdm,splitdm,mf->v1,curdupin,1);
- *dupve=*mv;
-
- mv=CDDM_get_vert(splitdm,mf->v2);
- VECADD(dupve->co,dupve->co,mv->co);
- mv=CDDM_get_vert(splitdm,mf->v3);
- VECADD(dupve->co,dupve->co,mv->co);
- mv=CDDM_get_vert(splitdm,mf->v4);
- VECADD(dupve->co,dupve->co,mv->co);
- mul_v3_fl(dupve->co,0.25);
-
-
- df1=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df3=*mf;
- curdupface++;
-
- df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2);
- df3->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3);
-
- df2->v1=edgesplit_get(edgehash, mf->v1, mf->v4);
- df3->v4=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
-
- df3->v1=df2->v2=df1->v4=curdupin;
-
- mf->v2=df1->v1;
- mf->v3=curdupin;
- mf->v4=df2->v1;
-
- curdupin++;
-
- facepa[i]=v1;
- facepa[curdupface-3]=v2;
- facepa[curdupface-2]=v3;
- facepa[curdupface-1]=v4;
-
- test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
-
- test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
- }
- else{
- df1=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df1=*mf;
- curdupface++;
-
- df2=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df2=*mf;
- curdupface++;
-
- df3=CDDM_get_tessface(splitdm,curdupface);
- DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
- *df3=*mf;
- curdupface++;
-
- if(v2==v3){
- df1->v1=edgesplit_get(edgehash, mf->v1, mf->v2);
- df3->v1=df1->v2=df1->v3=edgesplit_get(edgehash, mf->v2, mf->v3);
- df2->v1=df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4);
-
- df3->v3=df2->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
-
- df3->v2=mf->v3;
- df3->v4=0;
-
- mf->v2=df1->v1;
- mf->v3=df1->v4;
- mf->v4=0;
-
- facepa[i]=v1;
- facepa[curdupface-3]=facepa[curdupface-2]=v2;
- facepa[curdupface-1]=v3;
- }
- else{
- df3->v1=df2->v1=df1->v2=edgesplit_get(edgehash, mf->v1, mf->v2);
- df2->v4=df1->v3=edgesplit_get(edgehash, mf->v3, mf->v4);
- df1->v4=edgesplit_get(edgehash, mf->v1, mf->v4);
-
- df3->v3=df2->v2=edgesplit_get(edgehash, mf->v2, mf->v3);
-
- df3->v4=0;
-
- mf->v1=df1->v4;
- mf->v2=df1->v3;
- mf->v3=mf->v4;
- mf->v4=0;
-
- facepa[i]=v4;
- facepa[curdupface-3]=facepa[curdupface-2]=v1;
- facepa[curdupface-1]=v2;
- }
-
- test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
- test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
- }
- }
+ mf = dm->getTessFaceData(dm, i, CD_MFACE);
+
+ switch(*fs) {
+ case 3:
+ case 10:
+ case 11:
+ case 15:
+ SET_VERTS(1, 2, 3, 4)
+ break;
+ case 5:
+ case 6:
+ case 7:
+ SET_VERTS(2, 3, 4, 1)
+ break;
+ case 9:
+ case 13:
+ SET_VERTS(4, 1, 2, 3)
+ break;
+ case 12:
+ case 14:
+ SET_VERTS(3, 4, 1, 2)
+ break;
+ case 21:
+ case 23:
+ SET_VERTS(1, 2, 3, 4)
+ break;
+ case 19:
+ SET_VERTS(2, 3, 1, 4)
+ break;
+ case 22:
+ SET_VERTS(3, 1, 2, 4)
+ break;
+ }
- test_index_face(df1, &splitdm->faceData, i, (df1->v4 ? 4 : 3));
+ switch(*fs) {
+ case 3:
+ case 6:
+ case 9:
+ case 12:
+ remap_faces_3_6_9_12(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if(numlayer)
+ remap_uvs_3_6_9_12(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ break;
+ case 5:
+ case 10:
+ remap_faces_5_10(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if(numlayer)
+ remap_uvs_5_10(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ break;
+ case 15:
+ remap_faces_15(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if(numlayer)
+ remap_uvs_15(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ break;
+ case 7:
+ case 11:
+ case 13:
+ case 14:
+ remap_faces_7_11_13_14(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
+ if(numlayer)
+ remap_uvs_7_11_13_14(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
+ break;
+ case 19:
+ case 21:
+ case 22:
+ remap_faces_19_21_22(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
+ if(numlayer)
+ remap_uvs_19_21_22(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ break;
+ case 23:
+ remap_faces_23(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
+ if(numlayer)
+ remap_uvs_23(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
+ break;
+ case 0:
+ case 16:
+ df1 = get_dface(dm, splitdm, curdupface, i, mf);
+ facepa[curdupface] = vertpa[mf->v1];
+
+ if(df1->v4)
+ df1->flag |= ME_FACE_SEL;
+ else
+ df1->flag &= ~ME_FACE_SEL;
+ break;
}
+
+ curdupface += add_faces[*fs]+1;
+ }
+
+ for(i=0; i<curdupface; i++) {
+ mf = CDDM_get_tessface(splitdm, i);
+ test_index_face(mf, &splitdm->faceData, i, (mf->flag & ME_FACE_SEL ? 4 : 3));
}
BLI_edgehash_free(edgehash, NULL);
@@ -666,24 +781,31 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
DerivedMesh *explode, *dm=to_explode;
MFace *mf=0, *mface;
ParticleSettings *part=psmd->psys->part;
- ParticleSimulationData sim = {scene, ob, psmd->psys, psmd};
+ ParticleSimulationData sim= {0};
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
EdgeHash *vertpahash;
EdgeHashIterator *ehi;
float *vertco=0, imat[4][4];
float loc0[3], nor[3];
- float timestep, cfra;
+ float cfra;
+ /* float timestep; */
int *facepa=emd->facepa;
int totdup=0,totvert=0,totface=0,totpart=0;
int i, j, v, mindex=0;
+ MTFace *mtface = NULL, *mtf;
totface= dm->getNumTessFaces(dm);
totvert= dm->getNumVerts(dm);
mface= dm->getTessFaceArray(dm);
totpart= psmd->psys->totpart;
- timestep= psys_get_timestep(&sim);
+ sim.scene= scene;
+ sim.ob= ob;
+ sim.psys= psmd->psys;
+ sim.psmd= psmd;
+
+ /* timestep= psys_get_timestep(&sim); */
//if(part->flag & PART_GLOB_TIME)
cfra= BKE_curframe(scene);
@@ -721,6 +843,7 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
/* the final duplicated vertices */
explode= CDDM_from_template(dm, totdup, 0,totface, 0, 0);
+ mtface = CustomData_get_layer_named(&explode->faceData, CD_MTFACE, emd->uvname);
/*dupvert= CDDM_get_verts(explode);*/
/* getting back to object space */
@@ -797,16 +920,28 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
else
mindex = totvert+facepa[i];
- source.v1 = edgesplit_get(vertpahash, source.v1, mindex);
- source.v2 = edgesplit_get(vertpahash, source.v2, mindex);
- source.v3 = edgesplit_get(vertpahash, source.v3, mindex);
+ source.v1 = edgecut_get(vertpahash, source.v1, mindex);
+ source.v2 = edgecut_get(vertpahash, source.v2, mindex);
+ source.v3 = edgecut_get(vertpahash, source.v3, mindex);
if(source.v4)
- source.v4 = edgesplit_get(vertpahash, source.v4, mindex);
+ source.v4 = edgecut_get(vertpahash, source.v4, mindex);
DM_copy_face_data(dm,explode,i,i,1);
*mf = source;
+ /* override uv channel for particle age */
+ if(mtface) {
+ float age = (cfra - pa->time)/pa->lifetime;
+ /* Clamp to this range to avoid flipping to the other side of the coordinates. */
+ CLAMP(age, 0.001f, 0.999f);
+
+ mtf = mtface + i;
+
+ mtf->uv[0][0] = mtf->uv[1][0] = mtf->uv[2][0] = mtf->uv[3][0] = age;
+ mtf->uv[0][1] = mtf->uv[1][1] = mtf->uv[2][1] = mtf->uv[3][1] = 0.5f;
+ }
+
test_index_face(mf, &explode->faceData, i, (orig_v4 ? 4 : 3));
}
@@ -840,9 +975,10 @@ static ParticleSystemModifierData * findPrecedingParticlesystem(Object *ob, Modi
}
return psmd;
}
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
ExplodeModifierData *emd= (ExplodeModifierData*) md;
@@ -859,20 +995,20 @@ static DerivedMesh * applyModifier(
if(emd->facepa==0
|| psmd->flag&eParticleSystemFlag_Pars
|| emd->flag&eExplodeFlag_CalcFaces
- || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumTessFaces(dm)){
+ || MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumTessFaces(dm))
+ {
if(psmd->flag & eParticleSystemFlag_Pars)
psmd->flag &= ~eParticleSystemFlag_Pars;
if(emd->flag & eExplodeFlag_CalcFaces)
emd->flag &= ~eExplodeFlag_CalcFaces;
- createFacepa(emd,psmd,ob,derivedData);
- }
-
+ createFacepa(emd,psmd,derivedData);
+ }
/* 2. create new mesh */
- if(emd->flag & eExplodeFlag_EdgeSplit){
+ if(emd->flag & eExplodeFlag_EdgeCut){
int *facepa = emd->facepa;
- DerivedMesh *splitdm=splitEdges(emd,dm);
+ DerivedMesh *splitdm=cutEdges(emd,dm);
DerivedMesh *explode=explodeMesh(emd, psmd, md->scene, ob, splitdm);
MEM_freeN(emd->facepa);
@@ -895,6 +1031,7 @@ ModifierTypeInfo modifierType_Explode = {
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -905,6 +1042,7 @@ ModifierTypeInfo modifierType_Explode = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c
index c683bee0b35..1cce9863ccc 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim.c
@@ -30,15 +30,24 @@
*
*/
+/** \file blender/modifiers/intern/MOD_fluidsim.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_scene_types.h"
#include "DNA_object_fluidsim.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "depsgraph_private.h"
+#include "MOD_util.h"
#include "MOD_fluidsim_util.h"
#include "MEM_guardedalloc.h"
@@ -69,9 +78,10 @@ static void copyData(ModifierData *md, ModifierData *target)
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int useRenderParams,
+ int isFinalCalc)
{
FluidsimModifierData *fluidmd= (FluidsimModifierData*) md;
DerivedMesh *result = NULL;
@@ -82,17 +92,12 @@ static DerivedMesh * applyModifier(
initData(md);
if(!fluidmd->fss)
- return derivedData;
+ return dm;
}
- result = fluidsimModifier_do(fluidmd, md->scene, ob, derivedData, useRenderParams, isFinalCalc);
+ result= fluidsimModifier_do(fluidmd, md->scene, ob, dm, useRenderParams, isFinalCalc);
- if(result)
- {
- return result;
- }
-
- return derivedData;
+ return result ? result : dm;
}
static void updateDepgraph(
@@ -125,7 +130,7 @@ static void updateDepgraph(
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -143,6 +148,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -153,6 +159,7 @@ ModifierTypeInfo modifierType_Fluidsim = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c
index 17ce46129bc..7db1f003146 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_fluidsim_util.c
+ * \ingroup modifiers
+ */
+
+
#include <stddef.h>
#include <zlib.h>
@@ -42,12 +47,16 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BKE_main.h"
+#include "BKE_fluidsim.h" /* ensure definitions here match */
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
-#include "BKE_global.h" /* G.sce only */
+#include "BKE_global.h" /* G.main->name only */
+#include "MOD_fluidsim_util.h"
#include "MOD_modifiertypes.h"
#include "MEM_guardedalloc.h"
@@ -138,6 +147,8 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
fss->flag |= OB_FLUIDSIM_ACTIVE;
}
+#else
+ (void)fluidmd; /* unused */
#endif
return;
}
@@ -154,23 +165,26 @@ void fluidsim_free(FluidsimModifierData *fluidmd)
}
MEM_freeN(fluidmd->fss);
}
+#else
+ (void)fluidmd; /* unused */
#endif
+
return;
}
#ifndef DISABLE_ELBEEM
/* read .bobj.gz file into a fluidsimDerivedMesh struct */
-DerivedMesh *fluidsim_read_obj(char *filename)
+static DerivedMesh *fluidsim_read_obj(const char *filename)
{
- int wri,i,j;
- float wrf;
+ int wri = 0,i;
int gotBytes;
gzFile gzf;
int numverts = 0, numfaces = 0;
DerivedMesh *dm = NULL;
- MFace *mface;
- MVert *mvert;
- short *normals;
+ MFace *mf;
+ MVert *mv;
+ short *normals, *no_s;
+ float no[3];
// ------------------------------------------------
// get numverts + numfaces first
@@ -186,28 +200,25 @@ DerivedMesh *fluidsim_read_obj(char *filename)
numverts = wri;
// skip verts
- for(i=0; i<numverts*3; i++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- }
+ gotBytes = gzseek(gzf, numverts * 3 * sizeof(float), SEEK_CUR) != -1;
+
// read number of normals
- gotBytes = gzread(gzf, &wri, sizeof(wri));
+ if(gotBytes)
+ gotBytes = gzread(gzf, &wri, sizeof(wri));
// skip normals
- for(i=0; i<numverts*3; i++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- }
+ gotBytes = gzseek(gzf, numverts * 3 * sizeof(float), SEEK_CUR) != -1;
/* get no. of triangles */
- gotBytes = gzread(gzf, &wri, sizeof(wri));
+ if(gotBytes)
+ gotBytes = gzread(gzf, &wri, sizeof(wri));
numfaces = wri;
gzclose( gzf );
// ------------------------------------------------
- if(!numfaces || !numverts)
+ if(!numfaces || !numverts || !gotBytes)
return NULL;
gzf = gzopen(filename, "rb");
@@ -228,17 +239,10 @@ DerivedMesh *fluidsim_read_obj(char *filename)
gotBytes = gzread(gzf, &wri, sizeof(wri));
// read vertex position from file
- mvert = CDDM_get_verts(dm);
- for(i=0; i<numverts; i++)
- {
- MVert *mv = &mvert[i];
+ mv = CDDM_get_verts(dm);
- for(j=0; j<3; j++)
- {
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- mv->co[j] = wrf;
- }
- }
+ for(i=0; i<numverts; i++, mv++)
+ gotBytes = gzread(gzf, mv->co, sizeof(float) * 3);
// should be the same as numverts
gotBytes = gzread(gzf, &wri, sizeof(wri));
@@ -260,29 +264,31 @@ DerivedMesh *fluidsim_read_obj(char *filename)
}
// read normals from file (but don't save them yet)
- for(i=0; i<numverts*3; i++)
+ for(i=numverts, no_s= normals; i>0; i--, no_s += 3)
{
- gotBytes = gzread(gzf, &wrf, sizeof( wrf ));
- normals[i] = (short)(wrf*32767.0f);
+ gotBytes = gzread(gzf, no, sizeof(float) * 3);
+ normal_float_to_short_v3(no_s, no);
}
/* read no. of triangles */
gotBytes = gzread(gzf, &wri, sizeof(wri));
- if(wri!=numfaces)
+ if(wri!=numfaces) {
printf("Fluidsim: error in reading data from file.\n");
+ if(dm)
+ dm->release(dm);
+ gzclose( gzf );
+ MEM_freeN(normals);
+ return NULL;
+ }
// read triangles from file
- mface = CDDM_get_tessfaces(dm);
- for(i=0; i<numfaces; i++)
+ mf = CDDM_get_tessfaces(dm);
+ for(i=numfaces; i>0; i--, mf++)
{
- int face[4];
- MFace *mf = &mface[i];
+ int face[3];
- gotBytes = gzread(gzf, &(face[0]), sizeof( face[0] ));
- gotBytes = gzread(gzf, &(face[1]), sizeof( face[1] ));
- gotBytes = gzread(gzf, &(face[2]), sizeof( face[2] ));
- face[3] = 0;
+ gotBytes = gzread(gzf, face, sizeof(int) * 3);
// check if 3rd vertex has index 0 (not allowed in blender)
if(face[2])
@@ -297,7 +303,7 @@ DerivedMesh *fluidsim_read_obj(char *filename)
mf->v2 = face[2];
mf->v3 = face[0];
}
- mf->v4 = face[3];
+ mf->v4 = 0;
test_index_face(mf, NULL, 0, 3);
}
@@ -380,7 +386,7 @@ void fluid_estimate_memory(Object *ob, FluidsimSettings *fss, char *value)
/* read zipped fluidsim velocities into the co's of the fluidsimsettings normals struct */
-void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename)
+static void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, char *filename)
{
int wri, i, j;
float wrf;
@@ -443,7 +449,7 @@ void fluidsim_read_vel_cache(FluidsimModifierData *fluidmd, DerivedMesh *dm, cha
gzclose(gzf);
}
-DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
+static DerivedMesh *fluidsim_read_cache(DerivedMesh *orgdm, FluidsimModifierData *fluidmd, int framenr, int useRenderParams)
{
int displaymode = 0;
int curFrame = framenr - 1 /*scene->r.sfra*/; /* start with 0 at start frame */
@@ -460,7 +466,7 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
displaymode = fss->renderDisplayMode;
}
- strncpy(targetDir, fss->surfdataPath, FILE_MAXDIR);
+ BLI_strncpy(targetDir, fss->surfdataPath, sizeof(targetDir));
// use preview or final mesh?
if(displaymode==1)
@@ -477,11 +483,10 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
strcat(targetDir,"fluidsurface_final_####");
}
- BLI_path_abs(targetDir, G.sce);
+ BLI_path_abs(targetDir, G.main->name);
BLI_path_frame(targetDir, curFrame, 0); // fixed #frame-no
- strcpy(targetFile,targetDir);
- strcat(targetFile, ".bobj.gz");
+ BLI_snprintf(targetFile, sizeof(targetFile), "%s.bobj.gz", targetDir);
dm = fluidsim_read_obj(targetFile);
@@ -534,10 +539,12 @@ DerivedMesh *fluidsim_read_cache(Object *ob, DerivedMesh *orgdm, FluidsimModifie
return dm;
}
-
#endif // DISABLE_ELBEEM
-DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Object *ob, DerivedMesh *dm, int useRenderParams, int isFinalCalc)
+DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene,
+ Object *UNUSED(ob),
+ DerivedMesh *dm,
+ int useRenderParams, int UNUSED(isFinalCalc))
{
#ifndef DISABLE_ELBEEM
DerivedMesh *result = NULL;
@@ -558,7 +565,7 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Ob
// timescale not supported yet
// clmd->sim_parms->timescale= timescale;
-
+
// support reversing of baked fluid frames here
if((fss->flag & OB_FLUIDSIM_REVERSE) && (fss->lastgoodframe >= 0))
{
@@ -567,42 +574,17 @@ DerivedMesh *fluidsimModifier_do(FluidsimModifierData *fluidmd, Scene *scene, Ob
}
/* try to read from cache */
- if(((fss->lastgoodframe >= framenr) || (fss->lastgoodframe < 0)) && (result = fluidsim_read_cache(ob, dm, fluidmd, framenr, useRenderParams)))
- {
- // fss->lastgoodframe = framenr; // set also in src/fluidsim.c
+ /* if the frame is there, fine, otherwise don't do anything */
+ if((result = fluidsim_read_cache(dm, fluidmd, framenr, useRenderParams)))
return result;
- }
- else
- {
- // display last known good frame
- if(fss->lastgoodframe >= 0)
- {
- if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
- {
- return result;
- }
-
- // it was supposed to be a valid frame but it isn't!
- fss->lastgoodframe = framenr - 1;
-
-
- // this could be likely the case when you load an old fluidsim
- if((result = fluidsim_read_cache(ob, dm, fluidmd, fss->lastgoodframe, useRenderParams)))
- {
- return result;
- }
- }
-
- result = CDDM_copy(dm, 1);
-
- if(result)
- {
- return result;
- }
- }
return dm;
#else
+ /* unused */
+ (void)fluidmd;
+ (void)scene;
+ (void)dm;
+ (void)useRenderParams;
return NULL;
#endif
}
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.h b/source/blender/modifiers/intern/MOD_fluidsim_util.h
index a06c74cb8dd..f8af8e6f583 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.h
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/modifiers/intern/MOD_fluidsim_util.h
+ * \ingroup modifiers
+ */
+
+
#ifndef MOD_FLUIDSIM_UTIL_H
#define MOD_FLUIDSIM_UTIL_H
@@ -42,6 +47,6 @@ void fluidsim_free(struct FluidsimModifierData *fluidmd);
struct DerivedMesh *fluidsimModifier_do(struct FluidsimModifierData *fluidmd,
struct Scene *scene, struct Object *ob, struct DerivedMesh *dm,
int useRenderParams, int isFinalCalc);
-
+
#endif
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index 2c9ae311585..2a85378f987 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -30,20 +30,28 @@
*
*/
+/** \file blender/modifiers/intern/MOD_hook.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_action.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_deform.h"
+
#include "depsgraph_private.h"
#include "MEM_guardedalloc.h"
+#include "MOD_util.h"
static void initData(ModifierData *md)
{
@@ -68,13 +76,14 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(thmd->subtarget, hmd->subtarget, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
HookModifierData *hmd = (HookModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(!hmd->indexar && hmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(hmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
+ if(hmd->indexar) dataMask |= CD_MASK_ORIGINDEX;
return dataMask;
}
@@ -86,7 +95,7 @@ static void freeData(ModifierData *md)
if (hmd->indexar) MEM_freeN(hmd->indexar);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
HookModifierData *hmd = (HookModifierData*) md;
@@ -103,8 +112,10 @@ static void foreachObjectLink(
walk(userData, ob, &hmd->object);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
HookModifierData *hmd = (HookModifierData*) md;
@@ -118,15 +129,37 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static float hook_falloff(float *co_1, float *co_2, const float falloff_squared, float fac)
+{
+ if(falloff_squared) {
+ float len_squared = len_squared_v3v3(co_1, co_2);
+ if(len_squared > falloff_squared) {
+ return 0.0f;
+ }
+ else if(len_squared > 0.0) {
+ return fac * (1.0 - (len_squared / falloff_squared));
+ }
+ }
+
+ return fac;
+}
+
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
HookModifierData *hmd = (HookModifierData*) md;
bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
float vec[3], mat[4][4], dmat[4][4];
- int i;
- DerivedMesh *dm = derivedData;
+ int i, *index_pt;
+ const float falloff_squared= hmd->falloff * hmd->falloff; /* for faster comparisons */
+
+ int max_dvert= 0;
+ MDeformVert *dvert= NULL;
+ int defgrp_index = -1;
/* get world-space matrix of target, corrected for the space the verts are in */
if (hmd->subtarget[0] && pchan) {
@@ -141,98 +174,90 @@ static void deformVerts(
mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv,
NULL, NULL, NULL, NULL, NULL);
- /* vertex indices? */
- if(hmd->indexar) {
- for(i = 0; i < hmd->totindex; i++) {
- int index = hmd->indexar[i];
-
- /* This should always be true and I don't generally like
- * "paranoid" style code like this, but old files can have
- * indices that are out of range because old blender did
- * not correct them on exit editmode. - zr
- */
- if(index < numVerts) {
- float *co = vertexCos[index];
- float fac = hmd->force;
-
- /* if DerivedMesh is present and has original index data,
- * use it
- */
- if(dm && dm->getVertDataArray(dm, CD_ORIGINDEX)) {
+ if((defgrp_index= defgroup_name_index(ob, hmd->name)) != -1) {
+ Mesh *me = ob->data;
+ if(dm) {
+ dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ if(dvert) {
+ max_dvert = numVerts;
+ }
+ }
+ else if(me->dvert) {
+ dvert= me->dvert;
+ if(dvert) {
+ max_dvert = me->totvert;
+ }
+ }
+ }
+
+ /* Regarding index range checking below.
+ *
+ * This should always be true and I don't generally like
+ * "paranoid" style code like this, but old files can have
+ * indices that are out of range because old blender did
+ * not correct them on exit editmode. - zr
+ */
+
+ if(hmd->force == 0.0f) {
+ /* do nothing, avoid annoying checks in the loop */
+ }
+ else if(hmd->indexar) { /* vertex indices? */
+ const float fac_orig= hmd->force;
+ float fac;
+ const int *origindex_ar;
+
+ /* if DerivedMesh is present and has original index data,
+ * use it
+ */
+ if(dm && (origindex_ar= dm->getVertDataArray(dm, CD_ORIGINDEX))) {
+ for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
+ if(*index_pt < numVerts) {
int j;
- int orig_index;
- for(j = 0; j < numVerts; ++j) {
- fac = hmd->force;
- orig_index = *(int *)dm->getVertData(dm, j,
- CD_ORIGINDEX);
- if(orig_index == index) {
- co = vertexCos[j];
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
- if(fac != 0.0) {
- mul_v3_m4v3(vec, mat, co);
- interp_v3_v3v3(co, co, vec, fac);
+ for(j = 0; j < numVerts; j++) {
+ if(origindex_ar[j] == *index_pt) {
+ float *co = vertexCos[j];
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ if(dvert)
+ fac *= defvert_find_weight(dvert+j, defgrp_index);
+
+ if(fac) {
+ mul_v3_m4v3(vec, mat, co);
+ interp_v3_v3v3(co, co, vec, fac);
+ }
}
}
}
- } else {
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
-
- if(fac != 0.0) {
- mul_v3_m4v3(vec, mat, co);
- interp_v3_v3v3(co, co, vec, fac);
- }
}
}
}
- }
- else if(hmd->name[0]) { /* vertex group hook */
- Mesh *me = ob->data;
- int use_dverts = 0;
- int maxVerts = 0;
- int defgrp_index = defgroup_name_index(ob, hmd->name);
-
- if(dm) {
- if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) {
- maxVerts = dm->getNumVerts(dm);
- use_dverts = 1;
+ else { /* missing dm or ORIGINDEX */
+ for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
+ if(*index_pt < numVerts) {
+ float *co = vertexCos[*index_pt];
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ if(dvert)
+ fac *= defvert_find_weight(dvert+(*index_pt), defgrp_index);
+
+ if(fac) {
+ mul_v3_m4v3(vec, mat, co);
+ interp_v3_v3v3(co, co, vec, fac);
+ }
+ }
+ }
}
}
- else if(me->dvert) {
- maxVerts = me->totvert;
- use_dverts = 1;
- }
+ }
+ else if(dvert) { /* vertex group hook */
+ const float fac_orig= hmd->force;
- if(defgrp_index >= 0 && use_dverts) {
- MDeformVert *dvert = me->dvert;
- int i;
+ for(i = 0; i < max_dvert; i++, dvert++) {
float fac;
+ float *co = vertexCos[i];
- for(i = 0; i < maxVerts; i++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT);
-
- fac= defvert_find_weight(dvert, defgrp_index);
-
- if(fac > 0.0f) {
- float *co = vertexCos[i];
-
- if(hmd->falloff != 0.0) {
- float len = len_v3v3(co, hmd->cent);
- if(len > hmd->falloff) fac = 0.0;
- else if(len > 0.0)
- fac *= sqrt(1.0 - len / hmd->falloff);
- }
-
+ if((fac= hook_falloff(hmd->cent, co, falloff_squared, fac_orig))) {
+ fac *= defvert_find_weight(dvert, defgrp_index);
+ if(fac) {
mul_v3_m4v3(vec, mat, co);
interp_v3_v3v3(co, co, vec, fac);
}
@@ -249,7 +274,7 @@ static void deformVertsEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
- deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
+ deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
if(!derivedData) dm->release(dm);
}
@@ -264,6 +289,7 @@ ModifierTypeInfo modifierType_Hook = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -274,6 +300,7 @@ ModifierTypeInfo modifierType_Hook = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 4270f2ff6e8..22427d04338 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -30,10 +30,18 @@
*
*/
+/** \file blender/modifiers/intern/MOD_lattice.c
+ * \ingroup modifiers
+ */
+
+
#include <string.h>
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
@@ -52,18 +60,18 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tlmd->name, lmd->name, 32);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
LatticeModifierData *lmd = (LatticeModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(lmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(lmd->name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(userRenderParams))
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -80,8 +88,10 @@ static void foreachObjectLink(
walk(userData, ob, &lmd->object);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -93,9 +103,12 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -129,6 +142,7 @@ ModifierTypeInfo modifierType_Lattice = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -139,6 +153,7 @@ ModifierTypeInfo modifierType_Lattice = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c
index 6a62ce645d8..7b969f9322e 100644
--- a/source/blender/modifiers/intern/MOD_mask.c
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -30,8 +30,14 @@
*
*/
+/** \file blender/modifiers/intern/MOD_mask.c
+ * \ingroup modifiers
+ */
+
+
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "DNA_armature_types.h"
@@ -46,18 +52,20 @@
#include "depsgraph_private.h"
+#include "MOD_util.h"
static void copyData(ModifierData *md, ModifierData *target)
{
MaskModifierData *mmd = (MaskModifierData*) md;
MaskModifierData *tmmd = (MaskModifierData*) target;
- strcpy(tmmd->vgroup, mmd->vgroup);
+ BLI_strncpy(tmmd->vgroup, mmd->vgroup, sizeof(tmmd->vgroup));
+ tmmd->flag = mmd->flag;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
- return (1 << CD_MDEFORMVERT);
+ return CD_MASK_MDEFORMVERT;
}
static void foreachObjectLink(
@@ -69,8 +77,10 @@ static void foreachObjectLink(
walk(userData, ob, &mmd->ob_arm);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
- Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
MaskModifierData *mmd = (MaskModifierData *)md;
@@ -84,8 +94,9 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
MaskModifierData *mmd= (MaskModifierData *)md;
DerivedMesh *dm= derivedData, *result= NULL;
@@ -129,7 +140,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
return derivedData;
/* hashes for finding mapping of:
- * - vgroups to indicies -> vgroupHash (string, int)
+ * - vgroups to indices -> vgroupHash (string, int)
* - bones to vgroup indices -> boneHash (index of vgroup, dummy)
*/
vgroupHash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "mask vgroup gh");
@@ -398,6 +409,7 @@ ModifierTypeInfo modifierType_Mask = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -408,6 +420,7 @@ ModifierTypeInfo modifierType_Mask = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index b89db2fdc2d..a34eff6120c 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -30,11 +30,17 @@
*
*/
+/** \file blender/modifiers/intern/MOD_meshdeform.c
+ * \ingroup modifiers
+ */
+
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_global.h"
@@ -78,18 +84,18 @@ static void copyData(ModifierData *md, ModifierData *target)
tmmd->object = mmd->object;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(mmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(mmd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -106,9 +112,10 @@ static void foreachObjectLink(
walk(userData, ob, &mmd->object);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
@@ -205,7 +212,7 @@ static void meshdeformModifier_do(
/* if we don't have one computed, use derivedmesh from data
* without any modifiers */
if(!cagedm) {
- cagedm= get_dm(md->scene, mmd->object, NULL, NULL, NULL, 0);
+ cagedm= get_dm(mmd->object, NULL, NULL, NULL, 0);
if(cagedm)
cagedm->needsFree= 1;
}
@@ -339,11 +346,14 @@ static void meshdeformModifier_do(
cagedm->release(cagedm);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);;
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
@@ -353,10 +363,13 @@ static void deformVerts(
dm->release(dm);
}
-static void deformVertsEM(ModifierData *md, Object *ob, struct BMEditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);;
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
@@ -437,6 +450,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -447,6 +461,7 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index f393d834874..2540a1e3b3b 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -71,8 +71,9 @@ static void foreachObjectLink(
void *userData)
{
MirrorModifierData *mmd = (MirrorModifierData*) md;
-
- walk(userData, ob, &mmd->mirror_ob);
+
+ if (mmd->mirror_ob)
+ walk(userData, ob, &mmd->mirror_ob);
}
static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene,
@@ -233,7 +234,7 @@ static DerivedMesh *applyModifier(
}
static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
+ ModifierData *md, Object *ob, struct BMEditMesh *editData,
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
@@ -254,6 +255,7 @@ ModifierTypeInfo modifierType_Mirror = {
/* copyData */ copyData,
/* deformVerts */ 0,
/* deformVertsEM */ 0,
+ /* deformMatrices */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 699ab44a75c..b61302d118b 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_multires.c
+ * \ingroup modifiers
+ */
+
+
#include <stddef.h>
#include "BKE_cdderivedmesh.h"
@@ -40,6 +45,8 @@
#include "DNA_mesh_types.h"
+#include "MOD_util.h"
+
static void initData(ModifierData *md)
{
MultiresModifierData *mmd = (MultiresModifierData*)md;
@@ -59,6 +66,8 @@ static void copyData(ModifierData *md, ModifierData *target)
tmmd->sculptlvl = mmd->sculptlvl;
tmmd->renderlvl = mmd->renderlvl;
tmmd->totlvl = mmd->totlvl;
+ tmmd->simple = mmd->simple;
+ tmmd->flags = mmd->flags;
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
@@ -72,9 +81,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm,
if(mmd->totlvl) {
if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
- /* multires can't work without displacement layer */
- modifier_setError(md, "Modifier needs mesh with displacement data.");
- return dm;
+ /* multires always needs a displacement layer */
+ CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, NULL, me->totface);
}
}
@@ -108,6 +116,7 @@ ModifierTypeInfo modifierType_Multires = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -118,6 +127,7 @@ ModifierTypeInfo modifierType_Multires = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c
index 0c749b79f5a..bebb9b58774 100644
--- a/source/blender/modifiers/intern/MOD_none.c
+++ b/source/blender/modifiers/intern/MOD_none.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,13 +34,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/modifiers/intern/MOD_none.c
+ * \ingroup modifiers
+ */
+
+
+
+
+#include "BLI_utildefines.h"
+
#include "MOD_modifiertypes.h"
/* We only need to define isDisabled; because it always returns 1,
* no other functions will be called
*/
-static int isDisabled(ModifierData *md, int userRenderParams)
+static int isDisabled(ModifierData *UNUSED(md), int UNUSED(userRenderParams))
{
return 1;
}
@@ -55,6 +64,7 @@ ModifierTypeInfo modifierType_None = {
/* copyData */ 0,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -65,6 +75,7 @@ ModifierTypeInfo modifierType_None = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index 100a22603d5..92c8b089360 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_particleinstance.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "MEM_guardedalloc.h"
@@ -37,13 +42,15 @@
#include "BLI_math.h"
#include "BLI_listbase.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
-#include "BKE_utildefines.h"
+
+#include "MOD_util.h"
#include "depsgraph_private.h"
@@ -72,12 +79,14 @@ static void copyData(ModifierData *md, ModifierData *target)
tpimd->random_position = pimd->random_position;
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 0;
}
static void updateDepgraph(ModifierData *md, DagForest *forest,
- struct Scene *scene,Object *ob, DagNode *obNode)
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
@@ -98,9 +107,10 @@ static void foreachObjectLink(ModifierData *md, Object *ob,
walk(userData, ob, &pimd->ob);
}
-static DerivedMesh * applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData, *result;
ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
@@ -310,10 +320,9 @@ static DerivedMesh * applyModifier(
return dm;
}
-
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -331,6 +340,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -341,6 +351,7 @@ ModifierTypeInfo modifierType_ParticleInstance = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index 4feeef54882..80c96fd8553 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -30,10 +30,18 @@
*
*/
+/** \file blender/modifiers/intern/MOD_particlesystem.c
+ * \ingroup modifiers
+ */
+
+
#include "stddef.h"
#include "DNA_material_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_material.h"
#include "BKE_modifier.h"
@@ -77,41 +85,36 @@ static void copyData(ModifierData *md, ModifierData *target)
tpsmd->psys = psmd->psys;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
CustomDataMask dataMask = 0;
- Material *ma;
MTex *mtex;
int i;
if(!psmd->psys->part)
return 0;
- ma= give_current_material(ob, psmd->psys->part->omat);
- if(ma) {
- for(i=0; i<MAX_MTEX; i++) {
- mtex=ma->mtex[i];
- if(mtex && (ma->septex & (1<<i))==0)
- if(mtex->pmapto && (mtex->texco & TEXCO_UV))
- dataMask |= (1 << CD_MTFACE);
- }
+ for(i=0; i<MAX_MTEX; i++) {
+ mtex = psmd->psys->part->mtex[i];
+ if(mtex && mtex->mapto && (mtex->texco & TEXCO_UV))
+ dataMask |= CD_MASK_MTFACE;
}
if(psmd->psys->part->tanfac!=0.0)
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
/* ask for vertexgroups if we need them */
for(i=0; i<PSYS_TOT_VG; i++){
if(psmd->psys->vgroup[i]){
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
break;
}
}
/* particles only need this if they are after a non deform modifier, and
* the modifier stack will only create them in that case. */
- dataMask |= CD_MASK_ORIGSPACE;
+ dataMask |= CD_MASK_ORIGSPACE|CD_MASK_ORIGINDEX;
dataMask |= CD_MASK_ORCO;
@@ -119,9 +122,12 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
}
/* saves the current emitter state for a particle system and calculates particles */
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
@@ -137,7 +143,7 @@ static void deformVerts(
return;
if(dm==0) {
- dm= get_dm(md->scene, ob, NULL, NULL, vertexCos, 1);
+ dm= get_dm(ob, NULL, NULL, vertexCos, 1);
if(!dm)
return;
@@ -150,6 +156,14 @@ static void deformVerts(
psmd->dm->needsFree = 1;
psmd->dm->release(psmd->dm);
}
+ else if(psmd->flag & eParticleSystemFlag_file_loaded) {
+ /* in file read dm just wasn't saved in file so no need to reset everything */
+ psmd->flag &= ~eParticleSystemFlag_file_loaded;
+ }
+ else {
+ /* no dm before, so recalc particles fully */
+ psys->recalc |= PSYS_RECALC_RESET;
+ }
/* make new dm */
psmd->dm=CDDM_copy(dm, 0);
@@ -168,10 +182,8 @@ static void deformVerts(
if(psmd->dm->getNumVerts(psmd->dm)!=psmd->totdmvert ||
psmd->dm->getNumEdges(psmd->dm)!=psmd->totdmedge ||
psmd->dm->getNumTessFaces(psmd->dm)!=psmd->totdmface){
- /* in file read dm hasn't really changed but just wasn't saved in file */
psys->recalc |= PSYS_RECALC_RESET;
- psmd->flag |= eParticleSystemFlag_DM_changed;
psmd->totdmvert= psmd->dm->getNumVerts(psmd->dm);
psmd->totdmedge= psmd->dm->getNumEdges(psmd->dm);
@@ -182,7 +194,6 @@ static void deformVerts(
psmd->flag &= ~eParticleSystemFlag_psys_updated;
particle_system_update(md->scene, ob, psys);
psmd->flag |= eParticleSystemFlag_psys_updated;
- psmd->flag &= ~eParticleSystemFlag_DM_changed;
}
}
@@ -218,6 +229,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
/* deformVertsEM */ 0 /* deformVertsEM */ ,
+ /* deformMatrices */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
/* applyModifierEM */ 0,
@@ -227,6 +239,7 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 7cec359fd33..68ad5437585 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -30,12 +30,19 @@
*
*/
+/** \file blender/modifiers/intern/MOD_screw.c
+ * \ingroup modifiers
+ */
+
+
/* Screw modifier: revolves the edges about an axis */
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
@@ -128,8 +135,9 @@ static void copyData(ModifierData *md, ModifierData *target)
}
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+ DerivedMesh *derivedData,
+ int useRenderParams,
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm= derivedData;
DerivedMesh *result;
@@ -140,7 +148,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int step;
int i, j;
int i1,i2;
- int step_tot= ltmd->steps;
+ int step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
const int do_flip = ltmd->flag & MOD_SCREW_NORMAL_FLIP ? 1 : 0;
int maxVerts=0, maxEdges=0, maxFaces=0;
int totvert= dm->getNumVerts(dm);
@@ -166,17 +174,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
ScrewVertConnect *vc, *vc_tmp, *vert_connect= NULL;
- float mat[4][4] = {{0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 0.0f},
- {0.0f, 0.0f, 0.0f, 1.0f}};
-
/* dont do anything? */
if (!totvert)
return CDDM_from_template(dm, 0, 0, 0, 0, 0);
- step_tot= useRenderParams ? ltmd->render_steps : ltmd->steps;
-
switch(ltmd->axis) {
case 0:
other_axis_1=1;
@@ -221,7 +222,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* angle */
-#if 0 // cant incluide this, not pradictable enough, though quite fun,.
+#if 0 // cant incluide this, not predictable enough, though quite fun,.
if(ltmd->flag & MOD_SCREW_OBJECT_ANGLE) {
float mtx3_tx[3][3];
copy_m3_m4(mtx3_tx, mtx_tx);
@@ -270,7 +271,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
step_tot = ((step_tot + 1) * ltmd->iter) - (ltmd->iter - 1);
/* will the screw be closed?
- * Note! smaller then FLT_EPSILON*100 gives problems with float precission so its never closed. */
+ * Note! smaller then FLT_EPSILON*100 gives problems with float precision so its never closed. */
if (fabs(screw_ofs) <= (FLT_EPSILON*100) && fabs(fabs(angle) - (M_PI * 2)) <= (FLT_EPSILON*100)) {
close= 1;
step_tot--;
@@ -304,6 +305,8 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
medge_new = result->getEdgeArray(result);
origindex= result->getTessFaceDataArray(result, CD_ORIGINDEX);
+
+ DM_copy_vert_data(dm, result, 0, 0, totvert); /* copy first otherwise this overwrites our own vertex normals */
/* Set the locations of the first set of verts */
@@ -435,15 +438,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* find the first vert */
vc= vert_connect;
for (i=0; i < totvert; i++, vc++) {
- int v_best=-1, ed_loop_closed=0; /* vert and vert new */
- int ed_loop_flip= 0; /* compiler complains if not initialized, but it should be initialized below */
- float fl= -1.0f;
- ScrewVertIter lt_iter;
-
/* Now do search for connected verts, order all edges and flip them
* so resulting faces are flipped the right way */
vc_tot_linked= 0; /* count the number of linked verts for this loop */
if (vc->flag == 0) {
+ int v_best=-1, ed_loop_closed=0; /* vert and vert new */
+ ScrewVertIter lt_iter;
+ int ed_loop_flip= 0; /* compiler complains if not initialized, but it should be initialized below */
+ float fl= -1.0f;
+
/*printf("Loop on connected vert: %i\n", i);*/
for(j=0; j<2; j++) {
@@ -665,13 +668,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
}
/* done with edge connectivity based normal flipping */
- DM_copy_vert_data(dm, result, 0, 0, totvert);
-
/* Add Faces */
for (step=1; step < step_tot; step++) {
const int varray_stride= totvert * step;
float step_angle;
float nor_tx[3];
+ float mat[4][4];
/* Rotation Matrix */
step_angle= (angle / (step_tot - (!close))) * step;
@@ -831,12 +833,15 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
dm = CDDM_copy(result, 1); /*builds ngon faces from tess (mface) faces*/
result->needsFree = 1;
result->release(result);
+
+ return dm;
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest,
- struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ScrewModifierData *ltmd= (ScrewModifierData*) md;
@@ -861,13 +866,15 @@ static void foreachObjectLink(
/* This dosnt work with material*/
static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
+ ModifierData *md,
+ Object *ob,
+ struct EditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 0;
}
@@ -886,6 +893,7 @@ ModifierTypeInfo modifierType_Screw = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -896,6 +904,7 @@ ModifierTypeInfo modifierType_Screw = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_shapekey.c b/source/blender/modifiers/intern/MOD_shapekey.c
index f73dcc25235..94d23de6573 100644
--- a/source/blender/modifiers/intern/MOD_shapekey.c
+++ b/source/blender/modifiers/intern/MOD_shapekey.c
@@ -30,10 +30,18 @@
*
*/
+/** \file blender/modifiers/intern/MOD_shapekey.c
+ * \ingroup modifiers
+ */
+
+
#include "BLI_math.h"
#include "DNA_key_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_key.h"
#include "BKE_particle.h"
@@ -42,9 +50,12 @@
#include "MEM_guardedalloc.h"
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
KeyBlock *kb= ob_get_keyblock(ob);
float (*deformedVerts)[3];
@@ -58,9 +69,33 @@ static void deformVerts(
}
}
-static void deformVertsEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformMatrices(ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
+{
+ Key *key= ob_get_key(ob);
+ KeyBlock *kb= ob_get_keyblock(ob);
+ float scale[3][3];
+
+ (void)vertexCos; /* unused */
+
+ if(kb && kb->totelem==numVerts && kb!=key->refkey) {
+ int a;
+
+ if(ob->shapeflag & OB_SHAPE_LOCK) scale_m3_fl(scale, 1);
+ else scale_m3_fl(scale, kb->curval);
+
+ for(a=0; a<numVerts; a++)
+ copy_m3_m3(defMats[a], scale);
+ }
+
+ deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
+}
+
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
Key *key= ob_get_key(ob);
@@ -68,17 +103,21 @@ static void deformVertsEM(
deformVerts(md, ob, derivedData, vertexCos, numVerts, 0, 0);
}
-static void deformMatricesEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData, float (*vertexCos)[3],
- float (*defMats)[3][3], int numVerts)
+static void deformMatricesEM(ModifierData *UNUSED(md), Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ float (*defMats)[3][3],
+ int numVerts)
{
Key *key= ob_get_key(ob);
KeyBlock *kb= ob_get_keyblock(ob);
float scale[3][3];
- int a;
+
+ (void)vertexCos; /* unused */
if(kb && kb->totelem==numVerts && kb!=key->refkey) {
+ int a;
scale_m3_fl(scale, kb->curval);
for(a=0; a<numVerts; a++)
@@ -86,7 +125,6 @@ static void deformMatricesEM(
}
}
-
ModifierTypeInfo modifierType_ShapeKey = {
/* name */ "ShapeKey",
/* structName */ "ShapeKeyModifierData",
@@ -95,18 +133,20 @@ ModifierTypeInfo modifierType_ShapeKey = {
/* flags */ eModifierTypeFlag_AcceptsCVs
| eModifierTypeFlag_SupportsEditmode,
- /* copyData */ 0,
+ /* copyData */ NULL,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
- /* initData */ 0,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL
};
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index 6526be4cb53..cfd12833a38 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -30,8 +30,16 @@
*
*/
+/** \file blender/modifiers/intern/MOD_shrinkwrap.c
+ * \ingroup modifiers
+ */
+
+
#include <string.h>
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
#include "BKE_shrinkwrap.h"
@@ -62,7 +70,7 @@ static void copyData(ModifierData *md, ModifierData *target)
tsmd->target = smd->target;
tsmd->auxTarget = smd->auxTarget;
- strcpy(tsmd->vgroup_name, smd->vgroup_name);
+ BLI_strncpy(tsmd->vgroup_name, smd->vgroup_name, sizeof(tsmd->vgroup_name));
tsmd->keepDist = smd->keepDist;
tsmd->shrinkType= smd->shrinkType;
@@ -71,23 +79,23 @@ static void copyData(ModifierData *md, ModifierData *target)
tsmd->subsurfLevels = smd->subsurfLevels;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
if(smd->vgroup_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
if(smd->shrinkType == MOD_SHRINKWRAP_PROJECT
&& smd->projAxis == MOD_SHRINKWRAP_PROJECT_OVER_NORMAL)
- dataMask |= (1 << CD_MVERT);
+ dataMask |= CD_MASK_MVERT;
return dataMask;
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
return !smd->target;
@@ -102,16 +110,21 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk,
walk(userData, ob, &smd->auxTarget);
}
-static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
/* ensure we get a CDDM with applied vertex coords */
if(dataMask)
- dm= get_cddm(md->scene, ob, NULL, dm, vertexCos);
+ dm= get_cddm(ob, NULL, dm, vertexCos);
- shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
@@ -124,15 +137,18 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editDat
/* ensure we get a CDDM with applied vertex coords */
if(dataMask)
- dm= get_cddm(md->scene, ob, editData, dm, vertexCos);
+ dm= get_cddm(ob, editData, dm, vertexCos);
- shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, md->scene, ob, dm, vertexCos, numVerts);
+ shrinkwrapModifier_deform((ShrinkwrapModifierData*)md, ob, dm, vertexCos, numVerts);
if(dm != derivedData)
dm->release(dm);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
ShrinkwrapModifierData *smd = (ShrinkwrapModifierData*) md;
@@ -156,6 +172,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -166,6 +183,7 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index c64fec4075d..0150322ae8c 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -30,17 +30,24 @@
*
*/
+/** \file blender/modifiers/intern/MOD_simpledeform.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "BLI_math.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_lattice.h"
#include "BKE_modifier.h"
#include "BKE_deform.h"
#include "BKE_shrinkwrap.h"
-#include "BKE_utildefines.h"
+
#include "depsgraph_private.h"
@@ -146,7 +153,7 @@ static void simpleDeform_bend(const float factor, const float dcut[3], float *co
/* simple deform modifier */
-void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
{
static const float lock_axis[2] = {0.0f, 0.0f};
@@ -287,17 +294,17 @@ static void copyData(ModifierData *md, ModifierData *target)
tsmd->originOpts= smd->originOpts;
tsmd->factor= smd->factor;
memcpy(tsmd->limit, smd->limit, sizeof(tsmd->limit));
- strcpy(tsmd->vgroup_name, smd->vgroup_name);
+ BLI_strncpy(tsmd->vgroup_name, smd->vgroup_name, sizeof(tsmd->vgroup_name));
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
if(smd->vgroup_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -308,7 +315,10 @@ static void foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *u
walk(userData, ob, &smd->origin);
}
-static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
SimpleDeformModifierData *smd = (SimpleDeformModifierData*)md;
@@ -316,7 +326,12 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, struct Scene *sc
dag_add_relation(forest, dag_get_node(forest, smd->origin), obNode, DAG_RL_OB_DATA, "SimpleDeform Modifier");
}
-static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
@@ -324,7 +339,7 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
/* we implement requiredDataMask but thats not really usefull since
mesh_calc_modifiers pass a NULL derivedData */
if(dataMask)
- dm= get_dm(md->scene, ob, NULL, dm, NULL, 0);
+ dm= get_dm(ob, NULL, dm, NULL, 0);
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
@@ -332,7 +347,11 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
dm->release(dm);
}
-static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData, DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+static void deformVertsEM(ModifierData *md, Object *ob,
+ struct EditMesh *editData,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts)
{
DerivedMesh *dm = derivedData;
CustomDataMask dataMask = requiredDataMask(ob, md);
@@ -340,7 +359,7 @@ static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editDat
/* we implement requiredDataMask but thats not really usefull since
mesh_calc_modifiers pass a NULL derivedData */
if(dataMask)
- dm= get_dm(md->scene, ob, editData, dm, NULL, 0);
+ dm= get_dm(ob, editData, dm, NULL, 0);
SimpleDeformModifier_do((SimpleDeformModifierData*)md, ob, dm, vertexCos, numVerts);
@@ -362,6 +381,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -372,6 +392,7 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c
index 25153de7be4..46f0483dbff 100644
--- a/source/blender/modifiers/intern/MOD_smoke.c
+++ b/source/blender/modifiers/intern/MOD_smoke.c
@@ -30,11 +30,22 @@
*
*/
+/** \file blender/modifiers/intern/MOD_smoke.c
+ * \ingroup modifiers
+ */
+
+
#include "stddef.h"
#include "MEM_guardedalloc.h"
+#include "DNA_group_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_smoke_types.h"
+
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_modifier.h"
@@ -71,29 +82,34 @@ static void freeData(ModifierData *md)
smokeModifier_free (smd);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
SmokeModifierData *smd = (SmokeModifierData*) md;
- DerivedMesh *dm = dm= get_cddm(md->scene, ob, NULL, derivedData, vertexCos);
+ DerivedMesh *dm = get_cddm(ob, NULL, derivedData, vertexCos);
- smokeModifier_do(smd, md->scene, ob, dm, useRenderParams, isFinalCalc);
+ smokeModifier_do(smd, md->scene, ob, dm);
if(dm != derivedData)
dm->release(dm);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, struct Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *scene,
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
- /*SmokeModifierData *smd = (SmokeModifierData *) md;
+ SmokeModifierData *smd = (SmokeModifierData *) md;
+
if(smd && (smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
{
if(smd->domain->fluid_group)
@@ -107,7 +123,7 @@ static void updateDepgraph(
SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(go->ob, eModifierType_Smoke);
// check for initialized smoke object
- if(smd2 && (smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow)
+ if(smd2 && (((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) || ((smd->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)))
{
DagNode *curNode = dag_get_node(forest, go->ob);
dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow");
@@ -115,8 +131,20 @@ static void updateDepgraph(
}
}
}
+ else {
+ Base *base = scene->base.first;
+
+ for(; base; base = base->next) {
+ SmokeModifierData *smd2 = (SmokeModifierData *)modifiers_findByType(base->object, eModifierType_Smoke);
+
+ if(smd2 && (((smd2->type & MOD_SMOKE_TYPE_FLOW) && smd2->flow) || ((smd->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)))
+ {
+ DagNode *curNode = dag_get_node(forest, base->object);
+ dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Smoke Flow");
+ }
+ }
+ }
}
- */
}
@@ -131,6 +159,7 @@ ModifierTypeInfo modifierType_Smoke = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -141,6 +170,7 @@ ModifierTypeInfo modifierType_Smoke = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index a42bf8abbaf..526b54d1cf8 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -30,14 +30,21 @@
*
*/
+/** \file blender/modifiers/intern/MOD_smooth.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
+
#include "MEM_guardedalloc.h"
#include "MOD_modifiertypes.h"
@@ -65,7 +72,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(tsmd->defgrp_name, smd->defgrp_name, 32);
}
-static int isDisabled(ModifierData *md, int useRenderParams)
+static int isDisabled(ModifierData *md, int UNUSED(useRenderParams))
{
SmoothModifierData *smd = (SmoothModifierData*) md;
short flag;
@@ -78,13 +85,13 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return 0;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SmoothModifierData *smd = (SmoothModifierData *)md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(smd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -219,9 +226,9 @@ static void smoothModifier_do(
static void deformVerts(
ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+ float (*vertexCos)[3], int numVerts, int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
- DerivedMesh *dm= get_dm(md->scene, ob, NULL, derivedData, NULL, 0);
+ DerivedMesh *dm= get_dm(ob, NULL, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -234,7 +241,7 @@ static void deformVertsEM(
ModifierData *md, Object *ob, struct EditMesh *editData,
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
{
- DerivedMesh *dm= get_dm(md->scene, ob, editData, derivedData, NULL, 0);
+ DerivedMesh *dm= get_dm(ob, editData, derivedData, NULL, 0);
smoothModifier_do((SmoothModifierData *)md, ob, dm,
vertexCos, numVerts);
@@ -254,6 +261,7 @@ ModifierTypeInfo modifierType_Smooth = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -264,6 +272,7 @@ ModifierTypeInfo modifierType_Smooth = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 8f629001e0b..0abf2fa6281 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -30,22 +30,33 @@
*
*/
+/** \file blender/modifiers/intern/MOD_softbody.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "MOD_modifiertypes.h"
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *UNUSED(derivedData),
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
sbObjectStep(md->scene, ob, (float)md->scene->r.cfra, vertexCos, numVerts);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -62,6 +73,7 @@ ModifierTypeInfo modifierType_Softbody = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -72,6 +84,7 @@ ModifierTypeInfo modifierType_Softbody = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 9c17100b33f..50317e363ad 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -30,16 +30,22 @@
*
*/
+/** \file blender/modifiers/intern/MOD_solidify.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
#include "BLI_edgehash.h"
+#include "BLI_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_particle.h"
#include "BKE_deform.h"
-#include "BKE_utildefines.h"
+
#include "MOD_modifiertypes.h"
@@ -126,7 +132,7 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
}
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
- /* Get the edge vert indicies, and edge value (the face indicies that use it)*/
+ /* Get the edge vert indices, and edge value (the face indices that use it)*/
BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
edge_ref = BLI_edgehashIterator_getValue(edge_iter);
@@ -179,35 +185,34 @@ static void copyData(ModifierData *md, ModifierData *target)
strcpy(tsmd->defgrp_name, smd->defgrp_name);
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
SolidifyModifierData *smd = (SolidifyModifierData*) md;
CustomDataMask dataMask = 0;
/* ask for vertexgroups if we need them */
- if(smd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+ if(smd->defgrp_name[0]) dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
-static DerivedMesh *applyModifier(ModifierData *md,
- Object *ob,
- DerivedMesh *dm,
- int useRenderParams,
- int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *dm,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
int i;
DerivedMesh *result, *copy;
- SolidifyModifierData *smd = (SolidifyModifierData*) md;
+ const SolidifyModifierData *smd = (SolidifyModifierData*) md;
MFace *mf, *mface, *orig_mface;
MEdge *ed, *medge, *orig_medge;
MVert *mv, *mvert, *orig_mvert;
- int numVerts = dm->getNumVerts(dm);
- int numEdges = dm->getNumEdges(dm);
- int numFaces = dm->getNumFaces(dm);
+ const int numVerts = dm->getNumVerts(dm);
+ const int numEdges = dm->getNumEdges(dm);
+ const int numFaces = dm->getNumFaces(dm);
/* use for edges */
int *new_vert_arr= NULL;
@@ -221,13 +226,13 @@ static DerivedMesh *applyModifier(ModifierData *md,
float (*vert_nors)[3]= NULL;
- float ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
- float ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
+ float const ofs_orig= - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
+ float const ofs_new= smd->offset - (((-smd->offset_fac + 1.0f) * 0.5f) * smd->offset);
/* weights */
MDeformVert *dvert= NULL, *dv= NULL;
- int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
- int defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
+ const int defgrp_invert = ((smd->flag & MOD_SOLIDIFY_VGROUP_INV) != 0);
+ const int defgrp_index= defgroup_name_index(ob, smd->defgrp_name);
if (defgrp_index >= 0)
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
@@ -291,7 +296,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
ehi= BLI_edgehashIterator_new(edgehash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- int eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
+ eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
if(edge_users[eidx] >= 0) {
BLI_edgehashIterator_getKey(ehi, &v1, &v2);
orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
@@ -408,7 +413,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
float *vert_angles= MEM_callocN(sizeof(float) * numVerts * 2, "mod_solid_pair"); /* 2 in 1 */
float *vert_accum= vert_angles + numVerts;
float face_angles[4];
- int i, j, vidx;
+ int j, vidx;
face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
if(!face_nors) {
@@ -442,11 +447,11 @@ static DerivedMesh *applyModifier(ModifierData *md,
j= 2;
}
- for(; j>=0; j--) {
+ do {
vidx = *(&mf->v1 + j);
vert_accum[vidx] += face_angles[j];
vert_angles[vidx]+= shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * face_angles[j];
- }
+ } while(j--);
}
/* vertex group support */
@@ -634,7 +639,7 @@ static DerivedMesh *applyModifier(ModifierData *md,
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *ob,
- struct EditMesh *editData,
+ struct EditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
@@ -654,17 +659,19 @@ ModifierTypeInfo modifierType_Solidify = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL
};
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index e84d8e24faa..6d5477e5ec8 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -30,11 +30,19 @@
*
*/
+/** \file blender/modifiers/intern/MOD_subsurf.c
+ * \ingroup modifiers
+ */
+
+
#include "stddef.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_cdderivedmesh.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
@@ -83,9 +91,10 @@ static int isDisabled(ModifierData *md, int useRenderParams)
return get_render_subsurf_level(&md->scene->r, levels) == 0;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
+ DerivedMesh *derivedData,
+ int useRenderParams,
+ int isFinalCalc)
{
SubsurfModifierData *smd = (SubsurfModifierData*) md;
DerivedMesh *result;
@@ -102,9 +111,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
SubsurfModifierData *smd = (SubsurfModifierData*) md;
DerivedMesh *result;
@@ -129,6 +138,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -139,6 +149,7 @@ ModifierTypeInfo modifierType_Subsurf = {
/* isDisabled */ isDisabled,
/* updateDepgraph */ 0,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index a55d6bbd141..d229f75189f 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -30,11 +30,18 @@
*
*/
+/** \file blender/modifiers/intern/MOD_surface.c
+ * \ingroup modifiers
+ */
+
+
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
#include "DNA_meshdata_types.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
@@ -76,24 +83,26 @@ static void freeData(ModifierData *md)
}
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int UNUSED(numVerts),
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
SurfaceModifierData *surmd = (SurfaceModifierData*) md;
- unsigned int numverts = 0, i = 0;
if(surmd->dm)
surmd->dm->release(surmd->dm);
/* if possible use/create DerivedMesh */
if(derivedData) surmd->dm = CDDM_copy(derivedData, 0);
- else surmd->dm = get_dm(md->scene, ob, NULL, NULL, NULL, 0);
+ else surmd->dm = get_dm(ob, NULL, NULL, NULL, 0);
if(!ob->pd)
{
@@ -103,6 +112,7 @@ static void deformVerts(
if(surmd->dm)
{
+ unsigned int numverts = 0, i = 0;
int init = 0;
float *vec;
MVert *x, *v;
@@ -168,6 +178,7 @@ ModifierTypeInfo modifierType_Surface = {
/* copyData */ 0,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -178,6 +189,7 @@ ModifierTypeInfo modifierType_Surface = {
/* isDisabled */ 0,
/* updateDepgraph */ 0,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ 0,
/* foreachIDLink */ 0,
};
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index 25072ee7b9b..d5235736368 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,16 +30,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/modifiers/intern/MOD_util.c
+ * \ingroup modifiers
+ */
+
+
#include <string.h>
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_curve_types.h"
+#include "BLI_utildefines.h"
+
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_displist.h"
-#include "BKE_utildefines.h"
+
#include "BKE_modifier.h"
#include "MOD_util.h"
@@ -53,7 +60,8 @@ void get_texture_value(Tex *texture, float *tex_co, TexResult *texres)
{
int result_type;
- result_type = multitex_ext(texture, tex_co, NULL, NULL, 0, texres);
+ /* no node textures for now */
+ result_type = multitex_ext_safe(texture, tex_co, texres);
/* if the texture gave an RGB value, we assume it didn't give a valid
* intensity, so calculate one (formula from do_material_tex).
@@ -84,13 +92,13 @@ void validate_layer_name(const CustomData *data, int type, char *name, char *out
/* if a layer name was given, try to find that layer */
if(name[0])
- index = CustomData_get_named_layer_index(data, CD_MTFACE, name);
+ index = CustomData_get_named_layer_index(data, type, name);
if(index < 0) {
/* either no layer was specified, or the layer we want has been
* deleted, so assign the active layer to name
*/
- index = CustomData_get_active_layer_index(data, CD_MTFACE);
+ index = CustomData_get_active_layer_index(data, type);
strcpy(outname, data->layers[index].name);
}
else
@@ -98,13 +106,13 @@ void validate_layer_name(const CustomData *data, int type, char *name, char *out
}
/* returns a cdderivedmesh if dm == NULL or is another type of derivedmesh */
-DerivedMesh *get_cddm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
+DerivedMesh *get_cddm(Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3])
{
if(dm && dm->type == DM_TYPE_CDDM)
return dm;
if(!dm) {
- dm= get_dm(scene, ob, em, dm, vertexCos, 0);
+ dm= get_dm(ob, em, dm, vertexCos, 0);
}
else {
dm= CDDM_copy(dm, 0);
@@ -118,7 +126,7 @@ DerivedMesh *get_cddm(struct Scene *scene, Object *ob, struct EditMesh *em, Deri
}
/* returns a derived mesh if dm == NULL, for deforming modifiers that need it */
-DerivedMesh *get_dm(struct Scene *scene, Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
+DerivedMesh *get_dm(Object *ob, struct EditMesh *em, DerivedMesh *dm, float (*vertexCos)[3], int orco)
{
if(dm)
return dm;
@@ -143,9 +151,8 @@ DerivedMesh *get_dm(struct Scene *scene, Object *ob, struct EditMesh *em, Derive
}
/* only called by BKE_modifier.h/modifier.c */
-void modifier_type_init(ModifierTypeInfo *types[], ModifierType type)
+void modifier_type_init(ModifierTypeInfo *types[])
{
- memset(types, 0, sizeof(types));
#define INIT_TYPE(typeName) (types[eModifierType_##typeName] = &modifierType_##typeName)
INIT_TYPE(None);
INIT_TYPE(Curve);
diff --git a/source/blender/modifiers/intern/MOD_util.h b/source/blender/modifiers/intern/MOD_util.h
index 5750e042199..a42151904e9 100644
--- a/source/blender/modifiers/intern/MOD_util.h
+++ b/source/blender/modifiers/intern/MOD_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/modifiers/intern/MOD_util.h
+ * \ingroup modifiers
+ */
+
+
#ifndef MOD_UTIL_H
#define MOD_UTIL_H
+/* so modifier types match their defines */
+#include "MOD_modifiertypes.h"
+
struct Tex;
struct TexResult;
struct CustomData;
@@ -40,9 +48,7 @@ struct ModifierData;
void get_texture_value(struct Tex *texture, float *tex_co, struct TexResult *texres);
void modifier_vgroup_cache(struct ModifierData *md, float (*vertexCos)[3]);
void validate_layer_name(const struct CustomData *data, int type, char *name, char *outname);
-struct DerivedMesh *get_cddm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
-struct DerivedMesh *get_dm(struct Scene *scene, struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
-
-void modifier_type_init(struct ModifierTypeInfo *types[], ModifierType type);
+struct DerivedMesh *get_cddm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3]);
+struct DerivedMesh *get_dm(struct Object *ob, struct EditMesh *em, struct DerivedMesh *dm, float (*vertexCos)[3], int orco);
#endif /* MOD_UTIL_H */
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 3deef13735f..29bdde4d2f6 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/modifiers/intern/MOD_uvproject.c
+ * \ingroup modifiers
+ */
+
+
/* UV Project modifier: Generates UVs projected from an object */
#include "DNA_meshdata_types.h"
@@ -38,6 +43,8 @@
#include "BLI_math.h"
#include "BLI_uvproject.h"
+#include "BLI_utildefines.h"
+
#include "BKE_DerivedMesh.h"
@@ -78,12 +85,12 @@ static void copyData(ModifierData *md, ModifierData *target)
tumd->scaley = umd->scaley;
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
{
CustomDataMask dataMask = 0;
/* ask for UV coordinates */
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
return dataMask;
}
@@ -109,8 +116,10 @@ static void foreachIDLink(ModifierData *md, Object *ob,
userData);
}
-static void updateDepgraph(ModifierData *md,
- DagForest *forest, struct Scene *scene, Object *ob, DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ struct Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
UVProjectModifierData *umd = (UVProjectModifierData*) md;
int i;
@@ -376,9 +385,10 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
return dm;
}
-static DerivedMesh *applyModifier(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- int useRenderParams, int isFinalCalc)
+static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *result;
UVProjectModifierData *umd = (UVProjectModifierData*) md;
@@ -388,9 +398,9 @@ static DerivedMesh *applyModifier(
return result;
}
-static DerivedMesh *applyModifierEM(
- ModifierData *md, Object *ob, struct EditMesh *editData,
- DerivedMesh *derivedData)
+static DerivedMesh *applyModifierEM(ModifierData *md, Object *ob,
+ struct EditMesh *UNUSED(editData),
+ DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
}
@@ -408,6 +418,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* copyData */ copyData,
/* deformVerts */ 0,
+ /* deformMatrices */ 0,
/* deformVertsEM */ 0,
/* deformMatricesEM */ 0,
/* applyModifier */ applyModifier,
@@ -418,6 +429,7 @@ ModifierTypeInfo modifierType_UVProject = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ 0,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index a4cf8f4a2c2..42b1369e8ca 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -30,12 +30,20 @@
*
*/
+/** \file blender/modifiers/intern/MOD_wave.c
+ * \ingroup modifiers
+ */
+
+
#include "BLI_math.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
+#include "BLI_utildefines.h"
+
+
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_deform.h"
@@ -93,7 +101,7 @@ static void copyData(ModifierData *md, ModifierData *target)
strncpy(twmd->defgrp_name, wmd->defgrp_name, 32);
}
-static int dependsOnTime(ModifierData *md)
+static int dependsOnTime(ModifierData *UNUSED(md))
{
return 1;
}
@@ -118,9 +126,10 @@ static void foreachIDLink(ModifierData *md, Object *ob,
foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
-static void updateDepgraph(
- ModifierData *md, DagForest *forest, Scene *scene, Object *ob,
- DagNode *obNode)
+static void updateDepgraph(ModifierData *md, DagForest *forest,
+ Scene *UNUSED(scene),
+ Object *UNUSED(ob),
+ DagNode *obNode)
{
WaveModifierData *wmd = (WaveModifierData*) md;
@@ -139,7 +148,7 @@ static void updateDepgraph(
}
}
-static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
+static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
{
WaveModifierData *wmd = (WaveModifierData *)md;
CustomDataMask dataMask = 0;
@@ -147,11 +156,11 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
/* ask for UV coordinates if we need them */
if(wmd->texture && wmd->texmapping == MOD_WAV_MAP_UV)
- dataMask |= (1 << CD_MTFACE);
+ dataMask |= CD_MASK_MTFACE;
/* ask for vertexgroups if we need them */
if(wmd->defgrp_name[0])
- dataMask |= (1 << CD_MDEFORMVERT);
+ dataMask |= CD_MASK_MDEFORMVERT;
return dataMask;
}
@@ -399,17 +408,20 @@ static void waveModifier_do(WaveModifierData *md,
if(wmd->texture) MEM_freeN(tex_co);
}
-static void deformVerts(
- ModifierData *md, Object *ob, DerivedMesh *derivedData,
- float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
+static void deformVerts(ModifierData *md, Object *ob,
+ DerivedMesh *derivedData,
+ float (*vertexCos)[3],
+ int numVerts,
+ int UNUSED(useRenderParams),
+ int UNUSED(isFinalCalc))
{
DerivedMesh *dm= derivedData;
WaveModifierData *wmd = (WaveModifierData *)md;
if(wmd->flag & MOD_WAVE_NORM)
- dm= get_cddm(md->scene, ob, NULL, dm, vertexCos);
+ dm= get_cddm(ob, NULL, dm, vertexCos);
else if(wmd->texture || wmd->defgrp_name[0])
- dm= get_dm(md->scene, ob, NULL, dm, NULL, 0);
+ dm= get_dm(ob, NULL, dm, NULL, 0);
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
@@ -425,9 +437,9 @@ static void deformVertsEM(
WaveModifierData *wmd = (WaveModifierData *)md;
if(wmd->flag & MOD_WAVE_NORM)
- dm= get_cddm(md->scene, ob, editData, dm, vertexCos);
+ dm= get_cddm(ob, editData, dm, vertexCos);
else if(wmd->texture || wmd->defgrp_name[0])
- dm= get_dm(md->scene, ob, editData, dm, NULL, 0);
+ dm= get_dm(ob, editData, dm, NULL, 0);
waveModifier_do(wmd, md->scene, ob, dm, vertexCos, numVerts);
@@ -445,6 +457,7 @@ ModifierTypeInfo modifierType_Wave = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
+ /* deformMatrices */ 0,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ 0,
/* applyModifier */ 0,
@@ -455,6 +468,7 @@ ModifierTypeInfo modifierType_Wave = {
/* isDisabled */ 0,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
+ /* dependsOnNormals */ 0,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/Makefile b/source/blender/modifiers/intern/Makefile
deleted file mode 100644
index 94ea068a1bc..00000000000
--- a/source/blender/modifiers/intern/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = modifiers
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I..
-
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenkernel/intern
-CPPFLAGS += -I../../render/extern/include
-
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_DECIMATION)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += -I$(NAN_OPENNL)/include
-CPPFLAGS += -I$(NAN_BSP)/include
-# CPPFLAGS += -I$(NAN_SMOKE)/include
-
-
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h
index c2bc4d026ef..65c9236710f 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/CMP_node.h
@@ -1,23 +1,23 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
- * This program is free software; you can redistribute it and/or
+ * This program is free software(ListBase *lb); 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
+ * as published by the Free Software Foundation(ListBase *lb); either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * but WITHOUT ANY WARRANTY(ListBase *lb); 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,
+ * along with this program(ListBase *lb); if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2005 Blender Foundation.
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file CMP_node.h
+ * \ingroup nodes
+ */
+
#ifndef CMP_NODE_H
#define CMP_NODE_H
@@ -38,76 +42,76 @@
/* ****************** types array for all composite nodes ****************** */
-extern bNodeType cmp_node_rlayers;
-extern bNodeType cmp_node_image;
-extern bNodeType cmp_node_texture;
-extern bNodeType cmp_node_value;
-extern bNodeType cmp_node_rgb;
-extern bNodeType cmp_node_curve_time;
+void register_node_type_cmp_rlayers(ListBase *lb);
+void register_node_type_cmp_image(ListBase *lb);
+void register_node_type_cmp_texture(ListBase *lb);
+void register_node_type_cmp_value(ListBase *lb);
+void register_node_type_cmp_rgb(ListBase *lb);
+void register_node_type_cmp_curve_time(ListBase *lb);
-extern bNodeType cmp_node_composite;
-extern bNodeType cmp_node_viewer;
-extern bNodeType cmp_node_splitviewer;
-extern bNodeType cmp_node_output_file;
-extern bNodeType cmp_node_view_levels;
+void register_node_type_cmp_composite(ListBase *lb);
+void register_node_type_cmp_viewer(ListBase *lb);
+void register_node_type_cmp_splitviewer(ListBase *lb);
+void register_node_type_cmp_output_file(ListBase *lb);
+void register_node_type_cmp_view_levels(ListBase *lb);
-extern bNodeType cmp_node_curve_rgb;
-extern bNodeType cmp_node_mix_rgb;
-extern bNodeType cmp_node_hue_sat;
-extern bNodeType cmp_node_brightcontrast;
-extern bNodeType cmp_node_gamma;
-extern bNodeType cmp_node_invert;
-extern bNodeType cmp_node_alphaover;
-extern bNodeType cmp_node_zcombine;
-extern bNodeType cmp_node_colorbalance;
-extern bNodeType cmp_node_huecorrect;
+void register_node_type_cmp_curve_rgb(ListBase *lb);
+void register_node_type_cmp_mix_rgb(ListBase *lb);
+void register_node_type_cmp_hue_sat(ListBase *lb);
+void register_node_type_cmp_brightcontrast(ListBase *lb);
+void register_node_type_cmp_gamma(ListBase *lb);
+void register_node_type_cmp_invert(ListBase *lb);
+void register_node_type_cmp_alphaover(ListBase *lb);
+void register_node_type_cmp_zcombine(ListBase *lb);
+void register_node_type_cmp_colorbalance(ListBase *lb);
+void register_node_type_cmp_huecorrect(ListBase *lb);
-extern bNodeType cmp_node_normal;
-extern bNodeType cmp_node_curve_vec;
-extern bNodeType cmp_node_map_value;
-extern bNodeType cmp_node_normalize;
+void register_node_type_cmp_normal(ListBase *lb);
+void register_node_type_cmp_curve_vec(ListBase *lb);
+void register_node_type_cmp_map_value(ListBase *lb);
+void register_node_type_cmp_normalize(ListBase *lb);
-extern bNodeType cmp_node_filter;
-extern bNodeType cmp_node_blur;
-extern bNodeType cmp_node_dblur;
-extern bNodeType cmp_node_bilateralblur;
-extern bNodeType cmp_node_vecblur;
-extern bNodeType cmp_node_dilateerode;
-extern bNodeType cmp_node_defocus;
+void register_node_type_cmp_filter(ListBase *lb);
+void register_node_type_cmp_blur(ListBase *lb);
+void register_node_type_cmp_dblur(ListBase *lb);
+void register_node_type_cmp_bilateralblur(ListBase *lb);
+void register_node_type_cmp_vecblur(ListBase *lb);
+void register_node_type_cmp_dilateerode(ListBase *lb);
+void register_node_type_cmp_defocus(ListBase *lb);
-extern bNodeType cmp_node_valtorgb;
-extern bNodeType cmp_node_rgbtobw;
-extern bNodeType cmp_node_setalpha;
-extern bNodeType cmp_node_idmask;
-extern bNodeType cmp_node_math;
-extern bNodeType cmp_node_seprgba;
-extern bNodeType cmp_node_combrgba;
-extern bNodeType cmp_node_sephsva;
-extern bNodeType cmp_node_combhsva;
-extern bNodeType cmp_node_sepyuva;
-extern bNodeType cmp_node_combyuva;
-extern bNodeType cmp_node_sepycca;
-extern bNodeType cmp_node_combycca;
-extern bNodeType cmp_node_premulkey;
+void register_node_type_cmp_valtorgb(ListBase *lb);
+void register_node_type_cmp_rgbtobw(ListBase *lb);
+void register_node_type_cmp_setalpha(ListBase *lb);
+void register_node_type_cmp_idmask(ListBase *lb);
+void register_node_type_cmp_math(ListBase *lb);
+void register_node_type_cmp_seprgba(ListBase *lb);
+void register_node_type_cmp_combrgba(ListBase *lb);
+void register_node_type_cmp_sephsva(ListBase *lb);
+void register_node_type_cmp_combhsva(ListBase *lb);
+void register_node_type_cmp_sepyuva(ListBase *lb);
+void register_node_type_cmp_combyuva(ListBase *lb);
+void register_node_type_cmp_sepycca(ListBase *lb);
+void register_node_type_cmp_combycca(ListBase *lb);
+void register_node_type_cmp_premulkey(ListBase *lb);
-extern bNodeType cmp_node_diff_matte;
-extern bNodeType cmp_node_distance_matte;
-extern bNodeType cmp_node_chroma_matte;
-extern bNodeType cmp_node_color_matte;
-extern bNodeType cmp_node_channel_matte;
-extern bNodeType cmp_node_color_spill;
-extern bNodeType cmp_node_luma_matte;
+void register_node_type_cmp_diff_matte(ListBase *lb);
+void register_node_type_cmp_distance_matte(ListBase *lb);
+void register_node_type_cmp_chroma_matte(ListBase *lb);
+void register_node_type_cmp_color_matte(ListBase *lb);
+void register_node_type_cmp_channel_matte(ListBase *lb);
+void register_node_type_cmp_color_spill(ListBase *lb);
+void register_node_type_cmp_luma_matte(ListBase *lb);
-extern bNodeType cmp_node_translate;
-extern bNodeType cmp_node_rotate;
-extern bNodeType cmp_node_scale;
-extern bNodeType cmp_node_flip;
-extern bNodeType cmp_node_crop;
-extern bNodeType cmp_node_displace;
-extern bNodeType cmp_node_mapuv;
+void register_node_type_cmp_translate(ListBase *lb);
+void register_node_type_cmp_rotate(ListBase *lb);
+void register_node_type_cmp_scale(ListBase *lb);
+void register_node_type_cmp_flip(ListBase *lb);
+void register_node_type_cmp_crop(ListBase *lb);
+void register_node_type_cmp_displace(ListBase *lb);
+void register_node_type_cmp_mapuv(ListBase *lb);
-extern bNodeType cmp_node_glare;
-extern bNodeType cmp_node_tonemap;
-extern bNodeType cmp_node_lensdist;
+void register_node_type_cmp_glare(ListBase *lb);
+void register_node_type_cmp_tonemap(ListBase *lb);
+void register_node_type_cmp_lensdist(ListBase *lb);
#endif
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 3fe85e2dbb8..09a627b51d4 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -23,26 +23,135 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c intern/CMP_nodes/*.c intern/SHD_nodes/*.c intern/TEX_nodes/*.c)
-
-SET(INC
- . ../../../intern/guardedalloc ../editors/include ../blenlib ../makesdna
- ../render/extern/include ../../../intern/decimation/extern ../makesrna
- ../imbuf ../avi ../../../intern/elbeem/extern
- ../../../intern/iksolver/extern ../blenloader
- ../blenkernel ../../../extern/glew/include ../gpu
- ${ZLIB_INC}
+set(INC
+ .
+ ../blenkernel
+ ../blenlib
+ ../blenloader
+ ../gpu
+ ../imbuf
+ ../makesdna
+ ../makesrna
+ ../render/extern/include
+ ../../../intern/guardedalloc
+ ../../../extern/glew/include
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/CMP_nodes/CMP_alphaOver.c
+ intern/CMP_nodes/CMP_bilateralblur.c
+ intern/CMP_nodes/CMP_blur.c
+ intern/CMP_nodes/CMP_brightness.c
+ intern/CMP_nodes/CMP_channelMatte.c
+ intern/CMP_nodes/CMP_chromaMatte.c
+ intern/CMP_nodes/CMP_colorMatte.c
+ intern/CMP_nodes/CMP_colorSpill.c
+ intern/CMP_nodes/CMP_colorbalance.c
+ intern/CMP_nodes/CMP_composite.c
+ intern/CMP_nodes/CMP_crop.c
+ intern/CMP_nodes/CMP_curves.c
+ intern/CMP_nodes/CMP_defocus.c
+ intern/CMP_nodes/CMP_diffMatte.c
+ intern/CMP_nodes/CMP_dilate.c
+ intern/CMP_nodes/CMP_directionalblur.c
+ intern/CMP_nodes/CMP_displace.c
+ intern/CMP_nodes/CMP_distanceMatte.c
+ intern/CMP_nodes/CMP_filter.c
+ intern/CMP_nodes/CMP_flip.c
+ intern/CMP_nodes/CMP_gamma.c
+ intern/CMP_nodes/CMP_glare.c
+ intern/CMP_nodes/CMP_hueSatVal.c
+ intern/CMP_nodes/CMP_huecorrect.c
+ intern/CMP_nodes/CMP_idMask.c
+ intern/CMP_nodes/CMP_image.c
+ intern/CMP_nodes/CMP_invert.c
+ intern/CMP_nodes/CMP_lensdist.c
+ intern/CMP_nodes/CMP_levels.c
+ intern/CMP_nodes/CMP_lummaMatte.c
+ intern/CMP_nodes/CMP_mapUV.c
+ intern/CMP_nodes/CMP_mapValue.c
+ intern/CMP_nodes/CMP_math.c
+ intern/CMP_nodes/CMP_mixrgb.c
+ intern/CMP_nodes/CMP_normal.c
+ intern/CMP_nodes/CMP_normalize.c
+ intern/CMP_nodes/CMP_outputFile.c
+ intern/CMP_nodes/CMP_premulkey.c
+ intern/CMP_nodes/CMP_rgb.c
+ intern/CMP_nodes/CMP_rotate.c
+ intern/CMP_nodes/CMP_scale.c
+ intern/CMP_nodes/CMP_sepcombHSVA.c
+ intern/CMP_nodes/CMP_sepcombRGBA.c
+ intern/CMP_nodes/CMP_sepcombYCCA.c
+ intern/CMP_nodes/CMP_sepcombYUVA.c
+ intern/CMP_nodes/CMP_setalpha.c
+ intern/CMP_nodes/CMP_splitViewer.c
+ intern/CMP_nodes/CMP_texture.c
+ intern/CMP_nodes/CMP_tonemap.c
+ intern/CMP_nodes/CMP_translate.c
+ intern/CMP_nodes/CMP_valToRgb.c
+ intern/CMP_nodes/CMP_value.c
+ intern/CMP_nodes/CMP_vecBlur.c
+ intern/CMP_nodes/CMP_viewer.c
+ intern/CMP_nodes/CMP_zcombine.c
+ intern/CMP_util.c
+ intern/SHD_nodes/SHD_camera.c
+ intern/SHD_nodes/SHD_curves.c
+ intern/SHD_nodes/SHD_dynamic.c
+ intern/SHD_nodes/SHD_geom.c
+ intern/SHD_nodes/SHD_hueSatVal.c
+ intern/SHD_nodes/SHD_invert.c
+ intern/SHD_nodes/SHD_mapping.c
+ intern/SHD_nodes/SHD_material.c
+ intern/SHD_nodes/SHD_math.c
+ intern/SHD_nodes/SHD_mixRgb.c
+ intern/SHD_nodes/SHD_normal.c
+ intern/SHD_nodes/SHD_output.c
+ intern/SHD_nodes/SHD_rgb.c
+ intern/SHD_nodes/SHD_sepcombRGB.c
+ intern/SHD_nodes/SHD_squeeze.c
+ intern/SHD_nodes/SHD_texture.c
+ intern/SHD_nodes/SHD_valToRgb.c
+ intern/SHD_nodes/SHD_value.c
+ intern/SHD_nodes/SHD_vectMath.c
+ intern/SHD_util.c
+ intern/TEX_nodes/TEX_at.c
+ intern/TEX_nodes/TEX_bricks.c
+ intern/TEX_nodes/TEX_checker.c
+ intern/TEX_nodes/TEX_compose.c
+ intern/TEX_nodes/TEX_coord.c
+ intern/TEX_nodes/TEX_curves.c
+ intern/TEX_nodes/TEX_decompose.c
+ intern/TEX_nodes/TEX_distance.c
+ intern/TEX_nodes/TEX_hueSatVal.c
+ intern/TEX_nodes/TEX_image.c
+ intern/TEX_nodes/TEX_invert.c
+ intern/TEX_nodes/TEX_math.c
+ intern/TEX_nodes/TEX_mixRgb.c
+ intern/TEX_nodes/TEX_output.c
+ intern/TEX_nodes/TEX_proc.c
+ intern/TEX_nodes/TEX_rotate.c
+ intern/TEX_nodes/TEX_scale.c
+ intern/TEX_nodes/TEX_texture.c
+ intern/TEX_nodes/TEX_translate.c
+ intern/TEX_nodes/TEX_valToNor.c
+ intern/TEX_nodes/TEX_valToRgb.c
+ intern/TEX_nodes/TEX_viewer.c
+ intern/TEX_util.c
+ intern/node_util.c
+
+ CMP_node.h
+ SHD_node.h
+ TEX_node.h
+ intern/CMP_util.h
+ intern/SHD_util.h
+ intern/TEX_util.h
+ intern/node_util.h
+)
-IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ set(INC ${INC} ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-BLENDERLIB(bf_nodes "${SRC}" "${INC}")
+blender_add_lib(bf_nodes "${SRC}" "${INC}")
diff --git a/source/blender/nodes/Makefile b/source/blender/nodes/Makefile
deleted file mode 100644
index f997e640a17..00000000000
--- a/source/blender/nodes/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/nodes
-DIRS = intern intern/CMP_nodes intern/SHD_nodes intern/TEX_nodes
-
-include nan_subdirs.mk
diff --git a/source/blender/nodes/SConscript b/source/blender/nodes/SConscript
index 548f4973574..4bed612144c 100644
--- a/source/blender/nodes/SConscript
+++ b/source/blender/nodes/SConscript
@@ -20,19 +20,18 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = []
if env['WITH_BF_PYTHON']:
- incs += ' ' + env['BF_PYTHON_INC']
- incs += ' ../python'
- if env['BF_DEBUG']:
- defs.append('_DEBUG')
-else:
- defs.append('DISABLE_PYTHON')
+ incs += ' ' + env['BF_PYTHON_INC']
+ incs += ' ../python'
+ defs.append('WITH_PYTHON')
+ if env['BF_DEBUG']:
+ defs.append('_DEBUG')
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( libname = 'bf_nodes', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [190,105] )
env.BlenderLib ( libname = 'bf_cmpnodes', sources = cmpsources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [175,101] )
diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/SHD_node.h
index 80cd0c2e73c..80e5eec6893 100644
--- a/source/blender/nodes/SHD_node.h
+++ b/source/blender/nodes/SHD_node.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SHD_node.h
+ * \ingroup nodes
+ */
+
#ifndef SHD_NODE_H
#define SHD_NODE_H
@@ -39,29 +43,29 @@
/* the type definitions array */
/* ****************** types array for all shaders ****************** */
-extern bNodeType sh_node_output;
-extern bNodeType sh_node_material;
-extern bNodeType sh_node_camera;
-extern bNodeType sh_node_value;
-extern bNodeType sh_node_rgb;
-extern bNodeType sh_node_mix_rgb;
-extern bNodeType sh_node_valtorgb;
-extern bNodeType sh_node_rgbtobw;
-extern bNodeType sh_node_texture;
-extern bNodeType sh_node_normal;
-extern bNodeType sh_node_geom;
-extern bNodeType sh_node_mapping;
-extern bNodeType sh_node_curve_vec;
-extern bNodeType sh_node_curve_rgb;
-extern bNodeType sh_node_math;
-extern bNodeType sh_node_vect_math;
-extern bNodeType sh_node_squeeze;
-extern bNodeType node_dynamic_typeinfo;
-extern bNodeType sh_node_material_ext;
-extern bNodeType sh_node_invert;
-extern bNodeType sh_node_seprgb;
-extern bNodeType sh_node_combrgb;
-extern bNodeType sh_node_hue_sat;
+void register_node_type_sh_output(ListBase *lb);
+void register_node_type_sh_material(ListBase *lb);
+void register_node_type_sh_camera(ListBase *lb);
+void register_node_type_sh_value(ListBase *lb);
+void register_node_type_sh_rgb(ListBase *lb);
+void register_node_type_sh_mix_rgb(ListBase *lb);
+void register_node_type_sh_valtorgb(ListBase *lb);
+void register_node_type_sh_rgbtobw(ListBase *lb);
+void register_node_type_sh_texture(ListBase *lb);
+void register_node_type_sh_normal(ListBase *lb);
+void register_node_type_sh_geom(ListBase *lb);
+void register_node_type_sh_mapping(ListBase *lb);
+void register_node_type_sh_curve_vec(ListBase *lb);
+void register_node_type_sh_curve_rgb(ListBase *lb);
+void register_node_type_sh_math(ListBase *lb);
+void register_node_type_sh_vect_math(ListBase *lb);
+void register_node_type_sh_squeeze(ListBase *lb);
+void register_node_type_sh_dynamic(ListBase *lb);
+void register_node_type_sh_material_ext(ListBase *lb);
+void register_node_type_sh_invert(ListBase *lb);
+void register_node_type_sh_seprgb(ListBase *lb);
+void register_node_type_sh_combrgb(ListBase *lb);
+void register_node_type_sh_hue_sat(ListBase *lb);
#endif
diff --git a/source/blender/nodes/TEX_node.h b/source/blender/nodes/TEX_node.h
index 1bbca09ac8f..23a6b4427af 100644
--- a/source/blender/nodes/TEX_node.h
+++ b/source/blender/nodes/TEX_node.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file TEX_node.h
+ * \ingroup nodes
+ */
+
#ifndef TEX_NODE_H
#define TEX_NODE_H
@@ -38,41 +42,41 @@
/* ****************** types array for all texture nodes ****************** */
-extern bNodeType tex_node_math;
-extern bNodeType tex_node_mix_rgb;
-extern bNodeType tex_node_valtorgb;
-extern bNodeType tex_node_valtonor;
-extern bNodeType tex_node_rgbtobw;
-extern bNodeType tex_node_output;
-extern bNodeType tex_node_viewer;
-extern bNodeType tex_node_checker;
-extern bNodeType tex_node_texture;
-extern bNodeType tex_node_bricks;
-extern bNodeType tex_node_image;
-extern bNodeType tex_node_curve_rgb;
-extern bNodeType tex_node_curve_time;
-extern bNodeType tex_node_invert;
-extern bNodeType tex_node_hue_sat;
-extern bNodeType tex_node_coord;
-extern bNodeType tex_node_distance;
+void register_node_type_tex_math(ListBase *lb);
+void register_node_type_tex_mix_rgb(ListBase *lb);
+void register_node_type_tex_valtorgb(ListBase *lb);
+void register_node_type_tex_valtonor(ListBase *lb);
+void register_node_type_tex_rgbtobw(ListBase *lb);
+void register_node_type_tex_output(ListBase *lb);
+void register_node_type_tex_viewer(ListBase *lb);
+void register_node_type_tex_checker(ListBase *lb);
+void register_node_type_tex_texture(ListBase *lb);
+void register_node_type_tex_bricks(ListBase *lb);
+void register_node_type_tex_image(ListBase *lb);
+void register_node_type_tex_curve_rgb(ListBase *lb);
+void register_node_type_tex_curve_time(ListBase *lb);
+void register_node_type_tex_invert(ListBase *lb);
+void register_node_type_tex_hue_sat(ListBase *lb);
+void register_node_type_tex_coord(ListBase *lb);
+void register_node_type_tex_distance(ListBase *lb);
-extern bNodeType tex_node_rotate;
-extern bNodeType tex_node_translate;
-extern bNodeType tex_node_scale;
-extern bNodeType tex_node_at;
+void register_node_type_tex_rotate(ListBase *lb);
+void register_node_type_tex_translate(ListBase *lb);
+void register_node_type_tex_scale(ListBase *lb);
+void register_node_type_tex_at(ListBase *lb);
-extern bNodeType tex_node_compose;
-extern bNodeType tex_node_decompose;
+void register_node_type_tex_compose(ListBase *lb);
+void register_node_type_tex_decompose(ListBase *lb);
-extern bNodeType tex_node_proc_voronoi;
-extern bNodeType tex_node_proc_blend;
-extern bNodeType tex_node_proc_magic;
-extern bNodeType tex_node_proc_marble;
-extern bNodeType tex_node_proc_clouds;
-extern bNodeType tex_node_proc_wood;
-extern bNodeType tex_node_proc_musgrave;
-extern bNodeType tex_node_proc_noise;
-extern bNodeType tex_node_proc_stucci;
-extern bNodeType tex_node_proc_distnoise;
+void register_node_type_tex_proc_voronoi(ListBase *lb);
+void register_node_type_tex_proc_blend(ListBase *lb);
+void register_node_type_tex_proc_magic(ListBase *lb);
+void register_node_type_tex_proc_marble(ListBase *lb);
+void register_node_type_tex_proc_clouds(ListBase *lb);
+void register_node_type_tex_proc_wood(ListBase *lb);
+void register_node_type_tex_proc_musgrave(ListBase *lb);
+void register_node_type_tex_proc_noise(ListBase *lb);
+void register_node_type_tex_proc_stucci(ListBase *lb);
+void register_node_type_tex_proc_distnoise(ListBase *lb);
#endif
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
index 37061dd7eae..f18bfb79405 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ static bNodeSocketType cmp_node_alphaover_out[]= {
{ -1, 0, "" }
};
-static void do_alphaover_premul(bNode *node, float *out, float *src, float *over, float *fac)
+static void do_alphaover_premul(bNode *UNUSED(node), float *out, float *src, float *over, float *fac)
{
if(over[3]<=0.0f) {
@@ -61,7 +61,7 @@ static void do_alphaover_premul(bNode *node, float *out, float *src, float *over
}
/* result will be still premul, but the over part is premulled */
-static void do_alphaover_key(bNode *node, float *out, float *src, float *over, float *fac)
+static void do_alphaover_key(bNode *UNUSED(node), float *out, float *src, float *over, float *fac)
{
if(over[3]<=0.0f) {
@@ -107,7 +107,7 @@ static void do_alphaover_mixed(bNode *node, float *out, float *src, float *over,
-static void node_composit_exec_alphaover(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_alphaover(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: col col */
/* stack order out: col */
@@ -140,22 +140,19 @@ static void node_alphaover_init(bNode* node)
node->storage= MEM_callocN(sizeof(NodeTwoFloats), "NodeTwoFloats");
}
-bNodeType cmp_node_alphaover= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ALPHAOVER,
- /* name */ "AlphaOver",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_alphaover_in,
- /* output sock */ cmp_node_alphaover_out,
- /* storage */ "NodeTwoFloats",
- /* execfunc */ node_composit_exec_alphaover,
- /* butfunc */ NULL,
- /* initfunc */ node_alphaover_init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_alphaover(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ALPHAOVER, "AlphaOver", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_alphaover_in, cmp_node_alphaover_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_init(&ntype, node_alphaover_init);
+ node_type_storage(&ntype, "NodeTwoFloats", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_alphaover);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
index 97577fa6b5e..bb677521435 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -81,7 +81,7 @@ static bNodeSocketType cmp_node_bilateralblur_out[]= {
/* code of this node was heavily inspired by the smooth function of opencv library.
The main change is an optional image input */
-static void node_composit_exec_bilateralblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_bilateralblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeBilateralBlurData *nbbd= node->storage;
CompBuf *new, *source, *img= in[0]->data , *refimg= in[1]->data;
@@ -250,20 +250,17 @@ static void node_composit_init_bilateralblur(bNode* node)
nbbd->sigma_space= 5.0;
}
-bNodeType cmp_node_bilateralblur= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BILATERALBLUR,
- /* name */ "Bilateral Blur",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_bilateralblur_in,
- /* output sock */ cmp_node_bilateralblur_out,
- /* storage */ "NodeBilateralBlurData",
- /* execfunc */ node_composit_exec_bilateralblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_bilateralblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_bilateralblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BILATERALBLUR, "Bilateral Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_bilateralblur_in, cmp_node_bilateralblur_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_bilateralblur);
+ node_type_storage(&ntype, "NodeBilateralBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_bilateralblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
index eb8b079f341..e01d5ee29bd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -93,109 +93,119 @@ static void blur_single_image(bNode *node, CompBuf *new, CompBuf *img, float sca
int x, y, pix= img->type;
int i, bigstep;
float *src, *dest;
-
+
/* helper image */
work= alloc_compbuf(imgx, imgy, img->type, 1); /* allocs */
-
- /* horizontal */
- rad = scale*(float)nbd->sizex;
- if(rad>imgx/2)
- rad= imgx/2;
- else if(rad<1)
- rad= 1;
- gausstab= make_gausstab(nbd->filtertype, rad);
- gausstabcent= gausstab+rad;
-
- for (y = 0; y < imgy; y++) {
- float *srcd= img->rect + pix*(y*img->x);
+ /* horizontal */
+ if(nbd->sizex == 0) {
+ memcpy(work->rect, img->rect, sizeof(float) * img->type * imgx * imgy);
+ }
+ else {
+ rad = scale*(float)nbd->sizex;
+ if(rad>imgx/2)
+ rad= imgx/2;
+ else if(rad<1)
+ rad= 1;
- dest = work->rect + pix*(y * img->x);
+ gausstab= make_gausstab(nbd->filtertype, rad);
+ gausstabcent= gausstab+rad;
- for (x = 0; x < imgx ; x++) {
- int minr= x-rad<0?-x:-rad;
- int maxr= x+rad>imgx?imgx-x:rad;
+ for (y = 0; y < imgy; y++) {
+ float *srcd= img->rect + pix*(y*img->x);
- src= srcd + pix*(x+minr);
+ dest = work->rect + pix*(y * img->x);
- sum= gval = rval= bval= aval= 0.0f;
- for (i= minr; i < maxr; i++) {
- val= gausstabcent[i];
- sum+= val;
- rval += val * (*src++);
+ for (x = 0; x < imgx ; x++) {
+ int minr= x-rad<0?-x:-rad;
+ int maxr= x+rad>imgx?imgx-x:rad;
+
+ src= srcd + pix*(x+minr);
+
+ sum= gval = rval= bval= aval= 0.0f;
+ for (i= minr; i < maxr; i++) {
+ val= gausstabcent[i];
+ sum+= val;
+ rval += val * (*src++);
+ if(pix==4) {
+ gval += val * (*src++);
+ bval += val * (*src++);
+ aval += val * (*src++);
+ }
+ }
+ sum= 1.0f/sum;
+ *dest++ = rval*sum;
if(pix==4) {
- gval += val * (*src++);
- bval += val * (*src++);
- aval += val * (*src++);
+ *dest++ = gval*sum;
+ *dest++ = bval*sum;
+ *dest++ = aval*sum;
}
}
- sum= 1.0f/sum;
- *dest++ = rval*sum;
- if(pix==4) {
- *dest++ = gval*sum;
- *dest++ = bval*sum;
- *dest++ = aval*sum;
- }
+ if(node->exec & NODE_BREAK)
+ break;
}
- if(node->exec & NODE_BREAK)
- break;
+
+ /* vertical */
+ MEM_freeN(gausstab);
}
- /* vertical */
- MEM_freeN(gausstab);
-
- rad = scale*(float)nbd->sizey;
- if(rad>imgy/2)
- rad= imgy/2;
- else if(rad<1)
- rad= 1;
-
- gausstab= make_gausstab(nbd->filtertype, rad);
- gausstabcent= gausstab+rad;
-
- bigstep = pix*imgx;
- for (x = 0; x < imgx; x++) {
- float *srcd= work->rect + pix*x;
-
- dest = new->rect + pix*x;
+ if(nbd->sizey == 0) {
+ memcpy(new->rect, work->rect, sizeof(float) * img->type * imgx * imgy);
+ }
+ else {
+ rad = scale*(float)nbd->sizey;
+ if(rad>imgy/2)
+ rad= imgy/2;
+ else if(rad<1)
+ rad= 1;
+
+ gausstab= make_gausstab(nbd->filtertype, rad);
+ gausstabcent= gausstab+rad;
- for (y = 0; y < imgy ; y++) {
- int minr= y-rad<0?-y:-rad;
- int maxr= y+rad>imgy?imgy-y:rad;
+ bigstep = pix*imgx;
+ for (x = 0; x < imgx; x++) {
+ float *srcd= work->rect + pix*x;
- src= srcd + bigstep*(y+minr);
+ dest = new->rect + pix*x;
- sum= gval = rval= bval= aval= 0.0f;
- for (i= minr; i < maxr; i++) {
- val= gausstabcent[i];
- sum+= val;
- rval += val * src[0];
+ for (y = 0; y < imgy ; y++) {
+ int minr= y-rad<0?-y:-rad;
+ int maxr= y+rad>imgy?imgy-y:rad;
+
+ src= srcd + bigstep*(y+minr);
+
+ sum= gval = rval= bval= aval= 0.0f;
+ for (i= minr; i < maxr; i++) {
+ val= gausstabcent[i];
+ sum+= val;
+ rval += val * src[0];
+ if(pix==4) {
+ gval += val * src[1];
+ bval += val * src[2];
+ aval += val * src[3];
+ }
+ src += bigstep;
+ }
+ sum= 1.0f/sum;
+ dest[0] = rval*sum;
if(pix==4) {
- gval += val * src[1];
- bval += val * src[2];
- aval += val * src[3];
+ dest[1] = gval*sum;
+ dest[2] = bval*sum;
+ dest[3] = aval*sum;
}
- src += bigstep;
+ dest+= bigstep;
}
- sum= 1.0f/sum;
- dest[0] = rval*sum;
- if(pix==4) {
- dest[1] = gval*sum;
- dest[2] = bval*sum;
- dest[3] = aval*sum;
- }
- dest+= bigstep;
+ if(node->exec & NODE_BREAK)
+ break;
}
- if(node->exec & NODE_BREAK)
- break;
+ MEM_freeN(gausstab);
}
-
+
free_compbuf(work);
- MEM_freeN(gausstab);
}
/* reference has to be mapped 0-1, and equal in size */
-static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *ref, float fac, NodeBlurData *nbd)
+static void bloom_with_reference(CompBuf *new, CompBuf *img, CompBuf *UNUSED(ref), float UNUSED(fac), NodeBlurData *nbd)
{
CompBuf *wbuf;
register float val;
@@ -568,15 +578,28 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
if(out[0]->hasoutput==0) return;
if(nbd->relative) {
- nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
- nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
+ if (nbd->aspect==CMP_NODE_BLUR_ASPECT_NONE) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_width);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_height);
+ }
+ else if (nbd->aspect==CMP_NODE_BLUR_ASPECT_Y) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_width);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_width);
+ }
+ else if (nbd->aspect==CMP_NODE_BLUR_ASPECT_X) {
+ nbd->sizex= (int)(nbd->percentx*0.01f*nbd->image_in_height);
+ nbd->sizey= (int)(nbd->percenty*0.01f*nbd->image_in_height);
+ }
}
- if (((NodeBlurData *)node->storage)->filtertype == R_FILTER_FAST_GAUSS) {
+ if (nbd->sizex==0 && nbd->sizey==0) {
+ new= pass_on_compbuf(img);
+ out[0]->data= new;
+ }
+ else if (nbd->filtertype == R_FILTER_FAST_GAUSS) {
CompBuf *new, *img = in[0]->data;
- /*from eeshlo's original patch, removed to fit in with the existing blur node */
- /*const float sx = in[1]->vec[0], sy = in[2]->vec[0];*/
- const float sx = ((float)nbd->sizex)/2.0f, sy = ((float)nbd->sizey)/2.0f;
+ // TODO: can this be mapped with reference, too?
+ const float sx = ((float)nbd->sizex*in[1]->vec[0])/2.0f, sy = ((float)nbd->sizey*in[1]->vec[0])/2.0f;
int c;
if ((img==NULL) || (out[0]->hasoutput==0)) return;
@@ -612,6 +635,7 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
/* if fac input, we do it different */
if(in[1]->data) {
+ CompBuf *gammabuf;
/* make output size of input image */
new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
@@ -620,7 +644,18 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
new->xof = img->xof;
new->yof = img->yof;
- blur_with_reference(node, new, img, in[1]->data);
+ if(nbd->gamma) {
+ gammabuf= dupalloc_compbuf(img);
+ gamma_correct_compbuf(gammabuf, 0);
+ }
+ else gammabuf= img;
+
+ blur_with_reference(node, new, gammabuf, in[1]->data);
+
+ if(nbd->gamma) {
+ gamma_correct_compbuf(new, 1);
+ free_compbuf(gammabuf);
+ }
if(node->exec & NODE_BREAK) {
free_compbuf(new);
new= NULL;
@@ -633,7 +668,6 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
new= pass_on_compbuf(img);
}
else {
- NodeBlurData *nbd= node->storage;
CompBuf *gammabuf;
/* make output size of input image */
@@ -679,21 +713,19 @@ static void node_composit_init_blur(bNode* node)
node->storage= MEM_callocN(sizeof(NodeBlurData), "node blur data");
}
-bNodeType cmp_node_blur= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BLUR,
- /* name */ "Blur",
- /* width+range */ 120, 80, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_blur_in,
- /* output sock */ cmp_node_blur_out,
- /* storage */ "NodeBlurData",
- /* execfunc */ node_composit_exec_blur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_blur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_blur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BLUR, "Blur", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_blur_in, cmp_node_blur_out);
+ node_type_size(&ntype, 120, 80, 200);
+ node_type_init(&ntype, node_composit_init_blur);
+ node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_blur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
index 03eed59a4c4..8d7524d71f5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,15 +44,14 @@ static bNodeSocketType cmp_node_brightcontrast_out[]= {
{ -1, 0, "" }
};
-static void do_brightnesscontrast(bNode *node, float *out, float *in)
+static void do_brightnesscontrast(bNode *UNUSED(node), float *out, float *in, float *in_brightness, float *in_contrast)
{
float i;
int c;
- float a, b, contrast, brightness, delta, v;
- contrast = node->custom2;
- brightness = (float)(node->custom1);
- brightness = (brightness) / 100.0f;
- delta = contrast / 200.0f;
+ float a, b, v;
+ float brightness = (*in_brightness) / 100.0f;
+ float contrast = *in_contrast;
+ float delta = contrast / 200.0f;
a = 1.0f - delta * 2.0f;
/*
* The algorithm is by Werner D. Streidt
@@ -77,37 +76,30 @@ static void do_brightnesscontrast(bNode *node, float *out, float *in)
}
}
-static void node_composit_exec_brightcontrast(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_brightcontrast(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
if(in[0]->data) {
CompBuf *stackbuf, *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
- node->custom1 = in[1]->vec[0];
- node->custom2 = in[2]->vec[0];
stackbuf= dupalloc_compbuf(cbuf);
- composit1_pixel_processor(node, stackbuf, cbuf, in[0]->vec, do_brightnesscontrast, CB_RGBA);
+ composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, in[2]->data, in[2]->vec, do_brightnesscontrast, CB_RGBA, CB_VAL, CB_VAL);
out[0]->data = stackbuf;
if(cbuf != in[0]->data)
free_compbuf(cbuf);
}
}
-bNodeType cmp_node_brightcontrast= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_BRIGHTCONTRAST,
- /* name */ "Bright/Contrast",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_brightcontrast_in,
- /* output sock */ cmp_node_brightcontrast_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_brightcontrast,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_brightcontrast(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_BRIGHTCONTRAST, "Bright/Contrast", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_brightcontrast_in, cmp_node_brightcontrast_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_brightcontrast);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
index ca7c19cc778..ee3dfbc6e1b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_channel_matte_out[]={
{-1,0,""}
};
-static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in)
+static void do_normalized_rgba_to_ycca2(bNode *UNUSED(node), float *out, float *in)
{
/*normalize to the range 0.0 to 1.0) */
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
@@ -52,7 +52,7 @@ static void do_normalized_rgba_to_ycca2(bNode *node, float *out, float *in)
out[3]=in[3];
}
-static void do_normalized_ycca_to_rgba2(bNode *node, float *out, float *in)
+static void do_normalized_ycca_to_rgba2(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
in[0]=in[0]*255.0;
@@ -197,19 +197,17 @@ static void node_composit_init_channel_matte(bNode *node)
node->custom2= 2; /* Green Channel */
}
-bNodeType cmp_node_channel_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CHANNEL_MATTE,
- /* name */ "Channel Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_channel_matte_in,
- /* output sock */ cmp_node_channel_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_channel_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_channel_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_channel_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CHANNEL_MATTE, "Channel Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_channel_matte_in, cmp_node_channel_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_channel_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_channel_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index e502129c3d3..d028fede25f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_chroma_out[]={
{-1,0,""}
};
-static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in)
+static void do_rgba_to_ycca_normalized(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
@@ -62,7 +62,7 @@ static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in)
out[3]=in[3];
}
-static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
+static void do_ycca_to_rgba_normalized(bNode *UNUSED(node), float *out, float *in)
{
/*un-normalize the normalize from above */
in[0]=(in[0]+1.0)/2.0;
@@ -184,21 +184,19 @@ static void node_composit_init_chroma_matte(bNode *node)
c->fstrength= 1.0f;
};
-bNodeType cmp_node_chroma_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CHROMA_MATTE,
- /* name */ "Chroma Key",
- /* width+range */ 200, 80, 300,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_chroma_in,
- /* output sock */ cmp_node_chroma_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_chroma_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_chroma_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_chroma_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CHROMA_MATTE, "Chroma Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_chroma_in, cmp_node_chroma_out);
+ node_type_size(&ntype, 200, 80, 300);
+ node_type_init(&ntype, node_composit_init_chroma_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_chroma_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
index 8d5f4688657..5022c25819c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -112,21 +112,19 @@ static void node_composit_init_color_matte(bNode *node)
c->fstrength= 1.0f;
};
-bNodeType cmp_node_color_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLOR_MATTE,
- /* name */ "Color Key",
- /* width+range */ 200, 80, 300,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_color_in,
- /* output sock */ cmp_node_color_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_color_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_color_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_color_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLOR_MATTE, "Color Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_color_in, cmp_node_color_out);
+ node_type_size(&ntype, 200, 80, 300);
+ node_type_init(&ntype, node_composit_init_color_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_color_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
index 3191ad757a0..65d3d598c65 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -182,7 +182,7 @@ static void do_apply_spillmap_blue(bNode *node, float* out, float *in, float *ma
}
}
-static void node_composit_exec_color_spill(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_color_spill(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/*
Originally based on the information from the book "The Art and Science of Digital Composition" and
@@ -322,19 +322,16 @@ static void node_composit_init_color_spill(bNode *node)
ncs->unspill=0; /* do not use unspill */
}
-bNodeType cmp_node_color_spill={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLOR_SPILL,
- /* name */ "Color Spill",
- /* width+range */ 140, 80, 200,
- /* class+opts */ NODE_CLASS_MATTE, NODE_OPTIONS,
- /* input sock */ cmp_node_color_spill_in,
- /* output sock */ cmp_node_color_spill_out,
- /* storage */ "NodeColorspill",
- /* execfunc */ node_composit_exec_color_spill,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_color_spill,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
-};
-
+void register_node_type_cmp_color_spill(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLOR_SPILL, "Color Spill", NODE_CLASS_MATTE, NODE_OPTIONS,
+ cmp_node_color_spill_in, cmp_node_color_spill_out);
+ node_type_size(&ntype, 140, 80, 200);
+ node_type_init(&ntype, node_composit_init_color_spill);
+ node_type_storage(&ntype, "NodeColorspill", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_color_spill);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
index 33f5680eaa9..0cecb764722 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -120,7 +120,7 @@ static void do_colorbalance_lgg_fac(bNode *node, float* out, float *in, float *f
out[3] = in[3];
}
-static void node_composit_exec_colorbalance(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_colorbalance(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf;
@@ -179,20 +179,18 @@ static void node_composit_init_colorbalance(bNode *node)
n->gain[0] = n->gain[1] = n->gain[2] = 1.0f;
}
-bNodeType cmp_node_colorbalance={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COLORBALANCE,
- /* name */ "Color Balance",
- /* width+range */ 400, 200, 400,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_colorbalance_in,
- /* output sock */ cmp_node_colorbalance_out,
- /* storage */ "NodeColorBalance",
- /* execfunc */ node_composit_exec_colorbalance,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_colorbalance,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_colorbalance(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COLORBALANCE, "Color Balance", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_colorbalance_in, cmp_node_colorbalance_out);
+ node_type_size(&ntype, 400, 200, 400);
+ node_type_init(&ntype, node_composit_init_colorbalance);
+ node_type_storage(&ntype, "NodeColorBalance", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_colorbalance);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
index 7510a2d11d4..d54e47a5647 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_composite_in[]= {
};
/* applies to render pipeline */
-static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha, z */
@@ -94,19 +94,15 @@ static void node_composit_exec_composite(void *data, bNode *node, bNodeStack **i
generate_preview(data, node, in[0]->data);
}
-bNodeType cmp_node_composite= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMPOSITE,
- /* name */ "Composite",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ cmp_node_composite_in,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ node_composit_exec_composite,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_composite(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ cmp_node_composite_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_exec(&ntype, node_composit_exec_composite);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
index 4585a9ab9a2..a07301a2cb8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_crop_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_crop(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
NodeTwoXYs *ntxy= node->storage;
@@ -48,7 +48,7 @@ static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bN
CompBuf *stackbuf;
int x, y;
float *srcfp, *outfp;
- rcti outputrect;
+ rcti outputrect;
if(node->custom2) {
ntxy->x1= cbuf->x* ntxy->fac_x1;
@@ -108,19 +108,17 @@ static void node_composit_init_crop(bNode* node)
nxy->y2= 0;
}
-bNodeType cmp_node_crop= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CROP,
- /* name */ "Crop",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_crop_in,
- /* output sock */ cmp_node_crop_out,
- /* storage */ "NodeTwoXYs",
- /* execfunc */ node_composit_exec_crop,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_crop,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_crop(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CROP, "Crop", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_crop_in, cmp_node_crop_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_crop);
+ node_type_storage(&ntype, "NodeTwoXYs", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_crop);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
index e4afa1922bb..3c6fc72488f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,7 +38,7 @@ static bNodeSocketType cmp_node_time_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curves_time(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
RenderData *rd= data;
/* stack order output: fac */
@@ -59,22 +59,20 @@ static void node_composit_init_curves_time(bNode* node)
node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType cmp_node_curve_time= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TIME,
- /* name */ "Time",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_time_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curves_time,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curves_time,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_curve_time(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_time_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_curves_time);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curves_time);
+
+ nodeRegisterType(lb, &ntype);
+}
+
@@ -89,7 +87,7 @@ static bNodeSocketType cmp_node_curve_vec_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_curve_vec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order input: vec */
/* stack order output: vec */
@@ -102,23 +100,20 @@ static void node_composit_init_curve_vec(bNode* node)
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
};
-bNodeType cmp_node_curve_vec= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CURVE_VEC,
- /* name */ "Vector Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_curve_vec_in,
- /* output sock */ cmp_node_curve_vec_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curve_vec,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curve_vec,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-
-};
+void register_node_type_cmp_curve_vec(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_curve_vec_in, cmp_node_curve_vec_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_composit_init_curve_vec);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curve_vec);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** CURVE RGB ******************** */
static bNodeSocketType cmp_node_curve_rgb_in[]= {
@@ -158,7 +153,7 @@ static void do_curves_fac(bNode *node, float *out, float *in, float *fac)
out[3]= in[3];
}
-static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order input: fac, image, black level, white level */
/* stack order output: image */
@@ -192,20 +187,18 @@ static void node_composit_init_curve_rgb(bNode* node)
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
};
-bNodeType cmp_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_curve_rgb_in,
- /* output sock */ cmp_node_curve_rgb_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_curve_rgb,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_curve_rgb,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_curve_rgb_in, cmp_node_curve_rgb_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_composit_init_curve_rgb);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_curve_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
index a93a5760842..c0168309533 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -378,7 +378,13 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
//------------------------------------------------------------------
// main loop
+#ifndef __APPLE__ /* can crash on Mac, see bug #22856, disabled for now */
+#ifdef __INTEL_COMPILER /* icc doesn't like the compound statement -- internal error: 0_1506 */
+ #pragma omp parallel for private(y) if(!nqd->preview) schedule(guided)
+#else
#pragma omp parallel for private(y) if(!nqd->preview && img->y*img->x > 16384) schedule(guided)
+#endif
+#endif
for (y=0; y<img->y; y++) {
unsigned int p, p4, zp, cp, cp4;
float *ctcol, u, v, ct_crad, cR2=0;
@@ -791,7 +797,7 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
}
-static void node_composit_exec_defocus(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_defocus(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *old, *zbuf_use = NULL, *img = in[0]->data, *zbuf = in[1]->data;
NodeDefocus *nqd = node->storage;
@@ -863,21 +869,19 @@ static void node_composit_init_defocus(bNode* node)
node->storage = nbd;
}
-bNodeType cmp_node_defocus = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DEFOCUS,
- /* name */ "Defocus",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_defocus_in,
- /* output sock */ cmp_node_defocus_out,
- /* storage */ "NodeDefocus",
- /* execfunc */ node_composit_exec_defocus,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_defocus,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_defocus(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_defocus_in, cmp_node_defocus_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_defocus);
+ node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_defocus);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
index 0735a369d12..2996551fff5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -128,21 +128,19 @@ static void node_composit_init_diff_matte(bNode *node)
c->t2= 0.1f;
}
-bNodeType cmp_node_diff_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DIFF_MATTE,
- /* name */ "Difference Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_diff_matte_in,
- /* output sock */ cmp_node_diff_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_diff_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_diff_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_diff_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DIFF_MATTE, "Difference Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_diff_matte_in, cmp_node_diff_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_diff_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_diff_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
index 6c67413ea1f..8533acdd5a5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -110,7 +110,7 @@ static void morpho_erode(CompBuf *cbuf)
}
-static void node_composit_exec_dilateerode(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_dilateerode(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: mask */
/* stack order out: mask */
@@ -143,21 +143,16 @@ static void node_composit_exec_dilateerode(void *data, bNode *node, bNodeStack *
}
}
-bNodeType cmp_node_dilateerode= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DILATEERODE,
- /* name */ "Dilate/Erode",
- /* width+range */ 130, 100, 320,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_dilateerode_in,
- /* output sock */ cmp_node_dilateerode_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_dilateerode,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_dilateerode(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DILATEERODE, "Dilate/Erode", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_dilateerode_in, cmp_node_dilateerode_out);
+ node_type_size(&ntype, 130, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_dilateerode);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
index b0cf5559772..b00bdba768d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -102,7 +102,7 @@ static CompBuf *dblur(bNode *node, CompBuf *img, int iterations, int wrap,
return img;
}
-static void node_composit_exec_dblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_dblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeDBlurData *ndbd= node->storage;
CompBuf *new, *img= in[0]->data;
@@ -125,19 +125,17 @@ static void node_composit_init_dblur(bNode* node)
ndbd->center_y= 0.5;
}
-bNodeType cmp_node_dblur = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DBLUR,
- /* name */ "Directional Blur",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_dblur_in,
- /* output sock */ cmp_node_dblur_out,
- /* storage */ "NodeDBlurData",
- /* execfunc */ node_composit_exec_dblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_dblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_dblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DBLUR, "Directional Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_dblur_in, cmp_node_dblur_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_dblur);
+ node_type_storage(&ntype, "NodeDBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_dblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
index 7d64d4e719c..49b65ef0598 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -48,7 +48,7 @@ static bNodeSocketType cmp_node_displace_out[]= {
* in order to take effect */
#define DISPLACE_EPSILON 0.01
-static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *veccol, CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale)
+static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float *UNUSED(veccol), CompBuf *xbuf, CompBuf *ybuf, float *xscale, float *yscale)
{
ImBuf *ibuf;
int x, y;
@@ -60,7 +60,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
float vec[3], vecdx[3], vecdy[3];
float col[3];
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
ibuf->rect_float= cbuf->rect;
for(y=0; y < stackbuf->y; y++) {
@@ -83,7 +83,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
p_dy = vec[1] * ys;
/* if no displacement, then just copy this pixel */
- if (p_dx < DISPLACE_EPSILON && p_dy < DISPLACE_EPSILON) {
+ if (fabsf(p_dx) < DISPLACE_EPSILON && fabsf(p_dy) < DISPLACE_EPSILON) {
qd_getPixel(cbuf, x-cbuf->xof, y-cbuf->yof, col);
qd_setPixel(stackbuf, x, y, col);
continue;
@@ -99,10 +99,13 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
qd_getPixel(vecbuf, x-vecbuf->xof, y-vecbuf->yof+1, vecdy);
d_dx = vecdx[0] * xs;
d_dy = vecdy[0] * ys;
-
+
/* clamp derivatives to minimum displacement distance in UV space */
- dxt = MAX2(p_dx - d_dx, DISPLACE_EPSILON)/(float)stackbuf->x;
- dyt = MAX2(p_dy - d_dy, DISPLACE_EPSILON)/(float)stackbuf->y;
+ dxt = p_dx - d_dx;
+ dyt = p_dy - d_dy;
+
+ dxt = signf(dxt)*maxf(fabsf(dxt), DISPLACE_EPSILON)/(float)stackbuf->x;
+ dyt = signf(dyt)*maxf(fabsf(dyt), DISPLACE_EPSILON)/(float)stackbuf->y;
ibuf_sample(ibuf, u, v, dxt, dyt, col);
qd_setPixel(stackbuf, x, y, col);
@@ -137,7 +140,7 @@ static void do_displace(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *vecbuf, float
}
-static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_displace(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -168,20 +171,16 @@ static void node_composit_exec_displace(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_displace= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DISPLACE,
- /* name */ "Displace",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_displace_in,
- /* output sock */ cmp_node_displace_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_displace,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_displace(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DISPLACE, "Displace", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_displace_in, cmp_node_displace_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_displace);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
index e0e595fc8f6..1d379904949 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -125,21 +125,19 @@ static void node_composit_init_distance_matte(bNode *node)
c->t2= 0.1f;
}
-bNodeType cmp_node_distance_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_DIST_MATTE,
- /* name */ "Distance Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_distance_matte_in,
- /* output sock */ cmp_node_distance_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_distance_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_distance_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_distance_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_DIST_MATTE, "Distance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_distance_matte_in, cmp_node_distance_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_distance_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_distance_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
index 8f9a988c4c2..c3450f80979 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -217,22 +217,18 @@ static void node_composit_exec_filter(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_filter= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_FILTER,
- /* name */ "Filter",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_filter_in,
- /* output sock */ cmp_node_filter_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_filter,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_filter(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_FILTER, "Filter", NODE_CLASS_OP_FILTER, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_filter_in, cmp_node_filter_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_label(&ntype, node_filter_label);
+ node_type_exec(&ntype, node_composit_exec_filter);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
index fbc570c4028..b1af4ac9d3c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_flip_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_flip(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_flip(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
CompBuf *cbuf= in[0]->data;
@@ -85,21 +85,17 @@ static void node_composit_exec_flip(void *data, bNode *node, bNodeStack **in, bN
}
}
-bNodeType cmp_node_flip= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_FLIP,
- /* name */ "Flip",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_flip_in,
- /* output sock */ cmp_node_flip_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_flip,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_flip(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_FLIP, "Flip", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_flip_in, cmp_node_flip_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_flip);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
index c0e524a3ae9..dfe28e881f4 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_gamma_out[]= {
{ -1, 0, "" }
};
-static void do_gamma(bNode *node, float *out, float *in, float *fac)
+static void do_gamma(bNode *UNUSED(node), float *out, float *in, float *fac)
{
int i=0;
for(i=0; i<3; i++) {
@@ -51,7 +51,7 @@ static void do_gamma(bNode *node, float *out, float *in, float *fac)
}
out[3] = in[3];
}
-static void node_composit_exec_gamma(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_gamma(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: Fac, Image */
/* stack order out: Image */
@@ -72,21 +72,14 @@ static void node_composit_exec_gamma(void *data, bNode *node, bNodeStack **in, b
}
}
-bNodeType cmp_node_gamma= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_GAMMA,
- /* name */ "Gamma",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_gamma_in,
- /* output sock */ cmp_node_gamma_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_gamma,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
-
-
+void register_node_type_cmp_gamma(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_GAMMA, "Gamma", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_gamma_in, cmp_node_gamma_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_gamma);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
index 1d50acfdc26..7449b8436ea 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -422,7 +422,7 @@ static void fglow(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
//--------------------------------------------------------------------------------------------
-static void node_composit_exec_glare(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_glare(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *src, *img = in[0]->data;
NodeGlare* ndg = node->storage;
@@ -484,19 +484,17 @@ static void node_composit_init_glare(bNode* node)
node->storage = ndg;
}
-bNodeType cmp_node_glare = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_GLARE,
- /* name */ "Glare",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_glare_in,
- /* output sock */ cmp_node_glare_out,
- /* storage */ "NodeGlare",
- /* execfunc */ node_composit_exec_glare,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_glare,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_glare(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_GLARE, "Glare", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_glare_in, cmp_node_glare_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_glare);
+ node_type_storage(&ntype, "NodeGlare", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_glare);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
index c274c580771..32e133c3bec 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -65,7 +65,7 @@ static void do_hue_sat_fac(bNode *node, float *out, float *in, float *fac)
}
}
-static void node_composit_exec_hue_sat(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: Fac, Image */
/* stack order out: Image */
@@ -99,22 +99,19 @@ static void node_composit_init_hue_sat(bNode* node)
nhs->val= 1.0f;
}
-bNodeType cmp_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_hue_sat_in,
- /* output sock */ cmp_node_hue_sat_out,
- /* storage */ "NodeHueSat",
- /* execfunc */ node_composit_exec_hue_sat,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_hue_sat,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_hue_sat_in, cmp_node_hue_sat_out);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_init(&ntype, node_composit_init_hue_sat);
+ node_type_storage(&ntype, "NodeHueSat", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_hue_sat);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
index 9eb79bb8c36..53cb5cc096d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -98,7 +98,7 @@ static void do_huecorrect_fac(bNode *node, float *out, float *in, float *fac)
out[3]= in[3];
}
-static void node_composit_exec_huecorrect(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_huecorrect(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf= in[1]->data;
CompBuf *stackbuf;
@@ -148,20 +148,18 @@ static void node_composit_init_huecorrect(bNode* node)
cumapping->cur = 1;
}
-bNodeType cmp_node_huecorrect= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_HUECORRECT,
- /* name */ "Hue Correct",
- /* width+range */ 320, 140, 400,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_huecorrect_in,
- /* output sock */ cmp_node_huecorrect_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_composit_exec_huecorrect,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_huecorrect,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_cmp_huecorrect(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_HUECORRECT, "Hue Correct", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_huecorrect_in, cmp_node_huecorrect_out);
+ node_type_size(&ntype, 320, 140, 400);
+ node_type_init(&ntype, node_composit_init_huecorrect);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_composit_exec_huecorrect);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
index 9b088cb3f55..eeae5fb06de 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -104,21 +104,17 @@ static void node_composit_exec_idmask(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_idmask= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ID_MASK,
- /* name */ "ID Mask",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_idmask_in,
- /* output sock */ cmp_node_idmask_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_idmask,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_idmask(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ID_MASK, "ID Mask", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_idmask_in, cmp_node_idmask_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_idmask);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index 0bbf9c9bf85..bb01f591512 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -62,38 +62,62 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
ImBuf *ibuf;
CompBuf *stackbuf;
int type;
-
+
+ float *rect;
+ int alloc= FALSE;
+
ibuf= BKE_image_get_ibuf(ima, iuser);
- if(ibuf==NULL)
+ if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
return NULL;
-
- if (!(rd->color_mgt_flag & R_COLOR_MANAGEMENT)) {
- int profile = IB_PROFILE_NONE;
-
- /* temporarily set profile to none to not disturb actual */
- SWAP(int, ibuf->profile, profile);
-
- if (ibuf->rect_float != NULL) {
- imb_freerectfloatImBuf(ibuf);
- }
- IMB_float_from_rect(ibuf);
-
- SWAP(int, ibuf->profile, profile);
}
-
+
if (ibuf->rect_float == NULL) {
IMB_float_from_rect(ibuf);
}
+ /* now we need a float buffer from the image
+ * with matching color management */
+ if(ibuf->channels == 4) {
+ if(rd->color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if(ibuf->profile != IB_PROFILE_NONE) {
+ rect= ibuf->rect_float;
+ }
+ else {
+ rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
+ srgb_to_linearrgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+ alloc= TRUE;
+ }
+ }
+ else {
+ if(ibuf->profile == IB_PROFILE_NONE) {
+ rect= ibuf->rect_float;
+ }
+ else {
+ rect= MEM_mapallocN(sizeof(float) * 4 * ibuf->x * ibuf->y, "node_composit_get_image");
+ linearrgb_to_srgb_rgba_rgba_buf(rect, ibuf->rect_float, ibuf->x * ibuf->y);
+ alloc= TRUE;
+ }
+ }
+ }
+ else {
+ /* non-rgba passes can't use color profiles */
+ rect= ibuf->rect_float;
+ }
+ /* done coercing into the correct color management */
+
+
type= ibuf->channels;
if(rd->scemode & R_COMP_CROP) {
- stackbuf= get_cropped_compbuf(&rd->disprect, ibuf->rect_float, ibuf->x, ibuf->y, type);
+ stackbuf= get_cropped_compbuf(&rd->disprect, rect, ibuf->x, ibuf->y, type);
+ if(alloc)
+ MEM_freeN(rect);
}
else {
/* we put imbuf copy on stack, cbuf knows rect is from other ibuf when freed! */
- stackbuf= alloc_compbuf(ibuf->x, ibuf->y, type, 0);
- stackbuf->rect= ibuf->rect_float;
+ stackbuf= alloc_compbuf(ibuf->x, ibuf->y, type, FALSE);
+ stackbuf->rect= rect;
+ stackbuf->malloc= alloc;
}
/*code to respect the premul flag of images; I'm
@@ -153,7 +177,7 @@ static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *i
return NULL;
};
-void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, Image *ima, ImageUser *iuser)
+static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, Image *ima, ImageUser *iuser)
{
if(out[RRES_OUT_Z]->hasoutput)
out[RRES_OUT_Z]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_Z);
@@ -191,7 +215,7 @@ void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, I
};
-static void node_composit_exec_image(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
/* image assigned to output */
@@ -273,22 +297,20 @@ static void node_composit_init_image(bNode* node)
iuser->ok= 1;
}
-bNodeType cmp_node_image= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_IMAGE,
- /* name */ "Image",
- /* width+range */ 120, 80, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rlayers_out,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_image,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_image,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_image(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, cmp_node_rlayers_out);
+ node_type_size(&ntype, 120, 80, 300);
+ node_type_init(&ntype, node_composit_init_image);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_image);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RENDER RESULT ******************** */
@@ -317,7 +339,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in
return NULL;
};
-void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty)
+static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty)
{
if(out[RRES_OUT_Z]->hasoutput)
out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z);
@@ -354,7 +376,7 @@ void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out
out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT);
};
-static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
Scene *sce= (Scene *)node->id;
Render *re= (sce)? RE_GetRender(sce->id.name): NULL;
@@ -404,22 +426,17 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **in,
};
-bNodeType cmp_node_rlayers= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_R_LAYERS,
- /* name */ "Render Layers",
- /* width+range */ 150, 100, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rlayers_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rlayers,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_cmp_rlayers(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, cmp_node_rlayers_out);
+ node_type_size(&ntype, 150, 100, 300);
+ node_type_exec(&ntype, node_composit_exec_rlayers);
+
+ nodeRegisterType(lb, &ntype);
+}
-};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
index 08ae51975b9..5cf652b8af6 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -75,7 +75,7 @@ static void do_invert_fac(bNode *node, float *out, float *in, float *fac)
QUATCOPY(out, col);
}
-static void node_composit_exec_invert(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_invert(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac, Image, Image */
/* stack order out: Image */
@@ -115,20 +115,16 @@ static void node_composit_init_invert(bNode *node)
}
/* custom1 = mix type */
-bNodeType cmp_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 120, 120, 140,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_invert_in,
- /* output sock */ cmp_node_invert_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_invert,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_invert,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_invert_in, cmp_node_invert_out);
+ node_type_size(&ntype, 120, 120, 140);
+ node_type_init(&ntype, node_composit_init_invert);
+ node_type_exec(&ntype, node_composit_exec_invert);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
index fc9045caafd..4343e043c34 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -147,7 +147,7 @@ static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb
}
-static void node_composit_exec_lensdist(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_lensdist(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *img = in[0]->data;
NodeLensDist* nld = node->storage;
@@ -174,19 +174,17 @@ static void node_composit_init_lensdist(bNode* node)
}
-bNodeType cmp_node_lensdist = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_LENSDIST,
- /* name */ "Lens Distortion",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_lensdist_in,
- /* output sock */ cmp_node_lensdist_out,
- /* storage */ "NodeLensDist",
- /* execfunc */ node_composit_exec_lensdist,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_lensdist,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_lensdist(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_LENSDIST, "Lens Distortion", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_lensdist_in, cmp_node_lensdist_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_lensdist);
+ node_type_storage(&ntype, "NodeLensDist", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_lensdist);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
index f550bead4cf..876ee565ec7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,7 +47,7 @@ static void rgb_tobw(float r, float g, float b, float* out)
*out= r*0.35f + g*0.45f + b*0.2f;
}
-static void fill_bins(bNode* node, CompBuf* in, int* bins)
+static void fill_bins(bNode* node, CompBuf* in, int* bins, int colorcor)
{
float value[4];
int ivalue=0;
@@ -63,29 +63,39 @@ static void fill_bins(bNode* node, CompBuf* in, int* bins)
if(value[3] > 0.0) { /* don't count transparent pixels */
switch(node->custom1) {
case 1: { /* all colors */
+ if(colorcor)
+ linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_tobw(value[0],value[1],value[2], &value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 2: { /* red channel */
+ if(colorcor)
+ value[0]=linearrgb_to_srgb(value[0]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
break;
}
case 3: { /* green channel */
+ if(colorcor)
+ value[1]=linearrgb_to_srgb(value[1]);
value[1]=value[1]*255; /* scale to 0-255 range */
ivalue=(int)value[1];
break;
}
case 4: /*blue channel */
{
+ if(colorcor)
+ value[2]=linearrgb_to_srgb(value[2]);
value[2]=value[2]*255; /* scale to 0-255 range */
ivalue=(int)value[2];
break;
}
case 5: /* luminence */
{
+ if(colorcor)
+ linearrgb_to_srgb_v3_v3(&value[0],&value[0]);
rgb_to_yuv(value[0],value[1],value[2], &value[0], &value[1], &value[2]);
value[0]=value[0]*255; /* scale to 0-255 range */
ivalue=(int)value[0];
@@ -270,6 +280,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
{
CompBuf* cbuf;
CompBuf* histogram;
+ RenderData *rd=data;
float mean, std_dev;
int bins[256];
int x;
@@ -286,7 +297,7 @@ static void node_composit_exec_view_levels(void *data, bNode *node, bNodeStack *
}
/*fill bins */
- fill_bins(node, in[0]->data, bins);
+ fill_bins(node, in[0]->data, bins, rd->color_mgt_flag & R_COLOR_MANAGEMENT);
/* draw the histogram chart */
draw_histogram(node, histogram, bins);
@@ -317,21 +328,18 @@ static void node_composit_init_view_levels(bNode* node)
node->custom1=1; /*All channels*/
}
-bNodeType cmp_node_view_levels= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VIEW_LEVELS,
- /* name */ "Levels",
- /* widthrange */ 140, 100, 320,
- /* classopts */ NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ cmp_node_view_levels_in,
- /* output sock */ cmp_node_view_levels_out,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_view_levels,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_view_levels,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_view_levels(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VIEW_LEVELS, "Levels", NODE_CLASS_OUTPUT, NODE_OPTIONS|NODE_PREVIEW,
+ cmp_node_view_levels_in, cmp_node_view_levels_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_view_levels);
+ node_type_storage(&ntype, "ImageUser", NULL, NULL);
+ node_type_exec(&ntype, node_composit_exec_view_levels);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
index af198fba699..42430ffeff8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -103,20 +103,18 @@ static void node_composit_init_luma_matte(bNode *node)
c->t2= 0.0f;
};
-bNodeType cmp_node_luma_matte={
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_LUMA_MATTE,
- /* name */ "Luminance Key",
- /* width+range */ 200, 80, 250,
- /* class+opts */ NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_luma_matte_in,
- /* output sock */ cmp_node_luma_matte_out,
- /* storage */ "NodeChroma",
- /* execfunc */ node_composit_exec_luma_matte,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_luma_matte,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_luma_matte(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_LUMA_MATTE, "Luminance Key", NODE_CLASS_MATTE, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_luma_matte_in, cmp_node_luma_matte_out);
+ node_type_size(&ntype, 200, 80, 250);
+ node_type_init(&ntype, node_composit_init_luma_matte);
+ node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_luma_matte);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
index 91d1aa148b2..bc294b3be79 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,7 +51,7 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
int x, y, sx, sy, row= 3*stackbuf->x;
/* ibuf needed for sampling */
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
ibuf->rect_float= cbuf->rect;
/* vars for efficient looping */
@@ -134,7 +134,7 @@ static void do_mapuv(CompBuf *stackbuf, CompBuf *cbuf, CompBuf *uvbuf, float thr
}
-static void node_composit_exec_mapuv(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_mapuv(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -159,21 +159,17 @@ static void node_composit_exec_mapuv(void *data, bNode *node, bNodeStack **in, b
}
}
-bNodeType cmp_node_mapuv= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MAP_UV,
- /* name */ "Map UV",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_mapuv_in,
- /* output sock */ cmp_node_mapuv_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_mapuv,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_mapuv(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MAP_UV, "Map UV", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_mapuv_in, cmp_node_mapuv_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_mapuv);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
index 357218ea937..b7da0ed578c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -52,7 +52,7 @@ static void do_map_value(bNode *node, float *out, float *src)
out[0]= texmap->max[0];
}
-static void node_composit_exec_map_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_map_value(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: valbuf */
/* stack order out: valbuf */
@@ -79,23 +79,20 @@ static void node_composit_init_map_value(bNode* node)
node->storage= add_mapping();
}
-bNodeType cmp_node_map_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MAP_VALUE,
- /* name */ "Map Value",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_map_value_in,
- /* output sock */ cmp_node_map_value_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_composit_exec_map_value,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_map_value,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_map_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MAP_VALUE, "Map Value", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_map_value_in, cmp_node_map_value_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_init(&ntype, node_composit_init_map_value);
+ node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_map_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
index f663dc76b5c..86b602d4086 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,7 +29,6 @@
#include "../CMP_util.h"
-
/* **************** SCALAR MATH ******************** */
static bNodeSocketType cmp_node_math_in[]= {
{ SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f},
@@ -95,11 +94,18 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
break;
case 10: /* Power */
{
- /* Don't want any imaginary numbers... */
- if( in[0] >= 0 )
+ /* Only raise negative numbers by full integers */
+ if( in[0] >= 0 ) {
out[0]= pow(in[0], in2[0]);
- else
- out[0]= 0.0;
+ } else {
+ float y_mod_1 = fmod(in2[0], 1);
+ /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */
+ if (y_mod_1 > 0.999 || y_mod_1 < 0.001) {
+ out[0]= pow(in[0], floor(in2[0] + 0.5));
+ } else {
+ out[0] = 0.0;
+ }
+ }
}
break;
case 11: /* Logarithm */
@@ -151,7 +157,7 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
}
}
-static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_math(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *cbuf=in[0]->data;
CompBuf *cbuf2=in[1]->data;
@@ -181,22 +187,19 @@ static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bN
out[0]->data= stackbuf;
}
-bNodeType cmp_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_math_in,
- /* output sock */ cmp_node_math_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_math_in, cmp_node_math_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_exec(&ntype, node_composit_exec_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
index 34d6713d9e3..2a7937ef1d8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -79,20 +79,16 @@ static void node_composit_exec_mix_rgb(void *data, bNode *node, bNodeStack **in,
}
/* custom1 = mix type */
-bNodeType cmp_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 110, 60, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_mix_rgb_in,
- /* output sock */ cmp_node_mix_rgb_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_mix_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_mix_rgb_in, cmp_node_mix_rgb_out);
+ node_type_size(&ntype, 110, 60, 120);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, node_composit_exec_mix_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
index c57caf180ad..920a99f1b93 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -52,7 +52,7 @@ static void do_normal(bNode *node, float *out, float *in)
}
/* generates normal, does dot product */
-static void node_composit_exec_normal(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
/* stack order input: normal */
@@ -77,21 +77,16 @@ static void node_composit_exec_normal(void *data, bNode *node, bNodeStack **in,
}
-bNodeType cmp_node_normal= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_NORMAL,
- /* name */ "Normal",
- /* width+range */ 100, 60, 200,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_normal_in,
- /* output sock */ cmp_node_normal_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_normal,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_normal(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_normal_in, cmp_node_normal_out);
+ node_type_size(&ntype, 100, 60, 200);
+ node_type_exec(&ntype, node_composit_exec_normal);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
index 64855ba5cf3..b9a4dd4ab8a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_normalize_out[]= {
{ -1, 0, "" }
};
-static void do_normalize(bNode *node, float *out, float *src, float *min, float *mult)
+static void do_normalize(bNode *UNUSED(node), float *out, float *src, float *min, float *mult)
{
float res;
res = (src[0] - min[0]) * mult[0];
@@ -58,7 +58,7 @@ static void do_normalize(bNode *node, float *out, float *src, float *min, float
/* The code below assumes all data is inside range +- this, and that input buffer is single channel */
#define BLENDER_ZMAX 10000.0f
-static void node_composit_exec_normalize(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_normalize(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: valbuf */
/* stack order out: valbuf */
@@ -98,19 +98,15 @@ static void node_composit_exec_normalize(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_normalize= {
- /* *next, *prev*/ NULL, NULL,
- /* type code */ CMP_NODE_NORMALIZE,
- /* name */ "Normalize",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_normalize_in,
- /* output sock */ cmp_node_normalize_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_composit_exec_normalize,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_normalize(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_NORMALIZE, "Normalize", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ cmp_node_normalize_in, cmp_node_normalize_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, node_composit_exec_normalize);
+ node_type_storage(&ntype, "TexMapping", NULL, NULL);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
index 6f29548fcc3..3cb342aa5ff 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,7 +36,7 @@ static bNodeSocketType cmp_node_output_file_in[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha */
@@ -54,7 +54,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
return;
} else {
CompBuf *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
- ImBuf *ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
char string[256];
ibuf->rect_float= cbuf->rect;
@@ -71,7 +71,7 @@ static void node_composit_exec_output_file(void *data, bNode *node, bNodeStack *
}
}
- BKE_makepicstring(string, nif->name, rd->cfra, nif->imtype, (rd->scemode & R_EXTENSION));
+ BKE_makepicstring(string, nif->name, rd->cfra, nif->imtype, (rd->scemode & R_EXTENSION), TRUE);
if(0 == BKE_write_ibuf((Scene *)node->id, ibuf, string, nif->imtype, nif->subimtype, nif->imtype==R_OPENEXR?nif->codec:nif->quality))
printf("Cannot save Node File Output to %s\n", string);
@@ -104,22 +104,19 @@ static void node_composit_init_output_file(bNode *node)
}
}
-bNodeType cmp_node_output_file= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_OUTPUT_FILE,
- /* name */ "File Output",
- /* width+range */ 140, 80, 300,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_output_file_in,
- /* output sock */ NULL,
- /* storage */ "NodeImageFile",
- /* execfunc */ node_composit_exec_output_file,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_output_file,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_output_file(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_OUTPUT_FILE, "File Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_output_file_in, NULL);
+ node_type_size(&ntype, 140, 80, 300);
+ node_type_init(&ntype, node_composit_init_output_file);
+ node_type_storage(&ntype, "NodeImageFile", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_output_file);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
index 5058fa51c11..5bf3af8e5cb 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ static bNodeSocketType cmp_node_premulkey_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_premulkey(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_premulkey(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
return;
@@ -58,20 +58,16 @@ static void node_composit_exec_premulkey(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_premulkey= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_PREMULKEY,
- /* name */ "Alpha Convert",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_premulkey_in,
- /* output sock */ cmp_node_premulkey_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_premulkey,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copysotragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_premulkey(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_PREMULKEY, "Alpha Convert", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_premulkey_in, cmp_node_premulkey_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_premulkey);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
index 3b9b993d5f8..1d8db72584e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,29 +36,24 @@ static bNodeSocketType cmp_node_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
VECCOPY(out[0]->vec, sock->ns.vec);
}
-bNodeType cmp_node_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_RGB,
- /* name */ "RGB",
- /* width+range */ 140, 80, 140,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_rgb_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_rgb_out);
+ node_type_size(&ntype, 140, 80, 140);
+ node_type_exec(&ntype, node_composit_exec_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
index ccb1d8abfd9..17d22d41543 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_rotate_out[]= {
};
/* only supports RGBA nodes now */
-static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
if(out[0]->hasoutput==0)
@@ -68,8 +68,8 @@ static void node_composit_exec_rotate(void *data, bNode *node, bNodeStack **in,
maxy= -centy + (float)cbuf->y;
- ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
- obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0, 0);
+ ibuf=IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
+ obuf=IMB_allocImBuf(stackbuf->x, stackbuf->y, 32, 0);
if(ibuf && obuf){
ibuf->rect_float=cbuf->rect;
@@ -120,19 +120,16 @@ static void node_composit_init_rotate(bNode *node)
node->custom1= 1; /* Bilinear Filter*/
}
-bNodeType cmp_node_rotate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ROTATE,
- /* name */ "Rotate",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_rotate_in,
- /* output sock */ cmp_node_rotate_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rotate,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_rotate,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_rotate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_rotate_in, cmp_node_rotate_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_rotate);
+ node_type_exec(&ntype, node_composit_exec_rotate);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
index 9779875b01a..6f030d3d7b3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -75,7 +75,7 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
newx= MIN2(newx, CMP_SCALE_MAX);
newy= MIN2(newy, CMP_SCALE_MAX);
- ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0, 0);
+ ibuf= IMB_allocImBuf(cbuf->x, cbuf->y, 32, 0);
if(ibuf) {
ibuf->rect_float= cbuf->rect;
IMB_scaleImBuf(ibuf, newx, newy);
@@ -109,22 +109,18 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
}
};
-bNodeType cmp_node_scale= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SCALE,
- /* name */ "Scale",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_scale_in,
- /* output sock */ cmp_node_scale_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_scale,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_scale(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_scale_in, cmp_node_scale_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_scale);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
index 0ac47c58ab3..469425c4ace 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sephsva_out[]= {
{ -1, 0, "" }
};
-static void do_sephsva(bNode *node, float *out, float *in)
+static void do_sephsva(bNode *UNUSED(node), float *out, float *in)
{
float h, s, v;
@@ -55,7 +55,7 @@ static void do_sephsva(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_sephsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -96,23 +96,18 @@ static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sephsva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPHSVA,
- /* name */ "Separate HSVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sephsva_in,
- /* output sock */ cmp_node_sephsva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sephsva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_sephsva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_sephsva_in, cmp_node_sephsva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sephsva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE HSVA ******************** */
static bNodeSocketType cmp_node_combhsva_in[]= {
@@ -127,7 +122,7 @@ static bNodeSocketType cmp_node_combhsva_out[]= {
{ -1, 0, "" }
};
-static void do_comb_hsva(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_hsva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
hsv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b);
@@ -138,7 +133,7 @@ static void do_comb_hsva(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combhsva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -171,21 +166,17 @@ static void node_composit_exec_combhsva(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combhsva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBHSVA,
- /* name */ "Combine HSVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combhsva_in,
- /* output sock */ cmp_node_combhsva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combhsva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combhsva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combhsva_in, cmp_node_combhsva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combhsva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
index c5a57f8a175..969fadf65ad 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType cmp_node_seprgba_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_seprgba(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_seprgba(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -74,23 +74,18 @@ static void node_composit_exec_seprgba(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_seprgba= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPRGBA,
- /* name */ "Separate RGBA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_seprgba_in,
- /* output sock */ cmp_node_seprgba_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_seprgba,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_seprgba(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPRGBA, "Separate RGBA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_seprgba_in, cmp_node_seprgba_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_seprgba);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE RGBA ******************** */
@@ -106,7 +101,7 @@ static bNodeSocketType cmp_node_combrgba_out[]= {
{ -1, 0, "" }
};
-static void do_combrgba(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_combrgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
out[0] = in1[0];
out[1] = in2[0];
@@ -114,7 +109,7 @@ static void do_combrgba(bNode *node, float *out, float *in1, float *in2, float *
out[3] = in4[0];
}
-static void node_composit_exec_combrgba(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combrgba(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -147,21 +142,16 @@ static void node_composit_exec_combrgba(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combrgba= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBRGBA,
- /* name */ "Combine RGBA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combrgba_in,
- /* output sock */ cmp_node_combrgba_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combrgba,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_combrgba(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBRGBA, "Combine RGBA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combrgba_in, cmp_node_combrgba_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combrgba);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
index 7b3dfccab50..b00885f6940 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sepycca_out[]= {
{ -1, 0, "" }
};
-static void do_sepycca(bNode *node, float *out, float *in)
+static void do_sepycca_601(bNode *UNUSED(node), float *out, float *in)
{
float y, cb, cr;
@@ -56,13 +56,51 @@ static void do_sepycca(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void do_sepycca_709(bNode *UNUSED(node), float *out, float *in)
+{
+ float y, cb, cr;
+
+ rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_ITU_BT709);
+
+ /*divided by 255 to normalize for viewing in */
+ out[0]= y/255.0;
+ out[1]= cb/255.0;
+ out[2]= cr/255.0;
+ out[3]= in[3];
+}
+
+static void do_sepycca_jfif(bNode *UNUSED(node), float *out, float *in)
+{
+ float y, cb, cr;
+
+ rgb_to_ycc(in[0], in[1], in[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255);
+
+ /*divided by 255 to normalize for viewing in */
+ out[0]= y/255.0;
+ out[1]= cb/255.0;
+ out[2]= cr/255.0;
+ out[3]= in[3];
+}
+
+static void node_composit_exec_sepycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* input no image? then only color operation */
if(in[0]->data==NULL) {
float y, cb, cr;
- rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601);
+ switch(node->custom1)
+ {
+ case 1:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT709);
+ break;
+ case 2:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_JFIF_0_255);
+ break;
+ case 0:
+ default:
+ rgb_to_ycc(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &y, &cb, &cr, BLI_YCC_ITU_BT601);
+ break;
+ }
/*divided by 255 to normalize for viewing in */
out[0]->vec[0] = y/255.0;
@@ -76,7 +114,19 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in,
CompBuf *cbuf2=typecheck_compbuf(cbuf, CB_RGBA);
/* convert the RGB stackbuf to an HSV representation */
- composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca, CB_RGBA);
+ switch(node->custom1)
+ {
+ case 1:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_709, CB_RGBA);
+ break;
+ case 2:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_jfif, CB_RGBA);
+ break;
+ case 0:
+ default:
+ composit1_pixel_processor(node, cbuf2, cbuf2, in[0]->vec, do_sepycca_601, CB_RGBA);
+ break;
+ }
/* separate each of those channels */
if(out[0]->hasoutput)
@@ -95,29 +145,25 @@ static void node_composit_exec_sepycca(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sepycca= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPYCCA,
- /* name */ "Separate YCbCrA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sepycca_in,
- /* output sock */ cmp_node_sepycca_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sepycca,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_sepycca(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPYCCA, "Separate YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_sepycca_in, cmp_node_sepycca_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sepycca);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE YCCA ******************** */
static bNodeSocketType cmp_node_combycca_in[]= {
{ SOCK_VALUE, 1, "Y", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cb", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
- { SOCK_VALUE, 1, "Cr", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Cb", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Cr", 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "A", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
@@ -126,7 +172,7 @@ static bNodeSocketType cmp_node_combycca_out[]= {
{ -1, 0, "" }
};
-static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_ycca_601(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
float y, cb, cr;
@@ -144,16 +190,67 @@ static void do_comb_ycca(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combycca(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void do_comb_ycca_709(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
+{
+ float r,g,b;
+ float y, cb, cr;
+
+ /*need to un-normalize the data*/
+ y=in1[0]*255;
+ cb=in2[0]*255;
+ cr=in3[0]*255;
+
+ ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_ITU_BT709);
+
+ out[0] = r;
+ out[1] = g;
+ out[2] = b;
+ out[3] = in4[0];
+}
+
+static void do_comb_ycca_jfif(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
+{
+ float r,g,b;
+ float y, cb, cr;
+
+ /*need to un-normalize the data*/
+ y=in1[0]*255;
+ cb=in2[0]*255;
+ cr=in3[0]*255;
+
+ ycc_to_rgb(y,cb,cr, &r, &g, &b, BLI_YCC_JFIF_0_255);
+
+ out[0] = r;
+ out[1] = g;
+ out[2] = b;
+ out[3] = in4[0];
+}
+
+static void node_composit_exec_combycca(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 ycca channels */
/* stack order in: 4 value channels */
/* input no image? then only color operation */
if((in[0]->data==NULL) && (in[1]->data==NULL) && (in[2]->data==NULL) && (in[3]->data==NULL)) {
- out[0]->vec[0] = in[0]->vec[0];
- out[0]->vec[1] = in[1]->vec[0];
- out[0]->vec[2] = in[2]->vec[0];
+ float y = in[0]->vec[0] * 255;
+ float cb = in[1]->vec[0] * 255;
+ float cr = in[2]->vec[0] * 255;
+
+ switch(node->custom1)
+ {
+ case 1:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT709);
+ break;
+ case 2:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_JFIF_0_255);
+ break;
+ case 0:
+ default:
+ ycc_to_rgb(y, cb, cr, &out[0]->vec[0], &out[0]->vec[1], &out[0]->vec[2], BLI_YCC_ITU_BT601);
+ break;
+ }
+
out[0]->vec[3] = in[3]->vec[0];
}
else {
@@ -169,29 +266,43 @@ static void node_composit_exec_combycca(void *data, bNode *node, bNodeStack **in
stackbuf = alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */
- composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
- in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
- do_comb_ycca, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+
+ switch(node->custom1)
+ {
+ case 1:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_709, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+
+ case 2:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_jfif, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+ case 0:
+ default:
+ composit4_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec,
+ in[2]->data, in[2]->vec, in[3]->data, in[3]->vec,
+ do_comb_ycca_601, CB_VAL, CB_VAL, CB_VAL, CB_VAL);
+ break;
+ }
out[0]->data= stackbuf;
}
}
-bNodeType cmp_node_combycca= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBYCCA,
- /* name */ "Combine YCbCrA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combycca_in,
- /* output sock */ cmp_node_combycca_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combycca,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combycca(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBYCCA, "Combine YCbCrA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combycca_in, cmp_node_combycca_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combycca);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
index 13b71026054..65b0e5a645c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_sepyuva_out[]= {
{ -1, 0, "" }
};
-static void do_sepyuva(bNode *node, float *out, float *in)
+static void do_sepyuva(bNode *UNUSED(node), float *out, float *in)
{
float y, u, v;
@@ -55,7 +55,7 @@ static void do_sepyuva(bNode *node, float *out, float *in)
out[3]= in[3];
}
-static void node_composit_exec_sepyuva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_sepyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw channels */
/* stack order in: col */
@@ -96,22 +96,18 @@ static void node_composit_exec_sepyuva(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_sepyuva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SEPYUVA,
- /* name */ "Separate YUVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_sepyuva_in,
- /* output sock */ cmp_node_sepyuva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_sepyuva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_sepyuva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SEPYUVA, "Separate YUVA", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_sepyuva_in, cmp_node_sepyuva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_sepyuva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE YUVA ******************** */
@@ -127,7 +123,7 @@ static bNodeSocketType cmp_node_combyuva_out[]= {
{ -1, 0, "" }
};
-static void do_comb_yuva(bNode *node, float *out, float *in1, float *in2, float *in3, float *in4)
+static void do_comb_yuva(bNode *UNUSED(node), float *out, float *in1, float *in2, float *in3, float *in4)
{
float r,g,b;
yuv_to_rgb(in1[0], in2[0], in3[0], &r, &g, &b);
@@ -138,7 +134,7 @@ static void do_comb_yuva(bNode *node, float *out, float *in1, float *in2, float
out[3] = in4[0];
}
-static void node_composit_exec_combyuva(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_combyuva(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: 1 rgba channels */
/* stack order in: 4 value channels */
@@ -171,20 +167,16 @@ static void node_composit_exec_combyuva(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_combyuva= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_COMBYUVA,
- /* name */ "Combine YUVA",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_combyuva_in,
- /* output sock */ cmp_node_combyuva_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_combyuva,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_combyuva(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_COMBYUVA, "Combine YUVA", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_combyuva_in, cmp_node_combyuva_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_combyuva);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
index a7d10017c1f..920bb33604f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType cmp_node_setalpha_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_setalpha(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: RGBA image */
/* stack order in: col, alpha */
@@ -70,20 +70,15 @@ static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in
}
}
-bNodeType cmp_node_setalpha= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SETALPHA,
- /* name */ "Set Alpha",
- /* width+range */ 120, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_setalpha_in,
- /* output sock */ cmp_node_setalpha_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_setalpha,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_setalpha(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SETALPHA, "Set Alpha", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_setalpha_in, cmp_node_setalpha_out);
+ node_type_size(&ntype, 120, 40, 140);
+ node_type_exec(&ntype, node_composit_exec_setalpha);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
index 98bda1bd7fa..e66abd994dd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,7 +36,7 @@ static bNodeSocketType cmp_node_splitviewer_in[]= {
{ -1, 0, "" }
};
-static void do_copy_split_rgba(bNode *node, float *out, float *in1, float *in2, float *fac)
+static void do_copy_split_rgba(bNode *UNUSED(node), float *out, float *in1, float *in2, float *fac)
{
if(*fac==0.0f) {
QUATCOPY(out, in1);
@@ -46,7 +46,7 @@ static void do_copy_split_rgba(bNode *node, float *out, float *in1, float *in2,
}
}
-static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_splitviewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: image image */
@@ -146,22 +146,20 @@ static void node_composit_init_splitviewer(bNode* node)
node->custom1= 50; /* default 50% split */
}
-bNodeType cmp_node_splitviewer= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_SPLITVIEWER,
- /* name */ "SplitViewer",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ cmp_node_splitviewer_in,
- /* output sock */ NULL,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_splitviewer,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_splitviewer,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_splitviewer(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_SPLITVIEWER, "SplitViewer", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ cmp_node_splitviewer_in, NULL);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, node_composit_init_splitviewer);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_splitviewer);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
index f990fa452cb..8d8480688c7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -79,7 +79,7 @@ static void texture_procedural(CompBuf *cbuf, float *out, float xco, float yco)
else {
VECCOPY(col, nor);
}
-
+
typecheck_compbuf_color(out, col, cbuf->type, cbuf->procedural_type);
}
@@ -96,19 +96,20 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
/* first make the preview image */
CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
- /* Also take care about the render size! */
- sizex = (rd->size*rd->xsch)/100;
- sizey = (rd->size*rd->ysch)/100;
-
prevbuf->rect_procedural= texture_procedural;
prevbuf->node= node;
VECCOPY(prevbuf->procedural_offset, in[0]->vec);
VECCOPY(prevbuf->procedural_size, in[1]->vec);
prevbuf->procedural_type= CB_RGBA;
composit1_pixel_processor(node, prevbuf, prevbuf, out[0]->vec, do_copy_rgba, CB_RGBA);
+
generate_preview(data, node, prevbuf);
free_compbuf(prevbuf);
+ /* texture procedural buffer type doesnt work well, we now render a buffer in scene size */
+ sizex = (rd->size*rd->xsch)/100;
+ sizey = (rd->size*rd->ysch)/100;
+
if(out[0]->hasoutput) {
CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_VAL, 1); /* alloc */
@@ -117,6 +118,8 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
VECCOPY(stackbuf->procedural_offset, in[0]->vec);
VECCOPY(stackbuf->procedural_size, in[1]->vec);
stackbuf->procedural_type= CB_VAL;
+ composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_value, CB_VAL);
+ stackbuf->rect_procedural= NULL;
out[0]->data= stackbuf;
}
@@ -128,28 +131,25 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
VECCOPY(stackbuf->procedural_offset, in[0]->vec);
VECCOPY(stackbuf->procedural_size, in[1]->vec);
stackbuf->procedural_type= CB_RGBA;
+ composit1_pixel_processor(node, stackbuf, stackbuf, out[0]->vec, do_copy_rgba, CB_RGBA);
+ stackbuf->rect_procedural= NULL;
out[1]->data= stackbuf;
}
}
}
-bNodeType cmp_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ cmp_node_texture_in,
- /* output sock */ cmp_node_texture_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_texture,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_texture(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ cmp_node_texture_in, cmp_node_texture_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, node_composit_exec_texture);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
index 12f0c171f94..ac305ad0319 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -123,7 +123,7 @@ static void tonemap(NodeTonemap* ntm, CompBuf* dst, CompBuf* src)
}
-static void node_composit_exec_tonemap(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_tonemap(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *img = in[0]->data;
@@ -158,19 +158,17 @@ static void node_composit_init_tonemap(bNode* node)
node->storage = ntm;
}
-bNodeType cmp_node_tonemap = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TONEMAP,
- /* name */ "Tonemap",
- /* width+range */ 150, 120, 200,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_tonemap_in,
- /* output sock */ cmp_node_tonemap_out,
- /* storage */ "NodeTonemap",
- /* execfunc */ node_composit_exec_tonemap,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_tonemap,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_tonemap(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TONEMAP, "Tonemap", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_tonemap_in, cmp_node_tonemap_out);
+ node_type_size(&ntype, 150, 120, 200);
+ node_type_init(&ntype, node_composit_init_tonemap);
+ node_type_storage(&ntype, "NodeTonemap", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_tonemap);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
index ca359d436f6..9db7819658d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ static bNodeSocketType cmp_node_translate_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_translate(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_translate(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
if(in[0]->data) {
CompBuf *cbuf= in[0]->data;
@@ -56,20 +56,16 @@ static void node_composit_exec_translate(void *data, bNode *node, bNodeStack **i
}
}
-bNodeType cmp_node_translate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_TRANSLATE,
- /* name */ "Translate",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ cmp_node_translate_in,
- /* output sock */ cmp_node_translate_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_translate,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_translate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ cmp_node_translate_in, cmp_node_translate_out);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, node_composit_exec_translate);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
index 6ce03f38cdb..9de4a8ca4ef 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -46,7 +46,7 @@ static void do_colorband_composit(bNode *node, float *out, float *in)
do_colorband(node->storage, in[0], out);
}
-static void node_composit_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac */
/* stack order out: col, alpha */
@@ -80,23 +80,20 @@ static void node_composit_init_valtorgb(bNode* node)
node->storage= add_colorband(1);
}
-bNodeType cmp_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ cmp_node_valtorgb_in,
- /* output sock */ cmp_node_valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ node_composit_exec_valtorgb,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_valtorgb,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ cmp_node_valtorgb_in, cmp_node_valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, node_composit_init_valtorgb);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_valtorgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RGBTOBW ******************** */
@@ -109,12 +106,12 @@ static bNodeSocketType cmp_node_rgbtobw_out[]= {
{ -1, 0, "" }
};
-static void do_rgbtobw(bNode *node, float *out, float *in)
+static void do_rgbtobw(bNode *UNUSED(node), float *out, float *in)
{
out[0]= in[0]*0.35f + in[1]*0.45f + in[2]*0.2f;
}
-static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_rgbtobw(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw */
/* stack order in: col */
@@ -137,21 +134,14 @@ static void node_composit_exec_rgbtobw(void *data, bNode *node, bNodeStack **in,
}
}
-bNodeType cmp_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ cmp_node_rgbtobw_in,
- /* output sock */ cmp_node_rgbtobw_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_rgbtobw,
- /* butfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_cmp_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
-
+ node_type_base(&ntype, CMP_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ cmp_node_rgbtobw_in, cmp_node_rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_rgbtobw);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
index 14a3b6fe15c..bd5f6853dc5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,27 +35,23 @@ static bNodeSocketType cmp_node_value_out[]= {
{ -1, 0, "" }
};
-static void node_composit_exec_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
out[0]->vec[0]= sock->ns.vec[0];
}
-bNodeType cmp_node_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VALUE,
- /* name */ "Value",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ cmp_node_value_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_value,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_cmp_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, cmp_node_value_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
index eaeeadd02af..ff17a27d5e5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,7 +44,7 @@ static bNodeSocketType cmp_node_vecblur_out[]= {
-static void node_composit_exec_vecblur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_vecblur(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
NodeBlurData *nbd= node->storage;
CompBuf *new, *img= in[0]->data, *vecbuf= in[2]->data, *zbuf= in[1]->data;
@@ -91,20 +91,18 @@ static void node_composit_init_vecblur(bNode* node)
};
/* custom1: itterations, custom2: maxspeed (0 = nolimit) */
-bNodeType cmp_node_vecblur= {
- /* next, prev */ NULL, NULL,
- /* type code */ CMP_NODE_VECBLUR,
- /* name */ "Vector Blur",
- /* width+range */ 120, 80, 200,
- /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
- /* input sock */ cmp_node_vecblur_in,
- /* output sock */ cmp_node_vecblur_out,
- /* storage */ "NodeBlurData",
- /* execfunc */ node_composit_exec_vecblur,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_vecblur,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
+void register_node_type_cmp_vecblur(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VECBLUR, "Vector Blur", NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ cmp_node_vecblur_in, cmp_node_vecblur_out);
+ node_type_size(&ntype, 120, 80, 200);
+ node_type_init(&ntype, node_composit_init_vecblur);
+ node_type_storage(&ntype, "NodeBlurData", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_vecblur);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
index 80200ad9ce6..18b445c25fd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,7 +39,7 @@ static bNodeSocketType cmp_node_viewer_in[]= {
};
-static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_composit_exec_viewer(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
/* image assigned to output */
/* stack order input sockets: col, alpha, z */
@@ -128,21 +128,18 @@ static void node_composit_init_viewer(bNode* node)
iuser->ok= 1;
}
-bNodeType cmp_node_viewer= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_VIEWER,
- /* name */ "Viewer",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ cmp_node_viewer_in,
- /* output sock */ NULL,
- /* storage */ "ImageUser",
- /* execfunc */ node_composit_exec_viewer,
- /* butfunc */ NULL,
- /* initfunc */ node_composit_init_viewer,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-
-};
+void register_node_type_cmp_viewer(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ cmp_node_viewer_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_init(&ntype, node_composit_init_viewer);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_composit_exec_viewer);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
index 7be9f34f00b..33e3bd94708 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,7 +31,7 @@
/* **************** Z COMBINE ******************** */
- /* lazy coder note: node->custom1 is abused to send signal */
+ /* lazy coder note: node->custom2 is abused to send signal */
static bNodeSocketType cmp_node_zcombine_in[]= {
{ SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f},
@@ -47,13 +47,40 @@ static bNodeSocketType cmp_node_zcombine_out[]= {
static void do_zcombine(bNode *node, float *out, float *src1, float *z1, float *src2, float *z2)
{
+ float alpha;
+ float malpha;
+
if(*z1 <= *z2) {
- QUATCOPY(out, src1);
+ if (node->custom1) {
+ // use alpha in combine operation
+ alpha= src1[3];
+ malpha= 1.0f - alpha;
+ out[0]= malpha*src2[0] + alpha*src1[0];
+ out[1]= malpha*src2[1] + alpha*src1[1];
+ out[2]= malpha*src2[2] + alpha*src1[2];
+ out[3]= malpha*src2[3] + alpha*src1[3];
+ }
+ else {
+ // do combination based solely on z value
+ QUATCOPY(out, src1);
+ }
}
else {
- QUATCOPY(out, src2);
+ if (node->custom1) {
+ // use alpha in combine operation
+ alpha= src2[3];
+ malpha= 1.0f - alpha;
+ out[0]= malpha*src1[0] + alpha*src2[0];
+ out[1]= malpha*src1[1] + alpha*src2[1];
+ out[2]= malpha*src1[2] + alpha*src2[2];
+ out[3]= malpha*src1[3] + alpha*src2[3];
+ }
+ else {
+ // do combination based solely on z value
+ QUATCOPY(out, src1);
+ }
- if(node->custom1)
+ if(node->custom2)
*z1= *z2;
}
}
@@ -62,20 +89,49 @@ static void do_zcombine_mask(bNode *node, float *out, float *z1, float *z2)
{
if(*z1 > *z2) {
*out= 1.0f;
- if(node->custom1)
+ if(node->custom2)
*z1= *z2;
}
}
static void do_zcombine_add(bNode *node, float *out, float *col1, float *col2, float *acol)
{
- float alpha= *acol;
- float malpha= 1.0f - alpha;
-
- out[0]= malpha*col1[0] + alpha*col2[0];
- out[1]= malpha*col1[1] + alpha*col2[1];
- out[2]= malpha*col1[2] + alpha*col2[2];
- out[3]= malpha*col1[3] + alpha*col2[3];
+ float alpha;
+ float malpha;
+
+ if (node->custom1) {
+ // use alpha in combine operation, antialiased mask in used here just as hint for the z value
+ if (*acol>0.0f) {
+ alpha= col2[3];
+ malpha= 1.0f - alpha;
+
+
+ out[0]= malpha*col1[0] + alpha*col2[0];
+ out[1]= malpha*col1[1] + alpha*col2[1];
+ out[2]= malpha*col1[2] + alpha*col2[2];
+ out[3]= malpha*col1[3] + alpha*col2[3];
+ }
+ else {
+ alpha= col1[3];
+ malpha= 1.0f - alpha;
+
+
+ out[0]= malpha*col2[0] + alpha*col1[0];
+ out[1]= malpha*col2[1] + alpha*col1[1];
+ out[2]= malpha*col2[2] + alpha*col1[2];
+ out[3]= malpha*col2[3] + alpha*col1[3];
+ }
+ }
+ else {
+ // do combination based solely on z value but with antialiased mask
+ alpha = *acol;
+ malpha= 1.0f - alpha;
+
+ out[0]= malpha*col1[0] + alpha*col2[0];
+ out[1]= malpha*col1[1] + alpha*col2[1];
+ out[2]= malpha*col1[2] + alpha*col2[2];
+ out[3]= malpha*col1[3] + alpha*col2[3];
+ }
}
static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
@@ -107,11 +163,11 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
*zval= in[1]->vec[0];
}
/* lazy coder hack */
- node->custom1= 1;
+ node->custom2= 1;
out[1]->data= zbuf;
}
else {
- node->custom1= 0;
+ node->custom2= 0;
zbuf= in[1]->data;
}
@@ -163,20 +219,15 @@ static void node_composit_exec_zcombine(void *data, bNode *node, bNodeStack **in
}
-bNodeType cmp_node_zcombine= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ CMP_NODE_ZCOMBINE,
- /* name */ "Z Combine",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ cmp_node_zcombine_in,
- /* output sock */ cmp_node_zcombine_out,
- /* storage */ "",
- /* execfunc */ node_composit_exec_zcombine,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_cmp_zcombine(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, CMP_NODE_ZCOMBINE, "Z Combine", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ cmp_node_zcombine_in, cmp_node_zcombine_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_composit_exec_zcombine);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
deleted file mode 100644
index 5e97864fb95..00000000000
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_cmp
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index bcb038bccc3..28497b98197 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -62,7 +62,7 @@ CompBuf *dupalloc_compbuf(CompBuf *cbuf)
{
CompBuf *dupbuf= alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1);
if(dupbuf) {
- memcpy(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
+ memmove(dupbuf->rect, cbuf->rect, cbuf->type*sizeof(float)*cbuf->x*cbuf->y);
dupbuf->xof= cbuf->xof;
dupbuf->yof= cbuf->yof;
@@ -414,12 +414,12 @@ CompBuf *typecheck_compbuf(CompBuf *inbuf, int type)
return inbuf;
}
-float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad)
+static float *compbuf_get_pixel(CompBuf *cbuf, float *defcol, float *use, int x, int y, int xrad, int yrad)
{
if(cbuf) {
if(cbuf->rect_procedural) {
- cbuf->rect_procedural(cbuf, rectf, (float)x/(float)xrad, (float)y/(float)yrad);
- return rectf;
+ cbuf->rect_procedural(cbuf, use, (float)x/(float)xrad, (float)y/(float)yrad);
+ return use;
}
else {
static float col[4]= {0.0f, 0.0f, 0.0f, 0.0f};
@@ -434,7 +434,7 @@ float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, in
return cbuf->rect + cbuf->type*( (cbuf->yrad+y)*cbuf->x + (cbuf->xrad+x) );
}
}
- else return rectf;
+ else return defcol;
}
/* **************************************************** */
@@ -446,6 +446,7 @@ void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
{
CompBuf *src_use;
float *outfp=out->rect, *srcfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src_use= typecheck_compbuf(src_buf, src_type);
@@ -455,7 +456,7 @@ void composit1_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- srcfp= compbuf_get_pixel(src_use, src_col, x, y, xrad, yrad);
+ srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad);
func(node, outfp, srcfp);
}
}
@@ -471,6 +472,7 @@ void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
{
CompBuf *src_use, *fac_use;
float *outfp=out->rect, *srcfp, *facfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src_use= typecheck_compbuf(src_buf, src_type);
@@ -481,8 +483,8 @@ void composit2_pixel_processor(bNode *node, CompBuf *out, CompBuf *src_buf, floa
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- srcfp= compbuf_get_pixel(src_use, src_col, x, y, xrad, yrad);
- facfp= compbuf_get_pixel(fac_use, fac, x, y, xrad, yrad);
+ srcfp= compbuf_get_pixel(src_use, src_col, color, x, y, xrad, yrad);
+ facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad);
func(node, outfp, srcfp, facfp);
}
@@ -500,6 +502,7 @@ void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
{
CompBuf *src1_use, *src2_use, *fac_use;
float *outfp=out->rect, *src1fp, *src2fp, *facfp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src1_use= typecheck_compbuf(src1_buf, src1_type);
@@ -511,9 +514,9 @@ void composit3_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- src1fp= compbuf_get_pixel(src1_use, src1_col, x, y, xrad, yrad);
- src2fp= compbuf_get_pixel(src2_use, src2_col, x, y, xrad, yrad);
- facfp= compbuf_get_pixel(fac_use, fac, x, y, xrad, yrad);
+ src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad);
+ src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad);
+ facfp= compbuf_get_pixel(fac_use, fac, color, x, y, xrad, yrad);
func(node, outfp, src1fp, src2fp, facfp);
}
@@ -535,6 +538,7 @@ void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
{
CompBuf *src1_use, *src2_use, *fac1_use, *fac2_use;
float *outfp=out->rect, *src1fp, *src2fp, *fac1fp, *fac2fp;
+ float color[4]; /* local color if compbuf is procedural */
int xrad, yrad, x, y;
src1_use= typecheck_compbuf(src1_buf, src1_type);
@@ -547,10 +551,10 @@ void composit4_pixel_processor(bNode *node, CompBuf *out, CompBuf *src1_buf, flo
for(y= -yrad; y<-yrad+out->y; y++) {
for(x= -xrad; x<-xrad+out->x; x++, outfp+=out->type) {
- src1fp= compbuf_get_pixel(src1_use, src1_col, x, y, xrad, yrad);
- src2fp= compbuf_get_pixel(src2_use, src2_col, x, y, xrad, yrad);
- fac1fp= compbuf_get_pixel(fac1_use, fac1, x, y, xrad, yrad);
- fac2fp= compbuf_get_pixel(fac2_use, fac2, x, y, xrad, yrad);
+ src1fp= compbuf_get_pixel(src1_use, src1_col, color, x, y, xrad, yrad);
+ src2fp= compbuf_get_pixel(src2_use, src2_col, color, x, y, xrad, yrad);
+ fac1fp= compbuf_get_pixel(fac1_use, fac1, color, x, y, xrad, yrad);
+ fac2fp= compbuf_get_pixel(fac2_use, fac2, color, x, y, xrad, yrad);
func(node, outfp, src1fp, fac1fp, src2fp, fac2fp);
}
@@ -662,59 +666,59 @@ void generate_preview(void *data, bNode *node, CompBuf *stackbuf)
}
}
-void do_rgba_to_yuva(bNode *node, float *out, float *in)
+void do_rgba_to_yuva(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_yuv(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_rgba_to_hsva(bNode *node, float *out, float *in)
+void do_rgba_to_hsva(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_hsv(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_rgba_to_ycca(bNode *node, float *out, float *in)
+void do_rgba_to_ycca(bNode *UNUSED(node), float *out, float *in)
{
rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
-void do_yuva_to_rgba(bNode *node, float *out, float *in)
+void do_yuva_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
yuv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_hsva_to_rgba(bNode *node, float *out, float *in)
+void do_hsva_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
hsv_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2]);
out[3]=in[3];
}
-void do_ycca_to_rgba(bNode *node, float *out, float *in)
+void do_ycca_to_rgba(bNode *UNUSED(node), float *out, float *in)
{
ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
out[3]=in[3];
}
-void do_copy_rgba(bNode *node, float *out, float *in)
+void do_copy_rgba(bNode *UNUSED(node), float *out, float *in)
{
QUATCOPY(out, in);
}
-void do_copy_rgb(bNode *node, float *out, float *in)
+void do_copy_rgb(bNode *UNUSED(node), float *out, float *in)
{
VECCOPY(out, in);
out[3]= 1.0f;
}
-void do_copy_value(bNode *node, float *out, float *in)
+void do_copy_value(bNode *UNUSED(node), float *out, float *in)
{
out[0]= in[0];
}
-void do_copy_a_rgba(bNode *node, float *out, float *in, float *fac)
+void do_copy_a_rgba(bNode *UNUSED(node), float *out, float *in, float *fac)
{
VECCOPY(out, in);
out[3]= *fac;
@@ -1303,7 +1307,7 @@ CompBuf* qd_downScaledCopy(CompBuf* src, int scale)
void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
{
double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
- float *X, *Y, *W;
+ double *X, *Y, *W;
int i, x, y, sz;
// <0.5 not valid, though can have a possibly useful sort of sharpening effect
@@ -1367,9 +1371,9 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
// intermediate buffers
sz = MAX2(src->x, src->y);
- X = MEM_callocN(sz*sizeof(float), "IIR_gauss X buf");
- Y = MEM_callocN(sz*sizeof(float), "IIR_gauss Y buf");
- W = MEM_callocN(sz*sizeof(float), "IIR_gauss W buf");
+ X = MEM_callocN(sz*sizeof(double), "IIR_gauss X buf");
+ Y = MEM_callocN(sz*sizeof(double), "IIR_gauss Y buf");
+ W = MEM_callocN(sz*sizeof(double), "IIR_gauss W buf");
if (xy & 1) { // H
for (y=0; y<src->y; ++y) {
const int yx = y*src->x;
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h
index 9dfea6abf54..5df670641ca 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -46,25 +46,28 @@
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_rand.h"
+#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "BKE_object.h"
#include "../CMP_node.h"
#include "node_util.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-#include "BLI_rand.h"
-#include "BLI_threads.h"
-
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -117,7 +120,6 @@ CompBuf *get_cropped_compbuf(rcti *drect, float *rectf, int rectx, int recty, in
CompBuf *scalefast_compbuf(CompBuf *inbuf, int newx, int newy);
CompBuf *typecheck_compbuf(CompBuf *inbuf, int type);
void typecheck_compbuf_color(float *out, float *in, int outtype, int intype);
-float *compbuf_get_pixel(CompBuf *cbuf, float *rectf, int x, int y, int xrad, int yrad);
/* **************************************************** */
@@ -163,7 +165,7 @@ void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2);
extern void node_ID_title_cb(void *node_v, void *unused_v);
-/* utility functions used by glare, tonemap and lense distortion */
+/* utility functions used by glare, tonemap and lens distortion */
/* soms macros for color handling */
typedef float fRGB[4];
/* clear color */
diff --git a/source/blender/nodes/intern/Makefile b/source/blender/nodes/intern/Makefile
deleted file mode 100644
index 1ffc09bce2c..00000000000
--- a/source/blender/nodes/intern/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-DIRS = SHD_nodes CMP_nodes TEX_nodes
-include nan_subdirs.mk
diff --git a/source/blender/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
deleted file mode 100644
index 666ffd4a7d3..00000000000
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_shd
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../../python
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I../../../gpu
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
index d89099955aa..d6339b0677c 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,7 +38,7 @@ static bNodeSocketType sh_node_camera_out[]= {
};
-static void node_shader_exec_camera(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_camera(void *data, bNode *UNUSED(node), bNodeStack **UNUSED(in), bNodeStack **out)
{
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi; /* Data we need for shading. */
@@ -49,26 +49,23 @@ static void node_shader_exec_camera(void *data, bNode *node, bNodeStack **in, bN
}
}
-static int gpu_shader_camera(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_camera(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "camera", in, out, GPU_builtin(GPU_VIEW_POSITION));
}
-bNodeType sh_node_camera= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CAMERA,
- /* name */ "Camera Data",
- /* width+range */ 95, 95, 120,
- /* class+opts */ NODE_CLASS_INPUT, 0,
- /* input sock */ NULL,
- /* output sock */ sh_node_camera_out,
- /* storage */ "node_camera",
- /* execfunc */ node_shader_exec_camera,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_camera
-};
+void register_node_type_sh_camera(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0,
+ NULL, sh_node_camera_out);
+ node_type_size(&ntype, 95, 95, 120);
+ node_type_storage(&ntype, "node_camera", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_camera);
+ node_type_gpu(&ntype, gpu_shader_camera);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
index 4e47e75993d..7e44a090d85 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_curve_vec_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_curve_vec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec[3];
@@ -66,24 +66,21 @@ static int gpu_shader_curve_vec(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "curves_vec", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_curve_vec= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CURVE_VEC,
- /* name */ "Vector Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_curve_vec_in,
- /* output sock */ sh_node_curve_vec_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_shader_exec_curve_vec,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_curve_vec,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_curve_vec
-
-};
+void register_node_type_sh_curve_vec(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_curve_vec_in, sh_node_curve_vec_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_shader_init_curve_vec);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_shader_exec_curve_vec);
+ node_type_gpu(&ntype, gpu_shader_curve_vec);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** CURVE RGB ******************** */
static bNodeSocketType sh_node_curve_rgb_in[]= {
@@ -97,7 +94,7 @@ static bNodeSocketType sh_node_curve_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_curve_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec[3];
@@ -123,21 +120,18 @@ static int gpu_shader_curve_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "curves_rgb", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_curve_rgb_in,
- /* output sock */ sh_node_curve_rgb_out,
- /* storage */ "CurveMapping",
- /* execfunc */ node_shader_exec_curve_rgb,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_curve_rgb,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_curve_rgb
-};
+void register_node_type_sh_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_curve_rgb_in, sh_node_curve_rgb_out);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, node_shader_init_curve_rgb);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, node_shader_exec_curve_rgb);
+ node_type_gpu(&ntype, gpu_shader_curve_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
index 5e391e02feb..75c6799c92a 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,22 +27,22 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+/* TODO, support python3.x */
+#undef WITH_PYTHON
+
+#ifdef WITH_PYTHON
#include <Python.h>
#include <compile.h>
#include <eval.h>
#endif
-/* TODO, support python3.x */
-#define DISABLE_PYTHON 1
-
#include "DNA_text_types.h"
#include "BKE_text.h"
-#include "BKE_utildefines.h"
+
// XXX
#if 0
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "api2_2x/Node.h"
#include "api2_2x/gen_utils.h"
#include "BPY_extern.h"
@@ -57,7 +57,7 @@ static void node_dynamic_setup(bNode *node);
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out);
static void node_dynamic_free_storage_cb(bNode *node);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *init_dynamicdict(void) {
PyObject *newscriptdict, *item;
PyGILState_STATE gilstate = PyGILState_Ensure();
@@ -156,7 +156,7 @@ static void node_dynamic_update_socket_links(bNode *node, bNodeTree *ntree)
static void node_dynamic_free_storage_cb(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
NodeScriptDict *nsd;
PyObject *pydict;
BPy_Node *pynode;
@@ -186,7 +186,7 @@ static void node_dynamic_disable(bNode *node)
/* Disable all pynodes using the given text (script) id */
static void node_dynamic_disable_all_by_id(ID *id)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Material *ma; /* XXX hardcoded for shaders */
for (ma= G.main->mat.first; ma; ma= ma->id.next) {
@@ -346,7 +346,7 @@ int nodeDynamicUnlinkText(ID *txtid) {
static void node_dynamic_pyerror_print(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyGILState_STATE gilstate = PyGILState_Ensure();
fprintf(stderr, "\nError in dynamic node script \"%s\":\n", node->name);
@@ -373,7 +373,7 @@ static void node_dynamic_register_type(bNode *node)
node->typeinfo->name = BLI_strdup(node->name);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* node_dynamic_get_pynode:
* Find the pynode definition from the script */
static PyObject *node_dynamic_get_pynode(PyObject *dict)
@@ -415,11 +415,11 @@ static PyObject *node_dynamic_get_pynode(PyObject *dict)
"no PyNode definition found in the script!");
return NULL;
}
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
static int node_dynamic_parse(struct bNode *node)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return -1;
#else
PyObject *dict= NULL;
@@ -516,7 +516,7 @@ static int node_dynamic_parse(struct bNode *node)
* pynodes already linked to a script (node->id != NULL). */
static void node_dynamic_setup(bNode *node)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
NodeScriptDict *nsd = NULL;
bNodeTree *nodetree = NULL;
bNodeType *ntype = NULL;
@@ -640,7 +640,7 @@ static void node_dynamic_setup(bNode *node)
node->custom1 = BSET(node->custom1, NODE_DYNAMIC_READY);
PyGILState_Release(gilstate);
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
return;
}
@@ -673,7 +673,7 @@ static void node_dynamic_init_cb(bNode *node) {
/* node_dynamic_copy_cb: pynode copy callback */
static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
{
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return;
#else
NodeScriptDict *nsd;
@@ -698,7 +698,7 @@ static void node_dynamic_copy_cb(bNode *orig_node, bNode *new_node)
/* node_dynamic_exec_cb: the execution callback called per pixel
* during rendering. */
static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNodeStack **out) {
-#ifdef DISABLE_PYTHON
+#ifndef WITH_PYTHON
return;
#else
BPy_Node *mynode = NULL;
@@ -758,26 +758,29 @@ static void node_dynamic_exec_cb(void *data, bNode *node, bNodeStack **in, bNode
#endif
}
-bNodeType node_dynamic_typeinfo = {
- /* next, prev */ NULL, NULL,
- /* type code */ NODE_DYNAMIC,
- /* name */ "Dynamic",
- /* width+range */ 150, 60, 300,
- /* class+opts */ NODE_CLASS_OP_DYNAMIC, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ NULL,
- /* storage */ "NodeScriptDict",
- /* execfunc */ node_dynamic_exec_cb,
- /* butfunc */ NULL,
- /* initfunc */ node_dynamic_init_cb,
- /* freefunc */ node_dynamic_free_storage_cb,
- /* copyfunc */ node_dynamic_copy_cb,
- /* id */ NULL
-};
+void register_node_type_sh_dynamic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, NODE_OPTIONS, NULL, NULL);
+ node_type_size(&ntype, 150, 60, 300);
+ node_type_init(&ntype, node_dynamic_init_cb);
+ node_type_storage(&ntype, "NodeScriptDict", node_dynamic_free_storage_cb, node_dynamic_copy_cb);
+ node_type_exec(&ntype, node_dynamic_exec_cb);
+
+ nodeRegisterType(lb, &ntype);
+}
#else
-bNodeType node_dynamic_typeinfo = {NULL};
+void register_node_type_sh_dynamic(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0, NULL, NULL);
+
+ nodeRegisterType(lb, &ntype);
+}
#endif
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
index aefe7d104b5..dbefa819be0 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,7 +47,7 @@ static bNodeSocketType sh_node_geom_out[]= {
};
/* node execute callback */
-static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
if(data) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
@@ -131,21 +131,18 @@ static int gpu_shader_geom(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUN
}
/* node type definition */
-bNodeType sh_node_geom= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_GEOMETRY,
- /* name */ "Geometry",
- /* width+range */ 120, 80, 160,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_geom_out,
- /* storage */ "NodeGeometry",
- /* execfunc */ node_shader_exec_geom,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_geometry,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_geom
-
-};
+void register_node_type_sh_geom(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_geom_out);
+ node_type_size(&ntype, 120, 80, 160);
+ node_type_init(&ntype, node_shader_init_geometry);
+ node_type_storage(&ntype, "NodeGeometry", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_geom);
+ node_type_gpu(&ntype, gpu_shader_geom);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
index 4f319f8937c..78a0c197525 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -45,7 +45,7 @@ static bNodeSocketType sh_node_hue_sat_out[]= {
};
/* note: it would be possible to use CMP version for both nodes */
-static void do_hue_sat_fac(bNode *node, float *out, float *hue, float *sat, float *val, float *in, float *fac)
+static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float *hue, float *sat, float *val, float *in, float *fac)
{
if(*fac!=0.0f && (*hue!=0.5f || *sat!=1.0 || *val!=1.0)) {
float col[3], hsv[3], mfac= 1.0f - *fac;
@@ -66,34 +66,29 @@ static void do_hue_sat_fac(bNode *node, float *out, float *hue, float *sat, floa
}
}
-static void node_shader_exec_hue_sat(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_hue_sat(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
do_hue_sat_fac(node, out[0]->vec, in[0]->vec, in[1]->vec, in[2]->vec, in[4]->vec, in[3]->vec);
}
-static int gpu_shader_hue_sat(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_hue_sat(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "hue_sat", in, out);
}
-bNodeType sh_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_hue_sat_in,
- /* output sock */ sh_node_hue_sat_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_hue_sat,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_hue_sat
-
-};
+void register_node_type_sh_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_hue_sat_in, sh_node_hue_sat_out);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_exec(&ntype, node_shader_exec_hue_sat);
+ node_type_gpu(&ntype, gpu_shader_hue_sat);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
index 08666f4dd52..1699493b446 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,7 +43,7 @@ static bNodeSocketType sh_node_invert_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_invert(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_invert(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in,
bNodeStack **out)
{
float col[3], facm;
@@ -64,26 +64,22 @@ bNodeStack **out)
VECCOPY(out[0]->vec, col);
}
-static int gpu_shader_invert(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_invert(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "invert", in, out);
}
-bNodeType sh_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_invert_in,
- /* output sock */ sh_node_invert_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_invert,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_invert
-};
+void register_node_type_sh_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_invert_in, sh_node_invert_out);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, node_shader_exec_invert);
+ node_type_gpu(&ntype, gpu_shader_invert);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
index 49778625446..a6f4f7c80df 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ static bNodeSocketType sh_node_mapping_out[]= {
};
/* do the regular mapping options for blender textures */
-static void node_shader_exec_mapping(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_mapping(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
TexMapping *texmap= node->storage;
float *vec= out[0]->vec;
@@ -83,22 +83,17 @@ static int gpu_shader_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
return GPU_stack_link(mat, "mapping", in, out, tmat, tmin, tmax, tdomin, tdomax);
}
-bNodeType sh_node_mapping= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MAPPING,
- /* name */ "Mapping",
- /* width+range */ 240, 160, 320,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_mapping_in,
- /* output sock */ sh_node_mapping_out,
- /* storage */ "TexMapping",
- /* execfunc */ node_shader_exec_mapping,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_mapping,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_mapping
+void register_node_type_sh_mapping(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
+ node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_mapping_in, sh_node_mapping_out);
+ node_type_size(&ntype, 240, 160, 320);
+ node_type_init(&ntype, node_shader_init_mapping);
+ node_type_storage(&ntype, "TexMapping", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_mapping);
+ node_type_gpu(&ntype, gpu_shader_mapping);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
index 4395eef0a5f..e8c30b621f5 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -235,10 +235,12 @@ static int gpu_shader_material(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
/* write to outputs */
if(node->custom1 & SH_NODE_MAT_DIFF) {
- if(node->custom1 & SH_NODE_MAT_SPEC)
- out[MAT_OUT_COLOR].link= shr.combined;
- else
- out[MAT_OUT_COLOR].link= shr.diff;
+ out[MAT_OUT_COLOR].link= shr.combined;
+
+ if(!(node->custom1 & SH_NODE_MAT_SPEC)) {
+ GPUNodeLink *link;
+ GPU_link(mat, "vec_math_sub", shr.combined, shr.spec, &out[MAT_OUT_COLOR].link, &link);
+ }
}
else if(node->custom1 & SH_NODE_MAT_SPEC) {
out[MAT_OUT_COLOR].link= shr.spec;
@@ -265,39 +267,33 @@ static int gpu_shader_material(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return 0;
}
-bNodeType sh_node_material= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATERIAL,
- /* name */ "Material",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_material_in,
- /* output sock */ sh_node_material_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_material,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_material,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_material
-};
+void register_node_type_sh_material(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_material_in, sh_node_material_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_init(&ntype, node_shader_init_material);
+ node_type_exec(&ntype, node_shader_exec_material);
+ node_type_gpu(&ntype, gpu_shader_material);
+
+ nodeRegisterType(lb, &ntype);
+}
+
+
+void register_node_type_sh_material_ext(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_material_ext_in, sh_node_material_ext_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_init(&ntype, node_shader_init_material);
+ node_type_exec(&ntype, node_shader_exec_material);
+ node_type_gpu(&ntype, gpu_shader_material);
+
+ nodeRegisterType(lb, &ntype);
+}
-bNodeType sh_node_material_ext= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATERIAL_EXT,
- /* name */ "Extended Material",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_material_ext_in,
- /* output sock */ sh_node_material_ext_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_material,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_material,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_material
-};
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
index 7429c084ab3..7d31ab05c85 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,7 +30,6 @@
#include "../SHD_util.h"
-
/* **************** SCALAR MATH ******************** */
static bNodeSocketType sh_node_math_in[]= {
{ SOCK_VALUE, 1, "Value", 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f},
@@ -43,7 +42,7 @@ static bNodeSocketType sh_node_math_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_math(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_math(void *UNUSED(data), bNode *node, bNodeStack **in,
bNodeStack **out)
{
switch(node->custom1){
@@ -196,7 +195,7 @@ bNodeStack **out)
static int gpu_shader_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"math_add", "math_subtract", "math_multiply",
+ static const char *names[] = {"math_add", "math_subtract", "math_multiply",
"math_divide", "math_sine", "math_cosine", "math_tangent", "math_asin",
"math_acos", "math_atan", "math_pow", "math_log", "math_min", "math_max",
"math_round", "math_less_than", "math_greater_than"};
@@ -234,21 +233,19 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUN
return 1;
}
-bNodeType sh_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_math_in,
- /* output sock */ sh_node_math_out,
- /* storage */ "node_math",
- /* execfunc */ node_shader_exec_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_math
-};
+void register_node_type_sh_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_math_in, sh_node_math_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_storage(&ntype, "node_math", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_math);
+ node_type_gpu(&ntype, gpu_shader_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
index bc4342e11e3..1520618ced2 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,7 +29,6 @@
#include "../SHD_util.h"
-
/* **************** MIX RGB ******************** */
static bNodeSocketType sh_node_mix_rgb_in[]= {
{ SOCK_VALUE, 1, "Fac", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
@@ -42,7 +41,7 @@ static bNodeSocketType sh_node_mix_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_mix_rgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac, col1, col2 */
/* stack order out: col */
@@ -62,7 +61,7 @@ static void node_shader_exec_mix_rgb(void *data, bNode *node, bNodeStack **in, b
static int gpu_shader_mix_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
+ static const char *names[] = {"mix_blend", "mix_add", "mix_mult", "mix_sub",
"mix_screen", "mix_div", "mix_diff", "mix_dark", "mix_light",
"mix_overlay", "mix_dodge", "mix_burn", "mix_hue", "mix_sat",
"mix_val", "mix_color", "mix_soft", "mix_linear"};
@@ -71,21 +70,17 @@ static int gpu_shader_mix_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
}
-bNodeType sh_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ sh_node_mix_rgb_in,
- /* output sock */ sh_node_mix_rgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_mix_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_mix_rgb
-
-};
+void register_node_type_sh_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ sh_node_mix_rgb_in, sh_node_mix_rgb_out);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, node_shader_exec_mix_rgb);
+ node_type_gpu(&ntype, gpu_shader_mix_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
index eb3786286ae..66045902b69 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_normal_out[]= {
};
/* generates normal, does dot product */
-static void node_shader_exec_normal(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_normal(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
float vec[3];
@@ -65,21 +65,14 @@ static int gpu_shader_normal(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GP
return GPU_stack_link(mat, "normal", in, out, vec);
}
-bNodeType sh_node_normal= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_NORMAL,
- /* name */ "Normal",
- /* width+range */ 100, 60, 200,
- /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
- /* input sock */ sh_node_normal_in,
- /* output sock */ sh_node_normal_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_normal,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_normal
-};
-
+void register_node_type_sh_normal(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ sh_node_normal_in, sh_node_normal_out);
+ node_type_exec(&ntype, node_shader_exec_normal);
+ node_type_gpu(&ntype, gpu_shader_normal);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
index 5c450fa840b..12a6953363f 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -36,7 +36,7 @@ static bNodeSocketType sh_node_output_in[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
if(data && in[0] && in[1]) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
@@ -62,7 +62,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
}
}
-static int gpu_shader_output(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_output(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
GPUNodeLink *outlink;
@@ -75,22 +75,17 @@ static int gpu_shader_output(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GP
return 1;
}
-bNodeType sh_node_output= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_OUTPUT,
- /* name */ "Output",
- /* width+range */ 80, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ sh_node_output_in,
- /* output sock */ NULL,
- /* storage */ "",
- /* execfunc */ node_shader_exec_output,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_output
-
-};
+void register_node_type_sh_output(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ sh_node_output_in, NULL);
+ node_type_size(&ntype, 80, 60, 200);
+ node_type_exec(&ntype, node_shader_exec_output);
+ node_type_gpu(&ntype, gpu_shader_output);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
index 71af58beb67..821254ad832 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,7 +35,7 @@ static bNodeSocketType sh_node_rgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_rgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_rgb(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
@@ -50,21 +50,16 @@ static int gpu_shader_rgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNo
return GPU_stack_link(mat, "set_rgba", in, out, vec);
}
-bNodeType sh_node_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_RGB,
- /* name */ "RGB",
- /* width+range */ 140, 80, 140,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_rgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_rgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_rgb
-
-};
+void register_node_type_sh_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_rgb_out);
+ node_type_size(&ntype, 140, 80, 140);
+ node_type_exec(&ntype, node_shader_exec_rgb);
+ node_type_gpu(&ntype, gpu_shader_rgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
index 883cd4d3bf4..5939a86df03 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
@@ -1,4 +1,4 @@
-/**
+/*
*
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,36 +41,31 @@ static bNodeSocketType sh_node_seprgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_seprgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_seprgb(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
out[0]->vec[0] = in[0]->vec[0];
out[1]->vec[0] = in[0]->vec[1];
out[2]->vec[0] = in[0]->vec[2];
}
-static int gpu_shader_seprgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_seprgb(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "separate_rgb", in, out);
}
-bNodeType sh_node_seprgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_SEPRGB,
- /* name */ "Separate RGB",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ sh_node_seprgb_in,
- /* output sock */ sh_node_seprgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_seprgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_seprgb
-
-};
+void register_node_type_sh_seprgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0,
+ sh_node_seprgb_in, sh_node_seprgb_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_shader_exec_seprgb);
+ node_type_gpu(&ntype, gpu_shader_seprgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** COMBINE RGB ******************** */
@@ -85,33 +80,28 @@ static bNodeSocketType sh_node_combrgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_combrgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_combrgb(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
out[0]->vec[0] = in[0]->vec[0];
out[0]->vec[1] = in[1]->vec[0];
out[0]->vec[2] = in[2]->vec[0];
}
-static int gpu_shader_combrgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_combrgb(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "combine_rgb", in, out);
}
-bNodeType sh_node_combrgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_COMBRGB,
- /* name */ "Combine RGB",
- /* width+range */ 80, 40, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_combrgb_in,
- /* output sock */ sh_node_combrgb_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_combrgb,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_combrgb
-
-};
+void register_node_type_sh_combrgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_combrgb_in, sh_node_combrgb_out);
+ node_type_size(&ntype, 80, 40, 140);
+ node_type_exec(&ntype, node_shader_exec_combrgb);
+ node_type_gpu(&ntype, gpu_shader_combrgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
index 926dcd0f046..b3edc3de716 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -42,7 +42,7 @@ static bNodeSocketType sh_node_squeeze_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_squeeze(void *data, bNode *node, bNodeStack **in,
+static void node_shader_exec_squeeze(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in,
bNodeStack **out)
{
float vec[3];
@@ -54,26 +54,23 @@ bNodeStack **out)
out[0]->vec[0] = 1.0f / (1.0f + pow(2.71828183,-((vec[0]-vec[2])*vec[1]))) ;
}
-static int gpu_shader_squeeze(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_squeeze(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "squeeze", in, out);
}
-bNodeType sh_node_squeeze= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_SQUEEZE,
- /* name */ "Squeeze Value",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_squeeze_in,
- /* output sock */ sh_node_squeeze_out,
- /* storage */ "node_squeeze",
- /* execfunc */ node_shader_exec_squeeze,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_squeeze
-};
+void register_node_type_sh_squeeze(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_squeeze_in, sh_node_squeeze_out);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_squeeze", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_squeeze);
+ node_type_gpu(&ntype, gpu_shader_squeeze);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
index b2fb3b2261c..56c8cd062a3 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -58,6 +58,7 @@ static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, b
/* we should find out if a normal as output is needed, for now we do all */
texres.nor= nor;
+ texres.tr= texres.tg= texres.tb= 0.0f;
if(in[0]->hasinput) {
nodestack_get_vec(vec, SOCK_VECTOR, in[0]);
@@ -127,22 +128,17 @@ static int gpu_shader_texture(GPUMaterial *mat, bNode *node, GPUNodeStack *in, G
return 0;
}
-bNodeType sh_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ sh_node_texture_in,
- /* output sock */ sh_node_texture_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_texture,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_texture
-
-};
+void register_node_type_sh_texture(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
+ sh_node_texture_in, sh_node_texture_out);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, node_shader_exec_texture);
+ node_type_gpu(&ntype, gpu_shader_texture);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
index e2260461152..723aeaa82f3 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,7 +40,7 @@ static bNodeSocketType sh_node_valtorgb_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_valtorgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_valtorgb(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
/* stack order in: fac */
/* stack order out: col, alpha */
@@ -68,24 +68,21 @@ static int gpu_shader_valtorgb(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return GPU_stack_link(mat, "valtorgb", in, out, GPU_texture(size, array));
}
-bNodeType sh_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_valtorgb_in,
- /* output sock */ sh_node_valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ node_shader_exec_valtorgb,
- /* butfunc */ NULL,
- /* initfunc */ node_shader_init_valtorgb,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_valtorgb
-
-};
+void register_node_type_sh_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_valtorgb_in, sh_node_valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, node_shader_init_valtorgb);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, node_shader_exec_valtorgb);
+ node_type_gpu(&ntype, gpu_shader_valtorgb);
+
+ nodeRegisterType(lb, &ntype);
+}
+
/* **************** RGBTOBW ******************** */
static bNodeSocketType sh_node_rgbtobw_in[]= {
@@ -98,7 +95,7 @@ static bNodeSocketType sh_node_rgbtobw_out[]= {
};
-static void node_shader_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_rgbtobw(void *UNUSED(data), bNode *UNUSED(node), bNodeStack **in, bNodeStack **out)
{
/* stack order out: bw */
/* stack order in: col */
@@ -106,27 +103,22 @@ static void node_shader_exec_rgbtobw(void *data, bNode *node, bNodeStack **in, b
out[0]->vec[0]= in[0]->vec[0]*0.35f + in[0]->vec[1]*0.45f + in[0]->vec[2]*0.2f;
}
-static int gpu_shader_rgbtobw(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
+static int gpu_shader_rgbtobw(GPUMaterial *mat, bNode *UNUSED(node), GPUNodeStack *in, GPUNodeStack *out)
{
return GPU_stack_link(mat, "rgbtobw", in, out);
}
-bNodeType sh_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ sh_node_rgbtobw_in,
- /* output sock */ sh_node_rgbtobw_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_rgbtobw,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_rgbtobw
+void register_node_type_sh_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ sh_node_rgbtobw_in, sh_node_rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, node_shader_exec_rgbtobw);
+ node_type_gpu(&ntype, gpu_shader_rgbtobw);
+
+ nodeRegisterType(lb, &ntype);
+}
-};
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
index 1663ea352aa..22603b880fa 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -35,7 +35,7 @@ static bNodeSocketType sh_node_value_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_value(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_value(void *UNUSED(data), bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
bNodeSocket *sock= node->outputs.first;
@@ -50,22 +50,17 @@ static int gpu_shader_value(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPU
return GPU_stack_link(mat, "set_value", in, out, vec);
}
-bNodeType sh_node_value= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VALUE,
- /* name */ "Value",
- /* width+range */ 80, 50, 120,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ sh_node_value_out,
- /* storage */ "",
- /* execfunc */ node_shader_exec_value,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_value
-
-};
+void register_node_type_sh_value(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, sh_node_value_out);
+ node_type_size(&ntype, 80, 50, 120);
+ node_type_exec(&ntype, node_shader_exec_value);
+ node_type_gpu(&ntype, gpu_shader_value);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
index 062c6402fb6..c39fff262e4 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -44,7 +44,7 @@ static bNodeSocketType sh_node_vect_math_out[]= {
{ -1, 0, "" }
};
-static void node_shader_exec_vect_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void node_shader_exec_vect_math(void *UNUSED(data), bNode *node, bNodeStack **in, bNodeStack **out)
{
float vec1[3], vec2[3];
@@ -101,7 +101,7 @@ static void node_shader_exec_vect_math(void *data, bNode *node, bNodeStack **in,
static int gpu_shader_vect_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *out)
{
- static char *names[] = {"vec_math_add", "vec_math_sub",
+ static const char *names[] = {"vec_math_add", "vec_math_sub",
"vec_math_average", "vec_math_dot", "vec_math_cross",
"vec_math_normalize"};
@@ -127,21 +127,19 @@ static int gpu_shader_vect_math(GPUMaterial *mat, bNode *node, GPUNodeStack *in,
return 1;
}
-bNodeType sh_node_vect_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ SH_NODE_VECT_MATH,
- /* name */ "Vector Math",
- /* width+range */ 80, 75, 140,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ sh_node_vect_math_in,
- /* output sock */ sh_node_vect_math_out,
- /* storage */ "node_vect_math",
- /* execfunc */ node_shader_exec_vect_math,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL, NULL, NULL,
- /* gpufunc */ gpu_shader_vect_math
-};
+void register_node_type_sh_vect_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ sh_node_vect_math_in, sh_node_vect_math_out);
+ node_type_size(&ntype, 80, 75, 140);
+ node_type_label(&ntype, node_vect_math_label);
+ node_type_storage(&ntype, "node_vect_math", NULL, NULL);
+ node_type_exec(&ntype, node_shader_exec_vect_math);
+ node_type_gpu(&ntype, gpu_shader_vect_math);
+
+ nodeRegisterType(lb, &ntype);
+}
+
diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c
index 8f48c5668fe..33061d61354 100644
--- a/source/blender/nodes/intern/SHD_util.c
+++ b/source/blender/nodes/intern/SHD_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/intern/SHD_util.h
index ea3a100ca05..70b6cae3232 100644
--- a/source/blender/nodes/intern/SHD_util.h
+++ b/source/blender/nodes/intern/SHD_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -51,8 +51,9 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "../SHD_node.h"
@@ -62,6 +63,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
diff --git a/source/blender/nodes/intern/TEX_nodes/Makefile b/source/blender/nodes/intern/TEX_nodes/Makefile
deleted file mode 100644
index 74eabe7932a..00000000000
--- a/source/blender/nodes/intern/TEX_nodes/Makefile
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# 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.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = nodes_tex
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../include
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../render/extern/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
index 08c1c65792d..f4221d63d04 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -38,7 +38,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
TexParams np = *p;
float new_co[3];
@@ -53,20 +53,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_at = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_AT,
- /* name */ "At",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_DISTORT, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_at(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_AT, "At", NODE_CLASS_DISTORT, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
index 9d26621e08c..5ad20c0755e 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -112,20 +112,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_bricks= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_BRICKS,
- /* name */ "Bricks",
- /* width+range */ 150, 60, 150,
- /* class+opts */ NODE_CLASS_PATTERN, NODE_OPTIONS | NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_bricks(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_BRICKS, "Bricks", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 150, 60, 150);
+ node_type_init(&ntype, init);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
index 4155cec4d7f..7f5648f3d88 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float x = p->co[0];
float y = p->co[1];
@@ -64,20 +64,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_checker= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CHECKER,
- /* name */ "Checker",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_PATTERN, NODE_OPTIONS | NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_checker(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_CHECKER, "Checker", NODE_CLASS_PATTERN, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
index 7319a50b7d9..d2f82992122 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
int i;
for(i = 0; i < 4; i++)
@@ -52,20 +52,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_compose= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_COMPOSE,
- /* name */ "Compose RGBA",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_compose(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_COMPOSE, "Compose RGBA", NODE_CLASS_OP_COLOR, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
index 68e892ce77c..6f208b48eee 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -33,7 +33,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void vectorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void vectorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **UNUSED(in), short UNUSED(thread))
{
out[0] = p->co[0];
out[1] = p->co[1];
@@ -45,20 +45,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &vectorfn, data);
}
-bNodeType tex_node_coord= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_COORD,
- /* name */ "Coordinates",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ outputs,
- /* storage */ "node_coord",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_coord(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_COORD, "Coordinates", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_coord", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
index 49a1ef35fbb..f470924e810 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -36,7 +36,7 @@ static bNodeSocketType time_outputs[]= {
{ -1, 0, "" }
};
-static void time_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void time_colorfn(float *out, TexParams *p, bNode *node, bNodeStack **UNUSED(in), short UNUSED(thread))
{
/* stack order output: fac */
float fac= 0.0f;
@@ -61,22 +61,19 @@ static void time_init(bNode* node)
node->storage= curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType tex_node_curve_time= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CURVE_TIME,
- /* name */ "Time",
- /* width+range */ 140, 100, 320,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ time_outputs,
- /* storage */ "CurveMapping",
- /* execfunc */ time_exec,
- /* butfunc */ NULL,
- /* initfunc */ time_init,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_tex_curve_time(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_CURVE_TIME, "Time", NODE_CLASS_INPUT, NODE_OPTIONS,
+ NULL, time_outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_init(&ntype, time_init);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, time_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
/* **************** CURVE RGB ******************** */
static bNodeSocketType rgb_inputs[]= {
@@ -108,20 +105,17 @@ static void rgb_init(bNode *node)
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
}
-bNodeType tex_node_curve_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_CURVE_RGB,
- /* name */ "RGB Curves",
- /* width+range */ 200, 140, 320,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ rgb_inputs,
- /* output sock */ rgb_outputs,
- /* storage */ "CurveMapping",
- /* execfunc */ rgb_exec,
- /* butfunc */ NULL,
- /* initfunc */ rgb_init,
- /* freestoragefunc */ node_free_curves,
- /* copystoragefunc */ node_copy_curves,
- /* id */ NULL
-};
+void register_node_type_tex_curve_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ rgb_inputs, rgb_outputs);
+ node_type_size(&ntype, 200, 140, 320);
+ node_type_init(&ntype, rgb_init);
+ node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+ node_type_exec(&ntype, rgb_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
index f031091e08d..635b59a2b44 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -41,25 +41,25 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn_r(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_r(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[0];
}
-static void valuefn_g(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_g(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[1];
}
-static void valuefn_b(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_b(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[2];
}
-static void valuefn_a(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn_a(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
tex_input_rgba(out, in[0], p, thread);
*out = out[3];
@@ -73,20 +73,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[3], &valuefn_a, data);
}
-bNodeType tex_node_decompose= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_DECOMPOSE,
- /* name */ "Decompose RGBA",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, 0,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_decompose(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_DECOMPOSE, "Decompose RGBA", NODE_CLASS_OP_COLOR, 0,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
index e0fee3e3153..70e2da14808 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -41,7 +41,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void valuefn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float co1[3], co2[3];
@@ -56,21 +56,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &valuefn, data);
}
-bNodeType tex_node_distance= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_DISTANCE,
- /* name */ "Distance",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "node_distance",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
-
+void register_node_type_tex_distance(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_DISTANCE, "Distance", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_storage(&ntype, "node_distance", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
index 367ea7b9e5f..13d7e239ca2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -42,7 +42,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void do_hue_sat_fac(bNode *node, float *out, float hue, float sat, float val, float *in, float fac)
+static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float hue, float sat, float val, float *in, float fac)
{
if(fac != 0 && (hue != 0.5f || sat != 1 || val != 1)) {
float col[3], hsv[3], mfac= 1.0f - fac;
@@ -87,22 +87,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_hue_sat= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_HUE_SAT,
- /* name */ "Hue Saturation Value",
- /* width+range */ 150, 80, 250,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_hue_sat(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
-
+ node_type_base(&ntype, TEX_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 150, 80, 250);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
index 628d9026db1..f629db0628e 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,7 +34,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **UNUSED(in), short UNUSED(thread))
{
float x = p->co[0];
float y = p->co[1];
@@ -58,7 +58,13 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
py = (int)( (y-yoff) * ysize );
if( (!xsize) || (!ysize) ) return;
- if( !ibuf->rect_float ) IMB_float_from_rect(ibuf);
+
+ if( !ibuf->rect_float ) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if( !ibuf->rect_float )
+ IMB_float_from_rect(ibuf);
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
while( px < 0 ) px += ibuf->x;
while( py < 0 ) py += ibuf->y;
@@ -85,20 +91,16 @@ static void init(bNode* node)
iuser->ok= 1;
}
-bNodeType tex_node_image= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_IMAGE,
- /* name */ "Image",
- /* width+range */ 120, 80, 300,
- /* class+opts */ NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
- /* input sock */ NULL,
- /* output sock */ outputs,
- /* storage */ "ImageUser",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
-};
-
+void register_node_type_tex_image(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ NULL, outputs);
+ node_type_size(&ntype, 120, 80, 300);
+ node_type_init(&ntype, init);
+ node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
index 1619ed73023..b6dcaecad6c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -39,7 +39,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float col[4];
@@ -58,20 +58,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_invert= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_INVERT,
- /* name */ "Invert",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_tex_invert(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
index a17c295eb7f..1e48e4d521d 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -106,11 +106,17 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
break;
case 10: /* Power */
{
- /* Don't want any imaginary numbers... */
- if( in0 >= 0 )
- *out= pow(in0, in1);
- else
- *out= 0.0;
+ /* Only raise negative numbers by full integers */
+ if( in0 >= 0 ) {
+ out[0]= pow(in0, in1);
+ } else {
+ float y_mod_1 = fmod(in1, 1);
+ if (y_mod_1 > 0.999 || y_mod_1 < 0.001) {
+ *out = pow(in0, floor(in1 + 0.5));
+ } else {
+ *out = 0.0;
+ }
+ }
}
break;
case 11: /* Logarithm */
@@ -174,20 +180,17 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &valuefn, data);
}
-bNodeType tex_node_math= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_MATH,
- /* name */ "Math",
- /* width+range */ 120, 110, 160,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "node_math",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
+void register_node_type_tex_math(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 110, 160);
+ node_type_label(&ntype, node_math_label);
+ node_type_storage(&ntype, "node_math", NULL, NULL);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
index c709d58b8ba..9e651b0f0bb 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -28,7 +28,6 @@
#include "../TEX_util.h"
-
/* **************** MIX RGB ******************** */
static bNodeSocketType inputs[]= {
{ SOCK_VALUE, 1, "Factor", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
@@ -60,20 +59,15 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_mix_rgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_MIX_RGB,
- /* name */ "Mix",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_mix_rgb(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_label(&ntype, node_blend_label);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
index 09bc893cc1f..c52291a211c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -36,7 +36,7 @@ static bNodeSocketType inputs[]= {
};
/* applies to render pipeline */
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
TexCallData *cdata = (TexCallData *)data;
TexResult *target = cdata->target;
@@ -45,7 +45,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
TexParams params;
params_from_cdata(&params, cdata);
- if(in[1]->hasinput && !in[0]->hasinput)
+ if(in[1] && in[1]->hasinput && !in[0]->hasinput)
tex_input_rgba(&target->tr, in[1], &params, cdata->thread);
else
tex_input_rgba(&target->tr, in[0], &params, cdata->thread);
@@ -63,7 +63,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
target->talpha = 1.0f;
if(target->nor) {
- if(in[1]->hasinput)
+ if(in[1] && in[1]->hasinput)
tex_input_vec(target->nor, in[1], &params, cdata->thread);
else
target->nor = 0;
@@ -152,20 +152,16 @@ static void copy(bNode *orig, bNode *new)
assign_index(new);
}
-bNodeType tex_node_output= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_OUTPUT,
- /* name */ "Output",
- /* width+range */ 150, 60, 200,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW | NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ NULL,
- /* storage */ "TexNodeOutput",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ copy,
- /* id */ NULL
-};
-
+void register_node_type_tex_output(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, NULL);
+ node_type_size(&ntype, 150, 60, 200);
+ node_type_init(&ntype, init);
+ node_type_storage(&ntype, "TexNodeOutput", node_free_standard_storage, copy);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
index 3e7ef0e94fe..084ce045203 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -111,7 +111,7 @@ static int count_outputs(bNode *node)
/* Boilerplate generators */
#define ProcNoInputs(name) \
- static void name##_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread) \
+ static void name##_map_inputs(Tex *UNUSED(tex), bNodeStack **UNUSED(in), TexParams *UNUSED(p), short UNUSED(thread)) \
{}
#define ProcDef(name) \
@@ -290,21 +290,29 @@ static void init(bNode *node)
/* Node type definitions */
#define TexDef(TEXTYPE, outputs, name, Name) \
- { NULL, NULL, TEX_NODE_PROC+TEXTYPE, Name, 140,80,140, NODE_CLASS_TEXTURE, \
- NODE_OPTIONS | NODE_PREVIEW, name##_inputs, outputs, "Tex", name##_exec, NULL, init, \
- node_free_standard_storage, node_copy_standard_storage, NULL }
+void register_node_type_tex_proc_##name(ListBase *lb) \
+{ \
+ static bNodeType ntype; \
+ \
+ node_type_base(&ntype, TEX_NODE_PROC+TEXTYPE, Name, NODE_CLASS_TEXTURE, NODE_PREVIEW|NODE_OPTIONS, name##_inputs, outputs); \
+ node_type_size(&ntype, 140, 80, 140); \
+ node_type_init(&ntype, init); \
+ node_type_storage(&ntype, "Tex", node_free_standard_storage, node_copy_standard_storage); \
+ node_type_exec(&ntype, name##_exec); \
+ \
+ nodeRegisterType(lb, &ntype); \
+}
#define C outputs_color_only
#define CV outputs_both
-bNodeType tex_node_proc_voronoi = TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" );
-bNodeType tex_node_proc_blend = TexDef(TEX_BLEND, C, blend, "Blend" );
-bNodeType tex_node_proc_magic = TexDef(TEX_MAGIC, C, magic, "Magic" );
-bNodeType tex_node_proc_marble = TexDef(TEX_MARBLE, CV, marble, "Marble" );
-bNodeType tex_node_proc_clouds = TexDef(TEX_CLOUDS, CV, clouds, "Clouds" );
-bNodeType tex_node_proc_wood = TexDef(TEX_WOOD, CV, wood, "Wood" );
-bNodeType tex_node_proc_musgrave = TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" );
-bNodeType tex_node_proc_noise = TexDef(TEX_NOISE, C, noise, "Noise" );
-bNodeType tex_node_proc_stucci = TexDef(TEX_STUCCI, CV, stucci, "Stucci" );
-bNodeType tex_node_proc_distnoise = TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" );
-
+TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" );
+TexDef(TEX_BLEND, C, blend, "Blend" );
+TexDef(TEX_MAGIC, C, magic, "Magic" );
+TexDef(TEX_MARBLE, CV, marble, "Marble" );
+TexDef(TEX_CLOUDS, CV, clouds, "Clouds" );
+TexDef(TEX_WOOD, CV, wood, "Wood" );
+TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" );
+TexDef(TEX_NOISE, C, noise, "Noise" );
+TexDef(TEX_STUCCI, CV, stucci, "Stucci" );
+TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" );
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
index 9a855938eef..89d8c10156c 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -64,7 +64,7 @@ static void rotate(float new_co[3], float a, float ax[3], float co[3])
new_co[2] = para[2] + perp[2] + cp[2];
}
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float new_co[3], new_dxt[3], new_dyt[3], a, ax[3];
@@ -90,20 +90,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_rotate= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_ROTATE,
- /* name */ "Rotate",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_rotate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_ROTATE, "Rotate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 140, 100, 320);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
index 721c322c540..51a17385bd0 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float scale[3], new_co[3], new_dxt[3], new_dyt[3];
TexParams np = *p;
@@ -64,20 +64,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_scale = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_SCALE,
- /* name */ "Scale",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_scale(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_SCALE, "Scale", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
index c01caa022e5..c0fcddc85b8 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -83,21 +83,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_texture= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_TEXTURE,
- /* name */ "Texture",
- /* width+range */ 120, 80, 240,
- /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_texture(ListBase *lb)
+{
+ static bNodeType ntype;
-};
-
+ node_type_base(&ntype, TEX_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 120, 80, 240);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
index a823338faf9..1cd0b17e330 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -40,7 +40,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float offset[3], new_co[3];
TexParams np = *p;
@@ -59,20 +59,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &colorfn, data);
}
-bNodeType tex_node_translate = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_TRANSLATE,
- /* name */ "Translate",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_translate(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_TRANSLATE, "Translate", NODE_CLASS_DISTORT, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
index 46aefe5ad47..4a41b8ab8a2 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -39,7 +39,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void normalfn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void normalfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float new_co[3];
float *co = p->co;
@@ -75,20 +75,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
tex_output(node, in, out[0], &normalfn, data);
}
-bNodeType tex_node_valtonor = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VALTONOR,
- /* name */ "Value to Normal",
- /* width+range */ 90, 80, 100,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-};
-
+void register_node_type_tex_valtonor(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_VALTONOR, "Value to Normal", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ inputs, outputs);
+ node_type_size(&ntype, 90, 80, 100);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
index 3810167a58a..f55229c08bc 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -58,23 +58,19 @@ static void valtorgb_init(bNode *node)
node->storage = add_colorband(1);
}
-bNodeType tex_node_valtorgb= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VALTORGB,
- /* name */ "ColorRamp",
- /* width+range */ 240, 200, 300,
- /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
- /* input sock */ valtorgb_in,
- /* output sock */ valtorgb_out,
- /* storage */ "ColorBand",
- /* execfunc */ valtorgb_exec,
- /* butfunc */ NULL,
- /* initfunc */ valtorgb_init,
- /* freestoragefunc */ node_free_standard_storage,
- /* copystoragefunc */ node_copy_standard_storage,
- /* id */ NULL
+void register_node_type_tex_valtorgb(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ valtorgb_in, valtorgb_out);
+ node_type_size(&ntype, 240, 200, 300);
+ node_type_init(&ntype, valtorgb_init);
+ node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+ node_type_exec(&ntype, valtorgb_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
/* **************** RGBTOBW ******************** */
static bNodeSocketType rgbtobw_in[]= {
@@ -87,7 +83,7 @@ static bNodeSocketType rgbtobw_out[]= {
};
-static void rgbtobw_valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread)
+static void rgbtobw_valuefn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **in, short thread)
{
float cin[4];
tex_input_rgba(cin, in[0], p, thread);
@@ -100,21 +96,15 @@ static void rgbtobw_exec(void *data, bNode *node, bNodeStack **in, bNodeStack **
tex_output(node, in, out[0], &rgbtobw_valuefn, data);
}
-bNodeType tex_node_rgbtobw= {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_RGBTOBW,
- /* name */ "RGB to BW",
- /* width+range */ 80, 40, 120,
- /* class+opts */ NODE_CLASS_CONVERTOR, 0,
- /* input sock */ rgbtobw_in,
- /* output sock */ rgbtobw_out,
- /* storage */ "",
- /* execfunc */ rgbtobw_exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
-
-};
+void register_node_type_tex_rgbtobw(ListBase *lb)
+{
+ static bNodeType ntype;
+
+ node_type_base(&ntype, TEX_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0,
+ rgbtobw_in, rgbtobw_out);
+ node_type_size(&ntype, 80, 40, 120);
+ node_type_exec(&ntype, rgbtobw_exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
index 698c894a8d8..ffbb3e08bbd 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -37,7 +37,7 @@ static bNodeSocketType outputs[]= {
{ -1, 0, "" }
};
-static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(out))
{
TexCallData *cdata = (TexCallData *)data;
@@ -51,20 +51,14 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
}
}
-bNodeType tex_node_viewer = {
- /* *next,*prev */ NULL, NULL,
- /* type code */ TEX_NODE_VIEWER,
- /* name */ "Viewer",
- /* width+range */ 100, 60, 150,
- /* class+opts */ NODE_CLASS_OUTPUT, NODE_PREVIEW,
- /* input sock */ inputs,
- /* output sock */ outputs,
- /* storage */ "",
- /* execfunc */ exec,
- /* butfunc */ NULL,
- /* initfunc */ NULL,
- /* freestoragefunc */ NULL,
- /* copystoragefunc */ NULL,
- /* id */ NULL
+void register_node_type_tex_viewer(ListBase *lb)
+{
+ static bNodeType ntype;
-};
+ node_type_base(&ntype, TEX_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, NODE_PREVIEW,
+ inputs, outputs);
+ node_type_size(&ntype, 100, 60, 150);
+ node_type_exec(&ntype, exec);
+
+ nodeRegisterType(lb, &ntype);
+}
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c
index dc31685827f..bb97e2f82fa 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/intern/TEX_util.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -29,11 +29,11 @@
/*
HOW TEXTURE NODES WORK
- In contrast to Shader nodes, which place a colour into the output
+ In contrast to Shader nodes, which place a color into the output
stack when executed, Texture nodes place a TexDelegate* there. To
- obtain a colour value from this, a node further up the chain reads
+ obtain a color value from this, a node further up the chain reads
the TexDelegate* from its input stack, and uses tex_call_delegate to
- retrieve the colour from the delegate.
+ retrieve the color from the delegate.
comments: (ton)
@@ -57,7 +57,7 @@ void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thr
}
}
-void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
+static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
{
TexDelegate *dg = in->data;
if(dg) {
@@ -173,7 +173,7 @@ int ntreeTexExecTree(
float *dxt, float *dyt,
int osatex,
short thread,
- Tex *tex,
+ Tex *UNUSED(tex),
short which_output,
int cfra,
int preview,
@@ -181,6 +181,7 @@ int ntreeTexExecTree(
MTex *mtex
){
TexCallData data;
+ float *nor= texres->nor;
int retval = TEX_INT;
data.co = co;
@@ -199,6 +200,9 @@ int ntreeTexExecTree(
if(texres->nor) retval |= TEX_NOR;
retval |= TEX_RGB;
+ /* confusing stuff; the texture output node sets this to NULL to indicate no normal socket was set
+ however, the texture code checks this for other reasons (namely, a normal is required for material) */
+ texres->nor= nor;
return retval;
}
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/intern/TEX_util.h
index a9465e17623..152b01979ba 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/intern/TEX_util.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -50,8 +50,9 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_node.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_library.h"
#include "../SHD_node.h"
@@ -61,6 +62,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index 746b8a37f5b..cf0be3fd53a 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,9 @@
#include "CMP_util.h"
#include "SHD_util.h"
+#include "RNA_access.h"
+#include "RNA_enum_types.h"
+
void node_free_curves(bNode *node)
{
curvemapping_free(node->storage);
@@ -50,3 +53,30 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node)
new_node->storage= MEM_dupallocN(orig_node->storage);
}
+const char *node_blend_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_blend_type_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_math_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_math_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_vect_math_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_vec_math_items, node->custom1, &name);
+ return name;
+}
+
+const char *node_filter_label(bNode *node)
+{
+ const char *name;
+ RNA_enum_name(node_filter_items, node->custom1, &name);
+ return name;
+}
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 0326459ac68..44a82d81d30 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -38,6 +38,11 @@ extern void node_free_standard_storage(struct bNode *node);
extern void node_copy_curves(struct bNode *orig_node, struct bNode *new_node);
extern void node_copy_standard_storage(struct bNode *orig_node, struct bNode *new_node);
+const char *node_blend_label(struct bNode *node);
+const char *node_math_label(struct bNode *node);
+const char *node_vect_math_label(struct bNode *node);
+const char *node_filter_label(struct bNode *node);
+
#endif
// this is needed for inlining behaviour
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 40d544ac17e..2abe6044ca3 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -27,11 +27,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BPY_extern.h
+ * \ingroup python
+ */
+
+
+
#ifndef BPY_EXTERN_H
#define BPY_EXTERN_H
extern char bprogname[]; /* holds a copy of argv[0], from creator.c */
-extern char btempdir[]; /* use this to store a valid temp directory */
struct Text; /* defined in DNA_text_types.h */
struct ID; /* DNA_ID.h */
@@ -39,14 +44,12 @@ struct Object; /* DNA_object_types.h */
struct ChannelDriver; /* DNA_anim_types.h */
struct ListBase; /* DNA_listBase.h */
struct SpaceText; /* DNA_space_types.h */
-struct SpaceScript; /* DNA_space_types.h */
struct ScrArea; /* DNA_screen_types.h */
struct bScreen; /* DNA_screen_types.h */
struct bConstraint; /* DNA_constraint_types.h */
struct bPythonConstraint; /* DNA_constraint_types.h */
struct bConstraintOb; /* DNA_constraint_types.h */
struct bConstraintTarget; /* DNA_constraint_types.h*/
-struct Script; /* DNA_screen_types.h */
struct BPyMenu;
struct bContext;
struct bContextDataResult;
@@ -56,34 +59,15 @@ struct ReportList;
extern "C" {
#endif
- /*These two next functions are important for making sure the Draw module
- works correctly. Before calling any gui callback using the Draw module,
- the following code must be executed:
-
- if (some_drawspace_pylist) {
- BPy_Set_DrawButtonsList(some_drawspace_pylist->but_refs);
- BPy_Free_DrawButtonsList();
- }
- some_drawspace_pylist = PyList_New(0);
- BPy_Set_DrawButtonsList(some_drawspace_pylist);
-
- Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace
- with python callbacks is destroyed.
-
- This is necassary to avoid blender buttons storing invalid pointers to freed
- python data.*/
-// void BPy_Set_DrawButtonsList(void *list);
-// void BPy_Free_DrawButtonsList(void);
-//
- void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+void BPY_pyconstraint_exec(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
// void BPY_pyconstraint_settings(void *arg1, void *arg2);
- void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
- void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
- int BPY_is_pyconstraint(struct Text *text);
+void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
+void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
+int BPY_is_pyconstraint(struct Text *text);
// void BPY_free_pyconstraint_links(struct Text *text);
//
- void BPY_start_python( int argc, char **argv );
- void BPY_end_python( void );
+void BPY_python_start(int argc, const char **argv);
+void BPY_python_end( void );
// void init_syspath( int first_time );
// void syspath_append( char *dir );
// void BPY_rebuild_syspath( void );
@@ -91,55 +75,23 @@ extern "C" {
//
// int BPY_Err_getLinenumber( void );
// const char *BPY_Err_getFilename( void );
-//
-// int BPY_txt_do_python_Text( struct Text *text );
-// int BPY_menu_do_python( short menutype, int event );
-// int BPY_menu_do_shortcut( short menutype, unsigned short key, unsigned short modifiers );
-// int BPY_menu_invoke( struct BPyMenu *pym, short menutype );
-
- /* 2.5 UI Scripts */
- int BPY_run_python_script( struct bContext *C, const char *filename, struct Text *text, struct ReportList *reports ); // 2.5 working
- int BPY_run_script_space_draw(const struct bContext *C, struct SpaceScript * sc); // 2.5 working
-// int BPY_run_script_space_listener(struct bContext *C, struct SpaceScript * sc, struct ARegion *ar, struct wmNotifier *wmn); // 2.5 working
- void BPY_update_modules( void ); // XXX - annoying, need this for pointers that get out of date
-//
- int BPY_context_get(struct bContext *C, const char *member, struct bContextDataResult *result);
-//
-// int BPY_run_script(struct Script *script);
- void BPY_free_compiled_text( struct Text *text );
-//
-// int BPY_has_onload_script( void );
-//
-// int BPY_is_spacehandler(struct Text *text, char spacetype);
-// int BPY_del_spacehandler(struct Text *text, struct ScrArea *sa);
-// int BPY_add_spacehandler(struct Text *txt, struct ScrArea *sa,char spacetype);
-// int BPY_has_spacehandler(struct Text *text, struct ScrArea *sa);
-// void BPY_screen_free_spacehandlers(struct bScreen *sc);
-// int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event,
-// short eventValue, unsigned short space_event);
-//
-// void BPY_pydriver_update(void);
- float BPY_eval_driver(struct ChannelDriver *driver);
-//
- int BPY_eval_button(struct bContext *C, const char *expr, double *value);
- int BPY_eval_string(struct bContext *C, const char *expr);
+/* 2.5 UI Scripts */
+int BPY_filepath_exec(struct bContext *C, const char *filepath, struct ReportList *reports);
+int BPY_text_exec(struct bContext *C, struct Text *text, struct ReportList *reports);
+void BPY_text_free_code(struct Text *text);
+void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
+void BPY_modules_load_user(struct bContext *C);
-/* format importer hook */
- int BPY_call_importloader( char *name );
-//
-// void BPY_spacescript_do_pywin_draw( struct SpaceScript *sc );
-// void BPY_spacescript_do_pywin_event( struct SpaceScript *sc,
-// unsigned short event, short val, char ascii );
-// void BPY_free_finished_script( struct Script *script );
-// void BPY_scripts_clear_pyobjects( void );
-//
-// void error_pyscript( void );
- void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
- void BPY_set_context(struct bContext *C);
-/* void BPY_Err_Handle(struct Text *text); */
-/* int BPY_spacetext_is_pywin(struct SpaceText *st); */
- void BPY_load_user_modules(struct bContext *C);
+void BPY_driver_reset(void);
+float BPY_driver_exec(struct ChannelDriver *driver);
+
+int BPY_button_exec(struct bContext *C, const char *expr, double *value);
+int BPY_string_exec(struct bContext *C, const char *expr);
+
+void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
+int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result);
+void BPY_context_set(struct bContext *C);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/blender/python/CMakeLists.txt b/source/blender/python/CMakeLists.txt
index dcfc8678faa..fe9e0307703 100644
--- a/source/blender/python/CMakeLists.txt
+++ b/source/blender/python/CMakeLists.txt
@@ -14,36 +14,7 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-# The Original Code is Copyright (C) 2006, Blender Foundation
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Jacques Beaurainm, Campbell Barton
-#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(generic)
-
-FILE(GLOB SRC intern/*.c)
-
-SET(INC
- .
- ../blenlib
- ../makesdna
- ../makesrna
- ../blenkernel
- ../windowmanager
- ../editors/include
- ../../../intern/guardedalloc
- ../../../intern/audaspace/intern
- ${PYTHON_INC}
-)
-
-# only to check if buildinfo is available
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DBUILD_DATE)
-ENDIF(WITH_BUILDINFO)
-
-BLENDERLIB(bf_python "${SRC}" "${INC}")
-
+add_subdirectory(intern)
+add_subdirectory(generic)
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index 097f69155d5..315fc5ca9a3 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -11,10 +11,10 @@ incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
defs = []
if env['BF_BUILDINFO']:
- defs.append('BUILD_DATE')
+ defs.append('BUILD_DATE')
if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']:
- defs.append('_DEBUG')
+ defs.append('_DEBUG')
env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160])
diff --git a/source/blender/python/doc/epy/BGL.py b/source/blender/python/doc/epy/BGL.py
deleted file mode 100644
index ce148dc72ba..00000000000
--- a/source/blender/python/doc/epy/BGL.py
+++ /dev/null
@@ -1,1807 +0,0 @@
-# Blender.BGL module (OpenGL wrapper)
-
-"""
-The Blender.BGL submodule (the OpenGL wrapper).
-
-B{New}: some GLU functions: L{gluLookAt}, etc.
-
-The Blender.BGL submodule
-=========================
-(when accessing it from the Game Engine use BGL instead of Blender.BGL)
-
-This module wraps OpenGL constants and functions, making them available from
-within Blender Python.
-
-The complete list can be retrieved from the module itself, by listing its
-contents: dir(Blender.BGL). A simple search on the net can point to more
-than enough material to teach OpenGL programming, from books to many
-collections of tutorials.
-
-The "red book": "I{OpenGL Programming Guide: The Official Guide to Learning
-OpenGL}" and the online NeHe tutorials are two of the best resources.
-
-Example::
- import Blender
- from Blender.BGL import *
- from Blender import Draw
- R = G = B = 0
- A = 1
- title = "Testing BGL + Draw"
- instructions = "Use mouse buttons or wheel to change the background color."
- quitting = " Press ESC or q to quit."
- len1 = Draw.GetStringWidth(title)
- len2 = Draw.GetStringWidth(instructions + quitting)
- #
- def show_win():
- glClearColor(R,G,B,A) # define color used to clear buffers
- glClear(GL_COLOR_BUFFER_BIT) # use it to clear the color buffer
- glColor3f(0.35,0.18,0.92) # define default color
- glBegin(GL_POLYGON) # begin a vertex data list
- glVertex2i(165, 158)
- glVertex2i(252, 55)
- glVertex2i(104, 128)
- glEnd()
- glColor3f(0.4,0.4,0.4) # change default color
- glRecti(40, 96, 60+len1, 113)
- glColor3f(1,1,1)
- glRasterPos2i(50,100) # move cursor to x = 50, y = 100
- Draw.Text(title) # draw this text there
- glRasterPos2i(350,40) # move cursor again
- Draw.Text(instructions + quitting) # draw another msg
- glBegin(GL_LINE_LOOP) # begin a vertex-data list
- glVertex2i(46,92)
- glVertex2i(120,92)
- glVertex2i(120,115)
- glVertex2i(46,115)
- glEnd() # close this list
- #
- def ev(evt, val): # event callback for Draw.Register()
- global R,G,B,A # ... it handles input events
- if evt == Draw.ESCKEY or evt == Draw.QKEY:
- Draw.Exit() # this quits the script
- elif not val: return
- elif evt == Draw.LEFTMOUSE: R = 1 - R
- elif evt == Draw.MIDDLEMOUSE: G = 1 - G
- elif evt == Draw.RIGHTMOUSE: B = 1 - B
- elif evt == Draw.WHEELUPMOUSE:
- R += 0.1
- if R > 1: R = 1
- elif evt == Draw.WHEELDOWNMOUSE:
- R -= 0.1
- if R < 0: R = 0
- else:
- return # don't redraw if nothing changed
- Draw.Redraw(1) # make changes visible.
- #
- Draw.Register(show_win, ev, None) # start the main loop
-
-@note: you can use the L{Image} module and L{Image.Image} BPy object to load
- and set textures. See L{Image.Image.glLoad} and L{Image.Image.glFree},
- for example.
-@see: U{www.opengl.org}
-@see: U{nehe.gamedev.net}
-"""
-
-def glAccum(op, value):
- """
- Operate on the accumulation buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/accum.html}
-
- @type op: Enumerated constant
- @param op: The accumulation buffer operation.
- @type value: float
- @param value: a value used in the accumulation buffer operation.
- """
-
-def glAlphaFunc(func, ref):
- """
- Specify the alpha test function
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/alphafunc.html}
-
- @type func: Enumerated constant
- @param func: Specifies the alpha comparison function.
- @type ref: float
- @param ref: The reference value that incoming alpha values are compared to.
- Clamped between 0 and 1.
- """
-
-def glAreTexturesResident(n, textures, residences):
- """
- Determine if textures are loaded in texture memory
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/aretexturesresident.html}
-
- @type n: int
- @param n: Specifies the number of textures to be queried.
- @type textures: Buffer object I{type GL_INT}
- @param textures: Specifies an array containing the names of the textures to be queried
- @type residences: Buffer object I{type GL_INT}(boolean)
- @param residences: An array in which the texture residence status in returned.The residence status of a
- texture named by an element of textures is returned in the corresponding element of residences.
- """
-
-def glBegin(mode):
- """
- Delimit the vertices of a primitive or a group of like primatives
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the primitive that will be create from vertices between glBegin and
- glEnd.
- """
-
-def glBindTexture(target, texture):
- """
- Bind a named texture to a texturing target
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/bindtexture.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target to which the texture is bound.
- @type texture: unsigned int
- @param texture: Specifies the name of a texture.
- """
-
-def glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap):
- """
- Draw a bitmap
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/bitmap.html}
-
- @type width, height: int
- @param width, height: Specify the pixel width and height of the bitmap image.
- @type xorig, yorig: float
- @param xorig, yorig: Specify the location of the origin in the bitmap image. The origin is measured
- from the lower left corner of the bitmap, with right and up being the positive axes.
- @type xmove, ymove: float
- @param xmove, ymove: Specify the x and y offsets to be added to the current raster position after
- the bitmap is drawn.
- @type bitmap: Buffer object I{type GL_BYTE}
- @param bitmap: Specifies the address of the bitmap image.
- """
-
-def glBlendFunc(sfactor, dfactor):
- """
- Specify pixel arithmetic
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/blendfunc.html}
-
- @type sfactor: Enumerated constant
- @param sfactor: Specifies how the red, green, blue, and alpha source blending factors are
- computed.
- @type dfactor: Enumerated constant
- @param dfactor: Specifies how the red, green, blue, and alpha destination blending factors are
- computed.
- """
-
-def glCallList(list):
- """
- Execute a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/calllist.html}
-
- @type list: unsigned int
- @param list: Specifies the integer name of the display list to be executed.
- """
-
-def glCallLists(n, type, lists):
- """
- Execute a list of display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/calllists.html}
-
- @type n: int
- @param n: Specifies the number of display lists to be executed.
- @type type: Enumerated constant
- @param type: Specifies the type of values in lists.
- @type lists: Buffer object
- @param lists: Specifies the address of an array of name offsets in the display list.
- The pointer type is void because the offsets can be bytes, shorts, ints, or floats,
- depending on the value of type.
- """
-
-def glClear(mask):
- """
- Clear buffers to preset values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clear.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Bitwise OR of masks that indicate the buffers to be cleared.
- """
-
-def glClearAccum(red, green, blue, alpha):
- """
- Specify clear values for the accumulation buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearaccum.html}
-
- @type red, green, blue, alpha: float
- @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
- accumulation buffer is cleared. The initial values are all 0.
- """
-
-def glClearColor(red, green, blue, alpha):
- """
- Specify clear values for the color buffers
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearcolor.html}
-
- @type red, green, blue, alpha: float
- @param red, green, blue, alpha: Specify the red, green, blue, and alpha values used when the
- color buffers are cleared. The initial values are all 0.
- """
-
-def glClearDepth(depth):
- """
- Specify the clear value for the depth buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/cleardepth.html}
-
- @type depth: int
- @param depth: Specifies the depth value used when the depth buffer is cleared.
- The initial value is 1.
- """
-
-def glClearIndex(c):
- """
- Specify the clear value for the color index buffers
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearindex.html}
-
- @type c: float
- @param c: Specifies the index used when the color index buffers are cleared.
- The initial value is 0.
- """
-
-def glClearStencil(s):
- """
- Specify the clear value for the stencil buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clearstencil.html}
-
- @type s: int
- @param s: Specifies the index used when the stencil buffer is cleared. The initial value is 0.
- """
-
-def glClipPlane (plane, equation):
- """
- Specify a plane against which all geometry is clipped
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/clipplane.html}
-
- @type plane: Enumerated constant
- @param plane: Specifies which clipping plane is being positioned.
- @type equation: Buffer object I{type GL_FLOAT}(double)
- @param equation: Specifies the address of an array of four double- precision floating-point
- values. These values are interpreted as a plane equation.
- """
-
-def glColor (red, green, blue, alpha):
- """
- B{glColor3b, glColor3d, glColor3f, glColor3i, glColor3s, glColor3ub, glColor3ui, glColor3us,
- glColor4b, glColor4d, glColor4f, glColor4i, glColor4s, glColor4ub, glColor4ui, glColor4us,
- glColor3bv, glColor3dv, glColor3fv, glColor3iv, glColor3sv, glColor3ubv, glColor3uiv,
- glColor3usv, glColor4bv, glColor4dv, glColor4fv, glColor4iv, glColor4sv, glColor4ubv,
- glColor4uiv, glColor4usv}
-
- Set a new color.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/color.html}
-
- @type red, green, blue, alpha: Depends on function prototype.
- @param red, green, blue: Specify new red, green, and blue values for the current color.
- @param alpha: Specifies a new alpha value for the current color. Included only in the
- four-argument glColor4 commands. (With '4' colors only)
- """
-
-def glColorMask(red, green, blue, alpha):
- """
- Enable and disable writing of frame buffer color components
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormask.html}
-
- @type red, green, blue, alpha: int (boolean)
- @param red, green, blue, alpha: Specify whether red, green, blue, and alpha can or cannot be
- written into the frame buffer. The initial values are all GL_TRUE, indicating that the
- color components can be written.
- """
-
-def glColorMaterial(face, mode):
- """
- Cause a material color to track the current color
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/colormaterial.html}
-
- @type face: Enumerated constant
- @param face: Specifies whether front, back, or both front and back material parameters should
- track the current color.
- @type mode: Enumerated constant
- @param mode: Specifies which of several material parameters track the current color.
- """
-
-def glCopyPixels(x, y, width, height, type):
- """
- Copy pixels in the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/copypixels.html}
-
- @type x, y: int
- @param x, y: Specify the window coordinates of the lower left corner of the rectangular
- region of pixels to be copied.
- @type width, height: int
- @param width,height: Specify the dimensions of the rectangular region of pixels to be copied.
- Both must be non-negative.
- @type type: Enumerated constant
- @param type: Specifies whether color values, depth values, or stencil values are to be copied.
- """
-
- def glCopyTexImage2D(target, level, internalformat, x, y, width, height, border):
- """
- Copy pixels into a 2D texture image
- @see: U{www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @type x, y: int
- @param x, y:Specify the window coordinates of the first pixel that is copied
- from the frame buffer. This location is the lower left corner of a rectangular
- block of pixels.
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide.
- @type height: int
- @param height: Specifies the height of the texture image. Must be 2m+2(border) for
- some integer m. All implementations support texture images that are at least 64
- texels high.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- """
-
-def glCullFace(mode):
- """
- Specify whether front- or back-facing facets can be culled
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/cullface.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies whether front- or back-facing facets are candidates for culling.
- """
-
-def glDeleteLists(list, range):
- """
- Delete a contiguous group of display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/deletelists.html}
-
- @type list: unsigned int
- @param list: Specifies the integer name of the first display list to delete
- @type range: int
- @param range: Specifies the number of display lists to delete
- """
-
-def glDeleteTextures(n, textures):
- """
- Delete named textures
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/deletetextures.html}
-
- @type n: int
- @param n: Specifies the number of textures to be deleted
- @type textures: Buffer I{GL_INT}
- @param textures: Specifies an array of textures to be deleted
- """
-
-def glDepthFunc(func):
- """
- Specify the value used for depth buffer comparisons
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthfunc.html}
-
- @type func: Enumerated constant
- @param func: Specifies the depth comparison function.
- """
-
-def glDepthMask(flag):
- """
- Enable or disable writing into the depth buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthmask.html}
-
- @type flag: int (boolean)
- @param flag: Specifies whether the depth buffer is enabled for writing. If flag is GL_FALSE,
- depth buffer writing is disabled. Otherwise, it is enabled. Initially, depth buffer
- writing is enabled.
- """
-
-def glDepthRange(zNear, zFar):
- """
- Specify mapping of depth values from normalized device coordinates to window coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/depthrange.html}
-
- @type zNear: int
- @param zNear: Specifies the mapping of the near clipping plane to window coordinates.
- The initial value is 0.
- @type zFar: int
- @param zFar: Specifies the mapping of the far clipping plane to window coordinates.
- The initial value is 1.
- """
-
-def glDisable(cap):
- """
- Disable server-side GL capabilities
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/enable.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a symbolic constant indicating a GL capability.
- """
-
-def glDrawBuffer(mode):
- """
- Specify which color buffers are to be drawn into
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawbuffer.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies up to four color buffers to be drawn into.
- """
-
-def glDrawPixels(width, height, format, type, pixels):
- """
- Write a block of pixels to the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/drawpixels.html}
-
- @type width, height: int
- @param width, height: Specify the dimensions of the pixel rectangle to be
- written into the frame buffer.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type for pixels.
- @type pixels: Buffer object
- @param pixels: Specifies a pointer to the pixel data.
- """
-
-def glEdgeFlag (flag):
- """
- B{glEdgeFlag, glEdgeFlagv}
-
- Flag edges as either boundary or non-boundary
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/edgeflag.html}
-
- @type flag: Depends of function prototype
- @param flag: Specifies the current edge flag value.The initial value is GL_TRUE.
- """
-
-def glEnable(cap):
- """
- Enable server-side GL capabilities
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/enable.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a symbolic constant indicating a GL capability.
- """
-
-def glEnd():
- """
- Delimit the vertices of a primitive or group of like primitives
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/begin.html}
- """
-
-def glEndList():
- """
- Create or replace a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/newlist.html}
- """
-
-def glEvalCoord (u,v):
- """
- B{glEvalCoord1d, glEvalCoord1f, glEvalCoord2d, glEvalCoord2f, glEvalCoord1dv, glEvalCoord1fv,
- glEvalCoord2dv, glEvalCoord2fv}
-
- Evaluate enabled one- and two-dimensional maps
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalcoord.html}
-
- @type u: Depends on function prototype.
- @param u: Specifies a value that is the domain coordinate u to the basis function defined
- in a previous glMap1 or glMap2 command. If the function prototype ends in 'v' then
- u specifies a pointer to an array containing either one or two domain coordinates. The first
- coordinate is u. The second coordinate is v, which is present only in glEvalCoord2 versions.
- @type v: Depends on function prototype. (only with '2' prototypes)
- @param v: Specifies a value that is the domain coordinate v to the basis function defined
- in a previous glMap2 command. This argument is not present in a glEvalCoord1 command.
- """
-
-def glEvalMesh (mode, i1, i2):
- """
- B{glEvalMesh1 or glEvalMesh2}
-
- Compute a one- or two-dimensional grid of points or lines
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalmesh.html}
-
- @type mode: Enumerated constant
- @param mode: In glEvalMesh1, specifies whether to compute a one-dimensional
- mesh of points or lines.
- @type i1, i2: int
- @param i1, i2: Specify the first and last integer values for the grid domain variable i.
- """
-
-def glEvalPoint (i, j):
- """
- B{glEvalPoint1 and glEvalPoint2}
-
- Generate and evaluate a single point in a mesh
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/evalpoint.html}
-
- @type i: int
- @param i: Specifies the integer value for grid domain variable i.
- @type j: int (only with '2' prototypes)
- @param j: Specifies the integer value for grid domain variable j (glEvalPoint2 only).
- """
-
-def glFeedbackBuffer (size, type, buffer):
- """
- Controls feedback mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/feedbackbuffer.html}
-
- @type size: int
- @param size:Specifies the maximum number of values that can be written into buffer.
- @type type: Enumerated constant
- @param type:Specifies a symbolic constant that describes the information that
- will be returned for each vertex.
- @type buffer: Buffer object I{GL_FLOAT}
- @param buffer: Returns the feedback data.
- """
-
-def glFinish():
- """
- Block until all GL execution is complete
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/finish.html}
- """
-
-def glFlush():
- """
- Force Execution of GL commands in finite time
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/flush.html}
- """
-
-def glFog (pname, param):
- """
- B{glFogf, glFogi, glFogfv, glFogiv}
-
- Specify fog parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/fog.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies a single-valued fog parameter. If the function prototype
- ends in 'v' specifies a fog parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value or values to be assigned to pname. GL_FOG_COLOR
- requires an array of four values. All other parameters accept an array containing
- only a single value.
- """
-
-def glFrontFace(mode):
- """
- Define front- and back-facing polygons
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/frontface.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the orientation of front-facing polygons.
- """
-
-def glFrustum(left, right, bottom, top, zNear, zFar):
- """
- Multiply the current matrix by a perspective matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/frustum.html}
-
- @type left, right: double (float)
- @param left, right: Specify the coordinates for the left and right vertical
- clipping planes.
- @type top, bottom: double (float)
- @param top, bottom: Specify the coordinates for the bottom and top horizontal
- clipping planes.
- @type zNear, zFar: double (float)
- @param zNear, zFar: Specify the distances to the near and far depth clipping planes.
- Both distances must be positive.
- """
-
-def glGenLists(range):
- """
- Generate a contiguous set of empty display lists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/genlists.html}
-
- @type range: int
- @param range: Specifies the number of contiguous empty display lists to be generated.
- """
-
-def glGenTextures(n, textures):
- """
- Generate texture names
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gentextures.html}
-
- @type n: int
- @param n: Specifies the number of textures name to be generated.
- @type textures: Buffer object I{type GL_INT}
- @param textures: Specifies an array in which the generated textures names are stored.
- """
-
-def glGet (pname, param):
- """
- B{glGetBooleanv, glGetfloatv, glGetFloatv, glGetIntegerv}
-
- Return the value or values of a selected parameter
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/get.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the parameter value to be returned.
- @type param: Depends on function prototype.
- @param param: Returns the value or values of the specified parameter.
- """
-
-def glGetClipPlane(plane, equation):
- """
- Return the coefficients of the specified clipping plane
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getclipplane.html}
-
- @type plane: Enumerated constant
- @param plane: Specifies a clipping plane. The number of clipping planes depends on the
- implementation, but at least six clipping planes are supported. They are identified by
- symbolic names of the form GL_CLIP_PLANEi where 0 < i < GL_MAX_CLIP_PLANES.
- @type equation: Buffer object I{type GL_FLOAT}
- @param equation: Returns four float (double)-precision values that are the coefficients of the
- plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
- """
-
-def glGetError():
- """
- Return error information
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/geterror.html}
- """
-
-def glGetLight (light, pname, params):
- """
- B{glGetLightfv and glGetLightiv}
-
- Return light source parameter values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getlight.html}
-
- @type light: Enumerated constant
- @param light: Specifies a light source. The number of possible lights depends on the
- implementation, but at least eight lights are supported. They are identified by symbolic
- names of the form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
- @type pname: Enumerated constant
- @param pname: Specifies a light source parameter for light.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetMap (target, query, v):
- """
- B{glGetMapdv, glGetMapfv, glGetMapiv}
-
- Return evaluator parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getmap.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of a map.
- @type query: Enumerated constant
- @param query: Specifies which parameter to return.
- @type v: Buffer object. Depends on function prototype.
- @param v: Returns the requested data.
- """
-
-def glGetMaterial (face, pname, params):
- """
- B{glGetMaterialfv, glGetMaterialiv}
-
- Return material parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getmaterial.html}
-
- @type face: Enumerated constant
- @param face: Specifies which of the two materials is being queried.
- representing the front and back materials, respectively.
- @type pname: Enumerated constant
- @param pname: Specifies the material parameter to return.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetPixelMap (map, values):
- """
- B{glGetPixelMapfv, glGetPixelMapuiv, glGetPixelMapusv}
-
- Return the specified pixel map
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpixelmap.html}
-
- @type map: Enumerated constant
- @param map: Specifies the name of the pixel map to return.
- @type values: Buffer object. Depends on function prototype.
- @param values: Returns the pixel map contents.
- """
-
-def glGetPolygonStipple(mask):
- """
- Return the polygon stipple pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getpolygonstipple.html}
-
- @type mask: Buffer object I{type GL_BYTE}
- @param mask: Returns the stipple pattern. The initial value is all 1's.
- """
-
-def glGetString(name):
- """
- Return a string describing the current GL connection
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getstring.html}
-
- @type name: Enumerated constant
- @param name: Specifies a symbolic constant.
-
- """
-
-def glGetTexEnv (target, pname, params):
- """
- B{glGetTexEnvfv, glGetTexEnviv}
-
- Return texture environment parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexenv.html}
-
- @type target: Enumerated constant
- @param target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a texture environment parameter.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexGen (coord, pname, params):
- """
- B{glGetTexGendv, glGetTexGenfv, glGetTexGeniv}
-
- Return texture coordinate generation parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexgen.html}
-
- @type coord: Enumerated constant
- @param coord: Specifies a texture coordinate.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the value(s) to be returned.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexImage(target, level, format, type, pixels):
- """
- Return a texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/getteximage.html}
-
- @type target: Enumerated constant
- @param target: Specifies which texture is to be obtained.
- @type level: int
- @param level: Specifies the level-of-detail number of the desired image.
- Level 0 is the base image level. Level n is the nth mipmap reduction image.
- @type format: Enumerated constant
- @param format: Specifies a pixel format for the returned data.
- @type type: Enumerated constant
- @param type: Specifies a pixel type for the returned data.
- @type pixels: Buffer object.
- @param pixels: Returns the texture image. Should be a pointer to an array of the
- type specified by type
- """
-
-def glGetTexLevelParameter (target, level, pname, params):
- """
- B{glGetTexLevelParameterfv, glGetTexLevelParameteriv}
-
- return texture parameter values for a specific level of detail
- @see: U{opengl.org/developers/documentation/man_pages/hardcopy/GL/html/gl/gettexlevelparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number of the desired image.
- Level 0 is the base image level. Level n is the nth mipmap reduction image.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a texture parameter.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the requested data.
- """
-
-def glGetTexParameter (target, pname, params):
- """
- B{glGetTexParameterfv, glGetTexParameteriv}
-
- Return texture parameter values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/gettexparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the symbolic name of the target texture.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name the target texture.
- @type params: Buffer object. Depends on function prototype.
- @param params: Returns the texture parameters.
- """
-
-def glHint(target, mode):
- """
- Specify implementation-specific hints
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/hint.html}
-
- @type target: Enumerated constant
- @param target: Specifies a symbolic constant indicating the behavior to be
- controlled.
- @type mode: Enumerated constant
- @param mode: Specifies a symbolic constant indicating the desired behavior.
- """
-
-def glIndex (c):
- """
- B{glIndexd, glIndexf, glIndexi, glIndexs, glIndexdv, glIndexfv, glIndexiv, glIndexsv}
-
- Set the current color index
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/index_.html}
-
- @type c: Buffer object. Depends on function prototype.
- @param c: Specifies a pointer to a one element array that contains the new value for
- the current color index.
- """
-
-def glInitNames():
- """
- Initialize the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/initnames.html}
- """
-
-def glIsEnabled(cap):
- """
- Test whether a capability is enabled
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/isenabled.html}
-
- @type cap: Enumerated constant
- @param cap: Specifies a constant representing a GL capability.
- """
-
-def glIsList(list):
- """
- Determine if a name corresponds to a display-list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/islist.html}
-
- @type list: unsigned int
- @param list: Specifies a potential display-list name.
- """
-
-def glIsTexture(texture):
- """
- Determine if a name corresponds to a texture
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/istexture.html}
-
- @type texture: unsigned int
- @param texture: Specifies a value that may be the name of a texture.
- """
-
-def glLight (light, pname, param):
- """
- B{glLightf,glLighti, glLightfv, glLightiv}
-
- Set the light source parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/light.html}
-
- @type light: Enumerated constant
- @param light: Specifies a light. The number of lights depends on the implementation,
- but at least eight lights are supported. They are identified by symbolic names of the
- form GL_LIGHTi where 0 < i < GL_MAX_LIGHTS.
- @type pname: Enumerated constant
- @param pname: Specifies a single-valued light source parameter for light.
- @type param: Depends on function prototype.
- @param param: Specifies the value that parameter pname of light source light will be set to.
- If function prototype ends in 'v' specifies a pointer to the value or values that
- parameter pname of light source light will be set to.
- """
-
-def glLightModel (pname, param):
- """
- B{glLightModelf, glLightModeli, glLightModelfv, glLightModeliv}
-
- Set the lighting model parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/lightmodel.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies a single-value light model parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value that param will be set to. If function prototype ends in 'v'
- specifies a pointer to the value or values that param will be set to.
- """
-
-def glLineStipple(factor, pattern):
- """
- Specify the line stipple pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/linestipple.html}
-
- @type factor: int
- @param factor: Specifies a multiplier for each bit in the line stipple pattern.
- If factor is 3, for example, each bit in the pattern is used three times before
- the next bit in the pattern is used. factor is clamped to the range [1, 256] and
- defaults to 1.
- @type pattern: unsigned short int
- @param pattern: Specifies a 16-bit integer whose bit pattern determines which fragments
- of a line will be drawn when the line is rasterized. Bit zero is used first; the default
- pattern is all 1's.
- """
-
-def glLineWidth(width):
- """
- Specify the width of rasterized lines.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/linewidth.html}
-
- @type width: float
- @param width: Specifies the width of rasterized lines. The initial value is 1.
- """
-
-def glListBase(base):
- """
- Set the display-list base for glCallLists
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/listbase.html}
-
- @type base: unsigned int
- @param base: Specifies an integer offset that will be added to glCallLists
- offsets to generate display-list names. The initial value is 0.
- """
-
-def glLoadIdentity():
- """
- Replace the current matrix with the identity matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadidentity.html}
- """
-
-def glLoadMatrix (m):
- """
- B{glLoadMatrixd, glLoadMatixf}
-
- Replace the current matrix with the specified matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadmatrix.html}
-
- @type m: Buffer object. Depends on function prototype.
- @param m: Specifies a pointer to 16 consecutive values, which are used as the elements
- of a 4x4 column-major matrix.
- """
-
-def glLoadName(name):
- """
- Load a name onto the name stack.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/loadname.html}
-
- @type name: unsigned int
- @param name: Specifies a name that will replace the top value on the name stack.
- """
-
-def glLogicOp(opcode):
- """
- Specify a logical pixel operation for color index rendering
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/logicop.html}
-
- @type opcode: Enumerated constant
- @param opcode: Specifies a symbolic constant that selects a logical operation.
- """
-
-def glMap1 (target, u1, u2, stride, order, points):
- """
- B{glMap1d, glMap1f}
-
- Define a one-dimensional evaluator
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/map1.html}
-
- @type target: Enumerated constant
- @param target: Specifies the kind of values that are generated by the evaluator.
- @type u1, u2: Depends on function prototype.
- @param u1,u2: Specify a linear mapping of u, as presented to glEvalCoord1, to ^, t
- he variable that is evaluated by the equations specified by this command.
- @type stride: int
- @param stride: Specifies the number of floats or float (double)s between the beginning
- of one control point and the beginning of the next one in the data structure
- referenced in points. This allows control points to be embedded in arbitrary data
- structures. The only constraint is that the values for a particular control point must
- occupy contiguous memory locations.
- @type order: int
- @param order: Specifies the number of control points. Must be positive.
- @type points: Buffer object. Depends on function prototype.
- @param points: Specifies a pointer to the array of control points.
- """
-
-def glMap2 (target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points):
- """
- B{glMap2d, glMap2f}
-
- Define a two-dimensional evaluator
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/map2.html}
-
- @type target: Enumerated constant
- @param target: Specifies the kind of values that are generated by the evaluator.
- @type u1, u2: Depends on function prototype.
- @param u1,u2: Specify a linear mapping of u, as presented to glEvalCoord2, to ^, t
- he variable that is evaluated by the equations specified by this command. Initially
- u1 is 0 and u2 is 1.
- @type ustride: int
- @param ustride: Specifies the number of floats or float (double)s between the beginning
- of control point R and the beginning of control point R ij, where i and j are the u
- and v control point indices, respectively. This allows control points to be embedded
- in arbitrary data structures. The only constraint is that the values for a particular
- control point must occupy contiguous memory locations. The initial value of ustride is 0.
- @type uorder: int
- @param uorder: Specifies the dimension of the control point array in the u axis.
- Must be positive. The initial value is 1.
- @type v1, v2: Depends on function prototype.
- @param v1, v2: Specify a linear mapping of v, as presented to glEvalCoord2, to ^,
- one of the two variables that are evaluated by the equations specified by this command.
- Initially, v1 is 0 and v2 is 1.
- @type vstride: int
- @param vstride: Specifies the number of floats or float (double)s between the beginning of control
- point R and the beginning of control point R ij, where i and j are the u and v control
- point(indices, respectively. This allows control points to be embedded in arbitrary data
- structures. The only constraint is that the values for a particular control point must
- occupy contiguous memory locations. The initial value of vstride is 0.
- @type vorder: int
- @param vorder: Specifies the dimension of the control point array in the v axis.
- Must be positive. The initial value is 1.
- @type points: Buffer object. Depends on function prototype.
- @param points: Specifies a pointer to the array of control points.
- """
-
-def glMapGrid (un, u1,u2 ,vn, v1, v2):
- """
- B{glMapGrid1d, glMapGrid1f, glMapGrid2d, glMapGrid2f}
-
- Define a one- or two-dimensional mesh
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/mapgrid.html}
-
- @type un: int
- @param un: Specifies the number of partitions in the grid range interval
- [u1, u2]. Must be positive.
- @type u1, u2: Depends on function prototype.
- @param u1, u2: Specify the mappings for integer grid domain values i=0 and i=un.
- @type vn: int
- @param vn: Specifies the number of partitions in the grid range interval [v1, v2]
- (glMapGrid2 only).
- @type v1, v2: Depends on function prototype.
- @param v1, v2: Specify the mappings for integer grid domain values j=0 and j=vn
- (glMapGrid2 only).
- """
-
-def glMaterial (face, pname, params):
- """
- Specify material parameters for the lighting model.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/material.html}
-
- @type face: Enumerated constant
- @param face: Specifies which face or faces are being updated. Must be one of:
- @type pname: Enumerated constant
- @param pname: Specifies the single-valued material parameter of the face
- or faces that is being updated. Must be GL_SHININESS.
- @type params: int
- @param params: Specifies the value that parameter GL_SHININESS will be set to.
- If function prototype ends in 'v' specifies a pointer to the value or values that
- pname will be set to.
- """
-
-def glMatrixMode(mode):
- """
- Specify which matrix is the current matrix.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/matrixmode.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies which matrix stack is the target for subsequent matrix operations.
- """
-
-def glMultMatrix (m):
- """
- B{glMultMatrixd, glMultMatrixf}
-
- Multiply the current matrix with the specified matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/multmatrix.html}
-
- @type m: Buffer object. Depends on function prototype.
- @param m: Points to 16 consecutive values that are used as the elements of a 4x4 column
- major matrix.
- """
-
-def glNewList(list, mode):
- """
- Create or replace a display list
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/newlist.html}
-
- @type list: unsigned int
- @param list: Specifies the display list name
- @type mode: Enumerated constant
- @param mode: Specifies the compilation mode.
- """
-
-def glNormal3 (nx, ny, nz, v):
- """
- B{Normal3b, Normal3bv, Normal3d, Normal3dv, Normal3f, Normal3fv, Normal3i, Normal3iv,
- Normal3s, Normal3sv}
-
- Set the current normal vector
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/normal.html}
-
- @type nx, ny, nz: Depends on function prototype. (non - 'v' prototypes only)
- @param nx, ny, nz: Specify the x, y, and z coordinates of the new current normal.
- The initial value of the current normal is the unit vector, (0, 0, 1).
- @type v: Buffer object. Depends on function prototype. ('v' prototypes)
- @param v: Specifies a pointer to an array of three elements: the x, y, and z coordinates
- of the new current normal.
- """
-
-def glOrtho(left, right, bottom, top, zNear, zFar):
- """
- Multiply the current matrix with an orthographic matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/ortho.html}
-
- @type left, right: double (float)
- @param left, right: Specify the coordinates for the left and
- right vertical clipping planes.
- @type bottom, top: double (float)
- @param bottom, top: Specify the coordinates for the bottom and top
- horizontal clipping planes.
- @type zNear, zFar: double (float)
- @param zNear, zFar: Specify the distances to the nearer and farther
- depth clipping planes. These values are negative if the plane is to be behind the viewer.
- """
-
-def glPassThrough(token):
- """
- Place a marker in the feedback buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/passthrough.html}
-
- @type token: float
- @param token: Specifies a marker value to be placed in the feedback
- buffer following a GL_PASS_THROUGH_TOKEN.
- """
-
-def glPixelMap (map, mapsize, values):
- """
- B{glPixelMapfv, glPixelMapuiv, glPixelMapusv}
-
- Set up pixel transfer maps
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelmap.html}
-
- @type map: Enumerated constant
- @param map: Specifies a symbolic map name.
- @type mapsize: int
- @param mapsize: Specifies the size of the map being defined.
- @type values: Buffer object. Depends on function prototype.
- @param values: Specifies an array of mapsize values.
- """
-
-def glPixelStore (pname, param):
- """
- B{glPixelStoref, glPixelStorei}
-
- Set pixel storage modes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelstore.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the parameter to be set.
- Six values affect the packing of pixel data into memory.
- Six more affect the unpacking of pixel data from memory.
- @type param: Depends on function prototype.
- @param param: Specifies the value that pname is set to.
- """
-
-def glPixelTransfer (pname, param):
- """
- B{glPixelTransferf, glPixelTransferi}
-
- Set pixel transfer modes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixeltransfer.html}
-
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the pixel transfer parameter to be set.
- @type param: Depends on function prototype.
- @param param: Specifies the value that pname is set to.
- """
-
-def glPixelZoom(xfactor, yfactor):
- """
- Specify the pixel zoom factors
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pixelzoom.html}
-
- @type xfactor, yfactor: float
- @param xfactor, yfactor: Specify the x and y zoom factors for pixel write operations.
- """
-
-def glPointSize(size):
- """
- Specify the diameter of rasterized points
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pointsize.html}
-
- @type size: float
- @param size: Specifies the diameter of rasterized points. The initial value is 1.
- """
-
-def glPolygonMode(face, mode):
- """
- Select a polygon rasterization mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonmode.html}
-
- @type face: Enumerated constant
- @param face: Specifies the polygons that mode applies to.
- Must be GL_FRONT for front-facing polygons, GL_BACK for back- facing polygons,
- or GL_FRONT_AND_BACK for front- and back-facing polygons.
- @type mode: Enumerated constant
- @param mode: Specifies how polygons will be rasterized.
- The initial value is GL_FILL for both front- and back- facing polygons.
- """
-
-def glPolygonOffset(factor, units):
- """
- Set the scale and units used to calculate depth values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonoffset.html}
-
- @type factor: float
- @param factor: Specifies a scale factor that is used to create a variable depth
- offset for each polygon. The initial value is 0.
- @type units: float
- @param units: Is multiplied by an implementation-specific value to create a constant
- depth offset. The initial value is 0.
- """
-
-def glPolygonStipple(mask):
- """
- Set the polygon stippling pattern
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/polygonstipple.html}
-
- @type mask: Buffer object I{type GL_BYTE}
- @param mask: Specifies a pointer to a 32x32 stipple pattern that will be unpacked
- from memory in the same way that glDrawPixels unpacks pixels.
- """
-
-def glPopAttrib():
- """
- Pop the server attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html}
- """
-
-def glPopClientAttrib():
- """
- Pop the client attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
- """
-
-def glPopMatrix():
- """
- Pop the current matrix stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushmatrix.html}
- """
-
-def glPopName():
- """
- Pop the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushname.html}
- """
-
-def glPrioritizeTextures(n, textures, priorities):
- """
- Set texture residence priority
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/prioritizetextures.html}
-
- @type n: int
- @param n:Specifies the number of textures to be prioritized.
- @type textures: Buffer I{type GL_INT}
- @param textures: Specifies an array containing the names of the textures to be prioritized.
- @type priorities: Buffer I{type GL_FLOAT}
- @param priorities: Specifies an array containing the texture priorities. A priority given
- in an element of priorities applies to the texture named by the corresponding element of textures.
- """
-
-def glPushAttrib(mask):
- """
- Push the server attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Specifies a mask that indicates which attributes to save.
- """
-
-def glPushClientAttrib(mask):
- """
- Push the client attribute stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
-
- @type mask: Enumerated constant(s)
- @param mask: Specifies a mask that indicates which attributes to save.
- """
-
-def glPushMatrix():
- """
- Push the current matrix stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushmatrix.html}
- """
-
-def glPushName(name):
- """
- Push the name stack
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushname.html}
-
- @type name: unsigned int
- @param name: Specifies a name that will be pushed onto the name stack.
- """
-
-def glRasterPos (x,y,z,w):
- """
- B{glRasterPos2d, glRasterPos2f, glRasterPos2i, glRasterPos2s, glRasterPos3d,
- glRasterPos3f, glRasterPos3i, glRasterPos3s, glRasterPos4d, glRasterPos4f,
- glRasterPos4i, glRasterPos4s, glRasterPos2dv, glRasterPos2fv, glRasterPos2iv,
- glRasterPos2sv, glRasterPos3dv, glRasterPos3fv, glRasterPos3iv, glRasterPos3sv,
- glRasterPos4dv, glRasterPos4fv, glRasterPos4iv, glRasterPos4sv}
-
- Specify the raster position for pixel operations
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rasterpos.html}
-
- @type x, y, z, w: Depends on function prototype. (z and w for '3' and '4' prototypes only)
- @param x, y, z, w: Specify the x,y,z, and w object coordinates (if present) for the
- raster position. If function prototype ends in 'v' specifies a pointer to an array of two,
- three, or four elements, specifying x, y, z, and w coordinates, respectively.
- @note:
- If you are drawing to the 3d view with a Scriptlink of a space handler
- the zoom level of the panels will scale the glRasterPos by the view matrix.
- so a X of 10 will not always offset 10 pixels as you would expect.
-
- To work around this get the scale value of the view matrix and use it to scale your pixel values.
-
- Workaround::
-
- import Blender
- from Blender.BGL import *
- xval, yval= 100, 40
- # Get the scale of the view matrix
- viewMatrix = Buffer(GL_FLOAT, 16)
- glGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix)
- f = 1/viewMatrix[0]
- glRasterPos2f(xval*f, yval*f) # Instead of the usual glRasterPos2i(xval, yval)
- """
-
-def glReadBuffer(mode):
- """
- Select a color buffer source for pixels.
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readbuffer.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies a color buffer.
- """
-
-def glReadPixels(x, y, width, height, format, type, pixels):
- """
- Read a block of pixels from the frame buffer
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/readpixels.html}
-
- @type x, y: int
- @param x, y:Specify the window coordinates of the first pixel that is read
- from the frame buffer. This location is the lower left corner of a rectangular
- block of pixels.
- @type width, height: int
- @param width, height: Specify the dimensions of the pixel rectangle. width and
- height of one correspond to a single pixel.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object
- @param pixels: Returns the pixel data.
- """
-
-def glRect (x1,y1,x2,y2,v1,v2):
- """
- B{glRectd, glRectf, glRecti, glRects, glRectdv, glRectfv, glRectiv, glRectsv}
-
- Draw a rectangle
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rect.html}
-
- @type x1, y1: Depends on function prototype. (for non 'v' prototypes only)
- @param x1, y1: Specify one vertex of a rectangle
- @type x2, y2: Depends on function prototype. (for non 'v' prototypes only)
- @param x2, y2: Specify the opposite vertex of the rectangle
- @type v1, v2: Depends on function prototype. (for 'v' prototypes only)
- @param v1, v2: Specifies a pointer to one vertex of a rectangle and the pointer
- to the opposite vertex of the rectangle
- """
-
-def glRenderMode(mode):
- """
- Set rasterization mode
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rendermode.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies the rasterization mode.
- """
-
-def glRotate (angle, x, y, z):
- """
- B{glRotated, glRotatef}
-
- Multiply the current matrix by a rotation matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/rotate.html}
-
- @type angle: Depends on function prototype.
- @param angle: Specifies the angle of rotation in degrees.
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify the x, y, and z coordinates of a vector respectively.
- """
-
-def glScale (x,y,z):
- """
- B{glScaled, glScalef}
-
- Multiply the current matrix by a general scaling matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scale.html}
-
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify scale factors along the x, y, and z axes, respectively.
- """
-
-def glScissor(x,y,width,height):
- """
- Define the scissor box
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/scissor.html}
-
- @type x, y: int
- @param x, y: Specify the lower left corner of the scissor box. Initially (0, 0).
- @type width, height: int
- @param width height: Specify the width and height of the scissor box. When a
- GL context is first attached to a window, width and height are set to the
- dimensions of that window.
- """
-
-def glSelectBuffer(size, buffer):
- """
- Establish a buffer for selection mode values
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/selectbuffer.html}
-
- @type size: int
- @param size: Specifies the size of buffer
- @type buffer: Buffer I{type GL_INT}
- @param buffer: Returns the selection data
- """
-
-def glShadeModel(mode):
- """
- Select flat or smooth shading
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/shademodel.html}
-
- @type mode: Enumerated constant
- @param mode: Specifies a symbolic value representing a shading technique.
- """
-
-def glStencilFuc(func, ref, mask):
- """
- Set function and reference value for stencil testing
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilfunc.html}
-
- @type func: Enumerated constant
- @param func:Specifies the test function.
- @type ref: int
- @param ref:Specifies the reference value for the stencil test. ref is clamped to
- the range [0,2n-1], where n is the number of bitplanes in the stencil buffer.
- The initial value is 0.
- @type mask: unsigned int
- @param mask:Specifies a mask that is ANDed with both the reference value and
- the stored stencil value when the test is done. The initial value is all 1's.
- """
-
-def glStencilMask(mask):
- """
- Control the writing of individual bits in the stencil planes
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilmask.html}
-
- @type mask: unsigned int
- @param mask: Specifies a bit mask to enable and disable writing of individual bits
- in the stencil planes. Initially, the mask is all 1's.
- """
-
-def glStencilOp(fail, zfail, zpass):
- """
- Set stencil test actions
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/stencilop.html}
-
- @type fail: Enumerated constant
- @param fail: Specifies the action to take when the stencil test fails.
- The initial value is GL_KEEP.
- @type zfail: Enumerated constant
- @param zfail: Specifies the stencil action when the stencil test passes, but the
- depth test fails. zfail accepts the same symbolic constants as fail.
- The initial value is GL_KEEP.
- @type zpass: Enumerated constant
- @param zpass: Specifies the stencil action when both the stencil test and the
- depth test pass, or when the stencil test passes and either there is no depth
- buffer or depth testing is not enabled. zpass accepts the same symbolic constants
- as fail. The initial value is GL_KEEP.
- """
-
-def glTexCoord (s,t,r,q,v):
- """
- B{glTexCoord1d, glTexCoord1f, glTexCoord1i, glTexCoord1s, glTexCoord2d, glTexCoord2f,
- glTexCoord2i, glTexCoord2s, glTexCoord3d, glTexCoord3f, glTexCoord3i, glTexCoord3s,
- glTexCoord4d, glTexCoord4f, glTexCoord4i, glTexCoord4s, glTexCoord1dv, glTexCoord1fv,
- glTexCoord1iv, glTexCoord1sv, glTexCoord2dv, glTexCoord2fv, glTexCoord2iv,
- glTexCoord2sv, glTexCoord3dv, glTexCoord3fv, glTexCoord3iv, glTexCoord3sv,
- glTexCoord4dv, glTexCoord4fv, glTexCoord4iv, glTexCoord4sv}
-
- Set the current texture coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texcoord.html}
-
- @type s, t, r, q: Depends on function prototype. (r and q for '3' and '4' prototypes only)
- @param s, t, r, q: Specify s, t, r, and q texture coordinates. Not all parameters are
- present in all forms of the command.
- @type v: Buffer object. Depends on function prototype. (for 'v' prototypes only)
- @param v: Specifies a pointer to an array of one, two, three, or four elements,
- which in turn specify the s, t, r, and q texture coordinates.
- """
-
-def glTexEnv (target, pname, param):
- """
- B{glTextEnvf, glTextEnvi, glTextEnvfv, glTextEnviv}
-
- Set texture environment parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texenv.html}
-
- @type target: Enumerated constant
- @param target: Specifies a texture environment. Must be GL_TEXTURE_ENV.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a single-valued texture environment
- parameter. Must be GL_TEXTURE_ENV_MODE.
- @type param: Depends on function prototype.
- @param param: Specifies a single symbolic constant. If function prototype ends in 'v'
- specifies a pointer to a parameter array that contains either a single symbolic
- constant or an RGBA color
- """
-
-def glTexGen (coord, pname, param):
- """
- B{glTexGend, glTexGenf, glTexGeni, glTexGendv, glTexGenfv, glTexGeniv}
-
- Control the generation of texture coordinates
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texgen.html}
-
- @type coord: Enumerated constant
- @param coord: Specifies a texture coordinate.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of the texture- coordinate generation function.
- @type param: Depends on function prototype.
- @param param: Specifies a single-valued texture generation parameter.
- If function prototype ends in 'v' specifies a pointer to an array of texture
- generation parameters. If pname is GL_TEXTURE_GEN_MODE, then the array must
- contain a single symbolic constant. Otherwise, params holds the coefficients
- for the texture-coordinate generation function specified by pname.
- """
-
-def glTexImage1D(target, level, internalformat, width, border, format, type, pixels):
- """
- Specify a one-dimensional texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage1d.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide. The height of the 1D texture image is 1.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object.
- @param pixels: Specifies a pointer to the image data in memory.
- """
-
-def glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels):
- """
- Specify a two-dimensional texture image
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type level: int
- @param level: Specifies the level-of-detail number. Level 0 is the base image level.
- Level n is the nth mipmap reduction image.
- @type internalformat: int
- @param internalformat: Specifies the number of color components in the texture.
- @type width: int
- @param width: Specifies the width of the texture image. Must be 2n+2(border) for
- some integer n. All implementations support texture images that are at least 64
- texels wide.
- @type height: int
- @param height: Specifies the height of the texture image. Must be 2m+2(border) for
- some integer m. All implementations support texture images that are at least 64
- texels high.
- @type border: int
- @param border: Specifies the width of the border. Must be either 0 or 1.
- @type format: Enumerated constant
- @param format: Specifies the format of the pixel data.
- @type type: Enumerated constant
- @param type: Specifies the data type of the pixel data.
- @type pixels: Buffer object.
- @param pixels: Specifies a pointer to the image data in memory.
- """
-
-def glTexParameter (target, pname, param):
- """
- B{glTexParameterf, glTexParameteri, glTexParameterfv, glTexParameteriv}
-
- Set texture parameters
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texparameter.html}
-
- @type target: Enumerated constant
- @param target: Specifies the target texture.
- @type pname: Enumerated constant
- @param pname: Specifies the symbolic name of a single-valued texture parameter.
- @type param: Depends on function prototype.
- @param param: Specifies the value of pname. If function prototype ends in 'v' specifies
- a pointer to an array where the value or values of pname are stored.
- """
-
-def glTranslate (x, y, z):
- """
- B{glTranslatef, glTranslated}
-
- Multiply the current matrix by a translation matrix
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/translate.html}
-
- @type x, y, z: Depends on function prototype.
- @param x, y, z: Specify the x, y, and z coordinates of a translation vector.
- """
-
-def glVertex (x,y,z,w,v):
- """
- B{glVertex2d, glVertex2f, glVertex2i, glVertex2s, glVertex3d, glVertex3f, glVertex3i,
- glVertex3s, glVertex4d, glVertex4f, glVertex4i, glVertex4s, glVertex2dv, glVertex2fv,
- glVertex2iv, glVertex2sv, glVertex3dv, glVertex3fv, glVertex3iv, glVertex3sv, glVertex4dv,
- glVertex4fv, glVertex4iv, glVertex4sv}
-
- Specify a vertex
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/vertex.html}
-
- @type x, y, z, w: Depends on function prototype (z and w for '3' and '4' prototypes only)
- @param x, y, z, w: Specify x, y, z, and w coordinates of a vertex. Not all parameters
- are present in all forms of the command.
- @type v: Buffer object. Depends of function prototype (for 'v' prototypes only)
- @param v: Specifies a pointer to an array of two, three, or four elements. The
- elements of a two-element array are x and y; of a three-element array, x, y, and z;
- and of a four-element array, x, y, z, and w.
- """
-
-def glViewport(x,y,width,height):
- """
- Set the viewport
- @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/viewport.html}
-
- @type x, y: int
- @param x, y: Specify the lower left corner of the viewport rectangle,
- in pixels. The initial value is (0,0).
- @type width, height: int
- @param width, height: Specify the width and height of the viewport. When a GL context
- is first attached to a window, width and height are set to the dimensions of that window.
- """
-
-def gluPerspective(fovY, aspect, zNear, zFar):
- """
- Set up a perspective projection matrix.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5577288}
-
- @type fovY: double
- @param fovY: Specifies the field of view angle, in degrees, in the y direction.
- @type aspect: double
- @param aspect: Specifies the aspect ratio that determines the field of view in the x direction.
- The aspect ratio is the ratio of x (width) to y (height).
- @type zNear: double
- @param zNear: Specifies the distance from the viewer to the near clipping plane (always positive).
- @type zFar: double
- @param zFar: Specifies the distance from the viewer to the far clipping plane (always positive).
- """
-
-def gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz):
- """
- Define a viewing transformation
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5573042}
-
- @type eyex, eyey, eyez: double
- @param eyex, eyey, eyez: Specifies the position of the eye point.
- @type centerx, centery, centerz: double
- @param centerx, centery, centerz: Specifies the position of the reference point.
- @type upx, upy, upz: double
- @param upx, upy, upz: Specifies the direction of the up vector.
- """
-
-def gluOrtho2D(left, right, bottom, top):
- """
- Define a 2-D orthographic projection matrix
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type left, right: double
- @param left, right: Specify the coordinates for the left and right vertical clipping planes.
- @type bottom, top: double
- @param bottom, top: Specify the coordinates for the bottom and top horizontal clipping planes.
- """
-
-def gluPickMatrix(x, y, width, height, viewport):
- """
- Define a picking region
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type x, y: double
- @param x, y: Specify the center of a picking region in window coordinates.
- @type width, height: double
- @param width, height: Specify the width and height, respectively, of the picking region in window coordinates.
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport.
- """
-
-def gluProject(objx, objy, objz, modelMatrix, projMatrix, viewport, winx, winy, winz):
- """
- Map object coordinates to window coordinates.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5578074}
-
- @type objx, objy, objz: double
- @param objx, objy, objz: Specify the object coordinates.
- @type modelMatrix: Buffer object. [double]
- @param modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- @type projMatrix: Buffer object. [double]
- @param projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport (as from a glGetIntegerv call).
- @type winx, winy, winz: Buffer object. [double]
- @param winx, winy, winz: Return the computed window coordinates.
- """
-
-def gluUnProject(winx, winy, winz, modelMatrix, projMatrix, viewport, objx, objy, objz):
- """
- Map object coordinates to window
- coordinates.
- @see: U{http://biology.ncsa.uiuc.edu/cgi-bin/infosrch.cgi?cmd=getdoc&coll=0650&db=bks&fname=/SGI_Developer/OpenGL_RM/ch06.html#id5582204}
-
- @type winx, winy, winz: double
- @param winx, winy, winz: Specify the window coordinates to be mapped.
- @type modelMatrix: Buffer object. [double]
- @param modelMatrix: Specifies the current modelview matrix (as from a glGetDoublev call).
- @type projMatrix: Buffer object. [double]
- @param projMatrix: Specifies the current projection matrix (as from a glGetDoublev call).
- @type viewport: Buffer object. [int]
- @param viewport: Specifies the current viewport (as from a glGetIntegerv call).
- @type objx, objy, objz: Buffer object. [double]
- @param objx, objy, objz: Return the computed object coordinates.
- """
-
-class Buffer:
- """
- The Buffer object is simply a block of memory that is delineated and initialized by the
- user. Many OpenGL functions return data to a C-style pointer, however, because this
- is not possible in python the Buffer object can be used to this end. Wherever pointer
- notation is used in the OpenGL functions the Buffer object can be used in it's BGL
- wrapper. In some instances the Buffer object will need to be initialized with the template
- parameter, while in other instances the user will want to create just a blank buffer
- which will be zeroed by default.
-
- Example with Buffer::
- import Blender
- from Blender import BGL
- myByteBuffer = BGL.Buffer(BGL.GL_BYTE, [32,32])
- BGL.glGetPolygonStipple(myByteBuffer)
- print myByteBuffer.dimensions
- print myByteBuffer.list
- sliceBuffer = myByteBuffer[0:16]
- print sliceBuffer
-
- @ivar list: The contents of the Buffer.
- @ivar dimensions: The size of the Buffer.
- """
-
- def __init__(type, dimensions, template = None):
- """
- This will create a new Buffer object for use with other BGL OpenGL commands.
- Only the type of argument to store in the buffer and the dimensions of the buffer
- are necessary. Buffers are zeroed by default unless a template is supplied, in
- which case the buffer is initialized to the template.
-
- @type type: int
- @param type: The format to store data in. The type should be one of
- GL_BYTE, GL_SHORT, GL_INT, or GL_FLOAT.
- @type dimensions: An int or sequence object specifying the dimensions of the buffer.
- @param dimensions: If the dimensions are specified as an int a linear array will
- be created for the buffer. If a sequence is passed for the dimensions, the buffer
- becomes n-Dimensional, where n is equal to the number of parameters passed in the
- sequence. Example: [256,2] is a two- dimensional buffer while [256,256,4] creates
- a three- dimensional buffer. You can think of each additional dimension as a sub-item
- of the dimension to the left. i.e. [10,2] is a 10 element array each with 2 sub-items.
- [(0,0), (0,1), (1,0), (1,1), (2,0), ...] etc.
- @type template: A python sequence object (optional)
- @param template: A sequence of matching dimensions which will be used to initialize
- the Buffer. If a template is not passed in all fields will be initialized to 0.
- @rtype: Buffer object
- @return: The newly created buffer as a PyObject.
- """
diff --git a/source/blender/python/doc/epy/Geometry.py b/source/blender/python/doc/epy/Geometry.py
deleted file mode 100644
index d0c4dfdfd8d..00000000000
--- a/source/blender/python/doc/epy/Geometry.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Blender.Geometry module and its subtypes
-
-"""
-The Blender.Geometry submodule.
-
-Geometry
-========
-(when accessing it from the Game Engine use Geometry instead of Blender.Geometry)
-
-This new module provides access to a geometry function.
-"""
-
-def Intersect(vec1, vec2, vec3, ray, orig, clip=1):
- """
- Return the intersection between a ray and a triangle, if possible, return None otherwise.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one corner of the triangle.
- @type ray: Vector object.
- @param ray: A 3d vector, the orientation of the ray. the length of the ray is not used, only the direction.
- @type orig: Vector object.
- @param orig: A 3d vector, the origin of the ray.
- @type clip: integer
- @param clip: if 0, don't restrict the intersection to the area of the triangle, use the infinite plane defined by the triangle.
- @rtype: Vector object
- @return: The intersection between a ray and a triangle, if possible, None otherwise.
- """
-
-def TriangleArea(vec1, vec2, vec3):
- """
- Return the area size of the 2D or 3D triangle defined.
- @type vec1: Vector object.
- @param vec1: A 2d or 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 2d or 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 2d or 3d vector, one corner of the triangle.
- @rtype: float
- @return: The area size of the 2D or 3D triangle defined.
- """
-
-def TriangleNormal(vec1, vec2, vec3):
- """
- Return the normal of the 3D triangle defined.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one corner of the triangle.
- @type vec2: Vector object.
- @param vec2: A 3d vector, one corner of the triangle.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one corner of the triangle.
- @rtype: float
- @return: The normal of the 3D triangle defined.
- """
-
-def QuadNormal(vec1, vec2, vec3, vec4):
- """
- Return the normal of the 3D quad defined.
- @type vec1: Vector object.
- @param vec1: A 3d vector, the first vertex of the quad.
- @type vec2: Vector object.
- @param vec2: A 3d vector, the second vertex of the quad.
- @type vec3: Vector object.
- @param vec3: A 3d vector, the third vertex of the quad.
- @type vec4: Vector object.
- @param vec4: A 3d vector, the fourth vertex of the quad.
- @rtype: float
- @return: The normal of the 3D quad defined.
- """
-
-def LineIntersect(vec1, vec2, vec3, vec4):
- """
- Return a tuple with the points on each line respectively closest to the other
- (when both lines intersect, both vector hold the same value).
- The lines are evaluated as infinite lines in space, the values returned may not be between the 2 points given for each line.
- @type vec1: Vector object.
- @param vec1: A 3d vector, one point on the first line.
- @type vec2: Vector object.
- @param vec2: A 3d vector, another point on the first line.
- @type vec3: Vector object.
- @param vec3: A 3d vector, one point on the second line.
- @type vec4: Vector object.
- @param vec4: A 3d vector, another point on the second line.
- @rtype: (Vector object, Vector object)
- @return: A tuple with the points on each line respectively closest to the other.
- """
-
-def PolyFill(polylines):
- """
- Takes a list of polylines and calculates triangles that would fill in the polylines.
- Multiple lines can be used to make holes inside a polyline, or fill in 2 separate lines at once.
- @type polylines: List of lists containing vectors, each representing a closed polyline.
- @rtype: list
- @return: a list if tuples each a tuple of 3 ints representing a triangle indexing the points given.
- @note: 2D Vectors will have an assumed Z axis of zero, 4D Vectors W axis is ignored.
- @note: The order of points in a polyline effect the direction returned triangles face, reverse the order of a polyline to flip the normal of returned faces.
-
- I{B{Example:}}
-
- The example below creates 2 polylines and fills them in with faces, then makes a mesh in the current scene::
- import Blender
- Vector= Blender.mathutils.Vector
-
- # Outline of 5 points
- polyline1= [Vector(-2.0, 1.0, 1.0), Vector(-1.0, 2.0, 1.0), Vector(1.0, 2.0, 1.0), Vector(1.0, -1.0, 1.0), Vector(-1.0, -1.0, 1.0)]
- polyline2= [Vector(-1, 1, 1.0), Vector(0, 1, 1.0), Vector(0, 0, 1.0), Vector(-1.0, 0.0, 1.0)]
- fill= Blender.Geometry.PolyFill([polyline1, polyline2])
-
- # Make a new mesh and add the truangles into it
- me= Blender.Mesh.New()
- me.verts.extend(polyline1)
- me.verts.extend(polyline2)
- me.faces.extend(fill) # Add the faces, they reference the verts in polyline 1 and 2
-
- scn = Blender.Scene.GetCurrent()
- ob = scn.objects.new(me)
- Blender.Redraw()
- """
-
-def LineIntersect2D(vec1, vec2, vec3, vec4):
- """
- Takes 2 lines vec1, vec2 for the 2 points of the first line and vec2, vec3 for the 2 points of the second line.
- @rtype: Vector
- @return: a 2D Vector for the intersection or None where there is no intersection.
- """
-
-def ClosestPointOnLine(pt, vec1, vec2):
- """
- Takes 2 lines vec1, vec2 for the 2 points of the first line and vec2, vec3 for the 2 points of the second line.
- @rtype: tuple
- @return: a tuple containing a vector and a float, the vector is the closest point on the line, the float is the position on the line, between 0 and 1 the point is on the line.
- """
-
-def PointInTriangle2D(pt, tri_pt1, tri_pt2, tri_pt3):
- """
- Takes 4 vectors (one for the test point and 3 for the triangle)
- This is a 2d function so only X and Y are used, Z and W will be ignored.
- @rtype: int
- @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
- """
-
-def PointInQuad2D(pt, quad_pt1, quad_pt2, quad_pt3):
- """
- Takes 5 vectors (one for the test point and 5 for the quad)
- This is a 2d function so only X and Y are used, Z and W will be ignored.
- @rtype: int
- @return: 1 for a clockwise intersection, -1 for counter clockwise intersection, 0 when there is no intersection.
- """
-
-def BoxPack2D(boxlist):
- """
- Takes a list of 2D boxes and packs them into a square.
- Each box in boxlist must be a list of at least 4 items - [x,y,w,h], after running this script,
- the X and Y values in each box will be moved to packed, non overlapping locations.
-
- Example::
-
- # Make 500 random boxes, pack them and make a mesh from it
- from Blender import Geometry, Scene, Mesh
- import random
- boxes = []
- for i in xrange(500):
- boxes.append( [0,0, random.random()+0.1, random.random()+0.1] )
- boxsize = Geometry.BoxPack2D(boxes)
- print 'BoxSize', boxsize
- me = Mesh.New()
- for x in boxes:
- me.verts.extend([(x[0],x[1], 0), (x[0],x[1]+x[3], 0), (x[0]+x[2],x[1]+x[3], 0), (x[0]+x[2],x[1], 0) ])
- v1= me.verts[-1]
- v2= me.verts[-2]
- v3= me.verts[-3]
- v4= me.verts[-4]
- me.faces.extend([(v1,v2,v3,v4)])
- scn = Scene.GetCurrent()
- scn.objects.new(me)
-
- @note: Each boxlist item can be longer then 4, the extra items are ignored and stay untouched.
- @rtype: tuple
- @return: a tuple pair - (width, height) of all the packed boxes.
- """
-def BezierInterp(vec_knot_1, vec_handle_1, vec_handle_2, vec_knot_2, resolution):
- """
- Takes 4 vectors representing a bezier curve and returns a list of vector points.
- @note: any vector size is supported, the largest dimension from the input will be used for all returned vectors/
- @rtype: list
- @return: a list of vectors the size of resolution including the start and end points (vec_knot_1 and vec_knot_2)
- """
diff --git a/source/blender/python/doc/epy/IDProp.py b/source/blender/python/doc/epy/IDProp.py
deleted file mode 100644
index 1fc26d7f65b..00000000000
--- a/source/blender/python/doc/epy/IDProp.py
+++ /dev/null
@@ -1,132 +0,0 @@
-class IDGroup:
- """
- The IDGroup Type
- ================
- This type supports both iteration and the []
- operator to get child ID properties.
-
- You can also add new properties using the [] operator.
- For example::
-
- group['a float!'] = 0.0
- group['an int!'] = 0
- group['a string!'] = "hi!"
- group['an array!'] = [0, 0, 1.0, 0]
-
- group['a subgroup!] = {"float": 0.0, "an int": 1.0, "an array": [1, 2],
- "another subgroup": {"a": 0.0, "str": "bleh"}}
-
- Note that for arrays, the array type defaults to int unless a float is found
- while scanning the template list; if any floats are found, then the whole
- array is float. Note that double-precision floating point numbers are used for
- python-created float ID properties and arrays (though the internal C api does
- support single-precision floats, and the python code will read them).
-
- You can also delete properties with the del operator. For example:
-
- del group['property']
-
- To get the type of a property, use the type() operator, for example::
-
- if type(group['bleh']) == str: pass
-
- To tell if the property is a group or array type, import the Blender.Types module and test
- against IDGroupType and IDArrayType, like so::
-
- from Blender.Types import IDGroupType, IDArrayType.
-
- if type(group['bleghr']) == IDGroupType:
- (do something)
-
- @ivar name: The name of the property
- @type name: string
- """
-
- def pop(item):
- """
- Pop an item from the group property.
- @type item: string
- @param item: The item name.
- @rtype: can be dict, list, int, float or string.
- @return: The removed property.
- """
-
- def update(updatedict):
- """
- Updates items in the dict, similar to normal python
- dictionary method .update().
- @type updatedict: dict
- @param updatedict: A dict of simple types to derive updated/new IDProperties from.
- @rtype: None
- @return: None
- """
-
- def keys():
- """
- Returns a list of the keys in this property group.
- @rtype: list of strings.
- @return: a list of the keys in this property group.
- """
-
- def values():
- """
- Returns a list of the values in this property group.
-
- Note that unless a value is itself a property group or an array, you
- cannot change it by changing the values in this list, you must change them
- in the parent property group.
-
- For example,
-
- group['some_property'] = new_value
-
- . . .is correct, while,
-
- values = group.values()
- values[0] = new_value
-
- . . .is wrong.
-
- @rtype: list of strings.
- @return: a list of the values in this property group.
- """
-
- def iteritems():
- """
- Implements the python dictionary iteritmes method.
-
- For example::
-
- for k, v in group.iteritems():
- print "Property name: " + k
- print "Property value: " + str(v)
-
- @rtype: an iterator that spits out items of the form [key, value]
- @return: an iterator.
- """
-
- def convert_to_pyobject():
- """
- Converts the entire property group to a purely python form.
-
- @rtype: dict
- @return: A python dictionary representing the property group
- """
-
-class IDArray:
- """
- The IDArray Type
- ================
-
- @ivar type: returns the type of the array, can be either IDP_Int or IDP_Float
- """
-
- def __getitem__(index):
- pass
-
- def __setitem__(index, value):
- pass
-
- def __len__():
- pass
-
diff --git a/source/blender/python/doc/epy/Mathutils.py b/source/blender/python/doc/epy/Mathutils.py
deleted file mode 100644
index 17a227f729a..00000000000
--- a/source/blender/python/doc/epy/Mathutils.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# Blender.mathutils module and its subtypes
-
-
-
-class Vector:
- """
-
- @attention: Vector data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list = None):
- """
- Create a new 2d, 3d, or 4d Vector object from a list of floating point numbers.
- @note: that python uses higher precission floating point numbers, so values assigned to a vector may have some rounding error.
-
-
- Example::
- v = Vector(1,0,0)
- v = Vector(myVec)
- v = Vector(list)
- @type list: PyList of float or int
- @param list: The list of values for the Vector object. Can be a sequence or raw numbers.
- Must be 2, 3, or 4 values. The list is mapped to the parameters as [x,y,z,w].
- @rtype: Vector object.
- @return: It depends wheter a parameter was passed:
- - (list): Vector object initialized with the given values;
- - (): An empty 3 dimensional vector.
- """
-
-class Euler:
- """
- The Euler object
- ================
- This object gives access to Eulers in Blender.
- @note: You can access a euler object like a sequence
- - x = euler[0]
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @attention: Euler data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list = None):
- """
- Create a new euler object.
-
- Example::
- euler = Euler(45,0,0)
- euler = Euler(myEuler)
- euler = Euler(sequence)
- @type list: PyList of float/int
- @param list: 3d list to initialize euler
- @rtype: Euler object
- @return: Euler representing heading, pitch, bank.
- @note: Values are in degrees.
- """
-
-class Quaternion:
- """
- The Quaternion object
- =====================
- This object gives access to Quaternions in Blender.
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @note: Math can be performed on Quaternion classes
- - quat + quat
- - quat - quat
- - quat * float/int
- - quat * vec
- - quat * quat
- @note: You can access a quaternion object like a sequence
- - x = quat[0]
- @attention: Quaternion data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list, angle = None):
- """
- Create a new quaternion object from initialized values.
-
- Example::
- quat = Quaternion(1,2,3,4)
- quat = Quaternion(axis, angle)
- quat = Quaternion()
- quat = Quaternion(180, list)
-
- @type list: PyList of int/float
- @param list: A 3d or 4d list to initialize quaternion.
- 4d if intializing [w,x,y,z], 3d if used as an axis of rotation.
- @type angle: float (optional)
- @param angle: An arbitrary rotation amount around 'list'.
- List is used as an axis of rotation in this case.
- @rtype: New quaternion object.
- @return: It depends wheter a parameter was passed:
- - (list/angle): Quaternion object initialized with the given values;
- - (): An identity 4 dimensional quaternion.
- """
-
-class Matrix:
- """
- The Matrix Object
- =================
- @note: Math can be performed on Matrix classes
- - mat + mat
- - mat - mat
- - mat * float/int
- - mat * vec
- - mat * mat
- @note: Comparison operators can be done:
- - ==, != test numeric values within epsilon
- @note: You can access a quaternion object like a 2d sequence
- - x = matrix[0][1]
- - vector = matrix[2]
- @attention: Quaternion data can be wrapped or non-wrapped. When a object is wrapped it
- means that the object will give you direct access to the data inside of blender. Modification
- of this object will directly change the data inside of blender. To copy a wrapped object
- you need to use the object's constructor. If you copy and object by assignment you will not get
- a second copy but a second reference to the same data. Only certain functions will return
- wrapped data. This will be indicated in the method description.
- """
-
- def __init__(list1 = None, list2 = None, list3 = None, list4 = None):
- """
- Create a new matrix object from initialized values.
-
- Example::
- matrix = Matrix([1,1,1],[0,1,0],[1,0,0])
- matrix = Matrix(mat)
- matrix = Matrix(seq1, seq2, vector)
-
- @type list1: PyList of int/float
- @param list1: A 2d,3d or 4d list.
- @type list2: PyList of int/float
- @param list2: A 2d,3d or 4d list.
- @type list3: PyList of int/float
- @param list3: A 2d,3d or 4d list.
- @type list4: PyList of int/float
- @param list4: A 2d,3d or 4d list.
- @rtype: New matrix object.
- @return: It depends wheter a parameter was passed:
- - (list1, etc.): Matrix object initialized with the given values;
- - (): An empty 3 dimensional matrix.
- """
diff --git a/source/blender/python/doc/epy/testbgl.py b/source/blender/python/doc/epy/testbgl.py
deleted file mode 100644
index e895d01df69..00000000000
--- a/source/blender/python/doc/epy/testbgl.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Testing the BGL module
-
-import Blender
-from Blender.BGL import *
-from Blender import Draw
-
-R = G = B = 0
-A = 1
-
-instructions = "Hold mouse buttons to change the background color."
-quitting = " Press ESC or q to quit."
-
-def show_win():
- glClearColor(R,G,B,A) # define color used to clear buffers
- glClear(GL_COLOR_BUFFER_BIT) # use it to clear the color buffer
- glColor3f(1,1,1) # change default color
- glRasterPos2i(50,100) # move cursor to x = 50, y = 100
- Draw.Text("Testing BGL + Draw") # draw this text there
- glRasterPos2i(350,20) # move cursor again
- Draw.Text(instructions + quitting) # draw another msg
- glBegin(GL_LINE_LOOP) # begin a vertex-data list
- glVertex2i(46,92)
- glVertex2i(120,92)
- glVertex2i(120,115)
- glVertex2i(46,115)
- glEnd() # close this list
- glColor3f(0.35,0.18,0.92) # change default color again
- glBegin(GL_POLYGON) # another list, for a polygon
- glVertex2i(315, 292)
- glVertex2i(412, 200)
- glVertex2i(264, 256)
- glEnd()
- Draw.Redraw(1) # make changes visible.
-
-def ev(evt, val): # this is a callback for Draw.Register()
- global R,G,B,A # it handles input events
- if evt == Draw.ESCKEY or evt == Draw.QKEY:
- Draw.Exit() # this quits the script
- elif evt == Draw.LEFTMOUSE: R = 1 - R
- elif evt == Draw.MIDDLEMOUSE: G = 1 - G
- elif evt == Draw.RIGHTMOUSE: B = 1 - B
- else:
- Draw.Register(show_win, ev, None)
-
-Draw.Register(show_win, ev, None) # start the main loop
diff --git a/source/blender/python/doc/examples/bpy.data.py b/source/blender/python/doc/examples/bpy.data.py
deleted file mode 100644
index fc1145a523f..00000000000
--- a/source/blender/python/doc/examples/bpy.data.py
+++ /dev/null
@@ -1,29 +0,0 @@
-import bpy
-
-
-# print all objects
-for obj in bpy.data.objects:
- print(obj.name)
-
-
-# print all scene names in a list
-print(bpy.data.scenes.keys())
-
-
-# remove mesh Cube
-if "Cube" in bpy.data.meshes:
- mesh = bpy.data.meshes["Cube"]
- print("removing mesh", mesh)
- bpy.data.meshes.unlink(mesh)
-
-
-# write images into a file next to the blend
-import os
-file = open(os.path.splitext(bpy.data.filepath)[0] + ".txt", 'w')
-
-for image in bpy.data.images:
- file.write("%s %dx%d\n" % (image.filepath, image.size[0], image.size[1]))
-
-file.close()
-
-
diff --git a/source/blender/python/doc/examples/mathutils.Euler.py b/source/blender/python/doc/examples/mathutils.Euler.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Euler.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Matrix.py b/source/blender/python/doc/examples/mathutils.Matrix.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Matrix.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Quaternion.py b/source/blender/python/doc/examples/mathutils.Quaternion.py
deleted file mode 100644
index bc7702c1d53..00000000000
--- a/source/blender/python/doc/examples/mathutils.Quaternion.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import mathutils
-
-# todo
diff --git a/source/blender/python/doc/examples/mathutils.Vector.py b/source/blender/python/doc/examples/mathutils.Vector.py
deleted file mode 100644
index fb00e8aead6..00000000000
--- a/source/blender/python/doc/examples/mathutils.Vector.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import mathutils
-
-# zero length vector
-vec = mathutils.Vector((0, 0, 1))
-
-# unit length vector
-vec_a = vec.copy().normalize()
-
-vec_b = mathutils.Vector((0, 1, 2))
-
-vec2d = mathutils.Vector((1, 2))
-vec3d = mathutils.Vector((1, 0, 0))
-vec4d = vec_a.copy().resize4D()
-
-# other mathutuls types
-quat = mathutils.Quaternion()
-matrix = mathutils.Matrix()
-
-# Comparison operators can be done on Vector classes:
-
-# greater and less then test vector length.
-vec_a > vec_b
-vec_a >= vec_b
-vec_a < vec_b
-vec_a <= vec_b
-
-# ==, != test vector values e.g. 1,2,3 != 3,2,1 even if they are the same length
-vec_a == vec_b
-vec_a != vec_b
-
-
-# Math can be performed on Vector classes
-vec_a + vec_b
-vec_a - vec_b
-vec_a * vec_b
-vec_a * 10.0
-vec_a * matrix
-vec_a * vec_b
-vec_a * quat
--vec_a
-
-
-# You can access a vector object like a sequence
-x = vec_a[0]
-len(vec)
-vec_a[:] = vec_b
-vec2d[:] = vec3d[:2]
-
-
-# Vectors support 'swizzle' operations
-# See http://en.wikipedia.org/wiki/Swizzling_(computer_graphics)
-vec.xyz = vec.zyx
-vec.xy = vec4d.zw
-vec.xyz = vec4d.wzz
-vec4d.wxyz = vec.yxyx
diff --git a/source/blender/python/doc/examples/mathutils.py b/source/blender/python/doc/examples/mathutils.py
deleted file mode 100644
index 02f69515f21..00000000000
--- a/source/blender/python/doc/examples/mathutils.py
+++ /dev/null
@@ -1,18 +0,0 @@
-import mathutils
-from math import radians
-
-vec = mathutils.Vector((1.0, 2.0, 3.0))
-
-mat_rot = mathutils.Matrix.Rotation(radians(90), 4, 'X')
-mat_trans = mathutils.Matrix.Translation(vec)
-
-mat = mat_trans * mat_rot
-mat.invert()
-
-mat3 = mat.rotation_part()
-quat1 = mat.to_quat()
-quat2 = mat3.to_quat()
-
-angle = quat1.difference(quat2)
-
-print(angle)
diff --git a/source/blender/python/doc/sphinx_doc_gen.py b/source/blender/python/doc/sphinx_doc_gen.py
deleted file mode 100644
index 6cc5049d29b..00000000000
--- a/source/blender/python/doc/sphinx_doc_gen.py
+++ /dev/null
@@ -1,862 +0,0 @@
- # ***** 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.
- #
- # Contributor(s): Campbell Barton
- #
- # #**** END GPL LICENSE BLOCK #****
-
-script_help_msg = '''
-Usage,
-run this script from blenders root path once you have compiled blender
- ./blender.bin -b -P /b/source/blender/python/doc/sphinx_doc_gen.py
-
-This will generate python files in "./source/blender/python/doc/sphinx-in"
-Generate html docs by running...
-
- sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-
-
-For PDF generation
-
- sphinx-build -b latex source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
- cd source/blender/python/doc/sphinx-out
- make
-'''
-
-# import rpdb2; rpdb2.start_embedded_debugger('test')
-
-import os
-import inspect
-import bpy
-import rna_info
-reload(rna_info)
-
-# lame, python wont give some access
-ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
-MethodDescriptorType = type(dict.get)
-GetSetDescriptorType = type(int.real)
-
-EXAMPLE_SET = set()
-EXAMPLE_SET_USED = set()
-
-_BPY_STRUCT_FAKE = "bpy_struct"
-_BPY_FULL_REBUILD = False
-
-def undocumented_message(module_name, type_name, identifier):
- message = "Undocumented (`contribute " \
- "<http://wiki.blender.org/index.php/Dev:2.5/Py/API/Documentation/Contribute" \
- "?action=edit&section=new&preload=Dev:2.5/Py/API/Documentation/Contribute/Howto-message" \
- "&preloadtitle=%s.%s.%s>`_)\n\n" % (module_name, type_name, identifier)
- return message
-
-
-def range_str(val):
- '''
- Converts values to strings for the range directive.
- (unused function it seems)
- '''
- if val < -10000000: return '-inf'
- if val > 10000000: return 'inf'
- if type(val)==float:
- return '%g' % val
- else:
- return str(val)
-
-
-def write_example_ref(ident, fw, example_id, ext="py"):
- if example_id in EXAMPLE_SET:
- fw("%s.. literalinclude:: ../examples/%s.%s\n\n" % (ident, example_id, ext))
- EXAMPLE_SET_USED.add(example_id)
- else:
- if bpy.app.debug:
- print("\tskipping example:", example_id)
-
-
-def write_indented_lines(ident, fn, text, strip=True):
- '''
- Apply same indentation to all lines in a multilines text.
- '''
- if text is None:
- return
- for l in text.split("\n"):
- if strip:
- fn(ident + l.strip() + "\n")
- else:
- fn(ident + l + "\n")
-
-
-def pymethod2sphinx(ident, fw, identifier, py_func):
- '''
- class method to sphinx
- '''
- arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
- if arg_str.startswith("(self, "):
- arg_str = "(" + arg_str[7:]
- func_type = "method"
- elif arg_str.startswith("(cls, "):
- arg_str = "(" + arg_str[6:]
- func_type = "classmethod"
- else:
- func_type = "staticmethod"
-
- fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
- if py_func.__doc__:
- write_indented_lines(ident + " ", fw, py_func.__doc__)
- fw("\n")
-
-
-def pyfunc2sphinx(ident, fw, identifier, py_func, is_class=True):
- '''
- function or class method to sphinx
- '''
- arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
-
- if not is_class:
- func_type = "function"
-
- # ther rest are class methods
- elif arg_str.startswith("(self, "):
- arg_str = "(" + arg_str[7:]
- func_type = "method"
- elif arg_str.startswith("(cls, "):
- arg_str = "(" + arg_str[6:]
- func_type = "classmethod"
- else:
- func_type = "staticmethod"
-
- fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
- if py_func.__doc__:
- write_indented_lines(ident + " ", fw, py_func.__doc__.strip())
- fw("\n")
-
-
-def py_descr2sphinx(ident, fw, descr, module_name, type_name, identifier):
- if identifier.startswith("_"):
- return
-
- doc = descr.__doc__
- if not doc:
- doc = undocumented_message(module_name, type_name, identifier)
-
- if type(descr) == GetSetDescriptorType:
- fw(ident + ".. attribute:: %s\n\n" % identifier)
- write_indented_lines(ident + " ", fw, doc, False)
- elif type(descr) in (MethodDescriptorType, ClassMethodDescriptorType):
- write_indented_lines(ident, fw, doc, False)
- else:
- raise TypeError("type was not GetSetDescriptorType, MethodDescriptorType or ClassMethodDescriptorType")
-
- write_example_ref(ident, fw, module_name + "." + type_name + "." + identifier)
- fw("\n")
-
-
-def py_c_func2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_class=True):
- '''
- c defined function to sphinx.
- '''
-
- # dump the docstring, assume its formatted correctly
- if py_func.__doc__:
- write_indented_lines(ident, fw, py_func.__doc__, False)
- fw("\n")
- else:
- fw(ident + ".. function:: %s()\n\n" % identifier)
- fw(ident + " " + undocumented_message(module_name, type_name, identifier))
-
-
-def pyprop2sphinx(ident, fw, identifier, py_prop):
- '''
- python property to sphinx
- '''
- # readonly properties use "data" directive, variables use "attribute" directive
- if py_prop.fset is None:
- fw(ident + ".. data:: %s\n\n" % identifier)
- else:
- fw(ident + ".. attribute:: %s\n\n" % identifier)
- write_indented_lines(ident + " ", fw, py_prop.__doc__)
- if py_prop.fset is None:
- fw(ident + " (readonly)\n\n")
-
-
-def pymodule2sphinx(BASEPATH, module_name, module, title):
- import types
- attribute_set = set()
- filepath = os.path.join(BASEPATH, module_name + ".rst")
-
- file = open(filepath, "w")
-
- fw = file.write
-
- fw(title + "\n")
- fw(("=" * len(title)) + "\n\n")
-
- fw(".. module:: %s\n\n" % module_name)
-
- if module.__doc__:
- # Note, may contain sphinx syntax, dont mangle!
- fw(module.__doc__.strip())
- fw("\n\n")
-
- write_example_ref("", fw, module_name)
-
- # write members of the module
- # only tested with PyStructs which are not exactly modules
- for key, descr in sorted(type(module).__dict__.items()):
- if type(descr) == types.MemberDescriptorType:
- if descr.__doc__:
- fw(".. data:: %s\n\n" % key)
- write_indented_lines(" ", fw, descr.__doc__, False)
- attribute_set.add(key)
- fw("\n")
- del key, descr
-
- classes = []
-
- for attribute in sorted(dir(module)):
- if not attribute.startswith("_"):
-
- if attribute in attribute_set:
- continue
-
- if attribute.startswith("n_"): # annoying exception, needed for bpy.app
- continue
-
- value = getattr(module, attribute)
-
- value_type = type(value)
-
- if value_type == types.FunctionType:
- pyfunc2sphinx("", fw, attribute, value, is_class=False)
- elif value_type in (types.BuiltinMethodType, types.BuiltinFunctionType): # both the same at the moment but to be future proof
- # note: can't get args from these, so dump the string as is
- # this means any module used like this must have fully formatted docstrings.
- py_c_func2sphinx("", fw, module_name, module, attribute, value, is_class=False)
- elif value_type == type:
- classes.append((attribute, value))
- elif value_type in (bool, int, float, str, tuple):
- # constant, not much fun we can do here except to list it.
- # TODO, figure out some way to document these!
- fw(".. data:: %s\n\n" % attribute)
- write_indented_lines(" ", fw, "constant value %s" % repr(value), False)
- fw("\n")
- else:
- print("\tnot documenting %s.%s" % (module_name, attribute))
- continue
-
- attribute_set.add(attribute)
- # TODO, more types...
-
- # write collected classes now
- for (type_name, value) in classes:
- # May need to be its own function
- fw(".. class:: %s\n\n" % type_name)
- if value.__doc__:
- write_indented_lines(" ", fw, value.__doc__, False)
- fw("\n")
- write_example_ref(" ", fw, module_name + "." + type_name)
-
- descr_items = [(key, descr) for key, descr in sorted(value.__dict__.items()) if not key.startswith("__")]
-
- for key, descr in descr_items:
- if type(descr) == ClassMethodDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
-
- fw("\n\n")
-
- file.close()
-
-
-
-def rna2sphinx(BASEPATH):
-
- structs, funcs, ops, props = rna_info.BuildRNAInfo()
-
- try:
- os.mkdir(BASEPATH)
- except:
- pass
-
- # conf.py - empty for now
- filepath = os.path.join(BASEPATH, "conf.py")
- file = open(filepath, "w")
- fw = file.write
-
-
- version_string = bpy.app.version_string.split("(")[0]
- if bpy.app.build_revision != "Unknown":
- version_string = version_string + " r" + bpy.app.build_revision
-
- # for use with files
- version_string_fp = "_".join(str(v) for v in bpy.app.version)
-
- fw("project = 'Blender'\n")
- # fw("master_doc = 'index'\n")
- fw("copyright = u'Blender Foundation'\n")
- fw("version = '%s - UNSTABLE API'\n" % version_string)
- fw("release = '%s - UNSTABLE API'\n" % version_string)
- fw("html_theme = 'blender-org'\n")
- fw("html_theme_path = ['../']\n")
- fw("html_favicon = 'favicon.ico'\n")
- # not helpful since the source us generated, adds to upload size.
- fw("html_copy_source = False\n")
- fw("\n")
- # needed for latex, pdf gen
- fw("latex_documents = [ ('contents', 'contents.tex', 'Blender Index', 'Blender Foundation', 'manual'), ]\n")
- fw("latex_paper_size = 'a4paper'\n")
- file.close()
-
-
- filepath = os.path.join(BASEPATH, "contents.rst")
- file = open(filepath, "w")
- fw = file.write
-
- fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
- fw(" Blender Documentation contents\n")
- fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
- fw("\n")
- fw("This document is an API reference for Blender %s. built %s.\n" % (version_string, bpy.app.build_date))
- fw("\n")
- fw("An introduction to Blender and Python can be found at <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>\n")
- fw("\n")
- fw("`A PDF version of this document is also available <blender_python_reference_%s.pdf>`__\n" % version_string_fp)
- fw("\n")
- fw(".. warning:: The Python API in Blender is **UNSTABLE**, It should only be used for testing, any script written now may break in future releases.\n")
- fw(" \n")
- fw(" The following areas are subject to change.\n")
- fw(" * operator names and arguments\n")
- fw(" * render api\n")
- fw(" * function calls with the data api (any function calls with values accessed from bpy.data), including functions for importing and exporting meshes\n")
- fw(" * class registration (Operator, Panels, Menus, Headers)\n")
- fw(" * modules: bpy.props, blf)\n")
- fw(" * members in the bpy.context have to be reviewed\n")
- fw(" * python defined modal operators, especially drawing callbacks are highly experemental\n")
- fw(" \n")
- fw(" These parts of the API are relatively stable and are unlikely to change significantly\n")
- fw(" * data API, access to attributes of blender data such as mesh verts, material color, timeline frames and scene objects\n")
- fw(" * user interface functions for defining buttons, creation of menus, headers, panels\n")
- fw(" * modules: bgl, mathutils and geometry\n")
- fw(" * game engine modules\n")
- fw("\n")
-
- fw("===================\n")
- fw("Application Modules\n")
- fw("===================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
- fw(" bpy.data.rst\n\n") # note: not actually a module
- fw(" bpy.ops.rst\n\n")
- fw(" bpy.types.rst\n\n")
-
- # py modules
- fw(" bpy.utils.rst\n\n")
- fw(" bpy.path.rst\n\n")
- fw(" bpy.app.rst\n\n")
-
- # C modules
- fw(" bpy.props.rst\n\n")
-
- fw("==================\n")
- fw("Standalone Modules\n")
- fw("==================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
-
-
- fw(" mathutils.rst\n\n")
- fw(" blf.rst\n\n")
- fw(" aud.rst\n\n")
-
- # game engine
- fw("===================\n")
- fw("Game Engine Modules\n")
- fw("===================\n")
- fw("\n")
- fw(".. toctree::\n")
- fw(" :maxdepth: 1\n\n")
- fw(" bge.types.rst\n\n")
- fw(" bge.logic.rst\n\n")
- fw(" bge.render.rst\n\n")
- fw(" bge.events.rst\n\n")
-
- file.close()
-
-
- # internal modules
- filepath = os.path.join(BASEPATH, "bpy.ops.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Operators (bpy.ops)\n")
- fw("===================\n\n")
- fw(".. toctree::\n")
- fw(" :glob:\n\n")
- fw(" bpy.ops.*\n\n")
- file.close()
-
- filepath = os.path.join(BASEPATH, "bpy.types.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Types (bpy.types)\n")
- fw("=================\n\n")
- fw(".. toctree::\n")
- fw(" :glob:\n\n")
- fw(" bpy.types.*\n\n")
- file.close()
-
-
- # not actually a module, only write this file so we
- # can reference in the TOC
- filepath = os.path.join(BASEPATH, "bpy.data.rst")
- file = open(filepath, "w")
- fw = file.write
- fw("Data Access (bpy.data)\n")
- fw("======================\n\n")
- fw(".. module:: bpy\n")
- fw("\n")
- fw("This module is used for all blender/python access.\n")
- fw("\n")
- fw(".. literalinclude:: ../examples/bpy.data.py\n")
- fw("\n")
- fw(".. data:: data\n")
- fw("\n")
- fw(" Access to blenders internal data\n")
- fw("\n")
- fw(" :type: :class:`bpy.types.BlendData`\n")
- file.close()
-
- EXAMPLE_SET_USED.add("bpy.data")
-
-
- # python modules
- from bpy import utils as module
- pymodule2sphinx(BASEPATH, "bpy.utils", module, "Utilities (bpy.utils)")
-
- from bpy import path as module
- pymodule2sphinx(BASEPATH, "bpy.path", module, "Path Utilities (bpy.path)")
-
- # C modules
- from bpy import app as module
- pymodule2sphinx(BASEPATH, "bpy.app", module, "Application Data (bpy.app)")
-
- from bpy import props as module
- pymodule2sphinx(BASEPATH, "bpy.props", module, "Property Definitions (bpy.props)")
-
- import mathutils as module
- pymodule2sphinx(BASEPATH, "mathutils", module, "Math Types & Utilities (mathutils)")
- del module
-
- import blf as module
- pymodule2sphinx(BASEPATH, "blf", module, "Font Drawing (blf)")
- del module
-
- import aud as module
- pymodule2sphinx(BASEPATH, "aud", module, "Audio System (aud)")
- del module
-
- # game engine
- import shutil
- # copy2 keeps time/date stamps
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.types.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.logic.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.render.rst"), BASEPATH)
- shutil.copy2(os.path.join(BASEPATH, "../../../../gameengine/PyDoc/bge.events.rst"), BASEPATH)
-
-
- if 0:
- filepath = os.path.join(BASEPATH, "bpy.rst")
- file = open(filepath, "w")
- fw = file.write
-
- fw("\n")
-
- title = ":mod:`bpy` --- Blender Python Module"
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
- fw(".. module:: bpy.types\n\n")
- file.close()
-
- def write_param(ident, fw, prop, is_return=False):
- if is_return:
- id_name = "return"
- id_type = "rtype"
- kwargs = {"as_ret": True, "class_fmt": ":class:`%s`"}
- identifier = ""
- else:
- id_name = "arg"
- id_type = "type"
- kwargs = {"as_arg": True, "class_fmt": ":class:`%s`"}
- identifier = " %s" % prop.identifier
-
- type_descr = prop.get_type_description(**kwargs)
- if prop.name or prop.description:
- fw(ident + ":%s%s: %s\n" % (id_name, identifier, ", ".join([val for val in (prop.name, prop.description) if val])))
- fw(ident + ":%s%s: %s\n" % (id_type, identifier, type_descr))
-
- def write_struct(struct):
- #if not struct.identifier.startswith("Sc") and not struct.identifier.startswith("I"):
- # return
-
- #if not struct.identifier == "Object":
- # return
-
- filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier)
- file = open(filepath, "w")
- fw = file.write
-
- base_id = getattr(struct.base, "identifier", "")
-
- if _BPY_STRUCT_FAKE:
- if not base_id:
- base_id = _BPY_STRUCT_FAKE
-
- if base_id:
- title = "%s(%s)" % (struct.identifier, base_id)
- else:
- title = struct.identifier
-
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
-
- fw(".. module:: bpy.types\n\n")
-
- base_ids = [base.identifier for base in struct.get_bases()]
-
- if _BPY_STRUCT_FAKE:
- base_ids.append(_BPY_STRUCT_FAKE)
-
- base_ids.reverse()
-
- if base_ids:
- if len(base_ids) > 1:
- fw("base classes --- ")
- else:
- fw("base class --- ")
-
- fw(", ".join([(":class:`%s`" % base_id) for base_id in base_ids]))
- fw("\n\n")
-
- subclass_ids = [s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier)]
- if subclass_ids:
- fw("subclasses --- \n" + ", ".join([(":class:`%s`" % s) for s in subclass_ids]) + "\n\n")
-
- base_id = getattr(struct.base, "identifier", "")
-
- if _BPY_STRUCT_FAKE:
- if not base_id:
- base_id = _BPY_STRUCT_FAKE
-
- if base_id:
- fw(".. class:: %s(%s)\n\n" % (struct.identifier, base_id))
- else:
- fw(".. class:: %s\n\n" % struct.identifier)
-
- fw(" %s\n\n" % struct.description)
-
- # properties sorted in alphabetical order
- sorted_struct_properties = struct.properties[:]
- sorted_struct_properties.sort(key=lambda prop: prop.identifier)
-
- for prop in sorted_struct_properties:
- type_descr = prop.get_type_description(class_fmt=":class:`%s`")
- # readonly properties use "data" directive, variables properties use "attribute" directive
- if 'readonly' in type_descr:
- fw(" .. data:: %s\n\n" % prop.identifier)
- else:
- fw(" .. attribute:: %s\n\n" % prop.identifier)
- if prop.description:
- fw(" %s\n\n" % prop.description)
- fw(" :type: %s\n\n" % type_descr)
-
- # python attributes
- py_properties = struct.get_py_properties()
- py_prop = None
- for identifier, py_prop in py_properties:
- pyprop2sphinx(" ", fw, identifier, py_prop)
- del py_properties, py_prop
-
- for func in struct.functions:
- args_str = ", ".join([prop.get_arg_default(force=False) for prop in func.args])
-
- fw(" .. %s:: %s(%s)\n\n" % ("classmethod" if func.is_classmethod else "method", func.identifier, args_str))
- fw(" %s\n\n" % func.description)
-
- for prop in func.args:
- write_param(" ", fw, prop)
-
- if len(func.return_values) == 1:
- write_param(" ", fw, func.return_values[0], is_return=True)
- elif func.return_values: # multiple return values
- fw(" :return (%s):\n" % ", ".join([prop.identifier for prop in func.return_values]))
- for prop in func.return_values:
- type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`")
- descr = prop.description
- if not descr:
- descr = prop.name
- fw(" `%s`, %s, %s\n\n" % (prop.identifier, descr, type_descr))
-
- fw("\n")
-
-
- # python methods
- py_funcs = struct.get_py_functions()
- py_func = None
-
- for identifier, py_func in py_funcs:
- pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True)
- del py_funcs, py_func
-
- lines = []
-
- if struct.base or _BPY_STRUCT_FAKE:
- bases = list(reversed(struct.get_bases()))
-
- # props
- lines[:] = []
-
- if _BPY_STRUCT_FAKE:
- descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")]
-
- if _BPY_STRUCT_FAKE:
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- lines.append("* :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key))
-
- for base in bases:
- for prop in base.properties:
- lines.append("* :class:`%s.%s`\n" % (base.identifier, prop.identifier))
-
- for identifier, py_prop in base.get_py_properties():
- lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier))
-
- for identifier, py_prop in base.get_py_properties():
- lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier))
-
- if lines:
- fw(".. rubric:: Inherited Properties\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for line in lines:
- fw(line)
- fw("\n")
-
-
- # funcs
- lines[:] = []
-
- if _BPY_STRUCT_FAKE:
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType:
- lines.append("* :class:`%s.%s`\n" % (_BPY_STRUCT_FAKE, key))
-
- for base in bases:
- for func in base.functions:
- lines.append("* :class:`%s.%s`\n" % (base.identifier, func.identifier))
- for identifier, py_func in base.get_py_functions():
- lines.append("* :class:`%s.%s`\n" % (base.identifier, identifier))
-
- if lines:
- fw(".. rubric:: Inherited Functions\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for line in lines:
- fw(line)
- fw("\n")
-
- lines[:] = []
-
-
- if struct.references:
- # use this otherwise it gets in the index for a normal heading.
- fw(".. rubric:: References\n\n")
-
- fw(".. hlist::\n")
- fw(" :columns: 2\n\n")
-
- for ref in struct.references:
- ref_split = ref.split(".")
- if len(ref_split) > 2:
- ref = ref_split[-2] + "." + ref_split[-1]
- fw("* :class:`%s`\n" % ref)
- fw("\n")
-
-
- for struct in structs.values():
- # TODO, rna_info should filter these out!
- if "_OT_" in struct.identifier:
- continue
- write_struct(struct)
-
- # special case, bpy_struct
- if _BPY_STRUCT_FAKE:
- filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % _BPY_STRUCT_FAKE)
- file = open(filepath, "w")
- fw = file.write
-
- fw("%s\n" % _BPY_STRUCT_FAKE)
- fw("=" * len(_BPY_STRUCT_FAKE) + "\n")
- fw("\n")
- fw(".. module:: bpy.types\n")
- fw("\n")
-
- subclass_ids = [s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier)]
- if subclass_ids:
- fw("subclasses --- \n" + ", ".join([(":class:`%s`" % s) for s in sorted(subclass_ids)]) + "\n\n")
-
- fw(".. class:: %s\n\n" % _BPY_STRUCT_FAKE)
- fw(" built-in base class for all classes in bpy.types.\n\n")
- fw(" .. note::\n\n")
- fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % _BPY_STRUCT_FAKE)
-
- descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")]
-
- for key, descr in descr_items:
- if type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
-
- for key, descr in descr_items:
- if type(descr) == GetSetDescriptorType:
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
-
-
- # operators
- def write_ops():
- API_BASEURL='https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts'
- fw = None
- last_mod = ''
-
- for op_key in sorted(ops.keys()):
- op = ops[op_key]
-
- if last_mod != op.module_name:
- filepath = os.path.join(BASEPATH, "bpy.ops.%s.rst" % op.module_name)
- file = open(filepath, "w")
- fw = file.write
-
- title = "%s Operators" % (op.module_name[0].upper() + op.module_name[1:])
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
-
- fw(".. module:: bpy.ops.%s\n\n" % op.module_name)
- last_mod = op.module_name
-
- args_str = ", ".join([prop.get_arg_default(force=True) for prop in op.args])
- fw(".. function:: %s(%s)\n\n" % (op.func_name, args_str))
-
- # if the description isn't valid, we output the standard warning
- # with a link to the wiki so that people can help
- if not op.description or op.description == "(undocumented operator)":
- operator_description = undocumented_message('bpy.ops',op.module_name,op.func_name)
- else:
- operator_description = op.description
-
- fw(" %s\n\n" % operator_description)
- for prop in op.args:
- write_param(" ", fw, prop)
- if op.args:
- fw("\n")
-
- location = op.get_location()
- if location != (None, None):
- fw(" :file: `%s <%s/%s>`_:%d\n\n" % (location[0],API_BASEURL,location[0],location[1]))
-
- write_ops()
-
- file.close()
-
-def main():
- import bpy
- if 'bpy' not in dir():
- print("\nError, this script must run from inside blender2.5")
- print(script_help_msg)
- else:
- import shutil
-
- path_in = 'source/blender/python/doc/sphinx-in'
- path_out = 'source/blender/python/doc/sphinx-out'
- path_examples = 'source/blender/python/doc/examples'
- # only for partial updates
- path_in_tmp = path_in + "-tmp"
-
- if not os.path.exists(path_in):
- os.mkdir(path_in)
-
- for f in os.listdir(path_examples):
- if f.endswith(".py"):
- EXAMPLE_SET.add(os.path.splitext(f)[0])
-
-
- # only for full updates
- if _BPY_FULL_REBUILD:
- shutil.rmtree(path_in, True)
- shutil.rmtree(path_out, True)
- else:
- # write here, then move
- shutil.rmtree(path_in_tmp, True)
-
- rna2sphinx(path_in_tmp)
-
- if not _BPY_FULL_REBUILD:
- import filecmp
-
- # now move changed files from 'path_in_tmp' --> 'path_in'
- file_list_path_in = set(os.listdir(path_in))
- file_list_path_in_tmp = set(os.listdir(path_in_tmp))
-
- # remove deprecated files that have been removed.
- for f in sorted(file_list_path_in):
- if f not in file_list_path_in_tmp:
- print("\tdeprecated: %s" % f)
- os.remove(os.path.join(path_in, f))
-
- # freshen with new files.
- for f in sorted(file_list_path_in_tmp):
- f_from = os.path.join(path_in_tmp, f)
- f_to = os.path.join(path_in, f)
-
- do_copy = True
- if f in file_list_path_in:
- if filecmp.cmp(f_from, f_to):
- do_copy = False
-
- if do_copy:
- print("\tupdating: %s" % f)
- shutil.copy(f_from, f_to)
- '''else:
- print("\tkeeping: %s" % f) # eh, not that useful'''
-
-
- EXAMPLE_SET_UNUSED = EXAMPLE_SET - EXAMPLE_SET_USED
- if EXAMPLE_SET_UNUSED:
- print("\nUnused examples found in '%s'..." % path_examples)
- for f in EXAMPLE_SET_UNUSED:
- print(" %s.py" % f)
- print(" %d total\n" % len(EXAMPLE_SET_UNUSED))
-
- import sys
- sys.exit()
-
-if __name__ == '__main__':
- main()
diff --git a/source/blender/python/doc/sphinx_doc_gen.sh b/source/blender/python/doc/sphinx_doc_gen.sh
deleted file mode 100755
index 989424ba7eb..00000000000
--- a/source/blender/python/doc/sphinx_doc_gen.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-# run from the blender source dir
-# bash source/blender/python/doc/sphinx_doc_gen.sh
-# ssh upload means you need an account on the server
-
-BLENDER="./blender.bin"
-SSH_HOST="ideasman42@emo.blender.org"
-SSH_UPLOAD="/data/www/vhosts/www.blender.org/documentation" # blender_python_api_VERSION, added after
-
-# sed string from hell, 'Blender 2.53 (sub 1) Build' --> '2_53_1'
-# "_".join(str(v) for v in bpy.app.version)
-BLENDER_VERSION=`$BLENDER --version | cut -f2-4 -d" " | sed 's/(//g' | sed 's/)//g' | sed 's/ sub /./g' | sed 's/\./_/g'`
-SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION
-
-# dont delete existing docs, now partial updates are used for quick builds.
-$BLENDER --background --python ./source/blender/python/doc/sphinx_doc_gen.py
-
-# html
-sphinx-build source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-cp source/blender/python/doc/sphinx-out/contents.html source/blender/python/doc/sphinx-out/index.html
-ssh ideasman42@emo.blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*'
-rsync --progress -avze "ssh -p 22" /b/source/blender/python/doc/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/
-
-# pdf
-sphinx-build -b latex source/blender/python/doc/sphinx-in source/blender/python/doc/sphinx-out
-cd source/blender/python/doc/sphinx-out
-make
-cd ../../../../../
-rsync --progress -avze "ssh -p 22" source/blender/python/doc/sphinx-out/contents.pdf $SSH_HOST:$SSH_UPLOAD_FULL/blender_python_reference_$BLENDER_VERSION.pdf
diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt
index 1a91abfbec8..0ea478adbf6 100644
--- a/source/blender/python/generic/CMakeLists.txt
+++ b/source/blender/python/generic/CMakeLists.txt
@@ -18,17 +18,46 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.c)
-
-SET(INC
+set(INC
.
../../blenlib
../../makesdna
../../blenkernel
- ../../editors/include
+ ../../blenloader
../../../../intern/guardedalloc
../../../../extern/glew/include
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
)
-BLENDERLIB(bf_python_ext "${SRC}" "${INC}")
+set(SRC
+ IDProp.c
+ bgl.c
+ blf_py_api.c
+ bpy_internal_import.c
+ mathutils.c
+ mathutils_Color.c
+ mathutils_Euler.c
+ mathutils_Matrix.c
+ mathutils_Quaternion.c
+ mathutils_Vector.c
+ mathutils_geometry.c
+ noise_py_api.c
+ py_capi_utils.c
+
+ IDProp.h
+ bgl.h
+ blf_py_api.h
+ bpy_internal_import.h
+ mathutils.h
+ mathutils_Color.h
+ mathutils_Euler.h
+ mathutils_Matrix.h
+ mathutils_Quaternion.h
+ mathutils_Vector.h
+ mathutils_geometry.h
+ noise_py_api.h
+ py_capi_utils.h
+)
+
+
+blender_add_lib(bf_python_ext "${SRC}" "${INC}")
diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c
index 73e60a384a3..a83359c31f7 100644
--- a/source/blender/python/generic/IDProp.c
+++ b/source/blender/python/generic/IDProp.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,10 +23,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "BKE_idprop.h"
+#include <Python.h>
+
#include "IDProp.h"
#include "MEM_guardedalloc.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_idprop.h"
+
+
#define USE_STRING_COERCE
#ifdef USE_STRING_COERCE
@@ -34,7 +41,7 @@
#endif
PyObject * PyC_UnicodeFromByte(const char *str);
-const char * PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
/*** Function to wrap ID properties ***/
PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent);
@@ -44,7 +51,7 @@ extern PyTypeObject IDGroup_Iter_Type;
/*********************** ID Property Main Wrapper Stuff ***************/
-PyObject *IDGroup_repr( BPy_IDProperty *self )
+static PyObject *IDGroup_repr( BPy_IDProperty *self )
{
return PyUnicode_FromFormat( "<bpy ID property from \"%s\">", self->id->name);
}
@@ -58,7 +65,7 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
#ifdef USE_STRING_COERCE
return PyC_UnicodeFromByte(prop->data.pointer);
#else
- return PyUnicode_FromString( prop->data.pointer );
+ return PyUnicode_FromString(prop->data.pointer);
#endif
case IDP_INT:
return PyLong_FromLong( (long)prop->data.val );
@@ -88,7 +95,7 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -108,7 +115,8 @@ PyObject *BPy_IDGroup_WrapData( ID *id, IDProperty *prop )
Py_RETURN_NONE;
}
-int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
+#if 0 /* UNUSED, currenly assignment overwrites into new properties, rather then setting in-place */
+static int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
{
switch (prop->type) {
case IDP_STRING:
@@ -123,10 +131,10 @@ int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
int alloc_len;
PyObject *value_coerce= NULL;
- st= (char *)PuC_UnicodeAsByte(value, &value_coerce);
+ st= (char *)PyC_UnicodeAsByte(value, &value_coerce);
alloc_len= strlen(st) + 1;
- st = _PyUnicode_AsString(value);
+ st = _PyUnicode_AsString(value);
IDP_ResizeArray(prop, alloc_len);
memcpy(prop->data.pointer, st, alloc_len);
Py_XDECREF(value_coerce);
@@ -176,13 +184,14 @@ int BPy_IDGroup_SetData(BPy_IDProperty *self, IDProperty *prop, PyObject *value)
}
return 0;
}
+#endif
-PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *bleh)
+static PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *UNUSED(closure))
{
return PyUnicode_FromString(self->prop->name);
}
-static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh)
+static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUSED(closure))
{
char *st;
if (!PyUnicode_Check(value)) {
@@ -191,12 +200,12 @@ static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *bleh
}
st = _PyUnicode_AsString(value);
- if (strlen(st) >= MAX_IDPROP_NAME) {
+ if (BLI_strnlen(st, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
PyErr_SetString(PyExc_TypeError, "string length cannot exceed 31 characters!");
return -1;
}
- strcpy(self->prop->name, st);
+ BLI_strncpy(self->prop->name, st, sizeof(self->prop->name));
return 0;
}
@@ -208,17 +217,14 @@ static PyObject *BPy_IDGroup_GetType(BPy_IDProperty *self)
#endif
static PyGetSetDef BPy_IDGroup_getseters[] = {
- {"name",
- (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName,
- "The name of this Group.",
- NULL},
+ {(char *)"name", (getter)BPy_IDGroup_GetName, (setter)BPy_IDGroup_SetName, (char *)"The name of this Group.", NULL},
{NULL, NULL, NULL, NULL, NULL}
};
static Py_ssize_t BPy_IDGroup_Map_Len(BPy_IDProperty *self)
{
if (self->prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "len() of unsized object");
+ PyErr_SetString(PyExc_TypeError, "len() of unsized object");
return -1;
}
@@ -231,21 +237,21 @@ static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
char *name;
if (self->prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "unsubscriptable object");
+ PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
return NULL;
}
name= _PyUnicode_AsString(item);
if (name == NULL) {
- PyErr_SetString( PyExc_TypeError, "only strings are allowed as keys of ID properties");
+ PyErr_SetString(PyExc_TypeError, "only strings are allowed as keys of ID properties");
return NULL;
}
idprop= IDP_GetPropertyFromGroup(self->prop, name);
if(idprop==NULL) {
- PyErr_SetString( PyExc_KeyError, "key not in subgroup dict");
+ PyErr_SetString(PyExc_KeyError, "key not in subgroup dict");
return NULL;
}
@@ -259,7 +265,7 @@ static int idp_sequence_type(PyObject *seq)
PyObject *item;
int type= IDP_INT;
- int i, len = PySequence_Length(seq);
+ int i, len = PySequence_Size(seq);
for (i=0; i < len; i++) {
item = PySequence_GetItem(seq, i);
if (PyFloat_Check(item)) {
@@ -294,7 +300,7 @@ static int idp_sequence_type(PyObject *seq)
}
/* note: group can be a pointer array or a group */
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObject *ob)
+const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *group, PyObject *ob)
{
IDProperty *prop = NULL;
IDPropertyTemplate val = {0};
@@ -311,7 +317,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
} else if (PyUnicode_Check(ob)) {
#ifdef USE_STRING_COERCE
PyObject *value_coerce= NULL;
- val.str = (char *)PuC_UnicodeAsByte(ob, &value_coerce);
+ val.str = (char *)PyC_UnicodeAsByte(ob, &value_coerce);
prop = IDP_New(IDP_STRING, val, name);
Py_XDECREF(value_coerce);
#else
@@ -329,7 +335,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
we assume IDP_INT unless we hit a float
number; then we assume it's */
- val.array.len = PySequence_Length(ob);
+ val.array.len = PySequence_Size(ob);
switch(val.array.type) {
case IDP_DOUBLE:
@@ -351,7 +357,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
case IDP_IDPARRAY:
prop= IDP_NewIDPArray(name);
for (i=0; i<val.array.len; i++) {
- char *error;
+ const char *error;
item = PySequence_GetItem(ob, i);
error= BPy_IDProperty_Map_ValidateAndCreate("", prop, item);
Py_DECREF(item);
@@ -414,7 +420,7 @@ char *BPy_IDProperty_Map_ValidateAndCreate(char *name, IDProperty *group, PyObje
int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
{
if (prop->type != IDP_GROUP) {
- PyErr_SetString( PyExc_TypeError, "unsubscriptable object");
+ PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
return -1;
}
@@ -426,21 +432,21 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
MEM_freeN(pkey);
return 0;
} else {
- PyErr_SetString( PyExc_KeyError, "property not found in group" );
+ PyErr_SetString(PyExc_KeyError, "property not found in group");
return -1;
}
}
else {
- char *err;
+ const char *err;
if (!PyUnicode_Check(key)) {
- PyErr_SetString( PyExc_TypeError, "only strings are allowed as subgroup keys" );
+ PyErr_SetString(PyExc_TypeError, "only strings are allowed as subgroup keys");
return -1;
}
err = BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, val);
if (err) {
- PyErr_SetString( PyExc_KeyError, err );
+ PyErr_SetString(PyExc_KeyError, err );
return -1;
}
@@ -488,7 +494,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_ARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_ARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -513,7 +519,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
int i;
if (!seq) {
- PyErr_Format( PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
+ PyErr_Format(PyExc_RuntimeError, "BPy_IDGroup_MapDataToPy, IDP_IDPARRAY: PyList_New(%d) failed", prop->len);
return NULL;
}
@@ -555,7 +561,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "pop expected at least 1 argument, got 0" );
+ PyErr_SetString(PyExc_TypeError, "pop expected at least 1 argument, got 0");
return NULL;
}
@@ -575,7 +581,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
return pyform;
}
- PyErr_SetString( PyExc_KeyError, "item not in group" );
+ PyErr_SetString(PyExc_KeyError, "item not in group");
return NULL;
}
@@ -692,7 +698,7 @@ static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "expected a string");
+ PyErr_SetString(PyExc_TypeError, "expected a string");
return -1;
}
@@ -705,7 +711,7 @@ static PyObject *BPy_IDGroup_Update(BPy_IDProperty *self, PyObject *value)
Py_ssize_t i=0;
if (!PyDict_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "expected an object derived from dict.");
+ PyErr_SetString(PyExc_TypeError, "expected an object derived from dict");
return NULL;
}
@@ -724,7 +730,7 @@ static PyObject *BPy_IDGroup_ConvertToPy(BPy_IDProperty *self)
/* Matches python dict.get(key, [default]) */
-PyObject* BPy_IDGroup_Get(BPy_IDProperty *self, PyObject *args)
+static PyObject* BPy_IDGroup_Get(BPy_IDProperty *self, PyObject *args)
{
IDProperty *idprop;
char *key;
@@ -761,23 +767,23 @@ static struct PyMethodDef BPy_IDGroup_methods[] = {
"idprop.get(k[,d]) -> idprop[k] if k in idprop, else d. d defaults to None"},
{"convert_to_pyobject", (PyCFunction)BPy_IDGroup_ConvertToPy, METH_NOARGS,
"return a purely python version of the group"},
- {0, NULL, 0, NULL}
+ {NULL, NULL, 0, NULL}
};
static PySequenceMethods BPy_IDGroup_Seq = {
- (lenfunc) BPy_IDGroup_Map_Len, /* lenfunc sq_length */
- 0, /* binaryfunc sq_concat */
- 0, /* ssizeargfunc sq_repeat */
- 0, /* ssizeargfunc sq_item */ /* TODO - setting this will allow PySequence_Check to return True */
- 0, /* intintargfunc ***was_sq_slice*** */
- 0, /* intobjargproc sq_ass_item */
- 0, /* ssizeobjargproc ***was_sq_ass_slice*** */
+ (lenfunc) BPy_IDGroup_Map_Len, /* lenfunc sq_length */
+ NULL, /* binaryfunc sq_concat */
+ NULL, /* ssizeargfunc sq_repeat */
+ NULL, /* ssizeargfunc sq_item */ /* TODO - setting this will allow PySequence_Check to return True */
+ NULL, /* intintargfunc ***was_sq_slice*** */
+ NULL, /* intobjargproc sq_ass_item */
+ NULL, /* ssizeobjargproc ***was_sq_ass_slice*** */
(objobjproc) BPy_IDGroup_Contains, /* objobjproc sq_contains */
- 0, /* binaryfunc sq_inplace_concat */
- 0, /* ssizeargfunc sq_inplace_repeat */
+ NULL, /* binaryfunc sq_inplace_concat */
+ NULL, /* ssizeargfunc sq_inplace_repeat */
};
-PyMappingMethods BPy_IDGroup_Mapping = {
+static PyMappingMethods BPy_IDGroup_Mapping = {
(lenfunc)BPy_IDGroup_Map_Len, /*inquiry mp_length */
(binaryfunc)BPy_IDGroup_Map_GetItem, /*binaryfunc mp_subscript */
(objobjargproc)BPy_IDGroup_Map_SetItem, /*objobjargproc mp_ass_subscript */
@@ -860,7 +866,7 @@ PyObject *BPy_Wrap_IDProperty(ID *id, IDProperty *prop, IDProperty *parent)
static PyObject *IDArray_repr(BPy_IDArray *self)
{
- return PyUnicode_FromString("(ID Array)");
+ return PyUnicode_FromFormat("(ID Array [%d])", self->prop->len);
}
@@ -875,14 +881,8 @@ static PyObject *BPy_IDArray_GetLen(BPy_IDArray *self)
}
static PyGetSetDef BPy_IDArray_getseters[] = {
- {"len",
- (getter)BPy_IDArray_GetLen, (setter)NULL,
- "The length of the array, can also be gotten with len(array).",
- NULL},
- {"type",
- (getter)BPy_IDArray_GetType, (setter)NULL,
- "The type of the data in the array, is an ant.",
- NULL},
+ {(char *)"len", (getter)BPy_IDArray_GetLen, (setter)NULL, (char *)"The length of the array, can also be gotten with len(array).", NULL},
+ {(char *)"type", (getter)BPy_IDArray_GetType, (setter)NULL, (char *)"The type of the data in the array, is an ant.", NULL},
{NULL, NULL, NULL, NULL, NULL},
};
@@ -894,7 +894,7 @@ static PyObject *BPy_IDArray_ConvertToPy(BPy_IDArray *self)
static PyMethodDef BPy_IDArray_methods[] = {
{"convert_to_pyobject", (PyCFunction)BPy_IDArray_ConvertToPy, METH_NOARGS,
"return a purely python version of the group"},
- {0, NULL, 0, NULL}
+ {NULL, NULL, 0, NULL}
};
static int BPy_IDArray_Len(BPy_IDArray *self)
@@ -905,7 +905,7 @@ static int BPy_IDArray_Len(BPy_IDArray *self)
static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
{
if (index < 0 || index >= self->prop->len) {
- PyErr_SetString( PyExc_IndexError, "index out of range!");
+ PyErr_SetString(PyExc_IndexError, "index out of range!");
return NULL;
}
@@ -921,7 +921,7 @@ static PyObject *BPy_IDArray_GetItem(BPy_IDArray *self, int index)
break;
}
- PyErr_SetString( PyExc_RuntimeError, "invalid/corrupt array type!");
+ PyErr_SetString(PyExc_RuntimeError, "invalid/corrupt array type!");
return NULL;
}
@@ -932,7 +932,7 @@ static int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *value)
double d;
if (index < 0 || index >= self->prop->len) {
- PyErr_SetString( PyExc_RuntimeError, "index out of range!");
+ PyErr_SetString(PyExc_RuntimeError, "index out of range!");
return -1;
}
@@ -968,16 +968,16 @@ static int BPy_IDArray_SetItem(BPy_IDArray *self, int index, PyObject *value)
static PySequenceMethods BPy_IDArray_Seq = {
(lenfunc) BPy_IDArray_Len, /* inquiry sq_length */
- 0, /* binaryfunc sq_concat */
- 0, /* intargfunc sq_repeat */
+ NULL, /* binaryfunc sq_concat */
+ NULL, /* intargfunc sq_repeat */
(ssizeargfunc)BPy_IDArray_GetItem, /* intargfunc sq_item */
- 0, /* intintargfunc sq_slice */
- (ssizeobjargproc)BPy_IDArray_SetItem, /* intobjargproc sq_ass_item */
- 0, /* intintobjargproc sq_ass_slice */
- 0, /* objobjproc sq_contains */
+ NULL, /* intintargfunc sq_slice */
+ (ssizeobjargproc)BPy_IDArray_SetItem,/* intobjargproc sq_ass_item */
+ NULL, /* intintobjargproc sq_ass_slice */
+ NULL, /* objobjproc sq_contains */
/* Added in release 2.0 */
- 0, /* binaryfunc sq_inplace_concat */
- 0, /* intargfunc sq_inplace_repeat */
+ NULL, /* binaryfunc sq_inplace_concat */
+ NULL, /* intargfunc sq_inplace_repeat */
};
PyTypeObject IDArray_Type = {
@@ -1071,7 +1071,7 @@ static PyObject *IDGroup_Iter_iterself(PyObject *self)
static PyObject *IDGroup_Iter_repr(BPy_IDGroup_Iter *self)
{
- return PyUnicode_FromString("(ID Property Group)");
+ return PyUnicode_FromFormat("(ID Property Group Iter \"%s\")", self->group->prop->name);
}
static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
@@ -1091,7 +1091,7 @@ static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
return PyUnicode_FromString(cur->name);
}
} else {
- PyErr_SetString( PyExc_StopIteration, "iterator at end" );
+ PyErr_SetString(PyExc_StopIteration, "iterator at end");
return NULL;
}
}
diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h
index c0a07879c1d..2b2afb3f792 100644
--- a/source/blender/python/generic/IDProp.h
+++ b/source/blender/python/generic/IDProp.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,7 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include <Python.h>
+#ifndef IDPROP_H
+#define IDPROP_H
struct ID;
struct IDProperty;
@@ -56,9 +57,11 @@ int BPy_Wrap_SetMapItem(struct IDProperty *prop, PyObject *key, PyObject *val);
PyObject *BPy_IDGroup_WrapData(struct ID *id, struct IDProperty *prop );
-char *BPy_IDProperty_Map_ValidateAndCreate(char *name, struct IDProperty *group, PyObject *ob);
+const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, struct IDProperty *group, PyObject *ob);
void IDProp_Init_Types(void);
#define IDPROP_ITER_KEYS 0
#define IDPROP_ITER_ITEMS 1
+
+#endif /* IDPROP_H */
diff --git a/source/blender/python/generic/Makefile b/source/blender/python/generic/Makefile
deleted file mode 100644
index 0df98046f63..00000000000
--- a/source/blender/python/generic/Makefile
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_python
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# PreProcessor stuff
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-# modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../windowmanager
-CPPFLAGS += -I../../render/extern/include
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-
-# path to our own headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 8ac2107f8d2..63d310ae4e0 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -31,10 +31,15 @@
* The BGL submodule "wraps" OpenGL functions and constants,
* allowing script writers to make OpenGL calls in their Python scripts. */
+#include <Python.h>
+
#include "bgl.h" /*This must come first */
#include <GL/glew.h>
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
+
static char Method_Buffer_doc[] =
"(type, dimensions, [template]) - Create a new Buffer object\n\n\
(type) - The format to store data in\n\
@@ -51,7 +56,7 @@ For example, passing [100, 100] will create a 2 dimensional\n\
square buffer. Passing [16, 16, 32] will create a 3 dimensional\n\
buffer which is twice as deep as it is wide or high.";
-static PyObject *Method_Buffer( PyObject * self, PyObject * args );
+static PyObject *Method_Buffer( PyObject * self, PyObject *args );
/* Buffer sequence methods */
@@ -90,16 +95,16 @@ PyTypeObject BGL_bufferType = {
( printfunc ) 0, /*tp_print */
( getattrfunc ) Buffer_getattr, /*tp_getattr */
( setattrfunc ) 0, /*tp_setattr */
- 0, /*tp_compare */
+ NULL, /*tp_compare */
( reprfunc ) Buffer_repr, /*tp_repr */
- 0, /*tp_as_number */
+ NULL, /*tp_as_number */
&Buffer_SeqMethods, /*tp_as_sequence */
};
/* #ifndef __APPLE__ */
#define BGL_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
arg_def##nargs arg_list; \
ret_def_##ret; \
if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
@@ -108,7 +113,7 @@ static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
}
#define BGLU_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *self, PyObject *args) {\
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
arg_def##nargs arg_list; \
ret_def_##ret; \
if(!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
@@ -181,45 +186,62 @@ Buffer *BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuf
}
#define MAX_DIMENSIONS 256
-static PyObject *Method_Buffer (PyObject *self, PyObject *args)
+static PyObject *Method_Buffer (PyObject *UNUSED(self), PyObject *args)
{
- PyObject *length_ob= NULL, *template= NULL;
+ PyObject *length_ob= NULL, *init= NULL;
Buffer *buffer;
int dimensions[MAX_DIMENSIONS];
int i, type;
int ndimensions = 0;
- if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &template)) {
+ if (!PyArg_ParseTuple(args, "iO|O", &type, &length_ob, &init)) {
PyErr_SetString(PyExc_AttributeError, "expected an int and one or two PyObjects");
return NULL;
}
- if (type!=GL_BYTE && type!=GL_SHORT && type!=GL_INT && type!=GL_FLOAT && type!=GL_DOUBLE) {
+ if (!ELEM5(type, GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE)) {
PyErr_SetString(PyExc_AttributeError, "invalid first argument type, should be one of GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT or GL_DOUBLE");
return NULL;
}
- if (PyNumber_Check(length_ob)) {
+ if (PyLong_Check(length_ob)) {
ndimensions= 1;
- dimensions[0]= PyLong_AsLong(length_ob);
- } else if (PySequence_Check(length_ob)) {
- ndimensions= PySequence_Length(length_ob);
+ if(((dimensions[0]= PyLong_AsLong(length_ob)) < 1)) {
+ PyErr_SetString(PyExc_AttributeError, "dimensions must be between 1 and "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
+ }
+ else if (PySequence_Check(length_ob)) {
+ ndimensions= PySequence_Size(length_ob);
if (ndimensions > MAX_DIMENSIONS) {
- PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is 256");
+ PyErr_SetString(PyExc_AttributeError, "too many dimensions, max is "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
+ else if (ndimensions < 1) {
+ PyErr_SetString(PyExc_AttributeError, "sequence must have at least one dimension");
return NULL;
}
for (i=0; i<ndimensions; i++) {
PyObject *ob= PySequence_GetItem(length_ob, i);
- if (!PyNumber_Check(ob)) dimensions[i]= 1;
+ if (!PyLong_Check(ob)) dimensions[i]= 1;
else dimensions[i]= PyLong_AsLong(ob);
Py_DECREF(ob);
+
+ if(dimensions[i] < 1) {
+ PyErr_SetString(PyExc_AttributeError, "dimensions must be between 1 and "STRINGIFY(MAX_DIMENSIONS));
+ return NULL;
+ }
}
}
+ else {
+ PyErr_Format(PyExc_TypeError, "invalid second argument argument expected a sequence or an int, not a %.200s", Py_TYPE(length_ob)->tp_name);
+ return NULL;
+ }
buffer= BGL_MakeBuffer(type, ndimensions, dimensions, NULL);
- if (template && ndimensions) {
- if (Buffer_ass_slice((PyObject *) buffer, 0, dimensions[0], template)) {
+ if (init && ndimensions) {
+ if (Buffer_ass_slice((PyObject *) buffer, 0, dimensions[0], init)) {
Py_DECREF(buffer);
return NULL;
}
@@ -295,9 +317,9 @@ static PyObject *Buffer_slice(PyObject *self, int begin, int end)
list= PyList_New(end-begin);
- for (count= begin; count<end; count++)
- PyList_SetItem(list, count-begin, Buffer_item(self, count));
-
+ for (count= begin; count<end; count++) {
+ PyList_SET_ITEM(list, count-begin, Buffer_item(self, count));
+ }
return list;
}
@@ -356,8 +378,8 @@ static int Buffer_ass_slice(PyObject *self, int begin, int end, PyObject *seq)
return -1;
}
- if (PySequence_Length(seq)!=(end-begin)) {
- int seq_len = PySequence_Length(seq);
+ if (PySequence_Size(seq)!=(end-begin)) {
+ int seq_len = PySequence_Size(seq);
char err_str[128];
sprintf(err_str, "size mismatch in assignment. Expected size: %d (size provided: %d)", seq_len, (end-begin));
PyErr_SetString(PyExc_TypeError, err_str);
@@ -389,11 +411,11 @@ static PyObject *Buffer_tolist(PyObject *self)
{
int i, len= ((Buffer *)self)->dimensions[0];
PyObject *list= PyList_New(len);
-
+
for (i=0; i<len; i++) {
- PyList_SetItem(list, i, Buffer_item(self, i));
+ PyList_SET_ITEM(list, i, Buffer_item(self, i));
}
-
+
return list;
}
@@ -402,11 +424,11 @@ static PyObject *Buffer_dimensions(PyObject *self)
Buffer *buffer= (Buffer *) self;
PyObject *list= PyList_New(buffer->ndimensions);
int i;
-
+
for (i= 0; i<buffer->ndimensions; i++) {
- PyList_SetItem(list, i, PyLong_FromLong(buffer->dimensions[i]));
+ PyList_SET_ITEM(list, i, PyLong_FromLong(buffer->dimensions[i]));
}
-
+
return list;
}
@@ -1103,22 +1125,21 @@ static struct PyMethodDef BGL_methods[] = {
static struct PyModuleDef BGL_module_def = {
PyModuleDef_HEAD_INIT,
"bgl", /* m_name */
- 0, /* m_doc */
+ NULL, /* m_doc */
0, /* m_size */
BGL_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
};
-PyObject *BGL_Init(void)
+PyObject *BPyInit_bgl(void)
{
- PyObject *mod, *dict, *item;
- mod = PyModule_Create(&BGL_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), BGL_module_def.m_name, mod);
- dict= PyModule_GetDict(mod);
+ PyObject *submodule, *dict, *item;
+ submodule= PyModule_Create(&BGL_module_def);
+ dict= PyModule_GetDict(submodule);
if( PyType_Ready( &BGL_bufferType) < 0)
return NULL; /* should never happen */
@@ -1610,6 +1631,6 @@ PyObject *BGL_Init(void)
EXPP_ADDCONST(GL_TEXTURE_BINDING_1D);
EXPP_ADDCONST(GL_TEXTURE_BINDING_2D);
- return mod;
+ return submodule;
}
diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h
index 80b0b90f643..48462bc108e 100644
--- a/source/blender/python/generic/bgl.h
+++ b/source/blender/python/generic/bgl.h
@@ -33,12 +33,10 @@
* writers to make OpenGL calls in their Python scripts for Blender. The
* more important original comments are marked with an @ symbol. */
-#ifndef EXPP_BGL_H
-#define EXPP_BGL_H
+#ifndef BGL_H
+#define BGL_H
-#include <Python.h>
-
-PyObject *BGL_Init(void);
+PyObject *BPyInit_bgl(void);
/*@ Create a buffer object */
/*@ dimensions is an array of ndimensions integers representing the size of each dimension */
@@ -215,19 +213,19 @@ extern PyTypeObject BGL_bufferType;
#define GLsizei_def(num) int GLsizei_var(num)
/* typedef unsigned char GLubyte; */
-#define GLubyte_str "b"
+#define GLubyte_str "B"
#define GLubyte_var(num) bgl_var##num
#define GLubyte_ref(num) &bgl_var##num
#define GLubyte_def(num) /* unsigned */ char GLubyte_var(num)
/* typedef unsigned short GLushort; */
-#define GLushort_str "h"
+#define GLushort_str "H"
#define GLushort_var(num) bgl_var##num
#define GLushort_ref(num) &bgl_var##num
#define GLushort_def(num) /* unsigned */ short GLushort_var(num)
/* typedef unsigned int GLuint; */
-#define GLuint_str "i"
+#define GLuint_str "I"
#define GLuint_var(num) bgl_var##num
#define GLuint_ref(num) &bgl_var##num
#define GLuint_def(num) /* unsigned */ int GLuint_var(num)
@@ -337,4 +335,4 @@ extern PyTypeObject BGL_bufferType;
return NULL;\
}
-#endif /* EXPP_BGL_H */
+#endif /* BGL_H */
diff --git a/source/blender/python/generic/blf_api.c b/source/blender/python/generic/blf_py_api.c
index a5f5f8815c7..a32e40133bd 100644
--- a/source/blender/python/generic/blf_api.c
+++ b/source/blender/python/generic/blf_py_api.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,10 +23,14 @@
*/
#include <Python.h>
-#include "blf_api.h"
+#include "blf_py_api.h"
#include "../../blenfont/BLF_api.h"
+#include "BLI_utildefines.h"
+
+
+
static char py_blf_position_doc[] =
".. function:: position(fontid, x, y, z)\n"
"\n"
@@ -41,7 +45,7 @@ static char py_blf_position_doc[] =
" :arg z: Z axis position to draw the text.\n"
" :type z: float\n";
-static PyObject *py_blf_position(PyObject *self, PyObject *args)
+static PyObject *py_blf_position(PyObject *UNUSED(self), PyObject *args)
{
int fontid;
float x, y, z;
@@ -67,7 +71,7 @@ static char py_blf_size_doc[] =
" :arg dpi: dots per inch value to use for drawing.\n"
" :type dpi: int\n";
-static PyObject *py_blf_size(PyObject *self, PyObject *args)
+static PyObject *py_blf_size(PyObject *UNUSED(self), PyObject *args)
{
int fontid, size, dpi;
@@ -90,7 +94,7 @@ static char py_blf_aspect_doc[] =
" :arg aspect: The aspect ratio for text drawing to use.\n"
" :type aspect: float\n";
-static PyObject *py_blf_aspect(PyObject *self, PyObject *args)
+static PyObject *py_blf_aspect(PyObject *UNUSED(self), PyObject *args)
{
float aspect;
int fontid;
@@ -98,7 +102,7 @@ static PyObject *py_blf_aspect(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "if:blf.aspect", &fontid, &aspect))
return NULL;
- BLF_aspect(fontid, aspect);
+ BLF_aspect(fontid, aspect, aspect, 1.0);
Py_RETURN_NONE;
}
@@ -114,7 +118,7 @@ static char py_blf_blur_doc[] =
" :arg radius: The radius for blurring text (in pixels).\n"
" :type radius: int\n";
-static PyObject *py_blf_blur(PyObject *self, PyObject *args)
+static PyObject *py_blf_blur(PyObject *UNUSED(self), PyObject *args)
{
int blur, fontid;
@@ -137,15 +141,16 @@ static char py_blf_draw_doc[] =
" :arg text: the text to draw.\n"
" :type text: string\n";
-static PyObject *py_blf_draw(PyObject *self, PyObject *args)
+static PyObject *py_blf_draw(PyObject *UNUSED(self), PyObject *args)
{
char *text;
+ int text_length;
int fontid;
- if (!PyArg_ParseTuple(args, "is:blf.draw", &fontid, &text))
+ if (!PyArg_ParseTuple(args, "is#:blf.draw", &fontid, &text, &text_length))
return NULL;
- BLF_draw(fontid, text);
+ BLF_draw(fontid, text, (unsigned int)text_length);
Py_RETURN_NONE;
}
@@ -162,7 +167,7 @@ static char py_blf_dimensions_doc[] =
" :return: the width and height of the text.\n"
" :rtype: tuple of 2 floats\n";
-static PyObject *py_blf_dimensions(PyObject *self, PyObject *args)
+static PyObject *py_blf_dimensions(PyObject *UNUSED(self), PyObject *args)
{
char *text;
float r_width, r_height;
@@ -196,7 +201,7 @@ static char py_blf_clipping_doc[] =
" :arg ymax: Clip the drawing area by these bounds.\n"
" :type ymax: float\n";
-static PyObject *py_blf_clipping(PyObject *self, PyObject *args)
+static PyObject *py_blf_clipping(PyObject *UNUSED(self), PyObject *args)
{
float xmin, ymin, xmax, ymax;
int fontid;
@@ -219,7 +224,7 @@ static char py_blf_disable_doc[] =
" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n"
" :type option: int\n";
-static PyObject *py_blf_disable(PyObject *self, PyObject *args)
+static PyObject *py_blf_disable(PyObject *UNUSED(self), PyObject *args)
{
int option, fontid;
@@ -241,7 +246,7 @@ static char py_blf_enable_doc[] =
" :arg option: One of ROTATION, CLIPPING, SHADOW or KERNING_DEFAULT.\n"
" :type option: int\n";
-static PyObject *py_blf_enable(PyObject *self, PyObject *args)
+static PyObject *py_blf_enable(PyObject *UNUSED(self), PyObject *args)
{
int option, fontid;
@@ -263,7 +268,7 @@ static char py_blf_rotation_doc[] =
" :arg angle: The angle for text drawing to use.\n"
" :type angle: float\n";
-static PyObject *py_blf_rotation(PyObject *self, PyObject *args)
+static PyObject *py_blf_rotation(PyObject *UNUSED(self), PyObject *args)
{
float angle;
int fontid;
@@ -294,7 +299,7 @@ static char py_blf_shadow_doc[] =
" :arg a: Shadow color (alpha channel 0.0 - 1.0).\n"
" :type a: float\n";
-static PyObject *py_blf_shadow(PyObject *self, PyObject *args)
+static PyObject *py_blf_shadow(PyObject *UNUSED(self), PyObject *args)
{
int level, fontid;
float r, g, b, a;
@@ -324,7 +329,7 @@ static char py_blf_shadow_offset_doc[] =
" :arg y: Horizontal shadow offset value in pixels.\n"
" :type y: float\n";
-static PyObject *py_blf_shadow_offset(PyObject *self, PyObject *args)
+static PyObject *py_blf_shadow_offset(PyObject *UNUSED(self), PyObject *args)
{
int x, y, fontid;
@@ -346,7 +351,7 @@ static char py_blf_load_doc[] =
" :return: the new font's fontid or -1 if there was an error.\n"
" :rtype: integer\n";
-static PyObject *py_blf_load(PyObject *self, PyObject *args)
+static PyObject *py_blf_load(PyObject *UNUSED(self), PyObject *args)
{
char* filename;
@@ -357,7 +362,7 @@ static PyObject *py_blf_load(PyObject *self, PyObject *args)
}
/*----------------------------MODULE INIT-------------------------*/
-struct PyMethodDef BLF_methods[] = {
+static PyMethodDef BLF_methods[] = {
{"aspect", (PyCFunction) py_blf_aspect, METH_VARARGS, py_blf_aspect_doc},
{"blur", (PyCFunction) py_blf_blur, METH_VARARGS, py_blf_blur_doc},
{"clipping", (PyCFunction) py_blf_clipping, METH_VARARGS, py_blf_clipping_doc},
@@ -365,7 +370,7 @@ struct PyMethodDef BLF_methods[] = {
{"dimensions", (PyCFunction) py_blf_dimensions, METH_VARARGS, py_blf_dimensions_doc},
{"draw", (PyCFunction) py_blf_draw, METH_VARARGS, py_blf_draw_doc},
{"enable", (PyCFunction) py_blf_enable, METH_VARARGS, py_blf_enable_doc},
- {"position", (PyCFunction)py_blf_position, METH_VARARGS, py_blf_position_doc},
+ {"position", (PyCFunction) py_blf_position, METH_VARARGS, py_blf_position_doc},
{"rotation", (PyCFunction) py_blf_rotation, METH_VARARGS, py_blf_rotation_doc},
{"shadow", (PyCFunction) py_blf_shadow, METH_VARARGS, py_blf_shadow_doc},
{"shadow_offset", (PyCFunction) py_blf_shadow_offset, METH_VARARGS, py_blf_shadow_offset_doc},
@@ -383,23 +388,22 @@ static struct PyModuleDef BLF_module_def = {
BLF_doc, /* m_doc */
0, /* m_size */
BLF_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
};
-PyObject *BLF_Init(void)
+PyObject *BPyInit_blf(void)
{
PyObject *submodule;
submodule = PyModule_Create(&BLF_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), BLF_module_def.m_name, submodule);
PyModule_AddIntConstant(submodule, "ROTATION", BLF_ROTATION);
PyModule_AddIntConstant(submodule, "CLIPPING", BLF_CLIPPING);
PyModule_AddIntConstant(submodule, "SHADOW", BLF_SHADOW);
PyModule_AddIntConstant(submodule, "KERNING_DEFAULT", BLF_KERNING_DEFAULT);
- return (submodule);
+ return submodule;
}
diff --git a/source/blender/python/generic/blf_api.h b/source/blender/python/generic/blf_py_api.h
index fae20ace996..316bad3a4c9 100644
--- a/source/blender/python/generic/blf_api.h
+++ b/source/blender/python/generic/blf_py_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,5 +22,4 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
-PyObject *BLF_Init(void);
+PyObject *BPyInit_blf(void);
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index 9e47021afb2..f68f499a28c 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -1,5 +1,5 @@
/*
- * $Id: bpy_internal_import.c 21094 2009-06-23 00:09:26Z gsrb3d $
+ * $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -26,17 +26,27 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+#include <stddef.h>
+
+#include "compile.h" /* for the PyCodeObject */
+#include "eval.h" /* for PyEval_EvalCode */
+
#include "bpy_internal_import.h"
-#include "DNA_text_types.h"
#include "MEM_guardedalloc.h"
-#include "BKE_text.h" /* txt_to_buf */
-#include "BKE_main.h"
-#include "BKE_global.h" /* grr, only for G.sce */
+
+#include "DNA_text_types.h"
+
#include "BLI_listbase.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
-#include <stddef.h>
+#include "BLI_utildefines.h"
+
+ /* UNUSED */
+#include "BKE_text.h" /* txt_to_buf */
+#include "BKE_main.h"
+#include "BKE_global.h" /* grr, only for G.main->name */
static Main *bpy_import_main= NULL;
@@ -61,16 +71,17 @@ void bpy_import_main_set(struct Main *maggie)
/* returns a dummy filename for a textblock so we can tell what file a text block comes from */
void bpy_text_filename_get(char *fn, Text *text)
{
- sprintf(fn, "%s/%s", text->id.lib ? text->id.lib->filepath : G.sce, text->id.name+2);
-
- /* XXX, this is a bug in python's Py_CompileString()!
+#if PY_VERSION_HEX >= 0x03020000
+ sprintf(fn, "%s%c%s", text->id.lib ? text->id.lib->filepath : G.main->name, SEP, text->id.name+2);
+#else
+ /* this is a bug in python's Py_CompileString()!, fixed for python 3.2.
the string encoding should not be required to be utf-8
- reported: http://bugs.python.org/msg115202
- */
- BLI_utf8_invalid_strip(fn, strlen(fn));
+ reported: http://bugs.python.org/msg115202 */
+ strcpy(fn, text->id.name+2);
+#endif
}
-PyObject *bpy_text_import( Text *text )
+PyObject *bpy_text_import(Text *text)
{
char *buf = NULL;
char modulename[24];
@@ -191,24 +202,24 @@ PyObject *bpy_text_reimport( PyObject *module, int *found )
}
-static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * kw)
+static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject * kw)
{
PyObject *exception, *err, *tb;
char *name;
int found= 0;
PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
- PyObject *newmodule;
+ int level= -1; /* relative imports */
+ PyObject *newmodule;
//PyObject_Print(args, stderr, 0);
- int dummy_val; /* what does this do?*/
- static char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", 0};
+ static const char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", NULL};
- if( !PyArg_ParseTupleAndKeywords( args, kw, "s|OOOi:bpy_import_meth", kwlist,
- &name, &globals, &locals, &fromlist, &dummy_val) )
+ if( !PyArg_ParseTupleAndKeywords(args, kw, "s|OOOi:bpy_import_meth", (char **)kwlist,
+ &name, &globals, &locals, &fromlist, &level) )
return NULL;
/* import existing builtin modules or modules that have been imported already */
- newmodule = PyImport_ImportModuleEx( name, globals, locals, fromlist );
+ newmodule= PyImport_ImportModuleLevel(name, globals, locals, fromlist, level);
if(newmodule)
return newmodule;
@@ -244,7 +255,7 @@ static PyObject *blender_import( PyObject * self, PyObject * args, PyObject * k
* our reload() module, to handle reloading in-memory scripts
*/
-static PyObject *blender_reload( PyObject * self, PyObject * module )
+static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module)
{
PyObject *exception, *err, *tb;
PyObject *newmodule = NULL;
@@ -281,8 +292,8 @@ static PyObject *blender_reload( PyObject * self, PyObject * module )
return newmodule;
}
-PyMethodDef bpy_import_meth[] = { {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"} };
-PyMethodDef bpy_reload_meth[] = { {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"} };
+PyMethodDef bpy_import_meth = {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
+PyMethodDef bpy_reload_meth = {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
/* Clear user modules.
@@ -357,26 +368,3 @@ void bpy_text_clear_modules(int clear_all)
Py_DECREF(list); /* removes all references from append */
}
#endif
-
-
-/*****************************************************************************
-* Description: This function creates a new Python dictionary object.
-* note: dict is owned by sys.modules["__main__"] module, reference is borrowed
-* note: important we use the dict from __main__, this is what python expects
- for 'pickle' to work as well as strings like this...
- >> foo = 10
- >> print(__import__("__main__").foo)
-*****************************************************************************/
-PyObject *bpy_namespace_dict_new(const char *filename)
-{
- PyInterpreterState *interp= PyThreadState_GET()->interp;
- PyObject *mod_main= PyModule_New("__main__");
- PyDict_SetItemString(interp->modules, "__main__", mod_main);
- Py_DECREF(mod_main); /* sys.modules owns now */
- PyModule_AddStringConstant(mod_main, "__name__", "__main__");
- if(filename)
- PyModule_AddStringConstant(mod_main, "__file__", filename); /* __file__ only for nice UI'ness */
- PyModule_AddObject(mod_main, "__builtins__", interp->builtins);
- Py_INCREF(interp->builtins); /* AddObject steals a reference */
- return PyModule_GetDict(mod_main);
-}
diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h
index cbd4c881217..529c2c44df1 100644
--- a/source/blender/python/generic/bpy_internal_import.h
+++ b/source/blender/python/generic/bpy_internal_import.h
@@ -28,8 +28,8 @@
/* Note, the BGE needs to use this too, keep it minimal */
-#ifndef EXPP_bpy_import_h
-#define EXPP_bpy_import_h
+#ifndef BPY_INTERNAL_IMPORT_H
+#define BPY_INTERNAL_IMPORT_H
/* python redefines :/ */
#ifdef _POSIX_C_SOURCE
@@ -40,27 +40,20 @@
#undef _XOPEN_SOURCE
#endif
-#include <Python.h>
-#include "compile.h" /* for the PyCodeObject */
-#include "eval.h" /* for PyEval_EvalCode */
-
struct Text;
-PyObject* bpy_text_import( struct Text *text );
-PyObject* bpy_text_import_name( char *name, int *found );
-PyObject* bpy_text_reimport( PyObject *module, int *found );
-/* void bpy_text_clear_modules( int clear_all );*/ /* Clear user modules */
+PyObject* bpy_text_import(struct Text *text);
+PyObject* bpy_text_import_name(char *name, int *found);
+PyObject* bpy_text_reimport(PyObject *module, int *found);
+/* void bpy_text_clear_modules(int clear_all);*/ /* Clear user modules */
void bpy_text_filename_get(char *fn, struct Text *text);
-extern PyMethodDef bpy_import_meth[];
-extern PyMethodDef bpy_reload_meth[];
+extern PyMethodDef bpy_import_meth;
+extern PyMethodDef bpy_reload_meth;
/* The game engine has its own Main struct, if this is set search this rather then G.main */
struct Main *bpy_import_main_get(void);
void bpy_import_main_set(struct Main *maggie);
-/* name namespace function for bpy & bge */
-PyObject *bpy_namespace_dict_new(const char *filename);
-
-#endif /* EXPP_bpy_import_h */
+#endif /* BPY_INTERNAL_IMPORT_H */
diff --git a/source/blender/python/generic/geometry.c b/source/blender/python/generic/geometry.c
deleted file mode 100644
index 0e98760314d..00000000000
--- a/source/blender/python/generic/geometry.c
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * This is a new part of Blender.
- *
- * Contributor(s): Joseph Gilbert, Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "geometry.h"
-
-/* Used for PolyFill */
-#include "BKE_displist.h"
-#include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
-
-#include "BKE_utildefines.h"
-#include "BKE_curve.h"
-#include "BLI_boxpack2d.h"
-#include "BLI_math.h"
-
-#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
-#define eps 0.000001
-
-
-/*-------------------------DOC STRINGS ---------------------------*/
-static char M_Geometry_doc[] = "The Blender geometry module\n\n";
-static char M_Geometry_Intersect_doc[] = "(v1, v2, v3, ray, orig, clip=1) - returns the intersection between a ray and a triangle, if possible, returns None otherwise";
-static char M_Geometry_TriangleArea_doc[] = "(v1, v2, v3) - returns the area size of the 2D or 3D triangle defined";
-static char M_Geometry_TriangleNormal_doc[] = "(v1, v2, v3) - returns the normal of the 3D triangle defined";
-static char M_Geometry_QuadNormal_doc[] = "(v1, v2, v3, v4) - returns the normal of the 3D quad defined";
-static char M_Geometry_LineIntersect_doc[] = "(v1, v2, v3, v4) - returns a tuple with the points on each line respectively closest to the other";
-static char M_Geometry_PolyFill_doc[] = "(veclist_list) - takes a list of polylines (each point a vector) and returns the point indicies for a polyline filled with triangles";
-static char M_Geometry_LineIntersect2D_doc[] = "(lineA_p1, lineA_p2, lineB_p1, lineB_p2) - takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None";
-static char M_Geometry_ClosestPointOnLine_doc[] = "(pt, line_p1, line_p2) - takes a point and a line and returns a (Vector, float) for the point on the line, and the bool so you can know if the point was between the 2 points";
-static char M_Geometry_PointInTriangle2D_doc[] = "(pt, tri_p1, tri_p2, tri_p3) - takes 4 vectors, one is the point and the next 3 define the triangle, only the x and y are used from the vectors";
-static char M_Geometry_PointInQuad2D_doc[] = "(pt, quad_p1, quad_p2, quad_p3, quad_p4) - takes 5 vectors, one is the point and the next 4 define the quad, only the x and y are used from the vectors";
-static char M_Geometry_BoxPack2D_doc[] = "";
-static char M_Geometry_BezierInterp_doc[] = "";
-
-//---------------------------------INTERSECTION FUNCTIONS--------------------
-//----------------------------------geometry.Intersect() -------------------
-static PyObject *M_Geometry_Intersect( PyObject * self, PyObject * args )
-{
- VectorObject *ray, *ray_off, *vec1, *vec2, *vec3;
- float dir[3], orig[3], v1[3], v2[3], v3[3], e1[3], e2[3], pvec[3], tvec[3], qvec[3];
- float det, inv_det, u, v, t;
- int clip = 1;
-
- if(!PyArg_ParseTuple(args, "O!O!O!O!O!|i", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &ray, &vector_Type, &ray_off , &clip)) {
- PyErr_SetString( PyExc_TypeError, "expected 5 vector types\n" );
- return NULL;
- }
- if(vec1->size != 3 || vec2->size != 3 || vec3->size != 3 || ray->size != 3 || ray_off->size != 3) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors for all parameters\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- VECCOPY(dir, ray->vec);
- normalize_v3(dir);
-
- VECCOPY(orig, ray_off->vec);
-
- /* find vectors for two edges sharing v1 */
- sub_v3_v3v3(e1, v2, v1);
- sub_v3_v3v3(e2, v3, v1);
-
- /* begin calculating determinant - also used to calculated U parameter */
- cross_v3_v3v3(pvec, dir, e2);
-
- /* if determinant is near zero, ray lies in plane of triangle */
- det = dot_v3v3(e1, pvec);
-
- if (det > -0.000001 && det < 0.000001) {
- Py_RETURN_NONE;
- }
-
- inv_det = 1.0f / det;
-
- /* calculate distance from v1 to ray origin */
- sub_v3_v3v3(tvec, orig, v1);
-
- /* calculate U parameter and test bounds */
- u = dot_v3v3(tvec, pvec) * inv_det;
- if (clip && (u < 0.0f || u > 1.0f)) {
- Py_RETURN_NONE;
- }
-
- /* prepare to test the V parameter */
- cross_v3_v3v3(qvec, tvec, e1);
-
- /* calculate V parameter and test bounds */
- v = dot_v3v3(dir, qvec) * inv_det;
-
- if (clip && (v < 0.0f || u + v > 1.0f)) {
- Py_RETURN_NONE;
- }
-
- /* calculate t, ray intersects triangle */
- t = dot_v3v3(e2, qvec) * inv_det;
-
- mul_v3_fl(dir, t);
- add_v3_v3v3(pvec, orig, dir);
-
- return newVectorObject(pvec, 3, Py_NEW, NULL);
-}
-//----------------------------------geometry.LineIntersect() -------------------
-/* Line-Line intersection using algorithm from mathworld.wolfram.com */
-static PyObject *M_Geometry_LineIntersect( PyObject * self, PyObject * args )
-{
- PyObject * tuple;
- VectorObject *vec1, *vec2, *vec3, *vec4;
- float v1[3], v2[3], v3[3], v4[3], i1[3], i2[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size || vec3->size != vec2->size) {
- PyErr_SetString( PyExc_TypeError,"vectors must be of the same size\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
- return NULL;
-
- if( vec1->size == 3 || vec1->size == 2) {
- int result;
-
- if (vec1->size == 3) {
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
- VECCOPY(v4, vec4->vec);
- }
- else {
- v1[0] = vec1->vec[0];
- v1[1] = vec1->vec[1];
- v1[2] = 0.0f;
-
- v2[0] = vec2->vec[0];
- v2[1] = vec2->vec[1];
- v2[2] = 0.0f;
-
- v3[0] = vec3->vec[0];
- v3[1] = vec3->vec[1];
- v3[2] = 0.0f;
-
- v4[0] = vec4->vec[0];
- v4[1] = vec4->vec[1];
- v4[2] = 0.0f;
- }
-
- result = isect_line_line_v3(v1, v2, v3, v4, i1, i2);
-
- if (result == 0) {
- /* colinear */
- Py_RETURN_NONE;
- }
- else {
- tuple = PyTuple_New( 2 );
- PyTuple_SetItem( tuple, 0, newVectorObject(i1, vec1->size, Py_NEW, NULL) );
- PyTuple_SetItem( tuple, 1, newVectorObject(i2, vec1->size, Py_NEW, NULL) );
- return tuple;
- }
- }
- else {
- PyErr_SetString( PyExc_TypeError, "2D/3D vectors only\n" );
- return NULL;
- }
-}
-
-
-
-//---------------------------------NORMALS FUNCTIONS--------------------
-//----------------------------------geometry.QuadNormal() -------------------
-static PyObject *M_Geometry_QuadNormal( PyObject * self, PyObject * args )
-{
- VectorObject *vec1;
- VectorObject *vec2;
- VectorObject *vec3;
- VectorObject *vec4;
- float v1[3], v2[3], v3[3], v4[3], e1[3], e2[3], n1[3], n2[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec4->size) {
- PyErr_SetString( PyExc_TypeError,"vectors must be of the same size\n" );
- return NULL;
- }
- if( vec1->size != 3 ) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
- VECCOPY(v4, vec4->vec);
-
- /* find vectors for two edges sharing v2 */
- sub_v3_v3v3(e1, v1, v2);
- sub_v3_v3v3(e2, v3, v2);
-
- cross_v3_v3v3(n1, e2, e1);
- normalize_v3(n1);
-
- /* find vectors for two edges sharing v4 */
- sub_v3_v3v3(e1, v3, v4);
- sub_v3_v3v3(e2, v1, v4);
-
- cross_v3_v3v3(n2, e2, e1);
- normalize_v3(n2);
-
- /* adding and averaging the normals of both triangles */
- add_v3_v3v3(n1, n2, n1);
- normalize_v3(n1);
-
- return newVectorObject(n1, 3, Py_NEW, NULL);
-}
-
-//----------------------------geometry.TriangleNormal() -------------------
-static PyObject *M_Geometry_TriangleNormal( PyObject * self, PyObject * args )
-{
- VectorObject *vec1, *vec2, *vec3;
- float v1[3], v2[3], v3[3], e1[3], e2[3], n[3];
-
- if( !PyArg_ParseTuple( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n" );
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size ) {
- PyErr_SetString( PyExc_TypeError, "vectors must be of the same size\n" );
- return NULL;
- }
- if( vec1->size != 3 ) {
- PyErr_SetString( PyExc_TypeError, "only 3D vectors\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
- return NULL;
-
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- /* find vectors for two edges sharing v2 */
- sub_v3_v3v3(e1, v1, v2);
- sub_v3_v3v3(e2, v3, v2);
-
- cross_v3_v3v3(n, e2, e1);
- normalize_v3(n);
-
- return newVectorObject(n, 3, Py_NEW, NULL);
-}
-
-//--------------------------------- AREA FUNCTIONS--------------------
-//----------------------------------geometry.TriangleArea() -------------------
-static PyObject *M_Geometry_TriangleArea( PyObject * self, PyObject * args )
-{
- VectorObject *vec1, *vec2, *vec3;
- float v1[3], v2[3], v3[3];
-
- if( !PyArg_ParseTuple
- ( args, "O!O!O!", &vector_Type, &vec1, &vector_Type, &vec2
- , &vector_Type, &vec3 ) ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n");
- return NULL;
- }
- if( vec1->size != vec2->size || vec1->size != vec3->size ) {
- PyErr_SetString( PyExc_TypeError, "vectors must be of the same size\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
- return NULL;
-
- if (vec1->size == 3) {
- VECCOPY(v1, vec1->vec);
- VECCOPY(v2, vec2->vec);
- VECCOPY(v3, vec3->vec);
-
- return PyFloat_FromDouble( area_tri_v3(v1, v2, v3) );
- }
- else if (vec1->size == 2) {
- v1[0] = vec1->vec[0];
- v1[1] = vec1->vec[1];
-
- v2[0] = vec2->vec[0];
- v2[1] = vec2->vec[1];
-
- v3[0] = vec3->vec[0];
- v3[1] = vec3->vec[1];
-
- return PyFloat_FromDouble( area_tri_v2(v1, v2, v3) );
- }
- else {
- PyErr_SetString( PyExc_TypeError, "only 2D,3D vectors are supported\n" );
- return NULL;
- }
-}
-
-/*----------------------------------geometry.PolyFill() -------------------*/
-/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
-static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq )
-{
- PyObject *tri_list; /*return this list of tri's */
- PyObject *polyLine, *polyVec;
- int i, len_polylines, len_polypoints, ls_error = 0;
-
- /* display listbase */
- ListBase dispbase={NULL, NULL};
- DispList *dl;
- float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
- int index, *dl_face, totpoints=0;
-
-
- dispbase.first= dispbase.last= NULL;
-
-
- if(!PySequence_Check(polyLineSeq)) {
- PyErr_SetString( PyExc_TypeError, "expected a sequence of poly lines" );
- return NULL;
- }
-
- len_polylines = PySequence_Size( polyLineSeq );
-
- for( i = 0; i < len_polylines; ++i ) {
- polyLine= PySequence_GetItem( polyLineSeq, i );
- if (!PySequence_Check(polyLine)) {
- freedisplist(&dispbase);
- Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
- PyErr_SetString( PyExc_TypeError, "One or more of the polylines is not a sequence of mathutils.Vector's" );
- return NULL;
- }
-
- len_polypoints= PySequence_Size( polyLine );
- if (len_polypoints>0) { /* dont bother adding edges as polylines */
-#if 0
- if (EXPP_check_sequence_consistency( polyLine, &vector_Type ) != 1) {
- freedisplist(&dispbase);
- Py_DECREF(polyLine);
- PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" );
- return NULL;
- }
-#endif
- dl= MEM_callocN(sizeof(DispList), "poly disp");
- BLI_addtail(&dispbase, dl);
- dl->type= DL_INDEX3;
- dl->nr= len_polypoints;
- dl->type= DL_POLY;
- dl->parts= 1; /* no faces, 1 edge loop */
- dl->col= 0; /* no material */
- dl->verts= fp= MEM_callocN( sizeof(float)*3*len_polypoints, "dl verts");
- dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
-
- for( index = 0; index<len_polypoints; ++index, fp+=3) {
- polyVec= PySequence_GetItem( polyLine, index );
- if(VectorObject_Check(polyVec)) {
-
- if(!BaseMath_ReadCallback((VectorObject *)polyVec))
- ls_error= 1;
-
- fp[0] = ((VectorObject *)polyVec)->vec[0];
- fp[1] = ((VectorObject *)polyVec)->vec[1];
- if( ((VectorObject *)polyVec)->size > 2 )
- fp[2] = ((VectorObject *)polyVec)->vec[2];
- else
- fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
- }
- else {
- ls_error= 1;
- }
-
- totpoints++;
- Py_DECREF(polyVec);
- }
- }
- Py_DECREF(polyLine);
- }
-
- if(ls_error) {
- freedisplist(&dispbase); /* possible some dl was allocated */
- PyErr_SetString( PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type" );
- return NULL;
- }
- else if (totpoints) {
- /* now make the list to return */
- filldisplist(&dispbase, &dispbase, 0);
-
- /* The faces are stored in a new DisplayList
- thats added to the head of the listbase */
- dl= dispbase.first;
-
- tri_list= PyList_New(dl->parts);
- if( !tri_list ) {
- freedisplist(&dispbase);
- PyErr_SetString( PyExc_RuntimeError, "geometry.PolyFill failed to make a new list" );
- return NULL;
- }
-
- index= 0;
- dl_face= dl->index;
- while(index < dl->parts) {
- PyList_SetItem(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]) );
- dl_face+= 3;
- index++;
- }
- freedisplist(&dispbase);
- } else {
- /* no points, do this so scripts dont barf */
- freedisplist(&dispbase); /* possible some dl was allocated */
- tri_list= PyList_New(0);
- }
-
- return tri_list;
-}
-
-
-static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
-{
- VectorObject *line_a1, *line_a2, *line_b1, *line_b2;
- float a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y, xi, yi, a1,a2,b1,b2, newvec[2];
- if( !PyArg_ParseTuple ( args, "O!O!O!O!",
- &vector_Type, &line_a1,
- &vector_Type, &line_a2,
- &vector_Type, &line_b1,
- &vector_Type, &line_b2)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
- return NULL;
-
- a1x= line_a1->vec[0];
- a1y= line_a1->vec[1];
- a2x= line_a2->vec[0];
- a2y= line_a2->vec[1];
-
- b1x= line_b1->vec[0];
- b1y= line_b1->vec[1];
- b2x= line_b2->vec[0];
- b2y= line_b2->vec[1];
-
- if((MIN2(a1x, a2x) > MAX2(b1x, b2x)) ||
- (MAX2(a1x, a2x) < MIN2(b1x, b2x)) ||
- (MIN2(a1y, a2y) > MAX2(b1y, b2y)) ||
- (MAX2(a1y, a2y) < MIN2(b1y, b2y)) ) {
- Py_RETURN_NONE;
- }
- /* Make sure the hoz/vert line comes first. */
- if (fabs(b1x - b2x) < eps || fabs(b1y - b2y) < eps) {
- SWAP_FLOAT(a1x, b1x, xi); /*abuse xi*/
- SWAP_FLOAT(a1y, b1y, xi);
- SWAP_FLOAT(a2x, b2x, xi);
- SWAP_FLOAT(a2y, b2y, xi);
- }
-
- if (fabs(a1x-a2x) < eps) { /* verticle line */
- if (fabs(b1x-b2x) < eps){ /*verticle second line */
- Py_RETURN_NONE; /* 2 verticle lines dont intersect. */
- }
- else if (fabs(b1y-b2y) < eps) {
- /*X of vert, Y of hoz. no calculation needed */
- newvec[0]= a1x;
- newvec[1]= b1y;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
-
- yi = (float)(((b1y / fabs(b1x - b2x)) * fabs(b2x - a1x)) + ((b2y / fabs(b1x - b2x)) * fabs(b1x - a1x)));
-
- if (yi > MAX2(a1y, a2y)) {/* New point above seg1's vert line */
- Py_RETURN_NONE;
- } else if (yi < MIN2(a1y, a2y)) { /* New point below seg1's vert line */
- Py_RETURN_NONE;
- }
- newvec[0]= a1x;
- newvec[1]= yi;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- } else if (fabs(a2y-a1y) < eps) { /* hoz line1 */
- if (fabs(b2y-b1y) < eps) { /*hoz line2*/
- Py_RETURN_NONE; /*2 hoz lines dont intersect*/
- }
-
- /* Can skip vert line check for seg 2 since its covered above. */
- xi = (float)(((b1x / fabs(b1y - b2y)) * fabs(b2y - a1y)) + ((b2x / fabs(b1y - b2y)) * fabs(b1y - a1y)));
- if (xi > MAX2(a1x, a2x)) { /* New point right of hoz line1's */
- Py_RETURN_NONE;
- } else if (xi < MIN2(a1x, a2x)) { /*New point left of seg1's hoz line */
- Py_RETURN_NONE;
- }
- newvec[0]= xi;
- newvec[1]= a1y;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
-
- b1 = (a2y-a1y)/(a2x-a1x);
- b2 = (b2y-b1y)/(b2x-b1x);
- a1 = a1y-b1*a1x;
- a2 = b1y-b2*b1x;
-
- if (b1 - b2 == 0.0) {
- Py_RETURN_NONE;
- }
-
- xi = - (a1-a2)/(b1-b2);
- yi = a1+b1*xi;
- if ((a1x-xi)*(xi-a2x) >= 0 && (b1x-xi)*(xi-b2x) >= 0 && (a1y-yi)*(yi-a2y) >= 0 && (b1y-yi)*(yi-b2y)>=0) {
- newvec[0]= xi;
- newvec[1]= yi;
- return newVectorObject(newvec, 2, Py_NEW, NULL);
- }
- Py_RETURN_NONE;
-}
-
-static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args )
-{
- VectorObject *pt, *line_1, *line_2;
- float pt_in[3], pt_out[3], l1[3], l2[3];
- float lambda;
- PyObject *ret;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!",
- &vector_Type, &pt,
- &vector_Type, &line_1,
- &vector_Type, &line_2)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 3 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
- return NULL;
-
- /* accept 2d verts */
- if (pt->size==3) { VECCOPY(pt_in, pt->vec);}
- else { pt_in[2]=0.0; VECCOPY2D(pt_in, pt->vec) }
-
- if (line_1->size==3) { VECCOPY(l1, line_1->vec);}
- else { l1[2]=0.0; VECCOPY2D(l1, line_1->vec) }
-
- if (line_2->size==3) { VECCOPY(l2, line_2->vec);}
- else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
-
- /* do the calculation */
- lambda = closest_to_line_v3( pt_out,pt_in, l1, l2);
-
- ret = PyTuple_New(2);
- PyTuple_SET_ITEM( ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL) );
- PyTuple_SET_ITEM( ret, 1, PyFloat_FromDouble(lambda) );
- return ret;
-}
-
-static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args )
-{
- VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!",
- &vector_Type, &pt_vec,
- &vector_Type, &tri_p1,
- &vector_Type, &tri_p2,
- &vector_Type, &tri_p3)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
- return NULL;
-
- return PyLong_FromLong(isect_point_tri_v2(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
-}
-
-static PyObject *M_Geometry_PointInQuad2D( PyObject * self, PyObject * args )
-{
- VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!O!",
- &vector_Type, &pt_vec,
- &vector_Type, &quad_p1,
- &vector_Type, &quad_p2,
- &vector_Type, &quad_p3,
- &vector_Type, &quad_p4)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 5 vector types\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
- return NULL;
-
- return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
-}
-
-static int boxPack_FromPyObject(PyObject * value, boxPack **boxarray )
-{
- int len, i;
- PyObject *list_item, *item_1, *item_2;
- boxPack *box;
-
-
- /* Error checking must already be done */
- if( !PyList_Check( value ) ) {
- PyErr_SetString( PyExc_TypeError, "can only back a list of [x,y,x,w]" );
- return -1;
- }
-
- len = PyList_Size( value );
-
- (*boxarray) = MEM_mallocN( len*sizeof(boxPack), "boxPack box");
-
-
- for( i = 0; i < len; i++ ) {
- list_item = PyList_GET_ITEM( value, i );
- if( !PyList_Check( list_item ) || PyList_Size( list_item ) < 4 ) {
- MEM_freeN(*boxarray);
- PyErr_SetString( PyExc_TypeError, "can only back a list of [x,y,x,w]" );
- return -1;
- }
-
- box = (*boxarray)+i;
-
- item_1 = PyList_GET_ITEM(list_item, 2);
- item_2 = PyList_GET_ITEM(list_item, 3);
-
- if (!PyNumber_Check(item_1) || !PyNumber_Check(item_2)) {
- MEM_freeN(*boxarray);
- PyErr_SetString( PyExc_TypeError, "can only back a list of 2d boxes [x,y,x,w]" );
- return -1;
- }
-
- box->w = (float)PyFloat_AsDouble( item_1 );
- box->h = (float)PyFloat_AsDouble( item_2 );
- box->index = i;
- /* verts will be added later */
- }
- return 0;
-}
-
-static void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
-{
- int len, i;
- PyObject *list_item;
- boxPack *box;
-
- len = PyList_Size( value );
-
- for( i = 0; i < len; i++ ) {
- box = (*boxarray)+i;
- list_item = PyList_GET_ITEM( value, box->index );
- PyList_SET_ITEM( list_item, 0, PyFloat_FromDouble( box->x ));
- PyList_SET_ITEM( list_item, 1, PyFloat_FromDouble( box->y ));
- }
- MEM_freeN(*boxarray);
-}
-
-
-static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * boxlist )
-{
- boxPack *boxarray = NULL;
- float tot_width, tot_height;
- int len;
- int error;
-
- if(!PyList_Check(boxlist)) {
- PyErr_SetString( PyExc_TypeError, "expected a sequence of boxes [[x,y,w,h], ... ]" );
- return NULL;
- }
-
- len = PyList_Size( boxlist );
-
- if (!len)
- return Py_BuildValue( "ff", 0.0, 0.0);
-
- error = boxPack_FromPyObject(boxlist, &boxarray);
- if (error!=0) return NULL;
-
- /* Non Python function */
- boxPack2D(boxarray, len, &tot_width, &tot_height);
-
- boxPack_ToPyObject(boxlist, &boxarray);
-
- return Py_BuildValue( "ff", tot_width, tot_height);
-}
-
-static PyObject *M_Geometry_BezierInterp( PyObject * self, PyObject * args )
-{
- VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
- int resolu;
- int dims;
- int i;
- float *coord_array, *fp;
- PyObject *list;
-
- float k1[4] = {0.0, 0.0, 0.0, 0.0};
- float h1[4] = {0.0, 0.0, 0.0, 0.0};
- float k2[4] = {0.0, 0.0, 0.0, 0.0};
- float h2[4] = {0.0, 0.0, 0.0, 0.0};
-
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!i",
- &vector_Type, &vec_k1,
- &vector_Type, &vec_h1,
- &vector_Type, &vec_h2,
- &vector_Type, &vec_k2, &resolu) || (resolu<=1)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 4 vector types and an int greater then 1\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
- return NULL;
-
- dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
-
- for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
- for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
- for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
- for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
-
- coord_array = MEM_callocN(dims * (resolu) * sizeof(float), "BezierInterp");
- for(i=0; i<dims; i++) {
- forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
- }
-
- list= PyList_New(resolu);
- fp= coord_array;
- for(i=0; i<resolu; i++, fp= fp+dims) {
- PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
- }
- MEM_freeN(coord_array);
- return list;
-}
-
-static PyObject *M_Geometry_BarycentricTransform(PyObject * self, PyObject * args)
-{
- VectorObject *vec_pt;
- VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
- VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
- float vec[3];
-
- if( !PyArg_ParseTuple ( args, "O!O!O!O!O!O!O!",
- &vector_Type, &vec_pt,
- &vector_Type, &vec_t1_src,
- &vector_Type, &vec_t2_src,
- &vector_Type, &vec_t3_src,
- &vector_Type, &vec_t1_tar,
- &vector_Type, &vec_t2_tar,
- &vector_Type, &vec_t3_tar) || ( vec_pt->size != 3 ||
- vec_t1_src->size != 3 ||
- vec_t2_src->size != 3 ||
- vec_t3_src->size != 3 ||
- vec_t1_tar->size != 3 ||
- vec_t2_tar->size != 3 ||
- vec_t3_tar->size != 3)
- ) {
- PyErr_SetString( PyExc_TypeError, "expected 7, 3D vector types\n" );
- return NULL;
- }
-
- barycentric_transform(vec, vec_pt->vec,
- vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
- vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
-
- return newVectorObject(vec, 3, Py_NEW, NULL);
-}
-
-struct PyMethodDef M_Geometry_methods[] = {
- {"Intersect", ( PyCFunction ) M_Geometry_Intersect, METH_VARARGS, M_Geometry_Intersect_doc},
- {"TriangleArea", ( PyCFunction ) M_Geometry_TriangleArea, METH_VARARGS, M_Geometry_TriangleArea_doc},
- {"TriangleNormal", ( PyCFunction ) M_Geometry_TriangleNormal, METH_VARARGS, M_Geometry_TriangleNormal_doc},
- {"QuadNormal", ( PyCFunction ) M_Geometry_QuadNormal, METH_VARARGS, M_Geometry_QuadNormal_doc},
- {"LineIntersect", ( PyCFunction ) M_Geometry_LineIntersect, METH_VARARGS, M_Geometry_LineIntersect_doc},
- {"PolyFill", ( PyCFunction ) M_Geometry_PolyFill, METH_O, M_Geometry_PolyFill_doc},
- {"LineIntersect2D", ( PyCFunction ) M_Geometry_LineIntersect2D, METH_VARARGS, M_Geometry_LineIntersect2D_doc},
- {"ClosestPointOnLine", ( PyCFunction ) M_Geometry_ClosestPointOnLine, METH_VARARGS, M_Geometry_ClosestPointOnLine_doc},
- {"PointInTriangle2D", ( PyCFunction ) M_Geometry_PointInTriangle2D, METH_VARARGS, M_Geometry_PointInTriangle2D_doc},
- {"PointInQuad2D", ( PyCFunction ) M_Geometry_PointInQuad2D, METH_VARARGS, M_Geometry_PointInQuad2D_doc},
- {"BoxPack2D", ( PyCFunction ) M_Geometry_BoxPack2D, METH_O, M_Geometry_BoxPack2D_doc},
- {"BezierInterp", ( PyCFunction ) M_Geometry_BezierInterp, METH_VARARGS, M_Geometry_BezierInterp_doc},
- {"BarycentricTransform", ( PyCFunction ) M_Geometry_BarycentricTransform, METH_VARARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-static struct PyModuleDef M_Geometry_module_def = {
- PyModuleDef_HEAD_INIT,
- "geometry", /* m_name */
- M_Geometry_doc, /* m_doc */
- 0, /* m_size */
- M_Geometry_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
-};
-
-/*----------------------------MODULE INIT-------------------------*/
-PyObject *Geometry_Init(void)
-{
- PyObject *submodule;
-
- submodule = PyModule_Create(&M_Geometry_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), M_Geometry_module_def.m_name, submodule);
-
- return (submodule);
-}
diff --git a/source/blender/python/generic/mathutils.c b/source/blender/python/generic/mathutils.c
index a643e6621b2..b925dfc0d32 100644
--- a/source/blender/python/generic/mathutils.c
+++ b/source/blender/python/generic/mathutils.c
@@ -37,15 +37,34 @@
* - Mathutils.Slerp --> quat.slerp(other, fac)
* - Mathutils.Rand: removed, use pythons random module
* - Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
+ * - Mathutils.OrthoProjectionMatrix(plane, size, axis) --> Mathutils.OrthoProjectionMatrix(axis, size); merge axis & plane args
+ * - Mathutils.ShearMatrix(plane, factor, size) --> Mathutils.ShearMatrix(plane, size, factor); swap size & factor args, match other constructors.
* - Matrix.scalePart --> Matrix.scale_part
* - Matrix.translationPart --> Matrix.translation_part
* - Matrix.rotationPart --> Matrix.rotation_part
+ * - mathutils.Matrix.Shear(plane, fac, size), now takes a pair of floats for 3x3 or 4x4 shear factor.
* - toMatrix --> to_matrix
* - toEuler --> to_euler
* - toQuat --> to_quat
* - Vector.toTrackQuat --> Vector.to_track_quat
+ * - Vector.rotate(axis, angle) --> rotate(other), where other can be Euler/Quaternion/Matrix.
* - Quaternion * Quaternion --> cross product (not dot product)
- *
+ * - Euler.rotate(angle, axis) --> Euler.rotate_axis(axis, angle)
+ * - Euler.unique() *removed*, not a standard function only toggled different rotations.
+ * - Matrix.rotation_part() -> to_3x3()
+ * - Matrix.scale_part() -> to_scale()
+ * - Matrix.translation_part() -> to_translation()
+ * - Matrix.resize4x4() -> resize_4x4()
+ * - Euler.to_quat() -> to_quaternion()
+ * - Matrix.to_quat() -> to_quaternion()
+ * resizing nolonger returns the resized value.
+ * - Vector.resize2D -> resize_2d
+ * - Vector.resize3D -> resize_3d
+ * - Vector.resize4D -> resize_4d
+ * added new functions.
+ * - Vector.to_2d()
+ * - Vector.to_3d()
+ * - Vector.to_4d()
* moved into class functions.
* - Mathutils.RotationMatrix -> mathutils.Matrix.Rotation
* - Mathutils.ScaleMatrix -> mathutils.Matrix.Scale
@@ -54,20 +73,37 @@
* - Mathutils.OrthoProjectionMatrix -> mathutils.Matrix.OrthoProjection
*
* Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
+ * - geometry.Intersect -> intersect_ray_tri
+ * - geometry.ClosestPointOnLine -> intersect_point_line
+ * - geometry.PointInTriangle2D -> intersect_point_tri_2d
+ * - geometry.PointInQuad2D -> intersect_point_quad_2d
+ * - geometry.LineIntersect -> intersect_line_line
+ * - geometry.LineIntersect2D -> intersect_line_line_2d
+ * - geometry.BezierInterp -> interpolate_bezier
+ * - geometry.TriangleArea -> area_tri
+ * - geometry.QuadNormal, TriangleNormal -> normal
+ * - geometry.PolyFill -> tesselate_polygon
+ * - geometry.BoxPack2D -> box_pack_2d
+ * - geometry.BarycentricTransform -> barycentric_transform
*/
+#include <Python.h>
+
#include "mathutils.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+
//-------------------------DOC STRINGS ---------------------------
static char M_Mathutils_doc[] =
-"This module provides access to matrices, eulers, quaternions and vectors.";
-
-/* helper functionm returns length of the 'value', -1 on error */
-int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
+"This module provides access to matrices, eulers, quaternions and vectors."
+;
+static int mathutils_array_parse_fast(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
{
PyObject *value_fast= NULL;
+ PyObject *item;
int i, size;
@@ -89,8 +125,8 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
i= size;
do {
i--;
- if(((array[i]= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i))) == -1.0) && PyErr_Occurred()) {
- PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d is not a float", error_prefix, i);
+ if(((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0) && PyErr_Occurred()) {
+ PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d expected a number, found '%.200s' type, ", error_prefix, i, Py_TYPE(item)->tp_name);
Py_DECREF(value_fast);
return -1;
}
@@ -100,6 +136,80 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
return size;
}
+/* helper functionm returns length of the 'value', -1 on error */
+int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix)
+{
+#if 1 /* approx 6x speedup for mathutils types */
+ int size;
+
+ if( (VectorObject_Check(value) && (size= ((VectorObject *)value)->size)) ||
+ (EulerObject_Check(value) && (size= 3)) ||
+ (QuaternionObject_Check(value) && (size= 4)) ||
+ (ColorObject_Check(value) && (size= 3))
+ ) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+
+ if(size > array_max || size < array_min) {
+ if (array_max == array_min) PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected %d", error_prefix, size, array_max);
+ else PyErr_Format(PyExc_ValueError, "%.200s: sequence size is %d, expected [%d - %d]", error_prefix, size, array_min, array_max);
+ return -1;
+ }
+
+ memcpy(array, ((BaseMathObject *)value)->data, size * sizeof(float));
+ return size;
+ }
+ else
+#endif
+ {
+ return mathutils_array_parse_fast(array, array_min, array_max, value, error_prefix);
+ }
+}
+
+int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix)
+{
+ if(EulerObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else {
+ eulO_to_mat3(rmat, ((EulerObject *)value)->eul, ((EulerObject *)value)->order);
+ return 0;
+ }
+ }
+ else if (QuaternionObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else {
+ float tquat[4];
+ normalize_qt_qt(tquat, ((QuaternionObject *)value)->quat);
+ quat_to_mat3(rmat, tquat);
+ return 0;
+ }
+ }
+ else if (MatrixObject_Check(value)) {
+ if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ return -1;
+ }
+ else if(((MatrixObject *)value)->col_size < 3 || ((MatrixObject *)value)->row_size < 3) {
+ PyErr_Format(PyExc_ValueError, "%.200s: matrix must have minimum 3x3 dimensions", error_prefix);
+ return -1;
+ }
+ else {
+ matrix_as_3x3(rmat, (MatrixObject *)value);
+ normalize_m3(rmat);
+ return 0;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s: expected a Euler, Quaternion or Matrix type, found %.200s", error_prefix, Py_TYPE(value)->tp_name);
+ return -1;
+ }
+}
+
+
//----------------------------------MATRIX FUNCTIONS--------------------
@@ -139,7 +249,7 @@ int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps)
/* Mathutils Callbacks */
/* for mathutils internal use only, eventually should re-alloc but to start with we only have a few users */
-Mathutils_Callback *mathutils_callbacks[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
+static Mathutils_Callback *mathutils_callbacks[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
int Mathutils_RegisterCallback(Mathutils_Callback *cb)
{
@@ -163,7 +273,7 @@ int _BaseMathObject_ReadCallback(BaseMathObject *self)
return 1;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
return 0;
}
@@ -174,7 +284,7 @@ int _BaseMathObject_WriteCallback(BaseMathObject *self)
return 1;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
return 0;
}
@@ -185,7 +295,7 @@ int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index)
return 1;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
return 0;
}
@@ -196,13 +306,13 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
return 1;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
return 0;
}
/* BaseMathObject generic functions for all mathutils types */
char BaseMathObject_Owner_doc[] = "The item this is wrapping or None (readonly).";
-PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
+PyObject *BaseMathObject_getOwner(BaseMathObject *self, void *UNUSED(closure))
{
PyObject *ret= self->cb_user ? self->cb_user : Py_None;
Py_INCREF(ret);
@@ -210,23 +320,37 @@ PyObject *BaseMathObject_getOwner( BaseMathObject * self, void *type )
}
char BaseMathObject_Wrapped_doc[] = "True when this object wraps external data (readonly).\n\n:type: boolean";
-PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void *type )
+PyObject *BaseMathObject_getWrapped(BaseMathObject *self, void *UNUSED(closure))
{
return PyBool_FromLong((self->wrapped == Py_WRAP) ? 1:0);
}
-void BaseMathObject_dealloc(BaseMathObject * self)
+int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->cb_user);
+ return 0;
+}
+
+int BaseMathObject_clear(BaseMathObject *self)
+{
+ Py_CLEAR(self->cb_user);
+ return 0;
+}
+
+void BaseMathObject_dealloc(BaseMathObject *self)
{
/* only free non wrapped */
- if(self->wrapped != Py_WRAP)
+ if(self->wrapped != Py_WRAP) {
PyMem_Free(self->data);
+ }
+
+ BaseMathObject_clear(self);
- Py_XDECREF(self->cb_user);
Py_TYPE(self)->tp_free(self); // PyObject_DEL(self); // breaks subtypes
}
/*----------------------------MODULE INIT-------------------------*/
-struct PyMethodDef M_Mathutils_methods[] = {
+static struct PyMethodDef M_Mathutils_methods[] = {
{NULL, NULL, 0, NULL}
};
@@ -236,16 +360,17 @@ static struct PyModuleDef M_Mathutils_module_def = {
M_Mathutils_doc, /* m_doc */
0, /* m_size */
M_Mathutils_methods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
};
-PyObject *Mathutils_Init(void)
+PyMODINIT_FUNC BPyInit_mathutils(void)
{
PyObject *submodule;
-
+ PyObject *item;
+
if( PyType_Ready( &vector_Type ) < 0 )
return NULL;
if( PyType_Ready( &matrix_Type ) < 0 )
@@ -258,7 +383,6 @@ PyObject *Mathutils_Init(void)
return NULL;
submodule = PyModule_Create(&M_Mathutils_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), M_Mathutils_module_def.m_name, submodule);
/* each type has its own new() function */
PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
@@ -267,7 +391,15 @@ PyObject *Mathutils_Init(void)
PyModule_AddObject( submodule, "Quaternion", (PyObject *)&quaternion_Type );
PyModule_AddObject( submodule, "Color", (PyObject *)&color_Type );
+ /* submodule */
+ PyModule_AddObject( submodule, "geometry", (item=BPyInit_mathutils_geometry()));
+ /* XXX, python doesnt do imports with this usefully yet
+ * 'from mathutils.geometry import PolyFill'
+ * ...fails without this. */
+ PyDict_SetItemString(PyThreadState_GET()->interp->modules, "mathutils.geometry", item);
+ Py_INCREF(item);
+
mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb);
- return (submodule);
+ return submodule;
}
diff --git a/source/blender/python/generic/mathutils.h b/source/blender/python/generic/mathutils.h
index 85fbe3225ba..7d0644b3c76 100644
--- a/source/blender/python/generic/mathutils.h
+++ b/source/blender/python/generic/mathutils.h
@@ -28,10 +28,8 @@
*/
//Include this file for access to vector, quat, matrix, euler, etc...
-#ifndef EXPP_Mathutils_H
-#define EXPP_Mathutils_H
-
-#include <Python.h>
+#ifndef MATHUTILS_H
+#define MATHUTILS_H
/* Can cast different mathutils types to this, use for generic funcs */
@@ -50,25 +48,25 @@ typedef struct {
BASE_MATH_MEMBERS(data)
} BaseMathObject;
-#include "mathutils_vector.h"
-#include "mathutils_matrix.h"
-#include "mathutils_quat.h"
-#include "mathutils_euler.h"
-#include "mathutils_color.h"
+#include "mathutils_Vector.h"
+#include "mathutils_Matrix.h"
+#include "mathutils_Quaternion.h"
+#include "mathutils_Euler.h"
+#include "mathutils_Color.h"
+#include "mathutils_geometry.h"
PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * );
PyObject *BaseMathObject_getWrapped( BaseMathObject *self, void * );
+
+int BaseMathObject_traverse(BaseMathObject *self, visitproc visit, void *arg);
+int BaseMathObject_clear(BaseMathObject *self);
void BaseMathObject_dealloc(BaseMathObject * self);
-PyObject *Mathutils_Init(void);
-PyObject *Noise_Init(void); /* lazy, saves having own header */
+PyMODINIT_FUNC BPyInit_mathutils(void);
int EXPP_FloatsAreEqual(float A, float B, int floatSteps);
int EXPP_VectorsAreEqual(float *vecA, float *vecB, int size, int floatSteps);
-
-#define Py_PI 3.14159265358979323846
-
#define Py_NEW 1
#define Py_WRAP 2
@@ -103,5 +101,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
/* utility func */
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
+int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
-#endif /* EXPP_Mathutils_H */
+#endif /* MATHUTILS_H */
diff --git a/source/blender/python/generic/mathutils_color.c b/source/blender/python/generic/mathutils_Color.c
index 57d2838238c..047bda1b2c5 100644
--- a/source/blender/python/generic/mathutils_color.c
+++ b/source/blender/python/generic/mathutils_Color.c
@@ -22,19 +22,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#define COLOR_SIZE 3
//----------------------------------mathutils.Color() -------------------
//makes a new color for you to play with
-static PyObject *Color_new(PyTypeObject * type, PyObject * args, PyObject * kwargs)
+static PyObject *Color_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
float col[3]= {0.0f, 0.0f, 0.0f};
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Color(): takes no keyword args");
+ return NULL;
+ }
+
switch(PyTuple_GET_SIZE(args)) {
case 0:
break;
@@ -81,9 +88,9 @@ static char Color_copy_doc[] =
" :return: A copy of the color.\n"
" :rtype: :class:`Color`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n";
-
-static PyObject *Color_copy(ColorObject * self, PyObject *args)
+" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n"
+;
+static PyObject *Color_copy(ColorObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -111,54 +118,46 @@ static PyObject *Color_repr(ColorObject * self)
//------------------------tp_richcmpr
//returns -1 execption, 0 false, 1 true
-static PyObject* Color_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Color_richcmpr(PyObject *a, PyObject *b, int op)
{
- ColorObject *colA = NULL, *colB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(ColorObject_Check(objectA)) {
- colA = (ColorObject*)objectA;
- if(!BaseMath_ReadCallback(colA))
- return NULL;
- }
- if(ColorObject_Check(objectB)) {
- colB = (ColorObject*)objectB;
- if(!BaseMath_ReadCallback(colB))
+ if (ColorObject_Check(a) && ColorObject_Check(b)) {
+ ColorObject *colA= (ColorObject*)a;
+ ColorObject *colB= (ColorObject*)b;
+
+ if(!BaseMath_ReadCallback(colA) || !BaseMath_ReadCallback(colB))
return NULL;
- }
- if (!colA || !colB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ ok= EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1) ? 0 : -1;
}
- colA = (ColorObject*)objectA;
- colB = (ColorObject*)objectB;
-
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1);
- break;
- case Py_NE:
- result = !EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1);
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Color_len(ColorObject * self)
+static int Color_len(ColorObject *UNUSED(self))
{
return COLOR_SIZE;
}
@@ -193,7 +192,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject * value)
if(i<0) i= COLOR_SIZE-i;
if(i < 0 || i >= COLOR_SIZE){
- PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "color[attribute] = x: array assignment index out of range");
return -1;
}
@@ -208,7 +207,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject * value)
//sequence slice (get)
static PyObject *Color_slice(ColorObject * self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -217,15 +216,14 @@ static PyObject *Color_slice(ColorObject * self, int begin, int end)
CLAMP(begin, 0, COLOR_SIZE);
if (end<0) end= (COLOR_SIZE + 1) + end;
CLAMP(end, 0, COLOR_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->col[count]));
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->col[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
@@ -253,7 +251,7 @@ static int Color_ass_slice(ColorObject * self, int begin, int end, PyObject * se
for(i= 0; i < COLOR_SIZE; i++)
self->col[begin + i] = col[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -270,11 +268,11 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Color_slice(self, start, stop);
@@ -285,9 +283,7 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "color indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -305,7 +301,7 @@ static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *valu
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -316,9 +312,7 @@ static int Color_ass_subscript(ColorObject *self, PyObject *item, PyObject *valu
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "color indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "color indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -329,9 +323,9 @@ static PySequenceMethods Color_SeqMethods = {
(binaryfunc) NULL, /* sq_concat */
(ssizeargfunc) NULL, /* sq_repeat */
(ssizeargfunc) Color_item, /* sq_item */
- (ssizessizeargfunc) NULL, /* sq_slice, deprecated */
+ NULL, /* sq_slice, deprecated */
(ssizeobjargproc) Color_ass_item, /* sq_ass_item */
- (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */
+ NULL, /* sq_ass_slice, deprecated */
(objobjproc) NULL, /* sq_contains */
(binaryfunc) NULL, /* sq_inplace_concat */
(ssizeargfunc) NULL, /* sq_inplace_repeat */
@@ -394,7 +388,7 @@ static int Color_setChannelHSV(ColorObject * self, PyObject * value, void * type
}
/* color channel (HSV), color.h/s/v */
-static PyObject *Color_getHSV(ColorObject * self, void *type)
+static PyObject *Color_getHSV(ColorObject * self, void *UNUSED(closure))
{
float hsv[3];
PyObject *ret;
@@ -411,7 +405,7 @@ static PyObject *Color_getHSV(ColorObject * self, void *type)
return ret;
}
-static int Color_setHSV(ColorObject * self, PyObject * value, void * type)
+static int Color_setHSV(ColorObject * self, PyObject * value, void *UNUSED(closure))
{
float hsv[3];
@@ -434,80 +428,80 @@ static int Color_setHSV(ColorObject * self, PyObject * value, void * type)
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Color_getseters[] = {
- {"r", (getter)Color_getChannel, (setter)Color_setChannel, "Red color channel.\n\n:type: float", (void *)0},
- {"g", (getter)Color_getChannel, (setter)Color_setChannel, "Green color channel.\n\n:type: float", (void *)1},
- {"b", (getter)Color_getChannel, (setter)Color_setChannel, "Blue color channel.\n\n:type: float", (void *)2},
+ {(char *)"r", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Red color channel.\n\n:type: float", (void *)0},
+ {(char *)"g", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Green color channel.\n\n:type: float", (void *)1},
+ {(char *)"b", (getter)Color_getChannel, (setter)Color_setChannel, (char *)"Blue color channel.\n\n:type: float", (void *)2},
- {"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
- {"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
- {"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, "HSV Value component in [0, 1].\n\n:type: float", (void *)2},
+ {(char *)"h", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Hue component in [0, 1].\n\n:type: float", (void *)0},
+ {(char *)"s", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Saturation component in [0, 1].\n\n:type: float", (void *)1},
+ {(char *)"v", (getter)Color_getChannelHSV, (setter)Color_setChannelHSV, (char *)"HSV Value component in [0, 1].\n\n:type: float", (void *)2},
- {"hsv", (getter)Color_getHSV, (setter)Color_setHSV, "HSV Values in [0, 1].\n\n:type: float triplet", (void *)0},
+ {(char *)"hsv", (getter)Color_getHSV, (setter)Color_setHSV, (char *)"HSV Values in [0, 1].\n\n:type: float triplet", (void *)0},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Color_methods[] = {
- {"__copy__", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc},
- {"copy", (PyCFunction) Color_copy, METH_VARARGS, Color_copy_doc},
+ {"__copy__", (PyCFunction) Color_copy, METH_NOARGS, Color_copy_doc},
+ {"copy", (PyCFunction) Color_copy, METH_NOARGS, Color_copy_doc},
{NULL, NULL, 0, NULL}
};
//------------------PY_OBECT DEFINITION--------------------------
static char color_doc[] =
-"This object gives access to Colors in Blender.";
-
+"This object gives access to Colors in Blender."
+;
PyTypeObject color_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "color", //tp_name
+ "mathutils.Color", //tp_name
sizeof(ColorObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
- 0, //tp_print
- 0, //tp_getattr
- 0, //tp_setattr
- 0, //tp_compare
+ NULL, //tp_print
+ NULL, //tp_getattr
+ NULL, //tp_setattr
+ NULL, //tp_compare
(reprfunc) Color_repr, //tp_repr
- 0, //tp_as_number
+ NULL, //tp_as_number
&Color_SeqMethods, //tp_as_sequence
&Color_AsMapping, //tp_as_mapping
- 0, //tp_hash
- 0, //tp_call
- 0, //tp_str
- 0, //tp_getattro
- 0, //tp_setattro
- 0, //tp_as_buffer
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ NULL, //tp_hash
+ NULL, //tp_call
+ NULL, //tp_str
+ NULL, //tp_getattro
+ NULL, //tp_setattro
+ NULL, //tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, //tp_flags
color_doc, //tp_doc
- 0, //tp_traverse
- 0, //tp_clear
+ (traverseproc)BaseMathObject_traverse, //tp_traverse
+ (inquiry)BaseMathObject_clear, //tp_clear
(richcmpfunc)Color_richcmpr, //tp_richcompare
0, //tp_weaklistoffset
- 0, //tp_iter
- 0, //tp_iternext
+ NULL, //tp_iter
+ NULL, //tp_iternext
Color_methods, //tp_methods
- 0, //tp_members
+ NULL, //tp_members
Color_getseters, //tp_getset
- 0, //tp_base
- 0, //tp_dict
- 0, //tp_descr_get
- 0, //tp_descr_set
+ NULL, //tp_base
+ NULL, //tp_dict
+ NULL, //tp_descr_get
+ NULL, //tp_descr_set
0, //tp_dictoffset
- 0, //tp_init
- 0, //tp_alloc
+ NULL, //tp_init
+ NULL, //tp_alloc
Color_new, //tp_new
- 0, //tp_free
- 0, //tp_is_gc
- 0, //tp_bases
- 0, //tp_mro
- 0, //tp_cache
- 0, //tp_subclasses
- 0, //tp_weaklist
- 0 //tp_del
+ NULL, //tp_free
+ NULL, //tp_is_gc
+ NULL, //tp_bases
+ NULL, //tp_mro
+ NULL, //tp_cache
+ NULL, //tp_subclasses
+ NULL, //tp_weaklist
+ NULL //tp_del
};
//------------------------newColorObject (internal)-------------
//creates a new color object
@@ -519,28 +513,31 @@ PyObject *newColorObject(float *col, int type, PyTypeObject *base_type)
{
ColorObject *self;
- if(base_type) self = (ColorObject *)base_type->tp_alloc(base_type, 0);
- else self = PyObject_NEW(ColorObject, &color_Type);
+ self= base_type ? (ColorObject *)base_type->tp_alloc(base_type, 0) :
+ (ColorObject *)PyObject_GC_New(ColorObject, &color_Type);
- /* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ if(self) {
+ /* init callbacks as NULL */
+ self->cb_user= NULL;
+ self->cb_type= self->cb_subtype= 0;
- if(type == Py_WRAP){
- self->col = col;
- self->wrapped = Py_WRAP;
- }
- else if (type == Py_NEW){
- self->col = PyMem_Malloc(COLOR_SIZE * sizeof(float));
- if(col)
- copy_v3_v3(self->col, col);
- else
- zero_v3(self->col);
-
- self->wrapped = Py_NEW;
- }
- else {
- return NULL;
+ if(type == Py_WRAP){
+ self->col = col;
+ self->wrapped = Py_WRAP;
+ }
+ else if (type == Py_NEW){
+ self->col = PyMem_Malloc(COLOR_SIZE * sizeof(float));
+ if(col)
+ copy_v3_v3(self->col, col);
+ else
+ zero_v3(self->col);
+
+ self->wrapped = Py_NEW;
+ }
+ else {
+ PyErr_SetString(PyExc_RuntimeError, "Color(): invalid type");
+ return NULL;
+ }
}
return (PyObject *)self;
diff --git a/source/blender/python/generic/mathutils_color.h b/source/blender/python/generic/mathutils_Color.h
index 02b27d86817..619cccbe085 100644
--- a/source/blender/python/generic/mathutils_color.h
+++ b/source/blender/python/generic/mathutils_Color.h
@@ -28,10 +28,8 @@
*
*/
-#ifndef EXPP_color_h
-#define EXPP_color_h
-
-#include <Python.h>
+#ifndef MATHUTILS_COLOR_H
+#define MATHUTILS_COLOR_H
extern PyTypeObject color_Type;
#define ColorObject_Check(_v) PyObject_TypeCheck((_v), &color_Type)
@@ -49,4 +47,4 @@ blender (stored in blend_data). This is an either/or struct not both*/
PyObject *newColorObject( float *col, int type, PyTypeObject *base_type);
PyObject *newColorObject_cb(PyObject *cb_user, int cb_type, int cb_subtype);
-#endif /* EXPP_color_h */
+#endif /* MATHUTILS_COLOR_H */
diff --git a/source/blender/python/generic/mathutils_euler.c b/source/blender/python/generic/mathutils_Euler.c
index 84845002ce8..95e7483d7be 100644
--- a/source/blender/python/generic/mathutils_euler.c
+++ b/source/blender/python/generic/mathutils_Euler.c
@@ -20,16 +20,18 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
+ *
* Contributor(s): Joseph Gilbert
*
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#ifndef int32_t
#include "BLO_sys_types.h"
@@ -39,14 +41,19 @@
//----------------------------------mathutils.Euler() -------------------
//makes a new euler for you to play with
-static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwargs)
+static PyObject *Euler_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *seq= NULL;
- char *order_str= NULL;
+ const char *order_str= NULL;
float eul[EULER_SIZE]= {0.0f, 0.0f, 0.0f};
short order= EULER_ORDER_XYZ;
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Euler(): takes no keyword args");
+ return NULL;
+ }
+
if(!PyArg_ParseTuple(args, "|Os:mathutils.Euler", &seq, &order_str))
return NULL;
@@ -62,7 +69,14 @@ static PyObject *Euler_new(PyTypeObject * type, PyObject * args, PyObject * kwar
return NULL;
break;
}
- return newEulerObject(eul, order, Py_NEW, NULL);
+ return newEulerObject(eul, order, Py_NEW, type);
+}
+
+/* internal use, assuem read callback is done */
+static const char *euler_order_str(EulerObject *self)
+{
+ static const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"};
+ return order[self->order-EULER_ORDER_XYZ];
}
short euler_order_from_string(const char *str, const char *error_prefix)
@@ -107,146 +121,77 @@ static PyObject *Euler_ToTupleExt(EulerObject *self, int ndigits)
//-----------------------------METHODS----------------------------
//return a quaternion representation of the euler
-static char Euler_ToQuat_doc[] =
-".. method:: to_quat()\n"
+static char Euler_to_quaternion_doc[] =
+".. method:: to_quaternion()\n"
"\n"
" Return a quaternion representation of the euler.\n"
"\n"
" :return: Quaternion representation of the euler.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Euler_ToQuat(EulerObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Euler_to_quaternion(EulerObject * self)
{
float quat[4];
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order==EULER_ORDER_XYZ) eul_to_quat(quat, self->eul);
- else eulO_to_quat(quat, self->eul, self->order);
+ eulO_to_quat(quat, self->eul, self->order);
return newQuaternionObject(quat, Py_NEW, NULL);
}
//return a matrix representation of the euler
-static char Euler_ToMatrix_doc[] =
+static char Euler_to_matrix_doc[] =
".. method:: to_matrix()\n"
"\n"
" Return a matrix representation of the euler.\n"
"\n"
" :return: A 3x3 roation matrix representation of the euler.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *Euler_ToMatrix(EulerObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Euler_to_matrix(EulerObject * self)
{
- float mat[9] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
+ float mat[9];
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order==EULER_ORDER_XYZ) eul_to_mat3((float (*)[3])mat, self->eul);
- else eulO_to_mat3((float (*)[3])mat, self->eul, self->order);
+ eulO_to_mat3((float (*)[3])mat, self->eul, self->order);
return newMatrixObject(mat, 3, 3 , Py_NEW, NULL);
}
-//sets the x,y,z values to a unique euler rotation
-// TODO, check if this works with rotation order!!!
-static char Euler_Unique_doc[] =
-".. method:: unique()\n"
-"\n"
-" Calculate a unique rotation for this euler. Avoids gimble lock.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Euler_Unique(EulerObject * self)
-{
-#define PI_2 (Py_PI * 2.0)
-#define PI_HALF (Py_PI / 2.0)
-#define PI_INV (1.0 / Py_PI)
-
- double heading, pitch, bank;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- heading = self->eul[0];
- pitch = self->eul[1];
- bank = self->eul[2];
-
- //wrap heading in +180 / -180
- pitch += Py_PI;
- pitch -= floor(pitch * PI_INV) * PI_2;
- pitch -= Py_PI;
-
-
- if(pitch < -PI_HALF) {
- pitch = -Py_PI - pitch;
- heading += Py_PI;
- bank += Py_PI;
- } else if(pitch > PI_HALF) {
- pitch = Py_PI - pitch;
- heading += Py_PI;
- bank += Py_PI;
- }
- //gimbal lock test
- if(fabs(pitch) > PI_HALF - 1e-4) {
- heading += bank;
- bank = 0.0f;
- } else {
- bank += Py_PI;
- bank -= (floor(bank * PI_INV)) * PI_2;
- bank -= Py_PI;
- }
-
- heading += Py_PI;
- heading -= (floor(heading * PI_INV)) * PI_2;
- heading -= Py_PI;
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
//sets the euler to 0,0,0
-static char Euler_Zero_doc[] =
+static char Euler_zero_doc[] =
".. method:: zero()\n"
"\n"
" Set all values to zero.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Euler_Zero(EulerObject * self)
+;
+static PyObject *Euler_zero(EulerObject * self)
{
- self->eul[0] = 0.0;
- self->eul[1] = 0.0;
- self->eul[2] = 0.0;
+ zero_v3(self->eul);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-static char Euler_Rotate_doc[] =
-".. method:: rotate(angle, axis)\n"
+static char Euler_rotate_axis_doc[] =
+".. method:: rotate_axis(axis, angle)\n"
"\n"
" Rotates the euler a certain amount and returning a unique euler rotation (no 720 degree pitches).\n"
"\n"
-" :arg angle: angle in radians.\n"
-" :type angle: float\n"
" :arg axis: single character in ['X, 'Y', 'Z'].\n"
" :type axis: string\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Euler`";
-
-static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
+" :arg angle: angle in radians.\n"
+" :type angle: float\n"
+;
+static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
{
float angle = 0.0f;
- char *axis;
+ const char *axis;
- if(!PyArg_ParseTuple(args, "fs:rotate", &angle, &axis)){
+ if(!PyArg_ParseTuple(args, "sf:rotate", &axis, &angle)){
PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected angle (float) and axis (x,y,z)");
return NULL;
}
@@ -258,46 +203,63 @@ static PyObject *Euler_Rotate(EulerObject * self, PyObject *args)
if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order == EULER_ORDER_XYZ) rotate_eul(self->eul, *axis, angle);
- else rotate_eulO(self->eul, self->order, *axis, angle);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ rotate_eulO(self->eul, self->order, *axis, angle);
+
+ (void)BaseMath_WriteCallback(self);
+
+ Py_RETURN_NONE;
+}
+
+static char Euler_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the euler a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Euler_rotate(EulerObject * self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "euler.rotate(value)") == -1)
+ return NULL;
+
+ eulO_to_mat3(self_rmat, self->eul, self->order);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
+
+ mat3_to_compatible_eulO(self->eul, self->eul, self->order, rmat);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-static char Euler_MakeCompatible_doc[] =
+static char Euler_make_compatible_doc[] =
".. method:: make_compatible(other)\n"
"\n"
" Make this euler compatible with another, so interpolating between them works as intended.\n"
"\n"
-" :arg other: make compatible with this rotation.\n"
-" :type other: :class:`Euler`\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Euler`\n"
-"\n"
-" .. note:: the order of eulers must match or an exception is raised.\n";
-
-static PyObject *Euler_MakeCompatible(EulerObject * self, EulerObject *value)
+" .. note:: the rotation order is not taken into account for this function.\n"
+;
+static PyObject *Euler_make_compatible(EulerObject * self, PyObject *value)
{
- if(!EulerObject_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "euler.make_compatible(euler): expected a single euler argument.");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ float teul[EULER_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- if(self->order != value->order) {
- PyErr_SetString(PyExc_ValueError, "euler.make_compatible(euler): rotation orders don't match\n");
+ if(mathutils_array_parse(teul, EULER_SIZE, EULER_SIZE, value, "euler.make_compatible(other), invalid 'other' arg") == -1)
return NULL;
- }
- compatible_eul(self->eul, value->eul);
+ compatible_eul(self->eul, teul);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
+ (void)BaseMath_WriteCallback(self);
+
+ Py_RETURN_NONE;
}
//----------------------------Euler.rotate()-----------------------
@@ -311,9 +273,9 @@ static char Euler_copy_doc[] =
" :return: A copy of the euler.\n"
" :rtype: :class:`Euler`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n";
-
-static PyObject *Euler_copy(EulerObject * self, PyObject *args)
+" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n"
+;
+static PyObject *Euler_copy(EulerObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -327,68 +289,58 @@ static PyObject *Euler_copy(EulerObject * self, PyObject *args)
static PyObject *Euler_repr(EulerObject * self)
{
PyObject *ret, *tuple;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
tuple= Euler_ToTupleExt(self, -1);
- ret= PyUnicode_FromFormat("Euler(%R)", tuple);
+ ret= PyUnicode_FromFormat("Euler(%R, '%s')", tuple, euler_order_str(self));
Py_DECREF(tuple);
return ret;
}
-//------------------------tp_richcmpr
-//returns -1 execption, 0 false, 1 true
-static PyObject* Euler_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Euler_richcmpr(PyObject *a, PyObject *b, int op)
{
- EulerObject *eulA = NULL, *eulB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(EulerObject_Check(objectA)) {
- eulA = (EulerObject*)objectA;
- if(!BaseMath_ReadCallback(eulA))
- return NULL;
- }
- if(EulerObject_Check(objectB)) {
- eulB = (EulerObject*)objectB;
- if(!BaseMath_ReadCallback(eulB))
+ if (EulerObject_Check(a) && EulerObject_Check(b)) {
+ EulerObject *eulA= (EulerObject*)a;
+ EulerObject *eulB= (EulerObject*)b;
+
+ if(!BaseMath_ReadCallback(eulA) || !BaseMath_ReadCallback(eulB))
return NULL;
- }
- if (!eulA || !eulB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
- eulA = (EulerObject*)objectA;
- eulB = (EulerObject*)objectB;
-
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1);
- break;
- case Py_NE:
- result = !EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1);
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
+ ok= ((eulA->order == eulB->order) && EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1)) ? 0 : -1;
}
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Euler_len(EulerObject * self)
+static int Euler_len(EulerObject *UNUSED(self))
{
return EULER_SIZE;
}
@@ -397,7 +349,7 @@ static int Euler_len(EulerObject * self)
static PyObject *Euler_item(EulerObject * self, int i)
{
if(i<0) i= EULER_SIZE-i;
-
+
if(i < 0 || i >= EULER_SIZE) {
PyErr_SetString(PyExc_IndexError, "euler[attribute]: array index out of range");
return NULL;
@@ -411,7 +363,7 @@ static PyObject *Euler_item(EulerObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
+static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
{
float f = PyFloat_AsDouble(value);
@@ -421,12 +373,12 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
}
if(i<0) i= EULER_SIZE-i;
-
+
if(i < 0 || i >= EULER_SIZE){
- PyErr_SetString(PyExc_IndexError, "euler[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "euler[attribute] = x: array assignment index out of range");
return -1;
}
-
+
self->eul[i] = f;
if(!BaseMath_WriteIndexCallback(self, i))
@@ -438,7 +390,7 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject * value)
//sequence slice (get)
static PyObject *Euler_slice(EulerObject * self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -447,15 +399,14 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end)
CLAMP(begin, 0, EULER_SIZE);
if (end<0) end= (EULER_SIZE + 1) + end;
CLAMP(end, 0, EULER_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
+ tuple= PyTuple_New(end - begin);
for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->eul[count]));
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->eul[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
@@ -483,7 +434,7 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end, PyObject * se
for(i= 0; i < EULER_SIZE; i++)
self->eul[begin + i] = eul[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -500,11 +451,11 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Euler_slice(self, start, stop);
@@ -515,9 +466,7 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "euler indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "euler indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -536,7 +485,7 @@ static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *valu
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -547,9 +496,7 @@ static int Euler_ass_subscript(EulerObject *self, PyObject *item, PyObject *valu
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "euler indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "euler indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -577,37 +524,35 @@ static PyMappingMethods Euler_AsMapping = {
/*
* euler axis, euler.x/y/z
*/
-static PyObject *Euler_getAxis( EulerObject * self, void *type )
+static PyObject *Euler_getAxis(EulerObject *self, void *type )
{
return Euler_item(self, GET_INT_FROM_POINTER(type));
}
-static int Euler_setAxis( EulerObject * self, PyObject * value, void * type )
+static int Euler_setAxis(EulerObject *self, PyObject *value, void *type)
{
return Euler_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
/* rotation order */
-static PyObject *Euler_getOrder(EulerObject *self, void *type)
+static PyObject *Euler_getOrder(EulerObject *self, void *UNUSED(closure))
{
- const char order[][4] = {"XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX"};
-
if(!BaseMath_ReadCallback(self)) /* can read order too */
return NULL;
- return PyUnicode_FromString(order[self->order-EULER_ORDER_XYZ]);
+ return PyUnicode_FromString(euler_order_str(self));
}
-static int Euler_setOrder( EulerObject * self, PyObject * value, void * type )
+static int Euler_setOrder(EulerObject *self, PyObject *value, void *UNUSED(closure))
{
- char *order_str= _PyUnicode_AsString(value);
+ const char *order_str= _PyUnicode_AsString(value);
short order= euler_order_from_string(order_str, "euler.order");
if(order == -1)
return -1;
self->order= order;
- BaseMath_WriteCallback(self); /* order can be written back */
+ (void)BaseMath_WriteCallback(self); /* order can be written back */
return 0;
}
@@ -615,81 +560,81 @@ static int Euler_setOrder( EulerObject * self, PyObject * value, void * type )
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Euler_getseters[] = {
- {"x", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler X axis in radians.\n\n:type: float", (void *)0},
- {"y", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Y axis in radians.\n\n:type: float", (void *)1},
- {"z", (getter)Euler_getAxis, (setter)Euler_setAxis, "Euler Z axis in radians.\n\n:type: float", (void *)2},
- {"order", (getter)Euler_getOrder, (setter)Euler_setOrder, "Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
+ {(char *)"x", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler X axis in radians.\n\n:type: float", (void *)0},
+ {(char *)"y", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Y axis in radians.\n\n:type: float", (void *)1},
+ {(char *)"z", (getter)Euler_getAxis, (setter)Euler_setAxis, (char *)"Euler Z axis in radians.\n\n:type: float", (void *)2},
+ {(char *)"order", (getter)Euler_getOrder, (setter)Euler_setOrder, (char *)"Euler rotation order.\n\n:type: string in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX']", (void *)NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Euler_methods[] = {
- {"zero", (PyCFunction) Euler_Zero, METH_NOARGS, Euler_Zero_doc},
- {"unique", (PyCFunction) Euler_Unique, METH_NOARGS, Euler_Unique_doc},
- {"to_matrix", (PyCFunction) Euler_ToMatrix, METH_NOARGS, Euler_ToMatrix_doc},
- {"to_quat", (PyCFunction) Euler_ToQuat, METH_NOARGS, Euler_ToQuat_doc},
- {"rotate", (PyCFunction) Euler_Rotate, METH_VARARGS, Euler_Rotate_doc},
- {"make_compatible", (PyCFunction) Euler_MakeCompatible, METH_O, Euler_MakeCompatible_doc},
- {"__copy__", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc},
- {"copy", (PyCFunction) Euler_copy, METH_VARARGS, Euler_copy_doc},
+ {"zero", (PyCFunction) Euler_zero, METH_NOARGS, Euler_zero_doc},
+ {"to_matrix", (PyCFunction) Euler_to_matrix, METH_NOARGS, Euler_to_matrix_doc},
+ {"to_quaternion", (PyCFunction) Euler_to_quaternion, METH_NOARGS, Euler_to_quaternion_doc},
+ {"rotate_axis", (PyCFunction) Euler_rotate_axis, METH_VARARGS, Euler_rotate_axis_doc},
+ {"rotate", (PyCFunction) Euler_rotate, METH_O, Euler_rotate_doc},
+ {"make_compatible", (PyCFunction) Euler_make_compatible, METH_O, Euler_make_compatible_doc},
+ {"__copy__", (PyCFunction) Euler_copy, METH_NOARGS, Euler_copy_doc},
+ {"copy", (PyCFunction) Euler_copy, METH_NOARGS, Euler_copy_doc},
{NULL, NULL, 0, NULL}
};
//------------------PY_OBECT DEFINITION--------------------------
static char euler_doc[] =
-"This object gives access to Eulers in Blender.";
-
+"This object gives access to Eulers in Blender."
+;
PyTypeObject euler_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "euler", //tp_name
+ "mathutils.Euler", //tp_name
sizeof(EulerObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
- 0, //tp_print
- 0, //tp_getattr
- 0, //tp_setattr
- 0, //tp_compare
+ NULL, //tp_print
+ NULL, //tp_getattr
+ NULL, //tp_setattr
+ NULL, //tp_compare
(reprfunc) Euler_repr, //tp_repr
- 0, //tp_as_number
+ NULL, //tp_as_number
&Euler_SeqMethods, //tp_as_sequence
&Euler_AsMapping, //tp_as_mapping
- 0, //tp_hash
- 0, //tp_call
- 0, //tp_str
- 0, //tp_getattro
- 0, //tp_setattro
- 0, //tp_as_buffer
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ NULL, //tp_hash
+ NULL, //tp_call
+ NULL, //tp_str
+ NULL, //tp_getattro
+ NULL, //tp_setattro
+ NULL, //tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, //tp_flags
euler_doc, //tp_doc
- 0, //tp_traverse
- 0, //tp_clear
+ (traverseproc)BaseMathObject_traverse, //tp_traverse
+ (inquiry)BaseMathObject_clear, //tp_clear
(richcmpfunc)Euler_richcmpr, //tp_richcompare
0, //tp_weaklistoffset
- 0, //tp_iter
- 0, //tp_iternext
+ NULL, //tp_iter
+ NULL, //tp_iternext
Euler_methods, //tp_methods
- 0, //tp_members
+ NULL, //tp_members
Euler_getseters, //tp_getset
- 0, //tp_base
- 0, //tp_dict
- 0, //tp_descr_get
- 0, //tp_descr_set
+ NULL, //tp_base
+ NULL, //tp_dict
+ NULL, //tp_descr_get
+ NULL, //tp_descr_set
0, //tp_dictoffset
- 0, //tp_init
- 0, //tp_alloc
+ NULL, //tp_init
+ NULL, //tp_alloc
Euler_new, //tp_new
- 0, //tp_free
- 0, //tp_is_gc
- 0, //tp_bases
- 0, //tp_mro
- 0, //tp_cache
- 0, //tp_subclasses
- 0, //tp_weaklist
- 0 //tp_del
+ NULL, //tp_free
+ NULL, //tp_is_gc
+ NULL, //tp_bases
+ NULL, //tp_mro
+ NULL, //tp_cache
+ NULL, //tp_subclasses
+ NULL, //tp_weaklist
+ NULL //tp_del
};
//------------------------newEulerObject (internal)-------------
//creates a new euler object
@@ -701,31 +646,37 @@ PyObject *newEulerObject(float *eul, short order, int type, PyTypeObject *base_t
{
EulerObject *self;
- if(base_type) self = (EulerObject *)base_type->tp_alloc(base_type, 0);
- else self = PyObject_NEW(EulerObject, &euler_Type);
+ self= base_type ? (EulerObject *)base_type->tp_alloc(base_type, 0) :
+ (EulerObject *)PyObject_GC_New(EulerObject, &euler_Type);
- /* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
+ if(self) {
+ /* init callbacks as NULL */
+ self->cb_user= NULL;
+ self->cb_type= self->cb_subtype= 0;
- if(type == Py_WRAP) {
- self->eul = eul;
- self->wrapped = Py_WRAP;
- }
- else if (type == Py_NEW){
- self->eul = PyMem_Malloc(EULER_SIZE * sizeof(float));
- if(eul)
- copy_v3_v3(self->eul, eul);
- else
- zero_v3(self->eul);
-
- self->wrapped = Py_NEW;
- }
- else{
- return NULL;
+ if(type == Py_WRAP) {
+ self->eul = eul;
+ self->wrapped = Py_WRAP;
+ }
+ else if (type == Py_NEW) {
+ self->eul = PyMem_Malloc(EULER_SIZE * sizeof(float));
+ if(eul) {
+ copy_v3_v3(self->eul, eul);
+ }
+ else {
+ zero_v3(self->eul);
+ }
+
+ self->wrapped = Py_NEW;
+ }
+ else {
+ PyErr_SetString(PyExc_RuntimeError, "Euler(): invalid type");
+ return NULL;
+ }
+
+ self->order= order;
}
- self->order= order;
return (PyObject *)self;
}
diff --git a/source/blender/python/generic/mathutils_euler.h b/source/blender/python/generic/mathutils_Euler.h
index b8523c3b661..1bb26ec21d2 100644
--- a/source/blender/python/generic/mathutils_euler.h
+++ b/source/blender/python/generic/mathutils_Euler.h
@@ -28,10 +28,8 @@
*
*/
-#ifndef EXPP_euler_h
-#define EXPP_euler_h
-
-#include <Python.h>
+#ifndef MATHUTILS_EULER_H
+#define MATHUTILS_EULER_H
extern PyTypeObject euler_Type;
#define EulerObject_Check(_v) PyObject_TypeCheck((_v), &euler_Type)
@@ -54,4 +52,4 @@ PyObject *newEulerObject_cb(PyObject *cb_user, short order, int cb_type, int cb_
short euler_order_from_string(const char *str, const char *error_prefix);
-#endif /* EXPP_euler_h */
+#endif /* MATHUTILS_EULER_H */
diff --git a/source/blender/python/generic/mathutils_Matrix.c b/source/blender/python/generic/mathutils_Matrix.c
new file mode 100644
index 00000000000..07d4dc880c2
--- /dev/null
+++ b/source/blender/python/generic/mathutils_Matrix.c
@@ -0,0 +1,1895 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Michel Selten & Joseph Gilbert
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <Python.h>
+
+#include "mathutils.h"
+
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+static PyObject *Matrix_copy(MatrixObject *self);
+static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value);
+static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self);
+
+/* matrix vector callbacks */
+int mathutils_matrix_vector_cb_index= -1;
+
+static int mathutils_matrix_vector_check(BaseMathObject *bmo)
+{
+ MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ return BaseMath_ReadCallback(self);
+}
+
+static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype)
+{
+ MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ int i;
+
+ if(!BaseMath_ReadCallback(self))
+ return 0;
+
+ for(i=0; i < self->col_size; i++)
+ bmo->data[i]= self->matrix[subtype][i];
+
+ return 1;
+}
+
+static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
+{
+ MatrixObject *self= (MatrixObject *)bmo->cb_user;
+ int i;
+
+ if(!BaseMath_ReadCallback(self))
+ return 0;
+
+ for(i=0; i < self->col_size; i++)
+ self->matrix[subtype][i]= bmo->data[i];
+
+ (void)BaseMath_WriteCallback(self);
+ return 1;
+}
+
+static int mathutils_matrix_vector_get_index(BaseMathObject *bmo, int subtype, int index)
+{
+ MatrixObject *self= (MatrixObject *)bmo->cb_user;
+
+ if(!BaseMath_ReadCallback(self))
+ return 0;
+
+ bmo->data[index]= self->matrix[subtype][index];
+ return 1;
+}
+
+static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, int index)
+{
+ MatrixObject *self= (MatrixObject *)bmo->cb_user;
+
+ if(!BaseMath_ReadCallback(self))
+ return 0;
+
+ self->matrix[subtype][index]= bmo->data[index];
+
+ (void)BaseMath_WriteCallback(self);
+ return 1;
+}
+
+Mathutils_Callback mathutils_matrix_vector_cb = {
+ mathutils_matrix_vector_check,
+ mathutils_matrix_vector_get,
+ mathutils_matrix_vector_set,
+ mathutils_matrix_vector_get_index,
+ mathutils_matrix_vector_set_index
+};
+/* matrix vector callbacks, this is so you can do matrix[i][j] = val */
+
+//----------------------------------mathutils.Matrix() -----------------
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+//create a new matrix type
+static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): takes no keyword args");
+ return NULL;
+ }
+
+ switch(PyTuple_GET_SIZE(args)) {
+ case 0:
+ return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, type);
+ case 1:
+ {
+ PyObject *arg= PyTuple_GET_ITEM(args, 0);
+
+ const unsigned short row_size= PySequence_Size(arg); /* -1 is an error, size checks will accunt for this */
+
+ if(IN_RANGE_INCL(row_size, 2, 4)) {
+ PyObject *item= PySequence_GetItem(arg, 0);
+ const unsigned short col_size= PySequence_Size(item);
+ Py_XDECREF(item);
+
+ if(IN_RANGE_INCL(col_size, 2, 4)) {
+ /* sane row & col size, new matrix and assign as slice */
+ PyObject *matrix= newMatrixObject(NULL, row_size, col_size, Py_NEW, type);
+ if(Matrix_ass_slice((MatrixObject *)matrix, 0, INT_MAX, arg) == 0) {
+ return matrix;
+ }
+ else { /* matrix ok, slice assignment not */
+ Py_DECREF(matrix);
+ }
+ }
+ }
+ }
+ }
+
+ /* will overwrite error */
+ PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects no args or 2-4 numeric sequences");
+ return NULL;
+}
+
+static PyObject *matrix__apply_to_copy(PyNoArgsFunction matrix_func, MatrixObject *self)
+{
+ PyObject *ret= Matrix_copy(self);
+ PyObject *ret_dummy= matrix_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
+ }
+}
+
+/* when a matrix is 4x4 size but initialized as a 3x3, re-assign values for 4x4 */
+static void matrix_3x3_as_4x4(float mat[16])
+{
+ mat[10] = mat[8];
+ mat[9] = mat[7];
+ mat[8] = mat[6];
+ mat[7] = 0.0f;
+ mat[6] = mat[5];
+ mat[5] = mat[4];
+ mat[4] = mat[3];
+ mat[3] = 0.0f;
+}
+
+/*-----------------------CLASS-METHODS----------------------------*/
+
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_Rotation_doc[] =
+".. classmethod:: Rotation(angle, size, axis)\n"
+"\n"
+" Create a matrix representing a rotation.\n"
+"\n"
+" :arg angle: The angle of rotation desired, in radians.\n"
+" :type angle: float\n"
+" :arg size: The size of the rotation matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
+" :type axis: string or :class:`Vector`\n"
+" :return: A new rotation matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
+{
+ PyObject *vec= NULL;
+ const char *axis= NULL;
+ int matSize;
+ double angle; /* use double because of precision problems at high values */
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!PyArg_ParseTuple(args, "di|O", &angle, &matSize, &vec)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector");
+ return NULL;
+ }
+
+ if(vec && PyUnicode_Check(vec)) {
+ axis= _PyUnicode_AsString((PyObject *)vec);
+ if(axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') {
+ PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'");
+ return NULL;
+ }
+ else {
+ /* use the string */
+ vec= NULL;
+ }
+ }
+
+ /* clamp angle between -360 and 360 in radians */
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+
+ if(matSize != 2 && matSize != 3 && matSize != 4) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix");
+ return NULL;
+ }
+ if(matSize == 2 && (vec != NULL)) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis");
+ return NULL;
+ }
+ if((matSize == 3 || matSize == 4) && (axis == NULL) && (vec == NULL)) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): axis of rotation for 3d and 4d matrices is required");
+ return NULL;
+ }
+
+ /* check for valid vector/axis above */
+ if(vec) {
+ float tvec[3];
+
+ if (mathutils_array_parse(tvec, 3, 3, vec, "mathutils.RotationMatrix(angle, size, axis), invalid 'axis' arg") == -1)
+ return NULL;
+
+ axis_angle_to_mat3((float (*)[3])mat, tvec, angle);
+ }
+ else if(matSize == 2) {
+ //2D rotation matrix
+ mat[0] = (float) cos (angle);
+ mat[1] = (float) sin (angle);
+ mat[2] = -((float) sin(angle));
+ mat[3] = (float) cos(angle);
+ } else if(strcmp(axis, "X") == 0) {
+ //rotation around X
+ mat[0] = 1.0f;
+ mat[4] = (float) cos(angle);
+ mat[5] = (float) sin(angle);
+ mat[7] = -((float) sin(angle));
+ mat[8] = (float) cos(angle);
+ } else if(strcmp(axis, "Y") == 0) {
+ //rotation around Y
+ mat[0] = (float) cos(angle);
+ mat[2] = -((float) sin(angle));
+ mat[4] = 1.0f;
+ mat[6] = (float) sin(angle);
+ mat[8] = (float) cos(angle);
+ } else if(strcmp(axis, "Z") == 0) {
+ //rotation around Z
+ mat[0] = (float) cos(angle);
+ mat[1] = (float) sin(angle);
+ mat[3] = -((float) sin(angle));
+ mat[4] = (float) cos(angle);
+ mat[8] = 1.0f;
+ }
+ else {
+ /* should never get here */
+ PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error");
+ return NULL;
+ }
+
+ if(matSize == 4) {
+ matrix_3x3_as_4x4(mat);
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
+
+static char C_Matrix_Translation_doc[] =
+".. classmethod:: Translation(vector)\n"
+"\n"
+" Create a matrix representing a translation.\n"
+"\n"
+" :arg vector: The translation vector.\n"
+" :type vector: :class:`Vector`\n"
+" :return: An identity matrix with a translation.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_Translation(PyObject *cls, PyObject *value)
+{
+ float mat[16], tvec[3];
+
+ if (mathutils_array_parse(tvec, 3, 4, value, "mathutils.Matrix.Translation(vector), invalid vector arg") == -1)
+ return NULL;
+
+ /* create a identity matrix and add translation */
+ unit_m4((float(*)[4]) mat);
+ copy_v3_v3(mat + 12, tvec); /* 12, 13, 14 */
+ return newMatrixObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
+}
+//----------------------------------mathutils.Matrix.Scale() -------------
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_Scale_doc[] =
+".. classmethod:: Scale(factor, size, axis)\n"
+"\n"
+" Create a matrix representing a scaling.\n"
+"\n"
+" :arg factor: The factor of scaling to apply.\n"
+" :type factor: float\n"
+" :arg size: The size of the scale matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :arg axis: Direction to influence scale. (optional).\n"
+" :type axis: :class:`Vector`\n"
+" :return: A new scale matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
+{
+ PyObject *vec= NULL;
+ int vec_size;
+ float tvec[3];
+ float factor;
+ int matSize;
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!PyArg_ParseTuple(args, "fi|O:Matrix.Scale", &factor, &matSize, &vec)) {
+ return NULL;
+ }
+ if(matSize != 2 && matSize != 3 && matSize != 4) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.Scale(): can only return a 2x2 3x3 or 4x4 matrix");
+ return NULL;
+ }
+ if(vec) {
+ vec_size= (matSize == 2 ? 2 : 3);
+ if(mathutils_array_parse(tvec, vec_size, vec_size, vec, "Matrix.Scale(factor, size, axis), invalid 'axis' arg") == -1) {
+ return NULL;
+ }
+ }
+ if(vec == NULL) { //scaling along axis
+ if(matSize == 2) {
+ mat[0] = factor;
+ mat[3] = factor;
+ } else {
+ mat[0] = factor;
+ mat[4] = factor;
+ mat[8] = factor;
+ }
+ }
+ else { //scaling in arbitrary direction
+ //normalize arbitrary axis
+ float norm = 0.0f;
+ int x;
+ for(x = 0; x < vec_size; x++) {
+ norm += tvec[x] * tvec[x];
+ }
+ norm = (float) sqrt(norm);
+ for(x = 0; x < vec_size; x++) {
+ tvec[x] /= norm;
+ }
+ if(matSize == 2) {
+ mat[0] = 1 + ((factor - 1) *(tvec[0] * tvec[0]));
+ mat[1] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[2] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[3] = 1 + ((factor - 1) *(tvec[1] * tvec[1]));
+ } else {
+ mat[0] = 1 + ((factor - 1) *(tvec[0] * tvec[0]));
+ mat[1] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[2] = ((factor - 1) *(tvec[0] * tvec[2]));
+ mat[3] = ((factor - 1) *(tvec[0] * tvec[1]));
+ mat[4] = 1 + ((factor - 1) *(tvec[1] * tvec[1]));
+ mat[5] = ((factor - 1) *(tvec[1] * tvec[2]));
+ mat[6] = ((factor - 1) *(tvec[0] * tvec[2]));
+ mat[7] = ((factor - 1) *(tvec[1] * tvec[2]));
+ mat[8] = 1 + ((factor - 1) *(tvec[2] * tvec[2]));
+ }
+ }
+ if(matSize == 4) {
+ matrix_3x3_as_4x4(mat);
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+//----------------------------------mathutils.Matrix.OrthoProjection() ---
+//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+static char C_Matrix_OrthoProjection_doc[] =
+".. classmethod:: OrthoProjection(axis, size)\n"
+"\n"
+" Create a matrix to represent an orthographic projection.\n"
+"\n"
+" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix. Or a vector for an arbitrary axis\n"
+" :type axis: string or :class:`Vector`\n"
+" :arg size: The size of the projection matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :return: A new projection matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
+{
+ PyObject *axis;
+
+ int matSize, x;
+ float norm = 0.0f;
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!PyArg_ParseTuple(args, "Oi:Matrix.OrthoProjection", &axis, &matSize)) {
+ return NULL;
+ }
+ if(matSize != 2 && matSize != 3 && matSize != 4) {
+ PyErr_SetString(PyExc_AttributeError,"mathutils.Matrix.OrthoProjection(): can only return a 2x2 3x3 or 4x4 matrix");
+ return NULL;
+ }
+
+ if(PyUnicode_Check(axis)) { //ortho projection onto cardinal plane
+ Py_ssize_t plane_len;
+ const char *plane= _PyUnicode_AsStringAndSize(axis, &plane_len);
+ if(matSize == 2) {
+ if(plane_len == 1 && plane[0]=='X') {
+ mat[0]= 1.0f;
+ }
+ else if (plane_len == 1 && plane[0]=='Y') {
+ mat[3]= 1.0f;
+ }
+ else {
+ PyErr_Format(PyExc_ValueError, "mathutils.Matrix.OrthoProjection(): unknown plane, expected: X, Y, not '%.200s'", plane);
+ return NULL;
+ }
+ }
+ else {
+ if(plane_len == 2 && plane[0]=='X' && plane[1]=='Y') {
+ mat[0]= 1.0f;
+ mat[4]= 1.0f;
+ }
+ else if (plane_len == 2 && plane[0]=='X' && plane[1]=='Z') {
+ mat[0]= 1.0f;
+ mat[8]= 1.0f;
+ }
+ else if (plane_len == 2 && plane[0]=='Y' && plane[1]=='Z') {
+ mat[4]= 1.0f;
+ mat[8]= 1.0f;
+ }
+ else {
+ PyErr_Format(PyExc_ValueError, "mathutils.Matrix.OrthoProjection(): unknown plane, expected: XY, XZ, YZ, not '%.200s'", plane);
+ return NULL;
+ }
+ }
+ }
+ else {
+ //arbitrary plane
+
+ int vec_size= (matSize == 2 ? 2 : 3);
+ float tvec[4];
+
+ if(mathutils_array_parse(tvec, vec_size, vec_size, axis, "Matrix.OrthoProjection(axis, size), invalid 'axis' arg") == -1) {
+ return NULL;
+ }
+
+ //normalize arbitrary axis
+ for(x = 0; x < vec_size; x++) {
+ norm += tvec[x] * tvec[x];
+ }
+ norm = (float) sqrt(norm);
+ for(x = 0; x < vec_size; x++) {
+ tvec[x] /= norm;
+ }
+ if(matSize == 2) {
+ mat[0] = 1 - (tvec[0] * tvec[0]);
+ mat[1] = -(tvec[0] * tvec[1]);
+ mat[2] = -(tvec[0] * tvec[1]);
+ mat[3] = 1 - (tvec[1] * tvec[1]);
+ }
+ else if(matSize > 2) {
+ mat[0] = 1 - (tvec[0] * tvec[0]);
+ mat[1] = -(tvec[0] * tvec[1]);
+ mat[2] = -(tvec[0] * tvec[2]);
+ mat[3] = -(tvec[0] * tvec[1]);
+ mat[4] = 1 - (tvec[1] * tvec[1]);
+ mat[5] = -(tvec[1] * tvec[2]);
+ mat[6] = -(tvec[0] * tvec[2]);
+ mat[7] = -(tvec[1] * tvec[2]);
+ mat[8] = 1 - (tvec[2] * tvec[2]);
+ }
+ }
+ if(matSize == 4) {
+ matrix_3x3_as_4x4(mat);
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
+static char C_Matrix_Shear_doc[] =
+".. classmethod:: Shear(plane, size, factor)\n"
+"\n"
+" Create a matrix to represent an shear transformation.\n"
+"\n"
+" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix only.\n"
+" :type plane: string\n"
+" :arg size: The size of the shear matrix to construct [2, 4].\n"
+" :type size: int\n"
+" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix pass a pair of floats corrasponding with the *plane* axis.\n"
+" :type factor: float or float pair\n"
+" :return: A new shear matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
+{
+ int matSize;
+ const char *plane;
+ PyObject *fac;
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!PyArg_ParseTuple(args, "siO:Matrix.Shear", &plane, &matSize, &fac)) {
+ return NULL;
+ }
+ if(matSize != 2 && matSize != 3 && matSize != 4) {
+ PyErr_SetString(PyExc_AttributeError,"mathutils.Matrix.Shear(): can only return a 2x2 3x3 or 4x4 matrix");
+ return NULL;
+ }
+
+ if(matSize == 2) {
+ float const factor= PyFloat_AsDouble(fac);
+
+ if(factor==-1.0 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix.Shear(): the factor to be a float");
+ return NULL;
+ }
+
+ /* unit */
+ mat[0] = 1.0f;
+ mat[3] = 1.0f;
+
+ if(strcmp(plane, "X") == 0) {
+ mat[2] = factor;
+ }
+ else if(strcmp(plane, "Y") == 0) {
+ mat[1] = factor;
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.Shear(): expected: X, Y or wrong matrix size for shearing plane");
+ return NULL;
+ }
+ }
+ else {
+ /* 3 or 4, apply as 3x3, resize later if needed */
+ float factor[2];
+
+ if(mathutils_array_parse(factor, 2, 2, fac, "Matrix.Shear()") < 0) {
+ return NULL;
+ }
+
+ /* unit */
+ mat[0] = 1.0f;
+ mat[4] = 1.0f;
+ mat[8] = 1.0f;
+
+ if(strcmp(plane, "XY") == 0) {
+ mat[6] = factor[0];
+ mat[7] = factor[1];
+ }
+ else if(strcmp(plane, "XZ") == 0) {
+ mat[3] = factor[0];
+ mat[5] = factor[1];
+ }
+ else if(strcmp(plane, "YZ") == 0) {
+ mat[1] = factor[0];
+ mat[2] = factor[1];
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix.Shear(): expected: X, Y, XY, XZ, YZ");
+ return NULL;
+ }
+ }
+
+ if(matSize == 4) {
+ matrix_3x3_as_4x4(mat);
+ }
+ //pass to matrix creation
+ return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
+}
+
+void matrix_as_3x3(float mat[3][3], MatrixObject *self)
+{
+ copy_v3_v3(mat[0], self->matrix[0]);
+ copy_v3_v3(mat[1], self->matrix[1]);
+ copy_v3_v3(mat[2], self->matrix[2]);
+}
+
+/* assumes rowsize == colsize is checked and the read callback has run */
+static float matrix_determinant_internal(MatrixObject *self)
+{
+ if(self->row_size == 2) {
+ return determinant_m2(self->matrix[0][0], self->matrix[0][1],
+ self->matrix[1][0], self->matrix[1][1]);
+ } else if(self->row_size == 3) {
+ return determinant_m3(self->matrix[0][0], self->matrix[0][1],
+ self->matrix[0][2], self->matrix[1][0],
+ self->matrix[1][1], self->matrix[1][2],
+ self->matrix[2][0], self->matrix[2][1],
+ self->matrix[2][2]);
+ } else {
+ return determinant_m4((float (*)[4])self->contigPtr);
+ }
+}
+
+
+/*-----------------------------METHODS----------------------------*/
+static char Matrix_to_quaternion_doc[] =
+".. method:: to_quaternion()\n"
+"\n"
+" Return a quaternion representation of the rotation matrix.\n"
+"\n"
+" :return: Quaternion representation of the rotation matrix.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Matrix_to_quaternion(MatrixObject *self)
+{
+ float quat[4];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if((self->col_size < 3) || (self->row_size < 3) || (self->col_size != self->row_size)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_quat(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
+ return NULL;
+ }
+ if(self->col_size == 3){
+ mat3_to_quat( quat,(float (*)[3])self->contigPtr);
+ }else{
+ mat4_to_quat( quat,(float (*)[4])self->contigPtr);
+ }
+
+ return newQuaternionObject(quat, Py_NEW, NULL);
+}
+
+/*---------------------------Matrix.toEuler() --------------------*/
+static char Matrix_to_euler_doc[] =
+".. method:: to_euler(order, euler_compat)\n"
+"\n"
+" Return an Euler representation of the rotation matrix (3x3 or 4x4 matrix only).\n"
+"\n"
+" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
+" :type order: string\n"
+" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
+" :type euler_compat: :class:`Euler`\n"
+" :return: Euler representation of the matrix.\n"
+" :rtype: :class:`Euler`\n"
+;
+static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
+{
+ const char *order_str= NULL;
+ short order= EULER_ORDER_XYZ;
+ float eul[3], eul_compatf[3];
+ EulerObject *eul_compat = NULL;
+
+ float tmat[3][3];
+ float (*mat)[3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
+ return NULL;
+
+ if(eul_compat) {
+ if(!BaseMath_ReadCallback(eul_compat))
+ return NULL;
+
+ copy_v3_v3(eul_compatf, eul_compat->eul);
+ }
+
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if(self->col_size ==3 && self->row_size ==3) {
+ mat= (float (*)[3])self->contigPtr;
+ }else if (self->col_size ==4 && self->row_size ==4) {
+ copy_m3_m4(tmat, (float (*)[4])self->contigPtr);
+ mat= tmat;
+ }else {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_euler(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
+ return NULL;
+ }
+
+ if(order_str) {
+ order= euler_order_from_string(order_str, "Matrix.to_euler()");
+
+ if(order == -1)
+ return NULL;
+ }
+
+ if(eul_compat) {
+ if(order == 1) mat3_to_compatible_eul( eul, eul_compatf, mat);
+ else mat3_to_compatible_eulO(eul, eul_compatf, order, mat);
+ }
+ else {
+ if(order == 1) mat3_to_eul(eul, mat);
+ else mat3_to_eulO(eul, order, mat);
+ }
+
+ return newEulerObject(eul, order, Py_NEW, NULL);
+}
+
+static char Matrix_resize_4x4_doc[] =
+".. method:: resize_4x4()\n"
+"\n"
+" Resize the matrix to 4x4.\n"
+;
+static PyObject *Matrix_resize_4x4(MatrixObject *self)
+{
+ int x, first_row_elem, curr_pos, new_pos, blank_columns, blank_rows, index;
+
+ if(self->wrapped==Py_WRAP){
+ PyErr_SetString(PyExc_TypeError, "cannot resize wrapped data - make a copy and resize that");
+ return NULL;
+ }
+ if(self->cb_user){
+ PyErr_SetString(PyExc_TypeError, "cannot resize owned data - make a copy and resize that");
+ return NULL;
+ }
+
+ self->contigPtr = PyMem_Realloc(self->contigPtr, (sizeof(float) * 16));
+ if(self->contigPtr == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "matrix.resize_4x4(): problem allocating pointer space");
+ return NULL;
+ }
+ /*set row pointers*/
+ for(x = 0; x < 4; x++) {
+ self->matrix[x] = self->contigPtr + (x * 4);
+ }
+ /*move data to new spot in array + clean*/
+ for(blank_rows = (4 - self->row_size); blank_rows > 0; blank_rows--){
+ for(x = 0; x < 4; x++){
+ index = (4 * (self->row_size + (blank_rows - 1))) + x;
+ if (index == 10 || index == 15){
+ self->contigPtr[index] = 1.0f;
+ }else{
+ self->contigPtr[index] = 0.0f;
+ }
+ }
+ }
+ for(x = 1; x <= self->row_size; x++){
+ first_row_elem = (self->col_size * (self->row_size - x));
+ curr_pos = (first_row_elem + (self->col_size -1));
+ new_pos = (4 * (self->row_size - x )) + (curr_pos - first_row_elem);
+ for(blank_columns = (4 - self->col_size); blank_columns > 0; blank_columns--){
+ self->contigPtr[new_pos + blank_columns] = 0.0f;
+ }
+ for(curr_pos = curr_pos; curr_pos >= first_row_elem; curr_pos--){
+ self->contigPtr[new_pos] = self->contigPtr[curr_pos];
+ new_pos--;
+ }
+ }
+ self->row_size = 4;
+ self->col_size = 4;
+
+ Py_RETURN_NONE;
+}
+
+static char Matrix_to_4x4_doc[] =
+".. method:: to_4x4()\n"
+"\n"
+" Return a 4x4 copy of this matrix.\n"
+"\n"
+" :return: a new matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_to_4x4(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(self->col_size==4 && self->row_size==4) {
+ return (PyObject *)newMatrixObject(self->contigPtr, 4, 4, Py_NEW, Py_TYPE(self));
+ }
+ else if(self->col_size==3 && self->row_size==3) {
+ float mat[4][4];
+ copy_m4_m3(mat, (float (*)[3])self->contigPtr);
+ return (PyObject *)newMatrixObject((float *)mat, 4, 4, Py_NEW, Py_TYPE(self));
+ }
+ /* TODO, 2x2 matrix */
+
+ PyErr_SetString(PyExc_TypeError, "Matrix.to_4x4(): inappropriate matrix size");
+ return NULL;
+}
+
+static char Matrix_to_3x3_doc[] =
+".. method:: to_3x3()\n"
+"\n"
+" Return a 3x3 copy of this matrix.\n"
+"\n"
+" :return: a new matrix.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_to_3x3(MatrixObject *self)
+{
+ float mat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_3x3(): inappropriate matrix size");
+ return NULL;
+ }
+
+ matrix_as_3x3(mat, self);
+
+ return newMatrixObject((float *)mat, 3, 3, Py_NEW, Py_TYPE(self));
+}
+
+static char Matrix_to_translation_doc[] =
+".. method:: to_translation()\n"
+"\n"
+" Return a the translation part of a 4 row matrix.\n"
+"\n"
+" :return: Return a the translation of a matrix.\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Matrix_to_translation(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if((self->col_size < 3) || self->row_size < 4){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_translation(): inappropriate matrix size");
+ return NULL;
+ }
+
+ return newVectorObject(self->matrix[3], 3, Py_NEW, NULL);
+}
+
+static char Matrix_to_scale_doc[] =
+".. method:: to_scale()\n"
+"\n"
+" Return a the scale part of a 3x3 or 4x4 matrix.\n"
+"\n"
+" :return: Return a the scale of a matrix.\n"
+" :rtype: :class:`Vector`\n"
+"\n"
+" .. note:: This method does not return negative a scale on any axis because it is not possible to obtain this data from the matrix alone.\n"
+;
+static PyObject *Matrix_to_scale(MatrixObject *self)
+{
+ float rot[3][3];
+ float mat[3][3];
+ float size[3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.to_scale(): inappropriate matrix size, 3x3 minimum size");
+ return NULL;
+ }
+
+ matrix_as_3x3(mat, self);
+
+ /* compatible mat4_to_loc_rot_size */
+ mat3_to_rot_size(rot, size, mat);
+
+ return newVectorObject(size, 3, Py_NEW, NULL);
+}
+
+/*---------------------------Matrix.invert() ---------------------*/
+static char Matrix_invert_doc[] =
+".. method:: invert()\n"
+"\n"
+" Set the matrix to its inverse.\n"
+"\n"
+" .. note:: :exc:`ValueError` exception is raised.\n"
+"\n"
+" .. seealso:: <http://en.wikipedia.org/wiki/Inverse_matrix>\n"
+;
+static PyObject *Matrix_invert(MatrixObject *self)
+{
+
+ int x, y, z = 0;
+ float det = 0.0f;
+ float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(self->row_size != self->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.invert(ed): only square matrices are supported");
+ return NULL;
+ }
+
+ /*calculate the determinant*/
+ det = matrix_determinant_internal(self);
+
+ if(det != 0) {
+ /*calculate the classical adjoint*/
+ if(self->row_size == 2) {
+ mat[0] = self->matrix[1][1];
+ mat[1] = -self->matrix[0][1];
+ mat[2] = -self->matrix[1][0];
+ mat[3] = self->matrix[0][0];
+ } else if(self->row_size == 3) {
+ adjoint_m3_m3((float (*)[3]) mat,(float (*)[3])self->contigPtr);
+ } else if(self->row_size == 4) {
+ adjoint_m4_m4((float (*)[4]) mat, (float (*)[4])self->contigPtr);
+ }
+ /*divide by determinate*/
+ for(x = 0; x < (self->row_size * self->col_size); x++) {
+ mat[x] /= det;
+ }
+ /*set values*/
+ for(x = 0; x < self->row_size; x++) {
+ for(y = 0; y < self->col_size; y++) {
+ self->matrix[x][y] = mat[z];
+ z++;
+ }
+ }
+ /*transpose
+ Matrix_transpose(self);*/
+ } else {
+ PyErr_SetString(PyExc_ValueError, "matrix does not have an inverse");
+ return NULL;
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Matrix_inverted_doc[] =
+".. method:: inverted()\n"
+"\n"
+" Return an inverted copy of the matrix.\n"
+"\n"
+" :return: the inverted matrix.\n"
+" :rtype: :class:`Matrix`\n"
+"\n"
+" .. note:: :exc:`ValueError` exception is raised.\n"
+;
+static PyObject *Matrix_inverted(MatrixObject *self)
+{
+ return matrix__apply_to_copy((PyNoArgsFunction)Matrix_invert, self);
+}
+
+static char Matrix_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the matrix a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+"\n"
+" .. note:: If any of the columns are not unit length this may not have desired results.\n"
+;
+static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "matrix.rotate(value)") == -1)
+ return NULL;
+
+ if(self->col_size != 3 || self->row_size != 3) {
+ PyErr_SetString(PyExc_ValueError, "Matrix must have 3x3 dimensions");
+ return NULL;
+ }
+
+ matrix_as_3x3(self_rmat, self);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
+
+ copy_m3_m3((float (*)[3])(self->contigPtr), rmat);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+/*---------------------------Matrix.decompose() ---------------------*/
+static char Matrix_decompose_doc[] =
+".. method:: decompose()\n"
+"\n"
+" Return the location, rotaion and scale components of this matrix.\n"
+"\n"
+" :return: loc, rot, scale triple.\n"
+" :rtype: (:class:`Vector`, :class:`Quaternion`, :class:`Vector`)"
+;
+static PyObject *Matrix_decompose(MatrixObject *self)
+{
+ PyObject *ret;
+ float loc[3];
+ float rot[3][3];
+ float quat[4];
+ float size[3];
+
+ if(self->col_size != 4 || self->row_size != 4) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.decompose(): inappropriate matrix size - expects 4x4 matrix");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ mat4_to_loc_rot_size(loc, rot, size, (float (*)[4])self->contigPtr);
+ mat3_to_quat(quat, rot);
+
+ ret= PyTuple_New(3);
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(loc, 3, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 1, newQuaternionObject(quat, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 2, newVectorObject(size, 3, Py_NEW, NULL));
+
+ return ret;
+}
+
+
+
+static char Matrix_lerp_doc[] =
+".. function:: lerp(other, factor)\n"
+"\n"
+" Returns the interpolation of two matricies.\n"
+"\n"
+" :arg other: value to interpolate with.\n"
+" :type other: :class:`Matrix`\n"
+" :arg factor: The interpolation value in [0.0, 1.0].\n"
+" :type factor: float\n"
+" :return: The interpolated rotation.\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
+{
+ MatrixObject *mat2 = NULL;
+ float fac, mat[MATRIX_MAX_DIM*MATRIX_MAX_DIM];
+
+ if(!PyArg_ParseTuple(args, "O!f:lerp", &matrix_Type, &mat2, &fac))
+ return NULL;
+
+ if(self->row_size != mat2->row_size || self->col_size != mat2->col_size) {
+ PyErr_SetString(PyExc_AttributeError, "matrix.lerp(): expects both matrix objects of the same dimensions");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(mat2))
+ return NULL;
+
+ /* TODO, different sized matrix */
+ if(self->row_size==4 && self->col_size==4) {
+ blend_m4_m4m4((float (*)[4])mat, (float (*)[4])self->contigPtr, (float (*)[4])mat2->contigPtr, fac);
+ }
+ else if (self->row_size==3 && self->col_size==3) {
+ blend_m3_m3m3((float (*)[3])mat, (float (*)[3])self->contigPtr, (float (*)[3])mat2->contigPtr, fac);
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "matrix.lerp(): only 3x3 and 4x4 matrices supported");
+ return NULL;
+ }
+
+ return (PyObject*)newMatrixObject(mat, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
+}
+
+/*---------------------------Matrix.determinant() ----------------*/
+static char Matrix_determinant_doc[] =
+".. method:: determinant()\n"
+"\n"
+" Return the determinant of a matrix.\n"
+"\n"
+" :return: Return a the determinant of a matrix.\n"
+" :rtype: float\n"
+"\n"
+" .. seealso:: <http://en.wikipedia.org/wiki/Determinant>\n"
+;
+static PyObject *Matrix_determinant(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(self->row_size != self->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.determinant: only square matrices are supported");
+ return NULL;
+ }
+
+ return PyFloat_FromDouble((double)matrix_determinant_internal(self));
+}
+/*---------------------------Matrix.transpose() ------------------*/
+static char Matrix_transpose_doc[] =
+".. method:: transpose()\n"
+"\n"
+" Set the matrix to its transpose.\n"
+"\n"
+" .. seealso:: <http://en.wikipedia.org/wiki/Transpose>\n"
+;
+static PyObject *Matrix_transpose(MatrixObject *self)
+{
+ float t = 0.0f;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(self->row_size != self->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.transpose(d): only square matrices are supported");
+ return NULL;
+ }
+
+ if(self->row_size == 2) {
+ t = self->matrix[1][0];
+ self->matrix[1][0] = self->matrix[0][1];
+ self->matrix[0][1] = t;
+ } else if(self->row_size == 3) {
+ transpose_m3((float (*)[3])self->contigPtr);
+ } else {
+ transpose_m4((float (*)[4])self->contigPtr);
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Matrix_transposed_doc[] =
+".. method:: transposed()\n"
+"\n"
+" Return a new, transposed matrix.\n"
+"\n"
+" :return: a transposed matrix\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_transposed(MatrixObject *self)
+{
+ return matrix__apply_to_copy((PyNoArgsFunction)Matrix_transpose, self);
+}
+
+/*---------------------------Matrix.zero() -----------------------*/
+static char Matrix_zero_doc[] =
+".. method:: zero()\n"
+"\n"
+" Set all the matrix values to zero.\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_zero(MatrixObject *self)
+{
+ fill_vn(self->contigPtr, self->row_size * self->col_size, 0.0f);
+
+ if(!BaseMath_WriteCallback(self))
+ return NULL;
+
+ Py_RETURN_NONE;
+}
+/*---------------------------Matrix.identity(() ------------------*/
+static char Matrix_identity_doc[] =
+".. method:: identity()\n"
+"\n"
+" Set the matrix to the identity matrix.\n"
+"\n"
+" .. note:: An object with zero location and rotation, a scale of one, will have an identity matrix.\n"
+"\n"
+" .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n"
+;
+static PyObject *Matrix_identity(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(self->row_size != self->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix.identity: only square matrices are supported");
+ return NULL;
+ }
+
+ if(self->row_size == 2) {
+ self->matrix[0][0] = 1.0f;
+ self->matrix[0][1] = 0.0f;
+ self->matrix[1][0] = 0.0f;
+ self->matrix[1][1] = 1.0f;
+ } else if(self->row_size == 3) {
+ unit_m3((float (*)[3])self->contigPtr);
+ } else {
+ unit_m4((float (*)[4])self->contigPtr);
+ }
+
+ if(!BaseMath_WriteCallback(self))
+ return NULL;
+
+ Py_RETURN_NONE;
+}
+
+/*---------------------------Matrix.copy() ------------------*/
+static char Matrix_copy_doc[] =
+".. method:: copy()\n"
+"\n"
+" Returns a copy of this matrix.\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Matrix_copy(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return (PyObject*)newMatrixObject((float (*))self->contigPtr, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
+}
+
+/*----------------------------print object (internal)-------------*/
+/*print the object to screen*/
+static PyObject *Matrix_repr(MatrixObject *self)
+{
+ int x, y;
+ PyObject *rows[MATRIX_MAX_DIM]= {NULL};
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ for(x = 0; x < self->row_size; x++){
+ rows[x]= PyTuple_New(self->col_size);
+ for(y = 0; y < self->col_size; y++) {
+ PyTuple_SET_ITEM(rows[x], y, PyFloat_FromDouble(self->matrix[x][y]));
+ }
+ }
+ switch(self->row_size) {
+ case 2: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R)", rows[0], rows[1]);
+
+ case 3: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R,\n"
+ " %R)", rows[0], rows[1], rows[2]);
+
+ case 4: return PyUnicode_FromFormat("Matrix(%R,\n"
+ " %R,\n"
+ " %R,\n"
+ " %R)", rows[0], rows[1], rows[2], rows[3]);
+ }
+
+ PyErr_SetString(PyExc_RuntimeError, "invalid matrix size");
+ return NULL;
+}
+
+static PyObject* Matrix_richcmpr(PyObject *a, PyObject *b, int op)
+{
+ PyObject *res;
+ int ok= -1; /* zero is true */
+
+ if (MatrixObject_Check(a) && MatrixObject_Check(b)) {
+ MatrixObject *matA= (MatrixObject*)a;
+ MatrixObject *matB= (MatrixObject*)b;
+
+ if(!BaseMath_ReadCallback(matA) || !BaseMath_ReadCallback(matB))
+ return NULL;
+
+ ok= ( (matA->col_size == matB->col_size) &&
+ (matA->row_size == matB->row_size) &&
+ EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr, (matA->row_size * matA->col_size), 1)
+ ) ? 0 : -1;
+ }
+
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
+ }
+
+ return Py_INCREF(res), res;
+}
+
+/*---------------------SEQUENCE PROTOCOLS------------------------
+ ----------------------------len(object)------------------------
+ sequence length*/
+static int Matrix_len(MatrixObject *self)
+{
+ return (self->row_size);
+}
+/*----------------------------object[]---------------------------
+ sequence accessor (get)
+ the wrapped vector gives direct access to the matrix data*/
+static PyObject *Matrix_item(MatrixObject *self, int i)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(i < 0 || i >= self->row_size) {
+ PyErr_SetString(PyExc_IndexError, "matrix[attribute]: array index out of range");
+ return NULL;
+ }
+ return newVectorObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, i);
+}
+/*----------------------------object[]-------------------------
+ sequence accessor (set) */
+
+static int Matrix_ass_item(MatrixObject *self, int i, PyObject *value)
+{
+ float vec[4];
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ if(i >= self->row_size || i < 0){
+ PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad column");
+ return -1;
+ }
+
+ if(mathutils_array_parse(vec, self->col_size, self->col_size, value, "matrix[i] = value assignment") < 0) {
+ return -1;
+ }
+
+ memcpy(self->matrix[i], vec, self->col_size *sizeof(float));
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+}
+
+/*----------------------------object[z:y]------------------------
+ sequence slice (get)*/
+static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
+{
+
+ PyObject *tuple;
+ int count;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ CLAMP(begin, 0, self->row_size);
+ CLAMP(end, 0, self->row_size);
+ begin= MIN2(begin,end);
+
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin,
+ newVectorObject_cb((PyObject *)self, self->col_size, mathutils_matrix_vector_cb_index, count));
+
+ }
+
+ return tuple;
+}
+/*----------------------------object[z:y]------------------------
+ sequence slice (set)*/
+static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *value)
+{
+ PyObject *value_fast= NULL;
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ CLAMP(begin, 0, self->row_size);
+ CLAMP(end, 0, self->row_size);
+ begin = MIN2(begin,end);
+
+ /* non list/tuple cases */
+ if(!(value_fast=PySequence_Fast(value, "matrix[begin:end] = value"))) {
+ /* PySequence_Fast sets the error */
+ return -1;
+ }
+ else {
+ const int size= end - begin;
+ int i;
+ float mat[16];
+
+ if(PySequence_Fast_GET_SIZE(value_fast) != size) {
+ Py_DECREF(value_fast);
+ PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment");
+ return -1;
+ }
+
+ /*parse sub items*/
+ for (i = 0; i < size; i++) {
+ /*parse each sub sequence*/
+ PyObject *item= PySequence_Fast_GET_ITEM(value_fast, i);
+
+ if(mathutils_array_parse(&mat[i * self->col_size], self->col_size, self->col_size, item, "matrix[begin:end] = value assignment") < 0) {
+ return -1;
+ }
+ }
+
+ Py_DECREF(value_fast);
+
+ /*parsed well - now set in matrix*/
+ memcpy(self->contigPtr + (begin * self->col_size), mat, sizeof(float) * (size * self->col_size));
+
+ (void)BaseMath_WriteCallback(self);
+ return 0;
+ }
+}
+/*------------------------NUMERIC PROTOCOLS----------------------
+ ------------------------obj + obj------------------------------*/
+static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
+{
+ float mat[16];
+ MatrixObject *mat1 = NULL, *mat2 = NULL;
+
+ mat1 = (MatrixObject*)m1;
+ mat2 = (MatrixObject*)m2;
+
+ if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
+ return NULL;
+
+ if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ add_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
+
+ return newMatrixObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+}
+/*------------------------obj - obj------------------------------
+ subtraction*/
+static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
+{
+ float mat[16];
+ MatrixObject *mat1 = NULL, *mat2 = NULL;
+
+ mat1 = (MatrixObject*)m1;
+ mat2 = (MatrixObject*)m2;
+
+ if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
+ return NULL;
+
+ if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
+ PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ sub_vn_vnvn(mat, mat1->contigPtr, mat2->contigPtr, mat1->row_size * mat1->col_size);
+
+ return newMatrixObject(mat, mat1->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+}
+/*------------------------obj * obj------------------------------
+ mulplication*/
+static PyObject *matrix_mul_float(MatrixObject *mat, const float scalar)
+{
+ float tmat[16];
+ mul_vn_vn_fl(tmat, mat->contigPtr, mat->row_size * mat->col_size, scalar);
+ return newMatrixObject(tmat, mat->row_size, mat->col_size, Py_NEW, Py_TYPE(mat));
+}
+
+static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
+{
+ float scalar;
+
+ MatrixObject *mat1 = NULL, *mat2 = NULL;
+
+ if(MatrixObject_Check(m1)) {
+ mat1 = (MatrixObject*)m1;
+ if(!BaseMath_ReadCallback(mat1))
+ return NULL;
+ }
+ if(MatrixObject_Check(m2)) {
+ mat2 = (MatrixObject*)m2;
+ if(!BaseMath_ReadCallback(mat2))
+ return NULL;
+ }
+
+ if(mat1 && mat2) { /*MATRIX * MATRIX*/
+ if(mat1->row_size != mat2->col_size){
+ PyErr_SetString(PyExc_AttributeError,"Matrix multiplication: matrix A rowsize must equal matrix B colsize");
+ return NULL;
+ }
+ else {
+ float mat[16]= {0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+ double dot = 0.0f;
+ int x, y, z;
+
+ for(x = 0; x < mat2->row_size; x++) {
+ for(y = 0; y < mat1->col_size; y++) {
+ for(z = 0; z < mat1->row_size; z++) {
+ dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
+ }
+ mat[((x * mat1->col_size) + y)] = (float)dot;
+ dot = 0.0f;
+ }
+ }
+
+ return newMatrixObject(mat, mat2->row_size, mat1->col_size, Py_NEW, Py_TYPE(mat1));
+ }
+ }
+ else if(mat2) {
+ if (((scalar= PyFloat_AsDouble(m1)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ return matrix_mul_float(mat2, scalar);
+ }
+ }
+ else if(mat1) {
+ if (((scalar= PyFloat_AsDouble(m2)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ return matrix_mul_float(mat1, scalar);
+ }
+ }
+ else {
+ BLI_assert(!"internal error");
+ }
+
+ PyErr_Format(PyExc_TypeError, "Matrix multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(m1)->tp_name, Py_TYPE(m2)->tp_name);
+ return NULL;
+}
+static PyObject* Matrix_inv(MatrixObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return Matrix_invert(self);
+}
+
+/*-----------------PROTOCOL DECLARATIONS--------------------------*/
+static PySequenceMethods Matrix_SeqMethods = {
+ (lenfunc) Matrix_len, /* sq_length */
+ (binaryfunc) NULL, /* sq_concat */
+ (ssizeargfunc) NULL, /* sq_repeat */
+ (ssizeargfunc) Matrix_item, /* sq_item */
+ (ssizessizeargfunc) NULL, /* sq_slice, deprecated */
+ (ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */
+ (ssizessizeobjargproc) NULL, /* sq_ass_slice, deprecated */
+ (objobjproc) NULL, /* sq_contains */
+ (binaryfunc) NULL, /* sq_inplace_concat */
+ (ssizeargfunc) NULL, /* sq_inplace_repeat */
+};
+
+
+static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (i < 0)
+ i += self->row_size;
+ return Matrix_item(self, i);
+ } else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else if (step == 1) {
+ return Matrix_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return NULL;
+ }
+}
+
+static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* value)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0)
+ i += self->row_size;
+ return Matrix_ass_item(self, i, value);
+ }
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)item, self->row_size, &start, &stop, &step, &slicelength) < 0)
+ return -1;
+
+ if (step == 1)
+ return Matrix_ass_slice(self, start, stop, value);
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+ return -1;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "matrix indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return -1;
+ }
+}
+
+static PyMappingMethods Matrix_AsMapping = {
+ (lenfunc)Matrix_len,
+ (binaryfunc)Matrix_subscript,
+ (objobjargproc)Matrix_ass_subscript
+};
+
+
+static PyNumberMethods Matrix_NumMethods = {
+ (binaryfunc) Matrix_add, /*nb_add*/
+ (binaryfunc) Matrix_sub, /*nb_subtract*/
+ (binaryfunc) Matrix_mul, /*nb_multiply*/
+ NULL, /*nb_remainder*/
+ NULL, /*nb_divmod*/
+ NULL, /*nb_power*/
+ (unaryfunc) 0, /*nb_negative*/
+ (unaryfunc) 0, /*tp_positive*/
+ (unaryfunc) 0, /*tp_absolute*/
+ (inquiry) 0, /*tp_bool*/
+ (unaryfunc) Matrix_inv, /*nb_invert*/
+ NULL, /*nb_lshift*/
+ (binaryfunc)0, /*nb_rshift*/
+ NULL, /*nb_and*/
+ NULL, /*nb_xor*/
+ NULL, /*nb_or*/
+ NULL, /*nb_int*/
+ NULL, /*nb_reserved*/
+ NULL, /*nb_float*/
+ NULL, /* nb_inplace_add */
+ NULL, /* nb_inplace_subtract */
+ NULL, /* nb_inplace_multiply */
+ NULL, /* nb_inplace_remainder */
+ NULL, /* nb_inplace_power */
+ NULL, /* nb_inplace_lshift */
+ NULL, /* nb_inplace_rshift */
+ NULL, /* nb_inplace_and */
+ NULL, /* nb_inplace_xor */
+ NULL, /* nb_inplace_or */
+ NULL, /* nb_floor_divide */
+ NULL, /* nb_true_divide */
+ NULL, /* nb_inplace_floor_divide */
+ NULL, /* nb_inplace_true_divide */
+ NULL, /* nb_index */
+};
+
+static PyObject *Matrix_getRowSize(MatrixObject *self, void *UNUSED(closure))
+{
+ return PyLong_FromLong((long) self->row_size);
+}
+
+static PyObject *Matrix_getColSize(MatrixObject *self, void *UNUSED(closure))
+{
+ return PyLong_FromLong((long) self->col_size);
+}
+
+static PyObject *Matrix_getMedianScale(MatrixObject *self, void *UNUSED(closure))
+{
+ float mat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if((self->col_size < 3) || (self->row_size < 3)) {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.median_scale: inappropriate matrix size, 3x3 minimum");
+ return NULL;
+ }
+
+ matrix_as_3x3(mat, self);
+
+ return PyFloat_FromDouble(mat3_to_scale(mat));
+}
+
+static PyObject *Matrix_getIsNegative(MatrixObject *self, void *UNUSED(closure))
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ /*must be 3-4 cols, 3-4 rows, square matrix*/
+ if(self->col_size == 4 && self->row_size == 4)
+ return PyBool_FromLong(is_negative_m4((float (*)[4])self->contigPtr));
+ else if(self->col_size == 3 && self->row_size == 3)
+ return PyBool_FromLong(is_negative_m3((float (*)[3])self->contigPtr));
+ else {
+ PyErr_SetString(PyExc_AttributeError, "Matrix.is_negative: inappropriate matrix size - expects 3x3 or 4x4 matrix");
+ return NULL;
+ }
+}
+
+
+/*****************************************************************************/
+/* Python attributes get/set structure: */
+/*****************************************************************************/
+static PyGetSetDef Matrix_getseters[] = {
+ {(char *)"row_size", (getter)Matrix_getRowSize, (setter)NULL, (char *)"The row size of the matrix (readonly).\n\n:type: int", NULL},
+ {(char *)"col_size", (getter)Matrix_getColSize, (setter)NULL, (char *)"The column size of the matrix (readonly).\n\n:type: int", NULL},
+ {(char *)"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, (char *)"The average scale applied to each axis (readonly).\n\n:type: float", NULL},
+ {(char *)"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, (char *)"True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner",(getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+ {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+};
+
+/*-----------------------METHOD DEFINITIONS ----------------------*/
+static struct PyMethodDef Matrix_methods[] = {
+ /* derived values */
+ {"determinant", (PyCFunction) Matrix_determinant, METH_NOARGS, Matrix_determinant_doc},
+ {"decompose", (PyCFunction) Matrix_decompose, METH_NOARGS, Matrix_decompose_doc},
+
+ /* in place only */
+ {"zero", (PyCFunction) Matrix_zero, METH_NOARGS, Matrix_zero_doc},
+ {"identity", (PyCFunction) Matrix_identity, METH_NOARGS, Matrix_identity_doc},
+
+ /* operate on original or copy */
+ {"transpose", (PyCFunction) Matrix_transpose, METH_NOARGS, Matrix_transpose_doc},
+ {"transposed", (PyCFunction) Matrix_transposed, METH_NOARGS, Matrix_transposed_doc},
+ {"invert", (PyCFunction) Matrix_invert, METH_NOARGS, Matrix_invert_doc},
+ {"inverted", (PyCFunction) Matrix_inverted, METH_NOARGS, Matrix_inverted_doc},
+ {"to_3x3", (PyCFunction) Matrix_to_3x3, METH_NOARGS, Matrix_to_3x3_doc},
+ // TODO. {"resize_3x3", (PyCFunction) Matrix_resize3x3, METH_NOARGS, Matrix_resize3x3_doc},
+ {"to_4x4", (PyCFunction) Matrix_to_4x4, METH_NOARGS, Matrix_to_4x4_doc},
+ {"resize_4x4", (PyCFunction) Matrix_resize_4x4, METH_NOARGS, Matrix_resize_4x4_doc},
+ {"rotate", (PyCFunction) Matrix_rotate, METH_O, Matrix_rotate_doc},
+
+ /* return converted representation */
+ {"to_euler", (PyCFunction) Matrix_to_euler, METH_VARARGS, Matrix_to_euler_doc},
+ {"to_quaternion", (PyCFunction) Matrix_to_quaternion, METH_NOARGS, Matrix_to_quaternion_doc},
+ {"to_scale", (PyCFunction) Matrix_to_scale, METH_NOARGS, Matrix_to_scale_doc},
+ {"to_translation", (PyCFunction) Matrix_to_translation, METH_NOARGS, Matrix_to_translation_doc},
+
+ /* operation between 2 or more types */
+ {"lerp", (PyCFunction) Matrix_lerp, METH_VARARGS, Matrix_lerp_doc},
+ {"copy", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
+ {"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
+
+ /* class methods */
+ {"Rotation", (PyCFunction) C_Matrix_Rotation, METH_VARARGS | METH_CLASS, C_Matrix_Rotation_doc},
+ {"Scale", (PyCFunction) C_Matrix_Scale, METH_VARARGS | METH_CLASS, C_Matrix_Scale_doc},
+ {"Shear", (PyCFunction) C_Matrix_Shear, METH_VARARGS | METH_CLASS, C_Matrix_Shear_doc},
+ {"Translation", (PyCFunction) C_Matrix_Translation, METH_O | METH_CLASS, C_Matrix_Translation_doc},
+ {"OrthoProjection", (PyCFunction) C_Matrix_OrthoProjection, METH_VARARGS | METH_CLASS, C_Matrix_OrthoProjection_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+/*------------------PY_OBECT DEFINITION--------------------------*/
+static char matrix_doc[] =
+"This object gives access to Matrices in Blender."
+;
+PyTypeObject matrix_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "mathutils.Matrix", /*tp_name*/
+ sizeof(MatrixObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)BaseMathObject_dealloc, /*tp_dealloc*/
+ NULL, /*tp_print*/
+ NULL, /*tp_getattr*/
+ NULL, /*tp_setattr*/
+ NULL, /*tp_compare*/
+ (reprfunc) Matrix_repr, /*tp_repr*/
+ &Matrix_NumMethods, /*tp_as_number*/
+ &Matrix_SeqMethods, /*tp_as_sequence*/
+ &Matrix_AsMapping, /*tp_as_mapping*/
+ NULL, /*tp_hash*/
+ NULL, /*tp_call*/
+ NULL, /*tp_str*/
+ NULL, /*tp_getattro*/
+ NULL, /*tp_setattro*/
+ NULL, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+ matrix_doc, /*tp_doc*/
+ (traverseproc)BaseMathObject_traverse, //tp_traverse
+ (inquiry)BaseMathObject_clear, //tp_clear
+ (richcmpfunc)Matrix_richcmpr, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ NULL, /*tp_iter*/
+ NULL, /*tp_iternext*/
+ Matrix_methods, /*tp_methods*/
+ NULL, /*tp_members*/
+ Matrix_getseters, /*tp_getset*/
+ NULL, /*tp_base*/
+ NULL, /*tp_dict*/
+ NULL, /*tp_descr_get*/
+ NULL, /*tp_descr_set*/
+ 0, /*tp_dictoffset*/
+ NULL, /*tp_init*/
+ NULL, /*tp_alloc*/
+ Matrix_new, /*tp_new*/
+ NULL, /*tp_free*/
+ NULL, /*tp_is_gc*/
+ NULL, /*tp_bases*/
+ NULL, /*tp_mro*/
+ NULL, /*tp_cache*/
+ NULL, /*tp_subclasses*/
+ NULL, /*tp_weaklist*/
+ NULL /*tp_del*/
+};
+
+/*------------------------newMatrixObject (internal)-------------
+creates a new matrix object
+self->matrix self->contiguous_ptr (reference to data.xxx)
+ [0]------------->[0]
+ [1]
+ [2]
+ [1]------------->[3]
+ [4]
+ [5]
+
+self->matrix[1][1] = self->contigPtr[4] */
+
+/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
+ (i.e. it was allocated elsewhere by MEM_mallocN())
+ pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
+ (i.e. it must be created here with PyMEM_malloc())*/
+PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsigned short colSize, int type, PyTypeObject *base_type)
+{
+ MatrixObject *self;
+ int x, row, col;
+
+ /*matrix objects can be any 2-4row x 2-4col matrix*/
+ if(rowSize < 2 || rowSize > 4 || colSize < 2 || colSize > 4) {
+ PyErr_SetString(PyExc_RuntimeError, "matrix(): row and column sizes must be between 2 and 4");
+ return NULL;
+ }
+
+ self= base_type ? (MatrixObject *)base_type->tp_alloc(base_type, 0) :
+ (MatrixObject *)PyObject_GC_New(MatrixObject, &matrix_Type);
+
+ if(self) {
+ self->row_size = rowSize;
+ self->col_size = colSize;
+
+ /* init callbacks as NULL */
+ self->cb_user= NULL;
+ self->cb_type= self->cb_subtype= 0;
+
+ if(type == Py_WRAP){
+ self->contigPtr = mat;
+ /*pointer array points to contigous memory*/
+ for(x = 0; x < rowSize; x++) {
+ self->matrix[x] = self->contigPtr + (x * colSize);
+ }
+ self->wrapped = Py_WRAP;
+ }
+ else if (type == Py_NEW){
+ self->contigPtr = PyMem_Malloc(rowSize * colSize * sizeof(float));
+ if(self->contigPtr == NULL) { /*allocation failure*/
+ PyErr_SetString(PyExc_MemoryError, "matrix(): problem allocating pointer space");
+ return NULL;
+ }
+ /*pointer array points to contigous memory*/
+ for(x = 0; x < rowSize; x++) {
+ self->matrix[x] = self->contigPtr + (x * colSize);
+ }
+ /*parse*/
+ if(mat) { /*if a float array passed*/
+ for(row = 0; row < rowSize; row++) {
+ for(col = 0; col < colSize; col++) {
+ self->matrix[row][col] = mat[(row * colSize) + col];
+ }
+ }
+ }
+ else if (rowSize == colSize ) { /*or if no arguments are passed return identity matrix for square matrices */
+ PyObject *ret_dummy= Matrix_identity(self);
+ Py_DECREF(ret_dummy);
+ }
+ self->wrapped = Py_NEW;
+ }
+ else {
+ PyErr_SetString(PyExc_RuntimeError, "Matrix(): invalid type");
+ return NULL;
+ }
+ }
+ return (PyObject *) self;
+}
+
+PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb_type, int cb_subtype)
+{
+ MatrixObject *self= (MatrixObject *)newMatrixObject(NULL, rowSize, colSize, Py_NEW, NULL);
+ if(self) {
+ Py_INCREF(cb_user);
+ self->cb_user= cb_user;
+ self->cb_type= (unsigned char)cb_type;
+ self->cb_subtype= (unsigned char)cb_subtype;
+ }
+ return (PyObject *) self;
+}
diff --git a/source/blender/python/generic/mathutils_matrix.h b/source/blender/python/generic/mathutils_Matrix.h
index 21538f8168e..505a7253f1a 100644
--- a/source/blender/python/generic/mathutils_matrix.h
+++ b/source/blender/python/generic/mathutils_Matrix.h
@@ -27,10 +27,8 @@
*
*/
-#ifndef EXPP_matrix_h
-#define EXPP_matrix_h
-
-#include <Python.h>
+#ifndef MATHUTILS_MATRIX_H
+#define MATHUTILS_MATRIX_H
extern PyTypeObject matrix_Type;
#define MatrixObject_Check(_v) PyObject_TypeCheck((_v), &matrix_Type)
@@ -38,10 +36,9 @@ extern PyTypeObject matrix_Type;
typedef struct {
BASE_MATH_MEMBERS(contigPtr)
-
- unsigned char rowSize;
- unsigned int colSize;
float *matrix[MATRIX_MAX_DIM]; /* ptr to the contigPtr (accessor) */
+ unsigned short row_size;
+ unsigned short col_size;
} MatrixObject;
/*struct data contains a pointer to the actual data that the
@@ -50,10 +47,12 @@ be stored in py_data) or be a wrapper for data allocated through
blender (stored in blend_data). This is an either/or struct not both*/
/*prototypes*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type);
-PyObject *newMatrixObject_cb(PyObject *user, int rowSize, int colSize, int cb_type, int cb_subtype);
+PyObject *newMatrixObject(float *mat, const unsigned short row_size, const unsigned short col_size, int type, PyTypeObject *base_type);
+PyObject *newMatrixObject_cb(PyObject *user, int row_size, int col_size, int cb_type, int cb_subtype);
extern int mathutils_matrix_vector_cb_index;
extern struct Mathutils_Callback mathutils_matrix_vector_cb;
-#endif /* EXPP_matrix_H */
+void matrix_as_3x3(float mat[3][3], MatrixObject *self);
+
+#endif /* MATHUTILS_MATRIX_H */
diff --git a/source/blender/python/generic/mathutils_quat.c b/source/blender/python/generic/mathutils_Quaternion.c
index 553844b6ee5..42c295c0d7e 100644
--- a/source/blender/python/generic/mathutils_quat.c
+++ b/source/blender/python/generic/mathutils_Quaternion.c
@@ -20,23 +20,28 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- *
+ *
* Contributor(s): Joseph Gilbert
*
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "mathutils.h"
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#define QUAT_SIZE 4
+static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self);
+static PyObject *Quaternion_copy(QuaternionObject *self);
+
//-----------------------------METHODS------------------------------
/* note: BaseMath_ReadCallback must be called beforehand */
-static PyObject *Quaternion_ToTupleExt(QuaternionObject *self, int ndigits)
+static PyObject *Quaternion_to_tuple_ext(QuaternionObject *self, int ndigits)
{
PyObject *ret;
int i;
@@ -57,7 +62,7 @@ static PyObject *Quaternion_ToTupleExt(QuaternionObject *self, int ndigits)
return ret;
}
-static char Quaternion_ToEuler_doc[] =
+static char Quaternion_to_euler_doc[] =
".. method:: to_euler(order, euler_compat)\n"
"\n"
" Return Euler representation of the quaternion.\n"
@@ -67,18 +72,19 @@ static char Quaternion_ToEuler_doc[] =
" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
" :type euler_compat: :class:`Euler`\n"
" :return: Euler representation of the quaternion.\n"
-" :rtype: :class:`Euler`\n";
-
-static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
+" :rtype: :class:`Euler`\n"
+;
+static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
{
+ float tquat[4];
float eul[3];
- char *order_str= NULL;
+ const char *order_str= NULL;
short order= EULER_ORDER_XYZ;
EulerObject *eul_compat = NULL;
-
+
if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
return NULL;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -89,34 +95,36 @@ static PyObject *Quaternion_ToEuler(QuaternionObject * self, PyObject *args)
return NULL;
}
+ normalize_qt_qt(tquat, self->quat);
+
if(eul_compat) {
float mat[3][3];
-
+
if(!BaseMath_ReadCallback(eul_compat))
return NULL;
-
- quat_to_mat3(mat, self->quat);
+
+ quat_to_mat3(mat, tquat);
if(order == EULER_ORDER_XYZ) mat3_to_compatible_eul(eul, eul_compat->eul, mat);
else mat3_to_compatible_eulO(eul, eul_compat->eul, order, mat);
}
else {
- if(order == EULER_ORDER_XYZ) quat_to_eul(eul, self->quat);
- else quat_to_eulO(eul, order, self->quat);
+ if(order == EULER_ORDER_XYZ) quat_to_eul(eul, tquat);
+ else quat_to_eulO(eul, order, tquat);
}
-
+
return newEulerObject(eul, order, Py_NEW, NULL);
}
//----------------------------Quaternion.toMatrix()------------------
-static char Quaternion_ToMatrix_doc[] =
+static char Quaternion_to_matrix_doc[] =
".. method:: to_matrix()\n"
"\n"
" Return a matrix representation of the quaternion.\n"
"\n"
" :return: A 3x3 rotation matrix representation of the quaternion.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *Quaternion_ToMatrix(QuaternionObject * self)
+" :rtype: :class:`Matrix`\n"
+;
+static PyObject *Quaternion_to_matrix(QuaternionObject *self)
{
float mat[9]; /* all values are set */
@@ -128,7 +136,7 @@ static PyObject *Quaternion_ToMatrix(QuaternionObject * self)
}
//----------------------------Quaternion.cross(other)------------------
-static char Quaternion_Cross_doc[] =
+static char Quaternion_cross_doc[] =
".. method:: cross(other)\n"
"\n"
" Return the cross product of this quaternion and another.\n"
@@ -136,26 +144,24 @@ static char Quaternion_Cross_doc[] =
" :arg other: The other quaternion to perform the cross product with.\n"
" :type other: :class:`Quaternion`\n"
" :return: The cross product.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Cross(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_cross(QuaternionObject *self, PyObject *value)
{
- float quat[QUAT_SIZE];
-
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.cross(value): expected a quaternion argument" );
+ float quat[QUAT_SIZE], tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.cross(other), invalid 'other' arg") == -1)
return NULL;
- mul_qt_qtqt(quat, self->quat, value->quat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ mul_qt_qtqt(quat, self->quat, tquat);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
}
//----------------------------Quaternion.dot(other)------------------
-static char Quaternion_Dot_doc[] =
+static char Quaternion_dot_doc[] =
".. method:: dot(other)\n"
"\n"
" Return the dot product of this quaternion and another.\n"
@@ -163,22 +169,22 @@ static char Quaternion_Dot_doc[] =
" :arg other: The other quaternion to perform the dot product with.\n"
" :type other: :class:`Quaternion`\n"
" :return: The dot product.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Dot(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_dot(QuaternionObject *self, PyObject *value)
{
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.dot(value): expected a quaternion argument" );
+ float tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.dot(other), invalid 'other' arg") == -1)
return NULL;
- return PyFloat_FromDouble(dot_qtqt(self->quat, value->quat));
+ return PyFloat_FromDouble(dot_qtqt(self->quat, tquat));
}
-static char Quaternion_Difference_doc[] =
+static char Quaternion_difference_doc[] =
".. function:: difference(other)\n"
"\n"
" Returns a quaternion representing the rotational difference.\n"
@@ -186,26 +192,24 @@ static char Quaternion_Difference_doc[] =
" :arg other: second quaternion.\n"
" :type other: :class:`Quaternion`\n"
" :return: the rotational difference between the two quat rotations.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Difference(QuaternionObject * self, QuaternionObject * value)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_difference(QuaternionObject *self, PyObject *value)
{
- float quat[QUAT_SIZE];
+ float tquat[QUAT_SIZE], quat[QUAT_SIZE];
- if (!QuaternionObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "quat.difference(value): expected a quaternion argument" );
+ if(!BaseMath_ReadCallback(self))
return NULL;
- }
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.difference(other), invalid 'other' arg") == -1)
return NULL;
- rotation_between_quats_to_quat(quat, self->quat, value->quat);
+ rotation_between_quats_to_quat(quat, self->quat, tquat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
}
-static char Quaternion_Slerp_doc[] =
+static char Quaternion_slerp_doc[] =
".. function:: slerp(other, factor)\n"
"\n"
" Returns the interpolation of two quaternions.\n"
@@ -215,19 +219,22 @@ static char Quaternion_Slerp_doc[] =
" :arg factor: The interpolation value in [0.0, 1.0].\n"
" :type factor: float\n"
" :return: The interpolated rotation.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Slerp(QuaternionObject *self, PyObject *args)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_slerp(QuaternionObject *self, PyObject *args)
{
- QuaternionObject *value;
- float quat[QUAT_SIZE], fac;
+ PyObject *value;
+ float tquat[QUAT_SIZE], quat[QUAT_SIZE], fac;
- if(!PyArg_ParseTuple(args, "O!f:slerp", &quaternion_Type, &value, &fac)) {
+ if(!PyArg_ParseTuple(args, "Of:slerp", &value, &fac)) {
PyErr_SetString(PyExc_TypeError, "quat.slerp(): expected Quaternion types and float");
return NULL;
}
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.slerp(other), invalid 'other' arg") == -1)
return NULL;
if(fac > 1.0f || fac < 0.0f) {
@@ -235,112 +242,167 @@ static PyObject *Quaternion_Slerp(QuaternionObject *self, PyObject *args)
return NULL;
}
- interp_qt_qtqt(quat, self->quat, value->quat, fac);
+ interp_qt_qtqt(quat, self->quat, tquat, fac);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(self));
+}
+
+static char Quaternion_rotate_doc[] =
+".. method:: rotate(other)\n"
+"\n"
+" Rotates the quaternion a by another mathutils value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Quaternion_rotate(QuaternionObject *self, PyObject *value)
+{
+ float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
+ float tquat[4], length;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "quaternion.rotate(value)") == -1)
+ return NULL;
+
+ length= normalize_qt_qt(tquat, self->quat);
+ quat_to_mat3(self_rmat, tquat);
+ mul_m3_m3m3(rmat, self_rmat, other_rmat);
+
+ mat3_to_quat(self->quat, rmat);
+ mul_qt_fl(self->quat, length); /* maintain length after rotating */
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.normalize()----------------
//normalize the axis of rotation of [theta,vector]
-static char Quaternion_Normalize_doc[] =
+static char Quaternion_normalize_doc[] =
".. function:: normalize()\n"
"\n"
" Normalize the quaternion.\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Normalize(QuaternionObject * self)
+;
+static PyObject *Quaternion_normalize(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
normalize_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
-//----------------------------Quaternion.inverse()------------------
-static char Quaternion_Inverse_doc[] =
-".. function:: inverse()\n"
+static char Quaternion_normalized_doc[] =
+".. function:: normalized()\n"
"\n"
-" Set the quaternion to its inverse.\n"
+" Return a new normalized quaternion.\n"
"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
+" :return: a normalized copy.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_normalized(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_normalize, self);
+}
-static PyObject *Quaternion_Inverse(QuaternionObject * self)
+//----------------------------Quaternion.invert()------------------
+static char Quaternion_invert_doc[] =
+".. function:: invert()\n"
+"\n"
+" Set the quaternion to its inverse.\n"
+;
+static PyObject *Quaternion_invert(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
invert_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+static char Quaternion_inverted_doc[] =
+".. function:: inverted()\n"
+"\n"
+" Return a new, inverted quaternion.\n"
+"\n"
+" :return: the inverted value.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_inverted(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_invert, self);
}
+
//----------------------------Quaternion.identity()-----------------
-static char Quaternion_Identity_doc[] =
+static char Quaternion_identity_doc[] =
".. function:: identity()\n"
"\n"
" Set the quaternion to an identity quaternion.\n"
"\n"
" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Identity(QuaternionObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_identity(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
unit_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.negate()-------------------
-static char Quaternion_Negate_doc[] =
+static char Quaternion_negate_doc[] =
".. function:: negate()\n"
"\n"
" Set the quaternion to its negative.\n"
"\n"
" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Negate(QuaternionObject * self)
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_negate(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
mul_qt_fl(self->quat, -1.0f);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
//----------------------------Quaternion.conjugate()----------------
-static char Quaternion_Conjugate_doc[] =
+static char Quaternion_conjugate_doc[] =
".. function:: conjugate()\n"
"\n"
" Set the quaternion to its conjugate (negate x, y, z).\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Quaternion_Conjugate(QuaternionObject * self)
+;
+static PyObject *Quaternion_conjugate(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
conjugate_qt(self->quat);
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
}
+static char Quaternion_conjugated_doc[] =
+".. function:: conjugated()\n"
+"\n"
+" Return a new conjugated quaternion.\n"
+"\n"
+" :return: a new quaternion.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Quaternion_conjugated(QuaternionObject *self)
+{
+ return quat__apply_to_copy((PyNoArgsFunction)Quaternion_conjugate, self);
+}
+
//----------------------------Quaternion.copy()----------------
static char Quaternion_copy_doc[] =
".. function:: copy()\n"
@@ -350,9 +412,9 @@ static char Quaternion_copy_doc[] =
" :return: A copy of the quaternion.\n"
" :rtype: :class:`Quaternion`\n"
"\n"
-" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n";
-
-static PyObject *Quaternion_copy(QuaternionObject * self)
+" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n"
+;
+static PyObject *Quaternion_copy(QuaternionObject *self)
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -362,14 +424,14 @@ static PyObject *Quaternion_copy(QuaternionObject * self)
//----------------------------print object (internal)--------------
//print the object to screen
-static PyObject *Quaternion_repr(QuaternionObject * self)
+static PyObject *Quaternion_repr(QuaternionObject *self)
{
PyObject *ret, *tuple;
-
+
if(!BaseMath_ReadCallback(self))
return NULL;
- tuple= Quaternion_ToTupleExt(self, -1);
+ tuple= Quaternion_to_tuple_ext(self, -1);
ret= PyUnicode_FromFormat("Quaternion(%R)", tuple);
@@ -377,70 +439,57 @@ static PyObject *Quaternion_repr(QuaternionObject * self)
return ret;
}
-//------------------------tp_richcmpr
-//returns -1 execption, 0 false, 1 true
-static PyObject* Quaternion_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+static PyObject* Quaternion_richcmpr(PyObject *a, PyObject *b, int op)
{
- QuaternionObject *quatA = NULL, *quatB = NULL;
- int result = 0;
+ PyObject *res;
+ int ok= -1; /* zero is true */
- if(QuaternionObject_Check(objectA)) {
- quatA = (QuaternionObject*)objectA;
- if(!BaseMath_ReadCallback(quatA))
- return NULL;
- }
- if(QuaternionObject_Check(objectB)) {
- quatB = (QuaternionObject*)objectB;
- if(!BaseMath_ReadCallback(quatB))
+ if (QuaternionObject_Check(a) && QuaternionObject_Check(b)) {
+ QuaternionObject *quatA= (QuaternionObject *)a;
+ QuaternionObject *quatB= (QuaternionObject *)b;
+
+ if(!BaseMath_ReadCallback(quatA) || !BaseMath_ReadCallback(quatB))
return NULL;
- }
- if (!quatA || !quatB){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
+ ok= (EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1)) ? 0 : -1;
}
- switch (comparison_type){
- case Py_EQ:
- result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1);
- break;
- case Py_NE:
- result = EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1);
- if (result == 0){
- result = 1;
- }else{
- result = 0;
- }
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
+ switch (op) {
+ case Py_NE:
+ ok = !ok; /* pass through */
+ case Py_EQ:
+ res = ok ? Py_False : Py_True;
+ break;
+
+ case Py_LT:
+ case Py_LE:
+ case Py_GT:
+ case Py_GE:
+ res = Py_NotImplemented;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
+
+ return Py_INCREF(res), res;
}
//---------------------SEQUENCE PROTOCOLS------------------------
//----------------------------len(object)------------------------
//sequence length
-static int Quaternion_len(QuaternionObject * self)
+static int Quaternion_len(QuaternionObject *UNUSED(self))
{
return QUAT_SIZE;
}
//----------------------------object[]---------------------------
//sequence accessor (get)
-static PyObject *Quaternion_item(QuaternionObject * self, int i)
+static PyObject *Quaternion_item(QuaternionObject *self, int i)
{
if(i<0) i= QUAT_SIZE-i;
if(i < 0 || i >= QUAT_SIZE) {
- PyErr_SetString(PyExc_IndexError, "quaternion[attribute]: array index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "quaternion[attribute]: array index out of range");
return NULL;
}
@@ -452,18 +501,18 @@ static PyObject *Quaternion_item(QuaternionObject * self, int i)
}
//----------------------------object[]-------------------------
//sequence accessor (set)
-static int Quaternion_ass_item(QuaternionObject * self, int i, PyObject * ob)
+static int Quaternion_ass_item(QuaternionObject *self, int i, PyObject *ob)
{
float scalar= (float)PyFloat_AsDouble(ob);
if(scalar==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "quaternion[index] = x: index argument not a number\n");
+ PyErr_SetString(PyExc_TypeError, "quaternion[index] = x: index argument not a number");
return -1;
}
if(i<0) i= QUAT_SIZE-i;
if(i < 0 || i >= QUAT_SIZE){
- PyErr_SetString(PyExc_IndexError, "quaternion[attribute] = x: array assignment index out of range\n");
+ PyErr_SetString(PyExc_IndexError, "quaternion[attribute] = x: array assignment index out of range");
return -1;
}
self->quat[i] = scalar;
@@ -475,9 +524,9 @@ static int Quaternion_ass_item(QuaternionObject * self, int i, PyObject * ob)
}
//----------------------------object[z:y]------------------------
//sequence slice (get)
-static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end)
+static PyObject *Quaternion_slice(QuaternionObject *self, int begin, int end)
{
- PyObject *list = NULL;
+ PyObject *tuple;
int count;
if(!BaseMath_ReadCallback(self))
@@ -486,19 +535,18 @@ static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end)
CLAMP(begin, 0, QUAT_SIZE);
if (end<0) end= (QUAT_SIZE + 1) + end;
CLAMP(end, 0, QUAT_SIZE);
- begin = MIN2(begin,end);
+ begin= MIN2(begin, end);
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- PyFloat_FromDouble(self->quat[count]));
+ tuple= PyTuple_New(end - begin);
+ for(count= begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->quat[count]));
}
- return list;
+ return tuple;
}
//----------------------------object[z:y]------------------------
//sequence slice (set)
-static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyObject * seq)
+static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyObject *seq)
{
int i, size;
float quat[QUAT_SIZE];
@@ -513,7 +561,7 @@ static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyO
if((size=mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1)
return -1;
-
+
if(size != (end - begin)){
PyErr_SetString(PyExc_TypeError, "quaternion[begin:end] = []: size mismatch in slice assignment");
return -1;
@@ -523,7 +571,7 @@ static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end, PyO
for(i= 0; i < size; i++)
self->quat[begin + i] = quat[i];
- BaseMath_WriteCallback(self);
+ (void)BaseMath_WriteCallback(self);
return 0;
}
@@ -541,11 +589,11 @@ static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item)
} else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
return NULL;
if (slicelength <= 0) {
- return PyList_New(0);
+ return PyTuple_New(0);
}
else if (step == 1) {
return Quaternion_slice(self, start, stop);
@@ -556,9 +604,7 @@ static PyObject *Quaternion_subscript(QuaternionObject *self, PyObject *item)
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "quaternion indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "quaternion indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return NULL;
}
}
@@ -577,7 +623,7 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
+ if (PySlice_GetIndicesEx((void *)item, QUAT_SIZE, &start, &stop, &step, &slicelength) < 0)
return -1;
if (step == 1)
@@ -588,9 +634,7 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
}
}
else {
- PyErr_Format(PyExc_TypeError,
- "quaternion indices must be integers, not %.200s",
- item->ob_type->tp_name);
+ PyErr_Format(PyExc_TypeError, "quaternion indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -598,40 +642,40 @@ static int Quaternion_ass_subscript(QuaternionObject *self, PyObject *item, PyOb
//------------------------NUMERIC PROTOCOLS----------------------
//------------------------obj + obj------------------------------
//addition
-static PyObject *Quaternion_add(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_add(PyObject *q1, PyObject *q2)
{
float quat[QUAT_SIZE];
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation");
return NULL;
}
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
-
+
if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
return NULL;
add_qt_qtqt(quat, quat1->quat, quat2->quat, 1.0f);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
//------------------------obj - obj------------------------------
//subtraction
-static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_sub(PyObject *q1, PyObject *q2)
{
int x;
float quat[QUAT_SIZE];
QuaternionObject *quat1 = NULL, *quat2 = NULL;
if(!QuaternionObject_Check(q1) || !QuaternionObject_Check(q2)) {
- PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation....\n");
+ PyErr_SetString(PyExc_AttributeError, "Quaternion addition: arguments not valid for this operation");
return NULL;
}
-
+
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
-
+
if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
return NULL;
@@ -639,15 +683,23 @@ static PyObject *Quaternion_sub(PyObject * q1, PyObject * q2)
quat[x] = quat1->quat[x] - quat2->quat[x];
}
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
+}
+
+static PyObject *quat_mul_float(QuaternionObject *quat, const float scalar)
+{
+ float tquat[4];
+ copy_qt_qt(tquat, quat->quat);
+ mul_qt_fl(tquat, scalar);
+ return newQuaternionObject(tquat, Py_NEW, Py_TYPE(quat));
}
+
//------------------------obj * obj------------------------------
//mulplication
-static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
+static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
{
float quat[QUAT_SIZE], scalar;
QuaternionObject *quat1 = NULL, *quat2 = NULL;
- VectorObject *vec = NULL;
if(QuaternionObject_Check(q1)) {
quat1 = (QuaternionObject*)q1;
@@ -662,49 +714,41 @@ static PyObject *Quaternion_mul(PyObject * q1, PyObject * q2)
if(quat1 && quat2) { /* QUAT*QUAT (cross product) */
mul_qt_qtqt(quat, quat1->quat, quat2->quat);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
-
/* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
- if(!QuaternionObject_Check(q1)) {
- scalar= PyFloat_AsDouble(q1);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* FLOAT*QUAT */
- QUATCOPY(quat, quat2->quat);
- mul_qt_fl(quat, scalar);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ else if(quat2) { /* FLOAT*QUAT */
+ if(((scalar= PyFloat_AsDouble(q1)) == -1.0 && PyErr_Occurred())==0) {
+ return quat_mul_float(quat2, scalar);
}
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: val * quat, val is not an acceptable type");
- return NULL;
}
- else { /* QUAT*SOMETHING */
- if(VectorObject_Check(q2)){ /* QUAT*VEC */
- float tvec[3];
- vec = (VectorObject*)q2;
- if(vec->size != 3){
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: only 3D vector rotations currently supported\n");
- return NULL;
- }
- if(!BaseMath_ReadCallback(vec)) {
- return NULL;
- }
-
- copy_v3_v3(tvec, vec->vec);
- mul_qt_v3(quat1->quat, tvec);
- return newVectorObject(tvec, 3, Py_NEW, NULL);
- }
-
- scalar= PyFloat_AsDouble(q2);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* QUAT*FLOAT */
- QUATCOPY(quat, quat1->quat);
- mul_qt_fl(quat, scalar);
- return newQuaternionObject(quat, Py_NEW, NULL);
+ else if (quat1) { /* QUAT*FLOAT */
+ if((((scalar= PyFloat_AsDouble(q2)) == -1.0 && PyErr_Occurred())==0)) {
+ return quat_mul_float(quat1, scalar);
}
}
-
- PyErr_SetString(PyExc_TypeError, "Quaternion multiplication: arguments not acceptable for this operation\n");
+ else {
+ BLI_assert(!"internal error");
+ }
+
+ PyErr_Format(PyExc_TypeError, "Quaternion multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(q1)->tp_name, Py_TYPE(q2)->tp_name);
return NULL;
}
+/* -obj
+ returns the negative of this object*/
+static PyObject *Quaternion_neg(QuaternionObject *self)
+{
+ float tquat[QUAT_SIZE];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ negate_v4_v4(tquat, self->quat);
+ return newQuaternionObject(tquat, Py_NEW, Py_TYPE(self));
+}
+
+
//-----------------PROTOCOL DECLARATIONS--------------------------
static PySequenceMethods Quaternion_SeqMethods = {
(lenfunc) Quaternion_len, /* sq_length */
@@ -729,50 +773,50 @@ static PyNumberMethods Quaternion_NumMethods = {
(binaryfunc) Quaternion_add, /*nb_add*/
(binaryfunc) Quaternion_sub, /*nb_subtract*/
(binaryfunc) Quaternion_mul, /*nb_multiply*/
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- (unaryfunc) 0, /*nb_negative*/
+ NULL, /*nb_remainder*/
+ NULL, /*nb_divmod*/
+ NULL, /*nb_power*/
+ (unaryfunc) Quaternion_neg, /*nb_negative*/
(unaryfunc) 0, /*tp_positive*/
(unaryfunc) 0, /*tp_absolute*/
(inquiry) 0, /*tp_bool*/
(unaryfunc) 0, /*nb_invert*/
- 0, /*nb_lshift*/
+ NULL, /*nb_lshift*/
(binaryfunc)0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- 0, /*nb_int*/
- 0, /*nb_reserved*/
- 0, /*nb_float*/
- 0, /* nb_inplace_add */
- 0, /* nb_inplace_subtract */
- 0, /* nb_inplace_multiply */
- 0, /* nb_inplace_remainder */
- 0, /* nb_inplace_power */
- 0, /* nb_inplace_lshift */
- 0, /* nb_inplace_rshift */
- 0, /* nb_inplace_and */
- 0, /* nb_inplace_xor */
- 0, /* nb_inplace_or */
- 0, /* nb_floor_divide */
- 0, /* nb_true_divide */
- 0, /* nb_inplace_floor_divide */
- 0, /* nb_inplace_true_divide */
- 0, /* nb_index */
+ NULL, /*nb_and*/
+ NULL, /*nb_xor*/
+ NULL, /*nb_or*/
+ NULL, /*nb_int*/
+ NULL, /*nb_reserved*/
+ NULL, /*nb_float*/
+ NULL, /* nb_inplace_add */
+ NULL, /* nb_inplace_subtract */
+ NULL, /* nb_inplace_multiply */
+ NULL, /* nb_inplace_remainder */
+ NULL, /* nb_inplace_power */
+ NULL, /* nb_inplace_lshift */
+ NULL, /* nb_inplace_rshift */
+ NULL, /* nb_inplace_and */
+ NULL, /* nb_inplace_xor */
+ NULL, /* nb_inplace_or */
+ NULL, /* nb_floor_divide */
+ NULL, /* nb_true_divide */
+ NULL, /* nb_inplace_floor_divide */
+ NULL, /* nb_inplace_true_divide */
+ NULL, /* nb_index */
};
-static PyObject *Quaternion_getAxis( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getAxis( QuaternionObject *self, void *type )
{
return Quaternion_item(self, GET_INT_FROM_POINTER(type));
}
-static int Quaternion_setAxis( QuaternionObject * self, PyObject * value, void * type )
+static int Quaternion_setAxis( QuaternionObject *self, PyObject *value, void *type )
{
return Quaternion_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
-static PyObject *Quaternion_getMagnitude( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(closure))
{
if(!BaseMath_ReadCallback(self))
return NULL;
@@ -780,31 +824,40 @@ static PyObject *Quaternion_getMagnitude( QuaternionObject * self, void *type )
return PyFloat_FromDouble(sqrt(dot_qtqt(self->quat, self->quat)));
}
-static PyObject *Quaternion_getAngle( QuaternionObject * self, void *type )
+static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closure))
{
+ float tquat[4];
+
if(!BaseMath_ReadCallback(self))
return NULL;
- return PyFloat_FromDouble(2.0 * (saacos(self->quat[0])));
+ normalize_qt_qt(tquat, self->quat);
+ return PyFloat_FromDouble(2.0 * (saacos(tquat[0])));
}
-static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void * type)
+static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
- float axis[3];
- float angle;
+ float tquat[4];
+ float len;
+
+ float axis[3], angle_dummy;
+ double angle;
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle_dummy, tquat);
- angle = PyFloat_AsDouble(value);
+ angle= PyFloat_AsDouble(value);
if(angle==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError, "quaternion.angle = value: float expected");
return -1;
}
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
@@ -812,8 +865,9 @@ static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void *
) {
axis[0] = 1.0f;
}
-
+
axis_angle_to_quat(self->quat, axis, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
@@ -821,15 +875,18 @@ static int Quaternion_setAngle(QuaternionObject * self, PyObject * value, void *
return 0;
}
-static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *type)
+static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(closure))
{
+ float tquat[4];
+
float axis[3];
float angle;
if(!BaseMath_ReadCallback(self))
return NULL;
-
- quat_to_axis_angle(axis, &angle, self->quat);
+
+ normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
@@ -842,28 +899,25 @@ static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *type)
return (PyObject *) newVectorObject(axis, 3, Py_NEW, NULL);
}
-static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *type)
+static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
{
+ float tquat[4];
+ float len;
+
float axis[3];
float angle;
-
- VectorObject *vec;
if(!BaseMath_ReadCallback(self))
return -1;
- quat_to_axis_angle(axis, &angle, self->quat);
+ len= normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat); /* axis value is unused */
- if(!VectorObject_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "quaternion.axis = value: expected a 3D Vector");
- return -1;
- }
-
- vec= (VectorObject *)value;
- if(!BaseMath_ReadCallback(vec))
+ if (mathutils_array_parse(axis, 3, 3, value, "quat.axis = other") == -1)
return -1;
- axis_angle_to_quat(self->quat, vec->vec, angle);
+ axis_angle_to_quat(self->quat, axis, angle);
+ mul_qt_fl(self->quat, len);
if(!BaseMath_WriteCallback(self))
return -1;
@@ -875,10 +929,15 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *seq= NULL;
- float angle = 0.0f;
+ double angle = 0.0f;
float quat[QUAT_SIZE]= {0.0f, 0.0f, 0.0f, 0.0f};
- if(!PyArg_ParseTuple(args, "|Of:mathutils.Quaternion", &seq, &angle))
+ if(kwds && PyDict_Size(kwds)) {
+ PyErr_SetString(PyExc_TypeError, "mathutils.Quaternion(): takes no keyword args");
+ return NULL;
+ }
+
+ if(!PyArg_ParseTuple(args, "|Od:mathutils.Quaternion", &seq, &angle))
return NULL;
switch(PyTuple_GET_SIZE(args)) {
@@ -891,28 +950,55 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
case 2:
if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1)
return NULL;
-
+ angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; /* clamp because of precision issues */
axis_angle_to_quat(quat, quat, angle);
break;
/* PyArg_ParseTuple assures no more then 2 */
}
- return newQuaternionObject(quat, Py_NEW, NULL);
+ return newQuaternionObject(quat, Py_NEW, type);
}
+static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self)
+{
+ PyObject *ret= Quaternion_copy(self);
+ PyObject *ret_dummy= quat_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
+ }
+}
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Quaternion_methods[] = {
- {"identity", (PyCFunction) Quaternion_Identity, METH_NOARGS, Quaternion_Identity_doc},
- {"negate", (PyCFunction) Quaternion_Negate, METH_NOARGS, Quaternion_Negate_doc},
- {"conjugate", (PyCFunction) Quaternion_Conjugate, METH_NOARGS, Quaternion_Conjugate_doc},
- {"inverse", (PyCFunction) Quaternion_Inverse, METH_NOARGS, Quaternion_Inverse_doc},
- {"normalize", (PyCFunction) Quaternion_Normalize, METH_NOARGS, Quaternion_Normalize_doc},
- {"to_euler", (PyCFunction) Quaternion_ToEuler, METH_VARARGS, Quaternion_ToEuler_doc},
- {"to_matrix", (PyCFunction) Quaternion_ToMatrix, METH_NOARGS, Quaternion_ToMatrix_doc},
- {"cross", (PyCFunction) Quaternion_Cross, METH_O, Quaternion_Cross_doc},
- {"dot", (PyCFunction) Quaternion_Dot, METH_O, Quaternion_Dot_doc},
- {"difference", (PyCFunction) Quaternion_Difference, METH_O, Quaternion_Difference_doc},
- {"slerp", (PyCFunction) Quaternion_Slerp, METH_VARARGS, Quaternion_Slerp_doc},
+ /* in place only */
+ {"identity", (PyCFunction) Quaternion_identity, METH_NOARGS, Quaternion_identity_doc},
+ {"negate", (PyCFunction) Quaternion_negate, METH_NOARGS, Quaternion_negate_doc},
+
+ /* operate on original or copy */
+ {"conjugate", (PyCFunction) Quaternion_conjugate, METH_NOARGS, Quaternion_conjugate_doc},
+ {"conjugated", (PyCFunction) Quaternion_conjugated, METH_NOARGS, Quaternion_conjugated_doc},
+
+ {"invert", (PyCFunction) Quaternion_invert, METH_NOARGS, Quaternion_invert_doc},
+ {"inverted", (PyCFunction) Quaternion_inverted, METH_NOARGS, Quaternion_inverted_doc},
+
+ {"normalize", (PyCFunction) Quaternion_normalize, METH_NOARGS, Quaternion_normalize_doc},
+ {"normalized", (PyCFunction) Quaternion_normalized, METH_NOARGS, Quaternion_normalized_doc},
+
+ /* return converted representation */
+ {"to_euler", (PyCFunction) Quaternion_to_euler, METH_VARARGS, Quaternion_to_euler_doc},
+ {"to_matrix", (PyCFunction) Quaternion_to_matrix, METH_NOARGS, Quaternion_to_matrix_doc},
+
+ /* operation between 2 or more types */
+ {"cross", (PyCFunction) Quaternion_cross, METH_O, Quaternion_cross_doc},
+ {"dot", (PyCFunction) Quaternion_dot, METH_O, Quaternion_dot_doc},
+ {"difference", (PyCFunction) Quaternion_difference, METH_O, Quaternion_difference_doc},
+ {"slerp", (PyCFunction) Quaternion_slerp, METH_VARARGS, Quaternion_slerp_doc},
+ {"rotate", (PyCFunction) Quaternion_rotate, METH_O, Quaternion_rotate_doc},
+
{"__copy__", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
{"copy", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc},
{NULL, NULL, 0, NULL}
@@ -922,69 +1008,69 @@ static struct PyMethodDef Quaternion_methods[] = {
/* Python attributes get/set structure: */
/*****************************************************************************/
static PyGetSetDef Quaternion_getseters[] = {
- {"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion W value.\n\n:type: float", (void *)0},
- {"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion X axis.\n\n:type: float", (void *)1},
- {"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Y axis.\n\n:type: float", (void *)2},
- {"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, "Quaternion Z axis.\n\n:type: float", (void *)3},
- {"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, "Size of the quaternion (readonly).\n\n:type: float", NULL},
- {"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, "angle of the quaternion.\n\n:type: float", NULL},
- {"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, "quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
+ {(char *)"w", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion W value.\n\n:type: float", (void *)0},
+ {(char *)"x", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion X axis.\n\n:type: float", (void *)1},
+ {(char *)"y", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Y axis.\n\n:type: float", (void *)2},
+ {(char *)"z", (getter)Quaternion_getAxis, (setter)Quaternion_setAxis, (char *)"Quaternion Z axis.\n\n:type: float", (void *)3},
+ {(char *)"magnitude", (getter)Quaternion_getMagnitude, (setter)NULL, (char *)"Size of the quaternion (readonly).\n\n:type: float", NULL},
+ {(char *)"angle", (getter)Quaternion_getAngle, (setter)Quaternion_setAngle, (char *)"angle of the quaternion.\n\n:type: float", NULL},
+ {(char *)"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, (char *)"quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
//------------------PY_OBECT DEFINITION--------------------------
static char quaternion_doc[] =
-"This object gives access to Quaternions in Blender.";
-
+"This object gives access to Quaternions in Blender."
+;
PyTypeObject quaternion_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "quaternion", //tp_name
+ "mathutils.Quaternion", //tp_name
sizeof(QuaternionObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
- 0, //tp_print
- 0, //tp_getattr
- 0, //tp_setattr
- 0, //tp_compare
+ NULL, //tp_print
+ NULL, //tp_getattr
+ NULL, //tp_setattr
+ NULL, //tp_compare
(reprfunc) Quaternion_repr, //tp_repr
&Quaternion_NumMethods, //tp_as_number
&Quaternion_SeqMethods, //tp_as_sequence
&Quaternion_AsMapping, //tp_as_mapping
- 0, //tp_hash
- 0, //tp_call
- 0, //tp_str
- 0, //tp_getattro
- 0, //tp_setattro
- 0, //tp_as_buffer
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, //tp_flags
+ NULL, //tp_hash
+ NULL, //tp_call
+ NULL, //tp_str
+ NULL, //tp_getattro
+ NULL, //tp_setattro
+ NULL, //tp_as_buffer
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, //tp_flags
quaternion_doc, //tp_doc
- 0, //tp_traverse
- 0, //tp_clear
+ (traverseproc)BaseMathObject_traverse, //tp_traverse
+ (inquiry)BaseMathObject_clear, //tp_clear
(richcmpfunc)Quaternion_richcmpr, //tp_richcompare
0, //tp_weaklistoffset
- 0, //tp_iter
- 0, //tp_iternext
+ NULL, //tp_iter
+ NULL, //tp_iternext
Quaternion_methods, //tp_methods
- 0, //tp_members
+ NULL, //tp_members
Quaternion_getseters, //tp_getset
- 0, //tp_base
- 0, //tp_dict
- 0, //tp_descr_get
- 0, //tp_descr_set
+ NULL, //tp_base
+ NULL, //tp_dict
+ NULL, //tp_descr_get
+ NULL, //tp_descr_set
0, //tp_dictoffset
- 0, //tp_init
- 0, //tp_alloc
+ NULL, //tp_init
+ NULL, //tp_alloc
Quaternion_new, //tp_new
- 0, //tp_free
- 0, //tp_is_gc
- 0, //tp_bases
- 0, //tp_mro
- 0, //tp_cache
- 0, //tp_subclasses
- 0, //tp_weaklist
- 0 //tp_del
+ NULL, //tp_free
+ NULL, //tp_is_gc
+ NULL, //tp_bases
+ NULL, //tp_mro
+ NULL, //tp_cache
+ NULL, //tp_subclasses
+ NULL, //tp_weaklist
+ NULL, //tp_del
};
//------------------------newQuaternionObject (internal)-------------
//creates a new quaternion object
@@ -995,27 +1081,32 @@ PyTypeObject quaternion_Type = {
PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
{
QuaternionObject *self;
-
- if(base_type) self = (QuaternionObject *)base_type->tp_alloc(base_type, 0);
- else self = PyObject_NEW(QuaternionObject, &quaternion_Type);
-
- /* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
-
- if(type == Py_WRAP){
- self->quat = quat;
- self->wrapped = Py_WRAP;
- }else if (type == Py_NEW){
- self->quat = PyMem_Malloc(QUAT_SIZE * sizeof(float));
- if(!quat) { //new empty
- unit_qt(self->quat);
- }else{
- QUATCOPY(self->quat, quat);
+
+ self= base_type ? (QuaternionObject *)base_type->tp_alloc(base_type, 0) :
+ (QuaternionObject *)PyObject_GC_New(QuaternionObject, &quaternion_Type);
+
+ if(self) {
+ /* init callbacks as NULL */
+ self->cb_user= NULL;
+ self->cb_type= self->cb_subtype= 0;
+
+ if(type == Py_WRAP){
+ self->quat = quat;
+ self->wrapped = Py_WRAP;
+ }
+ else if (type == Py_NEW){
+ self->quat = PyMem_Malloc(QUAT_SIZE * sizeof(float));
+ if(!quat) { //new empty
+ unit_qt(self->quat);
+ }else{
+ QUATCOPY(self->quat, quat);
+ }
+ self->wrapped = Py_NEW;
+ }
+ else{
+ PyErr_SetString(PyExc_RuntimeError, "Quaternion(): invalid type");
+ return NULL;
}
- self->wrapped = Py_NEW;
- }else{ //bad type
- return NULL;
}
return (PyObject *) self;
}
diff --git a/source/blender/python/generic/mathutils_quat.h b/source/blender/python/generic/mathutils_Quaternion.h
index c9ec12d6152..6052dfa1a41 100644
--- a/source/blender/python/generic/mathutils_quat.h
+++ b/source/blender/python/generic/mathutils_Quaternion.h
@@ -28,10 +28,8 @@
*
*/
-#ifndef EXPP_quat_h
-#define EXPP_quat_h
-
-#include <Python.h>
+#ifndef MATHUTILS_QUAT_H
+#define MATHUTILS_QUAT_H
extern PyTypeObject quaternion_Type;
#define QuaternionObject_Check(_v) PyObject_TypeCheck((_v), &quaternion_Type)
@@ -49,4 +47,4 @@ blender (stored in blend_data). This is an either/or struct not both*/
PyObject *newQuaternionObject( float *quat, int type, PyTypeObject *base_type);
PyObject *newQuaternionObject_cb(PyObject *cb_user, int cb_type, int cb_subtype);
-#endif /* EXPP_quat_h */
+#endif /* MATHUTILS_QUAT_H */
diff --git a/source/blender/python/generic/mathutils_Vector.c b/source/blender/python/generic/mathutils_Vector.c
new file mode 100644
index 00000000000..9408a61a368
--- /dev/null
+++ b/source/blender/python/generic/mathutils_Vector.c
@@ -0,0 +1,2274 @@
+/*
+ * $Id$
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Willian P. Germano, Joseph Gilbert, Ken Hughes, Alex Fraser, Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <Python.h>
+
+#include "mathutils.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#define MAX_DIMENSIONS 4
+
+/* Swizzle axes get packed into a single value that is used as a closure. Each
+ axis uses SWIZZLE_BITS_PER_AXIS bits. The first bit (SWIZZLE_VALID_AXIS) is
+ used as a sentinel: if it is unset, the axis is not valid. */
+#define SWIZZLE_BITS_PER_AXIS 3
+#define SWIZZLE_VALID_AXIS 0x4
+#define SWIZZLE_AXIS 0x3
+
+static PyObject *Vector_copy(VectorObject *self);
+static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits);
+
+/* Supports 2D, 3D, and 4D vector objects both int and float values
+ * accepted. Mixed float and int values accepted. Ints are parsed to float
+ */
+static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
+{
+ float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+ int size= 3; /* default to a 3D vector */
+
+ switch(PyTuple_GET_SIZE(args)) {
+ case 0:
+ break;
+ case 1:
+ if((size=mathutils_array_parse(vec, 2, 4, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1)
+ return NULL;
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "mathutils.Vector(): more then a single arg given");
+ return NULL;
+ }
+ return newVectorObject(vec, size, Py_NEW, type);
+}
+
+static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *self)
+{
+ PyObject *ret= Vector_copy(self);
+ PyObject *ret_dummy= vec_func(ret);
+ if(ret_dummy) {
+ Py_DECREF(ret_dummy);
+ return (PyObject *)ret;
+ }
+ else { /* error */
+ Py_DECREF(ret);
+ return NULL;
+ }
+}
+
+/*-----------------------------METHODS---------------------------- */
+static char Vector_zero_doc[] =
+".. method:: zero()\n"
+"\n"
+" Set all values to zero.\n"
+;
+static PyObject *Vector_zero(VectorObject *self)
+{
+ fill_vn(self->vec, self->size, 0.0f);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Vector_normalize_doc[] =
+".. method:: normalize()\n"
+"\n"
+" Normalize the vector, making the length of the vector always 1.0.\n"
+"\n"
+" .. warning:: Normalizing a vector where all values are zero results in all axis having a nan value (not a number).\n"
+"\n"
+" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n"
+;
+static PyObject *Vector_normalize(VectorObject *self)
+{
+ int i;
+ float norm = 0.0f;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ for(i = 0; i < self->size; i++) {
+ norm += self->vec[i] * self->vec[i];
+ }
+ norm = (float) sqrt(norm);
+ for(i = 0; i < self->size; i++) {
+ self->vec[i] /= norm;
+ }
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+static char Vector_normalized_doc[] =
+".. method:: normalized()\n"
+"\n"
+" Return a new, normalized vector.\n"
+"\n"
+" :return: a normalized copy of the vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_normalized(VectorObject *self)
+{
+ return vec__apply_to_copy((PyNoArgsFunction)Vector_normalize, self);
+}
+
+static char Vector_resize_2d_doc[] =
+".. method:: resize_2d()\n"
+"\n"
+" Resize the vector to 2D (x, y).\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_2d(VectorObject *self)
+{
+ if(self->wrapped==Py_WRAP) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_2d(): cannot resize wrapped data - only python vectors");
+ return NULL;
+ }
+ if(self->cb_user) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_2d(): cannot resize a vector that has an owner");
+ return NULL;
+ }
+
+ self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 2));
+ if(self->vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_2d(): problem allocating pointer space");
+ return NULL;
+ }
+
+ self->size = 2;
+ Py_RETURN_NONE;
+}
+
+static char Vector_resize_3d_doc[] =
+".. method:: resize_3d()\n"
+"\n"
+" Resize the vector to 3D (x, y, z).\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_3d(VectorObject *self)
+{
+ if (self->wrapped==Py_WRAP) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_3d(): cannot resize wrapped data - only python vectors");
+ return NULL;
+ }
+ if(self->cb_user) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_3d(): cannot resize a vector that has an owner");
+ return NULL;
+ }
+
+ self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 3));
+ if(self->vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_3d(): problem allocating pointer space");
+ return NULL;
+ }
+
+ if(self->size == 2)
+ self->vec[2] = 0.0f;
+
+ self->size = 3;
+ Py_RETURN_NONE;
+}
+
+static char Vector_resize_4d_doc[] =
+".. method:: resize_4d()\n"
+"\n"
+" Resize the vector to 4D (x, y, z, w).\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_resize_4d(VectorObject *self)
+{
+ if(self->wrapped==Py_WRAP) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_4d(): cannot resize wrapped data - only python vectors");
+ return NULL;
+ }
+ if(self->cb_user) {
+ PyErr_SetString(PyExc_TypeError, "vector.resize_4d(): cannot resize a vector that has an owner");
+ return NULL;
+ }
+
+ self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 4));
+ if(self->vec == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "vector.resize_4d(): problem allocating pointer space");
+ return NULL;
+ }
+ if(self->size == 2){
+ self->vec[2] = 0.0f;
+ self->vec[3] = 1.0f;
+ }else if(self->size == 3){
+ self->vec[3] = 1.0f;
+ }
+ self->size = 4;
+ Py_RETURN_NONE;
+}
+static char Vector_to_2d_doc[] =
+".. method:: to_2d()\n"
+"\n"
+" Return a 2d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_2d(VectorObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return newVectorObject(self->vec, 2, Py_NEW, Py_TYPE(self));
+}
+static char Vector_to_3d_doc[] =
+".. method:: to_3d()\n"
+"\n"
+" Return a 3d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_3d(VectorObject *self)
+{
+ float tvec[3]= {0.0f};
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 3));
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(self));
+}
+static char Vector_to_4d_doc[] =
+".. method:: to_4d()\n"
+"\n"
+" Return a 4d copy of the vector.\n"
+"\n"
+" :return: a new vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_to_4d(VectorObject *self)
+{
+ float tvec[4]= {0.0f, 0.0f, 0.0f, 1.0f};
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 4));
+ return newVectorObject(tvec, 4, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_to_tuple_doc[] =
+".. method:: to_tuple(precision=-1)\n"
+"\n"
+" Return this vector as a tuple with.\n"
+"\n"
+" :arg precision: The number to round the value to in [-1, 21].\n"
+" :type precision: int\n"
+" :return: the values of the vector rounded by *precision*\n"
+" :rtype: tuple\n"
+;
+/* note: BaseMath_ReadCallback must be called beforehand */
+static PyObject *Vector_to_tuple_ext(VectorObject *self, int ndigits)
+{
+ PyObject *ret;
+ int i;
+
+ ret= PyTuple_New(self->size);
+
+ if(ndigits >= 0) {
+ for(i = 0; i < self->size; i++) {
+ PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->vec[i], ndigits)));
+ }
+ }
+ else {
+ for(i = 0; i < self->size; i++) {
+ PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->vec[i]));
+ }
+ }
+
+ return ret;
+}
+
+static PyObject *Vector_to_tuple(VectorObject *self, PyObject *args)
+{
+ int ndigits= 0;
+
+ if(!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits))
+ return NULL;
+
+ if(ndigits > 22 || ndigits < 0) {
+ PyErr_SetString(PyExc_ValueError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21");
+ return NULL;
+ }
+
+ if(PyTuple_GET_SIZE(args)==0)
+ ndigits= -1;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return Vector_to_tuple_ext(self, ndigits);
+}
+
+static char Vector_to_track_quat_doc[] =
+".. method:: to_track_quat(track, up)\n"
+"\n"
+" Return a quaternion rotation from the vector and the track and up axis.\n"
+"\n"
+" :arg track: Track axis in ['X', 'Y', 'Z', '-X', '-Y', '-Z'].\n"
+" :type track: string\n"
+" :arg up: Up axis in ['X', 'Y', 'Z'].\n"
+" :type up: string\n"
+" :return: rotation from the vector and the track and up axis.\n"
+" :rtype: :class:`Quaternion`\n"
+;
+static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args )
+{
+ float vec[3], quat[4];
+ const char *strack, *sup;
+ short track = 2, up = 1;
+
+ if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup))
+ return NULL;
+
+ if (self->size != 3) {
+ PyErr_SetString(PyExc_TypeError, "only for 3D vectors");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if (strack) {
+ if (strlen(strack) == 2) {
+ if (strack[0] == '-') {
+ switch(strack[1]) {
+ case 'X':
+ track = 3;
+ break;
+ case 'Y':
+ track = 4;
+ break;
+ case 'Z':
+ track = 5;
+ break;
+ default:
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
+ return NULL;
+ }
+ }
+ else if (strlen(strack) == 1) {
+ switch(strack[0]) {
+ case '-':
+ case 'X':
+ track = 0;
+ break;
+ case 'Y':
+ track = 1;
+ break;
+ case 'Z':
+ track = 2;
+ break;
+ default:
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis");
+ return NULL;
+ }
+ }
+
+ if (sup) {
+ if (strlen(sup) == 1) {
+ switch(*sup) {
+ case 'X':
+ up = 0;
+ break;
+ case 'Y':
+ up = 1;
+ break;
+ case 'Z':
+ up = 2;
+ break;
+ default:
+ PyErr_SetString(PyExc_ValueError, "only X, Y or Z for up axis");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "only X, Y or Z for up axis");
+ return NULL;
+ }
+ }
+
+ if (track == up) {
+ PyErr_SetString(PyExc_ValueError, "Can't have the same axis for track and up");
+ return NULL;
+ }
+
+ /*
+ flip vector around, since vectoquat expect a vector from target to tracking object
+ and the python function expects the inverse (a vector to the target).
+ */
+ negate_v3_v3(vec, self->vec);
+
+ vec_to_quat( quat,vec, track, up);
+
+ return newQuaternionObject(quat, Py_NEW, NULL);
+}
+
+/*
+ * Vector.reflect(mirror): return a reflected vector on the mirror normal
+ * vec - ((2 * DotVecs(vec, mirror)) * mirror)
+ */
+static char Vector_reflect_doc[] =
+".. method:: reflect(mirror)\n"
+"\n"
+" Return the reflection vector from the *mirror* argument.\n"
+"\n"
+" :arg mirror: This vector could be a normal from the reflecting surface.\n"
+" :type mirror: :class:`Vector`\n"
+" :return: The reflected vector matching the size of this vector.\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_reflect(VectorObject *self, PyObject *value)
+{
+ int value_size;
+ float mirror[3], vec[3];
+ float reflect[3] = {0.0f};
+ float tvec[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if((value_size= mathutils_array_parse(tvec, 2, 4, value, "vector.reflect(other), invalid 'other' arg")) == -1)
+ return NULL;
+
+ mirror[0] = tvec[0];
+ mirror[1] = tvec[1];
+ if (value_size > 2) mirror[2] = tvec[2];
+ else mirror[2] = 0.0;
+
+ vec[0] = self->vec[0];
+ vec[1] = self->vec[1];
+ if (self->size > 2) vec[2] = self->vec[2];
+ else vec[2] = 0.0;
+
+ normalize_v3(mirror);
+ reflect_v3_v3v3(reflect, vec, mirror);
+
+ return newVectorObject(reflect, self->size, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_cross_doc[] =
+".. method:: cross(other)\n"
+"\n"
+" Return the cross product of this vector and another.\n"
+"\n"
+" :arg other: The other vector to perform the cross product with.\n"
+" :type other: :class:`Vector`\n"
+" :return: The cross product.\n"
+" :rtype: :class:`Vector`\n"
+"\n"
+" .. note:: both vectors must be 3D\n"
+;
+static PyObject *Vector_cross(VectorObject *self, PyObject *value)
+{
+ VectorObject *ret;
+ float tvec[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.cross(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ ret= (VectorObject *)newVectorObject(NULL, 3, Py_NEW, Py_TYPE(self));
+ cross_v3_v3v3(ret->vec, self->vec, tvec);
+ return (PyObject *)ret;
+}
+
+static char Vector_dot_doc[] =
+".. method:: dot(other)\n"
+"\n"
+" Return the dot product of this vector and another.\n"
+"\n"
+" :arg other: The other vector to perform the dot product with.\n"
+" :type other: :class:`Vector`\n"
+" :return: The dot product.\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_dot(VectorObject *self, PyObject *value)
+{
+ float tvec[MAX_DIMENSIONS];
+ double dot = 0.0;
+ int x;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.dot(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ for(x = 0; x < self->size; x++) {
+ dot += self->vec[x] * tvec[x];
+ }
+
+ return PyFloat_FromDouble(dot);
+}
+
+static char Vector_angle_doc[] =
+".. function:: angle(other, fallback)\n"
+"\n"
+" Return the angle between two vectors.\n"
+"\n"
+" :arg other: another vector to compare the angle with\n"
+" :type other: :class:`Vector`\n"
+" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n"
+" :type fallback: any\n"
+" :return: angle in radians or fallback when given\n"
+" :rtype: float\n"
+"\n"
+" .. note:: Zero length vectors raise an :exc:`AttributeError`.\n"
+;
+static PyObject *Vector_angle(VectorObject *self, PyObject *args)
+{
+ const int size= self->size;
+ float tvec[MAX_DIMENSIONS];
+ PyObject *value;
+ double dot = 0.0f, test_v1 = 0.0f, test_v2 = 0.0f;
+ int x;
+ PyObject *fallback= NULL;
+
+ if(!PyArg_ParseTuple(args, "O|O:angle", &value, &fallback))
+ return NULL;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tvec, size, size, value, "vector.angle(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ for(x = 0; x < size; x++) {
+ test_v1 += self->vec[x] * self->vec[x];
+ test_v2 += tvec[x] * tvec[x];
+ }
+ if (!test_v1 || !test_v2){
+ /* avoid exception */
+ if(fallback) {
+ Py_INCREF(fallback);
+ return fallback;
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle");
+ return NULL;
+ }
+ }
+
+ //dot product
+ for(x = 0; x < self->size; x++) {
+ dot += self->vec[x] * tvec[x];
+ }
+ dot /= (sqrt(test_v1) * sqrt(test_v2));
+
+ return PyFloat_FromDouble(saacos(dot));
+}
+
+static char Vector_difference_doc[] =
+".. function:: difference(other)\n"
+"\n"
+" Returns a quaternion representing the rotational difference between this vector and another.\n"
+"\n"
+" :arg other: second vector.\n"
+" :type other: :class:`Vector`\n"
+" :return: the rotational difference between the two vectors.\n"
+" :rtype: :class:`Quaternion`\n"
+"\n"
+" .. note:: 2D vectors raise an :exc:`AttributeError`.\n"
+;
+static PyObject *Vector_difference(VectorObject *self, PyObject *value)
+{
+ float quat[4], vec_a[3], vec_b[3];
+
+ if(self->size < 3) {
+ PyErr_SetString(PyExc_AttributeError, "vec.difference(value): expects both vectors to be size 3 or 4");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(vec_b, 3, MAX_DIMENSIONS, value, "vector.difference(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ normalize_v3_v3(vec_a, self->vec);
+ normalize_v3(vec_b);
+
+ rotation_between_vecs_to_quat(quat, vec_a, vec_b);
+
+ return newQuaternionObject(quat, Py_NEW, NULL);
+}
+
+static char Vector_project_doc[] =
+".. function:: project(other)\n"
+"\n"
+" Return the projection of this vector onto the *other*.\n"
+"\n"
+" :arg other: second vector.\n"
+" :type other: :class:`Vector`\n"
+" :return: the parallel projection vector\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_project(VectorObject *self, PyObject *value)
+{
+ const int size= self->size;
+ float tvec[MAX_DIMENSIONS];
+ float vec[MAX_DIMENSIONS];
+ double dot = 0.0f, dot2 = 0.0f;
+ int x;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_array_parse(tvec, size, size, value, "vector.project(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ //get dot products
+ for(x = 0; x < size; x++) {
+ dot += self->vec[x] * tvec[x];
+ dot2 += tvec[x] * tvec[x];
+ }
+ //projection
+ dot /= dot2;
+ for(x = 0; x < size; x++) {
+ vec[x] = (float)(dot * tvec[x]);
+ }
+ return newVectorObject(vec, size, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_lerp_doc[] =
+".. function:: lerp(other, factor)\n"
+"\n"
+" Returns the interpolation of two vectors.\n"
+"\n"
+" :arg other: value to interpolate with.\n"
+" :type other: :class:`Vector`\n"
+" :arg factor: The interpolation value in [0.0, 1.0].\n"
+" :type factor: float\n"
+" :return: The interpolated rotation.\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
+{
+ const int size= self->size;
+ PyObject *value= NULL;
+ float fac, ifac;
+ float tvec[MAX_DIMENSIONS], vec[MAX_DIMENSIONS];
+ int x;
+
+ if(!PyArg_ParseTuple(args, "Of:lerp", &value, &fac))
+ return NULL;
+
+ if(mathutils_array_parse(tvec, size, size, value, "vector.lerp(other), invalid 'other' arg") == -1)
+ return NULL;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ ifac= 1.0 - fac;
+
+ for(x = 0; x < size; x++) {
+ vec[x] = (ifac * self->vec[x]) + (fac * tvec[x]);
+ }
+ return newVectorObject(vec, size, Py_NEW, Py_TYPE(self));
+}
+
+static char Vector_rotate_doc[] =
+".. function:: rotate(other)\n"
+"\n"
+" Return vector by a rotation value.\n"
+"\n"
+" :arg other: rotation component of mathutils value\n"
+" :type other: :class:`Euler`, :class:`Quaternion` or :class:`Matrix`\n"
+;
+static PyObject *Vector_rotate(VectorObject *self, PyObject *value)
+{
+ float other_rmat[3][3];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ if(mathutils_any_to_rotmat(other_rmat, value, "vector.rotate(value)") == -1)
+ return NULL;
+
+ if(self->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "Vector must be 3D or 4D");
+ return NULL;
+ }
+
+ mul_m3_v3(other_rmat, self->vec);
+
+ (void)BaseMath_WriteCallback(self);
+ Py_RETURN_NONE;
+}
+
+static char Vector_copy_doc[] =
+".. function:: copy()\n"
+"\n"
+" Returns a copy of this vector.\n"
+"\n"
+" :return: A copy of the vector.\n"
+" :rtype: :class:`Vector`\n"
+"\n"
+" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n"
+;
+static PyObject *Vector_copy(VectorObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ return newVectorObject(self->vec, self->size, Py_NEW, Py_TYPE(self));
+}
+
+static PyObject *Vector_repr(VectorObject *self)
+{
+ PyObject *ret, *tuple;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ tuple= Vector_to_tuple_ext(self, -1);
+ ret= PyUnicode_FromFormat("Vector(%R)", tuple);
+ Py_DECREF(tuple);
+ return ret;
+}
+
+/* Sequence Protocol */
+/* sequence length len(vector) */
+static int Vector_len(VectorObject *self)
+{
+ return self->size;
+}
+/* sequence accessor (get): vector[index] */
+static PyObject *Vector_item(VectorObject *self, int i)
+{
+ if(i<0) i= self->size-i;
+
+ if(i < 0 || i >= self->size) {
+ PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadIndexCallback(self, i))
+ return NULL;
+
+ return PyFloat_FromDouble(self->vec[i]);
+}
+/* sequence accessor (set): vector[index] = value */
+static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
+{
+ float scalar;
+ if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number");
+ return -1;
+ }
+
+ if(i<0) i= self->size-i;
+
+ if(i < 0 || i >= self->size){
+ PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
+ return -1;
+ }
+ self->vec[i] = scalar;
+
+ if(!BaseMath_WriteIndexCallback(self, i))
+ return -1;
+ return 0;
+}
+
+/* sequence slice (get): vector[a:b] */
+static PyObject *Vector_slice(VectorObject *self, int begin, int end)
+{
+ PyObject *tuple;
+ int count;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ CLAMP(begin, 0, self->size);
+ if (end<0) end= self->size+end+1;
+ CLAMP(end, 0, self->size);
+ begin= MIN2(begin, end);
+
+ tuple= PyTuple_New(end - begin);
+ for(count = begin; count < end; count++) {
+ PyTuple_SET_ITEM(tuple, count - begin, PyFloat_FromDouble(self->vec[count]));
+ }
+
+ return tuple;
+}
+/* sequence slice (set): vector[a:b] = value */
+static int Vector_ass_slice(VectorObject *self, int begin, int end,
+ PyObject * seq)
+{
+ int y, size = 0;
+ float vec[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ CLAMP(begin, 0, self->size);
+ CLAMP(end, 0, self->size);
+ begin = MIN2(begin,end);
+
+ size = (end - begin);
+ if(mathutils_array_parse(vec, size, size, seq, "vector[begin:end] = [...]") == -1)
+ return -1;
+
+ /*parsed well - now set in vector*/
+ for(y = 0; y < size; y++){
+ self->vec[begin + y] = vec[y];
+ }
+
+ if(!BaseMath_WriteCallback(self))
+ return -1;
+
+ return 0;
+}
+
+/* Numeric Protocols */
+/* addition: obj + obj */
+static PyObject *Vector_add(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec1 = NULL, *vec2 = NULL;
+ float vec[MAX_DIMENSIONS];
+
+ if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation");
+ return NULL;
+ }
+ vec1 = (VectorObject*)v1;
+ vec2 = (VectorObject*)v2;
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ return NULL;
+
+ /*VECTOR + VECTOR*/
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ add_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
+
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+}
+
+/* addition in-place: obj += obj */
+static PyObject *Vector_iadd(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec1 = NULL, *vec2 = NULL;
+
+ if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation");
+ return NULL;
+ }
+ vec1 = (VectorObject*)v1;
+ vec2 = (VectorObject*)v2;
+
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ return NULL;
+
+ add_vn_vn(vec1->vec, vec2->vec, vec1->size);
+
+ (void)BaseMath_WriteCallback(vec1);
+ Py_INCREF(v1);
+ return v1;
+}
+
+/* subtraction: obj - obj */
+static PyObject *Vector_sub(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec1 = NULL, *vec2 = NULL;
+ float vec[MAX_DIMENSIONS];
+
+ if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation");
+ return NULL;
+ }
+ vec1 = (VectorObject*)v1;
+ vec2 = (VectorObject*)v2;
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ return NULL;
+
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ sub_vn_vnvn(vec, vec1->vec, vec2->vec, vec1->size);
+
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+}
+
+/* subtraction in-place: obj -= obj */
+static PyObject *Vector_isub(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec1= NULL, *vec2= NULL;
+
+ if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation");
+ return NULL;
+ }
+ vec1 = (VectorObject*)v1;
+ vec2 = (VectorObject*)v2;
+
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ return NULL;
+
+ sub_vn_vn(vec1->vec, vec2->vec, vec1->size);
+
+ (void)BaseMath_WriteCallback(vec1);
+ Py_INCREF(v1);
+ return v1;
+}
+
+/*------------------------obj * obj------------------------------
+ mulplication*/
+
+
+/* COLUMN VECTOR Multiplication (Vector X Matrix)
+ * [a] * [1][4][7]
+ * [b] * [2][5][8]
+ * [c] * [3][6][9]
+ *
+ * note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
+ * note: assume read callbacks have been done first.
+ */
+static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+{
+ float vec_cpy[MAX_DIMENSIONS];
+ double dot = 0.0f;
+ int x, y, z = 0;
+
+ if(mat->row_size != vec->size){
+ if(mat->row_size == 4 && vec->size == 3) {
+ vec_cpy[3] = 1.0f;
+ }
+ else {
+ PyErr_SetString(PyExc_AttributeError, "matrix * vector: matrix.row_size and len(vector) must be the same, except for 3D vector * 4x4 matrix.");
+ return -1;
+ }
+ }
+
+ memcpy(vec_cpy, vec->vec, vec->size * sizeof(float));
+
+ rvec[3] = 1.0f;
+
+ for(x = 0; x < mat->col_size; x++) {
+ for(y = 0; y < mat->row_size; y++) {
+ dot += mat->matrix[y][x] * vec_cpy[y];
+ }
+ rvec[z++] = (float)dot;
+ dot = 0.0f;
+ }
+
+ return 0;
+}
+
+static PyObject *vector_mul_float(VectorObject *vec, const float scalar)
+{
+ float tvec[MAX_DIMENSIONS];
+ mul_vn_vn_fl(tvec, vec->vec, vec->size, scalar);
+ return newVectorObject(tvec, vec->size, Py_NEW, Py_TYPE(vec));
+}
+
+static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec1 = NULL, *vec2 = NULL;
+ float scalar;
+
+ if VectorObject_Check(v1) {
+ vec1= (VectorObject *)v1;
+ if(!BaseMath_ReadCallback(vec1))
+ return NULL;
+ }
+ if VectorObject_Check(v2) {
+ vec2= (VectorObject *)v2;
+ if(!BaseMath_ReadCallback(vec2))
+ return NULL;
+ }
+
+
+ /* make sure v1 is always the vector */
+ if (vec1 && vec2 ) {
+ int i;
+ double dot = 0.0f;
+
+ if(vec1->size != vec2->size) {
+ PyErr_SetString(PyExc_AttributeError, "Vector multiplication: vectors must have the same dimensions for this operation");
+ return NULL;
+ }
+
+ /*dot product*/
+ for(i = 0; i < vec1->size; i++) {
+ dot += vec1->vec[i] * vec2->vec[i];
+ }
+ return PyFloat_FromDouble(dot);
+ }
+ else if (vec1) {
+ if (MatrixObject_Check(v2)) {
+ /* VEC * MATRIX */
+ float tvec[MAX_DIMENSIONS];
+ if(!BaseMath_ReadCallback((MatrixObject *)v2))
+ return NULL;
+ if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
+ return NULL;
+ }
+
+ return newVectorObject(tvec, vec1->size, Py_NEW, Py_TYPE(vec1));
+ }
+ else if (QuaternionObject_Check(v2)) {
+ /* VEC * QUAT */
+ QuaternionObject *quat2 = (QuaternionObject*)v2;
+ float tvec[3];
+
+ if(vec1->size != 3) {
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported");
+ return NULL;
+ }
+ if(!BaseMath_ReadCallback(quat2)) {
+ return NULL;
+ }
+ copy_v3_v3(tvec, vec1->vec);
+ mul_qt_v3(quat2->quat, tvec);
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
+ }
+ else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ return vector_mul_float(vec1, scalar);
+ }
+ }
+ else if (vec2) {
+ if (((scalar= PyFloat_AsDouble(v1)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ return vector_mul_float(vec2, scalar);
+ }
+ }
+ else {
+ BLI_assert(!"internal error");
+ }
+
+ PyErr_Format(PyExc_TypeError, "Vector multiplication: not supported between '%.200s' and '%.200s' types", Py_TYPE(v1)->tp_name, Py_TYPE(v2)->tp_name);
+ return NULL;
+}
+
+/* mulplication in-place: obj *= obj */
+static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
+{
+ VectorObject *vec = (VectorObject *)v1;
+ float scalar;
+
+ if(!BaseMath_ReadCallback(vec))
+ return NULL;
+
+ /* only support vec*=float and vec*=mat
+ vec*=vec result is a float so that wont work */
+ if (MatrixObject_Check(v2)) {
+ float rvec[MAX_DIMENSIONS];
+ if(!BaseMath_ReadCallback((MatrixObject *)v2))
+ return NULL;
+
+ if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
+ return NULL;
+
+ memcpy(vec->vec, rvec, sizeof(float) * vec->size);
+ }
+ else if (QuaternionObject_Check(v2)) {
+ /* VEC *= QUAT */
+ QuaternionObject *quat2 = (QuaternionObject*)v2;
+
+ if(vec->size != 3) {
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(quat2)) {
+ return NULL;
+ }
+ mul_qt_v3(quat2->quat, vec->vec);
+ }
+ else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*=FLOAT */
+ mul_vn_fl(vec->vec, vec->size, scalar);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation");
+ return NULL;
+ }
+
+ (void)BaseMath_WriteCallback(vec);
+ Py_INCREF( v1 );
+ return v1;
+}
+
+/* divid: obj / obj */
+static PyObject *Vector_div(PyObject * v1, PyObject * v2)
+{
+ int i;
+ float vec[4], scalar;
+ VectorObject *vec1 = NULL;
+
+ if(!VectorObject_Check(v1)) { /* not a vector */
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
+ return NULL;
+ }
+ vec1 = (VectorObject*)v1; /* vector */
+
+ if(!BaseMath_ReadCallback(vec1))
+ return NULL;
+
+ if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
+ return NULL;
+ }
+
+ if(scalar==0.0) {
+ PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
+ return NULL;
+ }
+
+ for(i = 0; i < vec1->size; i++) {
+ vec[i] = vec1->vec[i] / scalar;
+ }
+ return newVectorObject(vec, vec1->size, Py_NEW, Py_TYPE(v1));
+}
+
+/* divide in-place: obj /= obj */
+static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
+{
+ int i;
+ float scalar;
+ VectorObject *vec1 = (VectorObject*)v1;
+
+ if(!BaseMath_ReadCallback(vec1))
+ return NULL;
+
+ if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float");
+ return NULL;
+ }
+
+ if(scalar==0.0) {
+ PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
+ return NULL;
+ }
+ for(i = 0; i < vec1->size; i++) {
+ vec1->vec[i] /= scalar;
+ }
+
+ (void)BaseMath_WriteCallback(vec1);
+
+ Py_INCREF( v1 );
+ return v1;
+}
+
+/* -obj
+ returns the negative of this object*/
+static PyObject *Vector_neg(VectorObject *self)
+{
+ float tvec[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ negate_vn_vn(tvec, self->vec, self->size);
+ return newVectorObject(tvec, self->size, Py_NEW, Py_TYPE(self));
+}
+
+/*------------------------vec_magnitude_nosqrt (internal) - for comparing only */
+static double vec_magnitude_nosqrt(float *data, int size)
+{
+ double dot = 0.0f;
+ int i;
+
+ for(i=0; i<size; i++){
+ dot += data[i];
+ }
+ /*return (double)sqrt(dot);*/
+ /* warning, line above removed because we are not using the length,
+ rather the comparing the sizes and for this we do not need the sqrt
+ for the actual length, the dot must be sqrt'd */
+ return dot;
+}
+
+
+/*------------------------tp_richcmpr
+ returns -1 execption, 0 false, 1 true */
+static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
+{
+ VectorObject *vecA = NULL, *vecB = NULL;
+ int result = 0;
+ float epsilon = .000001f;
+ double lenA,lenB;
+
+ if (!VectorObject_Check(objectA) || !VectorObject_Check(objectB)){
+ if (comparison_type == Py_NE){
+ Py_RETURN_TRUE;
+ }else{
+ Py_RETURN_FALSE;
+ }
+ }
+ vecA = (VectorObject*)objectA;
+ vecB = (VectorObject*)objectB;
+
+ if(!BaseMath_ReadCallback(vecA) || !BaseMath_ReadCallback(vecB))
+ return NULL;
+
+ if (vecA->size != vecB->size){
+ if (comparison_type == Py_NE){
+ Py_RETURN_TRUE;
+ }else{
+ Py_RETURN_FALSE;
+ }
+ }
+
+ switch (comparison_type){
+ case Py_LT:
+ lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
+ lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
+ if( lenA < lenB ){
+ result = 1;
+ }
+ break;
+ case Py_LE:
+ lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
+ lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
+ if( lenA < lenB ){
+ result = 1;
+ }else{
+ result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
+ }
+ break;
+ case Py_EQ:
+ result = EXPP_VectorsAreEqual(vecA->vec, vecB->vec, vecA->size, 1);
+ break;
+ case Py_NE:
+ result = !EXPP_VectorsAreEqual(vecA->vec, vecB->vec, vecA->size, 1);
+ break;
+ case Py_GT:
+ lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
+ lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
+ if( lenA > lenB ){
+ result = 1;
+ }
+ break;
+ case Py_GE:
+ lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
+ lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
+ if( lenA > lenB ){
+ result = 1;
+ }else{
+ result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
+ }
+ break;
+ default:
+ printf("The result of the comparison could not be evaluated");
+ break;
+ }
+ if (result == 1){
+ Py_RETURN_TRUE;
+ }else{
+ Py_RETURN_FALSE;
+ }
+}
+
+/*-----------------PROTCOL DECLARATIONS--------------------------*/
+static PySequenceMethods Vector_SeqMethods = {
+ (lenfunc) Vector_len, /* sq_length */
+ (binaryfunc) NULL, /* sq_concat */
+ (ssizeargfunc) NULL, /* sq_repeat */
+ (ssizeargfunc) Vector_item, /* sq_item */
+ NULL, /* py3 deprecated slice func */
+ (ssizeobjargproc) Vector_ass_item, /* sq_ass_item */
+ NULL, /* py3 deprecated slice assign func */
+ (objobjproc) NULL, /* sq_contains */
+ (binaryfunc) NULL, /* sq_inplace_concat */
+ (ssizeargfunc) NULL, /* sq_inplace_repeat */
+};
+
+static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i;
+ i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ if (i < 0)
+ i += self->size;
+ return Vector_item(self, i);
+ } else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else if (step == 1) {
+ return Vector_slice(self, start, stop);
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+ return NULL;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return NULL;
+ }
+}
+
+static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* value)
+{
+ if (PyIndex_Check(item)) {
+ Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0)
+ i += self->size;
+ return Vector_ass_item(self, i, value);
+ }
+ else if (PySlice_Check(item)) {
+ Py_ssize_t start, stop, step, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)item, self->size, &start, &stop, &step, &slicelength) < 0)
+ return -1;
+
+ if (step == 1)
+ return Vector_ass_slice(self, start, stop, value);
+ else {
+ PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+ return -1;
+ }
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "vector indices must be integers, not %.200s", Py_TYPE(item)->tp_name);
+ return -1;
+ }
+}
+
+static PyMappingMethods Vector_AsMapping = {
+ (lenfunc)Vector_len,
+ (binaryfunc)Vector_subscript,
+ (objobjargproc)Vector_ass_subscript
+};
+
+
+static PyNumberMethods Vector_NumMethods = {
+ (binaryfunc) Vector_add, /*nb_add*/
+ (binaryfunc) Vector_sub, /*nb_subtract*/
+ (binaryfunc) Vector_mul, /*nb_multiply*/
+ NULL, /*nb_remainder*/
+ NULL, /*nb_divmod*/
+ NULL, /*nb_power*/
+ (unaryfunc) Vector_neg, /*nb_negative*/
+ (unaryfunc) NULL, /*tp_positive*/
+ (unaryfunc) NULL, /*tp_absolute*/
+ (inquiry) NULL, /*tp_bool*/
+ (unaryfunc) NULL, /*nb_invert*/
+ NULL, /*nb_lshift*/
+ (binaryfunc)NULL, /*nb_rshift*/
+ NULL, /*nb_and*/
+ NULL, /*nb_xor*/
+ NULL, /*nb_or*/
+ NULL, /*nb_int*/
+ NULL, /*nb_reserved*/
+ NULL, /*nb_float*/
+ Vector_iadd, /* nb_inplace_add */
+ Vector_isub, /* nb_inplace_subtract */
+ Vector_imul, /* nb_inplace_multiply */
+ NULL, /* nb_inplace_remainder */
+ NULL, /* nb_inplace_power */
+ NULL, /* nb_inplace_lshift */
+ NULL, /* nb_inplace_rshift */
+ NULL, /* nb_inplace_and */
+ NULL, /* nb_inplace_xor */
+ NULL, /* nb_inplace_or */
+ NULL, /* nb_floor_divide */
+ Vector_div, /* nb_true_divide */
+ NULL, /* nb_inplace_floor_divide */
+ Vector_idiv, /* nb_inplace_true_divide */
+ NULL, /* nb_index */
+};
+
+/*------------------PY_OBECT DEFINITION--------------------------*/
+
+/*
+ * vector axis, vector.x/y/z/w
+ */
+
+static PyObject *Vector_getAxis(VectorObject *self, void *type)
+{
+ return Vector_item(self, GET_INT_FROM_POINTER(type));
+}
+
+static int Vector_setAxis(VectorObject *self, PyObject * value, void *type)
+{
+ return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value);
+}
+
+/* vector.length */
+static PyObject *Vector_getLength(VectorObject *self, void *UNUSED(closure))
+{
+ double dot = 0.0f;
+ int i;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ for(i = 0; i < self->size; i++){
+ dot += (self->vec[i] * self->vec[i]);
+ }
+ return PyFloat_FromDouble(sqrt(dot));
+}
+
+static int Vector_setLength(VectorObject *self, PyObject *value)
+{
+ double dot = 0.0f, param;
+ int i;
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ if((param=PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "length must be set to a number");
+ return -1;
+ }
+
+ if (param < 0.0f) {
+ PyErr_SetString(PyExc_TypeError, "cannot set a vectors length to a negative value");
+ return -1;
+ }
+ if (param == 0.0f) {
+ fill_vn(self->vec, self->size, 0.0f);
+ return 0;
+ }
+
+ for(i = 0; i < self->size; i++){
+ dot += (self->vec[i] * self->vec[i]);
+ }
+
+ if (!dot) /* cant sqrt zero */
+ return 0;
+
+ dot = sqrt(dot);
+
+ if (dot==param)
+ return 0;
+
+ dot= dot/param;
+
+ for(i = 0; i < self->size; i++){
+ self->vec[i]= self->vec[i] / (float)dot;
+ }
+
+ (void)BaseMath_WriteCallback(self); /* checked already */
+
+ return 0;
+}
+
+/* Get a new Vector according to the provided swizzle. This function has little
+ error checking, as we are in control of the inputs: the closure is set by us
+ in Vector_createSwizzleGetSeter. */
+static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
+{
+ size_t axis_to;
+ size_t axis_from;
+ float vec[MAX_DIMENSIONS];
+ unsigned int swizzleClosure;
+
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ /* Unpack the axes from the closure into an array. */
+ axis_to = 0;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
+ while (swizzleClosure & SWIZZLE_VALID_AXIS)
+ {
+ axis_from = swizzleClosure & SWIZZLE_AXIS;
+ if(axis_from >= self->size) {
+ PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis");
+ return NULL;
+ }
+
+ vec[axis_to] = self->vec[axis_from];
+ swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
+ axis_to++;
+ }
+
+ return newVectorObject(vec, axis_to, Py_NEW, Py_TYPE(self));
+}
+
+/* Set the items of this vector using a swizzle.
+ - If value is a vector or list this operates like an array copy, except that
+ the destination is effectively re-ordered as defined by the swizzle. At
+ most min(len(source), len(dest)) values will be copied.
+ - If the value is scalar, it is copied to all axes listed in the swizzle.
+ - If an axis appears more than once in the swizzle, the final occurrence is
+ the one that determines its value.
+
+ Returns 0 on success and -1 on failure. On failure, the vector will be
+ unchanged. */
+static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure)
+{
+ size_t size_from;
+ float scalarVal;
+
+ size_t axis_from;
+ size_t axis_to;
+
+ unsigned int swizzleClosure;
+
+ float tvec[MAX_DIMENSIONS];
+ float vec_assign[MAX_DIMENSIONS];
+
+ if(!BaseMath_ReadCallback(self))
+ return -1;
+
+ /* Check that the closure can be used with this vector: even 2D vectors have
+ swizzles defined for axes z and w, but they would be invalid. */
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
+ axis_from= 0;
+ while (swizzleClosure & SWIZZLE_VALID_AXIS)
+ {
+ axis_to = swizzleClosure & SWIZZLE_AXIS;
+ if (axis_to >= self->size)
+ {
+ PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis");
+ return -1;
+ }
+ swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
+ axis_from++;
+ }
+
+ if (((scalarVal=PyFloat_AsDouble(value)) == -1 && PyErr_Occurred())==0) {
+ int i;
+ for(i=0; i < MAX_DIMENSIONS; i++)
+ vec_assign[i]= scalarVal;
+
+ size_from= axis_from;
+ }
+ else if((size_from=mathutils_array_parse(vec_assign, 2, 4, value, "mathutils.Vector.**** = swizzle assignment")) == -1) {
+ return -1;
+ }
+
+ if(axis_from != size_from) {
+ PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle");
+ return -1;
+ }
+
+ /* Copy vector contents onto swizzled axes. */
+ axis_from = 0;
+ swizzleClosure = GET_INT_FROM_POINTER(closure);
+ while (swizzleClosure & SWIZZLE_VALID_AXIS)
+ {
+ axis_to = swizzleClosure & SWIZZLE_AXIS;
+ tvec[axis_to] = vec_assign[axis_from];
+ swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
+ axis_from++;
+ }
+
+ memcpy(self->vec, tvec, axis_from * sizeof(float));
+ /* continue with BaseMathObject_WriteCallback at the end */
+
+ if(!BaseMath_WriteCallback(self))
+ return -1;
+ else
+ return 0;
+}
+
+/*****************************************************************************/
+/* Python attributes get/set structure: */
+/*****************************************************************************/
+static PyGetSetDef Vector_getseters[] = {
+ {(char *)"x", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector X axis.\n\n:type: float", (void *)0},
+ {(char *)"y", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Y axis.\n\n:type: float", (void *)1},
+ {(char *)"z", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
+ {(char *)"w", (getter)Vector_getAxis, (setter)Vector_setAxis, (char *)"Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
+ {(char *)"length", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
+ {(char *)"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, (char *)"Vector Length.\n\n:type: float", NULL},
+ {(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
+ {(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
+
+ /* autogenerated swizzle attrs, see python script below */
+ {(char *)"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
+ {(char *)"xxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
+ {(char *)"xxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
+ {(char *)"xxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
+ {(char *)"xxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
+ {(char *)"xxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
+ {(char *)"xxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
+ {(char *)"xxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
+ {(char *)"xxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
+ {(char *)"xxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
+ {(char *)"xxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
+ {(char *)"xxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
+ {(char *)"xxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
+ {(char *)"xxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
+ {(char *)"xxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
+ {(char *)"xxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
+ {(char *)"xxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
+ {(char *)"xxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
+ {(char *)"xxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
+ {(char *)"xxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
+ {(char *)"xxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
+ {(char *)"xy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
+ {(char *)"xyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
+ {(char *)"xyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
+ {(char *)"xyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
+ {(char *)"xyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
+ {(char *)"xyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
+ {(char *)"xyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
+ {(char *)"xyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
+ {(char *)"xyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
+ {(char *)"xyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
+ {(char *)"xyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
+ {(char *)"xyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
+ {(char *)"xyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
+ {(char *)"xyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
+ {(char *)"xyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
+ {(char *)"xyzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
+ {(char *)"xyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
+ {(char *)"xywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
+ {(char *)"xywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
+ {(char *)"xywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
+ {(char *)"xyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
+ {(char *)"xz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
+ {(char *)"xzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
+ {(char *)"xzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
+ {(char *)"xzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
+ {(char *)"xzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
+ {(char *)"xzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
+ {(char *)"xzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
+ {(char *)"xzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
+ {(char *)"xzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
+ {(char *)"xzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
+ {(char *)"xzyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
+ {(char *)"xzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
+ {(char *)"xzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
+ {(char *)"xzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
+ {(char *)"xzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
+ {(char *)"xzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
+ {(char *)"xzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
+ {(char *)"xzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
+ {(char *)"xzwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
+ {(char *)"xzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
+ {(char *)"xzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
+ {(char *)"xw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
+ {(char *)"xwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
+ {(char *)"xwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
+ {(char *)"xwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
+ {(char *)"xwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
+ {(char *)"xwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
+ {(char *)"xwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
+ {(char *)"xwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
+ {(char *)"xwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
+ {(char *)"xwyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
+ {(char *)"xwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
+ {(char *)"xwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
+ {(char *)"xwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
+ {(char *)"xwzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
+ {(char *)"xwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
+ {(char *)"xwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
+ {(char *)"xww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
+ {(char *)"xwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
+ {(char *)"xwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
+ {(char *)"xwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
+ {(char *)"xwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
+ {(char *)"yx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
+ {(char *)"yxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
+ {(char *)"yxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
+ {(char *)"yxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
+ {(char *)"yxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
+ {(char *)"yxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
+ {(char *)"yxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
+ {(char *)"yxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
+ {(char *)"yxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
+ {(char *)"yxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
+ {(char *)"yxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
+ {(char *)"yxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
+ {(char *)"yxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
+ {(char *)"yxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
+ {(char *)"yxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
+ {(char *)"yxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
+ {(char *)"yxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
+ {(char *)"yxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
+ {(char *)"yxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
+ {(char *)"yxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
+ {(char *)"yxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
+ {(char *)"yy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
+ {(char *)"yyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
+ {(char *)"yyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
+ {(char *)"yyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
+ {(char *)"yyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
+ {(char *)"yyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
+ {(char *)"yyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
+ {(char *)"yyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
+ {(char *)"yyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
+ {(char *)"yyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
+ {(char *)"yyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
+ {(char *)"yyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
+ {(char *)"yyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
+ {(char *)"yyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
+ {(char *)"yyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
+ {(char *)"yyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
+ {(char *)"yyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
+ {(char *)"yywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
+ {(char *)"yywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
+ {(char *)"yywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
+ {(char *)"yyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
+ {(char *)"yz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
+ {(char *)"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
+ {(char *)"yzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
+ {(char *)"yzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
+ {(char *)"yzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
+ {(char *)"yzxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
+ {(char *)"yzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
+ {(char *)"yzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
+ {(char *)"yzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
+ {(char *)"yzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
+ {(char *)"yzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
+ {(char *)"yzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
+ {(char *)"yzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
+ {(char *)"yzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
+ {(char *)"yzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
+ {(char *)"yzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
+ {(char *)"yzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
+ {(char *)"yzwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
+ {(char *)"yzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
+ {(char *)"yzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
+ {(char *)"yzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
+ {(char *)"yw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
+ {(char *)"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
+ {(char *)"ywxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
+ {(char *)"ywxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
+ {(char *)"ywxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
+ {(char *)"ywxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
+ {(char *)"ywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
+ {(char *)"ywyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
+ {(char *)"ywyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
+ {(char *)"ywyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
+ {(char *)"ywyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
+ {(char *)"ywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
+ {(char *)"ywzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
+ {(char *)"ywzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
+ {(char *)"ywzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
+ {(char *)"ywzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
+ {(char *)"yww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
+ {(char *)"ywwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
+ {(char *)"ywwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
+ {(char *)"ywwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
+ {(char *)"ywww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
+ {(char *)"zx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
+ {(char *)"zxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
+ {(char *)"zxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
+ {(char *)"zxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
+ {(char *)"zxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
+ {(char *)"zxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
+ {(char *)"zxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
+ {(char *)"zxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
+ {(char *)"zxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
+ {(char *)"zxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
+ {(char *)"zxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
+ {(char *)"zxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
+ {(char *)"zxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
+ {(char *)"zxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
+ {(char *)"zxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
+ {(char *)"zxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
+ {(char *)"zxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
+ {(char *)"zxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
+ {(char *)"zxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
+ {(char *)"zxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
+ {(char *)"zxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
+ {(char *)"zy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
+ {(char *)"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
+ {(char *)"zyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
+ {(char *)"zyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
+ {(char *)"zyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
+ {(char *)"zyxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
+ {(char *)"zyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
+ {(char *)"zyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
+ {(char *)"zyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
+ {(char *)"zyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
+ {(char *)"zyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
+ {(char *)"zyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
+ {(char *)"zyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
+ {(char *)"zyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
+ {(char *)"zyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
+ {(char *)"zyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
+ {(char *)"zyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
+ {(char *)"zywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
+ {(char *)"zywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
+ {(char *)"zywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
+ {(char *)"zyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
+ {(char *)"zz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
+ {(char *)"zzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
+ {(char *)"zzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
+ {(char *)"zzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
+ {(char *)"zzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
+ {(char *)"zzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
+ {(char *)"zzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
+ {(char *)"zzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
+ {(char *)"zzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
+ {(char *)"zzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
+ {(char *)"zzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
+ {(char *)"zzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
+ {(char *)"zzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
+ {(char *)"zzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
+ {(char *)"zzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
+ {(char *)"zzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
+ {(char *)"zzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
+ {(char *)"zzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
+ {(char *)"zzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
+ {(char *)"zzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
+ {(char *)"zzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
+ {(char *)"zw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
+ {(char *)"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
+ {(char *)"zwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
+ {(char *)"zwxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
+ {(char *)"zwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
+ {(char *)"zwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
+ {(char *)"zwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
+ {(char *)"zwyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
+ {(char *)"zwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
+ {(char *)"zwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
+ {(char *)"zwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
+ {(char *)"zwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
+ {(char *)"zwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
+ {(char *)"zwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
+ {(char *)"zwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
+ {(char *)"zwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
+ {(char *)"zww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
+ {(char *)"zwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
+ {(char *)"zwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
+ {(char *)"zwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
+ {(char *)"zwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
+ {(char *)"wx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
+ {(char *)"wxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
+ {(char *)"wxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
+ {(char *)"wxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
+ {(char *)"wxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
+ {(char *)"wxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
+ {(char *)"wxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
+ {(char *)"wxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
+ {(char *)"wxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
+ {(char *)"wxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
+ {(char *)"wxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
+ {(char *)"wxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
+ {(char *)"wxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
+ {(char *)"wxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
+ {(char *)"wxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
+ {(char *)"wxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
+ {(char *)"wxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
+ {(char *)"wxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
+ {(char *)"wxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
+ {(char *)"wxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
+ {(char *)"wxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
+ {(char *)"wy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
+ {(char *)"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
+ {(char *)"wyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
+ {(char *)"wyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
+ {(char *)"wyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
+ {(char *)"wyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
+ {(char *)"wyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
+ {(char *)"wyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
+ {(char *)"wyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
+ {(char *)"wyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
+ {(char *)"wyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
+ {(char *)"wyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
+ {(char *)"wyzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
+ {(char *)"wyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
+ {(char *)"wyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
+ {(char *)"wyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
+ {(char *)"wyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
+ {(char *)"wywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
+ {(char *)"wywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
+ {(char *)"wywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
+ {(char *)"wyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
+ {(char *)"wz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
+ {(char *)"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
+ {(char *)"wzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
+ {(char *)"wzxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
+ {(char *)"wzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
+ {(char *)"wzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
+ {(char *)"wzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
+ {(char *)"wzyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
+ {(char *)"wzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
+ {(char *)"wzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
+ {(char *)"wzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
+ {(char *)"wzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
+ {(char *)"wzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
+ {(char *)"wzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
+ {(char *)"wzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
+ {(char *)"wzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
+ {(char *)"wzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
+ {(char *)"wzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
+ {(char *)"wzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
+ {(char *)"wzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
+ {(char *)"wzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
+ {(char *)"ww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
+ {(char *)"wwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
+ {(char *)"wwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
+ {(char *)"wwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
+ {(char *)"wwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
+ {(char *)"wwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
+ {(char *)"wwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
+ {(char *)"wwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
+ {(char *)"wwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
+ {(char *)"wwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
+ {(char *)"wwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
+ {(char *)"wwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
+ {(char *)"wwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
+ {(char *)"wwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
+ {(char *)"wwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
+ {(char *)"wwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
+ {(char *)"www", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
+ {(char *)"wwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
+ {(char *)"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
+ {(char *)"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
+ {(char *)"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
+ {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+};
+
+/* Python script used to make swizzle array */
+/*
+SWIZZLE_BITS_PER_AXIS = 3
+SWIZZLE_VALID_AXIS = 0x4
+
+axis_dict = {}
+axis_pos = {'x':0, 'y':1, 'z':2, 'w':3}
+axises = 'xyzw'
+while len(axises) >= 2:
+
+ for axis_0 in axises:
+ axis_0_pos = axis_pos[axis_0]
+ for axis_1 in axises:
+ axis_1_pos = axis_pos[axis_1]
+ axis_dict[axis_0+axis_1] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS))' % (axis_0_pos, axis_1_pos)
+ if len(axises)>2:
+ for axis_2 in axises:
+ axis_2_pos = axis_pos[axis_2]
+ axis_dict[axis_0+axis_1+axis_2] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)))' % (axis_0_pos, axis_1_pos, axis_2_pos)
+ if len(axises)>3:
+ for axis_3 in axises:
+ axis_3_pos = axis_pos[axis_3]
+ axis_dict[axis_0+axis_1+axis_2+axis_3] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) ' % (axis_0_pos, axis_1_pos, axis_2_pos, axis_3_pos)
+
+ axises = axises[:-1]
+
+
+items = axis_dict.items()
+items.sort(key = lambda a: a[0].replace('x', '0').replace('y', '1').replace('z', '2').replace('w', '3'))
+
+unique = set()
+for key, val in items:
+ num = eval(val)
+ set_str = 'Vector_setSwizzle' if (len(set(key)) == len(key)) else 'NULL'
+ print '\t{"%s", %s(getter)Vector_getSwizzle, (setter)%s, NULL, SET_INT_IN_POINTER(%s)}, // %s' % (key, (' '*(4-len(key))), set_str, axis_dict[key], num)
+ unique.add(num)
+
+if len(unique) != len(items):
+ print "ERROR"
+*/
+
+#if 0
+//ROW VECTOR Multiplication - Vector X Matrix
+//[x][y][z] * [1][4][7]
+// [2][5][8]
+// [3][6][9]
+//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
+static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat)
+{
+ float vec_cpy[4];
+ double dot = 0.0f;
+ int x, y, z = 0, vec_size = vec->size;
+
+ if(mat->colSize != vec_size){
+ if(mat->colSize == 4 && vec_size != 3){
+ PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
+ return -1;
+ }else{
+ vec_cpy[3] = 1.0f;
+ }
+ }
+
+ if(!BaseMath_ReadCallback(vec) || !BaseMath_ReadCallback(mat))
+ return -1;
+
+ memcpy(vec_cpy, vec->vec, vec_size * sizeof(float));
+
+ rvec[3] = 1.0f;
+ //muliplication
+ for(x = 0; x < mat->rowSize; x++) {
+ for(y = 0; y < mat->colSize; y++) {
+ dot += mat->matrix[x][y] * vec_cpy[y];
+ }
+ rvec[z++] = (float)dot;
+ dot = 0.0f;
+ }
+ return 0;
+}
+#endif
+
+/*----------------------------Vector.negate() -------------------- */
+static char Vector_negate_doc[] =
+".. method:: negate()\n"
+"\n"
+" Set all values to their negative.\n"
+"\n"
+" :return: an instance of itself\n"
+" :rtype: :class:`Vector`\n"
+;
+static PyObject *Vector_negate(VectorObject *self)
+{
+ if(!BaseMath_ReadCallback(self))
+ return NULL;
+
+ negate_vn(self->vec, self->size);
+
+ (void)BaseMath_WriteCallback(self); // already checked for error
+ Py_RETURN_NONE;
+}
+
+static struct PyMethodDef Vector_methods[] = {
+ /* in place only */
+ {"zero", (PyCFunction) Vector_zero, METH_NOARGS, Vector_zero_doc},
+ {"negate", (PyCFunction) Vector_negate, METH_NOARGS, Vector_negate_doc},
+
+ /* operate on original or copy */
+ {"normalize", (PyCFunction) Vector_normalize, METH_NOARGS, Vector_normalize_doc},
+ {"normalized", (PyCFunction) Vector_normalized, METH_NOARGS, Vector_normalized_doc},
+
+ {"to_2d", (PyCFunction) Vector_to_2d, METH_NOARGS, Vector_to_2d_doc},
+ {"resize_2d", (PyCFunction) Vector_resize_2d, METH_NOARGS, Vector_resize_2d_doc},
+ {"to_3d", (PyCFunction) Vector_to_3d, METH_NOARGS, Vector_to_3d_doc},
+ {"resize_3d", (PyCFunction) Vector_resize_3d, METH_NOARGS, Vector_resize_3d_doc},
+ {"to_4d", (PyCFunction) Vector_to_4d, METH_NOARGS, Vector_to_4d_doc},
+ {"resize_4d", (PyCFunction) Vector_resize_4d, METH_NOARGS, Vector_resize_4d_doc},
+ {"to_tuple", (PyCFunction) Vector_to_tuple, METH_VARARGS, Vector_to_tuple_doc},
+ {"to_track_quat", (PyCFunction) Vector_to_track_quat, METH_VARARGS, Vector_to_track_quat_doc},
+
+ /* operation between 2 or more types */
+ {"reflect", (PyCFunction) Vector_reflect, METH_O, Vector_reflect_doc},
+ {"cross", (PyCFunction) Vector_cross, METH_O, Vector_cross_doc},
+ {"dot", (PyCFunction) Vector_dot, METH_O, Vector_dot_doc},
+ {"angle", (PyCFunction) Vector_angle, METH_VARARGS, Vector_angle_doc},
+ {"difference", (PyCFunction) Vector_difference, METH_O, Vector_difference_doc},
+ {"project", (PyCFunction) Vector_project, METH_O, Vector_project_doc},
+ {"lerp", (PyCFunction) Vector_lerp, METH_VARARGS, Vector_lerp_doc},
+ {"rotate", (PyCFunction) Vector_rotate, METH_O, Vector_rotate_doc},
+
+ {"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
+ {"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
+ {NULL, NULL, 0, NULL}
+};
+
+
+/* Note
+ Py_TPFLAGS_CHECKTYPES allows us to avoid casting all types to Vector when coercing
+ but this means for eg that
+ vec*mat and mat*vec both get sent to Vector_mul and it neesd to sort out the order
+*/
+
+static char vector_doc[] =
+"This object gives access to Vectors in Blender."
+;
+PyTypeObject vector_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ /* For printing, in format "<module>.<name>" */
+ "mathutils.Vector", /* char *tp_name; */
+ sizeof(VectorObject), /* int tp_basicsize; */
+ 0, /* tp_itemsize; For allocation */
+
+ /* Methods to implement standard operations */
+
+ ( destructor ) BaseMathObject_dealloc,/* destructor tp_dealloc; */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* cmpfunc tp_compare; */
+ ( reprfunc ) Vector_repr, /* reprfunc tp_repr; */
+
+ /* Method suites for standard classes */
+
+ &Vector_NumMethods, /* PyNumberMethods *tp_as_number; */
+ &Vector_SeqMethods, /* PySequenceMethods *tp_as_sequence; */
+ &Vector_AsMapping, /* PyMappingMethods *tp_as_mapping; */
+
+ /* More standard operations (here for binary compatibility) */
+
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+ NULL, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
+
+ /* Functions to access object as input/output buffer */
+ NULL, /* PyBufferProcs *tp_as_buffer; */
+
+ /*** Flags to define presence of optional/expanded features ***/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ vector_doc, /* char *tp_doc; Documentation string */
+ /*** Assigned meaning in release 2.0 ***/
+
+ /* call function for all accessible objects */
+ (traverseproc)BaseMathObject_traverse, //tp_traverse
+
+ /* delete references to contained objects */
+ (inquiry)BaseMathObject_clear, //tp_clear
+
+ /*** Assigned meaning in release 2.1 ***/
+ /*** rich comparisons ***/
+ (richcmpfunc)Vector_richcmpr, /* richcmpfunc tp_richcompare; */
+
+ /*** weak reference enabler ***/
+ 0, /* long tp_weaklistoffset; */
+
+ /*** Added in release 2.2 ***/
+ /* Iterators */
+ NULL, /* getiterfunc tp_iter; */
+ NULL, /* iternextfunc tp_iternext; */
+
+ /*** Attribute descriptor and subclassing stuff ***/
+ Vector_methods, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMemberDef *tp_members; */
+ Vector_getseters, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct _typeobject *tp_base; */
+ NULL, /* PyObject *tp_dict; */
+ NULL, /* descrgetfunc tp_descr_get; */
+ NULL, /* descrsetfunc tp_descr_set; */
+ 0, /* long tp_dictoffset; */
+ NULL, /* initproc tp_init; */
+ NULL, /* allocfunc tp_alloc; */
+ Vector_new, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ NULL, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ NULL, /* inquiry tp_is_gc; */
+ NULL, /* PyObject *tp_bases; */
+ /* method resolution order */
+ NULL, /* PyObject *tp_mro; */
+ NULL, /* PyObject *tp_cache; */
+ NULL, /* PyObject *tp_subclasses; */
+ NULL, /* PyObject *tp_weaklist; */
+ NULL
+};
+
+/*------------------------newVectorObject (internal)-------------
+ creates a new vector object
+ pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
+ (i.e. it was allocated elsewhere by MEM_mallocN())
+ pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
+ (i.e. it must be created here with PyMEM_malloc())*/
+PyObject *newVectorObject(float *vec, const int size, const int type, PyTypeObject *base_type)
+{
+ VectorObject *self;
+
+ if(size > 4 || size < 2) {
+ PyErr_SetString(PyExc_RuntimeError, "Vector(): invalid size");
+ return NULL;
+ }
+
+ self= base_type ? (VectorObject *)base_type->tp_alloc(base_type, 0) :
+ (VectorObject *)PyObject_GC_New(VectorObject, &vector_Type);
+
+ if(self) {
+ self->size = size;
+
+ /* init callbacks as NULL */
+ self->cb_user= NULL;
+ self->cb_type= self->cb_subtype= 0;
+
+ if(type == Py_WRAP) {
+ self->vec = vec;
+ self->wrapped = Py_WRAP;
+ }
+ else if (type == Py_NEW) {
+ self->vec= PyMem_Malloc(size * sizeof(float));
+ if(vec) {
+ memcpy(self->vec, vec, size * sizeof(float));
+ }
+ else { /* new empty */
+ fill_vn(self->vec, size, 0.0f);
+ if(size == 4) { /* do the homogenous thing */
+ self->vec[3] = 1.0f;
+ }
+ }
+ self->wrapped = Py_NEW;
+ }
+ else {
+ PyErr_SetString(PyExc_RuntimeError, "Vector(): invalid type");
+ return NULL;
+ }
+ }
+ return (PyObject *) self;
+}
+
+PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_subtype)
+{
+ float dummy[4] = {0.0, 0.0, 0.0, 0.0}; /* dummy init vector, callbacks will be used on access */
+ VectorObject *self= (VectorObject *)newVectorObject(dummy, size, Py_NEW, NULL);
+ if(self) {
+ Py_INCREF(cb_user);
+ self->cb_user= cb_user;
+ self->cb_type= (unsigned char)cb_type;
+ self->cb_subtype= (unsigned char)cb_subtype;
+ }
+
+ return (PyObject *)self;
+}
diff --git a/source/blender/python/generic/mathutils_vector.h b/source/blender/python/generic/mathutils_Vector.h
index 42b9849dd3f..4013a392ff9 100644
--- a/source/blender/python/generic/mathutils_vector.h
+++ b/source/blender/python/generic/mathutils_Vector.h
@@ -28,10 +28,8 @@
*
*/
-#ifndef EXPP_vector_h
-#define EXPP_vector_h
-
-#include <Python.h>
+#ifndef MATHUTILS_VECTOR_H
+#define MATHUTILS_VECTOR_H
extern PyTypeObject vector_Type;
#define VectorObject_Check(_v) PyObject_TypeCheck((_v), &vector_Type)
@@ -43,7 +41,7 @@ typedef struct {
} VectorObject;
/*prototypes*/
-PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type);
+PyObject *newVectorObject(float *vec, const int size, const int type, PyTypeObject *base_type);
PyObject *newVectorObject_cb(PyObject *user, int size, int callback_type, int subtype);
-#endif /* EXPP_vector_h */
+#endif /* MATHUTILS_VECTOR_H */
diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c
new file mode 100644
index 00000000000..62867eb46c1
--- /dev/null
+++ b/source/blender/python/generic/mathutils_geometry.c
@@ -0,0 +1,882 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * This is a new part of Blender.
+ *
+ * Contributor(s): Joseph Gilbert, Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <Python.h>
+
+#include "mathutils_geometry.h"
+
+/* Used for PolyFill */
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_boxpack2d.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_displist.h"
+
+#include "BKE_curve.h"
+
+#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
+#define eps 0.000001
+
+
+/*-------------------------DOC STRINGS ---------------------------*/
+static char M_Geometry_doc[]= "The Blender geometry module\n\n";
+
+//---------------------------------INTERSECTION FUNCTIONS--------------------
+
+static char M_Geometry_intersect_ray_tri_doc[] =
+".. function:: intersect_ray_tri(v1, v2, v3, ray, orig, clip=True)\n"
+"\n"
+" Returns the intersection between a ray and a triangle, if possible, returns None otherwise.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg ray: Direction of the projection\n"
+" :type ray: :class:`mathutils.Vector`\n"
+" :arg orig: Origin\n"
+" :type orig: :class:`mathutils.Vector`\n"
+" :arg clip: Clip by the ray length\n"
+" :type clip: boolean\n"
+" :return: The point of intersection or None if no intersection is found\n"
+" :rtype: :class:`mathutils.Vector` or None\n"
+;
+static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *ray, *ray_off, *vec1, *vec2, *vec3;
+ float dir[3], orig[3], v1[3], v2[3], v3[3], e1[3], e2[3], pvec[3], tvec[3], qvec[3];
+ float det, inv_det, u, v, t;
+ int clip= 1;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!|i:intersect_ray_tri", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &ray, &vector_Type, &ray_off , &clip)) {
+ return NULL;
+ }
+ if(vec1->size != 3 || vec2->size != 3 || vec3->size != 3 || ray->size != 3 || ray_off->size != 3) {
+ PyErr_SetString(PyExc_ValueError, "only 3D vectors for all parameters");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
+ return NULL;
+
+ VECCOPY(v1, vec1->vec);
+ VECCOPY(v2, vec2->vec);
+ VECCOPY(v3, vec3->vec);
+
+ VECCOPY(dir, ray->vec);
+ normalize_v3(dir);
+
+ VECCOPY(orig, ray_off->vec);
+
+ /* find vectors for two edges sharing v1 */
+ sub_v3_v3v3(e1, v2, v1);
+ sub_v3_v3v3(e2, v3, v1);
+
+ /* begin calculating determinant - also used to calculated U parameter */
+ cross_v3_v3v3(pvec, dir, e2);
+
+ /* if determinant is near zero, ray lies in plane of triangle */
+ det= dot_v3v3(e1, pvec);
+
+ if (det > -0.000001 && det < 0.000001) {
+ Py_RETURN_NONE;
+ }
+
+ inv_det= 1.0f / det;
+
+ /* calculate distance from v1 to ray origin */
+ sub_v3_v3v3(tvec, orig, v1);
+
+ /* calculate U parameter and test bounds */
+ u= dot_v3v3(tvec, pvec) * inv_det;
+ if (clip && (u < 0.0f || u > 1.0f)) {
+ Py_RETURN_NONE;
+ }
+
+ /* prepare to test the V parameter */
+ cross_v3_v3v3(qvec, tvec, e1);
+
+ /* calculate V parameter and test bounds */
+ v= dot_v3v3(dir, qvec) * inv_det;
+
+ if (clip && (v < 0.0f || u + v > 1.0f)) {
+ Py_RETURN_NONE;
+ }
+
+ /* calculate t, ray intersects triangle */
+ t= dot_v3v3(e2, qvec) * inv_det;
+
+ mul_v3_fl(dir, t);
+ add_v3_v3v3(pvec, orig, dir);
+
+ return newVectorObject(pvec, 3, Py_NEW, NULL);
+}
+
+/* Line-Line intersection using algorithm from mathworld.wolfram.com */
+
+static char M_Geometry_intersect_line_line_doc[] =
+".. function:: intersect_line_line(v1, v2, v3, v4)\n"
+"\n"
+" Returns a tuple with the points on each line respectively closest to the other.\n"
+"\n"
+" :arg v1: First point of the first line\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Second point of the first line\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: First point of the second line\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg v4: Second point of the second line\n"
+" :type v4: :class:`mathutils.Vector`\n"
+" :rtype: tuple of :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_intersect_line_line(PyObject *UNUSED(self), PyObject *args)
+{
+ PyObject * tuple;
+ VectorObject *vec1, *vec2, *vec3, *vec4;
+ float v1[3], v2[3], v3[3], v4[3], i1[3], i2[3];
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_line_line", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size || vec3->size != vec2->size) {
+ PyErr_SetString(PyExc_ValueError,"vectors must be of the same size");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ return NULL;
+
+ if(vec1->size == 3 || vec1->size == 2) {
+ int result;
+
+ if (vec1->size == 3) {
+ VECCOPY(v1, vec1->vec);
+ VECCOPY(v2, vec2->vec);
+ VECCOPY(v3, vec3->vec);
+ VECCOPY(v4, vec4->vec);
+ }
+ else {
+ v1[0]= vec1->vec[0];
+ v1[1]= vec1->vec[1];
+ v1[2]= 0.0f;
+
+ v2[0]= vec2->vec[0];
+ v2[1]= vec2->vec[1];
+ v2[2]= 0.0f;
+
+ v3[0]= vec3->vec[0];
+ v3[1]= vec3->vec[1];
+ v3[2]= 0.0f;
+
+ v4[0]= vec4->vec[0];
+ v4[1]= vec4->vec[1];
+ v4[2]= 0.0f;
+ }
+
+ result= isect_line_line_v3(v1, v2, v3, v4, i1, i2);
+
+ if (result == 0) {
+ /* colinear */
+ Py_RETURN_NONE;
+ }
+ else {
+ tuple= PyTuple_New(2);
+ PyTuple_SET_ITEM(tuple, 0, newVectorObject(i1, vec1->size, Py_NEW, NULL));
+ PyTuple_SET_ITEM(tuple, 1, newVectorObject(i2, vec1->size, Py_NEW, NULL));
+ return tuple;
+ }
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "2D/3D vectors only");
+ return NULL;
+ }
+}
+
+
+
+
+//----------------------------geometry.normal() -------------------
+static char M_Geometry_normal_doc[] =
+".. function:: normal(v1, v2, v3, v4=None)\n"
+"\n"
+" Returns the normal of the 3D tri or quad.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :arg v4: Point4 (optional)\n"
+" :type v4: :class:`mathutils.Vector`\n"
+" :rtype: :class:`mathutils.Vector`\n"
+;
+static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec1, *vec2, *vec3, *vec4;
+ float n[3];
+
+ if(PyTuple_GET_SIZE(args) == 3) {
+ if(!PyArg_ParseTuple(args, "O!O!O!:normal", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size) {
+ PyErr_SetString(PyExc_ValueError, "vectors must be of the same size");
+ return NULL;
+ }
+ if(vec1->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "2D vectors unsupported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ return NULL;
+
+ normal_tri_v3(n, vec1->vec, vec2->vec, vec3->vec);
+ }
+ else {
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:normal", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3, &vector_Type, &vec4)) {
+ return NULL;
+ }
+ if(vec1->size != vec2->size || vec1->size != vec3->size || vec1->size != vec4->size) {
+ PyErr_SetString(PyExc_ValueError,"vectors must be of the same size");
+ return NULL;
+ }
+ if(vec1->size < 3) {
+ PyErr_SetString(PyExc_ValueError, "2D vectors unsupported");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ return NULL;
+
+ normal_quad_v3(n, vec1->vec, vec2->vec, vec3->vec, vec4->vec);
+ }
+
+ return newVectorObject(n, 3, Py_NEW, NULL);
+}
+
+//--------------------------------- AREA FUNCTIONS--------------------
+
+static char M_Geometry_area_tri_doc[] =
+".. function:: area_tri(v1, v2, v3)\n"
+"\n"
+" Returns the area size of the 2D or 3D triangle defined.\n"
+"\n"
+" :arg v1: Point1\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg v2: Point2\n"
+" :type v2: :class:`mathutils.Vector`\n"
+" :arg v3: Point3\n"
+" :type v3: :class:`mathutils.Vector`\n"
+" :rtype: float\n"
+;
+static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec1, *vec2, *vec3;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!:area_tri", &vector_Type, &vec1, &vector_Type, &vec2, &vector_Type, &vec3)) {
+ return NULL;
+ }
+
+ if(vec1->size != vec2->size || vec1->size != vec3->size) {
+ PyErr_SetString(PyExc_ValueError, "vectors must be of the same size");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ return NULL;
+
+ if (vec1->size == 3) {
+ return PyFloat_FromDouble(area_tri_v3(vec1->vec, vec2->vec, vec3->vec));
+ }
+ else if (vec1->size == 2) {
+ return PyFloat_FromDouble(area_tri_v2(vec1->vec, vec2->vec, vec3->vec));
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError, "only 2D,3D vectors are supported");
+ return NULL;
+ }
+}
+
+/*----------------------------------geometry.PolyFill() -------------------*/
+static char M_Geometry_tesselate_polygon_doc[] =
+".. function:: tesselate_polygon(veclist_list)\n"
+"\n"
+" Takes a list of polylines (each point a vector) and returns the point indices for a polyline filled with triangles.\n"
+"\n"
+" :arg veclist_list: list of polylines\n"
+" :rtype: list\n"
+;
+/* PolyFill function, uses Blenders scanfill to fill multiple poly lines */
+static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *polyLineSeq)
+{
+ PyObject *tri_list; /*return this list of tri's */
+ PyObject *polyLine, *polyVec;
+ int i, len_polylines, len_polypoints, ls_error= 0;
+
+ /* display listbase */
+ ListBase dispbase={NULL, NULL};
+ DispList *dl;
+ float *fp; /*pointer to the array of malloced dl->verts to set the points from the vectors */
+ int index, *dl_face, totpoints=0;
+
+ if(!PySequence_Check(polyLineSeq)) {
+ PyErr_SetString(PyExc_TypeError, "expected a sequence of poly lines");
+ return NULL;
+ }
+
+ len_polylines= PySequence_Size(polyLineSeq);
+
+ for(i= 0; i < len_polylines; ++i) {
+ polyLine= PySequence_GetItem(polyLineSeq, i);
+ if (!PySequence_Check(polyLine)) {
+ freedisplist(&dispbase);
+ Py_XDECREF(polyLine); /* may be null so use Py_XDECREF*/
+ PyErr_SetString(PyExc_TypeError, "One or more of the polylines is not a sequence of mathutils.Vector's");
+ return NULL;
+ }
+
+ len_polypoints= PySequence_Size(polyLine);
+ if (len_polypoints>0) { /* dont bother adding edges as polylines */
+#if 0
+ if (EXPP_check_sequence_consistency(polyLine, &vector_Type) != 1) {
+ freedisplist(&dispbase);
+ Py_DECREF(polyLine);
+ PyErr_SetString(PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type");
+ return NULL;
+ }
+#endif
+ dl= MEM_callocN(sizeof(DispList), "poly disp");
+ BLI_addtail(&dispbase, dl);
+ dl->type= DL_INDEX3;
+ dl->nr= len_polypoints;
+ dl->type= DL_POLY;
+ dl->parts= 1; /* no faces, 1 edge loop */
+ dl->col= 0; /* no material */
+ dl->verts= fp= MEM_callocN(sizeof(float)*3*len_polypoints, "dl verts");
+ dl->index= MEM_callocN(sizeof(int)*3*len_polypoints, "dl index");
+
+ for(index= 0; index<len_polypoints; ++index, fp+=3) {
+ polyVec= PySequence_GetItem(polyLine, index);
+ if(VectorObject_Check(polyVec)) {
+
+ if(!BaseMath_ReadCallback((VectorObject *)polyVec))
+ ls_error= 1;
+
+ fp[0]= ((VectorObject *)polyVec)->vec[0];
+ fp[1]= ((VectorObject *)polyVec)->vec[1];
+ if(((VectorObject *)polyVec)->size > 2)
+ fp[2]= ((VectorObject *)polyVec)->vec[2];
+ else
+ fp[2]= 0.0f; /* if its a 2d vector then set the z to be zero */
+ }
+ else {
+ ls_error= 1;
+ }
+
+ totpoints++;
+ Py_DECREF(polyVec);
+ }
+ }
+ Py_DECREF(polyLine);
+ }
+
+ if(ls_error) {
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ PyErr_SetString(PyExc_TypeError, "A point in one of the polylines is not a mathutils.Vector type");
+ return NULL;
+ }
+ else if (totpoints) {
+ /* now make the list to return */
+ filldisplist(&dispbase, &dispbase, 0);
+
+ /* The faces are stored in a new DisplayList
+ thats added to the head of the listbase */
+ dl= dispbase.first;
+
+ tri_list= PyList_New(dl->parts);
+ if(!tri_list) {
+ freedisplist(&dispbase);
+ PyErr_SetString(PyExc_RuntimeError, "geometry.PolyFill failed to make a new list");
+ return NULL;
+ }
+
+ index= 0;
+ dl_face= dl->index;
+ while(index < dl->parts) {
+ PyList_SET_ITEM(tri_list, index, Py_BuildValue("iii", dl_face[0], dl_face[1], dl_face[2]));
+ dl_face+= 3;
+ index++;
+ }
+ freedisplist(&dispbase);
+ } else {
+ /* no points, do this so scripts dont barf */
+ freedisplist(&dispbase); /* possible some dl was allocated */
+ tri_list= PyList_New(0);
+ }
+
+ return tri_list;
+}
+
+static char M_Geometry_intersect_line_line_2d_doc[] =
+".. function:: intersect_line_line_2d(lineA_p1, lineA_p2, lineB_p1, lineB_p2)\n"
+"\n"
+" Takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None.\n"
+"\n"
+" :arg lineA_p1: First point of the first line\n"
+" :type lineA_p1: :class:`mathutils.Vector`\n"
+" :arg lineA_p2: Second point of the first line\n"
+" :type lineA_p2: :class:`mathutils.Vector`\n"
+" :arg lineB_p1: First point of the second line\n"
+" :type lineB_p1: :class:`mathutils.Vector`\n"
+" :arg lineB_p2: Second point of the second line\n"
+" :type lineB_p2: :class:`mathutils.Vector`\n"
+" :return: The point of intersection or None when not found\n"
+" :rtype: :class:`mathutils.Vector` or None\n"
+;
+static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *line_a1, *line_a2, *line_b1, *line_b2;
+ float vi[2];
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_line_line_2d",
+ &vector_Type, &line_a1,
+ &vector_Type, &line_a2,
+ &vector_Type, &line_b1,
+ &vector_Type, &line_b2)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
+ return NULL;
+
+ if(isect_seg_seg_v2_point(line_a1->vec, line_a2->vec, line_b1->vec, line_b2->vec, vi) == 1) {
+ return newVectorObject(vi, 2, Py_NEW, NULL);
+ } else {
+ Py_RETURN_NONE;
+ }
+}
+
+
+static char M_Geometry_intersect_point_line_doc[] =
+".. function:: intersect_point_line(pt, line_p1, line_p2)\n"
+"\n"
+" Takes a point and a line and returns a tuple with the closest point on the line and its distance from the first point of the line as a percentage of the length of the line.\n"
+"\n"
+" :arg pt: Point\n"
+" :type pt: :class:`mathutils.Vector`\n"
+" :arg line_p1: First point of the line\n"
+" :type line_p1: :class:`mathutils.Vector`\n"
+" :arg line_p1: Second point of the line\n"
+" :type line_p1: :class:`mathutils.Vector`\n"
+" :rtype: (:class:`mathutils.Vector`, float)\n"
+;
+static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt, *line_1, *line_2;
+ float pt_in[3], pt_out[3], l1[3], l2[3];
+ float lambda;
+ PyObject *ret;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!:intersect_point_line",
+ &vector_Type, &pt,
+ &vector_Type, &line_1,
+ &vector_Type, &line_2)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
+ return NULL;
+
+ /* accept 2d verts */
+ if (pt->size==3) { VECCOPY(pt_in, pt->vec);}
+ else { pt_in[2]=0.0; VECCOPY2D(pt_in, pt->vec) }
+
+ if (line_1->size==3) { VECCOPY(l1, line_1->vec);}
+ else { l1[2]=0.0; VECCOPY2D(l1, line_1->vec) }
+
+ if (line_2->size==3) { VECCOPY(l2, line_2->vec);}
+ else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
+
+ /* do the calculation */
+ lambda= closest_to_line_v3(pt_out,pt_in, l1, l2);
+
+ ret= PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(lambda));
+ return ret;
+}
+
+static char M_Geometry_intersect_point_tri_2d_doc[] =
+".. function:: intersect_point_tri_2d(pt, tri_p1, tri_p2, tri_p3)\n"
+"\n"
+" Takes 4 vectors (using only the x and y coordinates): one is the point and the next 3 define the triangle. Returns 1 if the point is within the triangle, otherwise 0.\n"
+"\n"
+" :arg pt: Point\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg tri_p1: First point of the triangle\n"
+" :type tri_p1: :class:`mathutils.Vector`\n"
+" :arg tri_p2: Second point of the triangle\n"
+" :type tri_p2: :class:`mathutils.Vector`\n"
+" :arg tri_p3: Third point of the triangle\n"
+" :type tri_p3: :class:`mathutils.Vector`\n"
+" :rtype: int\n"
+;
+static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt_vec, *tri_p1, *tri_p2, *tri_p3;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!:intersect_point_tri_2d",
+ &vector_Type, &pt_vec,
+ &vector_Type, &tri_p1,
+ &vector_Type, &tri_p2,
+ &vector_Type, &tri_p3)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
+ return NULL;
+
+ return PyLong_FromLong(isect_point_tri_v2(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
+}
+
+static char M_Geometry_intersect_point_quad_2d_doc[] =
+".. function:: intersect_point_quad_2d(pt, quad_p1, quad_p2, quad_p3, quad_p4)\n"
+"\n"
+" Takes 5 vectors (using only the x and y coordinates): one is the point and the next 4 define the quad, only the x and y are used from the vectors. Returns 1 if the point is within the quad, otherwise 0.\n"
+"\n"
+" :arg pt: Point\n"
+" :type v1: :class:`mathutils.Vector`\n"
+" :arg quad_p1: First point of the quad\n"
+" :type quad_p1: :class:`mathutils.Vector`\n"
+" :arg quad_p2: Second point of the quad\n"
+" :type quad_p2: :class:`mathutils.Vector`\n"
+" :arg quad_p3: Third point of the quad\n"
+" :type quad_p3: :class:`mathutils.Vector`\n"
+" :arg quad_p4: Forth point of the quad\n"
+" :type quad_p4: :class:`mathutils.Vector`\n"
+" :rtype: int\n"
+;
+static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *pt_vec, *quad_p1, *quad_p2, *quad_p3, *quad_p4;
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!:intersect_point_quad_2d",
+ &vector_Type, &pt_vec,
+ &vector_Type, &quad_p1,
+ &vector_Type, &quad_p2,
+ &vector_Type, &quad_p3,
+ &vector_Type, &quad_p4)
+ ) {
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
+ return NULL;
+
+ return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
+}
+
+static int boxPack_FromPyObject(PyObject *value, boxPack **boxarray)
+{
+ int len, i;
+ PyObject *list_item, *item_1, *item_2;
+ boxPack *box;
+
+
+ /* Error checking must already be done */
+ if(!PyList_Check(value)) {
+ PyErr_SetString(PyExc_TypeError, "can only back a list of [x, y, w, h]");
+ return -1;
+ }
+
+ len= PyList_Size(value);
+
+ (*boxarray)= MEM_mallocN(len*sizeof(boxPack), "boxPack box");
+
+
+ for(i= 0; i < len; i++) {
+ list_item= PyList_GET_ITEM(value, i);
+ if(!PyList_Check(list_item) || PyList_Size(list_item) < 4) {
+ MEM_freeN(*boxarray);
+ PyErr_SetString(PyExc_TypeError, "can only pack a list of [x, y, w, h]");
+ return -1;
+ }
+
+ box= (*boxarray)+i;
+
+ item_1= PyList_GET_ITEM(list_item, 2);
+ item_2= PyList_GET_ITEM(list_item, 3);
+
+ box->w= (float)PyFloat_AsDouble(item_1);
+ box->h= (float)PyFloat_AsDouble(item_2);
+ box->index= i;
+
+ if (box->w < 0.0f || box->h < 0.0f) {
+ MEM_freeN(*boxarray);
+ PyErr_SetString(PyExc_TypeError, "error parsing width and height values from list: [x, y, w, h], not numbers or below zero");
+ return -1;
+ }
+
+ /* verts will be added later */
+ }
+ return 0;
+}
+
+static void boxPack_ToPyObject(PyObject * value, boxPack **boxarray)
+{
+ int len, i;
+ PyObject *list_item;
+ boxPack *box;
+
+ len= PyList_Size(value);
+
+ for(i= 0; i < len; i++) {
+ box= (*boxarray)+i;
+ list_item= PyList_GET_ITEM(value, box->index);
+ PyList_SET_ITEM(list_item, 0, PyFloat_FromDouble(box->x));
+ PyList_SET_ITEM(list_item, 1, PyFloat_FromDouble(box->y));
+ }
+ MEM_freeN(*boxarray);
+}
+
+static char M_Geometry_box_pack_2d_doc[] =
+".. function:: box_pack_2d(boxes)\n"
+"\n"
+" Returns the normal of the 3D tri or quad.\n"
+"\n"
+" :arg boxes: list of boxes, each box is a list where the first 4 items are [x,y, width, height, ...] other items are ignored.\n"
+" :type boxes: list\n"
+" :return: the width and height of the packed bounding box\n"
+" :rtype: tuple, pair of floats\n"
+;
+static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlist)
+{
+ float tot_width= 0.0f, tot_height= 0.0f;
+ int len;
+
+ PyObject *ret;
+
+ if(!PyList_Check(boxlist)) {
+ PyErr_SetString(PyExc_TypeError, "expected a list of boxes [[x,y,w,h], ... ]");
+ return NULL;
+ }
+
+ len= PyList_GET_SIZE(boxlist);
+ if (len) {
+ boxPack *boxarray= NULL;
+ if(boxPack_FromPyObject(boxlist, &boxarray) == -1) {
+ return NULL; /* exception set */
+ }
+
+ /* Non Python function */
+ boxPack2D(boxarray, len, &tot_width, &tot_height);
+
+ boxPack_ToPyObject(boxlist, &boxarray);
+ }
+
+ ret= PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, PyFloat_FromDouble(tot_width));
+ PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(tot_width));
+ return ret;
+}
+
+static char M_Geometry_interpolate_bezier_doc[] =
+".. function:: interpolate_bezier(knot1, handle1, handle2, knot2, resolution)\n"
+"\n"
+" Interpolate a bezier spline segment.\n"
+"\n"
+" :arg knot1: First bezier spline point.\n"
+" :type knot1: :class:`mathutils.Vector`\n"
+" :arg handle1: First bezier spline handle.\n"
+" :type handle1: :class:`mathutils.Vector`\n"
+" :arg handle2: Second bezier spline handle.\n"
+" :type handle2: :class:`mathutils.Vector`\n"
+" :arg knot2: Second bezier spline point.\n"
+" :type knot2: :class:`mathutils.Vector`\n"
+" :arg resolution: Number of points to return.\n"
+" :type resolution: int\n"
+" :return: The interpolated points\n"
+" :rtype: list of :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject* args)
+{
+ VectorObject *vec_k1, *vec_h1, *vec_k2, *vec_h2;
+ int resolu;
+ int dims;
+ int i;
+ float *coord_array, *fp;
+ PyObject *list;
+
+ float k1[4]= {0.0, 0.0, 0.0, 0.0};
+ float h1[4]= {0.0, 0.0, 0.0, 0.0};
+ float k2[4]= {0.0, 0.0, 0.0, 0.0};
+ float h2[4]= {0.0, 0.0, 0.0, 0.0};
+
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!i:interpolate_bezier",
+ &vector_Type, &vec_k1,
+ &vector_Type, &vec_h1,
+ &vector_Type, &vec_h2,
+ &vector_Type, &vec_k2, &resolu)
+ ) {
+ return NULL;
+ }
+
+ if(resolu <= 1) {
+ PyErr_SetString(PyExc_ValueError, "resolution must be 2 or over");
+ return NULL;
+ }
+
+ if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
+ return NULL;
+
+ dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
+
+ for(i=0; i < vec_k1->size; i++) k1[i]= vec_k1->vec[i];
+ for(i=0; i < vec_h1->size; i++) h1[i]= vec_h1->vec[i];
+ for(i=0; i < vec_k2->size; i++) k2[i]= vec_k2->vec[i];
+ for(i=0; i < vec_h2->size; i++) h2[i]= vec_h2->vec[i];
+
+ coord_array= MEM_callocN(dims * (resolu) * sizeof(float), "interpolate_bezier");
+ for(i=0; i<dims; i++) {
+ forward_diff_bezier(k1[i], h1[i], h2[i], k2[i], coord_array+i, resolu-1, sizeof(float)*dims);
+ }
+
+ list= PyList_New(resolu);
+ fp= coord_array;
+ for(i=0; i<resolu; i++, fp= fp+dims) {
+ PyList_SET_ITEM(list, i, newVectorObject(fp, dims, Py_NEW, NULL));
+ }
+ MEM_freeN(coord_array);
+ return list;
+}
+
+static char M_Geometry_barycentric_transform_doc[] =
+".. function:: barycentric_transform(point, tri_a1, tri_a2, tri_a3, tri_b1, tri_b2, tri_b3)\n"
+"\n"
+" Return a transformed point, the transformation is defined by 2 triangles.\n"
+"\n"
+" :arg point: The point to transform.\n"
+" :type point: :class:`mathutils.Vector`\n"
+" :arg tri_a1: source triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: source triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: source triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :arg tri_a1: target triangle vertex.\n"
+" :type tri_a1: :class:`mathutils.Vector`\n"
+" :arg tri_a2: target triangle vertex.\n"
+" :type tri_a2: :class:`mathutils.Vector`\n"
+" :arg tri_a3: target triangle vertex.\n"
+" :type tri_a3: :class:`mathutils.Vector`\n"
+" :return: The transformed point\n"
+" :rtype: :class:`mathutils.Vector`'s\n"
+;
+static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObject *args)
+{
+ VectorObject *vec_pt;
+ VectorObject *vec_t1_tar, *vec_t2_tar, *vec_t3_tar;
+ VectorObject *vec_t1_src, *vec_t2_src, *vec_t3_src;
+ float vec[3];
+
+ if(!PyArg_ParseTuple(args, "O!O!O!O!O!O!O!:barycentric_transform",
+ &vector_Type, &vec_pt,
+ &vector_Type, &vec_t1_src,
+ &vector_Type, &vec_t2_src,
+ &vector_Type, &vec_t3_src,
+ &vector_Type, &vec_t1_tar,
+ &vector_Type, &vec_t2_tar,
+ &vector_Type, &vec_t3_tar)
+ ) {
+ return NULL;
+ }
+
+ if( vec_pt->size != 3 ||
+ vec_t1_src->size != 3 ||
+ vec_t2_src->size != 3 ||
+ vec_t3_src->size != 3 ||
+ vec_t1_tar->size != 3 ||
+ vec_t2_tar->size != 3 ||
+ vec_t3_tar->size != 3)
+ {
+ PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector");
+ return NULL;
+ }
+
+ barycentric_transform(vec, vec_pt->vec,
+ vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
+ vec_t1_src->vec, vec_t2_src->vec, vec_t3_src->vec);
+
+ return newVectorObject(vec, 3, Py_NEW, NULL);
+}
+
+static PyMethodDef M_Geometry_methods[]= {
+ {"intersect_ray_tri", (PyCFunction) M_Geometry_intersect_ray_tri, METH_VARARGS, M_Geometry_intersect_ray_tri_doc},
+ {"intersect_point_line", (PyCFunction) M_Geometry_intersect_point_line, METH_VARARGS, M_Geometry_intersect_point_line_doc},
+ {"intersect_point_tri_2d", (PyCFunction) M_Geometry_intersect_point_tri_2d, METH_VARARGS, M_Geometry_intersect_point_tri_2d_doc},
+ {"intersect_point_quad_2d", (PyCFunction) M_Geometry_intersect_point_quad_2d, METH_VARARGS, M_Geometry_intersect_point_quad_2d_doc},
+ {"intersect_line_line", (PyCFunction) M_Geometry_intersect_line_line, METH_VARARGS, M_Geometry_intersect_line_line_doc},
+ {"intersect_line_line_2d", (PyCFunction) M_Geometry_intersect_line_line_2d, METH_VARARGS, M_Geometry_intersect_line_line_2d_doc},
+ {"interpolate_bezier", (PyCFunction) M_Geometry_interpolate_bezier, METH_VARARGS, M_Geometry_interpolate_bezier_doc},
+ {"area_tri", (PyCFunction) M_Geometry_area_tri, METH_VARARGS, M_Geometry_area_tri_doc},
+ {"normal", (PyCFunction) M_Geometry_normal, METH_VARARGS, M_Geometry_normal_doc},
+ {"tesselate_polygon", (PyCFunction) M_Geometry_tesselate_polygon, METH_O, M_Geometry_tesselate_polygon_doc},
+ {"box_pack_2d", (PyCFunction) M_Geometry_box_pack_2d, METH_O, M_Geometry_box_pack_2d_doc},
+ {"barycentric_transform", (PyCFunction) M_Geometry_barycentric_transform, METH_VARARGS, M_Geometry_barycentric_transform_doc},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef M_Geometry_module_def= {
+ PyModuleDef_HEAD_INIT,
+ "mathutils.geometry", /* m_name */
+ M_Geometry_doc, /* m_doc */
+ 0, /* m_size */
+ M_Geometry_methods, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
+
+/*----------------------------MODULE INIT-------------------------*/
+PyMODINIT_FUNC BPyInit_mathutils_geometry(void)
+{
+ PyObject *submodule= PyModule_Create(&M_Geometry_module_def);
+ return submodule;
+}
diff --git a/source/blender/python/generic/geometry.h b/source/blender/python/generic/mathutils_geometry.h
index 401efcc7888..1af25c7a751 100644
--- a/source/blender/python/generic/geometry.h
+++ b/source/blender/python/generic/mathutils_geometry.h
@@ -28,12 +28,11 @@
*/
/*Include this file for access to vector, quat, matrix, euler, etc...*/
-#ifndef EXPP_Geometry_H
-#define EXPP_Geometry_H
+#ifndef MATHUTILS_GEOMETRY_H
+#define MATHUTILS_GEOMETRY_H
-#include <Python.h>
#include "mathutils.h"
-PyObject *Geometry_Init(void);
+PyMODINIT_FUNC BPyInit_mathutils_geometry(void);
-#endif /* EXPP_Geometry_H */
+#endif /* MATHUTILS_GEOMETRY_H */
diff --git a/source/blender/python/generic/mathutils_matrix.c b/source/blender/python/generic/mathutils_matrix.c
deleted file mode 100644
index 3b8c7d3122a..00000000000
--- a/source/blender/python/generic/mathutils_matrix.c
+++ /dev/null
@@ -1,1944 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * Contributor(s): Michel Selten & Joseph Gilbert
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "mathutils.h"
-
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
-#include "BLI_blenlib.h"
-
-static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec); /* utility func */
-
-
-/* matrix vector callbacks */
-int mathutils_matrix_vector_cb_index= -1;
-
-static int mathutils_matrix_vector_check(BaseMathObject *bmo)
-{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
- return BaseMath_ReadCallback(self);
-}
-
-static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype)
-{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
- int i;
-
- if(!BaseMath_ReadCallback(self))
- return 0;
-
- for(i=0; i < self->colSize; i++)
- bmo->data[i]= self->matrix[subtype][i];
-
- return 1;
-}
-
-static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
-{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
- int i;
-
- if(!BaseMath_ReadCallback(self))
- return 0;
-
- for(i=0; i < self->colSize; i++)
- self->matrix[subtype][i]= bmo->data[i];
-
- BaseMath_WriteCallback(self);
- return 1;
-}
-
-static int mathutils_matrix_vector_get_index(BaseMathObject *bmo, int subtype, int index)
-{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
-
- if(!BaseMath_ReadCallback(self))
- return 0;
-
- bmo->data[index]= self->matrix[subtype][index];
- return 1;
-}
-
-static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, int index)
-{
- MatrixObject *self= (MatrixObject *)bmo->cb_user;
-
- if(!BaseMath_ReadCallback(self))
- return 0;
-
- self->matrix[subtype][index]= bmo->data[index];
-
- BaseMath_WriteCallback(self);
- return 1;
-}
-
-Mathutils_Callback mathutils_matrix_vector_cb = {
- mathutils_matrix_vector_check,
- mathutils_matrix_vector_get,
- mathutils_matrix_vector_set,
- mathutils_matrix_vector_get_index,
- mathutils_matrix_vector_set_index
-};
-/* matrix vector callbacks, this is so you can do matrix[i][j] = val */
-
-//----------------------------------mathutils.Matrix() -----------------
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
-//create a new matrix type
-static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- PyObject *argObject, *m, *s;
- MatrixObject *mat;
- int argSize, seqSize = 0, i, j;
- float matrix[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- float scalar;
-
- argSize = PyTuple_GET_SIZE(args);
- if(argSize > MATRIX_MAX_DIM) { //bad arg nums
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- } else if (argSize == 0) { //return empty 4D matrix
- return (PyObject *) newMatrixObject(NULL, 4, 4, Py_NEW, NULL);
- }else if (argSize == 1){
- //copy constructor for matrix objects
- argObject = PyTuple_GET_ITEM(args, 0);
- if(MatrixObject_Check(argObject)){
- mat = (MatrixObject*)argObject;
- if(!BaseMath_ReadCallback(mat))
- return NULL;
-
- memcpy(matrix, mat->contigPtr, sizeof(float) * mat->rowSize * mat->colSize);
- argSize = mat->rowSize;
- seqSize = mat->colSize;
- }
- }else{ //2-4 arguments (all seqs? all same size?)
- for(i =0; i < argSize; i++){
- argObject = PyTuple_GET_ITEM(args, i);
- if (PySequence_Check(argObject)) { //seq?
- if(seqSize){ //0 at first
- if(PySequence_Length(argObject) != seqSize){ //seq size not same
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- }
- }
- seqSize = PySequence_Length(argObject);
- }else{ //arg not a sequence
- PyErr_SetString(PyExc_TypeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- }
- }
- //all is well... let's continue parsing
- for (i = 0; i < argSize; i++){
- m = PyTuple_GET_ITEM(args, i);
- if (m == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n");
- return NULL;
- }
-
- for (j = 0; j < seqSize; j++) {
- s = PySequence_GetItem(m, j);
- if (s == NULL) { // Failed to read sequence
- PyErr_SetString(PyExc_RuntimeError, "mathutils.Matrix(): failed to parse arguments...\n");
- return NULL;
- }
-
- scalar= (float)PyFloat_AsDouble(s);
- Py_DECREF(s);
-
- if(scalar==-1 && PyErr_Occurred()) { // parsed item is not a number
- PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix(): expects 0-4 numeric sequences of the same size\n");
- return NULL;
- }
-
- matrix[(seqSize*i)+j]= scalar;
- }
- }
- }
- return newMatrixObject(matrix, argSize, seqSize, Py_NEW, NULL);
-}
-
-/*-----------------------CLASS-METHODS----------------------------*/
-
-//----------------------------------mathutils.RotationMatrix() ----------
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
-static char C_Matrix_Rotation_doc[] =
-".. classmethod:: Rotation(angle, size, axis)\n"
-"\n"
-" Create a matrix representing a rotation.\n"
-"\n"
-" :arg angle: The angle of rotation desired, in radians.\n"
-" :type angle: float\n"
-" :arg size: The size of the rotation matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n"
-" :type axis: string or :class:`Vector`\n"
-" :return: A new rotation matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
-{
- VectorObject *vec= NULL;
- char *axis= NULL;
- int matSize;
- float angle = 0.0f;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!PyArg_ParseTuple(args, "fi|O", &angle, &matSize, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(angle, size, axis): expected float int and a string or vector\n");
- return NULL;
- }
-
- if(vec && !VectorObject_Check(vec)) {
- axis= _PyUnicode_AsString((PyObject *)vec);
- if(axis==NULL || axis[0]=='\0' || axis[1]!='\0' || axis[0] < 'X' || axis[0] > 'Z') {
- PyErr_SetString(PyExc_TypeError, "mathutils.RotationMatrix(): 3rd argument axis value must be a 3D vector or a string in 'X', 'Y', 'Z'\n");
- return NULL;
- }
- else {
- /* use the string */
- vec= NULL;
- }
- }
-
- while (angle<-(Py_PI*2))
- angle+=(Py_PI*2);
- while (angle>(Py_PI*2))
- angle-=(Py_PI*2);
-
- if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
- return NULL;
- }
- if(matSize == 2 && (vec != NULL)) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): cannot create a 2x2 rotation matrix around arbitrary axis\n");
- return NULL;
- }
- if((matSize == 3 || matSize == 4) && (axis == NULL) && (vec == NULL)) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): please choose an axis of rotation for 3d and 4d matrices\n");
- return NULL;
- }
- if(vec) {
- if(vec->size != 3) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): the vector axis must be a 3D vector\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
-
- /* check for valid vector/axis above */
- if(vec) {
- axis_angle_to_mat3( (float (*)[3])mat,vec->vec, angle);
- }
- else if(matSize == 2) {
- //2D rotation matrix
- mat[0] = (float) cos (angle);
- mat[1] = (float) sin (angle);
- mat[2] = -((float) sin(angle));
- mat[3] = (float) cos(angle);
- } else if(strcmp(axis, "X") == 0) {
- //rotation around X
- mat[0] = 1.0f;
- mat[4] = (float) cos(angle);
- mat[5] = (float) sin(angle);
- mat[7] = -((float) sin(angle));
- mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Y") == 0) {
- //rotation around Y
- mat[0] = (float) cos(angle);
- mat[2] = -((float) sin(angle));
- mat[4] = 1.0f;
- mat[6] = (float) sin(angle);
- mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Z") == 0) {
- //rotation around Z
- mat[0] = (float) cos(angle);
- mat[1] = (float) sin(angle);
- mat[3] = -((float) sin(angle));
- mat[4] = (float) cos(angle);
- mat[8] = 1.0f;
- }
- else {
- /* should never get here */
- PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): unknown error\n");
- return NULL;
- }
-
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
-}
-
-
-static char C_Matrix_Translation_doc[] =
-".. classmethod:: Translation(vector)\n"
-"\n"
-" Create a matrix representing a translation.\n"
-"\n"
-" :arg vector: The translation vector.\n"
-" :type vector: :class:`Vector`\n"
-" :return: An identity matrix with a translation.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *C_Matrix_Translation(PyObject *cls, VectorObject * vec)
-{
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!VectorObject_Check(vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): expected vector\n");
- return NULL;
- }
- if(vec->size != 3 && vec->size != 4) {
- PyErr_SetString(PyExc_TypeError, "mathutils.TranslationMatrix(): vector must be 3D or 4D\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- //create a identity matrix and add translation
- unit_m4((float(*)[4]) mat);
- mat[12] = vec->vec[0];
- mat[13] = vec->vec[1];
- mat[14] = vec->vec[2];
-
- return newMatrixObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
-}
-//----------------------------------mathutils.ScaleMatrix() -------------
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
-static char C_Matrix_Scale_doc[] =
-".. classmethod:: Scale(factor, size, axis)\n"
-"\n"
-" Create a matrix representing a scaling.\n"
-"\n"
-" :arg factor: The factor of scaling to apply.\n"
-" :type factor: float\n"
-" :arg size: The size of the scale matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: Direction to influence scale. (optional).\n"
-" :type axis: :class:`Vector`\n"
-" :return: A new scale matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
-{
- VectorObject *vec = NULL;
- float norm = 0.0f, factor;
- int matSize, x;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!PyArg_ParseTuple(args, "fi|O!", &factor, &matSize, &vector_Type, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.ScaleMatrix(): expected float int and optional vector\n");
- return NULL;
- }
- if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
- return NULL;
- }
- if(vec) {
- if(vec->size > 2 && matSize == 2) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ScaleMatrix(): please use 2D vectors when scaling in 2D\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
- if(vec == NULL) { //scaling along axis
- if(matSize == 2) {
- mat[0] = factor;
- mat[3] = factor;
- } else {
- mat[0] = factor;
- mat[4] = factor;
- mat[8] = factor;
- }
- } else { //scaling in arbitrary direction
- //normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
- }
- norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
- }
- if(matSize == 2) {
- mat[0] = 1 +((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[3] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
- } else {
- mat[0] = 1 + ((factor - 1) *(vec->vec[0] * vec->vec[0]));
- mat[1] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[2] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[3] =((factor - 1) *(vec->vec[0] * vec->vec[1]));
- mat[4] = 1 + ((factor - 1) *(vec->vec[1] * vec->vec[1]));
- mat[5] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[6] =((factor - 1) *(vec->vec[0] * vec->vec[2]));
- mat[7] =((factor - 1) *(vec->vec[1] * vec->vec[2]));
- mat[8] = 1 + ((factor - 1) *(vec->vec[2] * vec->vec[2]));
- }
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
-}
-//----------------------------------mathutils.OrthoProjectionMatrix() ---
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
-static char C_Matrix_OrthoProjection_doc[] =
-".. classmethod:: OrthoProjection(plane, size, axis)\n"
-"\n"
-" Create a matrix to represent an orthographic projection.\n"
-"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ', 'R'], where a single axis is for a 2D matrix and 'R' requires axis is given.\n"
-" :type plane: string\n"
-" :arg size: The size of the projection matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :arg axis: Arbitrary perpendicular plane vector (optional).\n"
-" :type axis: :class:`Vector`\n"
-" :return: A new projection matrix.\n"
-" :rtype: :class:`Matrix`\n";
-static PyObject *C_Matrix_OrthoProjection(PyObject *cls, PyObject *args)
-{
- VectorObject *vec = NULL;
- char *plane;
- int matSize, x;
- float norm = 0.0f;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!PyArg_ParseTuple(args, "si|O!", &plane, &matSize, &vector_Type, &vec)) {
- PyErr_SetString(PyExc_TypeError, "mathutils.OrthoProjectionMatrix(): expected string and int and optional vector\n");
- return NULL;
- }
- if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,"mathutils.OrthoProjectionMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
- return NULL;
- }
- if(vec) {
- if(vec->size > 2 && matSize == 2) {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): please use 2D vectors when scaling in 2D\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- }
- if(vec == NULL) { //ortho projection onto cardinal plane
- if((strcmp(plane, "X") == 0) && matSize == 2) {
- mat[0] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
- mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
- mat[4] = 1.0f;
- mat[8] = 1.0f;
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: X, Y, XY, XZ, YZ\n");
- return NULL;
- }
- } else { //arbitrary plane
- //normalize arbitrary axis
- for(x = 0; x < vec->size; x++) {
- norm += vec->vec[x] * vec->vec[x];
- }
- norm = (float) sqrt(norm);
- for(x = 0; x < vec->size; x++) {
- vec->vec[x] /= norm;
- }
- if((strcmp(plane, "R") == 0) && matSize == 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[1]);
- mat[3] = 1 - (vec->vec[1] * vec->vec[1]);
- } else if((strcmp(plane, "R") == 0) && matSize > 2) {
- mat[0] = 1 - (vec->vec[0] * vec->vec[0]);
- mat[1] = -(vec->vec[0] * vec->vec[1]);
- mat[2] = -(vec->vec[0] * vec->vec[2]);
- mat[3] = -(vec->vec[0] * vec->vec[1]);
- mat[4] = 1 - (vec->vec[1] * vec->vec[1]);
- mat[5] = -(vec->vec[1] * vec->vec[2]);
- mat[6] = -(vec->vec[0] * vec->vec[2]);
- mat[7] = -(vec->vec[1] * vec->vec[2]);
- mat[8] = 1 - (vec->vec[2] * vec->vec[2]);
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.OrthoProjectionMatrix(): unknown plane - expected: 'r' expected for axis designation\n");
- return NULL;
- }
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
-}
-
-static char C_Matrix_Shear_doc[] =
-".. classmethod:: Shear(plane, factor, size)\n"
-"\n"
-" Create a matrix to represent an shear transformation.\n"
-"\n"
-" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix.\n"
-" :type plane: string\n"
-" :arg factor: The factor of shear to apply.\n"
-" :type factor: float\n"
-" :arg size: The size of the shear matrix to construct [2, 4].\n"
-" :type size: int\n"
-" :return: A new shear matrix.\n"
-" :rtype: :class:`Matrix`\n";
-
-static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
-{
- int matSize;
- char *plane;
- float factor;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!PyArg_ParseTuple(args, "sfi", &plane, &factor, &matSize)) {
- PyErr_SetString(PyExc_TypeError,"mathutils.ShearMatrix(): expected string float and int\n");
- return NULL;
- }
- if(matSize != 2 && matSize != 3 && matSize != 4) {
- PyErr_SetString(PyExc_AttributeError,"mathutils.ShearMatrix(): can only return a 2x2 3x3 or 4x4 matrix\n");
- return NULL;
- }
-
- if((strcmp(plane, "X") == 0)
- && matSize == 2) {
- mat[0] = 1.0f;
- mat[2] = factor;
- mat[3] = 1.0f;
- } else if((strcmp(plane, "Y") == 0) && matSize == 2) {
- mat[0] = 1.0f;
- mat[1] = factor;
- mat[3] = 1.0f;
- } else if((strcmp(plane, "XY") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[4] = 1.0f;
- mat[6] = factor;
- mat[7] = factor;
- } else if((strcmp(plane, "XZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[3] = factor;
- mat[4] = 1.0f;
- mat[5] = factor;
- mat[8] = 1.0f;
- } else if((strcmp(plane, "YZ") == 0) && matSize > 2) {
- mat[0] = 1.0f;
- mat[1] = factor;
- mat[2] = factor;
- mat[4] = 1.0f;
- mat[8] = 1.0f;
- } else {
- PyErr_SetString(PyExc_AttributeError, "mathutils.ShearMatrix(): expected: x, y, xy, xz, yz or wrong matrix size for shearing plane\n");
- return NULL;
- }
- if(matSize == 4) {
- //resize matrix
- mat[10] = mat[8];
- mat[9] = mat[7];
- mat[8] = mat[6];
- mat[7] = 0.0f;
- mat[6] = mat[5];
- mat[5] = mat[4];
- mat[4] = mat[3];
- mat[3] = 0.0f;
- }
- //pass to matrix creation
- return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
-}
-
-/* assumes rowsize == colsize is checked and the read callback has run */
-static float matrix_determinant(MatrixObject * self)
-{
- if(self->rowSize == 2) {
- return determinant_m2(self->matrix[0][0], self->matrix[0][1],
- self->matrix[1][0], self->matrix[1][1]);
- } else if(self->rowSize == 3) {
- return determinant_m3(self->matrix[0][0], self->matrix[0][1],
- self->matrix[0][2], self->matrix[1][0],
- self->matrix[1][1], self->matrix[1][2],
- self->matrix[2][0], self->matrix[2][1],
- self->matrix[2][2]);
- } else {
- return determinant_m4((float (*)[4])self->contigPtr);
- }
-}
-
-
-/*-----------------------------METHODS----------------------------*/
-static char Matrix_toQuat_doc[] =
-".. method:: to_quat()\n"
-"\n"
-" Return a quaternion representation of the rotation matrix.\n"
-"\n"
-" :return: Quaternion representation of the rotation matrix.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Matrix_toQuat(MatrixObject * self)
-{
- float quat[4];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize < 3 || self->rowSize < 3 || (self->colSize != self->rowSize)) {
- PyErr_SetString(PyExc_AttributeError, "Matrix.to_quat(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
- return NULL;
- }
- if(self->colSize == 3){
- mat3_to_quat( quat,(float (*)[3])self->contigPtr);
- }else{
- mat4_to_quat( quat,(float (*)[4])self->contigPtr);
- }
-
- return newQuaternionObject(quat, Py_NEW, NULL);
-}
-
-/*---------------------------Matrix.toEuler() --------------------*/
-static char Matrix_toEuler_doc[] =
-".. method:: to_euler(order, euler_compat)\n"
-"\n"
-" Return an Euler representation of the rotation matrix (3x3 or 4x4 matrix only).\n"
-"\n"
-" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n"
-" :type order: string\n"
-" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n"
-" :type euler_compat: :class:`Euler`\n"
-" :return: Euler representation of the matrix.\n"
-" :rtype: :class:`Euler`\n";
-
-PyObject *Matrix_toEuler(MatrixObject * self, PyObject *args)
-{
- char *order_str= NULL;
- short order= EULER_ORDER_XYZ;
- float eul[3], eul_compatf[3];
- EulerObject *eul_compat = NULL;
-
- float tmat[3][3];
- float (*mat)[3];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
- return NULL;
-
- if(eul_compat) {
- if(!BaseMath_ReadCallback(eul_compat))
- return NULL;
-
- copy_v3_v3(eul_compatf, eul_compat->eul);
- }
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize ==3 && self->rowSize ==3) {
- mat= (float (*)[3])self->contigPtr;
- }else if (self->colSize ==4 && self->rowSize ==4) {
- copy_m3_m4(tmat, (float (*)[4])self->contigPtr);
- mat= tmat;
- }else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.to_euler(): inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
- return NULL;
- }
-
- if(order_str) {
- order= euler_order_from_string(order_str, "Matrix.to_euler()");
-
- if(order == -1)
- return NULL;
- }
-
- if(eul_compat) {
- if(order == 1) mat3_to_compatible_eul( eul, eul_compatf, mat);
- else mat3_to_compatible_eulO(eul, eul_compatf, order, mat);
- }
- else {
- if(order == 1) mat3_to_eul(eul, mat);
- else mat3_to_eulO(eul, order, mat);
- }
-
- return newEulerObject(eul, order, Py_NEW, NULL);
-}
-/*---------------------------Matrix.resize4x4() ------------------*/
-static char Matrix_Resize4x4_doc[] =
-".. method:: resize4x4()\n"
-"\n"
-" Resize the matrix to 4x4.\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_Resize4x4(MatrixObject * self)
-{
- int x, first_row_elem, curr_pos, new_pos, blank_columns, blank_rows, index;
-
- if(self->wrapped==Py_WRAP){
- PyErr_SetString(PyExc_TypeError, "cannot resize wrapped data - make a copy and resize that");
- return NULL;
- }
- if(self->cb_user){
- PyErr_SetString(PyExc_TypeError, "cannot resize owned data - make a copy and resize that");
- return NULL;
- }
-
- self->contigPtr = PyMem_Realloc(self->contigPtr, (sizeof(float) * 16));
- if(self->contigPtr == NULL) {
- PyErr_SetString(PyExc_MemoryError, "matrix.resize4x4(): problem allocating pointer space");
- return NULL;
- }
- /*set row pointers*/
- for(x = 0; x < 4; x++) {
- self->matrix[x] = self->contigPtr + (x * 4);
- }
- /*move data to new spot in array + clean*/
- for(blank_rows = (4 - self->rowSize); blank_rows > 0; blank_rows--){
- for(x = 0; x < 4; x++){
- index = (4 * (self->rowSize + (blank_rows - 1))) + x;
- if (index == 10 || index == 15){
- self->contigPtr[index] = 1.0f;
- }else{
- self->contigPtr[index] = 0.0f;
- }
- }
- }
- for(x = 1; x <= self->rowSize; x++){
- first_row_elem = (self->colSize * (self->rowSize - x));
- curr_pos = (first_row_elem + (self->colSize -1));
- new_pos = (4 * (self->rowSize - x )) + (curr_pos - first_row_elem);
- for(blank_columns = (4 - self->colSize); blank_columns > 0; blank_columns--){
- self->contigPtr[new_pos + blank_columns] = 0.0f;
- }
- for(curr_pos = curr_pos; curr_pos >= first_row_elem; curr_pos--){
- self->contigPtr[new_pos] = self->contigPtr[curr_pos];
- new_pos--;
- }
- }
- self->rowSize = 4;
- self->colSize = 4;
-
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
-static char Matrix_to_4x4_doc[] =
-".. method:: to_4x4()\n"
-"\n"
-" Return a 4x4 copy of this matrix.\n"
-"\n"
-" :return: a new matrix.\n"
-" :rtype: :class:`Matrix`\n";
-PyObject *Matrix_to_4x4(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->colSize==4 && self->rowSize==4) {
- return (PyObject *)newMatrixObject(self->contigPtr, 4, 4, Py_NEW, Py_TYPE(self));
- }
- else if(self->colSize==3 && self->rowSize==3) {
- float mat[4][4];
- copy_m4_m3(mat, (float (*)[3])self->contigPtr);
- return (PyObject *)newMatrixObject((float *)mat, 4, 4, Py_NEW, Py_TYPE(self));
- }
- /* TODO, 2x2 matrix */
-
- PyErr_SetString(PyExc_TypeError, "Matrix.to_4x4(): inappropriate matrix size");
- return NULL;
-}
-
-static char Matrix_to_3x3_doc[] =
-".. method:: to_3x3()\n"
-"\n"
-" Return a 3x3 copy of this matrix.\n"
-"\n"
-" :return: a new matrix.\n"
-" :rtype: :class:`Matrix`\n";
-PyObject *Matrix_to_3x3(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->colSize==3 && self->rowSize==3) {
- return (PyObject *)newMatrixObject(self->contigPtr, 3, 3, Py_NEW, Py_TYPE(self));
- }
- else if(self->colSize==4 && self->rowSize==4) {
- float mat[3][3];
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- return (PyObject *)newMatrixObject((float *)mat, 3, 3, Py_NEW, Py_TYPE(self));
- }
- /* TODO, 2x2 matrix */
-
- PyErr_SetString(PyExc_TypeError, "Matrix.to_3x3(): inappropriate matrix size");
- return NULL;
-}
-
-/*---------------------------Matrix.translationPart() ------------*/
-static char Matrix_TranslationPart_doc[] =
-".. method:: translation_part()\n"
-"\n"
-" Return a the translation part of a 4 row matrix.\n"
-"\n"
-" :return: Return a the translation of a matrix.\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. note:: Note that the (4,4) element of a matrix can be used for uniform scaling too.\n";
-
-PyObject *Matrix_TranslationPart(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->colSize < 3 || self->rowSize < 4){
- PyErr_SetString(PyExc_AttributeError, "Matrix.translation_part(): inappropriate matrix size");
- return NULL;
- }
-
- return newVectorObject(self->matrix[3], 3, Py_NEW, NULL);
-}
-/*---------------------------Matrix.rotationPart() ---------------*/
-static char Matrix_RotationPart_doc[] =
-".. method:: rotation_part()\n"
-"\n"
-" Return the 3d submatrix corresponding to the linear term of the embedded affine transformation in 3d. This matrix represents rotation and scale.\n"
-"\n"
-" :return: Return the 3d matrix for rotation and scale.\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. note:: Note that the (4,4) element of a matrix can be used for uniform scaling too.\n";
-
-PyObject *Matrix_RotationPart(MatrixObject * self)
-{
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->colSize < 3 || self->rowSize < 3){
- PyErr_SetString(PyExc_AttributeError, "Matrix.rotation_part(): inappropriate matrix size\n");
- return NULL;
- }
-
- mat[0] = self->matrix[0][0];
- mat[1] = self->matrix[0][1];
- mat[2] = self->matrix[0][2];
- mat[3] = self->matrix[1][0];
- mat[4] = self->matrix[1][1];
- mat[5] = self->matrix[1][2];
- mat[6] = self->matrix[2][0];
- mat[7] = self->matrix[2][1];
- mat[8] = self->matrix[2][2];
-
- return newMatrixObject(mat, 3, 3, Py_NEW, Py_TYPE(self));
-}
-/*---------------------------Matrix.scalePart() --------------------*/
-static char Matrix_scalePart_doc[] =
-".. method:: scale_part()\n"
-"\n"
-" Return a the scale part of a 3x3 or 4x4 matrix.\n"
-"\n"
-" :return: Return a the scale of a matrix.\n"
-" :rtype: :class:`Vector`\n"
-"\n"
-" .. note:: This method does not return negative a scale on any axis because it is not possible to obtain this data from the matrix alone.\n";
-
-PyObject *Matrix_scalePart(MatrixObject * self)
-{
- float scale[3], rot[3];
- float mat[3][3], imat[3][3], tmat[3][3];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- else if(self->colSize == 3 && self->rowSize == 3)
- copy_m3_m3(mat, (float (*)[3])self->contigPtr);
- else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.scale_part(): inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
- return NULL;
- }
- /* functionality copied from editobject.c apply_obmat */
- mat3_to_eul( rot,mat);
- eul_to_mat3( tmat,rot);
- invert_m3_m3(imat, tmat);
- mul_m3_m3m3(tmat, imat, mat);
-
- scale[0]= tmat[0][0];
- scale[1]= tmat[1][1];
- scale[2]= tmat[2][2];
- return newVectorObject(scale, 3, Py_NEW, NULL);
-}
-/*---------------------------Matrix.invert() ---------------------*/
-static char Matrix_Invert_doc[] =
-".. method:: invert()\n"
-"\n"
-" Set the matrix to its inverse.\n"
-"\n"
-" :return: an instance of itself.\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. note:: :exc:`ValueError` exception is raised.\n"
-"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Inverse_matrix>\n";
-
-PyObject *Matrix_Invert(MatrixObject * self)
-{
-
- int x, y, z = 0;
- float det = 0.0f;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->rowSize != self->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix.invert(ed): only square matrices are supported");
- return NULL;
- }
-
- /*calculate the determinant*/
- det = matrix_determinant(self);
-
- if(det != 0) {
- /*calculate the classical adjoint*/
- if(self->rowSize == 2) {
- mat[0] = self->matrix[1][1];
- mat[1] = -self->matrix[0][1];
- mat[2] = -self->matrix[1][0];
- mat[3] = self->matrix[0][0];
- } else if(self->rowSize == 3) {
- adjoint_m3_m3((float (*)[3]) mat,(float (*)[3])self->contigPtr);
- } else if(self->rowSize == 4) {
- adjoint_m4_m4((float (*)[4]) mat, (float (*)[4])self->contigPtr);
- }
- /*divide by determinate*/
- for(x = 0; x < (self->rowSize * self->colSize); x++) {
- mat[x] /= det;
- }
- /*set values*/
- for(x = 0; x < self->rowSize; x++) {
- for(y = 0; y < self->colSize; y++) {
- self->matrix[x][y] = mat[z];
- z++;
- }
- }
- /*transpose
- Matrix_Transpose(self);*/
- } else {
- PyErr_SetString(PyExc_ValueError, "matrix does not have an inverse");
- return NULL;
- }
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
-
-/*---------------------------Matrix.determinant() ----------------*/
-static char Matrix_Determinant_doc[] =
-".. method:: determinant()\n"
-"\n"
-" Return the determinant of a matrix.\n"
-"\n"
-" :return: Return a the determinant of a matrix.\n"
-" :rtype: float\n"
-"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Determinant>\n";
-
-PyObject *Matrix_Determinant(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->rowSize != self->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix.determinant: only square matrices are supported");
- return NULL;
- }
-
- return PyFloat_FromDouble((double)matrix_determinant(self));
-}
-/*---------------------------Matrix.transpose() ------------------*/
-static char Matrix_Transpose_doc[] =
-".. method:: transpose()\n"
-"\n"
-" Set the matrix to its transpose.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Transpose>\n";
-
-PyObject *Matrix_Transpose(MatrixObject * self)
-{
- float t = 0.0f;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->rowSize != self->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix.transpose(d): only square matrices are supported");
- return NULL;
- }
-
- if(self->rowSize == 2) {
- t = self->matrix[1][0];
- self->matrix[1][0] = self->matrix[0][1];
- self->matrix[0][1] = t;
- } else if(self->rowSize == 3) {
- transpose_m3((float (*)[3])self->contigPtr);
- } else {
- transpose_m4((float (*)[4])self->contigPtr);
- }
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
-
-/*---------------------------Matrix.zero() -----------------------*/
-static char Matrix_Zero_doc[] =
-".. method:: zero()\n"
-"\n"
-" Set all the matrix values to zero.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_Zero(MatrixObject * self)
-{
- int row, col;
-
- for(row = 0; row < self->rowSize; row++) {
- for(col = 0; col < self->colSize; col++) {
- self->matrix[row][col] = 0.0f;
- }
- }
-
- if(!BaseMath_WriteCallback(self))
- return NULL;
-
- Py_INCREF(self);
- return (PyObject *)self;
-}
-/*---------------------------Matrix.identity(() ------------------*/
-static char Matrix_Identity_doc[] =
-".. method:: identity()\n"
-"\n"
-" Set the matrix to the identity matrix.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n"
-"\n"
-" .. note:: An object with zero location and rotation, a scale of one, will have an identity matrix.\n"
-"\n"
-" .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n";
-
-PyObject *Matrix_Identity(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(self->rowSize != self->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix.identity: only square matrices are supported\n");
- return NULL;
- }
-
- if(self->rowSize == 2) {
- self->matrix[0][0] = 1.0f;
- self->matrix[0][1] = 0.0f;
- self->matrix[1][0] = 0.0f;
- self->matrix[1][1] = 1.0f;
- } else if(self->rowSize == 3) {
- unit_m3((float (*)[3])self->contigPtr);
- } else {
- unit_m4((float (*)[4])self->contigPtr);
- }
-
- if(!BaseMath_WriteCallback(self))
- return NULL;
-
- Py_INCREF(self);
- return (PyObject *)self;
-}
-
-/*---------------------------Matrix.copy() ------------------*/
-static char Matrix_copy_doc[] =
-".. method:: copy()\n"
-"\n"
-" Returns a copy of this matrix.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Matrix`\n";
-
-PyObject *Matrix_copy(MatrixObject * self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- return (PyObject*)newMatrixObject((float (*))self->contigPtr, self->rowSize, self->colSize, Py_NEW, Py_TYPE(self));
-}
-
-/*----------------------------print object (internal)-------------*/
-/*print the object to screen*/
-static PyObject *Matrix_repr(MatrixObject * self)
-{
- int x, y;
- char str[1024]="Matrix((", *str_p;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- str_p= &str[8];
-
- for(x = 0; x < self->colSize; x++){
- for(y = 0; y < (self->rowSize - 1); y++) {
- str_p += sprintf(str_p, "%f, ", self->matrix[y][x]);
- }
- if(x < (self->colSize-1)){
- str_p += sprintf(str_p, "%f), (", self->matrix[y][x]);
- }
- else{
- str_p += sprintf(str_p, "%f)", self->matrix[y][x]);
- }
- }
- strcat(str_p, ")");
-
- return PyUnicode_FromString(str);
-}
-/*------------------------tp_richcmpr*/
-/*returns -1 execption, 0 false, 1 true*/
-static PyObject* Matrix_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
-{
- MatrixObject *matA = NULL, *matB = NULL;
- int result = 0;
-
- if (!MatrixObject_Check(objectA) || !MatrixObject_Check(objectB)){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
- matA = (MatrixObject*)objectA;
- matB = (MatrixObject*)objectB;
-
- if(!BaseMath_ReadCallback(matA) || !BaseMath_ReadCallback(matB))
- return NULL;
-
- if (matA->colSize != matB->colSize || matA->rowSize != matB->rowSize){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
-
- switch (comparison_type){
- case Py_EQ:
- /*contigPtr is basically a really long vector*/
- result = EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr,
- (matA->rowSize * matA->colSize), 1);
- break;
- case Py_NE:
- result = EXPP_VectorsAreEqual(matA->contigPtr, matB->contigPtr,
- (matA->rowSize * matA->colSize), 1);
- if (result == 0){
- result = 1;
- }else{
- result = 0;
- }
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
-}
-
-/*---------------------SEQUENCE PROTOCOLS------------------------
- ----------------------------len(object)------------------------
- sequence length*/
-static int Matrix_len(MatrixObject * self)
-{
- return (self->rowSize);
-}
-/*----------------------------object[]---------------------------
- sequence accessor (get)
- the wrapped vector gives direct access to the matrix data*/
-static PyObject *Matrix_item(MatrixObject * self, int i)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if(i < 0 || i >= self->rowSize) {
- PyErr_SetString(PyExc_IndexError, "matrix[attribute]: array index out of range");
- return NULL;
- }
- return newVectorObject_cb((PyObject *)self, self->colSize, mathutils_matrix_vector_cb_index, i);
-}
-/*----------------------------object[]-------------------------
- sequence accessor (set)*/
-static int Matrix_ass_item(MatrixObject * self, int i, PyObject * ob)
-{
- int y, x, size = 0;
- float vec[4];
- PyObject *m, *f;
-
- if(!BaseMath_ReadCallback(self))
- return -1;
-
- if(i >= self->rowSize || i < 0){
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad column\n");
- return -1;
- }
-
- if(PySequence_Check(ob)){
- size = PySequence_Length(ob);
- if(size != self->colSize){
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: bad sequence size\n");
- return -1;
- }
- for (x = 0; x < size; x++) {
- m = PySequence_GetItem(ob, x);
- if (m == NULL) { /*Failed to read sequence*/
- PyErr_SetString(PyExc_RuntimeError, "matrix[attribute] = x: unable to read sequence\n");
- return -1;
- }
-
- f = PyNumber_Float(m);
- if(f == NULL) { /*parsed item not a number*/
- Py_DECREF(m);
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: sequence argument not a number\n");
- return -1;
- }
-
- vec[x] = (float)PyFloat_AS_DOUBLE(f);
- Py_DECREF(m);
- Py_DECREF(f);
- }
- /*parsed well - now set in matrix*/
- for(y = 0; y < size; y++){
- self->matrix[i][y] = vec[y];
- }
-
- BaseMath_WriteCallback(self);
- return 0;
- }else{
- PyErr_SetString(PyExc_TypeError, "matrix[attribute] = x: expects a sequence of column size\n");
- return -1;
- }
-}
-/*----------------------------object[z:y]------------------------
- sequence slice (get)*/
-static PyObject *Matrix_slice(MatrixObject * self, int begin, int end)
-{
-
- PyObject *list = NULL;
- int count;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- CLAMP(begin, 0, self->rowSize);
- CLAMP(end, 0, self->rowSize);
- begin = MIN2(begin,end);
-
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SetItem(list, count - begin,
- newVectorObject_cb((PyObject *)self, self->colSize, mathutils_matrix_vector_cb_index, count));
-
- }
-
- return list;
-}
-/*----------------------------object[z:y]------------------------
- sequence slice (set)*/
-static int Matrix_ass_slice(MatrixObject * self, int begin, int end, PyObject * seq)
-{
- int i, x, y, size, sub_size = 0;
- float mat[16], f;
- PyObject *subseq;
- PyObject *m;
-
- if(!BaseMath_ReadCallback(self))
- return -1;
-
- CLAMP(begin, 0, self->rowSize);
- CLAMP(end, 0, self->rowSize);
- begin = MIN2(begin,end);
-
- if(PySequence_Check(seq)){
- size = PySequence_Length(seq);
- if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment\n");
- return -1;
- }
- /*parse sub items*/
- for (i = 0; i < size; i++) {
- /*parse each sub sequence*/
- subseq = PySequence_GetItem(seq, i);
- if (subseq == NULL) { /*Failed to read sequence*/
- PyErr_SetString(PyExc_RuntimeError, "matrix[begin:end] = []: unable to read sequence");
- return -1;
- }
-
- if(PySequence_Check(subseq)){
- /*subsequence is also a sequence*/
- sub_size = PySequence_Length(subseq);
- if(sub_size != self->colSize){
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: size mismatch in slice assignment\n");
- return -1;
- }
- for (y = 0; y < sub_size; y++) {
- m = PySequence_GetItem(subseq, y);
- if (m == NULL) { /*Failed to read sequence*/
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_RuntimeError, "matrix[begin:end] = []: unable to read sequence\n");
- return -1;
- }
-
- f = PyFloat_AsDouble(m); /* faster to assume a float and raise an error after */
- if(f == -1 && PyErr_Occurred()) { /*parsed item not a number*/
- Py_DECREF(m);
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: sequence argument not a number\n");
- return -1;
- }
-
- mat[(i * self->colSize) + y] = f;
- Py_DECREF(m);
- }
- }else{
- Py_DECREF(subseq);
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: illegal argument type for built-in operation\n");
- return -1;
- }
- Py_DECREF(subseq);
- }
- /*parsed well - now set in matrix*/
- for(x = 0; x < (size * sub_size); x++){
- self->matrix[begin + (int)floor(x / self->colSize)][x % self->colSize] = mat[x];
- }
-
- BaseMath_WriteCallback(self);
- return 0;
- }else{
- PyErr_SetString(PyExc_TypeError, "matrix[begin:end] = []: illegal argument type for built-in operation\n");
- return -1;
- }
-}
-/*------------------------NUMERIC PROTOCOLS----------------------
- ------------------------obj + obj------------------------------*/
-static PyObject *Matrix_add(PyObject * m1, PyObject * m2)
-{
- int x, y;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- MatrixObject *mat1 = NULL, *mat2 = NULL;
-
- mat1 = (MatrixObject*)m1;
- mat2 = (MatrixObject*)m2;
-
- if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation....");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
- return NULL;
-
- if(mat1->rowSize != mat2->rowSize || mat1->colSize != mat2->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
- return NULL;
- }
-
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = mat1->matrix[x][y] + mat2->matrix[x][y];
- }
- }
-
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
-}
-/*------------------------obj - obj------------------------------
- subtraction*/
-static PyObject *Matrix_sub(PyObject * m1, PyObject * m2)
-{
- int x, y;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- MatrixObject *mat1 = NULL, *mat2 = NULL;
-
- mat1 = (MatrixObject*)m1;
- mat2 = (MatrixObject*)m2;
-
- if(!MatrixObject_Check(m1) || !MatrixObject_Check(m2)) {
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: arguments not valid for this operation....");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
- return NULL;
-
- if(mat1->rowSize != mat2->rowSize || mat1->colSize != mat2->colSize){
- PyErr_SetString(PyExc_AttributeError, "Matrix addition: matrices must have the same dimensions for this operation");
- return NULL;
- }
-
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = mat1->matrix[x][y] - mat2->matrix[x][y];
- }
- }
-
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
-}
-/*------------------------obj * obj------------------------------
- mulplication*/
-static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
-{
- int x, y, z;
- float scalar;
- float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- double dot = 0.0f;
- MatrixObject *mat1 = NULL, *mat2 = NULL;
-
- if(MatrixObject_Check(m1)) {
- mat1 = (MatrixObject*)m1;
- if(!BaseMath_ReadCallback(mat1))
- return NULL;
- }
- if(MatrixObject_Check(m2)) {
- mat2 = (MatrixObject*)m2;
- if(!BaseMath_ReadCallback(mat2))
- return NULL;
- }
-
- if(mat1 && mat2) { /*MATRIX * MATRIX*/
- if(mat1->rowSize != mat2->colSize){
- PyErr_SetString(PyExc_AttributeError,"Matrix multiplication: matrix A rowsize must equal matrix B colsize");
- return NULL;
- }
- for(x = 0; x < mat2->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- for(z = 0; z < mat1->rowSize; z++) {
- dot += (mat1->matrix[z][y] * mat2->matrix[x][z]);
- }
- mat[((x * mat1->colSize) + y)] = (float)dot;
- dot = 0.0f;
- }
- }
-
- return newMatrixObject(mat, mat2->rowSize, mat1->colSize, Py_NEW, NULL);
- }
-
- if(mat1==NULL){
- scalar=PyFloat_AsDouble(m1); // may not be a float...
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX, this line annoys theeth, lets see if he finds it */
- for(x = 0; x < mat2->rowSize; x++) {
- for(y = 0; y < mat2->colSize; y++) {
- mat[((x * mat2->colSize) + y)] = scalar * mat2->matrix[x][y];
- }
- }
- return newMatrixObject(mat, mat2->rowSize, mat2->colSize, Py_NEW, NULL);
- }
-
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
- return NULL;
- }
- else /* if(mat1) { */ {
- if(VectorObject_Check(m2)) { /* MATRIX*VECTOR */
- return column_vector_multiplication(mat1, (VectorObject *)m2); /* vector update done inside the function */
- }
- else {
- scalar= PyFloat_AsDouble(m2);
- if ((scalar == -1.0 && PyErr_Occurred())==0) { /* MATRIX*FLOAT/INT */
- for(x = 0; x < mat1->rowSize; x++) {
- for(y = 0; y < mat1->colSize; y++) {
- mat[((x * mat1->colSize) + y)] = scalar * mat1->matrix[x][y];
- }
- }
- return newMatrixObject(mat, mat1->rowSize, mat1->colSize, Py_NEW, NULL);
- }
- }
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation");
- return NULL;
- }
-
- PyErr_SetString(PyExc_TypeError, "Matrix multiplication: arguments not acceptable for this operation\n");
- return NULL;
-}
-static PyObject* Matrix_inv(MatrixObject *self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- return Matrix_Invert(self);
-}
-
-/*-----------------PROTOCOL DECLARATIONS--------------------------*/
-static PySequenceMethods Matrix_SeqMethods = {
- (lenfunc) Matrix_len, /* sq_length */
- (binaryfunc) NULL, /* sq_concat */
- (ssizeargfunc) NULL, /* sq_repeat */
- (ssizeargfunc) Matrix_item, /* sq_item */
- (ssizessizeargfunc) Matrix_slice, /* sq_slice, deprecated TODO, replace */
- (ssizeobjargproc) Matrix_ass_item, /* sq_ass_item */
- (ssizessizeobjargproc) Matrix_ass_slice, /* sq_ass_slice, deprecated TODO, replace */
- (objobjproc) NULL, /* sq_contains */
- (binaryfunc) NULL, /* sq_inplace_concat */
- (ssizeargfunc) NULL, /* sq_inplace_repeat */
-};
-
-
-static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
-{
- if (PyIndex_Check(item)) {
- Py_ssize_t i;
- i = PyNumber_AsSsize_t(item, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
- return NULL;
- if (i < 0)
- i += self->rowSize;
- return Matrix_item(self, i);
- } else if (PySlice_Check(item)) {
- Py_ssize_t start, stop, step, slicelength;
-
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
- return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
- }
- else if (step == 1) {
- return Matrix_slice(self, start, stop);
- }
- else {
- PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
- return NULL;
- }
- }
- else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
- return NULL;
- }
-}
-
-static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* value)
-{
- if (PyIndex_Check(item)) {
- Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
- return -1;
- if (i < 0)
- i += self->rowSize;
- return Matrix_ass_item(self, i, value);
- }
- else if (PySlice_Check(item)) {
- Py_ssize_t start, stop, step, slicelength;
-
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
- return -1;
-
- if (step == 1)
- return Matrix_ass_slice(self, start, stop, value);
- else {
- PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
- return -1;
- }
- }
- else {
- PyErr_Format(PyExc_TypeError,
- "matrix indices must be integers, not %.200s",
- item->ob_type->tp_name);
- return -1;
- }
-}
-
-static PyMappingMethods Matrix_AsMapping = {
- (lenfunc)Matrix_len,
- (binaryfunc)Matrix_subscript,
- (objobjargproc)Matrix_ass_subscript
-};
-
-
-static PyNumberMethods Matrix_NumMethods = {
- (binaryfunc) Matrix_add, /*nb_add*/
- (binaryfunc) Matrix_sub, /*nb_subtract*/
- (binaryfunc) Matrix_mul, /*nb_multiply*/
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- (unaryfunc) 0, /*nb_negative*/
- (unaryfunc) 0, /*tp_positive*/
- (unaryfunc) 0, /*tp_absolute*/
- (inquiry) 0, /*tp_bool*/
- (unaryfunc) Matrix_inv, /*nb_invert*/
- 0, /*nb_lshift*/
- (binaryfunc)0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- 0, /*nb_int*/
- 0, /*nb_reserved*/
- 0, /*nb_float*/
- 0, /* nb_inplace_add */
- 0, /* nb_inplace_subtract */
- 0, /* nb_inplace_multiply */
- 0, /* nb_inplace_remainder */
- 0, /* nb_inplace_power */
- 0, /* nb_inplace_lshift */
- 0, /* nb_inplace_rshift */
- 0, /* nb_inplace_and */
- 0, /* nb_inplace_xor */
- 0, /* nb_inplace_or */
- 0, /* nb_floor_divide */
- 0, /* nb_true_divide */
- 0, /* nb_inplace_floor_divide */
- 0, /* nb_inplace_true_divide */
- 0, /* nb_index */
-};
-
-static PyObject *Matrix_getRowSize( MatrixObject * self, void *type )
-{
- return PyLong_FromLong((long) self->rowSize);
-}
-
-static PyObject *Matrix_getColSize( MatrixObject * self, void *type )
-{
- return PyLong_FromLong((long) self->colSize);
-}
-
-static PyObject *Matrix_getMedianScale( MatrixObject * self, void *type )
-{
- float mat[3][3];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
- copy_m3_m4(mat, (float (*)[4])self->contigPtr);
- else if(self->colSize == 3 && self->rowSize == 3)
- copy_m3_m3(mat, (float (*)[3])self->contigPtr);
- else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.median_scale: inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
- return NULL;
- }
-
- return PyFloat_FromDouble(mat3_to_scale(mat));
-}
-
-static PyObject *Matrix_getIsNegative( MatrixObject * self, void *type )
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /*must be 3-4 cols, 3-4 rows, square matrix*/
- if(self->colSize == 4 && self->rowSize == 4)
- return PyBool_FromLong(is_negative_m4((float (*)[4])self->contigPtr));
- else if(self->colSize == 3 && self->rowSize == 3)
- return PyBool_FromLong(is_negative_m3((float (*)[3])self->contigPtr));
- else {
- PyErr_SetString(PyExc_AttributeError, "Matrix.is_negative: inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
- return NULL;
- }
-}
-
-
-/*****************************************************************************/
-/* Python attributes get/set structure: */
-/*****************************************************************************/
-static PyGetSetDef Matrix_getseters[] = {
- {"row_size", (getter)Matrix_getRowSize, (setter)NULL, "The row size of the matrix (readonly).\n\n:type: int", NULL},
- {"col_size", (getter)Matrix_getColSize, (setter)NULL, "The column size of the matrix (readonly).\n\n:type: int", NULL},
- {"median_scale", (getter)Matrix_getMedianScale, (setter)NULL, "The average scale applied to each axis (readonly).\n\n:type: float", NULL},
- {"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, "True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner",(getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
-};
-
-/*-----------------------METHOD DEFINITIONS ----------------------*/
-static struct PyMethodDef Matrix_methods[] = {
- {"zero", (PyCFunction) Matrix_Zero, METH_NOARGS, Matrix_Zero_doc},
- {"identity", (PyCFunction) Matrix_Identity, METH_NOARGS, Matrix_Identity_doc},
- {"transpose", (PyCFunction) Matrix_Transpose, METH_NOARGS, Matrix_Transpose_doc},
- {"determinant", (PyCFunction) Matrix_Determinant, METH_NOARGS, Matrix_Determinant_doc},
- {"invert", (PyCFunction) Matrix_Invert, METH_NOARGS, Matrix_Invert_doc},
- {"translation_part", (PyCFunction) Matrix_TranslationPart, METH_NOARGS, Matrix_TranslationPart_doc},
- {"rotation_part", (PyCFunction) Matrix_RotationPart, METH_NOARGS, Matrix_RotationPart_doc},
- {"scale_part", (PyCFunction) Matrix_scalePart, METH_NOARGS, Matrix_scalePart_doc},
- {"resize4x4", (PyCFunction) Matrix_Resize4x4, METH_NOARGS, Matrix_Resize4x4_doc},
- {"to_4x4", (PyCFunction) Matrix_to_4x4, METH_NOARGS, Matrix_to_4x4_doc},
- {"to_3x3", (PyCFunction) Matrix_to_3x3, METH_NOARGS, Matrix_to_3x3_doc},
- {"to_euler", (PyCFunction) Matrix_toEuler, METH_VARARGS, Matrix_toEuler_doc},
- {"to_quat", (PyCFunction) Matrix_toQuat, METH_NOARGS, Matrix_toQuat_doc},
- {"copy", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
- {"__copy__", (PyCFunction) Matrix_copy, METH_NOARGS, Matrix_copy_doc},
-
- /* class methods */
- {"Rotation", (PyCFunction) C_Matrix_Rotation, METH_VARARGS | METH_CLASS, C_Matrix_Rotation_doc},
- {"Scale", (PyCFunction) C_Matrix_Scale, METH_VARARGS | METH_CLASS, C_Matrix_Scale_doc},
- {"Shear", (PyCFunction) C_Matrix_Shear, METH_VARARGS | METH_CLASS, C_Matrix_Shear_doc},
- {"Translation", (PyCFunction) C_Matrix_Translation, METH_O | METH_CLASS, C_Matrix_Translation_doc},
- {"OrthoProjection", (PyCFunction) C_Matrix_OrthoProjection, METH_VARARGS | METH_CLASS, C_Matrix_OrthoProjection_doc},
- {NULL, NULL, 0, NULL}
-};
-
-/*------------------PY_OBECT DEFINITION--------------------------*/
-static char matrix_doc[] =
-"This object gives access to Matrices in Blender.";
-
-PyTypeObject matrix_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "matrix", /*tp_name*/
- sizeof(MatrixObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)BaseMathObject_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- (reprfunc) Matrix_repr, /*tp_repr*/
- &Matrix_NumMethods, /*tp_as_number*/
- &Matrix_SeqMethods, /*tp_as_sequence*/
- &Matrix_AsMapping, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- matrix_doc, /*tp_doc*/
- 0, /*tp_traverse*/
- 0, /*tp_clear*/
- (richcmpfunc)Matrix_richcmpr, /*tp_richcompare*/
- 0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- 0, /*tp_iternext*/
- Matrix_methods, /*tp_methods*/
- 0, /*tp_members*/
- Matrix_getseters, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- 0, /*tp_dictoffset*/
- 0, /*tp_init*/
- 0, /*tp_alloc*/
- Matrix_new, /*tp_new*/
- 0, /*tp_free*/
- 0, /*tp_is_gc*/
- 0, /*tp_bases*/
- 0, /*tp_mro*/
- 0, /*tp_cache*/
- 0, /*tp_subclasses*/
- 0, /*tp_weaklist*/
- 0 /*tp_del*/
-};
-
-/*------------------------newMatrixObject (internal)-------------
-creates a new matrix object
-self->matrix self->contiguous_ptr (reference to data.xxx)
- [0]------------->[0]
- [1]
- [2]
- [1]------------->[3]
- [4]
- [5]
- ....
-self->matrix[1][1] = self->contigPtr[4] */
-
-/*pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
- (i.e. it was allocated elsewhere by MEM_mallocN())
- pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
- (i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newMatrixObject(float *mat, int rowSize, int colSize, int type, PyTypeObject *base_type)
-{
- MatrixObject *self;
- int x, row, col;
-
- /*matrix objects can be any 2-4row x 2-4col matrix*/
- if(rowSize < 2 || rowSize > 4 || colSize < 2 || colSize > 4){
- PyErr_SetString(PyExc_RuntimeError, "matrix(): row and column sizes must be between 2 and 4");
- return NULL;
- }
-
- if(base_type) self = (MatrixObject *)base_type->tp_alloc(base_type, 0);
- else self = PyObject_NEW(MatrixObject, &matrix_Type);
-
- self->rowSize = rowSize;
- self->colSize = colSize;
-
- /* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
-
- if(type == Py_WRAP){
- self->contigPtr = mat;
- /*pointer array points to contigous memory*/
- for(x = 0; x < rowSize; x++) {
- self->matrix[x] = self->contigPtr + (x * colSize);
- }
- self->wrapped = Py_WRAP;
- }else if (type == Py_NEW){
- self->contigPtr = PyMem_Malloc(rowSize * colSize * sizeof(float));
- if(self->contigPtr == NULL) { /*allocation failure*/
- PyErr_SetString( PyExc_MemoryError, "matrix(): problem allocating pointer space\n");
- return NULL;
- }
- /*pointer array points to contigous memory*/
- for(x = 0; x < rowSize; x++) {
- self->matrix[x] = self->contigPtr + (x * colSize);
- }
- /*parse*/
- if(mat) { /*if a float array passed*/
- for(row = 0; row < rowSize; row++) {
- for(col = 0; col < colSize; col++) {
- self->matrix[row][col] = mat[(row * colSize) + col];
- }
- }
- } else if (rowSize == colSize ) { /*or if no arguments are passed return identity matrix for square matrices */
- Matrix_Identity(self);
- Py_DECREF(self);
- }
- self->wrapped = Py_NEW;
- }else{ /*bad type*/
- return NULL;
- }
- return (PyObject *) self;
-}
-
-PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb_type, int cb_subtype)
-{
- MatrixObject *self= (MatrixObject *)newMatrixObject(NULL, rowSize, colSize, Py_NEW, NULL);
- if(self) {
- Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
- }
- return (PyObject *) self;
-}
-
-//----------------column_vector_multiplication (internal)---------
-//COLUMN VECTOR Multiplication (Matrix X Vector)
-// [1][4][7] [a]
-// [2][5][8] * [b]
-// [3][6][9] [c]
-//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
-static PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec)
-{
- float vecNew[4], vecCopy[4];
- double dot = 0.0f;
- int x, y, z = 0;
-
- if(!BaseMath_ReadCallback(mat) || !BaseMath_ReadCallback(vec))
- return NULL;
-
- if(mat->rowSize != vec->size){
- if(mat->rowSize == 4 && vec->size != 3){
- PyErr_SetString(PyExc_AttributeError, "matrix * vector: matrix row size and vector size must be the same");
- return NULL;
- }else{
- vecCopy[3] = 1.0f;
- }
- }
-
- for(x = 0; x < vec->size; x++){
- vecCopy[x] = vec->vec[x];
- }
- vecNew[3] = 1.0f;
-
- for(x = 0; x < mat->colSize; x++) {
- for(y = 0; y < mat->rowSize; y++) {
- dot += mat->matrix[y][x] * vecCopy[y];
- }
- vecNew[z++] = (float)dot;
- dot = 0.0f;
- }
- return newVectorObject(vecNew, vec->size, Py_NEW, NULL);
-}
diff --git a/source/blender/python/generic/mathutils_vector.c b/source/blender/python/generic/mathutils_vector.c
deleted file mode 100644
index 424ee546245..00000000000
--- a/source/blender/python/generic/mathutils_vector.c
+++ /dev/null
@@ -1,2206 +0,0 @@
-/*
- * $Id$
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- *
- * Contributor(s): Willian P. Germano, Joseph Gilbert, Ken Hughes, Alex Fraser, Campbell Barton
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "mathutils.h"
-
-#include "BLI_blenlib.h"
-#include "BKE_utildefines.h"
-#include "BLI_math.h"
-
-#define MAX_DIMENSIONS 4
-/* Swizzle axes get packed into a single value that is used as a closure. Each
- axis uses SWIZZLE_BITS_PER_AXIS bits. The first bit (SWIZZLE_VALID_AXIS) is
- used as a sentinel: if it is unset, the axis is not valid. */
-#define SWIZZLE_BITS_PER_AXIS 3
-#define SWIZZLE_VALID_AXIS 0x4
-#define SWIZZLE_AXIS 0x3
-
-static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat); /* utility func */
-static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits);
-
-//----------------------------------mathutils.Vector() ------------------
-// Supports 2D, 3D, and 4D vector objects both int and float values
-// accepted. Mixed float and int values accepted. Ints are parsed to float
-static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- float vec[4]= {0.0f, 0.0f, 0.0f, 0.0f};
- int size= 3; /* default to a 3D vector */
-
- switch(PyTuple_GET_SIZE(args)) {
- case 0:
- break;
- case 1:
- if((size=mathutils_array_parse(vec, 2, 4, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1)
- return NULL;
- break;
- default:
- PyErr_SetString(PyExc_TypeError, "mathutils.Vector(): more then a single arg given");
- return NULL;
- }
- return newVectorObject(vec, size, Py_NEW, type);
-}
-
-/*-----------------------------METHODS---------------------------- */
-static char Vector_Zero_doc[] =
-".. method:: zero()\n"
-"\n"
-" Set all values to zero.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Zero(VectorObject *self)
-{
- int i;
- for(i = 0; i < self->size; i++) {
- self->vec[i] = 0.0f;
- }
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
-}
-/*----------------------------Vector.normalize() ----------------- */
-static char Vector_Normalize_doc[] =
-".. method:: normalize()\n"
-"\n"
-" Normalize the vector, making the length of the vector always 1.0.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n"
-"\n"
-" .. warning:: Normalizing a vector where all values are zero results in all axis having a nan value (not a number).\n"
-"\n"
-" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n";
-
-static PyObject *Vector_Normalize(VectorObject *self)
-{
- int i;
- float norm = 0.0f;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- for(i = 0; i < self->size; i++) {
- norm += self->vec[i] * self->vec[i];
- }
- norm = (float) sqrt(norm);
- for(i = 0; i < self->size; i++) {
- self->vec[i] /= norm;
- }
-
- BaseMath_WriteCallback(self);
- Py_INCREF(self);
- return (PyObject*)self;
-}
-
-
-/*----------------------------Vector.resize2D() ------------------ */
-static char Vector_Resize2D_doc[] =
-".. method:: resize2D()\n"
-"\n"
-" Resize the vector to 2D (x, y).\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize2D(VectorObject *self)
-{
- if(self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize2D(): cannot resize wrapped data - only python vectors\n");
- return NULL;
- }
- if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize2D(): cannot resize a vector that has an owner");
- return NULL;
- }
-
- self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 2));
- if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize2D(): problem allocating pointer space\n\n");
- return NULL;
- }
-
- self->size = 2;
- Py_INCREF(self);
- return (PyObject*)self;
-}
-/*----------------------------Vector.resize3D() ------------------ */
-static char Vector_Resize3D_doc[] =
-".. method:: resize3D()\n"
-"\n"
-" Resize the vector to 3D (x, y, z).\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize3D(VectorObject *self)
-{
- if (self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize3D(): cannot resize wrapped data - only python vectors\n");
- return NULL;
- }
- if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize3D(): cannot resize a vector that has an owner");
- return NULL;
- }
-
- self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 3));
- if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize3D(): problem allocating pointer space\n\n");
- return NULL;
- }
-
- if(self->size == 2)
- self->vec[2] = 0.0f;
-
- self->size = 3;
- Py_INCREF(self);
- return (PyObject*)self;
-}
-/*----------------------------Vector.resize4D() ------------------ */
-static char Vector_Resize4D_doc[] =
-".. method:: resize4D()\n"
-"\n"
-" Resize the vector to 4D (x, y, z, w).\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Resize4D(VectorObject *self)
-{
- if(self->wrapped==Py_WRAP) {
- PyErr_SetString(PyExc_TypeError, "vector.resize4D(): cannot resize wrapped data - only python vectors");
- return NULL;
- }
- if(self->cb_user) {
- PyErr_SetString(PyExc_TypeError, "vector.resize4D(): cannot resize a vector that has an owner");
- return NULL;
- }
-
- self->vec = PyMem_Realloc(self->vec, (sizeof(float) * 4));
- if(self->vec == NULL) {
- PyErr_SetString(PyExc_MemoryError, "vector.resize4D(): problem allocating pointer space\n\n");
- return NULL;
- }
- if(self->size == 2){
- self->vec[2] = 0.0f;
- self->vec[3] = 1.0f;
- }else if(self->size == 3){
- self->vec[3] = 1.0f;
- }
- self->size = 4;
- Py_INCREF(self);
- return (PyObject*)self;
-}
-
-/*----------------------------Vector.toTuple() ------------------ */
-static char Vector_ToTuple_doc[] =
-".. method:: to_tuple(precision=-1)\n"
-"\n"
-" Return this vector as a tuple with.\n"
-"\n"
-" :arg precision: The number to round the value to in [-1, 21].\n"
-" :type precision: int\n"
-" :return: the values of the vector rounded by *precision*\n"
-" :rtype: tuple\n";
-
-/* note: BaseMath_ReadCallback must be called beforehand */
-static PyObject *Vector_ToTupleExt(VectorObject *self, int ndigits)
-{
- PyObject *ret;
- int i;
-
- ret= PyTuple_New(self->size);
-
- if(ndigits >= 0) {
- for(i = 0; i < self->size; i++) {
- PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(double_round((double)self->vec[i], ndigits)));
- }
- }
- else {
- for(i = 0; i < self->size; i++) {
- PyTuple_SET_ITEM(ret, i, PyFloat_FromDouble(self->vec[i]));
- }
- }
-
- return ret;
-}
-
-static PyObject *Vector_ToTuple(VectorObject *self, PyObject *args)
-{
- int ndigits= 0;
-
- if(!PyArg_ParseTuple(args, "|i:to_tuple", &ndigits))
- return NULL;
-
- if(ndigits > 22 || ndigits < 0) {
- PyErr_SetString(PyExc_ValueError, "vector.to_tuple(ndigits): ndigits must be between 0 and 21");
- return NULL;
- }
-
- if(PyTuple_GET_SIZE(args)==0)
- ndigits= -1;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- return Vector_ToTupleExt(self, ndigits);
-}
-
-/*----------------------------Vector.toTrackQuat(track, up) ---------------------- */
-static char Vector_ToTrackQuat_doc[] =
-".. method:: to_track_quat(track, up)\n"
-"\n"
-" Return a quaternion rotation from the vector and the track and up axis.\n"
-"\n"
-" :arg track: Track axis in ['X', 'Y', 'Z', '-X', '-Y', '-Z'].\n"
-" :type track: string\n"
-" :arg up: Up axis in ['X', 'Y', 'Z'].\n"
-" :type up: string\n"
-" :return: rotation from the vector and the track and up axis.\n"
-" :rtype: :class:`Quaternion`\n";
-
-static PyObject *Vector_ToTrackQuat(VectorObject *self, PyObject *args )
-{
- float vec[3], quat[4];
- char *strack, *sup;
- short track = 2, up = 1;
-
- if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup))
- return NULL;
-
- if (self->size != 3) {
- PyErr_SetString( PyExc_TypeError, "only for 3D vectors\n" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- if (strack) {
- if (strlen(strack) == 2) {
- if (strack[0] == '-') {
- switch(strack[1]) {
- case 'X':
- track = 3;
- break;
- case 'Y':
- track = 4;
- break;
- case 'Z':
- track = 5;
- break;
- default:
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
- return NULL;
- }
- }
- else {
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
- return NULL;
- }
- }
- else if (strlen(strack) == 1) {
- switch(strack[0]) {
- case '-':
- case 'X':
- track = 0;
- break;
- case 'Y':
- track = 1;
- break;
- case 'Z':
- track = 2;
- break;
- default:
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
- return NULL;
- }
- }
- else {
- PyErr_SetString( PyExc_ValueError, "only X, -X, Y, -Y, Z or -Z for track axis\n" );
- return NULL;
- }
- }
-
- if (sup) {
- if (strlen(sup) == 1) {
- switch(*sup) {
- case 'X':
- up = 0;
- break;
- case 'y':
- up = 1;
- break;
- case 'Z':
- up = 2;
- break;
- default:
- PyErr_SetString( PyExc_ValueError, "only X, Y or Z for up axis\n" );
- return NULL;
- }
- }
- else {
- PyErr_SetString( PyExc_ValueError, "only X, Y or Z for up axis\n" );
- return NULL;
- }
- }
-
- if (track == up) {
- PyErr_SetString( PyExc_ValueError, "Can't have the same axis for track and up\n" );
- return NULL;
- }
-
- /*
- flip vector around, since vectoquat expect a vector from target to tracking object
- and the python function expects the inverse (a vector to the target).
- */
- vec[0] = -self->vec[0];
- vec[1] = -self->vec[1];
- vec[2] = -self->vec[2];
-
- vec_to_quat( quat,vec, track, up);
-
- return newQuaternionObject(quat, Py_NEW, NULL);
-}
-
-/*----------------------------Vector.reflect(mirror) ----------------------
- return a reflected vector on the mirror normal
- vec - ((2 * DotVecs(vec, mirror)) * mirror)
-*/
-static char Vector_Reflect_doc[] =
-".. method:: reflect(mirror)\n"
-"\n"
-" Return the reflection vector from the *mirror* argument.\n"
-"\n"
-" :arg mirror: This vector could be a normal from the reflecting surface.\n"
-" :type mirror: :class:`Vector`\n"
-" :return: The reflected vector matching the size of this vector.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Reflect(VectorObject *self, VectorObject *value )
-{
- float mirror[3], vec[3];
- float reflect[3] = {0.0f, 0.0f, 0.0f};
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.reflect(value): expected a vector argument" );
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
- mirror[0] = value->vec[0];
- mirror[1] = value->vec[1];
- if (value->size > 2) mirror[2] = value->vec[2];
- else mirror[2] = 0.0;
-
- vec[0] = self->vec[0];
- vec[1] = self->vec[1];
- if (self->size > 2) vec[2] = self->vec[2];
- else vec[2] = 0.0;
-
- normalize_v3(mirror);
- reflect_v3_v3v3(reflect, vec, mirror);
-
- return newVectorObject(reflect, self->size, Py_NEW, NULL);
-}
-
-static char Vector_Cross_doc[] =
-".. method:: cross(other)\n"
-"\n"
-" Return the cross product of this vector and another.\n"
-"\n"
-" :arg other: The other vector to perform the cross product with.\n"
-" :type other: :class:`Vector`\n"
-" :return: The cross product.\n"
-" :rtype: :class:`Vector`\n"
-"\n"
-" .. note:: both vectors must be 3D\n";
-
-static PyObject *Vector_Cross(VectorObject *self, VectorObject *value )
-{
- VectorObject *vecCross = NULL;
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.cross(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != 3 || value->size != 3) {
- PyErr_SetString(PyExc_AttributeError, "vec.cross(value): expects both vectors to be 3D\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
- vecCross = (VectorObject *)newVectorObject(NULL, 3, Py_NEW, NULL);
- cross_v3_v3v3(vecCross->vec, self->vec, value->vec);
- return (PyObject *)vecCross;
-}
-
-static char Vector_Dot_doc[] =
-".. method:: dot(other)\n"
-"\n"
-" Return the dot product of this vector and another.\n"
-"\n"
-" :arg other: The other vector to perform the dot product with.\n"
-" :type other: :class:`Vector`\n"
-" :return: The dot product.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Dot(VectorObject *self, VectorObject *value )
-{
- double dot = 0.0;
- int x;
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.dot(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.dot(value): expects both vectors to have the same size\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
- for(x = 0; x < self->size; x++) {
- dot += self->vec[x] * value->vec[x];
- }
- return PyFloat_FromDouble(dot);
-}
-
-static char Vector_angle_doc[] =
-".. function:: angle(other, fallback)\n"
-"\n"
-" Return the angle between two vectors.\n"
-"\n"
-" :arg other: another vector to compare the angle with\n"
-" :type other: :class:`Vector`\n"
-" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n"
-" :type fallback: any\n"
-" :return: angle in radians or fallback when given\n"
-" :rtype: float\n"
-"\n"
-" .. note:: Zero length vectors raise an :exc:`AttributeError`.\n";
-static PyObject *Vector_angle(VectorObject *self, PyObject *args)
-{
- VectorObject *value;
- double dot = 0.0f, angleRads, test_v1 = 0.0f, test_v2 = 0.0f;
- int x, size;
- PyObject *fallback= NULL;
-
- if(!PyArg_ParseTuple(args, "O!|O:angle", &vector_Type, &value, &fallback))
- return NULL;
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.angle(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.angle(value): expects both vectors to have the same size\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
- //since size is the same....
- size = self->size;
-
- for(x = 0; x < size; x++) {
- test_v1 += self->vec[x] * self->vec[x];
- test_v2 += value->vec[x] * value->vec[x];
- }
- if (!test_v1 || !test_v2){
- /* avoid exception */
- if(fallback) {
- Py_INCREF(fallback);
- return fallback;
- }
- else {
- PyErr_SetString(PyExc_ValueError, "vector.angle(other): zero length vectors have no valid angle\n");
- return NULL;
- }
- }
-
- //dot product
- for(x = 0; x < size; x++) {
- dot += self->vec[x] * value->vec[x];
- }
- dot /= (sqrt(test_v1) * sqrt(test_v2));
-
- angleRads = (double)saacos(dot);
-
- return PyFloat_FromDouble(angleRads);
-}
-
-static char Vector_Difference_doc[] =
-".. function:: difference(other)\n"
-"\n"
-" Returns a quaternion representing the rotational difference between this vector and another.\n"
-"\n"
-" :arg other: second vector.\n"
-" :type other: :class:`Vector`\n"
-" :return: the rotational difference between the two vectors.\n"
-" :rtype: :class:`Quaternion`\n"
-"\n"
-" .. note:: 2D vectors raise an :exc:`AttributeError`.\n";;
-
-static PyObject *Vector_Difference(VectorObject *self, VectorObject *value )
-{
- float quat[4], vec_a[3], vec_b[3];
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.difference(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size < 3 || value->size < 3) {
- PyErr_SetString(PyExc_AttributeError, "vec.difference(value): expects both vectors to be size 3 or 4\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
- normalize_v3_v3(vec_a, self->vec);
- normalize_v3_v3(vec_b, value->vec);
-
- rotation_between_vecs_to_quat(quat, vec_a, vec_b);
-
- return newQuaternionObject(quat, Py_NEW, NULL);
-}
-
-static char Vector_Project_doc[] =
-".. function:: project(other)\n"
-"\n"
-" Return the projection of this vector onto the *other*.\n"
-"\n"
-" :arg other: second vector.\n"
-" :type other: :class:`Vector`\n"
-" :return: the parallel projection vector\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Project(VectorObject *self, VectorObject *value)
-{
- float vec[4];
- double dot = 0.0f, dot2 = 0.0f;
- int x, size;
-
- if (!VectorObject_Check(value)) {
- PyErr_SetString( PyExc_TypeError, "vec.project(value): expected a vector argument" );
- return NULL;
- }
-
- if(self->size != value->size) {
- PyErr_SetString(PyExc_AttributeError, "vec.project(value): expects both vectors to have the same size\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(value))
- return NULL;
-
-
- //since they are the same size...
- size = self->size;
-
- //get dot products
- for(x = 0; x < size; x++) {
- dot += self->vec[x] * value->vec[x];
- dot2 += value->vec[x] * value->vec[x];
- }
- //projection
- dot /= dot2;
- for(x = 0; x < size; x++) {
- vec[x] = (float)(dot * value->vec[x]);
- }
- return newVectorObject(vec, size, Py_NEW, NULL);
-}
-
-static char Vector_Lerp_doc[] =
-".. function:: lerp(other, factor)\n"
-"\n"
-" Returns the interpolation of two vectors.\n"
-"\n"
-" :arg other: value to interpolate with.\n"
-" :type other: :class:`Vector`\n"
-" :arg factor: The interpolation value in [0.0, 1.0].\n"
-" :type factor: float\n"
-" :return: The interpolated rotation.\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Lerp(VectorObject *self, PyObject *args)
-{
- VectorObject *vec2 = NULL;
- float fac, ifac, vec[4];
- int x;
-
- if(!PyArg_ParseTuple(args, "O!f:lerp", &vector_Type, &vec2, &fac))
- return NULL;
-
- if(self->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "vector.lerp(): expects (2) vector objects of the same size");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- ifac= 1.0 - fac;
-
- for(x = 0; x < self->size; x++) {
- vec[x] = (ifac * self->vec[x]) + (fac * vec2->vec[x]);
- }
- return newVectorObject(vec, self->size, Py_NEW, NULL);
-}
-
-/*----------------------------Vector.copy() -------------------------------------- */
-static char Vector_copy_doc[] =
-".. function:: copy()\n"
-"\n"
-" Returns a copy of this vector.\n"
-"\n"
-" :return: A copy of the vector.\n"
-" :rtype: :class:`Vector`\n"
-"\n"
-" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n";
-
-static PyObject *Vector_copy(VectorObject *self)
-{
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- return newVectorObject(self->vec, self->size, Py_NEW, Py_TYPE(self));
-}
-
-/*----------------------------print object (internal)-------------
- print the object to screen */
-static PyObject *Vector_repr(VectorObject *self)
-{
- PyObject *ret, *tuple;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- tuple= Vector_ToTupleExt(self, -1);
- ret= PyUnicode_FromFormat("Vector(%R)", tuple);
- Py_DECREF(tuple);
- return ret;
-}
-
-/*---------------------SEQUENCE PROTOCOLS------------------------
- ----------------------------len(object)------------------------
- sequence length*/
-static int Vector_len(VectorObject *self)
-{
- return self->size;
-}
-/*----------------------------object[]---------------------------
- sequence accessor (get)*/
-static PyObject *Vector_item(VectorObject *self, int i)
-{
- if(i<0) i= self->size-i;
-
- if(i < 0 || i >= self->size) {
- PyErr_SetString(PyExc_IndexError,"vector[index]: out of range\n");
- return NULL;
- }
-
- if(!BaseMath_ReadIndexCallback(self, i))
- return NULL;
-
- return PyFloat_FromDouble(self->vec[i]);
-
-}
-/*----------------------------object[]-------------------------
- sequence accessor (set)*/
-static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
-{
- float scalar;
- if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number\n");
- return -1;
- }
-
- if(i<0) i= self->size-i;
-
- if(i < 0 || i >= self->size){
- PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range\n");
- return -1;
- }
- self->vec[i] = scalar;
-
- if(!BaseMath_WriteIndexCallback(self, i))
- return -1;
- return 0;
-}
-
-/*----------------------------object[z:y]------------------------
- sequence slice (get) */
-static PyObject *Vector_slice(VectorObject *self, int begin, int end)
-{
- PyObject *list = NULL;
- int count;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- CLAMP(begin, 0, self->size);
- if (end<0) end= self->size+end+1;
- CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
-
- list = PyList_New(end - begin);
- for(count = begin; count < end; count++) {
- PyList_SET_ITEM(list, count - begin, PyFloat_FromDouble(self->vec[count]));
- }
-
- return list;
-}
-/*----------------------------object[z:y]------------------------
- sequence slice (set) */
-static int Vector_ass_slice(VectorObject *self, int begin, int end,
- PyObject * seq)
-{
- int i, y, size = 0;
- float vec[4], scalar;
- PyObject *v;
-
- if(!BaseMath_ReadCallback(self))
- return -1;
-
- CLAMP(begin, 0, self->size);
- if (end<0) end= self->size+end+1;
- CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
-
- size = PySequence_Length(seq);
- if(size != (end - begin)){
- PyErr_SetString(PyExc_TypeError, "vector[begin:end] = []: size mismatch in slice assignment\n");
- return -1;
- }
-
- for (i = 0; i < size; i++) {
- v = PySequence_GetItem(seq, i);
- if (v == NULL) { /* Failed to read sequence */
- PyErr_SetString(PyExc_RuntimeError, "vector[begin:end] = []: unable to read sequence\n");
- return -1;
- }
-
- if((scalar=PyFloat_AsDouble(v)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- Py_DECREF(v);
- PyErr_SetString(PyExc_TypeError, "vector[begin:end] = []: sequence argument not a number\n");
- return -1;
- }
-
- vec[i] = scalar;
- Py_DECREF(v);
- }
- /*parsed well - now set in vector*/
- for(y = 0; y < size; y++){
- self->vec[begin + y] = vec[y];
- }
-
- if(!BaseMath_WriteCallback(self))
- return -1;
-
- return 0;
-}
-/*------------------------NUMERIC PROTOCOLS----------------------
- ------------------------obj + obj------------------------------
- addition*/
-static PyObject *Vector_add(PyObject * v1, PyObject * v2)
-{
- int i;
- float vec[4];
-
- VectorObject *vec1 = NULL, *vec2 = NULL;
-
- if VectorObject_Check(v1)
- vec1= (VectorObject *)v1;
-
- if VectorObject_Check(v2)
- vec2= (VectorObject *)v2;
-
- /* make sure v1 is always the vector */
- if (vec1 && vec2 ) {
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- /*VECTOR + VECTOR*/
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] + vec2->vec[i];
- }
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
- }
-
- PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation....\n");
- return NULL;
-}
-
-/* ------------------------obj += obj------------------------------
- addition in place */
-static PyObject *Vector_iadd(PyObject * v1, PyObject * v2)
-{
- int i;
- VectorObject *vec1 = NULL, *vec2 = NULL;
-
- if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: arguments not valid for this operation....\n");
- return NULL;
- }
- vec1 = (VectorObject*)v1;
- vec2 = (VectorObject*)v2;
-
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector addition: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- for(i = 0; i < vec1->size; i++) {
- vec1->vec[i] = vec1->vec[i] + vec2->vec[i];
- }
-
- BaseMath_WriteCallback(vec1);
- Py_INCREF( v1 );
- return v1;
-}
-
-/*------------------------obj - obj------------------------------
- subtraction*/
-static PyObject *Vector_sub(PyObject * v1, PyObject * v2)
-{
- int i;
- float vec[4];
- VectorObject *vec1 = NULL, *vec2 = NULL;
-
- if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation....\n");
- return NULL;
- }
- vec1 = (VectorObject*)v1;
- vec2 = (VectorObject*)v2;
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] - vec2->vec[i];
- }
-
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
-}
-
-/*------------------------obj -= obj------------------------------
- subtraction*/
-static PyObject *Vector_isub(PyObject * v1, PyObject * v2)
-{
- int i;
- VectorObject *vec1 = NULL, *vec2 = NULL;
-
- if (!VectorObject_Check(v1) || !VectorObject_Check(v2)) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: arguments not valid for this operation....\n");
- return NULL;
- }
- vec1 = (VectorObject*)v1;
- vec2 = (VectorObject*)v2;
-
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector subtraction: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
-
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
- return NULL;
-
- for(i = 0; i < vec1->size; i++) {
- vec1->vec[i] = vec1->vec[i] - vec2->vec[i];
- }
-
- BaseMath_WriteCallback(vec1);
- Py_INCREF( v1 );
- return v1;
-}
-
-/*------------------------obj * obj------------------------------
- mulplication*/
-static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
-{
- VectorObject *vec1 = NULL, *vec2 = NULL;
- float scalar;
-
- if VectorObject_Check(v1) {
- vec1= (VectorObject *)v1;
- if(!BaseMath_ReadCallback(vec1))
- return NULL;
- }
- if VectorObject_Check(v2) {
- vec2= (VectorObject *)v2;
- if(!BaseMath_ReadCallback(vec2))
- return NULL;
- }
-
-
- /* make sure v1 is always the vector */
- if (vec1 && vec2 ) {
- int i;
- double dot = 0.0f;
-
- if(vec1->size != vec2->size) {
- PyErr_SetString(PyExc_AttributeError, "Vector multiplication: vectors must have the same dimensions for this operation\n");
- return NULL;
- }
-
- /*dot product*/
- for(i = 0; i < vec1->size; i++) {
- dot += vec1->vec[i] * vec2->vec[i];
- }
- return PyFloat_FromDouble(dot);
- }
-
- /*swap so vec1 is always the vector */
- /* note: it would seem from this code that the matrix multiplication below
- * is communicative. however the matrix class will always handle the
- * (matrix * vector) case so we can ignore it here.
- * This is NOT so for Quaternions: TODO, check if communicative (vec * quat) is correct */
- if (vec2) {
- vec1= vec2;
- v2= v1;
- }
-
- if (MatrixObject_Check(v2)) {
- /* VEC * MATRIX */
- float tvec[4];
- if(row_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1)
- return NULL;
- return newVectorObject(tvec, vec1->size, Py_NEW, NULL);
- } else if (QuaternionObject_Check(v2)) {
- /* VEC * QUAT */
- QuaternionObject *quat2 = (QuaternionObject*)v2;
- float tvec[4];
-
- if(vec1->size != 3) {
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported\n");
- return NULL;
- }
- if(!BaseMath_ReadCallback(quat2)) {
- return NULL;
- }
- copy_v3_v3(tvec, vec1->vec);
- mul_qt_v3(quat2->quat, tvec);
- return newVectorObject(tvec, 3, Py_NEW, NULL);
- }
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
- int i;
- float vec[4];
-
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] * scalar;
- }
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
-
- }
-
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation\n");
- return NULL;
-}
-
-/*------------------------obj *= obj------------------------------
- in place mulplication */
-static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
-{
- VectorObject *vec = (VectorObject *)v1;
- int i;
- float scalar;
-
- if(!BaseMath_ReadCallback(vec))
- return NULL;
-
- /* only support vec*=float and vec*=mat
- vec*=vec result is a float so that wont work */
- if (MatrixObject_Check(v2)) {
- float tvec[4];
- if(row_vector_multiplication(tvec, vec, (MatrixObject*)v2) == -1)
- return NULL;
-
- i= vec->size - 1;
- do {
- vec->vec[i] = tvec[i];
- } while(i--);
- }
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*=FLOAT */
- i= vec->size - 1;
- do {
- vec->vec[i] *= scalar;
- } while(i--);
- }
- else {
- PyErr_SetString(PyExc_TypeError, "Vector multiplication: arguments not acceptable for this operation\n");
- return NULL;
- }
-
- BaseMath_WriteCallback(vec);
- Py_INCREF( v1 );
- return v1;
-}
-
-/*------------------------obj / obj------------------------------
- divide*/
-static PyObject *Vector_div(PyObject * v1, PyObject * v2)
-{
- int i;
- float vec[4], scalar;
- VectorObject *vec1 = NULL;
-
- if(!VectorObject_Check(v1)) { /* not a vector */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
- return NULL;
- }
- vec1 = (VectorObject*)v1; /* vector */
-
- if(!BaseMath_ReadCallback(vec1))
- return NULL;
-
- if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
- return NULL;
- }
-
- if(scalar==0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n");
- return NULL;
- }
-
- for(i = 0; i < vec1->size; i++) {
- vec[i] = vec1->vec[i] / scalar;
- }
- return newVectorObject(vec, vec1->size, Py_NEW, NULL);
-}
-
-/*------------------------obj /= obj------------------------------
- divide*/
-static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
-{
- int i;
- float scalar;
- VectorObject *vec1 = (VectorObject*)v1;
-
- if(!BaseMath_ReadCallback(vec1))
- return NULL;
-
- if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
- PyErr_SetString(PyExc_TypeError, "Vector division: Vector must be divided by a float\n");
- return NULL;
- }
-
- if(scalar==0.0) {
- PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error.\n");
- return NULL;
- }
- for(i = 0; i < vec1->size; i++) {
- vec1->vec[i] /= scalar;
- }
-
- BaseMath_WriteCallback(vec1);
-
- Py_INCREF( v1 );
- return v1;
-}
-
-/*-------------------------- -obj -------------------------------
- returns the negative of this object*/
-static PyObject *Vector_neg(VectorObject *self)
-{
- int i;
- float vec[4];
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- for(i = 0; i < self->size; i++){
- vec[i] = -self->vec[i];
- }
-
- return newVectorObject(vec, self->size, Py_NEW, Py_TYPE(self));
-}
-
-/*------------------------vec_magnitude_nosqrt (internal) - for comparing only */
-static double vec_magnitude_nosqrt(float *data, int size)
-{
- double dot = 0.0f;
- int i;
-
- for(i=0; i<size; i++){
- dot += data[i];
- }
- /*return (double)sqrt(dot);*/
- /* warning, line above removed because we are not using the length,
- rather the comparing the sizes and for this we do not need the sqrt
- for the actual length, the dot must be sqrt'd */
- return (double)dot;
-}
-
-
-/*------------------------tp_richcmpr
- returns -1 execption, 0 false, 1 true */
-static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
-{
- VectorObject *vecA = NULL, *vecB = NULL;
- int result = 0;
- float epsilon = .000001f;
- double lenA,lenB;
-
- if (!VectorObject_Check(objectA) || !VectorObject_Check(objectB)){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
- vecA = (VectorObject*)objectA;
- vecB = (VectorObject*)objectB;
-
- if(!BaseMath_ReadCallback(vecA) || !BaseMath_ReadCallback(vecB))
- return NULL;
-
- if (vecA->size != vecB->size){
- if (comparison_type == Py_NE){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
- }
-
- switch (comparison_type){
- case Py_LT:
- lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
- lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA < lenB ){
- result = 1;
- }
- break;
- case Py_LE:
- lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
- lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA < lenB ){
- result = 1;
- }else{
- result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
- }
- break;
- case Py_EQ:
- result = EXPP_VectorsAreEqual(vecA->vec, vecB->vec, vecA->size, 1);
- break;
- case Py_NE:
- result = !EXPP_VectorsAreEqual(vecA->vec, vecB->vec, vecA->size, 1);
- break;
- case Py_GT:
- lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
- lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA > lenB ){
- result = 1;
- }
- break;
- case Py_GE:
- lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
- lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA > lenB ){
- result = 1;
- }else{
- result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
- }
- break;
- default:
- printf("The result of the comparison could not be evaluated");
- break;
- }
- if (result == 1){
- Py_RETURN_TRUE;
- }else{
- Py_RETURN_FALSE;
- }
-}
-
-/*-----------------PROTCOL DECLARATIONS--------------------------*/
-static PySequenceMethods Vector_SeqMethods = {
- (lenfunc) Vector_len, /* sq_length */
- (binaryfunc) 0, /* sq_concat */
- (ssizeargfunc) 0, /* sq_repeat */
- (ssizeargfunc) Vector_item, /* sq_item */
- NULL, /* py3 deprecated slice func */
- (ssizeobjargproc) Vector_ass_item, /* sq_ass_item */
- NULL, /* py3 deprecated slice assign func */
- (objobjproc) NULL, /* sq_contains */
- (binaryfunc) NULL, /* sq_inplace_concat */
- (ssizeargfunc) NULL, /* sq_inplace_repeat */
-};
-
-static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
-{
- if (PyIndex_Check(item)) {
- Py_ssize_t i;
- i = PyNumber_AsSsize_t(item, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
- return NULL;
- if (i < 0)
- i += self->size;
- return Vector_item(self, i);
- } else if (PySlice_Check(item)) {
- Py_ssize_t start, stop, step, slicelength;
-
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
- return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
- }
- else if (step == 1) {
- return Vector_slice(self, start, stop);
- }
- else {
- PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
- return NULL;
- }
- }
- else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
- return NULL;
- }
-}
-
-static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* value)
-{
- if (PyIndex_Check(item)) {
- Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
- return -1;
- if (i < 0)
- i += self->size;
- return Vector_ass_item(self, i, value);
- }
- else if (PySlice_Check(item)) {
- Py_ssize_t start, stop, step, slicelength;
-
- if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
- return -1;
-
- if (step == 1)
- return Vector_ass_slice(self, start, stop, value);
- else {
- PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
- return -1;
- }
- }
- else {
- PyErr_Format(PyExc_TypeError,
- "vector indices must be integers, not %.200s",
- item->ob_type->tp_name);
- return -1;
- }
-}
-
-static PyMappingMethods Vector_AsMapping = {
- (lenfunc)Vector_len,
- (binaryfunc)Vector_subscript,
- (objobjargproc)Vector_ass_subscript
-};
-
-
-static PyNumberMethods Vector_NumMethods = {
- (binaryfunc) Vector_add, /*nb_add*/
- (binaryfunc) Vector_sub, /*nb_subtract*/
- (binaryfunc) Vector_mul, /*nb_multiply*/
- 0, /*nb_remainder*/
- 0, /*nb_divmod*/
- 0, /*nb_power*/
- (unaryfunc) Vector_neg, /*nb_negative*/
- (unaryfunc) 0, /*tp_positive*/
- (unaryfunc) 0, /*tp_absolute*/
- (inquiry) 0, /*tp_bool*/
- (unaryfunc) 0, /*nb_invert*/
- 0, /*nb_lshift*/
- (binaryfunc)0, /*nb_rshift*/
- 0, /*nb_and*/
- 0, /*nb_xor*/
- 0, /*nb_or*/
- 0, /*nb_int*/
- 0, /*nb_reserved*/
- 0, /*nb_float*/
- Vector_iadd, /* nb_inplace_add */
- Vector_isub, /* nb_inplace_subtract */
- Vector_imul, /* nb_inplace_multiply */
- 0, /* nb_inplace_remainder */
- 0, /* nb_inplace_power */
- 0, /* nb_inplace_lshift */
- 0, /* nb_inplace_rshift */
- 0, /* nb_inplace_and */
- 0, /* nb_inplace_xor */
- 0, /* nb_inplace_or */
- 0, /* nb_floor_divide */
- Vector_div, /* nb_true_divide */
- 0, /* nb_inplace_floor_divide */
- Vector_idiv, /* nb_inplace_true_divide */
- 0, /* nb_index */
-};
-
-/*------------------PY_OBECT DEFINITION--------------------------*/
-
-/*
- * vector axis, vector.x/y/z/w
- */
-
-static PyObject *Vector_getAxis(VectorObject *self, void *type )
-{
- return Vector_item(self, GET_INT_FROM_POINTER(type));
-}
-
-static int Vector_setAxis(VectorObject *self, PyObject * value, void * type )
-{
- return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value);
-}
-
-/* vector.length */
-static PyObject *Vector_getLength(VectorObject *self, void *type )
-{
- double dot = 0.0f;
- int i;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- for(i = 0; i < self->size; i++){
- dot += (self->vec[i] * self->vec[i]);
- }
- return PyFloat_FromDouble(sqrt(dot));
-}
-
-static int Vector_setLength(VectorObject *self, PyObject * value )
-{
- double dot = 0.0f, param;
- int i;
-
- if(!BaseMath_ReadCallback(self))
- return -1;
-
- if((param=PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError, "length must be set to a number");
- return -1;
- }
-
- if (param < 0.0f) {
- PyErr_SetString( PyExc_TypeError, "cannot set a vectors length to a negative value" );
- return -1;
- }
- if (param == 0.0f) {
- for(i = 0; i < self->size; i++){
- self->vec[i]= 0;
- }
- return 0;
- }
-
- for(i = 0; i < self->size; i++){
- dot += (self->vec[i] * self->vec[i]);
- }
-
- if (!dot) /* cant sqrt zero */
- return 0;
-
- dot = sqrt(dot);
-
- if (dot==param)
- return 0;
-
- dot= dot/param;
-
- for(i = 0; i < self->size; i++){
- self->vec[i]= self->vec[i] / (float)dot;
- }
-
- BaseMath_WriteCallback(self); /* checked already */
-
- return 0;
-}
-
-/* Get a new Vector according to the provided swizzle. This function has little
- error checking, as we are in control of the inputs: the closure is set by us
- in Vector_createSwizzleGetSeter. */
-static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
-{
- size_t axis_to;
- size_t axis_from;
- float vec[MAX_DIMENSIONS];
- unsigned int swizzleClosure;
-
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- /* Unpack the axes from the closure into an array. */
- axis_to = 0;
- swizzleClosure = GET_INT_FROM_POINTER(closure);
- while (swizzleClosure & SWIZZLE_VALID_AXIS)
- {
- axis_from = swizzleClosure & SWIZZLE_AXIS;
- if(axis_from >= self->size) {
- PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis.");
- return NULL;
- }
-
- vec[axis_to] = self->vec[axis_from];
- swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
- axis_to++;
- }
-
- return newVectorObject(vec, axis_to, Py_NEW, Py_TYPE(self));
-}
-
-/* Set the items of this vector using a swizzle.
- - If value is a vector or list this operates like an array copy, except that
- the destination is effectively re-ordered as defined by the swizzle. At
- most min(len(source), len(dest)) values will be copied.
- - If the value is scalar, it is copied to all axes listed in the swizzle.
- - If an axis appears more than once in the swizzle, the final occurrence is
- the one that determines its value.
-
- Returns 0 on success and -1 on failure. On failure, the vector will be
- unchanged. */
-static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure)
-{
- size_t size_from;
- float scalarVal;
-
- size_t axis_from;
- size_t axis_to;
-
- unsigned int swizzleClosure;
-
- float tvec[MAX_DIMENSIONS];
- float vec_assign[MAX_DIMENSIONS];
-
- if(!BaseMath_ReadCallback(self))
- return -1;
-
- /* Check that the closure can be used with this vector: even 2D vectors have
- swizzles defined for axes z and w, but they would be invalid. */
- swizzleClosure = GET_INT_FROM_POINTER(closure);
- axis_from= 0;
- while (swizzleClosure & SWIZZLE_VALID_AXIS)
- {
- axis_to = swizzleClosure & SWIZZLE_AXIS;
- if (axis_to >= self->size)
- {
- PyErr_SetString(PyExc_AttributeError, "Error: vector does not have specified axis.\n");
- return -1;
- }
- swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
- axis_from++;
- }
-
- if (((scalarVal=PyFloat_AsDouble(value)) == -1 && PyErr_Occurred())==0) {
- int i;
- for(i=0; i < MAX_DIMENSIONS; i++)
- vec_assign[i]= scalarVal;
-
- size_from= axis_from;
- }
- else if((size_from=mathutils_array_parse(vec_assign, 2, 4, value, "mathutils.Vector.**** = swizzle assignment")) == -1) {
- return -1;
- }
-
- if(axis_from != size_from) {
- PyErr_SetString(PyExc_AttributeError, "Error: vector size does not match swizzle.\n");
- return -1;
- }
-
- /* Copy vector contents onto swizzled axes. */
- axis_from = 0;
- swizzleClosure = GET_INT_FROM_POINTER(closure);
- while (swizzleClosure & SWIZZLE_VALID_AXIS)
- {
- axis_to = swizzleClosure & SWIZZLE_AXIS;
- tvec[axis_to] = vec_assign[axis_from];
- swizzleClosure = swizzleClosure >> SWIZZLE_BITS_PER_AXIS;
- axis_from++;
- }
-
- memcpy(self->vec, tvec, axis_from * sizeof(float));
- /* continue with BaseMathObject_WriteCallback at the end */
-
- if(!BaseMath_WriteCallback(self))
- return -1;
- else
- return 0;
-}
-
-/*****************************************************************************/
-/* Python attributes get/set structure: */
-/*****************************************************************************/
-static PyGetSetDef Vector_getseters[] = {
- {"x", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector X axis.\n\n:type: float", (void *)0},
- {"y", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Y axis.\n\n:type: float", (void *)1},
- {"z", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector Z axis (3D Vectors only).\n\n:type: float", (void *)2},
- {"w", (getter)Vector_getAxis, (setter)Vector_setAxis, "Vector W axis (4D Vectors only).\n\n:type: float", (void *)3},
- {"length", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
- {"magnitude", (getter)Vector_getLength, (setter)Vector_setLength, "Vector Length.\n\n:type: float", NULL},
- {"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
- {"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
-
- /* autogenerated swizzle attrs, see python script below */
- {"xx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 36
- {"xxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 292
- {"xxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2340
- {"xxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2852
- {"xxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3364
- {"xxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3876
- {"xxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 356
- {"xxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2404
- {"xxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2916
- {"xxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3428
- {"xxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3940
- {"xxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 420
- {"xxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2468
- {"xxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2980
- {"xxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3492
- {"xxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4004
- {"xxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 484
- {"xxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2532
- {"xxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3044
- {"xxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3556
- {"xxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4068
- {"xy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 44
- {"xyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 300
- {"xyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2348
- {"xyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2860
- {"xyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3372
- {"xyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3884
- {"xyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 364
- {"xyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2412
- {"xyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2924
- {"xyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3436
- {"xyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3948
- {"xyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 428
- {"xyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2476
- {"xyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2988
- {"xyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3500
- {"xyzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4012
- {"xyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 492
- {"xywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2540
- {"xywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3052
- {"xywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3564
- {"xyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4076
- {"xz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 52
- {"xzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 308
- {"xzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2356
- {"xzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2868
- {"xzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3380
- {"xzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3892
- {"xzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 372
- {"xzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2420
- {"xzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2932
- {"xzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3444
- {"xzyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3956
- {"xzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 436
- {"xzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2484
- {"xzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2996
- {"xzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3508
- {"xzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4020
- {"xzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 500
- {"xzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2548
- {"xzwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3060
- {"xzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3572
- {"xzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4084
- {"xw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 60
- {"xwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 316
- {"xwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2364
- {"xwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2876
- {"xwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3388
- {"xwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3900
- {"xwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 380
- {"xwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2428
- {"xwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2940
- {"xwyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3452
- {"xwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3964
- {"xwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 444
- {"xwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2492
- {"xwzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3004
- {"xwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3516
- {"xwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4028
- {"xww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 508
- {"xwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2556
- {"xwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3068
- {"xwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3580
- {"xwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((0|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4092
- {"yx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 37
- {"yxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 293
- {"yxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2341
- {"yxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2853
- {"yxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3365
- {"yxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3877
- {"yxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 357
- {"yxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2405
- {"yxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2917
- {"yxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3429
- {"yxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3941
- {"yxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 421
- {"yxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2469
- {"yxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2981
- {"yxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3493
- {"yxzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4005
- {"yxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 485
- {"yxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2533
- {"yxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3045
- {"yxwz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3557
- {"yxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4069
- {"yy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 45
- {"yyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 301
- {"yyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2349
- {"yyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2861
- {"yyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3373
- {"yyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3885
- {"yyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 365
- {"yyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2413
- {"yyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2925
- {"yyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3437
- {"yyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3949
- {"yyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 429
- {"yyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2477
- {"yyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2989
- {"yyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3501
- {"yyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4013
- {"yyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 493
- {"yywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2541
- {"yywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3053
- {"yywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3565
- {"yyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4077
- {"yz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 53
- {"yzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 309
- {"yzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2357
- {"yzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2869
- {"yzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3381
- {"yzxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3893
- {"yzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 373
- {"yzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2421
- {"yzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2933
- {"yzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3445
- {"yzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3957
- {"yzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 437
- {"yzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2485
- {"yzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2997
- {"yzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3509
- {"yzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4021
- {"yzw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 501
- {"yzwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2549
- {"yzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3061
- {"yzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3573
- {"yzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4085
- {"yw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 61
- {"ywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 317
- {"ywxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2365
- {"ywxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2877
- {"ywxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3389
- {"ywxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3901
- {"ywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 381
- {"ywyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2429
- {"ywyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2941
- {"ywyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3453
- {"ywyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3965
- {"ywz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 445
- {"ywzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2493
- {"ywzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3005
- {"ywzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3517
- {"ywzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4029
- {"yww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 509
- {"ywwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2557
- {"ywwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3069
- {"ywwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3581
- {"ywww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((1|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4093
- {"zx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 38
- {"zxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 294
- {"zxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2342
- {"zxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2854
- {"zxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3366
- {"zxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3878
- {"zxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 358
- {"zxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2406
- {"zxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2918
- {"zxyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3430
- {"zxyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3942
- {"zxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 422
- {"zxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2470
- {"zxzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2982
- {"zxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3494
- {"zxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4006
- {"zxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 486
- {"zxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2534
- {"zxwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3046
- {"zxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3558
- {"zxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4070
- {"zy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 46
- {"zyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 302
- {"zyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2350
- {"zyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2862
- {"zyxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3374
- {"zyxw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3886
- {"zyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 366
- {"zyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2414
- {"zyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2926
- {"zyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3438
- {"zyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3950
- {"zyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 430
- {"zyzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2478
- {"zyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2990
- {"zyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3502
- {"zyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4014
- {"zyw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 494
- {"zywx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2542
- {"zywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3054
- {"zywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3566
- {"zyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4078
- {"zz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 54
- {"zzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 310
- {"zzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2358
- {"zzxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2870
- {"zzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3382
- {"zzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3894
- {"zzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 374
- {"zzyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2422
- {"zzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2934
- {"zzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3446
- {"zzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3958
- {"zzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 438
- {"zzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2486
- {"zzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2998
- {"zzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3510
- {"zzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4022
- {"zzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 502
- {"zzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2550
- {"zzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3062
- {"zzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3574
- {"zzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4086
- {"zw", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 62
- {"zwx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 318
- {"zwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2366
- {"zwxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2878
- {"zwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3390
- {"zwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3902
- {"zwy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 382
- {"zwyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2430
- {"zwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2942
- {"zwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3454
- {"zwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3966
- {"zwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 446
- {"zwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2494
- {"zwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3006
- {"zwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3518
- {"zwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4030
- {"zww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 510
- {"zwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2558
- {"zwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3070
- {"zwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3582
- {"zwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((2|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4094
- {"wx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 39
- {"wxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 295
- {"wxxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2343
- {"wxxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2855
- {"wxxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3367
- {"wxxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3879
- {"wxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 359
- {"wxyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2407
- {"wxyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2919
- {"wxyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3431
- {"wxyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3943
- {"wxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 423
- {"wxzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2471
- {"wxzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2983
- {"wxzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3495
- {"wxzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4007
- {"wxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 487
- {"wxwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2535
- {"wxwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3047
- {"wxwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3559
- {"wxww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4071
- {"wy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 47
- {"wyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 303
- {"wyxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2351
- {"wyxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2863
- {"wyxz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3375
- {"wyxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3887
- {"wyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 367
- {"wyyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2415
- {"wyyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2927
- {"wyyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3439
- {"wyyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3951
- {"wyz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 431
- {"wyzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2479
- {"wyzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2991
- {"wyzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3503
- {"wyzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4015
- {"wyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 495
- {"wywx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2543
- {"wywy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3055
- {"wywz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3567
- {"wyww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4079
- {"wz", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 55
- {"wzx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 311
- {"wzxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2359
- {"wzxy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2871
- {"wzxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3383
- {"wzxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3895
- {"wzy", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 375
- {"wzyx", (getter)Vector_getSwizzle, (setter)Vector_setSwizzle, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2423
- {"wzyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2935
- {"wzyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3447
- {"wzyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3959
- {"wzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 439
- {"wzzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2487
- {"wzzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2999
- {"wzzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3511
- {"wzzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4023
- {"wzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 503
- {"wzwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2551
- {"wzwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3063
- {"wzwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3575
- {"wzww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4087
- {"ww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS)))}, // 63
- {"wwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 319
- {"wwxx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2367
- {"wwxy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2879
- {"wwxz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3391
- {"wwxw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3903
- {"wwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 383
- {"wwyx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2431
- {"wwyy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2943
- {"wwyz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3455
- {"wwyw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3967
- {"wwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 447
- {"wwzx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2495
- {"wwzy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3007
- {"wwzz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3519
- {"wwzw", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4031
- {"www", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2))))}, // 511
- {"wwwx", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((0|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 2559
- {"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
- {"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
- {"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
-};
-
-/* Python script used to make swizzle array */
-/*
-SWIZZLE_BITS_PER_AXIS = 3
-SWIZZLE_VALID_AXIS = 0x4
-
-axis_dict = {}
-axis_pos = {'x':0, 'y':1, 'z':2, 'w':3}
-axises = 'xyzw'
-while len(axises) >= 2:
-
- for axis_0 in axises:
- axis_0_pos = axis_pos[axis_0]
- for axis_1 in axises:
- axis_1_pos = axis_pos[axis_1]
- axis_dict[axis_0+axis_1] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS))' % (axis_0_pos, axis_1_pos)
- if len(axises)>2:
- for axis_2 in axises:
- axis_2_pos = axis_pos[axis_2]
- axis_dict[axis_0+axis_1+axis_2] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)))' % (axis_0_pos, axis_1_pos, axis_2_pos)
- if len(axises)>3:
- for axis_3 in axises:
- axis_3_pos = axis_pos[axis_3]
- axis_dict[axis_0+axis_1+axis_2+axis_3] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) ' % (axis_0_pos, axis_1_pos, axis_2_pos, axis_3_pos)
-
- axises = axises[:-1]
-
-
-items = axis_dict.items()
-items.sort(key = lambda a: a[0].replace('x', '0').replace('y', '1').replace('z', '2').replace('w', '3'))
-
-unique = set()
-for key, val in items:
- num = eval(val)
- set_str = 'Vector_setSwizzle' if (len(set(key)) == len(key)) else 'NULL'
- print '\t{"%s", %s(getter)Vector_getSwizzle, (setter)%s, NULL, SET_INT_IN_POINTER(%s)}, // %s' % (key, (' '*(4-len(key))), set_str, axis_dict[key], num)
- unique.add(num)
-
-if len(unique) != len(items):
- print "ERROR"
-*/
-
-//-----------------row_vector_multiplication (internal)-----------
-//ROW VECTOR Multiplication - Vector X Matrix
-//[x][y][z] * [1][4][7]
-// [2][5][8]
-// [3][6][9]
-//vector/matrix multiplication IS NOT COMMUTATIVE!!!!
-static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObject * mat)
-{
- float vecCopy[4];
- double dot = 0.0f;
- int x, y, z = 0, vec_size = vec->size;
-
- if(mat->colSize != vec_size){
- if(mat->colSize == 4 && vec_size != 3){
- PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
- return -1;
- }else{
- vecCopy[3] = 1.0f;
- }
- }
-
- if(!BaseMath_ReadCallback(vec) || !BaseMath_ReadCallback(mat))
- return -1;
-
- for(x = 0; x < vec_size; x++){
- vecCopy[x] = vec->vec[x];
- }
- rvec[3] = 1.0f;
- //muliplication
- for(x = 0; x < mat->rowSize; x++) {
- for(y = 0; y < mat->colSize; y++) {
- dot += mat->matrix[x][y] * vecCopy[y];
- }
- rvec[z++] = (float)dot;
- dot = 0.0f;
- }
- return 0;
-}
-
-/*----------------------------Vector.negate() -------------------- */
-static char Vector_Negate_doc[] =
-".. method:: negate()\n"
-"\n"
-" Set all values to their negative.\n"
-"\n"
-" :return: an instance of itself\n"
-" :rtype: :class:`Vector`\n";
-
-static PyObject *Vector_Negate(VectorObject *self)
-{
- int i;
- if(!BaseMath_ReadCallback(self))
- return NULL;
-
- for(i = 0; i < self->size; i++)
- self->vec[i] = -(self->vec[i]);
-
- BaseMath_WriteCallback(self); // already checked for error
-
- Py_INCREF(self);
- return (PyObject*)self;
-}
-
-static struct PyMethodDef Vector_methods[] = {
- {"zero", (PyCFunction) Vector_Zero, METH_NOARGS, Vector_Zero_doc},
- {"normalize", (PyCFunction) Vector_Normalize, METH_NOARGS, Vector_Normalize_doc},
- {"negate", (PyCFunction) Vector_Negate, METH_NOARGS, Vector_Negate_doc},
- {"resize2D", (PyCFunction) Vector_Resize2D, METH_NOARGS, Vector_Resize2D_doc},
- {"resize3D", (PyCFunction) Vector_Resize3D, METH_NOARGS, Vector_Resize3D_doc},
- {"resize4D", (PyCFunction) Vector_Resize4D, METH_NOARGS, Vector_Resize4D_doc},
- {"to_tuple", (PyCFunction) Vector_ToTuple, METH_VARARGS, Vector_ToTuple_doc},
- {"to_track_quat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, Vector_ToTrackQuat_doc},
- {"reflect", ( PyCFunction ) Vector_Reflect, METH_O, Vector_Reflect_doc},
- {"cross", ( PyCFunction ) Vector_Cross, METH_O, Vector_Cross_doc},
- {"dot", ( PyCFunction ) Vector_Dot, METH_O, Vector_Dot_doc},
- {"angle", ( PyCFunction ) Vector_angle, METH_VARARGS, Vector_angle_doc},
- {"difference", ( PyCFunction ) Vector_Difference, METH_O, Vector_Difference_doc},
- {"project", ( PyCFunction ) Vector_Project, METH_O, Vector_Project_doc},
- {"lerp", ( PyCFunction ) Vector_Lerp, METH_VARARGS, Vector_Lerp_doc},
- {"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
- {"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, NULL},
- {NULL, NULL, 0, NULL}
-};
-
-
-/* Note
- Py_TPFLAGS_CHECKTYPES allows us to avoid casting all types to Vector when coercing
- but this means for eg that
- vec*mat and mat*vec both get sent to Vector_mul and it neesd to sort out the order
-*/
-
-static char vector_doc[] =
-"This object gives access to Vectors in Blender.";
-
-PyTypeObject vector_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- /* For printing, in format "<module>.<name>" */
- "vector", /* char *tp_name; */
- sizeof(VectorObject), /* int tp_basicsize; */
- 0, /* tp_itemsize; For allocation */
-
- /* Methods to implement standard operations */
-
- ( destructor ) BaseMathObject_dealloc,/* destructor tp_dealloc; */
- NULL, /* printfunc tp_print; */
- NULL, /* getattrfunc tp_getattr; */
- NULL, /* setattrfunc tp_setattr; */
- NULL, /* cmpfunc tp_compare; */
- ( reprfunc ) Vector_repr, /* reprfunc tp_repr; */
-
- /* Method suites for standard classes */
-
- &Vector_NumMethods, /* PyNumberMethods *tp_as_number; */
- &Vector_SeqMethods, /* PySequenceMethods *tp_as_sequence; */
- &Vector_AsMapping, /* PyMappingMethods *tp_as_mapping; */
-
- /* More standard operations (here for binary compatibility) */
-
- NULL, /* hashfunc tp_hash; */
- NULL, /* ternaryfunc tp_call; */
- NULL, /* reprfunc tp_str; */
- NULL, /* getattrofunc tp_getattro; */
- NULL, /* setattrofunc tp_setattro; */
-
- /* Functions to access object as input/output buffer */
- NULL, /* PyBufferProcs *tp_as_buffer; */
-
- /*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- vector_doc, /* char *tp_doc; Documentation string */
- /*** Assigned meaning in release 2.0 ***/
- /* call function for all accessible objects */
- NULL, /* traverseproc tp_traverse; */
-
- /* delete references to contained objects */
- NULL, /* inquiry tp_clear; */
-
- /*** Assigned meaning in release 2.1 ***/
- /*** rich comparisons ***/
- (richcmpfunc)Vector_richcmpr, /* richcmpfunc tp_richcompare; */
-
- /*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
-
- /*** Added in release 2.2 ***/
- /* Iterators */
- NULL, /* getiterfunc tp_iter; */
- NULL, /* iternextfunc tp_iternext; */
-
- /*** Attribute descriptor and subclassing stuff ***/
- Vector_methods, /* struct PyMethodDef *tp_methods; */
- NULL, /* struct PyMemberDef *tp_members; */
- Vector_getseters, /* struct PyGetSetDef *tp_getset; */
- NULL, /* struct _typeobject *tp_base; */
- NULL, /* PyObject *tp_dict; */
- NULL, /* descrgetfunc tp_descr_get; */
- NULL, /* descrsetfunc tp_descr_set; */
- 0, /* long tp_dictoffset; */
- NULL, /* initproc tp_init; */
- NULL, /* allocfunc tp_alloc; */
- Vector_new, /* newfunc tp_new; */
- /* Low-level free-memory routine */
- NULL, /* freefunc tp_free; */
- /* For PyObject_IS_GC */
- NULL, /* inquiry tp_is_gc; */
- NULL, /* PyObject *tp_bases; */
- /* method resolution order */
- NULL, /* PyObject *tp_mro; */
- NULL, /* PyObject *tp_cache; */
- NULL, /* PyObject *tp_subclasses; */
- NULL, /* PyObject *tp_weaklist; */
- NULL
-};
-
-/*------------------------newVectorObject (internal)-------------
- creates a new vector object
- pass Py_WRAP - if vector is a WRAPPER for data allocated by BLENDER
- (i.e. it was allocated elsewhere by MEM_mallocN())
- pass Py_NEW - if vector is not a WRAPPER and managed by PYTHON
- (i.e. it must be created here with PyMEM_malloc())*/
-PyObject *newVectorObject(float *vec, int size, int type, PyTypeObject *base_type)
-{
- int i;
- VectorObject *self;
-
- if(size > 4 || size < 2)
- return NULL;
-
- if(base_type) self = (VectorObject *)base_type->tp_alloc(base_type, 0);
- else self = PyObject_NEW(VectorObject, &vector_Type);
-
- self->size = size;
-
- /* init callbacks as NULL */
- self->cb_user= NULL;
- self->cb_type= self->cb_subtype= 0;
-
- if(type == Py_WRAP) {
- self->vec = vec;
- self->wrapped = Py_WRAP;
- } else if (type == Py_NEW) {
- self->vec = PyMem_Malloc(size * sizeof(float));
- if(!vec) { /*new empty*/
- for(i = 0; i < size; i++){
- self->vec[i] = 0.0f;
- }
- if(size == 4) /* do the homogenous thing */
- self->vec[3] = 1.0f;
- }else{
- for(i = 0; i < size; i++){
- self->vec[i] = vec[i];
- }
- }
- self->wrapped = Py_NEW;
- }else{ /*bad type*/
- return NULL;
- }
- return (PyObject *) self;
-}
-
-PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_subtype)
-{
- float dummy[4] = {0.0, 0.0, 0.0, 0.0}; /* dummy init vector, callbacks will be used on access */
- VectorObject *self= (VectorObject *)newVectorObject(dummy, size, Py_NEW, NULL);
- if(self) {
- Py_INCREF(cb_user);
- self->cb_user= cb_user;
- self->cb_type= (unsigned char)cb_type;
- self->cb_subtype= (unsigned char)cb_subtype;
- }
-
- return (PyObject *)self;
-}
diff --git a/source/blender/python/generic/noise.c b/source/blender/python/generic/noise_py_api.c
index ccdb8f6fa4a..f4c662f3170 100755..100644
--- a/source/blender/python/generic/noise.c
+++ b/source/blender/python/generic/noise_py_api.c
@@ -1,5 +1,5 @@
-/**
- * $Id: noise.c 31332 2010-08-14 05:33:20Z campbellbarton $
+/*
+ * $Id$
*
* Blender.Noise BPython module implementation.
* This submodule has functions to generate noise of various types.
@@ -35,10 +35,16 @@
/************************/
#include <Python.h>
+
#include "structseq.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
#include "DNA_texture_types.h"
+
+#include "noise_py_api.h"
+
/*-----------------------------------------*/
/* 'mersenne twister' random number generator */
@@ -120,8 +126,6 @@ static int left = 1;
static int initf = 0;
static unsigned long *next;
-PyObject *Noise_Init(void);
-
/* initializes state[N] with a seed */
static void init_genrand(unsigned long s)
{
@@ -174,7 +178,7 @@ static void setRndSeed(int seed)
}
/* float number in range [0, 1) using the mersenne twister rng */
-static float frand()
+static float frand(void)
{
unsigned long y;
@@ -207,12 +211,12 @@ static void randuvec(float v[3])
v[2] = 1.f;
}
-static PyObject *Noise_random(PyObject * self)
+static PyObject *Noise_random(PyObject *UNUSED(self))
{
return PyFloat_FromDouble(frand());
}
-static PyObject *Noise_random_unit_vector(PyObject * self)
+static PyObject *Noise_random_unit_vector(PyObject *UNUSED(self))
{
float v[3] = {0.0f, 0.0f, 0.0f};
randuvec(v);
@@ -223,7 +227,7 @@ static PyObject *Noise_random_unit_vector(PyObject * self)
/* Random seed init. Only used for MT random() & randuvec() */
-static PyObject *Noise_seed_set(PyObject * self, PyObject * args)
+static PyObject *Noise_seed_set(PyObject *UNUSED(self), PyObject *args)
{
int s;
if(!PyArg_ParseTuple(args, "i:seed_set", &s))
@@ -236,7 +240,7 @@ static PyObject *Noise_seed_set(PyObject * self, PyObject * args)
/* General noise */
-static PyObject *Noise_noise(PyObject * self, PyObject * args)
+static PyObject *Noise_noise(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
int nb = 1;
@@ -260,7 +264,7 @@ static void noise_vector(float x, float y, float z, int nb, float v[3])
nb) - 1.0);
}
-static PyObject *Noise_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, v[3];
int nb = 1;
@@ -296,7 +300,7 @@ static float turb(float x, float y, float z, int oct, int hard, int nb,
return out;
}
-static PyObject *Noise_turbulence(PyObject * self, PyObject * args)
+static PyObject *Noise_turbulence(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
int oct, hd, nb = 1;
@@ -340,7 +344,7 @@ static void vTurb(float x, float y, float z, int oct, int hard, int nb,
}
}
-static PyObject *Noise_turbulence_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_turbulence_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, v[3];
int oct, hd, nb = 1;
@@ -355,7 +359,7 @@ static PyObject *Noise_turbulence_vector(PyObject * self, PyObject * args)
/* F. Kenton Musgrave's fractal functions */
-static PyObject *Noise_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct;
int nb = 1;
@@ -366,7 +370,7 @@ static PyObject *Noise_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct;
int nb = 1;
@@ -378,7 +382,7 @@ static PyObject *Noise_multi_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_vl_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_vl_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, d;
int nt1 = 1, nt2 = 1;
@@ -389,7 +393,7 @@ static PyObject *Noise_vl_vector(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_hetero_terrain(PyObject * self, PyObject * args)
+static PyObject *Noise_hetero_terrain(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs;
int nb = 1;
@@ -401,7 +405,7 @@ static PyObject *Noise_hetero_terrain(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_hybrid_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_hybrid_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs, gn;
int nb = 1;
@@ -413,7 +417,7 @@ static PyObject *Noise_hybrid_multi_fractal(PyObject * self, PyObject * args)
/*------------------------------------------------------------------------*/
-static PyObject *Noise_ridged_multi_fractal(PyObject * self, PyObject * args)
+static PyObject *Noise_ridged_multi_fractal(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, H, lac, oct, ofs, gn;
int nb = 1;
@@ -424,7 +428,7 @@ static PyObject *Noise_ridged_multi_fractal(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_voronoi(PyObject * self, PyObject * args)
+static PyObject *Noise_voronoi(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, da[4], pa[12];
int dtype = 0;
@@ -441,7 +445,7 @@ static PyObject *Noise_voronoi(PyObject * self, PyObject * args)
/*-------------------------------------------------------------------------*/
-static PyObject *Noise_cell(PyObject * self, PyObject * args)
+static PyObject *Noise_cell(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z;
if(!PyArg_ParseTuple(args, "(fff):cell", &x, &y, &z))
@@ -452,7 +456,7 @@ static PyObject *Noise_cell(PyObject * self, PyObject * args)
/*--------------------------------------------------------------------------*/
-static PyObject *Noise_cell_vector(PyObject * self, PyObject * args)
+static PyObject *Noise_cell_vector(PyObject *UNUSED(self), PyObject *args)
{
float x, y, z, ca[3];
if(!PyArg_ParseTuple(args, "(fff):cell_vector", &x, &y, &z))
@@ -603,22 +607,22 @@ look like anything from an earthquake to a very nervous or maybe even drunk came
/* Just in case, declarations for a header file */
/*
-static PyObject *Noise_random(PyObject *self);
-static PyObject *Noise_random_unit_vector(PyObject *self);
-static PyObject *Noise_seed_set(PyObject *self, PyObject *args);
-static PyObject *Noise_noise(PyObject *self, PyObject *args);
-static PyObject *Noise_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_turbulence(PyObject *self, PyObject *args);
-static PyObject *Noise_turbulence_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_vl_vector(PyObject *self, PyObject *args);
-static PyObject *Noise_hetero_terrain(PyObject *self, PyObject *args);
-static PyObject *Noise_hybrid_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_ridged_multi_fractal(PyObject *self, PyObject *args);
-static PyObject *Noise_voronoi(PyObject *self, PyObject *args);
-static PyObject *Noise_cell(PyObject *self, PyObject *args);
-static PyObject *Noise_cell_vector(PyObject *self, PyObject *args);
+static PyObject *Noise_random(PyObject *UNUSED(self));
+static PyObject *Noise_random_unit_vector(PyObject *UNUSED(self));
+static PyObject *Noise_seed_set(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_noise(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_turbulence(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_turbulence_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_vl_vector(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_hetero_terrain(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_hybrid_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_ridged_multi_fractal(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_voronoi(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_cell(PyObject *UNUSED(self), PyObject *args);
+static PyObject *Noise_cell_vector(PyObject *UNUSED(self), PyObject *args);
*/
static PyMethodDef NoiseMethods[] = {
@@ -647,18 +651,17 @@ static struct PyModuleDef noise_module_def = {
PyModuleDef_HEAD_INIT,
"noise", /* m_name */
Noise__doc__, /* m_doc */
- 0, /* m_size */
+ 0, /* m_size */
NoiseMethods, /* m_methods */
- 0, /* m_reload */
- 0, /* m_traverse */
- 0, /* m_clear */
- 0, /* m_free */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
};
-PyObject *Noise_Init(void)
+PyObject *BPyInit_noise(void)
{
PyObject *submodule = PyModule_Create(&noise_module_def);
- PyDict_SetItemString(PyImport_GetModuleDict(), noise_module_def.m_name, submodule);
/* use current time as seed for random number generator by default */
setRndSeed(0);
@@ -666,22 +669,22 @@ PyObject *Noise_Init(void)
/* Constant noisetype dictionary */
if(submodule) {
static PyStructSequence_Field noise_types_fields[] = {
- {"BLENDER", ""},
- {"STDPERLIN", ""},
- {"NEWPERLIN", ""},
- {"VORONOI_F1", ""},
- {"VORONOI_F2", ""},
- {"VORONOI_F3", ""},
- {"VORONOI_F4", ""},
- {"VORONOI_F2F1", ""},
- {"VORONOI_CRACKLE", ""},
- {"CELLNOISE", ""},
- {0}
+ {(char *)"BLENDER", NULL},
+ {(char *)"STDPERLIN", NULL},
+ {(char *)"NEWPERLIN", NULL},
+ {(char *)"VORONOI_F1", NULL},
+ {(char *)"VORONOI_F2", NULL},
+ {(char *)"VORONOI_F3", NULL},
+ {(char *)"VORONOI_F4", NULL},
+ {(char *)"VORONOI_F2F1", NULL},
+ {(char *)"VORONOI_CRACKLE", NULL},
+ {(char *)"CELLNOISE", NULL},
+ {NULL}
};
static PyStructSequence_Desc noise_types_info_desc = {
- "noise.types", /* name */
- "Noise type", /* doc */
+ (char *)"noise.types", /* name */
+ (char *)"Noise type", /* doc */
noise_types_fields, /* fields */
(sizeof(noise_types_fields)/sizeof(PyStructSequence_Field)) - 1
};
@@ -715,19 +718,19 @@ PyObject *Noise_Init(void)
if(submodule) {
static PyStructSequence_Field distance_metrics_fields[] = {
- {"DISTANCE", ""},
- {"DISTANCE_SQUARED", ""},
- {"MANHATTAN", ""},
- {"CHEBYCHEV", ""},
- {"MINKOVSKY_HALF", ""},
- {"MINKOVSKY_FOUR", ""},
- {"MINKOVSKY", ""},
- {0}
+ {(char *)"DISTANCE", NULL},
+ {(char *)"DISTANCE_SQUARED", NULL},
+ {(char *)"MANHATTAN", NULL},
+ {(char *)"CHEBYCHEV", NULL},
+ {(char *)"MINKOVSKY_HALF", NULL},
+ {(char *)"MINKOVSKY_FOUR", NULL},
+ {(char *)"MINKOVSKY", NULL},
+ {NULL}
};
static PyStructSequence_Desc noise_types_info_desc = {
- "noise.distance_metrics", /* name */
- "Distance Metrics for noise module.", /* doc */
+ (char *)"noise.distance_metrics", /* name */
+ (char *)"Distance Metrics for noise module.", /* doc */
distance_metrics_fields, /* fields */
(sizeof(distance_metrics_fields)/sizeof(PyStructSequence_Field)) - 1
};
diff --git a/source/blender/python/generic/noise_py_api.h b/source/blender/python/generic/noise_py_api.h
new file mode 100644
index 00000000000..0a1bc09157b
--- /dev/null
+++ b/source/blender/python/generic/noise_py_api.h
@@ -0,0 +1,29 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef NOISE_PY_API_H
+#define NOISE_PY_API_H
+
+PyObject *BPyInit_noise(void);
+
+#endif // NOISE_PY_API_H
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index ad109528a8c..e8315938748 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,10 +21,12 @@
*/
#include <Python.h>
+#include <frameobject.h>
+
#include "py_capi_utils.h"
/* for debugging */
-void PyC_ObSpit(char *name, PyObject *var) {
+void PyC_ObSpit(const char *name, PyObject *var) {
fprintf(stderr, "<%s> : ", name);
if (var==NULL) {
fprintf(stderr, "<NIL>");
@@ -53,39 +55,34 @@ void PyC_LineSpit(void) {
fprintf(stderr, "%s:%d\n", filename, lineno);
}
+/* python 3.2 only, copied from frameobjec.c */
+#if PY_VERSION_HEX < 0x03020000
+int
+PyFrame_GetLineNumber(PyFrameObject *f)
+{
+ if (f->f_trace)
+ return f->f_lineno;
+ else
+ return PyCode_Addr2Line(f->f_code, f->f_lasti);
+}
+#endif
+
void PyC_FileAndNum(const char **filename, int *lineno)
{
- PyObject *getframe, *frame;
- PyObject *f_lineno= NULL, *co_filename= NULL;
+ PyFrameObject *frame;
if (filename) *filename= NULL;
if (lineno) *lineno = -1;
-
- getframe = PySys_GetObject("_getframe"); // borrowed
- if (getframe==NULL) {
- PyErr_Clear();
- return;
- }
-
- frame = PyObject_CallObject(getframe, NULL);
- if (frame==NULL) {
- PyErr_Clear();
+
+ if (!(frame= PyThreadState_GET()->frame)) {
return;
}
-
+
/* when executing a script */
if (filename) {
- co_filename= PyC_Object_GetAttrStringArgs(frame, 1, "f_code", "co_filename");
- if (co_filename==NULL) {
- PyErr_SetString(PyExc_SystemError, "Could not access sys._getframe().f_code.co_filename");
- Py_DECREF(frame);
- return;
- }
-
- *filename = _PyUnicode_AsString(co_filename);
- Py_DECREF(co_filename);
+ *filename = _PyUnicode_AsString(frame->f_code->co_filename);
}
-
+
/* when executing a module */
if(filename && *filename == NULL) {
/* try an alternative method to get the filename - module based
@@ -103,21 +100,10 @@ void PyC_FileAndNum(const char **filename, int *lineno)
}
}
}
-
-
+
if (lineno) {
- f_lineno= PyObject_GetAttrString(frame, "f_lineno");
- if (f_lineno==NULL) {
- PyErr_SetString(PyExc_SystemError, "Could not access sys._getframe().f_lineno");
- Py_DECREF(frame);
- return;
- }
-
- *lineno = (int)PyLong_AsSsize_t(f_lineno);
- Py_DECREF(f_lineno);
+ *lineno = PyFrame_GetLineNumber(frame);
}
-
- Py_DECREF(frame);
}
/* Would be nice if python had this built in */
@@ -171,7 +157,7 @@ PyObject *PyC_ExceptionBuffer(void)
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
goto error_cleanup;
- } else if (! (string_io = PyObject_CallMethod(string_io_mod, "StringIO", NULL))) {
+ } else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
goto error_cleanup;
} else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
goto error_cleanup;
@@ -217,7 +203,7 @@ error_cleanup:
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
-const char *PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
+const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
{
char *result;
@@ -228,6 +214,10 @@ const char *PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
* chars since blender doesnt limit this */
return result;
}
+ else if(PyBytes_Check(py_str)) {
+ PyErr_Clear();
+ return PyBytes_AS_STRING(py_str);
+ }
else {
/* mostly copied from fileio.c's, fileio_init */
PyObject *stringobj;
@@ -265,7 +255,193 @@ PyObject *PyC_UnicodeFromByte(const char *str)
}
else {
PyErr_Clear();
- result= PyUnicode_DecodeUTF8(str, strlen(str), "surrogateescape");
+ /* this means paths will always be accessible once converted, on all OS's */
+ result= PyUnicode_DecodeFSDefault(str);
return result;
}
}
+
+/*****************************************************************************
+* Description: This function creates a new Python dictionary object.
+* note: dict is owned by sys.modules["__main__"] module, reference is borrowed
+* note: important we use the dict from __main__, this is what python expects
+ for 'pickle' to work as well as strings like this...
+ >> foo = 10
+ >> print(__import__("__main__").foo)
+*
+* note: this overwrites __main__ which gives problems with nested calles.
+* be sure to run PyC_MainModule_Backup & PyC_MainModule_Restore if there is
+* any chance that python is in the call stack.
+*****************************************************************************/
+PyObject *PyC_DefaultNameSpace(const char *filename)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ PyObject *mod_main= PyModule_New("__main__");
+ PyDict_SetItemString(interp->modules, "__main__", mod_main);
+ Py_DECREF(mod_main); /* sys.modules owns now */
+ PyModule_AddStringConstant(mod_main, "__name__", "__main__");
+ if(filename)
+ PyModule_AddStringConstant(mod_main, "__file__", filename); /* __file__ only for nice UI'ness */
+ PyModule_AddObject(mod_main, "__builtins__", interp->builtins);
+ Py_INCREF(interp->builtins); /* AddObject steals a reference */
+ return PyModule_GetDict(mod_main);
+}
+
+/* restore MUST be called after this */
+void PyC_MainModule_Backup(PyObject **main_mod)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ *main_mod= PyDict_GetItemString(interp->modules, "__main__");
+ Py_XINCREF(*main_mod); /* dont free */
+}
+
+void PyC_MainModule_Restore(PyObject *main_mod)
+{
+ PyInterpreterState *interp= PyThreadState_GET()->interp;
+ PyDict_SetItemString(interp->modules, "__main__", main_mod);
+ Py_XDECREF(main_mod);
+}
+
+/* Would be nice if python had this built in */
+void PyC_RunQuicky(const char *filepath, int n, ...)
+{
+ FILE *fp= fopen(filepath, "r");
+
+ if(fp) {
+ PyGILState_STATE gilstate= PyGILState_Ensure();
+
+ va_list vargs;
+
+ int *sizes= PyMem_MALLOC(sizeof(int) * (n / 2));
+ int i;
+
+ PyObject *py_dict = PyC_DefaultNameSpace(filepath);
+ PyObject *values= PyList_New(n / 2); /* namespace owns this, dont free */
+
+ PyObject *py_result, *ret;
+
+ PyObject *struct_mod= PyImport_ImportModule("struct");
+ PyObject *calcsize= PyObject_GetAttrString(struct_mod, "calcsize"); /* struct.calcsize */
+ PyObject *pack= PyObject_GetAttrString(struct_mod, "pack"); /* struct.pack */
+ PyObject *unpack= PyObject_GetAttrString(struct_mod, "unpack"); /* struct.unpack */
+
+ Py_DECREF(struct_mod);
+
+ va_start(vargs, n);
+ for (i=0; i * 2<n; i++) {
+ char *format = va_arg(vargs, char *);
+ void *ptr = va_arg(vargs, void *);
+
+ ret= PyObject_CallFunction(calcsize, (char *)"s", format);
+
+ if(ret) {
+ sizes[i]= PyLong_AsSsize_t(ret);
+ Py_DECREF(ret);
+ ret = PyObject_CallFunction(unpack, (char *)"sy#", format, (char *)ptr, sizes[i]);
+ }
+
+ if(ret == NULL) {
+ printf("PyC_InlineRun error, line:%d\n", __LINE__);
+ PyErr_Print();
+ PyErr_Clear();
+
+ PyList_SET_ITEM(values, i, Py_None); /* hold user */
+ Py_INCREF(Py_None);
+
+ sizes[i]= 0;
+ }
+ else {
+ if(PyTuple_GET_SIZE(ret) == 1) {
+ /* convenience, convert single tuples into single values */
+ PyObject *tmp= PyTuple_GET_ITEM(ret, 0);
+ Py_INCREF(tmp);
+ Py_DECREF(ret);
+ ret = tmp;
+ }
+
+ PyList_SET_ITEM(values, i, ret); /* hold user */
+ }
+ }
+ va_end(vargs);
+
+ /* set the value so we can access it */
+ PyDict_SetItemString(py_dict, "values", values);
+
+ py_result = PyRun_File(fp, filepath, Py_file_input, py_dict, py_dict);
+
+ fclose(fp);
+
+ if(py_result) {
+
+ /* we could skip this but then only slice assignment would work
+ * better not be so strict */
+ values= PyDict_GetItemString(py_dict, "values");
+
+ if(values && PyList_Check(values)) {
+
+ /* dont use the result */
+ Py_DECREF(py_result);
+ py_result= NULL;
+
+ /* now get the values back */
+ va_start(vargs, n);
+ for (i=0; i*2 <n; i++) {
+ char *format = va_arg(vargs, char *);
+ void *ptr = va_arg(vargs, void *);
+
+ PyObject *item;
+ PyObject *item_new;
+ /* prepend the string formatting and remake the tuple */
+ item= PyList_GET_ITEM(values, i);
+ if(PyTuple_CheckExact(item)) {
+ int ofs= PyTuple_GET_SIZE(item);
+ item_new= PyTuple_New(ofs + 1);
+ while(ofs--) {
+ PyObject *member= PyTuple_GET_ITEM(item, ofs);
+ PyTuple_SET_ITEM(item_new, ofs + 1, member);
+ Py_INCREF(member);
+ }
+
+ PyTuple_SET_ITEM(item_new, 0, PyUnicode_FromString(format));
+ }
+ else {
+ item_new= Py_BuildValue("sO", format, item);
+ }
+
+ ret = PyObject_Call(pack, item_new, NULL);
+
+ if(ret) {
+ /* copy the bytes back into memory */
+ memcpy(ptr, PyBytes_AS_STRING(ret), sizes[i]);
+ Py_DECREF(ret);
+ }
+ else {
+ printf("PyC_InlineRun error on arg '%d', line:%d\n", i, __LINE__);
+ PyC_ObSpit("failed converting:", item_new);
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ Py_DECREF(item_new);
+ }
+ va_end(vargs);
+ }
+ else {
+ printf("PyC_InlineRun error, 'values' not a list, line:%d\n", __LINE__);
+ }
+ }
+ else {
+ printf("PyC_InlineRun error line:%d\n", __LINE__);
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ Py_DECREF(calcsize);
+ Py_DECREF(pack);
+ Py_DECREF(unpack);
+
+ PyMem_FREE(sizes);
+
+ PyGILState_Release(gilstate);
+ }
+}
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 180159ebddb..8d16068441a 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,17 +25,21 @@
#ifndef PY_CAPI_UTILS_H
#define PY_CAPI_UTILS_H
-struct PyObject;
-
-void PyC_ObSpit(char *name, PyObject *var);
+void PyC_ObSpit(const char *name, PyObject *var);
void PyC_LineSpit(void);
PyObject * PyC_ExceptionBuffer(void);
PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
void PyC_FileAndNum(const char **filename, int *lineno);
-int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, char *error_prefix);
+int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, const char *error_prefix);
/* follow http://www.python.org/dev/peps/pep-0383/ */
PyObject * PyC_UnicodeFromByte(const char *str);
-const char * PuC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+
+/* name namespace function for bpy & bge */
+PyObject * PyC_DefaultNameSpace(const char *filename);
+void PyC_RunQuicky(const char *filepath, int n, ...);
+void PyC_MainModule_Backup(PyObject **main_mod);
+void PyC_MainModule_Restore(PyObject *main_mod);
#endif // PY_CAPI_UTILS_H
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
new file mode 100644
index 00000000000..123c8e5b3e0
--- /dev/null
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -0,0 +1,77 @@
+# ***** 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.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Jacques Beaurainm, Campbell Barton
+#
+# ***** END GPL LICENSE BLOCK *****
+
+set(INC
+ ..
+ ../../blenlib
+ ../../makesdna
+ ../../makesrna
+ ../../blenkernel
+ ../../blenloader
+ ../../windowmanager
+ ../../editors/include
+ ../../../../intern/guardedalloc
+ ../../../../intern/audaspace/intern
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ bpy.c
+ bpy_app.c
+ bpy_driver.c
+ bpy_interface.c
+ bpy_operator.c
+ bpy_operator_wrap.c
+ bpy_props.c
+ bpy_rna.c
+ bpy_rna_array.c
+ bpy_rna_callback.c
+ bpy_traceback.c
+ bpy_util.c
+ stubs.c
+
+ bpy.h
+ bpy_app.h
+ bpy_driver.h
+ bpy_operator.h
+ bpy_operator_wrap.h
+ bpy_props.h
+ bpy_rna.h
+ bpy_rna_callback.h
+ bpy_traceback.h
+ bpy_util.h
+ ../BPY_extern.h
+)
+
+# only to check if buildinfo is available
+if(WITH_BUILDINFO)
+ add_definitions(-DBUILD_DATE)
+endif()
+
+if(WITH_PYTHON_MODULE)
+ add_definitions(-DWITH_PYTHON_MODULE)
+endif()
+
+blender_add_lib(bf_python "${SRC}" "${INC}")
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 87cc0e79509..44daef06cb4 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
/* This file defines the '_bpy' module which is used by python's 'bpy' package.
* a script writer should never directly access this module */
+#define WITH_PYTHON /* for AUD_PyInit.h, possibly others */
+#include <Python.h>
+
+#include "bpy.h"
#include "bpy_util.h"
#include "bpy_rna.h"
#include "bpy_app.h"
@@ -34,15 +38,23 @@
#include "BLI_path_util.h"
#include "BLI_bpath.h"
-
+#include "BLI_utildefines.h"
+
+
+#include "BKE_global.h" /* XXX, G.main only */
+
+#include "MEM_guardedalloc.h"
+
/* external util modules */
-#include "../generic/geometry.h"
+#include "../generic/mathutils.h"
#include "../generic/bgl.h"
-#include "../generic/blf_api.h"
+#include "../generic/blf_py_api.h"
#include "../generic/IDProp.h"
//#include "AUD_PyInit.h"
+PyObject *bpy_package_py= NULL;
+
static char bpy_script_paths_doc[] =
".. function:: script_paths()\n"
"\n"
@@ -51,7 +63,7 @@ static char bpy_script_paths_doc[] =
" :return: (system, user) strings will be empty when not found.\n"
" :rtype: tuple of strigs\n";
-PyObject *bpy_script_paths(PyObject *self)
+static PyObject *bpy_script_paths(PyObject *UNUSED(self))
{
PyObject *ret= PyTuple_New(2);
char *path;
@@ -73,58 +85,96 @@ static char bpy_blend_paths_doc[] =
" :type absolute: boolean\n"
" :return: path list.\n"
" :rtype: list of strigs\n";
-static PyObject *bpy_blend_paths(PyObject * self, PyObject *args, PyObject *kw)
+static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- struct BPathIterator bpi;
- PyObject *list = PyList_New(0), *st; /* stupidly big string to be safe */
+ struct BPathIterator *bpi;
+ PyObject *list, *st; /* stupidly big string to be safe */
/* be sure there is low chance of the path being too short */
char filepath_expanded[1024];
- char *lib;
+ const char *lib;
int absolute = 0;
- static char *kwlist[] = {"absolute", NULL};
+ static const char *kwlist[] = {"absolute", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", kwlist, &absolute))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", (char **)kwlist, &absolute))
return NULL;
- for(BLI_bpathIterator_init(&bpi, NULL); !BLI_bpathIterator_isDone(&bpi); BLI_bpathIterator_step(&bpi)) {
+ list= PyList_New(0);
+
+ for(BLI_bpathIterator_init(&bpi, G.main, NULL, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
/* build the list */
if (absolute) {
- BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded);
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
- lib = BLI_bpathIterator_getLib(&bpi);
- if (lib && (strcmp(lib, bpi.base_path))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
- BLI_bpathIterator_getPathExpanded(&bpi, filepath_expanded);
+ lib = BLI_bpathIterator_getLib(bpi);
+ if (lib && (strcmp(lib, BLI_bpathIterator_getBasePath(bpi)))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
+ BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
- BLI_bpathIterator_getPath(&bpi, filepath_expanded);
+ BLI_bpathIterator_getPath(bpi, filepath_expanded);
}
}
- st = PyUnicode_FromString(filepath_expanded);
+ st= PyUnicode_DecodeFSDefault(filepath_expanded);
PyList_Append(list, st);
Py_DECREF(st);
}
- BLI_bpathIterator_free(&bpi);
+ BLI_bpathIterator_free(bpi);
return list;
}
-static PyMethodDef meth_bpy_script_paths[] = {{ "script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc}};
-static PyMethodDef meth_bpy_blend_paths[] = {{ "blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc}};
-static void bpy_import_test(char *modname)
+// static char bpy_user_resource_doc[] = // now in bpy/utils.py
+static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
+{
+ char *type;
+ char *subdir= NULL;
+ int folder_id;
+ static const char *kwlist[] = {"type", "subdir", NULL};
+
+ char *path;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|s:user_resource", (char **)kwlist, &type, &subdir))
+ return NULL;
+
+ /* stupid string compare */
+ if (!strcmp(type, "DATAFILES")) folder_id= BLENDER_USER_DATAFILES;
+ else if(!strcmp(type, "CONFIG")) folder_id= BLENDER_USER_CONFIG;
+ else if(!strcmp(type, "SCRIPTS")) folder_id= BLENDER_USER_SCRIPTS;
+ else if(!strcmp(type, "AUTOSAVE")) folder_id= BLENDER_USER_AUTOSAVE;
+ else {
+ PyErr_SetString(PyExc_ValueError, "invalid resource argument");
+ return NULL;
+ }
+
+ /* same logic as BLI_get_folder_create(), but best leave it up to the script author to create */
+ path= BLI_get_folder(folder_id, subdir);
+
+ if (!path)
+ path = BLI_get_user_folder_notest(folder_id, subdir);
+
+ return PyUnicode_FromString(path ? path : "");
+}
+
+static PyMethodDef meth_bpy_script_paths = {"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
+static PyMethodDef meth_bpy_blend_paths = {"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
+static PyMethodDef meth_bpy_user_resource = {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
+
+static PyObject *bpy_import_test(const char *modname)
{
- PyObject *mod= PyImport_ImportModuleLevel(modname, NULL, NULL, NULL, 0);
+ PyObject *mod= PyImport_ImportModuleLevel((char *)modname, NULL, NULL, NULL, 0);
if(mod) {
Py_DECREF(mod);
}
else {
PyErr_Print();
PyErr_Clear();
- }
+ }
+
+ return mod;
}
/*****************************************************************************
@@ -149,13 +199,7 @@ void BPy_init_modules( void )
printf("bpy: couldnt find 'scripts/modules', blender probably wont start.\n");
}
/* stand alone utility modules not related to blender directly */
- Geometry_Init();
- Mathutils_Init();
- Noise_Init();
- BGL_Init();
- BLF_Init();
- IDProp_Init_Types();
- //AUD_initPython();
+ IDProp_Init_Types(); /* not actually a submodule, just types */
mod = PyModule_New("_bpy");
@@ -167,6 +211,8 @@ void BPy_init_modules( void )
BPY_rna_init();
PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */
+ PyModule_AddObject(mod, "StructMetaPropGroup", (PyObject *)&pyrna_struct_meta_idprop_Type); /* metaclass for idprop types, bpy_types.py needs access */
+
bpy_import_test("bpy_types");
PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */
bpy_import_test("bpy_types");
@@ -175,7 +221,7 @@ void BPy_init_modules( void )
PyModule_AddObject( mod, "app", BPY_app_struct() );
/* bpy context */
- RNA_pointer_create(NULL, &RNA_Context, BPy_GetContext(), &ctx_ptr);
+ RNA_pointer_create(NULL, &RNA_Context, (void *)BPy_GetContext(), &ctx_ptr);
bpy_context_module= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ctx_ptr);
/* odd that this is needed, 1 ref on creation and another for the module
* but without we get a crash on exit */
@@ -184,9 +230,14 @@ void BPy_init_modules( void )
PyModule_AddObject(mod, "context", (PyObject *)bpy_context_module);
/* utility func's that have nowhere else to go */
- PyModule_AddObject(mod, meth_bpy_script_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_script_paths, NULL));
- PyModule_AddObject(mod, meth_bpy_blend_paths->ml_name, (PyObject *)PyCFunction_New(meth_bpy_blend_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_script_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_script_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_blend_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_blend_paths, NULL));
+ PyModule_AddObject(mod, meth_bpy_user_resource.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_user_resource, NULL));
+
+ /* register funcs (bpy_rna.c) */
+ PyModule_AddObject(mod, meth_bpy_register_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_register_class, NULL));
+ PyModule_AddObject(mod, meth_bpy_unregister_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_unregister_class, NULL));
/* add our own modules dir, this is a python package */
- bpy_import_test("bpy");
+ bpy_package_py= bpy_import_test("bpy");
}
diff --git a/source/blender/python/intern/bpy.h b/source/blender/python/intern/bpy.h
index 76eef6ea4b9..e3064fe3ca1 100644
--- a/source/blender/python/intern/bpy.h
+++ b/source/blender/python/intern/bpy.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,4 +22,4 @@
* ***** END GPL LICENSE BLOCK ***** */
void BPy_init_modules( void );
-
+extern PyObject *bpy_package_py;
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 78658a611a3..e58afe8eace 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,43 +22,57 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "bpy_app.h"
+#include "bpy_driver.h"
#include "BLI_path_util.h"
+#include "BLI_utildefines.h"
+
#include "BKE_blender.h"
#include "BKE_global.h"
#include "structseq.h"
+#include "../generic/py_capi_utils.h"
+
#ifdef BUILD_DATE
extern char build_date[];
extern char build_time[];
extern char build_rev[];
extern char build_platform[];
extern char build_type[];
+extern char build_cflags[];
+extern char build_cxxflags[];
+extern char build_linkflags[];
+extern char build_system[];
#endif
static PyTypeObject BlenderAppType;
static PyStructSequence_Field app_info_fields[] = {
- {"version", "The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
- {"version_string", "The Blender version formatted as a string"},
- {"binary_path", "The location of blenders executable, useful for utilities that spawn new instances"},
- {"debug", "Boolean, set when blender is running in debug mode (started with -d)"},
- {"background", "Boolean, True when blender is running without a user interface (started with -b)"},
+ {(char *)"version", (char *)"The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
+ {(char *)"version_string", (char *)"The Blender version formatted as a string"},
+ {(char *)"binary_path", (char *)"The location of blenders executable, useful for utilities that spawn new instances"},
+ {(char *)"background", (char *)"Boolean, True when blender is running without a user interface (started with -b)"},
/* buildinfo */
- {"build_date", "The date this blender instance was built"},
- {"build_time", "The time this blender instance was built"},
- {"build_revision", "The subversion revision this blender instance was built with"},
- {"build_platform", "The platform this blender instance was built for"},
- {"build_type", "The type of build (Release, Debug)"},
- {0}
+ {(char *)"build_date", (char *)"The date this blender instance was built"},
+ {(char *)"build_time", (char *)"The time this blender instance was built"},
+ {(char *)"build_revision", (char *)"The subversion revision this blender instance was built with"},
+ {(char *)"build_platform", (char *)"The platform this blender instance was built for"},
+ {(char *)"build_type", (char *)"The type of build (Release, Debug)"},
+ {(char *)"build_cflags", (char *)"C compiler flags"},
+ {(char *)"build_cxxflags", (char *)"C++ compiler flags"},
+ {(char *)"build_linkflags", (char *)"Binary linking flags"},
+ {(char *)"build_system", (char *)"Build system used"},
+ {NULL}
};
static PyStructSequence_Desc app_info_desc = {
- "bpy.app", /* name */
- "This module contains application values that remain unchanged during runtime.", /* doc */
+ (char *)"bpy.app", /* name */
+ (char *)"This module contains application values that remain unchanged during runtime.", /* doc */
app_info_fields, /* fields */
(sizeof(app_info_fields)/sizeof(PyStructSequence_Field)) - 1
};
@@ -85,7 +99,6 @@ static PyObject *make_app_info(void)
SetObjItem(Py_BuildValue("(iii)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetStrItem(bprogname);
- SetObjItem(PyBool_FromLong(G.f & G_DEBUG));
SetObjItem(PyBool_FromLong(G.background));
/* build info */
@@ -95,12 +108,20 @@ static PyObject *make_app_info(void)
SetStrItem(build_rev);
SetStrItem(build_platform);
SetStrItem(build_type);
+ SetStrItem(build_cflags);
+ SetStrItem(build_cxxflags);
+ SetStrItem(build_linkflags);
+ SetStrItem(build_system);
#else
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
+ SetStrItem("Unknown");
#endif
#undef SetIntItem
@@ -114,10 +135,90 @@ static PyObject *make_app_info(void)
return app_info;
}
+/* a few getsets because it makes sense for them to be in bpy.app even though
+ * they are not static */
+static PyObject *bpy_app_debug_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ return PyBool_FromLong(G.f & G_DEBUG);
+}
+
+static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
+{
+ int param= PyObject_IsTrue(value);
+
+ if(param < 0) {
+ PyErr_SetString(PyExc_TypeError, "bpy.app.debug can only be True/False");
+ return -1;
+ }
+
+ if(param) G.f |= G_DEBUG;
+ else G.f &= ~G_DEBUG;
+
+ return 0;
+}
+
+static PyObject *bpy_app_debug_value_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ return PyLong_FromSsize_t(G.rt);
+}
+
+static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure))
+{
+ int param= PyLong_AsSsize_t(value);
+
+ if (param == -1 && PyErr_Occurred()) {
+ PyErr_SetString(PyExc_TypeError, "bpy.app.debug_value can only be set to a whole number");
+ return -1;
+ }
+
+ G.rt= param;
+
+ return 0;
+}
+
+static PyObject *bpy_app_tempdir_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ extern char btempdir[];
+ return PyC_UnicodeFromByte(btempdir);
+}
+
+static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ if (bpy_pydriver_Dict == NULL)
+ if (bpy_pydriver_create_dict() != 0) {
+ PyErr_SetString(PyExc_RuntimeError, "bpy.app.driver_namespace failed to create dictionary");
+ return NULL;
+ }
+
+ Py_INCREF(bpy_pydriver_Dict);
+ return bpy_pydriver_Dict;
+}
+
+
+static PyGetSetDef bpy_app_getsets[]= {
+ {(char *)"debug", bpy_app_debug_get, bpy_app_debug_set, (char *)"Boolean, set when blender is running in debug mode (started with -d)", NULL},
+ {(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)"Int, number which can be set to non-zero values for testing purposes.", NULL},
+ {(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)"String, the temp directory used by blender (read-only)", NULL},
+ {(char *)"driver_namespace", bpy_app_driver_dict_get, NULL, (char *)"Dictionary for drivers namespace, editable in-place, reset on file load (read-only)", NULL},
+ {NULL, NULL, NULL, NULL, NULL}
+};
+
+static void py_struct_seq_getset_init(void)
+{
+ /* tricky dynamic members, not to py-spec! */
+ PyGetSetDef *getset;
+
+ for(getset= bpy_app_getsets; getset->name; getset++) {
+ PyDict_SetItemString(BlenderAppType.tp_dict, getset->name, PyDescr_NewGetSet(&BlenderAppType, getset));
+ }
+}
+/* end dynamic bpy.app */
+
+
PyObject *BPY_app_struct(void)
{
PyObject *ret;
-
+
PyStructSequence_InitType(&BlenderAppType, &app_info_desc);
ret= make_app_info();
@@ -125,6 +226,10 @@ PyObject *BPY_app_struct(void)
/* prevent user from creating new instances */
BlenderAppType.tp_init = NULL;
BlenderAppType.tp_new = NULL;
-
+
+ /* kindof a hack ontop of PyStructSequence */
+ py_struct_seq_getset_init();
+
return ret;
}
+
diff --git a/source/blender/python/intern/bpy_app.h b/source/blender/python/intern/bpy_app.h
index 1da5004ee85..cf19218f0b0 100644
--- a/source/blender/python/intern/bpy_app.h
+++ b/source/blender/python/intern/bpy_app.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -21,11 +21,9 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef BPY_APP_H__
-#define BPY_APP_H__
-
-#include <Python.h>
+#ifndef BPY_APP_H
+#define BPY_APP_H
PyObject *BPY_app_struct( void );
-#endif
+#endif // BPY_APP_H
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index e5719a84fdd..7072fbc09a7 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -34,13 +34,15 @@
#include "BKE_fcurve.h"
#include "BKE_global.h"
+#include "bpy_driver.h"
+
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
PyObject *bpy_pydriver_Dict = NULL;
/* For faster execution we keep a special dictionary for pydrivers, with
* the needed modules and aliases.
*/
-static int bpy_pydriver_create_dict(void)
+int bpy_pydriver_create_dict(void)
{
PyObject *d, *mod;
@@ -63,47 +65,21 @@ static int bpy_pydriver_create_dict(void)
}
/* add bpy to global namespace */
- mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
+ mod= PyImport_ImportModuleLevel((char *)"bpy", NULL, NULL, NULL, 0);
if (mod) {
PyDict_SetItemString(bpy_pydriver_Dict, "bpy", mod);
Py_DECREF(mod);
}
-
-#if 0 // non existant yet
- mod = PyImport_ImportModule("Blender.Noise");
- if (mod) {
- PyDict_SetItemString(d, "noise", mod);
- PyDict_SetItemString(d, "n", mod);
- Py_DECREF(mod);
- } else {
- PyErr_Clear();
- }
-
- /* If there's a Blender text called pydrivers.py, import it.
- * Users can add their own functions to this module.
- */
- if (G.f & G_SCRIPT_AUTOEXEC) {
- mod = importText("pydrivers"); /* can also use PyImport_Import() */
- if (mod) {
- PyDict_SetItemString(d, "pydrivers", mod);
- PyDict_SetItemString(d, "p", mod);
- Py_DECREF(mod);
- } else {
- PyErr_Clear();
- }
- }
-#endif // non existant yet
-
return 0;
}
/* Update function, it gets rid of pydrivers global dictionary, forcing
- * BPY_eval_driver to recreate it. This function is used to force
+ * BPY_driver_exec to recreate it. This function is used to force
* reloading the Blender text module "pydrivers.py", if available, so
* updates in it reach pydriver evaluation.
*/
-void BPY_pydriver_update(void)
+void BPY_driver_reset(void)
{
PyGILState_STATE gilstate;
int use_gil= 1; // (PyThreadState_Get()==NULL);
@@ -124,22 +100,14 @@ void BPY_pydriver_update(void)
}
/* error return function for BPY_eval_pydriver */
-static float pydriver_error(ChannelDriver *driver)
+static void pydriver_error(ChannelDriver *driver)
{
- if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
- PyDict_Clear(bpy_pydriver_Dict);
- Py_DECREF(bpy_pydriver_Dict);
- bpy_pydriver_Dict = NULL;
- }
-
driver->flag |= DRIVER_FLAG_INVALID; /* py expression failed */
fprintf(stderr, "\nError in Driver: The following Python expression failed:\n\t'%s'\n\n", driver->expression);
// BPy_errors_to_report(NULL); // TODO - reports
PyErr_Print();
PyErr_Clear();
-
- return 0.0f;
}
/* This evals py driver expressions, 'expr' is a Python expression that
@@ -149,7 +117,7 @@ static float pydriver_error(ChannelDriver *driver)
* bake operator which intern starts a thread which calls scene update which
* does a driver update. to avoid a deadlock check PyThreadState_Get() if PyGILState_Ensure() is needed.
*/
-float BPY_eval_driver (ChannelDriver *driver)
+float BPY_driver_exec(ChannelDriver *driver)
{
PyObject *driver_vars=NULL;
PyObject *retval= NULL;
@@ -238,15 +206,15 @@ float BPY_eval_driver (ChannelDriver *driver)
/* try to add to dictionary */
/* if (PyDict_SetItemString(driver_vars, dvar->name, driver_arg)) { */
- if (PyDict_SetItem(driver_vars, PyTuple_GET_ITEM(expr_vars, i++), driver_arg)) { /* use string interning for faster namespace creation */
+ if (PyDict_SetItem(driver_vars, PyTuple_GET_ITEM(expr_vars, i++), driver_arg) < 0) { /* use string interning for faster namespace creation */
/* this target failed - bad name */
if (targets_ok) {
/* first one - print some extra info for easier identification */
- fprintf(stderr, "\nBPY_eval_driver() - Error while evaluating PyDriver:\n");
+ fprintf(stderr, "\nBPY_driver_eval() - Error while evaluating PyDriver:\n");
targets_ok= 0;
}
- fprintf(stderr, "\tBPY_eval_driver() - couldn't add variable '%s' to namespace\n", dvar->name);
+ fprintf(stderr, "\tBPY_driver_eval() - couldn't add variable '%s' to namespace\n", dvar->name);
// BPy_errors_to_report(NULL); // TODO - reports
PyErr_Print();
PyErr_Clear();
@@ -259,7 +227,7 @@ float BPY_eval_driver (ChannelDriver *driver)
#else
/* evaluate the compiled expression */
if (expr_code)
- retval= PyEval_EvalCode((PyCodeObject *)expr_code, bpy_pydriver_Dict, driver_vars);
+ retval= PyEval_EvalCode((void *)expr_code, bpy_pydriver_Dict, driver_vars);
#endif
/* decref the driver vars first... */
@@ -286,7 +254,7 @@ float BPY_eval_driver (ChannelDriver *driver)
return (float)result;
}
else {
- fprintf(stderr, "\tBPY_eval_driver() - driver '%s' evaluates to '%f'\n", dvar->name, result);
+ fprintf(stderr, "\tBPY_driver_eval() - driver '%s' evaluates to '%f'\n", dvar->name, result);
return 0.0f;
}
}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_System.h b/source/blender/python/intern/bpy_driver.h
index bd0658014e8..3e7cd68eef0 100644
--- a/source/gameengine/GamePlayer/common/unix/GPU_System.h
+++ b/source/blender/python/intern/bpy_driver.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -17,30 +17,20 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
+#ifndef BPY_DRIVER_H
+#define BPY_DRIVER_H
-#ifndef __GPU_SYSTEM_H
-#define __GPU_SYSTEM_H
-
-#include "GPC_System.h"
-
-class GPU_System : public GPC_System
-{
-public:
- GPU_System()
- {
- }
+struct ChannelDriver;
- virtual double GetTimeInSeconds();
-};
+int bpy_pydriver_create_dict(void);
+extern PyObject *bpy_pydriver_Dict;
-#endif // __GPU_SYSTEM_H
+/* externals */
+float BPY_driver_exec(struct ChannelDriver *driver);
+void BPY_driver_reset(void);
+#endif // BPY_DRIVER_H
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 77d0f4fa90a..669c6541bc5 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,25 +23,28 @@
* ***** END GPL LICENSE BLOCK *****
*/
-
-
/* grr, python redefines */
#ifdef _POSIX_C_SOURCE
#undef _POSIX_C_SOURCE
#endif
+#include <Python.h>
+
+#include "MEM_guardedalloc.h"
#include "bpy.h"
#include "bpy_rna.h"
#include "bpy_util.h"
+#include "bpy_traceback.h"
#include "DNA_space_types.h"
#include "DNA_text_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_math_base.h"
#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_text.h"
@@ -52,6 +55,13 @@
#include "BPY_extern.h"
#include "../generic/bpy_internal_import.h" // our own imports
+#include "../generic/py_capi_utils.h"
+
+/* inittab initialization functions */
+#include "../generic/noise_py_api.h"
+#include "../generic/mathutils.h"
+#include "../generic/bgl.h"
+#include "../generic/blf_py_api.h"
/* for internal use, when starting and ending python scripts */
@@ -59,8 +69,7 @@
static int py_call_level= 0;
BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
-// only for tests
-#define TIME_PY_RUN
+// #define TIME_PY_RUN // simple python tests. prints on exit.
#ifdef TIME_PY_RUN
#include "PIL_time.h"
@@ -87,7 +96,7 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
fprintf(stderr, "ERROR: Python context called with a NULL Context. this should not happen!\n");
}
- BPY_update_modules(); /* can give really bad results if this isnt here */
+ BPY_modules_update(C); /* can give really bad results if this isnt here */
#ifdef TIME_PY_RUN
if(bpy_timer_count==0) {
@@ -103,7 +112,8 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
}
}
-void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
+/* context should be used but not now because it causes some bugs */
+void bpy_context_clear(bContext *UNUSED(C), PyGILState_STATE *gilstate)
{
py_call_level--;
@@ -126,7 +136,7 @@ void bpy_context_clear(bContext *C, PyGILState_STATE *gilstate)
}
}
-void BPY_free_compiled_text( struct Text *text )
+void BPY_text_free_code(Text *text)
{
if( text->compiled ) {
Py_DECREF( ( PyObject * ) text->compiled );
@@ -134,7 +144,7 @@ void BPY_free_compiled_text( struct Text *text )
}
}
-void BPY_update_modules( void )
+void BPY_modules_update(bContext *C)
{
#if 0 // slow, this runs all the time poll, draw etc 100's of time a sec.
PyObject *mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
@@ -144,11 +154,12 @@ void BPY_update_modules( void )
/* refreshes the main struct */
BPY_update_rna_module();
- bpy_context_module->ptr.data= (void *)BPy_GetContext();
+ bpy_context_module->ptr.data= (void *)C;
}
/* must be called before Py_Initialize */
-void BPY_start_python_path(void)
+#ifndef WITH_PYTHON_MODULE
+static void bpy_python_start_path(void)
{
char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL);
@@ -170,15 +181,7 @@ void BPY_start_python_path(void)
/* cmake/MSVC debug build crashes without this, why only
in this case is unknown.. */
{
- char *envpath = getenv("PYTHONPATH");
-
- if(envpath && envpath[0]) {
- char *newenvpath = BLI_sprintfN("%s;%s", py_path_bundle, envpath);
- BLI_setenv("PYTHONPATH", newenvpath);
- MEM_freeN(newenvpath);
- }
- else
- BLI_setenv("PYTHONPATH", py_path_bundle);
+ BLI_setenv("PYTHONPATH", py_path_bundle);
}
#endif
@@ -194,25 +197,46 @@ void BPY_start_python_path(void)
// printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar);
}
}
+#endif
-
-
-void BPY_set_context(bContext *C)
+void BPY_context_set(bContext *C)
{
BPy_SetContext(C);
}
-/* call BPY_set_context first */
-void BPY_start_python( int argc, char **argv )
+/* defined in AUD_C-API.cpp */
+extern PyObject *AUD_initPython(void);
+
+static struct _inittab bpy_internal_modules[]= {
+ {(char *)"noise", BPyInit_noise},
+ {(char *)"mathutils", BPyInit_mathutils},
+// {(char *)"mathutils.geometry", BPyInit_mathutils_geometry},
+ {(char *)"bgl", BPyInit_bgl},
+ {(char *)"blf", BPyInit_blf},
+ {(char *)"aud", AUD_initPython},
+ {NULL, NULL}
+};
+
+/* call BPY_context_set first */
+void BPY_python_start(int argc, const char **argv)
{
+#ifndef WITH_PYTHON_MODULE
PyThreadState *py_tstate = NULL;
-
+
/* not essential but nice to set our name */
static wchar_t bprogname_wchar[FILE_MAXDIR+FILE_MAXFILE]; /* python holds a reference */
utf8towchar(bprogname_wchar, bprogname);
Py_SetProgramName(bprogname_wchar);
- BPY_start_python_path(); /* allow to use our own included python */
+ /* builtin modules */
+ PyImport_ExtendInittab(bpy_internal_modules);
+
+ bpy_python_start_path(); /* allow to use our own included python */
+
+ /* Python 3.2 now looks for '2.56/python/include/python3.2d/pyconfig.h' to parse
+ * from the 'sysconfig' module which is used by 'site', so for now disable site.
+ * alternatively we could copy the file. */
+ Py_NoSiteFlag= 1;
Py_Initialize( );
@@ -220,52 +244,57 @@ void BPY_start_python( int argc, char **argv )
/* sigh, why do python guys not have a char** version anymore? :( */
{
int i;
-#if 0
PyObject *py_argv= PyList_New(argc);
for (i=0; i<argc; i++)
- PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
-
-#else // should fix bug #20021 - utf path name problems
- PyObject *py_argv= PyList_New(0);
- for (i=0; i<argc; i++) {
- PyObject *item= PyUnicode_Decode(argv[i], strlen(argv[i]), Py_FileSystemDefaultEncoding, NULL);
- if(item==NULL) { // should never happen
- PyErr_Print();
- PyErr_Clear();
- }
- else {
- PyList_Append(py_argv, item);
- Py_DECREF(item);
- }
- }
-#endif
+ PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i])); /* should fix bug #20021 - utf path name problems, by replacing PyUnicode_FromString */
+
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
}
/* Initialize thread support (also acquires lock) */
PyEval_InitThreads();
+#else
+ (void)argc;
+ (void)argv;
-
+ PyImport_ExtendInittab(bpy_internal_modules);
+#endif
+
/* bpy.* and lets us import it */
BPy_init_modules();
{ /* our own import and reload functions */
PyObject *item;
+ PyObject *mod;
//PyObject *m = PyImport_AddModule("__builtin__");
//PyObject *d = PyModule_GetDict(m);
PyObject *d = PyEval_GetBuiltins( );
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(bpy_import_meth, NULL)); Py_DECREF(item);
+// PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
+
+ /* move reload here
+ * XXX, use import hooks */
+ mod= PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
+ if(mod) {
+ PyDict_SetItemString(PyModule_GetDict(mod), "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ Py_DECREF(mod);
+ }
+ else {
+ BLI_assert(!"unable to load 'imp' module.");
+ }
+
}
pyrna_alloc_types();
+#ifndef WITH_PYTHON_MODULE
py_tstate = PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
+#endif
}
-void BPY_end_python( void )
+void BPY_python_end(void)
{
// fprintf(stderr, "Ending Python!\n");
@@ -299,23 +328,55 @@ void BPY_end_python( void )
}
-/* Can run a file or text block */
-int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
+static void python_script_error_jump_text(struct Text *text)
+{
+ int lineno;
+ int offset;
+ python_script_error_jump(text->id.name+2, &lineno, &offset);
+ if(lineno != -1) {
+ /* select the line with the error */
+ txt_move_to(text, lineno - 1, INT_MAX, FALSE);
+ txt_move_to(text, lineno - 1, offset, TRUE);
+ }
+}
+
+/* super annoying, undo _PyModule_Clear(), bug [#23871] */
+#define PYMODULE_CLEAR_WORKAROUND
+
+#ifdef PYMODULE_CLEAR_WORKAROUND
+/* bad!, we should never do this, but currently only safe way I could find to keep namespace.
+ * from being cleared. - campbell */
+typedef struct {
+ PyObject_HEAD
+ PyObject *md_dict;
+ /* ommit other values, we only want the dict. */
+} PyModuleObject;
+#endif
+
+int PyC_MainModule_Backup(PyObject **main_mod);
+PyObject *PyC_DefaultNameSpace(const char *n);
+int PyC_MainModule_Restore(PyObject *main_mod);
+
+static int python_script_exec(bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
{
- PyObject *py_dict, *py_result= NULL;
+ PyObject *main_mod= NULL;
+ PyObject *py_dict= NULL, *py_result= NULL;
PyGILState_STATE gilstate;
-
+
+ BLI_assert(fn || text);
+
if (fn==NULL && text==NULL) {
return 0;
}
bpy_context_set(C, &gilstate);
+ PyC_MainModule_Backup(&main_mod);
+
if (text) {
char fn_dummy[FILE_MAXDIR];
bpy_text_filename_get(fn_dummy, text);
- py_dict = bpy_namespace_dict_new(fn_dummy);
-
+
if( !text->compiled ) { /* if it wasn't already compiled, do it now */
char *buf = txt_to_buf( text );
@@ -324,139 +385,91 @@ int BPY_run_python_script( bContext *C, const char *fn, struct Text *text, struc
MEM_freeN( buf );
- if( PyErr_Occurred( ) ) {
- BPY_free_compiled_text( text );
+ if(PyErr_Occurred()) {
+ python_script_error_jump_text(text);
+ BPY_text_free_code(text);
}
}
- if(text->compiled)
- py_result = PyEval_EvalCode( text->compiled, py_dict, py_dict );
-
+
+ if(text->compiled) {
+ py_dict = PyC_DefaultNameSpace(fn_dummy);
+ py_result = PyEval_EvalCode(text->compiled, py_dict, py_dict);
+ }
+
}
else {
FILE *fp= fopen(fn, "r");
- py_dict = bpy_namespace_dict_new(fn);
-
if(fp) {
+ py_dict = PyC_DefaultNameSpace(fn);
+
#ifdef _WIN32
- /* Previously we used PyRun_File to run directly the code on a FILE
+ /* Previously we used PyRun_File to run directly the code on a FILE
* object, but as written in the Python/C API Ref Manual, chapter 2,
- * 'FILE structs for different C libraries can be different and
+ * 'FILE structs for different C libraries can be different and
* incompatible'.
* So now we load the script file data to a buffer */
- char *pystring;
+ {
+ char *pystring;
- fclose(fp);
+ fclose(fp);
- pystring= MEM_mallocN(strlen(fn) + 32, "pystring");
- pystring[0]= '\0';
- sprintf(pystring, "exec(open(r'%s').read())", fn);
- py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
- MEM_freeN(pystring);
+ pystring= MEM_mallocN(strlen(fn) + 32, "pystring");
+ pystring[0]= '\0';
+ sprintf(pystring, "exec(open(r'%s').read())", fn);
+ py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
+ MEM_freeN(pystring);
+ }
#else
py_result = PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
fclose(fp);
#endif
}
else {
- PyErr_Format(PyExc_SystemError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno));
+ PyErr_Format(PyExc_IOError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno));
py_result= NULL;
}
}
-
+
if (!py_result) {
+ if(text) {
+ python_script_error_jump_text(text);
+ }
BPy_errors_to_report(reports);
} else {
Py_DECREF( py_result );
}
-
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
- bpy_context_clear(C, &gilstate);
- return py_result ? 1:0;
-}
-
-
-/* TODO - move into bpy_space.c ? */
-/* GUI interface routines */
-
-/* Copied from Draw.c */
-static void exit_pydraw( SpaceScript * sc, short err )
-{
- Script *script = NULL;
-
- if( !sc || !sc->script )
- return;
-
- script = sc->script;
+ if(py_dict) {
+#ifdef PYMODULE_CLEAR_WORKAROUND
+ PyModuleObject *mmod= (PyModuleObject *)PyDict_GetItemString(PyThreadState_GET()->interp->modules, "__main__");
+ PyObject *dict_back = mmod->md_dict;
+ /* freeing the module will clear the namespace,
+ * gives problems running classes defined in this namespace being used later. */
+ mmod->md_dict= NULL;
+ Py_DECREF(dict_back);
+#endif
- if( err ) {
- BPy_errors_to_report(NULL); // TODO, reports
- script->flags = 0; /* mark script struct for deletion */
- SCRIPT_SET_NULL(script);
- script->scriptname[0] = '\0';
- script->scriptarg[0] = '\0';
-// XXX 2.5 error_pyscript();
-// XXX 2.5 scrarea_queue_redraw( sc->area );
+#undef PYMODULE_CLEAR_WORKAROUND
}
-#if 0 // XXX 2.5
- BPy_Set_DrawButtonsList(sc->but_refs);
- BPy_Free_DrawButtonsList(); /*clear all temp button references*/
-#endif
+ PyC_MainModule_Restore(main_mod);
- sc->but_refs = NULL;
-
- Py_XDECREF( ( PyObject * ) script->py_draw );
- Py_XDECREF( ( PyObject * ) script->py_event );
- Py_XDECREF( ( PyObject * ) script->py_button );
+ bpy_context_clear(C, &gilstate);
- script->py_draw = script->py_event = script->py_button = NULL;
+ return (py_result != NULL);
}
-static int bpy_run_script_init(bContext *C, SpaceScript * sc)
+/* Can run a file or text block */
+int BPY_filepath_exec(bContext *C, const char *filepath, struct ReportList *reports)
{
- if (sc->script==NULL)
- return 0;
-
- if (sc->script->py_draw==NULL && sc->script->scriptname[0] != '\0')
- BPY_run_python_script(C, sc->script->scriptname, NULL, NULL);
-
- if (sc->script->py_draw==NULL)
- return 0;
-
- return 1;
+ return python_script_exec(C, filepath, NULL, reports);
}
-int BPY_run_script_space_draw(const struct bContext *C, SpaceScript * sc)
-{
- if (bpy_run_script_init( (bContext *)C, sc)) {
- PyGILState_STATE gilstate = PyGILState_Ensure();
- PyObject *result = PyObject_CallObject( sc->script->py_draw, NULL );
-
- if (result==NULL)
- exit_pydraw(sc, 1);
-
- PyGILState_Release(gilstate);
- }
- return 1;
-}
-// XXX - not used yet, listeners dont get a context
-int BPY_run_script_space_listener(bContext *C, SpaceScript * sc)
+int BPY_text_exec(bContext *C, struct Text *text, struct ReportList *reports)
{
- if (bpy_run_script_init(C, sc)) {
- PyGILState_STATE gilstate = PyGILState_Ensure();
-
- PyObject *result = PyObject_CallObject( sc->script->py_draw, NULL );
-
- if (result==NULL)
- exit_pydraw(sc, 1);
-
- PyGILState_Release(gilstate);
- }
- return 1;
+ return python_script_exec(C, NULL, text, reports);
}
void BPY_DECREF(void *pyob_ptr)
@@ -466,61 +479,12 @@ void BPY_DECREF(void *pyob_ptr)
PyGILState_Release(gilstate);
}
-#if 0
-/* called from the the scripts window, assume context is ok */
-int BPY_run_python_script_space(const char *modulename, const char *func)
-{
- PyObject *py_dict, *py_result= NULL;
- char pystring[512];
- PyGILState_STATE gilstate;
-
- /* for calling the module function */
- PyObject *py_func,
-
- gilstate = PyGILState_Ensure();
-
- py_dict = bpy_namespace_dict_new("<dummy>");
-
- PyObject *module = PyImport_ImportModule(scpt->script.filename);
- if (module==NULL) {
- PyErr_SetFormat(PyExc_SystemError, "could not import '%s'", scpt->script.filename);
- }
- else {
- py_func = PyObject_GetAttrString(modulename, func);
- if (py_func==NULL) {
- PyErr_SetFormat(PyExc_SystemError, "module has no function '%s.%s'\n", scpt->script.filename, func);
- }
- else {
- Py_DECREF(py_func);
- if (!PyCallable_Check(py_func)) {
- PyErr_SetFormat(PyExc_SystemError, "module item is not callable '%s.%s'\n", scpt->script.filename, func);
- }
- else {
- py_result= PyObject_CallObject(py_func, NULL); // XXX will need args eventually
- }
- }
- }
-
- if (!py_result) {
- BPy_errors_to_report(NULL); // TODO - reports
- } else
- Py_DECREF( py_result );
-
- Py_XDECREF(module);
-
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
- PyGILState_Release(gilstate);
- return 1;
-}
-#endif
-
-
-int BPY_eval_button(bContext *C, const char *expr, double *value)
+int BPY_button_exec(bContext *C, const char *expr, double *value)
{
PyGILState_STATE gilstate;
PyObject *py_dict, *mod, *retval;
int error_ret = 0;
+ PyObject *main_mod= NULL;
if (!value || !expr) return -1;
@@ -530,8 +494,10 @@ int BPY_eval_button(bContext *C, const char *expr, double *value)
}
bpy_context_set(C, &gilstate);
-
- py_dict= bpy_namespace_dict_new("<blender button>");
+
+ PyC_MainModule_Backup(&main_mod);
+
+ py_dict= PyC_DefaultNameSpace("<blender button>");
mod = PyImport_ImportModule("math");
if (mod) {
@@ -581,16 +547,17 @@ int BPY_eval_button(bContext *C, const char *expr, double *value)
BPy_errors_to_report(CTX_wm_reports(C));
}
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
+ PyC_MainModule_Backup(&main_mod);
bpy_context_clear(C, &gilstate);
return error_ret;
}
-int BPY_eval_string(bContext *C, const char *expr)
+int BPY_string_exec(bContext *C, const char *expr)
{
PyGILState_STATE gilstate;
+ PyObject *main_mod= NULL;
PyObject *py_dict, *retval;
int error_ret = 0;
@@ -602,7 +569,9 @@ int BPY_eval_string(bContext *C, const char *expr)
bpy_context_set(C, &gilstate);
- py_dict= bpy_namespace_dict_new("<blender string>");
+ PyC_MainModule_Backup(&main_mod);
+
+ py_dict= PyC_DefaultNameSpace("<blender string>");
retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
@@ -615,15 +584,15 @@ int BPY_eval_string(bContext *C, const char *expr)
Py_DECREF(retval);
}
- PyDict_SetItemString(PyThreadState_GET()->interp->modules, "__main__", Py_None);
-
+ PyC_MainModule_Restore(main_mod);
+
bpy_context_clear(C, &gilstate);
return error_ret;
}
-void BPY_load_user_modules(bContext *C)
+void BPY_modules_load_user(bContext *C)
{
PyGILState_STATE gilstate;
Main *bmain= CTX_data_main(C);
@@ -656,7 +625,7 @@ void BPY_load_user_modules(bContext *C)
bpy_context_clear(C, &gilstate);
}
-int BPY_context_get(bContext *C, const char *member, bContextDataResult *result)
+int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
{
PyObject *pyctx= (PyObject *)CTX_py_dict_get(C);
PyObject *item= PyDict_GetItemString(pyctx, member);
@@ -719,3 +688,102 @@ int BPY_context_get(bContext *C, const char *member, bContextDataResult *result)
return done;
}
+
+#ifdef WITH_PYTHON_MODULE
+#include "BLI_storage.h"
+/* TODO, reloading the module isnt functional at the moment. */
+
+extern int main_python(int argc, const char **argv);
+static struct PyModuleDef bpy_proxy_def = {
+ PyModuleDef_HEAD_INIT,
+ "bpy", /* m_name */
+ NULL, /* m_doc */
+ 0, /* m_size */
+ NULL, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
+
+typedef struct {
+ PyObject_HEAD
+ /* Type-specific fields go here. */
+ PyObject *mod;
+} dealloc_obj;
+
+/* call once __file__ is set */
+void bpy_module_delay_init(PyObject *bpy_proxy)
+{
+ const int argc= 1;
+ const char *argv[2];
+
+ const char *filename_rel= PyModule_GetFilename(bpy_proxy); /* can be relative */
+ char filename_abs[1024];
+
+ BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs));
+ BLI_path_cwd(filename_abs);
+
+ argv[0]= filename_abs;
+ argv[1]= NULL;
+
+ // printf("module found %s\n", argv[0]);
+
+ main_python(argc, argv);
+
+ /* initialized in BPy_init_modules() */
+ PyDict_Update(PyModule_GetDict(bpy_proxy), PyModule_GetDict(bpy_package_py));
+}
+
+static void dealloc_obj_dealloc(PyObject *self);
+
+static PyTypeObject dealloc_obj_Type = {{{0}}};
+
+/* use our own dealloc so we can free a property if we use one */
+static void dealloc_obj_dealloc(PyObject *self)
+{
+ bpy_module_delay_init(((dealloc_obj *)self)->mod);
+
+ /* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
+ dealloc_obj_Type.tp_free(self);
+}
+
+PyMODINIT_FUNC
+PyInit_bpy(void)
+{
+ PyObject *bpy_proxy= PyModule_Create(&bpy_proxy_def);
+
+ /* Problem:
+ * 1) this init function is expected to have a private member defined - 'md_def'
+ * but this is only set for C defined modules (not py packages)
+ * so we cant return 'bpy_package_py' as is.
+ *
+ * 2) there is a 'bpy' C module for python to load which is basically all of blender,
+ * and there is scripts/bpy/__init__.py,
+ * we may end up having to rename this module so there is no naming conflict here eg:
+ * 'from blender import bpy'
+ *
+ * 3) we dont know the filename at this point, workaround by assigning a dummy value
+ * which calls back when its freed so the real loading can take place.
+ */
+
+ /* assign an object which is freed after __file__ is assigned */
+ dealloc_obj *dob;
+
+ /* assign dummy type */
+ dealloc_obj_Type.tp_name = "dealloc_obj";
+ dealloc_obj_Type.tp_basicsize = sizeof(dealloc_obj);
+ dealloc_obj_Type.tp_dealloc = dealloc_obj_dealloc;
+ dealloc_obj_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+
+ if(PyType_Ready(&dealloc_obj_Type) < 0)
+ return NULL;
+
+ dob= (dealloc_obj *) dealloc_obj_Type.tp_alloc(&dealloc_obj_Type, 0);
+ dob->mod= bpy_proxy; /* borrow */
+ PyModule_AddObject(bpy_proxy, "__file__", (PyObject *)dob); /* borrow */
+
+ return bpy_proxy;
+}
+
+#endif
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 242a9e1fe5c..cb527f562eb 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -24,14 +24,18 @@
*/
/* Note, this module is not to be used directly by the user.
- * its accessed from blender with bpy.__ops__
+ * Internally its exposed as '_bpy.ops', which provides functions for 'bpy.ops', a python package.
* */
+#include <Python.h>
+
#include "bpy_operator.h"
#include "bpy_operator_wrap.h"
#include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */
#include "bpy_util.h"
+#include "BLI_utildefines.h"
+
#include "RNA_enum_types.h"
#include "WM_api.h"
@@ -39,30 +43,53 @@
#include "MEM_guardedalloc.h"
#include "BKE_report.h"
+#include "BKE_context.h"
-static PyObject *pyop_poll( PyObject * self, PyObject * args)
+static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
char *opname;
PyObject *context_dict= NULL; /* optional args */
PyObject *context_dict_back;
+ char *context_str= NULL;
PyObject *ret;
+ int context= WM_OP_EXEC_DEFAULT;
+
// XXX Todo, work out a better solution for passing on context, could make a tuple from self and pack the name and Context into it...
- bContext *C = BPy_GetContext();
+ bContext *C= (bContext *)BPy_GetContext();
- if (!PyArg_ParseTuple(args, "s|O:_bpy.ops.poll", &opname, &context_dict))
+ if(C==NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators");
+ return NULL;
+ }
+
+ if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str))
return NULL;
ot= WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
- PyErr_Format(PyExc_SystemError, "Polling operator \"bpy.ops.%s\" error, could not be found", opname);
+ PyErr_Format(PyExc_AttributeError, "Polling operator \"bpy.ops.%s\" error, could not be found", opname);
return NULL;
}
- if(!PyDict_Check(context_dict))
+ if(context_str) {
+ if(RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
+ char *enum_str= BPy_enum_as_string(operator_context_items);
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s.poll\" error, expected a string enum in (%.200s)", opname, enum_str);
+ MEM_freeN(enum_str);
+ return NULL;
+ }
+ }
+
+ if(context_dict==NULL || context_dict==Py_None) {
context_dict= NULL;
+ }
+ else if (!PyDict_Check(context_dict)) {
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s.poll\" error, custom context expected a dict or None, got a %.200s", opname, Py_TYPE(context_dict)->tp_name);
+ return NULL;
+ }
context_dict_back= CTX_py_dict_get(C);
@@ -70,7 +97,7 @@ static PyObject *pyop_poll( PyObject * self, PyObject * args)
Py_XINCREF(context_dict); /* so we done loose it */
/* main purpose of thsi function */
- ret= WM_operator_poll((bContext*)C, ot) ? Py_True : Py_False;
+ ret= WM_operator_poll_context((bContext*)C, ot, context) ? Py_True : Py_False;
/* restore with original context dict, probably NULL but need this for nested operator calls */
Py_XDECREF(context_dict);
@@ -80,7 +107,7 @@ static PyObject *pyop_poll( PyObject * self, PyObject * args)
return ret;
}
-static PyObject *pyop_call( PyObject * self, PyObject * args)
+static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
int error_val = 0;
@@ -97,7 +124,12 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
int context= WM_OP_EXEC_DEFAULT;
// XXX Todo, work out a better solution for passing on context, could make a tuple from self and pack the name and Context into it...
- bContext *C = BPy_GetContext();
+ bContext *C = (bContext *)BPy_GetContext();
+
+ if(C==NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators");
+ return NULL;
+ }
if (!PyArg_ParseTuple(args, "sO|O!s:_bpy.ops.call", &opname, &context_dict, &PyDict_Type, &kw, &context_str))
return NULL;
@@ -105,10 +137,15 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
ot= WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
- PyErr_Format( PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname);
+ PyErr_Format(PyExc_AttributeError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname);
return NULL;
}
+ if(!pyrna_write_check()) {
+ PyErr_Format(PyExc_RuntimeError, "Calling operator \"bpy.ops.%s\" error, can't modify blend data in this state (drawing/rendering)", opname);
+ return NULL;
+ }
+
if(context_str) {
if(RNA_enum_value_from_id(operator_context_items, context_str, &context)==0) {
char *enum_str= BPy_enum_as_string(operator_context_items);
@@ -118,20 +155,28 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
}
}
- if(!PyDict_Check(context_dict))
+ if(context_dict==NULL || context_dict==Py_None) {
context_dict= NULL;
+ }
+ else if (!PyDict_Check(context_dict)) {
+ PyErr_Format(PyExc_TypeError, "Calling operator \"bpy.ops.%s\" error, custom context expected a dict or None, got a %.200s", opname, Py_TYPE(context_dict)->tp_name);
+ return NULL;
+ }
context_dict_back= CTX_py_dict_get(C);
CTX_py_dict_set(C, (void *)context_dict);
Py_XINCREF(context_dict); /* so we done loose it */
- if(WM_operator_poll((bContext*)C, ot) == FALSE) {
- PyErr_Format( PyExc_SystemError, "Operator bpy.ops.%.200s.poll() failed, context is incorrect", opname);
+ if(WM_operator_poll_context((bContext*)C, ot, context) == FALSE) {
+ const char *msg= CTX_wm_operator_poll_msg_get(C);
+ PyErr_Format(PyExc_RuntimeError, "Operator bpy.ops.%.200s.poll() %.200s", opname, msg ? msg : "failed, context is incorrect");
+ CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */
error_val= -1;
}
else {
WM_operator_properties_create_ptr(&ptr, ot);
+ WM_operator_properties_sanitize(&ptr, 0);
if(kw && PyDict_Size(kw))
error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: ");
@@ -145,7 +190,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
operator_ret= WM_operator_call_py(C, ot, context, &ptr, reports);
- if(BPy_reports_to_error(reports))
+ if(BPy_reports_to_error(reports, FALSE))
error_val = -1;
/* operator output is nice to have in the terminal/console too */
@@ -189,12 +234,18 @@ static PyObject *pyop_call( PyObject * self, PyObject * args)
return NULL;
}
+ /* when calling bpy.ops.wm.read_factory_settings() bpy.data's main pointer is freed by clear_globals(),
+ * further access will crash blender. setting context is not needed in this case, only calling because this
+ * function corrects bpy.data (internal Main pointer) */
+ BPY_modules_update(C);
+
+
/* return operator_ret as a bpy enum */
return pyrna_enum_bitfield_to_py(operator_return_items, operator_ret);
}
-static PyObject *pyop_as_string( PyObject * self, PyObject * args)
+static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
PointerRNA ptr;
@@ -207,15 +258,20 @@ static PyObject *pyop_as_string( PyObject * self, PyObject * args)
char *buf = NULL;
PyObject *pybuf;
- bContext *C = BPy_GetContext();
+ bContext *C= (bContext *)BPy_GetContext();
+ if(C==NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "Context is None, cant get the string representation of this object.");
+ return NULL;
+ }
+
if (!PyArg_ParseTuple(args, "s|O!i:_bpy.ops.as_string", &opname, &PyDict_Type, &kw, &all_args))
return NULL;
ot= WM_operatortype_find(opname, TRUE);
if (ot == NULL) {
- PyErr_Format( PyExc_SystemError, "_bpy.ops.as_string: operator \"%s\"could not be found", opname);
+ PyErr_Format(PyExc_AttributeError, "_bpy.ops.as_string: operator \"%.200s\"could not be found", opname);
return NULL;
}
@@ -246,7 +302,7 @@ static PyObject *pyop_as_string( PyObject * self, PyObject * args)
return pybuf;
}
-static PyObject *pyop_dir(PyObject *self)
+static PyObject *pyop_dir(PyObject *UNUSED(self))
{
PyObject *list = PyList_New(0), *name;
wmOperatorType *ot;
@@ -260,7 +316,7 @@ static PyObject *pyop_dir(PyObject *self)
return list;
}
-static PyObject *pyop_getrna(PyObject *self, PyObject *value)
+static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
{
wmOperatorType *ot;
PointerRNA ptr;
@@ -282,6 +338,7 @@ static PyObject *pyop_getrna(PyObject *self, PyObject *value)
/* XXX - should call WM_operator_properties_free */
WM_operator_properties_create_ptr(&ptr, ot);
+ WM_operator_properties_sanitize(&ptr, 0);
pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
@@ -289,24 +346,30 @@ static PyObject *pyop_getrna(PyObject *self, PyObject *value)
return (PyObject *)pyrna;
}
-PyObject *BPY_operator_module( void )
+static struct PyMethodDef bpy_ops_methods[] = {
+ {"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL},
+ {"call", (PyCFunction) pyop_call, METH_VARARGS, NULL},
+ {"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL},
+ {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL},
+ {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL},
+ {"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL},
+ {NULL, NULL, 0, NULL}
+};
+
+static struct PyModuleDef bpy_ops_module = {
+ PyModuleDef_HEAD_INIT,
+ "_bpy.ops",
+ NULL,
+ -1,/* multiple "initialization" just copies the module dict. */
+ bpy_ops_methods,
+ NULL, NULL, NULL, NULL
+};
+
+PyObject *BPY_operator_module(void)
{
- static PyMethodDef pyop_poll_meth = {"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL};
- static PyMethodDef pyop_call_meth = {"call", (PyCFunction) pyop_call, METH_VARARGS, NULL};
- static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL};
- static PyMethodDef pyop_dir_meth = {"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL};
- static PyMethodDef pyop_getrna_meth = {"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL};
- static PyMethodDef pyop_macro_def_meth ={"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL};
-
- PyObject *submodule = PyModule_New("_bpy.ops");
- PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy.ops", submodule);
-
- PyModule_AddObject( submodule, "poll", PyCFunction_New(&pyop_poll_meth, NULL) );
- PyModule_AddObject( submodule, "call", PyCFunction_New(&pyop_call_meth, NULL) );
- PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) );
- PyModule_AddObject( submodule, "dir", PyCFunction_New(&pyop_dir_meth, NULL) );
- PyModule_AddObject( submodule, "get_rna", PyCFunction_New(&pyop_getrna_meth, NULL) );
- PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth, NULL) );
+ PyObject *submodule;
+
+ submodule= PyModule_Create(&bpy_ops_module);
return submodule;
}
diff --git a/source/blender/python/intern/bpy_operator.h b/source/blender/python/intern/bpy_operator.h
index 1d256047eae..a8bf8436e83 100644
--- a/source/blender/python/intern/bpy_operator.h
+++ b/source/blender/python/intern/bpy_operator.h
@@ -1,6 +1,5 @@
-
-/**
- * $Id: bpy_operator.h 21094 2009-06-23 00:09:26Z gsrb3d $
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,13 +24,6 @@
#ifndef BPY_OPERATOR_H
#define BPY_OPERATOR_H
-#include <Python.h>
-
-#include "RNA_access.h"
-#include "RNA_types.h"
-#include "DNA_windowmanager_types.h"
-#include "BKE_context.h"
-
extern PyTypeObject pyop_base_Type;
#define BPy_OperatorBase_Check(v) (PyObject_TypeCheck(v, &pyop_base_Type))
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index c1698a8d751..f890ab81948 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -22,10 +22,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "bpy_operator_wrap.h"
#include "WM_api.h"
#include "WM_types.h"
+#include "BLI_utildefines.h"
+
#include "RNA_define.h"
#include "bpy_rna.h"
@@ -83,7 +87,7 @@ void macro_wrapper(wmOperatorType *ot, void *userdata)
operator_properties_init(ot);
}
-PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args)
+PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
wmOperatorTypeMacro *otmacro;
diff --git a/source/blender/python/intern/bpy_operator_wrap.h b/source/blender/python/intern/bpy_operator_wrap.h
index c6c34559e14..599a42f7bd8 100644
--- a/source/blender/python/intern/bpy_operator_wrap.h
+++ b/source/blender/python/intern/bpy_operator_wrap.h
@@ -1,6 +1,5 @@
-
-/**
- * $Id: bpy_operator_wrap.h 21094 2009-06-23 00:09:26Z gsrb3d $
+/*
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,8 +24,13 @@
#ifndef BPY_OPERATOR_WRAP_H
#define BPY_OPERATOR_WRAP_H
-#include <Python.h>
+struct wmOperatorType;
/* these are used for operator methods, used by bpy_operator.c */
PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args);
+
+/* exposed to rna/wm api */
+void operator_wrapper(struct wmOperatorType *ot, void *userdata);
+void macro_wrapper(struct wmOperatorType *ot, void *userdata);
+
#endif
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 9ae7507a72a..c8af0d63e3b 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,11 +22,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "bpy_props.h"
#include "bpy_rna.h"
#include "bpy_util.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
#include "RNA_define.h" /* for defining our own rna */
#include "RNA_enum_types.h"
@@ -35,13 +37,19 @@
#include "../generic/py_capi_utils.h"
-EnumPropertyItem property_flag_items[] = {
+static EnumPropertyItem property_flag_items[] = {
+ {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
+ {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
+ {0, NULL, 0, NULL, NULL}};
+
+static EnumPropertyItem property_flag_enum_items[] = {
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
+ {PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""},
{0, NULL, 0, NULL, NULL}};
/* subtypes */
-EnumPropertyItem property_subtype_string_items[] = {
+static EnumPropertyItem property_subtype_string_items[] = {
{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
{PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""},
{PROP_FILENAME, "FILENAME", 0, "Filename", ""},
@@ -49,7 +57,7 @@ EnumPropertyItem property_subtype_string_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem property_subtype_number_items[] = {
+static EnumPropertyItem property_subtype_number_items[] = {
{PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
{PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
{PROP_FACTOR, "FACTOR", 0, "Factor", ""},
@@ -60,7 +68,7 @@ EnumPropertyItem property_subtype_number_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem property_subtype_array_items[] = {
+static EnumPropertyItem property_subtype_array_items[] = {
{PROP_COLOR, "COLOR", 0, "Color", ""},
{PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
{PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
@@ -77,19 +85,93 @@ EnumPropertyItem property_subtype_array_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-/* operators use this so it can store the args given but defer running
- * it until the operator runs where these values are used to setup the
- * default args for that operator instance */
-static PyObject *bpy_prop_deferred_return(void *func, PyObject *kw)
+/* PyObject's */
+static PyObject *pymeth_BoolProperty = NULL;
+static PyObject *pymeth_BoolVectorProperty = NULL;
+static PyObject *pymeth_IntProperty = NULL;
+static PyObject *pymeth_IntVectorProperty = NULL;
+static PyObject *pymeth_FloatProperty = NULL;
+static PyObject *pymeth_FloatVectorProperty = NULL;
+static PyObject *pymeth_StringProperty = NULL;
+static PyObject *pymeth_EnumProperty = NULL;
+static PyObject *pymeth_PointerProperty = NULL;
+static PyObject *pymeth_CollectionProperty = NULL;
+static PyObject *pymeth_RemoveProperty = NULL;
+
+
+/* operators and classes use this so it can store the args given but defer
+ * running it until the operator runs where these values are used to setup
+ * the default args for that operator instance */
+static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
{
PyObject *ret = PyTuple_New(2);
- PyTuple_SET_ITEM(ret, 0, PyCapsule_New(func, NULL, NULL));
- if(kw==NULL) kw= PyDict_New();
- else Py_INCREF(kw);
+ PyTuple_SET_ITEM(ret, 0, func);
+ Py_INCREF(func);
+
+ if(kw==NULL)
+ kw= PyDict_New();
+ else
+ Py_INCREF(kw);
+
PyTuple_SET_ITEM(ret, 1, kw);
+
return ret;
}
+/* this define runs at the start of each function and deals with
+ * returning a deferred property (to be registed later) */
+#define BPY_PROPDEF_HEAD(_func) \
+ if (PyTuple_GET_SIZE(args) == 1) { \
+ PyObject *ret; \
+ self= PyTuple_GET_ITEM(args, 0); \
+ args= PyTuple_New(0); \
+ ret= BPy_##_func(self, args, kw); \
+ Py_DECREF(args); \
+ return ret; \
+ } \
+ else if (PyTuple_GET_SIZE(args) > 1) { \
+ PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
+ return NULL; \
+ } \
+ srna= srna_from_self(self, #_func"(...):"); \
+ if(srna==NULL) { \
+ if(PyErr_Occurred()) \
+ return NULL; \
+ return bpy_prop_deferred_return((void *)pymeth_##_func, kw); \
+ } \
+
+/* terse macros for error checks shared between all funcs cant use function
+ * calls because of static strins passed to pyrna_set_to_enum_bitfield */
+#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if(id_len >= MAX_IDPROP_NAME) { \
+ PyErr_Format(PyExc_TypeError, #_func"(): '%.200s' too long, max length is %d", id, MAX_IDPROP_NAME-1); \
+ return NULL; \
+ } \
+ if(RNA_def_property_free_identifier(srna, id) == -1) { \
+ PyErr_Format(PyExc_TypeError, #_func"(): '%s' is defined as a non-dynamic type", id); \
+ return NULL; \
+ } \
+ if(pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, pyopts, &opts, #_func"(options={...}):")) \
+ return NULL; \
+
+#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \
+ BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if(pysubtype && RNA_enum_value_from_id(_subtype, pysubtype, &subtype)==0) { \
+ PyErr_Format(PyExc_TypeError, #_func"(subtype='%s'): invalid subtype", pysubtype); \
+ return NULL; \
+ } \
+
+
+#define BPY_PROPDEF_NAME_DOC \
+" :arg name: Name used in the user interface.\n" \
+" :type name: string\n" \
+
+
+#define BPY_PROPDEF_DESC_DOC \
+" :arg description: Text used for the tooltip and api documentation.\n" \
+" :type description: string\n" \
+
+
#if 0
static int bpy_struct_id_used(StructRNA *srna, char *identifier)
{
@@ -102,32 +184,28 @@ static int bpy_struct_id_used(StructRNA *srna, char *identifier)
/* Function that sets RNA, NOTE - self is NULL when called from python, but being abused from C so we can pass the srna allong
* This isnt incorrect since its a python object - but be careful */
-char BPy_BoolProperty_doc[] =
+static char BPy_BoolProperty_doc[] =
".. function:: BoolProperty(name=\"\", description=\"\", default=False, options={'ANIMATABLE'}, subtype='NONE')\n"
"\n"
" Returns a new boolean property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n"
-" :type subtype: string";
-
-PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+;
+static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(BoolProperty)
- srna= srna_from_self(self, "BoolProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
- static char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="";
+ if(srna) {
+ static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", NULL};
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int def=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -135,23 +213,11 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiO!s:BoolProperty", (char **)kwlist, &id, &name, &description, &def, &PySet_Type, &pyopts, &pysubtype))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssiO!s:BoolProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "BoolProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolProperty(options={...}):"))
- return NULL;
+ BPY_PROPDEF_SUBTYPE_CHECK(BoolProperty, property_flag_items, property_subtype_number_items)
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "BoolProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
-
- // prop= RNA_def_boolean(srna, id, def, name, description);
prop= RNA_def_property(srna, id, PROP_BOOLEAN, subtype);
RNA_def_property_boolean_default(prop, def);
RNA_def_property_ui_text(prop, name, description);
@@ -160,39 +226,38 @@ PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_BoolProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+
+ Py_RETURN_NONE;
}
-char BPy_BoolVectorProperty_doc[] =
+static char BPy_BoolVectorProperty_doc[] =
".. function:: BoolVectorProperty(name=\"\", description=\"\", default=(False, False, False), options={'ANIMATABLE'}, subtype='NONE', size=3)\n"
"\n"
" Returns a new vector boolean property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
+" :arg default: sequence of booleans the length of *size*.\n"
+" :type default: sequence\n"
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
-" :type subtype: string";
-PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :type size: int\n"
+;
+static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(BoolVectorProperty)
- srna= srna_from_self(self, "BoolVectorProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int def[PYRNA_STACK_ARRAY]={0};
int size=3;
PropertyRNA *prop;
@@ -202,24 +267,13 @@ PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &PySet_Type, &pyopts, &pysubtype, &size))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "BoolVectorProperty(options={...}):"))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOO!si:BoolVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(BoolVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "BoolVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "BoolVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -236,39 +290,34 @@ PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_BoolVectorProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+
+ Py_RETURN_NONE;
}
-char BPy_IntProperty_doc[] =
+static char BPy_IntProperty_doc[] =
".. function:: IntProperty(name=\"\", description=\"\", default=0, min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, step=1, options={'ANIMATABLE'}, subtype='NONE')\n"
"\n"
" Returns a new int property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n"
-" :type subtype: string";
-PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+;
+static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(IntProperty)
- srna= srna_from_self(self, "IntProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -276,21 +325,10 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "IntProperty(): '%s' is defined as a non-dynamic type.", id);
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssiiiiiiO!s:IntProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- }
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "IntProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(IntProperty, property_flag_items, property_subtype_number_items)
prop= RNA_def_property(srna, id, PROP_INT, subtype);
RNA_def_property_int_default(prop, def);
@@ -302,39 +340,37 @@ PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_IntProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+ Py_RETURN_NONE;
}
-char BPy_IntVectorProperty_doc[] =
+static char BPy_IntVectorProperty_doc[] =
".. function:: IntVectorProperty(name=\"\", description=\"\", default=(0, 0, 0), min=-sys.maxint, max=sys.maxint, soft_min=-sys.maxint, soft_max=sys.maxint, options={'ANIMATABLE'}, subtype='NONE', size=3)\n"
"\n"
" Returns a new vector int property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
+" :arg default: sequence of ints the length of *size*.\n"
+" :type default: sequence\n"
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
-" :type subtype: string";
-PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :type size: int\n"
+;
+static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(IntVectorProperty)
- srna= srna_from_self(self, "IntVectorProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def[PYRNA_STACK_ARRAY]={0};
int size=3;
PropertyRNA *prop;
@@ -344,24 +380,13 @@ PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOiiiiO!si:IntVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &PySet_Type, &pyopts, &pysubtype, &size))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOiiiiiO!si:IntVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "IntVectorProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(IntVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "IntVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "IntVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -379,42 +404,36 @@ PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_IntVectorProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+ Py_RETURN_NONE;
}
-char BPy_FloatProperty_doc[] =
+static char BPy_FloatProperty_doc[] =
".. function:: FloatProperty(name=\"\", description=\"\", default=0.0, min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', unit='NONE')\n"
"\n"
" Returns a new float property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n"
" :type subtype: string\n"
" :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION'].\n"
-" :type unit: string\n";
-PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type unit: string\n"
+;
+static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(FloatProperty)
- srna= srna_from_self(self, "FloatProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "unit", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def=0.0f;
int precision= 2;
PropertyRNA *prop;
@@ -425,24 +444,13 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pyunit= NULL;
int unit= PROP_UNIT_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &pyunit))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatProperty(options={...}):"))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssffffffiO!ss:FloatProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &pyunit))
return NULL;
- if(pysubtype && RNA_enum_value_from_id(property_subtype_number_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(FloatProperty, property_flag_items, property_subtype_number_items)
if(pyunit && RNA_enum_value_from_id(property_unit_items, pyunit, &unit)==0) {
- PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit.");
+ PyErr_Format(PyExc_TypeError, "FloatProperty(unit='%s'): invalid unit");
return NULL;
}
@@ -456,39 +464,37 @@ PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_FloatProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+ Py_RETURN_NONE;
}
-char BPy_FloatVectorProperty_doc[] =
+static char BPy_FloatVectorProperty_doc[] =
".. function:: FloatVectorProperty(name=\"\", description=\"\", default=(0.0, 0.0, 0.0), min=sys.float_info.min, max=sys.float_info.max, soft_min=sys.float_info.min, soft_max=sys.float_info.max, step=3, precision=2, options={'ANIMATABLE'}, subtype='NONE', size=3)\n"
"\n"
" Returns a new vector float property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
+" :arg default: sequence of floats the length of *size*.\n"
+" :type default: sequence\n"
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
-" :type subtype: string";
-PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :type size: int\n"
+;
+static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(FloatVectorProperty)
- srna= srna_from_self(self, "FloatVectorProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "size", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def[PYRNA_STACK_ARRAY]={0.0f};
int precision= 2, size=3;
PropertyRNA *prop;
@@ -498,24 +504,13 @@ PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, &id, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &size))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|ssOfffffiO!si:FloatVectorProperty", (char **)kwlist, &id, &id_len, &name, &description, &pydef, &min, &max, &soft_min, &soft_max, &step, &precision, &PySet_Type, &pyopts, &pysubtype, &size))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "FloatVectorProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_array_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(FloatVectorProperty, property_flag_items, property_subtype_array_items)
if(size < 1 || size > PYRNA_STACK_ARRAY) {
- PyErr_Format(PyExc_TypeError, "FloatVectorProperty(size=%d): size must be between 0 and %d.", size, PYRNA_STACK_ARRAY);
+ PyErr_Format(PyExc_TypeError, "FloatVectorProperty(size=%d): size must be between 0 and " STRINGIFY(PYRNA_STACK_ARRAY), size);
return NULL;
}
@@ -533,39 +528,33 @@ PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_FloatVectorProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+ Py_RETURN_NONE;
}
-char BPy_StringProperty_doc[] =
+static char BPy_StringProperty_doc[] =
".. function:: StringProperty(name=\"\", description=\"\", default=\"\", maxlen=0, options={'ANIMATABLE'}, subtype='NONE')\n"
"\n"
" Returns a new string property definition.\n"
"\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
" :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILENAME', 'NONE'].\n"
-" :type subtype: string";
-PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type subtype: string\n"
+;
+static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(StringProperty)
- srna= srna_from_self(self, "StringProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "name", "description", "default", "maxlen", "options", "subtype", NULL};
- char *id=NULL, *name="", *description="", *def="";
+ const char *id=NULL, *name="", *description="", *def="";
+ int id_len;
int maxlen=0;
PropertyRNA *prop;
PyObject *pyopts= NULL;
@@ -573,21 +562,10 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
char *pysubtype= NULL;
int subtype= PROP_NONE;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "s|sssiO!s:StringProperty", (char **)kwlist, &id, &name, &description, &def, &maxlen, &PySet_Type, &pyopts, &pysubtype))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "StringProperty(): '%s' is defined as a non-dynamic type.", id);
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|sssiO!s:StringProperty", (char **)kwlist, &id, &id_len, &name, &description, &def, &maxlen, &PySet_Type, &pyopts, &pysubtype))
return NULL;
- }
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "StringProperty(options={...}):"))
- return NULL;
-
- if(pysubtype && RNA_enum_value_from_id(property_subtype_string_items, pysubtype, &subtype)==0) {
- PyErr_Format(PyExc_TypeError, "StringProperty(subtype='%s'): invalid subtype.", pysubtype);
- return NULL;
- }
+ BPY_PROPDEF_SUBTYPE_CHECK(StringProperty, property_flag_items, property_subtype_string_items)
prop= RNA_def_property(srna, id, PROP_STRING, subtype);
if(maxlen != 0) RNA_def_property_string_maxlength(prop, maxlen + 1); /* +1 since it includes null terminator */
@@ -598,185 +576,221 @@ PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_StringProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
+ Py_RETURN_NONE;
}
-static EnumPropertyItem *enum_items_from_py(PyObject *value, const char *def, int *defvalue)
+static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, int *defvalue, const short is_enum_flag)
{
EnumPropertyItem *items= NULL;
PyObject *item;
int seq_len, i, totitem= 0;
+ short def_used= 0;
+ const char *def_cmp= NULL;
- if(!PySequence_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of tuples for the enum items");
- return NULL;
+ seq_len= PySequence_Fast_GET_SIZE(seq_fast);
+
+ if(is_enum_flag) {
+ if(seq_len > RNA_ENUM_BITFLAG_SIZE) {
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): maximum " STRINGIFY(RNA_ENUM_BITFLAG_SIZE) " members for a ENUM_FLAG type property");
+ return NULL;
+ }
+ if(def && !PySet_Check(def)) {
+ PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'set' type when ENUM_FLAG is enabled, not a '%.200s'", Py_TYPE(def)->tp_name);
+ return NULL;
+ }
}
+ else {
+ if(def) {
+ def_cmp= _PyUnicode_AsString(def);
+ if(def_cmp==NULL) {
+ PyErr_Format(PyExc_TypeError, "EnumProperty(...): default option must be a 'str' type when ENUM_FLAG is disabled, not a '%.200s'", Py_TYPE(def)->tp_name);
+ return NULL;
+ }
+ }
+ }
+
+ /* blank value */
+ *defvalue= 0;
- seq_len = PySequence_Length(value);
for(i=0; i<seq_len; i++) {
EnumPropertyItem tmp= {0, "", 0, "", ""};
- item= PySequence_GetItem(value, i);
- if(item==NULL || PyTuple_Check(item)==0) {
- PyErr_SetString(PyExc_TypeError, "expected a sequence of tuples for the enum items");
+ item= PySequence_Fast_GET_ITEM(seq_fast, i);
+ if(PyTuple_Check(item)==0) {
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): expected a sequence of tuples for the enum items");
if(items) MEM_freeN(items);
- Py_XDECREF(item);
return NULL;
}
if(!PyArg_ParseTuple(item, "sss", &tmp.identifier, &tmp.name, &tmp.description)) {
- PyErr_SetString(PyExc_TypeError, "expected an identifier, name and description in the tuple");
- Py_DECREF(item);
+ PyErr_SetString(PyExc_TypeError, "EnumProperty(...): expected an identifier, name and description in the tuple");
return NULL;
}
- tmp.value= i;
- RNA_enum_item_add(&items, &totitem, &tmp);
+ if(is_enum_flag) {
+ tmp.value= 1<<i;
- if(def[0] && strcmp(def, tmp.identifier) == 0)
- *defvalue= tmp.value;
+ if(def && PySet_Contains(def, PyTuple_GET_ITEM(item, 0))) {
+ *defvalue |= tmp.value;
+ def_used++;
+ }
+ }
+ else {
+ tmp.value= i;
- Py_DECREF(item);
- }
+ if(def && def_used == 0 && strcmp(def_cmp, tmp.identifier)==0) {
+ *defvalue= tmp.value;
+ def_used++; /* only ever 1 */
+ }
+ }
- if(!def[0])
- *defvalue= 0;
+ RNA_enum_item_add(&items, &totitem, &tmp);
+ }
RNA_enum_item_end(&items, &totitem);
+ if(is_enum_flag) {
+ /* strict check that all set members were used */
+ if(def && def_used != PySet_GET_SIZE(def)) {
+ MEM_freeN(items);
+
+ PyErr_Format(PyExc_TypeError, "EnumProperty(..., default={...}): set has %d unused member(s)", PySet_GET_SIZE(def) - def_used);
+ return NULL;
+ }
+ }
+ else {
+ if(def && def_used == 0) {
+ MEM_freeN(items);
+
+ PyErr_Format(PyExc_TypeError, "EnumProperty(..., default=\'%s\'): not found in enum members", def);
+ return NULL;
+ }
+ }
+
return items;
}
-char BPy_EnumProperty_doc[] =
+static char BPy_EnumProperty_doc[] =
".. function:: EnumProperty(items, name=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n"
"\n"
" Returns a new enumerator property definition.\n"
"\n"
-" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
+" :arg default: The default value for this enum, A string when *ENUM_FLAG* is disabled otherwise a set which may only contain string identifiers used in *items*.\n"
+" :type default: string or set\n"
+" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE', 'ENUM_FLAG'].\n"
" :type options: set\n"
-" :arg items: The items that make up this enumerator.\n"
-" :type items: sequence of string triplets";
-PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :arg items: sequence of enum items formatted: [(identifier, name, description), ...] where the identifier is used for python access and other values are used for the interface.\n"
+" :type items: sequence of string triplets\n"
+;
+static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
-
- srna= srna_from_self(self, "EnumProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ BPY_PROPDEF_HEAD(EnumProperty)
+
+ if(srna) {
static const char *kwlist[] = {"attr", "items", "name", "description", "default", "options", NULL};
- char *id=NULL, *name="", *description="", *def="";
+ const char *id=NULL, *name="", *description="";
+ PyObject *def= NULL;
+ int id_len;
int defvalue=0;
- PyObject *items= Py_None;
+ PyObject *items, *items_fast;
EnumPropertyItem *eitems;
PropertyRNA *prop;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|sssO!:EnumProperty", (char **)kwlist, &id, &items, &name, &description, &def, &PySet_Type, &pyopts))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssOO!:EnumProperty", (char **)kwlist, &id, &id_len, &items, &name, &description, &def, &PySet_Type, &pyopts))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "EnumProperty(): '%s' is defined as a non-dynamic type.", id);
+ BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items)
+
+ if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items"))) {
return NULL;
}
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "EnumProperty(options={...}):"))
- return NULL;
+ eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0);
+
+ Py_DECREF(items_fast);
- eitems= enum_items_from_py(items, def, &defvalue);
if(!eitems)
return NULL;
- prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+ if(opts & PROP_ENUM_FLAG) prop= RNA_def_enum_flag(srna, id, eitems, defvalue, name, description);
+ else prop= RNA_def_enum(srna, id, eitems, defvalue, name, description);
+
if(pyopts) {
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
+ RNA_def_property_duplicate_pointers(srna, prop);
MEM_freeN(eitems);
-
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_EnumProperty, kw);
}
+ Py_RETURN_NONE;
}
static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix)
{
StructRNA *srna;
- srna= srna_from_self(value, "BoolProperty(...):");
+ srna= srna_from_self(value, "");
if(!srna) {
-
- PyObject *msg= PyC_ExceptionBuffer();
- char *msg_char= _PyUnicode_AsString(msg);
- PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with: %s", error_prefix, msg_char);
- Py_DECREF(msg);
+ if(PyErr_Occurred()) {
+ PyObject *msg= PyC_ExceptionBuffer();
+ char *msg_char= _PyUnicode_AsString(msg);
+ PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup, failed with: %s", error_prefix, msg_char);
+ Py_DECREF(msg);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup, failed with type '%s'", error_prefix, Py_TYPE(value)->tp_name);
+ }
return NULL;
}
- if(!RNA_struct_is_a(srna, &RNA_IDPropertyGroup)) {
- PyErr_Format(PyExc_SystemError, "%.200s expected an RNA type derived from IDPropertyGroup", error_prefix);
+ if(!RNA_struct_is_a(srna, &RNA_PropertyGroup)) {
+ PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix);
return NULL;
}
return srna;
}
-char BPy_PointerProperty_doc[] =
-".. function:: PointerProperty(items, type=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n"
+static char BPy_PointerProperty_doc[] =
+".. function:: PointerProperty(type=\"\", description=\"\", options={'ANIMATABLE'})\n"
"\n"
" Returns a new pointer property definition.\n"
"\n"
+" :arg type: A subclass of :class:`bpy.types.PropertyGroup`.\n"
+" :type type: class\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
-" :arg type: Dynamic type from :mod:`bpy.types`.\n"
-" :type type: class";
-PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw)
+;
+static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(PointerProperty)
- srna= srna_from_self(self, "PointerProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
PropertyRNA *prop;
StructRNA *ptype;
PyObject *type= Py_None;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:PointerProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts))
- return NULL;
-
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "PointerProperty(): '%s' is defined as a non-dynamic type.", id);
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssO!:PointerProperty", (char **)kwlist, &id, &id_len, &type, &name, &description, &PySet_Type, &pyopts))
return NULL;
- }
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "PointerProperty(options={...}):"))
- return NULL;
+ BPY_PROPDEF_CHECK(PointerProperty, property_flag_items)
ptype= pointer_type_from_py(type, "PointerProperty(...):");
if(!ptype)
@@ -787,56 +801,43 @@ PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_PointerProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
- return NULL;
+ Py_RETURN_NONE;
}
-char BPy_CollectionProperty_doc[] =
+static char BPy_CollectionProperty_doc[] =
".. function:: CollectionProperty(items, type=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n"
"\n"
" Returns a new collection property definition.\n"
"\n"
+" :arg type: A subclass of :class:`bpy.types.PropertyGroup`.\n"
+" :type type: class\n"
+BPY_PROPDEF_NAME_DOC
+BPY_PROPDEF_DESC_DOC
" :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n"
" :type options: set\n"
-" :arg type: Dynamic type from :mod:`bpy.types`.\n"
-" :type type: class";
-PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
+;
+static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
- if (PyTuple_GET_SIZE(args) > 0) {
- PyErr_SetString(PyExc_ValueError, "all args must be keywords");
- return NULL;
- }
+ BPY_PROPDEF_HEAD(CollectionProperty)
- srna= srna_from_self(self, "CollectionProperty(...):");
- if(srna==NULL && PyErr_Occurred()) {
- return NULL; /* self's type was compatible but error getting the srna */
- }
- else if(srna) {
+ if(srna) {
static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
- char *id=NULL, *name="", *description="";
+ const char *id=NULL, *name="", *description="";
+ int id_len;
PropertyRNA *prop;
StructRNA *ptype;
PyObject *type= Py_None;
PyObject *pyopts= NULL;
int opts=0;
- if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|ssO!:CollectionProperty", (char **)kwlist, &id, &type, &name, &description, &PySet_Type, &pyopts))
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssO!:CollectionProperty", (char **)kwlist, &id, &id_len, &type, &name, &description, &PySet_Type, &pyopts))
return NULL;
- if(RNA_def_property_free_identifier(srna, id) == -1) {
- PyErr_Format(PyExc_TypeError, "CollectionProperty(): '%s' is defined as a non-dynamic type.", id);
- return NULL;
- }
-
- if(pyopts && pyrna_set_to_enum_bitfield(property_flag_items, pyopts, &opts, "CollectionProperty(options={...}):"))
- return NULL;
+ BPY_PROPDEF_CHECK(CollectionProperty, property_flag_items)
ptype= pointer_type_from_py(type, "CollectionProperty(...):");
if(!ptype)
@@ -847,32 +848,42 @@ PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw)
if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN);
if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
}
- RNA_def_property_duplicate_pointers(prop);
- Py_RETURN_NONE;
- }
- else { /* operators defer running this function */
- return bpy_prop_deferred_return((void *)BPy_CollectionProperty, kw);
+ RNA_def_property_duplicate_pointers(srna, prop);
}
- return NULL;
+ Py_RETURN_NONE;
}
-char BPy_RemoveProperty_doc[] =
+static char BPy_RemoveProperty_doc[] =
".. function:: RemoveProperty(attr)\n"
"\n"
" Removes a dynamically defined property.\n"
"\n"
" :arg attr: Property name.\n"
-" :type attr: string";
-PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw)
+" :type attr: string\n"
+;
+static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw)
{
StructRNA *srna;
+ if(PyTuple_GET_SIZE(args) == 1) {
+ PyObject *ret;
+ self= PyTuple_GET_ITEM(args, 0);
+ args= PyTuple_New(0);
+ ret= BPy_RemoveProperty(self, args, kw);
+ Py_DECREF(args);
+ return ret;
+ }
+ else if (PyTuple_GET_SIZE(args) > 1) {
+ PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
+ return NULL;
+ }
+
srna= srna_from_self(self, "RemoveProperty(...):");
if(srna==NULL && PyErr_Occurred()) {
return NULL; /* self's type was compatible but error getting the srna */
}
else if(srna==NULL) {
- PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type.");
+ PyErr_SetString(PyExc_TypeError, "RemoveProperty(): struct rna not available for this type");
return NULL;
}
else {
@@ -884,12 +895,11 @@ PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw)
return NULL;
if(RNA_def_property_free_identifier(srna, id) != 1) {
- PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property.", id);
+ PyErr_Format(PyExc_TypeError, "RemoveProperty(): '%s' not a defined dynamic property", id);
return NULL;
}
-
- Py_RETURN_NONE;
}
+ Py_RETURN_NONE;
}
static struct PyMethodDef props_methods[] = {
@@ -904,8 +914,7 @@ static struct PyMethodDef props_methods[] = {
{"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS, BPy_PointerProperty_doc},
{"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS, BPy_CollectionProperty_doc},
- /* only useful as a bpy_struct method */
- /* {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS, BPy_RemoveProperty_doc}, */
+ {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS, BPy_RemoveProperty_doc},
{NULL, NULL, 0, NULL}
};
@@ -922,6 +931,8 @@ static struct PyModuleDef props_module = {
PyObject *BPY_rna_props( void )
{
PyObject *submodule;
+ PyObject *submodule_dict;
+
submodule= PyModule_Create(&props_module);
PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
@@ -929,6 +940,23 @@ PyObject *BPY_rna_props( void )
* module with a new ref like PyDict_New, since they are passed to
* PyModule_AddObject which steals a ref */
Py_INCREF(submodule);
-
+
+ /* api needs the PyObjects internally */
+ submodule_dict= PyModule_GetDict(submodule);
+
+#define ASSIGN_STATIC(_name) pymeth_##_name = PyDict_GetItemString(submodule_dict, #_name)
+
+ ASSIGN_STATIC(BoolProperty);
+ ASSIGN_STATIC(BoolVectorProperty);
+ ASSIGN_STATIC(IntProperty);
+ ASSIGN_STATIC(IntVectorProperty);
+ ASSIGN_STATIC(FloatProperty);
+ ASSIGN_STATIC(FloatVectorProperty);
+ ASSIGN_STATIC(StringProperty);
+ ASSIGN_STATIC(EnumProperty);
+ ASSIGN_STATIC(PointerProperty);
+ ASSIGN_STATIC(CollectionProperty);
+ ASSIGN_STATIC(RemoveProperty);
+
return submodule;
}
diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h
index d90b12c0f91..828c6719ffc 100644
--- a/source/blender/python/intern/bpy_props.h
+++ b/source/blender/python/intern/bpy_props.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,36 +25,8 @@
#ifndef BPY_PROPS_H
#define BPY_PROPS_H
-#include <Python.h>
-
PyObject *BPY_rna_props( void );
-/* functions for setting up new props - experemental */
-PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw);
-PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw);
-
-PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw);
-
-extern char BPy_BoolProperty_doc[];
-extern char BPy_BoolVectorProperty_doc[];
-extern char BPy_IntProperty_doc[];
-extern char BPy_IntVectorProperty_doc[];
-extern char BPy_FloatProperty_doc[];
-extern char BPy_FloatVectorProperty_doc[];
-extern char BPy_StringProperty_doc[];
-extern char BPy_EnumProperty_doc[];
-extern char BPy_PointerProperty_doc[];
-extern char BPy_CollectionProperty_doc[];\
-extern char BPy_RemoveProperty_doc[];
-
#define PYRNA_STACK_ARRAY 32
#endif
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index bc688aa1df8..d3bda0e2a5f 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,19 +22,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
+#include <stddef.h>
+#include <float.h> /* FLT_MIN/MAX */
+
#include "bpy_rna.h"
#include "bpy_props.h"
#include "bpy_util.h"
#include "bpy_rna_callback.h"
-//#include "blendef.h"
+
#include "BLI_dynstr.h"
+#include "BLI_string.h"
#include "BLI_listbase.h"
-#include "float.h" /* FLT_MIN/MAX */
+#include "BLI_utildefines.h"
#include "RNA_enum_types.h"
+#include "RNA_define.h" /* RNA_def_property_free_identifier */
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BKE_idcode.h"
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
@@ -48,18 +55,62 @@
#include "DNA_anim_types.h"
#include "ED_keyframing.h"
+#include "../generic/IDProp.h" /* for IDprop lookups */
+#include "../generic/py_capi_utils.h"
+
+#define USE_PEDANTIC_WRITE
#define USE_MATHUTILS
#define USE_STRING_COERCE
+static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
+
+#ifdef USE_PEDANTIC_WRITE
+static short rna_disallow_writes= FALSE;
+
+static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
+{
+ ID *id= ptr->id.data;
+ if(id) {
+ const short idcode= GS(id->name);
+ if(!ELEM(idcode, ID_WM, ID_SCR)) { /* may need more added here */
+ const char *idtype= BKE_idcode_to_name(idcode);
+ const char *pyname;
+ if(key && PyUnicode_Check(key)) pyname= _PyUnicode_AsString(key);
+ else pyname= "<UNKNOWN>";
+
+ /* make a nice string error */
+ BLI_assert(idtype != NULL);
+ PyErr_Format(PyExc_AttributeError, "Writing to ID classes in this context is not allowed: %.200s, %.200s datablock, error setting %.200s.%.200s", id->name+2, idtype, RNA_struct_identifier(ptr->type), pyname);
+
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+#endif // USE_PEDANTIC_WRITE
+
+
+#ifdef USE_PEDANTIC_WRITE
+int pyrna_write_check(void)
+{
+ return !rna_disallow_writes;
+}
+#else // USE_PEDANTIC_WRITE
+int pyrna_write_check(void)
+{
+ return TRUE;
+}
+#endif // USE_PEDANTIC_WRITE
+
+static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
+static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self);
+static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix);
+static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item);
+
#ifdef USE_MATHUTILS
#include "../generic/mathutils.h" /* so we can have mathutils callbacks */
-#include "../generic/IDProp.h" /* for IDprop lookups */
-#include "../generic/py_capi_utils.h"
-static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, void *data, PyObject *value, const char *error_prefix);
-static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length);
-static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self);
-static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self);
+static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length);
static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback);
/* bpyrna vector/euler/quat callbacks */
@@ -82,16 +133,16 @@ static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
-
+
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
-
+
/* Euler order exception */
if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
EulerObject *eul= (EulerObject *)bmo;
PropertyRNA *prop_eul_order= NULL;
eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
}
-
+
return 1;
}
@@ -102,6 +153,12 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
if(self->prop==NULL)
return 0;
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
@@ -117,7 +174,9 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
}
RNA_property_float_set_array(&self->ptr, self->prop, bmo->data);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
/* Euler order exception */
if(subtype==MATHUTILS_CB_SUBTYPE_EUL) {
@@ -126,30 +185,38 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
short order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
if(order != eul->order) {
RNA_property_enum_set(&self->ptr, prop_eul_order, eul->order);
- RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order);
+ if(RNA_property_update_check(prop_eul_order)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, prop_eul_order);
+ }
}
}
return 1;
}
-static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
-
+
bmo->data[index]= RNA_property_float_get_index(&self->ptr, self->prop, index);
return 1;
}
-static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int subtype, int index)
+static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
if(self->prop==NULL)
return 0;
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
@@ -157,11 +224,15 @@ static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int subtype, int
RNA_property_float_clamp(&self->ptr, self->prop, &bmo->data[index]);
RNA_property_float_set_index(&self->ptr, self->prop, index, bmo->data[index]);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
+
return 1;
}
-Mathutils_Callback mathutils_rna_array_cb = {
+static Mathutils_Callback mathutils_rna_array_cb = {
(BaseMathCheckFunc) mathutils_rna_generic_check,
(BaseMathGetFunc) mathutils_rna_vector_get,
(BaseMathSetFunc) mathutils_rna_vector_set,
@@ -173,7 +244,7 @@ Mathutils_Callback mathutils_rna_array_cb = {
/* bpyrna matrix callbacks */
static int mathutils_rna_matrix_cb_index= -1; /* index for our callbacks */
-static int mathutils_rna_matrix_get(BaseMathObject *bmo, int subtype)
+static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
@@ -184,25 +255,34 @@ static int mathutils_rna_matrix_get(BaseMathObject *bmo, int subtype)
return 1;
}
-static int mathutils_rna_matrix_set(BaseMathObject *bmo, int subtype)
+static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
-
+
if(self->prop==NULL)
return 0;
-
+
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
+ return 0;
+ }
+#endif // USE_PEDANTIC_WRITE
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
return 0;
}
-
+
/* can ignore clamping here */
RNA_property_float_set_array(&self->ptr, self->prop, bmo->data);
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
return 1;
}
-Mathutils_Callback mathutils_rna_matrix_cb = {
+static Mathutils_Callback mathutils_rna_matrix_cb = {
mathutils_rna_generic_check,
mathutils_rna_matrix_get,
mathutils_rna_matrix_set,
@@ -210,19 +290,23 @@ Mathutils_Callback mathutils_rna_matrix_cb = {
NULL
};
-/* same as RNA_enum_value_from_id but raises an exception */
-int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
+static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
{
- if(RNA_enum_value_from_id(item, identifier, value) == 0) {
- char *enum_str= BPy_enum_as_string(item);
- PyErr_Format(PyExc_TypeError, "%s: '%.200s' not found in (%s)", error_prefix, identifier, enum_str);
- MEM_freeN(enum_str);
- return -1;
+ /* attempt to get order */
+ if(*prop_eul_order==NULL)
+ *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
+
+ if(*prop_eul_order) {
+ short order= RNA_property_enum_get(ptr, *prop_eul_order);
+ if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
+ return order;
}
- return 0;
+ return order_fallback;
}
+#endif // USE_MATHUTILS
+
#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
@@ -291,7 +375,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
case PROP_QUATERNION:
if(len==3) { /* euler */
if(is_thick) {
- /* attempt to get order, only needed for thixk types since wrapped with update via callbacks */
+ /* attempt to get order, only needed for thick types since wrapped with update via callbacks */
PropertyRNA *prop_eul_order= NULL;
short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, ROT_MODE_XYZ);
@@ -343,27 +427,25 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
}
}
-
-#endif
+#else // USE_MATHUTILS
+ (void)ptr;
+ (void)prop;
+#endif // USE_MATHUTILS
return ret;
}
-#endif
-
-static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_eul_order, short order_fallback)
+/* same as RNA_enum_value_from_id but raises an exception */
+int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
{
- /* attempt to get order */
- if(*prop_eul_order==NULL)
- *prop_eul_order= RNA_struct_find_property(ptr, "rotation_mode");
-
- if(*prop_eul_order) {
- short order= RNA_property_enum_get(ptr, *prop_eul_order);
- if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
- return order;
+ if(RNA_enum_value_from_id(item, identifier, value) == 0) {
+ const char *enum_str= BPy_enum_as_string(item);
+ PyErr_Format(PyExc_TypeError, "%s: '%.200s' not found in (%s)", error_prefix, identifier, enum_str);
+ MEM_freeN((void *)enum_str);
+ return -1;
}
- return order_fallback;
+ return 0;
}
static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
@@ -402,8 +484,7 @@ static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
return NULL;
}
- Py_INCREF(res);
- return res;
+ return Py_INCREF(res), res;
}
static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
@@ -432,21 +513,20 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
return NULL;
}
- Py_INCREF(res);
- return res;
+ return Py_INCREF(res), res;
}
/*----------------------repr--------------------------------------------*/
static PyObject *pyrna_struct_str( BPy_StructRNA *self )
{
PyObject *ret;
- char *name;
+ const char *name;
/* print name if available */
name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
if(name) {
ret= PyUnicode_FromFormat( "<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
- MEM_freeN(name);
+ MEM_freeN((void *)name);
return ret;
}
@@ -458,22 +538,22 @@ static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
ID *id= self->ptr.id.data;
if(id == NULL)
return pyrna_struct_str(self); /* fallback */
-
+
if(RNA_struct_is_ID(self->ptr.type)) {
return PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id->name+2);
}
else {
PyObject *ret;
- char *path;
+ const char *path;
path= RNA_path_from_ID_to_struct(&self->ptr);
if(path) {
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_struct_identifier(self->ptr.type));
}
-
+
return ret;
}
}
@@ -482,13 +562,13 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
{
PyObject *ret;
PointerRNA ptr;
- char *name;
+ const char *name;
const char *type_id= NULL;
char type_fmt[64]= "";
int type= RNA_property_type(self->prop);
if(RNA_enum_id_from_value(property_type_items, type, &type_id)==0) {
- PyErr_SetString(PyExc_SystemError, "could not use property type, internal error"); /* should never happen */
+ PyErr_SetString(PyExc_RuntimeError, "could not use property type, internal error"); /* should never happen */
return NULL;
}
else {
@@ -515,10 +595,16 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
if(name) {
ret= PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
- MEM_freeN(name);
+ MEM_freeN((void *)name);
return ret;
}
}
+ if(RNA_property_type(self->prop) == PROP_COLLECTION) {
+ PointerRNA r_ptr;
+ if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
+ return PyUnicode_FromFormat( "<bpy_%.200s, %.200s>", type_fmt, RNA_struct_identifier(r_ptr.type));
+ }
+ }
return PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
}
@@ -527,20 +613,20 @@ static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
{
ID *id= self->ptr.id.data;
PyObject *ret;
- char *path;
-
+ const char *path;
+
if(id == NULL)
return pyrna_prop_str(self); /* fallback */
-
+
path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
if(path) {
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_property_identifier(self->prop));
}
-
+
return ret;
}
@@ -551,7 +637,7 @@ static long pyrna_struct_hash( BPy_StructRNA *self )
/* from python's meth_hash v3.1.2 */
static long pyrna_prop_hash(BPy_PropertyRNA *self)
-{
+{
long x,y;
if (self->ptr.data == NULL)
x = 0;
@@ -570,7 +656,7 @@ static long pyrna_prop_hash(BPy_PropertyRNA *self)
}
/* use our own dealloc so we can free a property if we use one */
-static void pyrna_struct_dealloc( BPy_StructRNA *self )
+static void pyrna_struct_dealloc(BPy_StructRNA *self)
{
if (self->freeptr && self->ptr.data) {
IDP_FreeProperty(self->ptr.data);
@@ -578,17 +664,45 @@ static void pyrna_struct_dealloc( BPy_StructRNA *self )
self->ptr.data= NULL;
}
+#ifdef USE_WEAKREFS
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
+ }
+#endif
+
+ /* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
+ Py_TYPE(self)->tp_free(self);
+}
+
+/* use our own dealloc so we can free a property if we use one */
+static void pyrna_prop_dealloc(BPy_PropertyRNA *self)
+{
+#ifdef USE_WEAKREFS
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
+ }
+#endif
+ /* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
+ Py_TYPE(self)->tp_free(self);
+}
+
+static void pyrna_prop_array_dealloc(BPy_PropertyRNA *self)
+{
+#ifdef USE_WEAKREFS
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
+ }
+#endif
/* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
Py_TYPE(self)->tp_free(self);
- return;
}
-static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
+static const char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
{
EnumPropertyItem *item;
- char *result;
+ const char *result;
int free= FALSE;
-
+
RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
if(item) {
result= BPy_enum_as_string(item);
@@ -596,28 +710,32 @@ static char *pyrna_enum_as_string(PointerRNA *ptr, PropertyRNA *prop)
else {
result= "";
}
-
+
if(free)
MEM_freeN(item);
-
+
return result;
}
static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *val, const char *error_prefix)
{
- char *param= _PyUnicode_AsString(item);
+ const char *param= _PyUnicode_AsString(item);
if (param==NULL) {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
- MEM_freeN(enum_str);
+ MEM_freeN((void *)enum_str);
return 0;
} else {
+ /* hack so that dynamic enums used for operator properties will be able to be built (i.e. context will be supplied to itemf)
+ * and thus running defining operator buttons for such operators in UI will work */
+ RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
+
if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str);
- MEM_freeN(enum_str);
+ MEM_freeN((void *)enum_str);
return 0;
}
}
@@ -638,10 +756,10 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
*r_value= 0;
while (_PySet_NextEntry(value, &pos, &key, &hash)) {
- char *param= _PyUnicode_AsString(key);
+ const char *param= _PyUnicode_AsString(key);
if(param==NULL) {
- PyErr_Format(PyExc_TypeError, "%.200s expected a string. found a %.200s", error_prefix, Py_TYPE(key)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s expected a string, not %.200s", error_prefix, Py_TYPE(key)->tp_name);
return -1;
}
if(pyrna_enum_value_from_id(items, param, &ret, error_prefix) < 0)
@@ -669,7 +787,7 @@ static int pyrna_prop_to_enum_bitfield(PointerRNA *ptr, PropertyRNA *prop, PyObj
}
else {
if(PySet_GET_SIZE(value)) {
- PyErr_Format(PyExc_TypeError, "%.200s: empty enum \"%.200s\" could not have any values assigned.", error_prefix, RNA_property_identifier(prop));
+ PyErr_Format(PyExc_TypeError, "%.200s: empty enum \"%.200s\" could not have any values assigned", error_prefix, RNA_property_identifier(prop));
ret= -1;
}
else {
@@ -726,17 +844,17 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) {
ret = PyUnicode_FromString(identifier);
} else {
- EnumPropertyItem *item;
+ EnumPropertyItem *enum_item;
int free= FALSE;
/* don't throw error here, can't trust blender 100% to give the
* right values, python code should not generate error for that */
- RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free);
- if(item && item->identifier) {
- ret= PyUnicode_FromString(item->identifier);
+ RNA_property_enum_items(BPy_GetContext(), ptr, prop, &enum_item, NULL, &free);
+ if(enum_item && enum_item->identifier) {
+ ret= PyUnicode_FromString(enum_item->identifier);
}
else {
- char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE);
+ const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE);
/* prefer not fail silently incase of api errors, maybe disable it later */
printf("RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'\n", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
@@ -748,13 +866,13 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
#endif
if(ptr_name)
- MEM_freeN(ptr_name);
+ MEM_freeN((void *)ptr_name);
- ret = PyUnicode_FromString( "" );
+ ret = PyUnicode_FromString("");
}
if(free)
- MEM_freeN(item);
+ MEM_freeN(enum_item);
/*PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
ret = NULL;*/
@@ -772,7 +890,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
if (RNA_property_array_check(ptr, prop)) {
return pyrna_py_from_array(ptr, prop);
}
-
+
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
@@ -787,7 +905,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
case PROP_STRING:
{
int subtype= RNA_property_subtype(prop);
- char *buf;
+ const char *buf;
buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
@@ -795,12 +913,12 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
ret= PyC_UnicodeFromByte(buf);
}
else {
- ret = PyUnicode_FromString( buf );
+ ret= PyUnicode_FromString(buf);
}
-#else
+#else // USE_STRING_COERCE
ret= PyUnicode_FromString(buf);
-#endif
- MEM_freeN(buf);
+#endif // USE_STRING_COERCE
+ MEM_freeN((void *)buf);
break;
}
case PROP_ENUM:
@@ -824,11 +942,11 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
ret = pyrna_prop_CreatePyObject(ptr, prop);
break;
default:
- PyErr_Format(PyExc_TypeError, "bpy_struct internal error: unknown type \"%d\" (pyrna_prop_to_py)", type);
+ PyErr_Format(PyExc_TypeError, "bpy_struct internal error: unknown type '%d' (pyrna_prop_to_py)", type);
ret = NULL;
break;
}
-
+
return ret;
}
@@ -849,7 +967,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (strcmp(arg_name, "rna_type")==0) continue;
if (kw==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s: no keywords, expected \"%.200s\"", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: no keywords, expected \"%.200s\"", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val= -1;
break;
}
@@ -858,12 +976,12 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (item == NULL) {
if(all_args) {
- PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val = -1; /* pyrna_py_to_prop sets the error */
break;
}
} else {
- if (pyrna_py_to_prop(ptr, prop, NULL, NULL, item, error_prefix)) {
+ if (pyrna_py_to_prop(ptr, prop, NULL, item, error_prefix)) {
error_val= -1;
break;
}
@@ -882,7 +1000,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
arg_name= NULL;
}
- PyErr_Format( PyExc_TypeError, "%.200s: keyword \"%.200s\" unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
+ PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
error_val = -1;
}
@@ -896,60 +1014,46 @@ static PyObject *pyrna_func_to_py(BPy_DummyPointerRNA *pyrna, FunctionRNA *func)
static PyMethodDef func_meth = {"<generic rna function>", (PyCFunction)pyrna_func_call, METH_VARARGS|METH_KEYWORDS, "python rna function"};
PyObject *self;
PyObject *ret;
-
+
if(func==NULL) {
- PyErr_Format( PyExc_RuntimeError, "%.200s: type attempted to get NULL function", RNA_struct_identifier(pyrna->ptr.type));
+ PyErr_Format(PyExc_RuntimeError, "%.200s: type attempted to get NULL function", RNA_struct_identifier(pyrna->ptr.type));
return NULL;
}
self= PyTuple_New(2);
-
+
PyTuple_SET_ITEM(self, 0, (PyObject *)pyrna);
Py_INCREF(pyrna);
PyTuple_SET_ITEM(self, 1, PyCapsule_New((void *)func, NULL, NULL));
-
+
ret= PyCFunction_New(&func_meth, self);
Py_DECREF(self);
-
+
return ret;
}
-static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, void *data, PyObject *value, const char *error_prefix)
+static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix)
{
/* XXX hard limits should be checked here */
int type = RNA_property_type(prop);
-
- if (RNA_property_array_check(ptr, prop)) {
- /* char error_str[512]; */
+ if (RNA_property_array_check(ptr, prop)) {
int ok= 1;
-#ifdef USE_MATHUTILS
- if(MatrixObject_Check(value)) {
- MatrixObject *mat = (MatrixObject*)value;
- if(!BaseMath_ReadCallback(mat))
- return -1;
- } else /* continue... */
-#endif
- if (!PySequence_Check(value)) {
- PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence instead of %.200s instance.", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
- return -1;
- }
/* done getting the length */
- ok= pyrna_py_to_array(ptr, prop, parms, data, value, error_prefix);
+ ok= pyrna_py_to_array(ptr, prop, data, value, error_prefix);
if (!ok) {
- /* PyErr_Format(PyExc_AttributeError, "%.200s %s", error_prefix, error_str); */
return -1;
}
}
else {
/* Normal Property (not an array) */
-
+
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
@@ -961,10 +1065,10 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
if(RNA_property_flag(prop) & PROP_OUTPUT)
param = PyObject_IsTrue( value );
else
- param = PyLong_AsSsize_t( value );
-
- if( param < 0 || param > 1) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ param = PyLong_AsLong( value );
+
+ if(param < 0) {
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
} else {
if(data) *((int*)data)= param;
@@ -974,14 +1078,20 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
case PROP_INT:
{
- int param = PyLong_AsSsize_t(value);
- if (param==-1 && PyErr_Occurred()) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ int overflow;
+ long param= PyLong_AsLongAndOverflow(value, &overflow);
+ if(overflow || (param > INT_MAX) || (param < INT_MIN)) {
+ PyErr_Format(PyExc_ValueError, "%.200s %.200s.%.200s value not in 'int' range (" STRINGIFY(INT_MIN) ", " STRINGIFY(INT_MAX) ")", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ return -1;
+ }
+ else if (param==-1 && PyErr_Occurred()) {
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
} else {
- RNA_property_int_clamp(ptr, prop, &param);
- if(data) *((int*)data)= param;
- else RNA_property_int_set(ptr, prop, param);
+ int param_i= (int)param;
+ RNA_property_int_clamp(ptr, prop, &param_i);
+ if(data) *((int*)data)= param_i;
+ else RNA_property_int_set(ptr, prop, param_i);
}
break;
}
@@ -989,7 +1099,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
{
float param = PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
} else {
RNA_property_float_clamp(ptr, prop, (float *)&param);
@@ -1005,26 +1115,29 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
PyObject *value_coerce= NULL;
int subtype= RNA_property_subtype(prop);
if(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
- param= PuC_UnicodeAsByte(value, &value_coerce);
+ /* TODO, get size */
+ PyObject *PyC_UnicodeAsByte(PyObject *value, PyObject **value_coerce);
+
+ param= PyC_UnicodeAsByte(value, &value_coerce);
}
else {
param= _PyUnicode_AsString(value);
}
-#else
- param= _PyUnicode_AsString(value);
-#endif
+#else // USE_STRING_COERCE
+ param= _PyUnicode_AsStringSize(value);
+#endif // USE_STRING_COERCE
if (param==NULL) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
}
else {
- if(data) *((char**)data)= param; /*XXX, this assignes a pointer, wouldnt it be better to copy??? */
+ if(data) *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
else RNA_property_string_set(ptr, prop, param);
}
#ifdef USE_STRING_COERCE
Py_XDECREF(value_coerce);
-#endif
+#endif // USE_STRING_COERCE
break;
}
case PROP_ENUM:
@@ -1047,26 +1160,46 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
}
else {
- char *enum_str= pyrna_enum_as_string(ptr, prop);
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s)", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str);
- MEM_freeN(enum_str);
+ const char *enum_str= pyrna_enum_as_string(ptr, prop);
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s), not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str, Py_TYPE(value)->tp_name);
+ MEM_freeN((void *)enum_str);
return -1;
}
if(data) *((int*)data)= val;
else RNA_property_enum_set(ptr, prop, val);
-
+
break;
}
case PROP_POINTER:
{
PyObject *value_new= NULL;
-
- StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
+
+ StructRNA *ptr_type= RNA_property_pointer_type(ptr, prop);
int flag = RNA_property_flag(prop);
+ /* this is really nasty!, so we can fake the operator having direct properties eg:
+ * layout.prop(self, "filepath")
+ * ... which infact should be
+ * layout.prop(self.properties, "filepath")
+ *
+ * we need to do this trick.
+ * if the prop is not an operator type and the pyobject is an operator, use its properties in place of its self.
+ *
+ * this is so bad that its almost a good reason to do away with fake 'self.properties -> self' class mixing
+ * if this causes problems in the future it should be removed.
+ */
+ if( (ptr_type == &RNA_AnyType) &&
+ (BPy_StructRNA_Check(value)) &&
+ (RNA_struct_is_a(((BPy_StructRNA *)value)->ptr.type, &RNA_Operator))
+ ) {
+ value= PyObject_GetAttrString(value, "properties");
+ value_new= value;
+ }
+
+
/* if property is an OperatorProperties pointer and value is a map, forward back to pyrna_pydict_to_props */
- if (RNA_struct_is_a(ptype, &RNA_OperatorProperties) && PyDict_Check(value)) {
+ if (RNA_struct_is_a(ptr_type, &RNA_OperatorProperties) && PyDict_Check(value)) {
PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
return pyrna_pydict_to_props(&opptr, value, 0, error_prefix);
}
@@ -1080,16 +1213,16 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
value_new= value;
}
else {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s collection has no type, cant be used as a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype));
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s collection has no type, cant be used as a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type));
return -1;
}
}
if(!BPy_StructRNA_Check(value) && value != Py_None) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype));
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type), Py_TYPE(value)->tp_name);
Py_XDECREF(value_new); return -1;
} else if((flag & PROP_NEVER_NULL) && value == Py_None) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype));
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type));
Py_XDECREF(value_new); return -1;
} else if(value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s ID type does not support assignment to its self", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
@@ -1108,7 +1241,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
else if(value == Py_None) {
*((void**)data)= NULL;
}
- else if(RNA_struct_is_a(param->ptr.type, ptype)) {
+ else if(RNA_struct_is_a(param->ptr.type, ptr_type)) {
*((void**)data)= param->ptr.data;
}
else {
@@ -1118,29 +1251,30 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
else {
/* data==NULL, assign to RNA */
if(value == Py_None) {
- PointerRNA valueptr;
- memset(&valueptr, 0, sizeof(valueptr));
+ PointerRNA valueptr= {{NULL}};
RNA_property_pointer_set(ptr, prop, valueptr);
}
- else if(RNA_struct_is_a(param->ptr.type, ptype)) {
+ else if(RNA_struct_is_a(param->ptr.type, ptr_type)) {
RNA_property_pointer_set(ptr, prop, param->ptr);
}
else {
PointerRNA tmp;
- RNA_pointer_create(NULL, ptype, NULL, &tmp);
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type));
+ RNA_pointer_create(NULL, ptr_type, NULL, &tmp);
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type. not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type), RNA_struct_identifier(param->ptr.type));
Py_XDECREF(value_new); return -1;
}
}
-
+
if(raise_error) {
PointerRNA tmp;
- RNA_pointer_create(NULL, ptype, NULL, &tmp);
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type));
+ RNA_pointer_create(NULL, ptr_type, NULL, &tmp);
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type), RNA_struct_identifier(param->ptr.type));
Py_XDECREF(value_new); return -1;
}
}
+ Py_XDECREF(value_new);
+
break;
}
case PROP_COLLECTION:
@@ -1152,14 +1286,14 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
CollectionPointerLink *link;
lb= (data)? (ListBase*)data: NULL;
-
+
/* convert a sequence of dict's into a collection */
if(!PySequence_Check(value)) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
}
- seq_len = PySequence_Length(value);
+ seq_len = PySequence_Size(value);
for(i=0; i<seq_len; i++) {
item= PySequence_GetItem(value, i);
@@ -1170,7 +1304,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
if(PyDict_Check(item)==0) {
- PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a each sequence member to be a dict for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(item)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a each sequence member to be a dict for an RNA collection, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(item)->tp_name);
Py_XDECREF(item);
return -1;
}
@@ -1185,7 +1319,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
if(pyrna_pydict_to_props(&itemptr, item, 1, "Converting a python list to an RNA collection")==-1) {
PyObject *msg= PyC_ExceptionBuffer();
- char *msg_char= _PyUnicode_AsString(msg);
+ const char *msg_char= _PyUnicode_AsString(msg);
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s error converting a member of a collection from a dicts into an RNA collection, failed with: %s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), msg_char);
@@ -1195,7 +1329,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
Py_DECREF(item);
}
-
+
break;
}
default:
@@ -1206,7 +1340,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, ParameterList *p
}
/* Run rna property functions */
- RNA_property_update(BPy_GetContext(), ptr, prop);
+ if(RNA_property_update_check(prop)) {
+ RNA_property_update(BPy_GetContext(), ptr, prop);
+ }
return 0;
}
@@ -1219,12 +1355,10 @@ static PyObject * pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int i
static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, PyObject *value)
{
int ret = 0;
- int totdim;
PointerRNA *ptr= &self->ptr;
PropertyRNA *prop= self->prop;
- int type = RNA_property_type(prop);
- totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int totdim= RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
/* char error_str[512]; */
@@ -1235,11 +1369,11 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
else {
/* see if we can coorce into a python type - PropertyType */
- switch (type) {
+ switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
{
- int param = PyLong_AsSsize_t( value );
-
+ int param = PyLong_AsLong( value );
+
if( param < 0 || param > 1) {
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
ret = -1;
@@ -1250,7 +1384,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
case PROP_INT:
{
- int param = PyLong_AsSsize_t(value);
+ int param = PyLong_AsLong(value);
if (param==-1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected an int type");
ret = -1;
@@ -1280,8 +1414,10 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
/* Run rna property functions */
- RNA_property_update(BPy_GetContext(), ptr, prop);
-
+ if(RNA_property_update_check(prop)) {
+ RNA_property_update(BPy_GetContext(), ptr, prop);
+ }
+
return ret;
}
@@ -1322,20 +1458,34 @@ static int pyrna_prop_collection_bool( BPy_PropertyRNA *self )
static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_ssize_t keynum)
{
PointerRNA newptr;
- int len= RNA_property_collection_length(&self->ptr, self->prop);
+ Py_ssize_t keynum_abs= keynum;
- if(keynum < 0) keynum += len;
+ /* notice getting the length of the collection is avoided unless negative index is used
+ * or to detect internal error with a valid index.
+ * This is done for faster lookups. */
+ if(keynum < 0) {
+ keynum_abs += RNA_property_collection_length(&self->ptr, self->prop);
- if(keynum >= 0 && keynum < len) {
- if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr)) {
- return pyrna_struct_CreatePyObject(&newptr);
+ if(keynum_abs < 0) {
+ PyErr_Format(PyExc_IndexError, "bpy_prop_collection[%d]: out of range.", keynum);
+ return NULL;
}
- else { /* fail's if ptr.data == NULL, valid for mesh.materials */
- Py_RETURN_NONE;
+ }
+
+ if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum_abs, &newptr)) {
+ return pyrna_struct_CreatePyObject(&newptr);
+ }
+ else {
+ const int len= RNA_property_collection_length(&self->ptr, self->prop);
+ if(keynum_abs >= len) {
+ PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);
}
+ else {
+ PyErr_Format(PyExc_RuntimeError, "bpy_prop_collection[index]: internal error, valid index %d given in %d sized collection but value not found", keynum_abs, len);
+ }
+
+ return NULL;
}
- PyErr_Format(PyExc_IndexError, "bpy_prop_collection[index]: index %d out of range, size %d", keynum, len);
- return NULL;
}
static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int keynum)
@@ -1362,26 +1512,37 @@ static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, cons
}
/* static PyObject *pyrna_prop_array_subscript_str(BPy_PropertyRNA *self, char *keyname) */
-static PyObject *pyrna_prop_collection_subscript_slice(PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length)
+static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
{
- PointerRNA newptr;
- PyObject *list = PyList_New(stop - start);
- int count;
+ int count= 0;
- start = MIN2(start,stop); /* values are clamped from */
+ PyObject *list= PyList_New(0);
+ PyObject *item;
- for(count = start; count < stop; count++) {
- if(RNA_property_collection_lookup_int(ptr, prop, count - start, &newptr)) {
- PyList_SET_ITEM(list, count - start, pyrna_struct_CreatePyObject(&newptr));
+ /* first loop up-until the start */
+ CollectionPropertyIterator rna_macro_iter;
+ for(RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
+ /* PointerRNA itemptr= rna_macro_iter.ptr; */
+ if(count == start) {
+ break;
}
- else {
- Py_DECREF(list);
+ count++;
+ }
- PyErr_SetString(PyExc_RuntimeError, "error getting an rna struct from a collection");
- return NULL;
+ /* add items until stop */
+ for(; rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
+ item= pyrna_struct_CreatePyObject(&rna_macro_iter.ptr);
+ PyList_Append(list, item);
+ Py_DECREF(item);
+
+ count++;
+ if(count == stop) {
+ break;
}
}
+ RNA_property_collection_end(&rna_macro_iter);
+
return list;
}
@@ -1389,17 +1550,17 @@ static PyObject *pyrna_prop_collection_subscript_slice(PointerRNA *ptr, Property
* note: could also use pyrna_prop_array_to_py_index(self, count) in a loop but its a lot slower
* since at the moment it reads (and even allocates) the entire array for each index.
*/
-static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int start, int stop, int length)
+static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length)
{
int count, totdim;
- PyObject *list = PyList_New(stop - start);
+ PyObject *tuple= PyTuple_New(stop - start);
totdim = RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
for (count = start; count < stop; count++)
- PyList_SET_ITEM(list, count - start, pyrna_prop_array_to_py_index(self, count));
+ PyTuple_SET_ITEM(tuple, count - start, pyrna_prop_array_to_py_index(self, count));
}
else {
switch (RNA_property_type(prop)) {
@@ -1410,9 +1571,9 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
if(length > PYRNA_STACK_ARRAY) { values= PyMem_MALLOC(sizeof(float) * length); }
else { values= values_stack; }
RNA_property_float_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyFloat_FromDouble(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyFloat_FromDouble(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1428,7 +1589,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
RNA_property_boolean_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyBool_FromLong(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyBool_FromLong(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1444,7 +1605,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- PyList_SET_ITEM(list, count-start, PyLong_FromSsize_t(values[count]));
+ PyTuple_SET_ITEM(tuple, count-start, PyLong_FromSsize_t(values[count]));
if(values != values_stack) {
PyMem_FREE(values);
@@ -1452,13 +1613,14 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
break;
}
default:
- /* probably will never happen */
+ BLI_assert(!"Invalid array type");
+
PyErr_SetString(PyExc_TypeError, "not an array type");
- Py_DECREF(list);
- list= NULL;
+ Py_DECREF(tuple);
+ tuple= NULL;
}
}
- return list;
+ return tuple;
}
static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject *key)
@@ -1474,25 +1636,43 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
return pyrna_prop_collection_subscript_int(self, i);
}
else if (PySlice_Check(key)) {
- int len= RNA_property_collection_length(&self->ptr, self->prop);
- Py_ssize_t start, stop, step, slicelength;
+ PySliceObject *key_slice= (PySliceObject *)key;
+ Py_ssize_t step= 1;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ if(key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
}
- else if (step == 1) {
- return pyrna_prop_collection_subscript_slice(&self->ptr, self->prop, start, stop, len);
+ else if (step != 1) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection[slice]: slice steps not supported");
+ return NULL;
+ }
+ else if(key_slice->start == Py_None && key_slice->stop == Py_None) {
+ return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
else {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_collection[slice]: slice steps not supported with rna");
- return NULL;
+ Py_ssize_t start= 0, stop= PY_SSIZE_T_MAX;
+
+ /* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */
+ if(key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) return NULL;
+ if(key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) return NULL;
+
+ if(start < 0 || stop < 0) {
+ /* only get the length for negative values */
+ Py_ssize_t len= (Py_ssize_t)RNA_property_collection_length(&self->ptr, self->prop);
+ if(start < 0) start += len;
+ if(stop < 0) start += len;
+ }
+
+ if (stop - start <= 0) {
+ return PyList_New(0);
+ }
+ else {
+ return pyrna_prop_collection_subscript_slice(self, start, stop);
+ }
}
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int instead of %.200s instance.", Py_TYPE(key)->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int, not %.200s", Py_TYPE(key)->tp_name);
return NULL;
}
}
@@ -1506,24 +1686,37 @@ static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject
Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
- return pyrna_prop_array_subscript_int(self, PyLong_AsSsize_t(key));
+ return pyrna_prop_array_subscript_int(self, PyLong_AsLong(key));
}
else if (PySlice_Check(key)) {
- Py_ssize_t start, stop, step, slicelength;
- int len = pyrna_prop_array_length(self);
+ Py_ssize_t step= 1;
+ PySliceObject *key_slice= (PySliceObject *)key;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0)
+ if(key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
return NULL;
-
- if (slicelength <= 0) {
- return PyList_New(0);
}
- else if (step == 1) {
- return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, start, stop, len);
+ else if (step != 1) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]: slice steps not supported");
+ return NULL;
+ }
+ else if(key_slice->start == Py_None && key_slice->stop == Py_None) {
+ /* note, no significant advantage with optimizing [:] slice as with collections but include here for consistency with collection slice func */
+ Py_ssize_t len= (Py_ssize_t)pyrna_prop_array_length(self);
+ return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
}
else {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]: slice steps not supported with rna");
- return NULL;
+ int len= pyrna_prop_array_length(self);
+ Py_ssize_t start, stop, slicelength;
+
+ if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0)
+ return NULL;
+
+ if (slicelength <= 0) {
+ return PyTuple_New(0);
+ }
+ else {
+ return pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, start, stop, len);
+ }
}
}
else {
@@ -1541,7 +1734,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
int ret= 0;
if(value_orig == NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct.");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct");
return -1;
}
@@ -1551,7 +1744,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
if(PySequence_Fast_GET_SIZE(value) != stop-start) {
Py_DECREF(value);
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported.");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported");
return -1;
}
@@ -1568,7 +1761,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
else { values= values_stack; }
if(start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_float_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++) {
fval = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(fval, min, max);
@@ -1588,9 +1781,9 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
if(start != 0 || stop != length) /* partial assignment? - need to get the array */
RNA_property_boolean_get_array(ptr, prop, values);
-
+
for(count=start; count<stop; count++)
- values[count] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+ values[count] = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_boolean_set_array(ptr, prop, values);
@@ -1611,7 +1804,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++) {
- ival = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value, count-start));
+ ival = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(ival, min, max);
values[count] = ival;
}
@@ -1626,11 +1819,11 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
}
Py_DECREF(value);
-
+
if(values_alloc) {
PyMem_FREE(values_alloc);
}
-
+
return ret;
}
@@ -1671,7 +1864,7 @@ static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject
int len= RNA_property_array_length(&self->ptr, self->prop);
Py_ssize_t start, stop, step, slicelength;
- if (PySlice_GetIndicesEx((PySliceObject*)key, len, &start, &stop, &step, &slicelength) < 0) {
+ if (PySlice_GetIndicesEx((void *)key, len, &start, &stop, &step, &slicelength) < 0) {
ret= -1;
}
else if (slicelength <= 0) {
@@ -1691,7 +1884,9 @@ static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject
}
if(ret != -1) {
- RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ if(RNA_property_update_check(self->prop)) {
+ RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
+ }
}
return ret;
@@ -1746,7 +1941,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
PointerRNA newptr; /* not used, just so RNA_property_collection_lookup_string runs */
/* key in dict style check */
- char *keyname = _PyUnicode_AsString(value);
+ const char *keyname = _PyUnicode_AsString(value);
if(keyname==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.__contains__: expected a string");
@@ -1762,23 +1957,23 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
{
IDProperty *group;
- char *name = _PyUnicode_AsString(value);
+ const char *name = _PyUnicode_AsString(value);
if (!name) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.__contains__: expected a string");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.__contains__: expected a string");
return -1;
}
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
return -1;
}
group= RNA_struct_idprops(&self->ptr, 0);
-
+
if(!group)
return 0;
-
+
return IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
@@ -1825,29 +2020,29 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
{
/* mostly copied from BPy_IDGroup_Map_GetItem */
IDProperty *group, *idprop;
- char *name= _PyUnicode_AsString(key);
+ const char *name= _PyUnicode_AsString(key);
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
if(name==NULL) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct[key]: only strings are allowed as keys of ID properties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct[key]: only strings are allowed as keys of ID properties");
return NULL;
}
group= RNA_struct_idprops(&self->ptr, 0);
if(group==NULL) {
- PyErr_Format( PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
+ PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
idprop= IDP_GetPropertyFromGroup(group, name);
if(idprop==NULL) {
- PyErr_Format( PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
+ PyErr_Format(PyExc_KeyError, "bpy_struct[key]: key \"%s\" not found", name);
return NULL;
}
@@ -1858,6 +2053,12 @@ static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObj
{
IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
if(group==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id properties not supported for this type");
return -1;
@@ -1887,7 +2088,7 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.keys(): this type doesn't support IDProperties");
return NULL;
}
@@ -1914,7 +2115,7 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.items(): this type doesn't support IDProperties");
return NULL;
}
@@ -1941,7 +2142,7 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
IDProperty *group;
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.values(): this type doesn't support IDProperties");
return NULL;
}
@@ -1955,28 +2156,48 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
/* for keyframes and drivers */
static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefix, const char *path,
- char **path_full, int *index)
+ const char **path_full, int *index)
{
+ const int is_idbase= RNA_struct_is_ID(ptr->type);
PropertyRNA *prop;
-
+ PointerRNA r_ptr;
+
if (ptr->data==NULL) {
PyErr_Format(PyExc_TypeError, "%.200s this struct has no data, can't be animated", error_prefix);
return -1;
}
-
- prop = RNA_struct_find_property(ptr, path);
-
+
+ /* full paths can only be given from ID base */
+ if(is_idbase) {
+ int r_index= -1;
+ if(RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index)==0) {
+ prop= NULL;
+ }
+ else if(r_index != -1) {
+ PyErr_Format(PyExc_ValueError, "%.200s path includes index, must be a separate argument", error_prefix, path);
+ return -1;
+ }
+ else if(ptr->id.data != r_ptr.id.data) {
+ PyErr_Format(PyExc_ValueError, "%.200s path spans ID blocks", error_prefix, path);
+ return -1;
+ }
+ }
+ else {
+ prop = RNA_struct_find_property(ptr, path);
+ r_ptr= *ptr;
+ }
+
if (prop==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
+ PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
return -1;
}
- if (!RNA_property_animateable(ptr, prop)) {
+ if (!RNA_property_animateable(&r_ptr, prop)) {
PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not animatable", error_prefix, path);
return -1;
}
- if(RNA_property_array_check(ptr, prop) == 0) {
+ if(RNA_property_array_check(&r_ptr, prop) == 0) {
if((*index) == -1) {
*index= 0;
}
@@ -1986,18 +2207,23 @@ static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefi
}
}
else {
- int array_len= RNA_property_array_length(ptr, prop);
+ int array_len= RNA_property_array_length(&r_ptr, prop);
if((*index) < -1 || (*index) >= array_len) {
- PyErr_Format( PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
+ PyErr_Format(PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
return -1;
}
}
-
- *path_full= RNA_path_from_ID_to_property(ptr, prop);
- if (*path_full==NULL) {
- PyErr_Format( PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
- return -1;
+ if(is_idbase) {
+ *path_full= BLI_strdup(path);
+ }
+ else {
+ *path_full= RNA_path_from_ID_to_property(&r_ptr, prop);
+
+ if (*path_full==NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
+ return -1;
+ }
}
return 0;
@@ -2005,18 +2231,18 @@ static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefi
/* internal use for insert and delete */
static int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
- char **path_full, int *index, float *cfra, char **group_name) /* return values */
+ const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
{
- static char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
- char *path;
+ static const char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
+ const char *path;
/* note, parse_str MUST start with 's|ifs' */
if (!PyArg_ParseTupleAndKeywords(args, kw, parse_str, (char **)kwlist, &path, index, cfra, group_name))
return -1;
- if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
+ if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
return -1;
-
+
if(*cfra==FLT_MAX)
*cfra= CTX_data_scene(BPy_GetContext())->r.cfra;
@@ -2030,31 +2256,40 @@ static char pyrna_struct_keyframe_insert_doc[] =
"\n"
" :arg data_path: path to the property to key, analogous to the fcurve's data path.\n"
" :type data_path: string\n"
-" :arg index: array index of the property to key. Defaults to -1 which will key all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property to key. Defaults to -1 which will key all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :arg frame: The frame on which the keyframe is inserted, defaulting to the current frame.\n"
" :type frame: float\n"
" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
" :type group: str\n"
" :return: Success of keyframe insertion.\n"
-" :rtype: boolean";
-
+" :rtype: boolean\n"
+;
static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
- PyObject *result;
/* args, pyrna_struct_keyframe_parse handles these */
- char *path_full= NULL;
+ const char *path_full= NULL;
int index= -1;
float cfra= FLT_MAX;
- char *group_name= NULL;
+ const char *group_name= NULL;
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1)
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- result= PyBool_FromLong(insert_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0));
- MEM_freeN(path_full);
+ BKE_reports_init(&reports, RPT_STORE);
- return result;
+ result= insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
}
static char pyrna_struct_keyframe_delete_doc[] =
@@ -2064,31 +2299,41 @@ static char pyrna_struct_keyframe_delete_doc[] =
"\n"
" :arg data_path: path to the property to remove a key, analogous to the fcurve's data path.\n"
" :type data_path: string\n"
-" :arg index: array index of the property to remove a key. Defaults to -1 removing all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property to remove a key. Defaults to -1 removing all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :arg frame: The frame on which the keyframe is deleted, defaulting to the current frame.\n"
" :type frame: float\n"
" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
" :type group: str\n"
" :return: Success of keyframe deleation.\n"
-" :rtype: boolean";
-
+" :rtype: boolean\n"
+;
static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw)
{
- PyObject *result;
/* args, pyrna_struct_keyframe_parse handles these */
- char *path_full= NULL;
+ const char *path_full= NULL;
int index= -1;
float cfra= FLT_MAX;
- char *group_name= NULL;
+ const char *group_name= NULL;
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1)
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- result= PyBool_FromLong(delete_keyframe((ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0));
- MEM_freeN(path_full);
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
- return result;
}
static char pyrna_struct_driver_add_doc[] =
@@ -2098,55 +2343,68 @@ static char pyrna_struct_driver_add_doc[] =
"\n"
" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :return: The driver(s) added.\n"
-" :rtype: :class:`FCurve` or list if index is -1 with an array property.";
-
+" :rtype: :class:`FCurve` or list if index is -1 with an array property.\n"
+;
static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
{
- char *path, *path_full;
+ const char *path, *path_full;
int index= -1;
- PyObject *ret;
if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index))
return NULL;
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0)
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0) {
return NULL;
+ }
+ else {
+ PyObject *ret= NULL;
+ ReportList reports;
+ int result;
- if(ANIM_add_driver((ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON)) {
- ID *id= self->ptr.id.data;
- AnimData *adt= BKE_animdata_from_id(id);
- FCurve *fcu;
+ BKE_reports_init(&reports, RPT_STORE);
- PointerRNA tptr;
- PyObject *item;
+ result= ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ if(result) {
+ ID *id= self->ptr.id.data;
+ AnimData *adt= BKE_animdata_from_id(id);
+ FCurve *fcu;
+
+ PointerRNA tptr;
+ PyObject *item;
- if(index == -1) { /* all, use a list */
- int i= 0;
- ret= PyList_New(0);
- while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ if(index == -1) { /* all, use a list */
+ int i= 0;
+ ret= PyList_New(0);
+ while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
+ item= pyrna_struct_CreatePyObject(&tptr);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
+ }
+ else {
+ fcu= list_find_fcurve(&adt->drivers, path_full, index);
RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- item= pyrna_struct_CreatePyObject(&tptr);
- PyList_Append(ret, item);
- Py_DECREF(item);
+ ret= pyrna_struct_CreatePyObject(&tptr);
}
}
else {
- fcu= list_find_fcurve(&adt->drivers, path_full, index);
- RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- ret= pyrna_struct_CreatePyObject(&tptr);
+ /* XXX, should be handled by reports, */
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
+ return NULL;
}
- }
- else {
- PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
- return NULL;
- }
- MEM_freeN(path_full);
+ MEM_freeN((void *)path_full);
- return ret;
+ return ret;
+ }
}
@@ -2157,28 +2415,37 @@ static char pyrna_struct_driver_remove_doc[] =
"\n"
" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indicies or a single channel if the property is not an array.\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
" :type index: int\n"
" :return: Success of driver removal.\n"
-" :rtype: boolean";
-
+" :rtype: boolean\n"
+;
static PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
{
- char *path, *path_full;
+ const char *path, *path_full;
int index= -1;
- PyObject *ret;
if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index))
return NULL;
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0)
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0) {
return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
- ret= PyBool_FromLong(ANIM_remove_driver((ID *)self->ptr.id.data, path_full, index, 0));
+ BKE_reports_init(&reports, RPT_STORE);
- MEM_freeN(path_full);
+ result= ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
- return ret;
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, TRUE))
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
}
@@ -2188,12 +2455,12 @@ static char pyrna_struct_is_property_set_doc[] =
" Check if a property is set, use for testing operator properties.\n"
"\n"
" :return: True when the property has been set.\n"
-" :rtype: boolean";
-
+" :rtype: boolean\n"
+;
static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *args)
{
PropertyRNA *prop;
- char *name;
+ const char *name;
int ret;
if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
@@ -2207,7 +2474,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
/* double property lookup, could speed up */
/* return PyBool_FromLong(RNA_property_is_set(&self->ptr, name)); */
if(RNA_property_flag(prop) & PROP_IDPROPERTY) {
- IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
+ IDProperty *group= RNA_struct_idprops(&self->ptr, 0);
if(group) {
ret= IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
@@ -2218,7 +2485,7 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
else {
ret= 1;
}
-
+
return PyBool_FromLong(ret);
}
@@ -2228,12 +2495,12 @@ static char pyrna_struct_is_property_hidden_doc[] =
" Check if a property is hidden.\n"
"\n"
" :return: True when the property is hidden.\n"
-" :rtype: boolean";
-
+" :rtype: boolean\n"
+;
static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *args)
{
PropertyRNA *prop;
- char *name;
+ const char *name;
if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
return NULL;
@@ -2254,25 +2521,37 @@ static char pyrna_struct_path_resolve_doc[] =
" :arg path: path which this property resolves.\n"
" :type path: string\n"
" :arg coerce: optional argument, when True, the property will be converted into its python representation.\n"
-" :type coerce: boolean\n";
-
+" :type coerce: boolean\n"
+;
static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
{
- char *path;
+ const char *path;
PyObject *coerce= Py_True;
PointerRNA r_ptr;
PropertyRNA *r_prop;
+ int index= -1;
if (!PyArg_ParseTuple(args, "s|O!:path_resolve", &path, &PyBool_Type, &coerce))
return NULL;
- if (RNA_path_resolve(&self->ptr, path, &r_ptr, &r_prop)) {
+ if (RNA_path_resolve_full(&self->ptr, path, &r_ptr, &r_prop, &index)) {
if(r_prop) {
- if(coerce == Py_False) {
- return pyrna_prop_CreatePyObject(&r_ptr, r_prop);
-}
+ if(index != -1) {
+ if(index >= RNA_property_array_length(&r_ptr, r_prop) || index < 0) {
+ PyErr_Format(PyExc_TypeError, "%.200s.path_resolve(\"%.200s\") index out of range", RNA_struct_identifier(self->ptr.type), path);
+ return NULL;
+ }
+ else {
+ return pyrna_array_index(&r_ptr, r_prop, index);
+ }
+ }
else {
- return pyrna_prop_to_py(&r_ptr, r_prop);
+ if(coerce == Py_False) {
+ return pyrna_prop_CreatePyObject(&r_ptr, r_prop);
+ }
+ else {
+ return pyrna_prop_to_py(&r_ptr, r_prop);
+ }
}
}
else {
@@ -2293,12 +2572,12 @@ static char pyrna_struct_path_from_id_doc[] =
" :arg property: Optional property name which can be used if the path is to a property of this object.\n"
" :type property: string\n"
" :return: The path from :class:`bpy_struct.id_data` to this struct and property (when given).\n"
-" :rtype: str";
-
+" :rtype: str\n"
+;
static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
{
- char *name= NULL;
- char *path;
+ const char *name= NULL;
+ const char *path;
PropertyRNA *prop;
PyObject *ret;
@@ -2325,7 +2604,7 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
}
ret= PyUnicode_FromString(path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
return ret;
}
@@ -2336,11 +2615,11 @@ static char pyrna_prop_path_from_id_doc[] =
" Returns the data path from the ID to this property (string).\n"
"\n"
" :return: The path from :class:`bpy_struct.id_data` to this property.\n"
-" :rtype: str";
-
+" :rtype: str\n"
+;
static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
{
- char *path;
+ const char *path;
PropertyRNA *prop = self->prop;
PyObject *ret;
@@ -2352,7 +2631,7 @@ static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
}
ret= PyUnicode_FromString(path);
- MEM_freeN(path);
+ MEM_freeN((void *)path);
return ret;
}
@@ -2363,9 +2642,9 @@ static char pyrna_struct_type_recast_doc[] =
" Return a new instance, this is needed because types such as textures can be changed at runtime.\n"
"\n"
" :return: a new instance of this object with the type initialized again.\n"
-" :rtype: subclass of :class:`bpy_struct`";
-
-static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self, PyObject *args)
+" :rtype: subclass of :class:`bpy_struct`\n"
+;
+static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self)
{
PointerRNA r_ptr;
RNA_pointer_recast(&self->ptr, &r_ptr);
@@ -2469,18 +2748,34 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
BLI_freelistN(&lb);
}
+
+ {
+ /* set(), this is needed to remove-doubles because the deferred
+ * register-props will be in both the python __dict__ and accessed as RNA */
+
+ PyObject *set= PySet_New(ret);
+
+ Py_DECREF(ret);
+ ret= PySequence_List(set);
+ Py_DECREF(set);
+ }
+
return ret;
}
//---------------getattr--------------------------------------------
static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
-
- if(name[0]=='_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
+
+ if(name == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_struct: __getattr__ must be a string");
+ ret = NULL;
+ }
+ else if(name[0]=='_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
/* annoying exception, maybe we need to have different types for this... */
if((strcmp(name, "__getitem__")==0 || strcmp(name, "__setitem__")==0) && !RNA_struct_idprops_check(self->ptr.type)) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: no __getitem__ support for this type");
@@ -2500,7 +2795,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
else if (self->ptr.type == &RNA_Context) {
bContext *C = self->ptr.data;
if(C==NULL) {
- PyErr_Format( PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't get \"%.200s\" from context", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't get \"%.200s\" from context", name);
ret= NULL;
}
else {
@@ -2525,9 +2820,9 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
{
CollectionPointerLink *link;
PyObject *linkptr;
-
+
ret = PyList_New(0);
-
+
for(link=newlb.first; link; link=link->next) {
linkptr= pyrna_struct_CreatePyObject(&link->ptr);
PyList_Append(ret, linkptr);
@@ -2537,6 +2832,8 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
break;
default:
/* should never happen */
+ BLI_assert(!"Invalid context type");
+
PyErr_Format(PyExc_AttributeError, "bpy_struct: Context type invalid %d, can't get \"%.200s\" from context", newtype, name);
ret= NULL;
}
@@ -2555,7 +2852,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
}
else {
#if 0
- PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" not found", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" not found", name);
ret = NULL;
#endif
/* Include this incase this instance is a subtype of a python class
@@ -2567,7 +2864,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
/* The error raised here will be displayed */
ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
}
-
+
return ret;
}
@@ -2583,14 +2880,108 @@ static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname)
#endif
//--------------- setattr-------------------------------------------
+static int pyrna_is_deferred_prop(PyObject *value)
+{
+ return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value)==2 && PyCallable_Check(PyTuple_GET_ITEM(value, 0)) && PyDict_CheckExact(PyTuple_GET_ITEM(value, 1));
+}
+
+#if 0
+static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr)
+{
+ PyObject *ret= PyType_Type.tp_getattro(cls, attr);
+
+ /* Allows:
+ * >>> bpy.types.Scene.foo = BoolProperty()
+ * >>> bpy.types.Scene.foo
+ * <bpy_struct, BooleanProperty("foo")>
+ * ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop()
+ *
+ * Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
+#if 0
+ if(ret == NULL) { // || pyrna_is_deferred_prop(ret)
+ StructRNA *srna= srna_from_self(cls, "StructRNA.__getattr__");
+ if(srna) {
+ PropertyRNA *prop= RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr));
+ if(prop) {
+ PointerRNA tptr;
+ PyErr_Clear(); /* clear error from tp_getattro */
+ RNA_pointer_create(NULL, &RNA_Property, prop, &tptr);
+ ret= pyrna_struct_CreatePyObject(&tptr);
+ }
+ }
+ }
+#endif
+
+ return ret;
+}
+#endif
+
+static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
+{
+ StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
+
+ if(srna == NULL) {
+ if(value && pyrna_is_deferred_prop(value)) {
+ PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() unable to get srna from class '%.200s'", ((PyTypeObject *)cls)->tp_name);
+ return -1;
+ }
+
+ /* srna_from_self may set an error */
+ PyErr_Clear();
+ return PyType_Type.tp_setattro(cls, attr, value);
+ }
+
+ if(value) {
+ /* check if the value is a property */
+ if(pyrna_is_deferred_prop(value)) {
+ int ret= deferred_register_prop(srna, attr, value);
+ if(ret == -1) {
+ /* error set */
+ return ret;
+ }
+
+ /* pass through and assign to the classes __dict__ as well
+ * when the value isn't assigned it still creates the RNA property
+ * but gets confusing from script writers POV if the assigned value cant be read back. */
+ }
+ else {
+ /* remove existing property if its set or we also end up with confusement */
+ const char *attr_str= _PyUnicode_AsString(attr);
+ RNA_def_property_free_identifier(srna, attr_str); /* ignore on failier */
+ }
+ }
+ else { /* __delattr__ */
+ /* first find if this is a registered property */
+ const char *attr_str= _PyUnicode_AsString(attr);
+ int ret= RNA_def_property_free_identifier(srna, attr_str);
+ if (ret == -1) {
+ PyErr_Format(PyExc_TypeError, "struct_meta_idprop.detattr(): '%s' not a dynamic property", attr_str);
+ return -1;
+ }
+ }
+
+ /* fallback to standard py, delattr/setattr */
+ return PyType_Type.tp_setattro(cls, attr, value);
+}
+
static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObject *value )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PropertyRNA *prop= NULL;
- if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) {
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
+ if(name == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_struct: __setattr__ must be a string");
+ return -1;
+ }
+ else if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) {
if (!RNA_property_editable_flag(&self->ptr, prop)) {
- PyErr_Format( PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
return -1;
}
}
@@ -2624,11 +3015,11 @@ static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObjec
PyErr_SetString(PyExc_AttributeError, "bpy_struct: del not supported");
return -1;
}
- return pyrna_py_to_prop(&self->ptr, prop, NULL, NULL, value, "bpy_struct: item.attr = val:");
+ return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr = val:");
}
else {
return PyObject_GenericSetAttr((PyObject *)self, pyname, value);
-}
+ }
}
static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self)
@@ -2658,9 +3049,13 @@ static PyObject *pyrna_prop_array_getattro( BPy_PropertyRNA *self, PyObject *pyn
static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject *pyname )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
- if(name[0] != '_') {
+ if(name == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string");
+ return NULL;
+ }
+ else if(name[0] != '_') {
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
@@ -2689,23 +3084,32 @@ static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject
//--------------- setattr-------------------------------------------
static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyname, PyObject *value )
{
- char *name = _PyUnicode_AsString(pyname);
+ const char *name = _PyUnicode_AsString(pyname);
PropertyRNA *prop;
PointerRNA r_ptr;
- if(value == NULL) {
+#ifdef USE_PEDANTIC_WRITE
+ if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
+ return -1;
+ }
+#endif // USE_STRING_COERCE
+
+ if(name == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy_prop: __setattr__ must be a string");
+ return -1;
+ }
+ else if(value == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop: del not supported");
return -1;
}
-
- if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
+ else if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
if ((prop = RNA_struct_find_property(&r_ptr, name))) {
/* pyrna_py_to_prop sets its own exceptions */
- return pyrna_py_to_prop(&r_ptr, prop, NULL, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
+ return pyrna_py_to_prop(&r_ptr, prop, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
}
}
- PyErr_Format( PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" not found", name);
+ PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" not found", name);
return -1;
}
@@ -2716,7 +3120,7 @@ static PyObject *pyrna_prop_collection_idprop_add(BPy_PropertyRNA *self)
RNA_property_collection_add(&self->ptr, self->prop, &r_ptr);
if(!r_ptr.data) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.add(): not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.add(): not supported for this collection");
return NULL;
}
else {
@@ -2726,44 +3130,36 @@ static PyObject *pyrna_prop_collection_idprop_add(BPy_PropertyRNA *self)
static PyObject *pyrna_prop_collection_idprop_remove(BPy_PropertyRNA *self, PyObject *value)
{
- PyObject *ret;
- int key= PyLong_AsSsize_t(value);
+ int key= PyLong_AsLong(value);
if (key==-1 && PyErr_Occurred()) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.remove(): expected one int argument");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.remove(): expected one int argument");
return NULL;
}
if(!RNA_property_collection_remove(&self->ptr, self->prop, key)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.remove() not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.remove() not supported for this collection");
return NULL;
}
- ret = Py_None;
- Py_INCREF(ret);
-
- return ret;
+ Py_RETURN_NONE;
}
static PyObject *pyrna_prop_collection_idprop_move(BPy_PropertyRNA *self, PyObject *args)
{
- PyObject *ret;
int key=0, pos=0;
if (!PyArg_ParseTuple(args, "ii", &key, &pos)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.move(): expected two ints as arguments");
return NULL;
}
if(!RNA_property_collection_move(&self->ptr, self->prop, key, pos)) {
- PyErr_SetString( PyExc_TypeError, "bpy_prop_collection.move() not supported for this collection");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.move() not supported for this collection");
return NULL;
}
- ret = Py_None;
- Py_INCREF(ret);
-
- return ret;
+ Py_RETURN_NONE;
}
static PyObject *pyrna_struct_get_id_data(BPy_DummyPointerRNA *self)
@@ -2783,17 +3179,17 @@ static PyObject *pyrna_struct_get_id_data(BPy_DummyPointerRNA *self)
/*****************************************************************************/
static PyGetSetDef pyrna_prop_getseters[] = {
- {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
+ {(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
static PyGetSetDef pyrna_struct_getseters[] = {
- {"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, "The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
+ {(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
-static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
PyObject *item;
@@ -2814,11 +3210,11 @@ static PyObject *pyrna_prop_keys(BPy_PropertyRNA *self)
}
}
RNA_PROP_END;
-
+
return ret;
}
-static PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
PyObject *item;
@@ -2847,23 +3243,14 @@ static PyObject *pyrna_prop_items(BPy_PropertyRNA *self)
}
}
RNA_PROP_END;
-
+
return ret;
}
-static PyObject *pyrna_prop_values(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self)
{
- PyObject *ret= PyList_New(0);
- PyObject *item;
-
- RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- item = pyrna_struct_CreatePyObject(&itemptr);
- PyList_Append(ret, item);
- Py_DECREF(item);
- }
- RNA_PROP_END;
-
- return ret;
+ /* re-use slice*/
+ return pyrna_prop_collection_subscript_slice(self, 0, PY_SSIZE_T_MAX);
}
static char pyrna_struct_get_doc[] =
@@ -2874,15 +3261,15 @@ static char pyrna_struct_get_doc[] =
" :arg key: The key assosiated with the custom property.\n"
" :type key: string\n"
" :arg default: Optional argument for the value to return if *key* is not found.\n"
-// " :type default: Undefined\n"
+" :type default: Undefined\n"
"\n"
-" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n";
-
+" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n"
+;
static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
{
IDProperty *group, *idprop;
- char *key;
+ const char *key;
PyObject* def = Py_None;
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
@@ -2890,7 +3277,7 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
/* mostly copied from BPy_IDGroup_Map_GetItem */
if(RNA_struct_idprops_check(self->ptr.type)==0) {
- PyErr_SetString( PyExc_TypeError, "this type doesn't support IDProperties");
+ PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
}
@@ -2902,8 +3289,7 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
return BPy_IDGroup_WrapData(self->ptr.id.data, idprop);
}
- Py_INCREF(def);
- return def;
+ return Py_INCREF(def), def;
}
static char pyrna_struct_as_pointer_doc[] =
@@ -2911,34 +3297,33 @@ static char pyrna_struct_as_pointer_doc[] =
"\n"
" Returns the memory address which holds a pointer to blenders internal data\n"
"\n"
-" :return: capsule with a name set from the struct type.\n"
+" :return: int (memory address).\n"
" :rtype: int\n"
"\n"
-" .. note:: This is intended only for advanced script writers who need to pass blender data to their own C/Python modules.\n";
-
+" .. note:: This is intended only for advanced script writers who need to pass blender data to their own C/Python modules.\n"
+;
static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self)
{
return PyLong_FromVoidPtr(self->ptr.data);
}
-static PyObject *pyrna_prop_get(BPy_PropertyRNA *self, PyObject *args)
+static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args)
{
PointerRNA newptr;
-
- char *key;
+
+ const char *key;
PyObject* def = Py_None;
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
return NULL;
-
+
if(RNA_property_collection_lookup_string(&self->ptr, self->prop, key, &newptr))
return pyrna_struct_CreatePyObject(&newptr);
-
- Py_INCREF(def);
- return def;
+
+ return Py_INCREF(def), def;
}
-static void foreach_attr_type( BPy_PropertyRNA *self, char *attr,
+static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
/* values to assign */
RawPropertyType *raw_type, int *attr_tot, int *attr_signed )
{
@@ -2958,12 +3343,12 @@ static void foreach_attr_type( BPy_PropertyRNA *self, char *attr,
RNA_PROP_END;
}
-/* pyrna_prop_foreach_get/set both use this */
+/* pyrna_prop_collection_foreach_get/set both use this */
static int foreach_parse_args(
BPy_PropertyRNA *self, PyObject *args,
/*values to assign */
- char **attr, PyObject **seq, int *tot, int *size, RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
+ const char **attr, PyObject **seq, int *tot, int *size, RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
{
#if 0
int array_tot;
@@ -2974,11 +3359,11 @@ static int foreach_parse_args(
*raw_type= PROP_RAW_UNSET;
if(!PyArg_ParseTuple(args, "sO", attr, seq) || (!PySequence_Check(*seq) && PyObject_CheckBuffer(*seq))) {
- PyErr_SetString( PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence" );
+ PyErr_SetString(PyExc_TypeError, "foreach_get(attr, sequence) expects a string and a sequence");
return -1;
}
- *tot= PySequence_Length(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
+ *tot= PySequence_Size(*seq); // TODO - buffer may not be a sequence! array.array() is tho.
if(*tot>0) {
foreach_attr_type(self, *attr, raw_type, attr_tot, attr_signed);
@@ -2998,7 +3383,7 @@ static int foreach_parse_args(
/* rna_access.c - rna_raw_access(...) uses this same method */
if(target_tot != (*tot)) {
- PyErr_Format( PyExc_TypeError, "foreach_get(attr, sequence) sequence length mismatch given %d, needed %d", *tot, target_tot);
+ PyErr_Format(PyExc_TypeError, "foreach_get(attr, sequence) sequence length mismatch given %d, needed %d", *tot, target_tot);
return -1;
}
#endif
@@ -3007,7 +3392,7 @@ static int foreach_parse_args(
/* check 'attr_tot' otherwise we dont know if any values were set
* this isnt ideal because it means running on an empty list may fail silently when its not compatible. */
if (*size == 0 && *attr_tot != 0) {
- PyErr_SetString( PyExc_AttributeError, "attribute does not support foreach method" );
+ PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method");
return -1;
}
return 0;
@@ -3045,7 +3430,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
void *array= NULL;
/* get/set both take the same args currently */
- char *attr;
+ const char *attr;
PyObject *seq;
int tot, size, attr_tot, attr_signed;
RawPropertyType raw_type;
@@ -3083,13 +3468,13 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
item= PySequence_GetItem(seq, i);
switch(raw_type) {
case PROP_RAW_CHAR:
- ((char *)array)[i]= (char)PyLong_AsSsize_t(item);
+ ((char *)array)[i]= (char)PyLong_AsLong(item);
break;
case PROP_RAW_SHORT:
- ((short *)array)[i]= (short)PyLong_AsSsize_t(item);
+ ((short *)array)[i]= (short)PyLong_AsLong(item);
break;
case PROP_RAW_INT:
- ((int *)array)[i]= (int)PyLong_AsSsize_t(item);
+ ((int *)array)[i]= (int)PyLong_AsLong(item);
break;
case PROP_RAW_FLOAT:
((float *)array)[i]= (float)PyFloat_AsDouble(item);
@@ -3099,6 +3484,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
break;
case PROP_RAW_UNSET:
/* should never happen */
+ BLI_assert(!"Invalid array type - set");
break;
}
@@ -3153,6 +3539,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
break;
case PROP_RAW_UNSET:
/* should never happen */
+ BLI_assert(!"Invalid array type - get");
break;
}
@@ -3168,37 +3555,63 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
if(PyErr_Occurred()) {
/* Maybe we could make our own error */
PyErr_Print();
- PyErr_SetString(PyExc_SystemError, "could not access the py sequence");
+ PyErr_SetString(PyExc_TypeError, "could not access the py sequence");
return NULL;
}
if (!ok) {
- PyErr_SetString(PyExc_SystemError, "internal error setting the array");
+ PyErr_SetString(PyExc_RuntimeError, "internal error setting the array");
return NULL;
}
Py_RETURN_NONE;
}
-static PyObject *pyrna_prop_foreach_get(BPy_PropertyRNA *self, PyObject *args)
+static char pyrna_prop_collection_foreach_get_doc[] =
+".. method:: foreach_get(attr, seq)\n"
+"\n"
+" This is a function to give fast access to attribites within a collection.\n"
+"\n"
+" .. code-block:: python\n"
+"\n"
+" collection.foreach_get(someseq, attr)\n"
+"\n"
+" # Python equivelent\n"
+" for i in range(len(seq)): someseq[i] = getattr(collection, attr)\n"
+"\n"
+;
+static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObject *args)
{
return foreach_getset(self, args, 0);
}
-static PyObject *pyrna_prop_foreach_set(BPy_PropertyRNA *self, PyObject *args)
+static char pyrna_prop_collection_foreach_set_doc[] =
+".. method:: foreach_set(attr, seq)\n"
+"\n"
+" This is a function to give fast access to attribites within a collection.\n"
+"\n"
+" .. code-block:: python\n"
+"\n"
+" collection.foreach_set(seq, attr)\n"
+"\n"
+" # Python equivelent\n"
+" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
+"\n"
+;
+static PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
{
return foreach_getset(self, args, 1);
}
/* A bit of a kludge, make a list out of a collection or array,
* then return the lists iter function, not especially fast but convenient for now */
-PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
+static PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
{
/* Try get values from a collection */
PyObject *ret;
PyObject *iter= NULL;
int len= pyrna_prop_array_length(self);
ret = pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
-
+
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
@@ -3209,13 +3622,13 @@ PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
return iter;
}
-PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
+static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
{
/* Try get values from a collection */
PyObject *ret;
PyObject *iter= NULL;
- ret = pyrna_prop_values(self);
-
+ ret= pyrna_prop_collection_values(self);
+
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
@@ -3251,21 +3664,6 @@ static struct PyMethodDef pyrna_struct_methods[] = {
/* experemental */
{"callback_add", (PyCFunction)pyrna_callback_add, METH_VARARGS, NULL},
{"callback_remove", (PyCFunction)pyrna_callback_remove, METH_VARARGS, NULL},
-
- /* class methods, only valid for subclasses */
- {"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_BoolProperty_doc},
- {"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_BoolVectorProperty_doc},
- {"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_IntProperty_doc},
- {"IntVectorProperty", (PyCFunction)BPy_IntVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_IntVectorProperty_doc},
- {"FloatProperty", (PyCFunction)BPy_FloatProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_FloatProperty_doc},
- {"FloatVectorProperty", (PyCFunction)BPy_FloatVectorProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_FloatVectorProperty_doc},
- {"StringProperty", (PyCFunction)BPy_StringProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_StringProperty_doc},
- {"EnumProperty", (PyCFunction)BPy_EnumProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_EnumProperty_doc},
- {"PointerProperty", (PyCFunction)BPy_PointerProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_PointerProperty_doc},
- {"CollectionProperty", (PyCFunction)BPy_CollectionProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_CollectionProperty_doc},
-
- {"RemoveProperty", (PyCFunction)BPy_RemoveProperty, METH_VARARGS|METH_KEYWORDS|METH_CLASS, BPy_RemoveProperty_doc},
-
{NULL, NULL, 0, NULL}
};
@@ -3280,14 +3678,14 @@ static struct PyMethodDef pyrna_prop_array_methods[] = {
};
static struct PyMethodDef pyrna_prop_collection_methods[] = {
- {"foreach_get", (PyCFunction)pyrna_prop_foreach_get, METH_VARARGS, NULL},
- {"foreach_set", (PyCFunction)pyrna_prop_foreach_set, METH_VARARGS, NULL},
+ {"foreach_get", (PyCFunction)pyrna_prop_collection_foreach_get, METH_VARARGS, pyrna_prop_collection_foreach_get_doc},
+ {"foreach_set", (PyCFunction)pyrna_prop_collection_foreach_set, METH_VARARGS, pyrna_prop_collection_foreach_set_doc},
- {"keys", (PyCFunction)pyrna_prop_keys, METH_NOARGS, NULL},
- {"items", (PyCFunction)pyrna_prop_items, METH_NOARGS,NULL},
- {"values", (PyCFunction)pyrna_prop_values, METH_NOARGS, NULL},
-
- {"get", (PyCFunction)pyrna_prop_get, METH_VARARGS, NULL},
+ {"keys", (PyCFunction)pyrna_prop_collection_keys, METH_NOARGS, NULL},
+ {"items", (PyCFunction)pyrna_prop_collection_items, METH_NOARGS,NULL},
+ {"values", (PyCFunction)pyrna_prop_collection_values, METH_NOARGS, NULL},
+
+ {"get", (PyCFunction)pyrna_prop_collection_get, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
@@ -3300,36 +3698,55 @@ static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
+static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
+{
+ if(PyTuple_GET_SIZE(args) == 1) {
+ BPy_StructRNA *base= (BPy_StructRNA *)PyTuple_GET_ITEM(args, 0);
+ if (type == Py_TYPE(base)) {
+ Py_INCREF(base);
+ return (PyObject *)base;
+ }
+ else if (PyType_IsSubtype(type, &pyrna_struct_Type)) {
+ /* this almost never runs, only when using user defined subclasses of built-in object.
+ * this isnt common since its NOT related to registerable subclasses. eg:
+
+ >>> class MyObSubclass(bpy.types.Object):
+ ... def test_func(self):
+ ... print(100)
+ ...
+ >>> myob = MyObSubclass(bpy.context.object)
+ >>> myob.test_func()
+ 100
+ *
+ * Keep this since it could be useful.
+ */
+ BPy_StructRNA *ret;
+ if((ret= (BPy_StructRNA *)type->tp_alloc(type, 0))) {
+ ret->ptr = base->ptr;
+ }
+ /* pass on exception & NULL if tp_alloc fails */
+ return (PyObject *)ret;
+ }
- BPy_StructRNA *base;
-
- if (!PyArg_ParseTuple(args, "O!:bpy_struct.__new__", &pyrna_struct_Type, &base))
+ /* error, invalid type given */
+ PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct", type->tp_name);
return NULL;
-
- if (type == Py_TYPE(base)) {
- Py_INCREF(base);
- return (PyObject *)base;
- } else if (PyType_IsSubtype(type, &pyrna_struct_Type)) {
- BPy_StructRNA *ret = (BPy_StructRNA *) type->tp_alloc(type, 0);
- ret->ptr = base->ptr;
- return (PyObject *)ret;
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct.", type->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): expected a single argument");
return NULL;
}
}
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {
+static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) {
BPy_PropertyRNA *base;
-
+
if (!PyArg_ParseTuple(args, "O!:bpy_prop.__new__", &pyrna_prop_Type, &base))
return NULL;
-
+
if (type == Py_TYPE(base)) {
Py_INCREF(base);
return (PyObject *)base;
@@ -3340,20 +3757,19 @@ static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *k
return (PyObject *)ret;
}
else {
- PyErr_Format(PyExc_TypeError, "bpy_prop.__new__(type): type '%.200s' is not a subtype of bpy_prop.", type->tp_name);
+ PyErr_Format(PyExc_TypeError, "bpy_prop.__new__(type): type '%.200s' is not a subtype of bpy_prop", type->tp_name);
return NULL;
}
}
-PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *prop, void *data)
+static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
{
PyObject *ret;
int type = RNA_property_type(prop);
int flag = RNA_property_flag(prop);
- int a;
if(RNA_property_array_check(ptr, prop)) {
- int len;
+ int a, len;
if (flag & PROP_DYNAMIC) {
ParameterDynAlloc *data_alloc= data;
@@ -3380,6 +3796,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
break;
case PROP_FLOAT:
switch(RNA_property_subtype(prop)) {
+#ifdef USE_MATHUTILS
case PROP_ALL_VECTOR_SUBTYPES:
ret= newVectorObject(data, len, Py_NEW, NULL);
break;
@@ -3393,6 +3810,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
break;
}
/* pass through */
+#endif
default:
ret = PyTuple_New(len);
for(a=0; a<len; a++)
@@ -3424,7 +3842,7 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
PyObject *value_coerce= NULL;
int subtype= RNA_property_subtype(prop);
- if(flag & PROP_THICK_WRAP)
+ if (flag & PROP_THICK_WRAP)
data_ch= (char *)data;
else
data_ch= *(char **)data;
@@ -3454,21 +3872,21 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, ParameterList *parms, PropertyRNA *
case PROP_POINTER:
{
PointerRNA newptr;
- StructRNA *type= RNA_property_pointer_type(ptr, prop);
+ StructRNA *ptype= RNA_property_pointer_type(ptr, prop);
if(flag & PROP_RNAPTR) {
/* in this case we get the full ptr */
newptr= *(PointerRNA*)data;
}
else {
- if(RNA_struct_is_ID(type)) {
+ if(RNA_struct_is_ID(ptype)) {
RNA_id_pointer_create(*(void**)data, &newptr);
} else {
/* note: this is taken from the function's ID pointer
* and will break if a function returns a pointer from
* another ID block, watch this! - it should at least be
* easy to debug since they are all ID's */
- RNA_pointer_create(ptr->id.data, type, *(void**)data, &newptr);
+ RNA_pointer_create(ptr->id.data, ptype, *(void**)data, &newptr);
}
}
@@ -3524,16 +3942,28 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
void *retdata_single= NULL;
/* Should never happen but it does in rare cases */
+ BLI_assert(self_ptr != NULL);
+
if(self_ptr==NULL) {
PyErr_SetString(PyExc_RuntimeError, "rna functions internal rna pointer is NULL, this is a bug. aborting");
return NULL;
}
-
+
if(self_func==NULL) {
PyErr_Format(PyExc_RuntimeError, "%.200s.<unknown>(): rna function internal function is NULL, this is a bug. aborting", RNA_struct_identifier(self_ptr->type));
return NULL;
}
-
+
+ /* for testing */
+ /*
+ {
+ const char *fn;
+ int lineno;
+ PyC_FileAndNum(&fn, &lineno);
+ printf("pyrna_func_call > %.200s.%.200s : %.200s:%d\n", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), fn, lineno);
+ }
+ */
+
/* include the ID pointer for pyrna_param_to_py() so we can include the
* ID pointer on return values, this only works when returned values have
* the same ID as the functions. */
@@ -3596,7 +4026,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
continue;
}
- err= pyrna_py_to_prop(&funcptr, parm, &parms, iter.data, item, "");
+ err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
if(err!=0) {
/* the error generated isnt that useful, so generate it again with a useful prefix
@@ -3609,12 +4039,12 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
else
snprintf(error_prefix, sizeof(error_prefix), "%s.%s(): error with argument %d, \"%s\" - ", RNA_struct_identifier(self_ptr->type), RNA_function_identifier(self_func), i, parm_id);
- pyrna_py_to_prop(&funcptr, parm, &parms, iter.data, item, error_prefix);
+ pyrna_py_to_prop(&funcptr, parm, iter.data, item, error_prefix);
break;
}
}
-
+
RNA_parameter_list_end(&iter);
/* Check if we gave args that dont exist in the function
@@ -3629,7 +4059,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
DynStr *bad_args= BLI_dynstr_new();
DynStr *good_args= BLI_dynstr_new();
- char *arg_name, *bad_args_str, *good_args_str;
+ const char *arg_name, *bad_args_str, *good_args_str;
int found= FALSE, first= TRUE;
while (PyDict_Next(kw, &pos, &key, &value)) {
@@ -3682,8 +4112,8 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
BLI_dynstr_free(bad_args);
BLI_dynstr_free(good_args);
- MEM_freeN(bad_args_str);
- MEM_freeN(good_args_str);
+ MEM_freeN((void *)bad_args_str);
+ MEM_freeN((void *)good_args_str);
err= -1;
}
@@ -3697,8 +4127,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
BKE_reports_init(&reports, RPT_STORE);
RNA_function_call(C, &reports, self_ptr, self_func, &parms);
- err= (BPy_reports_to_error(&reports))? -1: 0;
- BKE_reports_clear(&reports);
+ err= (BPy_reports_to_error(&reports, TRUE))? -1: 0;
/* return value */
if(err==0) {
@@ -3714,13 +4143,13 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
flag= RNA_property_flag(parm);
if (flag & PROP_OUTPUT)
- PyTuple_SET_ITEM(ret, i++, pyrna_param_to_py(&funcptr, &parms, parm, iter.data));
+ PyTuple_SET_ITEM(ret, i++, pyrna_param_to_py(&funcptr, parm, iter.data));
}
RNA_parameter_list_end(&iter);
}
else
- ret= pyrna_param_to_py(&funcptr, &parms, pret_single, retdata_single);
+ ret= pyrna_param_to_py(&funcptr, pret_single, retdata_single);
/* possible there is an error in conversion */
if(ret==NULL)
@@ -3742,14 +4171,94 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
Py_RETURN_NONE;
}
+
+/* subclasses of pyrna_struct_Type which support idprop definitions use this as a metaclass */
+/* note: tp_base member is set to &PyType_Type on init */
+PyTypeObject pyrna_struct_meta_idprop_Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "bpy_struct_meta_idprop", /* tp_name */
+ sizeof(PyHeapTypeObject), /* tp_basicsize */ // XXX, would be PyTypeObject, but subtypes of Type must be PyHeapTypeObject's
+ 0, /* tp_itemsize */
+ /* methods */
+ NULL, /* tp_dealloc */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_repr */
+
+ /* Method suites for standard classes */
+ NULL, /* PyNumberMethods *tp_as_number; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
+
+ /* More standard operations (here for binary compatibility) */
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+ NULL /*(getattrofunc) pyrna_struct_meta_idprop_getattro*/, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_struct_meta_idprop_setattro, /* setattrofunc tp_setattro; */
+
+ /* Functions to access object as input/output buffer */
+ NULL, /* PyBufferProcs *tp_as_buffer; */
+
+ /*** Flags to define presence of optional/expanded features ***/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
+
+ NULL, /* char *tp_doc; Documentation string */
+ /*** Assigned meaning in release 2.0 ***/
+ /* call function for all accessible objects */
+ NULL, /* traverseproc tp_traverse; */
+
+ /* delete references to contained objects */
+ NULL, /* inquiry tp_clear; */
+
+ /*** Assigned meaning in release 2.1 ***/
+ /*** rich comparisons ***/
+ NULL, /* richcmpfunc tp_richcompare; */
+
+ /*** weak reference enabler ***/
+ 0, /* long tp_weaklistoffset; */
+
+ /*** Added in release 2.2 ***/
+ /* Iterators */
+ NULL, /* getiterfunc tp_iter; */
+ NULL, /* iternextfunc tp_iternext; */
+
+ /*** Attribute descriptor and subclassing stuff ***/
+ NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMemberDef *tp_members; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct _typeobject *tp_base; */
+ NULL, /* PyObject *tp_dict; */
+ NULL, /* descrgetfunc tp_descr_get; */
+ NULL, /* descrsetfunc tp_descr_set; */
+ 0, /* long tp_dictoffset; */
+ NULL, /* initproc tp_init; */
+ NULL, /* allocfunc tp_alloc; */
+ NULL, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ NULL, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ NULL, /* inquiry tp_is_gc; */
+ NULL, /* PyObject *tp_bases; */
+ /* method resolution order */
+ NULL, /* PyObject *tp_mro; */
+ NULL, /* PyObject *tp_cache; */
+ NULL, /* PyObject *tp_subclasses; */
+ NULL, /* PyObject *tp_weaklist; */
+ NULL
+};
+
+
/*-----------------------BPy_StructRNA method def------------------------------*/
PyTypeObject pyrna_struct_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_struct", /* tp_name */
- sizeof( BPy_StructRNA ), /* tp_basicsize */
+ sizeof(BPy_StructRNA), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- ( destructor ) pyrna_struct_dealloc,/* tp_dealloc */
+ (destructor) pyrna_struct_dealloc,/* tp_dealloc */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
@@ -3789,8 +4298,11 @@ PyTypeObject pyrna_struct_Type = {
(richcmpfunc)pyrna_struct_richcmp, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
-
+#ifdef USE_WEAKREFS
+ offsetof(BPy_StructRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
/*** Added in release 2.2 ***/
/* Iterators */
NULL, /* getiterfunc tp_iter; */
@@ -3825,11 +4337,11 @@ PyTypeObject pyrna_struct_Type = {
PyTypeObject pyrna_prop_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop", /* tp_name */
- sizeof( BPy_PropertyRNA ), /* tp_basicsize */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
- NULL, /* printfunc tp_print; */
+ (destructor) pyrna_prop_dealloc, /* tp_dealloc */
+ NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
@@ -3870,7 +4382,11 @@ PyTypeObject pyrna_prop_Type = {
(richcmpfunc)pyrna_prop_richcmp, /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
+#ifdef USE_WEAKREFS
+ offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
/*** Added in release 2.2 ***/
/* Iterators */
@@ -3905,10 +4421,10 @@ PyTypeObject pyrna_prop_Type = {
PyTypeObject pyrna_prop_array_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_array", /* tp_name */
- sizeof( BPy_PropertyArrayRNA ), /* tp_basicsize */
- 0, /* tp_itemsize */
+ sizeof(BPy_PropertyArrayRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
+ (destructor)pyrna_prop_array_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
@@ -3950,8 +4466,11 @@ PyTypeObject pyrna_prop_array_Type = {
NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
-
+#ifdef USE_WEAKREFS
+ offsetof(BPy_PropertyArrayRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
/*** Added in release 2.2 ***/
/* Iterators */
(getiterfunc)pyrna_prop_array_iter, /* getiterfunc tp_iter; */
@@ -3985,10 +4504,10 @@ PyTypeObject pyrna_prop_array_Type = {
PyTypeObject pyrna_prop_collection_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection", /* tp_name */
- sizeof( BPy_PropertyRNA ), /* tp_basicsize */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
+ (destructor)pyrna_prop_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
@@ -4030,7 +4549,11 @@ PyTypeObject pyrna_prop_collection_Type = {
NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
+#ifdef USE_WEAKREFS
+ offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
/*** Added in release 2.2 ***/
/* Iterators */
@@ -4063,19 +4586,19 @@ PyTypeObject pyrna_prop_collection_Type = {
};
/* only for add/remove/move methods */
-PyTypeObject pyrna_prop_collection_idprop_Type = {
+static PyTypeObject pyrna_prop_collection_idprop_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection_idprop", /* tp_name */
- sizeof( BPy_PropertyRNA ), /* tp_basicsize */
- 0, /* tp_itemsize */
+ sizeof(BPy_PropertyRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
+ (destructor)pyrna_prop_dealloc, /* tp_dealloc */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
NULL, /* subclassed */ /* tp_repr */
-
+
/* Method suites for standard classes */
NULL, /* PyNumberMethods *tp_as_number; */
@@ -4111,7 +4634,11 @@ PyTypeObject pyrna_prop_collection_idprop_Type = {
NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
/*** weak reference enabler ***/
- 0, /* long tp_weaklistoffset; */
+#ifdef USE_WEAKREFS
+ offsetof(BPy_PropertyRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
/*** Added in release 2.2 ***/
/* Iterators */
@@ -4147,7 +4674,6 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
{
PointerRNA ptr;
PyObject *item;
- PyObject *newclass_dict= ((PyTypeObject *)newclass)->tp_dict;
Py_INCREF(newclass);
@@ -4165,11 +4691,12 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
item = pyrna_struct_CreatePyObject(&ptr);
- //item = PyCapsule_New(srna, NULL, NULL);
- PyDict_SetItemString(newclass_dict, "bl_rna", item);
+ /* note, must set the class not the __dict__ else the internal slots are not updated correctly */
+ PyObject_SetAttrString(newclass, "bl_rna", item);
Py_DECREF(item);
+
/* done with rna instance */
- }
+}
static PyObject* pyrna_srna_Subtype(StructRNA *srna);
@@ -4199,14 +4726,15 @@ static PyObject* pyrna_srna_PyBase(StructRNA *srna) //, PyObject *bpy_types_dict
/* check if we have a native python subclass, use it when it exists
* return a borrowed reference */
+static PyObject *bpy_types_dict= NULL;
+
static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
{
- PyObject *bpy_types_dict= NULL;
const char *idname= RNA_struct_identifier(srna);
PyObject *newclass;
if(bpy_types_dict==NULL) {
- PyObject *bpy_types= PyImport_ImportModuleLevel("bpy_types", NULL, NULL, NULL, 0);
+ PyObject *bpy_types= PyImport_ImportModuleLevel((char *)"bpy_types", NULL, NULL, NULL, 0);
if(bpy_types==NULL) {
PyErr_Print();
@@ -4214,7 +4742,6 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n");
return NULL;
}
-
bpy_types_dict = PyModule_GetDict(bpy_types); // borrow
Py_DECREF(bpy_types); // fairly safe to assume the dict is kept
}
@@ -4276,16 +4803,24 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
/* Assume RNA_struct_py_type_get(srna) was already checked */
PyObject *py_base= pyrna_srna_PyBase(srna);
-
+ PyObject *metaclass;
const char *idname= RNA_struct_identifier(srna);
/* remove __doc__ for now */
// const char *descr= RNA_struct_ui_description(srna);
// if(!descr) descr= "(no docs)";
// "__doc__",descr
-
+
+ if(RNA_struct_idprops_check(srna) && !PyObject_IsSubclass(py_base, (PyObject *)&pyrna_struct_meta_idprop_Type)) {
+ metaclass= (PyObject *)&pyrna_struct_meta_idprop_Type;
+ }
+ else {
+ metaclass= (PyObject *)&PyType_Type;
+ }
+
/* always use O not N when calling, N causes refcount errors */
- newclass = PyObject_CallFunction((PyObject*)&PyType_Type, "s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
+ newclass = PyObject_CallFunction(metaclass, (char *)"s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
+
/* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
/* PyC_ObSpit("new class ref", newclass); */
@@ -4299,6 +4834,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
}
else {
/* this should not happen */
+ printf("Error registering '%s'\n", idname);
PyErr_Print();
PyErr_Clear();
}
@@ -4343,11 +4879,14 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
else {
fprintf(stderr, "Could not make type\n");
pyrna = ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
+#ifdef USE_WEAKREFS
+ pyrna->in_weakreflist= NULL;
+#endif
}
}
if( !pyrna ) {
- PyErr_SetString( PyExc_MemoryError, "couldn't create bpy_struct object" );
+ PyErr_SetString(PyExc_MemoryError, "couldn't create bpy_struct object");
return NULL;
}
@@ -4364,7 +4903,7 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
BPy_PropertyRNA *pyrna;
if (RNA_property_array_check(ptr, prop) == 0) {
- PyTypeObject *type;
+ PyTypeObject *type;
if (RNA_property_type(prop) != PROP_COLLECTION) {
type= &pyrna_prop_Type;
@@ -4378,22 +4917,28 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
}
}
- pyrna = ( BPy_PropertyRNA * ) PyObject_NEW(BPy_PropertyRNA, type);
+ pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyRNA, type);
+#ifdef USE_WEAKREFS
+ pyrna->in_weakreflist= NULL;
+#endif
}
else {
pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyArrayRNA, &pyrna_prop_array_Type);
((BPy_PropertyArrayRNA *)pyrna)->arraydim= 0;
((BPy_PropertyArrayRNA *)pyrna)->arrayoffset= 0;
+#ifdef USE_WEAKREFS
+ ((BPy_PropertyArrayRNA *)pyrna)->in_weakreflist= NULL;
+#endif
}
if( !pyrna ) {
- PyErr_SetString( PyExc_MemoryError, "couldn't create BPy_rna object" );
+ PyErr_SetString(PyExc_MemoryError, "couldn't create BPy_rna object");
return NULL;
}
pyrna->ptr = *ptr;
pyrna->prop = prop;
-
+
return ( PyObject * ) pyrna;
}
@@ -4403,7 +4948,12 @@ void BPY_rna_init(void)
mathutils_rna_array_cb_index= Mathutils_RegisterCallback(&mathutils_rna_array_cb);
mathutils_rna_matrix_cb_index= Mathutils_RegisterCallback(&mathutils_rna_matrix_cb);
#endif
-
+
+ /* metaclass */
+ pyrna_struct_meta_idprop_Type.tp_base= &PyType_Type;
+ if( PyType_Ready( &pyrna_struct_meta_idprop_Type ) < 0 )
+ return;
+
if( PyType_Ready( &pyrna_struct_Type ) < 0 )
return;
@@ -4462,16 +5012,16 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
{
PointerRNA newptr;
PyObject *ret;
- char *name= _PyUnicode_AsString(pyname);
-
- if(strcmp(name, "register")==0) {
- /* this is called so often, make an exception and save a full lookup on all types */
- ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+ const char *name= _PyUnicode_AsString(pyname);
+
+ if(name == NULL) {
+ PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string");
+ ret = NULL;
}
else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
ret= pyrna_struct_Subtype(&newptr);
if (ret==NULL) {
- PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
+ PyErr_Format(PyExc_RuntimeError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
}
}
else {
@@ -4487,33 +5037,35 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
}
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
-static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class);
-static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
+static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
static struct PyMethodDef pyrna_basetype_methods[] = {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
- {"register", (PyCFunction)pyrna_basetype_register, METH_O, ""},
- {"unregister", (PyCFunction)pyrna_basetype_unregister, METH_O, ""},
{NULL, NULL, 0, NULL}
};
static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
{
- PyObject *list, *name;
+ PyObject *list;
+#if 0
+ PyObject *name;
PyMethodDef *meth;
-
- list= pyrna_prop_keys(self); /* like calling structs.keys(), avoids looping here */
+#endif
+
+ list= pyrna_prop_collection_keys(self); /* like calling structs.keys(), avoids looping here */
+#if 0 /* for now only contains __dir__ */
for(meth=pyrna_basetype_methods; meth->ml_name; meth++) {
name = PyUnicode_FromString(meth->ml_name);
PyList_Append(list, name);
Py_DECREF(name);
}
-
+#endif
return list;
}
-PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
+static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
PyObject *BPY_rna_types(void)
{
@@ -4521,7 +5073,7 @@ PyObject *BPY_rna_types(void)
if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY)==0) {
pyrna_basetype_Type.tp_name = "RNA_Types";
- pyrna_basetype_Type.tp_basicsize = sizeof( BPy_BaseTypeRNA );
+ pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA);
pyrna_basetype_Type.tp_getattro = ( getattrofunc )pyrna_basetype_getattro;
pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
@@ -4535,7 +5087,9 @@ PyObject *BPY_rna_types(void)
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&self->ptr);
self->prop = RNA_struct_find_property(&self->ptr, "structs");
-
+#ifdef USE_WEAKREFS
+ self->in_weakreflist= NULL;
+#endif
return (PyObject *)self;
}
@@ -4558,18 +5112,18 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
}
if(py_srna==NULL) {
- PyErr_Format(PyExc_SystemError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name);
return NULL;
}
if(!BPy_StructRNA_Check(py_srna)) {
- PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name);
Py_DECREF(py_srna);
return NULL;
}
if(py_srna->ptr.type != &RNA_Struct) {
- PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name);
+ PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name);
Py_DECREF(py_srna);
return NULL;
}
@@ -4582,12 +5136,10 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
/* Orphan functions, not sure where they should go */
/* get the srna for methods attached to types */
-/* */
+/*
+ * Caller needs to raise error.*/
StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
{
- /* a bit sloppy but would cause a very confusing bug if
- * an error happened to be set here */
- PyErr_Clear();
if(self==NULL) {
return NULL;
@@ -4598,35 +5150,52 @@ StructRNA *srna_from_self(PyObject *self, const char *error_prefix)
else if (PyType_Check(self)==0) {
return NULL;
}
- /* These cases above not errors, they just mean the type was not compatible
- * After this any errors will be raised in the script */
+ else {
+ /* These cases above not errors, they just mean the type was not compatible
+ * After this any errors will be raised in the script */
+
+ PyObject *error_type, *error_value, *error_traceback;
+ StructRNA *srna;
+
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyErr_Clear();
+
+ srna= pyrna_struct_as_srna(self, 0, error_prefix);
+
+ if(!PyErr_Occurred()) {
+ PyErr_Restore(error_type, error_value, error_traceback);
+ }
- return pyrna_struct_as_srna(self, 0, error_prefix);
+ return srna;
+ }
}
-static int deferred_register_prop(StructRNA *srna, PyObject *item, PyObject *key, PyObject *dummy_args)
+static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item)
{
/* We only care about results from C which
* are for sure types, save some time with error */
- if(PyTuple_CheckExact(item) && PyTuple_GET_SIZE(item)==2) {
+ if(pyrna_is_deferred_prop(item)) {
- PyObject *py_func_ptr, *py_kw, *py_srna_cobject, *py_ret;
- PyObject *(*pyfunc)(PyObject *, PyObject *, PyObject *);
+ PyObject *py_func, *py_kw, *py_srna_cobject, *py_ret;
- if(PyArg_ParseTuple(item, "O!O!", &PyCapsule_Type, &py_func_ptr, &PyDict_Type, &py_kw)) {
+ if(PyArg_ParseTuple(item, "OO!", &py_func, &PyDict_Type, &py_kw)) {
+ PyObject *args_fake;
if(*_PyUnicode_AsString(key)=='_') {
PyErr_Format(PyExc_ValueError, "bpy_struct \"%.200s\" registration error: %.200s could not register because the property starts with an '_'\n", RNA_struct_identifier(srna), _PyUnicode_AsString(key));
return -1;
}
- pyfunc = PyCapsule_GetPointer(py_func_ptr, NULL);
py_srna_cobject = PyCapsule_New(srna, NULL, NULL);
/* not 100% nice :/, modifies the dict passed, should be ok */
PyDict_SetItemString(py_kw, "attr", key);
+
+ args_fake= PyTuple_New(1);
+ PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
+
+ py_ret = PyObject_Call(py_func, args_fake, py_kw);
- py_ret = pyfunc(py_srna_cobject, dummy_args, py_kw);
- Py_DECREF(py_srna_cobject);
+ Py_DECREF(args_fake); /* free's py_srna_cobject too */
if(py_ret) {
Py_DECREF(py_ret);
@@ -4657,36 +5226,31 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
{
PyObject *item, *key;
PyObject *order;
- PyObject *dummy_args;
Py_ssize_t pos = 0;
- int ret;
+ int ret= 0;
- dummy_args = PyTuple_New(0);
+ /* in both cases PyDict_CheckExact(class_dict) will be true even
+ * though Operators have a metaclass dict namespace */
- if( !PyDict_CheckExact(class_dict) &&
- (order= PyDict_GetItemString(class_dict, "order")) &&
- PyList_CheckExact(order)
- ) {
+ if((order= PyDict_GetItemString(class_dict, "order")) && PyList_CheckExact(order)) {
for(pos= 0; pos<PyList_GET_SIZE(order); pos++) {
key= PyList_GET_ITEM(order, pos);
item= PyDict_GetItem(class_dict, key);
- ret= deferred_register_prop(srna, item, key, dummy_args);
- if(ret==-1)
+ ret= deferred_register_prop(srna, key, item);
+ if(ret != 0)
break;
}
}
else {
while (PyDict_Next(class_dict, &pos, &key, &item)) {
- ret= deferred_register_prop(srna, item, key, dummy_args);
+ ret= deferred_register_prop(srna, key, item);
- if(ret==-1)
+ if(ret != 0)
break;
}
}
- Py_DECREF(dummy_args);
-
- return 0;
+ return ret;
}
static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject *py_class)
@@ -4768,13 +5332,13 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (base_class) {
if (!PyObject_IsSubclass(py_class, base_class)) {
- PyErr_Format( PyExc_TypeError, "expected %.200s subclass of class \"%.200s\"", class_type, py_class_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s subclass of class \"%.200s\"", class_type, py_class_name);
return -1;
}
}
/* verify callback functions */
- lb= RNA_struct_defined_functions(srna);
+ lb= RNA_struct_type_functions(srna);
i= 0;
for(link=lb->first; link; link=link->next) {
func= (FunctionRNA*)link;
@@ -4790,7 +5354,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (item==NULL) {
if ((flag & FUNC_REGISTER_OPTIONAL)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, RNA_function_identifier(func));
+ PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, RNA_function_identifier(func));
return -1;
}
@@ -4800,14 +5364,14 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
Py_DECREF(item); /* no need to keep a ref, the class owns it (technically we should keep a ref but...) */
if(flag & FUNC_NO_SELF) {
if (PyMethod_Check(item)==0) {
- PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a method, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
return -1;
}
item= ((PyMethodObject *)item)->im_func;
}
else {
if (PyFunction_Check(item)==0) {
- PyErr_Format( PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
+ PyErr_Format(PyExc_TypeError, "expected %.200s, %.200s class \"%.200s\" attribute to be a function, not a %.200s", class_type, py_class_name, RNA_function_identifier(func), Py_TYPE(item)->tp_name);
return -1;
}
}
@@ -4816,7 +5380,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (func_arg_count >= 0) { /* -1 if we dont care*/
py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
- arg_count = PyLong_AsSsize_t(py_arg_count);
+ arg_count = PyLong_AsLong(py_arg_count);
Py_DECREF(py_arg_count);
/* note, the number of args we check for and the number of args we give to
@@ -4825,7 +5389,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
func_arg_count++;
if (arg_count != func_arg_count) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count);
+ PyErr_Format(PyExc_ValueError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count);
return -1;
}
}
@@ -4833,7 +5397,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
}
/* verify properties */
- lb= RNA_struct_defined_properties(srna);
+ lb= RNA_struct_type_properties(srna);
for(link=lb->first; link; link=link->next) {
const char *identifier;
prop= (PropertyRNA*)link;
@@ -4852,7 +5416,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if(strcmp(identifier, rna_attr) == 0) { \
item= PyObject_GetAttrString(py_class, py_attr); \
if(item && item != Py_None) { \
- if(pyrna_py_to_prop(dummyptr, prop, NULL, NULL, item, "validating class error:") != 0) { \
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0) { \
Py_DECREF(item); \
return -1; \
} \
@@ -4867,7 +5431,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
#undef BPY_REPLACEMENT_STRING
if (item == NULL && (((flag & PROP_REGISTER_OPTIONAL) != PROP_REGISTER_OPTIONAL))) {
- PyErr_Format( PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier);
+ PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class to have an \"%.200s\" attribute", class_type, py_class_name, identifier);
return -1;
}
@@ -4876,7 +5440,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
else {
Py_DECREF(item); /* no need to keep a ref, the class owns it */
- if(pyrna_py_to_prop(dummyptr, prop, NULL, NULL, item, "validating class error:") != 0)
+ if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0)
return -1;
}
}
@@ -4884,13 +5448,12 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
return 0;
}
-extern void BPY_update_modules( void ); //XXX temp solution
-
/* TODO - multiple return values like with rna functions */
-static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
+static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
{
PyObject *args;
- PyObject *ret= NULL, *py_srna= NULL, *py_class, *py_class_instance= NULL, *parmitem;
+ PyObject *ret= NULL, *py_srna= NULL, *py_class_instance= NULL, *parmitem;
+ PyTypeObject *py_class;
void **py_class_instance_store= NULL;
PropertyRNA *parm;
ParameterIterator iter;
@@ -4903,7 +5466,11 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
PyGILState_STATE gilstate;
- bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
+#ifdef USE_PEDANTIC_WRITE
+ const char *func_id= RNA_function_identifier(func);
+ /* testing, for correctness, not operator and not draw function */
+ const short is_readonly= strstr("draw", func_id) || /*strstr("render", func_id) ||*/ !RNA_struct_is_a(ptr->type, &RNA_Operator);
+#endif
py_class= RNA_struct_py_type_get(ptr->type);
@@ -4912,7 +5479,12 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
return -1;
}
-
+
+ /* XXX, this is needed because render engine calls without a context
+ * this should be supported at some point but at the moment its not! */
+ if(C==NULL)
+ C= BPy_GetContext();
+
bpy_context_set(C, &gilstate);
if (!is_static) {
@@ -4946,11 +5518,39 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
py_class_instance = NULL;
}
else {
+#if 1
+ /* Skip the code below and call init directly on the allocated 'py_srna'
+ * otherwise __init__() always needs to take a second self argument, see pyrna_struct_new().
+ * Although this is annoying to have to impliment a part of pythons typeobject.c:type_call().
+ */
+ if(py_class->tp_init) {
+ /* true in most cases even when the class its self doesnt define an __init__ function. */
+ args = PyTuple_New(0);
+ if (py_class->tp_init(py_srna, args, NULL) < 0) {
+ Py_DECREF(py_srna);
+ py_srna= NULL;
+ /* err set below */
+ }
+ Py_DECREF(args);
+ }
+
+ py_class_instance= py_srna;
+
+#else
+ /* 'almost' all the time calling the class isnt needed.
+ * We could just do...
+ py_class_instance = py_srna;
+ Py_INCREF(py_class_instance);
+ * This would work fine but means __init__ functions wouldnt run.
+ * none of blenders default scripts use __init__ but its nice to call it
+ * for general correctness. just to note why this is here when it could be safely removed.
+ */
args = PyTuple_New(1);
PyTuple_SET_ITEM(args, 0, py_srna);
py_class_instance= PyObject_Call(py_class, args, NULL);
Py_DECREF(args);
-
+
+#endif
if(py_class_instance == NULL) {
err= -1; /* so the error is not overridden below */
}
@@ -4961,8 +5561,8 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
}
- if (is_static || py_class_instance) { /* Initializing the class worked, now run its invoke function */
- PyObject *item= PyObject_GetAttrString(py_class, RNA_function_identifier(func));
+ if (err != -1 && (is_static || py_class_instance)) { /* Initializing the class worked, now run its invoke function */
+ PyObject *item= PyObject_GetAttrString((PyObject *)py_class, RNA_function_identifier(func));
// flag= RNA_function_flag(func);
if(item) {
@@ -4996,13 +5596,24 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
continue;
}
- parmitem= pyrna_param_to_py(&funcptr, parms, parm, iter.data);
+ parmitem= pyrna_param_to_py(&funcptr, parm, iter.data);
PyTuple_SET_ITEM(args, i, parmitem);
i++;
}
+#ifdef USE_PEDANTIC_WRITE
+ rna_disallow_writes= is_readonly ? TRUE:FALSE;
+#endif
+ /* *** Main Caller *** */
+
ret = PyObject_Call(item, args, NULL);
+ /* *** Done Calling *** */
+
+#ifdef USE_PEDANTIC_WRITE
+ rna_disallow_writes= FALSE;
+#endif
+
RNA_parameter_list_end(&iter);
Py_DECREF(item);
Py_DECREF(args);
@@ -5010,14 +5621,14 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
else {
PyErr_Print();
PyErr_Clear();
- PyErr_Format(PyExc_TypeError, "could not find function %.200s in %.200s to execute callback.", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
+ PyErr_Format(PyExc_TypeError, "could not find function %.200s in %.200s to execute callback", RNA_function_identifier(func), RNA_struct_identifier(ptr->type));
err= -1;
}
}
else {
/* the error may be alredy set if the class instance couldnt be created */
if(err != -1) {
- PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
+ PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
err= -1;
}
}
@@ -5026,17 +5637,21 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
err= -1;
}
else {
- if(ret_len==1) {
- err= pyrna_py_to_prop(&funcptr, pret_single, parms, retdata_single, ret, "calling class function:");
+ if(ret_len==0 && ret != Py_None) {
+ PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return None, not %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), Py_TYPE(ret)->tp_name);
+ err= -1;
+ }
+ else if(ret_len==1) {
+ err= pyrna_py_to_prop(&funcptr, pret_single, retdata_single, ret, "calling class function:");
}
else if (ret_len > 1) {
if(PyTuple_Check(ret)==0) {
- PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len);
+ PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d, not %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len, Py_TYPE(ret)->tp_name);
err= -1;
}
else if (PyTuple_GET_SIZE(ret) != ret_len) {
- PyErr_Format(PyExc_RuntimeError, "class %.200s, function %.200s to returned %d items, expected %d.", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), PyTuple_GET_SIZE(ret), ret_len);
+ PyErr_Format(PyExc_RuntimeError, "class %.200s, function %.200s to returned %d items, expected %d", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), PyTuple_GET_SIZE(ret), ret_len);
err= -1;
}
else {
@@ -5050,7 +5665,7 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
/* only useful for single argument returns, we'll need another list loop for multiple */
if (flag & PROP_OUTPUT) {
- err= pyrna_py_to_prop(&funcptr, parm, parms, iter.data, PyTuple_GET_ITEM(ret, i++), "calling class function:");
+ err= pyrna_py_to_prop(&funcptr, parm, iter.data, PyTuple_GET_ITEM(ret, i++), "calling class function:");
if(err)
break;
}
@@ -5063,6 +5678,20 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par
}
if(err != 0) {
+ ReportList *reports;
+ /* alert the user, else they wont know unless they see the console. */
+ if (!is_static && ptr->data && RNA_struct_is_a(ptr->type, &RNA_Operator)) {
+ wmOperator *op= ptr->data;
+ reports= op->reports;
+ }
+ else {
+ /* wont alert users but they can view in 'info' space */
+ reports= CTX_wm_reports(C);
+ }
+
+ BPy_errors_to_report(reports);
+
+ /* also print in the console for py */
PyErr_Print();
PyErr_Clear();
}
@@ -5087,12 +5716,13 @@ static void bpy_class_free(void *pyob_ptr)
if(PyErr_Occurred())
PyErr_Clear();
+#if 0 /* needs further investigation, too annoying so quiet for now */
if(G.f&G_DEBUG) {
if(self->ob_refcnt > 1) {
PyC_ObSpit("zombie class - ref should be 1", self);
}
}
-
+#endif
Py_DECREF((PyObject *)pyob_ptr);
PyGILState_Release(gilstate);
@@ -5163,8 +5793,16 @@ void pyrna_free_types(void)
* the decref. This is not so bad because the leak only happens when re-registering (hold F8)
* - Should still be fixed - Campbell
* */
-
-static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
+static char pyrna_register_class_doc[] =
+".. method:: register_class(cls)\n"
+"\n"
+" Register a subclass of a blender type in (:class:`Panel`, :class:`Menu`, :class:`Header`, :class:`Operator`, :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
+"\n"
+" .. note:: :exc:`ValueError` exception is raised if the class is not a subclass of a registerable blender class.\n"
+"\n"
+;
+PyMethodDef meth_bpy_register_class = {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
+static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
ReportList reports;
@@ -5174,19 +5812,19 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
const char *identifier;
if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) {
- PyErr_SetString(PyExc_AttributeError, "bpy.types.register(...): already registered as a subclass.");
+ PyErr_SetString(PyExc_AttributeError, "register_class(...): already registered as a subclass");
return NULL;
}
/* warning: gets parent classes srna, only for the register function */
- srna= pyrna_struct_as_srna(py_class, 1, "bpy.types.register(...):");
+ srna= pyrna_struct_as_srna(py_class, 1, "register_class(...):");
if(srna==NULL)
return NULL;
/* fails in cases, cant use this check but would like to :| */
/*
if(RNA_struct_py_type_get(srna)) {
- PyErr_Format(PyExc_ValueError, "bpy.types.register(...): %.200s's parent class %.200s is alredy registered, this is not allowed.", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
+ PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is alredy registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
return NULL;
}
*/
@@ -5195,7 +5833,7 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
reg= RNA_struct_register(srna);
if(!reg) {
- PyErr_Format(PyExc_ValueError, "bpy.types.register(...): expected a subclass of a registerable rna type (%.200s does not support registration).", RNA_struct_identifier(srna));
+ PyErr_Format(PyExc_ValueError, "register_class(...): expected a subclass of a registerable rna type (%.200s does not support registration)", RNA_struct_identifier(srna));
return NULL;
}
@@ -5209,13 +5847,13 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
srna_new= reg(C, &reports, py_class, identifier, bpy_class_validate, bpy_class_call, bpy_class_free);
- if(!srna_new) {
- BPy_reports_to_error(&reports);
- BKE_reports_clear(&reports);
+ if(BPy_reports_to_error(&reports, TRUE))
return NULL;
- }
- BKE_reports_clear(&reports);
+ /* python errors validating are not converted into reports so the check above will fail.
+ * the cause for returning NULL will be printed as an error */
+ if(srna_new == NULL)
+ return NULL;
pyrna_subtype_set_rna(py_class, srna_new); /* takes a ref to py_class */
@@ -5238,30 +5876,35 @@ static PyObject *pyrna_basetype_register(PyObject *self, PyObject *py_class)
static int pyrna_srna_contains_pointer_prop_srna(StructRNA *srna_props, StructRNA *srna, const char **prop_identifier)
{
- PointerRNA tptr;
- PropertyRNA *iterprop;
- RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
-
- iterprop= RNA_struct_find_property(&tptr, "properties");
+ PropertyRNA *prop;
+ LinkData *link;
- RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
- PropertyRNA *prop= itemptr.data;
- if(RNA_property_type(prop) == PROP_POINTER) {
- if (strcmp(RNA_property_identifier(prop), "rna_type") == 0) {
- /* pass */
- }
- else if(RNA_property_pointer_type(&tptr, prop) == srna) {
+ /* verify properties */
+ const ListBase *lb= RNA_struct_type_properties(srna);
+
+ for(link=lb->first; link; link=link->next) {
+ prop= (PropertyRNA*)link;
+ if(RNA_property_type(prop) == PROP_POINTER && !(RNA_property_flag(prop) & PROP_BUILTIN)) {
+ PointerRNA tptr;
+ RNA_pointer_create(NULL, &RNA_Struct, srna_props, &tptr);
+
+ if(RNA_property_pointer_type(&tptr, prop) == srna) {
*prop_identifier= RNA_property_identifier(prop);
return 1;
}
}
}
- RNA_PROP_END;
-
+
return 0;
}
-static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
+static char pyrna_unregister_class_doc[] =
+".. method:: unregister_class(cls)\n"
+"\n"
+" Unload the python class from blender.\n"
+;
+PyMethodDef meth_bpy_unregister_class = {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
+static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
StructUnregisterFunc unreg;
@@ -5269,11 +5912,11 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
/*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) {
PWM_cursor_wait(0);
- PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(): not a registered as a subclass.");
+ PyErr_SetString(PyExc_ValueError, "unregister_class(): not a registered as a subclass");
return NULL;
}*/
- srna= pyrna_struct_as_srna(py_class, 0, "bpy.types.unregister(...):");
+ srna= pyrna_struct_as_srna(py_class, 0, "unregister_class(...):");
if(srna==NULL)
return NULL;
@@ -5281,7 +5924,7 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
unreg= RNA_struct_unregister(srna);
if(!unreg) {
- PyErr_SetString(PyExc_ValueError, "bpy.types.unregister(...): expected a Type subclassed from a registerable rna type (no unregister supported).");
+ PyErr_SetString(PyExc_ValueError, "unregister_class(...): expected a Type subclassed from a registerable rna type (no unregister supported)");
return NULL;
}
@@ -5308,7 +5951,7 @@ static PyObject *pyrna_basetype_unregister(PyObject *self, PyObject *py_class)
RNA_PROP_END;
if(prop_identifier) {
- PyErr_Format(PyExc_SystemError, "bpy.types.unregister(...): Cant unregister %s because %s.%s pointer property is using this.", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
+ PyErr_Format(PyExc_RuntimeError, "unregister_class(...): can't unregister %s because %s.%s pointer property is using this", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
return NULL;
}
}
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index 14c6ff4a1a3..e213ce90dae 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -24,12 +24,11 @@
#ifndef BPY_RNA_H
#define BPY_RNA_H
-#include <Python.h>
-
#include "RNA_access.h"
#include "RNA_types.h"
#include "BKE_idprop.h"
+extern PyTypeObject pyrna_struct_meta_idprop_Type;
extern PyTypeObject pyrna_struct_Type;
extern PyTypeObject pyrna_prop_Type;
extern PyTypeObject pyrna_prop_array_Type;
@@ -40,21 +39,33 @@ extern PyTypeObject pyrna_prop_collection_Type;
#define BPy_PropertyRNA_Check(v) (PyObject_TypeCheck(v, &pyrna_prop_Type))
#define BPy_PropertyRNA_CheckExact(v) (Py_TYPE(v) == &pyrna_prop_Type)
+/* play it safe and keep optional for now, need to test further now this affects looping on 10000's of verts for eg. */
+// #define USE_WEAKREFS
+
typedef struct {
PyObject_HEAD /* required python macro */
- PointerRNA ptr;
+ PointerRNA ptr;
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist;
+#endif
} BPy_DummyPointerRNA;
typedef struct {
PyObject_HEAD /* required python macro */
PointerRNA ptr;
int freeptr; /* needed in some cases if ptr.data is created on the fly, free when deallocing */
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist;
+#endif
} BPy_StructRNA;
typedef struct {
PyObject_HEAD /* required python macro */
PointerRNA ptr;
PropertyRNA *prop;
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist;
+#endif
} BPy_PropertyRNA;
typedef struct {
@@ -65,6 +76,9 @@ typedef struct {
/* Arystan: this is a hack to allow sub-item r/w access like: face.uv[n][m] */
int arraydim; /* array dimension, e.g: 0 for face.uv, 2 for face.uv[n][m], etc. */
int arrayoffset; /* array first item offset, e.g. if face.uv is [4][2], arrayoffset for face.uv[n] is 2n */
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist;
+#endif
} BPy_PropertyArrayRNA;
/* cheap trick */
@@ -98,12 +112,21 @@ void pyrna_alloc_types(void);
void pyrna_free_types(void);
/* primitive type conversion */
-int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, ParameterList *parms, char *param_data, PyObject *py, const char *error_prefix);
+int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix);
int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix);
+PyObject *pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index);
PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop);
PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index);
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop);
int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value);
+int pyrna_write_check(void);
+
+void BPY_modules_update(struct bContext *C); //XXX temp solution
+
+/* bpy.utils.(un)register_class */
+extern PyMethodDef meth_bpy_register_class;
+extern PyMethodDef meth_bpy_unregister_class;
+
#endif
diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c
new file mode 100644
index 00000000000..74ce5f66cfd
--- /dev/null
+++ b/source/blender/python/intern/bpy_rna_array.c
@@ -0,0 +1,628 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Arystanbek Dyussenov
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include <Python.h>
+
+#include "bpy_rna.h"
+#include "BKE_global.h"
+#include "MEM_guardedalloc.h"
+
+#define MAX_ARRAY_DIMENSION 10
+
+typedef void (*ItemConvertFunc)(PyObject *, char *);
+typedef int (*ItemTypeCheckFunc)(PyObject *);
+typedef void (*RNA_SetArrayFunc)(PointerRNA *, PropertyRNA *, const char *);
+typedef void (*RNA_SetIndexFunc)(PointerRNA *, PropertyRNA *, int index, void *);
+
+/*
+ arr[3][4][5]
+ 0 1 2 <- dimension index
+*/
+
+/*
+ arr[2] = x
+
+ py_to_array_index(arraydim=0, arrayoffset=0, index=2)
+ validate_array(lvalue_dim=0)
+ ... make real index ...
+*/
+
+/* arr[3]=x, self->arraydim is 0, lvalue_dim is 1 */
+/* Ensures that a python sequence has expected number of items/sub-items and items are of desired type. */
+static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[],
+ ItemTypeCheckFunc check_item_type, const char *item_type_str, const char *error_prefix)
+{
+ int i;
+
+ /* not the last dimension */
+ if (dim + 1 < totdim) {
+ /* check that a sequence contains dimsize[dim] items */
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
+ PyObject *item;
+ int ok= 1;
+ item= PySequence_GetItem(seq, i);
+
+ if (!PySequence_Check(item)) {
+ /* BLI_snprintf(error_str, error_str_size, "expected a sequence of %s", item_type_str); */
+ PyErr_Format(PyExc_TypeError, "%s expected a sequence of %s, not %s", error_prefix, item_type_str, Py_TYPE(item)->tp_name);
+ ok= 0;
+ }
+ /* arr[3][4][5]
+ dimsize[1]=4
+ dimsize[2]=5
+
+ dim=0 */
+ else if (PySequence_Size(item) != dimsize[dim + 1]) {
+ /* BLI_snprintf(error_str, error_str_size, "sequences of dimension %d should contain %d items", (int)dim + 1, (int)dimsize[dim + 1]); */
+ PyErr_Format(PyExc_ValueError, "%s sequences of dimension %d should contain %d items", error_prefix, (int)dim + 1, (int)dimsize[dim + 1]);
+ ok= 0;
+ }
+ else if (!validate_array_type(item, dim + 1, totdim, dimsize, check_item_type, item_type_str, error_prefix)) {
+ ok= 0;
+ }
+
+ Py_DECREF(item);
+
+ if (!ok)
+ return 0;
+ }
+ }
+ else {
+ /* check that items are of correct type */
+ const int seq_size= PySequence_Size(seq);
+ for (i= 0; i < seq_size; i++) {
+ PyObject *item= PySequence_GetItem(seq, i);
+
+ if (!check_item_type(item)) {
+ Py_DECREF(item);
+
+ /* BLI_snprintf(error_str, error_str_size, "sequence items should be of type %s", item_type_str); */
+ PyErr_Format(PyExc_TypeError, "%s expected sequence items of type %s, not %s", error_prefix, item_type_str, Py_TYPE(item)->tp_name);
+ return 0;
+ }
+
+ Py_DECREF(item);
+ }
+ }
+
+ return 1;
+}
+
+/* Returns the number of items in a single- or multi-dimensional sequence. */
+static int count_items(PyObject *seq, int dim)
+{
+ int totitem= 0;
+
+ if(dim > 1) {
+ const int seq_size= PySequence_Size(seq);
+ int i;
+ for (i= 0; i < seq_size; i++) {
+ PyObject *item= PySequence_GetItem(seq, i);
+ totitem += count_items(item, dim - 1);
+ Py_DECREF(item);
+ }
+ }
+ else {
+ totitem= PySequence_Size(seq);
+ }
+
+ return totitem;
+}
+
+/* Modifies property array length if needed and PROP_DYNAMIC flag is set. */
+static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int *totitem, const char *error_prefix)
+{
+ int dimsize[MAX_ARRAY_DIMENSION];
+ int tot, totdim, len;
+
+ totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+ tot= count_items(rvalue, totdim);
+
+ if ((RNA_property_flag(prop) & PROP_DYNAMIC) && lvalue_dim == 0) {
+ if (RNA_property_array_length(ptr, prop) != tot) {
+#if 0
+ /* length is flexible */
+ if (!RNA_property_dynamic_array_set_length(ptr, prop, tot)) {
+ /* BLI_snprintf(error_str, error_str_size, "%s.%s: array length cannot be changed to %d", RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot); */
+ PyErr_Format(PyExc_ValueError, "%s %s.%s: array length cannot be changed to %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), tot);
+ return 0;
+ }
+#else
+ *totitem= tot;
+ return 1;
+
+#endif
+ }
+
+ len= tot;
+ }
+ else {
+ /* length is a constraint */
+ if (!lvalue_dim) {
+ len= RNA_property_array_length(ptr, prop);
+ }
+ /* array item assignment */
+ else {
+ int i;
+
+ len= 1;
+
+ /* arr[3][4][5]
+
+ arr[2] = x
+ dimsize={4, 5}
+ dimsize[1] = 4
+ dimsize[2] = 5
+ lvalue_dim=0, totdim=3
+
+ arr[2][3] = x
+ lvalue_dim=1
+
+ arr[2][3][4] = x
+ lvalue_dim=2 */
+ for (i= lvalue_dim; i < totdim; i++)
+ len *= dimsize[i];
+ }
+
+ if (tot != len) {
+ /* BLI_snprintf(error_str, error_str_size, "sequence must have length of %d", len); */
+ PyErr_Format(PyExc_ValueError, "%s %.200s.%.200s, sequence must have %d items total, not %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), len, tot);
+ return 0;
+ }
+ }
+
+ *totitem= len;
+
+ return 1;
+}
+
+static int validate_array(PyObject *rvalue, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, ItemTypeCheckFunc check_item_type, const char *item_type_str, int *totitem, const char *error_prefix)
+{
+ int dimsize[MAX_ARRAY_DIMENSION];
+ int totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ /* validate type first because length validation may modify property array length */
+
+ if (!validate_array_type(rvalue, lvalue_dim, totdim, dimsize, check_item_type, item_type_str, error_prefix))
+ return 0;
+
+ return validate_array_length(rvalue, ptr, prop, lvalue_dim, totitem, error_prefix);
+}
+
+static char *copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, char *data, unsigned int item_size, int *index, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index)
+{
+ if (!data) {
+ char value[sizeof(int)];
+
+ convert_item(item, value);
+ rna_set_index(ptr, prop, *index, value);
+ *index = *index + 1;
+ }
+ else {
+ convert_item(item, data);
+ data += item_size;
+ }
+
+ return data;
+}
+
+static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int dim, char *data, unsigned int item_size, int *index, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index)
+{
+ unsigned int i;
+ int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+ const int seq_size= PySequence_Size(seq);
+
+ for (i= 0; i < seq_size; i++) {
+ PyObject *item= PySequence_GetItem(seq, i);
+
+ if (dim + 1 < totdim) {
+ data= copy_values(item, ptr, prop, dim + 1, data, item_size, index, convert_item, rna_set_index);
+ }
+ else {
+ data= copy_value_single(item, ptr, prop, data, item_size, index, convert_item, rna_set_index);
+ }
+
+ Py_DECREF(item);
+ }
+
+ return data;
+}
+
+static int py_to_array(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, char *param_data, ItemTypeCheckFunc check_item_type, const char *item_type_str, int item_size, ItemConvertFunc convert_item, RNA_SetArrayFunc rna_set_array, const char *error_prefix)
+{
+ /*int totdim, dim_size[MAX_ARRAY_DIMENSION];*/
+ int totitem;
+ char *data= NULL;
+
+ /*totdim= RNA_property_array_dimension(ptr, prop, dim_size);*/ /*UNUSED*/
+
+ if (!validate_array(py, ptr, prop, 0, check_item_type, item_type_str, &totitem, error_prefix)) {
+ return 0;
+ }
+
+ if (totitem) {
+ /* note: this code is confusing */
+ if(param_data && RNA_property_flag(prop) & PROP_DYNAMIC) {
+ /* not freeing allocated mem, RNA_parameter_list_free() will do this */
+ ParameterDynAlloc *param_alloc= (ParameterDynAlloc *)param_data;
+ param_alloc->array_tot= (int)totitem;
+ param_alloc->array= MEM_callocN(item_size * totitem, "py_to_array dyn"); /* freeing param list will free */
+
+ data= param_alloc->array;
+ }
+ else if (param_data) {
+ data= param_data;
+ }
+ else {
+ data= PyMem_MALLOC(item_size * totitem);
+ }
+
+ copy_values(py, ptr, prop, 0, data, item_size, NULL, convert_item, NULL);
+
+ if (param_data==NULL) {
+ /* NULL can only pass through in case RNA property arraylength is 0 (impossible?) */
+ rna_set_array(ptr, prop, data);
+ PyMem_FREE(data);
+ }
+ }
+
+ return 1;
+}
+
+static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, int lvalue_dim, int arrayoffset, int index, ItemTypeCheckFunc check_item_type, const char *item_type_str, ItemConvertFunc convert_item, RNA_SetIndexFunc rna_set_index, const char *error_prefix)
+{
+ int totdim, dimsize[MAX_ARRAY_DIMENSION];
+ int totitem, i;
+
+ totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ /* convert index */
+
+ /* arr[3][4][5]
+
+ arr[2] = x
+ lvalue_dim=0, index = 0 + 2 * 4 * 5
+
+ arr[2][3] = x
+ lvalue_dim=1, index = 40 + 3 * 5 */
+
+ lvalue_dim++;
+
+ for (i= lvalue_dim; i < totdim; i++)
+ index *= dimsize[i];
+
+ index += arrayoffset;
+
+ if(lvalue_dim == totdim) { /* single item, assign directly */
+ if(!check_item_type(py)) {
+ PyErr_Format(PyExc_TypeError, "%s %.200s.%.200s, expected a %s type, not %s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), item_type_str, Py_TYPE(py)->tp_name);
+ return 0;
+ }
+ copy_value_single(py, ptr, prop, NULL, 0, &index, convert_item, rna_set_index);
+ }
+ else {
+ if (!validate_array(py, ptr, prop, lvalue_dim, check_item_type, item_type_str, &totitem, error_prefix)) {
+ return 0;
+ }
+
+ if (totitem) {
+ copy_values(py, ptr, prop, lvalue_dim, NULL, 0, &index, convert_item, rna_set_index);
+ }
+ }
+ return 1;
+}
+
+static void py_to_float(PyObject *py, char *data)
+{
+ *(float*)data= (float)PyFloat_AsDouble(py);
+}
+
+static void py_to_int(PyObject *py, char *data)
+{
+ *(int*)data= (int)PyLong_AsSsize_t(py);
+}
+
+static void py_to_bool(PyObject *py, char *data)
+{
+ *(int*)data= (int)PyObject_IsTrue(py);
+}
+
+static int py_float_check(PyObject *py)
+{
+ /* accept both floats and integers */
+ return PyNumber_Check(py);
+}
+
+static int py_int_check(PyObject *py)
+{
+ /* accept only integers */
+ return PyLong_Check(py);
+}
+
+static int py_bool_check(PyObject *py)
+{
+ return PyBool_Check(py);
+}
+
+static void float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_float_set_index(ptr, prop, index, *(float*)value);
+}
+
+static void int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_int_set_index(ptr, prop, index, *(int*)value);
+}
+
+static void bool_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, void *value)
+{
+ RNA_property_boolean_set_index(ptr, prop, index, *(int*)value);
+}
+
+int pyrna_py_to_array(PointerRNA *ptr, PropertyRNA *prop, char *param_data, PyObject *py, const char *error_prefix)
+{
+ int ret;
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ ret= py_to_array(py, ptr, prop, param_data, py_float_check, "float", sizeof(float), py_to_float, (RNA_SetArrayFunc)RNA_property_float_set_array, error_prefix);
+ break;
+ case PROP_INT:
+ ret= py_to_array(py, ptr, prop, param_data, py_int_check, "int", sizeof(int), py_to_int, (RNA_SetArrayFunc)RNA_property_int_set_array, error_prefix);
+ break;
+ case PROP_BOOLEAN:
+ ret= py_to_array(py, ptr, prop, param_data, py_bool_check, "boolean", sizeof(int), py_to_bool, (RNA_SetArrayFunc)RNA_property_boolean_set_array, error_prefix);
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "not an array type");
+ ret= 0;
+ }
+
+ return ret;
+}
+
+int pyrna_py_to_array_index(PointerRNA *ptr, PropertyRNA *prop, int arraydim, int arrayoffset, int index, PyObject *py, const char *error_prefix)
+{
+ int ret;
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_float_check, "float", py_to_float, float_set_index, error_prefix);
+ break;
+ case PROP_INT:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_int_check, "int", py_to_int, int_set_index, error_prefix);
+ break;
+ case PROP_BOOLEAN:
+ ret= py_to_array_index(py, ptr, prop, arraydim, arrayoffset, index, py_bool_check, "boolean", py_to_bool, bool_set_index, error_prefix);
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "not an array type");
+ ret= 0;
+ }
+
+ return ret;
+}
+
+PyObject *pyrna_array_index(PointerRNA *ptr, PropertyRNA *prop, int index)
+{
+ PyObject *item;
+
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ item= PyFloat_FromDouble(RNA_property_float_get_index(ptr, prop, index));
+ break;
+ case PROP_BOOLEAN:
+ item= PyBool_FromLong(RNA_property_boolean_get_index(ptr, prop, index));
+ break;
+ case PROP_INT:
+ item= PyLong_FromSsize_t(RNA_property_int_get_index(ptr, prop, index));
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "not an array type");
+ item= NULL;
+ }
+
+ return item;
+}
+
+#if 0
+/* XXX this is not used (and never will?) */
+/* Given an array property, creates an N-dimensional tuple of values. */
+static PyObject *pyrna_py_from_array_internal(PointerRNA *ptr, PropertyRNA *prop, int dim, int *index)
+{
+ PyObject *tuple;
+ int i, len;
+ int totdim= RNA_property_array_dimension(ptr, prop, NULL);
+
+ len= RNA_property_multi_array_length(ptr, prop, dim);
+
+ tuple= PyTuple_New(len);
+
+ for (i= 0; i < len; i++) {
+ PyObject *item;
+
+ if (dim + 1 < totdim)
+ item= pyrna_py_from_array_internal(ptr, prop, dim + 1, index);
+ else {
+ item= pyrna_array_index(ptr, prop, *index);
+ *index= *index + 1;
+ }
+
+ if (!item) {
+ Py_DECREF(tuple);
+ return NULL;
+ }
+
+ PyTuple_SET_ITEM(tuple, i, item);
+ }
+
+ return tuple;
+}
+#endif
+
+PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, int index)
+{
+ int totdim, arraydim, arrayoffset, dimsize[MAX_ARRAY_DIMENSION], i, len;
+ BPy_PropertyArrayRNA *ret= NULL;
+
+ arraydim= self ? self->arraydim : 0;
+ arrayoffset = self ? self->arrayoffset : 0;
+
+ /* just in case check */
+ len= RNA_property_multi_array_length(ptr, prop, arraydim);
+ if (index >= len || index < 0) {
+ /* this shouldn't happen because higher level funcs must check for invalid index */
+ if (G.f & G_DEBUG) printf("pyrna_py_from_array_index: invalid index %d for array with length=%d\n", index, len);
+
+ PyErr_SetString(PyExc_IndexError, "out of range");
+ return NULL;
+ }
+
+ totdim= RNA_property_array_dimension(ptr, prop, dimsize);
+
+ if (arraydim + 1 < totdim) {
+ ret= (BPy_PropertyArrayRNA*)pyrna_prop_CreatePyObject(ptr, prop);
+ ret->arraydim= arraydim + 1;
+
+ /* arr[3][4][5]
+
+ x = arr[2]
+ index = 0 + 2 * 4 * 5
+
+ x = arr[2][3]
+ index = offset + 3 * 5 */
+
+ for (i= arraydim + 1; i < totdim; i++)
+ index *= dimsize[i];
+
+ ret->arrayoffset= arrayoffset + index;
+ }
+ else {
+ index = arrayoffset + index;
+ ret= (BPy_PropertyArrayRNA *)pyrna_array_index(ptr, prop, index);
+ }
+
+ return (PyObject*)ret;
+}
+
+PyObject *pyrna_py_from_array(PointerRNA *ptr, PropertyRNA *prop)
+{
+ PyObject *ret;
+
+ ret= pyrna_math_object_from_array(ptr, prop);
+
+ /* is this a maths object? */
+ if (ret) return ret;
+
+ return pyrna_prop_CreatePyObject(ptr, prop);
+}
+
+/* TODO, multi-dimensional arrays */
+int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
+{
+ int len= RNA_property_array_length(ptr, prop);
+ int type;
+ int i;
+
+ if(len==0) /* possible with dynamic arrays */
+ return 0;
+
+ if (RNA_property_array_dimension(ptr, prop, NULL) > 1) {
+ PyErr_SetString(PyExc_TypeError, "PropertyRNA - multi dimensional arrays not supported yet");
+ return -1;
+ }
+
+ type= RNA_property_type(prop);
+
+ switch (type) {
+ case PROP_FLOAT:
+ {
+ float value_f= PyFloat_AsDouble(value);
+ if(value_f==-1 && PyErr_Occurred()) {
+ PyErr_Clear();
+ return 0;
+ }
+ else {
+ float tmp[32];
+ float *tmp_arr;
+
+ if(len * sizeof(float) > sizeof(tmp)) {
+ tmp_arr= PyMem_MALLOC(len * sizeof(float));
+ }
+ else {
+ tmp_arr= tmp;
+ }
+
+ RNA_property_float_get_array(ptr, prop, tmp_arr);
+
+ for(i=0; i<len; i++)
+ if(tmp_arr[i] == value_f)
+ break;
+
+ if(tmp_arr != tmp)
+ PyMem_FREE(tmp_arr);
+
+ return i<len ? 1 : 0;
+ }
+ break;
+ }
+ case PROP_BOOLEAN:
+ case PROP_INT:
+ {
+ int value_i= PyLong_AsSsize_t(value);
+ if(value_i==-1 && PyErr_Occurred()) {
+ PyErr_Clear();
+ return 0;
+ }
+ else {
+ int tmp[32];
+ int *tmp_arr;
+
+ if(len * sizeof(int) > sizeof(tmp)) {
+ tmp_arr= PyMem_MALLOC(len * sizeof(int));
+ }
+ else {
+ tmp_arr= tmp;
+ }
+
+ if(type==PROP_BOOLEAN)
+ RNA_property_boolean_get_array(ptr, prop, tmp_arr);
+ else
+ RNA_property_int_get_array(ptr, prop, tmp_arr);
+
+ for(i=0; i<len; i++)
+ if(tmp_arr[i] == value_i)
+ break;
+
+ if(tmp_arr != tmp)
+ PyMem_FREE(tmp_arr);
+
+ return i<len ? 1 : 0;
+ }
+ break;
+ }
+ }
+
+ /* should never reach this */
+ PyErr_SetString(PyExc_TypeError, "PropertyRNA - type not in float/bool/int");
+ return -1;
+}
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index b2a7511f998..a455a588c04 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,11 +22,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
#include "bpy_rna.h"
+#include "bpy_rna_callback.h"
#include "bpy_util.h"
+#include "BLI_utildefines.h"
+
#include "DNA_screen_types.h"
+
#include "BKE_context.h"
#include "ED_space_api.h"
@@ -34,7 +39,7 @@
#define RNA_CAPSULE_ID "RNA_HANDLE"
#define RNA_CAPSULE_ID_INVALID "RNA_HANDLE_REMOVED"
-void cb_region_draw(const bContext *C, ARegion *ar, void *customdata)
+static void cb_region_draw(const bContext *C, ARegion *UNUSED(ar), void *customdata)
{
PyObject *cb_func, *cb_args, *result;
PyGILState_STATE gilstate;
@@ -110,7 +115,7 @@ PyObject *pyrna_callback_remove(BPy_StructRNA *self, PyObject *args)
handle= PyCapsule_GetPointer(py_handle, RNA_CAPSULE_ID);
if(handle==NULL) {
- PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed.");
+ PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed");
return NULL;
}
diff --git a/source/blender/python/intern/bpy_rna_callback.h b/source/blender/python/intern/bpy_rna_callback.h
index d846b388c25..8b218aaefb2 100644
--- a/source/blender/python/intern/bpy_rna_callback.h
+++ b/source/blender/python/intern/bpy_rna_callback.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,5 +25,5 @@
struct BPy_StructRNA;
struct PyObject;
-struct PyObject *pyrna_callback_add(struct BPy_StructRNA *self, struct PyObject *args);
-struct PyObject *pyrna_callback_remove(struct BPy_StructRNA *self, struct PyObject *args);
+PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args);
+PyObject *pyrna_callback_remove(BPy_StructRNA *self, PyObject *args);
diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c
new file mode 100644
index 00000000000..ca94378a72a
--- /dev/null
+++ b/source/blender/python/intern/bpy_traceback.c
@@ -0,0 +1,151 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <Python.h>
+#include <frameobject.h>
+
+#include "bpy_traceback.h"
+
+static const char *traceback_filepath(PyTracebackObject *tb)
+{
+ return _PyUnicode_AsString(tb->tb_frame->f_code->co_filename);
+}
+
+/* copied from pythonrun.c, 3.2.0 */
+static int
+parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
+ int *lineno, int *offset, const char **text)
+{
+ long hold;
+ PyObject *v;
+
+ /* old style errors */
+ if (PyTuple_Check(err))
+ return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
+ lineno, offset, text);
+
+ /* new style errors. `err' is an instance */
+
+ if (! (v = PyObject_GetAttrString(err, "msg")))
+ goto finally;
+ *message = v;
+
+ if (!(v = PyObject_GetAttrString(err, "filename")))
+ goto finally;
+ if (v == Py_None)
+ *filename = NULL;
+ else if (! (*filename = _PyUnicode_AsString(v)))
+ goto finally;
+
+ Py_DECREF(v);
+ if (!(v = PyObject_GetAttrString(err, "lineno")))
+ goto finally;
+ hold = PyLong_AsLong(v);
+ Py_DECREF(v);
+ v = NULL;
+ if (hold < 0 && PyErr_Occurred())
+ goto finally;
+ *lineno = (int)hold;
+
+ if (!(v = PyObject_GetAttrString(err, "offset")))
+ goto finally;
+ if (v == Py_None) {
+ *offset = -1;
+ Py_DECREF(v);
+ v = NULL;
+ } else {
+ hold = PyLong_AsLong(v);
+ Py_DECREF(v);
+ v = NULL;
+ if (hold < 0 && PyErr_Occurred())
+ goto finally;
+ *offset = (int)hold;
+ }
+
+ if (!(v = PyObject_GetAttrString(err, "text")))
+ goto finally;
+ if (v == Py_None)
+ *text = NULL;
+ else if (!PyUnicode_Check(v) ||
+ !(*text = _PyUnicode_AsString(v)))
+ goto finally;
+ Py_DECREF(v);
+ return 1;
+
+finally:
+ Py_XDECREF(v);
+ return 0;
+}
+/* end copied function! */
+
+
+void python_script_error_jump(const char *filepath, int *lineno, int *offset)
+{
+ PyObject *exception, *value;
+ PyTracebackObject *tb;
+
+ *lineno= -1;
+ *offset= 0;
+
+ PyErr_Fetch(&exception, &value, (PyObject **)&tb);
+
+ if(exception && PyErr_GivenExceptionMatches(exception, PyExc_SyntaxError)) {
+ /* no traceback available when SyntaxError.
+ * python has no api's to this. reference parse_syntax_error() from pythonrun.c */
+ PyErr_NormalizeException(&exception, &value, (PyObject **)&tb);
+ PyErr_Restore(exception, value, (PyObject *)tb); /* takes away reference! */
+
+ if(value) { /* should always be true */
+ PyObject *message;
+ const char *filename, *text;
+
+ if(parse_syntax_error(value, &message, &filename, lineno, offset, &text)) {
+ /* python adds a '/', prefix, so check for both */
+ if( (strcmp(filename, filepath) == 0) ||
+ ((filename[0] == '\\' || filename[0] == '/') && strcmp(filename + 1, filepath) == 0)
+ ) {
+ /* good */
+ }
+ else {
+ *lineno= -1;
+ }
+ }
+ else {
+ *lineno= -1;
+ }
+ }
+
+ /* this avoids an abort in Python 2.3's garbage collecting */
+ }
+ else {
+ PyErr_NormalizeException(&exception, &value, (PyObject **)&tb);
+ PyErr_Restore(exception, value, (PyObject *)tb); /* takes away reference! */
+ PyErr_Print();
+
+ for(tb= (PyTracebackObject *)PySys_GetObject("last_traceback"); tb && (PyObject *)tb != Py_None; tb= tb->tb_next) {
+ if(strcmp(traceback_filepath(tb), filepath) != 0) {
+ *lineno= tb->tb_lineno;
+ break;
+ }
+ }
+ }
+}
diff --git a/source/blender/python/intern/bpy_traceback.h b/source/blender/python/intern/bpy_traceback.h
new file mode 100644
index 00000000000..ade1c067c9c
--- /dev/null
+++ b/source/blender/python/intern/bpy_traceback.h
@@ -0,0 +1,28 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BPY_TRACEBACK_H
+#define BPY_TRACEBACK_H
+
+void python_script_error_jump(const char *filepath, int *lineno, int *offset);
+
+#endif // BPY_TRACEBACK_H
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index 1a2d7b297b6..95d2f3bba9f 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+#include <Python.h>
+
#include "bpy_util.h"
#include "BLI_dynstr.h"
#include "MEM_guardedalloc.h"
@@ -30,97 +32,9 @@
#include "../generic/py_capi_utils.h"
-bContext* __py_context = NULL;
-bContext* BPy_GetContext(void) { return __py_context; };
-void BPy_SetContext(bContext *C) { __py_context= C; };
-
-int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs)
-{
- PyObject *item, *fitem;
- PyObject *py_arg_count;
- int i, arg_count;
-
- if (base_class) {
- if (!PyObject_IsSubclass(class, base_class)) {
- PyObject *name= PyObject_GetAttrString(base_class, "__name__");
- PyErr_Format( PyExc_AttributeError, "expected %s subclass of class \"%s\"", class_type, name ? _PyUnicode_AsString(name):"<UNKNOWN>");
- Py_XDECREF(name);
- return -1;
- }
- }
-
- for(i= 0;class_attrs->name; class_attrs++, i++) {
- item = PyObject_GetAttrString(class, class_attrs->name);
-
- if (py_class_attrs)
- py_class_attrs[i]= item;
-
- if (item==NULL) {
- if ((class_attrs->flag & BPY_CLASS_ATTR_OPTIONAL)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class to have an \"%s\" attribute", class_type, class_attrs->name);
- return -1;
- }
-
- PyErr_Clear();
- }
- else {
- Py_DECREF(item); /* no need to keep a ref, the class owns it */
-
- if((item==Py_None) && (class_attrs->flag & BPY_CLASS_ATTR_NONE_OK)) {
- /* dont do anything, this is ok, dont bother checking other types */
- }
- else {
- switch(class_attrs->type) {
- case 's':
- if (PyUnicode_Check(item)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a string", class_type, class_attrs->name);
- return -1;
- }
- if(class_attrs->len != -1 && class_attrs->len < PyUnicode_GetSize(item)) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute string to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
- return -1;
- }
-
- break;
- case 'l':
- if (PyList_Check(item)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a list", class_type, class_attrs->name);
- return -1;
- }
- if(class_attrs->len != -1 && class_attrs->len < PyList_GET_SIZE(item)) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute list to be shorter then %d", class_type, class_attrs->name, class_attrs->len);
- return -1;
- }
- break;
- case 'f':
- if (PyMethod_Check(item))
- fitem= PyMethod_Function(item); /* py 2.x */
- else
- fitem= item; /* py 3.x */
-
- if (PyFunction_Check(fitem)==0) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" attribute to be a function", class_type, class_attrs->name);
- return -1;
- }
- if (class_attrs->arg_count >= 0) { /* -1 if we dont care*/
- py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(fitem), "co_argcount");
- arg_count = PyLong_AsSsize_t(py_arg_count);
- Py_DECREF(py_arg_count);
-
- if (arg_count != class_attrs->arg_count) {
- PyErr_Format( PyExc_AttributeError, "expected %s class \"%s\" function to have %d args", class_type, class_attrs->name, class_attrs->arg_count);
- return -1;
- }
- }
- break;
- }
- }
- }
- }
- return 0;
-}
-
-
+static bContext* __py_context = NULL;
+bContext* BPy_GetContext(void) { return __py_context; }
+void BPy_SetContext(bContext *C) { __py_context= C; }
char *BPy_enum_as_string(EnumPropertyItem *item)
{
@@ -138,14 +52,18 @@ char *BPy_enum_as_string(EnumPropertyItem *item)
return cstring;
}
-int BPy_reports_to_error(ReportList *reports)
+short BPy_reports_to_error(ReportList *reports, const short clear)
{
char *report_str;
report_str= BKE_reports_string(reports, RPT_ERROR);
+ if(clear) {
+ BKE_reports_clear(reports);
+ }
+
if(report_str) {
- PyErr_SetString(PyExc_SystemError, report_str);
+ PyErr_SetString(PyExc_RuntimeError, report_str);
MEM_freeN(report_str);
}
@@ -153,7 +71,7 @@ int BPy_reports_to_error(ReportList *reports)
}
-int BPy_errors_to_report(ReportList *reports)
+short BPy_errors_to_report(ReportList *reports)
{
PyObject *pystring;
PyObject *pystring_format= NULL; // workaround, see below
@@ -201,7 +119,7 @@ int BPy_errors_to_report(ReportList *reports)
}
/* array utility function */
-int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, char *error_prefix)
+int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, const char *error_prefix)
{
PyObject *value_fast;
int value_len;
@@ -215,7 +133,7 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch
if(value_len != length) {
Py_DECREF(value);
- PyErr_Format(PyExc_TypeError, "%s: invalid sequence length. expected %d, got %d.", error_prefix, length, value_len);
+ PyErr_Format(PyExc_TypeError, "%.200s: invalid sequence length. expected %d, got %d", error_prefix, length, value_len);
return -1;
}
@@ -240,14 +158,14 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, ch
}
else {
Py_DECREF(value_fast);
- PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid.", error_prefix, type->tp_name);
+ PyErr_Format(PyExc_TypeError, "%s: internal error %s is invalid", error_prefix, type->tp_name);
return -1;
}
Py_DECREF(value_fast);
if(PyErr_Occurred()) {
- PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s.", error_prefix, type->tp_name);
+ PyErr_Format(PyExc_TypeError, "%s: one or more items could not be used as a %s", error_prefix, type->tp_name);
return -1;
}
diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h
index ae215725087..b35a6b20306 100644
--- a/source/blender/python/intern/bpy_util.h
+++ b/source/blender/python/intern/bpy_util.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,8 +22,6 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include <Python.h>
-
#ifndef BPY_UTIL_H
#define BPY_UTIL_H
@@ -36,29 +34,13 @@
struct EnumPropertyItem;
struct ReportList;
-/* Class type checking, use for checking classes can be added as operators, panels etc */
-typedef struct BPY_class_attr_check {
- const char *name; /* name of the class attribute */
- char type; /* 's' = string, 'f' = function, 'l' = list, (add as needed) */
- int arg_count; /* only for function types, -1 for undefined, includes self arg */
- int len; /* only for string types currently */
- int flag; /* other options */
-} BPY_class_attr_check;
-
-/* BPY_class_attr_check, flag */
-#define BPY_CLASS_ATTR_OPTIONAL 1
-#define BPY_CLASS_ATTR_NONE_OK 2
-
-int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs);
-
char *BPy_enum_as_string(struct EnumPropertyItem *item);
-
-#define BLANK_PYTHON_TYPE {PyVarObject_HEAD_INIT(NULL, 0) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+#define BLANK_PYTHON_TYPE {PyVarObject_HEAD_INIT(NULL, 0) NULL}
/* error reporting */
-int BPy_reports_to_error(struct ReportList *reports);
-int BPy_errors_to_report(struct ReportList *reports);
+short BPy_reports_to_error(struct ReportList *reports, const short clear);
+short BPy_errors_to_report(struct ReportList *reports);
/* TODO - find a better solution! */
struct bContext *BPy_GetContext(void);
diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c
index d6dc5059342..7f87dd36f6d 100644
--- a/source/blender/python/intern/stubs.c
+++ b/source/blender/python/intern/stubs.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,11 +27,10 @@
*/
/* python, will come back */
-//void BPY_run_python_script() {}
-//void BPY_start_python() {}
-void BPY_call_importloader() {}
-//void BPY_free_compiled_text() {}
-void BPY_pyconstraint_eval() {}
-void BPY_pyconstraint_target() {}
-int BPY_is_pyconstraint() {return 0;}
-void BPY_pyconstraint_update() {}
+//void BPY_script_exec(void) {}
+//void BPY_python_start(void) {}
+//void BPY_text_free_code(void) {}
+void BPY_pyconstraint_exec(void) {}
+void BPY_pyconstraint_target(void) {}
+int BPY_is_pyconstraint(void) {return 0;}
+void BPY_pyconstraint_update(void) {}
diff --git a/source/blender/python/rna_dump.py b/source/blender/python/rna_dump.py
index b4d155890c8..df902886f30 100644
--- a/source/blender/python/rna_dump.py
+++ b/source/blender/python/rna_dump.py
@@ -18,114 +18,125 @@
#
# #**** END GPL LICENSE BLOCK #****
+# <pep8 compliant>
+
if 1:
- # Print once every 1000
- GEN_PATH = True
- PRINT_DATA = False
- PRINT_DATA_INT = 1000
- VERBOSE = False
- VERBOSE_TYPE = False
- MAX_RECURSIVE = 8
+ # Print once every 1000
+ GEN_PATH = True
+ PRINT_DATA = False
+ PRINT_DATA_INT = 1000
+ VERBOSE = False
+ VERBOSE_TYPE = False
+ MAX_RECURSIVE = 8
else:
- # Print everything
- GEN_PATH = True
- PRINT_DATA = True
- PRINT_DATA_INT = 0
- VERBOSE = False
- VERBOSE_TYPE = False
- MAX_RECURSIVE = 8
+ # Print everything
+ GEN_PATH = True
+ PRINT_DATA = True
+ PRINT_DATA_INT = 0
+ VERBOSE = False
+ VERBOSE_TYPE = False
+ MAX_RECURSIVE = 8
seek_count = [0]
-def seek(r, txt, recurs):
- seek_count[0] += 1
+def seek(r, txt, recurs):
- if PRINT_DATA_INT:
- if not (seek_count[0] % PRINT_DATA_INT):
- print(seek_count[0], txt)
+ seek_count[0] += 1
- if PRINT_DATA:
- print(txt)
+ if PRINT_DATA_INT:
+ if not (seek_count[0] % PRINT_DATA_INT):
+ print(seek_count[0], txt)
- newtxt = ''
+ if PRINT_DATA:
+ print(txt)
- if recurs > MAX_RECURSIVE:
- #print ("Recursion is over max")
- #print (txt)
- return
+ newtxt = ''
- type_r = type(r)
+ if recurs > MAX_RECURSIVE:
+ #print ("Recursion is over max")
+ #print (txt)
+ return
- # print(type_r)
- # print(dir(r))
+ type_r = type(r)
- # basic types
- if type_r in (float, int, bool, type(None)):
- if PRINT_DATA:
- print(txt + ' -> ' + str(r))
- return
+ # print(type_r)
+ # print(dir(r))
- if type_r == str:
- if PRINT_DATA:
- print(txt + ' -> "' + str(r) + '"')
- return
+ # basic types
+ if type_r in (float, int, bool, type(None)):
+ if PRINT_DATA:
+ print(txt + ' -> ' + str(r))
+ return
- try: keys = r.keys()
- except: keys = None
+ if type_r == str:
+ if PRINT_DATA:
+ print(txt + ' -> "' + str(r) + '"')
+ return
- if keys != None:
- if PRINT_DATA:
- print(txt + '.keys() - ' + str(r.keys()))
+ try:
+ keys = r.keys()
+ except:
+ keys = None
- try: __members__ = dir(r)
- except: __members__ = []
+ if keys != None:
+ if PRINT_DATA:
+ print(txt + '.keys() - ' + str(r.keys()))
- for item in __members__:
- if item.startswith('__'):
- continue
+ try:
+ __members__ = dir(r)
+ except:
+ __members__ = []
- if GEN_PATH: newtxt = txt + '.' + item
+ for item in __members__:
+ if item.startswith("__"):
+ continue
- if item == 'rna_type' and VERBOSE_TYPE==False: # just avoid because it spits out loads of data
- continue
+ if GEN_PATH:
+ newtxt = txt + '.' + item
- try: value = getattr(r, item)
- except: value = None
+ if item == 'rna_type' and VERBOSE_TYPE == False: # just avoid because it spits out loads of data
+ continue
- seek( value, newtxt, recurs + 1)
+ value = getattr(r, item, None)
+ seek(value, newtxt, recurs + 1)
- if keys:
- for k in keys:
- if GEN_PATH: newtxt = txt + '["' + k + '"]'
- seek(r.__getitem__(k), newtxt, recurs+1)
+ if keys:
+ for k in keys:
+ if GEN_PATH:
+ newtxt = txt + '["' + k + '"]'
+ seek(r.__getitem__(k), newtxt, recurs + 1)
- else:
- try: length = len( r )
- except: length = 0
+ else:
+ try:
+ length = len(r)
+ except:
+ length = 0
- if VERBOSE==False and length >= 4:
- for i in (0, length-1):
- if i>0:
- if PRINT_DATA:
- print((' '*len(txt)) + ' ... skipping '+str(length-2)+' items ...')
+ if VERBOSE == False and length >= 4:
+ for i in (0, length - 1):
+ if i > 0:
+ if PRINT_DATA:
+ print((" " * len(txt)) + " ... skipping " + str(length - 2) + " items ...")
- if GEN_PATH: newtxt = txt + '[' + str(i) + ']'
- seek(r[i], newtxt, recurs+1)
- else:
- for i in range(length):
- if GEN_PATH: newtxt = txt + '[' + str(i) + ']'
- seek(r[i], newtxt, recurs+1)
+ if GEN_PATH:
+ newtxt = txt + '[' + str(i) + ']'
+ seek(r[i], newtxt, recurs + 1)
+ else:
+ for i in range(length):
+ if GEN_PATH:
+ newtxt = txt + '[' + str(i) + ']'
+ seek(r[i], newtxt, recurs + 1)
seek(bpy.data, 'bpy.data', 0)
# seek(bpy.types, 'bpy.types', 0)
'''
for d in dir(bpy.types):
- t = getattr(bpy.types, d)
+ t = getattr(bpy.types, d)
try: r = t.bl_rna
- except: r = None
- if r:
+ except: r = None
+ if r:
seek(r, 'bpy.types.' + d + '.bl_rna', 0)
'''
diff --git a/source/blender/quicktime/CMakeLists.txt b/source/blender/quicktime/CMakeLists.txt
index 63b6558e997..7e7f61036c6 100644
--- a/source/blender/quicktime/CMakeLists.txt
+++ b/source/blender/quicktime/CMakeLists.txt
@@ -24,18 +24,29 @@
#
# ***** END GPL LICENSE BLOCK *****
-IF(USE_QTKIT)
- SET(SRC apple/qtkit_import.m apple/qtkit_export.m)
-ELSE(USE_QTKIT)
- SET(SRC apple/quicktime_import.c apple/quicktime_export.c)
-ENDIF(USE_QTKIT)
+if(USE_QTKIT)
+ set(SRC
+ apple/qtkit_import.m
+ apple/qtkit_export.m
-SET(INC
+ quicktime_export.h
+ quicktime_import.h
+ )
+else()
+ set(SRC
+ apple/quicktime_import.c
+ apple/quicktime_export.c
+
+ quicktime_export.h
+ quicktime_import.h
+ )
+endif()
+
+set(INC
.
../quicktime
../makesdna
../makesrna
- ../../../intern/guardedalloc
../blenlib
../blenkernel
../avi
@@ -46,9 +57,10 @@ SET(INC
../include
../windowmanager
../../../intern/audaspace/intern
+ ../../../intern/guardedalloc
+ ${QUICKTIME_INC}
)
-SET(INC ${INC} ${QUICKTIME_INC})
-ADD_DEFINITIONS(-DWITH_QUICKTIME)
+add_definitions(-DWITH_QUICKTIME)
-BLENDERLIB(bf_quicktime "${SRC}" "${INC}")
+blender_add_lib(bf_quicktime "${SRC}" "${INC}")
diff --git a/source/blender/quicktime/Makefile b/source/blender/quicktime/Makefile
deleted file mode 100644
index d0055780556..00000000000
--- a/source/blender/quicktime/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/quicktime
-
-ifeq ($(OS), $(findstring $(OS), "windows, darwin"))
- DIRS = apple
-endif
-
-include nan_subdirs.mk
diff --git a/source/blender/quicktime/SConscript b/source/blender/quicktime/SConscript
index c8aeb70aa57..24dfab13fd9 100644
--- a/source/blender/quicktime/SConscript
+++ b/source/blender/quicktime/SConscript
@@ -11,20 +11,20 @@ else:
incs = ['.',
- '../quicktime',
- '../makesdna',
- '../makesrna',
- '../windowmanager',
- '#/intern/guardedalloc',
- '../blenlib',
- '../blenkernel',
- '../avi',
- '../imbuf',
- '../imbuf/intern',
- '../blenloader',
- '../render/extern/include',
- '../editors/include',
- '#/intern/audaspace/intern']
+ '../quicktime',
+ '../makesdna',
+ '../makesrna',
+ '../windowmanager',
+ '#/intern/guardedalloc',
+ '../blenlib',
+ '../blenkernel',
+ '../avi',
+ '../imbuf',
+ '../imbuf/intern',
+ '../blenloader',
+ '../render/extern/include',
+ '../editors/include',
+ '#/intern/audaspace/intern']
incs.append(env['BF_QUICKTIME_INC'])
@@ -34,6 +34,6 @@ priorities = [200,235]
defs=['WITH_QUICKTIME']
if env['WITH_GHOST_COCOA']:
- defs.append('GHOST_COCOA')
+ defs.append('GHOST_COCOA')
env.BlenderLib ('bf_quicktime', sources=source_files, includes=incs, defines=defs, libtype=types, priority=priorities)
diff --git a/source/blender/quicktime/apple/Makefile b/source/blender/quicktime/apple/Makefile
deleted file mode 100644
index cdb00ab9ef2..00000000000
--- a/source/blender/quicktime/apple/Makefile
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenderqt
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-ifeq ($(OS), $(findstring $(OS), "darwin"))
- ifeq ($(USE_QTKIT),true)
- OCSRCS += $(wildcard *.m)
- endif
-endif
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL1_C_WARNINGS)
-
-CPPFLAGS += -DWITH_QUICKTIME
-
-ifeq ($(CPU),$(findstring $(CPU), "powerpc mips sparc"))
- CPPFLAGS += -DWORDS_BIGENDIAN
-else
- # alpha i386
- CPPFLAGS += -DWORDS_LITTLEENDIAN
-endif
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# our own include
-CPPFLAGS += -I..
-
-# stuff needed by quicktime_[import|export].c
-CPPFLAGS += -I../../blenloader -I../../imbuf/intern -I../../imbuf
-CPPFLAGS += -I../../blenlib -I../../makesdna -I../../editors/include -I../../avi
-CPPFLAGS += -I../../blenkernel -I../../render/extern/include -I../../windowmanager -I../../makesrna
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
diff --git a/source/blender/quicktime/apple/qtkit_export.m b/source/blender/quicktime/apple/qtkit_export.m
index 35f3629cb61..add280c6b64 100644
--- a/source/blender/quicktime/apple/qtkit_export.m
+++ b/source/blender/quicktime/apple/qtkit_export.m
@@ -41,6 +41,7 @@
#include "AUD_C-API.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_scene.h"
#include "BKE_report.h"
@@ -118,9 +119,10 @@ static QuicktimeCodecTypeDesc qtVideoCodecList[] = {
{kMPEG4VisualCodecType, 10, "MPEG4"},
{kH263CodecType, 11, "H.263"},
{kH264CodecType, 12, "H.264"},
+ {kAnimationCodecType, 13, "Animation"},
{0,0,NULL}};
-static int qtVideoCodecCount = 12;
+static int qtVideoCodecCount = 13;
int quicktime_get_num_videocodecs() {
return qtVideoCodecCount;
@@ -208,7 +210,7 @@ void makeqtstring (RenderData *rd, char *string) {
char txt[64];
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -222,7 +224,7 @@ void filepath_qt(char *string, RenderData *rd) {
if (string==NULL) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -587,6 +589,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSBitmapImageRep *blBitmapFormatImage;
NSImage *frameImage;
+ OSStatus err = noErr;
unsigned char *from_Ptr,*to_Ptr;
int y,from_i,to_i;
@@ -628,8 +631,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
if (qtexport->audioFile) {
UInt32 audioPacketsConverted;
/* Append audio */
- while (((double)qtexport->audioTotalExportedFrames / (double) qtexport->audioInputFormat.mSampleRate)
- < ((double)(frame - rd->sfra)) / (((double)rd->frs_sec) / rd->frs_sec_base)) {
+ while (qtexport->audioTotalExportedFrames < qtexport->audioLastFrame) {
qtexport->audioBufferList.mNumberBuffers = 1;
qtexport->audioBufferList.mBuffers[0].mNumberChannels = qtexport->audioOutputFormat.mChannelsPerFrame;
@@ -637,7 +639,7 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
qtexport->audioBufferList.mBuffers[0].mData = qtexport->audioOutputBuffer;
audioPacketsConverted = AUDIOOUTPUTBUFFERSIZE / qtexport->audioCodecMaxOutputPacketSize;
- AudioConverterFillComplexBuffer(qtexport->audioConverter, AudioConverterInputCallback,
+ err = AudioConverterFillComplexBuffer(qtexport->audioConverter, AudioConverterInputCallback,
NULL, &audioPacketsConverted, &qtexport->audioBufferList, qtexport->audioOutputPktDesc);
if (audioPacketsConverted) {
AudioFileWritePackets(qtexport->audioFile, false, qtexport->audioBufferList.mBuffers[0].mDataByteSize,
@@ -656,6 +658,12 @@ int append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int rect
}
+ else {
+ //Error getting audio packets
+ BKE_reportf(reports, RPT_ERROR, "Unable to get further audio packets from frame %i, error = 0x%x",qtexport->audioTotalExportedFrames,err);
+ break;
+ }
+
}
}
[pool drain];
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 80b97066b61..06cfb82e904 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -30,6 +30,8 @@
*/
#ifdef WITH_QUICKTIME
+#include "MEM_guardedalloc.h"
+
#include "IMB_anim.h"
#include "BLO_sys_types.h"
#include "BKE_global.h"
@@ -77,7 +79,7 @@ void quicktime_exit(void)
}
-int anim_is_quicktime (char *name)
+int anim_is_quicktime (const char *name)
{
NSAutoreleasePool *pool;
@@ -113,6 +115,8 @@ int anim_is_quicktime (char *name)
void free_anim_quicktime (struct anim *anim) {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
if (anim == NULL) return;
if (anim->qtime == NULL) return;
@@ -122,11 +126,15 @@ void free_anim_quicktime (struct anim *anim) {
[anim->qtime->media release];
[anim->qtime->movie release];
+ [QTMovie exitQTKitOnThread];
+
if(anim->qtime) MEM_freeN (anim->qtime);
anim->qtime = NULL;
anim->duration = 0;
+
+ [pool drain];
}
static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
@@ -141,7 +149,7 @@ static ImBuf * nsImageToiBuf(NSImage *sourceImage, int width, int height)
NSEnumerator *enumerator;
NSImageRep *representation;
- ibuf = IMB_allocImBuf (width, height, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (width, height, 32, IB_rect);
if (!ibuf) {
if(QTIME_DEBUG) printf("quicktime_import: could not allocate memory for the " \
"image.\n");
@@ -302,6 +310,8 @@ int startquicktime (struct anim *anim)
pool = [[NSAutoreleasePool alloc] init];
+ [QTMovie enterQTKitOnThread];
+
attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithCString:anim->name
encoding:[NSString defaultCStringEncoding]], QTMovieFileNameAttribute,
@@ -314,6 +324,7 @@ int startquicktime (struct anim *anim)
if(QTIME_DEBUG) printf("qt: bad movie %s\n", anim->name);
MEM_freeN(anim->qtime);
if(QTIME_DEBUG) printf("qt: can't load %s\n", anim->name);
+ [QTMovie exitQTKitOnThread];
[pool drain];
return -1;
}
@@ -328,6 +339,7 @@ int startquicktime (struct anim *anim)
[anim->qtime->movie release];
MEM_freeN(anim->qtime);
if(QTIME_DEBUG) printf("qt: can't load %s\n", anim->name);
+ [QTMovie exitQTKitOnThread];
[pool drain];
return -1;
}
@@ -347,7 +359,7 @@ int startquicktime (struct anim *anim)
return -1;
}
- anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
qtTimeDuration = [[anim->qtime->media attributeForKey:QTMediaDurationAttribute] QTTimeValue];
anim->qtime->durationTime = qtTimeDuration.timeValue;
@@ -438,7 +450,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
[bitmapImage setSize:bitmapSize];
/* allocate the image buffer */
- ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0, 0);
+ ibuf = IMB_allocImBuf(bitmapSize.width, bitmapSize.height, 32/*RGBA*/, 0);
if (!ibuf) {
fprintf(stderr,
"imb_cocoaLoadImage: could not allocate memory for the " \
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index c1291fc6949..d61e0b16155 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* quicktime_export.c
@@ -40,6 +40,7 @@
#include "BKE_context.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -60,6 +61,9 @@
#include <Movies.h>
#include <QuickTimeComponents.h>
#include <TextUtils.h>
+#include <string.h>
+#include <memory.h>
+
#endif /* _WIN32 */
#ifdef __APPLE__
@@ -379,8 +383,8 @@ static void QT_StartAddVideoSamplesToMedia (const Rect *trackFrame, int rectx, i
SCTemporalSettings gTemporalSettings;
OSErr err = noErr;
- qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
- qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect, 0);
+ qtexport->ibuf = IMB_allocImBuf (rectx, recty, 32, IB_rect);
+ qtexport->ibuf2 = IMB_allocImBuf (rectx, recty, 32, IB_rect);
err = NewGWorldFromPtr( &qtexport->theGWorld,
k32ARGBPixelFormat,
@@ -494,7 +498,7 @@ void filepath_qt(char *string, RenderData *rd) {
if (string==0) return;
strcpy(string, rd->pic);
- BLI_path_abs(string, G.sce);
+ BLI_path_abs(string, G.main->name);
BLI_make_existing_file(string);
@@ -620,7 +624,9 @@ void end_qt(void) {
//printf("Finished QuickTime movie.\n");
}
- ExitMoviesOnThread();
+#ifdef __APPLE__
+ ExitMoviesOnThread();
+#endif
if(qtexport) {
MEM_freeN(qtexport);
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index 75f77dccbfa..8241fea447a 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* quicktime_import.c
@@ -32,6 +32,7 @@
#if defined(_WIN32) || defined(__APPLE__)
#ifndef USE_QTKIT
+#include "MEM_guardedalloc.h"
#include "IMB_anim.h"
#include "BLO_sys_types.h"
#include "BKE_global.h"
@@ -47,6 +48,7 @@
#include <QTML.h>
#include <TextUtils.h>
#include <QuickTimeComponents.h>
+#include <QTLoadLibraryUtils.h>
#endif /* _WIN32 */
@@ -88,16 +90,22 @@ typedef struct _QuicktimeMovie {
void quicktime_init(void)
{
+ OSErr nerr;
#ifdef _WIN32
- if (InitializeQTML(0) != noErr)
+ QTLoadLibrary("QTCF.dll");
+ nerr = InitializeQTML(0);
+ if (nerr != noErr) {
G.have_quicktime = FALSE;
+ printf("Error initializing quicktime\n");
+ }
else
G.have_quicktime = TRUE;
#endif /* _WIN32 */
/* Initialize QuickTime */
#if defined(_WIN32) || defined (__APPLE__)
- if (EnterMovies() != noErr)
+ nerr = EnterMovies();
+ if (nerr != noErr)
G.have_quicktime = FALSE;
else
#endif /* _WIN32 || __APPLE__ */
@@ -162,7 +170,7 @@ char *get_valid_qtname(char *name)
#endif /* _WIN32 */
-int anim_is_quicktime (char *name)
+int anim_is_quicktime (const char *name)
{
FSSpec theFSSpec;
char theFullPath[255];
@@ -317,7 +325,9 @@ ImBuf * qtime_fetchibuf (struct anim *anim, int position)
ImBuf *ibuf = NULL;
unsigned int *rect;
+#ifdef __APPLE__
unsigned char *from, *to;
+#endif
#ifdef _WIN32
unsigned char *crect;
#endif
@@ -326,7 +336,7 @@ ImBuf * qtime_fetchibuf (struct anim *anim, int position)
return (NULL);
}
- ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
rect = ibuf->rect;
SetMovieTimeValue(anim->qtime->movie, anim->qtime->frameIndex[position]);
@@ -373,7 +383,7 @@ ImBuf * qtime_fetchibuf (struct anim *anim, int position)
}
#endif
- ibuf->profile == IB_PROFILE_SRGB;
+ ibuf->profile = IB_PROFILE_SRGB;
IMB_flipy(ibuf);
return ibuf;
@@ -487,7 +497,7 @@ int startquicktime (struct anim *anim)
return -1;
}
- anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect, 0);
+ anim->qtime->ibuf = IMB_allocImBuf (anim->x, anim->y, 32, IB_rect);
#ifdef _WIN32
err = NewGWorldFromPtr(&anim->qtime->offscreenGWorld,
@@ -601,7 +611,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
ImageDescriptionHandle desc;
ComponentInstance dataHandler;
- PointerDataRef dataref = (PointerDataRef)NewHandle(sizeof(PointerDataRefRecord));
+ PointerDataRef dataref;
int x, y, depth;
int have_gw = FALSE;
@@ -624,11 +634,12 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
unsigned char *from, *to;
#endif
- if (mem == NULL)
+ if (mem == NULL || !G.have_quicktime)
goto bail;
if(QTIME_DEBUG) printf("qt: attempt to load mem as image\n");
+ dataref= (PointerDataRef)NewHandle(sizeof(PointerDataRefRecord));
(**dataref).data = mem;
(**dataref).dataLength = size;
@@ -667,7 +678,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
depth = (**desc).depth;
if (flags & IB_test) {
- ibuf = IMB_allocImBuf(x, y, depth, 0, 0);
+ ibuf = IMB_allocImBuf(x, y, depth, 0);
ibuf->ftype = QUICKTIME;
DisposeHandle((Handle)dataref);
if (gImporter != NULL) CloseComponent(gImporter);
@@ -675,8 +686,8 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
}
#ifdef __APPLE__
- ibuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
- wbuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (x, y, 32, IB_rect);
+ wbuf = IMB_allocImBuf (x, y, 32, IB_rect);
err = NewGWorldFromPtr(&offGWorld,
k32ARGBPixelFormat,
@@ -684,7 +695,7 @@ ImBuf *imb_quicktime_decode(unsigned char *mem, int size, int flags)
(unsigned char *)wbuf->rect, x * 4);
#else
- ibuf = IMB_allocImBuf (x, y, 32, IB_rect, 0);
+ ibuf = IMB_allocImBuf (x, y, 32, IB_rect);
err = NewGWorldFromPtr(&offGWorld,
k32RGBAPixelFormat,
diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h
index 1ca52b1bd10..ece19c2a521 100644
--- a/source/blender/quicktime/quicktime_export.h
+++ b/source/blender/quicktime/quicktime_export.h
@@ -59,14 +59,14 @@ void filepath_qt(char *string, struct RenderData *rd);
/*RNA helper functions */
void quicktime_verify_image_type(struct RenderData *rd); //used by RNA for defaults values init, if needed
/*Video codec type*/
-int quicktime_get_num_videocodecs();
+int quicktime_get_num_videocodecs(void);
QuicktimeCodecTypeDesc* quicktime_get_videocodecType_desc(int indexValue);
int quicktime_rnatmpvalue_from_videocodectype(int codecType);
int quicktime_videocodecType_from_rnatmpvalue(int rnatmpvalue);
#ifdef USE_QTKIT
/*Audio codec type*/
-int quicktime_get_num_audiocodecs();
+int quicktime_get_num_audiocodecs(void);
QuicktimeCodecTypeDesc* quicktime_get_audiocodecType_desc(int indexValue);
int quicktime_rnatmpvalue_from_audiocodectype(int codecType);
int quicktime_audiocodecType_from_rnatmpvalue(int rnatmpvalue);
diff --git a/source/blender/quicktime/quicktime_import.h b/source/blender/quicktime/quicktime_import.h
index 150aa07b1c2..d7f96375fa4 100644
--- a/source/blender/quicktime/quicktime_import.h
+++ b/source/blender/quicktime/quicktime_import.h
@@ -1,4 +1,4 @@
-/**
+/*
* Quicktime_import.h
*
* $Id$
@@ -62,7 +62,7 @@ char *get_valid_qtname(char *name);
// quicktime movie import functions
-int anim_is_quicktime (char *name);
+int anim_is_quicktime (const char *name);
int startquicktime (struct anim *anim);
void free_anim_quicktime (struct anim *anim);
ImBuf *qtime_fetchibuf (struct anim *anim, int position);
diff --git a/source/blender/readblenfile/BLO_readblenfile.h b/source/blender/readblenfile/BLO_readblenfile.h
index ca8a74abae4..a928148f208 100644
--- a/source/blender/readblenfile/BLO_readblenfile.h
+++ b/source/blender/readblenfile/BLO_readblenfile.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +31,10 @@
#ifndef BLO_READBLENFILE_H
#define BLO_READBLENFILE_H
+/** \file BLO_readblenfile.h
+ * \ingroup readblenfile
+ */
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -73,7 +77,7 @@ blo_read_runtime(
struct ReportList *reports);
#define BLO_RESERVEDSIZE 12
-extern char *headerMagic;
+extern const char *headerMagic;
#ifdef __cplusplus
}
diff --git a/source/blender/readblenfile/CMakeLists.txt b/source/blender/readblenfile/CMakeLists.txt
index a6522ffa758..8d3633b4918 100644
--- a/source/blender/readblenfile/CMakeLists.txt
+++ b/source/blender/readblenfile/CMakeLists.txt
@@ -24,10 +24,20 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
+set(INC
+ .
+ ../blenloader
+ ../blenloader/intern
+ ../blenkernel
+ ../blenlib
+ ../makesdna
+ ../../kernel/gen_messaging
+)
+
+set(SRC
+ intern/BLO_readblenfile.c
-SET(INC
- . ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging
+ BLO_readblenfile.h
)
-BLENDERLIB(bf_readblenfile "${SRC}" "${INC}")
+blender_add_lib(bf_readblenfile "${SRC}" "${INC}")
diff --git a/source/blender/readblenfile/Makefile b/source/blender/readblenfile/Makefile
deleted file mode 100644
index f0a46d077a8..00000000000
--- a/source/blender/readblenfile/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/readblenfile
-DIRS = intern stub
-
-include nan_subdirs.mk
diff --git a/source/blender/readblenfile/SConscript b/source/blender/readblenfile/SConscript
index 57ee1866263..6d8749df1e2 100644
--- a/source/blender/readblenfile/SConscript
+++ b/source/blender/readblenfile/SConscript
@@ -5,4 +5,4 @@ sources = env.Glob('intern/*.c')
incs = '. ../blenloader ../blenloader/intern ../blenkernel ../blenlib ../makesdna ../../kernel/gen_messaging'
-env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['core','player'], priority = [0,195] )
+env.BlenderLib ( 'bf_readblenfile', sources, Split(incs), [], libtype=['core','player'], priority = [0,5] )
diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index 57d16416dd8..ac059b12c0a 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -54,7 +54,7 @@
#include "BLI_blenlib.h"
/** Magic number for the file header */
-char *headerMagic = "BLENDFI";
+const char *headerMagic = "BLENDFI";
/**
* \brief Set the version number into the array.
@@ -132,7 +132,8 @@ blo_read_runtime(
ReportList *reports)
{
BlendFileData *bfd= NULL;
- int fd, actualsize, datastart;
+ size_t actualsize;
+ int fd, datastart;
char buf[8];
fd= open(path, O_BINARY|O_RDONLY, 0);
diff --git a/source/blender/readblenfile/intern/Makefile b/source/blender/readblenfile/intern/Makefile
deleted file mode 100644
index dc59ca3b9ed..00000000000
--- a/source/blender/readblenfile/intern/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfile
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../readstreamglue
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../blenloader
diff --git a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
index 33e9bfec446..ed8c22f4288 100644
--- a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
+++ b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@ int BLO_read_runtime( char *file);
BLO_readblenfilememory(
char *fromBuffer, int fromBufferSize)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilename is a stub\n");
#endif
@@ -52,7 +52,7 @@ BLO_readblenfilememory(
BLO_readblenfilename(
char *fileName)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilename is a stub\n");
#endif
@@ -63,7 +63,7 @@ BLO_readblenfilename(
BLO_readblenfilehandle(
int fileHandle)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_readblenfilehandle is a stub\n");
#endif
@@ -74,7 +74,7 @@ BLO_readblenfilehandle(
BLO_is_a_runtime(
char *file)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_is_a_runtime is a stub\n");
#endif
@@ -85,7 +85,7 @@ BLO_is_a_runtime(
BLO_read_runtime(
char *file)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
fprintf(GEN_errorstream,
"Error BLO_read_runtime is a stub\n");
#endif
diff --git a/source/blender/readblenfile/stub/Makefile b/source/blender/readblenfile/stub/Makefile
deleted file mode 100644
index 94a55407418..00000000000
--- a/source/blender/readblenfile/stub/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfileSTUB
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-CFLAGS += $(FIX_STUBS_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-
diff --git a/source/blender/readblenfile/test/Makefile b/source/blender/readblenfile/test/Makefile
deleted file mode 100644
index cc294ac60b3..00000000000
--- a/source/blender/readblenfile/test/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = readblenfile
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)test$(EXT)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-CPPFLAGS += -I../../readstreamglue
-
-$(DIR)/$(DEBUG_DIR)test$(EXT): $(OBJS) ../intern/BLO_readblenfile.c
- $(CC) $(LDFLAGS) -o $@ $(OBJS) $(OCGDIR)/blender/readblenfile/$(DEBUG_DIR)libreadblenfile.a
- $(DIR)/$(DEBUG_DIR)test$(EXT)
-
diff --git a/source/blender/readblenfile/test/test.c b/source/blender/readblenfile/test/test.c
index 1cb4f7e92f3..647df053c38 100644
--- a/source/blender/readblenfile/test/test.c
+++ b/source/blender/readblenfile/test/test.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt
index 169e9b7fa87..f00e54c1796 100644
--- a/source/blender/render/CMakeLists.txt
+++ b/source/blender/render/CMakeLists.txt
@@ -24,34 +24,111 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/source/*.c intern/raytrace/*.cpp)
+# remove warning until render branch merged.
+remove_strict_flags()
-SET(INC
- intern/include ../../../intern/guardedalloc ../blenlib ../makesdna
- extern/include ../blenkernel ../imbuf ../bmesh
- ../include ../../kernel/gen_messaging ../blenloader
- ../../../intern/smoke/extern
+set(INC
+ intern/include
+ extern/include
+ ../blenlib
+ ../blenloader
+ ../makesdna
../makesrna
+ ../blenkernel
+ ../imbuf
+ ../../kernel/gen_messaging
+ ../../../intern/smoke/extern
+ ../../../intern/mikktspace
+ ../../../intern/guardedalloc
)
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+set(SRC
+ intern/raytrace/rayobject.cpp
+ intern/raytrace/rayobject_empty.cpp
+ intern/raytrace/rayobject_octree.cpp
+ intern/raytrace/rayobject_raycounter.cpp
+ intern/raytrace/rayobject_svbvh.cpp
+ intern/raytrace/rayobject_blibvh.cpp
+ intern/raytrace/rayobject_instance.cpp
+ intern/raytrace/rayobject_qbvh.cpp
+ intern/raytrace/rayobject_rtbuild.cpp
+ intern/raytrace/rayobject_vbvh.cpp
+ intern/source/convertblender.c
+ intern/source/envmap.c
+ intern/source/gammaCorrectionTables.c
+ intern/source/imagetexture.c
+ intern/source/initrender.c
+ intern/source/occlusion.c
+ intern/source/pipeline.c
+ intern/source/pixelblending.c
+ intern/source/pixelshading.c
+ intern/source/pointdensity.c
+ intern/source/rayshade.c
+ intern/source/rendercore.c
+ intern/source/render_texture.c
+ intern/source/renderdatabase.c
+ intern/source/shadbuf.c
+ intern/source/shadeinput.c
+ intern/source/shadeoutput.c
+ intern/source/sss.c
+ intern/source/strand.c
+ intern/source/sunsky.c
+ intern/source/volume_precache.c
+ intern/source/volumetric.c
+ intern/source/voxeldata.c
+ intern/source/zbuf.c
+
+ extern/include/RE_pipeline.h
+ extern/include/RE_render_ext.h
+ extern/include/RE_shader_ext.h
+ intern/include/envmap.h
+ intern/include/gammaCorrectionTables.h
+ intern/include/initrender.h
+ intern/include/occlusion.h
+ intern/include/pixelblending.h
+ intern/include/pixelshading.h
+ intern/include/pointdensity.h
+ intern/include/raycounter.h
+ intern/include/rayobject.h
+ intern/include/rayintersection.h
+ intern/include/raycounter.h
+ intern/include/render_types.h
+ intern/include/rendercore.h
+ intern/include/renderdatabase.h
+ intern/include/renderpipeline.h
+ intern/include/shadbuf.h
+ intern/include/shading.h
+ intern/include/sss.h
+ intern/include/strand.h
+ intern/include/sunsky.h
+ intern/include/texture.h
+ intern/include/volume_precache.h
+ intern/include/volumetric.h
+ intern/include/voxeldata.h
+ intern/include/zbuf.h
+ intern/raytrace/bvh.h
+ intern/raytrace/rayobject_hint.h
+ intern/raytrace/rayobject_internal.h
+ intern/raytrace/rayobject_rtbuild.h
+ intern/raytrace/reorganize.h
+ intern/raytrace/svbvh.h
+ intern/raytrace/vbvh.h
+)
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(APPLE)
- IF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
- SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse")
- SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mfpmath=sse")
- ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
-ENDIF(APPLE)
+if(APPLE)
+ if(CMAKE_OSX_ARCHITECTURES MATCHES "i386" OR CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -mfpmath=sse")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mfpmath=sse")
+ endif()
+endif()
-BLENDERLIB_NOLIST(bf_render "${SRC}" "${INC}")
+blender_add_lib_nolist(bf_render "${SRC}" "${INC}")
diff --git a/source/blender/render/Makefile b/source/blender/render/Makefile
deleted file mode 100644
index 7be54ac359f..00000000000
--- a/source/blender/render/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/render
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 479c9d1ad40..d471025c7da 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -6,7 +6,11 @@ raysources = env.Glob('intern/raytrace/*.cpp')
incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna'
incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf'
+<<<<<<< .working
incs += ' ../include ../blenloader ../../../intern/smoke/extern ../bmesh'
+=======
+incs += ' ../include ../blenloader ../../../intern/smoke/extern ../../../intern/mikktspace'
+>>>>>>> .merge-right.r35190
cflags_raytrace = env['CCFLAGS']
cxxflags_raytrace = env['CXXFLAGS']
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index b12e45ecd9c..b64538cb452 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,12 +27,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RE_pipeline.h
+ * \ingroup render
+ */
+
#ifndef RE_PIPELINE_H
#define RE_PIPELINE_H
#include "DNA_listBase.h"
#include "DNA_vec_types.h"
-#include "BKE_utildefines.h"
#include "RNA_types.h"
struct bNodeTree;
@@ -145,7 +148,8 @@ typedef struct RenderStats {
int totface, totvert, totstrand, tothalo, totlamp, totpart;
short curfield, curblur, curpart, partsdone, convertdone;
double starttime, lastframetime;
- char *infostr, *statstr, scenename[32];
+ const char *infostr, *statstr;
+ char scenename[32];
} RenderStats;
@@ -159,6 +163,9 @@ struct Render *RE_GetRender(const char *name);
/* returns 1 while render is working (or renders called from within render) */
int RE_RenderInProgress(struct Render *re);
+/* assign default dummy callbacks */
+void RE_InitRenderCB(struct Render *re);
+
/* use free render as signal to do everything over (previews) */
void RE_FreeRender (struct Render *re);
/* only called on exit */
@@ -209,18 +216,18 @@ void RE_init_threadcount(Render *re);
void RE_TileProcessor(struct Render *re);
/* only RE_NewRender() needed, main Blender render calls */
-void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame);
+void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still);
void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
/* main preview render call */
void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
-void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
+void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress);
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
/* do a full sample buffer compo */
-void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
+void RE_MergeFullSample(struct Render *re, struct Main *bmain, struct Scene *sce, struct bNodeTree *ntree);
/* ancient stars function... go away! */
void RE_make_stars(struct Render *re, struct Scene *scenev3d, void (*initfunc)(void),
@@ -233,7 +240,7 @@ void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle
void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float));
void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
-void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, char *str));
+void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, const char *str));
/* should move to kernel once... still unsure on how/where */
float RE_filter_value(int type, float x);
@@ -284,18 +291,20 @@ typedef struct RenderEngine {
ListBase fullresult;
} RenderEngine;
-void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, char *filename);
-void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, char *filename);
+void RE_layer_load_from_file(RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y);
+void RE_result_load_from_file(RenderResult *result, struct ReportList *reports, const char *filename);
struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h);
void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result);
void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result);
int RE_engine_test_break(RenderEngine *engine);
-void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info);
+void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info);
void RE_engines_init(void);
void RE_engines_exit(void);
+int RE_is_rendering_allowed(struct Scene *scene, void *erh, void (*error)(void *handle, const char *str));
+
#endif /* RE_PIPELINE_H */
diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h
deleted file mode 100644
index 215dd816a4e..00000000000
--- a/source/blender/render/extern/include/RE_raytrace.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2007 Blender Foundation.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): André Pinto.
- *
- * ***** END GPL LICENSE BLOCK *****
- * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
- */
-
-#ifndef RE_RAYTRACE_H
-#define RE_RAYTRACE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// #define RE_RAYCOUNTER /* enable counters per ray, usefull for measuring raytrace structures performance */
-
-#define RE_RAY_LCTS_MAX_SIZE 256
-#define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */
-//#define RT_USE_HINT /* last hit object is reused before raycasting on whole tree */
-
-#ifdef RE_RAYCOUNTER
-
-typedef struct RayCounter RayCounter;
-struct RayCounter
-{
-
- struct
- {
- unsigned long long test, hit;
-
- } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit;
-};
-#endif
-
-/* Internals about raycasting structures can be found on intern/raytree.h */
-typedef struct RayObject RayObject;
-typedef struct Isect Isect;
-typedef struct RayHint RayHint;
-typedef struct RayTraceHint RayTraceHint;
-
-struct DerivedMesh;
-struct Mesh;
-struct VlakRen;
-struct ObjectInstanceRen;
-
-int RE_rayobject_raycast(RayObject *r, Isect *i);
-void RE_rayobject_add (RayObject *r, RayObject *);
-void RE_rayobject_done(RayObject *r);
-void RE_rayobject_free(RayObject *r);
-
-/* Extend min/max coords so that the rayobject is inside them */
-void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
-
-/* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
-void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max);
-
-/* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
-/* void RE_rayobject_hint_cone(RayObject *r, RayHint *hint, float *); */
-
-/* RayObject constructors */
-RayObject* RE_rayobject_octree_create(int ocres, int size);
-RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
-RayObject* RE_rayobject_empty_create();
-
-RayObject* RE_rayobject_blibvh_create(int size); /* BLI_kdopbvh.c */
-RayObject* RE_rayobject_vbvh_create(int size); /* raytrace/rayobject_vbvh.c */
-RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_svbvh.c */
-RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_qbvh.c */
-
-
-/*
- * This ray object represents a triangle or a quad face.
- * All data needed to realize intersection is "localy" available.
- */
-typedef struct RayFace
-{
- float v1[4], v2[4], v3[4], v4[3];
- int quad;
- void *ob;
- void *face;
-
-} RayFace;
-
-#define RE_rayface_isQuad(a) ((a)->quad)
-
-RayObject* RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-RayObject* RE_rayface_from_coords(RayFace *rayface, void *ob, void *face, float *co1, float *co2, float *co3, float *co4);
-
-
-/*
- * This ray object represents faces directly from a given VlakRen structure.
- * Thus allowing to save memory, but making code triangle intersection dependant on render structures
- */
-typedef struct VlakPrimitive
-{
- struct ObjectInstanceRen *ob;
- struct VlakRen *face;
-} VlakPrimitive;
-
-RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-
-
-
-/*
- * Raytrace hints
- */
-typedef struct LCTSHint LCTSHint;
-struct LCTSHint
-{
- int size;
- RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
-};
-
-struct RayHint
-{
- union
- {
- LCTSHint lcts;
- } data;
-};
-
-
-/* Ray Intersection */
-struct Isect
-{
- float start[3];
- float vec[3];
- float labda;
-
- /* length of vec, configured by RE_rayobject_raycast */
- int bv_index[6];
- float idot_axis[3];
- float dist;
-
-/* float end[3]; - not used */
-
- float u, v;
-
- struct
- {
- void *ob;
- void *face;
- }
- hit, orig;
-
- RayObject *last_hit; /* last hit optimization */
-
-#ifdef RT_USE_HINT
- RayTraceHint *hint, *hit_hint;
-#endif
-
- short isect; /* which half of quad */
- short mode; /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
- int lay; /* -1 default, set for layer lamps */
-
- int skip; /* RE_SKIP_CULLFACE */
-
- float col[4]; /* RGBA for shadow_tra */
-
- void *userdata;
-
- RayHint *hint;
-
-#ifdef RE_RAYCOUNTER
- RayCounter *raycounter;
-#endif
-};
-
-/* ray types */
-#define RE_RAY_SHADOW 0
-#define RE_RAY_MIRROR 1
-#define RE_RAY_SHADOW_TRA 2
-
-/* skip options */
-#define RE_SKIP_CULLFACE (1 << 0)
-
-/* if using this flag then *face should be a pointer to a VlakRen */
-#define RE_SKIP_VLR_NEIGHBOUR (1 << 1)
-#define RE_SKIP_VLR_RENDER_CHECK (1 << 2)
-#define RE_SKIP_VLR_NON_SOLID_MATERIAL (1 << 3)
-#define RE_SKIP_VLR_BAKE_CHECK (1 << 4)
-
-/* TODO use: FLT_MAX? */
-#define RE_RAYTRACE_MAXDIST 1e33
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /*__RE_RAYTRACE_H__*/
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 98720897e8e..849640a5c16 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,10 @@
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file RE_render_ext.h
+ * \ingroup render
+ */
+
#ifndef RE_RENDER_EXT_H
#define RE_RENDER_EXT_H
@@ -51,7 +55,7 @@ struct ImBuf;
//void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re);
/* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
-int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta);
+int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta, const int thread);
/* particle.c */
void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype);
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 6cab4a7ce03..ca04990efad 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,11 +26,14 @@
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file RE_shader_ext.h
+ * \ingroup render
+ */
+
#ifndef RE_SHADER_EXT_H
#define RE_SHADER_EXT_H
-#include "RE_raytrace.h" /* For RE_RAYCOUNTER */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is for shading and texture exports */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -52,7 +55,7 @@ typedef struct ShadeResult
float emit[3];
float diff[3]; /* no ramps, shadow, etc */
float spec[3];
- float shad[3];
+ float shad[4]; /* shad[3] is shadow intensity */
float ao[3];
float env[3];
float indirect[3];
@@ -137,7 +140,7 @@ typedef struct ShadeInput
/* texture coordinates */
float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4];
float refcol[4], displace[3];
- float strandco, tang[3], nmaptang[3], stress, winspeed[4];
+ float strandco, tang[3], nmapnorm[3], nmaptang[4], stress, winspeed[4];
float duplilo[3], dupliuv[3];
ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */
@@ -189,7 +192,11 @@ typedef struct ShadeInput
/* node shaders... */
struct Tex;
struct MTex;
+/* this one uses nodes */
int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
+/* nodes disabled */
+int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres);
+/* only for internal node usage */
int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres,
short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex);
diff --git a/source/blender/render/intern/Makefile b/source/blender/render/intern/Makefile
deleted file mode 100644
index 4043902a40f..00000000000
--- a/source/blender/render/intern/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/render/intern
-DIRS = source raytrace
-
-include nan_subdirs.mk
diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h
index 38f4aabc1ed..6c5e2b2f064 100644
--- a/source/blender/render/intern/include/raycounter.h
+++ b/source/blender/render/intern/include/raycounter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: raycounter.h 23649 2009-10-06 02:56:11Z jaguarandi $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,16 +26,27 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYCOUNTER_H
#define RE_RAYCOUNTER_H
-#include "RE_raytrace.h"
+//#define RE_RAYCOUNTER /* enable counters per ray, usefull for measuring raytrace structures performance */
+#ifdef __cplusplus
+extern "C" {
+#endif
#ifdef RE_RAYCOUNTER
-/* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */
-#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).raycounter)
+/* ray counter functions */
+
+typedef struct RayCounter {
+ struct {
+ unsigned long long test, hit;
+ } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit;
+} RayCounter;
+
+#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).shading.raycounter)
void RE_RC_INFO (RayCounter *rc);
void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
#define RE_RC_COUNT(var) (var)++
@@ -44,12 +55,17 @@ extern RayCounter re_rc_counter[];
#else
-# define RE_RC_INIT(isec,shi)
-# define RE_RC_INFO(rc)
-# define RE_RC_MERGE(dest,src)
-# define RE_RC_COUNT(var)
+/* ray counter stubs */
+
+#define RE_RC_INIT(isec,shi)
+#define RE_RC_INFO(rc)
+#define RE_RC_MERGE(dest,src)
+#define RE_RC_COUNT(var)
#endif
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/source/blender/render/intern/include/rayintersection.h b/source/blender/render/intern/include/rayintersection.h
new file mode 100644
index 00000000000..021801db2fa
--- /dev/null
+++ b/source/blender/render/intern/include/rayintersection.h
@@ -0,0 +1,124 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): André Pinto.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
+ */
+
+#ifndef __RENDER_RAYINTERSECTION_H__
+#define __RENDER_RAYINTERSECTION_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct RayObject;
+
+/* Ray Hints */
+
+#define RE_RAY_LCTS_MAX_SIZE 256
+#define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */
+//#define RT_USE_HINT /* last hit object is reused before raycasting on whole tree */
+
+typedef struct LCTSHint {
+ int size;
+ struct RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
+} LCTSHint;
+
+typedef struct RayHint {
+ union { LCTSHint lcts; } data;
+} RayHint;
+
+/* Ray Intersection */
+
+typedef struct Isect {
+ /* ray start, direction (normalized vector), and max distance. on hit,
+ the distance is modified to be the distance to the hit point. */
+ float start[3];
+ float dir[3];
+ float dist;
+
+ /* precomputed values to accelerate bounding box intersection */
+ int bv_index[6];
+ float idot_axis[3];
+
+ /* intersection options */
+ int mode; /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
+ int lay; /* -1 default, set for layer lamps */
+ int skip; /* skip flags */
+ int check; /* check flags */
+ void *userdata; /* used by bake check */
+
+ /* hit information */
+ float u, v;
+ int isect; /* which half of quad */
+
+ struct {
+ void *ob;
+ void *face;
+ } hit, orig;
+
+ /* last hit optimization */
+ struct RayObject *last_hit;
+
+ /* hints */
+#ifdef RT_USE_HINT
+ RayTraceHint *hint, *hit_hint;
+#endif
+ RayHint *hint;
+
+ /* ray counter */
+#ifdef RE_RAYCOUNTER
+ RayCounter *raycounter;
+#endif
+} Isect;
+
+/* ray types */
+#define RE_RAY_SHADOW 0
+#define RE_RAY_MIRROR 1
+#define RE_RAY_SHADOW_TRA 2
+
+/* skip options */
+#define RE_SKIP_CULLFACE (1 << 0)
+/* if using this flag then *face should be a pointer to a VlakRen */
+#define RE_SKIP_VLR_NEIGHBOUR (1 << 1)
+
+/* check options */
+#define RE_CHECK_VLR_NONE 0
+#define RE_CHECK_VLR_RENDER 1
+#define RE_CHECK_VLR_NON_SOLID_MATERIAL 2
+#define RE_CHECK_VLR_BAKE 3
+
+/* arbitrary, but can't use e.g. FLT_MAX because of precision issues */
+#define RE_RAYTRACE_MAXDIST 1e15f
+#define RE_RAYTRACE_EPSILON 0.0f
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __RENDER_RAYINTERSECTION_H__ */
+
diff --git a/source/blender/render/intern/include/rayobject.h b/source/blender/render/intern/include/rayobject.h
index a21c7ef4f50..f5c9dd32b85 100644
--- a/source/blender/render/intern/include/rayobject.h
+++ b/source/blender/render/intern/include/rayobject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id: rayobject.h 23651 2009-10-06 03:40:50Z aligorith $
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYOBJECT_H
#define RE_RAYOBJECT_H
@@ -33,176 +34,86 @@
extern "C" {
#endif
-#include "RE_raytrace.h"
-#include "render_types.h"
-#include <stdio.h>
-#include <float.h>
-
+struct Isect;
+struct ObjectInstanceRen;
+struct RayHint;
+struct VlakRen;
/* RayObject
-
- A ray object is everything where we can cast rays like:
- * a face/triangle
- * an octree
- * a bvh tree
- * an octree of bvh's
- * a bvh of bvh's
-
-
- All types of RayObjects can be created by implementing the
- callbacks of the RayObject.
-
- Due to high computing time evolved with casting on faces
- there is a special type of RayObject (named RayFace)
- which won't use callbacks like other generic nodes.
-
- In order to allow a mixture of RayFace+RayObjects,
- all RayObjects must be 4byte aligned, allowing us to use the
- 2 least significant bits (with the mask 0x03) to define the
- type of RayObject.
-
- This leads to 4 possible types of RayObject:
-
- addr&3 - type of object
- 0 Self (reserved for each structure)
- 1 RayFace (tri/quad primitive)
- 2 RayObject (generic with API callbacks)
- 3 VlakPrimitive
- (vlak primitive - to be used when we have a vlak describing the data
- eg.: on render code)
-
- 0 means it's reserved and has it own meaning inside each ray acceleration structure
- (this way each structure can use the allign offset to determine if a node represents a
- RayObject primitive, which can be used to save memory)
-
- You actually don't need to care about this if you are only using the API
- described on RE_raytrace.h
- */
-/* used to align a given ray object */
-#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3)))
+ Can be a face/triangle, bvh tree, object instance, etc. This is the
+ public API used by the renderer, see rayobject_internal.h for the
+ internal implementation details. */
-/* used to unalign a given ray object */
-#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1))
-#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2))
-#define RE_rayobject_unalignVlakPrimitive(o) ((RayObject*)(((intptr_t)o)|3))
+typedef struct RayObject RayObject;
-/* used to test the type of ray object */
-#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0)
-#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1)
-#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2)
-#define RE_rayobject_isVlakPrimitive(o) ((((intptr_t)o)&3) == 3)
+/* Intersection, see rayintersection.h */
+int RE_rayobject_raycast(RayObject *r, struct Isect *i);
+/* Acceleration Structures */
-/*
- * This class is intended as a place holder for control, configuration of the rayobject like:
- * - stop building (TODO maybe when porting build to threads this could be implemented with some thread_cancel function)
- * - max number of threads and threads callback to use during build
- * ...
- */
-typedef int (*RE_rayobjectcontrol_test_break_callback)(void *data);
-typedef struct RayObjectControl RayObjectControl;
-struct RayObjectControl
-{
- void *data;
- RE_rayobjectcontrol_test_break_callback test_break;
-};
+RayObject* RE_rayobject_octree_create(int ocres, int size);
+RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
+RayObject* RE_rayobject_empty_create();
-/*
- * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
- * It's suitable to implement things like LOD.
- */
-struct RayObject
-{
- struct RayObjectAPI *api;
+RayObject* RE_rayobject_blibvh_create(int size); /* BLI_kdopbvh.c */
+RayObject* RE_rayobject_vbvh_create(int size); /* raytrace/rayobject_vbvh.c */
+RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_svbvh.c */
+RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_qbvh.c */
- struct RayObjectControl control;
-};
+/* Building */
+void RE_rayobject_add(RayObject *r, RayObject *);
+void RE_rayobject_done(RayObject *r);
+void RE_rayobject_free(RayObject *r);
+void RE_rayobject_set_control(RayObject *r, void *data, int (*test_break)(void *data));
+/* RayObject representing faces, all data is locally available instead
+ of referring to some external data structure, for possibly faster
+ intersection tests. */
-typedef int (*RE_rayobject_raycast_callback)(RayObject *, Isect *);
-typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
-typedef void (*RE_rayobject_done_callback)(RayObject *);
-typedef void (*RE_rayobject_free_callback)(RayObject *);
-typedef void (*RE_rayobject_merge_bb_callback)(RayObject *, float *min, float *max);
-typedef float (*RE_rayobject_cost_callback)(RayObject *);
-typedef void (*RE_rayobject_hint_bb_callback)(RayObject *, RayHint *, float *, float *);
+typedef struct RayFace {
+ float v1[4], v2[4], v3[4], v4[3];
+ int quad;
+ void *ob;
+ void *face;
+} RayFace;
-typedef struct RayObjectAPI
-{
- RE_rayobject_raycast_callback raycast;
- RE_rayobject_add_callback add;
- RE_rayobject_done_callback done;
- RE_rayobject_free_callback free;
- RE_rayobject_merge_bb_callback bb;
- RE_rayobject_cost_callback cost;
- RE_rayobject_hint_bb_callback hint_bb;
-
-} RayObjectAPI;
+#define RE_rayface_isQuad(a) ((a)->quad)
+RayObject* RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
-/*
- * This function differs from RE_rayobject_raycast
- * RE_rayobject_intersect does NOT perform last-hit optimization
- * So this is probably a function to call inside raytrace structures
- */
-int RE_rayobject_intersect(RayObject *r, Isect *i);
+/* RayObject representing faces directly from a given VlakRen structure. Thus
+ allowing to save memory, but making code triangle intersection dependant on
+ render structures. */
-/*
- * Returns distance ray must travel to hit the given bounding box
- * BB should be in format [2][3]
- */
-/* float RE_rayobject_bb_intersect(const Isect *i, const float *bb); */
-int RE_rayobject_bb_intersect_test(const Isect *i, const float *bb); /* same as bb_intersect but doens't calculates distance */
+typedef struct VlakPrimitive {
+ struct ObjectInstanceRen *ob;
+ struct VlakRen *face;
+} VlakPrimitive;
-/*
- * Returns the expected cost of raycast on this node, primitives have a cost of 1
- */
-float RE_rayobject_cost(RayObject *r);
-
-
-/*
- * Returns true if for some reason a heavy processing function should stop
- * (eg.: user asked to stop during a tree a build)
- */
-int RE_rayobjectcontrol_test_break(RayObjectControl *c);
-
-
-#define ISECT_EPSILON ((float)FLT_EPSILON)
+RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
+/* Bounding Box */
+/* extend min/max coords so that the rayobject is inside them */
+void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
-#if !defined(_WIN32) && !defined(_WIN64)
+/* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
+void RE_rayobject_hint_bb(RayObject *r, struct RayHint *hint, float *min, float *max);
-#include <sys/time.h>
-#include <time.h>
-
-#define BENCH(a,name) \
- { \
- double _t1, _t2; \
- struct timeval _tstart, _tend; \
- clock_t _clock_init = clock(); \
- gettimeofday ( &_tstart, NULL); \
- (a); \
- gettimeofday ( &_tend, NULL); \
- _t1 = ( double ) _tstart.tv_sec + ( double ) _tstart.tv_usec/ ( 1000*1000 ); \
- _t2 = ( double ) _tend.tv_sec + ( double ) _tend.tv_usec/ ( 1000*1000 ); \
- printf("BENCH:%s: %fs (real) %fs (cpu)\n", #name, _t2-_t1, (float)(clock()-_clock_init)/CLOCKS_PER_SEC);\
- }
-#else
-
-#define BENCH(a,name) (a)
-
-#endif
+/* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
+/* void RE_rayobject_hint_cone(RayObject *r, struct RayHint *hint, float *); */
+/* Internals */
+#include "../raytrace/rayobject_internal.h"
#ifdef __cplusplus
}
#endif
-
#endif
+
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index b124102f50b..cab44644819 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -131,7 +131,8 @@ struct Render
ThreadRWMutex resultmutex;
/* window size, display rect, viewplane */
- int winx, winy;
+ int winx, winy; /* buffer width and height with percentage applied
+ * without border & crop. convert to long before multiplying together to avoid overflow. */
rcti disprect; /* part within winx winy */
rctf viewplane; /* mapped on winx winy */
float viewdx, viewdy; /* size of 1 pixel */
@@ -243,7 +244,7 @@ struct Render
int (*test_break)(void *handle);
void *tbh;
- void (*error)(void *handle, char *str);
+ void (*error)(void *handle, const char *str);
void *erh;
RenderStats i;
@@ -432,7 +433,9 @@ typedef struct StrandBuffer {
int overrideuv;
int flag, maxdepth;
float adaptcos, minwidth, widthfade;
-
+
+ float maxwidth; /* for cliptest of strands in blender unit */
+
float winmat[4][4];
int winx, winy;
} StrandBuffer;
@@ -604,6 +607,7 @@ typedef struct LampRen {
#define R_DIVIDE_24 32
/* vertex normals are tangent or view-corrected vector, for hair strands */
#define R_TANGENT 64
+#define R_TRACEBLE 128
/* strandbuffer->flag */
#define R_STRAND_BSPLINE 1
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index e9e30f64fdd..3b0929bbe27 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -48,6 +48,7 @@ struct RenderPart;
struct RenderLayer;
struct ObjectRen;
struct ListBase;
+struct RayObject;
/* ------------------------------------------------------------------------- */
@@ -95,7 +96,7 @@ int get_sample_layers(struct RenderPart *pa, struct RenderLayer *rl, struct Rend
extern void freeraytree(Render *re);
extern void makeraytree(Render *re);
-RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi);
+struct RayObject* makeraytree_object(Render *re, ObjectInstanceRen *obi);
extern void ray_shadow(ShadeInput *, LampRen *, float *);
extern void ray_trace(ShadeInput *, ShadeResult *);
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 4c80616665d..7b8dddd1ce6 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -96,7 +96,7 @@ struct VertRen *RE_findOrAddVert(struct ObjectRen *obr, int nr);
struct StrandRen *RE_findOrAddStrand(struct ObjectRen *obr, int nr);
struct HaloRen *RE_findOrAddHalo(struct ObjectRen *obr, int nr);
struct HaloRen *RE_inithalo(struct Render *re, struct ObjectRen *obr, struct Material *ma, float *vec, float *vec1, float *orco, float hasize, float vectsize, int seed);
-struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
+struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed, float *pa_co);
struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
diff --git a/source/blender/render/intern/include/renderpipeline.h b/source/blender/render/intern/include/renderpipeline.h
index f6106a1f65a..289e9bc9f04 100644
--- a/source/blender/render/intern/include/renderpipeline.h
+++ b/source/blender/render/intern/include/renderpipeline.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 8250c5631dd..739c7cd3d26 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -62,6 +62,7 @@ void shade_input_calc_viewco(struct ShadeInput *shi, float x, float y, float z,
void shade_input_set_viewco(struct ShadeInput *shi, float x, float y, float sx, float sy, float z);
void shade_input_set_uv(struct ShadeInput *shi);
void shade_input_set_normals(struct ShadeInput *shi);
+void shade_input_set_vertex_normals(struct ShadeInput *shi);
void shade_input_flip_normals(struct ShadeInput *shi);
void shade_input_set_shade_texco(struct ShadeInput *shi);
void shade_input_set_strand(struct ShadeInput *shi, struct StrandRen *strand, struct StrandPoint *spoint);
diff --git a/source/blender/render/intern/include/sss.h b/source/blender/render/intern/include/sss.h
index 8acf5ef69b0..8e54f90fca3 100644
--- a/source/blender/render/intern/include/sss.h
+++ b/source/blender/render/intern/include/sss.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
index 66a5a7d1a0f..ffb2b8aa809 100644
--- a/source/blender/render/intern/include/strand.h
+++ b/source/blender/render/intern/include/strand.h
@@ -90,7 +90,7 @@ typedef struct StrandShadeCache StrandShadeCache;
void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint);
void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
-void strand_minmax(struct StrandRen *strand, float *min, float *max);
+void strand_minmax(struct StrandRen *strand, float *min, float *max, float width);
struct StrandSurface *cache_strand_surface(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, float mat[][4], int timeoffset);
void free_strand_surface(struct Render *re);
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
index 111d1df2694..26d74d21e18 100644
--- a/source/blender/render/intern/include/sunsky.h
+++ b/source/blender/render/intern/include/sunsky.h
@@ -1,4 +1,4 @@
- /**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index fb941d1b7f3..8eb91f3299f 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -48,6 +48,7 @@ if(tex->saturation != 1.0f) { \
hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], &texres->tr, &texres->tg, &texres->tb); \
} \
+#define RGBTOBW(r,g,b) ( r*0.35 + g*0.45 + b*0.2 ) /* keep this in sync with gpu_shader_material.glsl:rgbtobw */
struct HaloRen;
struct ShadeInput;
diff --git a/source/blender/render/intern/include/volume_precache.h b/source/blender/render/intern/include/volume_precache.h
index 3ddf8380241..2dfe205f850 100644
--- a/source/blender/render/intern/include/volume_precache.h
+++ b/source/blender/render/intern/include/volume_precache.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
index 37b1bd7ca29..70012058c34 100644
--- a/source/blender/render/intern/include/volumetric.h
+++ b/source/blender/render/intern/include/volumetric.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+struct Isect;
+struct ShadeInput;
+struct ShadeResult;
+
float vol_get_density(struct ShadeInput *shi, float *co);
void vol_get_scattering(ShadeInput *shi, float *scatter_col, float *co_);
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
index 1b9421b654e..89cb18844d5 100644
--- a/source/blender/render/intern/include/voxeldata.h
+++ b/source/blender/render/intern/include/voxeldata.h
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/render/intern/raytrace/Makefile b/source/blender/render/intern/raytrace/Makefile
deleted file mode 100644
index 2da8038c610..00000000000
--- a/source/blender/render/intern/raytrace/Makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = render_raytrace
-DIR = $(OCGDIR)/blender/render
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# first /include is my own includes, second is the external interface.
-# The external modules follow after. There should be a nicer way to say this.
-CPPFLAGS += -I../include
-CPPFLAGS += -I../../extern/include
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../quicktime
-CPPFLAGS += -I../../../../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# not very neat: the rest of blender..
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../../../../intern/smoke/extern
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-ifeq ($(WITH_OPENEXR),true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
-
-ifeq ($(WITH_BF_RAYOPTIMIZATION), true)
- CPPFLAGS += -D__SSE__
-endif
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
index 133a3d4a005..e581bbf369a 100644
--- a/source/blender/render/intern/raytrace/bvh.h
+++ b/source/blender/render/intern/raytrace/bvh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include "rayobject.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
#include "raycounter.h"
-#include "rayobject_rtbuild.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "rayobject_hint.h"
+#include "rayobject_rtbuild.h"
#include <assert.h>
@@ -43,21 +49,49 @@
#ifdef __SSE__
inline int test_bb_group4(__m128 *bb_group, const Isect *isec)
{
-
const __m128 tmin0 = _mm_setzero_ps();
- const __m128 tmax0 = _mm_load1_ps(&isec->labda);
-
- const __m128 tmin1 = _mm_max_ps(tmin0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[0]], _mm_load1_ps(&isec->start[0]) ), _mm_load1_ps(&isec->idot_axis[0])) );
- const __m128 tmax1 = _mm_min_ps(tmax0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[1]], _mm_load1_ps(&isec->start[0]) ), _mm_load1_ps(&isec->idot_axis[0])) );
- const __m128 tmin2 = _mm_max_ps(tmin1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[2]], _mm_load1_ps(&isec->start[1]) ), _mm_load1_ps(&isec->idot_axis[1])) );
- const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[3]], _mm_load1_ps(&isec->start[1]) ), _mm_load1_ps(&isec->idot_axis[1])) );
- const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[4]], _mm_load1_ps(&isec->start[2]) ), _mm_load1_ps(&isec->idot_axis[2])) );
- const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[5]], _mm_load1_ps(&isec->start[2]) ), _mm_load1_ps(&isec->idot_axis[2])) );
+ const __m128 tmax0 = _mm_set_ps1(isec->dist);
+
+ float start[3], idot_axis[3];
+ copy_v3_v3(start, isec->start);
+ copy_v3_v3(idot_axis, isec->idot_axis);
+
+ const __m128 tmin1 = _mm_max_ps(tmin0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[0]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
+ const __m128 tmax1 = _mm_min_ps(tmax0, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[1]], _mm_set_ps1(start[0]) ), _mm_set_ps1(idot_axis[0])) );
+ const __m128 tmin2 = _mm_max_ps(tmin1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[2]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
+ const __m128 tmax2 = _mm_min_ps(tmax1, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[3]], _mm_set_ps1(start[1]) ), _mm_set_ps1(idot_axis[1])) );
+ const __m128 tmin3 = _mm_max_ps(tmin2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[4]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
+ const __m128 tmax3 = _mm_min_ps(tmax2, _mm_mul_ps( _mm_sub_ps( bb_group[isec->bv_index[5]], _mm_set_ps1(start[2]) ), _mm_set_ps1(idot_axis[2])) );
return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
}
#endif
+/*
+ * Determines the distance that the ray must travel to hit the bounding volume of the given node
+ * Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
+ * [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
+ */
+static int rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
+{
+ const float *bb = _bb;
+
+ float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
+ float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
+ float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
+ float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
+ float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
+ float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
+
+ RE_RC_COUNT(isec->raycounter->bb.test);
+
+ if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
+ if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
+ if(t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
+ RE_RC_COUNT(isec->raycounter->bb.hit);
+
+ return 1;
+}
/* bvh tree generics */
template<class Tree> static int bvh_intersect(Tree *obj, Isect *isec);
@@ -106,7 +140,7 @@ static float bvh_cost(Tree *obj)
/* bvh tree nodes generics */
template<class Node> static inline int bvh_node_hit_test(Node *node, Isect *isec)
{
- return RE_rayobject_bb_intersect_test(isec, (const float*)node->bb);
+ return rayobject_bb_intersect_test(isec, (const float*)node->bb);
}
@@ -131,7 +165,7 @@ static inline void bvh_node_merge_bb(Node *node, float *min, float *max)
*/
template<class Node> static inline void bvh_node_push_childs(Node *node, Isect *isec, Node **stack, int &stack_pos);
-template<class Node,int MAX_STACK_SIZE,bool TEST_ROOT>
+template<class Node,int MAX_STACK_SIZE,bool TEST_ROOT,bool SHADOW>
static int bvh_node_stack_raycast(Node *root, Isect *isec)
{
Node *stack[MAX_STACK_SIZE];
@@ -156,7 +190,7 @@ static int bvh_node_stack_raycast(Node *root, Isect *isec)
else
{
hit |= RE_rayobject_intersect( (RayObject*)node, isec);
- if(hit && isec->mode == RE_RAY_SHADOW) return hit;
+ if(SHADOW && hit) return hit;
}
}
return hit;
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index 84ec56e131a..1bcda3ca039 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,127 +26,86 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <assert.h>
-#include "BKE_utildefines.h"
+#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "DNA_material_types.h"
-#include "RE_raytrace.h"
-#include "render_types.h"
+#include "rayintersection.h"
#include "rayobject.h"
#include "raycounter.h"
+#include "render_types.h"
-/*
- * Determines the distance that the ray must travel to hit the bounding volume of the given node
- * Based on Tactical Optimization of Ray/Box Intersection, by Graham Fyffe
- * [http://tog.acm.org/resources/RTNews/html/rtnv21n1.html#art9]
- */
-int RE_rayobject_bb_intersect_test(const Isect *isec, const float *_bb)
-{
- const float *bb = _bb;
-
- float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
- float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
- float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
- float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
- float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
- float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
-
- RE_RC_COUNT(isec->raycounter->bb.test);
-
- if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
- if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
- if(t1x > isec->labda || t1y > isec->labda || t1z > isec->labda) return 0;
- RE_RC_COUNT(isec->raycounter->bb.hit);
-
- return 1;
-}
+/* RayFace
+ note we force always inline here, because compiler refuses to otherwise
+ because function is too long. Since this is code that is called billions
+ of times we really do want to inline. */
-/* only for self-intersecting test with current render face (where ray left) */
-static int intersection2(VlakRen *face, float r0, float r1, float r2, float rx1, float ry1, float rz1)
+MALWAYS_INLINE RayObject* rayface_from_coords(RayFace *rayface, void *ob, void *face, float *v1, float *v2, float *v3, float *v4)
{
- float co1[3], co2[3], co3[3], co4[3];
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22;
- float m0, m1, m2, divdet, det, det1;
- float u1, v, u2;
+ rayface->ob = ob;
+ rayface->face = face;
- VECCOPY(co1, face->v1->co);
- VECCOPY(co2, face->v2->co);
- if(face->v4)
+ copy_v3_v3(rayface->v1, v1);
+ copy_v3_v3(rayface->v2, v2);
+ copy_v3_v3(rayface->v3, v3);
+
+ if(v4)
{
- VECCOPY(co3, face->v4->co);
- VECCOPY(co4, face->v3->co);
+ copy_v3_v3(rayface->v4, v4);
+ rayface->quad = 1;
}
else
{
- VECCOPY(co3, face->v3->co);
+ rayface->quad = 0;
}
- t00= co3[0]-co1[0];
- t01= co3[1]-co1[1];
- t02= co3[2]-co1[2];
- t10= co3[0]-co2[0];
- t11= co3[1]-co2[1];
- t12= co3[2]-co2[2];
-
- x0= t11*r2-t12*r1;
- x1= t12*r0-t10*r2;
- x2= t10*r1-t11*r0;
-
- divdet= t00*x0+t01*x1+t02*x2;
+ return RE_rayobject_unalignRayFace(rayface);
+}
- m0= rx1-co3[0];
- m1= ry1-co3[1];
- m2= rz1-co3[2];
- det1= m0*x0+m1*x1+m2*x2;
-
- if(divdet!=0.0f) {
- u1= det1/divdet;
+MALWAYS_INLINE void rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
+{
+ rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0);
- if(u1<ISECT_EPSILON) {
- det= t00*(m1*r2-m2*r1);
- det+= t01*(m2*r0-m0*r2);
- det+= t02*(m0*r1-m1*r0);
- v= det/divdet;
+ if(obi->transform_primitives)
+ {
+ mul_m4_v3(obi->mat, rayface->v1);
+ mul_m4_v3(obi->mat, rayface->v2);
+ mul_m4_v3(obi->mat, rayface->v3);
- if(v<ISECT_EPSILON && (u1 + v) > -(1.0f+ISECT_EPSILON)) {
- return 1;
- }
- }
+ if(RE_rayface_isQuad(rayface))
+ mul_m4_v3(obi->mat, rayface->v4);
}
+}
- if(face->v4) {
+RayObject* RE_rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
+{
+ return rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0);
+}
- t20= co3[0]-co4[0];
- t21= co3[1]-co4[1];
- t22= co3[2]-co4[2];
+/* VlakPrimitive */
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
- u2= det1/divdet;
-
- if(u2<ISECT_EPSILON) {
- det= t20*(m1*r2-m2*r1);
- det+= t21*(m2*r0-m0*r2);
- det+= t22*(m0*r1-m1*r0);
- v= det/divdet;
-
- if(v<ISECT_EPSILON && (u2 + v) >= -(1.0f+ISECT_EPSILON)) {
- return 2;
- }
- }
- }
- }
- return 0;
+RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr)
+{
+ face->ob = obi;
+ face->face = vlr;
+
+ return RE_rayobject_unalignVlakPrimitive(face);
}
-static inline int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen *vlr)
+/* Checks for ignoring faces or materials */
+
+MALWAYS_INLINE int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen *vlr)
{
/* for baking selected to active non-traceable materials might still
* be in the raytree */
- if(!(vlr->mat->mode & MA_TRACEBLE))
+ if(!(vlr->flag & R_TRACEBLE))
return 0;
/* I know... cpu cycle waste, might do smarter once */
@@ -156,7 +115,7 @@ static inline int vlr_check_intersect(Isect *is, ObjectInstanceRen *obi, VlakRen
return (is->lay & obi->lay);
}
-static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+MALWAYS_INLINE int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
{
/* solid material types only */
if (vlr->mat->material_type == MA_TYPE_SURFACE)
@@ -165,168 +124,223 @@ static inline int vlr_check_intersect_solid(Isect *is, ObjectInstanceRen* obi, V
return 0;
}
-static inline int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
+MALWAYS_INLINE int vlr_check_bake(Isect *is, ObjectInstanceRen* obi, VlakRen *vlr)
{
return (obi->obr->ob != is->userdata);
}
-static inline int rayface_check_cullface(RayFace *face, Isect *is)
-{
- float nor[3];
-
- /* don't intersect if the ray faces along the face normal */
- if(face->quad) normal_quad_v3( nor,face->v1, face->v2, face->v3, face->v4);
- else normal_tri_v3( nor,face->v1, face->v2, face->v3);
-
- return (INPR(nor, is->vec) < 0);
-}
+/* Ray Triangle/Quad Intersection */
-/* ray - triangle or quad intersection */
-/* this function shall only modify Isect if it detects an hit */
-static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
+MALWAYS_INLINE int isec_tri_quad(float start[3], float dir[3], RayFace *face, float uv[2], float *lambda)
{
- float co1[3],co2[3],co3[3],co4[3]={0};
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22,r0,r1,r2;
- float m0, m1, m2, divdet, det1;
- float labda, u, v;
- short ok=0;
-
- if(is->orig.ob == face->ob && is->orig.face == face->face)
- return 0;
-
- /* check if we should intersect this face */
- if(is->skip & RE_SKIP_VLR_RENDER_CHECK)
- {
- if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- }
- else if(is->skip & RE_SKIP_VLR_NON_SOLID_MATERIAL)
- {
- if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
- return 0;
- }
- else if(is->skip & RE_SKIP_VLR_BAKE_CHECK) {
- if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face ) == 0)
- return 0;
- }
+ float co1[3], co2[3], co3[3], co4[3];
+ float t0[3], t1[3], x[3], r[3], m[3], u, v, divdet, det1, l;
+ int quad;
- if(is->skip & RE_SKIP_CULLFACE)
- {
- if(rayface_check_cullface(face, is) == 0)
- return 0;
- }
+ quad= RE_rayface_isQuad(face);
- RE_RC_COUNT(is->raycounter->faces.test);
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
- //Load coords
- VECCOPY(co1, face->v1);
- VECCOPY(co2, face->v2);
- if(RE_rayface_isQuad(face))
- {
- VECCOPY(co3, face->v4);
- VECCOPY(co4, face->v3);
- }
- else
- {
- VECCOPY(co3, face->v3);
- }
+ copy_v3_v3(r, dir);
- t00= co3[0]-co1[0];
- t01= co3[1]-co1[1];
- t02= co3[2]-co1[2];
- t10= co3[0]-co2[0];
- t11= co3[1]-co2[1];
- t12= co3[2]-co2[2];
-
- r0= is->vec[0];
- r1= is->vec[1];
- r2= is->vec[2];
-
- x0= t12*r1-t11*r2;
- x1= t10*r2-t12*r0;
- x2= t11*r0-t10*r1;
+ /* intersect triangle */
+ sub_v3_v3v3(t0, co3, co2);
+ sub_v3_v3v3(t1, co3, co1);
- divdet= t00*x0+t01*x1+t02*x2;
+ cross_v3_v3v3(x, r, t1);
+ divdet= dot_v3v3(t0, x);
- m0= is->start[0]-co3[0];
- m1= is->start[1]-co3[1];
- m2= is->start[2]-co3[2];
- det1= m0*x0+m1*x1+m2*x2;
+ sub_v3_v3v3(m, start, co3);
+ det1= dot_v3v3(m, x);
- if(divdet!=0.0f) {
-
+ if(divdet != 0.0f) {
divdet= 1.0f/divdet;
- u= det1*divdet;
- if(u<ISECT_EPSILON && u>-(1.0f+ISECT_EPSILON)) {
- float cros0, cros1, cros2;
-
- cros0= m1*t02-m2*t01;
- cros1= m2*t00-m0*t02;
- cros2= m0*t01-m1*t00;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+ v= det1*divdet;
+
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
- if(v<ISECT_EPSILON && (u + v) > -(1.0f+ISECT_EPSILON)) {
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ l= divdet*dot_v3v3(cros, t1);
- if(labda>-ISECT_EPSILON && labda<is->labda) {
- ok= 1;
+ /* check if intersection is within ray length */
+ if(l > -RE_RAYTRACE_EPSILON && l < *lambda) {
+ uv[0]= u;
+ uv[1]= v;
+ *lambda= l;
+ return 1;
}
}
}
}
- if(ok==0 && RE_rayface_isQuad(face)) {
+ /* intersect second triangle in quad */
+ if(quad) {
+ copy_v3_v3(co4, face->v4);
+ sub_v3_v3v3(t0, co3, co4);
+ divdet= dot_v3v3(t0, x);
- t20= co3[0]-co4[0];
- t21= co3[1]-co4[1];
- t22= co3[2]-co4[2];
-
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
+ if(divdet != 0.0f) {
divdet= 1.0f/divdet;
- u = det1*divdet;
+ v = det1*divdet;
- if(u<ISECT_EPSILON && u>-(1.0f+ISECT_EPSILON)) {
- float cros0, cros1, cros2;
- cros0= m1*t22-m2*t21;
- cros1= m2*t20-m0*t22;
- cros2= m0*t21-m1*t20;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
- if(v<ISECT_EPSILON && (u + v) >-(1.0f+ISECT_EPSILON)) {
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ l= divdet*dot_v3v3(cros, t1);
- if(labda>-ISECT_EPSILON && labda<is->labda) {
- ok= 2;
+ if(l >- RE_RAYTRACE_EPSILON && l < *lambda) {
+ uv[0]= u;
+ uv[1]= -(1.0f + v + u);
+ *lambda= l;
+ return 2;
}
}
}
}
}
+ return 0;
+}
+
+/* Simpler yes/no Ray Triangle/Quad Intersection */
+
+MALWAYS_INLINE int isec_tri_quad_neighbour(float start[3], float dir[3], RayFace *face)
+{
+ float co1[3], co2[3], co3[3], co4[3];
+ float t0[3], t1[3], x[3], r[3], m[3], u, v, divdet, det1;
+ int quad;
+
+ quad= RE_rayface_isQuad(face);
+
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
+
+ negate_v3_v3(r, dir); /* note, different than above function */
+
+ /* intersect triangle */
+ sub_v3_v3v3(t0, co3, co2);
+ sub_v3_v3v3(t1, co3, co1);
+
+ cross_v3_v3v3(x, r, t1);
+ divdet= dot_v3v3(t0, x);
+
+ sub_v3_v3v3(m, start, co3);
+ det1= dot_v3v3(m, x);
+
+ if(divdet != 0.0f) {
+ divdet= 1.0f/divdet;
+ v= det1*divdet;
+
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
+
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON))
+ return 1;
+ }
+ }
+
+ /* intersect second triangle in quad */
+ if(quad) {
+ copy_v3_v3(co4, face->v4);
+ sub_v3_v3v3(t0, co3, co4);
+ divdet= dot_v3v3(t0, x);
+
+ if(divdet != 0.0f) {
+ divdet= 1.0f/divdet;
+ v = det1*divdet;
+
+ if(v < RE_RAYTRACE_EPSILON && v > -(1.0f+RE_RAYTRACE_EPSILON)) {
+ float cros[3];
+
+ cross_v3_v3v3(cros, m, t0);
+ u= divdet*dot_v3v3(cros, r);
+
+ if(u < RE_RAYTRACE_EPSILON && (v + u) > -(1.0f+RE_RAYTRACE_EPSILON))
+ return 2;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* RayFace intersection with checks and neighbour verifaction included,
+ Isect is modified if the face is hit. */
+
+MALWAYS_INLINE int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
+{
+ float dist, uv[2];
+ int ok= 0;
+
+ /* avoid self-intersection */
+ if(is->orig.ob == face->ob && is->orig.face == face->face)
+ return 0;
+
+ /* check if we should intersect this face */
+ if(is->check == RE_CHECK_VLR_RENDER)
+ {
+ if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+ else if(is->check == RE_CHECK_VLR_NON_SOLID_MATERIAL)
+ {
+ if(vlr_check_intersect(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ if(vlr_check_intersect_solid(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+ else if(is->check == RE_CHECK_VLR_BAKE) {
+ if(vlr_check_bake(is, (ObjectInstanceRen*)face->ob, (VlakRen*)face->face) == 0)
+ return 0;
+ }
+
+ /* ray counter */
+ RE_RC_COUNT(is->raycounter->faces.test);
+
+ dist= is->dist;
+ ok= isec_tri_quad(is->start, is->dir, face, uv, &dist);
+
if(ok) {
- /* when a shadow ray leaves a face, it can be little outside the edges of it, causing
- intersection to be detected in its neighbour face */
+ /* when a shadow ray leaves a face, it can be little outside the edges
+ of it, causing intersection to be detected in its neighbour face */
if(is->skip & RE_SKIP_VLR_NEIGHBOUR)
{
- if(labda < 0.1f && is->orig.ob == face->ob)
+ if(dist < 0.1f && is->orig.ob == face->ob)
{
VlakRen * a = (VlakRen*)is->orig.face;
VlakRen * b = (VlakRen*)face->face;
- /* so there's a shared edge or vertex, let's intersect ray with face
- itself, if that's true we can safely return 1, otherwise we assume
- the intersection is invalid, 0 */
+ /* so there's a shared edge or vertex, let's intersect ray with
+ face itself, if that's true we can safely return 1, otherwise
+ we assume the intersection is invalid, 0 */
if(a->v1==b->v1 || a->v2==b->v1 || a->v3==b->v1 || a->v4==b->v1
|| a->v1==b->v2 || a->v2==b->v2 || a->v3==b->v2 || a->v4==b->v2
|| a->v1==b->v3 || a->v2==b->v3 || a->v3==b->v3 || a->v4==b->v3
- || (b->v4 && (a->v1==b->v4 || a->v2==b->v4 || a->v3==b->v4 || a->v4==b->v4)))
- if(!intersection2((VlakRen*)a, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]))
- {
- return 0;
+ || (b->v4 && (a->v1==b->v4 || a->v2==b->v4 || a->v3==b->v4 || a->v4==b->v4))) {
+ /* create RayFace from original face, transformed if necessary */
+ RayFace origface;
+ ObjectInstanceRen *ob= (ObjectInstanceRen*)is->orig.ob;
+ rayface_from_vlak(&origface, ob, (VlakRen*)is->orig.face);
+
+ if(!isec_tri_quad_neighbour(is->start, is->dir, &origface))
+ {
+ return 0;
+ }
}
}
}
@@ -334,8 +348,8 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
RE_RC_COUNT(is->raycounter->faces.hit);
is->isect= ok; // which half of the quad
- is->labda= labda;
- is->u= u; is->v= v;
+ is->dist= dist;
+ is->u= uv[0]; is->v= uv[1];
is->hit.ob = face->ob;
is->hit.face = face->face;
@@ -348,51 +362,18 @@ static int intersect_rayface(RayObject *hit_obj, RayFace *face, Isect *is)
return 0;
}
-RayObject* RE_rayface_from_vlak(RayFace *rayface, ObjectInstanceRen *obi, VlakRen *vlr)
-{
- return RE_rayface_from_coords(rayface, obi, vlr, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4 ? vlr->v4->co : 0 );
-}
-
-RayObject* RE_rayface_from_coords(RayFace *rayface, void *ob, void *face, float *v1, float *v2, float *v3, float *v4)
-{
- rayface->ob = ob;
- rayface->face = face;
-
- VECCOPY(rayface->v1, v1);
- VECCOPY(rayface->v2, v2);
- VECCOPY(rayface->v3, v3);
- if(v4)
- {
- VECCOPY(rayface->v4, v4);
- rayface->quad = 1;
- }
- else
- {
- rayface->quad = 0;
- }
-
- return RE_rayobject_unalignRayFace(rayface);
-}
-
-RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr)
-{
- face->ob = obi;
- face->face = vlr;
- return RE_rayobject_unalignVlakPrimitive(face);
-}
-
+/* Intersection */
int RE_rayobject_raycast(RayObject *r, Isect *isec)
{
int i;
+
RE_RC_COUNT(isec->raycounter->raycast.test);
- /* Setup vars used on raycast */
- isec->dist = len_v3(isec->vec);
-
+ /* setup vars used on raycast */
for(i=0; i<3; i++)
{
- isec->idot_axis[i] = 1.0f / isec->vec[i];
+ isec->idot_axis[i] = 1.0f / isec->dir[i];
isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
@@ -402,7 +383,7 @@ int RE_rayobject_raycast(RayObject *r, Isect *isec)
}
#ifdef RT_USE_LAST_HIT
- /* Last hit heuristic */
+ /* last hit heuristic */
if(isec->mode==RE_RAY_SHADOW && isec->last_hit)
{
RE_RC_COUNT(isec->raycounter->rayshadow_last_hit.test);
@@ -429,6 +410,7 @@ int RE_rayobject_raycast(RayObject *r, Isect *isec)
#endif
return 1;
}
+
return 0;
}
@@ -443,98 +425,92 @@ int RE_rayobject_intersect(RayObject *r, Isect *i)
//TODO optimize (useless copy to RayFace to avoid duplicate code)
VlakPrimitive *face = (VlakPrimitive*) RE_rayobject_align(r);
RayFace nface;
- RE_rayface_from_vlak(&nface, face->ob, face->face);
-
- if(face->ob->transform_primitives)
- {
- mul_m4_v3(face->ob->mat, nface.v1);
- mul_m4_v3(face->ob->mat, nface.v2);
- mul_m4_v3(face->ob->mat, nface.v3);
- if(RE_rayface_isQuad(&nface))
- mul_m4_v3(face->ob->mat, nface.v4);
- }
+ rayface_from_vlak(&nface, face->ob, face->face);
return intersect_rayface(r, &nface, i);
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- return r->api->raycast( r, i );
+ r = RE_rayobject_align(r);
+ return r->api->raycast(r, i);
+ }
+ else {
+ assert(0);
+ return 0;
}
- else assert(0);
- return 0; /* wont reach this, quiet compilers */
}
+/* Building */
+
void RE_rayobject_add(RayObject *r, RayObject *o)
{
- r = RE_rayobject_align( r );
- return r->api->add( r, o );
+ r = RE_rayobject_align(r);
+ return r->api->add(r, o);
}
void RE_rayobject_done(RayObject *r)
{
- r = RE_rayobject_align( r );
- r->api->done( r );
+ r = RE_rayobject_align(r);
+ r->api->done(r);
}
void RE_rayobject_free(RayObject *r)
{
- r = RE_rayobject_align( r );
- r->api->free( r );
+ r = RE_rayobject_align(r);
+ r->api->free(r);
+}
+
+float RE_rayobject_cost(RayObject *r)
+{
+ if(RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r))
+ {
+ return 1.0f;
+ }
+ else if(RE_rayobject_isRayAPI(r))
+ {
+ r = RE_rayobject_align(r);
+ return r->api->cost(r);
+ }
+ else {
+ assert(0);
+ return 1.0f;
+ }
}
+/* Bounding Boxes */
+
void RE_rayobject_merge_bb(RayObject *r, float *min, float *max)
{
if(RE_rayobject_isRayFace(r))
{
RayFace *face = (RayFace*) RE_rayobject_align(r);
- DO_MINMAX( face->v1, min, max );
- DO_MINMAX( face->v2, min, max );
- DO_MINMAX( face->v3, min, max );
- if(RE_rayface_isQuad(face)) DO_MINMAX( face->v4, min, max );
+ DO_MINMAX(face->v1, min, max);
+ DO_MINMAX(face->v2, min, max);
+ DO_MINMAX(face->v3, min, max);
+ if(RE_rayface_isQuad(face)) DO_MINMAX(face->v4, min, max);
}
else if(RE_rayobject_isVlakPrimitive(r))
{
VlakPrimitive *face = (VlakPrimitive*) RE_rayobject_align(r);
RayFace nface;
- RE_rayface_from_vlak(&nface, face->ob, face->face);
+ rayface_from_vlak(&nface, face->ob, face->face);
- if(face->ob->transform_primitives)
- {
- mul_m4_v3(face->ob->mat, nface.v1);
- mul_m4_v3(face->ob->mat, nface.v2);
- mul_m4_v3(face->ob->mat, nface.v3);
- if(RE_rayface_isQuad(&nface))
- mul_m4_v3(face->ob->mat, nface.v4);
- }
-
- DO_MINMAX( nface.v1, min, max );
- DO_MINMAX( nface.v2, min, max );
- DO_MINMAX( nface.v3, min, max );
- if(RE_rayface_isQuad(&nface)) DO_MINMAX( nface.v4, min, max );
+ DO_MINMAX(nface.v1, min, max);
+ DO_MINMAX(nface.v2, min, max);
+ DO_MINMAX(nface.v3, min, max);
+ if(RE_rayface_isQuad(&nface)) DO_MINMAX(nface.v4, min, max);
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- r->api->bb( r, min, max );
+ r = RE_rayobject_align(r);
+ r->api->bb(r, min, max);
}
- else assert(0);
+ else
+ assert(0);
}
-float RE_rayobject_cost(RayObject *r)
-{
- if(RE_rayobject_isRayFace(r) || RE_rayobject_isVlakPrimitive(r))
- {
- return 1.0;
- }
- else if(RE_rayobject_isRayAPI(r))
- {
- r = RE_rayobject_align( r );
- return r->api->cost( r );
- }
- else assert(0);
-}
+/* Hints */
void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max)
{
@@ -544,60 +520,30 @@ void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max)
}
else if(RE_rayobject_isRayAPI(r))
{
- r = RE_rayobject_align( r );
- return r->api->hint_bb( r, hint, min, max );
+ r = RE_rayobject_align(r);
+ return r->api->hint_bb(r, hint, min, max);
}
- else assert(0);
+ else
+ assert(0);
}
+/* RayObjectControl */
+
int RE_rayobjectcontrol_test_break(RayObjectControl *control)
{
if(control->test_break)
- return control->test_break( control->data );
+ return control->test_break(control->data);
return 0;
}
-
-/*
- * Empty raytree
- */
-static int RE_rayobject_empty_intersect(RayObject *o, Isect *is)
+void RE_rayobject_set_control(RayObject *r, void *data, RE_rayobjectcontrol_test_break_callback test_break)
{
- return 0;
-}
-
-static void RE_rayobject_empty_free(RayObject *o)
-{
-}
-
-static void RE_rayobject_empty_bb(RayObject *o, float *min, float *max)
-{
- return;
-}
-
-static float RE_rayobject_empty_cost(RayObject *o)
-{
- return 0.0;
+ if(RE_rayobject_isRayAPI(r))
+ {
+ r = RE_rayobject_align(r);
+ r->control.data = data;
+ r->control.test_break = test_break;
+ }
}
-static void RE_rayobject_empty_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
-{}
-
-static RayObjectAPI empty_api =
-{
- RE_rayobject_empty_intersect,
- NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
- NULL, //static void RE_rayobject_instance_done(RayObject *o);
- RE_rayobject_empty_free,
- RE_rayobject_empty_bb,
- RE_rayobject_empty_cost,
- RE_rayobject_empty_hint_bb
-};
-
-static RayObject empty_raytree = { &empty_api, {0, 0} };
-
-RayObject *RE_rayobject_empty_create()
-{
- return RE_rayobject_unalignRayAPI( &empty_raytree );
-}
diff --git a/source/blender/render/intern/raytrace/rayobject_blibvh.cpp b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
new file mode 100644
index 00000000000..396ca7fc0ef
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
@@ -0,0 +1,168 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): André Pinto.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#include <assert.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_kdopbvh.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
+#include "rayobject.h"
+
+static int RE_rayobject_blibvh_intersect(RayObject *o, Isect *isec);
+static void RE_rayobject_blibvh_add(RayObject *o, RayObject *ob);
+static void RE_rayobject_blibvh_done(RayObject *o);
+static void RE_rayobject_blibvh_free(RayObject *o);
+static void RE_rayobject_blibvh_bb(RayObject *o, float *min, float *max);
+
+static float RE_rayobject_blibvh_cost(RayObject *o)
+{
+ //TODO calculate the expected cost to raycast on this structure
+ return 1.0;
+}
+
+static void RE_rayobject_blibvh_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
+{
+ return;
+}
+
+static RayObjectAPI bvh_api =
+{
+ RE_rayobject_blibvh_intersect,
+ RE_rayobject_blibvh_add,
+ RE_rayobject_blibvh_done,
+ RE_rayobject_blibvh_free,
+ RE_rayobject_blibvh_bb,
+ RE_rayobject_blibvh_cost,
+ RE_rayobject_blibvh_hint_bb
+};
+
+typedef struct BVHObject
+{
+ RayObject rayobj;
+ RayObject **leafs, **next_leaf;
+ BVHTree *bvh;
+ float bb[2][3];
+} BVHObject;
+
+RayObject *RE_rayobject_blibvh_create(int size)
+{
+ BVHObject *obj= (BVHObject*)MEM_callocN(sizeof(BVHObject), "BVHObject");
+ assert(RE_rayobject_isAligned(obj)); /* RayObject API assumes real data to be 4-byte aligned */
+
+ obj->rayobj.api = &bvh_api;
+ obj->bvh = BLI_bvhtree_new(size, 0.0, 4, 6);
+ obj->next_leaf = obj->leafs = (RayObject**)MEM_callocN(size*sizeof(RayObject*), "BVHObject leafs");
+
+ INIT_MINMAX(obj->bb[0], obj->bb[1]);
+ return RE_rayobject_unalignRayAPI((RayObject*) obj);
+}
+
+struct BVHCallbackUserData
+{
+ Isect *isec;
+ RayObject **leafs;
+};
+
+static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+{
+ struct BVHCallbackUserData *data = (struct BVHCallbackUserData*)userdata;
+ Isect *isec = data->isec;
+ RayObject *face = data->leafs[index];
+
+ if(RE_rayobject_intersect(face,isec))
+ {
+ hit->index = index;
+
+ if(isec->mode == RE_RAY_SHADOW)
+ hit->dist = 0;
+ else
+ hit->dist = isec->dist;
+ }
+}
+
+static int RE_rayobject_blibvh_intersect(RayObject *o, Isect *isec)
+{
+ BVHObject *obj = (BVHObject*)o;
+ BVHTreeRayHit hit;
+ float dir[3];
+ struct BVHCallbackUserData data;
+ data.isec = isec;
+ data.leafs = obj->leafs;
+
+ copy_v3_v3(dir, isec->dir);
+
+ hit.index = 0;
+ hit.dist = isec->dist;
+
+ return BLI_bvhtree_ray_cast(obj->bvh, isec->start, dir, 0.0, &hit, bvh_callback, (void*)&data);
+}
+
+static void RE_rayobject_blibvh_add(RayObject *o, RayObject *ob)
+{
+ BVHObject *obj = (BVHObject*)o;
+ float min_max[6];
+ INIT_MINMAX(min_max, min_max+3);
+ RE_rayobject_merge_bb(ob, min_max, min_max+3);
+
+ DO_MIN(min_max , obj->bb[0]);
+ DO_MAX(min_max+3, obj->bb[1]);
+
+ BLI_bvhtree_insert(obj->bvh, obj->next_leaf - obj->leafs, min_max, 2);
+ *(obj->next_leaf++) = ob;
+}
+
+static void RE_rayobject_blibvh_done(RayObject *o)
+{
+ BVHObject *obj = (BVHObject*)o;
+ BLI_bvhtree_balance(obj->bvh);
+}
+
+static void RE_rayobject_blibvh_free(RayObject *o)
+{
+ BVHObject *obj = (BVHObject*)o;
+
+ if(obj->bvh)
+ BLI_bvhtree_free(obj->bvh);
+
+ if(obj->leafs)
+ MEM_freeN(obj->leafs);
+
+ MEM_freeN(obj);
+}
+
+static void RE_rayobject_blibvh_bb(RayObject *o, float *min, float *max)
+{
+ BVHObject *obj = (BVHObject*)o;
+ DO_MIN(obj->bb[0], min);
+ DO_MAX(obj->bb[1], max);
+}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_empty.cpp b/source/blender/render/intern/raytrace/rayobject_empty.cpp
new file mode 100644
index 00000000000..fd6e02fecc1
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_empty.cpp
@@ -0,0 +1,75 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "rayobject.h"
+
+/*
+ * Empty raytree
+ */
+
+static int RE_rayobject_empty_intersect(RayObject *o, Isect *is)
+{
+ return 0;
+}
+
+static void RE_rayobject_empty_free(RayObject *o)
+{
+}
+
+static void RE_rayobject_empty_bb(RayObject *o, float *min, float *max)
+{
+ return;
+}
+
+static float RE_rayobject_empty_cost(RayObject *o)
+{
+ return 0.0;
+}
+
+static void RE_rayobject_empty_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
+{}
+
+static RayObjectAPI empty_api =
+{
+ RE_rayobject_empty_intersect,
+ NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
+ NULL, //static void RE_rayobject_instance_done(RayObject *o);
+ RE_rayobject_empty_free,
+ RE_rayobject_empty_bb,
+ RE_rayobject_empty_cost,
+ RE_rayobject_empty_hint_bb
+};
+
+static RayObject empty_raytree = { &empty_api, {0, 0} };
+
+RayObject *RE_rayobject_empty_create()
+{
+ return RE_rayobject_unalignRayAPI( &empty_raytree );
+}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_hint.h b/source/blender/render/intern/raytrace/rayobject_hint.h
index 1ea59d00bac..6f49b276681 100644
--- a/source/blender/render/intern/raytrace/rayobject_hint.h
+++ b/source/blender/render/intern/raytrace/rayobject_hint.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifndef RE_RAYTRACE_RAYOBJECT_HINT_H
#define RE_RAYTRACE_RAYOBJECT_HINT_H
@@ -68,3 +69,4 @@ inline int hint_test_bb(HintFrustum &obj, float *Nmin, float *Nmax)
*/
#endif
+
diff --git a/source/blender/render/intern/raytrace/rayobject_instance.cpp b/source/blender/render/intern/raytrace/rayobject_instance.cpp
new file mode 100644
index 00000000000..0dd8dc97944
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_instance.cpp
@@ -0,0 +1,208 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): André Pinto.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <assert.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
+#include "rayobject.h"
+
+#define RE_COST_INSTANCE (1.0f)
+
+static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec);
+static void RE_rayobject_instance_free(RayObject *o);
+static void RE_rayobject_instance_bb(RayObject *o, float *min, float *max);
+static float RE_rayobject_instance_cost(RayObject *o);
+
+static void RE_rayobject_instance_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
+{}
+
+static RayObjectAPI instance_api =
+{
+ RE_rayobject_instance_intersect,
+ NULL, //static void RE_rayobject_instance_add(RayObject *o, RayObject *ob);
+ NULL, //static void RE_rayobject_instance_done(RayObject *o);
+ RE_rayobject_instance_free,
+ RE_rayobject_instance_bb,
+ RE_rayobject_instance_cost,
+ RE_rayobject_instance_hint_bb
+};
+
+typedef struct InstanceRayObject
+{
+ RayObject rayobj;
+ RayObject *target;
+
+ void *ob; //Object represented by this instance
+ void *target_ob; //Object represented by the inner RayObject, needed to handle self-intersection
+
+ float global2target[4][4];
+ float target2global[4][4];
+
+} InstanceRayObject;
+
+
+RayObject *RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob)
+{
+ InstanceRayObject *obj= (InstanceRayObject*)MEM_callocN(sizeof(InstanceRayObject), "InstanceRayObject");
+ assert( RE_rayobject_isAligned(obj) ); /* RayObject API assumes real data to be 4-byte aligned */
+
+ obj->rayobj.api = &instance_api;
+ obj->target = target;
+ obj->ob = ob;
+ obj->target_ob = target_ob;
+
+ copy_m4_m4(obj->target2global, transform);
+ invert_m4_m4(obj->global2target, obj->target2global);
+
+ return RE_rayobject_unalignRayAPI((RayObject*) obj);
+}
+
+static int RE_rayobject_instance_intersect(RayObject *o, Isect *isec)
+{
+ InstanceRayObject *obj = (InstanceRayObject*)o;
+ float start[3], dir[3], idot_axis[3], dist;
+ int changed = 0, i, res;
+
+ // TODO - this is disabling self intersection on instances
+ if(isec->orig.ob == obj->ob && obj->ob)
+ {
+ changed = 1;
+ isec->orig.ob = obj->target_ob;
+ }
+
+ // backup old values
+ copy_v3_v3(start, isec->start);
+ copy_v3_v3(dir, isec->dir);
+ copy_v3_v3(idot_axis, isec->idot_axis);
+ dist = isec->dist;
+
+ // transform to target coordinates system
+ mul_m4_v3(obj->global2target, isec->start);
+ mul_mat3_m4_v3(obj->global2target, isec->dir);
+ isec->dist *= normalize_v3(isec->dir);
+
+ // update idot_axis and bv_index
+ for(i=0; i<3; i++)
+ {
+ isec->idot_axis[i] = 1.0f / isec->dir[i];
+
+ isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
+ isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
+
+ isec->bv_index[2*i] = i+3*isec->bv_index[2*i];
+ isec->bv_index[2*i+1] = i+3*isec->bv_index[2*i+1];
+ }
+
+ // raycast
+ res = RE_rayobject_intersect(obj->target, isec);
+
+ // map dist into original coordinate space
+ if(res == 0)
+ {
+ isec->dist = dist;
+ }
+ else
+ {
+ // note we don't just multiply dist, because of possible
+ // non-uniform scaling in the transform matrix
+ float vec[3];
+
+ mul_v3_v3fl(vec, isec->dir, isec->dist);
+ mul_mat3_m4_v3(obj->target2global, vec);
+
+ isec->dist = len_v3(vec);
+ isec->hit.ob = obj->ob;
+
+#ifdef RT_USE_LAST_HIT
+ // TODO support for last hit optimization in instances that can jump
+ // directly to the last hit face.
+ // For now it jumps directly to the last-hit instance root node.
+ isec->last_hit = RE_rayobject_unalignRayAPI((RayObject*) obj);
+#endif
+ }
+
+ // restore values
+ copy_v3_v3(isec->start, start);
+ copy_v3_v3(isec->dir, dir);
+ copy_v3_v3(isec->idot_axis, idot_axis);
+
+ if(changed)
+ isec->orig.ob = obj->ob;
+
+ // restore bv_index
+ for(i=0; i<3; i++)
+ {
+ isec->bv_index[2*i] = isec->idot_axis[i] < 0.0 ? 1 : 0;
+ isec->bv_index[2*i+1] = 1 - isec->bv_index[2*i];
+
+ isec->bv_index[2*i] = i+3*isec->bv_index[2*i];
+ isec->bv_index[2*i+1] = i+3*isec->bv_index[2*i+1];
+ }
+
+ return res;
+}
+
+static void RE_rayobject_instance_free(RayObject *o)
+{
+ InstanceRayObject *obj = (InstanceRayObject*)o;
+ MEM_freeN(obj);
+}
+
+static float RE_rayobject_instance_cost(RayObject *o)
+{
+ InstanceRayObject *obj = (InstanceRayObject*)o;
+ return RE_rayobject_cost(obj->target) + RE_COST_INSTANCE;
+}
+
+static void RE_rayobject_instance_bb(RayObject *o, float *min, float *max)
+{
+ //TODO:
+ // *better bb.. calculated without rotations of bb
+ // *maybe cache that better-fitted-BB at the InstanceRayObject
+ InstanceRayObject *obj = (InstanceRayObject*)o;
+
+ float m[3], M[3], t[3];
+ int i, j;
+ INIT_MINMAX(m, M);
+ RE_rayobject_merge_bb(obj->target, m, M);
+
+ //There must be a faster way than rotating all the 8 vertexs of the BB
+ for(i=0; i<8; i++)
+ {
+ for(j=0; j<3; j++) t[j] = i&(1<<j) ? M[j] : m[j];
+ mul_m4_v3(obj->target2global, t);
+ DO_MINMAX(t, min, max);
+ }
+}
+
diff --git a/source/blender/render/intern/raytrace/rayobject_internal.h b/source/blender/render/intern/raytrace/rayobject_internal.h
new file mode 100644
index 00000000000..6067be07c50
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_internal.h
@@ -0,0 +1,128 @@
+
+#ifndef RE_RAYOBJECT_INTERNAL_H
+#define RE_RAYOBJECT_INTERNAL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RayObjectControl
+ *
+ * This class is intended as a place holder for control, configuration of the
+ * rayobject like:
+ * - stop building (TODO maybe when porting build to threads this could be
+ * implemented with some thread_cancel function)
+ * - max number of threads and threads callback to use during build
+ * ...
+ */
+
+typedef int (*RE_rayobjectcontrol_test_break_callback)(void *data);
+
+typedef struct RayObjectControl {
+ void *data;
+ RE_rayobjectcontrol_test_break_callback test_break;
+} RayObjectControl;
+
+/* Returns true if for some reason a heavy processing function should stop
+ * (eg.: user asked to stop during a tree a build)
+ */
+
+int RE_rayobjectcontrol_test_break(RayObjectControl *c);
+
+/* RayObject
+
+ A ray object is everything where we can cast rays like:
+ * a face/triangle
+ * an octree
+ * a bvh tree
+ * an octree of bvh's
+ * a bvh of bvh's
+
+
+ All types of RayObjects can be created by implementing the
+ callbacks of the RayObject.
+
+ Due to high computing time evolved with casting on faces
+ there is a special type of RayObject (named RayFace)
+ which won't use callbacks like other generic nodes.
+
+ In order to allow a mixture of RayFace+RayObjects,
+ all RayObjects must be 4byte aligned, allowing us to use the
+ 2 least significant bits (with the mask 0x03) to define the
+ type of RayObject.
+
+ This leads to 4 possible types of RayObject:
+
+ addr&3 - type of object
+ 0 Self (reserved for each structure)
+ 1 RayFace (tri/quad primitive)
+ 2 RayObject (generic with API callbacks)
+ 3 VlakPrimitive
+ (vlak primitive - to be used when we have a vlak describing the data
+ eg.: on render code)
+
+ 0 means it's reserved and has it own meaning inside each ray acceleration structure
+ (this way each structure can use the allign offset to determine if a node represents a
+ RayObject primitive, which can be used to save memory)
+ */
+
+/* used to test the type of ray object */
+#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0)
+#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1)
+#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2)
+#define RE_rayobject_isVlakPrimitive(o) ((((intptr_t)o)&3) == 3)
+
+/* used to align a given ray object */
+#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3)))
+
+/* used to unalign a given ray object */
+#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1))
+#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2))
+#define RE_rayobject_unalignVlakPrimitive(o) ((RayObject*)(((intptr_t)o)|3))
+
+/*
+ * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
+ * It's suitable to implement things like LOD.
+ */
+
+struct RayObject {
+ struct RayObjectAPI *api;
+ struct RayObjectControl control;
+};
+
+typedef int (*RE_rayobject_raycast_callback)(RayObject *, struct Isect *);
+typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
+typedef void (*RE_rayobject_done_callback)(RayObject *);
+typedef void (*RE_rayobject_free_callback)(RayObject *);
+typedef void (*RE_rayobject_merge_bb_callback)(RayObject *, float *min, float *max);
+typedef float (*RE_rayobject_cost_callback)(RayObject *);
+typedef void (*RE_rayobject_hint_bb_callback)(RayObject *, struct RayHint *, float *, float *);
+
+typedef struct RayObjectAPI {
+ RE_rayobject_raycast_callback raycast;
+ RE_rayobject_add_callback add;
+ RE_rayobject_done_callback done;
+ RE_rayobject_free_callback free;
+ RE_rayobject_merge_bb_callback bb;
+ RE_rayobject_cost_callback cost;
+ RE_rayobject_hint_bb_callback hint_bb;
+} RayObjectAPI;
+
+/*
+ * Returns the expected cost of raycast on this node, primitives have a cost of 1
+ */
+float RE_rayobject_cost(RayObject *r);
+
+/*
+ * This function differs from RE_rayobject_raycast
+ * RE_rayobject_intersect does NOT perform last-hit optimization
+ * So this is probably a function to call inside raytrace structures
+ */
+int RE_rayobject_intersect(RayObject *r, struct Isect *i);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp
new file mode 100644
index 00000000000..190fcd3a95a
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp
@@ -0,0 +1,1080 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* IMPORTANT NOTE: this code must be independent of any other render code
+ to use it outside the renderer! */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <float.h>
+#include <assert.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_material_types.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
+#include "rayobject.h"
+
+/* ********** structs *************** */
+#define BRANCH_ARRAY 1024
+#define NODE_ARRAY 4096
+
+typedef struct Branch
+{
+ struct Branch *b[8];
+} Branch;
+
+typedef struct OcVal
+{
+ short ocx, ocy, ocz;
+} OcVal;
+
+typedef struct Node
+{
+ struct RayFace *v[8];
+ struct OcVal ov[8];
+ struct Node *next;
+} Node;
+
+typedef struct Octree {
+ RayObject rayobj;
+
+ struct Branch **adrbranch;
+ struct Node **adrnode;
+ float ocsize; /* ocsize: mult factor, max size octree */
+ float ocfacx,ocfacy,ocfacz;
+ float min[3], max[3];
+ int ocres;
+ int branchcount, nodecount;
+
+ /* during building only */
+ char *ocface;
+
+ RayFace **ro_nodes;
+ int ro_nodes_size, ro_nodes_used;
+
+} Octree;
+
+static int RE_rayobject_octree_intersect(RayObject *o, Isect *isec);
+static void RE_rayobject_octree_add(RayObject *o, RayObject *ob);
+static void RE_rayobject_octree_done(RayObject *o);
+static void RE_rayobject_octree_free(RayObject *o);
+static void RE_rayobject_octree_bb(RayObject *o, float *min, float *max);
+
+/*
+ * This function is not expected to be called by current code state.
+ */
+static float RE_rayobject_octree_cost(RayObject *o)
+{
+ return 1.0;
+}
+
+static void RE_rayobject_octree_hint_bb(RayObject *o, RayHint *hint, float *min, float *max)
+{
+ return;
+}
+
+static RayObjectAPI octree_api =
+{
+ RE_rayobject_octree_intersect,
+ RE_rayobject_octree_add,
+ RE_rayobject_octree_done,
+ RE_rayobject_octree_free,
+ RE_rayobject_octree_bb,
+ RE_rayobject_octree_cost,
+ RE_rayobject_octree_hint_bb
+};
+
+/* **************** ocval method ******************* */
+/* within one octree node, a set of 3x15 bits defines a 'boundbox' to OR with */
+
+#define OCVALRES 15
+#define BROW16(min, max) (((max)>=OCVALRES? 0xFFFF: (1<<(max+1))-1) - ((min>0)? ((1<<(min))-1):0) )
+
+static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x, short y, short z, OcVal *ov)
+{
+ float min[3], max[3];
+ int ocmin, ocmax;
+
+ copy_v3_v3(min, v1);
+ copy_v3_v3(max, v1);
+ DO_MINMAX(v2, min, max);
+ DO_MINMAX(v3, min, max);
+ if(v4) {
+ DO_MINMAX(v4, min, max);
+ }
+
+ ocmin= OCVALRES*(min[0]-x);
+ ocmax= OCVALRES*(max[0]-x);
+ ov->ocx= BROW16(ocmin, ocmax);
+
+ ocmin= OCVALRES*(min[1]-y);
+ ocmax= OCVALRES*(max[1]-y);
+ ov->ocy= BROW16(ocmin, ocmax);
+
+ ocmin= OCVALRES*(min[2]-z);
+ ocmax= OCVALRES*(max[2]-z);
+ ov->ocz= BROW16(ocmin, ocmax);
+
+}
+
+static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
+{
+ int ocmin, ocmax;
+
+ if(vec1[0]<vec2[0]) {
+ ocmin= OCVALRES*(vec1[0] - xo);
+ ocmax= OCVALRES*(vec2[0] - xo);
+ } else {
+ ocmin= OCVALRES*(vec2[0] - xo);
+ ocmax= OCVALRES*(vec1[0] - xo);
+ }
+ ov->ocx= BROW16(ocmin, ocmax);
+
+ if(vec1[1]<vec2[1]) {
+ ocmin= OCVALRES*(vec1[1] - yo);
+ ocmax= OCVALRES*(vec2[1] - yo);
+ } else {
+ ocmin= OCVALRES*(vec2[1] - yo);
+ ocmax= OCVALRES*(vec1[1] - yo);
+ }
+ ov->ocy= BROW16(ocmin, ocmax);
+
+ if(vec1[2]<vec2[2]) {
+ ocmin= OCVALRES*(vec1[2] - zo);
+ ocmax= OCVALRES*(vec2[2] - zo);
+ } else {
+ ocmin= OCVALRES*(vec2[2] - zo);
+ ocmax= OCVALRES*(vec1[2] - zo);
+ }
+ ov->ocz= BROW16(ocmin, ocmax);
+}
+
+/* ************* octree ************** */
+
+static Branch *addbranch(Octree *oc, Branch *br, short ocb)
+{
+ int index;
+
+ if(br->b[ocb]) return br->b[ocb];
+
+ oc->branchcount++;
+ index= oc->branchcount>>12;
+
+ if(oc->adrbranch[index]==NULL)
+ oc->adrbranch[index]= (Branch*)MEM_callocN(4096*sizeof(Branch), "new oc branch");
+
+ if(oc->branchcount>= BRANCH_ARRAY*4096) {
+ printf("error; octree branches full\n");
+ oc->branchcount=0;
+ }
+
+ return br->b[ocb]= oc->adrbranch[index]+(oc->branchcount & 4095);
+}
+
+static Node *addnode(Octree *oc)
+{
+ int index;
+
+ oc->nodecount++;
+ index= oc->nodecount>>12;
+
+ if(oc->adrnode[index]==NULL)
+ oc->adrnode[index]= (Node*)MEM_callocN(4096*sizeof(Node),"addnode");
+
+ if(oc->nodecount> NODE_ARRAY*NODE_ARRAY) {
+ printf("error; octree nodes full\n");
+ oc->nodecount=0;
+ }
+
+ return oc->adrnode[index]+(oc->nodecount & 4095);
+}
+
+static int face_in_node(RayFace *face, short x, short y, short z, float rtf[][3])
+{
+ static float nor[3], d;
+ float fx, fy, fz;
+
+ // init static vars
+ if(face) {
+ normal_tri_v3( nor,rtf[0], rtf[1], rtf[2]);
+ d= -nor[0]*rtf[0][0] - nor[1]*rtf[0][1] - nor[2]*rtf[0][2];
+ return 0;
+ }
+
+ fx= x;
+ fy= y;
+ fz= z;
+
+ if((fx)*nor[0] + (fy)*nor[1] + (fz)*nor[2] + d > 0.0f) {
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+
+ if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ }
+ else {
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+
+ if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ }
+
+ return 0;
+}
+
+static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short z, float rtf[][3])
+{
+ Branch *br;
+ Node *no;
+ short a, oc0, oc1, oc2, oc3, oc4, oc5;
+
+ x<<=2;
+ y<<=1;
+
+ br= oc->adrbranch[0];
+
+ if(oc->ocres==512) {
+ oc0= ((x & 1024)+(y & 512)+(z & 256))>>8;
+ br= addbranch(oc, br, oc0);
+ }
+ if(oc->ocres>=256) {
+ oc0= ((x & 512)+(y & 256)+(z & 128))>>7;
+ br= addbranch(oc, br, oc0);
+ }
+ if(oc->ocres>=128) {
+ oc0= ((x & 256)+(y & 128)+(z & 64))>>6;
+ br= addbranch(oc, br, oc0);
+ }
+
+ oc0= ((x & 128)+(y & 64)+(z & 32))>>5;
+ oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
+ oc2= ((x & 32)+(y & 16)+(z & 8))>>3;
+ oc3= ((x & 16)+(y & 8)+(z & 4))>>2;
+ oc4= ((x & 8)+(y & 4)+(z & 2))>>1;
+ oc5= ((x & 4)+(y & 2)+(z & 1));
+
+ br= addbranch(oc, br,oc0);
+ br= addbranch(oc, br,oc1);
+ br= addbranch(oc, br,oc2);
+ br= addbranch(oc, br,oc3);
+ br= addbranch(oc, br,oc4);
+ no= (Node *)br->b[oc5];
+ if(no==NULL) br->b[oc5]= (Branch *)(no= addnode(oc));
+
+ while(no->next) no= no->next;
+
+ a= 0;
+ if(no->v[7]) { /* node full */
+ no->next= addnode(oc);
+ no= no->next;
+ }
+ else {
+ while(no->v[a]!=NULL) a++;
+ }
+
+ no->v[a]= (RayFace*) RE_rayobject_align(face);
+
+ if(quad)
+ calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x>>2, y>>1, z, &no->ov[a]);
+ else
+ calc_ocval_face(rtf[0], rtf[1], rtf[2], NULL, x>>2, y>>1, z, &no->ov[a]);
+}
+
+static void d2dda(Octree *oc, short b1, short b2, short c1, short c2, char *ocface, short rts[][3], float rtf[][3])
+{
+ int ocx1,ocx2,ocy1,ocy2;
+ int x,y,dx=0,dy=0;
+ float ox1,ox2,oy1,oy2;
+ float labda,labdao,labdax,labday,ldx,ldy;
+
+ ocx1= rts[b1][c1];
+ ocy1= rts[b1][c2];
+ ocx2= rts[b2][c1];
+ ocy2= rts[b2][c2];
+
+ if(ocx1==ocx2 && ocy1==ocy2) {
+ ocface[oc->ocres*ocx1+ocy1]= 1;
+ return;
+ }
+
+ ox1= rtf[b1][c1];
+ oy1= rtf[b1][c2];
+ ox2= rtf[b2][c1];
+ oy2= rtf[b2][c2];
+
+ if(ox1!=ox2) {
+ if(ox2-ox1>0.0f) {
+ labdax= (ox1-ocx1-1.0f)/(ox1-ox2);
+ ldx= -1.0f/(ox1-ox2);
+ dx= 1;
+ } else {
+ labdax= (ox1-ocx1)/(ox1-ox2);
+ ldx= 1.0f/(ox1-ox2);
+ dx= -1;
+ }
+ } else {
+ labdax=1.0f;
+ ldx=0;
+ }
+
+ if(oy1!=oy2) {
+ if(oy2-oy1>0.0f) {
+ labday= (oy1-ocy1-1.0f)/(oy1-oy2);
+ ldy= -1.0f/(oy1-oy2);
+ dy= 1;
+ } else {
+ labday= (oy1-ocy1)/(oy1-oy2);
+ ldy= 1.0f/(oy1-oy2);
+ dy= -1;
+ }
+ } else {
+ labday=1.0f;
+ ldy=0;
+ }
+
+ x=ocx1; y=ocy1;
+ labda= MIN2(labdax, labday);
+
+ while(TRUE) {
+
+ if(x<0 || y<0 || x>=oc->ocres || y>=oc->ocres);
+ else ocface[oc->ocres*x+y]= 1;
+
+ labdao=labda;
+ if(labdax==labday) {
+ labdax+=ldx;
+ x+=dx;
+ labday+=ldy;
+ y+=dy;
+ } else {
+ if(labdax<labday) {
+ labdax+=ldx;
+ x+=dx;
+ } else {
+ labday+=ldy;
+ y+=dy;
+ }
+ }
+ labda=MIN2(labdax,labday);
+ if(labda==labdao) break;
+ if(labda>=1.0f) break;
+ }
+ ocface[oc->ocres*ocx2+ocy2]=1;
+}
+
+static void filltriangle(Octree *oc, short c1, short c2, char *ocface, short *ocmin, short *ocmax)
+{
+ int a, x, y, y1, y2;
+
+ for(x=ocmin[c1];x<=ocmax[c1];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[c2];y<=ocmax[c2];y++) {
+ if(ocface[a+y]) {
+ y++;
+ while(ocface[a+y] && y!=ocmax[c2]) y++;
+ for(y1=ocmax[c2];y1>y;y1--) {
+ if(ocface[a+y1]) {
+ for(y2=y;y2<=y1;y2++) ocface[a+y2]=1;
+ y1=0;
+ }
+ }
+ y=ocmax[c2];
+ }
+ }
+ }
+}
+
+static void RE_rayobject_octree_free(RayObject *tree)
+{
+ Octree *oc= (Octree*)tree;
+
+#if 0
+ printf("branches %d nodes %d\n", oc->branchcount, oc->nodecount);
+ printf("raycount %d \n", raycount);
+ printf("ray coherent %d \n", coherent_ray);
+ printf("accepted %d rejected %d\n", accepted, rejected);
+#endif
+ if(oc->ocface)
+ MEM_freeN(oc->ocface);
+
+ if(oc->adrbranch) {
+ int a= 0;
+ while(oc->adrbranch[a]) {
+ MEM_freeN(oc->adrbranch[a]);
+ oc->adrbranch[a]= NULL;
+ a++;
+ }
+ MEM_freeN(oc->adrbranch);
+ oc->adrbranch= NULL;
+ }
+ oc->branchcount= 0;
+
+ if(oc->adrnode) {
+ int a= 0;
+ while(oc->adrnode[a]) {
+ MEM_freeN(oc->adrnode[a]);
+ oc->adrnode[a]= NULL;
+ a++;
+ }
+ MEM_freeN(oc->adrnode);
+ oc->adrnode= NULL;
+ }
+ oc->nodecount= 0;
+
+ MEM_freeN(oc);
+}
+
+
+RayObject *RE_rayobject_octree_create(int ocres, int size)
+{
+ Octree *oc= (Octree*)MEM_callocN(sizeof(Octree), "Octree");
+ assert( RE_rayobject_isAligned(oc) ); /* RayObject API assumes real data to be 4-byte aligned */
+
+ oc->rayobj.api = &octree_api;
+
+ oc->ocres = ocres;
+
+ oc->ro_nodes = (RayFace**)MEM_callocN(sizeof(RayFace*)*size, "octree rayobject nodes");
+ oc->ro_nodes_size = size;
+ oc->ro_nodes_used = 0;
+
+
+ return RE_rayobject_unalignRayAPI((RayObject*) oc);
+}
+
+
+static void RE_rayobject_octree_add(RayObject *tree, RayObject *node)
+{
+ Octree *oc = (Octree*)tree;
+
+ assert( RE_rayobject_isRayFace(node) );
+ assert( oc->ro_nodes_used < oc->ro_nodes_size );
+ oc->ro_nodes[ oc->ro_nodes_used++ ] = (RayFace*)RE_rayobject_align(node);
+}
+
+static void octree_fill_rayface(Octree *oc, RayFace *face)
+{
+ float ocfac[3], rtf[4][3];
+ float co1[3], co2[3], co3[3], co4[3];
+ short rts[4][3];
+ short ocmin[3], ocmax[3];
+ char *ocface= oc->ocface; // front, top, size view of face, to fill in
+ int a, b, c, oc1, oc2, oc3, oc4, x, y, z, ocres2;
+
+ ocfac[0]= oc->ocfacx;
+ ocfac[1]= oc->ocfacy;
+ ocfac[2]= oc->ocfacz;
+
+ ocres2= oc->ocres*oc->ocres;
+
+ copy_v3_v3(co1, face->v1);
+ copy_v3_v3(co2, face->v2);
+ copy_v3_v3(co3, face->v3);
+ if(face->v4)
+ copy_v3_v3(co4, face->v4);
+
+ for(c=0;c<3;c++) {
+ rtf[0][c]= (co1[c]-oc->min[c])*ocfac[c] ;
+ rts[0][c]= (short)rtf[0][c];
+ rtf[1][c]= (co2[c]-oc->min[c])*ocfac[c] ;
+ rts[1][c]= (short)rtf[1][c];
+ rtf[2][c]= (co3[c]-oc->min[c])*ocfac[c] ;
+ rts[2][c]= (short)rtf[2][c];
+ if(RE_rayface_isQuad(face)) {
+ rtf[3][c]= (co4[c]-oc->min[c])*ocfac[c] ;
+ rts[3][c]= (short)rtf[3][c];
+ }
+ }
+
+ for(c=0;c<3;c++) {
+ oc1= rts[0][c];
+ oc2= rts[1][c];
+ oc3= rts[2][c];
+ if(!RE_rayface_isQuad(face)) {
+ ocmin[c]= MIN3(oc1,oc2,oc3);
+ ocmax[c]= MAX3(oc1,oc2,oc3);
+ }
+ else {
+ oc4= rts[3][c];
+ ocmin[c]= MIN4(oc1,oc2,oc3,oc4);
+ ocmax[c]= MAX4(oc1,oc2,oc3,oc4);
+ }
+ if(ocmax[c]>oc->ocres-1) ocmax[c]=oc->ocres-1;
+ if(ocmin[c]<0) ocmin[c]=0;
+ }
+
+ if(ocmin[0]==ocmax[0] && ocmin[1]==ocmax[1] && ocmin[2]==ocmax[2]) {
+ ocwrite(oc, face, RE_rayface_isQuad(face), ocmin[0], ocmin[1], ocmin[2], rtf);
+ }
+ else {
+
+ d2dda(oc, 0,1,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 0,1,0,2,ocface,rts,rtf);
+ d2dda(oc, 0,1,1,2,ocface+2*ocres2,rts,rtf);
+ d2dda(oc, 1,2,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 1,2,0,2,ocface,rts,rtf);
+ d2dda(oc, 1,2,1,2,ocface+2*ocres2,rts,rtf);
+ if(!RE_rayface_isQuad(face)) {
+ d2dda(oc, 2,0,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 2,0,0,2,ocface,rts,rtf);
+ d2dda(oc, 2,0,1,2,ocface+2*ocres2,rts,rtf);
+ }
+ else {
+ d2dda(oc, 2,3,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 2,3,0,2,ocface,rts,rtf);
+ d2dda(oc, 2,3,1,2,ocface+2*ocres2,rts,rtf);
+ d2dda(oc, 3,0,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 3,0,0,2,ocface,rts,rtf);
+ d2dda(oc, 3,0,1,2,ocface+2*ocres2,rts,rtf);
+ }
+ /* nothing todo with triangle..., just fills :) */
+ filltriangle(oc, 0,1,ocface+ocres2,ocmin,ocmax);
+ filltriangle(oc, 0,2,ocface,ocmin,ocmax);
+ filltriangle(oc, 1,2,ocface+2*ocres2,ocmin,ocmax);
+
+ /* init static vars here */
+ face_in_node(face, 0,0,0, rtf);
+
+ for(x=ocmin[0];x<=ocmax[0];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[1];y<=ocmax[1];y++) {
+ if(ocface[a+y+ocres2]) {
+ b= oc->ocres*y+2*ocres2;
+ for(z=ocmin[2];z<=ocmax[2];z++) {
+ if(ocface[b+z] && ocface[a+z]) {
+ if(face_in_node(NULL, x, y, z, rtf))
+ ocwrite(oc, face, RE_rayface_isQuad(face), x,y,z, rtf);
+ }
+ }
+ }
+ }
+ }
+
+ /* same loops to clear octree, doubt it can be done smarter */
+ for(x=ocmin[0];x<=ocmax[0];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[1];y<=ocmax[1];y++) {
+ /* x-y */
+ ocface[a+y+ocres2]= 0;
+
+ b= oc->ocres*y + 2*ocres2;
+ for(z=ocmin[2];z<=ocmax[2];z++) {
+ /* y-z */
+ ocface[b+z]= 0;
+ /* x-z */
+ ocface[a+z]= 0;
+ }
+ }
+ }
+ }
+}
+
+static void RE_rayobject_octree_done(RayObject *tree)
+{
+ Octree *oc = (Octree*)tree;
+ int c;
+ float t00, t01, t02;
+ int ocres2 = oc->ocres*oc->ocres;
+
+ INIT_MINMAX(oc->min, oc->max);
+
+ /* Calculate Bounding Box */
+ for(c=0; c<oc->ro_nodes_used; c++)
+ RE_rayobject_merge_bb( RE_rayobject_unalignRayFace(oc->ro_nodes[c]), oc->min, oc->max);
+
+ /* Alloc memory */
+ oc->adrbranch= (Branch**)MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches");
+ oc->adrnode= (Node**)MEM_callocN(sizeof(void *)*NODE_ARRAY, "octree nodes");
+
+ oc->adrbranch[0]=(Branch *)MEM_callocN(4096*sizeof(Branch), "makeoctree");
+
+ /* the lookup table, per face, for which nodes to fill in */
+ oc->ocface= (char*)MEM_callocN( 3*ocres2 + 8, "ocface");
+ memset(oc->ocface, 0, 3*ocres2);
+
+ for(c=0;c<3;c++) { /* octree enlarge, still needed? */
+ oc->min[c]-= 0.01f;
+ oc->max[c]+= 0.01f;
+ }
+
+ t00= oc->max[0]-oc->min[0];
+ t01= oc->max[1]-oc->min[1];
+ t02= oc->max[2]-oc->min[2];
+
+ /* this minus 0.1 is old safety... seems to be needed? */
+ oc->ocfacx= (oc->ocres-0.1)/t00;
+ oc->ocfacy= (oc->ocres-0.1)/t01;
+ oc->ocfacz= (oc->ocres-0.1)/t02;
+
+ oc->ocsize= sqrt(t00*t00+t01*t01+t02*t02); /* global, max size octree */
+
+ for(c=0; c<oc->ro_nodes_used; c++)
+ {
+ octree_fill_rayface(oc, oc->ro_nodes[c]);
+ }
+
+ MEM_freeN(oc->ocface);
+ oc->ocface = NULL;
+ MEM_freeN(oc->ro_nodes);
+ oc->ro_nodes = NULL;
+
+ printf("%f %f - %f\n", oc->min[0], oc->max[0], oc->ocfacx );
+ printf("%f %f - %f\n", oc->min[1], oc->max[1], oc->ocfacy );
+ printf("%f %f - %f\n", oc->min[2], oc->max[2], oc->ocfacz );
+}
+
+static void RE_rayobject_octree_bb(RayObject *tree, float *min, float *max)
+{
+ Octree *oc = (Octree*)tree;
+ DO_MINMAX(oc->min, min, max);
+ DO_MINMAX(oc->max, min, max);
+}
+
+/* check all faces in this node */
+static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
+{
+ short nr=0;
+
+ /* return on any first hit */
+ if(is->mode==RE_RAY_SHADOW) {
+
+ for(; no; no = no->next)
+ for(nr=0; nr<8; nr++)
+ {
+ RayFace *face = no->v[nr];
+ OcVal *ov = no->ov+nr;
+
+ if(!face) break;
+
+ if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) )
+ {
+ if( RE_rayobject_intersect( RE_rayobject_unalignRayFace(face),is) )
+ return 1;
+ }
+ }
+ }
+ else
+ { /* else mirror or glass or shadowtra, return closest face */
+ int found= 0;
+
+ for(; no; no = no->next)
+ for(nr=0; nr<8; nr++)
+ {
+ RayFace *face = no->v[nr];
+ OcVal *ov = no->ov+nr;
+
+ if(!face) break;
+
+ if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) )
+ {
+ if( RE_rayobject_intersect( RE_rayobject_unalignRayFace(face),is) )
+ found= 1;
+ }
+ }
+
+ return found;
+ }
+
+ return 0;
+}
+
+/* find the Node for the octree coord x y z */
+static Node *ocread(Octree *oc, int x, int y, int z)
+{
+ Branch *br;
+ int oc1;
+
+ x<<=2;
+ y<<=1;
+
+ br= oc->adrbranch[0];
+
+ if(oc->ocres==512) {
+ oc1= ((x & 1024)+(y & 512)+(z & 256))>>8;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+ if(oc->ocres>=256) {
+ oc1= ((x & 512)+(y & 256)+(z & 128))>>7;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+ if(oc->ocres>=128) {
+ oc1= ((x & 256)+(y & 128)+(z & 64))>>6;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+
+ oc1= ((x & 128)+(y & 64)+(z & 32))>>5;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 32)+(y & 16)+(z & 8))>>3;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 16)+(y & 8)+(z & 4))>>2;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 8)+(y & 4)+(z & 2))>>1;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 4)+(y & 2)+(z & 1));
+ return (Node *)br->b[oc1];
+ }
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int cliptest(float p, float q, float *u1, float *u2)
+{
+ float r;
+
+ if(p<0.0f) {
+ if(q<p) return 0;
+ else if(q<0.0f) {
+ r= q/p;
+ if(r>*u2) return 0;
+ else if(r>*u1) *u1=r;
+ }
+ }
+ else {
+ if(p>0.0f) {
+ if(q<0.0f) return 0;
+ else if(q<p) {
+ r= q/p;
+ if(r<*u1) return 0;
+ else if(r<*u2) *u2=r;
+ }
+ }
+ else if(q<0.0f) return 0;
+ }
+ return 1;
+}
+
+/* extensive coherence checks/storage cancels out the benefit of it, and gives errors... we
+ need better methods, sample code commented out below (ton) */
+
+/*
+
+in top: static int coh_nodes[16*16*16][6];
+in makeoctree: memset(coh_nodes, 0, sizeof(coh_nodes));
+
+static void add_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
+{
+ short *sp;
+
+ sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
+ sp[0]= ocx1; sp[1]= ocy1; sp[2]= ocz1;
+ sp[3]= ocx2; sp[4]= ocy2; sp[5]= ocz2;
+
+}
+
+static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
+{
+ short *sp;
+
+ sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
+ if(sp[0]==ocx1 && sp[1]==ocy1 && sp[2]==ocz1 &&
+ sp[3]==ocx2 && sp[4]==ocy2 && sp[5]==ocz2) return 1;
+ return 0;
+}
+
+*/
+
+/* return 1: found valid intersection */
+/* starts with is->orig.face */
+static int RE_rayobject_octree_intersect(RayObject *tree, Isect *is)
+{
+ Octree *oc= (Octree*)tree;
+ Node *no;
+ OcVal ocval;
+ float vec1[3], vec2[3], start[3], end[3];
+ float u1,u2,ox1,ox2,oy1,oy2,oz1,oz2;
+ float labdao,labdax,ldx,labday,ldy,labdaz,ldz, ddalabda;
+ float olabda = 0;
+ int dx,dy,dz;
+ int xo,yo,zo,c1=0;
+ int ocx1,ocx2,ocy1, ocy2,ocz1,ocz2;
+
+ /* clip with octree */
+ if(oc->branchcount==0) return 0;
+
+ /* do this before intersect calls */
+#if 0
+ is->facecontr= NULL; /* to check shared edge */
+ is->obcontr= 0;
+ is->faceisect= is->isect= 0; /* shared edge, quad half flag */
+ is->userdata= oc->userdata;
+#endif
+
+ copy_v3_v3( start, is->start );
+ madd_v3_v3v3fl( end, is->start, is->dir, is->dist );
+ ldx= is->dir[0]*is->dist;
+ olabda = is->dist;
+ u1= 0.0f;
+ u2= 1.0f;
+
+ /* clip with octree cube */
+ if(cliptest(-ldx, start[0]-oc->min[0], &u1,&u2)) {
+ if(cliptest(ldx, oc->max[0]-start[0], &u1,&u2)) {
+ ldy= is->dir[1]*is->dist;
+ if(cliptest(-ldy, start[1]-oc->min[1], &u1,&u2)) {
+ if(cliptest(ldy, oc->max[1]-start[1], &u1,&u2)) {
+ ldz = is->dir[2]*is->dist;
+ if(cliptest(-ldz, start[2]-oc->min[2], &u1,&u2)) {
+ if(cliptest(ldz, oc->max[2]-start[2], &u1,&u2)) {
+ c1=1;
+ if(u2<1.0f) {
+ end[0] = start[0]+u2*ldx;
+ end[1] = start[1]+u2*ldy;
+ end[2] = start[2]+u2*ldz;
+ }
+
+ if(u1>0.0f) {
+ start[0] += u1*ldx;
+ start[1] += u1*ldy;
+ start[2] += u1*ldz;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(c1==0) return 0;
+
+ /* reset static variables in ocread */
+ //ocread(oc, oc->ocres, 0, 0);
+
+ /* setup 3dda to traverse octree */
+ ox1= (start[0]-oc->min[0])*oc->ocfacx;
+ oy1= (start[1]-oc->min[1])*oc->ocfacy;
+ oz1= (start[2]-oc->min[2])*oc->ocfacz;
+ ox2= (end[0]-oc->min[0])*oc->ocfacx;
+ oy2= (end[1]-oc->min[1])*oc->ocfacy;
+ oz2= (end[2]-oc->min[2])*oc->ocfacz;
+
+ ocx1= (int)ox1;
+ ocy1= (int)oy1;
+ ocz1= (int)oz1;
+ ocx2= (int)ox2;
+ ocy2= (int)oy2;
+ ocz2= (int)oz2;
+
+ if(ocx1==ocx2 && ocy1==ocy2 && ocz1==ocz2) {
+ no= ocread(oc, ocx1, ocy1, ocz1);
+ if(no) {
+ /* exact intersection with node */
+ vec1[0]= ox1; vec1[1]= oy1; vec1[2]= oz1;
+ vec2[0]= ox2; vec2[1]= oy2; vec2[2]= oz2;
+ calc_ocval_ray(&ocval, (float)ocx1, (float)ocy1, (float)ocz1, vec1, vec2);
+ if( testnode(oc, is, no, ocval) ) return 1;
+ }
+ }
+ else {
+ int found = 0;
+ //static int coh_ocx1,coh_ocx2,coh_ocy1, coh_ocy2,coh_ocz1,coh_ocz2;
+ float dox, doy, doz;
+ int eqval;
+
+ /* calc labda en ld */
+ dox= ox1-ox2;
+ doy= oy1-oy2;
+ doz= oz1-oz2;
+
+ if(dox<-FLT_EPSILON) {
+ ldx= -1.0f/dox;
+ labdax= (ocx1-ox1+1.0f)*ldx;
+ dx= 1;
+ } else if(dox>FLT_EPSILON) {
+ ldx= 1.0f/dox;
+ labdax= (ox1-ocx1)*ldx;
+ dx= -1;
+ } else {
+ labdax=1.0f;
+ ldx=0;
+ dx= 0;
+ }
+
+ if(doy<-FLT_EPSILON) {
+ ldy= -1.0f/doy;
+ labday= (ocy1-oy1+1.0f)*ldy;
+ dy= 1;
+ } else if(doy>FLT_EPSILON) {
+ ldy= 1.0f/doy;
+ labday= (oy1-ocy1)*ldy;
+ dy= -1;
+ } else {
+ labday=1.0f;
+ ldy=0;
+ dy= 0;
+ }
+
+ if(doz<-FLT_EPSILON) {
+ ldz= -1.0f/doz;
+ labdaz= (ocz1-oz1+1.0f)*ldz;
+ dz= 1;
+ } else if(doz>FLT_EPSILON) {
+ ldz= 1.0f/doz;
+ labdaz= (oz1-ocz1)*ldz;
+ dz= -1;
+ } else {
+ labdaz=1.0f;
+ ldz=0;
+ dz= 0;
+ }
+
+ xo=ocx1; yo=ocy1; zo=ocz1;
+ labdao= ddalabda= MIN3(labdax,labday,labdaz);
+
+ vec2[0]= ox1;
+ vec2[1]= oy1;
+ vec2[2]= oz1;
+
+ /* this loop has been constructed to make sure the first and last node of ray
+ are always included, even when ddalabda==1.0f or larger */
+
+ while(TRUE) {
+
+ no= ocread(oc, xo, yo, zo);
+ if(no) {
+
+ /* calculate ray intersection with octree node */
+ copy_v3_v3(vec1, vec2);
+ // dox,y,z is negative
+ vec2[0]= ox1-ddalabda*dox;
+ vec2[1]= oy1-ddalabda*doy;
+ vec2[2]= oz1-ddalabda*doz;
+ calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
+
+ //is->dist = (u1+ddalabda*(u2-u1))*olabda;
+ if( testnode(oc, is, no, ocval) )
+ found = 1;
+
+ if(is->dist < (u1+ddalabda*(u2-u1))*olabda)
+ return found;
+ }
+
+
+ labdao= ddalabda;
+
+ /* traversing ocree nodes need careful detection of smallest values, with proper
+ exceptions for equal labdas */
+ eqval= (labdax==labday);
+ if(labday==labdaz) eqval += 2;
+ if(labdax==labdaz) eqval += 4;
+
+ if(eqval) { // only 4 cases exist!
+ if(eqval==7) { // x=y=z
+ xo+=dx; labdax+=ldx;
+ yo+=dy; labday+=ldy;
+ zo+=dz; labdaz+=ldz;
+ }
+ else if(eqval==1) { // x=y
+ if(labday < labdaz) {
+ xo+=dx; labdax+=ldx;
+ yo+=dy; labday+=ldy;
+ }
+ else {
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ else if(eqval==2) { // y=z
+ if(labdax < labday) {
+ xo+=dx; labdax+=ldx;
+ }
+ else {
+ yo+=dy; labday+=ldy;
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ else { // x=z
+ if(labday < labdax) {
+ yo+=dy; labday+=ldy;
+ }
+ else {
+ xo+=dx; labdax+=ldx;
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ }
+ else { // all three different, just three cases exist
+ eqval= (labdax<labday);
+ if(labday<labdaz) eqval += 2;
+ if(labdax<labdaz) eqval += 4;
+
+ if(eqval==7 || eqval==5) { // x smallest
+ xo+=dx; labdax+=ldx;
+ }
+ else if(eqval==2 || eqval==6) { // y smallest
+ yo+=dy; labday+=ldy;
+ }
+ else { // z smallest
+ zo+=dz; labdaz+=ldz;
+ }
+
+ }
+
+ ddalabda=MIN3(labdax,labday,labdaz);
+ if(ddalabda==labdao) break;
+ /* to make sure the last node is always checked */
+ if(labdao>=1.0f) break;
+ }
+ }
+
+ /* reached end, no intersections found */
+ return 0;
+}
+
+
+
diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
index c510af540db..e9d4d271e72 100644
--- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,7 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -60,10 +64,10 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
BLI_memarena_use_malloc(arena2);
BLI_memarena_use_align(arena2, 16);
- //Build and optimize the tree
- //TODO do this in 1 pass (half memory usage during building)
+ //Build and optimize the tree
+ //TODO do this in 1 pass (half memory usage during building)
VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
-
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -71,28 +75,32 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
return;
}
- pushup_simd<VBVHNode,4>(root);
+ pushup_simd<VBVHNode,4>(root);
+
obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
- //Cleanup
- BLI_memarena_free(arena1);
+ //Free data
+ BLI_memarena_free(arena1);
- rtbuild_free( obj->builder );
- obj->builder = NULL;
-
obj->node_arena = arena2;
- obj->cost = 1.0;
-}
+ obj->cost = 1.0;
+ rtbuild_free(obj->builder);
+ obj->builder = NULL;
+}
template<int StackSize>
int intersect(QBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return svbvh_node_stack_raycast<StackSize,true>(obj->root, isec);
+ else
+ return svbvh_node_stack_raycast<StackSize,false>(obj->root, isec);
+ }
else
- return RE_rayobject_intersect( (RayObject*) obj->root, isec );
+ return RE_rayobject_intersect((RayObject*)obj->root, isec);
}
template<class Tree>
@@ -132,13 +140,11 @@ RayObjectAPI* bvh_get_api(int maxstacksize)
return 0;
}
-
RayObject *RE_rayobject_qbvh_create(int size)
{
return bvh_create_tree<QBVHTree,DFS_STACK_SIZE>(size);
}
-
#else
RayObject *RE_rayobject_qbvh_create(int size)
diff --git a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
new file mode 100644
index 00000000000..0788b2f31cc
--- /dev/null
+++ b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
@@ -0,0 +1,88 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2009 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): André Pinto.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "rayobject.h"
+#include "raycounter.h"
+
+#ifdef RE_RAYCOUNTER
+
+void RE_RC_INFO(RayCounter *info)
+{
+ printf("----------- Raycast counter --------\n");
+ printf("Rays total: %llu\n", info->raycast.test );
+ printf("Rays hit: %llu\n", info->raycast.hit );
+ printf("\n");
+ printf("BB tests: %llu\n", info->bb.test );
+ printf("BB hits: %llu\n", info->bb.hit );
+ printf("\n");
+ printf("SIMD BB tests: %llu\n", info->simd_bb.test );
+ printf("SIMD BB hits: %llu\n", info->simd_bb.hit );
+ printf("\n");
+ printf("Primitives tests: %llu\n", info->faces.test );
+ printf("Primitives hits: %llu\n", info->faces.hit );
+ printf("------------------------------------\n");
+ printf("Shadow last-hit tests per ray: %f\n", info->rayshadow_last_hit.test / ((float)info->raycast.test) );
+ printf("Shadow last-hit hits per ray: %f\n", info->rayshadow_last_hit.hit / ((float)info->raycast.test) );
+ printf("\n");
+ printf("Hint tests per ray: %f\n", info->raytrace_hint.test / ((float)info->raycast.test) );
+ printf("Hint hits per ray: %f\n", info->raytrace_hint.hit / ((float)info->raycast.test) );
+ printf("\n");
+ printf("BB tests per ray: %f\n", info->bb.test / ((float)info->raycast.test) );
+ printf("BB hits per ray: %f\n", info->bb.hit / ((float)info->raycast.test) );
+ printf("\n");
+ printf("SIMD tests per ray: %f\n", info->simd_bb.test / ((float)info->raycast.test) );
+ printf("SIMD hits per ray: %f\n", info->simd_bb.hit / ((float)info->raycast.test) );
+ printf("\n");
+ printf("Primitives tests per ray: %f\n", info->faces.test / ((float)info->raycast.test) );
+ printf("Primitives hits per ray: %f\n", info->faces.hit / ((float)info->raycast.test) );
+ printf("------------------------------------\n");
+}
+
+void RE_RC_MERGE(RayCounter *dest, RayCounter *tmp)
+{
+ dest->faces.test += tmp->faces.test;
+ dest->faces.hit += tmp->faces.hit;
+
+ dest->bb.test += tmp->bb.test;
+ dest->bb.hit += tmp->bb.hit;
+
+ dest->simd_bb.test += tmp->simd_bb.test;
+ dest->simd_bb.hit += tmp->simd_bb.hit;
+
+ dest->raycast.test += tmp->raycast.test;
+ dest->raycast.hit += tmp->raycast.hit;
+
+ dest->rayshadow_last_hit.test += tmp->rayshadow_last_hit.test;
+ dest->rayshadow_last_hit.hit += tmp->rayshadow_last_hit.hit;
+
+ dest->raytrace_hint.test += tmp->raytrace_hint.test;
+ dest->raytrace_hint.hit += tmp->raytrace_hint.hit;
+}
+
+#endif
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
index 1c3cdd5919f..2d6916cd60d 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,15 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include <assert.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include "rayobject_rtbuild.h"
+
#include "MEM_guardedalloc.h"
+
#include "BLI_math.h"
-#include "BKE_utildefines.h"
+#include "BLI_utildefines.h"
static bool selected_node(RTBuilder::Object *node)
{
@@ -91,13 +94,22 @@ void rtbuild_free(RTBuilder *b)
void rtbuild_add(RTBuilder *b, RayObject *o)
{
+ float bb[6];
+
assert( b->primitives.begin + b->primitives.maxsize != b->primitives.end );
+
+ INIT_MINMAX(bb, bb+3);
+ RE_rayobject_merge_bb(o, bb, bb+3);
+
+ /* skip objects with zero bounding box, they are of no use, and
+ will give problems in rtbuild_heuristic_object_split later */
+ if(len_squared_v3v3(bb, bb+3) == 0.0f)
+ return;
+ copy_v3_v3(b->primitives.end->bb, bb);
+ copy_v3_v3(b->primitives.end->bb+3, bb+3);
b->primitives.end->obj = o;
b->primitives.end->cost = RE_rayobject_cost(o);
-
- INIT_MINMAX(b->primitives.end->bb, b->primitives.end->bb+3);
- RE_rayobject_merge_bb(o, b->primitives.end->bb, b->primitives.end->bb+3);
for(int i=0; i<3; i++)
{
@@ -330,8 +342,8 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
{
if(i == size-1)
{
- VECCOPY(sweep[i].bb, obj[i]->bb);
- VECCOPY(sweep[i].bb+3, obj[i]->bb+3);
+ copy_v3_v3(sweep[i].bb, obj[i]->bb);
+ copy_v3_v3(sweep[i].bb+3, obj[i]->bb+3);
sweep[i].cost = obj[i]->cost;
}
else
@@ -362,8 +374,12 @@ int rtbuild_heuristic_object_split(RTBuilder *b, int nchilds)
//Worst case heuristic (cost of each child is linear)
float hcost, left_side, right_side;
- left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost+logf((float)i));
- right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost+logf((float)size-i));
+ // not using log seems to have no impact on raytracing perf, but
+ // makes tree construction quicker, left out for now to test (brecht)
+ // left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost+logf((float)i));
+ // right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost+logf((float)size-i));
+ left_side = bb_area(sweep_left.bb, sweep_left.bb+3)*(sweep_left.cost);
+ right_side= bb_area(sweep[i].bb, sweep[i].bb+3)*(sweep[i].cost);
hcost = left_side+right_side;
assert(left_side >= 0);
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.h b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
index 6bc33ca6626..7c9706097fe 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.h
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
index 647c5771e4f..c4e30f97881 100644
--- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,8 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#include "MEM_guardedalloc.h"
+#include "BLI_utildefines.h"
+
#include "vbvh.h"
#include "svbvh.h"
#include "reorganize.h"
@@ -75,7 +78,8 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
//Build and optimize the tree
if(0)
{
- VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1,&obj->rayobj.control).transform(obj->builder);
+ VBVHNode *root = BuildBinaryVBVH<VBVHNode>(arena1, &obj->rayobj.control).transform(obj->builder);
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -86,11 +90,11 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
reorganize(root);
remove_useless(root, &root);
bvh_refit(root);
-
+
pushup(root);
pushdown(root);
pushup_simd<VBVHNode,4>(root);
-
+
obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
}
else
@@ -98,6 +102,7 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
//Finds the optimal packing of this tree using a given cost model
//TODO this uses quite a lot of memory, find ways to reduce memory usage during building
OVBVHNode *root = BuildBinaryVBVH<OVBVHNode>(arena1,&obj->rayobj.control).transform(obj->builder);
+
if(RE_rayobjectcontrol_test_break(&obj->rayobj.control))
{
BLI_memarena_free(arena1);
@@ -108,15 +113,13 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
}
-
//Free data
BLI_memarena_free(arena1);
obj->node_arena = arena2;
obj->cost = 1.0;
-
-
+
rtbuild_free( obj->builder );
obj->builder = NULL;
}
@@ -125,8 +128,12 @@ template<int StackSize>
int intersect(SVBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<SVBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return svbvh_node_stack_raycast<StackSize,true>(obj->root, isec);
+ else
+ return svbvh_node_stack_raycast<StackSize,false>(obj->root, isec);
+ }
else
return RE_rayobject_intersect( (RayObject*) obj->root, isec );
}
@@ -172,6 +179,7 @@ RayObject *RE_rayobject_svbvh_create(int size)
{
return bvh_create_tree<SVBVHTree,DFS_STACK_SIZE>(size);
}
+
#else
RayObject *RE_rayobject_svbvh_create(int size)
diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
index de1e6d349be..b0fc70d7875 100644
--- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,25 +26,29 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
int tot_pushup = 0;
int tot_pushdown = 0;
int tot_hints = 0;
-
#include <assert.h>
-#include "rayobject.h"
-#include "rayobject_rtbuild.h"
-#include "RE_raytrace.h"
-#include "BLI_memarena.h"
+
#include "MEM_guardedalloc.h"
+
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
+#include "BLI_memarena.h"
+#include "BLI_utildefines.h"
+
+#include "rayintersection.h"
+#include "rayobject.h"
+#include "rayobject_rtbuild.h"
#include "reorganize.h"
#include "bvh.h"
#include "vbvh.h"
-#include "svbvh.h"
+
#include <queue>
#include <algorithm>
@@ -126,8 +130,12 @@ template<int StackSize>
int intersect(VBVHTree *obj, Isect* isec)
{
//TODO renable hint support
- if(RE_rayobject_isAligned(obj->root))
- return bvh_node_stack_raycast<VBVHNode,StackSize,false>( obj->root, isec);
+ if(RE_rayobject_isAligned(obj->root)) {
+ if(isec->mode == RE_RAY_SHADOW)
+ return bvh_node_stack_raycast<VBVHNode,StackSize,false,true>( obj->root, isec);
+ else
+ return bvh_node_stack_raycast<VBVHNode,StackSize,false,false>( obj->root, isec);
+ }
else
return RE_rayobject_intersect( (RayObject*) obj->root, isec );
}
diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
index f4cd3a4330d..2f89cd47faa 100644
--- a/source/blender/render/intern/raytrace/reorganize.h
+++ b/source/blender/render/intern/raytrace/reorganize.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,11 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+#include <float.h>
+#include <math.h>
#include <stdio.h>
#include <math.h>
+
#include <algorithm>
-#include <vector>
#include <queue>
+#include <vector>
#include "BKE_global.h"
@@ -300,7 +304,7 @@ float bvh_refit(Node *node)
*/
#include <vector>
#include <cmath>
-#define MAX_CUT_SIZE 16
+#define MAX_CUT_SIZE 4 /* svbvh assumes max 4 children! */
#define MAX_OPTIMIZE_CHILDS MAX_CUT_SIZE
struct OVBVHNode
diff --git a/source/blender/render/intern/raytrace/svbvh.h b/source/blender/render/intern/raytrace/svbvh.h
index 055a71e3380..573240df2d6 100644
--- a/source/blender/render/intern/raytrace/svbvh.h
+++ b/source/blender/render/intern/raytrace/svbvh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,7 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
#ifdef __SSE__
#ifndef RE_RAYTRACE_SVBVH_H
@@ -39,49 +40,126 @@
struct SVBVHNode
{
+ float child_bb[24];
+ SVBVHNode *child[4];
int nchilds;
-
- //Array of bb, array of childs
- float *child_bb;
- SVBVHNode **child;
};
-template<>
-inline int bvh_node_hit_test<SVBVHNode>(SVBVHNode *node, Isect *isec)
+static int svbvh_bb_intersect_test_simd4(const Isect *isec, const __m128 *bb_group)
+{
+ const __m128 tmin0 = _mm_setzero_ps();
+ const __m128 tmax0 = _mm_set_ps1(isec->dist);
+
+ const __m128 start0 = _mm_set_ps1(isec->start[0]);
+ const __m128 start1 = _mm_set_ps1(isec->start[1]);
+ const __m128 start2 = _mm_set_ps1(isec->start[2]);
+ const __m128 sub0 = _mm_sub_ps(bb_group[isec->bv_index[0]], start0);
+ const __m128 sub1 = _mm_sub_ps(bb_group[isec->bv_index[1]], start0);
+ const __m128 sub2 = _mm_sub_ps(bb_group[isec->bv_index[2]], start1);
+ const __m128 sub3 = _mm_sub_ps(bb_group[isec->bv_index[3]], start1);
+ const __m128 sub4 = _mm_sub_ps(bb_group[isec->bv_index[4]], start2);
+ const __m128 sub5 = _mm_sub_ps(bb_group[isec->bv_index[5]], start2);
+ const __m128 idot_axis0 = _mm_set_ps1(isec->idot_axis[0]);
+ const __m128 idot_axis1 = _mm_set_ps1(isec->idot_axis[1]);
+ const __m128 idot_axis2 = _mm_set_ps1(isec->idot_axis[2]);
+ const __m128 mul0 = _mm_mul_ps(sub0, idot_axis0);
+ const __m128 mul1 = _mm_mul_ps(sub1, idot_axis0);
+ const __m128 mul2 = _mm_mul_ps(sub2, idot_axis1);
+ const __m128 mul3 = _mm_mul_ps(sub3, idot_axis1);
+ const __m128 mul4 = _mm_mul_ps(sub4, idot_axis2);
+ const __m128 mul5 = _mm_mul_ps(sub5, idot_axis2);
+ const __m128 tmin1 = _mm_max_ps(tmin0, mul0);
+ const __m128 tmax1 = _mm_min_ps(tmax0, mul1);
+ const __m128 tmin2 = _mm_max_ps(tmin1, mul2);
+ const __m128 tmax2 = _mm_min_ps(tmax1, mul3);
+ const __m128 tmin3 = _mm_max_ps(tmin2, mul4);
+ const __m128 tmax3 = _mm_min_ps(tmax2, mul5);
+
+ return _mm_movemask_ps(_mm_cmpge_ps(tmax3, tmin3));
+}
+
+static int svbvh_bb_intersect_test(const Isect *isec, const float *_bb)
{
+ const float *bb = _bb;
+
+ float t1x = (bb[isec->bv_index[0]] - isec->start[0]) * isec->idot_axis[0];
+ float t2x = (bb[isec->bv_index[1]] - isec->start[0]) * isec->idot_axis[0];
+ float t1y = (bb[isec->bv_index[2]] - isec->start[1]) * isec->idot_axis[1];
+ float t2y = (bb[isec->bv_index[3]] - isec->start[1]) * isec->idot_axis[1];
+ float t1z = (bb[isec->bv_index[4]] - isec->start[2]) * isec->idot_axis[2];
+ float t2z = (bb[isec->bv_index[5]] - isec->start[2]) * isec->idot_axis[2];
+
+ RE_RC_COUNT(isec->raycounter->bb.test);
+
+ if(t1x > t2y || t2x < t1y || t1x > t2z || t2x < t1z || t1y > t2z || t2y < t1z) return 0;
+ if(t2x < 0.0 || t2y < 0.0 || t2z < 0.0) return 0;
+ if(t1x > isec->dist || t1y > isec->dist || t1z > isec->dist) return 0;
+
+ RE_RC_COUNT(isec->raycounter->bb.hit);
+
return 1;
}
-template<>
-inline void bvh_node_push_childs<SVBVHNode>(SVBVHNode *node, Isect *isec, SVBVHNode **stack, int &stack_pos)
+static bool svbvh_node_is_leaf(const SVBVHNode *node)
{
- int i=0;
- while(i+4 <= node->nchilds)
- {
- int res = test_bb_group4( (__m128*) (node->child_bb+6*i), isec );
- RE_RC_COUNT(isec->raycounter->simd_bb.test);
-
- if(res & 1) { stack[stack_pos++] = node->child[i+0]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 2) { stack[stack_pos++] = node->child[i+1]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 4) { stack[stack_pos++] = node->child[i+2]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
- if(res & 8) { stack[stack_pos++] = node->child[i+3]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
-
- i += 4;
- }
- while(i < node->nchilds)
+ return !RE_rayobject_isAligned(node);
+}
+
+template<int MAX_STACK_SIZE, bool SHADOW>
+static int svbvh_node_stack_raycast(SVBVHNode *root, Isect *isec)
+{
+ SVBVHNode *stack[MAX_STACK_SIZE], *node;
+ int hit = 0, stack_pos = 0;
+
+ stack[stack_pos++] = root;
+
+ while(stack_pos)
{
- if(RE_rayobject_bb_intersect_test(isec, (const float*)node->child_bb+6*i))
- stack[stack_pos++] = node->child[i];
- i++;
+ node = stack[--stack_pos];
+
+ if(!svbvh_node_is_leaf(node))
+ {
+ int nchilds= node->nchilds;
+
+ if(nchilds == 4) {
+ float *child_bb= node->child_bb;
+ int res = svbvh_bb_intersect_test_simd4(isec, ((__m128*) (child_bb)));
+ SVBVHNode **child= node->child;
+
+ RE_RC_COUNT(isec->raycounter->simd_bb.test);
+
+ if(res & 1) { stack[stack_pos++] = child[0]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 2) { stack[stack_pos++] = child[1]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 4) { stack[stack_pos++] = child[2]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ if(res & 8) { stack[stack_pos++] = child[3]; RE_RC_COUNT(isec->raycounter->simd_bb.hit); }
+ }
+ else {
+ float *child_bb= node->child_bb;
+ SVBVHNode **child= node->child;
+ int i;
+
+ for(i=0; i<nchilds; i++)
+ if(svbvh_bb_intersect_test(isec, (float*)child_bb+6*i))
+ stack[stack_pos++] = child[i];
+ }
+ }
+ else
+ {
+ hit |= RE_rayobject_intersect((RayObject*)node, isec);
+ if(SHADOW && hit) break;
+ }
}
+
+ return hit;
}
+
template<>
inline void bvh_node_merge_bb<SVBVHNode>(SVBVHNode *node, float *min, float *max)
{
if(is_leaf(node))
{
- RE_rayobject_merge_bb( (RayObject*)node, min, max);
+ RE_rayobject_merge_bb((RayObject*)node, min, max);
}
else
{
@@ -155,15 +233,13 @@ struct Reorganize_SVBVH
{
SVBVHNode *node = (SVBVHNode*)BLI_memarena_alloc(arena, sizeof(SVBVHNode));
node->nchilds = nchilds;
- node->child_bb = (float*)BLI_memarena_alloc(arena, sizeof(float)*6*nchilds);
- node->child= (SVBVHNode**)BLI_memarena_alloc(arena, sizeof(SVBVHNode*)*nchilds);
return node;
}
void copy_bb(float *bb, const float *old_bb)
{
- std::copy( old_bb, old_bb+6, bb );
+ std::copy(old_bb, old_bb+6, bb);
}
void prepare_for_simd(SVBVHNode *node)
@@ -173,7 +249,7 @@ struct Reorganize_SVBVH
{
float vec_tmp[4*6];
float *res = node->child_bb+6*i;
- std::copy( res, res+6*4, vec_tmp);
+ std::copy(res, res+6*4, vec_tmp);
for(int j=0; j<6; j++)
{
@@ -230,7 +306,7 @@ struct Reorganize_SVBVH
{
float bb[6];
INIT_MINMAX(bb, bb+3);
- RE_rayobject_merge_bb( (RayObject*)o_child, bb, bb+3);
+ RE_rayobject_merge_bb((RayObject*)o_child, bb, bb+3);
copy_bb(node->child_bb+i*6, bb);
break;
}
@@ -239,7 +315,7 @@ struct Reorganize_SVBVH
copy_bb(node->child_bb+i*6, o_child->bb);
}
}
- assert( i == 0 );
+ assert(i == 0);
prepare_for_simd(node);
@@ -250,3 +326,4 @@ struct Reorganize_SVBVH
#endif
#endif //__SSE__
+
diff --git a/source/blender/render/intern/raytrace/vbvh.h b/source/blender/render/intern/raytrace/vbvh.h
index 21c3c0b4c01..deddc7059a4 100644
--- a/source/blender/render/intern/raytrace/vbvh.h
+++ b/source/blender/render/intern/raytrace/vbvh.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,12 +26,13 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#include <assert.h>
+#include <assert.h>
#include <algorithm>
-#include "rayobject_rtbuild.h"
+
#include "BLI_memarena.h"
+#include "rayobject_rtbuild.h"
/*
* VBVHNode represents a BVHNode with support for a variable number of childrens
@@ -167,12 +168,11 @@ struct BuildBinaryVBVH
Node *node = create_node();
- INIT_MINMAX(node->bb, node->bb+3);
- rtbuild_merge_bb(builder, node->bb, node->bb+3);
-
Node **child = &node->child;
int nc = rtbuild_split(builder);
+ INIT_MINMAX(node->bb, node->bb+3);
+
assert(nc == 2);
for(int i=0; i<nc; i++)
{
@@ -180,6 +180,8 @@ struct BuildBinaryVBVH
rtbuild_get_child(builder, i, &tmp);
*child = _transform(&tmp);
+ DO_MIN((*child)->bb, node->bb);
+ DO_MAX((*child)->bb+3, node->bb+3);
child = &((*child)->sibling);
}
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
deleted file mode 100644
index 5aaa66e7712..00000000000
--- a/source/blender/render/intern/source/Makefile
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = render
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# first /include is my own includes, second is the external interface.
-# The external modules follow after. There should be a nicer way to say this.
-CPPFLAGS += -I../include
-CPPFLAGS += -I../../extern/include
-CPPFLAGS += -I../../../blenlib
-CPPFLAGS += -I../../../imbuf
-CPPFLAGS += -I../../../makesdna
-CPPFLAGS += -I../../../makesrna
-CPPFLAGS += -I../../../blenkernel
-CPPFLAGS += -I../../../quicktime
-CPPFLAGS += -I../../../../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-# not very neat: the rest of blender..
-CPPFLAGS += -I../../../editors/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../../../../intern/smoke/extern
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-ifeq ($(WITH_OPENEXR),true)
- CPPFLAGS += -DWITH_OPENEXR
-endif
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 7c7f48e9fb1..c2c33df1e99 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,12 +31,11 @@
#include <string.h>
#include <limits.h>
-
-
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_rand.h"
#include "BLI_memarena.h"
#include "BLI_ghash.h"
@@ -92,7 +91,7 @@
#include "BKE_scene.h"
#include "BKE_subsurf.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BKE_world.h"
#include "PIL_time.h"
@@ -199,9 +198,10 @@ void RE_make_stars(Render *re, Scene *scenev3d, void (*initfunc)(void),
* x = -z | +z,
* y = -z | +z
*/
-
- if(scene->camera==NULL)
+
+ if(scene->camera==NULL || scene->camera->type != OB_CAMERA)
return;
+
camera = scene->camera->data;
clipend = camera->clipend;
@@ -321,7 +321,7 @@ u | | F1 | F2 |
/* ------------------------------------------------------------------------- */
-static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, int usize, int vsize, int uIndex, int cyclu, int cyclv)
+static void split_v_renderfaces(ObjectRen *obr, int startvlak, int startvert, int usize, int vsize, int uIndex, int UNUSED(cyclu), int cyclv)
{
int vLen = vsize-1+(!!cyclv);
int v;
@@ -494,11 +494,82 @@ static void calc_tangent_vector(ObjectRen *obr, VertexTangent **vtangents, MemAr
}
+typedef struct
+{
+ ObjectRen *obr;
+
+} SRenderMeshToTangent;
+
+// interface
+#include "mikktspace.h"
+
+static int GetNumFaces(const SMikkTSpaceContext * pContext)
+{
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ return pMesh->obr->totvlak;
+}
+
+static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num)
+{
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+ return vlr->v4!=NULL ? 4 : 3;
+}
+
+static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+ VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+ VECCOPY(fPos, pVerts[vert_index]->co);
+}
+
+static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+ MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->obr->actmtface, NULL, 0);
+
+ if(tface!=NULL)
+ {
+ float * pTexCo = tface->uv[vert_index];
+ fUV[0]=pTexCo[0]; fUV[1]=pTexCo[1];
+ }
+ else
+ {
+ VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+ map_to_sphere(&fUV[0], &fUV[1], pVerts[vert_index]->orco[0], pVerts[vert_index]->orco[1], pVerts[vert_index]->orco[2]);
+ }
+}
+
+static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+ VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4};
+ VECCOPY(fNorm, pVerts[vert_index]->n);
+}
+static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
+{
+ //assert(vert_index>=0 && vert_index<4);
+ SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData;
+ VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num);
+ float * ftang= RE_vlakren_get_nmap_tangent(pMesh->obr, vlr, 1);
+ if(ftang!=NULL)
+ {
+ VECCOPY(&ftang[iVert*4+0], fvTangent);
+ ftang[iVert*4+3]=fSign;
+ }
+}
+
static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
{
MemArena *arena= NULL;
VertexTangent **vtangents= NULL;
- int a;
+ int a, iCalcNewMethod;
if(do_nmap_tangent) {
arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "nmap tangent arena");
@@ -594,22 +665,24 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
MTFace *tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0);
if(tface) {
+ int k=0;
float *vtang, *ftang= RE_vlakren_get_nmap_tangent(obr, vlr, 1);
vtang= find_vertex_tangent(vtangents[v1->index], tface->uv[0]);
VECCOPY(ftang, vtang);
normalize_v3(ftang);
vtang= find_vertex_tangent(vtangents[v2->index], tface->uv[1]);
- VECCOPY(ftang+3, vtang);
- normalize_v3(ftang+3);
+ VECCOPY(ftang+4, vtang);
+ normalize_v3(ftang+4);
vtang= find_vertex_tangent(vtangents[v3->index], tface->uv[2]);
- VECCOPY(ftang+6, vtang);
- normalize_v3(ftang+6);
+ VECCOPY(ftang+8, vtang);
+ normalize_v3(ftang+8);
if(v4) {
vtang= find_vertex_tangent(vtangents[v4->index], tface->uv[3]);
- VECCOPY(ftang+9, vtang);
- normalize_v3(ftang+9);
+ VECCOPY(ftang+12, vtang);
+ normalize_v3(ftang+12);
}
+ for(k=0; k<4; k++) ftang[4*k+3]=1;
}
}
}
@@ -631,6 +704,31 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
}
}
+ iCalcNewMethod = 1;
+ if(iCalcNewMethod!=0 && do_nmap_tangent!=0)
+ {
+ SRenderMeshToTangent mesh2tangent;
+ SMikkTSpaceContext sContext;
+ SMikkTSpaceInterface sInterface;
+ memset(&mesh2tangent, 0, sizeof(SRenderMeshToTangent));
+ memset(&sContext, 0, sizeof(SMikkTSpaceContext));
+ memset(&sInterface, 0, sizeof(SMikkTSpaceInterface));
+
+ mesh2tangent.obr = obr;
+
+ sContext.m_pUserData = &mesh2tangent;
+ sContext.m_pInterface = &sInterface;
+ sInterface.m_getNumFaces = GetNumFaces;
+ sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace;
+ sInterface.m_getPosition = GetPosition;
+ sInterface.m_getTexCoord = GetTextureCoordinate;
+ sInterface.m_getNormal = GetNormal;
+ sInterface.m_setTSpaceBasic = SetTSpace;
+
+ // 0 if failed
+ iCalcNewMethod = genTangSpaceDefault(&sContext);
+ }
+
if(arena)
BLI_memarena_free(arena);
@@ -923,7 +1021,7 @@ static Material *give_render_material(Render *re, Object *ob, int nr)
if((ma->mode & MA_TRANSP) && (ma->mode & MA_ZTRANSP))
re->flag |= R_ZTRA;
- /* for light groups */
+ /* for light groups and SSS */
ma->flag |= MA_IS_USED;
if(ma->nodetree && ma->use_nodes)
@@ -1251,14 +1349,14 @@ static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float
}
-static void particle_curve(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed)
+static void particle_curve(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, float *loc, float *loc1, int seed, float *pa_co)
{
HaloRen *har=0;
if(ma->material_type == MA_TYPE_WIRE)
static_particle_wire(obr, ma, loc, loc1, sd->first, sd->line);
else if(ma->material_type == MA_TYPE_HALO) {
- har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed);
+ har= RE_inithalo_particle(re, obr, dm, ma, loc, loc1, sd->orco, sd->uvco, sd->size, 1.0, seed, pa_co);
if(har) har->lay= obr->ob->lay;
}
else
@@ -1269,6 +1367,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
VlakRen *vlr;
MTFace *mtf;
float xvec[3], yvec[3], zvec[3], bb_center[3];
+ int totsplit = bb->uv_split * bb->uv_split;
float uvx = 0.0f, uvy = 0.0f, uvdx = 1.0f, uvdy = 1.0f, time = 0.0f;
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
@@ -1306,49 +1405,46 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
if(bb->uv_split > 1){
uvdx = uvdy = 1.0f / (float)bb->uv_split;
- if(bb->anim == PART_BB_ANIM_TIME) {
- if(bb->split_offset == PART_BB_OFF_NONE)
- time = bb->time;
- else if(bb->split_offset == PART_BB_OFF_LINEAR)
- time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
- else /* split_offset==PART_BB_OFF_RANDOM */
- time = (float)fmod(bb->time + bb->random, 1.0f);
+ if(ELEM(bb->anim, PART_BB_ANIM_AGE, PART_BB_ANIM_FRAME)) {
+ if(bb->anim == PART_BB_ANIM_FRAME)
+ time = ((int)(bb->time * bb->lifetime) % totsplit)/(float)totsplit;
+ else
+ time = bb->time;
}
else if(bb->anim == PART_BB_ANIM_ANGLE) {
if(bb->align == PART_BB_VIEW) {
time = (float)fmod((bb->tilt + 1.0f) / 2.0f, 1.0);
}
- else{
+ else {
float axis1[3] = {0.0f,0.0f,0.0f};
float axis2[3] = {0.0f,0.0f,0.0f};
+
axis1[(bb->align + 1) % 3] = 1.0f;
axis2[(bb->align + 2) % 3] = 1.0f;
+
if(bb->lock == 0) {
zvec[bb->align] = 0.0f;
normalize_v3(zvec);
}
+
time = saacos(dot_v3v3(zvec, axis1)) / (float)M_PI;
+
if(dot_v3v3(zvec, axis2) < 0.0f)
time = 1.0f - time / 2.0f;
else
- time = time / 2.0f;
+ time /= 2.0f;
}
- if(bb->split_offset == PART_BB_OFF_LINEAR)
- time = (float)fmod(bb->time + (float)bb->num / (float)(bb->uv_split * bb->uv_split), 1.0f);
- else if(bb->split_offset == PART_BB_OFF_RANDOM)
- time = (float)fmod(bb->time + bb->random, 1.0f);
- }
- else{
- if(bb->split_offset == PART_BB_OFF_NONE)
- time = 0.0f;
- else if(bb->split_offset == PART_BB_OFF_LINEAR)
- time = (float)fmod((float)bb->num /(float)(bb->uv_split * bb->uv_split) , 1.0f);
- else /* split_offset==PART_BB_OFF_RANDOM */
- time = bb->random;
}
+
+ if(bb->split_offset == PART_BB_OFF_LINEAR)
+ time = (float)fmod(time + (float)bb->num / (float)totsplit, 1.0f);
+ else if(bb->split_offset==PART_BB_OFF_RANDOM)
+ time = (float)fmod(time + bb->random, 1.0f);
+
uvx = uvdx * floor((float)(bb->uv_split * bb->uv_split) * (float)fmod((double)time, (double)uvdx));
uvy = uvdy * floor((1.0f - time) * (float)bb->uv_split);
+
if(fmod(time, 1.0f / bb->uv_split) == 0.0f)
uvy -= uvdy;
}
@@ -1386,7 +1482,7 @@ static void particle_billboard(Render *re, ObjectRen *obr, Material *ma, Particl
mtf->uv[3][1] = uvy;
}
}
-static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize)
+static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, ParticleStrandData *sd, ParticleBillboardData *bb, ParticleKey *state, int seed, float hasize, float *pa_co)
{
float loc[3], loc0[3], loc1[3], vel[3];
@@ -1411,7 +1507,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
VECADDFAC(loc0, loc, vel, -part->draw_line[0]);
VECADDFAC(loc1, loc, vel, part->draw_line[1]);
- particle_curve(re, obr, dm, ma, sd, loc0, loc1, seed);
+ particle_curve(re, obr, dm, ma, sd, loc0, loc1, seed, pa_co);
break;
@@ -1428,7 +1524,7 @@ static void particle_normal_ren(short ren_as, ParticleSettings *part, Render *re
{
HaloRen *har=0;
- har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed);
+ har = RE_inithalo_particle(re, obr, dm, ma, loc, NULL, sd->orco, sd->uvco, hasize, 0.0, seed, pa_co);
if(har) har->lay= obr->ob->lay;
@@ -1485,19 +1581,20 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
ParticleKey state;
ParticleCacheKey *cache=0;
ParticleBillboardData bb;
- ParticleSimulationData sim = {re->scene, ob, psys, NULL};
+ ParticleSimulationData sim = {0};
ParticleStrandData sd;
StrandBuffer *strandbuf=0;
StrandVert *svert=0;
StrandBound *sbound= 0;
StrandRen *strand=0;
RNG *rng= 0;
- float loc[3],loc1[3],loc0[3],mat[4][4],nmat[3][3],co[3],nor[3],time;
+ float loc[3],loc1[3],loc0[3],mat[4][4],nmat[3][3],co[3],nor[3],duplimat[4][4];
float strandlen=0.0f, curlen=0.0f;
- float hasize, pa_size, r_tilt, r_length, cfra= BKE_curframe(re->scene);
+ float hasize, pa_size, r_tilt, r_length;
float pa_time, pa_birthtime, pa_dietime;
- float random, simplify[2];
- int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0;
+ float random, simplify[2], pa_co[3];
+ const float cfra= BKE_curframe(re->scene);
+ int i, a, k, max_k=0, totpart, dosimplify = 0, dosurfacecache = 0, use_duplimat = 0;
int totchild=0;
int seed, path_nbr=0, orco1=0, num;
int totface, *origindex = 0;
@@ -1519,10 +1616,15 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
/* 2. start initialising things */
/* last possibility to bail out! */
- sim.psmd = psmd = psys_get_modifier(ob,psys);
+ psmd = psys_get_modifier(ob,psys);
if(!(psmd->modifier.mode & eModifierMode_Render))
return 0;
+ sim.scene= re->scene;
+ sim.ob= ob;
+ sim.psys= psys;
+ sim.psmd= psmd;
+
if(part->phystype==PART_PHYS_KEYED)
psys_count_keyed_targets(&sim);
@@ -1616,7 +1718,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(part->flag & PART_GLOB_TIME)
#endif // XXX old animation system
- cfra = BKE_curframe(re->scene);
///* 2.4 setup reactors */
// if(part->type == PART_REACTOR){
@@ -1633,6 +1734,12 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
copy_m3_m4(nmat, ob->imat);
transpose_m3(nmat);
+ if(psys->flag & PSYS_USE_IMAT) {
+ /* psys->imat is the original emitter's inverse matrix, ob->obmat is the duplicated object's matrix */
+ mul_m4_m4m4(duplimat, psys->imat, ob->obmat);
+ use_duplimat = 1;
+ }
+
/* 2.6 setup strand rendering */
if(part->ren_as == PART_DRAW_PATH && psys->pathcache){
path_nbr=(int)pow(2.0,(double) part->ren_step);
@@ -1712,20 +1819,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
pa_time=(cfra-pa->time)/pa->lifetime;
pa_birthtime = pa->time;
pa_dietime = pa->dietime;
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME) == 0){
- if(ma->ipo) {
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f * pa_time);
- execute_ipo((ID *)ma, ma->ipo);
- }
- if(part->ipo){
- /* correction for lifetime */
- calc_ipo(part->ipo, 100.0f*pa_time);
- execute_ipo((ID *)part, part->ipo);
- }
- }
-#endif // XXX old animation system
hasize = ma->hasize;
@@ -1773,22 +1866,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
pa_time = psys_get_child_time(psys, cpa, cfra, &pa_birthtime, &pa_dietime);
-
-#if 0 // XXX old animation system
- if((part->flag & PART_ABS_TIME) == 0) {
- if(ma->ipo){
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f * pa_time);
- execute_ipo((ID *)ma, ma->ipo);
- }
- if(part->ipo) {
- /* correction for lifetime */
- calc_ipo(part->ipo, 100.0f * pa_time);
- execute_ipo((ID *)part, part->ipo);
- }
- }
-#endif // XXX old animation system
-
pa_size = psys_get_child_size(psys, cpa, cfra, &pa_time);
r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
@@ -1836,6 +1913,11 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
}
+ /* TEXCO_PARTICLE */
+ pa_co[0] = pa_time;
+ pa_co[1] = 0.f;
+ pa_co[2] = 0.f;
+
/* surface normal shading setup */
if(ma->mode_l & MA_STR_SURFDIFF) {
mul_m3_v3(nmat, nor);
@@ -1899,6 +1981,8 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(path_nbr) {
/* render strands */
for(k=0; k<=path_nbr; k++){
+ float time;
+
if(k<=max_k){
VECCOPY(state.co,(cache+k)->co);
VECCOPY(state.vel,(cache+k)->vel);
@@ -1928,14 +2012,14 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
VECSUB(loc0,loc1,loc);
VECADD(loc0,loc1,loc0);
- particle_curve(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc1, loc0, seed, pa_co);
}
sd.first = 0;
sd.time = time;
if(k)
- particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed);
+ particle_curve(re, obr, psmd->dm, ma, &sd, loc, loc1, seed, pa_co);
VECCOPY(loc1,loc);
}
@@ -1950,6 +2034,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
float ct = (part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time;
float dt = length / (trail_count ? (float)trail_count : 1.0f);
+ /* make sure we have pointcache in memory before getting particle on path */
+ psys_make_temp_pointcache(ob, psys);
+
for(i=0; i < trail_count; i++, ct -= dt) {
if(part->draw & PART_ABS_PATH_TIME) {
if(ct < pa_birthtime || ct > pa_dietime)
@@ -1964,6 +2051,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(psys->parent)
mul_m4_v3(psys->parent->obmat, state.co);
+ if(use_duplimat)
+ mul_m4_v4(duplimat, state.co);
+
if(part->ren_as == PART_DRAW_BB) {
bb.random = random;
bb.size = pa_size;
@@ -1972,11 +2062,13 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.num = a;
}
- particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
+ pa_co[0] = (part->draw & PART_ABS_PATH_TIME) ? (ct-pa_birthtime)/(pa_dietime-pa_birthtime) : ct;
+ pa_co[1] = (float)i/(float)(trail_count-1);
+
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize, pa_co);
}
}
else {
- time=0.0f;
state.time=cfra;
if(psys_get_particle_state(&sim,a,&state,0)==0)
continue;
@@ -1984,15 +2076,19 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
if(psys->parent)
mul_m4_v3(psys->parent->obmat, state.co);
+ if(use_duplimat)
+ mul_m4_v4(duplimat, state.co);
+
if(part->ren_as == PART_DRAW_BB) {
bb.random = random;
bb.size = pa_size;
bb.tilt = part->bb_tilt * (1.0f - part->bb_rand_tilt * r_tilt);
bb.time = pa_time;
bb.num = a;
+ bb.lifetime = pa_dietime-pa_birthtime;
}
- particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize);
+ particle_normal_ren(part->ren_as, part, re, obr, psmd->dm, ma, &sd, &bb, &state, seed, hasize, pa_co);
}
}
@@ -2341,7 +2437,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
VertRen *ver;
VlakRen *vlr, *vlr1;
Material *ma;
- float *data, *nors, *orco, mat[4][4], imat[3][3], xn, yn, zn;
+ float *data, *nors, *orco=NULL, mat[4][4], imat[3][3], xn, yn, zn;
int a, need_orco, vlakindex, *index;
ListBase dispbase= {NULL, NULL};
@@ -2375,7 +2471,7 @@ static void init_render_mball(Render *re, ObjectRen *obr)
}
}
- for(a=0; a<dl->nr; a++, data+=3, nors+=3, orco+=3) {
+ for(a=0; a<dl->nr; a++, data+=3, nors+=3) {
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
@@ -2393,7 +2489,10 @@ static void init_render_mball(Render *re, ObjectRen *obr)
normalize_v3(ver->n);
//if(ob->transflag & OB_NEG_SCALE) negate_v3(ver->n);
- if(need_orco) ver->orco= orco;
+ if(need_orco) {
+ ver->orco= orco;
+ orco+=3;
+ }
}
index= dl->index;
@@ -2605,18 +2704,14 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr,
int a, a1, end, totvert, vertofs;
VertRen *ver;
VlakRen *vlr;
- Curve *cu= NULL;
MVert *mvert = NULL;
MFace *mface;
Material *ma;
+ /* Curve *cu= ELEM(ob->type, OB_FONT, OB_CURVE) ? ob->data : NULL; */
mvert= dm->getVertArray(dm);
totvert= dm->getNumVerts(dm);
- if ELEM(ob->type, OB_FONT, OB_CURVE) {
- cu= ob->data;
- }
-
for(a=0; a<totvert; a++, mvert++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, mvert->co);
@@ -2713,7 +2808,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset)
ListBase displist= {NULL, NULL};
DispList *dl;
Material **matar;
- float *orco=NULL, *orcobase=NULL, mat[4][4];
+ float *orco=NULL, mat[4][4];
int a, totmat, need_orco=0;
DerivedMesh *dm= NULL;
@@ -2751,7 +2846,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset)
dm->release(dm);
} else {
if(need_orco) {
- orcobase= orco= get_object_orco(re, ob);
+ orco= get_object_orco(re, ob);
}
/* walk along displaylist and create rendervertices/-faces */
@@ -2777,10 +2872,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
DerivedMesh *dm = NULL;
ListBase disp={NULL, NULL};
Material **matar;
- float len, *data, *fp, *orco=NULL, *orcobase= NULL;
+ float *data, *fp, *orco=NULL;
float n[3], mat[4][4];
- int nr, startvert, startvlak, a, b;
- int frontside, need_orco=0, totmat;
+ int nr, startvert, a, b;
+ int need_orco=0, totmat;
cu= ob->data;
if(ob->type==OB_FONT && cu->str==NULL) return;
@@ -2816,7 +2911,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
dm->release(dm);
} else {
if(need_orco) {
- orcobase=orco= get_object_orco(re, ob);
+ orco= get_object_orco(re, ob);
}
while(dl) {
@@ -2838,15 +2933,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, data);
- /* flip normal if face is backfacing, also used in face loop below */
- if(ver->co[2] < 0.0) {
- VECCOPY(ver->n, n);
- ver->flag = 1;
- }
- else {
- ver->n[0]= -n[0]; ver->n[1]= -n[1]; ver->n[2]= -n[2];
- ver->flag = 0;
- }
+ negate_v3_v3(ver->n, n);
mul_m4_v3(mat, ver->co);
@@ -2857,7 +2944,6 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
if(timeoffset==0) {
- startvlak= obr->totvlak;
index= dl->index;
for(a=0; a<dl->parts; a++, index+=3) {
@@ -2867,12 +2953,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
vlr->v3= RE_findOrAddVert(obr, startvert+index[2]);
vlr->v4= NULL;
- if(vlr->v1->flag) {
- VECCOPY(vlr->n, n);
- }
- else {
- vlr->n[0]= -n[0]; vlr->n[1]= -n[1]; vlr->n[2]= -n[2];
- }
+ negate_v3_v3(vlr->n, n);
vlr->mat= matar[ dl->col ];
vlr->flag= 0;
@@ -2907,12 +2988,10 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
if(dl->bevelSplitFlag || timeoffset==0) {
- startvlak= obr->totvlak;
+ const int startvlak= obr->totvlak;
for(a=0; a<dl->parts; a++) {
- frontside= (a >= dl->nr/2);
-
if (surfindex_displist(dl, a, &b, &p1, &p2, &p3, &p4)==0)
break;
@@ -2923,6 +3002,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
for(; b<dl->nr; b++) {
vlr= RE_findOrAddVlak(obr, obr->totvlak++);
+ /* important 1 offset in order is kept [#24913] */
vlr->v1= RE_findOrAddVert(obr, p2);
vlr->v2= RE_findOrAddVert(obr, p1);
vlr->v3= RE_findOrAddVert(obr, p3);
@@ -2932,16 +3012,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
vlr->flag= dl->rt;
- /* this is not really scientific: the vertices
- * 2, 3 en 4 seem to give better vertexnormals than 1 2 3:
- * front and backside treated different!!
- */
-
- if(frontside)
- normal_tri_v3( vlr->n,vlr->v2->co, vlr->v3->co, vlr->v4->co);
- else
- normal_tri_v3( vlr->n,vlr->v1->co, vlr->v2->co, vlr->v3->co);
-
+ normal_quad_v3(vlr->n, vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
vlr->mat= matar[ dl->col ];
p4= p3;
@@ -2968,16 +3039,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset)
}
for(a=startvert; a<obr->totvert; a++) {
ver= RE_findOrAddVert(obr, a);
- len= normalize_v3(ver->n);
- if(len==0.0) ver->flag= 1; /* flag abuse, its only used in zbuf now */
- else ver->flag= 0;
- }
- for(a= startvlak; a<obr->totvlak; a++) {
- vlr= RE_findOrAddVlak(obr, a);
- if(vlr->v1->flag) VECCOPY(vlr->v1->n, vlr->n);
- if(vlr->v2->flag) VECCOPY(vlr->v2->n, vlr->n);
- if(vlr->v3->flag) VECCOPY(vlr->v3->n, vlr->n);
- if(vlr->v4->flag) VECCOPY(vlr->v4->n, vlr->n);
+ normalize_v3(ver->n);
}
}
}
@@ -3302,7 +3364,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* test for 100% transparant */
ok= 1;
- if(ma->alpha==0.0 && ma->spectra==0.0) {
+ if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f) {
ok= 0;
/* texture on transparency? */
for(a=0; a<MAX_MTEX; a++) {
@@ -3507,7 +3569,6 @@ static void initshadowbuf(Render *re, LampRen *lar, float mat[][4])
/* bias is percentage, made 2x larger because of correction for angle of incidence */
/* when a ray is closer to parallel of a face, bias value is increased during render */
shb->bias= (0.02*lar->bias)*0x7FFFFFFF;
- shb->bias= shb->bias;
/* halfway method (average of first and 2nd z) reduces bias issues */
if(ELEM(lar->buftype, LA_SHADBUF_HALFWAY, LA_SHADBUF_DEEP))
@@ -3748,6 +3809,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
/* pre-scale */
lar->sh_invcampos[2]*= lar->sh_zfac;
+ /* halfway shadow buffer doesn't work for volumetric effects */
+ if(lar->buftype == LA_SHADBUF_HALFWAY)
+ lar->buftype = LA_SHADBUF_REGULAR;
+
}
}
else if(la->type==LA_HEMI) {
@@ -3984,35 +4049,40 @@ static void set_phong_threshold(ObjectRen *obr)
/* per face check if all samples should be taken.
if raytrace or multisample, do always for raytraced material, or when material full_osa set */
-static void set_fullsample_flag(Render *re, ObjectRen *obr)
+static void set_fullsample_trace_flag(Render *re, ObjectRen *obr)
{
VlakRen *vlr;
- int a, trace, mode;
+ int a, trace, mode, osa;
- if(re->osa==0)
- return;
-
+ osa= re->osa;
trace= re->r.mode & R_RAYTRACE;
for(a=obr->totvlak-1; a>=0; a--) {
vlr= RE_findOrAddVlak(obr, a);
mode= vlr->mat->mode;
+
+ if(trace && (mode & MA_TRACEBLE))
+ vlr->flag |= R_TRACEBLE;
- if(mode & MA_FULL_OSA)
- vlr->flag |= R_FULL_OSA;
- else if(trace) {
- if(mode & MA_SHLESS);
- else if(vlr->mat->material_type == MA_TYPE_VOLUME);
- else if((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP)))
- /* for blurry reflect/refract, better to take more samples
- * inside the raytrace than as OSA samples */
- if ((vlr->mat->gloss_mir == 1.0) && (vlr->mat->gloss_tra == 1.0))
- vlr->flag |= R_FULL_OSA;
+ if(osa) {
+ if(mode & MA_FULL_OSA) {
+ vlr->flag |= R_FULL_OSA;
+ }
+ else if(trace) {
+ if(mode & MA_SHLESS);
+ else if(vlr->mat->material_type == MA_TYPE_VOLUME);
+ else if((mode & MA_RAYMIRROR) || ((mode & MA_TRANSP) && (mode & MA_RAYTRANSP))) {
+ /* for blurry reflect/refract, better to take more samples
+ * inside the raytrace than as OSA samples */
+ if ((vlr->mat->gloss_mir == 1.0) && (vlr->mat->gloss_tra == 1.0))
+ vlr->flag |= R_FULL_OSA;
+ }
+ }
}
}
}
-/* split quads for pradictable baking
+/* split quads for predictable baking
* dir 1 == (0,1,2) (0,2,3), 2 == (1,3,0) (1,2,3)
*/
static void split_quads(ObjectRen *obr, int dir)
@@ -4202,7 +4272,7 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
check_non_flat_quads(obr);
}
- set_fullsample_flag(re, obr);
+ set_fullsample_trace_flag(re, obr);
/* compute bounding boxes for clipping */
INIT_MINMAX(min, max);
@@ -4214,13 +4284,23 @@ static void finalize_render_object(Render *re, ObjectRen *obr, int timeoffset)
}
if(obr->strandbuf) {
+ float width;
+
+ /* compute average bounding box of strandpoint itself (width) */
+ if(obr->strandbuf->flag & R_STRAND_B_UNITS)
+ obr->strandbuf->maxwidth= MAX2(obr->strandbuf->ma->strand_sta, obr->strandbuf->ma->strand_end);
+ else
+ obr->strandbuf->maxwidth= 0.0f;
+
+ width= obr->strandbuf->maxwidth;
sbound= obr->strandbuf->bound;
for(b=0; b<obr->strandbuf->totbound; b++, sbound++) {
+
INIT_MINMAX(smin, smax);
for(a=sbound->start; a<sbound->end; a++) {
strand= RE_findOrAddStrand(obr, a);
- strand_minmax(strand, smin, smax);
+ strand_minmax(strand, smin, smax, width);
}
VECCOPY(sbound->boundbox[0], smin);
@@ -4374,7 +4454,7 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset)
int i;
if(obr->psysindex) {
- if((!obr->prev || obr->prev->ob != ob) && ob->type==OB_MESH) {
+ if((!obr->prev || obr->prev->ob != ob || (obr->prev->flag & R_INSTANCEABLE)==0) && ob->type==OB_MESH) {
/* the emitter mesh wasn't rendered so the modifier stack wasn't
* evaluated with render settings */
DerivedMesh *dm;
@@ -4466,8 +4546,11 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *
}
if(obr->lay & vectorlay)
obr->flag |= R_NEED_VECTORS;
+ if(dob)
+ psys->flag |= PSYS_USE_IMAT;
init_render_object_data(re, obr, timeoffset);
psys_render_restore(ob, psys);
+ psys->flag &= ~PSYS_USE_IMAT;
/* only add instance for objects that have not been used for dupli */
if(!(ob->transflag & OB_RENDER_DUPLI)) {
@@ -4720,7 +4803,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
Object *ob;
Group *group;
ObjectInstanceRen *obi;
- Scene *sce;
+ Scene *sce_iter;
float mat[4][4];
int lay, vectorlay, redoimat= 0;
@@ -4729,7 +4812,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
* NULL is just for init */
set_dupli_tex_mat(NULL, NULL, NULL);
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
/* imat objects has to be done here, since displace can have texture using Object map-input */
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
@@ -4739,7 +4822,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
ob->transflag &= ~OB_RENDER_DUPLI;
}
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
/* in the prev/next pass for making speed vectors, avoid creating
@@ -4799,6 +4882,8 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
int psysindex;
float mat[4][4];
+ obi=NULL;
+
/* instances instead of the actual object are added in two cases, either
* this is a duplivert/face/particle, or it is a non-animated object in
* a dupligroup that has already been created before */
@@ -4823,15 +4908,14 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
find_dupli_instances(re, obr);
}
}
- else
- /* can't instance, just create the object */
- init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
/* same logic for particles, each particle system has it's own object, so
* need to go over them separately */
psysindex= 1;
for(psys=obd->particlesystem.first; psys; psys=psys->next) {
- if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, ob, psysindex))) {
+ if(dob->type != OB_DUPLIGROUP || (obr=find_dupligroup_dupli(re, obd, psysindex))) {
+ if(obi == NULL)
+ mul_m4_m4m4(mat, dob->mat, re->viewmat);
obi= RE_addRenderInstance(re, NULL, obd, ob, dob->index, psysindex++, mat, obd->lay);
set_dupli_tex_mat(re, obi, dob);
@@ -4847,6 +4931,10 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
}
}
}
+
+ if(obi==NULL)
+ /* can't instance, just create the object */
+ init_render_object(re, obd, ob, dob, timeoffset, vectorlay);
if(dob->type != OB_DUPLIGROUP) {
obd->flag |= OB_DONE;
@@ -4877,7 +4965,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
/* imat objects has to be done again, since groups can mess it up */
if(redoimat) {
- for(SETLOOPER(re->scene, base)) {
+ for(SETLOOPER(re->scene, sce_iter, base)) {
ob= base->object;
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
invert_m4_m4(ob->imat, mat);
@@ -4891,7 +4979,6 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
/* used to be 'rotate scene' */
void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int lay, int use_camera_view)
{
- extern int slurph_opt; /* key.c */
Scene *sce;
float mat[4][4];
float amb[3];
@@ -4920,7 +5007,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l
lay &= 0xFF000000;
/* applies changes fully */
- if((re->r.scemode & R_PREVIEWBUTS)==0)
+ if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
scene_update_for_newframe(re->main, re->scene, lay);
/* if no camera, viewmat should have been set! */
@@ -5054,7 +5141,6 @@ void RE_DataBase_GetView(Render *re, float mat[][4])
static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset)
{
- extern int slurph_opt; /* key.c */
float mat[4][4];
re->scene= scene;
@@ -5182,7 +5268,7 @@ static void calculate_speedvector(float *vectors, int step, float winsq, float w
static float *calculate_strandsurface_speedvectors(Render *re, ObjectInstanceRen *obi, StrandSurface *mesh)
{
- float winsq= re->winx*re->winy, winroot= sqrt(winsq), (*winspeed)[4];
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq), (*winspeed)[4]; /* int's can wrap on large images */
float ho[4], prevho[4], nextho[4], winmat[4][4], vec[2];
int a;
@@ -5221,7 +5307,7 @@ static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *ve
StrandSurface *mesh= NULL;
float *speed, (*winspeed)[4]=NULL, ho[4], winmat[4][4];
float *co1, *co2, *co3, *co4, w[4];
- float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */
int a, *face, *index;
if(obi->flag & R_TRANSFORMED)
@@ -5288,7 +5374,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float *
VertRen *ver= NULL;
float *speed, div, zco[2], avgvel[4] = {0.0, 0.0, 0.0, 0.0};
float zmulx= re->winx/2, zmuly= re->winy/2, len;
- float winsq= re->winx*re->winy, winroot= sqrt(winsq);
+ float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */
int a, j;
float hoco[4], ho[4], fsvec[4], camco[4];
float mat[4][4], winmat[4][4];
@@ -5443,7 +5529,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned
ListBase strandsurface;
int step;
- re->i.infostr= "Calculating previous vectors";
+ re->i.infostr= "Calculating previous frame vectors";
re->r.mode |= R_SPEED;
speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 8977bc7f379..55f7433da96 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -34,6 +34,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h" /* for rectcpy */
@@ -48,7 +49,7 @@
#include "BKE_main.h"
#include "BKE_image.h" // BKE_write_ibuf
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
@@ -86,7 +87,7 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
if (env->type == ENV_CUBE) {
for(part=0; part<6; part++) {
- env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat, 0);
+ env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
}
IMB_float_from_rect(ibuf);
@@ -458,7 +459,7 @@ static void render_envmap(Render *re, EnvMap *env)
int y;
float *alpha;
- ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect|IB_rectfloat, 0);
+ ibuf= IMB_allocImBuf(envre->rectx, envre->recty, 24, IB_rect|IB_rectfloat);
memcpy(ibuf->rect_float, rl->rectf, ibuf->channels * ibuf->x * ibuf->y * sizeof(float));
if (re->scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)
diff --git a/source/blender/render/intern/source/gammaCorrectionTables.c b/source/blender/render/intern/source/gammaCorrectionTables.c
index 818c3c72118..cd1539bdda0 100644
--- a/source/blender/render/intern/source/gammaCorrectionTables.c
+++ b/source/blender/render/intern/source/gammaCorrectionTables.c
@@ -1,4 +1,4 @@
-/**
+/*
* Jitter offset table
*
* $Id$
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index f78031c9030..4baa3480ae9 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* $Id$
*
@@ -51,14 +51,16 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
-#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_image.h"
#include "BKE_texture.h"
#include "BKE_library.h"
+#include "RE_render_ext.h"
+
#include "renderpipeline.h"
#include "render_types.h"
#include "texture.h"
@@ -157,8 +159,8 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
}
}
- x = (int)(fx*ibuf->x);
- y = (int)(fy*ibuf->y);
+ x = (int)floorf(fx*ibuf->x);
+ y = (int)floorf(fy*ibuf->y);
if(tex->extend == TEX_CLIPCUBE) {
if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0 || texvec[2]>1.0) {
@@ -208,8 +210,14 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
if(texres->nor) {
if(tex->imaflag & TEX_NORMALMAP) {
// qdn: normal from color
- texres->nor[0] = 2.f*(texres->tr - 0.5f);
- texres->nor[1] = 2.f*(0.5f - texres->tg);
+ // The invert of the red channel is to make
+ // the normal map compliant with the outside world.
+ // It needs to be done because in Blender
+ // the normal used in the renderer points inward. It is generated
+ // this way in calc_vertexnormals(). Should this ever change
+ // this negate must be removed.
+ texres->nor[0] = -2.f*(texres->tr - 0.5f);
+ texres->nor[1] = 2.f*(texres->tg - 0.5f);
texres->nor[2] = 2.f*(texres->tb - 0.5f);
}
else {
@@ -500,7 +508,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
}
}
-static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend, int intpol)
+static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float maxy, TexResult *texres, int imaprepeat, int imapextend)
{
/* Sample box, performs clip. minx etc are in range 0.0 - 1.0 .
* Enlarge with antialiased edges of pixels.
@@ -808,7 +816,7 @@ static void imp2radangle(float A, float B, float C, float F, float* a, float* b,
static void ewa_eval(TexResult* texr, ImBuf* ibuf, float fx, float fy, afdata_t* AFD)
{
// scaling dxt/dyt by full resolution can cause overflow because of huge A/B/C and esp. F values,
- // scaling by aspect ratio alone does the opposite, so try something inbetween instead...
+ // scaling by aspect ratio alone does the opposite, so try something in between instead...
const float ff2 = ibuf->x, ff = sqrtf(ff2), q = ibuf->y / ff;
const float Ux = AFD->dxt[0]*ff, Vx = AFD->dxt[1]*q, Uy = AFD->dyt[0]*ff, Vy = AFD->dyt[1]*q;
float A = Vx*Vx + Vy*Vy;
@@ -960,6 +968,30 @@ static void alpha_clip_aniso(ImBuf *ibuf, float minx, float miny, float maxx, fl
}
}
+static void image_mipmap_test(Tex *tex, ImBuf *ibuf)
+{
+ if (tex->imaflag & TEX_MIPMAP) {
+ if ((ibuf->flags & IB_fields) == 0) {
+
+ if (ibuf->mipmap[0] && (ibuf->userflags & IB_MIPMAP_INVALID)) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if (ibuf->userflags & IB_MIPMAP_INVALID) {
+ IMB_remakemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
+ ibuf->userflags &= ~IB_MIPMAP_INVALID;
+ }
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
+ if (ibuf->mipmap[0] == NULL) {
+ BLI_lock_thread(LOCK_IMAGE);
+ if (ibuf->mipmap[0] == NULL)
+ IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
+ BLI_unlock_thread(LOCK_IMAGE);
+ }
+ }
+ }
+
+}
+
static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, float *dyt, TexResult *texres)
{
TexResult texr;
@@ -996,15 +1028,9 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
if ((ibuf == NULL) || ((ibuf->rect == NULL) && (ibuf->rect_float == NULL))) return retval;
- // mipmap test
- if (tex->imaflag & TEX_MIPMAP) {
- if (((ibuf->flags & IB_fields) == 0) && (ibuf->mipmap[0] == NULL)) {
- BLI_lock_thread(LOCK_IMAGE);
- if (ibuf->mipmap[0] == NULL) IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
- BLI_unlock_thread(LOCK_IMAGE);
- }
- }
-
+ /* mipmap test */
+ image_mipmap_test(tex, ibuf);
+
if ((tex->imaflag & TEX_USEALPHA) && ((tex->imaflag & TEX_CALCALPHA) == 0)) texres->talpha = 1;
texr.talpha = texres->talpha;
@@ -1328,8 +1354,14 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
ibuf->rect -= ibuf->x*ibuf->y;
if (texres->nor && (tex->imaflag & TEX_NORMALMAP)) { // normal from color
- texres->nor[0] = 2.f*(texres->tr - 0.5f);
- texres->nor[1] = 2.f*(0.5f - texres->tg);
+ // The invert of the red channel is to make
+ // the normal map compliant with the outside world.
+ // It needs to be done because in Blender
+ // the normal used in the renderer points inward. It is generated
+ // this way in calc_vertexnormals(). Should this ever change
+ // this negate must be removed.
+ texres->nor[0] = -2.f*(texres->tr - 0.5f);
+ texres->nor[1] = 2.f*(texres->tg - 0.5f);
texres->nor[2] = 2.f*(texres->tb - 0.5f);
}
@@ -1388,17 +1420,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
return retval;
/* mipmap test */
- if (tex->imaflag & TEX_MIPMAP) {
- if(ibuf->flags & IB_fields);
- else if(ibuf->mipmap[0]==NULL) {
- BLI_lock_thread(LOCK_IMAGE);
-
- if(ibuf->mipmap[0]==NULL)
- IMB_makemipmap(ibuf, tex->imaflag & TEX_GAUSS_MIP);
-
- BLI_unlock_thread(LOCK_IMAGE);
- }
- }
+ image_mipmap_test(tex, ibuf);
if(tex->imaflag & TEX_USEALPHA) {
if(tex->imaflag & TEX_CALCALPHA);
@@ -1606,11 +1628,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
//minx*= 1.35f;
//miny*= 1.35f;
- boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
val1= texres->tr+texres->tg+texres->tb;
- boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= texr.tr + texr.tg + texr.tb;
- boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(curibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= texr.tr + texr.tg + texr.tb;
/* don't switch x or y! */
@@ -1619,7 +1641,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
if(previbuf!=curibuf) { /* interpolate */
- boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx, fy-miny, fx+minx, fy+miny, &texr, imaprepeat, imapextend);
/* calc rgb */
dx= 2.0f*(pixsize-maxd)/pixsize;
@@ -1636,9 +1658,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
val1= dy*val1+ dx*(texr.tr + texr.tg + texr.tb);
- boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= dy*val2+ dx*(texr.tr + texr.tg + texr.tb);
- boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= dy*val3+ dx*(texr.tr + texr.tg + texr.tb);
texres->nor[0]= (val1-val2); /* vals have been interpolated above! */
@@ -1661,10 +1683,10 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
maxy= fy+miny;
miny= fy-miny;
- boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend, 0);
+ boxsample(curibuf, minx, miny, maxx, maxy, texres, imaprepeat, imapextend);
if(previbuf!=curibuf) { /* interpolate */
- boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend, 0);
+ boxsample(previbuf, minx, miny, maxx, maxy, &texr, imaprepeat, imapextend);
fx= 2.0f*(pixsize-maxd)/pixsize;
@@ -1690,11 +1712,11 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
if(texres->nor && (tex->imaflag & TEX_NORMALMAP)==0) {
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
val1= texres->tr+texres->tg+texres->tb;
- boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx+dxt[0], fy-miny+dxt[1], fx+minx+dxt[0], fy+miny+dxt[1], &texr, imaprepeat, imapextend);
val2= texr.tr + texr.tg + texr.tb;
- boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx+dyt[0], fy-miny+dyt[1], fx+minx+dyt[0], fy+miny+dyt[1], &texr, imaprepeat, imapextend);
val3= texr.tr + texr.tg + texr.tb;
/* don't switch x or y! */
@@ -1702,7 +1724,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
texres->nor[1]= (val1-val3);
}
else
- boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend, 0);
+ boxsample(ibuf, fx-minx, fy-miny, fx+minx, fy+miny, texres, imaprepeat, imapextend);
}
if(tex->imaflag & TEX_CALCALPHA) {
@@ -1718,8 +1740,14 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
if(texres->nor && (tex->imaflag & TEX_NORMALMAP)) {
// qdn: normal from color
- texres->nor[0] = 2.f*(texres->tr - 0.5f);
- texres->nor[1] = 2.f*(0.5f - texres->tg);
+ // The invert of the red channel is to make
+ // the normal map compliant with the outside world.
+ // It needs to be done because in Blender
+ // the normal used in the renderer points inward. It is generated
+ // this way in calc_vertexnormals(). Should this ever change
+ // this negate must be removed.
+ texres->nor[0] = -2.f*(texres->tr - 0.5f);
+ texres->nor[1] = 2.f*(texres->tg - 0.5f);
texres->nor[2] = 2.f*(texres->tb - 0.5f);
}
@@ -1749,7 +1777,7 @@ void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *res
if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) )
ibuf->rect+= (ibuf->x*ibuf->y);
- boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1, 0);
+ boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1);
result[0]= texres.tr;
result[1]= texres.tg;
result[2]= texres.tb;
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 26c68d0a167..7ba2d2d9c88 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -40,8 +40,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
-
-
+#include "BLI_utildefines.h"
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
@@ -50,7 +49,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_material.h"
#include "BKE_object.h"
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index fb69519236a..4d129312672 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -40,10 +40,11 @@
#include "BLI_blenlib.h"
#include "BLI_memarena.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "BKE_global.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "RE_shader_ext.h"
@@ -304,7 +305,7 @@ static float sh_eval(float *sh, float *v)
/* ------------------------------ Building --------------------------------- */
-static void occ_face(const OccFace *face, float *co, float *normal, float *area)
+static void occ_face(const OccFace *face, float co[3], float normal[3], float *area)
{
ObjectInstanceRen *obi;
VlakRen *vlr;
@@ -421,21 +422,23 @@ static void occ_node_from_face(OccFace *face, OccNode *node)
sh_from_disc(n, node->area, node->sh);
}
-static void occ_build_dco(OcclusionTree *tree, OccNode *node, float *co, float *dco)
+static void occ_build_dco(OcclusionTree *tree, OccNode *node, const float co[3], float *dco)
{
- OccNode *child;
- float dist, d[3], nco[3];
int b;
-
for(b=0; b<TOTCHILD; b++) {
+ float dist, d[3], nco[3];
+
if(node->childflag & (1<<b)) {
- occ_face(tree->face+node->child[b].face, nco, 0, 0);
+ occ_face(tree->face+node->child[b].face, nco, NULL, NULL);
}
else if(node->child[b].node) {
- child= node->child[b].node;
+ OccNode *child= node->child[b].node;
occ_build_dco(tree, child, co, dco);
VECCOPY(nco, child->co);
}
+ else {
+ continue;
+ }
VECSUB(d, nco, co);
dist= INPR(d, d);
@@ -521,7 +524,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
ListBase threads;
OcclusionBuildThread othreads[BLENDER_MAX_THREADS];
OccNode *child, tmpnode;
- OccFace *face;
+ /* OccFace *face; */
int a, b, totthread=0, offset[TOTCHILD], count[TOTCHILD];
/* add a new node */
@@ -530,7 +533,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
/* leaf node with only children */
if(end - begin <= TOTCHILD) {
for(a=begin, b=0; a<end; a++, b++) {
- face= &tree->face[a];
+ /* face= &tree->face[a]; */
node->child[b].face= a;
node->childflag |= (1<<b);
}
@@ -547,7 +550,7 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
node->child[b].node= NULL;
}
else if(count[b] == 1) {
- face= &tree->face[offset[b]];
+ /* face= &tree->face[offset[b]]; */
node->child[b].face= offset[b];
node->childflag |= (1<<b);
}
@@ -1526,7 +1529,7 @@ static int sample_occ_cache(OcclusionTree *tree, float *co, float *n, int x, int
for(i=0; i<4; i++) {
VECSUB(d, samples[i]->co, co);
- dist2= INPR(d, d);
+ //dist2= INPR(d, d);
wz[i]= 1.0f; //(samples[i]->dist2/(1e-4f + dist2));
wn[i]= pow(INPR(samples[i]->n, n), 32.0f);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 78cad1bd48e..abb7acd91fc 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -58,6 +58,7 @@
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
#include "IMB_imbuf.h"
@@ -120,24 +121,24 @@ Render R;
/* ********* alloc and free ******** */
+static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override);
static volatile int g_break= 0;
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return g_break;
}
/* default callbacks, set in each new render */
-static void result_nothing(void *unused, RenderResult *rr) {}
-static void result_rcti_nothing(void *unused, RenderResult *rr, volatile struct rcti *rect) {}
-static void stats_nothing(void *unused, RenderStats *rs) {}
-static void float_nothing(void *unused, float val) {}
-static void print_error(void *unused, char *str) {printf("ERROR: %s\n", str);}
-static int default_break(void *unused) {return G.afbreek == 1;}
+static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr)) {}
+static void result_rcti_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect)) {}
+static void stats_nothing(void *UNUSED(arg), RenderStats *UNUSED(rs)) {}
+static void float_nothing(void *UNUSED(arg), float UNUSED(val)) {}
+static void print_error(void *UNUSED(arg), const char *str) {printf("ERROR: %s\n", str);}
+static int default_break(void *UNUSED(arg)) {return G.afbreek == 1;}
-static void stats_background(void *unused, RenderStats *rs)
+static void stats_background(void *UNUSED(arg), RenderStats *rs)
{
- char str[400], *spos= str;
uintptr_t mem_in_use, mmap_in_use, peak_memory;
float megs_used_memory, mmap_used_memory, megs_peak_memory;
@@ -149,24 +150,25 @@ static void stats_background(void *unused, RenderStats *rs)
mmap_used_memory= (mmap_in_use)/(1024.0*1024.0);
megs_peak_memory = (peak_memory)/(1024.0*1024.0);
- spos+= sprintf(spos, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra,
+ fprintf(stdout, "Fra:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->cfra,
megs_used_memory, mmap_used_memory, megs_peak_memory);
-
+
if(rs->curfield)
- spos+= sprintf(spos, "Field %d ", rs->curfield);
+ fprintf(stdout, "Field %d ", rs->curfield);
if(rs->curblur)
- spos+= sprintf(spos, "Blur %d ", rs->curblur);
-
+ fprintf(stdout, "Blur %d ", rs->curblur);
+
if(rs->infostr) {
- spos+= sprintf(spos, "| %s", rs->infostr);
+ fprintf(stdout, "| %s", rs->infostr);
}
else {
if(rs->tothalo)
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
- else
- spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
+ fprintf(stdout, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
+ else
+ fprintf(stdout, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp);
}
- printf("%s\n", str);
+ fputc('\n', stdout);
+ fflush(stdout);
}
void RE_FreeRenderResult(RenderResult *res)
@@ -277,7 +279,7 @@ static void pop_render_result(Render *re)
/* NOTE: OpenEXR only supports 32 chars for layer+pass names
In blender we now use max 10 chars for pass, max 20 for layer */
-static char *get_pass_name(int passtype, int channel)
+static const char *get_pass_name(int passtype, int channel)
{
if(passtype == SCE_PASS_COMBINED) {
@@ -448,24 +450,29 @@ static int passtype_from_name(char *str)
return 0;
}
-static void render_unique_exr_name(Render *re, char *str, int sample)
+static void scene_unique_exr_name(Scene *scene, char *str, int sample)
{
char di[FILE_MAX], name[FILE_MAXFILE+MAX_ID_NAME+100], fi[FILE_MAXFILE];
- BLI_strncpy(di, G.sce, FILE_MAX);
+ BLI_strncpy(di, G.main->name, FILE_MAX);
BLI_splitdirstring(di, fi);
if(sample==0)
- sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
+ BLI_snprintf(name, sizeof(name), "%s_%s.exr", fi, scene->id.name+2);
else
- sprintf(name, "%s_%s%d.exr", fi, re->scene->id.name+2, sample);
+ BLI_snprintf(name, sizeof(name), "%s_%s%d.exr", fi, scene->id.name+2, sample);
BLI_make_file_string("/", str, btempdir, name);
}
+static void render_unique_exr_name(Render *re, char *str, int sample)
+{
+ scene_unique_exr_name(re->scene, str, sample);
+}
+
static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype)
{
- char *typestr= get_pass_name(passtype, 0);
+ const char *typestr= get_pass_name(passtype, 0);
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), typestr);
int rectsize= rr->rectx*rr->recty*channels;
@@ -568,7 +575,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
BLI_addtail(&rr->layers, rl);
- strcpy(rl->name, srl->name);
+ BLI_strncpy(rl->name, srl->name, sizeof(rl->name));
rl->lay= srl->lay;
rl->lay_zmask= srl->lay_zmask;
rl->layflag= srl->layflag;
@@ -802,7 +809,7 @@ static char *make_pass_name(RenderPass *rpass, int chan)
/* filename already made absolute */
/* called from within UI, saves both rendered result as a file-read result */
-void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress)
+void RE_WriteRenderResult(RenderResult *rr, const char *filename, int compress)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -861,7 +868,7 @@ static void *ml_addlayer_cb(void *base, char *str)
BLI_strncpy(rl->name, str, EXR_LAY_MAXNAME);
return rl;
}
-static void ml_addpass_cb(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id)
+static void ml_addpass_cb(void *UNUSED(base), void *lay, char *str, float *rect, int totchan, char *chan_id)
{
RenderLayer *rl= lay;
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), "loaded pass");
@@ -915,11 +922,11 @@ static void renderresult_add_names(RenderResult *rr)
for(rl= rr->layers.first; rl; rl= rl->next)
for(rpass= rl->passes.first; rpass; rpass= rpass->next)
- strcpy(rpass->name, get_pass_name(rpass->passtype, -1));
+ BLI_strncpy(rpass->name, get_pass_name(rpass->passtype, -1), sizeof(rpass->name));
}
/* called for reading temp files, and for external engines */
-static int read_render_result_from_file(char *filename, RenderResult *rr)
+static int read_render_result_from_file(const char *filename, RenderResult *rr)
{
RenderLayer *rl;
RenderPass *rpass;
@@ -1158,6 +1165,18 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->resultmutex);
}
+ RE_InitRenderCB(re);
+
+ /* init some variables */
+ re->ycor= 1.0f;
+
+ return re;
+}
+
+/* called for new renders and when finishing rendering so
+ * we calways have valid callbacks on a render */
+void RE_InitRenderCB(Render *re)
+{
/* set default empty callbacks */
re->display_init= result_nothing;
re->display_clear= result_nothing;
@@ -1171,11 +1190,6 @@ Render *RE_NewRender(const char *name)
re->stats_draw= stats_nothing;
/* clear callback handles */
re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL;
-
- /* init some variables */
- re->ycor= 1.0f;
-
- return re;
}
/* only call this while you know it will remove the link too */
@@ -1235,6 +1249,9 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer *
return;
}
+ if((re->r.mode & (R_OSA))==0)
+ re->r.scemode &= ~R_FULL_SAMPLE;
+
#ifdef WITH_OPENEXR
if(re->r.scemode & R_FULL_SAMPLE)
re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */
@@ -1387,7 +1404,7 @@ void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
re->test_break= f;
re->tbh= handle;
}
-void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
+void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, const char *str))
{
re->error= f;
re->erh= handle;
@@ -1398,7 +1415,7 @@ void RE_error_cb(Render *re, void *handle, void (*f)(void *handle, char *str))
/* object is considered fully prepared on correct time etc */
/* includes lights */
-void RE_AddObject(Render *re, Object *ob)
+void RE_AddObject(Render *UNUSED(re), Object *UNUSED(ob))
{
}
@@ -1478,14 +1495,15 @@ static void *do_part_thread(void *pa_v)
float panorama_pixel_rot(Render *re)
{
float psize, phi, xfac;
+ float borderfac= (float)(re->disprect.xmax - re->disprect.xmin) / (float)re->winx;
/* size of 1 pixel mapped to viewplane coords */
- psize= (re->viewplane.xmax-re->viewplane.xmin)/(float)re->winx;
+ psize= (re->viewplane.xmax-re->viewplane.xmin)/(float)(re->winx);
/* angle of a pixel */
phi= atan(psize/re->clipsta);
/* correction factor for viewplane shifting, first calculate how much the viewplane angle is */
- xfac= ((re->viewplane.xmax-re->viewplane.xmin))/(float)re->xparts;
+ xfac= borderfac*((re->viewplane.xmax-re->viewplane.xmin))/(float)re->xparts;
xfac= atan(0.5f*xfac/re->clipsta);
/* and how much the same viewplane angle is wrapped */
psize= 0.5f*phi*((float)re->partx);
@@ -1518,8 +1536,8 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane)
float phi= panorama_pixel_rot(re);
R.panodxp= (re->winx - (best->disprect.xmin + best->disprect.xmax) )/2;
- R.panodxv= ((viewplane->xmax-viewplane->xmin)*R.panodxp)/(float)R.winx;
-
+ R.panodxv= ((viewplane->xmax-viewplane->xmin)*R.panodxp)/(float)(re->winx);
+
/* shift viewplane */
R.viewplane.xmin = viewplane->xmin + R.panodxv;
R.viewplane.xmax = viewplane->xmax + R.panodxv;
@@ -1537,8 +1555,10 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane)
static RenderPart *find_next_part(Render *re, int minx)
{
RenderPart *pa, *best= NULL;
- int centx=re->winx/2, centy=re->winy/2, tot=1;
- int mindist, distx, disty;
+
+ /* long long int's needed because of overflow [#24414] */
+ long long int centx=re->winx/2, centy=re->winy/2, tot=1;
+ long long int mindist= (long long int)re->winx * (long long int)re->winy;
/* find center of rendered parts, image center counts for 1 too */
for(pa= re->parts.first; pa; pa= pa->next) {
@@ -1552,12 +1572,11 @@ static RenderPart *find_next_part(Render *re, int minx)
centy/=tot;
/* closest of the non-rendering parts */
- mindist= re->winx*re->winy;
for(pa= re->parts.first; pa; pa= pa->next) {
if(pa->ready==0 && pa->nr==0) {
- distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2;
- disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2;
- distx= (int)sqrt(distx*distx + disty*disty);
+ long long int distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2;
+ long long int disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2;
+ distx= (long long int)sqrt(distx*distx + disty*disty);
if(distx<mindist) {
if(re->r.mode & R_PANORAMA) {
if(pa->disprect.xmin==minx) {
@@ -1579,7 +1598,7 @@ static void print_part_stats(Render *re, RenderPart *pa)
{
char str[64];
- sprintf(str, "%s, Part %d-%d", re->scene->id.name+2, pa->nr, re->i.totpart);
+ BLI_snprintf(str, sizeof(str), "%s, Part %d-%d", re->scene->id.name+2, pa->nr, re->i.totpart);
re->i.infostr= str;
re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
@@ -1964,7 +1983,7 @@ static void do_render_fields_3d(Render *re)
/* first field, we have to call camera routine for correct aspect and subpixel offset */
RE_SetCamera(re, re->scene->camera);
- if(re->r.mode & R_MBLUR)
+ if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -1984,7 +2003,7 @@ static void do_render_fields_3d(Render *re)
re->field_offs = 0.5f;
}
RE_SetCamera(re, re->scene->camera);
- if(re->r.mode & R_MBLUR)
+ if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -2031,8 +2050,8 @@ static void load_backbuffer(Render *re)
ImBuf *ibuf;
char name[256];
- strcpy(name, re->r.backbuf);
- BLI_path_abs(name, G.sce);
+ BLI_strncpy(name, re->r.backbuf, sizeof(name));
+ BLI_path_abs(name, re->main->name);
BLI_path_frame(name, re->r.cfra, 0);
if(re->backbuf) {
@@ -2041,7 +2060,7 @@ static void load_backbuffer(Render *re)
BKE_image_signal(re->backbuf, NULL, IMA_SIGNAL_RELOAD);
}
- re->backbuf= BKE_add_image_file(name, re->r.cfra);
+ re->backbuf= BKE_add_image_file(name);
ibuf= BKE_image_get_ibuf(re->backbuf, NULL);
if(ibuf==NULL) {
// error() doesnt work with render window open
@@ -2074,7 +2093,7 @@ static void do_render_fields_blur_3d(Render *re)
if(re->r.mode & R_FIELDS)
do_render_fields_3d(re);
- else if(re->r.mode & R_MBLUR)
+ else if(re->r.mode & R_MBLUR && (re->r.scemode & R_FULL_SAMPLE)==0)
do_render_blur_3d(re);
else
do_render_3d(re);
@@ -2188,6 +2207,7 @@ static void ntree_render_scenes(Render *re)
{
bNode *node;
int cfra= re->scene->r.cfra;
+ int restore_scene= 0;
if(re->scene->nodetree==NULL) return;
@@ -2199,12 +2219,19 @@ static void ntree_render_scenes(Render *re)
if(node->type==CMP_NODE_R_LAYERS) {
if(node->id && node->id != (ID *)re->scene) {
if(node->id->flag & LIB_DOIT) {
- render_scene(re, (Scene *)node->id, cfra);
+ Scene *scene = (Scene*)node->id;
+
+ render_scene(re, scene, cfra);
+ restore_scene= (scene != re->scene);
node->id->flag &= ~LIB_DOIT;
}
}
}
}
+
+ /* restore scene if we rendered another last */
+ if(restore_scene)
+ set_scene_bg(re->main, re->scene);
}
/* helper call to detect if theres a composite with render-result node */
@@ -2226,7 +2253,7 @@ static int composite_needs_render(Scene *sce)
}
/* bad call... need to think over proper method still */
-static void render_composit_stats(void *unused, char *str)
+static void render_composit_stats(void *UNUSED(arg), char *str)
{
R.i.infostr= str;
R.stats_draw(R.sdh, &R.i);
@@ -2312,10 +2339,17 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
BLI_rw_mutex_unlock(&re->resultmutex);
}
-void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
+/* called externally, via compositor */
+void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
{
Scene *scene;
bNode *node;
+
+ /* default start situation */
+ G.afbreek= 0;
+
+ re->main= bmain;
+ re->scene= sce;
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
@@ -2451,8 +2485,9 @@ static void do_render_seq(Render * re)
{
static int recurs_depth = 0;
struct ImBuf *ibuf;
- RenderResult *rr = re->result;
+ RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */
int cfra = re->r.cfra;
+ SeqRenderData context;
re->i.cfra= cfra;
@@ -2463,9 +2498,15 @@ static void do_render_seq(Render * re)
recurs_depth++;
- ibuf= give_ibuf_seq(re->main, re->scene, rr->rectx, rr->recty, cfra, 0, 100.0);
+ context = seq_new_render_data(re->main, re->scene,
+ re->result->rectx, re->result->recty,
+ 100);
+
+ ibuf = give_ibuf_seq(context, cfra, 0);
recurs_depth--;
+
+ rr = re->result;
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
@@ -2478,10 +2519,10 @@ static void do_render_seq(Render * re)
* render engine delivers */
if(re->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
if(ibuf->profile == IB_PROFILE_LINEAR_RGB)
- memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
+ memcpy(rr->rectf, ibuf->rect_float, 4*sizeof(float)*rr->rectx*rr->recty);
else
srgb_to_linearrgb_rgba_rgba_buf(rr->rectf, ibuf->rect_float, rr->rectx*rr->recty);
-
+
}
else {
if(ibuf->profile != IB_PROFILE_LINEAR_RGB)
@@ -2507,6 +2548,12 @@ static void do_render_seq(Render * re)
/* if (R.rectz) freeN(R.rectz); */
/* R.rectz = BLI_dupallocN(ibuf->zbuf); */
/* } */
+
+ /* Same things as above, old rectf can hang around from previous render. */
+ if(rr->rectf) {
+ MEM_freeN(rr->rectf);
+ rr->rectf= NULL;
+ }
}
if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
@@ -2528,6 +2575,9 @@ static void do_render_seq(Render * re)
}
BLI_rw_mutex_unlock(&re->resultmutex);
+
+ /* just in case this flag went missing at some point */
+ re->r.scemode |= R_DOSEQ;
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2573,61 +2623,108 @@ static void do_render_all_options(Render *re)
}
}
-static int is_rendering_allowed(Render *re)
+static int check_valid_camera(Scene *scene)
+{
+ int check_comp= 1;
+
+ if (scene->camera == NULL)
+ scene->camera= scene_find_camera(scene);
+
+ if(scene->r.scemode&R_DOSEQ) {
+ if(scene->ed) {
+ Sequence *seq= scene->ed->seqbase.first;
+
+ check_comp= 0;
+
+ while(seq) {
+ if(seq->type == SEQ_SCENE) {
+ if(!seq->scene_camera) {
+ if(!seq->scene->camera && !scene_find_camera(seq->scene)) {
+ if(seq->scene == scene) {
+ /* for current scene camera could be unneeded due to compisite nodes */
+ check_comp= 1;
+ } else {
+ /* for other scenes camera is necessary */
+ return 0;
+ }
+ }
+ }
+ }
+
+ seq= seq->next;
+ }
+ }
+ }
+
+ if(check_comp) { /* no sequencer or sequencer depends on compositor */
+ if(scene->r.scemode&R_DOCOMP && scene->use_nodes) {
+ bNode *node= scene->nodetree->nodes.first;
+
+ while(node) {
+ if(node->type == CMP_NODE_R_LAYERS) {
+ Scene *sce= node->id ? (Scene*)node->id : scene;
+
+ if(!sce->camera && !scene_find_camera(sce)) {
+ /* all render layers nodes need camera */
+ return 0;
+ }
+ }
+
+ node= node->next;
+ }
+ } else return scene->camera != NULL;
+ }
+
+ return 1;
+}
+
+int RE_is_rendering_allowed(Scene *scene, void *erh, void (*error)(void *handle, const char *str))
{
SceneRenderLayer *srl;
/* forbidden combinations */
- if(re->r.mode & R_PANORAMA) {
- if(re->r.mode & R_BORDER) {
- re->error(re->erh, "No border supported for Panorama");
- return 0;
- }
- if(re->r.mode & R_ORTHO) {
- re->error(re->erh, "No Ortho render possible for Panorama");
+ if(scene->r.mode & R_PANORAMA) {
+ if(scene->r.mode & R_ORTHO) {
+ error(erh, "No Ortho render possible for Panorama");
return 0;
}
}
- if(re->r.mode & R_BORDER) {
- if(re->r.border.xmax <= re->r.border.xmin ||
- re->r.border.ymax <= re->r.border.ymin) {
- re->error(re->erh, "No border area selected.");
+ if(scene->r.mode & R_BORDER) {
+ if(scene->r.border.xmax <= scene->r.border.xmin ||
+ scene->r.border.ymax <= scene->r.border.ymin) {
+ error(erh, "No border area selected.");
return 0;
}
}
- if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+ if(scene->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
char str[FILE_MAX];
- render_unique_exr_name(re, str, 0);
+ scene_unique_exr_name(scene, str, 0);
if (BLI_is_writable(str)==0) {
- re->error(re->erh, "Can not save render buffers, check the temp default path");
+ error(erh, "Can not save render buffers, check the temp default path");
return 0;
}
- /* no osa + fullsample won't work... */
- if(re->osa==0)
- re->r.scemode &= ~R_FULL_SAMPLE;
-
/* no fullsample and edge */
- if((re->r.scemode & R_FULL_SAMPLE) && (re->r.mode & R_EDGE)) {
- re->error(re->erh, "Full Sample doesn't support Edge Enhance");
+ if((scene->r.scemode & R_FULL_SAMPLE) && (scene->r.mode & R_EDGE)) {
+ error(erh, "Full Sample doesn't support Edge Enhance");
return 0;
}
}
else
- re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
+ scene->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
- if(re->r.scemode & R_DOCOMP) {
- if(re->scene->use_nodes) {
- bNodeTree *ntree= re->scene->nodetree;
+ if(scene->r.scemode & R_DOCOMP) {
+ if(scene->use_nodes) {
+ bNodeTree *ntree= scene->nodetree;
bNode *node;
if(ntree==NULL) {
- re->error(re->erh, "No Nodetree in Scene");
+ error(erh, "No Nodetree in Scene");
return 0;
}
@@ -2635,49 +2732,60 @@ static int is_rendering_allowed(Render *re)
if(node->type==CMP_NODE_COMPOSITE)
break;
-
if(node==NULL) {
- re->error(re->erh, "No Render Output Node in Scene");
+ error(erh, "No Render Output Node in Scene");
return 0;
}
+
+ if(scene->r.scemode & R_FULL_SAMPLE) {
+ if(composite_needs_render(scene)==0) {
+ error(erh, "Full Sample AA not supported without 3d rendering");
+ return 0;
+ }
+ }
}
}
/* check valid camera, without camera render is OK (compo, seq) */
- if(re->scene->camera==NULL)
- re->scene->camera= scene_find_camera(re->scene);
-
- if(!(re->r.scemode & (R_DOSEQ|R_DOCOMP))) {
- if(re->scene->camera==NULL) {
- re->error(re->erh, "No camera");
- return 0;
- }
+ if(!check_valid_camera(scene)) {
+ error(erh, "No camera");
+ return 0;
}
/* layer flag tests */
- if(re->r.scemode & R_SINGLE_LAYER) {
- srl= BLI_findlink(&re->scene->r.layers, re->r.actlay);
+ if(scene->r.scemode & R_SINGLE_LAYER) {
+ srl= BLI_findlink(&scene->r.layers, scene->r.actlay);
/* force layer to be enabled */
srl->layflag &= ~SCE_LAY_DISABLE;
}
- for(srl= re->scene->r.layers.first; srl; srl= srl->next)
+ for(srl= scene->r.layers.first; srl; srl= srl->next)
if(!(srl->layflag & SCE_LAY_DISABLE))
break;
if(srl==NULL) {
- re->error(re->erh, "All RenderLayers are disabled");
+ error(erh, "All RenderLayers are disabled");
return 0;
}
/* renderer */
- if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
- re->error(re->erh, "Unknown render engine set");
+ if(!ELEM(scene->r.renderer, R_INTERN, R_YAFRAY)) {
+ error(erh, "Unknown render engine set");
return 0;
}
+
return 1;
}
-static void update_physics_cache(Render *re, Scene *scene, int anim_init)
+static void validate_render_settings(Render *re)
+{
+ if(re->r.scemode & (R_EXR_TILE_FILE|R_FULL_SAMPLE)) {
+ /* no osa + fullsample won't work... */
+ if(re->r.osa==0)
+ re->r.scemode &= ~R_FULL_SAMPLE;
+ } else re->r.scemode &= ~R_FULL_SAMPLE; /* clear to be sure */
+}
+
+static void update_physics_cache(Render *re, Scene *scene, int UNUSED(anim_init))
{
PTCacheBaker baker;
@@ -2692,7 +2800,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init)
baker.break_data = re->tbh;
baker.progressbar = NULL;
- BKE_ptcache_make_cache(&baker);
+ BKE_ptcache_bake(&baker);
}
/* evaluating scene options for general Blender render */
static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int anim, int anim_init)
@@ -2753,10 +2861,9 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
/* initstate makes new result, have to send changed tags around */
ntreeCompositTagRender(re->scene);
-
- if(!is_rendering_allowed(re))
- return 0;
-
+
+ validate_render_settings(re);
+
re->display_init(re->dih, re->result);
re->display_clear(re->dch, re->result);
@@ -2764,7 +2871,7 @@ static int render_initialize_from_main(Render *re, Main *bmain, Scene *scene, Sc
}
/* general Blender frame render call */
-void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame)
+void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *srl, unsigned int lay, int frame, const short write_still)
{
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
G.rendering= 1;
@@ -2774,13 +2881,27 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr
if(render_initialize_from_main(re, bmain, scene, srl, lay, 0, 0)) {
MEM_reset_peak_memory();
do_render_all_options(re);
+
+ if(write_still && !G.afbreek) {
+ if(BKE_imtype_is_movie(scene->r.imtype)) {
+ /* operator checks this but incase its called from elsewhere */
+ printf("Error: cant write single images with a movie format!\n");
+ }
+ else {
+ char name[FILE_MAX];
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, FALSE);
+
+ /* reports only used for Movie */
+ do_write_image_or_movie(re, scene, NULL, NULL, name);
+ }
+ }
}
-
+
/* UGLY WARNING */
G.rendering= 0;
}
-static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports)
+static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override)
{
char name[FILE_MAX];
RenderResult rres;
@@ -2804,7 +2925,10 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
printf("Append frame %d", scene->r.cfra);
}
else {
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ if(name_override)
+ BLI_strncpy(name, name_override, sizeof(name));
+ else
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
if(re->r.imtype==R_MULTILAYER) {
if(re->result) {
@@ -2813,7 +2937,7 @@ static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, R
}
}
else {
- ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
+ ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0);
/* if not exists, BKE_write_ibuf makes one */
ibuf->rect= (unsigned int *)rres.rect32;
@@ -2894,7 +3018,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
do_render_all_options(re);
if(re->test_break(re->tbh) == 0) {
- if(!do_write_image_or_movie(re, scene, mh, reports))
+ if(!do_write_image_or_movie(re, scene, mh, reports, NULL))
G.afbreek= 1;
}
} else {
@@ -2931,7 +3055,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
/* Touch/NoOverwrite options are only valid for image's */
if(BKE_imtype_is_movie(scene->r.imtype) == 0) {
if(scene->r.mode & (R_NO_OVERWRITE | R_TOUCH))
- BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION);
+ BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype, scene->r.scemode & R_EXTENSION, TRUE);
if(scene->r.mode & R_NO_OVERWRITE && BLI_exist(name)) {
printf("skipping existing frame \"%s\"\n", name);
@@ -2949,7 +3073,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, unsigned int lay, int
if(re->test_break(re->tbh) == 0) {
if(!G.afbreek)
- if(!do_write_image_or_movie(re, scene, mh, reports))
+ if(!do_write_image_or_movie(re, scene, mh, reports, NULL))
G.afbreek= 1;
}
else
@@ -3140,7 +3264,7 @@ int RE_engine_test_break(RenderEngine *engine)
return re->test_break(re->tbh);
}
-void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
+void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
{
Render *re= engine->re;
@@ -3153,7 +3277,7 @@ void RE_engine_update_stats(RenderEngine *engine, char *stats, char *info)
/* loads in image into a result, size must match
* x/y offsets are only used on a partial copy when dimensions dont match */
-void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *filename)
+void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char *filename, int x, int y)
{
ImBuf *ibuf = IMB_loadiffname(filename, IB_rect);
@@ -3164,15 +3288,15 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *file
memcpy(layer->rectf, ibuf->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
} else {
- if ((ibuf->x >= layer->rectx) && (ibuf->y >= layer->recty)) {
+ if ((ibuf->x - x >= layer->rectx) && (ibuf->y - y >= layer->recty)) {
ImBuf *ibuf_clip;
if(ibuf->rect_float==NULL)
IMB_float_from_rect(ibuf);
- ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat, 0);
+ ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat);
if(ibuf_clip) {
- IMB_rectcpy(ibuf_clip, ibuf, 0,0, 0,0, layer->rectx, layer->recty);
+ IMB_rectcpy(ibuf_clip, ibuf, 0,0, x,y, layer->rectx, layer->recty);
memcpy(layer->rectf, ibuf_clip->rect_float, sizeof(float)*4*layer->rectx*layer->recty);
IMB_freeImBuf(ibuf_clip);
@@ -3193,7 +3317,7 @@ void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, char *file
}
}
-void RE_result_load_from_file(RenderResult *result, ReportList *reports, char *filename)
+void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename)
{
if(!read_render_result_from_file(filename, result)) {
BKE_reportf(reports, RPT_ERROR, "RE_result_rect_from_file: failed to load '%s'\n", filename);
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index 768fc4ecacb..a814b74dcfc 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -27,14 +27,14 @@
#include <float.h>
#include <math.h>
#include <string.h>
+
#include "BLI_math.h"
+#include "BLI_utildefines.h"
/* External modules: */
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
-
-
#include "DNA_camera_types.h"
#include "DNA_group_types.h"
#include "DNA_material_types.h"
@@ -48,7 +48,7 @@
#include "BKE_global.h"
#include "BKE_material.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
/* own module */
#include "render_types.h"
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index 67f1fee4f41..5cf65eccd9a 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_kdopbvh.h"
+#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -49,6 +50,7 @@
#include "render_types.h"
#include "renderdatabase.h"
#include "texture.h"
+#include "pointdensity.h"
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
@@ -94,7 +96,7 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
{
DerivedMesh* dm;
ParticleKey state;
- ParticleSimulationData sim = {re->scene, ob, psys, NULL};
+ ParticleSimulationData sim= {0};
ParticleData *pa=NULL;
float cfra = BKE_curframe(re->scene);
int i, childexists;
@@ -103,10 +105,9 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
float partco[3];
float obview[4][4];
-
/* init everything */
if (!psys || !ob || !pd) return;
-
+
mul_m4_m4m4(obview, re->viewinv, ob->obmat);
/* Just to create a valid rendering context for particles */
@@ -119,6 +120,10 @@ static void pointdensity_cache_psys(Render *re, PointDensity *pd, Object *ob, Pa
return;
}
+ sim.scene= re->scene;
+ sim.ob= ob;
+ sim.psys= psys;
+
/* in case ob->imat isn't up-to-date */
invert_m4_m4(ob->imat, ob->obmat);
@@ -248,11 +253,12 @@ static void cache_pointdensity(Render *re, Tex *tex)
}
else if (pd->source == TEX_PD_OBJECT) {
Object *ob = pd->object;
- if (ob) pointdensity_cache_object(re, pd, ob);
+ if (ob && ob->type == OB_MESH)
+ pointdensity_cache_object(re, pd, ob);
}
}
-static void free_pointdensity(Render *re, Tex *tex)
+static void free_pointdensity(Render *UNUSED(re), Tex *tex)
{
PointDensity *pd = tex->pd;
@@ -320,7 +326,7 @@ typedef struct PointDensityRangeData
int offset;
} PointDensityRangeData;
-void accum_density(void *userdata, int index, float squared_dist)
+static void accum_density(void *userdata, int index, float squared_dist)
{
PointDensityRangeData *pdr = (PointDensityRangeData *)userdata;
const float dist = (pdr->squared_radius - squared_dist) / pdr->squared_radius * 0.5f;
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 724fd9a3110..99e17a1999f 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -37,15 +37,16 @@
#include "DNA_material_types.h"
#include "DNA_lamp_types.h"
-#include "BKE_global.h"
-#include "BKE_node.h"
-#include "BKE_utildefines.h"
-
#include "BLI_blenlib.h"
#include "BLI_cpu.h"
#include "BLI_jitter.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_node.h"
+
#include "PIL_time.h"
@@ -59,13 +60,13 @@
#include "texture.h"
#include "volumetric.h"
-#include "RE_raytrace.h"
+#include "rayintersection.h"
#include "rayobject.h"
#include "raycounter.h"
#define RAY_TRA 1
-#define RAY_TRAFLIP 2
+#define RAY_INSIDE 2
#define DEPTH_SHADOW_TRA 10
@@ -194,7 +195,7 @@ void freeraytree(Render *re)
static int is_raytraceable_vlr(Render *re, VlakRen *vlr)
{
/* note: volumetric must be tracable, wire must not */
- if((re->flag & R_BAKE_TRACE) || (vlr->mat->mode & MA_TRACEBLE) || (vlr->mat->material_type == MA_TYPE_VOLUME))
+ if((re->flag & R_BAKE_TRACE) || (vlr->flag & R_TRACEBLE) || (vlr->mat->material_type == MA_TYPE_VOLUME))
if(vlr->mat->material_type != MA_TYPE_WIRE)
return 1;
return 0;
@@ -208,12 +209,13 @@ static int is_raytraceable(Render *re, ObjectInstanceRen *obi)
if(re->excludeob && obr->ob == re->excludeob)
return 0;
- for(v=0;v<obr->totvlak;v++)
- {
+ for(v=0;v<obr->totvlak;v++) {
VlakRen *vlr = obr->vlaknodes[v>>8].vlak + (v&255);
+
if(is_raytraceable_vlr(re, vlr))
return 1;
}
+
return 0;
}
@@ -443,11 +445,7 @@ void makeraytree(Render *re)
if(re->r.raytrace_structure == R_RAYSTRUCTURE_OCTREE)
re->r.raytrace_options &= ~( R_RAYTRACE_USE_INSTANCES | R_RAYTRACE_USE_LOCAL_COORDS);
- if(G.f & G_DEBUG) {
- BENCH(makeraytree_single(re), tree_build);
- }
- else
- makeraytree_single(re);
+ makeraytree_single(re);
if(test_break(re))
{
@@ -468,7 +466,9 @@ void makeraytree(Render *re)
max[i] += 0.01f;
sub[i] = max[i]-min[i];
}
- re->maxdist = sqrt( sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2] );
+
+ re->maxdist= sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2];
+ if(re->maxdist > 0.0f) re->maxdist= sqrt(re->maxdist);
re->i.infostr= "Raytree finished";
re->stats_draw(re->sdh, &re->i);
@@ -479,21 +479,52 @@ void makeraytree(Render *re)
#endif
}
+/* if(shi->osatex) */
+static void shade_ray_set_derivative(ShadeInput *shi)
+{
+ float *v1= shi->v1->co;
+ float *v2= shi->v2->co;
+ float *v3= shi->v3->co;
+ float detsh, t00, t10, t01, t11, xn, yn, zn;
+ int axis1, axis2;
+
+ /* find most stable axis to project */
+ xn= fabs(shi->facenor[0]);
+ yn= fabs(shi->facenor[1]);
+ zn= fabs(shi->facenor[2]);
+
+ if(zn>=xn && zn>=yn) { axis1= 0; axis2= 1; }
+ else if(yn>=xn && yn>=zn) { axis1= 0; axis2= 2; }
+ else { axis1= 1; axis2= 2; }
+
+ /* compute u,v and derivatives */
+ t00= v3[axis1]-v1[axis1]; t01= v3[axis2]-v1[axis2];
+ t10= v3[axis1]-v2[axis1]; t11= v3[axis2]-v2[axis2];
+
+ detsh= 1.0f/(t00*t11-t10*t01);
+ t00*= detsh; t01*=detsh;
+ t10*=detsh; t11*=detsh;
+
+ shi->dx_u= shi->dxco[axis1]*t11- shi->dxco[axis2]*t10;
+ shi->dx_v= shi->dxco[axis2]*t00- shi->dxco[axis1]*t01;
+ shi->dy_u= shi->dyco[axis1]*t11- shi->dyco[axis2]*t10;
+ shi->dy_v= shi->dyco[axis2]*t00- shi->dyco[axis1]*t01;
+
+}
void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
{
ObjectInstanceRen *obi= (ObjectInstanceRen*)is->hit.ob;
VlakRen *vlr= (VlakRen*)is->hit.face;
- int osatex= 0;
/* set up view vector */
- VECCOPY(shi->view, is->vec);
+ VECCOPY(shi->view, is->dir);
/* render co */
- shi->co[0]= is->start[0]+is->labda*(shi->view[0]);
- shi->co[1]= is->start[1]+is->labda*(shi->view[1]);
- shi->co[2]= is->start[2]+is->labda*(shi->view[2]);
+ shi->co[0]= is->start[0]+is->dist*(shi->view[0]);
+ shi->co[1]= is->start[1]+is->dist*(shi->view[1]);
+ shi->co[2]= is->start[2]+is->dist*(shi->view[2]);
normalize_v3(shi->view);
@@ -503,32 +534,17 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
shi->mat= vlr->mat;
shade_input_init_material(shi);
- // Osa structs we leave unchanged now
- SWAP(int, osatex, shi->osatex);
-
- shi->dxco[0]= shi->dxco[1]= shi->dxco[2]= 0.0f;
- shi->dyco[0]= shi->dyco[1]= shi->dyco[2]= 0.0f;
-
- // but, set Osa stuff to zero where it can confuse texture code
- if(shi->mat->texco & (TEXCO_NORM|TEXCO_REFL) ) {
- shi->dxno[0]= shi->dxno[1]= shi->dxno[2]= 0.0f;
- shi->dyno[0]= shi->dyno[1]= shi->dyno[2]= 0.0f;
- }
-
- if(vlr->v4) {
- if(is->isect==2)
- shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
- }
- else {
+ if(is->isect==2)
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
+ else
shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
shi->u= is->u;
shi->v= is->v;
shi->dx_u= shi->dx_v= shi->dy_u= shi->dy_v= 0.0f;
+ if(shi->osatex)
+ shade_ray_set_derivative(shi);
shade_input_set_normals(shi);
shade_input_set_shade_texco(shi);
@@ -560,8 +576,6 @@ void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
/* raytrace likes to separate the spec color */
VECSUB(shr->diff, shr->combined, shr->spec);
}
-
- SWAP(int, osatex, shi->osatex); // XXXXX!!!!
}
@@ -695,25 +709,18 @@ static void ray_fadeout(Isect *is, ShadeInput *shi, float *col, float *blendcol,
/* the main recursive tracer itself
* note: 'col' must be initialized */
-static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *vec, float *col, ObjectInstanceRen *obi, VlakRen *vlr, int traflag)
+static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *dir, float *col, ObjectInstanceRen *obi, VlakRen *vlr, int traflag)
{
- ShadeInput shi;
- ShadeResult shr;
+ ShadeInput shi= {0};
Isect isec;
- float f, f1, fr, fg, fb;
- float ref[3];
float dist_mir = origshi->mat->dist_mir;
-
- /* Warning, This is not that nice, and possibly a bit slow for every ray,
- however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
- memset(&shi, 0, sizeof(ShadeInput));
- /* end warning! - Campbell */
VECCOPY(isec.start, start);
- VECCOPY(isec.vec, vec );
- isec.labda = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
+ VECCOPY(isec.dir, dir );
+ isec.dist = dist_mir > 0 ? dist_mir : RE_RAYTRACE_MAXDIST;
isec.mode= RE_RAY_MIRROR;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec.check = RE_CHECK_VLR_RENDER;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.orig.ob = obi;
@@ -721,11 +728,16 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
RE_RC_INIT(isec, shi);
if(RE_rayobject_raycast(R.raytree, &isec)) {
+ ShadeResult shr= {{0}};
float d= 1.0f;
+
+ /* for as long we don't have proper dx/dy transform for rays we copy over original */
+ VECCOPY(shi.dxco, origshi->dxco);
+ VECCOPY(shi.dyco, origshi->dyco);
shi.mask= origshi->mask;
shi.osatex= origshi->osatex;
- shi.depth= 1; /* only used to indicate tracing */
+ shi.depth= origshi->depth + 1; /* only used to indicate tracing */
shi.thread= origshi->thread;
//shi.sample= 0; // memset above, so dont need this
shi.xs= origshi->xs;
@@ -737,16 +749,16 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
shi.light_override= origshi->light_override;
shi.mat_override= origshi->mat_override;
- memset(&shr, 0, sizeof(ShadeResult));
-
shade_ray(&isec, &shi, &shr);
- if (traflag & RAY_TRA)
+ /* ray has traveled inside the material, so shade by transmission */
+ if (traflag & RAY_INSIDE)
d= shade_by_transmission(&isec, &shi, &shr);
if(depth>0) {
+ float fr, fg, fb, f, f1;
if((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f) {
- float nf, f, f1, refract[3], tracol[4];
+ float nf, f, refract[3], tracol[4];
tracol[0]= shi.r;
tracol[1]= shi.g;
@@ -754,21 +766,33 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
tracol[3]= col[3]; // we pass on and accumulate alpha
if((shi.mat->mode & MA_TRANSP) && (shi.mat->mode & MA_RAYTRANSP)) {
- /* odd depths: use normal facing viewer, otherwise flip */
- if(traflag & RAY_TRAFLIP) {
+ if(traflag & RAY_INSIDE) {
+ /* inside the material, so use inverse normal */
float norm[3];
norm[0]= - shi.vn[0];
norm[1]= - shi.vn[1];
norm[2]= - shi.vn[2];
- if (!refraction(refract, norm, shi.view, shi.ang))
+
+ if (refraction(refract, norm, shi.view, shi.ang)) {
+ /* ray comes out from the material into air */
+ traflag &= ~RAY_INSIDE;
+ }
+ else {
+ /* total internal reflection (ray stays inside the material) */
reflection(refract, norm, shi.view, shi.vn);
+ }
}
else {
- if (!refraction(refract, shi.vn, shi.view, shi.ang))
+ if (refraction(refract, shi.vn, shi.view, shi.ang)) {
+ /* ray goes in to the material from air */
+ traflag |= RAY_INSIDE;
+ }
+ else {
+ /* total external reflection (ray doesn't enter the material) */
reflection(refract, shi.vn, shi.view, shi.vn);
+ }
}
- traflag |= RAY_TRA;
- traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.obi, shi.vlr, traflag ^ RAY_TRAFLIP);
+ traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.obi, shi.vlr, traflag);
}
else
traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.obi, shi.vlr, 0);
@@ -799,6 +823,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
if(f!=0.0f) {
float mircol[4];
+ float ref[3];
reflection(ref, shi.vn, shi.view, NULL);
traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.obi, shi.vlr, 0);
@@ -830,7 +855,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
/* max ray distance set, but found an intersection, so fade this color
* out towards the sky/material color for a smooth transition */
- ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, vec);
+ ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, dir);
ray_fadeout(&isec, &shi, col, blendcol, dist_mir);
}
}
@@ -842,7 +867,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
}
else {
- ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, vec);
+ ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, dir);
}
RE_RC_MERGE(&origshi->raycounter, &shi.raycounter);
}
@@ -1265,6 +1290,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
{
QMCSampler *qsa=NULL;
int samp_type;
+ int traflag=0;
float samp3d[3], orthx[3], orthy[3];
float v_refract[3], v_refract_new[3];
@@ -1292,7 +1318,18 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
while (samples < max_samples) {
- refraction(v_refract, shi->vn, shi->view, shi->ang);
+ if(refraction(v_refract, shi->vn, shi->view, shi->ang)) {
+ traflag |= RAY_INSIDE;
+ } else {
+ /* total external reflection can happen for materials with IOR < 1.0 */
+ if((shi->vlr->flag & R_SMOOTH))
+ reflection(v_refract, shi->vn, shi->view, shi->facenor);
+ else
+ reflection(v_refract, shi->vn, shi->view, NULL);
+
+ /* can't blur total external reflection */
+ max_samples = 1;
+ }
if (max_samples > 1) {
/* get a quasi-random vector from a phong-weighted disc */
@@ -1314,7 +1351,7 @@ static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
sampcol[0]= sampcol[1]= sampcol[2]= sampcol[3]= 0.0f;
- traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, RAY_TRA|RAY_TRAFLIP);
+ traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->obi, shi->vlr, traflag);
col[0] += sampcol[0];
col[1] += sampcol[1];
@@ -1465,8 +1502,8 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
float diff[3];
int do_tra, do_mir;
- do_tra= ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f);
- do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
+ do_tra= ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f && (shi->depth <= shi->mat->ray_depth_tra));
+ do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f && (shi->depth <= shi->mat->ray_depth));
/* raytrace mirror amd refract like to separate the spec color */
if(shi->combinedflag & SCE_PASS_SPEC)
@@ -1497,7 +1534,7 @@ void ray_trace(ShadeInput *shi, ShadeResult *shr)
if(!(shi->combinedflag & SCE_PASS_REFRACT))
VECSUB(diff, diff, shr->refr);
- shr->alpha= tracol[3];
+ shr->alpha= MIN2(1.0f, tracol[3]);
}
if(do_mir) {
@@ -1560,13 +1597,13 @@ static void addAlphaLight(float *shadfac, float *col, float alpha, float filter)
shadfac[3]= (1.0f-alpha)*shadfac[3];
}
-static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int traflag)
+static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int traflag, float col[4])
{
/* ray to lamp, find first face that intersects, check alpha properties,
if it has col[3]>0.0f continue. so exit when alpha is full */
ShadeInput shi;
ShadeResult shr;
- float initial_labda = is->labda;
+ float initial_dist = is->dist;
if(RE_rayobject_raycast(R.raytree, is)) {
float d= 1.0f;
@@ -1577,7 +1614,7 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
memset(&shi, 0, sizeof(ShadeInput));
/* end warning! - Campbell */
- shi.depth= 1; /* only used to indicate tracing */
+ shi.depth= origshi->depth + 1; /* only used to indicate tracing */
shi.mask= origshi->mask;
shi.thread= origshi->thread;
shi.passflag= SCE_PASS_COMBINED;
@@ -1594,21 +1631,26 @@ static void ray_trace_shadow_tra(Isect *is, ShadeInput *origshi, int depth, int
d= shade_by_transmission(is, &shi, &shr);
/* mix colors based on shadfac (rgb + amount of light factor) */
- addAlphaLight(is->col, shr.diff, shr.alpha, d*shi.mat->filter);
+ addAlphaLight(col, shr.diff, shr.alpha, d*shi.mat->filter);
} else if (shi.mat->material_type == MA_TYPE_VOLUME) {
- QUATCOPY(is->col, shr.combined);
- is->col[3] = 1.f;
+ const float a = col[3];
+
+ col[0] = a*col[0] + shr.alpha*shr.combined[0];
+ col[1] = a*col[1] + shr.alpha*shr.combined[1];
+ col[2] = a*col[2] + shr.alpha*shr.combined[2];
+
+ col[3] = (1.0 - shr.alpha)*a;
}
- if(depth>0 && is->col[3]>0.0f) {
+ if(depth>0 && col[3]>0.0f) {
/* adapt isect struct */
VECCOPY(is->start, shi.co);
- is->labda = initial_labda-is->labda;
+ is->dist = initial_dist-is->dist;
is->orig.ob = shi.obi;
is->orig.face = shi.vlr;
- ray_trace_shadow_tra(is, origshi, depth-1, traflag | RAY_TRA);
+ ray_trace_shadow_tra(is, origshi, depth-1, traflag | RAY_TRA, col);
}
RE_RC_MERGE(&origshi->raycounter, &shi.raycounter);
@@ -1655,8 +1697,8 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
vec[2]-= vec[2];
}
- VECCOPY(isec.vec, vec );
- isec.labda = RE_RAYTRACE_MAXDIST;
+ VECCOPY(isec.dir, vec );
+ isec.dist = RE_RAYTRACE_MAXDIST;
if(RE_rayobject_raycast(R.raytree, &isec)) {
float fac;
@@ -1667,7 +1709,7 @@ int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
/* end warning! - Campbell */
shade_ray(&isec, &shi, &shr_t);
- fac= isec.labda*isec.labda;
+ fac= isec.dist*isec.dist;
fac= 1.0f;
accum[0]+= fac*(shr_t.diff[0]+shr_t.spec[0]);
accum[1]+= fac*(shr_t.diff[1]+shr_t.spec[1]);
@@ -1850,7 +1892,8 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_NON_SOLID_MATERIAL;
+ isec.check = RE_CHECK_VLR_NON_SOLID_MATERIAL;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.hit.ob = 0;
@@ -1885,7 +1928,7 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
else {
VECCOPY(nrm, shi->facenor);
}
-
+
ortho_basis_v3v3_v3( up, side,nrm);
/* sampling init */
@@ -1903,7 +1946,6 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
QMC_initPixel(qsa, shi->thread);
-
while (samples < max_samples) {
/* sampling, returns quasi-random vector in unit hemisphere */
@@ -1915,15 +1957,15 @@ static void ray_ao_qmc(ShadeInput *shi, float *ao, float *env)
normalize_v3(dir);
- isec.vec[0] = -dir[0];
- isec.vec[1] = -dir[1];
- isec.vec[2] = -dir[2];
- isec.labda = maxdist;
+ isec.dir[0] = -dir[0];
+ isec.dir[1] = -dir[1];
+ isec.dir[2] = -dir[2];
+ isec.dist = maxdist;
prev = fac;
if(RE_rayobject_raycast(R.raytree, &isec)) {
- if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.labda*R.wrld.aodistfac);
+ if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.dist*R.wrld.aodistfac);
else fac+= 1.0f;
}
else if(envcolor!=WO_AOPLAIN) {
@@ -1989,7 +2031,8 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *ao, float *env)
RE_RC_INIT(isec, *shi);
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec.check = RE_CHECK_VLR_RENDER;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
isec.hint = 0;
isec.hit.ob = 0;
@@ -2050,15 +2093,15 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *ao, float *env)
actual++;
- /* always set start/vec/labda */
- isec.vec[0] = -vec[0];
- isec.vec[1] = -vec[1];
- isec.vec[2] = -vec[2];
- isec.labda = maxdist;
+ /* always set start/vec/dist */
+ isec.dir[0] = -vec[0];
+ isec.dir[1] = -vec[1];
+ isec.dir[2] = -vec[2];
+ isec.dist = maxdist;
/* do the trace */
if(RE_rayobject_raycast(R.raytree, &isec)) {
- if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.labda*R.wrld.aodistfac);
+ if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.dist*R.wrld.aodistfac);
else sh+= 1.0f;
}
else if(envcolor!=WO_AOPLAIN) {
@@ -2209,7 +2252,8 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
RE_rayobject_hint_bb( R.raytree, &bb_hint, min, max);
isec->hint = &bb_hint;
- isec->skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec->check = RE_CHECK_VLR_RENDER;
+ isec->skip = RE_SKIP_VLR_NEIGHBOUR;
VECCOPY(vec, lampco);
while (samples < max_samples) {
@@ -2272,26 +2316,25 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
}
VECCOPY(isec->start, co);
- isec->vec[0] = end[0]-isec->start[0];
- isec->vec[1] = end[1]-isec->start[1];
- isec->vec[2] = end[2]-isec->start[2];
- isec->labda = 1.0f; // * normalize_v3(isec->vec);
+ isec->dir[0] = end[0]-isec->start[0];
+ isec->dir[1] = end[1]-isec->start[1];
+ isec->dir[2] = end[2]-isec->start[2];
+ isec->dist = normalize_v3(isec->dir);
/* trace the ray */
if(isec->mode==RE_RAY_SHADOW_TRA) {
- isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
- isec->col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0);
- shadfac[0] += isec->col[0];
- shadfac[1] += isec->col[1];
- shadfac[2] += isec->col[2];
- shadfac[3] += isec->col[3];
+ ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ shadfac[0] += col[0];
+ shadfac[1] += col[1];
+ shadfac[2] += col[2];
+ shadfac[3] += col[3];
/* for variance calc */
- colsq[0] += isec->col[0]*isec->col[0];
- colsq[1] += isec->col[1]*isec->col[1];
- colsq[2] += isec->col[2]*isec->col[2];
+ colsq[0] += col[0]*col[0];
+ colsq[1] += col[1]*col[1];
+ colsq[2] += col[2]*col[2];
}
else {
if( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
@@ -2374,22 +2417,22 @@ static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, floa
mul_m3_v3(lar->mat, vec);
/* set start and vec */
- isec->vec[0] = vec[0]+lampco[0]-isec->start[0];
- isec->vec[1] = vec[1]+lampco[1]-isec->start[1];
- isec->vec[2] = vec[2]+lampco[2]-isec->start[2];
- isec->labda = 1.0f;
- isec->skip = RE_SKIP_VLR_NEIGHBOUR | RE_SKIP_VLR_RENDER_CHECK;
+ isec->dir[0] = vec[0]+lampco[0]-isec->start[0];
+ isec->dir[1] = vec[1]+lampco[1]-isec->start[1];
+ isec->dir[2] = vec[2]+lampco[2]-isec->start[2];
+ isec->dist = 1.0f;
+ isec->check = RE_CHECK_VLR_RENDER;
+ isec->skip = RE_SKIP_VLR_NEIGHBOUR;
if(isec->mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
- isec->col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0);
- shadfac[0] += isec->col[0];
- shadfac[1] += isec->col[1];
- shadfac[2] += isec->col[2];
- shadfac[3] += isec->col[3];
+ ray_trace_shadow_tra(isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ shadfac[0] += col[0];
+ shadfac[1] += col[1];
+ shadfac[2] += col[2];
+ shadfac[3] += col[3];
}
else if( RE_rayobject_raycast(R.raytree, isec) ) fac+= 1.0f;
@@ -2470,18 +2513,17 @@ void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
shadfac[3]= 1.0f; // 1.0=full light
- /* set up isec vec */
+ /* set up isec.dir */
VECCOPY(isec.start, shi->co);
- VECSUB(isec.vec, lampco, isec.start);
- isec.labda = 1.0f;
+ VECSUB(isec.dir, lampco, isec.start);
+ isec.dist = normalize_v3(isec.dir);
if(isec.mode==RE_RAY_SHADOW_TRA) {
/* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec.col[0]= isec.col[1]= isec.col[2]= 1.0f;
- isec.col[3]= 1.0f;
+ float col[4] = {1.0f, 1.0f, 1.0f, 1.0f};
- ray_trace_shadow_tra(&isec, shi, DEPTH_SHADOW_TRA, 0);
- QUATCOPY(shadfac, isec.col);
+ ray_trace_shadow_tra(&isec, shi, DEPTH_SHADOW_TRA, 0, col);
+ QUATCOPY(shadfac, col);
}
else if(RE_rayobject_raycast(R.raytree, &isec))
shadfac[3]= 0.0f;
@@ -2526,7 +2568,7 @@ static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float
isec.orig.ob = shi->obi;
isec.orig.face = shi->vlr;
- /* set up isec vec */
+ /* set up isec.dir */
VECCOPY(isec.start, shi->co);
VECCOPY(isec.end, lampco);
@@ -2534,11 +2576,11 @@ static void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float
/* we got a face */
/* render co */
- co[0]= isec.start[0]+isec.labda*(isec.vec[0]);
- co[1]= isec.start[1]+isec.labda*(isec.vec[1]);
- co[2]= isec.start[2]+isec.labda*(isec.vec[2]);
+ co[0]= isec.start[0]+isec.dist*(isec.dir[0]);
+ co[1]= isec.start[1]+isec.dist*(isec.dir[1]);
+ co[2]= isec.start[2]+isec.dist*(isec.dir[2]);
- *distfac= len_v3(isec.vec);
+ *distfac= len_v3(isec.dir);
}
else
*distfac= 0.0f;
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/render_texture.c
index 0e98069f884..0da1070679e 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -30,11 +30,10 @@
#include <string.h>
#include <math.h>
-
-
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "DNA_texture_types.h"
#include "DNA_object_types.h"
@@ -52,7 +51,7 @@
#include "BKE_image.h"
#include "BKE_node.h"
#include "BKE_plugin_types.h"
-#include "BKE_utildefines.h"
+
#include "BKE_global.h"
#include "BKE_main.h"
@@ -84,7 +83,7 @@ extern struct Render R;
-void init_render_texture(Render *re, Tex *tex)
+static void init_render_texture(Render *re, Tex *tex)
{
int cfra= re->scene->r.cfra;
@@ -138,7 +137,7 @@ void init_render_textures(Render *re)
}
}
-void end_render_texture(Tex *tex)
+static void end_render_texture(Tex *tex)
{
if(tex && tex->use_nodes && tex->nodetree)
ntreeEndExecTree(tex->nodetree);
@@ -731,7 +730,7 @@ static int texnoise(Tex *tex, TexResult *texres)
div*= 3.0;
}
- texres->tin= ((float)val)/div;;
+ texres->tin= ((float)val)/div;
BRICONT;
return TEX_INT;
@@ -760,18 +759,18 @@ static int plugintex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex
if(osatex) rgbnor= ((TexDoitold)pit->doit)(tex->stype,
pit->data, texvec, dxt, dyt);
else rgbnor= ((TexDoitold)pit->doit)(tex->stype,
- pit->data, texvec, 0, 0);
+ pit->data, texvec, NULL, NULL);
} else {
if(osatex) rgbnor= ((TexDoit)pit->doit)(tex->stype,
pit->data, texvec, dxt, dyt, result);
else rgbnor= ((TexDoit)pit->doit)(tex->stype,
- pit->data, texvec, 0, 0, result);
+ pit->data, texvec, NULL, NULL, result);
}
if (pit->version < 6) {
texres->tin = pit->result[0];
} else {
- texres->tin = result[0];
+ texres->tin = result[0]; /* XXX, assigning garbage value, fixme! */
}
if(rgbnor & TEX_NOR) {
@@ -1353,6 +1352,19 @@ int multitex_ext(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, Te
return multitex_nodes(tex, texvec, dxt, dyt, osatex, texres, 0, 0, NULL, NULL);
}
+/* extern-tex doesn't support nodes (ntreeBeginExec() can't be called when rendering is going on) */
+int multitex_ext_safe(Tex *tex, float *texvec, TexResult *texres)
+{
+ int use_nodes= tex->use_nodes, retval;
+
+ tex->use_nodes= 0;
+ retval= multitex_nodes(tex, texvec, NULL, NULL, 0, texres, 0, 0, NULL, NULL);
+ tex->use_nodes= use_nodes;
+
+ return retval;
+}
+
+
/* ------------------------------------------------------------------------- */
/* in = destination, tex = texture, out = previous color */
@@ -1449,7 +1461,6 @@ void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg
case MTEX_LIGHT:
fact*= facg;
- facm= 1.0-fact;
col= fact*tex[0];
if(col > out[0]) in[0]= col; else in[0]= out[0];
@@ -1552,7 +1563,6 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen
break;
case MTEX_SOFT_LIGHT:
- col= fact*tex;
scf=1.0 - (1.0 - tex) * (1.0 - out);
in= facm*out + fact * ((1.0 - out) * tex * out) + (out * scf);
break;
@@ -1657,8 +1667,445 @@ static void texco_mapping(ShadeInput* shi, Tex* tex, MTex* mtex, float* co, floa
}
}
+/* Bump code from 2.5 development cycle, has a number of bugs, but here for compatibility */
+
+typedef struct CompatibleBump {
+ float nu[3], nv[3], nn[3];
+ float dudnu, dudnv, dvdnu, dvdnv;
+ int nunvdone;
+} CompatibleBump;
+
+static void compatible_bump_init(CompatibleBump *compat_bump)
+{
+ memset(compat_bump, 0, sizeof(*compat_bump));
+
+ compat_bump->dudnu = 1.0f;
+ compat_bump->dvdnv = 1.0f;
+}
+
+static void compatible_bump_uv_derivs(CompatibleBump *compat_bump, ShadeInput *shi, MTex *mtex, int i)
+{
+ // uvmapping only, calculation of normal tangent u/v partial derivatives
+ // (should not be here, dudnu, dudnv, dvdnu & dvdnv should probably be part of ShadeInputUV struct,
+ // nu/nv in ShadeInput and this calculation should then move to shadeinput.c, shade_input_set_shade_texco() func.)
+ // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
+ // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
+ if ((mtex->texflag & MTEX_COMPAT_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
+ if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((mtex->tex->type==TEX_IMAGE) && (mtex->tex->imaflag & TEX_NORMALMAP))) {
+ MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
+ int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
+
+ vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
+
+ // compute ortho basis around normal
+ if(!compat_bump->nunvdone) {
+ // render normal is negated
+ compat_bump->nn[0] = -shi->vn[0];
+ compat_bump->nn[1] = -shi->vn[1];
+ compat_bump->nn[2] = -shi->vn[2];
+ ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn);
+ compat_bump->nunvdone= 1;
+ }
+
+ if (tf) {
+ float *uv1 = tf->uv[j1], *uv2 = tf->uv[j2], *uv3 = tf->uv[j3];
+ const float an[3] = {fabsf(compat_bump->nn[0]), fabsf(compat_bump->nn[1]), fabsf(compat_bump->nn[2])};
+ const int a1 = (an[0] > an[1] && an[0] > an[2]) ? 1 : 0;
+ const int a2 = (an[2] > an[0] && an[2] > an[1]) ? 1 : 2;
+ const float dp1_a1 = shi->v1->co[a1] - shi->v3->co[a1];
+ const float dp1_a2 = shi->v1->co[a2] - shi->v3->co[a2];
+ const float dp2_a1 = shi->v2->co[a1] - shi->v3->co[a1];
+ const float dp2_a2 = shi->v2->co[a2] - shi->v3->co[a2];
+ const float du1 = uv1[0] - uv3[0], du2 = uv2[0] - uv3[0];
+ const float dv1 = uv1[1] - uv3[1], dv2 = uv2[1] - uv3[1];
+ const float dpdu_a1 = dv2*dp1_a1 - dv1*dp2_a1;
+ const float dpdu_a2 = dv2*dp1_a2 - dv1*dp2_a2;
+ const float dpdv_a1 = du1*dp2_a1 - du2*dp1_a1;
+ const float dpdv_a2 = du1*dp2_a2 - du2*dp1_a2;
+ float d = dpdu_a1*dpdv_a2 - dpdv_a1*dpdu_a2;
+ float uvd = du1*dv2 - dv1*du2;
+
+ if (uvd == 0.f) uvd = 1e-5f;
+ if (d == 0.f) d = 1e-5f;
+ d = uvd / d;
+
+ compat_bump->dudnu = (dpdv_a2*compat_bump->nu[a1] - dpdv_a1*compat_bump->nu[a2])*d;
+ compat_bump->dvdnu = (dpdu_a1*compat_bump->nu[a2] - dpdu_a2*compat_bump->nu[a1])*d;
+ compat_bump->dudnv = (dpdv_a2*compat_bump->nv[a1] - dpdv_a1*compat_bump->nv[a2])*d;
+ compat_bump->dvdnv = (dpdu_a1*compat_bump->nv[a2] - dpdu_a2*compat_bump->nv[a1])*d;
+ }
+ }
+ }
+}
+
+static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi, MTex *mtex, Tex *tex, TexResult *texres, float Tnor, float *co, float *dx, float *dy, float *texvec, float *dxt, float *dyt)
+{
+ TexResult ttexr = {0, 0, 0, 0, 0, texres->talpha, NULL}; // temp TexResult
+ float tco[3], texv[3], cd, ud, vd, du, dv, idu, idv;
+ const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
+ const float bf = 0.04f*Tnor*mtex->norfac;
+ int rgbnor;
+ // disable internal bump eval
+ float* nvec = texres->nor;
+ texres->nor = NULL;
+ // du & dv estimates, constant value defaults
+ du = dv = 0.01f;
+
+ // compute ortho basis around normal
+ if(!compat_bump->nunvdone) {
+ // render normal is negated
+ negate_v3_v3(compat_bump->nn, shi->vn);
+ ortho_basis_v3v3_v3(compat_bump->nu, compat_bump->nv, compat_bump->nn);
+ compat_bump->nunvdone= 1;
+ }
+
+ // two methods, either constant based on main image resolution,
+ // (which also works without osa, though of course not always good (or even very bad) results),
+ // or based on tex derivative max values (osa only). Not sure which is best...
+
+ if (!shi->osatex && (tex->type == TEX_IMAGE) && tex->ima) {
+ // in case we have no proper derivatives, fall back to
+ // computing du/dv it based on image size
+ ImBuf* ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
+ if (ibuf) {
+ du = 1.f/(float)ibuf->x;
+ dv = 1.f/(float)ibuf->y;
+ }
+ }
+ else if (shi->osatex) {
+ // we have derivatives, can compute proper du/dv
+ if (tex->type == TEX_IMAGE) { // 2d image, use u & v max. of dx/dy 2d vecs
+ const float adx[2] = {fabsf(dx[0]), fabsf(dx[1])};
+ const float ady[2] = {fabsf(dy[0]), fabsf(dy[1])};
+ du = MAX2(adx[0], ady[0]);
+ dv = MAX2(adx[1], ady[1]);
+ }
+ else { // 3d procedural, estimate from all dx/dy elems
+ const float adx[3] = {fabsf(dx[0]), fabsf(dx[1]), fabsf(dx[2])};
+ const float ady[3] = {fabsf(dy[0]), fabsf(dy[1]), fabsf(dy[2])};
+ du = MAX3(adx[0], adx[1], adx[2]);
+ dv = MAX3(ady[1], ady[1], ady[2]);
+ }
+ }
+
+ // center, main return value
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+ rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, texres);
+ cd = fromrgb ? (texres->tr + texres->tg + texres->tb)*0.33333333f : texres->tin;
+
+ if (mtex->texco == TEXCO_UV) {
+ // for the uv case, use the same value for both du/dv,
+ // since individually scaling the normal derivatives makes them useless...
+ du = MIN2(du, dv);
+ idu = (du < 1e-5f) ? bf : (bf/du);
+
+ // +u val
+ tco[0] = co[0] + compat_bump->dudnu*du;
+ tco[1] = co[1] + compat_bump->dvdnu*du;
+ tco[2] = 0.f;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+
+ // +v val
+ tco[0] = co[0] + compat_bump->dudnv*du;
+ tco[1] = co[1] + compat_bump->dvdnv*du;
+ tco[2] = 0.f;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ vd = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+ }
+ else {
+ float tu[3], tv[3];
+
+ copy_v3_v3(tu, compat_bump->nu);
+ copy_v3_v3(tv, compat_bump->nv);
+
+ idu = (du < 1e-5f) ? bf : (bf/du);
+ idv = (dv < 1e-5f) ? bf : (bf/dv);
+
+ if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
+ mul_mat3_m4_v3(shi->obr->ob->imat, tu);
+ mul_mat3_m4_v3(shi->obr->ob->imat, tv);
+ normalize_v3(tu);
+ normalize_v3(tv);
+ }
+ else if (mtex->texco == TEXCO_GLOB) {
+ mul_mat3_m4_v3(R.viewinv, tu);
+ mul_mat3_m4_v3(R.viewinv, tv);
+ }
+ else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
+ mul_mat3_m4_v3(mtex->object->imat, tu);
+ mul_mat3_m4_v3(mtex->object->imat, tv);
+ normalize_v3(tu);
+ normalize_v3(tv);
+ }
+
+ // +u val
+ tco[0] = co[0] + tu[0]*du;
+ tco[1] = co[1] + tu[1]*du;
+ tco[2] = co[2] + tu[2]*du;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+
+ // +v val
+ tco[0] = co[0] + tv[0]*dv;
+ tco[1] = co[1] + tv[1]*dv;
+ tco[2] = co[2] + tv[2]*dv;
+ texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
+ multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
+ vd = idv*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
+ }
+
+ // bumped normal
+ compat_bump->nu[0] += ud*compat_bump->nn[0];
+ compat_bump->nu[1] += ud*compat_bump->nn[1];
+ compat_bump->nu[2] += ud*compat_bump->nn[2];
+ compat_bump->nv[0] += vd*compat_bump->nn[0];
+ compat_bump->nv[1] += vd*compat_bump->nn[1];
+ compat_bump->nv[2] += vd*compat_bump->nn[2];
+ cross_v3_v3v3(nvec, compat_bump->nu, compat_bump->nv);
+
+ nvec[0] = -nvec[0];
+ nvec[1] = -nvec[1];
+ nvec[2] = -nvec[2];
+ texres->nor = nvec;
+
+ rgbnor |= TEX_NOR;
+ return rgbnor;
+}
+
+/* Improved bump code from later in 2.5 development cycle */
+
+typedef struct NTapBump {
+ int init_done;
+ int iPrevBumpSpace; // 0: uninitialized, 1: objectspace, 2: texturespace, 4: viewspace
+ // bumpmapping
+ float vNorg[3]; // backup copy of shi->vn
+ float vNacc[3]; // original surface normal minus the surface gradient of every bump map which is encountered
+ float vR1[3], vR2[3]; // cross products (sigma_y, original_normal), (original_normal, sigma_x)
+ float sgn_det; // sign of the determinant of the matrix {sigma_x, sigma_y, original_normal}
+ float fPrevMagnitude; // copy of previous magnitude, used for multiple bumps in different spaces
+} NTapBump;
+
+static void ntap_bump_init(NTapBump *ntap_bump)
+{
+ memset(ntap_bump, 0, sizeof(*ntap_bump));
+}
+
+static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, Tex *tex, TexResult *texres, float Tnor, float *co, float *dx, float *dy, float *texvec, float *dxt, float *dyt)
+{
+ TexResult ttexr = {0, 0, 0, 0, 0, texres->talpha, NULL}; // temp TexResult
+
+ const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
+ float Hscale = Tnor*mtex->norfac;
+
+ // 2 channels for 2D texture and 3 for 3D textures.
+ const int nr_channels = (mtex->texco == TEXCO_UV)? 2 : 3;
+ int c, rgbnor, iBumpSpace;
+ float dHdx, dHdy;
+
+ // disable internal bump eval in sampler, save pointer
+ float *nvec = texres->nor;
+ texres->nor = NULL;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima)
+ Hscale *= 13.0f; // appears to be a sensible default value
+ } else
+ Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
+
+ if( !ntap_bump->init_done ) {
+ VECCOPY(ntap_bump->vNacc, shi->vn);
+ VECCOPY(ntap_bump->vNorg, shi->vn);
+ ntap_bump->fPrevMagnitude = 1.0f;
+ ntap_bump->iPrevBumpSpace = 0;
+
+ ntap_bump->init_done = 1;
+ }
+
+ if(!(mtex->texflag & MTEX_5TAP_BUMP)) {
+ // compute height derivatives with respect to output image pixel coordinates x and y
+ float STll[3], STlr[3], STul[3];
+ float Hll, Hlr, Hul;
+
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+
+ for(c=0; c<nr_channels; c++) {
+ // dx contains the derivatives (du/dx, dv/dx)
+ // dy contains the derivatives (du/dy, dv/dy)
+ STll[c] = texvec[c];
+ STlr[c] = texvec[c]+dxt[c];
+ STul[c] = texvec[c]+dyt[c];
+ }
+
+ // clear unused derivatives
+ for(c=nr_channels; c<3; c++) {
+ STll[c] = 0.0f;
+ STlr[c] = 0.0f;
+ STul[c] = 0.0f;
+ }
+
+ // use texres for the center sample, set rgbnor
+ rgbnor = multitex_mtex(shi, mtex, STll, dxt, dyt, texres);
+ Hll = (fromrgb)? RGBTOBW(texres->tr, texres->tg, texres->tb) : texres->tin;
+
+ // use ttexr for the other 2 taps
+ multitex_mtex(shi, mtex, STlr, dxt, dyt, &ttexr);
+ Hlr = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ multitex_mtex(shi, mtex, STul, dxt, dyt, &ttexr);
+ Hul = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ dHdx = Hscale*(Hlr - Hll);
+ dHdy = Hscale*(Hul - Hll);
+ }
+ else {
+ /* same as above, but doing 5 taps, increasing quality at cost of speed */
+ float STc[3], STl[3], STr[3], STd[3], STu[3];
+ float Hc, Hl, Hr, Hd, Hu;
+
+ texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
+
+ for(c=0; c<nr_channels; c++) {
+ STc[c] = texvec[c];
+ STl[c] = texvec[c] - 0.5f*dxt[c];
+ STr[c] = texvec[c] + 0.5f*dxt[c];
+ STd[c] = texvec[c] - 0.5f*dyt[c];
+ STu[c] = texvec[c] + 0.5f*dyt[c];
+ }
+
+ // clear unused derivatives
+ for(c=nr_channels; c<3; c++) {
+ STc[c] = 0.0f;
+ STl[c] = 0.0f;
+ STr[c] = 0.0f;
+ STd[c] = 0.0f;
+ STu[c] = 0.0f;
+ }
+
+ // use texres for the center sample, set rgbnor
+ rgbnor = multitex_mtex(shi, mtex, STc, dxt, dyt, texres);
+ Hc = (fromrgb)? RGBTOBW(texres->tr, texres->tg, texres->tb) : texres->tin;
+
+ // use ttexr for the other taps
+ multitex_mtex(shi, mtex, STl, dxt, dyt, &ttexr);
+ Hl = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STr, dxt, dyt, &ttexr);
+ Hr = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STd, dxt, dyt, &ttexr);
+ Hd = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+ multitex_mtex(shi, mtex, STu, dxt, dyt, &ttexr);
+ Hu = (fromrgb)? RGBTOBW(ttexr.tr, ttexr.tg, ttexr.tb) : ttexr.tin;
+
+ dHdx = Hscale*(Hr - Hl);
+ dHdy = Hscale*(Hu - Hd);
+ }
+
+ // restore pointer
+ texres->nor = nvec;
+
+ /* replaced newbump with code based on listing 1 and 2 of
+ [Mik10] Mikkelsen M. S.: Bump Mapping Unparametrized Surfaces on the GPU.
+ -> http://jbit.net/~sparky/sfgrad_bump/mm_sfgrad_bump.pdf */
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE )
+ iBumpSpace = 1;
+ else if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
+ iBumpSpace = 2;
+ else
+ iBumpSpace = 4; // ViewSpace
+
+ if( ntap_bump->iPrevBumpSpace != iBumpSpace ) {
+
+ // initialize normal perturbation vectors
+ int xyz;
+ float fDet, abs_fDet, fMagnitude;
+ // object2view and inverted matrix
+ float obj2view[3][3], view2obj[3][3], tmp[4][4];
+ // local copies of derivatives and normal
+ float dPdx[3], dPdy[3], vN[3];
+ VECCOPY(dPdx, shi->dxco);
+ VECCOPY(dPdy, shi->dyco);
+ VECCOPY(vN, ntap_bump->vNorg);
+
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
+ // TODO: these calculations happen for every pixel!
+ // -> move to shi->obi
+ mul_m4_m4m4(tmp, shi->obr->ob->obmat, R.viewmat);
+ copy_m3_m4(obj2view, tmp); // use only upper left 3x3 matrix
+ invert_m3_m3(view2obj, obj2view);
+
+ // generate the surface derivatives in object space
+ mul_m3_v3(view2obj, dPdx);
+ mul_m3_v3( view2obj, dPdy );
+ // generate the unit normal in object space
+ mul_transposed_m3_v3( obj2view, vN );
+ normalize_v3(vN);
+ }
+
+ cross_v3_v3v3(ntap_bump->vR1, dPdy, vN);
+ cross_v3_v3v3(ntap_bump->vR2, vN, dPdx);
+ fDet = dot_v3v3(dPdx, ntap_bump->vR1);
+ ntap_bump->sgn_det = (fDet < 0)? -1.0f: 1.0f;
+ abs_fDet = ntap_bump->sgn_det * fDet;
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima) {
+ // crazy hack solution that gives results similar to normal mapping - part 1
+ normalize_v3(ntap_bump->vR1);
+ normalize_v3(ntap_bump->vR2);
+ abs_fDet = 1.0f;
+ }
+ }
+
+ fMagnitude = abs_fDet;
+ if( mtex->texflag & MTEX_BUMP_OBJECTSPACE ) {
+ // pre do transform of texres->nor by the inverse transposed of obj2view
+ mul_transposed_m3_v3( view2obj, vN );
+ mul_transposed_m3_v3( view2obj, ntap_bump->vR1 );
+ mul_transposed_m3_v3( view2obj, ntap_bump->vR2 );
+
+ fMagnitude *= len_v3(vN);
+ }
+
+ for(xyz=0; xyz<3; xyz++)
+ ntap_bump->vNacc[xyz] *= fMagnitude / ntap_bump->fPrevMagnitude;
+
+ ntap_bump->fPrevMagnitude = fMagnitude;
+ ntap_bump->iPrevBumpSpace = iBumpSpace;
+ }
+
+ if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
+ if(tex->ima) {
+ // crazy hack solution that gives results similar to normal mapping - part 2
+ float vec[2];
+
+ vec[0] = tex->ima->gen_x*dxt[0];
+ vec[1] = tex->ima->gen_y*dxt[1];
+ dHdx *= 1.0f/len_v2(vec);
+ vec[0] = tex->ima->gen_x*dyt[0];
+ vec[1] = tex->ima->gen_y*dyt[1];
+ dHdy *= 1.0f/len_v2(vec);
+ }
+ }
+
+ // subtract the surface gradient from vNacc
+ for(c=0; c<3; c++) {
+ float vSurfGrad_compi = ntap_bump->sgn_det * (dHdx * ntap_bump->vR1[c] + dHdy * ntap_bump->vR2[c]);
+ ntap_bump->vNacc[c] -= vSurfGrad_compi;
+ texres->nor[c] = ntap_bump->vNacc[c]; // copy
+ }
+
+ rgbnor |= TEX_NOR;
+ return rgbnor;
+}
+
void do_material_tex(ShadeInput *shi)
{
+ CompatibleBump compat_bump;
+ NTapBump ntap_bump;
MTex *mtex;
Tex *tex;
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
@@ -1666,8 +2113,11 @@ void do_material_tex(ShadeInput *shi)
float fact, facm, factt, facmm, stencilTin=1.0;
float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
int tex_nr, rgbnor= 0, warpdone=0;
- float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
- int nunvdone= 0;
+ int use_compat_bump, use_ntap_bump;
+ int iFirstTimeNMap=1;
+
+ compatible_bump_init(&compat_bump);
+ ntap_bump_init(&ntap_bump);
if (R.r.scemode & R_NO_TEX) return;
/* here: test flag if there's a tex (todo) */
@@ -1683,6 +2133,21 @@ void do_material_tex(ShadeInput *shi)
tex= mtex->tex;
if(tex==0) continue;
+ use_compat_bump= (mtex->texflag & MTEX_COMPAT_BUMP);
+ use_ntap_bump= (mtex->texflag & (MTEX_3TAP_BUMP|MTEX_5TAP_BUMP));
+
+ /* XXX texture node trees don't work for this yet */
+ if(tex->nodetree && tex->use_nodes) {
+ use_compat_bump = 0;
+ use_ntap_bump = 0;
+ }
+
+ /* case displacement mapping */
+ if(shi->osatex==0 && use_ntap_bump) {
+ use_ntap_bump = 0;
+ use_compat_bump = 1;
+ }
+
/* which coords */
if(mtex->texco==TEXCO_ORCO) {
if(mtex->texflag & MTEX_DUPLI_MAPTO) {
@@ -1756,57 +2221,7 @@ void do_material_tex(ShadeInput *shi)
dx= suv->dxuv;
dy= suv->dyuv;
- // uvmapping only, calculation of normal tangent u/v partial derivatives
- // (should not be here, dudnu, dudnv, dvdnu & dvdnv should probably be part of ShadeInputUV struct,
- // nu/nv in ShadeInput and this calculation should then move to shadeinput.c, shade_input_set_shade_texco() func.)
- // NOTE: test for shi->obr->ob here, since vlr/obr/obi can be 'fake' when called from fastshade(), another reason to move it..
- // NOTE: shi->v1 is NULL when called from displace_render_vert, assigning verts in this case is not trivial because the shi quad face side is not know.
- if ((mtex->texflag & MTEX_NEW_BUMP) && shi->obr && shi->obr->ob && shi->v1) {
- if(mtex->mapto & (MAP_NORM|MAP_WARP) && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
- MTFace* tf = RE_vlakren_get_tface(shi->obr, shi->vlr, i, NULL, 0);
- int j1 = shi->i1, j2 = shi->i2, j3 = shi->i3;
-
- vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
-
- // compute ortho basis around normal
- if(!nunvdone) {
- // render normal is negated
- nn[0] = -shi->vn[0];
- nn[1] = -shi->vn[1];
- nn[2] = -shi->vn[2];
- ortho_basis_v3v3_v3( nu, nv,nn);
- nunvdone= 1;
- }
-
- if (tf) {
- float *uv1 = tf->uv[j1], *uv2 = tf->uv[j2], *uv3 = tf->uv[j3];
- const float an[3] = {fabsf(nn[0]), fabsf(nn[1]), fabsf(nn[2])};
- const int a1 = (an[0] > an[1] && an[0] > an[2]) ? 1 : 0;
- const int a2 = (an[2] > an[0] && an[2] > an[1]) ? 1 : 2;
- const float dp1_a1 = shi->v1->co[a1] - shi->v3->co[a1];
- const float dp1_a2 = shi->v1->co[a2] - shi->v3->co[a2];
- const float dp2_a1 = shi->v2->co[a1] - shi->v3->co[a1];
- const float dp2_a2 = shi->v2->co[a2] - shi->v3->co[a2];
- const float du1 = uv1[0] - uv3[0], du2 = uv2[0] - uv3[0];
- const float dv1 = uv1[1] - uv3[1], dv2 = uv2[1] - uv3[1];
- const float dpdu_a1 = dv2*dp1_a1 - dv1*dp2_a1;
- const float dpdu_a2 = dv2*dp1_a2 - dv1*dp2_a2;
- const float dpdv_a1 = du1*dp2_a1 - du2*dp1_a1;
- const float dpdv_a2 = du1*dp2_a2 - du2*dp1_a2;
- float d = dpdu_a1*dpdv_a2 - dpdv_a1*dpdu_a2;
- float uvd = du1*dv2 - dv1*du2;
-
- if (uvd == 0.f) uvd = 1e-5f;
- if (d == 0.f) d = 1e-5f;
- d = uvd / d;
-
- dudnu = (dpdv_a2*nu[a1] - dpdv_a1*nu[a2])*d;
- dvdnu = (dpdu_a1*nu[a2] - dpdu_a2*nu[a1])*d;
- dudnv = (dpdv_a2*nv[a1] - dpdv_a1*nv[a2])*d;
- dvdnv = (dpdu_a1*nv[a2] - dpdu_a2*nv[a1])*d;
- }
- }
- }
+ compatible_bump_uv_derivs(&compat_bump, shi, mtex, i);
}
}
else if(mtex->texco==TEXCO_WINDOW) {
@@ -1844,138 +2259,15 @@ void do_material_tex(ShadeInput *shi)
co= tempvec;
}
- if(mtex->texflag & MTEX_NEW_BUMP) {
- // compute ortho basis around normal
- if(!nunvdone) {
- // render normal is negated
- nn[0] = -shi->vn[0];
- nn[1] = -shi->vn[1];
- nn[2] = -shi->vn[2];
- ortho_basis_v3v3_v3( nu, nv,nn);
- nunvdone= 1;
- }
-
- if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
- TexResult ttexr = {0, 0, 0, 0, 0, texres.talpha, NULL}; // temp TexResult
- float tco[3], texv[3], cd, ud, vd, du, dv, idu, idv;
- const int fromrgb = ((tex->type == TEX_IMAGE) || ((tex->flag & TEX_COLORBAND)!=0));
- const float bf = 0.04f*Tnor*stencilTin*mtex->norfac;
- // disable internal bump eval
- float* nvec = texres.nor;
- texres.nor = NULL;
- // du & dv estimates, constant value defaults
- du = dv = 0.01f;
-
- // two methods, either constant based on main image resolution,
- // (which also works without osa, though of course not always good (or even very bad) results),
- // or based on tex derivative max values (osa only). Not sure which is best...
-
- if (!shi->osatex && (tex->type == TEX_IMAGE) && tex->ima) {
- // in case we have no proper derivatives, fall back to
- // computing du/dv it based on image size
- ImBuf* ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
- if (ibuf) {
- du = 1.f/(float)ibuf->x;
- dv = 1.f/(float)ibuf->y;
- }
- }
- else if (shi->osatex) {
- // we have derivatives, can compute proper du/dv
- if (tex->type == TEX_IMAGE) { // 2d image, use u & v max. of dx/dy 2d vecs
- const float adx[2] = {fabsf(dx[0]), fabsf(dx[1])};
- const float ady[2] = {fabsf(dy[0]), fabsf(dy[1])};
- du = MAX2(adx[0], ady[0]);
- dv = MAX2(adx[1], ady[1]);
- }
- else { // 3d procedural, estimate from all dx/dy elems
- const float adx[3] = {fabsf(dx[0]), fabsf(dx[1]), fabsf(dx[2])};
- const float ady[3] = {fabsf(dy[0]), fabsf(dy[1]), fabsf(dy[2])};
- du = MAX3(adx[0], adx[1], adx[2]);
- dv = MAX3(ady[1], ady[1], ady[2]);
- }
- }
-
- // center, main return value
- texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
- rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, &texres);
- cd = fromrgb ? (texres.tr + texres.tg + texres.tb)*0.33333333f : texres.tin;
-
- if (mtex->texco == TEXCO_UV) {
- // for the uv case, use the same value for both du/dv,
- // since individually scaling the normal derivatives makes them useless...
- du = MIN2(du, dv);
- idu = (du < 1e-5f) ? bf : (bf/du);
-
- // +u val
- tco[0] = co[0] + dudnu*du;
- tco[1] = co[1] + dvdnu*du;
- tco[2] = 0.f;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
-
- // +v val
- tco[0] = co[0] + dudnv*du;
- tco[1] = co[1] + dvdnv*du;
- tco[2] = 0.f;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- vd = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
- }
- else {
- float tu[3] = {nu[0], nu[1], nu[2]}, tv[3] = {nv[0], nv[1], nv[2]};
-
- idu = (du < 1e-5f) ? bf : (bf/du);
- idv = (dv < 1e-5f) ? bf : (bf/dv);
-
- if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
- mul_mat3_m4_v3(shi->obr->ob->imat, tu);
- mul_mat3_m4_v3(shi->obr->ob->imat, tv);
- normalize_v3(tu);
- normalize_v3(tv);
- }
- else if (mtex->texco == TEXCO_GLOB) {
- mul_mat3_m4_v3(R.viewinv, tu);
- mul_mat3_m4_v3(R.viewinv, tv);
- }
- else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
- mul_mat3_m4_v3(mtex->object->imat, tu);
- mul_mat3_m4_v3(mtex->object->imat, tv);
- normalize_v3(tu);
- normalize_v3(tv);
- }
-
- // +u val
- tco[0] = co[0] + tu[0]*du;
- tco[1] = co[1] + tu[1]*du;
- tco[2] = co[2] + tu[2]*du;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- ud = idu*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
-
- // +v val
- tco[0] = co[0] + tv[0]*dv;
- tco[1] = co[1] + tv[1]*dv;
- tco[2] = co[2] + tv[2]*dv;
- texco_mapping(shi, tex, mtex, tco, dx, dy, texv, dxt, dyt);
- multitex_mtex(shi, mtex, texv, dxt, dyt, &ttexr);
- vd = idv*(cd - (fromrgb ? (ttexr.tr + ttexr.tg + ttexr.tb)*0.33333333f : ttexr.tin));
- }
-
- // bumped normal
- nu[0] += ud*nn[0];
- nu[1] += ud*nn[1];
- nu[2] += ud*nn[2];
- nv[0] += vd*nn[0];
- nv[1] += vd*nn[1];
- nv[2] += vd*nn[2];
- cross_v3_v3v3(nvec, nu, nv);
-
- nvec[0] = -nvec[0];
- nvec[1] = -nvec[1];
- nvec[2] = -nvec[2];
- texres.nor = nvec;
- rgbnor |= TEX_NOR;
+ /* XXX texture node trees don't work for this yet */
+ if(texres.nor && !((tex->type==TEX_IMAGE) && (tex->imaflag & TEX_NORMALMAP))) {
+ if(use_compat_bump) {
+ rgbnor = compatible_bump_compute(&compat_bump, shi, mtex, tex,
+ &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt);
+ }
+ else if(use_ntap_bump) {
+ rgbnor = ntap_bump_compute(&ntap_bump, shi, mtex, tex,
+ &texres, Tnor*stencilTin, co, dx, dy, texvec, dxt, dyt);
}
else {
texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
@@ -2136,14 +2428,17 @@ void do_material_tex(ShadeInput *shi)
if(mtex->normapspace == MTEX_NSPACE_TANGENT) {
/* qdn: tangent space */
float B[3], tv[3];
- cross_v3_v3v3(B, shi->vn, shi->nmaptang); /* bitangent */
+ const float * no = iFirstTimeNMap!=0 ? shi->nmapnorm : shi->vn;
+ iFirstTimeNMap=0;
+ cross_v3_v3v3(B, no, shi->nmaptang); /* bitangent */
+ mul_v3_fl(B, shi->nmaptang[3]);
/* transform norvec from tangent space to object surface in camera space */
- tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*shi->vn[0];
- tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*shi->vn[1];
- tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*shi->vn[2];
- shi->vn[0]= facm*shi->vn[0] + fact*tv[0];
- shi->vn[1]= facm*shi->vn[1] + fact*tv[1];
- shi->vn[2]= facm*shi->vn[2] + fact*tv[2];
+ tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*no[0];
+ tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*no[1];
+ tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*no[2];
+ shi->vn[0]= facm*no[0] + fact*tv[0];
+ shi->vn[1]= facm*no[1] + fact*tv[1];
+ shi->vn[2]= facm*no[2] + fact*tv[2];
}
else {
float nor[3];
@@ -2169,7 +2464,8 @@ void do_material_tex(ShadeInput *shi)
}
}
else {
- if (mtex->texflag & MTEX_NEW_BUMP) {
+ /* XXX texture node trees don't work for this yet */
+ if (use_compat_bump || use_ntap_bump) {
shi->vn[0] = texres.nor[0];
shi->vn[1] = texres.nor[1];
shi->vn[2] = texres.nor[2];
@@ -2346,7 +2642,6 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
/* which coords */
if(mtex->texco==TEXCO_OBJECT) {
Object *ob= mtex->object;
- ob= mtex->object;
if(ob) {
VECCOPY(co, xyz);
if(mtex->texflag & MTEX_OB_DUPLI_ORIG) {
@@ -2676,11 +2971,20 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
switch(mtex->texco) {
case TEXCO_ANGMAP:
/* only works with texture being "real" */
- /* use saacos(), fixes bug [#22398], float precission caused lo[2] to be slightly less then -1.0 */
- fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1]));
- tempvec[0]= lo[0]*fact;
- tempvec[1]= lo[1]*fact;
- tempvec[2]= 0.0;
+ /* use saacos(), fixes bug [#22398], float precision caused lo[2] to be slightly less then -1.0 */
+ if(lo[0] || lo[1]) { /* check for zero case [#24807] */
+ fact= (1.0/M_PI)*saacos(lo[2])/(sqrt(lo[0]*lo[0] + lo[1]*lo[1]));
+ tempvec[0]= lo[0]*fact;
+ tempvec[1]= lo[1]*fact;
+ tempvec[2]= 0.0;
+ }
+ else {
+ /* this value has no angle, the vector is directly along the view.
+ * avoide divide by zero and use a dummy value. */
+ tempvec[0]= 1.0f;
+ tempvec[1]= 0.0;
+ tempvec[2]= 0.0;
+ }
co= tempvec;
break;
@@ -3016,7 +3320,7 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
/* ------------------------------------------------------------------------- */
-int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta)
+int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta, const int thread)
{
Tex *tex;
TexResult texr;
@@ -3042,7 +3346,7 @@ int externtex(MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *t
do_2d_mapping(mtex, texvec, NULL, NULL, dxt, dyt);
}
- rgb= multitex(tex, texvec, dxt, dyt, 0, &texr, 0, mtex->which_output);
+ rgb= multitex(tex, texvec, dxt, dyt, 0, &texr, thread, mtex->which_output);
if(rgb) {
texr.tin= (0.35*texr.tr+0.45*texr.tg+0.2*texr.tb);
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 8e1a959abef..52a80fba5bf 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,8 +41,9 @@
#include "BLI_jitter.h"
#include "BLI_rand.h"
#include "BLI_threads.h"
+#include "BLI_utildefines.h"
+
-#include "BKE_utildefines.h"
#include "DNA_image_types.h"
#include "DNA_lamp_types.h"
@@ -60,6 +61,8 @@
#include "IMB_imbuf.h"
/* local include */
+#include "rayintersection.h"
+#include "rayobject.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
@@ -70,7 +73,6 @@
#include "shading.h"
#include "sss.h"
#include "zbuf.h"
-#include "RE_raytrace.h"
#include "PIL_time.h"
@@ -96,8 +98,9 @@ void calc_view_vector(float *view, float x, float y)
}
else {
- if(R.r.mode & R_PANORAMA)
+ if(R.r.mode & R_PANORAMA) {
x-= R.panodxp;
+ }
/* move x and y to real viewplane coords */
x= (x/(float)R.winx);
@@ -2079,24 +2082,10 @@ static void bake_mask_clear( ImBuf *ibuf, char *mask, char val )
static void bake_set_shade_input(ObjectInstanceRen *obi, VlakRen *vlr, ShadeInput *shi, int quad, int isect, int x, int y, float u, float v)
{
- if(isect) {
- /* raytrace intersection with different u,v than scanconvert */
- if(vlr->v4) {
- if(quad)
- shade_input_set_triangle_i(shi, obi, vlr, 2, 1, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 3);
- }
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
- else {
- /* regular scanconvert */
- if(quad)
- shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
- else
- shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
- }
+ if(quad)
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 2, 3);
+ else
+ shade_input_set_triangle_i(shi, obi, vlr, 0, 1, 2);
/* cache for shadow */
shi->samplenr= R.shadowsamplenr[shi->thread]++;
@@ -2171,12 +2160,14 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
if(tvn && ttang) {
VECCOPY(mat[0], ttang);
cross_v3_v3v3(mat[1], tvn, ttang);
+ mul_v3_fl(mat[1], ttang[3]);
VECCOPY(mat[2], tvn);
}
else {
VECCOPY(mat[0], shi->nmaptang);
- cross_v3_v3v3(mat[1], shi->vn, shi->nmaptang);
- VECCOPY(mat[2], shi->vn);
+ cross_v3_v3v3(mat[1], shi->nmapnorm, shi->nmaptang);
+ mul_v3_fl(mat[1], shi->nmaptang[3]);
+ VECCOPY(mat[2], shi->nmapnorm);
}
invert_m3_m3(imat, mat);
@@ -2189,8 +2180,14 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
normalize_v3(nor); /* in case object has scaling */
- shr.combined[0]= nor[0]/2.0f + 0.5f;
- shr.combined[1]= 0.5f - nor[1]/2.0f;
+ // The invert of the red channel is to make
+ // the normal map compliant with the outside world.
+ // It needs to be done because in Blender
+ // the normal used in the renderer points inward. It is generated
+ // this way in calc_vertexnormals(). Should this ever change
+ // this negate must be removed.
+ shr.combined[0]= (-nor[0])/2.0f + 0.5f;
+ shr.combined[1]= nor[1]/2.0f + 0.5f;
shr.combined[2]= nor[2]/2.0f + 0.5f;
}
else if(bs->type==RE_BAKE_TEXTURE) {
@@ -2285,19 +2282,19 @@ static int bake_intersect_tree(RayObject* raytree, Isect* isect, float *start, f
/* 'dir' is always normalized */
VECADDFAC(isect->start, start, dir, -R.r.bake_biasdist);
- isect->vec[0] = dir[0]*maxdist*sign;
- isect->vec[1] = dir[1]*maxdist*sign;
- isect->vec[2] = dir[2]*maxdist*sign;
+ isect->dir[0] = dir[0]*sign;
+ isect->dir[1] = dir[1]*sign;
+ isect->dir[2] = dir[2]*sign;
- isect->labda = maxdist;
+ isect->dist = maxdist;
hit = RE_rayobject_raycast(raytree, isect);
if(hit) {
- hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
- hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
- hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+ hitco[0] = isect->start[0] + isect->dist*isect->dir[0];
+ hitco[1] = isect->start[1] + isect->dist*isect->dir[1];
+ hitco[2] = isect->start[2] + isect->dist*isect->dir[2];
- *dist= len_v3v3(start, hitco);
+ *dist= isect->dist;
}
return hit;
@@ -2358,7 +2355,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
VlakRen *vlr= bs->vlr;
ObjectInstanceRen *obi= bs->obi;
Object *ob= obi->obr->ob;
- float l, *v1, *v2, *v3, tvn[3], ttang[3];
+ float l, *v1, *v2, *v3, tvn[3], ttang[4];
int quad;
ShadeSample *ssamp= &bs->ssamp;
ShadeInput *shi= ssamp->shi;
@@ -2397,8 +2394,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
if(bs->type==RE_BAKE_NORMALS && R.r.bake_normal_space==R_BAKE_SPACE_TANGENT) {
shade_input_set_shade_texco(shi);
- VECCOPY(tvn, shi->vn);
- VECCOPY(ttang, shi->nmaptang);
+ VECCOPY(tvn, shi->nmapnorm);
+ QUATCOPY(ttang, shi->nmaptang);
}
/* if we are doing selected to active baking, find point on other face */
@@ -2421,7 +2418,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
isec.orig.ob = obi;
isec.orig.face = vlr;
isec.userdata= bs->actob;
- isec.skip = RE_SKIP_VLR_NEIGHBOUR|RE_SKIP_VLR_BAKE_CHECK;
+ isec.check = RE_CHECK_VLR_BAKE;
+ isec.skip = RE_SKIP_VLR_NEIGHBOUR;
if(bake_intersect_tree(R.raytree, &isec, shi->co, shi->vn, sign, co, &dist)) {
if(!hit || len_v3v3(shi->co, co) < len_v3v3(shi->co, minco)) {
@@ -2562,10 +2560,9 @@ static void shade_tface(BakeShade *bs)
if (bs->usemask) {
if (bs->ibuf->userdata==NULL) {
BLI_lock_thread(LOCK_CUSTOM1);
- if (bs->ibuf->userdata==NULL) { /* since the thread was locked, its possible another thread alloced the value */
+ if (bs->ibuf->userdata==NULL) /* since the thread was locked, its possible another thread alloced the value */
bs->ibuf->userdata = (void *)MEM_callocN(sizeof(char)*bs->rectx*bs->recty, "BakeMask");
- bs->rect_mask= (char *)bs->ibuf->userdata;
- }
+ bs->rect_mask= (char *)bs->ibuf->userdata;
BLI_unlock_thread(LOCK_CUSTOM1);
} else {
bs->rect_mask= (char *)bs->ibuf->userdata;
@@ -2575,7 +2572,7 @@ static void shade_tface(BakeShade *bs)
/* get pixel level vertex coordinates */
for(a=0; a<4; a++) {
/* Note, workaround for pixel aligned UVs which are common and can screw up our intersection tests
- * where a pixel gets inbetween 2 faces or the middle of a quad,
+ * where a pixel gets in between 2 faces or the middle of a quad,
* camera aligned quads also have this problem but they are less common.
* Add a small offset to the UVs, fixes bug #18685 - Campbell */
vec[a][0]= tface->uv[a][0]*(float)bs->rectx - (0.5f + 0.001);
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index ce55935d392..e000d7731f4 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -58,10 +58,11 @@
#include <string.h>
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
@@ -75,8 +76,8 @@
#include "BKE_DerivedMesh.h"
#include "RE_render_ext.h" /* externtex */
-#include "RE_raytrace.h"
+#include "rayobject.h"
#include "renderpipeline.h"
#include "render_types.h"
#include "renderdatabase.h"
@@ -108,7 +109,7 @@
#define RE_RADFACE_ELEMS 1
#define RE_SIMPLIFY_ELEMS 2
#define RE_FACE_ELEMS 1
-#define RE_NMAP_TANGENT_ELEMS 12
+#define RE_NMAP_TANGENT_ELEMS 16
float *RE_vertren_get_sticky(ObjectRen *obr, VertRen *ver, int verify)
{
@@ -294,7 +295,7 @@ MTFace *RE_vlakren_get_tface(ObjectRen *obr, VlakRen *vlr, int n, char **name, i
if(verify) {
if(n>=node->totmtface) {
MTFace *mtface= node->mtface;
- int size= size= (n+1)*256;
+ int size= (n+1)*256;
node->mtface= MEM_callocN(size*sizeof(MTFace), "Vlak mtface");
@@ -999,6 +1000,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
if(ma->mtex[0]) {
if( (ma->mode & MA_HALOTEX) ) har->tex= 1;
+ else if(har->mat->septex & (1<<0)); /* only 1 level textures */
else {
mtex= ma->mtex[0];
@@ -1019,7 +1021,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
}
}
- externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta);
+ externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
yn= tin*mtex->colfac;
zn= tin*mtex->alphafac;
@@ -1042,13 +1044,13 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f
}
HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Material *ma, float *vec, float *vec1,
- float *orco, float *uvco, float hasize, float vectsize, int seed)
+ float *orco, float *uvco, float hasize, float vectsize, int seed, float *pa_co)
{
HaloRen *har;
MTex *mtex;
float tin, tr, tg, tb, ta;
float xn, yn, zn, texvec[3], hoco[4], hoco1[4], in[3],tex[3],out[3];
- int i;
+ int i, hasrgb;
if(hasize==0.0) return NULL;
@@ -1147,11 +1149,17 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
texvec[1]=2.0f*uvco[2*uv_index+1]-1.0f;
texvec[2]=0.0f;
}
+ else if(mtex->texco & TEXCO_PARTICLE) {
+ /* particle coordinates in range [0,1] */
+ texvec[0] = 2.f * pa_co[0] - 1.f;
+ texvec[1] = 2.f * pa_co[1] - 1.f;
+ texvec[2] = pa_co[2];
+ }
else if(orco) {
VECCOPY(texvec, orco);
}
- externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta);
+ hasrgb = externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta, 0);
//yn= tin*mtex->colfac;
//zn= tin*mtex->alphafac;
@@ -1172,12 +1180,22 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
har->g= in[1];
har->b= in[2];
}
+
+ /* alpha returned, so let's use it instead of intensity */
+ if(hasrgb)
+ tin = ta;
+
if(mtex->mapto & MAP_ALPHA)
har->alfa = texture_value_blend(mtex->def_var,har->alfa,tin,mtex->alphafac,mtex->blendtype);
if(mtex->mapto & MAP_HAR)
har->hard = 1.0+126.0*texture_value_blend(mtex->def_var,((float)har->hard)/127.0,tin,mtex->hardfac,mtex->blendtype);
if(mtex->mapto & MAP_RAYMIRR)
har->hasize = 100.0*texture_value_blend(mtex->def_var,har->hasize/100.0,tin,mtex->raymirrfac,mtex->blendtype);
+ if(mtex->mapto & MAP_TRANSLU) {
+ float add = texture_value_blend(mtex->def_var,(float)har->add/255.0,tin,mtex->translfac,mtex->blendtype);
+ CLAMP(add, 0.f, 1.f);
+ har->add = 255.0*add;
+ }
/* now what on earth is this good for?? */
//if(mtex->texco & 16) {
// har->alfa= tin;
@@ -1382,19 +1400,21 @@ int clip_render_object(float boundbox[][3], float *bounds, float winmat[][4])
fl= 0;
if(bounds) {
- if(vec[0] > bounds[1]*vec[3]) fl |= 1;
- if(vec[0]< bounds[0]*vec[3]) fl |= 2;
+ if(vec[0] < bounds[0]*vec[3]) fl |= 1;
+ else if(vec[0] > bounds[1]*vec[3]) fl |= 2;
+
if(vec[1] > bounds[3]*vec[3]) fl |= 4;
- if(vec[1]< bounds[2]*vec[3]) fl |= 8;
+ else if(vec[1]< bounds[2]*vec[3]) fl |= 8;
}
else {
if(vec[0] < -vec[3]) fl |= 1;
- if(vec[0] > vec[3]) fl |= 2;
- if(vec[1] < -vec[3]) fl |= 4;
- if(vec[1] > vec[3]) fl |= 8;
+ else if(vec[0] > vec[3]) fl |= 2;
+
+ if(vec[1] > vec[3]) fl |= 4;
+ else if(vec[1] < -vec[3]) fl |= 8;
}
if(vec[2] < -vec[3]) fl |= 16;
- if(vec[2] > vec[3]) fl |= 32;
+ else if(vec[2] > vec[3]) fl |= 32;
flag &= fl;
if(flag==0) return 0;
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 7101ce5daaf..8dd07fad022 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -35,13 +35,14 @@
#include "BKE_global.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
#include "BLI_memarena.h"
#include "BLI_rand.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
@@ -300,8 +301,14 @@ static void compress_deepshadowbuf(Render *re, ShadBuf *shb, APixstr *apixbuf, A
DeepSample *ds[RE_MAX_OSA], *sampleds[RE_MAX_OSA], *dsb, *newbuf;
APixstr *ap, *apn;
APixstrand *aps, *apns;
- float visibility, totbuf= shb->totbuf;
- int a, b, c, tot, minz, found, size= shb->size, prevtot, newtot;
+ float visibility;
+
+ const int totbuf= shb->totbuf;
+ const float totbuf_f= (float)shb->totbuf;
+ const float totbuf_f_inv= 1.0f/totbuf_f;
+ const int size= shb->size;
+
+ int a, b, c, tot, minz, found, prevtot, newtot;
int sampletot[RE_MAX_OSA], totsample = 0, totsamplec = 0;
shsample= MEM_callocN( sizeof(ShadSampleBuf), "shad sample buf");
@@ -456,9 +463,9 @@ static void compress_deepshadowbuf(Render *re, ShadBuf *shb, APixstr *apixbuf, A
}
if(sampleds[c] == ds[c])
- visibility += 1.0f/totbuf;
+ visibility += totbuf_f_inv;
else
- visibility += (ds[c]-1)->v/totbuf;
+ visibility += (ds[c]-1)->v / totbuf_f;
}
dsb->v= visibility;
@@ -820,7 +827,7 @@ static void *do_shadow_thread(void *re_v)
}
static volatile int g_break= 0;
-static int thread_break(void *unused)
+static int thread_break(void *UNUSED(arg))
{
return g_break;
}
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 56ab56d0411..41afbb4b5d6 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -32,6 +32,7 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "DNA_curve_types.h"
#include "DNA_group_types.h"
@@ -40,7 +41,7 @@
#include "DNA_material_types.h"
#include "BKE_colortools.h"
-#include "BKE_utildefines.h"
+
#include "BKE_node.h"
/* local include */
@@ -132,16 +133,21 @@ void shade_material_loop(ShadeInput *shi, ShadeResult *shr)
/* depth >= 1 when ray-shading */
if(shi->depth==0 || shi->volume_depth > 0) {
if(R.r.mode & R_RAYTRACE) {
- if(shi->ray_mirror!=0.0f || ((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
+ if(shi->ray_mirror!=0.0f || ((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP) && shr->alpha!=1.0f)) {
/* ray trace works on combined, but gives pass info */
ray_trace(shi, shr);
}
}
/* disable adding of sky for raytransp */
- if((shi->mat->mode & MA_TRANSP) && (shi->mat->mode & MA_RAYTRANSP))
+ if((shi->mode & MA_TRANSP) && (shi->mode & MA_RAYTRANSP))
if((shi->layflag & SCE_LAY_SKY) && (R.r.alphamode==R_ADDSKY))
shr->alpha= 1.0f;
- }
+ }
+
+ if(R.r.mode & R_RAYTRACE) {
+ if (R.render_volumes_inside.first)
+ shade_volume_inside(shi, shr);
+ }
}
@@ -163,11 +169,8 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr)
shade_input_init_material(shi);
if (shi->mat->material_type == MA_TYPE_VOLUME) {
- if(R.r.mode & R_RAYTRACE) {
- if (R.render_volumes_inside.first)
- shade_volume_inside(shi, shr);
- else
- shade_volume_outside(shi, shr);
+ if(R.r.mode & R_RAYTRACE) {
+ shade_volume_outside(shi, shr);
}
} else { /* MA_TYPE_SURFACE, MA_TYPE_WIRE */
shade_material_loop(shi, shr);
@@ -283,9 +286,9 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen
VECCOPY(shi->n3, shi->v3->n);
if(obi->flag & R_TRANSFORMED) {
- mul_m3_v3(obi->nmat, shi->n1);
- mul_m3_v3(obi->nmat, shi->n2);
- mul_m3_v3(obi->nmat, shi->n3);
+ mul_m3_v3(obi->nmat, shi->n1); normalize_v3(shi->n1);
+ mul_m3_v3(obi->nmat, shi->n2); normalize_v3(shi->n2);
+ mul_m3_v3(obi->nmat, shi->n3); normalize_v3(shi->n3);
}
}
}
@@ -427,10 +430,10 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
- mul_m3_v3(R.imat, shi->dxco);
- VECCOPY(shi->dygl, shi->dyco);
- mul_m3_v3(R.imat, shi->dyco);
+ VECCOPY(shi->dxgl, shi->dxco);
+ mul_mat3_m4_v3(R.viewinv, shi->dxgl);
+ VECCOPY(shi->dygl, shi->dyco);
+ mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
@@ -792,19 +795,41 @@ void shade_input_set_normals(ShadeInput *shi)
{
float u= shi->u, v= shi->v;
float l= 1.0f+u+v;
+
+ shi->flippednor = 0;
+
+ /* test flip normals to viewing direction */
+ if(!(shi->vlr->flag & R_TANGENT)) {
+ if(dot_v3v3(shi->facenor, shi->view) < 0.0f) {
+ negate_v3(shi->facenor);
+ shi->flippednor= 1;
+ }
+ }
/* calculate vertexnormals */
if(shi->vlr->flag & R_SMOOTH) {
float *n1= shi->n1, *n2= shi->n2, *n3= shi->n3;
+
+ if(shi->flippednor) {
+ negate_v3(n1);
+ negate_v3(n2);
+ negate_v3(n3);
+ }
shi->vn[0]= l*n3[0]-u*n1[0]-v*n2[0];
shi->vn[1]= l*n3[1]-u*n1[1]-v*n2[1];
shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2];
+
+ // use unnormalized normal (closer to games)
+ VECCOPY(shi->nmapnorm, shi->vn);
normalize_v3(shi->vn);
}
else
+ {
VECCOPY(shi->vn, shi->facenor);
+ VECCOPY(shi->nmapnorm, shi->vn);
+ }
/* used in nodes */
VECCOPY(shi->vno, shi->vn);
@@ -815,6 +840,36 @@ void shade_input_set_normals(ShadeInput *shi)
shade_input_flip_normals(shi);
}
+/* XXX shi->flippednor messes up otherwise */
+void shade_input_set_vertex_normals(ShadeInput *shi)
+{
+ float u= shi->u, v= shi->v;
+ float l= 1.0f+u+v;
+
+ /* calculate vertexnormals */
+ if(shi->vlr->flag & R_SMOOTH) {
+ float *n1= shi->n1, *n2= shi->n2, *n3= shi->n3;
+
+ shi->vn[0]= l*n3[0]-u*n1[0]-v*n2[0];
+ shi->vn[1]= l*n3[1]-u*n1[1]-v*n2[1];
+ shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2];
+
+ // use unnormalized normal (closer to games)
+ VECCOPY(shi->nmapnorm, shi->vn);
+
+ normalize_v3(shi->vn);
+ }
+ else
+ {
+ VECCOPY(shi->vn, shi->facenor);
+ VECCOPY(shi->nmapnorm, shi->vn);
+ }
+
+ /* used in nodes */
+ VECCOPY(shi->vno, shi->vn);
+}
+
+
/* use by raytrace, sss, bake to flip into the right direction */
void shade_input_flip_normals(ShadeInput *shi)
{
@@ -830,6 +885,10 @@ void shade_input_flip_normals(ShadeInput *shi)
shi->vno[1]= -shi->vno[1];
shi->vno[2]= -shi->vno[2];
+ shi->nmapnorm[0] = -shi->nmapnorm[0];
+ shi->nmapnorm[1] = -shi->nmapnorm[1];
+ shi->nmapnorm[2] = -shi->nmapnorm[2];
+
shi->flippednor= !shi->flippednor;
}
@@ -905,21 +964,32 @@ void shade_input_set_shade_texco(ShadeInput *shi)
if(tangent) {
int j1= shi->i1, j2= shi->i2, j3= shi->i3;
+ float c0[3], c1[3], c2[3];
vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3);
- s1= &tangent[j1*3];
- s2= &tangent[j2*3];
- s3= &tangent[j3*3];
-
- shi->nmaptang[0]= (tl*s3[0] - tu*s1[0] - tv*s2[0]);
- shi->nmaptang[1]= (tl*s3[1] - tu*s1[1] - tv*s2[1]);
- shi->nmaptang[2]= (tl*s3[2] - tu*s1[2] - tv*s2[2]);
+ VECCOPY(c0, &tangent[j1*4]);
+ VECCOPY(c1, &tangent[j2*4]);
+ VECCOPY(c2, &tangent[j3*4]);
+ // keeping tangents normalized at vertex level
+ // corresponds better to how it's done in game engines
if(obi->flag & R_TRANSFORMED)
- mul_m3_v3(obi->nmat, shi->nmaptang);
-
- normalize_v3(shi->nmaptang);
+ {
+ mul_mat3_m4_v3(obi->mat, c0); normalize_v3(c0);
+ mul_mat3_m4_v3(obi->mat, c1); normalize_v3(c1);
+ mul_mat3_m4_v3(obi->mat, c2); normalize_v3(c2);
+ }
+
+ // we don't normalize the interpolated TBN tangent
+ // corresponds better to how it's done in game engines
+ shi->nmaptang[0]= (tl*c2[0] - tu*c0[0] - tv*c1[0]);
+ shi->nmaptang[1]= (tl*c2[1] - tu*c0[1] - tv*c1[1]);
+ shi->nmaptang[2]= (tl*c2[2] - tu*c0[2] - tv*c1[2]);
+
+ // the sign is the same for all 3 vertices of any
+ // non degenerate triangle.
+ shi->nmaptang[3]= tangent[j1*4+3];
}
}
}
@@ -993,13 +1063,10 @@ void shade_input_set_shade_texco(ShadeInput *shi)
VECCOPY(shi->gl, shi->co);
mul_m4_v3(R.viewinv, shi->gl);
if(shi->osatex) {
- VECCOPY(shi->dxgl, shi->dxco);
- // TXF: bug was here, but probably should be in convertblender.c, R.imat only valid if there is a world
- //mul_m3_v3(R.imat, shi->dxco);
- mul_mat3_m4_v3(R.viewinv, shi->dxco);
- VECCOPY(shi->dygl, shi->dyco);
- //mul_m3_v3(R.imat, shi->dyco);
- mul_mat3_m4_v3(R.viewinv, shi->dyco);
+ VECCOPY(shi->dxgl, shi->dxco);
+ mul_mat3_m4_v3(R.viewinv, shi->dxgl);
+ VECCOPY(shi->dygl, shi->dyco);
+ mul_mat3_m4_v3(R.viewinv, shi->dygl);
}
}
@@ -1342,7 +1409,10 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y)
shi->samplenr= R.shadowsamplenr[shi->thread]++; /* this counter is not being reset per pixel */
shade_input_set_viewco(shi, x, y, xs, ys, (float)ps->z);
shade_input_set_uv(shi);
- shade_input_set_normals(shi);
+ if(shi_cp==0)
+ shade_input_set_normals(shi);
+ else /* XXX shi->flippednor messes up otherwise */
+ shade_input_set_vertex_normals(shi);
shi_cp= 1;
shi++;
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 245364b3bed..1dec0d2a6b2 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,13 +30,13 @@
#include <math.h>
#include <string.h>
-
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BKE_colortools.h"
#include "BKE_material.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "DNA_group_types.h"
#include "DNA_lamp_types.h"
@@ -154,8 +154,8 @@ float mistfactor(float zcor, float *co)
static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
{
double a, b, c, disc, nray[3], npos[3];
- float t0, t1 = 0.0f, t2= 0.0f, t3, haint;
- float p1[3], p2[3], ladist, maxz = 0.0f, maxy = 0.0f;
+ double t0, t1 = 0.0f, t2= 0.0f, t3;
+ float p1[3], p2[3], ladist, maxz = 0.0f, maxy = 0.0f, haint;
int snijp, doclip=1, use_yco=0;
int ok1=0, ok2=0;
@@ -202,7 +202,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
maxz*= lar->sh_zfac;
maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2];
- if( fabs(nray[2]) < DBL_EPSILON ) use_yco= 1;
+ if( fabs(nray[2]) < FLT_EPSILON ) use_yco= 1;
}
/* scale z to make sure volume is normalized */
@@ -1122,6 +1122,11 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
visifac = lar->dist/(lar->dist + dist[0]);
break;
case LA_FALLOFF_INVSQUARE:
+ /* NOTE: This seems to be a hack since commit r12045 says this
+ * option is similar to old Quad, but with slight changes.
+ * Correct inv square would be (which would be old Quad):
+ * visifac = lar->distkw / (lar->distkw + dist[0]*dist[0]);
+ */
visifac = lar->dist / (lar->dist + dist[0]*dist[0]);
break;
case LA_FALLOFF_SLIDERS:
@@ -1372,6 +1377,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
i*= shadfac[3];
+ shr->shad[3] = shadfac[3]; /* store this for possible check in troublesome cases */
}
}
}
@@ -1390,10 +1396,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
if(i_noshad>0.0f) {
if(passflag & (SCE_PASS_DIFFUSE|SCE_PASS_SHADOW)) {
- if(ma->mode & MA_SHADOW_TRA)
- add_to_diffuse(shr->diff, shi, is, i_noshad*shadfac[0]*lacol[0], i_noshad*shadfac[1]*lacol[1], i_noshad*shadfac[2]*lacol[2]);
- else
- add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
+ add_to_diffuse(shr->diff, shi, is, i_noshad*lacol[0], i_noshad*lacol[1], i_noshad*lacol[2]);
}
else
VECCOPY(shr->diff, shr->shad);
@@ -1624,12 +1627,14 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
if(R.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) {
if(((passflag & SCE_PASS_COMBINED) && (shi->combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
|| (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) {
- /* AO was calculated for scanline already */
- if(shi->depth || shi->volume_depth)
- ambient_occlusion(shi);
- VECCOPY(shr->ao, shi->ao);
- VECCOPY(shr->env, shi->env); // XXX multiply
- VECCOPY(shr->indirect, shi->indirect); // XXX multiply
+ if(R.r.mode & R_SHADOW) {
+ /* AO was calculated for scanline already */
+ if(shi->depth || shi->volume_depth)
+ ambient_occlusion(shi);
+ VECCOPY(shr->ao, shi->ao);
+ VECCOPY(shr->env, shi->env); // XXX multiply
+ VECCOPY(shr->indirect, shi->indirect); // XXX multiply
+ }
}
}
@@ -1706,10 +1711,17 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
VECCOPY(shr->combined, shr->diff);
/* calculate shadow pass, we use a multiplication mask */
- if(passflag & SCE_PASS_SHADOW) {
+ /* if diff = 0,0,0 it doesn't matter what the shadow pass is, so leave it as is */
+ if(passflag & SCE_PASS_SHADOW && !(shr->diff[0]==0.0f && shr->diff[1]==0.0f && shr->diff[2]==0.0f)) {
if(shr->diff[0]!=0.0f) shr->shad[0]= shr->shad[0]/shr->diff[0];
+ /* can't determine proper shadow from shad/diff (0/0), so use shadow intensity */
+ else if(shr->shad[0]==0.0f) shr->shad[0]= shr->shad[3];
+
if(shr->diff[1]!=0.0f) shr->shad[1]= shr->shad[1]/shr->diff[1];
+ else if(shr->shad[1]==0.0f) shr->shad[1]= shr->shad[3];
+
if(shr->diff[2]!=0.0f) shr->shad[2]= shr->shad[2]/shr->diff[2];
+ else if(shr->shad[2]==0.0f) shr->shad[2]= shr->shad[3];
}
/* exposure correction */
@@ -1738,18 +1750,20 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */
if(!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
- /* add AO in combined? */
- if(R.wrld.mode & WO_AMB_OCC)
- if(shi->combinedflag & SCE_PASS_AO)
- ambient_occlusion_apply(shi, shr);
-
- if(R.wrld.mode & WO_ENV_LIGHT)
- if(shi->combinedflag & SCE_PASS_ENVIRONMENT)
- environment_lighting_apply(shi, shr);
-
- if(R.wrld.mode & WO_INDIRECT_LIGHT)
- if(shi->combinedflag & SCE_PASS_INDIRECT)
- indirect_lighting_apply(shi, shr);
+ if(R.r.mode & R_SHADOW) {
+ /* add AO in combined? */
+ if(R.wrld.mode & WO_AMB_OCC)
+ if(shi->combinedflag & SCE_PASS_AO)
+ ambient_occlusion_apply(shi, shr);
+
+ if(R.wrld.mode & WO_ENV_LIGHT)
+ if(shi->combinedflag & SCE_PASS_ENVIRONMENT)
+ environment_lighting_apply(shi, shr);
+
+ if(R.wrld.mode & WO_INDIRECT_LIGHT)
+ if(shi->combinedflag & SCE_PASS_INDIRECT)
+ indirect_lighting_apply(shi, shr);
+ }
shr->combined[0]+= shi->ambr;
shr->combined[1]+= shi->ambg;
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index e8c95a34ac4..44c89f8cbd5 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -49,18 +49,21 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
+
#include "PIL_time.h"
#include "DNA_material_types.h"
#include "BKE_colortools.h"
+#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_scene.h"
-#include "BKE_utildefines.h"
+
/* this module */
#include "render_types.h"
@@ -466,7 +469,7 @@ static void compute_radiance(ScatterTree *tree, float *co, float *rad)
/* building */
-static void sum_leaf_radiance(ScatterTree *tree, ScatterNode *node)
+static void sum_leaf_radiance(ScatterTree *UNUSED(tree), ScatterNode *node)
{
ScatterPoint *p;
float rad, totrad= 0.0f, inv;
@@ -540,7 +543,7 @@ static void sum_leaf_radiance(ScatterTree *tree, ScatterNode *node)
}
}
-static void sum_branch_radiance(ScatterTree *tree, ScatterNode *node)
+static void sum_branch_radiance(ScatterTree *UNUSED(tree), ScatterNode *node)
{
ScatterNode *subnode;
float rad, totrad= 0.0f, inv;
@@ -995,6 +998,15 @@ void make_sss_tree(Render *re)
for(mat= re->main->mat.first; mat; mat= mat->id.next)
if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
sss_create_tree_mat(re, mat);
+
+ /* XXX preview exception */
+ /* localizing preview render data is not fun for node trees :( */
+ if(re->main!=G.main) {
+ for(mat= G.main->mat.first; mat; mat= mat->id.next)
+ if(mat->id.us && (mat->flag & MA_IS_USED) && (mat->sss_flag & MA_DIFF_SSS))
+ sss_create_tree_mat(re, mat);
+ }
+
}
void free_sss(Render *re)
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 673bb53b215..67da11f4988 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -39,12 +39,13 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
-#include "BKE_utildefines.h"
+
#include "render_types.h"
#include "initrender.h"
@@ -313,7 +314,7 @@ struct StrandShadeCache {
MemArena *memarena;
};
-StrandShadeCache *strand_shade_cache_create()
+StrandShadeCache *strand_shade_cache_create(void)
{
StrandShadeCache *cache;
@@ -578,7 +579,8 @@ static void do_strand_fillac(void *handle, int x, int y, float u, float v, float
}
}
-static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, float *co, float *zcomp)
+/* width is calculated in hoco space, to ensure strands are visible */
+static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, float *co, float *zcomp, float widthx, float widthy)
{
float hoco[4];
int clipflag= 0;
@@ -588,10 +590,11 @@ static int strand_test_clip(float winmat[][4], ZSpan *zspan, float *bounds, floa
/* we compare z without perspective division for segment sorting */
*zcomp= hoco[2];
- if(hoco[0] > bounds[1]*hoco[3]) clipflag |= 1;
- else if(hoco[0]< bounds[0]*hoco[3]) clipflag |= 2;
- else if(hoco[1] > bounds[3]*hoco[3]) clipflag |= 4;
- else if(hoco[1]< bounds[2]*hoco[3]) clipflag |= 8;
+ if(hoco[0]+widthx < bounds[0]*hoco[3]) clipflag |= 1;
+ else if(hoco[0]-widthx > bounds[1]*hoco[3]) clipflag |= 2;
+
+ if(hoco[1]-widthy > bounds[3]*hoco[3]) clipflag |= 4;
+ else if(hoco[1]+widthy < bounds[2]*hoco[3]) clipflag |= 8;
clipflag |= testclip(hoco);
@@ -825,6 +828,9 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
/* for all object instances */
for(obi=re->instancetable.first, i=0; obi; obi=obi->next, i++) {
+ Material *ma;
+ float widthx, widthy;
+
obr= obi->obr;
if(!obr->strandbuf || !(obr->strandbuf->lay & lay))
@@ -836,8 +842,19 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
else
copy_m4_m4(obwinmat, winmat);
+ /* test if we should skip it */
+ ma = obr->strandbuf->ma;
+
+ if(shadow && !(ma->mode & MA_SHADBUF))
+ continue;
+ else if(!shadow && (ma->mode & MA_ONLYCAST))
+ continue;
+
if(clip_render_object(obi->obr->boundbox, bounds, winmat))
continue;
+
+ widthx= obr->strandbuf->maxwidth*obwinmat[0][0];
+ widthy= obr->strandbuf->maxwidth*obwinmat[1][1];
/* for each bounding box containing a number of strands */
sbound= obr->strandbuf->bound;
@@ -851,14 +868,14 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
svert= strand->vert;
/* keep clipping and z depth for 4 control points */
- clip[1]= strand_test_clip(obwinmat, &zspan, bounds, svert->co, &z[1]);
- clip[2]= strand_test_clip(obwinmat, &zspan, bounds, (svert+1)->co, &z[2]);
+ clip[1]= strand_test_clip(obwinmat, &zspan, bounds, svert->co, &z[1], widthx, widthy);
+ clip[2]= strand_test_clip(obwinmat, &zspan, bounds, (svert+1)->co, &z[2], widthx, widthy);
clip[0]= clip[1]; z[0]= z[1];
for(b=0; b<strand->totvert-1; b++, svert++) {
/* compute 4th point clipping and z depth */
if(b < strand->totvert-2) {
- clip[3]= strand_test_clip(obwinmat, &zspan, bounds, (svert+2)->co, &z[3]);
+ clip[3]= strand_test_clip(obwinmat, &zspan, bounds, (svert+2)->co, &z[3], widthx, widthy);
}
else {
clip[3]= clip[2]; z[3]= z[2];
@@ -1015,12 +1032,22 @@ void free_strand_surface(Render *re)
BLI_freelistN(&re->strandsurface);
}
-void strand_minmax(StrandRen *strand, float *min, float *max)
+void strand_minmax(StrandRen *strand, float *min, float *max, float width)
{
StrandVert *svert;
+ float vec[3], width2= 2.0f*width;
int a;
- for(a=0, svert=strand->vert; a<strand->totvert; a++, svert++)
- DO_MINMAX(svert->co, min, max)
+ for(a=0, svert=strand->vert; a<strand->totvert; a++, svert++) {
+ VECCOPY(vec, svert->co);
+ DO_MINMAX(vec, min, max);
+
+ if(width!=0.0f) {
+ vec[0]+= width; vec[1]+= width; vec[2]+= width;
+ DO_MINMAX(vec, min, max);
+ vec[0]-= width2; vec[1]-= width2; vec[2]-= width2;
+ DO_MINMAX(vec, min, max);
+ }
+ }
}
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index d3e8f4058c5..173e1e0595a 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -37,14 +37,16 @@
#include "BLI_math.h"
#include "BLI_threads.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "PIL_time.h"
#include "RE_shader_ext.h"
-#include "RE_raytrace.h"
#include "DNA_material_types.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "render_types.h"
#include "rendercore.h"
#include "renderdatabase.h"
@@ -73,11 +75,11 @@ int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset, int l
if (RE_rayobject_raycast(tree, isect)) {
- isect->start[0] = isect->start[0] + isect->labda*isect->vec[0];
- isect->start[1] = isect->start[1] + isect->labda*isect->vec[1];
- isect->start[2] = isect->start[2] + isect->labda*isect->vec[2];
+ isect->start[0] = isect->start[0] + isect->dist*isect->dir[0];
+ isect->start[1] = isect->start[1] + isect->dist*isect->dir[1];
+ isect->start[2] = isect->start[2] + isect->dist*isect->dir[2];
- isect->labda = FLT_MAX;
+ isect->dist = FLT_MAX;
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
isect->orig.face= isect->hit.face;
isect->orig.ob= isect->hit.ob;
@@ -89,25 +91,24 @@ int intersect_outside_volume(RayObject *tree, Isect *isect, float *offset, int l
}
/* Uses ray tracing to check if a point is inside or outside an ObjectInstanceRen */
-int point_inside_obi(RayObject *tree, ObjectInstanceRen *obi, float *co)
+int point_inside_obi(RayObject *tree, ObjectInstanceRen *UNUSED(obi), float *co)
{
- Isect isect;
- float vec[3] = {0.0f,0.0f,1.0f};
+ Isect isect= {{0}};
+ float dir[3] = {0.0f,0.0f,1.0f};
int final_depth=0, depth=0, limit=20;
/* set up the isect */
- memset(&isect, 0, sizeof(isect));
VECCOPY(isect.start, co);
- VECCOPY(isect.vec, vec);
+ VECCOPY(isect.dir, dir);
isect.mode= RE_RAY_MIRROR;
isect.last_hit= NULL;
isect.lay= -1;
- isect.labda = FLT_MAX;
+ isect.dist = FLT_MAX;
isect.orig.face= NULL;
isect.orig.ob = NULL;
- final_depth = intersect_outside_volume(tree, &isect, vec, limit, depth);
+ final_depth = intersect_outside_volume(tree, &isect, dir, limit, depth);
/* even number of intersections: point is outside
* odd number: point is inside */
@@ -396,7 +397,7 @@ void multiple_scattering_diffusion(Render *re, VolumePrecache *vp, Material *ma)
/* Displays progress every second */
if(time-lasttime>1.0f) {
char str[64];
- sprintf(str, "Simulating multiple scattering: %d%%", (int)(100.0f * (c / total)));
+ BLI_snprintf(str, sizeof(str), "Simulating multiple scattering: %d%%", (int)(100.0f * (c / total)));
re->i.infostr= str;
re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
@@ -486,7 +487,11 @@ static void *vol_precache_part(void *data)
float scatter_col[3] = {0.f, 0.f, 0.f};
float co[3], cco[3];
int x, y, z, i;
- const int res[3]= {pa->res[0], pa->res[1], pa->res[2]};
+ int res[3];
+
+ res[0]= pa->res[0];
+ res[1]= pa->res[1];
+ res[2]= pa->res[2];
for (z= pa->minz; z < pa->maxz; z++) {
co[2] = pa->bbmin[2] + (pa->voxel[2] * (z + 0.5f));
@@ -737,7 +742,7 @@ void vol_precache_objectinstance_threads(Render *re, ObjectInstanceRen *obi, Mat
time= PIL_check_seconds_timer();
if(time-lasttime>1.0f) {
char str[64];
- sprintf(str, "Precaching volume: %d%%", (int)(100.0f * ((float)counter / (float)totparts)));
+ BLI_snprintf(str, sizeof(str), "Precaching volume: %d%%", (int)(100.0f * ((float)counter / (float)totparts)));
re->i.infostr= str;
re->stats_draw(re->sdh, &re->i);
re->i.infostr= NULL;
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index a58d96736d5..58466a9b169 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -37,9 +37,9 @@
#include "BLI_math.h"
#include "BLI_rand.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "RE_shader_ext.h"
-#include "RE_raytrace.h"
#include "DNA_material_types.h"
#include "DNA_group_types.h"
@@ -50,6 +50,8 @@
#include "render_types.h"
#include "pixelshading.h"
+#include "rayintersection.h"
+#include "rayobject.h"
#include "shading.h"
#include "shadbuf.h"
#include "texture.h"
@@ -83,17 +85,18 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
copy_v3_v3(is.start, co);
if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- is.vec[0] = -lar->vec[0];
- is.vec[1] = -lar->vec[1];
- is.vec[2] = -lar->vec[2];
- is.labda = R.maxdist;
+ is.dir[0] = -lar->vec[0];
+ is.dir[1] = -lar->vec[1];
+ is.dir[2] = -lar->vec[2];
+ is.dist = R.maxdist;
} else {
- VECSUB( is.vec, lar->co, is.start );
- is.labda = len_v3( is.vec );
+ VECSUB( is.dir, lar->co, is.start );
+ is.dist = normalize_v3( is.dir );
}
is.mode = RE_RAY_MIRROR;
- is.skip = RE_SKIP_VLR_RENDER_CHECK | RE_SKIP_VLR_NON_SOLID_MATERIAL;
+ is.check = RE_CHECK_VLR_NON_SOLID_MATERIAL;
+ is.skip = 0;
if(lar->mode & (LA_LAYER|LA_LAYER_SHADOW))
is.lay= lar->lay;
@@ -115,20 +118,14 @@ static float vol_get_shadow(ShadeInput *shi, LampRen *lar, float *co)
static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco, Isect *isect, int intersect_type)
{
- /* XXX TODO - get raytrace max distance from object instance's bounding box */
- /* need to account for scaling only, but keep coords in camera space...
- * below code is WIP and doesn't work!
- sub_v3_v3v3(bb_dim, shi->obi->obr->boundbox[1], shi->obi->obr->boundbox[2]);
- mul_m3_v3(shi->obi->nmat, bb_dim);
- maxsize = len_v3(bb_dim);
- */
VECCOPY(isect->start, co);
- VECCOPY(isect->vec, vec );
- isect->labda = FLT_MAX;
+ VECCOPY(isect->dir, vec );
+ isect->dist = FLT_MAX;
isect->mode= RE_RAY_MIRROR;
isect->last_hit = NULL;
isect->lay= -1;
+ isect->check= RE_CHECK_VLR_NONE;
if (intersect_type == VOL_BOUNDS_DEPTH) {
isect->skip = RE_SKIP_VLR_NEIGHBOUR;
@@ -142,9 +139,9 @@ static int vol_get_bounds(ShadeInput *shi, float *co, float *vec, float *hitco,
if(RE_rayobject_raycast(R.raytree, isect))
{
- hitco[0] = isect->start[0] + isect->labda*isect->vec[0];
- hitco[1] = isect->start[1] + isect->labda*isect->vec[1];
- hitco[2] = isect->start[2] + isect->labda*isect->vec[2];
+ hitco[0] = isect->start[0] + isect->dist*isect->dir[0];
+ hitco[1] = isect->start[1] + isect->dist*isect->dir[1];
+ hitco[2] = isect->start[2] + isect->dist*isect->dir[2];
return 1;
} else {
return 0;
@@ -189,10 +186,11 @@ static void vol_trace_behind(ShadeInput *shi, VlakRen *vlr, float *co, float *co
Isect isect;
VECCOPY(isect.start, co);
- VECCOPY(isect.vec, shi->view);
- isect.labda = FLT_MAX;
+ VECCOPY(isect.dir, shi->view);
+ isect.dist = FLT_MAX;
isect.mode= RE_RAY_MIRROR;
+ isect.check = RE_CHECK_VLR_NONE;
isect.skip = RE_SKIP_VLR_NEIGHBOUR;
isect.orig.ob = (void*) shi->obi;
isect.orig.face = (void*)vlr;
@@ -337,7 +335,7 @@ void vol_get_emission(ShadeInput *shi, float *emission_col, float *co)
/* A combination of scattering and absorption -> known as sigma T.
- * This can possibly use a specific scattering colour,
+ * This can possibly use a specific scattering color,
* and absorption multiplier factor too, but these parameters are left out for simplicity.
* It's easy enough to get a good wide range of results with just these two parameters. */
void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
@@ -358,7 +356,7 @@ void vol_get_sigma_t(ShadeInput *shi, float *sigma_t, float *co)
/* phase function - determines in which directions the light
* is scattered in the volume relative to incoming direction
* and view direction */
-float vol_get_phasefunc(ShadeInput *shi, float g, float *w, float *wp)
+float vol_get_phasefunc(ShadeInput *UNUSED(shi), float g, float *w, float *wp)
{
const float normalize = 0.25f; // = 1.f/4.f = M_PI/(4.f*M_PI)
@@ -578,8 +576,8 @@ outgoing radiance from behind surface * beam transmittance/attenuation
/* For ease of use, I've also introduced a 'reflection' and 'reflection color' parameter, which isn't
* physically correct. This works as an RGB tint/gain on out-scattered light, but doesn't affect the light
* that is transmitted through the volume. While having wavelength dependent absorption/scattering is more correct,
- * it also makes it harder to control the overall look of the volume since colouring the outscattered light results
- * in the inverse colour being transmitted through the rest of the volume.
+ * it also makes it harder to control the overall look of the volume since coloring the outscattered light results
+ * in the inverse color being transmitted through the rest of the volume.
*/
static void volumeintegrate(struct ShadeInput *shi, float *col, float *co, float *endco)
{
@@ -741,9 +739,9 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
{
float hitco[3];
float tr[3] = {1.0,1.0,1.0};
- Isect is;
+ Isect is= {{0}};
float *startco, *endco;
- float density=0.f;
+ int intersect_type = VOL_BOUNDS_DEPTH;
memset(shr, 0, sizeof(ShadeResult));
@@ -752,10 +750,12 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
if (shi->flippednor) {
startco = last_is->start;
endco = shi->co;
+ intersect_type = VOL_BOUNDS_SS;
}
+
/* trace to find a backface, the other side bounds of the volume */
/* (ray intersect ignores front faces here) */
- else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, VOL_BOUNDS_DEPTH)) {
+ else if (vol_get_bounds(shi, shi->co, shi->view, hitco, &is, intersect_type)) {
startco = shi->co;
endco = hitco;
}
@@ -764,12 +764,23 @@ void shade_volume_shadow(struct ShadeInput *shi, struct ShadeResult *shr, struct
shr->alpha = shr->combined[3] = 1.f;
return;
}
-
- density = vol_get_density(shi, startco);
+
vol_get_transmittance(shi, tr, startco, endco);
+
+
+ /* if we hit another face in the same volume bounds */
+ /* shift raytrace coordinates to the hit point, to avoid shading volume twice */
+ /* due to idiosyncracy in ray_trace_shadow_tra() */
+ if (is.hit.ob == shi->obi) {
+ copy_v3_v3(shi->co, hitco);
+ last_is->dist -= is.dist;
+ shi->vlr = (VlakRen *)is.hit.face;
+ }
+
copy_v3_v3(shr->combined, tr);
shr->combined[3] = 1.0f - luminance(tr);
+ shr->alpha = shr->combined[3];
}
@@ -786,6 +797,7 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
MatInside *m;
Material *mat_backup;
ObjectInstanceRen *obi_backup;
+ float prev_alpha = shr->alpha;
/* XXX: extend to multiple volumes perhaps later */
mat_backup = shi->mat;
@@ -796,11 +808,14 @@ void shade_volume_inside(ShadeInput *shi, ShadeResult *shr)
shi->obi = m->obi;
shi->obr = m->obi->obr;
- memset(shr, 0, sizeof(ShadeResult));
-
volume_trace(shi, shr, VOL_SHADE_INSIDE);
+
+ shr->alpha = shr->alpha + prev_alpha;
+ CLAMP(shr->alpha, 0.0, 1.0);
shi->mat = mat_backup;
shi->obi = obi_backup;
shi->obr = obi_backup->obr;
}
+
+
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 076d6355585..6190aca0e7f 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -1,4 +1,4 @@
-/**
+/*
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -35,10 +35,12 @@
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_voxel.h"
+#include "BLI_utildefines.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
@@ -46,6 +48,7 @@
#include "smoke_API.h"
#include "DNA_texture_types.h"
+#include "DNA_object_force.h"
#include "DNA_object_types.h"
#include "DNA_modifier_types.h"
#include "DNA_smoke_types.h"
@@ -178,7 +181,7 @@ static int read_voxeldata_header(FILE *fp, struct VoxelData *vd)
return 1;
}
-static void init_frame_smoke(VoxelData *vd, Tex *tex)
+static void init_frame_smoke(VoxelData *vd, float cfra)
{
Object *ob;
ModifierData *md;
@@ -194,8 +197,9 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
if(smd->domain && smd->domain->fluid) {
-
- if (vd->smoked_type == TEX_VD_SMOKEHEAT) {
+ if(cfra < smd->domain->point_cache[0]->startframe)
+ ; /* don't show smoke before simulation starts, this could be made an option in the future */
+ else if (vd->smoked_type == TEX_VD_SMOKEHEAT) {
int totRes;
float *heat;
int i;
@@ -238,13 +242,22 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
}
else {
+ int totRes;
+ float *density;
+
if (smd->domain->flags & MOD_SMOKE_HIGHRES) {
smoke_turbulence_get_res(smd->domain->wt, vd->resol);
- vd->dataset = smoke_turbulence_get_density(smd->domain->wt);
+ density = smoke_turbulence_get_density(smd->domain->wt);
} else {
VECCOPY(vd->resol, smd->domain->res);
- vd->dataset = smoke_get_density(smd->domain->fluid);
+ density = smoke_get_density(smd->domain->fluid);
}
+
+ totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+
+ /* always store copy, as smoke internal data can change */
+ vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data");
+ memcpy(vd->dataset, density, sizeof(float)*totRes);
} // end of fluid condition
}
}
@@ -253,13 +266,12 @@ static void init_frame_smoke(VoxelData *vd, Tex *tex)
return;
}
-static void cache_voxeldata(struct Render *re,Tex *tex)
+static void cache_voxeldata(struct Render *re, Tex *tex)
{
VoxelData *vd = tex->vd;
FILE *fp;
int curframe;
-
- if (!vd) return;
+ char path[sizeof(vd->source_path)];
/* only re-cache if dataset needs updating */
if ((vd->flag & TEX_VD_STILL) || (vd->cachedframe == re->r.cfra))
@@ -267,8 +279,7 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
/* clear out old cache, ready for new */
if (vd->dataset) {
- if(vd->file_format != TEX_VD_SMOKE)
- MEM_freeN(vd->dataset);
+ MEM_freeN(vd->dataset);
vd->dataset = NULL;
}
@@ -277,16 +288,19 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
else
curframe = re->r.cfra;
+ BLI_strncpy(path, vd->source_path, sizeof(path));
+
switch(vd->file_format) {
case TEX_VD_IMAGE_SEQUENCE:
load_frame_image_sequence(vd, tex);
return;
case TEX_VD_SMOKE:
- init_frame_smoke(vd, tex);
+ init_frame_smoke(vd, re->r.cfra);
return;
case TEX_VD_BLENDERVOXEL:
- if (!BLI_exists(vd->source_path)) return;
- fp = fopen(vd->source_path,"rb");
+ BLI_path_abs(path, G.main->name);
+ if (!BLI_exists(path)) return;
+ fp = fopen(path,"rb");
if (!fp) return;
if(read_voxeldata_header(fp, vd))
@@ -296,8 +310,9 @@ static void cache_voxeldata(struct Render *re,Tex *tex)
return;
case TEX_VD_RAW_8BIT:
- if (!BLI_exists(vd->source_path)) return;
- fp = fopen(vd->source_path,"rb");
+ BLI_path_abs(path, G.main->name);
+ if (!BLI_exists(path)) return;
+ fp = fopen(path,"rb");
if (!fp) return;
if (load_frame_raw8(vd, fp, curframe))
@@ -347,7 +362,7 @@ int voxeldatatex(struct Tex *tex, float *texvec, struct TexResult *texres)
add_v3_v3(co, offset);
/* co is now in the range 0.0, 1.0 */
- switch (tex->extend) {
+ switch (vd->extend) {
case TEX_CLIP:
{
if ((co[0] < 0.f || co[0] > 1.f) || (co[1] < 0.f || co[1] > 1.f) || (co[2] < 0.f || co[2] > 1.f)) {
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index 4f872a238cd..d16431068e0 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -41,7 +41,7 @@
#include "BLI_blenlib.h"
#include "BLI_jitter.h"
#include "BLI_threads.h"
-
+#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
@@ -53,7 +53,7 @@
#include "BKE_global.h"
#include "BKE_material.h"
-#include "BKE_utildefines.h"
+
#include "RE_render_ext.h"
@@ -243,14 +243,14 @@ int testclip(float *v)
prevents issues with vertices lying exact on borders */
abs4= fabs(v[3]) + FLT_EPSILON;
- if(v[2]< -abs4) c=16; /* this used to be " if(v[2]<0) ", see clippz() */
- else if(v[2]> abs4) c+= 32;
+ if( v[0] < -abs4) c+=1;
+ else if( v[0] > abs4) c+=2;
- if( v[0]>abs4) c+=2;
- else if( v[0]< -abs4) c+=1;
+ if( v[1] > abs4) c+=4;
+ else if( v[1] < -abs4) c+=8;
- if( v[1]>abs4) c+=4;
- else if( v[1]< -abs4) c+=8;
+ if(v[2] < -abs4) c+=16; /* this used to be " if(v[2]<0) ", see clippz() */
+ else if(v[2]> abs4) c+= 32;
return c;
}
@@ -1782,10 +1782,10 @@ static int zbuf_part_project(ZbufProjectCache *cache, int index, float winmat[][
projectvert(co, winmat, ho);
wco= ho[3];
- if(ho[0] > bounds[1]*wco) clipflag |= 1;
- else if(ho[0]< bounds[0]*wco) clipflag |= 2;
+ if(ho[0] < bounds[0]*wco) clipflag |= 1;
+ else if(ho[0] > bounds[1]*wco) clipflag |= 2;
if(ho[1] > bounds[3]*wco) clipflag |= 4;
- else if(ho[1]< bounds[2]*wco) clipflag |= 8;
+ else if(ho[1] < bounds[2]*wco) clipflag |= 8;
QUATCOPY(cache[cindex].ho, ho);
cache[cindex].clip= clipflag;
@@ -1805,10 +1805,9 @@ void zbuf_render_project(float winmat[][4], float *co, float *ho)
void zbuf_make_winmat(Render *re, float winmat[][4])
{
- float panomat[4][4];
-
if(re->r.mode & R_PANORAMA) {
- unit_m4(panomat);
+ float panomat[4][4]= MAT4_UNITY;
+
panomat[0][0]= re->panoco;
panomat[0][2]= re->panosi;
panomat[2][0]= -re->panosi;
@@ -3767,7 +3766,10 @@ static void shade_tra_samples_fill(ShadeSample *ssamp, int x, int y, int z, int
shi->samplenr= R.shadowsamplenr[shi->thread]++;
shade_input_set_viewco(shi, x, y, xs, ys, (float)z);
shade_input_set_uv(shi);
- shade_input_set_normals(shi);
+ if(shi_inc==0)
+ shade_input_set_normals(shi);
+ else /* XXX shi->flippednor messes up otherwise */
+ shade_input_set_vertex_normals(shi);
shi_inc= 1;
}
diff --git a/source/blender/verify/BLO_sign_verify_Header.h b/source/blender/verify/BLO_sign_verify_Header.h
deleted file mode 100644
index 9d73d9ba595..00000000000
--- a/source/blender/verify/BLO_sign_verify_Header.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- */
-
-#ifndef BLO_SIGN_VERIFY_H
-#define BLO_SIGN_VERIFY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef FREE_WINDOWS
-typedef int int32_t;
-#endif
-
-#include "BLO_sys_types.h"
-
-#define SIGNVERIFYHEADERSTRUCTSIZE sizeof(struct BLO_sign_verify_HeaderStruct)
-/* TODO use reasonable sizes
-Tests showed: pubKeyLen 64, cryptedKeyLen 64 bytes
-So we pick 2*64 bytes + tail for now : */
-
-#define MAXPUBKEYLEN 130
-#define MAXSIGNATURELEN 130
-
-struct BLO_sign_verify_HeaderStruct {
- uint8_t magic; /* poor mans header recognize check */
- uint32_t length; /* how much signed data is there */
- uint8_t pubKey[MAXPUBKEYLEN];
- uint32_t pubKeyLen; /* the actual pubKey length */
- uint8_t signature[MAXSIGNATURELEN];
- int32_t signatureLen; /* the actual signature length */
- uint32_t datacrc; /* data crc checksum */
- uint32_t headercrc; /* header minus crc itself checksum */
-};
-
-#define SIGNERHEADERSTRUCTSIZE sizeof(struct BLO_SignerHeaderStruct)
-#define MAXSIGNERLEN 100
-
-struct BLO_SignerHeaderStruct {
- uint8_t name[MAXSIGNERLEN]; /* the signers name (from the key) */
- uint8_t email[MAXSIGNERLEN]; /* the signers email (from the key) */
- uint8_t homeUrl[MAXSIGNERLEN]; /* the signers home page */
- uint8_t text[MAXSIGNERLEN]; /* optional additional user text */
- uint8_t pubKeyUrl1[MAXSIGNERLEN]; /* the signers pubKey store */
- uint8_t pubKeyUrl2[MAXSIGNERLEN]; /* the signers pubKey at NaN */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* BLO_SIGN_VERIFY_H */
-
diff --git a/source/blender/verify/BLO_verify.h b/source/blender/verify/BLO_verify.h
deleted file mode 100644
index 5f7241c1cd5..00000000000
--- a/source/blender/verify/BLO_verify.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef BLO_VERIFY_H
-#define BLO_VERIFY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define VERIFY_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
-
-VERIFY_DECLARE_HANDLE(BLO_verifyStructHandle);
-
-/**
- * openssl verify initializer
- * @retval pointer to verify control structure
- */
- BLO_verifyStructHandle
-BLO_verify_begin(
- void *endControl);
-
-/**
- * openssl verify dataprocessor wrapper
- * @param BLO_verify Pointer to verify control structure
- * @param data Pointer to new data
- * @param dataIn New data amount
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_process(
- BLO_verifyStructHandle BLO_verifyHandle,
- unsigned char *data,
- unsigned int dataIn);
-
-/**
- * openssl verify final call and cleanup
- * @param BLO_verify Pointer to verify control structure
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_end(
- BLO_verifyStructHandle BLO_verifyHandle);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* BLO_VERIFY_H */
-
diff --git a/source/blender/verify/Makefile b/source/blender/verify/Makefile
deleted file mode 100644
index 4451d5baf22..00000000000
--- a/source/blender/verify/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/verify
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/verify/intern/BLO_verify.c b/source/blender/verify/intern/BLO_verify.c
deleted file mode 100644
index ccdc8a7e916..00000000000
--- a/source/blender/verify/intern/BLO_verify.c
+++ /dev/null
@@ -1,420 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * openssl verify wrapper library
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "openssl/rsa.h"
-#include "openssl/ripemd.h"
-#include "openssl/objects.h"
-#include "zlib.h"
-
-#include "GEN_messaging.h"
-
-#include "BLO_readStreamGlue.h"
-#include "BLO_verify.h"
-#include "BLO_sign_verify_Header.h" /* used by verify and encrypt */
-
-#include "BLO_signer_info.h" /* external signer info struct */
-
-static struct BLO_SignerInfo g_SignerInfo = {"", "", ""};
-
-struct verifyStructType {
- struct readStreamGlueStruct *streamGlue;
- unsigned int streamDone;
- unsigned char headerbuffer[SIGNVERIFYHEADERSTRUCTSIZE];
- uint32_t datacrc;
- struct BLO_sign_verify_HeaderStruct *streamHeader;
- RIPEMD160_CTX ripemd160_ctx;
- struct BLO_SignerHeaderStruct *signerHeader;
- unsigned char signerHeaderBuffer[SIGNERHEADERSTRUCTSIZE];
- void *endControl;
-};
-
- BLO_verifyStructHandle
-BLO_verify_begin(
- void *endControl)
-{
- struct verifyStructType *control;
- control = malloc(sizeof(struct verifyStructType));
- if (!control) return NULL;
-
- control->streamGlue = NULL;
- control->streamDone = 0;
- memset(control->headerbuffer, 0, SIGNVERIFYHEADERSTRUCTSIZE);
- control->datacrc = 0;
-
- control->streamHeader = malloc(SIGNVERIFYHEADERSTRUCTSIZE);
- if (!control->streamHeader) {
- free(control);
- return NULL;
- }
- control->streamHeader->magic = 0;
- control->streamHeader->length = 0;
- strcpy(control->streamHeader->pubKey, "");
- control->streamHeader->pubKeyLen = 0;
- strcpy(control->streamHeader->signature, "");
- control->streamHeader->signatureLen = 0;
- control->streamHeader->datacrc = 0;
- control->streamHeader->headercrc = 0;
-
- RIPEMD160_Init(&(control->ripemd160_ctx));
-
- control->signerHeader = malloc(SIGNERHEADERSTRUCTSIZE);
- if (!control->signerHeader) {
- free(control->streamHeader);
- free(control);
- return NULL;
- }
- memset(control->signerHeader->name, 0, MAXSIGNERLEN);
- memset(control->signerHeader->email, 0, MAXSIGNERLEN);
- memset(control->signerHeader->homeUrl, 0, MAXSIGNERLEN);
- memset(control->signerHeader->text, 0, MAXSIGNERLEN);
- memset(control->signerHeader->pubKeyUrl1, 0, MAXSIGNERLEN);
- memset(control->signerHeader->pubKeyUrl2, 0, MAXSIGNERLEN);
-
- control->endControl = endControl;
- return((BLO_verifyStructHandle) control);
-}
-
- int
-BLO_verify_process(
- BLO_verifyStructHandle BLO_verifyHandle,
- unsigned char *data,
- unsigned int dataIn)
-{
- int err = 0;
- struct verifyStructType *BLO_verify =
- (struct verifyStructType *) BLO_verifyHandle;
-
- if (!BLO_verify) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_NULL);
- return err;
- }
-
- /* First check if we have our header filled in yet */
- if (BLO_verify->streamHeader->length == 0) {
- unsigned int processed;
- if (dataIn == 0) return err; /* really need data to do anything */
- processed = ((dataIn + BLO_verify->streamDone) <=
- SIGNVERIFYHEADERSTRUCTSIZE)
- ? dataIn : SIGNVERIFYHEADERSTRUCTSIZE;
- memcpy(BLO_verify->headerbuffer + BLO_verify->streamDone,
- data, processed);
- BLO_verify->streamDone += processed;
- dataIn -= processed;
- data += processed;
- if (BLO_verify->streamDone == SIGNVERIFYHEADERSTRUCTSIZE) {
- /* we have the whole header, absorb it */
- struct BLO_sign_verify_HeaderStruct *header;
- uint32_t crc;
-
- header = (struct BLO_sign_verify_HeaderStruct *)
- BLO_verify->headerbuffer;
- crc = crc32(0L, (const Bytef *) header,
- SIGNVERIFYHEADERSTRUCTSIZE - 4);
-
- if (header->magic == 'A') {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "BLO_sign_verify_HeaderStruct Magic confirmed\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "ERROR BLO_sign_verify_HeaderStruct Magic NOT confirmed\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_MAGIC);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- if (crc == ntohl(header->headercrc)) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,"BLO_sign_verify_Header CRC correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,"ERROR BLO_sign_verify_Header CRC NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_CRCHEADER);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
- BLO_verify->streamHeader->length = ntohl(header->length);
- BLO_verify->streamHeader->pubKeyLen = ntohl(header->pubKeyLen);
- memcpy(BLO_verify->streamHeader->pubKey, header->pubKey,
- BLO_verify->streamHeader->pubKeyLen);
- BLO_verify->streamHeader->signatureLen =
- ntohl(header->signatureLen);
- memcpy(BLO_verify->streamHeader->signature, header->signature,
- BLO_verify->streamHeader->signatureLen);
- BLO_verify->streamHeader->datacrc = ntohl(header->datacrc);
-
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "BLO_verify_process gets %u bytes\n",
- (unsigned int) BLO_verify->streamHeader->length);
-#endif
-
- }
- }
-
- /* Is there really (still) new data available ? */
- if (dataIn > 0) {
- /* BLO_SignerHeaderStruct */
- if (BLO_verify->signerHeader->name[0] == 0) {
- /* we don't have our signerHeader complete yet */
- unsigned int processed;
- processed = ((dataIn + BLO_verify->streamDone -
- SIGNVERIFYHEADERSTRUCTSIZE) <= SIGNERHEADERSTRUCTSIZE)
- ? dataIn : SIGNERHEADERSTRUCTSIZE;
- memcpy(BLO_verify->signerHeaderBuffer +
- BLO_verify->streamDone - SIGNVERIFYHEADERSTRUCTSIZE,
- data, processed);
- BLO_verify->streamDone += processed;
- dataIn -= processed;
- data += processed;
- if (BLO_verify->streamDone == SIGNVERIFYHEADERSTRUCTSIZE +
- SIGNERHEADERSTRUCTSIZE) {
- /* we have the whole header, absorb it */
- struct BLO_SignerHeaderStruct *signerHeader;
- signerHeader = (struct BLO_SignerHeaderStruct *)
- BLO_verify->signerHeaderBuffer;
- strncpy(BLO_verify->signerHeader->name,
- signerHeader->name, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->email,
- signerHeader->email, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->homeUrl,
- signerHeader->homeUrl, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->text,
- signerHeader->text, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->pubKeyUrl1,
- signerHeader->pubKeyUrl1, MAXSIGNERLEN-1);
- strncpy(BLO_verify->signerHeader->pubKeyUrl2,
- signerHeader->pubKeyUrl2, MAXSIGNERLEN-1);
-
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "name %s\nemail %s\nhomeUrl %s\ntext %s\n",
- BLO_verify->signerHeader->name,
- BLO_verify->signerHeader->email,
- BLO_verify->signerHeader->homeUrl,
- BLO_verify->signerHeader->text);
- fprintf(GEN_errorstream,
- "pubKeyUrl1 %s\npubKeyUrl2 %s\n",
- BLO_verify->signerHeader->pubKeyUrl1,
- BLO_verify->signerHeader->pubKeyUrl2);
-#endif
- /* also update the signature and crc checksum */
- RIPEMD160_Update(&(BLO_verify->ripemd160_ctx),
- BLO_verify->signerHeaderBuffer,
- SIGNERHEADERSTRUCTSIZE);
-
- /* update datacrc */
- BLO_verify->datacrc = crc32(
- BLO_verify->datacrc, (const Bytef *)
- BLO_verify->signerHeaderBuffer,
- SIGNERHEADERSTRUCTSIZE);
- }
- }
- }
-
- /* Is there really (still) new data available ? */
- if (dataIn > 0) {
- RIPEMD160_Update(&(BLO_verify->ripemd160_ctx), data, dataIn);
-
- /* update datacrc */
- BLO_verify->datacrc = crc32(
- BLO_verify->datacrc, (const Bytef *) data, dataIn);
-
- BLO_verify->streamDone += dataIn;
-
- /* give data to streamGlueRead, it will find out what to do next */
- err = readStreamGlue(
- BLO_verify->endControl,
- &(BLO_verify->streamGlue),
- (unsigned char *) data,
- dataIn);
- }
- return err;
-}
-
-/**
- * openssl verify final call and cleanup
- * @param BLO_verify Pointer to verify control structure
- * @retval streamGlueRead return value
- */
- int
-BLO_verify_end(
- BLO_verifyStructHandle BLO_verifyHandle)
-{
- int err = 0;
- unsigned char *digest;
- static unsigned char rsa_e[] = "\x01\x00\x01";
- RSA *rsa = NULL;
- int verifySuccess;
- struct verifyStructType *BLO_verify =
- (struct verifyStructType *) BLO_verifyHandle;
-
- if (!BLO_verify) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_NULL);
- return err;
- }
-
- if (BLO_verify->streamDone == BLO_verify->streamHeader->length +
- SIGNVERIFYHEADERSTRUCTSIZE) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data length is correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data length is NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_DATALEN);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- if (BLO_verify->datacrc == BLO_verify->streamHeader->datacrc) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data CRC is correct\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Signed data CRC is NOT correct\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_CRCDATA);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- digest = malloc(RIPEMD160_DIGEST_LENGTH);
- if (!digest) {
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETGENERR(BRS_MALLOC);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
-
- RIPEMD160_Final(digest, &(BLO_verify->ripemd160_ctx));
-
- rsa = RSA_new();
- if (rsa == NULL) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream, "Error in RSA_new\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETSPECERR(BRS_RSANEWERROR);
- free(digest);
- if (BLO_verify->streamGlue) free(BLO_verify->streamGlue);
- if (BLO_verify->streamHeader) free(BLO_verify->streamHeader);
- if (BLO_verify->signerHeader) free(BLO_verify->signerHeader);
- free(BLO_verify);
- return err;
- }
- /* static exponent */
- rsa->e = BN_bin2bn(rsa_e, sizeof(rsa_e)-1, rsa->e);
-
- /* public part into rsa->n */
- rsa->n = BN_bin2bn(BLO_verify->streamHeader->pubKey,
- BLO_verify->streamHeader->pubKeyLen,
- rsa->n);
- /*DEBUG RSA_print_fp(stdout, rsa, 0); */
-
- /* verify the signature */
- verifySuccess = RSA_verify(NID_ripemd160, digest, RIPEMD160_DIGEST_LENGTH,
- BLO_verify->streamHeader->signature,
- BLO_verify->streamHeader->signatureLen, rsa);
- if (verifySuccess == 1) {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "Signature verified\n");
-#endif
- } else {
-#ifndef NDEBUG
- fprintf(GEN_errorstream,
- "Signature INCORRECT\n");
-#endif
- err = BRS_SETFUNCTION(BRS_VERIFY) |
- BRS_SETSPECERR(BRS_SIGFAILED);
- }
-
-/* copy signer information to external struct */
-
- strncpy(g_SignerInfo.name, BLO_verify->signerHeader->name, MAXSIGNERLEN-1);
- strncpy(g_SignerInfo.email, BLO_verify->signerHeader->email, MAXSIGNERLEN-1);
- strncpy(g_SignerInfo.homeUrl, BLO_verify->signerHeader->homeUrl, MAXSIGNERLEN-1);
-
- free(digest);
- free(BLO_verify->streamGlue);
- free(BLO_verify->streamHeader);
- free(BLO_verify->signerHeader);
- free(BLO_verify);
- RSA_free(rsa);
-
- return err;
-}
-
-struct BLO_SignerInfo *BLO_getSignerInfo(){
- return &g_SignerInfo;
-}
-
-int BLO_isValidSignerInfo(struct BLO_SignerInfo *info){
- return info->name[0] != 0;
-}
-
-void BLO_clrSignerInfo(struct BLO_SignerInfo *info)
-{
- info->name[0] = 0;
-}
-
diff --git a/source/blender/verify/intern/Makefile b/source/blender/verify/intern/Makefile
deleted file mode 100644
index 009fd1c6e28..00000000000
--- a/source/blender/verify/intern/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = verify
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
-# external modules
-CPPFLAGS += -I../../../kernel/gen_messaging
-CPPFLAGS += -I../../readstreamglue
-
-CPPFLAGS += -I$(NAN_OPENSSL)/include
-
-ifeq ($(OS),$(findstring $(OS), "solaris windows"))
- CPPFLAGS += -I$(NAN_ZLIB)/include
-endif
-
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index ae51c5b395e..5726ce47df7 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -24,61 +24,92 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC intern/*.c)
-
-SET(INC .
- ../editors/include
- ../../../intern/guardedalloc ../../../intern/memutil
- ../blenlib ../makesdna ../makesrna ../blenkernel
- ../include ../imbuf ../render/extern/include
- ../../../intern/bsp/extern
- ../../../intern/decimation/extern ../blenloader
- ../../kernel/gen_system ../readstreamglue
- ../../../intern/elbeem/extern
- ../../../intern/ghost ../../../intern/opennl/extern ../../../extern/glew/include
- ../python
+set(INC
+ .
../nodes
../gpu
../blenfont ../bmesh
+ ../blenlib
+ ../makesdna
+ ../makesrna
+ ../blenkernel
+ ../imbuf
+ ../blenloader
+ ../editors/include
+ ../render/extern/include
+ ../../kernel/gen_system
+ ../../../intern/guardedalloc
+ ../../../intern/memutil
+ ../../../intern/elbeem/extern
+ ../../../intern/ghost
+ ../../../intern/opennl/extern
+ ../../../extern/glew/include
${OPENGL_INCLUDE_DIR}
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ intern/wm.c
+ intern/wm_apple.c
+ intern/wm_cursors.c
+ intern/wm_dragdrop.c
+ intern/wm_draw.c
+ intern/wm_event_system.c
+ intern/wm_files.c
+ intern/wm_gesture.c
+ intern/wm_init_exit.c
+ intern/wm_jobs.c
+ intern/wm_keymap.c
+ intern/wm_operators.c
+ intern/wm_subwindow.c
+ intern/wm_window.c
+
+ WM_api.h
+ WM_types.h
+ wm.h
+ wm_cursors.h
+ wm_draw.h
+ wm_event_system.h
+ wm_event_types.h
+ wm_files.h
+ wm_subwindow.h
+ wm_window.h
+)
+
+add_definitions(-DGLEW_STATIC)
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DINTERNATIONAL)
-ENDIF(WITH_INTERNATIONAL)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DINTERNATIONAL)
+endif()
-IF(WITH_OPENCOLLADA)
- ADD_DEFINITIONS(-DWITH_COLLADA)
-ENDIF(WITH_OPENCOLLADA)
+if(WITH_OPENCOLLADA)
+ add_definitions(-DWITH_COLLADA)
+endif()
-IF(WITH_QUICKTIME)
- SET(INC ${INC} ../quicktime ${QUICKTIME_INC})
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ list(APPEND INC ../quicktime ${QUICKTIME_INC})
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ list(APPEND INC ${FFMPEG_INC})
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_PYTHON)
- SET(INC ${INC} ../python ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ list(APPEND INC ../python ${PYTHON_INCLUDE_DIRS})
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WIN32)
- SET(INC ${INC} ${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_COCOA)
- LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/wm_apple.c")
-ENDIF(WITH_COCOA)
+if(WITH_COCOA)
+ list(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/wm_apple.c")
+endif()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DNAN_BUILDINFO)
-ENDIF(WITH_BUILDINFO)
+if(WITH_BUILDINFO)
+ add_definitions(-DNAN_BUILDINFO)
+endif()
-BLENDERLIB_NOLIST(bf_windowmanager "${SRC}" "${INC}")
+blender_add_lib_nolist(bf_windowmanager "${SRC}" "${INC}")
diff --git a/source/blender/windowmanager/Makefile b/source/blender/windowmanager/Makefile
deleted file mode 100644
index 1596921b5ee..00000000000
--- a/source/blender/windowmanager/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) Blender Foundation.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/blender/windowmanager
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index 790b1e108da..ed0cce49489 100644
--- a/source/blender/windowmanager/SConscript
+++ b/source/blender/windowmanager/SConscript
@@ -16,23 +16,23 @@ incs += ' #/intern/elbeem #/extern/glew/include'
defs = [ 'GLEW_STATIC' ]
-if not env['WITH_BF_PYTHON']:
- defs.append('DISABLE_PYTHON')
+if env['WITH_BF_PYTHON']:
+ defs.append('WITH_PYTHON')
if env['WITH_BF_COLLADA']:
- defs.append('WITH_COLLADA')
+ defs.append('WITH_COLLADA')
if env['OURPLATFORM'] == 'linux2':
- cflags='-pthread'
- incs += ' ../../../extern/binreloc/include'
+ cflags='-pthread'
+ incs += ' ../../../extern/binreloc/include'
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
if env['WITH_GHOST_COCOA']:
- sources.remove('intern/wm_apple.c')
+ sources.remove('intern/wm_apple.c')
if env['BF_BUILDINFO']:
- defs.append('NAN_BUILDINFO')
+ defs.append('NAN_BUILDINFO')
env.BlenderLib ( 'bf_windowmanager', sources, Split(incs), defines=defs, libtype=['core'], priority=[5] )
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 9668b2e17c9..c21c714f125 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,9 +28,24 @@
#ifndef WM_API_H
#define WM_API_H
+/** \file WM_api.h
+ * \ingroup wm
+ *
+ * \page wmpage windowmanager
+ * \section wmabout About windowmanager
+ * \ref wm handles events received from \ref GHOST and manages
+ * the screens, areas and input for Blender
+ * \section wmnote NOTE
+ * \todo document
+ */
+
/* dna-savable wmStructs here */
#include "DNA_windowmanager_types.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bContext;
struct IDProperty;
struct wmEvent;
@@ -52,8 +67,10 @@ typedef struct wmJob wmJob;
/* general API */
void WM_setprefsize (int stax, int stay, int sizx, int sizy);
+void WM_setinitialstate_fullscreen(void);
+void WM_setinitialstate_normal(void);
-void WM_init (struct bContext *C, int argc, char **argv);
+void WM_init (struct bContext *C, int argc, const char **argv);
void WM_exit (struct bContext *C);
void WM_main (struct bContext *C);
@@ -75,10 +92,11 @@ void WM_window_open_temp (struct bContext *C, struct rcti *position, int type);
/* files */
-int WM_read_homefile (struct bContext *C, struct wmOperator *op);
+int WM_read_homefile_exec(struct bContext *C, struct wmOperator *op);
+int WM_read_homefile (struct bContext *C, struct ReportList *reports, short from_memory);
int WM_write_homefile (struct bContext *C, struct wmOperator *op);
-void WM_read_file (struct bContext *C, char *name, struct ReportList *reports);
-int WM_write_file (struct bContext *C, char *target, int fileflags, struct ReportList *reports, int copy);
+void WM_read_file (struct bContext *C, const char *name, struct ReportList *reports);
+int WM_write_file (struct bContext *C, const char *target, int fileflags, struct ReportList *reports, int copy);
void WM_read_autosavefile(struct bContext *C);
void WM_autosave_init (struct wmWindowManager *wm);
@@ -97,44 +115,44 @@ void WM_paint_cursor_end(struct wmWindowManager *wm, void *handle);
void WM_cursor_warp (struct wmWindow *win, int x, int y);
/* keyconfig and keymap */
-wmKeyConfig *WM_keyconfig_new (struct wmWindowManager *wm, char *idname);
-wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, char *idname);
+wmKeyConfig *WM_keyconfig_new (struct wmWindowManager *wm, const char *idname);
+wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, const char *idname);
void WM_keyconfig_remove (struct wmWindowManager *wm, struct wmKeyConfig *keyconf);
void WM_keyconfig_free (struct wmKeyConfig *keyconf);
-void WM_keyconfig_userdef(struct wmWindowManager *wm);
+void WM_keyconfig_userdef(void);
void WM_keymap_init (struct bContext *C);
void WM_keymap_free (struct wmKeyMap *keymap);
-wmKeyMapItem *WM_keymap_verify_item(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_verify_item(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, char *idname, int type,
+wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, const char *idname, int type,
int val, int modifier, int keymodifier);
-void WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
+void WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len);
-wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid);
-wmKeyMap *WM_keymap_find(struct wmKeyConfig *keyconf, char *idname, int spaceid, int regionid);
-wmKeyMap *WM_keymap_find_all(const struct bContext *C, char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_find(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid);
+wmKeyMap *WM_keymap_find_all(const struct bContext *C, const char *idname, int spaceid, int regionid);
wmKeyMap *WM_keymap_active(struct wmWindowManager *wm, struct wmKeyMap *keymap);
-wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, char *opname);
+wmKeyMap *WM_keymap_guess_opname(const struct bContext *C, const char *opname);
int WM_keymap_user_init(struct wmWindowManager *wm, struct wmKeyMap *keymap);
wmKeyMap *WM_keymap_copy_to_user(struct wmKeyMap *keymap);
void WM_keymap_restore_to_default(struct wmKeyMap *keymap);
-void WM_keymap_properties_reset(struct wmKeyMapItem *kmi);
+void WM_keymap_properties_reset(struct wmKeyMapItem *kmi, struct IDProperty *properties);
void WM_keymap_restore_item_to_default(struct bContext *C, struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
wmKeyMapItem *WM_keymap_item_find_id(struct wmKeyMap *keymap, int id);
int WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2);
int WM_userdef_event_map(int kmitype);
-wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, struct EnumPropertyItem *items);
-wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, char *idname);
+wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, const char *idname, struct EnumPropertyItem *items);
+wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, const char *idname);
wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
-void WM_modalkeymap_assign(struct wmKeyMap *km, char *opname);
+void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname);
const char *WM_key_event_string(short type);
int WM_key_event_operator_id(const struct bContext *C, const char *opname, int opcontext, struct IDProperty *properties, int hotkey, struct wmKeyMap **keymap_r);
@@ -194,7 +212,7 @@ int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op,
int WM_operator_redo_popup (struct bContext *C, struct wmOperator *op);
int WM_operator_ui_popup (struct bContext *C, struct wmOperator *op, int width, int height);
-int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, char *message);
+int WM_operator_confirm_message(struct bContext *C, struct wmOperator *op, const char *message);
/* operator api */
void WM_operator_free (struct wmOperator *op);
@@ -207,18 +225,20 @@ void WM_operatortype_append_ptr (void (*opfunc)(struct wmOperatorType*, void *)
void WM_operatortype_append_macro_ptr (void (*opfunc)(struct wmOperatorType*, void *), void *userdata);
int WM_operatortype_remove(const char *idname);
-struct wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag);
+struct wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *name, int flag);
struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *ot, const char *idname);
int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot);
+int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context);
int WM_operator_call (struct bContext *C, struct wmOperator *op);
int WM_operator_repeat (struct bContext *C, struct wmOperator *op);
-int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
+int WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
+int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports);
void WM_operator_properties_alloc(struct PointerRNA **ptr, struct IDProperty **properties, const char *opstring); /* used for keymap and macro items */
-void WM_operator_properties_sanitize(struct PointerRNA *ptr, int val); /* make props context sensitive or not */
+void WM_operator_properties_sanitize(struct PointerRNA *ptr, const short no_context); /* make props context sensitive or not */
void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring);
void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot);
void WM_operator_properties_free(struct PointerRNA *ptr);
@@ -289,7 +309,7 @@ void WM_event_drag_image(struct wmDrag *, struct ImBuf *, float scale, int sx
struct wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, int (*poll)(struct bContext *, struct wmDrag *, struct wmEvent *event),
void (*copy)(struct wmDrag *, struct wmDropBox *));
-ListBase *WM_dropboxmap_find(char *idname, int spaceid, int regionid);
+ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid);
/* Set a subwindow active in pixelspace view, with optional scissor subset */
void wmSubWindowSet (struct wmWindow *win, int swinid);
@@ -308,8 +328,9 @@ int WM_framebuffer_to_index(unsigned int col);
#define WM_JOB_PRIORITY 1
#define WM_JOB_EXCL_RENDER 2
#define WM_JOB_PROGRESS 4
+#define WM_JOB_SUSPEND 8
-struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, char *name, int flag);
+struct wmJob *WM_jobs_get(struct wmWindowManager *wm, struct wmWindow *win, void *owner, const char *name, int flag);
int WM_jobs_test(struct wmWindowManager *wm, void *owner);
float WM_jobs_progress(struct wmWindowManager *wm, void *owner);
@@ -325,7 +346,7 @@ void WM_jobs_callbacks(struct wmJob *,
void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *);
void WM_jobs_stop(struct wmWindowManager *wm, void *owner, void *startjob);
-void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void *startjob);
+void WM_jobs_kill(struct wmWindowManager *wm, void *owner, void (*)(void *, short int *, short int *, float *));
void WM_jobs_stop_all(struct wmWindowManager *wm);
/* clipboard */
@@ -336,5 +357,17 @@ void WM_clipboard_text_set(char *buf, int selection);
void WM_progress_set(struct wmWindow *win, float progress);
void WM_progress_clear(struct wmWindow *win);
+#ifdef WIN32
+ /* Windows System Console */
+void WM_toggle_console(struct bContext *C, short show);
+#endif
+
+/* debugging only, convenience function to write on crash */
+int write_crash_blend(void);
+
+#ifdef __cplusplus
+}
+#endif
+
#endif /* WM_API_H */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index bcdef5c2278..a0202d2b4cc 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/windowmanager/WM_types.h
+ * \ingroup wm
+ */
+
#ifndef WM_TYPES_H
#define WM_TYPES_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
struct bContext;
struct wmEvent;
struct wmWindowManager;
@@ -51,6 +60,7 @@ struct ImBuf;
#define OPTYPE_BLOCKING 4 /* let blender grab all input from the WM (X11) */
#define OPTYPE_MACRO 8
#define OPTYPE_GRAB_POINTER 16 /* */
+#define OPTYPE_PRESET 32 /* show preset menu */
/* context to call operator in for WM_operator_name_call */
/* rna_ui.c contains EnumPropertyItem's of these, keep in sync */
@@ -167,6 +177,8 @@ typedef struct wmNotifier {
#define ND_ANIMPLAY (4<<16)
#define ND_GPENCIL (5<<16)
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/
+#define ND_SCREENSET (7<<16)
+#define ND_SKETCH (8<<16)
/* NC_SCENE Scene */
#define ND_SCENEBROWSE (1<<16)
@@ -177,27 +189,33 @@ typedef struct wmNotifier {
#define ND_SEQUENCER (6<<16)
#define ND_OB_ACTIVE (7<<16)
#define ND_OB_SELECT (8<<16)
-#define ND_MODE (9<<16)
-#define ND_RENDER_RESULT (10<<16)
-#define ND_COMPO_RESULT (11<<16)
-#define ND_KEYINGSET (12<<16)
-#define ND_TOOLSETTINGS (13<<16)
-#define ND_LAYER (14<<16)
-#define ND_FRAME_RANGE (15<<16)
+#define ND_OB_VISIBLE (9<<16)
+#define ND_OB_RENDER (10<<16)
+#define ND_MODE (11<<16)
+#define ND_RENDER_RESULT (12<<16)
+#define ND_COMPO_RESULT (13<<16)
+#define ND_KEYINGSET (14<<16)
+#define ND_TOOLSETTINGS (15<<16)
+#define ND_LAYER (16<<16)
+#define ND_FRAME_RANGE (17<<16)
+#define ND_TRANSFORM_DONE (18<<16)
+#define ND_WORLD (92<<16)
+#define ND_LAYER_CONTENT (101<<16)
#define ND_LAYER_CONTENT (101<<16)
/* NC_OBJECT Object */
-#define ND_TRANSFORM (16<<16)
-#define ND_OB_SHADING (17<<16)
-#define ND_POSE (18<<16)
-#define ND_BONE_ACTIVE (19<<16)
-#define ND_BONE_SELECT (20<<16)
-#define ND_DRAW (21<<16)
-#define ND_MODIFIER (22<<16)
-#define ND_KEYS (23<<16)
-#define ND_CONSTRAINT (24<<16)
-#define ND_PARTICLE (25<<16)
-#define ND_POINTCACHE (26<<16)
+#define ND_TRANSFORM (18<<16)
+#define ND_OB_SHADING (19<<16)
+#define ND_POSE (20<<16)
+#define ND_BONE_ACTIVE (21<<16)
+#define ND_BONE_SELECT (22<<16)
+#define ND_DRAW (23<<16)
+#define ND_MODIFIER (24<<16)
+#define ND_KEYS (25<<16)
+#define ND_CONSTRAINT (26<<16)
+#define ND_PARTICLE (27<<16)
+#define ND_POINTCACHE (28<<16)
+#define ND_PARENT (29<<16)
/* NC_MATERIAL Material */
#define ND_SHADING (30<<16)
@@ -210,6 +228,7 @@ typedef struct wmNotifier {
/* NC_WORLD World */
#define ND_WORLD_DRAW (45<<16)
+#define ND_WORLD_STARS (46<<16)
/* NC_TEXT Text */
#define ND_CURSOR (50<<16)
@@ -232,23 +251,23 @@ typedef struct wmNotifier {
/* NC_SPACE */
#define ND_SPACE_CONSOLE (1<<16) /* general redraw */
-#define ND_SPACE_CONSOLE_REPORT (2<<16) /* update for reports, could specify type */
-#define ND_SPACE_INFO (2<<16)
-#define ND_SPACE_IMAGE (3<<16)
-#define ND_SPACE_FILE_PARAMS (4<<16)
-#define ND_SPACE_FILE_LIST (5<<16)
-#define ND_SPACE_NODE (6<<16)
-#define ND_SPACE_OUTLINER (7<<16)
-#define ND_SPACE_VIEW3D (8<<16)
-#define ND_SPACE_PROPERTIES (9<<16)
-#define ND_SPACE_TEXT (10<<16)
-#define ND_SPACE_TIME (11<<16)
-#define ND_SPACE_GRAPH (12<<16)
-#define ND_SPACE_DOPESHEET (13<<16)
-#define ND_SPACE_NLA (14<<16)
-#define ND_SPACE_SEQUENCER (15<<16)
-#define ND_SPACE_NODE_VIEW (16<<16)
-#define ND_SPACE_CHANGED (17<<16) /*sent to a new editor type after it's replaced an old one*/
+#define ND_SPACE_INFO_REPORT (2<<16) /* update for reports, could specify type */
+#define ND_SPACE_INFO (3<<16)
+#define ND_SPACE_IMAGE (4<<16)
+#define ND_SPACE_FILE_PARAMS (5<<16)
+#define ND_SPACE_FILE_LIST (6<<16)
+#define ND_SPACE_NODE (7<<16)
+#define ND_SPACE_OUTLINER (8<<16)
+#define ND_SPACE_VIEW3D (9<<16)
+#define ND_SPACE_PROPERTIES (10<<16)
+#define ND_SPACE_TEXT (11<<16)
+#define ND_SPACE_TIME (12<<16)
+#define ND_SPACE_GRAPH (13<<16)
+#define ND_SPACE_DOPESHEET (14<<16)
+#define ND_SPACE_NLA (15<<16)
+#define ND_SPACE_SEQUENCER (16<<16)
+#define ND_SPACE_NODE_VIEW (17<<16)
+#define ND_SPACE_CHANGED (18<<16) /*sent to a new editor type after it's replaced an old one*/
/* subtype, 256 entries too */
#define NOTE_SUBTYPE 0x0000FF00
@@ -376,15 +395,21 @@ typedef struct wmTimer {
typedef struct wmOperatorType {
struct wmOperatorType *next, *prev;
- char *name; /* text for ui, undo */
- char *idname; /* unique identifier */
- char *description; /* tooltips and python docs */
+ const char *name; /* text for ui, undo */
+ const char *idname; /* unique identifier */
+ const char *description; /* tooltips and python docs */
/* this callback executes the operator without any interactive input,
* parameters may be provided through operator properties. cannot use
* any interface code or input device state.
* - see defines below for return values */
int (*exec)(struct bContext *, struct wmOperator *);
+
+ /* this callback executes on a running operator whenever as property
+ * is changed. It can correct its own properties or report errors for
+ * invalid settings in exceptional cases.
+ * Boolean return value, True denotes a change has been made and to redraw */
+ int (*check)(struct bContext *, struct wmOperator *);
/* for modal temporary operators, initially invoke is called. then
* any further events are handled in modal. if the operation is
@@ -444,9 +469,9 @@ enum {
typedef struct wmReport {
struct wmReport *next, *prev;
- int type;
const char *typestr;
char *message;
+ int type;
} wmReport;
/* *************** Drag and drop *************** */
@@ -464,14 +489,14 @@ typedef struct wmDrag {
int icon, type; /* type, see WM_DRAG defines above */
void *poin;
- char path[FILE_MAX];
+ char path[240]; /* FILE_MAX */
double value;
struct ImBuf *imb; /* if no icon but imbuf should be drawn around cursor */
float scale;
short sx, sy;
- char opname[FILE_MAX]; /* if set, draws operator name*/
+ char opname[240]; /* FILE_MAX */ /* if set, draws operator name*/
} wmDrag;
/* dropboxes are like keymaps, part of the screen/area/region definition */
@@ -487,7 +512,8 @@ typedef struct wmDropBox {
/* if poll survives, operator is called */
wmOperatorType *ot; /* not saved in file, so can be pointer */
-
+ short opcontext; /* default invoke */
+
struct IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */
struct PointerRNA *ptr; /* rna pointer to access properties */
@@ -501,5 +527,9 @@ typedef struct RecentFile {
} RecentFile;
+#ifdef __cplusplus
+}
+#endif
+
#endif /* WM_TYPES_H */
diff --git a/source/blender/windowmanager/intern/Makefile b/source/blender/windowmanager/intern/Makefile
deleted file mode 100644
index 60be5fed4b2..00000000000
--- a/source/blender/windowmanager/intern/Makefile
+++ /dev/null
@@ -1,98 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = windowmanager
-DIR = $(OCGDIR)/blender/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# OpenGL and Python
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-# PreProcessor stuff
-
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_ELBEEM)/include
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-# modules
-CPPFLAGS += -I../../editors/include
-CPPFLAGS += -I../../python
-CPPFLAGS += -I../../makesdna
-CPPFLAGS += -I../../makesrna
-CPPFLAGS += -I../../blenlib
-CPPFLAGS += -I../../blenkernel
-CPPFLAGS += -I../../nodes
-CPPFLAGS += -I../../imbuf
-CPPFLAGS += -I../../blenloader
-CPPFLAGS += -I../../gpu
-CPPFLAGS += -I../../render/extern/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../blenfont
-
-# path to the guarded memory allocator
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
-
-ifeq ($(INTERNATIONAL), true)
- CPPFLAGS += -DINTERNATIONAL
-endif
-
-ifeq ($(WITH_QUICKTIME),true)
- CPPFLAGS += -I../quicktime
- CPPFLAGS += -DWITH_QUICKTIME
-endif
-
-ifeq ($(WITH_OPENCOLLADA), true)
- CPPFLAGS += -DWITH_COLLADA
-endif
-
-ifeq ($(NAN_BUILDINFO), true)
- CPPFLAGS += -DNAN_BUILDINFO
-endif
-
-ifeq ($(OS),linux)
- ifeq ($(CPU),alpha)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),i386)
- CPPFLAGS += -I$(NAN_MESA)/include
- endif
- ifeq ($(CPU),powerpc)
- CPPFLAGS += -I/usr/src/MesaCVS/include
- endif
-endif
-
-# path to our own headerfiles
-CPPFLAGS += -I..
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index 5f386170c54..424c13f089f 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm.c
+ * \ingroup wm
+ */
+
+
#include <string.h>
#include <stddef.h>
@@ -57,8 +62,10 @@
#include "MEM_guardedalloc.h"
#include "ED_screen.h"
-#include "BPY_extern.h"
+#ifdef WITH_PYTHON
+#include "BPY_extern.h"
+#endif
/* ****************************************************** */
@@ -67,7 +74,7 @@
void WM_operator_free(wmOperator *op)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(op->py_instance) {
/* do this first incase there are any __del__ functions or
* similar that use properties */
@@ -125,7 +132,7 @@ void wm_operator_register(bContext *C, wmOperator *op)
}
/* so the console is redrawn */
- WM_event_add_notifier(C, NC_SPACE|ND_SPACE_CONSOLE_REPORT, NULL);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_INFO_REPORT, NULL);
WM_event_add_notifier(C, NC_WM|ND_HISTORY, NULL);
}
@@ -203,7 +210,7 @@ void WM_keymap_init(bContext *C)
/* create default key config */
wm_window_keymap(wm->defaultconf);
ED_spacetypes_keymap(wm->defaultconf);
- WM_keyconfig_userdef(wm);
+ WM_keyconfig_userdef();
wm->initialized |= WM_INIT_KEYMAP;
}
@@ -229,13 +236,14 @@ void WM_check(bContext *C)
}
/* case: no open windows at all, for old file reads */
- wm_window_add_ghostwindows(wm);
+ wm_window_add_ghostwindows(C, wm);
+ }
- /* case: fileread */
- if((wm->initialized & WM_INIT_WINDOW) == 0) {
- ED_screens_initialize(wm);
- wm->initialized |= WM_INIT_WINDOW;
- }
+ /* case: fileread */
+ /* note: this runs in bg mode to set the screen context cb */
+ if((wm->initialized & WM_INIT_WINDOW) == 0) {
+ ED_screens_initialize(wm);
+ wm->initialized |= WM_INIT_WINDOW;
}
}
@@ -272,7 +280,7 @@ void wm_add_default(bContext *C)
win= wm_window_new(C);
win->screen= screen;
screen->winid= win->winid;
- BLI_strncpy(win->screenname, screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, screen->id.name+2, sizeof(win->screenname));
wm->winactive= win;
wm->file_saved= 1;
diff --git a/source/blender/windowmanager/intern/wm_apple.c b/source/blender/windowmanager/intern/wm_apple.c
index 22b4b85c01e..083500420a4 100644
--- a/source/blender/windowmanager/intern/wm_apple.c
+++ b/source/blender/windowmanager/intern/wm_apple.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_apple.c
+ * \ingroup wm
+ */
+
+
#ifdef __APPLE__
#include "BKE_context.h"
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index 1803a1cee91..5951393a497 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_cursors.c
+ * \ingroup wm
+ */
+
+
#include <stdio.h>
#include <string.h>
@@ -70,7 +75,7 @@ static GHOST_TStandardCursor convert_cursor(int curs)
}
}
-void window_set_custom_cursor(wmWindow *win, unsigned char mask[16][2],
+static void window_set_custom_cursor(wmWindow *win, unsigned char mask[16][2],
unsigned char bitmap[16][2], int hotx, int hoty)
{
GHOST_SetCustomCursorShape(win->ghostwin, bitmap, mask, hotx, hoty);
@@ -116,6 +121,9 @@ void WM_cursor_set(wmWindow *win, int curs)
GHOST_SetCursorVisibility(win->ghostwin, 1);
+ if(curs == CURSOR_STD && win->modalcursor)
+ curs= win->modalcursor;
+
win->cursor= curs;
/* detect if we use system cursor or Blender cursor */
@@ -139,14 +147,15 @@ void WM_cursor_set(wmWindow *win, int curs)
void WM_cursor_modal(wmWindow *win, int val)
{
- if(win->lastcursor == 0) {
+ if(win->lastcursor == 0)
win->lastcursor = win->cursor;
- WM_cursor_set(win, val);
- }
+ win->modalcursor = val;
+ WM_cursor_set(win, val);
}
void WM_cursor_restore(wmWindow *win)
{
+ win->modalcursor = 0;
if(win->lastcursor)
WM_cursor_set(win, win->lastcursor);
win->lastcursor = 0;
@@ -155,14 +164,16 @@ void WM_cursor_restore(wmWindow *win)
/* to allow usage all over, we do entire WM */
void WM_cursor_wait(int val)
{
- wmWindowManager *wm= G.main->wm.first;
- wmWindow *win= wm->windows.first;
-
- for(; win; win= win->next) {
- if(val) {
- WM_cursor_modal(win, CURSOR_WAIT);
- } else {
- WM_cursor_restore(win);
+ if(!G.background) {
+ wmWindowManager *wm= G.main->wm.first;
+ wmWindow *win= wm?wm->windows.first:NULL;
+
+ for(; win; win= win->next) {
+ if(val) {
+ WM_cursor_modal(win, BC_WAITCURSOR);
+ } else {
+ WM_cursor_restore(win);
+ }
}
}
}
@@ -217,13 +228,12 @@ void WM_timecursor(wmWindow *win, int nr)
{0, 56, 68, 68, 120, 64, 68, 56}
};
unsigned char mask[16][2];
- unsigned char bitmap[16][2];
+ unsigned char bitmap[16][2]= {{0}};
int i, idx;
if(win->lastcursor == 0)
win->lastcursor= win->cursor;
- memset(&bitmap, 0x00, sizeof(bitmap));
memset(&mask, 0xFF, sizeof(mask));
/* print number bottom right justified */
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 18b1e7239ed..21a725124ad 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_dragdrop.c
+ * \ingroup wm
+ */
+
+
#include <string.h>
#include "DNA_windowmanager_types.h"
@@ -75,7 +80,8 @@ typedef struct wmDropBoxMap {
} wmDropBoxMap;
-ListBase *WM_dropboxmap_find(char *idname, int spaceid, int regionid)
+/* spaceid/regionid is zero for window drop maps */
+ListBase *WM_dropboxmap_find(const char *idname, int spaceid, int regionid)
{
wmDropBoxMap *dm;
@@ -103,6 +109,7 @@ wmDropBox *WM_dropbox_add(ListBase *lb, const char *idname, int (*poll)(bContext
drop->poll= poll;
drop->copy= copy;
drop->ot= WM_operatortype_find(idname, 0);
+ drop->opcontext= WM_OP_INVOKE_DEFAULT;
if(drop->ot==NULL) {
MEM_freeN(drop);
@@ -167,7 +174,7 @@ void WM_event_drag_image(wmDrag *drag, ImBuf *imb, float scale, int sx, int sy)
}
-static char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEvent *event)
+static const char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEvent *event)
{
wmEventHandler *handler= handlers->first;
for(; handler; handler= handler->next) {
@@ -183,12 +190,12 @@ static char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag, wmEve
}
/* return active operator name when mouse is in box */
-static char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event)
+static const char *wm_dropbox_active(bContext *C, wmDrag *drag, wmEvent *event)
{
wmWindow *win= CTX_wm_window(C);
ScrArea *sa= CTX_wm_area(C);
ARegion *ar= CTX_wm_region(C);
- char *name;
+ const char *name;
name= dropbox_active(C, &win->handlers, drag, event);
if(name) return name;
@@ -218,7 +225,7 @@ static void wm_drop_operator_options(bContext *C, wmDrag *drag, wmEvent *event)
strcpy(drag->opname, "Paste name");
}
else {
- char *opname= wm_dropbox_active(C, drag, event);
+ const char *opname= wm_dropbox_active(C, drag, event);
if(opname) {
BLI_strncpy(drag->opname, opname, FILE_MAX);
@@ -256,7 +263,7 @@ static void wm_drop_operator_draw(char *name, int x, int y)
UI_DrawString(x+4, y+4, name);
}
-static char *wm_drag_name(wmDrag *drag)
+static const char *wm_drag_name(wmDrag *drag)
{
switch(drag->type) {
case WM_DRAG_ID:
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 81417e8f8f1..c94ad74be72 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_draw.c
+ * \ingroup wm
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <GL/glew.h>
@@ -39,10 +44,11 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+
#include "GHOST_C-api.h"
@@ -79,13 +85,13 @@ static void wm_paintcursor_draw(bContext *C, ARegion *ar)
if(screen->subwinactive == ar->swinid) {
for(pc= wm->paintcursors.first; pc; pc= pc->next) {
if(pc->poll == NULL || pc->poll(C)) {
- ARegion *ar= CTX_wm_region(C);
+ ARegion *ar_other= CTX_wm_region(C);
if (ELEM(win->grabcursor, GHOST_kGrabWrap, GHOST_kGrabHide)) {
int x = 0, y = 0;
wm_get_cursor_position(win, &x, &y);
- pc->draw(C, x - ar->winrct.xmin, y - ar->winrct.ymin, pc->customdata);
+ pc->draw(C, x - ar_other->winrct.xmin, y - ar_other->winrct.ymin, pc->customdata);
} else {
- pc->draw(C, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin, pc->customdata);
+ pc->draw(C, win->eventstate->x - ar_other->winrct.xmin, win->eventstate->y - ar_other->winrct.ymin, pc->customdata);
}
}
}
@@ -127,7 +133,7 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
}
}
@@ -242,7 +248,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
if(exchange)
@@ -253,11 +259,10 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
wm_paintcursor_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
ar->swap= WIN_BOTH_OK;
- printf("draws swap exchange %d\n", ar->swinid);
}
else if(ar->swap == WIN_BACK_OK)
ar->swap= WIN_FRONT_OK;
@@ -560,7 +565,7 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
bScreen *screen= win->screen;
ScrArea *sa;
ARegion *ar;
- int copytex= 0;
+ int copytex= 0, paintcursor= 1;
if(win->drawdata) {
glClearColor(0, 0, 0, 0);
@@ -569,8 +574,6 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
wmSubWindowSet(win, screen->mainwin);
wm_triple_draw_textures(win, win->drawdata);
-
- triple= win->drawdata;
}
else {
win->drawdata= MEM_callocN(sizeof(wmDrawTriple), "wmDrawTriple");
@@ -592,7 +595,7 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
if(ar->swinid && ar->do_draw) {
CTX_wm_region_set(C, ar);
ED_region_do_draw(C, ar);
- ED_area_overdraw_flush(C, sa, ar);
+ ED_area_overdraw_flush(sa, ar);
CTX_wm_region_set(C, NULL);
copytex= 1;
}
@@ -618,13 +621,16 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
CTX_wm_menu_set(C, ar);
ED_region_do_draw(C, ar);
CTX_wm_menu_set(C, NULL);
+ /* when a menu is being drawn, don't do the paint cursors */
+ paintcursor= 0;
}
}
- if(screen->do_draw_gesture)
+ /* always draw, not only when screen tagged */
+ if(win->gesture.first)
wm_gesture_draw(win);
- if(wm->paintcursors.first) {
+ if(paintcursor && wm->paintcursors.first) {
for(sa= screen->areabase.first; sa; sa= sa->next) {
for(ar=sa->regionbase.first; ar; ar= ar->next) {
if(ar->swinid == screen->subwinactive) {
@@ -810,7 +816,7 @@ void wm_draw_region_clear(wmWindow *win, ARegion *ar)
win->screen->do_draw= 1;
}
-void wm_draw_region_modified(wmWindow *win, ARegion *ar)
+static void wm_draw_region_modified(wmWindow *win, ARegion *ar)
{
int drawmethod= wm_automatic_draw_method(win);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 6c056ea5c92..c15916cf3d4 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_event_system.c
+ * \ingroup wm
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -41,6 +46,7 @@
#include "GHOST_C-api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -50,12 +56,13 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+
#include "BKE_sound.h"
#include "ED_fileselect.h"
#include "ED_info.h"
#include "ED_screen.h"
+#include "ED_view3d.h"
#include "ED_util.h"
#include "RNA_access.h"
@@ -72,6 +79,8 @@
#include "wm_event_types.h"
#include "wm_draw.h"
+static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only);
+
/* ************ event management ************** */
void wm_event_add(wmWindow *win, wmEvent *event_to_add)
@@ -241,15 +250,13 @@ void wm_event_do_notifiers(bContext *C)
if(!G.rendering) {
/* depsgraph gets called, might send more notifiers */
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), win->screen->scene, win->screen, 1);
}
}
}
/* the notifiers are sent without context, to keep it clean */
while( (note=wm_notifier_next(wm)) ) {
- wmWindow *win;
-
for(win= wm->windows.first; win; win= win->next) {
/* filter out notifiers */
@@ -294,14 +301,25 @@ void wm_event_do_notifiers(bContext *C)
}
/* XXX make lock in future, or separated derivedmesh users in scene */
- if(!G.rendering)
+ if(!G.rendering) {
/* depsgraph & animation: update tagged datablocks */
+
+ /* copied to set's in scene_update_tagged_recursive() */
+ win->screen->scene->customdata_mask= ED_viewedit_datamask(win->screen);
+
scene_update_tagged(CTX_data_main(C), win->screen->scene);
+ }
}
CTX_wm_window_set(C, NULL);
}
+static int wm_event_always_pass(wmEvent *event)
+{
+ /* some events we always pass on, to ensure proper communication */
+ return ISTIMER(event->type) || (event->type == WINDEACTIVATE);
+}
+
/* ********************* ui handler ******************* */
static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *event, int always_pass)
@@ -309,8 +327,19 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
ScrArea *area= CTX_wm_area(C);
ARegion *region= CTX_wm_region(C);
ARegion *menu= CTX_wm_menu(C);
+ static int do_wheel_ui= 1;
+ int is_wheel= ELEM(event->type, WHEELUPMOUSE, WHEELDOWNMOUSE);
int retval;
-
+
+ /* UI is quite agressive with swallowing events, like scrollwheel */
+ /* I realize this is not extremely nice code... when UI gets keymaps it can be maybe smarter */
+ if(do_wheel_ui==0) {
+ if(is_wheel)
+ return WM_HANDLER_CONTINUE;
+ else if(wm_event_always_pass(event)==0)
+ do_wheel_ui= 1;
+ }
+
/* we set context to where ui handler came from */
if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
@@ -330,10 +359,14 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
CTX_wm_region_set(C, NULL);
CTX_wm_menu_set(C, NULL);
}
-
+
if(retval == WM_UI_HANDLER_BREAK)
return WM_HANDLER_BREAK;
-
+
+ /* event not handled in UI, if wheel then we temporarily disable it */
+ if(is_wheel)
+ do_wheel_ui= 0;
+
return WM_HANDLER_CONTINUE;
}
@@ -364,9 +397,9 @@ int WM_operator_poll(bContext *C, wmOperatorType *ot)
wmOperatorTypeMacro *otmacro;
for(otmacro= ot->macro.first; otmacro; otmacro= otmacro->next) {
- wmOperatorType *ot= WM_operatortype_find(otmacro->idname, 0);
+ wmOperatorType *ot_macro= WM_operatortype_find(otmacro->idname, 0);
- if(0==WM_operator_poll(C, ot))
+ if(0==WM_operator_poll(C, ot_macro))
return 0;
}
@@ -379,49 +412,55 @@ int WM_operator_poll(bContext *C, wmOperatorType *ot)
return 1;
}
-static void wm_operator_print(wmOperator *op)
+/* sets up the new context and calls 'wm_operator_invoke()' with poll_only */
+int WM_operator_poll_context(bContext *C, wmOperatorType *ot, int context)
+{
+ return wm_operator_call_internal(C, ot, NULL, NULL, context, TRUE);
+}
+
+static void wm_operator_print(bContext *C, wmOperator *op)
{
- char *buf = WM_operator_pystring(NULL, op->type, op->ptr, 1);
+ /* context is needed for enum function */
+ char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
printf("%s\n", buf);
MEM_freeN(buf);
}
static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int popup)
{
- wmWindowManager *wm = CTX_wm_manager(C);
- ReportList *reports = CTX_wm_reports(C);
- char *buf;
-
if(popup)
if(op->reports->list.first)
uiPupMenuReports(C, op->reports);
if(retval & OPERATOR_FINISHED) {
if(G.f & G_DEBUG)
- wm_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */
+ wm_operator_print(C, op); /* todo - this print may double up, might want to check more flags then the FINISHED */
if (op->type->flag & OPTYPE_REGISTER) {
/* Report the python string representation of the operator */
- buf = WM_operator_pystring(C, op->type, op->ptr, 1);
+ char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf);
MEM_freeN(buf);
}
}
if (op->reports->list.first) {
+
+ wmWindowManager *wm = CTX_wm_manager(C);
+ ReportList *wm_reports= CTX_wm_reports(C);
ReportTimerInfo *rti;
-
+
/* add reports to the global list, otherwise they are not seen */
- addlisttolist(&CTX_wm_reports(C)->list, &op->reports->list);
+ BLI_movelisttolist(&wm_reports->list, &op->reports->list);
/* After adding reports to the global list, reset the report timer. */
- WM_event_remove_timer(wm, NULL, reports->reporttimer);
+ WM_event_remove_timer(wm, NULL, wm_reports->reporttimer);
/* Records time since last report was added */
- reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.02);
+ wm_reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.05);
rti = MEM_callocN(sizeof(ReportTimerInfo), "ReportTimerInfo");
- reports->reporttimer->customdata = rti;
+ wm_reports->reporttimer->customdata = rti;
}
}
@@ -430,7 +469,7 @@ static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int pop
*/
static int wm_operator_register_check(wmWindowManager *wm, wmOperatorType *ot)
{
- return (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
+ return wm && (wm->op_undo_depth == 0) && (ot->flag & OPTYPE_REGISTER);
}
static void wm_operator_finished(bContext *C, wmOperator *op, int repeat)
@@ -466,6 +505,8 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_CANCELLED;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+
if(op==NULL || op->type==NULL)
return retval;
@@ -505,6 +546,14 @@ int WM_operator_repeat(bContext *C, wmOperator *op)
{
return wm_operator_exec(C, op, 1);
}
+/* TRUE if WM_operator_repeat can run
+ * simple check for now but may become more involved.
+ * To be sure the operator can run call WM_operator_poll(C, op->type) also, since this call
+ * checks if WM_operator_repeat() can run at all, not that it WILL run at any time. */
+int WM_operator_repeat_check(const bContext *UNUSED(C), wmOperator *op)
+{
+ return op->type->exec != NULL;
+}
static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
{
@@ -601,11 +650,15 @@ static void wm_region_mouse_co(bContext *C, wmEvent *event)
}
}
-int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports)
+static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports, short poll_only)
{
wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_PASS_THROUGH;
+ /* this is done because complicated setup is done to call this function that is better not duplicated */
+ if(poll_only)
+ return WM_operator_poll(C, ot);
+
if(WM_operator_poll(C, ot)) {
wmOperator *op= wm_operator_create(wm, ot, properties, reports); /* if reports==NULL, theyll be initialized */
@@ -662,12 +715,22 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
}
if(wrap) {
+ rcti *winrect= NULL;
ARegion *ar= CTX_wm_region(C);
- if(ar) {
- bounds[0]= ar->winrct.xmin;
- bounds[1]= ar->winrct.ymax;
- bounds[2]= ar->winrct.xmax;
- bounds[3]= ar->winrct.ymin;
+ ScrArea *sa= CTX_wm_area(C);
+
+ if(ar && ar->regiontype == RGN_TYPE_WINDOW && event && BLI_in_rcti(&ar->winrct, event->x, event->y)) {
+ winrect= &ar->winrct;
+ }
+ else if(sa) {
+ winrect= &sa->totrct;
+ }
+
+ if(winrect) {
+ bounds[0]= winrect->xmin;
+ bounds[1]= winrect->ymax;
+ bounds[2]= winrect->xmax;
+ bounds[3]= winrect->ymin;
}
}
@@ -691,13 +754,15 @@ int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerR
* this is for python to access since its done the operator lookup
*
* invokes operator in context */
-static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
+static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, PointerRNA *properties, ReportList *reports, short context, short poll_only)
{
wmWindow *window= CTX_wm_window(C);
wmEvent *event;
int retval;
+ CTX_wm_operator_poll_msg_set(C, NULL);
+
/* dummie test */
if(ot && C) {
switch(context) {
@@ -735,6 +800,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
case WM_OP_EXEC_REGION_CHANNELS:
case WM_OP_INVOKE_REGION_CHANNELS:
type = RGN_TYPE_CHANNELS;
+ break;
case WM_OP_EXEC_REGION_PREVIEW:
case WM_OP_INVOKE_REGION_PREVIEW:
@@ -754,7 +820,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
CTX_wm_region_set(C, ar1);
}
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
/* set region back */
CTX_wm_region_set(C, ar);
@@ -768,7 +834,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
ARegion *ar= CTX_wm_region(C);
CTX_wm_region_set(C, NULL);
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
CTX_wm_region_set(C, ar);
return retval;
@@ -782,7 +848,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
CTX_wm_region_set(C, NULL);
CTX_wm_area_set(C, NULL);
- retval= wm_operator_invoke(C, ot, event, properties, reports);
+ retval= wm_operator_invoke(C, ot, event, properties, reports, poll_only);
CTX_wm_region_set(C, ar);
CTX_wm_area_set(C, area);
@@ -790,7 +856,7 @@ static int wm_operator_call_internal(bContext *C, wmOperatorType *ot, int contex
}
case WM_OP_EXEC_DEFAULT:
case WM_OP_INVOKE_DEFAULT:
- return wm_operator_invoke(C, ot, event, properties, reports);
+ return wm_operator_invoke(C, ot, event, properties, reports, poll_only);
}
}
@@ -803,7 +869,7 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
{
wmOperatorType *ot= WM_operatortype_find(opstring, 0);
if(ot)
- return wm_operator_call_internal(C, ot, context, properties, NULL);
+ return wm_operator_call_internal(C, ot, properties, NULL, context, FALSE);
return 0;
}
@@ -815,7 +881,6 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, Pointe
*/
int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA *properties, ReportList *reports)
{
- wmWindowManager *wm= CTX_wm_manager(C);
int retval= OPERATOR_CANCELLED;
#if 0
@@ -835,11 +900,12 @@ int WM_operator_call_py(bContext *C, wmOperatorType *ot, int context, PointerRNA
printf("error \"%s\" operator has no exec function, python cannot call it\n", op->type->name);
#endif
- retval= wm_operator_call_internal(C, ot, context, properties, reports);
+ retval= wm_operator_call_internal(C, ot, properties, reports, context, FALSE);
/* keep the reports around if needed later */
- if (retval & OPERATOR_RUNNING_MODAL || wm_operator_register_check(wm, ot))
- {
+ if ( (retval & OPERATOR_RUNNING_MODAL) ||
+ ((retval & OPERATOR_FINISHED) && wm_operator_register_check(CTX_wm_manager(C), ot))
+ ) {
reports->flag |= RPT_FREE; /* let blender manage freeing */
}
@@ -1066,11 +1132,6 @@ static int wm_eventmatch(wmEvent *winevent, wmKeyMapItem *kmi)
return 1;
}
-static int wm_event_always_pass(wmEvent *event)
-{
- /* some events we always pass on, to ensure proper communication */
- return ISTIMER(event->type) || (event->type == WINDEACTIVATE);
-}
/* operator exists */
static void wm_event_modalkeymap(const bContext *C, wmOperator *op, wmEvent *event)
@@ -1163,7 +1224,7 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
wmOperatorType *ot= WM_operatortype_find(event->keymap_idname, 0);
if(ot)
- retval= wm_operator_invoke(C, ot, event, properties, NULL);
+ retval= wm_operator_invoke(C, ot, event, properties, NULL, FALSE);
}
/* Finished and pass through flag as handled */
@@ -1224,23 +1285,30 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
case EVT_FILESELECT_EXEC:
case EVT_FILESELECT_CANCEL:
+ case EVT_FILESELECT_EXTERNAL_CANCEL:
{
/* XXX validate area and region? */
bScreen *screen= CTX_wm_screen(C);
-
- if(screen != handler->filescreen)
- ED_screen_full_prevspace(C, CTX_wm_area(C));
- else
- ED_area_prevspace(C, CTX_wm_area(C));
-
- /* remlink now, for load file case */
+
+ /* remlink now, for load file case before removing*/
BLI_remlink(handlers, handler);
+ if(event->val!=EVT_FILESELECT_EXTERNAL_CANCEL) {
+ if(screen != handler->filescreen) {
+ ED_screen_full_prevspace(C, CTX_wm_area(C));
+ }
+ else {
+ ED_area_prevspace(C, CTX_wm_area(C));
+ }
+ }
+
wm_handler_op_context(C, handler);
/* needed for uiPupMenuReports */
if(event->val==EVT_FILESELECT_EXEC) {
+#if 0 // use REDALERT now
+
/* a bit weak, might become arg for WM_event_fileselect? */
/* XXX also extension code in image-save doesnt work for this yet */
if (RNA_struct_find_property(handler->op->ptr, "check_existing") &&
@@ -1251,7 +1319,9 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
if(path)
MEM_freeN(path);
}
- else {
+ else
+#endif
+ {
int retval;
if(handler->op->type->flag & OPTYPE_UNDO)
@@ -1259,14 +1329,16 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
retval= handler->op->type->exec(C, handler->op);
+ /* XXX check this carefully, CTX_wm_manager(C) == wm is a bit hackish */
if(handler->op->type->flag & OPTYPE_UNDO && CTX_wm_manager(C) == wm)
wm->op_undo_depth--;
if (retval & OPERATOR_FINISHED)
if(G.f & G_DEBUG)
- wm_operator_print(handler->op);
+ wm_operator_print(C, handler->op);
- if(wm->op_undo_depth == 0)
+ /* XXX check this carefully, CTX_wm_manager(C) == wm is a bit hackish */
+ if(CTX_wm_manager(C) == wm && wm->op_undo_depth == 0)
if(handler->op->type->flag & OPTYPE_UNDO)
ED_undo_push_op(C, handler->op);
@@ -1284,7 +1356,7 @@ static int wm_handler_fileselect_call(bContext *C, ListBase *handlers, wmEventHa
/* XXX - copied from 'wm_operator_finished()' */
/* add reports to the global list, otherwise they are not seen */
- addlisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
+ BLI_movelisttolist(&CTX_wm_reports(C)->list, &handler->op->reports->list);
CTX_wm_window_set(C, win_prev);
}
@@ -1403,12 +1475,26 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
if(event->custom==EVT_DATA_LISTBASE) {
ListBase *lb= (ListBase *)event->customdata;
wmDrag *drag;
+
for(drag= lb->first; drag; drag= drag->next) {
if(drop->poll(C, drag, event)) {
+
drop->copy(drag, drop);
- wm_operator_invoke(C, drop->ot, event, drop->ptr, NULL);
+ /* free the drags before calling operator */
+ BLI_freelistN(event->customdata);
+ event->customdata= NULL;
+ event->custom= 0;
+
+ WM_operator_name_call(C, drop->ot->idname, drop->opcontext, drop->ptr);
action |= WM_HANDLER_BREAK;
+
+ /* XXX fileread case */
+ if(CTX_wm_window(C)==NULL)
+ return action;
+
+ /* escape from drag loop, got freed */
+ break;
}
}
}
@@ -1428,7 +1514,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
}
}
- /* fileread case */
+ /* XXX fileread case */
if(CTX_wm_window(C)==NULL)
return action;
}
@@ -1438,11 +1524,24 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
wmWindow *win = CTX_wm_window(C);
if (win && win->eventstate->prevtype == event->type && win->eventstate->prevval == KM_PRESS) {
- /* test for double click first */
- if ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time) {
+ /* test for double click first,
+ * note1: this can be problematic because single click operators can get the
+ * double click event but then with old mouse coords which is highly confusing,
+ * so check for mouse moves too.
+ * note2: the first click event will be handled but still used to create a
+ * double click event if clicking again quickly.
+ * If no double click events are found itwill fallback to a single click.
+ * So a double click event can result in 2 successive single click calls
+ * if its not handled by the keymap - campbell */
+ if ( (ABS(event->x - win->eventstate->prevclickx)) <= 2 &&
+ (ABS(event->y - win->eventstate->prevclicky)) <= 2 &&
+ ((PIL_check_seconds_timer() - win->eventstate->prevclicktime) * 1000 < U.dbl_click_time)
+ ) {
event->val = KM_DBL_CLICK;
- event->x = win->eventstate->prevclickx;
- event->y = win->eventstate->prevclicky;
+ /* removed this because in cases where we're this is used as a single click
+ * event, this will give old coords, since the distance is checked above, using new coords should be ok. */
+ // event->x = win->eventstate->prevclickx;
+ // event->y = win->eventstate->prevclicky;
action |= wm_handlers_do(C, event, handlers);
}
@@ -1609,7 +1708,7 @@ void wm_event_do_handlers(bContext *C)
int ncfra = sound_sync_scene(scene) * FPS + 0.5;
if(ncfra != scene->r.cfra) {
scene->r.cfra = ncfra;
- ED_update_for_newframe(C, 1);
+ ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
WM_event_add_notifier(C, NC_WINDOW, NULL);
}
}
@@ -1684,7 +1783,11 @@ void wm_event_do_handlers(bContext *C)
}
action |= wm_handlers_do(C, event, &ar->handlers);
-
+
+ /* fileread case (python), [#29489] */
+ if(CTX_wm_window(C)==NULL)
+ return;
+
doit |= (BLI_in_rcti(&ar->winrct, event->x, event->y));
if(action & WM_HANDLER_BREAK)
@@ -1765,11 +1868,11 @@ void wm_event_do_handlers(bContext *C)
/* only add mousemove when queue was read entirely */
if(win->addmousemove && win->eventstate) {
- wmEvent event= *(win->eventstate);
- event.type= MOUSEMOVE;
- event.prevx= event.x;
- event.prevy= event.y;
- wm_event_add(win, &event);
+ wmEvent tevent= *(win->eventstate);
+ tevent.type= MOUSEMOVE;
+ tevent.prevx= tevent.x;
+ tevent.prevy= tevent.y;
+ wm_event_add(win, &tevent);
win->addmousemove= 0;
}
@@ -1805,14 +1908,20 @@ void WM_event_fileselect_event(bContext *C, void *ophandle, int eventval)
void WM_event_add_fileselect(bContext *C, wmOperator *op)
{
- wmEventHandler *handler;
+ wmEventHandler *handler, *handlernext;
wmWindow *win= CTX_wm_window(C);
int full= 1; // XXX preset?
-
- /* only allow file selector open per window bug [#23553] */
- for(handler= win->modalhandlers.first; handler; handler=handler->next) {
- if(handler->type == WM_HANDLER_FILESELECT)
- return;
+
+ /* only allow 1 file selector open per window */
+ for(handler= win->modalhandlers.first; handler; handler=handlernext) {
+ handlernext= handler->next;
+
+ if(handler->type == WM_HANDLER_FILESELECT) {
+ if(handler->op)
+ WM_operator_free(handler->op);
+ BLI_remlink(&win->modalhandlers, handler);
+ wm_event_free_handler(handler);
+ }
}
handler = MEM_callocN(sizeof(wmEventHandler), "fileselect handler");
@@ -1825,11 +1934,17 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
BLI_addhead(&win->modalhandlers, handler);
+ /* check props once before invoking if check is available
+ * ensures initial properties are valid */
+ if(op->type->check) {
+ op->type->check(C, op); /* ignore return value */
+ }
+
WM_event_fileselect_event(C, op, full?EVT_FILESELECT_FULL_OPEN:EVT_FILESELECT_OPEN);
}
/* lets not expose struct outside wm? */
-void WM_event_set_handler_flag(wmEventHandler *handler, int flag)
+static void WM_event_set_handler_flag(wmEventHandler *handler, int flag)
{
handler->flag= flag;
}
@@ -1879,7 +1994,7 @@ wmEventHandler *WM_event_add_keymap_handler(ListBase *handlers, wmKeyMap *keymap
}
/* priorities not implemented yet, for time being just insert in begin of list */
-wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int priority)
+wmEventHandler *WM_event_add_keymap_handler_priority(ListBase *handlers, wmKeyMap *keymap, int UNUSED(priority))
{
wmEventHandler *handler;
@@ -1978,7 +2093,7 @@ void WM_event_remove_area_handler(ListBase *handlers, void *area)
}
}
-void WM_event_remove_handler(ListBase *handlers, wmEventHandler *handler)
+static void WM_event_remove_handler(ListBase *handlers, wmEventHandler *handler)
{
BLI_remlink(handlers, handler);
wm_event_free_handler(handler);
@@ -1994,21 +2109,29 @@ void WM_event_add_mousemove(bContext *C)
/* for modal callbacks, check configuration for how to interpret exit with tweaks */
int WM_modal_tweak_exit(wmEvent *evt, int tweak_event)
{
- /* user preset or keymap? dunno... */
- // XXX WTH is this?
- int tweak_modal= (U.flag & USER_RELEASECONFIRM)==0;
-
- switch(tweak_event) {
- case EVT_TWEAK_L:
- case EVT_TWEAK_M:
- case EVT_TWEAK_R:
- if(evt->val==tweak_modal)
- return 1;
- default:
- /* this case is when modal callcback didnt get started with a tweak */
- if(evt->val)
- return 1;
+ /* if the release-confirm userpref setting is enabled,
+ * tweak events can be cancelled when mouse is released
+ */
+ if (U.flag & USER_RELEASECONFIRM) {
+ /* option on, so can exit with km-release */
+ if (evt->val == KM_RELEASE) {
+ switch (tweak_event) {
+ case EVT_TWEAK_L:
+ case EVT_TWEAK_M:
+ case EVT_TWEAK_R:
+ return 1;
+ }
+ }
}
+ else {
+ /* this is fine as long as not doing km-release, otherwise
+ * some items (i.e. markers) being tweaked may end up getting
+ * dropped all over
+ */
+ if (evt->val != KM_RELEASE)
+ return 1;
+ }
+
return 0;
}
@@ -2052,7 +2175,7 @@ static int convert_key(GHOST_TKey key)
case GHOST_kKeyRightShift: return RIGHTSHIFTKEY;
case GHOST_kKeyLeftControl: return LEFTCTRLKEY;
case GHOST_kKeyRightControl: return RIGHTCTRLKEY;
- case GHOST_kKeyCommand: return COMMANDKEY;
+ case GHOST_kKeyOS: return OSKEY;
case GHOST_kKeyLeftAlt: return LEFTALTKEY;
case GHOST_kKeyRightAlt: return RIGHTALTKEY;
@@ -2083,7 +2206,12 @@ static int convert_key(GHOST_TKey key)
case GHOST_kKeyNumpadSlash: return PADSLASHKEY;
case GHOST_kKeyGrLess: return GRLESSKEY;
-
+
+ case GHOST_kKeyMediaPlay: return MEDIAPLAY;
+ case GHOST_kKeyMediaStop: return MEDIASTOP;
+ case GHOST_kKeyMediaFirst: return MEDIAFIRST;
+ case GHOST_kKeyMediaLast: return MEDIALAST;
+
default:
return UNKNOWNKEY; /* GHOST_kKeyUnknown */
}
@@ -2152,7 +2280,7 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
/* windows store own event queues, no bContext here */
/* time is in 1000s of seconds, from ghost */
-void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int time, void *customdata)
+void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int UNUSED(time), void *customdata)
{
wmWindow *owin;
wmEvent event, *evt= win->eventstate;
@@ -2186,7 +2314,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
event.type= MOUSEMOVE;
/* some painting operators want accurate mouse events, they can
- handle inbetween mouse move moves, others can happily ignore
+ handle in between mouse move moves, others can happily ignore
them for better performance */
if(lastevent && lastevent->type == MOUSEMOVE)
lastevent->type = INBETWEEN_MOUSEMOVE;
@@ -2311,7 +2439,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, int t
if(event.val==KM_PRESS && (evt->ctrl || evt->shift || evt->oskey))
event.alt= evt->alt = 3; // define?
}
- else if (event.type==COMMANDKEY) {
+ else if (event.type==OSKEY) {
event.oskey= evt->oskey= (event.val==KM_PRESS);
if(event.val==KM_PRESS && (evt->ctrl || evt->alt || evt->shift))
event.oskey= evt->oskey = 3; // define?
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 5287ce5eb28..141c51adc58 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_files.c
+ * \ingroup wm
+ */
+
+
/* placed up here because of crappy
* winsock stuff.
*/
@@ -49,6 +54,7 @@
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
+#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
#include "DNA_ipo_types.h" // XXX old animation system
@@ -72,7 +78,7 @@
#include "BKE_report.h"
#include "BKE_sound.h"
#include "BKE_texture.h"
-#include "BKE_utildefines.h"
+
#include "BLO_readfile.h"
#include "BLO_writefile.h"
@@ -91,16 +97,20 @@
#include "ED_util.h"
#include "GHOST_C-api.h"
+#include "GHOST_Path-api.h"
#include "UI_interface.h"
#include "GPU_draw.h"
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
+#endif
#include "WM_api.h"
#include "WM_types.h"
#include "wm.h"
+#include "wm_files.h"
#include "wm_window.h"
#include "wm_event_system.h"
@@ -114,7 +124,7 @@ static void write_history(void);
*/
static void wm_window_match_init(bContext *C, ListBase *wmlist)
{
- wmWindowManager *wm= G.main->wm.first;
+ wmWindowManager *wm;
wmWindow *win, *active_win;
*wmlist= G.main->wm;
@@ -193,7 +203,7 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
else
win->screen= ED_screen_duplicate(win, screen);
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, win->screen->id.name+2, sizeof(win->screenname));
win->screen->winid= win->winid;
}
}
@@ -248,33 +258,36 @@ static void wm_window_match_do(bContext *C, ListBase *oldwmlist)
/* in case UserDef was read, we re-initialize all, and do versioning */
static void wm_init_userdef(bContext *C)
{
- extern char btempdir[];
-
UI_init_userdef();
MEM_CacheLimiter_set_maximum(U.memcachelimit * 1024 * 1024);
sound_init(CTX_data_main(C));
+ /* needed so loading a file from the command line respects user-pref [#26156] */
+ if(U.flag & USER_FILENOUI) G.fileflags |= G_FILE_NO_UI;
+ else G.fileflags &= ~G_FILE_NO_UI;
+
/* set the python auto-execute setting from user prefs */
/* disabled by default, unless explicitly enabled in the command line */
if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |= G_SCRIPT_AUTOEXEC;
-
- if(U.tempdir[0]) strncpy(btempdir, U.tempdir, FILE_MAXDIR+FILE_MAXFILE);
+ if(U.tempdir[0]) BLI_where_is_temp(btempdir, FILE_MAX, 1);
}
-void WM_read_file(bContext *C, char *name, ReportList *reports)
+void WM_read_file(bContext *C, const char *name, ReportList *reports)
{
int retval;
/* so we can get the error message */
errno = 0;
+ WM_cursor_wait(1);
+
/* first try to append data from exotic file formats... */
/* it throws error box when file doesnt exist and returns -1 */
/* note; it should set some error message somewhere... (ton) */
retval= BKE_read_exotic(CTX_data_scene(C), name);
/* we didn't succeed, now try to read Blender file */
- if (retval== 0) {
+ if (retval == BKE_READ_EXOTIC_OK_BLEND) {
int G_f= G.f;
ListBase wmbase;
@@ -282,7 +295,7 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
/* also exit screens and editors */
wm_window_match_init(C, &wmbase);
- retval= BKE_read_file(C, name, NULL, reports);
+ retval= BKE_read_file(C, name, reports);
G.save_over = 1;
/* this flag is initialized by the operator but overwritten on read.
@@ -296,17 +309,14 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
// XXX mainwindow_set_filename_to_title(G.main->name);
- if(retval==2) wm_init_userdef(C); // in case a userdef is read from regular .blend
+ if(retval == BKE_READ_FILE_OK_USERPREFS) wm_init_userdef(C); // in case a userdef is read from regular .blend
- if (retval!=0) {
+ if (retval != BKE_READ_FILE_FAIL) {
G.relbase_valid = 1;
if(!G.background) /* assume automated tasks with background, dont write recent file list */
write_history();
}
-// XXX undo_editmode_clear();
- BKE_reset_undo();
- BKE_write_undo(C, "original"); /* save current state */
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
// refresh_interface_font();
@@ -314,35 +324,49 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C));
+ DAG_on_load_update(CTX_data_main(C), TRUE);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
- BPY_load_user_modules(C);
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
#endif
CTX_wm_window_set(C, NULL); /* exits queues */
+
+ // XXX undo_editmode_clear();
+ BKE_reset_undo();
+ BKE_write_undo(C, "original"); /* save current state */
+
}
- else if(retval==1)
+ else if(retval == BKE_READ_EXOTIC_OK_OTHER)
BKE_write_undo(C, "Import file");
- else if(retval == -1) {
- if(reports)
- BKE_reportf(reports, RPT_ERROR, "Can't read file: \"%s\", %s.", name, errno ? strerror(errno) : "Incompatible file format");
+ else if(retval == BKE_READ_EXOTIC_FAIL_OPEN) {
+ BKE_reportf(reports, RPT_ERROR, "Can't read file: \"%s\", %s.", name, errno ? strerror(errno) : "Unable to open the file");
+ }
+ else if(retval == BKE_READ_EXOTIC_FAIL_FORMAT) {
+ BKE_reportf(reports, RPT_ERROR, "File format is not supported in file: \"%s\".", name);
}
+ else if(retval == BKE_READ_EXOTIC_FAIL_PATH) {
+ BKE_reportf(reports, RPT_ERROR, "File path invalid: \"%s\".", name);
+ }
+ else {
+ BKE_reportf(reports, RPT_ERROR, "Unknown error loading: \"%s\".", name);
+ BLI_assert(!"invalid 'retval'");
+ }
+
+ WM_cursor_wait(0);
+
}
/* called on startup, (context entirely filled with NULLs) */
/* or called for 'New File' */
/* op can be NULL */
-/* note: G.sce is used to store the last saved path so backup and restore after loading
- * G.main->name is similar to G.sce but when loading from memory set the name to startup.blend
- * ...this could be changed but seems better then setting to "" */
-int WM_read_homefile(bContext *C, wmOperator *op)
+int WM_read_homefile(bContext *C, ReportList *reports, short from_memory)
{
ListBase wmbase;
- char tstr[FILE_MAXDIR+FILE_MAXFILE], scestr[FILE_MAXDIR];
- int from_memory= op?RNA_boolean_get(op->ptr, "factory"):0;
- int success;
+ char tstr[FILE_MAXDIR+FILE_MAXFILE];
+ int success= 0;
free_ttfont(); /* still weird... what does it here? */
@@ -350,16 +374,13 @@ int WM_read_homefile(bContext *C, wmOperator *op)
if (!from_memory) {
char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL);
if (cfgdir) {
- BLI_make_file_string(G.sce, tstr, cfgdir, BLENDER_STARTUP_FILE);
+ BLI_make_file_string(G.main->name, tstr, cfgdir, BLENDER_STARTUP_FILE);
} else {
tstr[0] = '\0';
from_memory = 1;
- if (op) {
- BKE_report(op->reports, RPT_INFO, "Config directory with startup.blend file found.");
- }
+ BKE_report(reports, RPT_INFO, "Config directory with "STRINGIFY(BLENDER_STARTUP_FILE)" file not found.");
}
}
- strcpy(scestr, G.sce); /* temporary store */
/* prevent loading no UI */
G.fileflags &= ~G_FILE_NO_UI;
@@ -368,19 +389,28 @@ int WM_read_homefile(bContext *C, wmOperator *op)
wm_window_match_init(C, &wmbase);
if (!from_memory && BLI_exists(tstr)) {
- success = BKE_read_file(C, tstr, NULL, NULL);
- } else {
- success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL, NULL);
+ success = (BKE_read_file(C, tstr, NULL) != BKE_READ_FILE_FAIL);
+
+ if(U.themes.first==NULL) {
+ printf("\nError: No valid "STRINGIFY(BLENDER_STARTUP_FILE)", fall back to built-in default.\n\n");
+ success = 0;
+ }
+ }
+ if(success==0) {
+ success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL);
if (wmbase.first == NULL) wm_clear_default_size(C);
}
+ /* prevent buggy files that had G_FILE_RELATIVE_REMAP written out by mistake. Screws up autosaves otherwise
+ * can remove this eventually, only in a 2.53 and older, now its not written */
+ G.fileflags &= ~G_FILE_RELATIVE_REMAP;
+
/* match the read WM with current WM */
wm_window_match_do(C, &wmbase);
WM_check(C); /* opens window(s), checks keymaps */
- strcpy(G.sce, scestr); /* restore */
G.main->name[0]= '\0';
-
+
wm_init_userdef(C);
/* When loading factory settings, the reset solid OpenGL lights need to be applied. */
@@ -398,16 +428,35 @@ int WM_read_homefile(bContext *C, wmOperator *op)
BKE_write_undo(C, "original"); /* save current state */
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C));
-
+ DAG_on_load_update(CTX_data_main(C), TRUE);
+
+#ifdef WITH_PYTHON
+ if(CTX_py_init_get(C)) {
+ /* sync addons, these may have changed from the defaults */
+ BPY_string_exec(C, "__import__('addon_utils').reset_all()");
+
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
+ }
+#endif
+
WM_event_add_notifier(C, NC_WM|ND_FILEREAD, NULL);
- CTX_wm_window_set(C, NULL); /* exits queues */
- return OPERATOR_FINISHED;
+ /* in background mode the scene will stay NULL */
+ if(!G.background) {
+ CTX_wm_window_set(C, NULL); /* exits queues */
+ }
+
+ return TRUE;
}
+int WM_read_homefile_exec(bContext *C, wmOperator *op)
+{
+ int from_memory= strcmp(op->type->idname, "WM_OT_read_factory_settings") == 0;
+ return WM_read_homefile(C, op->reports, from_memory) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+}
-void read_history(void)
+void WM_read_history(void)
{
char name[FILE_MAX];
LinkNode *l, *lines;
@@ -428,15 +477,9 @@ void read_history(void)
for (l= lines, num= 0; l && (num<U.recent_files); l= l->next) {
line = l->link;
if (line[0] && BLI_exists(line)) {
- if (num==0)
- strcpy(G.sce, line); /* note: this seems highly dodgy since the file isnt actually read. please explain. - campbell */
-
recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile");
BLI_addtail(&(G.recent_files), recent);
- recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(line)+1), "name of file");
- recent->filepath[0] = '\0';
-
- strcpy(recent->filepath, line);
+ recent->filepath = BLI_strdup(line);
num++;
}
}
@@ -449,21 +492,25 @@ static void write_history(void)
{
struct RecentFile *recent, *next_recent;
char name[FILE_MAXDIR+FILE_MAXFILE];
+ char *user_config_dir;
FILE *fp;
int i;
- BLI_make_file_string("/", name, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_HISTORY_FILE);
+ /* will be NULL in background mode */
+ user_config_dir = BLI_get_folder_create(BLENDER_USER_CONFIG, NULL);
+ if(!user_config_dir)
+ return;
+
+ BLI_make_file_string("/", name, user_config_dir, BLENDER_HISTORY_FILE);
recent = G.recent_files.first;
/* refresh recent-files.txt of recent opened files, when current file was changed */
- if(!(recent) || (strcmp(recent->filepath, G.sce)!=0)) {
+ if(!(recent) || (strcmp(recent->filepath, G.main->name)!=0)) {
fp= fopen(name, "w");
if (fp) {
/* add current file to the beginning of list */
recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile");
- recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(G.sce)+1), "name of file");
- recent->filepath[0] = '\0';
- strcpy(recent->filepath, G.sce);
+ recent->filepath = BLI_strdup(G.main->name);
BLI_addhead(&(G.recent_files), recent);
/* write current file to recent-files.txt */
fprintf(fp, "%s\n", recent->filepath);
@@ -472,7 +519,7 @@ static void write_history(void)
/* write rest of recent opened files to recent-files.txt */
while((i<U.recent_files) && (recent)){
/* this prevents to have duplicities in list */
- if (strcmp(recent->filepath, G.sce)!=0) {
+ if (strcmp(recent->filepath, G.main->name)!=0) {
fprintf(fp, "%s\n", recent->filepath);
recent = recent->next;
}
@@ -486,6 +533,9 @@ static void write_history(void)
}
fclose(fp);
}
+
+ /* also update most recent files on System */
+ GHOST_addToSystemRecentFiles(G.main->name);
}
}
@@ -498,23 +548,23 @@ static void do_history(char *name, ReportList *reports)
if(strlen(name)<2) return;
while(hisnr > 1) {
- sprintf(tempname1, "%s%d", name, hisnr-1);
- sprintf(tempname2, "%s%d", name, hisnr);
+ BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr-1);
+ BLI_snprintf(tempname2, sizeof(tempname2), "%s%d", name, hisnr);
if(BLI_rename(tempname1, tempname2))
BKE_report(reports, RPT_ERROR, "Unable to make version backup");
hisnr--;
}
-
+
/* is needed when hisnr==1 */
- sprintf(tempname1, "%s%d", name, hisnr);
-
+ BLI_snprintf(tempname1, sizeof(tempname1), "%s%d", name, hisnr);
+
if(BLI_rename(name, tempname1))
BKE_report(reports, RPT_ERROR, "Unable to make version backup");
}
-static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt)
+static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
{
/* will be scaled down, but gives some nice oversampling */
ImBuf *ibuf;
@@ -560,7 +610,7 @@ static ImBuf *blend_file_thumb(const char *path, Scene *scene, int **thumb_pt)
int write_crash_blend(void)
{
char path[FILE_MAX];
- BLI_strncpy(path, G.sce, sizeof(path));
+ BLI_strncpy(path, G.main->name, sizeof(path));
BLI_replace_extension(path, sizeof(path), "_crash.blend");
if(BLO_write_file(G.main, path, G.fileflags, NULL, NULL)) {
printf("written: %s\n", path);
@@ -572,7 +622,7 @@ int write_crash_blend(void)
}
}
-int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports, int copy)
+int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *reports, int copy)
{
Library *li;
int len;
@@ -593,25 +643,20 @@ int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports,
return -1;
}
+ BLI_strncpy(di, target, FILE_MAX);
+ BLI_replace_extension(di, FILE_MAX, ".blend");
+ /* dont use 'target' anymore */
+
/* send the OnSave event */
for (li= G.main->library.first; li; li= li->id.next) {
- if (BLI_streq(li->name, target)) {
- BKE_report(reports, RPT_ERROR, "Cannot overwrite used library");
+ if (strcmp(li->filepath, di) == 0) {
+ BKE_reportf(reports, RPT_ERROR, "Can't overwrite used library '%.200s'", di);
return -1;
}
}
-
- if (!BLO_has_bfile_extension(target) && (len+6 < FILE_MAX)) {
- sprintf(di, "%s.blend", target);
- } else {
- strcpy(di, target);
- }
-// if (BLI_exists(di)) {
-// XXX if(!saveover(di))
-// XXX return;
-// }
-
+ /* operator now handles overwrite checks */
+
if (G.fileflags & G_AUTOPACK) {
packAll(G.main, reports);
}
@@ -619,17 +664,19 @@ int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports,
ED_object_exit_editmode(C, EM_DO_UNDO);
ED_sculpt_force_update(C);
+ /* don't forget not to return without! */
+ WM_cursor_wait(1);
+
/* blend file thumbnail */
- ibuf_thumb= blend_file_thumb(di, CTX_data_scene(C), &thumb);
+ ibuf_thumb= blend_file_thumb(CTX_data_scene(C), &thumb);
/* rename to .blend1, do this as last before write */
do_history(di, reports);
if (BLO_write_file(CTX_data_main(C), di, fileflags, reports, thumb)) {
if(!copy) {
- strcpy(G.sce, di);
G.relbase_valid = 1;
- strcpy(G.main->name, di); /* is guaranteed current file */
+ BLI_strncpy(G.main->name, di, sizeof(G.main->name)); /* is guaranteed current file */
G.save_over = 1; /* disable untitled.blend convention */
}
@@ -653,10 +700,13 @@ int WM_write_file(bContext *C, char *target, int fileflags, ReportList *reports,
else {
if(ibuf_thumb) IMB_freeImBuf(ibuf_thumb);
if(thumb) MEM_freeN(thumb);
+
+ WM_cursor_wait(0);
return -1;
}
-// XXX waitcursor(0);
+ WM_cursor_wait(0);
+
return 0;
}
@@ -669,19 +719,24 @@ int WM_write_homefile(bContext *C, wmOperator *op)
int fileflags;
/* check current window and close it if temp */
- if(win->screen->full == SCREENTEMP)
+ if(win->screen->temp)
wm_window_close(C, wm, win);
BLI_make_file_string("/", tstr, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
- printf("trying to save homefile at %s \n", tstr);
+ printf("trying to save homefile at %s ", tstr);
/* force save as regular blend file */
fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_AUTOPLAY | G_FILE_LOCK | G_FILE_SIGN);
- BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL);
+ if(BLO_write_file(CTX_data_main(C), tstr, fileflags, op->reports, NULL) == 0) {
+ printf("fail\n");
+ return OPERATOR_CANCELLED;
+ }
+ printf("ok\n");
+
G.save_over= 0;
-
+
return OPERATOR_FINISHED;
}
@@ -694,8 +749,8 @@ void wm_autosave_location(char *filename)
char *savedir;
#endif
- sprintf(pidstr, "%d.blend", abs(getpid()));
-
+ BLI_snprintf(pidstr, sizeof(pidstr), "%d.blend", abs(getpid()));
+
#ifdef WIN32
/* XXX Need to investigate how to handle default location of '/tmp/'
* This is a relative directory on Windows, and it may be
@@ -723,7 +778,7 @@ void WM_autosave_init(wmWindowManager *wm)
wm->autosavetimer= WM_event_add_timer(wm, NULL, TIMERAUTOSAVE, U.savetime*60.0);
}
-void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
+void wm_autosave_timer(const bContext *C, wmWindowManager *wm, wmTimer *UNUSED(wt))
{
wmWindow *win;
wmEventHandler *handler;
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index e87d2d79c39..eddd7ae1642 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_gesture.c
+ * \ingroup wm
+ */
+
+
#include "DNA_screen_types.h"
#include "DNA_vec_types.h"
#include "DNA_userdef_types.h"
@@ -37,9 +42,10 @@
#include "BLI_editVert.h" /* lasso tessellation */
#include "BLI_math.h"
#include "BLI_scanfill.h" /* lasso tessellation */
+#include "BLI_utildefines.h"
#include "BKE_context.h"
-#include "BKE_utildefines.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -121,7 +127,7 @@ void WM_gestures_remove(bContext *C)
/* tweak and line gestures */
#define TWEAK_THRESHOLD 10
-int wm_gesture_evaluate(bContext *C, wmGesture *gesture)
+int wm_gesture_evaluate(wmGesture *gesture)
{
if(gesture->type==WM_GESTURE_TWEAK) {
rcti *rect= gesture->customdata;
@@ -159,7 +165,7 @@ int wm_gesture_evaluate(bContext *C, wmGesture *gesture)
/* ******************* gesture draw ******************* */
-static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_rect(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -183,7 +189,7 @@ static void wm_gesture_draw_rect(wmWindow *win, wmGesture *gt)
glDisable(GL_LINE_STIPPLE);
}
-static void wm_gesture_draw_line(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_line(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -199,7 +205,7 @@ static void wm_gesture_draw_line(wmWindow *win, wmGesture *gt)
}
-static void wm_gesture_draw_circle(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_circle(wmGesture *gt)
{
rcti *rect= (rcti *)gt->customdata;
@@ -232,8 +238,12 @@ static void draw_filled_lasso(wmGesture *gt)
int i;
for (i=0; i<gt->points; i++, lasso+=2) {
- float co[3] = {(float)lasso[0], (float)lasso[1], 0.f};
-
+ float co[3];
+
+ co[0]= (float)lasso[0];
+ co[1]= (float)lasso[1];
+ co[2]= 0.0f;
+
v = BLI_addfillvert(co);
if (lastv)
e = BLI_addfilledge(lastv, v);
@@ -244,7 +254,7 @@ static void draw_filled_lasso(wmGesture *gt)
/* highly unlikely this will fail, but could crash if (gt->points == 0) */
if(firstv) {
BLI_addfilledge(firstv, v);
- BLI_edgefill(0, 0);
+ BLI_edgefill(0);
glEnable(GL_BLEND);
glColor4f(1.0, 1.0, 1.0, 0.05);
@@ -261,7 +271,7 @@ static void draw_filled_lasso(wmGesture *gt)
}
}
-static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt)
+static void wm_gesture_draw_lasso(wmGesture *gt)
{
short *lasso= (short *)gt->customdata;
int i;
@@ -272,7 +282,6 @@ static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt)
glColor3ub(96, 96, 96);
glLineStipple(1, 0xAAAA);
glBegin(GL_LINE_STRIP);
- lasso= (short *)gt->customdata;
for(i=0; i<gt->points; i++, lasso+=2)
glVertex2sv(lasso);
if(gt->type==WM_GESTURE_LASSO)
@@ -320,23 +329,23 @@ void wm_gesture_draw(wmWindow *win)
wmSubWindowSet(win, gt->swinid);
if(gt->type==WM_GESTURE_RECT)
- wm_gesture_draw_rect(win, gt);
- else if(gt->type==WM_GESTURE_TWEAK)
- wm_gesture_draw_line(win, gt);
+ wm_gesture_draw_rect(gt);
+// else if(gt->type==WM_GESTURE_TWEAK)
+// wm_gesture_draw_line(gt);
else if(gt->type==WM_GESTURE_CIRCLE)
- wm_gesture_draw_circle(win, gt);
+ wm_gesture_draw_circle(gt);
else if(gt->type==WM_GESTURE_CROSS_RECT) {
if(gt->mode==1)
- wm_gesture_draw_rect(win, gt);
+ wm_gesture_draw_rect(gt);
else
wm_gesture_draw_cross(win, gt);
}
else if(gt->type==WM_GESTURE_LINES)
- wm_gesture_draw_lasso(win, gt);
+ wm_gesture_draw_lasso(gt);
else if(gt->type==WM_GESTURE_LASSO)
- wm_gesture_draw_lasso(win, gt);
+ wm_gesture_draw_lasso(gt);
else if(gt->type==WM_GESTURE_STRAIGHTLINE)
- wm_gesture_draw_line(win, gt);
+ wm_gesture_draw_line(gt);
}
}
@@ -351,5 +360,3 @@ void wm_gesture_tag_redraw(bContext *C)
wm_tag_redraw_overlay(win, ar);
}
-
-
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 0fd42ffb8aa..34a6359b6dc 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_init_exit.c
+ * \ingroup wm
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -52,7 +57,7 @@
#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
#include "BKE_packedFile.h"
#include "BKE_sequencer.h" /* free seq clipboard */
#include "BKE_material.h" /* clear_matcopybuf */
@@ -62,11 +67,14 @@
#include "RE_pipeline.h" /* RE_ free stuff */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
+#ifdef WITH_GAMEENGINE
#include "SYS_System.h"
+#endif
+#include "GHOST_Path-api.h"
#include "RNA_define.h"
@@ -110,13 +118,15 @@ static void wm_free_reports(bContext *C)
/* only called once, for startup */
-void WM_init(bContext *C, int argc, char **argv)
+void WM_init(bContext *C, int argc, const char **argv)
{
if (!G.background) {
wm_ghost_init(C); /* note: it assigns C to ghost! */
wm_init_cursor_data();
}
+ GHOST_CreateSystemPaths();
+
wm_operatortype_init();
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
@@ -128,24 +138,29 @@ void WM_init(bContext *C, int argc, char **argv)
ED_file_init(); /* for fsmenu */
ED_init_node_butfuncs();
- BLF_init(11, U.dpi);
+ BLF_init(11, U.dpi); /* Please update source/gamengine/GamePlayer/GPG_ghost.cpp if you change this */
BLF_lang_init();
/* get the default database, plus a wm */
- WM_read_homefile(C, NULL);
+ WM_read_homefile(C, NULL, G.factory_startup);
/* note: there is a bug where python needs initializing before loading the
- * .B25.blend because it may contain PyDrivers. It also needs to be after
+ * startup.blend because it may contain PyDrivers. It also needs to be after
* initializing space types and other internal data.
*
* However cant redo this at the moment. Solution is to load python
* before WM_read_homefile() or make py-drivers check if python is running.
* Will try fix when the crash can be repeated. - campbell. */
-#ifndef DISABLE_PYTHON
- BPY_set_context(C); /* necessary evil */
- BPY_start_python(argc, argv);
- BPY_load_user_modules(C);
+#ifdef WITH_PYTHON
+ BPY_context_set(C); /* necessary evil */
+ BPY_python_start(argc, argv);
+
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
+#else
+ (void)argc; /* unused */
+ (void)argv; /* unused */
#endif
wm_init_reports(C); /* reports cant be initialized before the wm */
@@ -166,12 +181,15 @@ void WM_init(bContext *C, int argc, char **argv)
G.ndofdevice = -1; /* XXX bad initializer, needs set otherwise buttons show! */
- read_history();
+ WM_read_history();
- if(G.sce[0] == 0)
- BLI_make_file_string("/", G.sce, BLI_getDefaultDocumentFolder(), "untitled.blend");
+ /* allow a path of "", this is what happens when making a new file */
+ /*
+ if(G.main->name[0] == 0)
+ BLI_make_file_string("/", G.main->name, BLI_getDefaultDocumentFolder(), "untitled.blend");
+ */
- BLI_strncpy(G.lib, G.sce, FILE_MAX);
+ BLI_strncpy(G.lib, G.main->name, FILE_MAX);
}
@@ -213,7 +231,7 @@ int WM_init_game(bContext *C)
wmWindow* win;
ScrArea *sa;
- ARegion *ar;
+ ARegion *ar= NULL;
Scene *scene= CTX_data_scene(C);
@@ -269,12 +287,16 @@ int WM_init_game(bContext *C)
if(scene->gm.fullscreen) {
WM_operator_name_call(C, "WM_OT_window_fullscreen_toggle", WM_OP_EXEC_DEFAULT, NULL);
wm_get_screensize(&ar->winrct.xmax, &ar->winrct.ymax);
+ ar->winx = ar->winrct.xmax + 1;
+ ar->winy = ar->winrct.ymax + 1;
}
else
{
GHOST_RectangleHandle rect = GHOST_GetClientBounds(win->ghostwin);
ar->winrct.ymax = GHOST_GetHeightRectangle(rect);
ar->winrct.xmax = GHOST_GetWidthRectangle(rect);
+ ar->winx = ar->winrct.xmax + 1;
+ ar->winy = ar->winrct.ymax + 1;
GHOST_DisposeRectangle(rect);
}
@@ -319,10 +341,10 @@ extern wchar_t *copybuf;
extern wchar_t *copybufinfo;
// XXX copy/paste buffer stuff...
-extern void free_anim_copybuf();
-extern void free_anim_drivers_copybuf();
-extern void free_fmodifiers_copybuf();
-extern void free_posebuf();
+extern void free_anim_copybuf(void);
+extern void free_anim_drivers_copybuf(void);
+extern void free_fmodifiers_copybuf(void);
+extern void free_posebuf(void);
/* called in creator.c even... tsk, split this! */
void WM_exit(bContext *C)
@@ -394,7 +416,7 @@ void WM_exit(bContext *C)
// free_txt_data();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* XXX - old note */
/* before free_blender so py's gc happens while library still exists */
/* needed at least for a rare sigsegv that can happen in pydrivers */
@@ -402,7 +424,7 @@ void WM_exit(bContext *C)
/* Update for blender 2.5, move after free_blender because blender now holds references to PyObject's
* so decref'ing them after python ends causes bad problems every time
* the pyDriver bug can be fixed if it happens again we can deal with it then */
- BPY_end_python();
+ BPY_python_end();
#endif
if (!G.background) {
@@ -425,13 +447,16 @@ void WM_exit(bContext *C)
UI_exit();
BKE_userdef_free();
- RNA_exit(); /* should be after BPY_end_python so struct python slots are cleared */
+ RNA_exit(); /* should be after BPY_python_end so struct python slots are cleared */
wm_ghost_exit();
CTX_free(C);
-
+#ifdef WITH_GAMEENGINE
SYS_DeleteSystem(SYS_GetSystem());
+#endif
+
+ GHOST_DisposeSystemPaths();
if(MEM_get_memory_blocks_in_use()!=0 || BLI_cellalloc_get_totblock()!=0) {
printf("Error Totblock: %d\n",
diff --git a/source/blender/windowmanager/intern/wm_jobs.c b/source/blender/windowmanager/intern/wm_jobs.c
index 3ebfac4928c..4a8553e16f6 100644
--- a/source/blender/windowmanager/intern/wm_jobs.c
+++ b/source/blender/windowmanager/intern/wm_jobs.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_jobs.c
+ * \ingroup wm
+ */
+
+
#include <string.h>
#include "DNA_windowmanager_types.h"
@@ -129,7 +134,7 @@ struct wmJob {
* 1st priority: job with same owner and name
* 2nd priority: job with same owner
*/
-static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name)
+static wmJob *wm_job_find(wmWindowManager *wm, void *owner, const char *name)
{
wmJob *steve, *found=NULL;
@@ -148,7 +153,7 @@ static wmJob *wm_job_find(wmWindowManager *wm, void *owner, char *name)
/* returns current or adds new job, but doesnt run it */
/* every owner only gets a single job, adding a new one will stop running stop and
when stopped it starts the new one */
-wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, char *name, int flag)
+wmJob *WM_jobs_get(wmWindowManager *wm, wmWindow *win, void *owner, const char *name, int flag)
{
wmJob *steve= wm_job_find(wm, owner, name);
@@ -247,20 +252,40 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test)
wmJob *steve;
int suspend= 0;
- for(steve= wm->jobs.first; steve; steve= steve->next) {
- if(steve==test || !steve->running) continue;
- if(steve->startjob!=test->startjob && !(test->flag & WM_JOB_EXCL_RENDER)) continue;
- if((test->flag & WM_JOB_EXCL_RENDER) && !(steve->flag & WM_JOB_EXCL_RENDER)) continue;
-
+ /* job added with suspend flag, we wait 1 timer step before activating it */
+ if(test->flag & WM_JOB_SUSPEND) {
suspend= 1;
-
- /* if this job has higher priority, stop others */
- if(test->flag & WM_JOB_PRIORITY)
- steve->stop= 1;
+ test->flag &= ~WM_JOB_SUSPEND;
}
+ else {
+ /* check other jobs */
+ for(steve= wm->jobs.first; steve; steve= steve->next) {
+ /* obvious case, no test needed */
+ if(steve==test || !steve->running) continue;
+
+ /* if new job is not render, then check for same startjob */
+ if(0==(test->flag & WM_JOB_EXCL_RENDER))
+ if(steve->startjob!=test->startjob)
+ continue;
+
+ /* if new job is render, any render job should be stopped */
+ if(test->flag & WM_JOB_EXCL_RENDER)
+ if(0==(steve->flag & WM_JOB_EXCL_RENDER))
+ continue;
+ suspend= 1;
+
+ /* if this job has higher priority, stop others */
+ if(test->flag & WM_JOB_PRIORITY) {
+ steve->stop= 1;
+ // printf("job stopped: %s\n", steve->name);
+ }
+ }
+ }
+
/* possible suspend ourselfs, waiting for other jobs, or de-suspend */
test->suspended= suspend;
+ // if(suspend) printf("job suspended: %s\n", test->name);
}
/* if job running, the same owner gave it a new job */
@@ -270,8 +295,10 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
if(steve->running) {
/* signal job to end and restart */
steve->stop= 1;
+ // printf("job started a running job, ending... %s\n", steve->name);
}
else {
+
if(steve->customdata && steve->startjob) {
wm_jobs_test_suspend_stop(wm, steve);
@@ -291,10 +318,10 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *steve)
steve->ready= 0;
steve->progress= 0.0;
+ // printf("job started: %s\n", steve->name);
+
BLI_init_threads(&steve->threads, do_job_thread, 1);
BLI_insert_thread(&steve->threads, steve);
-
- // printf("job started\n");
}
/* restarted job has timer already */
@@ -351,7 +378,7 @@ void WM_jobs_stop(wmWindowManager *wm, void *owner, void *startjob)
}
/* actually terminate thread and job timer */
-void WM_jobs_kill(wmWindowManager *wm, void *owner, void *startjob)
+void WM_jobs_kill(wmWindowManager *wm, void *owner, void (*startjob)(void *, short int *, short int *, float *))
{
wmJob *steve;
@@ -418,8 +445,8 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
steve->run_customdata= NULL;
steve->run_free= NULL;
- // if(steve->stop) printf("job stopped\n");
- // else printf("job finished\n");
+ // if(steve->stop) printf("job ready but stopped %s\n", steve->name);
+ // else printf("job finished %s\n", steve->name);
steve->running= 0;
BLI_end_threads(&steve->threads);
@@ -431,6 +458,7 @@ void wm_jobs_timer(const bContext *C, wmWindowManager *wm, wmTimer *wt)
/* new job added for steve? */
if(steve->customdata) {
+ // printf("job restarted with new data %s\n", steve->name);
WM_jobs_start(wm, steve);
}
else {
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index f1873b14232..57b84fc18f4 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_keymap.c
+ * \ingroup wm
+ */
+
+
#include <string.h>
#include "DNA_object_types.h"
@@ -37,6 +42,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
@@ -44,7 +50,7 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_screen.h"
-#include "BKE_utildefines.h"
+
#include "RNA_access.h"
#include "RNA_enum_types.h"
@@ -63,18 +69,19 @@ static void keymap_properties_set(wmKeyMapItem *kmi)
WM_operator_properties_sanitize(kmi->ptr, 1);
}
-void WM_keymap_properties_reset(wmKeyMapItem *kmi)
+/* properties can be NULL, otherwise the arg passed is used and ownership is given to the kmi */
+void WM_keymap_properties_reset(wmKeyMapItem *kmi, struct IDProperty *properties)
{
WM_operator_properties_free(kmi->ptr);
MEM_freeN(kmi->ptr);
kmi->ptr = NULL;
- kmi->properties = NULL;
+ kmi->properties = properties;
keymap_properties_set(kmi);
}
-wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname)
+wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, const char *idname)
{
wmKeyConfig *keyconf;
@@ -85,7 +92,7 @@ wmKeyConfig *WM_keyconfig_new(wmWindowManager *wm, char *idname)
return keyconf;
}
-wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, char *idname)
+wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname)
{
wmKeyConfig *keyconf = WM_keyconfig_new(wm, idname);
@@ -118,7 +125,7 @@ void WM_keyconfig_free(wmKeyConfig *keyconf)
MEM_freeN(keyconf);
}
-void WM_keyconfig_userdef(wmWindowManager *wm)
+void WM_keyconfig_userdef(void)
{
wmKeyMap *km;
wmKeyMapItem *kmi;
@@ -195,8 +202,18 @@ static void keymap_event_set(wmKeyMapItem *kmi, short type, short val, int modif
}
}
+static void keymap_item_set_id(wmKeyMap *keymap, wmKeyMapItem *kmi)
+{
+ keymap->kmi_id++;
+ if ((keymap->flag & KEYMAP_USER) == 0) {
+ kmi->id = keymap->kmi_id;
+ } else {
+ kmi->id = -keymap->kmi_id; // User defined keymap entries have negative ids
+ }
+}
+
/* if item was added, then bail out */
-wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi;
@@ -209,10 +226,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in
BLI_addtail(&keymap->items, kmi);
BLI_strncpy(kmi->idname, idname, OP_MAX_TYPENAME);
- if ((keymap->flag & KEYMAP_USER) == 0) {
- keymap->kmi_id++;
- kmi->id = keymap->kmi_id;
- }
+ keymap_item_set_id(keymap, kmi);
keymap_event_set(kmi, type, val, modifier, keymodifier);
keymap_properties_set(kmi);
@@ -221,7 +235,7 @@ wmKeyMapItem *WM_keymap_verify_item(wmKeyMap *keymap, char *idname, int type, in
}
/* always add item */
-wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi= MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
@@ -231,16 +245,13 @@ wmKeyMapItem *WM_keymap_add_item(wmKeyMap *keymap, char *idname, int type, int v
keymap_event_set(kmi, type, val, modifier, keymodifier);
keymap_properties_set(kmi);
- if ((keymap->flag & KEYMAP_USER) == 0) {
- keymap->kmi_id++;
- kmi->id = keymap->kmi_id;
- }
+ keymap_item_set_id(keymap, kmi);
return kmi;
}
/* menu wrapper for WM_keymap_add_item */
-wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, char *idname, int type, int val, int modifier, int keymodifier)
+wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type, int val, int modifier, int keymodifier)
{
wmKeyMapItem *kmi= WM_keymap_add_item(keymap, "WM_OT_call_menu", type, val, modifier, keymodifier);
RNA_string_set(kmi->ptr, "name", idname);
@@ -264,7 +275,7 @@ void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
space/region ids are same as DNA_space_types.h */
/* gets free'd in wm.c */
-wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid)
{
wmKeyMap *km;
@@ -276,7 +287,7 @@ wmKeyMap *WM_keymap_list_find(ListBase *lb, char *idname, int spaceid, int regio
return NULL;
}
-wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
{
wmKeyMap *km= WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
@@ -291,7 +302,7 @@ wmKeyMap *WM_keymap_find(wmKeyConfig *keyconf, char *idname, int spaceid, int re
return km;
}
-wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int regionid)
+wmKeyMap *WM_keymap_find_all(const bContext *C, const char *idname, int spaceid, int regionid)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmKeyConfig *keyconf;
@@ -322,7 +333,7 @@ wmKeyMap *WM_keymap_find_all(const bContext *C, char *idname, int spaceid, int r
/* modal maps get linked to a running operator, and filter the keys before sending to modal() callback */
-wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items)
+wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, const char *idname, EnumPropertyItem *items)
{
wmKeyMap *km= WM_keymap_find(keyconf, idname, 0, 0);
km->flag |= KEYMAP_MODAL;
@@ -331,7 +342,7 @@ wmKeyMap *WM_modalkeymap_add(wmKeyConfig *keyconf, char *idname, EnumPropertyIte
return km;
}
-wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, char *idname)
+wmKeyMap *WM_modalkeymap_get(wmKeyConfig *keyconf, const char *idname)
{
wmKeyMap *km;
@@ -353,15 +364,12 @@ wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modif
keymap_event_set(kmi, type, val, modifier, keymodifier);
- if ((km->flag & KEYMAP_USER) == 0) {
- km->kmi_id++;
- kmi->id = km->kmi_id;
- }
+ keymap_item_set_id(km, kmi);
return kmi;
}
-void WM_modalkeymap_assign(wmKeyMap *km, char *opname)
+void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
{
wmOperatorType *ot= WM_operatortype_find(opname, 0);
@@ -419,7 +427,7 @@ char *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len)
return str;
}
-static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int opcontext, IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r)
+static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *handlers, const char *opname, int UNUSED(opcontext), IDProperty *properties, int compare_props, int hotkey, wmKeyMap **keymap_r)
{
wmWindowManager *wm= CTX_wm_manager(C);
wmEventHandler *handler;
@@ -432,6 +440,7 @@ static wmKeyMapItem *wm_keymap_item_find_handlers(const bContext *C, ListBase *h
if(keymap && (!keymap->poll || keymap->poll((bContext*)C))) {
for(kmi=keymap->items.first; kmi; kmi=kmi->next) {
+
if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0]) {
if (hotkey)
if (!ISHOTKEY(kmi->type))
@@ -650,6 +659,10 @@ wmKeyMap *WM_keymap_copy_to_user(wmKeyMap *keymap)
usermap= WM_keymap_list_find(&U.keymaps, keymap->idname, keymap->spaceid, keymap->regionid);
+ /* XXX this function is only used by RMB setting hotkeys, and it clears maps on 2nd try this way */
+ if(keymap==usermap)
+ return keymap;
+
if(!usermap) {
/* not saved yet, duplicate existing */
usermap= MEM_dupallocN(keymap);
@@ -706,7 +719,7 @@ void WM_keymap_restore_item_to_default(bContext *C, wmKeyMap *keymap, wmKeyMapIt
if(strcmp(orig->idname, kmi->idname) != 0) {
BLI_strncpy(kmi->idname, orig->idname, sizeof(kmi->idname));
- WM_keymap_properties_reset(kmi);
+ WM_keymap_properties_reset(kmi, NULL);
}
if (orig->properties) {
@@ -756,7 +769,7 @@ wmKeyMapItem *WM_keymap_item_find_id(wmKeyMap *keymap, int id)
/* Guess an appropriate keymap from the operator name */
/* Needs to be kept up to date with Keymap and Operator naming */
-wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
+wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
{
wmKeyMap *km=NULL;
SpaceLink *sl = CTX_wm_space_data(C);
@@ -791,9 +804,19 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
/* Editing Modes */
else if (strstr(opname, "MESH_OT")) {
km = WM_keymap_find_all(C, "Mesh", 0, 0);
+
+ /* some mesh operators are active in object mode too, like add-prim */
+ if(km && km->poll && km->poll((bContext *)C)==0) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
}
else if (strstr(opname, "CURVE_OT")) {
km = WM_keymap_find_all(C, "Curve", 0, 0);
+
+ /* some curve operators are active in object mode too, like add-prim */
+ if(km && km->poll && km->poll((bContext *)C)==0) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
}
else if (strstr(opname, "ARMATURE_OT")) {
km = WM_keymap_find_all(C, "Armature", 0, 0);
@@ -806,6 +829,11 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
}
else if (strstr(opname, "MBALL_OT")) {
km = WM_keymap_find_all(C, "Metaball", 0, 0);
+
+ /* some mball operators are active in object mode too, like add-prim */
+ if(km && km->poll && km->poll((bContext *)C)==0) {
+ km = WM_keymap_find_all(C, "Object Mode", 0, 0);
+ }
}
else if (strstr(opname, "LATTICE_OT")) {
km = WM_keymap_find_all(C, "Lattice", 0, 0);
@@ -887,6 +915,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, char *opname)
else if (strstr(opname, "CONSOLE_OT")) {
km = WM_keymap_find_all(C, "Console", sl->spacetype, 0);
}
+ /* Console */
+ else if (strstr(opname, "INFO_OT")) {
+ km = WM_keymap_find_all(C, "Info", sl->spacetype, 0);
+ }
/* Transform */
else if (strstr(opname, "TRANSFORM_OT")) {
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 2311024827e..12862f559d4 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,12 +26,26 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_operators.c
+ * \ingroup wm
+ */
+
+
#include <float.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stddef.h>
+#include <assert.h>
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#include <windows.h>
+
+#include <io.h>
+#endif
+
+#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_object_types.h"
@@ -40,8 +54,6 @@
#include "DNA_userdef_types.h"
#include "DNA_windowmanager_types.h"
-#include "MEM_guardedalloc.h"
-
#include "BLF_api.h"
#include "PIL_time.h"
@@ -49,6 +61,7 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h" /*for WM_operator_pystring */
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "BLO_readfile.h"
@@ -62,7 +75,7 @@
#include "BKE_report.h"
#include "BKE_scene.h"
#include "BKE_screen.h" /* BKE_ST_MAXNAME */
-#include "BKE_utildefines.h"
+
#include "BKE_idcode.h"
#include "BIF_gl.h"
@@ -75,6 +88,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -211,7 +225,7 @@ static int wm_macro_exec(bContext *C, wmOperator *op)
return wm_macro_end(op, retval);
}
-int wm_macro_invoke_internal(bContext *C, wmOperator *op, wmEvent *event, wmOperator *opm)
+static int wm_macro_invoke_internal(bContext *C, wmOperator *op, wmEvent *event, wmOperator *opm)
{
int retval= OPERATOR_FINISHED;
@@ -222,6 +236,8 @@ int wm_macro_invoke_internal(bContext *C, wmOperator *op, wmEvent *event, wmOper
else if(opm->type->exec)
retval= opm->type->exec(C, opm);
+ BLI_movelisttolist(&op->reports->list, &opm->reports->list);
+
if (retval & OPERATOR_FINISHED) {
MacroData *md = op->customdata;
md->retval = OPERATOR_FINISHED; /* keep in mind that at least one operator finished */
@@ -310,7 +326,7 @@ static int wm_macro_cancel(bContext *C, wmOperator *op)
}
/* Names have to be static for now */
-wmOperatorType *WM_operatortype_append_macro(char *idname, char *name, int flag)
+wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *name, int flag)
{
wmOperatorType *ot;
@@ -371,21 +387,24 @@ void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType*, void*), vo
wmOperatorTypeMacro *WM_operatortype_macro_define(wmOperatorType *ot, const char *idname)
{
wmOperatorTypeMacro *otmacro= MEM_callocN(sizeof(wmOperatorTypeMacro), "wmOperatorTypeMacro");
-
+
BLI_strncpy(otmacro->idname, idname, OP_MAX_TYPENAME);
/* do this on first use, since operatordefinitions might have been not done yet */
WM_operator_properties_alloc(&(otmacro->ptr), &(otmacro->properties), idname);
WM_operator_properties_sanitize(otmacro->ptr, 1);
-
+
BLI_addtail(&ot->macro, otmacro);
{
+ /* operator should always be found but in the event its not. dont segfault */
wmOperatorType *otsub = WM_operatortype_find(idname, 0);
- RNA_def_pointer_runtime(ot->srna, otsub->idname, otsub->srna,
- otsub->name, otsub->description);
+ if(otsub) {
+ RNA_def_pointer_runtime(ot->srna, otsub->idname, otsub->srna,
+ otsub->name, otsub->description);
+ }
}
-
+
return otmacro;
}
@@ -578,12 +597,12 @@ void WM_operator_properties_alloc(PointerRNA **ptr, IDProperty **properties, con
}
-void WM_operator_properties_sanitize(PointerRNA *ptr, int val)
+void WM_operator_properties_sanitize(PointerRNA *ptr, const short no_context)
{
RNA_STRUCT_BEGIN(ptr, prop) {
switch(RNA_property_type(prop)) {
case PROP_ENUM:
- if (val)
+ if (no_context)
RNA_def_property_flag(prop, PROP_ENUM_NO_CONTEXT);
else
RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
@@ -595,7 +614,7 @@ void WM_operator_properties_sanitize(PointerRNA *ptr, int val)
/* recurse into operator properties */
if (RNA_struct_is_a(ptype, &RNA_OperatorProperties)) {
PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
- WM_operator_properties_sanitize(&opptr, val);
+ WM_operator_properties_sanitize(&opptr, no_context);
}
break;
}
@@ -613,13 +632,14 @@ void WM_operator_properties_free(PointerRNA *ptr)
if(properties) {
IDP_FreeProperty(properties);
MEM_freeN(properties);
+ ptr->data= NULL; /* just incase */
}
}
/* ************ default op callbacks, exported *********** */
/* invoke callback, uses enum property named "type" */
-int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
PropertyRNA *prop= op->type->prop;
uiPopupMenu *pup;
@@ -635,7 +655,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
return op->type->exec(C, op);
}
else {
- pup= uiPupMenuBegin(C, op->type->name, 0);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
layout= uiPupMenuLayout(pup);
uiItemsFullEnumO(layout, op->type->idname, (char*)RNA_property_identifier(prop), op->ptr->data, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
@@ -646,7 +666,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* generic enum search invoke popup */
-static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char *str, uiSearchItems *items)
+static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, const char *str, uiSearchItems *items)
{
wmOperatorType *ot = (wmOperatorType *)arg_ot;
PropertyRNA *prop= ot->prop;
@@ -661,10 +681,10 @@ static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char
PointerRNA ptr;
EnumPropertyItem *item, *item_array;
- int free;
+ int do_free;
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- RNA_property_enum_items((bContext *)C, &ptr, prop, &item_array, NULL, &free);
+ RNA_property_enum_items((bContext *)C, &ptr, prop, &item_array, NULL, &do_free);
for(item= item_array; item->identifier; item++) {
/* note: need to give the intex rather then the dientifier because the enum can be freed */
@@ -673,7 +693,7 @@ static void operator_enum_search_cb(const struct bContext *C, void *arg_ot, char
break;
}
- if(free)
+ if(do_free)
MEM_freeN(item_array);
}
}
@@ -710,7 +730,7 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op)
/* fake button, it holds space for search items */
uiDefBut(block, LABEL, 0, "", 10, 10 - uiSearchBoxhHeight(), 180, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
- uiPopupBoundsBlock(block, 6.0f, 0, -20); /* move it downwards, mouse over button */
+ uiPopupBoundsBlock(block, 6, 0, -20); /* move it downwards, mouse over button */
uiEndBlock(C, block);
event= *(win->eventstate); /* XXX huh huh? make api call */
@@ -724,14 +744,14 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op)
}
-int WM_enum_search_invoke(bContext *C, wmOperator *op, wmEvent *event)
+int WM_enum_search_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
uiPupBlock(C, wm_enum_search_menu, op);
return OPERATOR_CANCELLED;
}
/* Can't be used as an invoke directly, needs message arg (can be NULL) */
-int WM_operator_confirm_message(bContext *C, wmOperator *op, char *message)
+int WM_operator_confirm_message(bContext *C, wmOperator *op, const char *message)
{
uiPopupMenu *pup;
uiLayout *layout;
@@ -744,20 +764,20 @@ int WM_operator_confirm_message(bContext *C, wmOperator *op, char *message)
pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemFullO(layout, op->type->idname, message, 0, properties, WM_OP_EXEC_REGION_WIN, 0);
+ uiItemFullO(layout, op->type->idname, message, ICON_NULL, properties, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
}
-int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event)
+int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
return WM_operator_confirm_message(C, op, NULL);
}
/* op->invoke, opens fileselect if path property not set, otherwise executes */
-int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *event)
+int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if (RNA_property_is_set(op->ptr, "filepath")) {
return WM_operator_call(C, op);
@@ -861,55 +881,30 @@ int WM_operator_winactive(bContext *C)
return 1;
}
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, int event)
-{
- wmOperator *lastop= arg_op;
-
- if(lastop) {
- ED_undo_pop_op(C, lastop);
- WM_operator_repeat(C, lastop);
- }
-}
-
static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
{
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= arg_op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiStyle *style= U.uistyles.first;
- int columns= 2, width= 300;
+ int width= 300;
block= uiBeginBlock(C, ar, "redo_popup", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- uiBlockSetHandleFunc(block, redo_cb, arg_op);
-
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
- // XXX - hack, only for editing docs
- if(strcmp(op->type->idname, "WM_OT_doc_edit")==0) {
- columns= 1;
- width= 500;
- }
+ /* if register is not enabled, the operator gets freed on OPERATOR_FINISHED
+ * ui_apply_but_funcs_after calls ED_undo_operator_repeate_cb and crashes */
+ assert(op->type->flag & OPTYPE_REGISTER);
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+ uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, 20, style);
- uiItemL(layout, op->type->name, 0);
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, &ptr, columns);
+ if(ED_undo_valid(C, op->type->name)==0)
+ uiLayoutSetEnabled(layout, 0);
+
+ uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -928,45 +923,45 @@ static void dialog_exec_cb(bContext *C, void *arg1, void *arg2)
uiPupBlockClose(C, block);
}
+static void dialog_check_cb(bContext *C, void *op_ptr, void *UNUSED(arg))
+{
+ wmOperator *op= op_ptr;
+ if(op->type->check) {
+ if(op->type->check(C, op)) {
+ /* refresh */
+ }
+ }
+}
+
/* Dialogs are popups that require user verification (click OK) before exec */
static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
{
struct { wmOperator *op; int width; int height; } * data = userData;
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= data->op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiBut *btn;
uiStyle *style= U.uistyles.first;
- int columns= 2;
block = uiBeginBlock(C, ar, "operator dialog", UI_EMBOSS);
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- if (!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style);
- uiItemL(layout, op->type->name, 0);
+
+ uiBlockSetFunc(block, dialog_check_cb, op, NULL);
- if (op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, &ptr, columns);
+ uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
+
+ /* clear so the OK button is left alone */
+ uiBlockSetFunc(block, NULL, NULL, NULL);
/* Create OK button, the callback of which will execute op */
btn= uiDefBut(block, BUT, 0, "OK", 0, 0, 0, 20, NULL, 0, 0, 0, 0, "");
uiButSetFunc(btn, dialog_exec_cb, op, block);
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
+ /* center around the mouse */
+ uiPopupBoundsBlock(block, 4.0f, data->width/-2, data->height/2);
uiEndBlock(C, block);
return block;
@@ -975,9 +970,7 @@ static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
{
struct { wmOperator *op; int width; int height; } * data = userData;
- wmWindowManager *wm= CTX_wm_manager(C);
wmOperator *op= data->op;
- PointerRNA ptr;
uiBlock *block;
uiLayout *layout;
uiStyle *style= U.uistyles.first;
@@ -986,19 +979,10 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
uiBlockClearFlag(block, UI_BLOCK_LOOP);
uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
- if(!op->properties) {
- IDPropertyTemplate val = {0};
- op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
- }
-
- RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, data->width, data->height, style);
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui((bContext*)C, op);
- op->layout= NULL;
- }
+ /* since ui is defined the auto-layout args are not used */
+ uiLayoutOperatorButs(C, layout, op, NULL, 'V', 0);
uiPopupBoundsBlock(block, 4.0f, 0, 0);
uiEndBlock(C, block);
@@ -1006,20 +990,21 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
return block;
}
-int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *event)
+/* operator menu needs undo, for redo callback */
+int WM_operator_props_popup(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- int retval= OPERATOR_CANCELLED;
- if(op->type->exec) {
- retval= op->type->exec(C, op);
-
- /* ED_undo_push_op(C, op), called by wm_operator_finished now. */
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
}
+
+ ED_undo_push_op(C, op);
+ wm_operator_register(C, op);
- if(retval != OPERATOR_CANCELLED)
- uiPupBlock(C, wm_block_create_redo, op);
+ uiPupBlock(C, wm_block_create_redo, op);
- return retval;
+ return OPERATOR_RUNNING_MODAL;
}
int WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, int height)
@@ -1048,6 +1033,11 @@ int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height)
int WM_operator_redo_popup(bContext *C, wmOperator *op)
{
+ if((op->type->flag & OPTYPE_REGISTER)==0) {
+ BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
+ }
+
uiPupBlock(C, wm_block_create_redo, op);
return OPERATOR_CANCELLED;
@@ -1055,52 +1045,19 @@ int WM_operator_redo_popup(bContext *C, wmOperator *op)
/* ***************** Debug menu ************************* */
-static uiBlock *wm_block_create_menu(bContext *C, ARegion *ar, void *arg_op)
-{
- wmOperator *op= arg_op;
- uiBlock *block;
- uiLayout *layout;
- uiStyle *style= U.uistyles.first;
-
- block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
- uiBlockClearFlag(block, UI_BLOCK_LOOP);
- uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1|UI_BLOCK_MOVEMOUSE_QUIT);
-
- layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 300, 20, style);
- uiItemL(layout, op->type->name, 0);
-
- if(op->type->ui) {
- op->layout= layout;
- op->type->ui(C, op);
- op->layout= NULL;
- }
- else
- uiDefAutoButsRNA(C, layout, op->ptr, 2);
-
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
- uiEndBlock(C, block);
-
- return block;
-}
-
static int wm_debug_menu_exec(bContext *C, wmOperator *op)
{
- G.rt= RNA_int_get(op->ptr, "debugval");
+ G.rt= RNA_int_get(op->ptr, "debug_value");
ED_screen_refresh(CTX_wm_manager(C), CTX_wm_window(C));
WM_event_add_notifier(C, NC_WINDOW, NULL);
-
+
return OPERATOR_FINISHED;
}
-static int wm_debug_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_debug_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
-
- RNA_int_set(op->ptr, "debugval", G.rt);
-
- /* pass on operator, so return modal */
- uiPupBlockOperator(C, wm_block_create_menu, op, WM_OP_EXEC_DEFAULT);
-
- return OPERATOR_RUNNING_MODAL;
+ RNA_int_set(op->ptr, "debug_value", G.rt);
+ return WM_operator_props_dialog_popup(C, op, 180, 20);
}
static void WM_OT_debug_menu(wmOperatorType *ot)
@@ -1113,13 +1070,13 @@ static void WM_OT_debug_menu(wmOperatorType *ot)
ot->exec= wm_debug_menu_exec;
ot->poll= WM_operator_winactive;
- RNA_def_int(ot->srna, "debugval", 0, -10000, 10000, "Debug Value", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "debug_value", 0, -10000, 10000, "Debug Value", "", INT_MIN, INT_MAX);
}
/* ***************** Splash Screen ************************* */
-static void wm_block_splash_close(bContext *C, void *arg_block, void *arg_unused)
+static void wm_block_splash_close(bContext *C, void *arg_block, void *UNUSED(arg))
{
uiPupBlockClose(C, arg_block);
}
@@ -1128,7 +1085,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
/* XXX: hack to refresh splash screen with updated prest menu name,
* since popup blocks don't get regenerated like panels do */
-void wm_block_splash_refreshmenu (bContext *C, void *arg_block, void *unused)
+static void wm_block_splash_refreshmenu (bContext *UNUSED(C), void *UNUSED(arg_block), void *UNUSED(arg))
{
/* ugh, causes crashes in other buttons, disabling for now until
* a better fix
@@ -1137,7 +1094,7 @@ void wm_block_splash_refreshmenu (bContext *C, void *arg_block, void *unused)
*/
}
-static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unused)
+static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
uiBut *but;
@@ -1145,8 +1102,8 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
uiStyle *style= U.uistyles.first;
struct RecentFile *recent;
int i;
- Menu menu= {0};
MenuType *mt= WM_menutype_find("USERPREF_MT_splash", TRUE);
+ char url[64];
#ifdef NAN_BUILDINFO
int ver_width, rev_width;
@@ -1184,9 +1141,13 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
uiBlockSetEmboss(block, UI_EMBOSS);
/* show the splash menu (containing interaction presets), using python */
if (mt) {
+ Menu menu= {0};
menu.layout= layout;
menu.type= mt;
mt->draw(C, &menu);
+
+// wmWindowManager *wm= CTX_wm_manager(C);
+// uiItemM(layout, C, "USERPREF_MT_keyconfigs", U.keyconfigstr, ICON_NULL);
}
uiBlockSetEmboss(block, UI_EMBOSSP);
@@ -1194,23 +1155,24 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
split = uiLayoutSplit(layout, 0, 0);
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Links", 0);
+ uiItemL(col, "Links", ICON_NULL);
uiItemStringO(col, "Donations", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
- uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-250/");
+ uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-256-beta/");
uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:Manual");
uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
- uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/");
- uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/documentation/250PythonDoc/contents.html");
- uiItemL(col, "", 0);
-
+ uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); //
+ BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d_%d", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION);
+ uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", url);
+ uiItemL(col, "", ICON_NULL);
+
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Recent", 0);
+ uiItemL(col, "Recent", ICON_NULL);
for(recent = G.recent_files.first, i=0; (i<5) && (recent); recent = recent->next, i++) {
uiItemStringO(col, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
uiItemS(col);
uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session");
- uiItemL(col, "", 0);
+ uiItemL(col, "", ICON_NULL);
uiCenteredBoundsBlock(block, 0.0f);
uiEndBlock(C, block);
@@ -1218,7 +1180,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *arg_unuse
return block;
}
-static int wm_splash_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_splash_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
uiPupBlock(C, wm_block_create_splash, NULL);
@@ -1237,7 +1199,7 @@ static void WM_OT_splash(wmOperatorType *ot)
/* ***************** Search menu ************************* */
-static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
+static void operator_call_cb(struct bContext *C, void *UNUSED(arg1), void *arg2)
{
wmOperatorType *ot= arg2;
@@ -1245,7 +1207,7 @@ static void operator_call_cb(struct bContext *C, void *arg1, void *arg2)
WM_operator_name_call(C, ot->idname, WM_OP_INVOKE_DEFAULT, NULL);
}
-static void operator_search_cb(const struct bContext *C, void *arg, char *str, uiSearchItems *items)
+static void operator_search_cb(const struct bContext *C, void *UNUSED(arg), const char *str, uiSearchItems *items)
{
wmOperatorType *ot = WM_operatortype_first();
@@ -1272,7 +1234,7 @@ static void operator_search_cb(const struct bContext *C, void *arg, char *str, u
}
}
-static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *arg_op)
+static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *UNUSED(arg_op))
{
static char search[256]= "";
wmEvent event;
@@ -1302,15 +1264,13 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *arg_op)
return block;
}
-static int wm_search_menu_exec(bContext *C, wmOperator *op)
+static int wm_search_menu_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
-
return OPERATOR_FINISHED;
}
-static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_search_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
-
uiPupBlock(C, wm_block_search_menu, op);
return OPERATOR_CANCELLED;
@@ -1376,7 +1336,7 @@ static void WM_OT_window_duplicate(wmOperatorType *ot)
ot->idname= "WM_OT_window_duplicate";
ot->description="Duplicate the current Blender window";
- ot->exec= wm_window_duplicate_op;
+ ot->exec= wm_window_duplicate_exec;
ot->poll= wm_operator_winactive_normal;
}
@@ -1398,10 +1358,19 @@ static void WM_OT_read_homefile(wmOperatorType *ot)
ot->description="Open the default file (doesn't save the current file)";
ot->invoke= WM_operator_confirm;
- ot->exec= WM_read_homefile;
- ot->poll= WM_operator_winactive;
+ ot->exec= WM_read_homefile_exec;
+ /* ommit poll to run in background mode */
+}
+
+static void WM_OT_read_factory_settings(wmOperatorType *ot)
+{
+ ot->name= "Load Factory Settings";
+ ot->idname= "WM_OT_read_factory_settings";
+ ot->description="Load default file and user preferences";
- RNA_def_boolean(ot->srna, "factory", 0, "Factory Settings", "");
+ ot->invoke= WM_operator_confirm;
+ ot->exec= WM_read_homefile_exec;
+ /* ommit poll to run in background mode */
}
/* *************** open file **************** */
@@ -1418,9 +1387,17 @@ static void open_set_use_scripts(wmOperator *op)
RNA_boolean_set(op->ptr, "use_scripts", !(U.flag & USER_SCRIPT_AUTOEXEC_DISABLE));
}
-static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
- RNA_string_set(op->ptr, "filepath", G.sce);
+ const char *openname= G.main->name;
+
+ /* if possible, get the name of the most recently used .blend file */
+ if (G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ openname = recent->filepath;
+ }
+
+ RNA_string_set(op->ptr, "filepath", openname);
open_set_load_ui(op);
open_set_use_scripts(op);
@@ -1474,7 +1451,7 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
/* **************** link/append *************** */
-static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(!RNA_property_is_set(op->ptr, "relative_path"))
RNA_boolean_set(op->ptr, "relative_path", U.flag & USER_RELPATHS);
@@ -1699,7 +1676,7 @@ static int wm_recover_auto_save_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static int wm_recover_auto_save_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_recover_auto_save_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char filename[FILE_MAX];
@@ -1747,13 +1724,20 @@ static void save_set_compress(wmOperator *op)
}
}
-static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_save_as_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char name[FILE_MAX];
save_set_compress(op);
- BLI_strncpy(name, G.sce, FILE_MAX);
+ /* if not saved before, get the name of the most recently used .blend file */
+ if(G.main->name[0]==0 && G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ BLI_strncpy(name, recent->filepath, FILE_MAX);
+ }
+ else
+ BLI_strncpy(name, G.main->name, FILE_MAX);
+
untitled(name);
RNA_string_set(op->ptr, "filepath", name);
@@ -1774,7 +1758,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
if(RNA_property_is_set(op->ptr, "filepath"))
RNA_string_get(op->ptr, "filepath", path);
else {
- BLI_strncpy(path, G.sce, FILE_MAX);
+ BLI_strncpy(path, G.main->name, FILE_MAX);
untitled(path);
}
@@ -1797,6 +1781,18 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
+/* function used for WM_OT_save_mainfile too */
+static int blend_save_check(bContext *UNUSED(C), wmOperator *op)
+{
+ char filepath[FILE_MAX];
+ RNA_string_get(op->ptr, "filepath", filepath);
+ if(BLI_replace_extension(filepath, sizeof(filepath), ".blend")) {
+ RNA_string_set(op->ptr, "filepath", filepath);
+ return TRUE;
+ }
+ return FALSE;
+}
+
static void WM_OT_save_as_mainfile(wmOperatorType *ot)
{
ot->name= "Save As Blender File";
@@ -1805,8 +1801,9 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
ot->invoke= wm_save_as_mainfile_invoke;
ot->exec= wm_save_as_mainfile_exec;
- ot->poll= WM_operator_winactive;
-
+ ot->check= blend_save_check;
+ /* ommit window poll so this can work in background mode */
+
WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH);
RNA_def_boolean(ot->srna, "compress", 0, "Compress", "Write compressed .blend file");
RNA_def_boolean(ot->srna, "relative_remap", 1, "Remap Relative", "Remap relative paths when saving in a different directory");
@@ -1815,7 +1812,7 @@ static void WM_OT_save_as_mainfile(wmOperatorType *ot)
/* *************** save file directly ******** */
-static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
char name[FILE_MAX];
int check_existing=1;
@@ -1825,9 +1822,17 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
save_set_compress(op);
-
- BLI_strncpy(name, G.sce, FILE_MAX);
+
+ /* if not saved before, get the name of the most recently used .blend file */
+ if(G.main->name[0]==0 && G.recent_files.first) {
+ struct RecentFile *recent = G.recent_files.first;
+ BLI_strncpy(name, recent->filepath, FILE_MAX);
+ }
+ else
+ BLI_strncpy(name, G.main->name, FILE_MAX);
+
untitled(name);
+
RNA_string_set(op->ptr, "filepath", name);
if (RNA_struct_find_property(op->ptr, "check_existing"))
@@ -1855,6 +1860,7 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
ot->invoke= wm_save_mainfile_invoke;
ot->exec= wm_save_as_mainfile_exec;
+ ot->check= blend_save_check;
ot->poll= NULL;
WM_operator_properties_filesel(ot, FOLDERFILE|BLENDERFILE, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH);
@@ -1867,12 +1873,13 @@ static void WM_OT_save_mainfile(wmOperatorType *ot)
#include "../../collada/collada.h"
-static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *event)
+static int wm_collada_export_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(!RNA_property_is_set(op->ptr, "filepath")) {
- char *path = BLI_replacestr(G.sce, ".blend", ".dae");
- RNA_string_set(op->ptr, "filepath", path);
- MEM_freeN(path);
+ char filepath[FILE_MAX];
+ BLI_strncpy(filepath, G.main->name, sizeof(filepath));
+ BLI_replace_extension(filepath, sizeof(filepath), ".dae");
+ RNA_string_set(op->ptr, "filepath", filepath);
}
WM_event_add_fileselect(C, op);
@@ -1948,7 +1955,7 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot)
ot->idname= "WM_OT_window_fullscreen_toggle";
ot->description="Toggle the current window fullscreen";
- ot->exec= wm_window_fullscreen_toggle_op;
+ ot->exec= wm_window_fullscreen_toggle_exec;
ot->poll= WM_operator_winactive;
}
@@ -1961,10 +1968,10 @@ static int wm_exit_blender_op(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static void WM_OT_exit_blender(wmOperatorType *ot)
+static void WM_OT_quit_blender(wmOperatorType *ot)
{
- ot->name= "Exit Blender";
- ot->idname= "WM_OT_exit_blender";
+ ot->name= "Quit Blender";
+ ot->idname= "WM_OT_quit_blender";
ot->description= "Quit Blender";
ot->invoke= WM_operator_confirm;
@@ -1972,6 +1979,43 @@ static void WM_OT_exit_blender(wmOperatorType *ot)
ot->poll= WM_operator_winactive;
}
+/* *********************** */
+#if defined(WIN32)
+static int console= 1;
+void WM_toggle_console(bContext *UNUSED(C), short show)
+{
+ if(show) {
+ ShowWindow(GetConsoleWindow(),SW_SHOW);
+ console= 1;
+ }
+ else {
+ ShowWindow(GetConsoleWindow(),SW_HIDE);
+ console= 0;
+ }
+}
+
+static int wm_toggle_console_op(bContext *C, wmOperator *UNUSED(op))
+{
+ if(console) {
+ WM_toggle_console(C, 0);
+ }
+ else {
+ WM_toggle_console(C, 1);
+ }
+ return OPERATOR_FINISHED;
+}
+
+static void WM_OT_toggle_console(wmOperatorType *ot)
+{
+ ot->name= "Toggle System Console";
+ ot->idname= "WM_OT_toggle_console";
+ ot->description= "Toggle System Console";
+
+ ot->exec= wm_toggle_console_op;
+ ot->poll= WM_operator_winactive;
+}
+#endif
+
/* ************ default paint cursors, draw always around cursor *********** */
/*
- returns handler to free
@@ -2264,19 +2308,19 @@ static void tweak_gesture_modal(bContext *C, wmEvent *event)
rect->xmax= event->x - sx;
rect->ymax= event->y - sy;
- if((val= wm_gesture_evaluate(C, gesture))) {
- wmEvent event;
+ if((val= wm_gesture_evaluate(gesture))) {
+ wmEvent tevent;
- event= *(window->eventstate);
+ tevent= *(window->eventstate);
if(gesture->event_type==LEFTMOUSE)
- event.type= EVT_TWEAK_L;
+ tevent.type= EVT_TWEAK_L;
else if(gesture->event_type==RIGHTMOUSE)
- event.type= EVT_TWEAK_R;
+ tevent.type= EVT_TWEAK_R;
else
- event.type= EVT_TWEAK_M;
- event.val= val;
+ tevent.type= EVT_TWEAK_M;
+ tevent.val= val;
/* mouse coords! */
- wm_event_add(window, &event);
+ wm_event_add(window, &tevent);
WM_gesture_end(C, gesture); /* frees gesture itself, and unregisters from window */
}
@@ -2357,7 +2401,7 @@ int WM_gesture_lines_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
-static void gesture_lasso_apply(bContext *C, wmOperator *op, int event_type)
+static void gesture_lasso_apply(bContext *C, wmOperator *op)
{
wmGesture *gesture= op->customdata;
PointerRNA itemptr;
@@ -2404,11 +2448,21 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event)
}
{
+ short x, y;
short *lasso= gesture->customdata;
- lasso += 2 * gesture->points;
- lasso[0] = event->x - sx;
- lasso[1] = event->y - sy;
- gesture->points++;
+
+ lasso += (2 * gesture->points - 2);
+ x = (event->x - sx - lasso[0]);
+ y = (event->y - sy - lasso[1]);
+
+ /* make a simple distance check to get a smoother lasso
+ add only when at least 2 pixels between this and previous location */
+ if((x*x+y*y) > 4) {
+ lasso += 2;
+ lasso[0] = event->x - sx;
+ lasso[1] = event->y - sy;
+ gesture->points++;
+ }
}
break;
@@ -2416,7 +2470,7 @@ int WM_gesture_lasso_modal(bContext *C, wmOperator *op, wmEvent *event)
case MIDDLEMOUSE:
case RIGHTMOUSE:
if(event->val==KM_RELEASE) { /* key release */
- gesture_lasso_apply(C, op, event->type);
+ gesture_lasso_apply(C, op);
return OPERATOR_FINISHED;
}
break;
@@ -2575,7 +2629,7 @@ void WM_OT_straightline_gesture(wmOperatorType *ot)
/* *********************** radial control ****************** */
-const int WM_RADIAL_CONTROL_DISPLAY_SIZE = 200;
+static const int WM_RADIAL_CONTROL_DISPLAY_SIZE = 200;
typedef struct wmRadialControl {
int mode;
@@ -2656,8 +2710,6 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40);
glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40);
glDisable(GL_BLEND);
-
- glPopMatrix();
}
int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
@@ -2748,7 +2800,10 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
int mode = RNA_int_get(op->ptr, "mode");
float initial_value = RNA_float_get(op->ptr, "initial_value");
//float initial_size = RNA_float_get(op->ptr, "initial_size");
- int mouse[2] = {event->x, event->y};
+ int mouse[2];
+
+ mouse[0]= event->x;
+ mouse[1]= event->y;
//if (initial_size == 0)
// initial_size = WM_RADIAL_CONTROL_DISPLAY_SIZE;
@@ -2809,11 +2864,11 @@ void WM_radial_control_string(wmOperator *op, char str[], int maxlen)
float v = RNA_float_get(op->ptr, "new_value");
if(mode == WM_RADIALCONTROL_SIZE)
- sprintf(str, "Size: %d", (int)v);
+ BLI_snprintf(str, maxlen, "Size: %d", (int)v);
else if(mode == WM_RADIALCONTROL_STRENGTH)
- sprintf(str, "Strength: %d", (int)v);
+ BLI_snprintf(str, maxlen, "Strength: %d", (int)v);
else if(mode == WM_RADIALCONTROL_ANGLE)
- sprintf(str, "Angle: %d", (int)(v * 180.0f/M_PI));
+ BLI_snprintf(str, maxlen, "Angle: %d", (int)(v * 180.0f/M_PI));
}
/** Important: this doesn't define an actual operator, it
@@ -2884,7 +2939,8 @@ static int redraw_timer_exec(bContext *C, wmOperator *op)
for(a=0; a<iter; a++) {
if (type==0) {
- ED_region_do_draw(C, ar);
+ if(ar)
+ ED_region_do_draw(C, ar);
}
else if (type==1) {
wmWindow *win= CTX_wm_window(C);
@@ -2980,7 +3036,7 @@ static void WM_OT_redraw_timer(wmOperatorType *ot)
/* ************************** memory statistics for testing ***************** */
-static int memory_statistics_exec(bContext *C, wmOperator *op)
+static int memory_statistics_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
{
MEM_printmemlist_stats();
return OPERATOR_FINISHED;
@@ -3007,7 +3063,7 @@ void wm_operatortype_free(void)
wm_operatortype_free_macro(ot);
if(ot->ext.srna) /* python operator, allocs own string */
- MEM_freeN(ot->idname);
+ MEM_freeN((void *)ot->idname);
}
BLI_freelistN(&global_ops);
@@ -3018,9 +3074,10 @@ void wm_operatortype_init(void)
{
WM_operatortype_append(WM_OT_window_duplicate);
WM_operatortype_append(WM_OT_read_homefile);
+ WM_operatortype_append(WM_OT_read_factory_settings);
WM_operatortype_append(WM_OT_save_homefile);
WM_operatortype_append(WM_OT_window_fullscreen_toggle);
- WM_operatortype_append(WM_OT_exit_blender);
+ WM_operatortype_append(WM_OT_quit_blender);
WM_operatortype_append(WM_OT_open_mainfile);
WM_operatortype_append(WM_OT_link_append);
WM_operatortype_append(WM_OT_recover_last_session);
@@ -3033,6 +3090,9 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_splash);
WM_operatortype_append(WM_OT_search_menu);
WM_operatortype_append(WM_OT_call_menu);
+#if defined(WIN32)
+ WM_operatortype_append(WM_OT_toggle_console);
+#endif
#ifdef WITH_COLLADA
/* XXX: move these */
@@ -3159,7 +3219,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_assign(keymap, "ACTION_OT_select_border");
WM_modalkeymap_assign(keymap, "ANIM_OT_channels_select_border");
WM_modalkeymap_assign(keymap, "ANIM_OT_previewrange_set");
- WM_modalkeymap_assign(keymap, "CONSOLE_OT_select_border");
+ WM_modalkeymap_assign(keymap, "INFO_OT_select_border");
WM_modalkeymap_assign(keymap, "FILE_OT_select_border");
WM_modalkeymap_assign(keymap, "GRAPH_OT_select_border");
WM_modalkeymap_assign(keymap, "MARKER_OT_select_border");
@@ -3222,7 +3282,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "WM_OT_open_mainfile", OKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "WM_OT_save_mainfile", SKEY, KM_PRESS, KM_OSKEY, 0);
WM_keymap_add_item(keymap, "WM_OT_save_as_mainfile", SKEY, KM_PRESS, KM_SHIFT|KM_OSKEY, 0);
- WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
+ WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_OSKEY, 0);
#endif
WM_keymap_add_item(keymap, "WM_OT_read_homefile", NKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
@@ -3242,7 +3302,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "copy", 1);
WM_keymap_verify_item(keymap, "WM_OT_window_fullscreen_toggle", F11KEY, KM_PRESS, KM_ALT, 0);
- WM_keymap_add_item(keymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
+ WM_keymap_add_item(keymap, "WM_OT_quit_blender", QKEY, KM_PRESS, KM_CTRL, 0);
/* debug/testing */
WM_keymap_verify_item(keymap, "WM_OT_redraw_timer", TKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
@@ -3303,14 +3363,12 @@ void wm_window_keymap(wmKeyConfig *keyconf)
}
/* Generic itemf's for operators that take library args */
-static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, ID *id, int local)
+static EnumPropertyItem *rna_id_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), int *do_free, ID *id, int local)
{
- EnumPropertyItem *item= NULL, item_tmp;
+ EnumPropertyItem item_tmp= {0}, *item= NULL;
int totitem= 0;
int i= 0;
- memset(&item_tmp, 0, sizeof(item_tmp));
-
for( ; id; id= id->next) {
if(local==FALSE || id->lib==NULL) {
item_tmp.identifier= item_tmp.name= id->name+2;
@@ -3320,44 +3378,44 @@ static EnumPropertyItem *rna_id_itemf(bContext *C, PointerRNA *ptr, int *free, I
}
RNA_enum_item_end(&item, &totitem);
- *free= 1;
+ *do_free= 1;
return item;
}
/* can add more as needed */
-EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE);
}
-EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE);
}
-EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *free)
+EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *do_free)
{
- return rna_id_itemf(C, ptr, free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE);
+ return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE);
}
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 207b6cebfe6..1117d296f94 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/windowmanager/intern/wm_subwindow.c
+ * \ingroup wm
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
@@ -39,6 +44,8 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
@@ -73,7 +80,7 @@ typedef struct wmSubWindow {
/* ******************* open, free, set, get data ******************** */
/* not subwindow itself */
-static void wm_subwindow_free(wmSubWindow *swin)
+static void wm_subwindow_free(wmSubWindow *UNUSED(swin))
{
/* future fancy stuff */
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 09610a2829e..44200294b6c 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/intern/wm_window.c
+ * \ingroup wm
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
@@ -41,11 +46,14 @@
#include "GHOST_C-api.h"
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_library.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
+#include "BKE_main.h"
+
#include "BIF_gl.h"
@@ -58,16 +66,19 @@
#include "wm_event_system.h"
#include "ED_screen.h"
+#include "ED_fileselect.h"
#include "PIL_time.h"
#include "GPU_draw.h"
+#include "GPU_extensions.h"
/* the global to talk to ghost */
GHOST_SystemHandle g_system= NULL;
/* set by commandline */
-static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0;
+static int prefsizx= 0, prefsizy= 0, prefstax= 0, prefstay= 0, initialstate= GHOST_kWindowStateNormal;
+static unsigned short useprefsize= 0;
/* ******** win open & close ************ */
@@ -144,10 +155,9 @@ void wm_window_free(bContext *C, wmWindowManager *wm, wmWindow *win)
CTX_wm_window_set(C, NULL);
}
- if(wm->windrawable==win)
- wm->windrawable= NULL;
- if(wm->winactive==win)
- wm->winactive= NULL;
+ /* always set drawable and active to NULL, prevents non-drawable state of main windows (bugs #22967 and #25071, possibly #22477 too) */
+ wm->windrawable= NULL;
+ wm->winactive= NULL;
/* end running jobs, a job end also removes its timer */
for(wt= wm->timers.first; wt; wt= wtnext) {
@@ -213,7 +223,7 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
/* duplicate assigns to window */
win->screen= ED_screen_duplicate(win, winorig->screen);
- BLI_strncpy(win->screenname, win->screen->id.name+2, 21);
+ BLI_strncpy(win->screenname, win->screen->id.name+2, sizeof(win->screenname));
win->screen->winid= win->winid;
win->screen->do_refresh= 1;
@@ -234,13 +244,20 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
CTX_wm_window_set(C, win); /* needed by handlers */
WM_event_remove_handlers(C, &win->handlers);
WM_event_remove_handlers(C, &win->modalhandlers);
- ED_screen_exit(C, win, win->screen); /* will free the current screen if it is a temp layout */
+ ED_screen_exit(C, win, win->screen);
+
+ /* if temp screen, delete it */
+ if(win->screen->temp) {
+ Main *bmain= CTX_data_main(C);
+ free_libblock(&bmain->screen, win->screen);
+ }
+
wm_window_free(C, wm, win);
/* check remaining windows */
if(wm->windows.first) {
for(win= wm->windows.first; win; win= win->next)
- if(win->screen->full!=SCREENTEMP)
+ if(win->screen->temp == 0)
break;
/* in this case we close all */
if(win==NULL)
@@ -253,23 +270,16 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
void wm_window_title(wmWindowManager *wm, wmWindow *win)
{
/* handle the 'temp' window */
- if(win->screen && win->screen->full==SCREENTEMP) {
+ if(win->screen && win->screen->temp) {
GHOST_SetTitle(win->ghostwin, "Blender");
}
else {
/* this is set to 1 if you don't have startup.blend open */
- if(G.save_over) {
- char *str= MEM_mallocN(strlen(G.sce) + 16, "title");
-
- if(wm->file_saved)
- sprintf(str, "Blender [%s]", G.sce);
- else
- sprintf(str, "Blender* [%s]", G.sce);
-
+ if(G.save_over && G.main->name[0]) {
+ char str[sizeof(G.main->name) + 12];
+ BLI_snprintf(str, sizeof(str), "Blender%s [%s]", wm->file_saved ? "":"*", G.main->name);
GHOST_SetTitle(win->ghostwin, str);
-
- MEM_freeN(str);
}
else
GHOST_SetTitle(win->ghostwin, "Blender");
@@ -289,36 +299,43 @@ void wm_window_title(wmWindowManager *wm, wmWindow *win)
}
/* belongs to below */
-static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow *win)
+static void wm_window_add_ghostwindow(bContext *C, const char *title, wmWindow *win)
{
GHOST_WindowHandle ghostwin;
- GHOST_TWindowState inital_state;
int scr_w, scr_h, posy;
+ GHOST_TWindowState initial_state;
+
+ /* when there is no window open uses the initial state */
+ if(!CTX_wm_window(C))
+ initial_state= initialstate;
+ else
+ initial_state= GHOST_kWindowStateNormal;
wm_get_screensize(&scr_w, &scr_h);
posy= (scr_h - win->posy - win->sizey);
- // inital_state = GHOST_kWindowStateFullScreen;
- // inital_state = GHOST_kWindowStateMaximized;
- inital_state = GHOST_kWindowStateNormal;
-
#if defined(__APPLE__) && !defined(GHOST_COCOA)
{
extern int macPrefState; /* creator.c */
- inital_state += macPrefState;
+ initial_state += macPrefState;
}
#endif
/* Disable AA for now, as GL_SELECT (used for border, lasso, ... select)
doesn't work well when AA is initialized, even if not used. */
ghostwin= GHOST_CreateWindow(g_system, title,
win->posx, posy, win->sizex, win->sizey,
- inital_state,
+ initial_state,
GHOST_kDrawingContextTypeOpenGL,
0 /* no stereo */,
0 /* no AA */);
if (ghostwin) {
+ /* needed so we can detect the graphics card below */
+ GPU_extensions_init();
+ /* set the state*/
+ GHOST_SetWindowState(ghostwin, initial_state);
+
win->ghostwin= ghostwin;
GHOST_SetWindowUserData(ghostwin, win); /* pointer back */
@@ -327,7 +344,11 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow
/* until screens get drawn, make it nice grey */
glClearColor(.55, .55, .55, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
+ /* Crash on OSS ATI: bugs.launchpad.net/ubuntu/+source/mesa/+bug/656100 */
+ if(!GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE)) {
+ glClear(GL_COLOR_BUFFER_BIT);
+ }
+
wm_window_swap_buffers(win);
//GHOST_SetWindowState(ghostwin, GHOST_kWindowStateModified);
@@ -342,12 +363,15 @@ static void wm_window_add_ghostwindow(wmWindowManager *wm, char *title, wmWindow
/* for wmWindows without ghostwin, open these and clear */
/* window size is read from window, if 0 it uses prefsize */
/* called in WM_check, also inits stuff after file read */
-void wm_window_add_ghostwindows(wmWindowManager *wm)
+void wm_window_add_ghostwindows(bContext* C, wmWindowManager *wm)
{
wmKeyMap *keymap;
wmWindow *win;
- /* no commandline prefsize? then we set this */
+ /* no commandline prefsize? then we set this.
+ * Note that these values will be used only
+ * when there is no startup.blend yet.
+ */
if (!prefsizx) {
wm_get_screensize(&prefsizx, &prefsizy);
@@ -367,18 +391,19 @@ void wm_window_add_ghostwindows(wmWindowManager *wm)
for(win= wm->windows.first; win; win= win->next) {
if(win->ghostwin==NULL) {
- if(win->sizex==0 || prefsizx || prefsizy) {
+ if(win->sizex==0 || useprefsize) {
win->posx= prefstax;
win->posy= prefstay;
win->sizex= prefsizx;
win->sizey= prefsizy;
- win->windowstate= 0;
+ win->windowstate= initialstate;
+ useprefsize= 0;
}
- wm_window_add_ghostwindow(wm, "Blender", win);
+ wm_window_add_ghostwindow(C, "Blender", win);
}
/* happens after fileread */
if(win->eventstate==NULL)
- win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
+ win->eventstate= MEM_callocN(sizeof(wmEvent), "window event state");
/* add keymap handlers (1 handler for all keys in map!) */
keymap= WM_keymap_find(wm->defaultconf, "Window", 0, 0);
@@ -390,6 +415,11 @@ void wm_window_add_ghostwindows(wmWindowManager *wm)
keymap= WM_keymap_find(wm->defaultconf, "Screen Editing", 0, 0);
WM_event_add_keymap_handler(&win->modalhandlers, keymap);
+ /* add drop boxes */
+ {
+ ListBase *lb= WM_dropboxmap_find("Window", 0, 0);
+ WM_event_add_dropbox_handler(&win->handlers, lb);
+ }
wm_window_title(wm, win);
}
}
@@ -414,7 +444,7 @@ wmWindow *WM_window_open(bContext *C, rcti *rect)
return win;
}
-/* uses screen->full tag to define what to do, currently it limits
+/* uses screen->temp tag to define what to do, currently it limits
to only one "temp" window for render out, preferences, filewindow, etc */
/* type is #define in WM_api.h */
@@ -428,7 +458,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* test if we have a temp screen already */
for(win= CTX_wm_manager(C)->windows.first; win; win= win->next)
- if(win->screen->full == SCREENTEMP)
+ if(win->screen->temp)
break;
/* add new window? */
@@ -450,7 +480,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* add new screen? */
if(win->screen==NULL)
win->screen= ED_screen_add(win, CTX_data_scene(C), "temp");
- win->screen->full = SCREENTEMP;
+ win->screen->temp = 1;
/* make window active, and validate/resize */
CTX_wm_window_set(C, win);
@@ -483,7 +513,7 @@ void WM_window_open_temp(bContext *C, rcti *position, int type)
/* ****************** Operators ****************** */
/* operator callback */
-int wm_window_duplicate_op(bContext *C, wmOperator *op)
+int wm_window_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
{
wm_window_copy(C, CTX_wm_window(C));
WM_check(C);
@@ -495,7 +525,7 @@ int wm_window_duplicate_op(bContext *C, wmOperator *op)
/* fullscreen operator callback */
-int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op)
+int wm_window_fullscreen_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *window= CTX_wm_window(C);
GHOST_TWindowState state = GHOST_GetWindowState(window->ghostwin);
@@ -511,22 +541,37 @@ int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op)
/* ************ events *************** */
-static int query_qual(char qual)
+typedef enum
+{
+ SHIFT = 's',
+ CONTROL = 'c',
+ ALT = 'a',
+ OS = 'C'
+} modifierKeyType;
+
+/* check if specified modifier key type is pressed */
+static int query_qual(modifierKeyType qual)
{
GHOST_TModifierKeyMask left, right;
int val= 0;
- if (qual=='s') {
- left= GHOST_kModifierKeyLeftShift;
- right= GHOST_kModifierKeyRightShift;
- } else if (qual=='c') {
- left= GHOST_kModifierKeyLeftControl;
- right= GHOST_kModifierKeyRightControl;
- } else if (qual=='C') {
- left= right= GHOST_kModifierKeyCommand;
- } else {
- left= GHOST_kModifierKeyLeftAlt;
- right= GHOST_kModifierKeyRightAlt;
+ switch(qual) {
+ case SHIFT:
+ left= GHOST_kModifierKeyLeftShift;
+ right= GHOST_kModifierKeyRightShift;
+ break;
+ case CONTROL:
+ left= GHOST_kModifierKeyLeftControl;
+ right= GHOST_kModifierKeyRightControl;
+ break;
+ case OS:
+ left= right= GHOST_kModifierKeyOS;
+ break;
+ case ALT:
+ default:
+ left= GHOST_kModifierKeyLeftAlt;
+ right= GHOST_kModifierKeyRightAlt;
+ break;
}
GHOST_GetModifierKeyState(g_system, left, &val);
@@ -595,20 +640,20 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
/* bad ghost support for modifier keys... so on activate we set the modifiers again */
kdata.ascii= 0;
- if (win->eventstate->shift && !query_qual('s')) {
+ if (win->eventstate->shift && !query_qual(SHIFT)) {
kdata.key= GHOST_kKeyLeftShift;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->ctrl && !query_qual('c')) {
+ if (win->eventstate->ctrl && !query_qual(CONTROL)) {
kdata.key= GHOST_kKeyLeftControl;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->alt && !query_qual('a')) {
+ if (win->eventstate->alt && !query_qual(ALT)) {
kdata.key= GHOST_kKeyLeftAlt;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
- if (win->eventstate->oskey && !query_qual('C')) {
- kdata.key= GHOST_kKeyCommand;
+ if (win->eventstate->oskey && !query_qual(OS)) {
+ kdata.key= GHOST_kKeyOS;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, time, &kdata);
}
/* keymodifier zero, it hangs on hotkeys that open windows otherwise */
@@ -782,15 +827,17 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr private)
/* printf("Drop detected\n"); */
/* add drag data to wm for paths: */
- /* need icon type, some dropboxes check for that... see filesel code for this */
if(ddd->dataType == GHOST_kDragnDropTypeFilenames) {
GHOST_TStringArray *stra= ddd->data;
- int a;
+ int a, icon;
for(a=0; a<stra->count; a++) {
printf("drop file %s\n", stra->strings[a]);
- WM_event_start_drag(C, 0, WM_DRAG_PATH, stra->strings[a], 0.0);
+ /* try to get icon type from extension */
+ icon= ED_file_extension_icon((char *)stra->strings[a]);
+
+ WM_event_start_drag(C, icon, WM_DRAG_PATH, stra->strings[a], 0.0);
/* void poin should point to string, it makes a copy */
break; // only one drop element supported now
}
@@ -872,7 +919,7 @@ void wm_window_process_events(const bContext *C)
PIL_sleep_ms(5);
}
-void wm_window_process_events_nosleep(const bContext *C)
+void wm_window_process_events_nosleep(void)
{
if(GHOST_ProcessEvents(g_system, 0))
GHOST_DispatchEvents(g_system);
@@ -920,7 +967,7 @@ void wm_ghost_exit(void)
/* **************** timer ********************** */
/* to (de)activate running timers temporary */
-void WM_event_timer_sleep(wmWindowManager *wm, wmWindow *win, wmTimer *timer, int dosleep)
+void WM_event_timer_sleep(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer, int dosleep)
{
wmTimer *wt;
@@ -948,7 +995,7 @@ wmTimer *WM_event_add_timer(wmWindowManager *wm, wmWindow *win, int event_type,
return wt;
}
-void WM_event_remove_timer(wmWindowManager *wm, wmWindow *win, wmTimer *timer)
+void WM_event_remove_timer(wmWindowManager *wm, wmWindow *UNUSED(win), wmTimer *timer)
{
wmTimer *wt;
@@ -971,6 +1018,9 @@ char *WM_clipboard_text_get(int selection)
{
char *p, *p2, *buf, *newbuf;
+ if(G.background)
+ return NULL;
+
buf= (char*)GHOST_getClipboard(selection);
if(!buf)
return NULL;
@@ -991,33 +1041,35 @@ char *WM_clipboard_text_get(int selection)
void WM_clipboard_text_set(char *buf, int selection)
{
+ if(!G.background) {
#ifdef _WIN32
- /* do conversion from \n to \r\n on Windows */
- char *p, *p2, *newbuf;
- int newlen= 0;
-
- for(p= buf; *p; p++) {
- if(*p == '\n')
- newlen += 2;
- else
- newlen++;
- }
+ /* do conversion from \n to \r\n on Windows */
+ char *p, *p2, *newbuf;
+ int newlen= 0;
+
+ for(p= buf; *p; p++) {
+ if(*p == '\n')
+ newlen += 2;
+ else
+ newlen++;
+ }
+
+ newbuf= MEM_callocN(newlen+1, "WM_clipboard_text_set");
- newbuf= MEM_callocN(newlen+1, "WM_clipboard_text_set");
-
- for(p= buf, p2= newbuf; *p; p++, p2++) {
- if(*p == '\n') {
- *(p2++)= '\r'; *p2= '\n';
+ for(p= buf, p2= newbuf; *p; p++, p2++) {
+ if(*p == '\n') {
+ *(p2++)= '\r'; *p2= '\n';
+ }
+ else *p2= *p;
}
- else *p2= *p;
- }
- *p2= '\0';
-
- GHOST_putClipboard((GHOST_TInt8*)newbuf, selection);
- MEM_freeN(newbuf);
+ *p2= '\0';
+
+ GHOST_putClipboard((GHOST_TInt8*)newbuf, selection);
+ MEM_freeN(newbuf);
#else
- GHOST_putClipboard((GHOST_TInt8*)buf, selection);
+ GHOST_putClipboard((GHOST_TInt8*)buf, selection);
#endif
+ }
}
/* ******************* progress bar **************** */
@@ -1106,6 +1158,18 @@ void WM_setprefsize(int stax, int stay, int sizx, int sizy)
prefstay= stay;
prefsizx= sizx;
prefsizy= sizy;
+ useprefsize= 1;
+}
+
+/* for borderless and border windows set from command-line */
+void WM_setinitialstate_fullscreen(void)
+{
+ initialstate= GHOST_kWindowStateFullScreen;
+}
+
+void WM_setinitialstate_normal(void)
+{
+ initialstate= GHOST_kWindowStateNormal;
}
/* This function requires access to the GHOST_SystemHandle (g_system) */
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 7228a6dcd93..f73652125b1 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/windowmanager/wm.h
+ * \ingroup wm
+ */
+
#ifndef WM_H
#define WM_H
@@ -61,7 +66,7 @@ void wm_tweakevent_test(bContext *C, wmEvent *event, int action);
/* wm_gesture.c */
#define WM_LASSO_MIN_POINTS 1024
void wm_gesture_draw(struct wmWindow *win);
-int wm_gesture_evaluate(bContext *C, wmGesture *gesture);
+int wm_gesture_evaluate(wmGesture *gesture);
void wm_gesture_tag_redraw(bContext *C);
/* wm_jobs.c */
diff --git a/source/blender/windowmanager/wm_cursors.h b/source/blender/windowmanager/wm_cursors.h
index 178a5f55ba4..c858b9d94f3 100644
--- a/source/blender/windowmanager/wm_cursors.h
+++ b/source/blender/windowmanager/wm_cursors.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/wm_cursors.h
+ * \ingroup wm
+ */
+
+
#ifndef WM_CURSORS_H
@@ -47,7 +52,7 @@ enum {
CURSOR_STD,
CURSOR_NONE,
CURSOR_PENCIL,
- CURSOR_COPY,
+ CURSOR_COPY
};
diff --git a/source/blender/windowmanager/wm_draw.h b/source/blender/windowmanager/wm_draw.h
index 762d759c936..3112751a4c0 100644
--- a/source/blender/windowmanager/wm_draw.h
+++ b/source/blender/windowmanager/wm_draw.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/wm_draw.h
+ * \ingroup wm
+ */
+
+
#ifndef WM_DRAW_H
#define WM_DRAW_H
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index 8fd650fb184..6ad9d1daede 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/windowmanager/wm_event_system.h
+ * \ingroup wm
+ */
+
#ifndef WM_EVENT_SYSTEM_H
#define WM_EVENT_SYSTEM_H
@@ -84,7 +89,6 @@ enum {
/* wm_event_system.c */
-void wm_event_add (wmWindow *win, wmEvent *event_to_add);
void wm_event_free_all (wmWindow *win);
void wm_event_free (wmEvent *event);
void wm_event_free_handler (wmEventHandler *handler);
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 6cb3971bd21..39545a0ad01 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/wm_event_types.h
+ * \ingroup wm
+ */
+
+
/*
* These define have its origin at sgi, where all device defines were written down in device.h.
* Blender copied the conventions quite some, and expanded it with internal new defines (ton)
@@ -46,31 +51,31 @@
#define EVT_TABLET_STYLUS 1
#define EVT_TABLET_ERASER 2
-#define MOUSEX 0x004
-#define MOUSEY 0x005
+#define MOUSEX 4
+#define MOUSEY 5
/* MOUSE : 0x00x */
-#define LEFTMOUSE 0x001
-#define MIDDLEMOUSE 0x002
-#define RIGHTMOUSE 0x003
-#define MOUSEMOVE 0x004
+#define LEFTMOUSE 1
+#define MIDDLEMOUSE 2
+#define RIGHTMOUSE 3
+#define MOUSEMOVE 4
/* only use if you want user option switch possible */
-#define ACTIONMOUSE 0x005
-#define SELECTMOUSE 0x006
+#define ACTIONMOUSE 5
+#define SELECTMOUSE 6
/* Extra mouse buttons */
-#define BUTTON4MOUSE 0x007
-#define BUTTON5MOUSE 0x008
+#define BUTTON4MOUSE 7
+#define BUTTON5MOUSE 8
/* Extra trackpad gestures */
-#define MOUSEPAN 0x00e
-#define MOUSEZOOM 0x00f
-#define MOUSEROTATE 0x010
+#define MOUSEPAN 14
+#define MOUSEZOOM 15
+#define MOUSEROTATE 16
/* defaults from ghost */
-#define WHEELUPMOUSE 0x00a
-#define WHEELDOWNMOUSE 0x00b
+#define WHEELUPMOUSE 10
+#define WHEELDOWNMOUSE 11
/* mapped with userdef */
-#define WHEELINMOUSE 0x00c
-#define WHEELOUTMOUSE 0x00d
-#define INBETWEEN_MOUSEMOVE 0x011
+#define WHEELINMOUSE 12
+#define WHEELOUTMOUSE 13
+#define INBETWEEN_MOUSEMOVE 17
/* SYSTEM : 0x01xx */
@@ -204,9 +209,15 @@
#define ENDKEY 170
#define UNKNOWNKEY 171
-#define COMMANDKEY 172
+#define OSKEY 172
#define GRLESSKEY 173
+// XXX: are these codes ok?
+#define MEDIAPLAY 174
+#define MEDIASTOP 175
+#define MEDIAFIRST 176
+#define MEDIALAST 177
+
/* for event checks */
/* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */
#define ISTEXTINPUT(event) (event >=' ' && event <=255)
@@ -215,7 +226,7 @@
#define ISKEYBOARD(event) (event >=' ' && event <=320)
/* test whether the event is a modifier key */
-#define ISKEYMODIFIER(event) ((event >= LEFTCTRLKEY && event <= LEFTSHIFTKEY) || event == COMMANDKEY)
+#define ISKEYMODIFIER(event) ((event >= LEFTCTRLKEY && event <= LEFTSHIFTKEY) || event == OSKEY)
/* test whether the event is a mouse button */
#define ISMOUSE(event) (event >= LEFTMOUSE && event <= MOUSEROTATE)
@@ -227,22 +238,22 @@
#define ISTWEAK(event) (event >= EVT_TWEAK_L && event <= EVT_GESTURE)
/* test whether event type is acceptable as hotkey, excluding modifiers */
-#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY))
+#define ISHOTKEY(event) ((ISKEYBOARD(event) || ISMOUSE(event)) && event!=ESCKEY && !(event>=LEFTCTRLKEY && event<=LEFTSHIFTKEY) && !(event>=UNKNOWNKEY && event<=GRLESSKEY))
-/* **************** BLENDER GESTURE EVENTS ********************* */
+/* **************** BLENDER GESTURE EVENTS (0x5000) **************** */
-#define EVT_ACTIONZONE_AREA 0x5000
-#define EVT_ACTIONZONE_REGION 0x5001
+#define EVT_ACTIONZONE_AREA 20480
+#define EVT_ACTIONZONE_REGION 20481
/* tweak events, for L M R mousebuttons */
-#define EVT_TWEAK_L 0x5002
-#define EVT_TWEAK_M 0x5003
-#define EVT_TWEAK_R 0x5004
+#define EVT_TWEAK_L 20482
+#define EVT_TWEAK_M 20483
+#define EVT_TWEAK_R 20484
/* tweak events for action or select mousebutton */
-#define EVT_TWEAK_A 0x5005
-#define EVT_TWEAK_S 0x5006
+#define EVT_TWEAK_A 20485
+#define EVT_TWEAK_S 20486
-#define EVT_GESTURE 0x5010
+#define EVT_GESTURE 20496
/* value of tweaks and line gestures, note, KM_ANY (-1) works for this case too */
#define EVT_GESTURE_N 1
@@ -269,10 +280,11 @@
#define EVT_FILESELECT 0x5020
/* event->val */
-#define EVT_FILESELECT_OPEN 1
-#define EVT_FILESELECT_FULL_OPEN 2
-#define EVT_FILESELECT_EXEC 3
-#define EVT_FILESELECT_CANCEL 4
+#define EVT_FILESELECT_OPEN 1
+#define EVT_FILESELECT_FULL_OPEN 2
+#define EVT_FILESELECT_EXEC 3
+#define EVT_FILESELECT_CANCEL 4
+#define EVT_FILESELECT_EXTERNAL_CANCEL 5
/* event->type */
#define EVT_BUT_OPEN 0x5021
diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h
index 15a38251795..c9e5d294853 100644
--- a/source/blender/windowmanager/wm_files.h
+++ b/source/blender/windowmanager/wm_files.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/windowmanager/wm_files.h
+ * \ingroup wm
+ */
+
#ifndef WM_FILES_H
#define WM_FILES_H
-extern void read_history(void);
-extern void delete_autosave(void);
-
+void WM_read_history(void);
#endif /* WM_FILES_H */
diff --git a/source/blender/windowmanager/wm_subwindow.h b/source/blender/windowmanager/wm_subwindow.h
index 9cabf2fdc7c..e0901ee24aa 100644
--- a/source/blender/windowmanager/wm_subwindow.h
+++ b/source/blender/windowmanager/wm_subwindow.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/wm_subwindow.h
+ * \ingroup wm
+ */
+
+
#ifndef WM_SUBWINDOW_H
#define WM_SUBWINDOW_H
diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h
index d57fd0e75d8..f28f1ef0fcc 100644
--- a/source/blender/windowmanager/wm_window.h
+++ b/source/blender/windowmanager/wm_window.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/windowmanager/wm_window.h
+ * \ingroup wm
+ */
+
+
#ifndef WM_WINDOW_H
#define WM_WINDOW_H
@@ -43,9 +48,9 @@ void wm_window_free (bContext *C, wmWindowManager *wm, wmWindow *win);
void wm_window_close (bContext *C, wmWindowManager *wm, wmWindow *win);
void wm_window_title (wmWindowManager *wm, wmWindow *win);
-void wm_window_add_ghostwindows (wmWindowManager *wm);
+void wm_window_add_ghostwindows (bContext *C, wmWindowManager *wm);
void wm_window_process_events (const bContext *C);
-void wm_window_process_events_nosleep(const bContext *C);
+void wm_window_process_events_nosleep(void);
void wm_window_make_drawable(bContext *C, wmWindow *win);
@@ -55,7 +60,6 @@ void wm_window_set_size (wmWindow *win, int width, int height);
void wm_window_get_size (wmWindow *win, int *width_r, int *height_r);
void wm_window_get_size_ghost (wmWindow *win, int *width_r, int *height_r);
void wm_window_get_position (wmWindow *win, int *posx_r, int *posy_r);
-void wm_window_set_title (wmWindow *win, char *title);
void wm_window_swap_buffers (wmWindow *win);
void wm_get_cursor_position (wmWindow *win, int *x, int *y);
@@ -65,8 +69,8 @@ wmWindow *wm_window_copy (bContext *C, wmWindow *winorig);
void wm_window_testbreak (void);
/* *************** window operators ************** */
-int wm_window_duplicate_op (bContext *C, struct wmOperator *op);
-int wm_window_fullscreen_toggle_op(bContext *C, struct wmOperator *op);
+int wm_window_duplicate_exec(bContext *C, struct wmOperator *op);
+int wm_window_fullscreen_toggle_exec(bContext *C, struct wmOperator *op);
#endif /* WM_WINDOW_H */
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index 8fcea674ebb..4bc4931cfb4 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,52 +25,60 @@
#
# ***** END GPL LICENSE BLOCK *****
-MESSAGE(STATUS "Configuring blenderplayer")
+# message(STATUS "Configuring blenderplayer")
-SETUP_LIBDIRS()
+setup_libdirs()
-IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_CODEC_QUICKTIME)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- ADD_DEFINITIONS(-DWITH_BINRELOC)
- INCLUDE_DIRECTORIES(${BINRELOC_INC})
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
-
-ADD_CUSTOM_COMMAND(
+add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c
COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/
DEPENDS ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna
)
-IF(WIN32)
- ADD_EXECUTABLE(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../icons/winblender.rc)
-ELSE(WIN32)
- ADD_EXECUTABLE(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c)
-ENDIF(WIN32)
+if(WIN32 AND NOT UNIX)
+ add_executable(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../icons/winblender.rc)
+else()
+ add_executable(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c)
+endif()
-ADD_DEPENDENCIES(blenderplayer makesdna)
+add_dependencies(blenderplayer makesdna)
-FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
+get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
-SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} gp_common gp_ghost blenkernel_blc)
+list(APPEND BLENDER_LINK_LIBS
+ ge_player_common
+ ge_player_ghost
+ blenkernel_blc
+)
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ list(APPEND BLENDER_LINK_LIBS extern_binreloc)
+endif()
-IF(UNIX)
+if(UNIX)
# Sort libraries
+<<<<<<< .working
SET(BLENDER_SORTED_LIBS
gp_ghost
gp_common
bf_intern_string
bf_intern_ghost
+=======
+ set(BLENDER_SORTED_LIBS
+ ge_player_ghost
+ ge_player_common
+ bf_intern_string
+ bf_intern_ghost
+>>>>>>> .merge-right.r35190
bf_rna
bf_blenkernel
bf_blenloader
bf_blenpluginapi
+<<<<<<< .working
bf_blroutines
bf_converter
bf_ketsji
@@ -85,64 +94,108 @@ IF(UNIX)
bf_intern_itasc
bf_intern_ik
bf_intern_smoke
+=======
+ ge_blen_routines
+ bf_editor_datafiles
+ ge_converter
+ ge_logic_ketsji
+ ge_phys_bullet
+ ge_phys_dummy
+ ge_phys_common
+ ge_logic
+ ge_rasterizer
+ ge_oglrasterizer
+ ge_logic_expressions
+ ge_scenegraph
+ bf_ikplugin
+ bf_intern_itasc
+ bf_intern_ik
+ bf_intern_smoke
+>>>>>>> .merge-right.r35190
bf_modifiers
+<<<<<<< .working
bf_intern_moto
bf_kernel
+=======
+ bf_intern_moto
+ bf_gen_system
+>>>>>>> .merge-right.r35190
bf_nodes
bf_gpu
bf_imbuf
bf_avi
- kx_network
- bf_ngnetwork
- bf_loopbacknetwork
+ ge_logic_network
+ ge_logic_ngnetwork
+ ge_logic_loopbacknetwork
extern_bullet
bf_intern_guardedalloc
bf_intern_memutil
bf_python
bf_python_ext
bf_blenlib
+<<<<<<< .working
bf_cineon
bf_openexr
extern_openjpeg
bf_dds
+=======
+ bf_imbuf_cineon
+ bf_imbuf_openexr
+ extern_openjpeg
+ bf_imbuf_dds
+>>>>>>> .merge-right.r35190
bf_readblenfile
bf_dna
- bf_videotex
+ ge_videotex
bf_blenfont
bf_intern_audaspace
blenkernel_blc
extern_binreloc
extern_glew
+ extern_minilzo
+ bf_intern_ghost # duplicate for linking
+ bf_blenkernel # duplicate for linking
+ bf_intern_mikktspace
)
-
- IF(WITH_QUICKTIME)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_quicktime)
- ENDIF(WITH_QUICKTIME)
+<<<<<<< .working
IF(WITH_CXX_GUARDEDALLOC)
SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
ENDIF(WITH_CXX_GUARDEDALLOC)
-
- FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
- SET(REMLIB ${SORTLIB})
- FOREACH(SEARCHLIB ${BLENDER_LINK_LIBS})
- IF(${SEARCHLIB} STREQUAL ${SORTLIB})
- SET(REMLIB "")
- ENDIF(${SEARCHLIB} STREQUAL ${SORTLIB})
- ENDFOREACH(SEARCHLIB)
- IF(REMLIB)
- MESSAGE(STATUS "Removing library ${REMLIB} from blenderplayer linking because: not configured")
- LIST(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
- ENDIF(REMLIB)
- ENDFOREACH(SORTLIB)
-
- TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_SORTED_LIBS})
-ELSE(UNIX)
- TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_LINK_LIBS})
-ENDIF(UNIX)
-
-IF(WITH_PLAYER)
- ADD_SUBDIRECTORY(bad_level_call_stubs)
-ENDIF(WITH_PLAYER)
-
-SETUP_LIBLINKS(blenderplayer)
+=======
+ if(WITH_CODEC_QUICKTIME)
+ list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
+ endif()
+>>>>>>> .merge-right.r35190
+
+ if(WITH_CXX_GUARDEDALLOC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
+ endif()
+
+ foreach(SORTLIB ${BLENDER_SORTED_LIBS})
+ set(REMLIB ${SORTLIB})
+ foreach(SEARCHLIB ${BLENDER_LINK_LIBS})
+ if(${SEARCHLIB} STREQUAL ${SORTLIB})
+ set(REMLIB "")
+ endif()
+ endforeach()
+ if(REMLIB)
+ # message(STATUS "Removing library ${REMLIB} from blenderplayer linking because: not configured")
+ list(APPEND REM_MSG ${REMLIB})
+ list(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
+ endif()
+ endforeach()
+ if(REM_MSG)
+ list(SORT REM_MSG)
+ message(STATUS "Player Skipping: (${REM_MSG})")
+ endif()
+ target_link_libraries(blenderplayer ${BLENDER_SORTED_LIBS})
+else()
+ target_link_libraries(blenderplayer ${BLENDER_LINK_LIBS})
+endif()
+
+if(WITH_PLAYER)
+ add_subdirectory(bad_level_call_stubs)
+endif()
+
+setup_liblinks(blenderplayer)
diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
index 2449c8050ba..73fa01ebff2 100644
--- a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
+++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
@@ -24,27 +24,36 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC stubs.c)
+# this warning on generated files gets annoying
+remove_strict_flags()
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DBUILD_DATE)
- FILE(GLOB SRC ${SRC} ../../creator/buildinfo.c)
-ENDIF(WITH_BUILDINFO)
-
-SET(INC
+set(INC
.
..
../../../intern/guardedalloc
../../../source/blender/makesdna
- ../../../source/blender/makesrna
+ ../../../source/blender/blenloader
+ ../../../source/blender/makesrna
+ ../../../source/blender/blenkernel
+)
+
+set(SRC
+ stubs.c
)
-IF(WITH_GAMEENGINE)
- ADD_DEFINITIONS(-DGAMEBLENDER)
-ENDIF(WITH_GAMEENGINE)
+if(WITH_BUILDINFO)
+ add_definitions(-DBUILD_DATE)
+ list(APPEND SRC
+ ../../creator/buildinfo.c
+ )
+endif()
+
+if(WITH_GAMEENGINE)
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(WITH_INTERNATIONAL)
- ADD_DEFINITIONS(-DWITH_FREETYPE2)
-ENDIF(WITH_INTERNATIONAL)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DWITH_FREETYPE2)
+endif()
-BLENDERLIB_NOLIST(blenkernel_blc "${SRC}" "${INC}")
+blender_add_lib_nolist(blenkernel_blc "${SRC}" "${INC}")
diff --git a/source/blenderplayer/bad_level_call_stubs/Makefile b/source/blenderplayer/bad_level_call_stubs/Makefile
deleted file mode 100644
index 49efd08c710..00000000000
--- a/source/blenderplayer/bad_level_call_stubs/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blenkernel_blc
-DIR = $(OCGDIR)/blenderplayer/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-CFLAGS += $(FIX_STUBS_WARNINGS)
-
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I../../source/blender/makesdna
-CPPFLAGS += -I../../source/blender/makesrna
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
diff --git a/source/blenderplayer/bad_level_call_stubs/SConscript b/source/blenderplayer/bad_level_call_stubs/SConscript
index a35375f2980..5efe9aa5761 100644
--- a/source/blenderplayer/bad_level_call_stubs/SConscript
+++ b/source/blenderplayer/bad_level_call_stubs/SConscript
@@ -6,12 +6,13 @@ sources = 'stubs.c'
incs = '#/intern/guardedalloc'
incs += ' #/source/blender/makesdna'
incs += ' #/source/blender/makesrna'
+incs += ' #/source/blender/blenloader'
defs = ''
if env['WITH_BF_INTERNATIONAL']:
defs += 'WITH_FREETYPE2'
if env['WITH_BF_GAMEENGINE']:
- defs += ' GAMEBLENDER=1'
+ defs += ' WITH_GAMEENGINE'
env.BlenderLib ('blenkernel_blc', sources = Split(sources), includes=Split(incs), defines=Split(defs), libtype=['player'],priority=[220] )
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 7d63d1e07af..292e9ddd1ff 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,7 +28,12 @@
* BKE_bad_level_calls function stubs
*/
-#if GAMEBLENDER == 1
+/** \file blenderplayer/bad_level_call_stubs/stubs.c
+ * \ingroup blc
+ */
+
+
+#ifdef WITH_GAMEENGINE
#include <stdlib.h>
#include "DNA_listBase.h"
#include "RNA_types.h"
@@ -42,6 +47,7 @@ struct CSG_FaceIteratorDescriptor;
struct CSG_VertexIteratorDescriptor;
struct ColorBand;
struct CurveMapping;
+struct Curve;
struct EditBone;
struct EditFace;
struct EditMesh;
@@ -88,6 +94,7 @@ struct wmKeyMap;
struct wmOperator;
struct wmWindowManager;
struct View3D;
+struct ToolSettings;
/*new render funcs */
@@ -105,6 +112,7 @@ void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, flo
/* texture.c */
int multitex_thread(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output) {return 0;}
int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres){return 0;}
+int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres){return 0;}
int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex) {return 0;}
/* nodes */
@@ -112,10 +120,8 @@ struct RenderResult *RE_GetResult(struct Render *re){return (struct RenderResult
struct Render *RE_GetRender(const char *name){return (struct Render *) NULL;}
/* blenkernel */
-char* btempdir(){return (char *) NULL;}
+char btempdir[] = "";
void RE_FreeRenderResult(struct RenderResult *res){}
-char* datatoc_bmonofont_ttf(){return (char *) NULL;}
-int datatoc_bmonofont_ttf_size(){return 0;}
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty){return (struct RenderResult *) NULL;}
void RE_GetResultImage(struct Render *re, struct RenderResult *rr){}
int RE_RenderInProgress(struct Render *re){return 0;}
@@ -139,6 +145,7 @@ void WM_menutype_free(void){}
void WM_menutype_freelink(struct MenuType* mt){}
int WM_menutype_add(struct MenuType *mt) {return 0;}
int WM_operator_props_dialog_popup (struct bContext *C, struct wmOperator *op, int width, int height){return 0;}
+int WM_operator_confirm(struct bContext *C, struct wmOperator *op, struct wmEvent *event){return 0;}
struct MenuType *WM_menutype_find(const char *idname, int quiet){return (struct MenuType *) NULL;}
void WM_operator_stack_clear(struct bContext *C) {}
@@ -162,6 +169,7 @@ void ED_node_composit_default(struct Scene *sce){}
void *ED_region_draw_cb_activate(struct ARegionType *art, void(*draw)(const struct bContext *, struct ARegion *, void *), void *custumdata, int type){return 0;} /* XXX this one looks weird */
void *ED_region_draw_cb_customdata(void *handle){return 0;} /* XXX This one looks wrong also */
void ED_region_draw_cb_exit(struct ARegionType *art, void *handle){}
+void ED_area_headerprint(struct ScrArea *sa, char *str){}
struct EditBone *ED_armature_bone_get_mirrored(struct ListBase *edbo, struct EditBone *ebo){return (struct EditBone *) NULL;}
struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, char *name){return (struct EditBone*) NULL;}
@@ -172,6 +180,7 @@ int ED_pose_channel_in_IK_chain(struct Object *ob, struct bPoseChannel *pchan){r
int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit){return 0;}
int ED_space_image_show_render(struct SpaceImage *sima){return 0;}
int ED_space_image_show_paint(struct SpaceImage *sima){return 0;}
+void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings){}
void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima){return (struct ImBuf *) NULL;}
void ED_screen_set_scene(struct bContext *C, struct Scene *scene){}
@@ -204,7 +213,7 @@ struct KeyingSetInfo *ANIM_keyingset_info_find_named (const char name[]){return
struct KeyingSet *ANIM_scene_get_active_keyingset (struct Scene *scene){return (struct KeyingSet *) NULL;}
int ANIM_scene_get_keyingset_index(struct Scene *scene, struct KeyingSet *ks){return 0;}
struct ListBase builtin_keyingsets;
-void ANIM_keyingset_info_register (const struct bContext *C, struct KeyingSetInfo *ksi){}
+void ANIM_keyingset_info_register (struct KeyingSetInfo *ksi){}
void ANIM_keyingset_info_unregister (const struct bContext *C, struct KeyingSetInfo *ksi){}
short ANIM_add_driver(struct ID *id, const char rna_path[], int array_index, short flag, int type){return 0;}
short ANIM_remove_driver (struct ID *id, const char rna_path[], int array_index, short flag){return 0;}
@@ -214,11 +223,12 @@ char *ED_info_stats_string(struct Scene *scene){return (char *) NULL;}
void ED_area_tag_redraw(struct ScrArea *sa){}
void ED_area_tag_refresh(struct ScrArea *sa){}
void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type){}
+void ED_region_tag_redraw(struct ARegion *ar){}
void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op){}
void WM_cursor_wait (int val) {}
void ED_node_texture_default(struct Tex *tx){}
void ED_node_changed_update(struct bContext *C, struct bNode *node){}
-void ED_node_generic_update(struct Main *bmain, struct Scene *scene, struct bNodeTree *ntree, struct bNode *node){}
+void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node){}
void ED_view3d_scene_layers_update(struct Main *bmain, struct Scene *scene){}
int ED_view3d_scene_layer_set(int lay, const int *values){return 0;}
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar){}
@@ -253,11 +263,16 @@ void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count)
void ED_mesh_faces_add(struct Mesh *mesh, struct ReportList *reports, int count){}
void ED_mesh_material_link(struct Mesh *mesh, struct Material *ma){}
int ED_mesh_color_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;}
-int ED_mesh_uv_texture_add(struct bContext *C, struct Scene *scene, struct Object *ob, struct Mesh *me){return 0;}
+int ED_mesh_uv_texture_add(struct bContext *C, struct Mesh *me){return 0;}
void ED_object_constraint_dependency_update(struct Scene *scene, struct Object *ob){}
void ED_object_constraint_update(struct Object *ob){}
struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name){return (struct bDeformGroup *) NULL;}
void ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum, float weight, int assignmode){}
+void ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
+void ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum){}
+void ED_vgroup_delete(struct Object *ob, struct bDeformGroup *defgroup){}
+void ED_vgroup_object_is_edit_mode(struct Object *ob){}
+
void ED_sequencer_update_view(struct bContext *C, int view){}
float ED_rollBoneToVector(struct EditBone *bone, float new_up_axis[3]){return 0.0f;}
void ED_space_image_size(struct SpaceImage *sima, int *width, int *height){}
@@ -286,6 +301,8 @@ struct uiLayout *uiLayoutColumn(struct uiLayout *layout, int align){return (stru
struct uiLayout *uiLayoutColumnFlow(struct uiLayout *layout, int number, int align){return (struct uiLayout *) NULL;}
struct uiLayout *uiLayoutBox(struct uiLayout *layout){return (struct uiLayout *) NULL;}
struct uiLayout *uiLayoutSplit(struct uiLayout *layout, float percentage, int align){return (struct uiLayout *) NULL;}
+int uiLayoutGetRedAlert(struct uiLayout *layout){return 0;}
+void uiLayoutSetRedAlert(struct uiLayout *layout, int redalert){}
void uiItemsEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname){}
void uiItemMenuEnumR(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *name, int icon){}
void uiItemEnumR_string(struct uiLayout *layout, struct PointerRNA *ptr, char *propname, char *value, char *name, int icon){}
@@ -312,7 +329,7 @@ void uiTemplateHeader(struct uiLayout *layout, struct bContext *C, int menus){}
void uiTemplateID(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *unlinkop){}
struct uiLayout *uiTemplateModifier(struct uiLayout *layout, struct PointerRNA *ptr){return (struct uiLayout *) NULL;}
struct uiLayout *uiTemplateConstraint(struct uiLayout *layout, struct PointerRNA *ptr){return (struct uiLayout *) NULL;}
-void uiTemplatePreview(struct uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot){}
+void uiTemplatePreview(struct uiLayout *layout, struct ID *id, int show_buttons, struct ID *parent, struct MTex *slot){}
void uiTemplateIDPreview(struct uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop, int rows, int cols){}
void uiTemplateCurveMapping(struct uiLayout *layout, struct CurveMapping *cumap, int type, int compact){}
void uiTemplateColorRamp(struct uiLayout *layout, struct ColorBand *coba, int expand){}
@@ -354,10 +371,12 @@ struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *
int WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports){return 0;}
int WM_operatortype_remove(const char *idname){return 0;}
int WM_operator_poll(struct bContext *C, struct wmOperatorType *ot){return 0;}
+int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context){return 0;}
int WM_operator_props_popup(struct bContext *C, struct wmOperator *op, struct wmEvent *event){return 0;}
void WM_operator_properties_free(struct PointerRNA *ptr){}
void WM_operator_properties_create(struct PointerRNA *ptr, const char *opstring){}
void WM_operator_properties_create_ptr(struct PointerRNA *ptr, struct wmOperatorType *ot){}
+void WM_operator_properties_sanitize(struct PointerRNA *ptr, const short no_context){};
void WM_operatortype_append_ptr(void (*opfunc)(struct wmOperatorType*, void*), void *userdata){}
void WM_operatortype_append_macro_ptr(void (*opfunc)(struct wmOperatorType*, void*), void *userdata){}
void WM_operator_bl_idname(char *to, const char *from){}
@@ -369,45 +388,6 @@ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct
struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value){return (struct wmKeyMapItem *)NULL;}
struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return (struct wmKeyMap *) NULL;}
-/* intern/decimation */
-int LOD_FreeDecimationData(struct LOD_Decimation_Info *info){return 0;}
-int LOD_CollapseEdge(struct LOD_Decimation_Info *info){return 0;}
-int LOD_PreprocessMesh(struct LOD_Decimation_Info *info){return 0;}
-int LOD_LoadMesh(struct LOD_Decimation_Info *info){return 0;}
-
-/* smoke */
-void LzmaCompress(void) { return; }
-void LzmaUncompress(void) {return;}
-/* smoke is included anyway
-void smoke_export(void) {return;}
-void smoke_init(void) {return;}
-void smoke_turbulence_init(void) {return;}
-void smoke_turbulence_initBlenderRNA(void) {return;}
-void smoke_initBlenderRNA(void) {return;}
-void smoke_free(void) {return;}
-void smoke_turbulence_free(void) {return;}
-void smoke_turbulence_step(void) {return;}
-void smoke_dissolve(void) {return;}
-void smoke_get_density(void) {return;}
-void smoke_get_heat(void) {return;}
-void smoke_get_velocity_x(void) {return;}
-void smoke_get_velocity_y(void) {return;}
-void smoke_get_velocity_z(void) {return;}
-void smoke_get_obstacle(void) {return;}
-void smoke_get_index(void) {return;}
-void smoke_step(void) {return;}
-*/
-
-/* sculpt */
-/*
- void ED_sculpt_force_update(struct bContext *C) {}
-struct SculptUndoNode *sculpt_undo_push_node(struct SculptSession *ss, struct PBVHNode *node) {return (struct SculptUndoNode *)NULL;}
-void sculpt_undo_push_end(void) {}
-void sculpt_undo_push_begin(char *name) {}
-struct SculptUndoNode *sculpt_undo_get_node(struct PBVHNode *node) {return (struct SculptUndoNode *) NULL;}
-struct MultiresModifierData *sculpt_multires_active(struct Scene *scene, struct Object *ob) {return (struct MultiresModifierData *) NULL;}
-int sculpt_modifiers_active(struct Scene *scene, struct Object *ob) {return 0;}
-*/
int sculpt_get_brush_size(struct Brush *brush) {return 0;}
void sculpt_set_brush_size(struct Brush *brush, int size) {}
int sculpt_get_lock_brush_size(struct Brush *brush){ return 0;}
@@ -415,28 +395,8 @@ float sculpt_get_brush_unprojected_radius(struct Brush *brush){return 0.0f;}
void sculpt_set_brush_unprojected_radius(struct Brush *brush, float unprojected_radius){}
float sculpt_get_brush_alpha(struct Brush *brush){return 0.0f;}
void sculpt_set_brush_alpha(struct Brush *brush, float alpha){}
+void ED_sculpt_modifiers_changed(struct Object *ob){};
char blender_path[] = "";
-/* CSG */
-struct CSG_BooleanOperation * CSG_NewBooleanFunction( void ){return (struct CSG_BooleanOperation *) NULL;}
-void CSG_FreeBooleanOperation(struct CSG_BooleanOperation *operation){return;}
-void CSG_FreeFaceDescriptor(struct CSG_FaceIteratorDescriptor * f_descriptor){return;}
-void CSG_FreeVertexDescriptor(struct CSG_VertexIteratorDescriptor * v_descriptor){return;}
-int CSG_OutputFaceDescriptor(struct CSG_BooleanOperation * operation, struct CSG_FaceIteratorDescriptor * output){return 0;}
-int CSG_OutputVertexDescriptor(struct CSG_BooleanOperation * operation, struct CSG_VertexIteratorDescriptor *output){return 0;}
-
-typedef struct CSG_VertexIteratorDescriptor {int a;} CSG_VertexIteratorDescriptor; //workaround to build CSG_PerformanceBoolean Operation
-typedef struct CSG_FaceIteratorDescriptor {int a;} CSG_FaceIteratorDescriptor; //workaround to build CSG_PerformanceBoolean Operation
-typedef struct CSG_OperationType {int a;} CSG_OperationType; //workaround to build CSG_PerformanceBoolean Operation
-
-int CSG_PerformBooleanOperation(
- struct CSG_BooleanOperation *operation,
- CSG_OperationType op_type,
- CSG_FaceIteratorDescriptor obAFaces,
- CSG_VertexIteratorDescriptor obAVertices,
- CSG_FaceIteratorDescriptor obBFaces,
- CSG_VertexIteratorDescriptor obBVertices)
- { return 0;}
-
-#endif // GAMEBLENDER == 1
+#endif // WITH_GAMEENGINE
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index 0ce02926e0d..e9faa1c0669 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -25,14 +26,15 @@
# ***** END GPL LICENSE BLOCK *****
# So BUILDINFO and BLENDERPATH strings are automatically quoted
-CMAKE_POLICY(SET CMP0005 NEW)
+cmake_policy(SET CMP0005 NEW)
-SETUP_LIBDIRS()
+setup_libdirs()
-INCLUDE_DIRECTORIES(
+blender_include_dirs(
../../intern/guardedalloc
../blender/blenlib
../blender/blenkernel
+ ../blender/blenloader
../blender/editors/include
../blender/makesrna
../blender/imbuf
@@ -40,124 +42,188 @@ INCLUDE_DIRECTORIES(
../blender/makesdna
../blender/gpu
../blender/windowmanager
- ../kernel/gen_messaging
- ../kernel/gen_system
../blender/bmesh
)
-IF(WIN32)
- INCLUDE_DIRECTORIES(${PTHREADS_INC})
-ENDIF(WIN32)
+if(WITH_CODEC_QUICKTIME)
+ add_definitions(-DWITH_QUICKTIME)
+endif()
-IF(WITH_QUICKTIME)
- ADD_DEFINITIONS(-DWITH_QUICKTIME)
-ENDIF(WITH_QUICKTIME)
+if(WITH_IMAGE_OPENEXR)
+ add_definitions(-DWITH_OPENEXR)
+endif()
-IF(WITH_IMAGE_OPENEXR)
- ADD_DEFINITIONS(-DWITH_OPENEXR)
-ENDIF(WITH_IMAGE_OPENEXR)
+if(WITH_IMAGE_OPENJPEG)
+ add_definitions(-DWITH_OPENJPEG)
+endif()
-IF(WITH_IMAGE_TIFF)
- ADD_DEFINITIONS(-DWITH_TIFF)
-ENDIF(WITH_IMAGE_TIFF)
+if(WITH_IMAGE_TIFF)
+ add_definitions(-DWITH_TIFF)
+endif()
-IF(WITH_IMAGE_DDS)
- ADD_DEFINITIONS(-DWITH_DDS)
-ENDIF(WITH_IMAGE_DDS)
+if(WITH_IMAGE_DDS)
+ add_definitions(-DWITH_DDS)
+endif()
-IF(WITH_IMAGE_CINEON)
- ADD_DEFINITIONS(-DWITH_CINEON)
-ENDIF(WITH_IMAGE_CINEON)
+if(WITH_IMAGE_CINEON)
+ add_definitions(-DWITH_CINEON)
+endif()
-IF(WITH_IMAGE_HDR)
- ADD_DEFINITIONS(-DWITH_HDR)
-ENDIF(WITH_IMAGE_HDR)
+if(WITH_IMAGE_HDR)
+ add_definitions(-DWITH_HDR)
+endif()
-IF(WITH_PYTHON)
- INCLUDE_DIRECTORIES(../blender/python)
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_PYTHON)
+ blender_include_dirs(../blender/python)
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(NOT WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(NOT WITH_SDL)
+if(WITH_GAMEENGINE)
+ blender_include_dirs(
+ ../kernel/gen_messaging
+ ../kernel/gen_system
+ )
+
+ add_definitions(-DWITH_GAMEENGINE)
+endif()
-IF(UNIX AND NOT APPLE)
- SET(BLENDERPATH ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION})
- # blender_path in creator.c
- ADD_DEFINITIONS(-DBLENDERPATH="${BLENDERPATH}")
-ENDIF(UNIX AND NOT APPLE)
+if(NOT WITH_SDL)
+ add_definitions(-DDISABLE_SDL)
+endif()
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- ADD_DEFINITIONS(-DWITH_BINRELOC)
- INCLUDE_DIRECTORIES(${BINRELOC_INC})
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
+if(WITH_BINRELOC)
+ add_definitions(-DWITH_BINRELOC)
+ blender_include_dirs(${BINRELOC_INC})
+endif()
# Setup the exe sources and buildinfo
-SET(EXESRC creator.c)
-
-IF(WIN32)
- SET(EXESRC ${EXESRC} ../icons/winblender.rc)
-ENDIF(WIN32)
-
-IF(WITH_BUILDINFO)
- ADD_DEFINITIONS(-DBUILD_DATE="${BUILD_DATE}")
- ADD_DEFINITIONS(-DBUILD_TIME="${BUILD_TIME}")
- ADD_DEFINITIONS(-DBUILD_REV="${BUILD_REV}")
- ADD_DEFINITIONS(-DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}")
- ADD_DEFINITIONS(-DBUILD_TYPE="${CMAKE_BUILD_TYPE}")
-
- SET(EXESRC ${EXESRC} buildinfo.c)
-ENDIF(WITH_BUILDINFO)
+set(SRC
+ creator.c
+)
+
+if(WIN32 AND NOT UNIX)
+ list(APPEND SRC
+ ../icons/winblender.rc
+ )
+endif()
+
+if(WITH_BUILDINFO)
+ # --------------------------------------------------------------------------
+ # These defines could all be moved into the header below
+ string(REPLACE " " "\ " BUILDINFO_CFLAGS "${CMAKE_C_FLAGS}")
+ string(REPLACE " " "\ " BUILDINFO_CXXFLAGS "${CMAKE_CXX_FLAGS}")
+ string(REPLACE " " "\ " BUILDINFO_LINKFLAGS "${PLATFORM_LINKFLAGS}")
+ add_definitions(
+ # # define in header now, else these get out of date on rebuilds.
+ # -DBUILD_DATE="${BUILD_DATE}"
+ # -DBUILD_TIME="${BUILD_TIME}"
+ # -DBUILD_REV="${BUILD_REV}"
+ -DWITH_BUILDINFO_HEADER # alternative to lines above
+ -DBUILD_PLATFORM="${CMAKE_SYSTEM_NAME}"
+ -DBUILD_TYPE="${CMAKE_BUILD_TYPE}"
+ -DBUILD_CFLAGS="${BUILDINFO_CFLAGS}"
+ -DBUILD_CXXFLAGS="${BUILDINFO_CXXFLAGS}"
+ -DBUILD_LINKFLAGS="${BUILDINFO_LINKFLAGS}"
+ -DBUILD_SYSTEM="CMake"
+ )
+
+ # --------------------------------------------------------------------------
+ # write header for values that change each build
+ # note, generaed file is in build dir's source/creator
+ # except when used as an include path.
+
+ # include the output directory, where the buildinfo.h file is generated
+ include_directories(${CMAKE_BINARY_DIR}/source/creator)
-MESSAGE(STATUS "Configuring blender")
+ # a custom target that is always built
+ add_custom_target(buildinfo ALL
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/buildinfo.h)
-ADD_EXECUTABLE(blender ${EXETYPE} ${EXESRC})
+ # creates svnheader.h using cmake script
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/buildinfo.h
+ COMMAND ${CMAKE_COMMAND}
+ -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
+ -P ${CMAKE_SOURCE_DIR}/build_files/cmake/buildinfo.cmake)
+
+ # buildinfo.h is a generated file
+ set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/buildinfo.h
+ PROPERTIES GENERATED TRUE
+ HEADER_FILE_ONLY TRUE)
+
+ # add deps below, after adding blender
+ # -------------- done with header values.
+
+ list(APPEND SRC
+ buildinfo.c
+ )
+endif()
+
+# message(STATUS "Configuring blender")
+if(WITH_PYTHON_MODULE)
+ add_definitions(-DWITH_PYTHON_MODULE)
+
+ # creates ./bin/bpy.so which can be imported as a python module.
+ add_library(blender SHARED ${SRC})
+ set_target_properties(
+ blender
+ PROPERTIES
+ PREFIX ""
+ OUTPUT_NAME bpy
+ LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/
+ )
+else()
+ add_executable(blender ${EXETYPE} ${SRC})
+endif()
+
+if(WITH_BUILDINFO)
+ # explicitly say that the executable depends on the buildinfo
+ add_dependencies(blender buildinfo)
+endif()
# Post build steps for bundling/packaging.
-SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
+set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
+if(WITH_INSTALL)
- IF(UNIX)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(UNIX)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
#COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/plugins ${TARGETDIR}/
#COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/text/* ${TARGETDIR}/
)
- ENDIF(UNIX)
- IF(UNIX AND NOT APPLE)
+ endif()
+ if(UNIX AND NOT APPLE)
# Local installation, "make install" can be done after this optionally
- ADD_CUSTOM_COMMAND(
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND rm -Rf ${TARGETDIR}/${BLENDER_VERSION}
COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/${BLENDER_VERSION}/
)
-
- IF(WITH_INTERNATIONAL)
- ADD_CUSTOM_COMMAND(
+
+ if(WITH_INTERNATIONAL)
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/${BLENDER_VERSION}/
)
- ENDIF(WITH_INTERNATIONAL)
-
- IF(WITH_PYTHON)
- ADD_CUSTOM_COMMAND(
+ endif()
+
+ if(WITH_PYTHON)
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMENT "copying blender scripts..."
COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/${BLENDER_VERSION}/
COMMAND find ${TARGETDIR} -name "*.py?" -prune -exec rm -rf {} "\;"
)
- IF(WITH_PYTHON_INSTALL)
+ if(WITH_PYTHON_INSTALL)
# Copy the systems python into the install directory
# Scons copy in tools/Blender.py
- ADD_CUSTOM_COMMAND(
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMENT "copying a subset of the systems python..."
COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python # PYTHONPATH and PYTHONHOME is set here
@@ -171,320 +237,336 @@ SET(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/config
COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages
- COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
+ COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
COMMAND rm -f ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/lib-dynload/_tkinter.so
COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "test" -prune -exec rm -rf {} "\;"
COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
)
- ENDIF(WITH_PYTHON_INSTALL)
- ENDIF(WITH_PYTHON)
-
- ADD_CUSTOM_COMMAND(
+ endif()
+ endif()
+
+ add_custom_command(
TARGET blender POST_BUILD MAIN_DEPENDENCY blender
COMMAND find ${TARGETDIR} -name .svn -prune -exec rm -rf {} "\;"
)
-
-
+
+
# Above we bundle a portable distribution in ./bin
# This is an optional "make install" which installs blender on the system.
- INSTALL(
+ install(
PROGRAMS ${TARGETDIR}/blender
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- IF(WITH_GAMEENGINE AND WITH_PLAYER)
- INSTALL(
+ if(WITH_GAMEENGINE AND WITH_PLAYER)
+ install(
PROGRAMS ${TARGETDIR}/blenderplayer
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- ENDIF(WITH_GAMEENGINE AND WITH_PLAYER)
-
- INSTALL(
- FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
- )
- INSTALL(
- FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
- )
- INSTALL(
+ endif()
+
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
+ )
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
+ )
+ install(
PROGRAMS ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
)
- INSTALL(
- FILES ${CMAKE_SOURCE_DIR}/doc/blender.1
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
- )
- INSTALL(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/blender
- PATTERN ".svn" EXCLUDE
- )
- INSTALL(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts/
- DESTINATION ${BLENDERPATH}/scripts
- PATTERN ".svn" EXCLUDE
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/man/man1
+ )
+ install(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/blender
+ PATTERN ".svn" EXCLUDE
+ )
+ install(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts/
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/scripts
+ PATTERN ".svn" EXCLUDE
PATTERN "*.pyc" EXCLUDE
- )
- INSTALL(
+ PATTERN "__pycache__" EXCLUDE
+ )
+ install(
DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/brushicons/
- DESTINATION ${BLENDERPATH}/datafiles/brushicons
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/brushicons
PATTERN ".svn" EXCLUDE
)
- IF(WITH_INTERNATIONAL)
- INSTALL(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
- DESTINATION ${BLENDERPATH}/datafiles/locale
- PATTERN ".svn" EXCLUDE
- )
- ENDIF(WITH_INTERNATIONAL)
-
- # end "make install"
-
- ENDIF(UNIX AND NOT APPLE)
- IF(APPLE)
- SET(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
- SET(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
- SET(TARGETINFO ${TARGETDIR}/blender.app/Contents/Info.plist)
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/
- COMMAND cat ${SOURCEINFO} | sed s/VERSION/`cat ${CMAKE_SOURCE_DIR}/release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO}
- COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- )
-
- IF(WITH_INTERNATIONAL)
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/datafiles/
+ if(WITH_INTERNATIONAL)
+ install(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
+ DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/locale
+ PATTERN ".svn" EXCLUDE
)
- ENDIF(WITH_INTERNATIONAL)
-
- IF(WITH_PYTHON)
- SET(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/
- COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/python/
- COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;"
- )
- ENDIF(WITH_PYTHON)
-
- ADD_CUSTOM_COMMAND(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name __MACOSX -prune -exec rm -rf {} "\;"
- )
- ENDIF(APPLE)
- IF(WIN32)
- ADD_CUSTOM_COMMAND(TARGET blender
+ endif()
+
+ # end "make install"
+
+ elseif(WIN32)
+ # notice 'xcopy /Y /H' on .bfont.ttf, this is needed when building over samba
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\"
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\"
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\"
COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
- COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
+ COMMAND xcopy /Y /H \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\plugins\\\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\\\"
)
-
- IF(CMAKE_CL_64)
+
+ if(CMAKE_CL_64)
# gettext and png are statically linked on win64
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
+ add_custom_command(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+ COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
+ COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
+ COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
+ )
+ else()
+ add_custom_command(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
+ COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+ )
+ endif()
+
+
+ if(MSVC)
+ add_custom_command(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
- # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\"
)
- ELSE(CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
- # COMMAND copy /Y \"${LIBDIR}\\samplerate\\lib\\libsamplerate-0.dll\" \"${TARGETDIR}\\\"
- )
- ENDIF(CMAKE_CL_64)
+ COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadGC2.dll\" \"${TARGETDIR}\\\"
+ )
+ endif()
- IF(WITH_PYTHON)
- IF(NOT CMAKE_BUILD_TYPE) # hack: with multi-configuration generator this is "", so for now copy both python31.dll/zip and python31_d.dll/zip
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_PYTHON)
+ # note, as far as python is concerned 'RelWithDebInfo' is not debug since its without debug flags.
+ if(NOT CMAKE_BUILD_TYPE) # hack: with multi-configuration generator this is "", so for now copy both python31.dll/zip and python31_d.dll/zip
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31_d.zip\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\"
+ COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\"
+ COMMAND if \"$(ConfigurationName)\" == \"\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Debug\" copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Debug\" xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Release\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"Release\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
+ COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ELSE(NOT CMAKE_BUILD_TYPE)
- IF(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ if(CMAKE_BUILD_TYPE STREQUAL Debug)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31_d.zip\" \"${TARGETDIR}\\\"
+ COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ELSE(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\release\\python31.zip\" \"${TARGETDIR}\\\"
+ COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
)
- ENDIF(CMAKE_BUILD_TYPE STREQUAL Debug OR CMAKE_BUILD_TYPE STREQUAL RelWithDebInfo)
- ENDIF(NOT CMAKE_BUILD_TYPE)
- ENDIF(WITH_PYTHON)
+ endif()
+ endif()
+ endif()
- IF(WITH_INTERNATIONAL)
- IF(CMAKE_CL_64)
+ if(WITH_INTERNATIONAL)
+ if(CMAKE_CL_64)
# iconv is statically linked on win64
- ADD_CUSTOM_COMMAND(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
+ add_custom_command(TARGET blender
+ POST_BUILD
+ MAIN_DEPENDENCY blender
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
)
- ELSE(CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ else()
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
+ COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
- )
- ENDIF(CMAKE_CL_64)
- ENDIF(WITH_INTERNATIONAL)
+ )
+ endif()
+ endif()
- IF(WITH_FFMPEG)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_CODEC_FFMPEG)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaac-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libfaad-2.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libmp3lame-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\libx264-67.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\xvidcore.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_FFMPEG)
+ endif()
- IF(WITH_SNDFILE)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_CODEC_SNDFILE)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_SNDFILE)
+ endif()
- IF(WITH_JACK)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_JACK)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_JACK)
+ endif()
- IF(WITH_OPENAL)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_OPENAL)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\"
COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(WITH_OPENAL)
+ endif()
- IF(WITH_SDL)
- IF(NOT CMAKE_CL_64)
- ADD_CUSTOM_COMMAND(TARGET blender
+ if(WITH_SDL)
+ if(NOT CMAKE_CL_64)
+ add_custom_command(TARGET blender
POST_BUILD
MAIN_DEPENDENCY blender
COMMAND copy /Y \"${LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
)
- ENDIF(NOT CMAKE_CL_64)
- ENDIF(WITH_SDL)
+ endif()
+ endif()
+
+ elseif(APPLE)
+ set(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
+ set(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
+ set(TARGETINFO ${TARGETDIR}/blender.app/Contents/Info.plist)
+
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp -Rf ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
+ COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/
+ COMMAND cat ${SOURCEINFO} | sed s/VERSION/${BLENDER_VERSION}${BLENDER_VERSION_CHAR}/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO}
+ COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ )
+
+ if(WITH_INTERNATIONAL)
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ )
+ endif()
+
+ if(WITH_PYTHON)
+ set(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/
+ COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
+ COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
+ COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;"
+ )
+ endif()
+
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
+ COMMAND find ${TARGETDIR}/blender.app -name __MACOSX -prune -exec rm -rf {} "\;"
+ )
+ endif()
- ENDIF(WIN32)
+endif()
-ADD_DEPENDENCIES(blender makesdna)
+add_dependencies(blender makesdna)
-FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS)
+get_property(BLENDER_LINK_LIBS GLOBAL PROPERTY BLENDER_LINK_LIBS)
-SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_render)
+set(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_render)
-IF(WITH_FLUID)
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_intern_elbeem)
-ENDIF(WITH_FLUID)
+if(WITH_MOD_FLUID)
+ list(APPEND BLENDER_LINK_LIBS bf_intern_elbeem)
+endif()
-IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
- SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc)
-ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
-#IF(UNIX)
+#if(UNIX)
# Sort libraries
- SET(BLENDER_SORTED_LIBS
+ set(BLENDER_SORTED_LIBS
bf_windowmanager
- bf_editor_space_api
- bf_editor_space_action
- bf_editor_space_buttons
- bf_editor_space_console
- bf_editor_space_file
- bf_editor_space_graph
- bf_editor_space_image
- bf_editor_space_info
- bf_editor_space_logic
- bf_editor_space_nla
- bf_editor_space_node
- bf_editor_space_outliner
- bf_editor_space_script
- bf_editor_space_sequencer
- bf_editor_space_sound
- bf_editor_space_time
- bf_editor_space_userpref
- bf_editor_space_view3d
-
- bf_editor_text
- bf_editor_transform
- bf_editor_util
- bf_editor_uvedit
- bf_editor_curve
- bf_editor_armature
- bf_editor_gpencil
- bf_editor_interface
- bf_editor_mesh
- bf_editor_metaball
- bf_editor_object
- bf_editor_physics
- bf_editor_render
- bf_editor_screen
- bf_editor_sculpt_paint
- bf_editor_sound
- bf_editor_animation
- bf_editor_datafiles
+ bf_editor_space_api
+ bf_editor_space_action
+ bf_editor_space_buttons
+ bf_editor_space_console
+ bf_editor_space_file
+ bf_editor_space_graph
+ bf_editor_space_image
+ bf_editor_space_info
+ bf_editor_space_logic
+ bf_editor_space_nla
+ bf_editor_space_node
+ bf_editor_space_outliner
+ bf_editor_space_script
+ bf_editor_space_sequencer
+ bf_editor_space_sound
+ bf_editor_space_time
+ bf_editor_space_userpref
+ bf_editor_space_view3d
+
+ bf_editor_text
+ bf_editor_transform
+ bf_editor_util
+ bf_editor_uvedit
+ bf_editor_curve
+ bf_editor_armature
+ bf_editor_gpencil
+ bf_editor_interface
+ bf_editor_mesh
+ bf_editor_metaball
+ bf_editor_object
+ bf_editor_physics
+ bf_editor_render
+ bf_editor_screen
+ bf_editor_sculpt_paint
+ bf_editor_sound
+ bf_editor_animation
+ bf_editor_datafiles
- bf_intern_bsp
bf_render
bf_intern_opennl
bf_python
@@ -502,83 +584,87 @@ ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
bf_blenpluginapi
bf_imbuf
bf_avi
- bf_cineon
- bf_openexr
- bf_dds
+ bf_imbuf_cineon
+ bf_imbuf_openexr
+ bf_imbuf_dds
bf_readblenfile
bf_collada
bf_intern_bsp
bf_intern_bop
- bf_kernel
+ bf_gen_system
bf_intern_decimate
bf_intern_elbeem
bf_intern_ik
bf_intern_memutil
bf_intern_guardedalloc
bf_intern_ctr
- bf_intern_moto
- bf_windowmanager
- bf_blroutines
- bf_converter
- bf_dummy
- bf_bullet
+ ge_blen_routines
+ ge_converter
+ ge_phys_dummy
+ ge_phys_bullet
bf_intern_smoke
extern_minilzo
extern_lzma
- bf_common
- bf_ketsji
- bf_logic
- bf_rasterizer
- bf_oglrasterizer
- bf_expressions
- bf_scenegraph
- bf_intern_moto
- bf_blroutines
- kx_network
- bf_kernel
- bf_ngnetwork
+ ge_logic_ketsji
+ ge_phys_common
+ ge_logic
+ ge_rasterizer
+ ge_oglrasterizer
+ ge_logic_expressions
+ ge_scenegraph
+ ge_logic_network
+ bf_gen_system
+ bf_python # duplicate for BPY_driver_exec
+ ge_logic_ngnetwork
extern_bullet
- bf_loopbacknetwork
- bf_intern_itasc
- bf_common
+ ge_logic_loopbacknetwork
bf_intern_moto
- bf_python
- bf_python_ext
- extern_binreloc
extern_glew
extern_openjpeg
- bf_videotex
+ extern_redcode
+ ge_videotex
bf_rna
bf_dna
bf_blenfont
bf_intern_audaspace
- bf_intern_decimate
-
+ bf_intern_mikktspace
)
- IF(WITH_CXX_GUARDEDALLOC)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
- ENDIF(WITH_CXX_GUARDEDALLOC)
-
- IF(WITH_QUICKTIME)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_quicktime)
- ENDIF(WITH_QUICKTIME)
-
-
- FOREACH(SORTLIB ${BLENDER_SORTED_LIBS})
- SET(REMLIB ${SORTLIB})
- FOREACH(SEARCHLIB ${BLENDER_LINK_LIBS})
- IF(${SEARCHLIB} STREQUAL ${SORTLIB})
- SET(REMLIB "")
- ENDIF(${SEARCHLIB} STREQUAL ${SORTLIB})
- ENDFOREACH(SEARCHLIB)
- IF(REMLIB)
- MESSAGE(STATUS "Removing library ${REMLIB} from blender linking because: not configured")
- LIST(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
- ENDIF(REMLIB)
- ENDFOREACH(SORTLIB)
- TARGET_LINK_LIBRARIES(blender ${BLENDER_SORTED_LIBS})
-#ELSE(UNIX)
-# TARGET_LINK_LIBRARIES(blender ${BLENDER_LINK_LIBS})
-#ENDIF(UNIX)
-
-SETUP_LIBLINKS(blender)
+ if(WITH_BINRELOC)
+ list(APPEND BLENDER_SORTED_LIBS extern_binreloc)
+ endif()
+
+ if(WITH_CXX_GUARDEDALLOC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
+ endif()
+
+ if(WITH_IK_ITASC)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_itasc)
+ endif()
+
+ if(WITH_CODEC_QUICKTIME)
+ list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
+ endif()
+
+ foreach(SORTLIB ${BLENDER_SORTED_LIBS})
+ set(REMLIB ${SORTLIB})
+ foreach(SEARCHLIB ${BLENDER_LINK_LIBS})
+ if(${SEARCHLIB} STREQUAL ${SORTLIB})
+ set(REMLIB "")
+ endif()
+ endforeach()
+ if(REMLIB)
+ # message(STATUS "Removing library ${REMLIB} from blender linking because: not configured")
+ list(APPEND REM_MSG ${REMLIB})
+ list(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB})
+ endif()
+ endforeach()
+ if(REM_MSG)
+ list(SORT REM_MSG)
+ message(STATUS "Blender Skipping: (${REM_MSG})")
+ endif()
+ target_link_libraries(blender ${BLENDER_SORTED_LIBS})
+#else()
+# target_link_libraries(blender ${BLENDER_LINK_LIBS})
+#endif()
+
+setup_liblinks(blender)
diff --git a/source/creator/Makefile b/source/creator/Makefile
deleted file mode 100644
index 08f732ad486..00000000000
--- a/source/creator/Makefile
+++ /dev/null
@@ -1,84 +0,0 @@
-# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*-
-# vim: tabstop=8
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): GSR
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-LIBNAME = creator
-DIR = $(OCGDIR)/creator
-
-# this HAS to go
-CSRCS = creator.c
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-CPPFLAGS += -I../blender/render/extern/include
-
-# two needed for the kernel
-CPPFLAGS += -I../blender/imbuf
-CPPFLAGS += -I../blender/makesdna
-CPPFLAGS += -I../blender/makesrna
-CPPFLAGS += -I../blender/blenlib
-CPPFLAGS += -I../blender/editors/include
-CPPFLAGS += -I../blender/renderconverter
-CPPFLAGS += -I../blender/blenkernel
-CPPFLAGS += -I../blender/python
-CPPFLAGS += -I../blender/blenloader
-CPPFLAGS += -I../blender/gpu
-CPPFLAGS += -I../blender/windowmanager
-CPPFLAGS += -I../kernel/gen_system
-CPPFLAGS += -I../kernel/gen_messaging
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-
-ifeq ($(WITH_QUICKTIME), true)
- CPPFLAGS += -I$(NAN_QUICKTIME)/include -DWITH_QUICKTIME
-endif
-ifeq ($(WITH_OPENJPEG), true)
- CPPFLAGS += -DWITH_OPENJPEG
-endif
-
-ifeq ($(WITH_BINRELOC), true)
- CPPFLAGS += -I$(NANBLENDERHOME)/extern/binreloc/include -DWITH_BINRELOC
-endif
-
-ifeq ($(WITH_TIFF), true)
- CPPFLAGS += -DWITH_TIFF
-endif
-
-ifeq ($(WITH_CINEON), true)
- CPPFLAGS += -DWITH_CINEON
-endif
-
-ifeq ($(WITH_HDR), true)
- CPPFLAGS += -DWITH_HDR
-endif
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/creator/SConscript b/source/creator/SConscript
index 01e62d33269..8577872c48a 100644
--- a/source/creator/SConscript
+++ b/source/creator/SConscript
@@ -13,37 +13,36 @@ incs += ' ' + env['BF_OPENGL_INC']
defs = []
if env['WITH_BF_QUICKTIME']:
- incs += ' ' + env['BF_QUICKTIME_INC']
- defs.append('WITH_QUICKTIME')
+ incs += ' ' + env['BF_QUICKTIME_INC']
+ defs.append('WITH_QUICKTIME')
if env['WITH_BF_BINRELOC']:
- incs += ' ../../extern/binreloc/include'
- defs.append('WITH_BINRELOC')
+ incs += ' ../../extern/binreloc/include'
+ defs.append('WITH_BINRELOC')
if env['WITH_BF_OPENEXR']:
- defs.append('WITH_OPENEXR')
+ defs.append('WITH_OPENEXR')
if env['WITH_BF_TIFF']:
- defs.append('WITH_TIFF')
+ defs.append('WITH_TIFF')
if not env['WITH_BF_SDL']:
- defs.append('DISABLE_SDL')
+ defs.append('DISABLE_SDL')
if env['WITH_BF_PYTHON']:
- incs += ' ../blender/python'
- if env['BF_DEBUG']:
- defs.append('_DEBUG')
-else:
- defs.append('DISABLE_PYTHON')
-
+ incs += ' ../blender/python'
+ defs.append('WITH_PYTHON')
+ if env['BF_DEBUG']:
+ defs.append('_DEBUG')
+
if env['BF_BUILDINFO']:
- defs.append('BUILD_DATE')
- defs.append('NAN_BUILDINFO')
+ defs.append('BUILD_DATE')
+ defs.append('NAN_BUILDINFO')
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_PTHREADS_INC']
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
- incs += ' ' + env['BF_PTHREADS_INC']
+ incs += ' ' + env['BF_PTHREADS_INC']
env.BlenderLib ( libname = 'bf_creator', sources = Split(sources), includes = Split(incs), defines = defs, libtype='core', priority = 0 )
diff --git a/source/creator/buildinfo.c b/source/creator/buildinfo.c
index d745d826bd6..48a4352b11b 100644
--- a/source/creator/buildinfo.c
+++ b/source/creator/buildinfo.c
@@ -27,13 +27,39 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#define STRINGIFY(x) XSTRINGIFY(x)
-#define XSTRINGIFY(x) #x
+/** \file creator/buildinfo.c
+ * \ingroup creator
+ */
+
+
+#ifdef WITH_BUILDINFO_HEADER
+#include "buildinfo.h"
+#endif
#ifdef BUILD_DATE
+
+/* copied from BLI_utildefines.h */
+#define STRINGIFY_ARG(x) #x
+#define STRINGIFY(x) STRINGIFY_ARG(x)
+
+/* currently only these are defined in the header */
char build_date[]= STRINGIFY(BUILD_DATE);
char build_time[]= STRINGIFY(BUILD_TIME);
char build_rev[]= STRINGIFY(BUILD_REV);
+
char build_platform[]= STRINGIFY(BUILD_PLATFORM);
char build_type[]= STRINGIFY(BUILD_TYPE);
+
+#ifdef BUILD_CFLAGS
+char build_cflags[]= STRINGIFY(BUILD_CFLAGS);
+char build_cxxflags[]= STRINGIFY(BUILD_CXXFLAGS);
+char build_linkflags[]= STRINGIFY(BUILD_LINKFLAGS);
+char build_system[]= STRINGIFY(BUILD_SYSTEM);
+#else
+char build_cflags[]= "unmaintained buildsystem alert!";
+char build_cxxflags[]= "unmaintained buildsystem alert!";
+char build_linkflags[]= "unmaintained buildsystem alert!";
+char build_system[]= "unmaintained buildsystem alert!";
#endif
+
+#endif // BUILD_DATE
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 271e690b3ed..e5a68a6300c 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -27,14 +27,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file creator/creator.c
+ * \ingroup creator
+ */
+
+
#if defined(__linux__) && defined(__GNUC__)
#define _GNU_SOURCE
#include <fenv.h>
#endif
-#define OSX_SSE_FPE (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__)))
-
-#if OSX_SSE_FPE
+#if (defined(__APPLE__) && (defined(__i386__) || defined(__x86_64__)))
+#define OSX_SSE_FPE
#include <xmmintrin.h>
#endif
@@ -58,8 +62,8 @@
#include "BLI_args.h"
#include "BLI_threads.h"
-
-#include "GEN_messaging.h"
+#include "BLI_scanfill.h" // for BLI_setErrorCallBack, TODO, move elsewhere
+#include "BLI_utildefines.h"
#include "DNA_ID.h"
#include "DNA_scene_types.h"
@@ -69,6 +73,7 @@
#include "BKE_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
+#include "BKE_depsgraph.h" // for DAG_on_load_update
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -81,7 +86,7 @@
#include "IMB_imbuf.h" // for IMB_init
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "BPY_extern.h"
#endif
@@ -97,8 +102,17 @@
#include "GPU_draw.h"
#include "GPU_extensions.h"
+#ifdef WITH_BUILDINFO_HEADER
+#define BUILD_DATE
+#endif
+
/* for passing information between creator and gameengine */
+#ifdef WITH_GAMEENGINE
+#include "GEN_messaging.h"
#include "SYS_System.h"
+#else /* dummy */
+#define SYS_SystemHandle int
+#endif
#include <signal.h>
@@ -121,32 +135,37 @@ extern char build_time[];
extern char build_rev[];
extern char build_platform[];
extern char build_type[];
+extern char build_cflags[];
+extern char build_cxxflags[];
+extern char build_linkflags[];
+extern char build_system[];
#endif
/* Local Function prototypes */
-static int print_help(int argc, char **argv, void *data);
-static int print_version(int argc, char **argv, void *data);
+static int print_help(int argc, const char **argv, void *data);
+static int print_version(int argc, const char **argv, void *data);
/* for the callbacks: */
extern int pluginapi_force_ref(void); /* from blenpluginapi:pluginapi.c */
-char bprogname[FILE_MAXDIR+FILE_MAXFILE]; /* from blenpluginapi:pluginapi.c */
-char btempdir[FILE_MAXDIR+FILE_MAXFILE];
+char bprogname[FILE_MAX]; /* from blenpluginapi:pluginapi.c */
+char btempdir[FILE_MAX];
-#define BLEND_VERSION_STRING_FMT "Blender %d.%02d (sub %d) Build\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION
+#define BLEND_VERSION_STRING_FMT "Blender %d.%02d (sub %d)\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION
/* Initialise callbacks for the modules that need them */
static void setCallbacks(void);
/* set breakpoints here when running in debug mode, useful to catch floating point errors */
-#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE
-static void fpe_handler(int sig)
+#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE)
+static void fpe_handler(int UNUSED(sig))
{
// printf("SIGFPE trapped\n");
}
#endif
+#ifndef WITH_PYTHON_MODULE
/* handling ctrl-c event in console */
static void blender_esc(int sig)
{
@@ -163,6 +182,7 @@ static void blender_esc(int sig)
count++;
}
}
+#endif
/* buildinfo can have quotes */
#ifdef BUILD_DATE
@@ -178,7 +198,7 @@ static void strip_quotes(char *str)
}
#endif
-static int print_version(int argc, char **argv, void *data)
+static int print_version(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
printf (BLEND_VERSION_STRING_FMT);
#ifdef BUILD_DATE
@@ -187,13 +207,17 @@ static int print_version(int argc, char **argv, void *data)
printf ("\tbuild revision: %s\n", build_rev);
printf ("\tbuild platform: %s\n", build_platform);
printf ("\tbuild type: %s\n", build_type);
+ printf ("\tbuild c flags: %s\n", build_cflags);
+ printf ("\tbuild c++ flags: %s\n", build_cxxflags);
+ printf ("\tbuild link flags: %s\n", build_linkflags);
+ printf ("\tbuild system: %s\n", build_system);
#endif
exit(0);
return 0;
}
-static int print_help(int argc, char **argv, void *data)
+static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
bArgs *ba = (bArgs*)data;
@@ -239,7 +263,14 @@ static int print_help(int argc, char **argv, void *data)
BLI_argsPrintArgDoc(ba, "--eventmacro");
#endif
printf("\n");
-
+ BLI_argsPrintArgDoc(ba, "--factory-startup");
+ printf("\n");
+ BLI_argsPrintArgDoc(ba, "--env-system-config");
+ BLI_argsPrintArgDoc(ba, "--env-system-datafiles");
+ BLI_argsPrintArgDoc(ba, "--env-system-scripts");
+ BLI_argsPrintArgDoc(ba, "--env-system-plugins");
+ BLI_argsPrintArgDoc(ba, "--env-system-python");
+ printf("\n");
BLI_argsPrintArgDoc(ba, "-nojoystick");
BLI_argsPrintArgDoc(ba, "-noglsl");
BLI_argsPrintArgDoc(ba, "-noaudio");
@@ -258,6 +289,7 @@ static int print_help(int argc, char **argv, void *data)
BLI_argsPrintArgDoc(ba, "--python");
BLI_argsPrintArgDoc(ba, "--python-console");
+ BLI_argsPrintArgDoc(ba, "--addons");
#ifdef WIN32
BLI_argsPrintArgDoc(ba, "-R");
@@ -326,12 +358,12 @@ int segmentation_handler(int sig)
{
char fname[256];
- if (!G.sce[0]) {
+ if (!G.main->name[0]) {
char str[FILE_MAXDIR+FILE_MAXFILE];
- BLI_make_file_string("/", fname, btempdir, "quit.blend");
+ BLI_make_file_string("/", fname, btempdir, "crash.blend");
} else
- sprintf(fname, "%s.crash.blend", G.sce);
+ sprintf(fname, "%s.crash.blend", G.main->name);
BKE_undo_save(fname);
@@ -350,30 +382,30 @@ static int nocrashhandler(int argc, char **argv, void *data)
}
-static int end_arguments(int argc, char **argv, void *data)
+static int end_arguments(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
return -1;
}
-static int enable_python(int argc, char **argv, void *data)
+static int enable_python(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
G.f |= G_SCRIPT_AUTOEXEC;
return 0;
}
-static int disable_python(int argc, char **argv, void *data)
+static int disable_python(int UNUSED(argc), const const char **UNUSED(argv), void *UNUSED(data))
{
G.f &= ~G_SCRIPT_AUTOEXEC;
return 0;
}
-static int background_mode(int argc, char **argv, void *data)
+static int background_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
G.background = 1;
return 0;
}
-static int debug_mode(int argc, char **argv, void *data)
+static int debug_mode(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
G.f |= G_DEBUG; /* std output printf's */
printf(BLEND_VERSION_STRING_FMT);
@@ -387,9 +419,9 @@ static int debug_mode(int argc, char **argv, void *data)
return 0;
}
-static int set_fpe(int argc, char **argv, void *data)
+static int set_fpe(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
-#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE
+#if defined(__sgi) || defined(__linux__) || defined(_WIN32) || defined(OSX_SSE_FPE)
/* zealous but makes float issues a heck of a lot easier to find!
* set breakpoints on fpe_handler */
signal(SIGFPE, fpe_handler);
@@ -397,7 +429,7 @@ static int set_fpe(int argc, char **argv, void *data)
# if defined(__linux__) && defined(__GNUC__)
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW );
# endif /* defined(__linux__) && defined(__GNUC__) */
-# if OSX_SSE_FPE
+# if defined(OSX_SSE_FPE)
/* OSX uses SSE for floating point by default, so here
* use SSE instructions to throw floating point exceptions */
_MM_SET_EXCEPTION_MASK(_MM_MASK_MASK &~
@@ -412,7 +444,35 @@ static int set_fpe(int argc, char **argv, void *data)
return 0;
}
-static int playback_mode(int argc, char **argv, void *data)
+static int set_factory_startup(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
+{
+ G.factory_startup= 1;
+ return 0;
+}
+
+static int set_env(int argc, const char **argv, void *UNUSED(data))
+{
+ /* "--env-system-scripts" --> "BLENDER_SYSTEM_SCRIPTS" */
+
+ char env[64]= "BLENDER";
+ char *ch_dst= env + 7; /* skip BLENDER */
+ const char *ch_src= argv[0] + 5; /* skip --env */
+
+ if (argc < 2) {
+ printf("%s requires one argument\n", argv[0]);
+ exit(1);
+ }
+
+ for(; *ch_src; ch_src++, ch_dst++) {
+ *ch_dst= (*ch_src == '-') ? '_' : (*ch_src)-32; /* toupper() */
+ }
+
+ *ch_dst= '\0';
+ BLI_setenv(env, argv[1]);
+ return 1;
+}
+
+static int playback_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
/* not if -b was given first */
if (G.background == 0) {
@@ -424,7 +484,7 @@ static int playback_mode(int argc, char **argv, void *data)
return -2;
}
-static int prefsize(int argc, char **argv, void *data)
+static int prefsize(int argc, const char **argv, void *UNUSED(data))
{
int stax, stay, sizx, sizy;
@@ -443,33 +503,35 @@ static int prefsize(int argc, char **argv, void *data)
return 4;
}
-static int with_borders(int argc, char **argv, void *data)
+static int with_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
- /* with borders XXX OLD CRUFT!*/
-
+ WM_setinitialstate_normal();
return 0;
}
-static int without_borders(int argc, char **argv, void *data)
+static int without_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
- /* borderless, win + linux XXX OLD CRUFT */
- /* XXX, fixme mein, borderless on OSX */
-
+ WM_setinitialstate_fullscreen();
return 0;
}
-static int register_extension(int argc, char **argv, void *data)
+static int register_extension(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
#ifdef WIN32
char *path = BLI_argsArgv(data)[0];
RegisterBlendExtension(path);
+#else
+ (void)data; /* unused */
#endif
return 0;
}
-static int no_joystick(int argc, char **argv, void *data)
+static int no_joystick(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
+#ifndef WITH_GAMEENGINE
+ (void)data;
+#else
SYS_SystemHandle *syshandle = data;
/**
@@ -478,23 +540,24 @@ static int no_joystick(int argc, char **argv, void *data)
*/
SYS_WriteCommandLineInt(*syshandle, "nojoystick",1);
if (G.f & G_DEBUG) printf("disabling nojoystick\n");
+#endif
return 0;
}
-static int no_glsl(int argc, char **argv, void *data)
+static int no_glsl(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
GPU_extensions_disable();
return 0;
}
-static int no_audio(int argc, char **argv, void *data)
+static int no_audio(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
sound_force_device(0);
return 0;
}
-static int set_audio(int argc, char **argv, void *data)
+static int set_audio(int argc, const char **argv, void *UNUSED(data))
{
if (argc < 1) {
printf("-setaudio require one argument\n");
@@ -505,7 +568,7 @@ static int set_audio(int argc, char **argv, void *data)
return 1;
}
-static int set_output(int argc, char **argv, void *data)
+static int set_output(int argc, const char **argv, void *data)
{
bContext *C = data;
if (argc >= 1){
@@ -522,7 +585,7 @@ static int set_output(int argc, char **argv, void *data)
}
}
-static int set_engine(int argc, char **argv, void *data)
+static int set_engine(int argc, const char **argv, void *data)
{
bContext *C = data;
if (argc >= 1)
@@ -568,11 +631,11 @@ static int set_engine(int argc, char **argv, void *data)
}
}
-static int set_image_type(int argc, char **argv, void *data)
+static int set_image_type(int argc, const char **argv, void *data)
{
bContext *C = data;
if (argc >= 1){
- char *imtype = argv[1];
+ const char *imtype = argv[1];
if (CTX_data_scene(C)==NULL) {
printf("\nError: no blend loaded. order the arguments so '-F / --render-format' is after the blend is loaded.\n");
} else {
@@ -619,7 +682,7 @@ static int set_image_type(int argc, char **argv, void *data)
}
}
-static int set_threads(int argc, char **argv, void *data)
+static int set_threads(int argc, const char **argv, void *UNUSED(data))
{
if (argc >= 1) {
if(G.background) {
@@ -634,7 +697,7 @@ static int set_threads(int argc, char **argv, void *data)
}
}
-static int set_extension(int argc, char **argv, void *data)
+static int set_extension(int argc, const char **argv, void *data)
{
bContext *C = data;
if (argc >= 1) {
@@ -657,10 +720,15 @@ static int set_extension(int argc, char **argv, void *data)
}
}
-static int set_ge_parameters(int argc, char **argv, void *data)
+static int set_ge_parameters(int argc, const char **argv, void *data)
{
- SYS_SystemHandle syshandle = *(SYS_SystemHandle*)data;
int a = 0;
+#ifdef WITH_GAMEENGINE
+ SYS_SystemHandle syshandle = *(SYS_SystemHandle*)data;
+#else
+ (void)data;
+#endif
+
/**
gameengine parameters are automaticly put into system
-g [paramname = value]
@@ -672,7 +740,7 @@ example:
if(argc >= 1)
{
- char* paramname = argv[a];
+ const char *paramname = argv[a];
/* check for single value versus assignment */
if (a+1 < argc && (*(argv[a+1]) == '='))
{
@@ -681,7 +749,9 @@ example:
{
a++;
/* assignment */
+#ifdef WITH_GAMEENGINE
SYS_WriteCommandLineString(syshandle,paramname,argv[a]);
+#endif
} else
{
printf("error: argument assignment (%s) without value.\n",paramname);
@@ -690,8 +760,9 @@ example:
/* name arg eaten */
} else {
+#ifdef WITH_GAMEENGINE
SYS_WriteCommandLineInt(syshandle,argv[a],1);
-
+#endif
/* doMipMap */
if (!strcmp(argv[a],"nomipmap"))
{
@@ -710,7 +781,7 @@ example:
return a;
}
-static int render_frame(int argc, char **argv, void *data)
+static int render_frame(int argc, const char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -750,7 +821,7 @@ static int render_frame(int argc, char **argv, void *data)
}
}
-static int render_animation(int argc, char **argv, void *data)
+static int render_animation(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -766,7 +837,7 @@ static int render_animation(int argc, char **argv, void *data)
return 0;
}
-static int set_scene(int argc, char **argv, void *data)
+static int set_scene(int argc, const char **argv, void *data)
{
if(argc > 1) {
bContext *C= data;
@@ -781,7 +852,7 @@ static int set_scene(int argc, char **argv, void *data)
}
}
-static int set_start_frame(int argc, char **argv, void *data)
+static int set_start_frame(int argc, const char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -806,7 +877,7 @@ static int set_macro_playback(int argc, char **argv, void *data)
bContext *C = data;
if (argc < 2)
- return;
+ return 0;
CTX_set_events_path(C, argv[1]);
@@ -814,7 +885,7 @@ static int set_macro_playback(int argc, char **argv, void *data)
}
#endif
-static int set_end_frame(int argc, char **argv, void *data)
+static int set_end_frame(int argc, const char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -833,7 +904,7 @@ static int set_end_frame(int argc, char **argv, void *data)
}
}
-static int set_skip_frame(int argc, char **argv, void *data)
+static int set_skip_frame(int argc, const char **argv, void *data)
{
bContext *C = data;
if (CTX_data_scene(C)) {
@@ -853,7 +924,7 @@ static int set_skip_frame(int argc, char **argv, void *data)
}
/* macro for ugly context setup/reset */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#define BPY_CTX_SETUP(_cmd) \
{ \
wmWindowManager *wm= CTX_wm_manager(C); \
@@ -871,11 +942,11 @@ static int set_skip_frame(int argc, char **argv, void *data)
CTX_data_scene_set(C, prevscene); \
} \
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
-static int run_python(int argc, char **argv, void *data)
+static int run_python(int argc, const char **argv, void *data)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bContext *C = data;
/* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
@@ -885,7 +956,7 @@ static int run_python(int argc, char **argv, void *data)
BLI_strncpy(filename, argv[1], sizeof(filename));
BLI_path_cwd(filename);
- BPY_CTX_SETUP( BPY_run_python_script(C, filename, NULL, NULL) )
+ BPY_CTX_SETUP(BPY_filepath_exec(C, filename, NULL))
return 1;
} else {
@@ -893,27 +964,51 @@ static int run_python(int argc, char **argv, void *data)
return 0;
}
#else
+ (void)argc; (void)argv; (void)data; /* unused */
printf("This blender was built without python support\n");
return 0;
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
}
-static int run_python_console(int argc, char **argv, void *data)
+static int run_python_console(int UNUSED(argc), const char **argv, void *data)
{
-#ifndef DISABLE_PYTHON
- bContext *C = data;
- const char *expr= "__import__('code').interact()";
+#ifdef WITH_PYTHON
+ bContext *C = data;
- BPY_CTX_SETUP( BPY_eval_string(C, expr) )
+ BPY_CTX_SETUP(BPY_string_exec(C, "__import__('code').interact()"))
return 0;
#else
+ (void)argv; (void)data; /* unused */
printf("This blender was built without python support\n");
return 0;
-#endif /* DISABLE_PYTHON */
+#endif /* WITH_PYTHON */
}
-static int load_file(int argc, char **argv, void *data)
+static int set_addons(int argc, const char **argv, void *data)
+{
+ /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
+ if (argc > 1) {
+#ifdef WITH_PYTHON
+ const int slen= strlen(argv[1]) + 10;
+ char *str= malloc(slen);
+ bContext *C= data;
+ BLI_snprintf(str, slen, "[__import__('addon_utils').enable(i) for i in '%s'.split(',')]", argv[1]);
+ BPY_CTX_SETUP(BPY_string_exec(C, str));
+ free(str);
+#else
+ (void)argv; (void)data; /* unused */
+#endif /* WITH_PYTHON */
+ return 1;
+ }
+ else {
+ printf("\nError: you must specify a comma separated list after '--addons'.\n");
+ return 0;
+ }
+}
+
+
+static int load_file(int UNUSED(argc), const char **argv, void *data)
{
bContext *C = data;
@@ -923,22 +1018,35 @@ static int load_file(int argc, char **argv, void *data)
BLI_path_cwd(filename);
if (G.background) {
- int retval = BKE_read_file(C, filename, NULL, NULL);
+ int retval = BKE_read_file(C, filename, NULL);
/*we successfully loaded a blend file, get sure that
pointcache works */
- if (retval!=0) {
+ if (retval != BKE_READ_FILE_FAIL) {
wmWindowManager *wm= CTX_wm_manager(C);
+
+ /* special case, 2.4x files */
+ if(wm==NULL && CTX_data_main(C)->wm.first==NULL) {
+ extern void wm_add_default(bContext *C);
+
+ /* wm_add_default() needs the screen to be set. */
+ CTX_wm_screen_set(C, CTX_data_main(C)->screen.first);
+ wm_add_default(C);
+ }
+
CTX_wm_manager_set(C, NULL); /* remove wm to force check */
WM_check(C);
G.relbase_valid = 1;
if (CTX_wm_manager(C) == NULL) CTX_wm_manager_set(C, wm); /* reset wm */
+
+ DAG_on_load_update(CTX_data_main(C), TRUE);
}
/* WM_read_file() runs normally but since we're in background mode do here */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
- BPY_load_user_modules(C);
+ BPY_driver_reset();
+ BPY_modules_load_user(C);
#endif
/* happens for the UI on file reading too (huh? (ton))*/
@@ -947,7 +1055,10 @@ static int load_file(int argc, char **argv, void *data)
} else {
/* we are not running in background mode here, but start blender in UI mode with
a file - this should do everything a 'load file' does */
- WM_read_file(C, filename, NULL);
+ ReportList reports;
+ BKE_reports_init(&reports, RPT_PRINT);
+ WM_read_file(C, filename, &reports);
+ BKE_reports_clear(&reports);
}
G.file_loaded = 1;
@@ -955,7 +1066,7 @@ static int load_file(int argc, char **argv, void *data)
return 0;
}
-void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
+static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
{
static char output_doc[] = "<path>"
"\n\tSet the render path and file name."
@@ -985,9 +1096,9 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
static char game_doc[] = "Game Engine specific options"
"\n\t-g fixedtime\t\tRun on 50 hertz without dropping frames"
- "\n\t-g vertexarrays\tUse Vertex Arrays for rendering (usually faster)"
+ "\n\t-g vertexarrays\t\tUse Vertex Arrays for rendering (usually faster)"
"\n\t-g nomipmap\t\tNo Texture Mipmapping"
- "\n\t-g linearmipmap\tLinear Texture Mipmapping instead of Nearest (default)";
+ "\n\t-g linearmipmap\t\tLinear Texture Mipmapping instead of Nearest (default)";
static char debug_doc[] = "\n\tTurn debugging on\n"
"\n\t* Prints every operator call and their arguments"
@@ -1014,12 +1125,21 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
BLI_argsAdd(ba, 1, "-a", NULL, playback_doc, playback_mode, NULL);
BLI_argsAdd(ba, 1, "-d", "--debug", debug_doc, debug_mode, ba);
- BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--debug-fpe", "\n\tEnable floating point exceptions", set_fpe, NULL);
+
+ BLI_argsAdd(ba, 1, NULL, "--factory-startup", "\n\tSkip reading the "STRINGIFY(BLENDER_STARTUP_FILE)" in the users home directory", set_factory_startup, NULL);
+
+ /* TODO, add user env vars? */
+ BLI_argsAdd(ba, 1, NULL, "--env-system-config", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_CONFIG)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-datafiles", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_DATAFILES)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-scripts", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_SCRIPTS)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-plugins", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_PLUGINS)" environment variable", set_env, NULL);
+ BLI_argsAdd(ba, 1, NULL, "--env-system-python", "\n\tSet the "STRINGIFY_ARG(BLENDER_SYSTEM_PYTHON)" environment variable", set_env, NULL);
/* second pass: custom window stuff */
BLI_argsAdd(ba, 2, "-p", "--window-geometry", "<sx> <sy> <w> <h>\n\tOpen with lower left corner at <sx>, <sy> and width and height as <w>, <h>", prefsize, NULL);
BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL);
- BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening with without borders", without_borders, NULL);
+ BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening without borders", without_borders, NULL);
BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba);
BLI_argsAdd(ba, 2, "--no_crash_handler", NULL, "disable crash handler", nocrashhandler, NULL);
@@ -1040,12 +1160,13 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
BLI_argsAdd(ba, 4, "-j", "--frame-jump", "<frames>\n\tSet number of frames to step forward after each rendered frame", set_skip_frame, C);
BLI_argsAdd(ba, 4, "-P", "--python", "<filename>\n\tRun the given Python script (filename or Blender Text)", run_python, C);
BLI_argsAdd(ba, 4, NULL, "--python-console", "\n\tRun blender with an interactive console", run_python_console, C);
+ BLI_argsAdd(ba, 4, NULL, "--addons", "\n\tComma separated list of addons (no spaces)", set_addons, C);
BLI_argsAdd(ba, 4, "-o", "--render-output", output_doc, set_output, C);
BLI_argsAdd(ba, 4, "-E", "--engine", "<engine>\n\tSpecify the render engine\n\tuse -E help to list available engines", set_engine, C);
BLI_argsAdd(ba, 4, "-F", "--render-format", format_doc, set_image_type, C);
- BLI_argsAdd(ba, 4, "-t", "--threads", "<threads>\n\tUse amount of <threads> for rendering in background\n\t[1-" QUOTE(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL);
+ BLI_argsAdd(ba, 4, "-t", "--threads", "<threads>\n\tUse amount of <threads> for rendering in background\n\t[1-" STRINGIFY(BLENDER_MAX_THREADS) "], 0 for systems processor count.", set_threads, NULL);
BLI_argsAdd(ba, 4, "-x", "--use-extension", "<bool>\n\tSet option to add the file extension to the end of the file", set_extension, C);
#ifdef EVENT_RECORDER
@@ -1054,11 +1175,20 @@ void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
}
-int main(int argc, char **argv)
+#ifdef WITH_PYTHON_MODULE
+/* allow python module to call main */
+#define main main_python
+#endif
+
+int main(int argc, const char **argv)
{
SYS_SystemHandle syshandle;
bContext *C= CTX_create();
bArgs *ba;
+#ifdef WITH_PYTHON_MODULE
+#undef main
+#endif
+
#ifdef WITH_BINRELOC
br_init( NULL );
#endif
@@ -1087,14 +1217,18 @@ int main(int argc, char **argv)
// copy path to executable in bprogname. playanim and creting runtimes
// need this.
- BLI_where_am_i(bprogname, argv[0]);
+ BLI_where_am_i(bprogname, sizeof(bprogname), argv[0]);
#ifdef BUILD_DATE
- strip_quotes(build_date);
- strip_quotes(build_time);
- strip_quotes(build_rev);
- strip_quotes(build_platform);
- strip_quotes(build_type);
+ strip_quotes(build_date);
+ strip_quotes(build_time);
+ strip_quotes(build_rev);
+ strip_quotes(build_platform);
+ strip_quotes(build_type);
+ strip_quotes(build_cflags);
+ strip_quotes(build_cxxflags);
+ strip_quotes(build_linkflags);
+ strip_quotes(build_system);
#endif
BLI_threadapi_init();
@@ -1113,8 +1247,12 @@ int main(int argc, char **argv)
IMB_init();
+#ifdef WITH_GAMEENGINE
syshandle = SYS_GetSystem();
GEN_init_messaging_system();
+#else
+ syshandle= 0;
+#endif
/* first test for background */
ba = BLI_argsInit(argc, argv); /* skip binary path */
@@ -1131,10 +1269,13 @@ int main(int argc, char **argv)
setuid(getuid()); /* end superuser */
#endif
-
+#ifdef WITH_PYTHON_MODULE
+ G.background= 1; /* python module mode ALWAYS runs in background mode (for now) */
+#else
/* for all platforms, even windos has it! */
if(G.background) signal(SIGINT, blender_esc); /* ctrl c out bg render */
-
+#endif
+
/* background render uses this font too */
BKE_font_register_builtin(datatoc_Bfont, datatoc_Bfont_size);
@@ -1149,19 +1290,12 @@ int main(int argc, char **argv)
BLI_argsParse(ba, 3, NULL, NULL);
WM_init(C, argc, argv);
-
+
/* this is properly initialized with user defs, but this is default */
- BLI_where_is_temp( btempdir, 1 ); /* call after loading the startup.blend so we can read U.tempdir */
+ BLI_where_is_temp(btempdir, FILE_MAX, 1); /* call after loading the startup.blend so we can read U.tempdir */
#ifndef DISABLE_SDL
BLI_setenv("SDL_VIDEODRIVER", "dummy");
-/* I think this is not necessary anymore (04-24-2010 neXyon)
-#ifdef __linux__
- // On linux the default SDL driver dma often would not play
- // use alsa if none is set
- setenv("SDL_AUDIODRIVER", "alsa", 0);
-#endif
-*/
#endif
}
else {
@@ -1169,20 +1303,21 @@ int main(int argc, char **argv)
WM_init(C, argc, argv);
- BLI_where_is_temp( btempdir, 0 ); /* call after loading the startup.blend so we can read U.tempdir */
+ BLI_where_is_temp(btempdir, FILE_MAX, 0); /* call after loading the startup.blend so we can read U.tempdir */
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/**
* NOTE: the U.pythondir string is NULL until WM_init() is executed,
* so we provide the BPY_ function below to append the user defined
* pythondir to Python's sys.path at this point. Simply putting
- * WM_init() before BPY_start_python() crashes Blender at startup.
+ * WM_init() before BPY_python_start() crashes Blender at startup.
* Update: now this function also inits the bpymenus, which also depend
* on U.pythondir.
*/
// TODO - U.pythondir
-
+#else
+ printf("\n* WARNING * - Blender compiled without Python!\nthis is not intended for typical usage\n\n");
#endif
CTX_py_init_set(C, 1);
@@ -1193,6 +1328,10 @@ int main(int argc, char **argv)
BLI_argsFree(ba);
+#ifdef WITH_PYTHON_MODULE
+ return 0; /* keep blender in background mode running */
+#endif
+
if(G.background) {
/* actually incorrect, but works for now (ton) */
WM_exit(C);
@@ -1224,7 +1363,7 @@ int main(int argc, char **argv)
return 0;
} /* end of int main(argc,argv) */
-static void error_cb(char *err)
+static void error_cb(const char *err)
{
printf("%s\n", err); /* XXX do this in WM too */
diff --git a/source/darwin/Makefile b/source/darwin/Makefile
deleted file mode 100644
index 5c68f43f606..00000000000
--- a/source/darwin/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-
-include nan_definitions.mk
-
-DIR = $(OCGDIR)/$(DEBUG_DIR)
-
-PYARCHIVE = python_$(MACOSX_ARCHITECTURE).zip
-
-all::
- @# set up directory structure for the OSX aplication bundle
- @echo "---> creating directory structure for $(APPLICATION)"
- @rm -rf $(DIR)/bin/$(APPLICATION).app
- @cp -R $(APPLICATION).app $(DIR)/bin
- @cat $(APPLICATION).app/Contents/Info.plist | sed s/VERSION/`cat ../../release/VERSION`/ | sed s/DATE/`date +'%Y-%b-%d'`/ > $(DIR)/bin/$(APPLICATION).app/Contents/Info.plist
- @echo "---> copying binary"
- @cp $(DIR)/bin/$(APPLICATION) $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/
- @echo "---> adding excutable attributes"
- @chmod +x $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/$(APPLICATION)
-ifeq ($(APPLICATION), blender)
- @echo "---> copying message files"
- @cp -R $(NANBLENDERHOME)/release/bin/.blender/locale $(DIR)/bin/$(APPLICATION).app/Contents/Resources
- @echo "---> copying .Blanguages"
- @cp $(NANBLENDERHOME)/release/bin/.blender/.Blanguages $(DIR)/bin/$(APPLICATION).app/Contents/Resources
- @echo "---> copying .blender/ scripts"
- @cp -R $(NANBLENDERHOME)/release/bin/.blender $(DIR)/bin/$(APPLICATION).app/Contents/MacOS
- @cp -R $(NANBLENDERHOME)/release/scripts $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/
- @echo "---> copying python modules"
- @mkdir $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python
- @unzip -q $(LCGDIR)/release/$(PYARCHIVE) -d $(DIR)/bin/$(APPLICATION).app/Contents/MacOS/.blender/python/
-endif
- @echo "---> removing SVN directories and Mac hidden files from distribution"
- @find $(DIR)/bin/$(APPLICATION).app -name CVS -prune -exec rm -rf {} \;
- @find $(DIR)/bin/$(APPLICATION).app -name .DS_Store -exec rm -f {} \;
- @find $(DIR)/bin/$(APPLICATION).app -name .svn -prune -exec rm -rf {} \;
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 01a9e621304..b94d15d2fbf 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,11 +28,16 @@
* Blender's Ketsji startpoint
*/
+/** \file gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+ * \ingroup blroutines
+ */
+
+
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// don't show stl-warnings
#pragma warning (disable:4786)
#endif
@@ -77,7 +82,7 @@ extern "C" {
#include "BKE_global.h"
#include "BKE_report.h"
-#include "BKE_utildefines.h"
+
//XXX #include "BIF_screen.h"
//XXX #include "BIF_scrarea.h"
@@ -141,10 +146,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
BlendFileData *bfd= NULL;
BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
- BLI_strncpy(oldsce, G.sce, sizeof(oldsce));
-#ifndef DISABLE_PYTHON
+ BLI_strncpy(oldsce, G.main->name, sizeof(oldsce));
+#ifdef WITH_PYTHON
resetGamePythonPath(); // need this so running a second time wont use an old blendfiles path
- setGamePythonPath(G.sce);
+ setGamePythonPath(G.main->name);
// Acquire Python's GIL (global interpreter lock)
// so we can safely run Python code and API calls
@@ -172,15 +177,22 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
bool frameRate = (SYS_GetCommandLineInt(syshandle, "show_framerate", 0) != 0);
bool animation_record = (SYS_GetCommandLineInt(syshandle, "animation_record", 0) != 0);
bool displaylists = (SYS_GetCommandLineInt(syshandle, "displaylists", 0) != 0);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
bool nodepwarnings = (SYS_GetCommandLineInt(syshandle, "ignore_deprecation_warnings", 0) != 0);
#endif
bool novertexarrays = (SYS_GetCommandLineInt(syshandle, "novertexarrays", 0) != 0);
+ bool mouse_state = startscene->gm.flag & GAME_SHOW_MOUSE;
+
if(animation_record) usefixed= true; /* override since you's always want fixed time for sim recording */
// create the canvas, rasterizer and rendertools
RAS_ICanvas* canvas = new KX_BlenderCanvas(win, area_rect, ar);
- canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
+
+ // default mouse state set on render panel
+ if (mouse_state)
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ else
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
RAS_IRenderTools* rendertools = new KX_BlenderRenderTools();
RAS_IRasterizer* rasterizer = NULL;
@@ -221,7 +233,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetUseFixedTime(usefixed);
ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
#endif
@@ -235,21 +247,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
}
// some blender stuff
- MT_CmMatrix4x4 projmat;
- MT_CmMatrix4x4 viewmat;
float camzoom;
- int i;
-
- for (i = 0; i < 16; i++)
- {
- float *viewmat_linear= (float*) rv3d->viewmat;
- viewmat.setElem(i, viewmat_linear[i]);
- }
- for (i = 0; i < 16; i++)
- {
- float *projmat_linear= (float*) rv3d->winmat;
- projmat.setElem(i, projmat_linear[i]);
- }
if(rv3d->persp==RV3D_CAMOB) {
if(startscene->gm.framing.type == SCE_GAMEFRAMING_BARS) { /* Letterbox */
@@ -265,7 +263,6 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
camzoom = 2.0;
}
-
ketsjiengine->SetDrawType(v3d->drawtype);
ketsjiengine->SetCameraZoom(camzoom);
@@ -309,10 +306,10 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
startscenename = bfd->curscene->id.name + 2;
if(blenderdata) {
- BLI_strncpy(G.sce, blenderdata->name, sizeof(G.sce));
+ BLI_strncpy(G.main->name, blenderdata->name, sizeof(G.main->name));
BLI_strncpy(pathname, blenderdata->name, sizeof(pathname));
-#ifndef DISABLE_PYTHON
- setGamePythonPath(G.sce);
+#ifdef WITH_PYTHON
+ setGamePythonPath(G.main->name);
#endif
}
}
@@ -347,8 +344,8 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
{
ketsjiengine->EnableCameraOverride(startscenename);
ketsjiengine->SetCameraOverrideUseOrtho((rv3d->persp == RV3D_ORTHO));
- ketsjiengine->SetCameraOverrideProjectionMatrix(projmat);
- ketsjiengine->SetCameraOverrideViewMatrix(viewmat);
+ ketsjiengine->SetCameraOverrideProjectionMatrix(MT_CmMatrix4x4(rv3d->winmat));
+ ketsjiengine->SetCameraOverrideViewMatrix(MT_CmMatrix4x4(rv3d->viewmat));
ketsjiengine->SetCameraOverrideClipping(v3d->near, v3d->far);
ketsjiengine->SetCameraOverrideLens(v3d->lens);
}
@@ -382,11 +379,11 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
scene,
canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// some python things
PyObject *gameLogic, *gameLogic_keys;
setupGamePython(ketsjiengine, startscene, blenderdata, pyGlobalDict, &gameLogic, &gameLogic_keys, 0, NULL);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//initialize Dome Settings
if(scene->gm.stereoflag == STEREO_DOME)
@@ -425,14 +422,14 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->SetAnimFrameRate(FPS);
// the mainloop
- printf("\nBlender Game Engine Started\n\n");
+ printf("\nBlender Game Engine Started\n");
while (!exitrequested)
{
// first check if we want to exit
exitrequested = ketsjiengine->GetExitCode();
// kick the engine
- bool render = ketsjiengine->NextFrame(); // XXX 2.5 Bug, This is never true! FIXME- Campbell
+ bool render = ketsjiengine->NextFrame();
if (render)
{
@@ -440,7 +437,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
ketsjiengine->Render();
}
- wm_window_process_events_nosleep(C);
+ wm_window_process_events_nosleep();
// test for the ESC key
//XXX while (qtest())
@@ -471,13 +468,16 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
wm_event_free(event);
}
+ if(win != CTX_wm_window(C)) {
+ exitrequested= KX_EXIT_REQUEST_OUTSIDE; /* window closed while bge runs */
+ }
}
- printf("\nBlender Game Engine Finished\n\n");
+ printf("Blender Game Engine Finished\n");
exitstring = ketsjiengine->GetExitString();
// when exiting the mainloop
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Clears the dictionary by hand:
// This prevents, extra references to global variables
// inside the GameLogic dictionary when the python interpreter is finalized.
@@ -499,7 +499,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
gameLogic_keys_new = NULL;
#endif
ketsjiengine->StopEngine();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
exitGamePythonScripting();
#endif
networkdevice->Disconnect();
@@ -510,7 +510,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
sceneconverter = NULL;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Py_DECREF(gameLogic_keys);
gameLogic_keys = NULL;
#endif
@@ -521,8 +521,11 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
startscene->camera= tmp_camera;
}
- // set the cursor back to normal
- canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ if(exitrequested != KX_EXIT_REQUEST_OUTSIDE)
+ {
+ // set the cursor back to normal
+ canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+ }
// clean up some stuff
if (ketsjiengine)
@@ -573,9 +576,9 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, rcti *c
if (bfd) BLO_blendfiledata_free(bfd);
- BLI_strncpy(G.sce, oldsce, sizeof(G.sce));
+ BLI_strncpy(G.main->name, oldsce, sizeof(G.main->name));
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
Py_DECREF(pyGlobalDict);
// Release Python's GIL
diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt
index 57d28561647..81db7da5cee 100644
--- a/source/gameengine/BlenderRoutines/CMakeLists.txt
+++ b/source/gameengine/BlenderRoutines/CMakeLists.txt
@@ -1,7 +1,5 @@
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -10,7 +8,6 @@ SET(INC
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/Converter
../../../source/blender/imbuf
- ../../../intern/ghost/include
../../../intern/moto/include
../../../source/gameengine/Ketsji
../../../source/blender/blenlib
@@ -18,8 +15,7 @@ SET(INC
../../../source/blender/blenfont
../../../source/blender/editors/include
../../../source/blender/windowmanager
- ../../../source/blender
- ../../../source/blender/include
+ ../../../source/blender
../../../source/blender/makesdna
../../../source/blender/makesrna
../../../source/gameengine/Rasterizer
@@ -30,23 +26,35 @@ SET(INC
../../../source/gameengine/Physics/common
../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Network/LoopBackNetwork
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
../../../extern/bullet2/src
../../../extern/glew/include
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ BL_KetsjiEmbedStart.cpp
+ KX_BlenderCanvas.cpp
+ KX_BlenderGL.cpp
+ KX_BlenderInputDevice.cpp
+ KX_BlenderKeyboardDevice.cpp
+ KX_BlenderMouseDevice.cpp
+ KX_BlenderRenderTools.cpp
+ KX_BlenderSystem.cpp
+
+ KX_BlenderCanvas.h
+ KX_BlenderGL.h
+ KX_BlenderInputDevice.h
+ KX_BlenderKeyboardDevice.h
+ KX_BlenderMouseDevice.h
+ KX_BlenderRenderTools.h
+ KX_BlenderSystem.h
+)
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+add_definitions(-DGLEW_STATIC)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-BLENDERLIB(bf_blroutines "${SRC}" "${INC}")
+blender_add_lib(ge_blen_routines "${SRC}" "${INC}")
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index b04e951028d..9dd63fa3089 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+ * \ingroup blroutines
+ */
+
+
#include "KX_BlenderCanvas.h"
#include "DNA_screen_types.h"
#include "stdio.h"
@@ -203,5 +208,11 @@ void KX_BlenderCanvas::SetMousePosition(int x,int y)
void KX_BlenderCanvas::MakeScreenShot(const char* filename)
{
-// BL_MakeScreenShot(m_ar, filename);
+ ScrArea area_dummy= {0};
+ area_dummy.totrct.xmin = m_frame_rect.GetLeft();
+ area_dummy.totrct.xmax = m_frame_rect.GetRight();
+ area_dummy.totrct.ymin = m_frame_rect.GetBottom();
+ area_dummy.totrct.ymax = m_frame_rect.GetTop();
+
+ BL_MakeScreenShot(&area_dummy, filename);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
index 42f956cafcd..b5b5908e7ae 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderCanvas.h
+ * \ingroup blroutines
+ */
+
#ifndef __KX_BLENDERCANVAS
#define __KX_BLENDERCANVAS
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 55a687c0baa..92cb0167192 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,15 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "KX_BlenderGL.h"
+/** \file gameengine/BlenderRoutines/KX_BlenderGL.cpp
+ * \ingroup blroutines
+ */
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include "BLF_api.h"
-#ifdef __cplusplus
-}
-#endif
+
+#include "KX_BlenderGL.h"
/*
* This little block needed for linking to Blender...
@@ -49,6 +46,8 @@ extern "C" {
#include "GL/glew.h"
+#include "MEM_guardedalloc.h"
+
#include "BL_Material.h" // MAXTEX
/* Data types encoding the game world: */
@@ -65,27 +64,24 @@ extern "C" {
#include "DNA_windowmanager_types.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_bmfont.h"
#include "BKE_image.h"
+#include "BLI_path_util.h"
+
extern "C" {
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
#include "WM_api.h"
#include "WM_types.h"
#include "wm_event_system.h"
#include "wm_cursors.h"
#include "wm_window.h"
+#include "BLF_api.h"
}
/* end of blender block */
-
-/* was in drawmesh.c */
-void spack(unsigned int ucol)
-{
- char *cp= (char *)&ucol;
-
- glColor3ub(cp[3], cp[2], cp[1]);
-}
-
void BL_warp_pointer(wmWindow *win, int x,int y)
{
WM_cursor_warp(win, x, y);
@@ -132,10 +128,36 @@ void DisableForText()
}
}
+/* Print 3D text */
+void BL_print_game_line(int fontid, const char* text, int size, int dpi, float* color, double* mat, float aspect)
+{
+ /* gl prepping */
+ DisableForText();
+
+ /* the actual drawing */
+ glColor4fv(color);
+
+ /* multiply the text matrix by the object matrix */
+ BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
+ BLF_matrix(fontid, mat);
+
+ /* aspect is the inverse scale that allows you to increase */
+ /* your resolution without sizing the final text size */
+ /* the bigger the size, the smaller the aspect */
+ BLF_aspect(fontid, aspect, aspect, aspect);
+
+ BLF_size(fontid, size, dpi);
+ BLF_position(fontid, 0, 0, 0);
+ BLF_draw(fontid, (char *)text, strlen(text));
+
+ BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
+}
+
void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height)
{
/* gl prepping */
DisableForText();
+ glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -149,7 +171,7 @@ void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int
/* the actual drawing */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
+ BLF_draw_default(xco, height-yco, 0.0f, (char *)text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@@ -164,6 +186,7 @@ void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int widt
* behind quite as neatly as we'd have wanted to. I don't know
* what cause it, though :/ .*/
DisableForText();
+ glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@@ -177,9 +200,9 @@ void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int widt
/* draw in black first*/
glColor3ub(0, 0, 0);
- BLF_draw_default(xco+2, height-yco-2, 0.0f, (char *)text);
+ BLF_draw_default(xco+2, height-yco-2, 0.0f, text, 65535); /* XXX, use real len */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, (char *)text);
+ BLF_draw_default(xco, height-yco, 0.0f, text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@@ -206,18 +229,53 @@ void BL_NormalMouse(wmWindow *win)
}
#define MAX_FILE_LENGTH 512
+/* get shot from frontbuffer sort of a copy from screendump.c */
+static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
+{
+ int x=0, y=0;
+ unsigned int *dumprect= NULL;
+
+ x= curarea->totrct.xmin;
+ y= curarea->totrct.ymin;
+ *dumpsx= curarea->totrct.xmax-x;
+ *dumpsy= curarea->totrct.ymax-y;
+
+ if (*dumpsx && *dumpsy) {
+
+ dumprect= (unsigned int *)MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect");
+ glReadBuffer(GL_FRONT);
+ glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
+ glFinish();
+ glReadBuffer(GL_BACK);
+ }
+
+ return dumprect;
+}
-void BL_MakeScreenShot(struct ARegion *ar, const char* filename)
+/* based on screendump.c::screenshot_exec */
+void BL_MakeScreenShot(ScrArea *curarea, const char* filename)
{
- char copyfilename[MAX_FILE_LENGTH];
- strcpy(copyfilename,filename);
+ char path[MAX_FILE_LENGTH];
+ strcpy(path,filename);
- // filename read - only
+ unsigned int *dumprect;
+ int dumpsx, dumpsy;
- /* XXX will need to change at some point */
- //XXX BIF_screendump(0);
-
- // write+read filename
- //XXX write_screendump((char*) copyfilename);
+ dumprect= screenshot(curarea, &dumpsx, &dumpsy);
+ if(dumprect) {
+ ImBuf *ibuf;
+ BLI_path_abs(path, G.main->name);
+ /* BKE_add_image_extension() checks for if extension was already set */
+ BKE_add_image_extension(path, R_PNG); /* scene->r.imtype */
+ ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
+ ibuf->rect= dumprect;
+ ibuf->ftype= PNG;
+
+ IMB_saveiff(ibuf, path, IB_rect);
+
+ ibuf->rect= NULL;
+ IMB_freeImBuf(ibuf);
+ MEM_freeN(dumprect);
+ }
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index 84d174cec68..4e206150081 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderGL.h
+ * \ingroup blroutines
+ */
+
#ifndef __BLENDERGL
#define __BLENDERGL
@@ -41,12 +46,13 @@ void BL_SwapBuffers(struct wmWindow *win);
void BL_warp_pointer(struct wmWindow *win,int x,int y);
-void BL_MakeScreenShot(struct ARegion *ar, const char* filename);
+void BL_MakeScreenShot(struct ScrArea *curarea, const char* filename);
void BL_HideMouse(struct wmWindow *win);
void BL_NormalMouse(struct wmWindow *win);
void BL_WaitMouse(struct wmWindow *win);
+void BL_print_game_line(int fontid, const char* text, int size, int dpi, float* color, double* mat, float aspect);
void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height);
void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int width, int height);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp
index 697687d1b95..84af5b28296 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,5 +26,10 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/BlenderRoutines/KX_BlenderInputDevice.cpp
+ * \ingroup blroutines
+ */
+
#include "KX_BlenderInputDevice.h"
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
index 5bdf0ccd81d..67a2279d824 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderInputDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderInputDevice.h
+ * \ingroup blroutines
+ */
+
#ifndef __KX_BLENDERINPUTDEVICE
#define __KX_BLENDERINPUTDEVICE
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning(disable : 4786) // shut off 255 char limit debug template warning
#endif
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
index e8cb25af868..9ccf55a62a3 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.cpp
+ * \ingroup blroutines
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// annoying warnings about truncated STL debug info
#pragma warning (disable :4786)
#endif
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
index eab052895db..b4eb7bf6083 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderKeyboardDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderKeyboardDevice.h
+ * \ingroup blroutines
+ */
+
#ifndef __KX_BLENDERKEYBOARDDEVICE
#define __KX_BLENDERKEYBOARDDEVICE
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp
index c3e3935fca5..2432bf9c25a 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/BlenderRoutines/KX_BlenderMouseDevice.cpp
+ * \ingroup blroutines
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// annoying warnings about truncated STL debug info
#pragma warning (disable :4786)
#endif
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
index ce067ffb379..e192259e0d7 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderMouseDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderMouseDevice.h
+ * \ingroup blroutines
+ */
+
#ifndef __KX_BLENDERMOUSEDEVICE
#define __KX_BLENDERMOUSEDEVICE
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
index 3d736557535..fca160c60a6 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+ * \ingroup blroutines
+ */
+
+
#include "GL/glew.h"
#include "RAS_IRenderTools.h"
@@ -275,7 +280,16 @@ void KX_BlenderRenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmat
}
}
}
-
+void KX_BlenderRenderTools::RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect)
+{
+ BL_print_game_line(fontid, text, size, dpi, color, mat, aspect);
+}
void KX_BlenderRenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
index 9a7d9c7bcc0..8755ff0a4a1 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_BlenderRenderTools.h
+ * \ingroup blroutines
+ */
+
#ifndef __KX_BLENDERRENDERTOOLS
#define __KX_BLENDERRENDERTOOLS
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// don't show stl-warnings
#pragma warning (disable:4786)
#endif
@@ -69,7 +73,15 @@ public:
void DisableOpenGLLights();
void ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat);
- void RenderText2D(RAS_TEXT_RENDER_MODE mode,
+ void RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect);
+
+ void RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
int xco,
int yco,
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp b/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp
index 813869dd032..f6666e28f31 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderSystem.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,13 +26,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/BlenderRoutines/KX_BlenderSystem.cpp
+ * \ingroup blroutines
+ */
+
+
#include "KX_ISystem.h"
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable :4786)
-#include <windows.h>
#endif //WIN32
+#ifdef WIN32
+#include <windows.h>
+#endif
+
#include <iostream>
#include <stdio.h>
#include "KX_BlenderInputDevice.h"
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
index fb40ded9292..244476d8cf6 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderSystem.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,12 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderSystem.h
+ * \ingroup blroutines
+ * \brief Blender System embedding. Needed when gameengine runs embedded within Blender.
+ */
+
#ifndef __KX_BLENDERSYSTEM
#define __KX_BLENDERSYSTEM
-/**
- * Blender System embedding. Needed when gameengine runs embedded within Blender.
- */
#include "KX_ISystem.h"
#ifdef WITH_CXX_GUARDEDALLOC
@@ -47,8 +50,6 @@ public:
virtual ~KX_BlenderSystem() {};
virtual double GetTimeInSeconds();
-
-
#ifdef WITH_CXX_GUARDEDALLOC
public:
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_BlenderSystem"); }
diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile
deleted file mode 100644
index 3d0f5344c74..00000000000
--- a/source/gameengine/BlenderRoutines/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = bloutines
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-# because of kernel dependency on makesdna
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/editors/include
-# because of kernel dependency on imbuf
-CPPFLAGS += -I../../blender/windowmanager
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/blenfont
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I../../blender/makesrna
-CPPFLAGS += -I../Converter
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../GameLogic
-CPPFLAGS += -I../Ketsji
-CPPFLAGS += -I../Rasterizer
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Network
-CPPFLAGS += -I../Network/LoopBackNetwork
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I.
-
-ifeq ($(OS),windows)
- CPPFLAGS += -I../../blender
-endif
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript
index f53fc509c6d..f30cea9cb07 100644
--- a/source/gameengine/BlenderRoutines/SConscript
+++ b/source/gameengine/BlenderRoutines/SConscript
@@ -26,11 +26,19 @@ if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
incs += ' ' + env['BF_BULLET_INC']
incs += ' ' + env['BF_OPENGL_INC']
-env.BlenderLib ( 'bf_bloutines', sources, Split(incs), defs, libtype=['core','player'], priority=[300,35] , cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_blen_routines', sources, Split(incs), defs, libtype=['core','player'], priority=[300,35] , cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/CMakeLists.txt b/source/gameengine/CMakeLists.txt
index 7b58a2a6875..5dece449120 100644
--- a/source/gameengine/CMakeLists.txt
+++ b/source/gameengine/CMakeLists.txt
@@ -1,3 +1,4 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
# $Id$
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -24,25 +25,34 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(BlenderRoutines)
-ADD_SUBDIRECTORY(Converter)
-ADD_SUBDIRECTORY(Expressions)
-ADD_SUBDIRECTORY(GameLogic)
-ADD_SUBDIRECTORY(Ketsji)
-ADD_SUBDIRECTORY(Ketsji/KXNetwork)
-ADD_SUBDIRECTORY(Network)
-ADD_SUBDIRECTORY(Network/LoopBackNetwork)
-ADD_SUBDIRECTORY(Physics/common)
-ADD_SUBDIRECTORY(Physics/Dummy)
-ADD_SUBDIRECTORY(Rasterizer)
-ADD_SUBDIRECTORY(Rasterizer/RAS_OpenGLRasterizer)
-ADD_SUBDIRECTORY(SceneGraph)
-ADD_SUBDIRECTORY(Physics/Bullet)
+# there are too many inter-includes so best define here
+if(WITH_PYTHON)
+ blender_include_dirs("${PYTHON_INCLUDE_DIRS}")
+ add_definitions(-DWITH_PYTHON)
+endif()
-IF(WITH_PYTHON)
- ADD_SUBDIRECTORY(VideoTexture)
-ENDIF(WITH_PYTHON)
+add_subdirectory(BlenderRoutines)
+add_subdirectory(Converter)
+add_subdirectory(Expressions)
+add_subdirectory(GameLogic)
+add_subdirectory(Ketsji)
+add_subdirectory(Ketsji/KXNetwork)
+add_subdirectory(Network)
+add_subdirectory(Network/LoopBackNetwork)
+add_subdirectory(Physics/common)
+add_subdirectory(Physics/Dummy)
+add_subdirectory(Rasterizer)
+add_subdirectory(Rasterizer/RAS_OpenGLRasterizer)
+add_subdirectory(SceneGraph)
-IF(WITH_PLAYER)
- ADD_SUBDIRECTORY(GamePlayer)
-ENDIF(WITH_PLAYER)
+if(WITH_BULLET)
+ add_subdirectory(Physics/Bullet)
+endif()
+
+if(WITH_PYTHON)
+ add_subdirectory(VideoTexture)
+endif()
+
+if(WITH_PLAYER)
+ add_subdirectory(GamePlayer)
+endif()
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index b8d4c4e0f04..c00e7ec7e29 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,11 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#if defined (__sgi)
-#include <math.h>
-#else
-#include <cmath>
-#endif
+/** \file gameengine/Converter/BL_ActionActuator.cpp
+ * \ingroup bgeconv
+ */
+
#include "SCA_LogicManager.h"
#include "BL_ActionActuator.h"
@@ -39,16 +38,17 @@
#include "BL_SkinDeformer.h"
#include "KX_GameObject.h"
#include "STR_HashedString.h"
+#include "MEM_guardedalloc.h"
#include "DNA_nla_types.h"
-#include "BKE_action.h"
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_scene_types.h"
-#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
#include "MT_Matrix4x4.h"
-#include "BKE_utildefines.h"
+
+#include "BKE_action.h"
#include "FloatValue.h"
#include "PyObjectPlus.h"
#include "KX_PyMath.h"
@@ -231,6 +231,16 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
apply=false;
}
break;
+ case ACT_ACTION_PINGPONG:
+ if (bPositiveEvent){
+ if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+ m_flag &= ~ACT_FLAG_KEYUP;
+ m_localtime = m_starttime;
+ m_starttime = curtime;
+ m_flag |= ACT_FLAG_LOCKINPUT;
+ }
+ }
+ break;
case ACT_ACTION_FLIPPER:
if (bPositiveEvent){
if (!(m_flag & ACT_FLAG_LOCKINPUT)){
@@ -305,6 +315,18 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
break;
case ACT_ACTION_LOOP_STOP:
break;
+ case ACT_ACTION_PINGPONG:
+ if (wrap){
+ if (!(m_flag & ACT_FLAG_REVERSE))
+ m_localtime = m_endframe;
+ else
+ m_localtime = m_startframe;
+
+ m_flag &= ~ACT_FLAG_LOCKINPUT;
+ m_flag ^= ACT_FLAG_REVERSE; //flip direction
+ keepgoing = false;
+ }
+ break;
case ACT_ACTION_FLIPPER:
if (wrap){
if (!(m_flag & ACT_FLAG_REVERSE)){
@@ -428,7 +450,7 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
return keepgoing;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -674,4 +696,4 @@ PyObject* BL_ActionActuator::pyattr_get_channel_names(void *self_v, const KX_PYA
return ret;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h
index 10ce1fad27a..c6e661f1549 100644
--- a/source/gameengine/Converter/BL_ActionActuator.h
+++ b/source/gameengine/Converter/BL_ActionActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_ActionActuator.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_ACTIONACTUATOR
#define BL_ACTIONACTUATOR
@@ -84,7 +88,7 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_O(BL_ActionActuator,GetChannel);
KX_PYMETHOD_DOC(BL_ActionActuator,setChannel);
@@ -121,6 +125,7 @@ public:
switch (act->m_playtype) {
case ACT_ACTION_PLAY:
+ case ACT_ACTION_PINGPONG:
case ACT_ACTION_FLIPPER:
case ACT_ACTION_LOOP_STOP:
case ACT_ACTION_LOOP_END:
@@ -131,7 +136,7 @@ public:
return 1;
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.cpp b/source/gameengine/Converter/BL_ArmatureActuator.cpp
index 82b8307a2bc..efd1a73a448 100644
--- a/source/gameengine/Converter/BL_ArmatureActuator.cpp
+++ b/source/gameengine/Converter/BL_ArmatureActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_ArmatureActuator.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "DNA_action_types.h"
#include "DNA_constraint_types.h"
#include "DNA_actuator_types.h"
@@ -175,7 +180,7 @@ bool BL_ArmatureActuator::Update(double curtime, bool frame)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
@@ -257,5 +262,5 @@ PyObject* BL_ArmatureActuator::pyattr_get_constraint(void *self, const struct KX
return constraint->GetProxy();
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureActuator.h b/source/gameengine/Converter/BL_ArmatureActuator.h
index 72e2e96ea73..4615fb06714 100644
--- a/source/gameengine/Converter/BL_ArmatureActuator.h
+++ b/source/gameengine/Converter/BL_ArmatureActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file BL_ArmatureActuator.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_ARMATUREACTUATOR
#define BL_ARMATUREACTUATOR
@@ -66,14 +71,14 @@ public:
virtual bool Update(double curtime, bool frame);
virtual void ReParent(SCA_IObject* parent);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* These are used to get and set m_target */
static PyObject* pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
// identify the constraint that this actuator controls
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp
index 8f5ec230486..626d8a19deb 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.cpp
+++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_ArmatureChannel.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "DNA_armature_types.h"
#include "BL_ArmatureChannel.h"
#include "BL_ArmatureObject.h"
@@ -33,7 +38,7 @@
#include "BLI_math.h"
#include "BLI_string.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject BL_ArmatureChannel::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -72,7 +77,7 @@ PyObject *BL_ArmatureChannel::NewProxy(bool py_owns)
return NewProxyPlus_Ext(this, &Type, m_posechannel, py_owns);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
BL_ArmatureChannel::BL_ArmatureChannel(
BL_ArmatureObject *armature,
@@ -85,7 +90,7 @@ BL_ArmatureChannel::~BL_ArmatureChannel()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -121,7 +126,7 @@ PyAttributeDef BL_ArmatureChannel::AttributesPtr[] = {
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("scale",-FLT_MAX,FLT_MAX,bPoseChannel,size,3),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_quaternion",-1.0f,1.0f,bPoseChannel,quat,4),
KX_PYATTRIBUTE_FLOAT_VECTOR_RW("rotation_euler",-10.f,10.f,bPoseChannel,eul,3),
- KX_PYATTRIBUTE_SHORT_RW("rotation_mode",0,ROT_MODE_MAX-1,false,bPoseChannel,rotmode),
+ KX_PYATTRIBUTE_SHORT_RW("rotation_mode",ROT_MODE_MIN,ROT_MODE_MAX,false,bPoseChannel,rotmode),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("channel_matrix",bPoseChannel,chan_mat,4),
KX_PYATTRIBUTE_FLOAT_MATRIX_RO("pose_matrix",bPoseChannel,pose_mat,4),
KX_PYATTRIBUTE_FLOAT_VECTOR_RO("pose_head",bPoseChannel,pose_head,3),
@@ -461,4 +466,4 @@ PyObject *BL_ArmatureBone::py_bone_get_children(void *self, const struct KX_PYAT
return childrenlist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.h b/source/gameengine/Converter/BL_ArmatureChannel.h
index 79f0cc80348..0c2c27a7fab 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.h
+++ b/source/gameengine/Converter/BL_ArmatureChannel.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file BL_ArmatureChannel.h
+ * \ingroup bgeconv
+ */
+
#ifndef __BL_ARMATURECHANNEL
#define __BL_ARMATURECHANNEL
@@ -57,7 +62,7 @@ public:
struct bPoseChannel *posechannel);
virtual ~BL_ArmatureChannel();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python access
virtual PyObject* py_repr(void);
@@ -65,7 +70,7 @@ public:
static int py_attr_setattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* py_attr_get_joint_rotation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int py_attr_set_joint_rotation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
/* this is a factory class to access bBone data field in the GE.
@@ -82,7 +87,7 @@ private:
public:
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *py_bone_repr(PyObject *self);
static PyObject *py_bone_get_parent(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject *py_bone_get_children(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.cpp b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
index 0b7ab043d16..c07fe6b3b41 100644
--- a/source/gameengine/Converter/BL_ArmatureConstraint.cpp
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_ArmatureConstraint.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "DNA_constraint_types.h"
#include "DNA_action_types.h"
#include "BL_ArmatureConstraint.h"
@@ -33,7 +38,7 @@
#include "BLI_math.h"
#include "BLI_string.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject BL_ArmatureConstraint::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -62,7 +67,7 @@ PyObject* BL_ArmatureConstraint::py_repr(void)
return PyUnicode_FromString(m_name);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
BL_ArmatureConstraint::BL_ArmatureConstraint(
BL_ArmatureObject *armature,
@@ -237,7 +242,7 @@ void BL_ArmatureConstraint::SetSubtarget(KX_GameObject* subtarget)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -447,4 +452,4 @@ int BL_ArmatureConstraint::py_attr_setattr(void *self_v, const struct KX_PYATTRI
return PY_SET_ATTR_FAIL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureConstraint.h b/source/gameengine/Converter/BL_ArmatureConstraint.h
index a9f612b6c0c..1dd685b8cba 100644
--- a/source/gameengine/Converter/BL_ArmatureConstraint.h
+++ b/source/gameengine/Converter/BL_ArmatureConstraint.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file BL_ArmatureConstraint.h
+ * \ingroup bgeconv
+ */
+
#ifndef __BL_ARMATURECONSTRAINT
#define __BL_ARMATURECONSTRAINT
@@ -104,14 +109,14 @@ public:
void SetTarget(KX_GameObject* target);
void SetSubtarget(KX_GameObject* subtarget);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python access
virtual PyObject* py_repr(void);
static PyObject* py_attr_getattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int py_attr_setattr(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif //__BL_ARMATURECONSTRAINT
diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp
index 97d6b6efd27..952af4db8bb 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.cpp
+++ b/source/gameengine/Converter/BL_ArmatureObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,17 +27,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_ArmatureObject.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "BL_ArmatureObject.h"
#include "BL_ActionActuator.h"
#include "KX_BlenderSceneConverter.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
-#include "BLI_ghash.h"
#include "BLI_math.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
#include "BIK_api.h"
#include "BKE_action.h"
#include "BKE_armature.h"
-#include "BKE_utildefines.h"
+
#include "BKE_constraint.h"
#include "GEN_Map.h"
#include "GEN_HashedPtr.h"
@@ -594,7 +600,7 @@ float BL_ArmatureObject::GetBoneLength(Bone* bone) const
return (float)(MT_Point3(bone->head) - MT_Point3(bone->tail)).length();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
@@ -661,4 +667,4 @@ KX_PYMETHODDEF_DOC_NOARGS(BL_ArmatureObject, update,
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ArmatureObject.h b/source/gameengine/Converter/BL_ArmatureObject.h
index 646e9d45365..8490bfadac2 100644
--- a/source/gameengine/Converter/BL_ArmatureObject.h
+++ b/source/gameengine/Converter/BL_ArmatureObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_ArmatureObject.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_ARMATUREOBJECT
#define BL_ARMATUREOBJECT
@@ -108,14 +112,14 @@ public:
virtual int GetGameObjectType() { return OBJ_ARMATURE; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// PYTHON
static PyObject* pyattr_get_constraints(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_channels(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
KX_PYMETHOD_DOC_NOARGS(BL_ArmatureObject, update);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
/* list element: BL_ArmatureConstraint. Use SG_DListHead to have automatic list replication */
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index ad92048ca13..1b79478b37e 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,7 +28,12 @@
* Convert blender data to ketsji
*/
-#ifdef WIN32
+/** \file gameengine/Converter/BL_BlenderDataConversion.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif
@@ -64,6 +69,7 @@
#include "KX_Light.h"
#include "KX_Camera.h"
#include "KX_EmptyObject.h"
+#include "KX_FontObject.h"
#include "MT_Point3.h"
#include "MT_Transform.h"
#include "MT_MinMax.h"
@@ -90,7 +96,7 @@
#include "BL_MeshDeformer.h"
#include "KX_SoftBodyDeformer.h"
//#include "BL_ArmatureController.h"
-
+#include "BLI_utildefines.h"
#include "BlenderWorldInfo.h"
#include "KX_KetsjiEngine.h"
@@ -125,7 +131,7 @@
#include "DNA_object_force.h"
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+
#include "BKE_key.h"
#include "BKE_mesh.h"
#include "MT_Point3.h"
@@ -226,10 +232,10 @@ static unsigned int KX_Mcol2uint_new(MCol col)
static void SetDefaultFaceType(Scene* scene)
{
default_face_mode = TF_DYNAMIC;
- Scene *sce;
+ Scene *sce_iter;
Base *base;
- for(SETLOOPER(scene,base))
+ for(SETLOOPER(scene, sce_iter, base))
{
if (base->object->type == OB_LAMP)
{
@@ -729,13 +735,13 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene,
MFace *mface = dm->getTessFaceArray(dm);
MTFace *tface = static_cast<MTFace*>(dm->getTessFaceDataArray(dm, CD_MTFACE));
MCol *mcol = static_cast<MCol*>(dm->getTessFaceDataArray(dm, CD_MCOL));
- float (*tangent)[3] = NULL;
+ float (*tangent)[4] = NULL;
int totface = dm->getNumTessFaces(dm);
const char *tfaceName = "";
if(tface) {
DM_add_tangent_layer(dm);
- tangent = (float(*)[3])dm->getTessFaceDataArray(dm, CD_TANGENT);
+ tangent = (float(*)[4])dm->getTessFaceDataArray(dm, CD_TANGENT);
}
meshobj = new RAS_MeshObject(mesh);
@@ -1266,10 +1272,13 @@ static void my_get_local_bounds(Object *ob, DerivedMesh *dm, float *center, floa
break;
case OB_CURVE:
case OB_SURF:
- case OB_FONT:
center[0]= center[1]= center[2]= 0.0;
size[0] = size[1]=size[2]=0.0;
break;
+ case OB_FONT:
+ center[0]= center[1]= center[2]= 0.0;
+ size[0] = size[1]=size[2]=1.0;
+ break;
case OB_MBALL:
bb= ob->bb;
break;
@@ -1521,7 +1530,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
KX_BoxBounds bb;
DerivedMesh* dm = NULL;
if (gameobj->GetDeformer())
- dm = gameobj->GetDeformer()->GetFinalMesh();
+ dm = gameobj->GetDeformer()->GetPhysicsMesh();
my_get_local_bounds(blenderobject,dm,objprop.m_boundobject.box.m_center,bb.m_extends);
if (blenderobject->gameflag & OB_BOUNDS)
{
@@ -1614,6 +1623,10 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
}
delete shapeprops;
delete smmaterial;
+ if (dm) {
+ dm->needsFree = 1;
+ dm->release(dm);
+ }
}
@@ -1740,8 +1753,9 @@ static KX_GameObject *gameobject_from_blenderobject(
bool bHasDvert = mesh->dvert != NULL && ob->defbase.first;
bool bHasArmature = (BL_ModifierDeformer::HasArmatureDeformer(ob) && ob->parent && ob->parent->type == OB_ARMATURE && bHasDvert);
bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(ob);
+#ifdef USE_BULLET
bool bHasSoftBody = (!ob->parent && (ob->gameflag & OB_SOFT_BODY));
-
+#endif
if (bHasModifier) {
BL_ModifierDeformer *dcont = new BL_ModifierDeformer((BL_DeformableGameObject *)gameobj,
kxscene->GetBlenderScene(), ob, meshobj);
@@ -1766,9 +1780,11 @@ static KX_GameObject *gameobject_from_blenderobject(
BL_MeshDeformer *dcont = new BL_MeshDeformer((BL_DeformableGameObject*)gameobj,
ob, meshobj);
((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
+#ifdef USE_BULLET
} else if (bHasSoftBody) {
KX_SoftBodyDeformer *dcont = new KX_SoftBodyDeformer(meshobj, (BL_DeformableGameObject*)gameobj);
((BL_DeformableGameObject*)gameobj)->SetDeformer(dcont);
+#endif
}
MT_Point3 min = MT_Point3(center) - MT_Vector3(extents);
@@ -1798,6 +1814,18 @@ static KX_GameObject *gameobject_from_blenderobject(
// set transformation
break;
}
+
+ case OB_FONT:
+ {
+ /* font objects have no bounding box */
+ gameobj = new KX_FontObject(kxscene,KX_Scene::m_callbacks, rendertools, ob);
+
+ /* add to the list only the visible fonts */
+ if((ob->lay & kxscene->GetBlenderScene()->lay) != 0)
+ kxscene->AddFont(static_cast<KX_FontObject*>(gameobj));
+ break;
+ }
+
}
if (gameobj)
{
@@ -1912,7 +1940,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
Scene *blenderscene = kxscene->GetBlenderScene();
// for SETLOOPER
- Scene *sce;
+ Scene *sce_iter;
Base *base;
// Get the frame settings of the canvas.
@@ -1993,7 +2021,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
// Beware of name conflict in linked data, it will not crash but will create confusion
// in Python scripting and in certain actuators (replace mesh). Linked scene *should* have
// no conflicting name for Object, Object data and Action.
- for (SETLOOPER(blenderscene, base))
+ for (SETLOOPER(blenderscene, sce_iter, base))
{
Object* blenderobject = base->object;
allblobj.insert(blenderobject);
@@ -2634,7 +2662,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
sumolist->Release();
// convert world
- KX_WorldInfo* worldinfo = new BlenderWorldInfo(blenderscene->world);
+ KX_WorldInfo* worldinfo = new BlenderWorldInfo(blenderscene, blenderscene->world);
converter->RegisterWorldInfo(worldinfo);
kxscene->SetWorldInfo(worldinfo);
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.h b/source/gameengine/Converter/BL_BlenderDataConversion.h
index 66419dbccd1..cea9f7f2a8b 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.h
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file BL_BlenderDataConversion.h
+ * \ingroup bgeconv
+ */
+
#ifndef __BLENDER_CONVERT
#define __BLENDER_CONVERT
diff --git a/source/gameengine/Converter/BL_DeformableGameObject.cpp b/source/gameengine/Converter/BL_DeformableGameObject.cpp
index f076d52c745..bfba054d0d4 100644
--- a/source/gameengine/Converter/BL_DeformableGameObject.cpp
+++ b/source/gameengine/Converter/BL_DeformableGameObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_DeformableGameObject.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "BL_DeformableGameObject.h"
#include "BL_ShapeDeformer.h"
#include "BL_ShapeActionActuator.h"
diff --git a/source/gameengine/Converter/BL_DeformableGameObject.h b/source/gameengine/Converter/BL_DeformableGameObject.h
index 5d16e3ba1a8..6bcdaff10e3 100644
--- a/source/gameengine/Converter/BL_DeformableGameObject.h
+++ b/source/gameengine/Converter/BL_DeformableGameObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,16 +27,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_DeformableGameObject.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_DEFORMABLEGAMEOBJECT
#define BL_DEFORMABLEGAMEOBJECT
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
#include "DNA_mesh_types.h"
#include "KX_GameObject.h"
#include "BL_MeshDeformer.h"
+#include "KX_SoftBodyDeformer.h"
#include <vector>
class BL_ShapeActionActuator;
@@ -79,7 +84,20 @@ public:
bool GetShape(vector<float> &shape);
Key* GetKey()
{
- return (m_pDeformer) ? ((BL_MeshDeformer*)m_pDeformer)->GetMesh()->key : NULL;
+ if(m_pDeformer) {
+ BL_MeshDeformer *deformer= dynamic_cast<BL_MeshDeformer *>(m_pDeformer); // incase its not a MeshDeformer
+ if(deformer) {
+ return deformer->GetMesh()->key;
+ }
+
+#if 0 // TODO. shape keys for softbody, currently they dont store a mesh.
+ KX_SoftBodyDeformer *deformer_soft= dynamic_cast<KX_SoftBodyDeformer *>(m_pDeformer);
+ if(deformer) {
+ return deformer->GetMesh()->key;
+ }
+#endif
+ }
+ return NULL;
}
virtual void SetDeformer(class RAS_Deformer* deformer);
diff --git a/source/gameengine/Converter/BL_MeshDeformer.cpp b/source/gameengine/Converter/BL_MeshDeformer.cpp
index 332c6fee2cf..2a54ea7d9ae 100644
--- a/source/gameengine/Converter/BL_MeshDeformer.cpp
+++ b/source/gameengine/Converter/BL_MeshDeformer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,7 +28,12 @@
* Simple deformation controller that restores a mesh to its rest position
*/
-#ifdef WIN32
+/** \file gameengine/Converter/BL_MeshDeformer.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
diff --git a/source/gameengine/Converter/BL_MeshDeformer.h b/source/gameengine/Converter/BL_MeshDeformer.h
index 50bad254b42..b62958c7fd1 100644
--- a/source/gameengine/Converter/BL_MeshDeformer.h
+++ b/source/gameengine/Converter/BL_MeshDeformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_MeshDeformer.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_MESHDEFORMER
#define BL_MESHDEFORMER
@@ -36,7 +40,7 @@
#include "MT_Point3.h"
#include <stdlib.h>
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
diff --git a/source/gameengine/Converter/BL_ModifierDeformer.cpp b/source/gameengine/Converter/BL_ModifierDeformer.cpp
index 5ccf8de29b1..95f362a2879 100644
--- a/source/gameengine/Converter/BL_ModifierDeformer.cpp
+++ b/source/gameengine/Converter/BL_ModifierDeformer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,7 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Converter/BL_ModifierDeformer.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -49,6 +54,7 @@
#include "DNA_curve_types.h"
#include "DNA_modifier_types.h"
#include "DNA_scene_types.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_key.h"
@@ -61,7 +67,7 @@ extern "C"{
#include "BKE_lattice.h"
#include "BKE_modifier.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -127,14 +133,37 @@ bool BL_ModifierDeformer::HasArmatureDeformer(Object *ob)
if (!ob->modifiers.first)
return false;
- ModifierData* md;
- for (md = (ModifierData*)ob->modifiers.first; md; md = (ModifierData*)md->next) {
- if (md->type == eModifierType_Armature )
- return true;
- }
+ ModifierData* md = (ModifierData*)ob->modifiers.first;
+ if(md->type == eModifierType_Armature )
+ return true;
+
return false;
}
+// return a deformed mesh that supports mapping (with a valid CD_ORIGINDEX layer)
+struct DerivedMesh* BL_ModifierDeformer::GetPhysicsMesh()
+{
+ // we need to compute the deformed mesh taking into account the current
+ // shape and skin deformers, we cannot just call mesh_create_derived_physics()
+ // because that would use the m_transvers already deformed previously by BL_ModifierDeformer::Update(),
+ // so restart from scratch by forcing a full update the shape/skin deformers
+ // (will do nothing if there is no such deformer)
+ BL_ShapeDeformer::ForceUpdate();
+ BL_ShapeDeformer::Update();
+ // now apply the modifiers but without those that don't support mapping
+ Object* blendobj = m_gameobj->GetBlendObject();
+ /* hack: the modifiers require that the mesh is attached to the object
+ It may not be the case here because of replace mesh actuator */
+ Mesh *oldmesh = (Mesh*)blendobj->data;
+ blendobj->data = m_bmesh;
+ DerivedMesh *dm = mesh_create_derived_physics(m_scene, blendobj, m_transverts, CD_MASK_MESH);
+ /* restore object data */
+ blendobj->data = oldmesh;
+ /* m_transverts is correct here (takes into account deform only modifiers) */
+ /* the derived mesh returned by this function must be released by the caller !!! */
+ return dm;
+}
+
bool BL_ModifierDeformer::Update(void)
{
bool bShapeUpdate = BL_ShapeDeformer::Update();
diff --git a/source/gameengine/Converter/BL_ModifierDeformer.h b/source/gameengine/Converter/BL_ModifierDeformer.h
index 6e0ede8e62f..e9e546ebc86 100644
--- a/source/gameengine/Converter/BL_ModifierDeformer.h
+++ b/source/gameengine/Converter/BL_ModifierDeformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_ModifierDeformer.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_MODIFIERDEFORMER
#define BL_MODIFIERDEFORMER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
@@ -95,7 +99,8 @@ public:
{
return m_dm;
}
-
+ // The derived mesh returned by this function must be released!
+ virtual struct DerivedMesh* GetPhysicsMesh();
protected:
double m_lastModifierUpdate;
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
index 08d3e54a7c5..bb53c2d6fe6 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BL_ShapeActionActuator.cpp
+ * \ingroup bgeconv
+ */
+
+
#if defined (__sgi)
#include <math.h>
#else
@@ -48,7 +53,7 @@
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "MT_Matrix4x4.h"
-#include "BKE_utildefines.h"
+
#include "FloatValue.h"
#include "PyObjectPlus.h"
@@ -226,6 +231,16 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
apply=false;
}
break;
+ case ACT_ACTION_PINGPONG:
+ if (bPositiveEvent){
+ if (!(m_flag & ACT_FLAG_LOCKINPUT)){
+ m_flag &= ~ACT_FLAG_KEYUP;
+ m_localtime = m_starttime;
+ m_starttime = curtime;
+ m_flag |= ACT_FLAG_LOCKINPUT;
+ }
+ }
+ break;
case ACT_ACTION_FLIPPER:
if (bPositiveEvent){
if (!(m_flag & ACT_FLAG_LOCKINPUT)){
@@ -300,6 +315,18 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
break;
case ACT_ACTION_LOOP_STOP:
break;
+ case ACT_ACTION_PINGPONG:
+ if (wrap){
+ if (!(m_flag & ACT_FLAG_REVERSE))
+ m_localtime = m_endframe;
+ else
+ m_localtime = m_startframe;
+
+ m_flag &= ~ACT_FLAG_LOCKINPUT;
+ m_flag ^= ACT_FLAG_REVERSE; //flip direction
+ keepgoing = false;
+ }
+ break;
case ACT_ACTION_FLIPPER:
if (wrap){
if (!(m_flag & ACT_FLAG_REVERSE)){
@@ -408,7 +435,7 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame)
return keepgoing;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -491,4 +518,4 @@ int BL_ShapeActionActuator::pyattr_set_action(void *self_v, const KX_PYATTRIBUTE
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.h b/source/gameengine/Converter/BL_ShapeActionActuator.h
index 64cd21e5544..229c59a34a4 100644
--- a/source/gameengine/Converter/BL_ShapeActionActuator.h
+++ b/source/gameengine/Converter/BL_ShapeActionActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_ShapeActionActuator.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_SHAPEACTIONACTUATOR
#define BL_SHAPEACTIONACTUATOR
@@ -82,7 +86,7 @@ public:
bAction* GetAction() { return m_action; }
void SetAction(bAction* act) { m_action= act; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_action(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
@@ -113,6 +117,7 @@ public:
switch (act->m_playtype) {
case ACT_ACTION_PLAY:
+ case ACT_ACTION_PINGPONG:
case ACT_ACTION_FLIPPER:
case ACT_ACTION_LOOP_STOP:
case ACT_ACTION_LOOP_END:
@@ -125,7 +130,7 @@ public:
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
protected:
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.cpp b/source/gameengine/Converter/BL_ShapeDeformer.cpp
index 1a90001adca..40e7c6e1bde 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.cpp
+++ b/source/gameengine/Converter/BL_ShapeDeformer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,7 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Converter/BL_ShapeDeformer.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -55,7 +60,7 @@
extern "C"{
#include "BKE_lattice.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
@@ -154,7 +159,7 @@ bool BL_ShapeDeformer::Update(void)
/* store verts locally */
VerifyStorage();
- do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_bmesh->key, NULL, 0);
+ do_rel_key(0, m_bmesh->totvert, m_bmesh->totvert, (char *)(float *)m_transverts, m_bmesh->key, NULL, 0); /* last arg is ignored */
m_bDynamic = true;
}
diff --git a/source/gameengine/Converter/BL_ShapeDeformer.h b/source/gameengine/Converter/BL_ShapeDeformer.h
index 98bd4a1b4ba..8115af59d27 100644
--- a/source/gameengine/Converter/BL_ShapeDeformer.h
+++ b/source/gameengine/Converter/BL_ShapeDeformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_ShapeDeformer.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_SHAPEDEFORMER
#define BL_SHAPEDEFORMER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index c6e371dc0bf..4916ce53fc5 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,7 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Converter/BL_SkinDeformer.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -42,6 +47,7 @@
#include "DNA_action_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "BLI_utildefines.h"
#include "BKE_armature.h"
#include "BKE_action.h"
#include "MT_Point3.h"
@@ -49,7 +55,7 @@
extern "C"{
#include "BKE_lattice.h"
}
- #include "BKE_utildefines.h"
+
#include "BLI_blenlib.h"
#include "BLI_math.h"
diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h
index df7e8f6dffc..69b8783ce22 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.h
+++ b/source/gameengine/Converter/BL_SkinDeformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file BL_SkinDeformer.h
+ * \ingroup bgeconv
+ */
+
#ifndef BL_SKINDEFORMER
#define BL_SKINDEFORMER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
diff --git a/source/gameengine/Converter/BlenderWorldInfo.cpp b/source/gameengine/Converter/BlenderWorldInfo.cpp
index 47653519cfd..8fc01032de7 100644
--- a/source/gameengine/Converter/BlenderWorldInfo.cpp
+++ b/source/gameengine/Converter/BlenderWorldInfo.cpp
@@ -1,8 +1,8 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
- * This program is free software; you can redistribute it and/or
+ * This program is free software; you can [0]istribute 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.
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/BlenderWorldInfo.cpp
+ * \ingroup bgeconv
+ */
+
+
#include <stdio.h> // printf()
#include "BlenderWorldInfo.h"
@@ -55,11 +60,13 @@
#include "DNA_world_types.h"
#include "DNA_screen_types.h"
+#include "BLI_math.h"
+
#include "BKE_global.h"
/* end of blender include block */
-BlenderWorldInfo::BlenderWorldInfo(struct World* blenderworld)
+BlenderWorldInfo::BlenderWorldInfo(struct Scene *blenderscene, struct World* blenderworld)
{
if (blenderworld)
{
@@ -71,27 +78,24 @@ BlenderWorldInfo::BlenderWorldInfo(struct World* blenderworld)
m_hasmist = true;
m_miststart = blenderworld->miststa;
m_mistdistance = blenderworld->mistdist;
- m_mistred = blenderworld->horr;
- m_mistgreen = blenderworld->horg;
- m_mistblue = blenderworld->horb;
+ copy_v3_v3(m_mistcolor, &blenderworld->horr);
}
else
{
m_hasmist = false;
m_miststart = 0.0;
m_mistdistance = 0.0;
- m_mistred = 0.0;
- m_mistgreen = 0.0;
- m_mistblue = 0.0;
+ zero_v3(m_mistcolor);
}
- m_backgroundred = blenderworld->horr;
- m_backgroundgreen = blenderworld->horg;
- m_backgroundblue = blenderworld->horb;
-
- m_ambientred = blenderworld->ambr;
- m_ambientgreen = blenderworld->ambg;
- m_ambientblue = blenderworld->ambb;
+ copy_v3_v3(m_backgroundcolor, &blenderworld->horr);
+ copy_v3_v3(m_ambientcolor, &blenderworld->ambr);
+
+ if(blenderscene->r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ linearrgb_to_srgb_v3_v3(m_mistcolor, m_mistcolor);
+ linearrgb_to_srgb_v3_v3(m_backgroundcolor, m_backgroundcolor);
+ linearrgb_to_srgb_v3_v3(m_ambientcolor, m_ambientcolor);
+ }
}
else
{
@@ -123,37 +127,37 @@ bool BlenderWorldInfo::hasMist()
float BlenderWorldInfo::getBackColorRed()
{
- return m_backgroundred;
+ return m_backgroundcolor[0];
}
float BlenderWorldInfo::getBackColorGreen()
{
- return m_backgroundgreen;
+ return m_backgroundcolor[1];
}
float BlenderWorldInfo::getBackColorBlue()
{
- return m_backgroundblue;
+ return m_backgroundcolor[2];
}
float BlenderWorldInfo::getAmbientColorRed()
{
- return m_ambientred;
+ return m_ambientcolor[0];
}
float BlenderWorldInfo::getAmbientColorGreen()
{
- return m_ambientgreen;
+ return m_ambientcolor[1];
}
float BlenderWorldInfo::getAmbientColorBlue()
{
- return m_ambientblue;
+ return m_ambientcolor[2];
}
float BlenderWorldInfo::getMistStart()
@@ -172,23 +176,29 @@ float BlenderWorldInfo::getMistDistance()
float BlenderWorldInfo::getMistColorRed()
{
- return m_mistred;
+ return m_mistcolor[0];
}
float BlenderWorldInfo::getMistColorGreen()
{
- return m_mistgreen;
+ return m_mistcolor[1];
}
float BlenderWorldInfo::getMistColorBlue()
{
- return m_mistblue;
+ return m_mistcolor[2];
}
+void BlenderWorldInfo::setBackColor(float r, float g, float b)
+{
+ m_backgroundcolor[0] = r;
+ m_backgroundcolor[1] = g;
+ m_backgroundcolor[2] = b;
+}
void
BlenderWorldInfo::setMistStart(
@@ -210,7 +220,7 @@ BlenderWorldInfo::setMistDistance(
BlenderWorldInfo::setMistColorRed(
float d
) {
- m_mistred = d;
+ m_mistcolor[0] = d;
}
@@ -218,7 +228,7 @@ BlenderWorldInfo::setMistColorRed(
BlenderWorldInfo::setMistColorGreen(
float d
) {
- m_mistgreen = d;
+ m_mistcolor[1] = d;
}
@@ -226,5 +236,5 @@ BlenderWorldInfo::setMistColorGreen(
BlenderWorldInfo::setMistColorBlue(
float d
) {
- m_mistblue = d;
+ m_mistcolor[2] = d;
}
diff --git a/source/gameengine/Converter/BlenderWorldInfo.h b/source/gameengine/Converter/BlenderWorldInfo.h
index b500c55a7f2..e7b8784a076 100644
--- a/source/gameengine/Converter/BlenderWorldInfo.h
+++ b/source/gameengine/Converter/BlenderWorldInfo.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file BlenderWorldInfo.h
+ * \ingroup bgeconv
+ */
+
#ifndef __BLENDERWORLDINFO_H
#define __BLENDERWORLDINFO_H
#include "MT_CmMatrix4x4.h"
@@ -35,23 +40,17 @@
class BlenderWorldInfo : public KX_WorldInfo
{
bool m_hasworld;
- float m_backgroundred;
- float m_backgroundgreen;
- float m_backgroundblue;
+ float m_backgroundcolor[3];
bool m_hasmist;
float m_miststart;
float m_mistdistance;
- float m_mistred;
- float m_mistgreen;
- float m_mistblue;
+ float m_mistcolor[3];
- float m_ambientred;
- float m_ambientgreen;
- float m_ambientblue;
+ float m_ambientcolor[3];
public:
- BlenderWorldInfo(struct World* blenderworld);
+ BlenderWorldInfo(struct Scene *blenderscene, struct World* blenderworld);
~BlenderWorldInfo();
bool hasWorld();
@@ -70,6 +69,12 @@ public:
float getMistColorGreen();
float getMistColorBlue();
+ void
+ setBackColor(
+ float r,
+ float g,
+ float b
+ );
void
setMistStart(
float d
diff --git a/source/gameengine/Converter/CMakeLists.txt b/source/gameengine/Converter/CMakeLists.txt
index 97c367dd1f1..147c8b791ee 100644
--- a/source/gameengine/Converter/CMakeLists.txt
+++ b/source/gameengine/Converter/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -43,7 +41,6 @@ SET(INC
../../../source/blender/blenkernel
../../../source/blender/windowmanager
../../../source/blender
- ../../../source/blender/include
../../../source/blender/makesdna
../../../source/blender/makesrna
../../../source/gameengine/Rasterizer
@@ -56,17 +53,60 @@ SET(INC
../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Physics/Dummy
../../../source/gameengine/Network/LoopBackNetwork
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
../../../source/blender/ikplugin
../../../extern/bullet2/src
)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ BL_ActionActuator.cpp
+ BL_ArmatureActuator.cpp
+ BL_ArmatureChannel.cpp
+ BL_ArmatureConstraint.cpp
+ BL_ArmatureObject.cpp
+ BL_BlenderDataConversion.cpp
+ BL_DeformableGameObject.cpp
+ BL_MeshDeformer.cpp
+ BL_ModifierDeformer.cpp
+ BL_ShapeActionActuator.cpp
+ BL_ShapeDeformer.cpp
+ BL_SkinDeformer.cpp
+ BlenderWorldInfo.cpp
+ KX_BlenderScalarInterpolator.cpp
+ KX_BlenderSceneConverter.cpp
+ KX_ConvertActuators.cpp
+ KX_ConvertControllers.cpp
+ KX_ConvertProperties.cpp
+ KX_ConvertSensors.cpp
+ KX_IpoConvert.cpp
+ KX_SoftBodyDeformer.cpp
+
+ BL_ActionActuator.h
+ BL_ArmatureActuator.h
+ BL_ArmatureChannel.h
+ BL_ArmatureConstraint.h
+ BL_ArmatureObject.h
+ BL_BlenderDataConversion.h
+ BL_DeformableGameObject.h
+ BL_MeshDeformer.h
+ BL_ModifierDeformer.h
+ BL_ShapeActionActuator.h
+ BL_ShapeDeformer.h
+ BL_SkinDeformer.h
+ BlenderWorldInfo.h
+ KX_BlenderScalarInterpolator.h
+ KX_BlenderSceneConverter.h
+ KX_ConvertActuators.h
+ KX_ConvertControllers.h
+ KX_ConvertProperties.h
+ KX_ConvertSensors.h
+ KX_IpoConvert.h
+ KX_SoftBodyDeformer.h
+)
+
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+endif()
-BLENDERLIB(bf_converter "${SRC}" "${INC}")
+blender_add_lib(ge_converter "${SRC}" "${INC}")
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
index e325439b087..a9a3e66f996 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/KX_BlenderScalarInterpolator.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "KX_BlenderScalarInterpolator.h"
#include <cstring>
diff --git a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
index 7b49cbcf668..bd786bae969 100644
--- a/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
+++ b/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderScalarInterpolator.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_SCALARINTERPOLATOR_H
#define __KX_SCALARINTERPOLATOR_H
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 1ce6876dda1..a98fe87a0ef 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,8 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
- #pragma warning (disable:4786) // suppress stl-MSVC debug info warning
+/** \file gameengine/Converter/KX_BlenderSceneConverter.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
+#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#endif
#include "KX_Scene.h"
@@ -40,6 +45,7 @@
#include "KX_KetsjiEngine.h"
#include "KX_IPhysicsController.h"
#include "BL_Material.h"
+#include "BL_ActionActuator.h"
#include "KX_BlenderMaterial.h"
#include "KX_PolygonMaterial.h"
@@ -622,12 +628,6 @@ void KX_BlenderSceneConverter::RegisterWorldInfo(
m_worldinfos.push_back(pair<KX_Scene*,KX_WorldInfo*>(m_currentScene,worldinfo));
}
-//quick hack
-extern "C"
-{
- void mat3_to_compatible_eul( float *eul, float *oldrot,float mat[][3]);
-}
-
void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo)
{
@@ -782,8 +782,8 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
mat3_to_compatible_eul(blenderObject->rot, blenderObject->rot, tmat);
- insert_keyframe(&blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
- insert_keyframe(&blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
#if 0
const MT_Point3& position = gameObj->NodeGetWorldPosition();
@@ -911,7 +911,7 @@ void KX_BlenderSceneConverter::TestHandlesPhysicsObjectToAnimationIpo()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *KX_BlenderSceneConverter::GetPyNamespace()
{
return m_ketsjiEngine->GetPyNamespace();
@@ -960,7 +960,7 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
static char err_local[255];
/* only scene and mesh supported right now */
- if(idcode!=ID_SCE && idcode!=ID_ME) {
+ if(idcode!=ID_SCE && idcode!=ID_ME &&idcode!=ID_AC) {
snprintf(err_local, sizeof(err_local), "invalid ID type given \"%s\"\n", group);
return false;
}
@@ -1018,6 +1018,16 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
kx_scene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
}
}
+ else if(idcode==ID_AC) {
+ /* Convert all actions */
+ ID *action;
+ KX_Scene *kx_scene= m_currentScene;
+
+ for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
+ printf("ActionName: %s\n", action->name);
+ kx_scene->GetLogicManager()->RegisterActionName(action->name+2, action);
+ }
+ }
else if(idcode==ID_SCE) {
/* Merge all new linked in scene into the existing one */
ID *scene;
@@ -1092,6 +1102,23 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
}
}
}
+
+ /* Now unregister actions */
+ {
+ GEN_Map<STR_HashedString,void*> &mapStringToActions = scene->GetLogicManager()->GetActionMap();
+
+ for(int i=0; i<mapStringToActions.size(); i++)
+ {
+ ID *action= (ID*) *mapStringToActions.at(i);
+
+ if(IS_TAGGED(action))
+ {
+ STR_HashedString an = action->name+2;
+ mapStringToActions.remove(an);
+ i--;
+ }
+ }
+ }
//scene->FreeTagged(); /* removed tagged objects and meshes*/
CListValue *obj_lists[] = {scene->GetObjectList(), scene->GetInactiveList(), NULL};
@@ -1128,6 +1155,17 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
break;
}
}
+
+ /* make sure action actuators are not referencing tagged actions */
+ for (int act_idx=0; act_idx<gameobj->GetActuators().size(); act_idx++)
+ {
+ if (gameobj->GetActuators()[act_idx]->IsType(SCA_IActuator::KX_ACT_ACTION))
+ {
+ BL_ActionActuator *act = (BL_ActionActuator*)gameobj->GetActuators()[act_idx];
+ if(IS_TAGGED(act->GetAction()))
+ act->SetAction(NULL);
+ }
+ }
}
}
}
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h
index 20f3f863563..f99ed3aa412 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.h
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_BlenderSceneConverter.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_BLENDERSCENECONVERTER_H
#define __KX_BLENDERSCENECONVERTER_H
@@ -174,7 +179,7 @@ public:
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *GetPyNamespace();
#endif
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index 9b41470769f..b9e41d553b3 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,12 +28,15 @@
* Convert Blender actuators for use in the GameEngine
*/
-#ifdef WIN32
+/** \file gameengine/Converter/KX_ConvertActuators.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
-#define BLENDER_HACK_DTIME 0.02
-
#include "MEM_guardedalloc.h"
#include "KX_BlenderSceneConverter.h"
@@ -151,13 +154,6 @@ void BL_ConvertActuators(char* maggiename,
KX_BLENDERTRUNC(obact->angularvelocity[2]));
short damping = obact->damping;
- drotvec /= BLENDER_HACK_DTIME;
- //drotvec /= BLENDER_HACK_DTIME;
- drotvec *= MT_2_PI/360.0;
- //dlocvec /= BLENDER_HACK_DTIME;
- //linvelvec /= BLENDER_HACK_DTIME;
- //angvelvec /= BLENDER_HACK_DTIME;
-
/* Blender uses a bit vector internally for the local-flags. In */
/* KX, we have four bools. The compiler should be smart enough */
/* to do the right thing. We need to explicitly convert here! */
diff --git a/source/gameengine/Converter/KX_ConvertActuators.h b/source/gameengine/Converter/KX_ConvertActuators.h
index 82624f94b49..90bb3f3fabd 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.h
+++ b/source/gameengine/Converter/KX_ConvertActuators.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConvertActuators.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_CONVERTACTUATORS_H
#define __KX_CONVERTACTUATORS_H
diff --git a/source/gameengine/Converter/KX_ConvertControllers.cpp b/source/gameengine/Converter/KX_ConvertControllers.cpp
index a6b62ecb7b0..98afc3a690a 100644
--- a/source/gameengine/Converter/KX_ConvertControllers.cpp
+++ b/source/gameengine/Converter/KX_ConvertControllers.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/KX_ConvertControllers.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "MEM_guardedalloc.h"
#include "KX_BlenderSceneConverter.h"
@@ -153,7 +158,7 @@ void BL_ConvertControllers(
bPythonCont* pycont = (bPythonCont*) bcontr->data;
SCA_PythonController* pyctrl = new SCA_PythonController(gameobj, pycont->mode);
gamecontroller = pyctrl;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
pyctrl->SetNamespace(converter->GetPyNamespace());
@@ -183,7 +188,7 @@ void BL_ConvertControllers(
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
break;
}
@@ -210,11 +215,11 @@ void BL_ConvertControllers(
converter->RegisterGameController(gamecontroller, bcontr);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (bcontr->type==CONT_PYTHON) {
SCA_PythonController *pyctrl= static_cast<SCA_PythonController*>(gamecontroller);
/* not strictly needed but gives syntax errors early on and
- * gives more pradictable performance for larger scripts */
+ * gives more predictable performance for larger scripts */
if(pyctrl->m_mode==SCA_PythonController::SCA_PYEXEC_SCRIPT)
pyctrl->Compile();
else {
@@ -225,7 +230,7 @@ void BL_ConvertControllers(
// pyctrl->Import();
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//done with gamecontroller
gamecontroller->Release();
diff --git a/source/gameengine/Converter/KX_ConvertControllers.h b/source/gameengine/Converter/KX_ConvertControllers.h
index c251985abfb..c06c3825fd5 100644
--- a/source/gameengine/Converter/KX_ConvertControllers.h
+++ b/source/gameengine/Converter/KX_ConvertControllers.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConvertControllers.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_CONVERTCONTROLLERS_H
#define __KX_CONVERTCONTROLLERS_H
diff --git a/source/gameengine/Converter/KX_ConvertProperties.cpp b/source/gameengine/Converter/KX_ConvertProperties.cpp
index 44c0ad38909..33fd1e361d2 100644
--- a/source/gameengine/Converter/KX_ConvertProperties.cpp
+++ b/source/gameengine/Converter/KX_ConvertProperties.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Converter/KX_ConvertProperties.cpp
+ * \ingroup bgeconv
+ */
+
+
#include "KX_ConvertProperties.h"
@@ -126,7 +131,7 @@ void BL_ConvertProperties(Object* object,KX_GameObject* gameobj,SCA_TimeEventMan
propval->Release();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Warn if we double up on attributes, this isnt quite right since it wont find inherited attributes however there arnt many */
for(PyAttributeDef *attrdef = KX_GameObject::Attributes; attrdef->m_name; attrdef++) {
if(strcmp(prop->name, attrdef->m_name)==0) {
@@ -141,7 +146,7 @@ void BL_ConvertProperties(Object* object,KX_GameObject* gameobj,SCA_TimeEventMan
}
}
/* end warning check */
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
prop = prop->next;
}
diff --git a/source/gameengine/Converter/KX_ConvertProperties.h b/source/gameengine/Converter/KX_ConvertProperties.h
index 0fac2be0fe5..19c56fdc1d9 100644
--- a/source/gameengine/Converter/KX_ConvertProperties.h
+++ b/source/gameengine/Converter/KX_ConvertProperties.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConvertProperties.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_CONVERTPROPERTIES
#define __KX_CONVERTPROPERTIES
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index d65fee93a12..d0984c161ab 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,9 +28,14 @@
* Conversion of Blender data blocks to KX sensor system
*/
+/** \file gameengine/Converter/KX_ConvertSensors.cpp
+ * \ingroup bgeconv
+ */
+
+
#include <stdio.h>
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -39,7 +44,7 @@
#include "KX_ConvertSensors.h"
/* This little block needed for linking to Blender... */
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#include "BLI_winstuff.h"
#endif
diff --git a/source/gameengine/Converter/KX_ConvertSensors.h b/source/gameengine/Converter/KX_ConvertSensors.h
index db3c6146f18..75a58deedc8 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.h
+++ b/source/gameengine/Converter/KX_ConvertSensors.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConvertSensors.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_CONVERTSENSOR_H
#define __KX_CONVERTSENSOR_H
diff --git a/source/gameengine/Converter/KX_IpoConvert.cpp b/source/gameengine/Converter/KX_IpoConvert.cpp
index c983c8a5100..2ad56717e26 100644
--- a/source/gameengine/Converter/KX_IpoConvert.cpp
+++ b/source/gameengine/Converter/KX_IpoConvert.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,8 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Converter/KX_IpoConvert.cpp
+ * \ingroup bgeconv
+ */
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// don't show stl-warnings
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Converter/KX_IpoConvert.h b/source/gameengine/Converter/KX_IpoConvert.h
index 6178f00efb5..d77a72a82e2 100644
--- a/source/gameengine/Converter/KX_IpoConvert.h
+++ b/source/gameengine/Converter/KX_IpoConvert.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_IpoConvert.h
+ * \ingroup bgeconv
+ */
+
#ifndef __KX_IPOCONVERT_H
#define __KX_IPOCONVERT_H
diff --git a/source/gameengine/Converter/KX_SoftBodyDeformer.cpp b/source/gameengine/Converter/KX_SoftBodyDeformer.cpp
index 9d58a16ddfc..d3d17bbe433 100644
--- a/source/gameengine/Converter/KX_SoftBodyDeformer.cpp
+++ b/source/gameengine/Converter/KX_SoftBodyDeformer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,7 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Converter/KX_SoftBodyDeformer.cpp
+ * \ingroup bgeconv
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
diff --git a/source/gameengine/Converter/KX_SoftBodyDeformer.h b/source/gameengine/Converter/KX_SoftBodyDeformer.h
index ce3f695ef11..aa4ff9d5e54 100644
--- a/source/gameengine/Converter/KX_SoftBodyDeformer.h
+++ b/source/gameengine/Converter/KX_SoftBodyDeformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_SoftBodyDeformer.h
+ * \ingroup bgeconv
+ */
+
#ifndef KX_SOFTBODYDEFORMER
#define KX_SOFTBODYDEFORMER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
diff --git a/source/gameengine/Converter/Makefile b/source/gameengine/Converter/Makefile
deleted file mode 100644
index 142841b2b36..00000000000
--- a/source/gameengine/Converter/Makefile
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blconverter
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../../blender
-# these two needed because of blenkernel
-CPPFLAGS += -I../../blender/windowmanager
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/makesrna
-CPPFLAGS += -I../../blender/editors/include
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I../../blender/ikplugin
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../Expressions -I../Rasterizer -I../GameLogic
-CPPFLAGS += -I../Ketsji -I../BlenderRoutines -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Network -I../Ketsji/KXNetwork
-CPPFLAGS += -I../Physics/common -I../Physics/Dummy
-CPPFLAGS += -I../Physics/BlOde
-CPPFLAGS += -I../Physics/Bullet
-CPPFLAGS += -I.
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index ab1d7574d89..78e0f3db01b 100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
@@ -28,8 +28,19 @@ if env['BF_DEBUG']:
defs.append('_DEBUG')
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
-env.BlenderLib ( 'bf_converter', sources, Split(incs), defs, libtype=['core','player'], priority=[305,40], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_converter', sources, Split(incs), defs, libtype=['core','player'], priority=[305,40], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Expressions/BoolValue.cpp b/source/gameengine/Expressions/BoolValue.cpp
index e6bb454a1b5..113d12b7d59 100644
--- a/source/gameengine/Expressions/BoolValue.cpp
+++ b/source/gameengine/Expressions/BoolValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/BoolValue.cpp
+ * \ingroup expressions
+ */
// BoolValue.cpp: implementation of the CBoolValue class.
/*
@@ -201,9 +204,9 @@ CValue* CBoolValue::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CBoolValue::ConvertValueToPython()
{
return PyBool_FromLong(m_bool != 0);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/BoolValue.h b/source/gameengine/Expressions/BoolValue.h
index dac70e3c0b7..a88bcf98e77 100644
--- a/source/gameengine/Expressions/BoolValue.h
+++ b/source/gameengine/Expressions/BoolValue.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file BoolValue.h
+ * \ingroup expressions
+ */
+
#if !defined _BOOLVALUE_H
#define _BOOLVALUE_H
@@ -45,7 +50,7 @@ public:
void Configure(CValue* menuvalue);
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/CMakeLists.txt b/source/gameengine/Expressions/CMakeLists.txt
index 85b5daa3b4a..c593c690614 100644
--- a/source/gameengine/Expressions/CMakeLists.txt
+++ b/source/gameengine/Expressions/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -36,10 +34,48 @@ SET(INC
../../../source/blender/blenloader
)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ BoolValue.cpp
+ ConstExpr.cpp
+ EXP_C-Api.cpp
+ EmptyValue.cpp
+ ErrorValue.cpp
+ Expression.cpp
+ FloatValue.cpp
+ IdentifierExpr.cpp
+ IfExpr.cpp
+ InputParser.cpp
+ IntValue.cpp
+ KX_HashedPtr.cpp
+ ListValue.cpp
+ Operator1Expr.cpp
+ Operator2Expr.cpp
+ PyObjectPlus.cpp
+ StringValue.cpp
+ Value.cpp
+ VectorValue.cpp
+
+ BoolValue.h
+ ConstExpr.h
+ EXP_C-Api.h
+ EmptyValue.h
+ ErrorValue.h
+ Expression.h
+ FloatValue.h
+ IdentifierExpr.h
+ IfExpr.h
+ InputParser.h
+ IntValue.h
+ KX_HashedPtr.h
+ KX_Python.h
+ ListValue.h
+ Operator1Expr.h
+ Operator2Expr.h
+ PyObjectPlus.h
+ StringValue.h
+ Value.h
+ VectorValue.h
+ VoidValue.h
+)
-BLENDERLIB(bf_expressions "${SRC}" "${INC}")
+blender_add_lib(ge_logic_expressions "${SRC}" "${INC}")
diff --git a/source/gameengine/Expressions/ConstExpr.cpp b/source/gameengine/Expressions/ConstExpr.cpp
index e873e968c86..8d5a47b2d0d 100644
--- a/source/gameengine/Expressions/ConstExpr.cpp
+++ b/source/gameengine/Expressions/ConstExpr.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/ConstExpr.cpp
+ * \ingroup expressions
+ */
// ConstExpr.cpp: implementation of the CConstExpr class.
/*
diff --git a/source/gameengine/Expressions/ConstExpr.h b/source/gameengine/Expressions/ConstExpr.h
index aef2ddc2467..07278eb03f6 100644
--- a/source/gameengine/Expressions/ConstExpr.h
+++ b/source/gameengine/Expressions/ConstExpr.h
@@ -13,6 +13,10 @@
*
*/
+/** \file ConstExpr.h
+ * \ingroup expressions
+ */
+
#ifndef __CONSTEXPR_H__
#define __CONSTEXPR_H__
diff --git a/source/gameengine/Expressions/EXP_C-Api.cpp b/source/gameengine/Expressions/EXP_C-Api.cpp
index d97e13b7784..a5d0ce5e8f8 100644
--- a/source/gameengine/Expressions/EXP_C-Api.cpp
+++ b/source/gameengine/Expressions/EXP_C-Api.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Expressions/EXP_C-Api.cpp
+ * \ingroup expressions
+ */
+
#include "EXP_C-Api.h"
#include "IntValue.h"
#include "BoolValue.h"
diff --git a/source/gameengine/Expressions/EXP_C-Api.h b/source/gameengine/Expressions/EXP_C-Api.h
index 12fdc4945e7..89156033be5 100644
--- a/source/gameengine/Expressions/EXP_C-Api.h
+++ b/source/gameengine/Expressions/EXP_C-Api.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file EXP_C-Api.h
+ * \ingroup expressions
+ */
+
#ifndef __EXPRESSION_INCLUDE
#define __EXPRESSION_INCLUDE
diff --git a/source/gameengine/Expressions/EmptyValue.cpp b/source/gameengine/Expressions/EmptyValue.cpp
index 22215ba5ed1..2bb8f69ac51 100644
--- a/source/gameengine/Expressions/EmptyValue.cpp
+++ b/source/gameengine/Expressions/EmptyValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/EmptyValue.cpp
+ * \ingroup expressions
+ */
// EmptyValue.cpp: implementation of the CEmptyValue class.
/*
diff --git a/source/gameengine/Expressions/EmptyValue.h b/source/gameengine/Expressions/EmptyValue.h
index f00bc6cfcd7..1b1c1159169 100644
--- a/source/gameengine/Expressions/EmptyValue.h
+++ b/source/gameengine/Expressions/EmptyValue.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file EmptyValue.h
+ * \ingroup expressions
+ */
+
#if !defined _EMPTYVALUE_H
#define _EMPTYVALUE_H
diff --git a/source/gameengine/Expressions/ErrorValue.cpp b/source/gameengine/Expressions/ErrorValue.cpp
index 3063d02d69d..db5be0d2ee1 100644
--- a/source/gameengine/Expressions/ErrorValue.cpp
+++ b/source/gameengine/Expressions/ErrorValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/ErrorValue.cpp
+ * \ingroup expressions
+ */
// ErrorValue.cpp: implementation of the CErrorValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/ErrorValue.h b/source/gameengine/Expressions/ErrorValue.h
index 6bd131b762d..7f18e751af9 100644
--- a/source/gameengine/Expressions/ErrorValue.h
+++ b/source/gameengine/Expressions/ErrorValue.h
@@ -13,6 +13,10 @@
*
*/
+/** \file ErrorValue.h
+ * \ingroup expressions
+ */
+
#if !defined _ERRORVALUE_H
#define _ERRORVALUE_H
diff --git a/source/gameengine/Expressions/Expression.cpp b/source/gameengine/Expressions/Expression.cpp
index 7ef0d4cc84c..9ed0ae9ab0d 100644
--- a/source/gameengine/Expressions/Expression.cpp
+++ b/source/gameengine/Expressions/Expression.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/Expression.cpp
+ * \ingroup expressions
+ */
// Expression.cpp: implementation of the CExpression class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/Expression.h b/source/gameengine/Expressions/Expression.h
index de0c0821727..c285fa118c1 100644
--- a/source/gameengine/Expressions/Expression.h
+++ b/source/gameengine/Expressions/Expression.h
@@ -13,6 +13,10 @@
*
*/
+/** \file Expression.h
+ * \ingroup expressions
+ */
+
#if !defined _EXPRESSION_H
#define _EXPRESSION_H
diff --git a/source/gameengine/Expressions/FloatValue.cpp b/source/gameengine/Expressions/FloatValue.cpp
index 82c86ac68b2..403338573e2 100644
--- a/source/gameengine/Expressions/FloatValue.cpp
+++ b/source/gameengine/Expressions/FloatValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/FloatValue.cpp
+ * \ingroup expressions
+ */
// FloatValue.cpp: implementation of the CFloatValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
@@ -310,9 +313,9 @@ CValue* CFloatValue::GetReplica()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CFloatValue::ConvertValueToPython()
{
return PyFloat_FromDouble(m_float);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/FloatValue.h b/source/gameengine/Expressions/FloatValue.h
index 49d4efa9f74..535939e1758 100644
--- a/source/gameengine/Expressions/FloatValue.h
+++ b/source/gameengine/Expressions/FloatValue.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file FloatValue.h
+ * \ingroup expressions
+ */
+
#if !defined _FLOATVALUE_H
#define _FLOATVALUE_H
@@ -36,7 +41,7 @@ public:
virtual CValue* GetReplica();
virtual CValue* Calc(VALUE_OPERATOR op, CValue *val);
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/IdentifierExpr.cpp b/source/gameengine/Expressions/IdentifierExpr.cpp
index 3cbd5b748d1..e469709c9b2 100644
--- a/source/gameengine/Expressions/IdentifierExpr.cpp
+++ b/source/gameengine/Expressions/IdentifierExpr.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Expressions/IdentifierExpr.cpp
+ * \ingroup expressions
+ */
+
+
#include "IdentifierExpr.h"
CIdentifierExpr::CIdentifierExpr(const STR_String& identifier,CValue* id_context)
diff --git a/source/gameengine/Expressions/IdentifierExpr.h b/source/gameengine/Expressions/IdentifierExpr.h
index 0e67b17a9c2..676b1b11607 100644
--- a/source/gameengine/Expressions/IdentifierExpr.h
+++ b/source/gameengine/Expressions/IdentifierExpr.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file IdentifierExpr.h
+ * \ingroup expressions
+ */
+
#ifndef __IDENTIFIER_EXPR
#define __IDENTIFIER_EXPR
diff --git a/source/gameengine/Expressions/IfExpr.cpp b/source/gameengine/Expressions/IfExpr.cpp
index 0aa9cfbd3c6..9e6d80ab468 100644
--- a/source/gameengine/Expressions/IfExpr.cpp
+++ b/source/gameengine/Expressions/IfExpr.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/IfExpr.cpp
+ * \ingroup expressions
+ */
// IfExpr.cpp: implementation of the CIfExpr class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/IfExpr.h b/source/gameengine/Expressions/IfExpr.h
index b2a953bd36d..5ac8d835afd 100644
--- a/source/gameengine/Expressions/IfExpr.h
+++ b/source/gameengine/Expressions/IfExpr.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file IfExpr.h
+ * \ingroup expressions
+ */
+
#if !defined(AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_)
#define AFX_IFEXPR_H__1F691841_C5C7_11D1_A863_0000B4542BD8__INCLUDED_
diff --git a/source/gameengine/Expressions/InputParser.cpp b/source/gameengine/Expressions/InputParser.cpp
index 8187ff6a9e8..7957c82e7f9 100644
--- a/source/gameengine/Expressions/InputParser.cpp
+++ b/source/gameengine/Expressions/InputParser.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/InputParser.cpp
+ * \ingroup expressions
+ */
// Parser.cpp: implementation of the CParser class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
@@ -151,6 +154,28 @@ void CParser::GrabString(int start)
+void CParser::GrabRealString(int start)
+{
+ // works like GrabString but converting \\n to \n
+ // puts part of the input string into the global variable
+ // const_as_string, from position start, to position chchount
+
+ int i;
+ char tmpch;
+
+ const_as_string = STR_String();
+ for (i=start;i<chcount;i++) {
+ tmpch= text[i];
+ if ((tmpch =='\\') && (text[i+1] == 'n')){
+ tmpch = '\n';
+ i++;
+ }
+ const_as_string += tmpch;
+ }
+}
+
+
+
void CParser::NextSym()
{
// sets the global variable sym to the next symbol, and
@@ -244,7 +269,7 @@ void CParser::NextSym()
start = chcount;
while ((ch != '\"') && (ch != 0x0))
NextCh();
- GrabString(start);
+ GrabRealString(start);
TermChar('\"'); // check for eol before '\"'
break;
}
diff --git a/source/gameengine/Expressions/InputParser.h b/source/gameengine/Expressions/InputParser.h
index b640d4eedc7..d5a9295ab8b 100644
--- a/source/gameengine/Expressions/InputParser.h
+++ b/source/gameengine/Expressions/InputParser.h
@@ -14,6 +14,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file InputParser.h
+ * \ingroup expressions
+ */
+
#ifndef __INPUTPARSER_H__
#define __INPUTPARSER_H__
@@ -93,6 +98,7 @@ private:
void DigRep();
void CharRep();
void GrabString(int start);
+ void GrabRealString(int start);
void NextSym();
#if 0 /* not used yet */
int MakeInt();
diff --git a/source/gameengine/Expressions/IntValue.cpp b/source/gameengine/Expressions/IntValue.cpp
index 83e57200db0..cf0aed181bb 100644
--- a/source/gameengine/Expressions/IntValue.cpp
+++ b/source/gameengine/Expressions/IntValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/IntValue.cpp
+ * \ingroup expressions
+ */
// IntValue.cpp: implementation of the CIntValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
@@ -322,7 +325,7 @@ void CIntValue::SetValue(CValue* newval)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* CIntValue::ConvertValueToPython()
{
if((m_int > INT_MIN) && (m_int < INT_MAX))
@@ -330,4 +333,4 @@ PyObject* CIntValue::ConvertValueToPython()
else
return PyLong_FromLongLong(m_int);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/IntValue.h b/source/gameengine/Expressions/IntValue.h
index 63efea56d14..5460f744de3 100644
--- a/source/gameengine/Expressions/IntValue.h
+++ b/source/gameengine/Expressions/IntValue.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file IntValue.h
+ * \ingroup expressions
+ */
+
#if !defined _INTVALUE_H
#define _INTVALUE_H
@@ -48,7 +53,7 @@ public:
void AddConfigurationData(CValue* menuvalue);
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython();
#endif
diff --git a/source/gameengine/Expressions/KX_HashedPtr.cpp b/source/gameengine/Expressions/KX_HashedPtr.cpp
index 1743e55c2bf..f3233732ee3 100644
--- a/source/gameengine/Expressions/KX_HashedPtr.cpp
+++ b/source/gameengine/Expressions/KX_HashedPtr.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Expressions/KX_HashedPtr.cpp
+ * \ingroup expressions
+ */
+
+
#include "KX_HashedPtr.h"
unsigned int KX_Hash(void * inDWord)
diff --git a/source/gameengine/Expressions/KX_HashedPtr.h b/source/gameengine/Expressions/KX_HashedPtr.h
index 09332377918..77e581360e7 100644
--- a/source/gameengine/Expressions/KX_HashedPtr.h
+++ b/source/gameengine/Expressions/KX_HashedPtr.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_HashedPtr.h
+ * \ingroup expressions
+ */
+
#ifndef __KX_HASHEDPTR
#define __KX_HASHEDPTR
diff --git a/source/gameengine/Expressions/KX_Python.h b/source/gameengine/Expressions/KX_Python.h
index 7901d5226f7..9d295e1910e 100644
--- a/source/gameengine/Expressions/KX_Python.h
+++ b/source/gameengine/Expressions/KX_Python.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_Python.h
+ * \ingroup expressions
+ */
+
#ifndef KX_PYTHON_H
#define KX_PYTHON_H
@@ -40,7 +45,7 @@
#undef _POSIX_C_SOURCE
#endif
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "Python.h"
#define USE_MATHUTILS // Blender 2.5x api will use mathutils, for a while we might want to test without it
@@ -66,5 +71,15 @@
#endif
#endif
+#ifdef __APPLE__
+#undef isalnum
+#undef isalpha
+#undef islower
+#undef isspace
+#undef isupper
+#undef tolower
+#undef toupper
+#endif
+
#endif // KX_PYTHON_H
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index 4d9d82efb98..271d5067dd9 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/ListValue.cpp
+ * \ingroup expressions
+ */
// ListValue.cpp: implementation of the CListValue class.
//
//////////////////////////////////////////////////////////////////////
@@ -268,7 +271,7 @@ bool CListValue::IsModified()
return bmod;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -674,4 +677,4 @@ PyObject* CListValue::Pyfrom_id(PyObject* value)
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/ListValue.h b/source/gameengine/Expressions/ListValue.h
index 8f3b9dcda0b..c1530d86d8c 100644
--- a/source/gameengine/Expressions/ListValue.h
+++ b/source/gameengine/Expressions/ListValue.h
@@ -13,6 +13,10 @@
*
*/
+/** \file ListValue.h
+ * \ingroup expressions
+ */
+
#if !defined _LISTVALUE_H
#define _LISTVALUE_H
@@ -60,7 +64,7 @@ public:
bool CheckEqual(CValue* first,CValue* second);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* py_repr(void) {
PyObject *py_proxy= this->GetProxy();
PyObject *py_list= PySequence_List(py_proxy);
diff --git a/source/gameengine/Expressions/Makefile b/source/gameengine/Expressions/Makefile
deleted file mode 100644
index 892a8c2b246..00000000000
--- a/source/gameengine/Expressions/Makefile
+++ /dev/null
@@ -1,46 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = expression
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../../gameengine/SceneGraph
-
diff --git a/source/gameengine/Expressions/Operator1Expr.cpp b/source/gameengine/Expressions/Operator1Expr.cpp
index ca852020e5a..0ef35108233 100644
--- a/source/gameengine/Expressions/Operator1Expr.cpp
+++ b/source/gameengine/Expressions/Operator1Expr.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/Operator1Expr.cpp
+ * \ingroup expressions
+ */
// Operator1Expr.cpp: implementation of the COperator1Expr class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/Operator1Expr.h b/source/gameengine/Expressions/Operator1Expr.h
index 62f178fb9f7..c6fce709248 100644
--- a/source/gameengine/Expressions/Operator1Expr.h
+++ b/source/gameengine/Expressions/Operator1Expr.h
@@ -13,6 +13,10 @@
*
*/
+/** \file Operator1Expr.h
+ * \ingroup expressions
+ */
+
#if !defined(AFX_OPERATOR1EXPR_H__A1653901_BF41_11D1_A51C_00A02472FC58__INCLUDED_)
#define AFX_OPERATOR1EXPR_H__A1653901_BF41_11D1_A51C_00A02472FC58__INCLUDED_
diff --git a/source/gameengine/Expressions/Operator2Expr.cpp b/source/gameengine/Expressions/Operator2Expr.cpp
index 9428559c607..7a012c4165c 100644
--- a/source/gameengine/Expressions/Operator2Expr.cpp
+++ b/source/gameengine/Expressions/Operator2Expr.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/Operator2Expr.cpp
+ * \ingroup expressions
+ */
// Operator2Expr.cpp: implementation of the COperator2Expr class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/Operator2Expr.h b/source/gameengine/Expressions/Operator2Expr.h
index 73ea177f0d0..3b4d604c254 100644
--- a/source/gameengine/Expressions/Operator2Expr.h
+++ b/source/gameengine/Expressions/Operator2Expr.h
@@ -13,6 +13,10 @@
*
*/
+/** \file Operator2Expr.h
+ * \ingroup expressions
+ */
+
#if !defined _OPERATOR2EXPR_H
#define _OPERATOR2EXPR_H
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp
index 32bf4ba95c4..e205ddfda2e 100644
--- a/source/gameengine/Expressions/PyObjectPlus.cpp
+++ b/source/gameengine/Expressions/PyObjectPlus.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Expressions/PyObjectPlus.cpp
+ * \ingroup expressions
+ */
+
+
/*------------------------------
* PyObjectPlus cpp
*
@@ -49,7 +54,7 @@
PyObjectPlus::~PyObjectPlus()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_proxy) {
BGE_PROXY_REF(m_proxy)= NULL;
Py_DECREF(m_proxy); /* Remove own reference, python may still have 1 */
@@ -60,14 +65,14 @@ PyObjectPlus::~PyObjectPlus()
PyObjectPlus::PyObjectPlus() : SG_QList() // constructor
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_proxy= NULL;
#endif
};
void PyObjectPlus::ProcessReplica()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Clear the proxy, will be created again if needed with GetProxy()
* otherwise the PyObject will point to the wrong reference */
m_proxy= NULL;
@@ -84,7 +89,7 @@ void PyObjectPlus::ProcessReplica()
*/
void PyObjectPlus::InvalidateProxy() // check typename of each parent
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_proxy) {
BGE_PROXY_REF(m_proxy)=NULL;
Py_DECREF(m_proxy);
@@ -94,7 +99,7 @@ void PyObjectPlus::InvalidateProxy() // check typename of each parent
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*------------------------------
* PyObjectPlus Type -- Every class, even the abstract one should have a Type
@@ -103,19 +108,26 @@ void PyObjectPlus::InvalidateProxy() // check typename of each parent
PyTypeObject PyObjectPlus::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "PyObjectPlus", /*tp_name*/
+ "PyObjectPlus", /*tp_name*/
sizeof(PyObjectPlus_Proxy), /*tp_basicsize*/
- 0, /*tp_itemsize*/
+ 0, /*tp_itemsize*/
/* methods */
- py_base_dealloc,
- 0,
- 0,
- 0,
+ py_base_dealloc, /* tp_dealloc */
+ 0, /* printfunc tp_print; */
+ 0, /* getattrfunc tp_getattr; */
+ 0, /* setattrfunc tp_setattr; */
+ 0, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ py_base_repr, /* tp_repr */
+ 0,0,0,0,0,0,0,0,0, /* Method suites for standard classes */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,/* long tp_flags; */
+ 0,0,0,0,
+ /* weak reference enabler */
+#ifdef USE_WEAKREFS
+ offsetof(PyObjectPlus_Proxy, in_weakreflist), /* long tp_weaklistoffset; */
+#else
0,
- py_base_repr,
- 0,0,0,0,0,0,0,0,0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- 0,0,0,0,0,0,0,
+#endif
+ 0,0,
Methods,
0,
0,
@@ -204,8 +216,16 @@ PyObject * PyObjectPlus::py_base_new(PyTypeObject *type, PyObject *args, PyObjec
return (PyObject *)ret;
}
+/**
+ * @param self A PyObjectPlus_Proxy
+ */
void PyObjectPlus::py_base_dealloc(PyObject *self) // python wrapper
{
+#ifdef USE_WEAKREFS
+ if (BGE_PROXY_WKREF(self) != NULL)
+ PyObject_ClearWeakRefs((PyObject *) self);
+#endif
+
if (BGE_PROXY_PYREF(self)) {
PyObjectPlus *self_plus= BGE_PROXY_REF(self);
if(self_plus) {
@@ -1102,6 +1122,9 @@ PyObject *PyObjectPlus::GetProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, v
self->m_proxy = reinterpret_cast<PyObject *>PyObject_NEW( PyObjectPlus_Proxy, tp);
BGE_PROXY_PYOWNS(self->m_proxy) = false;
BGE_PROXY_PYREF(self->m_proxy) = true;
+#ifdef USE_WEAKREFS
+ BGE_PROXY_WKREF(self->m_proxy) = NULL;
+#endif
}
//PyObject_Print(self->m_proxy, stdout, 0);
//printf("ref %d\n", self->m_proxy->ob_refcnt);
@@ -1122,6 +1145,9 @@ PyObject *PyObjectPlus::NewProxyPlus_Ext(PyObjectPlus *self, PyTypeObject *tp, v
BGE_PROXY_PYOWNS(proxy) = py_owns;
BGE_PROXY_REF(proxy) = NULL;
BGE_PROXY_PTR(proxy) = ptr;
+#ifdef USE_WEAKREFS
+ BGE_PROXY_WKREF(self->m_proxy) = NULL;
+#endif
return proxy;
}
if (self->m_proxy)
@@ -1224,4 +1250,4 @@ void PyObjectPlus::SetDeprecationWarningFirst(WarnLink* wlink) {m_base_wlink_f
void PyObjectPlus::SetDeprecationWarningLinkLast(WarnLink* wlink) {m_base_wlink_last= wlink;}
void PyObjectPlus::NullDeprecationWarning() {m_base_wlink_first= m_base_wlink_last= NULL;}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 625549a272e..7d06cc64ee9 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file PyObjectPlus.h
+ * \ingroup expressions
+ */
+
+/* for now keep weakrefs optional */
+#define USE_WEAKREFS
+
#ifndef _adr_py_lib_h_ // only process once,
#define _adr_py_lib_h_ // even if multiply included
@@ -43,7 +50,7 @@
* Python defines
------------------------------*/
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#ifdef USE_MATHUTILS
extern "C" {
#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */
@@ -91,6 +98,9 @@ typedef struct PyObjectPlus_Proxy {
void *ptr; // optional pointer to generic structure, the structure holds no reference to this proxy
bool py_owns; // true if the object pointed by ref should be deleted when the proxy is deleted
bool py_ref; // true if proxy is connected to a GE object (ref is used)
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist; // weak reference enabler
+#endif
} PyObjectPlus_Proxy;
#define BGE_PROXY_ERROR_MSG "Blender Game Engine data has been freed, cannot use this python variable"
@@ -98,6 +108,9 @@ typedef struct PyObjectPlus_Proxy {
#define BGE_PROXY_PTR(_self) (((PyObjectPlus_Proxy *)_self)->ptr)
#define BGE_PROXY_PYOWNS(_self) (((PyObjectPlus_Proxy *)_self)->py_owns)
#define BGE_PROXY_PYREF(_self) (((PyObjectPlus_Proxy *)_self)->py_ref)
+#ifdef USE_WEAKREFS
+ #define BGE_PROXY_WKREF(_self) (((PyObjectPlus_Proxy *)_self)->in_weakreflist)
+#endif
/* Note, sometimes we dont care what BGE type this is as long as its a proxy */
#define BGE_PROXY_CHECK_TYPE(_type) ((_type)->tp_dealloc == PyObjectPlus::py_base_dealloc)
@@ -169,35 +182,35 @@ typedef struct PyObjectPlus_Proxy {
#define KX_PYMETHOD(class_name, method_name) \
PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds); \
}; \
#define KX_PYMETHOD_VARARGS(class_name, method_name) \
PyObject* Py##method_name(PyObject* args); \
static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args); \
}; \
#define KX_PYMETHOD_NOARGS(class_name, method_name) \
PyObject* Py##method_name(); \
static PyObject* sPy##method_name( PyObject* self) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(); \
}; \
#define KX_PYMETHOD_O(class_name, method_name) \
PyObject* Py##method_name(PyObject* value); \
static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value); \
}; \
#define KX_PYMETHOD_DOC(class_name, method_name) \
PyObject* Py##method_name(PyObject* args, PyObject* kwds); \
static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds); \
}; \
static const char method_name##_doc[]; \
@@ -205,7 +218,7 @@ typedef struct PyObjectPlus_Proxy {
#define KX_PYMETHOD_DOC_VARARGS(class_name, method_name) \
PyObject* Py##method_name(PyObject* args); \
static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args); \
}; \
static const char method_name##_doc[]; \
@@ -213,7 +226,7 @@ typedef struct PyObjectPlus_Proxy {
#define KX_PYMETHOD_DOC_O(class_name, method_name) \
PyObject* Py##method_name(PyObject* value); \
static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value); \
}; \
static const char method_name##_doc[]; \
@@ -221,7 +234,7 @@ typedef struct PyObjectPlus_Proxy {
#define KX_PYMETHOD_DOC_NOARGS(class_name, method_name) \
PyObject* Py##method_name(); \
static PyObject* sPy##method_name( PyObject* self) { \
- if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
+ if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \
return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(); \
}; \
static const char method_name##_doc[]; \
@@ -459,8 +472,9 @@ typedef struct KX_PYATTRIBUTE_DEF {
------------------------------*/
typedef PyTypeObject * PyParentObject; // Define the PyParent Object
-#else // DISABLE_PYTHON
+#else // WITH_PYTHON
+#ifdef WITH_CXX_GUARDEDALLOC
#define Py_Header \
public: \
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlus"); } \
@@ -471,6 +485,16 @@ typedef PyTypeObject * PyParentObject; // Define the PyParent Object
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:PyObjectPlusPtr"); } \
void operator delete( void *mem ) { MEM_freeN(mem); } \
+#else // WITH_CXX_GUARDEDALLOC
+
+#define Py_Header \
+ public: \
+
+#define Py_HeaderPtr \
+ public: \
+
+#endif // WITH_CXX_GUARDEDALLOC
+
#endif
@@ -494,7 +518,7 @@ public:
virtual ~PyObjectPlus(); // destructor
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *m_proxy; /* actually a PyObjectPlus_Proxy */
/* These static functions are referenced by ALL PyObjectPlus_Proxy types
@@ -550,7 +574,7 @@ public:
static bool m_ignore_deprecation_warnings;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject *py_getattr_dict(PyObject *pydict, PyObject *tp_dict);
#endif
diff --git a/source/gameengine/Expressions/SConscript b/source/gameengine/Expressions/SConscript
index 007d6373c77..201b0da9d2e 100644
--- a/source/gameengine/Expressions/SConscript
+++ b/source/gameengine/Expressions/SConscript
@@ -8,8 +8,16 @@ incs ='. #source/kernel/gen_system #intern/guardedalloc #intern/string #intern/m
defs = []
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
-env.BlenderLib ( 'bf_expressions', sources, Split(incs), defs, libtype=['core','player'], priority = [360,80], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_logic_expressions', sources, Split(incs), defs, libtype=['core','player'], priority = [360,80], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Expressions/StringValue.cpp b/source/gameengine/Expressions/StringValue.cpp
index d0aa8d26678..29c72a29b71 100644
--- a/source/gameengine/Expressions/StringValue.cpp
+++ b/source/gameengine/Expressions/StringValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/StringValue.cpp
+ * \ingroup expressions
+ */
// StringValue.cpp: implementation of the CStringValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
diff --git a/source/gameengine/Expressions/StringValue.h b/source/gameengine/Expressions/StringValue.h
index d28e435e2a7..6afe7fa5935 100644
--- a/source/gameengine/Expressions/StringValue.h
+++ b/source/gameengine/Expressions/StringValue.h
@@ -13,6 +13,10 @@
*
*/
+/** \file StringValue.h
+ * \ingroup expressions
+ */
+
#ifndef __STRINGVALUE_H__
#define __STRINGVALUE_H__
@@ -39,11 +43,11 @@ public:
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
virtual void SetValue(CValue* newval) { m_strString = newval->GetText(); SetModified(true); };
virtual CValue* GetReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython() {
return PyUnicode_FromString(m_strString.Ptr());
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
// data member
diff --git a/source/gameengine/Expressions/Value.cpp b/source/gameengine/Expressions/Value.cpp
index 1f4f961268b..e60b380e95c 100644
--- a/source/gameengine/Expressions/Value.cpp
+++ b/source/gameengine/Expressions/Value.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/Value.cpp
+ * \ingroup expressions
+ */
// Value.cpp: implementation of the CValue class.
// developed at Eindhoven University of Technology, 1997
// by the OOPS team
@@ -29,7 +32,7 @@
double CValue::m_sZeroVec[3] = {0.0,0.0,0.0};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyTypeObject CValue::Type = {
PyVarObject_HEAD_INIT(NULL, 0)
@@ -60,7 +63,7 @@ PyTypeObject CValue::Type = {
PyMethodDef CValue::Methods[] = {
{NULL,NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/*#define CVALUE_DEBUG*/
@@ -520,7 +523,7 @@ CValue* CValue::FindIdentifier(const STR_String& identifiername)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyAttributeDef CValue::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", CValue, pyattr_get_name),
@@ -611,7 +614,7 @@ PyObject* CValue::ConvertKeysToPython( void )
return pylist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
///////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/gameengine/Expressions/Value.h b/source/gameengine/Expressions/Value.h
index 2bb9e39cafc..ef7edd397b7 100644
--- a/source/gameengine/Expressions/Value.h
+++ b/source/gameengine/Expressions/Value.h
@@ -13,29 +13,14 @@
*
*/
-#ifdef WIN32
+/** \file Value.h
+ * \ingroup expressions
+ */
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif //WIN32
-/////////////////////////////////////////////////////////////////////////////////////
-//// Baseclass CValue
-//// Together with CExpression, CValue and it's derived classes can be used to
-//// parse expressions into a parsetree with error detecting/correcting capabilities
-//// also expandible by a CFactory pluginsystem
-////
-//// Features:
-//// Reference Counting (AddRef() / Release())
-//// Calculations (Calc() / CalcFinal())
-//// Configuration (Configure())
-//// Serialization (EdSerialize() / EdIdSerialize() / EdPtrSerialize() and macro PLUGIN_DECLARE_SERIAL
-//// Property system (SetProperty() / GetProperty() / FindIdentifier())
-//// Replication (GetReplica())
-//// Flags (IsSelected() / IsModified() / SetSelected()...)
-////
-//// Some small editor-specific things added
-//// A helperclass CompressorArchive handles the serialization
-////
-/////////////////////////////////////////////////////////////////////////////////////
#ifndef __VALUE_H__
#define __VALUE_H__
@@ -75,8 +60,6 @@
#endif //WIN32
#endif
-#define EDITOR_LEVEL_VERSION 0x06
-
enum VALUE_OPERATOR {
VALUE_MOD_OPERATOR, // %
@@ -186,21 +169,35 @@ public:
#endif
};
-//
-// CValue
-//
-// Base class for all editor functionality, flexible object type that allows
-// calculations and uses reference counting for memory management.
-//
-//
-
-
-
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "object.h"
#endif
+
+/**
+ * Baseclass CValue
+ *
+ * Together with CExpression, CValue and it's derived classes can be used to
+ * parse expressions into a parsetree with error detecting/correcting capabilities
+ * also expandible by a CFactory pluginsystem
+ *
+ * Base class for all editor functionality, flexible object type that allows
+ * calculations and uses reference counting for memory management.
+ *
+ * Features:
+ * - Reference Counting (AddRef() / Release())
+ * - Calculations (Calc() / CalcFinal())
+ * - Configuration (Configure())
+ * - Serialization (EdSerialize() / EdIdSerialize() / EdPtrSerialize() and macro PLUGIN_DECLARE_SERIAL
+ * - Property system (SetProperty() / GetProperty() / FindIdentifier())
+ * - Replication (GetReplica())
+ * - Flags (IsSelected() / IsModified() / SetSelected()...)
+ *
+ * - Some small editor-specific things added
+ * - A helperclass CompressorArchive handles the serialization
+ *
+ */
class CValue : public PyObjectPlus
{
@@ -221,7 +218,7 @@ public:
// Construction / Destruction
CValue();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//static PyObject* PyMake(PyObject*,PyObject*);
virtual PyObject *py_repr(void)
{
@@ -237,7 +234,7 @@ public:
static PyObject * pyattr_get_name(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
virtual PyObject* ConvertKeysToPython( void );
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Expressions/VectorValue.cpp b/source/gameengine/Expressions/VectorValue.cpp
index 59ff601746f..96cc5b48338 100644
--- a/source/gameengine/Expressions/VectorValue.cpp
+++ b/source/gameengine/Expressions/VectorValue.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Expressions/VectorValue.cpp
+ * \ingroup expressions
+ */
// VectorValue.cpp: implementation of the CVectorValue class.
/*
* Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
@@ -12,7 +15,7 @@
*
*/
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Expressions/VectorValue.h b/source/gameengine/Expressions/VectorValue.h
index cc4deda2041..94d1ae65ada 100644
--- a/source/gameengine/Expressions/VectorValue.h
+++ b/source/gameengine/Expressions/VectorValue.h
@@ -12,6 +12,11 @@
* purpose. It is provided "as is" without express or implied warranty.
*
*/
+
+/** \file VectorValue.h
+ * \ingroup expressions
+ */
+
#if !defined _VECTORVALUE_H
#define _VECTORVALUE_H
diff --git a/source/gameengine/Expressions/VoidValue.h b/source/gameengine/Expressions/VoidValue.h
index f30f8c1be7c..2e5c056d793 100644
--- a/source/gameengine/Expressions/VoidValue.h
+++ b/source/gameengine/Expressions/VoidValue.h
@@ -1,4 +1,4 @@
-/**
+/*
* VoidValue.h: interface for the CVoidValue class.
* $Id$
*
@@ -27,6 +27,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file VoidValue.h
+ * \ingroup expressions
+ */
+
#ifndef __VOIDVALUE_H__
#define __VOIDVALUE_H__
diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt
index 93183dafeee..793b8e7eed8 100644
--- a/source/gameengine/GameLogic/CMakeLists.txt
+++ b/source/gameengine/GameLogic/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp Joystick/*.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -36,16 +34,99 @@ SET(INC
../../../source/gameengine/Rasterizer
)
-IF(WITH_SDL)
- SET(INC ${INC} ${SDL_INCLUDE_DIR})
-ELSE(WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(WITH_SDL)
+set(SRC
+ Joystick/SCA_Joystick.cpp
+ Joystick/SCA_JoystickEvents.cpp
+ SCA_2DFilterActuator.cpp
+ SCA_ANDController.cpp
+ SCA_ActuatorEventManager.cpp
+ SCA_ActuatorSensor.cpp
+ SCA_AlwaysEventManager.cpp
+ SCA_AlwaysSensor.cpp
+ SCA_BasicEventManager.cpp
+ SCA_DelaySensor.cpp
+ SCA_EventManager.cpp
+ SCA_ExpressionController.cpp
+ SCA_IActuator.cpp
+ SCA_IController.cpp
+ SCA_IInputDevice.cpp
+ SCA_ILogicBrick.cpp
+ SCA_IObject.cpp
+ SCA_IScene.cpp
+ SCA_ISensor.cpp
+ SCA_JoystickManager.cpp
+ SCA_JoystickSensor.cpp
+ SCA_KeyboardManager.cpp
+ SCA_KeyboardSensor.cpp
+ SCA_LogicManager.cpp
+ SCA_MouseManager.cpp
+ SCA_MouseSensor.cpp
+ SCA_NANDController.cpp
+ SCA_NORController.cpp
+ SCA_ORController.cpp
+ SCA_PropertyActuator.cpp
+ SCA_PropertyEventManager.cpp
+ SCA_PropertySensor.cpp
+ SCA_PythonController.cpp
+ SCA_PythonKeyboard.cpp
+ SCA_PythonMouse.cpp
+ SCA_RandomActuator.cpp
+ SCA_RandomEventManager.cpp
+ SCA_RandomNumberGenerator.cpp
+ SCA_RandomSensor.cpp
+ SCA_TimeEventManager.cpp
+ SCA_XNORController.cpp
+ SCA_XORController.cpp
+
+ Joystick/SCA_Joystick.h
+ Joystick/SCA_JoystickDefines.h
+ Joystick/SCA_JoystickPrivate.h
+ SCA_2DFilterActuator.h
+ SCA_ANDController.h
+ SCA_ActuatorEventManager.h
+ SCA_ActuatorSensor.h
+ SCA_AlwaysEventManager.h
+ SCA_AlwaysSensor.h
+ SCA_BasicEventManager.h
+ SCA_DelaySensor.h
+ SCA_EventManager.h
+ SCA_ExpressionController.h
+ SCA_IActuator.h
+ SCA_IController.h
+ SCA_IInputDevice.h
+ SCA_ILogicBrick.h
+ SCA_IObject.h
+ SCA_IScene.h
+ SCA_ISensor.h
+ SCA_JoystickManager.h
+ SCA_JoystickSensor.h
+ SCA_KeyboardManager.h
+ SCA_KeyboardSensor.h
+ SCA_LogicManager.h
+ SCA_MouseManager.h
+ SCA_MouseSensor.h
+ SCA_NANDController.h
+ SCA_NORController.h
+ SCA_ORController.h
+ SCA_PropertyActuator.h
+ SCA_PropertyEventManager.h
+ SCA_PropertySensor.h
+ SCA_PythonController.h
+ SCA_PythonKeyboard.h
+ SCA_PythonMouse.h
+ SCA_RandomActuator.h
+ SCA_RandomEventManager.h
+ SCA_RandomNumberGenerator.h
+ SCA_RandomSensor.h
+ SCA_TimeEventManager.h
+ SCA_XNORController.h
+ SCA_XORController.h
+)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_SDL)
+ set(INC ${INC} ${SDL_INCLUDE_DIR})
+else()
+ add_definitions(-DDISABLE_SDL)
+endif()
-BLENDERLIB(bf_logic "${SRC}" "${INC}")
+blender_add_lib(ge_logic "${SRC}" "${INC}")
diff --git a/source/gameengine/GameLogic/Joystick/Makefile b/source/gameengine/GameLogic/Joystick/Makefile
deleted file mode 100644
index 5ab297824dd..00000000000
--- a/source/gameengine/GameLogic/Joystick/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = Joystick
-DIR = $(OCGDIR)/gameengine/logic/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../../kernel/gen_system
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
index c58c28f7dc9..a73a6d4631b 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
+++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/Joystick/SCA_Joystick.cpp
+ * \ingroup gamelogic
+ */
+
#ifndef DISABLE_SDL
#include <SDL.h>
#endif
diff --git a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
index b6e54dc2fcd..f371955ffc6 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
+++ b/source/gameengine/GameLogic/Joystick/SCA_Joystick.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_Joystick.h
+ * \ingroup gamelogic
+ */
+
#ifndef _SCA_JOYSTICK_H_
#define _SCA_JOYSTICK_H_
@@ -33,7 +37,7 @@
#include "SDL.h"
#endif
-/*
+/**
* Basic Joystick class
* I will make this class a singleton because there should be only one joystick
* even if there are more than one scene using it and count how many scene are using it.
@@ -53,22 +57,22 @@ class SCA_Joystick
#endif
int m_joyindex;
- /*
+ /**
*support for JOYAXIS_MAX axes (in pairs)
*/
int m_axis_array[JOYAXIS_MAX];
- /*
+ /**
*support for JOYHAT_MAX hats (each is a direction)
*/
int m_hat_array[JOYHAT_MAX];
- /*
+ /**
* Precision or range of the axes
*/
int m_prec;
- /*
+ /**
* max # of buttons avail
*/
@@ -76,17 +80,17 @@ class SCA_Joystick
int m_buttonmax;
int m_hatmax;
- /* is the joystick initialized ?*/
+ /** is the joystick initialized ?*/
bool m_isinit;
- /* is triggered for each event type */
+ /** is triggered for each event type */
bool m_istrig_axis;
bool m_istrig_button;
bool m_istrig_hat;
#ifndef DISABLE_SDL
- /*
+ /**
* event callbacks
*/
void OnAxisMotion(SDL_Event *sdl_event);
@@ -99,27 +103,27 @@ class SCA_Joystick
#endif
#endif
- /*
+ /**
* Open the joystick
*/
bool CreateJoystickDevice(void);
- /*
+ /**
* Close the joystick
*/
void DestroyJoystickDevice(void);
- /*
+ /**
* fills the axis mnember values
*/
void pFillButtons(void);
- /*
+ /**
* returns m_axis_array
*/
int pAxisTest(int axisnum);
- /*
+ /**
* returns m_axis_array
*/
int pGetAxis(int axisnum, int udlr);
@@ -146,7 +150,7 @@ public:
bool aButtonReleaseIsPositive(int button);
bool aHatIsPositive(int hatnum, int dir);
- /*
+ /**
* precision is default '3200' which is overridden by input
*/
@@ -176,7 +180,7 @@ public:
return m_istrig_hat;
}
- /*
+ /**
* returns the # of...
*/
@@ -184,7 +188,7 @@ public:
int GetNumberOfButtons(void);
int GetNumberOfHats(void);
- /*
+ /**
* Test if the joystick is connected
*/
int Connected(void);
diff --git a/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h b/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
index 4b66535de43..69fc393cbd7 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
+++ b/source/gameengine/GameLogic/Joystick/SCA_JoystickDefines.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_JoystickDefines.h
+ * \ingroup gamelogic
+ */
+
#ifndef _SCA_JOYSTICKDEFINES_H_
#define _SCA_JOYSTICKDEFINES_H_
diff --git a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
index 17cf242bf5c..b6e313aa6c2 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
+++ b/source/gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/Joystick/SCA_JoystickEvents.cpp
+ * \ingroup gamelogic
+ */
+
#ifndef DISABLE_SDL
#include <SDL.h>
#endif
diff --git a/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h b/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
index 4e7f6f73413..02dd8145bb7 100644
--- a/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
+++ b/source/gameengine/GameLogic/Joystick/SCA_JoystickPrivate.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_JoystickPrivate.h
+ * \ingroup gamelogic
+ */
+
#ifndef __SCA_JOYSTICKPRIVATE_H__
#define __SCA_JOYSTICKPRIVATE_H__
#include "SCA_Joystick.h"
diff --git a/source/gameengine/GameLogic/Makefile b/source/gameengine/GameLogic/Makefile
deleted file mode 100644
index 9c8bd73cdc0..00000000000
--- a/source/gameengine/GameLogic/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = logic
-SOURCEDIR = source/gameengine/gameengine/GameLogic
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-DIRS = Joystick
-
-include nan_subdirs.mk
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../Rasterizer
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += $(NAN_SDLCFLAGS)
-
-CPPFLAGS += -I../../kernel/gen_system
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
index f6d24af0e67..0a65fc1584a 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* SCA_2DFilterActuator.cpp
*
* $Id$
@@ -23,6 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_2DFilterActuator.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_IActuator.h"
#include "SCA_2DFilterActuator.h"
@@ -96,7 +103,7 @@ void SCA_2DFilterActuator::SetShaderText(const char *text)
m_shaderText = text;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
index 034b10763ce..87d2e8ddbcf 100644
--- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h
+++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* SCA_2DFilterActuator.h
*
* $Id$
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_2DFilterActuator.h
+ * \ingroup gamelogic
+ */
+
#ifndef __SCA_2DFILETRACTUATOR_H__
#define __SCA_2DFILETRACTUATOR_H__
diff --git a/source/gameengine/GameLogic/SCA_ANDController.cpp b/source/gameengine/GameLogic/SCA_ANDController.cpp
index 53c9be5215e..4228d8374b7 100644
--- a/source/gameengine/GameLogic/SCA_ANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_ANDController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'And' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ANDController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_ANDController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -87,7 +92,7 @@ CValue* SCA_ANDController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -123,5 +128,5 @@ PyMethodDef SCA_ANDController::Methods[] = {
PyAttributeDef SCA_ANDController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ANDController.h b/source/gameengine/GameLogic/SCA_ANDController.h
index a511a438c2f..728dc121f80 100644
--- a/source/gameengine/GameLogic/SCA_ANDController.h
+++ b/source/gameengine/GameLogic/SCA_ANDController.h
@@ -1,4 +1,4 @@
-/**
+/*
* SCA_ANDController.h
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_ANDController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ANDCONTROLLER
#define __KX_ANDCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp b/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp
index db741040ccc..00e3a03dcc8 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_ActuatorEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ActuatorEventManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_ISensor.h"
#include "SCA_ActuatorEventManager.h"
#include "SCA_ActuatorSensor.h"
diff --git a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
index 859cc5023f1..8530c944c49 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
+++ b/source/gameengine/GameLogic/SCA_ActuatorEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_ActuatorEventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ACTUATOREVENTMANAGER
#define __KX_ACTUATOREVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
index c77e58d2f3b..81f58c30a7d 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Actuator sensor
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ActuatorSensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include <iostream>
#include "SCA_ActuatorSensor.h"
#include "SCA_EventManager.h"
@@ -110,7 +117,7 @@ void SCA_ActuatorSensor::Update()
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -160,6 +167,6 @@ int SCA_ActuatorSensor::CheckActuator(void *self, const PyAttributeDef*)
return 1;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ActuatorSensor.h b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
index 323746889bf..cb3e2e05125 100644
--- a/source/gameengine/GameLogic/SCA_ActuatorSensor.h
+++ b/source/gameengine/GameLogic/SCA_ActuatorSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* Actuator sensor
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_ActuatorSensor.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ACTUATORSENSOR
#define __KX_ACTUATORSENSOR
@@ -56,7 +60,7 @@ public:
virtual void ReParent(SCA_IObject* parent);
void Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -64,7 +68,7 @@ public:
static int CheckActuator(void *self, const PyAttributeDef*);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp b/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp
index 7ecd286ea43..bf858f4d4ef 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_AlwaysEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for 'always' events. Since always sensors can operate in pulse
* mode, they need to be activated.
*
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_AlwaysEventManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_AlwaysEventManager.h"
#include "SCA_LogicManager.h"
#include <vector>
diff --git a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
index 59429303fc4..4e05c7cf60c 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
+++ b/source/gameengine/GameLogic/SCA_AlwaysEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_AlwaysEventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ALWAYSEVENTMGR
#define __KX_ALWAYSEVENTMGR
#include "SCA_EventManager.h"
diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
index 0f3b81a057e..f9e8a70ba41 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Always trigger
*
* $Id$
@@ -29,7 +29,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/GameLogic/SCA_AlwaysSensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
@@ -94,7 +99,7 @@ bool SCA_AlwaysSensor::Evaluate()
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_AlwaysSensor.h b/source/gameengine/GameLogic/SCA_AlwaysSensor.h
index 0de2a3f0629..9e4d120d1bd 100644
--- a/source/gameengine/GameLogic/SCA_AlwaysSensor.h
+++ b/source/gameengine/GameLogic/SCA_AlwaysSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* SCA_AlwaysSensor.h
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_AlwaysSensor.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ALWAYSSENSOR
#define __KX_ALWAYSSENSOR
#include "SCA_ISensor.h"
diff --git a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
index 2fdb1a96216..21a3f7aba8d 100644
--- a/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_BasicEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for 'always' events. Since always sensors can operate in pulse
* mode, they need to be activated.
*
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_BasicEventManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_BasicEventManager.h"
#include "SCA_LogicManager.h"
#include <vector>
diff --git a/source/gameengine/GameLogic/SCA_BasicEventManager.h b/source/gameengine/GameLogic/SCA_BasicEventManager.h
index db67b180fd8..8c6741859bf 100644
--- a/source/gameengine/GameLogic/SCA_BasicEventManager.h
+++ b/source/gameengine/GameLogic/SCA_BasicEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for sensor that only need to call Update
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_BasicEventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __SCA_BASICEVENTMGR
#define __SCA_BASICEVENTMGR
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.cpp b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
index 701bcb2fc2f..7bfe7a0771a 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Delay trigger
*
* $Id$
@@ -29,12 +29,19 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/GameLogic/SCA_DelaySensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
#endif
+#include <stddef.h>
+
#include "SCA_DelaySensor.h"
#include "SCA_LogicManager.h"
#include "SCA_EventManager.h"
@@ -120,7 +127,7 @@ bool SCA_DelaySensor::Evaluate()
return trigger;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -160,6 +167,6 @@ PyAttributeDef SCA_DelaySensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_DelaySensor.h b/source/gameengine/GameLogic/SCA_DelaySensor.h
index c5db16afb54..f690caca50b 100644
--- a/source/gameengine/GameLogic/SCA_DelaySensor.h
+++ b/source/gameengine/GameLogic/SCA_DelaySensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* SCA_DelaySensor.h
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_DelaySensor.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_DELAYSENSOR
#define __KX_DELAYSENSOR
#include "SCA_ISensor.h"
diff --git a/source/gameengine/GameLogic/SCA_EventManager.cpp b/source/gameengine/GameLogic/SCA_EventManager.cpp
index 3a4a06ebfbd..e02bb0c5029 100644
--- a/source/gameengine/GameLogic/SCA_EventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_EventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_EventManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include <assert.h>
#include "SCA_EventManager.h"
#include "SCA_ISensor.h"
diff --git a/source/gameengine/GameLogic/SCA_EventManager.h b/source/gameengine/GameLogic/SCA_EventManager.h
index b01d3641cdb..88a750d346c 100644
--- a/source/gameengine/GameLogic/SCA_EventManager.h
+++ b/source/gameengine/GameLogic/SCA_EventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_EventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_EVENTMANAGER
#define __KX_EVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.cpp b/source/gameengine/GameLogic/SCA_ExpressionController.cpp
index b678648ca58..ef33a54ae3e 100644
--- a/source/gameengine/GameLogic/SCA_ExpressionController.cpp
+++ b/source/gameengine/GameLogic/SCA_ExpressionController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Expression Controller enables to calculate an expression that wires inputs to output
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ExpressionController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_ExpressionController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
diff --git a/source/gameengine/GameLogic/SCA_ExpressionController.h b/source/gameengine/GameLogic/SCA_ExpressionController.h
index 38e3904a8d6..2c3005c4c2d 100644
--- a/source/gameengine/GameLogic/SCA_ExpressionController.h
+++ b/source/gameengine/GameLogic/SCA_ExpressionController.h
@@ -1,4 +1,4 @@
-/**
+/*
* KX_EXPRESSIONController.h
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_ExpressionController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_EXPRESSIONCONTROLLER
#define __KX_EXPRESSIONCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_IActuator.cpp b/source/gameengine/GameLogic/SCA_IActuator.cpp
index b836227895f..f6739976ffd 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_IActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_IActuator.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_IActuator.h"
#include <stdio.h>
diff --git a/source/gameengine/GameLogic/SCA_IActuator.h b/source/gameengine/GameLogic/SCA_IActuator.h
index d3ead7c7460..bfcec983e2a 100644
--- a/source/gameengine/GameLogic/SCA_IActuator.h
+++ b/source/gameengine/GameLogic/SCA_IActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,13 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_IActuator.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_IACTUATOR
#define __KX_IACTUATOR
#include "SCA_IController.h"
#include <vector>
-/*
+/**
* Use of SG_DList : None
* Use of SG_QList : element of activated actuator list of their owner
* Head: SCA_IObject::m_activeActuators
diff --git a/source/gameengine/GameLogic/SCA_IController.cpp b/source/gameengine/GameLogic/SCA_IController.cpp
index c291ff091aa..6dd04750081 100644
--- a/source/gameengine/GameLogic/SCA_IController.cpp
+++ b/source/gameengine/GameLogic/SCA_IController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_IController.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_IController.h"
#include "SCA_LogicManager.h"
#include "SCA_IActuator.h"
@@ -194,7 +201,7 @@ void SCA_IController::ApplyState(unsigned int state)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python api */
@@ -247,4 +254,4 @@ PyObject* SCA_IController::pyattr_get_actuators(void *self_v, const KX_PYATTRIBU
{
return KX_PythonSeq_CreatePyObject((static_cast<SCA_IController*>(self_v))->m_proxy, KX_PYGENSEQ_CONT_TYPE_ACTUATORS);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_IController.h b/source/gameengine/GameLogic/SCA_IController.h
index e23a0d7dc92..541d69c6f3b 100644
--- a/source/gameengine/GameLogic/SCA_IController.h
+++ b/source/gameengine/GameLogic/SCA_IController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,13 +26,18 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_IController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ICONTROLLER
#define __KX_ICONTROLLER
#include "SCA_ILogicBrick.h"
#include "PyObjectPlus.h"
-/*
+/**
* Use of SG_DList element: none
* Use of SG_QList element: build ordered list of activated controller on the owner object
* Head: SCA_IObject::m_activeControllers
@@ -99,11 +104,11 @@ public:
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_state(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_sensors(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif
diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.cpp b/source/gameengine/GameLogic/SCA_IInputDevice.cpp
index 9d902681d36..4ff80cdf46d 100644
--- a/source/gameengine/GameLogic/SCA_IInputDevice.cpp
+++ b/source/gameengine/GameLogic/SCA_IInputDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_IInputDevice.cpp
+ * \ingroup gamelogic
+ */
+
+
#include <assert.h>
#include "SCA_IInputDevice.h"
diff --git a/source/gameengine/GameLogic/SCA_IInputDevice.h b/source/gameengine/GameLogic/SCA_IInputDevice.h
index a13efee1316..49d52d0befc 100644
--- a/source/gameengine/GameLogic/SCA_IInputDevice.h
+++ b/source/gameengine/GameLogic/SCA_IInputDevice.h
@@ -1,7 +1,4 @@
-/**
- * Interface for input devices. The defines for keyboard/system/mouse events
- * here are for internal use in the KX module.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_IController.h
+ * \ingroup gamelogic
+ * \brief Interface for input devices. The defines for keyboard/system/mouse events
+ * here are for internal use in the KX module.
+ *
+ */
+
#ifndef KX_INPUTDEVICE_H
#define KX_INPUTDEVICE_H
@@ -47,7 +51,6 @@ public:
KX_JUSTACTIVATED,
KX_ACTIVE,
KX_JUSTRELEASED,
- KX_MAX_INPUTSTATUS
};
SCA_InputEvent(SCA_EnumInputs status=KX_NO_INPUTSTATUS,int eventval=0)
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
index f2e1a8dd151..2d0cb16b63c 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ILogicBrick.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_ILogicBrick.h"
#include "PyObjectPlus.h"
@@ -169,7 +176,7 @@ CValue* SCA_ILogicBrick::GetEvent()
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* python stuff */
@@ -253,4 +260,4 @@ PyObject* SCA_ILogicBrick::BoolToPyArg(bool boolarg)
return PyLong_FromSsize_t(boolarg? KX_TRUE: KX_FALSE);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_ILogicBrick.h b/source/gameengine/GameLogic/SCA_ILogicBrick.h
index 3225c245550..e74cd601b6b 100644
--- a/source/gameengine/GameLogic/SCA_ILogicBrick.h
+++ b/source/gameengine/GameLogic/SCA_ILogicBrick.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_ILogicBrick.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ILOGICBRICK
#define __KX_ILOGICBRICK
@@ -133,7 +138,7 @@ public:
virtual void Replace_IScene(SCA_IScene *val) {};
virtual void Replace_NetworkScene(NG_NetworkScene *val) {};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// python methods
static PyObject* pyattr_get_owner(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
@@ -157,7 +162,7 @@ protected:
/** Convert a a c++ value to KX_TRUE, KX_FALSE in Python. */
PyObject* BoolToPyArg(bool);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/GameLogic/SCA_IObject.cpp b/source/gameengine/GameLogic/SCA_IObject.cpp
index 7c0a5b2db15..7bf3e75795d 100644
--- a/source/gameengine/GameLogic/SCA_IObject.cpp
+++ b/source/gameengine/GameLogic/SCA_IObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/SCA_IObject.cpp
+ * \ingroup gamelogic
+ */
+
#include <iostream>
#include <algorithm>
@@ -303,7 +308,7 @@ void SCA_IObject::SetState(unsigned int state)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -342,4 +347,4 @@ PyAttributeDef SCA_IObject::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/GameLogic/SCA_IObject.h b/source/gameengine/GameLogic/SCA_IObject.h
index 0178da5f343..8ff7dcc4ad5 100644
--- a/source/gameengine/GameLogic/SCA_IObject.h
+++ b/source/gameengine/GameLogic/SCA_IObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,9 +25,12 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * An abstract object that has some logic, python scripting and
- * reference counting Note: transformation stuff has been moved to
- * SceneGraph
+ */
+/** \file SCA_IController.h
+ * \ingroup gamelogic
+ * \brief An abstract object that has some logic, python scripting and
+ * reference counting Note: transformation stuff has been moved to
+ * SceneGraph
*/
#ifndef SCA_IOBJECT_H
@@ -41,7 +44,7 @@ class SCA_ISensor;
class SCA_IController;
class SCA_IActuator;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
template<class T> T PyVecTo(PyObject*);
#endif
diff --git a/source/gameengine/GameLogic/SCA_IScene.cpp b/source/gameengine/GameLogic/SCA_IScene.cpp
index 75e323efe94..9cff5a0ab04 100644
--- a/source/gameengine/GameLogic/SCA_IScene.cpp
+++ b/source/gameengine/GameLogic/SCA_IScene.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_IScene.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_IScene.h"
#include "Value.h"
diff --git a/source/gameengine/GameLogic/SCA_IScene.h b/source/gameengine/GameLogic/SCA_IScene.h
index 93b040c9a31..a441a512550 100644
--- a/source/gameengine/GameLogic/SCA_IScene.h
+++ b/source/gameengine/GameLogic/SCA_IScene.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_IScene.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ISCENE_H
#define __KX_ISCENE_H
diff --git a/source/gameengine/GameLogic/SCA_ISensor.cpp b/source/gameengine/GameLogic/SCA_ISensor.cpp
index fada69848b2..0d09e33a81b 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.cpp
+++ b/source/gameengine/GameLogic/SCA_ISensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Abstract class for sensor logic bricks
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ISensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_ISensor.h"
#include "SCA_EventManager.h"
#include "SCA_LogicManager.h"
@@ -300,7 +307,7 @@ void SCA_ISensor::Activate(class SCA_LogicManager* logicmgr)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ----------------------------------------------- */
/* Python Functions */
@@ -427,6 +434,6 @@ int SCA_ISensor::pyattr_check_tap(void *self_v, const KX_PYATTRIBUTE_DEF *attrde
self->m_level = false;
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ISensor.h b/source/gameengine/GameLogic/SCA_ISensor.h
index 2d3a3ef08a0..741448b1096 100644
--- a/source/gameengine/GameLogic/SCA_ISensor.h
+++ b/source/gameengine/GameLogic/SCA_ISensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,12 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Interface Class for all logic Sensors. Implements
- * pulsemode and pulsefrequency, and event suppression.
+ */
+
+/** \file SCA_IController.h
+ * \ingroup gamelogic
+ * \brief Interface Class for all logic Sensors. Implements
+ * pulsemode and pulsefrequency, and event suppression.
*/
#ifndef __SCA_ISENSOR
@@ -190,7 +194,7 @@ public:
bool IsNoLink() const
{ return !m_links; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python functions: */
KX_PYMETHOD_DOC_NOARGS(SCA_ISensor,reset);
@@ -210,7 +214,7 @@ public:
KX_SENSOR_JUST_DEACTIVATED
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
#endif //__SCA_ISENSOR
diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.cpp b/source/gameengine/GameLogic/SCA_JoystickManager.cpp
index 5a975552d3d..19633c2e09d 100644
--- a/source/gameengine/GameLogic/SCA_JoystickManager.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/SCA_JoystickManager.cpp
+ * \ingroup gamelogic
+ */
+
#include "SCA_JoystickSensor.h"
#include "SCA_JoystickManager.h"
#include "SCA_LogicManager.h"
diff --git a/source/gameengine/GameLogic/SCA_JoystickManager.h b/source/gameengine/GameLogic/SCA_JoystickManager.h
index e5f53442049..dc778f231af 100644
--- a/source/gameengine/GameLogic/SCA_JoystickManager.h
+++ b/source/gameengine/GameLogic/SCA_JoystickManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_JoystickManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __JOYSTICKMANAGER_H_
#define __JOYSTICKMANAGER_H_
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
index 29a6a73b865..b32114722d4 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/SCA_JoystickSensor.cpp
+ * \ingroup gamelogic
+ */
+
#include "SCA_JoystickManager.h"
#include "SCA_JoystickSensor.h"
@@ -241,7 +246,7 @@ bool SCA_JoystickSensor::isValid(SCA_JoystickSensor::KX_JOYSENSORMODE m)
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -296,7 +301,7 @@ PyAttributeDef SCA_JoystickSensor::Attributes[] = {
/* get button active list -------------------------------------------------- */
const char SCA_JoystickSensor::GetButtonActiveList_doc[] =
"getButtonActiveList\n"
-"\tReturns a list containing the indicies of the button currently pressed.\n";
+"\tReturns a list containing the indices of the button currently pressed.\n";
PyObject* SCA_JoystickSensor::PyGetButtonActiveList( ) {
SCA_Joystick *joy = ((SCA_JoystickManager *)m_eventmgr)->GetJoystickDevice(m_joyindex);
PyObject *ls = PyList_New(0);
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.h b/source/gameengine/GameLogic/SCA_JoystickSensor.h
index 90fb16de747..b4ed2c06d2f 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.h
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_JoystickSensor.h
+ * \ingroup gamelogic
+ */
+
#ifndef __JOYSENSOR_H_
#define __JOYSENSOR_H
@@ -117,7 +121,7 @@ public:
return m_joyindex;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -157,7 +161,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/GameLogic/SCA_KeyboardManager.cpp b/source/gameengine/GameLogic/SCA_KeyboardManager.cpp
index eba904ba647..73aece3901c 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardManager.cpp
+++ b/source/gameengine/GameLogic/SCA_KeyboardManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for keyboard events
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_KeyboardManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "BoolValue.h"
#include "SCA_KeyboardManager.h"
#include "SCA_KeyboardSensor.h"
diff --git a/source/gameengine/GameLogic/SCA_KeyboardManager.h b/source/gameengine/GameLogic/SCA_KeyboardManager.h
index 53735f9fae1..a74636d4582 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardManager.h
+++ b/source/gameengine/GameLogic/SCA_KeyboardManager.h
@@ -1,6 +1,4 @@
-/**
- * Manager for keyboard events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_KeyboardManager.h
+ * \ingroup gamelogic
+ * \brief Manager for keyboard events
+ *
+ */
+
#ifndef __KX_KEYBOARDMANAGER
#define __KX_KEYBOARDMANAGER
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
index c49d65226dc..513be43ec28 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
* Sensor for keyboard input
*/
+
+/** \file gameengine/GameLogic/SCA_KeyboardSensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_KeyboardSensor.h"
#include "SCA_KeyboardManager.h"
#include "SCA_LogicManager.h"
@@ -156,6 +164,9 @@ bool SCA_KeyboardSensor::Evaluate()
case SCA_InputEvent::KX_ACTIVE:
active = true;
break;
+ case SCA_InputEvent::KX_NO_INPUTSTATUS:
+ /* do nothing */
+ break;
}
}
@@ -221,6 +232,9 @@ bool SCA_KeyboardSensor::Evaluate()
break;
case SCA_InputEvent::KX_JUSTACTIVATED:
qual_change = true;
+ case SCA_InputEvent::KX_ACTIVE:
+ /* do nothing */
+ break;
}
}
if (m_qual2 > 0 && qual==true) {
@@ -236,6 +250,9 @@ bool SCA_KeyboardSensor::Evaluate()
break;
case SCA_InputEvent::KX_JUSTACTIVATED:
qual_change = true;
+ case SCA_InputEvent::KX_ACTIVE:
+ /* do nothing */
+ break;
}
}
/* done reading qualifiers */
@@ -399,7 +416,7 @@ void SCA_KeyboardSensor::LogKeystrokes(void)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Functions */
@@ -492,7 +509,7 @@ PyObject* SCA_KeyboardSensor::pyattr_get_events(void *self_v, const KX_PYATTRIBU
return resultlist;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* Accessed from python */
diff --git a/source/gameengine/GameLogic/SCA_KeyboardSensor.h b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
index 5ca329b0846..ee40567fce2 100644
--- a/source/gameengine/GameLogic/SCA_KeyboardSensor.h
+++ b/source/gameengine/GameLogic/SCA_KeyboardSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Sensor for keyboard input
+ */
+
+/** \file SCA_KeyboardSensor.h
+ * \ingroup gamelogic
+ * \brief Sensor for keyboard input
*/
#ifndef __KX_KEYBOARDSENSOR
@@ -103,7 +107,7 @@ public:
virtual bool IsPositiveTrigger();
bool TriggerOnAllKeys();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp
index d003c5618f1..28f96243dd8 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.cpp
+++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* Regulates the top-level logic behaviour for one scene.
*/
+
+/** \file gameengine/GameLogic/SCA_LogicManager.cpp
+ * \ingroup gamelogic
+ */
+
#include "Value.h"
#include "SCA_LogicManager.h"
#include "SCA_ISensor.h"
@@ -307,7 +312,7 @@ void SCA_LogicManager::AddTriggeredController(SCA_IController* controller, SCA_I
{
controller->Activate(m_triggeredControllerSet);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// so that the controller knows which sensor has activited it
// only needed for python controller
diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h
index c5f377eeb44..44dc12a8fd4 100644
--- a/source/gameengine/GameLogic/SCA_LogicManager.h
+++ b/source/gameengine/GameLogic/SCA_LogicManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,12 +25,15 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Regulates the top-level logic behaviour for one scene.
+ */
+/** \file SCA_IController.h
+ * \ingroup gamelogic
+ * \brief Regulates the top-level logic behaviour for one scene.
*/
#ifndef __KX_LOGICMANAGER
#define __KX_LOGICMANAGER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif
@@ -127,6 +130,7 @@ public:
void RegisterMeshName(const STR_String& meshname,void* mesh);
void UnregisterMeshName(const STR_String& meshname,void* mesh);
GEN_Map<STR_HashedString,void*>& GetMeshMap() { return m_mapStringToMeshes; };
+ GEN_Map<STR_HashedString,void*>& GetActionMap() { return m_mapStringToActions; };
void RegisterActionName(const STR_String& actname,void* action);
diff --git a/source/gameengine/GameLogic/SCA_MouseManager.cpp b/source/gameengine/GameLogic/SCA_MouseManager.cpp
index f7f9a566c8d..8c98e5f64f6 100644
--- a/source/gameengine/GameLogic/SCA_MouseManager.cpp
+++ b/source/gameengine/GameLogic/SCA_MouseManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for mouse events
*
*
@@ -30,7 +30,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/GameLogic/SCA_MouseManager.cpp
+ * \ingroup gamelogic
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
diff --git a/source/gameengine/GameLogic/SCA_MouseManager.h b/source/gameengine/GameLogic/SCA_MouseManager.h
index 8bf060537ca..737da049c2e 100644
--- a/source/gameengine/GameLogic/SCA_MouseManager.h
+++ b/source/gameengine/GameLogic/SCA_MouseManager.h
@@ -1,6 +1,4 @@
-/**
- * Manager for mouse events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_MouseManager.h
+ * \ingroup gamelogic
+ * \brief Manager for mouse events.
+ *
+ */
+
#ifndef __KX_MOUSEMANAGER
#define __KX_MOUSEMANAGER
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.cpp b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
index 9f4b25986b0..a1836163e9c 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Sensor for mouse input
*
*
@@ -30,6 +30,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_MouseSensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_MouseSensor.h"
#include "SCA_EventManager.h"
#include "SCA_MouseManager.h"
@@ -232,7 +239,7 @@ bool SCA_MouseSensor::isValid(SCA_MouseSensor::KX_MOUSESENSORMODE m)
return ((m > KX_MOUSESENSORMODE_NODEF) && (m < KX_MOUSESENSORMODE_MAX));
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -305,6 +312,6 @@ PyAttributeDef SCA_MouseSensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_MouseSensor.h b/source/gameengine/GameLogic/SCA_MouseSensor.h
index f52b57a3e11..7b83812a669 100644
--- a/source/gameengine/GameLogic/SCA_MouseSensor.h
+++ b/source/gameengine/GameLogic/SCA_MouseSensor.h
@@ -1,6 +1,4 @@
-/**
- * Senses mouse events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_MouseSensor.h
+ * \ingroup gamelogic
+ * \brief Senses mouse events
+ */
+
#ifndef __KX_MOUSESENSOR
#define __KX_MOUSESENSOR
@@ -104,7 +107,7 @@ class SCA_MouseSensor : public SCA_ISensor
static void UpdateHotkey(void *self);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_NANDController.cpp b/source/gameengine/GameLogic/SCA_NANDController.cpp
index c09a53d8ac7..b800ebbfa42 100644
--- a/source/gameengine/GameLogic/SCA_NANDController.cpp
+++ b/source/gameengine/GameLogic/SCA_NANDController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Nand' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_NANDController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_NANDController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -87,7 +92,7 @@ CValue* SCA_NANDController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_NANDController.h b/source/gameengine/GameLogic/SCA_NANDController.h
index b1ec7de13dd..4353c653046 100644
--- a/source/gameengine/GameLogic/SCA_NANDController.h
+++ b/source/gameengine/GameLogic/SCA_NANDController.h
@@ -1,6 +1,4 @@
-/**
- * SCA_NANDController.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_NANDController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_NANDCONTROLLER
#define __KX_NANDCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_NORController.cpp b/source/gameengine/GameLogic/SCA_NORController.cpp
index 8ebd79efcfa..3b955d43a7f 100644
--- a/source/gameengine/GameLogic/SCA_NORController.cpp
+++ b/source/gameengine/GameLogic/SCA_NORController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Nor' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_NORController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_NORController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -87,7 +92,7 @@ CValue* SCA_NORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -124,6 +129,6 @@ PyAttributeDef SCA_NORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_NORController.h b/source/gameengine/GameLogic/SCA_NORController.h
index 12b2ad99282..5bb3b346e56 100644
--- a/source/gameengine/GameLogic/SCA_NORController.h
+++ b/source/gameengine/GameLogic/SCA_NORController.h
@@ -1,6 +1,4 @@
-/**
- * SCA_NORController.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_NORController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_NORCONTROLLER
#define __KX_NORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_ORController.cpp b/source/gameengine/GameLogic/SCA_ORController.cpp
index a638147e211..1e1126ba02d 100644
--- a/source/gameengine/GameLogic/SCA_ORController.cpp
+++ b/source/gameengine/GameLogic/SCA_ORController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Or' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_ORController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_ORController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -83,7 +88,7 @@ void SCA_ORController::Trigger(SCA_LogicManager* logicmgr)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -120,6 +125,6 @@ PyAttributeDef SCA_ORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_ORController.h b/source/gameengine/GameLogic/SCA_ORController.h
index eb848c6d9e3..6baaa50f43d 100644
--- a/source/gameengine/GameLogic/SCA_ORController.h
+++ b/source/gameengine/GameLogic/SCA_ORController.h
@@ -1,6 +1,4 @@
-/**
- * SCA_ORController.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_ORController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_ORCONTROLLER
#define __KX_ORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
index c1b49d32712..008e109384c 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Assign, change, copy properties
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PropertyActuator.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_PropertyActuator.h"
#include "InputParser.h"
#include "Operator2Expr.h"
@@ -217,7 +224,7 @@ void SCA_PropertyActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PropertyActuator.h b/source/gameengine/GameLogic/SCA_PropertyActuator.h
index a38c42f16ad..1ca7b1c4e1e 100644
--- a/source/gameengine/GameLogic/SCA_PropertyActuator.h
+++ b/source/gameengine/GameLogic/SCA_PropertyActuator.h
@@ -1,6 +1,4 @@
-/**
- * SCA_PropertyActuator.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_PropertyActuator.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_PROPERTYACTUATOR
#define __KX_PROPERTYACTUATOR
diff --git a/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp b/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp
index f6a1b257c18..28544e74c1b 100644
--- a/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertyEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PropertyEventManager.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_ISensor.h"
#include "SCA_PropertyEventManager.h"
diff --git a/source/gameengine/GameLogic/SCA_PropertyEventManager.h b/source/gameengine/GameLogic/SCA_PropertyEventManager.h
index 4e2920d9d70..b928a082a41 100644
--- a/source/gameengine/GameLogic/SCA_PropertyEventManager.h
+++ b/source/gameengine/GameLogic/SCA_PropertyEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_PropertyEventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_PROPERTYEVENTMANAGER
#define __KX_PROPERTYEVENTMANAGER
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.cpp b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
index be86b976a70..ce3d2abdc64 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.cpp
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Property sensor
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PropertySensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include <iostream>
#include "SCA_PropertySensor.h"
#include "Operator2Expr.h"
@@ -304,7 +311,7 @@ CValue* SCA_PropertySensor::FindIdentifier(const STR_String& identifiername)
return GetParent()->FindIdentifier(identifiername);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -378,6 +385,6 @@ PyAttributeDef SCA_PropertySensor::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PropertySensor.h b/source/gameengine/GameLogic/SCA_PropertySensor.h
index 9a5c4762558..a0dee4da5ee 100644
--- a/source/gameengine/GameLogic/SCA_PropertySensor.h
+++ b/source/gameengine/GameLogic/SCA_PropertySensor.h
@@ -1,6 +1,4 @@
-/**
- * Property sensor
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_PropertySensor.h
+ * \ingroup gamelogic
+ * \brief Property sensor
+ */
+
#ifndef __KX_PROPERTYSENSOR
#define __KX_PROPERTYSENSOR
@@ -84,7 +87,7 @@ public:
virtual bool IsPositiveTrigger();
virtual CValue* FindIdentifier(const STR_String& identifiername);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 1f05846abe4..4e021141f22 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Execute Python scripts
*
* $Id$
@@ -29,16 +29,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PythonController.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_PythonController.h"
#include "SCA_LogicManager.h"
#include "SCA_ISensor.h"
#include "SCA_IActuator.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "compile.h"
#include "eval.h"
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#include <algorithm>
@@ -49,7 +56,7 @@ SCA_PythonController* SCA_PythonController::m_sCurrentController = NULL;
SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj, int mode)
: SCA_IController(gameobj),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_bytecode(NULL),
m_function(NULL),
#endif
@@ -57,7 +64,7 @@ SCA_PythonController::SCA_PythonController(SCA_IObject* gameobj, int mode)
m_bModified(true),
m_debug(false),
m_mode(mode)
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
, m_pythondictionary(NULL)
#endif
@@ -84,7 +91,7 @@ int SCA_PythonController::Release()
SCA_PythonController::~SCA_PythonController()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//printf("released python byte script\n");
Py_XDECREF(m_bytecode);
@@ -104,7 +111,7 @@ CValue* SCA_PythonController::GetReplica()
{
SCA_PythonController* replica = new SCA_PythonController(*this);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* why is this needed at all??? - m_bytecode is NULL'd below so this doesnt make sense
* but removing it crashes blender (with YoFrankie). so leave in for now - Campbell */
Py_XINCREF(replica->m_bytecode);
@@ -146,7 +153,7 @@ void SCA_PythonController::SetScriptName(const STR_String& name)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SCA_PythonController::SetNamespace(PyObject* pythondictionary)
{
if (m_pythondictionary)
@@ -171,7 +178,7 @@ int SCA_PythonController::IsTriggered(class SCA_ISensor* sensor)
return 0;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* warning, self is not the SCA_PythonController, its a PyObjectPlus_Proxy */
PyObject* SCA_PythonController::sPyGetCurrentController(PyObject *self)
@@ -214,7 +221,7 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
PyErr_Format(PyExc_ValueError, "'%s' not in this python controllers actuator list", _PyUnicode_AsString(value_str));
Py_DECREF(value_str);
- return false;
+ return NULL;
}
const char* SCA_PythonController::sPyGetCurrentController__doc__ = "getCurrentController()";
@@ -408,7 +415,13 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
*/
excdict= PyDict_Copy(m_pythondictionary);
- resultobj = PyEval_EvalCode((PyCodeObject*)m_bytecode, excdict, excdict);
+
+#if PY_VERSION_HEX >= 0x03020000
+ resultobj = PyEval_EvalCode((PyObject *)m_bytecode, excdict, excdict);
+#else
+ resultobj = PyEval_EvalCode((PyCodeObject *)m_bytecode, excdict, excdict);
+#endif
+
/* PyRun_SimpleString(m_scriptText.Ptr()); */
break;
}
@@ -527,13 +540,13 @@ int SCA_PythonController::pyattr_set_script(void *self_v, const KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#else // DISABLE_PYTHON
+#else // WITH_PYTHON
void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
{
/* intentionally blank */
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_PythonController.h b/source/gameengine/GameLogic/SCA_PythonController.h
index bd78014038c..3ccbfea7ed5 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.h
+++ b/source/gameengine/GameLogic/SCA_PythonController.h
@@ -1,6 +1,4 @@
-/**
- * Execute Python scripts
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_PythonController.h
+ * \ingroup gamelogic
+ * \brief Execute Python scripts
+ */
+
#ifndef KX_PYTHONCONTROLLER_H
#define KX_PYTHONCONTROLLER_H
@@ -42,7 +45,7 @@ class SCA_IObject;
class SCA_PythonController : public SCA_IController
{
Py_Header;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
struct _object * m_bytecode; /* SCA_PYEXEC_SCRIPT only */
PyObject* m_function; /* SCA_PYEXEC_MODULE only */
#endif
@@ -55,7 +58,7 @@ class SCA_PythonController : public SCA_IController
protected:
STR_String m_scriptText;
STR_String m_scriptName;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_pythondictionary; /* for SCA_PYEXEC_SCRIPT only */
PyObject* m_pythonfunction; /* for SCA_PYEXEC_MODULE only */
#endif
@@ -83,7 +86,7 @@ class SCA_PythonController : public SCA_IController
void SetScriptText(const STR_String& text);
void SetScriptName(const STR_String& name);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SetNamespace(PyObject* pythondictionary);
#endif
void SetDebug(bool debug) { m_debug = debug; }
@@ -94,7 +97,7 @@ class SCA_PythonController : public SCA_IController
bool Import();
void ErrorPrint(const char *error_msg);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static const char* sPyGetCurrentController__doc__;
static PyObject* sPyGetCurrentController(PyObject* self);
static const char* sPyAddActiveActuator__doc__;
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
index 3d5d3568335..f7d3c2f3f06 100644
--- a/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PythonKeyboard.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_PythonKeyboard.h"
#include "SCA_IInputDevice.h"
@@ -33,20 +38,20 @@ SCA_PythonKeyboard::SCA_PythonKeyboard(SCA_IInputDevice* keyboard)
: PyObjectPlus(),
m_keyboard(keyboard)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_event_dict = PyDict_New();
#endif
}
SCA_PythonKeyboard::~SCA_PythonKeyboard()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_event_dict);
Py_DECREF(m_event_dict);
#endif
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PythonKeyboard.h b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
index 260835155e6..98bde606a47 100644
--- a/source/gameengine/GameLogic/SCA_PythonKeyboard.h
+++ b/source/gameengine/GameLogic/SCA_PythonKeyboard.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_PythonKeyboard.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_PYKEYBOARD
#define __KX_PYKEYBOARD
@@ -32,14 +36,14 @@ class SCA_PythonKeyboard : public PyObjectPlus
Py_Header;
private:
class SCA_IInputDevice *m_keyboard;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_event_dict;
#endif
public:
SCA_PythonKeyboard(class SCA_IInputDevice* keyboard);
virtual ~SCA_PythonKeyboard();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
#endif
};
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.cpp b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
index 936ee2ff5c4..94a0551c114 100644
--- a/source/gameengine/GameLogic/SCA_PythonMouse.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_PythonMouse.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_PythonMouse.h"
#include "SCA_IInputDevice.h"
#include "RAS_ICanvas.h"
@@ -35,20 +40,20 @@ SCA_PythonMouse::SCA_PythonMouse(SCA_IInputDevice* mouse, RAS_ICanvas* canvas)
m_mouse(mouse),
m_canvas(canvas)
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_event_dict = PyDict_New();
#endif
}
SCA_PythonMouse::~SCA_PythonMouse()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_event_dict);
Py_DECREF(m_event_dict);
#endif
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_PythonMouse.h b/source/gameengine/GameLogic/SCA_PythonMouse.h
index 9e1085e6bec..30a30b5d924 100644
--- a/source/gameengine/GameLogic/SCA_PythonMouse.h
+++ b/source/gameengine/GameLogic/SCA_PythonMouse.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_PythonMouse.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_PYMOUSE
#define __KX_PYMOUSE
@@ -33,7 +37,7 @@ class SCA_PythonMouse : public PyObjectPlus
private:
class SCA_IInputDevice *m_mouse;
class RAS_ICanvas *m_canvas;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_event_dict;
#endif
public:
@@ -42,7 +46,7 @@ public:
void Show(bool visible);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC(SCA_PythonMouse, show);
static PyObject* pyattr_get_events(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.cpp b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
index 4b90ca7dadf..3a6b00198e1 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Set random/camera stuff
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_RandomActuator.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "BoolValue.h"
#include "IntValue.h"
#include "FloatValue.h"
@@ -305,7 +312,7 @@ void SCA_RandomActuator::enforceConstraints() {
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/GameLogic/SCA_RandomActuator.h b/source/gameengine/GameLogic/SCA_RandomActuator.h
index 41d19f5b4c4..d28586b267e 100644
--- a/source/gameengine/GameLogic/SCA_RandomActuator.h
+++ b/source/gameengine/GameLogic/SCA_RandomActuator.h
@@ -1,7 +1,4 @@
-/**
- * Draw a random number, and put it in a property
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_RandomActuator.h
+ * \ingroup gamelogic
+ * \brief Draw a random number, and put it in a property
+ */
+
#ifndef __KX_RANDOMACTUATOR
#define __KX_RANDOMACTUATOR
@@ -92,7 +94,7 @@ class SCA_RandomActuator : public SCA_IActuator
virtual CValue* GetReplica();
virtual void ProcessReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -112,7 +114,7 @@ class SCA_RandomActuator : public SCA_IActuator
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setFloatNormal);
KX_PYMETHOD_DOC_VARARGS(SCA_RandomActuator, setFloatNegativeExponential);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_EditObjectActuator : public SCA_PropertyActuator */
diff --git a/source/gameengine/GameLogic/SCA_RandomEventManager.cpp b/source/gameengine/GameLogic/SCA_RandomEventManager.cpp
index a0ffed57ba5..0c1d30f77db 100644
--- a/source/gameengine/GameLogic/SCA_RandomEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for random events
*
* $Id$
@@ -28,6 +28,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GameLogic/SCA_RandomEventManager.cpp
+ * \ingroup gamelogic
+ */
+
#include "SCA_RandomEventManager.h"
#include "SCA_LogicManager.h"
#include "SCA_ISensor.h"
diff --git a/source/gameengine/GameLogic/SCA_RandomEventManager.h b/source/gameengine/GameLogic/SCA_RandomEventManager.h
index 51d233c4321..686cc225eac 100644
--- a/source/gameengine/GameLogic/SCA_RandomEventManager.h
+++ b/source/gameengine/GameLogic/SCA_RandomEventManager.h
@@ -1,6 +1,4 @@
-/**
- * Manager for random events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_RandomEventManager.h
+ * \ingroup gamelogic
+ * \brief Manager for random events
+ */
+
#ifndef __KX_RANDOMEVENTMGR
#define __KX_RANDOMEVENTMGR
diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
index f5cd4b07458..06c24c8211b 100644
--- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/GameLogic/SCA_RandomNumberGenerator.cpp
+ * \ingroup gamelogic
+ */
/**
* Generate random numbers that can be used by other components. We
* convert to different types/distributions elsewhere. This just
diff --git a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
index 8402d0312fc..0cfd8302ca2 100644
--- a/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
+++ b/source/gameengine/GameLogic/SCA_RandomNumberGenerator.h
@@ -1,8 +1,4 @@
-/**
- * Generate random numbers that can be used by other components. Each
- * generator needs its own generator, so that the seed can be set
- * on a per-generator basis.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -31,6 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_RandomNumberGenerator.h
+ * \ingroup gamelogic
+ * \brief Generate random numbers that can be used by other components. Each
+ * generator needs its own generator, so that the seed can be set
+ * on a per-generator basis.
+ */
+
#ifndef __KX_RANDOMNUMBERGENERATOR
#define __KX_RANDOMNUMBERGENERATOR
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.cpp b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
index a7d18ff40d4..99e25042582 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Generate random pulses
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_RandomSensor.cpp
+ * \ingroup gamelogic
+ */
+
+
+#include <stddef.h>
+
#include "SCA_RandomSensor.h"
#include "SCA_EventManager.h"
#include "SCA_RandomEventManager.h"
@@ -120,7 +127,7 @@ bool SCA_RandomSensor::Evaluate()
return evaluateResult;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -176,6 +183,6 @@ int SCA_RandomSensor::pyattr_set_seed(void *self_v, const KX_PYATTRIBUTE_DEF *at
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_RandomSensor.h b/source/gameengine/GameLogic/SCA_RandomSensor.h
index 3be17943d84..d559e17810b 100644
--- a/source/gameengine/GameLogic/SCA_RandomSensor.h
+++ b/source/gameengine/GameLogic/SCA_RandomSensor.h
@@ -1,6 +1,4 @@
-/**
- * Generate random pulses
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_RandomSensor.h
+ * \ingroup gamelogic
+ * \brief Generate random pulses
+ */
+
#ifndef __KX_RANDOMSENSOR
#define __KX_RANDOMSENSOR
@@ -56,7 +59,7 @@ public:
virtual bool IsPositiveTrigger();
virtual void Init();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/GameLogic/SCA_TimeEventManager.cpp b/source/gameengine/GameLogic/SCA_TimeEventManager.cpp
index d794a4f1227..55e9ca917f8 100644
--- a/source/gameengine/GameLogic/SCA_TimeEventManager.cpp
+++ b/source/gameengine/GameLogic/SCA_TimeEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,8 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/GameLogic/SCA_TimeEventManager.cpp
+ * \ingroup gamelogic
+ */
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
@@ -110,3 +114,9 @@ void SCA_TimeEventManager::RemoveTimeProperty(CValue* timeval)
}
}
}
+
+vector<CValue*> SCA_TimeEventManager::GetTimeValues()
+{
+ return m_timevalues;
+}
+
diff --git a/source/gameengine/GameLogic/SCA_TimeEventManager.h b/source/gameengine/GameLogic/SCA_TimeEventManager.h
index b2a2eb5fe5d..43eacfe16fa 100644
--- a/source/gameengine/GameLogic/SCA_TimeEventManager.h
+++ b/source/gameengine/GameLogic/SCA_TimeEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SCA_TimeEventManager.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_TIMEEVENTMANAGER
#define __KX_TIMEEVENTMANAGER
@@ -49,6 +54,7 @@ public:
void AddTimeProperty(CValue* timeval);
void RemoveTimeProperty(CValue* timeval);
+ vector<CValue*> GetTimeValues();
#ifdef WITH_CXX_GUARDEDALLOC
public:
diff --git a/source/gameengine/GameLogic/SCA_XNORController.cpp b/source/gameengine/GameLogic/SCA_XNORController.cpp
index 9f54e41d110..01765796fa5 100644
--- a/source/gameengine/GameLogic/SCA_XNORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XNORController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Xnor' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_XNORController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_XNORController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -91,7 +96,7 @@ CValue* SCA_XNORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -128,6 +133,6 @@ PyAttributeDef SCA_XNORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_XNORController.h b/source/gameengine/GameLogic/SCA_XNORController.h
index 54361be163a..5696585a0fc 100644
--- a/source/gameengine/GameLogic/SCA_XNORController.h
+++ b/source/gameengine/GameLogic/SCA_XNORController.h
@@ -1,6 +1,4 @@
-/**
- * SCA_XNORController.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_XNORController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_XNORCONTROLLER
#define __KX_XNORCONTROLLER
diff --git a/source/gameengine/GameLogic/SCA_XORController.cpp b/source/gameengine/GameLogic/SCA_XORController.cpp
index a58f30a3bed..f5eefd5cc08 100644
--- a/source/gameengine/GameLogic/SCA_XORController.cpp
+++ b/source/gameengine/GameLogic/SCA_XORController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* 'Xor' together all inputs
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GameLogic/SCA_XORController.cpp
+ * \ingroup gamelogic
+ */
+
+
#include "SCA_XORController.h"
#include "SCA_ISensor.h"
#include "SCA_LogicManager.h"
@@ -91,7 +96,7 @@ CValue* SCA_XORController::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -127,6 +132,6 @@ PyMethodDef SCA_XORController::Methods[] = {
PyAttributeDef SCA_XORController::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/GameLogic/SCA_XORController.h b/source/gameengine/GameLogic/SCA_XORController.h
index 940e3d2135c..84f7120546f 100644
--- a/source/gameengine/GameLogic/SCA_XORController.h
+++ b/source/gameengine/GameLogic/SCA_XORController.h
@@ -1,6 +1,4 @@
-/**
- * SCA_XORController.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SCA_XORController.h
+ * \ingroup gamelogic
+ */
+
#ifndef __KX_XORCONTROLLER
#define __KX_XORCONTROLLER
diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript
index 507bb7f0bdd..d5fd90cd79d 100644
--- a/source/gameengine/GameLogic/SConscript
+++ b/source/gameengine/GameLogic/SConscript
@@ -15,12 +15,21 @@ else:
defs.append('DISABLE_SDL')
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
if env['BF_DEBUG']:
defs.append('_DEBUG')
-env.BlenderLib ( 'bf_logic', sources, Split(incs), defs, libtype=['core','player'], priority=[330,65], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #/intern/guardedalloc'
+
+env.BlenderLib ( 'ge_logic', sources, Split(incs), defs, libtype=['core','player'], priority=[330,65], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/GamePlayer/CMakeLists.txt b/source/gameengine/GamePlayer/CMakeLists.txt
index f0ce3afbe10..ab89b18a09b 100644
--- a/source/gameengine/GamePlayer/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/CMakeLists.txt
@@ -24,9 +24,9 @@
#
# ***** END GPL LICENSE BLOCK *****
-ADD_SUBDIRECTORY(common)
-ADD_SUBDIRECTORY(ghost)
+add_subdirectory(common)
+add_subdirectory(ghost)
-IF(WITH_WEBPLUGIN)
- ADD_SUBDIRECTORY(xembed)
-ENDIF(WITH_WEBPLUGIN)
+if(WITH_WEBPLUGIN)
+ add_subdirectory(xembed)
+endif()
diff --git a/source/gameengine/GamePlayer/Makefile b/source/gameengine/GamePlayer/Makefile
deleted file mode 100644
index 30a13f26503..00000000000
--- a/source/gameengine/GamePlayer/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine/GamePlayer
-DIR = $(OCGDIR)/gameengine/GamePlayer
-DIRS = common ghost
-
-ifeq ($(WITH_BF_WEBPLUGIN),true)
-ifeq ($(OS),$(findstring $(OS), "freebsd irix windows"))
- ifneq ($(FREE_WINDOWS),true)
- DIRS += netscape
- endif
-endif
-
-ifeq ($(OS),$(findstring $(OS), "linux"))
- ifeq ($(CPU),i386)
- DIRS += netscape
- endif
-endif
-
-ifeq ($(OS),$(findstring $(OS), "solaris"))
- ifeq ($(CPU),sparc)
- DIRS += netscape
- endif
-endif
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt
index 08a4aa50a00..0bd8a0dd9a3 100644
--- a/source/gameengine/GamePlayer/common/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/common/CMakeLists.txt
@@ -24,20 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC
- bmfont.cpp
- GPC_Canvas.cpp
- GPC_Engine.cpp
- GPC_KeyboardDevice.cpp
- GPC_MouseDevice.cpp
- GPC_RawImage.cpp
- GPC_RawLoadDotBlendArray.cpp
- GPC_RawLogoArrays.cpp
- GPC_RenderTools.cpp
- GPC_System.cpp
-)
-
-SET(INC
+set(INC
.
../../../../intern/string
../../../../intern/ghost
@@ -50,9 +37,9 @@ SET(INC
../../../../source/blender/imbuf
../../../../source/gameengine/Ketsji
../../../../source/blender/blenlib
+ ../../../../source/blender/blenfont
../../../../source/blender/blenkernel
../../../../source/blender
- ../../../../source/blender/include
../../../../source/blender/makesdna
../../../../source/gameengine/Rasterizer
../../../../source/gameengine/GameLogic
@@ -62,15 +49,37 @@ SET(INC
../../../../source/gameengine/Physics/common
../../../../source/gameengine/Network/LoopBackNetwork
../../../../source/gameengine/GamePlayer/ghost
- ../../../../source/blender/misc
../../../../source/blender/blenloader
../../../../source/blender/gpu
../../../../extern/glew/include
- ${PYTHON_INC}
- ${PNG_INC}
- ${ZLIB_INC}
+ ${PYTHON_INCLUDE_DIRS}
+ ${PNG_INCLUDE_DIR}
+ ${ZLIB_INCLUDE_DIRS}
+)
+
+set(SRC
+ bmfont.cpp
+ GPC_Canvas.cpp
+ GPC_Engine.cpp
+ GPC_KeyboardDevice.cpp
+ GPC_MouseDevice.cpp
+ GPC_RawImage.cpp
+ GPC_RawLoadDotBlendArray.cpp
+ GPC_RawLogoArrays.cpp
+ GPC_RenderTools.cpp
+ GPC_System.cpp
+
+ GPC_Canvas.h
+ GPC_Engine.h
+ GPC_KeyboardDevice.h
+ GPC_MouseDevice.h
+ GPC_RawImage.h
+ GPC_RawLoadDotBlendArray.h
+ GPC_RawLogoArrays.h
+ GPC_RenderTools.h
+ GPC_System.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB_NOLIST(gp_common "${SRC}" "${INC}")
+blender_add_lib_nolist(ge_player_common "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
index b90aec75959..7ea5da9433c 100644
--- a/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_Canvas.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_Canvas.cpp
+ * \ingroup player
+ */
+
+
#ifndef NOPNG
#ifdef WIN32
#include "png.h"
diff --git a/source/gameengine/GamePlayer/common/GPC_Canvas.h b/source/gameengine/GamePlayer/common/GPC_Canvas.h
index 6e5d58c8478..87693696c2a 100644
--- a/source/gameengine/GamePlayer/common/GPC_Canvas.h
+++ b/source/gameengine/GamePlayer/common/GPC_Canvas.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_Canvas.h
+ * \ingroup player
+ */
+
#ifndef _GPC_CANVAS_H_
#define _GPC_CANVAS_H_
diff --git a/source/gameengine/GamePlayer/common/GPC_Engine.cpp b/source/gameengine/GamePlayer/common/GPC_Engine.cpp
index 54ace227821..48ebfcaadf2 100644
--- a/source/gameengine/GamePlayer/common/GPC_Engine.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_Engine.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_Engine.cpp
+ * \ingroup player
+ */
+
+
#ifdef WIN32
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#endif // WIN32
diff --git a/source/gameengine/GamePlayer/common/GPC_Engine.h b/source/gameengine/GamePlayer/common/GPC_Engine.h
index 0b7c85396f2..cfa280c5385 100644
--- a/source/gameengine/GamePlayer/common/GPC_Engine.h
+++ b/source/gameengine/GamePlayer/common/GPC_Engine.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_Engine.h
+ * \ingroup player
+ */
+
#ifndef __GPC_ENGINE_H
#define __GPC_ENGINE_H
diff --git a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp
index 3d61e63f09e..957ab2b70d1 100644
--- a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_KeyboardDevice.cpp
+ * \ingroup player
+ */
+
+
#include "GPC_KeyboardDevice.h"
#include <cstdlib>
diff --git a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
index 206d37f7be6..a35a55ddf03 100644
--- a/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
+++ b/source/gameengine/GamePlayer/common/GPC_KeyboardDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_KeyboardDevice.h
+ * \ingroup player
+ */
+
#ifndef __GPC_KEYBOARDDEVICE_H
#define __GPC_KEYBOARDDEVICE_H
diff --git a/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp b/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp
index 706c3d178cd..53b061acf69 100644
--- a/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_MouseDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_MouseDevice.cpp
+ * \ingroup player
+ */
+
+
#include "GPC_MouseDevice.h"
GPC_MouseDevice::GPC_MouseDevice()
diff --git a/source/gameengine/GamePlayer/common/GPC_MouseDevice.h b/source/gameengine/GamePlayer/common/GPC_MouseDevice.h
index 41f34b8e22f..d35faa30d92 100644
--- a/source/gameengine/GamePlayer/common/GPC_MouseDevice.h
+++ b/source/gameengine/GamePlayer/common/GPC_MouseDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_MouseDevice.h
+ * \ingroup player
+ */
+
#ifndef __GPC_MOUSE_DEVICE_H
#define __GPC_MOUSE_DEVICE_H
diff --git a/source/gameengine/GamePlayer/common/GPC_RawImage.cpp b/source/gameengine/GamePlayer/common/GPC_RawImage.cpp
index 42f3b2dc1e1..126223f072b 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawImage.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RawImage.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/GamePlayer/common/GPC_RawImage.cpp
+ * \ingroup player
+ */
+
#include <iostream>
#include <string.h>
diff --git a/source/gameengine/GamePlayer/common/GPC_RawImage.h b/source/gameengine/GamePlayer/common/GPC_RawImage.h
index b66567854dd..2db9c093e36 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawImage.h
+++ b/source/gameengine/GamePlayer/common/GPC_RawImage.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_RawImage.h
+ * \ingroup player
+ */
+
#ifndef __GPC_RAWIMAGE_H__
#define __GPC_RAWIMAGE_H__
diff --git a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp
index 159a6f50776..160b3ad3da3 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.cpp
+ * \ingroup player
+ */
+
+
// This file is automatically generated. Do not edit by hand!
#include "GPC_RawLoadDotBlendArray.h"
diff --git a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.h b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.h
index 4a1ff4e43fa..0b07ab85f65 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.h
+++ b/source/gameengine/GamePlayer/common/GPC_RawLoadDotBlendArray.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_RawLoadDotBlendArray.h
+ * \ingroup player
+ */
+
#ifndef __GPC_RAWLOADDOTBLENDARRAY_H
#define __GPC_RAWLOADDOTBLENDARRAY_H
diff --git a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp
index 761e53cf1d3..edfbd71da9c 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_RawLogoArrays.cpp
+ * \ingroup player
+ */
+
+
// This file is automatically generated. Do not edit by hand!
#include "GPC_RawLogoArrays.h"
diff --git a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.h b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.h
index 464b7bacec8..a1eb0a4861c 100644
--- a/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.h
+++ b/source/gameengine/GamePlayer/common/GPC_RawLogoArrays.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_RawLogoArrays.h
+ * \ingroup player
+ */
+
#ifndef __GPC_RAWLOGOARRAYS_H
#define __GPC_RAWLOGOARRAYS_H
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
index e02b5fedaf0..be84c601a04 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_RenderTools.cpp
+ * \ingroup player
+ */
+
+
#include "GL/glew.h"
#include "RAS_IRenderTools.h"
@@ -53,6 +58,10 @@
#include "GPC_RenderTools.h"
+extern "C" {
+#include "BLF_api.h"
+}
+
unsigned int GPC_RenderTools::m_numgllights;
@@ -276,6 +285,35 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
}
}
+void GPC_RenderTools::RenderText3D( int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect)
+{
+ /* the actual drawing */
+ glColor3fv(color);
+
+ /* multiply the text matrix by the object matrix */
+ BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
+ BLF_matrix(fontid, mat);
+
+ /* aspect is the inverse scale that allows you to increase */
+ /* your resolution without sizing the final text size */
+ /* the bigger the size, the smaller the aspect */
+ BLF_aspect(fontid, aspect, aspect, aspect);
+
+ BLF_size(fontid, size, dpi);
+ BLF_position(fontid, 0, 0, 0);
+ BLF_draw(fontid, (char *)text, strlen(text));
+
+ BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
+ glEnable(GL_DEPTH_TEST);
+}
+
+
void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
@@ -284,8 +322,9 @@ void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
int width,
int height)
{
+ /*
STR_String tmpstr(text);
- char* s = tmpstr.Ptr();
+ char* s = tmpstr.Ptr(); */
// Save and change OpenGL settings
int texture2D;
@@ -313,13 +352,11 @@ void GPC_RenderTools::RenderText2D(RAS_TEXT_RENDER_MODE mode,
if (mode == RAS_IRenderTools::RAS_TEXT_PADDED)
{
glColor3ub(0, 0, 0);
- glRasterPos2s(xco+1, height-yco-1);
- // XXX BMF_DrawString(m_font, s);
+ BLF_draw_default(xco+1, height-yco-1, 0.f, text, strlen(text));
}
glColor3ub(255, 255, 255);
- glRasterPos2s(xco, height-yco);
- // XXX BMF_DrawString(m_font, s);
+ BLF_draw_default(xco, height-yco, 0.f, text, strlen(text));
// Restore view settings
glMatrixMode(GL_PROJECTION);
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.h b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
index 378c6d8580f..ee490dacddb 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.h
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_RenderTools.h
+ * \ingroup player
+ */
+
#ifndef __GPC_RENDERTOOLS_H
#define __GPC_RENDERTOOLS_H
@@ -68,6 +72,13 @@ public:
void DisableOpenGLLights();
void ProcessLighting(RAS_IRasterizer *rasty, bool uselights, const MT_Transform& viewmat);
+ void RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect);
/* @attention mode is ignored here */
void RenderText2D(RAS_TEXT_RENDER_MODE mode,
const char* text,
diff --git a/source/gameengine/GamePlayer/common/GPC_System.cpp b/source/gameengine/GamePlayer/common/GPC_System.cpp
index 36022bae9dd..514bd2fa4dc 100644
--- a/source/gameengine/GamePlayer/common/GPC_System.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_System.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/common/GPC_System.cpp
+ * \ingroup player
+ */
+
+
#include "GPC_System.h"
#include "GPC_KeyboardDevice.h"
diff --git a/source/gameengine/GamePlayer/common/GPC_System.h b/source/gameengine/GamePlayer/common/GPC_System.h
index 65a488e08bd..51847827f10 100644
--- a/source/gameengine/GamePlayer/common/GPC_System.h
+++ b/source/gameengine/GamePlayer/common/GPC_System.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPC_System.h
+ * \ingroup player
+ */
+
#ifndef __GPC_SYSTEM_H
#define __GPC_SYSTEM_H
diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile
deleted file mode 100644
index e28cacb826a..00000000000
--- a/source/gameengine/GamePlayer/common/Makefile
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = common
-DIR = $(OCGDIR)/gameengine/GamePlayer/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../../blender/blenloader
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/imbuf
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/gpu
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_PNG)/include
-CPPFLAGS += -I$(NAN_ZLIB)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../../../gameengine/Converter
-CPPFLAGS += -I../../../gameengine/Expressions
-CPPFLAGS += -I../../../gameengine/GameLogic
-CPPFLAGS += -I../../../gameengine/Converter
-CPPFLAGS += -I../../../gameengine/BlenderRoutines
-CPPFLAGS += -I../../../gameengine/Ketsji
-CPPFLAGS += -I../../../gameengine/Ketsji/KXNetwork
-CPPFLAGS += -I../../../gameengine/Network
-CPPFLAGS += -I../../../gameengine/Network/LoopBackNetwork
-CPPFLAGS += -I../../../gameengine/Rasterizer
-CPPFLAGS += -I../../../gameengine/SceneGraph
-CPPFLAGS += -I../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../../gameengine/Physics/common
-
-###############################
-
-SOURCEDIR = source/gameengine/GamePlayer/common
-DIRS =
-ifeq ($(OS),windows)
-# Still
- DIRS = windows
-else
- ifneq ($(OS),darwin)
- DIRS = unix
- endif
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/GamePlayer/common/SConscript b/source/gameengine/GamePlayer/common/SConscript
index 7a16e950b36..082e413822d 100644
--- a/source/gameengine/GamePlayer/common/SConscript
+++ b/source/gameengine/GamePlayer/common/SConscript
@@ -26,6 +26,7 @@ incs = ['.',
'#source/blender/imbuf',
'#source/gameengine/Ketsji',
'#source/blender/blenlib',
+ '#source/blender/blenfont',
'#source/blender/blenkernel',
'#source/blender',
'#source/blender/include',
@@ -44,28 +45,19 @@ incs = ['.',
'#source/blender/gpu',
'#extern/glew/include']
-#This is all plugin stuff!
-#if sys.platform=='win32':
-# source_files += ['windows/GPW_Canvas.cpp',
-# 'windows/GPW_Engine.cpp',
-# 'windows/GPW_KeyboardDevice.cpp',
-# 'windows/GPW_System.cpp']
-# gp_common_env.Append ( CPPPATH = ['windows'])
-#elif sys.platform=='linux2' or sys.platform=='linux-i386':
-# source_files += ['unix/GPU_Canvas.cpp',
-# 'unix/GPU_Engine.cpp',
-# 'unix/GPU_KeyboardDevice.cpp',
-# 'unix/GPU_System.cpp']
-# gp_common_env.Append ( CPPPATH = ['unix'])
-
defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += Split(env['BF_PYTHON_INC'])
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += Split(env['BF_PYTHON_INC'])
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
incs += Split(env['BF_PNG_INC'])
incs += Split(env['BF_ZLIB_INC'])
-env.BlenderLib (libname='gp_common', sources=source_files, includes=incs, defines = defs, libtype=['player'], priority=[5], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib (libname='ge_player_common', sources=source_files, includes=incs, defines = defs, libtype=['player'], priority=[5], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/GamePlayer/common/bmfont.cpp b/source/gameengine/GamePlayer/common/bmfont.cpp
index 3532eb81f87..e3b900173d9 100644
--- a/source/gameengine/GamePlayer/common/bmfont.cpp
+++ b/source/gameengine/GamePlayer/common/bmfont.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* bmfont.c
*
* 04-10-2000 frank
@@ -32,6 +32,11 @@
*
*/
+/** \file gameengine/GamePlayer/common/bmfont.cpp
+ * \ingroup player
+ */
+
+
/**
* Two external functions:
*
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp
deleted file mode 100644
index 3eb7147bd98..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <assert.h>
-#include <unistd.h>
-#include "GPU_Engine.h"
-#include "GPC_MouseDevice.h"
-#include "GPU_Canvas.h"
-#include "GPU_KeyboardDevice.h"
-#include "GPU_System.h"
-
-#include "BLI_blenlib.h"
-#include "BLO_readfile.h"
-
-#include "SND_DeviceManager.h"
-
-#include "NG_NetworkScene.h"
-#include "NG_LoopBackNetworkDeviceInterface.h"
-#include "SND_DeviceManager.h"
-#include "KX_BlenderSceneConverter.h"
-#include "KX_KetsjiEngine.h"
-
-#include "GPC_RenderTools.h"
-#include "GPC_RawImage.h"
-
-void Redraw(GPU_Engine *engine); // -the- redraw function
-
-// callback functions
-/*
-void RedrawCallback(Widget, XtPointer closure, XEvent *, Boolean *continue_to_dispatch);
-
-void KeyDownCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-void KeyUpCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-
-void ButtonPressReleaseCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-void PointerMotionCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch);
-
-void TimeOutCallback(XtPointer closure, XtIntervalId *id);
-*/
-
-GPU_Engine::GPU_Engine(char *customLoadingAnimationURL,
- int foregroundColor, int backgroundColor, int frameRate) :
- GPC_Engine(customLoadingAnimationURL, foregroundColor, backgroundColor,
- frameRate), m_timerTimeOutMsecs(10)
-{
-}
-
-
-GPU_Engine::~GPU_Engine()
-{
-}
-
-/*
-bool GPU_Engine::Initialize(Display *display, Window window, int width, int height)
-{
- SND_DeviceManager::Subscribe();
- m_audiodevice = SND_DeviceManager::Instance();
-
- m_keyboarddev = new GPU_KeyboardDevice();
- m_mousedev = new GPC_MouseDevice();
-
- // constructor only initializes data
- // m_canvas = new GPU_Canvas(display, window, width, height);
- //m_canvas->Init(); // create the actual visual and rendering context
- //cout << "GPU_Canvas created and initialized, m_canvas " << m_canvas << endl;
- //AddEventHandlers(); // done here (in GPU_Engine) since the event handlers need access to 'this', ie the engine
-
- // put the Blender logo in the topleft corner
- if(m_BlenderLogo != 0)
- // adding a banner automatically enables them
- m_BlenderLogoId = m_canvas->AddBanner(m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Data(), GPC_Canvas::alignTopLeft);
-
- // put the Blender3D logo in the bottom right corner
- if(m_Blender3DLogo != 0)
- // adding a banner automatically enables them
- m_Blender3DLogoId = m_canvas->AddBanner(m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Data(), GPC_Canvas::alignTopLeft);
-
-#if 0
- // put the NaN logo in the bottom right corner
- if(m_NaNLogo != 0)
- // adding a banner automatically enables them
- m_NaNLogoId = m_canvas->AddBanner(m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Data(), GPC_Canvas::alignBottomRight);
-#endif
- // enable the display of all banners
- m_canvas->SetBannerDisplayEnabled(true);
-
- m_rendertools = new GPC_RenderTools();
-
- m_networkdev = new NG_LoopBackNetworkDeviceInterface();
- assert(m_networkdev);
-
- // creation of system needs 'current rendering context', this is taken care
- // of by the GPU_Canvas::Init()
- m_system = new GPU_System();
-
- m_system->SetKeyboardDevice((GPU_KeyboardDevice *)m_keyboarddev);
- m_system->SetMouseDevice(m_mousedev);
- m_system->SetNetworkDevice(m_networkdev);
-
- m_initialized = true;
-
- return m_initialized;
-}
-*/
-
-/*
-void GPU_Engine::HandleNewWindow(Window window)
-{
- // everything only if it's really a new window
- if(window != ((GPU_Canvas *)m_canvas)->GetWindow())
- {
- cout << "GPU_Engine::HandleNewWindow(), new window so calling SetNewWindowMakeNewWidgetAndMakeCurrent()" << endl;
- // We don't have to remove the event handlers ourselves, they are destroyed by X11
-
- // make canvas aware of new window, and make it current
- ((GPU_Canvas *)m_canvas)->SetNewWindowMakeNewWidgetAndMakeCurrent(window);
-
- // and add event handlers to new widget
- AddEventHandlers();
- cout << "GPU_Engine::HandleNewWindow(), event handlers added" << endl;
- }
-}
-*/
-/*
-void GPU_Engine::AddEventHandlers(void)
-{
- Widget widget = ((GPU_Canvas *)m_canvas)->GetWidget();
-
- // redraw
- // MUST be the *Raw* event handler, the normal one doesn't work!
- XtAddRawEventHandler(widget, ExposureMask, FALSE, RedrawCallback, this);
-#if 0
- // key down
- XtAddRawEventHandler(widget, KeyPressMask, FALSE, KeyDownCallback, this);
- // key up
- XtAddRawEventHandler(widget, KeyReleaseMask, FALSE, KeyUpCallback, this);
-
- // mouse button press
- XtAddRawEventHandler(widget, ButtonPressMask, FALSE, ButtonPressReleaseCallback, this);
- // mouse button release
- XtAddRawEventHandler(widget, ButtonReleaseMask, FALSE, ButtonPressReleaseCallback, this);
- // mouse motion
- XtAddRawEventHandler(widget, PointerMotionMask, FALSE, PointerMotionCallback, this);
-#endif
-#if 0
- // time out, not a real timer. New time out will be set in callback
- m_timerId = XtAppAddTimeOut(XtWidgetToApplicationContext(widget),
- m_timerTimeOutMsecs, TimeOutCallback, this);
-#endif
-}
-*/
-
-void Redraw(GPU_Engine *engine)
-{
-/* if(engine->Running())
- {
- if(engine->Loading())
- {
- engine->UpdateLoadingAnimation();
- }
-
- engine->m_system->DoMainLoopCallback();
- }*/
-}
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++
- * Callback functions
- +++++++++++++++++++++++++++++++++++++++++++++++++*/
-void RedrawCallback(Widget, XtPointer closure, XEvent *, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
-
- Redraw(engine);
-
- *continue_to_dispatch = True;
-}
-
-
-void KeyDownCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
-/* GPU_Engine *engine = (GPU_Engine *)closure;
- XKeyEvent *keyEvent = (XKeyEvent *)event;
-
- if(engine->Running())
- engine->m_system->AddKey(int(keyEvent->keycode), 1);
-
- *continue_to_dispatch = True;*/
-}
-
-
-void KeyUpCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
-/* GPU_Engine *engine = (GPU_Engine *)closure;
- XKeyEvent *keyEvent = (XKeyEvent *)event;
-
- if(engine->Running())
- engine->m_system->AddKey(int(keyEvent->keycode), 0);
-
- *continue_to_dispatch = True;*/
-}
-
-
-void ButtonPressReleaseCallback(Widget, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
- XButtonEvent *buttonEvent = (XButtonEvent *)event;
- bool isDown;
- GPC_MouseDevice::TButtonId button;
-
- if(engine->Running())
- {
- // determine type of event, press or release
- isDown = false;
- if(buttonEvent->type == ButtonPress)
- isDown = true;
- // determine which button exactly generated this event
- switch(buttonEvent->button)
- {
- case 1:
- button = GPC_MouseDevice::buttonLeft;
- break;
- case 2:
- button = GPC_MouseDevice::buttonMiddle;
- break;
- case 3:
- button = GPC_MouseDevice::buttonRight;
- break;
- }
- engine->m_mousedev->ConvertButtonEvent(button,
- isDown, buttonEvent->x, buttonEvent->y);
- }
-
- *continue_to_dispatch = True;
-}
-
-
-void PointerMotionCallback(Widget w, XtPointer closure, XEvent *event, Boolean *continue_to_dispatch)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
- XButtonEvent *buttonEvent = (XButtonEvent *)event;
-
- if(engine->Running())
- {
- engine->m_mousedev->ConvertMoveEvent(buttonEvent->x, buttonEvent->y);
- }
-
- *continue_to_dispatch = True;
-}
-
-/*
-void TimeOutCallback(XtPointer closure, XtIntervalId *id)
-{
- GPU_Engine *engine = (GPU_Engine *)closure;
-
- Redraw(engine);
- // add a new time out since there is no real timer for X (not a simple one like under windows)
- // TODO Have to get faster timer !
-
- if(engine->Running())
- engine->m_timerId = XtAppAddTimeOut(XtWidgetToApplicationContext(
- ((GPU_Canvas *)engine->m_canvas)->GetWidget()),
- engine->m_timerTimeOutMsecs, TimeOutCallback,
- closure);
-}
-
-*/
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h b/source/gameengine/GamePlayer/common/unix/GPU_Engine.h
deleted file mode 100644
index 12fb70c84ef..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_ENGINE_H
-#define __GPU_ENGINE_H
-
-#include <X11/Xlib.h>
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-
-#define Object DNA_Object // tricky stuff !!! but without it, it doesn't compile...
-
-#include "GPC_Engine.h"
-
-
-class GPU_Engine : public GPC_Engine
-{
-public:
- XtIntervalId m_timerId;
- unsigned long m_timerTimeOutMsecs;
-
-public:
- GPU_Engine(char *customLoadingAnimation,
- int foregroundColor, int backgroundColor, int frameRate);
- virtual ~GPU_Engine();
- bool Initialize(Display *display, Window window, int width, int height);
-
- void HandleNewWindow(Window window);
-
-private:
- void AddEventHandlers();
-};
-
-#endif // __GPU_ENGINE_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp
deleted file mode 100644
index 5444cf22ac9..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#include "GPU_KeyboardDevice.h"
-
-void GPU_KeyboardDevice::register_X_key_down_event(KeySym k)
-{
- ConvertEvent(k, 1);
-}
-
-void GPU_KeyboardDevice::register_X_key_up_event(KeySym k)
-{
- ConvertEvent(k, 0);
-}
-
-
-#define map_x_key_to_kx_key(x,y) m_reverseKeyTranslateTable[x] = y;
-
-GPU_KeyboardDevice::GPU_KeyboardDevice(void)
-{
- unsigned int i = 0;
-
- // Needed?
- m_reverseKeyTranslateTable.clear();
-
- for (i = XK_A; i< XK_Z; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((unsigned int)SCA_IInputDevice::KX_AKEY) + i - XK_A);
- }
-
- // Shifted versions: should not occur: KX doesn't distinguish
- for (i = XK_a; i< XK_z; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_AKEY) + i - XK_a);
- }
-
- for (i = XK_0; i< XK_9; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_ZEROKEY) + i - XK_0);
- }
-
- for (i = XK_F1; i< XK_F19; i++) {
- m_reverseKeyTranslateTable[i]
- = (SCA_IInputDevice::KX_EnumInputs)
- (((int)SCA_IInputDevice::KX_F1KEY) + i - XK_F1);
- }
-
- // the remainder:
- map_x_key_to_kx_key(XK_BackSpace, SCA_IInputDevice::KX_BACKSPACEKEY);
- map_x_key_to_kx_key(XK_Tab, SCA_IInputDevice::KX_TABKEY);
- map_x_key_to_kx_key(XK_Return, SCA_IInputDevice::KX_RETKEY);
- map_x_key_to_kx_key(XK_Escape, SCA_IInputDevice::KX_ESCKEY);
- map_x_key_to_kx_key(XK_space, SCA_IInputDevice::KX_SPACEKEY);
-
- map_x_key_to_kx_key(XK_Shift_L, SCA_IInputDevice::KX_LEFTSHIFTKEY);
- map_x_key_to_kx_key(XK_Shift_R, SCA_IInputDevice::KX_RIGHTSHIFTKEY);
- map_x_key_to_kx_key(XK_Control_L, SCA_IInputDevice::KX_LEFTCTRLKEY);
- map_x_key_to_kx_key(XK_Control_R, SCA_IInputDevice::KX_RIGHTCTRLKEY);
- map_x_key_to_kx_key(XK_Alt_L, SCA_IInputDevice::KX_LEFTALTKEY);
- map_x_key_to_kx_key(XK_Alt_R, SCA_IInputDevice::KX_RIGHTALTKEY);
-
- map_x_key_to_kx_key(XK_Insert, SCA_IInputDevice::KX_INSERTKEY);
- map_x_key_to_kx_key(XK_Delete, SCA_IInputDevice::KX_DELKEY);
- map_x_key_to_kx_key(XK_Home, SCA_IInputDevice::KX_HOMEKEY);
- map_x_key_to_kx_key(XK_End, SCA_IInputDevice::KX_ENDKEY);
- map_x_key_to_kx_key(XK_Page_Up, SCA_IInputDevice::KX_PAGEUPKEY);
- map_x_key_to_kx_key(XK_Page_Down, SCA_IInputDevice::KX_PAGEDOWNKEY);
-
- map_x_key_to_kx_key(XK_Left, SCA_IInputDevice::KX_LEFTARROWKEY);
- map_x_key_to_kx_key(XK_Right, SCA_IInputDevice::KX_RIGHTARROWKEY);
- map_x_key_to_kx_key(XK_Up, SCA_IInputDevice::KX_UPARROWKEY);
- map_x_key_to_kx_key(XK_Down, SCA_IInputDevice::KX_DOWNARROWKEY);
-
- map_x_key_to_kx_key(XK_KP_0, SCA_IInputDevice::KX_PAD0);
- map_x_key_to_kx_key(XK_KP_1, SCA_IInputDevice::KX_PAD1);
- map_x_key_to_kx_key(XK_KP_2, SCA_IInputDevice::KX_PAD2);
- map_x_key_to_kx_key(XK_KP_3, SCA_IInputDevice::KX_PAD3);
- map_x_key_to_kx_key(XK_KP_4, SCA_IInputDevice::KX_PAD4);
- map_x_key_to_kx_key(XK_KP_5, SCA_IInputDevice::KX_PAD5);
- map_x_key_to_kx_key(XK_KP_6, SCA_IInputDevice::KX_PAD6);
- map_x_key_to_kx_key(XK_KP_7, SCA_IInputDevice::KX_PAD7);
- map_x_key_to_kx_key(XK_KP_8, SCA_IInputDevice::KX_PAD8);
- map_x_key_to_kx_key(XK_KP_9, SCA_IInputDevice::KX_PAD9);
- map_x_key_to_kx_key(XK_KP_Decimal, SCA_IInputDevice::KX_PADPERIOD);
-
- map_x_key_to_kx_key(XK_KP_Insert, SCA_IInputDevice::KX_INSERTKEY);
- map_x_key_to_kx_key(XK_KP_End, SCA_IInputDevice::KX_ENDKEY);
- map_x_key_to_kx_key(XK_KP_Down, SCA_IInputDevice::KX_DOWNARROWKEY);
- map_x_key_to_kx_key(XK_KP_Page_Down,SCA_IInputDevice::KX_PAGEDOWNKEY);
- map_x_key_to_kx_key(XK_KP_Left, SCA_IInputDevice::KX_LEFTARROWKEY);
- map_x_key_to_kx_key(XK_KP_Right, SCA_IInputDevice::KX_RIGHTARROWKEY);
- map_x_key_to_kx_key(XK_KP_Home, SCA_IInputDevice::KX_HOMEKEY);
- map_x_key_to_kx_key(XK_KP_Up, SCA_IInputDevice::KX_UPARROWKEY);
- map_x_key_to_kx_key(XK_KP_Page_Up, SCA_IInputDevice::KX_PAGEUPKEY);
- map_x_key_to_kx_key(XK_KP_Delete, SCA_IInputDevice::KX_DELKEY);
-
- map_x_key_to_kx_key(XK_KP_Enter, SCA_IInputDevice::KX_PADENTER);
- map_x_key_to_kx_key(XK_KP_Add, SCA_IInputDevice::KX_PADPLUSKEY);
- map_x_key_to_kx_key(XK_KP_Subtract, SCA_IInputDevice::KX_PADMINUS);
- map_x_key_to_kx_key(XK_KP_Multiply, SCA_IInputDevice::KX_PADASTERKEY);
- map_x_key_to_kx_key(XK_KP_Divide, SCA_IInputDevice::KX_PADSLASHKEY);
-
- map_x_key_to_kx_key(XK_Caps_Lock, SCA_IInputDevice::KX_CAPSLOCKKEY);
-
-}
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h b/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h
deleted file mode 100644
index e4ff20c7159..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_KeyboardDevice.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_KEYBOARDDEVICE_H
-#define __GPU_KEYBOARDDEVICE_H
-
-#include <X11/keysym.h>
-#include <X11/X.h> // Brilliant name, eh? Stupid !@#!$!@#@@% This is
- // actually needed so as not to get name clashes between Object from
- // blender and Object from X11... The proper include would be
- // Intrinsic.h . Yes, we are a bunch of sado-masochists. Let's hurt
- // ourselves!
-
-#include "GPC_KeyboardDevice.h"
-
-class GPU_KeyboardDevice : public GPC_KeyboardDevice
-{
-public:
-
- void register_X_key_down_event(KeySym k);
- void register_X_key_up_event(KeySym k);
-
- GPU_KeyboardDevice(void);
- virtual ~GPU_KeyboardDevice()
- {
- /* intentionally empty */
- }
-
- private:
- SCA_IInputDevice::KX_EnumInputs
- convert_x_keycode_to_kx_keycode(unsigned int key);
-};
-
-#endif // _GPU_KEYBOARDDEVICE_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h b/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h
deleted file mode 100644
index 66c8f830ad8..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_PolygonMaterial.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef __GPU_POLYGONMATERIAL_H
-#define __GPU_POLYGONMATERIAL_H
-
-#include "BP_PolygonMaterial.h"
-
-class GPU_PolygonMaterial : public BP_PolygonMaterial
-{
-public:
- GPUPolygonMaterial(const STR_String& texname, bool ba,const STR_String& matname,
- int tile, int tileXrep, int tileYrep, int mode, int transparant,
- int lightlayer,,void* tpage) :
- BP_PolygonMaterial(texname, ba,matname, tile, tileXrep, tileYrep,
- mode, transparant, lightlayer),
- m_tface(tpage)
- {
- }
-
- virtual ~GPU_PolygonMaterial()
- {
- }
-};
-
-#endif // __GPU_POLYGONMATERIAL_H
-
diff --git a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp b/source/gameengine/GamePlayer/common/unix/GPU_System.cpp
deleted file mode 100644
index 8085ecb4380..00000000000
--- a/source/gameengine/GamePlayer/common/unix/GPU_System.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include <sys/time.h>
-#include "GPU_System.h"
-
-static struct timeval startTime;
-static int startTimeDone = 0;
-
-
-double GPU_System::GetTimeInSeconds()
-{
- if(!startTimeDone)
- {
- gettimeofday(&startTime, NULL);
- startTimeDone = 1;
- }
-
- struct timeval now;
- gettimeofday(&now, NULL);
- // next '1000' are used for precision
- long ticks = (now.tv_sec - startTime.tv_sec) * 1000 + (now.tv_usec - startTime.tv_usec) / 1000;
- double secs = (double)ticks / 1000.0;
- return secs;
-}
diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile
deleted file mode 100644
index db29a087b28..00000000000
--- a/source/gameengine/GamePlayer/common/unix/Makefile
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = unix
-DIR = $(OCGDIR)/gameengine/GamePlayer/common/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-
-CPPFLAGS += -I..
-CPPFLAGS += -I../../netscape/src/ketsji
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-
-# Game Engine
-CPPFLAGS += -I../../../../gameengine/Converter
-CPPFLAGS += -I../../../../gameengine/Expressions
-CPPFLAGS += -I../../../../gameengine/GameLogic
-CPPFLAGS += -I../../../../gameengine/Ketsji
-CPPFLAGS += -I../../../../gameengine/Ketsji/KXNetwork
-CPPFLAGS += -I../../../../gameengine/Network
-CPPFLAGS += -I../../../../gameengine/Network/LoopBackNetwork
-CPPFLAGS += -I../../../../gameengine/Rasterizer
-CPPFLAGS += -I../../../../gameengine/Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../../../gameengine/SceneGraph
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-
-# Blender stuff
-CPPFLAGS += -I../../../../blender/blenkernel
-CPPFLAGS += -I../../../../blender/blenlib
-CPPFLAGS += -I../../../../blender/blenloader
-CPPFLAGS += -I../../../../blender/imbuf
-CPPFLAGS += -I../../../../blender/makesdna
-CPPFLAGS += -I../../../../kernel/gen_system
-
-CPPFLAGS += -I../../kernel/gen_system
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp
deleted file mode 100644
index 44437820bd2..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GPW_Canvas.h"
-
-GPW_Canvas::GPW_Canvas(HWND hWnd, HDC hDC, int width, int height)
- : GPC_Canvas(width, height), m_hWnd(hWnd), m_hRC(0), m_hDC(hDC)
-{
-}
-
-
-GPW_Canvas::~GPW_Canvas()
-{
- if (m_hRC) {
- ::wglDeleteContext(m_hRC);
- }
- //if (m_hDC) {
- // ::ReleaseDC(m_hWnd, m_hDC);
- //}
-}
-
-
-void GPW_Canvas::Init()
-{
-
-// log_entry("GPW_Canvas::Init");
-
- /*
- * Color and depth bit values are not to be trusted.
- * For instance, on TNT2:
- * When the screen color depth is set to 16 bit, we get 5 color bits
- * and 16 depth bits.
- * When the screen color depth is set to 32 bit, we get 8 color bits
- * and 24 depth bits.
- * Just to be safe, we request high quality settings.
- */
- PIXELFORMATDESCRIPTOR pfd =
- {
- sizeof(PIXELFORMATDESCRIPTOR), // iSize
- 1, // iVersion
- PFD_DRAW_TO_WINDOW |
- PFD_SUPPORT_OPENGL |
-// PFD_STEREO |
- PFD_DOUBLEBUFFER, // dwFlags
- PFD_TYPE_RGBA, // iPixelType
- 32, // cColorBits
- 0, 0, // cRedBits, cRedShift (ignored)
- 0, 0, // cGreenBits, cGreenShift (ignored)
- 0, 0, // cBlueBits, cBlueShift (ignored)
- 0, 0, // cAlphaBits, cAlphaShift (ignored)
- 0, 0, 0, 0, 0, // cAccum_X_Bits
- 32, // cDepthBits
- 0, // cStencilBits
- 0, // cAuxBuffers
- PFD_MAIN_PLANE, // iLayerType
- 0, // bReserved
- 0, // dwLayerMask
- 0, // dwVisibleMask
- 0 // dwDamageMask
- };
- PIXELFORMATDESCRIPTOR match;
-
- // Look what we get back for this pixel format
- int pixelFormat = ::ChoosePixelFormat(m_hDC, &pfd);
- if (!pixelFormat) {
- DWORD error = ::GetLastError();
- }
- ::DescribePixelFormat(m_hDC, pixelFormat, sizeof(match), &match);
-
- // Activate the pixel format for this context
- ::SetPixelFormat(m_hDC, ::ChoosePixelFormat(m_hDC, &match), &match);
-
- // Create the OpenGL context and make it current
- m_hRC = ::wglCreateContext(m_hDC);
- ::wglMakeCurrent(m_hDC, m_hRC);
-
-}
-
-void GPW_Canvas::SetMousePosition(int x, int y)
-{
- POINT point = { x, y };
- if (m_hWnd)
- {
- ::ClientToScreen(m_hWnd, &point);
- ::SetCursorPos(point.x, point.y);
- }
-}
-
-
-void GPW_Canvas::SetMouseState(RAS_MouseState mousestate)
-{
- LPCSTR id;
- switch (mousestate)
- {
- case MOUSE_INVISIBLE:
- HideCursor();
- break;
- case MOUSE_WAIT:
- ::SetCursor(::LoadCursor(0, IDC_WAIT));
- ShowCursor();
- break;
- case MOUSE_NORMAL:
- ::SetCursor(::LoadCursor(0, IDC_ARROW));
- ShowCursor();
- break;
- }
-}
-
-
-bool GPW_Canvas::BeginDraw(void)
-{
- ::wglMakeCurrent(m_hDC, m_hRC);
- // check errors, anyone?
- return true;
-}
-
-
-void GPW_Canvas::EndDraw(void)
-{
- ::wglMakeCurrent(NULL, NULL);
-}
-
-void GPW_Canvas::SwapBuffers(void)
-{
- if (m_hDC) {
- ::SwapBuffers(m_hDC);
- }
-}
-
-
-void GPW_Canvas::HideCursor(void)
-{
- int count = ::ShowCursor(FALSE);
- while (count >= 0)
- {
- count = ::ShowCursor(FALSE);
- }
-}
-
-
-void GPW_Canvas::ShowCursor(void)
-{
- ::ShowCursor(TRUE);
-}
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h b/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h
deleted file mode 100644
index f43be233ee2..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Canvas.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef _GPW_CANVAS_H_
-#define _GPW_CANVAS_H_
-
-#ifdef WIN32
-#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
-#endif
-
-#include <iostream>
-#include <windows.h>
-//#include <gl/gl.h>
-
-#include "GPC_Canvas.h"
-
-
-class GPW_Canvas : public GPC_Canvas
-{
-protected:
- /** The window handle. */
- HWND m_hWnd;
- /** Rendering context. */
- HGLRC m_hRC;
- /** Device Context. */
- HDC m_hDC;
-
-public:
- /**
- * Constructor.
- */
- GPW_Canvas(HWND hWnd, HDC hDC, int width, int height);
-
- /**
- * Destructor.
- */
- virtual ~GPW_Canvas(void);
-
- virtual void Init(void);
-
- /**
- * Moves the cursor to a new location.
- * @param x The x-coordinate of the new location.
- * @param x The y-coordinate of the new location.
- */
- virtual void SetMousePosition(int x, int y);
-
- /**
- * Sets the cursor shape and/or visibility.
- * @param mousestate The new state ofthe cursor.
- */
- virtual void SetMouseState(RAS_MouseState mousestate);
-
- bool BeginDraw(void);
- void EndDraw(void);
-
- virtual void SwapBuffers(void);
-
- virtual HDC GetHDC(void)
- {
- return m_hDC;
- }
-
- virtual void SetHDC(HDC hDC)
- {
- if (hDC != m_hDC) {
- m_hDC = hDC;
- }
- }
-
- virtual HGLRC GetHGLRC(void)
- {
- return m_hRC;
- }
-
-protected:
- /**
- * Hides the mouse cursor.
- */
- void HideCursor(void);
-
- /**
- * Shows the mouse cursor.
- */
- void ShowCursor(void);
-};
-
-#endif // _GPW_CANVAS_H_
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp b/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp
deleted file mode 100644
index f5e9f2e767c..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_Engine.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#pragma warning (disable : 4786)
-
-#include <assert.h>
-
-#include "GPC_MouseDevice.h"
-#include "GPC_RenderTools.h"
-#include "GPC_RawImage.h"
-
-#include "GPW_Canvas.h"
-#include "GPW_Engine.h"
-#include "GPW_KeyboardDevice.h"
-#include "GPW_System.h"
-
-
-#include "NG_NetworkScene.h"
-#include "NG_LoopBackNetworkDeviceInterface.h"
-
-GPW_Engine::GPW_Engine(char *customLoadingAnimationURL,
- int foregroundColor, int backgroundColor, int frameRate) :
- GPC_Engine(customLoadingAnimationURL, foregroundColor, backgroundColor,
- frameRate)
-{
-}
-
-
-GPW_Engine::~GPW_Engine()
-{
-}
-
-
-bool GPW_Engine::Initialize(HDC hdc, int width, int height)
-{
- m_keyboarddev = new GPW_KeyboardDevice();
- m_mousedev = new GPC_MouseDevice();
-
- // constructor only initializes data
- m_canvas = new GPW_Canvas(0, hdc, width, height);
- m_canvas->Init(); // create the actual visual and rendering context
-
- // put the Blender logo in the topleft corner
- if(m_BlenderLogo != 0)
- // adding a banner automatically enables them
- m_BlenderLogoId = m_canvas->AddBanner(m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Width(), m_BlenderLogo->Height(),
- m_BlenderLogo->Data(), GPC_Canvas::alignTopLeft);
-
- // put the Blender3D logo in the bottom right corner
- if(m_Blender3DLogo != 0)
- // adding a banner automatically enables them
- m_Blender3DLogoId = m_canvas->AddBanner(m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Width(), m_Blender3DLogo->Height(),
- m_Blender3DLogo->Data(), GPC_Canvas::alignBottomRight);
-#if 0
- // put the NaN logo in the bottom right corner
- if(m_NaNLogo != 0)
- // adding a banner automatically enables them
- m_NaNLogoId = m_canvas->AddBanner(m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Width(), m_NaNLogo->Height(),
- m_NaNLogo->Data(), GPC_Canvas::alignBottomRight);
-#endif
- // enable the display of all banners
- m_canvas->SetBannerDisplayEnabled(true);
-
- // stuff that must be done after creation of a rendering context
- //m_canvas->InitPostRenderingContext();
-
- m_rendertools = new GPC_RenderTools();
-
- m_networkdev = new NG_LoopBackNetworkDeviceInterface();
- assert(m_networkdev);
-
- // creation of system needs 'current rendering context', this is taken care
- // of by the GPW_Canvas
- m_system = new GPW_System();
-
-// m_system->SetKeyboardDevice((GPW_KeyboardDevice *)m_keyboarddev);
-// m_system->SetMouseDevice(m_mousedev);
-// m_system->SetNetworkDevice(m_networkdev);
-
- m_initialized = true;
-
- return m_initialized;
-}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp
deleted file mode 100644
index 7e8a50915c8..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GPW_KeyboardDevice.h"
-
-// Key code values not found in winuser.h
-#ifndef VK_MINUS
-#define VK_MINUS 0xBD
-#endif // VK_MINUS
-#ifndef VK_SEMICOLON
-#define VK_SEMICOLON 0xBA
-#endif // VK_SEMICOLON
-#ifndef VK_PERIOD
-#define VK_PERIOD 0xBE
-#endif // VK_PERIOD
-#ifndef VK_COMMA
-#define VK_COMMA 0xBC
-#endif // VK_COMMA
-#ifndef VK_QUOTE
-#define VK_QUOTE 0xDE
-#endif // VK_QUOTE
-#ifndef VK_BACK_QUOTE
-#define VK_BACK_QUOTE 0xC0
-#endif // VK_BACK_QUOTE
-#ifndef VK_SLASH
-#define VK_SLASH 0xBF
-#endif // VK_SLASH
-#ifndef VK_BACK_SLASH
-#define VK_BACK_SLASH 0xDC
-#endif // VK_BACK_SLASH
-#ifndef VK_EQUALS
-#define VK_EQUALS 0xBB
-#endif // VK_EQUALS
-#ifndef VK_OPEN_BRACKET
-#define VK_OPEN_BRACKET 0xDB
-#endif // VK_OPEN_BRACKET
-#ifndef VK_CLOSE_BRACKET
-#define VK_CLOSE_BRACKET 0xDD
-#endif // VK_CLOSE_BRACKET
-
-
-
-GPW_KeyboardDevice::GPW_KeyboardDevice(void)
-{
- m_separateLeftRight = false;
- m_separateLeftRightInitialized = false;
-
- m_reverseKeyTranslateTable['A' ] = KX_AKEY ;
- m_reverseKeyTranslateTable['B' ] = KX_BKEY ;
- m_reverseKeyTranslateTable['C' ] = KX_CKEY ;
- m_reverseKeyTranslateTable['D' ] = KX_DKEY ;
- m_reverseKeyTranslateTable['E' ] = KX_EKEY ;
- m_reverseKeyTranslateTable['F' ] = KX_FKEY ;
- m_reverseKeyTranslateTable['G' ] = KX_GKEY ;
- m_reverseKeyTranslateTable['H' ] = KX_HKEY ;
- m_reverseKeyTranslateTable['I' ] = KX_IKEY ;
- m_reverseKeyTranslateTable['J' ] = KX_JKEY ;
- m_reverseKeyTranslateTable['K' ] = KX_KKEY ;
- m_reverseKeyTranslateTable['L' ] = KX_LKEY ;
- m_reverseKeyTranslateTable['M' ] = KX_MKEY ;
- m_reverseKeyTranslateTable['N' ] = KX_NKEY ;
- m_reverseKeyTranslateTable['O' ] = KX_OKEY ;
- m_reverseKeyTranslateTable['P' ] = KX_PKEY ;
- m_reverseKeyTranslateTable['Q' ] = KX_QKEY ;
- m_reverseKeyTranslateTable['R' ] = KX_RKEY ;
- m_reverseKeyTranslateTable['S' ] = KX_SKEY ;
- m_reverseKeyTranslateTable['T' ] = KX_TKEY ;
- m_reverseKeyTranslateTable['U' ] = KX_UKEY ;
- m_reverseKeyTranslateTable['V' ] = KX_VKEY ;
- m_reverseKeyTranslateTable['W' ] = KX_WKEY ;
- m_reverseKeyTranslateTable['X' ] = KX_XKEY ;
- m_reverseKeyTranslateTable['Y' ] = KX_YKEY ;
- m_reverseKeyTranslateTable['Z' ] = KX_ZKEY ;
-
- m_reverseKeyTranslateTable['0' ] = KX_ZEROKEY ;
- m_reverseKeyTranslateTable['1' ] = KX_ONEKEY ;
- m_reverseKeyTranslateTable['2' ] = KX_TWOKEY ;
- m_reverseKeyTranslateTable['3' ] = KX_THREEKEY ;
- m_reverseKeyTranslateTable['4' ] = KX_FOURKEY ;
- m_reverseKeyTranslateTable['5' ] = KX_FIVEKEY ;
- m_reverseKeyTranslateTable['6' ] = KX_SIXKEY ;
- m_reverseKeyTranslateTable['7' ] = KX_SEVENKEY ;
- m_reverseKeyTranslateTable['8' ] = KX_EIGHTKEY ;
- m_reverseKeyTranslateTable['9' ] = KX_NINEKEY ;
-
- // Middle keyboard area keys
- m_reverseKeyTranslateTable[VK_PAUSE ] = KX_PAUSEKEY ;
- m_reverseKeyTranslateTable[VK_INSERT ] = KX_INSERTKEY ;
- m_reverseKeyTranslateTable[VK_DELETE ] = KX_DELKEY ;
- m_reverseKeyTranslateTable[VK_HOME ] = KX_HOMEKEY ;
- m_reverseKeyTranslateTable[VK_END ] = KX_ENDKEY ;
- m_reverseKeyTranslateTable[VK_PRIOR ] = KX_PAGEUPKEY ;
- m_reverseKeyTranslateTable[VK_NEXT ] = KX_PAGEDOWNKEY ;
-
- // Arrow keys
- m_reverseKeyTranslateTable[VK_UP ] = KX_UPARROWKEY ;
- m_reverseKeyTranslateTable[VK_DOWN ] = KX_DOWNARROWKEY ;
- m_reverseKeyTranslateTable[VK_LEFT ] = KX_LEFTARROWKEY ;
- m_reverseKeyTranslateTable[VK_RIGHT ] = KX_RIGHTARROWKEY ;
-
- // Function keys
- m_reverseKeyTranslateTable[VK_F1 ] = KX_F1KEY ;
- m_reverseKeyTranslateTable[VK_F2 ] = KX_F2KEY ;
- m_reverseKeyTranslateTable[VK_F3 ] = KX_F3KEY ;
- m_reverseKeyTranslateTable[VK_F4 ] = KX_F4KEY ;
- m_reverseKeyTranslateTable[VK_F5 ] = KX_F5KEY ;
- m_reverseKeyTranslateTable[VK_F6 ] = KX_F6KEY ;
- m_reverseKeyTranslateTable[VK_F7 ] = KX_F7KEY ;
- m_reverseKeyTranslateTable[VK_F8 ] = KX_F8KEY ;
- m_reverseKeyTranslateTable[VK_F9 ] = KX_F9KEY ;
- m_reverseKeyTranslateTable[VK_F10 ] = KX_F10KEY ;
- m_reverseKeyTranslateTable[VK_F11 ] = KX_F11KEY ;
- m_reverseKeyTranslateTable[VK_F12 ] = KX_F12KEY ;
- m_reverseKeyTranslateTable[VK_F13 ] = KX_F13KEY ;
- m_reverseKeyTranslateTable[VK_F14 ] = KX_F14KEY ;
- m_reverseKeyTranslateTable[VK_F15 ] = KX_F15KEY ;
- m_reverseKeyTranslateTable[VK_F16 ] = KX_F16KEY ;
- m_reverseKeyTranslateTable[VK_F17 ] = KX_F17KEY ;
- m_reverseKeyTranslateTable[VK_F18 ] = KX_F18KEY ;
- m_reverseKeyTranslateTable[VK_F19 ] = KX_F19KEY ;
-
- // Numpad keys
- m_reverseKeyTranslateTable[VK_NUMPAD0 ] = KX_PAD0 ;
- m_reverseKeyTranslateTable[VK_NUMPAD1 ] = KX_PAD1 ;
- m_reverseKeyTranslateTable[VK_NUMPAD2 ] = KX_PAD2 ;
- m_reverseKeyTranslateTable[VK_NUMPAD3 ] = KX_PAD3 ;
- m_reverseKeyTranslateTable[VK_NUMPAD4 ] = KX_PAD4 ;
- m_reverseKeyTranslateTable[VK_NUMPAD5 ] = KX_PAD5 ;
- m_reverseKeyTranslateTable[VK_NUMPAD6 ] = KX_PAD6 ;
- m_reverseKeyTranslateTable[VK_NUMPAD7 ] = KX_PAD7 ;
- m_reverseKeyTranslateTable[VK_NUMPAD8 ] = KX_PAD8 ;
- m_reverseKeyTranslateTable[VK_NUMPAD9 ] = KX_PAD9 ;
- m_reverseKeyTranslateTable[VK_MULTIPLY ] = KX_PADASTERKEY ;
- m_reverseKeyTranslateTable[VK_ADD ] = KX_PADPLUSKEY ;
- m_reverseKeyTranslateTable[VK_DECIMAL ] = KX_PADPERIOD ;
- m_reverseKeyTranslateTable[VK_SUBTRACT ] = KX_PADMINUS ;
- m_reverseKeyTranslateTable[VK_DIVIDE ] = KX_PADSLASHKEY ;
- m_reverseKeyTranslateTable[VK_SEPARATOR ] = KX_PADENTER ;
-
- // Other keys
- m_reverseKeyTranslateTable[VK_CAPITAL ] = KX_CAPSLOCKKEY ;
- m_reverseKeyTranslateTable[VK_ESCAPE ] = KX_ESCKEY ;
- m_reverseKeyTranslateTable[VK_TAB ] = KX_TABKEY ;
- //m_reverseKeyTranslateTable[VK_RETURN ] = KX_RETKEY ;
- m_reverseKeyTranslateTable[VK_SPACE ] = KX_SPACEKEY ;
- m_reverseKeyTranslateTable[VK_RETURN ] = KX_LINEFEEDKEY ;
- m_reverseKeyTranslateTable[VK_BACK ] = KX_BACKSPACEKEY ;
- m_reverseKeyTranslateTable[VK_SEMICOLON ] = KX_SEMICOLONKEY ;
- m_reverseKeyTranslateTable[VK_PERIOD ] = KX_PERIODKEY ;
- m_reverseKeyTranslateTable[VK_COMMA ] = KX_COMMAKEY ;
- m_reverseKeyTranslateTable[VK_QUOTE ] = KX_QUOTEKEY ;
- m_reverseKeyTranslateTable[VK_BACK_QUOTE ] = KX_ACCENTGRAVEKEY ;
- m_reverseKeyTranslateTable[VK_MINUS ] = KX_MINUSKEY ;
- m_reverseKeyTranslateTable[VK_SLASH ] = KX_SLASHKEY ;
- m_reverseKeyTranslateTable[VK_BACK_SLASH ] = KX_BACKSLASHKEY ;
- m_reverseKeyTranslateTable[VK_EQUALS ] = KX_EQUALKEY ;
- m_reverseKeyTranslateTable[VK_OPEN_BRACKET ] = KX_LEFTBRACKETKEY ;
- m_reverseKeyTranslateTable[VK_CLOSE_BRACKET ] = KX_RIGHTBRACKETKEY ;
-
- /*
- * Need to handle Ctrl, Alt and Shift keys differently.
- * Win32 messages do not discriminate left and right keys.
- */
- m_reverseKeyTranslateTable[VK_LCONTROL ] = KX_LEFTCTRLKEY ;
- m_reverseKeyTranslateTable[VK_RCONTROL ] = KX_RIGHTCTRLKEY ;
- m_reverseKeyTranslateTable[VK_LMENU ] = KX_LEFTALTKEY ;
- m_reverseKeyTranslateTable[VK_RMENU ] = KX_RIGHTALTKEY ;
- m_reverseKeyTranslateTable[VK_RSHIFT ] = KX_RIGHTSHIFTKEY ;
- m_reverseKeyTranslateTable[VK_LSHIFT ] = KX_LEFTSHIFTKEY ;
-}
-
-
-GPW_KeyboardDevice::~GPW_KeyboardDevice(void)
-{
-}
-
-
-void GPW_KeyboardDevice::ConvertWinEvent(WPARAM wParam, bool isDown)
-{
- if ((wParam == VK_SHIFT) || (wParam == VK_MENU) || (wParam == VK_CONTROL)) {
- ConvertModifierKey(wParam, isDown);
- }
- else {
- ConvertEvent(wParam, isDown);
- }
-}
-
-
-void GPW_KeyboardDevice::ConvertModifierKey(WPARAM wParam, bool isDown)
-{
- /*
- GetKeyState and GetAsyncKeyState only work with Win95, Win98, NT4,
- Terminal Server and Windows 2000.
- But on WinME it always returns zero. These two functions are simply
- skipped by Millenium Edition!
-
- Official explanation from Microsoft:
- Intentionally disabled.
- It didn't work all that well on some newer hardware, and worked less
- well with the passage of time, so it was fully disabled in ME.
- */
- if (!m_separateLeftRightInitialized && isDown) {
- CheckForSeperateLeftRight(wParam);
- }
- if (m_separateLeftRight) {
- bool down = HIBYTE(::GetKeyState(VK_LSHIFT)) != 0;
- ConvertEvent(VK_LSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_RSHIFT)) != 0;
- ConvertEvent(VK_RSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_LMENU)) != 0;
- ConvertEvent(VK_LMENU, down);
- down = HIBYTE(::GetKeyState(VK_RMENU)) != 0;
- ConvertEvent(VK_RMENU, down);
- down = HIBYTE(::GetKeyState(VK_LCONTROL)) != 0;
- ConvertEvent(VK_LCONTROL, down);
- down = HIBYTE(::GetKeyState(VK_RCONTROL)) != 0;
- ConvertEvent(VK_RCONTROL, down);
- }
- else {
- bool down = HIBYTE(::GetKeyState(VK_SHIFT)) != 0;
- ConvertEvent(VK_LSHIFT, down);
- ConvertEvent(VK_RSHIFT, down);
- down = HIBYTE(::GetKeyState(VK_MENU)) != 0;
- ConvertEvent(VK_LMENU, down);
- ConvertEvent(VK_RMENU, down);
- down = HIBYTE(::GetKeyState(VK_CONTROL)) != 0;
- ConvertEvent(VK_LCONTROL, down);
- ConvertEvent(VK_RCONTROL, down);
- }
-}
-
-
-void GPW_KeyboardDevice::CheckForSeperateLeftRight(WPARAM wParam)
-{
- // Check whether this system supports separate left and right keys
- switch (wParam) {
- case VK_SHIFT:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LSHIFT)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RSHIFT)) != 0) ?
- true : false;
- break;
- case VK_CONTROL:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LCONTROL)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RCONTROL)) != 0) ?
- true : false;
- break;
- case VK_MENU:
- m_separateLeftRight =
- (HIBYTE(::GetKeyState(VK_LMENU)) != 0) ||
- (HIBYTE(::GetKeyState(VK_RMENU)) != 0) ?
- true : false;
- break;
- }
- m_separateLeftRightInitialized = true;
-}
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h b/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h
deleted file mode 100644
index e47ce32c44c..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_KeyboardDevice.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#ifndef _GPW_KEYBOARDDEVICE_H_
-#define _GPW_KEYBOARDDEVICE_H_
-
-#pragma warning (disable : 4786)
-
-#include <windows.h>
-#include "GPC_KeyboardDevice.h"
-
-/**
- * Win32 implementation of GPC_KeyboardDevice.
- * The contructor fills the keyboard code translation map.
- * Base class GPC_KeyboardDevice does the rest.
- * @see SCA_IInputDevice
- */
-class GPW_KeyboardDevice : public GPC_KeyboardDevice
-{
-public:
- GPW_KeyboardDevice(void);
-
- virtual ~GPW_KeyboardDevice(void);
-
- void ConvertWinEvent(WPARAM wParam, bool isDown);
-
-protected:
-
- void ConvertModifierKey(WPARAM wParam, bool isDown);
-
- void CheckForSeperateLeftRight(WPARAM wParam);
-
- /** Stores the capability of this system to distinguish left and right modifier keys. */
- bool m_separateLeftRight;
- /** Stores the initialization state of the member m_leftRightDistinguishable. */
- bool m_separateLeftRightInitialized;
-};
-
-#endif //_GPW_KEYBOARDDEVICE_H_
-
diff --git a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp b/source/gameengine/GamePlayer/common/windows/GPW_System.cpp
deleted file mode 100644
index 4f4a48a52f1..00000000000
--- a/source/gameengine/GamePlayer/common/windows/GPW_System.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * Timing routine taken and modified from KX_BlenderSystem.cpp
- */
-
-#include <windows.h>
-#include "GPW_System.h"
-
-GPW_System::GPW_System(void)
-{
- m_freq = 0;
- m_lastCount = 0;
- m_lastRest = 0;
- m_lastTime = 0;
-}
-
-
-double GPW_System::GetTimeInSeconds()
-{
-#if 0
- double secs = ::GetTickCount();
- secs /= 1000.;
- return secs;
-#else
-
- // 03/20/1999 Thomas Hieber: completely redone to get true Millisecond
- // accuracy instead of very rough ticks. This routine will also provide
- // correct wrap around at the end of "long"
-
- // m_freq was set to -1, if the current Hardware does not support
- // high resolution timers. We will use GetTickCount instead then.
- if (m_freq < 0) {
- return ::GetTickCount();
- }
-
- // m_freq is 0, the first time this function is being called.
- if (m_freq == 0) {
- // Try to determine the frequency of the high resulution timer
- if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq)) {
- // There is no such timer....
- m_freq = -1;
- return 0;
- }
- }
-
- // Retrieve current count
- __int64 count = 0;
- ::QueryPerformanceCounter((LARGE_INTEGER*)&count);
-
- // Calculate the time passed since last call, and add the rest of
- // those tics that didn't make it into the last reported time.
- __int64 delta = 1000*(count-m_lastCount) + m_lastRest;
-
- m_lastTime += (long)(delta/m_freq); // Save the new value
- m_lastRest = delta%m_freq; // Save those ticks not being counted
- m_lastCount = count; // Save last count
-
- // Return a high quality measurement of time
- return m_lastTime/1000.0;
-#endif
-}
-
-
diff --git a/source/gameengine/GamePlayer/common/windows/Makefile b/source/gameengine/GamePlayer/common/windows/Makefile
deleted file mode 100644
index 200f84dd3e6..00000000000
--- a/source/gameengine/GamePlayer/common/windows/Makefile
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-# ATTENTION: this Makefile is only used for win builds!
-
-LIBNAME = windows
-DIR = $(OCGDIR)/gameengine/GamePlayer/common/$(LIBNAME)
-
-include nan_compile.mk
-
-CPPFLAGS += -I..
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(SRCHOME)/gameengine/GameLogic
-CPPFLAGS += -I$(SRCHOME)/gameengine/Rasterizer
-CPPFLAGS += -I$(SRCHOME)/gameengine/Ketsji
-CPPFLAGS += -I$(SRCHOME)/gameengine/Network
-CPPFLAGS += -I$(SRCHOME)/gameengine/Network/LoopBackNetwork
-
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/Fuzzics/include
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/include
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-
-# Blender stuff
-CPPFLAGS += -I$(SRCHOME)/blender/blenkernel
-CPPFLAGS += -I$(SRCHOME)/blender/blenlib
-CPPFLAGS += -I$(SRCHOME)/blender/blenloader
-CPPFLAGS += -I$(SRCHOME)/blender/imbuf
-CPPFLAGS += -I$(SRCHOME)/blender/makesdna
-CPPFLAGS += -I$(SRCHOME)/kernel/gen_system
-
-CPPFLAGS += -I../../kernel/gen_system
-
diff --git a/source/gameengine/GamePlayer/ghost/CMakeLists.txt b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
index 8164878762c..dc137861745 100644
--- a/source/gameengine/GamePlayer/ghost/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
@@ -24,15 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC
- GPG_Application.cpp
- GPG_Canvas.cpp
- GPG_ghost.cpp
- GPG_KeyboardDevice.cpp
- GPG_System.cpp
-)
-
-SET(INC
+set(INC
.
../../../../intern/string
../../../../intern/ghost
@@ -44,11 +36,11 @@ SET(INC
../../../../source/gameengine/Converter
../../../../source/blender/imbuf
../../../../source/gameengine/Ketsji
+ ../../../../source/blender/blenfont
../../../../source/blender/blenlib
../../../../source/blender/blenkernel
../../../../source/blender/readblenfile
../../../../source/blender
- ../../../../source/blender/include
../../../../source/blender/makesdna
../../../../source/blender/makesrna
../../../../source/gameengine/Rasterizer
@@ -59,17 +51,29 @@ SET(INC
../../../../source/gameengine/Physics/common
../../../../source/gameengine/Network/LoopBackNetwork
../../../../source/gameengine/GamePlayer/common
- ../../../../source/blender/misc
../../../../source/blender/blenloader
../../../../source/blender/gpu
../../../../extern/glew/include
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ GPG_Application.cpp
+ GPG_Canvas.cpp
+ GPG_ghost.cpp
+ GPG_KeyboardDevice.cpp
+ GPG_System.cpp
+
+ GPG_Application.h
+ GPG_Canvas.h
+ GPG_KeyboardDevice.h
+ GPG_System.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-BLENDERLIB_NOLIST(gp_ghost "${SRC}" "${INC}")
+blender_add_lib_nolist(ge_player_ghost "${SRC}" "${INC}")
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
index 71507642226..e00a890a1fb 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* GHOST Blender Player application implementation file.
*/
+/** \file gameengine/GamePlayer/ghost/GPG_Application.cpp
+ * \ingroup player
+ */
+
+
#ifdef WIN32
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#include <windows.h>
@@ -370,6 +375,7 @@ bool GPG_Application::startFullScreen(
fSystem->beginFullScreen(setting, &m_mainWindow, stereoVisual);
m_mainWindow->setCursorVisibility(false);
+ m_mainWindow->setState(GHOST_kWindowStateFullScreen);
success = initEngine(m_mainWindow, stereoMode);
if (success) {
@@ -545,7 +551,10 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
if (!m_canvas)
return false;
- m_canvas->Init();
+ m_canvas->Init();
+ if (gm->flag & GAME_SHOW_MOUSE)
+ m_canvas->SetMouseState(RAS_ICanvas::MOUSE_NORMAL);
+
m_rendertools = new GPC_RenderTools();
if (!m_rendertools)
goto initFailed;
@@ -602,8 +611,11 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
m_ketsjiengine->SetNetworkDevice(m_networkdevice);
m_ketsjiengine->SetTimingDisplay(frameRate, false, false);
-
+#ifdef WITH_PYTHON
CValue::SetDeprecationWarnings(nodepwarnings);
+#else
+ (void)nodepwarnings;
+#endif
m_ketsjiengine->SetUseFixedTime(fixed_framerate);
m_ketsjiengine->SetTimingDisplay(frameRate, profile, properties);
@@ -676,20 +688,21 @@ bool GPG_Application::startEngine(void)
m_startScene,
m_canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// some python things
PyObject *gameLogic, *gameLogic_keys;
setupGamePython(m_ketsjiengine, startscene, m_maggie, NULL, &gameLogic, &gameLogic_keys, m_argc, m_argv);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
//initialize Dome Settings
if(m_startScene->gm.stereoflag == STEREO_DOME)
m_ketsjiengine->InitDome(m_startScene->gm.dome.res, m_startScene->gm.dome.mode, m_startScene->gm.dome.angle, m_startScene->gm.dome.resbuf, m_startScene->gm.dome.tilt, m_startScene->gm.dome.warptext);
+#ifdef WITH_PYTHON
// Set the GameLogic.globalDict from marshal'd data, so we can
// load new blend files and keep data in GameLogic.globalDict
loadGamePythonConfig(m_pyGlobalDictString, m_pyGlobalDictString_Length);
-
+#endif
m_sceneconverter->ConvertScene(
startscene,
m_rendertools,
@@ -722,6 +735,7 @@ bool GPG_Application::startEngine(void)
void GPG_Application::stopEngine()
{
+#ifdef WITH_PYTHON
// GameLogic.globalDict gets converted into a buffer, and sorted in
// m_pyGlobalDictString so we can restore after python has stopped
// and started between .blend file loads.
@@ -734,6 +748,8 @@ void GPG_Application::stopEngine()
// when exiting the mainloop
exitGamePythonScripting();
+#endif
+
m_ketsjiengine->StopEngine();
m_networkdevice->Disconnect();
@@ -794,7 +810,6 @@ void GPG_Application::exitEngine()
m_canvas = 0;
}
- IMB_exit();
GPU_extensions_exit();
m_exitRequested = 0;
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h
index 48a6c8e78ec..850b34d5b69 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Application.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * GHOST Blender Player application declaration file.
+ */
+
+/** \file GPG_Application.h
+ * \ingroup player
+ * \brief GHOST Blender Player application declaration file.
*/
#include "GHOST_IEventConsumer.h"
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
index 24c0102a87c..9bd41163c21 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_Canvas.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/GamePlayer/ghost/GPG_Canvas.cpp
+ * \ingroup player
+ */
+
+
#include "GPG_Canvas.h"
#include <assert.h>
#include "GHOST_ISystem.h"
diff --git a/source/gameengine/GamePlayer/ghost/GPG_Canvas.h b/source/gameengine/GamePlayer/ghost/GPG_Canvas.h
index 7b19c03d3c3..e03f7d6740e 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_Canvas.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_Canvas.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file GPG_Canvas.h
+ * \ingroup player
+ */
+
#ifndef _GPG_CANVAS_H_
#define _GPG_CANVAS_H_
diff --git a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp
index 2e9810ad0ae..97e166ce6ab 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* GHOST Blender Player keyboard device implementation.
*/
+/** \file gameengine/GamePlayer/ghost/GPG_KeyboardDevice.cpp
+ * \ingroup player
+ */
+
+
#include "GPG_KeyboardDevice.h"
GPG_KeyboardDevice::GPG_KeyboardDevice(void)
diff --git a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.h b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.h
index 8fb42caed95..5471db42f3f 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_KeyboardDevice.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * GHOST Blender Player keyboard device.
+ */
+
+/** \file GPG_KeyboardDevice.h
+ * \ingroup player
+ * \brief GHOST Blender Player keyboard device.
*/
#ifndef _GPG_KEYBOARDDEVICE_H_
diff --git a/source/gameengine/GamePlayer/ghost/GPG_System.cpp b/source/gameengine/GamePlayer/ghost/GPG_System.cpp
index 94756ec4ed5..1faa3f398c4 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_System.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_System.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* Blender Player system on GHOST.
*/
+/** \file gameengine/GamePlayer/ghost/GPG_System.cpp
+ * \ingroup player
+ */
+
+
#include "GPG_System.h"
#include <assert.h>
#include "GHOST_ISystem.h"
diff --git a/source/gameengine/GamePlayer/ghost/GPG_System.h b/source/gameengine/GamePlayer/ghost/GPG_System.h
index e6e5506cbc1..49a91b60415 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_System.h
+++ b/source/gameengine/GamePlayer/ghost/GPG_System.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Blender Player system on GHOST.
+ */
+
+/** \file GPG_System.h
+ * \ingroup player
+ * \brief Blender Player system on GHOST.
*/
#ifndef _GPG_SYSTEM_H_
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 9cdee2a340c..767ccff4259 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* Start up of the Blender Player on GHOST.
*/
+/** \file gameengine/GamePlayer/ghost/GPG_ghost.cpp
+ * \ingroup player
+ */
+
+
#include <iostream>
#include <math.h>
@@ -72,6 +77,11 @@ extern "C"
extern char bprogname[]; /* holds a copy of argv[0], from creator.c */
extern char btempdir[]; /* use this to store a valid temp directory */
+// For BLF
+#include "BLF_api.h"
+extern int datatoc_bfont_ttf_size;
+extern char datatoc_bfont_ttf[];
+
#ifdef __cplusplus
}
#endif // __cplusplus
@@ -95,15 +105,15 @@ extern char btempdir[]; /* use this to store a valid temp directory */
#ifdef WIN32
#include <windows.h>
-#ifdef NDEBUG
+#if !defined(DEBUG)
#include <wincon.h>
-#endif // NDEBUG
+#endif // !defined(DEBUG)
#endif // WIN32
const int kMinWindowWidth = 100;
const int kMinWindowHeight = 100;
-char bprogname[FILE_MAXDIR+FILE_MAXFILE];
+char bprogname[FILE_MAX];
#ifdef WIN32
typedef enum
@@ -161,17 +171,29 @@ static BOOL scr_saver_init(int argc, char **argv)
#endif /* WIN32 */
-void usage(const char* program)
+void usage(const char* program, bool isBlenderPlayer)
{
const char * consoleoption;
+ const char * filename = "";
+ const char * pathname = "";
+
#ifdef _WIN32
consoleoption = "-c ";
#else
consoleoption = "";
#endif
+
+ if (isBlenderPlayer) {
+ filename = "filename.blend";
+#ifdef _WIN32
+ pathname = "c:\\";
+#else
+ pathname = "//home//user//";
+#endif
+ }
printf("usage: %s [-w [w h l t]] [-f [fw fh fb ff]] %s[-g gamengineoptions] "
- "[-s stereomode] filename.blend\n", program, consoleoption);
+ "[-s stereomode] %s\n", program, consoleoption, filename);
printf(" -h: Prints this command summary\n\n");
printf(" -w: display in a window\n");
printf(" --Optional parameters--\n");
@@ -227,8 +249,8 @@ void usage(const char* program)
printf("\n");
printf(" - : all arguments after this are ignored, allowing python to access them from sys.argv\n");
printf("\n");
- printf("example: %s -w 320 200 10 10 -g noaudio c:\\loadtest.blend\n", program);
- printf("example: %s -g show_framerate = 0 c:\\loadtest.blend\n", program);
+ printf("example: %s -w 320 200 10 10 -g noaudio%s%s\n", program, pathname, filename);
+ printf("example: %s -g show_framerate = 0 %s%s\n", program, pathname, filename);
}
static void get_filename(int argc, char **argv, char *filename)
@@ -337,15 +359,15 @@ int main(int argc, char** argv)
int fullScreenBpp = 32;
int fullScreenFrequency = 60;
GHOST_TEmbedderWindowID parentWindow = 0;
-
-
+ bool isBlenderPlayer = false;
+ int validArguments=0;
#ifdef __linux__
#ifdef __alpha__
signal (SIGFPE, SIG_IGN);
#endif /* __alpha__ */
#endif /* __linux__ */
- BLI_where_am_i(bprogname, argv[0]);
+ BLI_where_am_i(bprogname, sizeof(bprogname), argv[0]);
#ifdef __APPLE__
// Can't use Carbon right now because of double defined type ID (In Carbon.h and DNA_ID.h, sigh)
/*
@@ -377,9 +399,14 @@ int main(int argc, char** argv)
GEN_init_messaging_system();
IMB_init();
+
+ // Setup builtin font for BLF (mostly copied from creator.c, wm_init_exit.c and interface_style.c)
+ BLF_init(11, U.dpi);
+ BLF_lang_init();
+ BLF_load_mem("default", (unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size);
// Parse command line options
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("argv[0] = '%s'\n", argv[0]);
#endif
@@ -412,14 +439,21 @@ int main(int argc, char** argv)
U.audioformat = 0x24;
U.audiochannels = 2;
- for (i = 1; (i < argc) && !error
+ /* if running blenderplayer the last argument can't be parsed since it has to be the filename. */
+ isBlenderPlayer = !blo_is_a_runtime(argv[0]);
+ if (isBlenderPlayer)
+ validArguments = argc - 1;
+ else
+ validArguments = argc;
+
+ for (i = 1; (i < validArguments) && !error
#ifdef WIN32
&& scr_saver_mode == SCREEN_SAVER_MODE_NONE
#endif
;)
{
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("argv[%d] = '%s' , %i\n", i, argv[i],argc);
#endif
if (argv[i][0] == '-')
@@ -436,21 +470,21 @@ int main(int argc, char** argv)
// Parse game options
{
i++;
- if (i < argc)
+ if (i <= validArguments)
{
char* paramname = argv[i];
// Check for single value versus assignment
- if (i+1 < argc && (*(argv[i+1]) == '='))
+ if (i+1 <= validArguments && (*(argv[i+1]) == '='))
{
i++;
- if (i + 1 < argc)
+ if (i + 1 <= validArguments)
{
i++;
// Assignment
SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
-#ifndef NDEBUG
+#if defined(DEBUG)
printf("%s = '%s'\n", paramname, argv[i]);
#endif
i++;
@@ -479,14 +513,14 @@ int main(int argc, char** argv)
i++;
fullScreen = true;
fullScreenParFound = true;
- if ((i + 2) <= argc && argv[i][0] != '-' && argv[i+1][0] != '-')
+ if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
{
fullScreenWidth = atoi(argv[i++]);
fullScreenHeight = atoi(argv[i++]);
- if ((i + 1) <= argc && argv[i][0] != '-')
+ if ((i + 1) <= validArguments && argv[i][0] != '-')
{
fullScreenBpp = atoi(argv[i++]);
- if ((i + 1) <= argc && argv[i][0] != '-')
+ if ((i + 1) <= validArguments && argv[i][0] != '-')
fullScreenFrequency = atoi(argv[i++]);
}
}
@@ -497,11 +531,11 @@ int main(int argc, char** argv)
fullScreen = false;
windowParFound = true;
- if ((i + 2) <= argc && argv[i][0] != '-' && argv[i+1][0] != '-')
+ if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
{
windowWidth = atoi(argv[i++]);
windowHeight = atoi(argv[i++]);
- if ((i +2) <= argc && argv[i][0] != '-' && argv[i+1][0] != '-')
+ if ((i + 2) <= validArguments && argv[i][0] != '-' && argv[i+1][0] != '-')
{
windowLeft = atoi(argv[i++]);
windowTop = atoi(argv[i++]);
@@ -510,17 +544,22 @@ int main(int argc, char** argv)
break;
case 'h':
- usage(argv[0]);
+ usage(argv[0], isBlenderPlayer);
return 0;
break;
#ifndef _WIN32
case 'i':
i++;
- if ( (i + 1) < argc )
- parentWindow = atoi(argv[i++]);
-#ifndef NDEBUG
+ if ( (i + 1) <= validArguments )
+ parentWindow = atoi(argv[i++]);
+ else {
+ error = true;
+ printf("error: too few options for parent window argument.\n");
+ }
+
+#if defined(DEBUG)
printf("XWindows ID = %d\n", parentWindow);
-#endif //NDEBUG
+#endif // defined(DEBUG)
#endif // _WIN32
case 'c':
@@ -529,7 +568,7 @@ int main(int argc, char** argv)
break;
case 's': // stereo
i++;
- if ((i + 1) < argc)
+ if ((i + 1) <= validArguments)
{
stereomode = (RAS_IRasterizer::StereoMode) atoi(argv[i]);
if (stereomode < RAS_IRasterizer::RAS_STEREO_NOSTEREO || stereomode >= RAS_IRasterizer::RAS_STEREO_MAXSTEREO)
@@ -575,7 +614,7 @@ int main(int argc, char** argv)
stereoFlag = STEREO_DOME;
stereomode = RAS_IRasterizer::RAS_STEREO_DOME;
i++;
- if ((i + 1) < argc)
+ if ((i + 1) <= validArguments)
{
if(!strcmp(argv[i], "angle")){
i++;
@@ -631,7 +670,7 @@ int main(int argc, char** argv)
if (error )
{
- usage(argv[0]);
+ usage(argv[0], isBlenderPlayer);
return 0;
}
@@ -714,19 +753,19 @@ int main(int argc, char** argv)
//::printf("game data loaded from %s\n", filename);
if (!bfd) {
- usage(argv[0]);
+ usage(argv[0], isBlenderPlayer);
error = true;
exitcode = KX_EXIT_REQUEST_QUIT_GAME;
}
else
{
#ifdef WIN32
-#ifdef NDEBUG
+#if !defined(DEBUG)
if (closeConsole)
{
//::FreeConsole(); // Close a console window
}
-#endif // NDEBUG
+#endif // !defined(DEBUG)
#endif // WIN32
Main *maggie = bfd->main;
Scene *scene = bfd->curscene;
@@ -797,9 +836,10 @@ int main(int argc, char** argv)
app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
BLI_strncpy(pathname, maggie->name, sizeof(pathname));
- BLI_strncpy(G.sce, maggie->name, sizeof(G.sce));
- setGamePythonPath(G.sce);
-
+ BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
+#ifdef WITH_PYTHON
+ setGamePythonPath(G.main->name);
+#endif
if (firstTimeRunning)
{
firstTimeRunning = false;
@@ -908,8 +948,14 @@ int main(int argc, char** argv)
}
}
+ // Cleanup
+ RNA_exit();
+ BLF_exit();
+ IMB_exit();
free_nodesystem();
+ SYS_DeleteSystem(syshandle);
+
return error ? -1 : 0;
}
diff --git a/source/gameengine/GamePlayer/ghost/Makefile b/source/gameengine/GamePlayer/ghost/Makefile
deleted file mode 100644
index b2fcd2ac1ff..00000000000
--- a/source/gameengine/GamePlayer/ghost/Makefile
+++ /dev/null
@@ -1,86 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Makefile for GHOST game player
-
-LIBNAME = ghost
-DIR = $(OCGDIR)/gameengine/GamePlayer/ghost
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-# OpenGL header files
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-CPPFLAGS += -I../../GamePlayer/common
-
-# Game Engine includes
-CPPFLAGS += -I../../Converter
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../Ketsji/KXNetwork
-CPPFLAGS += -I../../Network
-CPPFLAGS += -I../../Network/LoopBackNetwork
-CPPFLAGS += -I../../Rasterizer
-CPPFLAGS += -I../../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../../SceneGraph
-
-# Sumo
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/include
-CPPFLAGS += -I$(SRCHOME)/gameengine/Physics/Sumo/Fuzzics/include
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-
-# Blender includes
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/blenloader
-CPPFLAGS += -I../../../blender/imbuf
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/makesrna
-CPPFLAGS += -I../../../blender/readblenfile
-CPPFLAGS += -I../../../blender/gpu
-
-CPPFLAGS += -I../../../gameengine/BlenderRoutines
-
-# kernel? GEN? stuff
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../../kernel/gen_messaging
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_GHOST)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
diff --git a/source/gameengine/GamePlayer/ghost/SConscript b/source/gameengine/GamePlayer/ghost/SConscript
index 41520a06c66..0ff19a9b621 100644
--- a/source/gameengine/GamePlayer/ghost/SConscript
+++ b/source/gameengine/GamePlayer/ghost/SConscript
@@ -19,6 +19,7 @@ incs = ['.',
'#source/gameengine/Converter',
'#source/blender/imbuf',
'#source/gameengine/Ketsji',
+ '#source/blender/blenfont',
'#source/blender/blenlib',
'#source/blender/blenkernel',
'#source/blender/readblenfile',
@@ -43,11 +44,16 @@ incs = ['.',
defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += Split(env['BF_PYTHON_INC'])
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += Split(env['BF_PYTHON_INC'])
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
-env.BlenderLib (libname='gp_ghost', sources=source_files, includes = incs, defines = defs, libtype=['player'],priority=[0], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib (libname='ge_player_ghost', sources=source_files, includes = incs, defines = defs, libtype=['player'],priority=[0], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.cpp b/source/gameengine/Ketsji/BL_BlenderShader.cpp
index 109a693ec6d..91982a424c7 100644
--- a/source/gameengine/Ketsji/BL_BlenderShader.cpp
+++ b/source/gameengine/Ketsji/BL_BlenderShader.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/BL_BlenderShader.cpp
+ * \ingroup ketsji
+ */
#include "DNA_customdata_types.h"
#include "DNA_material_types.h"
diff --git a/source/gameengine/Ketsji/BL_BlenderShader.h b/source/gameengine/Ketsji/BL_BlenderShader.h
index c2d4245b77f..2f22e121b8c 100644
--- a/source/gameengine/Ketsji/BL_BlenderShader.h
+++ b/source/gameengine/Ketsji/BL_BlenderShader.h
@@ -1,3 +1,35 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file BL_BlenderShader.h
+ * \ingroup ketsji
+ */
#ifndef __BL_GPUSHADER_H__
#define __BL_GPUSHADER_H__
diff --git a/source/gameengine/Ketsji/BL_Material.cpp b/source/gameengine/Ketsji/BL_Material.cpp
index c63b9d55306..25fd5467e93 100644
--- a/source/gameengine/Ketsji/BL_Material.cpp
+++ b/source/gameengine/Ketsji/BL_Material.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/BL_Material.cpp
+ * \ingroup ketsji
+ */
// ------------------------------------
#include "BL_Material.h"
#include "DNA_material_types.h"
diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h
index 62e5a6e638b..126135f3d46 100644
--- a/source/gameengine/Ketsji/BL_Material.h
+++ b/source/gameengine/Ketsji/BL_Material.h
@@ -1,3 +1,8 @@
+
+/** \file BL_Material.h
+ * \ingroup ketsji
+ */
+
#ifndef __BL_MATERIAL_H__
#define __BL_MATERIAL_H__
diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp
index 8edefe7ac2d..621cabfe0cf 100644
--- a/source/gameengine/Ketsji/BL_Shader.cpp
+++ b/source/gameengine/Ketsji/BL_Shader.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/BL_Shader.cpp
+ * \ingroup ketsji
+ */
#include "GL/glew.h"
@@ -728,7 +731,7 @@ void BL_Shader::SetUniform(int uniform, const int* val, int len)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyMethodDef BL_Shader::Methods[] =
{
@@ -1411,6 +1414,6 @@ KX_PYMETHODDEF_DOC( BL_Shader, setUniformDef, "setUniformDef(name, enum)" )
return NULL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
// eof
diff --git a/source/gameengine/Ketsji/BL_Shader.h b/source/gameengine/Ketsji/BL_Shader.h
index 5108acea0ff..41802a0a19f 100644
--- a/source/gameengine/Ketsji/BL_Shader.h
+++ b/source/gameengine/Ketsji/BL_Shader.h
@@ -1,3 +1,8 @@
+
+/** \file BL_Shader.h
+ * \ingroup ketsji
+ */
+
#ifndef __BL_SHADER_H__
#define __BL_SHADER_H__
@@ -222,7 +227,7 @@ public:
void SetUniform(int uniform, const int val);
// Python interface
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual PyObject* py_repr(void) { return PyUnicode_FromFormat("BL_Shader\n\tvertex shader:%s\n\n\tfragment shader%s\n\n", vertProg, fragProg); }
// -----------------------------------
diff --git a/source/gameengine/Ketsji/BL_Texture.cpp b/source/gameengine/Ketsji/BL_Texture.cpp
index 5d40ba7d75c..d2438a66367 100644
--- a/source/gameengine/Ketsji/BL_Texture.cpp
+++ b/source/gameengine/Ketsji/BL_Texture.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/BL_Texture.cpp
+ * \ingroup ketsji
+ */
// ------------------------------------
#include "GL/glew.h"
@@ -634,7 +637,7 @@ void my_envmap_split_ima(EnvMap *env, ImBuf *ibuf)
}
else {
for(part=0; part<6; part++) {
- env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect, 0);
+ env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect);
}
IMB_rectcpy(env->cube[0], ibuf,
0, 0, 0, 0, dx, dx);
diff --git a/source/gameengine/Ketsji/BL_Texture.h b/source/gameengine/Ketsji/BL_Texture.h
index eb3888b4862..3c60cad4fbf 100644
--- a/source/gameengine/Ketsji/BL_Texture.h
+++ b/source/gameengine/Ketsji/BL_Texture.h
@@ -1,3 +1,8 @@
+
+/** \file BL_Texture.h
+ * \ingroup ketsji
+ */
+
#ifndef __BL_TEXTURE_H__
#define __BL_TEXTURE_H__
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index d8f6e3164ec..67ac8a02255 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
@@ -34,15 +32,14 @@ SET(INC
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/Converter
../../../source/blender/imbuf
- ../../../intern/ghost/include
../../../intern/moto/include
../../../source/gameengine/Ketsji
../../../source/blender/blenlib
+ ../../../source/blender/blenfont
../../../source/blender/blenkernel
../../../source/blender/python
../../../source/blender/python/generic
../../../source/blender
- ../../../source/blender/include
../../../source/blender/makesdna
../../../source/gameengine/Rasterizer
../../../source/gameengine/GameLogic
@@ -51,32 +48,177 @@ SET(INC
../../../source/gameengine/Network
../../../source/gameengine/SceneGraph
../../../source/gameengine/Physics/common
- ../../../source/gameengine/Physics/Bullet
../../../source/gameengine/Network/LoopBackNetwork
../../../intern/audaspace/intern
- ../../../source/blender/misc
../../../source/blender/blenloader
../../../source/blender/gpu
- ../../../extern/bullet2/src
../../../extern/glew/include
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ BL_BlenderShader.cpp
+ BL_Material.cpp
+ BL_Shader.cpp
+ BL_Texture.cpp
+ KX_ArmatureSensor.cpp
+ KX_BlenderMaterial.cpp
+ KX_BulletPhysicsController.cpp
+ KX_Camera.cpp
+ KX_CameraActuator.cpp
+ KX_CameraIpoSGController.cpp
+ KX_ConstraintActuator.cpp
+ KX_ConstraintWrapper.cpp
+ KX_ConvertPhysicsObjects.cpp
+ KX_Dome.cpp
+ KX_EmptyObject.cpp
+ KX_FontObject.cpp
+ KX_GameActuator.cpp
+ KX_GameObject.cpp
+ KX_IPO_SGController.cpp
+ KX_IPhysicsController.cpp
+ KX_IpoActuator.cpp
+ KX_KetsjiEngine.cpp
+ KX_Light.cpp
+ KX_LightIpoSGController.cpp
+ KX_MaterialIpoController.cpp
+ KX_MeshProxy.cpp
+ KX_MotionState.cpp
+ KX_MouseFocusSensor.cpp
+ KX_NearSensor.cpp
+ KX_ObColorIpoSGController.cpp
+ KX_ObjectActuator.cpp
+ KX_OrientationInterpolator.cpp
+ KX_ParentActuator.cpp
+ KX_PhysicsObjectWrapper.cpp
+ KX_PolyProxy.cpp
+ KX_PolygonMaterial.cpp
+ KX_PositionInterpolator.cpp
+ KX_PyConstraintBinding.cpp
+ KX_PyMath.cpp
+ KX_PythonInit.cpp
+ KX_PythonInitTypes.cpp
+ KX_PythonSeq.cpp
+ KX_RadarSensor.cpp
+ KX_RayCast.cpp
+ KX_RayEventManager.cpp
+ KX_RaySensor.cpp
+ KX_SCA_AddObjectActuator.cpp
+ KX_SCA_DynamicActuator.cpp
+ KX_SCA_EndObjectActuator.cpp
+ KX_SCA_ReplaceMeshActuator.cpp
+ KX_SG_BoneParentNodeRelationship.cpp
+ KX_SG_NodeRelationships.cpp
+ KX_ScalarInterpolator.cpp
+ KX_ScalingInterpolator.cpp
+ KX_Scene.cpp
+ KX_SceneActuator.cpp
+ KX_SoundActuator.cpp
+ KX_StateActuator.cpp
+ KX_TimeCategoryLogger.cpp
+ KX_TimeLogger.cpp
+ KX_TouchEventManager.cpp
+ KX_TouchSensor.cpp
+ KX_TrackToActuator.cpp
+ KX_VehicleWrapper.cpp
+ KX_VertexProxy.cpp
+ KX_VisibilityActuator.cpp
+ KX_WorldInfo.cpp
+ KX_WorldIpoController.cpp
+
+ KX_ArmatureSensor.h
+ KX_BlenderMaterial.h
+ KX_BulletPhysicsController.h
+ KX_Camera.h
+ KX_CameraActuator.h
+ KX_CameraIpoSGController.h
+ KX_ClientObjectInfo.h
+ KX_ConstraintActuator.h
+ KX_ConstraintWrapper.h
+ KX_ConvertPhysicsObject.h
+ KX_Dome.h
+ KX_EmptyObject.h
+ KX_FontObject.h
+ KX_GameActuator.h
+ KX_GameObject.h
+ KX_IInterpolator.h
+ KX_IPOTransform.h
+ KX_IPO_SGController.h
+ KX_IPhysicsController.h
+ KX_IScalarInterpolator.h
+ KX_ISceneConverter.h
+ KX_ISystem.h
+ KX_IpoActuator.h
+ KX_KetsjiEngine.h
+ KX_Light.h
+ KX_LightIpoSGController.h
+ KX_MaterialIpoController.h
+ KX_MeshProxy.h
+ KX_MotionState.h
+ KX_MouseFocusSensor.h
+ KX_NearSensor.h
+ KX_ObColorIpoSGController.h
+ KX_ObjectActuator.h
+ KX_OrientationInterpolator.h
+ KX_ParentActuator.h
+ KX_PhysicsEngineEnums.h
+ KX_PhysicsObjectWrapper.h
+ KX_PhysicsPropertiesobsolete.h
+ KX_PolyProxy.h
+ KX_PolygonMaterial.h
+ KX_PositionInterpolator.h
+ KX_PyConstraintBinding.h
+ KX_PyMath.h
+ KX_PythonInit.h
+ KX_PythonInitTypes.h
+ KX_PythonSeq.h
+ KX_RadarSensor.h
+ KX_RayCast.h
+ KX_RayEventManager.h
+ KX_RaySensor.h
+ KX_SCA_AddObjectActuator.h
+ KX_SCA_DynamicActuator.h
+ KX_SCA_EndObjectActuator.h
+ KX_SCA_ReplaceMeshActuator.h
+ KX_SG_BoneParentNodeRelationship.h
+ KX_SG_NodeRelationships.h
+ KX_ScalarInterpolator.h
+ KX_ScalingInterpolator.h
+ KX_Scene.h
+ KX_SceneActuator.h
+ KX_SoundActuator.h
+ KX_StateActuator.h
+ KX_TimeCategoryLogger.h
+ KX_TimeLogger.h
+ KX_TouchEventManager.h
+ KX_TouchSensor.h
+ KX_TrackToActuator.h
+ KX_VehicleWrapper.h
+ KX_VertexProxy.h
+ KX_VisibilityActuator.h
+ KX_WorldInfo.h
+ KX_WorldIpoController.h
+ BL_BlenderShader.h
+ BL_Material.h
+ BL_Shader.h
+ BL_Texture.h
+)
+
+add_definitions(-DGLEW_STATIC)
-IF(WITH_SDL)
- SET(INC ${INC} ${SDL_INCLUDE_DIR})
-ELSE(WITH_SDL)
- ADD_DEFINITIONS(-DDISABLE_SDL)
-ENDIF(WITH_SDL)
+if(WITH_SDL)
+ set(INC ${INC} ${SDL_INCLUDE_DIR})
+else()
+ add_definitions(-DDISABLE_SDL)
+endif()
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ add_definitions(-DWITH_FFMPEG)
+endif()
-IF(WITH_FFMPEG)
- ADD_DEFINITIONS(-DWITH_FFMPEG)
-ENDIF(WITH_FFMPEG)
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+ list(APPEND INC ../../../extern/bullet2/src)
+ list(APPEND INC ../../../source/gameengine/Physics/Bullet )
+endif()
-BLENDERLIB(bf_ketsji "${SRC}" "${INC}")
+blender_add_lib(ge_logic_ketsji "${SRC}" "${INC}")
diff --git a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
index ce3d8fa22fc..5f251c832ee 100644
--- a/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
+++ b/source/gameengine/Ketsji/KXNetwork/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../../source/kernel/gen_system
../../../../intern/string
@@ -38,10 +36,18 @@ SET(INC
../../../../source/gameengine/Network
)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+set(SRC
+ KX_NetworkEventManager.cpp
+ KX_NetworkMessageActuator.cpp
+ KX_NetworkMessageSensor.cpp
+ KX_NetworkObjectActuator.cpp
+ KX_NetworkObjectSensor.cpp
+
+ KX_NetworkEventManager.h
+ KX_NetworkMessageActuator.h
+ KX_NetworkMessageSensor.h
+ KX_NetworkObjectActuator.h
+ KX_NetworkObjectSensor.h
+)
-BLENDERLIB(kx_network "${SRC}" "${INC}")
+blender_add_lib(ge_logic_network "${SRC}" "${INC}")
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp
index d922fb63b4f..e8e65371d3a 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* Ketsji Logic Extenstion: Network Event Manager generic implementation
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.cpp
+ * \ingroup ketsjinet
+ */
+
+
// Ketsji specific sensor part
#include "SCA_ISensor.h"
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
index 80139c67fd3..ff9131f464e 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,13 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Ketsji Logic Extenstion: Network Event Manager class
*/
+
+/** \file KX_NetworkEventManager.h
+ * \ingroup ketsjinet
+ * \brief Ketsji Logic Extenstion: Network Event Manager class
+ */
+
#ifndef KX_NETWORK_EVENTMANAGER_H
#define KX_NETWORK_EVENTMANAGER_H
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
index e047a9aa273..2e0abc0290c 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,13 @@
* Ketsji Logic Extenstion: Network Message Actuator generic implementation
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.cpp
+ * \ingroup ketsjinet
+ */
+
+
+#include <stddef.h>
+
#include "NG_NetworkScene.h"
#include "KX_NetworkMessageActuator.h"
@@ -91,7 +98,7 @@ CValue* KX_NetworkMessageActuator::GetReplica()
return replica;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* -------------------------------------------------------------------- */
/* Python interface --------------------------------------------------- */
@@ -132,4 +139,4 @@ PyAttributeDef KX_NetworkMessageActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
index 62bcca19955..3cea20c56d2 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,8 +25,13 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Ketsji Logic Extenstion: Network Message Actuator class
*/
+
+/** \file KX_NetworkMessageActuator.h
+ * \ingroup ketsjinet
+ * \brief Ketsji Logic Extenstion: Network Message Actuator class
+ */
+
#ifndef __KX_NETWORKMESSAGEACTUATOR_H
#define __KX_NETWORKMESSAGEACTUATOR_H
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
index 56ccac9a93e..6dcf50fa18f 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,13 @@
* Ketsji Logic Extenstion: Network Message Sensor generic implementation
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.cpp
+ * \ingroup ketsjinet
+ */
+
+
+#include <stddef.h>
+
#include "KX_NetworkMessageSensor.h"
#include "KX_NetworkEventManager.h"
#include "NG_NetworkMessage.h"
@@ -154,7 +161,7 @@ bool KX_NetworkMessageSensor::IsPositiveTrigger()
return m_IsUp;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -215,4 +222,4 @@ PyObject* KX_NetworkMessageSensor::pyattr_get_subjects(void *self_v, const KX_PY
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
index 1efd25dd65f..721e80195c3 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkMessageSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Ketsji Logic Extenstion: Network Message Sensor class
+ */
+
+/** \file KX_NetworkMessageSensor.h
+ * \ingroup ketsjinet
+ * \brief Ketsji Logic Extenstion: Network Message Sensor class
*/
#ifndef __KX_NETWORKMESSAGE_SENSOR_H
#define __KX_NETWORKMESSAGE_SENSOR_H
@@ -71,7 +75,7 @@ public:
m_NetworkScene= val;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------- */
/* Python interface -------------------------------------------- */
@@ -81,7 +85,7 @@ public:
static PyObject* pyattr_get_bodies(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_subjects(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp
index 5350c32fff7..0679e34eaad 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,3 +26,8 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.cpp
+ * \ingroup ketsjinet
+ */
+
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h
index aca0805c337..74b6dfede97 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,3 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkObjectActuator.h
+ * \ingroup ketsjinet
+ */
+
+
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp
index aca0805c337..6140ec337e3 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,3 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.cpp
+ * \ingroup ketsjinet
+ */
+
+
diff --git a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h
index aca0805c337..b7264bbf4b6 100644
--- a/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h
+++ b/source/gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,3 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KXNetwork/KX_NetworkObjectSensor.h
+ * \ingroup ketsjinet
+ */
+
+
diff --git a/source/gameengine/Ketsji/KXNetwork/Makefile b/source/gameengine/Ketsji/KXNetwork/Makefile
deleted file mode 100644
index aebbd7921cb..00000000000
--- a/source/gameengine/Ketsji/KXNetwork/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = KXNetwork
-DIR = $(OCGDIR)/gameengine/ketsji/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../Network
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I..
-
diff --git a/source/gameengine/Ketsji/KXNetwork/SConscript b/source/gameengine/Ketsji/KXNetwork/SConscript
index e7f98ff5850..b916530ac8b 100644
--- a/source/gameengine/Ketsji/KXNetwork/SConscript
+++ b/source/gameengine/Ketsji/KXNetwork/SConscript
@@ -10,8 +10,13 @@ incs += ' #source/gameengine/Network #source/gameengine/SceneGraph'
defs = []
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
env.BlenderLib ( 'bf_network', Split(sources), Split(incs), defines=defs,libtype=['core','player'], priority=[400,125], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
index a47a1972beb..f39793e0493 100644
--- a/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Armature sensor
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ArmatureSensor.cpp
+ * \ingroup ketsji
+ */
+
+
#include "DNA_action_types.h"
#include "DNA_constraint_types.h"
#include "BKE_constraint.h"
@@ -149,7 +154,7 @@ bool KX_ArmatureSensor::Evaluate()
return (reset) ? true : false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -201,4 +206,4 @@ PyObject* KX_ArmatureSensor::pyattr_get_constraint(void *self, const struct KX_P
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_ArmatureSensor.h b/source/gameengine/Ketsji/KX_ArmatureSensor.h
index 636309f5bdf..42e042e1401 100644
--- a/source/gameengine/Ketsji/KX_ArmatureSensor.h
+++ b/source/gameengine/Ketsji/KX_ArmatureSensor.h
@@ -1,6 +1,4 @@
-/**
- * Property sensor
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_ArmatureSensor.h
+ * \ingroup ketsji
+ * \brief Property sensor
+ */
+
#ifndef __KX_ARMATURESENSOR
#define __KX_ARMATURESENSOR
@@ -66,14 +69,14 @@ public:
// identify the constraint that this actuator controls
void FindConstraint();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
static PyObject* pyattr_get_constraint(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
struct bConstraint* m_constraint;
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index d88997e2128..9ff32ba57c5 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_BlenderMaterial.cpp
+ * \ingroup ketsji
+ */
// ------------------------------------
// ...
@@ -783,7 +786,7 @@ void KX_BlenderMaterial::SetBlenderGLSLShader(int layer)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyMethodDef KX_BlenderMaterial::Methods[] =
{
@@ -967,4 +970,4 @@ KX_PYMETHODDEF_DOC( KX_BlenderMaterial, setBlending , "setBlending( bge.logic.sr
return NULL;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index 239e334f68a..766e20be825 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -1,3 +1,8 @@
+
+/** \file KX_BlenderMaterial.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_BLENDER_MATERIAL_H__
#define __KX_BLENDER_MATERIAL_H__
@@ -91,14 +96,14 @@ public:
virtual void Replace_IScene(SCA_IScene *val)
{
+ mScene= static_cast<KX_Scene *>(val);
if (mBlenderShader)
{
- mScene= static_cast<KX_Scene *>(val);
mBlenderShader->SetScene(mScene);
}
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// --------------------------------
virtual PyObject* py_repr(void) { return PyUnicode_FromString(mMaterial->matname.ReadPtr()); }
@@ -113,7 +118,7 @@ public:
KX_PYMETHOD_DOC( KX_BlenderMaterial, setTexture );
KX_PYMETHOD_DOC( KX_BlenderMaterial, setBlending );
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
// --------------------------------
// pre calculate to avoid pops/lag at startup
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index 1b2ceae6560..74f410f05f9 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_BulletPhysicsController.cpp
+ * \ingroup ketsji
+ */
//under visual studio the #define in KX_ConvertPhysicsObject.h is quicker for recompilation
#include "KX_ConvertPhysicsObject.h"
@@ -521,4 +524,4 @@ bool KX_BulletPhysicsController::Update(double time)
// return false;
}
-#endif //#ifdef USE_BULLET
+#endif // USE_BULLET
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
index 48a3c98ff81..d46caca49f1 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
@@ -1,9 +1,16 @@
+
+/** \file KX_BulletPhysicsController.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_BULLET2PHYSICS_CONTROLLER
#define KX_BULLET2PHYSICS_CONTROLLER
#include "KX_IPhysicsController.h"
+#ifdef USE_BULLET
#include "CcdPhysicsController.h"
+#endif
class KX_BulletPhysicsController : public KX_IPhysicsController ,public CcdPhysicsController
{
@@ -18,9 +25,10 @@ private:
btCollisionShape* m_bulletChildShape;
public:
+#ifdef USE_BULLET
KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna, bool sensor, bool compound);
virtual ~KX_BulletPhysicsController ();
-
+#endif
///////////////////////////////////
// KX_IPhysicsController interface
////////////////////////////////////
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 2402baf92ac..f9368959c92 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* Camera in the gameengine. Cameras are also used for views.
*/
+
+/** \file gameengine/Ketsji/KX_Camera.cpp
+ * \ingroup ketsji
+ */
+
#include "GL/glew.h"
#include "KX_Camera.h"
@@ -474,7 +479,7 @@ int KX_Camera::GetViewportTop() const
return m_camdata.m_viewporttop;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//----------------------------------------------------------------------------
//Python
@@ -706,6 +711,7 @@ int KX_Camera::pyattr_set_perspective(void *self_v, const KX_PYATTRIBUTE_DEF *at
}
self->m_camdata.m_perspective= param;
+ self->InvalidateProjectionMatrix();
return PY_SET_ATTR_SUCCESS;
}
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index ad2460d34ef..61a0e39e546 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Camera in the gameengine. Cameras are also used for views.
+ */
+
+/** \file KX_Camera.h
+ * \ingroup ketsji
+ * \brief Camera in the gameengine. Cameras are also used for views.
*/
#ifndef __KX_CAMERA
@@ -41,7 +45,7 @@
#include "IntValue.h"
#include "RAS_CameraData.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok, const char *error_prefix);
#endif
@@ -269,7 +273,7 @@ public:
virtual int GetGameObjectType() { return OBJ_CAMERA; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC_VARARGS(KX_Camera, sphereInsideFrustum);
KX_PYMETHOD_DOC_O(KX_Camera, boxInsideFrustum);
KX_PYMETHOD_DOC_O(KX_Camera, pointInsideFrustum);
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.cpp b/source/gameengine/Ketsji/KX_CameraActuator.cpp
index bc67ecbe1a5..17dfe9474a8 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.cpp
+++ b/source/gameengine/Ketsji/KX_CameraActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* KX_CameraActuator.cpp
*
* $Id$
@@ -30,6 +30,11 @@
*
*/
+/** \file gameengine/Ketsji/KX_CameraActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_CameraActuator.h"
#include <iostream>
#include <math.h>
@@ -346,7 +351,7 @@ CValue *KX_CameraActuator::findObject(char *obName)
return NULL;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -414,6 +419,6 @@ int KX_CameraActuator::pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_CameraActuator.h b/source/gameengine/Ketsji/KX_CameraActuator.h
index 2bc0ee18593..135a9cad9d8 100644
--- a/source/gameengine/Ketsji/KX_CameraActuator.h
+++ b/source/gameengine/Ketsji/KX_CameraActuator.h
@@ -1,4 +1,4 @@
-/**
+/*
* KX_CameraActuator.h
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_CameraActuator.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_CAMERAACTUATOR
#define __KX_CAMERAACTUATOR
@@ -114,7 +118,7 @@ private :
/** Methods inherited from SCA_ILogicBrick */
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -124,7 +128,7 @@ private :
static PyObject* pyattr_get_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp b/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp
index 0bfa1133a1c..bd3ab1d0580 100644
--- a/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp
+++ b/source/gameengine/Ketsji/KX_CameraIpoSGController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_CameraIpoSGController.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_CameraIpoSGController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_Camera.h"
diff --git a/source/gameengine/Ketsji/KX_CameraIpoSGController.h b/source/gameengine/Ketsji/KX_CameraIpoSGController.h
index e6596edbd1d..967decfa7b0 100644
--- a/source/gameengine/Ketsji/KX_CameraIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_CameraIpoSGController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_CameraIpoSGController.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_CAMERAIPOSGCONTROLLER_H
#define KX_CAMERAIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_ClientObjectInfo.h b/source/gameengine/Ketsji/KX_ClientObjectInfo.h
index c42843274b3..ae84cf2e300 100644
--- a/source/gameengine/Ketsji/KX_ClientObjectInfo.h
+++ b/source/gameengine/Ketsji/KX_ClientObjectInfo.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ClientObjectInfo.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_CLIENTOBJECT_INFO_H
#define __KX_CLIENTOBJECT_INFO_H
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
index 9380f4b5d2f..708424cae3a 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Apply a constraint to a position or rotation value
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ConstraintActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "SCA_IActuator.h"
#include "KX_ConstraintActuator.h"
#include "SCA_IObject.h"
@@ -557,7 +562,7 @@ bool KX_ConstraintActuator::IsValidMode(KX_ConstraintActuator::KX_CONSTRAINTTYPE
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/Ketsji/KX_ConstraintActuator.h b/source/gameengine/Ketsji/KX_ConstraintActuator.h
index 7bde2c1d3f7..d2eea1f7414 100644
--- a/source/gameengine/Ketsji/KX_ConstraintActuator.h
+++ b/source/gameengine/Ketsji/KX_ConstraintActuator.h
@@ -1,6 +1,4 @@
-/**
- * KX_ConstraintActuator.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_ConstraintActuator.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_CONSTRAINTACTUATOR
#define __KX_CONSTRAINTACTUATOR
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
index b1baa5fe9e1..95ec6e94f18 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ConstraintWrapper.cpp
+ * \ingroup ketsji
+ */
+
+
#include "PyObjectPlus.h"
#include "KX_ConstraintWrapper.h"
#include "PHY_IPhysicsEnvironment.h"
@@ -45,7 +50,7 @@ KX_ConstraintWrapper::~KX_ConstraintWrapper()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_ConstraintWrapper::PyGetConstraintId()
{
@@ -120,4 +125,4 @@ PyObject* KX_ConstraintWrapper::pyattr_get_constraintId(void *self_v, const KX_P
return self->PyGetConstraintId();
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_ConstraintWrapper.h b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
index db9543c23ae..1177586b95f 100644
--- a/source/gameengine/Ketsji/KX_ConstraintWrapper.h
+++ b/source/gameengine/Ketsji/KX_ConstraintWrapper.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConstraintWrapper.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_CONSTRAINT_WRAPPER
#define KX_CONSTRAINT_WRAPPER
@@ -40,7 +45,7 @@ public:
virtual ~KX_ConstraintWrapper ();
int getConstraintId() { return m_constraintId;};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_NOARGS(KX_ConstraintWrapper,GetConstraintId);
KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
KX_PYMETHOD(KX_ConstraintWrapper,GetParam);
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
index ca20aa6b618..fa8c8d253e7 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,22 +26,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ConvertPhysicsObject.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_CONVERTPHYSICSOBJECTS
#define KX_CONVERTPHYSICSOBJECTS
-/* These are defined by the build system... */
-//but the build system is broken, because it doesn't allow for 2 or more defines at once.
-//Please leave Sumo _AND_ Bullet enabled
-#define USE_BULLET
-
-//on visual studio 7/8, always enable BULLET for now
-//you can have multiple physics engines running anyway, and
-//the scons build system doesn't really support this at the moment.
-//if you got troubles, just comment out USE_BULLET
-#if 1300 <= _MSC_VER
-#define USE_BULLET
-#endif
-
class RAS_MeshObject;
class KX_Scene;
struct DerivedMesh;
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index e793f9d5966..b7cc98bd539 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,7 +26,12 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+
+/** \file gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+ * \ingroup ketsji
+ */
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif
@@ -38,7 +43,6 @@
#include "RAS_MeshObject.h"
#include "KX_Scene.h"
#include "SYS_System.h"
-#include "BulletSoftBody/btSoftBody.h"
#include "PHY_Pro.h" //todo cleanup
#include "KX_ClientObjectInfo.h"
@@ -56,6 +60,7 @@ extern "C"{
}
#ifdef USE_BULLET
+#include "BulletSoftBody/btSoftBody.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
@@ -218,6 +223,9 @@ void KX_ConvertBulletObject( class KX_GameObject* gameobj,
break;
}
+ case KX_BOUND_DYN_MESH:
+ /* do nothing */
+ break;
}
@@ -561,4 +569,4 @@ bool KX_ReInstanceBulletShapeFromMesh(KX_GameObject *gameobj, KX_GameObject *fro
spc->ReplaceControllerShape(bm);
return true;
}
-#endif
+#endif // USE_BULLET
diff --git a/source/gameengine/Ketsji/KX_Dome.cpp b/source/gameengine/Ketsji/KX_Dome.cpp
index 94258088e9f..2e1fb933ad0 100644
--- a/source/gameengine/Ketsji/KX_Dome.cpp
+++ b/source/gameengine/Ketsji/KX_Dome.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_Dome.cpp
+ * \ingroup ketsji
+ */
/* $Id$
-----------------------------------------------------------------------------
@@ -18,13 +21,13 @@ http://www.gnu.org/copyleft/lesser.txt.
Contributor(s): Dalai Felinto
This code is originally inspired on some of the ideas and codes from Paul Bourke.
-Developed as part of a Research and Development project for SAT - La Soci�t� des arts technologiques.
+Developed as part of a Research and Development project for SAT - La Société des arts technologiques.
-----------------------------------------------------------------------------
*/
#include "KX_Dome.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <structmember.h>
#endif
@@ -556,26 +559,25 @@ void KX_Dome::CreateMeshDome180(void)
- transform it onto an equidistant spherical projection techniques to transform the sphere onto a dome image
*/
int i,j;
- float sqrt_2 = sqrt(2.0);
float uv_ratio = (float)(m_buffersize-1) / m_imagesize;
m_radangle = m_angle * M_PI/180.0;//calculates the radians angle, used for flattening
- //creating faces for the env mapcube 180� Dome
+ //creating faces for the env mapcube 180deg Dome
// Top Face - just a triangle
- cubetop[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubetop[0].verts[0][0] = -M_SQRT2 / 2.0;
cubetop[0].verts[0][1] = 0.0;
cubetop[0].verts[0][2] = 0.5;
cubetop[0].u[0] = 0.0;
cubetop[0].v[0] = uv_ratio;
cubetop[0].verts[1][0] = 0.0;
- cubetop[0].verts[1][1] = sqrt_2 / 2.0;
+ cubetop[0].verts[1][1] = M_SQRT2 / 2.0;
cubetop[0].verts[1][2] = 0.5;
cubetop[0].u[1] = 0.0;
cubetop[0].v[1] = 0.0;
- cubetop[0].verts[2][0] = sqrt_2 / 2.0;
+ cubetop[0].verts[2][0] = M_SQRT2 / 2.0;
cubetop[0].verts[2][1] = 0.0;
cubetop[0].verts[2][2] = 0.5;
cubetop[0].u[2] = uv_ratio;
@@ -584,20 +586,20 @@ void KX_Dome::CreateMeshDome180(void)
nfacestop = 1;
/* Bottom face - just a triangle */
- cubebottom[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubebottom[0].verts[0][0] = -M_SQRT2 / 2.0;
cubebottom[0].verts[0][1] = 0.0;
cubebottom[0].verts[0][2] = -0.5;
cubebottom[0].u[0] = uv_ratio;
cubebottom[0].v[0] = 0.0;
- cubebottom[0].verts[1][0] = sqrt_2 / 2.0;
+ cubebottom[0].verts[1][0] = M_SQRT2 / 2.0;
cubebottom[0].verts[1][1] = 0;
cubebottom[0].verts[1][2] = -0.5;
cubebottom[0].u[1] = 0.0;
cubebottom[0].v[1] = uv_ratio;
cubebottom[0].verts[2][0] = 0.0;
- cubebottom[0].verts[2][1] = sqrt_2 / 2.0;
+ cubebottom[0].verts[2][1] = M_SQRT2 / 2.0;
cubebottom[0].verts[2][2] = -0.5;
cubebottom[0].u[2] = 0.0;
cubebottom[0].v[2] = 0.0;
@@ -606,39 +608,39 @@ void KX_Dome::CreateMeshDome180(void)
/* Left face - two triangles */
- cubeleft[0].verts[0][0] = -sqrt_2 / 2.0;
+ cubeleft[0].verts[0][0] = -M_SQRT2 / 2.0;
cubeleft[0].verts[0][1] = .0;
cubeleft[0].verts[0][2] = -0.5;
cubeleft[0].u[0] = 0.0;
cubeleft[0].v[0] = 0.0;
cubeleft[0].verts[1][0] = 0.0;
- cubeleft[0].verts[1][1] = sqrt_2 / 2.0;
+ cubeleft[0].verts[1][1] = M_SQRT2 / 2.0;
cubeleft[0].verts[1][2] = -0.5;
cubeleft[0].u[1] = uv_ratio;
cubeleft[0].v[1] = 0.0;
- cubeleft[0].verts[2][0] = -sqrt_2 / 2.0;
+ cubeleft[0].verts[2][0] = -M_SQRT2 / 2.0;
cubeleft[0].verts[2][1] = 0.0;
cubeleft[0].verts[2][2] = 0.5;
cubeleft[0].u[2] = 0.0;
cubeleft[0].v[2] = uv_ratio;
//second triangle
- cubeleft[1].verts[0][0] = -sqrt_2 / 2.0;
+ cubeleft[1].verts[0][0] = -M_SQRT2 / 2.0;
cubeleft[1].verts[0][1] = 0.0;
cubeleft[1].verts[0][2] = 0.5;
cubeleft[1].u[0] = 0.0;
cubeleft[1].v[0] = uv_ratio;
cubeleft[1].verts[1][0] = 0.0;
- cubeleft[1].verts[1][1] = sqrt_2 / 2.0;
+ cubeleft[1].verts[1][1] = M_SQRT2 / 2.0;
cubeleft[1].verts[1][2] = -0.5;
cubeleft[1].u[1] = uv_ratio;
cubeleft[1].v[1] = 0.0;
cubeleft[1].verts[2][0] = 0.0;
- cubeleft[1].verts[2][1] = sqrt_2 / 2.0;
+ cubeleft[1].verts[2][1] = M_SQRT2 / 2.0;
cubeleft[1].verts[2][2] = 0.5;
cubeleft[1].u[2] = uv_ratio;
cubeleft[1].v[2] = uv_ratio;
@@ -647,18 +649,18 @@ void KX_Dome::CreateMeshDome180(void)
/* Right face - two triangles */
cuberight[0].verts[0][0] = 0.0;
- cuberight[0].verts[0][1] = sqrt_2 / 2.0;
+ cuberight[0].verts[0][1] = M_SQRT2 / 2.0;
cuberight[0].verts[0][2] = -0.5;
cuberight[0].u[0] = 0.0;
cuberight[0].v[0] = 0.0;
- cuberight[0].verts[1][0] = sqrt_2 / 2.0;
+ cuberight[0].verts[1][0] = M_SQRT2 / 2.0;
cuberight[0].verts[1][1] = 0.0;
cuberight[0].verts[1][2] = -0.5;
cuberight[0].u[1] = uv_ratio;
cuberight[0].v[1] = 0.0;
- cuberight[0].verts[2][0] = sqrt_2 / 2.0;
+ cuberight[0].verts[2][0] = M_SQRT2 / 2.0;
cuberight[0].verts[2][1] = 0.0;
cuberight[0].verts[2][2] = 0.5;
cuberight[0].u[2] = uv_ratio;
@@ -666,19 +668,19 @@ void KX_Dome::CreateMeshDome180(void)
//second triangle
cuberight[1].verts[0][0] = 0.0;
- cuberight[1].verts[0][1] = sqrt_2 / 2.0;
+ cuberight[1].verts[0][1] = M_SQRT2 / 2.0;
cuberight[1].verts[0][2] = -0.5;
cuberight[1].u[0] = 0.0;
cuberight[1].v[0] = 0.0;
- cuberight[1].verts[1][0] = sqrt_2 / 2.0;
+ cuberight[1].verts[1][0] = M_SQRT2 / 2.0;
cuberight[1].verts[1][1] = 0.0;
cuberight[1].verts[1][2] = 0.5;
cuberight[1].u[1] = uv_ratio;
cuberight[1].v[1] = uv_ratio;
cuberight[1].verts[2][0] = 0.0;
- cuberight[1].verts[2][1] = sqrt_2 / 2.0;
+ cuberight[1].verts[2][1] = M_SQRT2 / 2.0;
cuberight[1].verts[2][2] = 0.5;
cuberight[1].u[2] = 0.0;
cuberight[1].v[2] = uv_ratio;
@@ -746,7 +748,7 @@ void KX_Dome::CreateMeshDome250(void)
m_radangle = m_angle * M_PI/180.0;//calculates the radians angle, used for flattening
/*
verts_height is the exactly needed height of the cube faces (not always 1.0).
-When we want some horizontal information (e.g. for horizontal 220� domes) we don't need to create and tesselate the whole cube.
+When we want some horizontal information (e.g. for horizontal 220deg domes) we don't need to create and tesselate the whole cube.
Therefore the lateral cube faces could be small, and the tesselate mesh would be completely used.
(if we always worked with verts_height = 1.0, we would be discarding a lot of the calculated and tesselated geometry).
@@ -758,12 +760,12 @@ Therefore we have the length in radians of the dome/sphere over the horizon.
Once we take the tangent of that angle, you have the verts coordinate corresponding to the verts on the side faces.
Then we need to multiply it by sqrt(2.0) to get the coordinate of the verts on the diagonal of the original cube.
*/
- verts_height = tan((rad_ang/2) - (MT_PI/2))*sqrt(2.0);
+ verts_height = tan((rad_ang/2) - (MT_PI/2))*M_SQRT2;
uv_height = uv_ratio * ((verts_height/2) + 0.5);
uv_base = uv_ratio * (1.0 - ((verts_height/2) + 0.5));
- //creating faces for the env mapcube 180� Dome
+ //creating faces for the env mapcube 180deg Dome
// Front Face - 2 triangles
cubefront[0].verts[0][0] =-1.0;
cubefront[0].verts[0][1] = 1.0;
@@ -1021,42 +1023,41 @@ void KX_Dome::CreateMeshPanorama(void)
*/
int i,j;
- float sqrt_2 = sqrt(2.0);
float uv_ratio = (float)(m_buffersize-1) / m_imagesize;
/* Top face - two triangles */
- cubetop[0].verts[0][0] = -sqrt_2;
+ cubetop[0].verts[0][0] = -M_SQRT2;
cubetop[0].verts[0][1] = 0.0;
cubetop[0].verts[0][2] = 1.0;
cubetop[0].u[0] = 0.0;
cubetop[0].v[0] = uv_ratio;
cubetop[0].verts[1][0] = 0.0;
- cubetop[0].verts[1][1] = sqrt_2;
+ cubetop[0].verts[1][1] = M_SQRT2;
cubetop[0].verts[1][2] = 1.0;
cubetop[0].u[1] = 0.0;
cubetop[0].v[1] = 0.0;
//second triangle
- cubetop[0].verts[2][0] = sqrt_2;
+ cubetop[0].verts[2][0] = M_SQRT2;
cubetop[0].verts[2][1] = 0.0;
cubetop[0].verts[2][2] = 1.0;
cubetop[0].u[2] = uv_ratio;
cubetop[0].v[2] = 0.0;
- cubetop[1].verts[0][0] = sqrt_2;
+ cubetop[1].verts[0][0] = M_SQRT2;
cubetop[1].verts[0][1] = 0.0;
cubetop[1].verts[0][2] = 1.0;
cubetop[1].u[0] = uv_ratio;
cubetop[1].v[0] = 0.0;
cubetop[1].verts[1][0] = 0.0;
- cubetop[1].verts[1][1] = -sqrt_2;
+ cubetop[1].verts[1][1] = -M_SQRT2;
cubetop[1].verts[1][2] = 1.0;
cubetop[1].u[1] = uv_ratio;
cubetop[1].v[1] = uv_ratio;
- cubetop[1].verts[2][0] = -sqrt_2;
+ cubetop[1].verts[2][0] = -M_SQRT2;
cubetop[1].verts[2][1] = 0.0;
cubetop[1].verts[2][2] = 1.0;
cubetop[1].u[2] = 0.0;
@@ -1065,79 +1066,79 @@ void KX_Dome::CreateMeshPanorama(void)
nfacestop = 2;
/* Bottom face - two triangles */
- cubebottom[0].verts[0][0] = -sqrt_2;
+ cubebottom[0].verts[0][0] = -M_SQRT2;
cubebottom[0].verts[0][1] = 0.0;
cubebottom[0].verts[0][2] = -1.0;
cubebottom[0].u[0] = uv_ratio;
cubebottom[0].v[0] = 0.0;
- cubebottom[0].verts[1][0] = sqrt_2;
+ cubebottom[0].verts[1][0] = M_SQRT2;
cubebottom[0].verts[1][1] = 0.0;
cubebottom[0].verts[1][2] = -1.0;
cubebottom[0].u[1] = 0.0;
cubebottom[0].v[1] = uv_ratio;
cubebottom[0].verts[2][0] = 0.0;
- cubebottom[0].verts[2][1] = sqrt_2;
+ cubebottom[0].verts[2][1] = M_SQRT2;
cubebottom[0].verts[2][2] = -1.0;
cubebottom[0].u[2] = 0.0;
cubebottom[0].v[2] = 0.0;
//second triangle
- cubebottom[1].verts[0][0] = sqrt_2;
+ cubebottom[1].verts[0][0] = M_SQRT2;
cubebottom[1].verts[0][1] = 0.0;
cubebottom[1].verts[0][2] = -1.0;
cubebottom[1].u[0] = 0.0;
cubebottom[1].v[0] = uv_ratio;
- cubebottom[1].verts[1][0] = -sqrt_2;
+ cubebottom[1].verts[1][0] = -M_SQRT2;
cubebottom[1].verts[1][1] = 0.0;
cubebottom[1].verts[1][2] = -1.0;
cubebottom[1].u[1] = uv_ratio;
cubebottom[1].v[1] = 0.0;
cubebottom[1].verts[2][0] = 0.0;
- cubebottom[1].verts[2][1] = -sqrt_2;
+ cubebottom[1].verts[2][1] = -M_SQRT2;
cubebottom[1].verts[2][2] = -1.0;
cubebottom[1].u[2] = uv_ratio;
cubebottom[1].v[2] = uv_ratio;
nfacesbottom = 2;
- /* Left Back (135�) face - two triangles */
+ /* Left Back (135deg) face - two triangles */
cubeleftback[0].verts[0][0] = 0;
- cubeleftback[0].verts[0][1] = -sqrt_2;
+ cubeleftback[0].verts[0][1] = -M_SQRT2;
cubeleftback[0].verts[0][2] = -1.0;
cubeleftback[0].u[0] = 0;
cubeleftback[0].v[0] = 0;
- cubeleftback[0].verts[1][0] = -sqrt_2;
+ cubeleftback[0].verts[1][0] = -M_SQRT2;
cubeleftback[0].verts[1][1] = 0;
cubeleftback[0].verts[1][2] = -1.0;
cubeleftback[0].u[1] = uv_ratio;
cubeleftback[0].v[1] = 0;
cubeleftback[0].verts[2][0] = 0;
- cubeleftback[0].verts[2][1] = -sqrt_2;
+ cubeleftback[0].verts[2][1] = -M_SQRT2;
cubeleftback[0].verts[2][2] = 1.0;
cubeleftback[0].u[2] = 0;
cubeleftback[0].v[2] = uv_ratio;
//second triangle
cubeleftback[1].verts[0][0] = 0;
- cubeleftback[1].verts[0][1] = -sqrt_2;
+ cubeleftback[1].verts[0][1] = -M_SQRT2;
cubeleftback[1].verts[0][2] = 1.0;
cubeleftback[1].u[0] = 0;
cubeleftback[1].v[0] = uv_ratio;
- cubeleftback[1].verts[1][0] = -sqrt_2;
+ cubeleftback[1].verts[1][0] = -M_SQRT2;
cubeleftback[1].verts[1][1] = 0;
cubeleftback[1].verts[1][2] = -1.0;
cubeleftback[1].u[1] = uv_ratio;
cubeleftback[1].v[1] = 0;
- cubeleftback[1].verts[2][0] = -sqrt_2;
+ cubeleftback[1].verts[2][0] = -M_SQRT2;
cubeleftback[1].verts[2][1] = 0;
cubeleftback[1].verts[2][2] = 1.0;
cubeleftback[1].u[2] = uv_ratio;
@@ -1147,39 +1148,39 @@ void KX_Dome::CreateMeshPanorama(void)
/* Left face - two triangles */
- cubeleft[0].verts[0][0] = -sqrt_2;
+ cubeleft[0].verts[0][0] = -M_SQRT2;
cubeleft[0].verts[0][1] = 0;
cubeleft[0].verts[0][2] = -1.0;
cubeleft[0].u[0] = 0;
cubeleft[0].v[0] = 0;
cubeleft[0].verts[1][0] = 0;
- cubeleft[0].verts[1][1] = sqrt_2;
+ cubeleft[0].verts[1][1] = M_SQRT2;
cubeleft[0].verts[1][2] = -1.0;
cubeleft[0].u[1] = uv_ratio;
cubeleft[0].v[1] = 0;
- cubeleft[0].verts[2][0] = -sqrt_2;
+ cubeleft[0].verts[2][0] = -M_SQRT2;
cubeleft[0].verts[2][1] = 0;
cubeleft[0].verts[2][2] = 1.0;
cubeleft[0].u[2] = 0;
cubeleft[0].v[2] = uv_ratio;
//second triangle
- cubeleft[1].verts[0][0] = -sqrt_2;
+ cubeleft[1].verts[0][0] = -M_SQRT2;
cubeleft[1].verts[0][1] = 0;
cubeleft[1].verts[0][2] = 1.0;
cubeleft[1].u[0] = 0;
cubeleft[1].v[0] = uv_ratio;
cubeleft[1].verts[1][0] = 0;
- cubeleft[1].verts[1][1] = sqrt_2;
+ cubeleft[1].verts[1][1] = M_SQRT2;
cubeleft[1].verts[1][2] = -1.0;
cubeleft[1].u[1] = uv_ratio;
cubeleft[1].v[1] = 0;
cubeleft[1].verts[2][0] = 0;
- cubeleft[1].verts[2][1] = sqrt_2;
+ cubeleft[1].verts[2][1] = M_SQRT2;
cubeleft[1].verts[2][2] = 1.0;
cubeleft[1].u[2] = uv_ratio;
cubeleft[1].v[2] = uv_ratio;
@@ -1188,18 +1189,18 @@ void KX_Dome::CreateMeshPanorama(void)
/* Right face - two triangles */
cuberight[0].verts[0][0] = 0;
- cuberight[0].verts[0][1] = sqrt_2;
+ cuberight[0].verts[0][1] = M_SQRT2;
cuberight[0].verts[0][2] = -1.0;
cuberight[0].u[0] = 0;
cuberight[0].v[0] = 0;
- cuberight[0].verts[1][0] = sqrt_2;
+ cuberight[0].verts[1][0] = M_SQRT2;
cuberight[0].verts[1][1] = 0;
cuberight[0].verts[1][2] = -1.0;
cuberight[0].u[1] = uv_ratio;
cuberight[0].v[1] = 0;
- cuberight[0].verts[2][0] = sqrt_2;
+ cuberight[0].verts[2][0] = M_SQRT2;
cuberight[0].verts[2][1] = 0;
cuberight[0].verts[2][2] = 1.0;
cuberight[0].u[2] = uv_ratio;
@@ -1207,58 +1208,58 @@ void KX_Dome::CreateMeshPanorama(void)
//second triangle
cuberight[1].verts[0][0] = 0;
- cuberight[1].verts[0][1] = sqrt_2;
+ cuberight[1].verts[0][1] = M_SQRT2;
cuberight[1].verts[0][2] = -1.0;
cuberight[1].u[0] = 0;
cuberight[1].v[0] = 0;
- cuberight[1].verts[1][0] = sqrt_2;
+ cuberight[1].verts[1][0] = M_SQRT2;
cuberight[1].verts[1][1] = 0;
cuberight[1].verts[1][2] = 1.0;
cuberight[1].u[1] = uv_ratio;
cuberight[1].v[1] = uv_ratio;
cuberight[1].verts[2][0] = 0;
- cuberight[1].verts[2][1] = sqrt_2;
+ cuberight[1].verts[2][1] = M_SQRT2;
cuberight[1].verts[2][2] = 1.0;
cuberight[1].u[2] = 0;
cuberight[1].v[2] = uv_ratio;
nfacesright = 2;
- /* Right Back (-135�) face - two triangles */
- cuberightback[0].verts[0][0] = sqrt_2;
+ /* Right Back (-135deg) face - two triangles */
+ cuberightback[0].verts[0][0] = M_SQRT2;
cuberightback[0].verts[0][1] = 0;
cuberightback[0].verts[0][2] = -1.0;
cuberightback[0].u[0] = 0;
cuberightback[0].v[0] = 0;
cuberightback[0].verts[1][0] = 0;
- cuberightback[0].verts[1][1] = -sqrt_2;
+ cuberightback[0].verts[1][1] = -M_SQRT2;
cuberightback[0].verts[1][2] = -1.0;
cuberightback[0].u[1] = uv_ratio;
cuberightback[0].v[1] = 0;
cuberightback[0].verts[2][0] = 0;
- cuberightback[0].verts[2][1] = -sqrt_2;
+ cuberightback[0].verts[2][1] = -M_SQRT2;
cuberightback[0].verts[2][2] = 1.0;
cuberightback[0].u[2] = uv_ratio;
cuberightback[0].v[2] = uv_ratio;
//second triangle
- cuberightback[1].verts[0][0] = sqrt_2;
+ cuberightback[1].verts[0][0] = M_SQRT2;
cuberightback[1].verts[0][1] = 0;
cuberightback[1].verts[0][2] = -1.0;
cuberightback[1].u[0] = 0;
cuberightback[1].v[0] = 0;
cuberightback[1].verts[1][0] = 0;
- cuberightback[1].verts[1][1] = -sqrt_2;
+ cuberightback[1].verts[1][1] = -M_SQRT2;
cuberightback[1].verts[1][2] = 1.0;
cuberightback[1].u[1] = uv_ratio;
cuberightback[1].v[1] = uv_ratio;
- cuberightback[1].verts[2][0] = sqrt_2;
+ cuberightback[1].verts[2][0] = M_SQRT2;
cuberightback[1].verts[2][1] = 0;
cuberightback[1].verts[2][2] = 1.0;
cuberightback[1].u[2] = 0;
@@ -1355,7 +1356,7 @@ void KX_Dome::FlattenDome(MT_Vector3 verts[3])
void KX_Dome::FlattenPanorama(MT_Vector3 verts[3])
{
-// it creates a full spherical panoramic (360�)
+// it creates a full spherical panoramic (360deg)
int i;
double phi;
bool edge=false;
@@ -1448,7 +1449,7 @@ void KX_Dome::SplitFace(vector <DomeFace>& face, int *nfaces)
void KX_Dome::CalculateFrustum(KX_Camera * cam)
{
/*
- // manually creating a 90� Field of View Frustum
+ // manually creating a 90deg Field of View Frustum
the original formula:
top = tan(fov*3.14159/360.0) * near [for fov in degrees]
@@ -1469,7 +1470,7 @@ void KX_Dome::CalculateFrustum(KX_Camera * cam)
m_frustrum.camfar = cam->GetCameraFar();
// float top = tan(90.0*MT_PI/360.0) * m_frustrum.camnear;
- float top = m_frustrum.camnear; // for deg = 90�, tan = 1
+ float top = m_frustrum.camnear; // for deg = 90deg, tan = 1
m_frustrum.x1 = -top;
m_frustrum.x2 = top;
@@ -1484,9 +1485,9 @@ void KX_Dome::CalculateFrustum(KX_Camera * cam)
void KX_Dome::CalculateCameraOrientation()
{
/*
-Uses 4 cameras for angles up to 180�
-Uses 5 cameras for angles up to 250�
-Uses 6 cameras for angles up to 360�
+Uses 4 cameras for angles up to 180deg
+Uses 5 cameras for angles up to 250deg
+Uses 6 cameras for angles up to 360deg
*/
int i;
float deg45 = MT_PI / 4;
@@ -1497,22 +1498,22 @@ Uses 6 cameras for angles up to 360�
|| m_mode == DOME_TRUNCATED_FRONT
|| m_mode == DOME_TRUNCATED_REAR)){
- m_locRot[0] = MT_Matrix3x3( // 90� - Top
+ m_locRot[0] = MT_Matrix3x3( // 90deg - Top
c, -s, 0.0,
0.0,0.0, -1.0,
s, c, 0.0);
- m_locRot[1] = MT_Matrix3x3( // 90� - Bottom
+ m_locRot[1] = MT_Matrix3x3( // 90deg - Bottom
-s, c, 0.0,
0.0,0.0, 1.0,
s, c, 0.0);
- m_locRot[2] = MT_Matrix3x3( // 45� - Left
+ m_locRot[2] = MT_Matrix3x3( // 45deg - Left
c, 0.0, s,
0, 1.0, 0.0,
-s, 0.0, c);
- m_locRot[3] = MT_Matrix3x3( // 45� - Right
+ m_locRot[3] = MT_Matrix3x3( // 45deg - Right
c, 0.0, -s,
0.0, 1.0, 0.0,
s, 0.0, c);
@@ -1521,32 +1522,32 @@ Uses 6 cameras for angles up to 360�
|| m_mode == DOME_TRUNCATED_FRONT
|| m_mode == DOME_TRUNCATED_REAR))){
- m_locRot[0] = MT_Matrix3x3( // 90� - Top
+ m_locRot[0] = MT_Matrix3x3( // 90deg - Top
1.0, 0.0, 0.0,
0.0, 0.0,-1.0,
0.0, 1.0, 0.0);
- m_locRot[1] = MT_Matrix3x3( // 90� - Bottom
+ m_locRot[1] = MT_Matrix3x3( // 90deg - Bottom
1.0, 0.0, 0.0,
0.0, 0.0, 1.0,
0.0,-1.0, 0.0);
- m_locRot[2] = MT_Matrix3x3( // -90� - Left
+ m_locRot[2] = MT_Matrix3x3( // -90deg - Left
0.0, 0.0, 1.0,
0.0, 1.0, 0.0,
-1.0, 0.0, 0.0);
- m_locRot[3] = MT_Matrix3x3( // 90� - Right
+ m_locRot[3] = MT_Matrix3x3( // 90deg - Right
0.0, 0.0,-1.0,
0.0, 1.0, 0.0,
1.0, 0.0, 0.0);
- m_locRot[4] = MT_Matrix3x3( // 0� - Front
+ m_locRot[4] = MT_Matrix3x3( // 0deg - Front
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0);
- m_locRot[5] = MT_Matrix3x3( // 180� - Back - USED for ENVMAP only
+ m_locRot[5] = MT_Matrix3x3( // 180deg - Back - USED for ENVMAP only
-1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0,-1.0);
@@ -1563,22 +1564,22 @@ Uses 6 cameras for angles up to 360�
0.0 ,0.0, 1.0,
s, -c, 0.0);
- m_locRot[2] = MT_Matrix3x3( // 45� - Left
+ m_locRot[2] = MT_Matrix3x3( // 45deg - Left
-s, 0.0, c,
0, 1.0, 0.0,
-c, 0.0, -s);
- m_locRot[3] = MT_Matrix3x3( // 45� - Right
+ m_locRot[3] = MT_Matrix3x3( // 45deg - Right
c, 0.0, s,
0, 1.0, 0.0,
-s, 0.0, c);
- m_locRot[4] = MT_Matrix3x3( // 135� - LeftBack
+ m_locRot[4] = MT_Matrix3x3( // 135deg - LeftBack
-s, 0.0, -c,
0.0, 1.0, 0.0,
c, 0.0, -s);
- m_locRot[5] = MT_Matrix3x3( // 135� - RightBack
+ m_locRot[5] = MT_Matrix3x3( // 135deg - RightBack
c, 0.0, -s,
0.0, 1.0, 0.0,
s, 0.0, c);
@@ -1737,7 +1738,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(-onebythree,-2 * onebythree, 3.0f);
glEnd();
- // domefacesId[2] => -90� (left)
+ // domefacesId[2] => -90deg (left)
glBindTexture(GL_TEXTURE_2D, domefacesId[2]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1750,7 +1751,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(-onebythree, 0.0f, 3.0f);
glEnd();
- // domefacesId[3] => 90� (right)
+ // domefacesId[3] => 90deg (right)
glBindTexture(GL_TEXTURE_2D, domefacesId[3]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1763,7 +1764,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(1.0f, 0.0f, 3.0f);
glEnd();
- // domefacesId[4] => 0� (front)
+ // domefacesId[4] => 0deg (front)
glBindTexture(GL_TEXTURE_2D, domefacesId[4]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1776,7 +1777,7 @@ void KX_Dome::DrawEnvMap(void)
glVertex3f(1.0f, -2 * onebythree, 3.0f);
glEnd();
- // domefacesId[5] => 180� (back)
+ // domefacesId[5] => 180deg (back)
glBindTexture(GL_TEXTURE_2D, domefacesId[5]);
glBegin(GL_QUADS);
glTexCoord2f(uv_ratio,uv_ratio);
@@ -1953,19 +1954,19 @@ void KX_Dome::DrawPanorama(void)
glBindTexture(GL_TEXTURE_2D, domefacesId[1]);
GLDrawTriangles(cubebottom, nfacesbottom);
- // domefacesId[1] => -45� (left)
+ // domefacesId[1] => -45deg (left)
glBindTexture(GL_TEXTURE_2D, domefacesId[2]);
GLDrawTriangles(cubeleft, nfacesleft);
- // domefacesId[2] => 45� (right)
+ // domefacesId[2] => 45deg (right)
glBindTexture(GL_TEXTURE_2D, domefacesId[3]);
GLDrawTriangles(cuberight, nfacesright);
- // domefacesId[0] => -135� (leftback)
+ // domefacesId[0] => -135deg (leftback)
glBindTexture(GL_TEXTURE_2D, domefacesId[4]);
GLDrawTriangles(cubeleftback, nfacesleftback);
- // domefacesId[3] => 135� (rightback)
+ // domefacesId[3] => 135deg (rightback)
glBindTexture(GL_TEXTURE_2D, domefacesId[5]);
GLDrawTriangles(cuberightback, nfacesrightback);
}
@@ -2049,11 +2050,11 @@ void KX_Dome::RenderDomeFrame(KX_Scene* scene, KX_Camera* cam, int i)
m_rasterizer->SetViewMatrix(viewmat, cam->NodeGetWorldOrientation(), cam->NodeGetWorldPosition(), 1.0);
cam->SetModelviewMatrix(viewmat);
- scene->CalculateVisibleMeshes(m_rasterizer,cam);
- scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
-
// restore the original orientation
cam->NodeSetLocalOrientation(camori);
cam->NodeUpdateGS(0.f);
+
+ scene->CalculateVisibleMeshes(m_rasterizer,cam);
+ scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
}
diff --git a/source/gameengine/Ketsji/KX_Dome.h b/source/gameengine/Ketsji/KX_Dome.h
index 749fbebe61c..844f40f0578 100644
--- a/source/gameengine/Ketsji/KX_Dome.h
+++ b/source/gameengine/Ketsji/KX_Dome.h
@@ -22,6 +22,10 @@ Developed as part of a Research and Development project for SAT - La Soci�t�
-----------------------------------------------------------------------------
*/
+/** \file KX_Dome.h
+ * \ingroup ketsji
+ */
+
#if !defined KX_DOME_H
#define KX_DOME_H
diff --git a/source/gameengine/Ketsji/KX_EmptyObject.cpp b/source/gameengine/Ketsji/KX_EmptyObject.cpp
index 7dc66b3fb88..27ed6c6a6cc 100644
--- a/source/gameengine/Ketsji/KX_EmptyObject.cpp
+++ b/source/gameengine/Ketsji/KX_EmptyObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_EmptyObject.cpp
+ * \ingroup ketsji
+ */
+
#include "KX_EmptyObject.h"
KX_EmptyObject::~KX_EmptyObject()
diff --git a/source/gameengine/Ketsji/KX_EmptyObject.h b/source/gameengine/Ketsji/KX_EmptyObject.h
index c41e40fdd41..e22e1aa7926 100644
--- a/source/gameengine/Ketsji/KX_EmptyObject.h
+++ b/source/gameengine/Ketsji/KX_EmptyObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_EmptyObject.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_EMPTYOBJECT
#define __KX_EMPTYOBJECT
#include "KX_GameObject.h"
diff --git a/source/gameengine/Ketsji/KX_FontObject.cpp b/source/gameengine/Ketsji/KX_FontObject.cpp
new file mode 100644
index 00000000000..dbb98588127
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_FontObject.cpp
@@ -0,0 +1,162 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file gameengine/Ketsji/KX_FontObject.cpp
+ * \ingroup ketsji
+ */
+
+#include "KX_FontObject.h"
+#include "DNA_curve_types.h"
+#include "KX_Scene.h"
+#include "KX_PythonInit.h"
+#include "BLI_math.h"
+
+extern "C" {
+#include "BLF_api.h"
+}
+
+#define BGE_FONT_RES 100
+
+KX_FontObject::KX_FontObject( void* sgReplicationInfo,
+ SG_Callbacks callbacks,
+ RAS_IRenderTools* rendertools,
+ Object *ob):
+ KX_GameObject(sgReplicationInfo, callbacks),
+ m_object(ob),
+ m_dpi(72),
+ m_resolution(1.f),
+ m_rendertools(rendertools)
+{
+ Curve *text = static_cast<Curve *> (ob->data);
+ m_text = text->str;
+ m_fsize = text->fsize;
+
+ /* FO_BUILTIN_NAME != "default" */
+ /* I hope at some point Blender (2.5x) can have a single font */
+ /* with unicode support for ui and OB_FONT */
+ /* once we have packed working we can load the FO_BUILTIN_NAME font */
+ const char* filepath = text->vfont->name;
+ if (strcmp(FO_BUILTIN_NAME, filepath) == 0)
+ filepath = "default";
+
+ /* XXX - if it's packed it will not work. waiting for bdiego (Diego) fix for that. */
+ m_fontid = BLF_load(filepath);
+ if (m_fontid == -1)
+ m_fontid = BLF_load("default");
+
+ /* initialize the color with the object color and store it in the KX_Object class
+ This is a workaround waiting for the fix:
+ [#25487] BGE: Object Color only works when it has a keyed frame */
+ copy_v4_v4(m_color, (const float*) ob->col);
+ this->SetObjectColor((const MT_Vector4&) m_color);
+}
+
+KX_FontObject::~KX_FontObject()
+{
+ //remove font from the scene list
+ //it's handled in KX_Scene::NewRemoveObject
+}
+
+CValue* KX_FontObject::GetReplica() {
+ KX_FontObject* replica = new KX_FontObject(*this);
+ replica->ProcessReplica();
+ return replica;
+}
+
+void KX_FontObject::ProcessReplica()
+{
+ KX_GameObject::ProcessReplica();
+ KX_GetActiveScene()->AddFont(this);
+}
+
+void KX_FontObject::DrawText()
+{
+ /* only draws the text if visible */
+ if(this->GetVisible() == 0) return;
+
+ /* update the animated color */
+ this->GetObjectColor().getValue(m_color);
+
+ /* XXX 2DO - handle multiple lines */
+ /* HARDCODED MULTIPLICATION FACTOR - this will affect the render resolution directly */
+ float RES = BGE_FONT_RES * m_resolution;
+
+ float size = m_fsize * m_object->size[0] * RES;
+ float aspect = 1.f / (m_object->size[0] * RES);
+
+ m_rendertools->RenderText3D(m_fontid, m_text, int(size), m_dpi, m_color, this->GetOpenGLMatrix(), aspect);
+}
+
+#ifdef WITH_PYTHON
+
+/* ------------------------------------------------------------------------- */
+/* Python Integration Hooks */
+/* ------------------------------------------------------------------------- */
+
+PyTypeObject KX_FontObject::Type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "KX_FontObject",
+ sizeof(PyObjectPlus_Proxy),
+ 0,
+ py_base_dealloc,
+ 0,
+ 0,
+ 0,
+ 0,
+ py_base_repr,
+ 0,
+ &KX_GameObject::Sequence,
+ &KX_GameObject::Mapping,
+ 0,0,0,
+ NULL,
+ NULL,
+ 0,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ 0,0,0,0,0,0,0,
+ Methods,
+ 0,
+ 0,
+ &KX_GameObject::Type,
+ 0,0,0,0,0,0,
+ py_base_new
+};
+
+PyMethodDef KX_FontObject::Methods[] = {
+ {NULL,NULL} //Sentinel
+};
+
+PyAttributeDef KX_FontObject::Attributes[] = {
+ KX_PYATTRIBUTE_STRING_RW("text", 0, 280, false, KX_FontObject, m_text), //arbitrary limit. 280 = 140 unicode chars in unicode
+ KX_PYATTRIBUTE_FLOAT_RW("size", 0.0001f, 10000.0f, KX_FontObject, m_fsize),
+ KX_PYATTRIBUTE_FLOAT_RW("resolution", 0.0001f, 10000.0f, KX_FontObject, m_resolution),
+ /* KX_PYATTRIBUTE_INT_RW("dpi", 0, 10000, false, KX_FontObject, m_dpi), */// no real need for expose this I think
+ { NULL } //Sentinel
+};
+
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_FontObject.h b/source/gameengine/Ketsji/KX_FontObject.h
new file mode 100644
index 00000000000..c29ee4bcdcf
--- /dev/null
+++ b/source/gameengine/Ketsji/KX_FontObject.h
@@ -0,0 +1,85 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file KX_FontObject.h
+ * \ingroup ketsji
+ */
+
+#ifndef __KX_FONTOBJECT
+#define __KX_FONTOBJECT
+#include "KX_GameObject.h"
+#include "DNA_vfont_types.h"
+#include "RAS_IRenderTools.h"
+
+class KX_FontObject : public KX_GameObject
+{
+public:
+ Py_Header;
+ KX_FontObject( void* sgReplicationInfo,
+ SG_Callbacks callbacks,
+ RAS_IRenderTools* rendertools,
+ Object *ob);
+
+ virtual ~KX_FontObject();
+
+ void DrawText();
+
+ /**
+ * Inherited from CValue -- return a new copy of this
+ * instance allocated on the heap. Ownership of the new
+ * object belongs with the caller.
+ */
+ virtual CValue* GetReplica();
+ virtual void ProcessReplica();
+
+protected:
+ STR_String m_text;
+ Object* m_object;
+ int m_fontid;
+ int m_dpi;
+ float m_fsize;
+ float m_resolution;
+ float m_color[4];
+
+ class RAS_IRenderTools* m_rendertools; //needed for drawing routine
+
+/*
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:KX_FontObject"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+*/
+
+#ifdef WITH_PYTHON
+#endif
+
+};
+
+#endif //__KX_FONTOBJECT
diff --git a/source/gameengine/Ketsji/KX_GameActuator.cpp b/source/gameengine/Ketsji/KX_GameActuator.cpp
index 208c526398a..e0c269d6e26 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.cpp
+++ b/source/gameengine/Ketsji/KX_GameActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* global game stuff
*
* $Id$
@@ -29,6 +29,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_GameActuator.cpp
+ * \ingroup ketsji
+ */
+
+
+#include <stddef.h>
+
#include "SCA_IActuator.h"
#include "KX_GameActuator.h"
//#include <iostream>
@@ -124,7 +131,7 @@ bool KX_GameActuator::Update()
}
case KX_GAME_SAVECFG:
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_ketsjiengine)
{
char mashal_path[512];
@@ -152,11 +159,11 @@ bool KX_GameActuator::Update()
delete [] marshal_buffer;
}
break;
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
case KX_GAME_LOADCFG:
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_ketsjiengine)
{
char mashal_path[512];
@@ -191,7 +198,7 @@ bool KX_GameActuator::Update()
}
}
break;
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
default:
; /* do nothing? this is an internal error !!! */
@@ -201,7 +208,7 @@ bool KX_GameActuator::Update()
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -241,4 +248,4 @@ PyAttributeDef KX_GameActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_GameActuator.h b/source/gameengine/Ketsji/KX_GameActuator.h
index 273d6664e1d..eee38b02406 100644
--- a/source/gameengine/Ketsji/KX_GameActuator.h
+++ b/source/gameengine/Ketsji/KX_GameActuator.h
@@ -1,7 +1,3 @@
-
-//
-// actuator for global game stuff
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +26,11 @@
// ***** END GPL LICENSE BLOCK *****
//
+/** \file KX_GameActuator.h
+ * \ingroup ketsji
+ * \brief actuator for global game stuff
+ */
+
#ifndef __KX_GAMEACTUATOR
#define __KX_GAMEACTUATOR
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index e44aac2699c..5ca780bb319 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,13 +28,18 @@
* Game object wrapper
*/
+/** \file gameengine/Ketsji/KX_GameObject.cpp
+ * \ingroup ketsji
+ */
+
+
#if defined(_WIN64)
typedef unsigned __int64 uint_ptr;
#else
typedef unsigned long uint_ptr;
#endif
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
@@ -47,6 +52,7 @@ typedef unsigned long uint_ptr;
#include "KX_GameObject.h"
#include "KX_Camera.h" // only for their ::Type
#include "KX_Light.h" // only for their ::Type
+#include "KX_FontObject.h" // only for their ::Type
#include "RAS_MeshObject.h"
#include "KX_MeshProxy.h"
#include "KX_PolyProxy.h"
@@ -102,7 +108,7 @@ KX_GameObject::KX_GameObject(
m_xray(false),
m_pHitObject(NULL),
m_isDeformable(false)
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
, m_attr_dict(NULL)
#endif
{
@@ -148,12 +154,12 @@ KX_GameObject::~KX_GameObject()
{
delete m_pGraphicController;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_attr_dict) {
PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */
Py_DECREF(m_attr_dict);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}
KX_GameObject* KX_GameObject::GetClientObject(KX_ClientObjectInfo* info)
@@ -348,7 +354,7 @@ void KX_GameObject::ProcessReplica()
m_pClient_info->m_gameobject = this;
m_state = 0;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if(m_attr_dict)
m_attr_dict= PyDict_Copy(m_attr_dict);
#endif
@@ -1022,7 +1028,7 @@ void KX_GameObject::NodeSetGlobalOrientation(const MT_Matrix3x3& rot)
if (GetSGNode()->GetSGParent())
GetSGNode()->SetLocalOrientation(GetSGNode()->GetSGParent()->GetWorldOrientation().inverse()*rot);
else
- GetSGNode()->SetLocalOrientation(rot);
+ NodeSetLocalOrientation(rot);
}
void KX_GameObject::NodeSetLocalScale(const MT_Vector3& scale)
@@ -1266,7 +1272,9 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
return 0;
-
+
+#define PHYS_ERR(attr) PyErr_SetString(PyExc_AttributeError, "KX_GameObject." attr ", is missing a physics controller")
+
switch(subtype) {
case MATHUTILS_VEC_CB_POS_LOCAL:
self->NodeGetLocalPosition().getValue(bmo->data);
@@ -1281,31 +1289,33 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
self->NodeGetWorldScaling().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_INERTIA_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localInertia"), 0;
self->GetPhysicsController()->GetLocalInertia().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_OBJECT_COLOR:
self->GetObjectColor().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
self->GetLinearVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_GLOBAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
self->GetLinearVelocity(false).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_LOCAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
self->GetAngularVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_GLOBAL:
- if(!self->GetPhysicsController()) return 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
self->GetAngularVelocity(false).getValue(bmo->data);
break;
}
+#undef PHYS_ERR
+
return 1;
}
@@ -1448,7 +1458,7 @@ void KX_GameObject_Mathutils_Callback_Init(void)
#endif // USE_MATHUTILS
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------- python stuff ---------------------------------------------------*/
PyMethodDef KX_GameObject::Methods[] = {
{"applyForce", (PyCFunction) KX_GameObject::sPyApplyForce, METH_VARARGS},
@@ -1496,6 +1506,7 @@ PyMethodDef KX_GameObject::Methods[] = {
PyAttributeDef KX_GameObject::Attributes[] = {
KX_PYATTRIBUTE_RO_FUNCTION("name", KX_GameObject, pyattr_get_name),
KX_PYATTRIBUTE_RO_FUNCTION("parent", KX_GameObject, pyattr_get_parent),
+ KX_PYATTRIBUTE_RO_FUNCTION("life", KX_GameObject, pyattr_get_life),
KX_PYATTRIBUTE_RW_FUNCTION("mass", KX_GameObject, pyattr_get_mass, pyattr_set_mass),
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMin", KX_GameObject, pyattr_get_lin_vel_min, pyattr_set_lin_vel_min),
KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMax", KX_GameObject, pyattr_get_lin_vel_max, pyattr_set_lin_vel_max),
@@ -1574,11 +1585,11 @@ PyObject* KX_GameObject::PyReinstancePhysicsMesh(PyObject* args)
) {
return NULL;
}
-
+#ifdef USE_BULLET
/* gameobj and mesh can be NULL */
if(KX_ReInstanceBulletShapeFromMesh(this, gameobj, mesh))
Py_RETURN_TRUE;
-
+#endif
Py_RETURN_FALSE;
}
@@ -1787,6 +1798,19 @@ PyObject* KX_GameObject::pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DE
Py_RETURN_NONE;
}
+PyObject* KX_GameObject::pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
+
+ CValue *life = self->GetProperty("::timebomb");
+ if (life)
+ // this convert the timebomb seconds to frames, hard coded 50.0 (assuming 50fps)
+ // value hardcoded in KX_Scene::AddReplicaObject()
+ return PyFloat_FromDouble(life->GetNumber() * 50.0);
+ else
+ Py_RETURN_NONE;
+}
+
PyObject* KX_GameObject::pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
@@ -3016,7 +3040,8 @@ bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py
if ( PyObject_TypeCheck(value, &KX_GameObject::Type) ||
PyObject_TypeCheck(value, &KX_LightObject::Type) ||
- PyObject_TypeCheck(value, &KX_Camera::Type) )
+ PyObject_TypeCheck(value, &KX_Camera::Type) ||
+ PyObject_TypeCheck(value, &KX_FontObject::Type))
{
*object = static_cast<KX_GameObject*>BGE_PROXY_REF(value);
@@ -3039,4 +3064,4 @@ bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py
return false;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index 625ff2609df..b54fb6b068e 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -25,17 +25,22 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * General KX game object.
+ */
+
+/** \file KX_GameObject.h
+ * \ingroup ketsji
+ * \brief General KX game object.
*/
#ifndef __KX_GAMEOBJECT
#define __KX_GAMEOBJECT
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// get rid of this stupid "warning 'this' used in initialiser list", generated by VC when including Solid/Sumo
#pragma warning (disable : 4355)
#endif
+#include <stddef.h>
#include "ListValue.h"
#include "SCA_IObject.h"
@@ -60,7 +65,7 @@ class PHY_IGraphicController;
class PHY_IPhysicsEnvironment;
struct Object;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* utility conversion function */
bool ConvertPythonToGameObject(PyObject * value, KX_GameObject **object, bool py_none_ok, const char *error_prefix);
#endif
@@ -116,7 +121,7 @@ public:
*/
static KX_GameObject* GetClientObject(KX_ClientObjectInfo* info);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Python attributes that wont convert into CValue
//
// there are 2 places attributes can be stored, in the CValue,
@@ -796,7 +801,7 @@ public:
CListValue* GetChildren();
CListValue* GetChildrenRecursive();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/**
* @section Python interface functions.
*/
@@ -856,6 +861,7 @@ public:
static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static PyObject* pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_lin_vel_min(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
diff --git a/source/gameengine/Ketsji/KX_IInterpolator.h b/source/gameengine/Ketsji/KX_IInterpolator.h
index aadc964fe49..8eb62f84883 100644
--- a/source/gameengine/Ketsji/KX_IInterpolator.h
+++ b/source/gameengine/Ketsji/KX_IInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_IInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_IINTERPOLATOR_H
#define KX_IINTERPOLATOR_H
diff --git a/source/gameengine/Ketsji/KX_IPOTransform.h b/source/gameengine/Ketsji/KX_IPOTransform.h
index ba2adfe2ef6..98eefa83e0d 100644
--- a/source/gameengine/Ketsji/KX_IPOTransform.h
+++ b/source/gameengine/Ketsji/KX_IPOTransform.h
@@ -1,6 +1,4 @@
-/**
- * An abstract object you can move around in a 3d world, and has some logic
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_IPOTransform.h
+ * \ingroup ketsji
+ * \brief An abstract object you can move around in a 3d world, and has some logic
+ */
+
#ifndef KX_IPOTRANSFORM_H
#define KX_IPOTRANSFORM_H
diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.cpp b/source/gameengine/Ketsji/KX_IPO_SGController.cpp
index 1d4c64483f5..3c73bb6a619 100644
--- a/source/gameengine/Ketsji/KX_IPO_SGController.cpp
+++ b/source/gameengine/Ketsji/KX_IPO_SGController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,13 +28,18 @@
* Scenegraph controller for ipos.
*/
+/** \file gameengine/Ketsji/KX_IPO_SGController.cpp
+ * \ingroup ketsji
+ */
+
+
#if defined(_WIN64)
typedef unsigned __int64 uint_ptr;
#else
typedef unsigned long uint_ptr;
#endif
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
diff --git a/source/gameengine/Ketsji/KX_IPO_SGController.h b/source/gameengine/Ketsji/KX_IPO_SGController.h
index 12803cde2f1..3d52eaea679 100644
--- a/source/gameengine/Ketsji/KX_IPO_SGController.h
+++ b/source/gameengine/Ketsji/KX_IPO_SGController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_IPO_SGController.h
+ * \ingroup ketsji
+ */
+
#ifndef __IPO_SGCONTROLLER_H
#define __IPO_SGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.cpp b/source/gameengine/Ketsji/KX_IPhysicsController.cpp
index 18816e92bbb..4595fa22310 100644
--- a/source/gameengine/Ketsji/KX_IPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_IPhysicsController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* @file KX_IPhysicsController.cpp
* $Id$
*
@@ -27,6 +27,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_IPhysicsController.cpp
+ * \ingroup ketsji
+ */
+
#include "KX_IPhysicsController.h"
#include "PHY_DynamicTypes.h"
diff --git a/source/gameengine/Ketsji/KX_IPhysicsController.h b/source/gameengine/Ketsji/KX_IPhysicsController.h
index 288e779fee4..8bc28aa82b8 100644
--- a/source/gameengine/Ketsji/KX_IPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_IPhysicsController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_IPhysicsController.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_IPHYSICSCONTROLLER_H
#define __KX_IPHYSICSCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_IScalarInterpolator.h b/source/gameengine/Ketsji/KX_IScalarInterpolator.h
index a84e1b570fd..46781557a01 100644
--- a/source/gameengine/Ketsji/KX_IScalarInterpolator.h
+++ b/source/gameengine/Ketsji/KX_IScalarInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_IScalarInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_ISCALARINTERPOLATOR_H
#define KX_ISCALARINTERPOLATOR_H
diff --git a/source/gameengine/Ketsji/KX_ISceneConverter.h b/source/gameengine/Ketsji/KX_ISceneConverter.h
index 8a11b875347..7d85e69ecdd 100644
--- a/source/gameengine/Ketsji/KX_ISceneConverter.h
+++ b/source/gameengine/Ketsji/KX_ISceneConverter.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ISceneConverter.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_ISCENECONVERTER_H
#define __KX_ISCENECONVERTER_H
diff --git a/source/gameengine/Ketsji/KX_ISystem.h b/source/gameengine/Ketsji/KX_ISystem.h
index fb019299135..da79bec51d5 100644
--- a/source/gameengine/Ketsji/KX_ISystem.h
+++ b/source/gameengine/Ketsji/KX_ISystem.h
@@ -1,6 +1,4 @@
-/**
-* Abstract system
-*
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_ISystem.h
+ * \ingroup ketsji
+ * \brief Abstract system
+ */
+
#ifndef __KX_ISYSTEM
#define __KX_ISYSTEM
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index eca40cafb0e..aed6c666404 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Do Ipo stuff
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_IpoActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#if defined (__sgi)
#include <math.h>
#else
@@ -81,7 +86,7 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj,
m_ipo_local(ipo_local),
m_type(acttype)
{
- m_starttime = -2.0*fabs(m_endframe - m_startframe) - 1.0;
+ this->ResetStartTime();
m_bIpoPlaying = false;
}
@@ -176,7 +181,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
bool result=true;
if (!bNegativeEvent)
{
- if (m_starttime < -2.0f*start_smaller_then_end*(m_endframe - m_startframe))
+ if (m_starttime < -2.0f*fabs(m_endframe - m_startframe))
{
// start for all Ipo, initial start for LOOP_STOP
m_starttime = curtime;
@@ -371,13 +376,18 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
if (!result)
{
if (m_type != KX_ACT_IPO_LOOPSTOP)
- m_starttime = -2.0*start_smaller_then_end*(m_endframe - m_startframe) - 1.0;
+ this->ResetStartTime();
m_bIpoPlaying = false;
}
return result;
}
+void KX_IpoActuator::ResetStartTime()
+{
+ this->m_starttime = -2.0*fabs(this->m_endframe - this->m_startframe) - 1.0;
+}
+
int KX_IpoActuator::string2mode(char* modename) {
IpoActType res = KX_ACT_IPO_NODEF;
@@ -400,7 +410,7 @@ int KX_IpoActuator::string2mode(char* modename) {
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -435,8 +445,8 @@ PyMethodDef KX_IpoActuator::Methods[] = {
};
PyAttributeDef KX_IpoActuator::Attributes[] = {
- KX_PYATTRIBUTE_FLOAT_RW("frameStart", 0, 300000, KX_IpoActuator, m_startframe),
- KX_PYATTRIBUTE_FLOAT_RW("frameEnd", 0, 300000, KX_IpoActuator, m_endframe),
+ KX_PYATTRIBUTE_RW_FUNCTION("frameStart", KX_IpoActuator, pyattr_get_frame_start, pyattr_set_frame_start),
+ KX_PYATTRIBUTE_RW_FUNCTION("frameEnd", KX_IpoActuator, pyattr_get_frame_end, pyattr_set_frame_end),
KX_PYATTRIBUTE_STRING_RW("propName", 0, 64, false, KX_IpoActuator, m_propname),
KX_PYATTRIBUTE_STRING_RW("framePropName", 0, 64, false, KX_IpoActuator, m_framepropname),
KX_PYATTRIBUTE_INT_RW("mode", KX_ACT_IPO_NODEF+1, KX_ACT_IPO_MAX-1, true, KX_IpoActuator, m_type),
@@ -448,6 +458,48 @@ PyAttributeDef KX_IpoActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+PyObject* KX_IpoActuator::pyattr_get_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ return PyFloat_FromDouble(self->m_startframe);
+}
+
+int KX_IpoActuator::pyattr_set_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ float param = PyFloat_AsDouble(value);
+
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "frameStart = float: KX_IpoActuator, expected a float value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ self->m_startframe = param;
+ self->ResetStartTime();
+ return PY_SET_ATTR_SUCCESS;
+}
+
+PyObject* KX_IpoActuator::pyattr_get_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ return PyFloat_FromDouble(self->m_endframe);
+}
+
+int KX_IpoActuator::pyattr_set_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_IpoActuator* self= static_cast<KX_IpoActuator*>(self_v);
+ float param = PyFloat_AsDouble(value);
+
+ if (PyErr_Occurred()) {
+ PyErr_SetString(PyExc_AttributeError, "frameEnd = float: KX_IpoActuator, expected a float value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ self->m_endframe = param;
+ self->ResetStartTime();
+ return PY_SET_ATTR_SUCCESS;
+}
+
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h
index cefd00c4ae3..56a60f48049 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.h
+++ b/source/gameengine/Ketsji/KX_IpoActuator.h
@@ -1,6 +1,4 @@
-/**
- * Do an object ipo
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_IpoActuator.h
+ * \ingroup ketsji
+ * \brief Do an object ipo
+ */
+
#ifndef __KX_IPOACTUATOR
#define __KX_IPOACTUATOR
@@ -86,6 +89,9 @@ protected:
bool m_bIpoPlaying;
+ /** Reset/Update the start time*/
+ void ResetStartTime();
+
public:
enum IpoActType
{
@@ -100,6 +106,12 @@ public:
KX_ACT_IPO_MAX
};
+#ifdef WITH_PYTHON
+ static PyObject* pyattr_get_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_frame_start(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+ static PyObject* pyattr_get_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_frame_end(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
+#endif
static const char *S_KX_ACT_IPO_PLAY_STRING;
static const char *S_KX_ACT_IPO_PINGPONG_STRING;
static const char *S_KX_ACT_IPO_FLIPPER_STRING;
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 1a6ae69f792..88e178dda19 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -28,7 +28,12 @@
* The engine ties all game modules together.
*/
-#ifdef WIN32
+/** \file gameengine/Ketsji/KX_KetsjiEngine.cpp
+ * \ingroup ketsji
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -55,6 +60,7 @@
#include "KX_Scene.h"
#include "MT_CmMatrix4x4.h"
#include "KX_Camera.h"
+#include "KX_FontObject.h"
#include "KX_Dome.h"
#include "KX_Light.h"
#include "KX_PythonInit.h"
@@ -112,7 +118,7 @@ KX_KetsjiEngine::KX_KetsjiEngine(KX_ISystem* system)
m_rendertools(NULL),
m_sceneconverter(NULL),
m_networkdevice(NULL),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pythondictionary(NULL),
#endif
m_keyboarddevice(NULL),
@@ -233,7 +239,7 @@ void KX_KetsjiEngine::SetRasterizer(RAS_IRasterizer* rasterizer)
m_rasterizer = rasterizer;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/*
* At the moment the bge.logic module is imported into 'pythondictionary' after this function is called.
* if this function ever changes to assign a copy, make sure the game logic module is imported into this dictionary before hand.
@@ -370,7 +376,7 @@ void KX_KetsjiEngine::RenderDome()
}
m_dome->Draw();
// Draw Callback for the last scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
scene->RunDrawingCallbacks(scene->GetPostDrawCB());
#endif
EndFrame();
@@ -612,7 +618,7 @@ else
m_logger->StartLog(tc_physics, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_PHYSICS1);
// set Python hooks for each scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
#endif
KX_SetActiveScene(scene);
@@ -716,7 +722,7 @@ else
m_suspendeddelta = scene->getSuspendedDelta();
// set Python hooks for each scene
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
#endif
KX_SetActiveScene(scene);
@@ -946,6 +952,14 @@ int KX_KetsjiEngine::GetExitCode()
if (m_scenes.begin()==m_scenes.end())
m_exitcode = KX_EXIT_REQUEST_NO_SCENES_LEFT;
}
+
+ // check if the window has been closed.
+ if(!m_exitcode)
+ {
+ //if(!m_canvas->Check()) {
+ // m_exitcode = KX_EXIT_REQUEST_OUTSIDE;
+ //}
+ }
return m_exitcode;
}
@@ -1287,16 +1301,32 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true);
SG_SetActiveStage(SG_STAGE_RENDER);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// Run any pre-drawing python callbacks
scene->RunDrawingCallbacks(scene->GetPreDrawCB());
#endif
scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ //render all the font objects for this scene
+ RenderFonts(scene);
if (scene->GetPhysicsEnvironment())
scene->GetPhysicsEnvironment()->debugDrawWorld();
}
+
+void KX_KetsjiEngine::RenderFonts(KX_Scene* scene)
+{
+ list<class KX_FontObject*>* fonts = scene->GetFonts();
+
+ list<KX_FontObject*>::iterator it = fonts->begin();
+ while(it != fonts->end())
+ {
+ (*it)->DrawText();
+ ++it;
+ }
+}
+
/*
To run once per scene
*/
@@ -1304,7 +1334,7 @@ void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene)
{
m_rendertools->MotionBlur(m_rasterizer);
scene->Render2DFilters(m_canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
scene->RunDrawingCallbacks(scene->GetPostDrawCB());
#endif
m_rasterizer->FlushDebugLines();
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index f52ec8192cc..8cd6fdb8f5f 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+
+/** \file KX_KetsjiEngine.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_KETSJI_ENGINE
#define __KX_KETSJI_ENGINE
@@ -70,7 +75,7 @@ private:
class RAS_IRenderTools* m_rendertools;
class KX_ISceneConverter* m_sceneconverter;
class NG_NetworkDeviceInterface* m_networkdevice;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* borrowed from sys.modules["__main__"], dont manage ref's */
PyObject* m_pythondictionary;
#endif
@@ -191,6 +196,7 @@ private:
void RenderShadowBuffers(KX_Scene *scene);
void SetBackGround(KX_WorldInfo* worldinfo);
void DoSound(KX_Scene* scene);
+ void RenderFonts(KX_Scene* scene);
public:
KX_KetsjiEngine(class KX_ISystem* system);
@@ -204,7 +210,7 @@ public:
void SetCanvas(RAS_ICanvas* canvas);
void SetRenderTools(RAS_IRenderTools* rendertools);
void SetRasterizer(RAS_IRasterizer* rasterizer);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void SetPyNamespace(PyObject* pythondictionary);
PyObject* GetPyNamespace(){return m_pythondictionary;};
#endif
diff --git a/source/gameengine/Ketsji/KX_Light.cpp b/source/gameengine/Ketsji/KX_Light.cpp
index ac20b4f2f56..49f00e39110 100644
--- a/source/gameengine/Ketsji/KX_Light.cpp
+++ b/source/gameengine/Ketsji/KX_Light.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,8 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Ketsji/KX_Light.cpp
+ * \ingroup ketsji
+ */
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif
@@ -181,7 +185,7 @@ GPULamp *KX_LightObject::GetGPULamp()
if(m_glsl)
return GPU_lamp_from_blender(m_blenderscene, GetBlenderObject(), GetBlenderGroupObject());
else
- return false;
+ return NULL;
}
void KX_LightObject::Update()
@@ -260,7 +264,7 @@ void KX_LightObject::UnbindShadowBuffer(RAS_IRasterizer *ras)
GPU_lamp_shadow_buffer_unbind(lamp);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
/* ------------------------------------------------------------------------- */
@@ -302,7 +306,6 @@ PyAttributeDef KX_LightObject::Attributes[] = {
KX_PYATTRIBUTE_FLOAT_RW("energy", 0, 10, KX_LightObject, m_lightobj.m_energy),
KX_PYATTRIBUTE_FLOAT_RW("distance", 0.01, 5000, KX_LightObject, m_lightobj.m_distance),
KX_PYATTRIBUTE_RW_FUNCTION("color", KX_LightObject, pyattr_get_color, pyattr_set_color),
- KX_PYATTRIBUTE_RW_FUNCTION("colour", KX_LightObject, pyattr_get_color, pyattr_set_color),
KX_PYATTRIBUTE_FLOAT_RW("lin_attenuation", 0, 1, KX_LightObject, m_lightobj.m_att1),
KX_PYATTRIBUTE_FLOAT_RW("quad_attenuation", 0, 1, KX_LightObject, m_lightobj.m_att2),
KX_PYATTRIBUTE_FLOAT_RW("spotsize", 1, 180, KX_LightObject, m_lightobj.m_spotsize),
@@ -386,4 +389,4 @@ int KX_LightObject::pyattr_set_type(void* self_v, const KX_PYATTRIBUTE_DEF *attr
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_Light.h b/source/gameengine/Ketsji/KX_Light.h
index 334aed1995d..08e4e9da2e5 100644
--- a/source/gameengine/Ketsji/KX_Light.h
+++ b/source/gameengine/Ketsji/KX_Light.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_Light.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_LIGHT
#define __KX_LIGHT
@@ -69,7 +74,7 @@ public:
virtual int GetGameObjectType() { return OBJ_LIGHT; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* attributes */
static PyObject* pyattr_get_color(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_color(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject* value);
diff --git a/source/gameengine/Ketsji/KX_LightIpoSGController.cpp b/source/gameengine/Ketsji/KX_LightIpoSGController.cpp
index 3a010556cfe..8ffaf3e0e63 100644
--- a/source/gameengine/Ketsji/KX_LightIpoSGController.cpp
+++ b/source/gameengine/Ketsji/KX_LightIpoSGController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_LightIpoSGController.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_LightIpoSGController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_Light.h"
diff --git a/source/gameengine/Ketsji/KX_LightIpoSGController.h b/source/gameengine/Ketsji/KX_LightIpoSGController.h
index c857994d145..8271343907c 100644
--- a/source/gameengine/Ketsji/KX_LightIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_LightIpoSGController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_LightIpoSGController.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_LIGHTIPOSGCONTROLLER_H
#define KX_LIGHTIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_MaterialIpoController.cpp b/source/gameengine/Ketsji/KX_MaterialIpoController.cpp
index 13d272ee92d..9a19cb08fad 100644
--- a/source/gameengine/Ketsji/KX_MaterialIpoController.cpp
+++ b/source/gameengine/Ketsji/KX_MaterialIpoController.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_MaterialIpoController.cpp
+ * \ingroup ketsji
+ */
#include "KX_MaterialIpoController.h"
#include "KX_ScalarInterpolator.h"
diff --git a/source/gameengine/Ketsji/KX_MaterialIpoController.h b/source/gameengine/Ketsji/KX_MaterialIpoController.h
index a979f59ec95..85b2a971fbe 100644
--- a/source/gameengine/Ketsji/KX_MaterialIpoController.h
+++ b/source/gameengine/Ketsji/KX_MaterialIpoController.h
@@ -1,3 +1,8 @@
+
+/** \file KX_MaterialIpoController.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_MATERIALIPOCONTROLLER_H__
#define __KX_MATERIALIPOCONTROLLER_H__
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.cpp b/source/gameengine/Ketsji/KX_MeshProxy.cpp
index a5ff7ebcbc1..ba41dc355f7 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.cpp
+++ b/source/gameengine/Ketsji/KX_MeshProxy.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+/** \file gameengine/Ketsji/KX_MeshProxy.cpp
+ * \ingroup ketsji
+ */
+
+
+#ifdef WITH_PYTHON
#include "KX_MeshProxy.h"
#include "RAS_IPolygonMaterial.h"
@@ -181,7 +186,7 @@ PyObject* KX_MeshProxy::PyGetVertex(PyObject* args, PyObject* kwds)
RAS_TexVert* vertex = m_meshobj->GetVertex(matindex,vertexindex);
if(vertex==NULL) {
- PyErr_SetString(PyExc_ValueError, "mesh.getVertex(mat_idx, vert_idx): KX_MeshProxy, could not get a vertex at the given indicies");
+ PyErr_SetString(PyExc_ValueError, "mesh.getVertex(mat_idx, vert_idx): KX_MeshProxy, could not get a vertex at the given indices");
return NULL;
}
@@ -308,4 +313,4 @@ bool ConvertPythonToMesh(PyObject * value, RAS_MeshObject **object, bool py_none
return false;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_MeshProxy.h b/source/gameengine/Ketsji/KX_MeshProxy.h
index 7b627040b4c..7074c120988 100644
--- a/source/gameengine/Ketsji/KX_MeshProxy.h
+++ b/source/gameengine/Ketsji/KX_MeshProxy.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_MeshProxy.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_MESHPROXY
#define __KX_MESHPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -74,7 +79,7 @@ public:
static PyObject * pyattr_get_numPolygons(void * self, const KX_PYATTRIBUTE_DEF * attrdef);
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_MESHPROXY
diff --git a/source/gameengine/Ketsji/KX_MotionState.cpp b/source/gameengine/Ketsji/KX_MotionState.cpp
index 08f8ee556d1..db98097a3ce 100644
--- a/source/gameengine/Ketsji/KX_MotionState.cpp
+++ b/source/gameengine/Ketsji/KX_MotionState.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_MotionState.cpp
+ * \ingroup ketsji
+ */
+
#include "KX_MotionState.h"
#include "SG_Spatial.h"
diff --git a/source/gameengine/Ketsji/KX_MotionState.h b/source/gameengine/Ketsji/KX_MotionState.h
index 1267abc7fa9..ec6469e4672 100644
--- a/source/gameengine/Ketsji/KX_MotionState.h
+++ b/source/gameengine/Ketsji/KX_MotionState.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_MotionState.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_MOTIONSTATE
#define __KX_MOTIONSTATE
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
index 63771ae08dc..6cb80028858 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,7 +28,12 @@
* KX_MouseFocusSensor determines mouse in/out/over events.
*/
-#ifdef WIN32
+/** \file gameengine/Ketsji/KX_MouseFocusSensor.cpp
+ * \ingroup ketsji
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// This warning tells us about truncation of __long__ stl-generated names.
// It can occasionally cause DevStudio to have internal compiler warnings.
#pragma warning( disable : 4786 )
@@ -347,7 +352,7 @@ const MT_Vector2& KX_MouseFocusSensor::HitUV() const
return m_hitUV;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -442,7 +447,7 @@ PyObject* KX_MouseFocusSensor::pyattr_get_hit_uv(void *self_v, const KX_PYATTRIB
return PyObjectFrom(self->HitUV());
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.h b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
index c969aa3ec74..73c5d94e4a5 100644
--- a/source/gameengine/Ketsji/KX_MouseFocusSensor.h
+++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * KX_MouseFocusSensor determines mouse in/out/over events.
+ */
+
+/** \file KX_MouseFocusSensor.h
+ * \ingroup ketsji
+ * \brief KX_MouseFocusSensor determines mouse in/out/over events.
*/
#ifndef __KX_MOUSEFOCUSSENSOR
@@ -94,7 +98,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
const MT_Vector3& HitNormal() const;
const MT_Vector2& HitUV() const;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -109,7 +113,7 @@ class KX_MouseFocusSensor : public SCA_MouseSensor
static PyObject* pyattr_get_hit_normal(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_hit_uv(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* --------------------------------------------------------------------- */
SCA_IObject* m_hitObject;
diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp
index 36c1b0f5bd1..913a1adac55 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.cpp
+++ b/source/gameengine/Ketsji/KX_NearSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Sense if other objects are near
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_NearSensor.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_NearSensor.h"
#include "SCA_LogicManager.h"
#include "KX_GameObject.h"
@@ -242,7 +247,7 @@ bool KX_NearSensor::NewHandleCollision(void* obj1,void* obj2,const PHY_CollData
return false; // was DT_CONTINUE; but this was defined in Sumo as false
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Functions */
@@ -285,4 +290,4 @@ PyAttributeDef KX_NearSensor::Attributes[] = {
{NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h
index 10dba22c4e9..d3de44429ff 100644
--- a/source/gameengine/Ketsji/KX_NearSensor.h
+++ b/source/gameengine/Ketsji/KX_NearSensor.h
@@ -1,6 +1,4 @@
-/**
- * Sense if other objects are near
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_NearSensor.h
+ * \ingroup ketsji
+ * \brief Sense if other objects are near
+ */
+
#ifndef KX_NEARSENSOR_H
#define KX_NEARSENSOR_H
@@ -78,7 +81,7 @@ public:
virtual bool BroadPhaseSensorFilterCollision(void*obj1,void*obj2) { return false; };
virtual sensortype GetSensorType() { return ST_NEAR; }
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -99,7 +102,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp b/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp
index 108cff0232d..0fc410f9d6f 100644
--- a/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp
+++ b/source/gameengine/Ketsji/KX_ObColorIpoSGController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ObColorIpoSGController.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_ObColorIpoSGController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_GameObject.h"
diff --git a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
index 4bb18fb392b..67bf561bd22 100644
--- a/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
+++ b/source/gameengine/Ketsji/KX_ObColorIpoSGController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ObColorIpoSGController.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_OBCOLORIPOSGCONTROLLER_H
#define KX_OBCOLORIPOSGCONTROLLER_H
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 0d0cac3c084..83d8f4b883b 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Do translation/rotation actions
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ObjectActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_ObjectActuator.h"
#include "KX_GameObject.h"
#include "KX_PyMath.h" // For PyVecTo - should this include be put in PyObjectPlus?
@@ -313,7 +318,7 @@ bool KX_ObjectActuator::isValid(KX_ObjectActuator::KX_OBJECT_ACT_VEC_TYPE type)
return res;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -636,6 +641,6 @@ int KX_ObjectActuator::pyattr_set_reference(void *self, const struct KX_PYATTRIB
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.h b/source/gameengine/Ketsji/KX_ObjectActuator.h
index b12cf77d3e1..e45ce899bfc 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.h
@@ -1,6 +1,4 @@
-/**
- * Do translation/rotation actions
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_ObjectActuator.h
+ * \ingroup ketsji
+ * \brief Do translation/rotation actions
+ */
+
#ifndef __KX_OBJECTACTUATOR
#define __KX_OBJECTACTUATOR
@@ -157,7 +160,7 @@ public:
}
virtual bool Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -217,7 +220,7 @@ public:
return 0;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
index 8949a85066c..d9483083aa1 100644
--- a/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
+++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_OrientationInterpolator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_OrientationInterpolator.h"
#include "MT_Matrix3x3.h"
#include "KX_IScalarInterpolator.h"
diff --git a/source/gameengine/Ketsji/KX_OrientationInterpolator.h b/source/gameengine/Ketsji/KX_OrientationInterpolator.h
index de41323c289..2ae7b00cb86 100644
--- a/source/gameengine/Ketsji/KX_OrientationInterpolator.h
+++ b/source/gameengine/Ketsji/KX_OrientationInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_OrientationInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_ORIENTATIONINTERPOLATOR
#define KX_ORIENTATIONINTERPOLATOR
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.cpp b/source/gameengine/Ketsji/KX_ParentActuator.cpp
index 62740585831..6ff1c05b994 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ParentActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Set or remove an objects parent
*
* $Id$
@@ -32,6 +32,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ParentActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_ParentActuator.h"
#include "KX_GameObject.h"
#include "KX_PythonInit.h"
@@ -130,7 +135,7 @@ bool KX_ParentActuator::Update()
return false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -199,6 +204,6 @@ int KX_ParentActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUTE
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_ParentActuator.h b/source/gameengine/Ketsji/KX_ParentActuator.h
index 884b1829ae3..8723f83920e 100644
--- a/source/gameengine/Ketsji/KX_ParentActuator.h
+++ b/source/gameengine/Ketsji/KX_ParentActuator.h
@@ -1,7 +1,4 @@
-/**
- * Set or remove an objects parent
- *
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -33,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_ParentActuator.h
+ * \ingroup ketsji
+ * \brief Set or remove an objects parent
+ */
+
#ifndef __KX_PARENTACTUATOR
#define __KX_PARENTACTUATOR
@@ -77,7 +79,7 @@ class KX_ParentActuator : public SCA_IActuator
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
virtual bool UnlinkObject(SCA_IObject* clientobj);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -87,7 +89,7 @@ class KX_ParentActuator : public SCA_IActuator
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_ParentActuator : public SCA_PropertyActuator */
diff --git a/source/gameengine/Ketsji/KX_PhysicsEngineEnums.h b/source/gameengine/Ketsji/KX_PhysicsEngineEnums.h
index 506ba6365a0..6a9e40e187a 100644
--- a/source/gameengine/Ketsji/KX_PhysicsEngineEnums.h
+++ b/source/gameengine/Ketsji/KX_PhysicsEngineEnums.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PhysicsEngineEnums.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_PHYSICSENGINEENUMS
#define __KX_PHYSICSENGINEENUMS
diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
index 15fc3e5c471..ad1ea7c1bda 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_PhysicsObjectWrapper.cpp
+ * \ingroup ketsji
+ */
+
+
#include "PyObjectPlus.h"
#include "KX_PhysicsObjectWrapper.h"
@@ -46,7 +51,7 @@ KX_PhysicsObjectWrapper::~KX_PhysicsObjectWrapper()
{
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_PhysicsObjectWrapper::PySetPosition(PyObject* args)
{
diff --git a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
index 01980c0f644..739d6b38ea1 100644
--- a/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
+++ b/source/gameengine/Ketsji/KX_PhysicsObjectWrapper.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PhysicsObjectWrapper.h
+ * \ingroup ketsji
+ */
+
#ifndef PHYP_PHYSICSOBJECT_WRAPPER
#define PHYP_PHYSICSOBJECT_WRAPPER
@@ -39,14 +44,14 @@ public:
KX_PhysicsObjectWrapper(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsEnvironment* physenv);
virtual ~KX_PhysicsObjectWrapper();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetPosition);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetLinearVelocity);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetAngularVelocity);
KX_PYMETHOD_VARARGS(KX_PhysicsObjectWrapper,SetActive);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
class PHY_IPhysicsController* m_ctrl;
diff --git a/source/gameengine/Ketsji/KX_PhysicsPropertiesobsolete.h b/source/gameengine/Ketsji/KX_PhysicsPropertiesobsolete.h
index d94b5328488..4cbd1f8b3b2 100644
--- a/source/gameengine/Ketsji/KX_PhysicsPropertiesobsolete.h
+++ b/source/gameengine/Ketsji/KX_PhysicsPropertiesobsolete.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,12 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PhysicsPropertiesobsolete.h
+ * \ingroup ketsji
+ * \todo check if this file is still needed
+ */
+
#ifndef KX_PROPSH
#define KX_PROPSH
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.cpp b/source/gameengine/Ketsji/KX_PolyProxy.cpp
index 9395e57e68b..8c3b2a993e2 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.cpp
+++ b/source/gameengine/Ketsji/KX_PolyProxy.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+/** \file gameengine/Ketsji/KX_PolyProxy.cpp
+ * \ingroup ketsji
+ */
+
+
+#ifdef WITH_PYTHON
#include "KX_PolyProxy.h"
#include "KX_MeshProxy.h"
@@ -267,4 +272,4 @@ KX_PYMETHODDEF_DOC_NOARGS(KX_PolyProxy, getMaterial,
}
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PolyProxy.h b/source/gameengine/Ketsji/KX_PolyProxy.h
index 3e669630e30..c99ac20673c 100644
--- a/source/gameengine/Ketsji/KX_PolyProxy.h
+++ b/source/gameengine/Ketsji/KX_PolyProxy.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PolyProxy.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_POLYROXY
#define __KX_POLYPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -77,7 +82,7 @@ public:
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_POLYPROXY
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index 63204b16e8b..dfaf079f36f 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,6 +25,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_PolygonMaterial.cpp
+ * \ingroup ketsji
+ */
+
+
+#include <stddef.h>
+
#include "KX_PolygonMaterial.h"
#include "BKE_mesh.h"
@@ -47,6 +55,8 @@
#include "KX_PyMath.h"
+#define KX_POLYGONMATERIAL_CAPSULE_ID "KX_POLYGONMATERIAL_PTR"
+
KX_PolygonMaterial::KX_PolygonMaterial()
: PyObjectPlus(),
RAS_IPolyMaterial(),
@@ -54,7 +64,7 @@ KX_PolygonMaterial::KX_PolygonMaterial()
m_tface(NULL),
m_mcol(NULL),
m_material(NULL),
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pymaterial(NULL),
#endif
m_pass(0)
@@ -90,7 +100,7 @@ void KX_PolygonMaterial::Initialize(
m_tface = tface;
m_mcol = mcol;
m_material = ma;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_pymaterial = 0;
#endif
m_pass = 0;
@@ -98,23 +108,28 @@ void KX_PolygonMaterial::Initialize(
KX_PolygonMaterial::~KX_PolygonMaterial()
{
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_pymaterial)
{
Py_DECREF(m_pymaterial);
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
+}
+
+Image *KX_PolygonMaterial::GetBlenderImage() const
+{
+ return (m_tface) ? m_tface->tpage : NULL;
}
bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingInfo) const
{
bool dopass = false;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
if (m_pymaterial)
{
- PyObject *pyRasty = PyCObject_FromVoidPtr((void*)rasty, NULL); /* new reference */
- PyObject *pyCachingInfo = PyCObject_FromVoidPtr((void*) &cachingInfo, NULL); /* new reference */
+ PyObject *pyRasty = PyCapsule_New((void*)rasty, KX_POLYGONMATERIAL_CAPSULE_ID, NULL); /* new reference */
+ PyObject *pyCachingInfo = PyCapsule_New((void*) &cachingInfo, KX_POLYGONMATERIAL_CAPSULE_ID, NULL); /* new reference */
PyObject *ret = PyObject_CallMethod(m_pymaterial, (char *)"activate", (char *)"(NNO)", pyRasty, pyCachingInfo, (PyObject*) this->m_proxy);
if (ret)
{
@@ -130,7 +145,7 @@ bool KX_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cachingI
}
}
else
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
{
switch (m_pass++)
{
@@ -201,7 +216,7 @@ void KX_PolygonMaterial::GetMaterialRGBAColor(unsigned char *rgba) const
RAS_IPolyMaterial::GetMaterialRGBAColor(rgba);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
//----------------------------------------------------------------------------
//Python
@@ -284,10 +299,10 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setCustomMaterial, "setCustomMaterial(mat
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rasty)")
{
PyObject *pyrasty, *pytface;
- if (PyArg_ParseTuple(args, "O!O!:updateTexture", &PyCObject_Type, &pytface, &PyCObject_Type, &pyrasty))
+ if (PyArg_ParseTuple(args, "O!O!:updateTexture", &PyCapsule_Type, &pytface, &PyCapsule_Type, &pyrasty))
{
- MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
- RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCObject_AsVoidPtr(pyrasty);
+ MTFace *tface = (MTFace*) PyCapsule_GetPointer(pytface, KX_POLYGONMATERIAL_CAPSULE_ID);
+ RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCapsule_GetPointer(pyrasty, KX_POLYGONMATERIAL_CAPSULE_ID);
Image *ima = (Image*)tface->tpage;
GPU_update_image_time(ima, rasty->GetTime());
@@ -300,9 +315,9 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rast
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
{
PyObject *pytface;
- if (PyArg_ParseTuple(args, "O!:setTexture", &PyCObject_Type, &pytface))
+ if (PyArg_ParseTuple(args, "O!:setTexture", &PyCapsule_Type, &pytface))
{
- MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
+ MTFace *tface = (MTFace*) PyCapsule_GetPointer(pytface, KX_POLYGONMATERIAL_CAPSULE_ID);
GPU_set_tpage(tface, 1);
Py_RETURN_NONE;
}
@@ -313,10 +328,10 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
KX_PYMETHODDEF_DOC(KX_PolygonMaterial, activate, "activate(rasty, cachingInfo)")
{
PyObject *pyrasty, *pyCachingInfo;
- if (PyArg_ParseTuple(args, "O!O!:activate", &PyCObject_Type, &pyrasty, &PyCObject_Type, &pyCachingInfo))
+ if (PyArg_ParseTuple(args, "O!O!:activate", &PyCapsule_Type, &pyrasty, &PyCapsule_Type, &pyCachingInfo))
{
- RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCObject_AsVoidPtr(pyrasty));
- TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCObject_AsVoidPtr(pyCachingInfo));
+ RAS_IRasterizer *rasty = static_cast<RAS_IRasterizer*>(PyCapsule_GetPointer(pyrasty, KX_POLYGONMATERIAL_CAPSULE_ID));
+ TCachingInfo *cachingInfo = static_cast<TCachingInfo*>(PyCapsule_GetPointer(pyCachingInfo, KX_POLYGONMATERIAL_CAPSULE_ID));
if (rasty && cachingInfo)
{
DefaultActivate(rasty, *cachingInfo);
@@ -343,7 +358,7 @@ PyObject* KX_PolygonMaterial::pyattr_get_material(void *self_v, const KX_PYATTRI
PyObject* KX_PolygonMaterial::pyattr_get_tface(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_PolygonMaterial* self= static_cast<KX_PolygonMaterial*>(self_v);
- return PyCObject_FromVoidPtr(self->m_tface, NULL);
+ return PyCapsule_New(self->m_tface, KX_POLYGONMATERIAL_CAPSULE_ID, NULL);
}
PyObject* KX_PolygonMaterial::pyattr_get_gl_texture(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
@@ -393,4 +408,4 @@ int KX_PolygonMaterial::pyattr_set_specular(void *self_v, const KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.h b/source/gameengine/Ketsji/KX_PolygonMaterial.h
index 03b4bf11a18..3520995def3 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.h
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PolygonMaterial.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_POLYGONMATERIAL_H__
#define __KX_POLYGONMATERIAL_H__
@@ -42,6 +47,7 @@
struct MTFace;
struct Material;
struct MTex;
+struct Image;
/**
* Material class.
@@ -58,7 +64,7 @@ private:
unsigned int* m_mcol;
Material* m_material;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_pymaterial;
#endif
@@ -107,6 +113,8 @@ public:
return m_material;
}
+ Image *GetBlenderImage() const;
+
/**
* Returns the Blender texture face structure that is used for this material.
* @return The material's texture face.
@@ -122,7 +130,7 @@ public:
}
virtual void GetMaterialRGBAColor(unsigned char *rgba) const;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC(KX_PolygonMaterial, updateTexture);
KX_PYMETHOD_DOC(KX_PolygonMaterial, setTexture);
KX_PYMETHOD_DOC(KX_PolygonMaterial, activate);
diff --git a/source/gameengine/Ketsji/KX_PositionInterpolator.cpp b/source/gameengine/Ketsji/KX_PositionInterpolator.cpp
index 6e047180cdf..8cd6a6dc2c1 100644
--- a/source/gameengine/Ketsji/KX_PositionInterpolator.cpp
+++ b/source/gameengine/Ketsji/KX_PositionInterpolator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_PositionInterpolator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_PositionInterpolator.h"
#include "MT_Point3.h"
#include "KX_IScalarInterpolator.h"
diff --git a/source/gameengine/Ketsji/KX_PositionInterpolator.h b/source/gameengine/Ketsji/KX_PositionInterpolator.h
index 764c7bd8750..e053770e57e 100644
--- a/source/gameengine/Ketsji/KX_PositionInterpolator.h
+++ b/source/gameengine/Ketsji/KX_PositionInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PositionInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_POSITIONINTERPOLATOR
#define KX_POSITIONINTERPOLATOR
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index bbf8152bd68..f08fc14c29c 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_PyConstraintBinding.cpp
+ * \ingroup ketsji
+ */
+
#include "KX_PyConstraintBinding.h"
#include "PHY_IPhysicsEnvironment.h"
#include "KX_ConstraintWrapper.h"
@@ -37,7 +42,7 @@
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
// nasty glob variable to connect scripting language
// if there is a better way (without global), please do so!
@@ -659,5 +664,5 @@ PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment()
return g_CurrentActivePhysicsEnvironment;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.h b/source/gameengine/Ketsji/KX_PyConstraintBinding.h
index a1b3c3d6da3..9fbdf037caa 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.h
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PyConstraintBinding.h
+ * \ingroup ketsji
+ */
+
#ifndef PHY_PYTHON_CONSTRAINTBINDING
#define PHY_PYTHON_CONSTRAINTBINDING
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include <Python.h>
@@ -37,7 +42,7 @@ PyObject* initPythonConstraintBinding();
void PHY_RemovePythonConstraintBinding();
void PHY_SetActiveEnvironment(class PHY_IPhysicsEnvironment* env);
PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment();
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //PHY_PYTHON_CONSTRAINTBINDING
diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp
index 59d1c197cf3..857a61e56a0 100644
--- a/source/gameengine/Ketsji/KX_PyMath.cpp
+++ b/source/gameengine/Ketsji/KX_PyMath.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,11 +28,16 @@
* Initialize Python thingies.
*/
-#ifdef WIN32
+/** \file gameengine/Ketsji/KX_PyMath.cpp
+ * \ingroup ketsji
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "MT_Vector3.h"
#include "MT_Vector4.h"
@@ -190,4 +195,4 @@ PyObject* PyObjectFrom(const MT_Tuple2 &vec)
#endif
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index 9c9688f79cd..d7ea63c9880 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Initialize Python thingies.
+ */
+
+/** \file KX_PyMath.h
+ * \ingroup ketsji
+ * \brief Initialize Python thingies.
*/
#ifndef __KX_PYMATH_H__
@@ -42,7 +46,7 @@
#include "KX_Python.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#ifdef USE_MATHUTILS
extern "C" {
#include "../../blender/python/generic/mathutils.h" /* so we can have mathutils callbacks */
@@ -110,7 +114,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
if(VectorObject_Check(pyval)) {
VectorObject *pyvec= (VectorObject *)pyval;
- BaseMath_ReadCallback(pyvec);
+ if(!BaseMath_ReadCallback(pyvec)) {
+ return false; /* exception raised */
+ }
if (pyvec->size != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", pyvec->size, Size(vec));
return false;
@@ -120,7 +126,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(QuaternionObject_Check(pyval)) {
QuaternionObject *pyquat= (QuaternionObject *)pyval;
- BaseMath_ReadCallback(pyquat);
+ if(!BaseMath_ReadCallback(pyquat)) {
+ return false; /* exception raised */
+ }
if (4 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 4, Size(vec));
return false;
@@ -131,7 +139,9 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(EulerObject_Check(pyval)) {
EulerObject *pyeul= (EulerObject *)pyval;
- BaseMath_ReadCallback(pyeul);
+ if(!BaseMath_ReadCallback(pyeul)) {
+ return false; /* exception raised */
+ }
if (3 != Size(vec)) {
PyErr_Format(PyExc_AttributeError, "error setting vector, %d args, should be %d", 3, Size(vec));
return false;
@@ -239,4 +249,4 @@ PyObject* PyObjectFrom(const MT_Tuple4 &pos);
#endif
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index dcedade9bd6..9bb7fd0ecc2 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,25 +28,39 @@
* Initialize Python thingies.
*/
+/** \file gameengine/Ketsji/KX_PythonInit.cpp
+ * \ingroup ketsji
+ */
+
+
#include "GL/glew.h"
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
+
+#ifdef _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+
+#ifdef _XOPEN_SOURCE
+#undef _XOPEN_SOURCE
+#endif
+
+#include <Python.h>
extern "C" {
#include "bpy_internal_import.h" /* from the blender python api, but we want to import text too! */
+ #include "py_capi_utils.h"
#include "mathutils.h" // Blender.Mathutils module copied here so the blenderlayer can use.
- #include "geometry.h" // Blender.Geometry module copied here so the blenderlayer can use.
#include "bgl.h"
- #include "blf_api.h"
+ #include "blf_py_api.h"
#include "marshal.h" /* python header for loading/saving dicts */
}
-#define WITH_PYTHON
#include "AUD_PyInit.h"
#endif
@@ -129,18 +143,21 @@ extern "C" {
// 'local' copy of canvas ptr, for window height/width python scripts
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static RAS_ICanvas* gp_Canvas = NULL;
static char gp_GamePythonPath[FILE_MAXDIR + FILE_MAXFILE] = "";
static char gp_GamePythonPathOrig[FILE_MAXDIR + FILE_MAXFILE] = ""; // not super happy about this, but we need to remember the first loaded file for the global/dict load save
-#endif // DISABLE_PYTHON
+static SCA_PythonKeyboard* gp_PythonKeyboard = NULL;
+static SCA_PythonMouse* gp_PythonMouse = NULL;
+#endif // WITH_PYTHON
static KX_Scene* gp_KetsjiScene = NULL;
static KX_KetsjiEngine* gp_KetsjiEngine = NULL;
static RAS_IRasterizer* gp_Rasterizer = NULL;
+
void KX_SetActiveScene(class KX_Scene* scene)
{
gp_KetsjiScene = scene;
@@ -163,7 +180,7 @@ void KX_RasterizerDrawDebugLine(const MT_Vector3& from,const MT_Vector3& to,cons
gp_Rasterizer->DrawDebugLine(from,to,color);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
static PyObject *gp_OrigPythonSysPath= NULL;
static PyObject *gp_OrigPythonSysModules= NULL;
@@ -220,7 +237,7 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_path_abs(expanded, gp_GamePythonPath);
- return PyUnicode_FromString(expanded);
+ return PyUnicode_DecodeFSDefault(expanded);
}
static char gPyStartGame_doc[] =
@@ -486,7 +503,7 @@ static PyObject* gPyGetBlendFileList(PyObject*, PyObject* args)
while ((dirp = readdir(dp)) != NULL) {
if (BLI_testextensie(dirp->d_name, ".blend")) {
- value = PyUnicode_FromString(dirp->d_name);
+ value= PyUnicode_DecodeFSDefault(dirp->d_name);
PyList_Append(list, value);
Py_DECREF(value);
}
@@ -911,6 +928,11 @@ static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
{
gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
}
+
+ KX_WorldInfo *wi = gp_KetsjiScene->GetWorldInfo();
+ if (wi->hasWorld())
+ wi->setBackColor(vec[0], vec[1], vec[2]);
+
Py_RETURN_NONE;
}
@@ -1295,11 +1317,13 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
PyDict_SetItemString(d, "globalDict", item=PyDict_New()); Py_DECREF(item);
// Add keyboard and mouse attributes to this module
- SCA_PythonKeyboard* pykeyb = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
- PyDict_SetItemString(d, "keyboard", pykeyb->NewProxy(true));
+ MT_assert(!gp_PythonKeyboard);
+ gp_PythonKeyboard = new SCA_PythonKeyboard(gp_KetsjiEngine->GetKeyboardDevice());
+ PyDict_SetItemString(d, "keyboard", gp_PythonKeyboard->NewProxy(true));
- SCA_PythonMouse* pymouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
- PyDict_SetItemString(d, "mouse", pymouse->NewProxy(true));
+ MT_assert(!gp_PythonMouse);
+ gp_PythonMouse = new SCA_PythonMouse(gp_KetsjiEngine->GetMouseDevice(), gp_Canvas);
+ PyDict_SetItemString(d, "mouse", gp_PythonMouse->NewProxy(true));
ErrorObject = PyUnicode_FromString("GameLogic.error");
PyDict_SetItemString(d, "error", ErrorObject);
@@ -1379,6 +1403,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
/* 7. Action actuator */
KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PLAY, ACT_ACTION_PLAY);
+ KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PINGPONG, ACT_ACTION_PINGPONG);
KX_MACRO_addTypesToDict(d, KX_ACTIONACT_FLIPPER, ACT_ACTION_FLIPPER);
KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPSTOP, ACT_ACTION_LOOP_STOP);
KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPEND, ACT_ACTION_LOOP_END);
@@ -1759,8 +1784,8 @@ static void setSandbox(TPythonSecurityLevel level)
*/
default:
/* Allow importing internal text, from bpy_internal_import.py */
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(bpy_import_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
break;
}
}
@@ -1812,7 +1837,7 @@ static void initPySysObjects__append(PyObject *sys_path, char *filename)
BLI_split_dirfile(filename, expanded, NULL); /* get the dir part of filename only */
BLI_path_abs(expanded, gp_GamePythonPath); /* filename from lib->filename is (always?) absolute, so this may not be needed but it wont hurt */
BLI_cleanup_file(gp_GamePythonPath, expanded); /* Dont use BLI_cleanup_dir because it adds a slash - BREAKS WIN32 ONLY */
- item= PyUnicode_FromString(expanded);
+ item= PyUnicode_DecodeFSDefault(expanded);
// printf("SysPath - '%s', '%s', '%s'\n", expanded, filename, gp_GamePythonPath);
@@ -1903,7 +1928,7 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
PyObject *py_argv= PyList_New(argc);
for (i=0; i<argc; i++)
- PyList_SET_ITEM(py_argv, i, PyUnicode_FromString(argv[i]));
+ PyList_SET_ITEM(py_argv, i, PyC_UnicodeFromByte(argv[i]));
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
@@ -1920,11 +1945,18 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
PyObjectPlus::ClearDeprecationWarning();
- return bpy_namespace_dict_new(NULL);
+ return PyC_DefaultNameSpace(NULL);
}
void exitGamePlayerPythonScripting()
{
+ /* Clean up the Python mouse and keyboard */
+ delete gp_PythonKeyboard;
+ gp_PythonKeyboard = NULL;
+
+ delete gp_PythonMouse;
+ gp_PythonMouse = NULL;
+
/* since python restarts we cant let the python backup of the sys.path hang around in a global pointer */
restorePySysObjects(); /* get back the original sys.path and clear the backup */
@@ -1956,11 +1988,18 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev
PyObjectPlus::NullDeprecationWarning();
- return bpy_namespace_dict_new(NULL);
+ return PyC_DefaultNameSpace(NULL);
}
void exitGamePythonScripting()
{
+ /* Clean up the Python mouse and keyboard */
+ delete gp_PythonKeyboard;
+ gp_PythonKeyboard = NULL;
+
+ delete gp_PythonMouse;
+ gp_PythonMouse = NULL;
+
restorePySysObjects(); /* get back the original sys.path and clear the backup */
bpy_import_main_set(NULL);
PyObjectPlus::ClearDeprecationWarning();
@@ -1997,7 +2036,11 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *
initVideoTexture();
/* could be done a lot more nicely, but for now a quick way to get bge.* working */
+<<<<<<< .working
PyRun_SimpleString("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')});");
+=======
+ PyRun_SimpleString("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes'), 'texture':__import__('VideoTexture')});");
+>>>>>>> .merge-right.r35190
}
static struct PyModuleDef Rasterizer_module_def = {
@@ -2213,6 +2256,7 @@ PyObject* initGameKeys()
KX_MACRO_addTypesToDict(d, ESCKEY, SCA_IInputDevice::KX_ESCKEY);
KX_MACRO_addTypesToDict(d, TABKEY, SCA_IInputDevice::KX_TABKEY);
KX_MACRO_addTypesToDict(d, RETKEY, SCA_IInputDevice::KX_RETKEY);
+ KX_MACRO_addTypesToDict(d, ENTERKEY, SCA_IInputDevice::KX_RETKEY);
KX_MACRO_addTypesToDict(d, SPACEKEY, SCA_IInputDevice::KX_SPACEKEY);
KX_MACRO_addTypesToDict(d, LINEFEEDKEY, SCA_IInputDevice::KX_LINEFEEDKEY);
KX_MACRO_addTypesToDict(d, BACKSPACEKEY, SCA_IInputDevice::KX_BACKSPACEKEY);
@@ -2303,22 +2347,22 @@ PyObject* initGameKeys()
PyObject* initMathutils()
{
- return Mathutils_Init();
+ return BPyInit_mathutils();
}
PyObject* initGeometry()
{
- return Geometry_Init();
+ return BPyInit_mathutils_geometry();
}
PyObject* initBGL()
{
- return BGL_Init();
+ return BPyInit_bgl();
}
PyObject* initBLF()
{
- return BLF_Init();
+ return BPyInit_blf();
}
// utility function for loading and saving the globalDict
@@ -2422,4 +2466,4 @@ void resetGamePythonPath()
gp_GamePythonPathOrig[0] = '\0';
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index fb59a2f21eb..f062aa2d661 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_PythonInit.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_PYTHON_INIT
#define __KX_PYTHON_INIT
@@ -39,7 +44,7 @@ typedef enum {
extern bool gUseVisibilityTemp;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* initGameLogic(class KX_KetsjiEngine *engine, class KX_Scene* ketsjiscene);
PyObject* initGameKeys();
PyObject* initRasterizer(class RAS_IRasterizer* rasty,class RAS_ICanvas* canvas);
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
index 6b9d7a2cccf..1c4a17e31fc 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,12 +27,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_PythonInitTypes.cpp
+ * \ingroup ketsji
+ */
+
+
#ifndef _adr_py_init_types_h_ // only process once,
#define _adr_py_init_types_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Only for Class::Parents */
#include "BL_BlenderShader.h"
@@ -47,6 +52,7 @@
#include "KX_ConstraintWrapper.h"
#include "KX_GameActuator.h"
#include "KX_Light.h"
+#include "KX_FontObject.h"
#include "KX_MeshProxy.h"
#include "KX_MouseFocusSensor.h"
#include "KX_NetworkMessageActuator.h"
@@ -193,6 +199,7 @@ void initPyTypes(void)
PyType_Ready_Attr(dict, KX_GameObject, init_getset);
PyType_Ready_Attr(dict, KX_IpoActuator, init_getset);
PyType_Ready_Attr(dict, KX_LightObject, init_getset);
+ PyType_Ready_Attr(dict, KX_FontObject, init_getset);
PyType_Ready_Attr(dict, KX_MeshProxy, init_getset);
PyType_Ready_Attr(dict, KX_MouseFocusSensor, init_getset);
PyType_Ready_Attr(dict, KX_NearSensor, init_getset);
@@ -256,6 +263,6 @@ void initPyTypes(void)
#endif
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif
diff --git a/source/gameengine/Ketsji/KX_PythonInitTypes.h b/source/gameengine/Ketsji/KX_PythonInitTypes.h
index c16fafedf93..b113c080f4a 100644
--- a/source/gameengine/Ketsji/KX_PythonInitTypes.h
+++ b/source/gameengine/Ketsji/KX_PythonInitTypes.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_PythonInitTypes.h
+ * \ingroup ketsji
+ */
+
#ifndef _adr_py_init_types_h_ // only process once,
#define _adr_py_init_types_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void initPyTypes(void);
#endif
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
index 5c87fe2e757..d60b5a7dc74 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,7 +28,12 @@
* Readonly sequence wrapper for lookups on logic bricks
*/
-#ifndef DISABLE_PYTHON
+/** \file gameengine/Ketsji/KX_PythonSeq.cpp
+ * \ingroup ketsji
+ */
+
+
+#ifdef WITH_PYTHON
#include "KX_PythonSeq.h"
#include "KX_GameObject.h"
@@ -512,4 +517,4 @@ PyTypeObject KX_PythonSeq_Type = {
NULL
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h
index ca8f667852a..7146e775a84 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.h
+++ b/source/gameengine/Ketsji/KX_PythonSeq.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,13 +25,17 @@
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
- * Readonly sequence wrapper for lookups on logic bricks
+ */
+
+/** \file KX_PythonSeq.h
+ * \ingroup ketsji
+ * \brief Readonly sequence wrapper for lookups on logic bricks
*/
#ifndef _adr_py_seq_h_ // only process once,
#define _adr_py_seq_h_ // even if multiply included
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "PyObjectPlus.h"
@@ -61,6 +65,6 @@ typedef struct {
PyObject *KX_PythonSeq_CreatePyObject(PyObject *base, short type);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif // _adr_py_seq_h_
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.cpp b/source/gameengine/Ketsji/KX_RadarSensor.cpp
index 041559158dd..d002d8a8935 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.cpp
+++ b/source/gameengine/Ketsji/KX_RadarSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,11 +26,17 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_RadarSensor.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_RadarSensor.h"
#include "KX_GameObject.h"
#include "KX_PyMath.h"
#include "PHY_IPhysicsController.h"
#include "PHY_IMotionState.h"
+#include "DNA_sensor_types.h"
/**
* RadarSensor constructor. Creates a near-sensor derived class, with a cone collision shape.
@@ -95,42 +101,42 @@ void KX_RadarSensor::SynchronizeTransform()
// depends on the radar 'axis'
switch (m_axis)
{
- case 0: // +X Axis
+ case SENS_RADAR_X_AXIS: // +X Axis
{
MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 1: // +Y Axis
+ case SENS_RADAR_Y_AXIS: // +Y Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 2: // +Z Axis
+ case SENS_RADAR_Z_AXIS: // +Z Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 3: // -X Axis
+ case SENS_RADAR_NEG_X_AXIS: // -X Axis
{
MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(-90));
trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 4: // -Y Axis
+ case SENS_RADAR_NEG_Y_AXIS: // -Y Axis
{
//MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(-180));
//trans.rotate(rotquatje);
trans.translate(MT_Vector3 (0, -m_coneheight/2.0 ,0));
break;
};
- case 5: // -Z Axis
+ case SENS_RADAR_NEG_Z_AXIS: // -Z Axis
{
MT_Quaternion rotquatje(MT_Vector3(1,0,0),MT_radians(90));
trans.rotate(rotquatje);
@@ -172,7 +178,7 @@ void KX_RadarSensor::SynchronizeTransform()
/* Python Functions */
/* ------------------------------------------------------------------------- */
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python Integration Hooks */
@@ -212,4 +218,4 @@ PyAttributeDef KX_RadarSensor::Attributes[] = {
{NULL} //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_RadarSensor.h b/source/gameengine/Ketsji/KX_RadarSensor.h
index 17305922385..6caff2758e7 100644
--- a/source/gameengine/Ketsji/KX_RadarSensor.h
+++ b/source/gameengine/Ketsji/KX_RadarSensor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_RadarSensor.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_RADAR_SENSOR_H
#define __KX_RADAR_SENSOR_H
diff --git a/source/gameengine/Ketsji/KX_RayCast.cpp b/source/gameengine/Ketsji/KX_RayCast.cpp
index 7562265a536..e0fc212f1b0 100644
--- a/source/gameengine/Ketsji/KX_RayCast.cpp
+++ b/source/gameengine/Ketsji/KX_RayCast.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* KX_MouseFocusSensor determines mouse in/out/over events.
*/
+/** \file gameengine/Ketsji/KX_RayCast.cpp
+ * \ingroup ketsji
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/gameengine/Ketsji/KX_RayCast.h b/source/gameengine/Ketsji/KX_RayCast.h
index 1512d81e940..963467c5958 100644
--- a/source/gameengine/Ketsji/KX_RayCast.h
+++ b/source/gameengine/Ketsji/KX_RayCast.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_RayCast.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_RAYCAST_H__
#define __KX_RAYCAST_H__
diff --git a/source/gameengine/Ketsji/KX_RayEventManager.cpp b/source/gameengine/Ketsji/KX_RayEventManager.cpp
index 9c9d6722784..3956fa04dff 100644
--- a/source/gameengine/Ketsji/KX_RayEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_RayEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Manager for ray events
*
* $Id$
@@ -28,6 +28,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Ketsji/KX_RayEventManager.cpp
+ * \ingroup ketsji
+ */
+
#include "KX_RayEventManager.h"
#include "SCA_LogicManager.h"
#include "SCA_ISensor.h"
diff --git a/source/gameengine/Ketsji/KX_RayEventManager.h b/source/gameengine/Ketsji/KX_RayEventManager.h
index 55c2b81b068..92ce836b950 100644
--- a/source/gameengine/Ketsji/KX_RayEventManager.h
+++ b/source/gameengine/Ketsji/KX_RayEventManager.h
@@ -1,6 +1,4 @@
-/**
- * Manager for ray events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_RayEventManager.h
+ * \ingroup ketsji
+ * \brief Manager for ray events
+ */
+
#ifndef __KX_RAYEVENTMGR
#define __KX_RAYEVENTMGR
#include "SCA_EventManager.h"
diff --git a/source/gameengine/Ketsji/KX_RaySensor.cpp b/source/gameengine/Ketsji/KX_RaySensor.cpp
index e745d1f0334..a683c9857aa 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.cpp
+++ b/source/gameengine/Ketsji/KX_RaySensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Cast a ray and feel for objects
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_RaySensor.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_RaySensor.h"
#include "SCA_EventManager.h"
#include "SCA_RandomEventManager.h"
@@ -42,6 +47,7 @@
#include "PHY_IPhysicsEnvironment.h"
#include "KX_IPhysicsController.h"
#include "PHY_IPhysicsController.h"
+#include "DNA_sensor_types.h"
#include <stdio.h>
@@ -198,42 +204,42 @@ bool KX_RaySensor::Evaluate()
m_reset = false;
switch (m_axis)
{
- case 1: // X
+ case SENS_RAY_X_AXIS: // X
{
todir[0] = invmat[0][0];
todir[1] = invmat[0][1];
todir[2] = invmat[0][2];
break;
}
- case 0: // Y
+ case SENS_RAY_Y_AXIS: // Y
{
todir[0] = invmat[1][0];
todir[1] = invmat[1][1];
todir[2] = invmat[1][2];
break;
}
- case 2: // Z
+ case SENS_RAY_Z_AXIS: // Z
{
todir[0] = invmat[2][0];
todir[1] = invmat[2][1];
todir[2] = invmat[2][2];
break;
}
- case 3: // -X
+ case SENS_RAY_NEG_X_AXIS: // -X
{
todir[0] = -invmat[0][0];
todir[1] = -invmat[0][1];
todir[2] = -invmat[0][2];
break;
}
- case 4: // -Y
+ case SENS_RAY_NEG_Y_AXIS: // -Y
{
todir[0] = -invmat[1][0];
todir[1] = -invmat[1][1];
todir[2] = -invmat[1][2];
break;
}
- case 5: // -Z
+ case SENS_RAY_NEG_Z_AXIS: // -Z
{
todir[0] = -invmat[2][0];
todir[1] = -invmat[2][1];
@@ -309,7 +315,7 @@ bool KX_RaySensor::Evaluate()
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -365,4 +371,4 @@ PyObject* KX_RaySensor::pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_RaySensor.h b/source/gameengine/Ketsji/KX_RaySensor.h
index 34f7d8a7b1d..ef8340e9f80 100644
--- a/source/gameengine/Ketsji/KX_RaySensor.h
+++ b/source/gameengine/Ketsji/KX_RaySensor.h
@@ -1,6 +1,4 @@
-/**
- * Cast a ray and feel for objects
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_RaySensor.h
+ * \ingroup ketsji
+ * \brief Cast a ray and feel for objects
+ */
+
#ifndef __KX_RAYSENSOR_H
#define __KX_RAYSENSOR_H
@@ -90,12 +93,12 @@ public:
KX_RAY_AXIS_NEG_Z
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Attributes */
static PyObject* pyattr_get_hitobject(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
index eee6146f6ed..521c0038f27 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
+ * \ingroup ketsji
+ */
//
// Add an object when this actuator is triggered
//
@@ -159,7 +162,7 @@ void KX_SCA_AddObjectActuator::Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -246,7 +249,7 @@ PyObject* KX_SCA_AddObjectActuator::PyInstantAddObject()
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
void KX_SCA_AddObjectActuator::InstantAddObject()
{
diff --git a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
index c2068d157ee..11f210ad7b5 100644
--- a/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
@@ -1,8 +1,3 @@
-//
-// Add object to the game world on action of this actuator. A copy is made
-// of a referenced object. The copy inherits some properties from the owner
-// of this actuator.
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,10 +24,12 @@
// Contributor(s): none yet.
//
// ***** END GPL LICENSE BLOCK *****
-//
-// Previously existed as:
-// \source\gameengine\GameLogic\SCA_AddObjectActuator.h
-// Please look here for revision history.
+
+/** \file KX_SCA_AddObjectActuator.h
+ * \ingroup ketsji
+ * \attention Previously existed as: \source\gameengine\GameLogic\SCA_AddObjectActuator.h
+ * Please look here for revision history.
+ */
#ifndef __KX_SCA_AddObjectActuator
#define __KX_SCA_AddObjectActuator
@@ -122,7 +119,7 @@ public:
void InstantAddObject();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_DOC_NOARGS(KX_SCA_AddObjectActuator,InstantAddObject);
@@ -130,7 +127,7 @@ public:
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
static PyObject* pyattr_get_objectLastCreated(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_SCA_AddObjectActuator : public KX_EditObjectActuator */
diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
index bc59c63dc69..40c9c182d99 100644
--- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
+ * \ingroup ketsji
+ */
//
// Adjust dynamics settins for this object
//
@@ -37,7 +40,7 @@
#include "KX_SCA_DynamicActuator.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -77,7 +80,7 @@ PyAttributeDef KX_SCA_DynamicActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Native functions */
diff --git a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
index 43322fdfd96..04b2c00f4c1 100644
--- a/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
@@ -1,6 +1,3 @@
-//
-// Add object to the game world on action of this actuator
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +26,11 @@
// ***** END GPL LICENSE BLOCK *****
//
+/** \file KX_SCA_DynamicActuator.h
+ * \ingroup ketsji
+ * \brief Add object to the game world on action of this actuator
+ */
+
#ifndef __KX_SCA_DYNAMICACTUATOR
#define __KX_SCA_DYNAMICACTUATOR
diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
index c9ead726905..076669e325a 100644
--- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_SCA_EndObjectActuator.cpp
+ * \ingroup ketsji
+ */
+
+
//
// Remove the actuator's parent when triggered
@@ -80,7 +85,7 @@ CValue* KX_SCA_EndObjectActuator::GetReplica()
return replica;
};
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions : integration hooks */
@@ -116,6 +121,6 @@ PyAttributeDef KX_SCA_EndObjectActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
index cedf17c599b..c8e1af86466 100644
--- a/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_EndObjectActuator.h
@@ -1,6 +1,3 @@
-//
-// Add object to the game world on action of this actuator
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,9 +25,13 @@
//
// ***** END GPL LICENSE BLOCK *****
//
-// Previously existed as:
-// \source\gameengine\GameLogic\SCA_EndObjectActuator.h
-// Please look here for revision history.
+
+/** \file KX_SCA_EndObjectActuator.h
+ * \ingroup ketsji
+ * \brief Add object to the game world on action of this actuator
+ * \attention Previously existed as: \source\gameengine\GameLogic\SCA_EndObjectActuator.h
+ * Please look here for revision history.
+ */
#ifndef __KX_SCA_ENDOBJECTACTUATOR
#define __KX_SCA_ENDOBJECTACTUATOR
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
index 20c3168d7ba..1c6e5e20250 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
+ * \ingroup ketsji
+ */
//
// Replace the mesh for this actuator's parent
//
@@ -35,12 +38,14 @@
// Please look here for revision history.
+#include <stddef.h>
+
#include "KX_SCA_ReplaceMeshActuator.h"
#include "KX_MeshProxy.h"
#include "PyObjectPlus.h"
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -110,7 +115,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Native functions */
diff --git a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
index 4a6ae9f8fce..7838cb63b17 100644
--- a/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
+++ b/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
@@ -1,6 +1,3 @@
-//
-// Add object to the game world on action of this actuator
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,10 +25,13 @@
//
// ***** END GPL LICENSE BLOCK *****
//
-// Previously existed as:
-// \source\gameengine\GameLogic\SCA_ReplaceMeshActuator.h
-// Please look here for revision history.
-//
+
+/** \file KX_SCA_ReplaceMeshActuator.h
+ * \ingroup ketsji
+ * \brief Add object to the game world on action of this actuator
+ * \attention Previously existed as: \source\gameengine\GameLogic\SCA_ReplaceMeshActuator.h
+ * Please look here for revision history.
+ */
#ifndef __KX_SCA_REPLACEMESHACTUATOR
#define __KX_SCA_REPLACEMESHACTUATOR
@@ -74,7 +74,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
void InstantReplaceMesh();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
@@ -90,7 +90,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp
index 0529195e933..3fec33b119d 100644
--- a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp
+++ b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.cpp
+ * \ingroup ketsji
+ */
+
+
#include <iostream>
#include "KX_SG_BoneParentNodeRelationship.h"
diff --git a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
index 05e9d9f02de..6e6c197517f 100644
--- a/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
+++ b/source/gameengine/Ketsji/KX_SG_BoneParentNodeRelationship.h
@@ -1,19 +1,4 @@
-/**
- * @mainpage KX_SG_NodeRelationships
-
- * @section
- *
- * This file provides common concrete implementations of
- * SG_ParentRelation used by the game engine. These are
- * KX_SlowParentRelation a slow parent relationship.
- * KX_NormalParentRelation a normal parent relationship where
- * orientation and position are inherited from the parent by
- * the child.
- * KX_VertexParentRelation only location information is
- * inherited by the child.
- *
- * interface
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,6 +28,10 @@
*
*/
+/** \file KX_SG_BoneParentNodeRelationship.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_SG_BONEPARENTRELATION_H__
#define __KX_SG_BONEPARENTRELATION_H__
diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
index ccdaac8edb7..f376dd399f2 100644
--- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
+++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_SG_NodeRelationships.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_SG_NodeRelationships.h"
/**
diff --git a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
index 7bb6f767308..3e18ddf2611 100644
--- a/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
+++ b/source/gameengine/Ketsji/KX_SG_NodeRelationships.h
@@ -1,19 +1,4 @@
-/**
- * @mainpage KX_SG_NodeRelationships
-
- * @section
- *
- * This file provides common concrete implementations of
- * SG_ParentRelation used by the game engine. These are
- * KX_SlowParentRelation a slow parent relationship.
- * KX_NormalParentRelation a normal parent relationship where
- * orientation and position are inherited from the parent by
- * the child.
- * KX_VertexParentRelation only location information is
- * inherited by the child.
- *
- * interface
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -43,6 +28,19 @@
*
*/
+/** \file KX_SG_NodeRelationships.h
+ * \ingroup ketsji
+ * \section KX_SG_NodeRelationships
+ * This file provides common concrete implementations of
+ * SG_ParentRelation used by the game engine. These are
+ * KX_SlowParentRelation a slow parent relationship.
+ * KX_NormalParentRelation a normal parent relationship where
+ * orientation and position are inherited from the parent by
+ * the child.
+ * KX_VertexParentRelation only location information is
+ * inherited by the child.
+ */
+
#ifndef __KX_SG_NODERELATIONS_H__
#define __KX_SG_NODERELATIONS_H__
diff --git a/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp b/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp
index 9fc544feaff..c9ca9d704e1 100644
--- a/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp
+++ b/source/gameengine/Ketsji/KX_ScalarInterpolator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ScalarInterpolator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_ScalarInterpolator.h"
#include "KX_IScalarInterpolator.h"
diff --git a/source/gameengine/Ketsji/KX_ScalarInterpolator.h b/source/gameengine/Ketsji/KX_ScalarInterpolator.h
index 5b66ad42bd9..1abc4f4f06f 100644
--- a/source/gameengine/Ketsji/KX_ScalarInterpolator.h
+++ b/source/gameengine/Ketsji/KX_ScalarInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ScalarInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_SCALARINTERPOLATOR
#define KX_SCALARINTERPOLATOR
diff --git a/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp b/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp
index 3f5ac8ee8a4..a7b5d1415da 100644
--- a/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp
+++ b/source/gameengine/Ketsji/KX_ScalingInterpolator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_ScalingInterpolator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_ScalingInterpolator.h"
#include "MT_Vector3.h"
#include "KX_IScalarInterpolator.h"
diff --git a/source/gameengine/Ketsji/KX_ScalingInterpolator.h b/source/gameengine/Ketsji/KX_ScalingInterpolator.h
index 87b85a30d1f..72b91c1a421 100644
--- a/source/gameengine/Ketsji/KX_ScalingInterpolator.h
+++ b/source/gameengine/Ketsji/KX_ScalingInterpolator.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_ScalingInterpolator.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_SCALINGINTERPOLATOR
#define KX_SCALINGINTERPOLATOR
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index d4936d7054c..0a8c3039ae3 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -28,7 +28,12 @@
* Ketsji scene. Holds references to all scene data.
*/
-#ifdef WIN32
+/** \file gameengine/Ketsji/KX_Scene.cpp
+ * \ingroup ketsji
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable : 4786)
#endif //WIN32
@@ -82,12 +87,10 @@
#include "BL_ModifierDeformer.h"
#include "BL_ShapeDeformer.h"
#include "BL_DeformableGameObject.h"
-#include "KX_SoftBodyDeformer.h"
-
-// to get USE_BULLET!
-#include "KX_ConvertPhysicsObject.h"
#ifdef USE_BULLET
+#include "KX_SoftBodyDeformer.h"
+#include "KX_ConvertPhysicsObject.h"
#include "CcdPhysicsEnvironment.h"
#include "CcdPhysicsController.h"
#endif
@@ -210,7 +213,7 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice,
m_bucketmanager=new RAS_BucketManager();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
m_attr_dict = PyDict_New(); /* new ref */
m_draw_call_pre = NULL;
m_draw_call_post = NULL;
@@ -264,7 +267,7 @@ KX_Scene::~KX_Scene()
delete m_bucketmanager;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyDict_Clear(m_attr_dict);
Py_DECREF(m_attr_dict);
@@ -325,7 +328,10 @@ list<class KX_Camera*>* KX_Scene::GetCameras()
return &m_cameras;
}
-
+list<class KX_FontObject*>* KX_Scene::GetFonts()
+{
+ return &m_fonts;
+}
void KX_Scene::SetFramingType(RAS_FrameSettings & frame_settings)
{
@@ -814,6 +820,8 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
// add a timebomb to this object
// for now, convert between so called frames and realtime
m_tempObjectList->Add(replica->AddRef());
+ // this convert the life from frames to sort-of seconds, hard coded 0.02 that assumes we have 50 frames per second
+ // if you change this value, make sure you change it in KX_GameObject::pyattr_get_life property too
CValue *fval = new CFloatValue(lifespan*0.02);
replica->SetProperty("::timebomb",fval);
fval->Release();
@@ -1014,6 +1022,9 @@ int KX_Scene::NewRemoveObject(class CValue* gameobj)
// in case this is a camera
m_cameras.remove((KX_Camera*)newobj);
+ // in case this is a font
+ m_fonts.remove((KX_FontObject*)newobj);
+
/* currently does nothing, keep incase we need to Unregister something */
#if 0
if (m_sceneConverter)
@@ -1073,8 +1084,9 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
blendobj->parent && // original object had armature (not sure this test is needed)
blendobj->parent->type == OB_ARMATURE &&
blendmesh->dvert!=NULL; // mesh has vertex group
+#ifdef USE_BULLET
bool bHasSoftBody = (!parentobj && (blendobj->gameflag & OB_SOFT_BODY));
-
+#endif
bool releaseParent = true;
@@ -1163,11 +1175,13 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
);
newobj->SetDeformer(meshdeformer);
}
+#ifdef USE_BULLET
else if (bHasSoftBody)
{
KX_SoftBodyDeformer *softdeformer = new KX_SoftBodyDeformer(mesh, newobj);
newobj->SetDeformer(softdeformer);
}
+#endif
// release parent reference if its not being used
if( releaseParent && parentobj)
@@ -1177,12 +1191,35 @@ void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool u
gameobj->AddMeshUser();
}
-
+
+#ifdef USE_BULLET
if(use_phys) { /* update the new assigned mesh with the physics mesh */
KX_ReInstanceBulletShapeFromMesh(gameobj, NULL, use_gfx?NULL:mesh);
}
+#endif
+}
+
+/* Font Object routines */
+void KX_Scene::AddFont(KX_FontObject* font)
+{
+ if (!FindFont(font))
+ m_fonts.push_back(font);
+}
+
+KX_FontObject* KX_Scene::FindFont(KX_FontObject* font)
+{
+ list<KX_FontObject*>::iterator it = m_fonts.begin();
+
+ while ( (it != m_fonts.end())
+ && ((*it) != font) ) {
+ ++it;
+ }
+
+ return ((it == m_fonts.end()) ? NULL : (*it));
}
+
+/* Camera Object routines */
KX_Camera* KX_Scene::FindCamera(KX_Camera* cam)
{
list<KX_Camera*>::iterator it = m_cameras.begin();
@@ -1629,7 +1666,9 @@ double KX_Scene::getSuspendedDelta()
return m_suspendeddelta;
}
+#ifdef USE_BULLET
#include "KX_BulletPhysicsController.h"
+#endif
static void MergeScene_LogicBrick(SCA_ILogicBrick* brick, KX_Scene *to)
{
@@ -1644,16 +1683,19 @@ static void MergeScene_LogicBrick(SCA_ILogicBrick* brick, KX_Scene *to)
}
/* near sensors have physics controllers */
+#ifdef USE_BULLET
KX_TouchSensor *touch_sensor = dynamic_cast<class KX_TouchSensor *>(brick);
if(touch_sensor) {
touch_sensor->GetPhysicsController()->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
}
+#endif
}
+#ifdef USE_BULLET
#include "CcdGraphicController.h" // XXX ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
#include "CcdPhysicsEnvironment.h" // XXX ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
#include "KX_BulletPhysicsController.h"
-
+#endif
static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene *from)
{
@@ -1712,8 +1754,13 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
if(sg) {
if(sg->GetSGClientInfo() == from) {
sg->SetSGClientInfo(to);
- }
+ /* Make sure to grab the children too since they might not be tied to a game object */
+ NodeList children = sg->GetSGChildren();
+ for (int i=0; i<children.size(); i++)
+ children[i]->SetSGClientInfo(to);
+ }
+#ifdef USE_BULLET
SGControllerList::iterator contit;
SGControllerList& controllers = sg->GetSGControllerList();
for (contit = controllers.begin();contit!=controllers.end();++contit)
@@ -1722,6 +1769,7 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
if (phys_ctrl)
phys_ctrl->SetPhysicsEnvironment(to->GetPhysicsEnvironment());
}
+#endif // USE_BULLET
}
/* If the object is a light, update it's scene */
if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_LIGHT)
@@ -1737,6 +1785,7 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene
bool KX_Scene::MergeScene(KX_Scene *other)
{
+#ifdef USE_BULLET
CcdPhysicsEnvironment *env= dynamic_cast<CcdPhysicsEnvironment *>(this->GetPhysicsEnvironment());
CcdPhysicsEnvironment *env_other= dynamic_cast<CcdPhysicsEnvironment *>(other->GetPhysicsEnvironment());
@@ -1746,6 +1795,7 @@ bool KX_Scene::MergeScene(KX_Scene *other)
printf("\tsource %d, terget %d\n", (int)(env!=NULL), (int)(env_other!=NULL));
return false;
}
+#endif // USE_BULLET
if(GetSceneConverter() != other->GetSceneConverter()) {
printf("KX_Scene::MergeScene: converters differ, aborting\n");
@@ -1788,9 +1838,11 @@ bool KX_Scene::MergeScene(KX_Scene *other)
GetLightList()->MergeList(other->GetLightList());
other->GetLightList()->ReleaseAndRemoveAll();
+#ifdef USE_BULLET
if(env) /* bullet scene? - dummy scenes dont need touching */
env->MergeEnvironment(env_other);
-
+#endif
+
/* merge logic */
{
SCA_LogicManager *logicmgr= GetLogicManager();
@@ -1810,6 +1862,16 @@ bool KX_Scene::MergeScene(KX_Scene *other)
/* when merging objects sensors are moved across into the new manager, dont need to do this here */
}
+
+ /* grab any timer properties from the other scene */
+ SCA_TimeEventManager *timemgr= GetTimeEventManager();
+ SCA_TimeEventManager *timemgr_other= other->GetTimeEventManager();
+ vector<CValue*> times = timemgr_other->GetTimeValues();
+
+ for(unsigned int i= 0; i < times.size(); i++) {
+ timemgr->AddTimeProperty(times[i]);
+ }
+
}
return true;
}
@@ -1824,7 +1886,7 @@ void KX_Scene::Render2DFilters(RAS_ICanvas* canvas)
m_filtermanager.RenderFilters(canvas);
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
void KX_Scene::RunDrawingCallbacks(PyObject* cb_list)
{
@@ -2072,8 +2134,7 @@ PyObject* KX_Scene::pyattr_get_drawing_callback_pre(void *self_v, const KX_PYATT
if(self->m_draw_call_pre==NULL)
self->m_draw_call_pre= PyList_New(0);
- else
- Py_INCREF(self->m_draw_call_pre);
+ Py_INCREF(self->m_draw_call_pre);
return self->m_draw_call_pre;
}
@@ -2083,8 +2144,7 @@ PyObject* KX_Scene::pyattr_get_drawing_callback_post(void *self_v, const KX_PYAT
if(self->m_draw_call_post==NULL)
self->m_draw_call_post= PyList_New(0);
- else
- Py_INCREF(self->m_draw_call_post);
+ Py_INCREF(self->m_draw_call_post);
return self->m_draw_call_post;
}
@@ -2234,4 +2294,4 @@ KX_PYMETHODDEF_DOC(KX_Scene, get, "")
return def;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h
index cd8277ec39f..af6a31e786c 100644
--- a/source/gameengine/Ketsji/KX_Scene.h
+++ b/source/gameengine/Ketsji/KX_Scene.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_Scene.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_SCENE_H
#define __KX_SCENE_H
@@ -99,7 +104,7 @@ class KX_Scene : public PyObjectPlus, public SCA_IScene
{
Py_Header;
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* m_attr_dict;
PyObject* m_draw_call_pre;
PyObject* m_draw_call_post;
@@ -136,6 +141,13 @@ protected:
* The set of cameras for this scene
*/
list<class KX_Camera*> m_cameras;
+
+ /**
+ * The set of fonts for this scene
+ */
+ list<class KX_FontObject*> m_fonts;
+
+
/**
* Various SCA managers used by the scene
*/
@@ -361,6 +373,27 @@ public:
GetTimeEventManager(
);
+ /** Font Routines */
+
+ list<class KX_FontObject*>*
+ GetFonts(
+ );
+
+ /** Find a font in the scene by pointer. */
+ KX_FontObject*
+ FindFont(
+ KX_FontObject*
+ );
+
+ /** Add a camera to this scene. */
+ void
+ AddFont(
+ KX_FontObject*
+ );
+
+
+ /** Camera Routines */
+
list<class KX_Camera*>*
GetCameras(
);
@@ -544,7 +577,7 @@ public:
void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text);
void Render2DFilters(RAS_ICanvas* canvas);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
/* --------------------------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.cpp b/source/gameengine/Ketsji/KX_SceneActuator.cpp
index 8f6000ebc3d..8312a14ebfb 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SceneActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Set scene/camera stuff
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_SceneActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "SCA_IActuator.h"
#include "KX_SceneActuator.h"
#include <iostream>
@@ -210,7 +215,7 @@ KX_Scene* KX_SceneActuator::FindScene(char * sceneName)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -283,6 +288,6 @@ int KX_SceneActuator::pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_SceneActuator.h b/source/gameengine/Ketsji/KX_SceneActuator.h
index 360488f9f74..563255d1560 100644
--- a/source/gameengine/Ketsji/KX_SceneActuator.h
+++ b/source/gameengine/Ketsji/KX_SceneActuator.h
@@ -1,7 +1,3 @@
-
-//
-// Add object to the game world on action of this actuator
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -30,6 +26,10 @@
// ***** END GPL LICENSE BLOCK *****
//
+/** \file KX_SceneActuator.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_SCENEACTUATOR
#define __KX_SCENEACTUATOR
@@ -89,7 +89,7 @@ class KX_SceneActuator : public SCA_IActuator
virtual bool Update();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
virtual void Replace_IScene(SCA_IScene *val)
{
@@ -103,7 +103,7 @@ class KX_SceneActuator : public SCA_IActuator
static PyObject* pyattr_get_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_camera(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KXSceneActuator */
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp
index 9ebb36578c4..45ba827a1b8 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.cpp
+++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* KX_SoundActuator.cpp
*
* $Id$
@@ -30,6 +30,11 @@
*
*/
+/** \file gameengine/Ketsji/KX_SoundActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_SoundActuator.h"
#include "AUD_C-API.h"
#include "KX_GameObject.h"
@@ -233,7 +238,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -496,4 +501,4 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h
index c175a184a15..e7257245a80 100644
--- a/source/gameengine/Ketsji/KX_SoundActuator.h
+++ b/source/gameengine/Ketsji/KX_SoundActuator.h
@@ -1,6 +1,4 @@
-/**
- * KX_SoundActuator.h
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_SoundActuator.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_SOUNDACTUATOR
#define __KX_SOUNDACTUATOR
@@ -93,7 +95,7 @@ public:
CValue* GetReplica();
void ProcessReplica();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* -------------------------------------------------------------------- */
/* Python interface --------------------------------------------------- */
@@ -115,7 +117,7 @@ public:
static PyObject* pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static PyObject* pyattr_get_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
};
diff --git a/source/gameengine/Ketsji/KX_StateActuator.cpp b/source/gameengine/Ketsji/KX_StateActuator.cpp
index 33f21f49810..7ebfae2ca25 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.cpp
+++ b/source/gameengine/Ketsji/KX_StateActuator.cpp
@@ -28,6 +28,11 @@
* Actuator to toggle visibility/invisibility of objects
*/
+/** \file gameengine/Ketsji/KX_StateActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_StateActuator.h"
#include "KX_GameObject.h"
@@ -124,7 +129,7 @@ void KX_StateActuator::Activate(SG_DList& head)
}
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -165,4 +170,4 @@ PyAttributeDef KX_StateActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_StateActuator.h b/source/gameengine/Ketsji/KX_StateActuator.h
index 3af03f5d1fb..bdaaa0ffbc2 100644
--- a/source/gameengine/Ketsji/KX_StateActuator.h
+++ b/source/gameengine/Ketsji/KX_StateActuator.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Actuator to toggle visibility/invisibility of objects
+ */
+
+/** \file KX_StateActuator.h
+ * \ingroup ketsji
+ * \brief Actuator to toggle visibility/invisibility of objects
*/
#ifndef __KX_STATEACTUATOR
diff --git a/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp b/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp
index 4f10c72b50b..65cc9c581d8 100644
--- a/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp
+++ b/source/gameengine/Ketsji/KX_TimeCategoryLogger.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_TimeCategoryLogger.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_TimeCategoryLogger.h"
KX_TimeCategoryLogger::KX_TimeCategoryLogger(unsigned int maxNumMeasurements)
diff --git a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
index b020683bfc6..95358e99cb7 100644
--- a/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
+++ b/source/gameengine/Ketsji/KX_TimeCategoryLogger.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_TimeCategoryLogger.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_TIME_CATEGORY_LOGGER_H
#define __KX_TIME_CATEGORY_LOGGER_H
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#endif
diff --git a/source/gameengine/Ketsji/KX_TimeLogger.cpp b/source/gameengine/Ketsji/KX_TimeLogger.cpp
index 5ec09df2791..b904e857ad3 100644
--- a/source/gameengine/Ketsji/KX_TimeLogger.cpp
+++ b/source/gameengine/Ketsji/KX_TimeLogger.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_TimeLogger.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_TimeLogger.h"
KX_TimeLogger::KX_TimeLogger(unsigned int maxNumMeasurements) :
diff --git a/source/gameengine/Ketsji/KX_TimeLogger.h b/source/gameengine/Ketsji/KX_TimeLogger.h
index 058b1c2b6c7..a43c0bfddc7 100644
--- a/source/gameengine/Ketsji/KX_TimeLogger.h
+++ b/source/gameengine/Ketsji/KX_TimeLogger.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_TimeLogger.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_TIME_LOGGER_H
#define __KX_TIME_LOGGER_H
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // suppress stl-MSVC debug info warning
#endif
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.cpp b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
index eb55d0272f6..d57c1b73eec 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.cpp
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_TouchEventManager.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_TouchEventManager.h"
#include "SCA_ISensor.h"
#include "KX_TouchSensor.h"
@@ -109,6 +114,13 @@ bool KX_TouchEventManager::newBroadphaseResponse(void *client_data,
}
}
return false;
+
+ // quiet the compiler
+ case KX_ClientObjectInfo::STATIC:
+ case KX_ClientObjectInfo::ACTOR:
+ case KX_ClientObjectInfo::RESERVED1:
+ /* do nothing*/
+ break;
}
return true;
}
diff --git a/source/gameengine/Ketsji/KX_TouchEventManager.h b/source/gameengine/Ketsji/KX_TouchEventManager.h
index 388195367b9..c8b86e854ae 100644
--- a/source/gameengine/Ketsji/KX_TouchEventManager.h
+++ b/source/gameengine/Ketsji/KX_TouchEventManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_TouchEventManager.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_TOUCHEVENTMANAGER
#define __KX_TOUCHEVENTMANAGER
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp
index 9b44f487682..6186254c34c 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.cpp
+++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* Senses touch and collision events
*
* $Id$
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_TouchSensor.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_TouchSensor.h"
#include "SCA_EventManager.h"
#include "SCA_LogicManager.h"
@@ -283,7 +288,7 @@ bool KX_TouchSensor::NewHandleCollision(void*object1,void*object2,const PHY_Coll
return false; // was DT_CONTINUE but this was defined in sumo as false.
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
diff --git a/source/gameengine/Ketsji/KX_TouchSensor.h b/source/gameengine/Ketsji/KX_TouchSensor.h
index c9448897936..39011345267 100644
--- a/source/gameengine/Ketsji/KX_TouchSensor.h
+++ b/source/gameengine/Ketsji/KX_TouchSensor.h
@@ -1,6 +1,4 @@
-/**
- * Senses touch and collision events
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file KX_TouchSensor.h
+ * \ingroup ketsji
+ * \brief Senses touch and collision events
+ */
+
#ifndef __KX_TOUCHSENSOR
#define __KX_TOUCHSENSOR
@@ -118,7 +121,7 @@ public:
// todo: put some info for collision maybe
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* --------------------------------------------------------------------- */
/* Python interface ---------------------------------------------------- */
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.cpp b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
index ae8d2f6459b..5530fa286cf 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.cpp
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_TrackToActuator.cpp
+ * \ingroup ketsji
+ */
//
// Replace the mesh for this actuator's parent
//
@@ -417,7 +420,7 @@ bool KX_TrackToActuator::Update(double curtime, bool frame)
return result;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -486,6 +489,6 @@ int KX_TrackToActuator::pyattr_set_object(void *self, const struct KX_PYATTRIBUT
return PY_SET_ATTR_SUCCESS;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
/* eof */
diff --git a/source/gameengine/Ketsji/KX_TrackToActuator.h b/source/gameengine/Ketsji/KX_TrackToActuator.h
index 2b44994f103..33780bf53e4 100644
--- a/source/gameengine/Ketsji/KX_TrackToActuator.h
+++ b/source/gameengine/Ketsji/KX_TrackToActuator.h
@@ -1,6 +1,3 @@
-//
-// Add object to the game world on action of this actuator
-//
// $Id$
//
// ***** BEGIN GPL LICENSE BLOCK *****
@@ -29,6 +26,10 @@
// ***** END GPL LICENSE BLOCK *****
//
+/** \file KX_TrackToActuator.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_TrackToActuator
#define __KX_TrackToActuator
@@ -69,7 +70,7 @@ class KX_TrackToActuator : public SCA_IActuator
virtual void Relink(GEN_Map<GEN_HashedPtr, void*> *obj_map);
virtual bool Update(double curtime, bool frame);
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* Python part */
@@ -77,7 +78,7 @@ class KX_TrackToActuator : public SCA_IActuator
static PyObject* pyattr_get_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef);
static int pyattr_set_object(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
}; /* end of class KX_TrackToActuator : public KX_EditObjectActuator */
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
index 4ee80c64570..1c03df80dc1 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Ketsji/KX_VehicleWrapper.cpp
+ * \ingroup ketsji
+ */
#include "PyObjectPlus.h"
@@ -29,7 +32,7 @@ KX_VehicleWrapper::~KX_VehicleWrapper()
m_motionStates.clear();
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
PyObject* KX_VehicleWrapper::PyAddWheel(PyObject* args)
{
@@ -319,4 +322,4 @@ PyAttributeDef KX_VehicleWrapper::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.h b/source/gameengine/Ketsji/KX_VehicleWrapper.h
index 2ca06da18fc..f750912c95b 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.h
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.h
@@ -1,3 +1,8 @@
+
+/** \file KX_VehicleWrapper.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_VEHICLE_WRAPPER
#define KX_VEHICLE_WRAPPER
@@ -20,7 +25,7 @@ public:
virtual ~KX_VehicleWrapper ();
int getConstraintId();
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,AddWheel);
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,GetNumWheels);
@@ -47,7 +52,7 @@ public:
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,SetSuspensionCompression);
KX_PYMETHOD_VARARGS(KX_VehicleWrapper,SetRollInfluence);
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
private:
PHY_IVehicle* m_vehicle;
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.cpp b/source/gameengine/Ketsji/KX_VertexProxy.cpp
index 09630ad2851..5589d35f44a 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.cpp
+++ b/source/gameengine/Ketsji/KX_VertexProxy.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef DISABLE_PYTHON
+/** \file gameengine/Ketsji/KX_VertexProxy.cpp
+ * \ingroup ketsji
+ */
+
+
+#ifdef WITH_PYTHON
#include "KX_VertexProxy.h"
#include "KX_MeshProxy.h"
@@ -553,4 +558,4 @@ PyObject* KX_VertexProxy::PySetUV2(PyObject* args)
Py_RETURN_NONE;
}
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_VertexProxy.h b/source/gameengine/Ketsji/KX_VertexProxy.h
index b39d3ecb7d4..e34330ebefe 100644
--- a/source/gameengine/Ketsji/KX_VertexProxy.h
+++ b/source/gameengine/Ketsji/KX_VertexProxy.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_VertexProxy.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_VERTEXPROXY
#define __KX_VERTEXPROXY
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
#include "SCA_IObject.h"
@@ -102,7 +107,7 @@ public:
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
#endif //__KX_VERTEXPROXY
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
index e2f2badf051..6dc9961fe2d 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
@@ -28,6 +28,11 @@
* Actuator to toggle visibility/invisibility of objects
*/
+/** \file gameengine/Ketsji/KX_VisibilityActuator.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_VisibilityActuator.h"
#include "KX_GameObject.h"
@@ -79,7 +84,7 @@ KX_VisibilityActuator::Update()
return false;
}
-#ifndef DISABLE_PYTHON
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* Python functions */
@@ -121,4 +126,4 @@ PyAttributeDef KX_VisibilityActuator::Attributes[] = {
{ NULL } //Sentinel
};
-#endif // DISABLE_PYTHON
+#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_VisibilityActuator.h b/source/gameengine/Ketsji/KX_VisibilityActuator.h
index 4969dda1158..9b40aec4506 100644
--- a/source/gameengine/Ketsji/KX_VisibilityActuator.h
+++ b/source/gameengine/Ketsji/KX_VisibilityActuator.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Actuator to toggle visibility/invisibility of objects
+ */
+
+/** \file KX_VisibilityActuator.h
+ * \ingroup ketsji
+ * \brief Actuator to toggle visibility/invisibility of objects
*/
#ifndef __KX_VISIBILITYACTUATOR
diff --git a/source/gameengine/Ketsji/KX_WorldInfo.cpp b/source/gameengine/Ketsji/KX_WorldInfo.cpp
index bf059ca543c..fd83e44f793 100644
--- a/source/gameengine/Ketsji/KX_WorldInfo.cpp
+++ b/source/gameengine/Ketsji/KX_WorldInfo.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_WorldInfo.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_WorldInfo.h"
KX_WorldInfo::~KX_WorldInfo()
diff --git a/source/gameengine/Ketsji/KX_WorldInfo.h b/source/gameengine/Ketsji/KX_WorldInfo.h
index 3b3d52f91f7..35e1d50af12 100644
--- a/source/gameengine/Ketsji/KX_WorldInfo.h
+++ b/source/gameengine/Ketsji/KX_WorldInfo.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_WorldInfo.h
+ * \ingroup ketsji
+ */
+
#ifndef __KX_WORLDINFO_H
#define __KX_WORLDINFO_H
@@ -58,6 +63,7 @@ public:
virtual float getAmbientColorGreen()=0;
virtual float getAmbientColorBlue()=0;
+ virtual void setBackColor(float,float,float)=0;
virtual void setMistStart(float)=0;
virtual void setMistDistance(float)=0;
virtual void setMistColorRed(float)=0;
diff --git a/source/gameengine/Ketsji/KX_WorldIpoController.cpp b/source/gameengine/Ketsji/KX_WorldIpoController.cpp
index 476b23a5cbf..a6ad7c83b72 100644
--- a/source/gameengine/Ketsji/KX_WorldIpoController.cpp
+++ b/source/gameengine/Ketsji/KX_WorldIpoController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Ketsji/KX_WorldIpoController.cpp
+ * \ingroup ketsji
+ */
+
+
#include "KX_WorldIpoController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_WorldInfo.h"
diff --git a/source/gameengine/Ketsji/KX_WorldIpoController.h b/source/gameengine/Ketsji/KX_WorldIpoController.h
index f6c36198ae7..7771628b5bc 100644
--- a/source/gameengine/Ketsji/KX_WorldIpoController.h
+++ b/source/gameengine/Ketsji/KX_WorldIpoController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file KX_WorldIpoController.h
+ * \ingroup ketsji
+ */
+
#ifndef KX_WORLDIPOCONTROLLER_H
#define KX_WORLDIPOCONTROLLER_H
@@ -42,7 +47,7 @@ public:
private:
T_InterpolatorList m_interpolators;
- unsigned short m_modify_mist_color : 1;
+ unsigned short m_modify_mist_color : 1;
unsigned short m_modify_mist_start : 1;
unsigned short m_modify_mist_dist : 1;
bool m_modified;
diff --git a/source/gameengine/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile
deleted file mode 100644
index 79c8626d295..00000000000
--- a/source/gameengine/Ketsji/Makefile
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = ketsji
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += $(NAN_SDLCFLAGS)
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/python
-CPPFLAGS += -I../../blender/python/generic
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_AUDASPACE)/include
-
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines -I../Expressions
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Network -IKXNetwork
-CPPFLAGS += -I../Physics/common
-CPPFLAGS += -I../Physics/Dummy
-CPPFLAGS += -I../Physics/Bullet
-CPPFLAGS += -I.
-CPPFLAGS += -I../Converter
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenloader
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-ifeq ($(WITH_FFMPEG), true)
- CPPFLAGS += -DWITH_FFMPEG
-endif
-
-###########################
-
-SOURCEDIR = source/gameengine/Ketsji
-DIRS = KXNetwork
-
-include nan_subdirs.mk
-
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index 8d54452be0d..461c434ea4e 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -12,11 +12,11 @@ incs += ' #source/kernel/gen_system #intern/string #intern/guardedalloc'
incs += ' #source/gameengine/Rasterizer/RAS_OpenGLRasterizer'
incs += ' #intern/audaspace/intern #source/gameengine/Converter'
incs += ' #source/gameengine/BlenderRoutines #source/blender/imbuf #intern/moto/include'
-incs += ' #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork #source/blender/blenlib'
+incs += ' #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork #source/blender/blenlib #source/blender/blenfont'
incs += ' #source/blender/blenkernel #source/blender #source/blender/editors/include'
incs += ' #source/blender/makesdna #source/blender/python #source/gameengine/Rasterizer'
incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/gameengine/Network'
-incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common #source/gameengine/Physics/Bullet'
+incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Dummy'
incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu'
@@ -29,9 +29,14 @@ else:
defs.append('DISABLE_SDL')
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
@@ -40,4 +45,11 @@ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
if env['BF_DEBUG']:
defs.append('_DEBUG') # for Python
-env.BlenderLib ( 'bf_ketsji', sources, Split(incs), defs, libtype=['core','player'], priority=[320,45], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
+ incs += ' #source/gameengine/Physics/Bullet'
+
+env.BlenderLib ( 'ge_logic_ketsji', sources, Split(incs), defs, libtype=['core','player'], priority=[320,45], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Makefile b/source/gameengine/Makefile
deleted file mode 100644
index 0fdac2acce2..00000000000
--- a/source/gameengine/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine
-DIR = $(OCGDIR)/gameengine
-DIRS = BlenderRoutines
-DIRS += Converter
-DIRS += Expressions GameLogic Ketsji Rasterizer SceneGraph
-DIRS += Network Physics VideoTexture
-
-ifeq ($(WITH_BF_BLENDERGAMEENGINE),true)
-# DIRS += GamePlayer
-endif
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Network/CMakeLists.txt b/source/gameengine/Network/CMakeLists.txt
index 795e63b47c3..6a2b5fe841e 100644
--- a/source/gameengine/Network/CMakeLists.txt
+++ b/source/gameengine/Network/CMakeLists.txt
@@ -24,13 +24,22 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../intern/string
../../../intern/moto/include
)
-BLENDERLIB(bf_ngnetwork "${SRC}" "${INC}")
+set(SRC
+ NG_NetworkMessage.cpp
+ NG_NetworkObject.cpp
+ NG_NetworkScene.cpp
+
+ NG_NetworkDeviceInterface.h
+ NG_NetworkMessage.h
+ NG_NetworkObject.h
+ NG_NetworkScene.h
+)
+
+blender_add_lib(ge_logic_ngnetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
index e7c34f5a2a0..4cf43a1fc93 100644
--- a/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
+++ b/source/gameengine/Network/LoopBackNetwork/CMakeLists.txt
@@ -24,13 +24,17 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC NG_LoopBackNetworkDeviceInterface.cpp)
-
-SET(INC
+set(INC
.
../../../../source/kernel/gen_system
../../../../intern/string
../../../../source/gameengine/Network
)
-BLENDERLIB(bf_loopbacknetwork "${SRC}" "${INC}")
+set(SRC
+ NG_LoopBackNetworkDeviceInterface.cpp
+
+ NG_LoopBackNetworkDeviceInterface.h
+)
+
+blender_add_lib(ge_logic_loopbacknetwork "${SRC}" "${INC}")
diff --git a/source/gameengine/Network/LoopBackNetwork/Makefile b/source/gameengine/Network/LoopBackNetwork/Makefile
deleted file mode 100644
index 236c28b0f23..00000000000
--- a/source/gameengine/Network/LoopBackNetwork/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = LoopBackNetwork
-DIR = $(OCGDIR)/gameengine/Network/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I..
-CPPFLAGS += -I../../../kernel/gen_system
-
diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp
index 5ac49883e91..288dfc12ffd 100644
--- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp
+++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp
@@ -28,6 +28,11 @@
* LoopbackNetworkDeviceInterface derived from NG_NetworkDeviceInterface
*/
+/** \file gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.cpp
+ * \ingroup bgenetlb
+ */
+
+
#include "NG_LoopBackNetworkDeviceInterface.h"
#include "NG_NetworkMessage.h"
diff --git a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
index bb15c3239ee..67d0e741507 100644
--- a/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
+++ b/source/gameengine/Network/LoopBackNetwork/NG_LoopBackNetworkDeviceInterface.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * LoopbackNetworkDeviceInterface derived from NG_NetworkDeviceInterface
+ */
+
+/** \file NG_LoopBackNetworkDeviceInterface.h
+ * \ingroup bgenetlb
+ * \brief LoopbackNetworkDeviceInterface derived from NG_NetworkDeviceInterface
*/
#ifndef NG_LOOPBACKNETWORKDEVICEINTERFACE_H
#define NG_LOOPBACKNETWORKDEVICEINTERFACE_H
diff --git a/source/gameengine/Network/LoopBackNetwork/SConscript b/source/gameengine/Network/LoopBackNetwork/SConscript
index dd23e1327eb..af76065cc94 100644
--- a/source/gameengine/Network/LoopBackNetwork/SConscript
+++ b/source/gameengine/Network/LoopBackNetwork/SConscript
@@ -5,4 +5,4 @@ sources = 'NG_LoopBackNetworkDeviceInterface.cpp'
incs = '. #source/kernel/gen_system #intern/string #source/gameengine/Network'
-env.BlenderLib ( 'bf_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['core','player'], priority=[400,135] )
+env.BlenderLib ( 'ge_logic_loopbacknetwork', Split(sources), Split(incs), defines=[],libtype=['core','player'], priority=[400,135] )
diff --git a/source/gameengine/Network/Makefile b/source/gameengine/Network/Makefile
deleted file mode 100644
index 99a047c8b95..00000000000
--- a/source/gameengine/Network/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = Network
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../GameLogic
-CPPFLAGS += -I../../kernel/gen_system
-
-##############
-
-DIRS = LoopBackNetwork
-SOURCEDIR = source/gameengine/Network
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Network/NG_NetworkDeviceInterface.h b/source/gameengine/Network/NG_NetworkDeviceInterface.h
index 5925870272d..6df228680ec 100644
--- a/source/gameengine/Network/NG_NetworkDeviceInterface.h
+++ b/source/gameengine/Network/NG_NetworkDeviceInterface.h
@@ -25,10 +25,14 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * NetworkGameengine_NetworkDeviceInterface
- * Functions like (de)initialize network, get library version
+ */
+
+/** \file NG_NetworkDeviceInterface.h
+ * \ingroup bgenet
+ * \brief Functions like (de)initialize network, get library version
* To be derived by loopback and network libraries
*/
+
#ifndef NG_NETWORKDEVICEINTERFACE_H
#define NG_NETWORKDEVICEINTERFACE_H
diff --git a/source/gameengine/Network/NG_NetworkMessage.cpp b/source/gameengine/Network/NG_NetworkMessage.cpp
index cb9b25c756a..56575f91c41 100644
--- a/source/gameengine/Network/NG_NetworkMessage.cpp
+++ b/source/gameengine/Network/NG_NetworkMessage.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* generic Network Message implementation
*/
+
+/** \file gameengine/Network/NG_NetworkMessage.cpp
+ * \ingroup bgenet
+ */
+
#include "NG_NetworkMessage.h"
#include <assert.h>
diff --git a/source/gameengine/Network/NG_NetworkMessage.h b/source/gameengine/Network/NG_NetworkMessage.h
index 0d43e3c2b51..0163e18fde7 100644
--- a/source/gameengine/Network/NG_NetworkMessage.h
+++ b/source/gameengine/Network/NG_NetworkMessage.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * NetworkGame_NetworkMessage generic Network Message class
+ */
+
+/** \file NG_NetworkMessage.h
+ * \ingroup bgenet
+ * \brief generic Network Message class
*/
#ifndef NG_NETWORKMESSAGE_H
#define NG_NETWORKMESSAGE_H
diff --git a/source/gameengine/Network/NG_NetworkObject.cpp b/source/gameengine/Network/NG_NetworkObject.cpp
index 36aef6e44c8..17b40d59e00 100644
--- a/source/gameengine/Network/NG_NetworkObject.cpp
+++ b/source/gameengine/Network/NG_NetworkObject.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* NetworkGame_NetworkObject generic Network Object implementation
*/
+
+/** \file gameengine/Network/NG_NetworkObject.cpp
+ * \ingroup bgenet
+ */
+
#include "NG_NetworkObject.h"
NG_NetworkObject::NG_NetworkObject()
diff --git a/source/gameengine/Network/NG_NetworkObject.h b/source/gameengine/Network/NG_NetworkObject.h
index 7bdd25305a0..0cbb3c83779 100644
--- a/source/gameengine/Network/NG_NetworkObject.h
+++ b/source/gameengine/Network/NG_NetworkObject.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * NetworkGame_NetworkObject generic Network Object class
+ */
+
+/** \file NG_NetworkObject.h
+ * \ingroup bgenet
+ * \brief generic Network Object class
*/
#ifndef NG_NETWORKOBJECT_H
#define NG_NETWORKOBJECT_H
diff --git a/source/gameengine/Network/NG_NetworkScene.cpp b/source/gameengine/Network/NG_NetworkScene.cpp
index 976ce0d367e..b4982b332f0 100644
--- a/source/gameengine/Network/NG_NetworkScene.cpp
+++ b/source/gameengine/Network/NG_NetworkScene.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* NetworkSceneManagement generic implementation
*/
+
+/** \file gameengine/Network/NG_NetworkScene.cpp
+ * \ingroup bgenet
+ */
+
#include <stdio.h>
#include <MT_assert.h>
#include <algorithm>
diff --git a/source/gameengine/Network/NG_NetworkScene.h b/source/gameengine/Network/NG_NetworkScene.h
index 60bb0b09097..d390eabc465 100644
--- a/source/gameengine/Network/NG_NetworkScene.h
+++ b/source/gameengine/Network/NG_NetworkScene.h
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * NetworkSceneManagement generic class
+ */
+
+/** \file NG_NetworkScene.h
+ * \ingroup bgenet
+ * \brief NetworkSceneManagement generic class
*/
#ifndef __NG_NETWORKSCENE_H
#define __NG_NETWORKSCENE_H
diff --git a/source/gameengine/Network/SConscript b/source/gameengine/Network/SConscript
index 3883dc71c9c..1b63592d0a4 100644
--- a/source/gameengine/Network/SConscript
+++ b/source/gameengine/Network/SConscript
@@ -5,4 +5,10 @@ sources = env.Glob('*.cpp') #'NG_NetworkMessage.cpp NG_NetworkObject.cpp NG_Netw
incs = '. #source/kernel/gen_system #intern/string #intern/moto/include'
-env.BlenderLib ( 'bf_ngnetwork', sources, Split(incs), [], libtype=['core','player'], priority=[400,130] )
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_logic_ngnetwork', sources, Split(incs), defs, libtype=['core','player'], priority=[400,130] )
diff --git a/source/gameengine/Network/TerraplayNetwork/Makefile b/source/gameengine/Network/TerraplayNetwork/Makefile
deleted file mode 100644
index d5a4c86740b..00000000000
--- a/source/gameengine/Network/TerraplayNetwork/Makefile
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = TerraPlayNetwork
-DIR = $(OCGDIR)/gameengine/Network/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(LCGDIR)/terraplay/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I..
-
diff --git a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp
deleted file mode 100644
index 301a056f25c..00000000000
--- a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.cpp
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * TerraplayNetworkDeviceInterface derived from NG_NetworkDeviceInterface
- */
-
-#include "NG_TerraplayNetworkDeviceInterface.h"
-#include "NG_NetworkMessage.h"
-
-//---- relocate these
-void NG_TerraplayNetworkDeviceInterface::interface_error(char *str, GASResult error) {
- GASRString err_str = GAS->ErrorTranslate(error);
- if (err_str.result == GASOK)
- printf("%s: %s\n",str,err_str.ptr);
- else
- printf("%s: UNKNOWN (Error code %d)", error);
-}
-//---- END relocate these
-
-NG_TerraplayNetworkDeviceInterface::NG_TerraplayNetworkDeviceInterface()
-{
- group_id = GASCLIENTIDNULL;
- group_id_request_valid = false;
- this->Offline();
-
- if ((GAS = new GASInterface()) == NULL) {
- // terror
- printf("ERROR GAS Common Network Interface NOT created\n");
- // do something useful
- } else {
- printf("GAS Common Network Interface created\n");
- }
-}
-
-NG_TerraplayNetworkDeviceInterface::~NG_TerraplayNetworkDeviceInterface()
-{
- if (GAS != NULL) {
- delete GAS;
- printf("GAS Common Network Interface deleted\n");
- }
-}
-
-bool NG_TerraplayNetworkDeviceInterface::Connect(char *GAS_address,
- unsigned int GAS_port, char *GAS_password, unsigned int localport,
- unsigned int timeout)
-{
- GASResult result;
- printf("Establishing connection to GAS...\n");
- result = GAS->ConnectionRequest(GAS_address, GAS_port,
- GAS_password,localport, timeout);
- if (result == GASOK) {
- this->Online();
- GASRClientId client_id = GAS->Connected();
- if (client_id.result != GASOK) {
- printf("... connected, but no client ID\n");
- return false;
- } else {
- printf("Connected with client ID %d\n",
- client_id.clientid);
- return true;
- }
- } else {
- interface_error("Connection", result);
- return false;
- }
-}
-
-bool NG_TerraplayNetworkDeviceInterface::Disconnect(void)
-{
- int i = 0;
- printf("Disconnecting...\n");
- if (! this->IsOnline()) {
- printf("ehh... /me was not connected\n");
- return false;
- }
-
- GASRRequestId req = GAS->ConnectionClose();
- if (req.result != GASWAITING) {
- interface_error("ConnectionClose",req.result);
- this->~NG_TerraplayNetworkDeviceInterface();
- }
- this->Offline();
-// dit is erg fout :( ik wil helemaal geen ~NG_ hier
-
- while (true) {
- GASRMessage gas_message;
- GASResult result = GAS->GasActivity(GASBLOCK, 100);
- if (++i>5000) {
- printf("\nGiving up on waiting for connection close\n");
- this->~NG_TerraplayNetworkDeviceInterface();
- }
- switch (result) {
- case GASCONNECTIONOK:
- break;
- case GASGASMESSAGE:
- gas_message = GAS->GasMessageGetNext();
- if (gas_message.type == GASRCONNECTIONCLOSE) {
- if (gas_message.result == GASOK ||
- gas_message.result == GASALREADYDONE) {
- return true;
- } else {
- interface_error("GasMessageGetNext",
- gas_message.result);
- return false;
- }
- }
- // no break ...
- default:
- interface_error("GasActivity",result);
- }
- }
- return true;
-}
-
-STR_String NG_TerraplayNetworkDeviceInterface::GetNetworkVersion()
-{
- GASRString version = GAS->Version();
- if (version.result != GASOK) {
- interface_error("GetNetworkVersion", version.result);
- return NULL;
- } else {
- return version.ptr;
- }
-}
-
-int NG_TerraplayNetworkDeviceInterface::mytest() {
- return (3);
-}
-
-void NG_TerraplayNetworkDeviceInterface::SendNetworkMessage(NG_NetworkMessage* nwmsg)
-{
- GASPayload payload;
- GASResult result;
- STR_String mystring;
-
- if (group_id == GASCLIENTIDNULL) {
- printf("Oops, no group to send to yet\n");
- return;
- }
-
- mystring = nwmsg->GetMessageText().ReadPtr();
- payload.ptr = (void *) mystring.Ptr();
- payload.size = mystring.Length() + 1;
-
- result = GAS->ClientMessageSend(group_id, payload, GASBESTEFFORT);
-
- switch (result) {
- case GASOK:
- break;
- default:
- interface_error("ClientMessageSend",result);
- }
- // NOTE. You shall NOT free the payload with PayloadFree().
- // This is your own payload, allocated and freed by yourself
- // anyway you want.
-}
-
-vector <NG_NetworkMessage*> NG_TerraplayNetworkDeviceInterface::RetrieveNetworkMessages()
-{
-
- vector <NG_NetworkMessage*> messages;
- //todo: spend your expensive time here!
-
- return messages;
-}
diff --git a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h b/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h
deleted file mode 100644
index cc5f50e9e5e..00000000000
--- a/source/gameengine/Network/TerraplayNetwork/NG_TerraplayNetworkDeviceInterface.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- * TerraplayNetworkDeviceInterface derived from NG_NetworkDeviceInterface
- */
-#ifndef NG_TERRAPLAYNETWORKDEVICEINTERFACE_H
-#define NG_TERRAPLAYNETWORKDEVICEINTERFACE_H
-
-#include <deque>
-#include "GASInterface.h"
-#include "NG_NetworkDeviceInterface.h"
-
-class NG_TerraplayNetworkDeviceInterface : public NG_NetworkDeviceInterface
-{
- std::deque<NG_NetworkMessage*> m_messages;
-
- // Terraplay GAS stuff
- GASInterface *GAS;
- GASClientId group_id;
- GASRequestId group_id_request;
- int group_id_request_valid;
-
- void interface_error(char *str, GASResult error);
-public:
- NG_TerraplayNetworkDeviceInterface();
- ~NG_TerraplayNetworkDeviceInterface();
-
- bool Connect(char *GAS_address, unsigned int GAS_port,
- char *GAS_password, unsigned int localport,
- unsigned int timeout);
- bool Disconnect(void);
-
- void SendNetworkMessage(NG_NetworkMessage* nwmsg);
- vector<NG_NetworkMessage*> RetrieveNetworkMessages(void);
-
- int mytest(void);
-};
-
-#endif //NG_TERRAPLAYNETWORKDEVICEINTERFACE_H
-
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index 95888967b78..c677685de49 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -24,9 +24,10 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC CcdPhysicsEnvironment.cpp CcdPhysicsController.cpp CcdGraphicController.cpp)
+# since this includes bullet we get errors from the headers too
+remove_strict_flags()
-SET(INC
+set(INC
.
../common
../../../../extern/bullet2/src
@@ -43,7 +44,21 @@ SET(INC
../../../../source/blender/makesdna
../../../../source/blender/blenlib
../../../../source/blender/blenkernel
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
)
-BLENDERLIB(bf_bullet "${SRC}" "${INC}")
+set(SRC
+ CcdPhysicsEnvironment.cpp
+ CcdPhysicsController.cpp
+ CcdGraphicController.cpp
+
+ CcdGraphicController.h
+ CcdPhysicsController.h
+ CcdPhysicsEnvironment.h
+)
+
+if(WITH_BULLET)
+ add_definitions(-DUSE_BULLET)
+endif()
+
+blender_add_lib(ge_phys_bullet "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.cpp b/source/gameengine/Physics/Bullet/CcdGraphicController.cpp
index 73ac789edf7..a5577d5e7d2 100644
--- a/source/gameengine/Physics/Bullet/CcdGraphicController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdGraphicController.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Physics/Bullet/CcdGraphicController.cpp
+ * \ingroup physbullet
+ */
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
diff --git a/source/gameengine/Physics/Bullet/CcdGraphicController.h b/source/gameengine/Physics/Bullet/CcdGraphicController.h
index 97893420d79..d0cb899cb74 100644
--- a/source/gameengine/Physics/Bullet/CcdGraphicController.h
+++ b/source/gameengine/Physics/Bullet/CcdGraphicController.h
@@ -13,6 +13,10 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+/** \file CcdGraphicController.h
+ * \ingroup physbullet
+ */
+
#ifndef BULLET2_GRAPHICCONTROLLER_H
#define BULLET2_GRAPHICCONTROLLER_H
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 26265cb7e74..b67f9889ce8 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Physics/Bullet/CcdPhysicsController.cpp
+ * \ingroup physbullet
+ */
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
@@ -13,6 +16,10 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+#ifndef WIN32
+#include <stdint.h>
+#endif
+
#include "CcdPhysicsController.h"
#include "btBulletDynamicsCommon.h"
#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
@@ -1690,12 +1697,16 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
return false;
RAS_Deformer *deformer= gameobj ? gameobj->GetDeformer():NULL;
+ DerivedMesh* dm = NULL;
+
+ if (deformer)
+ dm = deformer->GetPhysicsMesh();
/* get the mesh from the object if not defined */
if(meshobj==NULL) {
/* modifier mesh */
- if(deformer && deformer->GetFinalMesh())
+ if(dm)
meshobj= deformer->GetRasMesh();
/* game object first mesh */
@@ -1706,14 +1717,12 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
}
}
- if(deformer && deformer->GetFinalMesh() && deformer->GetRasMesh() == meshobj)
+ if(dm && deformer->GetRasMesh() == meshobj)
{ /*
* Derived Mesh Update
*
* */
- DerivedMesh* dm= gameobj->GetDeformer()->GetFinalMesh();
-
MVert *mvert = dm->getVertArray(dm);
MFace *mface = dm->getTessFaceArray(dm);
numpolys = dm->getNumTessFaces(dm);
@@ -1973,6 +1982,10 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
m_meshObject= meshobj;
+ if (dm) {
+ dm->needsFree = 1;
+ dm->release(dm);
+ }
return true;
}
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index 3bbe17459c9..dc7a88e8db1 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -13,6 +13,10 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+/** \file CcdPhysicsController.h
+ * \ingroup physbullet
+ */
+
#ifndef BULLET2_PHYSICSCONTROLLER_H
#define BULLET2_PHYSICSCONTROLLER_H
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 477a2c35d4f..93f1d0962d7 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+ * \ingroup physbullet
+ */
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
@@ -287,6 +290,7 @@ void CcdPhysicsEnvironment::setDebugDrawer(btIDebugDraw* debugDrawer)
m_debugDrawer = debugDrawer;
}
+#if 0
static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVector3& to,const btVector3& color)
{
btVector3 halfExtents = (to-from)* 0.5f;
@@ -314,10 +318,8 @@ static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVec
if (i<3)
edgecoord[i]*=-1.f;
}
-
-
}
-
+#endif
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index c6e759743a9..4b97dc95179 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -13,6 +13,11 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+/** \file CcdPhysicsEnvironment.h
+ * \ingroup physbullet
+ * See also \ref bulletdoc
+ */
+
#ifndef CCDPHYSICSENVIRONMENT
#define CCDPHYSICSENVIRONMENT
@@ -47,10 +52,11 @@ class btIDebugDraw;
class PHY_IVehicle;
class CcdOverlapFilterCallBack;
-/// CcdPhysicsEnvironment is an experimental mainloop for physics simulation using optional continuous collision detection.
-/// Physics Environment takes care of stepping the simulation and is a container for physics entities.
-/// It stores rigidbodies,constraints, materials etc.
-/// A derived class may be able to 'construct' entities by loading and/or converting
+/** CcdPhysicsEnvironment is an experimental mainloop for physics simulation using optional continuous collision detection.
+ * Physics Environment takes care of stepping the simulation and is a container for physics entities.
+ * It stores rigidbodies,constraints, materials etc.
+ * A derived class may be able to 'construct' entities by loading and/or converting
+ */
class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment
{
friend class CcdOverlapFilterCallBack;
diff --git a/source/gameengine/Physics/Bullet/Makefile b/source/gameengine/Physics/Bullet/Makefile
deleted file mode 100644
index 0514565534d..00000000000
--- a/source/gameengine/Physics/Bullet/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = blbullet
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_BULLET2)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../Physics/common
-CPPFLAGS += -I../../Physics/Dummy
-CPPFLAGS += -I../../Rasterizer
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../Expressions
-CPPFLAGS += -I../../GameLogic
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I../../../../source/blender/makesdna
-CPPFLAGS += -I../../../../source/blender/blenkernel
-CPPFLAGS += -I../../../../source/blender/blenlib
-
diff --git a/source/gameengine/Physics/Bullet/SConscript b/source/gameengine/Physics/Bullet/SConscript
index f58085ab354..e00b2d21ffa 100644
--- a/source/gameengine/Physics/Bullet/SConscript
+++ b/source/gameengine/Physics/Bullet/SConscript
@@ -23,8 +23,19 @@ incs += ' ' + env['BF_BULLET_INC']
defs = []
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_BULLET']:
+ defs.append('USE_BULLET')
-env.BlenderLib ( 'bf_bullet', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,50], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_phys_bullet', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,50], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Physics/Dummy/CMakeLists.txt b/source/gameengine/Physics/Dummy/CMakeLists.txt
index 18330392cd7..fd7f37897eb 100644
--- a/source/gameengine/Physics/Dummy/CMakeLists.txt
+++ b/source/gameengine/Physics/Dummy/CMakeLists.txt
@@ -24,11 +24,15 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC DummyPhysicsEnvironment.cpp)
-
-SET(INC
+set(INC
.
../common
)
-BLENDERLIB(bf_dummy "${SRC}" "${INC}")
+set(SRC
+ DummyPhysicsEnvironment.cpp
+
+ DummyPhysicsEnvironment.h
+)
+
+blender_add_lib(ge_phys_dummy "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
index 524cffc2732..15c52410dc6 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,14 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
+ * \ingroup physdummy
+ */
+
+
+#include <stddef.h>
+
#include "DummyPhysicsEnvironment.h"
#include "PHY_IMotionState.h"
diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
index 0ad6649f2e5..b3deb181a44 100644
--- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file DummyPhysicsEnvironment.h
+ * \ingroup physdummy
+ */
+
#ifndef _DUMMYPHYSICSENVIRONMENT
#define _DUMMYPHYSICSENVIRONMENT
diff --git a/source/gameengine/Physics/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile
deleted file mode 100644
index 9a600a0365f..00000000000
--- a/source/gameengine/Physics/Dummy/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = dummy
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../Physics/common
-CPPFLAGS += -I../../Physics/Dummy
diff --git a/source/gameengine/Physics/Dummy/SConscript b/source/gameengine/Physics/Dummy/SConscript
index dc76e8046a0..13d1a893823 100644
--- a/source/gameengine/Physics/Dummy/SConscript
+++ b/source/gameengine/Physics/Dummy/SConscript
@@ -5,4 +5,10 @@ sources = 'DummyPhysicsEnvironment.cpp'
incs = '. ../common'
-env.BlenderLib ( 'bf_dummy', Split(sources), Split(incs), [], libtype=['core','player'], priority=[350,60] )
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_phys_dummy', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[350,60] )
diff --git a/source/gameengine/Physics/Makefile b/source/gameengine/Physics/Makefile
deleted file mode 100644
index f5f914c2ac2..00000000000
--- a/source/gameengine/Physics/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-include nan_definitions.mk
-
-SOURCEDIR = source/gameengine/Physics
-DIR = $(OCGDIR)/gameengine/blphys
-DIRS = common Dummy Bullet
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Physics/common/CMakeLists.txt b/source/gameengine/Physics/common/CMakeLists.txt
index 0f8f59f3b78..50aa9083089 100644
--- a/source/gameengine/Physics/common/CMakeLists.txt
+++ b/source/gameengine/Physics/common/CMakeLists.txt
@@ -24,12 +24,27 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(SRC PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp PHY_IGraphicController.cpp PHY_IPhysicsEnvironment.cpp PHY_IVehicle.cpp)
-
-SET(INC
+set(INC
.
../Dummy
- ../../../intern/moto/include
)
-BLENDERLIB(bf_common "${SRC}" "${INC}")
+set(SRC
+ PHY_IMotionState.cpp
+ PHY_IController.cpp
+ PHY_IPhysicsController.cpp
+ PHY_IGraphicController.cpp
+ PHY_IPhysicsEnvironment.cpp
+ PHY_IVehicle.cpp
+
+ PHY_DynamicTypes.h
+ PHY_IController.h
+ PHY_IGraphicController.h
+ PHY_IMotionState.h
+ PHY_IPhysicsController.h
+ PHY_IPhysicsEnvironment.h
+ PHY_IVehicle.h
+ PHY_Pro.h
+)
+
+blender_add_lib(ge_phys_common "${SRC}" "${INC}")
diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile
deleted file mode 100644
index 369699e1b90..00000000000
--- a/source/gameengine/Physics/common/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = common
-DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../blender
-# these two needed because of blenkernel
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/include
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/render/extern/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../Expressions -I../Rasterizer -I../GameLogic
-CPPFLAGS += -I../Ketsji -I../BlenderRoutines -I../SceneGraph
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Network -I../Ketsji/KXNetwork
-CPPFLAGS += -I../Physics
-CPPFLAGS += -I../Physics/Dummy
diff --git a/source/gameengine/Physics/common/PHY_DynamicTypes.h b/source/gameengine/Physics/common/PHY_DynamicTypes.h
index cc0f06a58cf..a1761131a8e 100644
--- a/source/gameengine/Physics/common/PHY_DynamicTypes.h
+++ b/source/gameengine/Physics/common/PHY_DynamicTypes.h
@@ -13,6 +13,9 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+/** \file PHY_DynamicTypes.h
+ * \ingroup phys
+ */
#ifndef __PHY_DYNAMIC_TYPES
#define __PHY_DYNAMIC_TYPES
diff --git a/source/gameengine/Physics/common/PHY_IController.cpp b/source/gameengine/Physics/common/PHY_IController.cpp
index 577e25b4336..0d484ab4a2e 100644
--- a/source/gameengine/Physics/common/PHY_IController.cpp
+++ b/source/gameengine/Physics/common/PHY_IController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Physics/common/PHY_IController.cpp
+ * \ingroup phys
+ */
+
#include "PHY_IController.h"
PHY_IController::~PHY_IController()
diff --git a/source/gameengine/Physics/common/PHY_IController.h b/source/gameengine/Physics/common/PHY_IController.h
index de2e53c3613..d3bb9fbf5bc 100644
--- a/source/gameengine/Physics/common/PHY_IController.h
+++ b/source/gameengine/Physics/common/PHY_IController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file PHY_IController.h
+ * \ingroup phys
+ */
+
#ifndef PHY_ICONTROLLER_H
#define PHY_ICONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.cpp b/source/gameengine/Physics/common/PHY_IGraphicController.cpp
index dc4b31d9a76..5f177aec155 100644
--- a/source/gameengine/Physics/common/PHY_IGraphicController.cpp
+++ b/source/gameengine/Physics/common/PHY_IGraphicController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Physics/common/PHY_IGraphicController.cpp
+ * \ingroup phys
+ */
+
#include "PHY_IGraphicController.h"
PHY_IGraphicController::~PHY_IGraphicController()
diff --git a/source/gameengine/Physics/common/PHY_IGraphicController.h b/source/gameengine/Physics/common/PHY_IGraphicController.h
index aeccdb573b4..00bb25be3e6 100644
--- a/source/gameengine/Physics/common/PHY_IGraphicController.h
+++ b/source/gameengine/Physics/common/PHY_IGraphicController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file PHY_IGraphicController.h
+ * \ingroup phys
+ */
+
#ifndef PHY_IGRAPHICCONTROLLER_H
#define PHY_IGRAPHICCONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IMotionState.cpp b/source/gameengine/Physics/common/PHY_IMotionState.cpp
index 78505231895..39f3032f478 100644
--- a/source/gameengine/Physics/common/PHY_IMotionState.cpp
+++ b/source/gameengine/Physics/common/PHY_IMotionState.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Physics/common/PHY_IMotionState.cpp
+ * \ingroup phys
+ */
+
#include "PHY_IMotionState.h"
PHY_IMotionState::~PHY_IMotionState()
diff --git a/source/gameengine/Physics/common/PHY_IMotionState.h b/source/gameengine/Physics/common/PHY_IMotionState.h
index a644bb319ae..00b4f105348 100644
--- a/source/gameengine/Physics/common/PHY_IMotionState.h
+++ b/source/gameengine/Physics/common/PHY_IMotionState.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file PHY_IMotionState.h
+ * \ingroup phys
+ */
+
#ifndef PHY__MOTIONSTATE_H
#define PHY__MOTIONSTATE_H
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.cpp b/source/gameengine/Physics/common/PHY_IPhysicsController.cpp
index 00c0bbe6477..49c830c6920 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsController.cpp
+++ b/source/gameengine/Physics/common/PHY_IPhysicsController.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Physics/common/PHY_IPhysicsController.cpp
+ * \ingroup phys
+ */
+
#include "PHY_IPhysicsController.h"
PHY_IPhysicsController::~PHY_IPhysicsController()
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsController.h b/source/gameengine/Physics/common/PHY_IPhysicsController.h
index 82baa8c47e1..eaf756d887f 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsController.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsController.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file PHY_IPhysicsController.h
+ * \ingroup phys
+ */
+
#ifndef PHY_IPHYSICSCONTROLLER_H
#define PHY_IPHYSICSCONTROLLER_H
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp
index f56dc5c0aa7..8ac2a06fb09 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Physics/common/PHY_IPhysicsEnvironment.cpp
+ * \ingroup phys
+ */
+
+
#include "PHY_IPhysicsEnvironment.h"
/**
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
index abce2769f2a..e2a9b5e99e4 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file PHY_IPhysicsEnvironment.h
+ * \ingroup phys
+ */
+
#ifndef _IPHYSICSENVIRONMENT
#define _IPHYSICSENVIRONMENT
diff --git a/source/gameengine/Physics/common/PHY_IVehicle.cpp b/source/gameengine/Physics/common/PHY_IVehicle.cpp
index 3879e83396f..a60bb3e596d 100644
--- a/source/gameengine/Physics/common/PHY_IVehicle.cpp
+++ b/source/gameengine/Physics/common/PHY_IVehicle.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Physics/common/PHY_IVehicle.cpp
+ * \ingroup phys
+ */
#include "PHY_IVehicle.h"
diff --git a/source/gameengine/Physics/common/PHY_IVehicle.h b/source/gameengine/Physics/common/PHY_IVehicle.h
index 7c00b5d0bef..da9daa29977 100644
--- a/source/gameengine/Physics/common/PHY_IVehicle.h
+++ b/source/gameengine/Physics/common/PHY_IVehicle.h
@@ -1,3 +1,8 @@
+
+/** \file PHY_IVehicle.h
+ * \ingroup phys
+ */
+
#ifndef PHY_IVEHICLE_H
#define PHY_IVEHICLE_H
diff --git a/source/gameengine/Physics/common/PHY_Pro.h b/source/gameengine/Physics/common/PHY_Pro.h
index d51992da372..4ee8d3a4293 100644
--- a/source/gameengine/Physics/common/PHY_Pro.h
+++ b/source/gameengine/Physics/common/PHY_Pro.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file PHY_Pro.h
+ * \ingroup phys
+ */
+
#ifndef PHY_PROPSH
#define PHY_PROPSH
diff --git a/source/gameengine/Physics/common/SConscript b/source/gameengine/Physics/common/SConscript
index 719c028ee8f..abff3e33121 100644
--- a/source/gameengine/Physics/common/SConscript
+++ b/source/gameengine/Physics/common/SConscript
@@ -5,4 +5,10 @@ sources = 'PHY_IMotionState.cpp PHY_IController.cpp PHY_IPhysicsController.cpp P
incs = '. ../Dummy #intern/moto/include'
-env.BlenderLib ( 'bf_physics_common', Split(sources), Split(incs), [], libtype=['core','player'], priority=[360,55], cxx_compileflags=env['BGE_CXXFLAGS'])
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+env.BlenderLib ( 'ge_phys_common', Split(sources), Split(incs), defs, libtype=['core','player'], priority=[360,55], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/PyDoc/bge.events.rst b/source/gameengine/PyDoc/bge.events.rst
deleted file mode 100644
index f642291fe97..00000000000
--- a/source/gameengine/PyDoc/bge.events.rst
+++ /dev/null
@@ -1,229 +0,0 @@
-
-Game Engine bge.events module
-=============================
-
-*****
-Intro
-*****
-
-This module holds key constants for the SCA_KeyboardSensor.
-
-.. module:: bge.events
-
-.. code-block:: python
-
- # Set a connected keyboard sensor to accept F1
- import bge
-
- co = bge.logic.getCurrentController()
- # 'Keyboard' is a keyboard sensor
- sensor = co.sensors["Keyboard"]
- sensor.key = bge.keys.F1KEY
-
-.. code-block:: python
-
- # Do the all keys thing
- import bge
-
- co = bge.logic.getCurrentController()
- # 'Keyboard' is a keyboard sensor
- sensor = co.sensors["Keyboard"]
-
- for key,status in sensor.events:
- # key[0] == bge.keys.keycode, key[1] = status
- if status == bge.logic.KX_INPUT_JUST_ACTIVATED:
- if key == bge.keys.WKEY:
- # Activate Forward!
- if key == bge.keys.SKEY:
- # Activate Backward!
- if key == bge.keys.AKEY:
- # Activate Left!
- if key == bge.keys.DKEY:
- # Activate Right!
-
-*********
-Functions
-*********
-
-.. function:: EventToString(event)
-
- Return the string name of a key event. Will raise a ValueError error if its invalid.
-
- :arg event: key event from bge.keys or the keyboard sensor.
- :type event: int
- :rtype: string
-
-.. function:: EventToCharacter(event, shift)
-
- Return the string name of a key event. Returns an empty string if the event cant be represented as a character.
-
- :type event: int
- :arg event: key event from :mod:`bge.keys` or the keyboard sensor.
- :type shift: bool
- :arg shift: set to true if shift is held.
- :rtype: string
-
-****************
-Keys (Constants)
-****************
-
-.. _mouse-keys:
-
-==========
-Mouse Keys
-==========
-
-.. data:: LEFTMOUSE
-.. data:: MIDDLEMOUSE
-.. data:: RIGHTMOUSE
-.. data:: WHEELUPMOUSE
-.. data:: WHEELDOWNMOUSE
-.. data:: MOUSEX
-.. data:: MOUSEY
-
-.. _keyboard-keys:
-
-=============
-Keyboard Keys
-=============
-
--------------
-Alphabet keys
--------------
-
-.. data:: AKEY
-.. data:: BKEY
-.. data:: CKEY
-.. data:: DKEY
-.. data:: EKEY
-.. data:: FKEY
-.. data:: GKEY
-.. data:: HKEY
-.. data:: IKEY
-.. data:: JKEY
-.. data:: KKEY
-.. data:: LKEY
-.. data:: MKEY
-.. data:: NKEY
-.. data:: OKEY
-.. data:: PKEY
-.. data:: QKEY
-.. data:: RKEY
-.. data:: SKEY
-.. data:: TKEY
-.. data:: UKEY
-.. data:: VKEY
-.. data:: WKEY
-.. data:: XKEY
-.. data:: YKEY
-.. data:: ZKEY
-
------------
-Number keys
------------
-
-.. data:: ZEROKEY
-.. data:: ONEKEY
-.. data:: TWOKEY
-.. data:: THREEKEY
-.. data:: FOURKEY
-.. data:: FIVEKEY
-.. data:: SIXKEY
-.. data:: SEVENKEY
-.. data:: EIGHTKEY
-.. data:: NINEKEY
-
---------------
-Modifiers Keys
---------------
-
-.. data:: CAPSLOCKKEY
-.. data:: LEFTCTRLKEY
-.. data:: LEFTALTKEY
-.. data:: RIGHTALTKEY
-.. data:: RIGHTCTRLKEY
-.. data:: RIGHTSHIFTKEY
-.. data:: LEFTSHIFTKEY
-
-----------
-Arrow Keys
-----------
-
-.. data:: LEFTARROWKEY
-.. data:: DOWNARROWKEY
-.. data:: RIGHTARROWKEY
-.. data:: UPARROWKEY
-
---------------
-Numberpad Keys
---------------
-
-.. data:: PAD0
-.. data:: PAD1
-.. data:: PAD2
-.. data:: PAD3
-.. data:: PAD4
-.. data:: PAD5
-.. data:: PAD6
-.. data:: PAD7
-.. data:: PAD8
-.. data:: PAD9
-.. data:: PADPERIOD
-.. data:: PADSLASHKEY
-.. data:: PADASTERKEY
-.. data:: PADMINUS
-.. data:: PADENTER
-.. data:: PADPLUSKEY
-
--------------
-Function Keys
--------------
-
-.. data:: F1KEY
-.. data:: F2KEY
-.. data:: F3KEY
-.. data:: F4KEY
-.. data:: F5KEY
-.. data:: F6KEY
-.. data:: F7KEY
-.. data:: F8KEY
-.. data:: F9KEY
-.. data:: F10KEY
-.. data:: F11KEY
-.. data:: F12KEY
-.. data:: F13KEY
-.. data:: F14KEY
-.. data:: F15KEY
-.. data:: F16KEY
-.. data:: F17KEY
-.. data:: F18KEY
-.. data:: F19KEY
-
-----------
-Other Keys
-----------
-
-.. data:: ACCENTGRAVEKEY
-.. data:: BACKSLASHKEY
-.. data:: BACKSPACEKEY
-.. data:: COMMAKEY
-.. data:: DELKEY
-.. data:: ENDKEY
-.. data:: EQUALKEY
-.. data:: ESCKEY
-.. data:: HOMEKEY
-.. data:: INSERTKEY
-.. data:: LEFTBRACKETKEY
-.. data:: LINEFEEDKEY
-.. data:: MINUSKEY
-.. data:: PAGEDOWNKEY
-.. data:: PAGEUPKEY
-.. data:: PAUSEKEY
-.. data:: PERIODKEY
-.. data:: QUOTEKEY
-.. data:: RIGHTBRACKETKEY
-.. data:: RETKEY
-.. data:: SEMICOLONKEY
-.. data:: SLASHKEY
-.. data:: SPACEKEY
-.. data:: TABKEY
diff --git a/source/gameengine/PyDoc/bge.logic.rst b/source/gameengine/PyDoc/bge.logic.rst
deleted file mode 100644
index a7eb5635d0f..00000000000
--- a/source/gameengine/PyDoc/bge.logic.rst
+++ /dev/null
@@ -1,932 +0,0 @@
-
-Game Engine bge.logic Module
-============================
-*****
-Intro
-*****
-
-Module to access logic functions, imported automatically into the python controllers namespace.
-
-.. module:: bge.logic
-
-.. code-block:: python
-
- # To get the controller thats running this python script:
- cont = bge.logic.getCurrentController() # bge.logic is automatically imported
-
- # To get the game object this controller is on:
- obj = cont.owner
-
-:class:`~bge.types.KX_GameObject` and :class:`~bge.types.KX_Camera` or :class:`bge.types.~KX_LightObject` methods are available depending on the type of object
-
-.. code-block:: python
-
- # To get a sensor linked to this controller.
- # "sensorname" is the name of the sensor as defined in the Blender interface.
- # +---------------------+ +--------+
- # | Sensor "sensorname" +--+ Python +
- # +---------------------+ +--------+
- sens = cont.sensors["sensorname"]
-
- # To get a sequence of all sensors:
- sensors = co.sensors
-
-See the sensor's reference for available methods:
-
-.. hlist::
- :columns: 3
-
- * :class:`~bge.types.KX_MouseFocusSensor`
- * :class:`~bge.types.KX_NearSensor`
- * :class:`~bge.types.KX_NetworkMessageSensor`
- * :class:`~bge.types.KX_RadarSensor`
- * :class:`~bge.types.KX_RaySensor`
- * :class:`~bge.types.KX_TouchSensor`
- * :class:`~bge.types.SCA_DelaySensor`
- * :class:`~bge.types.SCA_JoystickSensor`
- * :class:`~bge.types.SCA_KeyboardSensor`
- * :class:`~bge.types.SCA_MouseSensor`
- * :class:`~bge.types.SCA_PropertySensor`
- * :class:`~bge.types.SCA_RandomSensor`
-
-You can also access actuators linked to the controller
-
-.. code-block:: python
-
- # To get an actuator attached to the controller:
- # +--------+ +-------------------------+
- # + Python +--+ Actuator "actuatorname" |
- # +--------+ +-------------------------+
- actuator = co.actuators["actuatorname"]
-
- # Activate an actuator
- controller.activate(actuator)
-
-See the actuator's reference for available methods
-
-.. hlist::
- :columns: 3
-
- * :class:`~bge.types.BL_ActionActuator`
- * :class:`~bge.types.BL_ShapeActionActuator`
- * :class:`~bge.types.KX_CameraActuator`
- * :class:`~bge.types.KX_ConstraintActuator`
- * :class:`~bge.types.KX_GameActuator`
- * :class:`~bge.types.KX_IpoActuator`
- * :class:`~bge.types.KX_NetworkMessageActuator`
- * :class:`~bge.types.KX_ObjectActuator`
- * :class:`~bge.types.KX_ParentActuator`
- * :class:`~bge.types.KX_SCA_AddObjectActuator`
- * :class:`~bge.types.KX_SCA_DynamicActuator`
- * :class:`~bge.types.KX_SCA_EndObjectActuator`
- * :class:`~bge.types.KX_SCA_ReplaceMeshActuator`
- * :class:`~bge.types.KX_SceneActuator`
- * :class:`~bge.types.KX_SoundActuator`
- * :class:`~bge.types.KX_StateActuator`
- * :class:`~bge.types.KX_TrackToActuator`
- * :class:`~bge.types.KX_VisibilityActuator`
- * :class:`~bge.types.SCA_2DFilterActuator`
- * :class:`~bge.types.SCA_PropertyActuator`
- * :class:`~bge.types.SCA_RandomActuator`
-
-Most logic brick's methods are accessors for the properties available in the logic buttons.
-Consult the logic bricks documentation for more information on how each logic brick works.
-
-There are also methods to access the current :class:`bge.types.KX_Scene`
-
-.. code-block:: python
-
- # Get the current scene
- scene = bge.logic.getCurrentScene()
-
- # Get the current camera
- cam = scene.active_camera
-
-Matricies as used by the game engine are **row major**
-``matrix[row][col] = float``
-
-:class:`bge.types.KX_Camera` has some examples using matricies.
-
-*********
-Variables
-*********
-
-.. data:: globalDict
-
- A dictionary that is saved between loading blend files so you can use it to store inventory and other variables you want to store between scenes and blend files.
- It can also be written to a file and loaded later on with the game load/save actuators.
-
- .. note:: only python built in types such as int/string/bool/float/tuples/lists can be saved, GameObjects, Actuators etc will not work as expected.
-
-.. data:: keyboard
-
- The current keyboard wrapped in an :class:`~bge.types.SCA_PythonKeyboard` object.
-
-.. data:: mouse
-
- The current mouse wrapped in an :class:`~bge.types.SCA_PythonMouse` object.
-
-*****************
-General functions
-*****************
-
-.. function:: getCurrentController()
-
- Gets the Python controller associated with this Python script.
-
- :rtype: :class:`bge.types.SCA_PythonController`
-
-.. function:: getCurrentScene()
-
- Gets the current Scene.
-
- :rtype: :class:`bge.types.KX_Scene`
-
-.. function:: getSceneList()
-
- Gets a list of the current scenes loaded in the game engine.
-
- :rtype: list of :class:`bge.types.KX_Scene`
-
- .. note:: Scenes in your blend file that have not been converted wont be in this list. This list will only contain scenes such as overlays scenes.
-
-.. function:: loadGlobalDict()
-
- Loads bge.logic.globalDict from a file.
-
-.. function:: saveGlobalDict()
-
- Saves bge.logic.globalDict to a file.
-
-.. function:: startGame(blend)
-
- Loads the blend file.
-
- :arg blend: The name of the blend file
- :type blend: string
-
-.. function:: endGame()
-
- Ends the current game.
-
-.. function:: restartGame()
-
- Restarts the current game by reloading the .blend file (the last saved version, not what is currently running).
-
-.. function:: LibLoad(blend, type, data)
-
- Converts the all of the datablocks of the given type from the given blend.
-
- :arg blend: The path to the blend file (or the name to use for the library if data is supplied)
- :type blend: string
- :arg type: The datablock type (currently only "Scene" and "Mesh" are supported)
- :type type: string
- :arg data: Binary data from a blend file (optional)
- :type data: bytes
-
-.. function:: LibNew(name, type, data)
-
- Uses existing datablock data and loads in as a new library.
-
- :arg name: A unique library name used for removal later
- :type name: string
- :arg type: The datablock type (currently only "Mesh" is supported)
- :type type: string
- :arg data: A list of names of the datablocks to load
- :type data: list of strings
-
-.. function:: LibFree(name)
-
- Frees a library, removing all objects and meshes from the currently active scenes.
-
- :arg name: The name of the library to free (the name used in LibNew)
- :type name: string
-
-.. function:: addScene(name, overlay=1)
-
- Loads a scene into the game engine.
-
- :arg name: The name of the scene
- :type name: string
- :arg overlay: Overlay or underlay (optional)
- :type overlay: integer
-
-.. function:: sendMessage(subject, body="", to="", message_from="")
-
- Sends a message to sensors in any active scene.
-
- :arg subject: The subject of the message
- :type subject: string
- :arg body: The body of the message (optional)
- :type body: string
- :arg to: The name of the object to send the message to (optional)
- :type to: string
- :arg message_from: The name of the object that the message is coming from (optional)
- :type message_from: string
-
-.. function:: setGravity(gravity)
-
- Sets the world gravity.
-
- :type gravity: list [fx, fy, fz]
-
-.. function:: getSpectrum()
-
- Returns a 512 point list from the sound card.
- This only works if the fmod sound driver is being used.
-
- :rtype: list [float], len(getSpectrum()) == 512
-
-.. function:: stopDSP()
-
- Stops the sound driver using DSP effects.
-
- Only the fmod sound driver supports this.
- DSP can be computationally expensive.
-
-.. function:: getMaxLogicFrame()
-
- Gets the maximum number of logic frames per render frame.
-
- :return: The maximum number of logic frames per render frame
- :rtype: integer
-
-.. function:: setMaxLogicFrame(maxlogic)
-
- Sets the maximum number of logic frames that are executed per render frame.
- This does not affect the physic system that still runs at full frame rate.
-
- :arg maxlogic: The new maximum number of logic frames per render frame. Valid values: 1..5
- :type maxlogic: integer
-
-.. function:: getMaxPhysicsFrame()
-
- Gets the maximum number of physics frames per render frame.
-
- :return: The maximum number of physics frames per render frame
- :rtype: integer
-
-.. function:: setMaxPhysicsFrame(maxphysics)
-
- Sets the maximum number of physics timestep that are executed per render frame.
- Higher value allows physics to keep up with realtime even if graphics slows down the game.
- Physics timestep is fixed and equal to 1/tickrate (see setLogicTicRate)
- maxphysics/ticrate is the maximum delay of the renderer that physics can compensate.
-
- :arg maxphysics: The new maximum number of physics timestep per render frame. Valid values: 1..5.
- :type maxphysics: integer
-
-.. function:: getLogicTicRate()
-
- Gets the logic update frequency.
-
- :return: The logic frequency in Hz
- :rtype: float
-
-.. function:: setLogicTicRate(ticrate)
-
- Sets the logic update frequency.
-
- The logic update frequency is the number of times logic bricks are executed every second.
- The default is 60 Hz.
-
- :arg ticrate: The new logic update frequency (in Hz).
- :type ticrate: float
-
-.. function:: getPhysicsTicRate()
-
- Gets the physics update frequency
-
- :return: The physics update frequency in Hz
- :rtype: float
-
- .. warning: Not implimented yet
-
-.. function:: setPhysicsTicRate(ticrate)
-
- Sets the physics update frequency
-
- The physics update frequency is the number of times the physics system is executed every second.
- The default is 60 Hz.
-
- :arg ticrate: The new update frequency (in Hz).
- :type ticrate: float
-
- .. warning: Not implimented yet
-
-*****************
-Utility functions
-*****************
-
-.. function:: expandPath(path)
-
- Converts a blender internal path into a proper file system path.
-
- Use / as directory separator in path
- You can use '//' at the start of the string to define a relative path;
- Blender replaces that string by the directory of the startup .blend or runtime file
- to make a full path name (doesn't change during the game, even if you load other .blend).
- The function also converts the directory separator to the local file system format.
-
- :arg path: The path string to be converted/expanded.
- :type path: string
- :return: The converted string
- :rtype: string
-
-.. function:: getAverageFrameRate()
-
- Gets the estimated average framerate
-
- :return: The estimed average framerate in frames per second
- :rtype: float
-
-.. function:: getBlendFileList(path = "//")
-
- Returns a list of blend files in the same directory as the open blend file, or from using the option argument.
-
- :arg path: Optional directory argument, will be expanded (like expandPath) into the full path.
- :type path: string
- :return: A list of filenames, with no directory prefix
- :rtype: list
-
-.. function:: getRandomFloat()
-
- Returns a random floating point value in the range [0 - 1)
-
-.. function:: PrintGLInfo()
-
- Prints GL Extension Info into the console
-
-*********
-Constants
-*********
-
-.. data:: KX_TRUE
-
- True value used by some modules.
-
-.. data:: KX_FALSE
-
- False value used by some modules.
-
-=======
-Sensors
-=======
-
-.. _sensor-status:
-
--------------
-Sensor Status
--------------
-
-.. data:: KX_SENSOR_INACTIVE
-.. data:: KX_SENSOR_JUST_ACTIVATED
-.. data:: KX_SENSOR_ACTIVE
-.. data:: KX_SENSOR_JUST_DEACTIVATED
-
-.. _logic-property-sensor:
-
----------------
-Property Sensor
----------------
-
-.. data:: KX_PROPSENSOR_EQUAL
-
- Activate when the property is equal to the sensor value.
-
- :value: 1
-
-.. data:: KX_PROPSENSOR_NOTEQUAL
-
- Activate when the property is not equal to the sensor value.
-
- :value: 2
-
-.. data:: KX_PROPSENSOR_INTERVAL
-
- Activate when the property is between the specified limits.
-
- :value: 3
-
-.. data:: KX_PROPSENSOR_CHANGED
-
- Activate when the property changes
-
- :value: 4
-
-.. data:: KX_PROPSENSOR_EXPRESSION
-
- Activate when the expression matches
-
- :value: 5
-
-------------
-Radar Sensor
-------------
-
-See :class:`bge.types.KX_RadarSensor`
-
-.. data:: KX_RADAR_AXIS_POS_X
-.. data:: KX_RADAR_AXIS_POS_Y
-.. data:: KX_RADAR_AXIS_POS_Z
-.. data:: KX_RADAR_AXIS_NEG_X
-.. data:: KX_RADAR_AXIS_NEG_Y
-.. data:: KX_RADAR_AXIS_NEG_Z
-
-----------
-Ray Sensor
-----------
-
-See :class:`bge.types.KX_RaySensor`
-
-.. data:: KX_RAY_AXIS_POS_X
-.. data:: KX_RAY_AXIS_POS_Y
-.. data:: KX_RAY_AXIS_POS_Z
-.. data:: KX_RAY_AXIS_NEG_X
-.. data:: KX_RAY_AXIS_NEG_Y
-.. data:: KX_RAY_AXIS_NEG_Z
-
-
-=========
-Actuators
-=========
-
-.. _action-actuator:
-
----------------
-Action Actuator
----------------
-
-See :class:`bge.types.BL_ActionActuator`
-
-.. data:: KX_ACTIONACT_PLAY
-.. data:: KX_ACTIONACT_FLIPPER
-.. data:: KX_ACTIONACT_LOOPSTOP
-.. data:: KX_ACTIONACT_LOOPEND
-.. data:: KX_ACTIONACT_PROPERTY
-
--------------------
-Constraint Actuator
--------------------
-
-.. _constraint-actuator-option:
-
-See :class:`bge.types.KX_ConstraintActuator.option`
-
-* Applicable to Distance constraint:
-
- .. data:: KX_ACT_CONSTRAINT_NORMAL
-
- Activate alignment to surface
-
- .. data:: KX_ACT_CONSTRAINT_DISTANCE
-
- Activate distance control
-
- .. data:: KX_ACT_CONSTRAINT_LOCAL
-
- Direction of the ray is along the local axis
-
-* Applicable to Force field constraint:
-
- .. data:: KX_ACT_CONSTRAINT_DOROTFH
-
- Force field act on rotation as well
-
-* Applicable to both:
-
- .. data:: KX_ACT_CONSTRAINT_MATERIAL
-
- Detect material rather than property
-
- .. data:: KX_ACT_CONSTRAINT_PERMANENT
-
- No deactivation if ray does not hit target
-
-.. _constraint-actuator-limit:
-
-See :class:`bge.types.KX_ConstraintActuator.limit`
-
-.. data:: KX_CONSTRAINTACT_LOCX
-
- Limit X coord.
-
-.. data:: KX_CONSTRAINTACT_LOCY
-
- Limit Y coord
-
-.. data:: KX_CONSTRAINTACT_LOCZ
-
- Limit Z coord
-
-.. data:: KX_CONSTRAINTACT_ROTX
-
- Limit X rotation
-
-.. data:: KX_CONSTRAINTACT_ROTY
-
- Limit Y rotation
-
-.. data:: KX_CONSTRAINTACT_ROTZ
-
- Limit Z rotation
-
-.. data:: KX_CONSTRAINTACT_DIRNX
-
- Set distance along negative X axis
-
-.. data:: KX_CONSTRAINTACT_DIRNY
-
- Set distance along negative Y axis
-
-.. data:: KX_CONSTRAINTACT_DIRNZ
-
- Set distance along negative Z axis
-
-.. data:: KX_CONSTRAINTACT_DIRPX
-
- Set distance along positive X axis
-
-.. data:: KX_CONSTRAINTACT_DIRPY
-
- Set distance along positive Y axis
-
-.. data:: KX_CONSTRAINTACT_DIRPZ
-
- Set distance along positive Z axis
-
-.. data:: KX_CONSTRAINTACT_ORIX
-
- Set orientation of X axis
-
-.. data:: KX_CONSTRAINTACT_ORIY
-
- Set orientation of Y axis
-
-.. data:: KX_CONSTRAINTACT_ORIZ
-
- Set orientation of Z axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNX
-
- Set force field along negative X axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNY
-
- Set force field along negative Y axis
-
-.. data:: KX_ACT_CONSTRAINT_FHNZ
-
- Set force field along negative Z axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPX
-
- Set force field along positive X axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPY
-
- Set force field along positive Y axis
-
-.. data:: KX_ACT_CONSTRAINT_FHPZ
-
- Set force field along positive Z axis
-
-----------------
-Dynamic Actuator
-----------------
-
-See :class:`bge.types.KX_SCA_DynamicActuator`
-
-.. data:: KX_DYN_RESTORE_DYNAMICS
-.. data:: KX_DYN_DISABLE_DYNAMICS
-.. data:: KX_DYN_ENABLE_RIGID_BODY
-.. data:: KX_DYN_DISABLE_RIGID_BODY
-.. data:: KX_DYN_SET_MASS
-
-.. _game-actuator:
-
--------------
-Game Actuator
--------------
-
-See :class:`bge.types.KX_GameActuator`
-
-.. data:: KX_GAME_LOAD
-.. data:: KX_GAME_START
-.. data:: KX_GAME_RESTART
-.. data:: KX_GAME_QUIT
-.. data:: KX_GAME_SAVECFG
-.. data:: KX_GAME_LOADCFG
-
-.. _ipo-actuator:
-
-------------
-IPO Actuator
-------------
-
-See :class:`bge.types.KX_IpoActuator`
-
-.. data:: KX_IPOACT_PLAY
-.. data:: KX_IPOACT_PINGPONG
-.. data:: KX_IPOACT_FLIPPER
-.. data:: KX_IPOACT_LOOPSTOP
-.. data:: KX_IPOACT_LOOPEND
-.. data:: KX_IPOACT_FROM_PROP
-
----------------
-Parent Actuator
----------------
-
-.. data:: KX_PARENT_REMOVE
-.. data:: KX_PARENT_SET
-
-.. _logic-random-distributions:
-
---------------------
-Random Distributions
---------------------
-
-See :class:`bge.types.SCA_RandomActuator`
-
-.. data:: KX_RANDOMACT_BOOL_CONST
-.. data:: KX_RANDOMACT_BOOL_UNIFORM
-.. data:: KX_RANDOMACT_BOOL_BERNOUILLI
-.. data:: KX_RANDOMACT_INT_CONST
-.. data:: KX_RANDOMACT_INT_UNIFORM
-.. data:: KX_RANDOMACT_INT_POISSON
-.. data:: KX_RANDOMACT_FLOAT_CONST
-.. data:: KX_RANDOMACT_FLOAT_UNIFORM
-.. data:: KX_RANDOMACT_FLOAT_NORMAL
-.. data:: KX_RANDOMACT_FLOAT_NEGATIVE_EXPONENTIAL
-
---------------
-Scene Actuator
---------------
-
-See :class:`bge.types.KX_SceneActuator`
-
-.. data:: KX_SCENE_RESTART
-.. data:: KX_SCENE_SET_SCENE
-.. data:: KX_SCENE_SET_CAMERA
-.. data:: KX_SCENE_ADD_FRONT_SCENE
-.. data:: KX_SCENE_ADD_BACK_SCENE
-.. data:: KX_SCENE_REMOVE_SCENE
-.. data:: KX_SCENE_SUSPEND
-.. data:: KX_SCENE_RESUME
-
-.. _shape-action-actuator:
-
----------------------
-Shape Action Actuator
----------------------
-
-See :class:`bge.types.BL_ActionActuator`
-
-.. data:: KX_ACTIONACT_PLAY
-.. data:: KX_ACTIONACT_FLIPPER
-.. data:: KX_ACTIONACT_LOOPSTOP
-.. data:: KX_ACTIONACT_LOOPEND
-.. data:: KX_ACTIONACT_PROPERTY
-
-.. _logic-sound-actuator:
-
---------------
-Sound Actuator
---------------
-
-See :class:`bge.types.KX_SoundActuator`
-
-.. data:: KX_SOUNDACT_PLAYSTOP
-
- :value: 1
-
-.. data:: KX_SOUNDACT_PLAYEND
-
- :value: 2
-
-.. data:: KX_SOUNDACT_LOOPSTOP
-
- :value: 3
-
-.. data:: KX_SOUNDACT_LOOPEND
-
- :value: 4
-
-.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL
-
- :value: 5
-
-.. data:: KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP
-
- :value: 6
-
-
-=======
-Various
-=======
-
-.. _input-status:
-
-------------
-Input Status
-------------
-
-See :class:`bge.types.SCA_PythonKeyboard`, :class:`bge.types.SCA_PythonMouse`, :class:`bge.types.SCA_MouseSensor`, :class:`bge.types.SCA_KeyboardSensor`
-
-.. data:: KX_INPUT_NONE
-.. data:: KX_INPUT_JUST_ACTIVATED
-.. data:: KX_INPUT_ACTIVE
-.. data:: KX_INPUT_JUST_RELEASED
-
--------------
-Mouse Buttons
--------------
-
-See :class:`bge.types.SCA_MouseSensor`
-
-.. data:: KX_MOUSE_BUT_LEFT
-.. data:: KX_MOUSE_BUT_MIDDLE
-.. data:: KX_MOUSE_BUT_RIGHT
-
-------
-States
-------
-
-See :class:`bge.types.KX_StateActuator`
-
-.. data:: KX_STATE1
-.. data:: KX_STATE2
-.. data:: KX_STATE3
-.. data:: KX_STATE4
-.. data:: KX_STATE5
-.. data:: KX_STATE6
-.. data:: KX_STATE7
-.. data:: KX_STATE8
-.. data:: KX_STATE9
-.. data:: KX_STATE10
-.. data:: KX_STATE11
-.. data:: KX_STATE12
-.. data:: KX_STATE13
-.. data:: KX_STATE14
-.. data:: KX_STATE15
-.. data:: KX_STATE16
-.. data:: KX_STATE17
-.. data:: KX_STATE18
-.. data:: KX_STATE19
-.. data:: KX_STATE20
-.. data:: KX_STATE21
-.. data:: KX_STATE22
-.. data:: KX_STATE23
-.. data:: KX_STATE24
-.. data:: KX_STATE25
-.. data:: KX_STATE26
-.. data:: KX_STATE27
-.. data:: KX_STATE28
-.. data:: KX_STATE29
-.. data:: KX_STATE30
-
-.. _state-actuator-operation:
-
-See :class:`bge.types.KX_StateActuator.operation`
-
-.. data:: KX_STATE_OP_CLR
-
- Substract bits to state mask
-
- :value: 0
-
-.. data:: KX_STATE_OP_CPY
-
- Copy state mask
-
- :value: 1
-
-.. data:: KX_STATE_OP_NEG
-
- Invert bits to state mask
-
- :value: 2
-
-.. data:: KX_STATE_OP_SET
-
- Add bits to state mask
-
- :value: 3
-
-.. _Two-D-FilterActuator-mode:
-
----------
-2D Filter
----------
-
-.. data:: RAS_2DFILTER_BLUR
-
- :value: 2
-
-.. data:: RAS_2DFILTER_CUSTOMFILTER
-
- Customer filter, the code code is set via shaderText property.
-
- :value: 12
-
-.. data:: RAS_2DFILTER_DILATION
-
- :value: 4
-
-.. data:: RAS_2DFILTER_DISABLED
-
- Disable the filter that is currently active
-
- :value: -1
-
-.. data:: RAS_2DFILTER_ENABLED
-
- Enable the filter that was previously disabled
-
- :value: -2
-
-.. data:: RAS_2DFILTER_EROSION
-
- :value: 5
-
-.. data:: RAS_2DFILTER_GRAYSCALE
-
- :value: 9
-
-.. data:: RAS_2DFILTER_INVERT
-
- :value: 11
-
-.. data:: RAS_2DFILTER_LAPLACIAN
-
- :value: 6
-
-.. data:: RAS_2DFILTER_MOTIONBLUR
-
- Create and enable preset filters
-
- :value: 1
-
-.. data:: RAS_2DFILTER_NOFILTER
-
- Disable and destroy the filter that is currently active
-
- :value: 0
-
-.. data:: RAS_2DFILTER_PREWITT
-
- :value: 8
-
-.. data:: RAS_2DFILTER_SEPIA
-
- :value: 10
-
-.. data:: RAS_2DFILTER_SHARPEN
-
- :value: 3
-
-.. data:: RAS_2DFILTER_SOBEL
-
- :value: 7
-
-------
-Shader
-------
-
-.. data:: VIEWMATRIX
-.. data:: VIEWMATRIX_INVERSE
-.. data:: VIEWMATRIX_INVERSETRANSPOSE
-.. data:: VIEWMATRIX_TRANSPOSE
-.. data:: MODELMATRIX
-.. data:: MODELMATRIX_INVERSE
-.. data:: MODELMATRIX_INVERSETRANSPOSE
-.. data:: MODELMATRIX_TRANSPOSE
-.. data:: MODELVIEWMATRIX
-.. data:: MODELVIEWMATRIX_INVERSE
-.. data:: MODELVIEWMATRIX_INVERSETRANSPOSE
-.. data:: MODELVIEWMATRIX_TRANSPOSE
-.. data:: CAM_POS
-
- Current camera position
-
-.. data:: CONSTANT_TIMER
-
- User a timer for the uniform value.
-
-.. data:: SHD_TANGENT
-
-----------------
-Blender Material
-----------------
-
-.. data:: BL_DST_ALPHA
-.. data:: BL_DST_COLOR
-.. data:: BL_ONE
-.. data:: BL_ONE_MINUS_DST_ALPHA
-.. data:: BL_ONE_MINUS_DST_COLOR
-.. data:: BL_ONE_MINUS_SRC_ALPHA
-.. data:: BL_ONE_MINUS_SRC_COLOR
-.. data:: BL_SRC_ALPHA
-.. data:: BL_SRC_ALPHA_SATURATE
-.. data:: BL_SRC_COLOR
-.. data:: BL_ZERO
diff --git a/source/gameengine/PyDoc/bge.render.rst b/source/gameengine/PyDoc/bge.render.rst
deleted file mode 100644
index 9f17455601b..00000000000
--- a/source/gameengine/PyDoc/bge.render.rst
+++ /dev/null
@@ -1,242 +0,0 @@
-
-Game Engine bge.render Module
-=============================
-
-*****
-Intro
-*****
-
-.. module:: bge.render
-
-.. code-block:: python
-
- # Example Uses an L{SCA_MouseSensor}, and two L{KX_ObjectActuator}s to implement MouseLook::
- # To use a mouse movement sensor "Mouse" and a
- # motion actuator to mouse look:
- import bge.render
- import bge.logic
-
- # SCALE sets the speed of motion
- SCALE=[1, 0.5]
-
- co = bge.logic.getCurrentController()
- obj = co.getOwner()
- mouse = co.getSensor("Mouse")
- lmotion = co.getActuator("LMove")
- wmotion = co.getActuator("WMove")
-
- # Transform the mouse coordinates to see how far the mouse has moved.
- def mousePos():
- x = (bge.render.getWindowWidth()/2 - mouse.getXPosition())*SCALE[0]
- y = (bge.render.getWindowHeight()/2 - mouse.getYPosition())*SCALE[1]
- return (x, y)
-
- pos = mousePos()
-
- # Set the amount of motion: X is applied in world coordinates...
- lmotion.setTorque(0.0, 0.0, pos[0], False)
- # ...Y is applied in local coordinates
- wmotion.setTorque(-pos[1], 0.0, 0.0, True)
-
- # Activate both actuators
- bge.logic.addActiveActuator(lmotion, True)
- bge.logic.addActiveActuator(wmotion, True)
-
- # Centre the mouse
- bge.render.setMousePosition(bge.render.getWindowWidth()/2, bge.render.getWindowHeight()/2)
-
-*********
-Constants
-*********
-
-.. data:: KX_TEXFACE_MATERIAL
-
- Materials as defined by the texture face settings.
-
-.. data:: KX_BLENDER_MULTITEX_MATERIAL
-
- Materials approximating blender materials with multitexturing.
-
-.. data:: KX_BLENDER_GLSL_MATERIAL
-
- Materials approximating blender materials with GLSL.
-
-*********
-Functions
-*********
-
-.. function:: getWindowWidth()
-
- Gets the width of the window (in pixels)
-
- :rtype: integer
-
-.. function:: getWindowHeight()
-
- Gets the height of the window (in pixels)
-
- :rtype: integer
-
-.. function:: makeScreenshot(filename)
-
- Writes a screenshot to the given filename.
-
- If filename starts with // the image will be saved relative to the current directory.
- If the filename contains # it will be replaced with the frame number.
-
- The standalone player saves .png files. It does not support colour space conversion
- or gamma correction.
-
- When run from Blender, makeScreenshot supports Iris, IrisZ, TGA, Raw TGA, PNG, HamX, and Jpeg.
- Gamma, Colourspace conversion and Jpeg compression are taken from the Render settings panels.
-
- :type filename: string
-
-
-.. function:: enableVisibility(visible)
-
- Doesn't really do anything...
-
-
-.. function:: showMouse(visible)
-
- Enables or disables the operating system mouse cursor.
-
- :type visible: boolean
-
-
-.. function:: setMousePosition(x, y)
-
- Sets the mouse cursor position.
-
- :type x: integer
- :type y: integer
-
-
-.. function:: setBackgroundColor(rgba)
-
- Sets the window background colour.
-
- :type rgba: list [r, g, b, a]
-
-
-.. function:: setMistColor(rgb)
-
- Sets the mist colour.
-
- :type rgb: list [r, g, b]
-
-
-.. function:: setAmbientColor(rgb)
-
- Sets the color of ambient light.
-
- :type rgb: list [r, g, b]
-
-
-.. function:: setMistStart(start)
-
- Sets the mist start value. Objects further away than start will have mist applied to them.
-
- :type start: float
-
-
-.. function:: setMistEnd(end)
-
- Sets the mist end value. Objects further away from this will be coloured solid with
- the colour set by setMistColor().
-
- :type end: float
-
-
-.. function:: disableMist()
-
- Disables mist.
-
- .. note:: Set any of the mist properties to enable mist.
-
-
-.. function:: setEyeSeparation(eyesep)
-
- Sets the eye separation for stereo mode. Usually Focal Length/30 provides a confortable value.
-
- :arg eyesep: The distance between the left and right eye.
- :type eyesep: float
-
-
-.. function:: getEyeSeparation()
-
- Gets the current eye separation for stereo mode.
-
- :rtype: float
-
-
-.. function:: setFocalLength(focallength)
-
- Sets the focal length for stereo mode. It uses the current camera focal length as initial value.
-
- :arg focallength: The focal length.
- :type focallength: float
-
-.. function:: getFocalLength()
-
- Gets the current focal length for stereo mode.
-
- :rtype: float
-
-.. function:: setMaterialMode(mode)
-
- Set the material mode to use for OpenGL rendering.
-
- :type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
-
- .. note:: Changes will only affect newly created scenes.
-
-
-.. function:: getMaterialMode(mode)
-
- Get the material mode to use for OpenGL rendering.
-
- :rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
-
-
-.. function:: setGLSLMaterialSetting(setting, enable)
-
- Enables or disables a GLSL material setting.
-
- :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
- :type enable: boolean
-
-
-.. function:: getGLSLMaterialSetting(setting, enable)
-
- Get the state of a GLSL material setting.
-
- :type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
- :rtype: boolean
-
-
-.. function:: drawLine(fromVec,toVec,color)
-
- Draw a line in the 3D scene.
-
- :arg fromVec: the origin of the line
- :type fromVec: list [x, y, z]
- :arg toVec: the end of the line
- :type toVec: list [x, y, z]
- :arg color: the color of the line
- :type color: list [r, g, b]
-
-
-.. function:: enableMotionBlur(factor)
-
- Enable the motion blur effect.
-
- :arg factor: the ammount of motion blur to display.
- :type factor: float [0.0 - 1.0]
-
-
-.. function:: disableMotionBlur()
-
- Disable the motion blur effect.
-
diff --git a/source/gameengine/PyDoc/bge.types.rst b/source/gameengine/PyDoc/bge.types.rst
deleted file mode 100644
index 96ba8d278f1..00000000000
--- a/source/gameengine/PyDoc/bge.types.rst
+++ /dev/null
@@ -1,5202 +0,0 @@
-
-Game Engine bge.types Module
-=============================
-
-.. module:: bge.types
-
-.. class:: PyObjectPlus
-
- PyObjectPlus base class of most other types in the Game Engine.
-
- .. attribute:: invalid
-
- Test if the object has been freed by the game engine and is no longer valid.
-
- Normally this is not a problem but when storing game engine data in the GameLogic module,
- KX_Scenes or other KX_GameObjects its possible to hold a reference to invalid data.
- Calling an attribute or method on an invalid object will raise a SystemError.
-
- The invalid attribute allows testing for this case without exception handling.
-
- :type: boolean
-
- .. method:: isA(game_type)
-
- Check if this is a type or a subtype game_type.
-
- :arg game_type: the name of the type or the type its self from the :mod:`bge.types` module.
- :type game_type: string or type
- :return: True if this object is a type or a subtype of game_type.
- :rtype: boolean
-
-.. class:: CValue(PyObjectPlus)
-
- This class is a basis for other classes.
-
- .. attribute:: name
-
- The name of this CValue derived object (read-only).
-
- :type: string
-
-.. class:: CPropValue(CValue)
-
- This class has no python functions
-
-.. class:: SCA_ILogicBrick(CValue)
-
- Base class for all logic bricks.
-
- .. attribute:: executePriority
-
- This determines the order controllers are evaluated, and actuators are activated (lower priority is executed first).
-
- :type: executePriority: int
-
- .. attribute:: owner
-
- The game object this logic brick is attached to (read-only).
-
- :type: :class:`KX_GameObject` or None in exceptional cases.
-
- .. attribute:: name
-
- The name of this logic brick (read-only).
-
- :type: string
-
-.. class:: SCA_PythonKeyboard(PyObjectPlus)
-
- The current keyboard.
-
- .. attribute:: events
-
- A dictionary containing the status of each keyboard event or key. (read-only).
-
- :type: dictionary {:ref:`keycode<keyboard-keys>`::ref:`status<input-status>`, ...}
-
-.. class:: SCA_PythonMouse(PyObjectPlus)
-
- The current mouse.
-
- .. attribute:: events
-
- a dictionary containing the status of each mouse event. (read-only).
-
- :type: dictionary {:ref:`keycode<mouse-keys>`::ref:`status<input-status>`, ...}
-
- .. attribute:: position
-
- The normalized x and y position of the mouse cursor.
-
- :type: list [x, y]
-
- .. attribute:: visible
-
- The visibility of the mouse cursor.
-
- :type: boolean
-
-.. class:: SCA_IObject(CValue)
-
- This class has no python functions
-
-.. class:: SCA_ISensor(SCA_ILogicBrick)
-
- Base class for all sensor logic bricks.
-
- .. attribute:: usePosPulseMode
-
- Flag to turn positive pulse mode on and off.
-
- :type: boolean
-
- .. attribute:: useNegPulseMode
-
- Flag to turn negative pulse mode on and off.
-
- :type: boolean
-
- .. attribute:: frequency
-
- The frequency for pulse mode sensors.
-
- :type: integer
-
- .. attribute:: level
-
- level Option whether to detect level or edge transition when entering a state.
- It makes a difference only in case of logic state transition (state actuator).
- A level detector will immediately generate a pulse, negative or positive
- depending on the sensor condition, as soon as the state is activated.
- A edge detector will wait for a state change before generating a pulse.
- note: mutually exclusive with :data:`tap`, enabling will disable :data:`tap`.
-
- :type: boolean
-
- .. attribute:: tap
-
- When enabled only sensors that are just activated will send a positive event,
- after this they will be detected as negative by the controllers.
- This will make a key thats held act as if its only tapped for an instant.
- note: mutually exclusive with :data:`level`, enabling will disable :data:`level`.
-
- :type: boolean
-
- .. attribute:: invert
-
- Flag to set if this sensor activates on positive or negative events.
-
- :type: boolean
-
- .. attribute:: triggered
-
- True if this sensor brick is in a positive state. (read-only).
-
- :type: boolean
-
- .. attribute:: positive
-
- True if this sensor brick is in a positive state. (read-only).
-
- :type: boolean
-
- .. attribute:: status
-
- The status of the sensor (read-only): can be one of :ref:`these constants<sensor-status>`.
-
- :type: int
-
- .. note::
-
- This convenient attribute combines the values of triggered and positive attributes.
-
- .. method:: reset()
-
- Reset sensor internal state, effect depends on the type of sensor and settings.
-
- The sensor is put in its initial state as if it was just activated.
-
-.. class:: SCA_IController(SCA_ILogicBrick)
-
- Base class for all controller logic bricks.
-
- .. attribute:: state
-
- The controllers state bitmask. This can be used with the GameObject's state to test if the controller is active.
-
- :type: int bitmask
-
- .. attribute:: sensors
-
- A list of sensors linked to this controller.
-
- :type: sequence supporting index/string lookups and iteration.
-
- .. note::
-
- The sensors are not necessarily owned by the same object.
-
- .. note::
-
- When objects are instanced in dupligroups links may be lost from objects outside the dupligroup.
-
- .. attribute:: actuators
-
- A list of actuators linked to this controller.
-
- :type: sequence supporting index/string lookups and iteration.
-
- .. note::
-
- The sensors are not necessarily owned by the same object.
-
- .. note::
-
- When objects are instanced in dupligroups links may be lost from objects outside the dupligroup.
-
- .. attribute:: useHighPriority
-
- When set the controller executes always before all other controllers that dont have this set.
-
- :type: boolen
-
- .. note::
-
- Order of execution between high priority controllers is not guaranteed.
-
-.. class:: SCA_IActuator(SCA_ILogicBrick)
-
- Base class for all actuator logic bricks.
-
-.. class:: BL_ActionActuator(SCA_IActuator)
-
- Action Actuators apply an action to an actor.
-
- .. attribute:: action
-
- The name of the action to set as the current action.
-
- :type: string
-
- .. attribute:: channelNames
-
- A list of channel names that may be used with :data:`setChannel` and :data:`getChannel`.
-
- :type: list of strings
-
- .. attribute:: frameStart
-
- Specifies the starting frame of the animation.
-
- :type: float
-
- .. attribute:: frameEnd
-
- Specifies the ending frame of the animation.
-
- :type: float
-
- .. attribute:: blendIn
-
- Specifies the number of frames of animation to generate when making transitions between actions.
-
- :type: float
-
- .. attribute:: priority
-
- Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers.
-
- :type: integer
-
- .. attribute:: frame
-
- Sets the current frame for the animation.
-
- :type: float
-
- .. attribute:: propName
-
- Sets the property to be used in FromProp playback mode.
-
- :type: string
-
- .. attribute:: blendTime
-
- Sets the internal frame timer. This property must be in the range from 0.0 to blendIn.
-
- :type: float
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<action-actuator>`.
-
- :type: integer
-
- .. attribute:: useContinue
-
- The actions continue option, True or False. When True, the action will always play from where last left off, otherwise negative events to this actuator will reset it to its start frame.
-
- :type: boolean
-
- .. attribute:: framePropName
-
- The name of the property that is set to the current frame number.
-
- :type: string
-
- .. method:: setChannel(channel, matrix)
-
- Alternative to the 2 arguments, 4 arguments (channel, matrix, loc, size, quat) are also supported.
-
- :arg channel: A string specifying the name of the bone channel, error raised if not in :data:`channelNames`.
- :type channel: string
- :arg matrix: A 4x4 matrix specifying the overriding transformation as an offset from the bone's rest position.
- :arg matrix: list [[float]]
-
- .. note::
-
- These values are relative to the bones rest position, currently the api has no way to get this info (which is annoying), but can be worked around by using bones with a rest pose that has no translation.
-
- .. method:: getChannel(channel)
-
- :arg channel: A string specifying the name of the bone channel. error raised if not in :data:`channelNames`.
- :type channel: string
- :return: (loc, size, quat)
- :rtype: tuple
-
-.. class:: BL_Shader(PyObjectPlus)
-
- BL_Shader GLSL shaders.
-
- TODO - Description
-
- .. method:: setUniformfv(name, fList)
-
- Set a uniform with a list of float values
-
- :arg name: the uniform name
- :type name: string
- :arg fList: a list (2, 3 or 4 elements) of float values
- :type fList: list[float]
-
- .. method:: delSource()
-
- Clear the shader. Use this method before the source is changed with :data:`setSource`.
-
- .. method:: getFragmentProg()
-
- Returns the fragment program.
-
- :return: The fragment program.
- :rtype: string
-
- .. method:: getVertexProg()
-
- Get the vertex program.
-
- :return: The vertex program.
- :rtype: string
-
- .. method:: isValid()
-
- Check if the shader is valid.
-
- :return: True if the shader is valid
- :rtype: boolean
-
- .. method:: setAttrib(enum)
-
- Set attribute location. (The parameter is ignored a.t.m. and the value of "tangent" is always used.)
-
- :arg enum: attribute location value
- :type enum: integer
-
- .. method:: setNumberOfPasses( max_pass )
-
- Set the maximum number of passes. Not used a.t.m.
-
- :arg max_pass: the maximum number of passes
- :type max_pass: integer
-
- .. method:: setSampler(name, index)
-
- Set uniform texture sample index.
-
- :arg name: Uniform name
- :type name: string
- :arg index: Texture sample index.
- :type index: integer
-
- .. method:: setSource(vertexProgram, fragmentProgram)
-
- Set the vertex and fragment programs
-
- :arg vertexProgram: Vertex program
- :type vertexProgram: string
- :arg fragmentProgram: Fragment program
- :type fragmentProgram: string
-
- .. method:: setUniform1f(name, fx)
-
- Set a uniform with 1 float value.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: Uniform value
- :type fx: float
-
- .. method:: setUniform1i(name, ix)
-
- Set a uniform with an integer value.
-
- :arg name: the uniform name
- :type name: string
- :arg ix: the uniform value
- :type ix: integer
-
- .. method:: setUniform2f(name, fx, fy)
-
- Set a uniform with 2 float values
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
-
- :arg fy: second float value
- :type fy: float
-
- .. method:: setUniform2i(name, ix, iy)
-
- Set a uniform with 2 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
-
- .. method:: setUniform3f(name, fx, fy, fz)
-
- Set a uniform with 3 float values.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
- :arg fy: second float value
- :type fy: float
- :arg fz: third float value
- :type fz: float
-
- .. method:: setUniform3i(name, ix, iy, iz)
-
- Set a uniform with 3 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
- :arg iz: third integer value
- :type iz: integer
-
- .. method:: setUniform4f(name, fx, fy, fz, fw)
-
- Set a uniform with 4 float values.
-
- :arg name: the uniform name
- :type name: string
- :arg fx: first float value
- :type fx: float
- :arg fy: second float value
- :type fy: float
- :arg fz: third float value
- :type fz: float
- :arg fw: fourth float value
- :type fw: float
-
- .. method:: setUniform4i(name, ix, iy, iz, iw)
-
- Set a uniform with 4 integer values
-
- :arg name: the uniform name
- :type name: string
- :arg ix: first integer value
- :type ix: integer
- :arg iy: second integer value
- :type iy: integer
- :arg iz: third integer value
- :type iz: integer
- :arg iw: fourth integer value
- :type iw: integer
-
- .. method:: setUniformDef(name, type)
-
- Define a new uniform
-
- :arg name: the uniform name
- :type name: string
- :arg type: uniform type
- :type type: UNI_NONE, UNI_INT, UNI_FLOAT, UNI_INT2, UNI_FLOAT2, UNI_INT3, UNI_FLOAT3, UNI_INT4, UNI_FLOAT4, UNI_MAT3, UNI_MAT4, UNI_MAX
-
- .. method:: setUniformMatrix3(name, mat, transpose)
-
- Set a uniform with a 3x3 matrix value
-
- :arg name: the uniform name
- :type name: string
- :arg mat: A 3x3 matrix [[f, f, f], [f, f, f], [f, f, f]]
- :type mat: 3x3 matrix
- :arg transpose: set to True to transpose the matrix
- :type transpose: boolean
-
- .. method:: setUniformMatrix4(name, mat, transpose)
-
- Set a uniform with a 4x4 matrix value
-
- :arg name: the uniform name
- :type name: string
- :arg mat: A 4x4 matrix [[f, f, f, f], [f, f, f, f], [f, f, f, f], [f, f, f, f]]
- :type mat: 4x4 matrix
- :arg transpose: set to True to transpose the matrix
- :type transpose: boolean
-
- .. method:: setUniformiv(name, iList)
-
- Set a uniform with a list of integer values
-
- :arg name: the uniform name
- :type name: string
- :arg iList: a list (2, 3 or 4 elements) of integer values
- :type iList: list[integer]
-
- .. method:: validate()
-
- Validate the shader object.
-
-.. class:: BL_ShapeActionActuator(SCA_IActuator)
-
- ShapeAction Actuators apply an shape action to an mesh object.
-
- .. attribute:: action
-
- The name of the action to set as the current shape action.
-
- :type: string
-
- .. attribute:: frameStart
-
- Specifies the starting frame of the shape animation.
-
- :type: float
-
- .. attribute:: frameEnd
-
- Specifies the ending frame of the shape animation.
-
- :type: float
-
- .. attribute:: blendIn
-
- Specifies the number of frames of animation to generate when making transitions between actions.
-
- :type: float
-
- .. attribute:: priority
-
- Sets the priority of this actuator. Actuators will lower priority numbers will override actuators with higher numbers.
-
- :type: integer
-
- .. attribute:: frame
-
- Sets the current frame for the animation.
-
- :type: float
-
- .. attribute:: propName
-
- Sets the property to be used in FromProp playback mode.
-
- :type: string
-
- .. attribute:: blendTime
-
- Sets the internal frame timer. This property must be in the range from 0.0 to blendin.
-
- :type: float
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<shape-action-actuator>`.
-
- :type: integer
-
- .. attribute:: framePropName
-
- The name of the property that is set to the current frame number.
-
- :type: string
-
-.. class:: CListValue(CPropValue)
-
- This is a list like object used in the game engine internally that behaves similar to a python list in most ways.
-
- As well as the normal index lookup (``val= clist[i]``), CListValue supports string lookups (``val= scene.objects["Cube"]``)
-
- Other operations such as ``len(clist)``, ``list(clist)``, ``clist[0:10]`` are also supported.
-
- .. method:: append(val)
-
- Add an item to the list (like pythons append)
-
- .. warning::
-
- Appending values to the list can cause crashes when the list is used internally by the game engine.
-
- .. method:: count(val)
-
- Count the number of instances of a value in the list.
-
- :return: number of instances
- :rtype: integer
-
- .. method:: index(val)
-
- Return the index of a value in the list.
-
- :return: The index of the value in the list.
- :rtype: integer
-
- .. method:: reverse()
-
- Reverse the order of the list.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
-
- :return: The key value or a default.
-
- .. method:: from_id(id)
-
- This is a funtion especially for the game engine to return a value with a spesific id.
-
- Since object names are not always unique, the id of an object can be used to get an object from the CValueList.
-
- Example:
-
- .. code-block:: python
-
- myObID=id(gameObject)
- ob= scene.objects.from_id(myObID)
-
- Where ``myObID`` is an int or long from the id function.
-
- This has the advantage that you can store the id in places you could not store a gameObject.
-
- .. warning::
-
- The id is derived from a memory location and will be different each time the game engine starts.
-
-.. class:: KX_BlenderMaterial(PyObjectPlus)
-
- KX_BlenderMaterial
-
- .. method:: getShader()
-
- Returns the material's shader.
-
- :return: the material's shader
- :rtype: :class:`BL_Shader`
-
- .. method:: setBlending(src, dest)
-
- Set the pixel color arithmetic functions.
-
- :arg src: Specifies how the red, green, blue, and alpha source blending factors are computed.
- :type src: Value in...
-
- * GL_ZERO,
- * GL_ONE,
- * GL_SRC_COLOR,
- * GL_ONE_MINUS_SRC_COLOR,
- * GL_DST_COLOR,
- * GL_ONE_MINUS_DST_COLOR,
- * GL_SRC_ALPHA,
- * GL_ONE_MINUS_SRC_ALPHA,
- * GL_DST_ALPHA,
- * GL_ONE_MINUS_DST_ALPHA,
- * GL_SRC_ALPHA_SATURATE
-
- :arg dest: Specifies how the red, green, blue, and alpha destination blending factors are computed.
- :type dest: Value in...
-
- * GL_ZERO
- * GL_ONE
- * GL_SRC_COLOR
- * GL_ONE_MINUS_SRC_COLOR
- * GL_DST_COLOR
- * GL_ONE_MINUS_DST_COLOR
- * GL_SRC_ALPHA
- * GL_ONE_MINUS_SRC_ALPHA
- * GL_DST_ALPHA
- * GL_ONE_MINUS_DST_ALPHA
- * GL_SRC_ALPHA_SATURATE
-
- .. method:: getMaterialIndex()
-
- Returns the material's index.
-
- :return: the material's index
- :rtype: integer
-
-.. class:: KX_CameraActuator(SCA_IActuator)
-
- Applies changes to a camera.
-
- .. attribute:: min
-
- minimum distance to the target object maintained by the actuator.
-
- :type: float
-
- .. attribute:: max
-
- maximum distance to stay from the target object.
-
- :type: float
-
- .. attribute:: height
-
- height to stay above the target object.
-
- :type: float
-
- .. attribute:: useXY
-
- axis this actuator is tracking, True=X, False=Y.
-
- :type: boolean
-
- .. attribute:: object
-
- the object this actuator tracks.
-
- :type: :class:`KX_GameObject` or None
-
-.. class:: KX_ConstraintActuator(SCA_IActuator)
-
- A constraint actuator limits the position, rotation, distance or orientation of an object.
-
- .. attribute:: damp
-
- Time constant of the constraint expressed in frame (not use by Force field constraint).
-
- :type: integer
-
- .. attribute:: rotDamp
-
- Time constant for the rotation expressed in frame (only for the distance constraint), 0 = use damp for rotation as well.
-
- :type: integer
-
- .. attribute:: direction
-
- The reference direction in world coordinate for the orientation constraint.
-
- :type: 3-tuple of float: (x, y, z)
-
- .. attribute:: option
-
- Binary combination of :ref:`these constants <constraint-actuator-option>`
-
- :type: integer
-
- .. attribute:: time
-
- activation time of the actuator. The actuator disables itself after this many frame. If set to 0, the actuator is not limited in time.
-
- :type: integer
-
- .. attribute:: propName
-
- the name of the property or material for the ray detection of the distance constraint.
-
- :type: string
-
- .. attribute:: min
-
- The lower bound of the constraint. For the rotation and orientation constraint, it represents radiant.
-
- :type: float
-
- .. attribute:: distance
-
- the target distance of the distance constraint.
-
- :type: float
-
- .. attribute:: max
-
- the upper bound of the constraint. For rotation and orientation constraints, it represents radiant.
-
- :type: float
-
- .. attribute:: rayLength
-
- the length of the ray of the distance constraint.
-
- :type: float
-
- .. attribute:: limit
-
- type of constraint. Use one of the :ref:`these constants <constraint-actuator-limit>`
-
- :type: integer.
-
-
-.. class:: KX_ConstraintWrapper(PyObjectPlus)
-
- KX_ConstraintWrapper
-
- .. method:: getConstraintId(val)
-
- Returns the contraint's ID
-
- :return: the constraint's ID
- :rtype: integer
-
-.. class:: KX_GameActuator(SCA_IActuator)
-
- The game actuator loads a new .blend file, restarts the current .blend file or quits the game.
-
- .. attribute:: fileName
-
- the new .blend file to load.
-
- :type: string
-
- .. attribute:: mode
-
- The mode of this actuator. Can be on of :ref:`these constants <game-actuator>`
-
- :type: Int
-
-.. class:: KX_GameObject(SCA_IObject)
-
- All game objects are derived from this class.
-
- Properties assigned to game objects are accessible as attributes of this class.
-
- .. note::
-
- Calling ANY method or attribute on an object that has been removed from a scene will raise a SystemError, if an object may have been removed since last accessing it use the :data:`invalid` attribute to check.
-
- .. attribute:: name
-
- The object's name. (read-only).
-
- :type: string
-
- .. attribute:: mass
-
- The object's mass
-
- :type: float
-
- .. note::
-
- The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0.
-
- .. attribute:: linVelocityMin
-
- Enforces the object keeps moving at a minimum velocity.
-
- :type: float
-
- .. note::
-
- Applies to dynamic and rigid body objects only.
-
- .. note::
-
- A value of 0.0 disables this option.
-
- .. note::
-
- While objects are stationary the minimum velocity will not be applied.
-
- .. attribute:: linVelocityMax
-
- Clamp the maximum linear velocity to prevent objects moving beyond a set speed.
-
- :type: float
-
- .. note::
-
- Applies to dynamic and rigid body objects only.
-
- .. note::
-
- A value of 0.0 disables this option (rather then setting it stationary).
-
- .. attribute:: localInertia
-
- the object's inertia vector in local coordinates. Read only.
-
- :type: list [ix, iy, iz]
-
- .. attribute:: parent
-
- The object's parent object. (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: visible
-
- visibility flag.
-
- :type: boolean
-
- .. note::
-
- Game logic will still run for invisible objects.
-
- .. attribute:: color
-
- The object color of the object.
-
- :type: list [r, g, b, a]
-
- .. attribute:: occlusion
-
- occlusion capability flag.
-
- :type: boolean
-
- .. attribute:: position
-
- The object's position.
-
- .. deprecated:: use :data:`localPosition` and :data:`worldPosition`.
-
- :type: list [x, y, z] On write: local position, on read: world position
-
- .. attribute:: orientation
-
- The object's orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector.
-
- .. deprecated:: use :data:`localOrientation` and :data:`worldOrientation`.
-
- :type: 3x3 Matrix [[float]] On write: local orientation, on read: world orientation
-
- .. attribute:: scaling
-
- The object's scaling factor. list [sx, sy, sz]
-
- .. deprecated:: use :data:`localScale` and :data:`worldScale`.
-
- :type: list [sx, sy, sz] On write: local scaling, on read: world scaling
-
- .. attribute:: localOrientation
-
- The object's local orientation. 3x3 Matrix. You can also write a Quaternion or Euler vector.
-
- :type: 3x3 Matrix [[float]]
-
- .. attribute:: worldOrientation
-
- The object's world orientation.
-
- :type: 3x3 Matrix [[float]]
-
- .. attribute:: localScale
-
- The object's local scaling factor.
-
- :type: list [sx, sy, sz]
-
- .. attribute:: worldScale
-
- The object's world scaling factor. Read-only.
-
- :type: list [sx, sy, sz]
-
- .. attribute:: localPosition
-
- The object's local position.
-
- :type: list [x, y, z]
-
- .. attribute:: worldPosition
-
- The object's world position.
-
- :type: list [x, y, z]
-
- .. attribute:: timeOffset
-
- adjust the slowparent delay at runtime.
-
- :type: float
-
- .. attribute:: state
-
- the game object's state bitmask, using the first 30 bits, one bit must always be set.
-
- :type: int
-
- .. attribute:: meshes
-
- a list meshes for this object.
-
- :type: list of :class:`KX_MeshProxy`
-
- .. note::
-
- Most objects use only 1 mesh.
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: sensors
-
- a sequence of :class:`SCA_ISensor` objects with string/index lookups and iterator support.
-
- :type: list
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: controllers
-
- a sequence of :class:`SCA_IController` objects with string/index lookups and iterator support.
-
- :type: list of :class:`SCA_ISensor`
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: actuators
-
- a list of :class:`SCA_IActuator` with string/index lookups and iterator support.
-
- :type: list
-
- .. note::
-
- This attribute is experemental and may be removed (but probably wont be).
-
- .. note::
-
- Changes to this list will not update the KX_GameObject.
-
- .. attribute:: attrDict
-
- get the objects internal python attribute dictionary for direct (faster) access.
-
- :type: dict
-
- .. attribute:: children
-
- direct children of this object, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`'s
-
- .. attribute:: childrenRecursive
-
- all children of this object including childrens children, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`'s
-
- .. method:: endObject()
-
- Delete this object, can be used in place of the EndObject Actuator.
-
- The actual removal of the object from the scene is delayed.
-
- .. method:: replaceMesh(mesh, useDisplayMesh=True, usePhysicsMesh=False)
-
- Replace the mesh of this object with a new mesh. This works the same was as the actuator.
-
- :arg mesh: mesh to replace or the meshes name.
- :type mesh: :class:`MeshProxy` or string
- :arg useDisplayMesh: when enabled the display mesh will be replaced (optional argument).
- :type useDisplayMesh: boolean
- :arg usePhysicsMesh: when enabled the physics mesh will be replaced (optional argument).
- :type usePhysicsMesh: boolean
-
- .. method:: setVisible(visible, recursive)
-
- Sets the game object's visible flag.
-
- :arg visible: the visible state to set.
- :type visible: boolean
- :arg recursive: optional argument to set all childrens visibility flag too.
- :type recursive: boolean
-
- .. method:: setOcclusion(occlusion, recursive)
-
- Sets the game object's occlusion capability.
-
- :arg occlusion: the state to set the occlusion to.
- :type occlusion: boolean
- :arg recursive: optional argument to set all childrens occlusion flag too.
- :type recursive: boolean
-
- .. method:: alignAxisToVect(vect, axis=2, factor=1.0)
-
- Aligns any of the game object's axis along the given vector.
-
-
- :arg vect: a vector to align the axis.
- :type vect: 3D vector
- :arg axis: The axis you want to align
-
- * 0: X axis
- * 1: Y axis
- * 2: Z axis
-
- :type axis: integer
- :arg factor: Only rotate a feaction of the distance to the target vector (0.0 - 1.0)
- :type factor: float
-
- .. method:: getAxisVect(vect)
-
- Returns the axis vector rotates by the objects worldspace orientation.
- This is the equivalent of multiplying the vector by the orientation matrix.
-
- :arg vect: a vector to align the axis.
- :type vect: 3D Vector
- :return: The vector in relation to the objects rotation.
- :rtype: 3d vector.
-
- .. method:: applyMovement(movement, local=False)
-
- Sets the game object's movement.
-
- :arg movement: movement vector.
- :type movement: 3D Vector
- :arg local:
- * False: you get the "global" movement ie: relative to world orientation.
- * True: you get the "local" movement ie: relative to object orientation.
- :arg local: boolean
-
- .. method:: applyRotation(rotation, local=False)
-
- Sets the game object's rotation.
-
- :arg rotation: rotation vector.
- :type rotation: 3D Vector
- :arg local:
- * False: you get the "global" rotation ie: relative to world orientation.
- * True: you get the "local" rotation ie: relative to object orientation.
- :arg local: boolean
-
- .. method:: applyForce(force, local=False)
-
- Sets the game object's force.
-
- This requires a dynamic object.
-
- :arg force: force vector.
- :type force: 3D Vector
- :arg local:
- * False: you get the "global" force ie: relative to world orientation.
- * True: you get the "local" force ie: relative to object orientation.
- :type local: boolean
-
- .. method:: applyTorque(torque, local=False)
-
- Sets the game object's torque.
-
- This requires a dynamic object.
-
- :arg torque: torque vector.
- :type torque: 3D Vector
- :arg local:
- * False: you get the "global" torque ie: relative to world orientation.
- * True: you get the "local" torque ie: relative to object orientation.
- :type local: boolean
-
- .. method:: getLinearVelocity(local=False)
-
- Gets the game object's linear velocity.
-
- This method returns the game object's velocity through it's centre of mass, ie no angular velocity component.
-
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
- :return: the object's linear velocity.
- :rtype: list [vx, vy, vz]
-
- .. method:: setLinearVelocity(velocity, local=False)
-
- Sets the game object's linear velocity.
-
- This method sets game object's velocity through it's centre of mass,
- ie no angular velocity component.
-
- This requires a dynamic object.
-
- :arg velocity: linear velocity vector.
- :type velocity: 3D Vector
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
-
- .. method:: getAngularVelocity(local=False)
-
- Gets the game object's angular velocity.
-
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
- :type local: boolean
- :return: the object's angular velocity.
- :rtype: list [vx, vy, vz]
-
- .. method:: setAngularVelocity(velocity, local=False)
-
- Sets the game object's angular velocity.
-
- This requires a dynamic object.
-
- :arg velocity: angular velocity vector.
- :type velocity: boolean
- :arg local:
- * False: you get the "global" velocity ie: relative to world orientation.
- * True: you get the "local" velocity ie: relative to object orientation.
-
- .. method:: getVelocity(point=(0, 0, 0))
-
- Gets the game object's velocity at the specified point.
-
- Gets the game object's velocity at the specified point, including angular
- components.
-
- :arg point: optional point to return the velocity for, in local coordinates.
- :type point: 3D Vector
- :return: the velocity at the specified point.
- :rtype: list [vx, vy, vz]
-
- .. method:: getReactionForce()
-
- Gets the game object's reaction force.
-
- The reaction force is the force applied to this object over the last simulation timestep.
- This also includes impulses, eg from collisions.
-
- :return: the reaction force of this object.
- :rtype: list [fx, fy, fz]
-
- .. note::
-
- This is not implimented at the moment.
-
- .. method:: applyImpulse(point, impulse)
-
- Applies an impulse to the game object.
-
- This will apply the specified impulse to the game object at the specified point.
- If point != position, applyImpulse will also change the object's angular momentum.
- Otherwise, only linear momentum will change.
-
- :arg point: the point to apply the impulse to (in world coordinates)
- :type point: the point to apply the impulse to (in world coordinates)
-
- .. method:: suspendDynamics()
-
- Suspends physics for this object.
-
- .. method:: restoreDynamics()
-
- Resumes physics for this object.
-
- .. note::
-
- The objects linear velocity will be applied from when the dynamics were suspended.
-
- .. method:: enableRigidBody()
-
- Enables rigid body physics for this object.
-
- Rigid body physics allows the object to roll on collisions.
-
- .. note::
-
- This is not working with bullet physics yet.
-
- .. method:: disableRigidBody()
-
- Disables rigid body physics for this object.
-
- .. note::
-
- This is not working with bullet physics yet. The angular is removed but rigid body physics can still rotate it later.
-
- .. method:: setParent(parent, compound=True, ghost=True)
-
- Sets this object's parent.
- Control the shape status with the optional compound and ghost parameters:
-
- In that case you can control if it should be ghost or not:
-
- :arg parent: new parent object.
- :type parent: :class:`KX_GameObject`
- :arg compound: whether the shape should be added to the parent compound shape.
-
- * True: the object shape should be added to the parent compound shape.
- * False: the object should keep its individual shape.
-
- :type compound: boolean
- :arg ghost: whether the object should be ghost while parented.
-
- * True: if the object should be made ghost while parented.
- * False: if the object should be solid while parented.
-
- :type ghost: boolean
-
- .. note::
-
- If the object type is sensor, it stays ghost regardless of ghost parameter
-
- .. method:: removeParent()
-
- Removes this objects parent.
-
- .. method:: getPhysicsId()
-
- Returns the user data object associated with this game object's physics controller.
-
- .. method:: getPropertyNames()
-
- Gets a list of all property names.
-
- :return: All property names for this object.
- :rtype: list
-
- .. method:: getDistanceTo(other)
-
- :arg other: a point or another :class:`KX_GameObject` to measure the distance to.
- :type other: :class:`KX_GameObject` or list [x, y, z]
- :return: distance to another object or point.
- :rtype: float
-
- .. method:: getVectTo(other)
-
- Returns the vector and the distance to another object or point.
- The vector is normalized unless the distance is 0, in which a zero length vector is returned.
-
- :arg other: a point or another :class:`KX_GameObject` to get the vector and distance to.
- :type other: :class:`KX_GameObject` or list [x, y, z]
- :return: (distance, globalVector(3), localVector(3))
- :rtype: 3-tuple (float, 3-tuple (x, y, z), 3-tuple (x, y, z))
-
- .. method:: rayCastTo(other, dist, prop)
-
- Look towards another point/object and find first object hit within dist that matches prop.
-
- The ray is always casted from the center of the object, ignoring the object itself.
- The ray is casted towards the center of another object or an explicit [x, y, z] point.
- Use rayCast() if you need to retrieve the hit point
-
- :arg other: [x, y, z] or object towards which the ray is casted
- :type other: :class:`KX_GameObject` or 3-tuple
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other
- :type dist: float
- :arg prop: property name that object must have; can be omitted => detect any object
- :type prop: string
- :return: the first object hit or None if no object or object does not match prop
- :rtype: :class:`KX_GameObject`
-
- .. method:: rayCast(objto, objfrom, dist, prop, face, xray, poly)
-
- Look from a point/object to another point/object and find first object hit within dist that matches prop.
- if poly is 0, returns a 3-tuple with object reference, hit point and hit normal or (None, None, None) if no hit.
- if poly is 1, returns a 4-tuple with in addition a :class:`KX_PolyProxy` as 4th element.
- if poly is 2, returns a 5-tuple with in addition a 2D vector with the UV mapping of the hit point as 5th element.
-
- .. code-block:: python
-
- # shoot along the axis gun-gunAim (gunAim should be collision-free)
- obj, point, normal = gun.rayCast(gunAim, None, 50)
- if obj:
- # do something
- pass
-
- The face paremeter determines the orientation of the normal.
-
- * 0 => hit normal is always oriented towards the ray origin (as if you casted the ray from outside)
- * 1 => hit normal is the real face normal (only for mesh object, otherwise face has no effect)
-
- The ray has X-Ray capability if xray parameter is 1, otherwise the first object hit (other than self object) stops the ray.
- The prop and xray parameters interact as follow.
-
- * prop off, xray off: return closest hit or no hit if there is no object on the full extend of the ray.
- * prop off, xray on : idem.
- * prop on, xray off: return closest hit if it matches prop, no hit otherwise.
- * prop on, xray on : return closest hit matching prop or no hit if there is no object matching prop on the full extend of the ray.
-
- The :class:`KX_PolyProxy` 4th element of the return tuple when poly=1 allows to retrieve information on the polygon hit by the ray.
- If there is no hit or the hit object is not a static mesh, None is returned as 4th element.
-
- The ray ignores collision-free objects and faces that dont have the collision flag enabled, you can however use ghost objects.
-
- :arg objto: [x, y, z] or object to which the ray is casted
- :type objto: :class:`KX_GameObject` or 3-tuple
- :arg objfrom: [x, y, z] or object from which the ray is casted; None or omitted => use self object center
- :type objfrom: :class:`KX_GameObject` or 3-tuple or None
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to to
- :type dist: float
- :arg prop: property name that object must have; can be omitted or "" => detect any object
- :type prop: string
- :arg face: normal option: 1=>return face normal; 0 or omitted => normal is oriented towards origin
- :type face: integer
- :arg xray: X-ray option: 1=>skip objects that don't match prop; 0 or omitted => stop on first object
- :type xray: integer
- :arg poly: polygon option: 0, 1 or 2 to return a 3-, 4- or 5-tuple with information on the face hit.
-
- * 0 or omitted: return value is a 3-tuple (object, hitpoint, hitnormal) or (None, None, None) if no hit
- * 1: return value is a 4-tuple and the 4th element is a :class:`KX_PolyProxy` or None if no hit or the object doesn't use a mesh collision shape.
- * 2: return value is a 5-tuple and the 5th element is a 2-tuple (u, v) with the UV mapping of the hit point or None if no hit, or the object doesn't use a mesh collision shape, or doesn't have a UV mapping.
-
- :type poly: integer
- :return: (object, hitpoint, hitnormal) or (object, hitpoint, hitnormal, polygon) or (object, hitpoint, hitnormal, polygon, hituv).
-
- * object, hitpoint and hitnormal are None if no hit.
- * polygon is valid only if the object is valid and is a static object, a dynamic object using mesh collision shape or a soft body object, otherwise it is None
- * hituv is valid only if polygon is valid and the object has a UV mapping, otherwise it is None
-
- :rtype:
-
- * 3-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz))
- * or 4-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`)
- * or 5-tuple (:class:`KX_GameObject`, 3-tuple (x, y, z), 3-tuple (nx, ny, nz), :class:`PolyProxy`, 2-tuple (u, v))
-
- .. note::
-
- The ray ignores the object on which the method is called. It is casted from/to object center or explicit [x, y, z] points.
-
- .. method:: setCollisionMargin(margin)
-
- Set the objects collision margin.
-
- :arg margin: the collision margin distance in blender units.
- :type margin: float
-
- .. note::
-
- If this object has no physics controller (a physics ID of zero), this function will raise RuntimeError.
-
- .. method:: sendMessage(subject, body="", to="")
-
- Sends a message.
-
- :arg subject: The subject of the message
- :type subject: string
- :arg body: The body of the message (optional)
- :type body: string
- :arg to: The name of the object to send the message to (optional)
- :type to: string
-
- .. method:: reinstancePhysicsMesh(gameObject, meshObject)
-
- Updates the physics system with the changed mesh.
-
- If no arguments are given the physics mesh will be re-created from the first mesh assigned to the game object.
-
- :arg gameObject: optional argument, set the physics shape from this gameObjets mesh.
- :type gameObject: string, :class:`KX_GameObject` or None
- :arg meshObject: optional argument, set the physics shape from this mesh.
- :type meshObject: string, :class:`MeshProxy` or None
-
- :return: True if reinstance succeeded, False if it failed.
- :rtype: boolean
-
- .. note::
-
- If this object has instances the other instances will be updated too.
-
- .. note::
-
- The gameObject argument has an advantage that it can convert from a mesh with modifiers applied (such as subsurf).
-
- .. warning::
-
- Only triangle mesh type objects are supported currently (not convex hull)
-
- .. warning::
-
- If the object is a part of a combound object it will fail (parent or child)
-
- .. warning::
-
- Rebuilding the physics mesh can be slow, running many times per second will give a performance hit.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
- :return: The key value or a default.
-
-.. class:: KX_IpoActuator(SCA_IActuator)
-
- IPO actuator activates an animation.
-
- .. attribute:: frameStart
-
- Start frame.
-
- :type: float
-
- .. attribute:: frameEnd
-
- End frame.
-
- :type: float
-
- .. attribute:: propName
-
- Use this property to define the Ipo position.
-
- :type: string
-
- .. attribute:: framePropName
-
- Assign this property this action current frame number.
-
- :type: string
-
- .. attribute:: mode
-
- Play mode for the ipo. Can be on of :ref:`these constants <ipo-actuator>`
-
- :type: integer
-
- .. attribute:: useIpoAsForce
-
- Apply Ipo as a global or local force depending on the local option (dynamic objects only).
-
- :type: boolean
-
- .. attribute:: useIpoAdd
-
- Ipo is added to the current loc/rot/scale in global or local coordinate according to Local flag.
-
- :type: boolean
-
- .. attribute:: useIpoLocal
-
- Let the ipo acts in local coordinates, used in Force and Add mode.
-
- :type: boolean
-
- .. attribute:: useChildren
-
- Update IPO on all children Objects as well.
-
- :type: boolean
-
-.. class:: KX_LightObject(KX_GameObject)
-
- A Light object.
-
- .. code-block:: python
-
- # Turn on a red alert light.
- import bge
-
- co = bge.logic.getCurrentController()
- light = co.owner
-
- light.energy = 1.0
- light.colour = [1.0, 0.0, 0.0]
-
- .. data:: SPOT
-
- A spot light source. See attribute :data:`type`
-
- .. data:: SUN
-
- A point light source with no attenuation. See attribute :data:`type`
-
- .. data:: NORMAL
-
- A point light source. See attribute :data:`type`
-
- .. attribute:: type
-
- The type of light - must be SPOT, SUN or NORMAL
-
- .. attribute:: layer
-
- The layer mask that this light affects object on.
-
- :type: bitfield
-
- .. attribute:: energy
-
- The brightness of this light.
-
- :type: float
-
- .. attribute:: distance
-
- The maximum distance this light can illuminate. (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: colour
-
- The colour of this light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: color
-
- Synonym for colour.
-
- .. attribute:: lin_attenuation
-
- The linear component of this light's attenuation. (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: quad_attenuation
-
- The quadratic component of this light's attenuation (SPOT and NORMAL lights only).
-
- :type: float
-
- .. attribute:: spotsize
-
- The cone angle of the spot light, in degrees (SPOT lights only).
-
- :type: float in [0 - 180].
-
- .. attribute:: spotblend
-
- Specifies the intensity distribution of the spot light (SPOT lights only).
-
- :type: float in [0 - 1]
-
- .. note::
-
- Higher values result in a more focused light source.
-
-.. class:: KX_MeshProxy(SCA_IObject)
-
- A mesh object.
-
- You can only change the vertex properties of a mesh object, not the mesh topology.
-
- To use mesh objects effectively, you should know a bit about how the game engine handles them.
-
- #. Mesh Objects are converted from Blender at scene load.
- #. The Converter groups polygons by Material. This means they can be sent to the renderer efficiently. A material holds:
-
- #. The texture.
- #. The Blender material.
- #. The Tile properties
- #. The face properties - (From the "Texture Face" panel)
- #. Transparency & z sorting
- #. Light layer
- #. Polygon shape (triangle/quad)
- #. Game Object
-
- #. Verticies will be split by face if necessary. Verticies can only be shared between faces if:
-
- #. They are at the same position
- #. UV coordinates are the same
- #. Their normals are the same (both polygons are "Set Smooth")
- #. They are the same colour, for example: a cube has 24 verticies: 6 faces with 4 verticies per face.
-
- The correct method of iterating over every :class:`KX_VertexProxy` in a game object
-
- .. code-block:: python
-
- import GameLogic
-
- co = GameLogic.getCurrentController()
- obj = co.owner
-
- m_i = 0
- mesh = obj.getMesh(m_i) # There can be more than one mesh...
- while mesh != None:
- for mat in range(mesh.getNumMaterials()):
- for v_index in range(mesh.getVertexArrayLength(mat)):
- vertex = mesh.getVertex(mat, v_index)
- # Do something with vertex here...
- # ... eg: colour the vertex red.
- vertex.colour = [1.0, 0.0, 0.0, 1.0]
- m_i += 1
- mesh = obj.getMesh(m_i)
-
- .. attribute:: materials
-
- :type: list of :class:`KX_BlenderMaterial` or :class:`KX_PolygonMaterial` types
-
- .. attribute:: numPolygons
-
- :type: integer
-
- .. attribute:: numMaterials
-
- :type: integer
-
- .. method:: getNumMaterials()
-
- :return: number of materials associated with this object
- :rtype: integer
-
- .. method:: getMaterialName(matid)
-
- Gets the name of the specified material.
-
- :arg matid: the specified material.
- :type matid: integer
- :return: the attached material name.
- :rtype: string
-
- .. method:: getTextureName(matid)
-
- Gets the name of the specified material's texture.
-
- :arg matid: the specified material
- :type matid: integer
- :return: the attached material's texture name.
- :rtype: string
-
- .. method:: getVertexArrayLength(matid)
-
- Gets the length of the vertex array associated with the specified material.
-
- There is one vertex array for each material.
-
- :arg matid: the specified material
- :type matid: integer
- :return: the number of verticies in the vertex array.
- :rtype: integer
-
- .. method:: getVertex(matid, index)
-
- Gets the specified vertex from the mesh object.
-
- :arg matid: the specified material
- :type matid: integer
- :arg index: the index into the vertex array.
- :type index: integer
- :return: a vertex object.
- :rtype: :class:`KX_VertexProxy`
-
- .. method:: getNumPolygons()
-
- :return: The number of polygon in the mesh.
- :rtype: integer
-
- .. method:: getPolygon(index)
-
- Gets the specified polygon from the mesh.
-
- :arg index: polygon number
- :type index: integer
- :return: a polygon object.
- :rtype: :class:`PolyProxy`
-
-.. class:: SCA_MouseSensor(SCA_ISensor)
-
- Mouse Sensor logic brick.
-
- .. attribute:: position
-
- current [x, y] coordinates of the mouse, in frame coordinates (pixels).
-
- :type: [integer, interger]
-
- .. attribute:: mode
-
- sensor mode.
-
- :type: integer
-
- * KX_MOUSESENSORMODE_LEFTBUTTON(1)
- * KX_MOUSESENSORMODE_MIDDLEBUTTON(2)
- * KX_MOUSESENSORMODE_RIGHTBUTTON(3)
- * KX_MOUSESENSORMODE_WHEELUP(4)
- * KX_MOUSESENSORMODE_WHEELDOWN(5)
- * KX_MOUSESENSORMODE_MOVEMENT(6)
-
- .. method:: getButtonStatus(button)
-
- Get the mouse button status.
-
- :arg button: The code that represents the key you want to get the state of, use one of :ref:`these constants<mouse-keys>`
- :type button: int
- :return: The state of the given key, can be one of :ref:`these constants<input-status>`
- :rtype: int
-
-.. class:: KX_MouseFocusSensor(SCA_MouseSensor)
-
- The mouse focus sensor detects when the mouse is over the current game object.
-
- The mouse focus sensor works by transforming the mouse coordinates from 2d device
- space to 3d space then raycasting away from the camera.
-
- .. attribute:: raySource
-
- The worldspace source of the ray (the view position).
-
- :type: list (vector of 3 floats)
-
- .. attribute:: rayTarget
-
- The worldspace target of the ray.
-
- :type: list (vector of 3 floats)
-
- .. attribute:: rayDirection
-
- The :data:`rayTarget` - :class:`raySource` normalized.
-
- :type: list (normalized vector of 3 floats)
-
- .. attribute:: hitObject
-
- the last object the mouse was over.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: hitPosition
-
- The worldspace position of the ray intersecton.
-
- :type: list (vector of 3 floats)
-
- .. attribute:: hitNormal
-
- the worldspace normal from the face at point of intersection.
-
- :type: list (normalized vector of 3 floats)
-
- .. attribute:: hitUV
-
- the UV coordinates at the point of intersection.
-
- :type: list (vector of 2 floats)
-
- If the object has no UV mapping, it returns [0, 0].
-
- The UV coordinates are not normalized, they can be < 0 or > 1 depending on the UV mapping.
-
- .. attribute:: usePulseFocus
-
- When enabled, moving the mouse over a different object generates a pulse. (only used when the 'Mouse Over Any' sensor option is set).
-
- :type: boolean
-
-.. class:: KX_TouchSensor(SCA_ISensor)
-
- Touch sensor detects collisions between objects.
-
- .. attribute:: propName
-
- The property or material to collide with.
-
- :type: string
-
- .. attribute:: useMaterial
-
- Determines if the sensor is looking for a property or material. KX_True = Find material; KX_False = Find property.
-
- :type: boolean
-
- .. attribute:: usePulseCollision
-
- When enabled, changes to the set of colliding objects generate a pulse.
-
- :type: boolean
-
- .. attribute:: hitObject
-
- The last collided object. (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: hitObjectList
-
- A list of colliding objects. (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
-.. class:: KX_NearSensor(KX_TouchSensor)
-
- A near sensor is a specialised form of touch sensor.
-
- .. attribute:: distance
-
- The near sensor activates when an object is within this distance.
-
- :type: float
-
- .. attribute:: resetDistance
-
- The near sensor deactivates when the object exceeds this distance.
-
- :type: float
-
-.. class:: KX_NetworkMessageActuator(SCA_IActuator)
-
- Message Actuator
-
- .. attribute:: propName
-
- Messages will only be sent to objects with the given property name.
-
- :type: string
-
- .. attribute:: subject
-
- The subject field of the message.
-
- :type: string
-
- .. attribute:: body
-
- The body of the message.
-
- :type: string
-
- .. attribute:: usePropBody
-
- Send a property instead of a regular body message.
-
- :type: boolean
-
-.. class:: KX_NetworkMessageSensor(SCA_ISensor)
-
- The Message Sensor logic brick.
-
- Currently only loopback (local) networks are supported.
-
- .. attribute:: subject
-
- The subject the sensor is looking for.
-
- :type: string
-
- .. attribute:: frameMessageCount
-
- The number of messages received since the last frame. (read-only).
-
- :type: integer
-
- .. attribute:: subjects
-
- The list of message subjects received. (read-only).
-
- :type: list of strings
-
- .. attribute:: bodies
-
- The list of message bodies received. (read-only).
-
- :type: list of strings
-
-.. class:: KX_ObjectActuator(SCA_IActuator)
-
- The object actuator ("Motion Actuator") applies force, torque, displacement, angular displacement,
- velocity, or angular velocity to an object.
- Servo control allows to regulate force to achieve a certain speed target.
-
- .. attribute:: force
-
- The force applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalForce
-
- A flag specifying if the force is local.
-
- :type: boolean
-
- .. attribute:: torque
-
- The torque applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalTorque
-
- A flag specifying if the torque is local.
-
- :type: boolean
-
- .. attribute:: dLoc
-
- The displacement vector applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalDLoc
-
- A flag specifying if the dLoc is local.
-
- :type: boolean
-
- .. attribute:: dRot
-
- The angular displacement vector applied by the actuator
-
- :type: list [x, y, z]
-
- .. note::
-
- Since the displacement is applied every frame, you must adjust the displacement based on the frame rate, or you game experience will depend on the player's computer speed.
-
- .. attribute:: useLocalDRot
-
- A flag specifying if the dRot is local.
-
- :type: boolean
-
- .. attribute:: linV
-
- The linear velocity applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalLinV
-
- A flag specifying if the linear velocity is local.
-
- :type: boolean
-
- .. note::
-
- This is the target speed for servo controllers.
-
- .. attribute:: angV
-
- The angular velocity applied by the actuator.
-
- :type: list [x, y, z]
-
- .. attribute:: useLocalAngV
-
- A flag specifying if the angular velocity is local.
-
- :type: boolean
-
- .. attribute:: damping
-
- The damping parameter of the servo controller.
-
- :type: short
-
- .. attribute:: forceLimitX
-
- The min/max force limit along the X axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: forceLimitY
-
- The min/max force limit along the Y axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: forceLimitZ
-
- The min/max force limit along the Z axis and activates or deactivates the limits in the servo controller.
-
- :type: list [min(float), max(float), bool]
-
- .. attribute:: pid
-
- The PID coefficients of the servo controller.
-
- :type: list of floats [proportional, integral, derivate]
-
- .. attribute:: reference
-
- The object that is used as reference to compute the velocity for the servo controller.
-
- :type: :class:`KX_GameObject` or None
-
-.. class:: KX_ParentActuator(SCA_IActuator)
-
- The parent actuator can set or remove an objects parent object.
-
- .. attribute:: object
-
- the object this actuator sets the parent too.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: mode
-
- The mode of this actuator.
-
- :type: integer from 0 to 1.
-
- .. attribute:: compound
-
- Whether the object shape should be added to the parent compound shape when parenting.
-
- Effective only if the parent is already a compound shape.
-
- :type: boolean
-
- .. attribute:: ghost
-
- Whether the object should be made ghost when parenting
- Effective only if the shape is not added to the parent compound shape.
-
- :type: boolean
-
-.. class:: KX_PhysicsObjectWrapper(PyObjectPlus)
-
- KX_PhysicsObjectWrapper
-
- .. method:: setActive(active)
-
- Set the object to be active.
-
- :arg active: set to True to be active
- :type active: boolean
-
- .. method:: setAngularVelocity(x, y, z, local)
-
- Set the angular velocity of the object.
-
- :arg x: angular velocity for the x-axis
- :type x: float
-
- :arg y: angular velocity for the y-axis
- :type y: float
-
- :arg z: angular velocity for the z-axis
- :type z: float
-
- :arg local: set to True for local axis
- :type local: boolean
-
- .. method:: setLinearVelocity(x, y, z, local)
-
- Set the linear velocity of the object.
-
- :arg x: linear velocity for the x-axis
- :type x: float
-
- :arg y: linear velocity for the y-axis
- :type y: float
-
- :arg z: linear velocity for the z-axis
- :type z: float
-
- :arg local: set to True for local axis
- :type local: boolean
-
-.. class:: KX_PolyProxy(SCA_IObject)
-
- A polygon holds the index of the vertex forming the poylgon.
-
- Note:
- The polygon attributes are read-only, you need to retrieve the vertex proxy if you want
- to change the vertex settings.
-
- .. attribute:: matname
-
- The name of polygon material, empty if no material.
-
- :type: string
-
- .. attribute:: material
-
- The material of the polygon.
-
- :type: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial`
-
- .. attribute:: texture
-
- The texture name of the polygon.
-
- :type: string
-
- .. attribute:: matid
-
- The material index of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v1
-
- vertex index of the first vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v2
-
- vertex index of the second vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v3
-
- vertex index of the third vertex of the polygon, use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: v4
-
- Vertex index of the fourth vertex of the polygon, 0 if polygon has only 3 vertex
- Use this to retrieve vertex proxy from mesh proxy.
-
- :type: integer
-
- .. attribute:: visible
-
- visible state of the polygon: 1=visible, 0=invisible.
-
- :type: integer
-
- .. attribute:: collide
-
- collide state of the polygon: 1=receives collision, 0=collision free.
-
- :type: integer
-
- .. method:: getMaterialName()
-
- Returns the polygon material name with MA prefix
-
- :return: material name
- :rtype: string
-
- .. method:: getMaterial()
-
- :return: The polygon material
- :rtype: :class:`KX_PolygonMaterial` or :class:`KX_BlenderMaterial`
-
- .. method:: getTextureName()
-
- :return: The texture name
- :rtype: string
-
- .. method:: getMaterialIndex()
-
- Returns the material bucket index of the polygon.
- This index and the ones returned by getVertexIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`.
-
- :return: the material index in the mesh
- :rtype: integer
-
- .. method:: getNumVertex()
-
- Returns the number of vertex of the polygon.
-
- :return: number of vertex, 3 or 4.
- :rtype: integer
-
- .. method:: isVisible()
-
- Returns whether the polygon is visible or not
-
- :return: 0=invisible, 1=visible
- :rtype: boolean
-
- .. method:: isCollider()
-
- Returns whether the polygon is receives collision or not
-
- :return: 0=collision free, 1=receives collision
- :rtype: integer
-
- .. method:: getVertexIndex(vertex)
-
- Returns the mesh vertex index of a polygon vertex
- This index and the one returned by getMaterialIndex() are needed to retrieve the vertex proxy from :class:`MeshProxy`.
-
- :arg vertex: index of the vertex in the polygon: 0->3
- :arg vertex: integer
- :return: mesh vertex index
- :rtype: integer
-
- .. method:: getMesh()
-
- Returns a mesh proxy
-
- :return: mesh proxy
- :rtype: :class:`MeshProxy`
-
-.. class:: KX_PolygonMaterial(PyObjectPlus)
-
- This is the interface to materials in the game engine.
-
- Materials define the render state to be applied to mesh objects.
-
- .. warning::
-
- Some of the methods/variables are CObjects. If you mix these up, you will crash blender.
-
- This example requires `PyOpenGL <http://pyopengl.sourceforge.net>`_ and `GLEWPy <http://glewpy.sourceforge.net>`_
-
- .. code-block:: python
-
- import GameLogic
- import OpenGL
- from OpenGL.GL import *
- from OpenGL.GLU import *
- import glew
- from glew import *
-
- glewInit()
-
- vertex_shader = """
-
- void main(void)
- {
- gl_Position = ftransform();
- }
- """
-
- fragment_shader ="""
-
- void main(void)
- {
- gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
- }
- """
-
- class MyMaterial:
- def __init__(self):
- self.pass_no = 0
- # Create a shader
- self.m_program = glCreateProgramObjectARB()
- # Compile the vertex shader
- self.shader(GL_VERTEX_SHADER_ARB, (vertex_shader))
- # Compile the fragment shader
- self.shader(GL_FRAGMENT_SHADER_ARB, (fragment_shader))
- # Link the shaders together
- self.link()
-
- def PrintInfoLog(self, tag, object):
- """
- PrintInfoLog prints the GLSL compiler log
- """
- print "Tag: def PrintGLError(self, tag = ""):
-
- def PrintGLError(self, tag = ""):
- """
- Prints the current GL error status
- """
- if len(tag):
- print tag
- err = glGetError()
- if err != GL_NO_ERROR:
- print "GL Error: %s\\n"%(gluErrorString(err))
-
- def shader(self, type, shaders):
- """
- shader compiles a GLSL shader and attaches it to the current
- program.
-
- type should be either GL_VERTEX_SHADER_ARB or GL_FRAGMENT_SHADER_ARB
- shaders should be a sequence of shader source to compile.
- """
- # Create a shader object
- shader_object = glCreateShaderObjectARB(type)
-
- # Add the source code
- glShaderSourceARB(shader_object, len(shaders), shaders)
-
- # Compile the shader
- glCompileShaderARB(shader_object)
-
- # Print the compiler log
- self.PrintInfoLog("vertex shader", shader_object)
-
- # Check if compiled, and attach if it did
- compiled = glGetObjectParameterivARB(shader_object, GL_OBJECT_COMPILE_STATUS_ARB)
- if compiled:
- glAttachObjectARB(self.m_program, shader_object)
-
- # Delete the object (glAttachObjectARB makes a copy)
- glDeleteObjectARB(shader_object)
-
- # print the gl error log
- self.PrintGLError()
-
- def link(self):
- """
- Links the shaders together.
- """
- # clear error indicator
- glGetError()
-
- glLinkProgramARB(self.m_program)
-
- self.PrintInfoLog("link", self.m_program)
-
- linked = glGetObjectParameterivARB(self.m_program, GL_OBJECT_LINK_STATUS_ARB)
- if not linked:
- print "Shader failed to link"
- return
-
- glValidateProgramARB(self.m_program)
- valid = glGetObjectParameterivARB(self.m_program, GL_OBJECT_VALIDATE_STATUS_ARB)
- if not valid:
- print "Shader failed to validate"
- return
-
- def activate(self, rasty, cachingInfo, mat):
- self.pass_no+=1
- if (self.pass_no == 1):
- glDisable(GL_COLOR_MATERIAL)
- glUseProgramObjectARB(self.m_program)
- return True
-
- glEnable(GL_COLOR_MATERIAL)
- glUseProgramObjectARB(0)
- self.pass_no = 0
- return False
-
- obj = GameLogic.getCurrentController().owner
-
- mesh = obj.meshes[0]
-
- for mat in mesh.materials:
- mat.setCustomMaterial(MyMaterial())
- print mat.texture
-
- .. attribute:: texture
-
- Texture name.
-
- :type: string (read-only)
-
- .. attribute:: gl_texture
-
- OpenGL texture handle (eg for glBindTexture(GL_TEXTURE_2D, gl_texture).
-
- :type: integer (read-only)
-
- .. attribute:: material
-
- Material name.
-
- :type: string (read-only)
-
- .. attribute:: tface
-
- Texture face properties.
-
- :type: CObject (read-only)
-
- .. attribute:: tile
-
- Texture is tiling.
-
- :type: boolean
-
- .. attribute:: tilexrep
-
- Number of tile repetitions in x direction.
-
- :type: integer
-
- .. attribute:: tileyrep
-
- Number of tile repetitions in y direction.
-
- :type: integer
-
- .. attribute:: drawingmode
-
- Drawing mode for the material.
- - 2 (drawingmode & 4) Textured
- - 4 (drawingmode & 16) Light
- - 14 (drawingmode & 16384) 3d Polygon Text.
-
- :type: bitfield
-
- .. attribute:: transparent
-
- This material is transparent. All meshes with this
- material will be rendered after non transparent meshes from back
- to front.
-
- :type: boolean
-
- .. attribute:: zsort
-
- Transparent polygons in meshes with this material will be sorted back to
- front before rendering.
- Non-Transparent polygons will be sorted front to back before rendering.
-
- :type: boolean
-
- .. attribute:: lightlayer
-
- Light layers this material affects.
-
- :type: bitfield.
-
- .. attribute:: triangle
-
- Mesh data with this material is triangles. It's probably not safe to change this.
-
- :type: boolean
-
- .. attribute:: diffuse
-
- The diffuse colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: specular
-
- The specular colour of the material. black = [0.0, 0.0, 0.0] white = [1.0, 1.0, 1.0].
-
- :type: list [r, g, b]
-
- .. attribute:: shininess
-
- The shininess (specular exponent) of the material. 0.0 <= shininess <= 128.0.
-
- :type: float
-
- .. attribute:: specularity
-
- The amount of specular of the material. 0.0 <= specularity <= 1.0.
-
- :type: float
-
- .. method:: updateTexture(tface, rasty)
-
- Updates a realtime animation.
-
- :arg tface: Texture face (eg mat.tface)
- :type tface: CObject
- :arg rasty: Rasterizer
- :type rasty: CObject
-
- .. method:: setTexture(tface)
-
- Sets texture render state.
-
- :arg tface: Texture face
- :type tface: CObject
-
- .. code-block:: python
-
- mat.setTexture(mat.tface)
-
- .. method:: activate(rasty, cachingInfo)
-
- Sets material parameters for this object for rendering.
-
- Material Parameters set:
-
- #. Texture
- #. Backface culling
- #. Line drawing
- #. Specular Colour
- #. Shininess
- #. Diffuse Colour
- #. Polygon Offset.
-
- :arg rasty: Rasterizer instance.
- :type rasty: CObject
- :arg cachingInfo: Material cache instance.
- :type cachingInfo: CObject
-
- .. method:: setCustomMaterial(material)
-
- Sets the material state setup object.
-
- Using this method, you can extend or completely replace the gameengine material
- to do your own advanced multipass effects.
-
- Use this method to register your material class. Instead of the normal material,
- your class's activate method will be called just before rendering the mesh.
- This should setup the texture, material, and any other state you would like.
- It should return True to render the mesh, or False if you are finished. You should
- clean up any state Blender does not set before returning False.
-
- Activate Method Definition:
-
- .. code-block:: python
-
- def activate(self, rasty, cachingInfo, material):
-
- :arg material: The material object.
- :type material: instance
-
- .. code-block:: python
-
- class PyMaterial:
- def __init__(self):
- self.pass_no = -1
-
- def activate(self, rasty, cachingInfo, material):
- # Activate the material here.
- #
- # The activate method will be called until it returns False.
- # Every time the activate method returns True the mesh will
- # be rendered.
- #
- # rasty is a CObject for passing to material.updateTexture()
- # and material.activate()
- # cachingInfo is a CObject for passing to material.activate()
- # material is the KX_PolygonMaterial instance this material
- # was added to
-
- # default material properties:
- self.pass_no += 1
- if self.pass_no == 0:
- material.activate(rasty, cachingInfo)
- # Return True to do this pass
- return True
-
- # clean up and return False to finish.
- self.pass_no = -1
- return False
-
- # Create a new Python Material and pass it to the renderer.
- mat.setCustomMaterial(PyMaterial())
-
-.. class:: KX_RadarSensor(KX_NearSensor)
-
- Radar sensor is a near sensor with a conical sensor object.
-
- .. attribute:: coneOrigin
-
- The origin of the cone with which to test. The origin is in the middle of the cone. (read-only).
-
- :type: list of floats [x, y, z]
-
- .. attribute:: coneTarget
-
- The center of the bottom face of the cone with which to test. (read-only).
-
- :type: list of floats [x, y, z]
-
- .. attribute:: distance
-
- The height of the cone with which to test.
-
- :type: float
-
- .. attribute:: angle
-
- The angle of the cone (in degrees) with which to test.
-
- :type: float from 0 to 360
-
- .. attribute:: axis
-
- The axis on which the radar cone is cast.
-
- :type: integer from 0 to 5
-
- KX_RADAR_AXIS_POS_X, KX_RADAR_AXIS_POS_Y, KX_RADAR_AXIS_POS_Z,
- KX_RADAR_AXIS_NEG_X, KX_RADAR_AXIS_NEG_Y, KX_RADAR_AXIS_NEG_Z
-
- .. method:: getConeHeight()
-
- :return: The height of the cone with which to test.
- :rtype: float
-
-.. class:: KX_RaySensor(SCA_ISensor)
-
- A ray sensor detects the first object in a given direction.
-
- .. attribute:: propName
-
- The property the ray is looking for.
-
- :type: string
-
- .. attribute:: range
-
- The distance of the ray.
-
- :type: float
-
- .. attribute:: useMaterial
-
- Whether or not to look for a material (false = property).
-
- :type: boolean
-
- .. attribute:: useXRay
-
- Whether or not to use XRay.
-
- :type: boolean
-
- .. attribute:: hitObject
-
- The game object that was hit by the ray. (read-only).
-
- :type: :class:`KX_GameObject`
-
- .. attribute:: hitPosition
-
- The position (in worldcoordinates) where the object was hit by the ray. (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: hitNormal
-
- The normal (in worldcoordinates) of the object at the location where the object was hit by the ray. (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: rayDirection
-
- The direction from the ray (in worldcoordinates). (read-only).
-
- :type: list [x, y, z]
-
- .. attribute:: axis
-
- The axis the ray is pointing on.
-
- :type: integer from 0 to 5
-
- * KX_RAY_AXIS_POS_X
- * KX_RAY_AXIS_POS_Y
- * KX_RAY_AXIS_POS_Z
- * KX_RAY_AXIS_NEG_X
- * KX_RAY_AXIS_NEG_Y
- * KX_RAY_AXIS_NEG_Z
-
-.. class:: KX_SCA_AddObjectActuator(SCA_IActuator)
-
- Edit Object Actuator (in Add Object Mode)
-
- .. warning::
-
- An Add Object actuator will be ignored if at game start, the linked object doesn't exist (or is empty) or the linked object is in an active layer.
-
- .. code-block:: none
-
- Error: GameObject 'Name' has a AddObjectActuator 'ActuatorName' without object (in 'nonactive' layer)
-
- .. attribute:: object
-
- the object this actuator adds.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: objectLastCreated
-
- the last added object from this actuator (read-only).
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: time
-
- the lifetime of added objects, in frames. Set to 0 to disable automatic deletion.
-
- :type: integer
-
- .. attribute:: linearVelocity
-
- the initial linear velocity of added objects.
-
- :type: list [vx, vy, vz]
-
- .. attribute:: angularVelocity
-
- the initial angular velocity of added objects.
-
- :type: list [vx, vy, vz]
-
- .. method:: instantAddObject()
-
- :return: The last object created by this actuator. The object can then be accessed from :data:`objectLastCreated`.
- :rtype: None
-
-.. class:: KX_SCA_DynamicActuator(SCA_IActuator)
-
- Dynamic Actuator.
-
- .. attribute:: mode
-
- :type: integer
-
- the type of operation of the actuator, 0-4
-
- * KX_DYN_RESTORE_DYNAMICS(0)
- * KX_DYN_DISABLE_DYNAMICS(1)
- * KX_DYN_ENABLE_RIGID_BODY(2)
- * KX_DYN_DISABLE_RIGID_BODY(3)
- * KX_DYN_SET_MASS(4)
-
- .. attribute:: mass
-
- the mass value for the KX_DYN_SET_MASS operation.
-
- :type: float
-
-.. class:: KX_SCA_EndObjectActuator(SCA_IActuator)
-
- Edit Object Actuator (in End Object mode)
-
- This actuator has no python methods.
-
-.. class:: KX_SCA_ReplaceMeshActuator(SCA_IActuator)
-
- Edit Object actuator, in Replace Mesh mode.
-
- .. warning::
-
- Replace mesh actuators will be ignored if at game start, the named mesh doesn't exist.
-
- This will generate a warning in the console
-
- .. code-block:: none
-
- Error: GameObject 'Name' ReplaceMeshActuator 'ActuatorName' without object
-
- .. code-block:: python
-
- # Level-of-detail
- # Switch a game object's mesh based on its depth in the camera view.
- # +----------+ +-----------+ +-------------------------------------+
- # | Always +-----+ Python +-----+ Edit Object (Replace Mesh) LOD.Mesh |
- # +----------+ +-----------+ +-------------------------------------+
- import GameLogic
-
- # List detail meshes here
- # Mesh (name, near, far)
- # Meshes overlap so that they don't 'pop' when on the edge of the distance.
- meshes = ((".Hi", 0.0, -20.0),
- (".Med", -15.0, -50.0),
- (".Lo", -40.0, -100.0)
- )
-
- co = GameLogic.getCurrentController()
- obj = co.owner
- act = co.actuators["LOD." + obj.name]
- cam = GameLogic.getCurrentScene().active_camera
-
- def Depth(pos, plane):
- return pos[0]*plane[0] + pos[1]*plane[1] + pos[2]*plane[2] + plane[3]
-
- # Depth is negative and decreasing further from the camera
- depth = Depth(obj.position, cam.world_to_camera[2])
-
- newmesh = None
- curmesh = None
- # Find the lowest detail mesh for depth
- for mesh in meshes:
- if depth < mesh[1] and depth > mesh[2]:
- newmesh = mesh
- if "ME" + obj.name + mesh[0] == act.getMesh():
- curmesh = mesh
-
- if newmesh != None and "ME" + obj.name + newmesh[0] != act.getMesh():
- # The mesh is a different mesh - switch it.
- # Check the current mesh is not a better fit.
- if curmesh == None or curmesh[1] < depth or curmesh[2] > depth:
- act.mesh = obj.getName() + newmesh[0]
- GameLogic.addActiveActuator(act, True)
-
- .. attribute:: mesh
-
- :class:`MeshProxy` or the name of the mesh that will replace the current one.
-
- Set to None to disable actuator.
-
- :type: :class:`MeshProxy` or None if no mesh is set
-
- .. attribute:: useDisplayMesh
-
- when true the displayed mesh is replaced.
-
- :type: boolean
-
- .. attribute:: usePhysicsMesh
-
- when true the physics mesh is replaced.
-
- :type: boolean
-
- .. method:: instantReplaceMesh()
-
- Immediately replace mesh without delay.
-
-.. class:: KX_Scene(PyObjectPlus)
-
- An active scene that gives access to objects, cameras, lights and scene attributes.
-
- The activity culling stuff is supposed to disable logic bricks when their owner gets too far
- from the active camera. It was taken from some code lurking at the back of KX_Scene - who knows
- what it does!
-
- .. code-block:: python
-
- import GameLogic
-
- # get the scene
- scene = GameLogic.getCurrentScene()
-
- # print all the objects in the scene
- for obj in scene.objects:
- print obj.name
-
- # get an object named 'Cube'
- obj = scene.objects["Cube"]
-
- # get the first object in the scene.
- obj = scene.objects[0]
-
- .. code-block:: python
-
- # Get the depth of an object in the camera view.
- import GameLogic
-
- obj = GameLogic.getCurrentController().owner
- cam = GameLogic.getCurrentScene().active_camera
-
- # Depth is negative and decreasing further from the camera
- depth = obj.position[0]*cam.world_to_camera[2][0] + obj.position[1]*cam.world_to_camera[2][1] + obj.position[2]*cam.world_to_camera[2][2] + cam.world_to_camera[2][3]
-
- @bug: All attributes are read only at the moment.
-
- .. attribute:: name
-
- The scene's name, (read-only).
-
- :type: string
-
- .. attribute:: objects
-
- A list of objects in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
- .. attribute:: objectsInactive
-
- A list of objects on background layers (used for the addObject actuator), (read-only).
-
- :type: :class:`CListValue` of :class:`KX_GameObject`
-
- .. attribute:: lights
-
- A list of lights in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_LightObject`
-
- .. attribute:: cameras
-
- A list of cameras in the scene, (read-only).
-
- :type: :class:`CListValue` of :class:`KX_Camera`
-
- .. attribute:: active_camera
-
- The current active camera.
-
- :type: :class:`KX_Camera`
-
- .. note::
-
- This can be set directly from python to avoid using the :class:`KX_SceneActuator`.
-
- .. attribute:: suspended
-
- True if the scene is suspended, (read-only).
-
- :type: boolean
-
- .. attribute:: activity_culling
-
- True if the scene is activity culling.
-
- :type: boolean
-
- .. attribute:: activity_culling_radius
-
- The distance outside which to do activity culling. Measured in manhattan distance.
-
- :type: float
-
- .. attribute:: dbvt_culling
-
- True when Dynamic Bounding box Volume Tree is set (read-only).
-
- :type: boolean
-
- .. attribute:: pre_draw
-
- A list of callables to be run before the render step.
-
- :type: list
-
- .. attribute:: post_draw
-
- A list of callables to be run after the render step.
-
- :type: list
-
- .. method:: addObject(object, other, time=0)
-
- Adds an object to the scene like the Add Object Actuator would.
-
- :arg object: The object to add
- :type object: :class:`KX_GameObject` or string
- :arg other: The object's center to use when adding the object
- :type other: :class:`KX_GameObject` or string
- :arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever.
- :type time: integer
- :return: The newly added object.
- :rtype: :class:`KX_GameObject`
-
- .. method:: end()
-
- Removes the scene from the game.
-
- .. method:: restart()
-
- Restarts the scene.
-
- .. method:: replace(scene)
-
- Replaces this scene with another one.
-
- :arg scene: The name of the scene to replace this scene with.
- :type scene: string
-
- .. method:: suspend()
-
- Suspends this scene.
-
- .. method:: resume()
-
- Resume this scene.
-
- .. method:: get(key, default=None)
-
- Return the value matching key, or the default value if its not found.
- :return: The key value or a default.
-
-.. class:: KX_SceneActuator(SCA_IActuator)
-
- Scene Actuator logic brick.
-
- .. warning::
-
- Scene actuators that use a scene name will be ignored if at game start, the named scene doesn't exist or is empty
-
- This will generate a warning in the console:
-
- .. code-block:: none
-
- Error: GameObject 'Name' has a SceneActuator 'ActuatorName' (SetScene) without scene
-
- .. attribute:: scene
-
- the name of the scene to change to/overlay/underlay/remove/suspend/resume.
-
- :type: string
-
- .. attribute:: camera
-
- the camera to change to.
-
- :type: :class:`KX_Camera` on read, string or :class:`KX_Camera` on write
-
- .. note::
-
- When setting the attribute, you can use either a :class:`KX_Camera` or the name of the camera.
-
- .. attribute:: useRestart
-
- Set flag to True to restart the sene.
-
- :type: boolean
-
- .. attribute:: mode
-
- The mode of the actuator.
-
- :type: integer from 0 to 5.
-
-.. class:: KX_SoundActuator(SCA_IActuator)
-
- Sound Actuator.
-
- The :data:`startSound`, :data:`pauseSound` and :data:`stopSound` do not requirethe actuator to be activated - they act instantly provided that the actuator has been activated once at least.
-
- .. attribute:: fileName
-
- The filename of the sound this actuator plays.
-
- :type: string
-
- .. attribute:: volume
-
- The volume (gain) of the sound.
-
- :type: float
-
- .. attribute:: pitch
-
- The pitch of the sound.
-
- :type: float
-
- .. attribute:: rollOffFactor
-
- The roll off factor. Rolloff defines the rate of attenuation as the sound gets further away.
-
- :type: float
-
- .. attribute:: looping
-
- The loop mode of the actuator.
-
- :type: integer
-
- .. attribute:: position
-
- The position of the sound as a list: [x, y, z].
-
- :type: float array
-
- .. attribute:: velocity
-
- The velocity of the emitter as a list: [x, y, z]. The relative velocity to the observer determines the pitch. List of 3 floats: [x, y, z].
-
- :type: float array
-
- .. attribute:: orientation
-
- The orientation of the sound. When setting the orientation you can also use quaternion [float, float, float, float] or euler angles [float, float, float].
-
- :type: 3x3 matrix [[float]]
-
- .. attribute:: mode
-
- The operation mode of the actuator. Can be one of :ref:`these constants<logic-sound-actuator>`
-
- :type: integer
-
-.. class:: KX_StateActuator(SCA_IActuator)
-
- State actuator changes the state mask of parent object.
-
- .. attribute:: operation
-
- Type of bit operation to be applied on object state mask.
-
- You can use one of :ref:`these constants <state-actuator-operation>`
-
- :type: integer
-
- .. attribute:: mask
-
- Value that defines the bits that will be modified by the operation.
-
- The bits that are 1 in the mask will be updated in the object state.
-
- The bits that are 0 are will be left unmodified expect for the Copy operation which copies the mask to the object state.
-
- :type: integer
-
-.. class:: KX_TrackToActuator(SCA_IActuator)
-
- Edit Object actuator in Track To mode.
-
- .. warning::
-
- Track To Actuators will be ignored if at game start, the object to track to is invalid.
-
- This will generate a warning in the console:
-
- .. code-block:: none
-
- GameObject 'Name' no object in EditObjectActuator 'ActuatorName'
-
- .. attribute:: object
-
- the object this actuator tracks.
-
- :type: :class:`KX_GameObject` or None
-
- .. attribute:: time
-
- the time in frames with which to delay the tracking motion.
-
- :type: integer
-
- .. attribute:: use3D
-
- the tracking motion to use 3D.
-
- :type: boolean
-
-.. class:: KX_VehicleWrapper(PyObjectPlus)
-
- KX_VehicleWrapper
-
- TODO - description
-
- .. method:: addWheel(wheel, attachPos, attachDir, axleDir, suspensionRestLength, wheelRadius, hasSteering)
-
- Add a wheel to the vehicle
-
- :arg wheel: The object to use as a wheel.
- :type wheel: :class:`KX_GameObject` or a KX_GameObject name
- :arg attachPos: The position that this wheel will attach to.
- :type attachPos: vector of 3 floats
- :arg attachDir: The direction this wheel points.
- :type attachDir: vector of 3 floats
- :arg axleDir: The direction of this wheels axle.
- :type axleDir: vector of 3 floats
- :arg suspensionRestLength: TODO - Description
- :type suspensionRestLength: float
- :arg wheelRadius: The size of the wheel.
- :type wheelRadius: float
-
- .. method:: applyBraking(force, wheelIndex)
-
- Apply a braking force to the specified wheel
-
- :arg force: the brake force
- :type force: float
-
- :arg wheelIndex: index of the wheel where the force needs to be applied
- :type wheelIndex: integer
-
- .. method:: applyEngineForce(force, wheelIndex)
-
- Apply an engine force to the specified wheel
-
- :arg force: the engine force
- :type force: float
-
- :arg wheelIndex: index of the wheel where the force needs to be applied
- :type wheelIndex: integer
-
- .. method:: getConstraintId()
-
- Get the constraint ID
-
- :return: the constraint id
- :rtype: integer
-
- .. method:: getConstraintType()
-
- Returns the constraint type.
-
- :return: constraint type
- :rtype: integer
-
- .. method:: getNumWheels()
-
- Returns the number of wheels.
-
- :return: the number of wheels for this vehicle
- :rtype: integer
-
- .. method:: getWheelOrientationQuaternion(wheelIndex)
-
- Returns the wheel orientation as a quaternion.
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- :return: TODO Description
- :rtype: TODO - type should be quat as per method name but from the code it looks like a matrix
-
- .. method:: getWheelPosition(wheelIndex)
-
- Returns the position of the specified wheel
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
- :return: position vector
- :rtype: list[x, y, z]
-
- .. method:: getWheelRotation(wheelIndex)
-
- Returns the rotation of the specified wheel
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- :return: the wheel rotation
- :rtype: float
-
- .. method:: setRollInfluence(rollInfluece, wheelIndex)
-
- Set the specified wheel's roll influence.
- The higher the roll influence the more the vehicle will tend to roll over in corners.
-
- :arg rollInfluece: the wheel roll influence
- :type rollInfluece: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSteeringValue(steering, wheelIndex)
-
- Set the specified wheel's steering
-
- :arg steering: the wheel steering
- :type steering: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionCompression(compression, wheelIndex)
-
- Set the specified wheel's compression
-
- :arg compression: the wheel compression
- :type compression: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionDamping(damping, wheelIndex)
-
- Set the specified wheel's damping
-
- :arg damping: the wheel damping
- :type damping: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setSuspensionStiffness(stiffness, wheelIndex)
-
- Set the specified wheel's stiffness
-
- :arg stiffness: the wheel stiffness
- :type stiffness: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
- .. method:: setTyreFriction(friction, wheelIndex)
-
- Set the specified wheel's tyre friction
-
- :arg friction: the tyre friction
- :type friction: float
-
- :arg wheelIndex: the wheel index
- :type wheelIndex: integer
-
-.. class:: KX_VertexProxy(SCA_IObject)
-
- A vertex holds position, UV, colour and normal information.
-
- Note:
- The physics simulation is NOT currently updated - physics will not respond
- to changes in the vertex position.
-
- .. attribute:: XYZ
-
- The position of the vertex.
-
- :type: list [x, y, z]
-
- .. attribute:: UV
-
- The texture coordinates of the vertex.
-
- :type: list [u, v]
-
- .. attribute:: normal
-
- The normal of the vertex.
-
- :type: list [nx, ny, nz]
-
- .. attribute:: colour
-
- The colour of the vertex.
-
- :type: list [r, g, b, a]
-
- Black = [0.0, 0.0, 0.0, 1.0], White = [1.0, 1.0, 1.0, 1.0]
-
- .. attribute:: color
-
- Synonym for colour.
-
- .. attribute:: x
-
- The x coordinate of the vertex.
-
- :type: float
-
- .. attribute:: y
-
- The y coordinate of the vertex.
-
- :type: float
-
- .. attribute:: z
-
- The z coordinate of the vertex.
-
- :type: float
-
- .. attribute:: u
-
- The u texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: v
-
- The v texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: u2
-
- The second u texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: v2
-
- The second v texture coordinate of the vertex.
-
- :type: float
-
- .. attribute:: r
-
- The red component of the vertex colour. 0.0 <= r <= 1.0.
-
- :type: float
-
- .. attribute:: g
-
- The green component of the vertex colour. 0.0 <= g <= 1.0.
-
- :type: float
-
- .. attribute:: b
-
- The blue component of the vertex colour. 0.0 <= b <= 1.0.
-
- :type: float
-
- .. attribute:: a
-
- The alpha component of the vertex colour. 0.0 <= a <= 1.0.
-
- :type: float
-
- .. method:: getXYZ()
-
- Gets the position of this vertex.
-
- :return: this vertexes position in local coordinates.
- :rtype: list [x, y, z]
-
- .. method:: setXYZ(pos)
-
- Sets the position of this vertex.
-
- :type: list [x, y, z]
-
- :arg pos: the new position for this vertex in local coordinates.
-
- .. method:: getUV()
-
- Gets the UV (texture) coordinates of this vertex.
-
- :return: this vertexes UV (texture) coordinates.
- :rtype: list [u, v]
-
- .. method:: setUV(uv)
-
- Sets the UV (texture) coordinates of this vertex.
-
- :type: list [u, v]
-
- .. method:: getUV2()
-
- Gets the 2nd UV (texture) coordinates of this vertex.
-
- :return: this vertexes UV (texture) coordinates.
- :rtype: list [u, v]
-
- .. method:: setUV2(uv, unit)
-
- Sets the 2nd UV (texture) coordinates of this vertex.
-
- :type: list [u, v]
-
- :arg unit: optional argument, FLAT==1, SECOND_UV==2, defaults to SECOND_UV
- :arg unit: integer
-
- .. method:: getRGBA()
-
- Gets the colour of this vertex.
-
- The colour is represented as four bytes packed into an integer value. The colour is
- packed as RGBA.
-
- Since Python offers no way to get each byte without shifting, you must use the struct module to
- access colour in an machine independent way.
-
- Because of this, it is suggested you use the r, g, b and a attributes or the colour attribute instead.
-
- .. code-block:: python
-
- import struct;
- col = struct.unpack('4B', struct.pack('I', v.getRGBA()))
- # col = (r, g, b, a)
- # black = ( 0, 0, 0, 255)
- # white = (255, 255, 255, 255)
-
- :return: packed colour. 4 byte integer with one byte per colour channel in RGBA format.
- :rtype: integer
-
- .. method:: setRGBA(col)
-
- Sets the colour of this vertex.
-
- See getRGBA() for the format of col, and its relevant problems. Use the r, g, b and a attributes
- or the colour attribute instead.
-
- setRGBA() also accepts a four component list as argument col. The list represents the colour as [r, g, b, a]
- with black = [0.0, 0.0, 0.0, 1.0] and white = [1.0, 1.0, 1.0, 1.0]
-
- .. code-block:: python
-
- v.setRGBA(0xff0000ff) # Red
- v.setRGBA(0xff00ff00) # Green on little endian, transparent purple on big endian
- v.setRGBA([1.0, 0.0, 0.0, 1.0]) # Red
- v.setRGBA([0.0, 1.0, 0.0, 1.0]) # Green on all platforms.
-
- :arg col: the new colour of this vertex in packed RGBA format.
- :type col: integer or list [r, g, b, a]
-
- .. method:: getNormal()
-
- Gets the normal vector of this vertex.
-
- :return: normalised normal vector.
- :rtype: list [nx, ny, nz]
-
- .. method:: setNormal(normal)
-
- Sets the normal vector of this vertex.
-
- :type: sequence of floats [r, g, b]
-
- :arg normal: the new normal of this vertex.
-
-.. class:: KX_VisibilityActuator(SCA_IActuator)
-
- Visibility Actuator.
-
- .. attribute:: visibility
-
- whether the actuator makes its parent object visible or invisible.
-
- :type: boolean
-
- .. attribute:: useOcclusion
-
- whether the actuator makes its parent object an occluder or not.
-
- :type: boolean
-
- .. attribute:: useRecursion
-
- whether the visibility/occlusion should be propagated to all children of the object.
-
- :type: boolean
-
-.. class:: SCA_2DFilterActuator(SCA_IActuator)
-
- Create, enable and disable 2D filters
-
- The following properties don't have an immediate effect.
- You must active the actuator to get the result.
- The actuator is not persistent: it automatically stops itself after setting up the filter
- but the filter remains active. To stop a filter you must activate the actuator with 'type'
- set to :data:`~bge.logic.RAS_2DFILTER_DISABLED` or :data:`~bge.logic.RAS_2DFILTER_NOFILTER`.
-
- .. attribute:: shaderText
-
- shader source code for custom shader.
-
- :type: string
-
- .. attribute:: disableMotionBlur
-
- action on motion blur: 0=enable, 1=disable.
-
- :type: integer
-
- .. attribute:: mode
-
- Type of 2D filter, use one of :ref:`these constants <Two-D-FilterActuator-mode>`
-
- :type: integer
-
- .. attribute:: passNumber
-
- order number of filter in the stack of 2D filters. Filters are executed in increasing order of passNb.
-
- Only be one filter can be defined per passNb.
-
- :type: integer (0-100)
-
- .. attribute:: value
-
- argument for motion blur filter.
-
- :type: float (0.0-100.0)
-
-.. class:: SCA_ANDController(SCA_IController)
-
- An AND controller activates only when all linked sensors are activated.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_ActuatorSensor(SCA_ISensor)
-
- Actuator sensor detect change in actuator state of the parent object.
- It generates a positive pulse if the corresponding actuator is activated
- and a negative pulse if the actuator is deactivated.
-
- .. attribute:: actuator
-
- the name of the actuator that the sensor is monitoring.
-
- :type: string
-
-.. class:: SCA_AlwaysSensor(SCA_ISensor)
-
- This sensor is always activated.
-
-.. class:: SCA_DelaySensor(SCA_ISensor)
-
- The Delay sensor generates positive and negative triggers at precise time,
- expressed in number of frames. The delay parameter defines the length of the initial OFF period. A positive trigger is generated at the end of this period.
-
- The duration parameter defines the length of the ON period following the OFF period.
- There is a negative trigger at the end of the ON period. If duration is 0, the sensor stays ON and there is no negative trigger.
-
- The sensor runs the OFF-ON cycle once unless the repeat option is set: the OFF-ON cycle repeats indefinately (or the OFF cycle if duration is 0).
-
- Use :class:`SCA_ISensor.reset` at any time to restart sensor.
-
- .. attribute:: delay
-
- length of the initial OFF period as number of frame, 0 for immediate trigger.
-
- :type: integer.
-
- .. attribute:: duration
-
- length of the ON period in number of frame after the initial OFF period.
-
- If duration is greater than 0, a negative trigger is sent at the end of the ON pulse.
-
- :type: integer
-
- .. attribute:: repeat
-
- 1 if the OFF-ON cycle should be repeated indefinately, 0 if it should run once.
-
- :type: integer
-
-.. class:: SCA_JoystickSensor(SCA_ISensor)
-
- This sensor detects player joystick events.
-
- .. attribute:: axisValues
-
- The state of the joysticks axis as a list of values :data:`numAxis` long. (read-only).
-
- :type: list of ints.
-
- Each spesifying the value of an axis between -32767 and 32767 depending on how far the axis is pushed, 0 for nothing.
- The first 2 values are used by most joysticks and gamepads for directional control. 3rd and 4th values are only on some joysticks and can be used for arbitary controls.
-
- * left:[-32767, 0, ...]
- * right:[32767, 0, ...]
- * up:[0, -32767, ...]
- * down:[0, 32767, ...]
-
- .. attribute:: axisSingle
-
- like :data:`axisValues` but returns a single axis value that is set by the sensor. (read-only).
-
- :type: integer
-
- .. note::
-
- Only use this for "Single Axis" type sensors otherwise it will raise an error.
-
- .. attribute:: hatValues
-
- The state of the joysticks hats as a list of values :data:`numHats` long. (read-only).
-
- :type: list of ints
-
- Each spesifying the direction of the hat from 1 to 12, 0 when inactive.
-
- Hat directions are as follows...
-
- * 0:None
- * 1:Up
- * 2:Right
- * 4:Down
- * 8:Left
- * 3:Up - Right
- * 6:Down - Right
- * 12:Down - Left
- * 9:Up - Left
-
- .. attribute:: hatSingle
-
- Like :data:`hatValues` but returns a single hat direction value that is set by the sensor. (read-only).
-
- :type: integer
-
- .. attribute:: numAxis
-
- The number of axes for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: numButtons
-
- The number of buttons for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: numHats
-
- The number of hats for the joystick at this index. (read-only).
-
- :type: integer
-
- .. attribute:: connected
-
- True if a joystick is connected at this joysticks index. (read-only).
-
- :type: boolean
-
- .. attribute:: index
-
- The joystick index to use (from 0 to 7). The first joystick is always 0.
-
- :type: integer
-
- .. attribute:: threshold
-
- Axis threshold. Joystick axis motion below this threshold wont trigger an event. Use values between (0 and 32767), lower values are more sensitive.
-
- :type: integer
-
- .. attribute:: button
-
- The button index the sensor reacts to (first button = 0). When the "All Events" toggle is set, this option has no effect.
-
- :type: integer
-
- .. attribute:: axis
-
- The axis this sensor reacts to, as a list of two values [axisIndex, axisDirection]
-
- * axisIndex: the axis index to use when detecting axis movement, 1=primary directional control, 2=secondary directional control.
- * axisDirection: 0=right, 1=up, 2=left, 3=down.
-
- :type: [integer, integer]
-
- .. attribute:: hat
-
- The hat the sensor reacts to, as a list of two values: [hatIndex, hatDirection]
-
- * hatIndex: the hat index to use when detecting hat movement, 1=primary hat, 2=secondary hat (4 max).
- * hatDirection: 1-12.
-
- :type: [integer, integer]
-
- .. method:: getButtonActiveList()
-
- :return: A list containing the indicies of the currently pressed buttons.
- :rtype: list
-
- .. method:: getButtonStatus(buttonIndex)
-
- :arg buttonIndex: the button index, 0=first button
- :type buttonIndex: integer
- :return: The current pressed state of the specified button.
- :rtype: boolean
-
-.. class:: SCA_KeyboardSensor(SCA_ISensor)
-
- A keyboard sensor detects player key presses.
-
- See module :mod:`bge.keys` for keycode values.
-
- .. attribute:: key
-
- The key code this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: hold1
-
- The key code for the first modifier this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: hold2
-
- The key code for the second modifier this sensor is looking for.
-
- :type: keycode from :mod:`bge.keys` module
-
- .. attribute:: toggleProperty
-
- The name of the property that indicates whether or not to log keystrokes as a string.
-
- :type: string
-
- .. attribute:: targetProperty
-
- The name of the property that receives keystrokes in case in case a string is logged.
-
- :type: string
-
- .. attribute:: useAllKeys
-
- Flag to determine whether or not to accept all keys.
-
- :type: boolean
-
- .. attribute:: events
-
- a list of pressed keys that have either been pressed, or just released, or are active this frame. (read-only).
-
- :type: list [[:ref:`keycode<keyboard-keys>`, :ref:`status<input-status>`], ...]
-
- .. method:: getKeyStatus(keycode)
-
- Get the status of a key.
-
- :arg keycode: The code that represents the key you want to get the state of, use one of :ref:`these constants<keyboard-keys>`
- :type keycode: integer
- :return: The state of the given key, can be one of :ref:`these constants<input-status>`
- :rtype: int
-
-.. class:: SCA_NANDController(SCA_IController)
-
- An NAND controller activates when all linked sensors are not active.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_NORController(SCA_IController)
-
- An NOR controller activates only when all linked sensors are de-activated.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_ORController(SCA_IController)
-
- An OR controller activates when any connected sensor activates.
-
- There are no special python methods for this controller.
-
-.. class:: SCA_PropertyActuator(SCA_IActuator)
-
- Property Actuator
-
- .. attribute:: propName
-
- the property on which to operate.
-
- :type: string
-
- .. attribute:: value
-
- the value with which the actuator operates.
-
- :type: string
-
- .. attribute:: mode
-
- TODO - add constants to game logic dict!.
-
- :type: integer
-
-.. class:: SCA_PropertySensor(SCA_ISensor)
-
- Activates when the game object property matches.
-
- .. attribute:: mode
-
- Type of check on the property. Can be one of :ref:`these constants <logic-property-sensor>`
-
- :type: integer.
-
- .. attribute:: propName
-
- the property the sensor operates.
-
- :type: string
-
- .. attribute:: value
-
- the value with which the sensor compares to the value of the property.
-
- :type: string
-
- .. attribute:: min
-
- the minimum value of the range used to evaluate the property when in interval mode.
-
- :type: string
-
- .. attribute:: max
-
- the maximum value of the range used to evaluate the property when in interval mode.
-
- :type: string
-
-.. class:: SCA_PythonController(SCA_IController)
-
- A Python controller uses a Python script to activate it's actuators,
- based on it's sensors.
-
- .. attribute:: script
-
- The value of this variable depends on the execution methid.
-
- * When 'Script' execution mode is set this value contains the entire python script as a single string (not the script name as you might expect) which can be modified to run different scripts.
- * When 'Module' execution mode is set this value will contain a single line string - module name and function "module.func" or "package.modile.func" where the module names are python textblocks or external scripts.
-
- :type: string
-
- .. note::
-
- Once this is set the script name given for warnings will remain unchanged.
-
- .. attribute:: mode
-
- the execution mode for this controller (read-only).
-
- * Script: 0, Execite the :data:`script` as a python code.
- * Module: 1, Execite the :data:`script` as a module and function.
-
- :type: integer
-
- .. method:: activate(actuator)
-
- Activates an actuator attached to this controller.
-
- :arg actuator: The actuator to operate on.
- :type actuator: actuator or the actuator name as a string
-
- .. method:: deactivate(actuator)
-
- Deactivates an actuator attached to this controller.
-
- :arg actuator: The actuator to operate on.
- :type actuator: actuator or the actuator name as a string
-
-.. class:: SCA_RandomActuator(SCA_IActuator)
-
- Random Actuator
-
- .. attribute:: seed
-
- Seed of the random number generator.
-
- :type: integer.
-
- Equal seeds produce equal series. If the seed is 0, the generator will produce the same value on every call.
-
- .. attribute:: para1
-
- the first parameter of the active distribution.
-
- :type: float, read-only.
-
- Refer to the documentation of the generator types for the meaning of this value.
-
- .. attribute:: para2
-
- the second parameter of the active distribution.
-
- :type: float, read-only
-
- Refer to the documentation of the generator types for the meaning of this value.
-
- .. attribute:: distribution
-
- Distribution type. (read-only). Can be one of :ref:`these constants <logic-random-distributions>`
-
- :type: integer
-
- .. attribute:: propName
-
- the name of the property to set with the random value.
-
- :type: string
-
- If the generator and property types do not match, the assignment is ignored.
-
- .. method:: setBoolConst(value)
-
- Sets this generator to produce a constant boolean value.
-
- :arg value: The value to return.
- :type value: boolean
-
- .. method:: setBoolUniform()
-
- Sets this generator to produce a uniform boolean distribution.
-
- The generator will generate True or False with 50% chance.
-
- .. method:: setBoolBernouilli(value)
-
- Sets this generator to produce a Bernouilli distribution.
-
- :arg value: Specifies the proportion of False values to produce.
-
- * 0.0: Always generate True
- * 1.0: Always generate False
- :type value: float
-
- .. method:: setIntConst(value)
-
- Sets this generator to always produce the given value.
-
- :arg value: the value this generator produces.
- :type value: integer
-
- .. method:: setIntUniform(lower_bound, upper_bound)
-
- Sets this generator to produce a random value between the given lower and
- upper bounds (inclusive).
-
- :type lower_bound: integer
- :type upper_bound: integer
-
- .. method:: setIntPoisson(value)
-
- Generate a Poisson-distributed number.
-
- This performs a series of Bernouilli tests with parameter value.
- It returns the number of tries needed to achieve succes.
-
- :type value: float
-
- .. method:: setFloatConst(value)
-
- Always generate the given value.
-
- :type value: float
-
- .. method:: setFloatUniform(lower_bound, upper_bound)
-
- Generates a random float between lower_bound and upper_bound with a
- uniform distribution.
-
- :type lower_bound: float
- :type upper_bound: float
-
- .. method:: setFloatNormal(mean, standard_deviation)
-
- Generates a random float from the given normal distribution.
-
- :arg mean: The mean (average) value of the generated numbers
- :type mean: float
- :arg standard_deviation: The standard deviation of the generated numbers.
- :type standard_deviation: float
-
- .. method:: setFloatNegativeExponential(half_life)
-
- Generate negative-exponentially distributed numbers.
-
- The half-life 'time' is characterized by half_life.
-
- :type half_life: float
-
-.. class:: SCA_RandomSensor(SCA_ISensor)
-
- This sensor activates randomly.
-
- .. attribute:: lastDraw
-
- The seed of the random number generator.
-
- :type: integer
-
- .. attribute:: seed
-
- The seed of the random number generator.
-
- :type: integer
-
- .. method:: setSeed(seed)
-
- Sets the seed of the random number generator.
-
- If the seed is 0, the generator will produce the same value on every call.
-
- :type seed: integer
-
- .. method:: getSeed()
-
- :return: The initial seed of the generator. Equal seeds produce equal random series.
- :rtype: integer
-
- .. method:: getLastDraw()
-
- :return: The last random number generated.
- :rtype: integer
-
-.. class:: SCA_XNORController(SCA_IController)
-
- An XNOR controller activates when all linked sensors are the same (activated or inative).
-
- There are no special python methods for this controller.
-
-.. class:: SCA_XORController(SCA_IController)
-
- An XOR controller activates when there is the input is mixed, but not when all are on or off.
-
- There are no special python methods for this controller.
-
-.. class:: KX_Camera(KX_GameObject)
-
- A Camera object.
-
- .. data:: INSIDE
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. data:: INTERSECT
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. data:: OUTSIDE
-
- See :data:`sphereInsideFrustum` and :data:`boxInsideFrustum`
-
- .. attribute:: lens
-
- The camera's lens value.
-
- :type: float
-
- .. attribute:: ortho_scale
-
- The camera's view scale when in orthographic mode.
-
- :type: float
-
- .. attribute:: near
-
- The camera's near clip distance.
-
- :type: float
-
- .. attribute:: far
-
- The camera's far clip distance.
-
- :type: float
-
- .. attribute:: perspective
-
- True if this camera has a perspective transform, False for an orthographic projection.
-
- :type: boolean
-
- .. attribute:: frustum_culling
-
- True if this camera is frustum culling.
-
- :type: boolean
-
- .. attribute:: projection_matrix
-
- This camera's 4x4 projection matrix.
-
- :type: 4x4 Matrix [[float]]
-
- .. attribute:: modelview_matrix
-
- This camera's 4x4 model view matrix. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- This matrix is regenerated every frame from the camera's position and orientation.
-
- .. attribute:: camera_to_world
-
- This camera's camera to world transform. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- This matrix is regenerated every frame from the camera's position and orientation.
-
- .. attribute:: world_to_camera
-
- This camera's world to camera transform. (read-only).
-
- :type: 4x4 Matrix [[float]]
-
- .. note::
-
- Regenerated every frame from the camera's position and orientation.
-
- .. note::
-
- This is camera_to_world inverted.
-
- .. attribute:: useViewport
-
- True when the camera is used as a viewport, set True to enable a viewport for this camera.
-
- :type: boolean
-
- .. method:: sphereInsideFrustum(centre, radius)
-
- Tests the given sphere against the view frustum.
-
- :arg centre: The centre of the sphere (in world coordinates.)
- :type centre: list [x, y, z]
- :arg radius: the radius of the sphere
- :type radius: float
- :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT`
- :rtype: integer
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # A sphere of radius 4.0 located at [x, y, z] = [1.0, 1.0, 1.0]
- if (cam.sphereInsideFrustum([1.0, 1.0, 1.0], 4) != cam.OUTSIDE):
- # Sphere is inside frustum !
- # Do something useful !
- else:
- # Sphere is outside frustum
-
- .. method:: boxInsideFrustum(box)
-
- Tests the given box against the view frustum.
-
- :arg box: Eight (8) corner points of the box (in world coordinates.)
- :type box: list of lists
- :return: :data:`~bge.types.KX_Camera.INSIDE`, :data:`~bge.types.KX_Camera.OUTSIDE` or :data:`~bge.types.KX_Camera.INTERSECT`
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # Box to test...
- box = []
- box.append([-1.0, -1.0, -1.0])
- box.append([-1.0, -1.0, 1.0])
- box.append([-1.0, 1.0, -1.0])
- box.append([-1.0, 1.0, 1.0])
- box.append([ 1.0, -1.0, -1.0])
- box.append([ 1.0, -1.0, 1.0])
- box.append([ 1.0, 1.0, -1.0])
- box.append([ 1.0, 1.0, 1.0])
-
- if (cam.boxInsideFrustum(box) != cam.OUTSIDE):
- # Box is inside/intersects frustum !
- # Do something useful !
- else:
- # Box is outside the frustum !
-
- .. method:: pointInsideFrustum(point)
-
- Tests the given point against the view frustum.
-
- :arg point: The point to test (in world coordinates.)
- :type point: 3D Vector
- :return: True if the given point is inside this camera's viewing frustum.
- :rtype: boolean
-
- .. note::
-
- When the camera is first initialized the result will be invalid because the projection matrix has not been set.
-
- .. code-block:: python
-
- import GameLogic
- co = GameLogic.getCurrentController()
- cam = co.owner
-
- # Test point [0.0, 0.0, 0.0]
- if (cam.pointInsideFrustum([0.0, 0.0, 0.0])):
- # Point is inside frustum !
- # Do something useful !
- else:
- # Box is outside the frustum !
-
- .. method:: getCameraToWorld()
-
- Returns the camera-to-world transform.
-
- :return: the camera-to-world transform matrix.
- :rtype: matrix (4x4 list)
-
- .. method:: getWorldToCamera()
-
- Returns the world-to-camera transform.
-
- This returns the inverse matrix of getCameraToWorld().
-
- :return: the world-to-camera transform matrix.
- :rtype: matrix (4x4 list)
-
- .. method:: setOnTop()
-
- Set this cameras viewport ontop of all other viewport.
-
- .. method:: setViewport(left, bottom, right, top)
-
- Sets the region of this viewport on the screen in pixels.
-
- Use :data:`bge.render.getWindowHeight` and :data:`bge.render.getWindowWidth` to calculate values relative to the entire display.
-
- :arg left: left pixel coordinate of this viewport
- :type left: integer
- :arg bottom: bottom pixel coordinate of this viewport
- :type bottom: integer
- :arg right: right pixel coordinate of this viewport
- :type right: integer
- :arg top: top pixel coordinate of this viewport
- :type top: integer
-
- .. method:: getScreenPosition(object)
-
- Gets the position of an object projected on screen space.
-
- .. code-block:: python
-
- # For an object in the middle of the screen, coord = [0.5, 0.5]
- coord = camera.getScreenPosition(object)
-
- :arg object: object name or list [x, y, z]
- :type object: :class:`KX_GameObject` or 3D Vector
- :return: the object's position in screen coordinates.
- :rtype: list [x, y]
-
- .. method:: getScreenVect(x, y)
-
- Gets the vector from the camera position in the screen coordinate direction.
-
- :arg x: X Axis
- :type x: float
- :arg y: Y Axis
- :type y: float
- :rtype: 3D Vector
- :return: The vector from screen coordinate.
-
- .. code-block:: python
-
- # Gets the vector of the camera front direction:
- m_vect = camera.getScreenVect(0.5, 0.5)
-
- .. method:: getScreenRay(x, y, dist=inf, property=None)
-
- Look towards a screen coordinate (x, y) and find first object hit within dist that matches prop.
- The ray is similar to KX_GameObject->rayCastTo.
-
- :arg x: X Axis
- :type x: float
- :arg y: Y Axis
- :type y: float
- :arg dist: max distance to look (can be negative => look behind); 0 or omitted => detect up to other
- :type dist: float
- :arg property: property name that object must have; can be omitted => detect any object
- :type property: string
- :rtype: :class:`KX_GameObject`
- :return: the first object hit or None if no object or object does not match prop
-
- .. code-block:: python
-
- # Gets an object with a property "wall" in front of the camera within a distance of 100:
- target = camera.getScreenRay(0.5, 0.5, 100, "wall")
-
-.. class:: BL_ArmatureObject(KX_GameObject)
-
- An armature object.
-
- .. attribute:: constraints
-
- The list of armature constraint defined on this armature.
- Elements of the list can be accessed by index or string.
- The key format for string access is '<bone_name>:<constraint_name>'.
-
- :type: list of :class:`BL_ArmatureConstraint`
-
- .. attribute:: channels
-
- The list of armature channels.
- Elements of the list can be accessed by index or name the bone.
-
- :type: list of :class:`BL_ArmatureChannel`
-
- .. method:: update()
-
- Ensures that the armature will be updated on next graphic frame.
-
- This action is unecessary if a KX_ArmatureActuator with mode run is active
- or if an action is playing. Use this function in other cases. It must be called
- on each frame to ensure that the armature is updated continously.
-
-.. class:: BL_ArmatureActuator(SCA_IActuator)
-
- Armature Actuators change constraint condition on armatures.
-
- .. _armatureactuator-constants-type:
-
- Constants related to :data:`~bge.types.BL_ArmatureActuator.type`
-
- .. data:: KX_ACT_ARMATURE_RUN
-
- Just make sure the armature will be updated on the next graphic frame. This is the only persistent mode of the actuator: it executes automatically once per frame until stopped by a controller
-
- :value: 0
-
- .. data:: KX_ACT_ARMATURE_ENABLE
-
- Enable the constraint.
-
- :value: 1
-
- .. data:: KX_ACT_ARMATURE_DISABLE
-
- Disable the constraint (runtime constraint values are not updated).
-
- :value: 2
-
- .. data:: KX_ACT_ARMATURE_SETTARGET
-
- Change target and subtarget of constraint.
-
- :value: 3
-
- .. data:: KX_ACT_ARMATURE_SETWEIGHT
-
- Change weight of (only for IK constraint).
-
- :value: 4
-
- .. attribute:: type
-
- The type of action that the actuator executes when it is active.
-
- Can be one of :ref:`these constants <armatureactuator-constants-type>`
-
- :type: integer
-
- .. attribute:: constraint
-
- The constraint object this actuator is controlling.
-
- :type: :class:`BL_ArmatureConstraint`
-
- .. attribute:: target
-
- The object that this actuator will set as primary target to the constraint it controls.
-
- :type: :class:`KX_GameObject`
-
- .. attribute:: subtarget
-
- The object that this actuator will set as secondary target to the constraint it controls.
-
- :type: :class:`KX_GameObject`.
-
- .. note::
-
- Currently, the only secondary target is the pole target for IK constraint.
-
- .. attribute:: weight
-
- The weight this actuator will set on the constraint it controls.
-
- :type: float.
-
- .. note::
-
- Currently only the IK constraint has a weight. It must be a value between 0 and 1.
-
- .. note::
-
- A weight of 0 disables a constraint while still updating constraint runtime values (see :class:`BL_ArmatureConstraint`)
-
-.. class:: KX_ArmatureSensor(SCA_ISensor)
-
- Armature sensor detect conditions on armatures.
-
- .. _armaturesensor-type:
-
- Constants related to :data:`type`
-
- .. data:: KX_ARMSENSOR_STATE_CHANGED
-
- Detect that the constraint is changing state (active/inactive)
-
- :value: 0
-
- .. data:: KX_ARMSENSOR_LIN_ERROR_BELOW
-
- Detect that the constraint linear error is above a threshold
-
- :value: 1
-
- .. data:: KX_ARMSENSOR_LIN_ERROR_ABOVE
-
- Detect that the constraint linear error is below a threshold
-
- :value: 2
-
- .. data:: KX_ARMSENSOR_ROT_ERROR_BELOW
-
- Detect that the constraint rotation error is above a threshold
-
- :value: 3
-
- .. data:: KX_ARMSENSOR_ROT_ERROR_ABOVE
-
- Detect that the constraint rotation error is below a threshold
-
- :value: 4
-
- .. attribute:: type
-
- The type of measurement that the sensor make when it is active.
-
- Can be one of :ref:`these constants <armaturesensor-type>`
-
- :type: integer.
-
- .. attribute:: constraint
-
- The constraint object this sensor is watching.
-
- :type: :class:`BL_ArmatureConstraint`
-
- .. attribute:: value
-
- The threshold used in the comparison with the constraint error
- The linear error is only updated on CopyPose/Distance IK constraint with iTaSC solver
- The rotation error is only updated on CopyPose+rotation IK constraint with iTaSC solver
- The linear error on CopyPose is always >= 0: it is the norm of the distance between the target and the bone
- The rotation error on CopyPose is always >= 0: it is the norm of the equivalent rotation vector between the bone and the target orientations
- The linear error on Distance can be positive if the distance between the bone and the target is greater than the desired distance, and negative if the distance is smaller.
-
- :type: float
-
-.. class:: BL_ArmatureConstraint(PyObjectPlus)
-
- Proxy to Armature Constraint. Allows to change constraint on the fly.
- Obtained through :class:`BL_ArmatureObject`.constraints.
-
- .. note::
-
- Not all armature constraints are supported in the GE.
-
- .. _armatureconstraint-constants-type:
-
- Constants related to :data:`type`
-
- .. data:: CONSTRAINT_TYPE_TRACKTO
- .. data:: CONSTRAINT_TYPE_KINEMATIC
- .. data:: CONSTRAINT_TYPE_ROTLIKE
- .. data:: CONSTRAINT_TYPE_LOCLIKE
- .. data:: CONSTRAINT_TYPE_MINMAX
- .. data:: CONSTRAINT_TYPE_SIZELIKE
- .. data:: CONSTRAINT_TYPE_LOCKTRACK
- .. data:: CONSTRAINT_TYPE_STRETCHTO
- .. data:: CONSTRAINT_TYPE_CLAMPTO
- .. data:: CONSTRAINT_TYPE_TRANSFORM
- .. data:: CONSTRAINT_TYPE_DISTLIMIT
-
- .. _armatureconstraint-constants-ik-type:
-
- Constants related to :data:`ik_type`
-
- .. data:: CONSTRAINT_IK_COPYPOSE
-
- constraint is trying to match the position and eventually the rotation of the target.
-
- :value: 0
-
- .. data:: CONSTRAINT_IK_DISTANCE
-
- Constraint is maintaining a certain distance to target subject to ik_mode
-
- :value: 1
-
- .. _armatureconstraint-constants-ik-flag:
-
- Constants related to :data:`ik_flag`
-
- .. data:: CONSTRAINT_IK_FLAG_TIP
-
- Set when the constraint operates on the head of the bone and not the tail
-
- :value: 1
-
- .. data:: CONSTRAINT_IK_FLAG_ROT
-
- Set when the constraint tries to match the orientation of the target
-
- :value: 2
-
- .. data:: CONSTRAINT_IK_FLAG_STRETCH
-
- Set when the armature is allowed to stretch (only the bones with stretch factor > 0.0)
-
- :value: 16
-
- .. data:: CONSTRAINT_IK_FLAG_POS
-
- Set when the constraint tries to match the position of the target.
-
- :value: 32
-
- .. _armatureconstraint-constants-ik-mode:
-
- Constants related to :data:`ik_mode`
-
- .. data:: CONSTRAINT_IK_MODE_INSIDE
-
- The constraint tries to keep the bone within ik_dist of target
-
- :value: 0
-
- .. data:: CONSTRAINT_IK_MODE_OUTSIDE
-
- The constraint tries to keep the bone outside ik_dist of the target
-
- :value: 1
-
- .. data:: CONSTRAINT_IK_MODE_ONSURFACE
-
- The constraint tries to keep the bone exactly at ik_dist of the target.
-
- :value: 2
-
- .. attribute:: type
-
- Type of constraint, (read-only).
-
- Use one of :ref:`these constants<armatureconstraint-constants-type>`.
-
- :type: integer, one of CONSTRAINT_TYPE_* constants
-
- .. attribute:: name
-
- Name of constraint constructed as <bone_name>:<constraint_name>. constraints list.
-
- :type: string
-
- This name is also the key subscript on :class:`BL_ArmatureObject`.
-
- .. attribute:: enforce
-
- fraction of constraint effect that is enforced. Between 0 and 1.
-
- :type: float
-
- .. attribute:: headtail
-
- Position of target between head and tail of the target bone: 0=head, 1=tail.
-
- :type: float.
-
- .. note::
-
- Only used if the target is a bone (i.e target object is an armature.
-
- .. attribute:: lin_error
-
- runtime linear error (in Blender units) on constraint at the current frame.
-
- This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver.
-
- :type: float
-
- .. attribute:: rot_error
-
- Runtime rotation error (in radiant) on constraint at the current frame.
-
- :type: float.
-
- This is a runtime value updated on each frame by the IK solver. Only available on IK constraint and iTaSC solver.
-
- It is only set if the constraint has a rotation part, for example, a CopyPose+Rotation IK constraint.
-
- .. attribute:: target
-
- Primary target object for the constraint. The position of this object in the GE will be used as target for the constraint.
-
- :type: :class:`KX_GameObject`.
-
- .. attribute:: subtarget
-
- Secondary target object for the constraint. The position of this object in the GE will be used as secondary target for the constraint.
-
- :type: :class:`KX_GameObject`.
-
- Currently this is only used for pole target on IK constraint.
-
- .. attribute:: active
-
- True if the constraint is active.
-
- :type: boolean
-
- .. note::
-
- An inactive constraint does not update lin_error and rot_error.
-
- .. attribute:: ik_weight
-
- Weight of the IK constraint between 0 and 1.
-
- Only defined for IK constraint.
-
- :type: float
-
- .. attribute:: ik_type
-
- Type of IK constraint, (read-only).
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-type>`.
-
- :type: integer.
-
- .. attribute:: ik_flag
-
- Combination of IK constraint option flags, read-only.
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-flag>`.
-
- :type: integer
-
- .. attribute:: ik_dist
-
- Distance the constraint is trying to maintain with target, only used when ik_type=CONSTRAINT_IK_DISTANCE.
-
- :type: float
-
- .. attribute:: ik_mode
-
- Use one of :ref:`these constants<armatureconstraint-constants-ik-mode>`.
-
- Additional mode for IK constraint. Currently only used for Distance constraint:
-
- :type: integer
-
-.. class:: BL_ArmatureChannel(PyObjectPlus)
-
- Proxy to armature pose channel. Allows to read and set armature pose.
- The attributes are identical to RNA attributes, but mostly in read-only mode.
-
- See :data:`rotation_mode`
-
- .. data:: PCHAN_ROT_QUAT
- .. data:: PCHAN_ROT_XYZ
- .. data:: PCHAN_ROT_XZY
- .. data:: PCHAN_ROT_YXZ
- .. data:: PCHAN_ROT_YZX
- .. data:: PCHAN_ROT_ZXY
- .. data:: PCHAN_ROT_ZYX
-
- .. attribute:: name
-
- channel name (=bone name), read-only.
-
- :type: string
-
- .. attribute:: bone
-
- return the bone object corresponding to this pose channel, read-only.
-
- :type: :class:`BL_ArmatureBone`
-
- .. attribute:: parent
-
- return the parent channel object, None if root channel, read-only.
-
- :type: :class:`BL_ArmatureChannel`
-
- .. attribute:: has_ik
-
- true if the bone is part of an active IK chain, read-only.
- This flag is not set when an IK constraint is defined but not enabled (miss target information for example).
-
- :type: boolean
-
- .. attribute:: ik_dof_x
-
- true if the bone is free to rotation in the X axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_dof_y
-
- true if the bone is free to rotation in the Y axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_dof_z
-
- true if the bone is free to rotation in the Z axis, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_x
-
- true if a limit is imposed on X rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_y
-
- true if a limit is imposed on Y rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_limit_z
-
- true if a limit is imposed on Z rotation, read-only.
-
- :type: boolean
-
- .. attribute:: ik_rot_control
-
- true if channel rotation should applied as IK constraint, read-only.
-
- :type: boolean
-
- .. attribute:: ik_lin_control
-
- true if channel size should applied as IK constraint, read-only.
-
- :type: boolean
-
- .. attribute:: location
-
- displacement of the bone head in armature local space, read-write.
-
- :type: vector [X, Y, Z].
-
- .. note::
-
- You can only move a bone if it is unconnected to its parent. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`).
-
- .. attribute:: scale
-
- scale of the bone relative to its parent, read-write.
-
- :type: vector [sizeX, sizeY, sizeZ].
-
- .. note::
-
- An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_quaternion
-
- rotation of the bone relative to its parent expressed as a quaternion, read-write.
-
- :type: vector [qr, qi, qj, qk].
-
- .. note::
-
- This field is only used if rotation_mode is 0. An action playing on the armature may change the value. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_euler
-
- rotation of the bone relative to its parent expressed as a set of euler angles, read-write.
-
- :type: vector [X, Y, Z].
-
- .. note::
-
- This field is only used if rotation_mode is > 0. You must always pass the angles in [X, Y, Z] order; the order of applying the angles to the bone depends on rotation_mode. An action playing on the armature may change this field. An IK chain does not update this value, see joint_rotation.
-
- .. note::
-
- Changing this field has no immediate effect, the pose is updated when the armature is updated during the graphic render (see :data:`BL_ArmatureObject.update`)
-
- .. attribute:: rotation_mode
-
- Method of updating the bone rotation, read-write.
-
- :type: integer
-
- Use the following constants (euler mode are named as in Blender UI but the actual axis order is reversed).
-
- * PCHAN_ROT_QUAT(0) : use quaternioin in rotation attribute to update bone rotation
- * PCHAN_ROT_XYZ(1) : use euler_rotation and apply angles on bone's Z, Y, X axis successively
- * PCHAN_ROT_XZY(2) : use euler_rotation and apply angles on bone's Y, Z, X axis successively
- * PCHAN_ROT_YXZ(3) : use euler_rotation and apply angles on bone's Z, X, Y axis successively
- * PCHAN_ROT_YZX(4) : use euler_rotation and apply angles on bone's X, Z, Y axis successively
- * PCHAN_ROT_ZXY(5) : use euler_rotation and apply angles on bone's Y, X, Z axis successively
- * PCHAN_ROT_ZYX(6) : use euler_rotation and apply angles on bone's X, Y, Z axis successively
-
- .. attribute:: channel_matrix
-
- pose matrix in bone space (deformation of the bone due to action, constraint, etc), Read-only.
- This field is updated after the graphic render, it represents the current pose.
-
- :type: matrix [4][4]
-
- .. attribute:: pose_matrix
-
- pose matrix in armature space, read-only,
- This field is updated after the graphic render, it represents the current pose.
-
- :type: matrix [4][4]
-
- .. attribute:: pose_head
-
- position of bone head in armature space, read-only.
-
- :type: vector [x, y, z]
-
- .. attribute:: pose_tail
-
- position of bone tail in armature space, read-only.
-
- :type: vector [x, y, z]
-
- .. attribute:: ik_min_x
-
- minimum value of X rotation in degree (<= 0) when X rotation is limited (see ik_limit_x), read-only.
-
- :type: float
-
- .. attribute:: ik_max_x
-
- maximum value of X rotation in degree (>= 0) when X rotation is limited (see ik_limit_x), read-only.
-
- :type: float
-
- .. attribute:: ik_min_y
-
- minimum value of Y rotation in degree (<= 0) when Y rotation is limited (see ik_limit_y), read-only.
-
- :type: float
-
- .. attribute:: ik_max_y
-
- maximum value of Y rotation in degree (>= 0) when Y rotation is limited (see ik_limit_y), read-only.
-
- :type: float
-
- .. attribute:: ik_min_z
-
- minimum value of Z rotation in degree (<= 0) when Z rotation is limited (see ik_limit_z), read-only.
-
- :type: float
-
- .. attribute:: ik_max_z
-
- maximum value of Z rotation in degree (>= 0) when Z rotation is limited (see ik_limit_z), read-only.
-
- :type: float
-
- .. attribute:: ik_stiffness_x
-
- bone rotation stiffness in X axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stiffness_y
-
- bone rotation stiffness in Y axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stiffness_z
-
- bone rotation stiffness in Z axis, read-only.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_stretch
-
- ratio of scale change that is allowed, 0=bone can't change size, read-only.
-
- :type: float
-
- .. attribute:: ik_rot_weight
-
- weight of rotation constraint when ik_rot_control is set, read-write.
-
- :type: float between 0 and 1
-
- .. attribute:: ik_lin_weight
-
- weight of size constraint when ik_lin_control is set, read-write.
-
- :type: float between 0 and 1
-
- .. attribute:: joint_rotation
-
- Control bone rotation in term of joint angle (for robotic applications), read-write.
-
- When writing to this attribute, you pass a [x, y, z] vector and an appropriate set of euler angles or quaternion is calculated according to the rotation_mode.
-
- When you read this attribute, the current pose matrix is converted into a [x, y, z] vector representing the joint angles.
-
- The value and the meaning of the x, y, z depends on the ik_dof_x/ik_dof_y/ik_dof_z attributes:
-
- * 1DoF joint X, Y or Z: the corresponding x, y, or z value is used an a joint angle in radiant
- * 2DoF joint X+Y or Z+Y: treated as 2 successive 1DoF joints: first X or Z, then Y. The x or z value is used as a joint angle in radiant along the X or Z axis, followed by a rotation along the new Y axis of y radiants.
- * 2DoF joint X+Z: treated as a 2DoF joint with rotation axis on the X/Z plane. The x and z values are used as the coordinates of the rotation vector in the X/Z plane.
- * 3DoF joint X+Y+Z: treated as a revolute joint. The [x, y, z] vector represents the equivalent rotation vector to bring the joint from the rest pose to the new pose.
-
- :type: vector [x, y, z]
-
- .. note::
-
- The bone must be part of an IK chain if you want to set the ik_dof_x/ik_dof_y/ik_dof_z attributes via the UI, but this will interfere with this attribute since the IK solver will overwrite the pose. You can stay in control of the armature if you create an IK constraint but do not finalize it (e.g. don't set a target) the IK solver will not run but the IK panel will show up on the UI for each bone in the chain.
-
- .. note::
-
- [0, 0, 0] always corresponds to the rest pose.
-
- .. note::
-
- You must request the armature pose to update and wait for the next graphic frame to see the effect of setting this attribute (see :data:`BL_ArmatureObject.update`).
-
- .. note::
-
- You can read the result of the calculation in rotation or euler_rotation attributes after setting this attribute.
-
-.. class:: BL_ArmatureBone(PyObjectPlus)
-
- Proxy to Blender bone structure. All fields are read-only and comply to RNA names.
- All space attribute correspond to the rest pose.
-
- .. attribute:: name
-
- bone name.
-
- :type: string
-
- .. attribute:: connected
-
- true when the bone head is struck to the parent's tail.
-
- :type: boolean
-
- .. attribute:: hinge
-
- true when bone doesn't inherit rotation or scale from parent bone.
-
- :type: boolean
-
- .. attribute:: inherit_scale
-
- true when bone inherits scaling from parent bone.
-
- :type: boolean
-
- .. attribute:: bbone_segments
-
- number of B-bone segments.
-
- :type: integer
-
- .. attribute:: roll
-
- bone rotation around head-tail axis.
-
- :type: float
-
- .. attribute:: head
-
- location of head end of the bone in parent bone space.
-
- :type: vector [x, y, z]
-
- .. attribute:: tail
-
- location of head end of the bone in parent bone space.
-
- :type: vector [x, y, z]
-
- .. attribute:: length
-
- bone length.
-
- :type: float
-
- .. attribute:: arm_head
-
- location of head end of the bone in armature space.
-
- :type: vector [x, y, z]
-
- .. attribute:: arm_tail
-
- location of tail end of the bone in armature space.
-
- :type: vector [x, y, z]
-
- .. attribute:: arm_mat
-
- matrix of the bone head in armature space.
-
- :type: matrix [4][4]
-
- .. note::
-
- This matrix has no scale part.
-
- .. attribute:: bone_mat
-
- rotation matrix of the bone in parent bone space.
-
- :type: matrix [3][3]
-
- .. attribute:: parent
-
- parent bone, or None for root bone.
-
- :type: :class:`BL_ArmatureBone`
-
- .. attribute:: children
-
- list of bone's children.
-
- :type: list of :class:`BL_ArmatureBone`
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index d718bf3e507..d899fc38162 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/kernel/gen_system
../../../source/blender/makesdna
@@ -37,9 +35,50 @@ SET(INC
../../../extern/glew/include
../../../intern/guardedalloc
../Expressions
- ${PYTHON_INC}
+ ${PYTHON_INCLUDE_DIRS}
+)
+
+set(SRC
+ RAS_2DFilterManager.cpp
+ RAS_BucketManager.cpp
+ RAS_FramingManager.cpp
+ RAS_IPolygonMaterial.cpp
+ RAS_IRenderTools.cpp
+ RAS_MaterialBucket.cpp
+ RAS_MeshObject.cpp
+ RAS_Polygon.cpp
+ RAS_TexVert.cpp
+ RAS_texmatrix.cpp
+
+ RAS_2DFilterManager.h
+ RAS_BucketManager.h
+ RAS_CameraData.h
+ RAS_Deformer.h
+ RAS_FramingManager.h
+ RAS_ICanvas.h
+ RAS_IPolygonMaterial.h
+ RAS_IRasterizer.h
+ RAS_IRenderTools.h
+ RAS_LightObject.h
+ RAS_MaterialBucket.h
+ RAS_MeshObject.h
+ RAS_ObjectColor.h
+ RAS_Polygon.h
+ RAS_Rect.h
+ RAS_TexMatrix.h
+ RAS_TexVert.h
+ RAS_OpenGLFilters/RAS_Blur2DFilter.h
+ RAS_OpenGLFilters/RAS_Dilation2DFilter.h
+ RAS_OpenGLFilters/RAS_Erosion2DFilter.h
+ RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
+ RAS_OpenGLFilters/RAS_Invert2DFilter.h
+ RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
+ RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
+ RAS_OpenGLFilters/RAS_Sepia2DFilter.h
+ RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
+ RAS_OpenGLFilters/RAS_Sobel2DFilter.h
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_rasterizer "${SRC}" "${INC}")
+blender_add_lib(ge_rasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/Makefile b/source/gameengine/Rasterizer/Makefile
deleted file mode 100644
index d800a02b181..00000000000
--- a/source/gameengine/Rasterizer/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = rasterizer
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines
-CPPFLAGS += -I../Expressions
-CPPFLAGS += -I../Ketsji
-
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-
-###############
-
-SOURCEDIR = source/gameengine/Rasterizer
-DIRS = RAS_OpenGLRasterizer
-
-include nan_subdirs.mk
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
index 4527850a8e9..ed18ff0329e 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -27,6 +27,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Rasterizer/RAS_2DFilterManager.cpp
+ * \ingroup bgerast
+ */
+
#define STRINGIFY(A) #A
@@ -431,6 +436,8 @@ void RAS_2DFilterManager::RenderFilters(RAS_ICanvas* canvas)
glViewport(0,0, texturewidth, textureheight);
glDisable(GL_DEPTH_TEST);
+ // if the last rendered face had alpha add it would messes with the color of the plane we apply 2DFilter to
+ glDisable(GL_BLEND);
glPushMatrix(); //GL_MODELVIEW
glLoadIdentity(); // GL_MODELVIEW
glMatrixMode(GL_TEXTURE);
@@ -510,11 +517,11 @@ void RAS_2DFilterManager::EnableFilter(vector<STR_String>& propNames, void* game
return;
}
- if(mode>=RAS_2DFILTER_MOTIONBLUR && mode<=RAS_2DFILTER_INVERT)
- {
- if(m_filters[pass])
- glDeleteObjectARB(m_filters[pass]);
- m_filters[pass] = CreateShaderProgram(mode);
- m_enabled[pass] = 1;
- }
+ // We've checked all other cases, which means we must be dealing with a builtin filter
+ if(m_filters[pass])
+ glDeleteObjectARB(m_filters[pass]);
+ m_filters[pass] = CreateShaderProgram(mode);
+ m_gameObjects[pass] = NULL;
+ AnalyseShader(pass, propNames);
+ m_enabled[pass] = 1;
}
diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.h b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
index 9671f914fcd..a18df8b4d64 100644
--- a/source/gameengine/Rasterizer/RAS_2DFilterManager.h
+++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_2DFilterManager.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_I2DFILTER
#define __RAS_I2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.cpp b/source/gameengine/Rasterizer/RAS_BucketManager.cpp
index 32fb1e31780..8c9f5e9786b 100644
--- a/source/gameengine/Rasterizer/RAS_BucketManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_BucketManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Rasterizer/RAS_BucketManager.cpp
+ * \ingroup bgerast
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// don't show these anoying STL warnings
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Rasterizer/RAS_BucketManager.h b/source/gameengine/Rasterizer/RAS_BucketManager.h
index 487df50802c..297782bd4fe 100644
--- a/source/gameengine/Rasterizer/RAS_BucketManager.h
+++ b/source/gameengine/Rasterizer/RAS_BucketManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,7 +26,10 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-// this will be put in a class later on
+
+/** \file RAS_BucketManager.h
+ * \ingroup bgerast
+ */
#ifndef __RAS_BUCKETMANAGER
#define __RAS_BUCKETMANAGER
diff --git a/source/gameengine/Rasterizer/RAS_CameraData.h b/source/gameengine/Rasterizer/RAS_CameraData.h
index 01f8d491a35..e6254f72511 100644
--- a/source/gameengine/Rasterizer/RAS_CameraData.h
+++ b/source/gameengine/Rasterizer/RAS_CameraData.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_CameraData.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_CAMERADATA_H
#define __RAS_CAMERADATA_H
diff --git a/source/gameengine/Rasterizer/RAS_Deformer.h b/source/gameengine/Rasterizer/RAS_Deformer.h
index 17c2cb4695e..8678830f6a2 100644
--- a/source/gameengine/Rasterizer/RAS_Deformer.h
+++ b/source/gameengine/Rasterizer/RAS_Deformer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,10 +27,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Deformer.h
+ * \ingroup bgerast
+ */
+
#ifndef RAS_DEFORMER
#define RAS_DEFORMER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
#endif //WIN32
@@ -76,6 +80,10 @@ public:
{
return NULL;
}
+ virtual struct DerivedMesh* GetPhysicsMesh()
+ {
+ return NULL;
+ }
virtual class RAS_MeshObject* GetRasMesh()
{
/* m_pMesh does not seem to be being used?? */
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.cpp b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
index 61734e89236..edacd1dd0f1 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_FramingManager.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_FramingManager.h"
#include "RAS_Rect.h"
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h
index aedac230cbe..c37d92dac17 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.h
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_FramingManager.h
+ * \ingroup bgerast
+ */
+
#ifndef RAS_FRAMINGMANAGER_H
#define RAS_FRAMINGMANAGER_H
diff --git a/source/gameengine/Rasterizer/RAS_ICanvas.h b/source/gameengine/Rasterizer/RAS_ICanvas.h
index 826fe732b94..41374a476c6 100644
--- a/source/gameengine/Rasterizer/RAS_ICanvas.h
+++ b/source/gameengine/Rasterizer/RAS_ICanvas.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,20 +26,23 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __RAS_ICANVAS
-#define __RAS_ICANVAS
-/**
- * 2D rendering device context. The connection from 3d rendercontext to 2d surface.
+/** \file RAS_ICanvas.h
+ * \ingroup bgerast
*/
+#ifndef __RAS_ICANVAS
+#define __RAS_ICANVAS
+
#ifdef WITH_CXX_GUARDEDALLOC
#include "MEM_guardedalloc.h"
#endif
class RAS_Rect;
-
+/**
+ * 2D rendering device context. The connection from 3d rendercontext to 2d surface.
+ */
class RAS_ICanvas
{
public:
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
index 0c81d7d8274..e8c0a73813e 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_IPolygonMaterial.h"
#include "RAS_IRasterizer.h"
@@ -208,6 +213,11 @@ Material *RAS_IPolyMaterial::GetBlenderMaterial() const
return NULL;
}
+Image *RAS_IPolyMaterial::GetBlenderImage() const
+{
+ return NULL;
+}
+
Scene* RAS_IPolyMaterial::GetBlenderScene() const
{
return NULL;
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
index e7bd78c2309..b0e7daf81d7 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,15 +26,16 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_IPolygonMaterial.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_IPOLYGONMATERIAL
#define __RAS_IPOLYGONMATERIAL
#include "STR_HashedString.h"
-/**
- * Polygon Material on which the material buckets are sorted
- *
- */
#include "MT_Vector3.h"
#include "STR_HashedString.h"
@@ -45,6 +46,7 @@
class RAS_IRasterizer;
struct MTFace;
struct Material;
+struct Image;
struct Scene;
class SCA_IScene;
@@ -64,7 +66,8 @@ enum MaterialProps
};
/**
- * Material properties.
+ * Polygon Material on which the material buckets are sorted
+ *
*/
class RAS_IPolyMaterial
{
@@ -160,6 +163,7 @@ public:
int GetMaterialIndex() const;
virtual Material* GetBlenderMaterial() const;
+ virtual Image* GetBlenderImage() const;
virtual Scene* GetBlenderScene() const;
virtual void ReleaseMaterial();
virtual void GetMaterialRGBAColor(unsigned char *rgba) const;
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index 630a43daddc..f76799953a1 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_IRasterizer.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_IRASTERIZER
#define __RAS_IRASTERIZER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.cpp b/source/gameengine/Rasterizer/RAS_IRenderTools.cpp
index f33f5ae058d..6e3ea16f25c 100644
--- a/source/gameengine/Rasterizer/RAS_IRenderTools.cpp
+++ b/source/gameengine/Rasterizer/RAS_IRenderTools.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_IRenderTools.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_IRenderTools.h"
void RAS_IRenderTools::SetClientObject(RAS_IRasterizer* rasty, void *obj)
diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h
index 50de4980e1d..ce20bbd98cd 100644
--- a/source/gameengine/Rasterizer/RAS_IRenderTools.h
+++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_IRenderTools.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_IRENDERTOOLS
#define __RAS_IRENDERTOOLS
@@ -99,6 +104,28 @@ public:
)=0;
/**
+ * Renders 3D text string using BFL.
+ * @param fontid The id of the font.
+ * @param text The string to render.
+ * @param size The size of the text.
+ * @param dpi The resolution of the text.
+ * @param color The color of the object.
+ * @param mat The Matrix of the text object.
+ * @param aspect A scaling factor to compensate for the size.
+ */
+ virtual
+ void
+ RenderText3D(int fontid,
+ const char* text,
+ int size,
+ int dpi,
+ float* color,
+ double* mat,
+ float aspect
+ ) = 0;
+
+
+ /**
* Renders 2D text string.
* @param mode The type of text
* @param text The string to render.
diff --git a/source/gameengine/Rasterizer/RAS_LightObject.h b/source/gameengine/Rasterizer/RAS_LightObject.h
index 54bc5730564..ef6cfa06635 100644
--- a/source/gameengine/Rasterizer/RAS_LightObject.h
+++ b/source/gameengine/Rasterizer/RAS_LightObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_LightObject.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_LIGHTOBJECT_H
#define __RAS_LIGHTOBJECT_H
diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
index 14acd0259da..7647f7d3f27 100644
--- a/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
+++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,10 +26,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_MaterialBucket.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_MaterialBucket.h"
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
+#endif
+
+#ifdef WIN32
#include <windows.h>
#endif // WIN32
diff --git a/source/gameengine/Rasterizer/RAS_MaterialBucket.h b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
index c9ccac8e8a7..c46a36768ee 100644
--- a/source/gameengine/Rasterizer/RAS_MaterialBucket.h
+++ b/source/gameengine/Rasterizer/RAS_MaterialBucket.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_MaterialBucket.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_MATERIALBUCKET
#define __RAS_MATERIALBUCKET
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.cpp b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
index bd85e6e4504..6ddd31765d5 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.cpp
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Rasterizer/RAS_MeshObject.cpp
+ * \ingroup bgerast
+ */
+
#include "MEM_guardedalloc.h"
#include "DNA_object_types.h"
diff --git a/source/gameengine/Rasterizer/RAS_MeshObject.h b/source/gameengine/Rasterizer/RAS_MeshObject.h
index 5a834bf26b0..0b35b212e1d 100644
--- a/source/gameengine/Rasterizer/RAS_MeshObject.h
+++ b/source/gameengine/Rasterizer/RAS_MeshObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_MeshObject.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_MESHOBJECT
#define __RAS_MESHOBJECT
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
// disable the STL warnings ("debug information length > 255")
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Rasterizer/RAS_ObjectColor.h b/source/gameengine/Rasterizer/RAS_ObjectColor.h
index e4bca39ff3a..9a334385b17 100644
--- a/source/gameengine/Rasterizer/RAS_ObjectColor.h
+++ b/source/gameengine/Rasterizer/RAS_ObjectColor.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_ObjectColor.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_OBJECTCOLOR_H
#define __RAS_OBJECTCOLOR_H
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
index ff92a912ec1..a277d9835d8 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Blur2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Blur2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_BLUR2DFILTER
#define __RAS_BLUR2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
index 87335761729..6aeff254f77 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Dilation2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Dilation2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_DILATION2DFILTER
#define __RAS_DILATION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
index 476f5820158..1e9dccaec87 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Erosion2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Erosion2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_EROSION2DFILTER
#define __RAS_EROSION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
index 914151944a5..422d6dfa1b3 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_GrayScale2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_GrayScale2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_GRAYSCALE2DFILTER
#define __RAS_GRAYSCALE2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
index afab58d4048..475f3506c2c 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Invert2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Invert2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_INVERT2DFILTER
#define __RAS_INVERT2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
index 51a835706bf..c7cfa83a11f 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Laplacian2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Laplacian2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_LAPLACION2DFILTER
#define __RAS_LAPLACION2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
index 62842d5f0a8..ada53cd751d 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Prewitt2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Prewitt2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_PREWITT2DFILTER
#define __RAS_PREWITT2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
index 296b54242bf..5c1c18c30c1 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sepia2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Sepia2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_SEPIA2DFILTER
#define __RAS_SEPIA2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
index 6b9cc74f424..0d68bc09c70 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sharpen2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Sharpen2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_SHARPEN2DFILTER
#define __RAS_SHARPEN2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
index f8efe469bfc..0f80f0f22b4 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLFilters/RAS_Sobel2DFilter.h
@@ -1,4 +1,4 @@
-/**
+/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Sobel2DFilter.h
+ * \ingroup bgerastoglfilters
+ */
+
#ifndef __RAS_SOBEL2DFILTER
#define __RAS_SOBEL2DFILTER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index cc48952dc20..d47f19eda90 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
../../../../source/kernel/gen_system
../../../../intern/string
../../../../intern/moto/include
@@ -41,6 +39,18 @@ SET(INC
../../../../source/blender/blenloader
)
-ADD_DEFINITIONS(-DGLEW_STATIC)
+set(SRC
+ RAS_GLExtensionManager.cpp
+ RAS_ListRasterizer.cpp
+ RAS_OpenGLRasterizer.cpp
+ RAS_VAOpenGLRasterizer.cpp
+
+ RAS_GLExtensionManager.h
+ RAS_ListRasterizer.h
+ RAS_OpenGLRasterizer.h
+ RAS_VAOpenGLRasterizer.h
+)
+
+add_definitions(-DGLEW_STATIC)
-BLENDERLIB(bf_oglrasterizer "${SRC}" "${INC}")
+blender_add_lib(ge_oglrasterizer "${SRC}" "${INC}")
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
deleted file mode 100644
index 357bdf9d99b..00000000000
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounce make to subdirectories.
-#
-
-LIBNAME = OpenGLrasterizer
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../../../kernel/gen_system
-CPPFLAGS += -I../../../blender/gpu
-CPPFLAGS += -I../../../blender/makesdna
-CPPFLAGS += -I../../../blender/blenlib
-CPPFLAGS += -I../../../blender/blenkernel
-CPPFLAGS += -I../../BlenderRoutines
-CPPFLAGS += -I../../Ketsji
-CPPFLAGS += -I../../SceneGraph
-CPPFLAGS += -I..
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
index e29cd185be3..5e032303bdc 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
+ * \ingroup bgerastogl
+ */
+
+
#include <iostream>
#include "RAS_GLExtensionManager.h"
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h
index 2f5d90d4bb5..5c3573bccec 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,12 +26,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_GLExtensionManager.h
+ * \ingroup bgerastogl
+ */
+
#ifndef __RAS_GLEXTENSIONMANAGER_H__
#define __RAS_GLEXTENSIONMANAGER_H__
#include "GL/glew.h"
-/* Note: this used to have a lot more code, but now extension handling
+/** Note: this used to have a lot more code, but now extension handling
* is done by GLEW, so it does mostly debug stuff */
namespace bgl
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
index 12a255b4e4e..e5ca40c1354 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+ * \ingroup bgerastogl
+ */
//
#include <iostream>
@@ -13,7 +16,7 @@
#include "RAS_TexVert.h"
#include "MT_assert.h"
-//#ifndef NDEBUG
+//#if defined(DEBUG)
//#ifdef WIN32
//#define spit(x) std::cout << x << std::endl;
//#endif //WIN32
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
index 28c56b92c3c..0b36bbf3876 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
@@ -1,3 +1,8 @@
+
+/** \file RAS_ListRasterizer.h
+ * \ingroup bgerastogl
+ */
+
#ifndef __RAS_LISTRASTERIZER_H__
#define __RAS_LISTRASTERIZER_H__
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 71f53bc5301..09aa1c02c76 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+ * \ingroup bgerastogl
+ */
+
#include <math.h>
#include <stdlib.h>
@@ -731,6 +736,7 @@ static RAS_MeshSlot *current_ms;
static RAS_MeshObject *current_mesh;
static int current_blmat_nr;
static GPUVertexAttribs current_gpu_attribs;
+static Image *current_image;
static int CheckMaterialDM(int matnr, void *attribs)
{
// only draw the current material
@@ -741,6 +747,8 @@ static int CheckMaterialDM(int matnr, void *attribs)
memcpy(gattribs, &current_gpu_attribs, sizeof(GPUVertexAttribs));
return 1;
}
+
+/*
static int CheckTexfaceDM(void *mcol, int index)
{
@@ -768,6 +776,34 @@ static int CheckTexfaceDM(void *mcol, int index)
}
return 0;
}
+*/
+
+static int CheckTexDM(MTFace *tface, MCol *mcol, int matnr)
+{
+
+ // index is the original face index, retrieve the polygon
+ if (matnr == current_blmat_nr &&
+ (tface == NULL || tface->tpage == current_image)) {
+ // must handle color.
+ if (current_wireframe)
+ return 2;
+ if (current_ms->m_bObjectColor) {
+ MT_Vector4& rgba = current_ms->m_RGBAcolor;
+ glColor4d(rgba[0], rgba[1], rgba[2], rgba[3]);
+ // don't use mcol
+ return 2;
+ }
+ if (!mcol) {
+ // we have to set the color from the material
+ unsigned char rgba[4];
+ current_polymat->GetMaterialRGBAColor(rgba);
+ glColor4ubv((const GLubyte *)rgba);
+ return 2;
+ }
+ return 1;
+ }
+ return 0;
+}
void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
{
@@ -783,7 +819,18 @@ void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
current_ms = &ms;
current_mesh = ms.m_mesh;
current_wireframe = wireframe;
+<<<<<<< .working
MCol *mcol = (MCol*)ms.m_pDerivedMesh->getTessFaceDataArray(ms.m_pDerivedMesh, CD_MCOL);
+=======
+ // MCol *mcol = (MCol*)ms.m_pDerivedMesh->getFaceDataArray(ms.m_pDerivedMesh, CD_MCOL); /* UNUSED */
+
+ // handle two-side
+ if (current_polymat->GetDrawingMode() & RAS_IRasterizer::KX_TWOSIDE)
+ this->SetCullFace(false);
+ else
+ this->SetCullFace(true);
+
+>>>>>>> .merge-right.r35190
if (current_polymat->GetFlag() & RAS_BLENDERGLSL) {
// GetMaterialIndex return the original mface material index,
// increment by 1 to match what derived mesh is doing
@@ -800,7 +847,10 @@ void RAS_OpenGLRasterizer::IndexPrimitivesInternal(RAS_MeshSlot& ms, bool multi)
ms.m_pDerivedMesh->drawFacesGLSL(ms.m_pDerivedMesh, CheckMaterialDM);
GPU_set_material_blend_mode(current_blend_mode);
} else {
- ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol);
+ //ms.m_pDerivedMesh->drawMappedFacesTex(ms.m_pDerivedMesh, CheckTexfaceDM, mcol);
+ current_blmat_nr = current_polymat->GetMaterialIndex();
+ current_image = current_polymat->GetBlenderImage();
+ ms.m_pDerivedMesh->drawFacesTex(ms.m_pDerivedMesh, CheckTexDM);
}
return;
}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index 7b516cb53a0..54fab906049 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,10 +26,15 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_OpenGLRasterizer.h
+ * \ingroup bgerastogl
+ */
+
#ifndef __RAS_OPENGLRASTERIZER
#define __RAS_OPENGLRASTERIZER
-#ifdef WIN32
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
index 622ba852934..3ffbf9bc9d1 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
+ * \ingroup bgerastogl
+ */
+
#include "RAS_VAOpenGLRasterizer.h"
#include <stdlib.h>
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
index 96f6344b403..388d6c4da29 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_VAOpenGLRasterizer.h
+ * \ingroup bgerastogl
+ */
+
#ifndef __KX_VERTEXARRAYOPENGLRASTERIZER
#define __KX_VERTEXARRAYOPENGLRASTERIZER
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
index 68e6789c05e..890d1efb850 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
@@ -10,4 +10,11 @@ incs += ' #source/blender/gpu #extern/glew/include ' + env['BF_OPENGL_INC']
incs += ' #source/blender/gameengine/Ketsji #source/gameengine/SceneGraph #source/blender/makesdna #source/blender/blenkernel'
incs += ' #intern/guardedalloc #source/blender/blenlib'
-env.BlenderLib ( 'bf_oglrasterizer', Split(sources), Split(incs), defines = defs, libtype=['core','player'], priority=[350,75], cxx_compileflags=env['BGE_CXXFLAGS'])
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+
+if env['WITH_BF_PYTHON']:
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+
+env.BlenderLib ( 'ge_oglrasterizer', Split(sources), Split(incs), defines = defs, libtype=['core','player'], priority=[350,75], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/Rasterizer/RAS_Polygon.cpp b/source/gameengine/Rasterizer/RAS_Polygon.cpp
index b038d3bf31a..cc5b4c3b0dc 100644
--- a/source/gameengine/Rasterizer/RAS_Polygon.cpp
+++ b/source/gameengine/Rasterizer/RAS_Polygon.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,7 +26,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#ifdef WIN32
+/** \file gameengine/Rasterizer/RAS_Polygon.cpp
+ * \ingroup bgerast
+ */
+
+
+#if defined(WIN32) && !defined(FREE_WINDOWS)
#pragma warning (disable:4786)
#endif
diff --git a/source/gameengine/Rasterizer/RAS_Polygon.h b/source/gameengine/Rasterizer/RAS_Polygon.h
index 8dc9813f5b9..49e99f6bd2f 100644
--- a/source/gameengine/Rasterizer/RAS_Polygon.h
+++ b/source/gameengine/Rasterizer/RAS_Polygon.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_Polygon.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_POLYGON
#define __RAS_POLYGON
diff --git a/source/gameengine/Rasterizer/RAS_Rect.h b/source/gameengine/Rasterizer/RAS_Rect.h
index 7a1d21b8905..bc4f069b883 100644
--- a/source/gameengine/Rasterizer/RAS_Rect.h
+++ b/source/gameengine/Rasterizer/RAS_Rect.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file RAS_Rect.h
+ * \ingroup bgerast
+ */
+
#ifndef _RAS_RECT
#define _RAS_RECT
@@ -35,11 +39,10 @@
#endif
/**
- * @section interface class.
+ * \section interface class.
* RAS_Rect just encodes a simple rectangle.
- * Should be part of a generic library
+ * \note Should be part of a generic library
*/
-
class RAS_Rect
{
public: // todo: make a decent class, and make private
diff --git a/source/gameengine/Rasterizer/RAS_TexMatrix.h b/source/gameengine/Rasterizer/RAS_TexMatrix.h
index ef500a8084b..068e810e387 100644
--- a/source/gameengine/Rasterizer/RAS_TexMatrix.h
+++ b/source/gameengine/Rasterizer/RAS_TexMatrix.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_TexMatrix.h
+ * \ingroup bgerast
+ */
+
#ifndef __RASTEXMATRIX
#define __RASTEXMATRIX
diff --git a/source/gameengine/Rasterizer/RAS_TexVert.cpp b/source/gameengine/Rasterizer/RAS_TexVert.cpp
index 2d2fd6deddd..fd984da8176 100644
--- a/source/gameengine/Rasterizer/RAS_TexVert.cpp
+++ b/source/gameengine/Rasterizer/RAS_TexVert.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_TexVert.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_TexVert.h"
#include "MT_Matrix4x4.h"
diff --git a/source/gameengine/Rasterizer/RAS_TexVert.h b/source/gameengine/Rasterizer/RAS_TexVert.h
index bdf2a6487ad..bbccd3cca9d 100644
--- a/source/gameengine/Rasterizer/RAS_TexVert.h
+++ b/source/gameengine/Rasterizer/RAS_TexVert.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file RAS_TexVert.h
+ * \ingroup bgerast
+ */
+
#ifndef __RAS_TEXVERT
#define __RAS_TEXVERT
diff --git a/source/gameengine/Rasterizer/RAS_texmatrix.cpp b/source/gameengine/Rasterizer/RAS_texmatrix.cpp
index e69601fe091..89536eb0562 100644
--- a/source/gameengine/Rasterizer/RAS_texmatrix.cpp
+++ b/source/gameengine/Rasterizer/RAS_texmatrix.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/Rasterizer/RAS_texmatrix.cpp
+ * \ingroup bgerast
+ */
+
+
#include "RAS_TexMatrix.h"
void RAS_CalcTexMatrix(RAS_TexVert p[3],MT_Point3& origin,MT_Vector3& udir,MT_Vector3& vdir)
diff --git a/source/gameengine/Rasterizer/SConscript b/source/gameengine/Rasterizer/SConscript
index a78a0289d98..d6de7591d45 100644
--- a/source/gameengine/Rasterizer/SConscript
+++ b/source/gameengine/Rasterizer/SConscript
@@ -9,8 +9,16 @@ incs = '. #intern/guardedalloc #source/kernel/gen_system #intern/string #intern/
defs = [ 'GLEW_STATIC' ]
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
-env.BlenderLib ( 'bf_rasterizer', sources, Split(incs), defs, libtype=['core','player'], priority=[350,70], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_rasterizer', sources, Split(incs), defs, libtype=['core','player'], priority=[350,70], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/SConscript b/source/gameengine/SConscript
index e7c9328688f..aebbf4d9fcf 100644
--- a/source/gameengine/SConscript
+++ b/source/gameengine/SConscript
@@ -14,7 +14,6 @@ SConscript(['BlenderRoutines/SConscript',
'Rasterizer/SConscript',
'Rasterizer/RAS_OpenGLRasterizer/SConscript',
'SceneGraph/SConscript',
- 'Physics/Bullet/SConscript'
])
if env['WITH_BF_PYTHON']:
@@ -22,3 +21,6 @@ if env['WITH_BF_PYTHON']:
if env['WITH_BF_PLAYER']:
SConscript(['GamePlayer/SConscript'])
+
+if env['WITH_BF_BULLET']:
+ SConscript(['Physics/Bullet/SConscript'])
diff --git a/source/gameengine/SceneGraph/CMakeLists.txt b/source/gameengine/SceneGraph/CMakeLists.txt
index a73130531c0..a054252ea0b 100644
--- a/source/gameengine/SceneGraph/CMakeLists.txt
+++ b/source/gameengine/SceneGraph/CMakeLists.txt
@@ -24,11 +24,28 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../intern/moto/include
)
-BLENDERLIB(bf_scenegraph "${SRC}" "${INC}")
+set(SRC
+ SG_BBox.cpp
+ SG_Controller.cpp
+ SG_IObject.cpp
+ SG_Node.cpp
+ SG_Spatial.cpp
+ SG_Tree.cpp
+
+ SG_BBox.h
+ SG_Controller.h
+ SG_DList.h
+ SG_IObject.h
+ SG_Node.h
+ SG_ParentRelation.h
+ SG_QList.h
+ SG_Spatial.h
+ SG_Tree.h
+)
+
+blender_add_lib(ge_scenegraph "${SRC}" "${INC}")
diff --git a/source/gameengine/SceneGraph/Makefile b/source/gameengine/SceneGraph/Makefile
deleted file mode 100644
index 8a797ae5a0e..00000000000
--- a/source/gameengine/SceneGraph/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = scenegraph
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
diff --git a/source/gameengine/SceneGraph/SConscript b/source/gameengine/SceneGraph/SConscript
index 2a33cd67b5e..9270169199e 100644
--- a/source/gameengine/SceneGraph/SConscript
+++ b/source/gameengine/SceneGraph/SConscript
@@ -6,4 +6,14 @@ sources = env.Glob('*.cpp')
incs = '. #intern/moto/include'
-env.BlenderLib ( 'bf_scenegraph', sources, Split(incs), [], libtype=['core','player'], priority=[325,85], cxx_compileflags=env['BGE_CXXFLAGS'])
+defs = []
+
+if env['WITH_BF_CXX_GUARDEDALLOC']:
+ defs.append('WITH_CXX_GUARDEDALLOC')
+ incs += ' #intern/guardedalloc'
+
+if env['WITH_BF_PYTHON']:
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+
+env.BlenderLib ( 'ge_scenegraph', sources, Split(incs), defs, libtype=['core','player'], priority=[325,85], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/SceneGraph/SG_BBox.cpp b/source/gameengine/SceneGraph/SG_BBox.cpp
index f46c1088466..b5618ebbf03 100644
--- a/source/gameengine/SceneGraph/SG_BBox.cpp
+++ b/source/gameengine/SceneGraph/SG_BBox.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* Bounding Box
*/
+/** \file gameengine/SceneGraph/SG_BBox.cpp
+ * \ingroup bgesg
+ */
+
+
#include <math.h>
#include "SG_BBox.h"
diff --git a/source/gameengine/SceneGraph/SG_BBox.h b/source/gameengine/SceneGraph/SG_BBox.h
index 1a65fc7ef6f..9b18c121919 100644
--- a/source/gameengine/SceneGraph/SG_BBox.h
+++ b/source/gameengine/SceneGraph/SG_BBox.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,11 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Bounding Box
+ */
+
+/** \file SG_BBox.h
+ * \ingroup bgesg
+ * \brief Bounding Box
*/
#ifndef __SG_BBOX_H__
diff --git a/source/gameengine/SceneGraph/SG_Controller.cpp b/source/gameengine/SceneGraph/SG_Controller.cpp
index d2464b22608..b5e3c13ee79 100644
--- a/source/gameengine/SceneGraph/SG_Controller.cpp
+++ b/source/gameengine/SceneGraph/SG_Controller.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* @file SG_Controller.cpp
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/SceneGraph/SG_Controller.cpp
+ * \ingroup bgesg
+ */
+
+
#include "SG_Controller.h"
void
diff --git a/source/gameengine/SceneGraph/SG_Controller.h b/source/gameengine/SceneGraph/SG_Controller.h
index b4636d5fa62..fbc27bb93f3 100644
--- a/source/gameengine/SceneGraph/SG_Controller.h
+++ b/source/gameengine/SceneGraph/SG_Controller.h
@@ -1,4 +1,4 @@
-/**
+/*
* Implementationclass to derive controllers from
*
* $Id$
@@ -29,6 +29,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SG_Controller.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_CONTROLLER_H
#define __SG_CONTROLLER_H
diff --git a/source/gameengine/SceneGraph/SG_DList.h b/source/gameengine/SceneGraph/SG_DList.h
index 0768eaa5021..b82e51e0d2f 100644
--- a/source/gameengine/SceneGraph/SG_DList.h
+++ b/source/gameengine/SceneGraph/SG_DList.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SG_DList.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_DLIST
#define __SG_DLIST
diff --git a/source/gameengine/SceneGraph/SG_IObject.cpp b/source/gameengine/SceneGraph/SG_IObject.cpp
index 38baf6994e2..3064e6662b9 100644
--- a/source/gameengine/SceneGraph/SG_IObject.cpp
+++ b/source/gameengine/SceneGraph/SG_IObject.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/SceneGraph/SG_IObject.cpp
+ * \ingroup bgesg
+ */
+
+
#include "SG_IObject.h"
#include "SG_Controller.h"
diff --git a/source/gameengine/SceneGraph/SG_IObject.h b/source/gameengine/SceneGraph/SG_IObject.h
index 4c9c31e4934..26e317bdcd9 100644
--- a/source/gameengine/SceneGraph/SG_IObject.h
+++ b/source/gameengine/SceneGraph/SG_IObject.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SG_IObject.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_IOBJECT
#define __SG_IOBJECT
diff --git a/source/gameengine/SceneGraph/SG_Node.cpp b/source/gameengine/SceneGraph/SG_Node.cpp
index 1d27dfa1388..01ada4ea473 100644
--- a/source/gameengine/SceneGraph/SG_Node.cpp
+++ b/source/gameengine/SceneGraph/SG_Node.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
* ***** BEGIN GPL LICENSE BLOCK *****
*
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/SceneGraph/SG_Node.cpp
+ * \ingroup bgesg
+ */
+
+
#include "SG_Node.h"
#include "SG_ParentRelation.h"
#include <algorithm>
diff --git a/source/gameengine/SceneGraph/SG_Node.h b/source/gameengine/SceneGraph/SG_Node.h
index 30d09b5bdfd..1116cc53672 100644
--- a/source/gameengine/SceneGraph/SG_Node.h
+++ b/source/gameengine/SceneGraph/SG_Node.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SG_Node.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_NODE_H
#define __SG_NODE_H
diff --git a/source/gameengine/SceneGraph/SG_ParentRelation.h b/source/gameengine/SceneGraph/SG_ParentRelation.h
index 0bc04245c93..577e3a5c26c 100644
--- a/source/gameengine/SceneGraph/SG_ParentRelation.h
+++ b/source/gameengine/SceneGraph/SG_ParentRelation.h
@@ -1,23 +1,4 @@
-/**
- * @mainpage SG_ParentRelation
-
- * @section
- *
- * This is an abstract interface class to the Scene Graph library.
- * It allows you to specify how child nodes react to parent nodes.
- * Normally a child will use it's parent's transforms to compute
- * it's own global transforms. How this is performed depends on
- * the type of relation. For example if the parent is a vertex
- * parent to this child then the child should not inherit any
- * rotation information from the parent. Or if the parent is a
- * 'slow parent' to this child then the child should react
- * slowly to changes in the parent's position. The exact relation
- * is left for you to implement by filling out this interface
- * with concrete examples.
- *
- * There is exactly one SG_ParentRelation per SG_Node. Subclasses
- * should not be value types and should be allocated on the heap.
- *
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -47,6 +28,29 @@
*
*/
+/** \file SG_ParentRelation.h
+ * \ingroup bgesg
+ * @page SG_ParentRelationPage SG_ParentRelation
+
+ * @section SG_ParentRelationSection SG_ParentRelation
+ *
+ * This is an abstract interface class to the Scene Graph library.
+ * It allows you to specify how child nodes react to parent nodes.
+ * Normally a child will use it's parent's transforms to compute
+ * it's own global transforms. How this is performed depends on
+ * the type of relation. For example if the parent is a vertex
+ * parent to this child then the child should not inherit any
+ * rotation information from the parent. Or if the parent is a
+ * 'slow parent' to this child then the child should react
+ * slowly to changes in the parent's position. The exact relation
+ * is left for you to implement by filling out this interface
+ * with concrete examples.
+ *
+ * There is exactly one SG_ParentRelation per SG_Node. Subclasses
+ * should not be value types and should be allocated on the heap.
+ *
+ */
+
#ifndef __SG_ParentRelation_h
#define __SG_ParentRelation_h
diff --git a/source/gameengine/SceneGraph/SG_QList.h b/source/gameengine/SceneGraph/SG_QList.h
index 691ec9e1262..de79c35821e 100644
--- a/source/gameengine/SceneGraph/SG_QList.h
+++ b/source/gameengine/SceneGraph/SG_QList.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file SG_QList.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_QLIST
#define __SG_QLIST
diff --git a/source/gameengine/SceneGraph/SG_Spatial.cpp b/source/gameengine/SceneGraph/SG_Spatial.cpp
index f93dbfd4ebe..ca778d164c8 100644
--- a/source/gameengine/SceneGraph/SG_Spatial.cpp
+++ b/source/gameengine/SceneGraph/SG_Spatial.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file gameengine/SceneGraph/SG_Spatial.cpp
+ * \ingroup bgesg
+ */
+
+
#include "SG_Node.h"
#include "SG_Spatial.h"
#include "SG_Controller.h"
diff --git a/source/gameengine/SceneGraph/SG_Spatial.h b/source/gameengine/SceneGraph/SG_Spatial.h
index b8193806ecb..e15a3f3cc32 100644
--- a/source/gameengine/SceneGraph/SG_Spatial.h
+++ b/source/gameengine/SceneGraph/SG_Spatial.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,10 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file SG_Spatial.h
+ * \ingroup bgesg
+ */
+
#ifndef __SG_SPATIAL_H
#define __SG_SPATIAL_H
diff --git a/source/gameengine/SceneGraph/SG_Tree.cpp b/source/gameengine/SceneGraph/SG_Tree.cpp
index 098f1db8e66..ee013fd327d 100644
--- a/source/gameengine/SceneGraph/SG_Tree.cpp
+++ b/source/gameengine/SceneGraph/SG_Tree.cpp
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* Bounding Box
*/
+/** \file gameengine/SceneGraph/SG_Tree.cpp
+ * \ingroup bgesg
+ */
+
+
#include <math.h>
#include "SG_BBox.h"
diff --git a/source/gameengine/SceneGraph/SG_Tree.h b/source/gameengine/SceneGraph/SG_Tree.h
index fa6facde66c..4ab8586f09f 100644
--- a/source/gameengine/SceneGraph/SG_Tree.h
+++ b/source/gameengine/SceneGraph/SG_Tree.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -25,7 +25,10 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- * Bounding Box
+ */
+
+/** \file SG_Tree.h
+ * \ingroup bgesg
*/
#ifndef __SG_TREE_H__
diff --git a/source/gameengine/VideoTexture/BlendType.h b/source/gameengine/VideoTexture/BlendType.h
index 2b273253af6..a5c695d737e 100644
--- a/source/gameengine/VideoTexture/BlendType.h
+++ b/source/gameengine/VideoTexture/BlendType.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file BlendType.h
+ * \ingroup bgevideotex
+ */
+
#if !defined BLENDTYPE_H
#define BLENDTYPE_H
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index 3af514ca0de..acab8de8d38 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -24,9 +24,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-FILE(GLOB SRC *.cpp)
-
-SET(INC
+set(INC
.
../../../source/gameengine/Ketsji
../../../source/gameengine/Expressions
@@ -35,7 +33,6 @@ SET(INC
../../../source/gameengine/Rasterizer
../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/BlenderRoutines
- ../../../source/blender/include
../../../source/blender/blenlib
../../../source/blender/blenkernel
../../../source/blender/makesdna
@@ -51,16 +48,47 @@ SET(INC
../../../extern/glew/include
)
-IF(WITH_FFMPEG)
- SET(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
- ADD_DEFINITIONS(-DWITH_FFMPEG)
- ADD_DEFINITIONS(-D__STDC_CONSTANT_MACROS)
-ENDIF(WITH_FFMPEG)
+set(SRC
+ Exception.cpp
+ FilterBase.cpp
+ FilterBlueScreen.cpp
+ FilterColor.cpp
+ FilterNormal.cpp
+ FilterSource.cpp
+ ImageBase.cpp
+ ImageBuff.cpp
+ ImageMix.cpp
+ ImageRender.cpp
+ ImageViewport.cpp
+ PyTypeList.cpp
+ Texture.cpp
+ VideoBase.cpp
+ VideoFFmpeg.cpp
+ blendVideoTex.cpp
+
+ BlendType.h
+ Common.h
+ Exception.h
+ FilterBase.h
+ FilterBlueScreen.h
+ FilterColor.h
+ FilterNormal.h
+ FilterSource.h
+ ImageBase.h
+ ImageBuff.h
+ ImageMix.h
+ ImageRender.h
+ ImageViewport.h
+ PyTypeList.h
+ Texture.h
+ VideoBase.h
+ VideoFFmpeg.h
+)
-IF(WITH_PYTHON)
- SET(INC ${INC} ${PYTHON_INC})
-ELSE(WITH_PYTHON)
- ADD_DEFINITIONS(-DDISABLE_PYTHON)
-ENDIF(WITH_PYTHON)
+if(WITH_CODEC_FFMPEG)
+ set(INC ${INC} ${FFMPEG_INC} ${PTHREADS_INC})
+ add_definitions(-DWITH_FFMPEG)
+ add_definitions(-D__STDC_CONSTANT_MACROS)
+endif()
-BLENDERLIB(bf_videotex "${SRC}" "${INC}")
+blender_add_lib(ge_videotex "${SRC}" "${INC}")
diff --git a/source/gameengine/VideoTexture/Common.h b/source/gameengine/VideoTexture/Common.h
index f771077bbba..6ca38ee44eb 100644
--- a/source/gameengine/VideoTexture/Common.h
+++ b/source/gameengine/VideoTexture/Common.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file VideoTexture/Common.h
+ * \ingroup bgevideotex
+ */
+
#if defined WIN32
#define WINDOWS_LEAN_AND_MEAN
#endif
diff --git a/source/gameengine/VideoTexture/Exception.cpp b/source/gameengine/VideoTexture/Exception.cpp
index 124c8ae27d8..8c8258585a5 100644
--- a/source/gameengine/VideoTexture/Exception.cpp
+++ b/source/gameengine/VideoTexture/Exception.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/Exception.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/Exception.h b/source/gameengine/VideoTexture/Exception.h
index 74dc444c0a9..16248186108 100644
--- a/source/gameengine/VideoTexture/Exception.h
+++ b/source/gameengine/VideoTexture/Exception.h
@@ -21,6 +21,10 @@ http://www.gnu.org/copyleft/lesser.txt.
*/
+/** \file Exception.h
+ * \ingroup bgevideotex
+ */
+
#if !defined EXCEPTION_H
#define EXCEPTION_H
diff --git a/source/gameengine/VideoTexture/FilterBase.cpp b/source/gameengine/VideoTexture/FilterBase.cpp
index b2abd4354fd..65c25837a89 100644
--- a/source/gameengine/VideoTexture/FilterBase.cpp
+++ b/source/gameengine/VideoTexture/FilterBase.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/FilterBase.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/FilterBase.h b/source/gameengine/VideoTexture/FilterBase.h
index b6080f018d5..5bba153be2a 100644
--- a/source/gameengine/VideoTexture/FilterBase.h
+++ b/source/gameengine/VideoTexture/FilterBase.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file FilterBase.h
+ * \ingroup bgevideotex
+ */
+
#if !defined FILTERBASE_H
#define FILTERBASE_H
diff --git a/source/gameengine/VideoTexture/FilterBlueScreen.cpp b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
index 2a624b2ccaa..04ddef99879 100644
--- a/source/gameengine/VideoTexture/FilterBlueScreen.cpp
+++ b/source/gameengine/VideoTexture/FilterBlueScreen.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/FilterBlueScreen.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -80,7 +83,7 @@ static PyObject * getColor (PyFilter * self, void * closure)
static int setColor (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 3
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 3
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2)))
@@ -107,7 +110,7 @@ static PyObject * getLimits (PyFilter * self, void * closure)
static int setLimits (PyFilter * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/gameengine/VideoTexture/FilterBlueScreen.h b/source/gameengine/VideoTexture/FilterBlueScreen.h
index 820e4a44501..0aa3022299d 100644
--- a/source/gameengine/VideoTexture/FilterBlueScreen.h
+++ b/source/gameengine/VideoTexture/FilterBlueScreen.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file FilterBlueScreen.h
+ * \ingroup bgevideotex
+ */
+
#if !defined FILTERBLUESCREEN_H
#define FILTERBLUESCREEN_H
@@ -75,7 +79,7 @@ protected:
VT_A(val) = 0;
// condition for fully opaque color
else if (m_squareLimits[1] <= dist)
- // return normal colour
+ // return normal color
VT_A(val) = 0xFF;
// otherwise calc alpha
else
diff --git a/source/gameengine/VideoTexture/FilterColor.cpp b/source/gameengine/VideoTexture/FilterColor.cpp
index e5d479747c4..db8d493aa73 100644
--- a/source/gameengine/VideoTexture/FilterColor.cpp
+++ b/source/gameengine/VideoTexture/FilterColor.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/FilterColor.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -129,14 +132,14 @@ static int setMatrix (PyFilter * self, PyObject * value, void * closure)
ColorMatrix mat;
// check validity of parameter
bool valid = value != NULL && PySequence_Check(value)
- && PySequence_Length(value) == 4;
+ && PySequence_Size(value) == 4;
// check rows
for (int r = 0; valid && r < 4; ++r)
{
// get row object
PyObject * row = PySequence_Fast_GET_ITEM(value, r);
// check sequence
- valid = PySequence_Check(row) && PySequence_Length(row) == 5;
+ valid = PySequence_Check(row) && PySequence_Size(row) == 5;
// check items
for (int c = 0; valid && c < 5; ++c)
{
@@ -262,14 +265,14 @@ static int setLevels (PyFilter * self, PyObject * value, void * closure)
ColorLevel lev;
// check validity of parameter
bool valid = value != NULL && PySequence_Check(value)
- && PySequence_Length(value) == 4;
+ && PySequence_Size(value) == 4;
// check rows
for (int r = 0; valid && r < 4; ++r)
{
// get row object
PyObject * row = PySequence_Fast_GET_ITEM(value, r);
// check sequence
- valid = PySequence_Check(row) && PySequence_Length(row) == 2;
+ valid = PySequence_Check(row) && PySequence_Size(row) == 2;
// check items
for (int c = 0; valid && c < 2; ++c)
{
diff --git a/source/gameengine/VideoTexture/FilterColor.h b/source/gameengine/VideoTexture/FilterColor.h
index b7e52c4521c..2478727a6be 100644
--- a/source/gameengine/VideoTexture/FilterColor.h
+++ b/source/gameengine/VideoTexture/FilterColor.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file FilterColor.h
+ * \ingroup bgevideotex
+ */
+
#if !defined FILTERCOLOR_H
#define FILTERCOLOR_H
diff --git a/source/gameengine/VideoTexture/FilterNormal.cpp b/source/gameengine/VideoTexture/FilterNormal.cpp
index d755e6294c9..3dfd7c38b46 100644
--- a/source/gameengine/VideoTexture/FilterNormal.cpp
+++ b/source/gameengine/VideoTexture/FilterNormal.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/FilterNormal.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/FilterNormal.h b/source/gameengine/VideoTexture/FilterNormal.h
index 840043be9a1..90ebd6c03ed 100644
--- a/source/gameengine/VideoTexture/FilterNormal.h
+++ b/source/gameengine/VideoTexture/FilterNormal.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file FilterNormal.h
+ * \ingroup bgevideotex
+ */
+
#if !defined FILTERNORMAL_H
#define FILTERNORMAL_H
diff --git a/source/gameengine/VideoTexture/FilterSource.cpp b/source/gameengine/VideoTexture/FilterSource.cpp
index 4b67785edb3..5fea4c74a82 100644
--- a/source/gameengine/VideoTexture/FilterSource.cpp
+++ b/source/gameengine/VideoTexture/FilterSource.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/FilterSource.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/FilterSource.h b/source/gameengine/VideoTexture/FilterSource.h
index 254e0a02679..3518f3134ff 100644
--- a/source/gameengine/VideoTexture/FilterSource.h
+++ b/source/gameengine/VideoTexture/FilterSource.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file FilterSource.h
+ * \ingroup bgevideotex
+ */
+
#if !defined FILTERSOURCE_H
#define FILTERSOURCE_H
diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp
index 88a20fadcf7..a70c56a070c 100644
--- a/source/gameengine/VideoTexture/ImageBase.cpp
+++ b/source/gameengine/VideoTexture/ImageBase.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/ImageBase.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -56,7 +59,8 @@ m_staticSources(staticSrc), m_pyfilter(NULL)
ImageBase::~ImageBase (void)
{
// release image
- delete [] m_image;
+ if (m_image)
+ delete [] m_image;
}
@@ -198,7 +202,8 @@ void ImageBase::init (short width, short height)
// set new buffer size
m_imgSize = newSize;
// release previous and create new buffer
- delete [] m_image;
+ if (m_image)
+ delete [] m_image;
m_image = new unsigned int[m_imgSize];
}
// new image size
diff --git a/source/gameengine/VideoTexture/ImageBase.h b/source/gameengine/VideoTexture/ImageBase.h
index 43a56290bee..53485ceef7a 100644
--- a/source/gameengine/VideoTexture/ImageBase.h
+++ b/source/gameengine/VideoTexture/ImageBase.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file ImageBase.h
+ * \ingroup bgevideotex
+ */
+
#if !defined IMAGEBASE_H
#define IMAGEBASE_H
diff --git a/source/gameengine/VideoTexture/ImageBuff.cpp b/source/gameengine/VideoTexture/ImageBuff.cpp
index 926468c662e..44c4df7fae0 100644
--- a/source/gameengine/VideoTexture/ImageBuff.cpp
+++ b/source/gameengine/VideoTexture/ImageBuff.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/ImageBuff.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -147,10 +150,10 @@ void ImageBuff::plot (unsigned char * img, short width, short height, short x, s
if (!m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0, 0);
+ m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0);
}
- tmpbuf = IMB_allocImBuf(width, height, 0, 0, 0);
+ tmpbuf = IMB_allocImBuf(width, height, 0, 0);
// assign temporarily our buffer to the ImBuf buffer, we use the same format
tmpbuf->rect = (unsigned int*)img;
@@ -169,11 +172,11 @@ void ImageBuff::plot (ImageBuff* img, short x, short y, short mode)
if (!m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0, 0);
+ m_imbuf = IMB_allocImBuf(m_size[0], m_size[1], 0, 0);
}
if (!img->m_imbuf) {
// allocate most basic imbuf, we will assign the rect buffer on the fly
- img->m_imbuf = IMB_allocImBuf(img->m_size[0], img->m_size[1], 0, 0, 0);
+ img->m_imbuf = IMB_allocImBuf(img->m_size[0], img->m_size[1], 0, 0);
}
// assign temporarily our buffer to the ImBuf buffer, we use the same format
img->m_imbuf->rect = img->m_image;
diff --git a/source/gameengine/VideoTexture/ImageBuff.h b/source/gameengine/VideoTexture/ImageBuff.h
index 271647361e8..f0f14f2b4b1 100644
--- a/source/gameengine/VideoTexture/ImageBuff.h
+++ b/source/gameengine/VideoTexture/ImageBuff.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file ImageBuff.h
+ * \ingroup bgevideotex
+ */
+
#if !defined IMAGEBUFF_H
#define IMAGEBUFF_H
diff --git a/source/gameengine/VideoTexture/ImageMix.cpp b/source/gameengine/VideoTexture/ImageMix.cpp
index 7b304dda3ce..7a8226aab03 100644
--- a/source/gameengine/VideoTexture/ImageMix.cpp
+++ b/source/gameengine/VideoTexture/ImageMix.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/ImageMix.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/ImageMix.h b/source/gameengine/VideoTexture/ImageMix.h
index 47bd644860f..ada936b4be5 100644
--- a/source/gameengine/VideoTexture/ImageMix.h
+++ b/source/gameengine/VideoTexture/ImageMix.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file ImageMix.h
+ * \ingroup bgevideotex
+ */
+
#if !defined IMAGEMIX_H
#define IMAGEMIX_H
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index 7580563a74f..6038416ba68 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/ImageRender.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -64,7 +67,7 @@ ImageRender::ImageRender (KX_Scene * scene, KX_Camera * camera) :
m_mirror(NULL),
m_clip(100.f)
{
- // initialize background colour
+ // initialize background color
setBackground(0, 0, 255, 255);
// retrieve rendering objects
m_engine = KX_GetActiveEngine();
@@ -181,7 +184,9 @@ void ImageRender::Render()
frustrum.camnear = -mirrorOffset[2];
frustrum.camfar = -mirrorOffset[2]+m_clip;
}
+ // Store settings to be restored later
const RAS_IRasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode();
+ RAS_Rect area = m_canvas->GetWindowArea();
// The screen area that ImageViewport will copy is also the rendering zone
m_canvas->SetViewPort(m_position[0], m_position[1], m_position[0]+m_capSize[0]-1, m_position[1]+m_capSize[1]-1);
@@ -258,6 +263,9 @@ void ImageRender::Render()
m_scene->CalculateVisibleMeshes(m_rasterizer,m_camera);
m_scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ // restore the canvas area now that the render is completed
+ m_canvas->GetWindowArea() = area;
}
@@ -331,7 +339,7 @@ PyObject * getBackground (PyImage * self, void * closure)
static int setBackground (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 4
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 4
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 2))
diff --git a/source/gameengine/VideoTexture/ImageRender.h b/source/gameengine/VideoTexture/ImageRender.h
index d49544ce42a..1101fbbc2d4 100644
--- a/source/gameengine/VideoTexture/ImageRender.h
+++ b/source/gameengine/VideoTexture/ImageRender.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file ImageRender.h
+ * \ingroup bgevideotex
+ */
+
#if !defined IMAGERENDER_H
#define IMAGERENDER_H
@@ -85,7 +89,7 @@ protected:
/// engine
KX_KetsjiEngine* m_engine;
- /// background colour
+ /// background color
float m_background[4];
diff --git a/source/gameengine/VideoTexture/ImageViewport.cpp b/source/gameengine/VideoTexture/ImageViewport.cpp
index 5a4e8af1b0c..d0e5ee74f6e 100644
--- a/source/gameengine/VideoTexture/ImageViewport.cpp
+++ b/source/gameengine/VideoTexture/ImageViewport.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/ImageViewport.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -225,7 +228,7 @@ static PyObject * ImageViewport_getPosition (PyImage * self, void * closure)
static int ImageViewport_setPosition (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
@@ -253,7 +256,7 @@ PyObject * ImageViewport_getCaptureSize (PyImage * self, void * closure)
int ImageViewport_setCaptureSize (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyLong_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/gameengine/VideoTexture/ImageViewport.h b/source/gameengine/VideoTexture/ImageViewport.h
index 49db56bcf19..1b415fc58be 100644
--- a/source/gameengine/VideoTexture/ImageViewport.h
+++ b/source/gameengine/VideoTexture/ImageViewport.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file ImageViewport.h
+ * \ingroup bgevideotex
+ */
+
#if !defined IMAGEVIEWPORT_H
#define IMAGEVIEWPORT_H
diff --git a/source/gameengine/VideoTexture/Makefile b/source/gameengine/VideoTexture/Makefile
deleted file mode 100644
index af3417eef02..00000000000
--- a/source/gameengine/VideoTexture/Makefile
+++ /dev/null
@@ -1,68 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = videotex
-DIR = $(OCGDIR)/gameengine/$(LIBNAME)
-SOURCEDIR = source/gameengine/VideoTexture
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_1_CPP_WARNINGS)
-
-CPPFLAGS += $(OGL_CPPFLAGS)
-CPPFLAGS += -I$(NAN_GLEW)/include
-CPPFLAGS += -I$(OPENGL_HEADERS)
-CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
-CPPFLAGS += -I../../blender/python
-CPPFLAGS += -I../../blender/python/generic
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer
-CPPFLAGS += -I../Rasterizer -I../GameLogic -I../SceneGraph
-CPPFLAGS += -I../BlenderRoutines -I../Expressions -I../Ketsji
-CPPFLAGS += -I../../kernel/gen_system
-CPPFLAGS += -I.
-CPPFLAGS += -I../../blender/blenkernel
-CPPFLAGS += -I../../blender/blenlib
-CPPFLAGS += -I../../blender/editors/include
-CPPFLAGS += -I../../blender/makesdna
-CPPFLAGS += -I../../blender/imbuf
-CPPFLAGS += -I../../blender/gpu
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
-
-ifeq ($(WITH_FFMPEG),true)
- CPPFLAGS += -DWITH_FFMPEG
- CPPFLAGS += $(NAN_FFMPEGCFLAGS)
- ifdef NAN_PTHREADS
- CPPFLAGS += -I$(NAN_PTHREADS)/include
- endif
-endif
-
-
diff --git a/source/gameengine/VideoTexture/PyTypeList.cpp b/source/gameengine/VideoTexture/PyTypeList.cpp
index 2d571675dbd..5064cd925ed 100644
--- a/source/gameengine/VideoTexture/PyTypeList.cpp
+++ b/source/gameengine/VideoTexture/PyTypeList.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/PyTypeList.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of blendTex library
@@ -28,6 +31,14 @@ http://www.gnu.org/copyleft/lesser.txt.
#include <PyObjectPlus.h>
+/// destructor
+PyTypeList::~PyTypeList()
+{
+ // if list exists
+ if (m_list.get() != NULL)
+ for (PyTypeListType::iterator it = m_list->begin(); it != m_list->end(); ++it)
+ delete *it;
+}
/// check, if type is in list
bool PyTypeList::in (PyTypeObject * type)
diff --git a/source/gameengine/VideoTexture/PyTypeList.h b/source/gameengine/VideoTexture/PyTypeList.h
index 4daf88bfa19..089699aaa7e 100644
--- a/source/gameengine/VideoTexture/PyTypeList.h
+++ b/source/gameengine/VideoTexture/PyTypeList.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file PyTypeList.h
+ * \ingroup bgevideotex
+ */
+
#if !defined PYTYPELIST_H
#define PYTYPELIST_H
@@ -41,6 +45,9 @@ typedef std::vector<PyTypeListItem*> PyTypeListType;
class PyTypeList
{
public:
+ /// destructor
+ ~PyTypeList();
+
/// check, if type is in list
bool in (PyTypeObject * type);
diff --git a/source/gameengine/VideoTexture/SConscript b/source/gameengine/VideoTexture/SConscript
index 21a5f8ce3fe..94209f85823 100644
--- a/source/gameengine/VideoTexture/SConscript
+++ b/source/gameengine/VideoTexture/SConscript
@@ -20,12 +20,17 @@ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc','win32-mingw'):
defs.append('_DEBUG')
if env['WITH_BF_PYTHON']:
+<<<<<<< .working
incs += ' ' + env['BF_PYTHON_INC']
else:
defs.append('DISABLE_PYTHON')
+=======
+ incs += ' ' + env['BF_PYTHON_INC']
+ defs.append('WITH_PYTHON')
+>>>>>>> .merge-right.r35190
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC'] + ' ' + env['BF_PTHREADS_INC']
-env.BlenderLib ( 'bf_videotex', sources, Split(incs), defs, libtype=['core','player'], priority=[340,205], cxx_compileflags=env['BGE_CXXFLAGS'])
+env.BlenderLib ( 'ge_videotex', sources, Split(incs), defs, libtype=['core','player'], priority=[340,205], cxx_compileflags=env['BGE_CXXFLAGS'])
diff --git a/source/gameengine/VideoTexture/Texture.cpp b/source/gameengine/VideoTexture/Texture.cpp
index f97ceb1fa67..0eaec4be713 100644
--- a/source/gameengine/VideoTexture/Texture.cpp
+++ b/source/gameengine/VideoTexture/Texture.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/Texture.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/Texture.h b/source/gameengine/VideoTexture/Texture.h
index 1bbef8f0f9e..198a0d2b146 100644
--- a/source/gameengine/VideoTexture/Texture.h
+++ b/source/gameengine/VideoTexture/Texture.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file VideoTexture/Texture.h
+ * \ingroup bgevideotex
+ */
+
#if !defined TEXTURE_H
#define TEXTURE_H
diff --git a/source/gameengine/VideoTexture/VideoBase.cpp b/source/gameengine/VideoTexture/VideoBase.cpp
index 5de7a9e80a9..c23c8fdc188 100644
--- a/source/gameengine/VideoTexture/VideoBase.cpp
+++ b/source/gameengine/VideoTexture/VideoBase.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/VideoBase.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
@@ -82,6 +85,8 @@ void VideoBase::process (BYTE * sample)
// finish
break;
}
+ case None:
+ break; /* assert? */
}
}
}
@@ -145,7 +150,7 @@ PyObject * Video_getRange (PyImage * self, void * closure)
int Video_setRange (PyImage * self, PyObject * value, void * closure)
{
// check validity of parameter
- if (value == NULL || !PySequence_Check(value) || PySequence_Length(value) != 2
+ if (value == NULL || !PySequence_Check(value) || PySequence_Size(value) != 2
|| !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 0))
|| !PyFloat_Check(PySequence_Fast_GET_ITEM(value, 1)))
{
diff --git a/source/gameengine/VideoTexture/VideoBase.h b/source/gameengine/VideoTexture/VideoBase.h
index 0c8668ee0bc..08000161f14 100644
--- a/source/gameengine/VideoTexture/VideoBase.h
+++ b/source/gameengine/VideoTexture/VideoBase.h
@@ -20,6 +20,10 @@ http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+/** \file VideoBase.h
+ * \ingroup bgevideotex
+ */
+
#if !defined VIDEOBASE_H
#define VIDEOBASE_H
diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.cpp b/source/gameengine/VideoTexture/VideoFFmpeg.cpp
index 5a80522ea7d..63dbc5bb7ba 100644
--- a/source/gameengine/VideoTexture/VideoFFmpeg.cpp
+++ b/source/gameengine/VideoTexture/VideoFFmpeg.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/VideoFFmpeg.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/gameengine/VideoTexture/VideoFFmpeg.h b/source/gameengine/VideoTexture/VideoFFmpeg.h
index a19d8969b40..9b09c485329 100644
--- a/source/gameengine/VideoTexture/VideoFFmpeg.h
+++ b/source/gameengine/VideoTexture/VideoFFmpeg.h
@@ -19,6 +19,11 @@ Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
+
+/** \file VideoFFmpeg.h
+ * \ingroup bgevideotex
+ */
+
#if !defined VIDEOFFMPEG_H
#define VIDEOFFMPEG_H
diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp
index 5cb50900c89..c1258bbb6e4 100644
--- a/source/gameengine/VideoTexture/blendVideoTex.cpp
+++ b/source/gameengine/VideoTexture/blendVideoTex.cpp
@@ -1,3 +1,6 @@
+/** \file gameengine/VideoTexture/blendVideoTex.cpp
+ * \ingroup bgevideotex
+ */
/* $Id$
-----------------------------------------------------------------------------
This source file is part of VideoTexture library
diff --git a/source/icons/Makefile b/source/icons/Makefile
deleted file mode 100644
index 5832a098592..00000000000
--- a/source/icons/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-DIR = $(OCGDIR)/blender/icons
-
-include nan_compile.mk
-
-clean::
- @$(RM) $(DIR)/*.res $(DIR)/debug/*.res
diff --git a/source/icons/SConscript b/source/icons/SConscript
index 5abb36aafea..ca6308781e9 100644
--- a/source/icons/SConscript
+++ b/source/icons/SConscript
@@ -2,8 +2,8 @@
Import ('env')
if env['OURPLATFORM'] == 'linuxcross':
- source = 'linuxcrossblender.rcscons'
+ source = 'linuxcrossblender.rcscons'
else:
- source = 'winblender.rcscons'
+ source = 'winblender.rcscons'
env.BlenderRes('winresource', source, ['core'], priority=[95])
diff --git a/source/icons/winblender.ico b/source/icons/winblender.ico
index 85fccd71bf5..e6b368c562b 100644
--- a/source/icons/winblender.ico
+++ b/source/icons/winblender.ico
Binary files differ
diff --git a/source/icons/wincreator.ico b/source/icons/wincreator.ico
deleted file mode 100644
index 4fb7be08788..00000000000
--- a/source/icons/wincreator.ico
+++ /dev/null
Binary files differ
diff --git a/source/icons/wincreator.rc b/source/icons/wincreator.rc
deleted file mode 100644
index e11bdaf15e3..00000000000
--- a/source/icons/wincreator.rc
+++ /dev/null
@@ -1,2 +0,0 @@
-APPICON ICON "wincreator.ico"
-BLENDERFILE ICON "winblenderfile.ico"
diff --git a/source/icons/winlockedfile.ico b/source/icons/winlockedfile.ico
deleted file mode 100644
index 8b23d5c3d4d..00000000000
--- a/source/icons/winlockedfile.ico
+++ /dev/null
Binary files differ
diff --git a/source/icons/winplayer.ico b/source/icons/winplayer.ico
deleted file mode 100644
index 336ff09f94f..00000000000
--- a/source/icons/winplayer.ico
+++ /dev/null
Binary files differ
diff --git a/source/icons/winplayer.rc b/source/icons/winplayer.rc
deleted file mode 100644
index e2b255e7280..00000000000
--- a/source/icons/winplayer.rc
+++ /dev/null
@@ -1 +0,0 @@
-APPICON ICON "winplayer.ico"
diff --git a/source/icons/winpublisher.ico b/source/icons/winpublisher.ico
deleted file mode 100644
index 9a6f4690681..00000000000
--- a/source/icons/winpublisher.ico
+++ /dev/null
Binary files differ
diff --git a/source/icons/winpublisher.rc b/source/icons/winpublisher.rc
deleted file mode 100644
index b296c0ffc8f..00000000000
--- a/source/icons/winpublisher.rc
+++ /dev/null
@@ -1,3 +0,0 @@
-APPICON ICON "winpublisher.ico"
-BLENDERFILE ICON "winblenderfile.ico"
-LOCKEDFILE ICON "winlockedfile.ico"
diff --git a/source/kernel/CMakeLists.txt b/source/kernel/CMakeLists.txt
index 46c5ea89ce5..bcf967cff12 100644
--- a/source/kernel/CMakeLists.txt
+++ b/source/kernel/CMakeLists.txt
@@ -24,14 +24,25 @@
#
# ***** END GPL LICENSE BLOCK *****
-SET(INC gen_messaging gen_system ../../intern/string ../../intern/moto/include ../../source/blender/blenloader )
+set(INC
+ gen_messaging
+ gen_system
+ ../../intern/string
+ ../../intern/moto/include
+ ../../source/blender/blenloader
+)
-FILE(GLOB SRC
+set(SRC
gen_messaging/intern/messaging.c
gen_system/GEN_HashedPtr.cpp
- gen_system/GEN_Matrix4x4.cpp
gen_system/SYS_SingletonSystem.cpp
gen_system/SYS_System.cpp
+
+ gen_messaging/GEN_messaging.h
+ gen_system/GEN_HashedPtr.h
+ gen_system/GEN_Map.h
+ gen_system/SYS_SingletonSystem.h
+ gen_system/SYS_System.h
)
-BLENDERLIB(bf_kernel "${SRC}" "${INC}")
+blender_add_lib(bf_gen_system "${SRC}" "${INC}")
diff --git a/source/kernel/Makefile b/source/kernel/Makefile
deleted file mode 100644
index aa0b3dd3bf1..00000000000
--- a/source/kernel/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Make module object directory and bounce make to subdirectories.
-
-include nan_definitions.mk
-
-DIR = $(OCGDIR)/kernel
-SOURCEDIR = source/kernel
-DIRS = gen_system gen_messaging
-
-include nan_subdirs.mk
diff --git a/source/kernel/SConscript b/source/kernel/SConscript
index 3110f46cfad..8dd0fd36e8a 100644
--- a/source/kernel/SConscript
+++ b/source/kernel/SConscript
@@ -2,9 +2,9 @@
Import ('env')
sources = 'gen_messaging/intern/messaging.c gen_system/GEN_HashedPtr.cpp'
-sources += ' gen_system/GEN_Matrix4x4.cpp gen_system/SYS_SingletonSystem.cpp'
+sources += ' gen_system/SYS_SingletonSystem.cpp'
sources += ' gen_system/SYS_System.cpp'
incs = 'gen_messaging gen_system #/intern/string #/intern/moto/include #/source/blender/blenloader '
-env.BlenderLib ( 'bf_kernel', Split(sources), Split(incs), [], libtype = ['core','player'], priority = [400,100] )
+env.BlenderLib ( 'bf_gen_system', Split(sources), Split(incs), [], libtype = ['core','player'], priority = [400,100] )
diff --git a/source/kernel/gen_messaging/GEN_messaging.h b/source/kernel/gen_messaging/GEN_messaging.h
index 52c68947623..866716f3914 100644
--- a/source/kernel/gen_messaging/GEN_messaging.h
+++ b/source/kernel/gen_messaging/GEN_messaging.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file kernel/gen_messaging/GEN_messaging.h
+ * \ingroup genmess
+ */
+
#ifndef GEN_MESSAGING_H
#define GEN_MESSAGING_H
diff --git a/source/kernel/gen_messaging/Makefile b/source/kernel/gen_messaging/Makefile
deleted file mode 100644
index a1d203bcf18..00000000000
--- a/source/kernel/gen_messaging/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-# Bounces make to subdirectories.
-
-SOURCEDIR = source/kernel/gen_messaging
-DIRS = intern
-
-include nan_subdirs.mk
diff --git a/source/kernel/gen_messaging/intern/Makefile b/source/kernel/gen_messaging/intern/Makefile
deleted file mode 100644
index 7b6b2169540..00000000000
--- a/source/kernel/gen_messaging/intern/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_messaging
-DIR = $(OCGDIR)/kernel/$(LIBNAME)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_1_C_WARNINGS)
-
-# path to our own external headerfiles
-CPPFLAGS += -I..
-
diff --git a/source/kernel/gen_messaging/intern/messaging.c b/source/kernel/gen_messaging/intern/messaging.c
index b1f8a5b8e56..93e6deac089 100644
--- a/source/kernel/gen_messaging/intern/messaging.c
+++ b/source/kernel/gen_messaging/intern/messaging.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
* A message and error sink for c and c++
*/
+/** \file kernel/gen_messaging/intern/messaging.c
+ * \ingroup genmess
+ */
+
+
#include "GEN_messaging.h"
diff --git a/source/kernel/gen_system/GEN_DataCache.h b/source/kernel/gen_system/GEN_DataCache.h
deleted file mode 100644
index 96ceafc232d..00000000000
--- a/source/kernel/gen_system/GEN_DataCache.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef __GEN_DATACACHE_H
-#define __GEN_DATACACHE_H
-
-#include "STR_HashedString.h"
-#include "GEN_Map.h"
-
-template <class T>
-class GEN_DataCache
-{
- GEN_Map<STR_HashedString,T*> m_dataCache;
- virtual T* LoadData(const STR_String& name)=0;
- virtual void FreeCacheObjects()=0;
-
-public:
- GEN_DataCache() {};
- virtual ~GEN_DataCache() {};
-
- T* GetData(const STR_String& paramname)
- {
- T* result=NULL;
-
- T** resultptr = m_dataCache[paramname];
- if (resultptr)
- {
- result = *resultptr;
- }
-
- else
- {
- result = LoadData(paramname);
- if (result)
- {
- m_dataCache.insert(paramname,result);
- }
- }
-
- return result;
- }
-
- virtual void ClearCache()
- {
- FreeCacheObjects();
- m_dataCache.clear();
- }
-};
-
-#endif //__GEN_DATACACHE_H
-
diff --git a/source/kernel/gen_system/GEN_HashedPtr.cpp b/source/kernel/gen_system/GEN_HashedPtr.cpp
index f6c71c34896..f065d27bee2 100644
--- a/source/kernel/gen_system/GEN_HashedPtr.cpp
+++ b/source/kernel/gen_system/GEN_HashedPtr.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+
+/** \file kernel/gen_system/GEN_HashedPtr.cpp
+ * \ingroup gensys
+ */
+
#include "GEN_HashedPtr.h"
#include "BLO_sys_types.h" // for intptr_t support
diff --git a/source/kernel/gen_system/GEN_HashedPtr.h b/source/kernel/gen_system/GEN_HashedPtr.h
index c3b79cf7ccf..86a7ceb9ae7 100644
--- a/source/kernel/gen_system/GEN_HashedPtr.h
+++ b/source/kernel/gen_system/GEN_HashedPtr.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+
+/** \file kernel/gen_system/GEN_HashedPtr.h
+ * \ingroup gensys
+ */
+
#ifndef __GEN_HASHEDPTR
#define __GEN_HASHEDPTR
diff --git a/source/kernel/gen_system/GEN_Map.h b/source/kernel/gen_system/GEN_Map.h
index b70e1259fd6..4ac5a10c4c6 100644
--- a/source/kernel/gen_system/GEN_Map.h
+++ b/source/kernel/gen_system/GEN_Map.h
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file kernel/gen_system/GEN_Map.h
+ * \ingroup gensys
+ */
+
#ifndef GEN_MAP_H
#define GEN_MAP_H
diff --git a/source/kernel/gen_system/GEN_Matrix4x4.cpp b/source/kernel/gen_system/GEN_Matrix4x4.cpp
deleted file mode 100644
index 72926ce9c39..00000000000
--- a/source/kernel/gen_system/GEN_Matrix4x4.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "GEN_Matrix4x4.h"
-
-GEN_Matrix4x4::GEN_Matrix4x4()
-{
- Identity();
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const float value[4][4])
-{
- for (int i=0;i<4;i++)
- {
- for (int j=0;j<4;j++)
- m_V[i][j] = value[i][j];
- }
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const double value[16])
-{
- for (int i=0;i<16;i++)
- m_Vflat[i] = value[i];
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const GEN_Matrix4x4& other)
-{
- SetMatrix(other);
-}
-
-
-
-GEN_Matrix4x4::GEN_Matrix4x4(const MT_Point3& orig,
- const MT_Vector3& dir,
- const MT_Vector3 up)
-{
- MT_Vector3 z = -(dir.normalized());
- MT_Vector3 x = (up.cross(z)).normalized();
- MT_Vector3 y = (z.cross(x));
-
- m_V[0][0] = x.x();
- m_V[0][1] = y.x();
- m_V[0][2] = z.x();
- m_V[0][3] = 0.0f;
-
- m_V[1][0] = x.y();
- m_V[1][1] = y.y();
- m_V[1][2] = z.y();
- m_V[1][3] = 0.0f;
-
- m_V[2][0] = x.z();
- m_V[2][1] = y.z();
- m_V[2][2] = z.z();
- m_V[2][3] = 0.0f;
-
- m_V[3][0] = orig.x();//0.0f;
- m_V[3][1] = orig.y();//0.0f;
- m_V[3][2] = orig.z();//0.0f;
- m_V[3][3] = 1.0f;
-
- //Translate(-orig);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetRight() const
-{
- return MT_Vector3(m_V[0][0], m_V[0][1], m_V[0][2]);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetUp() const
-{
- return MT_Vector3(m_V[1][0], m_V[1][1], m_V[1][2]);
-}
-
-
-
-MT_Vector3 GEN_Matrix4x4::GetDir() const
-{
- return MT_Vector3(m_V[2][0], m_V[2][1], m_V[2][2]);
-}
-
-
-
-MT_Point3 GEN_Matrix4x4::GetPos() const
-{
- return MT_Point3(m_V[3][0], m_V[3][1], m_V[3][2]);
-}
-
-
-
-void GEN_Matrix4x4::Identity()
-{
- for (int i=0; i<4; i++)
- {
- for (int j=0; j<4; j++)
- m_V[i][j] = (i==j?1.0f:0.0f);
- }
-}
-
-
-
-void GEN_Matrix4x4::SetMatrix(const GEN_Matrix4x4& other)
-{
- for (int i=0; i<16; i++)
- m_Vflat[i] = other.m_Vflat[i];
-}
-
-
-
-double* GEN_Matrix4x4::getPointer()
-{
- return &m_V[0][0];
-}
-
-
-
-const double* GEN_Matrix4x4::getPointer() const
-{
- return &m_V[0][0];
-}
-
-
-
-void GEN_Matrix4x4::setElem(int pos,double newvalue)
-{
- m_Vflat[pos] = newvalue;
-}
-
-
-
-
-
-GEN_Matrix4x4 GEN_Matrix4x4::Perspective(MT_Scalar inLeft,
-MT_Scalar inRight,
-MT_Scalar inBottom,
-MT_Scalar inTop,
-MT_Scalar inNear,
-MT_Scalar inFar)
-{
-
- GEN_Matrix4x4 mat;
-
- // Column 0
- mat(0, 0) = -(2.0*inNear) / (inRight-inLeft);
- mat(1, 0) = 0;
- mat(2, 0) = 0;
- mat(3, 0) = 0;
-
- // Column 1
- mat(0, 1) = 0;
- mat(1, 1) = (2.0*inNear) / (inTop-inBottom);
- mat(2, 1) = 0;
- mat(3, 1) = 0;
-
- // Column 2
- mat(0, 2) = (inRight+inLeft) / (inRight-inLeft);
- mat(1, 2) = (inTop+inBottom) / (inTop-inBottom);
- mat(2, 2) = -(inFar+inNear) / (inFar-inNear);
- mat(3, 2) = -1;
-
- // Column 3
- mat(0, 3) = 0;
- mat(1, 3) = 0;
- mat(2, 3) = -(2.0*inFar*inNear) / (inFar-inNear);
- mat(3, 3) = 0;
-
- return mat;
-}
diff --git a/source/kernel/gen_system/GEN_Matrix4x4.h b/source/kernel/gen_system/GEN_Matrix4x4.h
deleted file mode 100644
index dede10fd459..00000000000
--- a/source/kernel/gen_system/GEN_Matrix4x4.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef GEN_MATRIX4X4
-#define GEN_MATRIX4X4
-
-#include "MT_Point3.h"
-
-class GEN_Matrix4x4
-{
-public:
- // creators.
- GEN_Matrix4x4();
- GEN_Matrix4x4(const float value[4][4]);
- GEN_Matrix4x4(const double value[16]);
- GEN_Matrix4x4(const GEN_Matrix4x4 & other);
- GEN_Matrix4x4(const MT_Point3& orig,
- const MT_Vector3& dir,
- const MT_Vector3 up);
-
- void Identity();
- void SetMatrix(const GEN_Matrix4x4 & other);
- double* getPointer();
- const double* getPointer() const;
- void setElem(int pos,double newvalue);
-
-
- MT_Vector3 GetRight() const;
- MT_Vector3 GetUp() const;
- MT_Vector3 GetDir() const;
- MT_Point3 GetPos() const;
- void SetPos(const MT_Vector3 & v);
-
- double& operator () (int row,int col) { return m_V[col][row]; }
-
- static GEN_Matrix4x4 Perspective(MT_Scalar inLeft,
- MT_Scalar inRight,
- MT_Scalar inBottom,
- MT_Scalar inTop,
- MT_Scalar inNear,
- MT_Scalar inFar);
-protected:
- union
- {
- double m_V[4][4];
- double m_Vflat[16];
- };
-};
-
-#endif //GEN_MATRIX4X4
-
diff --git a/source/kernel/gen_system/GEN_SmartPtr.h b/source/kernel/gen_system/GEN_SmartPtr.h
deleted file mode 100644
index e1c378d6867..00000000000
--- a/source/kernel/gen_system/GEN_SmartPtr.h
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef NAN_INCLUDED_GEN_SmartPtr_h
-#define NAN_INCLUDED_GEN_SmartPtr_h
-
-/**
- * $Id$
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- * @author Laurence
- */
-
-#include <stdlib.h> // for NULL !
-
-/**
- * @section GEN_SmartPtr
- * This class defines a smart pointer similar to that defined in
- * the Standard Template Library but without the painful get()
- * semantics to access the internal c style pointer.
- *
- * It is often useful to explicitely decalre ownership of memory
- * allocated on the heap within class or function scope. This
- * class helps you to encapsulate this ownership within a value
- * type. When an instance of this class goes out of scope it
- * makes sure that any memory associated with it's internal pointer
- * is deleted. It can help to inform users of an aggregate class
- * that it owns instances of it's members and these instances
- * should not be shared. This is not reliably enforcable in C++
- * but this class attempts to make the 1-1 relationship clear.
- *
- * @section Example usage
- *
- * class foo {
- * ...constructors accessors etc.
- * int x[1000];
- * }
- *
- * class bar {
- * public :
- * static
- * bar *
- * New(
- * ) {
- * GEN_SmartPtr<foo> afoo = new foo();
- * GEN_SmartPtr<bar> that = new bar();
- *
- * if (foo == NULL || that == NULL) return NULL;
- *
- * that->m_foo = afoo.Release();
- * return that.Release();
- * }
- *
- * ~bar() {
- * // smart ptr takes care of deletion
- * }
- * private :
- * GEN_SmartPtr<foo> m_foo;
- * }
- *
- * You my also safely construct vectors of GEN_SmartPtrs and
- * have the vector own stuff you put into it.
- *
- * e.g.
- * {
- * std::vector<GEN_SmartPtr<foo> > foo_vector;
- * foo_vector.push_back( new foo());
- * foo_vector.push_back( new foo());
- *
- * foo_vector[0]->bla();
- * } // foo_vector out of scope => heap memory freed for both foos
- *
- * @warning this class should only be used for objects created
- * on the heap via the new function. It will not behave correctly
- * if you pass ptrs to objects created with new[] nor with
- * objects declared on the stack. Doing this is likely to crash
- * the program or lead to memory leaks.
- */
-
-template
- < class T >
-class GEN_SmartPtr {
-
-public :
-
- /**
- * Construction from reference - this class
- * always assumes ownership from the rhs.
- */
-
- GEN_SmartPtr(
- const GEN_SmartPtr &rhs
- ){
- m_val = rhs.Release();
- }
-
- /**
- * Construction from ptr - this class always
- * assumes that it now owns the memory associated with the
- * ptr.
- */
-
- GEN_SmartPtr(
- T* val
- ) :
- m_val (val)
- {
- }
-
- /**
- * Defalut constructor
- */
-
- GEN_SmartPtr(
- ) :
- m_val (NULL)
- {
- }
-
- /**
- * Type conversion from this class to the type
- * of a pointer to the template parameter.
- * This means you can pass an instance of this class
- * to a function expecting a ptr of type T.
- */
-
- operator T * () const {
- return m_val;
- }
-
- /**
- * Return a reference to the internal ptr class.
- * Use with care when you now that the internal ptr
- * is not NULL!
- */
-
- T &
- Ref(
- ) const {
- return *m_val;
- }
-
- /**
- * Assignment operator - ownership is transfered from rhs to lhs.
- * There is an intenional side-effect of function of transferring
- * ownership from the const parameter rhs. This is to insure
- * the 1-1 relationship.
- * The object associated with this instance is deleted if it
- * is not the same as that contained in the rhs.
- */
-
- GEN_SmartPtr & operator=(
- const GEN_SmartPtr &rhs
- ) {
- if (this->m_val != rhs.m_val) {
- delete this->m_val;
- }
-
- this->m_val = rhs.Release();
- return *this;
- }
-
- /**
- * Overload the operator -> so that it's possible to access
- * all the normal methods of the internal ptr.
- */
-
- T * operator->() const {
- return m_val;
- }
-
- /**
- * Caller takes ownership of the object - the object will not
- * be deleted when the ptr goes out of scope.
- */
-
- T *
- Release(
- ) const {
- T* temp = m_val;
- (const_cast<GEN_SmartPtr *>(this))->m_val = NULL;
- return temp;
- }
-
- /**
- * Force destruction of the internal object.
- */
-
- void
- Delete(
- ) {
- delete (m_val);
- m_val = NULL;
- }
-
- /**
- * Destructor - deletes object if it exists
- */
-
- ~GEN_SmartPtr(
- ) {
- delete (m_val);
- }
-
-private :
-
- /// The ptr owned by this class.
- T * m_val;
-};
-
-#endif
-
diff --git a/source/kernel/gen_system/Makefile b/source/kernel/gen_system/Makefile
deleted file mode 100644
index 45f491cbeb4..00000000000
--- a/source/kernel/gen_system/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): none yet.
-#
-# ***** END GPL LICENSE BLOCK *****
-#
-#
-
-LIBNAME = gen_system
-DIR = $(OCGDIR)/kernel/$(LIBNAME)
-
-include nan_compile.mk
-
-CCFLAGS += $(LEVEL_2_CPP_WARNINGS)
-
-CPPFLAGS += -I$(NAN_MOTO)/include
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I../../../source/blender/blenloader
-
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.cpp b/source/kernel/gen_system/SYS_SingletonSystem.cpp
index 0b5cfe7273a..08ee186c723 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.cpp
+++ b/source/kernel/gen_system/SYS_SingletonSystem.cpp
@@ -28,8 +28,13 @@
* Unique instance of system class for system specific information / access
* Used by SYS_System
*/
+
+/** \file kernel/gen_system/SYS_SingletonSystem.cpp
+ * \ingroup gensys
+ */
+
#include "SYS_SingletonSystem.h"
-#include "GEN_DataCache.h"
+// #include "GEN_DataCache.h"
SYS_SingletonSystem* SYS_SingletonSystem::_instance = 0;
diff --git a/source/kernel/gen_system/SYS_SingletonSystem.h b/source/kernel/gen_system/SYS_SingletonSystem.h
index 889838454e7..d8628558618 100644
--- a/source/kernel/gen_system/SYS_SingletonSystem.h
+++ b/source/kernel/gen_system/SYS_SingletonSystem.h
@@ -28,12 +28,16 @@
* Unique instance of system class for system specific information / access
* Used by SYS_System
*/
+
+/** \file kernel/gen_system/SYS_SingletonSystem.h
+ * \ingroup gensys
+ */
+
#ifndef __SINGLETONSYSTEM_H
#define __SINGLETONSYSTEM_H
#include "GEN_Map.h"
#include "STR_HashedString.h"
-#include "GEN_DataCache.h"
class SYS_SingletonSystem
{
diff --git a/source/kernel/gen_system/SYS_System.cpp b/source/kernel/gen_system/SYS_System.cpp
index b2e27f179e6..b2de797fc8d 100644
--- a/source/kernel/gen_system/SYS_System.cpp
+++ b/source/kernel/gen_system/SYS_System.cpp
@@ -28,6 +28,11 @@
* System specific information / access.
* Interface to the commandline arguments
*/
+
+/** \file kernel/gen_system/SYS_System.cpp
+ * \ingroup gensys
+ */
+
#include "SYS_System.h"
#include "SYS_SingletonSystem.h"
diff --git a/source/kernel/gen_system/SYS_System.h b/source/kernel/gen_system/SYS_System.h
index b899100b83c..34fed4a81a2 100644
--- a/source/kernel/gen_system/SYS_System.h
+++ b/source/kernel/gen_system/SYS_System.h
@@ -29,6 +29,11 @@
* Interface to the commandline arguments
*/
+/** \file kernel/gen_system/SYS_System.h
+ * \ingroup gensys
+ */
+
+
#ifndef __SYSTEM_INCLUDE
#define __SYSTEM_INCLUDE
diff --git a/source/tests/CMakeLists.txt b/source/tests/CMakeLists.txt
new file mode 100644
index 00000000000..27b4ea7a6bd
--- /dev/null
+++ b/source/tests/CMakeLists.txt
@@ -0,0 +1,253 @@
+# -*- mode: cmake; indent-tabs-mode: t; -*-
+# $Id: CMakeLists.txt 34198 2011-01-09 15:12:08Z campbellbarton $
+# ***** 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.
+#
+# Contributor(s): Jacques Beaurain.
+#
+# ***** END GPL LICENSE BLOCK *****
+
+# --env-system-scripts allows to run without WITH_INSTALL
+
+# Use '--write-blend=/tmp/test.blend' to view output
+
+
+set(TEST_SRC_DIR ${CMAKE_SOURCE_DIR}/../lib/tests)
+set(TEST_OUT_DIR ${CMAKE_BINARY_DIR}/tests)
+
+#~ if(NOT IS_DIRECTORY ${TEST_SRC_DIR})
+#~ message(FATAL_ERROR "CMake test directory not found!")
+#~ endif()
+
+# all calls to blender use this
+set(GENERIC_ARGS --background --factory-startup --env-system-scripts ${CMAKE_SOURCE_DIR}/release/scripts)
+
+
+# OBJ Import tests
+add_test(import_obj_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/cube.obj'\)
+ --md5=4d090508b812b5e08168aa2614746bda --md5_method=SCENE
+)
+
+add_test(import_obj_nurbs_cyclic ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/nurbs_cyclic.obj'\)
+ --md5=9e0da7b65b4c4f818a203d56af2d3a4b --md5_method=SCENE
+ --write-blend=/root/foo99.blend
+)
+
+add_test(import_obj_makehuman ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/makehuman.obj'\)
+ --md5=e0829dc078b0789e1d81f1071235bc4f --md5_method=SCENE
+)
+
+# OBJ Export tests
+add_test(export_obj_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_cube.obj',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_obj_cube.obj
+ --md5_source=${TEST_OUT_DIR}/export_obj_cube.mtl
+ --md5=70bdc394c2726203ad26c085176e3484 --md5_method=FILE
+)
+
+add_test(export_obj_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_nurbs.obj',use_selection=False,use_nurbs=True\)
+ --md5_source=${TEST_OUT_DIR}/export_obj_nurbs.obj
+ --md5_source=${TEST_OUT_DIR}/export_obj_nurbs.mtl
+ --md5=a733ae4fa4a591ea9b0912da3af042de --md5_method=FILE
+)
+
+add_test(export_obj_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_all_objects.obj',use_selection=False,use_nurbs=True\)
+ --md5_source=${TEST_OUT_DIR}/export_obj_all_objects.obj
+ --md5_source=${TEST_OUT_DIR}/export_obj_all_objects.mtl
+ --md5=6e033a6a9c923d7aa3613b36e373f55b --md5_method=FILE
+)
+
+
+
+# PLY Import tests
+add_test(import_ply_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/cube_ascii.ply'\)
+ --md5=527134343c27fc0ea73115b85fbfd3ac --md5_method=SCENE
+)
+
+add_test(import_ply_bunny ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/bunny2.ply'\)
+ --md5=6ea5b8533400a17accf928b8fd024eaa --md5_method=SCENE
+)
+
+add_test(import_ply_small_holes ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/many_small_holes.ply'\)
+ --md5=c3093e26ecae5b6d59fbbcf2a0d0b39f --md5_method=SCENE
+)
+
+# PLY Export tests (TODO)
+
+
+
+# STL Import tests
+add_test(import_stl_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/cube.stl'\)
+ --md5=8ceb5bb7e1cb5f4342fa1669988c66b4 --md5_method=SCENE
+)
+
+add_test(import_stl_conrod ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/conrod.stl'\)
+ --md5=690a4b8eb9002dcd8631c5a575ea7348 --md5_method=SCENE
+)
+
+add_test(import_stl_knot_max_simplified ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/knot_max_simplified.stl'\)
+ --md5=baf82803f45a84ec4ddbad9cef57dd3e --md5_method=SCENE
+)
+
+# STL Export tests (TODO)
+
+
+
+# X3D Import
+add_test(import_x3d_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/color_cube.x3d'\)
+ --md5=c80538e272812c9d765d43df269d8a9b --md5_method=SCENE
+)
+
+add_test(import_x3d_teapot ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/teapot.x3d'\)
+ --md5=fa19713ff71d4b3893dcbe0ab3a73955 --md5_method=SCENE
+ --write-blend=/root/foo99.blend
+)
+
+add_test(import_x3d_suzanne_material ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/suzanne_material.x3d'\)
+ --md5=52a59dcf731904ac49953dd82c020ae5 --md5_method=SCENE
+)
+
+# X3D Export
+add_test(export_x3d_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d
+ --md5=560ba3762a6604669994f661235ef93c --md5_method=FILE
+)
+
+add_test(export_x3d_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_nurbs.x3d',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_x3d_nurbs.x3d
+ --md5=078c0ca5a08f123cd2cdac48afb54853 --md5_method=FILE
+)
+
+add_test(export_x3d_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d
+ --md5=5f8153d1475e187efca15dcb029d280d --md5_method=FILE
+)
+
+
+
+# 3DS Import
+add_test(import_3ds_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/cube.3ds'\)
+ --md5=cb5a45c35a343c3f5beca2a918472951 --md5_method=SCENE
+)
+
+add_test(import_3ds_hierarchy_lara ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_lara.3ds'\)
+ --md5=2e9812099b26ad607fdcf4c7be918c71 --md5_method=SCENE
+ --write-blend=/root/foo99.blend
+)
+
+add_test(import_3ds_hierarchy_greek_trireme ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_greek_trireme.3ds'\)
+ --md5=d05b922d7be20356d8409d1f768a3a9a --md5_method=SCENE
+)
+
+# 3DS Export
+add_test(export_3ds_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_cube.3ds',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_3ds_cube.3ds
+ --md5=0df6cfb130052d01e31ef77d391d4cc0 --md5_method=FILE
+)
+
+add_test(export_3ds_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_nurbs.3ds',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_3ds_nurbs.3ds
+ --md5=ba1a6d43346fee3bcadc7e30e3c95935 --md5_method=FILE
+)
+
+add_test(export_3ds_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\)
+ --md5_source=${TEST_OUT_DIR}/export_3ds_all_objects.3ds
+ --md5=87349a4699f1006e8194fb0ac05ac9c8 --md5_method=FILE
+)
+
+
+
+# FBX Export
+# 'use_metadata=False' for reliable md5's
+add_test(export_fbx_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\)
+ --md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx
+ --md5=a0806dc974d814f338b821ab326a6be0 --md5_method=FILE
+)
+
+add_test(export_fbx_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\)
+ --md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx
+ --md5=2cda2b37ee6698aff4129af48fce1291 --md5_method=FILE
+)
+
+add_test(export_fbx_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+ ${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
+ --run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\)
+ --md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx
+ --md5=be69cf0baf51dcf43f579183310cb383 --md5_method=FILE
+)
diff --git a/source/tests/batch_import.py b/source/tests/batch_import.py
new file mode 100644
index 00000000000..5fbe38e08ce
--- /dev/null
+++ b/source/tests/batch_import.py
@@ -0,0 +1,178 @@
+# ##### 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>
+
+"""
+Example Usage:
+
+./blender.bin --background --python source/tests/batch_import.py -- \
+ --operator="bpy.ops.import_scene.obj" \
+ --path="/fe/obj" \
+ --match="*.obj" \
+ --start=0 --end=10 \
+ --save_path=/tmp/test
+
+./blender.bin --background --python source/tests/batch_import.py -- \
+ --operator="bpy.ops.import_scene.autodesk_3ds" \
+ --path="/fe/" \
+ --match="*.3ds" \
+ --start=0 --end=1000 \
+ --save_path=/tmp/test
+"""
+
+import os
+import sys
+
+
+def clear_scene():
+ import bpy
+ unique_obs = set()
+ for scene in bpy.data.scenes:
+ for obj in scene.objects[:]:
+ scene.objects.unlink(obj)
+ unique_obs.add(obj)
+
+ # remove obdata, for now only worry about the startup scene
+ for bpy_data_iter in (bpy.data.objects, bpy.data.meshes, bpy.data.lamps, bpy.data.cameras):
+ for id_data in bpy_data_iter:
+ bpy_data_iter.remove(id_data)
+
+
+def batch_import(operator="",
+ path="",
+ save_path="",
+ match="",
+ start=0,
+ end=sys.maxsize,
+ ):
+
+ print(list(globals().keys()))
+ import fnmatch
+
+ path = os.path.normpath(path)
+ path = os.path.abspath(path)
+
+ match_upper = match.upper()
+ pattern_match = lambda a: fnmatch.fnmatchcase(a.upper(), match_upper)
+
+ def file_generator(path):
+ for dirpath, dirnames, filenames in os.walk(path):
+
+ # skip '.svn'
+ if dirpath.startswith("."):
+ continue
+
+ for filename in filenames:
+ if pattern_match(filename):
+ yield os.path.join(dirpath, filename)
+
+ print("Collecting %r files in %s" % (match, path), end="")
+
+ files = list(file_generator(path))
+ files_len = len(files)
+ end = min(end, len(files))
+ print(" found %d" % files_len, end="")
+
+ files.sort()
+ files = files[start:end]
+ if len(files) != files_len:
+ print(" using a subset in (%d, %d), total %d" % (start, end, len(files)), end="")
+
+ print("")
+
+ import bpy
+ op = eval(operator)
+ for i, f in enumerate(files):
+ print(" %s(filepath=%r) # %d of %d" % (operator, f, i + start, len(files)))
+ bpy.ops.wm.read_factory_settings()
+ clear_scene()
+
+ op(filepath=f)
+
+ if save_path:
+ fout = os.path.join(save_path, os.path.relpath(f, path))
+ fout_blend = os.path.splitext(fout)[0] + ".blend"
+
+ print("\tSaving: %r" % fout_blend)
+
+ fout_dir = os.path.dirname(fout_blend)
+ if not os.path.exists(fout_dir):
+ os.makedirs(fout_dir)
+
+ bpy.ops.wm.save_as_mainfile(filepath=fout_blend)
+
+
+def main():
+ import optparse
+
+ # get the args passed to blender after "--", all of which are ignored by blender specifically
+ # so python may receive its own arguments
+ argv = sys.argv
+
+ if "--" not in argv:
+ argv = [] # as if no args are passed
+ else:
+ argv = argv[argv.index("--") + 1:] # get all args after "--"
+
+ # When --help or no args are given, print this help
+ usage_text = "Run blender in background mode with this script:"
+ usage_text += " blender --background --python " + __file__ + " -- [options]"
+
+ parser = optparse.OptionParser(usage=usage_text)
+
+ # Example background utility, add some text and renders or saves it (with options)
+ # Possible types are: string, int, long, choice, float and complex.
+ parser.add_option("-o", "--operator", dest="operator", help="This text will be used to render an image", type="string")
+ parser.add_option("-p", "--path", dest="path", help="Path to use for searching for files", type='string')
+ parser.add_option("-m", "--match", dest="match", help="Wildcard to match filename", type="string")
+ parser.add_option("-s", "--save_path", dest="save_path", help="Save the input file to a blend file in a new location", metavar='string')
+ parser.add_option("-S", "--start", dest="start", help="From collected files, start with this index", metavar='int')
+ parser.add_option("-E", "--end", dest="end", help="From collected files, end with this index", metavar='int')
+
+ options, args = parser.parse_args(argv) # In this example we wont use the args
+
+ if not argv:
+ parser.print_help()
+ return
+
+ if not options.operator:
+ print("Error: --operator=\"some string\" argument not given, aborting.")
+ parser.print_help()
+ return
+
+ if options.start is None:
+ options.start = 0
+
+ if options.end is None:
+ options.end = sys.maxsize
+
+ # Run the example function
+ batch_import(operator=options.operator,
+ path=options.path,
+ save_path=options.save_path,
+ match=options.match,
+ start=int(options.start),
+ end=int(options.end),
+ )
+
+ print("batch job finished, exiting")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/source/tests/bl_test.py b/source/tests/bl_test.py
new file mode 100644
index 00000000000..5dd7dbe32d7
--- /dev/null
+++ b/source/tests/bl_test.py
@@ -0,0 +1,195 @@
+# ##### 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 sys
+import os
+
+
+# may split this out into a new file
+def replace_bpy_app_version():
+ """ So MD5's are predictable from output which uses blenders versions.
+ """
+
+ import bpy
+
+ app = bpy.app
+ app_fake = type(bpy)("bpy.app")
+
+ for attr in dir(app):
+ if not attr.startswith("_"):
+ setattr(app_fake, attr, getattr(app, attr))
+
+ app_fake.version = 0, 0, 0
+ app_fake.version_string = "0.00 (sub 0)"
+ bpy.app = app_fake
+
+
+def clear_startup_blend():
+ import bpy
+
+ for scene in bpy.data.scenes:
+ for obj in scene.objects:
+ scene.objects.unlink(obj)
+
+
+def blend_to_md5():
+ import bpy
+ scene = bpy.context.scene
+ ROUND = 4
+
+ def matrix2str(matrix):
+ return "".join([str(round(axis, ROUND)) for vector in matrix for axis in vector]).encode('ASCII')
+
+ def coords2str(seq, attr):
+ return "".join([str(round(axis, ROUND)) for vertex in seq for axis in getattr(vertex, attr)]).encode('ASCII')
+
+ import hashlib
+
+ md5 = hashlib.new("md5")
+ md5_update = md5.update
+
+ for obj in scene.objects:
+ md5_update(matrix2str(obj.matrix_world))
+ data = obj.data
+
+ if type(data) == bpy.types.Mesh:
+ md5_update(coords2str(data.vertices, "co"))
+ elif type(data) == bpy.types.Curve:
+ for spline in data.splines:
+ md5_update(coords2str(spline.bezier_points, "co"))
+ md5_update(coords2str(spline.points, "co"))
+
+ return md5.hexdigest()
+
+
+def main():
+ argv = sys.argv
+ print(" args:", " ".join(argv))
+ argv = argv[argv.index("--") + 1:]
+
+ def arg_extract(arg, optional=True, array=False):
+ arg += "="
+ if array:
+ value = []
+ else:
+ value = None
+
+ i = 0
+ while i < len(argv):
+ if argv[i].startswith(arg):
+ item = argv[i][len(arg):]
+ del argv[i]
+ i -= 1
+
+ if array:
+ value.append(item)
+ else:
+ value = item
+ break
+
+ i += 1
+
+ if (not value) and (not optional):
+ print(" '%s' not set" % arg)
+ sys.exit(1)
+
+ return value
+
+ run = arg_extract("--run", optional=False)
+ md5 = arg_extract("--md5", optional=False)
+ md5_method = arg_extract("--md5_method", optional=False) # 'SCENE' / 'FILE'
+
+ # only when md5_method is 'FILE'
+ md5_source = arg_extract("--md5_source", optional=True, array=True)
+
+ # save blend file, for testing
+ write_blend = arg_extract("--write-blend", optional=True)
+
+ # ensure files are written anew
+ for f in md5_source:
+ if os.path.exists(f):
+ os.remove(f)
+
+ import bpy
+
+ replace_bpy_app_version()
+ if not bpy.data.filepath:
+ clear_startup_blend()
+
+ print(" Running: '%s'" % run)
+ print(" MD5: '%s'!" % md5)
+
+ try:
+ result = eval(run)
+ except:
+ import traceback
+ traceback.print_exc()
+ sys.exit(1)
+
+ if write_blend is not None:
+ print(" Writing Blend: %s" % write_blend)
+ bpy.ops.wm.save_mainfile(filepath=write_blend, check_existing=False)
+
+ print(" Result: '%s'" % str(result))
+ if not result:
+ print(" Running: %s -> False" % run)
+ sys.exit(1)
+
+ if md5_method == 'SCENE':
+ md5_new = blend_to_md5()
+ elif md5_method == 'FILE':
+ if not md5_source:
+ print(" Missing --md5_source argument")
+ sys.exit(1)
+
+ for f in md5_source:
+ if not os.path.exists(f):
+ print(" Missing --md5_source=%r argument does not point to a file")
+ sys.exit(1)
+
+ import hashlib
+
+ md5_instance = hashlib.new("md5")
+ md5_update = md5_instance.update
+
+ for f in md5_source:
+ md5_update(open(f, "rb").read())
+
+ md5_new = md5_instance.hexdigest()
+
+ else:
+ print(" Invalid --md5_method=%s argument is not a valid source")
+ sys.exit(1)
+
+ if md5 != md5_new:
+ print(" Running: %s\n MD5 Recieved: %s\n MD5 Expected: %s" % (run, md5_new, md5))
+ sys.exit(1)
+
+ print(" Success: %s" % run)
+
+
+if __name__ == "__main__":
+ # So a python error exits(1)
+ try:
+ main()
+ except:
+ import traceback
+ traceback.print_exc()
+ sys.exit(1)
diff --git a/source/tests/pep8.py b/source/tests/pep8.py
new file mode 100644
index 00000000000..ee71c877533
--- /dev/null
+++ b/source/tests/pep8.py
@@ -0,0 +1,109 @@
+# ##### 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 os
+
+# depends on pep8, pyflakes, pylint
+# for ubuntu
+#
+# sudo apt-get install pylint pyflakes
+#
+# sudo apt-get install python-setuptools python-pip
+# sudo pip install pep8
+#
+# in debian install pylint pyflakes pep8 with apt-get/aptitude/etc
+#
+# on *nix run
+# python release/test/pep8.py > pep8_error.txt 2>&1
+
+# how many lines to read into the file, pep8 comment
+# should be directly after the licence header, ~20 in most cases
+PEP8_SEEK_COMMENT = 40
+SKIP_PREFIX = "./tools", "./config", "./scons", "./extern"
+
+
+def file_list_py(path):
+ for dirpath, dirnames, filenames in os.walk(path):
+ for filename in filenames:
+ if filename.endswith(".py"):
+ yield os.path.join(dirpath, filename)
+
+
+def is_pep8(path):
+ print(path)
+ if open(path, 'rb').read(3) == b'\xef\xbb\xbf':
+ print("\nfile contains BOM, remove first 3 bytes: %r\n" % path)
+
+ # templates dont have a header but should be pep8
+ for d in ("presets", "templates", "examples"):
+ if ("%s%s%s" % (os.sep, d, os.sep)) in path:
+ return 1
+
+ f = open(path, 'r', encoding="utf8")
+ for i in range(PEP8_SEEK_COMMENT):
+ line = f.readline()
+ if line.startswith("# <pep8"):
+ if line.startswith("# <pep8 compliant>"):
+ return 1
+ elif line.startswith("# <pep8-80 compliant>"):
+ return 2
+ f.close()
+ return 0
+
+
+def main():
+ files = []
+ files_skip = []
+ for f in file_list_py("."):
+ if [None for prefix in SKIP_PREFIX if f.startswith(prefix)]:
+ continue
+
+ pep8_type = is_pep8(f)
+
+ if pep8_type:
+ # so we can batch them for each tool.
+ files.append((os.path.abspath(f), pep8_type))
+ else:
+ files_skip.append(f)
+
+ print("\nSkipping...")
+ for f in files_skip:
+ print(" %s" % f)
+
+ # pyflakes
+ print("\n\n\n# running pep8...")
+ for f, pep8_type in files:
+ if pep8_type == 1:
+ # E501:80 line length
+ os.system("pep8 --repeat --ignore=E501 '%s'" % (f))
+ else:
+ os.system("pep8 --repeat '%s'" % (f))
+
+ print("\n\n\n# running pyflakes...")
+ for f, pep8_type in files:
+ os.system("pyflakes '%s'" % f)
+
+ print("\n\n\n# running pylint...")
+ for f, pep8_type in files:
+ # let pep8 complain about line length
+ os.system("pylint --reports=n --max-line-length=1000 '%s'" % f)
+
+if __name__ == "__main__":
+ main()
diff --git a/source/tests/rna_array.py b/source/tests/rna_array.py
new file mode 100644
index 00000000000..06b4735cc0d
--- /dev/null
+++ b/source/tests/rna_array.py
@@ -0,0 +1,297 @@
+# ##### 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 #####
+
+import unittest
+import random
+
+test= bpy.data.test
+
+# farr - 1-dimensional array of float
+# fdarr - dynamic 1-dimensional array of float
+# fmarr - 3-dimensional ([3][4][5]) array of float
+# fdmarr - dynamic 3-dimensional (ditto size) array of float
+
+# same as above for other types except that the first letter is "i" for int and "b" for bool
+
+class TestArray(unittest.TestCase):
+ # test that assignment works by: assign -> test value
+ # - rvalue = list of float
+ # - rvalue = list of numbers
+ # test.object
+ # bpy.data.test.farr[3], iarr[3], barr[...], fmarr, imarr, bmarr
+
+ def setUp(self):
+ test.farr= (1.0, 2.0, 3.0)
+ test.iarr= (7, 8, 9)
+ test.barr= (False, True, False)
+
+ # test access
+ # test slice access, negative indices
+ def test_access(self):
+ rvals= ([1.0, 2.0, 3.0], [7, 8, 9], [False, True, False])
+ for arr, rval in zip((test.farr, test.iarr, test.barr), rvals):
+ self.assertEqual(prop_to_list(arr), rval)
+ self.assertEqual(arr[0:3], rval)
+ self.assertEqual(arr[1:2], rval[1:2])
+ self.assertEqual(arr[-1], arr[2])
+ self.assertEqual(arr[-2], arr[1])
+ self.assertEqual(arr[-3], arr[0])
+
+ # fail when index out of bounds
+ def test_access_fail(self):
+ for arr in (test.farr, test.iarr, test.barr):
+ self.assertRaises(IndexError, lambda : arr[4])
+
+ # test assignment of a whole array
+ def test_assign_array(self):
+ # should accept int as float
+ test.farr= (1, 2, 3)
+
+ # fail when: unexpected no. of items, invalid item type
+ def test_assign_array_fail(self):
+ def assign_empty_list(arr):
+ setattr(test, arr, ())
+
+ for arr in ("farr", "iarr", "barr"):
+ self.assertRaises(ValueError, assign_empty_list, arr)
+
+ def assign_invalid_float():
+ test.farr= (1.0, 2.0, "3.0")
+
+ def assign_invalid_int():
+ test.iarr= ("1", 2, 3)
+
+ def assign_invalid_bool():
+ test.barr= (True, 0.123, False)
+
+ for func in [assign_invalid_float, assign_invalid_int, assign_invalid_bool]:
+ self.assertRaises(TypeError, func)
+
+ # shouldn't accept float as int
+ def assign_float_as_int():
+ test.iarr= (1, 2, 3.0)
+ self.assertRaises(TypeError, assign_float_as_int)
+
+ # non-dynamic arrays cannot change size
+ def assign_different_size(arr, val):
+ setattr(test, arr, val)
+ for arr, val in zip(("iarr", "farr", "barr"), ((1, 2), (1.0, 2.0), (True, False))):
+ self.assertRaises(ValueError, assign_different_size, arr, val)
+
+ # test assignment of specific items
+ def test_assign_item(self):
+ for arr, rand_func in zip((test.farr, test.iarr, test.barr), (rand_float, rand_int, rand_bool)):
+ for i in range(len(arr)):
+ val= rand_func()
+ arr[i]= val
+
+ self.assertEqual(arr[i], val)
+
+ # float prop should accept also int
+ for i in range(len(test.farr)):
+ val= rand_int()
+ test.farr[i]= val
+ self.assertEqual(test.farr[i], float(val))
+
+ #
+
+ def test_assign_item_fail(self):
+ def assign_bad_index(arr):
+ arr[4] = 1.0
+
+ def assign_bad_type(arr):
+ arr[1]= "123"
+
+ for arr in [test.farr, test.iarr, test.barr]:
+ self.assertRaises(IndexError, assign_bad_index, arr)
+
+ # not testing bool because bool allows not only (True|False)
+ for arr in [test.farr, test.iarr]:
+ self.assertRaises(TypeError, assign_bad_type, arr)
+
+ def test_dynamic_assign_array(self):
+ # test various lengths here
+ for arr, rand_func in zip(("fdarr", "idarr", "bdarr"), (rand_float, rand_int, rand_bool)):
+ for length in range(1, 64):
+ rval= make_random_array(length, rand_func)
+ setattr(test, arr, rval)
+ self.assertEqual(prop_to_list(getattr(test, arr)), rval)
+
+ def test_dynamic_assign_array_fail(self):
+ # could also test too big length here
+
+ def assign_empty_list(arr):
+ setattr(test, arr, ())
+
+ for arr in ("fdarr", "idarr", "bdarr"):
+ self.assertRaises(ValueError, assign_empty_list, arr)
+
+
+class TestMArray(unittest.TestCase):
+ def setUp(self):
+ # reset dynamic array sizes
+ for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)):
+ setattr(test, arr, make_random_3d_array((3, 4, 5), func))
+
+ # test assignment
+ def test_assign_array(self):
+ for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
+ # assignment of [3][4][5]
+ rval= make_random_3d_array((3, 4, 5), func)
+ setattr(test, arr, rval)
+ self.assertEqual(prop_to_list(getattr(test, arr)), rval)
+
+ # test assignment of [2][4][5], [1][4][5] should work on dynamic arrays
+
+ def test_assign_array_fail(self):
+ def assign_empty_array():
+ test.fmarr= ()
+ self.assertRaises(ValueError, assign_empty_array)
+
+ def assign_invalid_size(arr, rval):
+ setattr(test, arr, rval)
+
+ # assignment of 3,4,4 or 3,3,5 should raise ex
+ for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
+ rval= make_random_3d_array((3, 4, 4), func)
+ self.assertRaises(ValueError, assign_invalid_size, arr, rval)
+
+ rval= make_random_3d_array((3, 3, 5), func)
+ self.assertRaises(ValueError, assign_invalid_size, arr, rval)
+
+ rval= make_random_3d_array((3, 3, 3), func)
+ self.assertRaises(ValueError, assign_invalid_size, arr, rval)
+
+ def test_assign_item(self):
+ # arr[i] = x
+ for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
+ rval= make_random_2d_array((4, 5), func)
+
+ for i in range(3):
+ getattr(test, arr)[i]= rval
+ self.assertEqual(prop_to_list(getattr(test, arr)[i]), rval)
+
+ # arr[i][j] = x
+ for arr, func in zip(("fmarr", "imarr", "bmarr", "fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool) * 2):
+
+ arr= getattr(test, arr)
+ rval= make_random_array(5, func)
+
+ for i in range(3):
+ for j in range(4):
+ arr[i][j]= rval
+ self.assertEqual(prop_to_list(arr[i][j]), rval)
+
+
+ def test_assign_item_fail(self):
+ def assign_wrong_size(arr, i, rval):
+ getattr(test, arr)[i]= rval
+
+ # assign wrong size at level 2
+ for arr, func in zip(("fmarr", "imarr", "bmarr"), (rand_float, rand_int, rand_bool)):
+ rval1= make_random_2d_array((3, 5), func)
+ rval2= make_random_2d_array((4, 3), func)
+
+ for i in range(3):
+ self.assertRaises(ValueError, assign_wrong_size, arr, i, rval1)
+ self.assertRaises(ValueError, assign_wrong_size, arr, i, rval2)
+
+ def test_dynamic_assign_array(self):
+ for arr, func in zip(("fdmarr", "idmarr", "bdmarr"), (rand_float, rand_int, rand_bool)):
+ # assignment of [3][4][5]
+ rval= make_random_3d_array((3, 4, 5), func)
+ setattr(test, arr, rval)
+ self.assertEqual(prop_to_list(getattr(test, arr)), rval)
+
+ # [2][4][5]
+ rval= make_random_3d_array((2, 4, 5), func)
+ setattr(test, arr, rval)
+ self.assertEqual(prop_to_list(getattr(test, arr)), rval)
+
+ # [1][4][5]
+ rval= make_random_3d_array((1, 4, 5), func)
+ setattr(test, arr, rval)
+ self.assertEqual(prop_to_list(getattr(test, arr)), rval)
+
+
+ # test access
+ def test_access(self):
+ pass
+
+ # test slice access, negative indices
+ def test_access_fail(self):
+ pass
+
+random.seed()
+
+def rand_int():
+ return random.randint(-1000, 1000)
+
+def rand_float():
+ return float(rand_int())
+
+def rand_bool():
+ return bool(random.randint(0, 1))
+
+def make_random_array(len, rand_func):
+ arr= []
+ for i in range(len):
+ arr.append(rand_func())
+
+ return arr
+
+def make_random_2d_array(dimsize, rand_func):
+ marr= []
+ for i in range(dimsize[0]):
+ marr.append([])
+
+ for j in range(dimsize[1]):
+ marr[-1].append(rand_func())
+
+ return marr
+
+def make_random_3d_array(dimsize, rand_func):
+ marr= []
+ for i in range(dimsize[0]):
+ marr.append([])
+
+ for j in range(dimsize[1]):
+ marr[-1].append([])
+
+ for k in range(dimsize[2]):
+ marr[-1][-1].append(rand_func())
+
+ return marr
+
+def prop_to_list(prop):
+ ret= []
+
+ for x in prop:
+ if type(x) not in (bool, int, float):
+ ret.append(prop_to_list(x))
+ else:
+ ret.append(x)
+
+ return ret
+
+def suite():
+ return unittest.TestSuite([unittest.TestLoader().loadTestsFromTestCase(TestArray), unittest.TestLoader().loadTestsFromTestCase(TestMArray)])
+
+if __name__ == "__main__":
+ unittest.TextTestRunner(verbosity=2).run(suite())
+
diff --git a/source/tests/rna_info_dump.py b/source/tests/rna_info_dump.py
new file mode 100644
index 00000000000..62c1248d733
--- /dev/null
+++ b/source/tests/rna_info_dump.py
@@ -0,0 +1,131 @@
+# ##### 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>
+
+# Used for generating API diff's between releases
+# ./blender.bin --background --python release/test/rna_info_dump.py
+
+import bpy
+
+
+def api_dump(use_properties=True, use_functions=True):
+
+ def prop_type(prop):
+ if prop.type == "pointer":
+ return prop.fixed_type.identifier
+ else:
+ return prop.type
+
+ def func_to_str(struct_id_str, func_id, func):
+
+ args = []
+ for prop in func.args:
+ data_str = "%s %s" % (prop_type(prop), prop.identifier)
+ if prop.array_length:
+ data_str += "[%d]" % prop.array_length
+ if not prop.is_required:
+ data_str += "=%s" % prop.default_str
+ args.append(data_str)
+
+ data_str = "%s.%s(%s)" % (struct_id_str, func_id, ", ".join(args))
+ if func.return_values:
+ return_args = ", ".join(prop_type(arg) for arg in func.return_values)
+ if len(func.return_values) > 1:
+ data_str += " --> (%s)" % return_args
+ else:
+ data_str += " --> %s" % return_args
+ return data_str
+
+ def prop_to_str(struct_id_str, prop_id, prop):
+
+ prop_str = " <-- %s" % prop_type(prop)
+ if prop.array_length:
+ prop_str += "[%d]" % prop.array_length
+
+ data_str = "%s.%s %s" % (struct_id_str, prop_id, prop_str)
+ return data_str
+
+ def struct_full_id(v):
+ struct_id_str = v.identifier # "".join(sid for sid in struct_id if struct_id)
+
+ for base in v.get_bases():
+ struct_id_str = base.identifier + "|" + struct_id_str
+
+ return struct_id_str
+
+ def dump_funcs():
+ data = []
+ for struct_id, v in sorted(struct.items()):
+ struct_id_str = struct_full_id(v)
+
+ funcs = [(func.identifier, func) for func in v.functions]
+
+ for func_id, func in funcs:
+ data.append(func_to_str(struct_id_str, func_id, func))
+
+ for prop in v.properties:
+ if prop.collection_type:
+ funcs = [(prop.identifier + "." + func.identifier, func) for func in prop.collection_type.functions]
+ for func_id, func in funcs:
+ data.append(func_to_str(struct_id_str, func_id, func))
+ data.sort()
+ data.append("# * functions *")
+ return data
+
+ def dump_props():
+ data = []
+ for struct_id, v in sorted(struct.items()):
+ struct_id_str = struct_full_id(v)
+
+ props = [(prop.identifier, prop) for prop in v.properties]
+
+ for prop_id, prop in props:
+ data.append(prop_to_str(struct_id_str, prop_id, prop))
+
+ for prop in v.properties:
+ if prop.collection_type:
+ props = [(prop.identifier + "." + prop_sub.identifier, prop_sub) for prop_sub in prop.collection_type.properties]
+ for prop_sub_id, prop_sub in props:
+ data.append(prop_to_str(struct_id_str, prop_sub_id, prop_sub))
+ data.sort()
+ data.insert(0, "# * properties *")
+ return data
+
+ import rna_info
+ struct = rna_info.BuildRNAInfo()[0]
+ data = []
+
+ if use_functions:
+ data.extend(dump_funcs())
+
+ if use_properties:
+ data.extend(dump_props())
+
+ if bpy.app.background:
+ import sys
+ sys.stderr.write("\n".join(data))
+ sys.stderr.write("\n\nEOF\n")
+ else:
+ text = bpy.data.texts.new(name="api.py")
+ text.from_string(data)
+
+ print("END")
+
+if __name__ == "__main__":
+ api_dump()